Cách tốt nhất để giải phóng không gian đĩa từ các tệp đã xóa được giữ mở


28

Xin chào Tôi có nhiều tệp đã bị xóa nhưng vì một số lý do, không gian đĩa được liên kết với các tệp bị xóa không thể được sử dụng cho đến khi tôi rõ ràng giết quá trình cho tệp chiếm dung lượng đĩa

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

Không gian đĩa được chiếm bởi tệp đã xóa ở trên gây ra các sự cố như khi cố gắng sử dụng phím tab để tự động hoàn tất đường dẫn tệp tôi gặp lỗi bash: cannot create temp file for here-document: No space left on device

Nhưng sau khi tôi chạy kill -9 1623không gian cho PID đó được giải phóng và tôi không còn gặp lỗi nữa.

Câu hỏi của tôi là:

  • Tại sao không gian này không được giải phóng ngay lập tức khi tệp bị xóa lần đầu tiên?
  • cách tốt nhất để lấy lại không gian tệp được liên kết với các tệp đã xóa là gì?

và xin vui lòng cho tôi biết bất kỳ thuật ngữ không chính xác mà tôi đã sử dụng hoặc bất kỳ thông tin liên quan và thích hợp nào khác liên quan đến tình huống này.

Câu trả lời:


26

Trên các đơn vị, tên tệp chỉ là con trỏ (inodes) trỏ đến bộ nhớ chứa tệp (có thể là ổ cứng hoặc thậm chí là hệ thống tệp được hỗ trợ bởi RAM). Mỗi tệp ghi lại số lượng liên kết đến nó: các liên kết có thể là tên tệp (số nhiều, nếu có nhiều liên kết cứng đến cùng một tệp) và mỗi khi tệp được mở, quá trình thực sự giữ "liên kết" cùng một không gian.

Không gian chỉ được giải phóng về mặt vật lý nếu không còn liên kết nào (do đó, không thể truy cập được). Đó là lựa chọn hợp lý duy nhất: trong khi tệp đang được sử dụng, không quan trọng nếu người khác không thể truy cập được nữa: bạn đang sử dụng nó và cho đến khi bạn đóng nó, bạn vẫn có quyền kiểm soát nó - bạn thậm chí sẽ không nhận thấy tên tệp đã biến mất hoặc di chuyển hoặc bất cứ điều gì. Điều đó thậm chí còn được sử dụng cho tempfiles: một số triển khai tạo một tệp và ngay lập tức hủy liên kết nó, vì vậy nó không hiển thị trong hệ thống tệp, nhưng quá trình tạo ra nó đang sử dụng nó một cách bình thường. Flash plugin đặc biệt thích phương pháp này: tất cả các tệp video đã tải xuống được giữ mở, nhưng hệ thống tệp không hiển thị chúng.

Vì vậy, câu trả lời là, trong khi các quy trình có các tệp vẫn được mở, bạn không nên mong đợi lấy lại dung lượng. Nó không được giải phóng, nó đang được sử dụng tích cực. Đây cũng là một trong những lý do mà các ứng dụng nên thực sự đóng các tệp khi chúng sử dụng xong. Trong sử dụng bình thường, bạn không nên nghĩ rằng không gian đó là miễn phí và điều này cũng không nên rất phổ biến - ngoại trừ các tệp tạm thời không được liên kết về mục đích, thực sự không nên có bất kỳ tệp nào bạn muốn xem xét không sử dụng, nhưng vẫn mở. Cố gắng xem xét nếu có một quá trình thực hiện điều này rất nhiều và xem xét cách bạn sử dụng nó, hoặc chỉ tìm thêm không gian.


24

Các tập tin bị xóa khỏi hệ thống tập tin, nơi bị xóa bất kỳ tham chiếu đến inode này. Tham chiếu có thể trên đĩa (liên kết trong bất kỳ thư mục nào) và .. từ các ứng dụng đang mở. Nếu bạn xóa tệp - bạn chỉ xóa tham chiếu khỏi đĩa, nhưng - vẫn còn tham chiếu từ ứng dụng.

Bạn có thể "giải phóng" không gian theo hai cách sau đó:

  1. như đã đề cập ở trên - bạn có thể tắt ứng dụng, mở tệp.
  2. bạn có thể ... cắt ngắn tập tin. Ngay cả khi nó bị xóa:

Nếu bạn biết pid - hãy xem những tập tin nào được mở bởi pid này: ls -l / Proc / PID / fd bạn thấy ở đây các liên kết như:

undefine @ uml: ~ $ ls -l / Proc / 18596 / fd
razem 0
lrwx ------ 1 xác định không xác định 64 lut 1 00:06 0 -> / dev / pts / 30
lrwx ------ 1 xác định không xác định 64 lut 1 00:06 1 -> / dev / pts / 30
lrwx ------ 1 xác định không xác định 64 lut 1 00:05 2 -> / dev / pts / 30
lr-x ------ 1 xác định undefine 64 lut 1 00:06 3 -> / home / undefine / x (đã xóa)
lr-x ------ 1 xác định undefine 64 lut 1 00:06 4 -> anon_inode: inotify

Như bạn thấy - 3 fd bị xóa. bạn có thể cắt nó bằng lệnh (ví dụ):

xác định @ uml: ~ $:> / Proc / 18596 / fd / 3
xác định @ uml: ~ $ 

Hãy nhớ rằng nếu ứng dụng đọc từ tệp này - nó có thể gây nguy hiểm cho họ. Nhưng - nếu đó chỉ là một tệp nhật ký - bạn có thể cắt nó một cách an toàn.


lưu ý rằng sau khi cắt bớt tệp, quá trình ban đầu giữ nó vẫn có thể nối vào cuối (nơi dự kiến ​​kết thúc). kết quả là các tệp dường như rất lớn nhưng thưa thớt chiếm ít không gian trên đĩa (nếu hệ thống tệp hỗ trợ các tệp thưa) và chúng vẫn tiếp tục phát triển!
törzsmókus

Vâng. Nếu một cái gì đó ghi vào tập tin, nó sẽ diễn ra trên đĩa. Thật khó để tránh nó mà không dừng ứng dụng ghi vào đĩa;)
xác định

8

Như những người khác đã nói lsofcó thể được sử dụng để liệt kê tất cả các tệp đã xóa vẫn còn trên đĩa do mô tả tệp mở. Tuy nhiên, đây có thể là một danh sách rất dài. Đây là một lệnh liệt kê các tệp này được sắp xếp theo kích thước tăng dần theo byte:

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

Có thể có một cách ngắn gọn hơn để làm điều này nhưng lệnh trên đã làm việc cho tôi.


5

Không gian không được giải phóng ngay lập tức vì quá trình đang chạy vẫn có một tệp xử lý mở đối với tệp vừa bị xóa. Rốt cuộc, nếu một quá trình vẫn đang cố gắng sử dụng một tệp, có lẽ bạn không thực sự muốn kernel thoát khỏi nó (tệp). Điều đó có thể làm cho quá trình một chút khó chịu. Cách tốt nhất (và duy nhất, theo như tôi biết) để giải phóng không gian là làm những gì bạn đã làm - giết quá trình.


Có lẽ một câu tốt hơn "chỉ là cách nó hoạt động" là "nếu một quá trình vẫn đang sử dụng một tệp Unix không nên cố gắng loại bỏ nó."
Bratchley

Điểm tốt. Tôi đã thêm nó vào câu trả lời.
Giăng

-1

(Bạc hà 17.1)

TL; DR:

  • Kiểm tra với sudo baobab(Trình phân tích sử dụng đĩa).
  • Xóa rootthùng rác của người dùng.

Bối cảnh

Tôi đã bị mắc kẹt với không gian giảm dần trong khi tôi liên tục xóa các tập tin. Tôi đã cài đặt trash-cligói để đổ rác, nhưng điều này không giúp được gì. Cuối cùng, tôi nhận thấy rằng khi tôi chạy baobab(Trình phân tích sử dụng đĩa trong GUI, ít nhất là trên Mint 17.1) để kiểm tra cấu trúc không gian đĩa, nó đưa ra một cảnh báo rằng một số thư mục không thể truy cập được. Vì vậy, tôi chạy nó như rootsử dụng sudo baobab. Điều này tiết lộ vấn đề. Rất nhiều tập tin đã bị xóa nằm trong thùng rác của rootngười dùng, không phải người dùng của tôi. Vì vậy, tôi không thể giải phóng không gian. Sau đó, tôi chỉ cần dọn sạch thùng rác bằng cách sử dụng root ( sudo trash-cli) và tất cả không gian của tôi được trả lại.


-1

Hãy thử sử dụng lệnh dưới đây

lsof | grep deleted

và sau đó giết pid của tập tin bị xóa.


OP đã đạt được điều đó; Điều này không trả lời câu hỏi của họ.
Jeff Schaller
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.