NUC migration · boot keys · mini-PC field manual
0 / 6 targets
0%
Prepbackups verified · install 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
Installclean install to the NVMe only
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
Baseupdates · 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
Runtimenode 22 · 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
Modelollama · local 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: qwen3:4b Q4 + the fleet is the ceiling. £50 of 32GB SODIMM unlocks 7–8B models when trading allows.
Fleetclive · hermes · cutover
sudo mkdir -p /mnt/pidata && sudo mount -o ro /dev/sdX1 /mnt/pidata

Three devices, three completely different ways in. Tap keys repeatedly from the instant power hits — holding them usually misses the window.

ASUS NUC

mini PC · UEFI
F2
BIOS setupBoot order, secure boot, memory info
F10
One-shot boot menuPick the USB stick for a single boot — this is the one for the installer
F12
Network / PXE bootRarely needed
Fast Boot + a USB keyboard often eats the key window. If you can't catch it, boot into Ubuntu and drop straight into firmware:
systemctl reboot --firmware-setup

Lenovo laptop

ThinkPad / IdeaPad
The Lenovo trap: FnLock. Top-row keys fire media actions unless Fn is held. If F12 does nothing, hold Fn with it, or toggle FnLock with Fn+Esc first.
F1
BIOS — ThinkPadTap from power-on. Some models pause the splash if you press Enter first
F12
Boot menu — most modelsOne-time device pick
Novo
IdeaPad / Yoga / LegionTiny pinhole or side button next to power. Press it (device off) → Novo Menu → BIOS Setup or Boot Menu. The reliable path on consumer Lenovos.
Already in the OS? From Windows: Settings → Recovery → Advanced startup → UEFI Firmware Settings. From Linux: systemctl reboot --firmware-setup.

Raspberry Pi 5

no BIOS — it's all software

There's no firmware screen to catch. Boot behaviour lives in the bootloader EEPROM and you change it from inside the OS.

config
Boot order & settingsraspi-config → Advanced → Boot Order, or edit the EEPROM directly
sudo raspi-config # or: sudo rpi-eeprom-config --edit
firmware
Update the bootloaderThen reboot
sudo rpi-eeprom-update -a
Power
The new Pi 5 buttonOff → press once to boot · running → press once for a clean shutdown · hold ~10s to force off
Won't boot? The green activity LED flashes an error pattern — count the long/short blinks and match against the Pi bootloader diagnostics. Steady nothing = no power delivery or dead SD/NVMe.
GRUB & console
Getting into a Linux box (NUC / Lenovo) that won't behave
hold Shift
Show GRUB menuTap Esc instead on UEFI. Ubuntu Server usually shows it anyway
e
Edit a boot entryThen Ctrl+x to boot it
rescue
Root shell, no servicesAt GRUB press e, append systemd.unit=rescue.target to the linux line
CtrlAltF3
Switch to a text consoleA frozen desktop isn't a frozen kernel. F1–F6 are separate TTYs
R E I S U B
Safe forced rebootHold Alt+SysRq, one letter per second. Syncs discs first — always beats holding power

The commands that turn "it's broken" into a diagnosis. Everything here works the same on the Pi, the NUC, and the Lenovo — they're all Debian-family.

systemd
The machine's service manager — is it running, and why did it stop?

These four answer most questions. Swap ollama for any service.

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 only errors from the previous boot.

Storage
The thing that actually killed the last install

Know the disks before you touch them

lsblk before every mount, dd, or install. Always.
lsblk -f # disks, partitions, filesystems, labels df -h # free space per mount — watch / and /var sudo du -xhd1 / | sort -h | tail # what's eating root

Nicer interactive version: sudo apt install ncdu && sudo ncdu -x /

When / fills up — the usual suspects

sudo journalctl --vacuum-size=200M # logs are usually it sudo apt clean pm2 flush # PM2 logs grow forever otherwise
Permanent fix for PM2 logs: pm2 install pm2-logrotate. One line, done.

Mounting a foreign disk safely

Read-only first — you can't corrupt what you can't write. 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 apt install -y smartmontools sudo smartctl -a /dev/nvme0 | grep -Ei "percentage_used|temperature|critical"

NVMe percentage_used is wear — under 10% after a year is normal. SSDs die by wear-out, 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 + owning process ss -tulpn | grep 11434 # who owns Ollama's port ip a # interfaces and addresses

Tailscale sanity

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

Permanently "via DERP" means UDP's blocked somewhere — works, but slower. Direct is the goal.

Processes
PM2 & htop

The PM2 daily driver

pm2 ls # watch the ↺ restart counter 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. pm2 logs <name> --err for the reason — never just restart harder.

htop, driven by keys

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

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

Recovery
When it won't boot at all

The chroot rescue recipe

Boot the install USB → shell → become root inside the broken system. Fix bootloaders, clear full discs, reset passwords.
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 # you're now inside the broken OS

From there: apt --fix-broken install, update-grub, delete whatever filled the disk. Exit, 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; sensors-detect once) nproc # core count
1–3switch tab /filter Escclear