[리눅스 정리 - 초보자를 위한 가이드] 4장. 파일 시스템

이 파일 시스템 부분을 처음 리눅스를 배우는 사람에게 가이드라인을 제안하고자 하는 이 문서에서 어느 정도 설명해야 맞는 것인지 판단이 서지 않았다. 그리고 사실 필자 또한 이 부분에 대하여 잘 알지 못한다. 현재 필자가 참여하고 있는 리눅스를 처음 배우는 사람을 대상으로 하는 스터디에서 이 부분을 언급하였기에 필자 또한 아는 것과 검색을 통해 알아본 것을 작성하였다.

파일 시스템(file system, 문화어: 파일체계)은 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제를 가리키는 말이다.1

파일 시스템은 통상 하드 디스크나 CD-ROM 같은 실제 자료 보관 장치를 사용하여 파일의 물리적 소재를 관리하는 것을 가리키나 네트워크 프로토콜(NFS, SMB, 9P 등)을 수행하는 클라이언트를 통하여 파일 서버 상의 자료로의 접근을 제공하는 방식과 가상의 형태로서 접근 수단만이 존재하는 방식(procfs 등)도 파일 시스템의 범위에 포함될 수 있다. 디렉터리 서비스나 레지스트리와는 의미가 조금 다르다.

리눅스는 다양한 파일시스템들을 지원하는데 중요 파일 시스템들은 ext, etx2, minix, xiafs, msdos, hpfs OS/2, isofs CD-ROM, umsdos, nfs, sysv 등이 있다. 이중 이 문서에서 살펴보고자 하는 파일 시스템은 ext, ext2, ext3, ext4로 리눅스 초기에 사용되었거나 많이 사용되는 파일 시스템들이다.

01 확장 파일 시스템(extended file system)

ext

리눅스 초기에 사용되던 파일 시스템이며 호환성이 없다. ext2의 원형이다.


ext2

ext3가 개발되기 이전까지 가장 많이 사용된 파일 시스템으로 리눅스 파일 시스템 대부분의 기능을 제공하는 파일 시스템이다. 특히 ext2는 뛰어난 안정성과 속도로 가장 유명한 파일 시스템으로 자리 잡았고 ext3 또한 ext2에 기반을 두어 개발되었다. 또한 쉽게 호환되며 업그레이드도 쉽게 설계되어 있다.2


ext3

ext2 파일시스템에 저널링(Journaling)3을 지원하도록 확장된 파일시스템이다. 현재 리눅스에 가장 많이 사용되고 있다.4


ext4

ext3 파일시스템을 확장한 파일시스템으로 Extent라는 기능을 제공하여, 파일에 디스크 할당 시 물리적으로 연속적인 블록을 할당할 수 있도록 하여, 파일 접근 속도 향상 및 단편화5를 줄이도록 설계된 파일시스템이다.4

  • 파일의 확장자는 필요 없으며 파일의 특성을 알리기 위해 확장자 사용가능 (*.c, *.java)

  • ’.’ 으로 시작하는 파일은 숨겨진 파일 (‘ls -a’ 명령으로 보임)

  • ’.’은 현재 디렉토리, ‘..’ 는 부모 디렉토리

  • 파일 시스템의 크기는 최대 2Tib ~ 16 TiB (변동 가능)

02 ext2 파일시스템 구조(extended file system)

이 문서에서는 ext3가 개발되기 이전까지 가장 많이 사용된 파일 시스템인 ext2에 대해서 살펴보고자 한다. 이 문서의 내용은 아래 사이트들을 정리한 것이다.

ext2 파일시스템은 비교적 속도가 빠르고 안정적인 UFS(Unix FileSystem)을 기반으로 필요한 기능을 추려서, 보다 단순하게 만들어졌다. 따라서 ext2는 분석, 이해하기가 쉽다. 다음은 ext2 파일시스템의 레이아웃이다.

ext2 파일시스템은 부트섹터(Boot Sector)와 여러 개의 블록 그룹(Block Group)으로 구성된다. 블록이란 파일시스템에서 데이터를 저장하는 단위이며, 메모리에서 I/O 작업을 한 번 거칠 때 읽거나 쓰는 단위가 된다. 파일시스템을 생성할 때 1KB~4KB 사이에서 블록의 크기를 지정 가능하다.

각 블록 그룹에는 파일시스템을 구성하는 정보들이 담겨져 있다. 가장 마지막의 블록 그룹을 제외하고는 모든 블록 그룹들이 같은 블록 개수를 가지며, 여기에 파일 이름, meta data, 파일 데이터가 기록된다.


블록 그룹 (Block Group)

블록그룹은 블록들의 모임이며, OS커널이 같은 파일에 속하는 데이터 블록은 같은 블록 그룹에 저장하려고 노력하기 때문에 파일의 단편화6를 줄일 수 있다.

파일 시스템의 전체적인 정보는 슈퍼 블록(Super Block)과 그룹 디스크립터 테이블(Group Descriptor Table)에 저장된다. 슈퍼 블록과 그룹 디스크립터 테이블은 0번 블록 그룹의 정보만을 사용하지만 주요 데이터이기 때문에 손상될 경우를 대비하여 모든 블록 그룹에 사본이 저장되어 있다.

블록 그룹의 개수와 크기는 해당 파티션의 블록의 크기에 따라 달라진다. 그룹 내의 각 블록들이 할당되어 있는지 비어있는 지를 알 수 있는 블록 비트맵(Block Bitmap)이 1Block 안에 저장되어야 한다.

설정한 블록의 크기가 4KB일 때 8 bit * 4096 Byte = 32,768 개, 각 bit당 하나씩의 데이터 블록에 해당하므로 Block Bitmap이 표현할 수 있는 블록의 총 개수는 32,768개가 된다. 한 블록이 4KB인 경우, 32KB * 4KB = 128MB, 하나의 블록 그룹은 최대 128MB의 블록을 가질 수 있다. 또한 10GB의 파티션에 Ext2 파일시스템을 생성한다면 10240MB / 128MB = 80개의 블록 그룹이 파티션에 생성된다.

따라서 파티션마다 생성되는 블록 그룹의 게수는 다르며, 블록의 크기가 작을수록 블록 그룹의 개수가 많아지게 된다.

주요 저장 내용

  • 슈퍼 블록 ( Super Block - 1 Block )
  • 그룹 디스크립터 테이블 ( Group Descriptor Table - n Block )
  • 블록 비트맵 ( Block Bitmap - 1 Block )
  • I-노드 비트맵 ( Inode Bitmap - 1 Block )
  • I-노드 테이블 ( Inode Table - n Block )
  • 파일 데이터 블록 ( FIle Data Blocks - n Block )

슈퍼 블록 (Super Block)

슈퍼 블록은 파일시스템의 블록을 대표하는 블록으로, Ext2 파일시스템에서 사용되는 주요 설정 정보들이 기록되어 있는 영역이다. 블록의 크기에 관계없이 항상 블록그룹의 첫 번째 블록에 위치한다. 슈퍼블록은 반드시 1KB인 경우에 맞춰서 저장된다.7 만약 블록의 크기가 4KB라면 슈퍼블록은 한 블록을 모두 차지하며, 1KB만 사용하고 나머지 3KB는 사용하지 않고 비워둔다.

각 Group마다 Super Block의 내용은 동일하며 만약 다르면 파일 시스템 손상된 것이다. 파일 시스템이 Mount될 때, 커널은 Group 0 에 들어있는 Super Block을 읽는다. 주요 Data이기 때문에 손상 될 경우를 대비하여 모든 Block Group에 사본이 저장되어 있어 Super Block이 문제가 있을 시 다른 Block Group에 있는 Super Block의 복사본을 이용할 수 있다.

슈퍼 블록에 저장되는 주요 데이터는 블록의 크기(1KB, 2KB, 4KB), 총 블록의 개수, 블록 그룹의 개수, Inode의 개수, 그룹 내의 블록/Inode의 개수 이다.

주요 저장 내용

  • 파일 시스템에 의존하는 정보인 파일 시스템의 크기
  • 마운트 정보
  • 데이터 블록의 총 숫자
  • Inode의 총 숫자
  • 블록 그룹번호
  • 블록의 크기(1KB, 2KB, 4KB, 8KB)
  • 그룹 당 블록 수
  • 슈퍼 블록이 수정되었음을 알리는 정보
  • 매직 넘버 Magic Number는 마운트하는 소프트웨어에게 ext2 파일 시스템의 슈퍼 블록임을 확인하게 하는 값이다. 현재 ext2 파일 시스템에서 매직 넘버값은 0xEF53이다.

  • 개정 레벨 Revision Level 은 Major level과 Minor Level로 구성되어 있으며, 개정 레벨의 역할은 마운트 프로그램이 어떤 특정한 버전에서만 지원되는 기능이 이파일 시스템에서 지원되는지에 대한 확인을 위해 사용된다. 또한 개정 레벨은 기능 호환성 항목을 포함하여 마운트 프로그램이 해당 파일 시스템에서 안정적으로 사용할 수 있는 기능이 무엇인지를 판단할 수 있는 기준을 제공한다.

  • 마운트 횟수와 최대 마운트 횟수 시스템은 Mount Count 와 Maximum Mount Count 의 2가지 정보를 이용하여 파일 시스템 전체를 검사할 필요가 있는지를 확인할 수 있다. Mount Count는 마운트가 실행될 때 마다 1씩 그 값이 증가하며 만약 Mount Count 가 Maximum Mount Count에 도달하게 되면 시스템은 e2fsck를 실행하라는 메시지를 내보낸다.

  • 블록 그룹 번호 Block Group Number는 슈퍼블록 복사본을 가지고 있는 블록 그룹의 번호를 나타낸다.

  • 블록 크기 Block Size는 파일 시스템의 블록 크기를 표시한다. 블록 크기는 byte단위로 표시된다.

  • 그룹 당 블록 수 Blocks Per Group 은 하나의 그룹에 속한 블록의 수를 나타낸다. 이 수는 블록의 크기와 마찬가지로 파일 시스템을 만들 때 결정된다.

  • 프리 블록 파일 시스템 내부적으로 존재하는 Free Block의 수를 나타낸다.

  • 프리 아이노드 파일 시스템 내부적으로 존재하는 Free Inode의 수를 나타낸다.

  • 첫 번째 아이노드버 파일 시스템 내부적으로 존재하는 First Inode의 번호를 나타낸다. 리눅스 시스템에서 ext2 파일 시스템의 첫 번째 아이노드는 ‘/’디렉토리에 대한 디렉토리 엔트리를 나타낸다.


그룹 디스크립터 테이블 (Group Descriptor Table)

블록 그룹 안에서 슈퍼 블록 다음에 위치한다. Group Descriptor라고 불리는 파일 시스템의 블록 그룹들에 대한 정보를 가지고 있다. 그룹 디스크립터 테이블에 저장되는 주요 데이터는 Block Bitmap의 블록 번호, Inode Bitmap의 블록 번호, 첫 번째 Inode Table Block의 블록 번호, 그룹 안에 있는 빈 블록 수, 그룹 안에 있는 Inode 수, 그룹 안에 있는 빈 디렉토리 수 등이다.

Group Descriptor의 크기는 32Byte로, 블록 크기가 1KB라면 하나의 블록에 총 32개의 Group Descriptor가 기록될 수 있다.

서로 연결되어 있어서 전체적으로는 하나의 Group Descriptor Table을 형성하며 파일 시스템이 Mount될 때, 커널은 Group 0 에 들어있는 Group Descriptor Table을 읽는다. 주요 Data이기 때문에 손상 될 경우를 대비하여 모든 Block Group에 사본이 저장되어 있어 Group Descriptor Table이 문제가 있을 시 다른 Block Group에 있는 Group Descriptor Table의 복사본을 이용할 수 있다.

주요 저장 내용

  • Block Bitmap의 블록 번호
  • Inode Bitmap의 블록 번호
  • 첫 번째 Inode Table Block의 블록 번호
  • 그룹 안에 있는 빈 블록 수
  • 그룹 안에 있는 Inode수
  • 그룹 안에 있는 빈 디렉토리 수

블록 비트맵 (Block Bitmap)

블록 그룹에서 그룹 디스크립터 테이블 다음으로 위치하지만, 정확한 위치는 정해져있지 않다.8 그룹 디스크립터 테이블의 크기가 일정하지 않기 때문이다. 블록 비트맵(Block Bitmap)은 블록의 사용현황을 bit 표현으로 나타낸다. 각 비트에 해당하는 블록이 사용 중이면 1, 사용 중이지 않으면 0으로 나타낸다.


아이노드 비트맵 (Inode Bitmap)

Block Bitmap처럼 bit 표현을 이용하여 Block Group이 관리하는 모든 Inode의 사용 현황을 나타낸다.


아이노드 테이블 (Inode Table)

인접하는 연속된 블록으로 이루어져 있으며, 각 블록은 미리 정의된 Inode 개수를 포함한다. Inode의 첫 번째 블록의 번호를 Group Descriptor Table에 저장한다. 모든 Inode의 크기는 128Byte로 동일하다. 1024byte의 Inode Table Block은 Inode 8개를 가질 수 있으며, 4096byte의 Inode Table Block은 32개의 Inode를 가진다.9


아이노드 (Inode)

Inode는 파일이나 디렉토리의 모든 정보를 가지고 있는 자료구조를 말하며, 파일 객체가 저장되는 곳이다. Inode의 크기는 슈퍼 블록에서 정의된 크기로 고정된다. 모든 파일들과 디렉토리들은 각각 1개의 Inode를 가지고 있으며, 모든 Inode들은 고유한 주소를 가지고 있다. Inode의 주소를 알고 있다면 해당 Inode가 속한 블록 그룹이 어디인지 계산하여 알아낼 수 있다.

시스템 측면에서는 Inode 번호로 파일을 처리하는데 이는 파일 이름이 Inode 번호와 함께 디렉토리 안에 저장되어 있기 때문이다. 그리고 Inode는 파일의 이름을 제외한 해당 파일의 모든 정보를 가지고 있으며, Inode Table에서 해당 파일이나 디렉터리의 Inode 번호를 찾게 되면 모든 정보를 알 수 있다.

File System을 처음에 생성(초기화)하면 지정된 개수만큼 Inode들이 생성 되며, 생성된 Inode들의 개수는 그 파일 시스템이 갖고 있을 수 있는 최대 File의 수이다.10 이 값은 파일 시스템을 다시 초기화하지11 않는 이상 변경할 수 없다.

Inode 1번은 Super Block, 2번은 루트 디렉토리이며, 10번까지는 예약되어 있기 때문에 사용할 수 없다.

Ext2에 대한 커널 문서의 인용문에 따르면 다음과 같다.

“아이노드에서 파일의 데이터를 포함하는 첫 12블록의 포인터가 있다. (블록의 다음 세트에 포인터를 포함하는) 간접 블록에 대한 포인터, (간접 블록에 대한 포인터를 포함하는) 이중 간접 블록에 대한 포인터, 그리고 (이중 간접 블록에 대한 포인터를 포함하는) 삼중-간접 블록에 대한 포인터가 있다.”

Ext2 내부는 15개의 포인터가 있는 구조며 그 중 처음부터 12번까지는 직접 블록을 위한 것이다. 13번 포인터는 간접 블록을, 14번째 블록은 이중 간접 블록을, 그리고 15번째 포인터는 삼중 간접 블록을 가리킨다.

만약 각 데이터 Block의 크기가 8KB이라면, 최대 파일 크기는 약 64TB이다. Direct Block Pointer = 8KB * 12개 = 96KB Indirect Block Pointer = 8KB * 2048개 = 16,384KB Triple Indirect Pointer = 8KB * 2048개 * 2048개 = 33,554,432KB 그리고 데이터 Block의 크기가 4KB인 경우 최대 파일 크기는 약 4TB이다.

주요 저장 내용

  • Inode Number
  • 파일 모드 : 파일과 관계된 접근과 실행 권한을 저장하는 16비트 플래그
비트 내용
12-14 파일 형식 (일반, 디렉터리, 문자 또는 특별, 선입선출 파이프)
9-11 실행 플래그 (setuid, setgid, sticky bit)
8 소유자 읽기 허가
7 소유자 쓰기 허가
6 소유자 실행 허가
5 그룹 읽기 허가
4 그룹 쓰기 허가
3 그룹 실행 허가
2 다른 사용자 읽기 허가
1 다른 사용자 쓰기 허가
0 다른 사용자 실행 허가
  • 하드 링크 수 : 이 아이노드에 대한 디렉터리 참조 수
  • 소유자 ID : 파일의 개별 소유자
  • 파일 크기 : 파일의 바이트 수
  • 마지막 접근 : 마지막으로 파일에 접근한 시각
  • 마지막 수정 : 마지막으로 파일을 수정한 시각
  • Inode 수정 : 마지막으로 Inode를 수정한 시각
  • 데이터 Block 수 : 파일의 실제 데이터가 저장된 위치(Block 주소(번호))를 가리키는 15개의 포인터 배열

디렉토리 블록에서 아이노드 넘버를 통해 데이터를 찾아가는 절차

  • 디렉터리 블록에서 찾아갈 파일을 찾는다.12
  • 선택된 파일의 Inode 번호를 해당 디스크의 Inode Table에서 찾는다. .* 해당 번호의 Inode정보에 들어있는 디스크상의 데이터 주소를 참조한다.

데이터 블록 ( Data Block )

파일에서 데이터를 저장하는 블록으로 일반 파일이나 디렉터리의 파일의 데이터가 존재한다. Inode에 포함 되어 있으며, Inode는 몇 개의 데이터 블록을 포함한다.


디렉토리 블록 ( Directory Block )

ext2 파일 시스템에서 디렉토리는 파일 시스템 상에서 파일에 대한 접근 경로를 생성하고 저장하는 특별한 의미의 파일로 취급한다. 각각의 디렉토리는 디렉토리 엔트리의 리스트로 나타낸다.


간접 블록 ( Indirection Block )

추가적인 데이터 블록을 위한 포인터들이 사용할 동적으로 할당되는 공간이다. Inode가 가지고 있는 데이터 블록보다 더 많은 데이터 블록이 필요한 경우 이를 지정하기 위해 포인터를 사용하는데, 그때 사용하기 위한 동적인 블록이다.


홀 ( Hole )

Inode나 간접 블록 안의 데이터 블록의 주소로 특별한 값을 저장한다. 파일 시스템에 의해서 파일 안에 자리하게 되며, 실질적으로 디스크 상에 공간은 할당 되지 않는다. 단지 0byte가 파일 안에서 특정 공간을 차지하고 있다고 가정하는 것이다.

03 ext3의 특징(extended file system)

기존의 ext2는 Cache에 저장되어 있는 데이터들을 디스크로 저장하는 도중 만약 시스템이 다운되거나 여러 가지 문제가 발생할 경우 파일 시스템이 손상되는 단점을 가지고 있었다. 이를 위해 ext2는 fsck(file system check)라는 파일 시스템 복구 기능을 제공한다. 하지만 이 복구 방법은 복구하는데 시간이 많이 소요된다. 또한 fsck 동안에는 시스템을 사용할 수 없다. ext3 파일시스템은 이러한 단점을 보완하기 위하여 저널링이라는 기능을 추가해서 소개된 파일 시스템이다. 따라서 기본적인 ext2와 동일하고 ext2 파일 시스템과 호환된다. 특히 ext3 파일 시스템에서 주목할 만한 것은 바로 Journaling 이라는 기술이다.

ext3 파일 시스템으로의 포팅 동기

ext2 기능적인 측면보다는 파일 시스템의 효율과 퍼포먼스에 중점을 두고 디자인된 파일 시스템이다. 그래서 ext2는 파일의 내용과 파일에 대한 허가권, 소유권, 생성과 접근시간과 같은 메타 데이터를 동기화하지 않는다. 이럴 경우 만약 파일의 내용을 수정하는 도중에 시스템에 문제가 생길 경우 해당 파일의 메타 데이터와 내용이 일치하지 않는 문제점이 발생하게 된다. 따라서 이러한 문제점을 보완하기 위해서 저널링 기술을 이용한 ext3 파일 시스템이 대두된 것이다.

저널링 기술

Journaling 기술은 기존의 fsck에 걸리는 시간을 단축하기 위해 데이터를 디스크에 쓰기 전에 Log에 데이터를 남겨 시스템의 비정상적인 셧다운에도 로그를 사용해 fsck보다 빠르고 안정적인 복구 기능을 제공하는 기술이다.

기존의 ext2 파일 시스템의 경우에는 시스템이 동작을 멈추기 바로 직전에 파일 시스템에 어떠한 수정을 가하고 있었는지 전혀 알 수 없었다. 그렇기 때문에 이를 복구하기 위해서는 fsck에 의해서 관리되는 슈퍼블록, 비트맵, 아이노드 등을 모두 검사해야 하기 때문에 시간이 오래 걸렸다.

하지만 저널링 기술을 사용한 파일 시스템의 경우에는 파일을 실제로 수정하기 전에 우선 로그에 수정된 내용을 저장한다. 그래서 시스템이 비정상적으로 동작을 멈추더라도 시스템의 파일 시스템을 복구하기 위해서 로그만을 검사하면 된다. 이러한 특징 때문에 저널링 파일 시스템을 Log-Ging 파일 시스템이라고 부르기도 한다.

04 파일 및 디렉토리 구조(extended file system)

d rwxr-xr-x 2 root root 4096 12월 30일 00:32 .gotreamer

① 파일유형 : 일반 파일(-), 디렉터리(d), 블록 디바이스(b), 문자 디바이스(c), 링크(l)

② 파일허가권

③ 링크 수

④ 소유자 명

⑤ 그룹 명

⑥ 파일 크기

⑦ 마지막 변경일

⑧ 마지막 변경 시간

⑨ 파일/폴더 명

05 링크

하드링크 (#ln [대상 경로] [링크 경로])

디렉토리에 그 파일에 대한 새로운 이름이 등록되고 Inode number는 본래 있던 파일의 Inode number가 복사되어 동일한 inode를 사용한다. 이때 복사되는 파일의 Inode에서 파일의 링크수가 하나 증가된다.

다른 파티션에서는 링크가 불가능하며 디렉토리는 하드링크를 할 수 없으나 기본 하드링크를 2개 가지고 있다.13

심볼릭 링크 (#ln –s [대상 경로] [링크 경로])

디렉토리에 그 파일에 대한 새로운 이름이 등록되고 새로운 inode를 생성하며 inode원본 파일을 연결한다. 심볼릭 링크의 경우 원본 파일의 주소가 저장되어 있으므로 원본 파일의 위치가 변경되면 심볼릭 링크는 사용할 수 없게 된다.

심볼릭 링크는 하드링크와 달리 다른 파티션에서도 링크가 가능하며 윈도우의 바로가기와 비슷하다.


관련글

초보자를 위한 가이드

  1. 출처 : 위키백과 - 파일시스템 

  2. 출처 : bestheroz님의 블로그 

  3. Journaling은 변경을 기록하는 로그(journal)를 두어 시스템 비정상 종료 시 파일 시스템 복구를 쉽게 하는 방법을 말한다. 

  4. 출처 : ITe-station  2

  5. 프로세스(병행으로 주행하는 태스크)에 대한 기억 영역의 할당과 프로세스에 의한 기억 영역의 해방을 반복함으로써 작은 기억 영역의 분할부가 다수 생성되는 것. 사용할 수 있는 기억 공간이 프로세스가 요구하는 크기보다 작기 때문에 어떤 요구도 만족할 수 없고, 사용하지 않은 상태로 남아 있는 상태를 말한다. - 컴퓨터인터넷IT용어대사전, 2011.1.20, 일진사 

  6. 데이터가 분산되어 저장되면서 메모리에 구멍이 생기는 것 

  7. 블록의 크기에 관계없이 블록 그룹의 시작부터 1024Byte 안에 슈퍼블록의 정보가 기록되어야 한다. 

  8. Group Descriptor Table에 Block Bitmap의 위치가 포함되어 있는 이유 

  9. ext4의 경우는 256byte의 크기를 가지며, ext2의 경우가 128byte의 크기를 가짐 

  10. 데이터 블록이 디스크 상의 어느 주소에 위치하고 있는지 정보와 같은 중요 정보를 가지기 때문이다. 

  11. 기존 데이터가 모두 파괴 된다. 

  12. 디렉토리는 파일의 이름과 Inode Number를 저장하는 Table이다. 사람은 파일을 이름으로 구분하 고, 컴퓨터는 Inode Number로 구분한다. 

  13. 디렉토리는 내부에 자신을 가리키는 .을 포함하기 때문이다. 

SmileCat

SmileCat
How do you define yourself?

[Openlayers] Render Event 정리

## 이벤트### [Map](http://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html)| event | module | note || :--: | -- | -- || [postcompose](...… Continue reading