[arch-projects] [mkinitcpio][PATCH] mkinitcpio: remove --basedir option
Tom Gundersen
teg at jklm.no
Thu May 3 14:32:06 EDT 2012
I guess the only sane usecase is to create the ramfs from the instal
medium. Currently, this functionality would let you generate a ramfs
without installing mkinitcpio on the target machine. In the same way that
you don't have to instal pacman. I don't know how useful this is...
On May 3, 2012 8:22 PM, "Dave Reisner" <dreisner at archlinux.org> wrote:
> This option is just a bad idea. Initramfs creation is too important to
> get wrong, and running it from outside the root FS has too many gotchas,
> the worst of them being:
>
> - where do you pull hooks from?
> - how do you resolve binary dependencies within the root?
>
> In general, dealing with the extra luggage of the base directory makes the
> codebase more complicated than it needs to be (see all the '_' prefixed
> functions which are called from add functions). In favor of simplifying the
> code, and making it more maintainable, kill this off and force the sane
> option of chroot'ing into an install if the need arises.
>
> Signed-off-by: Dave Reisner <dreisner at archlinux.org>
> ---
> I suspect that no one will miss this option. I certainly won't. However,
> please speak up if you really do think you'll miss this option, and make
> your case for keeping it around.
>
> If no one objects, I'll be removing this with next proper release.
>
> functions | 48
> ++++++++++++++----------------------------------
> install/autodetect | 4 ++--
> install/consolefont | 6 +++---
> install/fsck | 4 ++--
> install/keymap | 2 +-
> mkinitcpio | 41 +++++++++++++----------------------------
> mkinitcpio.8.txt | 4 ----
> 7 files changed, 35 insertions(+), 74 deletions(-)
>
> diff --git a/functions b/functions
> index 0fec85b..2576180 100644
> --- a/functions
> +++ b/functions
> @@ -192,26 +192,6 @@ in_array() {
> return 1 # Not Found
> }
>
> -pathlookup() {
> - # a basedir aware 'type -P' (or which) for executables
> - # $1: binary to find
> -
> - local path=
> - local -a paths=
> -
> - IFS=: read -r -a paths <<< "$PATH"
> -
> - for path in "${paths[@]}"; do
> - [[ ${path:0:1} = [.~] ]] && continue
> - if [[ -x $BASEDIR$path/$1 ]]; then
> - printf '%s' "$BASEDIR$path/$1"
> - return 0
> - fi
> - done
> -
> - return 1
> -}
> -
> _add_file() {
> # add a file to $BUILDROOT
> # $1: pathname on initcpio
> @@ -266,7 +246,7 @@ auto_modules() {
> IFS=$'\n' read -rd '' -a mods < \
> <(find /sys/devices -name modalias -exec sort -u {} + |
> # delimit each input by a newline, expanded in place
> - xargs -d $'\n' modprobe -qd "$BASEDIR" -aRS "$KERNELVERSION" |
> + xargs -d $'\n' modprobe -qaRS "$KERNELVERSION" |
> sort -u)
>
> printf "%s\n" "${mods[@]//-/_}"
> @@ -333,12 +313,12 @@ add_module() {
> done
> ;;
> firmware)
> - if [[ -e "$BASEDIR/usr/lib/firmware/$value" ]]; then
> - _add_file "/usr/lib/firmware/$value"
> "$BASEDIR/usr/lib/firmware/$value" 644
> + if [[ -e /usr/lib/firmware/$value ]]; then
> + _add_file "/usr/lib/firmware/$value"
> "/usr/lib/firmware/$value" 644
> fi
> ;;
> esac
> - done < <(modinfo -b "$BASEDIR" -k "$KERNELVERSION" -0 "$module"
> 2>/dev/null)
> + done < <(modinfo -k "$KERNELVERSION" -0 "$module" 2>/dev/null)
>
> if [[ -z $path ]]; then
> (( ign_errors )) && return 0
> @@ -410,7 +390,7 @@ add_file() {
> # determine source and destination
> local src= dest=${2:-$1} mode=
>
> - src=$BASEDIR$1
> + src=$1
>
> [[ -f "$src" ]] || { error "file not found: \`%s'" "$src"; return 1; }
>
> @@ -420,7 +400,7 @@ add_file() {
> return 1
> fi
>
> - _add_file "${dest#$BASEDIR}" "$src" "$mode"
> + _add_file "$dest" "$src" "$mode"
> }
>
> add_binary() {
> @@ -433,9 +413,9 @@ add_binary() {
> local line= regex= binary= dest= mode= sodep= resolved= dirname=
>
> if [[ ${1:0:1} != '/' ]]; then
> - binary=$(pathlookup "$1")
> + binary=$(type -P "$1")
> else
> - binary=$BASEDIR$1
> + binary=$1
> fi
>
> [[ -f "$binary" ]] || { error "file not found: \`%s'" "$1"; return 1; }
> @@ -444,7 +424,7 @@ add_binary() {
> mode=$(stat -c %a "$binary")
>
> # always add the binary itself
> - _add_file "${dest#$BASEDIR}" "$binary" "$mode"
> + _add_file "$dest" "$binary" "$mode"
>
> lddout=$(ldd "$binary" 2>/dev/null) || return 0 # not a binary!
>
> @@ -455,13 +435,13 @@ add_binary() {
>
> if [[ -f $sodep && ! -e $BUILDROOT$sodep ]]; then
> if [[ ! -L $sodep ]]; then
> - _add_file "$sodep" "$BASEDIR$sodep" "$(stat -c %a
> "$sodep")"
> + _add_file "$sodep" "$sodep" "$(stat -c %a "$sodep")"
> else
> - resolved=$(readlink -e "$BASEDIR$sodep")
> + resolved=$(readlink -e "$sodep")
> dirname=${resolved%/*}
> - _add_dir "${dirname#$BASEDIR}" 755
> - _add_symlink "$sodep" "${resolved#$BASEDIR}"
> - _add_file "${resolved#$BASEDIR}" "$resolved" 755
> + _add_dir "$dirname" 755
> + _add_symlink "$sodep" "$resolved"
> + _add_file "$resolved" "$resolved" 755
> fi
> fi
> done <<< "$lddout"
> diff --git a/install/autodetect b/install/autodetect
> index 4ed7ccf..1daa429 100644
> --- a/install/autodetect
> +++ b/install/autodetect
> @@ -25,7 +25,7 @@ build() {
> auto_modules >"$MODULE_FILE"
>
> # detect filesystem for root
> - if rootfstype=$(findmnt -uno fstype "${BASEDIR:-/}"); then
> + if rootfstype=$(findmnt -uno fstype '/'); then
> add_if_avail "$rootfstype"
> else
> error "failed to detect root filesystem"
> @@ -33,7 +33,7 @@ build() {
> fi
>
> # detect filesystem for separate /usr
> - if usrfstype=$(findmnt -snero fstype --tab-file "$BASEDIR/etc/fstab"
> /usr); then
> + if usrfstype=$(findmnt -snero fstype --tab-file '/etc/fstab' /usr);
> then
> add_if_avail "$usrfstype"
> fi
>
> diff --git a/install/consolefont b/install/consolefont
> index 2d2d8ea..5be9344 100644
> --- a/install/consolefont
> +++ b/install/consolefont
> @@ -6,19 +6,19 @@ build() {
> # subshell to avoid namespace pollution
> (
> for cfg in etc/{rc,vconsole}.conf; do
> - [[ -s $BASEDIR/$cfg ]] && . "$BASEDIR/$cfg"
> + [[ -s $cfg ]] && . "$cfg"
> done
>
> [[ $FONT ]] && CONSOLEFONT=$FONT
>
> if [[ $CONSOLEFONT ]]; then
> - for file in
> "$BASEDIR/usr/share/kbd/consolefonts/$CONSOLEFONT".psf?(u)?(.gz); do
> + for file in
> "/usr/share/kbd/consolefonts/$CONSOLEFONT".psf?(u)?(.gz); do
> if [[ -e $file ]]; then
> [[ $file =~ \.(psfu?)(\.gz)?$ ]] &&
> ext=${BASH_REMATCH[1]}
> if [[ $file = *.gz ]]; then
> gzip -cd "$file" > "$BUILDROOT/consolefont.$ext"
> else
> - add_file "${file#$BASEDIR}" "/consolefont.$ext"
> + add_file "$file" "/consolefont.$ext"
> fi
> exit 0
> fi
> diff --git a/install/fsck b/install/fsck
> index baf1c3d..e8b5ea3 100644
> --- a/install/fsck
> +++ b/install/fsck
> @@ -21,9 +21,9 @@ build() {
> add_fsck $usrfstype && (( ++added ))
> fi
> else
> - for fsck in "$BASEDIR"/{usr/,}{s,}bin/fsck.*; do
> + for fsck in /{usr/,}{s,}bin/fsck.*; do
> [[ -f $fsck ]] || continue
> - add_binary "${fsck#$BASEDIR}" && (( ++added ))
> + add_binary "$fsck" && (( ++added ))
> done
> fi
>
> diff --git a/install/keymap b/install/keymap
> index fe5e459..1cbf75e 100644
> --- a/install/keymap
> +++ b/install/keymap
> @@ -8,7 +8,7 @@ build() {
> unset LANG
>
> for cfg in etc/{rc,vconsole,locale}.conf; do
> - [[ -s $BASEDIR/$cfg ]] && . "$BASEDIR/$cfg"
> + [[ -s $cfg ]] && . "$cfg"
> done
>
> [[ $LANG ]] && LOCALE=$LANG
> diff --git a/mkinitcpio b/mkinitcpio
> index 084dff7..f7fc571 100755
> --- a/mkinitcpio
> +++ b/mkinitcpio
> @@ -22,7 +22,7 @@ INSTDIR=(install /usr/lib/initcpio/install
> /lib/initcpio/install)
> PRESETDIR=mkinitcpio.d
> COMPRESSION=gzip
>
> -declare BASEDIR= MODULE_FILE= GENIMG= PRESET= COMPRESSION_OPTIONS=
> BUILDROOT=
> +declare MODULE_FILE= GENIMG= PRESET= COMPRESSION_OPTIONS= BUILDROOT=
> declare NC= BOLD= BLUE= GREEN= RED= YELLOW=
> declare -i QUIET=1 SHOW_AUTOMODS=0 SAVELIST=0 COLOR=1
> declare -a SKIPHOOKS ADDED_MODULES MODPATHS
> @@ -42,7 +42,6 @@ usage: ${0##*/} [options]
>
> Options:
> -A, --add <hooks> Add specified hooks, comma separated, to
> image
> - -b, --basedir <dir> Use alternate base directory. (default: /)
> -c, --config <config> Use alternate config file. (default:
> /etc/mkinitcpio.conf)
> -g, --generate <path> Generate cpio image and write to specified
> path
> -H, --hookhelp <hookname> Display help for given hook and exit
> @@ -87,18 +86,18 @@ get_kernver() {
> return 0
> fi
>
> - if [[ ! -e $BASEDIR$kernel ]]; then
> - error "Specified kernel image does not exist: \`%s'"
> "$BASEDIR$kernel"
> + if [[ ! -e $kernel ]]; then
> + error "Specified kernel image does not exist: \`%s'" "$kernel"
> return 1
> fi
>
> - read _ kernver < <(file -Lb "$BASEDIR$kernel" | grep -o 'version [^
> ]\+')
> - if [[ $kernver && -e $BASEDIR/lib/modules/$kernver ]]; then
> + read _ kernver < <(file -Lb "$kernel" | grep -o 'version [^ ]\+')
> + if [[ $kernver && -e /lib/modules/$kernver ]]; then
> echo "$kernver"
> return 0
> fi
>
> - [[ ${optkver:0:1} == / ]] && optkver=$BASEDIR$optkver
> + [[ ${optkver:0:1} == / ]] && optkver=$optkver
> error "invalid kernel specifier: \`%s'" "$optkver"
>
> return 1
> @@ -116,9 +115,9 @@ compute_hookset() {
> trap 'cleanup 130' INT
> trap 'cleanup 143' TERM
>
> -OPT_SHORT='A:b:c:g:H:hk:mnLMp:S:st:vz:'
> -OPT_LONG=('add:' 'basedir:' 'config:' 'generate:' 'hookhelp:' 'help'
> 'kernel:' 'listhooks'
> - 'automods' 'nocolor' 'preset:' 'skiphooks:' 'save' 'builddir:'
> 'verbose' 'compress:')
> +OPT_SHORT='A:c:g:H:hk:mnLMp:S:st:vz:'
> +OPT_LONG=('add:' 'config:' 'generate:' 'hookhelp:' 'help' 'kernel:'
> 'listhooks' 'automods'
> + 'nocolor' 'preset:' 'skiphooks:' 'save' 'builddir:' 'verbose'
> 'compress:')
>
> if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
> exit 1
> @@ -141,9 +140,6 @@ while :; do
> optkver=$1 ;;
> -s|--save)
> SAVELIST=1 ;;
> - -b|--basedir)
> - shift
> - BASEDIR=$1 ;;
> -g|--generate)
> shift
> GENIMG=$1 ;;
> @@ -224,16 +220,6 @@ readonly NC BOLD BLUE GREEN RED YELLOW
> [[ -e /proc/self/mountinfo ]] || die "/proc must be mounted!"
> [[ -e /dev/fd ]] || die "/dev must be mounted!"
>
> -if [[ $BASEDIR ]]; then
> - # resolve the path. it might be a relative path and/or contain
> symlinks
> - if ! pushd "$BASEDIR" &>/dev/null; then
> - die "base directory does not exist or is not a directory: \`%s'"
> "$BASEDIR"
> - fi
> - BASEDIR=$(pwd -P)
> - BASEDIR=${BASEDIR%/}
> - popd &>/dev/null
> -fi
> -
> KERNELVERSION=$(get_kernver "$optkver") || cleanup 1
>
> if [[ $TMPDIR ]]; then
> @@ -261,7 +247,6 @@ if [[ $PRESET ]]; then
> if [[ -f "$PRESET" ]]; then
> # Use -b, -m and -v options specified earlier
> declare -a preset_mkopts preset_cmd
> - [[ $BASEDIR ]] && preset_mkopts+=(-b "$BASEDIR")
> (( QUIET )) || preset_mkopts+=(-v)
> # Build all images
> . "$PRESET"
> @@ -279,7 +264,7 @@ if [[ $PRESET ]]; then
>
> preset_config=${p}_config
> if [[ ${!preset_config:-$ALL_config} ]]; then
> - preset_cmd+=(-c "$BASEDIR${!preset_config:-$ALL_config}")
> + preset_cmd+=(-c "${!preset_config:-$ALL_config}")
> else
> warning "No configuration file specified. Skipping image
> \`%s'" "$p"
> continue
> @@ -287,7 +272,7 @@ if [[ $PRESET ]]; then
>
> preset_image=${p}_image
> if [[ ${!preset_image} ]]; then
> - preset_cmd+=(-g "$BASEDIR${!preset_image}")
> + preset_cmd+=(-g "${!preset_image}")
> else
> warning "No image file specified. Skipping image \`%s'"
> "$p"
> continue
> @@ -327,7 +312,7 @@ if (( ${#hooks[*]} == 0 )); then
> die "Invalid config: No hooks found"
> fi
>
> -MODULEDIR=$BASEDIR/lib/modules/$KERNELVERSION/
> +MODULEDIR=/lib/modules/$KERNELVERSION/
> if [[ ! -d $MODULEDIR ]]; then
> die "'$MODULEDIR' is not a valid kernel module directory"
> fi
> @@ -416,7 +401,7 @@ if (( ${#ADDED_MODULES[*]} )); then
>
> msg "Generating module dependencies"
> install -m644 -t "$BUILDROOT/usr/lib/modules/$KERNELVERSION" \
> - "$BASEDIR/lib/modules/$KERNELVERSION"/modules.{builtin,order}
> + "/lib/modules/$KERNELVERSION"/modules.{builtin,order}
> depmod -b "$BUILDROOT" "$KERNELVERSION"
>
> # remove all non-binary module.* files (except devname for on-demand
> module loading)
> diff --git a/mkinitcpio.8.txt b/mkinitcpio.8.txt
> index 4b0d770..14a349b 100644
> --- a/mkinitcpio.8.txt
> +++ b/mkinitcpio.8.txt
> @@ -29,10 +29,6 @@ Options
> after all other hooks from the config file. Multiple hooks should be
> comma-separated. This option can be specified multiple times.
>
> -*-b, \--basedir* 'basedir'::
> - Use 'basedir' as a starting point for gathering information about
> the
> - currently running system. Default: /.
> -
> *-c, \--config* 'config'::
> Use 'config' file to generate the ramdisk. Default:
> /etc/mkinitcpio.conf
>
> --
> 1.7.10.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.archlinux.org/pipermail/arch-projects/attachments/20120503/dfb04163/attachment-0001.html>
More information about the arch-projects
mailing list