[systemd-devel] Raid device issue

Ken Bass kbass at kenbass.com
Wed Dec 7 18:39:42 PST 2011


I just upgraded from F14 to F16 so this is my first attempt at systemd 
and I think I found a bug/issue. (I'm running systemd-37-3.fc16.x86_64)

My /dev/md0 (not a bootable disk thank goodness) is encrypted with luks.

My crypttab contains:
encrypt_storage  /dev/md0    /mnt/usbkey/storage.key 
cipher=aes-cbc-essiv:sha256,size=256,hash=sha1

systemd would fail with:
[   26.576425] systemd-cryptsetup[951]: crypt_init() failed: Block 
device required

That tells me that systemd is trying to access /dev/md0 before it 
actually created the device. So,
after much documentation reading I created a local  cryptsetup.target file:

[Unit]
Description=Encrypted Volumes Wait
Requires=mnt-usbkey.mount dev-md0.device
After=mnt-usbkey.mount dev-md0.device

The mnt-usbkey.mount ensures that the USB flash key is loaded early. 
(Before cryptsetup.target). That is not germane to this discussion.

The problem is the most of the time my changes fail. Occasionally it 
would work, but mostly not. So after examining the logs and some debug, 
I think the problem is a race with systemd or something.

The problem is dev-md0.device becomes 'plugged' before the /dev/md0 is 
actually created/ready. From the log:

[   26.136607] systemd[1]: dev-md0.device changed dead -> plugged
[   26.136614] systemd[1]: Job dev-md0.device/start finished, result=done
[   26.136634] systemd[1]: sys-devices-virtual-block-md0.device changed 
dead -> plugged
[   26.136691] systemd[1]: About to execute: 
/lib/systemd/systemd-cryptsetup attach encrypt_storage /dev/md0 
/mnt/usbkey/storage.key cipher=aes-cbc-essiv:sha256,size=256,hash=sha1
...
[   26.576425] systemd-cryptsetup[951]: crypt_init() failed: Block 
device required

However, the md0 is not really up. Because the above command only fails 
with /dev/md0 is missing. AND 500 milliseconds later...

[   26.634837] md/raid:md0: raid level 5 active with 4 out of 4 devices, 
algorithm 2
[   26.634839] RAID conf printout:
[   26.634840]  --- level:5 rd:4 wd:4
[   26.634842]  disk 0, o:1, dev:sdb1
[   26.634844]  disk 1, o:1, dev:sdc1
[   26.634845]  disk 2, o:1, dev:sdd1
[   26.634847]  disk 3, o:1, dev:sde1
[   26.634877] md0: detected capacity change from 0 to 2250456956928
...
[   26.672387] systemd[1]: 
dev-disk-by\x2did-md\x2duuid\x2d432b22e3:364555c6:f3927192:227cec7f.device 
changed dead -> plugged

So I came to the conclusion that I had to modifty crypttab to be:
encrypt_storage  
/dev/disk/by-id/md-uuid-432b22e3:364555c6:f3927192:227cec7f    
/mnt/usbkey/storage.key cipher=aes-cbc-essiv:sha256,size=256,hash=sha1

With that device change, it appears to work.

If this means dev-md0.device is not accurate as an indicator of /dev/md0 
being present, then I guess every other reference such as in my 
cryptsetup.target would need to be changed too.

This whole issue seems odd and certainly not intuitive. I thought I was 
instructing systemd correcty, telling it to have the depending on 
dev-md0.device. I would have thought any 'uuid' /dev/disk would simply 
be an alias, but that does not appear to be the case.

Note that my kernel cmdline has 'rd.md=0 rd.dm=0 rd.luks=0' so none of 
this is setup earlier than systemd.




More information about the systemd-devel mailing list