[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and u
From: |
Robert Millan |
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 |
User-agent: |
Mutt/1.5.13 (2006-08-11) |
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 @@ address@hidden@
> # 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
> address@hidden
> 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 /.)
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), (continued)
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Martin Braure de Calignon, 2008/01/09
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Martin Braure de Calignon, 2008/01/09
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Robert Millan, 2008/01/09
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Martin Braure de Calignon, 2008/01/09
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Robert Millan, 2008/01/09
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Martin Braure de Calignon, 2008/01/09
- [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems, Robert Millan, 2008/01/09
- Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems, Robert Millan, 2008/01/10
- Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems,
Robert Millan <=
- Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems, Marco Gerards, 2008/01/15
- Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems, Robert Millan, 2008/01/15
- Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems, Marco Gerards, 2008/01/15
- Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems, Robert Millan, 2008/01/15
- Re: [PATCH] fix `lvm' and `raid' loading for grub-install/core.img and update-grub/grub.cfg problems, Jan Nieuwenhuizen, 2008/01/10
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Martin Braure de Calignon, 2008/01/09
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Robert Millan, 2008/01/09
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Jan Nieuwenhuizen, 2008/01/08
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Robert Millan, 2008/01/08
- Re: [PATCH] force load of lvm and raid before entering normal mode (Re: LVM on debian), Martin Braure de Calignon, 2008/01/08