diff --git a/functions b/functions index a3f6b19..f4d9acb 100644 --- a/functions +++ b/functions @@ -291,3 +291,9 @@ find_modules_by_class_mit() { ' } +# get possible paths for specifed patter containing LIBDIR +get_libdir() { + for dir in lib lib64 libx32; do + echo -n "${1/LIBDIR/$dir} " + done +} diff --git a/geninitrd b/geninitrd index b8ee2a3..7b962b5 100755 --- a/geninitrd +++ b/geninitrd @@ -505,7 +505,7 @@ inst() { mkdir -p $parentDir fi verbose "+ cp $* DESTDIR$dest" - cp -HR "$@" "$DESTDIR$dest" + cp -HRp "$@" "$DESTDIR$dest" } inst_d() { @@ -553,17 +553,20 @@ inst_exec() { # hack for uclibc linked binaries requiring this fixed path # XXX: shouldn't rpath be used here instead so th - if [ -f $DESTDIR/$_lib/libc.so.0 ]; then - lib=$DESTDIR/$_lib/libc.so.0 - lib=$(ldd "$lib" | awk '/statically|linux-(gate|vdso)\.so/{next} NF == 2 {print $1} /=/{print $3}' | sort -u) - libdir=$(cd $(dirname "$lib"); pwd) - if [ ! -e $DESTDIR$libdir ]; then - libdir=$(dirname "$libdir") - inst_d $libdir - verbose "+ ln -s /$_lib $DESTDIR$libdir" - ln -s /$_lib $DESTDIR$libdir + for _lib in $(get_libdir LIBDIR); do + if [ -f $DESTDIR/$_lib/libc.so.0 ]; then + lib=$DESTDIR/$_lib/libc.so.0 + lib=$(ldd "$lib" | awk '/statically|linux-(gate|vdso)\.so/{next} NF == 2 {print $1} /=/{print $3}' | sort -u) + libdir=$(cd $(dirname "$lib"); pwd) + if [ ! -e $DESTDIR$libdir ]; then + libdir=$(dirname "$libdir") + inst_d $libdir + verbose "+ ln -s /$_lib $DESTDIR$libdir" + ln -s /$_lib $DESTDIR$libdir + break + fi fi - fi + done } # output modules.conf / modprobe.conf @@ -999,6 +1002,12 @@ initrd_gen_initramfs_switchroot() { mknod -m 660 $device b $maj $min fi + # XXX hack, fallback to rootdev from geninitrd time + if [ ! -e "$device" ]; then + device="$rootdev" + echo "DEVICE set to $device based on fstab entry from initrd gen time" + fi + # XXX hack, if no device, try to parse it from /proc/partitions using /proc/sys/kernel/real-root-dev if [ ! -e "$device" ]; then rrd=$(cat /proc/sys/kernel/real-root-dev) @@ -1052,6 +1061,14 @@ initrd_gen_initramfs_switchroot() { [ "$DEBUGINITRD" ] || usleep 10000000 fi + # systemd[1]: /usr appears to be on its own filesytem and is not + # already mounted. This is not a supported setup. Some things will + # probably break (sometimes even silently) in mysterious ways. Consult + # http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken + # for more information. + echo trying to mount /usr + chroot /newroot mount -n /usr + exec switch_root /newroot $init ${1:+"$@"} # FIXME: this code is never executed, as "exec" does not return! @@ -1355,19 +1372,10 @@ for dir in libx32 lib64 lib; do fi done -if [ -d /libx32 -a -d /usr/libx32 ]; then - _lib=libx32 -elif [ -d /lib64 -a -d /usr/lib64 ]; then - _lib=lib64 -else - _lib=lib -fi - kernel_version=$(echo "$kernel" | awk -F. '{gsub(/[_-].*/, "", $0); print sprintf("%03d%03d",$1,$2)}') kernel_version_long=$(echo "$kernel" | awk -F. '{gsub(/[_-].*/, "", $0); print sprintf("%03d%03d%03d",$1,$2,$3)}') verbose "# geninitrd $VERSION" -debug "Using _lib: $_lib" debug "Using initrd_dir: $initrd_dir" busybox=$(find_tool $initrd_dir/busybox $initrd_dir/initrd-busybox /bin/initrd-busybox) || die "Couldn't find busybox suitable for initrd" diff --git a/mod-multipath.sh b/mod-multipath.sh index f918dd5..559eb55 100644 --- a/mod-multipath.sh +++ b/mod-multipath.sh @@ -112,13 +112,19 @@ initrd_gen_multipath() { inst_exec /sbin/multipath /sbin # for udev callouts - local scsi_id=$(find_tool /$_lib/udev/scsi_id /lib/udev/scsi_id /sbin/scsi_id) + local scsi_id=$(find_tool $(get_libdir /LIBDIR/udev/scsi_id) /lib/udev/scsi_id /sbin/scsi_id) inst_exec $scsi_id /lib/udev - if [ -d /$_lib/multipath ]; then - inst_d /$_lib/multipath - inst_exec /$_lib/multipath/* /$_lib/multipath - else + local installed=0 + for _lib in $(get_libdir LIBDIR); do + if [ -d /$_lib/multipath ]; then + inst_d /$_lib/multipath + inst_exec /$_lib/multipath/* /$_lib/multipath + installed=1 + break + fi + done + if [ "$installed" -eq 0 ]; then inst_exec /sbin/mpath* /sbin fi diff --git a/mod-suspend.sh b/mod-suspend.sh index 48efd57..c984e77 100644 --- a/mod-suspend.sh +++ b/mod-suspend.sh @@ -13,7 +13,7 @@ setup_mod_suspend() { warn "Tuxonice and mainline suspend are exclusive!" fi - resume=$(find_tool $initrd_dir/resume /usr/${_lib}/suspend/resume /usr/sbin/resume) + resume=$(find_tool $(get_libdir /usr/LIBDIR/suspend/resume) $initrd_dir/resume /usr/sbin/resume) if [ ! -x "$resume" ] || [ ! -f /etc/suspend.conf ]; then USE_SUSPEND=no @@ -58,11 +58,7 @@ initrd_gen_suspend() { inst $resume_dev $resume_dev inst /etc/suspend.conf /etc/suspend.conf - if [ -x /usr/${_lib}/suspend/resume ]; then - inst_exec /usr/${_lib}/suspend/resume /bin/resume - else - inst_exec /usr/sbin/resume /bin/resume - fi + inst_exec $resume /bin/resume add_linuxrc <<-'EOF' resume=no diff --git a/mod-udev.sh b/mod-udev.sh index 147b070..30114cd 100644 --- a/mod-udev.sh +++ b/mod-udev.sh @@ -58,6 +58,16 @@ initrd_gen_udev() { fi done + # basic group file + local _lib + inst /etc/nsswitch.conf /etc/nsswitch.conf + for _lib in $(get_libdir LIBDIR); do + if (ls /$_lib/libnss_files*.so* > /dev/null 2>&1); then + inst_exec /$_lib/libnss_files*.so* /$_lib/ + fi + done + awk -F: ' { if ($3 < 1000) { print $1":"$2":"$3":" } } ' /etc/group > $DESTDIR/etc/group + # blkid installed by mod-blkid if ! is_yes "$USE_BLKID"; then warn "BLKID support missing"