bootstrap serial console (grub, kernel args, inittab)
authorTero Marttila <terom@fixme.fi>
Mon, 30 Jan 2012 11:21:26 +0200
changeset 16 d74646c0b5dd
parent 15 e3893b949972
child 17 b120db777a60
bootstrap serial console (grub, kernel args, inittab)
pkvlm-create
preseed/files/etc/default/grub
--- a/pkvlm-create	Fri Jan 27 14:41:02 2012 +0200
+++ b/pkvlm-create	Mon Jan 30 11:21:26 2012 +0200
@@ -140,6 +140,7 @@
 define_opt  ip          
 define_opt  puppet      
 define_opt  puppet_master   puppet
+define_opt  serial_console
 
 log_info "Processing ${#@} parameters:"
 for param in "$@"; do
@@ -183,6 +184,15 @@
 DISK_PATH=/dev/mapper/${DISK_VG}-${DISK_NAME}
 GUEST_DISK_BUS=$opt_disk_bus
 
+## Serial
+# Serial console?
+# XXX: hardcoded as ttyS0
+case x"$opt_serial_console" in
+#    xtty*)  SERIAL_CONSOLE="$opt_serial_console" ;;
+    x)       SERIAL_CONSOLE=     ;;
+    x*)     SERIAL_CONSOLE="ttyS0" ;;
+esac
+
 ### Preseed content
 GUEST_DISK=$opt_guest_disk
 
@@ -239,8 +249,18 @@
 ## Misc
 PACKAGE_INCLUDES=( sudo screen vim )
 PRESEED_LATE_COMMANDS=( )
+PRESEED_LATE_COMMANDS_END=( )
 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' )
 
+function preseed_late_commands () {
+    PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" )
+}
+
+# XXX: ordering?
+function preseed_late_commands_end () {
+    PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" )
+}
+
 
 ### Extra
 ## Puppet
@@ -258,9 +278,33 @@
     PUPPET_MASTER="${opt_puppet_master}"
 
     PACKAGE_INCLUDES=( ${PACKAGE_INCLUDES[@]} ${PUPPET_PACKAGES[@]} )
-    PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "${PUPPET_COMMANDS[@]:-}" )
+
+    [ "${PUPPET_COMMANDS[@]:-}" ] && preseed_late_commands "${PUPPET_COMMANDS[@]}"
 fi
 
+## Configure GRUB, via preseed/files: /etc/default/grub 
+# Kernel commandline/grub terminal
+# The last console=... for kernel is used as /dev/console, i.e. init output
+
+if [ $SERIAL_CONSOLE ]; then
+    BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0"
+    BOOT_GRUB_TERMINAL="console serial"
+
+    # re-generate grub.cfg
+    preseed_late_commands_end "in-target update-grub"
+
+    # Configure /etc/inittab for serial console
+    preseed_late_commands "in-target sed -i 's/#T0/T0/' /etc/inittab"
+else
+    BOOT_KERNEL_CONSOLE=""
+    BOOT_GRUB_TERMINAL="console"
+fi
+
+# Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default
+BOOT_KERNEL_ARGS_DEFAULT="quiet"
+BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}"
+
+
 ### Installer setup
 ## Installation image
 # Original Debian Installer image (iso)
@@ -300,16 +344,20 @@
 PRESEED_CHECKSUM= # set later
 
 ## Configs
+
+# template source
 CONF_FILES_SOURCE='preseed/files'
+
+# template output into install tree
 CONF_FILES_TARGET_NAME='preseed-files'
 CONF_FILES_TARGET="${INSTALL_TREE}/${CONF_FILES_TARGET_NAME}"
+
+# paths within installer runtime
 CONF_FILES_CP_SRC="${PRESEED_MOUNT}/${CONF_FILES_TARGET_NAME}"
 CONF_FILES_CP_DST='/target'
 
-PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" \
-    "cp -rd -- ${CONF_FILES_CP_SRC}/* ${CONF_FILES_CP_DST}"  \
-)
-
+# copy at end of install
+preseed_late_commands "cp -rd -- ${CONF_FILES_CP_SRC}/* ${CONF_FILES_CP_DST}"
 
 # Additional files to copy
 PRESEED_INCLUDE_FILES=( $(for preseed in ${PRESEED_INCLUDES[@]}; do echo "${PRESEED_SOURCE_DIR}/${preseed}"; done) )
@@ -319,28 +367,26 @@
 PRESEED_INCLUDE=${PRESEED_INCLUDES[@]}
 
 # preseed command execution
-PRESEED_LATE_COMMAND=$(for cmd in "${PRESEED_LATE_COMMANDS[@]}"; do if [ "$cmd" ]; then echo -n "$cmd;" $'\\\n    '; fi; done; echo true)
+PRESEED_LATE_COMMAND=$(for cmd in "${PRESEED_LATE_COMMANDS[@]}" "${PRESEED_LATE_COMMANDS_END[@]:-}"; do if [ "$cmd" ]; then echo -n "$cmd;" $'\\\n    '; fi; done; echo true)
 
 
 ## Isolinux
 # Source for install tree isolinux file
 PRESEED_ISOLINUX="${PRESEED_SOURCE_DIR}/isolinux.cfg"
 
-# XXX: automagics? :)
+# Automagics for serial boot :)
 #      virt-install assumes we have an X $DISPLAY if given --vnc
 #      but we also want to enable the serial console...
 #      d-i automagically configures the serial boot/login console, but only if the installer is run under serial...
 #      we want to have both :(
-if [ $DISPLAY ]; then
+if [ ${DISPLAY:-} ]; then
     INSTALL_BOOT_CONSOLE=""
 else
     INSTALL_BOOT_CONSOLE="console=ttyS0"
 fi
 
-# installer boot args
-INSTALL_BOOT_ARGS="auto=true priority=critical preseed/file=${PRESEED_MOUNT}/${PRESEED_NAME} preseed/file/checksum=${PRESEED_CHECKSUM} -- quiet ${INSTALL_BOOT_CONSOLE}"
-
-
+# isolinux installer boot args
+INSTALL_BOOT_ARGS="auto=true priority=critical preseed/file=${PRESEED_MOUNT}/${PRESEED_NAME} preseed/file/checksum=${PRESEED_CHECKSUM} -- ${INSTALL_BOOT_CONSOLE} quiet"
 
 ### External progs
 ## Bootable .iso for Debian isolinux-based installer CDs
@@ -382,6 +428,11 @@
 
     Disk:       $GUEST_DISK
 
+Boot:
+    Serial console: $SERIAL_CONSOLE
+    Grub terminal:  $BOOT_GRUB_TERMINAL
+    Kernel args:    $BOOT_KERNEL_ARGS ($BOOT_KERNEL_ARGS_DEFAULT)
+
 Disk:
     Method:     LVM
     Size:       $DISK_SIZE
@@ -509,9 +560,9 @@
             --os-variant $GUEST_OS_VARIANT \
             --disk path=$DISK_PATH,bus=$GUEST_DISK_BUS \
             --network bridge:$NET_BRIDGE \
-            --vnc \
             --virt-type $LIBVIRT_TYPE \
             --accelerate --hvm \
+            --vnc \
             --serial pty
 fi
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/preseed/files/etc/default/grub	Mon Jan 30 11:21:26 2012 +0200
@@ -0,0 +1,31 @@
+# If you change this file, run 'update-grub' afterwards to update
+# /boot/grub/grub.cfg.
+
+GRUB_DEFAULT=0
+GRUB_TIMEOUT=5
+GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
+GRUB_CMDLINE_LINUX_DEFAULT="{BOOT_KERNEL_ARGS_DEFAULT}"
+GRUB_CMDLINE_LINUX="{BOOT_KERNEL_ARGS}"
+
+# Uncomment to enable BadRAM filtering, modify to suit your needs
+# This works with Linux (no patch required) and with any kernel that obtains
+# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
+#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
+
+# Uncomment to disable graphical terminal (grub-pc only)
+GRUB_TERMINAL="{BOOT_GRUB_TERMINAL}"
+GRUB_SERIAL_COMMAND="serial"
+
+# The resolution used on graphical terminal
+# note that you can use only modes which your graphic card supports via VBE
+# you can see them in real GRUB with the command `vbeinfo'
+#GRUB_GFXMODE=640x480
+
+# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
+#GRUB_DISABLE_LINUX_UUID=true
+
+# Uncomment to disable generation of recovery mode menu entries
+#GRUB_DISABLE_LINUX_RECOVERY="true"
+
+# Uncomment to get a beep at grub start
+#GRUB_INIT_TUNE="480 440 1"