So, for emergency_shell to work right, it has to be a session leader
(e.g. by using setsid) and it needs to have a controlling tty (ctty).
But /dev/console and /dev/tty0 are just aliases - they aren't allowed to
be cttys!
For this to work, we need to be attached to a *real* tty. Which means
finding the real tty that /dev/console is attached to.
In the past, anaconda's "loader" and busybox's "cttyhack" used a series
of ioctl() calls to guess what tty device /dev/console is actually
attached to. Now we have /sys/class/tty/*/active, which tells us what
device(s) are active for aliases like /dev/console or /dev/tty0.
So: we can find our actual console device by following the 'active'
links until we get to a real device. cttyhack uses the *last* device it
finds in the list for /dev/console so we'll do the same.
---
modules.d/99base/dracut-lib.sh | 15 ++++++++++++---
1 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh
index 80e093b..cc93a83 100755
--- a/modules.d/99base/dracut-lib.sh
+++ b/modules.d/99base/dracut-lib.sh
@@ -803,10 +803,19 @@ emergency_shell()
echo
export PS1="$_rdshell_name:\${PWD}# "
[ -e /.profile ] || >/.profile
- _ctty=/dev/console
+
+ _ctty="$(getarg rd.ctty=)" && _ctty="/dev/${_ctty##*/}"
+ if [ -z "$_ctty" ]; then
+ _ctty=console
+ while [ -f /sys/class/tty/$_ctty/active ]; do
+ _ctty=$(cat /sys/class/tty/$_ctty/active)
+ _ctty=${_ctty##* } # last one in the list
+ done
+ _ctty=/dev/$_ctty
+ fi
+ [ -c "$_ctty" ] || _ctty=/dev/tty1
+
if [ -n "$(command -v setsid)" ]; then
- _ctty="$(getarg rd.ctty=)" && _ctty="/dev/${_ctty##*/}"
- [ -c "$_ctty" ] || _ctty=/dev/tty1
setsid sh -i -l 0<$_ctty 1>$_ctty 2>&1
elif [ -n "$(command -v openvt)" ] && ! getarg "console=" >/dev/null
2>&1 && getargbool 1 "rd.openvt" ; then
openvt -f -c 1 -w -s -l -- sh
--
1.7.7.6
--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html