← На главную

Пример переразбиения диска во FreeBSD с помощью gpart

Рассмотрим реальную задачу, с которой мне пришлось не так давно столкнуться. Есть инсталляция FreeBSD. Используется таблица разделов GPT, все лежит на одном-единственном UFS разделе. Проблема – оказывается, чтобы ядро FreeBSD могло записать свою собственную корку, ему требуется swap-раздел. Притом, не обязательно использовать его именно как swap, просто нужен дополнительный раздел без файловой системы. Воспользоваться md или еще какими-то хаками это обойти не выходит.

Начальные условия:

$ gpart show => 40 234441568 ada0 GPT (112G) 40 409600 1 efi (200M) 409640 234031967 2 freebsd-ufs (112G) 234441607 1 - free - (512B)

Трогать разделы на живой системе мне лично как-то стремно, понадобится загрузочная флешка:

sudo dd if=FreeBSD-11.0-RC2-amd64-memstick.iso of=/dev/da0 bs=1

Я лично все делал в однопользовательском режиме, но в рамках данной статьи это не принципиально. Интересно, что если бы корень (/) лежал на отдельном разделе, по идее можно было бы безо всяких флэшек и Live CD загрузиться в однопользовательском режиме и потрогать все остальные разделы. К сожалению, на момент установки системы я был еще молод и глуп :)

Примечание: В интернетах пишут, что при очень сильном желании можно все делать прямо на работающей системе, временно приказав:

sudo sysctl kern.geom.debugflags=16

Но я бы так делать не советовал.

Первым делом после загрузки с флэшки делаем бэкап с помощью утилиты dump. Для бэкапа я лично использовал отдельный USB-накопитель:

mount /dev/da1 /mnt dump -af /mnt/root.dmp /dev/ada0p2 # или то же самое, только со сжатием: # dump -af - /dev/ada0p2 | gzip > /mnt/root.dmp.gz

Меняем размер партиции (ключ -a задает выравнивание, см man gpart):

gpart resize -i 2 -a 4k -s 96G ada0 gpart show

Сразу создаем swap-раздел (без указания размера будет использовано все свободное место):

gpart add -t freebsd-swap -a 4k ada0 gpart show

Если бы мы увеличивали, а не уменьшали размер партиции, в этом месте можно было бы просто сказать:

growfs ada0p2

К сожалению, мы уменьшаем, а UFS из коробки сжиматься не умеет. Поэтому говорим:

newfs /dev/ada0p2 mount /dev/ada0p2 /mnt/e733mnt cd /mnt/e733mnt # утилите restore нужен записываемый /tmp mount -t tmpfs tmpfs /tmp restore -r -f /mnt/root.dmp

В итоге получилось:

$ gpart show => 40 234441568 ada0 GPT (112G) 40 409600 1 efi (200M) 409640 201326592 2 freebsd-ufs (96G) 201736232 32705368 3 freebsd-swap (16G) 234441600 8 - free - (4.0K)

После загрузки системы в /etc/rc.conf дописываем (см man dumpon):

dumpdev="/dev/ada0p3" ddb_enable="YES"

Говорим:

sudo sysctl debug.kdb.panic=1

… и убеждаемся, что теперь корки пишутся в /var/crash!

А часто ли вам приходится трогать gpart и вообще что-то менять в разбиении дисков?