Giả thuyết: đã xóa nhưng vẫn mở tệp
Với thông tin được cung cấp cho đến nay và gợi ý về sự hiện diện của một lượng lớn tệp liên quan đến docker, tôi nghi ngờ điều này là do các tệp đã xóa nhưng vẫn mở, đó là các tệp được tạo bởi một chương trình, sau đó là chương trình xóa đường dẫn hệ thống tệp trong khi vẫn mở bộ mô tả tệp.
Đây có thể là kết quả của hoạt động Docker trên hệ thống tệp.
nguyên tắc của giải pháp
- Hiển thị các tệp đã xóa vẫn được các quy trình tham chiếu (xem bên dưới để biết cách thực hiện).
- Lý tưởng nhất là tiết lộ tên và/hoặc ID quy trình để bạn có gợi ý về những gì đang xảy ra.
- Đóng các quy trình đó, quan sát rằng không gian được giải phóng.
- Nếu vẫn thất bại, chỉ cần khởi động lại máy. Nếu không gian được giải phóng, điều này phù hợp với giả thuyết.
Làm thế nào để tiết lộ thông tin
Các lệnh bên dưới sẽ kiểm tra giả thuyết bằng cách tìm và hiển thị không gian nào được sử dụng bởi tệp nào.
cái nhìn đầu tiên
Để có cái nhìn cơ bản, bạn có thể đưa ra điều này:
lsof -n | egrep -w "đã xóa|^LỆNH"
Nhưng điều này cũng sẽ liệt kê rất nhiều tệp giả chỉ trong bộ nhớ không chiếm bất kỳ dung lượng lưu trữ thực tế nào.
Ví dụ:
LỆNH PID TID TASKCMD NGƯỜI DÙNG LOẠI FD KÍCH THƯỚC THIẾT BỊ/TẮT TÊN NÚT
Xorg 1183 root 78u REG 0,1 4 2058 /memfd:xshmfence (đã xóa)
Xorg 1183 root 85u REG 0,1 4 7182 /memfd:xshmfence (đã xóa)
Xorg 1183 root 92u REG 0,1 4 7137 /memfd:xshmfence (đã xóa)
Xorg 1183 root 94u REG 0,1 4 7870 /memfd:xshmfence (đã xóa)
Danh sách đơn giản được lọc
Bộ lọc này và chủ yếu hiển thị các tệp thực:
lsof -F "sn" -lnPX -M | sed -n 's|^n/|/|p' | đã xóa grep | egrep -v '^/(dev/shm|memfd:|proc)' | LC_ALL=C sắp xếp -n | duy nhất
Ví dụ:
/tmp/#someinodenumber (đã xóa)
Thông tin đầy đủ, với kích thước, quy trình và tên nhiệm vụ
Điều này thú vị hơn: nó sẽ liệt kê tất cả các tệp cùng với dung lượng mà chúng chiếm theo byte và hơn thế nữa.
Đầu tiên, phần chậm, thu thập dữ liệu
# Bạn có thể muốn chạy phần này với quyền root để đảm bảo tất cả được báo cáo
lsof -F "ctsupMin" -lnPX -M >|/tmp/lfosoutput
Sau đó xử lý và định dạng cho hiển thị đẹp, đầy đủ và sắp xếp theo kích thước tăng dần
# Có thể chạy như người dùng thông thường, không cần root
{ echo "SIZE^UID^PID^TÊN QUY TRÌNH^TÊN NHIỆM VỤ^INODE^PATH"
</tmp/lfosoutput \
python3 -c $'nhập sys; f={}
def g(c): return f.get(c,"(unknown)")
cho dòng trong sys.stdin:
c=dòng[0] ; r=dòng[1:].rstrip() ; f[c]=r
nếu c=="n" và f["t"]=="REG" \
và "(đã xóa)" trong f["n"] \
chứ không phải f["n"].startswith("/memfd:") \
chứ không phải f["n"].startswith("/dev/shm") :
print(f'\''{g("s")}^{g("u")}^{g("p")}^\"{g("c")}\"^\"{ g("M")}\"^{g("i")}^{g("n")}'\'')
f={}' \
| LC_ALL=C sắp xếp -n | duy nhất
echo "KÍCH THƯỚC^UID^PID^TÊN QUY TRÌNH^TÊN NHIỆM VỤ^INODE^PATH"
} | cột -t -s '^'
Đầu ra mẫu: một tệp 36 megabyte được Firefox sử dụng
KÍCH THƯỚC TÊN QUY TRÌNH PID UID TÊN NHIỆM VỤ INODE PATH
36012032 1234 12345 "Công ty web bị cô lập" "StyleThread#2" 1234567 /tmp/mozilla-temp-12345 (đã xóa)
KÍCH THƯỚC TÊN QUY TRÌNH PID UID TÊN NHIỆM VỤ INODE PATH
(Thật ra có nhiều dòng như thế này, đây chỉ là dòng mẫu thôi.)
Kiểm tra xem tập lệnh có thực sự tiết lộ các tệp đó hay không bằng cách tạo một tệp
Trong một thiết bị đầu cuối khác, sao chép-dán cái này:
# Chạy trình thông dịch tương tác python
trăn3
# Bây giờ trong Python
n="/tmp/whatever_file_name_you_want"
f=open(n,mode='a')
nhập hệ điều hành
os.unlink(n)
f.write("một số câu")
f.flush()
# Đừng thoát ngay bây giờ nếu không tập tin sẽ thực sự biến mất
Trong thiết bị đầu cuối đầu tiên, bạn có thể chạy cả hai bước trên (lsof chậm sau đó là phần định dạng).
Và miễn là quá trình python ở trên còn hoạt động, dòng này sẽ được báo cáo:
KÍCH THƯỚC TÊN QUY TRÌNH PID UID TÊN NHIỆM VỤ INODE PATH
13 1000 1387343 "python3" "gdbus" 1308894 /tmp/whatever_file_name_you_want (đã xóa)
KÍCH THƯỚC TÊN QUY TRÌNH PID UID TÊN NHIỆM VỤ INODE PATH
Sau đó, bạn có thể thoát trình thông dịch python ở trên (nhấn Kiểm soát-D
hoặc gõ thoát(0)
). Nếu bạn chạy cả 2 phần (phần lsof chậm thì phần định dạng) bạn sẽ thấy file test không còn xuất hiện nữa.
Tập lệnh ở trên có thể được sửa đổi để ghi lượng dữ liệu khổng lồ (như hàng trăm gigabyte) và sử dụng các công cụ thông thường của bạn, bạn sẽ thấy rằng không gian thực sự được giải phóng chỉ sau khi quá trình tạo đã đóng bộ mô tả tệp. Kết thúc quá trình là đủ để đảm bảo đóng bộ mô tả tệp.
Quay lại trường hợp của bạn
Chạy cái này, rất có thể bạn sẽ thấy tên quy trình, tên tác vụ và tệp. Một số tệp lớn như hình ảnh mà Docker đã tải xuống từ mạng hoặc một số lượng lớn các tệp nhỏ từ Docker một lần nữa.
Hoặc một cái gì đó khác.
Xin vui lòng cho biết nếu điều này giúp bạn.