freebsd-dev/contrib/initramfs
Damian Szuberski 35d81a75a8
initramfs: use mount.zfs instead of mount
A followup to d7a67402a8

For `mount -t zfs -o opts ds mp` command line
some implementations of `mount(8)`, e. g. Busybox in Debian
work as follows:

```
newfstatat(AT_FDCWD, "ds", 0x7fff826f4ab0, 0) = -1
mount("ds", "mp", "zfs", MS_SILENT, NULL) = 0
```

The logic above skips completely `mount.zfs` and prevents us
from reading filesystem properties and applying mount options.

For comparison, the coreutils `mount(8)` implementation does:

```
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
// figure out that zfs is a `nodev` filesystem and look for a helper
newfstatat(AT_FDCWD, "/sbin/mount.zfs" ...) = 0
execve("/sbin/mount.zfs" ...) = 0
```

Using `mount.zfs` in initramfs would help circumvent deficiencies
of some of `mount(8)` implementations. `mount -t zfs` translates
to `mount.zfs` invocation, except for cases when explicitly disabled
by `-i`.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: szubersk <szuberskidamian@gmail.com>
Closes #13305
2022-04-11 15:51:23 -07:00
..
conf-hooks.d Cleanup contrib/initramfs automake 2020-05-07 16:39:08 -07:00
conf.d Cleanup contrib/initramfs automake 2020-05-07 16:39:08 -07:00
hooks Add --enable=all to ShellCheck by default 2022-02-07 11:59:09 -08:00
scripts initramfs: use mount.zfs instead of mount 2022-04-11 15:51:23 -07:00
Makefile.am contrib: rename initrd READMEs to README.md 2022-02-11 11:44:27 -08:00
README.md contrib: rename initrd READMEs to README.md 2022-02-11 11:44:27 -08:00
zfsunlock Silence 'make checkbashisms' 2020-08-20 13:45:47 -07:00

Description

These scripts are intended to be used with initramfs-tools, which is a similar software product to dracut (which is used in Red Hat based distributions), and is mainly used by Debian GNU/Linux and derivatives.

These scripts share some common functionality with the SysV init scripts, primarily the /etc/zfs/zfs-functions script.

Configuration

Root pool/filesystem

Different distributions have their own standard on what to specify on the kernel command line to boot off a ZFS filesystem.

This script supports the following kernel command line argument combinations (in this order - first match wins):

  • rpool=<pool>
  • bootfs=<pool>/<dataset>
  • rpool=<pool> bootfs=<pool>/<dataset>
  • -B zfs-bootfs=<pool>/<fs>
  • root=<pool>/<dataset>
  • root=ZFS=<pool>/<dataset>
  • root=zfs:AUTO
  • root=zfs:<pool>/<dataset>
  • rpool=rpool

If a pool is specified, it will be used. Otherwise, in AUTO mode, all pools will be searched. Pools may be excluded from the search by listing them in ZFS_POOL_EXCEPTIONS in /etc/default/zfs.

Pools will be imported as follows:

  • Try /dev/disk/by-vdev if it exists; see /etc/zfs/vdev_id.conf.
  • Try /dev/disk/by-id and any other /dev/disk/by-* directories.
  • Try /dev.
  • Use the cache file if nothing else worked.

This order may be modified by setting ZPOOL_IMPORT_PATH in /etc/default/zfs.

If a dataset is specified, it will be used as the root filesystem. Otherwise, this script will attempt to find a root filesystem automatically (in the specified pool or all pools, as described above).

Filesystems below the root filesystem will be automatically mounted with no additional configuration necessary. For example, if the root filesystem is rpool/ROOT/rootfs, rpool/root/rootfs/var, rpool/root/rootfs/usr, etc. will be mounted (if they exist).

Snapshots

The <dataset> can be a snapshot. In this case, the snapshot will be cloned and the clone used as the root filesystem. Note:

  • If the snapshot does not exist, the base dataset (the part before @) is used as the boot filesystem instead.
  • If the resulting clone dataset already exists, it is destroyed.
  • The clone is created with mountpoint=none and canmount=noauto. The root filesystem is mounted manually by the initramfs script.
  • If no snapshot is specified on the root= kernel command line, but there is an @, the user will be prompted to choose a snapshot to use.

Extra options

The following kernel command line arguments are supported:

  • zfsdebug=(on,yes,1): Show extra debugging information
  • zfsforce=(on,yes,1): Force import the pool
  • rollback=(on,yes,1): Rollback to (instead of clone) the snapshot

Unlocking a ZFS encrypted root over SSH

To use this feature:

  1. Install the dropbear-initramfs package. You may wish to uninstall the cryptsetup-initramfs package to avoid warnings.
  2. Add your SSH key(s) to /etc/dropbear-initramfs/authorized_keys. Note that Dropbear does not support ed25519 keys before version 2020.79; in that case, use RSA (2048-bit or more) instead.
  3. Rebuild the initramfs with your keys: update-initramfs -u
  4. During the system boot, login via SSH and run: zfsunlock