一、MBR結構解析
首先我們先介紹一些MBR的基本知識基礎,再晾圖片分析。MBR主要分為三大塊分別是:
1、載入引導程式(446K)
2、分區表(64k)
3、標誌結束位(2k)
載入引導程式:內容是因機器而異它裡面正如其名,就是存放載入引導程式。現在主要的載入引導程式是LILO(LInux LOader)和 GNU GRUB(GRand Unified Boot loader)。
分區表:裡面主要記錄4個16K主要磁碟分割的資訊,我們將在下文進行詳細介紹。
表示結束位:就是標誌MBR結束,一般是0xaa55。如果不是,則告訴機器前面的內容是不合法的。
然後我們執行下面的命令一起來看看MBR內容:
# dd if=/dev/sdb bs=512 count=1 | hexdump -C
vcHLttTTpsO/uPbH+NPytcS3ts6nyOfPwqO6PC9wPgo8cD48c3Ryb25nPrzT1NjS/bW8s8zQ8qO6o6gwMDAwMDAwMCC12jHX1r3afjAwMDAwMWIwILXaMTTX1r3ao6k8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+t9bH+LHto7qjqDAwMDAwMWIwILXaMTXX1r3afjAwMDAwMWYwtdoxNNfWvdqjqTwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz6x6ta+veHK+M67o7qjqDAwMDAwMWYwtdoxNdfWvdp+MDAwMDAxZjC12jE219a92qOpPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPteio7q0y7Smw7vT0LXaMNfWvdo8L3N0cm9uZz48L3A+Cgo8cD7TydPat9bH+LHtsPy6rcHLztLDx9Do0qq1xLTzsr+31tDFz6KjrL3Tz8LAtM7Sw8fW2LXjveLO9tK7z8K31sf4se2hozwvcD4KPHA+MDAwMDAxYjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICBjOCA4NyBkYSA5NSAwMCAwMDgwIDAxPC9wPgo8cD4wMDAwMDFjMCAgCjAxIDAwIDA3ICBmZSAgIGZmICAgZmYgICAzZiAgMDAgIDAwIDAwIDA2IDczIDQxIDA2IDAwIGZlPC9wPgo8cD4wMDAwMDFkMCAgIGZmICAgZmYgICAwZiAgIGZlICAgZmYgICBmZiAgIDQ1IDczICA0MSAwNiBiYiA1YyAwMSAxZjAwIDAwPGJyPgo8L3A+CjxwPjAwMDAwMWUwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAwMAogMDA8L3A+CjxwPjAwMDAwMWYwICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwNTUgYWE8YnI+CjwvcD4KPHA+yc/NvNbQo6zO0sPHzqo0uPa31sf4tcTE2sjdt9ax8LHqyc/By7K7zazR1cmroaPO0sPHzqrBy7e9seO94s72w7+49tfWts6jrNLUtdrSu7j2t9bH+M6qwP3X06GjsqLH0s6qw7+49tfWvdq31sXk0ru49sP719aho77fzOXI58/Co7o8L3A+CjxwPgo8dGFibGUgYm9yZGVyPQ=="1" width="700" cellpadding="1" cellspacing="1">8001010007feffff3f00000006734106status
f1f2f3parttype
l1l2l3lba1lba2lba3lba4s1s2s3s4
雖然看起來很多,但其實只有幾類:
status:是否是可啟動盤是的話就是0x80,否則就是0x00
f3+f2+f1:分區的開始位置
l3+l2+l1:分區的結束位置
s4+s3+s2+s1:分區的大小
parttype:分區類型,在fdisk中可以查看得到對應列表如。我這裡第一個分區是07類型,也就是HPFS/NTFS的windows檔案系統。第二個分區才是Linux。
二、fdisk驗證
我們以第一個主要磁碟分割為例子對某些欄位進行簡單的驗證,是fdisk /dev/sdb的結果
Boot:第一個位元組0x80說明第一個分區是可開機磁碟分割
Id:也就是parttype欄位對應的值是0x07
System:根據id從fdisk的表格中得到HPFS/NTFS檔案系統
Blocks:這裡是s4s3s2s1=0x06417306,我們同樣利用 echo "ibase=16;06417306/2" " bc 得到52476291k也剛好驗證了上面的數值。
Start:這裡f3f2f1=0x000101,我們利用echo “ibase=16;000101/2” | bc 得到128k。這裡為什麼是128k而不是上文fdisk中的1呢?主要是由於兩個問題造成,第一個是fdisk的end和start中的數值是指磁碟的柱面。所以並不是簡單的kB或者MB,因為根據磁碟型號不同,它每個柱面的大小容量也是不一樣的。此外第二個原因是這裡可能是由於磁碟的stripe造成的。(RAID卡配置--stripe size在每個磁碟上連續寫入資料的總量,也稱作“條帶深度”。)stripe一般預設是128k。可能由於預設的原因所以不是從柱面0開始,而是從1開始。
(註:硬碟容量 =柱面數(表示每面盤面上有幾條磁軌,一般總數是1024) ×磁頭數(表示盤面數) ×扇區數(表示每條磁軌有幾個扇區,一般總數是64)× 扇區(儲存基本單元,大小一般為512B/4KB))
三、fdisk的bash實現
前些實習的日子,找到了一個比較優美的bash代碼。是檢測MBR的開機磁碟分割、分區類型、大小等資訊。這些資訊也就是從我們上面介紹的分區表中得到。這裡把代碼拿出來,雖然實用性上不強(畢竟已經有fdisk)。但是拿出來一起學習,如果有不好的地方請指正哈。
實現效果: