Re: revocation of /dev/console at the end of rc sequence

Warner Losh <[email protected]>
Newsgroups gmane.os.freebsd.architechture
Message-ID <CANCZdfrtxRsn5aod6K9okGBjoUg89-Rqz4bhVyHWWRpz9utRDg@mail.gmail.com>
On Wed, Mar 26, 2025 at 10:23 AM Andriy Gapon <[email protected]> wrote:

>
> Not sure what would be the best forum to talk about this issue, so posting
> here.
>
> I observe a kind of unexpected problem related to /dev/console.
> Here is my understanding of what is happening.
>
> Thanks to DTrace I was able to capture /dev/console getting "revoked", its
> vnode
> getting recycled (at least, destroyed):
>
>    1  15949                     vgonel:entry
> 2025 Mar 25 21:45:33 vgone vnode fffff8000607b540, console rdev by sh (21)
>
>                kernel`vgone+0x2f
>                kernel`devfs_revoke+0x41
>                kernel`VOP_REVOKE_APV+0x71
>                kernel`killjobc+0x15a
>                kernel`exit1+0x707
>                kernel`0xffffffff808bd00d
>                kernel`amd64_syscall+0x189
>                kernel`0xffffffff80c4fbfb
>
> My understanding is that this is the rc shell process exiting.
>
> init forks a process that exec-s bin/sh (or alternative init shell) to run
> /etc/rc (or alternative init script).
> The process sets up itself as a session leader and /dev/console as its
> controlling terminal (as well as stdin, stdout and stderr).
> It does that by calling login_tty() which internally uses setsid() and
> tcsetsid() to do the job.
> See runcom -> run_script -> execute_script -> open_console in
> sbin/init/init.c.
>
> I guess that this makes total sense given the nature of /etc/rc.
>
> When a session leader process exits, it revokes its controlling terminal.
> That's the standard behavior.
> I guess that the idea is that any descendant processes in the session get
> disassociated from the terminal.
>
> Both things make sense, but they lead to a problem as well.
> The problem is that by the time /etc/rc finishes there can be a daemon
> (so, not
> a member of the session) that opened /dev/console for its own needs.
> The daemon would then lose its /dev/console access which it may not expect.
>
> One such daemon is console-kit-daemon.
> Here is how /dev/console descriptor looks afterwards (as reported by
> procstat -f):
>    PID COMM                FD T V FLAGS    REF  OFFSET PRO NAME
>   3323 console-kit-daemon    10 v x r-------  10       0 -   -
>
> More details here:
> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=285394
> (Note that some earlier comments have incorrect information and
> assumptions).
>
> Can we do something better here given the special nature of /dev/console?
> May something in FreeSBD?
>
> For console-kit-daemon I have an idea of using /dev/ttyv0 instead of
> /dev/console.  The daemon needs the device for things like observing VT
> switching and similar operations
>

So what is it using /dev/console for? I think the answer to this question
will help
understand the right solution. What does console-kit think it can do with
/dev/console?
/dev/console, even if we didn't do the revoke, seems like the wrong thing
for it
to be opening.

Seems like
     TIOCCONS int *on
                 If on points to a non-zero integer, redirect kernel console
                 output (kernel printf's) to this terminal.  If on points
to a
                 zero integer, redirect kernel console output back to the
                 normal console.  This is usually used on workstations to
                 redirect kernel messages to a particular window.
is what it should be doing.
Is the standard way to redirect / scrape the console.

Also, ttyv0 is always wrong to hard-code. It might have nothing at all
to do with the console.

There's a couple of different notions of "the console" today, and they
are a bit poorly defined. There's the "console" for the kernel. And it's
really
a collection of devices that get kernel output and are prompted for kernel
input.

There's the "console" used for /etc/rc. This is /dev/console. It's just an
alias for the first tty device in the kernel console list (sometimes called
the
primary console). there's little special beyond that, though Kyle and I
keep threatening to make it a mux of all the kernel consoles on that list.
It's functionality is somewhat limited (and has been since phk separated
it out from the tty that underlies it around FreeBSD 2 or 3).

So what is it that console-kit-daemon is wanting to do?

Warner
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.