본문 바로가기

CS/운영체제

리눅스 파일시스템

 

가상 파일 시스템(VFS)

가상 파일 시스템(VFS)은 다양한 종류의 파일 시스템을 마치 하나의 파일 시스템처럼 접근할 수 있도록 사용자에게 편의성을 제공하는 시스템이다.

 

대부분 운영체제는 자신의 특정 파일 시스템만을 지원한다.

따라서 그 운영체제에서 지원하는 파일 시스템에서 생성된 파일만을 접근할 수 있다.

그러나 리눅스에서는 가상 파일 시스템 개념을 도입하여 기본 파일 시스템(Ext2,3,4)는 물론 다른 운영체제의 파일 시스템(FAT32, NTFS, NFS 등)에서 생성된 파일도 접근할 수 있다.

 

VFS는 새로운 파일 시스템이 마운트 될 때, 그 파일 시스템의 타입을 인식하여 그 파일 시스템에 해당하는 함수를 호출한다.

마운트(mount): 저장 장치에 접근할 수 있는 경로를 디렉터리 구조에 편입시키는 작업

 

Ext2 파일 시스템

디스크와 같은 보조 기억 장치를 사용하기 위해서는 반드시 파티션을 나누고 포맷을 해야 한다.

Ext2 타입으로 포맷

디스크의 구조

부트 블록 블록 그룹 0 블록 그룹 1  블록 그룹 2
  • 부트 블록
    • 시스템이 부팅 될 때 리눅스 커널을 디스크로부터 메모리에 적재시켜 주는 부트스트랩 루틴이 포함되어 있다.

블록 그룹

수퍼 블록 블록 디스크립터 블록 비트맵 I-노드 비트맵 I-노드 블록 디렉터리 및 데이터 블록
  • 수퍼 블록
    • 디스크의 빈 공간 관리와 할당 정책에 관련된 중요한 정보를 갖고 있다.
    • 정보들의 초기 값은 파일 시스템을 만들 때 시스템 관리자에 의해 설정
    • 파일 생성 및 삭제 과정에서 파일 시스템에 의해 갱신총 I-노드 수 및 사용 가능한 I-노드 수
총 블록 수 및 사용 가능한 블록 리스트
블록 크기(1, 2, 4KB)
그룹 당 I-노드 및 블록 수
파일 시스템 상태
생성한 운영체제
파일 시스템이 마지막으로 갱신 된 날짜 및 시간

 

  • 블록 디스크립터
    • 각 블록 그룹을 관리하는 정보
블록 비트맵 블록 번호
I-노드 비트맵 블록 번호
I-노드 테이블 블록 번호
빈 블록 수
빈 I-노드 수
디렉터리 수

 

  • 블록 비트맵 & I-노드 비트맵
    • 데이터 또는 I-노드를 할당할 때 빈 공간을 찾기 위해 블록 혹은 I-노드가 할당된 상태를 비트 단위로 표시
    • 비트 값이 0이면 블록 & I-노드가 할당 X, 1이면 할당
    • 블록 비트맵과 I-노드 비트맵은 각각 한 개의 블록을 사용하기 때문에 블록 크기에 따라 표시할 수 있는 블록 또는 I-노드의 개수가 결정
  • I-노드 블록
    • I-노드 블록은 여러 개의 블록으로 구성
    • 블록 내용
      1. 파일의 종류(일반, 디렉터리, 장치 파일 등)
      2. 파일의 링크 수
      3. 파일 소유자(uid, gid)
      4. 파일의 크기
      5. 파일이 저장된 블록 주소
      6. 접근 모드 및 시간
    위와 같은 파일에 대한 모든 정보를 갖고 있는 I-노드는 디스크에 존재한다.
    파일에 접근할 때에는 디스크의 I-노드를 메모리에 복사하여 사용한다.

    이때 메모리의 I-노드 정보와 디스크의 I-노드 정보가 달라질 수 있기 때문I-노드에서의 디스크 블록 주소(블록 내용 - 빨간 표시)는 매우 중요한 역할을 담당한다.

    • 디렉터리 및 데이터 블록
      • 일반 파일의 데이터 또는 디렉터리 파일의 내용이 저장
      • 디렉터리 블록에는 파일 명과 I-노드 번호 등이 저장
I-노드
각 파일에 대한 정보를 저장하기 위한 자료구조로 각 파일은 하나의 I-노드를 갖고 있으며 I-노드마다 고유의 번호가 할당된다.

 

리눅스에서의 탐색 과정

I-노드  번호 레코드 길이 파일 명 길이 파일 명
2 12 1 .
2 12 2 ..
12 12 3 etc
13 12 3 bin
14 12 3 dev

일단 I-노드에는 고유 번호가 할당된다고 하였는데 루트 디렉토리는 2번으로 시작할 때 예약되어 있다.

 

위의 디렉토리 구조가 있을 때 /etc/passwd 를 찾아가는 과정은 다음과 같다.

  1. 2번 I-노드로부터 “/” 디렉터리 파일이 저장된 **블록 주소(예: 200)**를 얻는다.
  2. 루트 디렉터리 블록에서 “etc” 파일 명에 해당하는 **I-노드 번호(예:12)**를 얻는다.
  3. 12번 I-노드로부터 “etc” 디렉터리 파일이 저장된 **블록 주소(예:215)**를 얻는다.
  4. 블록 주소(215)에서 “passwd” 파일 명에 해당하는 **I-노드 번호(예:20)**를 얻는다.
  5. 20번 I-노드로부터 “passwd” 파일이 저장된 **블록 주소(예:250)**를 얻는다.

즉, 블록에서 파일에 관한 I-노드를 얻고, I-노드에서 블록 주소를 얻고….를 반복하며 파일을 찾아 간다.

이러한 과정에서 I-노드에 대한 검색이 여러 번 이루어지며, 오버헤드가 발생할 수 있기 때문에 항상 파일을 참조하기 전에 반드시 파일을 open 해야 한다.

 

파일을 열면 해당 파일의 I-노드가 메모리에 복사되며, 이후에는 메모리에 복사 된 I-노드를 통해 빠르게 검색할 수 있다.

'CS > 운영체제' 카테고리의 다른 글

메모리  (0) 2025.04.08
스레드  (0) 2025.03.06
운영체제와 프로세스  (0) 2025.03.06