기존환경: FreeBSD 9.0 하드디스크 하나를 통채로 os 디스크로 사용중.
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ada0p2 13G 2.0G 10G 16% /
devfs 1.0k 1.0k 0B 100% /dev
FreeBSD rootdisk 미러의 기본 개념은, 새 하드디스크를 미러디스크(gm0) 로 만들어 놓은 후, 기존 os를 gm0로 이동(dump/restore)한 후, 기존 디스크를 미러디스크에 참여 시키는 방법이다.
참고문서: http://www.freebsd.org/doc/handbook/geom-mirror.html#GEOM-mirror-metadata
1. 먼저, 커널이 mirror 사용가능한지 확인하고, 사용가능하지 않다면, 커널에 모듈을 로드한다.
# gmirror status
gmirror: Command ‘status’ not available.
# sysctl -a | grep -i mirror
vfs.nfsd.mirrormnt: 1
위와 같은 메시지가 보인다면 사용가능하지 않은 상태. 아래와 같이 커널에 gmirror 모듈을 로드해준다.
# gmirror load
# sysctl -a | grep -i mirror
<name>MIRROR</name>
kern.geom.mirror.sync_requests: 2
kern.geom.mirror.disconnect_on_failure: 1
kern.geom.mirror.idletime: 5
kern.geom.mirror.timeout: 4
kern.geom.mirror.debug: 0
kern.features.geom_mirror: 1
vfs.nfsd.mirrormnt: 1
2. 기존 디스크와 같은 크기의 가상 디스크를 만들고, 그 가상디스크(gzero)와 새 디스크(ada1)를 미러로 만든다. 그리고, 가상디스크는 미러에서 제거(forget) 한다.
# geom zero load
# diskinfo -v ada0
ada0512 # sectorsize
16106127360 # mediasize in bytes (15G)
31457280 # mediasize in sectors
0 # stripesize
0 # stripeoffset
31207 # Cylinders according to firmware.
16 # Heads according to firmware.
63 # Sectors according to firmware.
QM00001 # Disk ident.# gnop create -s 16106127360 gzero
# gmirror label -v gm0 gzero.nop ada1
Metadata value stored on gzero.nop.
Metadata value stored on ada1.
Done.# gmirror forget gm0
# gmirror status
Name Status Components
mirror/gm0 COMPLETE ada1 (ACTIVE)
3. 만들어진 미러디스크(gm0)의 파티션을 gpart를 이용하여, os disk와 똑같이 만든다.
# gpart backup ada0 > ada0b.txt
# more ada0b.txt
GPT 128
1 freebsd-boot 34 128
2 freebsd-ufs 162 29360000
3 freebsd-swap 29360162 1572864# gpart restore mirror/gm0 < ada0b.txt
# gpart show mirror/gm0
=> 34 31457212 mirror/gm0 GPT (15G)
34 128 1 freebsd-boot (64k)
162 29360000 2 freebsd-ufs (14G)
29360162 1572864 3 freebsd-swap (768M)
30933026 524220 – free – (256M)
4. 만들어진 미러디스크(mirror/gm0)에 화일시스템을 만든다.
# newfs -U /dev/mirror/gm0p2
/dev/mirror/gm0p2: 14335.9MB (29360000 sectors) block size 32768, fragment size 4096
using 20 cylinder groups of 740.00MB, 23680 blks, 47360 inodes.
with soft updates
super-block backups (for fsck -b #) at:
192, 1515712, 3031232, 4546752, 6062272, 7577792, 9093312, 10608832, 12124352,
13639872, 15155392, 16670912, 18186432, 19701952, 21217472, 22732992,
24248512, 25764032, 27279552, 28795072
5. 만들어진 미러디스크에 부트블럭을 만들어, 부팅가능하게 만든다.
# gpart bootcode -b /boot/mbr mirror/gm0
bootcode written to mirror/gm0
6. /etc/fstab화일을 수정한다.
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 / ufs rw 1 1
/dev/ada0p3 none swap sw 0 0
# cp /etc/fstab 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
7. 부팅시 커널이 mirror 모듈을 읽어오도록 /boot/loader.conf 화일에 아래 내용을 추가한다. loader.conf 가 없으면 만들어준다.
# vi /boot/loader.conf
geom_mirror_load=”YES”
8. 만들어진 mirror 디스크에 원래 디스크를 dump/restore 한다.
# dump -0aL -f – / | (cd /mnt && restore -rf -)
DUMP: Date of this level 0 dump: Fri Nov 30 02:56:28 2012
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping snapshot of /dev/ada0p2 (/) to standard output
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 1471516 tape blocks.
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
warning: ./.snap: File exists
DUMP: 8.83% done, finished in 3:46 at Fri Nov 30 07:05:12 2012
…
DUMP: 96.18% done, finished in 0:05 at Fri Nov 30 05:29:19 2012
DUMP: DUMP: 1472536 tape blocks
DUMP: finished in 8843 seconds, throughput 166 KBytes/sec
DUMP: DUMP IS DONE
9. 재 부팅 후, 기존 디스크(ada0)를 미러디스크에 참여시킨다.
# gmirror insert gm0 ada0
# gmirror status
Name Status Components
mirror/gm0 DEGRADED ada1 (ACTIVE)
ada0 (SYNCHRONIZING, 0%)# gmirror status
Name Status Components
mirror/gm0 DEGRADED ada1 (ACTIVE)
ada0 (SYNCHRONIZING, 2%)
=================================================================
이후, 아래 내용은, dump/restore 없이 rootdisk 를 미러하는 방법이라고 하는데, 문서대로 진행되지 않고 오류가 발생했다.
참고용으로….
참고문서2: http://lantech.geekvenue.net/chucktips/jason/chuck/1175552464/index_html
위의 참고 문서2에 의하면, freeBSD가 설치되어 있는 하드디스크를 미러하기 위해서는, 아래 과정을 거친다.
Step 1: Use sysctl to allow the mounted disk to be modified
Step 2: Create the mirror on ad0 with gmirror
Step 3: Modify /boot/loader.conf to load gmirror on startup
Step 4: Modify /etc/fstab for gmirror device names
Step 6: Use gmirror insert command to add the 2nd drive for mirroring
Step 7: Check the mirroring status with gmirror status
1. 마운트되어 있는 디스크를 gmirror가 수정가능하기 위해 아래 파라메터를 수정한다.
# sysctl -a | grep kern.geom.debug
kern.geom.debugflags: 0
# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
# sysctl -a | grep kern.geom.debug
kern.geom.debugflags: 16
2. gmirror 커맨드로 미러디바이스 gmd0에 ada0를 추가한다. (gmd0 는 다른 이름으로 바꾸어도 무방하며, 디스크 종류에 따라 ada0가 아닐 수 도 있다)
# gmirror label -v -b round-robin gmd0 /dev/ada0
Metadata value stored on /dev/ada0.
Done.
3. 부팅시 gmirror 가 실행되도록 /boot/loader.conf을 수정한다. 만약 loader.conf가 없다면, 빈 화일을 만들고 아래 내용을 추가한다.
geom_mirror_load=”YES”
4. /etc/fstab 화일을 수정한다.
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 / ufs rw 1 1
/dev/ada0p3 none swap sw 0 0
위의 내용을
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gmd0p2 / ufs rw 1 1
/dev/mirror/gmd0p3 none swap sw 0 0
로 바꿔준다.
5. 만들어준 메타디바이스에 새 디스크(ada1)를 추가한다.
# gmirror insert gmd0 /dev/ada1
gmirror: Class not found
오류나며, 해결되지 않음.
# gpart show
=> 34 31457213 ada0 GPT (15G) [CORRUPT]
34 128 1 freebsd-boot (64k)
162 29360000 2 freebsd-ufs (14G)
29360162 1572864 3 freebsd-swap (768M)
30933026 524221 – free – (256M)=> 63 31457217 ada1 MBR (15G)
63 31456593 1 freebsd [active] (15G)
31456656 624 – free – (312k)=> 0 31456593 ada1s1 BSD (15G)
0 16 – free – (8.0k)
16 31456577 1 !0 (15G)
아래 커맨드로, 디스크 ada0의 파티션을 ada1 으로 복사하여 두 디스크의 파티션을 동일하게 만든다.
# gpart backup ada0 | gpart restore -F ada1
# gpart show
=> 34 31457213 ada0 GPT (15G) [CORRUPT]
34 128 1 freebsd-boot (64k)
162 29360000 2 freebsd-ufs (14G)
29360162 1572864 3 freebsd-swap (768M)
30933026 524221 – free – (256M)=> 34 31457213 ada1 GPT (15G)
34 128 1 freebsd-boot (64k)
162 29360000 2 freebsd-ufs (14G)
29360162 1572864 3 freebsd-swap (768M)
30933026 524221 – free – (256M)# gpart recover ada0
ada0 recovered
freefox# gpart show ada0
=> 34 31457213 ada0 GPT (15G)
34 128 1 freebsd-boot (64k)
162 29360000 2 freebsd-ufs (14G)
29360162 1572864 3 freebsd-swap (768M)
30933026 524221 – free – (256M)
위의 corrupt는 gmirror를 실행하는 과정에서, 오류가나서 삭제하는 과정에서 발생한 것으로 생각된다.