-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"