Làm cách nào tôi có thể tăng số lượng nút trong hệ thống tệp ext4?


61

Tôi đã có một vấn đề (mới đối với tôi) tuần trước. Tôi có một hệ thống tập tin ext4 (Fedora 15). Ứng dụng chạy trên máy chủ đột nhiên dừng lại. Tôi không thể tìm thấy vấn đề ngay từ cái nhìn đầu tiên.

dfcho thấy 50% không gian có sẵn. Sau khi tìm kiếm khoảng một giờ, tôi thấy một bài đăng trên diễn đàn nơi anh chàng sử dụng df -i. Các tùy chọn tìm kiếm sử dụng inodes. Hệ thống đã hết hạn, một vấn đề đơn giản mà tôi không nhận ra. Phân vùng chỉ có 3,2M inodes.

Bây giờ, câu hỏi của tôi là: Tôi có thể làm cho hệ thống có nhiều nút hơn không? Có nên / có thể thiết lập khi định dạng đĩa không? Với các nút 3,2M, tôi có thể có bao nhiêu tệp?


1
Mỗi tập tin hoặc thư mục sử dụng một inode. Một liên kết cứng đến một tập tin không tạo ra một nút. vi.wikipedia.org/wiki/Inode
Paul Tomblin

Câu trả lời:


33

Có vẻ như bạn có nhiều tệp hơn mong đợi bình thường.

Tôi không biết có giải pháp nào để thay đổi kích thước bảng inode một cách linh hoạt hay không. Tôi sợ rằng bạn cần sao lưu dữ liệu của mình và tạo hệ thống tệp mới và khôi phục dữ liệu của mình.

Để tạo hệ thống tệp mới với bảng inode lớn như vậy, bạn cần sử dụng tùy chọn '-N' của mke2fs (8).

Trước tiên, tôi khuyên bạn nên sử dụng tùy chọn '-n' (không tạo fs, nhưng hiển thị thông tin sử dụng) để bạn có thể nhận được số lượng nút ước tính. Sau đó, nếu bạn cần, hãy sử dụng '-N' để tạo hệ thống tệp của bạn với một số inode cụ thể.


11
Bạn có thể sử dụng mke2fs -iđể chỉ định số lượng nút. Tài liệu của nó chỉ ra rằng, không thể mở rộng số lượng nút trên một hệ thống tập tin sau khi nó được tạo ra.
Gilles 'SO- ngừng trở nên xấu xa'

2
@piovisqui: mỗi tệp tiêu thụ trên inode, là một con trỏ trong hệ thống tệp. nếu tệp là một liên kết cứng đến một tệp khác thì nó có cùng một nút.
Hanan N.

6
@Gilles Các -itùy chọn chỉ định kích thước của nút, chứ không phải có bao nhiêu. Các -Ntùy chọn thiết lập inodes số.
theillien

1
Mối quan hệ giữa số lượng nút và số tệp không nhất thiết là 1: 1. Nút đầu tiên chứa danh sách các con trỏ tới các khối nơi tệp được lưu trữ. Nếu danh sách các khối không thể vừa trong một nút, thì nút đó chứa danh sách các con trỏ tới các nút liệt kê các khối nơi tệp được lưu trữ. Nếu nó không phù hợp ở đó thì nó sẽ đi sâu vào 3 bộ nút cho danh sách các khối đó, v.v.
StuWhitby

2
@StuWhitby Điều đó không hoàn toàn đúng. Một inode đơn có một vài con trỏ trực tiếp và một con trỏ gián tiếp đơn, đôi và ba. Nếu danh sách các khối không khớp với các con trỏ trực tiếp, thì con trỏ gián tiếp duy nhất sẽ trỏ đến một khối dữ liệu (KHÔNG phải là một nút khác) có chứa nhiều con trỏ hơn. Nếu cần nhiều con trỏ hơn mức đó, con trỏ gián tiếp kép trỏ vào một khối chứa con trỏ gián tiếp duy nhất và bộ ba gián tiếp tại một khối có con trỏ gián tiếp kép. Vì vậy, trên thực tế, một tập tin chỉ sử dụng một nút, bất kể kích thước.
dùng125355

11

Như một cách giải quyết khác, tôi có thể đề nghị xem xét việc đóng gói các bộ sưu tập tệp khổng lồ vào một tarkho lưu trữ không nén (!) , Và sau đó sử dụng archivemountđể gắn kết nó như một hệ thống tệp. Một kho lưu trữ tar tốt hơn để chia sẻ so với hình ảnh hệ thống tập tin và cung cấp hiệu suất tương tự khi sao lưu lên đám mây hoặc bộ lưu trữ khác.


Nếu bộ sưu tập được coi là chỉ đọc, squashfscó thể là một tùy chọn, nhưng nó yêu cầu một số tùy chọn nhất định được kích hoạt trong kernel và xznén có sẵn cho tar cũng với hiệu suất tương tự.


2
Đề nghị tốt đẹp.
piovisqui

11

Với 3,2 triệu inode, bạn có thể có tổng số 3,2 triệu tệp và thư mục (nhưng nhiều liên kết cứng đến một tệp chỉ sử dụng một nút).

Có, nó có thể được đặt khi tạo một hệ thống tập tin trên phân vùng. Các tùy chọn -T usage-type, -N number-of-inodeshoặc -i bytes-per-inodetất cả có thể đặt số lượng nút. Tôi thường sử dụng -i, sau khi so sánh đầu ra của du -sfind | wc -lcho một tập hợp các tệp tương tự và cho phép một số chùng.

Không, nó không thể được thay đổi tại chỗ trên một hệ thống tập tin hiện có. Tuy nhiên:

  • Nếu bạn đang chạy LVM hoặc hệ thống tệp nằm trên LUN của SAN (trực tiếp trên LUN hoặc là phân vùng cuối cùng trên LUN) hoặc bạn có không gian trống trên đĩa sau phân vùng, bạn có thể phát triển phân vùng và sau đó sử dụng resize2fsđể mở rộng hệ thống tập tin. Điều này thêm nhiều nút theo tỷ lệ với không gian được thêm vào, đại khái. Nếu bạn muốn tránh hết inodes trước khi không gian giả sử rằng các tệp trong tương lai trung bình có cùng kích thước, hãy đặt tỷ lệ phần trăm khối dành riêng đủ cao bằng cách sử dụng tune2fs -m.
  • Nếu bạn có đủ dung lượng và có thể đưa hệ thống tệp ngoại tuyến, sau đó đưa ngoại tuyến, tạo một hệ thống tệp mới có nhiều nút hơn và sao chép tất cả các tệp qua.
  • Nếu chỉ một tập hợp con của các tệp đang sử dụng nhiều nút và bạn có đủ không gian trống, hãy tạo một hệ thống tệp trên thiết bị lặp được hỗ trợ bởi một tệp trên hệ thống tệp, tạo một hệ thống tệp có nhiều nút hơn (và có thể cả các khối nhỏ hơn) trên đó, và di chuyển các thư mục vi phạm vào nó. Đó có thể là một hit hiệu suất và một rắc rối bảo trì, nhưng nó là một thay thế.
  • Và tất nhiên, nếu bạn có thể xóa rất nhiều tập tin không cần thiết, điều đó cũng có ích.

6

Tôi có một giải pháp thay thế cho tình huống này. Hãy nói rằng bạn có 1000 nút trong phân vùng 10G. Nhưng do giới hạn inodes, bạn không thể sử dụng tất cả không gian của phân vùng . Nhưng trong các giải pháp này, bạn sẽ có thể sử dụng không gian còn lại của phân vùng mà không cần định dạng nó.

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

để gắn vĩnh viễn

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
Chào mừng bạn đến với U & L. Tôi đã tự do định dạng lại câu trả lời của bạn cho cách trình bày mã thông thường hơn ở đây, chèn một dấu nhắc ( $) để phân biệt rõ ràng giữa các lệnh và đầu ra (nếu chúng chỉ là lệnh, thì dấu nhắc thường bị bỏ qua). Tôi cũng đã thay đổi CHIA SẺ trong phần nhấn mạnh pha đậm, đó là những gì tôi nghĩ bạn dự định. Bạn có thể khôi phục các thay đổi nếu tôi trình bày sai những điều
Anthon

Tôi nghĩ giải pháp này có logic, nhưng bạn cần quản lý kích thước khi chạy dd.
piovisqui

3
Các chi tiết sai, bạn cần sử dụng một thiết bị lặp và thậm chí có thể kết hợp tùy thuộc vào ứng dụng, nhưng đây là giải pháp duy nhất tránh định dạng và khôi phục từ bản sao lưu, không có gì thú vị khi vội vàng với hàng triệu tệp. Có những trường hợp mà điều này có thể tiết kiệm trong ngày!
medoc 29/07/2015

6

Gần đây gặp vấn đề này khi sử dụng nâng cấp apt hoặc apt.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Lệnh đã ban hành:

du /|sort -k1 -n

Tiết lộ hầu hết các tệp nằm trong các thư mục con cho một số phiên bản kernel trong:

/usr/src/linux-headers

Đã xóa những thư mục con và vấn đề inode đã được sửa.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

"du / | sort -k1 -n" có hiển thị các nút không?
Trẻ mồ côi

Không. Đó là sắp xếp các thư mục, hiển thị những thư mục nào có nhiều tệp nhất trong đó, các thư mục tiêu tốn nhiều inode nhưng sử dụng ít dung lượng thực tế hơn: tình trạng không gian đĩa trống 30% nhưng sử dụng 100% inode được hiển thị ở trên.
kph0x1

Tôi thực sự không hiểu làm thế nào "du" hiển thị có bao nhiêu tệp với bất kỳ cờ nào? Bạn có thể vui lòng giải thích chi tiết hơn?
Trẻ mồ côi

Không có cờ cho dulệnh. Cách sử dụng là dành cho thư mục gốc của hệ thống tệp trong ví dụ trên, chỉ nhìn vào không gian. Đầu ra được sắp xếp theo thứ tự để hiển thị thư mục nào chứa nhiều tệp nhất. Không có số lượng được thực hiện trong ví dụ trên cho các tệp, phần 'bao nhiêu tệp' trong câu hỏi của bạn. duMặc dù vậy, các nguồn nguồn hạt nhân là thủ phạm được hiển thị trong đầu ra; ví dụ: nhiều tệp nhỏ, thư mục con từ các phần tổng hợp trong quá khứ, điều rất lý tưởng phù hợp để xóa để giải phóng các nút. Vẫn còn một hướng dẫn, đánh giá của con người về duđầu ra, /usr/src/linux-headerssau đó là rõ ràng.
kph0x1

1
du hiển thị CHỈ byte - không phải tệp. Và bạn đang chuyển ra ngoài chỉ từ lệnh du thành sắp xếp. Vậy làm thế nào để sắp xếp -k1 -n sắp xếp đầu ra theo cách bạn đề xuất? Điều duy nhất tôi có thể thấy là "du / | sort -k1 -n" chỉ sắp xếp mỗi hàng dựa trên kích thước tính theo byte. Không có gì khác
Trẻ mồ côi

2

thử du -s --inodes * 2>/dev/null |sort -gcd vào thư mục cuối cùng trong đầu ra và lặp lại.

Tiết lộ đầy đủ: không phải tất cả --inodescờ hỗ trợ của hệ điều hành cho lệnh du (hệ điều hành Mac của tôi không) nhưng nhiều hệ điều hành Linux thì có.

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.