Ext4

為什麼我的 1 KiB 塊大小的 100 MiB 分區沒有相應的可用塊/空間?

  • February 22, 2015

我有一個非常高密度的容器虛擬化環境,所以我試圖讓每個容器都非常小。“非常小”是指基礎Ubuntu 14.04 (Trusty Tahr) 上的 87 MB,而不會破壞包管理器的兼容性。

所以我使用LVM作為容器的備份儲存,最近我發現了非常奇怪的數字。他們來了。

讓我們創建一個 100 MiB(是的,2 的冪)邏輯卷。

sudo lvcreate -L100M -n test1 /dev/purgatory

我想檢查尺寸,所以我發出sudo lvs --units k

test1             purgatory  -wi-a----  102400.00k

甜,這真的是 100 MiB。

現在讓我們創建一個ext4文件系統。當然,我們還記得-m 0參數,它可以防止空間浪費。

sudo mkfs.ext4 -m 0 /dev/purgatory/test1

mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
       8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

甜美乾淨。注意塊大小 - 我們的邏輯卷很小,所以 mkfs.ext4 決定製作一個 1 KiB 大小的塊,而不是通常的 4 KiB。

現在我們將安裝它。

sudo mount /dev/purgatory/test1 /mnt/test1

讓我們df不帶參數呼叫(我們希望看到 1 KiB 塊)

/dev/mapper/purgatory-test1     95054    1550     91456   2% /mnt/test1

等等哦shi~

我們總共有 95054 個區塊。但是設備本身有 102400 個 1 KiB 的塊。我們只有 92.8% 的儲存空間。我的積木在哪裡,伙計?

讓我們在一個真正的塊設備上看它。A 有一個 16 GiB 的虛擬磁碟,16777216 個 1K 的塊,但 df 輸出中只有 15396784 個塊。91.7%,這是什麼?

現在進行調查*(劇透:沒有結果)*

  1. 文件系統可能不在設備的開頭開始。這很奇怪,但可能。幸運的是,ext4 有魔術字節,讓我們檢查一下它們的存在。

sudo hexdump -C /dev/purgatory/test1 | grep “53 ef”

這顯示了超級塊:

00000430  a9 10 e7 54 01 00 ff ff  53 ef 01 00 01 00 00 00  |...T....S.......|

十六進制 430 = 1072 年 12 月,所以在第一個千字節之後的某個地方。看起來很合理,ext4 會跳過前 1024 個字節來處理 VBR 等奇怪的問題。

  1. 這是雜誌!

不它不是。如果 df 輸出,則日誌從可用空間中佔用。

  1. 哦,我們有 dump2fs 並且可以檢查那裡的大小!

…很多grep …

sudo dumpe2fs /dev/purgatory/test1 | grep "Free blocks"

哎喲。

Free blocks:              93504
 Free blocks: 3510-8192
 Free blocks: 8451-16384
 Free blocks: 16385-24576
 Free blocks: 24835-32768
 Free blocks: 32769-40960
 Free blocks: 41219-49152
 Free blocks: 53249-57344
 Free blocks: 57603-65536
 Free blocks: 65537-73728
 Free blocks: 73987-81920
 Free blocks: 81921-90112
 Free blocks: 90113-98304
 Free blocks: 98305-102399

我們還有另一個號碼。93504 個空閒塊。

問題是:發生了什麼事?

  • 塊設備:102400k(lvs說)
  • 文件系統大小:95054k(df 表示)
  • 免費塊:93504k(dumpe2fs 說)
  • 可用尺寸:91456k(df 表示)

試試這個:mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1

我認為這確實讓您了解“發生了什麼”。

-N 104(設置文件系統應該有的 iNode 數量)

  • 每個 iNode “成本”可用空間(128 字節)

-m 0(沒有保留塊)

-O ^has_journal,^resize_inode(停用功能has_journalresize_inode

  • resize_inode“成本”可用空間(您在您的 - 12K 中看到的大部分 1550 個 1K-Blocks/2%df用於“lost+found”文件夾)
  • has_journal“成本”可用空間(在您的情況下為 4096 1K 塊)

我們102348離開了102400,另外 52 個塊無法使用(如果我們刪除了“lost+found”文件夾)。因此,我們深入研究dumpe2fs

Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
 Checksum 0x5ee2, unused inodes 65533
 Primary superblock at 1, Group descriptors at 2-2
 Block bitmap at 3 (+2), Inode bitmap at 19 (+18)
 Inode table at 35-35 (+34)
 8150 free blocks, 0 free inodes, 1 directories, 65533 unused inodes
 Free blocks: 17-18, 32-34, 48-8192
 Free inodes: 
Group 1: (Blocks 8193-16384) [BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x56cf, unused inodes 5
 Backup superblock at 8193, Group descriptors at 8194-8194
 Block bitmap at 4 (+4294959107), Inode bitmap at 20 (+4294959123)
 Inode table at 36-36 (+4294959139)
 8190 free blocks, 6 free inodes, 0 directories, 5 unused inodes
 Free blocks: 8193-16384
 Free inodes: 11-16
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x51eb, unused inodes 8
 Block bitmap at 5 (+4294950916), Inode bitmap at 21 (+4294950932)
 Inode table at 37-37 (+4294950948)
 8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 16385-24576
 Free inodes: 17-24
Group 3: (Blocks 24577-32768) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x3de1, unused inodes 8
 Backup superblock at 24577, Group descriptors at 24578-24578
 Block bitmap at 6 (+4294942725), Inode bitmap at 22 (+4294942741)
 Inode table at 38-38 (+4294942757)
 8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 24577-32768
 Free inodes: 25-32
Group 4: (Blocks 32769-40960) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x79b9, unused inodes 8
 Block bitmap at 7 (+4294934534), Inode bitmap at 23 (+4294934550)
 Inode table at 39-39 (+4294934566)
 8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 32769-40960
 Free inodes: 33-40
Group 5: (Blocks 40961-49152) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x0059, unused inodes 8
 Backup superblock at 40961, Group descriptors at 40962-40962
 Block bitmap at 8 (+4294926343), Inode bitmap at 24 (+4294926359)
 Inode table at 40-40 (+4294926375)
 8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 40961-49152
 Free inodes: 41-48
Group 6: (Blocks 49153-57344) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x3000, unused inodes 8
 Block bitmap at 9 (+4294918152), Inode bitmap at 25 (+4294918168)
 Inode table at 41-41 (+4294918184)
 8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 49153-57344
 Free inodes: 49-56
Group 7: (Blocks 57345-65536) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x5c0a, unused inodes 8
 Backup superblock at 57345, Group descriptors at 57346-57346
 Block bitmap at 10 (+4294909961), Inode bitmap at 26 (+4294909977)
 Inode table at 42-42 (+4294909993)
 8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 57345-65536
 Free inodes: 57-64
Group 8: (Blocks 65537-73728) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0xf050, unused inodes 8
 Block bitmap at 11 (+4294901770), Inode bitmap at 27 (+4294901786)
 Inode table at 43-43 (+4294901802)
 8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 65537-73728
 Free inodes: 65-72
Group 9: (Blocks 73729-81920) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x50fd, unused inodes 8
 Backup superblock at 73729, Group descriptors at 73730-73730
 Block bitmap at 12 (+4294893579), Inode bitmap at 28 (+4294893595)
 Inode table at 44-44 (+4294893611)
 8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 73729-81920
 Free inodes: 73-80
Group 10: (Blocks 81921-90112) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x60a4, unused inodes 8
 Block bitmap at 13 (+4294885388), Inode bitmap at 29 (+4294885404)
 Inode table at 45-45 (+4294885420)
 8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 81921-90112
 Free inodes: 81-88
Group 11: (Blocks 90113-98304) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
 Checksum 0x28de, unused inodes 8
 Block bitmap at 14 (+4294877197), Inode bitmap at 30 (+4294877213)
 Inode table at 46-46 (+4294877229)
 8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 90113-98304
 Free inodes: 89-96
Group 12: (Blocks 98305-102399) [INODE_UNINIT, ITABLE_ZEROED]
 Checksum 0x9223, unused inodes 8
 Block bitmap at 15 (+4294869006), Inode bitmap at 31 (+4294869022)
 Inode table at 47-47 (+4294869038)
 4095 free blocks, 8 free inodes, 0 directories, 8 unused inodes
 Free blocks: 98305-102399
 Free inodes: 97-104

併計算已使用的塊(用於備份超級塊、組描述符、塊點陣圖、Inode 點陣圖和 Inode 表)或我們grep併計算:

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep -v ',' | wc -l

它為我們提供了具有單個塊的行數(在我們的範例中)和

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep ',' | wc -l

這給了我們有兩個塊的行數(在我們的例子中)。

所以我們有(在我們的例子中)13每行有一個塊,每19行有兩個塊。

13+19*2

這為我們提供51了 ext4 本身正在使用的塊。最後只剩下一個街區。塊 0,它是1024開頭跳過的字節,用於引導扇區之類的內容。

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