bind-mount attempt

This commit is contained in:
randogoth 2026-01-14 18:19:46 +02:00
parent 29beb6408f
commit c2eb4e0bf6
7 changed files with 43 additions and 32 deletions

View file

@ -2,7 +2,7 @@
*Deinonyxus* is a personal spin of the UBlue Bluefin DX image with the 🍦[Lix](https://lix.systems/) flavored Nix package manager baked in and a first-login bootstrap for simple declarative package management using [curator](https://codeberg.org/randogoth/curator). *Deinonyxus* is a personal spin of the UBlue Bluefin DX image with the 🍦[Lix](https://lix.systems/) flavored Nix package manager baked in and a first-login bootstrap for simple declarative package management using [curator](https://codeberg.org/randogoth/curator).
The overlay mount approach was directly borrowed from the [Daemonix](https://github.com/DXC-0/daemonix/) Silverblue/Nix image. The Nix store is seeded into `/usr/share/nix-store` in the image and bind-mounted from `/var/lib/nix-store` to `/nix` on boot to avoid overlay stacking limits on composefs/ostree.
## Whats inside ## Whats inside
- Base: `ghcr.io/ublue-os/bluefin-dx:latest` without Cockpit, Docker, Firefox, VS Code - Base: `ghcr.io/ublue-os/bluefin-dx:latest` without Cockpit, Docker, Firefox, VS Code

View file

@ -5,7 +5,7 @@ set -euo pipefail
rpm_url="https://nix-community.github.io/nix-installers/lix/x86_64/lix-multi-user-2.91.1.rpm" rpm_url="https://nix-community.github.io/nix-installers/lix/x86_64/lix-multi-user-2.91.1.rpm"
install -d /usr/share/nix-store /var/lib/nix-store /var/cache/nix-store /nix /etc/nix install -d /usr/share/nix-store /var/lib/nix-store /nix /etc/nix
# Avoid systemd calls during RPM %post in the image build environment. # Avoid systemd calls during RPM %post in the image build environment.
export SYSTEMD_OFFLINE=1 export SYSTEMD_OFFLINE=1
@ -40,8 +40,9 @@ ensure_list_value() {
ensure_list_value "substituters" "$lix_cache_url" ensure_list_value "substituters" "$lix_cache_url"
ensure_list_value "trusted-public-keys" "$lix_cache_key" ensure_list_value "trusted-public-keys" "$lix_cache_key"
# === MOVE INITIAL NIX STORE TO LOWERDIR === # === SEED STORE FOR FIRST BOOT (copied into /var on boot) ===
if compgen -G "/nix/*" >/dev/null; then if compgen -G "/nix/*" >/dev/null; then
mv /nix/* /usr/share/nix-store/ rsync -aH --delete /nix/ /usr/share/nix-store/
rm -rf /nix/*
fi fi

View file

@ -1 +0,0 @@
overlay

View file

@ -1,13 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
mkdir -p /usr/share/nix-store /var/lib/nix-store /var/cache/nix-store /nix
# Skip if already mounted to avoid errors on reload.
if mountpoint -q /nix; then
exit 0
fi
mount -t overlay overlay \
-o lowerdir=/usr/share/nix-store,upperdir=/var/lib/nix-store,workdir=/var/cache/nix-store \
/nix

View file

@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -euo pipefail
# Bind-mount /var/lib/nix-store to /nix.
# If /var/lib/nix-store is empty, seed it from the baked store in /usr/share/nix-store.
mkdir -p /usr/share/nix-store /var/lib/nix-store /nix
copy_seed_store() {
if command -v rsync >/dev/null 2>&1; then
rsync -aH --delete /usr/share/nix-store/ /var/lib/nix-store/
else
cp -a /usr/share/nix-store/. /var/lib/nix-store/
fi
}
if ! mountpoint -q /nix; then
if [ -z "$(ls -A /var/lib/nix-store 2>/dev/null)" ] && compgen -G "/usr/share/nix-store/*" >/dev/null; then
copy_seed_store
fi
mount --bind /var/lib/nix-store /nix
mount -o remount,bind,exec /nix
# Ensure daemon paths exist and labels are sane.
if command -v systemd-tmpfiles >/dev/null 2>&1; then
systemd-tmpfiles --create /usr/lib/tmpfiles.d/nix-daemon.conf
fi
if command -v restorecon >/dev/null 2>&1; then
restorecon -RF /var/lib/nix-store /nix || true
fi
fi

View file

@ -1,14 +1,14 @@
[Unit] [Unit]
Description=Mount OverlayFS for /nix Description=Bind-mount /var/lib/nix-store to /nix
DefaultDependencies=no DefaultDependencies=no
After=local-fs.target After=local-fs.target
Before=systemd-tmpfiles-setup.service nix-daemon.service nix-daemon.socket RequiresMountsFor=/var /var/lib/nix-store
ConditionPathExists=/usr/bin/mount-nix-overlay.sh Before=nix-daemon.service nix-daemon.socket
ConditionPathExists=/usr/bin/mount-nix.sh
[Service] [Service]
Type=oneshot Type=oneshot
ExecStart=/usr/bin/mount-nix-overlay.sh ExecStart=/usr/bin/mount-nix.sh
ExecStartPost=/usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/nix-daemon.conf
RemainAfterExit=yes RemainAfterExit=yes
[Install] [Install]

View file

@ -35,23 +35,16 @@ modules:
files: files:
add: add:
- https://repo.vscodium.dev/vscodium.repo - https://repo.vscodium.dev/vscodium.repo
- https://openrazer.github.io/hardware:razer.repo
install: install:
packages: packages:
- repo: vscodium - repo: vscodium
packages: packages:
- codium - codium
- dkms
- openrazer-daemon
- openrazer-kernel-modules-dkms
- syncthing - syncthing
- uv - uv
- waydroid - waydroid
- xautomation
remove: remove:
packages: packages:
- kmod-openrazer
- openrazer-kmod-common
- android-tools - android-tools
- cockpit-bridge - cockpit-bridge
- cockpit-machines - cockpit-machines
@ -78,9 +71,8 @@ modules:
scope: system scope: system
# If no repo information is specified, Flathub will be used by default # If no repo information is specified, Flathub will be used by default
install: # system flatpaks we want all users to have and not remove install: # system flatpaks we want all users to have and not remove
- app.zen_browser.zen - net.waterfox.waterfox
- org.telegram.desktop - org.telegram.desktop
- app.polychromatic.controller
remove: # replace default Firefox with Waterfox remove: # replace default Firefox with Waterfox
- org.mozilla.firefox - org.mozilla.firefox
- scope: user # Also add Flathub user repo, but no user packages - scope: user # Also add Flathub user repo, but no user packages