Add dracut-regenerate elements
This new element will allow to regenerate dracut on the produced images, to enable different modules. It relies on a yaml blob to specify modules and packages needed. It defaults to installing lvm and crypt. Change-Id: I292fb70cde41ee6053b7b81a67931bcdaaa6d664
This commit is contained in:
parent
f1d53f2e31
commit
f23ea63341
18
diskimage_builder/elements/dracut-regenerate/README.rst
Normal file
18
diskimage_builder/elements/dracut-regenerate/README.rst
Normal file
@ -0,0 +1,18 @@
|
||||
=================
|
||||
dracut-regenerate
|
||||
=================
|
||||
Adds the possibility of regenerating dracut on image build time, giving the
|
||||
possibility to load extra modules.
|
||||
It relies on the ``DIB_DRACUT_ENABLED_MODULES`` setting, that will accept
|
||||
a yaml blob with the following format::
|
||||
|
||||
- name: <module1>
|
||||
packages:
|
||||
- <package1>
|
||||
- <package2>
|
||||
- name: <module2>
|
||||
packages:
|
||||
- <package3>
|
||||
- <package4>
|
||||
|
||||
By default, this element will bring lvm and crypt modules.
|
@ -0,0 +1,3 @@
|
||||
package-installs
|
||||
select-boot-kernel-initrd
|
||||
|
@ -0,0 +1,11 @@
|
||||
export DIB_DRACUT_ENABLED_MODULES_DEFAULT_CONFIG="
|
||||
- name: crypt
|
||||
packages:
|
||||
- cryptsetup
|
||||
- name: lvm
|
||||
packages:
|
||||
- lvm2
|
||||
"
|
||||
|
||||
DIB_DRACUT_ENABLED_MODULES=${DIB_DRACUT_ENABLED_MODULES:-${DIB_DRACUT_ENABLED_MODULES_DEFAULT_CONFIG}}
|
||||
export DIB_DRACUT_ENABLED_MODULES
|
67
diskimage_builder/elements/dracut-regenerate/finalise.d/98-dracut-regenerate
Executable file
67
diskimage_builder/elements/dracut-regenerate/finalise.d/98-dracut-regenerate
Executable file
@ -0,0 +1,67 @@
|
||||
#!/usr/local/bin/dib-python
|
||||
|
||||
# Copyright 2017 Red Hat, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import yaml
|
||||
|
||||
|
||||
def main():
|
||||
dracut_env = os.getenv('DIB_DRACUT_ENABLED_MODULES')
|
||||
dracut_objects = yaml.safe_load(dracut_env)
|
||||
|
||||
modules_to_boot = []
|
||||
for dracut_object in dracut_objects:
|
||||
# first, install dependent packages
|
||||
packages = dracut_object.get('packages', [])
|
||||
for package in packages:
|
||||
cmdline = ["install-packages", package]
|
||||
subp = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
|
||||
out = subp.communicate()[0]
|
||||
if subp.returncode:
|
||||
e = subprocess.CalledProcessError(subp.returncode, cmdline)
|
||||
e.output = out
|
||||
raise e
|
||||
|
||||
# second, compose the list of modules to boot
|
||||
modules_to_boot.append(dracut_object.get('name', None))
|
||||
|
||||
# regenerate dracut with the list of installed modules
|
||||
if len(modules_to_boot) > 0:
|
||||
cmdline = ["select-boot-kernel-initrd"]
|
||||
subp = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
|
||||
out, err = subp.communicate()
|
||||
|
||||
if subp.returncode:
|
||||
e = subprocess.CalledProcessError(subp.returncode, cmdline)
|
||||
e.output = out
|
||||
raise e
|
||||
|
||||
kernel_set = out.split(':')
|
||||
kernel_search = re.match("vmlinuz-(.*)", kernel_set[0])
|
||||
kernel_version = "%s" % kernel_search.groups(1)
|
||||
ramdisk_path = "/boot/%s" % kernel_set[1].strip()
|
||||
modules_to_boot = ' ' .join(modules_to_boot)
|
||||
|
||||
subp = subprocess.Popen(['dracut', '--force', '--add', modules_to_boot,
|
||||
'-f', ramdisk_path, kernel_version],
|
||||
stdout=subprocess.PIPE)
|
||||
subp.wait()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user