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 и вообще что-то менять в разбиении дисков?

EnglishRussianUkrainian