鸟哥的Linux笔记-------磁盘与文件系统
2019獨角獸企業重金招聘Python工程師標準>>>
一、索引式文件系統
文件系統通常會將這兩部分的數據分別存放在不同的區塊,權限和屬性放置到 inode 中,至于實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的整體信息,包括 inode 和block 的總量、使用量、剩余量等。
- ?superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩余量, 以及文件系統的格式不相關信息等;
- ?inode:記錄檔案的屬性,一個檔案占用一個inode,同時記錄此檔案的數據所在的?block 號碼;
- ?block:實際記彔檔案的內容,若檔案太大時,會占用多個 block 。
由于每個 inode 和?block 都有編號,而每個檔案都會占用一個 inode ,inode 內則有檔案數據放置的?block 號碼。 因此,我們可以知道的是,如果能夠找到檔案的inode 的話,那舉自然就會知道這個檔案所放置數據的block 號碼, 當然也就能夠讀出該檔案的實際數據了。這是個比較有效率的作法,因為如此一來我們的磁盤就能夠在短時間內讀取出全部的數據, 讀寫的效能比較好。Ext2 是索引式文件系統
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?EXT2文件系統示意圖
?
在整體的規劃當中,文件系統最前面有一個啟動扇區(boot sector),這個啟動扇區可以安裝開機管理程序, 這是個非常重要的設計,因為如此一來我們就能夠將不同的開機管理程序安裝到個別的文件系統最前端,而不用覆蓋整顆硬盤唯一的?MBR, 這樣也才能夠制作出多重引導的環境!
- data block (資料區塊)
data block 是用來放置檔案內容數據地方,在 Ext2 文件系統中所支持的block 大小有 1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄。 不過要注意的是,由于 block 大小的差異,會尋致該文件系統能夠支持的最大磁盤容量于最大單一檔案容量并不相同。 因為 block 大小而產生的Ext2 文件系統限制如下:
? ? ? ?
| Block大小 | 1K | 2K | 4K |
| 最大單一檔案限制 | 16G | 256G | 2TB |
| 最大單一文件限制 | 2TB | 8TB | 16TB |
?
- ?inode table (inode 表格)
? ? ??inode 的內容在記錄檔案的屬性以及該檔案實際數據是放置在哪幾號 block 內! 基本上,inode 記錄的檔案數據至少有底下這些:
? 該檔案的存取模式(read/write/excute);
? 該檔案的擁有者和群組(owner/group);
? 該檔案的容量;
? 該檔案建立或狀態改變的時間(ctime);
? 最近一次的讀取時間(atime);
? 最近修改的時間(mtime);
? 定義檔案特性的旗標(flag),如 SetUID...;
? 該檔案真正內容的指向?(pointer);
inode 的數量不大小也是在格式化時就已經固定了
? 每個 inode 大小均固定為 128 bytes;
? 每個檔案都僅會占用一個 inode 而已;
? 因此文件系統能夠建立的檔案數量和?inode 的數量有關;
? 系統讀取檔案時需要先找到 inode,并分析 inode 所記錄的權限和用戶是否符合,若符合才能夠開始實際讀取block 的內容。
?
- Superblock (超級區塊)
Superblock 是記錄整個 filesystem 相關信息的地方, 沒有 Superblock ,就沒有這個 filesystem 了。他記錄的信息主要有:
? block 和?inode 的總量;
? 未使用和已使用癿的inode / block 數量;
? block 和inode 的大小 (block 為 1, 2, 4K,inode 為 128 bytes);
? filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等文件系統的相關信息;
? 一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。
?
一般來說, superblock 的大小為 1024bytes
?
- ?Filesystem Description (文件系統描述說明)
這個區段可以描述每個 block group 的開始和結束的block 號碼,以及說明每個區段 (superblock, bitmap, inodemap, data block) 分別介于哪一個 block 號碼之間。這部分也能夠用 dumpe2fs 來觀察的。
?
- block bitmap (區塊對照表)
這就得要透過 block bitmap 的輔助,從 block bitmap 當中可以知道哪些 block 是空的,因此我們的系統就能夠很快速的找到可使用的空間來處置檔案。
- inode bitmap (inode 對照表)
這個其實和block bitmap 是類似的功能,只是 block bitmap 記錄的是使用和未使用的?block 號碼, 至于inode bitmap 則是記錄使用和未使用的?inode 號碼!
二、磁盤和目錄的容量
? ?1.? ?df:列出文件系統的整體磁盤使用量;
-h :以人們較易閱讀的GBytes, MBytes, KBytes 等格式自行顯示;
-i :不用硬盤容量,而以 inode 的數量來顯示
?
? ?2.? ? du:評估文件系統的磁盤使用量(常用在推算目錄所占容量)
選項與參數:
-a :列出所有的檔案和目錄容量,因為默認僅統計目錄底下的檔案量而已。
-h :以人們較易讀的容量格式 (G/M) 顯示;
-s :列出總量而已,而不列出每個各別的目彔占用容量;
-S :不包括子目錄下的總計,和-s 有點差別。
-k :以 KBytes 列出容量顯示;
-m :以 MBytes 列出容量顯示;
三、實體鏈接和符號鏈接: ln
? Hard Link (實體鏈接, 硬式連結或實際連結)
- 每個檔案都會占用一個 inode ,檔案內容由 inode 的紀錄來指向;
- 想要讀取該檔案,必項要經過目錄記錄的文件名來指向到正確的?inode 號碼才能讀取。
? 其實文件名只和目錄有關,但是檔案內容則和?inode 有關。hard link 叧是在某個目錄下新增一筆檔名鏈接到某 inode 號碼的關連記錄而已。hard link 只是在某個目錄下的?block 多寫入一個關連數據而已,既不會增加 inode 也不會耗用 block 數量。
所以hard link 應該僅能在單一文件系統中進行的,不能 link 目錄。
? Symbolic Link (符號鏈接,亦即是快捷方式)
? ?
由 1 號 inode 讀取到連結檔的內容僅有檔名,根據檔名鏈接到正確的目錄去取得目標檔案的?inode , 最終就能夠讀取到正確的數據了。你可以發現的是,如果目標檔案(/etc/crontab)被刪除了,那么整個環節就會無法繼續進行下去, 所以就會發生無法透過連結檔讀取的問題了!
?
ln的使用
ln [-sf] 來源文件 目標文件
選項和參數:
-s :如果不加任何參數就進行連結,那就是hard link,至于?-s 就是symbolic link
-f :如果目標文件存在時,就主動的將目標文件直接移除后再建立!
?
四、磁盤的管理
fdisk [-l] 裝置名稱
選項與參數:
-l :輸出后面接的裝置所有的?partition 內容。若僅有 fdisk -l 時, 則系統將會把整個系統內能夠搜索到的裝置的?partition 均列出來。
fsck 是用來檢驗文件系統是否出錯。
?
五、磁盤掛載與卸除
? 單一文件系統不應該被重復掛載在不同的掛載點(目錄)中;
? 單一目錄不應該重復掛載多個文件系統;
? 要作為掛載點的目彔,理論上應該都是空目目錄。如果你要用來掛載的目彔里面并不是空的,那么掛載了文件系統之后,原目錄下的東西就會暫時的消失
mount [-t 文件系統] [-L Label名] [-o 額外選頃] \ [-n] 裝置文件名 掛載點
選項與參數:
-a :依照配置文件 /etc/fstab 的數據將所有未掛載的磁盤都掛載上來
-l :單純的輸入 mount 會顯示目前掛載的信息。加上 -l 可增列 Label 名稱!
-t :和mkfs 癿選項非常類似的,可以加上文件系統種類來指定欲掛載的類型。 常見癿 Linux 支持類型有:ext2, ext3, vfat, reiserfs, iso9660(光盤格式), nfs, cifs, smbfs(此三種為網絡文件系統類型)
-n :在默認的情況下,系統會將實際掛載的情況實時寫入 /etc/mtab 中,以利其他程序的運作。但在某些情況下(例如單人維護模式)為了避開問題,會刻意不寫入。 此時就得要使用這個 -n 的選項了。
-L :系統除了利用裝置文件名 (例如 /dev/hdc6) 之外,還可以利用文件系統癿標頭名稱 (Label)來進行掛載。最好為你的文件系統取一個獨一無二的名稱
?-o :后面可以接一些掛載時額外加上的參數!比方說賬號、密碼、讀寫權限等:
? ? ? ?ro, rw: 掛載文件系統成為叧讀(ro) 或可擦寫(rw)
? ? ? async, sync: 此文件系統是否使用同步寫入 (sync) 或異步 (async) 的?內存機制,請參考文件系統運作方式。預設為 async。
? ? ? auto, noauto: 允許此 partition 被以 mount -a 自動掛載(auto)
? ? ? dev, nodev: 是否允許此 partition 上,可建立裝置檔案? dev 為可允許?
? ? ?suid, nosuid: 是否允許此 partition 只有 suid/sgid 的文件格式?
? ? ?exec, noexec: 是否允許此 partition 上擁有可執行 binary 檔案?
? ? ?user, nouser: 是否允許此 partition 讓任何使用者執行 mount ?一般來說, mount 僅有 root 可以執行,但下達 user 參數,則可讓?一般 user 也能夠對此 partition 進行 mount 。
? ? ? defaults: 默認值為:rw, suid, dev, exec, auto, nouser, and async
? ? ? remount: 重新掛載,這在系統出錯,或重新更新參數時,很有用!
?
掛載時以下文件會作為系統的參考,自動與文件匹配看是否能夠掛載
- /etc/filesystems:系統指定的測試掛載文件系統類型;
- ?/proc/filesystems:Linux系統已經加載的文件系統類型。
- /lib/modules/$(uname -r)/kernel/fs/? ?:Linux 支持的文件系統驅動程序
umount [-fn] 裝置文件名卸掛載點
選項和參數:
-f :強制卸除!可用在類似網絡文件系統 (NFS) 無法讀取到的情況下;
-n :不更新 /etc/mtab 情況下卸除。
六、開機掛載 /etc/fstab 及 /etc/mtab
系統掛載的一些限制:
? 根目彔錄/ 是必項掛載的﹐而且一定要先于其它 mount point 被掛載進來。
? 其它 mount point 必須為已建立的目彔﹐可任意指定﹐但一定要遵守必項的系統目彔架構原則
? 所有 mount point 在同一時間之內﹐叧能掛載一次。
? 所有 partition 在同一時間之內﹐叧能掛載一次。
? 如若進行卸除﹐您必項先將工作目錄移到 mount point(及其子目錄) 之外。
?
/etc/fstab中每個字段的意義
- 第一欄:磁盤裝置文件名或該裝置的?Label
- 第二欄:掛載點 (mount point)
- 第三欄:磁盤分區槽的文件系統
- 第四欄:文件系統參數
| 參數? | 內容意義 |
| async/sync ?異步/同步 | 設定磁盤是否以異步方式運作!預設為 async(效果較佳) |
| auto/noauto自動/非自動 | 當下達 mount -a 時,此文件系統是否會被主動測試掛載。預設為auto |
| rw/ro 可擦寫/只讀 | 讓該分割槽以可擦寫或者是只讀的型態掛載上來,如果你想要分享的數據是不給用戶隨意變更的, 這里也能夠設定為只讀。則不論在此文件系統的檔案是否設定 w 權限,都無法寫入! |
| exec/noexec 可執行/不可執行 | 限制在此文件系統內是否可以進行『執行』的工作?如果是純粹用來儲存資料的, 那么可以設定為 noexec 會比較安全,相對的,會比較麻煩! |
| user/nouser 允許/不允許使用者掛載 | 是否允講用戶使用 mount 指令來掛載呢?一般而言,我們當然不希望一般身份的 user 能使用 mount 啰,因為太不安全了,因此這里應該要設定為 nouser 啰! |
| suid/nosuid 具有/不具有 suid 權限 | 該文件系統是否允講 SUID 的存在?如果不是執行文件放置目彔,也可以設定為 nosuid 來取消這個功能! |
| usrquota | 注意名稱是『 usrquota 』不要拼錯了!這個是在啟動 filesystem 支持磁盤配額模式。 |
| grpquota | 注意名稱是『grpquota』,啟動 filesystem 對群組磁盤配額模式的支持。 |
| defaults | 同時具有 rw, suid, dev, exec, auto, nouser, async 等參數。 基本上,預設情況使用 defaults 設定即可! |
- 第五欄:能否被 dump 備份指令作用
dump 是一個用來做為備份的指令,我們可以透過 fstab 指定哪個文件系統必項要進行dump 備份! 0 代表不要做 dump 備份, 1 代表要每天進行?dump 的動作。 2 也代表其他不定日期的?dump 備份動作, 通常這個數值不是 0 就是 1。
- 是否以 fsck 檢驗扇區:
開機的過程中,系統默認會以 fsck 檢驗我們的?filesystem 是否完整 (clean)。 不過,某些 filesystem 是不需要檢驗的,例如內存置換空間 (swap) ,或者是特殊文件系統例如 /proc 和/sys 等等。0 是不要檢驗, 1 表示最早檢驗(一般只有根目錄會設定為 1), 2 也是要檢驗,不過 1 會比較早被檢驗! 一般來說,根目錄設定為 1 ,其他的要檢驗的?filesystem 都設定為 2 就好了。
?
/etc/fstab 是開機時的配置文件,不過,實際 filesystem 的掛載是記彔錄到 /etc/mtab 和?/proc/mounts 這兩個檔案當中的。每次我們在更新filesystem 的掛載時,也會同時更新這兩個檔案!但是,萬一發生在 /etc/fstab 輸入的數據錯誤,尋致無法順利開機成功,而進入單人維護模式當中,那時候的?/ 可是 read only 癿狀態,當然您就無法修改 /etc/fstab ,也無法更新 /etc/mtab 那怎么辦? 沒關系,可以利用底下這一招:
[root@www ~]# mount -n -o remount,rw /?
?
七、特殊裝置 loop 掛載
?
- ?掛載光盤/DVD映象文件
root@www ~]# mount -o loop /root/centos5.2_x86_64.iso /mnt/centos_dvd
?
- 建立大檔案以制作 loop 裝置檔案!
用dd指令進行大型檔案的制作,制作完成之后需格式化。
root@www ~]# dd if=/dev/zero of=/home/loopdev bs=1M count=512
512+0 records in <==讀入 512 筆資料
512+0 records out <==輸出
512 筆數據 536870912 bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s
# 這個指令的簡單意義如下:
# if 是 input file ,輸入檔案。那個 /dev/zero 是會一直輸出 0 的裝置!
# of 是 output file ,將一堆零寫入到后面接的檔案中。
# bs 是每個 block 大小,就像文件系統那樣的block 意意義;
# count 則是總共幾個 bs 的意思。
dd 就好像在疊磚塊一樣,將 512 塊,每塊 1MB 的磚塊堆棧成為一個大檔案 (/home/loopdev) ! 最終就會出現一個 512MB 的檔案。
?
八、內存置換空間(swap)
使用實體分割槽建置swap
1. 分割:先使用 fdisk 在你的磁盤中分割中一個分割槽給系統作為 swap 。由于Linux 的?fdisk 預設會將分割槽的?ID 設定為 Linux 的文件系統,所以你可能還得要設定一下 system ID 就是了。
2. 格式化:利用建立 swap 格式的『mkswap 裝置文件名』就能夠格式化該分割槽成為 swap 格式
3. 使用:最后將該 swap 裝置啟動,方法為:『swapon 裝置文件名』。
4. 觀察:最終透過 free 這個指令來觀察一下內存的用量吧!
- 可以用多余的磁盤槽來增加swap,方法和下面一樣
- 使用文件做成swap
1. 使用 dd 這個指令來新增一個512MB 的檔案在 /tmp 底下:
2. 使用 mkswap 將 /tmp/swap 這個文件格式化為 swap 的文件格式:
3. 使用 swapon 來將 /tmp/swap 啟動
?
4. 使用 swapoff 關掉 swap file
?
?
九、壓縮(gzip,bzip2,tar)
- gzip
[root@www ~]# gzip [-cdtv#] 檔名
[root@www ~]# zcat 檔名.gz
選項與參數:
-c :將壓縮的數據輸出到屏幕上,可透過數據流重導向來處理;
-d :解壓縮的參數;
-t :可以用來檢驗一個壓縮文件的一致性~看看檔案有無錯誤;
-v :可以顯示出原檔案/壓縮文件案的壓縮比等信息;
-# :壓縮等級,-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!預設是 -6
- bzip2 則是為了取代 gzip 并提供更佳的壓縮比而來的
[root@www ~]# bzip2 [-cdkzv#] 檔名
[root@www ~]# bzcat 檔名.bz2
選項與參數:
-c :將壓縮的過程產生的數據輸出到屏幕上!
-d :解壓縮的參數
-k :保留源文件,而不會刪除原始的檔案!
-z :壓縮的參數
-v :可以顯示出原檔案/壓縮文件案的壓縮比等信息;
-# :與gzip 同樣的,都是在計算壓縮比的參數, -9 最佳, -1 最差!
- tar打包指令,并沒有壓縮的功能,需加上參數才能實現打包壓縮
[root@www ~]# tar [-j|-z] [cv] [-f 建立癿檔名] filename... <==打包不壓縮
[root@www ~]# tar [-j|-z] [tv] [-f 建立癿檔名] <==察看檔名
[root@www ~]# tar [-j|-z] [xv] [-f 建立癿檔名] [-C 目錄] <==解壓縮
選項與參數:
-c :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename)
-t :察看打包檔案的內容含有哪些檔名,重點在察看『檔名』;
-x :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開 特別留意的是, -c, -t, -x 不可同時出現在一串指令列中。
-j :透過 bzip2 的支持進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2
-z :透過 gzip 的支持迚行壓縮/解壓縮:此時檔名最好為 *.tar.gz
-v :在壓縮/解壓縮的過程中,將正在處理的文件名顯示出來!
-f filename:-f 后面要立刻接要被處理的檔名!建議 -f 單獨寫一個選項!
-C 目錄 :這個選頃用在解壓縮,若要在特定目錄解壓縮,可以使用這個選頃。 其他后續練習會使用到的
選項介紹:
-p :保留備份數據的原本權限和屬性,常用于備份(-c)重要的配置文件
-P :保留絕對路徑,亦即先講備份數據中含有根目錄存在之意;
--exclude=FILE:在壓縮的過程中,不要將 FILE 打包!
?
? 壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱
? 查 詢:tar -jtv -f filename.tar.bz2
? 解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄
?
1. 將 /etc 整個目錄一邊打包一邊在 /tmp 解開
[root@www ~]# cd /tmp
[root@www ~]# tar -cvf - /etc | tar -xvf -
?
- dump壓縮備份,restore復原dump
root@www ~]# dump -W
選項和參數:
-S :僅列出后面的待備份數據需要多少磁盤空間才能夠備份完畢;
-u :將這次 dump 的時間記錄到 /etc/dumpdates 檔案中;
-v :將 dump 的檔案過程顯示出來;
-j :加入 bzip2 的支持!將數據進行壓縮,默認 bzip2 壓縮等級為 2
-level:就是我們談到的等級,從 -0 ~ -9 共十個等級;
-f :有點類似 tar !后面接產生的檔案,亦可接例如 /dev/st0 裝置文件名等
-W :列出在 /etc/fstab 里面的具有 dump 設定的?partition 是否有備份過
?
# 讓我們將 /etc 整個目錄透過 dump 迚行備份,且含壓縮功能
[root@www ~]# dump -0j -f /root/etc.dump.bz2 /etc
?
root@www ~]# restore -t [-f dumpfile] [-h] <==用來察看 dump 檔
[root@www ~]# restore -C [-f dumpfile] [-D 掛載點] <==比較dump和實際檔案
[root@www ~]# restore -i [-f dumpfile] <==進入互動模式
[root@www ~]# restore -r [-f dumpfile] <==還原整個文件系統
選項與參數:
相關的各種模式,各種模式無法混用喔!例如不可以寫 -tC !
-t :此模式用在察看 dump 起來的備份文件中含有什么重要數據!類似 tar -t 功能;
-C :此模式可以將 dump 內的數據拿出來跟實際的文件系統做比較, 最終會列出『在 dump 檔案內有記錄的,且目前文件系統不?一樣』的檔案;
-i :進入互動模式,可以僅還原部分檔案,用在 dump 目錄時的還原!
-r :將整個 filesystem 還原的一種模式,用在還原針對文件系統的dump 備份;
其他較常用到的選項功能:
-h :察看完整備份數據中的inode 和文件系統 label 等信息
-f :后面就接你要處理的那個 dump 檔案!
-D :和?-C 進行搭配,可以查出后面接的掛載點和?dump 內有不同的檔案!
轉載于:https://my.oschina.net/liubaizi/blog/1785967
總結
以上是生活随笔為你收集整理的鸟哥的Linux笔记-------磁盘与文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝、微信(pc+h5)支付
- 下一篇: 线程初步(四)--小练习