diff --git a/flake.nix b/flake.nix index 009faa7..66a9bef 100644 --- a/flake.nix +++ b/flake.nix @@ -147,6 +147,29 @@ }; }; + + # Create and loop-mount an ext4 image on the 9p data volume + # for the overlay upper/work (9p can't serve as overlayfs upper) + systemd.services.claude-overlay-img = { + description = "Create ext4 image for Claude overlay"; + wantedBy = [ "var-lib-claude\\x2drw.mount" ]; + before = [ "var-lib-claude\\x2drw.mount" ]; + after = [ "var-lib-cc\\x2dsandbox.mount" ]; + requires = [ "var-lib-cc\\x2dsandbox.mount" ]; + unitConfig.DefaultDependencies = false; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = pkgs.writeShellScript "claude-overlay-img" '' + img=/var/lib/cc-sandbox/claude-overlay.img + if [ ! -f "$img" ]; then + ${pkgs.coreutils}/bin/truncate -s 128M "$img" + ${pkgs.e2fsprogs}/bin/mkfs.ext4 -q "$img" + fi + ''; + }; + }; + fileSystems = { # tmpfs backing for the writable nix store overlay "/nix/.rw-store" = { @@ -155,11 +178,14 @@ neededForBoot = true; }; - # Claude config: ephemeral overlay on top of host's ~/.claude + # Loop-mounted ext4 image for overlay upper/work "/var/lib/claude-rw" = { - fsType = "tmpfs"; - options = [ "size=128M" "mode=0700" ]; + device = "/var/lib/cc-sandbox/claude-overlay.img"; + fsType = "ext4"; + options = [ "loop" ]; }; + + # Claude config: persistent overlay on top of host's ~/.claude "/root/.claude".overlay = { lowerdir = [ "/var/lib/claude-lower" ]; upperdir = "/var/lib/claude-rw/upper";