[Buildroot] [PATCH 1/1] fs/cpio: make initramfs init script survive 'console=' kernel argument

Peter Korsgaard peter at korsgaard.com
Thu Aug 20 16:42:09 UTC 2020


>>>>> "Yann" == Yann E MORIN <yann.morin.1998 at free.fr> writes:

 > Timo, All,
 > On 2019-09-23 10:58 +0000, Timo Ketola spake thusly:
 >> When booting with 'console=<empty>' in the kernel command line (as e.g.
 >> U-Boot does with silent flags in effect), opening /dev/console fails.
 >> That is fatal in the /init script and kernel will panic. It is also
 >> needless, because the kernel tries to open it anyway (well, as long as
 >> we have console node in initramfs /dev; cpio.mk creates that alright).
 >> 
 >> Signed-off-by: Timo Ketola <timo.ketola at exertus.fi>

 > I've applied to master, after extending the commit log with all the gory
 > details explaininng why we can indeed safely remove those redisrections
 > now.

 > Thank you for the patience on this patch.

 > Thanks also to Peter for helping on IRC about this research.

It unfortunately causes a regression :/

I have a setup booting from an initramfs, using devtmpfs, busybox init
and glibc. One of the initscripts used ttyname_r(3) (through the busybox
tty applet), and with this change ttyname_3() fails rather than
returning /dev/console.

Looking at the glibc code, it does a fstat on fd(0), and then compares
st_ino / st_dev (and optionally st_rdev) against all the entries under
/dev.

As the kernel does not mount devtmpfs for us, fd 0 refers to the
/dev/console entry in the rootfs (cpio), but after devtmpfs is mounted,
/dev/console is the entry in the devtmpfs so st_dev / st_ino will no
longer match :/

This logic seems to be added to support containers. See the following
glibc commit:

commit 15e9a4f378c8607c2ae1aa465436af4321db0e23
Author: Christian Brauner <christian.brauner at canonical.com>
Date:   Fri Jan 27 15:59:59 2017 +0100

    linux ttyname and ttyname_r: do not return wrong results

    If a link (say /proc/self/fd/0) pointing to a device, say /dev/pts/2, in a
    parent mount namespace is passed to ttyname, and a /dev/pts/2 exists (in a
    different devpts) in the current namespace, then it returns /dev/pts/2.
    But /dev/pts/2 is NOT the current tty, it is a different file and device.

    Detect this case and return ENODEV.  Userspace can choose to take this as a hint
    that the fd points to a tty device but to act on the fd rather than the link.

    Signed-off-by: Serge Hallyn <serge at hallyn.com>
    Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>


Notice: Once logged in, tty does work correctly. Presumably login
reopens stdin/stdout/stderr.

Any great ideas about how we can fix this? I would prefer to not add a
lot of logic in /init, so preferably not having to mount /proc and so
on. If we don't have a good solution, what then? Do we revert or keep it
like this?

-- 
Bye, Peter Korsgaard


More information about the buildroot mailing list