1 KiBブロックサイズのちょうど100 MiBのパーティションに、対応する使用可能なブロック/スペースがないのはなぜですか?


33

コンテナを使用した非常に高密度の仮想化環境があるため、各コンテナを本当に小さくしようとしています。「本当に小さい」とは、パッケージマネージャーの互換性を損なうことなく、ベース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は通常の4 KiBではなく、1 KiBサイズのブロックを作成することにしました。

これでマウントします。

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

そして、dfパラメーターなしで呼び出しましょう(1 KiBブロックを見たいです)

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

ちょっと待って

合計95054ブロックあります。ただし、デバイス自体には1 KiBの102400ブロックがあります。ストレージの92.8%しかありません。私のブロックはどこですか?

実際のブロックデバイスで見てみましょう。Aには16 GiB仮想ディスク、1Kの16777216ブロックがありますが、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.......|

16進数430 = 1072年12月なので、最初のキロバイトの後のどこかに。妥当に見える、ext4はVBRなどの奇妙なことに最初の1024バイトをスキップします。

  1. これは日記です!

いいえそうではありません。ジャーナルは、dfが出力される場合にAvailableからスペースを取ります。

  1. ああ、dump2fsがあり、そこでサイズを確認できます!

...多くのgreps ...

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によれば)

それが私がまだext2小さなパーティションに使用している理由です。
frostschutz

@frostschutz ext2はここでは妥当に見えます、確かに
マニアック

回答:


32

これを試して: 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「コスト」の空き容量(1550ブロックのほとんどは、1Kブロック/ 2%を表示しますdf-12Kは「lost + found」フォルダーに使用されます)
  • has_journal「コスト」使用可能スペース(4096の場合は1Kブロック)

当社は、取得102348のうち102400使用できない別の52個のブロック(我々は削除した場合は、フォルダ「失われた+が見つかりました。」)、。したがって、以下に飛び込みます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

使用済みブロック(バックアップスーパーブロック、グループ記述子、ブロックビットマップ、iノードビットマップ、iノードテーブル用)またはwe 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つのブロックを19持つ行と、それぞれ2つのブロックを持つ行があります。

13+19*2

51ext4自体が使用中のブロックを提供します。最後に、残っているブロックは1つだけです。ブロック0。これは1024、ブートセクターのようなものの先頭でスキップされたバイトです。


ジャーナルが4096kだけで済む場合、この番号(95054-4096)はありません!= 91456?
マニアック

ここのすべての数値はk単位であるため、合計95054k-4096kのジャーナル!= 91456kが利用可能です。
マニアック

1
dfジャーナル付きfs:95054k- dfjorunal 99150kなしのfs-そして、「使用可能」スペースと「空き」スペースを混在させないでください。
xx4h

xfsなどの一部のファイルシステムは、必要に応じてiノード用のスペースを動的に割り当てます。興味があるなら、xfsとbtrfsを試してみてください。 mkfs.xfs -l size=512 -d agcount=1絶対最小ログ(ジャーナル)サイズでファイルシステムを作成しますが、書き込みパフォーマンスが低下する可能性があります。XFSコードがログなしでの動作をサポートしているとは思わない。外部ログデバイスが破損した場合をサポートするための、おそらく読み取り専用。(また、agcount=1おそらく並列の書き込みパフォーマンスの別のひどい考えです。また、割り当てグループのヘッダーもおそらく小さいでしょう。)
ピーター・コーデス

興味を持ってXFSを試しました。Linux XFSのオプションの組み合わせがあり、最小ログサイズを512ブロックの絶対最小値まで下げることができる場合は、それをIDKします。 mkfs.xfs -d agcount=1100MiBパーティションで95980kiBのFSを作成し、5196kを使用し、90784kを使用できました。デフォルトのagcountは4であり、デフォルトのログサイズは1605ブロック(これも最小)です。そのため、XFSは小さなFSに対して、指定できる限り小さなログを使用します。
ピーターコーデス

19

短い答え:

ブロックデバイス上のすべてのスペースがデータ用に使用できるスペースになるわけではありません。未加工スペースの一部は、ファイルシステム内部、背後での簿記に必要です。

その簿記には、スーパーブロック、ブロックグループ記述子、ブロックおよびiノードビットマップ、およびiノードテーブルが含まれます。さらに、バックアップ/リカバリ用のスーパーブロックのコピーがいくつかの場所に作成されます。ext4ファイルシステムの内部に関する長い読み取りがで見つけることができext4.wiki.kernel.org

EXT4はジャーナリングされたファイルシステムであるため、同様にスペースを占有します。

さらに、ファイルシステムの将来の拡張のためにいくつかのスペースが予約されています。

長い答え:

テストシステムの1つでシナリオを再作成しました。

lvcreate -L 100M -n test MyVG
mkfs.ext4 -b 1024 /dev/MyVG/test 

次に、ファイルシステムa 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私たちに何を見せてくれますか?Rawストレージデバイスの102400ブロックから、99150の1Kブロックがファイルシステムに表示されます。これは、3250の1KバイトブロックのRawストレージスペースが実際のデータストレージに使用できなくなったことを意味します。

それらのブロックはどこに行きましたか?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)最初の1024バイトはスキップされ、x86ブートセクターおよびその他の奇妙な部分のインストールが可能になります。
1 block プライマリスーパーブロックによって占有されています。
1 block グループ記述子が含まれます。
256 blocksされているグループ記述子表のために予約ファイルシステムの将来のサイズ変更を可能にするため。 16 blocks ブロックビットマップに割り当てられます。
16 blocksiノードビットマップに割り当てられます。
246 blocksiノードテーブルに割り当てられます。

これは、3250個の欠落ブロックのうち537個をすでに占めています。ext4ファイルシステムは一連のブロックグループに分割され、さらに下にスクロールすると、他のブロックグループのファイルシステム内部へのrawストレージ容量の同様の割り当てが示されます。

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(ファイルシステムのサイズ)MINUS 5120(予約ブロック数)MINUS 5646(使用済みブロック、そのうち4096はジャーナルから(再びdumpe2fs`出力の一部))
= 88384

dumpe2fsの空きブロック数は、ファイルシステムの使用可能なサイズから実際の使用量を引いたものです(予約ブロックを考慮に入れません)。したがって、99150-5646 = 93504です。


0

質問への答えではありませんが、私は興味を持ちました。すでにliveCDが起動していて、タイプミスで何かを壊す心配をせずに台無しにできるハードドライブがあったので、先に進んでテストしました。

Ubuntu 14.10がmkfsを出荷するすべてのFSで、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

(jfsは、 "touched"を削除した後も1%の使用率に戻りました。時間の遅延があったか、利用可能なサイズを更新するために別の書き込みが必要になりました。)

とにかく、それは私の好奇心のためだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.