Điều gì xảy ra nếu vượt quá giới hạn 4 tỷ tệp trong phân vùng ext4, ví dụ như chuyển 5 tỷ tệp?
Điều gì xảy ra nếu vượt quá giới hạn 4 tỷ tệp trong phân vùng ext4, ví dụ như chuyển 5 tỷ tệp?
Câu trả lời:
Có lẽ, bạn sẽ thấy một số lỗi của "Không còn chỗ trống trên thiết bị":
# truncate -s 100M foobar.img
# mkfs.ext4 foobar.img
Creating filesystem with 102400 1k blocks and 25688 inodes
---> number of inodes determined at mkfs time ^^^^^
# mount -o loop foobar.img loop/
# touch loop/{1..25688}
touch: cannot touch 'loop/25678': No space left on device
touch: cannot touch 'loop/25679': No space left on device
touch: cannot touch 'loop/25680': No space left on device
Và trong thực tế, bạn đạt đến giới hạn này sớm hơn rất nhiều so với "4 tỷ tệp". Kiểm tra hệ thống tập tin của bạn với cả hai df -h
và df -i
để tìm hiểu còn lại bao nhiêu dung lượng.
# df -h loop/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 93M 2.1M 84M 3% /dev/shm/loop
# df -i loop/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop0 25688 25688 0 100% /dev/shm/loop
Trong ví dụ này, nếu trung bình các tệp của bạn không có kích thước 4K, bạn sẽ hết không gian inode sớm hơn nhiều so với không gian lưu trữ. Có thể chỉ định một tỷ lệ khác ( mke2fs -N number-of-inodes
hoặc -i bytes-per-inode
hoặc -T usage-type
theo quy định tại /etc/mke2fs.conf
).
git repack
trong mỗi kho git để kết hợp tất cả các đối tượng riêng biệt vào một tệp gói.
touch
, không ưa thích echo
, bạn cũng cho thấy một điểm quan trọng và một quan niệm sai lầm thường được thực hiện: Có thể lấp đầy một đĩa với các tệp trống.
git repack
không mất bất kỳ chức năng nào, nó vẫn hoạt động giống như git repo, tar
khiến cho nhiều chương trình mong đợi một dự án hoặc kho lưu trữ git
Khi đạt đến giới hạn, các lần thử tiếp theo để tạo tệp sẽ thất bại ENOSPC
, cho biết hệ thống tệp đích không có chỗ cho các tệp mới.
Trong kịch bản bạn mô tả, điều này thường sẽ dẫn đến việc hủy bỏ chuyển nhượng khi đạt đến giới hạn.