Không còn dung lượng đĩa: Làm thế nào tôi có thể tìm thấy những gì đang chiếm dung lượng?


81

Tôi đã gặp sự cố trên một trong các máy chủ của mình đang chạy 16.04: không còn dung lượng đĩa.

Tôi không biết cái gì đang chiếm không gian. Có một lệnh để liệt kê các kích thước thư mục hiện tại, vì vậy tôi có thể duyệt qua và kết thúc trong thư mục chiếm hết dung lượng?


1
Kiểm tra bộ phân tích sử dụng đĩa
Pranal Narayan

@PranalNarayan Không có GUI như trên máy chủ của tôi Tôi sợ :(
Karl Morrison

1
Bạn ơi, bây giờ tôi đã đi tìm, đã tìm thấy lỗi này.launchpad.net/ubfox/+source/baobab/+orms/942255 và ước nó là một thứ.
Sam

1
wrt "không có GUI, là máy chủ": bạn có thể cài đặt ứng dụng GUI (giả sử bạn hài lòng với nó và các thư viện hỗ trợ trên máy chủ) và sử dụng trên màn hình cục bộ của bạn thông qua X11 được điều chỉnh thông qua SSH với một cái gì đó như export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(thay thế filelightbằng công cụ ưa thích của bạn). Tất nhiên, hoàn toàn không còn chỗ trống, nếu bạn chưa cài đặt công cụ, bạn sẽ cần phải sử dụng một cái gì đó khác!
David Spillett

4
@DavidSpillett Như đã nêu, không còn chỗ trống trên máy chủ . Vì vậy, tôi không thể cài đặt bất cứ điều gì.
Karl Morrison

Câu trả lời:


93

Như mọi khi trong Linux, có nhiều hơn một cách để hoàn thành công việc. Tuy nhiên, nếu bạn cần làm điều đó từ CLI, đây là phương pháp ưa thích của tôi:

Tôi bắt đầu bằng cách chạy cái này với quyền root hoặc với sudo:

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

Grep là để giới hạn các dòng trả về cho những dòng trả về có giá trị trong phạm vi Megabyte hoặc Gigabyte. Nếu đĩa của bạn đủ lớn, bạn cũng có thể thêm |Tvào để bao gồm số lượng Terabyte. Bạn có thể nhận được một số lỗi trên /proc, /sysvà / hoặc /devvì họ không phải là tệp thực trên đĩa. Tuy nhiên, nó vẫn nên cung cấp đầu ra hợp lệ cho phần còn lại của các thư mục trong root. Sau khi bạn tìm thấy những cái lớn nhất, bạn có thể chạy lệnh bên trong thư mục đó để thu hẹp thủ phạm. Vì vậy, ví dụ, nếu /varlà lớn nhất bạn có thể làm như thế này tiếp theo:

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

Điều đó sẽ dẫn bạn đến vấn đề trẻ em!

Xem xét bổ sung

Trong khi lệnh trên chắc chắn sẽ thực hiện được mánh khóe, tôi đã có một số lời chỉ trích mang tính xây dựng trong các bình luận bên dưới chỉ ra một số điều bạn cũng có thể đưa vào.

  1. Giá trị greptôi cung cấp có thể dẫn đến giá trị "K" không thường xuyên được trả về nếu tên của thư mục hoặc tệp có chữ G hoặc M. Nếu bạn hoàn toàn không muốn bất kỳ thư mục có giá trị K nào hiển thị bạn muốn lên trò chơi regex của bạn để sáng tạo và phức tạp hơn. ví dụgrep -E "^[0-9\.]*[MG]"
  2. Nếu bạn biết ổ đĩa nào là vấn đề và nó có ổ đĩa gắn trên đầu khác mà bạn không muốn lãng phí thời gian kể cả trong tìm kiếm của mình, bạn có thể thêm -xcờ vào dulệnh của mình . Mô tả trang Man của cờ đó:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Bạn có thể sắp xếp đầu ra của dulệnh sao cho giá trị cao nhất nằm ở dưới cùng. Chỉ cần nối phần này vào cuối lệnh:| sort -h


Đây chính xác là những gì tôi làm.
Các cuộc đua nhẹ nhàng trong quỹ đạo

5
Grep của bạn cũng trả về bất kỳ thư mục nào có chữ M hoặc G trong tên của chúng, một biểu thức chính sáng tạo sẽ đánh các số có dấu chấm tùy chọn + M | G, có thể"^[0-9]*[.]*[0-9]*[MG]"
Xen2050

4
Nếu bạn biết đó là một ổ đĩa thì đó là vấn đề, bạn có thể sử dụng -xtùy chọn để duở lại trên một ổ đĩa đó (được cung cấp trên dòng lệnh). Bạn cũng có thể chuyển qua sort -hđể sắp xếp chính xác các giá trị có thể đọc được của con người megabyte / gigabyte. Tôi thường sẽ bỏ --max-depthtùy chọn và chỉ tìm kiếm toàn bộ ổ đĩa theo cách này, sắp xếp phù hợp để có được những thứ lớn nhất ở phía dưới.
Muzer

1
@alexis Kinh nghiệm của tôi là đôi khi tôi kết thúc với những thứ rác rưởi khác được gắn bên dưới đỉnh núi mà tôi quan tâm (đặc biệt nếu đó là /), và việc sử dụng -xmang lại cho tôi một sự đảm bảo rằng tôi sẽ không nhầm lẫn mọi thứ. Nếu bạn đã /có đầy đủ và bạn có một thiết bị riêng biệt /homehoặc bất cứ thứ gì, sử dụng gần như -xlà một điều cần thiết để loại bỏ những thứ không liên quan. Vì vậy, tôi thấy nó chỉ dễ sử dụng mọi lúc, chỉ trong trường hợp.
Muzer

1
Nếu bạn có loại bạn không cần grep.
OrangeDog

77

Bạn có thể sử dụng ncducho việc này. Nó hoạt động rất tốt.

sudo apt install ncdu

nhập mô tả hình ảnh ở đây


34
Tôi tự đá mình vì tôi thực sự thường sử dụng chương trình này, tuy nhiên vì không còn chỗ trống nên tôi không thể cài đặt nó haha
Karl Morrison

@KarlMorrison Tôi thấy một số giải pháp khả thi, chỉ cần gắn nó trên sshfs trên một máy tính khác và chạy ncdu ở đó (giả sử bạn đã có máy chủ ssh trên đó ..) - hoặc nếu bạn không có máy chủ ssh trên đó, bạn có thể làm ngược lại, cài đặt ncdu trên một máy chủ khác và gắn kết nó với sshfs và chạy ncdu từ mount (giả sử bạn đã có sshfs trên máy chủ) - hoặc nếu bạn không có, ... nếu ncdu là một tập lệnh đơn, bạn chỉ có thể curl http://path/to/ncdu | sh, và nó sẽ chạy trong bộ đệm IO stdin trong bộ nhớ, nhưng điều đó sẽ đòi hỏi một chút may mắn. có lẽ cũng có một cách để tạo một đĩa ram
hanshenrik

@KarlMorrison hoặc bạn có thể khởi động hình ảnh trực tiếp của Linux và cài đặt nó trong đó.

một khi cài đặt loại sudo ncdu /từ dòng lệnh. sudobởi vì nếu bạn không đặt sudo, nó sẽ không báo cáo kích thước cho các thư mục do root sở hữu và /bởi vì nếu bạn không gõ thì nó sẽ chỉ báo cáo xuống từ thư mục bạn đang ở
Max Carroll

19

Tôi sử dụng lệnh này

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

Thỉnh thoảng, tôi cần chạy nó từ /thư mục, vì tôi đã đặt thứ gì đó ở một vị trí kỳ lạ.


Cho bạn +1 để nó hoạt động! Tuy nhiên giải pháp TopHats thực sự đọc ổ đĩa của tôi nhanh hơn!
Karl Morrison

Tôi thường thấy hữu ích hơn khi thực hiện việc này mà không cần -d 1chuyển đổi (và thường là lessthay vì head -20), để tôi có được một danh sách liệt kê đệ quy đầy đủ tất cả các tệp và thư mục được sắp xếp theo không gian mà chúng tiêu thụ. Bằng cách đó, nếu tôi thấy một thư mục chiếm nhiều dung lượng, tôi có thể chỉ cần cuộn xuống để xem phần lớn không gian có thực sự bị chiếm bởi một số tệp hoặc thư mục con cụ thể trong đó không. Đó là một cách tốt để tìm một số tệp và thư mục không cần thiết để xóa để giải phóng dung lượng: chỉ cần cuộn xuống cho đến khi bạn thấy một cái gì đó bạn chắc chắn không muốn giữ, xóa nó và lặp lại.
Ilmari Karonen

@KarlMorrison nó không đọc nhanh hơn, chỉ là sortchờ đầu ra được hoàn thành trước khi bắt đầu xuất.
muru

@muru À được rồi. Tuy nhiên tôi nhận được thông tin nhanh hơn để tôi có thể bắt đầu duyệt nhanh hơn nếu đó là một thuật ngữ tốt hơn!
Karl Morrison

13

Đã có nhiều câu trả lời hay về cách tìm thư mục chiếm phần lớn dung lượng. Nếu bạn có lý do để tin rằng một vài tệp lớn là vấn đề chính, thay vì nhiều tệp nhỏ, bạn có thể sử dụng một cái gì đó như find / -size +10M.


11

Tôi không biết Ubuntu và không thể kiểm tra câu trả lời của mình nhưng đăng lên đây câu trả lời của tôi dựa trên kinh nghiệm của tôi với tư cách là quản trị viên unix từ lâu.

  1. Tìm hiểu hệ thống tập tin nào hết dung lượng

    df -h
    

    sẽ liệt kê tất cả các hệ thống tập tin, kích thước của chúng và không gian trống của chúng. Bạn chỉ lãng phí thời gian nếu bạn điều tra các hệ thống tập tin có đủ dung lượng. Giả sử rằng hệ thống tập tin đầy đủ là / myfilesystem. kiểm tra đầu ra df nếu có các hệ thống tập tin được gắn trên các thư mục con của / myfilesystems. Nếu vậy, các speps sau phải được điều chỉnh cho phù hợp với tình huống này.

  2. Tìm hiểu bao nhiêu không gian được sử dụng bởi các tập tin của hệ thống tập tin này

    du -sh /myfilesystem
    

    Tùy chọn -x có thể được sử dụng để đảm bảo rằng chỉ các tệp là thành viên của hệ thống tệp này mới được tính đến. Một số biến thể Unix (ví dụ Solaris) không biết tùy chọn -x cho du. Sau đó, bạn phải sử dụng một số cách giải quyết để tìm du của hệ thống tập tin của bạn.

  3. Bây giờ hãy kiểm tra xem du của các tệp hiển thị có xấp xỉ kích thước của không gian đã sử dụng được hiển thị bởi df không. Nếu vậy, bạn có thể bắt đầu tìm các tệp / thư mục lớn của hệ thống tập tin / myfilesystem để dọn dẹp.

  4. để tìm các thư mục con lớn nhất của thư mục /.../dir sử dụng

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

    tùy chọn -k buộc du phải xuất sie tính bằng kilobyte mà không có đơn vị nào. Đây có thể là mặc định trên một số hệ thống. Sau đó, bạn có thể bỏ qua tùy chọn này. Các tệp / thư mục con lớn nhất sẽ được hiển thị ở dưới cùng của đầu ra.

  5. Nếu bạn đã tìm thấy một tệp / thư mục lớn mà bạn không cần nữa, bạn có thể xóa nó theo cách thích hợp. Đừng bận tâm về các thư mục nhỏ trên đầu ra. Nó sẽ không giải quyết vấn đề của bạn nếu bạn xóa chúng. Nếu bạn vẫn không có đủ dung lượng, bạn có thể lặp lại bước 4 trong các thư mục con lớn được hiển thị ở cuối danh sách.

Nhưng điều gì đã xảy ra nếu đầu ra du không xấp xỉ không gian có sẵn được hiển thị bởi df?

Nếu đầu ra du lớn hơn thì bạn đã bỏ lỡ một thư mục con nơi hệ thống tập tin khác được gắn kết. Nếu đầu ra du nhỏ hơn nhiều, thì som file không được hiển thị trong bất kỳ thư mục nào mà du du kiểm tra. Có thể có những lý do khác nhau cho hiện tượng của mình.

  1. một số quy trình đang sử dụng một tập tin đã bị xóa. Do đó, các tệp này đã bị xóa khỏi thư mục và du không thể nhìn thấy chúng. Nhưng đối với hệ thống tập tin, các khối của chúng vẫn được sử dụng cho đến khi các quá trình đóng các tệp. Bạn có thể thử tìm hiểu các quy trình có liên quan (ví dụ với lsof) và buộc chúng đóng các tệp này (ví dụ: bằng cách dừng ứng dụng hoặc bằng cách hủy các quy trình). Hoặc bạn chỉ cần khởi động lại máy của bạn.

  2. có các tệp trong các thư mục không hiển thị nữa vì trên một trong các thư mục mẹ của chúng, một hệ thống tệp khác được gắn kết. Vì vậy, nếu bạn có tệp / myfilesysem / subir / bigfile và bây giờ gắn kết một hệ thống tệp khác trên / myfilesystem / subir thì bạn không thể thấy tệp này nữa và

    du -shx /myfilesystem 
    

    sẽ báo cáo một giá trị không chứa kích thước của / myfilesystem / subir / bigfile. Cách duy nhất để tìm hiểu xem các tệp như vậy có tồn tại hay không là unmount / myfilesystem / subir và kiểm tra với

    ls -la /myfilesystem/subdir 
    

    nếu nó chứa tập tin

  3. Có thể có các loại hệ thống tập tin đặc biệt sử dụng / không gian dự trữ trên đĩa không hiển thị với lệnh ls. Bạn cần các công cụ đặc biệt để hiển thị này.

Bên cạnh cách hệ thống này bằng cách sử dụng lệnh du, có một số cách khác bạn có thể sử dụng. Vì vậy, bạn có thể sử dụng lệnh find để tìm các tệp lớn hơn một số giá trị bạn cung cấp, bạn có thể tìm kiếm các tệp lớn hơn một số giá trị bạn cung cấp hoặc mới được tạo hoặc có một tên đặc biệt (ví dụ * .log, core, * .trc). Nhưng bạn luôn phải thực hiện một df như được mô tả trong 1 để bạn làm việc trên hệ thống tập tin phù hợp


Trên một máy chủ bận rộn, bạn không thể luôn luôn ngắt kết nối mọi thứ. Nhưng bạn có thể liên kết mount thư mục phía trên vào một vị trí tạm thời và nó sẽ không bao gồm các mount khác và sẽ cho phép truy cập vào các tập tin ẩn.
Zan Lynx

Trước systemd, tôi thường gặp lỗi gắn kết dẫn đến việc lấp đầy / mount với thùng rác. Ví dụ, viết một bản sao lưu vào / mnt / sao lưu mà không có ổ USB được kết nối. Bây giờ tôi chắc chắn rằng các đơn vị công việc có yêu cầu gắn kết.
Zan Lynx

@ZanLynx Cảm ơn bạn, tôi chưa bao giờ nghe nói về các liên kết gắn kết trước đây
miracle173

@ZanLynx: Không chỉ trên các máy chủ bận rộn. Hãy tưởng tượng rằng bạn có /tmptrên một hệ thống tệp riêng biệt (ví dụ: tmpfs) và một cái gì đó được tạo các tệp /tmptrước khi nó trở thành điểm gắn kết với hệ thống tệp khác. Bây giờ các tệp này đang nằm trong hệ thống tệp gốc, bị che khuất bởi một điểm gắn kết và bạn không thể truy cập chúng mà không cần khởi động lại vào chế độ khôi phục (không xử lý /etc/fstab) hoặc, như bạn đề xuất, gắn kết liên kết.
David foerster

9

Trong trường hợp bạn cũng quan tâm đến việc không sử dụng lệnh, đây là một ứng dụng: Filelight

Nó cho phép bạn nhanh chóng hình dung những gì sử dụng không gian đĩa trong bất kỳ thư mục nào.

nhập mô tả hình ảnh ở đây


Đó là một máy chủ tôi SSH, không có GUI.
Karl Morrison

@KarlMorrison Tôi nghĩ rằng có nhiều cách để chạy các chương trình GUI qua ssh, nhưng đó là ý tưởng cho sau này khi bạn có không gian để cài đặt các gói
Xen2050

@David Oh yeah, tôi đang cố gắng thoát khỏi điều đó. Nó từng là cần thiết trên một nền tảng khác mà tôi đã sử dụng. Tôi sẽ sửa nhận xét đó.

@Karl có, thật dễ dàng nếu X đã được cài đặt trên máy khách: ssh -X <your host>và sau đó chạy chương trình của bạn từ dòng lệnh

@MarkYisri quan điểm là bạn cần cài đặt chương trình và các phụ thuộc của nó. Và trường hợp của Filelight yêu cầu ít nhất KDElib và Qt, không thực sự nhỏ. Xem ví dụ trang này để biết gói Ubuntu filelight , lưu ý có bao nhiêu phụ thuộc.
Ruslan

5

Cố gắng sudo apt-get autoremovexóa các tệp không sử dụng nếu bạn chưa làm như vậy


1
Đã làm điều đó trước đây :( Nhưng ý tưởng tốt cho những người khác!
Karl Morrison

3

Tôi thường sử dụng cái này

du -sh /*/

Sau đó, nếu tôi tìm thấy một số thư mục lớn, tôi sẽ chuyển sang nó và điều tra thêm

cd big_dir
du -sh */

Nếu cần bạn cũng có thể tự sắp xếp nó với

du -s /*/ | sort -n

2

Không thực sự là một câu trả lời - nhưng một phụ lục.

Bạn đang hết dung lượng và không thể cài đặt ncdu từ câu trả lời của @erman.

Một số gợi ý

  • sudo apt clean allđể xóa các gói bạn đã tải xuống. AN TOÀN
  • sudo rm -f /var/log/*gzthanh lọc các tệp nhật ký cũ hơn một hoặc hai tuần - sẽ không xóa các nhật ký mới hơn / hiện tại. AN TOÀN NHẤT
  • sudo lsof | grep deletedliệt kê tất cả các tệp đang mở, nhưng lọc xuống những tệp đã bị xóa khỏi đĩa. KHÁ AN TOÀN
  • sudo rm /tmp/*xóa một số tệp tạm thời - nếu một cái gì đó sử dụng chúng, bạn có thể làm đảo lộn một quá trình. KHÔNG THỰC SỰ THẬT AN TOÀN

Điều đó có thể trả về các dòng như thế này:

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)

Không thể làm được gì nhiều cho dòng init, nhưng dòng thứ hai gợi ý Salt-minion có một tệp đã bị xóa và các khối đĩa sẽ được trả về sau khi tất cả các thẻ xử lý được đóng lại khi khởi động lại dịch vụ.

Các nghi phạm phổ biến khác ở đây sẽ bao gồm syslog / rsyslog / syslog-ng, mực, apache hoặc bất kỳ quy trình nào mà máy chủ của bạn chạy "nặng".


2

Tôi thấy đặc biệt có giá trị đầu ra của các công cụ như Filelight, nhưng, như trong trường hợp của bạn, trên các máy chủ thường không có GUI được cài đặt, nhưng dulệnh luôn có sẵn.

Những gì tôi thường làm là:

  • ghi duđầu ra vào một tệp ( du / > du_output.txt);
  • sao chép tập tin vào máy của tôi;
  • sử dụng DuFSđể "gắn kết" duđầu ra trong một thư mục tạm thời; DuFSsử dụng FUSE để tạo một hệ thống tệp ảo (= không có tệp nào thực sự được tạo, tất cả đều là giả) theo duđầu ra;
  • chạy Filelight hoặc một công cụ GUI khác trên thư mục tạm thời này.

Tuyên bố miễn trừ trách nhiệm: Tôi đã viết dufs- chính xác bởi vì tôi thường phải tìm ra những gì không gian đĩa trên máy không đầu.


Bạn chỉ có thể sắp xếp -n duDefput.txt
Zan Lynx

Tôi thấy màn hình đồ họa của không gian được sử dụng trực quan hơn.
Matteo Italia

-1

Tương tự như @TopHat, nhưng lọc một số tệp nếu chúng có M, G hoặc T trong tên. Tôi không tin rằng nó sẽ bỏ lỡ kích thước trong cột đầu tiên, nhưng nó sẽ không khớp với tên tệp trừ khi bạn đặt tên tệp một cách sáng tạo.

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

Công tắc dòng lệnh giải thích ở đây vì tôi không biết c hoặc a đã làm gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.