it-swarm-vi.tech

df trong linux không hiển thị không gian trống chính xác sau khi xóa tệp

Tôi có máy chủ tập tin được sử dụng để lưu trữ tập tin. Các tập tin có thể nằm ở đó trong một tuần hoặc trong một năm. Thật không may, khi tôi xóa các tệp khỏi máy chủ, lệnh df không phản ánh không gian được giải phóng. Vì vậy, cuối cùng, máy chủ đã được lấp đầy (df hiển thị 99%) và tập lệnh của tôi không gửi thêm bất kỳ tệp nào ở đó, ngoại trừ có thể có vài chục GB dung lượng trống trên đó.

Tôi đã gắn cờ noatime trên các phân vùng được gắn nếu điều đó tạo ra sự khác biệt.

157
user11350

Xóa tên tệp không thực sự xóa tệp. Một số quy trình khác đang giữ tệp mở, khiến nó không bị xóa; khởi động lại hoặc giết quá trình đó để phát hành tập tin.

Sử dụng

lsof +L1

để tìm hiểu quá trình nào đang sử dụng tệp bị xóa (không liên kết).

249

như Ignacio đề cập, việc xóa tệp sẽ không giải phóng không gian cho đến khi bạn xóa các quy trình có xử lý mở đối với tệp đó.

Tuy nhiên, bạn có thể lấy lại không gian mà không làm hỏng các quy trình. Tất cả bạn cần làm là để loại bỏ các mô tả tập tin.

Thực hiện đầu tiên lsof | grep đã xóa để xác định quá trình giữ tệp

[[email protected] log]$ /usr/sbin/lsof |grep deleted
Java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

Sau đó thực hiện:

cd /proc/PID/fd

sau đó

[[email protected] fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

"1" sẽ là mô tả tập tin. Bây giờ gõ "> FD" để lấy lại khoảng trống đó

> 1

Bạn có thể cần phải lặp lại thao tác nếu có các quá trình khác đang giữ tệp.

29
Adrián Deccico

Một khả năng là (các) tệp bạn đã xóa có nhiều tài liệu tham khảo hơn trong hệ thống tệp. Nếu bạn đã tạo liên kết cứng, một số tên tệp sẽ trỏ đến cùng một dữ liệu và dữ liệu (nội dung thực tế) sẽ không được đánh dấu là miễn phí/có thể sử dụng được cho đến khi tất cả các tham chiếu đến nó bị xóa. Trước khi bạn xóa các tệp, hãy đánh dấu chúng (Mục nhập có tên Liên kết) hoặc thực hiện ls -l trên chúng (phải là cột thứ hai).

Nếu nó chỉ ra rằng các tệp được tham chiếu ở nơi khác, tôi đoán bạn sẽ phải ls -i (các) tệp để tìm số inode, sau đó thực hiện tìm với -inum <inode-number> để tìm các tham chiếu khác đến tệp đó (có lẽ bạn cũng muốn sử dụng -mount để ở trong cùng hệ thống tệp).

8
Kjetil Joergensen

Nếu phân vùng đã được định cấu hình để dành một phần không gian đĩa nhất định cho việc sử dụng root, df sẽ không bao gồm không gian này như có sẵn.

[[email protected]]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

Ngay cả sau khi không gian sẽ được lấy lại bằng cách xóa các tệp/thư mục, người dùng không root sẽ không thể ghi vào phân vùng cụ thể.

Bạn có thể dễ dàng kiểm tra xem đó có phải là trường hợp của bạn hay không bằng cách cố gắng tạo một tệp trên thiết bị với tư cách là người dùng root và không root.

Ngoài ra, bạn có thể kiểm tra cấu hình hệ thống tập tin bằng cách chạy

tune2fs -l <device> | egrep "Block count|Reserved block count

và tự tính% thực tế.

Để thay đổi đĩa% dành riêng cho việc sử dụng chỉ root, hãy thực thi

tune2fs -m <percentage> <device>
6
luka5z

Các tập tin vẫn bị khóa bởi quá trình mở nó. Để giải phóng không gian, hãy thực hiện các bước sau:

  1. Chạy Sudo lsof | grep deleted và xem quá trình nào đang giữ tập tin. Kết quả ví dụ:

    $ Sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Giết quá trình bằng cách sử dụng Sudo kill -9 {PID}. Trong mẫu trên, PID là 1623.

    $ Sudo kill -9 1623
    
  3. Chạy df để kiểm tra xem dung lượng đã được giải phóng chưa. Nếu nó vẫn còn đầy, có lẽ bạn cần đợi vài giây và kiểm tra lại.

4
Aminah Nuraini

Vì tôi biết một tấn bạn đang làm điều này cho redhat trong /var và các tệp gzipping mong muốn FS thu nhỏ lại, nhưng thay vào đó, nó sẽ phát triển, chỉ cần đảm bảo rằng dịch vụ của bạn khởi động lại syslog. và

lsof -v file

dù sao đi nữa cũng sẽ cho bạn thấy điều này.

1
user1802263

Các câu trả lời khác là chính xác: Nếu bạn xóa một tệp và không gian không được giải phóng, thì thường là do tệp vẫn được giữ mở hoặc có các liên kết cứng khác với nó.

Để giúp khắc phục sự cố, hãy sử dụng một công cụ cho bạn biết không gian ổ đĩa đang được sử dụng: Bạn có thể sử dụng du để có cái nhìn tổng quan về nơi không gian sẽ đi. Thậm chí tốt hơn, sử dụng một công cụ đồ họa như xdiskusage (có nhiều cái như thế này) để săn lùng thủ phạm. xdiskusage và bạn bè cho phép bạn đi sâu vào những con lợn không gian lớn nhất để tìm nơi không gian đang đi.

Bằng cách đó, bạn sẽ nhanh chóng tìm thấy các tệp vẫn chiếm dung lượng do liên kết cứng thứ hai. Nó cũng sẽ hiển thị không gian bị chiếm bởi bị xóa, nhưng tôi mở các tệp (như (quyền bị từ chối), vì tôi không thể đọc tên tệp).

1
sleske

Tôi đang sử dụng EXT2, FSCK đã giúp tôi trong tình huống này. Hãy thử tắt máy -F ngay bây giờ, sau khi khởi động lại và fsck, tôi thấy một nửa không gian đã sử dụng.

0
Marcellus

Thêm một lựa chọn: Đĩa có thể đầy do một quá trình liên tục tạo dữ liệu: nhật ký, lõi và những thứ tương tự. Có thể là không gian thực sự được giải phóng nhưng ngay lập tức được lấp đầy. Tôi thực sự đã thấy một trường hợp như vậy. df trong trường hợp này chỉ đơn giản là không đưa ra hình ảnh lỗ. Sử dụng du để tìm hiểu thêm.

0
Chen Levy