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

Warner Losh <[email protected]>
Newsgroups gmane.os.freebsd.architechture
Message-ID <CANCZdfqhuuqNc8_5jbUa24dHRQ4T_Ensgvmu-ojqVd0XHA+a+w@mail.gmail.com>
On Wed, Mar 26, 2025 at 12:58 PM Andriy Gapon <[email protected]> wrote:

> On 26/03/2025 6:54 pm, Warner Losh wrote:
> >
> >
> > On Wed, Mar 26, 2025 at 10:23 AM Andriy Gapon <[email protected]
> > <mailto:[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
> >     <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?
>
> I guess I should have expanded on "things like observing VT switching and
> similar operations".
> So, console-kit issues ioctl-s like VT_WAITACTIVE, VT_ACTIVATE and similar.
>
> I also would like to mention that those ioctl-s are not documented in the
> manual
> pages.  Perhaps, screen(4) would have been a good place for that.
>

vt(4) maybe? screen(4) doesn't look to be the right place since it's
describing
something else.


> I guess I could say that console-kit needs a control device for video
> console.
> It presently uses /dev/console for that role and it works but it may not
> be the
> best choice.
>

So it would be more fair to say you need a control device for the video
subsystem.
Video console is an overloaded term and only tangentially related to
/dev/console
which I don't think should have ever been used for this purpose and is
leading to
the confusion.


> I do not think that we have an explicitly designed control device for
> video
> consoles.  From the code I get an impression that any video console
> terminal
> (ttyvX) should be suitable for that role.  E.g., vidcontrol just uses
> whatever
> device happens to be its stdin.
> But maybe that's not so.
>

Yes. vidcontrol was designed more for interactive use than other use. You
proved
you could access it by passing things through stdin. Not a great design,
but one that
reflects what stty does. And one that was adequate enough in the early days
that it
didn't change when we went from syscons -> vt.

And you're right, there's no /dev/ttyv.ctl that can be used for this. Any
of the ttyvX
gives effective ownership to all tttyvX if I'm reading things right just
now.

> /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.
>
> I guess that this not useful at all for console-kit.
>

Yea. I thought it did something else entirely...


> > Also, ttyv0 is always wrong to hard-code. It might have nothing at all
> > to do with the console.
>
> Given what console-kit actually does, it might not be so wrong.
> But I am not sure.
>

Yea. I'm coming around to this point of view, but I worry about keeping
ttyv0
open for people that actually login to ttyv0, though I guess in practice it
won't
be a big deal. It's likely the least wrong thing we have today.


> > 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?
>
> So, just for the sake of quoting, console-kit-daemon needs a control
> device for
> video console (video terminals).
>

It's a control daemon for the video subsystem, which is unrelated to the
system
console except maybe it will be used as the system console. But
console-kit-daemon
doesn't care, if I understand, about the system console: it just wants to
control which
of the virtual terminals are current then? Is that a more precise way of
saying what it
does avoiding overloaded terms?

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.