Skip to content

Commit

Permalink
Integrate grub2 for hybrid boot
Browse files Browse the repository at this point in the history
  • Loading branch information
mika committed Jun 3, 2009
1 parent 7a729e0 commit e9c7fea
Show file tree
Hide file tree
Showing 135 changed files with 898 additions and 3 deletions.
7 changes: 7 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
grml-live (0.9.18) UNRELEASED; urgency=low

* Integrate grub2 for hybrid boot. Big thanks to Thorsten Glaser
for his work and help.

-- Michael Prokop <mika@grml.org> Wed, 03 Jun 2009 23:59:23 +0200

grml-live (0.9.17) unstable; urgency=low

[ Frank Terbeck ]
Expand Down
2 changes: 1 addition & 1 deletion debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Vcs-Browser: http://git.grml.org/?p=grml-live.git

Package: grml-live
Architecture: all
Depends: ${misc:Depends}, fai-client (>= 3.2.4), fai-server (>= 3.2.4), memtest86+ [i386 amd64], mkisofs | genisoimage, squashfs-lzma-tools | squashfs-tools, wget, moreutils
Depends: ${misc:Depends}, fai-client (>= 3.2.4), fai-server (>= 3.2.4), memtest86+ [i386 amd64], mkisofs | genisoimage, squashfs-lzma-tools | squashfs-tools, wget, moreutils, mksh
Recommends: grml-live-addons
Suggests: fai-doc
Description: build system for creating a grml (based) live-cd
Expand Down
362 changes: 362 additions & 0 deletions debian/overrides.grml-live

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions etc/grml/grml-live.conf
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,13 @@ GRML_FAI_CONFIG=/etc/grml/fai
# Do you want to skip adding /boot/addons/bsd4grml/ (from the template directory)?
# NO_ADDONS_BSD4GRML='1'

# By default the ISO is created for hybrid boot, so you can either
# boot the CD using normal el torito mode or copy it to USB device
# *without* having to run grml2usb (like: 'dd if=grml.iso of=/dev/sdX')
# - working both with the same ISO
# HYBRID_METHOD='disable' # do not create a hybrid ISO
# HYBRID_METHOD='isohybrid' # use isohybrid instead of the default (being manifold)

# exclude files from compressed squashfs file using the
# the mksquashfs option -ef:
# SQUASHFS_EXCLUDES_FILE="/etc/grml/fai/squashfs-excludes"
Expand Down
34 changes: 32 additions & 2 deletions grml-live
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export LC_ALL=C
# exit on any error:
set -e

GRML_LIVE_VERSION='0.9.17'
GRML_LIVE_VERSION='0.9.18'
PN="$(basename $0)"
CMDLINE="$0 $@"
ISO_DATE="$(date +%Y-%m-%d)"
Expand Down Expand Up @@ -559,7 +559,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
for file in ${TEMPLATE_DIRECTORY}/boot/addons/* ; do
test -f $file && cp $file "$BUILD_OUTPUT"/boot/addons/
done

if [ -z "$NO_ADDONS_BSD4GRML" ] ; then
cp -a ${TEMPLATE_DIRECTORY}/boot/addons/bsd4grml "$BUILD_OUTPUT"/boot/addons/
fi
Expand Down Expand Up @@ -602,6 +602,9 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
sed -i "s/%VERSION%/$VERSION/" "$BUILD_OUTPUT"/boot/grub/menu.lst
sed -i "s/%GRML_NAME%/$SHORT_GRML_NAME/" "$BUILD_OUTPUT"/boot/grub/menu.lst

sed -i "s/%VERSION%/$VERSION/" "$BUILD_OUTPUT"/boot/grub/grub.cfg
sed -i "s/%GRML_NAME%/$SHORT_GRML_NAME/" "$BUILD_OUTPUT"/boot/grub/grub.cfg

# make sure the squashfs filename is set accordingly:
GRML_NAME_SQUASHFS="$GRML_NAME.squashfs"
sed -i "s/%GRML_NAME_SQUASHFS%/$GRML_NAME_SQUASHFS/" "$BUILD_OUTPUT"/boot/isolinux/isolinux.cfg
Expand Down Expand Up @@ -735,6 +738,33 @@ else
-b $BOOT_FILE \
-o "${ISO_OUTPUT}/${ISO_NAME}" . ; RC=$?

# support disabling hybrid ISO image
if [ "$HYBRID_METHOD" = "disable" ] ; then\
log "Skipping creation of hybrid ISO file as requested via HYBRID_METHOD=disable"
einfo "Skipping creation of hybrid ISO file as requested via HYBRID_METHOD=disable"
eend 0
# use isohybrid only on request
elif [ "$HYBRID_METHOD" = "isohybrid" ] ; then
if ! which isohybrid >/dev/null 2>&1 ; then
bailout 12 "isohybrid binary not found - please install syslinux/syslinux-common"
else
log "Creating hybrid ISO file with isohybrid method"
einfo "Creating hybrid ISO file with isohybrid method"
isohybrid "${ISO_OUTPUT}/${ISO_NAME}"
eend $?
fi
# by default use our manifold boot method:
else
if ! [ -r boot/grub/core.img ] ; then
ewarn "boot/grub/core.img not found, not creating manifold boot ISO file"
else
log "Creating hybrid ISO file with manifold method"
einfo "Creating hybrid ISO file with manifold method"
echo 1 63 | mksh /usr/share/grml-live/scripts/bootgrub.mksh | cat - boot/grub/core.img | dd conv=notrunc of="${ISO_OUTPUT}/${ISO_NAME}" conv=notrunc
eend $?
fi
fi

# generate md5sum and sha1sum of ISO if we are using class 'RELEASE':
case $CLASSES in *RELEASE*)
[ "$RC" = 0 ] && \
Expand Down
171 changes: 171 additions & 0 deletions scripts/bootgrub.mksh
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
#!/usr/bin/env mksh
# $Id$
# $miros: src/sys/arch/i386/stand/bootxx/mkbxinst.sh,v 1.15 2009/02/08 20:47:48 tg Exp $
#-
# Copyright (c) 2007, 2008, 2009
# Thorsten Glaser <tg@mirbsd.org>
#
# Provided that these terms and disclaimer and all copyright notices
# are retained or reproduced in an accompanying document, permission
# is granted to deal in this work without restriction, including un‐
# limited rights to use, publicly perform, distribute, sell, modify,
# merge, give away, or sublicence.
#
# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
# the utmost extent permitted by applicable law, neither express nor
# implied; without malicious intent or gross negligence. In no event
# may a licensor, author or contributor be held liable for indirect,
# direct, other damage, loss, or other issues arising in any way out
# of dealing in the work, even if advised of the possibility of such
# damage or existence of a defect, except proven that it results out
# of said person’s immediate fault when using the work as intended.
#-
# Self-installing 32-bit x86 boot blocks for GNU GRUB2 on i386-pc
# Reads a list of extents (firstblock lastblock) from standard input
# and writes bootxx to standard output, which can subsequentially be
# stored as partition boot record (or floppy boot sector) on disc.

set -A thecode 0x66 0x31 0xC9 0xBB 0x00 0x30 0x8E 0xD3 0xBC 0xFC 0xFF 0x66 0x51 0x66 0x9D 0x8E 0xC1 0xBF 0x00 0x7C 0x57 0xB1 0x10 0xF3 0xA4 0x5E 0x8E 0xD9 0xBB 0x00 0x08 0x53 0x53 0x8E 0xC3 0xBF 0x00 0xFE 0xB5 0x02 0xF3 0xA4 0x1F 0x68 0x7D 0xFE 0xCB 0x30 0x41 0x41 0x37 0x20 0x4C 0x6F 0x61 0x64 0x69 0x6E 0x67 0x20 0x00 0x62 0x61 0x64 0x20 0x6D 0x61 0x67 0x69 0x63 0x20 0x65 0x72 0x72 0x6F 0x72 0x0D 0x0A 0x00 0xAB 0x02 0x00 0x12 0x00 0x00 0x80 0x50 0xFF 0xB4 0x0E 0xBB 0x07 0x00 0xCD 0x10 0xAC 0x08 0xC0 0x75 0xF4 0xC3 0xE8 0xF7 0xFF 0xB8 0x30 0xFF 0x87 0x06 0x56 0xFE 0x3D 0x30 0xFF 0x75 0x19 0x31 0xC0 0xCD 0x16 0xEA 0xF0 0xFF 0x00 0xF0 0xFB 0x88 0x16 0x55 0xFE 0xBE 0x2F 0xFE 0x80 0xFA 0x80 0x72 0xDB 0xE8 0xD2 0xFF 0x31 0xDB 0xBE 0x53 0xFF 0x0F 0xB6 0x2E 0x4F 0xFE 0xAC 0x0F 0xB6 0xC8 0xC0 0xE9 0x05 0x83 0xE0 0x1F 0x40 0x41 0x50 0xBF 0x10 0xFE 0xB8 0x10 0x00 0xAB 0xB0 0x01 0xAB 0x89 0xD8 0xAB 0x8C 0xC8 0xAB 0xF3 0xA4 0x31 0xC0 0xAB 0xAB 0xAB 0xAB 0x5F 0x55 0x56 0xBE 0x10 0xFE 0xFF 0x16 0x56 0xFE 0xBD 0x04 0x00 0x8A 0x16 0x55 0xFE 0x60 0xF9 0xCD 0x13 0x9C 0xB8 0x2E 0x0E 0xBB 0x07 0x00 0xCD 0x10 0x9D 0xFB 0x61 0x73 0x1C 0x4D 0x60 0x9C 0x31 0xC0 0xCD 0x13 0x9D 0xBE 0x46 0xFE 0x0F 0x84 0x77 0xFF 0xB8 0x30 0x0E 0x01 0xE8 0xBB 0x07 0x00 0xCD 0x10 0x61 0xEB 0xD2 0xB4 0x02 0x00 0xE7 0x89 0x5C 0x04 0x00 0xFC 0x72 0x14 0x66 0x83 0x44 0x08 0x01 0x66 0x83 0x54 0x0C 0x00 0x4F 0x75 0xAC 0x5E 0x5D 0x4D 0x0F 0x85 0x7D 0xFF 0xBE 0x4C 0xFE 0xE8 0x3F 0xFF 0x66 0x31 0xD2 0x52 0x66 0x4A 0x8A 0x16 0x55 0xFE 0xB8 0x00 0x82 0x50 0xFA 0xCB 0x8B 0x44 0x08 0x8B 0x54 0x0A 0xF7 0x36 0x52 0xFE 0x42 0x31 0xC9 0x87 0xD1 0xF7 0x36 0x50 0xFE 0xC0 0xE4 0x06 0x86 0xC4 0x09 0xC1 0x88 0xD6 0xB8 0x01 0x02 0xC3 0xB4 0x42 0xC3
typeset -i ofs_bkcnt=79
typeset -i ofs_geomh=80
typeset -i ofs_geoms=82
typeset -i ofs_partp=84
typeset -i ofs_secsz=252
typeset -i begptr=339
typeset -Uui8 thecode

typeset -Uui16 curptr=begptr
typeset -i wnum=0 wofs=0 wrec=0

function do_record {
typeset -i blk=$1 cnt=$2 n
typeset -Uui16 x=blk y

(( blk && cnt )) || return

print -u2 "$wrec @0x${curptr#16#}: $cnt @$blk (0x${x#16#})"

while (( cnt )); do
let wrec++
(( n = blk < 0x00000100 ? 0 :
blk < 0x00010000 ? 1 :
blk < 0x01000000 ? 2 : 3 ))
(( x = cnt < 33 ? cnt : 32 ))
(( y = blk ))
print -u2 " - 0x${curptr#16#}: $((x)) (0x${x#16#}) @ $blk" \
"(0x${y#16#})"
(( thecode[curptr++] = (n++ << 5) | (x - 1) ))
(( blk += x ))
(( cnt -= x ))
while (( n-- )); do
(( thecode[curptr++] = y & 0xFF ))
(( y >>= 8 ))
done
done
}

function record_block {
typeset -i sv blk=$1

if (( !blk || (wofs && blk != (wofs + wnum)) )); then
# flush the blocks from the cache
(( wnum )) && do_record $wofs $wnum
wofs=0
wnum=0
fi
if (( blk )); then
# record some new block into the cache
(( wofs )) || let wofs=blk
(( wnum += 1 << sscale ))
fi
}

typeset -i partp=0 numheads=0 numsecs=0 sscale=0 bsh=9

while getopts ":0:1B:h:p:S:s:" ch; do
case $ch {
(0) ;;
(1) ;;
(B) if (( (bsh = OPTARG) < 9 || OPTARG > 15 )); then
print -u2 error: invalid block size "2^'$OPTARG'"
exit 1
fi
;;
(h) if (( (numheads = OPTARG) < 1 || OPTARG > 256 )); then
print -u2 warning: invalid head count "'$OPTARG'"
numheads=0
fi ;;
(p) if (( (partp = OPTARG) < 1 || OPTARG > 255 )); then
print -u2 warning: invalid partition type "'$OPTARG'"
partp=0
fi ;;
(S) if (( (sscale = OPTARG) < 0 || OPTARG > 24 )); then
print -u2 error: invalid input scale "'$OPTARG'"
exit 1
fi ;;
(s) if (( (numsecs = OPTARG) < 1 || OPTARG > 63 )); then
print -u2 warning: invalid sector count "'$OPTARG'"
numsecs=0
fi ;;
(*) print -u2 'Syntax:
bxinst [-1] [-B blocksize] [-h heads] [-p partitiontype] [-S scale]
[-s sectors] <sectorlist | dd of=image conv=notrunc
Default values: blocksize=9 heads=16 sectors=63 partitiontype=0x27 scale=0'
exit 1 ;;
}
done
shift $((OPTIND - 1))

if (( !numheads )); then
print -u2 warning: using default value of 16 heads
numheads=16
fi

if (( !numsecs )); then
print -u2 warning: using default value of 63 sectors
numsecs=63
fi

# read in the extents
while read firstblock lastblock junk; do
while (( firstblock <= lastblock )); do
record_block $((firstblock++ << sscale))
done
done
record_block 0 # just flush
print -u2 "using $wrec blocks, $((curptr-begptr)) bytes ($((510-curptr)) free)"

# fill the block table
if (( curptr-- > 510 )); then
print -u2 error: too many blocks
exit 1
fi
while (( ++curptr < 510 )); do
(( thecode[curptr] = (curptr & 0xFCF) == 0x1C2 ? 0 : RANDOM & 0xFF ))
# ensure the “active” flag is never set to 0x00 or 0x80
if (( ((curptr + 2) & 0xFCF) == 0x01C0 )); then
(( thecode[curptr] & 0x7F )) || let --curptr
fi
done
thecode[510]=0x55
thecode[511]=0xAA

# fill in other data
(( thecode[ofs_bkcnt] = wrec ))
(( thecode[ofs_geomh] = numheads & 0xFF ))
(( thecode[ofs_geomh + 1] = numheads >> 8 ))
(( thecode[ofs_geoms] = numsecs ))
(( thecode[ofs_partp] = partp ))
print -u2 "using sectors of 2^$bsh = $((1 << bsh)) bytes"
(( thecode[ofs_secsz] = (1 << (bsh - 8)) ))

# create the output string
ostr=
curptr=0
while (( curptr < 512 )); do
ostr=$ostr\\0${thecode[curptr++]#8#}
done

# over and out
print -n "$ostr"
exit 0
Binary file added templates/boot/grub/_bsd.mod
Binary file not shown.
Binary file added templates/boot/grub/_chain.mod
Binary file not shown.
Binary file added templates/boot/grub/_linux.mod
Binary file not shown.
Binary file added templates/boot/grub/_multiboot.mod
Binary file not shown.
Binary file added templates/boot/grub/acorn.mod
Binary file not shown.
Binary file added templates/boot/grub/acpi.mod
Binary file not shown.
Binary file added templates/boot/grub/affs.mod
Binary file not shown.
Binary file added templates/boot/grub/afs.mod
Binary file not shown.
Binary file added templates/boot/grub/amiga.mod
Binary file not shown.
Binary file added templates/boot/grub/aout.mod
Binary file not shown.
Binary file added templates/boot/grub/apple.mod
Binary file not shown.
Binary file added templates/boot/grub/at_keyboard.mod
Binary file not shown.
Binary file added templates/boot/grub/ata.mod
Binary file not shown.
Binary file added templates/boot/grub/ata_pthru.mod
Binary file not shown.
Binary file added templates/boot/grub/biosdisk.mod
Binary file not shown.
Binary file added templates/boot/grub/bitmap.mod
Binary file not shown.
Binary file added templates/boot/grub/blocklist.mod
Binary file not shown.
Binary file added templates/boot/grub/boot.mod
Binary file not shown.
Binary file added templates/boot/grub/bsd.mod
Binary file not shown.
Binary file added templates/boot/grub/bufio.mod
Binary file not shown.
Binary file added templates/boot/grub/cat.mod
Binary file not shown.
Binary file added templates/boot/grub/chain.mod
Binary file not shown.
Binary file added templates/boot/grub/cmp.mod
Binary file not shown.
85 changes: 85 additions & 0 deletions templates/boot/grub/command.lst
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
*acpi: acpi
*cat: cat
*drivemap: drivemap
*echo: echo
*efiemu_pnvram: efiemu
*halt: halt
*hdparm: hdparm
*hello: hello
*help: help
*hexdump: hexdump
*list_env: loadenv
*load_env: loadenv
*loopback: loopback
*ls: ls
*pxe: pxecmd
*save_env: loadenv
*search: search
*serial: serial
*sleep: sleep
.: configfile
[: test
background_image: gfxterm
badram: mmap
blocklist: blocklist
boot: boot
cat: minicmd
chainloader: chain
cmp: cmp
configfile: configfile
cpuid: cpuid
crc: crc
date: date
dump: minicmd
efiemu_loadcore: efiemu
efiemu_prepare: efiemu
efiemu_unload: efiemu
exit: minicmd
freebsd: bsd
freebsd_loadenv: bsd
freebsd_module: bsd
gptsync: gptsync
handler: handler
help: minicmd
initrd32: linux
initrd: linux16
linux32: linux
linux: linux16
loadfont: font
lsfonts: font
lsmmap: lsmmap
lsmod: minicmd
lspci: lspci
module: multiboot
multiboot: multiboot
netbsd: bsd
openbsd: bsd
parttool: parttool
play: play
read: read
read_byte: memrw
read_dword: memrw
read_word: memrw
reboot: reboot
rmmod: minicmd
root: minicmd
source: configfile
terminal_input: handler
terminal_output: handler
terminfo: terminfo
test: test
usb: usbtest
vbeinfo: vbeinfo
vbetest: vbetest
videotest: videotest
write_byte: memrw
write_dword: memrw
write_word: memrw
xnu_devtree: xnu
xnu_kernel: xnu
xnu_kext: xnu
xnu_kextdir: xnu
xnu_mkext: xnu
xnu_ramdisk: xnu
xnu_resume: xnu
xnu_splash: xnu
Binary file added templates/boot/grub/configfile.mod
Binary file not shown.
Binary file added templates/boot/grub/core.img
Binary file not shown.
Binary file added templates/boot/grub/cpio.mod
Binary file not shown.
Binary file added templates/boot/grub/cpuid.mod
Binary file not shown.
Binary file added templates/boot/grub/crc.mod
Binary file not shown.
Binary file added templates/boot/grub/date.mod
Binary file not shown.
Binary file added templates/boot/grub/datehook.mod