[Bug 2059197] Re: mount.nfs: Fix minor version parsing when '-t nfs4' and '-o vers=4.x' are used together
Matthew Ruffell
2059197 at bugs.launchpad.net
Thu Apr 11 05:30:25 UTC 2024
Sanity testing the test package:
https://launchpad.net/~mruffell/+archive/ubuntu/lp2059197-test
nfs-common 1:1.3.4-2.5ubuntu3.6+lp2059197v20240411b1
Testcase for this bug, i.e. the regression.
$ sudo mount -t nfs4 -o vers=4.2 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:14:52 2024
mount.nfs4: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo mount -t nfs4 -o vers=4.1 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:10:26 2024
mount.nfs4: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo mount -t nfs4 -o vers=4.0 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:15:02 2024
mount.nfs4: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo mount -t nfs4 -o vers=4,minorversion=2 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:15:48 2024
mount.nfs4: trying text-based options 'vers=4,vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo mount -t nfs4 -o vers=4,minorversion=1 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:13:33 2024
mount.nfs4: trying text-based options 'vers=4,vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo mount -t nfs4 -o vers=4,minorversion=0 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:15:54 2024
mount.nfs4: trying text-based options 'vers=4,vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
Looks OK.
Testcase for the original bug, 2049262:
$ sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
$ sudo mount -o vers=4 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:17:55 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.2 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:18:01 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.1 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:18:05 2024
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.0 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:18:12 2024
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
Looks OK.
$ sudo cat /proc/fs/nfsd/versions
-2 +3 +4 -4.0 +4.1 +4.2
$ sudo mount -o vers=4 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:20:40 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.2 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:20:47 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.1 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:20:53 2024
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.0 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:21:02 2024
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: Protocol not supported
Looks OK.
$ sudo cat /proc/fs/nfsd/versions
-2 +3 +4 -4.0 +4.1 -4.2
$ sudo mount -o vers=4 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:22:32 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.2 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:22:38 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: Protocol not supported
$ sudo umount /mnt
umount: /mnt: not mounted.
$ sudo mount -o vers=4.1 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:22:44 2024
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.0 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:22:49 2024
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: Protocol not supported
Looks OK.
$ sudo cat /proc/fs/nfsd/versions
-2 +3 +4 -4.1 -4.2
$ sudo mount -o vers=4 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:23:46 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
$ sudo umount /mnt
$ sudo mount -o vers=4.1 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:23:52 2024
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: Protocol not supported
$ sudo umount /mnt
umount: /mnt: not mounted.
$ sudo mount -o vers=4.0 -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:24:04 2024
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
Looks OK.
The missing patch Heitor was talking about:
$ sudo cat /proc/fs/nfsd/versions
-2 +3 -4 -4.0 -4.1 -4.2
Previous *broken* test package without "mount.nfs: Fix auto protocol
negotiation":
$ sudo mount -t nfs4 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:29:19 2024
mount.nfs4: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: Protocol not supported
$ sudo mount -t nfs -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:29:25 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: Protocol not supported
It tries NFS4 only.... Heitor was correct, I need the patch.
NEW test package WITH "mount.nfs: Fix auto protocol negotiation":
$ sudo mount -t nfs -vvv jammy-nfs-server:/ /mnt
mount.nfs: timeout set for Thu Apr 11 05:27:32 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'addr=192.168.122.14'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.122.14 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.122.14 prog 100005 vers 3 prot UDP port 33032
mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting jammy-nfs-server:/
$ sudo mount -t nfs4 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Thu Apr 11 05:28:09 2024
mount.nfs4: trying text-based options 'vers=4.2,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: trying text-based options 'vers=4.1,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: trying text-based options 'vers=4.0,addr=192.168.122.14,clientaddr=192.168.122.249'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: Protocol not supported
-t nfs will attempt v3 also.
Looks OK.
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to nfs-utils in Ubuntu.
https://bugs.launchpad.net/bugs/2059197
Title:
mount.nfs: Fix minor version parsing when '-t nfs4' and '-o vers=4.x'
are used together
Status in nfs-utils package in Ubuntu:
Fix Released
Status in nfs-utils source package in Focal:
In Progress
Bug description:
[Impact]
When specifying both '-t nfs4' and '-o vers=4.x' on the mount command
line, mount.nfs ignores any specific version set with '-o vers=4.x' or
'-o vers=4,minorversion=x', and simply attempts version negotiation,
which due to my recent changes in bug 2049262, would land on the
highest supported nfs version, likely 4.2.
Users who specify what version they want should get the version they
ask for, and thus, this is a regression introduced in
1:1.3.4-2.5ubuntu3.6.
A workaround is to drop '-t nfs4' and to use mount.nfs directly
instead, i.e.:
$ sudo mount.nfs -o vers=4.1 -vvv jammy-nfs-server:/ /mnt
[Testcase]
Create two VMs, one jammy and one focal.
The jammy VM will be the server.
Server VM:
$ sudo hostnamectl set-hostname jammy-nfs-server
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install nfs-kernel-server
$ sudo mkdir /export
$ sudo mkdir /export/users
$ sudo mkdir /home/users
$ sudo vi /etc/fstab # add the following line:
/home/users /export/users none bind 0 0
$ sudo mount -a
$ sudo vi /etc/exports # add the following lines:
/export 192.168.122.0/24(rw,fsid=0,no_subtree_check,sync)
/export/users 192.168.122.0/24(rw,nohide,insecure,no_subtree_check,sync)
$ sudo systemctl restart nfs-server.service
Focal VM:
$ sudo hostnamectl set-hostname focal-nfs-client
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install nfs-common
And then try mounting with both '-t nfs4' and '-o vers=4.1':
$ sudo mount -t nfs4 -o vers=4.1 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Wed Apr 3 00:51:23 2024
mount.nfs4: trying text-based options 'vers=4.2,addr=192.168.122.217,clientaddr=192.168.122.9'
and then try with both '-t nfs4' and '-o vers=4,minorversion=1':
$ sudo mount -t nfs4 -o vers=4,minorversion=1 -vvv jammy-nfs-server:/ /mnt
mount.nfs4: timeout set for Wed Apr 3 02:19:03 2024
mount.nfs4: trying text-based options 'minorversion=1,vers=4.2,addr=192.168.122.217,clientaddr=192.168.122.9'
In each of those mounts, it incorrectly uses protocol version 4.2,
instead of requested 4.1.
If you install the test packages in the following ppa:
https://launchpad.net/~mruffell/+archive/ubuntu/lp2059197-test
then vers should always be 4.1, instead of 4.2.
[Where problems can occur]
It is quite clear now that changing version negotiation and parsing is
quite problematic, after the number of regressions the previous
1:1.3.4-2.5ubuntu3.6 caused the community, and the sheer number of
commits upstream took to resolve lingering issues.
We need to be careful, to make sure we don't introduce any further
regressions.
This time, we are only changing how mount.nfs parses and processes
command line arguments for version specification, and not changing
version negotiation itself. This could impact NFS clients, when they
go to mount NFS filesystems.
If a regression were to occur, then users might have to manually mount
their NFS filesystems or look into autofs. There should be no breaking
changes to any behaviour when mounting NFS filesystems.
There are no changes to nfs server.
[Other Info]
This was fixed multiple times, across the following three commits:
commit 1e3ca7fe199531a372bb8e1c1033d8973097be50
Author: NeilBrown <neilb at suse.com>
Date: Wed Jul 26 13:47:42 2017 -0400
Subject: mount: move handling of "-t nfs4" into nfs_nfs_version()
Link: https://git.linux-nfs.org/?p=steved/nfs-utils.git;a=commitdiff;h=1e3ca7fe199531a372bb8e1c1033d8973097be50
commit 050153ef6a86ff5ab06ef65be36336824a323779
Author: NeilBrown <neilb at suse.com>
Date: Wed Jul 26 13:51:51 2017 -0400
Subject: mount: Fix problems with parsing minorversion=
Link: https://git.linux-nfs.org/?p=steved/nfs-utils.git;a=commitdiff;h=050153ef6a86ff5ab06ef65be36336824a323779
commit 71b807e1a69940beb31fdeb481c2e54509e8bd32
Author: Steve Dickson <steved at redhat.com>
Date: Thu Mar 1 13:52:47 2018 -0500
Subject: mount.nfs: minorversion setting is being ignored with the -t flag
Link: https://git.linux-nfs.org/?p=steved/nfs-utils.git;a=commitdiff;h=71b807e1a69940beb31fdeb481c2e54509e8bd32
commit 5f32083c759b468f5b0cb9302e4fe2848d37cc5b
From: Steve Dickson <steved at redhat.com>
Date: Tue, 10 Apr 2018 10:25:40 -0400
Subject: mount.nfs: Fix auto protocol negotiation
Link: https://git.linux-nfs.org/?p=steved/nfs-utils.git;a=commitdiff;h=5f32083c759b468f5b0cb9302e4fe2848d37cc5b
Jammy has all of these, and does not need any fixes.
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/2059197/+subscriptions
More information about the foundations-bugs
mailing list