diff --git a/libguestfs.changes b/libguestfs.changes index b7331da..daee332 100644 --- a/libguestfs.changes +++ b/libguestfs.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Jan 20 11:34:25 CET 2014 - ohering@suse.de + +- Resolve also library dependencies of libnss in mkinitrd (bnc#847785) +- BuildRequire nfs-utils to get mount.nfs, for virt-rescue + ------------------------------------------------------------------- Thu Jan 16 21:29:47 CET 2014 - ohering@suse.de diff --git a/libguestfs.mkinitrd.1110.patch b/libguestfs.mkinitrd.1110.patch index 6819fae..0a77b89 100644 --- a/libguestfs.mkinitrd.1110.patch +++ b/libguestfs.mkinitrd.1110.patch @@ -1,7 +1,8 @@ --- - mkinitrd/scripts/setup-prepare.sh | 94 +++++++++++++++++++++++++++++++------- - mkinitrd/scripts/setup-progs.sh | 4 - - 2 files changed, 79 insertions(+), 19 deletions(-) + mkinitrd/scripts/setup-prepare.sh | 94 ++++++++++++++++++++++++++++------- + mkinitrd/scripts/setup-progs.sh | 4 - + mkinitrd/scripts/setup-sharedlibs.sh | 60 +++++++++++++--------- + 3 files changed, 114 insertions(+), 44 deletions(-) Index: 1110/mkinitrd/scripts/setup-prepare.sh =================================================================== @@ -192,3 +193,101 @@ Index: 1110/mkinitrd/scripts/setup-progs.sh [ -e "bin/sh" ] || ln -s /bin/bash bin/sh +Index: 1110/mkinitrd/scripts/setup-sharedlibs.sh +=================================================================== +--- 1110.orig/mkinitrd/scripts/setup-sharedlibs.sh ++++ 1110/mkinitrd/scripts/setup-sharedlibs.sh +@@ -54,58 +54,68 @@ shared_object_files() { + while [ -L "/$lib" ]; do + echo $lib + link="$(readlink "/$lib")" + if [ x"${link:0:1}" == x"/" ]; then + lib=${link#/} + else + lib="${lib%/*}/$link" + fi + done + echo $lib + done + } + +-verbose -ne "Shared libs:\t" +-# Copy all required shared libraries and the symlinks that +-# refer to them. +-lib_files=$(shared_object_files "${initrd_bins[@]}") +-[ $? -eq 0 ] || return 1 +-if [ -n "$lib_files" ]; then +- for lib in $lib_files; do +- [ -L $root_dir/$lib ] || verbose -n "$lib " +- ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt ) +- done +- lib_files= ++copy_shared_libs() { ++ local bins=( "$@" ) ++ local extra_lib_files lib_files lib i ++ ++ # First see what nss and other libs are required. This can be 64bit or 32bit, ++ # depending on the host and the already copied binaries. + case "$(uname -m)" in + alpha|ia64) ++ # this is a known location + mkdir -p $tmp_mnt/lib +- lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`" ++ extra_lib_files="`echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`" + ;; + *) +- # no symlinks, most point into the running system +- for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev/,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u` ++ # Skip symlinks, they may point into the running system instead of $tmp_mnt ++ for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u` + do + case "$i" in + 32-bit) + mkdir -p $tmp_mnt/lib +- lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`" ++ extra_lib_files="$extra_lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`" + ;; + 64-bit) + mkdir -p $tmp_mnt/lib64 +- lib_files="$lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`" ++ extra_lib_files="$extra_lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`" + ;; + esac + done + ;; + esac + +- for lib in $lib_files ; do +- if [ -f $lib ] ; then +- verbose -n "${lib##$root_dir/} " +- cp -dp --parents $lib $tmp_mnt ++ verbose -ne "Shared libs:\t" ++ ++ # Now collect a list of libraries on which the binaries and extra libs depend on ++ lib_files=$( shared_object_files ${bins[@]} $extra_lib_files ) ++ if [ $? -eq 0 ] ++ then ++ if [ -n "$lib_files" ] ++ then ++ # Finally copy dependencies and extra libs ++ for lib in $lib_files $extra_lib_files ++ do ++ [ -L $root_dir/$lib ] || verbose -n "$lib " ++ ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt ) ++ done ++ verbose ++ else ++ verbose "none" + fi +- done +- verbose +-else +- verbose "none" +-fi ++ else ++ return 1 ++ fi ++} + ++# Copy all required shared libraries and the symlinks that refer to them. ++copy_shared_libs "${initrd_bins[@]}" diff --git a/libguestfs.mkinitrd.1210.patch b/libguestfs.mkinitrd.1210.patch index 180b961..657ace1 100644 --- a/libguestfs.mkinitrd.1210.patch +++ b/libguestfs.mkinitrd.1210.patch @@ -1,7 +1,8 @@ --- - mkinitrd/scripts/setup-prepare.sh | 94 +++++++++++++++++++++++++++++++------- - mkinitrd/scripts/setup-progs.sh | 17 +----- - 2 files changed, 80 insertions(+), 31 deletions(-) + mkinitrd/scripts/setup-prepare.sh | 94 ++++++++++++++++++++++++++++------- + mkinitrd/scripts/setup-progs.sh | 17 +----- + mkinitrd/scripts/setup-sharedlibs.sh | 60 +++++++++++++--------- + 3 files changed, 115 insertions(+), 56 deletions(-) Index: 1210/mkinitrd/scripts/setup-prepare.sh =================================================================== @@ -212,3 +213,101 @@ Index: 1210/mkinitrd/scripts/setup-progs.sh [ -e "bin/sh" ] || ln -s /bin/bash bin/sh +Index: 1210/mkinitrd/scripts/setup-sharedlibs.sh +=================================================================== +--- 1210.orig/mkinitrd/scripts/setup-sharedlibs.sh ++++ 1210/mkinitrd/scripts/setup-sharedlibs.sh +@@ -54,58 +54,68 @@ shared_object_files() { + while [ -L "/$lib" ]; do + echo $lib + link="$(readlink "/$lib")" + if [ x"${link:0:1}" == x"/" ]; then + lib=${link#/} + else + lib="${lib%/*}/$link" + fi + done + echo $lib + done + } + +-verbose -ne "Shared libs:\t" +-# Copy all required shared libraries and the symlinks that +-# refer to them. +-lib_files=$(shared_object_files "${initrd_bins[@]}") +-[ $? -eq 0 ] || return 1 +-if [ -n "$lib_files" ]; then +- for lib in $lib_files; do +- [ -L $root_dir/$lib ] || verbose -n "$lib " +- ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt ) +- done +- lib_files= ++copy_shared_libs() { ++ local bins=( "$@" ) ++ local extra_lib_files lib_files lib i ++ ++ # First see what nss and other libs are required. This can be 64bit or 32bit, ++ # depending on the host and the already copied binaries. + case "$(uname -m)" in + ia64) ++ # this is a known location + mkdir -p $tmp_mnt/lib +- lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`" ++ extra_lib_files="`echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`" + ;; + *) +- # no symlinks, most point into the running system +- for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev/,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u` ++ # Skip symlinks, they may point into the running system instead of $tmp_mnt ++ for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u` + do + case "$i" in + 32-bit) + mkdir -p $tmp_mnt/lib +- lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`" ++ extra_lib_files="$extra_lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`" + ;; + 64-bit) + mkdir -p $tmp_mnt/lib64 +- lib_files="$lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`" ++ extra_lib_files="$extra_lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`" + ;; + esac + done + ;; + esac + +- for lib in $lib_files ; do +- if [ -f $lib ] ; then +- verbose -n "${lib##$root_dir/} " +- cp -dp --parents $lib $tmp_mnt ++ verbose -ne "Shared libs:\t" ++ ++ # Now collect a list of libraries on which the binaries and extra libs depend on ++ lib_files=$( shared_object_files ${bins[@]} $extra_lib_files ) ++ if [ $? -eq 0 ] ++ then ++ if [ -n "$lib_files" ] ++ then ++ # Finally copy dependencies and extra libs ++ for lib in $lib_files $extra_lib_files ++ do ++ [ -L $root_dir/$lib ] || verbose -n "$lib " ++ ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt ) ++ done ++ verbose ++ else ++ verbose "none" + fi +- done +- verbose +-else +- verbose "none" +-fi ++ else ++ return 1 ++ fi ++} + ++# Copy all required shared libraries and the symlinks that refer to them. ++copy_shared_libs "${initrd_bins[@]}" diff --git a/libguestfs.mkinitrd.1220.patch b/libguestfs.mkinitrd.1220.patch index 18fb8c3..a22ff10 100644 --- a/libguestfs.mkinitrd.1220.patch +++ b/libguestfs.mkinitrd.1220.patch @@ -1,7 +1,8 @@ --- - mkinitrd/scripts/setup-prepare.sh | 126 ++++++++++++++++++++++---------------- - mkinitrd/scripts/setup-progs.sh | 17 ----- - 2 files changed, 79 insertions(+), 64 deletions(-) + mkinitrd/scripts/setup-prepare.sh | 126 +++++++++++++++++++++-------------- + mkinitrd/scripts/setup-progs.sh | 17 ---- + mkinitrd/scripts/setup-sharedlibs.sh | 60 +++++++++------- + 3 files changed, 114 insertions(+), 89 deletions(-) Index: 1220/mkinitrd/scripts/setup-prepare.sh =================================================================== @@ -217,3 +218,101 @@ Index: 1220/mkinitrd/scripts/setup-progs.sh [ -e "bin/sh" ] || ln -s /bin/bash bin/sh +Index: 1220/mkinitrd/scripts/setup-sharedlibs.sh +=================================================================== +--- 1220.orig/mkinitrd/scripts/setup-sharedlibs.sh ++++ 1220/mkinitrd/scripts/setup-sharedlibs.sh +@@ -54,58 +54,68 @@ shared_object_files() { + while [ -L "/$lib" ]; do + echo $lib + link="$(readlink "/$lib")" + if [ x"${link:0:1}" == x"/" ]; then + lib=${link#/} + else + lib="${lib%/*}/$link" + fi + done + echo $lib + done + } + +-verbose -ne "Shared libs:\t" +-# Copy all required shared libraries and the symlinks that +-# refer to them. +-lib_files=$(shared_object_files "${initrd_bins[@]}") +-[ $? -eq 0 ] || return 1 +-if [ -n "$lib_files" ]; then +- for lib in $lib_files; do +- [ -L $root_dir/$lib ] || verbose -n "$lib " +- ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt ) +- done +- lib_files= ++copy_shared_libs() { ++ local bins=( "$@" ) ++ local extra_lib_files lib_files lib i ++ ++ # First see what nss and other libs are required. This can be 64bit or 32bit, ++ # depending on the host and the already copied binaries. + case "$(uname -m)" in + ia64) ++ # this is a known location + mkdir -p $tmp_mnt/lib +- lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`" ++ extra_lib_files="`echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`" + ;; + *) +- # no symlinks, most point into the running system +- for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev/,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u` ++ # Skip symlinks, they may point into the running system instead of $tmp_mnt ++ for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u` + do + case "$i" in + 32-bit) + mkdir -p $tmp_mnt/lib +- lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`" ++ extra_lib_files="$extra_lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`" + ;; + 64-bit) + mkdir -p $tmp_mnt/lib64 +- lib_files="$lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`" ++ extra_lib_files="$extra_lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`" + ;; + esac + done + ;; + esac + +- for lib in $lib_files ; do +- if [ -f $lib ] ; then +- verbose -n "${lib##$root_dir/} " +- cp -dp --parents $lib $tmp_mnt ++ verbose -ne "Shared libs:\t" ++ ++ # Now collect a list of libraries on which the binaries and extra libs depend on ++ lib_files=$( shared_object_files ${bins[@]} $extra_lib_files ) ++ if [ $? -eq 0 ] ++ then ++ if [ -n "$lib_files" ] ++ then ++ # Finally copy dependencies and extra libs ++ for lib in $lib_files $extra_lib_files ++ do ++ [ -L $root_dir/$lib ] || verbose -n "$lib " ++ ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt ) ++ done ++ verbose ++ else ++ verbose "none" + fi +- done +- verbose +-else +- verbose "none" +-fi ++ else ++ return 1 ++ fi ++} + ++# Copy all required shared libraries and the symlinks that refer to them. ++copy_shared_libs "${initrd_bins[@]}" diff --git a/libguestfs.mkinitrd.setup.sh b/libguestfs.mkinitrd.setup.sh index 36779da..6a43584 100644 --- a/libguestfs.mkinitrd.setup.sh +++ b/libguestfs.mkinitrd.setup.sh @@ -5,6 +5,11 @@ # copy daemon manually because it is located in RPM_BUILD_ROOT mkdir -vp $tmp_mnt/usr/sbin cp_bin $(type -p guestfsd) $tmp_mnt/usr/sbin +# required for mount.nfs inside the appliance +for i in /etc/netconfig /etc/protocols /etc/rpc /etc/services +do + cp $i $tmp_mnt$i +done # many guestfish commands need a mount point # in guestfsd the mount point defaults to /sysroot diff --git a/libguestfs.spec b/libguestfs.spec index 696a950..51ef249 100644 --- a/libguestfs.spec +++ b/libguestfs.spec @@ -363,6 +363,7 @@ BuildRequires: mdadm BuildRequires: mkinitrd %endif BuildRequires: module-init-tools +BuildRequires: nfs-client BuildRequires: ntfs-3g BuildRequires: ntfsprogs BuildRequires: parted