Создание «зеркала» на системном диске с GPT на FreeBSD 9 после установки

Дело в том, что на GPT не просто сделать RAID1, в отличии от MBR, где просто создаёшь рейд и добавляешь туда весь диск. Обычно, рекомендуется создавать «зеркало» на этапе установки, так как после того, как ОС насетаплена это сделать не так просто. Но мы это сделали ))

Тестовый стенд: FreeBSD 9.2 amb64 Release, 2xHDD 500Gb (ada0, ada1)

Суть нашего метода:

1) Создаём точную разбивку второго диска
2) Делаем gmirror отдельно для каждого из разделов ВТОРОГО диска
3) dump/restore разделов с первого диска на gmirror’ы второго
4) Правка fstab’a на первом диске на разделы с mirror и загрузка уже с mirror’a
5) Добавление оставшихся разделов с первого диска в gmirror’ы.

Приступаем.

ada0 — диск, на котором стоит сейчас ОС
ada1 — второй (новый) диск, который хотим добавить в «зеркало» с первым

Делаем точную копию GPT-разделов на втором диске ada1:

# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
# gpart backup ada0 > ada0.gpt
# gpart restore -F /dev/ada1 < ada0.gpt 
# gpart show 
=>       34  976773101  ada0  GPT  (466G)
         34       1024     1  freebsd-boot  (512K)
       1058    2097152     2  freebsd-ufs  (1.0G)
    2098210    8388608     3  freebsd-swap  (4.0G)
   10486818   16777216     4  freebsd-ufs  (8.0G)
   27264034    4194304     5  freebsd-ufs  (2.0G)
   31458338  945314797     6  freebsd-ufs  (451G)

=>       34  976773101  ada1  GPT  (466G) [CORRUPT]
         34       1024     1  freebsd-boot  (512K)
       1058    2097152     2  freebsd-ufs  (1.0G)
    2098210    8388608     3  freebsd-swap  (4.0G)
   10486818   16777216     4  freebsd-ufs  (8.0G)
   27264034    4194304     5  freebsd-ufs  (2.0G)
   31458338  945314797     6  freebsd-ufs  (451G)

Устанавливаем загрузчик на ada1:

# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada1
bootcode written to ada1

Создаём ФС на новых разделах ada1 (обратите внимание, что мы не создаём ФС для раздела boot!!!):

# newfs /dev/ada1p2
# newfs /dev/ada1p4
# newfs /dev/ada1p5
# newfs /dev/ada1p6

Создаём «зеркала» из разделов boot, swap. Из остальных разделов сейчас не получится, так как нельзя создать mirror из смонтированных разделов:

# gmirror label -v -b round-robin boot /dev/ada0p1 /dev/ada1p1
Metadata value stored on /dev/ada0p1.
Metadata value stored on /dev/ada1p1.
Done.
# gmirror label -v -b round-robin swap /dev/ada0p3 /dev/ada1p3
Metadata value stored on /dev/ada0p3.
Metadata value stored on /dev/ada1p3.
Done.

Теперь отдельно создаём gmirror’ы из разделов на ada1:

# gmirror label -v -b round-robin root /dev/ada1p2
Metadata value stored on /dev/ada1p2.
Done.
# gmirror label -v -b round-robin var /dev/ada1p4
Metadata value stored on /dev/ada1p4.
Done.
# gmirror label -v -b round-robin tmp /dev/ada1p5
Metadata value stored on /dev/ada1p5.
Done.
r# gmirror label -v -b round-robin usr /dev/ada1p6
Metadata value stored on /dev/ada1p6.
Done.
# gmirror status
       Name    Status  Components
mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                       ada1p1 (ACTIVE)
mirror/swap  DEGRADED  ada1p3 (ACTIVE)
mirror/root  COMPLETE  ada1p2 (ACTIVE)
 mirror/var  COMPLETE  ada1p4 (ACTIVE)
 mirror/tmp  COMPLETE  ada1p5 (ACTIVE)
 mirror/usr  COMPLETE  ada1p6 (ACTIVE)

Не пугайтесь насчёт swap, что он в DEGRADED. Просто на этом этапе он (ada0p3) ещё не может добавится в mirror.
Теперь будем делать копию разделов через dump/restore на «зеркальные» тома:

# mkdir /new && cd /new && mkdir root tmp usr var
# mount /dev/mirror/root /new/root/
# mount /dev/mirror/tmp /new/tmp/
# mount /dev/mirror/usr /new/usr/
# mount /dev/mirror/var /new/var
# ( dump -0f - / ) | ( cd /new/root ; restore -rf - )
...
DUMP: finished in 10 seconds, throughput 39253 KBytes/sec
DUMP: DUMP IS DONE
# ( dump -0f - /tmp ) | ( cd /new/tmp ; restore -rf - )
...
DUMP: finished in less than a second
DUMP: DUMP IS DONE
# ( dump -0f - /var ) | ( cd /new/var ; restore -rf - )
...
DUMP: finished in 29 seconds, throughput 7707 KBytes/sec
DUMP: DUMP IS DONE
# ( dump -0f - /usr ) | ( cd /new/usr ; restore -rf - )
...
DUMP: finished in 426 seconds, throughput 3179 KBytes/sec
DUMP: DUMP IS DONE

Не забудьте добавить

geom_mirror_load="YES"

в /boot/loader.conf

Приводим /new/root/etc/fstab (то есть fstab, который будет на «зеркале») к такому виду:

/dev/mirror/root            /                  ufs          rw        1        1
/dev/mirror/swap         none                 swap          sw        0        0
/dev/mirror/var         /var                  ufs          rw        2        2
/dev/mirror/tmp         /tmp                  ufs          rw        2        2
/dev/mirror/usr         /usr                  ufs          rw        2        2

Теперь самое интересное: меняем текущий /etc/fstab (точнее приводим к тому виду, что и /new/root/etc/fstab), что бы после ребута была загрузка с /dev/mirror/root.
Размонтируем ФС и ребутаем сервер:

# umount /new/root/
# umount /new/tmp/
# umount /new/var
# umount /new/usr/
# shutdown -r now

После ребута смотрим, что у нас получилось

# mount
/dev/mirror/root on / (ufs, local)
devfs on /dev (devfs, local, multilabel)
/dev/mirror/var on /var (ufs, local)
/dev/mirror/tmp on /tmp (ufs, local)
/dev/mirror/usr on /usr (ufs, local)

Теперь можно добавлять недостающие тома в mirror:

# gmirror insert root /dev/ada0p2
# gmirror insert var /dev/ada0p4
# gmirror insert tmp /dev/ada0p5
# gmirror insert usr /dev/ada0p6
# gmirror status
       Name    Status  Components
mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                       ada1p1 (ACTIVE)
mirror/swap  COMPLETE  ada0p3 (ACTIVE)
                       ada1p3 (ACTIVE)
mirror/root  COMPLETE  ada1p2 (ACTIVE)
                       ada0p2 (ACTIVE)
 mirror/var  DEGRADED  ada1p4 (ACTIVE)
                       ada0p4 (SYNCHRONIZING, 11%)
 mirror/tmp  DEGRADED  ada1p5 (ACTIVE)
                       ada0p5 (SYNCHRONIZING, 6%)
 mirror/usr  DEGRADED  ada1p6 (ACTIVE)
                       ada0p6 (SYNCHRONIZING, 0%)

Дожидаемся окончания синхронизации и опять ребут, что бы проверить, всё ли нормально. После ребута смотрим:

#dmesg | grep GEOM_MIRROR
GEOM_MIRROR: Device mirror/boot launched (2/2).
GEOM_MIRROR: Device mirror/root launched (2/2).
GEOM_MIRROR: Device mirror/swap launched (2/2).
GEOM_MIRROR: Device mirror/var launched (2/2).
GEOM_MIRROR: Device mirror/tmp launched (2/2).
GEOM_MIRROR: Device mirror/usr launched (2/2).
# mount
/dev/mirror/root on / (ufs, local)
devfs on /dev (devfs, local, multilabel)
/dev/mirror/var on /var (ufs, local)
/dev/mirror/tmp on /tmp (ufs, local)
/dev/mirror/usr on /usr (ufs, local)
# gmirror status
       Name    Status  Components
mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                       ada1p1 (ACTIVE)
mirror/root  COMPLETE  ada0p2 (ACTIVE)
                       ada1p2 (ACTIVE)
mirror/swap  COMPLETE  ada0p3 (ACTIVE)
                       ada1p3 (ACTIVE)
 mirror/var  COMPLETE  ada0p4 (ACTIVE)
                       ada1p4 (ACTIVE)
 mirror/tmp  COMPLETE  ada0p5 (ACTIVE)
                       ada1p5 (ACTIVE)
 mirror/usr  COMPLETE  ada0p6 (ACTIVE)
                       ada1p6 (ACTIVE)

Создание «зеркала» на системном диске с GPT на FreeBSD 9 после установки: 4 комментария

      1. test

        у меня не подгрузился…
        В мануале по FreeBSD — «18.4.1. Зеркалирование первичных дисков» чётко написано:

        «Включите автоматическую загрузку модуля geom_mirror.ko во время старта операционной системы:
        # echo ‘geom_mirror_load=»YES»‘ >> /boot/loader.conf »
        и только тогда меняем fstab на /dev/mirror !

        Сделав по твоей пошаговке — загрузиться, увы, не смог, надо теперь ехать к консоли.

        1. skeletor Автор записи

          Да, конкретно в этой статье пропущен момент добавление geom_mirror в loader.conf, который упомянут в этой http://skeletor.org.ua/?p=4501. Здесь сделан упор больше на GPT.
          Ты смешал вместе мухи и котлеты. Для выполнения команды gmirror status не обязательно выполнять gmirror load, а вот для загрузки с ОС c gmirror’a — обязательно добавление geom_mirror_load.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *