Skip to content

Command Cheat Sheet

This is a fast lookup of the commands that matter on Amiga Unix (Amix) 2.1: system administration, package management, building/installing a kernel and drivers, networking, clock handling, and getting data on and off the box. Each entry is a one-liner with a short note and a confidence tag. Where a command is nuanced enough to need its own page, this sheet links to the deep dive.

Read this first: Amix is AT&T System V Release 4 (SVR4) on the 68030 ✅, so most SVR4 admin conventions apply. But a few SVR4-isms bite hard:

  • the /bin/sh is pre-POSIX ✅ — no $(...) command substitution, no grep -q (use backticks and grep … >/dev/null); the default interactive shell is ksh ✅.
  • grep is classic SVR4: no \| alternation and no grep -w ✅. A multi-pattern grep 'a\|b' matches nothing and exits 1 — so it reads as "the symbol is absent," which is exactly the wrong conclusion when you are, say, checking whether a de-instrumented kernel still carries a diagnostic. Use one simple pattern per grep, or egrep. (Root-caused on a real A4000 + Z3660 where nm /stand/unix | grep 'a\|b' returned empty for two symbols that both exist.) The mirror case bites too: grep -v 'a\|b' passes every line, so a filter written that way leaves its input unchanged ✅ (the pattern is one literal that no line contains). Use egrep -v 'a|b'.

Commands below assume you are root unless noted.

For terminology (major/minor numbers, STREAMS, cdevsw, RDB, etc.) see the glossary. For every device node and its major/minor, see the device list. For what each version supports, see versions.


System administration

Command What it does Tag
sysadm SVR4 menu-driven admin front-end (standard SVR4 tool) ✅
amixadm Amix's admin menu — add a user, date and time zone, screen, keymap, nodename and domain, passwords for all system accounts, hosts file, colour X, xdm, Netnews ✅
init <level> Switch run level (SVR4 init + /etc/inittab) ✅
who -r Show the current run level ✅
shutdown -i6 -g0 -y Reboot now (-i6 = run level 6); use -i0 to halt, -iS for single-user ✅
telinit S Drop to single-user (maintenance) mode ✅
Alt+F1 .. Alt+F8 Switch between the 8 virtual consoles ✅

Run levels (SVR4 standard) ✅. Amix uses init, /etc/inittab, and SVR4 run levels. shutdown -i6 reboots; -i0 powers down to the bootstrap; S/s is single-user. The canonical "I changed the kernel, now reboot into it" step throughout these docs is:

shutdown -i6 -g0 -y

⚠ Run it from a console root shell. Requested over telnet while nobody is logged in on the console, a reboot stalls at INIT: New run level: 6 and never runs rc6 — stock init, reproduced on the stock kernel; only a power cycle recovers ✅. See quirks §58.

Finishing an install ✅. After the distribution is laid down and the kernel is built, the first boot runs Commodore's system.setup (from /etc/sysinit, until it clears its own execute bit): node name and domain, the date and time (the date step accepts only a year ≤ 1999 — set the real date afterwards; see Time and the clock), a password for all system accounts and for guest, a user account, the monitor, X11 and xdm, and Netnews. amixadm offers the same steps as a menu afterwards. Read from the stock /etc/sysinit, system.setup and amixadm; see accounts and remote logins.

Note on the default password 🟡. Community reports a post-install login password of wasp. Treat as community lore, not a guarantee.

See first login and tour for what to do right after the install reboots.


Packages (SVR4 pkg*)

Amix ships the standard SVR4 packaging toolchain ✅. A package is a datastream or directory of files plus a pkginfo/pkgmap; you build with pkgmk/pkgtrans and install with pkgadd. For the on-disk internals — the /var/sadm database, the contents(4) record format, and a stock-image defect that breaks pkgrm/pkginfo -l out of the box — see package management.

Installed on the running system ✅: /usr/bin has pkginfo pkgmk pkgproto pkgparam pkgtrans; /usr/sbin has pkgadd pkgrm pkgchk installf (pkgadd/pkgrm/installf are root-only, r-x------). Not installed: pkgask, removef, and amixpkg — the last lives only on the root.adf install media (see below). Man pages exist for pkgadd, pkgask, pkgchk and pkgrm (section 1m, formatted only), but not for pkginfo, pkgmk, pkgtrans, pkgproto or contents(4) ✅ (corrected 2026-10-30).

Command What it does Tag
pkginfo List installed packages ✅
pkgadd -d <device|file> [pkg] Install a package from a device or datastream file ✅
pkgrm <pkg> Remove an installed package ✅
pkgproto <paths> > Prototype Generate a prototype file from a file tree ✅
pkgmk -o -d <dir> Build a package (directory format) from a Prototype ✅
pkgtrans <src> <dest.pkg> <pkg> Convert a directory package to a single datastream file ✅
amixpkg -i -m -d <dev> -r /mnt -y standard Amix install-time package wrapper — on the root.adf install media only, not the installed system 🟡

Gotchas. - pkgproto omits symbolic links from the prototype 🟡 — add them back by hand or your package will be missing files. - amixpkg isn't on the installed system ✅ — it is the root.adf install-media wrapper that drives the distribution install (amixpkg -i -m -d … -r /mnt -y standard) ✅, not a general-purpose installed command. Its "widely reported broken" reputation 🟡 is at least partly explained by the next item. For your own packages use the raw pkgadd/pkgmk/pkgtrans tools, which are installed. - On the stock 2.1c image, pkgrm and pkginfo -l fail out of the box ✅ — a single malformed contents record (a file whose name contains a space) aborts every full parse of the package database with bad read of contents file … problem=unknown ftype. Deleting that one line fixes both. Full diagnosis and fix on the package-management page.

Pre-built packages 🟡. Michael Parson's AmixBP is 40+ re-bundled .pkg files hosted on amigaunix.com/downloads. An alternative distribution form seen in the wild is a zoo-compressed cpio archive 🟡.

HTTP package-repo layout gotcha ✅. When serving packages over HTTP for a network client, the payloads sit one directory below the catalog: a catalog filename field of stock/foo.pkg is relative to a pkgs/ segment, so the real URL is <repo>/pkgs/stock/foo.pkg, not <repo>/stock/foo.pkg. The client itself builds the correct URL; a manual probe that drops the pkgs/ segment gets a 404, so verify against the client's own catalog, not a guessed path. Full format spec — tree, catalog grammar, integrity model, client behaviour: the package repository format.


Kernel and driver builds

Stock Amix is a monolithic SVR4 kernel with no loadable modules ✅ (one third-party exception) — drivers are statically linked in, so adding or changing a driver means relinking the kernel and rebooting. The kernel source/objects live in /usr/sys ✅; the switch tables live in master.d/kernel.c ✅.

Command What it does Tag
cd /usr/sys Kernel build root (object libraries + makefiles) ✅
make Relink the kernel from the configured cdevsw[]/bdevsw[] tables ✅
make install Build/stage the new kernel image (relocunix) ✅
cp relocunix /stand Copy the new kernel to /stand before writing the boot partition ✅
make bootpart KERNEL=relocunix Write the kernel to the 2 MB boot partition ✅
mknod /dev/<name> c <major> <minor> Create a character device node ✅
mknod /dev/<name> b <major> <minor> Create a block device node ✅

The full driver install loop (Ditto paper procedure + va2000 repo refinements ✅):

# 1. drop driver .o (and source) into a subdir under /usr/sys, add it to that Makefile
# 2. edit master.d/kernel.c: add cdevsw[]/bdevsw[] slot, int2_tbl[]/init_tbl[] entries, extern decls
cd /usr/sys
make                              # produces the new kernel
make install                      # stage as relocunix
cp relocunix /stand
make bootpart KERNEL=relocunix    # write the boot partition
mknod /dev/mydev c 68 0           # create the node (char major 68, minor 0 — example)
shutdown -i6 -g0 -y               # reboot into the new kernel

Kernel-image name 🟡. The 1990 Ditto paper calls the built kernel rdbunix; modern 2.1 systems and the community repos call it relocunix — treat this as a historical rename and verify per version (brief §13.3). The modern repos relink with make force (full kernel) or make bootpart KERNEL=… (boot partition) ✅.

Before relinking, clean stale objects ✅ (from the va2000 driver notes) or the link picks up old code:

rm -f amiga/config/unix.o master.d/exp unix

Always keep the old /unix as a fallback ✅ — if the new kernel panics, you can boot the previous one.

Deep dives: the kernel build process, the driver model, writing a char driver, and writing a STREAMS driver.


Networking

Amix networking is SVR4 STREAMS TCP/IP ✅. The A2065 Ethernet interface is aen0 ✅. There is no DHCP — static IP only ✅, and DNS resolution is off by default ✅ (the system resolves names from /etc/hosts until you switch it on).

Command What it does Tag
ifconfig aen0 Show the A2065 Ethernet interface state ✅
ifconfig aen0 <ip> netmask <mask> up Bring the interface up with a static address ✅
slink addaen /dev/hya0 hya0 Link the Hydra STREAMS NIC into IP (Amix SVR4.0 has no ifconfig plumb), then ifconfig hya0 … ✅
route add default <gw> 1 Add a default route — the trailing 1 (metric/hops) is required ✅
netstat -rn Show the routing table — fails with read error on routehash when /stand/unix is not the booted kernel (quirk 93) ✅

Default route — don't drop the metric ✅:

route add default 192.168.0.1 1

The trailing 1 is the hop count/metric and is mandatory on this SVR4 route.

Enabling DNS ✅ (off by default — the system uses /etc/hosts). The steps are:

# 1. point libsocket at the DNS-capable resolver shared library
ln -f /usr/lib/libsockdns.so /usr/lib/libsocket.so
# 2. edit /etc/netconfig so name lookups use DNS
# 3. start the name server / resolver: in.named
# 4. create /etc/resolv.conf with your nameserver(s)

After this, hostname lookups go through DNS instead of /etc/hosts.

Other networking facts. - NFS server and client both work ✅. - SLIP is buggy — you must reboot between sessions 🟡. - No PPP 🟡. - The Hydra NIC is a STREAMS/DLPI driver registered at cdevsw slot 47 (hya) ✅; see the Hydra case study.

Deep dive: networking. For the interface device nodes, see the device list.


Mounting filesystems

Amix uses the SVR4 mount(1M)/umount(1M) front-ends. mount -F <fstype> <special> <dir> execs the per-fstype helper /usr/lib/fs/<fstype>/mount — without that helper binary the fstype cannot be mounted at all ✅. Two gotchas worth knowing:

Fact Detail Tag
/etc/mnttab is userland-maintained The kernel never writes it; the per-fstype mount helper appends the line (a single O_APPEND write), the way /proc//dev/fd do ✅
umount(1M) matches by the special field It locates the mount by the entry's special (first) field — so a device-less filesystem must record its mount point there (like /proc /proc proc …), or umount silently fails while still deleting the mnttab line ✅
Repeated mount stacks silently A second mount of the same media on the same dir returns 0 and stacks; the fs must reject it. Duplicate fstype lines in /etc/mnttab are the tell — see quirks #19 ✅

The kernel-side half of this contract (writing an in-kernel filesystem) is on the driver model.

Time and the clock

Command What it does Tag
setclk Read/write the hardware (battery-backed) clock ✅
date Show/set the system time (set via amixadm at install) ✅

Y2K warning ✅ (corrected 2026-09-29). The kernel has no year cap; the bug is in the tooling: - setclk, run by /etc/sysinit at every boot, writes the year %02d (126 for 2026), so date rejects it (date: bad conversion) and the system clock is never set from the battery clock ✅; - amixadm accepts only a year ≤ 1999, and the 2-digit date form reads yy as 19yy ✅.

To set a post-1999 date by hand use the 4-digit form date MMDDhhmmCCYY. The lasting fix is the community-patched setclk (the AmigaUnix wiki's y2k-dst page — not on the patch disk, whose cpio carries no setclk) plus /etc/clkzone naming the zone the battery clock holds ✅. Details: quirks §7.

See the quirks page for the clock-drift and Y2K details, and the patch disk anatomy for how the patch is applied.


Media: tape, raw devices, and identifying the system

The distribution is streamed from QIC tape at SCSI ID 4 ✅ — the tape device is hard-coded. The raw, no-rewind tape node is /dev/rmt/4hn ✅ (the n = no rewind on close; 4h = unit 4, high density). The hard disk is ID 6 by convention — the installer prompts for the disk target; the chosen ID is baked into the device names once installed 🟡.

Command What it does Tag
uname -svrm Print system name, OS version, release, and machine (m68k) ✅
uname -a Full identification line ✅
dd if=/dev/rmt/4hn bs=256k \| cpio -imdcu Read the distribution from tape and extract it ✅
dd if=/dev/rmt/4hn bs=256k \| zcat \| cpio -imdcu Same, for a compress(1)-compressed tape stream ✅
cpio -icdmuv Extract an ASCII (-c) cpio archive, making dirs, preserving mtime ✅

The install-tape pipeline ✅ (from the root.adf scripts) reads the no-rewind raw tape and pipes it through cpio:

dd if=/dev/rmt/4hn bs=256k | cpio -imdcu
# compressed variant:
dd if=/dev/rmt/4hn bs=256k | zcat | cpio -imdcu

cpio flags used here: -i extract, -m retain modification times, -d create directories as needed, -c ASCII header format, -u overwrite unconditionally.

Identifying the running system ✅. The patch disk's own header script greps uname -v for the pattern ^2\.1.* 08004..$ before it will apply ✅, so uname is the canonical way to check what you're on:

uname -svrm     # e.g. m68k release/version fields used by the patch's uname -v check

Diffs and patches ✅. Stock /usr/bin/diff has no unified format: diff -u a b answers diff: invalid option -u; it has -c (context) only ✅. The stock public package's /usr/public/bin/patch (Larry Wall's patch, patch level 12u4) does apply unified diffs and reproduced a 2000-line target byte for byte from a four-hunk unified diff ✅. To make unified diffs on the box, install an add-on GNU diffutils.

Non-standard tape drives 🟡/✅. The kernel only supports specific tapes (A3070 QIC-150 and similar). viper_kludge (Frank "Crash" Edwards), shipped on root.adf ✅, patches kernel memory so an Archive Viper 2150S works — but its README warns it is incompatible with A3070/Caliper/Wangtek/Sankyo drives ✅. Tape-free installs (write a cpio image to the swap partition from Linux/AmigaDOS, then extract with cpio) are documented on comp.unix.amiga 🟡.

For the SCSI ID rules and other hard-coded limits, see the hardware page and the quirks checklist. For the install in full, see the install walkthrough.


Man pages: how stock man finds a page ✅

Measured on the stock 2.1c install (emulated 68030), 2026-10-30.

  • One binary, four names: /usr/bin/man (13968 bytes, ELF) is hard-linked as /bin/man, /usr/bin/catman and /usr/bin/whatis. Usage: man [section] name ..., man -k keyword, man -f file. There is no -M (man: illegal option -- M).
  • Two trees. Sources live in $MANPATH, default /usr/share/man (/usr/man is a symlink to it). Formatted pages live in $CATPATH, default /usr/catman. The SVR4 base pages ship formatted only, as compressed cat pages in /usr/catman/<section>/<name>.Z (sections 1, 1b, 1c, 1f, 1m, 2, 2z, 3, 3b–3x, 4, 4b, 4z, 5, 7, 7b, 8, beside formatted copies of the Amiga sections). The Amiga-specific sections (1A, 1X, 1l, 3A, 3X, 5A, 5l, 6, 7A, 8l) ship as compressed nroff source in /usr/share/man/<section>/<name>.Z. Directories are named by section alone, with no man prefix.
  • Formatting happens on first view: zcat | tbl | eqn | /usr/ucb/nroff -man -T37 | col into the cat tree (Reformatting page 1A/a2024...). nroff, tbl, eqn and neqn are in /usr/ucb (no /usr/bin/eqn); compress, uncompress and zcat are one binary in /usr/bin. catman with no arguments reformats every source page into /usr/catman. PAGER defaults to /usr/bin/more.
  • MANPATH is one directory, not a colon list: MANPATH=/a:/usr/man makes man open /a:/usr/man/whatis (egrep: can't open).
  • Lookup goes through <MANPATH>/whatis, with egrep -i "(^name[^a-zA-Z0-9]| name[^a-zA-Z0-9]).*-". A page on disk with no whatis line is No manual entry. A whatis line reads name(sect)<spaces>names - description, e.g. grep(1) grep - search a file for a pattern. The stock index is /usr/share/man/whatis (136040 bytes), with base_whatis beside it.
  • Page files: under <tree>/<section>/, a page can be <name>.Z, a plain <name> or <name>.1, and a .so /absolute/path alias works. A BSD-style man1/<name>.1 tree is not found.
  • Packaging hazard: with MANPATH set and CATPATH not, man writes the formatted page into the stock /usr/catman/<section>/<name>. A page that shares a stock page's name (say, a GNU grep(1)) then shadows the stock page for every later plain man grep. Setting CATPATH to a private tree avoids that, but then the stock pages are unreachable (No manual entry for ls) until both variables are unset. A package that ships man pages should therefore add its own whatis lines and keep its pages out of the stock names, or accept the shadowing.

See also

Sources

  • The stock man(1) mechanics (first-party record, 2026-10-30) ✅ — the amix-packages project's four probe runs on the emulated stock 2.1c 68030: ls -l of the binaries and trees, strings of /usr/bin/man (the default paths, the egrep lookup, the format pipeline), whatis excerpts, planted pages in each layout, the MANPATH colon test, -M, and the CATPATH shadowing run.
  • The 2026-09-29 Y2K correction ✅ — date 092912002026 accepted on a stock 2.1c box; the stock setclk boot run ending in date: bad conversion; the patch disk's 103-member cpio carrying no setclk (quirks §7).
  • The stock-init shutdown stall over telnet — first-party, eight discriminating runs, 2026-09-29 (amix-gayle-ide/README.md) ✅.
  • sources/research-brief.md §3 (boot/kernel build, make bootpart KERNEL=relocunix), §4 (run levels, virtual consoles, pkg*/amixpkg, monolithic kernel), §5 (device-driver model, mknod, major/minor, /usr/sys, kernel.c), §7 (toolchain & packaging, pkgproto symlink gotcha, AmixBP), §9 (install flow, tape dd … | cpio pipeline, amixadm finish, viper_kludge), §11 (networking: aen0, route add default … 1, DNS-enable steps, NFS/SLIP/PPP; userland shells and pre-POSIX /bin/sh), §12 (quirks: SCSI IDs, Y2K/setclk, DNS off by default), §13 (rdbunix/relocunix rename caveat), §20 (stock pkg-system internals — the installed toolset and its three absences pkgask/removef/amixpkg, and the contents-DB space-in-pathname defect).
  • amix_21_root.adf analysis via tools/inspect-adf.sh — /dev/rmt/4hn, amixpkg -i -m -d -r /mnt -y standard, viper.README, BPART=/dev/dsk/c${SCSI}d0s${BOOTPART} (SCSI ID hard-coding).
  • amix_21_patch.adf analysis via tools/inspect-adf.sh — uname -v match ^2\.1.* 08004..$, patch-apply mechanism (no setclk among its 103 cpio members, checked 2026-09-29).
  • Ditto, Writing Amix Device Drivers, 1990 European Amiga Developer's Conference — driver install procedure (/usr/sys → make → mknod → reboot), cdevsw/bdevsw, rdbunix.
  • asokero/va2000-amix repo — rm -f amiga/config/unix.o master.d/exp unix, cp relocunix /stand, make bootpart KERNEL=relocunix, mknod /dev/va2000 c 68 0, pre-POSIX /bin/sh note.
  • isoriano1968/hydra-amix repo — slink addaen /dev/hya0 hya0, native make / make force, mknod /dev/hya0 c 47 0, STREAMS cdevsw slot 47.
  • SVR4 grep has no \| alternation and no grep -w (a multi-pattern grep silently matches nothing and exits 1), root-caused on a real A4000 + Z3660 (first-party record, 2026-07-12) ✅.
  • grep -v 'a\|b' passing every line (first-party record, 2026-10-31) ✅ — the amix userland/base DHCP-client soak on the emulated 2.1c bench image (stock userland): grep -v with a three-way \| pattern over a 239-line log printed all 239 lines, the lines it was meant to drop among them.
  • The amix-cdfs project @ 31e8c3b (6f727b1+d3beca7, platform/amix/mount.c) — the /usr/lib/fs/<fstype>/mount helper requirement, /etc/mnttab being userland-maintained (O_APPEND), and umount(1M) matching by the special field (so a device-less fs records its mount point there), measured on a real A4000 + Z3660 + stock-kernel precedent (/proc, /dev/fd), 2026-07-13 ✅. See the driver model.
  • amigaunix.com — networking, patch-disk, y2k-dst, tape-creation, downloads pages (community-reported items above).
  • The amix-packagemanager repo tooling (tools/repo/publish.sh, gen-catalog.py) — the HTTP package-repo pkgs/-segment URL layout, verified live 2026-07-22 ✅.
  • The diff/patch rows: measured on an emulated stock 2.1c 68030 during the amix-packages diffutils 2.8.1 port, 2026-10-29 (first-party record) ✅.