Reimplement 10_freebsd.in using 10_linux.in
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
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 MillanThe 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
@@ -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
@@ -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
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."
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 : ; elseNote 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 ZFSThese 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 MillanThe 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
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 : ; elseNote 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."