mirror of
https://github.com/flatcar/scripts.git
synced 2025-11-13 14:41:37 +01:00
Merge pull request #359 from marineam/grub
grub: the one bootloader to rule them all
This commit is contained in:
commit
3a94b02f1d
@ -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" \
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
@ -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
4
build_library/menu.lst
Normal 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
51
build_library/qemu_xen.sh
Executable 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 $?
|
||||||
@ -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")"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user