Skip to content

Commit

Permalink
Add metal-bios target
Browse files Browse the repository at this point in the history
Split out the "net.ifnames" stuff into a separate kickstart, and
generate a raw disk image `metal-bios` if specified.

Note to really be useful this requires Ignition to load `/boot/config.ign`
or so.
  • Loading branch information
cgwalters committed Feb 6, 2019
1 parent 4d4cdaf commit d031de5
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 35 deletions.
44 changes: 32 additions & 12 deletions src/cmd-build
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Usage: coreos-assembler build --help
Valid image types:
- qemu
- metal-bios
EOF
}

Expand Down Expand Up @@ -58,8 +59,9 @@ while true; do
done

declare -a IMAGE_TYPES
for itype in "$@"; do
IMAGE_TYPES[]="$itype"
# shellcheck disable=SC2068
for itype in $@; do
IMAGE_TYPES+=("$itype")
done
if [ "${IMAGE_TYPES[*]}" == 0 ]; then
IMAGE_TYPES=(qemu)
Expand Down Expand Up @@ -224,23 +226,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
# We want extraargs var to be split on words
# shellcheck disable=SC2086
/usr/lib/coreos-assembler/virt-install --create-disk --dest=${dest} \
--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-} "$@"
# And strip out all of the Anaconda stuff in /var
/usr/lib/coreos-assembler/gf-anaconda-cleanup "${dest}"
}

build_cloud_base() {
if [ -f "$(pwd)/${img_base}" ]; then
return
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 @@ -249,6 +264,11 @@ 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
;;
*) fatal "Unrecognized image type: $itype"
;;
esac
Expand Down
22 changes: 0 additions & 22 deletions src/image-base.ks
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,6 @@ 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"

# https://github.com/coreos/fedora-coreos-tracker/issues/18
# See also coreos-growpart.service defined in fedora-coreos-base.yaml
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"
12 changes: 11 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', '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,10 @@ else:

disk_size = None

if args.variant is not None:
with open(f'/usr/lib/coreos-assembler/image-{args.variant}.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 +161,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 == 'metal':
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

0 comments on commit d031de5

Please sign in to comment.