Mengapa kernel Linux melaporkan "kehabisan ruang disk" padahal kenyataannya tidak ada di i-node

10

Seorang teman saya yang suka pemrograman di lingkungan Linux, tetapi tidak tahu banyak tentang administrasi Linux baru-baru ini mengalami masalah di mana OS-nya (Ubuntu) melaporkan "kehabisan ruang disk pada volume XXX." Tetapi ketika dia pergi untuk memeriksa volume, masih ada 700 GB yang tersisa. Setelah banyak waktu yang terbuang, dia akhirnya bisa mengetahui bahwa dia kehabisan inode. (Dia menyimpan banyak pembaruan inkremental kecil dari sistem cadangan pada volume ini dan membakar semua inode-nya.)

Dia bertanya kepada saya mengapa kernel Linux melaporkan pesan kesalahan ("kehabisan ruang disk") alih-alih melaporkan dengan benar ("kehabisan inode"). Saya tidak tahu, jadi saya pikir saya akan bertanya kepada StackExchange.

Adakah yang tahu mengapa ini terjadi? dan mengapa itu belum diperbaiki setelah bertahun-tahun? (Saya ingat seorang teman yang berbeda memberi tahu saya tentang masalah ini pada 1995.)

Pretzel
sumber

Jawaban:

18

Nomor kesalahan tunggal ENOSPC,, digunakan untuk melaporkan kedua situasi, maka pesan kesalahan yang sama.

Untuk menjaga kepatuhan terhadap ISO Cdan POSIXstandar, pengembang kernel tidak punya pilihan selain menggunakan nomor kesalahan tunggal untuk kedua acara. Menambahkan nomor kesalahan baru akan merusak program yang ada.

Namun, karena tetap berpegang pada pesan kesalahan tradisional bukan AFAIK wajib, tidak ada yang harus melarang pengembang untuk membuat pesan tunggal lebih jelas, seperti misalnya out of disk/inode space

Secara teknis, apakah berada di luar ruang inode atau di luar ruang data adalah sama, artinya itu tidak ada cukup ruang disk kosong untuk panggilan sistem untuk berhasil.

Saya kira Anda tidak akan mengeluh jika disk Anda dilaporkan penuh sementara masih ada slot inode gratis.

Perhatikan bahwa file sistem seperti JFS, XFS, ZFSdan btrfsmengalokasikan inode dinamis sehingga tidak melakukan pameran masalah ini lagi.

Jlliagre
sumber
Filesystem terbaru termasuk ext4?
Camilo Martin
@ CamiloMartin, saya rasa tidak.
jlliagre
@ CamiloMartin Sayangnya tidak, ext4mengalokasikan inode pada waktu pembuatan fs seperti ext2 / 3 dan tidak dapat dimodifikasi kemudian.
Matt
@mindthemonkey Darn! Mungkin itu hal kompatibilitas ke belakang, saya kira. Apa filesystem lain yang memiliki fitur-fitur bagus tetapi cukup stabil (apakah btrfs stabil)? ext4 tampaknya semacam "pilihan default" (setidaknya dari perspektif pemula saya).
Camilo Martin
1
Yeah ext selalu ekstensi dari versi sebelumnya dan kompatibel dengan belakang sehingga tidak ada perubahan besar tapi itu berarti itu tetap cukup solid dan stabil. Saya pribadi melakukan semua penyimpanan volume besar saya di kotak freebsd dengan ZFS. BTRFS masih dianggap "tidak stabil", meskipun sebagian besar distribusi setidaknya akan membiarkan Anda menggunakannya.
Matt
2

Saya menganggap teman Anda menggunakan ext fs, karena salah satu dari beberapa fs masuk akal yang dapat kehabisan inode.

Tampaknya teman Anda mengotak-atik sistem file-nya dan memecahkannya atau memiliki volume beberapa TB yang sangat besar. Inode bukan hal yang digunakan sekali dan membuang. Jika ia benar-benar kehabisan inode, itu berarti ia memiliki banyak file dan direktori yang sangat aneh ... yang dapat terjadi pada volume> 4TB (tebakan berpendidikan), di mana "hanya" 700GB yang gratis. Untuk keluarga ekst dari fs jumlah inode ditentukan ketika fs dibuat. Dari mkfs.ext4halaman manual:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Untuk mempersingkat sisa jawaban ini: Ini berarti mkfsdiberikan dengan rasio seperti itu, atau akan mengasumsikan satu. Jika teman Anda menggunakan fs berbeda dari yang diasumsikan rasio yang dipilih mungkin salah untuk kasus penggunaannya dan ia mendapatkan kesalahan itu ... mengisi volume multi-TB tunggal dengan banyak file kecil dapat dihitung.

Apakah teman Anda menggunakan lingkungan desktop yang mengimplementasikan konsep "tempat sampah" untuk file atau bentuk cadangan lain yang dapat membuat file dalam jumlah besar? Mungkin dia bisa memperbaiki masalahnya hanya dengan menyingkirkan file yang tidak dibutuhkan.

Saya ingat masalah ini dengan ext2 dari waktu ketika kernel 2.4 cukup baru. Sebagai aturan praktis, saya selalu menggunakan XFS untuk volume yang sangat besar dibandingkan dengan apa yang saat ini umum. Saat ini saya akan memanggil segalanya antara 250GB hingga 1TB umum untuk volume tunggal dan kita dapat membeli HDD 4TB. Jadi untuk semuanya> 3TB saya lebih suka menggunakan XFS daripada ext. Hanya aturan praktis, tetapi tidak kehabisan inode untuk waktu yang lama ...

Bananguin
sumber
1
Saya khawatir Anda tidak menjawab pertanyaan yang diajukan.
jlliagre
Benar. Saya semacam mencoba menjawab pertanyaan inline pertama yang saya tekan "Ada yang tahu mengapa ini terjadi?", Tetapi bukan yang ada di judul.
Bananguin
Baik. Teman saya tahu apa yang terjadi. Dia sedang melakukan semacam sistem cadangan di mana ia menyimpan perubahan inkremental UNcompressed (atau TAR'd) sehingga ada semua file kecil kecil ini mengambil ruang. Saya tidak berpikir dia pernah memiliki FS sebesar ini sebelumnya, jadi kehabisan inode adalah hal baru baginya. Ergo, dia frustrasi ketika dia mengetik "df -h" dan berpikir, "huh, aku masih punya satu ton ruang tersisa" - Terus terang, aku setuju dengannya. Untuk kernel mengatakan "out of space", padahal sebenarnya harus memiliki pesan terpisah "out of inodes" sangat membingungkan.
Pretzel
@ Bananguin - Tahukah Anda apa rasio byte / inode default?
Pretzel
@Pretzel: Saya rasa saya ingat bahwa defaultnya adalah satu inode untuk masing-masing 4k. Saya baru saja memeriksa komputer saya ( tune2fs -l /dev/sda1) dan kebetulan saya memiliki rasio 1 inode untuk setiap empat blok dan setiap blok berukuran 1k. Berapa banyak ini dapat dianggap "default" namun, saya tidak tahu.
Bananguin