Skip to main content

cmkinitramfs

Github repository PyPI package Quality assurance Documentation status Python version Python implementation

Tools to generate an initramfs from a configuration file.

Documentation is available at https://cmkinitramfs.readthedocs.io/.

About

This project provides three main executables: cmkinit, cmkcpiodir and cmkcpiolist.

cmkinit builds an init script from a configuration file.

cmkcpiodir and cmkcpiolist build an initramfs, including the init script, from the same configuration file. cmkcpiodir builds the initramfs into a directory on a filesystem, and generates the CPIO archive from it. cmkcpiolist builds a CPIO list, using the same format as Linux kernel’s gen_init_cpio utility, and generates the CPIO archive using gen_init_cpio. See the corresponding Linux kernel documentation for more information.

Installation

Compatibility

Python version: this library is compatible with Python ≥ 3.7.

Python implementation: this library is compatible with CPython and PyPy.

Dependencies

Python dependencies:

  • bin (mkcpiodir and mkcpiolist) dependencies:

    • pyelftools

  • Documentation:

    • sphinx

    • sphinx_rtd_theme

  • Tests:

    • QA:

      • flake8

      • mypy

      • tox

Other dependencies:

  • initramfs (mkcpiodir and mkcpiolist) dependencies:

    • loadkeys (kbd)

    • busybox

    • modinfo (kmod, busybox)

  • mkcpiodir dependencies:

    • find (findutils, busybox)

    • cpio (cpio, busybox)

  • mkcpiolist dependencies:

    • gen_init_cpio (linux kernel, linux-misc-apps)

Install

Install from pypi:

$ pip install cmkinitramfs

Install from source with setup.py:

$ git clone https://github.com/teapot9/cmkinitramfs.git
$ cd cmkinitramfs
$ python3 setup.py install

Install from source with pip:

$ git clone https://github.com/teapot9/cmkinitramfs.git
$ cd cmkinitramfs
$ pip3 install .

Configuration

The configuration file is in an ini format.

Each section defines a data source, the section name is the data identifier.

Some options expects a data source as input, there are several data identifier formats:

  • DATA=data-name: data defined in the section with the same name.

  • data-name: same as DATA=data-name.

  • PATH=/path/foo/bar: data at the path /path/foo/bar, this can be a directory, a file, or a block device.

  • /absolute/path: same as PATH=/absolute/path.

  • UUID=1234-5678: filesystem with UUID 1234-5678.

  • LABEL=foo: filesystem with label foo.

  • PARTUUID=1234-5678: partition with UUID 1234-5678.

  • PARTLABEL=foo: partition with label foo.

DEFAULT section

This section has default values for other sections, as well as global configuration.

  • root (mandatory): Data identifier for the data to use as new root.

  • mountpoints (optional): Comma separated list of data identifier to load in addition of rootfs.

  • keymap (optional): Boolean value defining if a keymap should be loaded. If set to no, all keymap-* configurations will be ignored. Defaults to no.

  • keymap-src (optional): Path of the keymap file to use. If not specified but keymap is yes, the converted keymap should already exists at keymap-path.

  • keymap-path (optional): Path where the binary keymap will be generated (generated from keymap-src). Defaults to /tmp/keymap.bmap.

  • keymap-dest (optional): Path of the keymap file within the initramfs. Defaults to /root/keymap.bmap.

  • init-path (optional): Path where the init script will be generated (generated from cmkinitramfs.init.mkinit()). Defaults to /tmp/init.sh.

  • files (optional): Additional files to include in the initramfs. Each item is separated by a newline. Format: source:destination (e.g. files = /root/foo:/root/bar copy the file foo in the initramfs renaming it bar). If no destination is given, the file will be copied to the same path as source in the initramfs. source can be an absolute or relative path, destination must be an absolute path within the initramfs.

  • execs (optional): Additional executables to include in the initramfs. Same format as files, except that source will also be searched in directories from the PATH environment variable.

  • libs (optional): Additional libraries to include in the initramfs. Same format as files, except that source will also be searched in directories from /etc/ld.so.conf and the LD_LIBRARY_PATH environment variable.

  • busybox (optional): Additional executables to include in the initramfs. Each item is separated by a newline. Format: exec: name of the command (basename). If busybox provides the command, they will not be added. Otherwise, the executable is searched in PATH.

  • cmkcpiodir-default-opts (optional): Options to append to the cmkcpiodir command line.

  • cmkcpiolist-default-opts (optional): Options to append to the cmkcpiolist command line.

  • modules (optional): Kernel modules to load in the initramfs. One module per line, each line with the module name followed by the module parameters (e.g. mymodule foo=bar).

  • scripts (optional): User scripts to run at a given breakpoint. One user script per line with the format breakpoint:script. The script script will be run at the breakpoint breakpoint. A list of available breakpoints is available in cmkinitramfs.init.Breakpoint. These scripts will be run wether the breakpoint is enabled or not. Example: init: ls /dev: run ls /dev after initialization.

LUKS data sections

LUKS device to open.

  • type = luks (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • source (mandatory): Data identifier of the data to unlock.

  • name (mandatory): Name to use for the luks device, this will be used by cryptsetup.

  • key (optional): Data identifier for the LUKS key.

  • header (optional): Data identifier for the LUKS header.

  • discard (optional): Enable discards. Boolean value (yes/no).

LVM data sections

LVM logical volume to load.

  • type = lvm (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • vg-name (mandatory): Volume group name.

  • lv-name (mandatory): Logical volume name.

Mount data sections

Filesystem to mount.

  • type = mount (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • source (optional): Data identifier for the filesystem to mount. If not set, it will set the source to “none” (e.g. for TMPFS).

  • mountpoint (mandatory): Path where the filesystem will be mounted.

  • filesystem (mandatory): Which filesystem to use, option passed to mount -t filesystem.

  • options (optional): Mount options, defaults to ro. Note for ZFS: if the mountpoint property is not set to legacy, the zfsutil option is required.

MD data sections

MD RAID data to load.

  • type = md (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • name (mandatory): Name of the MD RAID, this will be used by mdadm.

  • source (mandatory): New line separated data identifiers of the sources to use. Multiple block devices can be specified, or the UUID of the MD RAID.

Clone data sections

Clone a source to a destination.

  • type = clone (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • source (mandatory): Data identifier for the source of the clone.

  • destination (mandatory): Data identifier of the destination of the clone.

ZFS pool sections

Import a ZFS pool.

  • type = zfspool (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • pool (mandatory): Pool name.

  • cache (optional): Data identifier of the ZFS cache file (must be present in the initramfs).

ZFS crypt sections

Unlock an encrypted ZFS dataset.

  • type = zfscrypt (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • pool (optional): Data identifier of the parent pool (defaults to same as pool name).

  • dataset (mandatory): Name of the dataset to unlock.

  • key (optional): Data identifier of a keyfile to use.

Network sections

Configure a network interface.

  • type = network (mandatory).

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • device (mandatory): MAC address of the interface.

  • ip (optional): IP address of the interface (DHCP if not set).

  • mask (optional): IP mask (if static IP is defined).

  • gateway (optional): default route IP (if static IP is defined).

ISCSI sections

Configure an iSCSI device.

  • type = iscsi

  • need (optional): Hard dependencies: comma separated list of data identifiers. Those dependencies are required to load and use the data.

  • load-need (optional): Load dependencies: comma separated list of data identifiers. Those dependencies are only required to load the data, they can be unloaded when the data has been successfully loaded. (e.g. A LUKS key, an archive to decompress.)

  • initiator (mandatory): Initiator name.

  • target (mandatory): iSCSI target.

  • portal_group (mandatory): target portal group tag.

  • address (mandatory): iSCSI server address.

  • port (mandatory): iSCSI server port.

  • username (optional): authentification username.

  • password (optional): authentification password.

  • username_in (optional): incoming authentification username.

  • password_in (optional): incoming authentification password.

Usage

Kernel command-line parameters

The init script will check the kernel cmdline for known parameters.

  • debug: Same as rd.debug.

  • init=<path to init>: Set the init process to run after the initramfs.

  • quiet: Same as rd.quiet.

  • rd.break=<breakpoint>: Drop into a shell at a given point. See cmkinitramfs.init.Breakpoint.

  • rd.debug: Show debugging informations.

  • rd.panic: On fatal error: cause a kernel panic rather than droping into a shell.

  • rd.quiet: Reduce log shown on console.

For more details, see cmkinitramfs.init.do_cmdline.

cmkinit

$ cmkinit --help
usage: cmkinit [-h] [--version]

Build an init script

options:
  -h, --help  show this help message and exit
  --version   show program's version number and exit

Running cmkinit will generate an init script and output it to stdout. No options are available, everything is defined in the configuration file. The CMKINITCFG environment variable may be defined to use a custom configuration file.

cmkcpiodir

$ cmkcpiodir --help
usage: cmkcpiodir [-h] [--verbose] [--quiet] [--version] [--debug]
                  [--output OUTPUT] [--binroot BINROOT] [--kernel KERNEL]
                  [--no-kmod] [--only-build-archive | --only-build-directory]
                  [--keep] [--clean] [--build-dir BUILD_DIR]

Build an initramfs using a directory.

options:
  -h, --help            show this help message and exit
  --verbose, -v         be verbose
  --quiet, -q           be quiet (can be repeated)
  --version             show program's version number and exit
  --debug, -d           debugging mode: non-root, implies -k
  --output OUTPUT, -o OUTPUT
                        set the output of the CPIO archive
  --binroot BINROOT, -r BINROOT
                        set the root directory for binaries (executables and
                        libraries)
  --kernel KERNEL, -K KERNEL
                        set the target kernel versions of the initramfs,
                        defaults to the running kernel
  --no-kmod             disable kernel modules support
  --only-build-archive, -c
                        only build the CPIO archive from an existing initramfs
                        directory
  --only-build-directory, -D
                        only build the initramfs directory, implies -k
  --keep, -k            keep the created initramfs directory
  --clean, -C           overwrite temporary directory if it exists, use
                        carefully
  --build-dir BUILD_DIR, -b BUILD_DIR
                        set the location of the initramfs directory

Running cmkcpiodir will generate the initramfs in a directory, then it will create the CPIO archive from this directory. cmkcpiodir requires root privileges when run in non-debug mode, see the do_nodes options of cmkinitramfs.initramfs.Initramfs.build_to_directory().

cmkcpiolist

$ cmkcpiolist --help
usage: cmkcpiolist [-h] [--verbose] [--quiet] [--version] [--debug]
                   [--output OUTPUT] [--binroot BINROOT] [--kernel KERNEL]
                   [--no-kmod] [--only-build-archive | --only-build-list]
                   [--keep] [--cpio-list CPIO_LIST]

Build an initramfs using a CPIO list

options:
  -h, --help            show this help message and exit
  --verbose, -v         be verbose
  --quiet, -q           be quiet (can be repeated)
  --version             show program's version number and exit
  --debug, -d           debugging mode: non-root, implies -k
  --output OUTPUT, -o OUTPUT
                        set the output of the CPIO archive
  --binroot BINROOT, -r BINROOT
                        set the root directory for binaries (executables and
                        libraries)
  --kernel KERNEL, -K KERNEL
                        set the target kernel versions of the initramfs,
                        defaults to the running kernel
  --no-kmod             disable kernel modules support
  --only-build-archive, -c
                        only build the CPIO archive from an existing CPIO list
  --only-build-list, -L
                        only build the CPIO list, implies -k
  --keep, -k            keep the created CPIO list
  --cpio-list CPIO_LIST, -l CPIO_LIST
                        set the location of the CPIO list

Running cmkcpiolist will generate an initramfs CPIO list in a file, then it will create the CPIO archive from this list with gen_init_cpio. cmkcpiolist does not require root privileges.

findlib

$ findlib --help
usage: findlib [-h] [--verbose] [--quiet] [--version]
               [--compatible COMPATIBLE] [--root ROOT] [--null] [--glob]
               LIB [LIB ...]

Find a library on the system

positional arguments:
  LIB                   library to search

options:
  -h, --help            show this help message and exit
  --verbose, -v         be verbose
  --quiet, -q           be quiet (can be repeated)
  --version             show program's version number and exit
  --compatible COMPATIBLE, -c COMPATIBLE
                        set a binary the library must be compatible with
  --root ROOT, -r ROOT  set the root directory to search for the library
  --null, -0            paths will be delemited by null characters instead of
                        newlines
  --glob, -g            library names are glob patterns

findlib will search the absolute path of a library on the system. It will search in directories from /etc/ld.so.conf, LD_LIBRARY_PATH, and default library paths (see cmkinitramfs.bin.find_lib() and cmkinitramfs.bin.find_lib_iter()).

Examples

Command-line interface

$ cmkcpiodir
  • Creates init script in /tmp/init.sh.

  • If enabled, builds binary keymap in /tmp/keymap.bmap.

  • Builds initramfs in /tmp/initramfs (disable this step with --only-build-archive).

  • Builds CPIO archive from /tmp/initramfs to /usr/src/initramfs.cpio (disable this step with --only-build-directory).

  • Cleanup /tmp/initramfs directory (disable with --keep).

$ cmkcpiolist
  • Creates init script in /tmp/init.sh.

  • If enabled, builds binary keymap in /tmp/keymap.bmap.

  • Builds CPIO list in /tmp/initramfs.list (disable this step with --only-build-archive).

  • Builds CPIO archive from /tmp/initramfs.list to /usr/src/initramfs.cpio (disable this step with --only-build-list).

$ findlib 'libgcc_s.so.1'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/libgcc_s.so.1
  • Searches the libgcc_s.so.1 library on the system and prints it to stdout.

$ findlib -g 'libgcc_s.*'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/libgcc_s.so.1
/lib64/libgcc_s.so.1
/lib64/libgcc_s.so.1
  • Search any library matching libgcc_s.* on the system and prints them to stdout.

Metadata

Release files for cmkinitramfs 0.2.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cmkinitramfs 0.2.4
File Size Uploaded Provenance
cmkinitramfs-0.2.4.tar.gz 48.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for cmkinitramfs 0.2.4
File Interpreter ABI Platform
cmkinitramfs-0.2.4-py3-none-any.whl Python 3 none any Details

Total release size: 89.7 kB

Release files / cmkinitramfs-0.2.4.tar.gz

Download URL cmkinitramfs-0.2.4.tar.gz
Size 48.2 kB
Tags Source
SHA-256 checksum
How to use checksums
90fa945243f5806b450a12ac1e086e3f91abb81ae31d87f89fa1e9a75ff77097
BLAKE2b-256 checksum
How to use checksums
61a86b3b2d2d61ad3bde4786b1b18552f993e2a0eff1901f85930e7fd43b9fd9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Release files / cmkinitramfs-0.2.4-py3-none-any.whl

Download URL cmkinitramfs-0.2.4-py3-none-any.whl
Size 41.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f450f502c98de18f4a51bf4de0214cfe2696717580f07939c9b3d18caf4d49f3
BLAKE2b-256 checksum
How to use checksums
c88c9bf434d39d8be57af6e4d31b79df6f113473d41802b99e1b2c0a2d0ca1da
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Security for cmkinitramfs 0.2.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page