0%

文件IO测试调研

1. 文件IO测试调研

1.1. 测试环境

直接创建物理分区的测试环境比较麻烦, 而且操作硬盘如果出现误操作可能会对硬盘上的数据产生损坏.
而创建虚拟分区的方法则比较安全, 还可以对其应用硬盘加密/启用多个文件系统等操作, 比较方便.
本篇先通过建立一个虚拟的分区来测试文件IO

1.1.1. 建立虚拟分区

执行歩骤:

1
2
3
4
5
6
7
# 建立20M的虚拟硬盘
dd if=/dev/zero of=~/test.img bs=1M count=20
#在虚拟设备上创建文件系统
mkfs.ext4 -q ~/test.img
e2label new.img rootfs
#挂载虚拟镜像到本地进行使用
sudo mount -t ext4 ~/test.img ~/test

为测试文件io权限等, 可以对文件系统添加quota支持

1
2
3
4
5
6
7
8
9
# 对虚拟映像添加quota支持
sudo mount -o rw,usrjquota=aquota.user,jqfmt=vfsv0 ~/test.img ~/test
sudo quotacheck -cugv ~/test
# 添加用户
sudo useradd quota1 -d ~/test/quota1
# 对用户添加quota限制
sudo edquota -u quota1
# 启用quota
quotaon ~/test

1.2. File io测试

挂载到本地目录test后, 可以对其进行文件io测试.
以创建目录为例

1
2
3
4
#可以先将test目录填满
dd if=/dev/zero of=largefile count=1024 bs=30M
#也可以修改文件的owener为其他的
sudo chown quota1 -R test

创建目录

1
2
3
4
5
6
7
8
9
10
Path testDir = Paths.get("/home/newdisk1/liguang.zhang/test", "testdir");
try {
Path path = Files.createDirectories(testDir);
System.out.println(path.toAbsolutePath() + " create success" );
} catch (IOException e) {
e.printStackTrace();
if(e instanceof FileSystemException) {
System.out.println(((FileSystemException) e).getReason());
}
}

对应没有权限时的trace

1
2
3
4
5
6
7
8
9
java.nio.file.AccessDeniedException: /home/newdisk1/liguang.zhang/test/testdir
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
at java.nio.file.Files.createDirectory(Files.java:674)
at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
at java.nio.file.Files.createDirectories(Files.java:767)
at Test.main(Test.java:39)

对应空间满的情况下的trace

1
2
3
4
5
6
7
8
9
10
java.nio.file.FileSystemException: /home/newdisk1/liguang.zhang/test/testdir: No space left on device
No space left on device
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
at java.nio.file.Files.createDirectory(Files.java:674)
at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
at java.nio.file.Files.createDirectories(Files.java:767)
at Test.main(Test.java:39)

可以通过e.getReason方法取出对应的exception的报错原因.