grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
From: Pete Appleton <grub-devl-pma@catcity.dyndns.org>
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 19:26:31 +0100	[thread overview]
Message-ID: <5058BCD7.60109@catcity.dyndns.org> (raw)
In-Reply-To: <505836C4.1040103@gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 9662 bytes --]


On 18/09/12 09:54, Vladimir '?-coder/phcoder' Serbinenko wrote:
> 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
>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel

Attached version addresses these issues:

     GRUB_DEVICE_IDENTIFICATION renamed to LINUX_DEVICE_IDENTIFICATION
     GRUB_DEVICE_LABEL renamed to LINUX_DEVICE_LABEL as also Linux specific
     GRUB_DEVICE_BOOT_LABEL removed completely as unused (was added 
purely for symmetry)
     if statements replaced by case

Pete Appleton


[-- Attachment #1.2: Type: text/html, Size: 11044 bytes --]

[-- Attachment #2: linux_fslabel_support.patch --]
[-- Type: text/x-patch, Size: 5871 bytes --]

=== modified file 'docs/grub.texi'
--- old/docs/grub.texi	2012-07-31 22:18:57 +0000
+++ new/docs/grub.texi	2012-09-18 18:16:25 +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{LINUX_DEVICE_IDENTIFICATION} governs the scheme used instead of
+the UUID, either the file system label or the traditional device path
+
+@item LINUX_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{LINUX_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-18 18:13:12 +0000
@@ -131,6 +131,7 @@
 # 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
+LINUX_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`"
@@ -170,11 +171,19 @@
 
 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 LINUX_DEVICE_IDENTIFICATION is undefined or unrecognised
+case "x${LINUX_DEVICE_IDENTIFICATION}" in
+    xuuid) ;;
+    xlabel) ;;
+    xpath)) ;;
+    *) LINUX_DEVICE_IDENTIFCATION = uuid ;;
+esac
 
 # These are defined in this script, export them here so that user can
 # override them.
 export GRUB_DEVICE \
   GRUB_DEVICE_UUID \
+  LINUX_DEVICE_LABEL \
   GRUB_DEVICE_BOOT \
   GRUB_DEVICE_BOOT_UUID \
   GRUB_FS \
@@ -216,7 +225,9 @@
   GRUB_INIT_TUNE \
   GRUB_SAVEDEFAULT \
   GRUB_ENABLE_CRYPTODISK \
-  GRUB_BADRAM
+  GRUB_BADRAM \
+  LINUX_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-18 18:15:21 +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-18 18:14:58 +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"$LINUX_DEVICE_IDENTIFICATION" in
+    xpath)
+        LINUX_ROOT_DEVICE=${GRUB_DEVICE}
+        ;;
+    xlabel)
+        if [ "x${LINUX_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=\"${LINUX_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`"
 


  reply	other threads:[~2012-09-18 18:29 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
2012-09-18 18:26       ` Pete Appleton [this message]
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=5058BCD7.60109@catcity.dyndns.org \
    --to=grub-devl-pma@catcity.dyndns.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).