Создание «зеркала» на системном диске с 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

Создаём «зеркала» из разделов bootswap. Из остальных разделов сейчас не получится, так как нельзя создать 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

Приводим /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)
image_pdfimage_print