Tôi không nghĩ rằng một "công cụ trực quan hóa không gian đĩa" có thể giúp bạn trong trường hợp này: không gian bị chiếm dụng và hiển thị cho các công cụ như vậy là giống nhau du
, chỉ những công cụ đó làm chi tiết hơn. Nhưng công cụ vẫn chỉ báo cáo 8-10 GB mà bạn đã biết đã được sử dụng, không báo cáo hai mươi gigabyte đó đang "mất tích" ở đâu.
Một lời giải thích khả dĩ cho một không gian "biến mất" với tỷ lệ như vậy là nó nằm trong một (hoặc nhiều) tệp bị xóa .
Nếu bạn mở một tệp trong Unix và trong khi vẫn mở, bạn xóa (hủy liên kết), nó sẽ vẫn "tồn tại" nhưng sẽ chỉ hiển thị cho quá trình giữ bộ mô tả tệp của nó và ngay lập tức biến mất ngay sau khi quá trình kết thúc, giải phóng người mô tả
Đây là một cách tuyệt vời để quản lý các tập tin tạm thời.
Thật không may, nếu rò rỉ tệp tạm thời và dữ liệu liên tục được thêm vào nó, mà không bao giờ đóng và tạo lại tệp, thì rất nhiều không gian đĩa có thể "biến mất".
Là root, hãy thử:
ls -la /proc/*/fd/* | grep deleted
Tên tệp và ID quy trình, sẽ cho bạn biết quy trình nào đang duy trì không gian "không liên kết".
Nếu bạn có thể làm điều đó, tất nhiên, khởi động lại sẽ có tác dụng tương tự nhanh hơn. Và một số quy trình được gắn kết trong hệ thống đến mức thực sự khởi động lại chúng tốt hơn là chấm dứt chúng và quản lý tất cả các quy trình và dịch vụ phụ thuộc khác .
Ví dụ trên máy của tôi, tôi có khoảng 25 tệp như vậy và tệp này
lrwx------ 1 root root 64 May 9 07:45 /proc/732/fd/8 -> /tmp/vmware-root/vmware-usbarb-732.log (deleted)
Tôi biết rằng đôi khi phát triển trong phạm vi nhiều megabyte. Đang chạy
vmware-usbarbitrator --kill
vmware-usbarbitrator
có thể giải phóng mọi nơi từ 0 đến 100 triệu dung lượng, tùy thuộc vào thời gian nó chạy và mức độ tôi đã sử dụng vmplayer
.
Tự động kiểm tra
Một cách để kiểm tra các tệp nào đang chiếm chỗ trống sẽ là kiểm tra kích thước của chúng: hầu hết các tệp không được liên kết chỉ là một vài byte.
Phương pháp này sử dụng wc
, rất kém hiệu quả; có lẽ, việc mở tệp, tìm kiếm SEEK_END
và trả về giá trị ftell()
sẽ nhanh hơn rất nhiều (đặc biệt là trên các tệp lớn). Nhưng người ta sẽ cần phải biên dịch một tiện ích nhỏ để làm điều đó.
for i in $( ls -la /proc/*/fd/* 2>/dev/null \
| grep deleted \
| sed -e 's/.*\(\/proc\S*\) -.*/\1/g' ); do
wc -c $i | tr "\n" "="; readlink $i
done | grep -v "^0 " | sort -rn
Điều này sử dụng một cách (hy vọng) di động để liệt kê các fd ảo của tất cả các tệp đã bị xóa và đọc chúng với wc
. Sau đó, cho mỗi tệp, đọc liên kết tượng trưng. Các tập tin có độ dài bằng không được bỏ qua để tránh lộn xộn.
Trên hệ thống mới khởi động của tôi, điều này mang lại cho tôi
217032 /proc/812/fd/9=/var/run/nscd/dbMn7Auu (deleted)
217032 /proc/812/fd/8=/var/run/nscd/dbMn7Auu (deleted)
3278 /proc/2357/fd/3=/tmp/vmware-root/vmware-apploader-2327.log (deleted)
2257 /proc/2422/fd/7=/tmp/vmware-root/vmware-authdlauncher-2418.log (deleted)
vì vậy tôi biết rằng nó nscd
đang sử dụng 400 Kb "không gian vô hình" (điều này không thay đổi nếu tôi khởi động lại nscd
, vì vậy đây có thể là một khu vực làm việc không phát triển ... nhiều. Không có gì ngăn tôi theo dõi quá trình, Tuy nhiên).
Bạn cũng có thể dễ dàng lưu mã ở trên trong một tiện ích nhỏ và chạy mã này cron
, loại bỏ tất cả các giá trị trong (giả sử) 500 megs, nhưng cuối cùng gửi email cho quản trị viên sẽ xuất hiện một cái gì đó.
du
đầu ra: Bạn chạy lệnh đó nhưroot
, phải không?!