Linux的文件系統(tǒng)

壹、indoe與block

1、inode與block概述

  • 文件數(shù)據(jù)包括元信息與實(shí)際數(shù)據(jù)
  • 文件存儲(chǔ)在硬盤上,硬盤最小存儲(chǔ)單位是“扇區(qū)”,每個(gè)扇區(qū)存儲(chǔ)512字節(jié)

block (塊)

  • 連續(xù)的八個(gè)扇區(qū)組成一個(gè)block(4K)
  • 文件存取的最小單位

inode (索引節(jié)點(diǎn))

  • 中文譯名為“索引節(jié)點(diǎn)”,也叫i節(jié)點(diǎn)
  • 用于存儲(chǔ)文件元信息

//一個(gè)文件必須占用一個(gè)inode,且至少占用一個(gè)block

2、總結(jié):

文件是存儲(chǔ)在硬盤上的,硬盤的最小存儲(chǔ)單位叫做“扇區(qū)”(sector) ,每個(gè)扇區(qū)存儲(chǔ)512字節(jié)。
一般連續(xù)八個(gè)扇區(qū)組成一個(gè)"塊”(block) ,一個(gè)塊是4K大小,是文件存取的最小單位。操作系統(tǒng)讀取硬盤的時(shí)候,是一次性連續(xù)讀取多個(gè)扇區(qū),即一個(gè)塊一個(gè)塊的讀取的。
文件數(shù)據(jù)包括實(shí)際數(shù)據(jù)與元信息(類似文件屬性)。文件數(shù)據(jù)存儲(chǔ)在“塊"中,存儲(chǔ)文件元信息(比如文件的創(chuàng)建者、創(chuàng)建日期、文件大小、文件權(quán)限等)的區(qū)域就叫做inode因此,一個(gè)文件必須占用一個(gè)inode, 并且至少占用一個(gè)block

inode不包含文件名。文件名是存放在目錄當(dāng)中的。Linux系統(tǒng)中一切皆文件,因此目錄也是一種文件。
每個(gè)inode都有一個(gè)號(hào)碼,操作系統(tǒng)用inode號(hào)碼來識(shí)別不同的文件。Linux系統(tǒng)內(nèi)部不使用文件名,而使用inode號(hào)碼來識(shí)別文件。對(duì)于系統(tǒng)來說,文件名只是inode號(hào)碼便于識(shí)別的別稱,文件名和inode號(hào)碼是一一對(duì)應(yīng)關(guān)系, 每個(gè)inode號(hào)碼對(duì)應(yīng)一個(gè)文件名。
所以,當(dāng)用戶在Linux系統(tǒng)中試圖訪問一個(gè)文件時(shí),系統(tǒng)會(huì)先根據(jù)文件名去查找它對(duì)應(yīng)的inode號(hào)碼;通過inode號(hào)碼, 獲取inode信息;根據(jù)inode信息,看該用戶是否具有訪問這個(gè)文件的權(quán)限;如果有,就指向相對(duì)應(yīng)的數(shù)據(jù)block,并讀取數(shù)據(jù)。

貳、inode的內(nèi)容

1、inode包含文件的元信息

  • 文件的字節(jié)數(shù)
  • 文件擁有者的User ID(不包含文件名)
  • 文件的Group ID
  • 文件的讀、寫、執(zhí)行權(quán)限
  • 文件的時(shí)間戳
  • ... ...

2、Linux系統(tǒng)文件三個(gè)主要的時(shí)間屬性

  • ctime(change time)
    • 最后一次改變文件或目錄(屬性)的時(shí)間

當(dāng)修改文件的權(quán)限或者屬性的時(shí)候,就會(huì)更新這個(gè)時(shí)間,ctime并不是create time,更像是change time,只有當(dāng)更新文件的屬性或者權(quán)限的時(shí)候才會(huì)更新這個(gè)時(shí)間,但是更改內(nèi)容的話是不會(huì)更新這個(gè)時(shí)間。

  • atime(access time)
    • 最后一次訪問文件或目錄的時(shí)間

當(dāng)使用這個(gè)文件的時(shí)候就會(huì)更新這個(gè)時(shí)間。

  • mtime(modify time)
    • 最后一次修改文件或目錄(內(nèi)容)的時(shí)間

當(dāng)修改文件的內(nèi)容數(shù)據(jù)的時(shí)候,就會(huì)更新這個(gè)時(shí)間,而更改權(quán)限或者屬性,mtime不會(huì)改變,這就是和ctime的區(qū)別。

3、目錄文件的結(jié)果

  • 目錄也是一種文件
  • 目錄文件的結(jié)構(gòu):每一行稱為一個(gè)目錄項(xiàng)
文件名1inode號(hào)碼1
文件名2inode號(hào)碼2
... ...... ...
  • 每一個(gè)iode都要一個(gè)號(hào)碼,操作系統(tǒng)用inode號(hào)碼來識(shí)別不同文件

  • Linux系統(tǒng)內(nèi)部不使用文件名,而使用inode號(hào)碼來識(shí)別文件
  • 對(duì)于用戶,文件名只是inode號(hào)碼便于識(shí)別的別稱

4、inode的號(hào)碼

用戶通過文件名打開文件時(shí),系統(tǒng)內(nèi)部的過程
1、系統(tǒng)找到這個(gè)文件名對(duì)應(yīng)的inode號(hào)碼
2、通過inode號(hào)碼,獲取inode信息
3、根據(jù)inode信息,找到文件數(shù)據(jù)所在的block,讀出數(shù)據(jù)

5、查看inode號(hào)碼的方法

  • ls -i命令:查看文件對(duì)應(yīng)的inode號(hào)碼
ls -i 文件名
  • stat命令:查看文件inode信息中的inode號(hào)碼
stat 文件名

叁、文件存儲(chǔ)小結(jié)

1、硬盤分區(qū)后的結(jié)構(gòu)

2、訪問文件的簡(jiǎn)單流程

肆、inode的大小

  • inode也會(huì)消耗硬盤空間

    • 每個(gè)inode的大小
    • 驗(yàn)是128字節(jié)或256字節(jié)
  • 格式化文件系統(tǒng)時(shí)確定inode的總數(shù)
  • 使用df -i命令可以查看每個(gè)硬盤分區(qū)的inode總數(shù)和已經(jīng)使用的數(shù)量

小結(jié):

inode也會(huì)消耗硬盤空間,所以格式化的時(shí)候,操作系統(tǒng)自動(dòng)將硬盤分成兩個(gè)區(qū)域

數(shù)據(jù)區(qū):存放文件數(shù)據(jù)

inode區(qū):存放inode所包含的信息

每個(gè)inode的大小一般是128字節(jié)或256個(gè)字節(jié)

通常情況下不需要關(guān)注單個(gè)inode大小,而是需要重點(diǎn)關(guān)注inode總數(shù)。inode的總數(shù)在格式化時(shí)就給定了,執(zhí)行"df -i"命令即可查看每個(gè)硬盤分區(qū)對(duì)應(yīng)的inode總數(shù)和已經(jīng)使用的inode數(shù)量


1、inode的特殊作用

  • 由于 inode 號(hào)碼與文件名分離,導(dǎo)致Unix/Linux系統(tǒng)具備以下幾種特有的現(xiàn)象:
    1.當(dāng)文件名包含特殊字符,可能無法正常刪除。這時(shí)直接刪除inode,能夠起到刪除文件的作用
    2.移動(dòng)文件或重命名文件,只是改變文件名,不影響inode號(hào)碼
    3.打開一個(gè)文件以后,系統(tǒng)就以inode號(hào)碼來識(shí)別這個(gè)文件,不再考慮文件名
    4.使用vi編輯器修改文件數(shù)據(jù)被修改保存后,會(huì)生成一個(gè)新的inode號(hào)碼
找到并且刪除inode號(hào):find ./ -inum inode號(hào) -exec rm -i {} /;find ./ -inum inode號(hào) -delete

伍、硬鏈接與軟鏈接

  • [ ] 為文件或目錄建立鏈接文件
  • [ ] 鏈接文件分類
軟鏈接(符號(hào)鏈接)硬鏈接
刪除原始文件后失效仍舊可用
適用范圍適用于文件或目錄只可用于文件
保存位置原始文件可以位于不同的文件系統(tǒng)中必須與原始文件在同一個(gè)文件系統(tǒng)(如一個(gè)Linux)
  • 硬鏈接
ln 源文件 目標(biāo)位置
  • 軟鏈接
ln -s 源文件或目錄 鏈接文件或目標(biāo)位置

陸、恢復(fù)誤刪除的文件

案例1:inode節(jié)點(diǎn)耗盡故障處理

①使用fdisk創(chuàng)建分區(qū)/dev/sdb1,分區(qū)大小30M即可

②格式化并且掛載,查看inode號(hào)的使用情況

③模擬inode節(jié)點(diǎn)耗盡故障

④恢復(fù)節(jié)點(diǎn)數(shù)


案例2:恢復(fù)EXT類型的文件

  • [ ] 編譯安裝extundelete軟件包

wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2

  • 安裝依賴包
    • e2fsprogs-libs-1.41.12-18.el6.x86_ 64.rpm
    • e2fsprogs-devel-1. 41.12-18.el6.x86_ 64.rpm
  • 配置、編譯及安裝

    • extundelete-0.2.4.tar.bz2
  • 指定安裝地址:
    • . /configure --prefix=/usr/local/extundelete 66 && make && make install

模擬刪除并執(zhí)行恢復(fù)操作:

①首先將原本的磁盤解掛重新格式化成ext3格式

②安裝extundelete前先安裝環(huán)境依賴包,然后安裝extundelete軟件

③掛載目錄內(nèi)創(chuàng)建文件,并賦予內(nèi)容,然后查看inode號(hào)

④刪除創(chuàng)建的新文件,并且解掛載模擬數(shù)據(jù)丟失

⑤模擬數(shù)據(jù)丟失后進(jìn)行恢復(fù)操作


案例3:恢復(fù)XFS類型的文件

  • [ ] xfsdump命令格式
xfsdump -f 備份存放位置 要備份的路徑或設(shè)備文件
  • [ ] xfsdump備份級(jí)別

  • 0:完全備份(默認(rèn)為0)
  • 1-9:增量備份

  • [ ] xfsdump常用選項(xiàng)
常用選項(xiàng)介紹
-f指定備份文件目錄
-L指定標(biāo)簽 session label
-M指定設(shè)備標(biāo)簽 media label
-s備份單個(gè)文件,-s 后面不能直接跟路徑
  • [ ] xfsdump使用限制:
  1. 只能備份已掛載的文件系統(tǒng)
  2. 必須使用root的權(quán)限才能操作
  3. 只能備份XFS文件系統(tǒng)
  4. 備份后的數(shù)據(jù)只能讓xfssrestore解析
  5. 不能備份兩個(gè)具有相同UUID的文件系統(tǒng)(可用 blkid命令查看)

模擬刪除并執(zhí)行恢復(fù)操作:

①創(chuàng)建新磁盤分區(qū)

②格式化分區(qū),掛載后復(fù)制實(shí)驗(yàn)內(nèi)容到掛載目錄,創(chuàng)建目錄和子文件

③安裝xfsdump軟件

④備份整個(gè)分區(qū)然后查看

⑤模擬故障,并進(jìn)行恢復(fù)