私は非常に高密度のコンテナ仮想化環境を持っているので、各コンテナを非常に小さくすることを試みています。 「非常に小さい」は87MBを意味します。Ubuntu14.04(Trusty Tahr)はパッケージマネージャの互換性を損なうことはありません。
だから私は使う左心室容積私のコンテナのバックアップストアとして、最近非常に奇妙な数字を見ました。ここに彼らが来る。
100MiB(例、2の累乗)論理ボリュームを作成してみましょう。
sudo lvcreate -L100M -n test1 /dev/purgatory
寸法を確認したいので発行します。sudo lvs --units k
test1 purgatory -wi-a---- 102400.00k
マブソサ、文字通り100MiBです。
今外部4ファイルシステムもちろん、-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は通常の4KiBの代わりに1KiBサイズのブロックを作成することにしました。
今インストールします。
sudo mount /dev/purgatory/test1 /mnt/test1
引数なしで呼び出してみましょうdf
(1KiBチャンクを見たい)。
/dev/mapper/purgatory-test1 95054 1550 91456 2% /mnt/test1
待って、よ〜
合計95054ブロックがあります。ただし、デバイス自体には102,400個の1KiBブロックがあります。ストレージスペースは92.8%しかありません。私たちの近所はどこですか?
実際のブロックデバイスを見てみましょう。 Aには16777216個の1Kブロックを持つ16GiB仮想ディスクがありますが、df出力には15396784個のブロックしかありません。 91.7%、これは何ですか?
これで、調査状況が次のように報告されます。(スポイラー:結果なし)
ファイルシステムはデバイスの先頭から起動できません。奇妙ですが可能です。幸い、ext4にはマジックバイトがあるので、その存在を確認してみましょう。
sudo hexdump -C /dev/purgatory/test1 | 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.......|
16進数430 = 1072年12月なので、最初のキロバイト以降のどこかにあります。合理的に見えます。 ext4は、VBRなどの奇妙な現象を処理するために最初の1024バイトをスキップします。
- これは日記です!
まったくそうではありません。ログは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による)
答え1
この試み: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
「コスト」無料スペース (df
-12K に表示される 1550 個の 1K-ブロック/2% の大部分は "lost+found" フォルダー用のもの)has_journal
「コスト」書くことができるスペース(あなたの場合は4096 1Kブロック)
102348
使用できない別の 52 個のブロックが残ります ( 102400
「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
これは2つのブロックを持つ行数を提供します(この場合)。
13
したがって、(この例では)それぞれ1つのブロックを含む行と、それぞれ2つのブロックを含む行があります19
。
13+19*2
51
ext4自体が使用するブロックを提供します。ついに一枚だけ残りました。ブロック0は、1024
ブートセクタなどの先頭からスキップされたバイトです。
答え2
短い答え:
ブロックデバイスのすべてのスペースがデータ用に使用可能なスペースになるわけではありません。いくつかの生のスペースは、ファイルシステムの内部と隠し帳簿のために必要です。
このレコードには、スーパーブロック、ブロックグループ記述子、ブロックとinodeビットマップ、inodeテーブルが含まれます。また、バックアップ/復元の目的で、スーパーブロックのコピーが複数の場所に作成されます。 EXT4ファイルシステムの内部に関するより長い記事は、以下にあります。ext4.wiki.kernel.org。
EXT4はログファイルシステムなので、少しのスペースも占めています。
さらに、将来のファイルシステム拡張のためにいくつかのスペースが予約されています。
長い答え:
私のテストシステムの1つでシナリオを再現しました。
lvcreate -L 100M -n test MyVG
mkfs.ext4 -b 1024 /dev/MyVG/test
その後、ファイルシステムをマウントする前に、次のdumpe2fs
ものが表示されます。
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 25688
Block count: 102400
Reserved block count: 5120
Free blocks: 93504
Free inodes: 25677
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 1976
Inode blocks per group: 247
Flex block group size: 16
Filesystem created: Fri Feb 20 13:20:54 2015
Last mount time: n/a
Last write time: Fri Feb 20 13:20:55 2015
...
Journal size: 4096k
...
インストール後:
df /tmp/test/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/MyVG-test 99150 5646 88384 7% /tmp/test
それでは、df
それは私たちに何を示していますか?生のストレージ容量の102,400ブロックのうち99,150ブロックがファイルシステムに表示されます。これは、生のストレージスペースの3,250個の1Kバイトブロックが実際のデータストレージに使用できなくなることを意味します。
その塊はどこに行きましたか?出力を下にスクロールしてdumpe2fs
正確な位置を表示します。
Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
Checksum 0x0d67, unused inodes 1965
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 275 (+274)
Inode table at 291-537 (+290)
4683 free blocks, 1965 free inodes, 2 directories, 1965 unused inodes
Free blocks: 3510-8192
Free inodes: 12-1976
1 block
(ブロック#0)x86ブートセクタやその他の奇妙なエントリをインストールできるように、最初の1024バイトをスキップします。
1 block
1次スーパーブロックが占有。
1 block
グループ記述子を含みます。
256 blocks
はいグループ記述子テーブル用に予約済み将来のファイルシステムのサイズを変更することができます。
16 blocks
ブロックビットマップに割り当てられます。
16 blocks
inode ビットマップに割り当てられます。
246 blocks
inode テーブルに割り当てられます。
これはすでに欠けている3,250ブロックのうち537を占めています。 ext4ファイルシステムは一連のブロックグループに分かれています。
Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0x0618, unused inodes 1976
Backup superblock at 8193, Group descriptors at 8194-8194
Reserved GDT blocks at 8195-8450
Block bitmap at 260 (+4294959363), Inode bitmap at 276 (+4294959379)
Inode table at 538-784 (+4294959641)
7934 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
Free blocks: 8451-16384
Free inodes: 1977-3952
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0xcfd3, unused inodes 1976
Block bitmap at 261 (+4294951172), Inode bitmap at 277 (+4294951188)
Inode table at 785-1031 (+4294951696)
8192 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
Free blocks: 16385-24576
Free inodes: 3953-5928
Group ....
これで出力に戻りますdf
。
df /tmp/test/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/MyVG-test 99150 5646 88384 7% /tmp/test
新しいファイルシステムでは、次の理由で容量の7%が使用中としてマークされます。
99150(ファイルシステムサイズ) - 5120(予約済みブロック数) - 5646(使用されているブロックのうち4096はログ(またdumpe2fs出力の一部)からのものです)
= 88384
dumpe2fsの空きブロック数は、ファイルシステムの空きサイズから実際の使用量を引いたものなので(予約ブロックは考慮しません)、99150 - 5646 = 93504です。
答え3
これは質問に対する答えではありませんが、疑問に思って他の人もそうするだろうと思いました。 liveCDを起動し、タイプミスによって破損する心配なしにハードドライブを勝手に使用できたので、テストを続けました。
mkfsを持つすべてのFSに対して、Ubuntu 14.10を使用して100MiBパーティションにパーティションを作成しました。 (64MiBのみをサポートするminixとSCOについて聞いたことのないbfsは除く。)
df -k
まず、(デフォルトのmkfs設定を使用して)利用可能なスペースを調べてから、各FSのファイルを編集dd
して/dev/zero
常に埋め込まれていることを確認しました。 (つまり、宣言されたコンテンツがavailable space
実際に利用可能であることを確認してください。)
for i in /media/ubuntu/small-*;do sudo dd if=/dev/zero of="$i/fill" bs=16k;done
* FS: empty `df -k` : non-zero `df -k` when full (false bottom)
* jfs: 101020k
* fat32:100808k : 4
* ntfs: 99896k
* btrfs: 98276k : 4428
* ext2: 92480k
* xfs: 90652k : 20
* ext4: 86336k
* ext3: 88367k
* reiserfs(v3): 69552k
btrfsに未使用のスペースが多すぎるのはなぜですか?メタデータ用ですか?まあ…いいえ:
$ for i in /media/ubuntu/small-*;do sudo touch "$i/touched";done
touch: cannot touch ‘/media/ubuntu/small-btrfs/touched’: No space left on device
touch: cannot touch ‘/media/ubuntu/small-reiser/touched’: No space left on device
ツリーベースのファイルシステムは空のファイルをどこにでも圧縮できませんが、他のすべてのシステムでは可能です。
または、作成できるファイルのサイズを確認してください。
$ ls -SdlG --block-size=1k /media/ubuntu/small-*/*
-rw-r--r-- 1 root 101020 Feb 21 11:55 /media/ubuntu/small-jfs/fill
-rw-r--r-- 1 ubuntu 100804 Feb 21 11:55 /media/ubuntu/small-fat/fill
-rw------- 1 ubuntu 99848 Feb 21 11:55 /media/ubuntu/small-ntfs/fill
-rw-r--r-- 1 root 97216 Feb 21 11:55 /media/ubuntu/small-ext2/fill
-rw-r--r-- 1 root 93705 Feb 21 11:27 /media/ubuntu/small-btrfs/foo
-rw-r--r-- 1 root 93120 Feb 21 11:55 /media/ubuntu/small-ext3/fill
-rw-r--r-- 1 root 91440 Feb 21 11:55 /media/ubuntu/small-ext/fill
-rw-r--r-- 1 root 90632 Feb 21 11:55 /media/ubuntu/small-xfs/fill
-rw-r--r-- 1 root 69480 Feb 21 11:55 /media/ubuntu/small-reiser/fill
drwx------ 2 root 12 Feb 21 11:33 /media/ubuntu/small-ext2/lost+found
drwx------ 2 root 12 Feb 21 11:43 /media/ubuntu/small-ext3/lost+found
drwx------ 2 root 12 Feb 21 11:29 /media/ubuntu/small-ext/lost+found
(私はすべてのファイルシステムを作成することに夢中にしたくないので、ext4パーティションを「small-ext」と呼びます。したがって、ここではext = ext4です。元のpre-ext2 extではありません。)
df -k
再度削除すると、出力は次のようになります。
/dev/sdd6 95980 5328 90652 6% /media/ubuntu/small-xfs
/dev/sdd7 95054 1550 86336 2% /media/ubuntu/small-ext
/dev/sdd5 102400 93880 101020 96% /media/ubuntu/small-btrfs
/dev/sdd8 101168 101168 0 100% /media/ubuntu/small-jfs
/dev/sdd9 99150 1550 92480 2% /media/ubuntu/small-ext2
/dev/sdd10 102392 32840 69552 33% /media/ubuntu/small-reiser
/dev/sdd11 100808 1 100808 1% /media/ubuntu/small-fat
/dev/sdd12 102396 2548 99848 3% /media/ubuntu/small-ntfs
/dev/sdd13 95054 1567 88367 2% /media/ubuntu/small-ext3
(「touched」を削除した後、jfsの使用量も1%に戻りました。時間が遅れているか、更新する余裕を得るために別の書き込みが必要でした。)
とにかく、ちょうど私の好奇心のためだったようだ。