forked from openzfs/zfs
-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NAS-127825 / 25.04 / Fix inconsistent mount options for ZFS root #257
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
While mounting ZFS root during boot on Linux distributions from initrd, mount from busybox is effectively used which executes mount system call directly. This skips the ZFS helper mount.zfs, which checks and enables the mount options as specified in dataset properties. As a result, datasets mounted during boot from initrd do not have correct mount options as specified in ZFS dataset properties. There has been an attempt to use mount.zfs in zfs initrd script, responsible for mounting the ZFS root filesystem (PR#13305). This was later reverted (PR#14908) after discovering that using mount.zfs breaks mounting of snapshots on root (/) and other child datasets of root have the same issue (Issue#9461). This happens because switching from busybox mount to mount.zfs correctly parses the mount options but also adds 'mntpoint=/root' to the mount options, which is then prepended to the snapshot mountpoint in '.zfs/snapshot'. '/root' is the directory on Debian with initramfs-tools where root filesystem is mounted before pivot_root. When Linux runtime is reached, trying to access the snapshots on root results in automounting the snapshot on '/root/.zfs/*', which fails. This commit attempts to fix the automounting of snapshots on root, while using mount.zfs in initrd script. Since the mountpoint of dataset is stored in vfs_mntpoint field, we can check if current mountpoint of dataset and vfs_mntpoint are same or not. If they are not same, reset the vfs_mntpoint field with current mountpoint. This fixes the mountpoints of root dataset and children in respective vfs_mntpoint fields when we try to access the snapshots of root dataset or its children. With correct mountpoint for root dataset and children stored in vfs_mntpoint, all snapshots of root dataset are mounted correctly and become accessible. This fix will come into play only if current process, that is trying to access the snapshots is not in chroot context. The Linux kernel API that is used to convert struct path into char format (d_path), returns the complete path for given struct path. It works in chroot environment as well and returns the correct path from original filesystem root. However d_path fails to return the complete path if any directory from original root filesystem is mounted using --bind flag or --rbind flag in chroot environment. In this case, if we try to access the snapshot from outside the chroot environment, d_path returns the path correctly, i.e. it returns the correct path to the directory that is mounted with --bind flag. However inside the chroot environment, it only returns the path inside chroot. For now, there is not a better way in my understanding that gives the complete path in char format and handles the case where directories from root filesystem are mounted with --bind or --rbind on another path which user will later chroot into. So this fix gets enabled if current process trying to access the snapshot is not in chroot context. With the snapshots issue fixed for root filesystem, using mount.zfs in ZFS initrd script, mounts the datasets with correct mount options. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Alexander Motin <[email protected]> Reviewed-by: Ameer Hamza <[email protected]> Signed-off-by: Umer Saleem <[email protected]> Closes openzfs#16646
ixhamza
approved these changes
Oct 21, 2024
amotin
approved these changes
Oct 21, 2024
Not updating JIRA ticket https://ixsystems.atlassian.net/browse/NAS-127825 target versions as no JIRA version corresponds to this PR |
This PR has been merged and conversations have been locked. |
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation and Context
Backport of openzfs#16646 for TrueNAS ZFS.
Description
While mounting ZFS root during boot on Linux distributions from initrd, mount from busybox is effectively used which executes
mount
system call directly. This skips the ZFS helpermount.zfs
, which checks and enables the mount options as specified in dataset properties. As a result, datasets mounted during boot from initrd do not have correct mount options as specified in ZFS dataset properties.There has been an attempt to use
mount.zfs
in zfs initrd script, responsible for mounting the ZFS root filesystem (PR#13305). This was later reverted (PR#14908) after discovering that using mount.zfs breaks mounting of snapshots on root (/
) and child datasets of root have the same issue (Issue#9461).This happens because switching from busybox mount to mount.zfs correctly parses the mount options but also adds
mntpoint=/root
to the mount options, which is then prepended to the snapshot mountpoint in.zfs/snapshot
./root
is the directory on Debian withinitramfs-tools
where root filesystem is mounted beforepivot_root
. When Linux runtime is reached, trying to access the snapshots on root results in automounting the snapshot on/root/.zfs/*
, which fails.This commit attempts to fix the automounting of snapshots on root, while using
mount.zfs
in initrd script. Since the mountpoint of dataset is stored invfs_mntpoint
field, we can check if current mountpoint of dataset andvfs_mntpoint
are same or not. If they are not same, reset thevfs_mntpoint
field with current mountpoint. This fixes the mountpoints of root dataset and children in respectivevfs_mntpoint
fields when we try to access the snapshots of root dataset or its children. With correct mountpoint for root dataset and children stored invfs_mntpoint
, all snapshots of root dataset are mounted correctly and become accessible.This fix will come into play only if current process, that is trying to access the snapshots is not in chroot context. The Linux kernel API that is used to convert struct path into char format (
d_path
), returns the complete path for givenstruct path
. It works in chroot environment as well and returns the correct path from original filesystem root.However,
d_path
fails to return the complete path if any directory from original root filesystem is mounted using--bind
flag or--rbind
flag in chroot environment. In this case, if we try to access the snapshot from outside the chroot environment,d_path
returns the path correctly, i.e. it returns the correct path to the directory that is mounted with--bind
flag. However inside the chroot environment, it only returns the path inside chroot.For now, there is not a better way in my understanding that gives the complete path in char format and handles the case where directories from root filesystem are mounted with
--bind
or--rbind
on another path which user will later chroot into. So this fix gets enabled if current process trying to access the snapshot is not in chroot context.With the snapshots issue fixed for root filesystem, using
mount.zfs
in ZFS initrd script, mounts the datasets with correct mount options.How Has This Been Tested?
/
while usingmount.zfs
to mount ZFS root during boot.--bind/--rbind
case)SCALE Build: http://jenkins.eng.ixsystems.net:8080/job/master/job/custom/624/artifact/
API Tests: http://jenkins.eng.ixsystems.net:8080/job/tests/job/api_tests/1413/#showFailuresLink
Types of changes
Checklist:
Signed-off-by
.