Tại sao nhân Linux lại báo cáo ra khỏi không gian đĩa, trong khi thực tế, nó nằm ngoài các nút i


10

Một người bạn của tôi, người thích lập trình trong môi trường Linux, nhưng không biết nhiều về quản trị Linux gần đây đã gặp phải một vấn đề trong đó hệ điều hành (Ubuntu) của anh ấy đã báo cáo "hết dung lượng đĩa trên ổ đĩa XXX". Nhưng khi anh đi kiểm tra âm lượng, vẫn còn 700 GB. Sau nhiều thời gian lãng phí, cuối cùng anh ta đã có thể nhận ra rằng mình đã hết mực. (Anh ấy đã lưu trữ rất nhiều bản cập nhật gia tăng nhỏ từ một hệ thống dự phòng trên tập này và ghi lại tất cả các nút của anh ấy.)

Anh ấy hỏi tôi tại sao nhân Linux báo cáo thông báo lỗi ("hết dung lượng đĩa") thay vì báo cáo đúng ("hết inodes"). Tôi không biết, vì vậy tôi đoán tôi sẽ hỏi StackExchange.

Co ai biêt tại sao điêu nay xảy ra? và tại sao nó đã không được sửa chữa sau nhiều năm? (Tôi nhớ một người bạn khác nói với tôi về vấn đề này vào năm 1995.)

Câu trả lời:


18

Một số lỗi duy nhất ENOSPC, được sử dụng để báo cáo cả hai tình huống, do đó có cùng một thông báo lỗi.

Để tuân thủ các tiêu chuẩn ISO CPOSIX, các nhà phát triển kernel không có lựa chọn nào khác ngoài việc sử dụng một số lỗi duy nhất cho cả hai sự kiện. Thêm một số lỗi mới sẽ phá vỡ các chương trình hiện có.

Tuy nhiên, vì việc dính vào các thông báo lỗi truyền thống không phải là bắt buộc của AFAIK, không có gì nên cấm nhà phát triển làm cho thông báo đơn rõ ràng hơn, ví dụ như out of disk/inode space

Về mặt kỹ thuật, cho dù việc ra khỏi không gian inode hay ngoài không gian dữ liệu là như nhau, điều đó có nghĩa là không có đủ không gian đĩa trống để cuộc gọi hệ thống thành công.

Tôi đoán bạn sẽ không phàn nàn nếu đĩa của bạn được báo cáo là đầy đủ trong khi vẫn còn các khe cắm inodes miễn phí.

Lưu ý rằng các hệ thống tập tin thích JFS, XFS, ZFSbtrfsphân bổ inodes động cũng vậy không có triển lãm vấn đề này nữa.


Hệ thống tập tin gần đây bao gồm ext4?
Camilo Martin

@CamiloMartin Tôi không nghĩ thế.
jlliagre

@CamiloMartin Thật không may, không ext4phân bổ các nút tại thời điểm tạo fs như ext2 / 3 và không thể sửa đổi sau này.
Matt

@mindthemonkey Chết tiệt! Đó có lẽ là một số điều tương thích ngược, tôi đoán. Hệ thống tập tin nào khác có các tính năng hay nhưng đủ ổn định (btrfs có ổn định không)? ext4 dường như là một loại "lựa chọn mặc định" (ít nhất là từ quan điểm người mới của tôi).
Camilo Martin

1
Yeah ext luôn là phần mở rộng của phiên bản trước và tương thích ngược nên không có thay đổi lớn nhưng điều đó có nghĩa là nó vẫn khá chắc chắn và ổn định. Cá nhân tôi thực hiện tất cả lưu trữ khối lượng lớn của mình trên các hộp freebsd với ZFS. BTRFS vẫn được coi là "không ổn định", mặc dù hầu hết các bản phân phối ít nhất sẽ cho phép bạn sử dụng nó.
Matt

2

Tôi giả sử bạn của bạn đang sử dụng một ext fs, bởi vì một trong số ít fs hợp lý có thể hết inodes.

Nó sẽ xuất hiện bạn của bạn hoặc nghịch với hệ thống tập tin của anh ấy và phá vỡ nó hoặc có khối lượng lớn một cách kỳ cục của một vài TB. Inodes không phải là một thứ sử dụng một lần và vứt đi. Nếu anh ta thực sự hết inodes, điều đó có nghĩa là anh ta có rất nhiều tập tin và thư mục ... điều đó có thể xảy ra với dung lượng> 4TB (phỏng đoán có giáo dục), trong đó "chỉ" 700GB là miễn phí. Đối với họ ext của fs, số lượng inodes được xác định khi fs được tạo. Từ mkfs.ext4trang người đàn ông:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Để rút ngắn phần còn lại của câu trả lời này: Điều này có nghĩa mkfslà được cung cấp với tỷ lệ như vậy, hoặc nó sẽ giả sử một tỷ lệ. Nếu bạn của bạn sử dụng fs khác với giả định, tỷ lệ đã chọn có thể sai đối với trường hợp sử dụng của anh ta và anh ta bị lỗi đó ... lấp đầy một khối lượng nhiều TB với hàng tấn tệp nhỏ có thể được tính như vậy.

Bạn của bạn có sử dụng một số môi trường máy tính để bàn thực hiện khái niệm "thùng rác" cho các tệp hoặc bất kỳ hình thức sao lưu nào khác có thể tạo ra số lượng lớn tệp không? Có lẽ anh ta có thể khắc phục vấn đề của mình bằng cách loại bỏ các tệp không cần thiết.

Tôi nhớ vấn đề này với ext2 từ khi kernel 2.4 còn khá mới. Theo nguyên tắc thông thường, tôi luôn sử dụng XFS cho các tập rất lớn so với những gì hiện đang phổ biến. Hiện tại tôi gọi mọi thứ từ 250GB đến 1TB chung cho một ổ đĩa và chúng tôi có thể mua ổ cứng 4TB. Vì vậy, đối với mọi thứ> 3TB, tôi muốn sử dụng XFS hơn là ext. Chỉ là một quy tắc của ngón tay cái, nhưng đã không hết mực trong một thời gian dài ...


1
Tôi sợ bạn không trả lời câu hỏi.
jlliagre

Thật. Tôi đã cố gắng trả lời câu hỏi nội tuyến đầu tiên tôi nhấn "Có ai biết tại sao điều này xảy ra không?", Nhưng không phải là câu hỏi trong tiêu đề.
Bananguin

Đúng. Bạn tôi biết chuyện gì đã xảy ra. Anh ta đang thực hiện một số loại hệ thống sao lưu, nơi nó đang lưu trữ các thay đổi gia tăng Không nén (cũng không phải TAR) để có tất cả các tệp nhỏ này chiếm dung lượng. Tôi không nghĩ rằng anh ta đã từng có một FS lớn như vậy trước đây, vì vậy việc hết mực là một điều mới mẻ đối với anh ta. Ergo, anh ta bực bội khi gõ "df -h" và nghĩ, "huh, tôi vẫn còn một khoảng trống" - Thành thật mà nói, tôi đồng ý với anh ta. Đối với kernel để nói "hết dung lượng", trong khi thực tế, nó nên có một thông điệp riêng "out inodes" rất khó hiểu.
Pretzel

@Bananguin - Bạn có biết tỷ lệ byte / inode mặc định là gì không?
Pretzel

@Pretzel: Tôi nghĩ rằng tôi nhớ rằng mặc định là một nút cho mỗi 4k. Tôi vừa kiểm tra máy tính của mình ( tune2fs -l /dev/sda1) và tôi tình cờ có tỷ lệ 1 inode cho mỗi bốn khối và mỗi khối có kích thước 1k. Bao nhiêu điều này có thể được coi là "mặc định" tuy nhiên, tôi không biết.
Bananguin
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.