linux文件系统只有几k,关于Linux文件系统的的简单理解和认识
關(guān)于Linux文件系統(tǒng)的的簡(jiǎn)單理解和認(rèn)識(shí)
關(guān)于文件系統(tǒng)的運(yùn)作,這與操作系統(tǒng)帶的檔案數(shù)據(jù)有關(guān)。例如Linux操作系統(tǒng)的檔案權(quán)限(rwx)與文件屬性(擁有者,群組,時(shí)間參數(shù)等)。文件系統(tǒng)通常會(huì)將這兩部分的數(shù)據(jù)分別存放在不同的區(qū)塊,權(quán)限與屬性放置到inode中,至于實(shí)際數(shù)據(jù)則放置到date block區(qū)塊中,另外,還有一個(gè)超級(jí)塊區(qū)(super block)會(huì)記錄整個(gè)文件系統(tǒng)的整體信息,包含inode與block的總量,使用量,剩余量等。
每個(gè)inode與block都有編號(hào),至于這三個(gè)數(shù)據(jù)的意義可以簡(jiǎn)單說明如下:
super block :記錄此 filessystem的整體信息,包括inode/block的總量,使用量,剩余量,以及文件系統(tǒng)的格式與相關(guān)信息等;(#這個(gè)文件系統(tǒng)對(duì)應(yīng)的是一個(gè)分區(qū),應(yīng)該可以這樣理解)
Inode 表:記錄檔案的屬性,一個(gè)檔案占用一個(gè)inode號(hào),同時(shí)記錄此檔案的數(shù)據(jù)所在的block號(hào)碼;
Block :實(shí)際記錄檔案的內(nèi)容,若檔案太大時(shí),會(huì)占用多個(gè)block。
如果當(dāng)一個(gè)分區(qū)分的容量分得比較大,所有的inode ?block superblock統(tǒng)一管理不是很方便,所以我們有在分區(qū)上存在分組的概念,把一個(gè)分區(qū)我們分成多個(gè)區(qū)塊群組,不同的區(qū)塊群組管理自身的inode ?block ?superblock號(hào)
Inode ?table (inode表格)
(格式化分區(qū)的時(shí)候inode的數(shù)量和大小128bytes就已經(jīng)固定)
數(shù)據(jù)內(nèi)容:
該文件的權(quán)限(rwx);
該文件的擁有者與群組;
該文件的容量;
該文件建立或狀態(tài)改變的時(shí)間(ctime);
最近一次的讀取時(shí)間(atime);
最近修改的時(shí)間(mtime);
文件特定的標(biāo)志(SUID SGID STICK)
該文件真正內(nèi)容的指向(指向block)
Inode表的數(shù)據(jù)結(jié)構(gòu),表前面為文件的元數(shù)據(jù)基本信息,后面就是數(shù)據(jù)指向,如果文件太大有400M,分區(qū)的block大小假如為4K,由于inode表的容量有限128字節(jié),不可能有那邊多的空間指針指向數(shù)據(jù)的block,通常情況下,一個(gè)inode表有12個(gè)直接數(shù)據(jù)指向,再就是間接指向,兩間接指向,三間接指向
直接數(shù)據(jù)指向:一個(gè)指向只能指向一個(gè)block,所以12個(gè)直接指向只能代表48K的數(shù)據(jù);
間接指向:間接指向指向一個(gè)block,該block上有1024的直接指向可以指向block,故一個(gè)間接指向可以表示4M的數(shù)據(jù);
兩重間接指向:相當(dāng)與開始指向一個(gè)block有1024個(gè)間接指向指向block,每個(gè)block又有1024個(gè)直接指向數(shù)據(jù)塊,所以可以表示:4K*1024*1024=4G;
三重間接指向:通過以上推理,一個(gè)三重間接指向可以代表 4T的數(shù)據(jù);
# 由于inode的表容量有限,所以導(dǎo)致每個(gè)inode的表示的空間是有上限的,也就導(dǎo)致不同文件系統(tǒng)的單個(gè)分區(qū)容量也有上限.
superblock超級(jí)區(qū)塊
Superblock是記錄整個(gè)filesysytem相關(guān)信息的地方,沒有Superblock,就沒有文件系統(tǒng),它記錄的信息主要有:
Block和inode的總量;
未使用與已使用的block/inode數(shù)量;
Block與inode的大小(block為1 2 4 K ,inode為128bytes)
文件系統(tǒng)的掛載時(shí)間,最近一次寫入數(shù)據(jù)的時(shí)間,最近一次檢驗(yàn)磁盤的時(shí)間等文件系統(tǒng)的相關(guān)信息;
一個(gè)valid bit數(shù)值,若此文件系統(tǒng)已被掛載,則valib bit為0,若未被掛載,則valid bit為1
注意:dumpe2fs可以查看相關(guān)信息。superblock超級(jí)區(qū)塊可能在不同的群組上存在,其它的superblock超級(jí)區(qū)塊為備份的超級(jí)區(qū)塊。
文件系統(tǒng)描述說明
這個(gè)區(qū)段可以描述每個(gè)block group的開始與結(jié)束的block,以及說明每非區(qū)段分別存儲(chǔ)與哪一個(gè)block號(hào)碼之間。
Block bitmap(區(qū)塊對(duì)照表)
如果你想要新增文件時(shí)總會(huì)用到block,但是需要使用哪一個(gè)block來記錄呢?怎么知道哪些block是空的呢?從block bitmap中我們可以知道哪些block是空的,當(dāng)刪除一些數(shù)據(jù),block bitmap表會(huì)記錄block的標(biāo)志位未使用,下次有數(shù)據(jù)存儲(chǔ)時(shí),就可以覆蓋此處的block。
dumpe2fs /dev/sda1 ?來看看超級(jí)塊中的數(shù)據(jù)信息
(好像只有ext系列的文件系統(tǒng)才可以使用本工具,請(qǐng)不在要xfs文件系統(tǒng)上使用該命令)
[root@love681 ~]# dumpe2fs ?/dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:
Last mounted on: ?????????/boot#分區(qū)掛載點(diǎn)
Filesystem UUID: ?????????0ae2a047-9dd6-4bb1-a284-818f971865ea
Filesystem magic number: ?0xEF53
Filesystem revision #: ???1 (dynamic)
Filesystem features: ?????has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: ????????signed_directory_hash
Default mount options: ???user_xattr acl
Filesystem state: ????????clean
Errors behavior: ?????????Continue
Filesystem OS type: ??????Linux
Inode count: ?????????????51200#inode數(shù)量
Block count: ?????????????204800# block數(shù)量
Reserved block count: ????10240
Free blocks: ?????????????160134#空閑的block數(shù)量
Free inodes: ?????????????51162#空閑的是inode數(shù)量
First block: ?????????????1
Block size: ??????????????1024#block單元大小為1K
Fragment size: ???????????1024
Reserved GDT blocks: ?????256
Blocks per group: ????????8192#一個(gè)群組中block的數(shù)量
Fragments per group: ?????8192
Inodes per group: ????????2048#一個(gè)群組中inode的數(shù)量
Inode blocks per group: ??256
Flex block group size: ???16
Filesystem created: ??????Fri Jul 22 15:51:06 2016
Last mount time: ?????????Mon Jul 25 11:28:22 2016
Last write time: ?????????Mon Jul 25 11:28:22 2016
Mount count: ?????????????6
Maximum mount count: ?????-1
Last checked: ????????????Fri Jul 22 15:51:06 2016
Check interval: ??????????0 ()
Lifetime writes: ?????????43 MB
Reserved blocks uid: ?????0 (user root)
Reserved blocks gid: ?????0 (group root)
First inode: ?????????????11
Inode size:128#inode單位大小128個(gè)字節(jié)
Journal inode: ???????????8
Default directory hash: ??half_md4
Directory Hash Seed: ?????9e14b616-ea5a-4fa3-b9ea-5c1ef844f87d
Journal backup: ??????????inode blocks
Journal features: ????????(none)
Journal size: ????????????4096k
Journal length: ??????????4096
Journal sequence: ????????0x0000001b
Journal start: ???????????0
Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
Checksum 0x5827, unused inodes 2010
Primary superblock at 1, Group descriptors at 2-2#超級(jí)塊的位置,群組描述符的位置
Reserved GDT?blocks at 3-258 ?#
Block bitmap at 259 (+258), Inode bitmap at 275 (+274)#區(qū)塊對(duì)應(yīng)表位置,inode對(duì)應(yīng)表的位置
Inode table at 291-546 (+290)#inode表的位置
3785 free blocks, 2010 free inodes, 6 directories, 2010 unused inodes
Free blocks: 4408-8192
Free inodes: 39-2048
Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xa798, unused inodes 2048
Backup superblock at 8193, Group descriptors at 8194-8194
Reserved GDT blocks at 8195-8450
Block bitmap at 260 (+4294959363), Inode bitmap at 276 (+4294959379)
Inode table at 547-802 (+4294959650)
390 free blocks, 2048 free inodes, 0 directories, 2048 unused inodes
Free blocks: 15995-16384
Free inodes: 2049-4096
目錄的存儲(chǔ)方式
在ext文件系統(tǒng)中,當(dāng)新建一個(gè)目錄,ext系統(tǒng)會(huì)分配一個(gè)inode與至少一塊block給該目錄,其中inode記錄該目錄的相關(guān)權(quán)限與屬性,并記錄分配到的那塊block號(hào)碼,而block則是記錄在這個(gè)目錄下的文件名和該文件名占用inode的號(hào)碼數(shù)據(jù),就如下:
Inode number
文件名
654789
1.txt
654790
2.txt
654800
3.txt
普通文件存儲(chǔ)的方式:
在ext文件系統(tǒng)中,新建一個(gè)普通文件時(shí),ext文件系統(tǒng)會(huì)分配一個(gè)inode與相對(duì)于該文件大小的block數(shù)量給該文件。例如:該文件的大小為100Kbytes,假如一個(gè)block大小為4kbytes,這inode需要記錄25個(gè)block與之對(duì)應(yīng),為什么是25個(gè),由于inode有12個(gè)直接指向,合計(jì)48kbytes,設(shè)置于的使用一個(gè)間接指向block,由該block存儲(chǔ)剩余的文件。
目錄樹的讀取
以上我們大概可以了解到,inode表中并不記錄文件名與數(shù)據(jù)的對(duì)應(yīng)關(guān)系,inode表記錄文件的基本屬性和block指向,指向的block中記錄文件名和inode的對(duì)應(yīng)關(guān)系。
由于目錄樹是又根目錄開始的,因此新系統(tǒng)透過掛載的信息可以找到掛載點(diǎn)的inode號(hào)碼(通常一個(gè)filesysytem的最頂層是inode號(hào)碼由2號(hào)開始的,其實(shí)不知道是從2號(hào)開始的),因此只要讀取到根的inode內(nèi)容,就可以讀取到該inode對(duì)應(yīng)的block的數(shù)據(jù),可以找到該目錄下文件會(huì)目錄對(duì)應(yīng)inode的對(duì)相應(yīng)關(guān)系。
舉例說明:
如果我們想要讀取/etc/passed這個(gè)文件的內(nèi)容,系統(tǒng)是如何讀取的呢?
[root@wCentos7 ~]# ll -di /etc/ ?/etc/passwd /
128 dr-xr-xr-x. ?18 root root 4096 Jul 21 11:34 /
134313217 drwxr-xr-x. 129 root root 8192 Jul 30 12:53 /etc/
136822215 -rw-r--r--. ??1 root root 2525 Jul 30 10:44 /etc/passwd
如上圖,在我的實(shí)驗(yàn)的電腦上 /的indoe號(hào)是128,etc目錄的inode號(hào)是13431327,文件passed inode號(hào)是136822215,我們來看看數(shù)據(jù)的讀取過程:
1.通過掛載點(diǎn)獲得 /的inode號(hào)為128,(其實(shí)到底是通過說明方法獲取到/的inode現(xiàn)在確實(shí)不了解),讀取128 inode的數(shù)據(jù)內(nèi)容,讀取到對(duì)于執(zhí)行程序的用戶root權(quán)限時(shí) (r-x),就可以去讀取inode對(duì)應(yīng)的block的信息;
2./ 的block記錄的是該目錄下所有的文件名稱與之inode的對(duì)應(yīng)關(guān)系,在block中找到etc/與之對(duì)應(yīng)的inode號(hào)13431327,則再去找13431327 ?inode號(hào)碼;
3.Etc/的inode號(hào)找到并且讀取數(shù)據(jù)內(nèi)容 讀取權(quán)限為(rwx),即可讀取到block指向數(shù)據(jù),程序執(zhí)行者再去讀取block的數(shù)據(jù)內(nèi)容;讀取到passwd對(duì)應(yīng)的inode號(hào)碼為136822215,進(jìn)而 去查找136822215 inode表;
4.passwd的inode號(hào)136822215,讀取inode表中的數(shù)據(jù),由于是管理員,有足夠的權(quán)限可以繼續(xù)訪問,進(jìn)而讀取到block的指向,我們讀取block的數(shù)據(jù)內(nèi)容,即可讀取出passwd的內(nèi)容。
以上只是一個(gè)大概的過程,雖然不是很精確,但還是有助于我們理解ext的文件系統(tǒng),又上述的理論只是我們可以做做一下總結(jié):
1.ext文件系統(tǒng)為什么當(dāng)個(gè)分區(qū)有分區(qū)大小限制,是由于本身的inode表大小有限,存儲(chǔ)的block指向是有數(shù)量上限的;
2.ext文件系統(tǒng)中,刪除數(shù)據(jù),其實(shí)只是在inode表中清除block指向指針,在相應(yīng)的block bitmap中標(biāo)記該block為未使用狀態(tài),等到下次有數(shù)據(jù)需要存儲(chǔ)的時(shí)候,把數(shù)據(jù)填充至編輯為未使用的block地方;
3.一個(gè)Ext文件系統(tǒng)中inode號(hào)是唯一的,
4.Ext文件系統(tǒng)查找實(shí)際查找數(shù)據(jù)是以inode號(hào)為準(zhǔn),inode表中不記錄文件名,但是會(huì)記錄block的指向,block中記錄實(shí)際的數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的linux文件系统只有几k,关于Linux文件系统的的简单理解和认识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言中,整型函数若在调用时未获得ret
- 下一篇: linux eclipse设置颜色,Li