| # Sample GRUB script to autodetect operating systems |
| # |
| # Copyright (C) 2010 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/>. |
| |
| set saved_root=$root |
| |
| function freebsd_ufs_variants { |
| set device=$1 |
| set fstype=$2 |
| set uuid=$3 |
| |
| menuentry "FreeBSD (on $fstype $device)" $device $uuid { |
| set root=$2 |
| set uuid=$3 |
| |
| freebsd /boot/kernel/kernel |
| set FreeBSD.acpi_load=YES |
| set FreeBSD.hint.acpi.0.disabled=0 |
| set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid |
| frebsd_loadenv /boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (single)" $device $uuid { |
| set root=$2 |
| set uuid=$3 |
| |
| freebsd /boot/kernel/kernel --single |
| set FreeBSD.acpi_load=YES |
| set FreeBSD.hint.acpi.0.disabled=0 |
| set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid |
| frebsd_loadenv /boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (verbose)" $device $uuid { |
| set root=$2 |
| set uuid=$3 |
| |
| freebsd /boot/kernel/kernel --verbose |
| set FreeBSD.acpi_load=YES |
| set FreeBSD.hint.acpi.0.disabled=0 |
| set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid |
| frebsd_loadenv /boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (without ACPI)" $device $uuid { |
| set root=$2 |
| set uuid=$3 |
| |
| freebsd /boot/kernel/kernel --verbose |
| unset FreeBSD.acpi_load |
| set FreeBSD.hint.acpi.0.disabled=1 |
| set FreeBSD.loader.acpi_disabled_by_user=1 |
| set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid |
| frebsd_loadenv /boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (safe mode)" $device $uuid { |
| set root=$2 |
| set uuid=$3 |
| |
| freebsd /boot/kernel/kernel --verbose |
| unset FreeBSD.acpi_load |
| set FreeBSD.hint.acpi.0.disabled=1 |
| set FreeBSD.loader.acpi_disabled_by_user=1 |
| set FreeBSD.hint.apic.0.disabled=1 |
| set FreeBSD.hw.ata.ata_dma=0 |
| set FreeBSD.hw.ata.atapi_dma=0 |
| set FreeBSD.hw.ata.wc=0 |
| set FreeBSD.hw.eisa_slots=0 |
| set FreeBSD.hint.kbdmux.0.disabled=1 |
| set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid |
| frebsd_loadenv /boot/device.hints |
| } |
| } |
| |
| function freebsd_zfs_variants { |
| set device=$1 |
| set fstype=zfs |
| |
| menuentry "FreeBSD (on $fstype $device)" $device { |
| set root=$2 |
| |
| freebsd /@/boot/kernel/kernel |
| set FreeBSD.acpi_load=YES |
| set FreeBSD.hint.acpi.0.disabled=0 |
| freebsd_module_elf /@/boot/kernel/opensolaris.ko |
| freebsd_module_elf /@/boot/kernel/zfs.ko |
| freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache |
| probe -l -s name $root |
| set FreeBSD.vfs.root.mountfrom=zfs:$name |
| freebsd_loadenv /@/boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (single)" $device { |
| set root=$2 |
| |
| freebsd /@/boot/kernel/kernel --single |
| set FreeBSD.acpi_load=YES |
| set FreeBSD.hint.acpi.0.disabled=0 |
| freebsd_module_elf /@/boot/kernel/opensolaris.ko |
| freebsd_module_elf /@/boot/kernel/zfs.ko |
| freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache |
| probe -l -s name $root |
| set FreeBSD.vfs.root.mountfrom=zfs:$name |
| freebsd_loadenv /@/boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (verbose)" $device { |
| set root=$2 |
| |
| freebsd /@/boot/kernel/kernel --verbose |
| set FreeBSD.acpi_load=YES |
| set FreeBSD.hint.acpi.0.disabled=0 |
| freebsd_module_elf /@/boot/kernel/opensolaris.ko |
| freebsd_module_elf /@/boot/kernel/zfs.ko |
| freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache |
| probe -l -s name $root |
| set FreeBSD.vfs.root.mountfrom=zfs:$name |
| freebsd_loadenv /@/boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (without ACPI)" $device { |
| set root=$2 |
| |
| freebsd /@/boot/kernel/kernel --verbose |
| unset FreeBSD.acpi_load |
| set FreeBSD.hint.acpi.0.disabled=1 |
| set FreeBSD.loader.acpi_disabled_by_user=1 |
| freebsd_module_elf /@/boot/kernel/opensolaris.ko |
| freebsd_module_elf /@/boot/kernel/zfs.ko |
| freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache |
| probe -l -s name $root |
| set FreeBSD.vfs.root.mountfrom=zfs:$name |
| freebsd_loadenv /@/boot/device.hints |
| } |
| |
| menuentry "FreeBSD (on $fstype $device) (safe mode)" $device { |
| set root=$2 |
| |
| freebsd /@/boot/kernel/kernel --verbose |
| unset FreeBSD.acpi_load |
| set FreeBSD.hint.acpi.0.disabled=1 |
| set FreeBSD.loader.acpi_disabled_by_user=1 |
| set FreeBSD.hint.apic.0.disabled=1 |
| set FreeBSD.hw.ata.ata_dma=0 |
| set FreeBSD.hw.ata.atapi_dma=0 |
| set FreeBSD.hw.ata.wc=0 |
| set FreeBSD.hw.eisa_slots=0 |
| set FreeBSD.hint.kbdmux.0.disabled=1 |
| freebsd_module_elf /@/boot/kernel/opensolaris.ko |
| freebsd_module_elf /@/boot/kernel/zfs.ko |
| freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache |
| probe -l -s name $root |
| set FreeBSD.vfs.root.mountfrom=zfs:$name |
| freebsd_loadenv /@/boot/device.hints |
| } |
| } |
| |
| insmod regexp |
| for dev in (*); do |
| # $device: parenthesis removed from $dev |
| regexp -s device '\((.*)\)' $dev |
| # $fstype: filesystem type identified |
| probe -s fstype -f $dev |
| # uuid: filesystem UUID |
| probe -s uuid -u $dev |
| |
| if test -f ($device)/isolinux/isolinux.cfg ; then |
| menuentry "ISOLINUX config (on $device)" $device { |
| set root=$2 |
| syslinux_configfile -i /isolinux/isolinux.cfg |
| } |
| fi |
| if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then |
| menuentry "Windows Vista bootmgr (on $device)" $device { |
| set root=$2 |
| chainloader +1 |
| } |
| elif test -f ($device)/ntldr -a \ |
| -e ($device)/ntdetect.com -a -f ($device)/boot.ini; then |
| menuentry "Windows NT/2000/XP loader (on $device)" $device { |
| set root=$2 |
| regexp -s devnum 'hd([0-9]+)' $root |
| if test "$devnum" != "0"; then |
| drivemap -s hd0 $root |
| fi |
| chainloader +1 |
| } |
| elif test -f ($device)/windows/win.com; then |
| menuentry "Windows 98/ME (on $device)" $device { |
| set root=$2 |
| regexp -s devnum 'hd([0-9]+)' $root |
| if test "$devnum" != "0"; then |
| drivemap -s hd0 $root |
| fi |
| chainloader +1 |
| } |
| elif test -f ($device)/io.sys -a -f ($device)/command.com; then |
| menuentry "MS-DOS (on $device)" $device { |
| set root=$2 |
| regexp -s devnum 'hd([0-9]+)' $root |
| if test "$devnum" != "0"; then |
| drivemap -s hd0 $root |
| fi |
| chainloader +1 |
| } |
| elif test -f ($device)/kernel.sys; then |
| menuentry "FreeDOS (on $device)" $device { |
| set root=$2 |
| regexp -s type '([fh])d[0-9]+' $root |
| regexp -s devnum '[fh]d([0-9]+)' $root |
| if test $type = 'h' -a "$devnum" != "0"; then |
| drivemap -s hd0 $root |
| fi |
| chainloader +1 |
| } |
| elif test "$fstype" = ufs1 -o "$fstype" = ufs2 -a \ |
| -e ($device)/boot/kernel/kernel -a \ |
| -e ($device)/boot/device.hints; then |
| |
| freebsd_ufs_variants $device $fstype $uuid |
| |
| elif test "$fstype" = zfs -a \ |
| -e ($device)/@/boot/kernel/kernel -a \ |
| -e ($device)/@/boot/device.hints; then |
| |
| freebsd_zfs_variants $device |
| |
| elif test "$fstype" = hfsplus -a -f ($device)/mach_kernel; then |
| menuentry "Mac OS X/Darwin" $device $uuid { |
| set root=$2 |
| set uuid=$3 |
| |
| insmod vbe |
| do_resume=0 |
| if [ /var/vm/sleepimage -nt10 / ]; then |
| if xnu_resume /var/vm/sleepimage; then |
| do_resume=1 |
| fi |
| fi |
| if [ $do_resume = 1 ]; then |
| xnu_uuid $uuid uuid |
| if [ -f /Extra/DSDT.aml ]; then |
| acpi -e /Extra/DSDT.aml |
| fi |
| xnu_kernel /mach_kernel boot-uuid=${uuid} rd=*uuid |
| if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then |
| xnu_mkext /System/Library/Extensions.mkext |
| else |
| xnu_mkext /System/Library/Extensions |
| fi |
| if [ -f /Extra/Extensions.mkext ]; then |
| xnu_mkext /Extra/Extensions.mkext |
| fi |
| if [ -d /Extra/Extensions ]; then |
| xnu_kextdir /Extra/Extensions |
| fi |
| if [ -f /Extra/devtree.txt ]; then |
| xnu_devtree /Extra/devtree.txt |
| fi |
| if [ -f /Extra/splash.jpg ]; then |
| insmod jpeg |
| xnu_splash /Extra/splash.jpg |
| fi |
| if [ -f /Extra/splash.png ]; then |
| insmod png |
| xnu_splash /Extra/splash.png |
| fi |
| if [ -f /Extra/splash.tga ]; then |
| insmod tga |
| xnu_splash /Extra/splash.tga |
| fi |
| fi |
| } |
| else |
| set root=$device |
| for file in /boot/vmlinuz-* /boot/linux-*; do |
| if test -f $file; then |
| regexp -s version '/boot/vmlinuz-(.*)' $file |
| regexp -s version '/boot/linux-(.*)' $file |
| |
| menuentry "Linux $file" $device $uuid $file $version { |
| set root=$2 |
| set uuid=$3 |
| set kernel=$4 |
| set version=$5 |
| |
| linux $kernel root=UUID=$uuid ro |
| if test -f /boot/initrd-$version.img; then |
| initrd /boot/initrd-$version.img |
| elif test -f /boot/initrd.img-$version; then |
| initrd /boot/initrd.img-$version |
| elif test -f /boot/initrd-$version; then |
| initrd /boot/initrd-$version |
| fi |
| } |
| |
| menuentry "Linux $file (single)" $device $uuid $file $version { |
| set root=$2 |
| set uuid=$3 |
| set kernel=$4 |
| set version=$5 |
| |
| linux $kernel root=UUID=$uuid ro single |
| if test -f /boot/initrd-$version.img; then |
| initrd /boot/initrd-$version.img |
| elif test -f /boot/initrd.img-$version; then |
| initrd /boot/initrd.img-$version |
| elif test -f /boot/initrd-$version; then |
| initrd /boot/initrd-$version |
| fi |
| } |
| fi |
| done |
| fi |
| done |
| |
| set root=$saved_root |