《Linux就该这么学》是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材。
分类: LINUX
2016-05-02 10:26:20
导读 | ZFS文件系统的英文名称为ZettabyteFileSystem,也叫动态文件系统(DynamicFileSystem),是第一个128位文件系统。最初是由Sun公司为Solaris10操作系统开发的文件系统。作为OpenSolaris开源计划的一部分,ZFS于2005年11月发布,被Sun称为是终极文件系统,经历了10年的活跃开发,而最新的开发将全面开放,并重新命名为OpenZFS。 |
1. 数据完整性——数据一致性和完整性通过即写即拷和校验技术保证。 2. 存储空间池——可用存储驱动器一起放入称为zpool的单个池。 3. 软件RAID ——像发出一个命令一样,建立一个raidz数组。 4. 内置的卷管理器——ZFS充当卷管理器。 5. Snapshots、克隆、压缩——这些都是一些ZFS提供的高级功能。
在本指南中,我们将学习在CentOS 7服务器上如何安装、设置和使用一些重要的ZFS命令。yum localinstall --nogpgcheck yum localinstall --nogpgcheck现在安装内核开发和zfs包,内核开发的软件包是需要ZFS建立模块和插入到内核中。
yum install kernel-devel zfs验证zfs模块插入到内核使用的lsmod命令,如果没有,使用‘modprobe命令手动插入它。
[root@li1467-130 ~]# lsmod |grep zfs [root@li1467-130 ~]# modprobe zfs [root@li1467-130 ~]# lsmod |grep zfs zfs 2790271 0 zunicode 331170 1 zfs zavl 15236 1 zfs zcommon 55411 1 zfs znvpair 89086 2 zfs,zcommon spl 92029 3 zfs,zcommon,znvpair让我们检查是否我们可以使用zfs的命令:
[root@li1467-130 ~]# zfs list no datasets available
[root@li1467-130 ~]# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Mar 16 08:12 /dev/sda brw-rw---- 1 root disk 8, 16 Mar 16 08:12 /dev/sdb brw-rw---- 1 root disk 8, 32 Mar 16 08:12 /dev/sdc brw-rw---- 1 root disk 8, 48 Mar 16 08:12 /dev/sdd brw-rw---- 1 root disk 8, 64 Mar 16 08:12 /dev/sde brw-rw---- 1 root disk 8, 80 Mar 16 08:12 /dev/sdf创建一个池的驱动器。
zpool create验证如果池创建成功。[root@li1467-130 ~]# zpool status pool: zfspool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zfspool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 errors: No known data errors
[root@li1467-130 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 19G 1.4G 17G 8% / devtmpfs 488M 0 488M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 50M 447M 11% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup tmpfs 100M 0 100M 0% /run/user/0 zfspool 3.7G 0 3.7G 0% /zfspoolv如你所见,使用zpool创造了一个池的名字zfspool大小3.7 GB的空间,同时挂载在/ zfspool。 用命令 'zpool destroy' 销毁一个地址池:
zpool destroy [root@li1467-130 ~]# zpool destroy zfspool [root@li1467-130 ~]# zpool status no pools available现在让我们尝试创建一个简单的镜像池。
zpool create mirror ...通过重复关键字的驱动器我们可以创建多个镜像。
[root@li1467-130 ~]# zpool create -f mpool mirror sdc sdd mirror sde sdf [root@li1467-130 ~]# zpool status pool: mpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM mpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 errors: No known data errors在上面的例子中,我们创建了每两个磁盘镜像池。 同样的,我们可以创建一个raidz池。
[root@li1467-130 ~]# zpool create -f rpool raidz sdc sdd sde sdf [root@li1467-130 ~]# zpool status pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 errors: No known data errors
[root@li1467-130 ~]# zpool create -f testpool sdc sdd [root@li1467-130 ~]# zpool add testpool sde [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors正如前面提到的,我不能删除这个新添加的设备,因为它不是一个冗余或raidz池。
[root@li1467-130 ~]# zpool remove testpool sde cannot remove sde: only inactive hot spares, cache, top-level, or log devices can be removed但我可以在这个池添加一个空闲磁盘和删除它。
[root@li1467-130 ~]# zpool add testpool spare sdf [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 spares sdf AVAIL errors: No known data errors [root@li1467-130 ~]# zpool remove testpool sdf [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors同样的,我们可以使用attach命令附加磁盘镜像或非镜像的池和detach命令从镜像磁盘池来分离。
zpool attach zpool detach当设备发生故障或损坏,我们可以使用replace命令替换它。
zpool replace在镜像配置当中我们将爆力的测试一个设备。
[root@li1467-130 ~]# zpool create -f testpool mirror sdd sde这将创建一个镜像磁盘池组成的SDD和SDE。现在,让我们故意损坏SDD写零到磁盘中。
[root@li1467-130 ~]# dd if=/dev/zero of=/dev/sdd dd: writing to ‘/dev/sdd’: No space left on device 2048001+0 records in 2048000+0 records out 1048576000 bytes (1.0 GB) copied, 22.4804 s, 46.6 MB/s我们将使用“scrub”命令来检测这种损坏。
[root@li1467-130 ~]# zpool scrub testpool [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: scan: scrub repaired 0 in 0h0m with 0 errors on Fri Mar 18 09:59:40 2016 config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdd UNAVAIL 0 0 0 corrupted data sde ONLINE 0 0 0 errors: No known data errors现在我们用SDC替换SDD。
[root@li1467-130 ~]# zpool replace testpool sdd sdc; zpool status pool: testpool state: ONLINE scan: resilvered 83.5K in 0h0m with 0 errors on Fri Mar 18 10:05:17 2016 config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 replacing-0 UNAVAIL 0 0 0 sdd UNAVAIL 0 0 0 corrupted data sdc ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: resilvered 74.5K in 0h0m with 0 errors on Fri Mar 18 10:00:36 2016 config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
[root@li1467-130 ~]# zpool export testpool [root@li1467-130 ~]# zpool status no pools availablezpool import命令列出所有可以利用的池。执行这个系统命令,你想要导入的池。
[root@li1467-131 ~]# zpool import pool: testpool id: 3823664125009563520 state: ONLINE action: The pool can be imported using its name or numeric identifier. config: testpool ONLINE sdc ONLINE sdd ONLINE sde ONLINE现在导入要求的池。
[root@li1467-131 ~]# zpool import testpool [root@li1467-131 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
[root@li1467-130 ~]# zpool iostat -v testpool capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- testpool 1.80M 2.86G 22 27 470K 417K sdc 598K 975M 8 9 200K 139K sdd 636K 975M 7 9 135K 139K sde 610K 975M 6 9 135K 139K ---------- ----- ----- ----- ----- ----- -----
zfs create [root@li1467-130 ~]# zfs create testpool/students [root@li1467-130 ~]# zfs create testpool/professors [root@li1467-130 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 19G 1.4G 17G 8% / devtmpfs 488M 0 488M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 50M 447M 11% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup testpool 2.8G 0 2.8G 0% /testpool tmpfs 100M 0 100M 0% /run/user/0 testpool/students 2.8G 0 2.8G 0% /testpool/students testpool/professors 2.8G 0 2.8G 0% /testpool/professors从上面的输出注意到,在文件系统创建时尽管没有挂载点,挂载点创建时使用相同的路径关系池。 ZFS创建允许使用-o选项可以指定使用像挂载点,压缩、定额、执行等。 你可以列出可用的文件系统使用ZFS的列表:
[root@li1467-130 ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT testpool 100M 2.67G 19K /testpool testpool/professors 31K 1024M 20.5K /testpool/professors testpool/students 1.57M 98.4M 1.57M /testpool/students我们用销毁选项销毁文件系统。 zfs destroy
zfs set一旦这样做,压缩和解压缩将以透明模式发生在文件系统上面。 在我们的示例中,我将使学生目录使用lz4压缩算法压缩。
[root@li1467-130 ~]# zfs set compression=lz4 testpool/students我现在要复制一个文件到该文件系统大小15m,并检查它的大小。
[root@li1467-130 /]# cd /var/log [root@li1467-130 log]# du -h secure 15M secure [root@li1467-130 ~]# cp /var/log/secure /testpool/students/ [root@li1467-130 students]# df -h . Filesystem Size Used Avail Use% Mounted on testpool/students 100M 1.7M 99M 2% /testpool/students注意,使用文件系统的大小仅为1.7m,文件大小为15m,我们可以检查压缩比。
[root@li1467-130 ~]# zfs get compressratio testpool NAME PROPERTY VALUE SOURCE testpool compressratio 9.03x配额和预订 让我用一个真实的例子来解释配额。假设我们有一个要求,在一所大学,以限制磁盘空间使用的文件系统为教授和学生。让我们假设我们需要分配给教授和学生分为1GB和100MB。我们可以利用“配额”在ZFS来满足这一要求。配额确保文件系统使用的磁盘空间的数量不超过规定的限度。保留有助于在实际分配和保证所需的磁盘空间的数量是可用的文件系统。
zfs set quota= zfs set reservation= [root@li1467-130 ~]# zfs set quota=100M testpool/students [root@li1467-130 ~]# zfs set reservation=100M testpool/students [root@li1467-130 ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT testpool 100M 2.67G 19K /testpool testpool/professors 19K 2.67G 19K /testpool/professors testpool/students 1.57M 98.4M 1.57M /testpool/students [root@li1467-130 ~]# zfs set quota=1G testpool/professors [root@li1467-130 ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT testpool 100M 2.67G 19K /testpool testpool/professors 19K 1024M 19K /testpool/professors testpool/students 1.57M 98.4M 1.57M /testpool/students在上面的例子中,我们已经给教授和学生为1GB与100MB。观察ZFS列表结果,最初,他们有2.67gb每个的大小和设置配额,价值也随之发生了相应的变化。
[root@li1467-130 ~]# cd /testpool/professors/ [root@li1467-130 professors]# mkdir maths physics chemistry [root@li1467-130 professors]# cat > qpaper.txt Question paper for the year 2016-17 [root@li1467-130 professors]# ls -la total 4 drwxr-xr-x 5 root root 6 Mar 19 10:34 . drwxr-xr-x 4 root root 4 Mar 19 09:59 .. drwxr-xr-x 2 root root 2 Mar 19 10:33 chemistry drwxr-xr-x 2 root root 2 Mar 19 10:32 maths drwxr-xr-x 2 root root 2 Mar 19 10:32 physics -rw-r--r-- 1 root root 36 Mar 19 10:35 qpaper.txt快照,可以使用下面的语法:
zfs snapshot [root@li1467-130 professors]# zfs snapshot testpool/professors@03-2016 [root@li1467-130 professors]# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT testpool/professors@03-2016 0 - 20.5K我现在将删除创建的文件和提取的快照。
[root@li1467-130 professors]# rm -rf qpaper.txt [root@li1467-130 professors]# ls chemistry maths physics [root@li1467-130 professors]# cd .zfs [root@li1467-130 .zfs]# cd snapshot/03-2016/ [root@li1467-130 03-2016]# ls chemistry maths physics qpaper.txt [root@li1467-130 03-2016]# cp -a qpaper.txt /testpool/professors/ [root@li1467-130 03-2016]# cd /testpool/professors/ [root@li1467-130 professors]# ls chemistry maths physics qpaper.txt已删除的文件返回其位置。 我们可以列出所有可用的快照使用ZFS的列表:
[root@li1467-130 ~]# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT testpool/professors@03-2016 10.5K - 20.5K -最后,让我们使用zfs摧毁命令销毁快照:
zfs destroy [root@li1467-130 ~]# zfs destroy testpool/professors@03-2016 [root@li1467-130 ~]# zfs list -t snapshot no datasets available
免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好: