Artık disk alanı yok: Yer kaplayanı nasıl bulabilirim?


81

16.04 çalışan sunucularımdan birinde bir sorunla karşılaştım: hiç disk alanı kalmadı.

Ne yer kapladığı hakkında hiçbir fikrim yok. Geçerli dizin boyutlarını listelemek için bir komut var, bu yüzden tüm alanı kaplayan dizinde dolaşabilirim


1
Disk kullanım analizcisini kontrol edin
Pranal Narayan

@PranalNarayan Benim sunucumda GUI yok korkarım :(
Karl Morrison

1
Kahretsin, şimdi bakmaya başladım, bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 buldu ve bir şey olmasını dilerdim.
Sam,

1
wrt "GUI yok, bir sunucudur": GUI uygulamasını kurabilirsin (bir sunucuda olduğundan ve destek kütüphanelerinden memnun olduğunu varsayarak) ve X11-tunnelled-SSH aracılığıyla yerel ekranınıza kullanıyorsunuz. export DISPLAY=:0.0; ssh -Y <user>@<server> filelight( filelighttercih ettiğiniz araçla değiştirin ). Tabii ki kesinlikle hiç yer kalmadı, zaten aletiniz kurulu değilse, başka bir şey kullanmanız gerekir!
David Spillett

4
@DavidSpillett Belirtildiği gibi , sunucuda yer kalmadı . Yani hiçbir şey yükleyemiyorum.
Karl Morrison,

Yanıtlar:


93

Her zaman olduğu gibi Linux'ta da, işi halletmenin birden fazla yolu var. Ancak, CLI'den yapmanız gerekirse, bu benim tercih ettiğim yöntem:

Bunu root olarak veya sudo ile çalıştırarak başladım:

du -cha --max-depth=1 / | grep -E "M|G"

İz, dönüş hatlarını Megabayt veya Gigabayt aralığındaki değerlerle dönen hatlarla sınırlandırmaktır. Eğer diskleriniz yeterince büyükse, |TTerabayt miktarlarını eklemek için de ekleyebilirsiniz . Üzerinde bazı hatalar alabilirsiniz /proc, /sysve / veya /devbunların diskte gerçek dosyalar olmadıklarından. Ancak, yine de kök dizin içindeki diğer dizinler için geçerli çıktı sağlamalıdır. En büyüğünü bulduktan sonra, suçluyu daraltmak için bu dizinin içindeki komutu çalıştırabilirsiniz. Mesela, eğer /varen büyüğü olsaydı , bundan sonra böyle yapabilirdiniz:

du -cha --max-depth=1 /var | grep -E "M|G"

Bu sizi problemlere götürmeli!

Ek Hususlar

Yukarıdaki komut kesinlikle işe yarar olsa da, aşağıdaki yorumlarda da ekleyebileceğiniz bazı şeyleri belirten bazı yapıcı eleştirilerim vardı.

  1. grepDizin veya dosyanın adı kesinlikle yukarı isterdim gösterilmesini K değerli dizinleri herhangi istemiyorsanız bir sermaye G veya M. varsa ara sıra "K" değere neden olabilir sağlanan ben iade edilen senin regex oyunun daha yaratıcı ve karmaşık olması. Örneğingrep -E "^[0-9\.]*[MG]"
  2. Sorunun hangi sürücünün olduğunu biliyorsanız ve üzerinde aramanıza dahil zaman kaybetmek istemediğiniz başka takılı sürücüler varsa, -xbayrağı dukomutunuza ekleyebilirsiniz . Bu bayrağın Man sayfa açıklaması:

      -x, --one-file-system
          skip directories on different file systems
    
  3. duKomutun çıktısını, en yüksek değer en altta olacak şekilde sıralayabilirsiniz . Sadece bunu komutun sonuna ekleyin:| sort -h


Bu tam olarak yaptığım şey.
Orbit'teki Hafiflik Yarışları

5
"^[0-9]*[.]*[0-9]*[MG]"
Grep'inizde

4
Sorun bu olan bir sürücü biliyorsanız, o sürücüde kalmak için bu -xseçeneği kullanabilirsiniz du(komut satırında sağlanır). Ayrıca sort -hmegabayt / gigabayt insan tarafından okunabilen değerleri doğru şekilde sıralamak için boru da kullanabilirsiniz. Genellikle bu --max-depthseçeneği devre dışı bırakır ve en alttaki şeyleri almak için uygun bir şekilde sıralama yaparak tüm sürücüyü bu şekilde arardım.
Muzer

1
@alexis Benim deneyimim, bazen ilgilendiğim noktaya monte edilmiş diğer çöplerle bitirdim (özellikle öyleyse /) ve kullanmak -xbana yanlış şeyler söylemeyeceğimin garantisi veriyor. Eğer cihazınız /doluysa ve ayrı olarak monte edilmiş /homeveya her neyse, -xkullanım alakasız şeylerden kurtulmanız için bir zorunluluktur. Bu yüzden, her zaman kullanmak için daha kolay olduğunu düşünüyorum, her durumda.
Muzer

1
Sıralama varsa, grep gerekmez.
OrangeDog

77

Bunun için kullanabilirsiniz ncdu. Çok iyi çalışıyor.

sudo apt install ncdu

görüntü tanımını buraya girin


34
Aslında bu programı normalde kullandığım için kendime tekme atıyorum, ancak boş alan kalmadığından haha ​​yükleyemiyorum haha
Karl Morrison

@KarlMorrison birkaç olası çözüm görüyorum, sadece başka bir bilgisayara sshfs üzerine monte et ve orada ncdu çalıştır (zaten üstünde bir ssh sunucusu olduğunu varsayarak). - ya da üzerinde bir ssh sunucunuz yoksa, tersine, ncdu'yu başka bir sunucuya kurun ve sshfs ile bağlayın ve ncdu'yu mount'dan çalıştırın (zaten sunucuda sshfs olduğunu varsayalım) - ya da yoksa Sadece curl http://path/to/ncdu | sh, ve bir bellek içi IO stdin önbellekte çalışacak, ancak bu biraz şans gerektirecektir. Muhtemelen de bir ram disk yapmak için bir yol vardır
hanshenrik

@KarlMorrison veya Linux'un canlı görüntüsünü önyükleyebilir ve oraya yükleyebilirsiniz.

Kurulduktan sudo ncdu /sonra komut satırından yazın. sudoçünkü eğer sudo koymazsanız, root tarafından sahip olunan klasörler için boyutları /bildirmezsiniz ve yazmazsanız, sadece bulunduğunuz klasörden aldıkları şekilde rapor edersiniz
Max Carroll

19

Bu komutu kullanıyorum

sudo du -aBM -d 1 . | sort -nr | head -20

Bazen, /garip bir yere bir şey koyduğum için dizinden çalıştırmam gerekiyor .


Bunun için size +1 verilmesi! Ancak TopHats çözümü aslında sürücümü daha hızlı okuyor!
Karl Morrison,

Sık sık daha kullanışlı olmadan bunu bulmak -d 1(ve genellikle ile anahtarın lessyerine head -20onlar tüketmek uzayda göre sıralanmış tüm dosyaları ve dizinleri tam yinelemeli sayılan listesini almak böylece). Bu şekilde, çok fazla alan kaplayan bir dizin görürsem, boşluğun çoğunun gerçekte belirli bir dosya veya alt dizin tarafından alındığını görmek için aşağı kayabilirim. Gereksiz dosyaları ve dizinleri, yer açmak için silmek üzere bulmanın iyi bir yolu: Saklamak istemediğiniz, sildiğiniz ve tekrarlayan bir şey görünceye kadar aşağı kaydırın.
Ilmari Karonen

@KarlMorrison daha hızlı okumuyor, sadece sortçıktıya başlamadan önce çıktının tamamlanmasını beklemektedir.
muru

@muru Ah tamam. Ancak daha hızlı bilgi alıyorum, böylece daha iyi bir terim varsa daha hızlı geçmeye başlayabilirim!
Karl Morrison

13

Alanın çoğunu alan dizinleri bulma yollarıyla ilgili çok sayıda iyi cevap var. Birkaç büyük dosyanın küçük sorunlardan ziyade asıl sorun olduğuna inanmak için bir nedeniniz varsa, bunun gibi bir şey kullanabilirsiniz find / -size +10M.


11

Ubuntu'yu tanımıyorum ve cevabımı kontrol edemiyorum, ancak uzun zaman önce unix yöneticisi olarak deneyimlerime dayanarak cevabımı buraya yazdım.

  1. Hangi dosya sisteminin yetersiz kaldığını bulun

    df -h
    

    tüm dosya sistemlerini, boyutlarını ve boş alanlarını listeler. Sadece yeterli alana sahip dosya sistemlerini araştırırsanız zaman harcarsınız. Tam dosya sisteminin / myfilesystem olduğunu varsayalım. / myfilesystems alt dizinlerine monte edilmiş dosya sistemleri varsa, df çıktısını kontrol edin. Eğer öyleyse, aşağıdaki spepsler bu duruma adapte edilmelidir.

  2. Bu dosya sisteminin dosyaları tarafından ne kadar yer kullanıldığını öğrenin

    du -sh /myfilesystem
    

    -X seçeneği, yalnızca bu dosya sistemlerine üye olan dosyaların dikkate alındığını garanti etmek için kullanılabilir. Bazı Unix varyantları (örneğin Solaris) du için -x seçeneğini bilmiyor. Sonra dosya sisteminizin du du bulmak için bazı geçici çözümler kullanmak zorunda.

  3. Şimdi, görünen dosyaların du dosyasının yaklaşık olarak df tarafından gösterilen kullanılmış alanın boyutunun olup olmadığını kontrol edin. Öyleyse, temizlemek için / myfilesystem dosya sisteminin büyük dosyalarını / dizinlerini bulmaya başlayabilirsiniz.

  4. Bir dizinin en büyük alt dizinlerini bulmak için /.../dir use

    du -sk /.../dir/*|sort -n
    

    -k seçeneği du'yu herhangi bir birim olmadan kilobayt cinsinden çıktı almaya zorlar. Bazı sistemlerde bu varsayılan olabilir. O zaman bu seçeneği atlayabilirsiniz. En büyük dosyalar / alt dizinler çıktının altında gösterilecektir.

  5. Artık ihtiyacınız olmayan büyük bir dosya / dizin bulursanız, uygun bir şekilde kaldırabilirsiniz. Çıktının üstündeki küçük dizinleri zahmet etmeyin. Silmeniz sorununuzu çözmez. Hala yeterli alana sahip değilseniz, listenin altında görüntülenen larges alt dizinlerinde 4. adımı tekrarlayabilirsiniz.

Ancak du çıktısı df tarafından görüntülenen kullanılabilir alan değilse, ne oldu?

Du çıkışı daha büyükse, başka bir dosya sisteminin monte edildiği bir alt dizini kaçırdınız. Du çıkışı çok daha küçükse, denetlenen herhangi bir dizinde som dosyalar gösterilmez. Fenomeninin farklı sebepleri olabilir.

  1. bazı işlemler zaten silinmiş bir dosyayı kullanıyor. Bu nedenle bu dosyalar dizinden kaldırıldı ve du onları göremiyor. Ancak dosya sistemi için bloklar, işlemler dosyaları kapatıncaya kadar kullanımdadır. İlgili işlemleri bulmaya çalışabilir (örneğin lsof ile) ve bu dosyaları kapatmaya zorlayabilirsiniz (örneğin, uygulamayı durdurarak veya işlemleri öldürerek). Veya makinenizi yeniden başlatmanız yeterlidir.

  2. dizinlerde artık görünmeyen dosyalar var çünkü üst dizinlerinden birinde başka bir dosya sistemi var. Eğer bir dosya / myfilesysem / subdir / bigfile kullanıyorsanız ve şimdi / myfilesystem / subdir üzerine başka bir dosya sistemi kurduysanız, bu dosyayı artık göremezsiniz ve

    du -shx /myfilesystem 
    

    / myfilesystem / subdir / bigfile boyutunu içermeyen bir değer bildirir. Bu tür dosyaların olup olmadığını anlamanın tek yolu / myfilesystem / subir bağlantısını kaldırmak ve kontrol etmektir.

    ls -la /myfilesystem/subdir 
    

    eğer dosyalar içeriyorsa.

  3. Ls komutunun göremediği bir diskte alan / alan kullanan özel dosya sistemleri olabilir. Bunu görüntülemek için özel araçlara ihtiyacınız var.

Du komutunu kullanarak bu sistematik yolun yanı sıra kullanabileceğiniz başkaları da var. Böylece, verdiğiniz değerden daha büyük dosyaları bulmak için find komutunu kullanabilirsiniz, sağladığınız değerden daha büyük olan veya yeni oluşturulmuş veya özel bir adı olan (örneğin * .log, core, *) dosyaları arayabilirsiniz. trc). Ancak her zaman 1'de tanımlandığı gibi bir df yapmalısınız, böylece doğru dosya sisteminde çalışabilirsiniz.


Meşgul bir sunucuda işleri her zaman çıkaramazsınız. Ancak üst dizini geçici bir konuma bağlayabilirsiniz ve diğer ekleri içermez ve gizli dosyalara erişime izin verir.
Zan Lynx

Sistemden önce, çoğu kez montaj hatalarıyla karşılaşıyordum / mount'u çöp ile dolduruyordum. Örneğin USB sürücü olmadan / mnt / backup'a bir yedekleme yazma. Şimdi bu iş birimlerinin montaj gereksinimlerinin olduğundan emin oluyorum.
Zan Lynx,

@ZanLynx Teşekkürler, daha önce bağlama bağlama duymadım
miracle173

@ZanLynx: Sadece meşgul sunucularda değil. Farklı bir dosya sistemine bağlama noktası olmadan önce /tmpayrı bir dosya sisteminde (örneğin bir tmpfs) ve oluşturulan bir dosyada olduğunu hayal edin /tmp. Artık bu dosyalar kök dosya sisteminde oturuyor, bir bağlama noktasıyla gölgeli ve kurtarma moduna yeniden başlamadan (işlenmeyen /etc/fstab) veya önerdiğiniz gibi bir bağlama bağlama olmadan onlara erişemiyorsunuz .
David Foerster

9

Komut kullanmamakla da ilgileniyorsanız, işte bir uygulama: Filelight

Herhangi bir klasörde disk alanını ne kullandığını hızlı bir şekilde görmenizi sağlar.

görüntü tanımını buraya girin


SSH'ye eklediğim bir sunucu, GUI yok.
Karl Morrison,

@KarlMorrison GUI programlarını ssh üzerinden çalıştırmanın bir yolu olduğunu düşünüyorum, ancak paketleri yüklemek için
yeriniz

@David Oh evet, bundan kurtulmaya çalışıyorum. Kullandığım başka bir platformda gerekli olması gerekiyordu. Bu yorumu düzelteceğim.

@Karl evet, istemcide X zaten yüklüyse kolaydır: ssh -X <your host>ve sonra programınızı komut satırından çalıştırın

@MarkYisri nokta, programı ve bağımlılıklarını kurmanız gerektiğidir. Ve Filelight'ın durumu en azından küçük olmayan KDElibs ve Qt gerektirir. Filelight Ubuntu paketi için bu sayfaya bakınız , ne kadar bağımlılığı olduğuna dikkat edin.
Ruslan

5

sudo apt-get autoremoveKullanmadıysanız, kullanılmayan dosyaları kaldırmayı deneyin


1
Zaten daha önce yaptım :( Ama diğerleri için iyi bir fikir!
Karl Morrison

3

Bunu sıklıkla kullanırım

du -sh /*/

O zaman bazı büyük klasörler bulursam, ona geçeceğim ve daha fazla araştırma yapacağım

cd big_dir
du -sh */

Gerekirse, aynı zamanda otomatik olarak sıralamak yapabilirsiniz

du -s /*/ | sort -n

2

Gerçekten bir cevap değil - bir zeyilname.

Boş alanın dışındasın ve @ erman'ın cevabından ncdu kuramıyorsun.

Bazı öneriler

  • sudo apt clean allZaten indirdiğiniz paketleri silmek için. KASA
  • sudo rm -f /var/log/*gzbir veya iki haftadan daha eski olan günlük dosyalarını temizleme - daha yeni / geçerli günlükleri silmez. EN GÜVENLİ
  • sudo lsof | grep deletedtüm açık dosyaları listele, ancak diskten silinmiş olanları filtrele. OLDUKÇA GÜVENLİ
  • sudo rm /tmp/*bazı geçici dosyaları sil - bir şey onları kullanıyorsa, bir süreci üzebilirsin. GÜVENLİ DEĞİL DEĞİL

Birincisi şöyle satırları döndürebilir:

server456 ~ $ lsof | grep deleted
init          1          root    9r      REG              253,0  10406312       3104 /var/lib/sss/mc/initgro                        ups (deleted)
salt-mini  4532          root    0r      REG              253,0        17     393614 /tmp/sh-thd-1492991421                         (deleted)

Init satırı için fazla bir şey yapamayız, ancak ikinci satır salt-minion'un silinmiş bir dosyayı açtığını ve tüm dosya tanıtıcıları bir servis yeniden başlatıldığında kapatıldığında disk bloklarının döndürüleceğini gösteriyor.

Buradaki diğer genel şüpheliler syslog / rsyslog / syslog-ng, kalamar, apache veya sunucunuzun "ağır" olan herhangi bir işlemi yapmasıdır.


2

Filelight gibi araçların çıktısını özellikle değerli buluyorum, ancak durumunuzda olduğu gibi, sunucularda normalde GUI kurulu değil, ancak dukomut her zaman kullanılabilir durumda.

Normalde yaptığım şey:

  • bilgileri du(bir dosyaya çıktı du / > du_output.txt);
  • dosyayı makineme kopyala;
  • çıktıyı geçici bir dizine DuFS"monte etmek" için kullanın du; çıktıya DuFSgöre sanal bir dosya sistemi oluşturmak için FUSE kullanır (= hiçbir dosya oluşturulmaz, hepsi sahtedir) du;
  • bu geçici dizinde Filelight veya başka bir GUI aracı çalıştırın.

Feragatname: Yazdım dufs- tam olarak başsız makinelerde hangi disk boşluğunu bulmam gerektiğinden dolayı.


Sadece -n du_output.txt dosyasını sıralayabilirsiniz
Zan Lynx

Kullanılan alanın grafik görüntüsünü daha sezgisel buluyorum.
Matteo Italia,

-1

@TopHat'a benzer, ancak adlarında M, G veya T varsa, bazı dosyaları filtreler. İlk sütunda boyutu kaçıracağına inanmıyorum, ancak dosyaları yaratıcı bir şekilde adlandırmazsanız dosya adıyla eşleşmiyor.

du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]'

Komut satırı anahtarları burada c veya a'nın ne yaptığını bilmiyordum çünkü açıkladı .

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.