Tìm nơi inodes đang được sử dụng


189

Vì vậy, tôi đã nhận được một cảnh báo từ hệ thống giám sát của chúng tôi trên một trong các hộp của chúng tôi rằng số lượng inodes miễn phí trên một hệ thống tập tin đang giảm dần.

df -i đầu ra cho thấy điều này:

Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/xvda1       524288 422613   101675   81% /

Như bạn có thể thấy, phân vùng gốc có 81% số nút được sử dụng.
Tôi nghi ngờ tất cả chúng đang được sử dụng trong một thư mục. Nhưng làm thế nào tôi có thể tìm thấy nó ở đâu?

Câu trả lời:


214

Tôi đã thấy câu hỏi này trên stackoverflow, nhưng tôi không thích bất kỳ câu trả lời nào, và đó thực sự là một câu hỏi nên có ở đây trên U & L.

Về cơ bản, một nút được sử dụng cho mỗi tệp trên hệ thống tệp. Vì vậy, việc hết các nút thường có nghĩa là bạn có rất nhiều tệp nhỏ được đặt xung quanh. Vì vậy, câu hỏi thực sự trở thành, "thư mục nào có số lượng lớn tệp trong đó?"

Trong trường hợp này, hệ thống tệp mà chúng tôi quan tâm là hệ thống tệp gốc /, vì vậy chúng tôi có thể sử dụng lệnh sau:

find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

Điều này sẽ kết xuất một danh sách của mỗi thư mục trên hệ thống tập tin có tiền tố với số lượng tệp (và thư mục con) trong thư mục đó. Do đó, thư mục có số lượng tệp lớn nhất sẽ ở dưới cùng.

Trong trường hợp của tôi, điều này bật lên như sau:

   1202 /usr/share/man/man1
   2714 /usr/share/man/man3
   2826 /var/lib/dpkg/info
 306588 /var/spool/postfix/maildrop

Vì vậy, về cơ bản /var/spool/postfix/maildroplà tiêu thụ tất cả các nút.

Lưu ý, câu trả lời này có ba thông báo mà tôi có thể nghĩ ra. Nó không xử lý đúng cách bất cứ điều gì với dòng mới trong đường dẫn. Tôi biết hệ thống tập tin của tôi không có tập tin với dòng mới và vì nó chỉ được sử dụng cho con người, nên vấn đề tiềm ẩn không đáng để giải quyết (và người ta luôn có thể thay thế \nbằng \0và sử dụng sort -zở trên). Nó cũng không xử lý nếu các tập tin được trải ra giữa một số lượng lớn các thư mục. Điều này không có khả năng mặc dù, vì vậy tôi xem xét rủi ro chấp nhận được. Nó cũng sẽ đếm các liên kết cứng đến cùng một tệp (vì vậy chỉ sử dụng một nút) nhiều lần. Một lần nữa, không có khả năng đưa ra dương tính giả


Lý do chính tôi không thích bất kỳ câu trả lời nào trong câu trả lời stackoverflow là tất cả chúng đều có ranh giới hệ thống tập tin chéo. Vì vấn đề của tôi là về hệ thống tập tin gốc, điều này có nghĩa là nó sẽ đi qua mọi hệ thống tập tin được gắn kết duy nhất. Ném -xdevvào các lệnh tìm thậm chí sẽ không hoạt động đúng.
Ví dụ: câu trả lời được đánh giá cao nhất là câu trả lời này:

for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

Nếu chúng ta thay đổi điều này thay vì

for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

mặc dù /mnt/foolà một mount, nó cũng là một thư mục trên hệ thống tập tin gốc, vì vậy nó sẽ xuất hiện find . -mount -type d, và sau đó nó sẽ được chuyển đến ls -a $i, nó sẽ đi sâu vào mount.

Thay findvào đó, trong câu trả lời của tôi liệt kê thư mục của mỗi tệp trên mount. Về cơ bản với cấu trúc tệp như:

/foo/bar
/foo/baz
/pop/tart

chúng tôi kết thúc với

/foo
/foo
/pop

Vì vậy, chúng ta chỉ cần đếm số lượng dòng trùng lặp.


2
@MohsenPahlevanzadeh đó không phải là một phần câu trả lời của tôi, tôi đã bình luận về lý do tại sao tôi không thích giải pháp vì đây là câu trả lời chung cho câu hỏi này.
Patrick

7
Sử dụng liên kết gắn kết là một cách mạnh mẽ hơn để tránh tìm kiếm các hệ thống tệp khác vì nó cho phép truy cập vào các tệp dưới các điểm gắn kết. Ví dụ, hãy tưởng tượng tôi tạo 300.000 tệp bên dưới /tmpvà sau đó hệ thống được cấu hình để gắn tmpfs /tmp. Sau đó, bạn sẽ không thể tìm thấy các tập tin findmột mình. Senario không có khả năng, nhưng đáng chú ý.
Graeme

2
Cả hai công việc chỉ phải loại bỏ sắp xếp vì sắp xếp cần tạo một tệp khi đầu ra đủ lớn, điều đó là không thể vì tôi đã sử dụng 100% các nút.
qwertzguy

1
Lưu ý rằng -printfdường như là một phần mở rộng GNU cần tìm, vì phiên bản BSD có sẵn trong OS X không hỗ trợ nó.
Xiong Chiamiov

1
Giả định rằng tất cả các tệp nằm trong một thư mục là một điều khó khăn. Rất nhiều chương trình biết rằng nhiều tệp trong một thư mục có hiệu năng kém và do đó băm một hoặc hai cấp thư mục
PlasmaHH

26

Điều này được đăng lại từ đây theo lệnh của người hỏi:

du --inodes -S | sort -rh | sed -n \
        '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'

Và nếu bạn muốn ở trong cùng một hệ thống tập tin bạn làm:

du --inodes -xS

Dưới đây là một số ví dụ đầu ra:

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
...
519     /usr/lib/python2.7/site-packages/bzrlib
516     /usr/include/KDE
498     /usr/include/qt/QtCore
487     /usr/lib/modules/3.13.6-2-MANJARO/build/include/config
484     /usr/src/linux-3.12.14-2-MANJARO/include/config

BÂY GIỜ VỚI LS:

Một số người đề cập rằng họ không có coreutils cập nhật và tùy chọn --inodes không có sẵn cho họ. Vì vậy, đây là ls:

ls ~/test -AiR1U | 
sed -rn '/^[./]/{h;n;};G;
    s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' | 
sort -t : -uk1.1,1n |
cut -d: -f2 | sort -V |
uniq -c |sort -rn | head -n10

Nếu bạn tò mò, trái tim và linh hồn của thứ tẻ nhạt regexđó sẽ thay thế filenametrong mỗi ls'skết quả tìm kiếm đệ quy bằng tên thư mục mà nó được tìm thấy. Từ đó, chỉ cần nén các số inode lặp đi lặp lại sau đó đếm các tên thư mục lặp lại và sắp xếp tương ứng.

Các -Utùy chọn này đặc biệt hữu ích với những sắp xếp ở chỗ nó đặc biệt nào không sắp xếp, và thay vào đó trình bày các danh sách thư mục theo thứ tự ban đầu - hoặc, nói cách khác, bằng inodesố.

Và tất nhiên -1là vô cùng hữu ích ở chỗ nó đảm bảo một kết quả duy nhất cho mỗi dòng, bất kể có thể bao gồm các dòng mới trong tên tệp hoặc các vấn đề đáng tiếc ngoạn mục khác có thể xảy ra khi bạn cố gắng phân tích danh sách.

Và tất nhiên -Acho tất cả và -icho inode và -Rcho đệ quy và đó là dài và ngắn của nó.

Phương pháp cơ bản cho vấn đề này là tôi thay thế mỗi tên tệp của ls bằng tên thư mục chứa trong sed. Tiếp theo đó ... Chà, bản thân tôi hơi mờ nhạt. Tôi khá chắc chắn rằng nó đếm chính xác các tệp, như bạn có thể thấy ở đây:

% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
>   2 /home/mikeserv/test
>   1 /home/mikeserv/test/linkdir

Điều này cung cấp cho tôi khá nhiều kết quả giống hệt với dulệnh:

DU:

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
1.9K    /usr/share/fonts/100dpi
1.9K    /usr/share/doc/arch-wiki-markdown
1.6K    /usr/share/fonts/TTF
1.6K    /usr/share/dolphin-emu/sys/GameSettings
1.6K    /usr/share/doc/efl/html

LS:

14686   /usr/share/man/man3:
4322    /usr/lib:
3653    /usr/bin:
2457    /usr/share/man/man1:
1897    /usr/share/fonts/100dpi:
1897    /usr/share/fonts/75dpi:
1890    /usr/share/doc/arch-wiki-markdown:
1613    /usr/include:
1575    /usr/share/doc/efl/html:
1556    /usr/share/dolphin-emu/sys/GameSettings:

Tôi nghĩ rằng includeđiều này chỉ phụ thuộc vào thư mục mà chương trình nhìn vào đầu tiên - bởi vì chúng là các tệp giống nhau và được liên kết cứng. Kinda như điều trên. Tôi có thể sai về điều đó mặc dù - và tôi hoan nghênh sự điều chỉnh ...

DU DEMO

% du --version
> du (GNU coreutils) 8.22

Tạo một thư mục thử nghiệm:

% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1       .

Một số thư mục trẻ em:

% mkdir ./realdir ./linkdir
% du --inodes -S
> 1       ./realdir
> 1       ./linkdir
> 1       .

Tạo một số tệp:

% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

Một số liên kết cứng:

% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` | 
    . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

Nhìn vào các liên kết cứng:

% cd ./linkdir
% du --inodes -S
> 101

% cd ../realdir
% du --inodes -S
> 101

Họ được tính một mình, nhưng đi lên một thư mục ...

% cd ..
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

Sau đó, tôi chạy tập lệnh đã chạy của tôi từ bên dưới và:

> 100     /home/mikeserv/test/realdir
> 100     /home/mikeserv/test/linkdir
> 2       /home/mikeserv/test

Và Graeme:

> 101 ./realdir
> 101 ./linkdir
> 3 ./

Vì vậy, tôi nghĩ rằng điều này cho thấy cách duy nhất để đếm inodes là inode. Và bởi vì đếm các tệp có nghĩa là đếm các nút, bạn không thể đếm gấp đôi các nút - để đếm các tệp chính xác, các nút không thể được đếm nhiều lần.


2
Phiên bản nào được thêm vào --inodes? "biến thể" / "hương vị" / "posix-wannabes" / "triển khai" / cái gì có?
n611x007

Ubuntu 14.04.5: du: tùy chọn không được nhận dạng '--inodes'
Putnik

du (GNU coreutils) 8.23 ​​từ năm 2014 có nó (nó nằm trong Debian Jessie đã lỗi thời của tôi). Debian> Ubuntu xin lỗi vì cách chơi chữ đó: P Ubuntu có các gói quá cũ ...
Daniel W.

6

Tôi đã sử dụng câu trả lời này từ SO Q & A có tiêu đề: Tất cả các nút của tôi đang được sử dụng ở đâu? khi NAS của chúng tôi hết khoảng 2 năm trước:

$ find . -type d -print0 \
    | while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
    | sort -n

Thí dụ

$ find . -type d -print0 \
    | while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
    | sort -n
...
110 ./MISC/nodejs/node-v0.8.12/out/Release/obj.target/v8_base/deps/v8/src
120 ./MISC/nodejs/node-v0.8.12/doc/api
123 ./apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios
208 ./MISC/nodejs/node-v0.8.12/deps/openssl/openssl/doc/crypto
328 ./MISC/nodejs/node-v0.8.12/deps/v8/src
453 ./MISC/nodejs/node-v0.8.12/test/simple

Kiểm tra các nút của thiết bị

Tùy thuộc vào NAS của bạn, nó có thể không cung cấp một dflệnh đầy đủ tính năng . Vì vậy, trong những trường hợp này, bạn có thể sử dụng tune2fsthay thế:

$ sudo tune2fs -l /dev/sda1 |grep -i inode
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Inode count:              128016
Free inodes:              127696
Inodes per group:         2032
Inode blocks per group:   254
First inode:              11
Inode size:           128
Journal inode:            8
Journal backup:           inode blocks

Vượt qua ranh giới hệ thống tập tin

Bạn có thể sử dụng công -xdevtắc để chỉ đạo findthu hẹp tìm kiếm chỉ vào thiết bị nơi bạn bắt đầu tìm kiếm.

Thí dụ

Giả sử tôi có /homethư mục tự động đếm qua cổ phiếu NFS từ NAS của tôi, tên là mulder.

$ df -h /home/sam 
Filesystem            Size  Used Avail Use% Mounted on
mulder:/export/raid1/home/sam
                      917G  572G  299G  66% /home/sam

Lưu ý rằng điểm gắn kết vẫn được coi là cục bộ đối với hệ thống.

$ df -h /home/ .
Filesystem            Size  Used Avail Use% Mounted on
-                        0     0     0   -  /home
/dev/mapper/VolGroup00-LogVol00
                      222G  159G   52G  76% /

Bây giờ khi tôi bắt đầu find:

$ find / -xdev  | grep '^/home'
/home

Nó tìm thấy /homenhưng không có nội dung tự động nào vì chúng nằm trên một thiết bị khác!

Các loại hệ thống tập tin

Bạn có thể sử dụng chuyển đổi sang find, -fstypeđể kiểm soát loại hệ thống tập tin nào findsẽ xem xét.

   -fstype type
          File is on a filesystem of type type.  The valid filesystem types 
          vary among different versions of Unix; an incomplete list of 
          filesystem  types that are accepted on some version of Unix or 
          another is: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K.  You can use 
          -printf with the %F directive to see the types of your
          filesystems.

Thí dụ

Tôi có hệ thống tập tin nào?

$ find . -printf "%F\n" | sort -u
ext3

Vì vậy, bạn có thể sử dụng điều này để kiểm soát việc vượt qua:

chỉ ext3

$ find . -fstype ext3 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt

chỉ nfs

$ find . -fstype nfs | head -5
$ 

ext3 & ext4

$ find . -fstype ext3 -o -fstype ext4 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt

Điều gì sẽ là giải pháp của bạn để ngăn chặn nó vượt qua ranh giới hệ thống tập tin? Giống như nếu /có đầy đủ và bạn có hệ thống tệp mạng được gắn kết, bạn không muốn đi sâu vào hệ thống tệp mạng.
Patrick

@Patrick - xem các cập nhật, bạn có thể kiểm soát nó bằng cách sử -fstypeđể find.
slm

1
@Gilles - câu trả lời đơn giản ... đã không tìm thấy trang nào trong trang tìm kiếm của người đàn ông 8-)
slm

@Gilles - trang man dường như không chỉ ra rằng -xtypeloại trừ các hệ thống tệp, nó trông giống như loại tệp. Tôi chỉ tìm thấy những ví dụ như thế này:find . \( -fstype nfs -prune \)
slm

@Gilles - Tôi đã giải quyết Q của Patrick trong các bình luận về cách tránh findvượt qua ranh giới hệ thống tập tin. Trong người yêu cũ. ông đề cập "Giống như nếu / là những gì đầy đủ và bạn có hệ thống tệp mạng được gắn kết, bạn không muốn đi sâu vào hệ thống tệp mạng".
slm

4

Lệnh tìm inode được sử dụng:

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

3

Để liệt kê việc sử dụng inode chi tiết cho /, sử dụng lệnh sau:

echo "Detailed Inode usage for: $(pwd)" ; for d in `find -maxdepth 1 -type d |cut -d\/ -f2 |grep -xv . |sort`; do c=$(find $d |wc -l) ; printf "$c\t\t- $d\n" ; done ; printf "Total: \t\t$(find $(pwd) | wc -l)\n" 

Chào mừng tới đây! Tôi đề nghị, lần sau định dạng tốt hơn, xin vui lòng.
peterh

1
Đó là một oneliner, tôi không thấy có gì sai với điều đó.
sjas

2

Câu trả lời chắc chắn với tối đa trợ giúp giúp hiểu khái niệm về các nút trong linux và unix tuy nhiên nó không thực sự hữu ích khi giải quyết vấn đề thực tế là xóa hoặc xóa các nút khỏi đĩa. Một cách đơn giản hơn để làm điều này trên các hệ thống dựa trên Ubuntu là loại bỏ các tiêu đề và hình ảnh hạt nhân linux không mong muốn.

sudo apt-get autoremove

Sẽ làm điều đó cho bạn. Trong trường hợp của tôi, việc sử dụng inodes là 78% do tôi nhận được cảnh báo.

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 407957 116331   78% /
none           957443      2 957441    1% /sys/fs/cgroup
udev           956205    388 955817    1% /dev
tmpfs          957443    320 957123    1% /run
none           957443      1 957442    1% /run/lock
none           957443      1 957442    1% /run/shm
none           957443      5 957438    1% /run/user

Sau khi chạy sudo apt-get autoremovelệnh, nó đã giảm xuống 29%

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 150472 373816   29% /
none           957443      2 957441    1% /sys/fs/cgroup
udev           956205    388 955817    1% /dev
tmpfs          957443    320 957123    1% /run
none           957443      1 957442    1% /run/lock
none           957443      1 957442    1% /run/shm
none           957443      5 957438    1% /run/user

Đây chỉ là quan sát của tôi đã tiết kiệm thời gian của tôi. Mọi người có thể tìm thấy một số giải pháp tốt hơn thế này.


2

Tôi thấy việc truy vấn nhanh hơn và dễ dàng hơn bằng cách sử dụng lệnh sau:

$ sudo du -s --inodes * | sort -rn

170202  var
157325  opt
103134  usr
53383   tmp
<snip>

Sau đó, bạn có thể đi vào varví dụ và xem những gì các nút lớn sử dụng các thư mục trong đó.


0

Mọi câu trả lời cho đến nay đều giả sử vấn đề là với nhiều tệp trong một thư mục, thay vì nhiều thư mục con đều góp phần gây ra vấn đề. May mắn là giải pháp đơn giản là sử dụng ít cờ hơn.

# du --inodes --one-file-system /var | sort --numeric-sort
...
2265    /var/cache/salt/minion
3818    /var/lib/dpkg/info
3910    /var/lib/dpkg
4000    /var/cache/salt/master/gitfs/refs
4489    /var/lib
5709    /var/cache/salt/master/gitfs/hash
12954   /var/cache/salt/master/gitfs
225058  /var/cache/salt/master/jobs
241678  /var/cache/salt/master
243944  /var/cache/salt
244078  /var/cache
248949  /var

Hoặc với các tùy chọn ngắn hơn : du --inodes -x | sort -n. Thật không may, không phải tất cả các phiên bản duđều có tùy chọn inodes.

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.