dracut: use /bin/sh instead of bash as the intepreter

Despite that dracut has a hard dependency on bash,
its modules doesn't, dracut only has a hard dependency on bash for
module-setup (on a fully usable machine). Inside initramfs, dracut
allows users choose from a list of handful other shells, e.g. bash,
busybox, dash, mkfsh.

In fact, my local machine's initramfs is being built with dash,
and it's functional for a very long time.

Before 64025fa3a (Silence 'make checkbashisms', 2020-08-20), we also
allows our users to have that right, too.

Let's fix the problem 'make checkbashisms' reported and allows our users
to have that right, again.

For 'plymouth' case, let's simply run the command inside the if instead
of checking for the existence of command before running it, because the
status is also failture if plymouth is unavailable.

While we're at it, let's remove an unnecessary fork for grep in
zfs-generator.sh.in and its following complicated 'if elif fi' with
a simple 'case ... esac'.

To support this change, also exclude 90zfs from "make checkbashisms"
because the current CI infrastructure ships an old version of
"checkbashisms", which complains about "command -v", while the current
latest "checkbashisms" thinks it's fine. In the near future, we can
revert that change to "Makefile.am" when CI infrastructure is updated.

Reviewed-by: Gabriel A. Devenyi <gdevenyi@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Closes #11244
This commit is contained in:
Đoàn Trần Công Danh 2020-11-29 02:02:08 +07:00 committed by GitHub
parent 04a82e043d
commit 16692e6ba0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 21 additions and 19 deletions

View File

@ -159,6 +159,7 @@ checkbashisms:
-o -name 'smart' -prune \ -o -name 'smart' -prune \
-o -name 'paxcheck.sh' -prune \ -o -name 'paxcheck.sh' -prune \
-o -name 'make_gitrev.sh' -prune \ -o -name 'make_gitrev.sh' -prune \
-o -name '90zfs' -prune \
-o -type f ! -name 'config*' \ -o -type f ! -name 'config*' \
! -name 'libtool' \ ! -name 'libtool' \
-exec sh -c 'awk "NR==1 && /\#\!.*bin\/sh.*/ {print FILENAME;}" "{}"' \;); \ -exec sh -c 'awk "NR==1 && /\#\!.*bin\/sh.*/ {print FILENAME;}" "{}"' \;); \

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
. /lib/dracut-zfs-lib.sh . /lib/dracut-zfs-lib.sh

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
. /lib/dracut-zfs-lib.sh . /lib/dracut-zfs-lib.sh

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
. /lib/dracut-lib.sh . /lib/dracut-lib.sh

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/bin/sh
echo "zfs-generator: starting" >> /dev/kmsg echo "zfs-generator: starting" >> /dev/kmsg
@ -11,7 +11,7 @@ GENERATOR_DIR="$1"
[ -f /lib/dracut-lib.sh ] && dracutlib=/lib/dracut-lib.sh [ -f /lib/dracut-lib.sh ] && dracutlib=/lib/dracut-lib.sh
[ -f /usr/lib/dracut/modules.d/99base/dracut-lib.sh ] && dracutlib=/usr/lib/dracut/modules.d/99base/dracut-lib.sh [ -f /usr/lib/dracut/modules.d/99base/dracut-lib.sh ] && dracutlib=/usr/lib/dracut/modules.d/99base/dracut-lib.sh
type getarg >/dev/null 2>&1 || { command -v getarg >/dev/null 2>&1 || {
echo "zfs-generator: loading Dracut library from $dracutlib" >> /dev/kmsg echo "zfs-generator: loading Dracut library from $dracutlib" >> /dev/kmsg
. "$dracutlib" . "$dracutlib"
} }
@ -22,16 +22,17 @@ type getarg >/dev/null 2>&1 || {
# If root is not ZFS= or zfs: or rootfstype is not zfs # If root is not ZFS= or zfs: or rootfstype is not zfs
# then we are not supposed to handle it. # then we are not supposed to handle it.
[ "${root##zfs:}" = "${root}" -a "${root##ZFS=}" = "${root}" -a "$rootfstype" != "zfs" ] && exit 0 [ "${root##zfs:}" = "${root}" ] &&
[ "${root##ZFS=}" = "${root}" ] &&
[ "$rootfstype" != "zfs" ] &&
exit 0
rootfstype=zfs rootfstype=zfs
if echo "${rootflags}" | grep -Eq '^zfsutil$|^zfsutil,|,zfsutil$|,zfsutil,' ; then case ",${rootflags}," in
true *,zfsutil,*) ;;
elif test -n "${rootflags}" ; then ,,) rootflags=zfsutil ;;
rootflags="zfsutil,${rootflags}" *) rootflags="zfsutil,${rootflags}" ;;
else esac
rootflags=zfsutil
fi
echo "zfs-generator: writing extension for sysroot.mount to $GENERATOR_DIR"/sysroot.mount.d/zfs-enhancement.conf >> /dev/kmsg echo "zfs-generator: writing extension for sysroot.mount to $GENERATOR_DIR"/sysroot.mount.d/zfs-enhancement.conf >> /dev/kmsg
@ -58,4 +59,4 @@ echo "zfs-generator: writing extension for sysroot.mount to $GENERATOR_DIR"/sysr
[ -d "$GENERATOR_DIR"/initrd-root-fs.target.requires ] || mkdir -p "$GENERATOR_DIR"/initrd-root-fs.target.requires [ -d "$GENERATOR_DIR"/initrd-root-fs.target.requires ] || mkdir -p "$GENERATOR_DIR"/initrd-root-fs.target.requires
ln -s ../sysroot.mount "$GENERATOR_DIR"/initrd-root-fs.target.requires/sysroot.mount ln -s ../sysroot.mount "$GENERATOR_DIR"/initrd-root-fs.target.requires/sysroot.mount
echo "zfs-generator: finished" >> /dev/kmsg echo "zfs-generator: finished" >> /dev/kmsg

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
command -v getarg >/dev/null || . /lib/dracut-lib.sh command -v getarg >/dev/null || . /lib/dracut-lib.sh
command -v getargbool >/dev/null || { command -v getargbool >/dev/null || {
@ -144,7 +144,7 @@ ask_for_password() {
{ flock -s 9; { flock -s 9;
# Prompt for password with plymouth, if installed and running. # Prompt for password with plymouth, if installed and running.
if type plymouth >/dev/null 2>&1 && plymouth --ping 2>/dev/null; then if plymouth --ping 2>/dev/null; then
plymouth ask-for-password \ plymouth ask-for-password \
--prompt "$ply_prompt" --number-of-tries="$ply_tries" \ --prompt "$ply_prompt" --number-of-tries="$ply_tries" \
--command="$ply_cmd" --command="$ply_cmd"

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
# only run this on systemd systems, we handle the decrypt in mount-zfs.sh in the mount hook otherwise # only run this on systemd systems, we handle the decrypt in mount-zfs.sh in the mount hook otherwise
[ -e /bin/systemctl ] || return 0 [ -e /bin/systemctl ] || return 0

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/sh
type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh command -v getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
if zpool list 2>&1 | grep -q 'no pools available' ; then if zpool list 2>&1 | grep -q 'no pools available' ; then
info "ZFS: No active pools, no need to export anything." info "ZFS: No active pools, no need to export anything."