arch
configurationoperating_systemslinuxarch

This is specifically written for Arch Linux users, even so many of those methods can be applied to other distributions as well, because they are using the same packages. Little changes might be needed depending on the configuration of those packages.

force preboot environment

In order to get into the base hook of mkinitcpio even so nothing is broken

break=premount

can be specified as kernel parameter. It is called APPEND ... break=premount when using syslinux as boot manager.

manually booting from the preboot environment

In order to boot manually

mount /dev/md1 /new_root/ 
exec /usr/bin/switch_root /new_root /sbin/init

source{.fright} exec will effectivly replace the current process (which is 1) with the new process, which is switch_root in the first place, but which also uses exec to execute its second parameter, so that finally /sbin/init gets executed as process 1. With /sbin/init being part of systemd it would have leat to the error “trying to run as user instance but the system has not been booted with systemd” in case it gets executed with a PID other than 1.

mkinitcpio's systemd hook

In order to use encrypted file systems together with the new systemd hook one needs another hook, which depends on it and which is called sd-encrypt. It might get in your way, that because systemd now manages the order in which devices get initialized, that device mapping from /etc/crypttab do not fit any longer. It is therefore advised to use /dev/disk/by-label/usb-key like paths even in /etc/crypttab

custom hooks in early userspace

While system hooks are located under /usr/lib/initcpio/hooks with install scripts located in /usr/lib/initcpio/install. The same directory structure can be found under /etc/initcpio and to add a custom hook a file is required at least in the 'install' directory. A minimal file looks like this:

#!/bin/bash

build() {
    :
}

# vim: set ft=sh ts=4 sw=4 et:

whereas in the hooks directory it has another shebang due to the fact, that it gets executed in early user space:

#!/usr/bin/ash

run_hook() {
    echo "Welcome Max!"
}

# vim: set ft=sh ts=4 sw=4 et:
top