This is an example of migrating a running Ubuntu system to a software RAID1.
In the process, you will need to perform two reboots.
The first step is to switch to the root user if not yet:
sudo -i
List the disk partitions - look to see if the drives appear as sd, vd, nvme, etc..
After seeing the drive type modify these instructions accordingly.
fdisk -l
Disk /dev/sda: 25 GiB, 26843545600 bytes, 52428800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 318758B2-4D70-4BD5-A9FC-C4DE66E692F7
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 52428766 52424671 25G Linux RAID
fdisk -l | grep '/dev/sd'
Disk /dev/sda: 25 GiB, 26843545600 bytes, 52428800 sectors
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 52428766 52424671 25G Linux RAID
lsblk -o NAME,UUID
NAME UUID
sda
├─sda1
└─sda2 3cc51393-2a21-9158-6f63-87a3a85bb7ee
└─md0 003fde66-cb4a-453e-9cc5-87f4ce46a722
Suppose that the system uses one disk, for example /dev/sda and has one main partition, /dev/sda1.
For the test, I installed a clean Ubuntu Server 20.04, the disk was parted by default, flat ext4 with no LVM, swap was the file on the same partition.
To create a raid, we connect another disk of the same size, it will be called /dev/sdb.
Install mdadm and necessary utilities (they are usually installed by default):
apt-get install initramfs-tools mdadm
In order to make sure that all necessary modules and components are installed, execute the following command:
cat /proc/mdstat
If the necessary modules are not loaded, then load them:
modprobe linear
modprobe multipath
modprobe raid1
Divide the new disk /dev/sdb in the same way as:
sfdisk -d /dev/sda | sfdisk --force /dev/sdb
Check:
fdisk -l
In the next step, change the partition type of the new hard disk /dev/sdb to “Linux raid autodetect” (since partition 1, then after “t” it will not be asked to specify the partition number):
fdisk /dev/sdb
t
29
w
Make sure that the partition type /dev/sdb is Linux RAID:
fdisk -l
Create an array md0 using the missing:
mdadm --create /dev/md0 --level=1 --metadata=1.0 --raid-disks=2 missing /dev/sdb1
Check:
cat /proc/mdstat
If something does not work, then you can remove the raid and try again:
mdadm --stop /dev/md0
Specify the file system of the array:
mkfs.ext4 /dev/md0
Make a backup copy of the configuration file mdadm and add information about the new array:
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm_backup.conf
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Mount /dev/md0 into the system:
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
mount
For me it was displayed at the bottom of the list:
/dev/md0 on /mnt/md0 type ext4 (rw,relatime,data=ordered)
In the /etc/fstab file comment the lines about /dev/sda and add about the array:
nano /etc/fstab
/dev/md0 / ext4 errors=remount-ro 0 1
Let’s see the file /etc/mtab whether there is a record about the raid:
cat /etc/mtab
Let’s look at the exact names of the files. In this case /boot/vmlinuz-5.4.0-96-generic, /boot/initrd.img-5.4.0-96-generic:
ls /boot
Create a file from the GRUB2 boot menu and open it in the editor:
cp /etc/grub.d/40_custom /etc/grub.d/09_raid1_test
nano /etc/grub.d/09_raid1_test
Add the contents (instead of /vmlinuz and /initrd.img, we’ll specify the correct names if they are different):
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Debian GNU/Linux, with Linux' --class debian --class gnu-linux --class gnu --class os {
insmod mdraid1x
insmod part_msdos
insmod ext2
set root='(md/0)'
echo 'Loading Linux'
linux /boot/vmlinuz-5.4.0-96-generic root=/dev/md0 ro quiet
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-5.4.0-96-generic
}
Open the file /etc/default/grub in the text editor:
nano /etc/default/grub
Uncomment a couple of lines:
GRUB_TERMINAL=console
GRUB_DISABLE_LINUX_UUID=true
Update the loader:
update-grub
Prepare ramdisk:
update-initramfs -u
Install the bootloader on both disks:
grub-install /dev/sda
grub-install /dev/sdb
Copy all the data to the previously mounted md0 array:
cp -dpRx / /mnt/md0
After the copy has completed, restart the system:
reboot
Note:
When the system starts, in the boot menu it will be the first menu /etc/grub.d/09_raid1_test, if there are problems with the download, you can choose to boot from /dev/sda. You can also try to remount the system in rw mode if needed:
mount -o remount,rw /partition/identifier /mount/point
I initially had an /etc/fstab issue so I did the followind: mount -o remount,rw /dev/md0 /
Make sure that the system is started with /dev/md0:
df -h
Again, switch to the root user if not under it:
sudo -i
Copy the working partition of /dev/sdb to /dev/sda
sfdisk -d /dev/sdb | sfdisk --force /dev/sda
Check:
fdisk -l
Add to the array the old disk:
mdadm --add /dev/md0 /dev/sda1
Wait until the synchronization is completed and make sure that the raid is in order – UU:
cat /proc/mdstat
Update the array information in the mdadm configuration file:
cp /etc/mdadm/mdadm_backup.conf /etc/mdadm/mdadm.conf
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Remove our temporary GRUB menu, it’s no longer necessary:
rm -f /etc/grub.d/09_raid1_test
Update and install GRUB again:
update-grub
update-initramfs -u
grub-install /dev/sda
grub-install /dev/sdb
Restart the system to make sure it runs successfully:
reboot
At this, the migration of the running Ubuntu system to the software RAID1 is complete.
If one of the disks, /dev/sda or /dev/sdb stops working, the system will run and boot.
For stability, you can add more disks of the same size to the array.
By: vyacheslav
Update for 20.04 by tconrad