In this article I will describe, how you can create a RAID 1 in MDADM by adding a second drive to an existing one.
If you want to store your data reliably, you should probably use some kind of RAID for redundancy. The easies form is a RAID 1. RAID 1 typicaly consists out of two drives and all data is mirrored on both drives. If one fails, all data is saved on the second one as well. Most tutorials assume, that you have three drives in total. The current one and two new ones that will form the RAID. But in that case the original drive isn't needed after the migration. But there is a way around that, if you only have two drives.
First of all MAKE SURE YOU HAVE A BACKUP. If you are coping large amounts of data, there is always a possibility for failure. In that case you want a backup to restore you data!
You will need two drives with identical capacity. Since one of them is already in use, try to get a matching one. If you can't match them excatly, try to get a bigger one. The smallest drive in the array will dictate the size of the array. If the second on is bigger, you will not be able to use all the capacity. If the second drive is smaller that the original, you will not be able to create the array.
You will need to install
mdadm. It should be available on all major distibutions. So it should be irrelevant which distribution you use.
We have three drives connected to our System:
/dev/sda - 512 GB SATA SSD for the OS
/dev/sdb - 2 TB HDD currently mountet at /opt. This is the drive with our data that should be converted to a RAID1.
/dev/sdc - 2 TB HDD without any data and not yet mounted. This will be the second drive in the array.
Prepare the new drive
sdc needs to have a partition with the same specs as
sdb. We should also creat the same Filesystem. In my case XFS.
[tux@server]$ sudo mkfs.xfs /dev/sdc
Create the Array
Now we create the RAID1 Array. I will show you the command first and explain afterwards.
[tux@server]$ sudo mdadm --create /dev/md0 --level 1 --raid-devices=2 missing /dev/sdc1
--create /dev/md0 - creates an array with the name
--level 1 - defines the RAID Level. In our case RAID 1.
--raid-devices=2 - defines that our array will have two devies. This important, since we will start with only one drive of the two. More on that later.
missing - means we will create a degraded array with missing drives. Normaly MDADM would not allow to create a RAID 1 with only one drive.
/dev/sdc1 - the new drive to create the array with.
How does it work
The idea behind all this is to create a degraded array. Normaly a degraded array means, that one of the drive failed and the array waits for you to replace it and restore all the data to the new one. In our case the creating of the degraded array gives us the possibilty to copy the data from the original drive to the array before wiping the original disk to include it in the array. Once we include it in the array, the data will get restored to the now new drive and in the end we have a working RAID 1 Array.
Copy the data
Next we need to mount the array and copy the data. I will mount it at
/mnt but you can choose a different mount-point if you like. Just rember to use the right path while coping.
[tux@server]$ sudo mount /dev/md0 /mnt
Now we need to copy the data from our
sdb mountet at
/opt to our new array
md0 mountet at
/mnt. I will use rsync for that.
# -a - copy all data including hidden files
# -v - show file names while coping
# --progress - draw a progressbar
rsync -a -v --progress /opt /mnt
Depending on your amount of data, this might take a while…
Restoring the Array
Before you proceed make sure that all data is copied successfuly! Otherwise it will be lost!
Next we add
sdb to the array. While doing this, all data on
sdb will be wiped! There is no way around that.
[tux@server]$ sudo mdadm --add /dev/md0 /dev/sdb1
Once the drive is added, mdadm will start to rebuild the array and copy all the data to the "new" drive
You can check the state of the array like so:
[tux@server]$ sudo mdadm -D /dev/md0
The progress of the rebuild can be displayed like this:
[tux@server]$ sudo cat /proc/mdstat
After a few hours the array will be rebuilt and fully functional.
A Word of advice
This way of creating an array is by no means suitable for production! If you need this data available at all time, buy another disk and have it as a cold spare.
But for home use this might be an alternative.
You have to keep in mind that a drive is most likely to fail when you copy large amount of data. In this procedure this happens twice (copy to the array and rebuild the array). So make sure you have an external backup beside these two drives in the array.
Nethertheless for a homelab this might be a viable option since you dont by a large hard disk that is lying in the shelf afterwards.