kay2 devices
NUC migration · boot keys · mini-PC field manual
0 / 6 phases
0%
Prep & backups0 · media ready
https://releases.ubuntu.com/24.04/ubuntu-24.04.2-live-server-amd64.iso
sudo dd if=ubuntu-24.04.2-live-server-amd64.iso of=/dev/sdX bs=4M status=progress conv=fsync
Install to NVMe1 · clean, disk full
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv && sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
Base system2 · updates · tailscale · no sleep
sudo apt update && sudo apt -y full-upgrade && sudo apt -y install git curl htop build-essential
curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up --ssh
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
Runtime3 · node · pm2 · cloudflared
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - && sudo apt -y install nodejs sudo npm i -g pm2 pm2 startup systemd # then run the line it prints
curl -fsSL https://pkg.cloudflare.com/cloudflared-main.gpg | sudo tee /usr/share/keyrings/cloudflared.gpg >/dev/null echo "deb [signed-by=/usr/share/keyrings/cloudflared.gpg] https://pkg.cloudflare.com/cloudflared any main" | sudo tee /etc/apt/sources.list.d/cloudflared.list sudo apt update && sudo apt -y install cloudflared
Local model4 · ollama tier online
curl -fsSL https://ollama.com/install.sh | sh && ollama pull qwen3:4b
curl -s http://127.0.0.1:11434/api/generate -d '{"model":"qwen3:4b","prompt":"reply ok","stream":false}'
8GB RAM ceiling is qwen3:4b Q4 + the fleet. A £50 32GB SODIMM unlocks 7–8B models — do it when trading allows.
Fleet cutover5 · clive · hermes · rotate keys
sudo mkdir -p /mnt/pidata && sudo mount -o ro /dev/sdX1 /mnt/pidata
progress saved on this device ·

Your three machines. Tap the key repeatedly the instant power hits — don't hold it.

ASUS NUC
14 Pro and the rest of the mini-PC fleet
WantKey
BIOS setupF2boot order, secure boot, memory info
Boot menuF10pick the USB once, without touching boot order — the installer key
Network / PXEF12rarely needed
Fast Boot + a USB keyboard = missed window. Already inside Ubuntu? Drop straight to firmware with systemctl reboot --firmware-setup.
Lenovo laptop
the Novo button is the reliable way in
WantKey
Novo menuNovothe pinhole/arrow button by the power key or on the side. Power off, press it (not power) → menu with BIOS Setup, Boot Menu, Recovery. Works when F-key timing fails.
BIOS setupF2 / Fn+F2ThinkPad: tap Enter at the logo, then F1
Boot menuF12 / Fn+F12
If F-keys do nothing, it's the FnLock — hold Fn while tapping, or just use the Novo button and forget the timing game entirely.
Raspberry Pi 5
no BIOS — it's all software and EEPROM

The Pi 5 has no firmware setup screen. There's nothing to press at power-on. Boot config lives in the EEPROM and on the SD card, so you change it from inside a running OS.

Power buttonshort press = on / graceful shutdown · hold = force offfirst Pi with a real power button — use it instead of yanking USB-C
Boot orderedit in the EEPROMUSB-before-SD, network boot, etc.
Bricked bootloaderflash recovery to a spare SD with Raspberry Pi Imager → Misc → Bootloader, boot it once
sudo raspi-config # Advanced → Boot Order, the friendly way sudo rpi-eeprom-config --edit # or edit BOOT_ORDER directly vcgencmd bootloader_version # check what firmware you're on
GRUB & the console
getting into a Linux box that won't behave — NUC or Pi
WantHow
Show GRUBhold Shift (BIOS) or tap Esc (UEFI)
Edit an entrye → change the linux line → Ctrl+x to boot it
Rescue shellappend systemd.unit=rescue.target to that line — root shell, no services
Switch TTYCtrl+Alt+F3a frozen desktop isn't a frozen kernel — this usually still logs in
Safe forced rebootAlt+SysRq then R E I S U Bone letter a second — syncs discs first, always beats holding power

The commands that turn "it's broken" into a diagnosis. Everything here runs the same on the NUC, a Pi 5, or the Lenovo under Linux.

systemd
is it running, and why did it stop
systemctl status ollama # state, PID, last log lines sudo systemctl restart ollama # bounce it journalctl -u ollama -f # live tail its logs systemctl list-units --failed # everything red on the box

Diagnosing a crash after the fact: journalctl -b -1 -p err shows errors from the previous boot only.

storage
the thing that actually killed the last install

Know the disks before you touch them

Run lsblk before every mount, dd, or install. No exceptions.
lsblk -f # disks, partitions, filesystems, labels df -h # free space per mount — watch / and /var sudo ncdu -x / # interactive "what's eating root" (apt install ncdu)

When / fills up

sudo journalctl --vacuum-size=200M # logs are usually the culprit sudo apt clean pm2 flush # PM2 logs grow forever untended docker system prune # if docker's on here, likely this
Permanent PM2 log fix: pm2 install pm2-logrotate once, never think about it again.

Mount a foreign disk safely

Read-only first — you can't corrupt what you can't write to. This is the 1TB Pi-data drill.
lsblk -f # find it by size + label sudo mkdir -p /mnt/x && sudo mount -o ro /dev/sdX1 /mnt/x sudo mount -o remount,rw /mnt/x # only once you're sure

Drive health

sudo smartctl -a /dev/nvme0 | grep -Ei "percentage_used|temperature|critical"

NVMe percentage_used is wear — under 10% in a year is fine. SSDs die by wear, HDDs by reallocated sectors.

network
who's listening, who's reachable

Ports & processes

"Address already in use" and "connection refused" both start here.
ss -tulpn # every listening port + the process behind it ss -tulpn | grep 11434 # who owns ollama's port ip a # interfaces and addresses

Tailscale

tailscale status # every node + reachability tailscale ping kay2nuc # direct path vs DERP relay

Stuck on "via DERP"? UDP's blocked somewhere — works, just slower. Direct is the goal.

processes
pm2, driven properly
pm2 ls # fleet at a glance — watch the ↺ column pm2 logs clive --lines 50 pm2 restart clive && pm2 save # save = survives reboot pm2 monit # live CPU/RAM per process
A climbing ↺ counter is a crash loop, not uptime. Read pm2 logs <name> --err for the cause — never just restart harder.

htop by keyboard

M sort by memory · P by CPU · F4 filter · F9 kill · t tree view

Load average = 1/5/15-min run-queue length. Sustained above nproc means CPU-bound; high load but low CPU means stuck I/O.

recovery
when it won't boot

The chroot rescue recipe

Boot the install USB → shell → become root inside the broken system. Fix bootloaders, clear a full disc, reset a password.
sudo mount /dev/nvme0n1p2 /mnt # root partition (lsblk to confirm) sudo mount /dev/nvme0n1p1 /mnt/boot/efi # EFI partition for d in dev proc sys run; do sudo mount --bind /$d /mnt/$d; done sudo chroot /mnt # now "inside" the broken OS

From there: apt --fix-broken install, update-grub, or delete whatever filled the disk. Exit and reboot.

vitals
one-liners worth memorising
uptime # load at a glance free -h # RAM — "available" is the number that matters sensors # temps (apt install lm-sensors; run sensors-detect once) last -x | head # recent logins, reboots, shutdowns
123 switch Esc collapse all