檔案系統的管理與檔案管理不太一樣喔!是在底層進行分割、格式化的動作~還有開機過程出問題要如何處理!?來瞧瞧看看!
系統總有磁碟容量不足,或者是需要其他檔案系統掛載的時刻,畢竟使用者可能非常多,使用者也可能大量使用到系統提供的磁碟容量等。 因此,管理檔案系統就是管理員一個很重要的任務。Linux 檔案系統最早使用 Ext2 檔案系統家族(包括 EXT2/EXT3/EXT4 等等), 但由於磁碟容量越來大,因此適合大容量的 XFS 檔案系統在 RockyLinux 9 被設為預設檔案系統了。因此讀者應該要熟悉這些檔案系統的管理才行。
目前 RockyLinux 9 檔案系統主要支援 EXT2 家族 (目前新版為 EXT4) 以及 XFS 大型檔案系統兩種。其中 XFS 相當適合大容量磁碟, 格式化的效能非常快。但無論哪種檔案系統,都必須要符合 inode 與 block 等檔案系統使用的特性。
磁碟內的圓形磁碟盤常見的物理特性如下:
整顆磁碟必須要經過分割之後,Linux 作業系統才能夠讀取分割槽內的檔案系統。目前的 Linux 磁碟分割主要有兩種分割, 分別為早期的 MSDOS 與現今的 GPT。由於 MSDOS 分割在開機時會有 2TB 容量的限制,但目前的磁碟容量已經都超過 2TB 來到 8TB 以上的等級, 因此 MSDOS 的分割類型就不太適用了。此外,目前新主機系統大概都使用 uefi 管理主機板韌體,這個 uefi 經常僅支援 GPT 分割! 所以,如果不考慮相容性,讀者們目前可以只學 GPT 磁碟分割表即可!
磁碟檔名主要為 /dev/sd[a-p] 這種實體磁碟的檔名,以及透過 virtio 模組加速的 /dev/vd[a-p] 的虛擬磁碟檔名。 另外,如果使用了軟體磁碟陣列,或者是 Intel 主機板上面內建的磁碟陣列時,磁碟檔名則會增加類似 /dev/md126 這類的名稱。 由於虛擬機器的環境中,很多虛擬機器還是使用傳統 BIOS 引導開機流程,而且作業系統所在的磁碟容量也低於 2T 的條件, 所以,雖然主流是 GPT,但是我們還是稍微理解一下傳統的 MSDOS 分割,會比較好喔!
由於技術的成熟,近年來 SSD 或 M2 插槽的固態硬碟已經使用的越來越廣泛,而這些固態硬碟並沒有所謂的磁頭、磁柱與磁軌,因此, 分割工具漸漸則以磁區 (sector) 為單位去進行分割的行為了!這樣對於傳統磁碟或固態硬碟來說,就會顯的一致!
如前所示,由於 MSDOS 分割表的紀錄區塊僅有 64 bytes 用在分割表,因此預設分割表僅能紀錄四筆分割資訊。 所謂的分割資訊即是紀錄開始與結束的磁區。這四筆紀錄主要為『主要分割槽 (primary)』與『延伸分割槽 (extended)』。延伸分割不能被格式化應用, 需要再從延伸分割當中割出『邏輯分割 (logical)』之後,才能夠應用。以 P 代表主要、E 代表延伸、L 代表邏輯分割槽,則相關性為:
常見的磁碟磁區有 512bytes 與 4K 容量,為了相容於所有的磁碟,因此在磁區的定義上面, 大多會使用所謂的邏輯區塊位址(Logical Block Address, LBA)來處理。GPT 將磁碟所有區塊以此 LBA(預設為 512bytes) 來規劃,而第一個 LBA 稱為 LBA0 (從 0 開始編號)。
與 MSDOS 僅使用整顆磁碟的第一個 512bytes 區塊來紀錄不同, GPT 則使用了 34 個 LBA 區塊來紀錄分割資訊! 同時與過去 MSDOS 僅有一個區塊的情況不同, GPT 除了前面 34 個 LBA 之外,整個磁碟的最後 33 個 LBA 也拿來作為另一個備份! 因此,如果磁碟前面的分割紀錄不小心被惡搞而失去,可以透過分割工具,以磁碟最後方的磁區記載的分割表來復原, 對於資訊安全來說,也是相當重要的保護!
LBA2 ~ LBA33 為實際紀錄分割表的所在,每個 LBA 紀錄 4 筆資料,所以共可紀錄 32*4=128 筆以上的分割資訊。 因為每個 LBA 為 512bytes,因此每筆紀錄可佔用 512/4=128 bytes 的紀錄,因為每筆紀錄主要紀錄開始與結束兩個磁區的位置, 因此紀錄的磁區位置最多可達 64 位元,若每個磁區容量為 512bytes ,則單一分割槽的最大容量就可以限制到 8ZB, 其中 1ZB 為 2^30 TB。
此外,每筆 GPT 的分割紀錄,都是屬於 primary 的分割紀錄,可以直接拿來進行格式化應用的。
新的作業系統在規劃檔案系統時,一般檔案會有屬性(如權限、時間、身份資料紀錄等)以及實際資料的紀錄, 同時整個檔案系統會紀錄全部的資訊,因此通常檔案系統會有如下幾個部份:
以 EXT2 檔案系統為例,為了簡化管理,整個檔案系統會將全部的內容分出數個區塊群組 (block group), 每個區塊群組會有上述的 superblock/inode/block 的紀錄,可以下圖示意:
superblock 為整個檔案系統的總結資訊處,要讀取檔案系統一定要從 superblock 讀起。superblock 主要紀錄資料為:
每一個 inode 都有號碼,而 inode 的內容在記錄檔案的屬性以及該檔案實際資料是放置在哪幾號 block 內。 inode 記錄的檔案資料至少有底下這些:
由於每個檔案固定會佔用一個 inode,而目前檔案所記載的屬性資料越來約多,因此 inode 有底下幾個特色:
檔案實際的資料存放在 data block 上面,每個 block 也都會有號碼,提供給檔案來儲存實際資料,也讓 inode 可以紀錄資料放在哪個 block 號碼內。
一般來說,檔案系統內的一個檔案被讀取時,流程是這樣的:
至於新建檔案的流程則是這樣的:
至於刪除檔案的流程則是這樣的:
當使用者在 Linux 下的檔案系統建立一個目錄時,檔案系統會分配一個 inode 與至少一塊 block 給該目錄。其中,inode 記錄該目錄的相關權限與屬性,並可記錄分配到的那塊 block 號碼; 而 block 則是記錄在這個目錄下的檔名與該檔名佔用的 inode 號碼資料。也就是說目錄所佔用的 block 內容在記錄如下的資訊:
前一小節提到讀取檔案資料時,最重要的就是讀到檔案的 inode 號碼。然而讀者實際操作系統時,並不會理會 inode 號碼, 而是透過『檔名』來讀寫資料的。因此,目錄的重要性就是記載檔名與該檔名對應的 inode 號碼。
從前一小節的練習當中讀者可以發現到目錄的預設連結數 (使用 ls -l 觀察檔名的第二個欄位) 為 2, 這是因為每個目錄底下都有 . 這個檔名,而這個檔名代表目錄本身,因此目錄本身有兩個檔名連結到同一個 inode 號碼上, 故連結數至少為 2 。又同時每個目錄內都有 .. 這個檔名來代表父目錄,因此每增加一個子目錄,父目錄的連結數也會加 1 。
由於連結數增加後,若檔名刪除時,其實 inode 號碼並沒有被刪除,因此這個『實體連結』的功能會保護好原本的檔案資料。 使用者可以透過 ln 這個指令來達成實體連結與符號連結 (類似捷徑) 的功能。
就像隨身碟放入 windows 作業系統後,需要取得一個 H:\> 或者是其他的磁碟名稱後才能夠被讀取一樣, Linux 底下的目錄樹系統中,檔案系統裝置要能夠被讀取,就得要與目錄樹的某個目錄連結在一起,亦即進入該目錄即可看到該裝置的內容之意。 該目錄就被稱為掛載點。
觀察掛載點的方式最簡單為使用 df (display filesystem) 這個指令來觀察,而讀者也可以透過觀察 inode 的號碼來了解到掛載點的 inode 號碼。
一般來說,建立檔案系統需要的動作包括:分割、格式化與掛載三個步驟。而分割又有 MBR 與 GPT 兩種方式,實做時需要特別留意。
建立分割之前,需要先判斷:(1)目前系統內的磁碟檔名與(2)磁碟目前的分割格式。這兩個工作可以使用底下的指令完成:
過去 RHEL 7 以前的年代,不同的分割表,要用不同的軟體來進行分割~也就是 GPT 分割表要用 gdisk 指令處理, MSDOS 分割表要用 fdisk 處理。不過,從 RHEL 8 以後,fdisk 也支援 GPT 了!所以大家就不用學新的指令, 都使用 fdisk 來處理即可~底下就先來學習怎麼使用 fdisk 了!(當然,你想要學 gdisk 也沒問題!只是, 兩個指令其實差異不大啦!)
[root@study ~]# fdisk /dev/vda Welcome to fdisk (util-linux 2.37.4). Changes will remain in memory only, until you decide to write them. <==說明只是在記憶體中處理 Be careful before using the write command. This disk is currently in use - repartitioning is probably a bad idea. <==磁碟使用中,也只是警告而已! It's recommended to umount all file systems, and swapoff all swap partitions on this disk. Command (m for help): <==這裡可以讓你輸入指令動作,可以按 m 來查看可用指令 Command (m for help): m Help: GPT M enter protective/hybrid MBR Generic d delete a partition # 刪除一個分割 F list free unpartitioned space l list known partition types n add a new partition # 增加一個分割 p print the partition table # 印出分割表 t change a partition type v verify the partition table i print information about a partition Misc m print this menu x extra functionality (experts only) Script I load disk layout from sfdisk script file O dump disk layout to sfdisk script file Save & Exit w write table to disk and exit # 儲存分割操作後,離開 fdisk q quit without saving changes # 不儲存離開,保留原有分割 Create a new label g create a new empty GPT partition table G create a new empty SGI (IRIX) partition table o create a new empty DOS partition table s create a new empty Sun partition table Command (m for help):
之後開始列出目前這個 /dev/vda 的整體磁碟資訊與分割表資訊:
Command (m for help): p <== 這裡可以輸出目前磁碟的狀態 Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 sectors # 磁碟檔名/磁區數與總容量 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes # 單一磁區大小為 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt # 分割表就是 GPT Disk identifier: 6CD584BC-1B5D-493B-9E48-1429460E793C # 磁碟的 GPT 識別碼 Device Start End Sectors Size Type # 底下為完整的分割資訊了! /dev/vda1 2048 6143 4096 2M BIOS boot # 第一個分割槽資料 /dev/vda2 6144 4200447 4194304 2G Linux filesystem /dev/vda3 4200448 46151679 41951232 20G Linux LVM #分割編號 開始磁區 結束磁區 磁區總數 容量 類型說明 Command (m for help): q # 想要不儲存離開嗎?按下 q 就對了!不要隨便按 w 啊!
接下來請管理員直接建立一個 1GB 的分割槽。
一般來說,使用剩餘容量或者是全新的磁碟進行分割時,fdisk 寫入的結果就立刻生效!不需要重新讓核心去抓取分割表。 不過要確認分割的正確性,建議還是使用『 lsblk 』或者是『 cat /proc/partitions 』檢查一下比較好!
檔案系統的建立使用 mkfs (make filesystem) 即可處理。另外,記憶體置換應該要使用 mkswap 才對。目前的作業系統大多已經針對檔案系統建置時做好最佳化設置, 因此除非讀者有特殊需求,或者是讀者知道自己高階磁碟陣列的相關參數,否則使用預設值應該就能夠取得不錯的檔案系統效能。
每個磁碟分割槽的檔案系統,都有其各自的識別碼,這個識別碼應該是獨一無二的,建議同學們要認識 UUID 而不要只是記憶磁碟分割槽的檔名, 這是因為未來要進行掛載時,磁碟的檔名是可能會改變的,但是 UUID 則不會改變!所以,掛載使用時,還是使用 UUID 比較好!
檔案系統要掛載時,請先注意到底下的要求:
常見的掛載方式如下:
[root@localhost ~]# mount -a [root@localhost ~]# mount [-l] [root@localhost ~]# mount [-t 檔案系統] LABEL='' 掛載點 [root@localhost ~]# mount [-t 檔案系統] UUID='' 掛載點 # 建議用這種方式 [root@localhost ~]# mount [-t 檔案系統] 裝置檔名 掛載點 選項與參數: -a :依照設定檔 /etc/fstab 的資料將所有未掛載的磁碟都掛載上來 -l :單純的輸入 mount 會顯示目前掛載的資訊。加上 -l 可增列 Label 名稱! -t :可以加上檔案系統種類來指定欲掛載的類型。常見的 Linux 支援類型有:xfs, ext3, ext4, reiserfs, vfat, iso9660(光碟格式), nfs, cifs, smbfs (後三種為網路檔案系統類型) -n :在預設的情況下,系統會將實際掛載的情況即時寫入 /etc/mtab 中,以利其他程式的運作。 但在某些情況下(例如單人維護模式)為了避免問題會刻意不寫入。此時就得要使用 -n 選項。 -o :後面可以接一些掛載時額外加上的參數!比方說帳號、密碼、讀寫權限等: async, sync: 此檔案系統是否使用同步寫入 (sync) 或非同步 (async) 的記憶體機制 atime,noatime: 是否修訂檔案的讀取時間(atime)。為了效能,某些時刻可使用 noatime ro, rw: 掛載檔案系統成為唯讀(ro) 或可讀寫(rw) auto, noauto: 允許此 filesystem 被以 mount -a 自動掛載(auto) dev, nodev: 是否允許此 filesystem 上,可建立裝置檔案? dev 為可允許 suid, nosuid: 是否允許此 filesystem 含有 suid/sgid 的檔案格式? exec, noexec: 是否允許此 filesystem 上擁有可執行 binary 檔案? user, nouser: 是否允許此 filesystem 讓任何使用者執行 mount ?一般來說, mount 僅有 root 可以進行,但下達 user 參數,則可讓 一般 user 也能夠對此 partition 進行 mount 。 defaults: 預設值為:rw, suid, dev, exec, auto, nouser, and async remount: 重新掛載,這在系統出錯,或重新更新參數時,很有用!
請將 /dev/vda4, /dev/vda5 分別掛載到 /srv/linux, /srv/win 目錄內,同時觀察掛載的情況。
# 先建立需要的掛載點 [root@localhost ~]# mkdir /srv/linux /srv/win # 先以裝置名稱的方式嘗試掛載 xfs 檔案系統 [root@localhost ~]# mount /dev/vda4 /srv/linux # 嘗試以 UUID 的方式掛載 VFAT 檔案系統 [root@localhost ~]# blkid /dev/vda5 /dev/vda5: UUID="348A-3015" TYPE="vfat" PARTUUID="040e1e11-a8ed-4146-854c-9d0eecd7549f" [root@localhost ~]# mount UUID="348A-3015" /srv/win # 嘗試以 df -T 加上掛載點,來查看檔案系統與掛載的關係! [root@localhost ~]# df -T /srv/linux /srv/win Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/vda4 xfs 1038336 40292 998044 4% /srv/linux /dev/vda5 vfat 1569768 4 1569764 1% /srv/win
透過 df -T 可以查詢到整體系統的檔案系統掛載狀態,如果只是想要查閱到某幾個載點的資訊,可以如上所示, 直接將載點放在 df 指令後面即可!這樣畫面也比較乾淨!至於 swap,這個記憶體置換並不是檔案系統, 所以只能用開/關 (on/off) 的方式來加入/移除記憶體置換功能而已!請使用 swapon 的方式來啟動 /dev/vda6 這個記憶體置換空間。
[root@localhost ~]# free total used free shared buff/cache available Mem: 1813456 594716 865740 22000 524152 1218740 Swap: 1048572 0 1048572 [root@localhost ~]# swapon /dev/vda6 [root@localhost ~]# swapon -s Filename Type Size Used Priority /dev/dm-1 partition 1048572 0 -2 /dev/vda6 partition 1048572 0 -3 [root@localhost ~]# free total used free shared buff/cache available Mem: 1813456 594680 865740 22000 524192 1218776 Swap: 2097144 0 2097144
開機自動掛載的參數設定檔寫入在 /etc/fstab 當中,不過在編輯這個檔案之前,管理員應該先知道系統掛載的限制:
訓練機的 /etc/fstab 這個檔案的內容如下:
[root@localhost ~]# cat /etc/fstab
/dev/mapper/rocky-root / xfs defaults 0 0
UUID=b93d23a0-3fdb-44c5-9304-4fbbbf415542 /boot ext4 defaults 1 2
/dev/mapper/rocky-home /home xfs defaults 0 0
/dev/mapper/rocky-swap none swap defaults 0 0
這個檔案主要有六個欄位,每個欄位的意義如下:
[裝置/UUID等] [掛載點] [檔案系統] [檔案系統參數] [dump] [fsck]
參數 | 內容意義 |
async/sync 非同步/同步 |
設定磁碟是否以非同步方式運作!預設為 async(效能較佳)。所謂的非同步,意思是若有變動的檔案資料, 該資料會暫時儲存於記憶體中,而非立刻寫入磁碟之意。 |
auto/noauto 自動/非自動 |
當下達 mount -a 時,此檔案系統是否會被主動測試掛載。預設為 auto。 |
rw/ro 可讀寫/唯讀 |
讓該分割槽以可讀寫或者是唯讀的型態掛載上來,如果你想要分享的資料是不給使用者隨意變更的, 這裡也能夠設定為唯讀。則不論在此檔案系統的檔案是否設定 w 權限,都無法寫入喔! |
exec/noexec 可執行/不可執行 |
限制在此檔案系統內是否可以進行『執行』的工作?如果是純粹用來儲存資料的目錄,
那麼可以設定為 noexec 會比較安全。不過,這個參數也不能隨便使用,因為你不知道該目錄下是否預設會有執行檔。 舉例來說,如果你將 noexec 設定在 /var ,當某些軟體將一些執行檔放置於 /var 下時,那就會產生很大的問題喔! 因此,建議這個 noexec 最多僅設定於你自訂或分享的一般資料目錄。 |
user/nouser 允許/不允許使用者掛載 |
是否允許使用者使用 mount 指令來掛載呢?一般而言,我們當然不希望一般身份的 user 能使用 mount 囉,因為太不安全了,因此這裡應該要設定為 nouser 囉! |
suid/nosuid 具有/不具有 suid 權限 |
該檔案系統是否允許 SUID 的存在?如果不是執行檔放置目錄,也可以設定為 nosuid 來取消這個功能! |
defaults | 同時具有 rw, suid, dev, exec, auto, nouser, async 等參數。 基本上,預設情況使用 defaults 設定即可! |
針對我們訓練機的 /etc/fstab 的內容來說,在第 5, 6 欄位上,除了 /boot 這個 ext4 的檔案系統還有使用之外, 其餘的通通設定為 0 了!基本上,連同 ext4 也都能設定為 0 啦!避免未來改寫資料時,忘記修改這個欄位! 好了,那麼讓我們來處理一下我們的新建的檔案系統,看看能不能開機就掛載呢?
[root@localhost ~]# blkid /dev/vda{4,5,6}
/dev/vda4: UUID="cb3eced9-6b90-401a-9f57-ce0ecf275906" TYPE="xfs" ...
/dev/vda5: UUID="348A-3015" TYPE="vfat" PARTUUID="040e1e11-a8ed-41...
/dev/vda6: UUID="4ed77543-15ac-487e-a817-7303efbd7ca8" TYPE="swap"...
[root@localhost ~]# vim /etc/fstab
UUID="cb3eced9-6b90-401a-9f57-ce0ecf275906" /srv/linux xfs defaults 0 0
UUID="348A-3015" /srv/win vfat defaults 0 0
UUID="4ed77543-15ac-487e-a817-7303efbd7ca8" swap swap defaults 0 0
[root@locahost ~]# mount -a [root@locahost ~]# swapon -a [root@locahost ~]# df -T /dev/vda{4,5} Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/vda4 xfs 1038336 40292 998044 4% /srv/linux /dev/vda5 vfat 1569768 4 1569764 1% /srv/win [root@locahost ~]# swapon -s Filename Type Size Used Priority /dev/dm-1 partition 1048572 0 -2 /dev/vda6 partition 1048572 0 -3
你得要特別注意的是,當上述的裝置或掛載點已經被使用時,那麼你的 /etc/fstab 內關於該裝置或載點的資訊,將不會被測試掛載。 所以,上面的練習中,原有的掛載點,亦即是 /, /home 等,其實不會被重新測掛載的。因此,當你要測試時,請先將要被測試的載點卸載, 這樣才能夠真的測試你的設定是否正確喔!
管理員可能因為某些原因需要將檔案系統回收利用,例如抽換舊硬碟來使用等等,因此讀者仍須學會如何卸載磁碟。 此外,或許因為設定的問題可能導致開機時因為檔案系統的問題而導致無法順利完成開機的流程,此時就需要額外的修復作業。
若需要將檔案系統卸載並回收 (舊的資料需要完整刪除),一般建議的流程如下:
管理員如果修改過 /etc/fstab 卻忘記使用 mount -a 測試,則當設定錯誤,非常有可能會無法順利開機。如果是根目錄設定出錯,問題會比較嚴重, 如果是一般正規目錄設定錯誤,則依據該目錄的重要性,可能會進入單人維護模式或者是依舊可以順利開機。底下的練習中,讀者將實驗讓 /home 設定錯誤, 以嘗試進入單人維護模式救援檔案系統。
[root@localhost ~]# vim /etc/fstab # 先找到這一行: /dev/mapper/rocky-home /home xfs defaults 0 0 # 將上面的資料改成如下的模樣 /dev/mapper/rocky-home1 /home xfs defaults 0 0
老實說,檔案系統設定錯誤是一個很常見的情況,很多時候是因為 /etc/fstab 手滑打錯字產生的問題。所以, 了解怎麼解決問題,對於系統管理員來說,也是一個很重要的訓練!
作業硬碟一般操作說明:
作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /home/student/ans.txt 當中,並寫好正確題號,方便老師訂正答案。 請注意,檔名寫錯將無法上傳!
請使用 root 的身份進行如下實做的任務。直接在系統上面操作,操作成功即可,上傳結果的程式會主動找到你的實做結果。
題號 | 容量 | 檔案系統 | 掛載點 |
A | 2GB | XFS | /data/xfs |
B | 1GB | VFAT | /data/vfat |
C | 1.5GB | EXT4 | /data/ext4 |
D | 1GB | swap | - |
作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用瀏覽器查詢: http://192.168.251.254 檢查相對應的課程檔案。 相關流程請參考: vbird_book_check_unit