天天看點

讓fdisk輸出更準确合理1 無option選項參數的輸出2 強烈建議給出的option參數

注意:新版本的fdisk預設輸出已經正确合理了,本文隻适用于舊版本的fdisk.

1 無option選項參數的輸出

[root@localhost ~]# fdisk -l

Disk /dev/sda: 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: 0xf0b1ebb0

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        7295    58592256   83  Linux
/dev/sda2            7295       19458    97695745    5  Extended
/dev/sda5            7295       17021    78124032   83  Linux
/dev/sda6           17021       18966    15624192   83  Linux
/dev/sda7           18967       19458     3945472   82  Linux swap / Solaris
[root@localhost ~]#
      

此時輸出結果基于遠古時代的CHS硬碟尋址模式,CHS早就被業界淘汰了,純屬曆史遺留的概念,隻有 可能在某些BIOS裡還存在。但是目前還有很多資料或軟體出現相關資訊,比如fdisk -l的結果。為了顧及知識完整性,還是簡單做一下介紹,有興趣的同學可以去Internet上查找關鍵詞CHS。話說最早的硬碟有多個盤片組成,每個盤片 都對應一個磁頭(Head)來掃描它,一個盤片分成很多同心圓環,每一個圓環叫做一個軌道(Track),每個軌道又被平均分成多個弧段也叫扇區 (Sector)。需要注意的是,這裡的同心圓環,不論半徑大小,都被分成了相同數量的扇區,而每個扇區大大小是固定的512B。是以内環的資料密度一定 高于外環的資料密度了。所有盤片上對應的軌道(Track)共同組成一個柱面(Cylinder)。就我自己而言,沒見過超過2個盤片的硬碟,是以這個柱 面其實是很矮的。

CHS定位原理也很簡單,首先找到柱面(C),然後在此柱面上找到盤面(H),最後在 柱面和盤面切割的軌道上找到扇區(S)。其實理論上也可以先找到盤面然後再找軌道和扇區。之是以是CHS這個順序是因為當初的硬碟構造決定的,所有磁頭都 固定在同一個裝置上,相對位置不變,是以所有磁頭都是一起移動的。這樣如果相鄰資料在同一柱面上的話,則無需移動磁頭就能全部讀寫,是以效率最高。不扯這 些了,畢竟CHS早就淘汰了。回到上面的輸出結果,第一行顯示/dev/sda這個硬碟總容量為160G,第二行顯示磁盤有255個磁頭(盤面),每個磁 道有63個扇區,同心圓環有19457個。難道這個硬碟真的有255個盤面?顯然這是不可能的。之是以會有這樣的輸出就是因為相容CHS模式。而255個 磁頭63個扇區都是CHS的極限值,在這裡并不代表實際的硬碟實體結構。第三行的Units表示的是一個柱面能存儲多少位元組資料,即 255*63*512,這對于現在的硬碟顯然也是沒有什麼意義的。然而在輸出結果的分區清單中的start和end列卻使用了unit作為度量機關,也就 是說分區的對齊機關是柱面,顯得非常不夠精确。Blocks列的機關是KB,與units無關。

2 強烈建議給出的option參數

如果我們不加參數運作fdisk,輸出如下結果。

[root@localhost ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help):
      

此處給出了警告資訊:DOS相容模式已經廢棄,強烈建議執行c指令切換模式,并且使用u指令把輸出的unit由柱面改為扇區。按照提示進行操作如下:

Command (m for help): c
DOS Compatibility flag is not set

Command (m for help): u
Changing display/entry units to sectors

Command (m for help): p

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf0b1ebb0

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   117186559    58592256   83  Linux
/dev/sda2       117188606   312580095    97695745    5  Extended
/dev/sda5       117188608   273436671    78124032   83  Linux
/dev/sda6       273438720   304687103    15624192   83  Linux
/dev/sda7       304689152   312580095     3945472   82  Linux swap / Solaris

Command (m for help):

      

可見此時的列印結果中分區清單的Unit不再以柱面為機關,而是以扇區了。而扇區确實是目前大多數硬 盤以及邏輯硬碟(LUN)的最小存儲機關,而且也采用LBA這種線性尋址方式。既然fdisk能給出警告,為什麼不把預設改為正确的方式呢?比較發現新版 本的fdisk确實預設已經能正确顯示了,當遇到老版本的fdisk時,還是需要添加cu參數。

在非互動的fdisk -l下,也隻需使用 fdisk -cul 即可正确顯示分區資訊了。

[root@localhost ~]# fdisk -cul

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf0b1ebb0

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   117186559    58592256   83  Linux
/dev/sda2       117188606   312580095    97695745    5  Extended
/dev/sda5       117188608   273436671    78124032   83  Linux
/dev/sda6       273438720   304687103    15624192   83  Linux
/dev/sda7       304689152   312580095     3945472   82  Linux swap / Solaris

      

順便提一下,注意上面MBR和第一主分區,以及各分區之間并不是緊密相連的,而是有一些“未使用”的扇區。我能想到的一個原因就是,GRUB的一部分代碼就是存在于分區之間的夾縫之中。