129 lines
4.2 KiB
Plaintext
129 lines
4.2 KiB
Plaintext
|
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
|