Lý do của vấn đề
Vấn đề hóa ra là ở cách XFS phân bổ các nút. Không giống như hầu hết các hệ thống tệp, phân bổ xảy ra linh hoạt khi các tệp mới được tạo. Tuy nhiên, trừ khi bạn chỉ định khác, các nút được giới hạn ở các giá trị 32 bit, có nghĩa là chúng phải nằm trong terabyte lưu trữ đầu tiên trên hệ thống tệp. Vì vậy, nếu bạn điền đầy đủ terabyte đầu tiên, và sau đó bạn phóng to đĩa, bạn vẫn không thể tạo tệp mới, vì các nút không thể được tạo trên không gian mới.
Giải pháp 1 - thay đổi tùy chọn gắn kết
Một giải pháp là gắn lại hệ thống tập tin với tùy chọn gắn kết inode64
. Tuy nhiên, một số ứng dụng sẽ hành xử kỳ lạ về điều này (ví dụ: MySQL) và NFS sẽ rất bối rối. Vì vậy, nếu bạn không chắc chắn rằng hệ thống của bạn sẽ hoạt động với tùy chọn này, bạn có thể chuyển sang tùy chọn tiếp theo.
Giải pháp 2 - di chuyển tệp
Giải pháp thứ hai là tìm một số tệp hiện được lưu trữ trong terabyte đầu tiên và di chuyển chúng đến một khu vực khác của hệ thống tệp.
Di chuyển theo độ tuổi
Trong trường hợp của chúng tôi, điều này thật dễ dàng - hệ thống tệp đã được sử dụng trong nhiều năm, vì vậy chúng tôi chỉ cần tìm các tệp cũ nhất và di chuyển chúng ra khỏi hệ thống tệp, sau đó di chuyển chúng trở lại. Điều này đã được thực hiện dễ dàng bằng cách sử dụng find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
đã cung cấp cho chúng tôi một danh sách chứa kích thước và tên thư mục cho tất cả các thư mục ở chính xác 3 cấp dưới điểm gắn kết, cũ hơn 2 năm. Sau đó chúng ta có thể sắp xếp danh sách để tìm các thư mục lớn nhất và sử dụng mv
để di chuyển chúng sang hệ thống tệp khác và quay lại.
Di chuyển theo nhóm phân bổ
Nếu bạn không thể đơn giản đi theo độ tuổi, ví dụ: khi nhiều tệp được tạo cùng một lúc, bạn vẫn có thể tìm đúng tệp để di chuyển, nhưng phải mất thêm một chút thời gian.
XFS có các nhóm phân bổ (còn gọi là AG ), bắt đầu bằng 0. Bạn có thể kiểm tra kích thước khối và số khối của mỗi AG để tìm ra nhóm nào trên terabyte đầu tiên, sử dụng xfs_info /path/to/mountpoint
. Hoặc bạn chỉ có thể kiểm tra một vài AG đầu tiên để xem những cái nào đã đầy, và sau đó xóa những cái đó.
- Kiểm tra không gian trống trong bốn AG đầu tiên:
cho ag trong `seq 0 1 5`; làm tiếng vang tự do trong AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "hoàn toàn miễn phí"; làm xong
Nếu tổng dung lượng trống trong bất kỳ nhóm nào dưới 40, bạn sẽ không thể tạo tệp mới trong đó.
- Tìm tập tin trong AG đó
Yêu cầu này kiểm tra siêu dữ liệu cho từng tệp trên hệ thống tệp. Sẽ mất nhiều thời gian ... Đây là một gợi ý:
tìm / thêm -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Sau đó, bạn có thể grep cho " 0 "
(đó là một khoảng trắng, 0 và một không gian khác) để tìm tất cả các tệp trên AG 0, grep để tìm các tệp " 1 "
trên AG 1, v.v ... Bắt đầu với AG 0, di chuyển các tệp lớn nhất đi (sử dụng mv
, không cp
!) và sau đó trở lại. Lặp lại cho đến khi bạn có một không gian trống miễn phí.
Kết quả
Khi chúng tôi đã di chuyển đủ các tệp từ / thêm rồi quay lại, có rất nhiều khoảng trống trong AG 0 và một lần nữa có thể tạo các tệp mới.