3

Корневой файловой системой моего 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 … btrfs … потому что предварительный fstrim урезал, по крайней мере, несколько МиБ, а не так, как 24 КиБ, как сегодня. Теперь кажется , что ситуация улов-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 ответ1

4

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .