第八章、Linux 磁盤與文件系統管理

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

1. 認識 EXT2 文件系統

1.1 硬盤組成與分割的複習php

首先說明一下磁盤的物理組成,整顆磁盤的組成主要有:
圓形的磁盤盤(主要記錄數據的部分);
機械手臂,與在機械手臂上的磁盤讀取頭(可擦寫磁盤盤上的數據);
主軸馬達,能夠轉動磁盤盤,讓機械手臂的讀取頭在磁盤盤上讀寫數據。前端

而磁盤盤上的物理組成則爲(假設此磁盤爲單盤片, 磁盤盤圖標請參考第三章圖2.2.1的示意):
扇區(Sector)爲最小的物理儲存單位,每一個扇區爲 512 bytes;
將扇區組成一個圓,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小單位;
第一個扇區最重要,裏面有:(1)主要啓動區(Master boot record, MBR)及分割表(partition table), 其中 MBR 佔有 446 bytes,而 partition table 則佔有 64 bytes。node

各類接口的磁盤在Linux中的文件名分別爲:
/dev/sd[a-p][1-15]:爲SCSI, SATA, U盤, Flash閃盤等接口的磁盤文件名;
/dev/hd[a-d][1-63]:爲 IDE 接口的磁盤文件名;linux

所謂的磁盤分區指的是告訴操做系統『我這顆磁盤在此分割槽能夠存取的區域是由 A 磁柱到 B 磁柱之間的區塊centos

指定分割槽的磁柱範圍是記錄在哪裏?就是第一個扇區的分割表中啦!可是由於分割表僅有64bytes而已
一、主要分割與擴展分配最多能夠有四筆(硬盤的限制)
二、擴展分配最多隻能有一個(操做系統的限制)
三、邏輯分割是由擴展分配持續切割出來的分割槽;
四、可以被格式化後,做爲數據存取的分割槽爲主要分割與邏輯分割。擴展分配沒法格式化;
邏輯分割的數量依操做系統而不一樣,在Linux系統中,IDE硬盤最多有59個邏輯分割(5號到63號), SATA硬盤則有11個邏輯分割(5號到15號)。緩存

1.2 文件系統特性: 索引式文件系統安全

傳統的磁盤與文件系統之應用中,一個分割槽就是隻可以被格式化成爲一個文件系統,因此咱們能夠說一個 filesystem 就是一個 partition。可是因爲新技術的利用,例如咱們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術能夠將一個分割槽格式化爲多個文件系統(例如LVM),也可以將多個分割槽合成一個文件系統(LVM, RAID)! 因此說,目前咱們在格式化時已經再也不說成針對 partition 來格式化了, 一般咱們能夠稱呼一個可被掛載的數據爲一個文件系統而不是一個分割槽喔!bash

那麼文件系統是如何運行的呢?這與操做系統的文件數據有關。較新的操做系統的文件數據除了文件實際內容外, 一般含有很是多的屬性。
例如 Linux 操做系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。
文件系統一般會將這兩部份的數據分別存放在不一樣的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中。
另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的總體信息,包括 inode 與 block 的總量、使用量、剩餘量等。服務器

每一個 inode 與 block 都有編號,至於這三個數據的意義能夠簡略說明以下:網絡

superblock:記錄此 filesystem 的總體信息,包括inode/block的總量、使用量、剩餘量, 以及文件系統的格式與相關信息等;
inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的 block 號碼;
block:實際記錄文件的內容,若文件太大時,會佔用多個 block 。

這種數據存取的方法咱們稱爲索引式文件系統(indexed allocation)。
索引式文件系統

其餘的慣用文件系統能夠比較一下啊? 有的,那就是咱們慣用的閃盤(閃存),閃盤使用的文件系統通常爲 FAT 格式。
FAT 這種格式的文件系統並無 inode 存在,因此 FAT 沒有辦法將這個文件的全部 block 在一開始就讀取出來。每一個 block 號碼都記錄在前一個 block 當中。
FAT格式文件系統

所謂的『碎片整理』, 須要碎片整理的緣由就是文件寫入的 block 太過於離散了,此時文件讀取的效能將會變的不好所致。 這個時候能夠透過碎片整理將同一個文件所屬的 blocks 彙整在一塊兒,這樣數據的讀取會比較容易啊! 想固然爾,FAT 的文件系統須要常常的碎片整理一下,那麼 Ext2 是否須要磁盤重整呢?基本上不是太須要。

1.3 Linux 的 EXT2 文件系統(inode): data block, inode table, superblock, dumpe2fs

文件系統一開始就將 inode 與 block 規劃好了,除非從新格式化(或者利用 resize2fs 等命令變動文件系統大小),不然 inode 與 block 固定後就再也不變更。可是若是仔細考慮一下,若是個人文件系統高達數百GB時, 那麼將全部的 inode 與 block 統統放置在一塊兒將是很不智的決定,由於 inode 與 block 的數量太龐大,不容易管理。
所以 Ext2 文件系統在格式化的時候基本上是區分爲多個區塊羣組 (block group) 的,每一個區塊羣組都有獨立的 inode/block/superblock 系統。
區塊羣組

在總體的規劃當中,文件系統最前面有一個啓動扇區(boot sector),這個啓動扇區能夠安裝啓動管理程序, 這是個很是重要的設計,由於如此一來咱們就可以將不一樣的啓動管理程序安裝到個別的文件系統最前端,而不用覆蓋整顆硬盤惟一的 MBR, 這樣也纔可以製做出多重引導的環境啊!
至於每個區塊羣組(block group)的六個主要內容說明如後:

data block (數據區塊)

data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了,且每一個 block 都有編號,以方便 inode 的記錄啦。 不過要注意的是,因爲 block 大小的差別,會致使該文件系統可以支持的最大磁盤容量與最大單一文件容量並不相同。 由於 block 大小而產生的 Ext2 文件系統限制以下

Block 大小 1KB 2KB 4KB
最大單一文件限制 16GB 256GB 2TB
最大文件系統總容量 2TB 8TB 16TB

除此以外 Ext2 文件系統的 block 還有什麼限制呢?有的!基本限制以下:
原則上,block 的大小與數量在格式化完就不可以再改變了(除非從新格式化);
每一個 block 內最多隻可以放置一個文件的數據;
承上,若是文件大於 block 的大小,則一個文件會佔用多個 block 數量;
承上,若文件小於 block ,則該 block 的剩餘容量就不可以再被使用了(磁盤空間會浪費)。
因爲每一個 block 僅能容納一個文件的數據而已,所以若是你的文件都很是小,可是你的 block 在格式化時卻選用最大的 4K 時,可能會產生一些容量的浪費喔!

既然大的 block 可能會產生較嚴重的磁盤容量浪費,那麼咱們是否就將 block 大小訂爲 1K 便可? 這也不妥,由於若是 block 較小的話,那麼大型文件將會佔用數量更多的 block ,而 inode 也要記錄更多的 block 號碼,此時將可能致使文件系統不良的讀寫效能。

因此咱們能夠說,在您進行文件系統的格式化以前,請先想好該文件系統預計使用的狀況。

inode table (inode 表格)

inode 的內容在記錄文件的屬性以及該文件實際數據是放置在哪幾號 block 內! 基本上,inode 記錄的文件數據至少有底下這些:
該文件的存取模式(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 的結構畫一下好了。
inode

這樣子 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

但這個方法不能用在 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。
此外,每一個 block group 均可能含有 superblock !可是咱們也說一個文件系統應該僅有一個 superblock 而已。 事實上除了第一個 block group 內會含有 superblock 以外,後續的 block group 不必定含有 superblock , 而若含有 superblock 則該 superblock 主要是作爲第一個 block group 內 superblock 的備份,這樣能夠進行 superblock 的救援!相關的 superblock 信息咱們等一下會以 dumpe2fs 命令來呼叫出來觀察喔!

Filesystem Description (文件系統描述說明)

這個區段能夠描述每一個 block group 的開始與結束的 block 號碼,以及說明每一個區段 (superblock, bitmap, inodemap, data block) 分別介於哪個 block 號碼之間。這部份也可以用 dumpe2fs 來觀察的。

block bitmap (區塊對照表)

新增文件時,透過 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:             128M

Group 0: (Blocks 0-32767) <==第一個 data group 內容, 包含 block 的啓始/結束號碼
  Primary superblock at 0, Group descriptors at 1-1  <==超級區塊在 0 號 block
  Reserved GDT blocks at 2-626
  Block bitmap at 627 (+627), Inode bitmap at 628 (+628)
  Inode table at 629-1641 (+629)                     <==inode table 所在的 block
  0 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 的號碼有關就是了!很重要!

至於 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 號。

1.4 與目錄樹的關係

目錄:

當咱們在 Linux 下的 ext2 文件系統建立一個目錄時, ext2 會分配一個 inode 與至少一塊 block 給該目錄。其中,inode 記錄該目錄的相關權限與屬性,並可記錄分配到的那塊 block 號碼;
而 block 則是記錄在這個目錄下的文件名與該文件名佔用的 inode 號碼數據。

若是想要實際觀察 root 家目錄內的文件所佔用的 inode 號碼時,能夠使用 ls -i 這個選項來處理。
當你使用『 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

文件:

當咱們在 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 這個通常身份使用者):

/ 的 inode:
透過掛載點的信息找到 /dev/hdc2 的 inode 號碼爲 2 的根目錄 inode,且 inode 規範的權限讓咱們能夠讀取該 block 的內容(有 r 與 x) ;
/ 的 block:
通過上個步驟取得 block 的號碼,並找到該內容有 etc/ 目錄的 inode 號碼 (1912545);
etc/ 的 inode:
讀取 1912545 號 inode 得知 vbird 具備 r 與 x 的權限,所以能夠讀取 etc/ 的 block 內容;
etc/ 的 block:
通過上個步驟取得 block 號碼,並找到該內容有 passwd 文件的 inode 號碼 (1914888);
passwd 的 inode:
讀取 1914888 號 inode 得知 vbird 具備 r 的權限,所以能夠讀取 passwd 的 block 內容;
passwd 的 block:
最後將該 block 內容的數據讀出來。

filesystem 大小與磁盤讀取效能

整個文件系統上面的文件一般沒法連續寫在一塊兒(block 號碼不會連續的意思), 而是填入式的將數據填入沒有被使用的 block 當中。若是文件寫入的 block 真的分的很散, 此時就會有所謂的文件數據離散的問題發生了。
若是文件真的太過離散,確實仍是會發生讀取效率低落的問題。 由於磁盤讀取頭仍是得要在整個文件系統中來來去去的頻繁讀取! 果然如此,那麼能夠將整個 filesystme 內的數據所有複製出來,將該 filesystem 從新格式化, 再將數據給他複製回去便可解決這個問題。
所以, partition 的規劃並非越大越好, 而是真的要針對您的主機用途來進行規劃才行!

1.5 EXT2/EXT3 文件的存取與日誌式文件系統的功能

新建一個文件或目錄時,咱們的 Ext2 是如何處理的呢? 這個時候就得要 block bitmap 及 inode bitmap 的幫忙了!假設咱們想要新增一個文件,此時文件系統的行爲是:

一、先肯定用戶對於欲新增文件的目錄是否具備 w 與 x 的權限,如有的話才能新增;
二、根據 inode bitmap 找到沒有使用的 inode 號碼,並將新文件的權限/屬性寫入;
三、根據 block bitmap 找到沒有使用中的 block 號碼,並將實際的數據寫入 block 中,且升級 inode 的 block 指向數據;
四、將剛剛寫入的 inode 與 block 數據同步升級 inode bitmap 與 block bitmap,並升級 superblock 的內容。

數據存放區:
通常來講,咱們將 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 區域與實際數據存放區來進行比對。

日誌式文件系統(Journaling filesystem):(解決問題)

爲了不上述提到的文件系統不一致的狀況發生,所以咱們的前輩們想到一個方式, 在 filesystem 當中規劃出一個區塊,專門記錄寫入或修訂文件時的步驟,就能夠簡化一致性檢查的步驟。即:

一、預備:當系統要寫入一個文件時,會先在日誌記錄區塊中紀錄某個文件準備要寫入的信息;
二、實際寫入:開始寫入文件的權限與數據;開始升級 metadata 的數據;
三、結束:完成數據與 metadata 的升級後,在日誌記錄區塊當中完成該文件的紀錄。

在這樣的程序當中,萬一數據的紀錄過程中發生了問題,那麼咱們的系統只要去檢查日誌記錄區塊, 就能夠知道哪一個文件發生了問題,針對該問題來作一致性的檢查便可,而沒必要針對整塊 filesystem 去檢查, 這樣就能夠達到快速修復 filesystem 的能力了!這就是日誌式文件最基礎的功能囉~

『爲何你想要從ext2轉換到ext3呢?有四個主要的理由:可利用性、數據完整性、速度及易於轉換』 『可利用性』,他指出,這意味着從系統停止到快速從新復原而不是持續的讓e2fsck運行長時間的修復。ext3 的日誌式條件能夠避免數據毀損的可能。他也指出: 『除了寫入若干數據超過一次時,ext3每每會較快於ext2,由於ext3的日誌使硬盤讀取頭的移動能更有效的進行』 然而或許決定的因素仍是在Johnson先生的第四個理由中。

『它是能夠輕易的從ext2變動到ext3來得到一個強而有力的日誌式文件系統而不須要從新作格式化』。『那是正確的,爲了體驗一下 ext3 的好處是不須要去作一種長時間的,冗長乏味的且易於產生錯誤的備份工做及從新格式化的動做』。

1.6 Linux 文件系統的運行

若是你經常編輯一個好大的文件, 在編輯的過程當中又頻繁的要系統來寫入到磁盤中,因爲磁盤寫入的速度要比內存慢不少, 所以你會經常耗在等待硬盤的寫入/讀取上。真沒效率!
爲了解決這個效率的問題, Linux 透過一個稱爲異步處理 (asynchronously) 的方式。所謂的異步處理是這樣的:
當系統加載一個文件到內存後,若是該文件沒有被更改,則在內存區段的文件數據會被配置爲乾淨(clean)的。但若是內存中的文件被更改過了,此時該內存中的數據會被配置爲髒(dirty)的。此時全部的動做都還在內存中運行,並無寫到磁盤上。此外,系統會不定時的將內存中配置爲 dirty 的數據寫回磁盤,以保持磁盤與內存數據的一致性。也能夠用 sync 命令來手動強迫寫入磁盤。

咱們知道內存的速度要比硬盤快的多,所以若是可以將經常使用的文件放置到內存當中,這不就會添加系統性能嗎? 沒錯!是有這樣的想法!所以咱們 Linux 系統上面文件系統與內存有很是大的關係喔:

系統會將經常使用的文件數據放置到主存儲器的緩衝區,以加速文件系統的讀/寫;
承上,所以 Linux 的物理內存最後都會被用光!這是正常的狀況!可加速系統效能;
你能夠手動使用 sync 來強迫內存中配置爲 Dirty 的文件回寫到磁盤中;
若正常關機時,關機命令會主動呼叫 sync 來將內存的數據回寫入磁盤內;
但若不正常關機(如跳電、死機或其餘不明緣由),因爲數據還沒有回寫到磁盤內, 所以從新啓動後可能會花不少時間在進行磁盤檢驗,甚至可能致使文件系統的損毀(非磁盤損毀)。

1.7 掛載點的意義 (mount point)

每一個 filesystem 都有獨立的 inode / block / superblock 等信息,這個文件系統要可以連接到目錄樹才能被咱們使用。將文件系統與目錄樹結合的動做咱們稱爲『掛載』。重點是:掛載點必定是目錄,該目錄爲進入該文件系統的入口。

那若是觀察這三個目錄的 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 號碼,固然這三個文件的內容也就徹底如出一轍了! 也就是說,根目錄的上一級 (/..) 就是他本身!

1.8 其餘 Linux 支持的文件系統與 VFS

那麼 Linux 的核心又是如何管理這些認識的文件系統呢? 其實,整個 Linux 的系統都是透過一個名爲 Virtual Filesystem Switch 的核心功能去讀取 filesystem 的。
整個 VFS 能夠約略用下圖來講明:
VFS

2. 文件系統的簡單操做

2.1 磁盤與目錄的容量: df, du

咱們知道磁盤的總體數據是在 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 還要多呢

因爲 df 主要讀取的數據幾乎都是針對一整個文件系統,所以讀取的範圍主要是在 Superblock 內的信息, 因此這個命令顯示結果的速度很是的快速!
注意:若是使用 -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 的選項,減小次目錄的加總喔!

2.2 實體連接與符號連接: ln

Hard Link (實體連接, 硬式連結或實際連結):

在前一小節當中,咱們知道幾件重要的信息,包括:

每一個文件都會佔用一個 inode ,文件內容由 inode 的記錄來指向;
想要讀取該文件,必需要通過目錄記錄的文件名來指向到正確的 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

也就是說,其實文件名只與目錄有關,可是文件內容則與 inode 有關。
hard link 只是在某個目錄下新增一筆檔名連接到某 inode 號碼的關連記錄而已。

上圖的意思是,你能夠透過 1 或 2 的目錄之 inode 指定的 block 找到兩個不一樣的檔名,而無論使用哪一個檔名都可以指到 real 那個 inode 去讀取到最終數據!那這樣有什麼好處呢?最大的好處就是『安全』!如同上圖中, 若是你將任何一個『檔名』刪除,其實 inode 與 block 都仍是存在的! 此時你能夠透過另外一個『檔名』來讀取到正確的文件數據喔!此外,不論你使用哪一個『檔名』來編輯, 最終的結果都會寫入到相同的 inode 與 block 中,所以均能進行數據的修改哩!

通常來講,使用 hard link 配置連接文件時,磁盤的空間與 inode 的數目都不會改變! (除非新增的這筆數據恰好將目錄的 block 填滿)咱們仍是由圖 2.2.1 來看,由圖中能夠知道,
hard link 只是在某個目錄下的 block 多寫入一個關連數據而已,既不會添加 inode 也不會耗用 block 數量哩!

hard link 是有限制的:
一、不能跨 Filesystem
二、不能 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

連結檔的重要內容就是他會寫上目標文件的『文件名』, 你能夠發現爲何上表中連結檔的大小爲 12 bytes 呢? 由於箭頭(-->)右邊的檔名『/etc/crontab』總共有 12 個英文,每一個英文佔用 1 個 btyes ,因此文件大小就是 12bytes了。

Symbolic Link 與 Windows 的快捷方式能夠給他劃上等號,由 Symbolic link 所建立的文件爲一個獨立的新的文件,因此會佔用掉 inode 與 block

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
# 怕了吧!符號連接果真沒法開啓!另外,若是符號連接的目標文件不存在,
# 其實檔名的部分就會有特殊的顏色顯示喔!

此外,若是你作了底下這樣的連結:
ln -s /bin /root/bin
那麼若是你進入 /root/bin 這個目錄下,『請注意呦!該目錄實際上是 /bin 這個目錄,由於你作了連結檔了!』因此,若是你進入 /root/bin 這個剛剛建立的連接目錄, 而且將其中的數據殺掉時,嗯! /bin 裏面的數據就統統不見了!這點請千萬注意!因此趕忙利用『rm /root/bin 』 將這個連結檔刪除吧!

關於目錄的 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

3. 磁盤的分割、格式化、檢驗與掛載

3.1 磁盤分區: fdisk, partprobe
3.2 磁盤格式化: mkfs, mke2fs
3.3 磁盤檢驗: fsck, badblocks
3.4 磁盤掛載與卸除: mount, umount
3.5 磁盤參數修訂: mknod, e2label, tune2fs, hdparm

若是咱們想要在系統裏面新增一顆硬盤時,應該有哪些動做須要作的呢:
一、對磁盤進行分割,以建立可用的 partition ;
二、對該 partition 進行格式化( format ),以建立系統可用的 filesystem;
三、若想要仔細一點,則可對剛剛建立好的 filesystem 進行檢驗;
四、在 Linux 系統上,須要建立掛載點 ( 亦便是目錄 ),並將他掛載上來;

固然囉,在上述的過程中,還有不少須要考慮的,例如磁盤分區槽 (partition) 須要定多大? 是否須要加入 journal 的功能?inode 與 block 的數量應該如何規劃等等的問題。可是這些問題的決定, 都須要與你的主機用途來加以考慮的~

3.1 磁盤分區: fdisk, partprobe

磁盤分區: 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):     <==等待你的輸入!

Command (m for help): m   <== 輸入 m 後,就會看到底下這些命令介紹
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition            <==刪除一個partition
   l   list known partition types
   m   print this menu
   n   add a new partition           <==新增一個partition
   o   create a new empty DOS partition table
   p   print the partition table     <==在屏幕上顯示分割表
   q   quit without saving changes   <==不儲存離開fdisk程序
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit  <==將剛剛的動做寫入分割表
   x   extra functionality (experts only)
注:無論你進行了什麼動做,只要離開 fdisk 時按下『q』,那麼全部的動做『都不會生效!』相反的, 按下『w』就是動做生效的意思。
先來看看分割表信息吧!
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 』能夠列出目前這顆磁盤的分割表信息,這個信息的上半部在顯示總體磁盤的狀態。
下半部的分割表信息主要在列出每一個分割槽的個別信息項目。每一個項目的意義爲:
一、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 只有 root 才能運行,此外,請注意, 使用的『裝置文件名』請不要加上數字,由於 partition 是針對『整個硬盤裝置』而不是某個 partition 呢!因此運行『 fdisk /dev/hdc1 』 就會發生錯誤啦!要使用 fdisk /dev/hdc 纔對!

刪除磁盤分區槽

如何將你的 /dev/hdc 所有的分割槽刪除,應該怎麼作?
    一、fdisk /dev/hdc :先進入 fdisk 畫面;
    二、p :先看一下分割槽的信息,假設要殺掉 /dev/hdc1;
    三、d :這個時候會要你選擇一個 partition ,就選 1 囉!
    三、w (or) q :按 w 可儲存到磁盤數據表中,並離開 fdisk ;固然囉, 若是你反悔了,呵呵,直接按下 q 就能夠取消剛剛的刪除動做了!


# 練習一: 先進入 fdisk 的畫面當中去!
[root@www ~]# fdisk /dev/hdc

# 練習二: 先看看整個分割表的狀況是如何
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

# 練習三: 按下 d 給他刪除吧!
Command (m for help): d
Partition number (1-5): 4

Command (m for help): d
Partition number (1-4): 3

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/hdc5 是由 /dev/hdc4 所衍生出來的邏輯分割槽,所以 /dev/hdc4 被刪除,
# /dev/hdc5 就自動不見了!最終就會剩下兩個分割槽而已喔!

Command (m for help): q
# 鳥哥這裏僅是作一個練習而已,因此,按下 q 就可以離開囉~
新增磁盤分區槽

# 練習一: 進入 fdisk 的分割軟件畫面中,並刪除全部分割槽:
[root@www ~]# fdisk /dev/hdc
Command (m for help): d
Partition number (1-5): 4

Command (m for help): d
Partition number (1-4): 3

Command (m for help): d
Partition number (1-4): 2

Command (m for help): d
Selected partition 1
# 因爲最後僅剩下一個 partition ,所以系統主動選取這個 partition 刪除去!

# 練習二: 開始新增,咱們先新增一個 Primary  的分割槽,且指定爲 4 號看看!
Command (m for help): n
Command action            <==由於是全新磁盤,所以只會問extended/primary而已
   e   extended
   p   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): 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/hdc4               1          63      506016   83  Linux
# 注意!只有 4 號! 1 ~ 3 保留下來了!

# 練習三: 繼續新增一個,此次咱們新增 Extended 的分割槽好了!
Command (m for help): n
Command action
   e   extended
   p   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): 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              64        5005    39696615    5  Extended
/dev/hdc4               1          63      506016   83  Linux
# 如上所示,全部的磁柱都在 /dev/hdc1 裏面囉!

# 練習四: 此次咱們隨便新增一個 2GB 的分割槽看看!
Command (m for help): n
Command action
   l   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 action
   l   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): +2048M

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              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 就可以離開囉~

由上面的一連串練習中,最重要的地方其實就在於建立分割槽的形式( 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 ,尚有剩餘磁柱號碼,所以能夠這樣作:

[root@www ~]# fdisk /dev/hdc
Command (m for help): n
First cylinder (2053-5005, default 2053): <==[enter]
Using default value 2053
Last cylinder or +size or +sizeM or +sizeK (2053-5005, default 5005): +2048M

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
/dev/hdc6            2053        2302     2008093+  83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or 
resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks. <==見鬼了!居然須要 reboot 纔可以生效!我可不要從新啓動!

[root@www ~]# partprobe  <==強制讓核心從新捉一次 partition table

在這個實做題中,請務必要按下『 w 』這個動做!由於咱們實際上確實要建立這個分割槽嘛! 但請仔細看一下最後的警告信息,由於咱們的磁盤沒法卸除(由於含有根目錄),因此核心沒法從新取得分割表信息, 所以此時系統會要求咱們從新啓動(reboot)以升級核心的分割表信息才行。

如上的練習中,最終寫入分割表後居然會讓核心沒法捉到分割表信息!此時你能夠直接使用 reboot 來處理, 也能夠使用 GNU 推出的工具程序來處置,那就是 partprobe 這個命令。這個命令的運行很簡單, 他僅是告知核心必需要讀取新的分割表而已,所以並不會在屏幕上出現任何信息纔是! 這樣一來,咱們就不須要 reboot 囉!

操做環境的說明

以 root 的身份進行硬盤的 partition 時,最好是在單人維護模式底下比較安全一些, 此外,在進行 fdisk 的時候,若是該硬盤某個 partition 還在使用當中, 那麼頗有可能系統核心會沒法重載硬盤的 partition table ,解決的方法就是將該使用中的 partition 給他卸除,而後再從新進入 fdisk 一遍,從新寫入 partition table ,那麼就能夠成功囉!

注意事項:

另外在實做過程當中請特別注意,由於 SATA 硬盤最多可以支持到 15 號的分割槽, IDE 則能夠支持到 63 號。 但目前你們常見的系統都是 SATA 磁盤,所以在練習的時候千萬不要讓你的分割槽超過 15 號! 不然即便你還有剩餘的磁柱容量,但仍是會沒法繼續進行分割的喔!
另外須要特別留意的是,fdisk 沒有辦法處理大於 2TB 以上的磁盤分區槽! 這個問題比較嚴重!由於雖然 Ext3 文件系統已經支持達到 16TB 以上的磁盤,可是分割命令卻沒法支持。 此時你就得使用 parted 這個命令了!咱們會在本章最後談一談這個命令的用法。

3.2 磁盤格式化: mkfs, mke2fs

分割完畢後天然就是要進行文件系統的格式化囉!

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, 294912

Writing inode tables: done
Creating journal (8192 blocks): done <==有日誌記錄
Writing superblocks and filesystem accounting information: done

This 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盤 閃盤囉

在格式化爲 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, 802816

Writing 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....』不但容易記憶,並且就很是好用囉!

3.3 磁盤檢驗: 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 且你的文件系統有問題的時候才使用這個命令,不然在正常情況下使用此一命令, 可能會形成對系統的危害!

另外,若是你懷疑剛剛格式化成功的硬盤有問題的時後,也能夠使用 fsck 來檢查一硬盤呦!

注:因爲 fsck 在掃瞄硬盤的時候,可能會形成部分 filesystem 的損壞,因此『運行 fsck 時, 被檢查的 partition 務必不可掛載到系統上!亦便是須要在卸除的狀態喔!!!!

lost+found目錄:ext2/ext3 文件系統的最頂層(就是掛載點那個目錄底下)會存在一個『lost+found』的目錄吧! 該目錄就是在當你使用 fsck 檢查文件系統後,若出現問題時,有問題的數據會被放置到這個目錄中喔! 因此理論上這個目錄不該該會有任何數據,若系統自動產生數據在裏面,那...你就得特別注意你的文件系統囉!

咱們的系統實際運行的 fsck 命令,實際上是呼叫 e2fsck 這個軟件啦!能夠 man e2fsck 找到更多的選項輔助喔!

badblocks

剛剛談到的 fsck 是用來檢驗文件系統是否出錯,至於 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.

3.4 磁盤掛載與卸除: mount, umount

本章一開始時的掛載點的意義當中提過掛載點是目錄, 而這個目錄是進入磁盤分區槽(實際上是文件系統啦!)的入口就是了。不過要進行掛載前,你最好先肯定幾件事:
單一文件系統不該該被重複掛載在不一樣的掛載點(目錄)中;
單一目錄不該該重複掛載多個文件系統;
要做爲掛載點的目錄,理論上應該都是空目錄纔是。

尤爲是上述的後兩點!若是你要用來掛載的目錄裏面並非空的,那麼掛載了文件系統以後,原目錄下的東西就會暫時的消失。 舉個例子來講,假設你的 /home 本來與根目錄 (/) 在同一個文件系統中,底下本來就有 /home/test 與 /home/vbird 兩個目錄。而後你想要加入新的硬盤,而且直接掛載 /home 底下,那麼當你掛載上新的分割槽時,則 /home 目錄顯示的是新分割槽內的數據,至於原先的 test 與 vbird 這兩個目錄就會暫時的被隱藏掉了!注意喔!並非被覆蓋掉, 而是暫時的隱藏了起來,等到新分割槽被卸除以後,則 /home 本來的內容就會再次的跑出來啦!

而要將文件系統掛載到咱們的 Linux 系統上,就要使用 mount 這個命令啦!

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 async
      remount:      從新掛載,這在系統出錯,或從新升級參數時,頗有用!

掛載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 左右啦!

爲何能夠這麼方便呢(甚至不須要使用 -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 』

掛載 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 接口之故!

光驅一掛載以後就沒法退出光盤片了!除非你將他卸除纔可以退出!

格式化與掛載軟盤

範例四:格式化後掛載軟盤到 /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 最重要的就是文件系統,而文件系統是直接掛載到目錄樹上頭, 幾乎任何命令都會或多或少使用到目錄樹的數據,所以你固然不能夠隨意的將光盤/軟盤拿出來!
因此,軟盤也請卸除以後再退出!很重要的一點!

掛載閃盤

範例五:找出你的閃盤裝置文件名,並掛載到 /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 bytes

   Device 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 , 因此也就有了上述的掛載命令項目囉。

從新掛載根目錄與掛載不特定目錄

整個目錄樹最重要的地方就是根目錄了,因此根目錄根本就不可以被卸除的!問題是,若是你的掛載參數要改變, 或者是根目錄出現『只讀』狀態時,如何從新掛載呢?最可能的處理方式就是從新啓動 (reboot)! 不過你也能夠這樣作:

範例六:將 / 從新掛載,並加入參數爲 rw 與 auto
[root@www ~]# mount -o remount,rw,auto /

4. 配置啓動掛載:

  4.1 啓動掛載 /etc/fstab 及 /etc/mtab
  4.2 特殊裝置 loop 掛載(映象檔不刻錄就掛載使用)

4.1 啓動掛載 /etc/fstab 及 /etc/mtab
系統掛載的一些限制:
根目錄 / 是必須掛載的﹐並且必定要先於其它 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) 有關。

各個字段的詳細數據以下:

第一欄:磁盤裝置文件名或該裝置的 Label:
這個字段請填入文件系統的裝置文件名。
第二欄:掛載點 (mount point):
就是掛載點啊!掛載點是什麼?必定是目錄啊~要知道啊!
第三欄:磁盤分區槽的文件系統:
在手動掛載時可讓系統自動測試掛載,但在這個文件當中咱們必需要手動寫入文件系統才行! 包括 ext3, reiserfs, nfs, vfat 等等。
第四欄:文件系統參數:
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 當中;

[root@www ~]# nano /etc/fstab
/dev/hdc6  /mnt/hdc6    ext3    defaults   1 2

再來看看 /dev/hdc6 是否已經掛載,若是掛載了,請務必卸除再說!

[root@www ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hdc6              1976312     42072   1833836   3% /mnt/hdc6
# 居然不知道什麼時候被掛載了?趕忙給他卸除先!

[root@www ~]# umount /dev/hdc6

最後測試一下剛剛咱們寫入 /etc/fstab 的語法有沒有錯誤!這點很重要!由於這個文件若是寫錯了, 則你的 Linux 極可能將沒法順利啓動完成!因此請務必要測試測試喔!

[root@www ~]# mount -a              
// Mount all filesystems (of the given types) mentioned in fstab.
[root@www ~]# df

最終有看到 /dev/hdc6 被掛載起來的信息纔是成功的掛載了!並且之後每次啓動都會順利的將此文件系統掛載起來的! 因爲這個範例僅是測試而已,請務必回到 /etc/fstab 當中,將上述這行給他批註或者是刪除掉!

[root@www ~]# nano /etc/fstab
# /dev/hdc6  /mnt/hdc6    ext3    defaults   1 2

/etc/fstab 是啓動時的配置文件,不過,實際 filesystem 的掛載是記錄到 /etc/mtab 與 /proc/mounts 這兩個文件當中的。每次咱們在更動 filesystem 的掛載時,也會同時更動這兩個文件喔!可是,萬一發生您在 /etc/fstab 輸入的數據錯誤,致使沒法順利啓動成功,而進入單人維護模式當中,那時候的 / 但是 read only 的狀態,固然您就沒法修改 /etc/fstab ,也沒法升級 /etc/mtab 囉~那怎麼辦? 不要緊,能夠利用底下這一招:

[root@www ~]# mount -n -o remount,rw /

4.2 特殊裝置 loop 掛載(映象檔不刻錄就掛載使用)

掛載光盤/DVD映象文件

想象一下若是今天咱們從國家高速網絡中心(http://ftp.twaren.net)或者是義守大學(http://ftp.isu.edu.tw)下載了 Linux 或者是其餘所需光盤/DVD的映象文件後, 難道必定須要刻錄成爲光盤纔可以使用該文件裏面的數據嗎?固然不是啦!咱們能夠透過 loop 裝置來掛載的!

[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.iso
                       4493152   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 左右的大文件,而後將這個大文件格式化而且實際掛載來玩一玩! 這樣你會比較清楚鳥哥在講啥!

1,建立大型文件

假設我要建立一個空的文件在 /home/loopdev ,那能夠這樣作:
[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

2,格式化
很簡單就建立起一個 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
.....如下省略.....

3,掛載

那要如何掛載啊?利用 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 的文件類型來進行根目錄的掛載, 真的很是有用的喔! ^_^

5. 內存空間(swap)之建置

如今想象一個狀況,你已經將系統建立起來了,此時卻纔發現你沒有建置 swap ~那該如何是好呢? 透過本章上面談到的方法,你能夠使用以下的方式來建立你的 swap 囉!
配置一個 swap partition
建立一個虛擬內存的文件

5.1 使用實體分割槽建置swap

透過底下幾個步驟就搞定囉:
1. 分割:先使用 fdisk 在你的磁盤中分割出一個分割槽給系統做爲 swap 。因爲 Linux 的 fdisk 默認會將分割槽的 ID 配置爲 Linux 的文件系統,因此你可能還得要配置一下 system ID 就是了。
2. 格式化:利用建立 swap 格式的『mkswap 裝置文件名』就可以格式化該分割槽成爲 swap 格式囉
3. 使用:最後將該 swap 裝置啓動,方法爲:『swapon 裝置文件名』。
4. 觀察:最終透過 free 這個命令來觀察一下內存的用量吧!

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): +256M

Command (m for help): p

   Device 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): p

   Device Boot      Start         End      Blocks   Id  System
.....中間省略.....
/dev/hdc6            2053        2302     2008093+  83  Linux
/dev/hdc7            2303        2334      257008+  82  Linux swap / Solaris

Command (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 ~]# free
             total       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 ~]# free
             total       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 裝置有哪些的意思!

5.2 使用文件建置swap

若是是在實體分割槽沒法支持的環境下,此時前一小節提到的 loop 裝置建置方法就派的上用場啦!只是利用 dd 去建置一個大文件而已。

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 ~]# free
             total       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 ~]# free
             total       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 ~]# free
             total       used       free     shared    buffers     cached
Mem:        742664     450860     291804          0      45660     261284
-/+ buffers/cache:     143916     598748
Swap:      1020088         96    1019992  <==回覆成最原始的樣子了!

5.3 swap使用上的限制

swap 在目前的壁紙計算機來說,存在的意義已經不大了!若是是針對服務器或者是工做站這些常年上線的系統來講的話,那麼,不管如何,swap 仍是須要建立的。 由於 swap 主要的功能是當物理內存不夠時,則某些在內存當中所佔的程序會暫時被移動到 swap 當中,讓物理內存能夠被須要的程序來使用。另外,若是你的主機支持電源管理模式, 也就是說,你的 Linux 主機系統能夠進入『休眠』模式的話,那麼, 運行當中的程序狀態則會被紀錄到 swap 去,以做爲『喚醒』主機的狀態依據! 另外,有某些程序在運行時,原本就會利用 swap 的特性來存放一些數據段, 因此, swap 來是須要建立的!只是不須要太大! 不過, swap 在被建立時,是有限制的喔! 1. 核心 2.4.10 版本之後,單一 swap 量已經沒有 2GB 的限制了, 2. 可是,最多仍是僅能建立到 32 個 swap 的數量! 3. 並且,因爲目前 x86_64 (64位) 最大內存尋址到 64GB, 所以, swap 總量最大也是僅能達 64GB 就是了!

相關文章
相關標籤/搜索