Để hiểu những gì đang diễn ra ở đây, trước tiên bạn cần hiểu rằng BTRFS sử dụng bộ phân bổ hai giai đoạn. Giai đoạn đầu phân bổ các khối không gian lớn (thực sự được gọi là 'khối' trong hầu hết các tài liệu) được sử dụng cho chính xác một loại phân bổ, hoặc là dữ liệu (chỉ được sử dụng cho dữ liệu trong tệp), siêu dữ liệu (những thứ như tên tệp, thư mục cấu trúc, thời gian truy cập, quyền sở hữu, quyền, v.v.) hoặc hệ thống (chỉ được sử dụng để lưu trữ dữ liệu về phân bổ khối). Khi một đoạn đã được phân bổ, không gian trong đoạn đó chỉ có thể được giải phóng bằng cách di chuyển tất cả dữ liệu ra khỏi nó.
Vì vậy, điều này chính xác có nghĩa là gì trong hệ thống tập tin của bạn?
Vâng, đầu ra của bạn từ btrfs filesystem df
hiển thị như sau:
Data, RAID1: total=446.12GiB, used=133.29GiB
System, RAID1: total=8.00MiB, used=80.00KiB
Metadata, RAID1: total=1.00GiB, used=609.05MiB
GlobalReserve, single: total=405.53MiB, used=0.00B
Các total
các giá trị cho biết có bao nhiêu không gian đã được phân bổ cho loại khối đó, trong khi used
giá trị cho thấy có bao nhiêu không gian được sử dụng trong các khối đó. Trong trường hợp của bạn, bạn có 446.32GB dung lượng được phân bổ cho các khối dữ liệu (gần như toàn bộ đĩa dựa trên thông thường df
và btrfs filesystem show
đầu ra), nhưng chỉ có 133,29GB dung lượng đó thực sự được sử dụng. Do điều này và các triệu chứng được mô tả, BTRFS đang cố gắng phân bổ một khối siêu dữ liệu nhưng không có không gian để làm điều đó (vì tất cả không gian trống nằm trong các khối đã được phân bổ), vì vậy bạn chỉ gặp lỗi.
Để phục hồi từ điều này, bạn sẽ phải chạy một số dư. Một số dư hoàn toàn theo nghĩa đen sẽ gửi tất cả dữ liệu từ các khối được chọn (hoặc tất cả chúng nếu bạn không có tùy chọn nào) trở lại qua bộ cấp phát, có tác dụng ròng là giải phóng các khối trống hoặc chủ yếu là trống vì nó đóng gói lại thành một phần đầy đủ.
Tôi sẽ bắt đầu với:
btrfs balance start -dusage=0 /mnt/ssd
Điều đó sẽ loại bỏ tất cả các khối dữ liệu không có dữ liệu thực tế trong đó, có thể đủ để mọi thứ hoạt động trở lại, nhưng vẫn khiến bạn dễ gặp phải vấn đề tương tự trong tương lai.
Để giúp thu gọn mọi thứ hoàn toàn, hãy lặp lại lệnh trên với giá trị tăng dần cho -dusage
Tùy chọn. Tôi thường tăng gấp 5 lần mỗi lần lên tới khoảng 50 (trên 50, bạn thường lãng phí thời gian). Bộ lọc sử dụng (được chỉ định ở trên chỉ để xử lý các khối dữ liệu) sẽ cho biết sự cân bằng để chọn các khối chỉ có đầy đủ phần trăm đó, do đó, bằng cách tăng dần từng chút một, bạn có thể dễ dàng thu gọn mọi thứ mà không gặp phải các vấn đề khác.
Bạn có thể giúp giải quyết các vấn đề như thế này trong tương lai bằng cách chạy một số thứ như sau thường xuyên (tôi thường chạy nó hàng ngày trên hệ thống của mình):
btrfs balance start -dusage=25 -dlimit=10 -musage=25 -mlimit=10 /mnt/ssd
Điều đó sẽ cân bằng 10 khối dữ liệu và siêu dữ liệu đầu tiên chưa đầy một phần tư, sẽ hoàn thành trong vài giây trong hầu hết các trường hợp.