jerrylparker.com
System Administration • Vintage Computing • Tutorial

Back to the Future: Building a Multi-User Terminal Server with Ubuntu 22.04

In the early 1980s, “your computer” was often just a keyboard and monitor wired into a much bigger machine across the room. I wanted that experience back, using my HP 700-series terminals, a TVI 910, and a modern Ubuntu server. How hard could it be to light up multiple login prompts at once? As it turns out, harder than it looks, and a lot more fun.

Why recreate 1980s computing?

In my little museum, I have a handful of terminals that used to stare into the heart of something larger, a VAX, a System/36, something humming in a back room. They are not “computers” in the modern sense. No disk. No CPU. Just a screen, keyboard, and a long umbilical back to the real machine.

That design came with a different philosophy. Computing was scarce, so it was shared. You could look down a row of terminals and literally see who else was “on the system” with you. If the machine was struggling, everyone felt it. I wanted visitors to my museum to feel that, not in a glass case, but in a room full of blinking cursors.

Vintage computer room with multiple terminals
A typical early 1980s setup: one big computer, many glass terminals.

The vision and the hardware

The goal was simple to describe and annoyingly specific to implement: one Ubuntu box, three or four terminals, each with its own login, all sharing the same CPU and storage.

The cast of characters:
  • HP 700/96 – nice VT220 emulation, good keyboard
  • HP 700/98 – similar, with its own quirks
  • TVI 910 – classic Televideo personality terminal
  • Mac mini running Ubuntu 22.04 – the “minicomputer” of the story

For connectivity, I started with a DriverGenius four-port USB–serial hub using Prolific PL2303 chipsets, plus a pile of null-modem cables, comnnected via USB into the MAC mini, running agetty. On paper, that should have been the beginning and end of the story.

DriverGenius Prolific adapter
The original Prolific-based hub that used to work… on an older Ubuntu.
Gearmo FTDI adapter
The replacement Gearmo hub using FTDI’s FT4232H chipset.
Adapter comparison closeup
Side by side: similar plastic, very different driver stories.
USB connections to Mac Mini
All roads lead to the Mac mini running Ubuntu 22.04.
UMac Mini in encosure
Mac Mini mounted with keyboard and screen in a custom 3d printed enclosure.

When the “easy” adapter broke everything

Ubuntu 22.04 saw the Prolific hub immediately. dmesg cheerfully announced ttyUSB0 through ttyUSB3, so I turned on serial getty for one port and waited for the magic:

ls -l /dev/ttyUSB*
sudo systemctl enable serial-getty@ttyUSB0.service
sudo systemctl start serial-getty@ttyUSB0.service

The HP 700/96 stared back with a blank screen. No banner, no cursor, nothing. So I dropped to basics:

sudo stty -F /dev/ttyUSB0 9600 cs8 -parenb -cstopb -crtscts -ixon -ixoff
echo "Hello terminal" | sudo tee /dev/ttyUSB0

Still nothing. But when I reversed the direction:

sudo cat /dev/ttyUSB0
# now type on the HP keyboard…

Every keystroke from the HP appeared in my SSH session. The adapter could hear the terminal, but the terminal was deaf to the host. Classic one-way serial link.

Quick rule of thumb: If the host can see the terminal but not the other way around, start thinking about handshaking and drivers before you start blaming the cable.

Hours of stty experiments, loopback tests, and even a Windows machine later, the pattern became clear: the Prolific adapter worked fine on Windows and on older Ubuntu, but not here. The culprit turned out to be a kernel-level regression in the pl2303 driver for the specific chip revision used in my hub. This was nothing I was going to fix from my little terminal room.

FTDI to the rescue

At some point you stop arguing with a driver and change the hardware. I ordered a Gearmo four-port hub with genuine FTDI FT4232H silicon, plugged it in, and watched dmesg light up with the comforting words ftdi_sio and ttyUSB0 through ttyUSB3.

sudo stty -F /dev/ttyUSB0 9600 cs8 -parenb -cstopb -crtscts -ixon -ixoff
echo "FTDI ADAPTER TEST" | sudo tee /dev/ttyUSB0
HP 700/96 displaying test message
That first line of text from the host is always worth a photo.

This time the HP 700/96 happily printed the test string. Two-way communication, no drama, no workarounds. I sent the Prolific hub to the “Interesting Failures” shelf, and the rest of the build could finally begin.

Wiring Ubuntu for multiple terminals

With the FTDI hub in place, enabling logins on the serial ports was almost disappointingly easy. Ubuntu ships with a template service called serial-getty@.service that takes care of the heavy lifting.

Turning on a login prompt

# Enable and start getty on ttyUSB0
sudo systemctl enable serial-getty@ttyUSB0.service
sudo systemctl start serial-getty@ttyUSB0.service

# Check that it's alive
sudo systemctl status serial-getty@ttyUSB0.service

Within seconds, the HP 700/96 came to life:

Ubuntu 22.04 LTS TerminalServer ttyUSB0

TerminalServer login: _

To make life easier for the terminal and modern software, I dropped in a small override so the port always runs 9600 baud and assumes VT220 emulation:

sudo systemctl edit serial-getty@ttyUSB0.service

Then in the editor I added:

[Service]
ExecStart=
ExecStart=-/sbin/agetty -L 9600 %I vt220

After a quick daemon-reload and restart (a reboot would work too), logging in and running echo $TERM showed exactly what I wanted:

jerry@TerminalServer:~$ echo $TERM
vt220
HP terminal running htop
htop on a 1980s HP terminal, driven by a modern Ubuntu box.

From there it was just rinse and repeat for ttyUSB1 and the second HP terminal. Same override, same 9600 baud, same VT220 setting. Two seats in the “computer room” were now open for business.

The TVI 910 cable puzzle

The TVI 910 refused to join the party. Where the HP terminals were happy with a three-wire null modem, the TVI stubbornly produced a single garbled character, or nothing at all, no matter what I sent over ttyUSB2. Typing on its keyboard didn’t reach the host either.

This wasn’t a driver problem. This was old-school RS-232 stubbornness. The TVI wanted proper handshaking signals before it would talk or listen. So the simple “TX/RX/GND” cable had to grow up into a full null-modem arrangement.

TVI 910 wiring that finally worked

Using Cat5 between a DB9 at the adapter and a DB25 at the TVI, I ended up with:

DB9 PinFunctionDB25 Pin(s)Function
2TX2RX
3RX3TX
5GND7GND
4DTR6 + 8DSR + DCD (tied together)
6DSR20DTR
7RTS5CTS

The key trick was tying DCD to a signal the adapter actually asserts, otherwise the TVI just sits there waiting for a “carrier” that never comes.

TVI 910 cable wiring diagram
Sometimes the real project is the cable you had to invent along the way.

Once that cable was built, echo "TVI TEST" | sudo tee /dev/ttyUSB2 finally produced a clean line of text, and typing on the TVI keyboard showed up in a sudo cat /dev/ttyUSB2 window. With a matching serial-getty instance, the TVI joined the network as the third seat.

Multiple seats, one computer

At this point the system looked like this:

The money shot: multiple login prompts waiting for users.
Htop on all
Each terminal running htop to test terminal rendering…
Multiple users visible in 'who' command
who and w make the shared nature of the system very real.

The best part is when you log in on each terminal as a different user and then run who:

$ who
jerry  ttyUSB0  2025-11-25 15:42
sarah  ttyUSB1  2025-11-25 15:43
mike   ttyUSB2  2025-11-25 15:44

Instantly, it feels like a real computer room again. Three keyboards clicking, one machine doing the work.

Quick command cheat sheet

Core commands used in this build
# See which USB serial ports exist
ls -l /dev/ttyUSB*

# Watch USB devices as you plug and unplug
dmesg -w

# Set up a serial port for 9600 8N1
sudo stty -F /dev/ttyUSB0 9600 cs8 -parenb -cstopb -crtscts -ixon -ixoff

# Send a test line to the terminal
echo "Hello terminal" | sudo tee /dev/ttyUSB0

# Listen to what the terminal sends back (Ctrl+C to stop)
sudo cat /dev/ttyUSB0

# Enable and start a serial login on a port
sudo systemctl enable serial-getty@ttyUSB0.service
sudo systemctl start serial-getty@ttyUSB0.service

# Override serial-getty for 9600 baud VT220
sudo systemctl edit serial-getty@ttyUSB0.service
# then:
# [Service]
# ExecStart=
# ExecStart=-/sbin/agetty -L 9600 %I vt220

# See who is logged in
who
w
    

Thoughts on shared computing

Sitting in front of these terminals feels very different from sitting at a modern PC. You are reminded that you are sharing something. If another user runs a big compile, you feel it. If you run who and see three names, you know you are not alone on this machine.

It also struck me as to how familiar this old system feels when you compare it to modern cloud computing. Strip away the plastic and the RS-232 headaches, and the idea is the same: many users sharing a single, centralized machine that doles out time, memory, and processing power as fairly as it can. A terminal in 1983 and an SSH window into an EC2 instance in 2025 aren’t as far apart as they look. One just hums under your desk, the other hums in a datacenter you’ll never see. The vocabulary changes, the scale changes, the billing certainly changes — but the core idea, “one big computer serving many people at once,” is old enough to have green phosphor. Recreating it with vintage hardware made the connection feel both obvious and direct.

Good multi-user systems still teach the same lessons: resource limits matter, isolation matters, and a little visibility into who is doing what goes a long way.
Mac Mini Enclosure
Like the "Mini" Mac Mini?

If you like the 3d Printed enclosure I made for the mac mini, you can make one too! Google "Callisto J-29" or head over to thingiverse and search there. It takes a while to print, but it fits right in my little collection of history!

Reflections

This was supposed to be the “easy” weekend project. Plug in a hub, flip on a few services, bask in four blinking cursors. Here’s what it actually taught me: