FS(5)

명칭
fs, inode - 파일 시스템 볼륨의 포맷

서식
<sys/param.h> <ufs/ffs/fs.h>

<sys/types.h> <sys/lock.h> <ufs/ufs/quota.h> <ufs/ufs/inode.h>

해설
파일 <fs.h> (와)과 <inode.h> (은)는, 랜덤 억세스 디바이스 (디스크) 상의 파일 시스템 오브젝트 의 기본 포맷을 작성, 관리할 때에 사용되는 몇개의 구조체, 정의가 끝난 변수, 매크로를 선언합니다.

파일 시스템은 블록 사이즈와 블록수로부터 구성되어 있어 이것들은 파일 시스템의 파라미터가 됩니다. BBLOCK (으)로부터 시작 크기 BBSIZE 만 계속되는 섹터는, 디스크 label 물어 구두인가의 일차, 2차 하드웨어 bootstrap 프로그램 (을)를 위해서(때문에) 사용됩니다.

실제의 파일 시스템은, SBLOCK 섹터로부터 시작되어, 거기에는 크기가 SBSIZE 이다 슈퍼 블록 (이)가 있습니다. 파일 <ufs/ffs/fs.h> 에 있는 이하의 구조체는, 슈퍼 블록을 기술하고 있습니다.

    /*
     * FFS 파일 시스템의 슈퍼 블록
     */
    struct fs {
    	int32_t	 fs_firstfield;	/* 내부 슈퍼 블록용으로 사용되는, 역사적인 */
    	int32_t	 fs_unused_1;	/*     파일 시스템의 링크가 끝난 리스트 */
    	ufs_daddr_t fs_sblkno;	/* 파일 시스템내의 슈퍼 블록의 주소 */
    	ufs_daddr_t fs_cblkno;	/* 파일 시스템내의 실린더 블록의 오프셋(offset) */
    	ufs_daddr_t fs_iblkno;	/* 파일 시스템내의 inode 블록의 오프셋(offset) */
    	ufs_daddr_t fs_dblkno;	/* cg 후의 최초의 데이터의 오프셋(offset) */
    	int32_t	 fs_cgoffset;	/* 실린더내의 실린더 그룹 오프셋(offset) */
    	int32_t	 fs_cgmask;	/* mod fs_ntrak 의 계산에 사용된다 */
    	time_t 	 fs_time;	/* 마지막에 기입해졌을 때 각 */
    	int32_t	 fs_size;	/* fs 내의 블록수 */
    	int32_t	 fs_dsize;	/* fs 내의 데이터 블록수 */
    	int32_t	 fs_ncg;	/* 실린더 그룹의 수 */
    	int32_t	 fs_bsize;	/* fs 내의 기본 블록 사이즈 */
    	int32_t	 fs_fsize;	/* fs 내의 fragment 블록 사이즈 */
    	int32_t	 fs_frag;	/* fs 의 1 블록중의 fragment수 */
    /* 이하는 배치 파라미터 */
    	int32_t	 fs_minfree;	/* 프리 블록의 최소 퍼센티지 */
    	int32_t	 fs_rotdelay;	/* 최적인 다음 블록을 위한 ms 수 */
    	int32_t	 fs_rps;	/* 1 초 쯤의 디스크 회전 */
    /* 이러한 필드는 다른 필드로부터 계산할 수 있다 */
    	int32_t	 fs_bmask;	/* ``blkoff''블록 오프셋(offset)의 계산 */
    	int32_t	 fs_fmask;	/* ``fragoff''fragment 오프셋(offset)의 계산 */
    	int32_t	 fs_bshift;	/* ``lblkno''논리 블록 번호의 계산 */
    	int32_t	 fs_fshift;	/* ``numfrags''fragment수의 계산 */
    /* 이하는 배치 파라미터 */
    	int32_t	 fs_maxcontig;	/* 연속한 블록의 최대수 */
    	int32_t	 fs_maxbpg;	/* 실린더 그룹 근처의 최대 블록수 */
    /* 이러한 필드는 다른 필드로부터 계산할 수 있다 */
    	int32_t	 fs_fragshift;	/* fragment 쉬프트 하는 블록 */
    	int32_t	 fs_fsbtodb;	/* fsbtodb 와 dbtofsb 쉬프트 정수 */
    	int32_t	 fs_sbsize;	/* 슈퍼 블록의 실제의 크기 */
    	int32_t	 fs_csmask;	/* csum 블록 오프셋(offset) */
    	int32_t	 fs_csshift;	/* csum 블록수 */
    	int32_t	 fs_nindir;	/* NINDIR 의 값 */
    	int32_t	 fs_inopb;	/* INOPB 의 값 */
    	int32_t	 fs_nspf;	/* NSPF 의 값 */
    /* 다른 배치 파라미터 */
    	int32_t	 fs_optim;	/* 최적화의 선택, 이하를 참조 */
    /* 이러한 필드는 하드웨어로부터 나타난다 */
    	int32_t	 fs_npsect;	/* 예비를 포함한 트럭 근처의 섹터수 */
    	int32_t	 fs_interleave;	/* 하드웨아세크타인타리브 */
    	int32_t	 fs_trackskew;	/* 트럭 근처의 섹터 0 왜곡 */
    /* fs_id 는 미사용의 fs_headswitch 와 fs_trkseek 의 필드의 공간을 보관 유지 */
    	int32_t	 fs_id[2];	/* 독특한 파일 시스템 ID */
    /* 실린더 그룹의 수로 사이즈에 의해 결정할 수 있는 사이즈 */
    	ufs_daddr_t fs_csaddr;	/* 실린더 그룹 총괄 area의 블록 주소 */
    	int32_t	 fs_cssize;	/* 실린더 그룹 총괄 area의 사이즈 */
    	int32_t	 fs_cgsize;	/* 실린더 그룹 사이즈 */
    /* 이러한 필드는 하드웨어로부터 나타난다 */
    	int32_t	 fs_ntrak;	/* 실린더 근처의 트럭수 */
    	int32_t	 fs_nsect;	/* 트럭 근처의 섹터수 */
    	int32_t	 fs_spc;   	/* 실린더 근처의 섹터수 */
    /* 이것은 디스크 드라이버 파티션 작성시의 것 */
    	int32_t	 fs_ncyl;   	/* 파일 시스템의 실린더수 */
    /* 이러한 필드는 다른 필드로부터 계산할 수 있다 */
    	int32_t	 fs_cpg;	/* 그룹 근처의 실린더수 */
    	int32_t	 fs_ipg;	/* 그룹 근처의 inode 수 */
    	int32_t	 fs_fpg;	/* 그룹 근처의 블록수 * fs_frag */
    /* 이 데이터는 크래쉬 후에 재계산되지 않으면 안 된다 */
    	struct	csum fs_cstotal;/* 실린더 총괄 정보 */
    /* 이하의 필드는 mount시에 클리어 된다 */
    	int8_t   fs_fmod;    	/* 슈퍼 블록 변경 플래그 */
    	int8_t   fs_clean;    	/* 파일 시스템이 깨끗한 플래그 */
    	int8_t   fs_ronly;   	/* 읽기 전용으로 mount 된 플래그 */
    	int8_t   fs_flags;   	/* 현재미사용의 플래그 */
    	int8_t   fs_fsmnt[MAXMNTLEN];	/* mount 되고 있는 이름 */
    /* 이러한 필드는 현재의 블록의 배치 정보를 보관 유지한다 */
    	int32_t	 fs_cgrotor;	/* 마지막에 검색된 cg */
    	struct	csum *fs_csp[MAXCSBUFS]; /* fs_cs 정보 버퍼의 리스트 */
    	int32_t	 *fs_maxcluster;/* 각 실린더 그룹의 최대 클러스터 */
    	int32_t	 fs_cpc;	/* postbl 내의 사이클 근처의 실린더 */
    	int16_t	 fs_opostbl[16][8];	/* 구회전 블록 리스트 헤드 */
    	int32_t	 fs_sparecon[50];	/* 장래를 위해서(때문에) 예약된 정수 */
    	int32_t	 fs_contigsumsize;	/* 클러스터 총괄 배열의 크기 */
    	int32_t	 fs_maxsymlinklen;	/* 내부 기호 연결의 최대장 */
    	int32_t	 fs_inodefmt;	/* 디스크상의 inode 의 포맷 */
    	u_int64_t fs_maxfilesize;/* 최대 표시 가능 파일 사이즈 */
    	int64_t	 fs_qbmask;	/* ~fs_bmask - 64 비트 사이즈로 사용한다 */
    	int64_t	 fs_qfmask;	/* ~fs_fmask - 64 비트 사이즈로 사용한다 */
    	int32_t	 fs_state;	/* fs_clean 필드가 유효한 것을 나타낸다 */
    	int32_t	 fs_postblformat;/* 위치 레이아웃 테이블의 포맷 */
    	int32_t	 fs_nrpos;	/* 회전 위치의 수 */
    	int32_t	 fs_postbloff;	/* (u_int16) 회전 블록 리스트 헤드 */
    	int32_t	 fs_rotbloff;	/* (u_int8) 각 회전 마다의 블록 */
    	int32_t	 fs_magic;	/* magic number */
    	u_int8_t fs_space[1];	/* 각 회전 마다의 블록의 리스트 */
    /* 실제는 좀 더 길다 */
    };
    /*
     * 파일 시스템 식별
     */
    #define	FS_MAGIC	0x011954   /* fast 파일 시스템의 magic number */
    #define	FS_OKAY		0x7c269d38 /* 슈퍼 블록 체크 섬 */
    #define FS_42INODEFMT	-1	   /* 4.2BSD inode 포맷 */
    #define FS_44INODEFMT	2	   /* 4.4BSD inode 포트
     */
    /*
     * 최적화를 위한 선택
     */
    #define FS_OPTTIME	0	/* 최소 어로케이션 시간 */
    #define FS_OPTSPACE	1	/* 최소 디스크 fragmentation */
    /*
     * 회전 레이아웃 테이블 포맷 타입
     */
    #define FS_42POSTBLFMT		-1  /* 4.2BSD 회전 테이블 포맷 */
    #define FS_DYNAMICPOSTBLFMT	1   /* 동적 회전 테이블 포맷 */

각 디스크 드라이버는 몇개의 파일 시스템을 포함하고 있습니다. 1 개의 파일 시스템은, 몇개의 실린더 그룹으로부터 완성됩니다. 각 실린더 그룹에는 inode 와 데이터가 있습니다.

파일 시스템은, 실린더 그룹을 차례로 기술하는 슈퍼 블록에 따라서 기술되고 있습니다. 슈퍼 블록은 중요한 데이터이며, 괴멸적인 손실로부터 지키기 위해서(때문에) 각 실린더 그룹에 복제되고 있습니다. 이것은 파일 시스템 작성시에 행해져 중요한 슈퍼 블록 데이터는 변경되지 않기 때문에, 특히 참사가 체 걸리지 않으면, 복제가 참조된다 필요는 없습니다.

inode 에 보존된 주소에 의해,`블록'의 fragment의 위치를 결정할 수가 있습니다. 파일 시스템 블록의 대부분은 MAXBSIZE 그렇지만, 2, 4, 8 개로 나누는 것이 자유롭게 할 수 있어 각각을 위치 지정할 수 있습니다. 이러한 단편은 DEV_BSIZE 또는 DEV_BSIZE 단위의 배수이면 좋습니다.

큰 파일은, 매우 큰 데이터 블록으로부터 됩니다. 디스크 스페이스의 과도의 낭비를 피하기 위해서(때문에), 작은 파일의 마지막 데이터 블록은, 큰 블록의 fragment가 필요한 수만큼 배치됩니다. 파일 시스템 포맷은, 그러한 fragment (큰 블록을 분할한 한 조각)의 1 개(살)에의 포인터만을 보관 유지합니다. 그러한 fragment의 크기는, inode 에 있는 정보로부터 결정할 수가 있어 blksize(fs, ip, lbn) 매크로가 사용하고 있습니다.

파일 시스템은, 제공 가능한 빈 곳을 fragment 레벨로 기록합니다. 즉, 블록의 빈 곳을 결정하기 위해서(때문에), fragment를 늘어놓아 조사합니다.

root inode 는, 파일 시스템의 근본입니다. inode 0 은, 통상의 목적에서는 사용되지 않고, 역사적으로 배드 블록은 inode 1 에 링크 됩니다. 따라서 root inode 는, 2 입니다 (inode 1 은, 이미 이 목적에서는 사용되지 않습니다만, 많은 덤프 테이프가 이 가정을 하고 있으므로, 거기에 붙어 변경할 수 없습니다).

fs_minfree 요소는, 비어 있는 파일 시스템 블록의 최저 허용 비율을 줍니다. 빈리스트가 이 레벨 이하가 되었을 경우, 슈퍼 유저 만이 블록의 확보를 계속할 수가 있습니다. fs_minfree 요소는, 빈블록의 예비가 필요없다고 생각되면(자) 0 에 세트 해도 괜찮습니다가, 파일 시스템이 90% 이상 찬 상태로 움직이고 있을 때는, 꽤 성능이 저하하겠지요. 그 때문에 디폴트의 fs_minfree 의 값은 10% 가 되어 있습니다.

경험상, 블록 fragmentation와 90% 사용중의 디스크 전체의 이용 의 균형이 가장 좋은 것은, fragmentation 8 때입니다. 그 때문에 디폴트의 fragment 사이즈는 블록 사이즈의 8 배가 되고 있습니다.

요소 fs_optim (은)는 파일 시스템이 블록을 확보하는데 필요로 하는 시간을 최소에 하려고 하는지, 그렇지 않으면 디스크상의 area의 fragmentation를 최소에 하려고 하는지를 지정합니다. fs_minfree (상기 참조)의 값이 10% 보다 작은 경우는, 파일 시스템 (은)는 공간의 최적화를 디폴트로 해, 완전한 크기의 블록이 없어지지 않게 합니다. minfree 의 값이 10% 로 동일한가 그 이상의 경우에는, fragmentation 하지만 문제는 되기 어렵고, 파일 시스템은 시간의 최적화를 디폴트에 합니다.

실린더 그룹에 관련한 제한: 연속한 블록을 최소의 회전 늦게 배치할 수가 있도록, 각 실린더는 다른 회전 위치에서의 이용 가능한 블록수를 계속 보관 유지합니다. 디폴트에서는 회전 위치를 8 분할로 나타내, 이 때의 총괄 정보의 분해가능은 전형적인 3600 rpm 의 드라이브로 2ms 가 됩니다.

요소 fs_rotdelay (은)는, 동일 실린더상에서 다른 디스크 전송을 개시한다 최소 밀리 세컨드수를 줍니다. 이것은, 어느 파일중의 디스크 블록의 주회 중(안)에서의 최적인 배치를 결정하는데 사용됩니다. 디폴트의 fs_rotdelay 의 값은 2ms 입니다.

각 파일 시스템은, 정적으로 할당할 수 있었던 수의 inode 를 가지고 있습니다. inode 는, 디스크 공간 근처 NBPI 바이트 확보됩니다. inode 를 배치하는 전략은, 극단적으로 보수적입니다.

MINBSIZE 하지만 용서되는 최소의 블록 사이즈입니다. MINBSIZE 하지만 4096 에서는, 2 단까지의(블록) 간접 참조를 사용해 2^32 의 크기의 파일을 만들 수가 있습니다. MINBSIZE (은)는, 실린더 그룹 블록을 보관 유지하는데 충분한 크기가 아니면 되지 않습니다. 따라서 (구조체 cg) 에의 변경은 크기를 MINBSIZE 이내로 해 두지 않으면 안됩니다. 슈퍼 블록은 결코 SBSIZE 의 크기 이상은 아니라고 하는 것에 주의해 주세요.

파일 시스템이 mount 되고 있는 패스명은, fs_fsmnt 에 보관 유지됩니다. MAXMNTLEN (은)는, 이 이름을 위해서(때문에) 슈퍼 블록에 할당할 수 있었던 area의 양을 정의합니다. 파일 시스템 마다의 총괄 정보의 양의 상한은, MAXCSBUFS 에 의해 정의되고 있습니다. 4096 바이트 블록 사이즈의 경우에서는, 이것은 현재 최대 200 만 실린더분 준비되어 있습니다.

각각의 실린더 그룹 정보는, 선두의 실린더 그룹 데이터 블록으로부터 확보된 블록에 요약됩니다. 이러한 블록은 슈퍼 블록에 가세해 fs_csaddr ( fs_cssize 의 크기) (으)로부터 읽힙니다.

주의: sizeof(struct csum) 하 fs_cs() 매크로를 움직이기 위해서(때문에) 2 말하고 나무승이 아니면 안됩니다.

파일 시스템의 슈퍼 블록: 주회 레이아웃 테이블의 크기는, 슈퍼 블록이 SBSIZE 의 크기를 가지는 것으로 제한되고 있습니다. 이러한 테이블의 크기는, 파일 시스템의 블록 사이즈에 역비례 합니다. 섹터 사이즈가 2 말하고 나무승이 아닐 때에는, 주회 패턴을 (fs_cpc) 만 반복하기까지 포함되는 실린더수가 증가하므로, (와)과 같이 테이블의 크기도 증가합니다. 주회 레이아웃 테이블의 크기는, (struct fs) 에 남아 있는 바이트수로부터 산출해집니다.

실린더 그룹 근처의 데이터 블록수는, 실린더 그룹이 고작 1 블록이므로, 제한되고 있습니다. inode 와 비어 블록 테이블은, 단일 블록으로부터 실린더 그룹 구조체 (struct cg) (을)를 위한 area를 제외한 나머지에 딱 맞지 않으면 안됩니다.

Inode: inode 는, UNIX 파일 시스템내의 모든 파일에 관한 동작의 중심입니다. 각 액티브한 파일, 커런트 디렉토리, mount 된 파일, 텍스트 파일, root 에는, 각각 독특한 inode 를 할당할 수 있습니다. inode 는 그 디바이스 / i 번호에 의해 `이름 붙이고'되고 있습니다. 자세하게는 인클루드 파일 <ufs/ufs/inode.h> (을)를 참조해 주세요.

역사
filsys 라고 명명된 슈퍼 블록 구조는 AT&T UNIX (으)로부터 등장했습니다. 이 메뉴얼로 기술되고 있는 파일 시스템은 4.2BSD (으)로부터 등장했습니다.