我的哔哩哔哩主页:https://space.bilibili.com/649988837


  ZFS最早是oracle推出的一款存储管理系统,它结合了文件系统和卷管理的优点,再加上磁盘管理,不需要先将磁盘划分卷,直接对磁盘进行管理(中间可以设置RAIDZ),实际使用 通过zpool 。感觉使用起来还是很方便,比传统的磁盘和文件系统管理方式要简便,如果对传统的文件系统和磁盘管理方式比较熟悉的话,ZFS还是比较好理解的。

    ZFS如果直接通过zfs-fuse来管理,效率会低,因为每一个IO都会经过用户空间,现在应该有更好的解决方案,后面再进一步研究。   

    ZFS在freeNAS上使用。

    

以下实验验证引用自:

https://www.ibm.com//developerworks//linux//library//l-zfs//index.html

安装ZFS-FUSE

安装ZFS-FUSE很简单,尤其是在使用Ubuntu的情况下 apt。以下命令行将安装开始使用ZFS-FUSE所需的所有内容:

1个
$ sudo apt-get install zfs-fuse

该命令行安装ZFS-FUSE和所有其他相关软件包(也需要libaiol安装),并对新软件包执行必要的设置并启动 zfs-fuse守护程序。

使用ZFS-FUSE

在此演示中,您将使用回送设备将磁盘仿真为主机操作系统中的文件。首先,使用dd 实用程序创建这些文件(使用/ dev / zero作为源)(请参见清单1)。创建了四个磁盘映像后,可losetup用于将磁盘映像与环路设备关联。

清单1.使用ZFS-FUSE的设置

1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
20
21
22
23
24
25
$ mkdir zfstest
$ cd zfstest
$ dd if=/dev/zero of=disk1.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 1.235 s, 54.3 MB/s
$ dd if=/dev/zero of=disk2.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.531909 s, 126 MB/s
$ dd if=/dev/zero of=disk3.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.680588 s, 98.6 MB/s
$ dd if=/dev/zero of=disk4.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.429055 s, 156 MB/s
$ ls
disk1.img  disk2.img  disk3.img  disk4.img
$ sudo losetup /dev/loop0 ./disk1.img
$ sudo losetup /dev/loop1 ./disk2.img
$ sudo losetup /dev/loop2 ./disk3.img
$ sudo losetup /dev/loop3 ./disk4.img
$

有四个可用的设备用作ZFS的块设备(总计256MB),请使用以下zpool命令创建池 。您可以使用该 zpool命令来管理ZFS存储池,但是正如您将看到的那样,您也可以将其用于各种其他目的。以下命令请求使用四个设备创建ZFS存储池,并使用RAID-Z提供数据保护。您可以在此命令后执行列表请求,以在池中提供数据(请参见清单2)。

清单2.创建一个ZFS池

1个
2
3
4
5
$ sudo zpool create myzpool raidz /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3
$ sudo zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
myzpool  96.5K   146M  31.4K  /myzpool
$

您还可以研究池的某些属性,如清单3所示,它们代表默认值。除其他外,您可以看到可用容量和已用份额。(为简洁起见,此代码已压缩。)

清单3.查看存储池的属性

1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
20
21
22
23
24
25
26
27
$ sudo zfs get all myzpool
NAME     PROPERTY              VALUE                  SOURCE
myzpool  type                  filesystem             -
myzpool  creation              Sat Nov 13 22:43 2010  -
myzpool  used                  96.5K                  -
myzpool  available             146M                   -
myzpool  referenced            31.4K                  -
myzpool  compre***atio         1.00x                  -
myzpool  mounted               yes                    -
myzpool  quota                 none                   default
myzpool  reservation           none                   default
myzpool  recordsize            128K                   default
myzpool  mountpoint            /myzpool               default
myzpool  sharenfs              off                    default
myzpool  checksum              on                     default
myzpool  compression           off                    default
myzpool  atime                 on                     default
myzpool  copies                1                      default
myzpool  version               4                      -
...
myzpool  primarycache          all                    default
myzpool  secondarycache        all                    default
myzpool  usedbysnapshots       0                      -
myzpool  usedbydataset         31.4K                  -
myzpool  usedbychildren        65.1K                  -
myzpool  usedbyrefreservation  0                      -
$

现在,让我们实际使用ZFS池。首先,在池中创建一个目录,然后在其中启用压缩(使用 zfs set命令)。接下来,将文件复制到其中。我选择了一个大小约为120KB的文件,以查看ZFS压缩的效果。请注意,您的池安装在根目录上,因此对待就像根文件系统中的目录一样。复制文件后,您可以列出该文件以查看该文件是否存在(但大小与原始文件相同)。使用该dh命令,您可以看到文件的大小是原始文件的一半,表明ZFS已对其进行了压缩。您也可以看一下 compre***atio属性以查看您的池已压缩了多少(使用默认的压缩器gzip)。清单4显示了压缩。

清单4.使用ZFS演示压缩

1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
20
21
22
$ sudo zfs create myzpool/myzdev
$ sudo zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
myzpool          139K   146M  31.4K  /myzpool
myzpool/myzdev  31.4K   146M  31.4K  /myzpool/myzdev
$ sudo zfs set compression=on myzpool/myzdev
$ ls /myzpool/myzdev/
$ sudo cp ../linux-2.6.34/Documentation/devices.txt /myzpool/myzdev/
$ ls -la ../linux-2.6.34/Documentation/devices.txt
-rw-r--r-- 1 mtj mtj 118144 2010-05-16 14:17 ../linux-2.6.34/Documentation/devices.txt
$ ls -la /myzpool/myzdev/
total 5
drwxr-xr-x 2 root root      3 2010-11-20 22:59 .
drwxr-xr-x 3 root root      3 2010-11-20 22:55 ..
-rw-r--r-- 1 root root 118144 2010-11-20 22:59 devices.txt
$ du -ah /myzpool/myzdev/
60K /myzpool/myzdev/devices.txt
62K /myzpool/myzdev/
$ sudo zfs get compre***atio myzpool
NAME     PROPERTY       VALUE  SOURCE
myzpool  compre***atio  1.55x  -
$

最后,让我们看一下ZFS的自我修复功能。回想一下,在创建池时,您在四个设备上请求了RAID-Z。您可以使用zpool status命令检查池的状态 ,如清单5所示。如图所示,您可以看到池的元素(具有四个设备的RAID-Z 1)。

清单5.检查池状态

1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo zpool status myzpool
  pool: myzpool
 state: ONLINE
 scrub: none requested
config:
 
    NAME        STATE     READ WRITE CKSUM
    myzpool     ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        loop0   ONLINE       0     0     0
        loop1   ONLINE       0     0     0
        loop2   ONLINE       0     0     0
        loop3   ONLINE       0     0     0
 
errors: No known data errors
$

现在,让我们将错误强加到池中。对于此演示,请在后台破坏构成设备的磁盘文件(您的disk4.img,由loop3 设备在ZFS中表示)。使用该dd命令可以将整个设备置零(参见清单6)。

清单6.损坏ZFS池

1个
2
3
4
5
$ dd if=/dev/zero of=disk4.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 1.84791 s, 36.3 MB/s
$

ZFS当前不知道损坏,但是您可以通过请求清理池来强制ZFS查看问题。如清单7所示,ZFS现在可以识别(loop3设备的)损坏, 并建议采取措施更换设备。还请注意,该池保持在线状态,并且您仍然可以访问数据,因为ZFS可通过RAID-Z自动更正。

清单7.清理和检查池

1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
20
21
22
23
24
$ sudo zpool scrub myzpool
$ sudo zpool status myzpool
  pool: myzpool
 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: http://www.sun.com/msg/ZFS-8000-4J
 scrub: scrub completed after 0h0m with 0 errors on Sat Nov 20 23:15:03 2010
config:
 
    NAME        STATE     READ WRITE CKSUM
    myzpool     ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        loop0   ONLINE       0     0     0
        loop1   ONLINE       0     0     0
        loop2   ONLINE       0     0     0
        loop3   UNAVAIL      0     0     0  corrupted data
 
errors: No known data errors
$ wc -l /myzpool/myzdev/devices.txt
3340 /myzpool/myzdev/devices.txt
$

根据建议,将新设备引入RAID-Z集以充当新容器。首先创建一个新的磁盘映像并将其表示为设备losetup。请注意,此过程类似于将新的物理磁盘添加到集合中。然后zpool replace,您可以 用来loop3与新设备(loop4)交换损坏的设备()。检查池的状态,您可以看到新设备,并显示一条消息,指示已在其上重建数据(称为重新同步)),以及移到那里的数据量。另请注意,该池保持联机状态,没有错误(用户可见)。最后,您要再次清理池;检查其状态之后,您将发现不存在任何问题,如清单8所示。

清单8.使用zpool replace修复池

1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ dd if=/dev/zero of=disk5.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.925143 s, 72.5 MB/s
$ sudo losetup /dev/loop4 ./disk5.img
$ sudo zpool replace myzpool loop3 loop4
$ sudo zpool status myzpool
  pool: myzpool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sat Nov 20 23:23:12 2010
config:
 
    NAME        STATE     READ WRITE CKSUM
    myzpool     ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        loop0   ONLINE       0     0     0
        loop1   ONLINE       0     0     0
        loop2   ONLINE       0     0     0
        loop4   ONLINE       0     0     0  59.5K resilvered
 
errors: No known data errors
$ sudo zpool scrub myzpool
$ sudo zpool status myzpool
  pool: myzpool
 state: ONLINE
 scrub: scrub completed after 0h0m with 0 errors on Sat Nov 20 23:23:23 2010
config:
 
    NAME        STATE     READ WRITE CKSUM
    myzpool     ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        loop0   ONLINE       0     0     0
        loop1   ONLINE       0     0     0
        loop2   ONLINE       0     0     0
        loop4   ONLINE       0     0     0
 
errors: No known data errors
$

这个简短的演示探讨了将卷管理与文件系统整合的过程,并展示了管理ZFS的难易程度(即使面对故障也是如此)