Mengapa partisi 100 MiB saya yang tepat dengan ukuran blok 1 KiB tidak memiliki blok / ruang yang sesuai?


33

Saya memiliki lingkungan tervirtualisasi dengan wadah yang sangat tinggi, jadi saya mencoba membuat setiap wadah sangat kecil. "Sangat kecil" berarti 87 MB di pangkalan Ubuntu 14.04 (Trusty Tahr) tanpa memutus kompatibilitas manajer paket.

Jadi saya menggunakan LVM sebagai penyimpanan dukungan untuk wadah saya dan baru-baru ini saya menemukan angka yang sangat aneh. Di sini mereka.

Mari kita buat volume logis 100 MiB (yeah, kekuatan 2).

sudo lvcreate -L100M -n test1 /dev/purgatory

Saya ingin memeriksa ukuran, jadi saya masalah sudo lvs --units k

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

Manis, ini benar-benar 100 MiB.

Sekarang mari kita membuat sistem file ext4 . Dan tentu saja, kita ingat -m 0parameter, yang mencegah pemborosan ruang.

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

Manis dan bersih Pikirkan ukuran blok - volume logis kami kecil, jadi mkfs.ext4 memutuskan untuk membuat blok berukuran 1 KiB, bukan yang biasanya 4 KiB.

Sekarang kita akan memasangnya.

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

Dan mari kita panggil dftanpa parameter (kami ingin melihat 1 blok KiB)

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

Tunggu, oh shi ~

Kami memiliki total 95054 blok. Tetapi perangkat itu sendiri memiliki 102400 blok 1 KiB. Kami hanya memiliki 92,8% dari penyimpanan kami. Di mana blok saya, teman?

Mari kita melihatnya pada perangkat blok nyata. A memiliki disk virtual 16 GiB, 16777216 blok 1K, tetapi hanya 15396784 blok dalam output df. 91,7%, apa itu?

Sekarang ikuti investigasi (spoiler: tidak ada hasil)

  1. Filesystem bisa dimulai bukan di awal perangkat. Ini aneh, tetapi mungkin. Untungnya, ext4 memiliki byte ajaib, mari kita periksa keberadaan mereka.

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

Ini menunjukkan superblock:

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

Hex 430 = Des 1072, jadi di suatu tempat setelah kilobyte pertama. Terlihat masuk akal, ext4 melompati 1024 byte pertama untuk keanehan seperti VBR, dll.

  1. Ini jurnal!

Tidak, bukan. Jurnal mengambil ruang dari Tersedia jika output df.

  1. Oh, kami punya dump2fs dan dapat memeriksa ukuran di sana!

... banyak greps ...

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

Aduh.

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

Dan kami memiliki nomor lain. 93504 blok gratis.

Pertanyaannya adalah: apa yang terjadi?

  • Blokir perangkat: 102400k (kata lvs)
  • Ukuran sistem file: 95054k (kata df)
  • Blok gratis: 93504k (kata dumpe2fs)
  • Ukuran yang tersedia: 91456k (kata df)

Itu sebabnya saya masih menggunakan ext2untuk partisi kecil.
frostschutz

@frostschutz ext2terlihat masuk akal di sini, tentu saja
maniaque

Jawaban:


32

Coba ini: mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1

Saya pikir ini tidak membuat Anda mengerti "apa yang sedang terjadi".

-N 104 (setel jumlah iNodes yang seharusnya dimiliki sistem file Anda)

  • setiap iNode "biaya" ruang yang dapat digunakan (128 Byte)

-m 0(tidak ada blok yang dipesan)
-O ^has_journal,^resize_inode(nonaktifkan fitur has_journaldanresize_inode

  • resize_inode"biaya" bebas ruang (sebagian besar 1550 1K-Blok / 2% yang Anda lihat di Anda df- 12K digunakan untuk "hilang + ditemukan" folder)
  • has_journal"biaya" ruang yang dapat digunakan (4096 1K-Blok dalam kasus Anda)

Kami 102348keluar dari 102400, 52 blok lainnya tidak dapat digunakan (jika kami telah menghapus folder "hilang + ditemukan"). Karena itu kami menyelami 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

dan hitung blok yang digunakan (untuk Superblock cadangan, deskriptor grup, Blok bitmap, bitmap inode, dan tabel inode) atau kami grepdan hitung:

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

yang memberi kita jumlah baris yang memiliki satu blok (dalam contoh kita) dan

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

yang memberi kita hitungan garis yang memiliki dua blok (dalam contoh kita).

Jadi kami memiliki (dalam contoh kami) 13baris dengan masing-masing satu blok dan 19baris dengan dua blok masing-masing.

13+19*2

yang memberi kita 51blok yang digunakan oleh ext4 itu sendiri. Akhirnya hanya ada satu blok yang tersisa. Blok 0, yang merupakan 1024byte yang dilompati di awal untuk hal-hal seperti sektor boot.


Dan jika jurnal hanya membutuhkan 4096k, saya tidak memiliki nomor ini (95054 - 4096)! = 91456?
maniaque

Semua angka di sini adalah dalam k, jadi total 95054k - 4096k jurnal! = 91456k tersedia.
maniaque

1
dfdi fs dengan jurnal: 95054k - dfdi fs tanpa jorunal 99150k - dan jangan mencampur ruang "dapat digunakan" dan "bebas".
xx4h

Beberapa sistem file, misalnya xfs, secara dinamis mengalokasikan ruang untuk inode sesuai kebutuhan. Anda mungkin ingin mencoba xfs dan btrfs, jika Anda penasaran. mkfs.xfs -l size=512 -d agcount=1akan membuat sistem file dengan ukuran log minimum absolut (alias jurnal), tetapi kinerja penulisan mungkin menurun. Saya tidak berpikir dukungan kode XFS beroperasi tanpa log. Mungkin hanya-baca, untuk mendukung kasus-kasus di mana perangkat log eksternal rusak. (juga, agcount=1mungkin ide buruk lain untuk kinerja menulis, terutama paralel. Dan header grup alokasi mungkin juga kecil.)
Peter Cordes

Penasaran dan mencoba XFS. Jika ada kombinasi opsi untuk Linux XFS yang akan membiarkan ukuran log minimum turun ke minimum absolut 512 blok, IDK apa itu. mkfs.xfs -d agcount=1pada partisi 100MiB membuat FS 95980kiB, dengan 5196k digunakan, 90784k tersedia. Agcount default adalah 4, dan ukuran log default adalah 1605 blok (juga minimum). Jadi XFS memang menggunakan log sekecil yang bersedia Anda tentukan, untuk FSe kecil.
Peter Cordes

19

Jawaban singkatnya:

Tidak semua ruang pada perangkat blok menjadi ruang yang tersedia untuk data Anda: beberapa ruang mentah diperlukan untuk internal sistem file, pembukuan di belakang layar.

Pembukuan itu termasuk blok super, deskriptor grup blok, bitmap inode dan blok, dan tabel inode. Selain itu, salinan blok super untuk keperluan pencadangan / pemulihan dibuat di sejumlah lokasi. Bacaan panjang tentang internal sistem file EXT4 dapat ditemukan di ext4.wiki.kernel.org .

Karena EXT4 adalah sistem file jurnal yang membutuhkan ruang juga.

Selain itu beberapa ruang disediakan untuk ekspansi sistem file di masa depan.

Jawaban panjangnya:

Saya telah membuat ulang skenario Anda di salah satu sistem pengujian saya:

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

Kemudian bahkan sebelum memasang sistem file a dumpe2fsmenunjukkan:

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  
...

dan setelah pemasangan:

df /tmp/test/
Filesystem              1K-blocks  Used Available Use% Mounted on
/dev/mapper/MyVG-test       99150  5646     88384   7% /tmp/test

Jadi, apa yang dfditunjukkan kepada kita? Dari 102400 blok kapasitas perangkat penyimpanan mentah, 99150 blok 1K terlihat oleh sistem file, artinya 3250 blok 1-Kilobita ruang penyimpanan mentah telah menjadi tidak dapat digunakan untuk penyimpanan data aktual.

Ke mana blok-blok itu pergi? Menggulir ke bawah di dumpe2fsoutput menunjukkan dengan tepat di mana:

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 (blok # 0) 1024 byte pertama dilewati untuk memungkinkan instalasi sektor boot x86 dan keanehan lainnya.
1 block ditempati oleh blok super Primer.
1 block berisi deskriptor grup.
256 blocksyang disediakan untuk Grup Descriptor Table untuk memungkinkan Resize masa depan filesystem. 16 blocks ditugaskan untuk bitmap blok.
16 blocksditugaskan untuk bitmap inode.
246 blocksditugaskan untuk tabel inode.

Itu sudah menyumbang 537 dari 3250 blok yang hilang. Sistem file ext4 dibagi menjadi serangkaian kelompok blok dan menggulir ke bawah lebih lanjut menunjukkan alokasi kapasitas penyimpanan mentah yang serupa dengan file-sistem internal di grup blok lain:

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 ....

Sekarang kembali ke dfoutput:

df /tmp/test/
Filesystem              1K-blocks  Used Available Use% Mounted on
/dev/mapper/MyVG-test       99150  5646     88384   7% /tmp/test

Alasan bahwa pada sistem file baru yang sudah 7% dari kapasitas ditandai sebagai sedang digunakan adalah:

99150 (ukuran sistem file) MINUS 5120 (jumlah blok cadangan) MINUS 5646 (blok bekas, 4096 di antaranya berasal dari Journal (lagi-lagi bagian dari output dumpe2fs`))
= 88384

Hitungan blok gratis di dumpe2fs adalah ukuran yang tersedia dari sistem file dikurangi penggunaan aktual (dan tidak memperhitungkan blok yang diperhitungkan) jadi 99150 - 5646 = 93504.


0

Bukan jawaban untuk pertanyaan itu, tetapi saya jadi penasaran jadi saya membayangkan orang lain akan melakukannya. Karena saya sudah mem-boot liveCD, dan memiliki hard drive yang dapat saya mainkan tanpa khawatir kesalahan pengetikan, saya melanjutkan dan menguji.

Saya membuat partisi dengan semua FSe yang dikirimkan Ubuntu 14.10 untuk mkfs, pada partisi 100MiB. (kecuali minix, yang hanya mendukung 64MiB, dan bfs, yang merupakan hal SCO yang belum pernah saya dengar.)

Pertama saya melihat df -kruang yang tersedia (dengan pengaturan mkfs default), kemudian saya ddmengedit /dev/zerofile pada setiap FS untuk memastikan mereka dapat diisi penuh. (Yaitu memeriksa apakah yang diklaim available spacebenar-benar tersedia.)
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

Mengapa btrf memiliki begitu banyak ruang yang tidak dapat digunakan? Mungkin untuk metadata? nggak nggak

$ 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

Kedua sistem file berbasis pohon tidak dapat mengemas file kosong di mana saja, tetapi semua yang lain bisa.

Atau lihat saja seberapa besar file yang dapat Anda buat:

$ 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

(Saya menyebut partisi ext4 saya "small-ext" karena saya tidak berencana untuk menjadi gila dan membuat setiap filesystem. Jadi ext = ext4 di sini. BUKAN yang asli pre-ext2 ext.)

Dan df -koutput setelah menghapusnya lagi:

/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 kembali ke 1% digunakan setelah saya menghapus "menyentuh" ​​juga. Entah ada penundaan waktu, atau butuh menulis lagi untuk mendapatkan ukuran yang tersedia untuk memperbarui.)

Ngomong-ngomong, saya pikir itu tentang rasa ingin tahu saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.