Bali, Indonesia
Insights

Kenapa Muncul Error No Space Left on Device Padahal Disk Masih Sisa Banyak

October 17, 2026
0:00
Pernahkah kamu mendapati aplikasi tiba-tiba gagal menulis session, database menolak transaksi baru, atau perintah sederhana seperti touch test.txt di server memunculkan pesan galat No space left on device? Reaksi spontan kita biasanya langsung menjalankan perintah df -h untuk mengecek kapasitas penyimpanan. Namun, hasil terminal justru menunjukkan bahwa partisi utama masih tersisa puluhan gigabyte dengan penggunaan baru mencapai 40 atau 50 persen. Situasi ini kerap memicu kebingungan bagi administrator sistem pemula atau pemilik website yang mengelola VPS mandiri. Di meja bantuan teknis hosting, keluhan semacam ini tergolong cukup rutin masuk ke antrean tiket: kapasitas gigabyte masih lapang, tetapi sistem operasi bersikeras bahwa ruang disk sudah habis. Akar masalahnya hampir selalu terletak pada konsep mendasar penyimpanan Linux yang jarang diperhatikan sampai masalah tersebut benar-benar terjadi, yaitu kehabisan inode.
Untuk membangun intuisi tentang cara kerja filesystem Linux, bayangkan sebuah perpustakaan fisik. Perpustakaan tersebut memiliki dua komponen utama: rak buku besar tempat menaruh buku fisik dan lemari laci berisi kartu katalog indeks di dekat pintu masuk. Setiap kali ada buku baru yang datang, petugas perpustakaan tidak hanya menaruh buku tersebut di rak kosong. Petugas juga harus menulis satu lembar kartu katalog yang mencatat judul, pengarang, tanggal masuk, izin pinjam, dan nomor rak tempat buku diletakkan. Buku fisik memakan ruang di rak, sedangkan kartu katalog memakan satu slot di laci indeks. Sekarang bayangkan jika seseorang membawa jutaan pamflet atau sobekan kertas berukuran sangat kecil yang masing-masing hanya berisi satu kalimat. Rak buku perpustakaan masih sangat kosong karena ukuran kertasnya mini. Namun, setiap sobekan kertas tetap membutuhkan satu kartu katalog tersendiri. Begitu lemari kartu katalog terisi penuh sampai kartu terakhir habis, petugas perpustakaan terpaksa menolak buku baru apa pun yang masuk—meskipun rak buku di dalam ruangan masih memiliki ratusan meter ruang kosong. Di sistem operasi Linux, kartu katalog tersebut dikenal dengan nama inode.
Di sistem operasi Linux dan Unix-like lainnya, ruang disk tidak hanya dibagi menjadi blok-blok data (data blocks) tempat isi file disimpan. Filesystem seperti ext4 juga menyiapkan struktur data khusus bernama index node atau disingkat inode. Setiap file, folder, socket, pipe, atau symlink di dalam server memiliki tepat satu inode. Di dalam inode inilah metadata file disimpan, mencakup:
  1. Pemilik file (user ID) dan grup kepemilikan (group ID).
  2. Hak akses (permission) seperti baca, tulis, dan eksekusi.
  3. Waktu pembuatan, modifikasi terakhir, dan akses terakhir (timestamps).
  4. Ukuran file dalam satuan byte.
  5. Penunjuk (pointer) ke blok-blok data fisik di disk tempat isi file sebenarnya disimpan.
Hal menarik yang sering luput adalah nama file sendiri tidak disimpan di dalam inode file tersebut, melainkan dicatat di dalam blok data milik direktori induknya yang memetakan nama file ke nomor inode tertentu. Pada filesystem tradisional seperti ext4, jumlah total inode ditentukan secara statis ketika partisi pertama kali diformat melalui perintah mkfs. Sistem operasi menghitung rasio berdasarkan kapasitas penyimpanan, misalnya mengalokasikan satu inode untuk setiap beberapa kilobyte ruang disk. Setelah partisi dibuat, batas maksimal inode ini terkunci. Sementara pada filesystem modern seperti XFS, alokasi inode dilakukan secara dinamis, namun tetap memiliki batas atas persentase penggunaan metadata agar tidak menghabiskan seluruh disk. Ketika sebuah program di server membuat file baru berukuran 0 byte, program tersebut tidak memakan ruang blok data sama sekali. Namun, sistem operasi tetap harus mengalokasikan satu nomor inode unik untuk file tersebut. Jika server kamu menampung jutaan file berukuran beberapa byte saja, persediaan nomor inode akan terkuras habis jauh sebelum kapasitas gigabyte pada disk terpakai.
Ketika kamu mendapati galat No space left on device, jangan hanya terpaku pada opsi -h pada perintah df. Opsi -h (human-readable) hanya menampilkan pemakaian kapasitas blok data. Untuk melihat kondisi kartu indeks filesystem, gunakan parameter -i (inodes).
BASH
# Cek persentase penggunaan inode di seluruh partisi
df -i

# Contoh perintah aman untuk menghitung jumlah file di tiap subdirektori
for dir in /var/*; do
  [ -d "dir" ] && echo "dir: (find "dir" -maxdepth 1 2>/dev/null | wc -l)"
done
Jika keluaran dari df -i menunjukkan kolom IUse% pada partisi root (/) atau partisi data sudah menyentuh angka 100%, maka diagnosisnya sudah pasti: server kehabisan alokasi inode. Kamu tidak bisa membuat file baru, tidak bisa menyalin data, dan banyak daemon sistem akan gagal menulis file PID sementara. Penyebab umum penumpukan jutaan file kecil di server hosting biasanya berasal dari beberapa area berikut:
  • Session PHP yang gagal terhapus otomatis: Direktori default session seperti /var/lib/php/sessions atau direktori session kustom di level user hosting sering kali menjadi sarang jutaan file session kosong jika mekanisme garbage collection PHP tidak berjalan atau cron pembersih bawaan sistem terhenti.
  • Spool dan antrean email lokal: Daemon mail transfer agent (MTA) seperti Postfix atau Exim yang menerima kiriman email spam lokal atau pesan bounce yang gagal dikirimkan berulang kali ke alamat yang tidak valid bisa menimbun ratusan ribu file pesan di dalam direktori /var/spool.
  • Cache aplikasi atau framework: Banyak framework web generasi modern membuat file cache dalam struktur folder berulang. Jika aplikasi memiliki bug pada logika pembersihan cache atau ada pengunjung bot yang melakukan scraping dengan query string acak, sistem cache bisa membuat jutaan file halaman statis berukuran kecil.
  • File temporer sistem: Direktori /tmp atau direktori pemrosesan sementara file upload yang tidak dipantau secara berkala.
Ada beberapa miskonsepsi umum yang sering dilakukan teknisi saat pertama kali berhadapan dengan inode penuh. Kekeliruan pertama adalah mencoba menghapus direktori yang berisi ratusan ribu file dengan perintah liar seperti rm -rf /path/to/folder/*. Saat kamu menjalankan perintah tersebut dengan wildcard bintang (*), shell Linux (seperti Bash) akan mencoba mengekspansi seluruh nama file ke dalam argumen perintah terlebih dahulu sebelum mengeksekusinya. Hasilnya, terminal akan memunculkan galat lain: Argument list too long. Sistem bahkan tidak sempat mulai menghapus file. Cara yang lebih aman dan terukur adalah menggunakan kombinasi find dengan parameter -delete atau memprosesnya secara bertahap. Paling penting, jangan langsung memperbesar ukuran disk virtual (resize disk) di panel kontrol cloud atau VPS tanpa mengecek apakah filesystem kamu mendukung ekspansi inode secara otomatis. Pada filesystem ext4, memperbesar ukuran partisi memang bisa menambah jumlah inode karena batasannya berbasis rasio per ukuran blok baru, tetapi langkah ini hanya menunda masalah jika akar penumpukan file kecil tidak dibereskan. Begitu direktori biang kerok ditemukan dan dibersihkan dari file-file sampah, nomor inode akan langsung dikembalikan ke daftar bebas milik sistem operasi. Perintah pembuatan file akan langsung bekerja normal kembali tanpa perlu me-restart server. Memahami perbedaan antara kapasitas blok data dan batasan metadata inode adalah kunci sederhana agar kamu tidak lagi bingung saat server melaporkan disk penuh di tengah sisa gigabyte yang melimpah.