Btrfs на SSD, «на устройстве не осталось места»; catch-22 с `fstrim` и` btrfs balance`; как восстановить?

585
Kamil Maciorowski

Корневая файловая система моего Kubuntu (смонтирована под /) - Btrfs. Я не использую -o discardв качестве опции монтирования. Это значит, что мне нужно бегать fstrimпо требованию .

В прошлом я сталкивался с этой проблемой: btrfs, дискового пространства не осталось . Я заметил, fstrim -v /что почти не было места, которое нужно обрезать. Моим решением было бежать btrfs balance start /раньше fstrim. Это суть моего ответа там .

Сегодня все по-другому. Может быть, я слишком поздно с обслуживанием. Вот что происходит:

# fstrim -v / /: 24 KiB (24576 bytes) trimmed # btrfs balance start / ERROR: error during balancing '/': No space left on device 

Я удалил несколько подразделов (снимков), btrfs subvolume delete …и это не помогло. Я не очень хорошо помню детали, но я думаю, что раньше я мог бежать, btrfs balance …потому что предварительно fstrimурезал, по крайней мере, несколько МиБ, а не так, как 24 КиБ, как сегодня. Теперь это похоже на ситуацию-ловушку, когда fstrimили btrfs balanceсработает, только если другой сначала сделает свою работу.

Для справки, вот некоторые статистические данные, которые показывают, что у меня на самом деле достаточно места:

# df -h / Filesystem Size Used Avail Use% Mounted on /dev/sda1 112G 43G 68G 39% /  # btrfs fi df / Data, single: total=108.73GiB, used=41.00GiB System, single: total=64.00MiB, used=16.00KiB Metadata, single: total=3.00GiB, used=1.02GiB GlobalReserve, single: total=352.00MiB, used=0.00B 

Примечание. У меня не осталось «свободного места на устройстве» во время нормальной работы. Я думаю, что Btrfs продолжает устанавливать новые записи внутри уже взятых кусков. Однако в прошлом я нажимал «нет места…» во время apt-get upgrade, затем я выздоровел с помощью btrfs balanceи fstrim. Я не знаю, когда (если) это поразит меня снова. Я хотел бы сделать техническое обслуживание, прежде чем я получу "не осталось места ...", когда я делаю что-то важное.

Как выйти из этой ситуации так fstrimи btrfs balanceне блокируют друг друга? Можно ли это исправить изнутри моей работающей системы?

На самом деле я уже исправил это, мой ответ ниже. Вопрос для дальнейшего использования. Не стесняйтесь добавлять другое решение.


Дополнительная информация:

$ uname -a Linux foobar 4.4.0-78-generic #99-Ubuntu SMP […] x86_64 x86_64 x86_64 GNU/Linux  $ cat /etc/issue Ubuntu 16.04.3 LTS \n \l  # dpkg -l | grep btrfs ii btrfs-tools 4.4-1ubuntu1 amd64 Checksumming Copy on Write Filesystem utilities 
3

1 ответ на вопрос

4
Kamil Maciorowski

Да, вы можете восстановить из вашей работающей системы. Мой оригинальный подход ниже; однако благодаря комментарию Зан Линкс я нашел более легкий путь.

Мой улучшенный подход

Это упомянутый комментарий:

Или, если вы думаете о будущем, вы можете указать 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 

Мой оригинальный подход

Это то, что вам нужно сделать (подробное описание ниже):

  1. Добавьте дополнительное устройство в файловую систему Btrfs.
  2. btrfs balance start …
  3. fstrim …
  4. Удалите лишнее устройство из файловой системы Btrfs.
  5. btrfs balance start …
  6. 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" 
Я часто использую USB-накопитель или swapoff -a и форматирую раздел подкачки как устройство btrfs. Использование ОЗУ кажется слишком рискованным. Zan Lynx 6 лет назад 0
Или, если вы думаете об этом заранее, вы можете указать btrfs использовать устройство меньше, чем максимум, с `btrfs resystem filesize` Zan Lynx 6 лет назад 1
@ZanLynx Спасибо! Я значительно улучшил свой ответ с этой идеей изменения размера. Kamil Maciorowski 6 лет назад 0

Похожие вопросы