tail head cat sleep
QR code linking to this page

Man page  — FS

명칭

fs, inode – 파일 시스템 볼륨의 포맷

내용

서식

#include <sys/param.h>
#include <ufs/ffs/fs.h>

#include <sys/types.h>
#include <sys/lock.h>
#include <ufs/ufs/quota.h>
#include <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 v6 (으)로부터 등장했습니다. 이 메뉴얼로 기술되고 있는 파일 시스템은 BSD 4.2 (으)로부터 등장했습니다.

FS (5) April 19, 1994

tail head cat sleep
QR code linking to this page


Ben Bullock이 유닉스 매뉴얼 페이지에서 서비스에 대한 의견을 주시기 바랍니다. Privacy policy.

Modern Unix impedes progress in computer science, wastes billions of dollars, and destroys the common sense of many who seriously use it.
— The Unix Haters' handbook