[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: mdadm and UUIDs for its component drives



Hi Luke,

Luke Kenneth Casson Leighton wrote:
 the answer is that mdadm tracks down the hardlink and displays, as
best i can tell, only that, with no immediately obvious options to get
it to display the disk UUIDs.

I hear what you are saying, but I had a related problem which was similar.

When starting up a machine with two external 2TB drives which had been set up as a mirror, it would sometimes only find one drive and then it would happily mount the RAID1 array in a degraded state. Then, when the other drive was added in, it had to do a rebuild of the array. It's not much good having to rebuild the array after each boot when the mirror should be perfectly fine.


So I solved it by adding the following to my /etc/rc.local

nohup /usr/local/bin/u1-mirror-drive.sh 2>&1 >/dev/null &



Note that external mirror drive, which mounts at /u1, has this /etc/fstab entry:

/dev/mapper/vg--external--1-vg--external--1--u1 /u1 ext4 noauto,rw 0 0



I've masked the UUID below, but I don't see how it could cause any trouble if I did not do that.....


The RAID1 is identified ONLY with UUID in /etc/mdadm/mdadm.conf

#  grep ARRAY /etc/mdadm/mdadm.conf
ARRAY /dev/md0 UUID=06fd3d46-XXXX-XXXX-YYYY-ZZZZZZZZZZZZ



Here's my script that handles getting everything working after a boot:

#  cat /usr/local/bin/u1-mirror-drive.sh
#!/bin/bash

RAID_DRIVE_ID=06fd3d46-XXXX-XXXX-YYYY-ZZZZZZZZZZZZ
RAID_DRIVES=2
TIME_LIMIT=60

echo RAID Drive ID: $RAID_DRIVE_ID
echo Number of Devices required: $RAID_DRIVES
echo Time Limit: $TIME_LIMIT

function error_drive_missing ()
{
        echo
        echo -en "\aMissing drive(s) ... cannot assemble /dev/md0\n\n"
        /sbin/blkid|/bin/grep $RAID_DRIVE_ID
        exit
}

(

echo "=================="
echo -en "Waiting for $RAID_DRIVES drives to be visible for \"linux_raid_member(s)\" with blkid of: \"$RAID_DRIVE_ID\" ... \n\t"
CNT=1
echo -en "00"
while [ $(/sbin/blkid|/bin/grep $RAID_DRIVE_ID|/usr/bin/wc -l) -lt $RAID_DRIVES ]
do
if [ $CNT -lt 10 ]; then echo -en "\b$CNT"; else echo -en "\b\b$CNT";fi if [ $CNT -eq $TIME_LIMIT ]; then echo -en "\b\b$TIME_LIMIT seconds ....\n";error_drive_missing;fi
        CNT=$(($CNT + 1))
        /bin/sleep 1
done
echo -en "\n\nAll required drives found in $CNT seconds....\n"
echo "=================="
echo -en "\n\n"

cmds='/sbin/mdadm --assemble /dev/md0~
/sbin/vgscan~
/sbin/vgchange -ay vg-external-1~
/bin/mount /u1~
/bin/mount~
/bin/df -Th~
/bin/date~
/sbin/mdadm -D /dev/md0~
/bin/cat /proc/mdstat'

echo ".................."

IFS='~'
echo $cmds|
while read cmd
do
        IFS=$' \t\n'
        echo "=================="
        echo "${cmd}"
        echo "------------------"
        $cmd
        echo -en "==================\n\n"
done

echo ".................."

) 2>&1 | /usr/bin/tee /var/log/md0-vg-external-1-u1-wrk.$(date +%Y%m%d%H%M).out



Right now, I am using 2x 2TB drives as mirrors, I plan to add a 3rd drive as a 3-way mirror and to let it sync up, then remove the drive for off-site storage. A 4th drive will come into play as well to rotate off-site storage. Consequently, I catered for that scenario in the "mount" script above -- ie I can easily change the number of RAID devices to find before continuing if I choose to have more online or not during boot. The script gives up if it cannot find the required number of devices within 60 seconds, then I will have to manually intervene.

As you can see from the script, there is some logging taking place so that I can check things over if necessary.

I may end up using multiple external mirrors at some stage; if I do that then I'll likely have duplicated scripts for each metadevice and the scripts will be [slightly] modified as required. I may end up with a parameter file with a single script, but it's probably not worth the further effort. Although using command line variables would be an easy and viable option.

Anyway.... the long and short of it is, I can use mdadm without regard to what devices are found, such as /dev/sda /dev/sdb /dev/sdc and the like as I rely purely on the UUID functionality, which as you know, mdadm handles perfectly well. ;-)


--
Kind Regards
AndrewM

Andrew McGlashan
Broadband Solutions now including VoIP


Reply to: