SOME IMPORTANT NOTES ABOUT HOW DRACUT WORKS =========================================== Will Woods v1.0, August 2012 // vim: set syntax=asciidoc textwidth=78: File locations / installation ----------------------------- The files are installed into the initramfs according to the instructions in `module-setup.sh`. So this line: inst_hook cmdline 25 "$moddir/parse-anaconda-options.sh" means that the file `parse-anaconda-options.sh` will be installed at priority `25` in the `cmdline` hook. In practice, this means that it will be located at /lib/dracut/hooks/cmdline/25-parse-anaconda-options.sh inside the initramfs. Hooks and script ordering ------------------------- The hooks run in the following order: cmdline:: This is where you parse (and _only_ parse) the boot commandline. Just set up config files and do sanity checks; the real action is later. pre-udev:: This is where you write out udev rules (before udev starts). pre-trigger:: At this point udev is running but *kernel modules haven't been loaded*. If you need to set udev environment variables, set them here. initqueue:: This is the mainloop, where initramfs tries to find/fetch rootfs. Scripts in this hook will run _repeatedly_ until finished or timeout (see below). Runs at 0.5-second intervals. initqueue/settled:: This part of the mainloop only runs once _udev is settled_, i.e. once all devices have been found. initqueue/online:: This hook runs _every time a network device goes online_. initqueue/finished:: If all the scripts here return success dracut exits the mainloop, _even if some initqueue scripts have not yet run_. To put it another way, if you want dracut to wait for something to happen, you need a script in `initqueue/finished` that returns non-zero _until_ the thing you're waiting for happens. pre-mount:: Runs _once_ before trying to mount rootfs. mount:: Each script in this hook runs in order, until one of them mounts rootfs at `$NEWROOT`. May run multiple times. pre-pivot:: This is where you (e.g.) copy files into `$NEWROOT` before switching over. cleanup:: Clean up after your other hooks. The scripts _within_ each hook run according to the numeric priority given in the `inst_hook` lines in `module-setup.sh`. Variables, scope, sharing data between scripts ---------------------------------------------- Each script in a hook gets sourced by the same `bash` interpreter. If you define a function or variable in a script, each subsequent script _in the same hook_ can see and use it, but *it won't be visible to other hooks.* If you export a variable, it will be available to all subsequent scripts. You can, of course, also share data by writing files to `/tmp`. *NOTE:* You can break _other_ modules by accidentally overwriting their variables. Avoid the following variable names in your own code. Exported Variables ~~~~~~~~~~~~~~~~~~ ==== Special dracut variables ==== $root:: The root device. Must be set by the end of the `cmdline` hook. Might not actually be a device (e.g. "nfs"). $rflags:: Mount flags for the root device. $fstype:: The fstype of the root filesystem. Usually `auto`. $netroot:: The network root location. Syntax depends on type of network root. ==== Read-only dracut variables ==== $NEWROOT:: Mountpoint for the root filesystem. Usually `/sysroot`. $hookdir:: Location of the dracut hooks. Usually `/lib/dracut/hooks`. $RDRETRY:: Number of loops to try before giving up. Usually *60* (=30 seconds). $main_loop:: Counter for the current mainloop iteration. $DRACUT_QUIET:: Whether dracut should operate quietly; `yes` or `no`. (Don't worry about this; just use `info()` or `warn()` instead) $UDEVVERSION:: Self-explanatory. ==== Variables from other modules ==== $resume, $splash:: Used by `95resume`. $CURL_HOME:: Exported by `45url-lib`. ==== Anaconda ==== $kickstart:: Anaconda-style URL for the kickstart. $anac_updates:: Anaconda-style URL for `updates.img`. $ksdevice:: Network device to use for fetching kickstart/stage2/etc. Further Reading --------------- Dracut documentation: http://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html My other set of dracut notes: http://wwoods.fedorapeople.org/doc/dracut-notes.html