Apa yang terjadi jika batas 4 miliar file terlampaui di partisi ext4?

46

Apa yang terjadi jika batas 4 miliar file terlampaui di partisi ext4, dengan transfer 5 miliar file misalnya?

Bensuperpc
sumber

Jawaban:

79

Agaknya, Anda akan melihat beberapa kesalahan "Tidak ada ruang tersisa di perangkat":

# truncate -s 100M foobar.img
# mkfs.ext4 foobar.img
Creating filesystem with 102400 1k blocks and 25688 inodes
---> number of inodes determined at mkfs time ^^^^^
# mount -o loop foobar.img loop/
# touch loop/{1..25688}
touch: cannot touch 'loop/25678': No space left on device
touch: cannot touch 'loop/25679': No space left on device
touch: cannot touch 'loop/25680': No space left on device

Dan dalam praktiknya Anda mencapai batas ini jauh lebih cepat dari "4 miliar file". Periksa filesystem Anda dengan keduanya df -hdan df -iuntuk mengetahui seberapa banyak ruang yang tersisa.

# df -h loop/
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0       93M  2.1M   84M   3% /dev/shm/loop
# df -i loop/
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/loop0      25688 25688     0  100% /dev/shm/loop

Dalam contoh ini, jika file Anda tidak berukuran 4K rata-rata, Anda kehabisan ruang inode lebih cepat daripada ruang penyimpanan. Ini mungkin untuk menentukan rasio lain ( mke2fs -N number-of-inodesatau -i bytes-per-inodeatau -T usage-typesebagaimana didefinisikan dalam /etc/mke2fs.conf).

frostschutz
sumber
1
Terima kasih atas jawaban Anda, kadang-kadang saya khawatir, saya memiliki lebih dari 400 juta file di partisi utama saya (RAID 50), saya punya banyak repositori git, itu untuk keamanan jika itu terjadi
Bensuperpc
5
@ensuperpc: Jika banyak file tidak digunakan secara teratur - hanya di sana untuk tujuan pencadangan - Anda dapat mempertimbangkan untuk menempatkan setiap proyek dalam file tarnya sendiri. Itu mengurangi jumlah file secara signifikan, dan juga ruang yang ditempati jika Anda menggunakan opsi kompresi.
jamesqf
27
@ jamesqf Jika Anda belum melakukannya, coba jalankan git repackdi setiap repositori git untuk menggabungkan semua objek yang terpisah ke dalam file paket.
user253751
13
+1 Karena Anda hanya menggunakan touch, tidak suka echo, Anda juga menunjukkan poin penting dan kesalahpahaman yang sering dibuat: Dimungkinkan untuk mengisi disk dengan file kosong.
rexkogitans
6
@jamesqf git repacktidak kehilangan fungsionalitas apa pun, masih fungsional git repo yang sama, tarmembuatnya tidak dapat dibaca untuk banyak program yang mengharapkan proyek atau repositori git
Ferrybig
52

Setelah batas tercapai, upaya selanjutnya untuk membuat file akan gagal dengan ENOSPC, menunjukkan bahwa sistem file target tidak memiliki ruang untuk file baru.

Dalam skenario yang Anda jelaskan, ini biasanya akan mengakibatkan transfer dibatalkan setelah batas tercapai.

Stephen Kitt
sumber