Files and app logins move across by hand, so archiving and unpacking a home directory isn't this repo's job any more. setup.sh installs the machine and stops there. Two things restore.sh used to cover, kept where they still matter: the post-reboot `sudo flatpak update` that fetches the NVIDIA GL runtime (Flatpak can only match it to a loaded driver, so it can't happen during setup), and the notes on which dotfiles not to copy over from Fedora. The server-marvin mount is now optional — press Enter at the prompt to skip it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
137 lines
6.8 KiB
Markdown
137 lines
6.8 KiB
Markdown
# main-desktop
|
|
|
|
**Ubuntu 26.04 LTS** on my desktop (Ryzen 7 9800X3D, RTX 5090, 49" 5120x1440), set up by one
|
|
script. This replaces the Bazzite/BlueBuild image that used to live here — that version is still
|
|
in the git history.
|
|
|
|
[scripts/setup.sh](scripts/setup.sh) turns a fresh Ubuntu install into this machine: NVIDIA
|
|
driver, Docker with GPU access, Steam, the apps in [flatpaks.txt](flatpaks.txt), and the drive
|
|
mounts. It's safe to re-run. Copying files over and signing in to apps are deliberately **not**
|
|
its job — I do those by hand.
|
|
|
|
## Why leave Bazzite
|
|
|
|
The read-only base made ordinary things into projects. VS Code had to be layered with rpm-ostree,
|
|
Node and .NET came from Homebrew, and Claude desktop ran inside an Ubuntu distrobox because it
|
|
only ships for Ubuntu/Debian. On Ubuntu, each of those is an `apt install`.
|
|
|
|
## 1. Install Ubuntu 26.04 LTS
|
|
|
|
> **⚠ Two identical 1 TB NVMe drives.** Install to the **Samsung SSD 990 PRO**. Never pick the
|
|
> **Samsung SSD 970 EVO Plus** — that's the "Data" drive holding the second Steam library and the
|
|
> emulator files, and it stays untouched. `nvme0`/`nvme1` can swap between boots, so go by the
|
|
> model name the installer shows.
|
|
|
|
- "Erase disk and install Ubuntu" on the 990 PRO is fine.
|
|
- Make the user **`ckoch`**. The first user gets UID 1000, which matches the file ownership
|
|
already on the Data drive.
|
|
- The "third-party drivers" checkbox doesn't matter; setup.sh installs the NVIDIA driver either
|
|
way.
|
|
- Prefer KDE? Install **Kubuntu 26.04** instead. The script doesn't care which desktop you run.
|
|
|
|
## 2. Run the script
|
|
|
|
```bash
|
|
sudo apt install -y git
|
|
git clone https://git.lazypugs.com/ckoch/main-desktop.git ~/Documents/git/main-desktop
|
|
cd ~/Documents/git/main-desktop && scripts/setup.sh
|
|
```
|
|
|
|
It asks for your sudo password once, then for the server-marvin SMB credentials — press Enter
|
|
there to skip that mount. Flatpaks take most of the run. **Reboot** when it finishes.
|
|
|
|
What it installs:
|
|
|
|
- **NVIDIA driver:** Ubuntu's recommended **open-kernel** branch (595 today) with the prebuilt,
|
|
signed modules, so no DKMS. The script stops if it ends up with a non-open driver, since
|
|
Blackwell only runs on the open modules. Also 32-bit GL for Steam and Proton.
|
|
- **Gaming:** Steam (`steam-installer` plus `steam-devices` for controllers), Lutris, GameMode,
|
|
MangoHud, and ProtonUp-Qt for Proton-GE. The Xbox Bluetooth fix (`disable_ertm`) carries over
|
|
from Bazzite.
|
|
- **Containers:** Docker CE from Docker's repo (not the snap), with `--gpus all` wired up through
|
|
nvidia-container-toolkit. You're added to `docker` and `kvm`.
|
|
- **Apps:** the 27 Flatpaks in [flatpaks.txt](flatpaks.txt), picked from the 42 that were on
|
|
Bazzite. The rest sit commented out at the bottom of that file. Ubuntu's Firefox snap is removed
|
|
in favour of the Flatpak. A systemd timer updates Flatpaks daily.
|
|
- **Dev:** VS Code, Claude desktop (Anthropic's apt repo), Claude Code CLI, `build-essential` and
|
|
cmake, and git credentials kept in the GNOME keyring. **No Node or .NET on the host** by
|
|
choice — LudosData and landingPage build in Docker. To add them:
|
|
`sudo add-apt-repository ppa:jdxcode/mise && sudo apt install mise dotnet-sdk-10.0`.
|
|
- **Mounts:** the Data drive at **`/mnt/data`**, and server-marvin at
|
|
**`/mnt/server-marvin-personal`** if you gave it credentials.
|
|
|
|
## 3. After the reboot
|
|
|
|
```bash
|
|
sudo flatpak update # fetches the NVIDIA GL runtime the Flatpak apps need
|
|
```
|
|
|
|
Flatpak can only match that runtime to the driver once the driver is actually loaded, which is why
|
|
it waits until after the reboot. Skip it and apps fall back to software rendering until the daily
|
|
timer catches up about 10 minutes after boot.
|
|
|
|
Then, by hand:
|
|
|
|
- **Steam:** sign in, then **Settings → Storage → Add drive → `/mnt/data/SteamLibrary`**. Those
|
|
games need no redownload.
|
|
- **Display:** Settings → Displays. The monitor does **5120x1440 @ 240 Hz**; Bazzite was running
|
|
it at 120. Turn on variable refresh rate while you're there. Ubuntu's built-in tiling earns its
|
|
keep at this width.
|
|
- **PIA VPN:** the official Linux app works on Ubuntu (it couldn't on Bazzite's read-only `/usr`).
|
|
Download the installer from PIA and run it.
|
|
- **Gitea:** the first `git push` asks for your username and password once, then the GNOME keyring
|
|
remembers it. KDE Wallet was doing that here.
|
|
|
|
### Moving files across by hand
|
|
|
|
Worth knowing while you copy things over from the old install:
|
|
|
|
- **Flatpak app data** lives in `~/.var/app/<app-id>`. Copying one app's folder across brings that
|
|
app's logins, profile and settings with it — Firefox and Thunderbird profiles included — as long
|
|
as the app ID matches.
|
|
- **Steam saves** are in `~/.local/share/Steam/userdata` (and Proton prefixes in
|
|
`steamapps/compatdata`). Game files themselves redownload.
|
|
- **FFXIV** is `~/.xlcore`, ~124 GB. Worth copying rather than re-fetching from Square's patch
|
|
servers.
|
|
- **ComfyUI:** copy the folder but not its `venv` — rebuild that with
|
|
`python3 -m venv venv && venv/bin/pip install -r requirements.txt`.
|
|
- **Don't copy** Fedora's `.bashrc`/`.bash_profile`, `~/.local/bin` (pip shims built against
|
|
Fedora's Python), `~/.config/dconf` (KDE's settings database, which would overwrite GNOME's), or
|
|
the KDE-generated `~/.config/gtk-3.0` and `gtk-4.0` themes.
|
|
|
|
## Check it worked
|
|
|
|
```bash
|
|
nvidia-smi # RTX 5090, driver 595.x
|
|
modinfo -F license nvidia # "Dual MIT/GPL" = open modules
|
|
docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi
|
|
flatpak list --app | wc -l # 27
|
|
findmnt /mnt/data
|
|
claude --version && code --version
|
|
```
|
|
|
|
Podman's `--device nvidia.com/gpu=all` needs a CDI spec. The toolkit normally generates one at
|
|
boot; if Podman says the device is unknown, run
|
|
`sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml`.
|
|
|
|
## Coming from Bazzite: what moved
|
|
|
|
| Was | Now |
|
|
|---|---|
|
|
| `rpm-ostree` layering / `ujust` | `apt` |
|
|
| Homebrew `node@24`, `dotnet` | Nothing on the host — those projects build in Docker |
|
|
| Claude desktop in a distrobox | Native `claude-desktop` package |
|
|
| Git password from KDE Wallet | GNOME keyring, via git's libsecret helper |
|
|
| `/var/home/ckoch` | `/home/ckoch` |
|
|
| `/run/media/ckoch/Data` | `/mnt/data` |
|
|
| `/var/mnt/server-marvin-personal` | `/mnt/server-marvin-personal` |
|
|
| Image updates + rollback | Software Updater / `sudo apt update && sudo apt upgrade`; Flatpaks auto-update daily. No rollback by default; `sudo apt install timeshift` if you miss it |
|
|
|
|
## Maintenance
|
|
|
|
- **Add or remove an app:** edit [flatpaks.txt](flatpaks.txt) and re-run `scripts/setup.sh`.
|
|
Removing a line doesn't uninstall anything; `flatpak uninstall <id>` once by hand.
|
|
- **Next LTS (28.04):** Ubuntu offers the upgrade in Software Updater once 28.04.1 is out. The
|
|
upgrader disables third-party repos (Docker, NVIDIA toolkit, and so on) — turn them back on in
|
|
Software & Updates → Other Software afterwards.
|