[arch-projects] [mkinitcpio] [PATCHv2 1/3] mkinitcpio: add -d option
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
--- mkinitcpio | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mkinitcpio b/mkinitcpio index 30cff6a..e927884 100755 --- a/mkinitcpio +++ b/mkinitcpio @@ -440,9 +440,7 @@ if (( _optshowautomods )); then cleanup 0 fi -if [[ -z $_optgenimg ]]; then - msg "Starting dry run: %s" "$KERNELVERSION" -else +if [[ $_optgenimg ]]; then # check for permissions. if the image doesn't already exist, # then check the directory if [[ ( -e $_optgenimg && ! -w $_optgenimg ) || @@ -456,6 +454,10 @@ else fi msg "Starting build: %s" "$KERNELVERSION" +elif [[ $_opttargetdir ]]; then + msg "Starting build: %s" "$KERNELVERSION" +else + msg "Starting dry run: %s" "$KERNELVERSION" fi # set functrace and trap to catch errors in add_* functions @@ -494,6 +496,8 @@ ldconfig -r "$BUILDROOT" &>/dev/null if [[ $_optgenimg ]]; then build_image "$_optgenimg" "$_optcompress" +elif [[ $_opttargetdir ]]; then + msg "Build complete." else msg "Dry run complete, use -g IMAGE to generate a real image" fi -- 1.8.4.2
When enabled, this service generates an "initramfs" that systemd pivots to on shutdown to ensure clean umounting and shutdown of loop and dm devices. The actual work is done by systemd-shutdown. --- Makefile | 4 +++- install/sd-shutdown | 14 ++++++++++++++ mkinitcpio-generate-shutdown-ramfs.service | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 install/sd-shutdown create mode 100644 mkinitcpio-generate-shutdown-ramfs.service diff --git a/Makefile b/Makefile index 1b933c9..38a7111 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,8 @@ DIRS = \ /usr/share/man/man8 \ /usr/share/man/man5 \ /usr/share/man/man1 \ - /usr/share/mkinitcpio + /usr/share/mkinitcpio \ + /usr/lib/systemd/system all: doc @@ -48,6 +49,7 @@ install: all cp -at $(DESTDIR)/usr/lib/initcpio hooks install install -m644 -t $(DESTDIR)/usr/share/mkinitcpio mkinitcpio.d/* + install -m644 mkinitcpio-generate-shutdown-ramfs.service $(DESTDIR)/usr/lib/systemd/system/mkinitcpio-generate-shutdown-ramfs.service install -m755 50-mkinitcpio.install $(DESTDIR)/usr/lib/kernel/install.d/50-mkinitcpio.install diff --git a/install/sd-shutdown b/install/sd-shutdown new file mode 100644 index 0000000..7e86dad --- /dev/null +++ b/install/sd-shutdown @@ -0,0 +1,14 @@ +#!/bin/bash + +build() { + add_binary /usr/lib/systemd/systemd-shutdown /shutdown +} + +help() { + cat <<HELPEOF +This hook adds systemd-shutdown to the initramfs. This is only +if the image is extracted to /run/initramfs before shutdown. +HELPEOF +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/mkinitcpio-generate-shutdown-ramfs.service b/mkinitcpio-generate-shutdown-ramfs.service new file mode 100644 index 0000000..36c2508 --- /dev/null +++ b/mkinitcpio-generate-shutdown-ramfs.service @@ -0,0 +1,15 @@ +[Unit] +Description=Generate shutdown-ramfs +DefaultDependencies=no +Before=shutdown.target +ConditionFileIsExecutable=!/run/initramfs/shutdown + +[Service] +Type=oneshot +# /tmp could be umounted at this point +# use /run as temporary directory +Environment=TMPDIR=/run +ExecStart=/usr/bin/mkinitcpio -A sd-shutdown -c /dev/null -d /run/initramfs + +[Install] +WantedBy=shutdown.target -- 1.8.4.2
participants (1)
-
Thomas Bächler