[PATCH v2 container 1/1] Setup: add NixOS support

Harikrishnan R rharikrishnan95 at gmail.com
Tue Feb 15 18:28:46 CET 2022


Distro detection is done through the presence of a /nix folder.
NixOS typically uses a script-based network configuration system
that isn't easy to configure from the outside. LXC templates
generated for proxmox are instead expected to use systemd-networkd.

Signed-off-by: Harikrishnan R <rharikrishnan95 at gmail.com>
---
 src/PVE/LXC/Config.pm      |  2 +-
 src/PVE/LXC/Setup.pm       |  4 ++++
 src/PVE/LXC/Setup/Makefile |  1 +
 src/PVE/LXC/Setup/NixOS.pm | 44 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 src/PVE/LXC/Setup/NixOS.pm

diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm
index 7c503ca..0ed7bd2 100644
--- a/src/PVE/LXC/Config.pm
+++ b/src/PVE/LXC/Config.pm
@@ -469,7 +469,7 @@ my $confdesc = {
     ostype => {
 	optional => 1,
 	type => 'string',
-	enum => [qw(debian devuan ubuntu centos fedora opensuse archlinux alpine gentoo unmanaged)],
+	enum => [qw(debian devuan ubuntu centos fedora opensuse archlinux alpine gentoo nixos unmanaged)],
 	description => "OS type. This is used to setup configuration inside the container, and corresponds to lxc setup scripts in /usr/share/lxc/config/<ostype>.common.conf. Value 'unmanaged' can be used to skip and OS specific setup.",
     },
     console => {
diff --git a/src/PVE/LXC/Setup.pm b/src/PVE/LXC/Setup.pm
index 5cc56af..b72a18e 100644
--- a/src/PVE/LXC/Setup.pm
+++ b/src/PVE/LXC/Setup.pm
@@ -17,6 +17,7 @@ use PVE::LXC::Setup::Fedora;
 use PVE::LXC::Setup::Gentoo;
 use PVE::LXC::Setup::SUSE;
 use PVE::LXC::Setup::Ubuntu;
+use PVE::LXC::Setup::NixOS;
 use PVE::LXC::Setup::Unmanaged;
 
 my $plugins = {
@@ -29,6 +30,7 @@ my $plugins = {
     gentoo    => 'PVE::LXC::Setup::Gentoo',
     opensuse  => 'PVE::LXC::Setup::SUSE',
     ubuntu    => 'PVE::LXC::Setup::Ubuntu',
+    nixos     => 'PVE::LXC::Setup::NixOS',
     unmanaged => 'PVE::LXC::Setup::Unmanaged',
 };
 
@@ -75,6 +77,8 @@ my $autodetect_type = sub {
 	return "alpine";
     } elsif (-f  "$rootdir/etc/gentoo-release") {
 	return "gentoo";
+    } elsif (-d  "$rootdir/nix/store") {
+	return "nixos";
     } elsif (-f "$rootdir/etc/os-release") {
 	die "unable to detect OS distribution\n";
     } else {
diff --git a/src/PVE/LXC/Setup/Makefile b/src/PVE/LXC/Setup/Makefile
index 04ee2e4..df1cf97 100644
--- a/src/PVE/LXC/Setup/Makefile
+++ b/src/PVE/LXC/Setup/Makefile
@@ -10,6 +10,7 @@ SOURCES=\
     Gentoo.pm		\
     SUSE.pm		\
     Ubuntu.pm		\
+    NixOS.pm		\
     Unmanaged.pm	\
 
 .PHONY: install
diff --git a/src/PVE/LXC/Setup/NixOS.pm b/src/PVE/LXC/Setup/NixOS.pm
new file mode 100644
index 0000000..905ca8c
--- /dev/null
+++ b/src/PVE/LXC/Setup/NixOS.pm
@@ -0,0 +1,44 @@
+package PVE::LXC::Setup::NixOS;
+
+use strict;
+use warnings;
+
+use File::Path 'make_path';
+
+use PVE::LXC::Setup::Base;
+
+use base qw(PVE::LXC::Setup::Base);
+
+sub new {
+    my ($class, $conf, $rootdir) = @_;
+
+    my $self = { conf => $conf, rootdir => $rootdir, version => 0 };
+
+    $conf->{ostype} = "nixos";
+
+    return bless $self, $class;
+}
+
+sub template_fixup {
+    my ($self, $conf) = @_;
+}
+
+sub setup_network {
+    my ($self, $conf) = @_;
+
+    $self->setup_systemd_networkd($conf);
+}
+
+sub set_hostname {
+    my ($self, $conf) = @_;
+}
+
+sub set_timezone {
+    my ($self, $conf) = @_;
+}
+
+sub setup_init {
+    my ($self, $conf) = @_;
+}
+
+1;
-- 
2.35.1





More information about the pve-devel mailing list