가상 파일 시스템(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-노드 블록은 여러 개의 블록으로 구성
- 블록 내용
- 파일의 종류(일반, 디렉터리, 장치 파일 등)
- 파일의 링크 수
- 파일 소유자(uid, gid)
- 파일의 크기
- 파일이 저장된 블록 주소
- 접근 모드 및 시간
파일에 접근할 때에는 디스크의 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 를 찾아가는 과정은 다음과 같다.
- 2번 I-노드로부터 “/” 디렉터리 파일이 저장된 **블록 주소(예: 200)**를 얻는다.
- 루트 디렉터리 블록에서 “etc” 파일 명에 해당하는 **I-노드 번호(예:12)**를 얻는다.
- 12번 I-노드로부터 “etc” 디렉터리 파일이 저장된 **블록 주소(예:215)**를 얻는다.
- 블록 주소(215)에서 “passwd” 파일 명에 해당하는 **I-노드 번호(예:20)**를 얻는다.
- 20번 I-노드로부터 “passwd” 파일이 저장된 **블록 주소(예:250)**를 얻는다.
즉, 블록에서 파일에 관한 I-노드를 얻고, I-노드에서 블록 주소를 얻고….를 반복하며 파일을 찾아 간다.
이러한 과정에서 I-노드에 대한 검색이 여러 번 이루어지며, 오버헤드가 발생할 수 있기 때문에 항상 파일을 참조하기 전에 반드시 파일을 open 해야 한다.
파일을 열면 해당 파일의 I-노드가 메모리에 복사되며, 이후에는 메모리에 복사 된 I-노드를 통해 빠르게 검색할 수 있다.
'CS > 운영체제' 카테고리의 다른 글
메모리 (0) | 2025.04.08 |
---|---|
스레드 (0) | 2025.03.06 |
운영체제와 프로세스 (0) | 2025.03.06 |