Skip to contentSkip to conversation

Reimplement 10_freebsd.in using 10_linux.in

PATCH In review Robert Millan 2 participants 5 messages Aug 7, 2009 – Aug 19, 2009

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Reimplement 10_freebsd.in using 10_linux.in

This patch reimplements 10_freebsd.in using 10_linux.in as a base, with the kFreeBSD-specific parts of 10_freebsd.in.

The new version brings in support for multiple kernel versions (the reason for the rewrite) and also handling of acpi.ko.

It is diffed against 10_linux.in, since the old code structure is no longer used.

Signature · 5 lines
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."
grub.d/10_freebsd.in renamed from grub.d/10_linux.in +45 -48
@@ -21,82 +21,79 @@
 libdir=@libdir@
 . ${libdir}/grub/grub-mkconfig_lib
 
-if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
-  OS=GNU/Linux
-else
-  OS="${GRUB_DISTRIBUTOR} GNU/Linux"
-fi
-
-# loop-AES arranges things so that /dev/loop/X can be our root device, but
-# the initrds that Linux uses don't like that.
-case ${GRUB_DEVICE} in
-  /dev/loop/*|/dev/loop[0-9])
-    GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
-  ;;
+case "${GRUB_DISTRIBUTOR}" in
+  Debian)	OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD" ;;
+  *)		OS="FreeBSD" ;;
 esac
 
-if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
-    || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" ; then
-  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
-else
-  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
-fi
-
-linux_entry ()
+kfreebsd_entry ()
 {
   cat << EOF
 menuentry "$1" {
 EOF
   prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/"
   cat << EOF
-	linux	${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro $2
+	freebsd			${rel_dirname}/${basename}
+EOF
+
+  if test -n "${devices}" ; then
+    cat << EOF
+	freebsd_loadenv		${devices_rel_dirname}/${devices_basename}
 EOF
-  if test -n "${initrd}" ; then
+  fi
+
+  if test -n "${acpi_ko}" ; then
     cat << EOF
-	initrd	${rel_dirname}/${initrd}
+	freebsd_module_elf	${acpi_ko_rel_dirname}/${acpi_ko_basename}
 EOF
   fi
+
   cat << EOF
+	set FreeBSD.vfs.root.mountfrom=${kfreebsd_fs}:${GRUB_DEVICE}
+	set FreeBSD.vfs.root.mountfrom.options=rw
 }
 EOF
 }
 
-list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do
+list=`for i in /boot/kfreebsd-* /boot/kernel/kernel ; do
         if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
       done`
 
 while [ "x$list" != "x" ] ; do
-  linux=`version_find_latest $list`
-  echo "Found linux image: $linux" >&2
-  basename=`basename $linux`
-  dirname=`dirname $linux`
+  kfreebsd=`version_find_latest $list`
+  echo "Found kernel of FreeBSD: $kfreebsd" >&2
+  basename=`basename $kfreebsd`
+  dirname=`dirname $kfreebsd`
   rel_dirname=`make_system_path_relative_to_its_root $dirname`
-  version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
+
+  if [ x"$devices" != "x" ] ; then
+    devices_basename=`basename $devices`
+    devices_dirname=`dirname $devices`
+    devices_rel_dirname=`make_system_path_relative_to_its_root $devices_dirname`
+  fi
+
+  # For "ufs" it's the same.  Do we care about the others?
+  kfreebsd_fs=${GRUB_FS}
+
+  version=`echo $basename | sed -e "s,^[^0-9]*-,,g;s/\.gz$//g"`
   alt_version=`echo $version | sed -e "s,\.old$,,g"`
-  linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
 
-  initrd=
-  for i in "initrd.img-${version}" "initrd-${version}.img" \
-	   "initrd-${version}" "initrd.img-${alt_version}" \
-	   "initrd-${alt_version}.img" "initrd-${alt_version}"; do
-    if test -e "${dirname}/${i}" ; then
-      initrd="$i"
+  acpi_ko=
+  for i in "/lib/modules/${version}/acpi.ko" "/lib/modules/${alt_version}/acpi.ko" \
+      "/boot/kernel/acpi.ko"; do
+    if test -e "$i" ; then
+      acpi_ko="$i"
       break
     fi
   done
-  if test -n "${initrd}" ; then
-    echo "Found initrd image: ${dirname}/${initrd}" >&2
-  else
-    # "UUID=" magic is parsed by initrds.  Since there's no initrd, it can't work here.
-    linux_root_device_thisversion=${GRUB_DEVICE}
+  if test -n "${acpi_ko}" ; then
+    echo "Found ACPI module: ${acpi_ko}" >&2
+    acpi_ko_basename=`basename ${acpi_ko}`
+    acpi_ko_dirname=`dirname ${acpi_ko}`
+    acpi_ko_rel_dirname=`make_system_path_relative_to_its_root $acpi_ko_dirname`
   fi
 
-  linux_entry "${OS}, Linux ${version}" \
-      "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
-  if [ "x${GRUB_DISABLE_LINUX_RECOVERY}" != "xtrue" ]; then
-    linux_entry "${OS}, Linux ${version} (recovery mode)" \
-	"single ${GRUB_CMDLINE_LINUX}"
-  fi
+  kfreebsd_entry "${OS}, kFreeBSD ${version}"
 
-  list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
+  list=`echo $list | tr ' ' '\n' | grep -vx $kfreebsd | tr '\n' ' '`
 done
#1 lore raw
Quoted 9 lines · Robert Millan

This patch reimplements 10_freebsd.in using 10_linux.in as a base, with the kFreeBSD-specific parts of 10_freebsd.in.

The new version brings in support for multiple kernel versions (the reason for the rewrite) and also handling of acpi.ko.

It is diffed against 10_linux.in, since the old code structure is no longer used.

As discussed on IRC this patch has problems on FreeBSD. Among them
1) stat and readlink are different. Does anyone have an idea how to make scripts always use right syntax?
2) "FreeBSD, kFreeBSD ..." isn't what FreeBSD user expects.
3) Version isn't detected correctly.
4) Doesn't use UUID
5) device.hints are forgotten
6) Doesn't support ZFS
Attached patch fixes 1 (breaking linux), 2,4 and 5
1,3 and 6 remain

Quoted 14 lines

--
Robert Millan

 The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and how) you may access your data; but nobody's threatening your freedom: we still allow you to remove your data and not access it at all."

_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel

Signature · 4 lines
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
util/grub-mkconfig_lib.in +4 -4
index 3585a68..cc6065f 100644
@@ -39,7 +39,7 @@ make_system_path_relative_to_its_root ()
   fi
 
   # canonicalize
-  if path=`readlink -f $path` ; then : ; else
+  if path=`realpath $path` ; then : ; else
     return 1
   fi
 
@@ -50,12 +50,12 @@ make_system_path_relative_to_its_root ()
     dir=`echo $path | sed -e "s,/[^/]*$,,g"`
   fi
 
-  num=`stat -c %d $dir`
+  num=`stat -f %d $dir`
 
   # this loop sets $dir to the root directory of the filesystem we're inspecting
   while : ; do
-    parent=`readlink -f $dir/..`
-    if [ "x`stat -c %d $parent`" = "x$num" ] ; then : ; else
+    parent=`realpath $dir/..`
+    if [ "x`stat -f %d $parent`" = "x$num" ] ; then : ; else
       # $parent is another filesystem; we found it.
       break
     fi
util/grub.d/10_freebsd.in +5 -4
index 891a20f..ce0a9a1 100644
@@ -22,7 +22,7 @@ libdir=@libdir@
 . ${libdir}/grub/grub-mkconfig_lib
 
 case "${GRUB_DISTRIBUTOR}" in
-  Debian)	OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD" ;;
+  Debian)	OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD, kFreeBSD " ;;
   *)		OS="FreeBSD" ;;
 esac
 
@@ -49,7 +49,7 @@ EOF
   fi
 
   cat << EOF
-	set FreeBSD.vfs.root.mountfrom=${kfreebsd_fs}:${GRUB_DEVICE}
+	set FreeBSD.vfs.root.mountfrom=${kfreebsd_fs}:${kfreebsd_fs}id/${GRUB_DEVICE_UUID}
 	set FreeBSD.vfs.root.mountfrom.options=rw
 }
 EOF
@@ -66,7 +66,8 @@ while [ "x$list" != "x" ] ; do
   dirname=`dirname $kfreebsd`
   rel_dirname=`make_system_path_relative_to_its_root $dirname`
 
-  if [ x"$devices" != "x" ] ; then
+  if [ -f /boot/device.hints ] ; then
+    devices=/boot/device.hints
     devices_basename=`basename $devices`
     devices_dirname=`dirname $devices`
     devices_rel_dirname=`make_system_path_relative_to_its_root $devices_dirname`
@@ -93,7 +94,7 @@ while [ "x$list" != "x" ] ; do
     acpi_ko_rel_dirname=`make_system_path_relative_to_its_root $acpi_ko_dirname`
   fi
 
-  kfreebsd_entry "${OS}, kFreeBSD ${version}"
+  kfreebsd_entry "${OS} ${version}"
 
   list=`echo $list | tr ' ' '\n' | grep -vx $kfreebsd | tr '\n' ' '`
 done
#2 lore raw
Quoted 4 lines · Vladimir 'phcoder' Serbinenko

As discussed on IRC this patch has problems on FreeBSD. Among them
1) stat and readlink are different. Does anyone have an idea how to make scripts always use right syntax?

AFAIK a custom autoconf snippet is the only way. Do you know how to reliably identify GNU-incompatible readlink? I'm not sure what "readlink -f /" will do on FreeBSD.

util/grub-mkconfig_lib.in make_system_path_relative_to_its_root () · line 42

Quoted 2 lines
util/grub-mkconfig_lib.in +1 -1
-  if path=`readlink -f $path` ; then : ; else
+  if path=`realpath $path` ; then : ; else

Note that this introduces an external dependency on GNU systems (readlink is part of coreutils), which better be avoided (specially since the version of realpath commonly used there has a problematic license).

Quoted 1 line

2) "FreeBSD, kFreeBSD ..." isn't what FreeBSD user expects.

Ok.

Quoted 1 line

3) Version isn't detected correctly.

Since this part is not in your patch, can you explain the problem?

Quoted 1 line

5) device.hints are forgotten

Ok.

Quoted 2 lines

4) Doesn't use UUID
6) Doesn't support ZFS

These two are in the previous version too, so I'd fix/merge them separately (increasing commit granularity is a good thing).

Signature · 5 lines
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."
#3 lore raw
Quoted 7 lines · Robert Millan
Quoted 4 lines · Vladimir 'phcoder' Serbinenko

As discussed on IRC this patch has problems on FreeBSD. Among them
1) stat and readlink are different. Does anyone have an idea how to make scripts always use right syntax?

AFAIK a custom autoconf snippet is the only way.

I would prefer it to be done on runtime if possible.

Quoted 2 lines

 Do you know how to reliably
identify GNU-incompatible readlink?

Perhaps "readlink --version | head -n 1 |grep GNU" ?

Quoted 3 lines

 I'm not sure what "readlink -f /" will do
on FreeBSD.

It complains about unknown option.

Quoted 7 lines
Quoted 2 lines

-  if path=readlink -f $path ; then : ; else
+  if path=realpath $path ; then : ; else

Note that this introduces an external dependency on GNU systems (readlink is part of coreutils), which better be avoided (specially since the version of realpath commonly used there has a problematic license).

On FreeBSD it's a part of base system AFAIR. GNU readlink is available through ports but is named greadlink. Perhaps we should try in script first realpath and if it's not found try readlink?

Quoted 8 lines
Quoted 1 line

2) "FreeBSD, kFreeBSD ..." isn't what FreeBSD user expects.

Ok.

Quoted 1 line

3) Version isn't detected correctly.

Since this part is not in your patch, can you explain the problem?

I haven't looked in it but I guess the problem is that the kernel is named just "kernel" with no version string.

Quoted 10 lines
Quoted 1 line

5) device.hints are forgotten

Ok.

Quoted 2 lines

4) Doesn't use UUID
6) Doesn't support ZFS

These two are in the previous version too, so I'd fix/merge them separately (increasing commit granularity is a good thing).

ZFS in mkconfig isn't ready at all. I think it can be postponed without any problems

Quoted 13 lines

--
Robert Millan

 The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and how) you may access your data; but nobody's threatening your freedom: we still allow you to remove your data and not access it at all."

_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel

Signature · 4 lines
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
#4 lore raw
Quoted 5 lines · Vladimir 'phcoder' Serbinenko
Quoted 4 lines
Quoted 2 lines

1) stat and readlink are different. Does anyone have an idea how to make scripts always use right syntax?

AFAIK a custom autoconf snippet is the only way.

I would prefer it to be done on runtime if possible.

Why?

Quoted 3 lines
Quoted 2 lines

 Do you know how to reliably
identify GNU-incompatible readlink?

Perhaps "readlink --version | head -n 1 |grep GNU" ?

It's better to check for features, but if we have to check for vendor, there's _AC_PATH_PROG_FLAVOR_GNU.

Quoted 4 lines
Quoted 3 lines

 I'm not sure what "readlink -f /" will do
on FreeBSD.

It complains about unknown option.

Does it exit non-zero? Then the check is simple.

Quoted 10 lines
Quoted 7 lines
Quoted 2 lines

-  if path=readlink -f $path ; then : ; else
+  if path=realpath $path ; then : ; else

Note that this introduces an external dependency on GNU systems (readlink is part of coreutils), which better be avoided (specially since the version of realpath commonly used there has a problematic license).

On FreeBSD it's a part of base system AFAIR. GNU readlink is available through ports but is named greadlink. Perhaps we should try in script first realpath and if it's not found try readlink?

I was concerned about the other realpath, usually found in GNU/Linux distributions. Anyway, we could check greadlink, then readlink and then realpath.

Quoted 6 lines
Quoted 4 lines
Quoted 1 line

3) Version isn't detected correctly.

Since this part is not in your patch, can you explain the problem?

I haven't looked in it but I guess the problem is that the kernel is named just "kernel" with no version string.

Oh, right.

Signature · 5 lines
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."