Linux çekirdeği neden gerçekte i-düğümler dışındayken “disk alanı yetersiz” bildiriyor?


10

Linux ortamında programlamayı seven ancak Linux yönetimi hakkında fazla bir şey bilmeyen bir arkadaşım, yakın zamanda işletim sisteminin (Ubuntu) "XXX birimindeki disk alanı dışında" olduğunu bildirdiği bir sorunla karşılaştı. Ancak ses seviyesini kontrol etmeye gittiğinde hala 700 GB kaldı. Çok zaman harcadıktan sonra, sonunda inode dışında olduğunu anlayabildi. (Bu birimdeki bir yedekleme sisteminden çok sayıda artımlı güncelleme depoladı ve tüm inode'larını yaktı.)

Bana Linux çekirdeğinin neden düzgün raporlamak yerine ("inodes") hata mesajını ("disk alanı yetersiz") rapor ettiğini sordu. Bilmiyordum, bu yüzden StackExchange'e soracağımı düşündüm.

Bunun neden olduğunu bilen var mı? ve bunca yıldan sonra neden düzeltilmedi? (1995'te bana bu problemi anlatan farklı bir arkadaşımı hatırlıyorum.)

Yanıtlar:


18

Her ENOSPCiki durumu da bildirmek için tek bir hata numarası kullanılır, dolayısıyla aynı hata mesajı.

ISO CVe POSIXstandartlarına uyum sağlamak için , çekirdek geliştiricilerinin her iki olay için tek bir hata numarası kullanmaktan başka seçeneği yoktur. Yeni bir hata numarası eklemek mevcut programları bozar.

Ancak, geleneksel hata mesajlarına bağlı kalmak AFAIK zorunlu olmadığından, hiçbir şey geliştiricinin örneğin tek bir mesajı daha net yapmasını yasaklamamalıdır. out of disk/inode space

Teknik olarak, inode alanından ya da veri alanından çıkılması aynıdır, yani sistem çağrısının başarılı olması için yeterli boş disk alanı olmadığı anlamına gelir.

Sanırım hala ücretsiz inot yuvaları varken diskiniz dolu olarak rapor edilirse şikayet etmeyecektiniz.

Dosya sistemleri gibi Not olduğunu JFS, XFS, ZFSve btrfsdüğüm dinamik olarak artık hiçbir sergilediğini bu sorunu yapmak ayrılamadı.


Son dosya sistemleri ext4?
Camilo Martin

@CamiloMartin Öyle olduğunu sanmıyorum.
jlliagre

@CamiloMartin Maalesef hayır, ext4ext2 / 3 gibi fs oluşturma zamanında inotları ayırır ve daha sonra değiştirilemez.
Matt

@mindthemonkey Lanet olsun! Muhtemelen bu geriye dönük uyumluluk gibi bir şey. Başka hangi dosya sisteminin güzel özellikleri vardır, ancak yeterince kararlıdır (btrfs kararlı mıdır)? ext4 bir çeşit "varsayılan seçim" gibi görünüyor (en azından acemi bakış açımdan).
Camilo Martin

1
Evet ext'ler her zaman önceki sürümün uzantıları olmuştur ve geriye doğru uyumludur, bu nedenle büyük değişiklikler olmaz, ancak bu oldukça sağlam ve kararlı kaldığı anlamına gelir. Ben kişisel olarak tüm büyük hacimli depolama ZFS ile freebsd kutuları üzerinde yapmak. Çoğu dağıtım en azından kullanmanıza izin verse de, BTRFS hala "kararsız" olarak kabul edilir.
Matt

2

Arkadaşınızın bir ext fs kullandığını varsayıyorum, çünkü onun inotları tükenebilen birkaç mantıklı fs'den biri.

Arkadaşınızın dosya sistemiyle uğraştığı ve onu kırdığı ya da gülünç büyüklükte birkaç TB'ye sahip olduğu anlaşılıyor. İnodlar bir kez kullan ve at bir şey değildir. Eğer gerçekten inode biterse, gülünç derecede çok sayıda dosya ve dizin olduğu anlamına gelir ... "sadece" 700GB'ın ücretsiz olduğu bir> 4 TB (eğitimli tahmin) biriminde olabilir. Fs ext ailesi için, fs oluşturulduğunda inode sayısı belirlenir. Gönderen mkfs.ext4adam sayfası:

-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.

Bu cevabın geri kalanını kısaltmak için: Bu mkfs, ya böyle bir oranla sağlanır, ya da bir tane alır. Eğer arkadaşınız fs'yi varsayıldığından farklı kullanıyorsa, seçilen oran onun kullanım durumu için yanlış olabilir ve bu hatayı alır ... tonlarca küçük dosya ile tek bir çoklu TB birimini doldurmak bu şekilde sayılabilir.

Arkadaşınız dosyalar için "çöp kovası" kavramını veya büyük miktarda dosya oluşturabilecek diğer yedekleme biçimlerini uygulayan bir masaüstü ortamı kullanıyor mu? Belki de gereksiz dosyalardan kurtularak sorununu çözebilir.

Çekirdek 2.4'ün oldukça yeni olduğu zamanlardan ext2 ile ilgili bu sorunu hatırlıyorum. Genel bir kural olarak, şu anda yaygın olana kıyasla çok büyük hacimler için her zaman XFS kullanıyorum. Şu anda tek bir birim için 250 GB ile 1 TB arasında ortak olan her şeyi çağırırım ve 4 TB HDD satın alabiliriz. Yani her şey için> 3TB ben ext yerine XFS kullanmayı tercih ederim. Sadece bir kural, ama uzun süredir inode kalmadı ...


1
Korkarım sorulan soruya cevap vermiyorsunuz.
jlliagre

Doğru. Ben "Bu neden oluyor biliyor musunuz?" İsabet ilk satır içi soruyu cevaplamaya çalışıyordu ama başlığında değil.
Bananguin

Sağ. Arkadaşım ne olduğunu biliyor. Tüm bu küçük küçük dosyaların yer kaplaması için sıkıştırılmamış (veya TAR'd) artımlı değişiklikleri sakladığı bir tür yedekleme sistemi yapıyordu. Daha önce hiç bu kadar büyük bir FS'ye sahip olduğunu sanmıyorum, bu yüzden inode bitmek onun için yeni bir şeydi. Ergo, "df -h" yazdığında ve "ha, hala bir ton alanım kaldığında" diye hayal kırıklığına uğradı - Açıkçası, ona katılıyorum. Çekirdeğin "alan dışı" demesi için, aslında "inode'ların" ayrı bir mesajı olması çok kafa karıştırıcıdır.
Pretzel

@Bananguin - Varsayılan bayt / inode oranının ne olduğunu biliyor musunuz?
Pretzel

@Pretzel: Sanırım varsayılanın her 4k için bir inode olduğunu hatırlıyorum. Bilgisayarımı ( tune2fs -l /dev/sda1) kontrol ettim ve her dört blok için 1 inode oranına sahibim ve her blok 1k boyutunda. Bu ne kadar "varsayılan" olarak kabul edilebilir, ancak bilmiyorum.
Bananguin
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.