SOME IMPORTANT NOTES ABOUT HOW DRACUT WORKS
===========================================
Will Woods <wwoods@redhat.com>
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
