#!/bin/bash # # This file is subject to the terms and conditions of the GNU General Public # License. See the file "COPYING" in the main directory of this archive # for more details. # # Copyright (C) 2017 by Changbin Du <changbin.du@intel.com> # # Adapted from code in arch/x86/boot/Makefile by H. Peter Anvin and others # # "make fdimage/fdimage144/fdimage288/hdimage/isoimage" # script for x86 architecture # # Arguments: # $1 - fdimage format # $2 - target image file # $3 - kernel bzImage file # $4 - mtools configuration file # $5 - kernel cmdline # $6+ - initrd image file(s) # # This script requires: # bash # syslinux # genisoimage # mtools (for fdimage* and hdimage) # edk2/OVMF (for hdimage) # # Otherwise try to stick to POSIX shell commands... #
# Use "make V=1" to debug this script
case "${KBUILD_VERBOSE}" in
*1*)
set -x
;;
esac
# Exit the top-level shell with an error
topshell=$$
trap 'exit 1' USR1
die() { echo"" 1>&2 echo" *** $*" 1>&2 echo"" 1>&2
kill -USR1 $topshell
}
# Verify the existence and readability of a file
verify() { if [ ! -f "$1" -o ! -r "$1" ]; then
die "Missing file: $1" fi
}
# Make sure the files actually exist
verify "$FBZIMAGE"
declare -a FDINITRDS
irdpfx=' initrd='
initrdopts_syslinux=''
initrdopts_efi='' for f in "$@"; do if [ -f "$f" -a -r "$f" ]; then
FDINITRDS=("${FDINITRDS[@]}""$f")
fname="$(basename "$f")"
initrdopts_syslinux="${initrdopts_syslinux}${irdpfx}${fname}"
irdpfx=,
initrdopts_efi="${initrdopts_efi} initrd=${fname}" fi done
# Read a $3-byte littleendian unsigned value at offset $2 from file $1
le() {
local n=0
local m=1 for b in $(od -A n -v -j $2 -N $3 -t u1 "$1"); do
n=$((n + b*m))
m=$((m * 256)) done echo $n
}
# Get the EFI architecture name such that boot{name}.efi is the default # boot file name. Returns false with no output if the file is not an # EFI image or otherwise unknown.
efiarch() {
[ -f "$1" ] || return
[ $(le "$1" 0 2) -eq 23117 ] || return # MZ magic
peoffs=$(le "$1" 60 4) # PE header offset
[ $peoffs -ge 64 ] || return
[ $(le "$1" $peoffs 4) -eq 17744 ] || return # PE magic
case $(le "$1" $((peoffs+4+20)) 2) in # PE type
267) ;; # PE32
523) ;; # PE32+
*) return 1 ;; # Invalid
esac
[ $(le "$1" $((peoffs+4+20+68)) 2) -eq 10 ] || return # EFI app
case $(le "$1" $((peoffs+4)) 2) in # Machine type
332) echo i386 ;;
450) echo arm ;;
512) echo ia64 ;;
20530) echo riscv32 ;;
20580) echo riscv64 ;;
20776) echo riscv128 ;;
34404) echo x64 ;;
43620) echo aa64 ;;
esac
}
# Get the combined sizes in bytes of the files given, counting sparse # files as full length, and padding each file to cluster size
cluster=16384
filesizes() {
local t=0
local s for s in $(ls -lnL "$@" 2>/dev/null | awk '/^-/{ print $5; }'); do
t=$((t + ((s+cluster-1)/cluster)*cluster)) done echo $t
}
# Expand directory names which should be in /usr/share into a list # of possible alternatives
sharedirs() {
local dir file for dir in /usr/share /usr/lib64 /usr/lib; do for file; do echo"$dir/$file" echo"$dir/${file^^}" done done
}
efidirs() {
local dir file for dir in /usr/share /boot /usr/lib64 /usr/lib; do for file; do echo"$dir/$file" echo"$dir/${file^^}" done done
}
findsyslinux() {
local f="$(find -L $(sharedirs syslinux isolinux) \
-name "$1" -readable -type f -print -quit 2>/dev/null)" if [ ! -f "$f" ]; then
die "Need a $1 file, please install syslinux/isolinux." fi echo"$f"
return 0
}
findovmf() {
local arch="$1"
shift
local -a names=(-false)
local name f for name; do
names=("${names[@]}" -or -iname "$name") done for f in $(find -L $(efidirs edk2 ovmf) \
\( "${names[@]}" \) -readable -type f \
-print 2>/dev/null); do if [ "$(efiarch "$f")" = "$arch" ]; then echo"$f"
return 0 fi done
die "Need a $1 file for $arch, please install EDK2/OVMF."
}
do_mcopy() { if [ ${#FDINITRDS[@]} -gt 0 ]; then
mcopy "${FDINITRDS[@]}""$1" fi if [ -n "$efishell" ]; then
mmd "$1"EFI "$1"EFI/Boot
mcopy "$efishell""$1"EFI/Boot/boot${kefiarch}.efi fi if [ -n "$kefiarch" ]; then echo linux "$KCMDLINE$initrdopts_efi" | \
mcopy - "$1"startup.nsh fi echo default linux "$KCMDLINE$initrdopts_syslinux" | \
mcopy - "$1"syslinux.cfg
mcopy "$FBZIMAGE""$1"linux
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.