lsblk 和 fdisk 如何為同一個分區顯示不同的大小?
我正在執行一個 virtualbox VM,我可以看到 /dev/sda2 的大小在兩個輸出中顯示不同。此外,在 fdisk 的輸出中,/dev/sda2 和 /dev/sda5 似乎重疊
~$ lsblk /dev/sda NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 29.3G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 9.5G 0 part / ~$ sudo fdisk -l /dev/sda Disk /dev/sda: 29.3 GiB, 31457280000 bytes, 61440000 sectors Disk model: VBOX HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x8f66391d Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 1050623 1048576 512M b W95 FAT32 /dev/sda2 1052670 20969471 19916802 9.5G 5 Extended /dev/sda5 1052672 20969471 19916800 9.5G 83 Linux
該
sda2
分區是容器分區。它的格式與磁碟的主引導記錄(MBR)非常相似,被稱為擴展引導記錄(EBR),它本身佔用四個可能的主分區插槽之一。它的存在是為了克服 MBR 中 4 個分區的歷史限制。它在其自身內部包含擴展分區(在 Linux 中從分區 5 開始顯示)並被連結:每個進一步的擴展分區也有一個帶有兩個條目的 EBR:一個引用分區本身的數據,一個引用下一個擴展分區的 EBR如果有的話。所有擴展分區(所以這裡sda5
)都在它們的容器分區(這裡sda2
)內,因此 fdisk 將始終報告重疊塊。從MBR的角度來看,它使用了為在其中添加擴展分區而保留的所有空間,因此它的大小必須大於所有擴展分區的大小。
從核心 API 報告給使用者空間的角度來看
lsblk
,分區 2 只是出於禮貌而顯示的粘合分區,不應被篡改。報告的數據大小只是 EBR 成本,此處為 1K,否則對分區 2 的讀取或寫入(這已經很糟糕,因為它會破壞到其中所有擴展分區的初始連結)也將允許對分區 5 進行讀取或寫入。它可以即使已選擇報告大小為 0,也沒關係。sda
這與代表整個磁碟的自身處理不同。當您考慮進一步擴展分區與每個先前擴展分區的 EBR 連結時,這是有道理的:它們的內部 EBR 甚至不可用,只能看到它們的實際數據。您應該考慮使用GPT分區而不是 MBR/EBR 分區:它是一種現代的分區方案,它更加理智,並且沒有這樣的限制和變通方法。或者你也可以在一個(主要的,不需要擴展的)分區中選擇LVM :這也是一種容器形式,用於在不同的抽象層對塊進行分區,並提供了很多特性。