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 af6d4e2c50 which was
lost during the switch to the treebuilder branch.
This commit is contained in:
Brian C. Lane 2012-01-25 21:59:48 -08:00
parent befdc218ac
commit 2af864c438
2 changed files with 43 additions and 2 deletions

View File

@ -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

View File

@ -25,7 +25,7 @@ from os.path import basename, isdir
from subprocess import check_call, check_output from subprocess import check_call, check_output
from sysutils import joinpaths, remove from sysutils import joinpaths, remove
from shutil import copytree from shutil import copytree, copy2
from base import DataHolder from base import DataHolder
from ltmpl import LoraxTemplateRunner from ltmpl import LoraxTemplateRunner
import imgutils import imgutils
@ -163,6 +163,7 @@ class TreeBuilder(object):
isolabel=isolabel, udev=udev_escape) isolabel=isolabel, udev=udev_escape)
self._runner = LoraxTemplateRunner(inroot, outroot, templatedir=templatedir) self._runner = LoraxTemplateRunner(inroot, outroot, templatedir=templatedir)
self._runner.defaults = self.vars self._runner.defaults = self.vars
self.templatedir = templatedir
@property @property
def kernels(self): def kernels(self):
@ -175,6 +176,9 @@ class TreeBuilder(object):
dracut = ["dracut", "--noprefix", "--nomdadmconf", "--nolvmconf"] + add_args dracut = ["dracut", "--noprefix", "--nomdadmconf", "--nolvmconf"] + add_args
if not backup: if not backup:
dracut.append("--force") 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? # Hush some dracut warnings. TODO: bind-mount proc in place?
open(joinpaths(self.vars.inroot,"/proc/modules"),"w") open(joinpaths(self.vars.inroot,"/proc/modules"),"w")
for kernel in self.kernels: for kernel in self.kernels:
@ -183,7 +187,7 @@ class TreeBuilder(object):
initrd = joinpaths(self.vars.inroot, kernel.initrd.path) initrd = joinpaths(self.vars.inroot, kernel.initrd.path)
os.rename(initrd, initrd + backup) os.rename(initrd, initrd + backup)
check_call(["chroot", self.vars.inroot] + \ 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")) os.unlink(joinpaths(self.vars.inroot,"/proc/modules"))
def build(self): def build(self):
@ -198,6 +202,39 @@ class TreeBuilder(object):
iso = joinpaths(self.vars.outroot, data['boot.iso']) iso = joinpaths(self.vars.outroot, data['boot.iso'])
check_call(["implantisomd5", 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 #### TreeBuilder helper functions
def findkernels(root="/", kdir="boot"): def findkernels(root="/", kdir="boot"):