Да, вы можете восстановить из вашей работающей системы. Мой оригинальный подход ниже; однако благодаря комментарию Зан Линкс я нашел более легкий путь.
Мой улучшенный подход
Это упомянутый комментарий:
Или, если вы думаете о будущем, вы можете указать btrfs использовать устройство с максимальной нагрузкой меньше, чем
btrfs filesystem resize
(По сравнению с моим первоначальным подходом, смысл в том, чтобы намеренно располагать некоторым свободным пространством на этом конкретном устройстве и расширять там файловую систему, а не добавлять отдельное устройство, которое может быть не так просто.)
Хорошие новости: мои тесты показывают, что мне не нужно думать заранее! Даже если btrfs balance start /
выдает «не осталось места…», я все равно могу сжать файловую систему, если только для этого есть место (то есть все файлы и метаданные соответствуют новому размеру). Это приводит к следующему решению:
# btrfs filesystem resize -100M / # shrink a little... Resize '/' of '-100M' # btrfs filesystem resize +100M / # ... and expand back Resize '/' of '+100M' # btrfs balance start / # should work now Done, had to relocate 88 out of 88 chunks # fstrim -v / /: 67,8 GiB (72753831936 bytes) trimmed
Мой оригинальный подход
Это то, что вам нужно сделать (подробное описание ниже):
- Добавьте дополнительное устройство в файловую систему Btrfs.
btrfs balance start …
fstrim …
- Удалите лишнее устройство из файловой системы Btrfs.
btrfs balance start …
fstrim …
Хитрость заключается в том, чтобы добавить дополнительное устройство в файловую систему Btrfs, поэтому у btrfs balance …
него есть дополнительное пространство. Устройство может быть как /dev/sdb
или /dev/sdb3
. В этом примере я использую обычный файл размером 1 ГБ на своем жестком диске ( очень важно: я дважды проверяю, что файл не принадлежит файловой системе Btrfs, которую я хочу расширить! Это может быть фатальным). Я думаю, что файл в оперативной памяти (например, в /dev/shm/
) должен делать так же хорошо.
# tmpf=/mnt/hdd/tempfile # if this file exists, it will be overwritten! # truncate -s 1G "$tmpf" # extra=$(losetup -f --show "$tmpf")
Сейчас $extra
как /dev/loop0
или что-то.
# btrfs device add "$extra" /
В этот момент я не должен перезагружать мою ОС. Если бы я это сделал, ему бы не хватало части его корневой файловой системы, потому что не /dev/loop*
было бы связано с /mnt/hdd/tempfile
. Это не будет проблемой, если вы используете обычное устройство (или раздел) в качестве дополнительного устройства, потому что btrfs device scan
во время загрузки обнаружит его.
# btrfs balance start /
В моем случае tempfile
это редкий файл. В другой консоли я запускаю watch ls -hls /mnt/hdd/tempfile
и замечаю, когда она достигает своего (почти) полного размера. Таким образом, я знаю, когда некоторые куски Btrfs перемещаются с SSD. Если есть сомнения, дайте btrfs ballance …
закончить; но я призываю btrfs balance cancel /
сэкономить время. Теперь вернемся к главной консоли.
Примечание: первая строка ниже взята из вышеуказанной btrfs balance start /
команды, которая была прервана.
balance canceled by user # fstrim -v / /: 26,7 GiB (28696862720 bytes) trimmed
fstrim
урезанный путь больше, чем раньше. Мне больше не нужно мое дополнительное устройство.
# btrfs device delete "$extra" / # may take a while # btrfs balance start / # should work now Done, had to relocate 88 out of 88 chunks # fstrim -v / /: 67,8 GiB (72753831936 bytes) trimmed
И это все. Теперь пришло время для очистки:
# losetup -d "$extra" # rm "$tmpf"