Tidak ada lagi ruang disk: Bagaimana saya bisa menemukan apa yang mengambil ruang?

81

Saya mengalami masalah pada salah satu server saya yang menjalankan 16.04: tidak ada ruang disk yang tersisa.

Saya tidak tahu apa yang mengambil ruang. Apakah ada perintah untuk mendaftar ukuran direktori saat ini, jadi saya bisa melintasi dan berakhir di direktori mengambil semua ruang?

Karl Morrison
sumber
1
Periksa penganalisis penggunaan disk
Pranal Narayan
@PranalNarayan Tidak ada GUI karena ada di server saya, saya takut :(
Karl Morrison
1
Sialan kau, sekarang aku mencari, menemukan bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 ini dan berharap itu adalah sesuatu.
Sam
1
wrt "no GUI, is a server": Anda dapat menginstal aplikasi GUI (dengan asumsi Anda senang dengan itu dan pustaka pendukung berada di server) dan gunakan ada di layar lokal Anda melalui X11-tunnelled-through-SSH dengan sesuatu seperti export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(ganti filelightdengan alat pilihan Anda). Tentu saja tanpa ruang yang tersisa, jika Anda belum menginstal alat ini, Anda tetap harus menggunakan sesuatu yang lain!
David Spillett
4
@ DavidSpillett Seperti yang dinyatakan, tidak ada ruang tersisa di server . Jadi saya tidak bisa menginstal apa pun.
Karl Morrison

Jawaban:

93

Seperti biasa di Linux, ada lebih dari satu cara untuk menyelesaikan pekerjaan. Namun, jika Anda perlu melakukannya dari CLI, ini adalah metode pilihan saya:

Saya mulai dengan menjalankan ini sebagai root atau dengan sudo:

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

Grep adalah membatasi garis yang kembali ke garis yang kembali dengan nilai dalam rentang Megabyte atau Gigabyte. Jika disk Anda cukup besar, Anda dapat menambahkan |Tjuga untuk memasukkan jumlah Terabyte. Anda mungkin mendapatkan beberapa kesalahan pada /proc,, /sysdan / atau /devkarena itu bukan file nyata pada disk. Namun, itu harus tetap memberikan output yang valid untuk sisa direktori di root. Setelah Anda menemukan yang terbesar Anda kemudian dapat menjalankan perintah di dalam direktori itu untuk mempersempit jalan Anda pelakunya. Jadi misalnya, jika /varitu yang terbesar, Anda bisa melakukannya seperti ini selanjutnya:

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

Itu akan menuntun Anda ke masalah anak-anak!

Pertimbangan Tambahan

Sementara perintah di atas pasti akan melakukan trik, saya punya beberapa kritik membangun dalam komentar di bawah ini yang menunjukkan beberapa hal yang juga bisa Anda sertakan.

  1. Nilai yang grepsaya berikan dapat mengakibatkan nilai "K" sesekali dikembalikan jika nama direktori atau file memiliki huruf kapital G atau M. Jika Anda benar-benar tidak ingin ada direktori bernilai K yang muncul, Anda ingin naik gim regex Anda menjadi lebih kreatif dan kompleks. misalnyagrep -E "^[0-9\.]*[MG]"
  2. Jika Anda tahu drive mana yang menjadi masalah dan memiliki drive lain yang terpasang di atasnya yang tidak ingin Anda buang waktu termasuk dalam pencarian Anda, Anda bisa menambahkan -xbendera ke duperintah Anda . Deskripsi halaman manual dari bendera itu:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Anda dapat mengurutkan output dari duperintah sehingga nilai tertinggi ada di bagian bawah. Cukup tambahkan ini di akhir perintah:| sort -h

Pucuk topi
sumber
Inilah yang saya lakukan.
Lightness Races in Orbit
5
Grep Anda mengembalikan folder apa pun dengan huruf M atau G di namanya juga, regex kreatif harus menekan angka dengan titik opsional + M | G, mungkin"^[0-9]*[.]*[0-9]*[MG]"
Xen2050
4
Jika Anda tahu itu adalah satu drive yang menjadi masalah, Anda dapat menggunakan -xopsi untuk dutetap menggunakan drive itu (disediakan pada command-line). Anda juga dapat melakukan pipe sort -huntuk mengurutkan dengan benar nilai megabita / gigabita yang dapat dibaca manusia. Saya biasanya meninggalkan --max-depthopsi dan hanya mencari seluruh drive dengan cara ini, menyortir dengan tepat untuk mendapatkan hal-hal terbesar di bagian bawah.
Muzer
1
@alexis Pengalaman saya adalah bahwa saya kadang-kadang berakhir dengan sampah lain yang dipasang di bawah mountpoint di mana saya tertarik (terutama jika itu /), dan menggunakan -xmemberi saya jaminan saya tidak akan salah menghitung hal. Jika Anda /penuh dan Anda memiliki mount terpisah /homeatau apa pun, menggunakan -xcukup banyak keharusan untuk menyingkirkan hal-hal yang tidak relevan. Jadi saya merasa lebih mudah menggunakannya setiap saat, untuk berjaga-jaga.
Muzer
1
Jika Anda memiliki jenis, Anda tidak perlu grep.
OrangeDog
77

Anda bisa menggunakannya ncduuntuk ini. Ini bekerja dengan sangat baik.

sudo apt install ncdu

masukkan deskripsi gambar di sini

Duncan
sumber
34
Saya menendang diri saya karena saya biasanya menggunakan program ini, tetapi karena tidak ada ruang yang tersisa saya tidak dapat menginstalnya haha
Karl Morrison
@KarlMorrison saya melihat beberapa solusi yang mungkin, cukup pasang di sshfs di komputer lain dan jalankan ncdu di sana (dengan asumsi Anda sudah memiliki server ssh di atasnya ..) - atau jika Anda tidak memiliki server ssh di atasnya, Anda dapat melakukan sebaliknya, instal ncdu di server lain dan pasang itu dengan sshfs dan jalankan ncdu dari mount (dengan anggapan Anda sudah memiliki sshfs di server) - atau jika Anda tidak memilikinya, ... jika ncdu adalah satu skrip, Anda bisa saja curl http://path/to/ncdu | sh, dan itu akan berjalan dalam cache stdin IO dalam memori, tapi itu akan membutuhkan keberuntungan. mungkin ada cara untuk membuat ram-disk juga
hanshenrik
@KarlMorrison atau Anda dapat mem-boot image live Linux dan menginstalnya di sana.
ketik sekali diinstal sudo ncdu /dari baris perintah. sudokarena jika Anda tidak memasukkan sudo, ia tidak akan melaporkan ukuran untuk folder yang dimiliki oleh root, dan /karena jika Anda tidak mengetikkan itu hanya akan melaporkan secara tersembunyi dari folder tempat Anda berada
Max Carroll
19

Saya menggunakan perintah ini

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

Kadang-kadang, saya perlu menjalankannya dari /direktori, karena saya telah menempatkan sesuatu di lokasi yang aneh.

Charles Green
sumber
Memberi Anda +1 untuk berfungsi! Namun solusi TopHats sebenarnya membaca drive saya lebih cepat!
Karl Morrison
Saya sering merasa lebih berguna untuk melakukan ini tanpa -d 1saklar (dan biasanya dengan lessbukan head -20), sehingga saya mendapatkan daftar lengkap semua file dan direktori yang diurutkan berdasarkan ruang yang mereka konsumsi. Dengan begitu, jika saya melihat direktori mengambil banyak ruang, saya hanya bisa menggulir ke bawah untuk melihat apakah sebagian besar ruang sebenarnya diambil oleh beberapa file atau subdirektori tertentu di dalamnya. Ini adalah cara yang baik untuk menemukan beberapa file dan direktori yang tidak dibutuhkan untuk dihapus untuk mengosongkan sebagian ruang: cukup gulir ke bawah sampai Anda melihat sesuatu yang Anda yakin tidak ingin simpan, hapus dan ulangi.
Ilmari Karonen
@KarlMorrison tidak membacanya lebih cepat, hanya saja sortmenunggu output selesai sebelum memulai output.
muru
@uru Ah, baiklah. Namun saya mendapatkan informasi lebih cepat sehingga saya dapat mulai melintasi lebih cepat jika itu istilah yang lebih baik!
Karl Morrison
13

Sudah ada banyak jawaban bagus tentang cara menemukan direktori yang mengambil sebagian besar ruang. Jika Anda memiliki alasan untuk percaya bahwa beberapa file besar adalah masalah utama, daripada banyak file kecil, Anda dapat menggunakan sesuatu seperti find / -size +10M.

Luca Citi
sumber
11

Saya tidak tahu Ubuntu dan tidak bisa memeriksa jawaban saya tetapi posting di sini jawaban saya berdasarkan pengalaman saya sebagai admin unix sejak lama.

  1. Cari tahu sistem file mana yang kehabisan ruang

    df -h
    

    akan mencantumkan semua sistem file, ukurannya dan ruang kosongnya. Anda hanya membuang waktu jika Anda menyelidiki sistem file yang memiliki cukup ruang. Asumsikan bahwa sistem file lengkap adalah / sistem file saya. periksa output df jika ada filesystem yang terpasang pada subdir dari / myfilesystems. Jika demikian, tumpahan berikut harus disesuaikan dengan situasi ini.

  2. Cari tahu berapa banyak ruang yang digunakan oleh file-file dari sistem file ini

    du -sh /myfilesystem
    

    Opsi -x dapat digunakan untuk menjamin bahwa hanya file yang menjadi anggota dari sistem file ini yang diperhitungkan. Beberapa varian Unix (misalnya Solaris) tidak tahu opsi -x untuk du. Maka Anda harus menggunakan beberapa solusi untuk menemukan du dari sistem file Anda.

  3. Sekarang periksa apakah du dari file yang terlihat kira-kira ukuran ruang yang digunakan ditampilkan oleh df. Jika demikian, Anda dapat mulai mencari file / direktori besar dari sistem file / myfiles untuk dibersihkan.

  4. untuk menemukan subdirektori terbesar dari direktori /.../dir gunakan

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

    opsi -k memaksa du untuk menampilkan sie dalam kilobyte tanpa unit apa pun. Ini mungkin default pada beberapa sistem. Maka Anda dapat menghilangkan opsi ini. File / subdirektori terbesar akan ditampilkan di bagian bawah output.

  5. Jika Anda telah menemukan file / direktori besar yang tidak Anda perlukan lagi, Anda dapat menghapusnya dengan cara yang sesuai. Jangan repot-repot dengan direktori kecil di bagian atas output. Itu tidak akan menyelesaikan masalah Anda jika Anda menghapusnya. Jika Anda masih belum memiliki cukup ruang daripada Anda dapat mengulangi langkah 4 di subdirektori larges yang ditampilkan di bagian bawah daftar.

Tetapi apa yang terjadi jika output du tidak kira-kira ruang yang tersedia ditampilkan oleh df?

Jika du output lebih besar maka Anda telah melewatkan subdirektori di mana sistem file lain dipasang. Jika output du jauh lebih kecil, maka beberapa file tidak ditampilkan di direktori mana pun yang diperiksa. Mungkin ada alasan berbeda untuk fenomena itu.

  1. beberapa proses menggunakan file yang sudah dihapus. Oleh karena itu file ini dihapus dari direktori dan du tidak dapat melihatnya. Tetapi untuk sistem file blok mereka masih digunakan sampai proses tutup file. Anda dapat mencoba mencari tahu proses yang relevan (misalnya dengan lsof) dan memaksa mereka untuk menutup file ini (misalnya dengan menghentikan aplikasi atau dengan mematikan proses). Atau Anda cukup reboot mesin Anda.

  2. ada file di direktori yang tidak terlihat lagi karena di salah satu direktori induknya, filesystem lain sudah di-mount. Jadi jika Anda memiliki file / myfilesysem / subdir / bigfile dan sekarang me-mount sistem file lain di / myfilesysystem / subdir maka Anda tidak dapat melihat file ini lagi dan

    du -shx /myfilesystem 
    

    akan melaporkan nilai yang tidak mengandung ukuran / myfilesystem / subdir / bigfile. Satu-satunya cara untuk mengetahui apakah file tersebut ada adalah dengan meng-unmount / myfilesystem / subir dan memeriksanya

    ls -la /myfilesystem/subdir 
    

    jika itu berisi file.

  3. Mungkin ada jenis sistem file khusus yang menggunakan / menyimpan ruang pada disk yang tidak terlihat oleh perintah ls. Anda memerlukan alat khusus untuk menampilkan ini.

Selain cara sistematis ini menggunakan perintah du ada beberapa yang dapat Anda gunakan. Jadi Anda dapat menggunakan perintah find untuk menemukan file yang lebih besar daripada beberapa nilai yang Anda berikan, Anda dapat mencari file yang lebih besar dari nilai yang Anda berikan atau yang baru dibuat atau memiliki nama khusus (mis. * .Log, inti, * .trc). Tetapi Anda harus selalu melakukan df seperti yang dijelaskan dalam 1 sehingga Anda bekerja pada sistem file yang tepat

keajaiban173
sumber
Di server yang sibuk, Anda tidak dapat selalu melepas kaitannya. Tetapi Anda dapat mengikat mount direktori atas ke lokasi sementara dan itu tidak akan menyertakan mount lain dan akan memungkinkan akses ke file yang tersembunyi.
Zan Lynx
Sebelum systemd saya sering mengalami kegagalan mount menghasilkan mengisi / mount dengan sampah. Menulis cadangan ke / mnt / cadangan tanpa drive USB yang terhubung misalnya. Sekarang saya memastikan unit kerja tersebut memiliki persyaratan pemasangan.
Zan Lynx
@ZanLynx Terima kasih, saya belum pernah mendengar bind mounts sebelumnya
miracle173
@ ZanLynx: Tidak hanya di server yang sibuk. Bayangkan Anda memiliki /tmpsistem file yang terpisah (mis. Tmpfs) dan sesuatu membuat file /tmpsebelum menjadi mount point ke sistem file yang berbeda. Sekarang file-file ini duduk di sistem file root, dibayangi oleh titik mount dan Anda tidak dapat mengaksesnya tanpa reboot ke mode pemulihan (yang tidak memproses /etc/fstab) atau, seperti yang Anda sarankan, bind-mount.
David Foerster
9

Jika Anda juga tertarik untuk tidak menggunakan perintah, inilah aplikasi: Filelight

Ini memungkinkan Anda dengan cepat memvisualisasikan apa yang menggunakan ruang disk di folder apa pun.

masukkan deskripsi gambar di sini

Gabriel
sumber
Ini server saya SSH ke, tidak ada GUI.
Karl Morrison
@KarlMorrison Saya pikir ada cara untuk menjalankan program GUI lebih dari ssh, tapi itu ide untuk nanti ketika Anda punya ruang untuk menginstal paket
Xen2050
@ David Oh, aku berusaha keluar dari itu. Dulu diperlukan pada platform lain yang saya gunakan. Saya akan memperbaiki komentar itu.
@ Kar ya, mudah jika X sudah diinstal pada klien: ssh -X <your host>dan kemudian jalankan program Anda dari baris perintah
@MarkYisri intinya adalah bahwa Anda perlu menginstal program dan dependensinya. Dan kasus Filelight membutuhkan setidaknya KDElibs dan Qt, yang tidak terlalu kecil. Lihat misalnya halaman ini untuk paket Ubuntu filelight , perhatikan berapa banyak dependensi yang dimilikinya.
Ruslan
5

Cobalah sudo apt-get autoremoveuntuk menghapus file yang tidak digunakan jika Anda belum melakukannya

Donald Shahini
sumber
1
Sudah melakukan itu sebelumnya :( Tapi ide bagus untuk orang lain!
Karl Morrison
3

Saya sering menggunakan yang ini

du -sh /*/

Lalu jika saya menemukan beberapa folder besar saya akan beralih ke sana dan melakukan penyelidikan lebih lanjut

cd big_dir
du -sh */

Jika perlu, Anda juga dapat membuatnya dengan otomatis

du -s /*/ | sort -n
phuclv
sumber
2

Bukan benar-benar jawaban - tetapi tambahan.

Anda sulit keluar dari ruang dan tidak dapat menginstal ncdu dari jawaban @erman.

Beberapa saran

  • sudo apt clean alluntuk menghapus paket yang sudah Anda unduh. AMAN
  • sudo rm -f /var/log/*gzbersihkan file log yang lebih lama dari satu atau dua minggu - tidak akan menghapus log yang lebih baru / saat ini. PALING AMAN
  • sudo lsof | grep deleteddaftar semua file yang terbuka, tetapi saring ke yang sudah dihapus dari disk. AMAN SAJA
  • sudo rm /tmp/*hapus beberapa file temp - jika ada yang menggunakannya, Anda dapat mengganggu proses. TIDAK BENAR-BENAR AMAN

Satu `s satu dapat mengembalikan baris seperti ini:

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)

Tidak dapat berbuat banyak untuk baris init, tetapi baris kedua menyarankan salt-minion memiliki file terbuka yang telah dihapus, dan blok disk akan dikembalikan setelah semua pegangan file ditutup oleh layanan restart.

Tersangka umum lainnya di sini termasuk syslog / rsyslog / syslog-ng, squid, apache, atau proses apa pun yang dijalankan server Anda yang "berat".

Criggie
sumber
2

Saya menemukan sangat berharga hasil dari alat seperti Filelight, tetapi, seperti dalam kasus Anda, pada server biasanya tidak ada GUI yang diinstal, tetapi duperintah selalu tersedia.

Apa yang biasanya saya lakukan adalah:

  • tulis duoutput ke file ( du / > du_output.txt);
  • salin file di mesin saya;
  • gunakan DuFSuntuk "me-mount" duoutput dalam direktori sementara; DuFSmenggunakan FUSE untuk membuat sistem file virtual (= tidak ada file yang benar-benar dibuat, semuanya palsu) sesuai dengan duoutput;
  • jalankan Filelight atau alat GUI lain pada direktori sementara ini.

Penafian: Saya menulis dufs- tepatnya karena saya sering harus mencari tahu apa ruang disk babi pada mesin tanpa kepala.

Matteo Italia
sumber
Anda dapat mengurutkan -n du_output.txt
Zan Lynx
Saya menemukan tampilan grafis dari ruang yang digunakan jauh lebih intuitif.
Matteo Italia
-1

Mirip dengan @ TopHat, tetapi memfilter beberapa file jika mereka memiliki M, G, atau T dalam namanya. Saya tidak percaya itu akan kehilangan ukuran di kolom pertama, tetapi tidak akan cocok dengan nama file kecuali Anda memberi nama file secara kreatif.

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

Sakelar baris perintah dijelaskan di sini karena saya tidak tahu apa yang c atau lakukan.

pengguna685769
sumber