如何在 Linux 中檢查分區是否為擴展/主分區
以下是我使用
(g)parted
或fdisk
命令獲得的資訊。Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 196265983 196263936 93.6G 83 Linux /dev/sda2 196268030 229468159 33200130 15.9G 5 Extended /dev/sda5 196268032 229468159 33200128 15.9G 82 Linux swap / Solaris
是否有基於系統呼叫或文件系統(/sys/block 等)的資訊可用於了解分區是否為擴展/主分區以及 sda2 下的層次結構 sda5 等?如果是,有沒有辦法知道所選擴展分區下是否有哪些邏輯分區?
我想避免解析命令的輸出。我試圖閱讀 fdisk 的程式碼,但它太複雜了,我無法理解。
編輯 1:閱讀評論和答案後,我知道我不知道 MBR/GPT 等。所以,我決定閱讀 MBR 和 EBR 內部結構https://thestarman.pcministry.com/asm/mbr/ PartTables2.htm#ebr並編寫了一段程式碼來獲取磁碟的分區詳細資訊。
這個問題沒有很好的定義。
如果磁碟使用 GPT 格式化,則沒有擴展分區,因此沒有層次結構。
如果磁碟使用 MBR 格式化為 Microsoft 作業系統可以訪問的方式,則最多有 1 個擴展分區,總共最多 4 個主分區和擴展分區。這些將具有 /dev/sdf 形式的名稱
$$ 0-3 $$. 如果有任何邏輯分區,它們的分區號將大於 4。為了擁有邏輯分區,您必須有一個擴展分區來保存它們。 但是沒有什麼要求Linux系統最多有一個擴展分區,也沒有什麼可以說非擴展分區不能重疊,只要你不使用它們。
所以特別是你可以讓分區 1 是一個小的引導分區,分區 2 覆蓋分區 1 中沒有的所有內容,分區 3 覆蓋分區 2 的前半部分並且是“擴展”類型,分區 4 是後半部分分區 2。在分區 3 內,您可以有分區 5 和 6,每個分區佔分區 3 的一半。只要您實際上沒有嘗試使用分區 2,這一切都可以正常工作。但是分區 5 和 6 都在分區 2 中和3,所以“層次結構”不是DAG(有向無環圖),因此不能滿足“客戶需求”。
我對這樣的客戶的建議是將您的費用翻倍。
主/擴展分區的“類型”記錄在 MBR 中,因此您可以使用類似程式碼
dd bs=1 skip=446 count=64 if=/dev/sdf | hexdump -C
來獲得類似這樣的內容00000000 00 20 21 00 83 df 13 0c 00 08 00 00 00 20 03 00 |. !.......... ..| 00000010 00 df 14 0c 05 19 0d cc 00 28 03 00 00 e0 2e 00 |.........(......| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 19 0e cc 83 15 50 05 00 08 32 00 00 f8 0d 00 |......P...2.....|
你可以挑出第 5 個字節 (83, 05, 00, 83) 來獲得 4 個值。擴展分區的通常“類型”是 05,但也使用 0f 和 85。有關詳細資訊,請參閱https://www.win.tue.nl/~aeb/partitions/partition_types-1.html。
因此,您可以通過此查看是否有擴展分區(在本例中為第二個),然後您就知道編號大於 4 的分區在其中。