NFStest
NFStest提供了一组用于测试NFS客户端或NFS服务器的工具,其中包括主要用于测试客户端的测试。这些工具包括以下内容:
测试实用程序包
提供了一组用于测试NFS客户端或NFS服务器的工具,大部分功能主要集中在测试客户端上。这些工具包括以下内容:
- 处理命令行参数
- 提供通过/未通过功能
- 提供测试分组功能
- 提供多客户端支持
- 日志记录机制
- 调试信息控制
- Mount/Unmount控制
- 创建文件/目录
- 提供启动数据包跟踪的机制
- 提供模拟网络分区的机制
- 支持pNFS测试
数据包跟踪包
NFS测试主要使用测试工具来完成,如connectathon测试套件、filebench、iozone和其他工具。但主要使用connectathon测试套件。这些都是很好的测试工具,但它们已经过时,也不能用于彻底测试pNFS。
例如,可以在pNFS上运行connectathon测试套件,它运行,通过所有测试——但我们如何确保pNFS正常工作呢。我们如何验证一个布局是否被授予,而不仅仅是一个布局被授予,什么类型的布局被授予(read,rw)。客户端是否将IO发送到数据服务器或元数据服务器。
数据包跟踪模块获取tcpdump创建的跟踪文件,并对每个数据包的内容进行解包。可以一次解码一个数据包,也可以搜索特定的数据包。此模块与其他用于解码跟踪文件的工具之间的主要区别在于,可以使用此模块来完全自动化测试。
它是如何工作的?它打开跟踪文件,每次读取一条记录,跟踪每条记录的起始位置。通过这种方式,可以打开非常大的跟踪文件,而不必等待文件加载,并避免将整个文件加载到内存中。
支持的数据包层:
- Ethernet II (RFC 894)
- IP layer (仅支持v4)
- TCP layer
- RPC layer
- NFS v4.0
- NFS v4.1包括pNFS文件布局
- NFS v4.2
- PORTMAP v2
- MOUNT v3
- NLM v4
要求和限制
为了运行包含的测试,所有客户端主机中的用户id都必须有权使用“sudo”命令以root身份运行命令,而无需密码,这包括执行测试的主机。这用于运行诸如“mount”和“umount”之类的命令。此外,如果测试需要使用多个客户端,则用户id必须能够ssh到远程主机,而无需密码。
网络分区是通过使用“iptables”来模拟的,请注意,每次运行测试后,iptables都会被刷新和重置,因此之前设置的任何规则都将丢失。目前,还没有将iptables规则恢复到其原始状态的机制。
包含的测试
nfstest_alloc - 空间预留试验
验证空间保留的正确功能,以便应用程序能够为文件保留或取消保留空间。系统调用fallocate用于操作为文件分配的磁盘空间,以预分配或释放它。对于支持fallocate系统调用的文件系统,通过分配块并将其标记为未初始化来快速完成预分配,不需要对数据块进行I/O操作。这比创建一个文件并用零填充要快得多。
基本分配测试通过在分配后填满设备来验证磁盘空间实际上是为给定范围预分配或保留的,并确保可以将数据写入分配的范围而不会出现问题。此外,当设备上没有剩余空间时,在分配范围之外写入的任何数据都将使用NFS4ERR_NOSPC失败。
另一方面,释放空间将把磁盘空间还给未预先分配的区域上的相同文件或不同文件使用,而不会出现无空间错误的风险。
适用于NFSv4.2及更高版本
nfstest_cache - NFS客户端缓存测试
通过更改acregmin、acregmax、acdirmin、acdirmax和activo来验证属性缓存的一致性。通过改变acregmin、acregmax、acdirmin、acdirmax和activo来验证数据缓存的一致性。
适用于任何版本的NFS
nfstest_delegation - 委托测试
基本委托测试验证在打开文件进行读写时是否授予了正确的委托。此外,当客户端持有委托时,不应该为同一文件发送另一个OPEN。验证所有I/O操作的stateid应该是委托的stateid。当客户端持有读委托时,从不同进程对同一文件的读取不应该导致客户端发送额外的READ数据包。此外,当客户端持有委托时,不应该向服务器发送LOCK包。
收回委托测试验证当冲突操作从不同的客户端发送到服务器时,是否收回委托。冲突操作是对同一文件的读、写和修改权限。请注意,从不同的客户端读取文件只能收回读取委托。此外,请验证在授予其他客户端读取委托时是否未收回委托。收回委托后,客户端应在返回委托之前发送一个带有CLAIM_DELEGATE_CUR的OPEN,并且状态ID应与原始的OPEN状态ID相同。此外,在返回委托之前重新打开文件时,不应授予委托。验证客户端在返回WRITE委托之前是否刷新所有写入的数据。LOCK也应在返回被召回的委托之前立即发送。不应该在第二个客户端上授予导致第一个客户端上的委托召回的委托。
对任何授予委托的NFS版本都有效
nfstest_dio - 直接I/O测试
功能性直接I/O测试验证每个读/写都被发送到服务器,而不是客户端缓存请求。客户端通过只发送带有请求字节的read来绕过预读。验证客户端在读取整个文件时是否正确处理eof标记。验证客户端在写入文件时忽略委派。
pNFS上的直接I/O测试分别验证客户端是否使用与PAGESIZE对齐的缓冲区向正确的DS或MDS发送READ/WRITE。
直接I/O数据正确性测试验证使用缓冲I/O写入的文件是否可使用直接I/O正确读取。验证使用直接I/O写入的文件是否可使用缓冲I/O正确读取。
矢量I/O测试验证当所有矢量对齐PAGESIZE时,多个矢量合并为一个READ/WRITE数据包。具有不同排列的矢量在单独的数据包上发送。
适用于NFSv4.0和NFSv4.1,包括pNFS。
nfstest_interop - NFS互操作性测试
基本互操作性测试验证使用不同版本的NFS写入的文件是否正确写入。通过使用一个NFS版本读取文件来验证文件的内容。
测试每次附加一个来自不同版本的NFS的不同数据,然后读取文件的内容以验证是否正确写入。每个测试都要这样做两次。
nfstest_lock - 锁定测试
基本锁定测试验证是否使用fcntl的各种参数授予了锁。这些锁包括阻塞锁和非阻塞锁、读锁或写锁,在这些锁中,文件打开是为了读、写或同时打开。它还检查不同的范围,包括极限条件。
非重叠测试验证在锁定同一文件时对被测试客户端和第二个进程或远程客户端都授予了锁。
重叠测试验证在被测试的客户端上授予了锁,如果在第二个进程或远程客户端上发出非阻塞锁,则将拒绝授予锁,如果在第二个进程或远程客户端上发出阻塞锁,则将阻止授予锁。
适用于任何版本的NFS
nfstest_pnfs - 基本的pNFS功能测试
验证文件的基本pNFS功能(READ和WRITE),包括在同一挂载中打开第二个文件并锁定该文件。此外,在先读取文件然后写入文件的同时,验证为READ和WRITE打开的文件的基本pNFS功能,或者先写入文件然后读取文件。这些测试还验证了pNFS和NFSv4.1的正确功能:
- 验证EXCHANGE_ID是否发送到MDS
- 验证CREATE_SESSION是否发送到MDS
- 验证LAYOUTGET是否发送到MDS(检查布局类型、iomode、布局范围)
- 验证GETDEVICEINFO是否发送给MDS
- 验证EXCHANGE_ID发送到正确的DS
- 验证CREATE_SESSION是否被发送到DS
- 验证READ/WRITE被发送到DS(检查正确的statid,正确的偏移量和大小)
- 验证没有向DS发送GETATTR
只有在启用了pNFS和文件布局类型的NFSv4.1下才有效
nfstest_sparse - 稀疏文件测试
验证稀疏文件的正确功能。这些文件将未分配或未初始化的数据块作为漏洞。新的NFSv4.2操作SEEK用于搜索文件中的下一个孔或数据段。
基本测试验证SEEK操作返回下一个孔的正确偏移量或相对于给予SEEK系统调用的起始偏移量的数据。验证SEEK操作是否以READ调用的形式以正确的stateid发送到服务器。所有文件在文件末尾都有一个虚拟孔,所以当搜索下一个孔时,即使文件没有孔,它也会返回文件的大小。
适用于NFSv4.2及更高版本
nfstest_posix - POSIX文件系统级访问测试
使用阳性和阴性测试验证指定路径上的POSIX文件系统级访问。
适用于任何版本的NFS
nfstest_ssc - 服务器端复制
验证正确的服务器端复制功能
通过NFS复制文件时,客户机从源文件读取数据,然后将相同的数据写入目标文件,目标文件位于同一台服务器上,也可以位于不同的服务器上。无论哪种方式,文件数据都传输两次,一次用于读取,第二次用于写入。服务器端复制可以消除不必要的网络流量。服务器内部复制允许客户端请求服务器在内部执行复制,从而完全避免通过网络发送任何数据。对于目标服务器与源服务器不同的服务器间复制,客户端授权两个服务器直接相互交互。
基本服务器端复制测试验证从源文件到目标文件的实际文件范围是否正确复制。大多数测试在验证数据是否正确复制的同时处理单个源文件和目标文件。它还验证数据是否从正确的源偏移量开始复制,以及是否复制到目标文件的正确偏移量。其他测试处理多个文件:将多个源文件复制到单个目标文件,将单个源文件复制多个目标文件,或将N个源文件拷贝到M个目标文件。
工具
nfstest_io
此I/O工具用于创建和操作不同类型的文件。参数允许在指定的时间段内运行,也允许运行多个进程。每个进程一次修改一个文件,并且每个进程的文件名称空间不同,因此在修改同一文件的两个不同进程之间不会发生冲突。
nfstest_pkt
解码并显示给定的数据包跟踪文件中的所有数据包。
match选项提供了在数据包跟踪文件中搜索特定数据包的功能。其他选项允许在只匹配其中一个时显示相应的调用或回复。如果使用了start和/或end选项,则只能显示一定范围的数据包。
nfstest_file
显示指定路径的所有NFS数据包。它采用一个相对路径,搜索路径中给定的每个目录条目,直到获得文件所在目录的文件句柄。一旦找到目录文件句柄,就会在LOOKUP或OPEN/CREATE中搜索给定的文件名。如果找到文件查找或创建,则会搜索与该文件相关联的所有文件句柄和状态ID,并显示找到的所有数据包,包括它们各自的回复。
nfstest_xid
搜索所有给定的数据包跟踪以查找XID不一致。验证NFSv4.x COMPOND回复中的所有操作是否与调用中给定的操作相同。
对NFSv4及以上版本的数据包跟踪有效
手册页
手册页可以在这里找到。
下载
主git存储库:
- git clone git://linux-nfs.org/projects/mora/nfstest
- NFStest gitweb
发布版本:
- NFStest-3.2.tar.gz
- NFStest-3.1.tar.gz
- NFStest-3.0.tar.gz
- NFStest-2.2.1.tar.gz
- NFStest-2.2.0.tar.gz
- NFStest-2.1.9.tar.gz
- NFStest-2.1.8.tar.gz
- NFStest-2.1.7.tar.gz
- NFStest-2.1.6.tar.gz
- NFStest-2.1.5.tar.gz
- NFStest-2.1.4.tar.gz
- NFStest-2.1.3.tar.gz
- NFStest-2.1.2.tar.gz
- NFStest-2.1.1.tar.gz
- NFStest-2.1.tar.gz
- NFStest-2.0.tar.gz
- NFStest-1.0.11.tar.gz
- NFStest-1.0.10.tar.gz
- NFStest-1.0.9.tar.gz
- NFStest-1.0.8.tar.gz
- NFStest-1.0.7.tar.gz
- NFStest-1.0.2.tar.gz
- NFStest-1.0.1.tar.gz
安装
-
以root用户安装rpm
# rpm -i NFStest-1.0.1-1.noarch.rpm
所有手册页都可用
$ man nfstest
运行测试:
$ nfstest_pnfs --help
-
解压tarball
$ cd ~ $ tar -zxvf NFStest-1.0.1.tar.gz
测试无需安装即可运行,只需设置python路径即可
环境变量:$ export PYTHONPATH=~/NFStest-1.0.1 $ cd NFStest-1.0.1/test $ ./nfstest_pnfs --help
或者安装到标准python site-packages和可执行目录:
$ cd ~/NFStest-1.0.1 $ sudo python setup.py install
所有手册页都可用
$ man nfstest
运行测试:
$ nfstest_pnfs --help
-
克隆git存储库:
$ cd ~ $ git clone git://linux-nfs.org/projects/mora/nfstest
测试无需安装即可运行,只需设置python路径即可
环境变量:$ export PYTHONPATH=~/nfstest $ cd nfstest/test $ ./nfstest_pnfs --help
或者安装到标准python site-packages和可执行目录:
$ cd ~/nfstest $ sudo python setup.py install
所有手册页都可用
$ man nfstest
运行测试:
$ nfstest_pnfs --help
设置
确保运行测试的用户可以使用sudo
运行命令,而不需要密码。
确保运行测试的用户可以使用ssh
远程运行命令,而无需密码。这只适用于需要多个客户端的测试。
在所有客户端上创建由–mtpoint(默认值:/mnt/t)选项指定的挂载点:
$ sudo mkdir /mnt/t
$ sudo chmod 777 /mnt/t
示例
-
nfstest_pnfs
唯一需要的选项是–server
$ nfstest_pnfs --server 192.168.0.11
-
nfstest_cache
必需的选项是–server和–client
$ nfstest_cache --server 192.168.0.11 --client 192.168.0.20
-
nfstest_delegation
唯一需要的选项是–server,但只会运行基本的委托测试。要运行收回测试,必须使用–client选项
$ nfstest_delegation --server 192.168.0.11 --client 192.168.0.20
-
nfstest_dio
唯一需要的选项是–server
$ nfstest_dio --server 192.168.0.11
-
nfstest_posix
唯一需要的选项是–server
$ nfstest_posix --server 192.168.0.11
有用的选项
-
–help
所有测试都有显示使用信息和可用选项的选项。
-
–createlog
在指定时创建日志文件。
-
–keeptraces
不要在执行结束时删除任何跟踪文件。
-
–verbose <none|opts|info|debug|all|intbitmask>
信息/调试消息的详细级别
示例:
$ nfstest_posix --server 192.168.0.11 --verbose all $ nfstest_posix --server 192.168.0.11 --verbose 0x0F
-
–runtest <[^]testname1[,testname2[,…]]>
要运行的测试列表,以逗号分隔。
如果列表中的第一个字符是
^
,则运行除列出的测试外的所有测试。示例:
只运行access、chdir、create和fcntl测试
$ nfstest_posix --server 192.168.0.11 --runtest access,chdir,creat,fcntl
运行除open和chmod之外的所有测试
$ nfstest_posix --server 192.168.0.11 --runtest ^open,chmod
-
–tverbose <group|normal|verbose>
测试消息的详细级别(默认:正常)。
当tverbose=group时,如果组中所有测试都通过,则只有测试组显示为PASS,否则显示为FAIL。在某些测试中,如果某个特定测试具有许多子测试(>100),那么tverbose可能会变得“冗长”。
示例:
$ nfstest_posix --server 192.168.0.11 *** Verify POSIX API access() on NFSv4 PASS: access - file access allowed with mode F_OK PASS: access - file access not allowed with mode F_OK for a non-existent file PASS: access - file access allowed with mode R_OK for file with permissions 0777 PASS: access - file access allowed with mode W_OK for file with permissions 0777 PASS: access - file access allowed with mode X_OK for file with permissions 0777 ... $ nfstest_posix --server 192.168.0.11 --tverbose group PASS: Verify POSIX API access() on NFSv4 (58 passed, 0 failed)
-
–bugmsgs
包含测试消息的文件,在测试失败时将其标记为bug。
当至少有一个测试失败时,退出代码将设置为1。当指定此选项时,所有已知的bug都不会被计算为失败,因此整个测试执行不会失败。如果已知的bug确实通过了,那么使用这个选项将使测试失败,从而让用户知道错误已经被修复。
-
–ignore
忽略bugmsgs给出的所有bug。
如果指定此选项,则忽略bugmsgs给出的所有失败。另一方面,如果一个被标记为bug的测试通过了,使用这个选项,测试就不会像单独使用bugmsgs选项那样失败。
-
–nfsdebug
设置NFS内核调试标志并保存日志消息。
在命令
rpcdebug
上使用为nfs
模块给定的任何有效标志。 -
–rpcdebug
设置RPC内核调试标志并保存日志消息。
在命令
rpcdebug
上使用模块rpc
的任何有效标志。
路线图
No. | Priority | Description |
---|---|---|
1 | 1 | Merge multiple packet traces |
2 | 1 | Add support to create html output of test results |
3 | 1 | Add support to create wiki output of test results |
4 | 3 | Fix rewind() so it does not go back to the start of file |
5 | 1 | Add support for NFSv3 |
6 | 2 | Add support for ancillary protocol NLM |
7 | 2 | Add support for ancillary protocol MOUNT |
8 | 2 | Add support for ancillary protocol NSM |
9 | 3 | Add support for kerberized callbacks for NFSv4.1 |
10 | 3 | Add support for RDMA |
11 | 3 | Add support for NFSv4.2 |
12 | 1 | Collect packet traces on all clients |
13 | 3 | Add Web/GUI interface |
14 | 1 | Add support to clear gcov counters |
15 | 1 | Add more posix tests |
16 | 2 | Add more delegation tests |
17 | 2 | Add tests for close-to-open semantics |
18 | 2 | Add mechanism to manipulate different servers |