Linux 學習筆記(七)增加硬盤

1 硬盤接口

  • PATA 也叫做 IDE,是作爲 PC 的一種簡單而廉價的接口而開發的。因爲它把硬件控制器和硬盤片本身放置在一個盒子內,並且在計算機和硬盤之間使用一種相對高層的協議進行通信,所以最初它被稱爲“集成驅動器電路”。這就是所有現代硬盤的標準體系結構,但其名稱沿用了下來。IDE 硬盤的速度中等、容量大,並且非常便宜。
  • SATA,Serial ATA 串行 ATA 是傳統 IDE 的後續技術。除了支持更快的傳輸速率之外,SATA 通過清楚的連線和更長的最大電纜長度讓連接更簡單。SATA 本身支持熱插拔和命令隊列功能,這兩種功能最終讓 IDE 在服務器領域可以成爲 SCSI 的一種替代選擇。
  • SCSI 雖然不如以前那麼流行了,但它仍然是得到最廣泛支持的硬盤接口之一。它有幾種不同的形式,所有形式都支持在一條總線上安裝多個硬盤,並且支持不同的速率和多種通信類型。
  • 光纖通道(Fibre Channel)是在企業環境中正得到廣泛應用的串行接口,因爲它的帶寬高,一次能夠連接大量的設備。光纖通道設備通過光纖或者雙銅軸電纜連接在一起。現在其速度能夠達到 100 MB/s 以上。常見的拓撲包括 FC-AL(Fibre Channel Arbitrated Loop,光纖通道仲裁環路)的環形結構和使用光纖通道開關的交叉開關結構。光纖通道可以使用幾種不同的協議,其中包括 SCSI 甚至 IP。光纖通道設備名可以由稱爲 World Wide Name 的硬連線 ID 號進行識別,它和以太網 MAC 地址類似。
  • USB,對於連接鍵盤和鼠標這樣的設備來說,USB(Universal Serial Bus,通用串行總線)已經開始變得流行起來,但它的當前版本也有足夠的帶寬來支持像硬盤和 CD-ROM 驅動器這樣的設備。USB 在個人電腦上使用得非常普遍,它能讓您很容易地在系統之間移動硬盤。

2 Linux 文件系統

隨着 Linux 從各種不同的操作系統吸收了許多特性,Linux 上的文件系統一直在快速演變。內核的 VFS (Virtual File System) 層對於 PC 來說特別方便,因爲它提供了安裝“原始”文件系統(比如臭名昭著的 Windows FAT 文件系統)所需要的框架。

2.1 ext2fs, ext3fs 和 ext4fs

Second Extended File System,也常稱爲 ext2fs,在過去很長時間裏一直是主流的 Linux 文件系統。雖然 ext2 的代碼是專爲 Linux 編寫的,但是它採用了許多源自於 BSD FFS 文件系統的概念,後者由 Kirk McKusick 和他的小組在 1986 年設計和實現。

ext3fs (Third Extended File System) 是對 ext2fs 的一種非常知名的擴充,它最初由 Stephen Tweedie 開發,ext3fs 向現有的 ext2fs 代碼加入了日誌功能,從概念上說很簡單的修改卻大大增加了可靠性。更有意思的是,甚至不必改變 ext2fs 的基礎結構,就可以實現 ext3fs 擴展。實際上,您仍然可以把一個 ext3fs 文件系統當成 ext2fs 文件系統來安裝——它只是不會啓動日誌功能而已。

ext4fs (Fouth Extended File System) 是 ext3fs 文件系統的後繼版本,目前已經成爲衆多 Linux 發行版本的默認文件系統而被使用。ext4 原始的開發目標是一系列的向下兼容 ext3、移除其 64 位限制與提升其性能的延伸包。然而,某些 Linux 開發者因穩定性原因而拒絕將這些延伸包應用在 ext3 上,並要求其作爲 ext3 的分支,改名爲 ext4 並另行開發,以免影響到目前的 ext3 用戶。該要求被接受以後,ext3 維護者西奧多·周(Theodore Ts'o)在2006年6月28日公開了ext4的開發計劃。ext4 具有幾個特別強悍的特性:

  • 可支持最高1 EB (1 EB = 10242 TB) 的分區與最大 16 TB 的文件
  • 向下直接兼容 ext2 與 ext3
  • 突破 32000 子目錄限制,ext3 的一個目錄下最多只能有 32000 個子目錄。ext4 的子目錄最高可達 64000 個。

關於 ext4 更詳細信息可利用搜索引擎查找 ext4 關鍵字進行查閱。

2.2 ReiserFS

Hans Reiser 開發的 ReiserFS 是另一種在 Linux 上新出現的文件系統,SUSE 把它作爲自己默認的文件系統。和 ext4fs 一樣,ReiserFS 也是一種日誌文件系統,因此能夠維護文件系統的一致性。不必擔心諸如系統崩潰、意外重啓這樣的異常事件(這在膝上或者桌上工作站環境裏是很常見的)。

除了日誌功能以外,ReiserFS 還會提供一種模塊化的文件系統接口,通過這個接口,應用軟件開發人員和系統管理員可以在非常細的粒度上指定應該怎樣處理(和保護)文件。這項功能有可能在特殊環境裏增強文件的安全性。ReiserFS 由 DARPA(國防部高級研究計劃署,與資助創立 Internet 的是同一個單位)提供資助,它是聲稱爲達到軍用級別的安全性而設計的唯一開放源代碼的文件系統。

2.3 XFS 和 JFS

在這類“現代、主流的 Linux 文件系統”中還有兩個競爭者,它們就是 SGI 的 XFS 和 IBM 的 JFS。目前的內核和發行版本都支持它們,它們都是高性能的日誌文件系統,而且有自己的支持者,但它們似乎都沒有 ext4fs 和 ReiserFS 使用廣泛。更多關於這兩個文件系統的信息可以在網上找到更多資料。

3 hdparm: 設置 IDE 接口參數

hdparm 這個程序通過和 Linux 的 SATA/IDE 驅動程序打交道來獲得和改變硬盤的參數。hdparm 能夠設置硬盤的供電模式、啓用或者禁用 DMA (DMA 只屬於 IDE 的概念,不屬於 SATA)、設置只讀標誌、以及打印詳細的硬盤信息。

調用 hdparm 命令的語法爲:

hdparm [ flags ] [device] ..

不帶參數運行 hdparm 命令會輸出當前硬盤的設置:

$ sudo hdparm /dev/sda
/dev/sda:
multcount     = 16 (on)
IO_support    =  1 (32-bit)
readonly      =  0 (off)
readahead     = 256 (on)
geometry      = 121601/255/63, sectors = 1953525168, start = 0

默認情況下,硬盤的設置已經相當高效了。我們來看一下各個標誌所代表的意思:

  • multcount (multiple sector count 的縮寫),這個標誌控制了在一次單獨的 I/O 中斷當中,可以從磁盤中讀取的磁道數。幾乎所有現代的 IDE 驅動器都支持 multcount。
  • IO_support 32 位 I/O 的支持,如果沒有開啓該支持,可以通過 hdparm -c1 /dev/sda 來開啓 32 位 I/O 的支持。
  • readonly 硬盤只讀標誌,除非必要,這個值都應該設置爲 0,否則硬盤將只能讀取而不能寫入信息。

我們可以通過運行 hdparm 的性能評測判斷硬盤的讀取速度:

$ sudo hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads:   8342 MB in  2.00 seconds = 4175.16 MB/sec
Timing buffered disk reads:  332 MB in  3.01 seconds = 110.42 MB/sec

“cached reads(調整緩存讀)”表示 IDE 總線上的數據傳輸速率(和物理硬盤介質的吞吐量無關),而“buffered disk reads(緩衝讀)”表示物理盤片的讀開銷。我們測試的這款硬盤速度還不算慢吧,雖然 110 MB/s 還無法與 SSD 硬盤的讀取速度 530 MB/s 的速度相比。

4 fsck: 檢查和修復文件系統

fsck(file system check)用來檢查和維護不一致的文件系統。若系統掉電或磁盤發生問題,可利用 fsck 命令對文件系統進行檢查。

使用方法:

fsck [-sAVRTMNP] [-C [fd]] [-t fstype] [filesys…] [–] [fs-specific-options]

檢查與修復 Linux 文件系統,可以同時檢查一個或多個 Linux 文件系統

參數 說明
filesys device (eg. /dev/sda1), mout (eg. / or /usr)
-t 給定文件系統類型,如 ext4
-s 依序一個一個地執行 fsck 的指令來檢查
-A 對 /etc/fstab 中所有列出來的 partition 做檢查
-C 顯示完整的檢查進度
-P 同時有 -A 條件時,同時有多個 fsck 的檢查一直執行
-R 同時有 -A 條件時,省略根目錄 / 不檢查
-V 詳細顯示模式
-a 如果檢查有錯則自動修復
-r 如果檢查有錯則由使用者回答是否修復
-y 選項指定檢測每個文件是自動輸入 yes

5 實例: 向 Linux 增加硬盤

在對硬盤進行分區之前,首先應該檢查是否已經有了該硬盤的設備文件,在 Linux 上,硬盤設備文件的名字採用 /dev/sdXN 的形式,這裏的 X 是一個小寫字母,表示驅動器,N 是分區號,從 1 開始進行編號。要表示整個硬盤,只要省略掉分區號就可以了。

確定好需要分區的硬盤之後就可以開始進行操作了,使用 Linux 的 fdisk 分區工具來進行分區。

fdisk 是一個交互程序,按下 m 鍵會顯示出它的所有命令。常用的命令有

命令 功能
n new 創建一個新分區
t type 改變分區的類型
p print 打印分區表
w write 將分區表寫入硬盤
d delete 刪除分區
m menu 顯示功能菜單

這裏我有一塊新的硬盤 /dev/sdb 作爲測試實例,因爲硬盤還沒有分區,所以需要先創建新分區。如果硬盤原來有老分區,那麼在創建新分區之前,必須先用 fdiskdelete 命令刪除它們或者如果你想保留原來分區也可以使用 type 命令改變分區類型。用 fdisk 程序把分區表寫入硬盤之前,它不會改變任何東西。

$ sudo fdisk /dev/sdb

分區表可以容納 4 個“主(primary)”分區,它們可以用來保存數據。另一種方法是創建一個“擴展(extended)”分區,它是一個主分區,指向了又一個分區表,能再有 4 個“邏輯(logical)”分區。雖然使用擴展分區能夠克服正常情況下只有 4 個分區的限制,但如果僅僅需要不多的幾個分區的話,只採用主分區仍是最簡單的做法。

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-19457, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-19457, default 19457): +30G

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x014b014a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        3917    31462278   83  Linux

我們以相似的方式創建一個交換分區,唯一的不同在於我們把分區類型從 Linux 改爲 Linux swap。雖然內核並不關注分區類型,但是有些程序或者腳本會試着用類型來判斷每個分區是什麼分區。目前,Linux swap 分區不能超過 2GB,這可能超出了絕大多數應用的需要,但是既然我們有多餘的硬盤空間,那麼就可以表現得慷慨一些。如果 mkswap 不能使用我們分配給它的全部空間,那麼它會向我們發出警告。

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (3917-19457, default 3917): 3917
Last cylinder, +cylinders or +size{K,M,G} (3917-19457, default 19457): +1G

Command (m for help): type
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x014b014a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        3917    31462278   83  Linux
/dev/sdb2            3917        4048     1052257+  82  Linux swap / Solaris

接着我將第 3 個分區包含硬盤剩下的全部空間,我們以類似的方式設定它。在寫入分區表之前,我們最後再審覈一遍它。

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x014b014a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        3917    31462278   83  Linux
/dev/sdb2            3917        4048     1052257+  82  Linux swap / Solaris
/dev/sdb3            4048       19457   123772793   83  Linux

如果分區不是在柱面邊界處結束的,那麼磁盤塊數(blocks)旁邊就會出現一個加號。您可以刪除這個分區,(按照上面的顯示)鍵入柱面數重新創建它,也可以保持原狀,浪費一點兒硬盤空間。我們對新的分區表很滿意,最後使用 write 命令將它寫入硬盤。

現在我們已經爲創建文件系統做好了準備。要創建一個 ext4fs 文件系統的話,只要運行 mkfs.ext4 命令並帶上設備名作爲參數。

$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1901280 inodes, 7602753 blocks
380137 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
233 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

然後我們在文件系統上運行 fsck 命令,以確保它們已經正確的創建好了。使用 -f 標誌迫使 fsck 一定檢查新的文件系統,而不會假定它們已經清理乾淨了。

$ sudo fsck -f /dev/sdb1
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
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
/dev/sdb1: 11/1901280 files (0.0% non-contiguous), 163345/7602753 blocks

新文件系統的安裝點一創建好就可以安裝該文件系統了:

$ sudo mkdir /bkroot
$ sudo mount /dev/sdb1 /bkroot

爲了讓系統在引導的時候安裝新的文件系統,我們在文件 /etc/fstab 中爲每一個新文件系統加了一行。每行應該列出設備名、安裝點、文件系統類型、安裝選項、備份頻度以及 fsck 檢查的次序,添加設備名的時候應該使用推薦的 UUID 作爲標識硬盤分區的唯一標識,以免發生因重新配置硬盤設備而產生的掛載失敗現象,分區的 UUID 可以通過命令:

$ sudo blkid /dev/sdb1

進行查詢,不帶參數的 blkid 將列出系統上所有硬盤分區的信息。

$ sudo blkid
/dev/sda1: UUID="2620575a-200a-4aa1-88db-f05c09d55df0" TYPE="ext4" 
/dev/sda5: UUID="3fc981c5-fe38-400c-99df-c400d62b9fbd" TYPE="ext4" 
/dev/sdb1: UUID="e2b3010d-02d1-48d7-bf8f-45a6f3ae8a42" TYPE="ext4"
/dev/sdb5: UUID="0003132B000BD914" TYPE="ntfs" 
/dev/sdc1: UUID="07a8f477-1112-457e-8035-fa561d78d67b" TYPE="ext4" 
/dev/sdc3: LABEL="winning" UUID="31C42845422F4DCB" TYPE="ntfs" 
/dev/sdc5: UUID="738d17b8-4be3-474d-843d-6f65ab74a5a2" TYPE="ext4" 

順利找到 UUID/etc/fstab 文件中添加一行

# 設備名    掛載點   文件系統    選項    備份頻度    fsck 檢查的次序

UUID=e2b3010d-02d1-48d7-bf8f-45a6f3ae8a42     /bkroot    ext4    defaults    0   3

最後重啓系統測試對 /etc/fstab 文件所做的修改是否正確,還要確保新的文件系統都正確地掛到系統上了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章