鸟哥的Linux私房菜(基础篇)- 第八章、Linux 磁盘与文件系统管理
最近升級日期:2009/08/30
| 系統管理員很重要的任務之一就是管理好自己的磁盤文件系統,每個分割槽不可太大也不能太小,太大會造成磁盤容量的浪費,太小則會產生文件無法儲存的困擾。此外,我們在前面幾章談到的文件權限與屬性中,這些權限與屬性分別記錄在文件系統的哪個區塊內?這就得要談到 filesystem 中的 inode 與 block 了。在本章我們的重點在于如何制作文件系統,包括分割、格式化與掛載等,是很重要的一個章節喔! |
1. 認識 EXT2 文件系統
1.1 硬盤組成與分割的復習
1.2 文件系統特性: 索引式文件系統
1.3 Linux 的 EXT2 文件系統(inode): data block, inode table, superblock,dumpe2fs
1.4 與目錄樹的關系
1.5 EXT2/EXT3 文件的存取與日志式文件系統的功能
1.6 Linux 文件系統的運行
1.7 掛載點的意義 (mount point)
1.8 其他 Linux 支持的文件系統與 VFS
2. 文件系統的簡單操作
2.1 磁盤與目錄的容量: df, du
2.2 實體鏈接與符號鏈接: ln
3. 磁盤的分割、格式化、檢驗與掛載
3.1 磁盤分區: fdisk, partprobe
3.2 磁盤格式化: mkfs, mke2fs
3.3 磁盤檢驗: fsck, badblocks
3.4 磁盤掛載與卸除: mount, umount
3.5 磁盤參數修訂: mknod, e2label, tune2fs, hdparm
4. 配置啟動掛載:
4.1 啟動掛載 /etc/fstab 及 /etc/mtab
4.2 特殊裝置 loop 掛載(映象檔不刻錄就掛載使用)
5. 內存置換空間(swap)之建置:
5.1 使用實體分割槽建置swap
5.2 使用文件建置swap
5.3 swap使用上的限制
6. 文件系統的特殊觀察與操作
6.1 boot sector 與 superblock 的關系
6.2 磁盤空間之浪費問題
6.3 利用 GNU 的 parted 進行分割行為
7. 重點回顧
8. 本章習題
9. 參考數據與延伸閱讀
10. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23881
認識 EXT2 文件系統
Linux最傳統的磁盤文件系統(filesystem)使用的是EXT2這個啦!所以要了解文件系統就得要由認識EXT2開始!而文件系統是創建在硬盤上面的,因此我們得了解硬盤的物理組成才行。磁盤物理組成的部分我們在第零章談過了,至于磁盤分區則在第三章談過了,所以底下只會很快的復習這兩部份。重點在于inode, block還有superblock等文件系統的基本部分喔!
硬盤組成與分割的復習
由于各項磁盤的物理組成我們在第零章里面就介紹過,同時第三章也談過分割的概念了,所以這個小節我們就拿之前的重點出來介紹就好了!詳細的信息請您回去那兩章自行復習喔!^_^。好了,首先說明一下磁盤的物理組成,整顆磁盤的組成主要有:
- 圓形的磁盤盤(主要記錄數據的部分);
- 機械手臂,與在機械手臂上的磁盤讀取頭(可擦寫磁盤盤上的數據);
- 主軸馬達,可以轉動磁盤盤,讓機械手臂的讀取頭在磁盤盤上讀寫數據。
從上面我們知道數據儲存與讀取的重點在于磁盤盤,而磁盤盤上的物理組成則為(假設此磁盤為單盤片,磁盤盤圖標請參考第三章圖2.2.1的示意):
- 扇區(Sector)為最小的物理儲存單位,每個扇區為 512 bytes;
- 將扇區組成一個圓,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小單位;
- 第一個扇區最重要,里面有:(1)主要啟動區(Master boot record, MBR)及分割表(partition table),其中 MBR 占有 446 bytes,而 partition table 則占有 64 bytes。
各種接口的磁盤在Linux中的文件名分別為:
- /dev/sd[a-p][1-15]:為SCSI, SATA, U盤, Flash閃盤等接口的磁盤文件名;
- /dev/hd[a-d][1-63]:為 IDE 接口的磁盤文件名;
復習完物理組成后,來復習一下磁盤分區吧!所謂的磁盤分區指的是告訴操作系統『我這顆磁盤在此分割槽可以存取的區域是由 A 磁柱到 B 磁柱之間的區塊』,如此一來操作系統就能夠知道他可以在所指定的區塊內進行文件數據的讀/寫/搜尋等動作了。也就是說,磁盤分區意即指定分割槽的啟始與結束磁柱就是了。
那么指定分割槽的磁柱范圍是記錄在哪里?就是第一個扇區的分割表中啦!但是因為分割表僅有64bytes而已,因此最多只能記錄四筆分割槽的記錄,這四筆記錄我們稱為主要 (primary) 或延伸 (extended) 分割槽,其中擴展分配槽還可以再分割出邏輯分割槽 (logical) ,而能被格式化的則僅有主要分割與邏輯分割而已。
最后,我們再將第三章關于分割的定義拿出來說明一下啰:
- 主要分割與擴展分配最多可以有四筆(硬盤的限制)
- 擴展分配最多只能有一個(操作系統的限制)
- 邏輯分割是由擴展分配持續切割出來的分割槽;
- 能夠被格式化后,作為數據存取的分割槽為主要分割與邏輯分割。擴展分配無法格式化;
- 邏輯分割的數量依操作系統而不同,在Linux系統中,IDE硬盤最多有59個邏輯分割(5號到63號),SATA硬盤則有11個邏輯分割(5號到15號)。
文件系統特性
我們都知道磁盤分區完畢后還需要進行格式化(format),之后操作系統才能夠使用這個分割槽。為什么需要進行『格式化』呢?這是因為每種操作系統所配置的文件屬性/權限并不相同,為了存放這些文件所需的數據,因此就需要將分割槽進行格式化,以成為操作系統能夠利用的『文件系統格式(filesystem)』。
由此我們也能夠知道,每種操作系統能夠使用的文件系統并不相同。舉例來說,windows 98 以前的微軟操作系統主要利用的文件系統是 FAT (或 FAT16),windows 2000 以后的版本有所謂的 NTFS文件系統,至于Linux 的正統文件系統則為 Ext2 (Linux second extended file system, ext2fs)這一個。此外,在默認的情況下,windows 操作系統是不會認識 Linux 的 Ext2 的。
傳統的磁盤與文件系統之應用中,一個分割槽就是只能夠被格式化成為一個文件系統,所以我們可以說一個 filesystem就是一個 partition。但是由于新技術的利用,例如我們常聽到的LVM與軟件磁盤陣列(software raid),這些技術可以將一個分割槽格式化為多個文件系統(例如LVM),也能夠將多個分割槽合成一個文件系統(LVM, RAID)!所以說,目前我們在格式化時已經不再說成針對 partition 來格式化了,通常我們可以稱呼一個可被掛載的數據為一個文件系統而不是一個分割槽喔!
那么文件系統是如何運行的呢?這與操作系統的文件數據有關。較新的操作系統的文件數據除了文件實際內容外,通常含有非常多的屬性,例如 Linux 操作系統的文件權限(rwx)與文件屬性(擁有者、群組、時間參數等)。文件系統通常會將這兩部份的數據分別存放在不同的區塊,權限與屬性放置到 inode 中,至于實際數據則放置到 data block 區塊中。另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的整體信息,包括 inode 與 block 的總量、使用量、剩余量等。
每個 inode 與 block 都有編號,至于這三個數據的意義可以簡略說明如下:
- superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩余量,以及文件系統的格式與相關信息等;
- inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的 block 號碼;
- block:實際記錄文件的內容,若文件太大時,會占用多個 block 。
由于每個 inode 與 block 都有編號,而每個文件都會占用一個 inode ,inode 內則有文件數據放置的 block 號碼。因此,我們可以知道的是,如果能夠找到文件的 inode 的話,那么自然就會知道這個文件所放置數據的 block 號碼,當然也就能夠讀出該文件的實際數據了。這是個比較有效率的作法,因為如此一來我們的磁盤就能夠在短時間內讀取出全部的數據,讀寫的效能比較好啰。
我們將 inode 與 block 區塊用圖解來說明一下,如下圖所示,文件系統先格式化出 inode 與 block 的區塊,假設某一個文件的屬性與權限數據是放置到 inode 4 號(下圖較小方格內),而這個 inode 記錄了文件數據的實際放置點為2, 7, 13, 15 這四個 block 號碼,此時我們的操作系統就能夠據此來排列磁盤的閱讀順序,可以一口氣將四個 block 內容讀出來!那么數據的讀取就如同下圖中的箭頭所指定的模樣了。
圖1.2.1、inode/block 數據存取示意圖
這種數據存取的方法我們稱為索引式文件系統(indexed allocation)。那有沒有其他的慣用文件系統可以比較一下啊?有的,那就是我們慣用的閃盤(閃存),閃盤使用的文件系統一般為 FAT 格式。FAT 這種格式的文件系統并沒有 inode存在,所以 FAT 沒有辦法將這個文件的所有 block 在一開始就讀取出來。每個 block 號碼都記錄在前一個 block 當中,他的讀取方式有點像底下這樣:
圖1.2.2、FAT文件系統數據存取示意圖
上圖中我們假設文件的數據依序寫入1->7->4->15號這四個 block 號碼中,但這個文件系統沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出后,才會知道下一個 block 在何處。如果同一個文件數據寫入的 block 分散的太過厲害時,則我們的磁盤讀取頭將無法在磁盤轉一圈就讀到所有的數據,因此磁盤就會多轉好幾圈才能完整的讀取到這個文件的內容!
常常會聽到所謂的『碎片整理』吧?需要碎片整理的原因就是文件寫入的 block 太過于離散了,此時文件讀取的效能將會變的很差所致。這個時候可以透過碎片整理將同一個文件所屬的 blocks 匯整在一起,這樣數據的讀取會比較容易啊!想當然爾,FAT 的文件系統需要經常的碎片整理一下,那么 Ext2 是否需要磁盤重整呢?
由于 Ext2 是索引式文件系統,基本上不太需要常常進行碎片整理的。但是如果文件系統使用太久,常常刪除/編輯/新增文件時,那么還是可能會造成文件數據太過于離散的問題,此時或許會需要進行重整一下的。不過,老實說,鳥哥倒是沒有在 Linux 操作系統上面進行過 Ext2/Ext3 文件系統的碎片整理說!似乎不太需要啦!^_^
Linux 的 EXT2 文件系統(inode):
在第六章當中我們介紹過 Linux 的文件除了原有的數據內容外,還含有非常多的權限與屬性,這些權限與屬性是為了保護每個用戶所擁有數據的隱密性。而前一小節我們知道 filesystem 里面可能含有的 inode/block/superblock等。為什么要談這個呢?因為標準的 Linux 文件系統 Ext2 就是使用這種 inode 為基礎的文件系統啦!
而如同前一小節所說的,inode 的內容在記錄文件的權限與相關屬性,至于 block 區塊則是在記錄文件的實際內容。而且文件系統一開始就將 inode 與 block 規劃好了,除非重新格式化(或者利用 resize2fs 等命令變更文件系統大小),否則 inode 與 block 固定后就不再變動。但是如果仔細考慮一下,如果我的文件系統高達數百GB時,那么將所有的 inode 與 block 通通放置在一起將是很不智的決定,因為 inode 與 block 的數量太龐大,不容易管理。
為此之故,因此 Ext2 文件系統在格式化的時候基本上是區分為多個區塊群組 (block group) 的,每個區塊群組都有獨立的 inode/block/superblock 系統。感覺上就好像我們在當兵時,一個營里面有分成數個連,每個連有自己的聯絡系統,但最終都向營部回報連上最正確的信息一般!這樣分成一群群的比較好管理啦!整個來說,Ext2 格式化后有點像底下這樣:
圖1.3.1、ext2文件系統示意圖(注1)
在整體的規劃當中,文件系統最前面有一個啟動扇區(boot sector),這個啟動扇區可以安裝啟動管理程序,這是個非常重要的設計,因為如此一來我們就能夠將不同的啟動管理程序安裝到個別的文件系統最前端,而不用覆蓋整顆硬盤唯一的 MBR,這樣也才能夠制作出多重引導的環境啊!至于每一個區塊群組(block group)的六個主要內容說明如后:
- data block (數據區塊)
data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄啦。不過要注意的是,由于 block 大小的差異,會導致該文件系統能夠支持的最大磁盤容量與最大單一文件容量并不相同。因為 block 大小而產生的 Ext2 文件系統限制如下:(注2)
| Block 大小 | 1KB | 2KB | 4KB |
| 最大單一文件限制 | 16GB | 256GB | 2TB |
| 最大文件系統總容量 | 2TB | 8TB | 16TB |
你需要注意的是,雖然 Ext2 已經能夠支持大于 2GB 以上的單一文件容量,不過某些應用程序依然使用舊的限制,也就是說,某些程序只能夠捉到小于 2GB 以下的文件而已,這就跟文件系統無關了!舉例來說,鳥哥在環工方面的應用中有一套秀圖軟件稱為PAVE(注3),這套軟件就無法捉到鳥哥在數值模式仿真后產生的大于 2GB 以上的文件!害的鳥哥常常還要重跑數值模式...
除此之外 Ext2 文件系統的 block 還有什么限制呢?有的!基本限制如下:
- 原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);
- 每個 block 內最多只能夠放置一個文件的數據;
- 承上,如果文件大于 block 的大小,則一個文件會占用多個 block 數量;
- 承上,若文件小于 block ,則該 block 的剩余容量就不能夠再被使用了(磁盤空間會浪費)。
如上第四點所說,由于每個 block 僅能容納一個文件的數據而已,因此如果你的文件都非常小,但是你的 block 在格式化時卻選用最大的 4K 時,可能會產生一些容量的浪費喔!我們以底下的一個簡單例題來算一下空間的浪費吧!
| 例題: 假設你的Ext2文件系統使用 4K block ,而該文件系統中有 10000 個小文件,每個文件大小均為 50bytes,請問此時你的磁盤浪費多少容量? 答: 由于 Ext2 文件系統中一個 block 僅能容納一個文件,因此每個 block 會浪費『 4096 - 50 = 4046 (byte)』,系統中總共有一萬個小文件,所有文件容量為:50 (bytes) x 10000 = 488.3Kbytes,但此時浪費的容量為:『 4046 (bytes) x 10000 = 38.6MBytes 』。想一想,不到 1MB 的總文件容量卻浪費將近 40MB 的容量,且文件越多將造成越多的磁盤容量浪費。 |
什么情況會產生上述的狀況呢?例如 BBS 網站的數據啦!如果 BBS 上面的數據使用的是純文本文件來記載每篇留言,而留言內容如果都寫上『如題』時,想一想,是否就會產生很多小文件了呢?
好,既然大的 block 可能會產生較嚴重的磁盤容量浪費,那么我們是否就將 block 大小訂為 1K 即可?這也不妥,因為如果 block 較小的話,那么大型文件將會占用數量更多的 block ,而 inode 也要記錄更多的 block 號碼,此時將可能導致文件系統不良的讀寫效能。
所以我們可以說,在您進行文件系統的格式化之前,請先想好該文件系統預計使用的情況。以鳥哥來說,我的數值模式仿真平臺隨便一個文件都好幾百 MB,那么 block 容量當然選擇較大的!至少文件系統就不必記錄太多的 block 號碼,讀寫起來也比較方便啊!
- inode table (inode 表格)
再來討論一下 inode 這個玩意兒吧!如前所述 inode 的內容在記錄文件的屬性以及該文件實際數據是放置在哪幾號 block 內!基本上,inode 記錄的文件數據至少有底下這些:(注4)
- 該文件的存取模式(read/write/excute);
- 該文件的擁有者與群組(owner/group);
- 該文件的容量;
- 該文件創建或狀態改變的時間(ctime);
- 最近一次的讀取時間(atime);
- 最近修改的時間(mtime);
- 定義文件特性的旗標(flag),如 SetUID...;
- 該文件真正內容的指向 (pointer);
inode 的數量與大小也是在格式化時就已經固定了,除此之外 inode 還有些什么特色呢?
- 每個 inode 大小均固定為 128 bytes;
- 每個文件都僅會占用一個 inode 而已;
- 承上,因此文件系統能夠創建的文件數量與 inode 的數量有關;
- 系統讀取文件時需要先找到 inode,并分析 inode 所記錄的權限與用戶是否符合,若符合才能夠開始實際讀取 block 的內容。
我們約略來分析一下 inode / block 與文件大小的關系好了。inode 要記錄的數據非常多,但偏偏又只有 128bytes 而已,而 inode 記錄一個 block 號碼要花掉 4byte ,假設我一個文件有 400MB 且每個 block 為 4K 時,那么至少也要十萬筆 block 號碼的記錄呢!inode 哪有這么多可記錄的信息?為此我們的系統很聰明的將 inode 記錄 block 號碼的區域定義為12個直接,一個間接, 一個雙間接與一個三間接記錄區。這是啥?我們將 inode 的結構畫一下好了。
圖1.3.2、inode 結構示意圖(注5)
上圖最左邊為 inode 本身 (128 bytes),里面有 12 個直接指向 block 號碼的對照,這 12 筆記錄就能夠直接取得 block 號碼啦!至于所謂的間接就是再拿一個 block 來當作記錄 block 號碼的記錄區,如果文件太大時,就會使用間接的 block 來記錄編號。如上圖 1.3.2 當中間接只是拿一個 block 來記錄額外的號碼而已。同理,如果文件持續長大,那么就會利用所謂的雙間接,第一個 block 僅再指出下一個記錄編號的 block 在哪里,實際記錄的在第二個 block 當中。依此類推,三間接就是利用第三層 block 來記錄編號啦!
這樣子 inode 能夠指定多少個 block 呢?我們以較小的 1K block 來說明好了,可以指定的情況如下:
- 12 個直接指向: 12*1K=12K
由于是直接指向,所以總共可記錄 12 筆記錄,因此總額大小為如上所示;
- 間接: 256*1K=256K
每筆 block 號碼的記錄會花去 4bytes,因此 1K 的大小能夠記錄 256 筆記錄,因此一個間接可以記錄的文件大小如上;
- 雙間接: 256*256*1K=2562K
第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個號碼,因此總額大小如上;
- 三間接: 256*256*256*1K=2563K
第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個第三層,每個第三層可以指定 256 個號碼,因此總額大小如上;
- 總額:將直接、間接、雙間接、三間接加總,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB
此時我們知道當文件系統將 block 格式化為 1K 大小時,能夠容納的最大文件為 16GB,比較一下文件系統限制表的結果可發現是一致的!但這個方法不能用在 2K 及 4K block 大小的計算中,因為大于 2K 的 block 將會受到 Ext2 文件系統本身的限制,所以計算的結果會不太符合之故。
- 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 是非常重要的,因為我們這個文件系統的基本信息都寫在這里,因此,如果 superblock 死掉了,你的文件系統可能就需要花費很多時間去挽救啦!一般來說, superblock 的大小為 1024bytes。相關的 superblock 信息我們等一下會以dumpe2fs 命令來呼叫出來觀察喔!
此外,每個 block group 都可能含有 superblock 喔!但是我們也說一個文件系統應該僅有一個 superblock 而已,那是怎么回事啊?事實上除了第一個 block group 內會含有 superblock 之外,后續的 block group 不一定含有 superblock ,而若含有 superblock 則該 superblock 主要是做為第一個 block group 內 superblock 的備份咯,這樣可以進行 superblock的救援呢!
- Filesystem Description (文件系統描述說明)
這個區段可以描述每個 block group 的開始與結束的 block 號碼,以及說明每個區段 (superblock, bitmap, inodemap,data block) 分別介于哪一個 block 號碼之間。這部份也能夠用dumpe2fs 來觀察的。
- block bitmap (區塊對照表)
如果你想要新增文件時總會用到 block 吧!那你要使用哪個 block 來記錄呢?當然是選擇『空的 block 』來記錄新文件的數據啰。那你怎么知道哪個 block 是空的?這就得要透過 block bitmap 的輔助了。從 block bitmap 當中可以知道哪些 block是空的,因此我們的系統就能夠很快速的找到可使用的空間來處置文件啰。
同樣的,如果你刪除某些文件時,那么那些文件原本占用的 block 號碼就得要釋放出來,此時在 block bitmap 當中相對應到該 block 號碼的標志就得要修改成為『未使用中』啰!這就是 bitmap 的功能。
- inode bitmap (inode 對照表)
這個其實與 block bitmap 是類似的功能,只是 block bitmap 記錄的是使用與未使用的 block 號碼,至于 inode bitmap 則是記錄使用與未使用的 inode 號碼啰!
了解了文件系統的概念之后,再來當然是觀察這個文件系統啰!剛剛談到的各部分數據都與 block 號碼有關!每個區段與 superblock 的信息都可以使用 dumpe2fs 這個命令來查詢的!查詢的方法與實際的觀察如下:
| [root@www ~]# dumpe2fs [-bh] 裝置文件名 選項與參數: -b :列出保留為壞軌的部分(一般用不到吧!?) -h :僅列出 superblock 的數據,不會列出其他的區段內容!范例:找出我的根目錄磁盤文件名,并觀察文件系統的相關信息 [root@www ~]# df <==這個命令可以叫出目前掛載的裝置 Filesystem 1K-blocks Used Available Use% Mounted on /dev/hdc2 9920624 3822848 5585708 41% / <==就是這個光! /dev/hdc3 4956316 141376 4559108 4% /home /dev/hdc1 101086 11126 84741 12% /boot tmpfs 371332 0 371332 0% /dev/shm[root@www ~]# dumpe2fs /dev/hdc2 dumpe2fs 1.39 (29-May-2006) Filesystem volume name: /1 <==這個是文件系統的名稱(Label) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file Default mount options: user_xattr acl <==默認掛載的參數 Filesystem state: clean <==這個文件系統是沒問題的(clean) Errors behavior: Continue Filesystem OS type: Linux Inode count: 2560864 <==inode的總數 Block count: 2560359 <==block的總數 Free blocks: 1524760 <==還有多少個 block 可用 Free inodes: 2411225 <==還有多少個 inode 可用 First block: 0 Block size: 4096 <==每個 block 的大小啦! Filesystem created: Fri Sep 5 01:49:20 2008 Last mount time: Mon Sep 22 12:09:30 2008 Last write time: Mon Sep 22 12:09:30 2008 Last checked: Fri Sep 5 01:49:20 2008 First inode: 11 Inode size: 128 <==每個 inode 的大小 Journal inode: 8 <==底下這三個與下一小節有關 Journal backup: inode blocks Journal size: 128MGroup 0: (Blocks 0-32767) <==第一個 data group 內容, 包含 block 的啟始/結束號碼Primary superblock at 0, Group descriptors at 1-1 <==超級區塊在 0 號 blockReserved GDT blocks at 2-626Block bitmap at 627 (+627), Inode bitmap at 628 (+628)Inode table at 629-1641 (+629) <==inode table 所在的 block0 free blocks, 32405 free inodes, 2 directories <==所有 block 都用完了!Free blocks:Free inodes: 12-32416 <==剩余未使用的 inode 號碼 Group 1: (Blocks 32768-65535) ....(底下省略).... # 由于數據量非常的龐大,因此鳥哥將一些信息省略輸出了!上表與你的屏幕會有點差異。 # 前半部在秀出 supberblock 的內容,包括標頭名稱(Label)以及inode/block的相關信息 # 后面則是每個 block group 的個別信息了!您可以看到各區段數據所在的號碼! # 也就是說,基本上所有的數據還是與 block 的號碼有關就是了!很重要! |
如上所示,利用 dumpe2fs 可以查詢到非常多的信息,不過依內容主要可以區分為上半部是 superblock 內容,下半部則是每個 block group 的信息了。從上面的表格中我們可以觀察到這個 /dev/hdc2 規劃的 block 為 4K,第一個 block 號碼為 0 號,且 block group 內的所有信息都以 block 的號碼來表示的。然后在 superblock 中還有談到目前這個文件系統的可用 block 與 inode 數量喔!
至于 block group 的內容我們單純看 Group0 信息好了。從上表中我們可以發現:
- Group0 所占用的 block 號碼由 0 到 32767 號,superblock 則在第 0 號的 block 區塊內!
- 文件系統描述說明在第 1 號 block 中;
- block bitmap 與 inode bitmap 則在 627 及 628 的 block 號碼上。
- 至于 inode table 分布于 629-1641 的 block 號碼中!
- 由于 (1)一個 inode 占用 128 bytes ,(2)總共有 1641 - 629 + 1(629本身) = 1013 個 block 花在 inode table 上,(3)每個 block 的大小為 4096 bytes(4K)。由這些數據可以算出 inode 的數量共有 1013 * 4096 / 128 = 32416 個 inode 啦!
- 這個 Group0 目前沒有可用的 block 了,但是有剩余 32405 個 inode 未被使用;
- 剩余的 inode 號碼為 12 號到 32416 號。
如果你對文件系統的詳細信息還有更多想要了解的話,那么請參考本章最后一小節的介紹喔!否則文件系統看到這里對于基礎認知您應該是已經相當足夠啦!底下則是要探討一下,那么這個文件系統概念與實際的目錄樹應用有啥關連啊?
與目錄樹的關系
由前一小節的介紹我們知道在 Linux 系統下,每個文件(不管是一般文件還是目錄文件)都會占用一個 inode ,且可依據文件內容的大小來分配多個 block 給該文件使用。而由第六章的權限說明中我們知道目錄的內容在記錄文件名,一般文件才是實際記錄數據內容的地方。那么目錄與文件在 Ext2 文件系統當中是如何記錄數據的呢?基本上可以這樣說:
- 目錄
當我們在 Linux 下的 ext2 文件系統創建一個目錄時, ext2 會分配一個 inode 與至少一塊 block 給該目錄。其中,inode 記錄該目錄的相關權限與屬性,并可記錄分配到的那塊 block 號碼;而 block 則是記錄在這個目錄下的文件名與該文件名占用的 inode 號碼數據。也就是說目錄所占用的 block 內容在記錄如下的信息:
圖1.4.1、目錄占用的 block 記錄的數據示意圖
如果想要實際觀察 root 家目錄內的文件所占用的 inode 號碼時,可以使用 ls -i 這個選項來處理:
| [root@www ~]# ls -li total 92 654683 -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg 648322 -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log 648323 -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog |
由于每個人所使用的計算機并不相同,系統安裝時選擇的項目與 partition 都不一樣,因此你的環境不可能與我的 inode 號碼一模一樣!上表的左邊所列出的 inode 僅是鳥哥的系統所顯示的結果而已!而由這個目錄的 block 結果我們現在就能夠知道,當你使用『 ll / 』時,出現的目錄幾乎都是 1024 的倍數,為什么呢?因為每個 block 的數量都是 1K, 2K, 4K 嘛!看一下鳥哥的環境:
| [root@www ~]# ll -d / /bin /boot /proc /lost+found /sbin drwxr-xr-x 23 root root 4096 Sep 22 12:09 / <==一個 4K block drwxr-xr-x 2 root root 4096 Sep 24 00:07 /bin <==一個 4K block drwxr-xr-x 4 root root 1024 Sep 4 18:06 /boot <==一個 1K block drwx------ 2 root root 16384 Sep 5 01:49 /lost+found <==四個 4K block dr-xr-xr-x 96 root root 0 Sep 22 20:07 /proc <==此目錄不占硬盤空間 drwxr-xr-x 2 root root 12288 Sep 5 12:33 /sbin <==三個 4K block |
由于鳥哥的根目錄 /dev/hdc2 使用的 block 大小為 4K ,因此每個目錄幾乎都是 4K 的倍數。其中由于 /sbin 的內容比較復雜因此占用了 3 個 block ,此外,鳥哥的系統中 /boot 為獨立的 partition ,該 partition 的 block 為 1K 而已,因此該目錄就僅占用 1024 bytes 的大小啰!至于奇怪的 /proc我們在第六章就講過該目錄不占硬盤容量,所以當然耗用的 block 就是 0 啰!
| Tips: 由上面的結果我們知道目錄并不只會占用一個 block 而已,也就是說:在目錄底下的文件數如果太多而導致一個 block 無法容納的下所有的檔名與 inode 對照表時,Linux 會給予該目錄多一個 block 來繼續記錄相關的數據; |
- 文件:
當我們在 Linux 下的 ext2 創建一個一般文件時, ext2 會分配一個 inode 與相對于該文件大小的 block 數量給該文件。例如:假設我的一個 block 為 4 Kbytes ,而我要創建一個 100 KBytes 的文件,那么 linux 將分配一個 inode 與 25 個 block 來儲存該文件!但同時請注意,由于 inode 僅有 12 個直接指向,因此還要多一個 block 來作為區塊號碼的記錄喔!
- 目錄樹讀取:
好了,經過上面的說明你也應該要很清楚的知道 inode 本身并不記錄文件名,文件名的記錄是在目錄的 block 當中。因此在第六章文件與目錄的權限說明中,我們才會提到『新增/刪除/更名文件名與目錄的 w 權限有關』的特色!那么因為文件名是記錄在目錄的 block 當中,因此當我們要讀取某個文件時,就務必會經過目錄的 inode 與 block ,然后才能夠找到那個待讀取文件的 inode 號碼,最終才會讀到正確的文件的 block 內的數據。
由于目錄樹是由根目錄開始讀起,因此系統透過掛載的信息可以找到掛載點的 inode 號碼(通常一個 filesystem 的最頂層 inode號碼會由 2 號開始喔!),此時就能夠得到根目錄的 inode 內容,并依據該 inode 讀取根目錄的 block 內的文件名數據,再一層一層的往下讀到正確的檔名。
舉例來說,如果我想要讀取 /etc/passwd 這個文件時,系統是如何讀取的呢?
| [root@www ~]# ll -di / /etc /etc/passwd 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 / 1912545 drwxr-xr-x 105 root root 12288 Oct 14 04:02 /etc 1914888 -rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd |
在鳥哥的系統上面與 /etc/passwd 有關的目錄與文件數據如上表所示,該文件的讀取流程為(假設讀取者身份為 vbird 這個一般身份使用者):
透過掛載點的信息找到 /dev/hdc2 的 inode 號碼為 2 的根目錄 inode,且 inode 規范的權限讓我們可以讀取該 block 的內容(有 r 與 x) ;
經過上個步驟取得 block 的號碼,并找到該內容有 etc/ 目錄的 inode 號碼 (1912545);
讀取 1912545 號 inode 得知 vbird 具有 r 與 x 的權限,因此可以讀取 etc/ 的 block 內容;
經過上個步驟取得 block 號碼,并找到該內容有 passwd 文件的 inode 號碼 (1914888);
讀取 1914888 號 inode 得知 vbird 具有 r 的權限,因此可以讀取 passwd 的 block 內容;
最后將該 block 內容的數據讀出來。
- filesystem 大小與磁盤讀取效能:
另外,關于文件系統的使用效率上,當你的一個文件系統規劃的很大時,例如 100GB 這么大時,由于硬盤上面的數據總是來來去去的,所以,整個文件系統上面的文件通常無法連續寫在一起(block 號碼不會連續的意思),而是填入式的將數據填入沒有被使用的 block 當中。如果文件寫入的 block 真的分的很散,此時就會有所謂的文件數據離散的問題發生了。
如前所述,雖然我們的 ext2 在 inode 處已經將該文件所記錄的 block 號碼都記上了,所以數據可以一次性讀取,但是如果文件真的太過離散,確實還是會發生讀取效率低落的問題。因為磁盤讀取頭還是得要在整個文件系統中來來去去的頻繁讀取!果真如此,那么可以將整個 filesystme 內的數據全部復制出來,將該 filesystem 重新格式化,再將數據給他復制回去即可解決這個問題。
此外,如果 filesystem 真的太大了,那么當一個文件分別記錄在這個文件系統的最前面與最后面的 block 號碼中,此時會造成硬盤的機械手臂移動幅度過大,也會造成數據讀取效能的低落。而且讀取頭在搜尋整個 filesystem 時,也會花費比較多的時間去搜尋!因此, partition 的規劃并不是越大越好,而是真的要針對您的主機用途來進行規劃才行!^_^
EXT2/EXT3 文件的存取與日志式文件系統的功能
上一小節談到的僅是讀取而已,那么如果是新建一個文件或目錄時,我們的 Ext2 是如何處理的呢?這個時候就得要 block bitmap 及 inode bitmap 的幫忙了!假設我們想要新增一個文件,此時文件系統的行為是:
一般來說,我們將 inode table 與 data block 稱為數據存放區域,至于其他例如 superblock、block bitmap 與 inode bitmap 等區段就被稱為 metadata (中介數據) 啰,因為superblock, inode bitmap 及 block bitmap的數據是經常變動的,每次新增、移除、編輯時都可能會影響到這三個部分的數據,因此才被稱為中介數據的啦。
- 數據的不一致 (Inconsistent) 狀態
在一般正常的情況下,上述的新增動作當然可以順利的完成。但是如果有個萬一怎么辦?例如你的文件在寫入文件系統時,因為不知名原因導致系統中斷(例如突然的停電啊、系統核心發生錯誤啊~等等的怪事發生時),所以寫入的數據僅有 inode table 及 data block 而已,最后一個同步升級中介數據的步驟并沒有做完,此時就會發生 metadata 的內容與實際數據存放區產生不一致 (Inconsistent) 的情況了。
既然有不一致當然就得要克服!在早期的 Ext2 文件系統中,如果發生這個問題,那么系統在重新啟動的時候,就會藉由 Superblock 當中記錄的 valid bit (是否有掛載) 與 filesystem state (clean 與否) 等狀態來判斷是否強制進行數據一致性的檢查!若有需要檢查時則以e2fsck 這支程序來進行的。
不過,這樣的檢查真的是很費時~因為要針對 metadata 區域與實際數據存放區來進行比對,呵呵~得要搜尋整個 filesystem 呢~如果你的文件系統有 100GB 以上,而且里面的文件數量又多時,哇!系統真忙碌~而且在對 Internet 提供服務的服務器主機上面,這樣的檢查真的會造成主機復原時間的拉長~真是麻煩~這也就造成后來所謂日志式文件系統的興起了。
- 日志式文件系統 (Journaling filesystem)
為了避免上述提到的文件系統不一致的情況發生,因此我們的前輩們想到一個方式,如果在我們的 filesystem 當中規劃出一個區塊,該區塊專門在記錄寫入或修訂文件時的步驟,那不就可以簡化一致性檢查的步驟了?也就是說:
在這樣的程序當中,萬一數據的紀錄過程當中發生了問題,那么我們的系統只要去檢查日志記錄區塊,就可以知道哪個文件發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊 filesystem 去檢查,這樣就可以達到快速修復 filesystem 的能力了!這就是日志式文件最基礎的功能啰~
那么我們的 ext2 可達到這樣的功能嗎?當然可以啊!就透過 ext3 即可! ext3 是 ext2 的升級版本,并且可向下兼容 ext2 版本呢!所以啰,目前我們才建議大家,可以直接使用 ext3 這個 filesystem 啊!如果你還記得dumpe2fs 輸出的信息,可以發現 superblock 里面含有底下這樣的信息:
| Journal inode: 8 Journal backup: inode blocks Journal size: 128M |
看到了吧!透過 inode 8 號記錄 journal 區塊的 block 指向,而且具有 128MB 的容量在處理日志呢!這樣對于所謂的日志式文件系統有沒有比較有概念一點呢?^_^。如果想要知道為什么 Ext3 文件系統會更適用于目前的 Linux 系統,我們可以參考 Red Hat 公司中,首席核心開發者 Michael K. Johnson 的話:(注6)
| 『為什么你想要從ext2轉換到ext3呢?有四個主要的理由:可利用性、數據完整性、速度及易于轉換』『可利用性』,他指出,這意味著從系統中止到快速重新復原而不是持續的讓e2fsck運行長時間的修復。ext3的日志式條件可以避免數據毀損的可能。他也指出:『除了寫入若干數據超過一次時,ext3往往會較快于ext2,因為ext3的日志使硬盤讀取頭的移動能更有效的進行』然而或許決定的因素還是在Johnson先生的第四個理由中。 『它是可以輕易的從ext2變更到ext3來獲得一個強而有力的日志式文件系統而不需要重新做格式化』。『那是正確的,為了體驗一下ext3 的好處是不需要去做一種長時間的,冗長乏味的且易于產生錯誤的備份工作及重新格式化的動作』。 |
Linux 文件系統的運行:
我們現在知道了目錄樹與文件系統的關系了,但是由第零章的內容我們也知道,所有的數據都得要加載到內存后 CPU 才能夠對該數據進行處理。想一想,如果你常常編輯一個好大的文件,在編輯的過程中又頻繁的要系統來寫入到磁盤中,由于磁盤寫入的速度要比內存慢很多,因此你會常常耗在等待硬盤的寫入/讀取上。真沒效率!
為了解決這個效率的問題,因此我們的 Linux 使用的方式是透過一個稱為異步處理 (asynchronously) 的方式。所謂的異步處理是這樣的:
當系統加載一個文件到內存后,如果該文件沒有被更動過,則在內存區段的文件數據會被配置為干凈(clean)的。但如果內存中的文件數據被更改過了(例如你用 nano 去編輯過這個文件),此時該內存中的數據會被配置為臟的(Dirty)。此時所有的動作都還在內存中運行,并沒有寫入到磁盤中!系統會不定時的將內存中配置為『Dirty』的數據寫回磁盤,以保持磁盤與內存數據的一致性。你也可以利用第五章談到的 sync命令來手動強迫寫入磁盤。
我們知道內存的速度要比硬盤快的多,因此如果能夠將常用的文件放置到內存當中,這不就會添加系統性能嗎?沒錯!是有這樣的想法!因此我們 Linux 系統上面文件系統與內存有非常大的關系喔:
- 系統會將常用的文件數據放置到主存儲器的緩沖區,以加速文件系統的讀/寫;
- 承上,因此 Linux 的物理內存最后都會被用光!這是正常的情況!可加速系統效能;
- 你可以手動使用 sync 來強迫內存中配置為 Dirty 的文件回寫到磁盤中;
- 若正常關機時,關機命令會主動呼叫 sync 來將內存的數據回寫入磁盤內;
- 但若不正常關機(如跳電、死機或其他不明原因),由于數據尚未回寫到磁盤內,因此重新啟動后可能會花很多時間在進行磁盤檢驗,甚至可能導致文件系統的損毀(非磁盤損毀)。
掛載點的意義 (mount point):
每個 filesystem 都有獨立的 inode / block / superblock 等信息,這個文件系統要能夠鏈接到目錄樹才能被我們使用。將文件系統與目錄樹結合的動作我們稱為『掛載』。關于掛載的一些特性我們在第三章稍微提過,重點是:掛載點一定是目錄,該目錄為進入該文件系統的入口。因此并不是你有任何文件系統都能使用,必須要『掛載』到目錄樹的某個目錄后,才能夠使用該文件系統的。
舉例來說,如果你是依據鳥哥的方法安裝你的 CentOS 5.x 的話,那么應該會有三個掛載點才是,分別是 /, /boot, /home 三個 (鳥哥的系統上對應的裝置文件名為 /dev/hdc2, /dev/hdc1, /dev/hdc3)。那如果觀察這三個目錄的 inode 號碼時,我們可以發現如下的情況:
| [root@www ~]# ls -lid / /boot /home 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 / 2 drwxr-xr-x 4 root root 1024 Sep 4 18:06 /boot 2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home |
看到了吧!由于 filesystem 最頂層的目錄之 inode 一般為 2 號,因此可以發現 /, /boot, /home 為三個不同的 filesystem 啰!(因為每一行的文件屬性并不相同,且三個目錄的掛載點也均不相同之故。)我們在第七章一開始的路徑中曾經提到根目錄下的 . 與 .. 是相同的東西,因為權限是一模一樣嘛!如果使用文件系統的觀點來看,同一個 filesystem 的某個 inode 只會對應到一個文件內容而已(因為一個文件占用一個 inode 之故),因此我們可以透過判斷 inode 號碼來確認不同文件名是否為相同的文件喔!所以可以這樣看:
| [root@www ~]# ls -ild / /. /.. 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 / 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 /. 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 /.. |
上面的信息中由于掛載點均為 / ,因此三個文件 (/, /., /..) 均在同一個 filesystem 內,而這三個文件的inode 號碼均為 2 號,因此這三個檔名都指向同一個 inode 號碼,當然這三個文件的內容也就完全一模一樣了!也就是說,根目錄的上一級 (/..) 就是他自己!這么說,看的懂了嗎? ^_^
其他 Linux 支持的文件系統與 VFS
雖然 Linux 的標準文件系統是 ext2 ,且還有添加了日志功能的 ext3 ,事實上,Linux 還有支持很多文件系統格式的,尤其是最近這幾年推出了好幾種速度很快的日志式文件系統,包括 SGI 的 XFS 文件系統,可以適用更小型文件的 Reiserfs 文件系統,以及 Windows 的 FAT 文件系統等等,都能夠被 Linux 所支持喔!常見的支持文件系統有:
- 傳統文件系統:ext2 / minix / MS-DOS / FAT (用 vfat 模塊) / iso9660 (光盤)等等;
- 日志式文件系統: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS
- 網絡文件系統: NFS / SMBFS
想要知道你的 Linux 支持的文件系統有哪些,可以察看底下這個目錄:
| [root@www ~]# ls -l /lib/modules/$(uname -r)/kernel/fs |
系統目前已加載到內存中支持的文件系統則有:
| [root@www ~]# cat /proc/filesystems |
- Linux VFS (Virtual Filesystem Switch)
了解了我們使用的文件系統之后,再來則是要提到,那么 Linux 的核心又是如何管理這些認識的文件系統呢?其實,整個 Linux 的系統都是透過一個名為 Virtual Filesystem Switch 的核心功能去讀取 filesystem 的。 也就是說,整個 Linux 認識的 filesystem 其實都是 VFS 在進行管理,我們使用者并不需要知道每個 partition 上頭的 filesystem 是什么~ VFS 會主動的幫我們做好讀取的動作呢~
假設你的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs ,那么你取用 /home/dmtsai/.bashrc 時,有特別指定要用的什么文件系統的模塊來讀取嗎?應該是沒有吧!這個就是 VFS 的功能啦!透過這個 VFS 的功能來管理所有的 filesystem,省去我們需要自行配置讀取文件系統的定義啊~方便很多!整個 VFS 可以約略用下圖來說明:
圖 1.8.1、VFS 文件系統的示意圖
老實說,文件系統真的不好懂!如果你想要對文件系統有更深入的了解,文末的相關連結(注7)務必要參考參考才好喔!鳥哥有找了一些數據放置于這里:
- Ext2/Ext3 文件系統:http://vbird.dic.ksu.edu.tw/linux_basic/1010appendix_B.php
有興趣的朋友務必要前往參考參考才好!
文件系統的簡單操作
稍微了解了文件系統后,再來我們得要知道如何查詢整體文件系統的總容量與每個目錄所占用的容量啰!此外,前兩章談到的文件類型中尚未講的很清楚的連結檔 (Link file) 也會在這一小節當中介紹的。
磁盤與目錄的容量:
現在我們知道磁盤的整體數據是在 superblock 區塊中,但是每個各別文件的容量則在 inode 當中記載的。那在文字接口底下該如何叫出這幾個數據呢?底下就讓我們來談一談這兩個命令:
- df:列出文件系統的整體磁盤使用量;
- du:評估文件系統的磁盤使用量(常用在推估目錄所占容量)
- df
| [root@www ~]# df [-ahikHTm] [目錄或文件名] 選項與參數: -a :列出所有的文件系統,包括系統特有的 /proc 等文件系統; -k :以 KBytes 的容量顯示各文件系統; -m :以 MBytes 的容量顯示各文件系統; -h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示; -H :以 M=1000K 取代 M=1024K 的進位方式; -T :連同該 partition 的 filesystem 名稱 (例如 ext3) 也列出; -i :不用硬盤容量,而以 inode 的數量來顯示范例一:將系統內所有的 filesystem 列出來! [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hdc2 9920624 3823112 5585444 41% / /dev/hdc3 4956316 141376 4559108 4% /home /dev/hdc1 101086 11126 84741 12% /boot tmpfs 371332 0 371332 0% /dev/shm # 在 Linux 底下如果 df 沒有加任何選項,那么默認會將系統內所有的 # (不含特殊內存內的文件系統與 swap) 都以 1 Kbytes 的容量來列出來! # 至于那個 /dev/shm 是與內存有關的掛載,先不要理他!范例二:將容量結果以易讀的容量格式顯示出來 [root@www ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/hdc2 9.5G 3.7G 5.4G 41% / /dev/hdc3 4.8G 139M 4.4G 4% /home /dev/hdc1 99M 11M 83M 12% /boot tmpfs 363M 0 363M 0% /dev/shm # 不同于范例一,這里會以 G/M 等容量格式顯示出來,比較容易看啦!范例三:將系統內的所有特殊文件格式及名稱都列出來 [root@www ~]# df -aT Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/hdc2 ext3 9920624 3823112 5585444 41% / proc proc 0 0 0 - /proc sysfs sysfs 0 0 0 - /sys devpts devpts 0 0 0 - /dev/pts /dev/hdc3 ext3 4956316 141376 4559108 4% /home /dev/hdc1 ext3 101086 11126 84741 12% /boot tmpfs tmpfs 371332 0 371332 0% /dev/shm none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs # 系統里面其實還有很多特殊的文件系統存在的。那些比較特殊的文件系統幾乎 # 都是在內存當中,例如 /proc 這個掛載點。因此,這些特殊的文件系統 # 都不會占據硬盤空間喔! ^_^范例四:將 /etc 底下的可用的磁盤容量以易讀的容量格式顯示 [root@www ~]# df -h /etc Filesystem Size Used Avail Use% Mounted on /dev/hdc2 9.5G 3.7G 5.4G 41% / # 這個范例比較有趣一點啦,在 df 后面加上目錄或者是文件時, df # 會自動的分析該目錄或文件所在的 partition ,并將該 partition 的容量顯示出來, # 所以,您就可以知道某個目錄底下還有多少容量可以使用了! ^_^范例五:將目前各個 partition 當中可用的 inode 數量列出 [root@www ~]# df -ih Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2.5M 147K 2.3M 6% / /dev/hdc3 1.3M 46 1.3M 1% /home /dev/hdc1 26K 34 26K 1% /boot tmpfs 91K 1 91K 1% /dev/shm # 這個范例則主要列出可用的 inode 剩余量與總容量。分析一下與范例一的關系, # 你可以清楚的發現到,通常 inode 的數量剩余都比 block 還要多呢 |
先來說明一下范例一所輸出的結果信息為:
- Filesystem:代表該文件系統是在哪個 partition ,所以列出裝置名稱;
- 1k-blocks:說明底下的數字單位是 1KB 呦!可利用 -h 或 -m 來改變容量;
- Used:顧名思義,就是使用掉的硬盤空間啦!
- Available:也就是剩下的磁盤空間大小;
- Use%:就是磁盤的使用率啦!如果使用率高達 90% 以上時,最好需要注意一下了,免得容量不足造成系統問題喔!(例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁盤)
- Mounted on:就是磁盤掛載的目錄所在啦!(掛載點啦!)
由于 df 主要讀取的數據幾乎都是針對一整個文件系統,因此讀取的范圍主要是在 Superblock 內的信息,所以這個命令顯示結果的速度非常的快速!在顯示的結果中你需要特別留意的是那個根目錄的剩余容量!因為我們所有的數據都是由根目錄衍生出來的,因此當根目錄的剩余容量剩下 0 時,那你的 Linux 可能就問題很大了。
| Tips: 說個陳年老笑話!鳥哥還在念書時,別的研究室有個管理 Sun 工作站的研究生發現,他的硬盤明明還有好幾 GB ,但是就是沒有辦法將光盤內幾 MB 的數據 copy 進去,他就去跟老板講說機器壞了!嘿!明明才來維護過幾天而已為何會壞了!結果他老板就將維護商叫來罵了 2 小時左右吧! 后來,維護商發現原來硬盤的『總空間』還有很多,只是某個分割槽填滿了,偏偏該研究生就是要將數據 copy 去那個分割槽!呵呵!后來那個研究生就被命令『再也不許碰 Sun 主機』了~~ |
另外需要注意的是,如果使用 -a 這個參數時,系統會出現 /proc 這個掛載點,但是里面的東西都是 0 ,不要緊張! /proc 的東西都是 Linux 系統所需要加載的系統數據,而且是掛載在『內存當中』的,所以當然沒有占任何的硬盤空間啰!
至于那個 /dev/shm/ 目錄,其實是利用內存虛擬出來的磁盤空間!由于是透過內存仿真出來的磁盤,因此你在這個目錄底下創建任何數據文件時,訪問速度是非常快速的!(在內存內工作)不過,也由于他是內存仿真出來的,因此這個文件系統的大小在每部主機上都不一樣,而且創建的東西在下次啟動時就消失了!因為是在內存中嘛!
- du
| [root@www ~]# du [-ahskm] 文件或目錄名稱 選項與參數: -a :列出所有的文件與目錄容量,因為默認僅統計目錄底下的文件量而已。 -h :以人們較易讀的容量格式 (G/M) 顯示; -s :列出總量而已,而不列出每個各別的目錄占用容量; -S :不包括子目錄下的總計,與 -s 有點差別。 -k :以 KBytes 列出容量顯示; -m :以 MBytes 列出容量顯示;范例一:列出目前目錄下的所有文件容量 [root@www ~]# du 8 ./test4 <==每個目錄都會列出來 8 ./test2 ....中間省略.... 12 ./.gconfd <==包括隱藏文件的目錄 220 . <==這個目錄(.)所占用的總量 # 直接輸入 du 沒有加任何選項時,則 du 會分析『目前所在目錄』 # 的文件與目錄所占用的硬盤空間。但是,實際顯示時,僅會顯示目錄容量(不含文件), # 因此 . 目錄有很多文件沒有被列出來,所以全部的目錄相加不會等于 . 的容量喔! # 此外,輸出的數值數據為 1K 大小的容量單位。范例二:同范例一,但是將文件的容量也列出來 [root@www ~]# du -a 12 ./install.log.syslog <==有文件的列表了 8 ./.bash_logout 8 ./test4 8 ./test2 ....中間省略.... 12 ./.gconfd 220 .范例三:檢查根目錄底下每個目錄所占用的容量 [root@www ~]# du -sm /* 7 /bin 6 /boot .....中間省略.... 0 /proc .....中間省略.... 1 /tmp 3859 /usr <==系統初期最大就是他了啦! 77 /var # 這是個很常被使用的功能~利用通配符 * 來代表每個目錄, # 如果想要檢查某個目錄下,哪個次目錄占用最大的容量,可以用這個方法找出來 # 值得注意的是,如果剛剛安裝好 Linux 時,那么整個系統容量最大的應該是 /usr # 而 /proc 雖然有列出容量,但是那個容量是在內存中,不占硬盤空間。 |
與 df 不一樣的是,du 這個命令其實會直接到文件系統內去搜尋所有的文件數據,所以上述第三個范例命令的運行會運行一小段時間!此外,在默認的情況下,容量的輸出是以 KB 來設計的,如果你想要知道目錄占了多少 MB ,那么就使用 -m 這個參數即可啰!而,如果你只想要知道該目錄占了多少容量的話,使用 -s 就可以啦!
至于 -S 這個選項部分,由于 du 默認會將所有文件的大小均列出,因此假設你在 /etc 底下使用 du 時,所有的文件大小,包括 /etc 底下的次目錄容量也會被計算一次。然后最終的容量 (/etc) 也會加總一次,因此很多朋友都會誤會 du 分析的結果不太對勁。所以啰,如果想要列出某目錄下的全部數據,或許也可以加上 -S 的選項,減少次目錄的加總喔!
實體鏈接與符號鏈接: ln
關于鏈接(link)數據我們第六章的Linux文件屬性及Linux文件種類與擴展名當中提過一些信息,不過當時由于尚未講到文件系統,因此無法較完整的介紹連結檔啦。不過在上一小節談完了文件系統后,我們可以來了解一下連結檔這玩意兒了。
在 Linux 底下的連結檔有兩種,一種是類似 Windows 的快捷方式功能的文件,可以讓你快速的鏈接到目標文件(或目錄);另一種則是透過文件系統的 inode 連結來產生新檔名,而不是產生新文件!這種稱為實體鏈接 (hard link)。這兩種玩意兒是完全不一樣的東西呢!現在就分別來談談。
- Hard Link (實體鏈接, 硬式連結或實際連結)
在前一小節當中,我們知道幾件重要的信息,包括:
- 每個文件都會占用一個 inode ,文件內容由 inode 的記錄來指向;
- 想要讀取該文件,必須要經過目錄記錄的文件名來指向到正確的 inode 號碼才能讀取。
也就是說,其實文件名只與目錄有關,但是文件內容則與 inode 有關。那么想一想,有沒有可能有多個檔名對應到同一個 inode 號碼呢?有的!那就是 hard link 的由來。所以簡單的說:hard link 只是在某個目錄下新增一筆檔名鏈接到某 inode 號碼的關連記錄而已。
舉個例子來說,假設我系統有個 /root/crontab 他是 /etc/crontab 的實體鏈接,也就是說這兩個檔名連結到同一個 inode ,自然這兩個文件名的所有相關信息都會一模一樣(除了文件名之外)。實際的情況可以如下所示:
| [root@www ~]# ln /etc/crontab . <==創建實體鏈接的命令 [root@www ~]# ll -i /etc/crontab /root/crontab 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /root/crontab |
你可以發現兩個檔名都連結到 1912701 這個 inode 號碼,所以您瞧瞧,是否文件的權限/屬性完全一樣呢?因為這兩個『檔名』其實是一模一樣的『文件』啦!而且你也會發現第二個字段由原本的 1 變成 2 了!那個字段稱為『連結』,這個字段的意義為:『有多少個檔名鏈接到這個 inode 號碼』的意思。如果將讀取到正確數據的方式畫成示意圖,就類似如下畫面:
圖 2.2.1、實體鏈接的文件讀取示意圖
上圖的意思是,你可以透過 1 或 2 的目錄之 inode 指定的 block 找到兩個不同的檔名,而不管使用哪個檔名均可以指到 real 那個 inode去讀取到最終數據!那這樣有什么好處呢?最大的好處就是『安全』!如同上圖中,如果你將任何一個『檔名』刪除,其實 inode 與 block 都還是存在的!此時你可以透過另一個『檔名』來讀取到正確的文件數據喔!此外,不論你使用哪個『檔名』來編輯,最終的結果都會寫入到相同的 inode 與 block 中,因此均能進行數據的修改哩!
一般來說,使用 hard link 配置鏈接文件時,磁盤的空間與 inode 的數目都不會改變!我們還是由圖 2.2.1 來看,由圖中可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連數據而已,既不會添加 inode 也不會耗用 block 數量哩!
| Tips: hard link 的制作中,其實還是可能會改變系統的 block 的,那就是當你新增這筆數據卻剛好將目錄的 block 填滿時,就可能會新加一個 block 來記錄文件名關連性,而導致磁盤空間的變化!不過,一般 hard link 所用掉的關連數據量很小,所以通常不會改變 inode 與磁盤空間的大小喔! |
由圖 2.2.1 其實我們也能夠知道,事實上 hard link 應該僅能在單一文件系統中進行的,應該是不能夠跨文件系統才對!因為圖 2.2.1 就是在同一個 filesystem 上嘛!所以 hard link 是有限制的:
- 不能跨 Filesystem;
- 不能 link 目錄。
不能跨 Filesystem 還好理解,那不能 hard link 到目錄又是怎么回事呢?這是因為如果使用 hard link 鏈接到目錄時,鏈接的數據需要連同被鏈接目錄底下的所有數據都創建鏈接,舉例來說,如果你要將 /etc使用實體鏈接創建一個 /etc_hd 的目錄時,那么在 /etc_hd 底下的所有檔名同時都與 /etc底下的檔名要創建 hard link 的,而不是僅連結到 /etc_hd 與 /etc 而已。并且,未來如果需要在 /etc_hd 底下創建新文件時,連帶的, /etc 底下的數據又得要創建一次 hard link ,因此造成環境相當大的復雜度。所以啰,目前 hard link 對于目錄暫時還是不支持的啊!
- Symbolic Link (符號鏈接,亦即是快捷方式)
相對于 hard link , Symbolic link 可就好理解多了,基本上,Symbolic link 就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的檔名!由于只是利用文件來做為指向的動作,所以,當來源檔被刪除之后,symbolic link 的文件會『開不了』,會一直說『無法開啟某文件!』。實際上就是找不到原始『檔名』而已啦!
舉例來說,我們先創建一個符號鏈接文件鏈接到 /etc/crontab 去看看:
| [root@www ~]# ln -s /etc/crontab crontab2 [root@www ~]# ll -i /etc/crontab /root/crontab2 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab 654687 lrwxrwxrwx 1 root root 12 Oct 22 13:58 /root/crontab2 -> /etc/crontab |
由上表的結果我們可以知道兩個文件指向不同的 inode 號碼,當然就是兩個獨立的文件存在!而且連結檔的重要內容就是他會寫上目標文件的『文件名』,你可以發現為什么上表中連結檔的大小為 12 bytes 呢?因為箭頭(-->)右邊的檔名『/etc/crontab』總共有 12 個英文,每個英文占用 1 個 byes ,所以文件大小就是 12bytes了!
關于上述的說明,我們以如下圖示來解釋:
圖 2.2.2、符號鏈接的文件讀取示意圖
由 1 號 inode 讀取到連結檔的內容僅有檔名,根據檔名鏈接到正確的目錄去取得目標文件的 inode ,最終就能夠讀取到正確的數據了。你可以發現的是,如果目標文件(/etc/crontab)被刪除了,那么整個環節就會無法繼續進行下去,所以就會發生無法透過連結檔讀取的問題了!
這里還是得特別留意,這個 Symbolic Link 與 Windows 的快捷方式可以給他劃上等號,由 Symbolic link 所創建的文件為一個獨立的新的文件,所以會占用掉 inode 與 block喔!
由上面的說明來看,似乎 hard link 比較安全,因為即使某一個目錄下的關連數據被殺掉了,也沒有關系,只要有任何一個目錄下存在著關連數據,那么該文件就不會不見!舉上面的例子來說,我的/etc/crontab 與 /root/crontab 指向同一個文件,如果我刪除了 /etc/crontab這個文件,該刪除的動作其實只是將 /etc 目錄下關于 crontab 的關連數據拿掉而已,crontab 所在的 inode 與 block 其實都沒有被變動喔!
不過由于 Hard Link 的限制太多了,包括無法做『目錄』的 link ,所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方面較廣喔!好了,說的天花亂墜,看你也差不多快要昏倒了!沒關系,實作一下就知道怎么回事了!要制作連結檔就必須要使用ln 這個命令呢!
| [root@www ~]# ln [-sf] 來源文件 目標文件 選項與參數: -s :如果不加任何參數就進行連結,那就是hard link,至于 -s 就是symbolic link -f :如果 目標文件 存在時,就主動的將目標文件直接移除后再創建!范例一:將 /etc/passwd 復制到 /tmp 底下,并且觀察 inode 與 block [root@www ~]# cd /tmp [root@www tmp]# cp -a /etc/passwd . [root@www tmp]# du -sb ; df -i . 18340 . <==先注意一下這里的容量是多少! Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2560864 149738 2411126 6% / # 利用 du 與 df 來檢查一下目前的參數~那個 du -sb # 是計算整個 /tmp 底下有多少 bytes 的容量啦!范例二:將 /tmp/passwd 制作 hard link 成為 passwd-hd 文件,并觀察文件與容量 [root@www tmp]# ln passwd passwd-hd [root@www tmp]# du -sb ; df -i . 18340 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2560864 149738 2411126 6% / # 仔細看,即使多了一個文件在 /tmp 底下,整個 inode 與 block 的容量并沒有改變![root@www tmp]# ls -il passwd* 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd-hd # 原來是指向同一個 inode 啊!這是個重點啊!另外,那個第二欄的連結數也會添加!范例三:將 /tmp/passwd 創建一個符號鏈接 [root@www tmp]# ln -s passwd passwd-so [root@www tmp]# ls -li passwd* 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd-hd 586401 lrwxrwxrwx 1 root root 6 Oct 22 14:18 passwd-so -> passwd # passwd-so 指向的 inode number 不同了!這是一個新的文件~這個文件的內容是指向 # passwd 的。passwd-so 的大小是 6bytes ,因為 passwd 共有六個字符之故[root@www tmp]# du -sb ; df -i . 18346 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2560864 149739 2411125 6% / # 呼呼!整個容量與 inode 使用數都改變啰~確實如此啊!范例四:刪除源文件 passwd ,其他兩個文件是否能夠開啟? [root@www tmp]# rm passwd [root@www tmp]# cat passwd-hd ......正常顯示完畢! [root@www tmp]# cat passwd-so cat: passwd-so: No such file or directory [root@www tmp]# ll passwd* -rw-r--r-- 1 root root 1945 Sep 29 02:21 passwd-hd lrwxrwxrwx 1 root root 6 Oct 22 14:18 passwd-so -> passwd # 怕了吧!符號鏈接果然無法開啟!另外,如果符號鏈接的目標文件不存在, # 其實檔名的部分就會有特殊的顏色顯示喔! |
| Tips: 還記得第六章當中,我們提到的 /tmp 這個目錄是干嘛用的嗎?是給大家作為緩存盤用的啊!所以,您會發現,過去我們在進行測試時,都會將數據移動到 /tmp 底下去練習~嘿嘿!因此,有事沒事,記得將 /tmp 底下的一些怪異的數據清一清先! |
要注意啰!使用 ln 如果不加任何參數的話,那么就是 Hard Link啰!如同范例二的情況,添加了 hard link 之后,可以發現使用 ls -l 時,顯示的 link 那一欄屬性添加了!而如果這個時候砍掉 passwd 會發生什么事情呢?passwd-hd 的內容還是會跟原來 passwd 相同,但是 passwd-so 就會找不到該文件啦!
而如果 ln 使用 -s 的參數時,就做成差不多是 Windows 底下的『快捷方式』的意思。當你修改 Linux 下的 symbolic link 文件時,則更動的其實是『原始檔』,所以不論你的這個原始檔被連結到哪里去,只要你修改了連結檔,原始檔就跟著變啰!以上面為例,由于你使用 -s 的參數創建一個名為 passwd-so 的文件,則你修改 passwd-so 時,其內容與 passwd 完全相同,并且,當你按下儲存之后,被改變的將是 passwd 這個文件!
此外,如果你做了底下這樣的連結:
ln -s /bin /root/bin那么如果你進入 /root/bin 這個目錄下,『請注意呦!該目錄其實是 /bin 這個目錄,因為你做了連結檔了!』所以,如果你進入 /root/bin 這個剛剛創建的鏈接目錄,并且將其中的數據殺掉時,嗯! /bin 里面的數據就通通不見了!這點請千萬注意!所以趕緊利用『rm /root/bin 』將這個連結檔刪除吧!
基本上, Symbolic link 的用途比較廣,所以您要特別留意 symbolic link的用法呢!未來一定還會常常用到的啦!
- 關于目錄的 link 數量:
或許您已經發現了,那就是,當我們以 hard link 進行『文件的連結』時,可以發現,在 ls -l 所顯示的第二字段會添加一才對,那么請教,如果創建目錄時,他默認的 link 數量會是多少?讓我們來想一想,一個『空目錄』里面至少會存在些什么?呵呵!就是存在 . 與 .. 這兩個目錄啊!那么,當我們創建一個新目錄名稱為 /tmp/testing 時,基本上會有三個東西,那就是:
- /tmp/testing
- /tmp/testing/.
- /tmp/testing/..
而其中 /tmp/testing 與 /tmp/testing/. 其實是一樣的!都代表該目錄啊~而 /tmp/testing/.. 則代表 /tmp 這個目錄,所以說,當我們創建一個新的目錄時,『新的目錄的 link 數為 2 ,而上一級目錄的 link 數則會添加 1』不信的話,我們來作個測試看看:
| [root@www ~]# ls -ld /tmp drwxrwxrwt 5 root root 4096 Oct 22 14:22 /tmp [root@www ~]# mkdir /tmp/testing1 [root@www ~]# ls -ld /tmp drwxrwxrwt 6 root root 4096 Oct 22 14:37 /tmp [root@www ~]# ls -ld /tmp/testing1 drwxr-xr-x 2 root root 4096 Oct 22 14:37 /tmp/testing1 |
瞧!原本的所謂上一級目錄 /tmp 的 link 數量由 5 添加為 6 ,至于新目錄 /tmp/testing 則為 2 ,這樣可以理解目錄的 link 數量的意義了嗎? ^_^
磁盤的分割、格式化、檢驗與掛載:
對于一個系統管理者( root )而言,磁盤的的管理是相當重要的一環,尤其近來硬盤已經漸漸的被當成是消耗品了..... 如果我們想要在系統里面新增一顆硬盤時,應該有哪些動作需要做的呢:
當然啰,在上述的過程當中,還有很多需要考慮的,例如磁盤分區槽 (partition) 需要定多大?是否需要加入 journal 的功能?inode 與 block 的數量應該如何規劃等等的問題。但是這些問題的決定,都需要與你的主機用途來加以考慮的~所以,在這個小節里面,鳥哥僅會介紹幾個動作而已,更詳細的配置值,則需要以你未來的經驗來參考啰!
磁盤分區: fdisk
| [root@www ~]# fdisk [-l] 裝置名稱 選項與參數: -l :輸出后面接的裝置所有的 partition 內容。若僅有 fdisk -l 時,則系統將會把整個系統內能夠搜尋到的裝置的 partition 均列出來。范例:找出你系統中的根目錄所在磁盤,并查閱該硬盤內的相關信息 [root@www ~]# df / <==注意:重點在找出磁盤文件名而已 Filesystem 1K-blocks Used Available Use% Mounted on /dev/hdc2 9920624 3823168 5585388 41% /[root@www ~]# fdisk /dev/hdc <==仔細看,不要加上數字喔! The number of cylinders for this disk is set to 5005. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs(e.g., DOS FDISK, OS/2 FDISK)Command (m for help): <==等待你的輸入! |
由于每個人的環境都不一樣,因此每部主機的磁盤數量也不相同。所以你可以先使用 df 這個命令找出可用磁盤文件名,然后再用 fdisk 來查閱。在你進入 fdisk 這支程序的工作畫面后,如果您的硬盤太大的話(通常指磁柱數量多于 1024 以上),就會出現如上信息。這個信息僅是在告知你,因為某些舊版的軟件與操作系統并無法支持大于 1024 磁柱 (cylinter) 后的扇區使用,不過我們新版的 Linux 是沒問題啦!底下繼續來看看 fdisk 內如何操作相關動作吧!
| Command (m for help): m <== 輸入 m 后,就會看到底下這些命令介紹 Command actiona toggle a bootable flagb edit bsd disklabelc toggle the dos compatibility flagd delete a partition <==刪除一個partitionl list known partition typesm print this menun add a new partition <==新增一個partitiono create a new empty DOS partition tablep print the partition table <==在屏幕上顯示分割表q quit without saving changes <==不儲存離開fdisk程序s create a new empty Sun disklabelt change a partition's system idu change display/entry unitsv verify the partition tablew write table to disk and exit <==將剛剛的動作寫入分割表x extra functionality (experts only) |
老實說,使用 fdisk 這支程序是完全不需要背命令的!如同上面的表格中,你只要按下 m 就能夠看到所有的動作!比較重要的動作在上面已經用底線畫出來了,你可以參考看看。其中比較不一樣的是『q 與 w』這兩個玩意兒!不管你進行了什么動作,只要離開 fdisk 時按下『q』,那么所有的動作『都不會生效!』相反的,按下『w』就是動作生效的意思。所以,你可以隨便玩 fdisk ,只要離開時按下的是『q』即可。 ^_^!好了,先來看看分割表信息吧!
| Command (m for help): p <== 這里可以輸出目前磁盤的狀態Disk /dev/hdc: 41.1 GB, 41174138880 bytes <==這個磁盤的文件名與容量 255 heads, 63 sectors/track, 5005 cylinders <==磁頭、扇區與磁柱大小 Units = cylinders of 16065 * 512 = 8225280 bytes <==每個磁柱的大小Device Boot Start End Blocks Id System /dev/hdc1 * 1 13 104391 83 Linux /dev/hdc2 14 1288 10241437+ 83 Linux /dev/hdc3 1289 1925 5116702+ 83 Linux /dev/hdc4 1926 5005 24740100 5 Extended /dev/hdc5 1926 2052 1020096 82 Linux swap / Solaris # 裝置文件名 啟動區否 開始磁柱 結束磁柱 1K大小容量 磁盤分區槽內的系統Command (m for help): q # 想要不儲存離開嗎?按下 q 就對了!不要隨便按 w 啊! |
使用『 p 』可以列出目前這顆磁盤的分割表信息,這個信息的上半部在顯示整體磁盤的狀態。以鳥哥這顆磁盤為例,這個磁盤共有 41.1GB 左右的容量,共有 5005 個磁柱,每個磁柱透過 255 個磁頭在管理讀寫,每個磁頭管理 63 個扇區,而每個扇區的大小均為 512bytes ,因此每個磁柱為『 255*63*512 = 16065*512 = 8225280bytes 』。
下半部的分割表信息主要在列出每個分割槽的個別信息項目。每個項目的意義為:
- Device:裝置文件名,依據不同的磁盤接口/分割槽位置而變。
- Boot:是否為啟動引導塊?通常 Windows 系統的 C 需要這塊!
- Start, End:這個分割槽在哪個磁柱號碼之間,可以決定此分割槽的大小;
- Blocks:就是以 1K 為單位的容量。如上所示,/dev/hdc1 大小為104391K = 102MB
- ID, System:代表這個分割槽內的文件系統應該是啥!不過這個項目只是一個提示而已,不見得真的代表此分割槽內的文件系統喔!
從上表我們可以發現幾件事情:
- 整部磁盤還可以進行額外的分割,因為最大磁柱為 5005 ,但只使用到 2052 號而已;
- /dev/hdc5 是由 /dev/hdc4 分割出來的,因為 /dev/hdc4 為 Extended,且 /dev/hdc5 磁柱號碼在 /dev/hdc4 之內;
fdisk 還可以直接秀出系統內的所有 partition 喔!舉例來說,鳥哥剛剛插入一個 U盤 磁盤到這部 Linux 系統中,那該如何觀察 (1)這個磁盤的代號與 (2)這個磁盤的分割槽呢?
| 范例:查閱目前系統內的所有 partition 有哪些? [root@www ~]# fdisk -l Disk /dev/hdc: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System /dev/hdc1 * 1 13 104391 83 Linux /dev/hdc2 14 1288 10241437+ 83 Linux /dev/hdc3 1289 1925 5116702+ 83 Linux /dev/hdc4 1926 5005 24740100 5 Extended /dev/hdc5 1926 2052 1020096 82 Linux swap / SolarisDisk /dev/sda: 8313 MB, 8313110528 bytes 59 heads, 58 sectors/track, 4744 cylinders Units = cylinders of 3422 * 512 = 1752064 bytesDevice Boot Start End Blocks Id System /dev/sda1 1 4745 8118260 b W95 FAT32 |
由上表的信息我們可以看到我有兩顆磁盤,磁盤文件名為『/dev/hdc 與 /dev/sda』,/dev/hdc 已經在上面談過了,至于 /dev/sda 則有 8GB 左右的容量,且全部的磁柱都已經分割給 /dev/sda1 ,該文件系統應該為 Windows 的 FAT 文件系統。這樣很容易查閱到分割方面的信息吧!
這個 fdisk 只有 root 才能運行,此外,請注意,使用的『裝置文件名』請不要加上數字,因為 partition 是針對『整個硬盤裝置』而不是某個 partition 呢!所以運行『 fdisk /dev/hdc1 』就會發生錯誤啦!要使用 fdisk /dev/hdc 才對!那么我們知道可以利用 fdisk 來查閱硬盤的 partition 信息外,底下再來說一說進入 fdisk 之后的幾個常做的工作!
| Tips: 再次強調,你可以使用 fdisk 在您的硬盤上面胡搞瞎搞的進行實際操作,都不打緊,但是請『千萬記住,不要按下 w 即可!』離開的時候按下 q 就萬事無妨啰! |
- 刪除磁盤分區槽
如果你是按照鳥哥建議的方式去安裝你的 CentOS ,那么你的磁盤應該會預留一塊容量來做練習的。實際練習新增硬盤之前,我們先來玩一玩恐怖的刪除好了~如果想要測試一下如何將你的 /dev/hdc 全部的分割槽刪除,應該怎么做?
| # 練習一: 先進入 fdisk 的畫面當中去! [root@www ~]# fdisk /dev/hdc# 練習二: 先看看整個分割表的情況是如何 Command (m for help): pDisk /dev/hdc: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System /dev/hdc1 * 1 13 104391 83 Linux /dev/hdc2 14 1288 10241437+ 83 Linux /dev/hdc3 1289 1925 5116702+ 83 Linux /dev/hdc4 1926 5005 24740100 5 Extended /dev/hdc5 1926 2052 1020096 82 Linux swap / Solaris# 練習三: 按下 d 給他刪除吧! Command (m for help): d Partition number (1-5): 4Command (m for help): d Partition number (1-4): 3Command (m for help): pDisk /dev/hdc: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System /dev/hdc1 * 1 13 104391 83 Linux /dev/hdc2 14 1288 10241437+ 83 Linux # 因為 /dev/hdc5 是由 /dev/hdc4 所衍生出來的邏輯分割槽,因此 /dev/hdc4 被刪除, # /dev/hdc5 就自動不見了!最終就會剩下兩個分割槽而已喔!Command (m for help): q # 鳥哥這里僅是做一個練習而已,所以,按下 q 就能夠離開啰~ |
- 練習新增磁盤分區槽
新增磁盤分區槽有好多種情況,因為新增 Primary / Extended / Logical 的顯示結果都不太相同。底下我們先將 /dev/hdc 全部刪除成為干凈未分割的磁盤,然后依序新增給大家瞧瞧!
| # 練習一: 進入 fdisk 的分割軟件畫面中,并刪除所有分割槽: [root@www ~]# fdisk /dev/hdc Command (m for help): d Partition number (1-5): 4Command (m for help): d Partition number (1-4): 3Command (m for help): d Partition number (1-4): 2Command (m for help): d Selected partition 1 # 由于最后僅剩下一個 partition ,因此系統主動選取這個 partition 刪除去!# 練習二: 開始新增,我們先新增一個 Primary 的分割槽,且指定為 4 號看看! Command (m for help): n Command action <==因為是全新磁盤,因此只會問extended/primary而已e extendedp primary partition (1-4) p <==選擇 Primary 分割槽 Partition number (1-4): 4 <==配置為 4 號! First cylinder (1-5005, default 1): <==直接按下[enter]按鍵決定! Using default value 1 <==啟始磁柱就選用默認值! Last cylinder or +size or +sizeM or +sizeK (1-5005, default 5005): +512M # 這個地方有趣了!我們知道 partition 是由 n1 到 n2 的磁柱號碼 (cylinder), # 但磁柱的大小每顆磁盤都不相同,這個時候可以填入 +512M 來讓系統自動幫我們找出 # 『最接近 512M 的那個 cylinder 號碼』!因為不可能剛好等于 512MBytes 啦! # 如上所示:這個地方輸入的方式有兩種: # 1) 直接輸入磁柱的號碼,你得要自己計算磁柱/分割槽的大小才行; # 2) 用 +XXM 來輸入分割槽的大小,讓系統自己捉磁柱的號碼。 # +與M是必須要有的,XX為數字Command (m for help): pDisk /dev/hdc: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System /dev/hdc4 1 63 506016 83 Linux # 注意!只有 4 號! 1 ~ 3 保留下來了! |
| # 練習三: 繼續新增一個,這次我們新增 Extended 的分割槽好了! Command (m for help): n Command actione extendedp primary partition (1-4) e <==選擇的是 Extended 喔! Partition number (1-4): 1 First cylinder (64-5005, default 64): <=[enter] Using default value 64 Last cylinder or +size or +sizeM or +sizeK (64-5005, default 5005): <=[enter] Using default value 5005 # 還記得我們在第三章的磁盤分區表曾經談到過的,擴展分配最好能夠包含所有 # 未分割的區間;所以在這個練習中,我們將所有未配置的磁柱都給了這個分割槽喔! # 所以在開始/結束磁柱的位置上,按下兩個[enter]用默認值即可!Command (m for help): pDisk /dev/hdc: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System /dev/hdc1 64 5005 39696615 5 Extended /dev/hdc4 1 63 506016 83 Linux # 如上所示,所有的磁柱都在 /dev/hdc1 里面啰! |
| # 練習四: 這次我們隨便新增一個 2GB 的分割槽看看! Command (m for help): n Command actionl logical (5 or over) <==因為已有 extended ,所以出現 logical 分割槽p primary partition (1-4) p <==偷偷玩一下,能否新增主要分割槽 Partition number (1-4): 2 No free sectors available <==肯定不行!因為沒有多余的磁柱可供配置Command (m for help): n Command actionl logical (5 or over)p primary partition (1-4) l <==乖乖使用邏輯分割槽吧! First cylinder (64-5005, default 64): <=[enter] Using default value 64 Last cylinder or +size or +sizeM or +sizeK (64-5005, default 5005): +2048MCommand (m for help): pDisk /dev/hdc: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System /dev/hdc1 64 5005 39696615 5 Extended /dev/hdc4 1 63 506016 83 Linux /dev/hdc5 64 313 2008093+ 83 Linux # 這樣就新增了 2GB 的分割槽,且由于是 logical ,所以由 5 號開始! Command (m for help): q # 鳥哥這里僅是做一個練習而已,所以,按下 q 就能夠離開啰~ |
上面的練習非常重要!您得要自行練習一下比較好!注意,不要按下 w 喔!會讓你的系統損毀的!由上面的一連串練習中,最重要的地方其實就在于創建分割槽的形式( primary/extended/logical)以及分割槽的大小了!一般來說創建分割槽的形式會有底下的數種狀況:
- 1-4 號尚有剩余,且系統未有 extended:
此時會出現讓你挑選 Primary / Extended 的項目,且你可以指定 1~4 號間的號碼;
- 1-4 號尚有剩余,且系統有 extended:
此時會出現讓你挑選 Primary / Logical 的項目;若選擇 p 則你還需要指定 1~4 號間的號碼;若選擇 l(L的小寫) 則不需要配置號碼,因為系統會自動指定邏輯分割槽的文件名號碼;
- 1-4 沒有剩余,且系統有 extended:
此時不會讓你挑選分割槽類型,直接會進入 logical 的分割槽形式。
例題: 請依照你的系統情況,創建一個大約 1GB 左右的分割槽,并顯示該分割槽的相關信息: 答: 鳥哥的磁盤為 /dev/hdc ,尚有剩余磁柱號碼,因此可以這樣做:
|
如上的練習中,最終寫入分割表后竟然會讓核心無法捉到分割表信息!此時你可以直接使用 reboot 來處理,也可以使用 GNU 推出的工具程序來處置,那就是 partprobe 這個命令。這個命令的運行很簡單,他僅是告知核心必須要讀取新的分割表而已,因此并不會在屏幕上出現任何信息才是!這樣一來,我們就不需要 reboot 啰!
- 操作環境的說明
以 root 的身份進行硬盤的 partition 時,最好是在單人維護模式底下比較安全一些,此外,在進行 fdisk 的時候,如果該硬盤某個 partition 還在使用當中,那么很有可能系統核心會無法重載硬盤的 partition table ,解決的方法就是將該使用中的 partition 給他卸除,然后再重新進入 fdisk 一遍,重新寫入 partition table ,那么就可以成功啰!
- 注意事項:
另外在實作過程中請特別注意,因為 SATA 硬盤最多能夠支持到 15 號的分割槽, IDE 則可以支持到 63 號。但目前大家常見的系統都是 SATA 磁盤,因此在練習的時候千萬不要讓你的分割槽超過 15 號!否則即使你還有剩余的磁柱容量,但還是會無法繼續進行分割的喔!
另外需要特別留意的是,fdisk 沒有辦法處理大于 2TB 以上的磁盤分區槽!這個問題比較嚴重!因為雖然 Ext3 文件系統已經支持達到 16TB 以上的磁盤,但是分割命令卻無法支持。時至今日(2009)所有的硬件價格大跌,硬盤也已經出到單顆 1TB 之譜,若加上磁盤陣列 (RAID) ,高于 2TB 的磁盤系統應該會很常見!此時你就得使用parted 這個命令了!我們會在本章最后談一談這個命令的用法。
磁盤格式化
分割完畢后自然就是要進行文件系統的格式化啰!格式化的命令非常的簡單,那就是『make filesystem, mkfs』這個命令啦!這個命令其實是個綜合的命令,他會去呼叫正確的文件系統格式化工具軟件!不啰唆,讓我們來瞧瞧吧!
- mkfs
| [root@www ~]# mkfs [-t 文件系統格式] 裝置文件名 選項與參數: -t :可以接文件系統格式,例如 ext3, ext2, vfat 等(系統有支持才會生效)范例一:請將上個小節當中所制作出來的 /dev/hdc6 格式化為 ext3 文件系統 [root@www ~]# mkfs -t ext3 /dev/hdc6 mke2fs 1.39 (29-May-2006) Filesystem label= <==這里指的是分割槽的名稱(label) OS type: Linux Block size=4096 (log=2) <==block 的大小配置為 4K Fragment size=4096 (log=2) 251392 inodes, 502023 blocks <==由此配置決定的inode/block數量 25101 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=515899392 16 block groups 32768 blocks per group, 32768 fragments per group 15712 inodes per group Superblock backups stored on blocks:32768, 98304, 163840, 229376, 294912Writing inode tables: done Creating journal (8192 blocks): done <==有日志記錄 Writing superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 34 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. # 這樣就創建起來我們所需要的 Ext3 文件系統了!簡單明了![root@www ~]# mkfs[tab][tab] mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.msdos mkfs.vfat # 按下兩個[tab],會發現 mkfs 支持的文件格式如上所示!可以格式化 vfat 喔! |
mkfs 其實是個綜合命令而已,事實上如同上表所示,當我們使用『 mkfs -t ext3 ...』時,系統會去呼叫 mkfs.ext3 這個命令來進行格式化的動作啦!若如同上表所展現的結果,那么鳥哥這個系統支持的文件系統格式化工具有『cramfs, ext2, ext3, msdoc, vfat』等,而最常用的應該是 ext3, vfat 兩種啦! vfat 可以用在 Windows/Linux 共享的 U盤 閃盤啰。
| 例題: 將剛剛的 /dev/hdc6 格式化為 Windows 可讀的 vfat 格式吧! 答: mkfs -t vfat /dev/hdc6 |
在格式化為 Ext3 的范例中,我們可以發現結果里面含有非常多的信息,由于我們沒有詳細指定文件系統的細部項目,因此系統會使用默認值來進行格式化。其中比較重要的部分為:文件系統的標頭(Label)、Block的大小以及 inode 的數量。如果你要指定這些東西,就得要了解一下 Ext2/Ext3 的公用程序,亦即 mke2fs 這個命令啰!
- mke2fs
| [root@www ~]# mke2fs [-b block大小] [-i block大小] [-L 標頭] [-cj] 裝置 選項與參數: -b :可以配置每個 block 的大小,目前支持 1024, 2048, 4096 bytes 三種; -i :多少容量給予一個 inode 呢? -c :檢查磁盤錯誤,僅下達一次 -c 時,會進行快速讀取測試;如果下達兩次 -c -c 的話,會測試讀寫(read-write),會很慢~ -L :后面可以接標頭名稱 (Label),這個 label 是有用的喔!e2label命令介紹會談到~ -j :本來 mke2fs 是 EXT2 ,加上 -j 后,會主動加入 journal 而成為 EXT3。 |
mke2fs 是一個很詳細但是很麻煩的命令!因為里面的細部配置太多了!現在我們進行如下的假設:
- 這個文件系統的標頭配置為:vbird_logical
- 我的 block 指定為 2048 大小;
- 每 8192 bytes 分配一個 inode ;
- 建置為 journal 的 Ext3 文件系統。
開始格式化 /dev/hdc6 結果會變成如下所示:
| [root@www ~]# mke2fs -j -L "vbird_logical" -b 2048 -i 8192 /dev/hdc6 mke2fs 1.39 (29-May-2006) Filesystem label=vbird_logical OS type: Linux Block size=2048 (log=1) Fragment size=2048 (log=1) 251968 inodes, 1004046 blocks 50202 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=537919488 62 block groups 16384 blocks per group, 16384 fragments per group 4064 inodes per group Superblock backups stored on blocks:16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done # 比較看看,跟上面的范例用默認值的結果,有什么不一樣的啊? |
其實 mke2fs 所使用的各項選項/參數也可以用在『 mkfs -t ext3 ... 』后面,因為最終使用的公用程序是相同的啦!特別要注意的是 -b, -i 及 -j 這幾個選項,尤其是 -j 這個選項,當沒有指定 -j 的時候, mke2fs 使用 ext2 為格式化文件格式,若加入 -j 時,則格式化為 ext3 這個 Journaling 的 filesystem 呦!
老實說,如果沒有特殊需求的話,使用『 mkfs -t ext3....』不但容易記憶,而且就非常好用啰!
磁盤檢驗: fsck, badblocks
由于系統在運行時誰也說不準啥時硬件或者是電源會有問題,所以『死機』可能是難免的情況(不管是硬件還是軟件)。現在我們知道文件系統運行時會有硬盤與內存數據異步的狀況發生,因此莫名其妙的死機非常可能導致文件系統的錯亂。問題來啦,如果文件系統真的發生錯亂的話,那該如何是好?就...挽救啊!此時那個好用的 filesystem check, fsck 就得拿來仔細瞧瞧啰。
- fsck
| [root@www ~]# fsck [-t 文件系統] [-ACay] 裝置名稱 選項與參數: -t :如同 mkfs 一樣,fsck 也是個綜合軟件而已!因此我們同樣需要指定文件系統。不過由于現今的 Linux 太聰明了,他會自動的透過 superblock 去分辨文件系統,因此通常可以不需要這個選項的啰!請看后續的范例說明。 -A :依據 /etc/fstab 的內容,將需要的裝置掃瞄一次。/etc/fstab 于下一小節說明,通常啟動過程中就會運行此一命令了。 -a :自動修復檢查到的有問題的扇區,所以你不用一直按 y 啰! -y :與 -a 類似,但是某些 filesystem 僅支持 -y 這個參數! -C :可以在檢驗的過程當中,使用一個直方圖來顯示目前的進度!EXT2/EXT3 的額外選項功能:(e2fsck 這支命令所提供) -f :強制檢查!一般來說,如果 fsck 沒有發現任何 unclean 的旗標,不會主動進入細部檢查的,如果您想要強制 fsck 進入細部檢查,就得加上 -f 旗標啰! -D :針對文件系統下的目錄進行優化配置。范例一:強制的將前面我們創建的 /dev/hdc6 這個裝置給他檢驗一下! [root@www ~]# fsck -C -f -t ext3 /dev/hdc6 fsck 1.39 (29-May-2006) e2fsck 1.39 (29-May-2006) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information vbird_logical: 11/251968 files (9.1% non-contiguous), 36926/1004046 blocks # 如果沒有加上 -f 的選項,則由于這個文件系統不曾出現問題, # 檢查的經過非常快速!若加上 -f 強制檢查,才會一項一項的顯示過程。范例二:系統有多少文件系統支持的 fsck 軟件? [root@www ~]# fsck[tab][tab] fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.msdos fsck.vfat |
這是用來檢查與修正文件系統錯誤的命令。注意:通常只有身為 root 且你的文件系統有問題的時候才使用這個命令,否則在正常狀況下使用此一命令,可能會造成對系統的危害!通常使用這個命令的場合都是在系統出現極大的問題,導致你在 Linux 啟動的時候得進入單人單機模式下進行維護的行為時,才必須使用此一命令!
另外,如果你懷疑剛剛格式化成功的硬盤有問題的時后,也可以使用 fsck 來檢查一硬盤呦!其實就有點像是 Windows 的 scandisk 啦!此外,由于 fsck 在掃瞄硬盤的時候,可能會造成部分 filesystem 的損壞,所以『運行 fsck 時,被檢查的 partition 務必不可掛載到系統上!亦即是需要在卸除的狀態喔!』
不知道你還記不記得第六章的目錄配置中我們提過,ext2/ext3 文件系統的最頂層(就是掛載點那個目錄底下)會存在一個『lost+found』的目錄吧!該目錄就是在當你使用 fsck 檢查文件系統后,若出現問題時,有問題的數據會被放置到這個目錄中喔!所以理論上這個目錄不應該會有任何數據,若系統自動產生數據在里面,那...你就得特別注意你的文件系統啰!
另外,我們的系統實際運行的 fsck 命令,其實是呼叫 e2fsck 這個軟件啦!可以 man e2fsck 找到更多的選項輔助喔!
- badblocks
| [root@www ~]# badblocks -[svw] 裝置名稱 選項與參數: -s :在屏幕上列出進度 -v :可以在屏幕上看到進度 -w :使用寫入的方式來測試,建議不要使用此一參數,尤其是待檢查的裝置已有文件時![root@www ~]# badblocks -sv /dev/hdc6 Checking blocks 0 to 2008093 Checking for bad blocks (read-only test): done Pass completed, 0 bad blocks found. |
剛剛談到的 fsck 是用來檢驗文件系統是否出錯,至于 badblocks 則是用來檢查硬盤或軟盤扇區有沒有壞軌的命令!由于這個命令其實可以透過『 mke2fs -c 裝置文件名 』在進行格式化的時候處理磁盤表面的讀取測試,因此目前大多不使用這個命令啰!
磁盤掛載與卸除
我們在本章一開始時的掛載點的意義當中提過掛載點是目錄,而這個目錄是進入磁盤分區槽(其實是文件系統啦!)的入口就是了。不過要進行掛載前,你最好先確定幾件事:
- 單一文件系統不應該被重復掛載在不同的掛載點(目錄)中;
- 單一目錄不應該重復掛載多個文件系統;
- 要作為掛載點的目錄,理論上應該都是空目錄才是。
尤其是上述的后兩點!如果你要用來掛載的目錄里面并不是空的,那么掛載了文件系統之后,原目錄下的東西就會暫時的消失。舉個例子來說,假設你的 /home 原本與根目錄 (/) 在同一個文件系統中,底下原本就有 /home/test 與 /home/vbird 兩個目錄。然后你想要加入新的硬盤,并且直接掛載 /home 底下,那么當你掛載上新的分割槽時,則 /home 目錄顯示的是新分割槽內的數據,至于原先的 test 與 vbird 這兩個目錄就會暫時的被隱藏掉了!注意喔!并不是被覆蓋掉,而是暫時的隱藏了起來,等到新分割槽被卸除之后,則 /home 原本的內容就會再次的跑出來啦!
而要將文件系統掛載到我們的 Linux 系統上,就要使用 mount 這個命令啦!不過,這個命令真的是博大精深~粉難啦!我們學簡單一點啊~ ^_^
| [root@www ~]# mount -a [root@www ~]# mount [-l] [root@www ~]# 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 asyncremount: 重新掛載,這在系統出錯,或重新升級參數時,很有用! |
會不會覺得光是看這個命令的細部選項就快要昏倒了?如果有興趣的話看一下 man mount ,那才會真的昏倒的。事實上 mount 是個很萬用的命令,他可以掛載 ext3/vfat/nfs 等文件系統,由于每種文件系統的數據并不相同,想當然爾,詳細的參數與選項自然也就不相同啦!不過實際應用時卻簡單的會讓你想笑呢!看看底下的幾個簡單范例先!
- 掛載Ext2/Ext3文件系統
| 范例一:用默認的方式,將剛剛創建的 /dev/hdc6 掛載到 /mnt/hdc6 上面! [root@www ~]# mkdir /mnt/hdc6 [root@www ~]# mount /dev/hdc6 /mnt/hdc6 [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on .....中間省略..... /dev/hdc6 1976312 42072 1833836 3% /mnt/hdc6 # 看起來,真的有掛載!且文件大小約為 2GB 左右啦! |
瞎密?竟然這么簡單!利用『mount 裝置文件名 掛載點』就能夠順利的掛載了!真是方便啊!為什么可以這么方便呢(甚至不需要使用 -t 這個選項)?由于文件系統幾乎都有 superblock ,我們的 Linux 可以透過分析 superblock 搭配 Linux 自己的驅動程序去測試掛載,如果成功的套和了,就立刻自動的使用該類型的文件系統掛載起來啊!那么系統有沒有指定哪些類型的 filesystem 才需要進行上述的掛載測試呢?主要是參考底下這兩個文件:
- /etc/filesystems:系統指定的測試掛載文件系統類型;
- /proc/filesystems:Linux系統已經加載的文件系統類型。
那我怎么知道我的 Linux 有沒有相關文件系統類型的驅動程序呢?我們 Linux 支持的文件系統之驅動程序都寫在如下的目錄中:
- /lib/modules/$(uname -r)/kernel/fs/
例如 vfat 的驅動程序就寫在『/lib/modules/$(uname -r)/kernel/fs/vfat/』這個目錄下啦!簡單的測試掛載后,接下來讓我們檢查看看目前已掛載的文件系統狀況吧!
| 范例二:觀察目前『已掛載』的文件系統,包含各文件系統的Label名稱 [root@www ~]# mount -l /dev/hdc2 on / type ext3 (rw) [/1] proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/hdc3 on /home type ext3 (rw) [/home] /dev/hdc1 on /boot type ext3 (rw) [/boot] tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) /dev/hdc6 on /mnt/hdc6 type ext3 (rw) [vbird_logical] # 除了實際的文件系統外,很多特殊的文件系統(proc/sysfs...)也會被顯示出來! # 值得注意的是,加上 -l 選項可以列出如上特殊字體的標頭(label)喔 |
這個命令輸出的結果可以讓我們看到非常多信息,以 /dev/hdc2 這個裝置來說好了(上面表格的第一行),他的意義是:『/dev/hdc2 是掛載到 / 目錄,文件系統類型為 ext3,且掛載為可擦寫 (rw) ,另外,這個 filesystem 有標頭,名字(label)為 /1 』這樣,你會解釋上述表格中的最后一行輸出結果了嗎?自己解釋一下先。^_^。接下來請拿出你的 CentOS DVD 放入光驅中,并拿 FAT 格式的 U盤 閃盤(不要用 NTFS 的)插入 U盤 插槽中,我們來測試掛載一下!
- 掛載 CD 或 DVD 光盤
| 范例三:將你用來安裝 Linux 的 CentOS 原版光盤拿出來掛載! [root@www ~]# mkdir /media/cdrom [root@www ~]# mount -t iso9660 /dev/cdrom /media/cdrom [root@www ~]# mount /dev/cdrom /media/cdrom # 你可以指定 -t iso9660 這個光盤片的格式來掛載,也可以讓系統自己去測試掛載! # 所以上述的命令只要做一個就夠了!但是目錄的創建初次掛載時必須要進行喔![root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on .....中間省略..... /dev/hdd 4493152 4493152 0 100% /media/cdrom # 因為我的光驅使用的是 /dev/hdd 的 IDE 接口之故! |
光驅一掛載之后就無法退出光盤片了!除非你將他卸除才能夠退出!從上面的數據你也可以發現,因為是光盤嘛!所以磁盤使用率達到 100% ,因為你無法直接寫入任何數據到光盤當中ㄇㄟ!另外,其實 /dev/cdrom 是個鏈接文件,正確的磁盤文件名得要看你的光驅是什么連接接口的環境。以鳥哥為例,我的光驅接在 /dev/hdd,所以正確的掛載應該是『mount /dev/hdd /media/cdrom』比較正確喔!
| Tips: 話說當時年紀小 (其實是剛接觸 Linux 的那一年),摸 Linux 到處碰壁!連將 CDROM 掛載后,光驅竟然都不讓我退片!那個時候難過的要死!解決的方法竟然是『重新啟動!』囧的可以啊! |
- 格式化與掛載軟盤
軟盤的格式化可以直接使用 mkfs 即可。但是軟盤也是可以格式化成為 ext3 或 vfat 格式的。掛載的時候我們同樣的使用系統自動測試掛載即可!真是粉簡單!如果你有軟盤片的話(很少人有了吧?),請先放置到軟盤驅動器當中啰!底下來測試看看(軟盤片請勿放置任何數據,且將寫保護打開!)。
| 范例四:格式化后掛載軟盤到 /media/floppy/ 目錄中。 [root@www ~]# mkfs -t vfat /dev/fd0 # 我們格式化軟盤成為 Windows/Linux 可共同使用的 FAT 格式吧! [root@www ~]# mkdir /media/floppy [root@www ~]# mount -t vfat /dev/fd0 /media/floppy [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on .....中間省略..... /dev/fd0 1424 164 1260 12% /media/floppy |
與光驅不同的是,你掛載了軟盤后竟然還是可以退出軟盤喔!不過,如此一來你的文件系統將會有莫名奇妙的問題發生!整個 Linux 最重要的就是文件系統,而文件系統是直接掛載到目錄樹上頭,幾乎任何命令都會或多或少使用到目錄樹的數據,因此你當然不可以隨意的將光盤/軟盤拿出來!所以,軟盤也請卸除之后再退出!很重要的一點!
- 掛載閃盤
請拿出你的閃盤并插入 Linux 主機的 U盤 槽中!注意,你的這個閃盤不能夠是 NTFS 的文件系統喔!接下來讓我們測試測試吧!
| 范例五:找出你的閃盤裝置文件名,并掛載到 /mnt/flash 目錄中 [root@www ~]# fdisk -l .....中間省略..... Disk /dev/sda: 8313 MB, 8313110528 bytes 59 heads, 58 sectors/track, 4744 cylinders Units = cylinders of 3422 * 512 = 1752064 bytesDevice Boot Start End Blocks Id System /dev/sda1 1 4745 8118260 b W95 FAT32 # 從上的特殊字體,可得知磁盤的大小以及裝置文件名,知道是 /dev/sda1 [root@www ~]# mkdir /mnt/flash [root@www ~]# mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on .....中間省略..... /dev/sda1 8102416 4986228 3116188 62% /mnt/flash |
如果帶有中文文件名的數據,那么可以在掛載時指定一下掛載文件系統所使用的語系數據。在 man mount 找到 vfat 文件格式當中可以使用 iocharset 來指定語系,而中文語系是 cp950 ,所以也就有了上述的掛載命令項目啰。
萬一你使用的是隨身硬盤,也就是利用筆記型計算機所做出來的U盤磁盤時,通常這樣的硬盤都使用 NTFS 格式的~怎辦?沒關系,可以參考底下這個網站:(注8)
- NTFS 文件系統官網:Linux-NTFS Project: http://www.linux-ntfs.org/
- CentOS 5.x 版的相關驅動程序下載頁面:http://www.linux-ntfs.org/doku.php?id=redhat:rhel5
將她們提供的驅動程序捉下來并且安裝之后,就能夠使用 NTFS 的文件系統了!只是由于文件系統與 Linux 核心有很大的關系,因此以后如果你的 Linux 系統有升級 (update) 時,你就得要重新下載一次相對應的驅動程序版本喔!
- 重新掛載根目錄與掛載不特定目錄
整個目錄樹最重要的地方就是根目錄了,所以根目錄根本就不能夠被卸除的!問題是,如果你的掛載參數要改變,或者是根目錄出現『只讀』狀態時,如何重新掛載呢?最可能的處理方式就是重新啟動 (reboot)!不過你也可以這樣做:
| 范例六:將 / 重新掛載,并加入參數為 rw 與 auto [root@www ~]# mount -o remount,rw,auto / |
重點是那個『 -o remount,xx 』的選項與參數!請注意,要重新掛載 (remount) 時,這是個非常重要的機制!尤其是當你進入單人維護模式時,你的根目錄常會被系統掛載為只讀,這個時候這個命令就太重要了!
另外,我們也可以利用 mount 來將某個目錄掛載到另外一個目錄去喔!這并不是掛載文件系統,而是額外掛載某個目錄的方法!雖然底下的方法也可以使用 symbolic link 來連結,不過在某些不支持符號鏈接的程序運行中,還是得要透過這樣的方法才行。
| 范例七:將 /home 這個目錄暫時掛載到 /mnt/home 底下: [root@www ~]# mkdir /mnt/home [root@www ~]# mount --bind /home /mnt/home [root@www ~]# ls -lid /home/ /mnt/home 2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home/ 2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /mnt/home[root@www ~]# mount -l /home on /mnt/home type none (rw,bind) |
看起來,其實兩者連結到同一個 inode 嘛! ^_^ 沒錯啦!透過這個 mount --bind 的功能,您可以將某個目錄掛載到其他目錄去喔!而并不是整塊 filesystem 的啦!所以從此進入 /mnt/home 就是進入 /home 的意思喔!
- umount (將裝置文件卸除)
| [root@www ~]# umount [-fn] 裝置文件名或掛載點 選項與參數: -f :強制卸除!可用在類似網絡文件系統 (NFS) 無法讀取到的情況下; -n :不升級 /etc/mtab 情況下卸除。 |
就是直接將已掛載的文件系統給他卸除即是!卸除之后,可以使用 df 或 mount -l 看看是否還存在目錄樹中?卸除的方式,可以下達裝置文件名或掛載點,均可接受啦!底下的范例做看看吧!
| 范例八:將本章之前自行掛載的文件系統全部卸除: [root@www ~]# mount .....前面省略..... /dev/hdc6 on /mnt/hdc6 type ext3 (rw) /dev/hdd on /media/cdrom type iso9660 (rw) /dev/sda1 on /mnt/flash type vfat (rw,iocharset=cp950) /home on /mnt/home type none (rw,bind) # 先找一下已經掛載的文件系統,如上所示,特殊字體即為剛剛掛載的裝置啰![root@www ~]# umount /dev/hdc6 <==用裝置文件名來卸除 [root@www ~]# umount /media/cdrom <==用掛載點來卸除 [root@www ~]# umount /mnt/flash <==因為掛載點比較好記憶! [root@www ~]# umount /dev/fd0 <==用裝置文件名較好記! [root@www ~]# umount /mnt/home <==一定要用掛載點!因為掛載的是目錄 |
由于通通卸除了,此時你才可以退出光盤片、軟盤片、U盤閃盤等設備喔!如果你遇到這樣的情況:
| [root@www ~]# mount /dev/cdrom /media/cdrom [root@www ~]# cd /media/cdrom [root@www cdrom]# umount /media/cdrom umount: /media/cdrom: device is busy umount: /media/cdrom: device is busy |
由于你目前正在 /media/cdrom/ 的目錄內,也就是說其實『你正在使用該文件系統』的意思!所以自然無法卸除這個裝置!那該如何是好?就『離開該文件系統的掛載點』即可。以上述的案例來說,你可以使用『 cd / 』回到根目錄,就能夠卸除 /media/cdrom 啰!簡單吧!
- 使用 Label name 進行掛載的方法
除了磁盤的裝置文件名之外,其實我們可以使用文件系統的標頭(label)名稱來掛載喔!舉例來說,我們剛剛卸除的 /dev/hdc6 標頭名稱是『vbird_logical』,你也可以使用dumpe2fs這個命令來查詢一下啦!然后就這樣做即可:
| 范例九:找出 /dev/hdc6 的 label name,并用 label 掛載到 /mnt/hdc6 [root@www ~]# dumpe2fs -h /dev/hdc6 Filesystem volume name: vbird_logical .....底下省略..... # 找到啦!標頭名稱為 vbird_logical 啰![root@www ~]# mount -L "vbird_logical" /mnt/hdc6 |
這種掛載的方法有一個很大的好處:『系統不必知道該文件系統所在的接口與磁盤文件名!』更詳細的說明我們會在下一小節當中的e2label 介紹的!
磁盤參數修訂
某些時刻,你可能會希望修改一下目前文件系統的一些相關信息,舉例來說,你可能要修改 Label name ,或者是 journal 的參數,或者是其他硬盤運行時的相關參數 (例如 DMA 啟動與否~)。這個時候,就得需要底下這些相關的命令功能啰~
- mknod
還記得我們說過,在 Linux 底下所有的裝置都以文件來代表吧!但是那個文件如何代表該裝置呢?很簡單!就是透過文件的 major 與 minor 數值來替代的~所以,那個 major 與 minor 數值是有特殊意義的,不是隨意配置的喔!舉例來說,在鳥哥的這個測試機當中,那個用到的磁盤 /dev/hdc 的相關裝置代碼如下:
| [root@www ~]# ll /dev/hdc* brw-r----- 1 root disk 22, 0 Oct 24 15:55 /dev/hdc brw-r----- 1 root disk 22, 1 Oct 20 08:47 /dev/hdc1 brw-r----- 1 root disk 22, 2 Oct 20 08:47 /dev/hdc2 brw-r----- 1 root disk 22, 3 Oct 20 08:47 /dev/hdc3 brw-r----- 1 root disk 22, 4 Oct 24 16:02 /dev/hdc4 brw-r----- 1 root disk 22, 5 Oct 20 16:46 /dev/hdc5 brw-r----- 1 root disk 22, 6 Oct 25 01:33 /dev/hdc6 |
上表當中 22 為主要裝置代碼 (Major) 而 0~6 則為次要裝置代碼 (Minor)。我們的 Linux 核心認識的裝置數據就是透過這兩個數值來決定的!舉例來說,常見的硬盤文件名 /dev/hda 與 /dev/sda 裝置代碼如下所示:
| 磁盤文件名 | Major | Minor |
| /dev/hda | 3 | 0~63 |
| /dev/hdb | 3 | 64~127 |
| /dev/sda | 8 | 0-15 |
| /dev/sdb | 8 | 16-31 |
如果你想要知道更多核心支持的硬件裝置代碼 (major, minor) 請參考官網的連結(注9):
- http://www.kernel.org/pub/linux/docs/device-list/devices.txt
基本上,Linux 核心 2.6 版以后,硬件文件名已經都可以被系統自動的實時產生了,我們根本不需要手動創建裝置文件。不過某些情況底下我們可能還是得要手動處理裝置文件的,例如在某些服務被關到特定目錄下時(chroot),就需要這樣做了。此時這個 mknod 就得要知道如何操作才行!
| [root@www ~]# mknod 裝置文件名 [bcp] [Major] [Minor] 選項與參數: 裝置種類:b :配置裝置名稱成為一個周邊儲存設備文件,例如硬盤等;c :配置裝置名稱成為一個周邊輸入設備文件,例如鼠標/鍵盤等;p :配置裝置名稱成為一個 FIFO 文件; Major :主要裝置代碼; Minor :次要裝置代碼;范例一:由上述的介紹我們知道 /dev/hdc10 裝置代碼 22, 10,請創建并查閱此裝置 [root@www ~]# mknod /dev/hdc10 b 22 10 [root@www ~]# ll /dev/hdc10 brw-r--r-- 1 root root 22, 10 Oct 26 23:57 /dev/hdc10 # 上面那個 22 與 10 是有意義的,不要隨意配置啊!范例二:創建一個 FIFO 文件,檔名為 /tmp/testpipe [root@www ~]# mknod /tmp/testpipe p [root@www ~]# ll /tmp/testpipe prw-r--r-- 1 root root 0 Oct 27 00:00 /tmp/testpipe # 注意啊!這個文件可不是一般文件,不可以隨便就放在這里! # 測試完畢之后請刪除這個文件吧!看一下這個文件的類型!是 p 喔!^_^ |
- e2label
我們在 mkfs 命令介紹時有談到配置文件系統標頭 (Label) 的方法。那如果格式化完畢后想要修改標頭呢?就用這個 e2label 來修改了。那什么是 Label 呢?我們拿你曾用過的 Windows 系統來說明。當你打開『文件總管』時,C/D等槽不是都會有個名稱嗎?那就是 label (如果沒有配置名稱,就會顯示『本機磁盤驅動器』的字樣)
這個東西除了有趣且可以讓你知道磁盤的內容是啥玩意兒之外,也會被使用到一些配置文件案當中!舉例來說,剛剛我們聊到的磁盤的掛載時,不就有用到 Label name 來進行掛載嗎?目前 CentOS 的配置文件,也就是那個 /etc/fstab 文件的配置都默認使用 Label name 呢!那這樣做有什么好處與缺點呢?
- 優點:不論磁盤文件名怎么變,不論你將硬盤插在哪個 IDE / SATA 接口,由于系統是透過 Label ,所以,磁盤插在哪個接口將不會有影響;
- 缺點:如果插了兩顆硬盤,剛好兩顆硬盤的 Label 有重復的,那就慘了~因為系統可能會無法判斷哪個磁盤分區槽才是正確的!
鳥哥一直是個比較『硬派』作風,所以我還是比較喜歡直接利用磁盤文件名來掛載啦!不過,如果沒有特殊需求的話,那么利用 Label 來掛載也成!但是你就不可以隨意修改 Label 的名稱了!
| [root@www ~]# e2label 裝置名稱 新的Label名稱范例一:將 /dev/hdc6 的標頭改成 my_test 并觀察是否修改成功? [root@www ~]# dumpe2fs -h /dev/hdc6 Filesystem volume name: vbird_logical <==原本的標頭名稱 .....底下省略.....[root@www ~]# e2label /dev/hdc6 "my_test" [root@www ~]# dumpe2fs -h /dev/hdc6 Filesystem volume name: my_test <==改過來啦! .....底下省略..... |
- tune2fs
| [root@www ~]# tune2fs [-jlL] 裝置代號 選項與參數: -l :類似 dumpe2fs -h 的功能~將 superblock 內的數據讀出來~ -j :將 ext2 的 filesystem 轉換為 ext3 的文件系統; -L :類似 e2label 的功能,可以修改 filesystem 的 Label 喔!范例一:列出 /dev/hdc6 的 superblock 內容 [root@www ~]# tune2fs -l /dev/hdc6 |
這個命令的功能其實很廣泛啦~上面鳥哥僅列出很簡單的一些參數而已,更多的用法請自行參考 man tune2fs 。比較有趣的是,如果你的某個 partition 原本是 ext2 的文件系統,如果想要將他升級成為 ext3 文件系統的話,利用 tune2fs 就可以很簡單的轉換過來啰~
- hdparm
如果你的硬盤是 IDE 接口的,那么這個命令可以幫助你配置一些進階參數!如果你是使用 SATA 接口的,那么這個命令就沒有多大用途了!另外,目前的 Linux 系統都已經稍微優化過,所以這個命令最多是用來測試效能啦!而且建議你不要隨便調整硬盤參數,文件系統容易出問題喔!除非你真的知道你調整的數據是啥!
| [root@www ~]# hdparm [-icdmXTt] 裝置名稱 選項與參數: -i :將核心偵測到的硬盤參數顯示出來! -c :配置 32-bit (32位)存取模式。這個 32 位存取模式指的是在硬盤在與 PCI 接口之間傳輸的模式,而硬盤本身是依舊以 16 位模式在跑的!默認的情況下,這個配置值都會被打開,建議直接使用 c1 即可! -d :配置是否激活 dma 模式, -d1 為啟動, -d0 為取消; -m :配置同步讀取多個 sector 的模式。一般來說,配置此模式,可降低系統因為讀取磁盤而損耗的效能~不過, WD 的硬盤則不怎么建議配置此值~一般來說,配置為 16/32 是優化,不過,WD 硬盤建議值則是 4/8 。這個值的最大值,可以利用 hdparm -i /dev/hda 輸出的 MaxMultSect來配置喔!一般如果不曉得,配置 16 是合理的! -X :配置 UtraDMA 的模式,一般來說, UDMA 的模式值加 64 即為配置值。并且,硬盤與主板芯片必須要同步,所以,取最小的那個。一般來說:33 MHz DMA mode 0~2 (X64~X66)66 MHz DMA mode 3~4 (X67~X68)100MHz DMA mode 5 (X69)如果您的硬盤上面顯示的是 UATA 100 以上的,那么配置 X69 也不錯! -T :測試緩存區 cache 的存取效能 -t :測試硬盤的實際存取效能 (較正確!)范例一:取得我硬盤的最大同步存取 sector 值與目前的 UDMA 模式 [root@www ~]# hdparm -i /dev/hdcModel=IC35L040AVER07-0, FwRev=ER4OA41A, SerialNo=SX0SXL98406 <==硬盤的廠牌型號Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=40BuffType=DualPortCache, BuffSize=1916kB, MaxMultSect=16, MultSect=16CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=80418240IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}PIO modes: pio0 pio1 pio2 pio3 pio4DMA modes: mdma0 mdma1 mdma2UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 <==有 * 為目前的值AdvancedPM=yes: disabled (255) WriteCache=enabledDrive conforms to: ATA/ATAPI-5 T13 1321D revision 1: ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 # 這顆硬盤緩沖存儲器只有 2MB(BuffSize),但使用的是 udma5 !還可以。范例二:由上個范例知道最大 16 位/UDMA 為 mode 5,所以可以配置為: [root@www ~]# hdparm -d1 -c1 -X69 /dev/hdc范例三:測試這顆硬盤的讀取效能 [root@www ~]# hdparm -Tt /dev/hdc /dev/hdc:Timing cached reads: 428 MB in 2.00 seconds = 213.50 MB/secTiming buffered disk reads: 114 MB in 3.00 seconds = 38.00 MB/sec # 鳥哥的這部測試機沒有很好啦~這樣的速度.....差強人意~ |
如果你是使用 SATA 硬盤的話,這個命令唯一可以做的,就是最后面那個測試的功能而已啰!雖然這樣的測試不是很準確,至少是一個可以比較的基準。鳥哥在我的 cluster 機器上面測試的 SATA (/dev/sda) 與RAID (/dev/sdb) 結果如下,可以提供給你參考看看。
| [root@www ~]# hdparm -Tt /dev/sda /dev/sdb /dev/sda:Timing cached reads: 4152 MB in 2.00 seconds = 2075.28 MB/secTiming buffered disk reads: 304 MB in 3.01 seconds = 100.91 MB/sec/dev/sdb:Timing cached reads: 4072 MB in 2.00 seconds = 2036.31 MB/secTiming buffered disk reads: 278 MB in 3.00 seconds = 92.59 MB/sec |
配置啟動掛載:
手動處理 mount 不是很人性化,我們總是需要讓系統『自動』在啟動時進行掛載的!本小節就是在談這玩意兒!另外,從 FTP 服務器捉下來的映像檔能否不用刻錄就可以讀取內容?我們也需要談談先!
啟動掛載 /etc/fstab 及 /etc/mtab
剛剛上面說了許多,那么可不可以在啟動的時候就將我要的文件系統都掛好呢?這樣我就不需要每次進入 Linux 系統都還要在掛載一次呀!當然可以啰!那就直接到 /etc/fstab 里面去修修就行啰!不過,在開始說明前,這里要先跟大家說一說系統掛載的一些限制:
- 根目錄 / 是必須掛載的﹐而且一定要先于其它 mount point 被掛載進來。
- 其它 mount point 必須為已創建的目錄﹐可任意指定﹐但一定要遵守必須的系統目錄架構原則
- 所有 mount point 在同一時間之內﹐只能掛載一次。
- 所有 partition 在同一時間之內﹐只能掛載一次。
- 如若進行卸除﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。
讓我們直接查閱一下 /etc/fstab 這個文件的內容吧!
| [root@www ~]# cat /etc/fstab # Device Mount point filesystem parameters dump fsck LABEL=/1 / ext3 defaults 1 1 LABEL=/home /home ext3 defaults 1 2 LABEL=/boot /boot ext3 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL=SWAP-hdc5 swap swap defaults 0 0 # 上述特殊字體的部分與實際磁盤有關!其他則是虛擬文件系統或 # 與內存置換空間 (swap) 有關。 |
其實 /etc/fstab (filesystem table) 就是將我們利用 mount 命令進行掛載時,將所有的選項與參數寫入到這個文件中就是了。除此之外, /etc/fstab 還加入了 dump 這個備份用命令的支持!與啟動時是否進行文件系統檢驗fsck 等命令有關。
這個文件的內容共有六個字段,這六個字段非常的重要!你『一定要背起來』才好!各個字段的詳細數據如下:
| Tips: 鳥哥比較龜毛一點,因為某些 distributions 的 /etc/fstab 文件排列方式蠻丑的,雖然每一欄之間只要以空格符分開即可,但就是覺得丑,所以通常鳥哥就會自己排列整齊,并加上批注符號(就是 # ),來幫我記憶這些信息! |
- 第一欄:磁盤裝置文件名或該裝置的 Label:
這個字段請填入文件系統的裝置文件名。但是由上面表格的默認值我們知道系統默認使用的是 Label 名稱!在鳥哥的這個測試系統中 /dev/hdc2 標頭名稱為 /1,所以上述表格中的『LABEL=/1』也可以被取代成為『/dev/hdc2』的意思。至于Label可以使用dumpe2fs 命令來查閱的。
| Tips: 記得有一次有個網友寫信給鳥哥,他說,依照 e2label的配置去練習修改自己的 partition 的 Label name 之后,卻發現,再也無法順利啟動成功!后來才發現,原來他的 /etc/fstab 就是以 Label name 去掛載的。但是因為在練習的時候,將 Label name 改名字過了,導致在啟動的過程當中再也找不到相關的Label name了。 所以啦,這里再次的強調,利用裝置名稱 (ex> /dev/hda1) 來掛載 partition 時,雖然是被固定死的,所以您的硬盤不可以隨意插在任意的插槽,不過他還是有好處的。而使用 Label name 來掛載,雖然就沒有插槽方面的問題,不過,您就得要隨時注意您的Label name 喔!尤其是新增硬盤的時候! ^_^ |
- 第二欄:掛載點 (mount point)::
就是掛載點啊!掛載點是什么?一定是目錄啊~要知道啊!
- 第三欄:磁盤分區槽的文件系統:
在手動掛載時可以讓系統自動測試掛載,但在這個文件當中我們必須要手動寫入文件系統才行!包括 ext3, reiserfs, nfs, vfat 等等。
- 第四欄:文件系統參數:
記不記得我們在 mount 這個命令中談到很多特殊的文件系統參數?還有我們使用過的『-o iocharset=cp950』?這些特殊的參數就是寫入在這個字段啦!雖然之前在mount 已經提過一次,這里我們利用表格的方式再匯整一下:
| 參數 | 內容意義 |
| 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 等等。所以,在這個字段中,我們可以配置是否要以 fsck 檢驗該 filesystem 喔。0 是不要檢驗, 1 表示最早檢驗(一般只有根目錄會配置為 1), 2 也是要檢驗,不過 1 會比較早被檢驗啦!一般來說,根目錄配置為 1 ,其他的要檢驗的 filesystem 都配置為 2 就好了。
例題: 假設我們要將 /dev/hdc6 每次啟動都自動掛載到 /mnt/hdc6 ,該如何進行? 答: 首先,請用 nano 將底下這一行寫入 /etc/fstab 當中;
|
/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映象文件
想象一下如果今天我們從國家高速網絡中心(http://ftp.twaren.net)或者是義守大學(http://ftp.isu.edu.tw)下載了 Linux 或者是其他所需光盤/DVD的映象文件后,難道一定需要刻錄成為光盤才能夠使用該文件里面的數據嗎?當然不是啦!我們可以透過 loop 裝置來掛載的!
那要如何掛載呢?鳥哥將整個 CentOS 5.2 的 DVD 映象檔捉到測試機上面,然后利用這個文件來掛載給大家參考看看啰!
| [root@www ~]# ll -h /root/centos5.2_x86_64.iso -rw-r--r-- 1 root root 4.3G Oct 27 17:34 /root/centos5.2_x86_64.iso # 看到上面的結果吧!這個文件就是映象檔,文件非常的大吧![root@www ~]# mkdir /mnt/centos_dvd [root@www ~]# mount -o loop /root/centos5.2_x86_64.iso /mnt/centos_dvd [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /root/centos5.2_x86_64.iso4493152 4493152 0 100% /mnt/centos_dvd # 就是這個項目! .iso 映象文件內的所有數據可以在 /mnt/centos_dvd 看到![root@www ~]# ll /mnt/centos_dvd total 584 drwxr-xr-x 2 root root 522240 Jun 24 00:57 CentOS <==瞧!就是DVD的內容啊! -rw-r--r-- 8 root root 212 Nov 21 2007 EULA -rw-r--r-- 8 root root 18009 Nov 21 2007 GPL drwxr-xr-x 4 root root 2048 Jun 24 00:57 images .....底下省略.....[root@www ~]# umount /mnt/centos_dvd/ # 測試完成!記得將數據給他卸除! |
非常方便吧!如此一來我們不需要將這個文件刻錄成為光盤或者是 DVD 就能夠讀取內部的數據了!換句話說,你也可以在這個文件內『動手腳』去修改文件的!這也是為什么很多映象檔提供后,還得要提供驗證碼 (MD5)給使用者確認該映象檔沒有問題!
- 創建大文件以制作 loop 裝置文件!
想一想,既然能夠掛載 DVD 的映象檔,那么我能不能制作出一個大文件,然后將這個文件格式化后掛載呢?好問題!這是個有趣的動作!而且還能夠幫助我們解決很多系統的分割不良的情況呢!舉例來說,如果當初在分割時,你只有分割出一個根目錄,假設你已經沒有多余的容量可以進行額外的分割的!偏偏根目錄的容量還很大!此時你就能夠制作出一個大文件,然后將這個文件掛載!如此一來感覺上你就多了一個分割槽啰!用途非常的廣泛啦!
底下我們在 /home 下創建一個 512MB 左右的大文件,然后將這個大文件格式化并且實際掛載來玩一玩!這樣你會比較清楚鳥哥在講啥!
- 創建大型文件
首先,我們得先有一個大的文件吧!怎么創建這個大文件呢?在 Linux 底下我們有一支很好用的程序dd !他可以用來創建空的文件喔!詳細的說明請先翻到下一章壓縮命令的運用 來查閱,這里鳥哥僅作一個簡單的范例而已。假設我要創建一個空的文件在 /home/loopdev ,那可以這樣做:
dd 就好像在迭磚塊一樣,將 512 塊,每塊 1MB 的磚塊堆棧成為一個大文件 (/home/loopdev) !最終就會出現一個 512MB 的文件!粉簡單吧![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 的意思。[root@www ~]# ll -h /home/loopdev -rw-r--r-- 1 root root 512M Oct 28 02:29 /home/loopdev
- 格式化
很簡單就創建起一個 512MB 的文件了吶!接下來當然是格式化啰!
[root@www ~]# mkfs -t ext3 /home/loopdev mke2fs 1.39 (29-May-2006) /home/loopdev is not a block special device. Proceed anyway? (y,n) y <==由于不是正常的裝置,所以這里會提示你! Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 131072 inodes, 524288 blocks 26214 blocks (5.00%) reserved for the super user .....以下省略.....
- 掛載
那要如何掛載啊?利用 mount 的特殊參數,那個 -o loop 的參數來處理!
[root@www ~]# mount -o loop /home/loopdev /media/cdrom/ [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /home/loopdev 507748 18768 462766 4% /media/cdrom
透過這個簡單的方法,感覺上你就可以在原本的分割槽在不更動原有的環境下制作出你想要的分割槽就是了!這東西很好用的!尤其是想要玩 Linux 上面的『虛擬機』的話,也就是以一部 Linux 主機再切割成為數個獨立的主機系統時,類似 VMware 這類的軟件,在 Linux 上使用 xen 這個軟件,他就可以配合這種 loop device 的文件類型來進行根目錄的掛載,真的非常有用的喔! ^_^
內存置換空間(swap)之建置
還記得在安裝 Linux 之前大家常常會告訴你的話吧!就是安裝時一定需要的兩個 partition 啰!一個是根目錄,另外一個就是 swap(內存置換空間)。關于內存置換空間的解釋在第四章安裝 Linux 內的磁盤分區時有約略提過,swap 的功能就是在應付物理內存不足的情況下所造成的內存延伸記錄的功能。
一般來說,如果硬件的配備足夠的話,那么 swap 應該不會被我們的系統所使用到,swap 會被利用到的時刻通常就是物理內存不足的情況了。從第零章的計算器概論當中,我們知道 CPU 所讀取的數據都來自于內存,那當內存不足的時候,為了讓后續的程序可以順利的運行,因此在內存中暫不使用的程序與數據就會被挪到 swap 中了。此時內存就會空出來給需要運行的程序加載。由于 swap 是用硬盤來暫時放置內存中的信息,所以用到 swap 時,你的主機硬盤燈就會開始閃個不停啊!
雖然目前(2009)主機的內存都很大,至少都有 1GB 以上啰!因此在個人使用上你不要配置 swap 應該也沒有什么太大的問題。不過服務器可就不這么想了~由于你不會知道何時會有大量來自網絡的要求,因此你最好能夠預留一些 swap 來緩沖一下系統的內存用量!至少達到『備而不用』的地步啊!
現在想象一個情況,你已經將系統創建起來了,此時卻才發現你沒有建置 swap ~那該如何是好呢?透過本章上面談到的方法,你可以使用如下的方式來創建你的 swap 啰!
- 配置一個 swap partition
- 創建一個虛擬內存的文件
不啰唆,就立刻來處理處理吧!
使用實體分割槽建置swap
創建 swap 分割槽的方式也是非常的簡單的!透過底下幾個步驟就搞定啰:
不啰唆,立刻來實作看看!既然我們還有多余的磁盤容量可以分割,那么讓我們繼續分割出 256MB 的磁盤分區槽吧!然后將這個磁盤分區槽做成 swap 吧!
- 1. 先進行分割的行為啰!
| [root@www ~]# fdisk /dev/hdc Command (m for help): n First cylinder (2303-5005, default 2303): <==這里按[enter] Using default value 2303 Last cylinder or +size or +sizeM or +sizeK (2303-5005, default 5005): +256MCommand (m for help): pDevice Boot Start End Blocks Id System .....中間省略..... /dev/hdc6 2053 2302 2008093+ 83 Linux /dev/hdc7 2303 2334 257008+ 83 Linux <==新增的項目Command (m for help): t <==修改系統 ID Partition number (1-7): 7 <==從上結果看到的,七號partition Hex code (type L to list codes): 82 <==改成 swap 的 ID Changed system type of partition 7 to 82 (Linux swap / Solaris)Command (m for help): pDevice Boot Start End Blocks Id System .....中間省略..... /dev/hdc6 2053 2302 2008093+ 83 Linux /dev/hdc7 2303 2334 257008+ 82 Linux swap / SolarisCommand (m for help): w # 此時就將 partition table 升級了![root@www ~]# partprobe # 這個玩意兒很重要的啦!不要忘記讓核心升級 partition table 喔! |
- 2. 開始建置 swap 格式
| [root@www ~]# mkswap /dev/hdc7 Setting up swapspace version 1, size = 263172 kB <==非常快速! |
- 3. 開始觀察與加載看看吧!
| [root@www ~]# freetotal used free shared buffers cached Mem: 742664 684592 58072 0 43820 497144 -/+ buffers/cache: 143628 599036 Swap: 1020088 96 1019992 # 我有 742664K 的物理內存,使用 684592K 剩余 58072K ,使用掉的內存有 # 43820K / 497144K 用在緩沖/緩存的用途中。 # 至于 swap 已經存在了 1020088K 啰!這樣會看了吧?![root@www ~]# swapon /dev/hdc7 [root@www ~]# freetotal used free shared buffers cached Mem: 742664 684712 57952 0 43872 497180 -/+ buffers/cache: 143660 599004 Swap: 1277088 96 1276992 <==有添加啰!看到否?[root@www ~]# swapon -s Filename Type Size Used Priority /dev/hdc5 partition 1020088 96 -1 /dev/hdc7 partition 257000 0 -2 # 上面列出目前使用的 swap 裝置有哪些的意思! |
使用文件建置swap
如果是在實體分割槽無法支持的環境下,此時前一小節提到的 loop 裝置建置方法就派的上用場啦!與實體分割槽不一樣的只是利用 dd 去建置一個大文件而已。多說無益,我們就再透過文件建置的方法創建一個128 MB 的內存置換空間吧!
- 1. 使用 dd 這個命令來新增一個 128MB 的文件在 /tmp 底下:
| [root@www ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128 128+0 records in 128+0 records out 134217728 bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s[root@www ~]# ll -h /tmp/swap -rw-r--r-- 1 root root 128M Oct 28 15:33 /tmp/swap |
- 2. 使用 mkswap 將 /tmp/swap 這個文件格式化為 swap 的文件格式:
| [root@www ~]# mkswap /tmp/swap Setting up swapspace version 1, size = 134213 kB # 這個命令下達時請『特別小心』,因為下錯字節控制,將可能使您的文件系統掛掉! |
- 3. 使用 swapon 來將 /tmp/swap 啟動啰!
| [root@www ~]# freetotal used free shared buffers cached Mem: 742664 450860 291804 0 45584 261284 -/+ buffers/cache: 143992 598672 Swap: 1277088 96 1276992[root@www ~]# swapon /tmp/swap [root@www ~]# freetotal used free shared buffers cached Mem: 742664 450860 291804 0 45604 261284 -/+ buffers/cache: 143972 598692 Swap: 1408152 96 1408056[root@www ~]# swapon -s Filename Type Size Used Priority /dev/hdc5 partition 1020088 96 -1 /dev/hdc7 partition 257000 0 -2 /tmp/swap file 131064 0 -3 |
- 4. 使用 swapoff 關掉 swap file
| [root@www ~]# swapoff /tmp/swap [root@www ~]# swapoff /dev/hdc7 [root@www ~]# freetotal used free shared buffers cached Mem: 742664 450860 291804 0 45660 261284 -/+ buffers/cache: 143916 598748 Swap: 1020088 96 1019992 <==回復成最原始的樣子了! |
swap使用上的限制
說實話,swap 在目前的壁紙計算機來講,存在的意義已經不大了!這是因為目前的 x86 主機所含的內存實在都太大了 (一般入門級至少也都有 512MB 了),所以,我們的 Linux 系統大概都用不到 swap 這個玩意兒的。不過,如果是針對服務器或者是工作站這些常年上線的系統來說的話,那么,無論如何,swap 還是需要創建的。
因為 swap 主要的功能是當物理內存不夠時,則某些在內存當中所占的程序會暫時被移動到 swap 當中,讓物理內存可以被需要的程序來使用。另外,如果你的主機支持電源管理模式,也就是說,你的 Linux 主機系統可以進入『休眠』模式的話,那么,運行當中的程序狀態則會被紀錄到 swap 去,以作為『喚醒』主機的狀態依據!另外,有某些程序在運行時,本來就會利用 swap 的特性來存放一些數據段,所以, swap 來是需要創建的!只是不需要太大!
不過, swap 在被創建時,是有限制的喔!
- 在核心 2.4.10 版本以后,單一 swap 量已經沒有 2GB 的限制了,
- 但是,最多還是僅能創建到 32 個 swap 的數量!
- 而且,由于目前 x86_64 (64位) 最大內存尋址到 64GB,因此, swap 總量最大也是僅能達 64GB 就是了!
文件系統的特殊觀察與操作
文件系統實在是非常有趣的東西,鳥哥學了好幾年還是很多東西不很懂呢!在學習的過程中很多朋友在討論區都有提供一些想法!這些想法將他歸納起來有底下幾點可以參考的數據呢!
boot sector 與 superblock 的關系
在過去非常多的文章都寫到啟動管理程序是安裝到 superblock 內的,但是我們由官方的 How to 文件知道,圖解(圖 1.3.1)的結果是將可安裝啟動信息的boot sector (啟動扇區) 獨立出來,并非放置到 superblock 當中的!那么也就是說過去的文章寫錯了?這其實還是可以討論討論的!
經過一些搜尋,鳥哥找到幾篇文章(非官方文件)的說明,大多是網友分析的結果啦!如下所示:(注10)
- The Second Extended File System: http://www.nongnu.org/ext2-doc/ext2.html
- Rob's ext2 documentation: http://www.landley.net/code/toybox/ext2.html
- Life is different blog: ext2文件系統分析: http://www.qdhedu.com/blog/post/7.html
這幾篇文章有幾個重點,歸納一下如下:
- superblock 的大小為 1024 bytes;
- superblock 前面需要保留 1024 bytes 下來,以讓啟動管理程序可以安裝。
分析上述兩點我們知道 boot sector 應該會占有 1024 bytes 的大小吧!但是整個文件系統主要是依據 block 大小來決定的啊!因此要討論 boot sector 與 superblock 的關系時,不得不將 block 的大小拿出來討論討論喔!
- block 為 1024 bytes (1K) 時:
如果 block 大小剛好是 1024 的話,那么 boot sector 與 superblock 各會占用掉一個 block ,所以整個文件系統圖示就會如同圖 1.3.1 所顯示的那樣,boot sector 是獨立于 superblock 外面的!由于鳥哥在基礎篇安裝的環境中有個 /boot 的獨立文件系統在 /dev/hdc1 中,使用 dumpe2fs 觀察的結果有點像底下這樣(如果你是按照鳥哥的教學安裝你的 CentOS 時,可以發現相同的情況喔!):
| [root@www ~]# dumpe2fs /dev/hdc1 dumpe2fs 1.39 (29-May-2006) Filesystem volume name: /boot ....(中間省略).... First block: 1 Block size: 1024 ....(中間省略)....Group 0: (Blocks 1-8192)Primary superblock at 1, Group descriptors at 2-2Reserved GDT blocks at 3-258Block bitmap at 259 (+258), Inode bitmap at 260 (+259)Inode table at 261-511 (+260)511 free blocks, 1991 free inodes, 2 directoriesFree blocks: 5619-6129Free inodes: 18-2008 # 看到最后一個特殊字體的地方嗎? Group0 的 superblock 是由 1 號 block 開始喔! |
由上表我們可以確實的發現 0 號 block 是保留下來的,那就是留給 boot sector 用的啰!所以整個分割槽的文件系統分區有點像底下這樣的圖示:
圖 6.1.1、1K block 的 boot sector 示意圖
- block 大于 1024 bytes (2K, 4K) 時:
如果 block 大于 1024 的話,那么 superblock 將會在 0 號!我們擷取本章一開始介紹 dumpe2fs 時的內容來說明一下好了!
| [root@www ~]# dumpe2fs /dev/hdc2 dumpe2fs 1.39 (29-May-2006) ....(中間省略).... Filesystem volume name: /1 ....(中間省略).... Block size: 4096 ....(中間省略)....Group 0: (Blocks 0-32767) Primary superblock at 0, Group descriptors at 1-1Reserved GDT blocks at 2-626Block bitmap at 627 (+627), Inode bitmap at 628 (+628)Inode table at 629-1641 (+629)0 free blocks, 32405 free inodes, 2 directoriesFree blocks:Free inodes: 12-32416 |
我們可以發現 superblock 就在第一個 block (第 0 號) 上頭!但是 superblock 其實就只有 1024bytes 嘛!為了怕浪費更多空間,因此第一個 block 內就含有 boot sector 與 superblock 兩者!舉上頭的表格來說,因為每個 block 占有 4K ,因此在第一個 block 內 superblock 僅占有 1024-2047( 由 0 號起算的話)之間的咚咚,至于 2048bytes 以后的空間就真的是保留啦!而 0-1023 就保留給 boot sector 來使用。
圖 6.1.2、4K block 的 boot sector 示意圖
因為上述的情況,如果在比較大的 block 尺寸(size)中,我們可能可以說你能夠將啟動管理程序安裝到 superblock所在的 block 號碼中!就是上表的 0 號啰!但事實上還是安裝到 boot sector 的保留區域中啦!所以說,以前的文章說啟動管理程序可以安裝到 superblock 內也不能算全錯~但比較正確的說法,應該是安裝到該 filesystem最前面的 1024 bytes 內的區域,就是 boot sector 這樣比較好!
磁盤空間之浪費問題
我們在前面的 block 介紹中談到了一個 block 只能放置一個文件,因此太多小文件將會浪費非常多的磁盤容量。但你有沒有注意到,整個文件系統中包括 superblock, inode table與其他中介數據等其實都會浪費磁盤容量喔!所以當我們在 /dev/hdc6 創建起 ext3 文件系統時,一掛載就立刻有很多容量被用掉了!
另外,不知道你有沒有發現到,當你使用 ls -l 去查詢某個目錄下的數據時,第一行都會出現一個『total』的字樣!那是啥東西?其實那就是該目錄下的所有數據所耗用的實際 block 數量 * block 大小的值。我們可以透過 ll -s 來觀察看看上述的意義:
| [root@www ~]# ll -s total 104 8 -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg 8 -rw-r--r-- 2 root root 255 Jan 6 2007 crontab 4 lrwxrwxrwx 1 root root 12 Oct 22 13:58 crontab2 -> /etc/crontab 48 -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log 12 -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog 4 -rw-r--r-- 1 root root 0 Sep 27 00:25 test1 8 drwxr-xr-x 2 root root 4096 Sep 27 00:25 test2 4 -rw-rw-r-- 1 root root 0 Sep 27 00:36 test3 8 drwxrwxr-x 2 root root 4096 Sep 27 00:36 test4 |
從上面的特殊字體部分,那就是每個文件所使用掉 block 的容量!舉例來說,那個 crontab 雖然僅有 255bytes ,不過他卻占用了兩個 block (每個 block 為 4K),將所有的 block 加總就得到 104Kbytes 那個數值了。如果計算每個文件實際容量的加總結果,其實只有 56.5K 而已~所以啰,這樣就耗費掉好多容量了!
如果想要查詢某個目錄所耗用的所有容量時,那就使用 du 吧!不過 du 如果加上 -s 這個選項時,還可以依據不同的規范去找出文件系統所消耗的容量喔!舉例來說,我們就來看看 /etc/ 這個目錄的容量狀態吧!
| [root@www ~]# du -sb /etc 108360494 /etc <==單位是 bytes 喔![root@www ~]# du -sm /etc 118 /etc <==單位是 Mbytes 喔! |
使用 bytes 去分析時,發現到實際的數據占用約 103.3Mbytes,但是使用 block 去測試,就發現其實耗用了 118Mbytes,此時文件系統就耗費了約 15Mbytes 啰!這樣看的懂我們在講的數據了吧?
利用 GNU 的 parted 進行分割行為
雖然你可以使用 fdisk 很快速的將你的分割槽切割妥當,不過 fdisk 卻無法支持到高于 2TB 以上的分割槽!此時就得需要 parted 來處理了。不要覺得 2TB 你用不著! 2009 年的現在已經有單顆硬盤高達 2TB 的容量了!如果再搭配主機系統有內建磁盤陣列裝置,要使用數個 TB 的單一磁盤裝置也不是不可能的!所以,還是得要學一下這個重要的工具! parted !
parted 可以直接在一行命令列就完成分割,是一個非常好用的命令!他的語法有點像這樣:
| [root@www ~]# parted [裝置] [命令 [參數]] 選項與參數: 命令功能: 新增分割:mkpart [primary|logical|extended] [ext3|vfat] 開始 結束 分割表 :print 刪除分割:rm [partition]范例一:以 parted 列出目前本機的分割表數據 [root@www ~]# parted /dev/hdc print Model: IC35L040AVER07-0 (ide) <==硬盤接口與型號 Disk /dev/hdc: 41.2GB <==磁盤文件名與容量 Sector size (logical/physical): 512B/512B <==每個扇區的大小 Partition Table: msdos <==分割表形式Number Start End Size Type File system Flags1 32.3kB 107MB 107MB primary ext3 boot2 107MB 10.6GB 10.5GB primary ext33 10.6GB 15.8GB 5240MB primary ext34 15.8GB 41.2GB 25.3GB extended5 15.8GB 16.9GB 1045MB logical linux-swap6 16.9GB 18.9GB 2056MB logical ext37 18.9GB 19.2GB 263MB logical linux-swap [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] |
上面是最簡單的 parted 命令功能簡介,你可以使用『 man parted 』,或者是『 parted /dev/hdc help mkpart 』去查詢更詳細的數據。比較有趣的地方在于分割表的輸出。我們將上述的分割表示意拆成六部分來說明:
接下來我們嘗試來創建一個全新的分割槽吧!因為我們僅剩下邏輯分割槽可用,所以等一下底下我們選擇的會是 logical 的分割類型喔!
| 范例二:創建一個約為 512MB 容量的邏輯分割槽 [root@www ~]# parted /dev/hdc mkpart logical ext3 19.2GB 19.7GB # 請參考前一表格的命令介紹,因為我們的 /dev/hdc7 在 19.2GB 位置結束, # 所以我們當然要由 19.2GB 位置處繼續下一個分割,這樣懂了吧? [root@www ~]# parted /dev/hdc print .....前面省略.....7 18.9GB 19.2GB 263MB logical linux-swap 8 19.2GB 19.7GB 502MB logical <==就是剛剛創建的啦! |
| 范例三:將剛剛創建的第八號磁盤分區槽刪除掉吧! [root@www ~]# parted /dev/hdc rm 8 # 這樣就刪除了!實在很厲害!所以這個命令的下達要特別注意! # 因為...命令一下去就立即生效了~如果寫錯的話,會哭死~ |
關于 parted 的介紹我們就到這里啦!除非你有使用到大于 2TB 以上的磁盤,否則請愛用 fdisk 這個程序來進行分割喔!拜托拜托!
重點回顧
- 基本上 Linux 的正統文件系統為 Ext2 ,該文件系統內的信息主要有:
- superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩余量, 以及文件系統的格式與相關信息等;
- inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的 block 號碼;
- block:實際記錄文件的內容,若文件太大時,會占用多個 block 。
- Ext2 文件系統的數據存取為索引式文件系統(indexed allocation)
- 需要碎片整理的原因就是文件寫入的 block 太過于離散了,此時文件讀取的效能將會變的很差所致。這個時候可以透過碎片整理將同一個文件所屬的 blocks 匯整在一起。
- Ext2文件系統主要有:boot sector, superblock, inode bitmap, block bitmap, inode table, data block 等六大部分。
- data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已
- inode 記錄文件的屬性/權限等數據,其他重要項目為: 每個 inode 大小均固定為 128 bytes; 每個文件都僅會占用一個 inode 而已;因此文件系統能夠創建的文件數量與 inode 的數量有關;
- 文件的 block 在記錄文件的實際數據,目錄的 block 則在記錄該目錄底下文件名與其 inode 號碼的對照表;
- 日志式文件系統 (journal) 會多出一塊記錄區,隨時記載文件系統的主要活動,可加快系統復原時間;
- Linux 文件系統為添加效能,會讓主存儲器作為大量的磁盤高速緩存;
- 實體鏈接只是多了一個文件名對該 inode 號碼的鏈接而已;
- 符號鏈接就類似Windows的快捷方式功能。
- 磁盤的使用必需要經過:分割、格式化與掛載,分別慣用的命令為:fdisk, mkfs, mount三個命令
- 啟動自動掛載可參考/etc/fstab之配置,配置完畢務必使用 mount -a 測試語法正確否;
本章習題:
( 要看答案請將鼠標移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
- 情境模擬題一:復原本章的各例題練習,本章新增非常多 partition ,請將這些 partition 刪除,恢復到原本剛安裝好時的狀態。
- 目標:了解到刪除分割槽需要注意的各項信息;
- 前提:本章的各項范例練習你都必須要做過,才會擁有 /dev/hdc6, /dev/hdc7 出現;
- 需求:熟悉 fdisk, umount, swapoff 等命令。
由于本章處理完畢后,將會有 /dev/hdc6 與 /dev/hdc7 這兩個新增的 partition ,所以請刪除掉這兩個 partition 。刪除的過程需要注意的是:
- 需先以 free / swapon -s / mount 等命令查閱, /dev/hdc6, /dev/hdc7 不可以被使用!如果有被使用,則你必須要使用umount 卸除文件系統。如果是內存置換空間,則需使用 swapon -s 找出被使用的分割槽,再以 swapoff 去卸除他!
- 觀察 /etc/fstab ,該文件不能存在這兩個 partition;
- 使用『 fdisk /dev/hdc 』刪除,注意,由于是邏輯分割槽,這些分割槽一定從 5 號開始連續編號,因此你最好不要從 6 號刪除!否則原本的 7 號在你刪除 6 號后,將會變成 6 號!因此,你應該由 7 號刪除掉,再刪除 6 號。
- 情境模擬題二:由于我的系統原本分割的不夠好,我的用戶希望能夠獨立一個 filesystem 附掛在 /srv/myproject 目錄下。那你該如何創建新的 filesystem ,并且讓這個 filesystem 每次啟動都能夠自動的掛載到 /srv/myproject ,且該目錄是給 project 這個群組共享的,其他人不可具有任何權限。且該 filesystem 具有 5GB 的容量。
- 目標:理解文件系統的建置、自動掛載文件系統與項目開發必須要的權限;
- 前提:你需要進行過第七章的情境模擬才可以繼續本章;
- 需求:本章的所有概念必須要清楚!
那就讓我們開始來處理這個流程吧!
- 首先,我們必須要使用 fdisk /dev/hdc 來創建新的 partition ,由于本章之前范例的 partition 已經在上一個練習中刪除,因此你應該會多出一個 /dev/hdc6 才對:『fdisk /dev/hdc』,然后按下『n 』,按下『Enter』選擇默認的啟始磁柱,按下『+5000M』創建 5GB 的磁盤分區槽,可以多按一次『p』看看是否正確,若無問題則按下『w』寫入分割表;
- 避免重新啟動,因此使用『 partprobe 』強制核心升級分割表;如果屏幕出現類似:『end_request: I/O error dev fd0, sector 0 』的錯誤時,不要擔心啊!這個說明的是『找不到軟盤』,我們本來就沒有軟盤,所以這個錯誤是可以忽略的。
- 創建完畢后,開始進行格式化的動作如下:『mkfs -t ext3 /dev/hdc6』,這樣就 OK 了!
- 開始創建掛載點,利用:『 mkdir /srv/myproject 』來創建即可;
- 編寫自動掛載的配置文件:『 nano /etc/fstab 』,這個文件最底下新增一行,內容如下:
/dev/hdc6 /srv/myproject ext3 defaults 1 2
- 測試自動掛載:『 mount -a 』,然后使用『 df 』觀察看看有無掛載即可!
- 配置最后的權限,使用:『 chgrp project /srv/myproject 』以及『chmod 2770 /srv/myproject 』即可。
簡答題部分:
- 如果由于你的主機磁盤容量不夠大,你想要添加一顆新磁盤,并將該磁盤全部分割成單一分割槽,且將該分割槽掛載到 /home 目錄,你該如何處置? 詳細的流程可以分為硬件組裝、磁盤分區、格式化、數據搬移與掛載等。
- 安裝硬盤:關掉 Linux 主機電源,若為 IDE 接口時,需要處理跳針 (jump) ,放入主機后插好硬盤的扁平電纜與電源線,重新啟動電源;
- 磁盤分區:透過類似上述情境模擬二的動作,將整顆磁盤分區成單一主要分割槽,類似 /dev/sdb1 占有全部容量;
- 格式化:透過 mkfs -t ext3 來格式化;
- 數據搬移:由于原本的 /home 還會有數據存在,因此你可以 mount /dev/sdb1 /mnt ,再將 /home 的數據復制到 /mnt/ 中,例如:『 cp -a /home/* /mnt 』即可。復制完畢后卸除 /home 以及 /mnt
- 重新掛載:編輯 /etc/fstab ,將 /home 所在的 filesystem 裝置改為 /dev/sdb1 之類的新分割槽,然后 mount -a測試看看是否正確,如果正確的話,才是順利結束了這次的動作。
- 如果扇區 /dev/hda3 有問題,偏偏他是被掛載上的,請問我要如何修理此一扇區?
umount /dev/hda3
fsck /dev/hda3 - 我們常常說,啟動的時候,『發現硬盤有問題』,請問,這個問題的產生是『filesystem 的損毀』,還是『硬盤的損毀』?
特別需要注意的是,如果您某個 filesystem 里面,由于操作不當,可能會造成 Superblock 數據的損毀,或者是 inode 的架構損毀,或者是 block area 的記錄遺失等等,這些問題當中,其實您的『硬盤』還是好好的,不過,在硬盤上面的『文件系統』則已經無法再利用!一般來說,我們的 Linux 很少會造成 filesystem 的損毀,所以,發生問題時,很可能整個硬盤都損毀了。但是,如果您的主機常常不正常斷電,那么,很可能硬盤是沒問題的,但是,文件系統則有損毀之虞。此時,重建文件系統 (reinstall) 即可!不需要換掉硬盤啦! ^_^ - 當我有兩個文件,分別是 file1 與 file2 ,這兩個文件互為 hard link 的文件,請問,若我將 file1 刪除,然后再以類似 vi 的方式重新創建一個名為 file1 的文件,則 file2 的內容是否會被更動?
這是來自網友的疑問。當我刪除 file1 之后, file2 則為一個正規文件,并不會與他人共同分享同一個inode 與 block ,因此,當我重新創建一個檔名為 file1 時,他所利用的 inode 與 block 都是由我們的 filesystem 主動去搜尋 meta data ,找到空的 inode 與 block 來創建的,與原本的 file1 并沒有任何關連性喔!所以,新建的 file1 并不會影響 file2 呢!
參考數據與延伸閱讀
- 注1:根據The Linux Document Project的文件所繪制的圖示,詳細的參考文獻可以參考如下連結:
Filesystem How-To: http://tldp.org/HOWTO/Filesystems-HOWTO-6.html - 注2:參考維基百科所得數據,鏈接網址如下:
條目: Ext2 介紹 http://en.wikipedia.org/wiki/Ext2 - 注3:PAVE為一套秀圖軟件,常應用于數值模式的輸出文件之再處理:
PAVE 使用手冊: http://www.ie.unc.edu/cempd/EDSS/pave_doc/index.shtml - 注4:詳細的 inode 表格所定義的旗標可以參考如下連結:
John's spec of the second extended filesystem: http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm - 注5:參考 Ext2 官網提供的解說文件,這份文件非常值得參考的!
文章名稱:『Design and Implementation of the Second Extended Filesystem 』
http://e2fsprogs.sourceforge.net/ext2intro.html - 注6:Red Hat 自己推出的白皮書內容:
文章名稱:Whitepaper: Red Hat's New Journaling File System: ext3
http://www.redhat.com/support/wpapers/redhat/ext3/ - 注7:其他值得參考的 Ext2 相關文件系統文章之連結如下:
The Second Extended File System - An introduction:http://www.freeos.com/articles/3912/
ext3 or ReiserFS? Hans Reiser Says Red Hat's Move Is Understandable
http://www.linuxplanet.com/linuxplanet/reports/3726/1/文件系統的比較:維基百科:http://en.wikipedia.org/wiki/Comparison_of_file_systems
- 注8:NTFS 文件系統官網:Linux-NTFS Project: http://www.linux-ntfs.org/
- 注9: Linux 核心所支持的硬件之裝置代號(Major, Minor)查詢:
http://www.kernel.org/pub/linux/docs/device-list/devices.txt - 注10:與 Boot sector 及 Superblock 的探討有關的討論文章:
The Second Extended File System: http://www.nongnu.org/ext2-doc/ext2.html
Rob's ext2 documentation: http://www.landley.net/code/toybox/ext2.html
Life is different blog: ext2文件系統分析: http://www.qdhedu.com/blog/post/7.html
2002/07/15:第一次完成
2003/02/07:重新編排與加入 FAQ
2004/03/15:修改 inode 的說明,并且將連結檔的說明移動至這個章節當中!
2005/07/20:將舊的文章移動到 這里 。
2005/07/22:將原本的附錄一與附錄二移動成為附錄 B 啦!
2005/07/26:做了一個比較完整的修訂,加入較完整的 ext3 的說明~
2005/09/08:看到了一篇討論,說明 FC4 在默認的環境中,使用 mkswap 會有問題。
2005/10/11:新添加了一個目錄的 link 數量說明!
2005/11/11:添加了一個 fsck 的 -f 參數在里頭!
2006/03/02:參考:這里的說明,將 ext2/ext3 最大文件系統由 16TB 改為 32TB。
2006/03/31:添加了虛擬內存的相關說明在 這里
2006/05/01:將硬盤扇區的圖做個修正,感謝網友 LiaoLiang 兄提供的信息!并加入參考文獻!
2006/06/09:添加 hard link 不能鏈接到目錄的原因,詳情參考:http://phorum.study-area.org/viewtopic.php?t=12235
2006/06/28:添加關于 loop device 的相關說明吶!
2006/09/08:加入 mknod 內的裝置代號說明 ,以及列出 Linux 核心網站的裝置代號查詢。
2008/09/29:原本的FC4系列文章移動到此處
2008/10/24:由于軟盤的使用已經越來越少了,所以將 fdformat 及 mkbootdisk 拿掉了!
2008/10/31:這個月事情好多~花了一個月才將數據整理完畢!修改幅度非常的大喔!
2008/11/01:最后一節的利用 GNU 的 parted 進行分割行為誤植為 GUN !感謝網友阿賢的來信告知!
2008/12/05:感謝網友 ian_chen 的告知,之前將 flash 當成 flush 了!真抱歉!已升級!
2009/04/01:感謝討論局域網友提供的說明,鳥哥之前superblock 這里寫得不夠好,有訂正說明,請幫忙看看。
2009/08/19:加入兩題情境模擬,重新修訂一題簡答題。
2009/08/30:加入 du 的 -S 說明中。
出處:http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem.php
總結
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第八章、Linux 磁盘与文件系统管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(基础篇)- 第七
- 下一篇: 鸟哥的Linux私房菜(基础篇)- 第十