summaryrefslogtreecommitdiffstats
path: root/dracut/README
blob: 2dde2d53f5db4db9eb22c074aa9c4c4f99b35ff6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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