245 lines
6.3 KiB
INI
245 lines
6.3 KiB
INI
|
# 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/>.
|
||
|
|
||
|
function pathname { regexp -s 2:"$2" '^(\(.*\))?(/.*)$' "$1"; }
|
||
|
function devname { regexp -s "$2" '^(\(.*\)).*$' "$1"; }
|
||
|
|
||
|
function loopback_iso_entry {
|
||
|
realdev="$1"
|
||
|
isopath="$2"
|
||
|
loopdev="$3"
|
||
|
|
||
|
if test -f /boot/grub/loopback.cfg; then
|
||
|
cfgpath=/boot/grub/loopback.cfg
|
||
|
elif test -f /grub/loopback.cfg; then
|
||
|
cfgpath=/grub/loopback.cfg
|
||
|
else
|
||
|
return 1;
|
||
|
fi
|
||
|
|
||
|
echo loopback.cfg $isopath: yes
|
||
|
menuentry "Boot GRUB Loopback Config from ${realdev}${isopath}" "$realdev" "$isopath" "$cfgpath" {
|
||
|
set device="$2"
|
||
|
set iso_path="$3"
|
||
|
set cfg_path="$4"
|
||
|
|
||
|
export iso_path
|
||
|
loopback loopdev_cfg "${device}${iso_path}"
|
||
|
set root=(loopdev_cfg)
|
||
|
configfile $cfg_path
|
||
|
loopback -d loopdev_cfg
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function grml_iso_entry {
|
||
|
realdev="$1"
|
||
|
isopath="$2"
|
||
|
loopdev="$3"
|
||
|
|
||
|
result=1
|
||
|
for dir in /boot/grml /boot/grmlsmall /boot/grmlmedium; do
|
||
|
if ! test -f ${dir}/linux26 -a -f ${dir}/initrd.gz; then continue; fi
|
||
|
|
||
|
echo grml $isopath: yes
|
||
|
result=0
|
||
|
menuentry "GRML Linux from ${realdev}${isopath}" \
|
||
|
"$realdev" "$isopath" "$dir" {
|
||
|
set device="$2"
|
||
|
set isopath="$3"
|
||
|
set grmldir="$4"
|
||
|
|
||
|
loopback loopdev_grml "${device}${isopath}"
|
||
|
set root=(loopdev_grml)
|
||
|
linux $grmldir/linux26 findiso="$isopath" apm=power-off quiet \
|
||
|
boot=live nomce
|
||
|
initrd $grmldir/initrd.gz
|
||
|
loopback -d loopdev_grml
|
||
|
}
|
||
|
done
|
||
|
return $result
|
||
|
}
|
||
|
|
||
|
function pmagic_iso_entry {
|
||
|
realdev="$1"
|
||
|
isopath="$2"
|
||
|
loopdev="$3"
|
||
|
|
||
|
if ! test -f /pmagic/bzImage -a -f /pmagic/initramfs; then return 1; fi
|
||
|
|
||
|
echo pmagic $isopath: yes
|
||
|
menuentry "Parted Magic from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||
|
set device="$2"
|
||
|
set isopath="$3"
|
||
|
|
||
|
loopback loopdev_pmagic "${device}${isopath}"
|
||
|
set root=(loopdev_pmagic)
|
||
|
linux /pmagic/bzImage iso_filename="$isopath" edd=off noapic \
|
||
|
load_ramdisk=1 prompt_ramdisk=0 rw sleep=10 loglevel=0 \
|
||
|
keymap=$langcode
|
||
|
initrd /pmagic/initramfs
|
||
|
loopback -d loopdev_pmagic
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function sidux_iso_entry {
|
||
|
realdev="$1"
|
||
|
isopath="$2"
|
||
|
loopdev="$3"
|
||
|
|
||
|
result=1
|
||
|
for kernel in /boot/vmlinuz-*-sidux-*; do
|
||
|
if ! test -f "$kernel"; then continue; fi
|
||
|
regexp -s 1:v1 -s 2:v2 '/boot/vmlinuz-(.*)-sidux-(.*)' "$kernel"
|
||
|
|
||
|
initrd="/boot/initrd.img-$v1-sidux-$v2"
|
||
|
if ! test -f "$initrd"; then continue; fi
|
||
|
|
||
|
result=0
|
||
|
echo sidux $isopath: yes
|
||
|
menuentry "Sidux vmlinux-$v1-sidux-$v2 from ${realdev}${isopath}" "$realdev" "$isopath" "$kernel" "$initrd" {
|
||
|
set device="$2"
|
||
|
set isopath="$3"
|
||
|
set kernel="$4"
|
||
|
set initrd="$5"
|
||
|
|
||
|
loopback loopdev_sidux "${device}${isopath}"
|
||
|
set root=(loopdev_sidux)
|
||
|
linux $kernel fromiso=$isopath boot=fll quiet
|
||
|
initrd $initrd
|
||
|
loopback -d loopdev_sidux
|
||
|
}
|
||
|
done
|
||
|
return $result
|
||
|
}
|
||
|
|
||
|
function slax_iso_entry {
|
||
|
realdev="$1"
|
||
|
isopath="$2"
|
||
|
loopdev="$3"
|
||
|
|
||
|
if ! test -f /boot/vmlinuz -a -f /boot/initrd.gz; then return 1; fi
|
||
|
|
||
|
echo slax $isopath: yes
|
||
|
menuentry "Slax Linux from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||
|
set device="$2"
|
||
|
set isopath="$3"
|
||
|
|
||
|
loopback loopdev_slax "${device}${isopath}"
|
||
|
set root=(loopdev_slax)
|
||
|
linux /boot/vmlinuz from=$isopath ramdisk_size=6666 root=/dev/ram0 rw
|
||
|
initrd /boot/initrd.gz
|
||
|
loopback -d loopdev_slax
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function tinycore_iso_entry {
|
||
|
realpath="$1"
|
||
|
isopath="$2"
|
||
|
loopdev="$3"
|
||
|
|
||
|
if ! test -f /boot/bzImage -a -f /boot/tinycore.gz; then return 1; fi
|
||
|
|
||
|
echo tinycore $isopath: yes
|
||
|
menuentry "Tinycore Linux from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||
|
set device="$2"
|
||
|
set isopath="$3"
|
||
|
|
||
|
loopback loopdev_tiny "${device}${isopath}"
|
||
|
set root=(loopdev_tiny)
|
||
|
linux /boot/bzImage
|
||
|
initrd /boot/tinycore.gz
|
||
|
loopback -d loopdev_tiny
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function casper_iso_entry {
|
||
|
realpath="$1"
|
||
|
isopath="$2"
|
||
|
loopdev="$3"
|
||
|
|
||
|
if ! test -f /casper/vmlinuz; then return 1; fi
|
||
|
initrd=
|
||
|
for f in /casper/initrd.*z; do
|
||
|
if ! test -f "$f"; then continue; fi
|
||
|
pathname "$f" initrd
|
||
|
done
|
||
|
if test -z "$initrd"; then return 1; fi
|
||
|
|
||
|
echo casper $isopath: yes
|
||
|
menuentry "Casper based Linux from ${realdev}${isopath}" "$realdev" "$isopath" "$initrd" {
|
||
|
set device="$2"
|
||
|
set isopath="$3"
|
||
|
set initrd="$4"
|
||
|
|
||
|
loopback loopdev_casper "${device}${isopath}"
|
||
|
set root=(loopdev_casper)
|
||
|
linux /casper/vmlinuz boot=casper iso-scan/filename="$isopath" quiet splash noprompt keyb="$langcode" \
|
||
|
debian-installer/language="$langcode" console-setup/layoutcode?="$langcode" --
|
||
|
initrd $initrd
|
||
|
loopback -d loopdev_casper
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function scan_isos {
|
||
|
isodirs="$1"
|
||
|
|
||
|
for dev in (*); do
|
||
|
for dir in $isodirs; do
|
||
|
for file in ${dev}${dir}/*.iso ${dev}${dir}/*.ISO; do
|
||
|
if ! test -f "$file"; then continue; fi
|
||
|
|
||
|
pathname $file isopath
|
||
|
if test -z "$dev" -o -z "$isopath"; then continue; fi
|
||
|
|
||
|
if ! loopback loopdev_scan "$file"; then continue; fi
|
||
|
saved_root=$root
|
||
|
set root=(loopdev_scan)
|
||
|
|
||
|
if loopback_iso_entry $dev $isopath (loopdev_scan); then true;
|
||
|
elif grml_iso_entry $dev $isopath (loopdev_scan); then true;
|
||
|
elif pmagic_iso_entry $dev $isopath (loopdev_scan); then true;
|
||
|
elif sidux_iso_entry $dev $isopath (loopdev_scan); then true;
|
||
|
elif slax_iso_entry $dev $isopath (loopdev_scan); then true;
|
||
|
elif tinycore_iso_entry $dev $isopath (loopdev_scan); then true;
|
||
|
elif casper_iso_entry $dev $isopath (loopdev_scan); then true;
|
||
|
else true; fi
|
||
|
|
||
|
set root=$saved_root
|
||
|
loopback -d loopdev_scan
|
||
|
done
|
||
|
done
|
||
|
done
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
# XXX Remove later
|
||
|
insmod serial
|
||
|
serial
|
||
|
terminal_output --append serial
|
||
|
# terminal_input --append serial
|
||
|
|
||
|
langcode="$lang"
|
||
|
|
||
|
insmod regexp
|
||
|
scan_isos /iso /boot/iso
|
||
|
|