The -T (--targetdirectory) option writes the root of the generated image directly to the specified directory. Useful for generating a shutdown-ramfs with mkinitcpio -T /run/initramfs/. --- functions | 35 ++++++++++++++++++----------------- mkinitcpio | 19 ++++++++++++++----- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/functions b/functions index f0dce80..acec621 100644 --- a/functions +++ b/functions @@ -627,45 +627,46 @@ initialize_buildroot() { # creates a temporary directory for the buildroot and initialize it with a # basic set of necessary directories and symlinks - local workdir= kernver=$1 arch=$(uname -m) + local workdir= kernver=$1 arch=$(uname -m) buildroot=$2 if ! workdir=$(mktemp -d --tmpdir mkinitcpio.XXXXXX); then error 'Failed to create temporary working directory in %s' "${TMPDIR:-/tmp}" return 1 fi + [[ -z $buildroot ]] && buildroot=$workdir/root # base directory structure - install -dm755 "$workdir/root"/{new_root,proc,sys,dev,run,tmp,etc,usr/{local,lib,bin}} - ln -s "usr/lib" "$workdir/root/lib" - ln -s "../lib" "$workdir/root/usr/local/lib" - ln -s "bin" "$workdir/root/usr/sbin" - ln -s "usr/bin" "$workdir/root/bin" - ln -s "usr/bin" "$workdir/root/sbin" - ln -s "../bin" "$workdir/root/usr/local/bin" - ln -s "../bin" "$workdir/root/usr/local/sbin" + install -dm755 "$buildroot"/{new_root,proc,sys,dev,run,tmp,etc,usr/{local,lib,bin}} + ln -s "usr/lib" "$buildroot/lib" + ln -s "../lib" "$buildroot/usr/local/lib" + ln -s "bin" "$buildroot/usr/sbin" + ln -s "usr/bin" "$buildroot/bin" + ln -s "usr/bin" "$buildroot/sbin" + ln -s "../bin" "$buildroot/usr/local/bin" + ln -s "../bin" "$buildroot/usr/local/sbin" case $arch in x86_64) - ln -s "lib" "$workdir/root/usr/lib64" - ln -s "usr/lib" "$workdir/root/lib64" + ln -s "lib" "$buildroot/usr/lib64" + ln -s "usr/lib" "$buildroot/lib64" ;; esac # mkinitcpio version stamp - printf '%s' "$version" >"$workdir/root/VERSION" + printf '%s' "$version" >"$buildroot/VERSION" # kernel module dir - install -dm755 "$workdir/root/usr/lib/modules/$kernver/kernel" + install -dm755 "$buildroot/usr/lib/modules/$kernver/kernel" # mount tables - ln -s /proc/self/mounts "$workdir/root/etc/mtab" - >"$workdir/root/etc/fstab" + ln -s /proc/self/mounts "$buildroot/etc/mtab" + >"$buildroot/etc/fstab" # indicate that this is an initramfs - >"$workdir/root/etc/initrd-release" + >"$buildroot/etc/initrd-release" # add a blank ld.so.conf to keep ldconfig happy - >"$workdir/root/etc/ld.so.conf" + >"$buildroot/etc/ld.so.conf" printf '%s' "$workdir" } diff --git a/mkinitcpio b/mkinitcpio index 7ce6c5c..489e199 100755 --- a/mkinitcpio +++ b/mkinitcpio @@ -19,7 +19,7 @@ _d_presets=mkinitcpio.d # options and runtime data _optmoduleroot= _optkver= _optgenimg= -_optcompress= +_optcompress= _opttargetdir= _optshowautomods=0 _optsavetree=0 _optshowmods=0 _optquiet=1 _optcolor=1 _optskiphooks=() _optaddhooks=() _hooks=() _optpreset=() @@ -53,6 +53,7 @@ usage: ${0##*/} [options] -r, --moduleroot <dir> Root directory for modules (default: /) -S, --skiphooks <hooks> Skip specified hooks, comma-separated, during build -s, --save Save build directory. (default: no) + -T, --targetdirectory <dir> Write generated image into <dir> -t, --builddir <dir> Use DIR as the temporary build directory -V, --version Display version information and exit -v, --verbose Verbose output (default: no) @@ -298,10 +299,10 @@ process_preset() ( trap 'cleanup 130' INT trap 'cleanup 143' TERM -_opt_short='A:c:g:H:hk:nLMPp:r:S:st:Vvz:' +_opt_short='A:c:g:H:hk:nLMPp:r:S:sT:t:Vvz:' _opt_long=('add:' 'addhooks:' 'config:' 'generate:' 'hookhelp:' 'help' 'kernel:' 'listhooks' 'automods' 'moduleroot:' 'nocolor' 'allpresets' - 'preset:' 'skiphooks:' 'save' 'builddir:' 'version' 'verbose' 'compress:') + 'preset:' 'skiphooks:' 'save' 'targetdirectory:' 'builddir:' 'version' 'verbose' 'compress:') parseopts "$_opt_short" "${_opt_long[@]}" -- "$@" || exit 1 set -- "${OPTRET[@]}" @@ -327,6 +328,10 @@ while :; do -s|--save) _optsavetree=1 ;; + -T|--targetdirectory) + shift + _opttargetdir=$1 + ;; -g|--generate) shift [[ -d $1 ]] && die "Invalid image path -- must not be a directory" @@ -414,8 +419,12 @@ KERNELVERSION=$(resolve_kernver "$_optkver") || cleanup 1 _d_kmoduledir=$_optmoduleroot/lib/modules/$KERNELVERSION [[ -d $_d_kmoduledir ]] || die "'$_d_kmoduledir' is not a valid kernel module directory" -_d_workdir=$(initialize_buildroot "$KERNELVERSION") || cleanup 1 -BUILDROOT=$_d_workdir/root +_d_workdir=$(initialize_buildroot "$KERNELVERSION" $_opttargetdir) || cleanup 1 +if [[ -z $_opttargetdir ]]; then + BUILDROOT=$_d_workdir/root +else + BUILDROOT=$_opttargetdir +fi . "$_f_config" || die "Failed to read configuration \`%s'" "$_f_config" -- 1.8.4.2