參考:
(最清楚) Linux磁盤與文件管理系統(tǒng)
理解 Linux 中的 inodes
新建一個(gè)空文件占用多少磁盤空間
深度理解 Linux 讀取文件過程准潭!
文件過多時(shí)ls命令為什么會(huì)卡住轿衔?
我的理解
- 一個(gè)文件一般是需要一個(gè)inode+N個(gè)block來存儲(chǔ)颁褂,其文件名存于目錄中河哑。(如果是hard link 可能就是對(duì)應(yīng)多個(gè)inode)
- 讀取一個(gè)文件時(shí),先找到他的inode, 拿到到存block的指針數(shù)組,進(jìn)行讀取随闪。
核心圖
-
常見磁盤存儲(chǔ)結(jié)構(gòu)
-
訪問一個(gè)文件的常見流程
新建一個(gè)文件夾
- 一個(gè)inode結(jié)構(gòu) fs/ext2/ext2.h
ext2_inode {
__le16 i_mode; # 文件權(quán)限
__le16 i_uid; # 文件所有者ID
__le32 i_size; # 文件字節(jié)數(shù)大小
__le32 i_atime; # 文件上次被訪問的時(shí)間
__le32 i_ctime; # 文件創(chuàng)建時(shí)間
__le32 i_mtime; # 文件被修改的時(shí)間
__le32 i_dtime; # 文件被刪除的時(shí)間
__le16 i_gid; # 文件所屬組ID
__le16 i_links_count; # 此文件的inode被連接的次數(shù)
__le32 i_blocks; # 文件的block數(shù)量
......
__le32 i_block[EXT2_N_BLOCKS]; # 指向存儲(chǔ)文件數(shù)據(jù)的塊的數(shù)組
......
- 文件夾結(jié)構(gòu)體 fs/ext2/ext2.h
struct ext2_dir_entry {
__le32 inode; /* Inode number */
__le16 rec_len; /* Directory entry length */
__le16 name_len; /* Name length */
char name[]; /* File name, up to EXT2_NAME_LEN */
};
- 新建一個(gè)空文件需要消耗掉一個(gè)inode滑绒,用來保存用戶闷堡、創(chuàng)建時(shí)間等元數(shù)據(jù)。
- 新建一個(gè)空文件還需要消耗掉其所在目錄的block中一定的空間疑故,這些空間用來保存文件名杠览,inode號(hào)等信息。
命令
stat a.txt
ln a.txt ahardlink
ln -s a.txt asoftlink
dumpe2fs -h /dev/sda1 | grep Block
dumpe2fs -h /dev/sda1 | grep Inode
關(guān)于磁盤格式化時(shí)候的大小設(shè)置
- s(sector) 一個(gè)扇區(qū):0.5kb=512b
- b (block) 一個(gè)邏輯快:2的n次方*0.5kb
- i (inode) 一個(gè)inode
mkfs.ext4 /dev/sdb2
-b 分區(qū)時(shí)設(shè)定每個(gè)數(shù)據(jù)區(qū)塊占用空間大小纵势,目前支持1024踱阿、2048以及4096bytes每個(gè)塊
-i 設(shè)定inode大小
-N 設(shè)定inode數(shù)量
-c 在格式化之前檢測(cè)磁盤是否有問題,選項(xiàng)會(huì)導(dǎo)致進(jìn)程很慢
-L 預(yù)設(shè)該分區(qū)的標(biāo)簽label,類似WINDOWS下的C盤系統(tǒng)盤钦铁,D盤娛樂软舌,E盤影音
-j 建立ext3格式的分區(qū),如使用mkfs.ext3 則不需要這個(gè)選項(xiàng)
-t 指定文件系統(tǒng)的類型牛曹,ext2,ext3,ext4
-m 格式化時(shí)候佛点,留個(gè)管理員的磁盤比例,一個(gè)百分比黎比,只針對(duì) mke2fs命令