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

корневая файловая система моего 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 обрезаны по крайней мере несколько MiB, не так мало, как 24 КБ, как сегодня. Теперь это похоже на ситуацию catch-22, где 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

1 ответ:

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

мой усовершенствованный подход

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

или если вы думаете вперед, вы можете сказать 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 - это разреженный файл. В другой консоли я запускаю 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"