Alasan untuk masalahnya
Masalahnya ternyata bagaimana XFS mengalokasikan inode. Tidak seperti kebanyakan sistem file, alokasi terjadi secara dinamis ketika file baru dibuat. Namun, kecuali Anda menentukan sebaliknya, inode terbatas pada nilai 32-bit, yang berarti bahwa mereka harus masuk dalam terabyte penyimpanan pertama pada sistem file. Jadi jika Anda benar-benar mengisi terabyte pertama itu, dan kemudian Anda memperbesar disk, Anda masih tidak dapat membuat file baru, karena inode tidak dapat dibuat di ruang baru.
Solusi 1 - ubah opsi pemasangan
Salah satu solusinya adalah memasang kembali sistem file dengan opsi mount inode64
. Namun beberapa aplikasi akan berperilaku aneh pada ini (misalnya MySQL), dan NFS akan sangat bingung. Jadi, jika Anda tidak yakin sistem Anda akan bekerja dengan opsi ini, Anda dapat beralih ke opsi berikutnya.
Solusi 2 - pindahkan file
Solusi kedua adalah menemukan beberapa file yang saat ini disimpan dalam terabyte pertama, dan memindahkannya ke area lain dari sistem file.
Bergerak berdasarkan usia
Dalam kasus kami, ini mudah - sistem file telah digunakan selama bertahun-tahun, jadi kami dapat dengan mudah menemukan file tertua dan memindahkannya dari sistem file, dan kemudian memindahkannya kembali. Ini mudah dilakukan menggunakan find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
memberi kami daftar yang berisi ukuran dan nama direktori untuk semua direktori tepat 3 tingkat di bawah mountpoint, yang lebih tua dari 2 tahun. Kami kemudian dapat mengurutkan daftar untuk menemukan direktori terbesar, dan menggunakannya mv
untuk memindahkan mereka ke sistem file lain dan kembali lagi.
Bergerak berdasarkan grup alokasi
Jika Anda tidak bisa hanya berdasarkan usia, misalnya ketika banyak file dibuat pada saat yang sama, Anda masih dapat menemukan file yang tepat untuk dipindahkan, tetapi itu membutuhkan waktu lebih lama.
XFS memiliki grup alokasi (alias AG ), dimulai dengan 0. Anda bisa memeriksa ukuran blok dan jumlah blok dari masing-masing AG untuk mengetahui grup mana yang berada pada terabyte pertama, menggunakan xfs_info /path/to/mountpoint
. Atau Anda bisa memeriksa beberapa AG pertama untuk melihat mana yang penuh, dan kemudian menghapusnya.
- Memeriksa ruang kosong dalam empat AG pertama:
untuk ag di `seq 0 1 5`; lakukan echo freespace dalam AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total gratis"; selesai
Jika total ruang kosong di grup mana pun kurang dari 40, Anda tidak akan dapat membuat file baru di dalamnya.
- Temukan file di AG itu
Ini perlu memeriksa metadata untuk setiap file pada sistem file. Ini akan memakan waktu lama ... Berikut sarannya:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Anda kemudian dapat grep untuk " 0 "
(itu spasi, nol dan spasi lain) untuk menemukan semua file pada AG 0, grep untuk " 1 "
menemukan yang ada di AG 1, dll ... Mulai dengan AG 0, pindahkan file terbesar (menggunakan file 0 mv
, tidak cp
!) lalu kembali lagi. Ulangi sampai Anda memiliki ruang kosong yang cukup banyak.
Hasil
Setelah kami memindahkan cukup file dari / ekstra dan kembali lagi, ada banyak ruang di AG 0 dan sekali lagi memungkinkan untuk membuat file baru.