All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Millan <rmh@aybabtu.com>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems
Date: Thu, 10 Jan 2008 13:43:17 +0100	[thread overview]
Message-ID: <20080110124317.GA5212@thorin> (raw)
In-Reply-To: <20080109234940.GA5331@thorin>

[-- Attachment #1: Type: text/plain, Size: 261 bytes --]


New patch, a bit simpler (after giving it a though, I don't think the gained
speed is worth the extra complication)

-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call, if you are unable to speak?
(as seen on /.)

[-- Attachment #2: lvmraid.diff --]
[-- Type: text/x-diff, Size: 15138 bytes --]


	* include/grub/util/getroot.h (grub_dev_abstraction_types): New enum.
	(grub_util_get_dev_abstraction): New function prototype.

	* util/getroot.c: Include `<grub/util/getroot.h>'
	(grub_util_get_grub_dev): Move detection of abstraction type to ...
	(grub_util_get_dev_abstraction): ... here (new function).

	* util/grub-probe.c: Convert PRINT_* to an enum.  Add
	`PRINT_ABSTRACTION'.
	(probe): Probe for abstraction type when requested.
	(main): Understand `--target=abstraction'.

	* util/i386/efi/grub-install.in: Add abstraction module to core
	image when it is found to be necessary.
	* util/i386/pc/grub-install.in: Likewise.
	* util/powerpc/ieee1275/grub-install.in: Likewise.

	* util/update-grub_lib.in (font_path): Return system path without
	converting to GRUB path.
	* util/update-grub.in: Convert system path returned by font_path()
	to a GRUB path.  Use `grub-probe -t abstraction' to determine what
	abstraction module is needed for loading fonts (if any).  Export
	that as `GRUB_PRELOAD_MODULES'.
	* util/grub.d/00_header.in: Process `GRUB_PRELOAD_MODULES' (print
	insmod commands).

diff -x configure -x config.h.in -urp grub2/include/grub/util/getroot.h lvmraid/include/grub/util/getroot.h
--- grub2/include/grub/util/getroot.h	2007-07-22 01:32:25.000000000 +0200
+++ lvmraid/include/grub/util/getroot.h	2008-01-10 13:34:40.000000000 +0100
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2003, 2007  Free Software Foundation, Inc.
+ *  Copyright (C) 2003, 2007, 2008  Free Software Foundation, Inc.
  *
  *  GRUB is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -19,8 +19,15 @@
 #ifndef GRUB_UTIL_GETROOT_HEADER
 #define GRUB_UTIL_GETROOT_HEADER	1
 
+enum grub_dev_abstraction_types {
+  GRUB_DEV_ABSTRACTION_NONE,
+  GRUB_DEV_ABSTRACTION_LVM,
+  GRUB_DEV_ABSTRACTION_RAID,
+};
+
 char *grub_guess_root_device (const char *dir);
 char *grub_get_prefix (const char *dir);
+int grub_util_get_dev_abstraction (const char *os_dev);
 char *grub_util_get_grub_dev (const char *os_dev);
 
 #endif /* ! GRUB_UTIL_GETROOT_HEADER */
diff -x configure -x config.h.in -urp grub2/util/getroot.c lvmraid/util/getroot.c
--- grub2/util/getroot.c	2007-07-22 01:32:31.000000000 +0200
+++ lvmraid/util/getroot.c	2008-01-10 13:33:02.000000000 +0100
@@ -1,7 +1,7 @@
 /* getroot.c - Get root device */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002,2003,2006,2007  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2003,2006,2007,2008  Free Software Foundation, Inc.
  *
  *  GRUB is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -24,6 +24,7 @@
 
 #include <grub/util/misc.h>
 #include <grub/util/biosdisk.h>
+#include <grub/util/getroot.h>
 
 static void
 strip_extra_slashes (char *dir)
@@ -239,27 +240,42 @@ grub_guess_root_device (const char *dir)
   return os_dev;
 }
 
-char *
-grub_util_get_grub_dev (const char *os_dev)
+int
+grub_util_get_dev_abstraction (const char *os_dev)
 {
   /* Check for LVM.  */
   if (!strncmp (os_dev, "/dev/mapper/", 12))
-    {
-      char *grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
-
-      strcpy (grub_dev, os_dev+12);
-
-      return grub_dev;
-    }
+    return GRUB_DEV_ABSTRACTION_LVM;
 
   /* Check for RAID.  */
   if (!strncmp (os_dev, "/dev/md", 7))
+    return GRUB_DEV_ABSTRACTION_RAID;
+
+  /* No abstraction found.  */
+  return GRUB_DEV_ABSTRACTION_NONE;
+}
+
+char *
+grub_util_get_grub_dev (const char *os_dev)
+{
+  char *grub_dev;
+
+  switch (grub_util_get_dev_abstraction (os_dev))
     {
-      const char *p;
-      char *grub_dev = xmalloc (20);
+    case GRUB_DEV_ABSTRACTION_LVM:
+      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
+
+      strcpy (grub_dev, os_dev + 12);
+
+      break;
+
+    case GRUB_DEV_ABSTRACTION_RAID:
+      grub_dev = xmalloc (20);
 
       if (os_dev[7] == '_' && os_dev[8] == 'd')
 	{
+	  const char *p;
+
 	  /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
 	  int i;
 
@@ -297,17 +313,17 @@ grub_util_get_grub_dev (const char *os_d
 	}
       else if (os_dev[7] >= '0' && os_dev[7] <= '9')
 	{
-	  p = os_dev + 5;
-	  memcpy (grub_dev, p, 7);
+	  memcpy (grub_dev, os_dev + 5, 7);
 	  grub_dev[7] = '\0';
 	}
       else
 	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
 
+      break;
 
-      return grub_dev;
+    default:  /* GRUB_DEV_ABSTRACTION_NONE */
+      grub_dev = grub_util_biosdisk_get_grub_dev (os_dev);
     }
 
-  /* If it's not RAID or LVM, it should be a biosdisk.  */
-  return grub_util_biosdisk_get_grub_dev (os_dev);
+  return grub_dev;
 }
diff -x configure -x config.h.in -urp grub2/util/grub.d/00_header.in lvmraid/util/grub.d/00_header.in
--- grub2/util/grub.d/00_header.in	2007-07-22 01:32:31.000000000 +0200
+++ lvmraid/util/grub.d/00_header.in	2008-01-10 12:26:16.000000000 +0100
@@ -1,7 +1,7 @@
 #! /bin/sh -e
 
 # update-grub helper script.
-# Copyright (C) 2006,2007  Free Software Foundation, Inc.
+# Copyright (C) 2006,2007,2008  Free Software Foundation, Inc.
 #
 # GRUB is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -24,6 +24,12 @@ platform=@platform@
 # for convert_system_path_to_grub_path()
 . ${libdir}/grub/update-grub_lib
 
+# Do this as early as possible, since other commands might depend on it.
+# (e.g. the `font' command might need lvm or raid modules)
+for i in ${GRUB_PRELOAD_MODULES} ; do
+  echo "insmod $i"
+done
+
 if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi
 if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi
 
diff -x configure -x config.h.in -urp grub2/util/grub-probe.c lvmraid/util/grub-probe.c
--- grub2/util/grub-probe.c	2007-07-22 21:17:26.000000000 +0200
+++ lvmraid/util/grub-probe.c	2008-01-10 13:33:17.000000000 +0100
@@ -1,7 +1,7 @@
 /* grub-probe.c - probe device information for a given path */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2005,2006,2007 Free Software Foundation, Inc.
+ *  Copyright (C) 2005,2006,2007,2008 Free Software Foundation, Inc.
  *
  *  GRUB is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -39,10 +39,13 @@
 #define _GNU_SOURCE	1
 #include <getopt.h>
 
-#define PRINT_FS	0
-#define PRINT_DRIVE	1
-#define PRINT_DEVICE	2
-#define PRINT_PARTMAP	3
+enum {
+  PRINT_FS,
+  PRINT_DRIVE,
+  PRINT_DEVICE,
+  PRINT_PARTMAP,
+  PRINT_ABSTRACTION,
+};
 
 int print = PRINT_FS;
 
@@ -74,6 +77,7 @@ probe (const char *path)
 {
   char *device_name;
   char *drive_name = NULL;
+  int abstraction_type;
   grub_device_t dev;
   grub_fs_t fs;
   
@@ -87,6 +91,28 @@ probe (const char *path)
       goto end;
     }
 
+  abstraction_type = grub_util_get_dev_abstraction (device_name);
+  /* No need to check for errors; lack of abstraction is permissible.  */
+  
+  if (print == PRINT_ABSTRACTION)
+    {
+      char *abstraction_name;
+      switch (abstraction_type)
+	{
+	case GRUB_DEV_ABSTRACTION_NONE:
+	  grub_util_info ("did not find LVM/RAID in %s, assuming raw device", device_name);
+	  goto end;
+	case GRUB_DEV_ABSTRACTION_LVM:
+	  abstraction_name = "lvm";
+	  break;
+	case GRUB_DEV_ABSTRACTION_RAID:
+	  abstraction_name = "raid";
+	  break;
+	}
+      printf ("%s\n", abstraction_name);
+      goto end;
+    }
+
   drive_name = grub_util_get_grub_dev (device_name);
   if (! drive_name)
     grub_util_error ("cannot find a GRUB drive for %s.\n", device_name);
@@ -159,8 +185,8 @@ Usage: grub-probe [OPTION]... PATH\n\
 Probe device information for a given path.\n\
 \n\
   -m, --device-map=FILE     use FILE as the device map [default=%s]\n\
-  -t, --target=(fs|drive|device|partmap)\n\
-                            print filesystem module, GRUB drive, system device or partition map module [default=fs]\n\
+  -t, --target=(fs|drive|device|partmap|abstraction)\n\
+                            print filesystem module, GRUB drive, system device, partition map module or abstraction module [default=fs]\n\
   -h, --help                display this message and exit\n\
   -V, --version             print version information and exit\n\
   -v, --verbose             print verbose messages\n\
@@ -206,6 +232,8 @@ main (int argc, char *argv[])
 	      print = PRINT_DEVICE;
 	    else if (!strcmp (optarg, "partmap"))
 	      print = PRINT_PARTMAP;
+	    else if (!strcmp (optarg, "abstraction"))
+	      print = PRINT_ABSTRACTION;
 	    else
 	      usage (1);
 	    break;
diff -x configure -x config.h.in -urp grub2/util/i386/efi/grub-install.in lvmraid/util/i386/efi/grub-install.in
--- grub2/util/i386/efi/grub-install.in	2007-12-30 09:52:06.000000000 +0100
+++ lvmraid/util/i386/efi/grub-install.in	2008-01-10 12:26:16.000000000 +0100
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Install GRUB on your EFI partition.
-# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007  Free Software Foundation, Inc.
+# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008  Free Software Foundation, Inc.
 #
 # GRUB is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -190,8 +190,11 @@ fi
 # filesystem will be accessible).
 partmap_module=`$grub_probe --target=partmap --device-map=${device_map} ${grubdir} 2> /dev/null`
 
+# Device abstraction module, if any (lvm, raid).
+devabstraction_module=`$grub_probe --target=abstraction --device-map=${device_map} ${grubdir}`
+
 # _chain is often useful
-modules="$modules $fs_module $partmap_module _chain"
+modules="$modules $fs_module $partmap_module $devabstraction_module _chain"
 
 $grub_mkimage --output=${grubdir}/grub.efi $modules || exit 1
 
diff -x configure -x config.h.in -urp grub2/util/i386/pc/grub-install.in lvmraid/util/i386/pc/grub-install.in
--- grub2/util/i386/pc/grub-install.in	2007-12-30 09:52:06.000000000 +0100
+++ lvmraid/util/i386/pc/grub-install.in	2008-01-10 12:26:16.000000000 +0100
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Install GRUB on your drive.
-# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007  Free Software Foundation, Inc.
+# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008  Free Software Foundation, Inc.
 #
 # GRUB is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -223,8 +223,11 @@ fi
 # filesystem will be accessible).
 partmap_module=`$grub_probe --target=partmap --device-map=${device_map} ${grubdir} 2> /dev/null`
 
+# Device abstraction module, if any (lvm, raid).
+devabstraction_module=`$grub_probe --target=abstraction --device-map=${device_map} ${grubdir}`
+
 # _chain is often useful
-modules="$modules $fs_module $partmap_module biosdisk _chain"
+modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module _chain"
 
 $grub_mkimage --output=${grubdir}/core.img --prefix=`make_system_path_relative_to_its_root ${grubdir}` $modules || exit 1
 
diff -x configure -x config.h.in -urp grub2/util/powerpc/ieee1275/grub-install.in lvmraid/util/powerpc/ieee1275/grub-install.in
--- grub2/util/powerpc/ieee1275/grub-install.in	2007-12-30 09:52:06.000000000 +0100
+++ lvmraid/util/powerpc/ieee1275/grub-install.in	2008-01-10 12:26:16.000000000 +0100
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Install GRUB on your drive.
-# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007  Free Software Foundation, Inc.
+# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008  Free Software Foundation, Inc.
 #
 # GRUB is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -176,7 +176,10 @@ fi
 # filesystem will be accessible).
 partmap_module=`$grub_probe --target=partmap --device-map=${device_map} ${grubdir} 2> /dev/null`
 
-modules="$modules $fs_module $partmap_module"
+# Device abstraction module, if any (lvm, raid).
+devabstraction_module=`$grub_probe --target=abstraction --device-map=${device_map} ${grubdir}`
+
+modules="$modules $fs_module $partmap_module $devabstraction_module"
 
 # Now perform the installation.
 "$grub_mkimage" --output=${grubdir}/grub $modules || exit 1
diff -x configure -x config.h.in -urp grub2/util/update-grub.in lvmraid/util/update-grub.in
--- grub2/util/update-grub.in	2007-12-30 09:52:06.000000000 +0100
+++ lvmraid/util/update-grub.in	2008-01-10 12:26:16.000000000 +0100
@@ -1,7 +1,7 @@
 #! /bin/sh -e
 
 # Generate grub.cfg by inspecting /boot contents.
-# Copyright (C) 2006,2007  Free Software Foundation, Inc.
+# Copyright (C) 2006,2007,2008  Free Software Foundation, Inc.
 #
 # GRUB is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -103,7 +103,10 @@ esac
 # check for terminals that require fonts
 case ${GRUB_TERMINAL} in
   gfxterm)
-    if GRUB_FONT_PATH=`font_path` ; then : ; else
+    if path=`font_path` ; then
+      GRUB_FONT_PATH="`convert_system_path_to_grub_path ${path}`"
+      GRUB_PRELOAD_MODULES="`${GRUB_PRELOAD_MODULES} ${grub_probe} -t abstraction ${path}`"
+    else
       # fallback to console
       GRUB_TERMINAL=console
     fi
@@ -121,7 +124,7 @@ esac
 
 # These are defined in this script, export them here so that user can
 # override them.
-export GRUB_DEVICE GRUB_FS GRUB_DRIVE GRUB_DRIVE_BOOT GRUB_DRIVE_BOOT_GRUB GRUB_FONT_PATH
+export GRUB_DEVICE GRUB_FS GRUB_DRIVE GRUB_DRIVE_BOOT GRUB_DRIVE_BOOT_GRUB GRUB_FONT_PATH GRUB_PRELOAD_MODULES
 
 # These are optional, user-defined variables.
 export GRUB_DEFAULT GRUB_TIMEOUT GRUB_DISTRIBUTOR GRUB_CMDLINE_LINUX GRUB_TERMINAL GRUB_SERIAL_COMMAND
diff -x configure -x config.h.in -urp grub2/util/update-grub_lib.in lvmraid/util/update-grub_lib.in
--- grub2/util/update-grub_lib.in	2007-12-25 10:09:43.000000000 +0100
+++ lvmraid/util/update-grub_lib.in	2008-01-10 12:26:16.000000000 +0100
@@ -1,5 +1,5 @@
 # Helper library for update-grub
-# Copyright (C) 2007  Free Software Foundation, Inc.
+# Copyright (C) 2007,2008  Free Software Foundation, Inc.
 #
 # GRUB is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -93,19 +93,14 @@ convert_system_path_to_grub_path ()
 
 font_path ()
 {
-  if [ "x${GRUB_FONT_PATH}" = "x" ] ; then : ; else
-    echo "${GRUB_FONT_PATH}"
-    return 0
-  fi
-
   # Prefer system path for space reasons (/boot/grub might be a very small
   # partition in case of OpenFirmware, etc).
   for dir in ${pkgdatadir} /usr/share/grub /boot/grub ; do
     # Prefer complete fonts over incomplete ones.
     for basename in unicode unifont ascii ; do
-      if path=`convert_system_path_to_grub_path ${dir}/${basename}.pff` ; then
-        GRUB_FONT_PATH="${path}"
-        echo "${GRUB_FONT_PATH}"
+      path="${dir}/${basename}.pff"
+      if convert_system_path_to_grub_path ${path} > /dev/null ; then
+        echo "${path}"
         return 0
       fi
     done

  reply	other threads:[~2008-01-10 12:45 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-07 20:10 LVM on debian Martin Braure de Calignon
2008-01-07 22:07 ` Robert Millan
2008-01-07 22:31   ` Martin Braure de Calignon
2008-01-07 23:20     ` Luca Capello
2008-01-08  9:24     ` Robert Millan
2008-01-08 10:21       ` Martin Braure de Calignon
2008-01-08 12:10         ` debian upgrades and extracting kopt from menu.lst (Re: LVM on debian) Robert Millan
2008-01-08 12:13         ` LVM on debian Robert Millan
2008-01-08 13:00           ` Martin Braure de Calignon
2008-01-08 13:06             ` Bean
2008-01-08 13:11               ` Bean
2008-01-08 13:20                 ` Martin Braure de Calignon
2008-01-08 13:28                   ` Bean
2008-01-08 14:26                   ` Robert Millan
2008-01-08 15:01                   ` [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian) Robert Millan
2008-01-08 15:21                     ` Robert Millan
2008-01-08 16:06                       ` Martin Braure de Calignon
2008-01-08 21:05                       ` Jan Nieuwenhuizen
2008-01-08 21:44                         ` Robert Millan
2008-01-08 22:18                           ` Jan Nieuwenhuizen
2008-01-08 23:33                             ` Robert Millan
2008-01-09  9:08                               ` Jan Nieuwenhuizen
2008-01-09 10:35                                 ` Robert Millan
2008-01-09 10:53                                   ` Jan Nieuwenhuizen
2008-01-09 11:48                                     ` Robert Millan
2008-01-09 13:07                                       ` Jan Nieuwenhuizen
2008-01-09 14:29                                         ` Robert Millan
2008-01-08 22:52                           ` Martin Braure de Calignon
2008-01-08 23:35                             ` Robert Millan
2008-01-08 21:55                         ` Robert Millan
2008-01-09  9:00                           ` Jan Nieuwenhuizen
2008-01-09 11:41                             ` Robert Millan
2008-01-09 13:36                               ` Jan Nieuwenhuizen
2008-01-09 14:32                                 ` Robert Millan
2008-01-09 13:40                               ` Martin Braure de Calignon
2008-01-09 13:50                                 ` Martin Braure de Calignon
2008-01-09 14:34                                   ` Robert Millan
2008-01-09 14:55                                     ` Martin Braure de Calignon
2008-01-09 15:36                                       ` Robert Millan
2008-01-09 16:27                                         ` Martin Braure de Calignon
2008-01-09 23:49                                           ` [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems Robert Millan
2008-01-10 12:43                                             ` Robert Millan [this message]
2008-01-12 15:10                                               ` Robert Millan
2008-01-15 11:23                                               ` Marco Gerards
2008-01-15 11:56                                                 ` Robert Millan
2008-01-15 12:17                                                   ` Marco Gerards
2008-01-15 12:27                                                     ` Robert Millan
2008-01-10 13:24                                             ` Jan Nieuwenhuizen
2008-01-09 13:56                               ` [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian) Martin Braure de Calignon
2008-01-09 14:34                                 ` Robert Millan
2008-01-08 15:25                     ` Jan Nieuwenhuizen
2008-01-08 15:39                       ` Robert Millan
2008-01-08 16:07                     ` Martin Braure de Calignon
2008-01-08 20:53                       ` Robert Millan
2008-01-08 13:14               ` LVM on debian Robert Millan
2008-01-08 13:18                 ` Bean
2008-01-08 14:27                   ` Robert Millan
2008-01-15 12:18                     ` Marco Gerards
2008-01-08 13:13             ` Robert Millan
2008-01-08 14:01               ` Martin Braure de Calignon
2008-01-08 14:21                 ` Martin Braure de Calignon
2008-01-08 14:29                 ` Robert Millan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080110124317.GA5212@thorin \
    --to=rmh@aybabtu.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.