5abb4a4f12
Initial support for a centos7 image. This is separate to rhel7 because the major differences are things like repo and image locations, which are always going to be different. We should merge any real changes into the redhat-common layers. Apart from the added support files in centos7/*, the other change is mostly modifications to redhat-common's extract-image to handle different partition layouts of the centos7 image. Change-Id: I943abe5ff0a803f36eda266a79af0d9220edcae7
159 lines
5.4 KiB
Bash
Executable file
159 lines
5.4 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Configure grub. Note that the various conditionals here are to handle
|
|
# different distributions gracefully.
|
|
|
|
set -eux
|
|
set -o pipefail
|
|
|
|
# FIXME:
|
|
[ -n "$IMAGE_BLOCK_DEVICE" ]
|
|
PART_DEV=$IMAGE_BLOCK_DEVICE
|
|
BOOT_DEV=$(echo $IMAGE_BLOCK_DEVICE | sed -e 's#p1##' | sed -e 's#mapper/##')
|
|
|
|
function install_extlinux {
|
|
install-packages extlinux
|
|
|
|
echo "Installing Extlinux..."
|
|
|
|
MBR=/usr/share/syslinux/mbr.bin
|
|
if [ ! -f $MBR ]; then
|
|
MBR=/usr/lib/syslinux/mbr.bin
|
|
if [ ! -f $MBR ]; then
|
|
echo "mbr.bin (from SYSLINUX) not found."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
dd if=$MBR of=$BOOT_DEV
|
|
|
|
mkdir -p /boot/syslinux
|
|
extlinux --install /boot/syslinux
|
|
}
|
|
|
|
function install_grub2 {
|
|
|
|
# Check for offline installation of grub
|
|
if [ -f "/tmp/grub/install" ] ; then
|
|
source /tmp/grub/install
|
|
else
|
|
install-packages grub-pc
|
|
fi
|
|
|
|
# XXX: grub-probe on the nbd0/loop0 device returns nothing - workaround, manually
|
|
# specify modules. https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1073731
|
|
GRUBNAME=$(which grub-install) || echo "trying grub2-install"
|
|
if [ -z "$GRUBNAME" ]; then
|
|
GRUBNAME=$(which grub2-install)
|
|
fi
|
|
|
|
# If no GRUB2 is found, fallback to extlinux
|
|
if [ -z "$GRUBNAME" ] || [ $($GRUBNAME --version | grep "0.97" | wc -l) -ne 0 ]; then
|
|
echo "No GRUB2 found. Fallback to Extlinux..."
|
|
install_extlinux
|
|
exit 0
|
|
fi
|
|
|
|
echo "Installing GRUB2..."
|
|
|
|
GRUB_OPTS=${GRUB_OPTS:-""}
|
|
# XXX: This is buggy:
|
|
# - --target=i386-pc is invalid for non-i386/amd64 architectures
|
|
# - and for UEFI too.
|
|
# GRUB_OPTS="$GRUB_OPTS --target=i386-pc"
|
|
if [[ ! $GRUB_OPTS == *--target* ]] && [[ $($GRUBNAME --version) =~ ' 2.' ]]; then
|
|
# /sys/ comes from the host machine. If the host machine is using EFI
|
|
# but the image being built doesn't have EFI boot-images installed we
|
|
# should set the --target to use a BIOS-based boot-image.
|
|
#
|
|
# * --target tells grub what's the target platform
|
|
# * the boot images are placed in /usr/lib/grub/<cpu>-<platform>
|
|
# * i386-pc is used for BIOS-based machines
|
|
# http://www.gnu.org/software/grub/manual/grub.html#Installation
|
|
#
|
|
if [ -d /sys/firmware/efi ]; then
|
|
if [ ! -d /usr/lib/grub/*-efi ]; then
|
|
case $ARCH in
|
|
"x86_64"|"amd64")
|
|
GRUB_OPTS="$GRUB_OPTS --target=i386-pc"
|
|
;;
|
|
"i386")
|
|
target=i386-pc
|
|
if [ -e /proc/device-tree ]; then
|
|
for x in /proc/device-tree/*; do
|
|
if [ -e "$x" ]; then
|
|
target="i386-ieee1275"
|
|
fi
|
|
done
|
|
fi
|
|
GRUB_OPTS="$GRUB_OPTS --target=$target"
|
|
;;
|
|
esac
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
$GRUBNAME --modules="biosdisk part_msdos" $GRUB_OPTS $BOOT_DEV
|
|
|
|
# This might be better factored out into a per-distro 'install-bootblock'
|
|
# helper.
|
|
if [ -d /boot/grub2 ]; then
|
|
GRUB_CFG=/boot/grub2/grub.cfg
|
|
elif [ -d /boot/grub ]; then
|
|
GRUB_CFG=/boot/grub/grub.cfg
|
|
fi
|
|
|
|
DIST=`lsb_release -is`
|
|
[ -n "$DIST" ]
|
|
echo 'GRUB_TERMINAL=console' >>/etc/default/grub
|
|
echo 'GRUB_GFXPAYLOAD_LINUX=text' >>/etc/default/grub
|
|
GRUB_MKCONFIG="grub2-mkconfig -o $GRUB_CFG"
|
|
case $DIST in
|
|
'Ubuntu'|'Debian')
|
|
sed -i -e 's/\(^GRUB_CMDLINE_LINUX.*\)"$/\1 nofb nomodeset vga=normal"/' /etc/default/grub
|
|
GRUB_MKCONFIG=update-grub
|
|
;;
|
|
'Fedora'|'CentOS')
|
|
echo 'GRUB_CMDLINE_LINUX="nofb nomodeset vga=normal"' >>/etc/default/grub
|
|
;;
|
|
'openSUSE project')
|
|
sed -i -e 's/\(^GRUB_CMDLINE_LINUX.*\)"$/\1 nofb nomodeset vga=normal"/' /etc/default/grub
|
|
;;
|
|
esac
|
|
$GRUB_MKCONFIG
|
|
|
|
RELEASE=`lsb_release -cs`
|
|
[ -n "$RELEASE" ]
|
|
# grub-mkconfig generates a config with the device in it,
|
|
# This shouldn't be needed, but old code has bugs
|
|
if [ $RELEASE = 'precise' ] || [ $RELEASE = 'wheezy' ]; then
|
|
sed -i "s%search --no.*%%" $GRUB_CFG
|
|
sed -i "s%set root=.*%set root=(hd0,1)%" $GRUB_CFG
|
|
fi
|
|
# force use of a LABEL:
|
|
# NOTE: Updating the grub config by hand once deployed should work, its just
|
|
# prepping it in a different environment that needs fiddling.
|
|
sed -i "s%$PART_DEV%LABEL=cloudimg-rootfs%" $GRUB_CFG
|
|
sed -i "s%search --no-floppy --fs-uuid --set=root .*$%search --no-floppy --set=root --label cloudimg-rootfs%" $GRUB_CFG
|
|
sed -i "s%root=UUID=[A-Za-z0-9\-]*%root=LABEL=cloudimg-rootfs%" $GRUB_CFG
|
|
if [ "$DIST" = 'Debian' ] || [ "$DIST" = 'Fedora' ]; then
|
|
# enable serial console
|
|
sed -i "s%LABEL=cloudimg-rootfs%LABEL=cloudimg-rootfs console=tty0 console=ttyS0,115200%" $GRUB_CFG
|
|
fi
|
|
if [ "$DIST" = 'Fedora' ] ; then
|
|
if [ $(lsb_release -rs) = '19' ]; then
|
|
sed -i "s%UUID=[A-Za-z0-9\-]*%LABEL=cloudimg-rootfs%" /etc/fstab
|
|
fi
|
|
# Fix efi specific instructions in grub config file
|
|
if [ -d /sys/firmware/efi ]; then
|
|
sed -i 's%\(initrd\|linux\)efi /boot%\1 /boot%g' $GRUB_CFG
|
|
fi
|
|
fi
|
|
}
|
|
|
|
DIB_EXTLINUX=${DIB_EXTLINUX:-0}
|
|
if [ "$DIB_EXTLINUX" != "0" ]; then
|
|
install_extlinux
|
|
else
|
|
install_grub2
|
|
fi
|