]> git.proxmox.com Git - mirror_zfs-debian.git/blob - contrib/dracut/README.dracut.markdown
Imported Upstream version 0.6.5.3
[mirror_zfs-debian.git] / contrib / dracut / README.dracut.markdown
1 How to setup a zfs root filesystem using dracut
2 -----------------------------------------------
3
4 1) Install the zfs-dracut package. This package adds a zfs dracut module
5 to the /usr/share/dracut/modules.d/ directory which allows dracut to
6 create an initramfs which is zfs aware.
7
8 2) Set the bootfs property for the bootable dataset in the pool. Then set
9 the dataset mountpoint property to '/'.
10
11 $ zpool set bootfs=pool/dataset pool
12 $ zfs set mountpoint=/ pool/dataset
13
14 It is also possible to set the bootfs property for an entire pool, just in
15 case you are not using a dedicated dataset for '/'.
16
17 $ zpool set bootfs=pool pool
18 $ zfs set mountpoint=/ pool
19
20 Alternately, legacy mountpoints can be used by setting the 'root=' option
21 on the kernel line of your grub.conf/menu.lst configuration file. Then
22 set the dataset mountpoint property to 'legacy'.
23
24 $ grub.conf/menu.lst: kernel ... root=ZFS=pool/dataset
25 $ zfs set mountpoint=legacy pool/dataset
26
27 3) To set zfs module options put them in /etc/modprobe.d/zfs.conf file.
28 The complete list of zfs module options is available by running the
29 _modinfo zfs_ command. Commonly set options include: zfs_arc_min,
30 zfs_arc_max, zfs_prefetch_disable, and zfs_vdev_max_pending.
31
32 4) Finally, create your new initramfs by running dracut.
33
34 $ dracut --force /path/to/initramfs kernel_version
35
36 Kernel Command Line
37 -------------------
38
39 The initramfs' behavior is influenced by the following kernel command line
40 parameters passed in from the boot loader:
41
42 * `root=...`: If not set, importable pools are searched for a bootfs
43 attribute. If an explicitly set root is desired, you may use
44 `root=ZFS:pool/dataset`
45
46 * `zfs_force=0`: If set to 1, the initramfs will run `zpool import -f` when
47 attempting to import pools if the required pool isn't automatically imported
48 by the zfs module. This can save you a trip to a bootcd if hostid has
49 changed, but is dangerous and can lead to zpool corruption, particularly in
50 cases where storage is on a shared fabric such as iSCSI where multiple hosts
51 can access storage devices concurrently. _Please understand the implications
52 of force-importing a pool before enabling this option!_
53
54 * `spl_hostid`: By default, the hostid used by the SPL module is read from
55 /etc/hostid inside the initramfs. This file is placed there from the host
56 system when the initramfs is built which effectively ties the ramdisk to the
57 host which builds it. If a different hostid is desired, one may be set in
58 this attribute and will override any file present in the ramdisk. The
59 format should be hex exactly as found in the `/etc/hostid` file, IE
60 `spl_hostid=0x00bab10c`.
61
62 Note that changing the hostid between boots will most likely lead to an
63 un-importable pool since the last importing hostid won't match. In order
64 to recover from this, you may use the `zfs_force` option or boot from a
65 different filesystem and `zpool import -f` then `zpool export` the pool
66 before rebooting with the new hostid.
67
68 How it Works
69 ============
70
71 The Dracut module consists of the following files (less Makefile's):
72
73 * `module-setup.sh`: Script run by the initramfs builder to create the
74 ramdisk. Contains instructions on which files are required by the modules
75 and z* programs. Also triggers inclusion of `/etc/hostid` and the zpool
76 cache. This file is not included in the initramfs.
77
78 * `90-zfs.rules`: udev rules which trigger loading of the ZFS modules at boot.
79
80 * `zfs-lib.sh`: Utility functions used by the other files.
81
82 * `parse-zfs.sh`: Run early in the initramfs boot process to parse kernel
83 command line and determine if ZFS is the active root filesystem.
84
85 * `mount-zfs.sh`: Run later in initramfs boot process after udev has settled
86 to mount the root dataset.
87
88 * `export-zfs.sh`: Run on shutdown after dracut has restored the initramfs
89 and pivoted to it, allowing for a clean unmount and export of the ZFS root.
90
91 `zfs-lib.sh`
92 ------------
93
94 This file provides a few handy functions for working with ZFS. Those
95 functions are used by the `mount-zfs.sh` and `export-zfs.sh` files.
96 However, they could be used by any other file as well, as long as the file
97 sources `/lib/dracut-zfs-lib.sh`.
98
99 `module-setup.sh`
100 -----------------
101
102 This file is run by the Dracut script within the live system, not at boot
103 time. It's not included in the final initramfs. Functions in this script
104 describe which files are needed by ZFS at boot time.
105
106 Currently all the various z* and spl modules are included, a dependency is
107 asserted on udev-rules, and the various zfs, zpool, etc. helpers are included.
108 Dracut provides library functions which automatically gather the shared libs
109 necessary to run each of these binaries, so statically built binaries are
110 not required.
111
112 The zpool and zvol udev rules files are copied from where they are
113 installed by the ZFS build. __PACKAGERS TAKE NOTE__: If you move
114 `/etc/udev/rules/60-z*.rules`, you'll need to update this file to match.
115
116 Currently this file also includes `/etc/hostid` and `/etc/zfs/zpool.cache`
117 which means the generated ramdisk is specific to the host system which built
118 it. If a generic initramfs is required, it may be preferable to omit these
119 files and specify the `spl_hostid` from the boot loader instead.
120
121 `parse-zfs.sh`
122 --------------
123
124 Run during the cmdline phase of the initramfs boot process, this script
125 performs some basic sanity checks on kernel command line parameters to
126 determine if booting from ZFS is likely to be what is desired. Dracut
127 requires this script to adjust the `root` variable if required and to set
128 `rootok=1` if a mountable root filesystem is available. Unfortunately this
129 script must run before udev is settled and kernel modules are known to be
130 loaded, so accessing the zpool and zfs commands is unsafe.
131
132 If the root=ZFS... parameter is set on the command line, then it's at least
133 certain that ZFS is what is desired, though this script is unable to
134 determine if ZFS is in fact available. This script will alter the `root`
135 parameter to replace several historical forms of specifying the pool and
136 dataset name with the canonical form of `zfs:pool/dataset`.
137
138 If no root= parameter is set, the best this script can do is guess that
139 ZFS is desired. At present, no other known filesystems will work with no
140 root= parameter, though this might possibly interfere with using the
141 compiled-in default root in the kernel image. It's considered unlikely
142 that would ever be the case when an initramfs is in use, so this script
143 sets `root=zfs:AUTO` and hopes for the best.
144
145 Once the root=... (or lack thereof) parameter is parsed, a dummy symlink
146 is created from `/dev/root` -> `/dev/null` to satisfy parts of the Dracut
147 process which check for presence of a single root device node.
148
149 Finally, an initqueue/finished hook is registered which causes the initqueue
150 phase of Dracut to wait for `/dev/zfs` to become available before attempting
151 to mount anything.
152
153 `mount-zfs.sh`
154 --------------
155
156 This script is run after udev has settled and all tasks in the initqueue
157 have succeeded. This ensures that `/dev/zfs` is available and that the
158 various ZFS modules are successfully loaded. As it is now safe to call
159 zpool and friends, we can proceed to find the bootfs attribute if necessary.
160
161 If the root parameter was explicitly set on the command line, no parsing is
162 necessary. The list of imported pools is checked to see if the desired pool
163 is already imported. If it's not, and attempt is made to import the pool
164 explicitly, though no force is attempted. Finally the specified dataset
165 is mounted on `$NEWROOT`, first using the `-o zfsutil` option to handle
166 non-legacy mounts, then if that fails, without zfsutil to handle legacy
167 mount points.
168
169 If no root parameter was specified, this script attempts to find a pool with
170 its bootfs attribute set. First, already-imported pools are scanned and if
171 an appropriate pool is found, no additional pools are imported. If no pool
172 with bootfs is found, any additional pools in the system are imported with
173 `zpool import -N -a`, and the scan for bootfs is tried again. If no bootfs
174 is found with all pools imported, all pools are re-exported, and boot fails.
175 Assuming a bootfs is found, an attempt is made to mount it to `$NEWROOT`,
176 first with, then without the zfsutil option as above.
177
178 Ordinarily pools are imported _without_ the force option which may cause
179 boot to fail if the hostid has changed or a pool has been physically moved
180 between servers. The `zfs_force` kernel parameter is provided which when
181 set to `1` causes `zpool import` to be run with the `-f` flag. Forcing pool
182 import can lead to serious data corruption and loss of pools, so this option
183 should be used with extreme caution. Note that even with this flag set, if
184 the required zpool was auto-imported by the kernel module, no additional
185 `zpool import` commands are run, so nothing is forced.
186
187 `export-zfs.sh`
188 ---------------
189
190 Normally the zpool containing the root dataset cannot be exported on
191 shutdown as it is still in use by the init process. To work around this,
192 Dracut is able to restore the initramfs on shutdown and pivot to it.
193 All remaining process are then running from a ramdisk, allowing for a
194 clean unmount and export of the ZFS root. The theory of operation is
195 described in detail in the [Dracut manual](https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html#_dracut_on_shutdown).
196
197 This script will try to export all remaining zpools after Dracut has
198 pivoted to the initramfs. If an initial regular export is not successful,
199 Dracut will call this script once more with the `final` option,
200 in which case a forceful export is attempted.
201
202 Other Dracut modules include similar shutdown scripts and Dracut
203 invokes these scripts round-robin until they succeed. In particular,
204 the `90dm` module installs a script which tries to close and remove
205 all device mapper targets. Thus, if there are ZVOLs containing
206 dm-crypt volumes or if the zpool itself is backed by a dm-crypt
207 volume, the shutdown scripts will try to untangle this.