Lunix磁盤與文件系統管理

目錄

 

1 認識Lunix文件系統

1.1 文件系統特性

1.2 Lunix的Ext2文件系統

1.2.1 data block (資料區塊)

1.2.2  inode table (inode 表格) 

1.2.3 Superblock (超級區塊)

1.2.4 Filesystem Description (文件系統描述說明)

1.2.5 block bitmap (區塊對照表)

1.2.6 inode bitmap (inode 對照表)

1.2.7 dumpe2fs: 查詢 Ext 家族 superblock 信息的指令

1.3 與目錄樹的關係

1.4 EXT2/EXT3/EXT4 文件的存取與日誌式文件系統的功能

1.5 XFS文件系統查看描述命令 xfs_info

1.6 查看文件系統和掛載點df和評估容量du

1.7 磁盤的分區、格式化、檢驗與掛載

1.7.1 查詢磁盤信息lsblk

1.7.2 blkid列出裝置的UUID

1.7.3 查詢磁盤的分區表類型和分區信息

1.7.4 使用gdisk/fdisk進行分區

1.7.5 用 gdisk 新增分區槽

1.7.6 格式化新建的分區建立文件系統

1.7.8 文件系統檢驗 xfs_repair 

1.7.9 文件系統掛載與卸除

1.7.10 開機自動掛載

1.8 文件系統的特殊觀察與操作

1.8.1 查看容量浪費問題

1.8.2 利用 GNU 的 parted 進行分區行爲


1 認識Lunix文件系統

1.1 文件系統特性

磁盤分區完畢後還需要進行格式化(format),之後操作系統才能夠使用這個文件系統。這是因爲每種操作系統所設定的文件屬性/權限並不相同, 爲了存放這些文件所需的數據,因此就需要將分區槽進行格式化,以成爲操作系統能夠利用的文件系統格式。

Linux 的正統文件系統則爲 Ext2 (Linux second extended file system, ext2fs),通常我們可以稱呼一個可被掛載的數據爲一個文件系統。

文件除了內容之外,還具有許多的屬性。文件系統通常會將這兩部份的數據分別存放在不同的區塊,權限與屬性放置到
inode 中,至於實際數據則放置到 data block 區塊中。另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的整體信息,包括 inode 與 block 的總量、使用量、剩餘量等。

如果能夠找到文件的 inode 的話,那麼自然就會知道這個文件所放置數據的 block 號碼。

 

1.2 Lunix的Ext2文件系統

我們知道 filesystem 裏面可能含有的 inode/block/superblock 等。而標準的 Linux 文件系統 Ext2 就是使用這種 inode 爲基礎的文件系統!爲方便管理,Ext2 文件系統在格式化的時候基本上是區分爲多個區塊羣組 (block group) 的,每個區塊羣組都有獨立的 inode/block/superblock 系統。

1.2.1 data block (資料區塊)

data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及4K 三種而已。在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄。

其他限制

1.2.2  inode table (inode 表格) 

inode 記錄的文件數據包括:

該文件的存取模式(read/write/excute);

該文件的擁有者與羣組(owner/group);

該文件的容量;

該文件建立或狀態改變的時間(ctime);

最近一次的讀取時間(atime);

最近修改的時間(mtime);

定義文件特性的旗標(flag),如 SetUID...;

該文件真正內容的指向 (pointer);

inode 其他特點:

每個 inode 大小均固定爲 128 bytes (新的 ext4 與 xfs 可設定到 256 bytes);

每個文件都僅會佔用一個 inode 而已;

承上,因此文件系統能夠建立的文件數量與 inode 的數量有關;

系統讀取文件時需要先找到 inode,並分析 inode 所記錄的權限與用戶是否符合,若符合才能夠開始實際
讀取 block 的內容。

1.2.3 Superblock (超級區塊)

Superblock 是記錄整個 filesystem 相關信息的地方,沒有 Superblock ,就沒有這個 filesystem ,記錄的信息包括:

block 與 inode 的總量;

未使用與已使用的 inode / block 數量;

block 與 inode 的大小 (block 爲 1, 2, 4K,inode 爲 128bytes 或 256bytes);

filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等文件系統的相關信
息;

 一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 爲 0 ,若未被掛載,則 valid bit 爲 1 。

1.2.4 Filesystem Description (文件系統描述說明)

這個區段可以描述每個 block group 的開始與結束的 block 號碼,以及說明每個區段 (superblock, bitmap, inodemap, data block) 分別介於哪一個 block 號碼之間。

1.2.5 block bitmap (區塊對照表)

block bitmap 記錄使用與未使用的 block 號碼。

1.2.6 inode bitmap (inode 對照表)

 inode bitmap 記錄使用與未使用的 inode 號碼。

1.2.7 dumpe2fs: 查詢 Ext 家族 superblock 信息的指令

dumpe2fs  [options]  裝置文件名

blkid <==這個指令可以叫出目前系統有被格式化的裝置

選項與參數:

-b :列出保留爲壞軌的部分

-h :僅列出 superblock 的數據,不會列出其他的區段內容!

1.3 與目錄樹的關係

文件系統會分配一個 inode 與至少一塊 block 給該目錄。其中,inode 記錄該目錄的相關權限與屬性,並可記錄分配到的那塊 block 號碼; 而 block 則是記錄在這個目錄下的文件名與該文件名佔用的 inode 號碼數據。

想要實際觀察 root 家目錄內的文件所佔用的 inode 號碼時,可以使用 ls -i 這個選項來處理:

由於目錄樹是由根目錄開始讀起,因此係統透過掛載的信息可以找到掛載點的 inode 號碼,此時就能夠得到根目錄的 inode 內容,並依據該 inode 讀取根目錄的 block 內的文件名數據,再一層一層的往下讀到正確的檔名。 

1.4 EXT2/EXT3/EXT4 文件的存取與日誌式文件系統的功能

上一小節談到的僅是讀取而已,那麼如果是新建一個文件或目錄時,我們的文件系統是如何處理的呢?這個時候就得要 block bitmap 及 inode bitmap 的幫忙了!假設我們想要新增一個文件,此時文件系統的行爲是:

1. 先確定用戶對於欲新增文件的目錄是否具有 w 與 x 的權限,若有的話才能新增;

2. 根據 inode bitmap 找到沒有使用的 inode 號碼,並將新文件的權限/屬性寫入;

3. 根據 block bitmap 找到沒有使用中的 block 號碼,並將實際的數據寫入 block 中,且更新 inode 的 bloc指向數據;

4. 將剛剛寫入的 inode 與 block 數據同步更新 inode bitmap 與 block bitmap,並更新 superblock 的內容;

數據的不一致 (Inconsistent) 狀態

在文件在寫入文件系統時,因爲不知名原因導致系統中斷(,所以寫入的數據僅有 inode table 及 data block 而已, 最後一個同步更新中介數據的步驟並沒有做完,此時就會發生 metadata 的內容與實際數據存放區產生不一致(Inconsistent) 的情況。

日誌式文件系統

爲避免數據不一致狀態。日誌式文件系統設計的基本功能:在filesystem 當中規劃出一個區塊,該區塊專門在記錄寫入或修訂文件時的步驟。

1.5 XFS文件系統查看描述命令 xfs_info

像 EXT 家族的 dumpe2fs 指令去觀察 superblock 內容一樣,xfs文件系統可以使用xfs_info 命令去觀察!

1.6 查看文件系統和掛載點df和評估容量du

df [options]  目錄或文件名

選項與參數:

-a :列出所有的文件系統,包括系統特有的 /proc 等文件系統;

-k :以 KBytes 的容量顯示各文件系統;

-m :以 MBytes 的容量顯示各文件系統;

-h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示;

-H :以 M=1000K 取代 M=1024K 的進位方式;

-T :連同該 partition 的 filesystem 名稱 (例如 xfs) 也列出;

-i :不用磁盤容量,而以 inode 的數量來顯示

du [options]  目錄或文件名

輸出的數值數據爲 1K 大小的容量單位

選項與參數:

-a :列出所有的文件與目錄容量,因爲默認僅統計目錄底下的文件量而已。

-h :以人們較易讀的容量格式 (G/M) 顯示;

-s :列出總量而已,而不列出每個各別的目錄佔用容量;

-S :不包括子目錄下的總計,與 -s 有點差別。

-k :以 KBytes 列出容量顯示;

-m :以 MBytes 列出容量顯示

1.7 磁盤的分區、格式化、檢驗與掛載

如果我們想要在系統裏面新增一顆磁盤時,應該有哪些動作需要做的呢:

1. 對磁盤進行分區,以建立可用的 partition ;

2. 對該 partition 進行格式化 (format),以建立系統可用的 filesystem;

3. 若想要仔細一點,則可對剛剛建立好的 filesystem 進行檢驗;

4. 在 Linux 系統上,需要建立掛載點 (亦即是目錄),並將他掛載上來;

1.7.1 查詢磁盤信息lsblk

爲了給磁盤分區,首先要知道磁盤是MBR 還是 GPT 格式的,用以決定採用 fdisk 或者是 gdisk 來處理分區。

lsblk [options]  [device]

選項與參數:

-d :僅列出磁盤本身,並不會列出該磁盤的分區數據

-f :同時列出該磁盤內的文件系統名稱

-i :使用 ASCII 的線段輸出,不要使用複雜的編碼 (再某些環境下很有用)

-m :同時輸出該裝置在 /dev 底下的權限數據 (rwx 的數據)

-p :列出該裝置的完整文件名!而不是僅列出最後的名字而已。

NAME:裝置文件名

MAJ:MIN:其實核心認識的裝置都是透過這兩個代碼來熟悉的!分別是主要:次要裝置代碼!

RM:是否爲可卸除裝置 (removable device),如光盤、USB 磁盤等等

SIZE:容量

RO:是否爲只讀裝置的意思

TYPE:是磁盤 (disk)、分區槽 (partition) 還是隻讀存儲器 (rom) 等輸出

MOUTPOINT:掛載點

-t :列出該磁盤裝置的詳細數據,包括磁盤隊列機制、預讀寫的數據量大小等

1.7.2 blkid列出裝置的UUID

lsblk 可以使用 -f 來列出文件系統與裝置的 UUID 數據,但也可以直接使用 blkid 來找出裝置的 UUID 。

1.7.3 查詢磁盤的分區表類型和分區信息

使用lsblk查詢出磁盤名稱之後,可以使用parted命令查詢磁盤分區類型

1.7.4 使用gdisk/fdisk進行分區

注意:MBR 分區表使用 fdisk 分區, GPT 分區表使用 gdisk 分區。

使用『 p 』可以列出目前這顆磁盤的分區表信息,這個信息的上半部在顯示整體磁盤的狀態。 如上這個磁盤共有 40GB 左右的容量,共有 83886080 個扇區,每個扇區的容量爲512bytes。 要注意的是,現在的分區主要是以扇區爲最小的單位!下半部的分區表信息主要在列出每個分區槽的個別信息項目。每個項目的意義爲:

Number:分區槽編號,1 號指的是 /dev/vda1 這樣計算。

Start (sector):每一個分區槽的開始扇區號碼位置

End (sector):每一個分區的結束扇區號碼位置,與 start 之間可以算出分區槽的總容量

Size:就是分區槽的容量了

Code:在分區槽內的可能的文件系統類型。Linux 爲 8300,swap 爲 8200。不過這個項目只是一個提示而
已,不見得真的代表此分區槽內的文件系統喔!

Name:文件系統的名稱等等

1.7.5 用 gdisk 新增分區槽

更新lunix核心

partprobe -s

查看磁盤分區表

cat   /proc/partitions

1.7.6 格式化新建的分區建立文件系統

『建置文件系統 (make filesystem)』所以使用的指令是 mkfs !而我們要建立的其實是 xfs 文件系統, 因此使用的是 mkfs.xfs 這個指令。

mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \  [-r parms] 裝置名稱

1.7.8 文件系統檢驗 xfs_repair 

當有 xfs 文件系統錯亂才需要使用這個指令!所以,這個指令最好是不要用到啦!但有問題發生時,這個指令卻又很重要。

xfs_repair [options]  裝置名稱

選項與參數:

-f :後面的裝置其實是個文件而不是實體裝置

-n :單純檢查並不修改文件系統的任何數據 (檢查而已)

-d :通常用在單人維護模式底下,針對根目錄 (/) 進行檢查與修復的動作!很危險!不要隨便使用

1.7.9 文件系統掛載與卸除

掛載的先決條件:

單一文件系統不應該被重複掛載在不同的掛載點(目錄)中;

單一目錄不應該重複掛載多個文件系統;

要作爲掛載點的目錄,理論上應該都是空目錄纔是。

提示:掛載了文件系統之後,原目錄下的東西就會暫時的消失

示例

umount 將裝置文件卸除 

1.7.10 開機自動掛載

若想要開機掛載,那就直接到 /etc/fstab 裏面去修修就行。

1.8 文件系統的特殊觀察與操作

1.8.1 查看容量浪費問題

使用 ls -l 去查詢某個目錄下的數據時,第一行都會出現一個『total』的字樣!指的是該目錄下的所有數據所耗用的實際 block 數量 * block 大小的值。

從上面的特殊字體部分,那就是每個文件所使用掉 block 的容量!舉例來說,那個 crontab 雖然僅有 451bytes , 不過他卻佔用了整個 block (每個 block 爲 4K),所以將所有的文件的所有的 block 加總就得到 12Kbytes 那個數值了。 如果計算每個文件實際容量的加總結果,其實只有不到 5K ,這樣就耗費掉好多容量了。

1.8.2 利用 GNU 的 parted 進行分區行爲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章