}
}
+# At first boot, systemd goes through a set of `presets` to bring the
+# enable/disable state of services to a default.
+# Meaning for newer templates we should use this instead of manually creating
+# enable/disable symlinks.
+#
+# `$preset` should map service names to a bool-ish.
+sub setup_systemd_preset {
+ my ($self, $preset) = @_;
+
+ my $preset_data =
+ "# Added by PVE at create-time for first-boot configuration.\n";
+
+ for my $service (sort keys %$preset) {
+ if ($preset->{$service}) {
+ $preset_data .= "enable $service\n";
+ } else {
+ $preset_data .= "disable $service\n";
+ }
+ }
+
+ $self->ct_mkdir('/etc/systemd/system-preset', 0755);
+ $self->ct_file_set_contents(
+ '/etc/systemd/system-preset/00-pve.preset',
+ $preset_data,
+ );
+}
+
sub setup_securetty {
my ($self, $conf, @add) = @_;
return '';
}
+my sub at_least : prototype($$$) {
+ my ($str, $want_maj, $want_min) = @_;
+ return if !defined($str) || !defined($want_maj);
+
+ my ($maj, $min) = $str =~ /^(\d+)(?:\.(\d+))?/;
+ return if !defined($maj);
+
+ return $want_maj < $maj || $want_maj == $maj && (
+ (!defined($min) && $want_min == 0) || (defined($min) && $want_min <= $min)
+ );
+}
+
sub setup_init {
my ($self, $conf) = @_;
my $systemd = $self->ct_readlink('/sbin/init');
if (defined($systemd) && $systemd =~ m@/systemd$@) {
$self->setup_container_getty_service($conf);
+
+ my $version = $self->{version};
+ if (at_least($version, 12, 0)) {
+ # this only affects the first-boot (if no /etc/machien-id exists).
+ $self->setup_systemd_preset({
+ # systemd-networkd gets enabled by default, disable it, debian uses
+ # ifupdown
+ 'systemd-networkd.service' => 0,
+ });
+ }
}
my $filename = "/etc/inittab";
$inittab .= "p0::powerfail:/sbin/init 0\n";
- my $version = $self->{version};
for (my $id = 1; $id <= $ttycount; $id++) {
next if $id == 7; # reserved for X11
my $levels = ($id == 1) ? '2345' : '23';
SCRIPTS
}
-my sub at_least : prototype($$$) {
- my ($str, $want_maj, $want_min) = @_;
- return if !defined($str) || !defined($want_maj);
-
- my ($maj, $min) = $str =~ /^(\d+)(?:\.(\d+))?/;
- return if !defined($maj);
-
- return $want_maj < $maj || $want_maj == $maj && (
- (!defined($min) && $want_min == 0) || (defined($min) && $want_min <= $min)
- );
-}
-
# NOTE: this is re-used by Alpine Linux, please have that in mind when changing things.
sub setup_network {
my ($self, $conf) = @_;
my $version = $self->{version};
if ($version >= 37) {
- # systemd-networkd is disabled by the preset in >=37, reenable it
# this only affects the first-boot (if no /etc/machien-id exists).
- $self->ct_mkdir('/etc/systemd/system-preset', 0755);
- $self->ct_file_set_contents(
- '/etc/systemd/system-preset/00-pve.preset',
- "enable systemd-networkd.service\n",
- );
+ $self->setup_systemd_preset({
+ # systemd-networkd is disabled by the preset in >=37 in favor of
+ # NetworkManager, reenable it, since we make use of it.
+ 'systemd-networkd.service' => 0,
+ });
}
}