Add --dracut-conf cmdline argument to lorax and livemedia-creator

This adds the ability to use a dracut.conf file instead of passing
--dracut-arg on the cmdline multiple times.
This commit is contained in:
Brian C. Lane 2020-01-10 17:07:43 -08:00
parent a60cef3e1e
commit a0fce98109
6 changed files with 98 additions and 26 deletions

View File

@ -236,7 +236,9 @@ def make_compose(cfg, results_dir):
cfg_dict["lorax_templates"] = find_templates(cfg.share_dir)
cfg_dict["tmp"] = cfg.tmp
cfg_dict["dracut_args"] = None # Use default args for dracut
# Use default args for dracut
cfg_dict["dracut_conf"] = None
cfg_dict["dracut_args"] = None
# TODO How to support other arches?
cfg_dict["arch"] = None

View File

@ -113,12 +113,15 @@ def lorax_parser(dracut_default=""):
help="Use a plain squashfs filesystem for the runtime.")
# dracut arguments
dracut_group = parser.add_argument_group("dracut arguments")
dracut_group = parser.add_argument_group("dracut arguments: (default: %s)" % dracut_default)
dracut_group.add_argument("--dracut-conf",
help="Path to a dracut.conf file to use instead of the "
"default arguments. See the dracut.conf(5) manpage.")
dracut_group.add_argument("--dracut-arg", action="append", dest="dracut_args",
help="Argument to pass to dracut when "
"rebuilding the initramfs. Pass this "
"once for each argument. NOTE: this "
"overrides the default. (default: %s)" % dracut_default)
"overrides the defaults.")
# add the show version option
parser.add_argument("-V", help="show program's version number and exit",
@ -268,12 +271,15 @@ def lmc_parser(dracut_default=""):
help="RNG device for QEMU (none for no RNG)")
# dracut arguments
dracut_group = parser.add_argument_group("dracut arguments")
dracut_group = parser.add_argument_group("dracut arguments: (default: %s)" % dracut_default)
dracut_group.add_argument("--dracut-conf",
help="Path to a dracut.conf file to use instead of the "
"default arguments. See the dracut.conf(5) manpage.")
dracut_group.add_argument("--dracut-arg", action="append", dest="dracut_args",
help="Argument to pass to dracut when "
"rebuilding the initramfs. Pass this "
"once for each argument. NOTE: this "
"overrides the default. (default: %s)" % dracut_default)
"overrides the defaults.")
# pxe to live arguments
pxelive_group = parser.add_argument_group("pxe to live arguments")

View File

@ -47,7 +47,7 @@ from pylorax.treebuilder import findkernels
from pylorax.sysutils import joinpaths, remove
# Default parameters for rebuilding initramfs, override with --dracut-args
# Default parameters for rebuilding initramfs, override with --dracut-arg or --dracut-conf
DRACUT_DEFAULT = ["--xz", "--add", "livenet dmsquash-live dmsquash-live-ntfs convertfs pollcdrom qemu qemu-net",
"--omit", "plymouth", "--no-hostonly", "--debug", "--no-early-microcode"]
@ -131,6 +131,21 @@ def squashfs_args(opts):
compressargs = []
return (compression, compressargs)
def dracut_args(opts):
"""Return a list of the args to pass to dracut
Return the default argument list unless one of the dracut cmdline arguments
has been used.
"""
if opts.dracut_conf:
return ["--conf", opts.dracut_conf]
elif opts.dracut_args:
args = []
for arg in opts.dracut_args:
args += arg.split(" ", 1)
return args
else:
return DRACUT_DEFAULT
def make_appliance(disk_img, name, template, outfile, networks=None, ram=1024,
vcpus=1, arch=None, title="Linux", project="Linux",
@ -223,15 +238,10 @@ def rebuild_initrds_for_live(opts, sys_root_dir, results_dir):
:param str sys_root_dir: Path to root of the system
:param str results_dir: Path of directory for storing results
"""
if not opts.dracut_args:
dracut_args = DRACUT_DEFAULT
else:
dracut_args = []
for arg in opts.dracut_args:
dracut_args += arg.split(" ", 1)
log.info("dracut args = %s", dracut_args)
# cmdline dracut args override the defaults, but need to be parsed
log.info("dracut args = %s", dracut_args(opts))
dracut = ["dracut", "--nomdadmconf", "--nolvmconf"] + dracut_args
dracut = ["dracut", "--nomdadmconf", "--nolvmconf"] + dracut_args(opts)
kdir = "boot"
if opts.ostree:
@ -367,14 +377,8 @@ def make_livecd(opts, mount_dir, work_dir):
templatedir=joinpaths(opts.lorax_templates,"live/"),
extra_boot_args=opts.extra_boot_args)
log.info("Rebuilding initrds")
if not opts.dracut_args:
dracut_args = DRACUT_DEFAULT
else:
dracut_args = []
for arg in opts.dracut_args:
dracut_args += arg.split(" ", 1)
log.info("dracut args = %s", dracut_args)
tb.rebuild_initrds(add_args=dracut_args)
log.info("dracut args = %s", dracut_args(opts))
tb.rebuild_initrds(add_args=dracut_args(opts))
log.info("Building boot.iso")
tb.build()

View File

@ -148,6 +148,9 @@ def main():
if os.getuid() != 0:
errors.append("You need to run this as root")
if opts.dracut_args and opts.dracut_conf:
errors.append("argument --dracut-arg: not allowed with argument --dracut-conf")
if errors:
list(log.error(e) for e in errors)
sys.exit(1)

View File

@ -111,6 +111,10 @@ def main():
parser.error("sharedir %s doesn't exist." % opts.sharedir)
if opts.config and not os.path.exists(opts.config):
parser.error("config file %s doesn't exist." % opts.config)
if opts.dracut_args and opts.dracut_conf:
parser.error("argument --dracut-arg: not allowed with argument --dracut-conf")
if opts.dracut_conf and not os.path.exists(opts.dracut_conf):
parser.error("dracut config file %s doesn't exist." % opts.dracut_conf)
setup_logging(opts)
log.debug(opts)
@ -191,6 +195,12 @@ def main():
with open(lorax.conf.get("lorax", "logdir") + '/lorax.conf', 'w') as f:
lorax.conf.write(f)
# Use a dracut config file instead of the default arguments
if opts.dracut_conf:
user_dracut_args = ["--conf %s" % opts.dracut_conf]
else:
user_dracut_args = opts.dracut_args
lorax.run(dnfbase, opts.product, opts.version, opts.release,
opts.variant, opts.bugurl, opts.isfinal,
workdir=tempdir, outputdir=opts.outputdir, buildarch=opts.buildarch,
@ -202,7 +212,7 @@ def main():
add_arch_templates=opts.add_arch_templates,
add_arch_template_vars=parsed_add_arch_template_vars,
remove_temp=True, verify=opts.verify,
user_dracut_args=opts.dracut_args,
user_dracut_args=user_dracut_args,
squashfs_only=opts.squashfs_only)
# Release the lock on the tempdir

View File

@ -1,5 +1,5 @@
#
# Copyright (C) 2018 Red Hat, Inc.
# Copyright (C) 2018-2020 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -17,6 +17,7 @@
import os
import tempfile
import unittest
from unittest import mock
import xml.etree.ElementTree as ET
# For kickstart check tests
@ -27,8 +28,8 @@ from ..lib import get_file_magic
from pylorax import find_templates
from pylorax.base import DataHolder
from pylorax.creator import FakeDNF, create_pxe_config, make_appliance, make_runtime, squashfs_args
from pylorax.creator import calculate_disk_size
from pylorax.creator import get_arch, find_ostree_root, check_kickstart
from pylorax.creator import calculate_disk_size, dracut_args, DRACUT_DEFAULT
from pylorax.creator import get_arch, find_ostree_root, check_kickstart, make_livecd
from pylorax.executils import runcmd_output
from pylorax.sysutils import joinpaths
@ -68,6 +69,21 @@ class CreatorTest(unittest.TestCase):
opts = DataHolder(compression="xz", compress_args=["-X32767", "-Xbcj x86"], arch="x86_64")
self.assertEqual(squashfs_args(opts), ("xz", ["-X32767", "-Xbcj", "x86"]), (opts, squashfs_args(opts)))
def test_dracut_args(self):
"""Test dracut_args results"""
# Use default args
opts = DataHolder(dracut_args=None, dracut_conf=None)
self.assertEqual(dracut_args(opts), DRACUT_DEFAULT)
# Use a config file from --dracut-conf
opts = DataHolder(dracut_args=None, dracut_conf="/var/tmp/project/lmc-dracut.conf")
self.assertEqual(dracut_args(opts), ["--conf", "/var/tmp/project/lmc-dracut.conf"])
# Use --dracut-arg
opts = DataHolder(dracut_args=["--xz", "--omit plymouth", "--add livenet dmsquash-live dmsquash-live-ntfs"], dracut_conf=None)
self.assertEqual(dracut_args(opts), ["--xz", "--omit", "plymouth", "--add", "livenet dmsquash-live dmsquash-live-ntfs"])
def test_make_appliance(self):
"""Test creating the appliance description XML file"""
lorax_templates = find_templates("./share/")
@ -365,3 +381,34 @@ class CreatorTest(unittest.TestCase):
"""Test the mount_boot_part_over_root ostree function"""
# Make a fake disk image with a / and a /boot/loader.0
# Mount the / partition
def test_make_livecd_dracut(self):
"""Test the make_livecd function with dracut options"""
with tempfile.TemporaryDirectory(prefix="lorax.test.") as tmpdir:
# Make a fake kernel and initrd
mkFakeBoot(joinpaths(tmpdir, "mount_dir"))
os.makedirs(joinpaths(tmpdir, "mount_dir/tmp/config_files"))
lorax_templates = os.path.abspath(find_templates("./share/"))
with mock.patch('pylorax.treebuilder.TreeBuilder.build'):
with mock.patch('pylorax.treebuilder.TreeBuilder.rebuild_initrds') as ri:
# Test with no dracut args
opts = DataHolder(project="Fedora", releasever="32", lorax_templates=lorax_templates, volid=None,
domacboot=False, extra_boot_args="", dracut_args=None, dracut_conf=None)
make_livecd(opts, joinpaths(tmpdir, "mount_dir"), joinpaths(tmpdir, "work_dir"))
ri.assert_called_with(add_args=DRACUT_DEFAULT)
# Test with --dracut-arg
opts = DataHolder(project="Fedora", releasever="32", lorax_templates=lorax_templates, volid=None,
domacboot=False, extra_boot_args="",
dracut_args=["--xz", "--omit plymouth", "--add livenet dmsquash-live dmsquash-live-ntfs"], dracut_conf=None)
make_livecd(opts, joinpaths(tmpdir, "mount_dir"), joinpaths(tmpdir, "work_dir"))
ri.assert_called_with(add_args=["--xz", "--omit", "plymouth", "--add", "livenet dmsquash-live dmsquash-live-ntfs"])
# Test with --dracut-conf
opts = DataHolder(project="Fedora", releasever="32", lorax_templates=lorax_templates, volid=None,
domacboot=False, extra_boot_args="", dracut_args=None,
dracut_conf="/var/tmp/project/lmc-dracut.conf")
make_livecd(opts, joinpaths(tmpdir, "mount_dir"), joinpaths(tmpdir, "work_dir"))
ri.assert_called_with(add_args=["--conf", "/var/tmp/project/lmc-dracut.conf"])