Customizing the Linux TTY
August 12, 2022
I recently discovered how stupidly easy it is to customize your TTY login prompt. Obviously this knowledge will only apply to startx
chads, but it’s not too difficult to migrate away from a login manager if you really want to do this. It surprises me that I don’t see more .jpgs of riced prompts, since the folks using startx
tend to be a little more technically literate, I think. But anyways, let’s get started.
Setting a Custom Font
If you haven’t already, you might enjoy the look of using a custom font. While you’re still in the TTY, you can run setfont $FONTNAME
to change the font of the terminal. Most likely, your console-specific fonts will be stored in /usr/share/kbd/consolefonts/
. Using the setfont
command only invokes temporary changes; permanent font changes are done in the /etc/vconsole.conf
file. If you don’t have this file on your system already, you can create it and add the following: FONT=sun12x22.psfu.gz
.
I chose Sun Gallant Demi, because it is objectively the best console font. Luxi Mono is pretty close stylistically, if you want something you can use outside of the TTY. To set the default font, replace sun12x22.psfu.gz
with the name of the font you want to use. Specifying the directory is unnecessary, unless the font you want to use is stored outside of the kbd
folder.
You can also set a keymap in vconsole.conf
by adding KEYMAP=$KEYMAP
, and it is set to us
by default.
To finalize your changes and have the font load on startup, be sure to add consolefont
to your mkinitcpio hooks and rebuild.
Customizing the Login Prompt
By default, agetty will process the contents of /etc/issue
when you land at the TTY. If you don’t have this file already you can create it by doing a touch /etc/issue
. As a personal preference, I like to clear the contents of the screen at landing (i.e., the wall of text your OS generates during startup). You can invoke this by inserting a “clear” escape sequence in the first line of your issue file by running clear > /etc/issue
. This will destroy any existing /etc/issue
file and insert the characters ^[[H^[[2J
at the first line of the new file. When you edit the file from now on, be sure not to change the first line. A screenshot of my machine’s issue file is below. Notice how I have a few empty lines at the top and bottom of the file for formatting and pleasant looks.
If you tried putting some ASCII art in your issue file as I did, you will soon discover that a lot of ASCII art is probably be too big to fit on your screen (in the TTY, anyways). The number of lines you’ll have to work with will depend on your font size and screen resolution. Just play around with it and see what works. There are a couple sites out there that have large ASCII collections, or you could use a text-to-ASCII art generator to display a simple message in an aesthetically-pleasing fashion.
Escape Codes
Issue files can contain a number of escape codes, which display variable information about your system. All escape codes are comprised of a backslash followed by one of several characters. From man agetty
:
\4
| Insert the IPv4 address of the specified network interface (\4{eth0}
).\6
| The same as\4
, but for IPv6.\b
| Insert the baudrate of the current line.\d
| Insert the current date.\e
| Translate the human-readable name to an escape sequence and insert it (for example:\e{red}Alert text.\e{reset}
). If the name argument is not specified, then insert \033. The currently supported names are: black, blink, blue, bold, brown, cyan, darkgray, gray, green, halfbright, lightblue, lightcyan, lightgray, lightgreen, lightmagenta, lightred, magenta, red, reset, reverse, yellow and white. All unknown names are silently ignored.\s
| Insert the system name (the name of the OS).\S
| Insert the VARIABLE data from /etc/os-release. If this file does not exist then fall back to /usr/lib/os-release.\l
| Insert the name of the current TTY line.\m
| Insert the architecture identifier of the machine.\n
| Insert the nodename (hostname) of the machine.\o
| Insert the NIS domainname of the machine.\O
| Insert the DNS domainname of the machine.\r
| Insert the release number of the OS.\t
| Insert the current time.\u
| Insert the number of users currently logged in.\U
| Insert the string “1 user” or “X users” where X is the number of users currently logged in.\v
| Insert the version of the OS, that is, build date and such.
For example, my /etc/issue
file reads as:
ARTIX LINUX ROLLING \r [\m] | \n @ \4{wlp3s0}
And when I boot the machine, it displays as:
ARTIX LINUX ROLLING 5.15.52-1-lts [x86_64] | illumina @ 192.168.x.xx
The Message of the Day
As the /etc/issue
file is displayed before you login, agetty can also display a “Message of the Day”, or MOTD, after you login. I personally don’t make use of a MOTD, because I have X launch immediately upon logging in, but this could be useful on a server that regularly gets SSH’d into by multiple people. MOTD configuration is done in the /etc/motd
file. Any text entered in this file is displayed automatically after login. It will also recognize and process the same escape codes that can be called in the /etc/issue
file.
You can also use the /etc/update-motd.d
directory to call scripts on login, appending their output to the MOTD. The scheme for naming scripts is NN-scriptname
, where NN is any number from 0 to 99. Scripts will run in order, beginning at the lowest number and working up to the highest number.
📬Reply via E-Mail or Share with a friend.
•