How to get fewer ttys with Systemd?
There is no real need to disable "extra" TTYs as under systemd
gettys are generated on demand: see man systemd-getty-generator
for details. Note that, by default, this automatic spawning is done for the VTs up to VT6 only (to mimic traditonal Linux systems).
As Lennart says in a blog post1:
In order to make things more efficient login prompts are now started on demand only. As you switch to the VTs the getty service is instantiated to [email protected], [email protected] and so on. Since we don't have to unconditionally start the getty processes anymore this allows us to save a bit of resources, and makes start-up a bit faster.
If you do wish to configure a specific number of gettys, you can, just modify logind.conf
with the appropriate entry, in this example 3:
NAutoVTs=3
1. In fact the entire series of posts—currently numbering 18— systemd for Administrators, is well worth reading.
On Debian-based systems, there is a file that causes 5 extra getty's to be launched on startup if you've just built a server (without dbus service):
/lib/systemd/system/getty.target.wants/getty-static.service
In it, it says:
[Service]
Type=oneshot
ExecStart=/bin/systemctl --no-block start [email protected] [email protected] [email protected] [email protected] [email protected]
RemainAfterExit=true
Just deleting this file will stop the extra getty's from spawning. Feel free to shorten the list if you want to just spawn one extra getty (for 2 virt consoles). Note that you automatically get one on tty1 so you always have at least one virtual console.
See also: systemd-logind.service fails to start if dbus is missing
To disable gettys on particular TTYs 4-6 while possibly leaving 1-3 and 7-9 working, run:
for i in {4..6}; do
systemctl mask getty@tty${i}.service
done
mask
creates symlink /etc/systemd/system/{name} -> /dev/null
which effectively disables service. Attempt to run it via systemctl start
will display error Failed to start NAME.service: Unit NAME.service is masked.
If you have A.service Wants=masked.service
, then start A
will succeed but also generate dependency start error in journal.
If you have B.service Requires=masked.service
, then start B
will also fail.
Yup, necroanswer. Cheers.