Làm thế nào để sử dụng Inode miễn phí?


274

Tôi có một ổ đĩa trong đó mức sử dụng inode là 100% (sử dụng df -ilệnh). Tuy nhiên, sau khi xóa các tập tin đáng kể, việc sử dụng vẫn là 100%.

Cách chính xác để làm điều đó là gì?

Làm thế nào có thể một ổ đĩa có ít dung lượng sử dụng không gian đĩa có thể có mức sử dụng Inode cao hơn ổ đĩa có mức sử dụng không gian đĩa cao hơn?

Có thể nếu tôi nén nhiều tập tin sẽ làm giảm số lượng inode được sử dụng?


4
Muốn cho bạn 50 điểm cho câu hỏi này. Làm thế nào tôi có thể làm được! :)
Sophy

@Sophy Đừng làm vậy. bạn sẽ bị cấm tự động
Steven Lu

1
@StevenLu Cảm ơn bạn đã thông tin của bạn! Tôi muốn cung cấp tín dụng cho anh ấy vì tôi đã dành một vài ngày để giải quyết vấn đề của tôi. Nhưng vấn đề này có thể giúp tôi. Cảm ơn một lần nữa,
Sophy

1
@Sophy: tại sao lại trao giải thưởng gì đó ngoài chủ đề cho SO? :) Đó chắc chắn không phải là một câu hỏi lập trình, bất kể nó có bao nhiêu upvote.
tink

Thư mục trống cũng tiêu thụ inodes. Xóa chúng có thể giải phóng một số nút. Số lượng có thể có ý nghĩa trong một số trường hợp sử dụng. Bạn có thể xóa các thư mục trống với: find. -type d -empty -delete
Ruchit Patel

Câu trả lời:


170

Thật dễ dàng để một đĩa có số lượng lớn các nút được sử dụng ngay cả khi đĩa không đầy.

Một nút được phân bổ cho một tệp, vì vậy, nếu bạn có các tập tin, mỗi tệp 1 byte, bạn sẽ hết các nút trong thời gian dài trước khi bạn hết đĩa.

Cũng có thể xóa các tệp sẽ không làm giảm số lượng inode nếu các tệp có nhiều liên kết cứng. Như tôi đã nói, inodes thuộc về tập tin, không phải mục nhập thư mục. Nếu một tệp có hai mục nhập thư mục được liên kết với nó, việc xóa một mục sẽ không giải phóng được nút.

Ngoài ra, bạn có thể xóa một mục nhập thư mục, nhưng nếu một quá trình đang chạy vẫn mở tệp, thì nút sẽ không được giải phóng.

Lời khuyên ban đầu của tôi sẽ là xóa tất cả các tệp bạn có thể, sau đó khởi động lại hộp để đảm bảo không có quá trình nào giữ các tệp đang mở.

Nếu bạn làm điều đó và bạn vẫn có một vấn đề, hãy cho chúng tôi biết.

Nhân tiện, nếu bạn đang tìm kiếm các thư mục chứa nhiều tệp, tập lệnh này có thể giúp:

#!/bin/bash
# count_em - count files in all subdirectories under current directory.
echo 'echo $(ls -a "$1" | wc -l) $1' >/tmp/count_em_$$
chmod 700 /tmp/count_em_$$
find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$$ | sort -n
rm -f /tmp/count_em_$$

12
Tất nhiên, ý >/tmp/count_em_$$chí chỉ hoạt động nếu bạn có không gian cho nó ... nếu đó là trường hợp, hãy xem câu trả lời của @ simon.
alxndr

1
@alxndr, đó là lý do tại sao nên tách biệt các hệ thống tệp của bạn - theo cách đó, điền vào một cái gì đó như /tmpsẽ không ảnh hưởng đến các hệ thống tệp khác của bạn.
paxdiablo

Câu trả lời của bạn hoàn toàn phù hợp với "hệ thống sẽ không sử dụng tệp sau khi khởi động lại nếu đã bị xóa". Nhưng câu hỏi được đặt ra là "làm thế nào để lấy lại hoặc sử dụng lại các nút sau khi con trỏ inode bị xóa?". Về cơ bản, kernel linux tạo một inode mới cho một tập tin bất cứ khi nào được tạo và cũng tự động không lấy lại inode bất cứ khi nào bạn xóa một tập tin.
Mohanraj

1
@AshishKarpe, tôi cho rằng bạn đang nói về tình huống của chính mình vì OP không đề cập đến các máy chủ sản xuất. Nếu bạn không thể khởi động lại ngay lập tức thì có hai khả năng. Đầu tiên, hy vọng rằng các quy trình trong chuyến bay cuối cùng sẽ đóng các tệp hiện tại để tài nguyên đĩa có thể được giải phóng. Thứ hai, ngay cả các máy chủ sản xuất cũng nên có phạm vi để khởi động lại vào một lúc nào đó - chỉ cần lên lịch một số thời gian chết theo kế hoạch hoặc chờ cửa sổ tiếp theo của thời gian chết xuất hiện.
paxdiablo

2
Tôi cho rằng bạn muốn ls -Athay vì ls -a. Tại sao bạn muốn đếm. và ..?
jarno

205

Nếu bạn không may mắn, bạn đã sử dụng khoảng 100% tất cả các nút và không thể tạo ra scipt. Bạn có thể kiểm tra điều này với df -ih.

Sau đó, lệnh bash này có thể giúp bạn:

sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

Và vâng, điều này sẽ mất thời gian, nhưng bạn có thể xác định vị trí thư mục có nhiều tệp nhất.


8
đó là mẹo. vấn đề của tôi là có một số lượng phiên đáng kinh ngạc trong thư mục / lib / php / session. có lẽ ai đó có cùng một vấn đề
SteMa

2
Ai đó nên viết lại tìm kiếm này, cắt, sắp xếp uniq thành một lệnh awk duy nhất!
mogsie

5
@alxndr awkcó thể giữ một hàm băm của thư mục và số lượng tệp mà không có uni Khánh và sắp xếp một dòng gazillion. Điều đó nói rằng, có lẽ đây là một cải tiến: find . -maxdepth 1 -type d | grep -v '^\.$' | xargs -n 1 -i{} find {} -xdev -type f | cut -d "/" -f 2 | uniq -c | sort -n- điều này chỉ sắp xếp danh sách cuối cùng.
mogsie

12
Nếu bạn không thể tạo bất kỳ tệp nào, thậm chí điều đó có thể thất bạisortcó thể không giữ mọi thứ trong bộ nhớ và sẽ cố gắng tự động quay lại để viết một tệp tạm thời. Một quá trình rõ ràng sẽ thất bại ...
Mikko Rantalainen

10
sortthất bại cho tôi, nhưng tôi đã có thể đưa ra --buffer-size=10Gcái nào hiệu quả.
Frederick Nord

69

Tình huống của tôi là tôi đã hết mực và tôi đã xóa mọi thứ tôi có thể.

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361     11  100% /

Tôi đang sử dụng Ubuntu 12.04LTS và không thể loại bỏ các nhân linux cũ đã chiếm khoảng 400.000 inode vì apt bị hỏng do thiếu gói. Và tôi không thể cài đặt gói mới vì tôi đã hết inode nên tôi bị kẹt.

Cuối cùng tôi đã xóa một vài nhân linux cũ để giải phóng khoảng 10.000 inodes

$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*

Thế là đủ để tôi cài đặt gói bị thiếu và sửa apt

$ sudo apt-get install linux-headers-3.2.0-76-generic-pae

và sau đó loại bỏ phần còn lại của các nhân linux cũ bằng apt

$ sudo apt-get autoremove

bây giờ mọi thứ đã tốt hơn

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361 434719   54% /

3
Đây là cách gần nhất với cách tiếp cận của riêng tôi trong một tình huống tương tự. Nó đáng chú ý là một cách tiếp cận thận trọng hơn cũng là tài liệu tại help.ubuntu.com/community/Lubuntu/Documentation/...
beldaz

Trường hợp của tôi chính xác! Nhưng phải sử dụng "sudo apt-get autoremove -f" để tiến bộ
Tony Sepia

Có an toàn để làm điều này không : sudo rm -rf /usr/src/linux-headers-3.2.0-2*, nếu tôi chắc chắn rằng tôi không sử dụng kernel đó?
Mars Lee

@MarsLee Bạn có thể kiểm tra kernel nào hiện đang chạy với "uname -a"
Dominique Eav

Gọi $ sudo apt-get autoremovemột mình, đã lừa tôi.
Morten Grum

49

Giải pháp của tôi:

Hãy thử tìm xem đây có phải là sự cố inodes với:

df -ih

Cố gắng tìm các thư mục gốc có số lượng nút lớn:

for i in /*; do echo $i; find $i |wc -l; done

Cố gắng tìm các thư mục cụ thể:

for i in /src/*; do echo $i; find $i |wc -l; done

Nếu đây là tiêu đề linux, hãy thử xóa cũ nhất bằng:

sudo apt-get autoremove linux-headers-3.13.0-24

Cá nhân tôi đã chuyển chúng vào một thư mục được gắn kết (vì đối với tôi lệnh cuối cùng không thành công) và cài đặt mới nhất với:

sudo apt-get autoremove -f

Điều này đã giải quyết vấn đề của tôi.


1
Trong trường hợp của tôi vấn đề là SpamAssasin-Temp. find /var/spool/MailScanner/incoming/SpamAssassin-Temp -mtime +1 -print | xargs rm -fđã làm công việc :) Cảm ơn!
cần điều khiển

4
Đối với tôi, điều này đã mất nhiều giờ. Tuy nhiên, có một giải pháp đơn giản: Khi lệnh thứ hai bị treo trên một thư mục cụ thể, hãy hủy lệnh hiện tại và khởi động lại thay đổi / * đối với bất kỳ thư mục nào mà nó đang treo. Tôi đã có thể đi sâu vào thủ phạm <phút.
Michael Terry

Tôi đã sử dụng biến thể lệnh này của bạn để in các số trên cùng một dòng: for i in /usr/src/*; do echo -en "$i\t"; find $i 2>/dev/null |wc -l; done
cscracker

for i in /src/*; do echo "$i, `find $i |wc -l`"; done|sort -nrk 2|head -10khoe thư mục lớn nhất top 10
Mark Simon

12

Tôi đã có cùng một vấn đề, đã khắc phục nó bằng cách loại bỏ các phiên thư mục của php

rm -rf /var/lib/php/sessions/

Nó có thể ở dưới /var/lib/php5nếu bạn đang sử dụng phiên bản php cũ hơn.

Tái tạo nó với sự cho phép sau

mkdir /var/lib/php/sessions/ && chmod 1733 /var/lib/php/sessions/

Quyền theo mặc định cho thư mục trên Debian hiển thị drwx-wx-wt(1733)


1
Bất cứ ý tưởng tại sao điều này xảy ra?
Sibidharan

1
@Sibidharan trong trường hợp của tôi là vì công việc định kỳ PHP để xóa các phiên PHP cũ không hoạt động.
nghiệt ngã

3
rm -rf /var/lib/php/sessions/*có lẽ sẽ là một lệnh tốt hơn - nó sẽ không xóa thư mục phiên, chỉ là nội dung của nó ... Sau đó, bạn không phải lo lắng về việc tạo lại nó
Shadow

Tôi không có phiên php nhưng vấn đề phiên magento, tương tự như thế này. Cảm ơn đã chỉ đạo.
Mohit

phiên php không nên xóa thông qua công việc cron, bộ session.gc_maxlifetime trong php.ini php.net/manual/en/...

2

Chúng tôi đã trải nghiệm điều này trên tài khoản HostGator (người đặt giới hạn inode cho tất cả lưu trữ của họ) sau một cuộc tấn công spam. Nó để lại số lượng lớn các bản ghi hàng đợi trong /root/.cpanel/comet. Nếu điều này xảy ra và bạn thấy bạn không có inodes miễn phí, bạn có thể chạy tiện ích cpanel này thông qua shell:

/usr/local/cpanel/bin/purge_dead_comet_files

2

Bạn có thể sử dụng RSYNC để XÓA số lượng lớn tệp

rsync -a --delete blanktest/ test/

Tạo thư mục blanktest có 0 tệp trong đó và lệnh sẽ đồng bộ hóa các thư mục thử nghiệm của bạn với số lượng lớn tệp (Tôi đã xóa gần 5 triệu tệp bằng phương pháp này).

Cảm ơn http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux


Từ những gì tôi có thể nói từ bài viết / bình luận, điều này nhanh hơn so rm *với nhiều tệp, do mở rộng ký tự đại diện và chuyển / xử lý từng đối số, nhưng rm test/vẫn tốt để xóa một test/thư mục chứa nhiều tệp.
mwfearnley

Xin vui lòng, điều này hoạt động tốt, nhưng hãy chắc chắn rằng bạn đặt quyền chính xác trên thư mục trống! Tôi đã không làm điều này và vô tình thay đổi các quyền trên thư mục phiên PHP của tôi. Mất hai giờ để tìm ra những gì tôi làm hỏng.
aecend

1

eaccelerator có thể gây ra sự cố vì nó biên dịch PHP thành các khối ... Tôi đã gặp sự cố này với máy chủ Amazon AWS trên một trang web có tải nặng. Giải phóng Inodes bằng cách xóa bộ đệm eaccelerator trong / var / cache / eaccelerator nếu bạn tiếp tục gặp sự cố.

rm -rf /var/cache/eaccelerator/*

(hoặc bất cứ điều gì bộ nhớ cache của bạn)


1

Gần đây chúng tôi đã gặp phải vấn đề tương tự, Trong trường hợp nếu một quá trình đề cập đến một tệp bị xóa, Inode sẽ không được phát hành, vì vậy bạn cần kiểm tra lsof /, và giết / khởi động lại quá trình sẽ giải phóng các nút.

Sửa lỗi cho tôi nếu tôi sai ở đây.


1

Như đã nói trước đây, hệ thống tập tin có thể hết inodes, nếu có rất nhiều tập tin nhỏ. Tôi đã cung cấp một số phương tiện để tìm các thư mục chứa hầu hết các tệp ở đây .


0

Câu trả lời muộn: Trong trường hợp của tôi, đó là tệp phiên của tôi dưới

/var/lib/php/sessions

đó là sử dụng Inodes.
Tôi thậm chí không thể mở crontab của mình hoặc tạo một thư mục mới chứ đừng nói đến việc kích hoạt thao tác xóa. Vì tôi sử dụng PHP, chúng tôi có hướng dẫn này nơi tôi đã sao chép mã từ ví dụ 1 và thiết lập một cronjob để thực thi phần đó của mã.

<?php
// Note: This script should be executed by the same user of web server 
process.

// Need active session to initialize session data storage access.
session_start();

// Executes GC immediately
session_gc();

// Clean up session ID created by session_gc()
session_destroy();
?>

Nếu bạn đang tự hỏi làm thế nào tôi quản lý để mở crontab của mình, thì tốt, tôi đã xóa một số phiên thủ công thông qua CLI.

Hi vọng điêu nay co ich!


0

bạn có thể thấy thông tin này

for i in /var/run/*;do echo -n "$i "; find $i| wc -l;done | column -t

-2

Nhiều câu trả lời cho điều này cho đến nay và tất cả những điều trên có vẻ cụ thể. Tôi nghĩ bạn sẽ an toàn khi sử dụng statkhi bạn đi cùng, nhưng tùy theo hệ điều hành, bạn có thể gặp một số lỗi inode leo lên bạn. Vì vậy, việc thực hiện statchức năng gọi của riêng bạn bằng cách sử dụng 64bitđể tránh mọi sự cố tràn có vẻ tương thích.


chúng tôi thích các ví dụ ở đây;)
Bohne

-3

Nếu bạn sử dụng docker, loại bỏ tất cả các hình ảnh. Họ đã sử dụng nhiều không gian ....

Dừng tất cả các container

docker stop $(docker ps -a -q)

Xóa tất cả các container

docker rm $(docker ps -a -q)

Xóa tất cả hình ảnh

docker rmi $(docker images -q)

Làm việc với tôi


Điều này không giúp phát hiện nếu "quá nhiều nút" là vấn đề.
Mark Stosberg

Điều này không có gì để làm với Docker.
Urda
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.