Hello, I was working several hours to make my PLD-derived system to boot with our geninitrd generated initrd.
I had a few problems: 1. my busybox included other shell, which couldn't handle $((...)) Ok, this is my own problem, nothing about PLD 2. the initrd (initramfs in fact) was unable to mount my root device, which was an LVM volume. I made two patches (attached) to address the second problem: 1. geninitrd-rootdev.patch This didn't fix the problem for me, but seems a good fallback: if the device provided by the "root=" kernel parameter cannot be found, then use the 'compile time default' (root device known when geninitrd ran) 2. geninitrd-lvm_initramfs.patch This one disables mounting tmpfs on /dev when initramfs is used. Using tmpfs inside of initramfs makes no sense, as initramfs is already a volatile read/write filesystem. TODO: disable mounting tmpfs on /tmp too (used for LVM stuff) Also "--mknodes" is added to vgscan invocation -- it should not hurt in any case, but makes the LVM devices available for mount before switch_root. Other comments: - There are a few "set +x" lines in the generated 'init' scripts which make initrd/initramfs debugging very hard. 'debuginitrd' option (which calls 'set -s') won't help, as after the first "set +x" the trace output is deactivated. - Do we still need non-initramfs initrd images? Dropping the legacy would make things much simpler: writtable filesystem (no need for temporary tmpfs mounts), the image could be generated with no mknode/mount/chown privileges. Functionality of the initramfs image could be easily extended by appending other cpio archives to it. Greets, Jacek
diff -dur geninitrd-8385.orig/geninitrd geninitrd-8385/geninitrd --- geninitrd-8385.orig/geninitrd 2007-05-22 10:45:56.000000000 +0000 +++ geninitrd-8385/geninitrd 2007-05-22 10:47:53.000000000 +0000 @@ -1393,11 +1393,15 @@ partition, maj, min); } ' /proc/partitions)" -if [ ! -b $device ]; then +if [ "$device" != '/dev/no_partition_found' -a ! -b $device ]; then mknod $device b $maj $min fi EOF cat << EOF >> "$s" +if [ "\$device" = '/dev/no_partition_found' ] ; then + device="$rootdev" +fi + mount -t $rootFs -r \$device /newroot init="\$(busybox awk ' /init=\// { gsub(/.*init=/,NIL,\$0); gsub(/ .*/,NIL,\$0); print \$0; } ' /proc/cmdline )" if [ -z "\$init" -o ! -x "/newroot\$init" ]; then
diff -dur geninitrd-8385.orig/geninitrd geninitrd-8385/geninitrd --- geninitrd-8385.orig/geninitrd 2007-05-22 11:18:39.000000000 +0000 +++ geninitrd-8385/geninitrd 2007-05-22 12:37:41.000000000 +0000 @@ -978,6 +978,8 @@ mknod "$MNTIMAGE/dev/console" c 5 1 mknod "$MNTIMAGE/dev/null" c 1 3 mknod "$MNTIMAGE/dev/zero" c 1 5 +mkdir "$MNTIMAGE/dev/pts" +mkdir "$MNTIMAGE/dev/shm" s="$RCFILE" ln -s /linuxrc $MNTIMAGE/init @@ -1049,6 +1051,10 @@ } initrd_gen_tmpfs_dev() { + if [ "$INITRDFS" = "initramfs" ]; then + # initramfs is read-write filesystem, no need for tmpfs + return + fi tmpfs_dev=yes cat <<-EOF : 'Creating /dev' @@ -1090,7 +1096,7 @@ cat >> "$s" <<- 'EOF' killall udevd umount /proc - umount /dev + umount /dev 2>/dev/null umount /sys EOF fi @@ -1250,7 +1256,7 @@ echo "lvm vgchange -T -a y $VGVOLUME" >> "$s" echo "umount /tmp" >> "$s" # fail to umount - echo "umount /dev" >> "$s" + echo "umount /dev 2>/dev/null" >> "$s" echo "umount /proc" >> "$s" else echo "cat /etc/lvm.conf > /tmp/lvm.conf" >> "$s" @@ -1281,7 +1287,7 @@ echo 0 > /proc/sys/kernel/printk : 'Scanning for Volume Groups' - LVM_SYSTEM_DIR=/tmp lvm vgscan --ignorelockingfailure 2>/dev/null + LVM_SYSTEM_DIR=/tmp lvm vgscan --mknodes --ignorelockingfailure 2>/dev/null : 'Activating Volume Groups' LVM_SYSTEM_DIR=/tmp lvm vgchange --ignorelockingfailure -a y $VGVOLUME 2>/dev/null @@ -1298,7 +1304,7 @@ val=\`expr 256 '*' \$major '+' \$minor\` echo \$val > /proc/sys/kernel/real-root-dev umount /tmp - umount /dev + umount /dev 2>/dev/null umount /proc EOF fi
_______________________________________________ pld-devel-en mailing list pld-devel-en@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-devel-en