Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add metal-bios and metal-uefi targets #305

Merged
merged 4 commits into from
Feb 6, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 35 additions & 10 deletions src/cmd-build
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ Usage: coreos-assembler build --help
Valid image types:

- qemu
- metal-bios
- metal-uefi
EOF
}

Expand Down Expand Up @@ -227,23 +229,36 @@ else
extraargs="${extraargs} --kickstart ${image_input}"
fi

# This generates the "base image"; not specific to a platform.
# We want extraargs var to be split on words
# shellcheck disable=SC2086
/usr/lib/coreos-assembler/virt-install --dest="${PWD}"/"${img_base}" \
--create-disk --kickstart-out "${PWD}"/tmp/flattened.ks \
--ostree-remote="${name}" --ostree-stateroot="${name}" \
--ostree-ref="${ref:-${commit}}" \
--location "${workdir}"/installer/*.iso \
--ostree-repo="${workdir}"/repo ${extraargs-}
/usr/lib/coreos-assembler/gf-anaconda-cleanup "$(pwd)"/"${img_base}"
set +x
# This generates the "base image"; not specific to a platform.
run_virtinstall() {
dest=$1
shift
tmpdest="${dest}.tmp"
# We want extraargs var to be split on words
# shellcheck disable=SC2086
/usr/lib/coreos-assembler/virt-install --create-disk --dest=${tmpdest} \
--kickstart-out "${PWD}"/tmp/flattened.ks \
--ostree-remote="${name}" --ostree-stateroot="${name}" \
--ostree-ref="${ref:-${commit}}" \
--location "${workdir}"/installer/*.iso \
--ostree-repo="${workdir}"/repo ${extraargs-} "$@"
mv "${tmpdest}" "${dest}"
}

build_cloud_base() {
if [ -f "${PWD}/${img_base}" ]; then
return
cgwalters marked this conversation as resolved.
Show resolved Hide resolved
fi
run_virtinstall "${PWD}"/"${img_base}" --variant=cloud
}

declare -A images
for itype in "${IMAGE_TYPES[@]}"; do
case $itype in
qemu) img_qemu=${imageprefix}-qemu.qcow2
images[$itype]="${img_qemu}"
build_cloud_base
/usr/lib/coreos-assembler/gf-oemid "$(pwd)"/"${img_base}" "$(pwd)"/"${img_qemu}" qemu
# Clear the MCS SELinux labels
# See https://github.com/coreos/coreos-assembler/issues/292
Expand All @@ -252,6 +267,16 @@ for itype in "${IMAGE_TYPES[@]}"; do
# TODO: Remove this, things should be parsing the metadata
ln -s "${img_qemu}" "${name}"-qemu.qcow2
;;
metal-bios)
img_metalbios=${imageprefix}-metal-bios.raw
images[$itype]="${img_metalbios}"
run_virtinstall "$(pwd)"/"${img_metalbios}" --variant=metal
cgwalters marked this conversation as resolved.
Show resolved Hide resolved
;;
metal-uefi)
img_metaluefi=${imageprefix}-metal-uefi.raw
images[$itype]="${img_metaluefi}"
run_virtinstall "$(pwd)"/"${img_metaluefi}" --variant=metal-uefi
;;
*) fatal "Unrecognized image type: $itype"
;;
esac
Expand Down
13 changes: 13 additions & 0 deletions src/gf-anaconda-cleanup
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/usr/bin/env bash
# This runs after virt-install to undo things leftover from Anaconda.
set -euo pipefail

dn=$(dirname "$0")
Expand All @@ -8,8 +9,20 @@ dn=$(dirname "$0")
. "${dn}"/libguestfish.sh

src="$1"
shift
skip_partition_fixups=
if [ "${1:-}" = "--skip-partition-fixups" ]; then
skip_partition_fixups=1
shift
fi

set -x
if [ "${skip_partition_fixups}" != 1 ]; then
coreos_gf_run "${src}"
# We don't have a way to do this with Anaconda/kickstart right now.
# This bootstraps us to be able to do all of the mounts.
coreos_gf set-label /dev/sda2 boot
fi
coreos_gf_run_mount "${src}"

# Both of these are written by Anaconda
Expand Down
26 changes: 2 additions & 24 deletions src/image-base.ks
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,13 @@ firewall --disabled
network --bootproto=dhcp --onboot=on

zerombr
clearpart --initlabel --all
# Add the following to kernel boot args:
# - ip=dhcp # how to get network
# - rd.neednet=1 # tell dracut we need network
# - rootflags=defaults,prjquota # enable prjquota for quota enablement for containers
# # https://bugzilla.redhat.com/show_bug.cgi?id=1658386
# - $ignition_firstboot # This is actually a GRUB variable
bootloader --timeout=1 --append="no_timer_check console=ttyS0,115200n8 console=tty0 net.ifnames=0 biosdevname=0 ip=dhcp rd.neednet=1 rw rootflags=defaults,prjquota $ignition_firstboot"
clearpart --initlabel --all --disklabel=gpt

# https://github.com/coreos/fedora-coreos-tracker/issues/18
# See also coreos-growpart.service defined in fedora-coreos-base.yaml
# You can change this partition layout, but note that the `boot` and `root`
# filesystem labels are currently mandatory (they're interpreted by coreos-assembler).
part /boot --size=300 --fstype="xfs" --label=boot
reqpart --add-boot
# Note no reflinks for /boot since the bootloader may not understand them
part / --size=3000 --fstype="xfs" --label=root --grow --mkfsoptions="-m reflink=1"

Expand All @@ -44,19 +37,4 @@ reboot

# Remove any persistent NIC rules generated by udev
rm -vf /etc/udev/rules.d/*persistent-net*.rules

# By default, we do DHCP. Also, due to the above disabling
# of biosdevname/net.ifnames, this uses eth0.
cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Ethernet"
PERSISTENT_DHCLIENT="yes"
NM_CONTROLLED="yes"
EOF

# Anaconda is writing a /etc/resolv.conf from the generating environment.
# The system should start out with an empty file.
truncate -s 0 /etc/resolv.conf
%end
20 changes: 20 additions & 0 deletions src/image-cloud.ks
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# ip=dhcp and rd.neednet=1 enable networking in the initramfs
# We use net.ifnames in cloud environments
# no_timer_check is something we're cargo culting around
# console= args are also for clouds
# The other ones are for Ignition and are also in image-metal.ks;
# change them there first.
bootloader --timeout=1 --append="no_timer_check console=ttyS0,115200n8 console=tty0 net.ifnames=0 biosdevname=0 ip=dhcp rd.neednet=1 rootflags=defaults,prjquota rw $ignition_firstboot"

%post --erroronfail
# By default, we do DHCP. Also, due to the above disabling
# of biosdevname/net.ifnames, this uses eth0.
cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Ethernet"
PERSISTENT_DHCLIENT="yes"
NM_CONTROLLED="yes"
EOF
%end
4 changes: 4 additions & 0 deletions src/image-metal.ks
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# If you add something here, also update image-cloud.ks.
# prjquota is for quota enablement for containers: https://bugzilla.redhat.com/show_bug.cgi?id=1658386
# rw and $ignition_firstboot are used by https://github.com/coreos/ignition-dracut/
bootloader --append="rootflags=defaults,prjquota rw $ignition_firstboot"
cgwalters marked this conversation as resolved.
Show resolved Hide resolved
16 changes: 14 additions & 2 deletions src/libguestfish.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ export LIBGUESTFS_BACKEND=direct
# http://libguestfs.org/guestfish.1.html#using-remote-control-robustly-from-shell-scripts
GUESTFISH_PID=
coreos_gf_launch() {
if [ -n "$GUESTFISH_PID" ]; then
return
fi
local src=$1
shift
local guestfish
Expand All @@ -32,11 +35,20 @@ coreos_gf() {
guestfish --remote -- "$@"
}

GUESTFISH_RUNNING=
coreos_gf_run() {
if [ -n "$GUESTFISH_RUNNING" ]; then
return
fi
coreos_gf_launch "$@"
coreos_gf run
GUESTFISH_RUNNING=1
}

# Run libguestfs and mount the root and boot partitions.
# Export `stateroot` and `deploydir` variables.
coreos_gf_run_mount() {
coreos_gf_launch "$@"
coreos_gf run
coreos_gf_run "$@"
local root
root=$(coreos_gf findfs-label root)
coreos_gf mount "${root}" /
Expand Down
24 changes: 23 additions & 1 deletion src/virt-install
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ parser.add_argument("--create-disk", help="Automatically create disk as qcow2, p
action='store_true')
parser.add_argument("--image-config", help="coreos-assembler image.yaml",
action='store')
parser.add_argument("--variant", help="Use an internal (kickstart) config",
choices=('metal', 'metal-uefi', 'cloud'), default=None)
parser.add_argument("--kickstart", help="Kickstart path",
action='store')
parser.add_argument("--kickstart-out", help="Save flattened kickstart",
Expand Down Expand Up @@ -86,6 +88,14 @@ else:

disk_size = None

if args.variant is not None:
if args.variant == 'metal-uefi':
variant_ks = 'metal'
else:
variant_ks = args.variant
with open(f'/usr/lib/coreos-assembler/image-{variant_ks}.ks') as f:
shutil.copyfileobj(f, ks_tmp)

if args.image_config:
with open('/usr/lib/coreos-assembler/image-base.ks') as basef:
shutil.copyfileobj(basef, ks_tmp)
Expand Down Expand Up @@ -155,7 +165,11 @@ if args.create_disk and args.kickstart:
fatal("--create-disk specified, but failed to find '{}' in kickstart".format(magic_virt_install_size_str))

if args.create_disk:
run_sync_verbose(['qemu-img', 'create', '-f', 'qcow2', args.dest, '{}G'.format(disk_size)])
if args.variant in ('metal', 'metal-uefi'):
fmt = 'raw'
else:
fmt = 'qcow2'
run_sync_verbose(['qemu-img', 'create', '-f', fmt, args.dest, '{}G'.format(disk_size)])
print("Created initial disk: {} with size {}G".format(args.dest, disk_size))

# Now a hack to avoid libvirt race conditions; it's
Expand Down Expand Up @@ -215,7 +229,15 @@ try:
"--disk=path={},cache=unsafe".format(args.dest),
"--initrd-inject={}".format(ks_tmp.name),
"--extra-args", "ks=file://{} console=tty0 console=ttyS0,115200n8 inst.cmdline inst.notmux".format(os.path.basename(ks_tmp.name))])
if args.variant == 'metal-uefi':
vinstall_args.append('--boot=uefi')
run_sync_verbose(vinstall_args)
# And strip out all of the Anaconda stuff in /var; this uses libguestfs
# to ensure we fully control the code.
cleanup_argv = ['/usr/lib/coreos-assembler/gf-anaconda-cleanup', args.dest]
if args.image_config is None:
cleanup_argv.append('--skip-partition-fixups')
run_sync_verbose(cleanup_argv)
finally:
subprocess.call(['virsh', '--connect=qemu:///session', 'undefine', domain])
if tail_proc is not None:
Expand Down