Ubuntu 16.04 系统下安装ZFS文件系统
August 18, 2017
本文将会讲述如何在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, 数据一致性以及对大容量的支持等。
Table of Contents
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