Re: More info on kernel 2.2 & debian bootdisks woes
Steve Dunham wrote:
> Eric Delaunay <delaunay@lix.polytechnique.fr> writes:
>
> > It was using a serial console display.
>
> > Anyway, I'm now using my latest bootdisks merged with a 2.2.0 kernel
> > on SparcClassic with linux console (cg3 + monitor) still with no
> > success. It displays the first dialog box (choosing color or
> > mononochrome) but the keyboard is not responding at all (not arrow
> > keys, no enter, ...) :-( However, I can switch to other VTs (via
> > ALT+F?) and in all of them but the first, the keyboard is working
> > fine. Ok, since the second VT is working, I launched dbootstrap in
> > it. It seems to work well: I can do configuring the keyboard,
> > partitioning the hard drive, and so on. I just run in trouble when
> > I run a subshell from dbootstrap. Outputs of the programs I run
> > from the shell are going to the second VT as usual, but the shell's
> > prompt is not displaying in this VT but in the first one !!! stderr
> > outputs are sent to the first VT as well. In the first VT I can see
> > the following message displayed at ash starting time:
>
> > sh: can't access tty; job control turned off
>
> > Any hints ?
> > Thanks in advance.
>
> I looked into the source code and found that the "dbootstrap" process
> was running with stdin/stdout pointing to /dev/tty0, which is causing
> problems (could this be a kernel bug?).
>
> To see that this is the problem, do:
>
> rm /dev/tty0
> mknod /dev/tty0 c 4 1
>
> and kill the dbootstrap process.
>
>
> The code that is making dbootstrap attach to tty0 is in
> /usr/src/boot-floppies/utilities/busybox/init.c:
>
> default:
> tty = ttyname(0);
> if (tty) {
> strcpy( console, tty );
> if (!strncmp( tty, "/dev/cua", 8 ))
> serial_cons=1;
> }
> else
> /* falls back to /dev/tty1 if an error occurs */
> strcpy( console, default_console );
>
> As a hack to fix this, you can disable the "if" part of the above
> statement. (IMHO, it's always wrong to use tty0, since it refers to
> the VC that is currently being displayed - if the user switch VC's
> then the output would go to the current one. And ttyname(0) is
> returning "/dev/tty0".)
>
> Also, I wonder about the code just above it, it opens /dev/cua0 or
> /dev/cua1 if the user specifies a serial console, these devices are
> depricated. If you change those strings to ttyS0 and ttyS1, it may
> fix your serial console problems.
>
> Disabling the if part won't break serial consoles - the other parts of
> the case statement handle the serial console (although they do so
> incorrectly, since cua0 and cua1 no longer exist).
Well, part of the problem was indeed in init but one is remaining even after I
fixed it: the keyboard is still dead in the first console that is running
dbootstrap.
The real culprit is dbootstrap !
Just try to boot with "tty1=/bin/sh" as argument to the kernel: it tells init
to run /bin/sh in the first console. The console is fully functional in this
case until you spawn dbootstrap :-(
I then checked the code for changes since my previous upload of bootdisks.
In utilities/dinstall/boxes.c, there is a call to a new method named
stderrToTTY that redirects stderr to /dev/tty3. I commented out its contents
and the keyboard freeze disappeared.
I don't understand why this code is not working with 2.2 kernels:
int stderrToTTY(int tty) {
static int fd=-1;
char dev[10];
if (fd > 0)
close(fd);
snprintf(dev,10,"/dev/tty%d",tty);
if ((fd = open(dev, O_WRONLY|O_NOCTTY)) < 0)
return 1;
if (-1 == dup2(fd,2))
return 1;
return 0;
}
Any advice ?
Thanks in advance.
PS: I cc: this message to debian-boot for any/all comments.
--
Eric Delaunay | "La guerre justifie l'existence des militaires.
delaunay@lix.polytechnique.fr | En les supprimant." Henri Jeanson (1900-1970)
Reply to: