Bisakah saya kehabisan ruang disk dengan membuat sejumlah besar file kosong?

35

Telah diketahui bahwa file teks kosong memiliki nol byte:

masukkan deskripsi gambar di sini

Namun, masing-masing berisi metadata , yang menurut penelitian saya, disimpan dalam inode , dan memang menggunakan ruang .

Mengingat ini, tampaknya logis bagi saya bahwa adalah mungkin untuk mengisi disk dengan murni membuat file teks kosong. Apakah ini benar? Jika demikian, berapa banyak file teks kosong yang saya perlukan untuk mengisi disk, katakanlah, 1GB?


Untuk melakukan beberapa pemeriksaan, saya menjalankan df -itetapi ini tampaknya menunjukkan% inode yang digunakan (?) Daripada berapa banyak mereka menimbang.

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho
luchonacho
sumber
Terkait: unix.stackexchange.com/q/62049
moooeeeep

Jawaban:

40

Output ini menyarankan 28786688inode secara keseluruhan, setelah itu upaya selanjutnya untuk membuat file di sistem file root (perangkat /dev/sda2) akan kembali ENOSPC("Tidak ada ruang yang tersisa di perangkat").

Penjelasan: pada desain sistem file * nix asli, jumlah maksimum inode ditetapkan pada waktu pembuatan sistem file. Ruang khusus dialokasikan untuk mereka. Anda dapat kehabisan inode sebelum kehabisan ruang untuk data, atau sebaliknya. Sistem file Linux standar yang paling umum ext4masih memiliki batasan ini. Untuk informasi tentang ukuran inode pada ext4, lihat halaman manual untuk mkfs.ext4.

Linux mendukung sistem file lain tanpa batasan ini. Aktif btrfs, ruang dialokasikan secara dinamis. "Struktur inode relatif kecil, dan tidak akan berisi data file tertanam atau data atribut diperluas." (ext3 / 4 mengalokasikan beberapa ruang di dalam inode untuk atribut yang diperluas ). Tentu saja Anda masih dapat kehabisan ruang disk dengan membuat terlalu banyak entri direktori / metadata.

Memikirkannya, tmpfs adalah contoh lain di mana inode dialokasikan secara dinamis. Sulit untuk mengetahui apa sebenarnya jumlah maksimum dari inode yang dilaporkan df -idalam praktiknya untuk sistem file ini. Saya tidak akan melampirkan makna pada nilai yang ditampilkan.


"XFS juga mengalokasikan inode secara dinamis. Begitu juga JFS. Begitu juga / tidak reiserfs. Begitu juga F2FS. Sistem file Unix tradisional mengalokasikan inode secara statis pada waktu mkfs, dan begitu juga FS modern seperti ext4 yang melacak warisan mereka kembali ke sana, tetapi hari ini itu pengecualian, bukan aturannya.

"BTW, XFS tidak membiarkan Anda menetapkan batas pada persentase maksimum ruang yang digunakan oleh inode, sehingga Anda dapat kehabisan inode sebelum Anda sampai ke titik di mana Anda tidak dapat menambahkan file yang ada. (Default adalah 25% untuk FSes di bawah 1TB, 5% untuk sistem file hingga 50TB, 1% untuk lebih besar dari itu.) Bagaimanapun, penggunaan ruang ini pada metadata (peta inode dan luas) akan tercermin secara teratur df -h"- Peter Cordes dalam komentar untuk jawaban ini

sourcejedi
sumber
Jadi, apakah Anda mengatakan bahwa jika saya membuat 28786688-667980=28118708file kosong, saya akan kehabisan inode dan "merusak sistem saya"?
luchonacho
1
XFS juga mengalokasikan inode secara dinamis. Begitu juga JFS. Begitu pula dengan reiserf. Begitu juga F2FS . Sistem file Unix tradisional mengalokasikan inode secara statis pada waktu mkfs, dan begitu juga FS modern seperti ext4 yang melacak warisan mereka kembali ke sana, tetapi hari ini pengecualian, bukan aturan. (Kecuali jika Anda mempertimbangkan hal-hal yang diinstal oleh basis, di mana mungkin akurat untuk mengatakan bahwa sebagian besar sistem file saat ini pada disk di sistem * nix di alam bebas memiliki inode yang dialokasikan secara statis.)
Peter Cordes
BTW, XFS tidak membiarkan Anda menetapkan batas pada persentase maksimum ruang yang digunakan oleh inode, sehingga Anda dapat kehabisan inode sebelum Anda sampai ke titik di mana Anda tidak dapat menambahkan file yang ada. (Default adalah 25% untuk FS di bawah 1TB, 5% untuk sistem file hingga 50TB, 1% untuk lebih besar dari itu.) Bagaimanapun, penggunaan ruang ini pada metadata (inode dan peta tingkat) akan tercermin secara teratur df -h, @luchonacho.
Peter Cordes
26

Membuat file kosong melibatkan penggunaan hal-hal berikut:

  • inode, satu per file;
  • entri direktori tambahan, juga satu per file, tetapi digabungkan.

Jumlah inode yang tersedia sering ditentukan ketika sistem file dibuat, dan tidak dapat diubah (beberapa sistem file seperti Btrfs atau XFS mengalokasikan inode secara dinamis). Itulah yang diukur dengan df -i. Ketika Anda kehabisan inode, Anda tidak dapat membuat file atau direktori baru, bahkan jika Anda memiliki ruang disk yang tersedia.

Entri direktori juga memakan tempat, dari ruang disk yang tersedia. Anda dapat melihat ini dengan melihat ukuran direktori: selalu merupakan kelipatan dari ukuran blok, dan ketika direktori berisi banyak file, ukurannya bertambah. Jika Anda kehabisan ruang disk, Anda mungkin tidak dapat membuat file atau direktori baru di direktori yang "penuh" ( yaitu , di mana menambahkan file baru akan melibatkan mengalokasikan blok baru), bahkan jika Anda memiliki inode yang tersedia.

Jadi ya, dimungkinkan untuk kehabisan ruang disk hanya menggunakan file kosong.

Stephen Kitt
sumber
Jadi saya perlu membuat file kosong yang cukup untuk mencapai penggunaan 100% inode?
luchonacho
@luchonacho ya, efektif satu file kosong per inode.
Stephen Kitt
Perhatikan juga atribut yang diperluas yang dapat menambah ruang di atasnya. Sebagai contoh, jika direktori memiliki banyak ACL default, membuat file di dalamnya akan membutuhkan ruang untuk menyimpan ACL tersebut.
Stéphane Chazelas
OK, saya berdiri dikoreksi. Masalahnya, itu terlihat aneh bagi saya baik dengan font yang dirender dan tetap lebar pada browser saya. Karena penasaran, bagaimana Anda memasukkannya? Apakah keyboard Anda memiliki kunci berbeda untuk karakter itu dan U + 0022?
Stéphane Chazelas
Terima kasih, karena penasaran, saya memeriksa apakah mereka ada di tata letak keyboard UK saya dan memang mereka ada di AltGr + Shift + V / B (tanda kutip ganda tanpa shift). Saya akan tetap dengan U + 0022.
Stéphane Chazelas
7

Argumen logika murni:

Nama file terdiri dari jumlah byte yang tidak nol. Bahkan dengan kompresi maksimum teoritis dalam sistem file hipotetis yang dirancang untuk memungkinkan jumlah maksimum nama file absolut, setiap nama file masih akan mengkonsumsi setidaknya satu bit di suatu tempat di disk fisik Anda. Mungkin lebih, tetapi "1 bit per file" adalah minimum sepele.

Hitung jumlah bit yang mungkin bisa muat pada piring Anda, dan itu adalah jumlah maksimum teoritis (kosong atau tidak kosong) file yang dapat Anda simpan di dalamnya.

Jadi jawabannya adalah ya. Akhirnya, Anda akan kehabisan ruang, tidak peduli penyimpanan apa yang Anda gunakan, jika Anda terus menambahkan file kosong. Jelas Anda akan kehabisan lebih cepat dari yang dihitung dalam mode ini, tetapi kehabisan Anda akan.

AnoE
sumber
0

Cukup tidak, tetapi Anda dapat kehabisan inode di linux yang akan sama dengan kehabisan ruang.

Anda dapat mencoba sesuatu seperti ini di shell Anda n=0; while :; do touch $n; let n=n+1; done

Pastikan untuk menjalankannya di mesin virtual atau Anda akan keluar dari inode dengan sangat cepat.

in1t3r
sumber
Apa yang dilakukan perintah itu?
luchonacho
Itu dimulai ketika true infinite loop yang pada setiap gilirannya menciptakan nama file yang merupakan bilangan bulat mulai dari 0 kemudian 1 2 3 ... akhirnya akan membuat file yang cukup untuk menggunakan semua inode dari sistem file.
in1t3r
1
Jika menjalankan perintah itu di partisi / home Anda jika itu independen maka / partisi Anda tidak akan memiliki masalah Anda tidak bisa menulis lagi ke partisi / home Anda. Saran saya buat direktori bernama cd inodetest ke dalamnya dan kemudian jalankan perintah setelah Anda melihat kesalahan bahwa Anda tidak dapat lagi membuat file di sistem file, tekan ctrl + C dan jalankan rm -fr inodetestuntuk menyingkirkan semua file kosong itu dan bekerja secara normal lagi. :)
in1t3r
0

Anda tidak dapat mengisi disk dengan membuat file kosong - disk masih memiliki banyak ruang untuk file baru. Tapi ya, Anda dapat menguras persediaan inode gratis filesystem yang terbatas - di mana Anda tidak dapat membuat file baru (walaupun disk Anda - sejauh ruang yang digunakan - praktis kosong). Itu hanya daftar inode filesystem yang semuanya telah digunakan, bukan disk ... sehingga filesystem penuh, sedangkan disk praktis kosong. Inode-table menggunakan ruang pada disk, tetapi tabel tidak tumbuh ketika Anda menambahkan file - sama seperti selembar kertas tidak tumbuh ketika Anda menulis pada baris itu.

(sebuah jawaban-dalam-komentar oleh Baard Kopperud)

luchonacho
sumber
Tidak yakin kita perlu jawaban lain yang mengatakan hal yang sama ?
Jeff Schaller