文件系統簡介
1.Linux的正統文件系統爲ext2(Linux second Extended file System,ext2fs)
2.一個可被掛載的數據爲一個文件系統(而不是一個硬盤分區)。
傳統磁盤與文件系統中,一個分區只能被格式化爲一個文件系統,所以之前說一個文件系統就是一個硬盤分區。
新的磁盤與LVM中,一個分區可以格式化爲多個文件系統,多個分區也可以合併爲一個文件系統。
3.索引式文件系統
通過索引來找尋文件,與之相反的是,如U盤常使用FAT格式的文件系統。
其中主要包含三種數據:
i)索引是inode,用來存取權限、屬性和數據區塊號(實際數據的地址)。
ii)數據區塊,記錄文件的實際內容,大文件可能佔用多個區塊。
iii)超級區塊,記錄此文件系統的整體信息,包括inode與數據區塊的總量、使用量、剩餘量以及文件系統的格式等等。
Linux的ext2文件系統
文件系統一開始就將inode與數據區塊規劃好,除非重新格式化,否則inode與數據區塊固定不動。
每一個文件系統有多個區塊羣組,在文件系統最前方有一個啓動扇區(Boot sector),便於進行多重引導。
每一個區塊羣組主要有六部分:超級區塊,文件系統描述,區塊對照表,inode對照表,inode table和數據區塊。
數據區塊
用來存放文件數據的地方,ext2文件系統所支持的區塊大小有1K,2K以及4K三種。在格式化的時候固定區塊大小以及編號。
區塊的大小會導致文件系統能夠支持的最大磁盤容量與最大單一文件容量不同。
其他限制:
1.區塊的大小與數量在格式化後不能再修改,除非重新格式化;
2.每個區塊最多隻能存放一個文件的數據;
3.文件大於區塊大小,則一個文件會佔用多個區塊;
4.文件小於區塊則該區塊的剩餘容量就不能夠再使用,從而造成磁盤空間的浪費。
inode table
inode table主要記錄文件的讀寫屬性,擁有者與用戶組,文件大小,建立與狀態改變的時間,最近一次的讀取時間,最近修改的時間,定義文件特性的標識(如SUID,SGID,SBIT),文件真正內容的指向。
1)每個inode大小固定爲128B(ext4與xfs可設置到256B)
2)每個文件佔用一個inode
3)文件系統能建立的文件數量與inode的數量有關
4)系統讀取文件的時候需要先對於inode所記錄的權限與用戶進行分析,若符合才能讀取區塊的內容。
inode記錄區塊號碼的區域定義爲12個直接,1個間接,1個雙間接與一個三間接記錄區。
直接記錄區時直接取得區塊號碼,
間接記錄區是指向一個區塊,這個區塊用來記錄區塊號碼。
雙間接記錄區是指向一個區塊,這個區塊再指向區塊,第二層的區塊纔是用來記載實際的區塊號碼。
三間接同理。
以最小的1K的區塊爲例:
12 個直接指向: 12*1K=12K
由於是直接指向,所以總共可記錄 12 筆記錄,因此總額大小爲如上所示;
間接: 256*1K=256K(這裏的256爲一個間接區塊所能記載的block號碼數,1K爲區塊大小)
每筆 block 號碼的記錄會花去 4bytes,因此 1K 的大小能夠記錄 256 筆記錄,因此一個間接可以記錄的
文件大小如上;
雙間接: 256*256*1K=256 2 K
第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個號碼,因此總額大小如上;
三間接: 256*256*256*1K=256 3 K
第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個第三層,每個第三層可以指定 256 個號
碼,因此總額大小如上;
總額:將直接、間接、雙間接、三間接加總,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB
Superblock(超級區塊)
記錄整個文件系統相關信息的地方。記錄的主要信息:
數據區塊與inode的總量;
未使用和已使用的inode與數據區塊數量;
數據區塊與inode的大小(block爲1、2、4K,inode爲128B或256B);
文件系統的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤的時間(fsck)等文件系統的相關信息;
一個有效爲數值,若此文件系統已經被掛載,則有效位爲0,否則爲1。
除了第一個區塊羣組內含有超級區塊之外,後續的區塊羣組不一定含有超級區塊,若含有超級區塊主要作爲第一個區塊羣組內超級區塊的備份。
文件系統描述
描述每個區塊羣組的開始與結束的區塊,以及說明每個區段分別介於哪一個區塊之間。
區塊對照表
記錄哪些區塊是空的,哪些區塊是已經被使用的。
inode對照表
記錄使用與未被使用的inode號碼
與目錄樹的關係
目錄
文件系統會分配一個inode與一個數據區塊給一個目錄
該inode記錄的是該目錄的相關屬性與權限,以及分配得到的那塊區塊號碼。
該數據區塊記錄的是在這個目錄下的文件名與該文件佔用的inode號碼。
使用ls -li顯示的inode號爲每個文件或目錄對應的inode號碼。
其中顯示的目錄大小都是1024的整數倍;因爲每個區塊的大小都是1K,2K,4K的
文件
目錄樹
文件名的記錄是在目錄的區塊中,所以對文件的增刪改都需要對目錄具有W的權限。
所以只要對目錄具有RWX的權限,即使對目錄中的文件沒有任何權限也可以刪除其中的文件。
對目錄沒有r的權限的時候,不能使用ls和tab補全的功能,但是假若知道其中的文件名是可以直接運行的。
修改Desktop的權限爲-wx
文件系統的簡單操作
列出文件系統的整體磁盤使用量
df [-hTi] 目錄或文件名
-h:以人們較易理解的單位進行顯示
-T:連同硬盤分區的文件系統的名稱都列出來(例如ext4)
-i:不用磁盤容量,而以inode的數量進行顯示。
查看文件系統的磁盤使用量
du [-sS] 目錄或文件名
-s:僅列出總量
-S:記錄所有子目錄(子目錄下的子目錄直到無目錄)的總計與剩下的總計
PS:使用touch test_1可以建立一個空文件。
觀察磁盤分區狀態
lsblk [-ip] [device]
-i:使用ASCII的字符輸出
-p:列出該設備的完整文件名,而不是僅僅列出最後的名字
blkid
列出設備的UUID(universally unique identifer)等參數。
需要root權限才能能夠顯示。
磁盤分區
MBR分區表使用fdisk,GPT分區使用fdisk。
gdisk 設備名稱
?查看可用命令
d 刪除分區
n增加一個分區
p打印分區表
q不保存分區直接離開gdisk
w保存分區後離開gdisk
該命令也是需要root權限,針對整個磁盤,而不是某個分區,所以執行gdisk /dev/sda1就會報錯,應該使用gdisk /dev/sda
在進行增加扇區的時候,需要注意選擇開始開始扇區First sector之後要選擇的Last sector一定不要選擇默認,因爲默認是將所有空間都用掉。
注:
i)增加或者刪除扇區都需要更新Linux內核的分區表信息。
partprobe -s 更新內核的分區表信息並輸出顯示
ii)刪除扇區的話必須先將該扇區卸載。umount
磁盤格式化
mkfs.ext4
-b:設置區塊的大小,有1K,2K,4K的容量
-L:後面接這個設備的標頭名稱
格式化爲ext4的系統,若沒有添加自定義的參數,則默認參數由/etc/mke2fs.conf控制。
mkfs.vfat
mkfs -t vfat 設備名稱
格式化之後可以使用dumpe2fs來查看超級區塊信息。
文件系統檢驗
fsck.ext4
-f:強制檢查
-b:利用超級區塊進行恢復
在進行檢查之前一定要確認被檢查的分區不掛載在系統上,需要確保該分區處於被卸載的狀態。
正常情況下不要執行此命令,可能對系統造成傷害。
文件系統掛載與卸載
mount -l 顯示目前掛載的信息,可增列Label的名稱
mount -t 加指定欲掛載的類型,如xfs,ext4等。
在進行掛載之前需要確定:
1.單一文件系統不應該被重複掛載在不同的掛載點
2.單一目錄不應該重複掛載多個文件系統
3.作爲掛載點的目錄,理論上應該是空目錄才行
當目錄不爲空的時候,掛載了文件系統之後,原有的文件就會被隱藏,等到新分區被卸載之後,則原有的內容就會再次出現。
mount -a依照配置文件/etc/fstab的數據將所有未掛載的磁盤都掛載上來
mount -o remount表示重新掛載 在系統出錯或者重新設置參數的時候
光盤的掛載之後無法退出,只有卸載之後才能退出。
將設備文件卸載umount
-f:強制卸載
-l:立刻卸載文件系統,比-f還強
-n:不更新/etc/mtab的情況下卸載
設置啓動掛載
掛載的限制
1.根目錄一定要掛載,而且要優先於其他掛載點
2.其他掛載點必須爲已建立的目錄,可任意指定,但一定要遵守系統目錄架構原則FHS
3.所有掛載點在同一時間內只能掛載一次
4.所有硬盤分區在同一時間內只能掛載一次
5.若進行卸載,必須先將工作目錄移動到掛載點及其子目錄之外。
自動掛載
我們進行mount命令的時候,就是在將各種選項和參數填寫在/etc/fstab中
在修改/etc/fstab之後,一定要使用df來看一下掛載是否正確。若/etc/fstab錯誤可能會導致系統無法順利啓動。
內存交換分區(swap)
當物理內存不足的時候,內存交換分區可以將內存中的數據拿到硬盤中暫時存放。
目前的主機一般都較大,不需要使用swap,但是對於服務器來說,不確定何時會有大量的網絡請求,最好還是預留一些內存交換分區。
1.使用gdisk劃分一個分區,
2.mkswap 設備文件名 來進行格式化
3.swapon 設備文件名 將swap設備啓動
4.通過free或swapon -s來觀察內存的使用量
free display free and memory in the system
parted
parted命令也可以進行分區操作,後來推出GPT的gdisk之後,用的較少。
parted device print會顯示分區表信息。
可以確定是GPT分區表。在不能確定是何種分區從而不能確定使用fdisk與gdisk時,使用parted來確定。
參考鳥哥的Linux私房菜第四版