Friday, 14 Sep, 2012 md-software-raid As promised, here's the follow-up of the previous article, about the addition of a new hdd to you single hdd install of Ubuntu Server, and the subsequent RAID 1 configuration with mdadm. To be on par with what I'm talking about, you should read my previous post. I'll be straight with some hands-on. root@wssrv1:/home/blackmetal# fdisk -l /dev/sdd Disco /dev/sdd: 160.0 GB, 160041885696 byte 255 heads, 63 sectors/track, 19457 cylinders Units = cilindri of 16065 * 512 = 8225280 bytes Disk identifier: 0x00087cdc Dispositivo Boot Start End Blocks Id System /dev/sdd1 * 1 122 979933+ 83 Linux /dev/sdd2 123 18358 146480670 83 Linux /dev/sdd3 18359 18601 1951897+ 82 Linux swap / Solaris /dev/sdd4 18602 19457 6875820 83 Linux The additional disk is a similar one, with the same 160.0 GB size, void and unformatted. I could have used a different sized one (yes, you can have RAID 1 between, say, a 160Gb and a 250Gb one), the only difference is that the resulting RAID array is constrained in size to the smallest disk. Some hands-on now: root@wssrv1:/home/blackmetal# fdisk /dev/sde let's press p to see the situation on that disk. (p, ENTER) Disco /dev/sde: 160.0 GB, 160041885696 byte 255 heads, 63 sectors/track, 19457 cylinders Units = cilindri of 16065 * 512 = 8225280 bytes Disk identifier: 0x02e4e15c Dispositivo Boot Start End Blocks Id System OK, this shows us the disk is blank and unpartitioned: you'll need to create the same sdd partition table structure here, with one exception: the partitions' type should be set to Linux RAID (the code representing the Linux RAID type is “fd”). Let's open fdisk on the new disk and let's input some commands: fdisk /dev/sde then let's feed fdisk with the following commands: (o, ENTER) → will make a new partition table. (n, p, 1, 1, 122) → will create the first partition (on my case is the /boot partition). (n, p, 2, ENTER, 18358) → will create the secon partition (on my case this is the SLASH partition). (n, p, 3, ENTER, 18601) → will create the third partition (on my case this is the swap partition). (n, p, ENTER, ENTER) → will create the last partition (on my case this is the /tmp partition). If you're with me till now, is now time to specify what type this partitions should be, so let's type, inside fdisk: (t, 1, fd) → will make the /boot as Linux RAID (t, 2, fd) → will make the / as Linux RAID (t, 3, 82) → wil make the swap...swap type (t, 4, fd) → will male the tmp as Linux RAID Let's add the BOOT FLAG on the new HD: (a, 1) → will switch the boot flag ON To be sure everything is correct let's print the disk's partition table: (p, ENTER) Disco /dev/sde: 160.0 GB, 160041885696 byte 255 heads, 63 sectors/track, 19457 cylinders Units = cilindri of 16065 * 512 = 8225280 bytes Disk identifier: 0x86d37230 Dispositivo Boot Start End Blocks Id System /dev/sde1 * 1 122 979933+ fd Autorilevamento raid di Linux /dev/sde2 123 18358 146480670 fd Autorilevamento raid di Linux /dev/sde3 18359 18601 1951897+ 82 Linux swap / Solaris /dev/sde4 18602 19457 6875820 fd Autorilevamento raid di Linux If everything is fine, we're finally done, let's write the settings on the disk's partion table: (w, ENTER) OK, now we should install mdadm, so let's get it: apt-get install initramfs-tools mdadm Let's reboot the system to be sure all the necessary md modules get loaded. Fine, at this point we have two similar disks with the same partition table and mdadm installed; take care and review the previous steps and make sure everything is the same. The next step consists of creating the RAID 1 array between the respective partitions. We'll use the handy mdadm command line tool. Since we have four partitions to put on RAID, in the end we'll have: md0 → /boot md1 → / md2 → swap md3 → /tmp so let's type: mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sde1 mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sde2 mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sde3 mdadm --create /dev/md3 --level=1 --raid-disks=2 missing /dev/sde4 Now we need to create a File System on the arrays (remember that with fdisk we created the disk's partition table, now it's time for some real filesystem): mkfs.ext3 /dev/md0 mkfs.ext3 /dev/md1 mkswap /dev/md2 mkfs.ext3 /dev/md3 We need to load at boot time the actual array, so to store the settings inside the mdadm.conf file we can launch this command: mdadm --examine --scan >> /etc/mdadm/mdadm.conf To be sure it's OK, we should see at EOF something like that: cat /etc/mdadm/mdadm.conf [...] ARRAY /dev/md0 level=raid1 num-devices=2 UUID=09537bd5:b63d7a70:9a857d35:0291bc81 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=f7b7e6a0:fb35d21a:9a857d35:0291bc81 ARRAY /dev/md2 level=raid1 num-devices=2 UUID=aafe9a7b:9719077a:9a857d35:0291bc81 ARRAY /dev/md3 level=raid1 num-devices=2 UUID=8c893d7d:67d7a5c3:9a857d35:0291bc81 ...and verify at EOF if there is mdX entries similar to the ones shown here. Now we need to copy the contents of the running, non-RAID system, inside the array, so we need to mount the array and copy the system as-is. For this task I'd use rsync with my fav options ([LINK ARTICOLO RSYNC] -aHhv –progress with the exception of adding the additional -x option to keep the program scan only a filesystem boundary). So let's create the mount points somewhere and let's mount the md devices: mkdir /mnt/md0 mkdir /mnt/md1 mkdir /mnt/md3 mount /dev/md0 /mnt/md0 mount /dev/md1 /mnt/md1 mount /dev/md3 /mnt/md3 (no need to mount swap). Before tranfering the files, we need to update the fstab with the new informations, First let's make a backup copy of the files: cp /etc/fstab /etc/fstab.ori cp /etc/mtab /etc/mtab.ori let's collect the UUIDs from the arrays: blkid /dev/md0 /dev/md0: UUID="78b45131-7946-4989-8398-f06146c0f4de" TYPE="ext3" root@wssrv1:/home/blackmetal# blkid /dev/md1 /dev/md1: UUID="604dbec8-d6e5-4bd4-a10e-21b951708c63" TYPE="ext3" root@wssrv1:/home/blackmetal# blkid /dev/md2 /dev/md2: UUID="7fed7933-e14e-4e69-870c-889573861e73" TYPE="swap" root@wssrv1:/home/blackmetal# blkid /dev/md3 /dev/md3: UUID="4e8a252f-55f1-438e-9cbd-014d7d610555" TYPE="ext3" and the let's edit the fs files, essentially replacing sddX with mdX: vi /etc/fstab root@wssrv1:/home/blackmetal# cat /etc/fstab # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # /dev/md0 = sdd1 + sde1 -> /boot UUID=78b45131-7946-4989-8398-f06146c0f4de /boot ext3 relatime 02 # /dev/md1 = sdd2 + sde2 -> / UUID=604dbec8-d6e5-4bd4-a10e-21b951708c63 / ext3 relatime,errors=remount-ro 0 1 # /dev/md2 = sdd3 + sde3 -> swap UUID=7fed7933-e14e-4e69-870c-889573861e73 none swap sw 0 0 # /dev/md3 = sdd4 + sde4 -> /tmp UUID=4e8a252f-55f1-438e-9cbd-014d7d610555 /tmp ext3 relatime 0 2 # dvd-rw /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0 Now let's edit the mtab, by replacing the /dev/sddX with the respective mdX: vi /etc/mtab root@wssrv1:/home/blackmetal# cat /etc/mtab /dev/md1 / ext3 rw,relatime,errors=remount-ro 0 0 proc /proc proc rw,noexec,nosuid,nodev 0 0 /sys /sys sysfs rw,noexec,nosuid,nodev 0 0 varrun /var/run tmpfs rw,noexec,nosuid,nodev,mode=0755 0 0 varlock /var/lock tmpfs rw,noexec,nosuid,nodev,mode=1777 0 0 udev /dev tmpfs rw,mode=0755 0 0 devshm /dev/shm tmpfs rw 0 0 devpts /dev/pts devpts rw,gid=5,mode=620 0 0 /dev/md0 /boot ext3 rw,relatime 0 0 /dev/md3 /tmp ext3 rw,relatime 0 0 securityfs /sys/kernel/security securityfs rw 0 0 binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,noexec,nosuid,nodev 0 0 We now need to update the menu.lst from grub to reflect the changes, so let's edit it and apply the changes accordingly: vi /boot/grub/menu.lst [...] title Ubuntu 8.04.1, kernel 2.6.24-19-server root (hd1,0) kernel /vmlinuz-2.6.24-19-server root=UUID=604dbec8-d6e5-4bd4-a10e-21b951708c63 ro quiet splash initrd /initrd.img-2.6.24-19-server quiet title Ubuntu 8.04.1, kernel 2.6.24-19-server (recovery mode) root (hd1,0) kernel /vmlinuz-2.6.24-19-server root=UUID=604dbec8-d6e5-4bd4-a10e-21b951708c63 ro single initrd /initrd.img-2.6.24-19-server title Ubuntu 8.04.1, memtest86+ root (hd1,0) kernel /memtest86+.bin quiet ### END DEBIAN AUTOMAGIC KERNELS LIST Now we need to update the ramdisk: update-initramfs -u OK, time to transfer files from the running system to the new RAID 1 system with rsync: cd / && rsync -axHhv --progress / /mnt/md1 cd /boot && rsync -axHhv --progress . /mnt/md0 cd /tmp && rsync -axHhv --progress . /mnt/md2 As soon as the transfer is done, now it is time to setup grub; so let's launch it from the command line, and let's apply all the settings: grub (from inside grub) root (hd0,0) setup (hd0) root (hd1,0) → root (hd1,0) setup (hd1) → setup (hd1) Checking if "/boot/grub/stage1" exists... no Checking if "/grub/stage1" exists... yes Checking if "/grub/stage2" exists... yes Checking if "/grub/e2fs_stage1_5" exists... yes Running "embed /grub/e2fs_stage1_5 (hd2)"... 16 sectors are embedded. succeeded Running "install /grub/stage1 (hd2) (hd2)1+16 p (hd2,0)/grub/stage2 /grub/menu.lst"... succeeded Done. PERSONAL NOTE – just ignore it! I have an IDE disk and two SATA disks wich I'm putting on RAID; on my case, I had to specify the disk as HD2,0 instead than HD1,0, and so I needed to correct the grub menu.lst accordingly. At this point, if everything was set correctly, It's time to reboot, so close your shells and cross your fingers! reboot && logout Rate this post Andrea MatesiSenior Professional Network and Computer Systems Engineer during work hours and father when home. Andrea strives to deliver outstanding customer service and heaps of love towards his family. In this Ad-sponsored space, Andrea shares his quest for "ultimate" IT knowledge, meticulously brought to you in an easy to read format. Share this:LinkedIn Related