Ubuntu: Migrate to Grub2
This howto has been written to document a migration path from how I used to partition my servers, to my current partitioning scheme.
I used to use a USB flash disk to contain the /boot partition. Usually I would have a RAID-1 with the LVM taking the entire block devices. While using the entire block device is possible, it does not allow any space for a bootloader on the disk. The USB boot had the advantage of keeping the kernel and initial ramdisk on a disk that was outside of the raid and LVM subsystem. This was important while using grub-legacy as it did not understand LVM. Since Grub2 now understands LVM and some raid modes, it is now possible to have everything inside of a LVM, so we can ditch the USB disk requirement.
Make sure you have a backup before you attempt this procedure
Contents
Collect Information
Get the Raid information
[email protected]:~# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sda[0] sdb[1] 976762496 blocks [2/2] [UU] unused devices: <none>
This tells us that we have a Raid-1 (mirror) with two disks and the raid array is md0. Since a Raid-1 is made up of two identical disks, we have the option of splitting the raid array, creating a new array with one of the disks and then moving the LVM to the new array.
Get the LVM information
[email protected]:~# pvscan PV /dev/md0 VG lvmname lvm2 [931.51 GiB / 714.51 GiB free] Total: 1 [931.51 GiB] / in use: 1 [931.51 GiB] / in no VG: 0 [0 ]
This tells us that we have a LVM with the name lvnname. This particular LVM is 931.51GB in size, but of that, 714.51GB is free space. The destination drive therefore needs to be 217GB minimum.
Split the Raid-1
Fail one of the disks. In this case it will be /dev/sdb
[email protected]:~# mdadm --manage --fail /dev/md0 /dev/sdb
Remove the failed drive from the array
[email protected]:~# mdadm --remove /dev/md0 /dev/sdb
Create a new Raid-1 with the spare disk
Sanitise the removed disk by removing the raid superblock
[email protected]:~# mdadm --misc --zero-superblock /dev/sdb
Partition the removed disk
[email protected]:~# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xd85c2e05. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-121601, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-121601, default 121601): Using default value 121601 Command (m for help): t Selected partition 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux RAID autodetect) Command (m for help): a Partition number (1-4): 1 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Create a new Raid-1 with the removed disk
[email protected]:~# mdadm --create --level=1 --raid-devices=2 /dev/md1 /dev/sdb1 missing mdadm: array /dev/md1 started.
Migrate LVM
The good news is that you can migrate the entire LVM while the system is running. The bad news is that it is a block level copy of all allocated blocks, so if you have a 1TB logical volume that has an empty filesystem in it, you will still be moving 1TB of data between disks. It can be slow. You have been warned.
Create the new physical volume on the new Raid-1
[email protected]:~# pvcreate /dev/md1
Extend the existing LVM onto the new physical volume
[email protected]:~# vgextend lvmname /dev/md1
Move all extents from the physical volume /dev/md0 to /dev/md1. This will take some time. You might consider doing this in a screen session.
[email protected]:~# pvmove -v /dev/md0 /dev/md1
Remove the physical volume /dev/md0 from the LVM
[email protected]:~# vgreduce lvmname /dev/md0 [email protected]:~# pvremove /dev/md0
Tidying up
Stop the old Raid-1 array /dev/md0
[email protected]:~# mdadm --manage --stop /dev/md0
Sanitise the other disk by removing the raid superblock
[email protected]:~# mdadm --misc --zero-superblock /dev/sda
Partition the removed disk
[email protected]:~# fdisk /dev/sda Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xd85c2e05. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-121601, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-121601, default 121601): Using default value 121601 Command (m for help): t Selected partition 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux RAID autodetect) Command (m for help): a Partition number (1-4): 1 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Add other disk to new Raid-1
[email protected]:~# mdadm --manage --add /dev/md1 /dev/sda1
Modify /etc/mdadm/mdadm.conf to reflect new UUID (Clean me up)
[email protected]:~# mdadm --examine --scan >> /etc/mdadm/mdadm.conf [email protected]:~# vi /etc/mdadm/mdadm.conf
Update the initial ramdisk for all kernels
[email protected]:~# update-initramfs -u
Remove USB boot device
This is a work-in-progress
mkdir /bootnew cd /bootnew cp -auxv /boot/* . cd / umount /boot rmdir /boot mv /bootnew /boot dpkg-reconfigure grub-pc (upgrade-from-grub-legacy)