# 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 . 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