On Sun, Jul 22, 2007 at 10:25:05PM +0200, Robert Millan wrote:
>
> AFAIK we can only read the full OF path from /proc (with helper tools like
> ofpath / ofpathname), but not the short alias which grub uses. These can only
> be obtained when grub is running.
>
> If the proposed solution is not good, maybe we could instead remap all disks
> to "standard" grub device names (hd0, hd1..), which grub-mkdevicemap already
> knows how to guess reasonably well.
Ok, I think I finally managed to make it work the way you wanted. Please see
attached patch.
You will also need alias.diff for ofpathname (I've sent it to the author
already).
--
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 /.)
2007-08-12 Robert Millan <[EMAIL PROTECTED]>
* util/i386/get_disk_name.c: New. Implement grub_util_get_disk_name()
to tell grub-mkdevicemap how to name devices.
* util/ieee1275/get_disk_name.c: Likewise (using "ofpathname -a"
feature).
* conf/i386-efi.rmk (grub_mkdevicemap_SOURCES): Add
util/i386/get_disk_name.c.
* conf/i386-pc.rmk (grub_mkdevicemap_SOURCES): Likewise.
* conf/powerpc-ieee1275.rmk (grub_mkdevicemap_SOURCES): Add
util/ieee1275/get_disk_name.c.
* include/grub/util/misc.h: grub_util_get_disk_name() declaration.
* DISTLIST: Add util/i386/get_disk_name.c and
util/ieee1275/get_disk_name.c.
* util/grub-mkdevicemap.c: Replace device naming logic with
grub_util_get_disk_name() calls.
diff -Nur grub2/conf/i386-efi.rmk grub2.mkdevicemap/conf/i386-efi.rmk
--- grub2/conf/i386-efi.rmk 2007-08-02 22:42:19.000000000 +0200
+++ grub2.mkdevicemap/conf/i386-efi.rmk 2007-08-12 15:26:42.000000000 +0200
@@ -24,7 +24,8 @@
# kern/fs.c kern/env.c fs/fshelp.c
# For grub-mkdevicemap.
-grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c
+grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c \
+ util/i386/get_disk_name.c
# For grub-probe.
grub_probe_DEPENDENCIES = grub_probe_init.h
diff -Nur grub2/conf/i386-pc.rmk grub2.mkdevicemap/conf/i386-pc.rmk
--- grub2/conf/i386-pc.rmk 2007-08-02 22:42:19.000000000 +0200
+++ grub2.mkdevicemap/conf/i386-pc.rmk 2007-08-12 15:26:42.000000000 +0200
@@ -72,7 +72,8 @@
util/raid.c util/lvm.c grub_setup_init.c
# For grub-mkdevicemap.
-grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c
+grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c \
+ util/i386/get_disk_name.c
# For grub-probe.
grub_probe_DEPENDENCIES = grub_probe_init.h
diff -Nur grub2/conf/powerpc-ieee1275.rmk grub2.mkdevicemap/conf/powerpc-ieee1275.rmk
--- grub2/conf/powerpc-ieee1275.rmk 2007-08-02 22:42:19.000000000 +0200
+++ grub2.mkdevicemap/conf/powerpc-ieee1275.rmk 2007-08-12 15:26:42.000000000 +0200
@@ -36,7 +36,8 @@
util/resolve.c
# For grub-mkdevicemap.
-grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c
+grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c \
+ util/ieee1275/get_disk_name.c
# For grub-probe.
grub_probe_DEPENDENCIES = grub_probe_init.h
diff -Nur grub2/include/grub/util/misc.h grub2.mkdevicemap/include/grub/util/misc.h
--- grub2/include/grub/util/misc.h 2007-07-22 01:32:25.000000000 +0200
+++ grub2.mkdevicemap/include/grub/util/misc.h 2007-08-12 15:26:42.000000000 +0200
@@ -53,5 +53,6 @@
void grub_util_write_image (const char *img, size_t size, FILE *out);
void grub_util_write_image_at (const void *img, size_t size, off_t offset,
FILE *out);
+char *grub_util_get_disk_name (int disk, char *name);
#endif /* ! GRUB_UTIL_MISC_HEADER */
diff -Nur grub2/util/grub-mkdevicemap.c grub2.mkdevicemap/util/grub-mkdevicemap.c
--- grub2/util/grub-mkdevicemap.c 2007-07-22 01:32:31.000000000 +0200
+++ grub2.mkdevicemap/util/grub-mkdevicemap.c 2007-08-12 15:26:42.000000000 +0200
@@ -402,8 +402,11 @@
if (realpath (discn, name))
{
+ char *p;
strcat (name, "/disc");
- fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
+ p = grub_util_get_disk_name (num_hd, name);
+ fprintf (fp, "(%s)\t%s\n", p, name);
+ free (p);
}
num_hd++;
@@ -421,7 +424,10 @@
get_ide_disk_name (name, i);
if (check_device (name))
{
- fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
+ char *p;
+ p = grub_util_get_disk_name (num_hd, name);
+ fprintf (fp, "(%s)\t%s\n", p, name);
+ free (p);
num_hd++;
}
}
@@ -435,7 +441,10 @@
get_ataraid_disk_name (name, i);
if (check_device (name))
{
- fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
+ char *p;
+ p = grub_util_get_disk_name (num_hd, name);
+ fprintf (fp, "(%s)\t%s\n", p, name);
+ free (p);
num_hd++;
}
}
@@ -449,7 +458,10 @@
get_scsi_disk_name (name, i);
if (check_device (name))
{
- fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
+ char *p;
+ p = grub_util_get_disk_name (num_hd, name);
+ fprintf (fp, "(%s)\t%s\n", p, name);
+ free (p);
num_hd++;
}
}
@@ -472,7 +484,10 @@
get_dac960_disk_name (name, controller, drive);
if (check_device (name))
{
- fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
+ char *p;
+ p = grub_util_get_disk_name (num_hd, name);
+ fprintf (fp, "(%s)\t%s\n", p, name);
+ free (p);
num_hd++;
}
}
@@ -490,7 +505,10 @@
get_i2o_disk_name (name, unit);
if (check_device (name))
{
- fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
+ char *p;
+ p = grub_util_get_disk_name (num_hd, name);
+ fprintf (fp, "(%s)\t%s\n", p, name);
+ free (p);
num_hd++;
}
}
diff -Nur grub2/util/i386/get_disk_name.c grub2.mkdevicemap/util/i386/get_disk_name.c
--- grub2/util/i386/get_disk_name.c 1970-01-01 01:00:00.000000000 +0100
+++ grub2.mkdevicemap/util/i386/get_disk_name.c 2007-08-12 15:26:42.000000000 +0200
@@ -0,0 +1,31 @@
+/* get_disk_name.c */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2007 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/util/misc.h>
+
+char *
+grub_util_get_disk_name (int disk, char *name)
+{
+ char *p;
+
+ p = xmalloc (16);
+ sprintf (p, "hd%d", disk);
+
+ return p;
+}
diff -Nur grub2/util/ieee1275/get_disk_name.c grub2.mkdevicemap/util/ieee1275/get_disk_name.c
--- grub2/util/ieee1275/get_disk_name.c 1970-01-01 01:00:00.000000000 +0100
+++ grub2.mkdevicemap/util/ieee1275/get_disk_name.c 2007-08-12 16:16:56.000000000 +0200
@@ -0,0 +1,60 @@
+/* get_disk_name.c */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2007 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <grub/util/misc.h>
+
+char *
+grub_util_get_disk_name (int disk, char *name)
+{
+ int p[2];
+
+ char *line = NULL;
+ int zero = 0;
+ int len;
+
+ pipe (p);
+
+ switch (fork ())
+ {
+ case -1:
+ perror ("fork");
+ exit (1);
+ case 0:
+ close (1);
+ dup (p[1]);
+ close (p[0]);
+ close (p[1]);
+ execlp ("ofpathname", "ofpathname", "-a", name, NULL);
+ perror ("execlp");
+ default:
+ close (0);
+ dup (p[0]);
+ close (p[0]);
+ close (p[1]);
+ }
+
+ len = getline (&line, &zero, stdin);
+ if (len < 2)
+ grub_util_error ("ofpathname didn't print a meaningful alias name");
+
+ line[len - 1] = '\0';
+
+ return line;
+}
--- grub2/DISTLIST 2007-08-02 22:42:19.000000000 +0200
+++ grub2.mkdevicemap/DISTLIST 2007-08-12 16:33:22.000000000 +0200
@@ -285,11 +285,13 @@
util/grub.d/README
util/i386/efi/grub-install.in
util/i386/efi/grub-mkimage.c
+util/i386/get_disk_name.c
util/i386/pc/grub-install.in
util/i386/pc/grub-mkimage.c
util/i386/pc/grub-setup.c
util/i386/pc/misc.c
util/i386/pc/grub-mkrescue.in
+util/ieee1275/get_disk_name.c
util/powerpc/ieee1275/grub-install.in
util/powerpc/ieee1275/grub-mkimage.c
util/powerpc/ieee1275/misc.c
--- ofpathname.orig 2007-07-17 16:10:47.000000000 +0200
+++ ofpathname 2007-08-12 13:00:21.000000000 +0200
@@ -27,6 +33,7 @@
echo "Optional arguments."
echo " -l Convert Open Firmware device pathname to"
echo " logical device name."
+ echo " -a Find matching Open Firmware device alias[es]."
echo " -q, --quiet do not report failures, exit quietly"
echo " -V, --version display version information and exit"
echo " -h, --help display this help information and exit"
@@ -226,7 +234,16 @@
OF_PATH=$OFPATH:1\\ppc\\bootinfo.txt
fi
- echo $OF_PATH
+ if [[ $do_alias = "0" ]]; then
+ echo $OF_PATH
+ else
+ (shopt -s nullglob
+ for i in /proc/device-tree/aliases/* ; do
+ if sed -e "s/\x00$//g" $i | grep -qx "$OF_PATH" ; then
+ basename $i
+ fi
+ done)
+ fi
}
#
@@ -613,10 +638,14 @@
# default: convert logical => OFpath
do_of2l=0
+# default: do not alias-ize
+do_alias=0
getopt -o "l:Vqh" -l "help,version,quiet" $@ > /dev/null 2>&1
while [[ -n $1 ]]; do
case "$1" in
+ -a) do_alias=1 ;;
+
-l) do_of2l=1
DEVNAME_ARG=$2
shift ;;
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel