Linux 파일 시스템 에 대한 분석

8437 단어 linux
Linux 파일 시스템 에 대한 분석
 
저자: TP    작성 일자: 2011 - 09 - 20 ~ 2011 - 09 - 25
 
       지난번 면접 에서 파일 시스템 을 설계 하 는 질문 을 받 은 후부 터 나 는 줄곧 고민 하고 있다.파일 은 도대체 어떤 데이터 구 조 를 가지 고 그것들 을 표현 합 니까?우리 의 운영 체 제 는 어떻게 그들 을 관리 합 니까?선배 대 협 들 이 파일 시스템 을 설계 하 는 과정 에서 어떤 사고 가 있 었 는 지, 그것 이 어떻게 오늘날 처럼 안정 적 이 고 신축성 이 강 한 체계 구조 로 발전 되 었 는 지.
 
       한동안 의 자 료 를 살 펴 본 후에 파일 시스템 에 대해 마침내 자신의 작은 이 해 를 가지 게 되 었 다.여기에 나 눔 을 적어 주시 고 아 낌 없 는 가르침 을 바 랍 니 다.
 
       Linux 는 ext 2, ext 3 에서 ntfs 등 여러 가지 파일 시스템 을 지원 합 니 다.그러나 본 고 는 Linux 커 널 에 있 는 가상 파일 시스템 (VFS, 때로는 가상 파일 시스템 교환기 라 고도 함) 을 논의 하고 파일 시스템 을 연결 하 는 주요 구 조 를 소개 한다.
 
1. 파일 시스템 이란 무엇 인가
 
파일 시스템 은 운영 체제 가 컴퓨터 하 드 디스크 에 데 이 터 를 저장 하고 검색 하 는 논리 적 방법 으로 본질 적 으로 특수 한 데이터 계층 저장 구조 로 파일, 디 렉 터 리 와 관련 된 제어 정 보 를 포함한다.
  
                                      그림 1.
       그림 1 에서 보 여 준 시스템 구 조 는 사용자 공간 과 커 널 에서 파일 시스템 과 관련 된 주요 구성 요소 간 의 관 계 를 나타 낸다.VFS 는 바 텀 파일 시스템 의 주요 인터페이스 이다.이 구성 요 소 는 인 터 페 이 스 를 내 보 낸 다음 에 각 파일 시스템 으로 추상 화하 면 각 파일 시스템 의 행동 차이 가 매우 클 수 있 습 니 다.파일 시스템 대상 에 대한 캐 시 (inode 와 dentry) 가 두 개 있 습 니 다.최근 에 사 용 된 파일 시스템 대상 을 캐 시 합 니 다.여기 서 버퍼 캐 시 와 장치 구동 의 상호작용, 그리고 VFS 가 제공 하 는 시스템 인 터 페 이 스 는 잠시 토론 하지 않 고 이 VFS 서브 시스템 을 실현 하 는 주요 구 조 를 살 펴 보 겠 습 니 다.
 
2. 파일 시스템 의 주요 구조
       VFS 에는 주로 네 개의 주요 대상 유형 이 있 는데 이 대상 들 은 슈퍼 블록 (슈퍼 블록), 색인 노드 inode, 디 렉 터 리 항목 dentry 와 파일 이다.슈퍼 블록 은 설 치 된 파일 시스템 을 대표 하고 색인 노드 는 파일 시스템 의 파일 을 대표 합 니 다.다른 구 조 는 dentry 라 고 합 니 다. 이름과 inode 사이 의 맵 을 실현 하 는 데 사 용 됩 니 다. 최근 에 사용 한 dentry 를 저장 하 는 디 렉 터 리 캐 시 가 있 습 니 다.dentry 는 디 렉 터 리 와 파일 간 의 관 계 를 유지 하여 파일 시스템 에서 이동 하 는 것 을 지원 합 니 다.마지막 으로 VFS 파일 은 열 린 파일 을 표시 합 니 다. (열 린 파일 의 상 태 를 저장 합 니 다. 예 를 들 어 쓰기 오프셋 등)그들 네 사람의 관 계 는 그림 2 를 볼 수 있다.
                   
 
그림 2.
       그림 2 에서 볼 수 있 듯 이 슈퍼 블록 은 모든 파일 시스템 의 루트 에 있 고 슈퍼 블록 은 파일 시스템 의 상 태 를 설명 하고 유지 합 니 다.파일 시스템 에서 관리 하 는 모든 대상 (파일 이나 디 렉 터 리) 은 Linux 에서 inode 로 표 시 됩 니 다.한편, dentry 는 경 로 를 가리 키 는 inode 입 니 다. 파일 이름과 inode 의 맵 을 표현 하 는 동시에 서로 다른 파일 이름 은 같은 inode 에 투사 할 수 있 습 니 다.다음은 이 몇 개의 대상 에 대해 간단 한 설명 을 하 겠 습 니 다.
 
a. 디 렉 터 리 항목 의 대상 dentry: dentry 의 중국어 이름 은 디 렉 터 리 항목 이 고 Linux 파일 시스템 의 한 색인 노드 (inode) 의 링크 입 니 다.이 색인 노드 는 파일 일 수도 있 고 디 렉 터 리 일 수도 있 습 니 다.가상 파일 시스템 이 도입 한 디 렉 터 리 항목 의 개념 을 쉽게 찾기 위해 서 입 니 다.모든 dentry 는 경로 의 특정한 부분 을 대표 합 니 다.경로 / bin / vi 에 있어 서 bin 과 vi 는 모두 디 렉 터 리 대상 에 속한다.앞의 두 개 는 디 렉 터 리 이 고, 마지막 하 나 는 일반 파일 이다.또한 하나의 경 로 를 분석 하고 그 분량 을 찾 는 것 은 문자열 을 비교 하 는 과정 이자 시간 이 걸 리 는 과정 이기 때문에 파일 시스템 은 디 렉 터 리 캐 시 기술 을 도입 하여 일부 디 렉 터 리 를 메모리 에 미리 불 러 옵 니 다.다음은 dentry 의 구조 체 입 니 다.
struct dentry {
atomic_t d_count; //
unsigned int d_flags; //
struct inode * d_inode; //
struct dentry * d_parent; //
struct list_head d_hash; //
struct list_head d_lru; //
struct list_head d_child; //
struct list_head d_subdirs; //
struct list_head d_alias; // ( )
int d_mounted; //
struct qstr d_name; //
unsigned long d_time; /* used by d_revalidate */
struct dentry_operations *d_op; //
struct super_block * d_sb; //
vunsigned long d_vfs_flags;
void * d_fsdata; //
unsigned char d_iname [DNAME_INLINE_LEN]; //
};

이 구조 체 에 서 는 목록 항목 의 구 조 를 구성 하기 때문에 다음 과 같은 몇 명의 구성원 에 대해 설명 한다.
d_inode: 이 이름 과 관련 된 색인 노드 의 지침 을 직접 기록 합 니 다.
d_parent: 아버지 dentry
d_hash: 산 목록, 주어진 경 로 를 관련 디 렉 터 리 항목 대상 으로 빠르게 해석 할 수 있 습 니 다.
d_child: 부모 디 렉 터 리 의 디 렉 터 리 항목 대상 링크
d_ 하위 디 렉 터 리
 
b. 색인 노드 대상 inode: 하나의 색인 노드 는 시스템 의 파일 을 대표 합 니 다. 이 는 커 널 이 파일 보안 이나 디 렉 터 리 에 필요 한 모든 정 보 를 포함 합 니 다.색인 노드 의 데이터 구조 가 비교적 방대 하기 때문에 여 기 는 몇 명의 주요 구성원 에 대해 잠시 설명 한다.
struct inode {
struct list_head i_hash; //
struct list_head i_list; //
struct list_head i_dentry; //
… …
struct inode_operations *i_op; //
… …
};

 
i_hash: Linux 는 활성 색인 노드 와 최근 에 사용 한 색인 노드 의 캐 시 를 유지 합 니 다.두 가지 돌격 을 통 해 이 노드 를 방문 할 수 있다.첫 번 째 경 로 는 dcache 를 통 해두 번 째 경 로 는 색인 노드 를 통 해 목록 을 분산 시 키 는 것 이다.모든 색인 노드 는 파일 시스템 의 슈퍼 블록 주소 와 색인 노드 번호 에 따라 8 자리 숫자의 해시 를 만 듭 니 다.그 다음 에 같은 해시 값 을 가 진 정보 노드 는 이중 링크 목록 에 연결 되 어 있다.이곳 의 ihash 는 바로 이 산 목록 을 가리킨다.
 
i_list: i_lish 링크 목록 은 서로 다른 상태 로 정보 노드 를 연결 합 니 다.포함: inodein_사용 목록, inodeunused 등.
 
i_dentry: identry 목록 은 이 정보 노드 의 모든 dentry 구 조 를 참조 하 는 목록 입 니 다.즉, 서로 다른 파일 이름 이나 경로 가 같은 파일 에 매 핑 되 었 습 니 다.
 
c. 슈퍼 블록 대상 슈퍼bolck: 슈퍼 블록 구 조 는 파일 시스템 을 표시 합 니 다.파일 시스템 을 관리 하 는 데 필요 한 정 보 를 포함 합 니 다. 파일 시스템 이름 (예 를 들 어 ext 2), 파일 시스템 의 크기 와 상태, 블록 장치 의 참조 와 메타 데이터 정보 (예 를 들 어 빈 목록 등) 를 포함 합 니 다.슈퍼 블록 은 보통 저장 매체 에 저장 되 지만 슈퍼 블록 이 존재 하지 않 으 면 실시 간 으로 만 들 수 있다.슈퍼 블록 의 데이터 구 조 는 linux / fs. h 에 있 습 니 다.슈퍼 블록 대상 을 만 들 고 관리 하 며 소각 하 는 코드 는 파일 fs / super. c 에 있 습 니 다.슈퍼 블록 대상 alloc슈퍼 () 함수 생 성 및 초기 화.파일 시스템 이 설 치 될 때 커 널 은 디스크 에서 파일 시스템 의 슈퍼 블록 을 읽 고 메모리 에 있 는 슈퍼 블록 대상 에 정 보 를 채 울 수 있 도록 이 함 수 를 호출 합 니 다.
 
       어쨌든 Liux 파일 시스템 에 대한 이 해 는 기 존 작업 에 직접적인 관계 가 없 지만.그러나 나 는 그것 이 신축 가능 하고 확장 가능 한 시스템 구조의 절대적 인 사례 라 고 생각한다.리 눅 스 커 널 을 프로그래머 의 전형 적 인 소스 코드 명작 에 비유 하면 파일 시스템 구 조 는 절대 놓 칠 수 없 는 장 이다.
 
참고 문헌:,,

좋은 웹페이지 즐겨찾기