| Most of the functionality that dracut implements are actually implemented |
| by dracut modules. Dracut modules live in modules.d, and have the following |
| structure: |
| |
| dracut_install_dir/modules.d/ |
| 00modname/ |
| module-setup.sh |
| check |
| <other files as needed by the hook> |
| |
| 00modname: The name of the module prefixed by a two-digit numeric sort code. |
| The numeric code must be present and in the range of 00 - 99. |
| Modules with lower numbers are installed first. This is important |
| because the dracut install functions (which install files onto |
| the initrd) refuse to overwrite already installed files. This makes |
| it easy for an earlier module to override the functionality of a |
| later module, so that you can have a distro or system specific |
| module override or modify the functionality of a generic module |
| without having to patch the more generic module. |
| |
| module-setup.sh: |
| dracut sources this script to install the functionality that a |
| module implements onto the initrd. For the most part, this amounts |
| to copying files from the host system onto the initrd in a controlled |
| manner. |
| |
| install(): |
| This function of module-setup.sh is called to install all |
| non-kernel files. dracut supplies several install functions that are |
| specialized for different file types. Browse through dracut-functions |
| fore more details. dracut also provides a $moddir variable if you |
| need to install a file from the module directory, such as an initrd |
| hook, a udev rule, or a specialized executable. |
| |
| installkernel(): |
| This function of module-setup.sh is called to install all |
| kernel related files. |
| |
| |
| check(): |
| Dracut calls this function to check and see if a module can be installed |
| on the initrd. |
| |
| When called without options, check should check to make sure that |
| any files it needs to install into the initrd from the host system |
| are present. It should exit with a 0 if they are, and a 1 if they are |
| not. |
| |
| When called with $hostonly set, it should perform the same check |
| that it would without it set, and it should also check to see if the |
| functionality the module implements is being used on the host system. |
| For example, if this module handles installing support for LUKS |
| encrypted volumes, it should return 0 if all the tools to handle |
| encrpted volumes are available and the host system has the root |
| partition on an encrypted volume, 1 otherwise. |
| |
| depends(): |
| This function should output a list of dracut modules |
| that it relies upon. An example would be the nfs and iscsi modules, |
| which rely on the network module to detect and configure network |
| interfaces. |
| |
| Any other files in the module will not be touched by dracut directly. |
| |
| You are encouraged to provide a README that describes what the module is for. |
| |
| |
| HOOKS |
| ===== |
| |
| init has the following hook points to inject scripts: |
| |
| /lib/dracut/hooks/cmdline/*.sh |
| scripts for command line parsing |
| |
| /lib/dracut/hooks/pre-udev/*.sh |
| scripts to run before udev is started |
| |
| /lib/dracut/hooks/pre-trigger/*.sh |
| scripts to run before the main udev trigger is pulled |
| |
| /lib/dracut/hooks/initqueue/*.sh |
| runs in parallel to the udev trigger |
| Udev events can add scripts here with /sbin/initqueue. |
| If /sbin/initqueue is called with the "--onetime" option, the script |
| will be removed after it was run. |
| If /lib/dracut/hooks/initqueue/work is created and udev >= 143 then |
| this loop can process the jobs in parallel to the udevtrigger. |
| If the udev queue is empty and no root device is found or no root |
| filesystem was mounted, the user will be dropped to a shell after |
| a timeout. |
| Scripts can remove themselves from the initqueue by "rm $job". |
| |
| /lib/dracut/hooks/pre-mount/*.sh |
| scripts to run before the root filesystem is mounted |
| Network filesystems like NFS that do not use device files are an |
| exception. Root can be mounted already at this point. |
| |
| /lib/dracut/hooks/mount/*.sh |
| scripts to mount the root filesystem |
| If the udev queue is empty and no root device is found or no root |
| filesystem was mounted, the user will be dropped to a shell after |
| a timeout. |
| |
| /lib/dracut/hooks/pre-pivot/*.sh |
| scripts to run before the real init is executed and the initramfs |
| disappears |
| All processes started before should be killed here. |
| |