未找到匹配的服务
在运行的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 启动。具体操作如下:
# 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 交换
# 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
}
update-grub2
- 步骤3:在实时操作系统环境中安装ZFS
-
启动实时操作系统镜像并访问其终端。然后在实时操作系统环境中安装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 来创建以下两个分区:
# 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卷:
# 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接收备份数据:
# apt install openssh-server
# passwd
# service restart ssh
## 从备份 VPS
# rsync -arxz backup.d/* root@target:/mnt/
## 从备份 VPS
# cat backup.tgz | ssh root@target "tar -C /mnt -zaxf -"
## 从备份 VPS
# tar -tvf backup.tgz | egrep -- '->' >list_of_symlinks.txt
## 从备份 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 并挂载引导分区:
# mount --bind /dev /mnt/dev
# mount --bind /proc /mnt/proc
# mount --bind /sys /mnt/sys
# mount /dev/vda2 /mnt/boot
# chroot /mnt
# apt install pkg-dev linux-headers-amd64 linux-image-amd64
# apt install zfs-dkms zfs-initramfs
# apt install grub-pc
# update-initramfs -u -k all
## 这是 /etc/default/grub
GRUB_CMDLINE_LINUX="root=ZFS=rpool"
# update-grub
# 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
# reboot
阅读更多文章