android磁盘分区格式,转:磁盘分区表格式之android分区GPT
對于現在的系統來說,分區的類型千百種,但對于磁盤分區的layout來說,最常接觸的只是三種而已: MBR(Master Boot Record), GPT(Globe Partition Table)和Apple Partition(Mixed分區)。
MBR分區表:??磁盤上最重要的數據結構,其中包含小段引導代碼,磁盤信息,分區表等。在MBR的尾部有一個2-byte字段標記簽名或分區結構的結束,總標記為0x55AA。
GUID分區表:對于GPT磁盤采用帶有主備分區表結構的GUID分區表。這個結構分別保存在磁盤開頭和結尾的部分。相比MBR采用扇區Sector來識別的方法,GPT采用logical Block Address(LBA)來識別。Protective MBR:??在GPT磁盤中,LBA 0的位置存放著第一個結構Protective MBR,緊跟著,在LBA 1的位置存放這主GPT頭。隨后是GUID的分區Entry信息。
MBR和GPT分區格式對比圖
Apple分區表: Apple Partition Map (APM)是蘋果計算機上用來定義磁盤分區的數據結構,它引用了Logical Block的概念,通常512 bytes定義為一個Block,第一個Block中存放了蘋果特有的Block0結構。這種分區結構主要是在DOS分區的復雜性和BSD分區的數量限制中的一種折衷方案。蘋果分區表能描述任意數量的分區,以及后續扇區的數據結構。
APPLE分區表結構
Protective MBR
在GPT分區表的最開頭(LBA0),處于兼容性考慮仍然存儲了一份傳統的MBR,用來防止不支持GPT的硬盤管理工具錯誤識別并破壞硬盤中的數據,這個MBR也叫做叫做保護MBR。在支持從GPT啟動的操作系統中,這里也用于存儲第一階段的啟動代碼。在這個MBR中,只有一個標識為0xEE的分區,以此來表示這塊硬盤使用GPT分區表。不能識別GPT硬盤的操作系統通常會識別出一個未知類型的分區,并且拒絕對硬盤進行操作,除非用戶特別要求刪除這個分區,這就避免了意外刪除分區的危險。另外,能夠識別GPT分區表的操作系統會檢查保護MBR中的分區表,如果分區類型不是0xEE或者MBR分區表中有多個項,也會拒絕對硬盤進行操作。
Protective MBR
在使用MBR/GPT混合分區表的硬盤中,這部分存儲了GPT分區表的一部分分區(通常是前四個分區),可以使不支持從GPT啟動的操作系統從這個MBR啟動,啟動后只能操作MBR分區表中的分區。
MBR的分區表結構
MBR分區表是一個64-byte的數據結構,用來識別磁盤分區類型和位置。每個分區表項都是16bytes,最多4個分區表。每個分區表項在開始扇區的位置是預定的。
Partition 1? ?0x01BE? ?(446)
Partition 2? ?0x01CE? ?(462)
Partition 3? ?0x01DE? ?(478)
Partition 4? ?0x01EE? ?(494)
MBR分區表
GPT的分區表結構:
GPT分區表頭定義了硬盤的可用空間以及組成分區表的項的大小和數量。分區表頭還記錄了這塊硬盤的GUID,記錄了分區表頭本身的位置和大小(位置總是在LBA 1)以及備份分區表頭和分區表的位置和大小(在硬盤的最后)。它還儲存著它本身和分區表的CRC32校驗。固件、引導程序和操作系統在啟動時可以根據這個校驗值來判斷分區表是否出錯,如果出錯了,可以使用軟件從硬盤最后的備份GPT中恢復整個分區表,如果備份GPT也校驗錯誤,硬盤將不可使用。所以GPT硬盤的分區表不可以直接使用16進制編輯器修改。
主分區表和備份分區表的頭分別位于硬盤的第二個扇區(LBA 1)以及硬盤的最后一個扇區。備份分區表頭中的信息是關于備份分區表的。
GPT Header Structure-Data
GPT Header Structure
GPT分區頭信息依然占用一個完整的Block,其中在90-512未定義的字節都為預留。
對于分區表項,在64位系統的機器上,最多可以創建128個分區,即分區表中保留了128個項,其中每個都是128字節。(EFI標準要求分區表最小要有16,384字節,即128個分區項的大小)
GPT Partition Entry? ?Example
GPT Partition Entry
對于Apple系統需要注意:不要總是假定塊大小總是512bytes。很多固態硬盤可能包含1024字節的LBAs,而MO驅動器采用2048-bytes的Sectore(MO通常都不分區)。
因此,對于分區表的操作,都是基于Block來處理。
LBA0? ?Protective MBR
LBA1? ?GPT Header
LBA2-33 GPT Partition Entry??(一個LBA里包含4個分區表信息,512/128=4)。
注意:在對磁盤分區的規范中,不是從字節或者Sector。而是LBA角度進行了定義,也就是說即使有磁盤格式并不是512的block,而是1024或者4096的,但是存放分區表的位置依然是34個Block。
備份方法:
根據以上對磁盤分區的理解,對于GPT格式的磁盤,備份及恢復可以采用以下方式(未完全驗證)
1、備份分區表信息
sudo fdisk -l >hda.txt??#分區表信息重定向輸出到文件中
parted??p
2、備份分區表
a, 備份Protective MBR
linux#dd if=/dev/sda of=gpt-mbr bs=512 count=1??#輸入文件/dev/sda, 輸出文件mbr(自己定義),輸入(出)塊大小512字節,復制一次,由于mbr是512個字節,所以讀取寫到mbr文件中了
1+0 records in
1+0 records out
512 bytes (512 B) copied,4.0728e-05 秒,12.6 MB/秒
b,備份完整的GPT分區表(含Protective MBR, GPT頭,以及分區表)
linux#dd if=/dev/sda of=gpt-partition bs=512 count=34
c,??僅備份GPT頭和GPT分區
linux#dd if=/dev/sda of=gpt-partition bs=512 skip=1 count=33
3、恢復分區表
a, 恢復Protective MBR的分區信息
#dd if=gpt-mbr of=/dev/sda bs=1 skip=446 count=66??#輸入文件mbr,輸出 /dev/sda ,塊大小1個字節,輸入跳過446字節,恢復66個字節,看來恢復的只有66個字節
如果邏輯分區都沒有了,則用fdisk 照著hda.txt的信息重分一下就行了。
b, 恢復完整的Protective MBR
(在Mac OSX中對磁盤進行抹盤操作后(通常會創建一個128M的無數據區,或者一個Recovery HD區),非常容易將磁盤修改為混合磁盤模式,后續的Windows系統將無法正確識別磁盤,導致系統無法啟動)
#dd if=gpt-mbr of=/dev/sda bs=512 count=1
c, 恢復完整的GPT分區表信息
#dd if=gpt--partition of=/dev/sda bs=512 count=34
d, 恢復單獨的GPT分區信息(感覺意義不大)
#dd if=gpt-partition of=/dev/sda bs=512 skip=1 seek=1 count=33 (跳過備份表的一個bs, 再跳過sda的第一個bs然后再恢復數據)
另外有采用更為精致的腳本對分區進行恢復的方式(豆瓣不支持附件,就不對腳本進行上傳了)。
1、首先下載附件,將gpt.surgeon.py文件放在任意目錄下。
2、打開“終端”
3、輸入:cd xxxx??(這里的xxxx是剛才文件的存放目錄,如果你放在桌面那么就直接:cd desktop)
4、輸入:chmod +x gpt_surgeon.py
5、輸入:sudo ./gpt_surgeon.py list /dev/disk1??(disk1是需要修復的磁盤,可以在磁盤工具中看到這個標識)
6、輸入管理員密碼后看到:
Read MBR and GPT from /dev/disk1.
partition 0:
type: EFI System
name: u'EFI System Partition'
flags: 0x00000000
partition 1:
type: Microsoft Basic Data
name: u'\u672a\u547d\u540d 1'
flags: 0x00000000
7、可以看到磁盤所有可以識別的分區信息,找到你要恢復的分區表的編號。
6、輸入:sudo ./gpt_surgeon.py repair /dev/disk1 1 (disk1后面的1就是需要修復的分區表的編號)
7、完成。
總結
以上是生活随笔為你收集整理的android磁盘分区格式,转:磁盘分区表格式之android分区GPT的全部內容,希望文章能夠幫你解決所遇到的問題。