build: switch from SYSLINUX to GRUB2

The new grub install script must be called after the image is unmounted
and the old bootloaders script doesn't need to touch grub at all. For
now we will continue to use the existing syslinux configs but
interpreted by grub. Beyond the grub menu flashing by during boot
everything should still be functionally equivalent.
This commit is contained in:
Michael Marineau 2014-09-05 19:24:41 -07:00
parent 12a9900e02
commit 5bfa0c8d20
3 changed files with 23 additions and 58 deletions

View File

@ -204,6 +204,7 @@ finish_image() {
local disk_layout="$2" local disk_layout="$2"
local root_fs_dir="$3" local root_fs_dir="$3"
local image_contents="$4" local image_contents="$4"
local install_grub=0
local disk_img="${BUILD_DIR}/${image_name}" local disk_img="${BUILD_DIR}/${image_name}"
@ -220,10 +221,10 @@ finish_image() {
# Only configure bootloaders if there is a boot partition # Only configure bootloaders if there is a boot partition
if mountpoint -q "${root_fs_dir}"/boot; then if mountpoint -q "${root_fs_dir}"/boot; then
install_grub=1
${BUILD_LIBRARY_DIR}/configure_bootloaders.sh \ ${BUILD_LIBRARY_DIR}/configure_bootloaders.sh \
--arch=${ARCH} \ --arch=${ARCH} \
--disk_layout="${disk_layout}" \ --disk_layout="${disk_layout}" \
--disk_image="${disk_img}" \
--boot_dir="${root_fs_dir}"/usr/boot \ --boot_dir="${root_fs_dir}"/usr/boot \
--esp_dir="${root_fs_dir}"/boot \ --esp_dir="${root_fs_dir}"/boot \
--boot_args="${FLAGS_boot_args}" --boot_args="${FLAGS_boot_args}"
@ -249,4 +250,13 @@ finish_image() {
rm -rf "${BUILD_DIR}"/configroot rm -rf "${BUILD_DIR}"/configroot
cleanup_mounts "${root_fs_dir}" cleanup_mounts "${root_fs_dir}"
trap - EXIT trap - EXIT
# This script must mount the ESP partition differently, so run it after unmount
if [[ "${install_grub}" -eq 1 ]]; then
local target
for target in i386-pc x86_64-efi; do
${BUILD_LIBRARY_DIR}/grub_install.sh \
--target="${target}" --disk_image="${disk_img}"
done
fi
} }

View File

@ -24,7 +24,6 @@ DEFINE_string boot_args "" \
"Additional boot arguments to pass to the commandline (Default: '')" "Additional boot arguments to pass to the commandline (Default: '')"
DEFINE_string disk_layout "base" \ DEFINE_string disk_layout "base" \
"The disk layout type to use for this image." "The disk layout type to use for this image."
DEFINE_string disk_image "" "The disk image."
# Parse flags # Parse flags
FLAGS "$@" || exit 1 FLAGS "$@" || exit 1
@ -52,6 +51,7 @@ SYSLINUX_DIR="${FLAGS_boot_dir}/syslinux"
# Build configuration files for pygrub/pvgrub # Build configuration files for pygrub/pvgrub
configure_pvgrub() { configure_pvgrub() {
info "Installing legacy PV-GRUB configuration"
sudo mkdir -p "${GRUB_DIR}" sudo mkdir -p "${GRUB_DIR}"
# Add hvc0 for hypervisors # Add hvc0 for hypervisors
@ -68,18 +68,21 @@ title CoreOS B Root
root (hd0,0) root (hd0,0)
kernel /syslinux/vmlinuz.B ${grub_args} ${slot_b_args} kernel /syslinux/vmlinuz.B ${grub_args} ${slot_b_args}
EOF EOF
info "Emitted ${GRUB_DIR}/menu.lst.A"
sudo_clobber "${GRUB_DIR}/menu.lst.B" <<EOF sudo_clobber "${GRUB_DIR}/menu.lst.B" <<EOF
default 1 default 1
$(< "${GRUB_DIR}/menu.lst.A")
EOF EOF
sudo_append "${GRUB_DIR}/menu.lst.B" <"${GRUB_DIR}/menu.lst.A" sudo cp "${GRUB_DIR}/menu.lst.A" "${GRUB_DIR}/menu.lst"
info "Emitted ${GRUB_DIR}/menu.lst.B"
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
configure_syslinux() { configure_syslinux() {
info "Installing legacy SYSLINUX configuration"
sudo mkdir -p "${SYSLINUX_DIR}" sudo mkdir -p "${SYSLINUX_DIR}"
# Add ttyS0 as a secondary console, useful for qemu -nographic # Add ttyS0 as a secondary console, useful for qemu -nographic
@ -91,7 +94,6 @@ configure_syslinux() {
fi fi
sudo_clobber "${SYSLINUX_DIR}/syslinux.cfg" <<EOF sudo_clobber "${SYSLINUX_DIR}/syslinux.cfg" <<EOF
SERIAL 0 115200
PROMPT 1 PROMPT 1
# display boot: prompt for a half second # display boot: prompt for a half second
TIMEOUT 5 TIMEOUT 5
@ -109,22 +111,10 @@ include /syslinux/root.A.cfg
# coreos.B # coreos.B
include /syslinux/root.B.cfg include /syslinux/root.B.cfg
EOF EOF
info "Emitted ${SYSLINUX_DIR}/syslinux.cfg"
sudo_clobber "${SYSLINUX_DIR}/default.cfg" <<EOF sudo_clobber "${SYSLINUX_DIR}/default.cfg" <<<"DEFAULT boot_kernel"
DEFAULT boot_kernel sudo_clobber "${SYSLINUX_DIR}/default.cfg.A" <<<"DEFAULT coreos.A"
EOF sudo_clobber "${SYSLINUX_DIR}/default.cfg.B" <<<"DEFAULT coreos.B"
info "Emitted ${SYSLINUX_DIR}/default.cfg"
sudo_clobber "${SYSLINUX_DIR}/default.cfg.A" <<EOF
DEFAULT coreos.A
EOF
info "Emitted ${SYSLINUX_DIR}/default.cfg.A"
sudo_clobber "${SYSLINUX_DIR}/default.cfg.B" <<EOF
DEFAULT coreos.B
EOF
info "Emitted ${SYSLINUX_DIR}/default.cfg.B"
# Different files are used so that the updater can only touch the file it # 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 # needs to for a given change. This will minimize any potential accidental
@ -135,7 +125,6 @@ label boot_kernel
kernel vmlinuz-boot_kernel kernel vmlinuz-boot_kernel
append ${syslinux_args} ${gptprio_args} append ${syslinux_args} ${gptprio_args}
EOF EOF
info "Emitted ${SYSLINUX_DIR}/boot_kernel.cfg"
sudo_clobber "${SYSLINUX_DIR}/root.A.cfg" <<EOF sudo_clobber "${SYSLINUX_DIR}/root.A.cfg" <<EOF
label coreos.A label coreos.A
@ -143,7 +132,6 @@ label coreos.A
kernel vmlinuz.A kernel vmlinuz.A
append ${syslinux_args} ${slot_a_args} append ${syslinux_args} ${slot_a_args}
EOF EOF
info "Emitted ${SYSLINUX_DIR}/root.A.cfg"
sudo_clobber "${SYSLINUX_DIR}/root.B.cfg" <<EOF sudo_clobber "${SYSLINUX_DIR}/root.B.cfg" <<EOF
label coreos.B label coreos.B
@ -151,25 +139,9 @@ label coreos.B
kernel vmlinuz.B kernel vmlinuz.B
append ${syslinux_args} ${slot_b_args} append ${syslinux_args} ${slot_b_args}
EOF EOF
info "Emitted ${SYSLINUX_DIR}/root.B.cfg"
}
# Copy configurations to the ESP, this is what is actually used to boot
copy_to_esp() {
if ! mountpoint -q "${FLAGS_esp_dir}"; then
die "${FLAGS_esp_dir} is not a mount point."
fi
sudo mkdir -p "${FLAGS_esp_dir}"/{syslinux,boot/grub,EFI/boot}
sudo cp -r "${GRUB_DIR}/." "${FLAGS_esp_dir}/boot/grub"
sudo cp -r "${SYSLINUX_DIR}/." "${FLAGS_esp_dir}/syslinux" sudo cp -r "${SYSLINUX_DIR}/." "${FLAGS_esp_dir}/syslinux"
# Install UEFI bootloader
sudo cp /usr/share/syslinux/efi64/ldlinux.e64 \
"${FLAGS_esp_dir}/EFI/boot/ldlinux.e64"
sudo cp /usr/share/syslinux/efi64/syslinux.efi \
"${FLAGS_esp_dir}/EFI/boot/bootx64.efi"
# Stage all kernels with the only one we built. # Stage all kernels with the only one we built.
for kernel in syslinux/{vmlinuz-boot_kernel,vmlinuz.A,vmlinuz.B} for kernel in syslinux/{vmlinuz-boot_kernel,vmlinuz.A,vmlinuz.B}
do do
@ -177,28 +149,11 @@ copy_to_esp() {
done done
} }
# Install GRUB2 to the disk image
install_grub() {
# Install under boot/coreos/grub instead of boot/grub to prevent
# more recent versions of pygrub that attempt to read grub2 configs
# from finding it, pygrub and pvgrub must stick with using menu.lst
sudo mkdir -p "${FLAGS_esp_dir}/coreos/grub"
sudo grub-install \
--target=i386-pc \
--modules=part_gpt \
--boot-directory="${FLAGS_esp_dir}/coreos" \
"${FLAGS_disk_image}"
sudo cp "${BUILD_LIBRARY_DIR}/grub.cfg" \
"${FLAGS_esp_dir}/coreos/grub/grub.cfg"
}
[[ -d "${FLAGS_esp_dir}" ]] || die_notrace "--esp_dir is required" [[ -d "${FLAGS_esp_dir}" ]] || die_notrace "--esp_dir is required"
[[ -f "${FLAGS_disk_image}" ]] || die_notrace "--disk_image is required"
if [[ "${FLAGS_arch}" = "x86" || "${FLAGS_arch}" = "amd64" ]]; then if [[ "${FLAGS_arch}" = "x86" || "${FLAGS_arch}" = "amd64" ]]; then
configure_pvgrub configure_pvgrub
configure_syslinux configure_syslinux
copy_to_esp
else else
error "No bootloader configuration for ${FLAGS_arch}" error "No bootloader configuration for ${FLAGS_arch}"
fi fi

View File

@ -13,7 +13,7 @@
"blocks":"262144", "blocks":"262144",
"fs_type":"vfat", "fs_type":"vfat",
"mount":"/boot", "mount":"/boot",
"features": ["syslinux"] "features": ["hybrid"]
}, },
"2":{ "2":{
"label":"BIOS-BOOT", "label":"BIOS-BOOT",