Home

FreeBSD 9.1: RAID1 - Mirroring

 

Предисловие.

Мдя. Рабочей инструкции по запросу как поставить/замиррорить систему FreeBSD 9.1 на RAID1 с помощью gmirror я так и не нашёл.

Русский FreeBSD handbook отсюда http://www.freebsd.org/doc/ru/books/handbook/geom-mirror.html устарел, даже нумерация статьи 19.4 не соответствует официальной английской, которая уже стала 20.4 http://www.freebsd.org/doc/handbook/geom-mirror.html

Вот эта инструкция не работает на 9.1 http://www.opennet.ru/tips/info/2681.shtml - на некоторые команды система ругается. Адаптировать не удалось. В какой-то момент установка началась на gm0 раздел, но при попытке установить рутовый пароль (когда инсталлер FreeBSD вываливается в коммандную строку) процесс каким-то странным образом замерзал.

Эта инструкция http://www.ateamsystems.com/blog/Installing-FreeBSD-9-gmirror-GPT-partitions-raid-1 меня не порадовала - как-то сильно далека она от официального handbook'а.

Итого. Вернёмся к официальному FreeBSD handbook'у http://www.freebsd.org/doc/handbook/geom-mirror.html

 

Процесс - FreeBSD gmirror raid1.

Ставим FreeBSD 9.1, как мы это обычно делаем. Без всяких заморочек. Перегружаемся в свежеустановленную систему. Все дальшеописанные команды я делал через ssh-подключение.

Если до этого оставались какие-то хвосты от предыдущих попыток запустить gmirror, то делаем gpart destroy -F ada1 - на ada0 оно было всё стёрто в процессе установки.

Далее следуем инструкциям из FreeBSD HandBook 20.4.3

# gmirror load

# diskinfo -v ada0 |head -n3
ada0
        512             # sectorsize
        1000204886016   # mediasize in bytes (931G)

# diskinfo -v ada1 | head -n3
ada1
        512             # sectorsize
        1000204886016   # mediasize in bytes (931G)

# geom zero load

# gnop create -s 1000204886016 gzero
Это число взято из предыдущей команды.

# gmirror label -v gm0 gzero.nop ada1
Metadata value stored on gzero.nop.
Metadata value stored on ada1.
Done.

# gmirror forget gm0

А вот дальше начинается интересное - я решил посмотреть, что показывает команда gpart show из инструкции (заглянул так сказать вперёд) и оказалось вот что:

# gpart show ada0
=>        34  1953525101  ada0  GPT  (931G)
          34           6        - free -  (3.0k)
          40         128     1  freebsd-boot  (64k)
         168  1944059768     2  freebsd-ufs  (927G)
  1944059936     8388608     3  freebsd-swap  (4.0G)
  1952448544     1076591        - free -  (525M)

# gpart backup ada0
GPT 128
1   freebsd-boot         40        128
2    freebsd-ufs        168 1944059768
3   freebsd-swap 1944059936    8388608

А в handbook'е пишут про MBR 4 и BSD 8 - а это, как я понимаю, уже прошлый век.

И! У меня в конце оказалось 525 свободных мегабайт. Видимо потому что инсталлятор по умолчанию оперирует гигабайтам. Поэтому следующий шаг из официального handbook'а FreeBSD я пропускаю. В нём размер последнего слайса/партиции/etc уменьшается на 1 сектор, в результате чего команда gpart show начинает показывать - free -  (31k) в последней строке. У меня там итак уже 525M свободно.

# gpart backup ada0 > table.ada0
Если же у тебя нет свободного места в конце диска, то нужно последнее число в последней строке уменьшить на 1 (на единицу).

На моём примере должно было бы получиться
3   freebsd-swap 1944059936    8388607

# gpart restore mirror/gm0 < table.ada0

# gpart show mirror/gm0
=>        34  1953525100  mirror/gm0  GPT  (931G)
          34           6              - free -  (3.0k)
          40         128           1  freebsd-boot  (64k)
         168  1944059768           2  freebsd-ufs  (927G)
  1944059936     8388608           3  freebsd-swap  (4.0G)
  1952448544     1076590              - free -  (525M)

# newfs -U /dev/mirror/gm0p2
/dev/mirror/gm0p2: 949247.9MB (1944059768 sectors) block size 32768, fragment size 4096
        using 1517 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
        with soft updates
super-block backups (for fsck_ffs -b #) at:
 192, 1282432, 2564672, 3846912, 5129152, 6411392, 7693632, 8975872, 10258112, 11540352, 12822592,
....

# gpart bootcode -b /boot/pmbr mirror/gm0
bootcode written to mirror/gm0

# gpart set -a active -i 1 mirror/gm0
gpart: attrib 'active': Invalid argument

лезем в man gpart и выясняем, что нужно делать так:

# gpart set -a bootme -i 1 mirror/gm0
bootme set on mirror/gm0p1

команде gpart bootcode -b /boot/boot mirror/gm0s1 я не нашёл аналога - по идее это должно было бы быть gpart bootcode -b /boot/gptboot mirror/gm0p1 но нет.

(UPD после того, как система сдублировалась и была перезагружена, оказалось, что она не грузится. Видимо затёрся бутсектор или ещё какая-то фигня стряслась. После вкуривания интернетов и манов команда gpart bootcode -b /boot/mbr mirror/gm0 была пофикшена в gpart bootcode -b /boot/pmbr mirror/gm0 и выполнена после загрузки с установочного диска. Команда gpart bootcode -b /boot/gptboot mirror/gm0p1 всё равно ни разу не выполнялась без ошибок. То есть я так и не понял, какая команда записывает нужные данные на раздел freebsd-boot)

далее лезем в /etc/fstab, чтобы заменить /dev/ada0* на /dev/mirror/gm0*

Handbook рекомендует сделать копию

# cp /etc/fstab /etc/fstab.orig

# vi /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/mirror/gm0p2       /               ufs     rw      1       1
/dev/mirror/gm0p3       none            swap    sw      0       0

Далее в файл vi /boot/loader.conf добавляем строку geom_mirror_load="YES"

Теперь пришло время скопировать систему с /dev/ada0p2 на /dev/mirror/gm0p2

# mount /dev/mirror/gm0p2 /mnt

# mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
/dev/mirror/gm0p2 on /mnt (ufs, local, soft-updates)

 Дальше забиваем временно на FreeBSD Handbook и клонируем раздел с помощью команды pax

# cd /

# pax -p eme -X -rw . /mnt
pax: /mnt/./var/run/devd.pipe skipped. Sockets cannot be copied or extracted
pax: /mnt/./var/run/log skipped. Sockets cannot be copied or extracted
pax: /mnt/./var/run/logpriv skipped. Sockets cannot be copied or extracted

Скопировалось буквально за минуту.

# df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
/dev/ada0p2          897G    703M    825G     0%    /
devfs                1.0k    1.0k      0B   100%    /dev
/dev/mirror/gm0p2    897G    703M    825G     0%    /mnt

 Теперь перегружаемся. Если всё пойдёт, как должно быть, то мы загрузимся с mirror/gm0

# reboot

 Загрузилось.

# mount
/dev/mirror/gm0p2 on / (ufs, local, soft-updates)
devfs on /dev (devfs, local, multilabel)

Журналирование куда-то делось. Непонятно, должно ли оно было там быть на gmirror разделах - не знаю.

ВНИМАНИЕ! Теперь, мы в миррор будем подключать наш изначальный диск ada0 - все данные при этом на нём сотрутся.

На данный момент статус таков:

# gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  ada1 (ACTIVE)

# gmirror insert gm0 ada0
В ответ не было сказано ни слова, хотя в handbook'е написан некий вывод GEOM_MIRROR: Device gm0: rebuilding provider ada0.

# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
                      ada0 (SYNCHRONIZING, 0%)

Синхронизирует оно всё это очень вяло как-то. При этом нагрузки на проц нету никакой.

А вот и ответ.

Оно, видимо, клонирует всю поверхность диска без разбора.

# gstat
dT: 1.002s  w: 1.000s
 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
    0      0      0      0    0.0      0      0    0.0    0.0| cd0
    0      0      0      0    0.0      0      0    0.0    0.0| iso9660/FREEBSD_INSTALL
    2   1277      0      0    0.0   1277 161984    1.0   83.0| ada0
    0   1266   1266 162106    0.5      0      0    0.0   54.0| ada1
    1   1266   1266 162106    0.6      0      0    0.0   56.1| mirror/gm0
    0      0      0      0    0.0      0      0    0.0    0.0| mirror/gm0p1
    0      0      0      0    0.0      0      0    0.0    0.0| mirror/gm0p2
    0      0      0      0    0.0      0      0    0.0    0.0| mirror/gm0p3 

Насколько мы помним - у меня там было занято 703M из 897G.

Вот и всё. Теперь можно обновлять систему до STABLE и ставить порты через систему SVN.