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