ZFS. Расширить дисковое пространство пула
Описание
Нельзя:
- Расширить пул, добавив отдельный диск в уже созданное виртуальное устройство (например, в mirror или в raidz1).
Можно:
- Добавить в текущий пул аналогичное виртуальное устройство тому, которое уже работает в пуле. Например, если оригинальный пул собран на основе mirror, то и добавить в него можно только vdev mirror из дисков аналогичного объема.
- Заменить все диски на новые диски большего объема.
Вариант 1. Добавление виртуального устройства VDEV (MIRROR, RAIDZ1, RAIDZ2) в уже созданный пул RAIDZ1
Входные данные
Имеется пул pool01 на основе виртуального устройства типа raidz1
zpool status
pool: pool01 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM pool01 ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 gpt/d1 ONLINE 0 0 0 gpt/d2 ONLINE 0 0 0 gpt/d3 ONLINE 0 0 0
Задача
Необходимо расширить дисковое пространство.
Добавим виртуальное устройство VDEV (MIRROR, RAIDZ1, RAIDZ2) в уже созданный пул RAIDZ1
Решение
Отформатируем новые диски аналогичного объема с gpt метками
gpart create -s gpt ada3
gpart create -s gpt ada4
gpart create -s gpt ada5
gpart add -t freebsd-zfs -l d4 ada3
gpart add -t freebsd-zfs -l d5 ada4
gpart add -t freebsd-zfs -l d6 ada5
При ошибке "gpart: geom 'ada0': File exists" делаем:
gpart delete -i 1 ada3
gpart destroy ada3
Соберем такое же vdev (raidz1 из 3-х дисков), как и в существующем в пуле устройстве, и добавим его в пул
!!! ВНИМАНИЕ !!!
Как только новое vdev будет добавлено к существующему пулу и объем пула будет увеличен, не будет способа удалить этот или оригинальный vdev из пула.
Теперь новый vdev - часть пула, и далее объем пула можно только увеличить новым vdev!
Единственный способ уменьшить объем текущего пула - это сделать резервную копию данных пула, уничтожить текущий пул и собрать новый!
zpool add pool01 raidz /dev/gpt/d4 /dev/gpt/d5 /dev/gpt/d6
Объем пула увеличен в 2 раза
zpool status
pool: pool01 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM pool01 ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 gpt/d1 ONLINE 0 0 0 gpt/d2 ONLINE 0 0 0 gpt/d3 ONLINE 0 0 0 raidz1-1 ONLINE 0 0 0 gpt/d4 ONLINE 0 0 0 gpt/d5 ONLINE 0 0 0 gpt/d6 ONLINE 0 0 0
df -h
Filesystem Size Used Avail Capacity Mounted on ... pool01 3.5G 144K 3.5G 0% /mnt/pool01 ...
Вариант 2. Замена всех дисков в пуле на более объемные
Входные данные
Пул RAIDZ1 raid1 из 3-х дисков по 2ГБ объемом 3.5ГБ
zpool status raid1
... pool: raid1 state: ONLINE config: NAME STATE READ WRITE CKSUM raid1 ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 da1p1 ONLINE 0 0 0 da2p1 ONLINE 0 0 0 da3p1 ONLINE 0 0 0 ...
zfs list
... NAME USED AVAIL REFER MOUNTPOINT raid1 68.4M 3.47G 128K /mnt/raid1 raid1/dataset1 67.7M 3.47G 67.7M /mnt/raid1/dataset1 ...
Задача
Расширить объем пула, используя замену всех дисков 2ГБ на новые диски 4ГБ
Решение
Вставим диски в сервер.
Отформатируем новые диски аналогичного объема с gpt метками (также это действие можно произвести через веб-интерфейс (форматирование с GPT-метками), если используется Xigmanas)
gpart create -s gpt ada3
gpart create -s gpt ada4
gpart create -s gpt ada5
gpart add -t freebsd-zfs -l d4 ada3
gpart add -t freebsd-zfs -l d5 ada4
gpart add -t freebsd-zfs -l d6 ada5
При ошибке "gpart: geom 'ada0': File exists" делаем:
gpart delete -i 1 ada3
gpart destroy ada3
Заменим каждый диск 2ГБ на новый диск 4ГБ
zpool replace raid1 da1p1 /dev/gpt/d4
zpool replace raid1 da2p1 /dev/gpt/d5
zpool replace raid1 da3p1 /dev/gpt/d6
Выключим/включим опцию авторасширения для пула
zpool set autoexpand=off raid1
zpool set autoexpand=on raid1
Смотрим
... zpool status pool: raid1 state: ONLINE scan: resilvered 34.8M in 00:00:00 with 0 errors on Tue Oct 24 20:09:54 2023 config: NAME STATE READ WRITE CKSUM raid1 ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 gpt/d4 ONLINE 0 0 0 gpt/d5 ONLINE 0 0 0 gpt/d6 ONLINE 0 0 0 ...
Введем команду расширения для каждого диска
zpool online -e raid1 gpt/d4
zpool online -e raid1 gpt/d5
zpool online -e raid1 gpt/d6
Смотрим результат
zfs list raid1
... NAME USED AVAIL REFER MOUNTPOINT raid1 68.4M 7.35G 128K /mnt/raid1 ...
df -h
... raid1 7.4G 128K 7.4G 0% /mnt/raid1 raid1/dataset1 7.4G 68M 7.4G 1% /mnt/raid1/dataset1 ...
Нетрудно видеть, что объем пула увеличился с 3.5ГБ до 7.5ГБ.
Все файлы и директории остались на месте.