為什麼我的 1 KiB 塊大小的 100 MiB 分區沒有相應的可用塊/空間?
我有一個非常高密度的容器虛擬化環境,所以我試圖讓每個容器都非常小。“非常小”是指基礎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%,這是什麼?
現在進行調查*(劇透:沒有結果)*
- 文件系統可能不在設備的開頭開始。這很奇怪,但可能。幸運的是,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 等奇怪的問題。
- 這是雜誌!
不它不是。如果 df 輸出,則日誌從可用空間中佔用。
- 哦,我們有 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_journal
和resize_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
開頭跳過的字節,用於引導扇區之類的內容。