[arch-projects] [mkinitcpio] [PATCHv2 1/3] mkinitcpio: add -d option

Thomas Bächler thomas at archlinux.org
Tue Nov 19 17:10:26 EST 2013


The -d (--generatedir) option writes the root of the generated image
directly to the specified directory.

Useful for generating a shutdown-ramfs with mkinitcpio -d /run/initramfs/.
---
 functions  | 35 ++++++++++++++++++-----------------
 mkinitcpio | 15 ++++++++++-----
 2 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/functions b/functions
index f0dce80..81a6072 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
 
     if ! workdir=$(mktemp -d --tmpdir mkinitcpio.XXXXXX); then
         error 'Failed to create temporary working directory in %s' "${TMPDIR:-/tmp}"
         return 1
     fi
+    buildroot=${2:-$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..30cff6a 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)
+   -d, --generatedir <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:sd: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' 'generatedir:' 'builddir:' 'version' 'verbose' 'compress:')
 
 parseopts "$_opt_short" "${_opt_long[@]}" -- "$@" || exit 1
 set -- "${OPTRET[@]}"
@@ -327,6 +328,10 @@ while :; do
         -s|--save)
             _optsavetree=1
             ;;
+        -d|--generatedir)
+            shift
+            _opttargetdir=$1
+            ;;
         -g|--generate)
             shift
             [[ -d $1 ]] && die "Invalid image path -- must not be a directory"
@@ -414,8 +419,8 @@ 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
+BUILDROOT=${_opttargetdir:-$_d_workdir/root}
 
 . "$_f_config" || die "Failed to read configuration \`%s'" "$_f_config"
 
-- 
1.8.4.2



More information about the arch-projects mailing list