[systemd-devel] [PATCH] s390/getty-generator: initialize essential system terminals/consoles

Hannes Reinecke hare at suse.de
Mon Feb 3 05:44:43 PST 2014


On 01/31/2014 05:08 PM, Hendrik Brueckner wrote:
> Ensure to start getty programs on all essential system consoles on Linux on
> System z.  Add these essential devices to the list of virtualization_consoles
> to always generate getty configurations.
> 
> For the sake of completion, the list of essential consoles is:
> 
>   /dev/sclp_line0 - Operating system messages applet (LPAR)
>   /dev/ttysclp0 - Integrated ASCII console applet (z/VM and LPAR)
>   /dev/ttyS0 - Already handled by systemd (3215 console on z/VM)
>   /dev/hvc0  - Already handled by systemd (IUCV HVC terminal on z/VM)
> 
> Depending on the environment, z/VM or LPAR, only a subset of these terminals
> are available.
> 
> See also RH BZ 860158[1] "Cannot login via Operating System Console into RHEL7
> instance installed on a LPAR".  This bugzilla actually blocks the installation
> of Linux on System z instances in LPAR mode.
> 
Hehe.

Nice try, but sadly incomplete.

When switching to a real 3270 console (try 'conmode=3270' on the
kernel command line) systemd isn't able to open a console, either.

Which opens up a can of worms:

- The S/390 3270 tty device is using a device node
  /dev/3270/ttyX _and_ an offset '1' to the minor node.
  So the first tty here is in fact /dev/3270/tty1
- systemd is using the 'active' sysfs attribute in
  /sys/class/tty/console to figure out the active
  console; for the 3270 console this contains the string
  'tty32700'.
  Which of course doesn't exist and confuses systemd
  getty-generator.

The reason for the slightly weird string in 'active' is the way it's
generated (check drivers/tty/tty_io.c:show_cons_active()):
	count += sprintf(buf + count, "%s%d%c",
			 cs[i]->name, cs[i]->index, i ? ' ':'\n');

where 'cs' is the _console_ structure, not the tty structure.
So we're getting the _console_ name plus the _console_ index here.
And the console name for the 3270 console is 'tty3270', with the
index '0'.

Which raises the question: what exactly should be 'active' contain?
The console name (which doesn't have any equivalent in sysfs), or
the tty name (which has)?

And, more importantly, how is one supposed to _find_ the
corresponding sysfs entry for the current 'active' attribute?

>From what I've seen most driver work by virtue of the happy accident
that the console index equals the tty index.
But that's not a requirement anywhere in the console code.
Quite the contrary; tty drivers have the 'first_minor' entry
to explicit request an offset other than '0'.

(And the console driver has an explict '->device' callback
which allows the tty driver to return the correct index.
Not that it's used here; would've been too easy).

So how to fix this?
Update the driver to adhere to the (broken) current behaviour?
Or modify 'active' to return the corrent tty name?
Or add a workaround to systemd?

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare at suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)


More information about the systemd-devel mailing list