fix: create the storage pool deliberately — btrfs, because cloning is the whole point
'incus admin init --minimal' picks the 'dir' backend, which has no copy-on-write: every snapshot and clone is a full copy of the box's root — several GB and minutes apiece once Docker, Node and Claude Code are installed. Measured live: one clone took minutes, and a single drill run pays that three times (snapshot + two clones). The workflow the tool exists for — log in once, snapshot, clone forever — stops being attractive at exactly that price. setup-host.sh now bootstraps via a preseed that mirrors what --minimal creates (default pool, incusbr0, default profile with root + eth0) with only the driver deliberate: btrfs on a loop device (CoW — clones share blocks and diverge on write), installing btrfs-progs if absent, falling back to dir with a warning if btrfs cannot be had. Existing hosts are untouched: the block is skipped whenever a 'default' pool exists. Closes #29
This commit is contained in:
parent
f241b1f27a
commit
c0611e5f0b
1 changed files with 38 additions and 2 deletions
|
|
@ -16,8 +16,44 @@ if ! id -nG "$USER" | grep -qw incus-admin; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
# Storage pool + base config (safe to re-run; init is a no-op if configured)
|
||||
incus storage show default >/dev/null 2>&1 || incus admin init --minimal
|
||||
# Storage pool + base config (safe to re-run: skipped once the pool exists).
|
||||
# NOT 'incus admin init --minimal': minimal picks the 'dir' backend, which has
|
||||
# no copy-on-write — every snapshot and clone is a FULL copy of the box's root,
|
||||
# several GB and minutes apiece once a box is provisioned, against a workflow
|
||||
# whose whole point is "log in once, snapshot, clone forever" (#29). btrfs on
|
||||
# a loop device gives CoW (near-instant, near-free clones) with no
|
||||
# partitioning. The preseed mirrors exactly what --minimal creates (pool,
|
||||
# incusbr0, default profile) with only the driver deliberate; dir remains the
|
||||
# fallback so a host that cannot do btrfs still works — just slowly, and it
|
||||
# says so.
|
||||
if ! incus storage show default >/dev/null 2>&1; then
|
||||
driver=btrfs
|
||||
command -v mkfs.btrfs >/dev/null 2>&1 || sudo apt-get install -y btrfs-progs || driver=dir
|
||||
if ! incus admin init --preseed <<PRESEED
|
||||
storage_pools:
|
||||
- name: default
|
||||
driver: $driver
|
||||
networks:
|
||||
- name: incusbr0
|
||||
type: bridge
|
||||
profiles:
|
||||
- name: default
|
||||
devices:
|
||||
root:
|
||||
path: /
|
||||
pool: default
|
||||
type: disk
|
||||
eth0:
|
||||
name: eth0
|
||||
network: incusbr0
|
||||
type: nic
|
||||
PRESEED
|
||||
then
|
||||
echo "storage: $driver preseed failed — falling back to --minimal (dir: every clone is a full disk copy)" >&2
|
||||
incus admin init --minimal
|
||||
fi
|
||||
echo "storage: pool 'default' driver = $(incus storage show default | awk '/^driver:/ {print $2}')"
|
||||
fi
|
||||
|
||||
# Isolated NAT network. IPv6 off: one less egress path to reason about.
|
||||
incus network show claudenet >/dev/null 2>&1 || incus network create claudenet \
|
||||
|
|
|
|||
Loading…
Reference in a new issue