由於分割表所在區塊僅有64 bytes容量,因此最多僅能有四組記錄區,每組記錄區記錄了該區段的啟始與結束的磁柱號碼。若將硬碟以長條形來看,然後將磁柱以直條圖來看,那麼那64 bytes的記錄區段有點像底下的圖示:(这里是把每个磁柱当成一个数字,也就是一个竖条,然后将这些磁柱合成在一起,形成的这个磁盘分割表。)
圖2.2.2、磁碟分割表的作用示意圖
第八章、Linux 磁碟與檔案系統管理
8.3 磁碟的分割、格式化、檢驗與掛載:
· 對磁碟進行分割,以建立可用的 partition ;
· 對該 partition 進行格式化( format ),以建立系統可用的 filesystem;
· 若想要仔細一點,則可對剛剛建立好的 filesystem 進行檢驗;
· 在 Linux 系統上,需要建立掛載點 ( 亦即是目錄 ),並將他掛載上來;
8.3.1 磁碟分割: fdisk
[root@www ~]# fdisk [-l] 裝置名稱 選項與參數: -l :輸出後面接的裝置所有的 partition 內容。若僅有 fdisk -l 時, 則系統將會把整個系統內能夠搜尋到的裝置的 partition 均列出來。 |
這個 fdisk 只有 root 才能執行,此外,請注意,使用的『裝置檔名』請不要加上數字,因為 partition 是針對『整個硬碟裝置』而不是某個 partition 呢!所以執行『 fdisk/dev/hdc1 』就會發生錯誤啦!
1. 操作環境的說明
以 root 的身份進行硬碟的 partition 時,最好是在單人維護模式底下比較安全一些,此外,在進行 fdisk 的時候,如果該硬碟某個 partition 還在使用當中,那麼很有可能系統核心會無法重新載入硬碟的 partition table ,解決的方法就是將該使用中的 partition 給他卸載,然後再重新進入 fdisk 一遍,重新寫入 partition table ,那麼就可以成功囉!
2. 注意事項:
另外在實作過程中請特別注意,因為 SATA 硬碟最多能夠支援到 15 號的分割槽, IDE 則可以支援到 63 號。但目前大家常見的系統都是 SATA 磁碟,因此在練習的時候千萬不要讓你的分割槽超過 15 號!否則即使你還有剩餘的磁柱容量,但還是會無法繼續進行分割的喔!
另外需要特別留意的是,fdisk 沒有辦法處理大於 2TB 以上的磁碟分割槽!這個問題比較嚴重!因為雖然 Ext3 檔案系統已經支援達到 16TB 以上的磁碟,但是分割指令卻無法支援。時至今日(2009)所有的硬體價格大跌,硬碟也已經出到單顆 1TB 之譜,若加上磁碟陣列 (RAID) ,高於 2TB 的磁碟系統應該會很常見!此時你就得使用parted這個指令了!我們會在本章最後談一談這個指令的用法。
8.3.2 磁碟格式化: mkfs, mke2fs
分割完畢後自然就是要進行檔案系統的格式化囉!格式化的指令非常的簡單,那就是『make filesystem, mkfs』這個指令啦!這個指令其實是個綜合的指令,他會去呼叫正確的檔案系統格式化工具軟體!
1. mkfs
[root@www ~]# mkfs [-t 檔案系統格式] 裝置檔名 選項與參數: -t :可以接檔案系統格式,例如 ext3, ext2, vfat 等(系統有支援才會生效) [root@www ~]# mkfs -t ext3 /dev/hdc6 |
vfat 可以用在 Windows/Linux 共用的 USB 隨身碟囉。
[root@www ~]# mkfs[tab][tab] mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.msdos mkfs.vfat # 按下兩個[tab],會發現 mkfs 支援的檔案格式如上所示!可以格式化 vfat 喔! |
mkfs会使用预设值来个格式化硬盘,如果想指定值,可以使用Ext2/Ext3 的公用程式,亦即 mke2fs 這個指令囉!
2. 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 檔案系統。
[root@www ~]# mke2fs -j -L"vbird_logical" -b 2048 -i 8192 /dev/hdc6
8.3.3 磁碟檢驗: fsck, badblocks
1. 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 檢查檔案系統後,若出現問題時,有問題的資料會被放置到這個目錄中喔!所以理論上這個目錄不應該會有任何資料,若系統自動產生資料在裡面,那...你就得特別注意你的檔案系統囉!
2. 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 裝置檔名』在進行格式化的時候處理磁碟表面的讀取測試,因此目前大多不使用這個指令囉!
8.3.4 磁碟掛載與卸載: mount,umount
[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 async remount: 重新掛載,這在系統出錯,或重新更新參數時,很有用! |
範例二:觀察目前『已掛載』的檔案系統,包含各檔案系統的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 』這樣,你會解釋上述表格中的最後一行輸出結果了嗎?自己解釋一下先。^_^。
8.3.5 磁碟參數修訂: mknod,e2label, tune2fs, hdparm
1. e2label
你就不可以隨意修改 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 <==改過來啦! .....底下省略..... |
2. 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 。
8.6 檔案系統的特殊觀察與操作
8.6.1 boot sector 與 superblock 的關係
在過去非常多的文章都寫到開機管理程式是安裝到 superblock 內的,但是我們由官方的 How to 文件知道,是將可安裝開機資訊的 bootsector (開機磁區) 獨立出來,並非放置到 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
這幾篇文章有幾個重點,歸納一下如下:
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 ,所以整個檔案系統,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-2 Reserved GDT blocks at 3-258 Block bitmap at 259 (+258), Inode bitmap at 260 (+259) Inode table at 261-511 (+260) 511 free blocks, 1991 free inodes, 2 directories Free blocks: 5619-6129 Free 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-1 Reserved GDT blocks at 2-626 Block bitmap at 627 (+627), Inode bitmap at 628 (+628) Inode table at 629-1641 (+629) 0 free blocks, 32405 free inodes, 2 directories Free 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 這樣比較好!
8.6.3 利用 GNU 的 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 Flags 1 32.3kB 107MB 107MB primary ext3 boot 2 107MB 10.6GB 10.5GB primary ext3 3 10.6GB 15.8GB 5240MB primary ext3 4 15.8GB 41.2GB 25.3GB extended 5 15.8GB 16.9GB 1045MB logical linux-swap 6 16.9GB 18.9GB 2056MB logical ext3 7 18.9GB 19.2GB 263MB logical linux-swap [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] |
上面是最簡單的 parted 指令功能簡介,你可以使用『 man parted 』,或者是『 parted /dev/hdc help mkpart 』去查詢更詳細的資料。比較有趣的地方在於分割表的輸出。我們將上述的分割表示意拆成六部分來說明:
- Number:這個就是分割槽的號碼啦!舉例來說,1號代表的是 /dev/hdc1 的意思;
- Start:起始的磁柱位置在這顆磁碟的多少 MB 處?有趣吧!他以容量作為單位喔!
- End:結束的磁柱位置在這顆磁碟的多少 MB 處?
- Size:由上述兩者的分析,得到這個分割槽有多少容量;
- Type:就是分割槽的類型,有primary, extended, logical等類型;
- File system:就如同 fdisk 的 System ID 之意。
範例二:建立一個約為 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 # 這樣就刪除了!實在很厲害!所以這個指令的下達要特別注意! # 因為...指令一下去就立即生效了~如果寫錯的話,會哭死~ |