[OS] [오퍼레이팅 시스템] File System : fs

영은히히·2021년 10월 31일

OS

목록 보기
1/2

🤷‍♀️ fs가 뭐야!

디스크 혹은 2차 저장장치에 파일을 효율적으로 저장 가능

  • 공간 효율성 : 디스크 공간 낭비 없음
    -> 파일을 block 크기로 잘게 나눔
    -> 빈 디스크에 흩어져 저장
  • 시간효율 : 파일 빨리 찾기 (file name => location)
    -> 파일 block 위치와 inode table 기억

😎예시

~ inode table : 파일의 block 위치 ~

write f1 (2 block file)
write f2 (3 block file)
delete f1
write f3 (3 block file)

  • store file blocks in empty disk blocks
  • remember file block lecation in an empty inode
  • remember inode number for this file in the directory
  • where is f3? ==> go to inode 2 ==> block 2,3,7

🤨 Linux file system

~ 1blk = 4K byte

❓ file

❓ file system

✔️ Inode table : array of inode

= 파일 위치 1. 모든 파일은 inode를 가지고 있음
2. inode number는 1부터 시작
3. inode 2 는 root directory file("\")
4. inode는 128 byte

✔️ IBM : Inode Bit Map

= ㅇㅓ느 inode가 비어있나 ~ 1. 1blk = 4Kbyte = 4096byte = can cover 4096*8= 32768 inodes
2. inode 사용 중 1 / inode가 비어있음 0
-> 위 그림에서 inode 0,1,2,3, 사용 중
-> inode 4는 비어있음 = 사용 가능

✔️ DBM : Datablock Bit Map

= ㅇㅓ느 disk가 비어있나 ~

✔️ Group Descriptors

= D , I , Inode table 위치

✔️ Super Block

= fs에 대한 전체 정보 -> 주소 400에서 시작

😁 Gentoo 안에서 찾은 코드 !!

~ super block

typedef struct  // super block
{
u32 m_inodes_count;  // 0-3
u32 m_blocks_count;  // 4-7
u32 m_r_blocks_count; // 8-B
u32 m_free_blocks_count; // C-F
u32 m_free_inodes_count;  // 10-13
u32 m_first_data_block;  // 14-17 
                        // block location of superblock.
u32 m_log_block_size;    // 18-1B. block size=1024*2^(m_log⁡_block_size))
u32 m_log_frag_size;     // 1C-1F
u32 m_blocks_per_group;  // 20-23
u32 m_frrags_per_group; // 24-27
u32 m_inodes_per_group;  // 28-2B
u32 m_mtime;  // 2C-2F 
u32 m_wtime;  // 30-33
u16 m_mnt_count; // 34-35
u16 m_max_mnt_count;  // 36-37
u16 m_magic;  // 38-39
u16 m_state;  // 3A-3B
u16 m_errors;  // 3C-3D
u16 m_minor_rev_level;  // 3E-3F
u32 m_lastcheck;  // 40-43
u32 m_checkinterval; // 44-47
u32 m_creator_os;  // 48-4b
u32 m_rev_level;  // 4c-4f
u16 m_def_resuid;  // 50-51
u16 m_def_resgid;  // 52-53
u32 m_first_ino;  // 54-57
u16 m_inode_size;  //58-59
u16 m_block_group_nr;  //5a-5b
u32 m_feature_compat;  //5c-5f
u32 m_feature_incompat;  //60-63
u32 m_feature_ro_compat;  //64-67
u08 m_uuid[16]; //68-77
char m_volume_name[16]; //78-87
char m_last_mounted[64]; //88-c7
u32 m_algorithm_usage_bitmap; //c8-cb
u08 m_prealloc_blocks; //cc
u08 m_prealloc_dir_blocks; //cd
u16 m_padding; // ce-cf
u08 m_journal_uuid[16]; // d0-df
u32 m_journal_inum; // e0-e3
u32 m_journal_dev; // e4-e7
u32 m_last_orphan; // e8-eb
u32 m_hash_seed[4]; // ec-fb
} SuperBlock;

~ group descriptor

typedef struct // group descriptor
{
u32 m_block_bitmap;  // block location of DBM
u32 m_inode_bitmap;  // block location of IBM
u32 m_inode_table;   // block location of inode table
u16 m_free_blocks_count;
u16 m_free_inodes_count;
u16 m_used_dir_count;
u16 m_padding;
u32 m_reserved[3];
} GroupDescriptor;

~ inode

typedef struct  // inode
{
u16 m_mode; // 0-1
u16 m_uid;  // 2-3
u32 m_size; // 4-7
u32 m_atime; // 8-B
u32 m_ctime; // C-F
u32 m_mtime;  // 10-13
u32 m_dtime; // 14-17
u16 m_gid; // 18-19
u16 m_links_count; // 1A-1B
u32 m_blocks; // 1C-1F. shows num of data blocks for this file in units of 512 bytes
u32 m_flags; // 20-23
u32 m_reserved1; // 24-27
u32 m_block[15];   // block location of this file
u32 m_generation;
u32 m_file_acl;
u32 m_dir_acl;
u32 m_faddr;
u32 m_reserved2[3];
} Inode;

~ directory

typedef struct // directory
{
u32 m_inode;
u16 m_rec_len;
u08 m_name_len;
u08 m_file_type;
char m_name[255];
} DirectoryEntry;

참고

김기창 , "Operating System" , 인하대학교

profile
어차피 알아야 한다. 한 번에 하자

0개의 댓글