Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Mar 2025 14:52:59 -0600
From:      Warner Losh <imp@bsdimp.com>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        arch@freebsd.org
Subject:   Re: revocation of /dev/console at the end of rc sequence
Message-ID:  <CANCZdfqhuuqNc8_5jbUa24dHRQ4T_Ensgvmu-ojqVd0XHA%2Ba%2Bw@mail.gmail.com>
In-Reply-To: <ba21c008-2b40-4992-b1a5-9d41a9a06390@freebsd.org>
References:  <a59cca2f-5826-427e-9276-2cff8541992f@FreeBSD.org> <CANCZdfrtxRsn5aod6K9okGBjoUg89-Rqz4bhVyHWWRpz9utRDg@mail.gmail.com> <ba21c008-2b40-4992-b1a5-9d41a9a06390@freebsd.org>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
On Wed, Mar 26, 2025 at 12:58 PM Andriy Gapon <avg@freebsd.org> wrote:

> On 26/03/2025 6:54 pm, Warner Losh wrote:
> >
> >
> > On Wed, Mar 26, 2025 at 10:23 AM Andriy Gapon <avg@freebsd.org
> > <mailto:avg@freebsd.org>> 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

[-- Attachment #2 --]
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Wed, Mar 26, 2025 at 12:58 PM Andriy Gapon &lt;<a href="mailto:avg@freebsd.org">avg@freebsd.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 26/03/2025 6:54 pm, Warner Losh wrote:<br>
&gt; <br>
&gt; <br>
&gt; On Wed, Mar 26, 2025 at 10:23 AM Andriy Gapon &lt;<a href="mailto:avg@freebsd.org" target="_blank">avg@freebsd.org</a> <br>
&gt; &lt;mailto:<a href="mailto:avg@freebsd.org" target="_blank">avg@freebsd.org</a>&gt;&gt; wrote:<br>
&gt; <br>
&gt; <br>
&gt;     Not sure what would be the best forum to talk about this issue, so posting here.<br>
&gt; <br>
&gt;     I observe a kind of unexpected problem related to /dev/console.<br>
&gt;     Here is my understanding of what is happening.<br>
&gt; <br>
&gt;     Thanks to DTrace I was able to capture /dev/console getting &quot;revoked&quot;, its<br>
&gt;     vnode<br>
&gt;     getting recycled (at least, destroyed):<br>
&gt; <br>
&gt;         1  15949                     vgonel:entry<br>
&gt;     2025 Mar 25 21:45:33 vgone vnode fffff8000607b540, console rdev by sh (21)<br>
&gt; <br>
&gt;                     kernel`vgone+0x2f<br>
&gt;                     kernel`devfs_revoke+0x41<br>
&gt;                     kernel`VOP_REVOKE_APV+0x71<br>
&gt;                     kernel`killjobc+0x15a<br>
&gt;                     kernel`exit1+0x707<br>
&gt;                     kernel`0xffffffff808bd00d<br>
&gt;                     kernel`amd64_syscall+0x189<br>
&gt;                     kernel`0xffffffff80c4fbfb<br>
&gt; <br>
&gt;     My understanding is that this is the rc shell process exiting.<br>
&gt; <br>
&gt;     init forks a process that exec-s bin/sh (or alternative init shell) to run<br>
&gt;     /etc/rc (or alternative init script).<br>
&gt;     The process sets up itself as a session leader and /dev/console as its<br>
&gt;     controlling terminal (as well as stdin, stdout and stderr).<br>
&gt;     It does that by calling login_tty() which internally uses setsid() and<br>
&gt;     tcsetsid() to do the job.<br>
&gt;     See runcom -&gt; run_script -&gt; execute_script -&gt; open_console in sbin/init/init.c.<br>
&gt; <br>
&gt;     I guess that this makes total sense given the nature of /etc/rc.<br>
&gt; <br>
&gt;     When a session leader process exits, it revokes its controlling terminal.<br>
&gt;     That&#39;s the standard behavior.<br>
&gt;     I guess that the idea is that any descendant processes in the session get<br>
&gt;     disassociated from the terminal.<br>
&gt; <br>
&gt;     Both things make sense, but they lead to a problem as well.<br>
&gt;     The problem is that by the time /etc/rc finishes there can be a daemon (so, not<br>
&gt;     a member of the session) that opened /dev/console for its own needs.<br>
&gt;     The daemon would then lose its /dev/console access which it may not expect.<br>
&gt; <br>
&gt;     One such daemon is console-kit-daemon.<br>
&gt;     Here is how /dev/console descriptor looks afterwards (as reported by<br>
&gt;     procstat -f):<br>
&gt;         PID COMM                FD T V FLAGS    REF  OFFSET PRO NAME<br>
&gt;        3323 console-kit-daemon    10 v x r-------  10       0 -   -<br>
&gt; <br>
&gt;     More details here: <a href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=285394" rel="noreferrer" target="_blank">https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=285394</a><br>;
&gt;     &lt;<a href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=285394" rel="noreferrer" target="_blank">https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=285394</a>&gt;<br>;
&gt;     (Note that some earlier comments have incorrect information and assumptions).<br>
&gt; <br>
&gt;     Can we do something better here given the special nature of /dev/console?<br>
&gt;     May something in FreeSBD?<br>
&gt; <br>
&gt;     For console-kit-daemon I have an idea of using /dev/ttyv0 instead of<br>
&gt;     /dev/console.  The daemon needs the device for things like observing VT<br>
&gt;     switching and similar operations<br>
&gt; <br>
&gt; <br>
&gt; So what is it using /dev/console for? I think the answer to this question will help<br>
&gt; understand the right solution. What does console-kit think it can do with /dev/ <br>
&gt; console?<br>
<br>
I guess I should have expanded on &quot;things like observing VT switching and <br>
similar operations&quot;.<br>
So, console-kit issues ioctl-s like VT_WAITACTIVE, VT_ACTIVATE and similar.<br>
<br>
I also would like to mention that those ioctl-s are not documented in the manual <br>
pages.  Perhaps, screen(4) would have been a good place for that.<br></blockquote><div><br></div><div>vt(4) maybe? screen(4) doesn&#39;t look to be the right place since it&#39;s describing</div><div>something else.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I guess I could say that console-kit needs a control device for video console.<br>
It presently uses /dev/console for that role and it works but it may not be the <br>
best choice.<br></blockquote><div><br></div><div>So it would be more fair to say you need a control device for the video subsystem.</div><div>Video console is an overloaded term and only tangentially related to /dev/console</div><div>which I don&#39;t think should have ever been used for this purpose and is leading to</div><div>the confusion.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I do not think that we have an explicitly designed control device for video <br>
consoles.  From the code I get an impression that any video console terminal <br>
(ttyvX) should be suitable for that role.  E.g., vidcontrol just uses whatever <br>
device happens to be its stdin.<br>
But maybe that&#39;s not so.<br></blockquote><div><br></div><div>Yes. vidcontrol was designed more for interactive use than other use. You proved</div><div>you could access it by passing things through stdin. Not a great design, but one that</div><div>reflects what stty does. And one that was adequate enough in the early days that it</div><div>didn&#39;t change when we went from syscons -&gt; vt.</div><div><br></div><div>And you&#39;re right, there&#39;s no /dev/ttyv.ctl that can be used for this. Any of the ttyvX</div><div>gives effective ownership to all tttyvX if I&#39;m reading things right just now. </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt; /dev/console, even if we didn&#39;t do the revoke, seems like the wrong thing for it<br>
&gt; to be opening.<br>
&gt; <br>
&gt; Seems like<br>
&gt;       TIOCCONS int *on<br>
&gt;                   If on points to a non-zero integer, redirect kernel console<br>
&gt;                   output (kernel printf&#39;s) to this terminal.  If on points to a<br>
&gt;                   zero integer, redirect kernel console output back to the<br>
&gt;                   normal console.  This is usually used on workstations to<br>
&gt;                   redirect kernel messages to a particular window.<br>
&gt; is what it should be doing.<br>
&gt; Is the standard way to redirect / scrape the console.<br>
<br>
I guess that this not useful at all for console-kit.<br></blockquote><div><br></div><div>Yea. I thought it did something else entirely...</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt; Also, ttyv0 is always wrong to hard-code. It might have nothing at all<br>
&gt; to do with the console.<br>
<br>
Given what console-kit actually does, it might not be so wrong.<br>
But I am not sure.<br></blockquote><div><br></div><div>Yea. I&#39;m coming around to this point of view, but I worry about keeping ttyv0</div><div>open for people that actually login to ttyv0, though I guess in practice it won&#39;t</div><div>be a big deal. It&#39;s likely the least wrong thing we have today.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt; There&#39;s a couple of different notions of &quot;the console&quot; today, and they<br>
&gt; are a bit poorly defined. There&#39;s the &quot;console&quot; for the kernel. And it&#39;s really<br>
&gt; a collection of devices that get kernel output and are prompted for kernel<br>
&gt; input.<br>
&gt; <br>
&gt; There&#39;s the &quot;console&quot; used for /etc/rc. This is /dev/console. It&#39;s just an<br>
&gt; alias for the first tty device in the kernel console list (sometimes called the<br>
&gt; primary console). there&#39;s little special beyond that, though Kyle and I<br>
&gt; keep threatening to make it a mux of all the kernel consoles on that list.<br>
&gt; It&#39;s functionality is somewhat limited (and has been since phk separated<br>
&gt; it out from the tty that underlies it around FreeBSD 2 or 3).<br>
&gt; <br>
&gt; So what is it that console-kit-daemon is wanting to do?<br>
<br>
So, just for the sake of quoting, console-kit-daemon needs a control device for <br>
video console (video terminals).<br></blockquote><div><br></div><div>It&#39;s a control daemon for the video subsystem, which is unrelated to the system</div><div>console except maybe it will be used as the system console. But console-kit-daemon</div><div>doesn&#39;t care, if I understand, about the system console: it just wants to control which</div><div>of the virtual terminals are current then? Is that a more precise way of saying what it</div><div>does avoiding overloaded terms?</div><div><br></div><div>Warner</div></div></div>
help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfqhuuqNc8_5jbUa24dHRQ4T_Ensgvmu-ojqVd0XHA%2Ba%2Bw>