I've recently updated my Slackware 13.1 system to the Slackware current. Although I have created my "initrd" image without specifying the "-u" option to "mkinitrd" it still starts up "udev".
That is causing me some difficulty because I am using "dmraid" to detect my RAID arrays. I had created my own device names such as "/dev/sdr2" for my root partition. With 13.1 I had no problem, since "udev" was not started by the "initrd" unless the "-u" option was provided. The current version seems to start up "udev" even without that option.
Is there a way to disable "udev" in the "initrd", or is there a way to specify custom "udev" rules for an "initrd"? I tried placing a "10-local.rules" file in the "etc/udev/rules.d" directory of the "initrd-tree" but that file had no effect on the device names generated by "udev" during the "initrd".
Here is my script that creates the "initrd".
Code:
ROOTDEVNAME="/dev/sdr2" # Name of root device
LINUXVER="2.6.35.7-smp" # Linux modules version
CLIBVER="2.12.1" # C library version
ROOTDIR="/boot/initrd-tree" # Location of root filesystm
# Get most of the needed programs from the normal mkinitrd
mkinitrd -k $LINUXVER -c -r "$ROOTDEVNAME" -f ext3
# Create root device
cp -a "$ROOTDEVNAME" "$ROOTDIR/dev"
# Copy scripts and programs
cp -p init "$ROOTDIR"
cp -p /etc/udev/rules.d/10-local.rules "$ROOTDIR/etc/udev/rules.d"
chmod u=rwx,g=rx,o=rx "$ROOTDIR/init"
cp -p /sbin/dmraid "$ROOTDIR/sbin"
for lib in \
"libdevmapper.so.1.02" \
"libc.so.6" "ld-linux.so.2" \
"ld-$CLIBVER.so" "libc-$CLIBVER.so" \
"libudev.so.0" "libudev.so.0.7.0"
do
if [ -e "/lib/$lib" ] ; then
cp -Pp "/lib/$lib" "$ROOTDIR/lib/$lib"
else
echo "Library file not found \"/lib/$lib\""
exit 1
fi
done
# Make the compressed image file
mkinitrd
The bold line above is one that I added in an attempt to provide rules to "udev" for the "initrd". It had no apparent effect (see rules file below).
In Slackware 13.1 and previous versions, the "/dev/sdr2" device was found in the "dev" directory of the "initrd" image because my script creates it. The current version runs "udev" and does not see the actual "dev" directory. I have been able to get the system to boot by substituting the name "/dev/dm-2" instead of "/dev/sdr2" but I would like to use the same name that I use for the other partitions "/dev/sdrN" (N=1 to 7).
The "init" script is slightly modified to include one extra statement. Here is an excerpt of the modified section.
Code:
# Sometimes the devices need extra time to be available.
# A root filesystem on USB is a good example of that.
sleep $WAIT
# Find any dmraid detectable partitions
dmraid -ay
# If udevd is available, use it to generate block devices
# else use mdev to read sysfs and generate the needed devices
if [ -x /sbin/udevd -a -x /sbin/udevadm ]; then
/sbin/udevd --daemon
/sbin/udevadm control --property=STARTUP=1
/sbin/udevadm trigger --subsystem-match=block --action=add
/sbin/udevadm settle --timeout=10
/sbin/udevadm control --property=STARTUP=
else
[ "$DEVTMPFS" != "1" ] && mdev -s
fi
The added lines are in bold and run "dmraid". I verified that I have the current "init" script with only the addition of "dmraid" being different.
Here is my normal "udev" rules file, named "10-local.rules" that works after Linux is booted.
Code:
# /etc/udev/rules.d/10-local.rules: local device naming rules for udev
KERNEL=="dm-0", NAME="sdr", OPTIONS+="last_rule"
KERNEL=="dm-1", NAME="sdr1", OPTIONS+="last_rule"
KERNEL=="dm-2", NAME="sdr2", OPTIONS+="last_rule"
KERNEL=="dm-3", NAME="sdr4", OPTIONS+="last_rule"
KERNEL=="dm-4", NAME="sdr5", OPTIONS+="last_rule"
KERNEL=="dm-5", NAME="sdr6", OPTIONS+="last_rule"
KERNEL=="dm-6", NAME="sdr7", OPTIONS+="last_rule"
KERNEL=="dm-7", NAME="sdr8", OPTIONS+="last_rule"
It does not have any effect when I put it in the "rules.d" directory for the "initrd-tree". It does work after Linux boots, but by then the root device has been named "/dev/dm-2" and continues to appear that way.
At the time the "initrd" tries to mount the root device the "/dev/sdr2" device has not yet been created by the normal "udev" rules. In the past I had solved that problem by creating "/dev/sdr2" in the "dev" directory of the "initrd" and the "/dev" directory of the root file-system. In previous versions of Slackware, the device "/dev/dm-2" did not exist until after the "initrd" and normal "init" script had finished.
The "menu.lst" file for "grub" has this entry to boot Linux.
Code:
title Linux
root (hd0,1)
kernel /boot/vmlinuz vga=791 root=/dev/sdr2 ro vt.default_utf8=0 load_ramdisk=1 ramdisk_size=4096
initrd /boot/initrd.gz
When I specify "root=/dev/dm-2" the system will boot, but "root=/dev/sdr2" no longer works after upgrading to current.
It will be helpful for me to understand "udev" issues related to an "initrd" because I will eventually try to use "mdadm" instead of "dmraid". So far I have only been able to get my system to boot from the RAID array using "dmraid" and I often run into new problems when I update Linux. Still, Slackware has proven to have the best support for booting from my RAID array because of the user community, documentation and flexibility.