Bagaimana saya bisa menambah jumlah inode dalam sistem file ext4?

61

Saya punya masalah (baru bagi saya) minggu lalu. Saya memiliki sistem file ext4 (Fedora 15). Aplikasi yang berjalan di server tiba-tiba berhenti. Saya tidak dapat menemukan masalah pada tampilan pertama.

dfmenunjukkan 50% ruang yang tersedia. Setelah mencari sekitar satu jam, saya melihat posting forum di mana orang itu digunakan df -i. Opsi mencari penggunaan inode. Sistem itu keluar dari inode, masalah sederhana yang tidak saya sadari. Partisi hanya memiliki 3,2M inode.

Sekarang, pertanyaan saya adalah: Dapatkah saya membuat sistem memiliki lebih banyak inode? Haruskah / dapatkah diatur ketika memformat disk? Dengan inode 3,2M, berapa banyak file yang bisa saya miliki?

piovisqui
sumber
1
Setiap file atau direktori menggunakan satu inode. Tautan keras ke file tidak membuat inode. en.wikipedia.org/wiki/Inode
Paul Tomblin

Jawaban:

33

Tampaknya Anda memiliki lebih banyak file daripada harapan normal.

Saya tidak tahu apakah ada solusi untuk mengubah ukuran tabel inode secara dinamis. Saya khawatir Anda perlu mencadangkan data Anda, dan membuat sistem file baru, dan memulihkan data Anda.

Untuk membuat sistem file baru dengan tabel inode yang sangat besar, Anda perlu menggunakan opsi '-N' dari mke2fs (8).

Saya akan merekomendasikan untuk menggunakan opsi '-n' terlebih dahulu (yang tidak membuat fs, tetapi tampilkan informasi use-ful) sehingga Anda bisa mendapatkan perkiraan jumlah inode. Kemudian jika perlu, gunakan '-N' untuk membuat sistem file Anda dengan nomor inode tertentu.

cinsk
sumber
11
Anda dapat menggunakan mke2fs -iuntuk menentukan jumlah inode. Dokumentasinya menunjukkan bahwa "tidak mungkin untuk memperluas jumlah inode pada sistem file setelah dibuat".
Gilles 'SO- stop being evil'
2
@piovisqui: setiap file menggunakan inode, yang merupakan pointer di sistem file. jika file tersebut merupakan tautan keras ke file lain, ia memiliki inode yang sama.
Hanan N.
6
@Gilles -iOpsi menentukan ukuran inode, bukan berapa banyak. The -Npilihan menetapkan inode nomor.
theillien
1
Hubungan antara inode dan nomor file tidak harus 1: 1. Inode pertama berisi daftar pointer ke blok tempat file disimpan. Jika daftar blok tidak dapat masuk dalam satu inode, maka inode berisi daftar pointer ke inode yang berisi daftar blok tempat file disimpan. Jika tidak cocok di sana maka masuk 3 set inode dalam untuk daftar blok dll.
StuWhitby
2
@ StuWhitby Itu tidak benar. Inode tunggal memiliki beberapa pointer langsung, dan pointer tidak langsung tunggal, ganda, dan tiga. Jika daftar blok tidak dapat masuk ke pointer langsung, maka pointer tidak langsung tunggal akan menunjuk pada blok data (BUKAN inode lain) yang berisi lebih banyak pointer. Jika lebih banyak pointer dari yang dibutuhkan, pointer tidak langsung ganda menunjuk pada sebuah blok yang berisi pointer tidak langsung tunggal, dan triple tidak langsung pada sebuah blok dengan pointer tidak langsung ganda. Jadi file sebenarnya hanya menggunakan satu inode, berapapun ukurannya.
user125355
11

Sebagai solusi lain saya dapat menyarankan mempertimbangkan mengemas koleksi besar file ke dalam tararsip (!) Yang tidak terkompresi , dan kemudian gunakan archivemountuntuk memasangnya sebagai sistem file. Arsip tar lebih baik untuk dibagikan daripada gambar sistem file dan memberikan kinerja yang sama saat mencadangkan ke cloud atau penyimpanan lain.


Jika koleksi seharusnya hanya-baca, squashfsmungkin merupakan opsi, tetapi membutuhkan opsi tertentu yang diaktifkan di kernel, dan xzkompresi tersedia untuk tar juga dengan kinerja yang sama.

tijagi
sumber
2
Saran yang bagus.
piovisqui
11

Dengan 3,2 juta inode, Anda dapat memiliki 3,2 juta file dan direktori, total (tetapi banyak hardlink ke file hanya menggunakan satu inode).

Ya, itu dapat diatur saat membuat sistem file pada partisi. Opsi -T usage-type,, -N number-of-inodesatau -i bytes-per-inodesemua dapat mengatur jumlah inode. Saya biasanya menggunakan -i, setelah membandingkan output du -sdan find | wc -luntuk koleksi file yang serupa dan memungkinkan untuk beberapa kelonggaran.

Tidak, itu tidak dapat diubah di tempat pada sistem file yang ada. Namun:

  • Jika Anda menjalankan LVM atau sistem file pada LUN SAN (baik langsung di LUN, atau sebagai partisi terakhir pada LUN), atau Anda memiliki ruang kosong pada disk setelah partisi, Anda dapat menumbuhkan partisi dan kemudian gunakan resize2fsuntuk memperluas sistem file. Ini menambahkan lebih banyak inode sebanding dengan ruang yang ditambahkan, secara kasar. Jika Anda ingin menghindari kehabisan inode sebelum ruang dengan asumsi bahwa file masa depan rata-rata memiliki ukuran yang sama, tetapkan persentase blok cadangan yang cukup tinggi dengan menggunakan tune2fs -m.
  • Jika Anda memiliki cukup ruang dan dapat membuat sistem file offline, lalu offline, buat sistem file baru dengan lebih banyak inode, dan salin semua file.
  • Jika hanya sebagian file yang menggunakan banyak inode dan Anda memiliki cukup ruang kosong, buat sistem file pada perangkat loop yang didukung oleh file pada sistem file, buat sistem file dengan lebih banyak inode (dan mungkin juga blok yang lebih kecil) di atasnya, dan pindahkan direktori yang menyinggung ke dalamnya. Itu mungkin hit kinerja dan kerumitan perawatan, tetapi itu adalah alternatif.
  • Dan tentu saja, jika Anda dapat menghapus banyak file yang tidak dibutuhkan, itu akan membantu juga.
David
sumber
6

Saya punya solusi alternatif untuk situasi ini. Katakanlah Anda memiliki 1000 inode dalam partisi 10G. Tetapi karena batas inode Anda tidak seharusnya menggunakan semua ruang partisi . Tetapi dalam solusi ini Anda akan dapat menggunakan sisa ruang partisi tanpa memformatnya .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

untuk pemasangan permanen

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
SANJEET
sumber
2
Selamat datang di U&L. Saya mengambil kebebasan untuk memformat ulang jawaban Anda ke representasi kode yang lebih umum di sini, memasukkan prompt ( $) untuk membedakan dengan jelas antara perintah dan output (jika hanya perintah, prompt biasanya ditinggalkan). Saya juga mengubah SHOUTING dalam penekanan fase tebal, yang saya pikir Anda maksudkan. Anda dapat membatalkan perubahan jika saya salah mengartikan hal
Anthon
Saya pikir solusi ini memiliki logika, tetapi Anda perlu mengatur ukuran saat menjalankan dd.
piovisqui
3
Detailnya salah, Anda harus menggunakan perangkat loop, dan mungkin bahkan unionfs tergantung pada aplikasi, tetapi ini adalah satu-satunya solusi menghindari pemformatan dan memulihkan dari cadangan yang tidak menyenangkan ketika terburu-buru dengan jutaan file. Ada situasi di mana ini bisa menyelamatkan hari!
medoc
6

Baru-baru ini mengalami masalah ini saat menggunakan pemutakhiran apt atau aptitude.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Perintah yang dikeluarkan:

du /|sort -k1 -n

Sebagian besar file terungkap dalam subfolder untuk beberapa versi kernel dalam:

/usr/src/linux-headers

Menghapus subfolder dan masalah inode itu diperbaiki.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /
kph0x1
sumber
Apakah "du / | sort -k1 -n" menampilkan inode?
Anak yatim
Tidak. Itu untuk menyortir direktori, menunjukkan mana yang memiliki file terbanyak di dalamnya, folder yang mengkonsumsi banyak inode tetapi penggunaan ruang yang kurang aktual: situasi ruang disk bebas 30% namun penggunaan inode 100% ditunjukkan di atas.
kph0x1
Jujur saya tidak mendapatkan berapa "du" ditampilkan berapa banyak file dengan bendera apa pun? Bisakah Anda jelaskan lebih detail?
Anak yatim
Tidak ada bendera untuk duperintah. Penggunaan adalah untuk root dari sistem file dalam contoh di atas, hanya melihat ruang. Keluaran disalurkan untuk mengurutkan untuk menunjukkan direktori mana yang berisi sebagian besar file. Tidak ada perhitungan yang dilakukan dalam contoh di atas untuk file, bagian 'berapa banyak file' dari pertanyaan Anda. Sumber kernel adalah penyebab yang ditunjukkan dalam duoutput; misalnya, banyak file kecil, sub-folder dari kompilasi sebelumnya, hal yang sangat cocok untuk dihapus untuk membebaskan inode. Masih ada manual, review manusia dari duoutput, /usr/src/linux-headerskemudian jelas.
kph0x1
1
du menunjukkan HANYA byte - bukan file. Dan Anda memipipkan outout hanya dari perintah du menjadi semacam. Jadi bagaimana cara mengurutkan -k1 -n mengurutkan output dengan cara yang Anda usulkan? Satu-satunya hal yang dapat saya lihat adalah bahwa "du / | sort -k1 -n" hanya mengurutkan setiap baris berdasarkan ukuran dalam byte. Tidak ada yang lain
Anak Yatim
2

coba du -s --inodes * 2>/dev/null |sort -gcd ke dir terakhir dalam output dan ulangi.

Pengungkapan Lengkap: tidak semua --inodesflag dukungan OS untuk perintah du (OS Mac saya tidak) tetapi banyak yang menggunakan OS Linux.

Otto Leichliter
sumber