为文件系统设置挂载点
默认情况下,如果我们未指定,将为文件系统创建一个挂载点 (/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 池:
- 动态条带 它是一个非常基本的池,可以使用单个磁盘或者多个磁盘创建。
在使用磁盘创建 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 池后,可能不会再次从池中删除。
释放磁盘的唯一方法是销毁整个池。
发生这种情况是由于池的动态条带化特性,它使用两个磁盘来存储数据。
- 镜像池
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
- 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 池:
- 使用整个磁盘
- 使用磁盘片
- 使用文件
其他重要属性
我们还可以更改其他一些重要属性,如压缩、sharenfs 等。
我们也可以在创建文件系统本身时指定属性。
# zfs create -o mountpoint=/test geekpool/fs1
将备用设备添加到 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