User Tools

Site Tools


ubuntu-raid1-conversion

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
ubuntu-raid1-conversion [2009/10/29 12:01] snargubuntu-raid1-conversion [2009/10/30 17:46] (current) snarg
Line 1: Line 1:
 =====Converting a single disk Ubuntu system to RAID1 (adding a second disk)===== =====Converting a single disk Ubuntu system to RAID1 (adding a second disk)=====
 ===Created for Phil, using Ubuntu 9.10 Karmic Koala=== ===Created for Phil, using Ubuntu 9.10 Karmic Koala===
-This Procedure will take a standard install of Ubuntu, and mirror it to a spare hard disk, forming a RAID-1 array. Ubuntu by default on a standard install has 2 partitions. One for the root (/) filesystem and one for swap space. This procedure sets up individual raid arrays for each of these (root filesystem and swap). This procedure makes heavy use of the linux shell (terminal). In Ubuntu you can load a terminal from the Applications menu, under Accessories.  Insert diagram of old versus new setup here..+This Procedure will take a standard install of Ubuntu, and mirror it to a spare hard disk, forming a RAID-1 array. Ubuntu by default on a standard install has 2 partitions. One for the root (/) filesystem and one for swap space. This procedure sets up individual raid arrays for each of these (root filesystem and swap). This procedure makes heavy use of the linux shell (terminal). In Ubuntu you can load a terminal from the Applications menu, under Accessories.  
 +\\ 
 +\\ 
 + 
 +{{:ubuntu-raid1-conversion-before-and-after.png|}}
  
 ==1. Determine device names to be used in the procedure.== ==1. Determine device names to be used in the procedure.==
Line 20: Line 24:
 Command (m for help): p Command (m for help): p
  
-Disk /dev/sdb: 500.1 GB, 500107862016 bytes +Disk /dev/sdb: 40.1 GB, 40020664320 bytes 
-255 heads, 63 sectors/track, 60801 cylinders+255 heads, 63 sectors/track, 4865 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes Units = cylinders of 16065 * 512 = 8225280 bytes
 Disk identifier: 0xeea1cf79 Disk identifier: 0xeea1cf79
Line 132: Line 136:
 Note the "missing" keyword. This tells mdadm to start the array, even though it only has one device (aka "degraded"). The "-l 1" sets it to RAID level 1 (mirroring) and the "-n 2" tells it there will be 2 devices in the array. The devices are "/dev/sdb2" and "missing". Note the "missing" keyword. This tells mdadm to start the array, even though it only has one device (aka "degraded"). The "-l 1" sets it to RAID level 1 (mirroring) and the "-n 2" tells it there will be 2 devices in the array. The devices are "/dev/sdb2" and "missing".
  
-==6. Format the new arrays==+==6. Update RAID UUIDs in config file (mdadm.conf) and create new initramfs.== 
 +In this step we will edit the RAID config file to tell it in the bootup procedure that it needs to assemble a software raid array. First we need to find the UUIDs (unique identifier IDs) of the raid arrays.  
 +<code> 
 +sudo mdadm --query --detail /dev/md0 | grep UUID 
 +</code> 
 +Repeat for /dev/md1: 
 +<code> 
 +sudo mdadm --query --detail /dev/md1 | grep UUID 
 +</code> 
 +Open a new terminal window and type the following: 
 +<code> 
 +sudo nano /etc/mdadm/mdadm.conf 
 +</code> 
 +Nano is a simple text editor. Navigate down to the comment "#definitions of existing MD arrays" and insert under it a couple of ARRAY lines as per the  following example. The UUIDs in the example are examples only. Copy and paste the UUIDs from the other terminal window you have open, into your ARRAY lines: 
 +<code> 
 +# definitions of existing MD arrays 
 +ARRAY /dev/md0 uuid=997fffd8:96fc292b:9cfa26d1:6098b1cf 
 +ARRAY /dev/md1 uuid=02b854fd:6358775f:9cfa26d1:6098b1cf 
 +</code> 
 +Ensure that you've copy and pasted the RAID UUIDs precicely, and that you haven't missed any characters. 
 +Press CTRL+X to save the file and exit the nano text editor. 
 +We now run the following command to compile the initramfs - which is one of the first things that loads when you boot your pc (just after the kernel is loaded into memory) 
 +<code> 
 +sudo update-initramfs -u 
 +</code> 
 +==7. Format the new arrays==
 The first array (/dev/md0) will be formatted as ext4 filesystem, and the second array (/dev/md1) will be formatted as swap space. Here are the commands: The first array (/dev/md0) will be formatted as ext4 filesystem, and the second array (/dev/md1) will be formatted as swap space. Here are the commands:
 <code> <code>
Line 141: Line 170:
 The tune2fs command sets a couple of parameters on the filesystem (turns off "checking" it every 30 boots or 180 days) The tune2fs command sets a couple of parameters on the filesystem (turns off "checking" it every 30 boots or 180 days)
  
-==7. Mount the new root array to a mountpoint==+==8. Mount the new root array to a mountpoint==
 We now need to mount the newly created ext4 filesystem in /dev/md0 to a mountpoint (which means we first need to make a mountpoint). A mountpoint is a location in which a filesystem is attached, very similar to the "drive letter" concept in windows. The following commands create a mountpoint, and mount the new empty fileystem we created in the prevous step. We now need to mount the newly created ext4 filesystem in /dev/md0 to a mountpoint (which means we first need to make a mountpoint). A mountpoint is a location in which a filesystem is attached, very similar to the "drive letter" concept in windows. The following commands create a mountpoint, and mount the new empty fileystem we created in the prevous step.
 <code> <code>
Line 161: Line 190:
 </code> </code>
  
-==8. Bind-mount the old partition to a mountpoint==+==9. Bind-mount the old partition to a mountpoint==
 To help in the copy process (so we dont have recursive directories) we are going to bind-mount the current root filesystem to a new mountpoint, which we will first make. This step assumes we are still working in the /mnt directory (we changed to it in the prevous step). To help in the copy process (so we dont have recursive directories) we are going to bind-mount the current root filesystem to a new mountpoint, which we will first make. This step assumes we are still working in the /mnt directory (we changed to it in the prevous step).
 <code> <code>
Line 169: Line 198:
 You can confirm this has worked by typing "ls /mnt/temp-oldroot" and confirming it looks the same as "ls /" You can confirm this has worked by typing "ls /mnt/temp-oldroot" and confirming it looks the same as "ls /"
  
-==9. Copy the data from old root partition to new root array.==+==10. Copy the data from old root partition to new root array.==
 Here's the command to copy data from the old (current) root filesystem to the new empty root filesystem on the RAID-1 array (/dev/md0). This assumes our current working directory is still /mnt. You probably want to close any open programs as much as possible before you copy all the files. Here's the command to copy data from the old (current) root filesystem to the new empty root filesystem on the RAID-1 array (/dev/md0). This assumes our current working directory is still /mnt. You probably want to close any open programs as much as possible before you copy all the files.
 <code> <code>
Line 176: Line 205:
 You should see a verbose display of files (thats what the -v is) copied. Wait for this to finish. You should see a verbose display of files (thats what the -v is) copied. Wait for this to finish.
  
-==10. Adjust UUIDs in /etc/fstab to point to the new arrays==+==11. Adjust filesystem UUIDs in /etc/fstab to point to the new arrays==
 We now need to edit the linux file system table (fstab) in the NEW filesystem on the RAID array, so that when the system boots up, it will be mounting the RAID array (/dev/md0) and not the first hard disk (/dev/sda1) as the root filesystem (/). We now need to edit the linux file system table (fstab) in the NEW filesystem on the RAID array, so that when the system boots up, it will be mounting the RAID array (/dev/md0) and not the first hard disk (/dev/sda1) as the root filesystem (/).
    
Line 185: Line 214:
 </code> </code>
 Now go back to the original terminal window and type: Now go back to the original terminal window and type:
 +<code>
 sudo nano /mnt/temp-newroot/etc/fstab sudo nano /mnt/temp-newroot/etc/fstab
 </code> </code>
-Nano is a simple text editor. Navigate down to the first "UUID=" line. It will look similar (but not identical - remember it's a "unique" identifier) to the following (note the single / after the UUID, signifying this is for the root filesystem):+Navigate down to the first "UUID=" line. It will look similar (but not identical - remember it's a "unique" identifier) to the following (note the single / after the UUID, signifying this is for the root filesystem):
 <code> <code>
 UUID=470118f4-59ec-466a-b8d4-ed46345b1aae /               ext4    errors=remount-ro 0       1 UUID=470118f4-59ec-466a-b8d4-ed46345b1aae /               ext4    errors=remount-ro 0       1
Line 200: Line 230:
 Use CTRL+W to save the fstab and exit nano text file editor. Use CTRL+W to save the fstab and exit nano text file editor.
  
-==11. Adjust UUID in /boot/grub/menu.lst to point to the new arrays== +==12. Adjust UUID in /boot/grub/menu.lst to point to the new root array== 
-This is a temporary step that will cause the bootloader to look +This step will cause the bootloader to load up using the raid array (/dev/md0) instead of the old drive (/dev/sda1). This change is only temporary, as we are editting the file on the OLD root partition. We will fix this to be permanent once we reboot into the new system
-==12. Unmount filesystems, reboot into new root array.== +<code> 
-==13. Change partition type labels on first drive to "linux raid autodetect"== +sudo nano /boot/grub/grub.cfg 
-==14. Add old drive root partition to the new root array - making it redundant.== +</code> 
-==15Add the second member (first drive) of the swap array, making it redundant.== +Look for the section that refers to the first boot menu entryYou're looking for a couple of lines that look like this: 
-==16Watch some rebuild stats. - all done.==+<code> 
 +     search --no-floppy --fs-uuid --set 470118f4-59ec-466a-b8d4-ed46345b1aae 
 +     linux   /boot/vmlinuz-2.6.31-14-generic root=UUID=470118f4-59ec-466a-b8d4-ed46345b1aae ro   quiet splash 
 +</code> 
 +Replace the both the UUID's on those lines with the UUID for /dev/md0, as descovered in the previous steps, then save the file and exit with CTRL+X
  
 +==13. Unmount filesystems, reboot into new root array.==
 +We are now ready to unmount the new filesystem and reboot into it. Run this:
 +<code>
 +sudo umount /mnt/temp-oldroot
 +sudo umount /mnt/temp-newroot
 +sudo reboot
 +</code>
 +Which should, if you've done everything correctly, reboot into the new system.
 +Once booted, confirm you're running from the new RAID-1 array (/dev/md0) by going to a terminal and typing "df -h" and noting the root filesystem line should be pointing at /dev/md0:
 +<code>
 +~$ df -h
 +Filesystem            Size Used Avail Use% Mounted on
 +/dev/md0               36G  2.8G   31G   9% /
 +udev                  249M  252K  249M   1% /dev
 +none                  249M  136K  249M   1% /dev/shm
 +none                  249M  116K  249M   1% /var/run
 +none                  249M      249M   0% /var/lock
 +none                  249M      249M   0% /lib/init/rw
 +</code>
 +<code>
 +By typing "cat /proc/swaps" you should see /dev/md1 as the only swap area:
 +~$ cat /proc/swaps
 +Filename                                Type            Size    Used    Priority
 +/dev/md1                                partition       1493880 0       -1
 +</code>
 +
 +==14. Change partition type labels on first drive to "linux raid autodetect"==
 +Almost There! Now that we are successfully booted up using the new array, we need to convert the old disk (/dev/sda) to become part of the RAID1 arrays, making them redundant. First of all, use fdisk to change the partition types to "Linux raid autodetect"
 +<code>
 +sudo fdisk /dev/sda
 +</code>
 +Using the fdisk commands (which should be familiar by now), change the partition types labels, then save and exit:
 +<code>
 +Command (m for help): t
 +Partition number (1-5): 1
 +Hex code (type L to list codes): fd
 +Changed system type of partition 1 to fd (Linux raid autodetect)
 +
 +Command (m for help): t
 +Partition number (1-5): 5
 +Hex code (type L to list codes): fd
 +Changed system type of partition 5 to fd (Linux raid autodetect)
 +
 +Command (m for help): p
 +
 +Disk /dev/sda: 40.0 GB, 40020664320 bytes
 +255 heads, 63 sectors/track, 4865 cylinders
 +Units = cylinders of 16065 * 512 = 8225280 bytes
 +Disk identifier: 0xdcf4dcf4
 +
 +   Device Boot      Start         End      Blocks   Id  System
 +/dev/sda1                    4679    37584036   fd  Linux raid autodetect
 +/dev/sda2            4680        4865     1494045    5  Extended
 +/dev/sda5            4680        4865     1494013+  fd  Linux raid autodetect
 +
 +Command (m for help): w
 +The partition table has been altered!
 +
 +Calling ioctl() to re-read partition table.
 +
 +WARNING: Re-reading the partition table failed with error 16: Device or resource
 + busy.
 +The kernel still uses the old table. The new table will be used at
 +the next reboot or after you run partprobe(8) or kpartx(8)
 +Syncing disks.
 +</code>
 +==15. Add old drive root partition to the new root array - making it redundant.==
 +This is a one-liner:
 +<code>
 +sudo mdadm --manage /dev/md0 --add /dev/sda1
 +</code>
 +==16. Add the second member (first drive) of the swap array, making it redundant.==
 +Also a one-liner:
 +<code>
 +sudo mdadm --manage /dev/md1 --add /dev/sda5
 +</code>
 +==17. Watch some rebuild stats. Dont forget the important last step.==
 +
 +Type "cat /proc/mdstat"  to get an idea of how the resync of both RAID-1 arrays is going. You can run this command as many times as you like, to monitor the progress. At the end of the resync, both arrays should show "[UU]" instead of "[U_]"
 +
 +<code>
 +$ cat /proc/mdstat 
 +Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
 +md1 : active raid1 sda5[2] sdb5[0]
 +      1493888 blocks [2/1] [U_]
 +        resync=DELAYED
 +      
 +md0 : active raid1 sda1[2] sdb1[0]
 +      37583936 blocks [2/1] [U_]
 +      [>....................]  recovery =  1.1% (415488/37583936) finish=35.7min speed=17312K/sec
 +      
 +unused devices: <none>
 +</code>
 +
 +==18. Final update to the bootloader to account for the first drive being changed.==
 +Use nano to edit your /boot/grub/device.map
 +<code>
 +sudo nano /boot/grub/device.map
 +</code>
 +And make sure it looks like this: (note this should be the same as your bios hard disk boot order)
 +<code>
 +(hd0)   /dev/sda
 +(hd1)   /dev/sdb
 +</code>
 +Type this to finalise the bootloader config and Master Boot Record on both hard disks:
 +<code>
 +sudo update-grub
 +sudo grub-install /dev/sda
 +sudo grub-install /dev/sdb
 +</code>
 +\\
 +ALL DONE!!
 +\\
 +update- 20091030 - Please note that at time of writing there is a bug in GRUB 1.97 which causes a boot delay of about 10-20 seconds for boot partitions on RAID-1. This is a known problem and is being worked on. Please see: [[https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/396564]]
ubuntu-raid1-conversion.1256788871.txt.gz · Last modified: 2009/10/29 12:01 by snarg