# 先安装内核,然后执行这个。 如果没装内核,执行这个还不成功, 装了内核重装下面的。
sudo apt install zfs-dkms zfsutils-linux
git clone https://github.com/openzfs/zfs.git
cd zfs
./autogen.sh
# 指定内核
# ./configure --with-linux=/usr/src/linux-headers-$(uname -r) --with-linux-obj=/usr/src/linux-headers-$(uname -r)
./configure --with-linux=/lib/modules/$(uname -r)/build
make -j$(nproc)
sudo make install
sudo ldconfig # 更新库缓存
sudo zpool create mypool /dev/sda
sudo zpool create -m /mnt/mypool mypool /dev/sda
sudo zpool create mypool mirror /dev/sda /dev/sdb
zpool status
sudo zfs create -o mountpoint=/mnt/data mypool/data
sudo zfs set mountpoint=/mnt/mydata mypool/data
zfs get all mypool/data
sudo zfs snapshot mypool/data@20231001
zfs list -t snapshot
sudo zfs rollback mypool/data@20231001
sudo zfs destroy mypool/data@20231001
sudo zfs clone mypool/data@20231001 mypool/cloned_data
# 发送快照到文件
sudo zfs send mypool/data@20231001 > backup.zfs
# 接收快照恢复
sudo zfs receive -F newpool/data < backup.zfs
sudo zfs set compression=lz4 mypool/data
sudo zfs set dedup=off mypool
echo "options zfs zfs_arc_max=536870912" | sudo tee /etc/modprobe.d/zfs.conf # 限制为 512MB
sudo reboot
# 数据完整性检查
sudo zpool scrub mypool
# 查看池健康状态
zpool status -v
sudo zpool import -f mypool
sudo zpool replace mypool /dev/sda /dev/sdb
dmesg | grep zfs
| 功能 | 命令 |
|——————|———————————–|
| 列出所有存储池 | zpool list |
| 查看数据集空间 | zfs list -o name,used,avail |
| 重命名数据集 | zfs rename oldname newname |
| 导出存储池 | zpool export mypool |
| 升级存储池特性 | zpool upgrade mypool |
以下是如何在 ZFS 中创建和管理加密数据集的补充内容:
ZFS 支持原生加密(从 ZFS 0.8+ 开始),加密单位为数据集(Dataset)。以下是常用操作:
# 创建时直接启用加密(需设置密码)
sudo zfs create -o encryption=aes-256-gcm -o keyformat=passphrase mypool/secret_data
# 输入加密密码(至少 8 字符)
# 生成随机密钥文件(推荐)
sudo dd if=/dev/urandom of=/etc/zfs/secret.key bs=32 count=1
sudo chmod 600 /etc/zfs/secret.key
# 创建加密数据集并绑定密钥文件
sudo zfs create -o encryption=aes-256-gcm -o keyformat=raw -o keylocation=file:///etc/zfs/secret.key mypool/encrypted_data
# 手动加载密钥并挂载(需密码或密钥)
sudo zfs load-key mypool/secret_data
sudo zfs mount mypool/secret_data
# 卸载并卸载密钥
sudo zfs unmount mypool/secret_data
sudo zfs unload-key mypool/secret_data
# 启用自动挂载(需提前加载密钥)
sudo zfs set keystatus=on mypool/secret_data
sudo zfs set mountpoint=/mnt/secret mypool/secret_data
# 开机时自动加载密钥(通过 systemd)
sudo systemctl enable zfs-load-key@mypool-secret_data.service
# 修改加密密码
sudo zfs change-key -l mypool/secret_data
# 添加备用密钥文件
sudo zfs create -o encryption=on -o keylocation=file:///path/new_key mypool/data
# 查看加密状态
zfs get encryption,keylocation,keystatus mypool/secret_data
# 加载密钥解密
zfs load-key -L file:///path/to/keyfile -r mypool/secret_data
密钥备份:
加密数据集完全依赖密钥,务必备份密钥文件到安全位置(如离线 U 盘)。丢失密钥将导致数据永久无法访问!
性能影响:
AES-256-GCM 加密对 CPU 有轻微负担(ARM 设备可能更明显),但对内存影响较小。
跨系统挂载:
迁移加密数据集时,需同时传输密钥文件,并在目标系统执行 zfs load-key。
| 功能 | 命令 |
|————————-|———————————————–|
| 强制卸载所有加密数据集 | sudo zfs unmount -a && sudo zfs unload-key -a |
| 临时挂载为明文 | sudo zfs mount -o readonly=on -o keylocation=prompt mypool/data |
| 加密现有数据集 | 不支持,需创建新数据集并迁移数据。 |
通过加密功能,可以在共享存储或敏感数据场景中保护隐私。建议优先使用密钥文件+自动加载方案,避免频繁输入密码。
zfs-mount.sh
#!/bin/sh
zpool import -f -a
zfs load-key -a
zfs mount -a
系统启动时调用,比如使用rc.local
通过服务导入密钥
cat << 'EOF' > /etc/systemd/system/zfs-load-key.service
[Unit]
Description=Load ZFS keys
DefaultDependencies=no
Before=zfs-mount.service
After=zfs-import.target
Requires=zfs-import.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/sbin/zfs mount -a
ExecStart=/sbin/zfs load-key -a
[Install]
WantedBy=zfs-mount.service
EOF
systemctl enable zfs-load-key