This guide is for drives over 2TB formatted as GPT (If you're running Ubuntu 20 or newer follow the guide at the very bottom)
In this example, I have two hard drives, /dev/sda and /dev/sdb, with the partitions /dev/sda1 and /dev/sda2 as well as /dev/sdb1 and /dev/sdb2. In this example, we are acting as if SDB has failed.
/dev/sda2 and /dev/sdb2 make up the RAID1 array /dev/md1
_________________________
1) How to tell if a hard disk has failed?
If a disk has failed, youac will probably find a lot of error messages in the log files, e.g.
/var/log/messages or /var/log/syslog
You can also run:
cat /proc/mdstat
Instead of the string [UU] you will see [U_] if you have a degraded RAID1 array.
You can also run:
fdisk -l | less
This checks what drive is missing from the array. An easy way to tell is look for a drive with no MD0 or MD1 partitions.
2) Removing the failed disk
To remove /dev/sdb, we will mark /dev/sdb1 and /dev/sdb2 as failed and remove them from their respective RAID arrays (/dev/md0 and /dev/md1).
First we mark /dev/sdb1 and /dev/sdb2 as failed:
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2
Now we want to remove the drive from the array
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb2
Once you finish that check to see what drives serial # is with:
hdparm -I /dev/sdb | less
Remove the corresponding drive then shutdown the server and replace the drive. If your a client, please inform support the drive serial # and we can replace it for you.
3) Adding the new hard disk
We are going to use gdisk to copy the partitions from the good drive SDA to the bad drive SDB. First install gdisk.
CentOS based servers:
yum install gdisk -y
Ubuntu based servers:
apt-get install gdisk -y
Now copy the partitions from SDA to SDB with the following command:
sgdisk -R /dev/sdb /dev/sda
This command will remove any duplicate GUIDs:
sgdisk-G /dev/sdb
4) Adding and syncing
The final step is to add mdo to sdb1 and md1 to sdb2 which will initialize the syncing process
mdadm --manage /dev/md0 --add /dev/sdb1
mdadm --manage /dev/md1 --add /dev/sdb2
That's it! you can run:
cat /proc/mdstat
To see the status of the syncing if needed.
____________________
IF YOU'RE RUNNING UBUNTU 20 OR NEWER YOU NEED TO FOLLOW THIS GUIDE
1) Change the source to the existing drive and dest to the new one: MAKE SURE TO CHANGE THESE AS NEEDED!
source=/dev/sda
dest=/dev/sdb
2) Create a replica of the source partition table and then generate new UUIDs for the new drive:
sudo sgdisk --replicate=$dest $source
sudo sgdisk -G $dest
3) Start syncing the raid and replace the X with the correct partition (it’s 2 for me):
sudo mdadm --manage /dev/md0 -a $(echo "$dest"X)
4) Now, copy over the ESP and replace X with the correct partition (it’s 1 for me):
sudo dd if=$(echo "$source"X) of=$(echo "$dest"X)
5) Then list the current drive UUIDs:
ls -la /dev/disk/by-partuuid/
6) Then show the boot-list:
efibootmgr -v
7) Take note of the BootOrder in case you want to change it. If any of the Ubuntu entries point to a UUID that currently don’t exist, delete it (replace XXXX with the ID from the boot-list):
sudo efibootmgr -B -b XXXX
8) If any of the current UUIDs for partition 1 on the drives don’t exist in the boot-list, add it (replace the X with the drive that is missing):
sudo efibootmgr --create --disk /dev/sdX --part 1 --label "ubuntu" --loader "\EFI\ubuntu\shimx64.efi"
9) Verify that it’s correct:
efibootmgr -v
All good? Great! You now have a working RAID again.
- Updated