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: Sat, 12 Jan 2008 16:10:47 +0100 [thread overview]
Message-ID: <20080112151047.GB412@thorin> (raw)
In-Reply-To: <20080110124317.GA5212@thorin>
Committed.
On Thu, Jan 10, 2008 at 01:43:17PM +0100, Robert Millan wrote:
>
> 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 /.)
>
> * 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
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
--
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 /.)
next prev parent reply other threads:[~2008-01-12 15:15 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
2008-01-12 15:10 ` Robert Millan [this message]
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=20080112151047.GB412@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.