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

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Oct 15 10:46:45 CEST 2015


---
 Changes since v2:
  - power lines are now removed and only the p0 line added
  - getty lines aren't preserved in their original form anymore
  - getty/power lines are now always moved to the bottom, makes it easier
 src/PVE/LXC/Setup/Debian.pm              | 82 ++++++++++----------------------
 src/test/test-debian-005/etc/inittab.exp | 22 ++++++++-
 src/test/test-debian-006/etc/inittab.exp | 22 ++++++++-
 src/test/test-debian-010/etc/inittab.exp | 22 ++++++++-
 4 files changed, 88 insertions(+), 60 deletions(-)

diff --git a/src/PVE/LXC/Setup/Debian.pm b/src/PVE/LXC/Setup/Debian.pm
index 1b2a277..5c1828c 100644
--- a/src/PVE/LXC/Setup/Debian.pm
+++ b/src/PVE/LXC/Setup/Debian.pm
@@ -33,70 +33,38 @@ sub new {
     return bless $self, $class;
 }
 
-my $default_inittab = <<__EOD__;
-
-# The default runlevel.
-id:2:initdefault:
-
-# Boot-time system configuration/initialization script.
-# This is run first except when booting in emergency (-b) mode.
-si::sysinit:/etc/init.d/rcS
-
-# /etc/init.d executes the S and K scripts upon change
-# of runlevel.
-#
-# Runlevel 0 is halt.
-# Runlevel 1 is single-user.
-# Runlevels 2-5 are multi-user.
-# Runlevel 6 is reboot.
-
-l0:0:wait:/etc/init.d/rc 0
-l1:1:wait:/etc/init.d/rc 1
-l2:2:wait:/etc/init.d/rc 2
-l3:3:wait:/etc/init.d/rc 3
-l4:4:wait:/etc/init.d/rc 4
-l5:5:wait:/etc/init.d/rc 5
-l6:6:wait:/etc/init.d/rc 6
-# Normally not reached, but fallthrough in case of emergency.
-z6:6:respawn:/sbin/sulogin
-
-# What to do when CTRL-ALT-DEL is pressed.
-ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
-
-# What to do when the power fails/returns.
-p0::powerfail:/sbin/init 0
-
-# /sbin/getty invocations for the runlevels.
-#
-# The "id" field MUST be the same as the last
-# characters of the device (after "tty").
-#
-# Format:
-#  <id>:<runlevels>:<action>:<process>
-#
-__EOD__
-
 sub setup_init {
     my ($self, $conf) = @_;
 
     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 = $self->ct_file_get_contents($filename);
+
+    my @lines = grep {
+	    # remove getty lines
+	    !/^\s*\d+:\d+:[^:]*:.*getty/ &&
+	    # remove power lines
+	    !/^\s*p[fno0]:/
+	} split(/\n/, $inittab);
+
+    $inittab = join("\n", @lines) . "\n";
+
+    $inittab .= "p0::powerfail:/sbin/init 0\n";
+
+    my $version = $self->{version};
+    my $levels = '2345';
+    for my $id (1..$ttycount) {
+	if ($version < 7) {
+	    $inittab .= "$id:$levels:respawn:/sbin/getty -L 38400 tty$id\n";
+	} else {
+	    $inittab .= "$id:$levels:respawn:/sbin/getty --noclear 38400 tty$id\n";
 	}
-	
-	$self->ct_file_set_contents($filename, $inittab);
+	$levels = '23';
     }
+
+    $self->ct_file_set_contents($filename, $inittab);
 }
 
 sub setup_network {
diff --git a/src/test/test-debian-005/etc/inittab.exp b/src/test/test-debian-005/etc/inittab.exp
index 0cbb029..7d881db 100644
--- a/src/test/test-debian-005/etc/inittab.exp
+++ b/src/test/test-debian-005/etc/inittab.exp
@@ -1,3 +1,5 @@
+# /etc/inittab: init(8) configuration.
+# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
 
 # The default runlevel.
 id:2:initdefault:
@@ -6,6 +8,9 @@ id:2:initdefault:
 # This is run first except when booting in emergency (-b) mode.
 si::sysinit:/etc/init.d/rcS
 
+# What to do in single-user mode.
+~~:S:wait:/sbin/sulogin
+
 # /etc/init.d executes the S and K scripts upon change
 # of runlevel.
 #
@@ -27,8 +32,10 @@ z6:6:respawn:/sbin/sulogin
 # What to do when CTRL-ALT-DEL is pressed.
 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
 
+# Action on special keypress (ALT-UpArrow).
+#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
+
 # What to do when the power fails/returns.
-p0::powerfail:/sbin/init 0
 
 # /sbin/getty invocations for the runlevels.
 #
@@ -38,6 +45,19 @@ p0::powerfail:/sbin/init 0
 # Format:
 #  <id>:<runlevels>:<action>:<process>
 #
+# Note that on most Debian systems tty7 is used by the X Window System,
+# so if you want to add more getty's go ahead but skip tty7 if you run X.
+#
+
+# Example how to put a getty on a serial line (for a terminal)
+#
+#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
+#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
+
+# Example how to put a getty on a modem line.
+#
+#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
+p0::powerfail:/sbin/init 0
 1:2345:respawn:/sbin/getty --noclear 38400 tty1
 2:23:respawn:/sbin/getty --noclear 38400 tty2
 3:23:respawn:/sbin/getty --noclear 38400 tty3
diff --git a/src/test/test-debian-006/etc/inittab.exp b/src/test/test-debian-006/etc/inittab.exp
index 9190693..937a7e0 100644
--- a/src/test/test-debian-006/etc/inittab.exp
+++ b/src/test/test-debian-006/etc/inittab.exp
@@ -1,3 +1,5 @@
+# /etc/inittab: init(8) configuration.
+# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
 
 # The default runlevel.
 id:2:initdefault:
@@ -6,6 +8,9 @@ id:2:initdefault:
 # This is run first except when booting in emergency (-b) mode.
 si::sysinit:/etc/init.d/rcS
 
+# What to do in single-user mode.
+~~:S:wait:/sbin/sulogin
+
 # /etc/init.d executes the S and K scripts upon change
 # of runlevel.
 #
@@ -27,8 +32,10 @@ z6:6:respawn:/sbin/sulogin
 # What to do when CTRL-ALT-DEL is pressed.
 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
 
+# Action on special keypress (ALT-UpArrow).
+#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
+
 # What to do when the power fails/returns.
-p0::powerfail:/sbin/init 0
 
 # /sbin/getty invocations for the runlevels.
 #
@@ -38,3 +45,16 @@ p0::powerfail:/sbin/init 0
 # Format:
 #  <id>:<runlevels>:<action>:<process>
 #
+# Note that on most Debian systems tty7 is used by the X Window System,
+# so if you want to add more getty's go ahead but skip tty7 if you run X.
+#
+
+# Example how to put a getty on a serial line (for a terminal)
+#
+#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
+#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
+
+# Example how to put a getty on a modem line.
+#
+#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
+p0::powerfail:/sbin/init 0
diff --git a/src/test/test-debian-010/etc/inittab.exp b/src/test/test-debian-010/etc/inittab.exp
index a8b8918..c0e7e5a 100644
--- a/src/test/test-debian-010/etc/inittab.exp
+++ b/src/test/test-debian-010/etc/inittab.exp
@@ -1,3 +1,5 @@
+# /etc/inittab: init(8) configuration.
+# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
 
 # The default runlevel.
 id:2:initdefault:
@@ -6,6 +8,9 @@ id:2:initdefault:
 # This is run first except when booting in emergency (-b) mode.
 si::sysinit:/etc/init.d/rcS
 
+# What to do in single-user mode.
+~~:S:wait:/sbin/sulogin
+
 # /etc/init.d executes the S and K scripts upon change
 # of runlevel.
 #
@@ -27,8 +32,10 @@ z6:6:respawn:/sbin/sulogin
 # What to do when CTRL-ALT-DEL is pressed.
 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
 
+# Action on special keypress (ALT-UpArrow).
+#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
+
 # What to do when the power fails/returns.
-p0::powerfail:/sbin/init 0
 
 # /sbin/getty invocations for the runlevels.
 #
@@ -38,6 +45,19 @@ p0::powerfail:/sbin/init 0
 # Format:
 #  <id>:<runlevels>:<action>:<process>
 #
+# Note that on most Debian systems tty7 is used by the X Window System,
+# so if you want to add more getty's go ahead but skip tty7 if you run X.
+#
+
+# Example how to put a getty on a serial line (for a terminal)
+#
+#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
+#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
+
+# Example how to put a getty on a modem line.
+#
+#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
+p0::powerfail:/sbin/init 0
 1:2345:respawn:/sbin/getty -L 38400 tty1
 2:23:respawn:/sbin/getty -L 38400 tty2
 3:23:respawn:/sbin/getty -L 38400 tty3
-- 
2.1.4





More information about the pve-devel mailing list