Merge pull request #359 from marineam/grub

grub: the one bootloader to rule them all
This commit is contained in:
Michael Marineau 2014-12-08 11:46:27 -08:00
commit 3a94b02f1d
8 changed files with 198 additions and 169 deletions

View File

@ -22,8 +22,6 @@ DEFAULT_GROUP=developer
# Developer-visible flags. # Developer-visible flags.
DEFINE_string board "${DEFAULT_BOARD}" \ DEFINE_string board "${DEFAULT_BOARD}" \
"The board to build an image for." "The board to build an image for."
DEFINE_string boot_args "" \
"Additional boot arguments to pass to the commandline"
DEFINE_boolean enable_rootfs_verification ${FLAGS_TRUE} \ DEFINE_boolean enable_rootfs_verification ${FLAGS_TRUE} \
"Default all bootloaders to use kernel-based root fs integrity checking." "Default all bootloaders to use kernel-based root fs integrity checking."
DEFINE_string output_root "${DEFAULT_BUILD_ROOT}/images" \ DEFINE_string output_root "${DEFAULT_BUILD_ROOT}/images" \

View File

@ -242,11 +242,7 @@ finish_image() {
if mountpoint -q "${root_fs_dir}"/boot; then if mountpoint -q "${root_fs_dir}"/boot; then
install_grub=1 install_grub=1
${BUILD_LIBRARY_DIR}/configure_bootloaders.sh \ ${BUILD_LIBRARY_DIR}/configure_bootloaders.sh \
--arch=${ARCH} \ --boot_dir="${root_fs_dir}"/usr/boot
--disk_layout="${disk_layout}" \
--boot_dir="${root_fs_dir}"/usr/boot \
--esp_dir="${root_fs_dir}"/boot \
--boot_args="${FLAGS_boot_args}"
fi fi
if [[ -n "${FLAGS_developer_data}" ]]; then if [[ -n "${FLAGS_developer_data}" ]]; then
@ -273,7 +269,7 @@ finish_image() {
# This script must mount the ESP partition differently, so run it after unmount # This script must mount the ESP partition differently, so run it after unmount
if [[ "${install_grub}" -eq 1 ]]; then if [[ "${install_grub}" -eq 1 ]]; then
local target local target
for target in i386-pc x86_64-efi; do for target in i386-pc x86_64-efi x86_64-xen; do
${BUILD_LIBRARY_DIR}/grub_install.sh \ ${BUILD_LIBRARY_DIR}/grub_install.sh \
--target="${target}" --disk_image="${disk_img}" --target="${target}" --disk_image="${disk_img}"
done done

View File

@ -4,8 +4,8 @@
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
# Helper script to generate GRUB bootloader configuration files for # Helper script to generate bootloader configuration files for systems
# x86 platforms. # that predate our new GRUB2 based gptprio bootloader.
SCRIPT_ROOT=$(readlink -f $(dirname "$0")/..) SCRIPT_ROOT=$(readlink -f $(dirname "$0")/..)
. "${SCRIPT_ROOT}/common.sh" || exit 1 . "${SCRIPT_ROOT}/common.sh" || exit 1
@ -14,16 +14,8 @@ SCRIPT_ROOT=$(readlink -f $(dirname "$0")/..)
assert_inside_chroot assert_inside_chroot
# Flags. # Flags.
DEFINE_string arch "x86" \
"The boot architecture: arm or x86. (Default: x86)"
DEFINE_string boot_dir "/tmp/boot" \ DEFINE_string boot_dir "/tmp/boot" \
"Path to boot directory in root filesystem (Default: /tmp/boot)" "Path to boot directory in root filesystem (Default: /tmp/boot)"
DEFINE_string esp_dir "" \
"Path to ESP partition mount point (Default: none)"
DEFINE_string boot_args "" \
"Additional boot arguments to pass to the commandline (Default: '')"
DEFINE_string disk_layout "base" \
"The disk layout type to use for this image."
# Parse flags # Parse flags
FLAGS "$@" || exit 1 FLAGS "$@" || exit 1
@ -34,17 +26,10 @@ switch_to_strict_mode
common_args="console=tty0 ro noswap cros_legacy" common_args="console=tty0 ro noswap cros_legacy"
common_args="${common_args} ${FLAGS_boot_args}" common_args="${common_args} ${FLAGS_boot_args}"
# Get partition UUIDs from the json config
get_uuid() {
"${BUILD_LIBRARY_DIR}/disk_util" --disk_layout="${FLAGS_disk_layout}" \
readuuid "$1"
}
# Filesystem command line args. # Filesystem command line args.
root_args="root=LABEL=ROOT rootflags=subvol=root" root_args="root=LABEL=ROOT rootflags=subvol=root"
gptprio_args="${root_args} usr=gptprio:" slot_a_args="${root_args} usr=PARTLABEL=USR-A"
slot_a_args="${root_args} usr=PARTUUID=$(get_uuid USR-A)" slot_b_args="${root_args} usr=PARTLABEL=USR-B"
slot_b_args="${root_args} usr=PARTUUID=$(get_uuid USR-B)"
GRUB_DIR="${FLAGS_boot_dir}/grub" GRUB_DIR="${FLAGS_boot_dir}/grub"
SYSLINUX_DIR="${FLAGS_boot_dir}/syslinux" SYSLINUX_DIR="${FLAGS_boot_dir}/syslinux"
@ -73,11 +58,6 @@ EOF
default 1 default 1
$(< "${GRUB_DIR}/menu.lst.A") $(< "${GRUB_DIR}/menu.lst.A")
EOF EOF
sudo cp "${GRUB_DIR}/menu.lst.A" "${GRUB_DIR}/menu.lst"
# menu.lst needs to go under boot/grub so pvgrub can find it reliably
sudo mkdir -p "${FLAGS_esp_dir}/boot/grub"
sudo cp "${GRUB_DIR}/menu.lst" "${FLAGS_esp_dir}/boot/grub"
} }
# Build configuration files for syslinux # Build configuration files for syslinux
@ -87,45 +67,11 @@ configure_syslinux() {
# Add ttyS0 as a secondary console, useful for qemu -nographic # Add ttyS0 as a secondary console, useful for qemu -nographic
# This leaves /dev/console mapped to tty0 (vga) which is reasonable default. # This leaves /dev/console mapped to tty0 (vga) which is reasonable default.
if [[ ${common_args} == *console=ttyS* ]] ; then syslinux_args="console=ttyS0,115200n8 ${common_args}"
syslinux_args="${common_args}"
else
syslinux_args="console=ttyS0,115200n8 ${common_args}"
fi
sudo_clobber "${SYSLINUX_DIR}/syslinux.cfg" <<EOF
PROMPT 1
# display boot: prompt for a half second
TIMEOUT 5
# never sit at the prompt longer than a minute
TOTALTIMEOUT 600
# controls which kernel is the default
include /syslinux/default.cfg
include /syslinux/boot_kernel.cfg
# coreos.A
include /syslinux/root.A.cfg
# coreos.B
include /syslinux/root.B.cfg
EOF
sudo_clobber "${SYSLINUX_DIR}/default.cfg" <<<"DEFAULT boot_kernel"
sudo_clobber "${SYSLINUX_DIR}/default.cfg.A" <<<"DEFAULT coreos.A" sudo_clobber "${SYSLINUX_DIR}/default.cfg.A" <<<"DEFAULT coreos.A"
sudo_clobber "${SYSLINUX_DIR}/default.cfg.B" <<<"DEFAULT coreos.B" sudo_clobber "${SYSLINUX_DIR}/default.cfg.B" <<<"DEFAULT coreos.B"
# Different files are used so that the updater can only touch the file it
# needs to for a given change. This will minimize any potential accidental
# updates issues, hopefully.
sudo_clobber "${SYSLINUX_DIR}/boot_kernel.cfg" <<EOF
label boot_kernel
menu label boot_kernel
kernel vmlinuz-boot_kernel
append ${syslinux_args} ${gptprio_args}
EOF
sudo_clobber "${SYSLINUX_DIR}/root.A.cfg" <<EOF sudo_clobber "${SYSLINUX_DIR}/root.A.cfg" <<EOF
label coreos.A label coreos.A
menu label coreos.A menu label coreos.A
@ -139,21 +85,7 @@ label coreos.B
kernel vmlinuz.B kernel vmlinuz.B
append ${syslinux_args} ${slot_b_args} append ${syslinux_args} ${slot_b_args}
EOF EOF
sudo cp -r "${SYSLINUX_DIR}/." "${FLAGS_esp_dir}/syslinux"
# Stage all kernels with the only one we built.
for kernel in syslinux/{vmlinuz-boot_kernel,vmlinuz.A,vmlinuz.B}
do
sudo cp "${FLAGS_boot_dir}/vmlinuz" "${FLAGS_esp_dir}/${kernel}"
done
} }
[[ -d "${FLAGS_esp_dir}" ]] || die_notrace "--esp_dir is required" configure_pvgrub
configure_syslinux
if [[ "${FLAGS_arch}" = "x86" || "${FLAGS_arch}" = "amd64" ]]; then
configure_pvgrub
configure_syslinux
else
error "No bootloader configuration for ${FLAGS_arch}"
fi

View File

@ -1,13 +1,75 @@
# Main GRUB config
# Load any and all video drivers. # Load any and all video drivers.
# Required under UEFI to boot Linux with a working console. # Required under UEFI to boot Linux with a working console.
insmod all_video insmod all_video
# Use both default text console and ttyS0 # Default menuentry id and boot timeout
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1 set default="coreos"
terminal_input console serial set timeout=1
terminal_output console serial
# Re-use the existing syslinux configuration # Default kernel args for root filesystem and console.
echo "Loading SYSLINUX configuration..." set linux_root="root=LABEL=ROOT"
insmod syslinuxcfg set linux_console=""
syslinux_source -s /syslinux/syslinux.cfg
# Anything else the OEM adds should use this variable.
set linux_append=""
# Search for the OEM partition, load additional configuration if found.
search --no-floppy --set oem --label OEM --hint "$root"
if [ -n "$oem" -a -f "($oem)/grub.cfg" ]; then
source "($oem)/grub.cfg"
fi
# If no specific console has been set by the OEM then select based on
# platform, most systems use vga text as primary and ttyS0 as secondary.
if [ -z "$linux_console" ]; then
if [ "$grub_platform" = pc ]; then
set linux_console="console=ttyS0,115200n8 console=tty0"
serial com0 --speed=115200 --word=8 --parity=no
terminal_input console serial_com0
terminal_output console serial_com0
elif [ "$grub_platform" = efi ]; then
set linux_console="console=ttyS0,115200n8 console=tty0"
elif [ "$grub_platform" = xen ]; then
set linux_console="console=hvc0"
fi
fi
# Load a kernel and boot! $root must point at USR-A or USR-B
function load_coreos {
# UEFI uses linuxefi/initrdefi instead of linux/initrd
if [ "$grub_platform" = efi ]; then
set suf="efi"
else
set suf=""
fi
echo "Loading ($root)/boot/vmlinuz"
linux$suf /boot/vmlinuz $linux_console $linux_root "$@" $linux_append
if [ -f /boot/initrd ]; then
echo "Loading ($root)/boot/initrd"
initrd$suf /boot/initrd
fi
echo "Booting CoreOS!"
}
# TODO: systemd 217 added mount.usr=, once we update we should switch
menuentry "CoreOS default" --id=coreos {
gptprio.next -d root -u usr_uuid
load_coreos usr=PARTUUID=$usr_uuid
}
menuentry "CoreOS USR-A" --id=coreos-a {
search --no-floppy --set root --part-label USR-A --hint "$root"
load_coreos usr=PARTLABEL=USR-A
}
menuentry "CoreOS USR-B" --id=coreos-b {
search --no-floppy --set root --part-label USR-B --hint "$root"
load_coreos usr=PARTLABEL=USR-B
}

View File

@ -29,11 +29,8 @@ switch_to_strict_mode
# Our GRUB lives under coreos/grub so new pygrub versions cannot find grub.cfg # Our GRUB lives under coreos/grub so new pygrub versions cannot find grub.cfg
GRUB_DIR="coreos/grub/${FLAGS_target}" GRUB_DIR="coreos/grub/${FLAGS_target}"
# Assumes the ESP is the first partition, GRUB cannot search for it by type.
GRUB_PREFIX="(,gpt1)/coreos/grub"
# Modules required to find and read everything else from ESP # Modules required to find and read everything else from ESP
CORE_MODULES=( fat part_gpt gzio ) CORE_MODULES=( fat part_gpt search_fs_uuid gzio )
# Name of the core image, depends on target # Name of the core image, depends on target
CORE_NAME= CORE_NAME=
@ -46,6 +43,9 @@ case "${FLAGS_target}" in
x86_64-efi) x86_64-efi)
CORE_NAME="core.efi" CORE_NAME="core.efi"
;; ;;
x86_64-xen)
CORE_NAME="core.elf"
;;
*) *)
die_notrace "Unknown GRUB target ${FLAGS_target}" die_notrace "Unknown GRUB target ${FLAGS_target}"
;; ;;
@ -57,14 +57,10 @@ esac
# the kernel can automatically detach the loop devices on unmount. When # the kernel can automatically detach the loop devices on unmount. When
# using a single loop device with partitions there is no such cleanup. # using a single loop device with partitions there is no such cleanup.
# That's the story of why this script has all this goo for loop and mount. # That's the story of why this script has all this goo for loop and mount.
STAGE_DIR=
ESP_DIR= ESP_DIR=
LOOP_DEV= LOOP_DEV=
cleanup() { cleanup() {
if [[ -d "${STAGE_DIR}" ]]; then
rm -rf "${STAGE_DIR}"
fi
if [[ -d "${ESP_DIR}" ]]; then if [[ -d "${ESP_DIR}" ]]; then
if mountpoint -q "${ESP_DIR}"; then if mountpoint -q "${ESP_DIR}"; then
sudo umount "${ESP_DIR}" sudo umount "${ESP_DIR}"
@ -77,24 +73,7 @@ cleanup() {
} }
trap cleanup EXIT trap cleanup EXIT
STAGE_DIR=$(mktemp --directory) info "Installing GRUB ${FLAGS_target} in ${FLAGS_disk_image##*/}"
mkdir -p "${STAGE_DIR}/${GRUB_DIR}"
info "Compressing modules in ${GRUB_DIR}"
for file in "/usr/lib/grub/${FLAGS_target}"/*{.lst,.mod}; do
out="${STAGE_DIR}/${GRUB_DIR}/${file##*/}"
gzip --best --stdout "${file}" > "${out}"
done
info "Generating ${GRUB_DIR}/${CORE_NAME}"
grub-mkimage \
--compression=auto \
--format "${FLAGS_target}" \
--prefix "${GRUB_PREFIX}" \
--output "${STAGE_DIR}/${GRUB_DIR}/${CORE_NAME}" \
"${CORE_MODULES[@]}"
info "Installing GRUB ${FLAGS_target} to ${FLAGS_disk_image##*/}"
LOOP_DEV=$(sudo losetup --find --show --partscan "${FLAGS_disk_image}") LOOP_DEV=$(sudo losetup --find --show --partscan "${FLAGS_disk_image}")
ESP_DIR=$(mktemp --directory) ESP_DIR=$(mktemp --directory)
@ -117,7 +96,33 @@ if [[ ! -b "${LOOP_DEV}p1" ]]; then
fi fi
sudo mount -t vfat "${LOOP_DEV}p1" "${ESP_DIR}" sudo mount -t vfat "${LOOP_DEV}p1" "${ESP_DIR}"
sudo cp -r "${STAGE_DIR}/." "${ESP_DIR}/." sudo mkdir -p "${ESP_DIR}/${GRUB_DIR}"
info "Compressing modules in ${GRUB_DIR}"
for file in "/usr/lib/grub/${FLAGS_target}"/*{.lst,.mod}; do
out="${ESP_DIR}/${GRUB_DIR}/${file##*/}"
gzip --best --stdout "${file}" | sudo_clobber "${out}"
done
info "Generating ${GRUB_DIR}/load.cfg"
# Include a small initial config in the core image to search for the ESP
# by filesystem ID in case the platform doesn't provide the boot disk.
# The existing $root value is given as a hint so it is searched first.
ESP_FSID=$(sudo grub-probe -t fs_uuid -d "${LOOP_DEV}p1")
sudo_clobber "${ESP_DIR}/${GRUB_DIR}/load.cfg" <<EOF
search.fs_uuid ${ESP_FSID} root \$root
set prefix=(\$root)/coreos/grub
set
EOF
info "Generating ${GRUB_DIR}/${CORE_NAME}"
sudo grub-mkimage \
--compression=auto \
--format "${FLAGS_target}" \
--prefix "(,gpt1)/coreos/grub" \
--config "${ESP_DIR}/${GRUB_DIR}/load.cfg" \
--output "${ESP_DIR}/${GRUB_DIR}/${CORE_NAME}" \
"${CORE_MODULES[@]}"
# This script will get called a few times, no need to re-copy grub.cfg # This script will get called a few times, no need to re-copy grub.cfg
if [[ ! -f "${ESP_DIR}/coreos/grub/grub.cfg" ]]; then if [[ ! -f "${ESP_DIR}/coreos/grub/grub.cfg" ]]; then
@ -136,9 +141,17 @@ case "${FLAGS_target}" in
x86_64-efi) x86_64-efi)
info "Installing default x86_64 UEFI bootloader." info "Installing default x86_64 UEFI bootloader."
sudo mkdir -p "${ESP_DIR}/EFI/boot" sudo mkdir -p "${ESP_DIR}/EFI/boot"
sudo cp "${STAGE_DIR}/${GRUB_DIR}/${CORE_NAME}" \ sudo cp "${ESP_DIR}/${GRUB_DIR}/${CORE_NAME}" \
"${ESP_DIR}/EFI/boot/bootx64.efi" "${ESP_DIR}/EFI/boot/bootx64.efi"
;; ;;
x86_64-xen)
info "Installing default x86_64 Xen bootloader."
sudo mkdir -p "${ESP_DIR}/xen" "${ESP_DIR}/boot/grub"
sudo cp "${ESP_DIR}/${GRUB_DIR}/${CORE_NAME}" \
"${ESP_DIR}/xen/pvboot-x86_64.elf"
sudo cp "${BUILD_LIBRARY_DIR}/menu.lst" \
"${ESP_DIR}/boot/grub/menu.lst"
;;
esac esac
cleanup cleanup

4
build_library/menu.lst Normal file
View File

@ -0,0 +1,4 @@
timeout 0
title CoreOS GRUB2
root (hd0,0)
kernel /xen/pvboot-x86_64.elf

51
build_library/qemu_xen.sh Executable file
View File

@ -0,0 +1,51 @@
#!/bin/sh
SCRIPT_DIR="`dirname "$0"`"
VM_NAME=
VM_IMAGE=
VM_MEMORY=
VM_NCPUS="`grep -c ^processor /proc/cpuinfo`"
SSH_PORT=2222
USAGE="Usage: $0 [-p PORT] [--] [qemu options...]
Options:
-p PORT The port on localhost to map to the VM's sshd. [2222]
-h this ;-)
QEMU wrapper script for a VM that is compatible with Xen:
- No x2apic, everything APIC related breaks when it is on.
- No virtio, simply does not work whatsoever under Xen.
Any arguments after -p will be passed through to qemu, -- may be
used as an explicit separator. See the qemu(1) man page for more details.
"
while [ $# -ge 1 ]; do
case "$1" in
-p|-ssh-port)
SSH_PORT="$2"
shift 2 ;;
-v|-verbose)
set -x
shift ;;
-h|-help|--help)
echo "$USAGE"
exit ;;
--)
shift
break ;;
*)
break ;;
esac
done
qemu-system-x86_64 \
-machine accel=kvm \
-cpu host,-x2apic \
-smp "${VM_NCPUS}" \
-name "$VM_NAME" \
-m ${VM_MEMORY} \
-net nic,vlan=0,model=e1000 \
-net user,vlan=0,hostfwd=tcp::"${SSH_PORT}"-:22,hostname="${VM_NAME}" \
-drive if=scsi,file="${SCRIPT_DIR}/${VM_IMAGE}" \
"$@"
exit $?

View File

@ -11,8 +11,8 @@ VALID_IMG_TYPES=(
iso iso
openstack openstack
qemu qemu
qemu_no_kexec
qemu_uefi qemu_uefi
qemu_xen
rackspace rackspace
rackspace_onmetal rackspace_onmetal
rackspace_vhd rackspace_vhd
@ -44,6 +44,7 @@ VALID_OEM_PACKAGES=(
hyperv hyperv
rackspace rackspace
rackspace-onmetal rackspace-onmetal
xendom0
vagrant vagrant
vagrant-key vagrant-key
vmware vmware
@ -69,9 +70,6 @@ VM_GENERATED_FILES=()
# If set to 0 then a partition skeleton won't be laid out on VM_TMP_IMG # If set to 0 then a partition skeleton won't be laid out on VM_TMP_IMG
IMG_DEFAULT_PARTITIONED_IMG=1 IMG_DEFAULT_PARTITIONED_IMG=1
# If set to 0 boot_kernel is skipped
IMG_DEFAULT_BOOT_KERNEL=1
# If set install the given package name to the OEM partition # If set install the given package name to the OEM partition
IMG_DEFAULT_OEM_PACKAGE= IMG_DEFAULT_OEM_PACKAGE=
@ -108,18 +106,17 @@ IMG_qemu_DISK_FORMAT=qcow2
IMG_qemu_DISK_LAYOUT=vm IMG_qemu_DISK_LAYOUT=vm
IMG_qemu_CONF_FORMAT=qemu IMG_qemu_CONF_FORMAT=qemu
IMG_qemu_no_kexec_BOOT_KERNEL=0
IMG_qemu_no_kexec_DISK_FORMAT=qcow2
IMG_qemu_no_kexec_DISK_LAYOUT=vm
IMG_qemu_no_kexec_CONF_FORMAT=qemu
IMG_qemu_uefi_BOOT_KERNEL=0
IMG_qemu_uefi_DISK_FORMAT=qcow2 IMG_qemu_uefi_DISK_FORMAT=qcow2
IMG_qemu_uefi_DISK_LAYOUT=vm IMG_qemu_uefi_DISK_LAYOUT=vm
IMG_qemu_uefi_CONF_FORMAT=qemu_uefi IMG_qemu_uefi_CONF_FORMAT=qemu_uefi
IMG_qemu_xen_DISK_FORMAT=qcow2
IMG_qemu_xen_DISK_LAYOUT=vm
IMG_qemu_xen_CONF_FORMAT=qemu_xen
IMG_qemu_xen_OEM_PACKAGE=oem-xendom0
IMG_qemu_xen_MEM=2048
## xen ## xen
IMG_xen_BOOT_KERNEL=0
IMG_xen_CONF_FORMAT=xl IMG_xen_CONF_FORMAT=xl
## virtualbox ## virtualbox
@ -156,7 +153,6 @@ IMG_vmware_insecure_CONF_FORMAT=vmware_zip
IMG_vmware_insecure_OEM_PACKAGE=oem-vagrant-key IMG_vmware_insecure_OEM_PACKAGE=oem-vagrant-key
## ami ## ami
IMG_ami_BOOT_KERNEL=0
IMG_ami_OEM_PACKAGE=oem-ec2-compat IMG_ami_OEM_PACKAGE=oem-ec2-compat
IMG_ami_OEM_USE=ec2 IMG_ami_OEM_USE=ec2
@ -186,12 +182,9 @@ IMG_iso_CONF_FORMAT=iso
IMG_gce_DISK_LAYOUT=vm IMG_gce_DISK_LAYOUT=vm
IMG_gce_CONF_FORMAT=gce IMG_gce_CONF_FORMAT=gce
IMG_gce_OEM_PACKAGE=oem-gce IMG_gce_OEM_PACKAGE=oem-gce
IMG_gce_FS_HOOK=gce
## rackspace ## rackspace
IMG_rackspace_BOOT_KERNEL=0
IMG_rackspace_OEM_PACKAGE=oem-rackspace IMG_rackspace_OEM_PACKAGE=oem-rackspace
IMG_rackspace_vhd_BOOT_KERNEL=0
IMG_rackspace_vhd_DISK_FORMAT=vhd IMG_rackspace_vhd_DISK_FORMAT=vhd
IMG_rackspace_vhd_OEM_PACKAGE=oem-rackspace IMG_rackspace_vhd_OEM_PACKAGE=oem-rackspace
@ -199,12 +192,9 @@ IMG_rackspace_vhd_OEM_PACKAGE=oem-rackspace
IMG_rackspace_onmetal_DISK_FORMAT=qcow2 IMG_rackspace_onmetal_DISK_FORMAT=qcow2
IMG_rackspace_onmetal_DISK_LAYOUT=onmetal IMG_rackspace_onmetal_DISK_LAYOUT=onmetal
IMG_rackspace_onmetal_OEM_PACKAGE=oem-rackspace-onmetal IMG_rackspace_onmetal_OEM_PACKAGE=oem-rackspace-onmetal
IMG_rackspace_onmetal_FS_HOOK=onmetal
## cloudstack ## cloudstack
IMG_cloudstack_BOOT_KERNEL=0
IMG_cloudstack_OEM_PACKAGE=oem-cloudstack IMG_cloudstack_OEM_PACKAGE=oem-cloudstack
IMG_cloudstack_vhd_BOOT_KERNEL=0
IMG_cloudstack_vhd_DISK_FORMAT=vhd IMG_cloudstack_vhd_DISK_FORMAT=vhd
IMG_cloudstack_vhd_OEM_PACKAGE=oem-cloudstack IMG_cloudstack_vhd_OEM_PACKAGE=oem-cloudstack
@ -216,13 +206,11 @@ IMG_exoscale_DISK_FORMAT=qcow2
IMG_exoscale_OEM_PACKAGE=oem-exoscale IMG_exoscale_OEM_PACKAGE=oem-exoscale
## azure ## azure
IMG_azure_BOOT_KERNEL=0
IMG_azure_DISK_FORMAT=vhd IMG_azure_DISK_FORMAT=vhd
IMG_azure_DISK_LAYOUT=azure IMG_azure_DISK_LAYOUT=azure
IMG_azure_OEM_PACKAGE=oem-azure IMG_azure_OEM_PACKAGE=oem-azure
## hyper-v ## hyper-v
IMG_hyperv_BOOT_KERNEL=0
IMG_hyperv_DISK_FORMAT=vhd IMG_hyperv_DISK_FORMAT=vhd
IMG_hyperv_OEM_PACKAGE=oem-hyperv IMG_hyperv_OEM_PACKAGE=oem-hyperv
@ -351,11 +339,6 @@ setup_disk_image() {
"${BUILD_LIBRARY_DIR}/disk_util" --disk_layout="${disk_layout}" \ "${BUILD_LIBRARY_DIR}/disk_util" --disk_layout="${disk_layout}" \
mount "${VM_TMP_IMG}" "${VM_TMP_ROOT}" mount "${VM_TMP_IMG}" "${VM_TMP_ROOT}"
local SYSLINUX_DIR="${VM_TMP_ROOT}/boot/syslinux"
if [[ $(_get_vm_opt BOOT_KERNEL) -eq 0 ]]; then
sudo mv "${SYSLINUX_DIR}/default.cfg.A" "${SYSLINUX_DIR}/default.cfg"
fi
# The only filesystems after this point that may be modified are OEM # The only filesystems after this point that may be modified are OEM
# and on rare cases ESP. # and on rare cases ESP.
# Note: it would be more logical for disk_util to mount things read-only # Note: it would be more logical for disk_util to mount things read-only
@ -406,31 +389,6 @@ _run_box_fs_hook() {
cp -R "${VM_TMP_ROOT}/usr/share/oem/box/." "${VM_TMP_DIR}/box" cp -R "${VM_TMP_ROOT}/usr/share/oem/box/." "${VM_TMP_DIR}/box"
} }
_run_onmetal_fs_hook() {
# HACKITY HACK until OEMs can customize bootloader configs
local arg='8250.nr_uarts=5 console=ttyS4,115200n8 modprobe.blacklist=mei_me'
local timeout=150 # 15 seconds
local totaltimeout=3000 # 5 minutes
sudo sed -i "${VM_TMP_ROOT}/boot/syslinux/boot_kernel.cfg" \
-e 's/console=[^ ]*//g' -e "s/\\(append.*$\\)/\\1 ${arg}/"
sudo sed -i "${VM_TMP_ROOT}/boot/syslinux/syslinux.cfg" \
-e "s/^TIMEOUT [0-9]*/TIMEOUT ${timeout}/g" \
-e "s/^TOTALTIMEOUT [0-9]*/TOTALTIMEOUT ${totaltimeout}/g"
}
_run_gce_fs_hook() {
# HACKITY HACK until OEMs can customize bootloader configs
local arg='console=ttyS0,115200n8'
sudo sed -i "${VM_TMP_ROOT}/boot/syslinux/boot_kernel.cfg" \
-e 's/console=[^ ]*//g' -e "s/\\(append.*$\\)/\\1 ${arg}/"
}
_run_azure_fs_hook() {
# HACKITY HACK until OEMs can customize bootloader configs
local arg='console=ttyS0,115200n8'
sudo sed -i "${VM_TMP_ROOT}/boot/syslinux/boot_kernel.cfg" \
-e 's/console=[^ ]*//g' -e "s/\\(append.*$\\)/\\1 ${arg}/"
}
# Write the vm disk image to the target directory in the proper format # Write the vm disk image to the target directory in the proper format
write_vm_disk() { write_vm_disk() {
if [[ $(_get_vm_opt PARTITIONED_IMG) -eq 1 ]]; then if [[ $(_get_vm_opt PARTITIONED_IMG) -eq 1 ]]; then
@ -606,6 +564,21 @@ _write_qemu_uefi_conf() {
VM_GENERATED_FILES+=( "$(_dst_dir)/${ovmf_ro}" "$(_dst_dir)/${ovmf_rw}" ) VM_GENERATED_FILES+=( "$(_dst_dir)/${ovmf_ro}" "$(_dst_dir)/${ovmf_rw}" )
} }
_write_qemu_xen_conf() {
local script="$(_dst_dir)/$(_dst_name ".sh")"
local dst_name=$(basename "$VM_DST_IMG")
local vm_mem="$(_get_vm_opt MEM)"
sed -e "s%^VM_NAME=.*%VM_NAME='${VM_NAME}'%" \
-e "s%^VM_IMAGE=.*%VM_IMAGE='${dst_name}'%" \
-e "s%^VM_MEMORY=.*%VM_MEMORY='${vm_mem}'%" \
"${BUILD_LIBRARY_DIR}/qemu_xen.sh" > "${script}"
checkbashisms --posix "${script}" || die
chmod +x "${script}"
VM_GENERATED_FILES+=( "${script}" )
}
_write_pxe_conf() { _write_pxe_conf() {
local script="$(_dst_dir)/$(_dst_name ".sh")" local script="$(_dst_dir)/$(_dst_name ".sh")"
local vmlinuz_name="$(_dst_name ".vmlinuz")" local vmlinuz_name="$(_dst_name ".vmlinuz")"