nixos: replace container activation scripts (#499313)
This commit is contained in:
@@ -13,18 +13,24 @@
|
||||
];
|
||||
};
|
||||
|
||||
# copy the config for nixos-rebuild
|
||||
system.activationScripts.config =
|
||||
# Create a default configuration.nix on first boot so nixos-rebuild works
|
||||
# out of the box.
|
||||
systemd.services.incus-create-nixos-config =
|
||||
let
|
||||
config = pkgs.replaceVars ./incus-container-image-inner.nix {
|
||||
configFile = pkgs.replaceVars ./incus-container-image-inner.nix {
|
||||
stateVersion = lib.trivial.release;
|
||||
};
|
||||
in
|
||||
''
|
||||
if [ ! -e /etc/nixos/configuration.nix ]; then
|
||||
install -m 0644 -D ${config} /etc/nixos/configuration.nix
|
||||
fi
|
||||
'';
|
||||
{
|
||||
description = "Create default NixOS configuration for Incus";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
unitConfig.ConditionPathExists = "!/etc/nixos/configuration.nix";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
ExecStart = "${pkgs.coreutils}/bin/install -m 0644 -D ${configFile} /etc/nixos/configuration.nix";
|
||||
};
|
||||
};
|
||||
|
||||
networking = {
|
||||
dhcpcd.enable = false;
|
||||
|
||||
@@ -13,18 +13,24 @@
|
||||
];
|
||||
};
|
||||
|
||||
# copy the config for nixos-rebuild
|
||||
system.activationScripts.config =
|
||||
# Create a default configuration.nix on first boot so nixos-rebuild works
|
||||
# out of the box.
|
||||
systemd.services.incus-create-nixos-config =
|
||||
let
|
||||
config = pkgs.replaceVars ./incus-virtual-machine-image-inner.nix {
|
||||
configFile = pkgs.replaceVars ./incus-virtual-machine-image-inner.nix {
|
||||
stateVersion = lib.trivial.release;
|
||||
};
|
||||
in
|
||||
''
|
||||
if [ ! -e /etc/nixos/configuration.nix ]; then
|
||||
install -m 0644 -D ${config} /etc/nixos/configuration.nix
|
||||
fi
|
||||
'';
|
||||
{
|
||||
description = "Create default NixOS configuration for Incus";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
unitConfig.ConditionPathExists = "!/etc/nixos/configuration.nix";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
ExecStart = "${pkgs.coreutils}/bin/install -m 0644 -D ${configFile} /etc/nixos/configuration.nix";
|
||||
};
|
||||
};
|
||||
|
||||
# Network
|
||||
networking = {
|
||||
|
||||
@@ -79,8 +79,9 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
# Install new init script
|
||||
system.activationScripts.installInitScript = ''
|
||||
ln -fs $systemConfig/init /init
|
||||
# Update /init symlink when switching configurations so the container
|
||||
# boots the new system on restart.
|
||||
system.build.installBootLoader = pkgs.writeShellScript "install-docker-init" ''
|
||||
${pkgs.coreutils}/bin/ln -fs "$1/init" /init
|
||||
'';
|
||||
}
|
||||
|
||||
@@ -136,8 +136,5 @@
|
||||
|
||||
systemd.packages = [ pkgs.distrobuilder.generator ];
|
||||
|
||||
system.activationScripts.installInitScript = lib.mkForce ''
|
||||
ln -fs $systemConfig/init /sbin/init
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
||||
@@ -156,6 +156,16 @@ in
|
||||
|
||||
server.succeed(f"incus exec {instance_name} -- test -e /dev/tpm0")
|
||||
server.succeed(f"incus exec {instance_name} -- test -e /dev/tpmrm0")
|
||||
|
||||
with subtest("[${image_id}] default configuration.nix is created on first boot"):
|
||||
server.succeed(f"incus exec {instance_name} -- test -f /etc/nixos/configuration.nix")
|
||||
|
||||
with subtest("[${image_id}] configuration.nix create service does not overwrite existing config"):
|
||||
server.succeed(f"incus exec {instance_name} -- systemctl restart incus-create-nixos-config.service")
|
||||
status = server.succeed(
|
||||
f"incus exec {instance_name} -- systemctl show -p ActiveState incus-create-nixos-config.service"
|
||||
).strip()
|
||||
assert "inactive" in status, f"Expected inactive (ConditionPathExists should prevent start), got {status}"
|
||||
''
|
||||
#
|
||||
# container specific
|
||||
@@ -164,6 +174,21 @@ in
|
||||
lib.optionalString (config.type == "container")
|
||||
# python
|
||||
''
|
||||
with subtest("[${image_id}] switch-to-configuration updates /sbin/init via installBootLoader"):
|
||||
# Remove /sbin/init so we can verify installBootLoader recreates it
|
||||
server.succeed(f"incus exec {instance_name} -- rm -f /sbin/init")
|
||||
server.fail(f"incus exec {instance_name} -- test -e /sbin/init")
|
||||
|
||||
server.succeed(
|
||||
f"incus exec {instance_name} -- /run/current-system/bin/switch-to-configuration switch"
|
||||
)
|
||||
|
||||
# Verify installBootLoader recreated /sbin/init pointing to the system's init
|
||||
server.succeed(f"incus exec {instance_name} -- test -x /sbin/init")
|
||||
target = server.succeed(f"incus exec {instance_name} -- readlink -f /sbin/init").strip()
|
||||
current = server.succeed(f"incus exec {instance_name} -- readlink -f /run/current-system/init").strip()
|
||||
assert target == current, f"/sbin/init -> {target}, expected {current}"
|
||||
|
||||
# TODO troubleshoot VM hot memory resizing which was introduced in 6.12
|
||||
with subtest("[${image_id}] memory limits can be hotplug changed"):
|
||||
server.set_instance_config(instance_name, "limits.memory 512MB")
|
||||
|
||||
Reference in New Issue
Block a user