update-grub2

Robert Millan rmh at aybabtu.com
Sun Oct 15 12:18:42 CEST 2006


Hi there,

This is my proposal for a new dessign in update-grub.  As you might know,
update-grub is a script used in Debian to generate GRUB config file.  Over time,
we've found that the monolithic dessign of that script made it difficult to
maintain and extend, and it ultimately has become bloated.  I'm redessigning it
to be simple, modular and easily extensible.

With this work, we solve another problem: the copyright for original update-grub
was held by several people and it was too difficult to attain the paperwork FSF
projects require for submitting the script to you.

The script I'm attaching is mostly meant as proof of concept to show the
proposed framework for generating the config file and allowing third-party apps
(memtest86, etc) to hook their stuff in.

Please send me your feedback and tell wether you like it.  I think it'd be very
good if a unified solution for this were provided from GRUB upstream, instead of
each distributor cooking up their own.

-- 
Robert Millan

My spam trap is honeypot at aybabtu.com.  Note: this address is only intended for
spam harvesters.  Writing to it will get you added to my black list.
-------------- next part --------------
diff -Nur empty/update-grub update-grub/update-grub
--- empty/update-grub	1970-01-01 01:00:00.000000000 +0100
+++ update-grub/update-grub	2006-10-15 00:49:37.000000000 +0200
@@ -0,0 +1,77 @@
+#! /bin/bash -e
+
+# Generate grub.cfg by inspecting /boot contents.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St - Suite 330, Boston, MA 02110, USA.
+
+grub_prefix=/boot/grub
+grub_cfg=${grub_prefix}/grub.cfg
+update_grub_dir=/etc/update-grub.d
+test_mode=false
+
+if [ "$UID" != 0 ] ; then
+  echo "$0: You must run this as root"
+  exit 1
+fi
+
+if [ "$1" == "-y" ] ; then
+  echo "$0: warning: Ignoring -y option (no longer needed)."
+fi
+
+if ! test -d ${update_grub_dir} && test -d ./update-grub.d ; then
+  update_grub_dir=./update-grub.d
+  test_mode=true
+fi
+
+if ! which grub-probe > /dev/null ; then
+  echo "$0: grub-probe not found in PATH."
+  exit 1
+fi
+
+if ! ${test_mode} ; then
+  exec > ${grub_cfg}.new
+fi
+
+cat << EOF
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automaticaly generated by $0 using templates from ${update_grub_dir}
+#
+EOF
+
+export GRUB_DEVICE="`grub-probe --target=device ${grub_prefix}`"
+export GRUB_DRIVE="`grub-probe --target=drive ${grub_prefix}`"
+export GRUB_FS="`grub-probe --target=fs ${grub_prefix}`"
+
+shopt -s nullglob ; for i in ${update_grub_dir}/* ; do
+  case $i in
+    # emacsen backup files. FIXME: support other editors
+    *~) ;;
+    *)
+      if test -x $i ; then
+        echo -e "\n### BEGIN $i ###"
+        $i
+        echo "### END $i ###"
+      fi
+    ;;
+  esac
+done
+
+# none of the children aborted with error, install the new grub.cfg
+if ! ${test_mode} ; then
+  exec mv ${grub_cfg}{.new,}
+fi
diff -Nur empty/update-grub.d/00_header update-grub/update-grub.d/00_header
--- empty/update-grub.d/00_header	1970-01-01 01:00:00.000000000 +0100
+++ update-grub/update-grub.d/00_header	2006-10-15 11:42:32.000000000 +0200
@@ -0,0 +1,28 @@
+#! /bin/bash -e
+
+# update-grub helper script.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St - Suite 330, Boston, MA 02110, USA.
+
+
+if [ -z "${GRUB_DEFAULT}" ] ; then GRUB_DEFAULT=0 ; fi
+if [ -z "${GRUB_TIMEOUT}" ] ; then GRUB_TIMEOUT=5 ; fi
+
+cat << EOF
+set default=${GRUB_DEFAULT}
+set timeout=${GRUB_TIMEOUT}
+set root=${GRUB_DRIVE}
+EOF
diff -Nur empty/update-grub.d/10_hurd update-grub/update-grub.d/10_hurd
--- empty/update-grub.d/10_hurd	1970-01-01 01:00:00.000000000 +0100
+++ update-grub/update-grub.d/10_hurd	2006-10-15 11:42:21.000000000 +0200
@@ -0,0 +1,65 @@
+#! /bin/bash -e
+
+# update-grub helper script.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St - Suite 330, Boston, MA 02110, USA.
+
+# FIXME: add l4 here?
+kernel=
+for i in /boot/gnumach{.gz,} ; do
+  if test -e $i ; then
+    kernel=$i
+  fi
+done
+
+# FIXME: This works for ext2.  For other filesystems we might need special-casing
+case "${GRUB_FS}" in
+  *fs)	hurd_fs="${GRUB_FS}" ;;
+  *)	hurd_fs="${GRUB_FS}fs" ;;
+esac
+
+at_least_one=false
+all_of_them=true
+for i in "${kernel}" /hurd/${hurd_fs}.static /hurd/exec ; do
+  if test -e "$i" ; then
+    at_least_one=true
+  else
+    all_of_them=false
+  fi
+done
+
+if ! ${at_least_one} ; then
+  # no hurd here, aborting
+  exit 0
+fi
+
+if ! ${all_of_them} || ! test -e /lib/ld.so.1 ; then
+  echo "Some Hurd stuff found, but not enough to boot."
+  exit 1
+fi
+
+cat << EOF
+menuentry "GNU" {
+	multiboot ${kernel} root=device:${GRUB_DEVICE}
+	module /hurd/${hurd_fs}.static --readonly \\
+			--multiboot-command-line='\${kernel-command-line}' \\
+			--host-priv-port='\${host-port}' \\
+			--device-master-port='\${device-port}' \\
+			--exec-server-task='\${exec-task}' -T typed '\${root}' \\
+			'\$(task-create)' '\$(task-resume)'
+	module /lib/ld.so.1 /hurd/exec '\$(exec-task=task-create)'
+}
+EOF
diff -Nur empty/update-grub.d/10_linux update-grub/update-grub.d/10_linux
--- empty/update-grub.d/10_linux	1970-01-01 01:00:00.000000000 +0100
+++ update-grub/update-grub.d/10_linux	2006-10-15 11:42:25.000000000 +0200
@@ -0,0 +1,36 @@
+#! /bin/bash -e
+
+# update-grub helper script.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St - Suite 330, Boston, MA 02110, USA.
+
+shopt -s nullglob
+
+for linux in /{boot/,}vmlinuz-* ; do
+  version=`echo $linux | sed -e "s,.*/[^0-9]*-,,g"`
+  basedir=`echo $linux | sed -e "s,/[^/]*$,,g"`
+  cat << EOF
+menuentry "GNU/Linux, linux ${version}" {
+	linux	${linux} root=${GRUB_DEVICE} ro 
+EOF
+  if test -e /boot/initrd.img-${version} ; then cat << EOF
+	initrd	${dir}/initrd.img-${version}
+EOF
+  fi
+  cat << EOF
+}
+EOF
+done
diff -Nur empty/update-grub.d/README update-grub/update-grub.d/README
--- empty/update-grub.d/README	1970-01-01 01:00:00.000000000 +0100
+++ update-grub/update-grub.d/README	2006-10-15 01:09:12.000000000 +0200
@@ -0,0 +1,11 @@
+
+All executable files in this directory are processed in shell expansion order.
+
+  00_*: Reserved for 00_header.
+  10_*: Native boot entries.
+  20_*: Third party apps (e.g. memtest86).
+
+The number namespace in-between is configurable by system installer and/or
+administrator.  For example, you can add an entry to boot another OS as
+01_otheros, 11_otheros, etc, depending on the position you want it to occupy in
+the menu; and then adjust the default setting by editting 00_header.


More information about the Pkg-grub-devel mailing list