Date: Mon, 17 Dec 2007 15:58:53 -0800 From: "Brendon Janos" <brendonj.lists@gmail.com> To: freebsd-geom@freebsd.org Subject: gmirror RAID-1 of 2-slices/disk? (not just 1 slice, not whole-disk ... ) Message-ID: <d6547d580712171558v174eea78kba64f24b9346e05b@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
Hi, I've an amd64 box w/ two identical SATA drives, ad4 & ad6. I've installed FreeBSD 6.2-RELEASE-p9 SMP onto two slices on ad4, partitioned as: ad4s1: / /swap /usr /tmp ad4s2: /var/ /var/db /var/spool /home "All" I'd like to accomplish is to mirror each ad4 slice to ad6. I *thought* this was going to be straighforward ... In addition to spending the weekend poring over threads here, and everything else I could google, I've 'landed' @ these 3 primary references, http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/geom-mirror.html http://people.freebsd.org/~rse/mirror/ http://ezine.daemonnews.org/200502/diskmirror.html Although generally helpful, they all detail whole-disk mirrors, and mention -- without 'howto' detail -- slice mirrors. I've attempted (detail below) to adapt the procedures to my 2-slice scenario; unfrotunately, after slogging through, on reboot, at various times I'm greeted by either: (1) a 'mountroot>' prompt, with a suddenly, completely non-responsive keyboard (2) an error message: "THE FOLLOWING FILE SYSTEMS HAD AN UNEXPECTED INCONSISTENCY ... Unknown Error. Help!" As poignantly punctuated by the "Unknown Error. Help!", I've obviously done something wrong. Can someone please take a look at what I've done and suggest appropriate corrections & improvements? Or, should I be using gvinum? (Yes, I'm aware this all is 'tortured' ... which is consistent with my current state!) Thanks. Brendon # Assign VARs setenv d1 "ad4" setenv d2 "ad6" setenv gm "gm0" # zero out the 2nd disk dd if=/dev/zero of=/dev/${d2} bs=512 count=79 # find the START & SIZE of each source slice setenv start_s1 `fdisk /dev/${d1} | grep -A4 'partition 1' | grep 'start ' |\ head -1 | sed -e 's;^.*start \([0-9]*\).*$;\1;'` setenv start_s2 `fdisk /dev/${d1} | grep -A4 'partition 2' | grep 'start ' |\ head -1 | sed -e 's;^.*start \([0-9]*\).*$;\1;'` setenv size_s1 `fdisk /dev/${d1} | grep -A4 'partition 1' | grep ', size ' |\ head -1 | sed -e 's;^.*size \([0-9]*\).*$;\1;'` setenv size_s2 `fdisk /dev/${d1} | grep -A4 'partition 2' | grep ', size ' |\ head -1 | sed -e 's;^.*size \([0-9]*\).*$;\1;'` # decrement the size of each slice by 1 setenv size_s1 `expr $size_s1 - 1` setenv size_s2 `expr $size_s2 - 1` # create an FDISK config file for the target drive slices cat << EOF > /tmp/fdisk_conf g c16383 h16 s63 a 1 p 1 165 $start_s1 $size_s1 p 2 165 $start_s2 $size_s2 p 3 0 0 0 p 4 0 0 0 EOF # create the target slices, loading a FreeBSD boot0 MBR into the active slice fdisk -v -f/tmp/fdisk_conf -b/boot/boot0 -i /dev/${d2} # assign gmirror labels to each target slice gmirror label -v -n -b round-robin ${gm}s1 /dev/${d2}s1 gmirror label -v -n -b round-robin ${gm}s2 /dev/${d2}s2 # load gmirror load # check gmirror status Name Status Components mirror/gm0s1 COMPLETE ad6s1 mirror/gm0s2 COMPLETE ad6s2 # place BSD partition disklabels onto gmirror slices # reformatted, because I simply couldn't read the reference # modified to sort partitions by OFFSET, so size corrections don't bomb #!/bin/sh for S in 1 2 do (bsdlabel /dev/mirror/${gm}s${S} | grep 'c:'; \ bsdlabel /dev/${d1}s${S} | grep '[abdefgh]:' | sort -k 3n ; \ ) | \ awk 'BEGIN { sizeC = 0; n = 0; } \ /c:/ { \ partC = $1; \ sizeC = $2; \ offsetC = $3; \ fstypeC = $4; \ fsizeC = $5; \ bsizeC = $6; \ printf("%s %d %s %s %s %s\n", \ partC, \ sizeC, \ offsetC, \ fstypeC, \ fsizeC, \ bsizeC ); \ next;} \ /[abdefgh]:/ { \ part = $1; \ size = $2; \ offset = $3; \ fstype = $4; \ fsize = $5; \ bsize = $6; \ if (sizeC > 0 && n+size > sizeC) { size = sizeC-n }; \ n += size; \ printf("%s %d %s %s %s %s\n", \ part, \ size, \ offset, \ fstype, \ fsize, \ bsize ); }' > /tmp/bsdlabel_s${S}.txt bsdlabel -R /dev/mirror/${gm}s${S} /tmp/bsdlabel_s${S}.txt done # dump & restore filesystem data from first to second disk #!/bin/sh for S in 1 2 do for P in `bsdlabel /dev/${d1}s${S} | egrep '^ *[adefgh]:' | sed -e 's/^ *\([adefgh]\).*/\1/'` do FS=`egrep "^ */dev/${d1}s${S}${P}" /etc/fstab | awk '{ print $2; }'` newfs -U /dev/mirror/${gm}s${S}${P} && \ mount /dev/mirror/${gm}s${S}${P} /mnt${FS} && \ dump -L -0 -f- ${FS} | (cd /mnt$FS && restore -r -v -f-) done done # crete a gmirror-aware fstab sed -e "s;dev/${d1}s1;dev/mirror/${gm}s1;g" \ </mnt/etc/fstab >/tmp/fstab.gmirror sed -e "s;dev/${d1}s2;dev/mirror/${gm}s2;g" \ </tmp/fstab.gmirror >/mnt/etc/fstab # load the mirro on boot echo 'geom_mirror_load="YES"' > /boot/loader.conf # instruct boot stage 2 loader on first disk to boot # with the boot stage 3 loader from the second disk echo "1:ad(6,1,a)/boot/loader" > /boot.config # reboot system shutdown -r now AND, the errors as mentioned above ...
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d6547d580712171558v174eea78kba64f24b9346e05b>