Bir ext4 dosya sistemindeki inode sayısını nasıl artırabilirim?


61

Geçen hafta (benim için yeni) bir sorunum vardı. Bir ext4 (Fedora 15) dosya sistemine sahibim. Sunucuda çalışan uygulama aniden durdu. İlk bakışta sorunu bulamadım.

df% 50 kullanılabilir alan gösterdi. Yaklaşık bir saat aradıktan sonra, adamın kullanıldığı bir forum yazısı gördüm df -i. Bu seçenek inode kullanımını arar. Sistem inode dışındaydı, farketmediğim basit bir problemdi. Bölüm sadece 3.2M inode'lara sahipti.

Şimdi, sorularım: Sistemin daha fazla düğümü olmasını sağlayabilir miyim? Diski biçimlendirirken ayarlanması gerekir mi? 3.2M inodes ile kaç dosya alabilirim?


1
Her dosya veya dizin bir inode kullanır. Bir dosyaya bir sabit bağlantı yok değil bir dosya düğümü oluşturun. en.wikipedia.org/wiki/Inode
Paul Tomblin

Yanıtlar:


33

Görünüşe göre normal beklentinizden çok daha fazla dosyanız var.

İnode tablo boyutunu dinamik olarak değiştirmek için bir çözüm olup olmadığını bilmiyorum. Verilerinizi yedeklemeniz ve yeni bir dosya sistemi oluşturmanız ve verilerinizi geri yüklemeniz gerektiğinden korkuyorum.

Bu kadar büyük bir inode tablosuna sahip yeni bir dosya sistemi oluşturmak için mke2fs (8) '-N' seçeneğini kullanmanız gerekir.

Öncelikle '-n' seçeneğini kullanmanızı öneririm (bu, fs'yi oluşturmaz, ancak kullanım bilgisini görüntüler), böylece tahmini inode sayısını elde edebilirsiniz. Daha sonra gerekirse, dosya sisteminizi belirli bir inode numarasıyla oluşturmak için '-N' kullanın.


11
mke2fs -iİnode sayısını belirtmek için kullanabilirsiniz . Belgeleri, “bir dosya sistemindeki inode sayısını oluşturulduktan sonra genişletmenin mümkün olmadığını” gösteriyor.
Gilles 'SO- kötülük'

2
@piovisqui: Her dosya, dosya sistemindeki bir işaretçi olan inode'da tüketir. dosya başka bir dosyaya bağlantı oluşturuyorsa, aynı inode'a sahiptir.
Hanan N.

6
@Gilles -iSeçenekler, inode'un boyutunu belirtir, kaç tane olduğunu değil. -NOpsiyon numarası Inode'u ayarlar.
theillien

1
İnode ve dosya numaraları arasındaki ilişki mutlaka 1: 1 değildir. İlk inode, dosyanın saklandığı bloklara işaret eden bir liste içerir. Blokların listesi bir inode içerisine sığamıyorsa, inode, dosyanın saklandığı blokları listeleyen inode'lara bir işaretçi listesi içerir. Eğer oraya uymazsa, o zaman bu bloklar listesi için 3 set inode derinine gider
StuWhitby

2
@StuWhitby Bu doğru değil. Tek bir inode'un birçok doğrudan işaretçisi ve tek, çift ve üçlü dolaylı işaretçisi vardır. Blok listesi doğrudan işaretçilere sığmazsa, tek dolaylı işaretçi daha fazla işaretçi içeren bir veri bloğunu (başka bir inode DEĞİL) işaret eder. Gerektiğinden daha fazla işaretçi varsa, çift dolaylı işaretçi, tek dolaylı işaretçiler içeren bir bloğu ve üçlü dolaylı işaretlemeleri çift dolaylı işaretçiler içeren bir bloğa işaret eder. Yani bir dosya, aslında, boyutuna bakmaksızın sadece bir inode kullanır.
user125355

11

Başka bir geçici çözüm olarak, büyük dosya koleksiyonlarını sıkıştırılmamış (!) Bir tararşive koymayı ve ardından archivemountbir dosya sistemi olarak kullanmayı düşünmeyi önerebilirim . Bir tar arşivi, dosya sistemi görüntüsünden daha iyi paylaşmak için daha iyidir ve bir bulut veya başka bir depolama birimine yedekleme yaparken benzer performans sağlar.


Koleksiyonun salt okunur olması gerekiyorsa, squashfsbir seçenek olabilir, ancak çekirdekte etkinleştirilmiş belirli seçenekleri gerektirir xzve aynı performansla birlikte katran için sıkıştırma kullanılabilir.


2
Güzel öneri.
piovisqui 30:15

11

3,2 milyon inode ile toplam 3,2 milyon dosya ve klasöre sahip olabilirsiniz (toplamda sadece bir inode kullanan bir dosyaya çoklu bağlantılar).

Evet, bölüm üzerinde bir dosya sistemi oluştururken ayarlanabilir. Seçenekler -T usage-type, -N number-of-inodesveya -i bytes-per-inodetümü inode sayısını ayarlayabilir. Genellikle kullanmak -içıktısını karşılaştırdıktan sonra, du -sve find | wc -ldosyaların benzer koleksiyonu için ve bazı bolluk sağlayan.

Hayır, mevcut bir dosya sisteminde yerinde değiştirilemez. Ancak:

  • LVM kullanıyorsanız veya dosya sistemi bir SAN’in LUN’undaysa (doğrudan LUN’da veya LUN’daki son bölüm olarak) veya bölümden sonra diskte boş yer varsa, bölümü büyütün resize2fsdosya sistemini genişletmek için kullanın . Bu, kabaca eklenen alana oranla daha fazla düğüm ekler. Gelecekteki dosyaların ortalama olarak yaklaşık aynı büyüklükte olduğunu varsayarak, alandan önce düğümlerin tükenmesini önlemek istiyorsanız, kullanarak yeterli yüksek rezerve edilmiş blok yüzdesi ayarlayın tune2fs -m.
  • Yeterli alanınız varsa ve dosya sistemini çevrimdışı duruma getirebilirseniz, çevrimdışı duruma getirin, daha fazla düğüm içeren yeni bir dosya sistemi oluşturun ve tüm dosyaları kopyalayın.
  • Dosyaların yalnızca bir alt kümesi çok sayıda düğüm kullanıyorsa ve yeterli boş alanınız varsa, dosya sistemindeki bir dosya tarafından desteklenen bir döngü cihazında bir dosya sistemi oluşturun, daha fazla düğüm içeren bir dosya sistemi oluşturun (ve belki daha küçük bloklar da olabilir) Üzerinde ve rahatsız edici dizinleri içine taşıyın. Bu muhtemelen bir performans vuruşu ve bir bakım zorluğu, ancak bir alternatiftir.
  • Ve elbette, çok fazla gereksiz dosyayı silebilirseniz, bu da yardımcı olacaktır.

6

Bu durum için alternatif bir çözümüm var. Diyelim ki 10G'lık bir bölümde 1000 inode var . Ancak inode limitleri nedeniyle, tüm bölüm alanlarını kullanmamanız gerekiyor . Ama bu çözümlerde sen kalan alanı kullanmak mümkün olacak bölüm olmadan biçimlendirme bunu.

$ 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

kalıcı montaj için

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
U&L'ye hoş geldiniz. Buradaki kodun daha genel temsili için cevabınızı yeniden biçimlendirme özgürlüğüne kavuştum, $komutları ve çıktıları açıkça ayırt etmek için bir bilgi istemi ( ) ekledim ( yalnızca komut buysa, istem normal olarak bırakılır). Ayrıca SHOUTING'i cesur faz vurgusuyla değiştirdim. Bazı şeyleri yanlış
tanıtırsam

Bence bu çözümün bir mantığı var ama gg çalışırken boyutu yönetmeniz gerekiyor.
piovisqui

3
Ayrıntılar yanlış, bir döngü aygıtı kullanmanız gerekecek ve uygulamaya bağlı olarak belki de sendikalar kullanmanız gerekebilir, ancak milyonlarca dosya ile acele ederken eğlenceli olmayan, biçimlendirmeyi ve geri yüklemeyi engelleyen tek çözüm budur. Bunun günü kurtarabileceği durumlar var!
medoc

6

Son zamanlarda apt veya yetenek yükseltme kullanırken bu sorunla karşılaştım.

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% /

Verilen komut:

du /|sort -k1 -n

Dosyaların çoğunun, içindeki bazı çekirdek sürümleri için alt klasörlerde bulunduğunu ortaya çıkardı:

/usr/src/linux-headers

Bu alt klasörler kaldırıldı ve inode sorunu giderildi.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

du / | sort -k1 -n "inode'ları gösteriyor mu?
Yetimler

Hayır. Bu, dizinleri sıralayarak, hangisinde daha fazla dosya bulunduğunu, çok sayıda inod tüketen, ancak daha az gerçek alan kullanımı olan klasörleri gösteriyordu: yukarıda gösterilen% 30 boş disk alanı,% 100 inode kullanım durumu.
kph0x1

Dürüst olmak gerekirse "du" herhangi bir bayrak ile kaç dosya olduğunu gösteren nasıl aldım? Lütfen daha ayrıntılı olarak açıklayabilir misiniz?
Yetenekler

duKomut için bayrak yok . Kullanım, yukarıdaki örnekte, sadece boşluğa bakarak, dosya sisteminin kökü içindir. Hangi dizinlerin en çok dosyayı içerdiğini göstermek için çıktılar sıralanır. Yukarıdaki örnekte, sorunuzun 'kaç dosya' kısmı için yapılan bir işlem yoktur. Çekirdek kaynaklı olanlar ise duçıktıda gösterilen suçluydu ; örneğin, birçok küçük dosya, geçmiş derlemelerden oluşan alt klasörler, inode'ları serbest bırakmak için çıkarılması için ideal olan şey. Hala bir manuel kalır, duçıktıyı insan incelemesi , /usr/src/linux-headerso zaman açıktı.
kph0x1

1
du SADECE bayt gösterir - dosyaları değil. Ve outoutu sadece du komutundan tasnif ediyorsun. Peki sırala -k1 -n çıktıyı önerdiğiniz şekilde nasıl sıralar? Görebildiğim tek şey "du / | sort -k1 -n" komutunun her satırı bayt cinsinden boyutuna göre sıralaması. Başka bir şey yok
Yetimler

2

denemek du -s --inodes * 2>/dev/null |sort -gçıktı ve tekrarla son dir içine cd.

Tam Açıklama: Tüm işletim sistemleri --inodesdu komutu için destek bayrağını değil (Mac işletim sistemim desteklemiyor) ama çoğu Linux işletim sistemi destekliyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.