Skip to content Skip to main navigation Skip to footer

Ubuntu 16.04 系统下安装ZFS文件系统

本文将会讲述如何在Ubuntu 16.04 LTS 系统里安装并使用ZFS文件系统

ZFS 是由 Sun Microsystems(在 Jeff Bonwick 下)设计和开发的,在 2004 年首次公布,并在 2005 年集成到 Sun Solaris 中)。虽然将最流行的开放式操作系统与谈论最多的、功能最丰富的文件系统配对在一起是最理想的匹配,但是许可证问题限制了集成。Linux 受 GNU 公共许可证(General Public License,GPL)保护,而 ZFS 是遵循由 Sun 的通用开发和发布许可证(Common Development and Distribution License,CDDL)的。这些许可证协议的目标不同,各自的限制会有些冲突。所幸,这并不意味着您作为 Linux 用户不能享受 ZFS 及其供的功能。- 摘自IBM developerworks

ZFS 文件系统作为一种高级的文件系统以及逻辑卷管理工具,可以应用在大多数的Unix或类Unix系统上,如:Solaris, FreeBSD, Linux系统等。
ZFS文件系统的优势可以提供数据保护,数据压缩,卷管理,snapshot, 数据一致性以及对大容量的支持等。

1# Ubuntu16.04 上安装ZFS

执行下面的apt-get命令:

$ sudo apt-get install zfs

或者

$ sudo apt-get install zfsutils-linux

命令输出如下:

正在读取软件包列表... 完成
 正在分析软件包的依赖关系树
 正在读取状态信息... 完成
 注意,选中 'zfsutils-linux' 而非 'zfs'
 下列软件包是自动安装的并且现在不需要了:
 gyp javascript-common libjs-inherits libjs-jquery libjs-node-uuid libjs-underscore libssl-dev libssl-doc libuv1-dev python-pkg-resources zlib1g-dev
 使用'sudo apt autoremove'来卸载它(它们)。
 将会同时安装下列软件:
 libnvpair1linux libuutil1linux libzfs2linux libzpool2linux zfs-doc zfs-zed
 建议安装:
 default-mta | mail-transport-agent samba-common-bin nfs-kernel-server zfs-initramfs
 下列【新】软件包将被安装:
 libnvpair1linux libuutil1linux libzfs2linux libzpool2linux zfs-doc zfs-zed zfsutils-linux
 升级了 0 个软件包,新安装了 7 个软件包,要卸载 0 个软件包,有 5 个软件包未被升级。
 需要下载 897 kB 的归档。
 解压缩后会消耗 2,902 kB 的额外空间。
 您希望继续执行吗? [Y/n] y
 获取:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 zfs-doc all 0.6.5.6-0ubuntu17 [50.1 kB]
 获取:2 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libuutil1linux amd64 0.6.5.6-0ubuntu17 [27.4 kB]
 获取:3 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libnvpair1linux amd64 0.6.5.6-0ubuntu17 [23.5 kB]
 获取:4 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libzpool2linux amd64 0.6.5.6-0ubuntu17 [384 kB]
 获取:5 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libzfs2linux amd64 0.6.5.6-0ubuntu17 [107 kB]
 获取:6 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 zfsutils-linux amd64 0.6.5.6-0ubuntu17 [276 kB]
 获取:7 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 zfs-zed amd64 0.6.5.6-0ubuntu17 [29.7 kB]
 已下载 897 kB,耗时 4秒 (220 kB/s)
 正在选中未选择的软件包 zfs-doc。
 (正在读取数据库 ... 系统当前共安装有 67612 个文件和目录。)
 正准备解包 .../zfs-doc_0.6.5.6-0ubuntu17_all.deb  ...
 正在解包 zfs-doc (0.6.5.6-0ubuntu17) ...
 正在选中未选择的软件包 libuutil1linux。
 正准备解包 .../libuutil1linux_0.6.5.6-0ubuntu17_amd64.deb  ...
 正在解包 libuutil1linux (0.6.5.6-0ubuntu17) ...
 正在选中未选择的软件包 libnvpair1linux。
 正准备解包 .../libnvpair1linux_0.6.5.6-0ubuntu17_amd64.deb  ...
 正在解包 libnvpair1linux (0.6.5.6-0ubuntu17) ...
 正在选中未选择的软件包 libzpool2linux。
 正准备解包 .../libzpool2linux_0.6.5.6-0ubuntu17_amd64.deb  ...
 正在解包 libzpool2linux (0.6.5.6-0ubuntu17) ...
 正在选中未选择的软件包 libzfs2linux。
 正准备解包 .../libzfs2linux_0.6.5.6-0ubuntu17_amd64.deb  ...
 正在解包 libzfs2linux (0.6.5.6-0ubuntu17) ...
 正在选中未选择的软件包 zfsutils-linux。
 正准备解包 .../zfsutils-linux_0.6.5.6-0ubuntu17_amd64.deb  ...
 正在解包 zfsutils-linux (0.6.5.6-0ubuntu17) ...
 正在选中未选择的软件包 zfs-zed。
 正准备解包 .../zfs-zed_0.6.5.6-0ubuntu17_amd64.deb  ...
 正在解包 zfs-zed (0.6.5.6-0ubuntu17) ...
 正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...
 正在处理用于 initramfs-tools (0.122ubuntu8.8) 的触发器 ...
 update-initramfs: Generating /boot/initrd.img-4.4.0-62-generic
 W: mdadm: /etc/mdadm/mdadm.conf defines no arrays.
 正在处理用于 systemd (229-4ubuntu19) 的触发器 ...
 正在处理用于 ureadahead (0.100.0-19) 的触发器 ...
 正在处理用于 man-db (2.7.5-1) 的触发器 ...
 正在设置 zfs-doc (0.6.5.6-0ubuntu17) ...
 正在设置 libuutil1linux (0.6.5.6-0ubuntu17) ...
 正在设置 libnvpair1linux (0.6.5.6-0ubuntu17) ...
 正在设置 libzpool2linux (0.6.5.6-0ubuntu17) ...
 正在设置 libzfs2linux (0.6.5.6-0ubuntu17) ...
 正在设置 zfsutils-linux (0.6.5.6-0ubuntu17) ...
 zfs-import-cache.service is a disabled or a static unit, not starting it.
 zfs-import-scan.service is a disabled or a static unit, not starting it.
 zfs-mount.service is a disabled or a static unit, not starting it.
 正在处理用于 initramfs-tools (0.122ubuntu8.8) 的触发器 ...
 update-initramfs: Generating /boot/initrd.img-4.4.0-62-generic
 W: mdadm: /etc/mdadm/mdadm.conf defines no arrays.
 正在设置 zfs-zed (0.6.5.6-0ubuntu17) ...
 zed.service is a disabled or a static unit, not starting it.
 正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...
 正在处理用于 systemd (229-4ubuntu19) 的触发器 ...
 正在处理用于 ureadahead (0.100.0-19) 的触发器 ...

2# 创建ZFS 磁盘映像文件

输入下面的命令:

$ sudo mkdir zfsdev
 $ cd zfsdev
 $ dd if=/dev/zero of=disk1.img bs=1M count=100
 $ dd if=/dev/zero of=disk2.img bs=1M count=100

命令输出如下:

root@ubuntutest:~# mkdir zfsdev
 root@ubuntutest:~# cd zfsdev/
 root@ubuntutest:~/zfsdev# ls
 root@ubuntutest:~/zfsdev# dd if=/dev/zero of=disk1.img bs=1M count=10
 10+0 records in
 10+0 records out
 10485760 bytes (10 MB, 10 MiB) copied, 0.017591 s, 596 MB/s
 root@ubuntutest:~/zfsdev# dd if=/dev/zero of=disk2.img bs=1M count=10
 10+0 records in
 10+0 records out
 10485760 bytes (10 MB, 10 MiB) copied, 0.01482 s, 708 MB/s
 root@ubuntutest:~/zfsdev# ls
 disk1.img  disk2.img

3# 创建ZFS存储池

创建zfs存储池可以使用物理磁盘,分区,或者我们上面创建的磁盘映像文件。
命令格式如下:

Zpool create 存储池名 mirror 磁盘名1 磁盘名2 ...

安装ZFS-FUSE
如果使用磁盘映像文件来构建ZFS存储池,还需要安装ZFS-FUSE 软件包,其可以实现在没有内核代码的情况下实现在用户空间中创建文件系统,是用户和文件系统实现从内核文件系统个接口到用户空间的桥梁。
输入下面的命令安装ZFS-FUSE:

$ Sudo apt-get install zfs-fuse

命令输出如下:

正在读取软件包列表... 完成
 正在分析软件包的依赖关系树
 正在读取状态信息... 完成
 下列软件包是自动安装的并且现在不需要了:
 gyp javascript-common libjs-inherits libjs-jquery libjs-node-uuid libjs-underscore libnvpair1linux libssl-dev libssl-doc libuutil1linux libuv1-dev
 libzfs2linux libzpool2linux python-pkg-resources zfs-doc zlib1g-dev
 使用'apt autoremove'来卸载它(它们)。
 建议安装:
 nfs-kernel-server kpartx
 下列软件包将被【卸载】:
 zfs-zed zfsutils-linux
 下列【新】软件包将被安装:
 zfs-fuse
 升级了 0 个软件包,新安装了 1 个软件包,要卸载 2 个软件包,有 5 个软件包未被升级。
 需要下载 725 kB 的归档。
 解压缩后会消耗 2,422 kB 的额外空间。
 您希望继续执行吗? [Y/n] y
 获取:1 http://archive.ubuntu.com/ubuntu xenial/universe amd64 zfs-fuse amd64 0.7.0-12ubuntu1 [725 kB]
 已下载 725 kB,耗时 1秒 (377 kB/s)
 (正在读取数据库 ... 系统当前共安装有 67760 个文件和目录。)
 正在卸载 zfs-zed (0.6.5.6-0ubuntu17) ...
 正在卸载 zfsutils-linux (0.6.5.6-0ubuntu17) ...
 正在处理用于 man-db (2.7.5-1) 的触发器 ...
 正在处理用于 initramfs-tools (0.122ubuntu8.8) 的触发器 ...
 update-initramfs: Generating /boot/initrd.img-4.4.0-62-generic
 W: mdadm: /etc/mdadm/mdadm.conf defines no arrays.
 正在选中未选择的软件包 zfs-fuse。
 (正在读取数据库 ... 系统当前共安装有 67695 个文件和目录。)
 正准备解包 .../zfs-fuse_0.7.0-12ubuntu1_amd64.deb  ...
 正在解包 zfs-fuse (0.7.0-12ubuntu1) ...
 正在处理用于 man-db (2.7.5-1) 的触发器 ...
 正在处理用于 systemd (229-4ubuntu19) 的触发器 ...
 正在处理用于 ureadahead (0.100.0-19) 的触发器 ...
 正在设置 zfs-fuse (0.7.0-12ubuntu1) ...
 update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
 正在处理用于 systemd (229-4ubuntu19) 的触发器 ...
 正在处理用于 ureadahead (0.100.0-19) 的触发器 ...

启动zfs-fuse 服务

$ sudo systemctl start zfs-fuse

关联磁盘映像文件和环路loop设备

$ sudo losetup /dev/loop0 /root/zfsdev/disk1.img
 $ sudo losetup /dev/loop1 /root/zfsdev/disk2.img

创建ZFS存储池myzfspool
基于上面创建的磁盘映像文件disk1.img 和disk2.img 创建存储池, 执行下面命令:

$ sudo zpool create myzfspool mirror disk1.img disk2.img

查看ZFS存储池状态

$ sudo zfs status
 $ sudo zfs list

命令输出如下:

root@ubuntutest:~# zpool status
 pool: myzfspool
 state: ONLINE
 scrub: none requested
 config:
NAME        STATE     READ WRITE CKSUM
 myzfspool   ONLINE       0     0     0
 mirror-0  ONLINE       0     0     0
 loop0   ONLINE       0     0     0
 loop1   ONLINE       0     0     0
errors: No known data errors
 root@ubuntutest:~# zfs list
 NAME        USED  AVAIL  REFER  MOUNTPOINT
 myzfspool    75K  63.4M    21K  /myzfspool

查看存储池的I/O 状态

$ sudo zpool iostat

输出如下:

root@ubuntutest:~# zpool  iostat
 capacity     operations    bandwidth
 pool        alloc   free   read  write   read  write
 ----------  -----  -----  -----  -----  -----  -----
 myzfspool   79.5K  95.4M      0      0     14    375

4# 创建ZFS 文件系统

现在我们在myzfspool存储池上创建名为zfsdir 的ZFS文件系统, 执行下面的命令:

$ sudo zfs create myzfspool

查看文件系统状态

$ sudo zfs list

$ mount | grep myzfspool

命令输出:

root@ubuntutest:/myzfspool# zfs list
 NAME               USED  AVAIL  REFER  MOUNTPOINT
 myzfspool          108K  63.4M    24K  /myzfspool
 myzfspool/zfsdir    21K  63.4M    21K  /myzfspool/zfsdir
root@ubuntutest:/myzfspool# mount | grep myzfspool
 myzfspool on /myzfspool type fuse.zfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)
 myzfspool/zfsdir on /myzfspool/zfsdir type fuse.zfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)

5# 删除ZFS存储池

$ sudo zpool destroy 存储池名
 $ sudo zpool destroy myzfspool