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

17 октября 2016

Рассмотрим реальную задачу, с которой мне пришлось не так давно столкнуться. Есть инсталляция 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 и вообще что-то менять в разбиении дисков?

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.