How to resize btrfs with lvm

Я попробую заресайзить не системный раздел с файловой системой btrfs, и предварительно
создам его.

Создание носит информационный характер, но тут есть и шпаргалка по lvs командам

Предусловия

  • Linux (mint - то что у меня) with working LVS
  • Free space / BTRFS volume
  • btrfs tools

Создание раздела

В моём случае я начну с удаления ненужного хлама:

1
2
3
4
5
6
7
8
# Посмотреть
lvs --all
# Посмотреть пристально, и увидеть девайсы
lvs --all userspace -o name,copy_percent,devices
# Удалить LogicalVolume в VolumeGroup
lvremove userspace/thinpool
## Do you really want to remove and DISCARD logical volume userspace/thinpool? [y/n]: y
## Logical volume "thinpool" successfully removed

После создам в этой VG новый LV с (почему бы и нет) мирорингом

1
2
3
4
5
6
7
8
9
10
lvcreate -L 10G -m1 -n test-resize userspace
# Specifying `-m1` creates one mirror, which yields two copies of the file system
## Logical volume "test-resize" created.
lvs --all userspace -o name,copy_percent,devices
## ...
## test-resize 19,42 test-resize_rimage_0(0),test-resize_rimage_1(0)
## [test-resize_rimage_0] /dev/sdd1(12801)
## [test-resize_rimage_1] /dev/sdb3(1)
## [test-resize_rmeta_0] /dev/sdd1(12800)
## [test-resize_rmeta_1] /dev/sdb3(0)

Собственно отформатируем его в бтрфс. Я немного побаеваюсь делать эти вещи в консоле
и часто смотрю gParted, но в этом случае и так всё ясно:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkfs.btrfs /dev/userspace/test-resize
## btrfs-progs v4.15.1
## See http://btrfs.wiki.kernel.org for more information.
##
## Label: (null)
## UUID: 219f506d-264c-4041-87f4-7512757ca723
## Node size: 16384
## Sector size: 4096
## Filesystem size: 10.00GiB
## Block group profiles:
## Data: single 8.00MiB
## Metadata: DUP 1.00GiB
## System: DUP 8.00MiB
## SSD detected: no
## Incompat features: extref, skinny-metadata
## Number of devices: 1
## Devices:
## ID SIZE PATH
## 1 10.00GiB /dev/userspace/test-resize

Конечно можно и примонтировать его, но это линукс уже и сам может “в окошечке”,
я просто кликну на значок типа “диск на 11 гиг”

1
2
3
4
5
mkdir -p /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
mount /dev/userspace/test-resize /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
cd /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
touch 1.txt
echo 'Test me Better File System' > 2.txt

Делаем ресайз вверх

Ну, как и всегда нужно отмонтировать, опять таки, можно воспользоваться
встроенным файловым менеджером и найти кнопку “высунть компакт диск, плеер!”
или

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# для исторических целей, этого не надо делать
umount /dev/mapper/userspace-test--resize
# эта команда упадёт, но в будущем, и она будет проходить гладко
lvextend -L 15G --resizefs /dev/userspace/test-resize
## Extending 2 mirror images.
## fsadm: Filesystem "btrfs" on device "/dev/mapper/userspace-test--resize" is not supported by this tool.
## Filesystem check failed.
# упала она из-за флага `--resizefs`, то есть, нам нужно сначала увеличить ЛВС
lvextend -L 15G /dev/userspace/test-resize
## Extending 2 mirror images.
## Size of logical volume userspace/test-resize changed from 10,00 GiB (320 extents) to 15,00 GiB (480 extents).
## Logical volume userspace/test-resize successfully resized.
# ... плюемся, не понимаем, почему так сложно поменять размер файловой системы
# смотрим как монтировать раздел выше
# монтируем
mount /dev/userspace/test-resize /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
# и теперь нужно увеличить ручками бтрф раздел, раз уж `--resizefs` не смог
btrfs filesystem resize max /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
## Resize '/media/tomfun/219f506d-264c-4041-87f4-7512757ca723' of 'max'
# не верим глазам своим, проверяем место на диске
df -h /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
## Filesystem Size Used Avail Use% Mounted on
## /dev/mapper/userspace-test--resize 15G 17M 13G 1% /media/tomfun/219f506d-264c-4041-87f4-7512757ca723

Делаем урезайз вниз

В моём примере я всё же не верю, что всё так хорошо, и залью пару тяжёлых видео
файлов, чтобы потом посмотреть на всё это…

1
2
3
4
5
btrfs filesystem resize 10G /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
## Resize '/media/tomfun/219f506d-264c-4041-87f4-7512757ca723' of '10G'
df -h /media/tomfun/219f506d-264c-4041-87f4-7512757ca723
## Filesystem Size Used Avail Use% Mounted on
## /dev/mapper/userspace-test--resize 10G 2,8G 5,3G 35% /media/tomfun/219f506d-264c-4041-87f4-7512757ca723

Ну, как-то аж не верится, что всё так просто и быстро… ну, видимо,
это в моём случае

Warning: делай бекапы

1
2
3
4
5
6
lvreduce -L 10G /dev/userspace/test-resize
## WARNING: Reducing active and open logical volume to 10,00 GiB.
## THIS MAY DESTROY YOUR DATA (filesystem etc.)
## Do you really want to reduce userspace/test-resize? [y/n]: y
## Size of logical volume userspace/test-resize changed from 15,00 GiB (480 extents) to 10,00 GiB (320 extents).
## Logical volume userspace/test-resize successfully resized.

Выводы

Ну, какие тут могут быть выводы?!
Вероятно, иметь бтрфс поверх лвм избыточно.

Всё проделано невероятно просто, всё работает, кажется, что с такими средствами
вообще не надо ни о чём парится - просто на живом подключенном разделе сделал ресайз
подключил / отключил винт и всё работает.

Пожалуй, если бы я делал это не на тестовых данных, я бы был внимательнее, я бы
точно сделал проверку размеров дисков, по заявлениям моих бинарей, размеры сходятся
(1g в btrfs resize = 1G = 1G в LVS), но если бы где-то исчесзло несколько мегабайт,
результат мог бы быть плачевным, меня бы даже не спас мирроринг. Как глосил один
старый мануал

давайте заресайзем файловую систему на чутка меньшую цифру чем [будущий] размер
диска, потом увеличим до размера диска

чтобы не промазать

Делайте бекапы

Ссылки