[pve-devel] [PATCH pve-container] update inittab instead of replacing it

Wolfgang Bumiller w.bumiller at proxmox.com
Wed Oct 14 14:48:27 CEST 2015


---
 src/PVE/LXC/Setup/Base.pm   |  6 ++---
 src/PVE/LXC/Setup/Debian.pm | 61 ++++++++++++++++++++++++++++++++++-----------
 2 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/src/PVE/LXC/Setup/Base.pm b/src/PVE/LXC/Setup/Base.pm
index ba7453d..9a39468 100644
--- a/src/PVE/LXC/Setup/Base.pm
+++ b/src/PVE/LXC/Setup/Base.pm
@@ -191,7 +191,7 @@ sub setup_network {
 }
 
 sub setup_init {
-    my ($self, $conf) = @_;
+    my ($self, $conf, $creation) = @_;
 
     die "please implement this inside subclass"
 }
@@ -454,7 +454,7 @@ sub rewrite_ssh_host_keys {
 sub pre_start_hook {
     my ($self, $conf) = @_;
 
-    $self->setup_init($conf);
+    $self->setup_init($conf, 0);
     $self->setup_network($conf);
     $self->set_hostname($conf);
     $self->set_dns($conf);
@@ -470,7 +470,7 @@ sub post_create_hook {
     &$randomize_crontab($self, $conf);
     
     $self->set_user_password($conf, 'root', $root_password);
-    $self->setup_init($conf);
+    $self->setup_init($conf, 1);
     $self->setup_network($conf);
     $self->set_hostname($conf);
     $self->set_dns($conf);
diff --git a/src/PVE/LXC/Setup/Debian.pm b/src/PVE/LXC/Setup/Debian.pm
index 1b2a277..068d155 100644
--- a/src/PVE/LXC/Setup/Debian.pm
+++ b/src/PVE/LXC/Setup/Debian.pm
@@ -77,26 +77,57 @@ p0::powerfail:/sbin/init 0
 __EOD__
 
 sub setup_init {
-    my ($self, $conf) = @_;
+    my ($self, $conf, $creation) = @_;
 
     my $filename = "/etc/inittab";
+    return if !$self->ct_file_exists($filename);
 
-    if ($self->ct_file_exists($filename)) {
-	my $inittab = $default_inittab;
-
-	my $ttycount =  PVE::LXC::get_tty_count($conf);
-	for (my $i = 1; $i <= $ttycount; $i++) {
-	    next if $i == 7; # reserved for X11
-	    my $levels = ($i == 1) ? '2345' : '23';
-	    if ($self->{version} < 7) {
-		$inittab .= "$i:$levels:respawn:/sbin/getty -L 38400 tty$i\n";
-	    } else {
-		$inittab .= "$i:$levels:respawn:/sbin/getty --noclear 38400 tty$i\n";
-	    }
+    my $ttycount =  PVE::LXC::get_tty_count($conf);
+    my $inittab = $creation ? $default_inittab : $self->ct_file_get_contents($filename);
+
+    my %tty_done;
+    my $linecount = 0;
+    my $last_tty_line;
+
+    # For every getty line enable/disable it via a comment tag ('#') depending
+    # on whether its id is within the ttycount range.
+    # Afterwards, for every new tty for which no tty entry line was found
+    # generate a new one.
+    my $process_line = sub {
+	my ($line) = @_;
+	++$linecount;
+
+	# Check for a getty line:
+	return $line if $line !~ /^\s*#?\s*(\d+):(\d+):([^:]*):(.*getty.*)$/;
+	my ($id, $runlevels, $action, $process) = ($1, $2, $3, $4);
+
+	# Remember the linenumber so we can insert new getty entries grouped
+	# together with the entries already in the file.
+	$last_tty_line = $linecount;
+	return $line if $id <= 0; # sanity check
+
+	$tty_done{$id} = 1; # remember it's already available
+
+	my $disabled = $id > $ttycount ? '#' : '';
+	return "${disabled}$id:$runlevels:$action:$process";
+    };
+    my @lines = map { &$process_line($_) } split(/\n/, $inittab);
+    $last_tty_line ||= scalar(@lines);
+
+    my $version = $self->{version};
+    for my $id (1..$ttycount) {
+	next if $tty_done{$id};
+	my $levels = ($id == 1) ? '2345' : '23';
+	if ($version < 7) {
+	    splice @lines, $last_tty_line++, 0, "$id:$levels:respawn:/sbin/getty -L 38400 tty$id";
+	} else {
+	    splice @lines, $last_tty_line++, 0, "$id:$levels:respawn:/sbin/getty --noclear 38400 tty$id";
 	}
-	
-	$self->ct_file_set_contents($filename, $inittab);
     }
+
+    $inittab = join("\n", @lines) . "\n";
+
+    $self->ct_file_set_contents($filename, $inittab);
 }
 
 sub setup_network {
-- 
2.1.4




More information about the pve-devel mailing list