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


143

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ủ, dflệnh 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 ( dfhiể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 có noatimecờ trên các phân vùng được gắn nếu điều đó làm cho bất kỳ sự khác biệt.


Điều này xảy ra trên một phân vùng duy nhất hoặc trên tất cả các phân vùng?
Khaled

Vâng, nó xảy ra trên phân vùng dữ liệu chính của tôi, đây là điều duy nhất tôi quan tâm, vì tôi chỉ ghi / xóa các tập tin vào nó.

Xin hãy soi sáng cho tôi với giải pháp, hoặc một liên kết đến một.

Hệ thống tập tin nào? DF thực hiện một chỉ số của siêu khối, có thể là hệ thống tệp của bạn không cập nhật inode sb. Bạn đã thử xóa bộ nhớ cache?
đậu

Sử dụng ext4. Làm thế nào để bạn tuôn ra bộ nhớ cache?

Câu trả lời:


236

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).


2
Các tệp đã bị xóa không được truy cập trong hơn một tháng và quá trình duy nhất truy cập chúng là nginx, vì vậy nó rất đáng nghi ngờ.

39
+1. Ngoài ra, "lsof + L1" sẽ cho bạn biết chương trình nào đang giữ các tệp đang mở.
pehrs

4
khi root chạy "tập tin lsof -n | grep", bạn sẽ ngạc nhiên về việc các tập tin có thể tồn tại bao lâu do các quy trình giữ cho chúng mở vì bất kỳ lý do gì. Nếu vẫn thất bại, khởi động lại, tôi cảm thấy không tốt khi đề xuất nó nhưng chắc chắn sẽ đảm bảo không có gì đang giữ trong tệp. Mỗi pehrs, lsof + L1 có lẽ là cách tốt hơn để đi.
ScottZ

3
Bạn vừa cứu tôi! Đã xóa tệp nhật ký 93G và không lấy lại được dung lượng và không thể hiểu tại sao. Cảm ơn.
Luke Cousins

1
Cùng một dòng và trong trường hợp điều này giúp người khác, tôi đã xóa một tệp access.log nginx lớn nhưng chỉ có thể lấy lại dung lượng sau khi khởi động lại nginx: dịch vụ nginx khởi động lại
Nick

28

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

[hudson@opsynxvm0055 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 đó

[hudson@opsynxvm0055 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.


1
những gì hiện > FDlàm gì?
Pred

nó xóa phần mô tả tập tin
Adrián Deccico

2
>lệnh này có tên không? tôi đã phải chuyển từ zsh sang bash để có thể sử dụng nó. Có thể chạy nó trên zsh?
ariera

1
nó là một chuyển hướng đầu ra và do đó cắt ngắn tập tin. Từ dài sẽ là "echo -n> 1" hoặc "true> 1". Nó không thực sự loại bỏ FD, nó chỉ trỏ đến một tập tin trống sau đó.
eckes

8

Một khả năng là (các) tệp bạn đã xóa có nhiều tham chiếu 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 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 hóa ra 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).


4

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 deletedvà xem quá trình đ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 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 nếu không gian đã được giải phóng. 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

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

[root@server]# 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 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>

1

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 đượ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 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 dụng bởi đã 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

Vì tôi biết một tấn bạn đang làm điều này để làm lại /varcác tập tin và gzipping mong muốn FS thu nhỏ lại, nhưng thay vào đó nó 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
Điều này không thực sự thêm nhiều; câu trả lời được chấp nhận bao gồm logic đằng sau đó vào năm 2001. Khi bạn có 50 đại diện, hãy sử dụng nhận xét nếu bạn muốn thêm vòng loại vào câu trả lời hiện có.
Andrew B

0

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. dftrong 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

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


1
Marcellus thân mến, giải pháp của bạn được bao gồm bởi câu trả lời được chấp nhận; và đôi khi bạn không muốn thực hiện khởi động lại nếu bạn không bị ép buộc ...
Deer Hunter

-1

Để kiểm tra những tập tin bị xóa đã chiếm bộ nhớ, hãy nhập lệnh

 $ sudo lsof | grep deleted

Nó sẽ hiển thị các tập tin bị xóa giữ bộ nhớ.

Sau đó, giết quá trình với pid hoặc tên

$ sudo kill <pid>
$ df -h

kiểm tra ngay bây giờ bạn sẽ có cùng bộ nhớ

Nếu không gõ lệnh dưới đây để xem tập tin nào đang chiếm bộ nhớ

# cd /
# du --threshold=(SIZE)

đề cập đến bất kỳ kích thước nào, nó sẽ hiển thị các tệp đang chiếm trên kích thước ngưỡng và xóa tệp bạn sẽ tìm thấy bộ nhớ được giữ lại


-4

mở terminal thử lệnh này df-Tiếp theo sử dụng lệnh này sudo du -h --max-height = 1 / trong lệnh này, bạn sẽ tìm thấy chi tiết sử dụng đĩa sau đó mở khi người dùng root xóa tệp (root-local-share-thùng rác) và xóa tập tin của bạn

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.