All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: [PATCH] Allow user to choose between path or fs-label instead of UUID
Date: Tue, 18 Sep 2012 10:54:28 +0200	[thread overview]
Message-ID: <505836C4.1040103@gmail.com> (raw)
In-Reply-To: <50563BC8.3060004@catcity.dyndns.org>

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

On 16.09.2012 22:51, Pete Appleton wrote:

> 
> On 16/09/12 18:40, Vladimir 'φ-coder/phcoder' Serbinenko wrote:
>> On 16.09.2012 18:57, Pete Appleton wrote:
>>
>>> Hi all,
>>>
>>> The file attached is intended to allow a Linux user to easily specify
>>> whether GRUB2 should use the traditional device path (/dev/sda1) or the
>>> filesystem label instead of the default UUID scheme.  This functionality
>>> is currently supported by GRUB2 itself but the peripheral files
>>> (grub-mkconfig, 10-linux etc) don't directly support it, requiring the
>>> user to edit the distribution-supplied files on their installation with
>>> the potential for consequent upgrade conflicts.
>>>
>>> This patch adds support for a new environment variable
>>> GRUB_DEVICE_IDENTIFICATION taking as value one of {uuid, label, path};
>>> if not set or invalid then it defaults to uuid so that the current
>>> semantics are respected.  If set to label then the 'search' clause and
>>> root=XXX kernel parameter are written using file system label syntax as
>>> opposed to the current single behaviour of device path if
>>> GRUB_DISABLE_LINUX_UUID=true
>>
>> In this patch the same option has effect on both how device is passed to
>> kernel and how it's identified internally. These 2 parts should be kept
>> separate.
> 
> Update attached which splits the option into GRUB_DEVICE_IDENTIFICATION
> (used by 10-linux for the root FS)

This is Linux-specific then, so it has to contain "LINUX" in its name.

> and GRUB_SEARCH_METHOD, used by
> grub-mkconfig to generate the search clause.
> 
> Pete Appleton
> 
> linux_fslabel_support.patch
> 
> 
> === modified file 'docs/grub.texi'
> --- old/docs/grub.texi	2012-07-31 22:18:57 +0000
> +++ new/docs/grub.texi	2012-09-16 20:45:58 +0000
> @@ -1285,6 +1285,19 @@
>  the Linux kernel, using a @samp{root=UUID=...} kernel parameter.  This is
>  usually more reliable, but in some cases it may not be appropriate.  To
>  disable the use of UUIDs, set this option to @samp{true}.
> +@samp{GRUB_DEVICE_IDENTIFICATION} governs the scheme used instead of
> +the UUID, either the file system label or the traditional device path
> +
> +@item GRUB_DEVICE_IDENTIFICATION
> +Works in conjunction with GRUB_DISABLE_LINUX_UUID to determine how the root filesystem
> +will be identified for the Linux kernel.  The default value is @samp{uuid}, which will use UUIDs. 
> +Other alternatives are @samp{label} to use the file system label, or @samp{path} to use
> +the traditional device path (@samp{/dev/sda1})
> +
> +@item GRUB_SEARCH_METHOD
> +Governs the method used to generate the search directive (as opposed to the Linux root filesysttem)
> +using the same settings as @samp{GRUB_DEVICE_IDENTIFICATION}.  If unset or unrecognised
> +then GRUB will default to searching by UUID
>  
>  @item GRUB_DISABLE_RECOVERY
>  If this option is set to @samp{true}, disable the generation of recovery
> 
> === modified file 'util/grub-mkconfig.in'
> --- old/util/grub-mkconfig.in	2012-04-07 17:49:25 +0000
> +++ new/util/grub-mkconfig.in	2012-09-16 20:42:56 +0000
> @@ -131,10 +131,12 @@
>  # Device containing our userland.  Typically used for root= parameter.
>  GRUB_DEVICE="`${grub_probe} --target=device /`"
>  GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true
> +GRUB_DEVICE_LABEL="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2> /dev/null`" || true
>  
>  # Device containing our /boot partition.  Usually the same as GRUB_DEVICE.
>  GRUB_DEVICE_BOOT="`${grub_probe} --target=device /boot`"
>  GRUB_DEVICE_BOOT_UUID="`${grub_probe} --device ${GRUB_DEVICE_BOOT} --target=fs_uuid 2> /dev/null`" || true
> +GRUB_DEVICE_BOOT_LABEL="`${grub_probe} --device ${GRUB_DEVICE_BOOT} --target=fs_label 2> /dev/null`" || 
>

"true" was lost.
Also it doesn't seem that you use this variable anywhere.

  
>  # Filesystem for the device containing our userland.  Used for stuff like
>  # choosing Hurd filesystem module.
> @@ -170,13 +172,24 @@
>  
>  if [ "x${GRUB_ACTUAL_DEFAULT}" = "xsaved" ] ; then GRUB_ACTUAL_DEFAULT="`"${grub_editenv}" - list | sed -n '/^saved_entry=/ s,^saved_entry=,,p'`" ; fi
>  
> +# Default to UUID if GRUB_DEVICE_IDENTIFICATION is undefined or unrecognised
> +if [ "x${GRUB_DEVICE_IDENTIFICATION}" = "x" ] ; then GRUB_DEVICE_IDENTIFICATION="uuid" ; fi
> +if [ "${GRUB_DEVICE_IDENTIFICATION}" != "uuid" -a "${GRUB_DEVICE_IDENTIFICATION}" != "label" -a "${GRUB_DEVICE_IDENTIFICATION}" != "path" ] ; then
> +    GRUB_DEVICE_IDENTIFICATION="uuid"
> +fi
> +if [ "x${GRUB_SEARCH_METHOD}" = "x" ] ; then GRUB_SEARCH_METHOD="uuid" ; fi
> +if [ "${GRUB_SEARCH_METHOD}" != "uuid" -a "${GRUB_SEARCH_METHOD}" != "label" -a "${GRUB_SEARCH_METHOD}" != "path" ] ; then
> +    GRUB_SEARCH_METHOD="uuid"
> +fi
>  

case ... esac would be much more appropriate in this case.

>  # These are defined in this script, export them here so that user can
>  # override them.
>  export GRUB_DEVICE \
>    GRUB_DEVICE_UUID \
> +  GRUB_DEVICE_LABEL \
>    GRUB_DEVICE_BOOT \
>    GRUB_DEVICE_BOOT_UUID \
> +  GRUB_DEVICE_BOOT_LABEL \
>    GRUB_FS \
>    GRUB_FONT \
>    GRUB_PRELOAD_MODULES \
> @@ -216,7 +229,9 @@
>    GRUB_INIT_TUNE \
>    GRUB_SAVEDEFAULT \
>    GRUB_ENABLE_CRYPTODISK \
> -  GRUB_BADRAM
> +  GRUB_BADRAM \
> +  GRUB_DEVICE_IDENTIFICATION \
> +  GRUB_SEARCH_METHOD
>  
>  if test "x${grub_cfg}" != "x"; then
>    rm -f "${grub_cfg}.new"
> 
> === modified file 'util/grub-mkconfig_lib.in'
> --- old/util/grub-mkconfig_lib.in	2012-07-22 18:02:17 +0000
> +++ new/util/grub-mkconfig_lib.in	2012-09-16 20:43:31 +0000
> @@ -146,22 +146,30 @@
>        done
>    fi
>  
> -  # If there's a filesystem UUID that GRUB is capable of identifying, use it;
> +  # If there's a filesystem UUID or label that GRUB is capable of identifying, use it according to GRUB_SEARCH_METHOD
>    # otherwise set root as per value in device.map.
>    fs_hint="`"${grub_probe}" --device "${device}" --target=compatibility_hint`"
>    if [ "x$fs_hint" != x ]; then
>      echo "set root='$fs_hint'"
>    fi
> -  if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then
> +  if [ "x${GRUB_SEARCH_METHOD}" = "xlabel" ] && fs_label="`"${grub_probe}" --device "${device}" --target=fs_label 2> /dev/null`" ; then
>      hints="`"${grub_probe}" --device "${device}" --target=hints_string 2> /dev/null`" || hints=
>      echo "if [ x\$feature_platform_search_hint = xy ]; then"
> -    echo "  search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
> +    echo "  search --no-floppy --label --set=root ${hints} ${fs_label}"
>      echo "else"
> -    echo "  search --no-floppy --fs-uuid --set=root ${fs_uuid}"
> +    echo "  search --no-floppy --label --set=root ${fs_label}"
>      echo "fi"
> +  else
> +    if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then
> +      hints="`"${grub_probe}" --device "${device}" --target=hints_string 2> /dev/null`" || hints=
> +      echo "if [ x\$feature_platform_search_hint = xy ]; then"
> +      echo "  search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
> +      echo "else"
> +      echo "  search --no-floppy --fs-uuid --set=root ${fs_uuid}"
> +      echo "fi"
> +    fi
>    fi
>  }
> -
>  grub_get_device_id ()
>  {
>    device="$1"
> 
> === modified file 'util/grub.d/10_linux.in'
> --- old/util/grub.d/10_linux.in	2012-07-22 18:02:17 +0000
> +++ new/util/grub.d/10_linux.in	2012-09-16 16:21:41 +0000
> @@ -43,13 +43,27 @@
>    ;;
>  esac
>  
> -if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
> -    || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
> -    || uses_abstraction "${GRUB_DEVICE}" lvm; then
> -  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
> -else
> -  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
> -fi
> +case x"$GRUB_DEVICE_IDENTIFICATION" in
> +    xpath)
> +        LINUX_ROOT_DEVICE=${GRUB_DEVICE}
> +        ;;
> +    xlabel)
> +        if [ "x${GRUB_DEVICE_LABEL}" = "x" ] \
> +            || ! test -e "/dev/disk/by-label/${GRUB_DEVICE_LABEL}" \
> +            || uses_abstraction "${GRUB_DEVICE}" lvm; then
> +            LINUX_ROOT_DEVICE=${GRUB_DEVICE}
> +        else
> +            LINUX_ROOT_DEVICE=LABEL=\"${GRUB_DEVICE_LABEL}\"
> +        fi;;
> +    *)
> +        if [ "x{GRUB_DEVICE_UUID}" = "x" ] \
> +            || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
> +            || uses_abstraction "${GRUB_DEVICE}" lvm; then
> +            LINUX_ROOT_DEVICE=${GRUB_DEVICE}
> +        else
> +            LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
> +        fi;;      
> +esac
>  
>  GRUBFS="`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2>/dev/null || true`"
>  
> 
> 
> 
> 
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel



-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 294 bytes --]

  reply	other threads:[~2012-09-18  8:54 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-16 16:57 [PATCH] Allow user to choose between path or fs-label instead of UUID Pete Appleton
2012-09-16 17:40 ` Vladimir 'φ-coder/phcoder' Serbinenko
2012-09-16 20:51   ` Pete Appleton
2012-09-18  8:54     ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2012-09-18 18:26       ` Pete Appleton
2012-09-18 18:42         ` Vladimir 'φ-coder/phcoder' Serbinenko
2012-09-18 21:13           ` Pete Appleton
2012-09-18 21:22             ` Pete Appleton
  -- strict thread matches above, loose matches on Subject: below --
2014-05-15 16:23 jpacner
2014-05-27  9:38 ` jpacner

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=505836C4.1040103@gmail.com \
    --to=phcoder@gmail.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.