Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:GA
libguestfs
libguestfs.mkinitrd.1210.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libguestfs.mkinitrd.1210.patch of Package libguestfs
--- 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 =================================================================== --- 1210.orig/mkinitrd/scripts/setup-prepare.sh +++ 1210/mkinitrd/scripts/setup-prepare.sh @@ -13,43 +13,103 @@ #%param_R: "Print release (version)." #%param_L: "Disable logging." #%param_h: "This help screen." # ###### Additional options ## ## Script inclusion may be overriden by ## 1) creating a monster-initrd ## 2) including the wanted module in the configuration option ADDITIONAL_FEATURES in /etc/sysconfig/initrd ## 3) definition using the -f command line switch ## # Install a binary file +# cp_bin file target_filename +# cp_bin file target_directory +# cp_bin file file target_directory +# file is either a regular file or a symlink. symlinks and all paths they point to will be copied +# the "root" of target is $tmp_mnt, which is required to copy symlinks properly cp_bin() { - cp -a "$@" \ - || exit_code=1 - - # Remember the binaries installed. We need the list for checking - # for dynamic libraries. - while [ $# -gt 1 ]; do - initrd_bins[${#initrd_bins[@]}]=$1 - shift - done - # file may print '^setuid ELF ...' - # suid mount will fail if mkinitrd was called as user - if [ -L "$1" ]; then - : do nothing with symlinks - elif [ -d "$1" -o -f "$1" ]; then - find "$1" -type f -print0 | xargs -0 chmod 0755 - fi + local -a files + local target + local target_dirname + local file + + # need at least two parameters, source and destination + if test $# -lt 2 + then + return 0 + fi + # store source filenames + until test $# -eq 1 + do + files=( ${files[@]} $1 ) + shift + done + # store target, either file or directory + target=$1 + # if more than two parameters, last entry must be a directory + if test ${#files[@]} -gt 1 + then + if ! test -d ${target} + then + return 0 + fi + target_dirname=${target} + else + # simplify symlink resolving for sinlge filename + target_dirname=${target%/*} + fi + + for file in ${files[@]} + do + local src dst + src=${file} + dst=${target} + # copy requested soure file as is to requested destination + cp -a -v --remove-destination ${src} ${dst} + # copy symlinks recursivly + while [ 1 ] + do + local tmp_src + if test -L ${src} + then + tmp_src=$(readlink ${src}) + if test "${tmp_src:0:1}" = "/" + then + src=${tmp_src} + else + # relative symlink + src=${src%/*}/${tmp_src} + fi + cp -a -v --remove-destination --parents ${src} $tmp_mnt + # if link target exists, proceed to next symlink target + if test -e "${src}" + then + continue + fi + fi + # exit loop in case of dead symlink or if target of symlink was reached + break + done + # if source file exists, add it to list of binaries + if test -e "${src}" + then + # file may print '^setuid ELF ...' + # suid mount will fail if mkinitrd was called as user + chmod -v 0755 $tmp_mnt/${src} + initrd_bins[${#initrd_bins[@]}]=${src} + fi + done } # check if we should use script or feature $1 use_script() { local condition feature script file # always use when creating monster initrd [ "$create_monster_initrd" ] && return 0 # Normalize to feature name feature="${1##*/}" feature="${feature#*-}" feature="${feature%.sh}" @@ -143,27 +203,27 @@ fi for feature in $ADDITIONAL_FEATURES ; do feature_exists "$feature" || echo "[WARNING] Feature \"$feature\" not found. A typo?" done # create an empty initrd if ! mkdir $tmp_mnt ; then error 1 "could not create temporary directory" fi # fill the initrd cp $INITRD_PATH/bin/linuxrc $linuxrc mkdir "$tmp_mnt/boot" -mkdir -p $tmp_mnt/{sbin,bin,etc,dev,proc,sys,root,config} +mkdir -p $tmp_mnt/{sbin,bin,etc,dev,proc,sys,root,config,usr/bin,usr/sbin} mkdir -p -m 4777 $tmp_mnt/tmp # Create a dummy /etc/mtab for mount/umount echo -n > $tmp_mnt/etc/mtab # Add modprobe, modprobe.conf*, and a version of /bin/true: modprobe.conf # might use it. for mod in $root_dir/etc/modprobe.conf $root_dir/etc/modprobe.conf.local \ $root_dir/etc/modprobe.d ; do test -e $mod && cp -r $mod $tmp_mnt/etc done cat > $tmp_mnt/bin/true <<-EOF Index: 1210/mkinitrd/scripts/setup-progs.sh =================================================================== --- 1210.orig/mkinitrd/scripts/setup-progs.sh +++ 1210/mkinitrd/scripts/setup-progs.sh @@ -24,48 +24,37 @@ for script in $INITRD_PATH/boot/*.sh; do condition="$(sed -rn 's/^#[[:blank:]]*%if:[[:blank:]]*(.*)$/if [ \1 ]; then/p' < "$script")" echo "$condition" >> run_all.sh # -- remember dependent modules sed -rn 's/^#[[:blank:]]*%modules:[[:blank:]]*(.*)$/modules="\1"/p' < $script >> run_all.sh echo "[ \"\$debug\" ] && echo running $file source boot/$file [ \"\$modules\" ] && load_modules" >> run_all.sh [ "$condition" ] && echo "fi" >> run_all.sh # and all programs it needs for files in $(sed -rn 's/^#[[:blank:]]*%programs:[[:blank:]]*(.*)$/\1/p' < "$script"); do for file in $(eval echo $files); do if [ "${file:0:17}" = "/lib/mkinitrd/bin" ]; then SOURCE=$file - DEST="./bin/" + DEST="${tmp_mnt}/bin/" elif [ "${file:0:1}" = "/" ]; then # absolute path files have to stay alive SOURCE=$file [ ! -e $file -a -e /usr$file ] && SOURCE="/usr$file" - DEST=".$file" + DEST="${tmp_mnt}$SOURCE" else case "$(type -t "$file")" in builtin) continue esac SOURCE=$(type -p "$file") - DEST="./bin/" + DEST="${tmp_mnt}$SOURCE" fi cp_bin "$SOURCE" "$DEST" - - # if we're given a symlink, always copy the linked file too - if [ -L "$SOURCE" ]; then - LINK=$(readlink -e "$SOURCE") - if [ -e "$LINK" ]; then - mkdir -p .$(dirname "$LINK") - cp_bin "$LINK" ."$LINK" - else - echo 2>&1 "WARNING: $LINK is a dangling symlink" - fi - fi done done fi done echo -ne "Features: " echo $features [ -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[@]}"
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor