Filesystems

如何在 Linux 中檢查分區是否為擴展/主分區

  • February 25, 2019

以下是我使用(g)partedfdisk命令獲得的資訊。

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 的分區在其中。

引用自:https://unix.stackexchange.com/questions/502444