未找到匹配的服务
在运行的VPS上将ZFS安装到根目录
本指南介绍了如何在不导致数据丢失的情况下,将ZFS安装为包含现有Linux安装的VPS的根文件系统。VPS将有一个小的EXT4引导分区用于GRUB2,其中包含内核和initrd,以及一个启用了压缩的大型ZFS池挂载在根目录上。大多数命令将从Live CD镜像中发出,并且如果VPS不支持挂载ISO镜像,将展示一个解决方法。
- 目录:
- 1. 备份数据
- 2. 启动Live OS镜像
- 3. 在Live OS环境中安装ZFS
- 4. 分区VPS磁盘
- 5. 在VPS磁盘上安装ZFS
- 6. 将备份恢复到新的ZFS根文件系统
- 7. 安装 GRUB2
- 8. 启动进入 ZFS 根池
- 步骤 1:备份数据
-
如果你有第二台 VPS 或家用电脑,并且有足够的空间来存储备份数据,请在该电脑上运行以下命令:
其中 target 是要转换的 VPS 的主机名。这将通过 SSH 将整个根文件系统复制到备份机器上,稍后将该备份恢复到目标 VPS 上将非常简单。如果由于空间不足需要压缩备份,你可以选择创建一个压缩的 TGZ 存档:
# rsync -aqrxz root@target:/ backup.d
然而,当从 TAR 存档恢复根文件系统时,需要重新创建所有目标为绝对路径的符号链接,因为 TAR 会将其目标转换为相对路径,因此使用 rsync 是更简单的选择。稍后将展示如何正确恢复 TAR 存档。# ssh root@target "tar -cf - --acls --xattrs --one-file-system --absolute-names /" | gzip -1 >backup.tgz
- 步骤 2:启动一个实时操作系统镜像
-
转换到 ZFS 将从实时 CD 操作系统中进行。根据您的 VPS 控制面板的功能,它可能已经准备好了一个可启动的实时操作系统镜像。或者,您可以从 Debian 镜像 下载一个 Debian 实时 ISO 并上传到您的 VPS 控制面板,然后从那里启动该 ISO;即使您的 VPS 运行的是不同的发行版,这种方法也能正常工作。请务必使用 实时操作系统 ISO 镜像,而不是安装 ISO,因为安装镜像缺少 apt,无法在实时环境中安装必要的软件。如果您的 VPS 控制面板支持从用户提供的 ISO 镜像启动,请跳至 步骤 3,否则您仍然可以通过将交换分区(如果存在)转换为 EXT4 并将 ISO 存储在回收的存储空间中,然后配置 GRUB2 从该 ISO 启动。具体操作如下:
该VPS在/dev/vda2上有一个2GB的交换分区,足够存储ISO文件。创建EXT4文件系统,挂载它并下载ISO文件到该分区:
# fdisk --list /dev/vda
磁盘 /dev/vda: 35 GiB, 37580963840 字节, 73400320 扇区
单位:扇区,1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x495b5ce4
设备 启动 起始 结束 扇区 大小 Id 类型
/dev/vda1 * 2048 69203583 69201536 33G 83 Linux
/dev/vda2 69203584 73397887 4194304 2G 82 Linux 交换
然后指示GRUB2从该ISO启动;编辑/etc/grub.d/40_custom文件如下:# swapoff /dev/vda2 # 禁用交换分区
# mkfs.ext4 /dev/vda2 # 创建EXT4文件系统
# mount /dev/vda2 /mnt # 挂载回收的空间
# mkdir /mnt/images/
# wget -O /mnt/images/image_file.iso <image_URL>
并应用配置#!/bin/sh
exec tail -n +3 $0
# 该文件提供了一种简单的方式来添加自定义菜单项。只需在此注释后输入
# 您想要添加的菜单项。注意不要更改上面的'exec tail'行。
menuentry "Live ISO" {
set ISOFile="/images/image_file.iso"
loopback loop (hd0,2)$ISOFile
linux (loop)/live/vmlinuz boot=live findiso=$ISOFile
initrd (loop)/live/initrd.img
}
当您重启VPS时,GRUB2菜单将提供从实时镜像启动的选项。然后通过提供商控制面板提供的VNC救援控制台继续操作。update-grub2
- 步骤3:在实时操作系统环境中安装ZFS
-
启动实时操作系统镜像并访问其终端。然后在实时操作系统环境中安装ZFS包:
现在,实时操作系统已具备ZFS内核模块和格式化VPS根文件系统所需的ZFS工具。
# echo deb http://deb.debian.org/debian stretch contrib >> /etc/apt/sources.list
# apt update
# apt install zfs-dkms
# modprobe zfs
- 步骤4:分区VPS磁盘
-
分区VPS磁盘有两种替代方案:
- 如果您将实时ISO存储在/dev/vda2中,现在可能无法更改该分区,因为实时系统依赖于它,并且不会对VPS磁盘进行任何分区操作。ZFS将在现有的/dev/vda2分区上进行格式化,/dev/vda1将保持不变,稍后将被重新用作存储内核和initrd的永久启动分区。跳至步骤5。
-
如果你的实时环境不依赖于存储在VPS磁盘上的ISO文件,可以通过创建一个小的引导分区用于GRUB2,以及一个大的分区用于ZFS根目录来重新分区磁盘,该分区将扩展到所有剩余的磁盘空间。执行 fdisk 来创建以下两个分区:
创建一个宽度为100MB的主引导分区,并用星号(*)标记为可启动,分区ID = 83(Linux)。它将格式化为EXT4以兼容GRUB2,并包含引导数据。然后为ZFS创建另一个主分区,ID = bf(Solaris)。将更改写入磁盘并关闭fdisk。现在磁盘已正确分区,您可以格式化引导分区:
# fdisk /dev/vda
Command (m for help): p
Disk /dev/vda: 35 GiB, 37580963840 bytes, 73400320 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x495b5ce4
Device Boot Start End Sectors Size Id Type
/dev/vda1 2048 69203583 69201536 33G bf Solaris
/dev/vda2 * 69203584 73397887 4194304 2G 83 Linux
# mkfs.ext4 /dev/vda2
- 步骤5:在VPS磁盘上安装ZFS
-
将/dev/vda1格式化为ZFS卷:
这组选项由ZFS文档推荐,以确保与最新及未来磁盘的最高兼容性。选项compression=zstd启用了ZSTD压缩算法,该算法比默认的LZ4具有更高的压缩率,但如果您的VPS具有高磁盘I/O,您可以使用compression=lz4来减少CPU使用率。池被命名为rpool,这是根池最常用的名称。当此命令完成后,rpool将挂载在实时环境的/mnt目录下,如上面-R /mnt选项所指定的那样,但它将在每次后续启动时自动挂载到/。将其挂载到/mnt是必要的,以便从实时环境中将备份恢复到其上。
# zpool create -o ashift=12 \
-O acltype=posixacl -O canmount=on -O compression=zstd \
-O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa \
-O mountpoint=/ -R /mnt \
rpool /dev/vda1
- 步骤6:将备份恢复到新的ZFS根文件系统
-
在实时环境中安装OpenSSH服务器以从备份VPS接收备份数据:
为简化操作,请在实时环境的 /etc/ssh/sshd_config 中启用 PermitRootLogin yes,然后设置一个安全的 root 密码并重启 OpenSSH:
# apt install openssh-server
并从备份 VPS 启动备份数据的恢复,这将填充挂载在 /mnt 上的 ZFS 根池:# passwd
# service restart ssh
或者,如果您使用 TAR 创建了备份存档,请使用以下命令进行恢复:## 从备份 VPS
# rsync -arxz backup.d/* root@target:/mnt/
然而,正如我在 步骤 1 中提到的,在解压时,TAR 会将绝对符号链接的目标路径转换为相对路径;这些符号链接可以通过以下方式全部正确恢复。请注意,如果您没有使用 TAR 备份根文件系统,则无需进行此恢复。从备份 VPS 中,列出存档中包含的所有符号链接:## 从备份 VPS
# cat backup.tgz | ssh root@target "tar -C /mnt -zaxf -"
然后将列表复制到目标 VPS 的 /mnt 目录中,该目录现在包含从备份中重新填充的根文件系统:## 从备份 VPS
# tar -tvf backup.tgz | egrep -- '->' >list_of_symlinks.txt
在目标 VPS 上,chroot 到 /mnt 并执行此 Bash 脚本来恢复所有绝对符号链接:## 从备份 VPS
# scp list_of_symlinks.txt root@target:/mnt/root/
您的根文件系统现已从备份中完全恢复,可以启动,但您首先需要一个可用的引导加载程序。## 从 chroot 环境
while read -r row; do
src=$(echo "$row" | grep -Po '(?<=[0-9]{2}:[0-9]{2} )[^ ]+')
tgt=$(echo "$row" | grep -Po '(?<= -> ).+')
echo "linking: $src -> $tgt"
ln -fs "$tgt" "$src"
done </root/list_of_symlinks.txt
- 步骤 7:安装 GRUB2
-
如果你在 chroot 环境中,请退出并返回到 live 环境。然后将虚拟文件系统绑定到 /mnt 并挂载引导分区:
你可以选择将 /mnt/boot/ 中的任何现有内容复制到新的引导分区。进入根池的 chroot 环境,并在其中安装 ZFS initramfs 钩子、ZFS 内核模块以及生成 initrd 所需的 ZFS 用户空间工具:
# mount --bind /dev /mnt/dev
# mount --bind /proc /mnt/proc
# mount --bind /sys /mnt/sys
# mount /dev/vda2 /mnt/boot
然后安装 GRUB2 包:# chroot /mnt
# apt install pkg-dev linux-headers-amd64 linux-image-amd64
# apt install zfs-dkms zfs-initramfs
编辑 /etc/default/grub 以将 ZFS 池设置为根设备,通过修改 GRUB_CMDLINE_LINUX 变量:# apt install grub-pc
# update-initramfs -u -k all
然后应用配置:## 这是 /etc/default/grub
GRUB_CMDLINE_LINUX="root=ZFS=rpool"
最后将 GRUB2 安装到 MBR:# update-grub
# grub-install /dev/vda
- 步骤 8:启动到 ZFS 根池
-
系统已准备就绪,已从备份完全恢复,可以启动。退出 chroot 并卸载所有虚拟文件系统,然后导出 ZFS 根池:
您现在可以从VPS控制面板中移除ISO镜像(如果您使用了此选项),或者从硬盘中删除ISO,并重启系统进入ZFS根池:
# exit # 退出 rpool chroot
# umount /mnt/dev
# umount /mnt/proc
# umount /mnt/sys
# umount /mnt/boot
# umount /mnt
# zpool export -a
VPS根文件系统从EXT4转换为ZFS的过程已完成,VPS将像往常一样启动到您之前安装的系统中。# reboot
阅读更多文章
