一个按价格排名的独立VPS搜索引擎

未找到匹配的服务

在运行的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 或家用电脑,并且有足够的空间来存储备份数据,请在该电脑上运行以下命令:
# rsync -aqrxz root@target:/ backup.d
其中 target 是要转换的 VPS 的主机名。这将通过 SSH 将整个根文件系统复制到备份机器上,稍后将该备份恢复到目标 VPS 上将非常简单。如果由于空间不足需要压缩备份,你可以选择创建一个压缩的 TGZ 存档:
# ssh root@target "tar -cf - --acls --xattrs --one-file-system --absolute-names /" | gzip -1 >backup.tgz
然而,当从 TAR 存档恢复根文件系统时,需要重新创建所有目标为绝对路径的符号链接,因为 TAR 会将其目标转换为相对路径,因此使用 rsync 是更简单的选择。稍后将展示如何正确恢复 TAR 存档。
步骤 2:启动一个实时操作系统镜像
转换到 ZFS 将从实时 CD 操作系统中进行。根据您的 VPS 控制面板的功能,它可能已经准备好了一个可启动的实时操作系统镜像。或者,您可以从 Debian 镜像 下载一个 Debian 实时 ISO 并上传到您的 VPS 控制面板,然后从那里启动该 ISO;即使您的 VPS 运行的是不同的发行版,这种方法也能正常工作。请务必使用 实时操作系统 ISO 镜像,而不是安装 ISO,因为安装镜像缺少 apt,无法在实时环境中安装必要的软件。如果您的 VPS 控制面板支持从用户提供的 ISO 镜像启动,请跳至 步骤 3,否则您仍然可以通过将交换分区(如果存在)转换为 EXT4 并将 ISO 存储在回收的存储空间中,然后配置 GRUB2 从该 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 交换
该VPS在/dev/vda2上有一个2GB的交换分区,足够存储ISO文件。创建EXT4文件系统,挂载它并下载ISO文件到该分区:
# swapoff /dev/vda2     # 禁用交换分区
# mkfs.ext4 /dev/vda2   # 创建EXT4文件系统
# mount /dev/vda2 /mnt  # 挂载回收的空间
# mkdir /mnt/images/
# wget -O /mnt/images/image_file.iso <image_URL>
然后指示GRUB2从该ISO启动;编辑/etc/grub.d/40_custom文件如下:
#!/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
}
并应用配置
update-grub2
当您重启VPS时,GRUB2菜单将提供从实时镜像启动的选项。然后通过提供商控制面板提供的VNC救援控制台继续操作。
步骤3:在实时操作系统环境中安装ZFS
启动实时操作系统镜像并访问其终端。然后在实时操作系统环境中安装ZFS包:
# echo deb http://deb.debian.org/debian stretch contrib >> /etc/apt/sources.list
# apt update
# apt install zfs-dkms
# modprobe zfs
现在,实时操作系统已具备ZFS内核模块和格式化VPS根文件系统所需的ZFS工具。
步骤4:分区VPS磁盘
分区VPS磁盘有两种替代方案:
  1. 如果您将实时ISO存储在/dev/vda2中,现在可能无法更改该分区,因为实时系统依赖于它,并且不会对VPS磁盘进行任何分区操作。ZFS将在现有的/dev/vda2分区上进行格式化,/dev/vda1将保持不变,稍后将被重新用作存储内核和initrd的永久启动分区。跳至步骤5
  2. 如果你的实时环境不依赖于存储在VPS磁盘上的ISO文件,可以通过创建一个小的引导分区用于GRUB2,以及一个大的分区用于ZFS根目录来重新分区磁盘,该分区将扩展到所有剩余的磁盘空间。执行 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
    创建一个宽度为100MB的引导分区,并用星号(*)标记为可启动,分区ID = 83(Linux)。它将格式化为EXT4以兼容GRUB2,并包含引导数据。然后为ZFS创建另一个分区,ID = bf(Solaris)。将更改写入磁盘并关闭fdisk。现在磁盘已正确分区,您可以格式化引导分区:
    # mkfs.ext4 /dev/vda2
步骤5:在VPS磁盘上安装ZFS
将/dev/vda1格式化为ZFS卷:
# 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
这组选项由ZFS文档推荐,以确保与最新及未来磁盘的最高兼容性。选项compression=zstd启用了ZSTD压缩算法,该算法比默认的LZ4具有更高的压缩率,但如果您的VPS具有高磁盘I/O,您可以使用compression=lz4来减少CPU使用率。池被命名为rpool,这是根池最常用的名称。当此命令完成后,rpool将挂载在实时环境的/mnt目录下,如上面-R /mnt选项所指定的那样,但它将在每次后续启动时自动挂载到/。将其挂载到/mnt是必要的,以便从实时环境中将备份恢复到其上。
步骤6:将备份恢复到新的ZFS根文件系统
在实时环境中安装OpenSSH服务器以从备份VPS接收备份数据:
# apt install openssh-server
为简化操作,请在实时环境的 /etc/ssh/sshd_config 中启用 PermitRootLogin yes,然后设置一个安全的 root 密码并重启 OpenSSH:
# passwd
# service restart ssh
并从备份 VPS 启动备份数据的恢复,这将填充挂载在 /mnt 上的 ZFS 根池:
## 从备份 VPS
# rsync -arxz backup.d/* root@target:/mnt/
或者,如果您使用 TAR 创建了备份存档,请使用以下命令进行恢复:
## 从备份 VPS
# cat backup.tgz | ssh root@target "tar -C /mnt -zaxf -"
然而,正如我在 步骤 1 中提到的,在解压时,TAR 会将绝对符号链接的目标路径转换为相对路径;这些符号链接可以通过以下方式全部正确恢复。请注意,如果您没有使用 TAR 备份根文件系统,则无需进行此恢复。从备份 VPS 中,列出存档中包含的所有符号链接:
## 从备份 VPS
# tar -tvf backup.tgz | egrep -- '->' >list_of_symlinks.txt
然后将列表复制到目标 VPS 的 /mnt 目录中,该目录现在包含从备份中重新填充的根文件系统:
## 从备份 VPS
# scp list_of_symlinks.txt root@target:/mnt/root/
在目标 VPS 上,chroot 到 /mnt 并执行此 Bash 脚本来恢复所有绝对符号链接:
## 从 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 并挂载引导分区:
# mount --bind /dev  /mnt/dev
# mount --bind /proc /mnt/proc
# mount --bind /sys  /mnt/sys
# mount /dev/vda2 /mnt/boot
你可以选择将 /mnt/boot/ 中的任何现有内容复制到新的引导分区。进入根池的 chroot 环境,并在其中安装 ZFS initramfs 钩子、ZFS 内核模块以及生成 initrd 所需的 ZFS 用户空间工具:
# chroot /mnt
# apt install pkg-dev linux-headers-amd64 linux-image-amd64
# apt install zfs-dkms zfs-initramfs
然后安装 GRUB2 包:
# apt install grub-pc
# update-initramfs -u -k all
编辑 /etc/default/grub 以将 ZFS 池设置为根设备,通过修改 GRUB_CMDLINE_LINUX 变量:
## 这是 /etc/default/grub
GRUB_CMDLINE_LINUX="root=ZFS=rpool"
然后应用配置:
# update-grub
最后将 GRUB2 安装到 MBR:
# grub-install /dev/vda
步骤 8:启动到 ZFS 根池
系统已准备就绪,已从备份完全恢复,可以启动。退出 chroot 并卸载所有虚拟文件系统,然后导出 ZFS 根池:
# exit # 退出 rpool chroot
# umount /mnt/dev
# umount /mnt/proc
# umount /mnt/sys
# umount /mnt/boot
# umount /mnt
# zpool export -a
您现在可以从VPS控制面板中移除ISO镜像(如果您使用了此选项),或者从硬盘中删除ISO,并重启系统进入ZFS根池:
# reboot
VPS根文件系统从EXT4转换为ZFS的过程已完成,VPS将像往常一样启动到您之前安装的系统中。

阅读更多文章
中文 俄语 印尼语 土耳其语 孟加拉语 德语 日语 法语 波兰语 英语 菲律宾语 葡萄牙语 西班牙语 越南语 阿拉伯语 韩语 马来语
帮助  –  索引  –  隐私政策  –  联系我们  –