Skip to content

ZFS

1. 在 Ubuntu 上安装 ZFS

  1. 更新包列表: 首先,确保系统的包管理器是最新的。
sudo apt update
  1. 安装 ZFS: 使用 apt 包管理器安装 ZFS 包。
sudo apt install zfsutils-linux
  1. 加载 ZFS 模块: 安装完成后,通常会自动加载 ZFS 内核模块。如果没有加载,可以手动加载:
sudo modprobe zfs
  1. 确认安装: 确认 ZFS 是否安装成功:
zfs --version

如果安装成功,将显示 ZFS 的版本信息。


要将一个现有的硬盘格式化为 ZFS 支持的格式,你需要首先确保 ZFS 已经安装并可以使用。然后,可以使用 zpool 命令来创建一个新的存储池,并格式化硬盘为 ZFS 支持的格式。

步骤:格式化硬盘并创建 ZFS 存储池

  1. 查看现有磁盘:

    在开始之前,使用以下命令列出系统中所有的磁盘设备,确保你知道要格式化的硬盘的设备名称(例如 /dev/sda/dev/sdb)。

    lsblk
    

    或者:

    fdisk -l
    
  2. 确认磁盘没有数据:

    警告:格式化硬盘会删除其中所有的数据。确保你选择的是正确的硬盘并且里面没有重要数据。

  3. 创建 ZFS 存储池:

    使用 zpool create 命令来创建 ZFS 存储池。这个命令会自动将硬盘格式化为 ZFS 支持的格式。

    例如,如果你的硬盘是 /dev/sdb,你可以执行以下命令来创建一个名为 mypool 的存储池:

    sudo zpool create mypool /dev/sdb
    
    sudo zpool add <poolname> /dev/sdb
    

    这将会:

    • /dev/sdb 硬盘格式化为 ZFS 支持的格式。
    • 创建一个名为 mypool 的存储池。
    • 验证存储池是否创建成功:

    使用以下命令检查是否成功创建了存储池:

    zpool status
    

    你应该能够看到 mypool 存储池的状态。

  4. 创建 ZFS 数据集(可选):

    在存储池中,你可以创建一个数据集来管理文件系统。例如,创建一个名为 mypool/mydataset 的数据集:

    sudo zfs create mypool/mydataset
    

    你可以通过挂载这个数据集来开始使用它:

    sudo zfs mount mypool/mydataset
    

    你可以查看数据集的挂载点:

    zfs list
    

    这将显示 mypool/mydataset 的挂载路径和使用情况。

6. 格式化并创建 ZFS 存储池的附加选项

  • 使用多个磁盘:如果你希望使用多个硬盘来创建一个 RAID 类型的存储池(例如 RAID1、RAIDZ等),你可以将多个硬盘指定为存储池的一部分。例如:

    sudo zpool create mypool mirror /dev/sdb /dev/sdc
    

    这将创建一个镜像(RAID1)存储池,其中包含 /dev/sdb/dev/sdc 两个硬盘。

  • 启用压缩:你还可以在创建存储池时启用数据压缩,以节省存储空间。例如:

    sudo zpool create mypool /dev/sdb
    sudo zfs set compression=lz4 mypool
    

    这将为 mypool 存储池启用 LZ4 压缩。

7. 卸载 ZFS 存储池(如果需要)

如果你需要卸载存储池,可以使用以下命令:

sudo zpool export mypool

总结

  • 使用 zpool create 命令将硬盘格式化为 ZFS 支持的格式并创建存储池。
  • 创建数据集以开始使用 ZFS 存储池的空间。
  • 确保在格式化硬盘前备份所有重要数据,因为此过程会删除硬盘上的所有内容。

通过这些步骤,你可以将现有的硬盘格式化为 ZFS 支持的格式并创建 ZFS 存储池。


如果在执行 sudo zpool create mypool /dev/sdd 时遇到错误,提示 /dev/sdd is in use and contains an unknown filesystem,这表示 /dev/sdd 硬盘上已经有其他文件系统或数据,ZFS 无法直接使用它来创建存储池。你需要先清空硬盘上的所有数据并删除原有的文件系统,以便 ZFS 能够格式化并使用该硬盘。

解决步骤:

  1. 确认硬盘的当前状态: 使用 lsblkfdisk -l 查看硬盘的当前状态,确保 /dev/sdd 是你想要格式化的硬盘。

    lsblk
    

    或者:

    sudo fdisk -l
    
  2. 清空硬盘并删除现有的文件系统: 使用 wipefs 命令删除硬盘上的所有文件系统信息。此操作不会删除硬盘上的数据内容,但会清除分区表和文件系统标识符。

    sudo wipefs -a /dev/sdd
    

    这将会清除 /dev/sdd 上的所有文件系统信息,使其恢复为未格式化的状态。

  3. 确认硬盘已被清空: 重新运行 lsblkfdisk -l,确保 /dev/sdd 上没有分区或文件系统。

    lsblk
    
  4. 创建 ZFS 存储池: 现在可以创建 ZFS 存储池。运行以下命令:

    sudo zpool create mypool /dev/sdd
    

    这将会使用 /dev/sdd 硬盘来创建名为 mypool 的 ZFS 存储池。

注意事项:

  • 数据丢失wipefs -a 命令会删除硬盘上的文件系统信息,但不会删除数据。如果硬盘上有重要数据,请确保先备份。
  • 分区表:如果硬盘上有分区表(如 GPT 或 MBR),可以使用 gdiskparted 工具进行删除。

删除分区表(如果需要):

如果硬盘上有分区表(例如,GPT 或 MBR),你可以使用以下命令来删除分区表:

sudo gdisk /dev/sdd

然后,在 gdisk 中选择删除分区并保存更改。

总结:

  1. 使用 wipefs -a /dev/sdd 清除文件系统信息。
  2. 确认硬盘已清空。
  3. 使用 zpool create 命令创建 ZFS 存储池。

遇到“设备或资源忙”的错误,通常是因为 /dev/sdd 硬盘正在被使用,可能是由于以下原因:

  • 硬盘上有挂载的分区。
  • 硬盘被某些进程或系统使用(例如交换分区或挂载点)。

你可以通过以下几个步骤来解决这个问题:

1. 查看设备是否正在被使用

使用以下命令来检查是否有进程正在使用 /dev/sdd

sudo lsof /dev/sdd

如果有进程正在使用该硬盘,可以选择停止相关进程或卸载挂载的分区。

2. 卸载任何挂载的分区

如果 /dev/sdd 上有挂载的分区,你需要先卸载它们。可以使用 lsblkdf -h 来检查是否有挂载的分区。

lsblk

或者:

df -h

如果 /dev/sdd 上有挂载的分区,可以使用 umount 命令卸载它们:

sudo umount /dev/sdd1

确保卸载了所有挂载的分区。你可以执行 umount 针对每个分区(如 /dev/sdd1/dev/sdd2 等)。

3. 禁用交换分区(如果存在)

如果 /dev/sdd 被用作交换分区,你需要禁用它。可以使用 swapon 命令检查交换分区:

sudo swapon --show

如果 /dev/sdd 出现在交换分区列表中,可以使用以下命令禁用它:

sudo swapoff /dev/sdd

4. 再次尝试清空磁盘

完成上述步骤后,重新尝试使用 wipefs 命令:

sudo wipefs -a /dev/sdd

5. 强制卸载设备

如果上述方法仍然没有解决问题,可以使用以下命令强制卸载设备:

sudo fuser -v /dev/sdd

这将列出正在使用 /dev/sdd 的进程。你可以通过以下命令终止相关进程(例如,使用进程 ID):

sudo kill -9 <进程ID>

总结

  1. 确认设备没有挂载或被进程使用。
  2. 使用 umount 卸载所有挂载的分区。
  3. 禁用交换分区(如果存在)。
  4. 使用 wipefs 清除文件系统信息。

完成这些步骤后,你应该能够成功清空硬盘并格式化为 ZFS 支持的格式。


要将 ZFS 数据集挂载到指定位置,可以通过以下步骤实现:

1. 创建 ZFS 数据集

首先,如果还没有创建数据集,可以使用 zfs create 命令来创建一个数据集。假设你已经创建了一个名为 mypool 的存储池,并希望在该池中创建一个名为 mydataset 的数据集:

sudo zfs create mypool/mydataset

2. 指定挂载点

你可以使用 zfs set mountpoint 命令来指定数据集的挂载位置。例如,将 mypool/mydataset 数据集挂载到 /mnt/mydataset

sudo zfs set mountpoint=/mnt/mydataset mypool/mydataset

此命令会将 mypool/mydataset 挂载到 /mnt/mydataset 目录。确保指定的目录已经存在,否则需要先创建它:

sudo mkdir -p /mnt/mydataset

3. 查看挂载信息

你可以使用 zfs list 命令查看当前挂载的 ZFS 数据集及其挂载点:

zfs list

这将显示存储池及其数据集的详细信息,包括挂载点。

4. 挂载数据集

如果数据集没有自动挂载,你可以使用以下命令手动挂载数据集:

sudo zfs mount mypool/mydataset

这将确保数据集被挂载到你指定的位置。如果设置了正确的挂载点,ZFS 会在启动时自动挂载数据集。

5. 验证挂载

你可以使用 df -h 命令来确认数据集是否正确挂载:

df -h

你应该看到 /mnt/mydataset 显示在输出中,并且它是 ZFS 存储池的一部分。

总结

  • 使用 zfs set mountpoint=<路径> 设置数据集的挂载点。
  • 确保挂载点目录已存在,并且 ZFS 将数据集挂载到该位置。
  • 使用 zfs mount 来手动挂载数据集,或者让 ZFS 在启动时自动挂载。

通过这些步骤,你可以将 ZFS 数据集挂载到指定的位置。


1. 安装zfs

sudo apt update && sudo apt install zfsutils-linux

2. 创建池

zpool create <poolname> /dev/sdb [/dev/sdc /dev/sdd]

向池中添加硬盘

zpool add <poolname> /dev/sdb

创建子文件系统

# 创建主池下的子文件系统 
zfs create mainpool/subpool1 
zfs create mainpool/subpool2

设置配额

zfs set quota=<限制空间> <文件系统>

3. 挂载

sudo zfs set mountpoint=<挂载点路径> <池名>/<文件系统名>

恢复

确保硬盘完全迁移

sudo zpool import  # 会列出所有未被导入的池

sudo zpool import <pool_name>  # 导入指定池

NFS