From 2af864c438a4f250e92b5ead59e2fe3ba901017c Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Wed, 25 Jan 2012 21:59:48 -0800 Subject: [PATCH] lorax: copy kickstarts into sysroot (#743135) The installer no longer has access to the initrd's root. We need to copy any needed files over to /sysroot before switching root. This copies *.cfg and *.ks files. It also adds the ability to add dracut hook scripts to the initramfs from /usr/share/lorax/dracut_hooks/ This re-adds commit af6d4e2c50072eb3d76242481cb6c1bc016f6f54 which was lost during the switch to the treebuilder branch. --- share/dracut_hooks/99anaconda-copy-ks.sh | 4 +++ src/pylorax/treebuilder.py | 41 ++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 share/dracut_hooks/99anaconda-copy-ks.sh diff --git a/share/dracut_hooks/99anaconda-copy-ks.sh b/share/dracut_hooks/99anaconda-copy-ks.sh new file mode 100644 index 00000000..ed52088a --- /dev/null +++ b/share/dracut_hooks/99anaconda-copy-ks.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# Copy over kickstart files from the initrd to the sysroot before pivot +cp /*cfg /*ks /sysroot/ 2> /dev/null + diff --git a/src/pylorax/treebuilder.py b/src/pylorax/treebuilder.py index 8f4d2393..12fdcf9b 100644 --- a/src/pylorax/treebuilder.py +++ b/src/pylorax/treebuilder.py @@ -25,7 +25,7 @@ from os.path import basename, isdir from subprocess import check_call, check_output from sysutils import joinpaths, remove -from shutil import copytree +from shutil import copytree, copy2 from base import DataHolder from ltmpl import LoraxTemplateRunner import imgutils @@ -163,6 +163,7 @@ class TreeBuilder(object): isolabel=isolabel, udev=udev_escape) self._runner = LoraxTemplateRunner(inroot, outroot, templatedir=templatedir) self._runner.defaults = self.vars + self.templatedir = templatedir @property def kernels(self): @@ -175,6 +176,9 @@ class TreeBuilder(object): dracut = ["dracut", "--noprefix", "--nomdadmconf", "--nolvmconf"] + add_args if not backup: dracut.append("--force") + hooks = [("99anaconda-copy-ks.sh", "/lib/dracut/hooks/pre-pivot")] + hook_commands = self.copy_dracut_hooks(hooks) + # Hush some dracut warnings. TODO: bind-mount proc in place? open(joinpaths(self.vars.inroot,"/proc/modules"),"w") for kernel in self.kernels: @@ -183,7 +187,7 @@ class TreeBuilder(object): initrd = joinpaths(self.vars.inroot, kernel.initrd.path) os.rename(initrd, initrd + backup) check_call(["chroot", self.vars.inroot] + \ - dracut + [kernel.initrd.path, kernel.version]) + dracut + hook_commands + [kernel.initrd.path, kernel.version]) os.unlink(joinpaths(self.vars.inroot,"/proc/modules")) def build(self): @@ -198,6 +202,39 @@ class TreeBuilder(object): iso = joinpaths(self.vars.outroot, data['boot.iso']) check_call(["implantisomd5", iso]) + @property + def dracut_hooks_path(self): + """ Return the path to the lorax dracut hooks scripts + + Use the configured share dir if it is setup, + otherwise default to /usr/share/lorax/dracut_hooks + """ + if self.templatedir: + return joinpaths(self.templatedir, "dracut_hooks") + else: + return "/usr/share/lorax/dracut_hooks" + + def copy_dracut_hooks(self, hooks): + """ Copy the hook scripts in hooks into the installroot's /tmp/ + and return a list of commands to pass to dracut when creating the + initramfs + + hooks is a list of tuples with the name of the hook script and the + target dracut hook directory + (eg. [("99anaconda-copy-ks.sh", "/lib/dracut/hooks/pre-pivot")]) + """ + dracut_commands = [] + for hook_script, dracut_path in hooks: + src = joinpaths(self.dracut_hooks_path, hook_script) + if not os.path.exists(src): + logger.error("Missing lorax dracut hook script %s" % (src)) + continue + dst = joinpaths(self.vars.inroot, "/tmp/", hook_script) + copy2(src, dst) + dracut_commands += ["--include", joinpaths("/tmp/", hook_script), + dracut_path] + return dracut_commands + #### TreeBuilder helper functions def findkernels(root="/", kdir="boot"):