Fwd: Debian RAID-1 installation (was: Re: [SLUG] Enterprise Platform)

Tony Green <[email protected]> Fri, 21 May 2004 13:57:05 +1000
Newsgroups gmane.org.user-groups.slug.pearls
Message-ID <[email protected]>
I think this is a sure contender for pearl status (if it's still around)

Begin forwarded message:

> From: Jamie Wilkinson <[email protected]>
> Date: 21 May 2004 12:53:38 PM
> To: [email protected]
> Subject: Debian RAID-1 installation (was: Re: [SLUG] Enterprise 
> Platform)
>
> This one time, at band camp, Jamie Wilkinson wrote:
>> This one time, at band camp, Howard Lowndes wrote:
>>> OK, so how do I install Debian with RAID and LVM?
>>
>> I can elaborate more later
>
> So here's Anchor's RAID migration document, tweaked for Debian unstable
> (previously it'd only been done on various flavours of Red Hat), based
> on the migration I did last night (and I expect I'll be doing it again
> today on a different machine).
>
> I'm going to skip the parts that migrate an existing RAID configuration
> to bigger disks or an alternate RAID scheme, and instead assume you've
> got two disks in a box and you performed the install onto the first
> disk (hda), thus leaving the second disk (hdb) unused.
>
> * Partition hdb how you like it.  My server partitioning scheme is like
>   this for IDE machines:
>
> hda1    500M    /
> hda2    2G      swap
> hda3    Extended
> hda5    2G      /var
> hda6    4G      /usr
> hda7    remaining   /data
>
> /data contains bind mount points for /home, /var/lib/{mysql,postgres}
>
> * Create a degraded RAID array.
>
>   mdadm -C -l 1 -n 2 /dev/md0 /dev/hdb1 missing
>   mdadm -C -l 1 -n 2 /dev/md1 /dev/hdb5 missing
>   mdadm -C -l 1 -n 2 /dev/md2 /dev/hdb6 missing
>   mdadm -C -l 1 -n 2 /dev/md3 /dev/hdb7 missing
>
>   -l specifies the raid level, in this case RAID-1, and -n specifies 
> the
>   number of devices that will be in the array, in our case 2.  
> 'missing'
>   lets mdadm know that there is another device we haven't specified 
> yet,
>   and the array will be built on one half.
>
>   If you're doing this on RAID-5, then you'd use two disks and a
>   missing.
>
> * Create the new filesystems:
>
>   mke2fs -j /dev/md0
>   ...
>
> * Mount the new partitions.
>
>   mkdir /newroot
>   mount /dev/md0 /newroot
>   cd /newroot
>   mkdir usr var data
>   mount ...
>   mkdir data/var.lib.postgres
>   mkdir -p var/lib/postgres
>   mount -o bind data/var.lib.postgres var/lib/postgres
>
> * Copy the data from the existing root to the new root
>
>   cd /
>   for each mountpoint on the old root:
>     cp -ax $mountpoint/ /newroot/$mountpoint/
>
> * Now comes the fun part.  Shutdown all services that are writing to 
> the
>   disk, using ps ax and netstat -lnp to find out who's still alive.
>
> * Rsync the data that just got written
>
>   for each mountpoint:
>     rsync -avnx $mountpoint/ /newroot/$mountpoint/
>     # double check that did what you thought, then remove the -n option
>
> * Pivot the kernel onto the new root:
>
>   mkdir /newroot/oldroot
>   cd /newroot
>   pivot_root . oldroot
>
>   If you're on the console, you can
>   exec chroot . /bin/sh <dev/console >dev/console 2>&1
>
>   otherwise if you're playing tough-guy-migration via SSH, don't do
>   this, yet
>
>   mount -t proc proc /proc
>   mount -t devpts devpts /dev/pts
>   mount -t tmpfs tmpfs /tmp
>
>   # and for 2.6 kernels
>   mount -t sysfs sysfs /sys
>
> * Restart init and SSH:
>
>   telinit u
>   /etc/init.d/ssh restart
>
>   Now if you're in tough guy mode, ssh into the new machine.
>
>   fuser -vm /oldroot should show you a few kernel threads and your 
> first
>   ssh session.  If the ssh restart was successful and you're logged in,
>   log out of the first ssh session.
>
> * Umount the old root:
>
>   see the processes holding up the umount
>
>   fuser -mv /oldroot
>
>   see the mounts holding up the umount
>   cat /proc/mounts
>
>   umount the virtual filesystems from oldroot:
>
>   umount /oldroot/proc
>   umount /oldroot/dev/pts
>
>   and so on
>
>   Chances are /proc/mounts says you've got a /dev/root.old and a
>   /dev2/root2, and you've got some kernel threads attached to
>   /oldroot/initrd:
>
>   mount -o remount,ro /dev/root.old /oldroot/initrd
>   mount -o remount,ro /dev2/root2 /oldroot
>
>   umount -l /oldroot/initrd
>   umount /oldroot
>
>   The -l to umount is a recent feature that does a lazy umount... it
>   removes the mount point from the mounted filesystems namespaces, so
>   it's effectively gone, but it'll get properly umounted when all
>   processes using it are finished.  It's a good idea to make it
>   read-only first just so you don't break anything.
>
> * Fix /etc/fstab and /etc/mtab
>
>   /etc/fstab has the old hda filesystems on it, so fix that up.
>
>   /etc/mtab has the old devices listed because the pivot_root doesn't
>   update it, so fix that up too.  Cross check against /proc/mounts.
>
> * Update the boot loader.
>
>   Debian unstable uses grub, so somethign like this will install the
>   first stage bootloader into both MBRs:
>
>   grub
>   grub> device (hd0) /dev/hda
>   grub> device (hd1) /dev/hdb
>   grub> root (hd0,0)
>   grub> setup (hd0)
>   grub> root (hd1,0)
>   grub> setup (hd1)
>
>   That tells grub that it's hd0 is Linux's hda, to use hda1 as the
>   location for grubs files (/boot/grub, as /boot is on / in my case)
>   and to install the MBR on /dev/hda.  The second pass is to do the 
> same
>   thing on hdb, using /dev/hdb1 and hdb's MBR.
>
>   double check it worked by looking for the string GRUB in the output
>   of
>
>   dd if=/dev/hdX count=1 | strings
>
> * Fix the initrd
>
>   I always forget this part and end up booting off of half of the /
>   array which has the effect of destroying the raid superblock,
>   requiring /dev/md0 to be reconstructed afterwards.  So the moral is
>   DON'T FORGET THIS PART.
>
>   mkinitrd -k -o /boot/initrd.img.tmp
>
>   Look in the temporary directory that mkinitrd left its files in,
>   /tmp/mkinitrd.*/initrd and make sure that the file 'script' contains 
> a
>   line that builds the /dev/md0 array, like this:
>   mdadm -A /devfs/md/0 -R -u ...
>   It'll probably be building it using only /dev/hdb1 at this moment,
>   that's fine.
>
> * Fix mdadm.conf.
>
>   /etc/init.d/mdadm and /etc/init.d/mdadm-raid will automagically build
>   the remaining arrays at boot time if you get this right, otherwise 
> the
>   fsck will bomb out because /dev/md1 and friends are corrupted (i.e.
>   don't really exist)
>
>   So, in /etc/mdadm/mdadm.conf:
>
>   DEVICE /dev/hda* /dev/hdb*
>   ARRAY /dev/md0 devices=/dev/hda1,/dev/hdb1
>   ARRAY /dev/md1 devices=/dev/hda5,/dev/hdb5
>   ARRAY /dev/md2 devices=/dev/hda6,/dev/hdb6
>   ARRAY /dev/md3 devices=/dev/hda7,/dev/hdb7
>
>   Make sure you remember the DEVICE line, otherwise it'll still fail...
>
> * Reconstruct the RAID array from the now free hda
>
>   sfdisk -d /dev/hdb | sfdisk /dev/hda
>
>   That'll copy the partition table from hdb, your good disk, to hda, 
> the
>   missing disk.
>
>   Hot add the partitions to the array:
>
>   mdadm -a /dev/md0 /dev/hda1
>   mdadm -a /dev/md1 /dev/hda5
>   mdadm -a /dev/md2 /dev/hda6
>   mdadm -a /dev/md3 /dev/hda7
>
>   ramp up the reconstruction speed:
>
>   echo 1000000000 > /proc/sys/dev/raid/speed_limit_max
>
>   watch the progress:
>
>   watch "cat /proc/mdstat"
>
> * Do the boot loader again, because it's fun, and likely stuff has 
> moved
>   around on hda1.
>
>   Don't do anything on hda until the raid reconstruction is finished.
>
>
> At this point you can continue using the machine, in fact as early as
> the umount oldroot step you can restart all your services and the
> machine will be back online: that's a downtime of only as long as it
> takes to do the final rsync before pivoting.
>
> I'd recommend rebooting soon after though so yuo can make sure you got
> the bootloader and initrd part right.  During booting you can get away
> with changing the kernel root= option to use /dev/hda1 if the raid 
> array
> isn't getting constructed in your initrd.img.tmp, and don't delete or
> overwrite any of your initrds whilst you're debugging, only once it
> boots without assistance should you overwrite the initrd.img that's
> listed in the grub menu.lst.
>
> -- 
> [email protected]                           
> http://spacepants.org/jaq.gpg
> -- 
> SLUG - Sydney Linux User's Group Mailing List - http://slug.org.au/
> Subscription info and FAQs: http://slug.org.au/faq/mailinglists.html
>
-- 
Tony Green <[email protected]>

-- 
SLUG Pearls
http://lists.slug.org.au/listinfo/pearls