为文件系统设置挂载点

默认情况下,如果我们未指定,将为文件系统创建一个挂载点 (/poolname/fs_name)。
在我们的例子中,它是 /geekpool/fs1.
此外,我们不必在 /etc/vfstab 中包含挂载点条目,因为它内部存储在 zfs 池的元数据中,并在系统启动时自动挂载。
如果要更改挂载点:

# zfs set mountpoint=/test geekpool/fs1
# df -h |grep /test
geekpool/fs1           500M    31K   500M     1%    /test

使用整个磁盘

# echo | format
Searching for disks...done
AVAILABLE DISK SELECTIONS:
       0. c1t0d0 
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c1t1d0 <VMware,-VMware Virtual S-1.0-1.00GB>
          /pci@0,0/pci15ad,1976@10/sd@1,0
       2. c1t2d0 
          /pci@0,0/pci15ad,1976@10/sd@2,0
       3. c1t3d0 
          /pci@0,0/pci15ad,1976@10/sd@3,0
       4. c1t4d0 
          /pci@0,0/pci15ad,1976@10/sd@4,0
Specify disk (enter its number): Specify disk (enter its number):

我不会使用操作系统磁盘(disk0)。

# zpool create geekpool  c1t1d0
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool  1008M  78.5K  1008M     0%  ONLINE

销毁池:

# zpool destroy geekpool
# zpool list
no pools available

试运行 zpool 创建

在实际创建池之前,我们可以进行试运行并测试池创建的结果。

# zpool create -n geekpool raidz2 c1t1d0 c1t2d0 c1t3d0
would create 'geekpool' with the following layout:
        geekpool
          raidz2
            c1t1d0
            c1t2d0
            c1t3d0

使用磁盘片

现在我们将在磁盘 c1t1d0 上创建一个大小为 512 MB 的磁盘片为 c1t1d0s0。

# zpool create geekpool c1t1d0s0
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool   504M  78.5K   504M     0%  ONLINE

创建具有不同 RAID 级别的池

现在我们可以创建一个具有不同 RAID 级别的 zfs 池:

  1. 动态条带 它是一个非常基本的池,可以使用单个磁盘或者多个磁盘创建。
    在使用磁盘创建 zpool 的示例中,我们已经看到使用单个磁盘创建 zpool。
    让我们看看如何创建串联的 zfs 池。
# zpool create geekpool c1t1d0 c1t2d0
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool  1.97G    80K  1.97G     0%  ONLINE  
# zpool status
  pool: geekpool
 state: ONLINE
 scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        geekpool    ONLINE       0     0     0
          c1t1d0    ONLINE       0     0     0
          c1t2d0    ONLINE       0     0     0
errors: No known data errors

此配置不提供任何冗余。
因此,任何磁盘故障都会导致数据丢失。
另请注意,以这种方式将磁盘添加到 zfs 池后,可能不会再次从池中删除。
释放磁盘的唯一方法是销毁整个池。
发生这种情况是由于池的动态条带化特性,它使用两个磁盘来存储数据。

  1. 镜像池

2路镜子

镜像池为我们提供冗余,使我们能够在不同的磁盘上存储多个数据副本。
我们还可以在此处从池中分离磁盘,因为数据将在其他磁盘上可用。

# zpool create geekpool mirror c1t1d0 c1t2d0
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool  1008M  78.5K  1008M     0%  ONLINE  
# zpool status
  pool: geekpool
 state: ONLINE
 scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        geekpool    ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
errors: No known data errors

3路镜子

# zpool destroy geekpool
# zpool create geekpool mirror c1t1d0 c1t2d0 c1t3d0
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool  1008M  78.5K  1008M     0%  ONLINE  
# zpool status
  pool: geekpool
 state: ONLINE
 scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        geekpool    ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
errors: No known data errors
  1. RAID-Z 池
    现在我们还可以拥有一个类似于 RAID-5 配置的池,称为 RAID-Z。
    RAID-Z 有 3 种类型 raidz1(单奇偶校验)和 raidz2(双奇偶校验)和 rzidz3(三奇偶校验)。
    让我们看看如何配置每种类型。

每种类型的最低磁盘要求
每种类型的 RAID-Z 所需的最少磁盘

  • 1.raidz1 2盘
  • 2.raidz2 3盘
  • 3.raidz3 4盘

RAID1

# zpool create geekpool raidz c1t1d0 c1t2d0 c1t3d0
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool  2.95G   166K  2.95G     0%  ONLINE  
# zpool status
  pool: geekpool
 state: ONLINE
 scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        geekpool    ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
errors: No known data errors

RAID2

#zpool create geekpool raidz2 c1t1d0 c1t2d0 c1t3d0
#zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool  2.95G   186K  2.95G     0%  ONLINE  
#zpool status
  pool: geekpool
 state: ONLINE
 scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        geekpool    ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
errors: No known data errors

RAID3

# zpool create geekpool raidz3 c1t1d0 c1t2d0 c1t3d0 c1t4d0
# zfs list
NAME       USED  AVAIL  REFER  MOUNTPOINT
geekpool    61K   976M    31K  /geekpool
# zpool status
  pool: geekpool
 state: ONLINE
 scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        geekpool    ONLINE       0     0     0
          raidz3-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
            c1t4d0  ONLINE       0     0     0
errors: No known data errors

导入和导出池

我们可能需要在系统之间迁移 zfs 池。
ZFS 通过从一个系统导出池并将其导入另一个系统来实现这一点。

导出 ZFS 池

要导入池,我们必须首先从源系统显式导出池。
导出池,将所有未写入的数据写入池并从源系统中删除池的所有信息。

# zpool export geekpool
# zpool list
no pools available

如果我们安装了一些文件系统,我们可以强制导出

# zpool export -f geekpool

导入 ZFS 池

现在我们可以导入导出的池。
要知道可以导入哪些池,请运行不带任何选项的 import 命令。

# zpool import
  pool: geekpool
    id: 940735588853575716
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
        geekpool    ONLINE
          raidz3-0  ONLINE
            c1t1d0  ONLINE
            c1t2d0  ONLINE
            c1t3d0  ONLINE
            c1t4d0  ONLINE

正如我们在输出中看到的,每个池都有一个唯一的 ID,当我们有多个具有相同名称的池时,这会很方便。
在这种情况下,可以使用池 ID 导入池。

# zpool import 940735588853575716

使用文件导入池

默认情况下,import 命令会在 /dev/dsk 中搜索池设备。
因此,要查看可使用文件作为设备导入的池,我们可以使用:

# zpool import -d /
  pool: geekfilepool
    id: 8874031618221759977
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
        geekfilepool  ONLINE
          //file1   ONLINE
          //file2   ONLINE

现在我们可以导入我们想要的池了:

# zpool import geekpool
# zpool import -d / geekfilepool

与导出类似,我们可以强制池导入

# zpool import -f geekpool

创建 ZFS 文件系统

zfs 最好的部分是 oracle(或者我应该说 Sun)保留了命令,因为它很容易理解和记住。
要在现有 zfs 池 geekpool 中创建文件系统 fs1:

# zfs create geekpool/fs1
# zfs list
NAME           USED  AVAIL  REFER  MOUNTPOINT
geekpool       131K   976M    31K  /geekpool
geekpool/fs1    31K   976M    31K  /geekpool/fs1

现在默认情况下,当我们将文件系统创建到池中时,它可以占用池中的所有空间。
所以也限制了文件系统的使用,我们定义了预留和配额。
让我们考虑一个例子来理解配额和预留。

假设我们为文件系统 fs1 分配了配额 = 500 MB 和预留 = 200 MB。
我们还创建了一个没有任何配额和预留的新文件系统 fs2.
所以现在为 fs1 预留了 1GB(池大小)中的 200 MB,这是其他文件系统无法拥有的。
它也可以从池中占用最多 500 MB(配额),但如果它是免费的。
因此 fs2 有权占用多达 800 MB(1000 MB 200 MB)的池空间。

因此,如果我们不希望一个文件系统的空间被其他文件系统占用,请为其定义预留空间。

还有一件事,如果已经定义,预留不能大于配额。
另一方面,当我们执行 zfs list 时,我们将能够看到文件系统的可用空间等于为其定义的配额(如果空间未被其他文件系统占用),而不是预期的预留空间。

如上所述在 fs1 上设置服务和配额:

# zfs set quota=500m geekpool/fs1
# zfs set reservation=200m geekpool/fs1
# zfs list
NAME           USED  AVAIL  REFER  MOUNTPOINT
geekpool       200M   776M    32K  /geekpool
geekpool/fs1    31K   500M    31K  /geekpool/fs1

使用文件

我们还可以用文件创建一个 zpool。
确保在创建 zpool 时提供绝对路径

# mkfile 100m file1
# zpool create geekpool /file1
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
geekpool  95.5M   115K  95.4M     0%  ONLINE
ZFS创建 ZFS 池和文件系统

创建 ZFS 池

我们可以使用不同的设备创建 ZFS 池:

  • 使用整个磁盘
  • 使用磁盘片
  • 使用文件

其他重要属性

我们还可以更改其他一些重要属性,如压缩、sharenfs 等。
我们也可以在创建文件系统本身时指定属性。

# zfs create -o mountpoint=/test geekpool/fs1
之路 on it Road.com

将备用设备添加到 zpool

通过将备用设备添加到 zfs 池,故障磁盘会自动由空间设备替换,管理员可以稍后及时替换故障磁盘。
我们也可以在多个 zfs 池之间共享备用设备。

# zpool add geekpool spare c1t3d0
# zpool status
  pool: geekpool
 state: ONLINE
 scan: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        geekpool    ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
        spares
          c1t3d0    AVAIL
errors: No known data errors

确保你打开了 geekpool 上的自动替换功能(zfs 属性)

# zpool autoreplace=on mpool
日期:2020-09-17 00:15:29 来源:oir作者:oir