原创文章,转载请注明出处
https://qiedd.com/
0. 简介
之前在腾讯云上尝试了在根分区上使用ZFS
但是我用的是 Aur 源的 zfs-dkms,它更新时需要总 github 下载源码,网络不好导致出错
最后滚挂了内核,导致内核里没有ZFS模块
然后费了点力气才把它救回来
1. 准备
首先我们要知道我们需要做什么
- 我们需要一个完整的系统来安装 zfs 模块
- 在这个系统上,需要chroot到原来的zpool去重新安装内核
- 理论成立,实验开始
然后,我们需要去买一块云硬盘挂载,10G 就够了,用完销毁即可
它会退余额到账户上,然后去账户那里提现就行

2. 开始救援

首先,系统会提示我们进入了 emergency shell,但是我们不要进这个内核,先重启

然后进入 Grub 后,选择第二项,然后进 fallback initramfs


配置网络
腾讯云这里使用的是 dhcp,我们用 udhcp 设置一下
# 启动网口
ip link set eth0 up
ip link set lo up
# 开启dhcp
udhcpc
# 设置路由
ip addr add 10.0.20.13/22 dev eth0
ip route add default via 10.0.20.1 dev eth0
# 测试网络
ping 223.5.5.5 -c 4
# 这里网络的dns不能用,很奇怪
nslookup baidu.com 223.5.5.5
# 启动网口
ip link set eth0 up
ip link set lo up
# 开启dhcp
udhcpc
# 设置路由
ip addr add 10.0.20.13/22 dev eth0
ip route add default via 10.0.20.1 dev eth0
# 测试网络
ping 223.5.5.5 -c 4
# 这里网络的dns不能用,很奇怪
nslookup baidu.com 223.5.5.5
# 启动网口 ip link set eth0 up ip link set lo up # 开启dhcp udhcpc # 设置路由 ip addr add 10.0.20.13/22 dev eth0 ip route add default via 10.0.20.1 dev eth0 # 测试网络 ping 223.5.5.5 -c 4 # 这里网络的dns不能用,很奇怪 nslookup baidu.com 223.5.5.5
下载 Archlinux bootstarp
emergency shell 的命令不是很全,因此我们要进 bootstrap 进行下一步配置
由于网络的dns使用不了,需要从镜像源的 IP 地址下载 bootstrap
我这里用的腾讯云内网源
# 下载
wget http://169.254.0.3/archlinux/iso/2021.12.01/archlinux-bootstrap-2021.12.01-x86_64.tar.gz
# 解压
tar xvf archlinux-bootstrap-2021.12.01-x86_64.tar.gz
# 复制到mnt
cp root.x86_64 mnt -r
# 下载
wget http://169.254.0.3/archlinux/iso/2021.12.01/archlinux-bootstrap-2021.12.01-x86_64.tar.gz
# 解压
tar xvf archlinux-bootstrap-2021.12.01-x86_64.tar.gz
# 复制到mnt
cp root.x86_64 mnt -r
# 下载 wget http://169.254.0.3/archlinux/iso/2021.12.01/archlinux-bootstrap-2021.12.01-x86_64.tar.gz # 解压 tar xvf archlinux-bootstrap-2021.12.01-x86_64.tar.gz # 复制到mnt cp root.x86_64 mnt -r

挂载 bootstrap
感谢 vps2arch!
https://gitlab.com/drizzt/vps2arch
# 挂载一堆东西
mount -t proc proc -o nosuid,noexec,nodev /mnt/proc
mount -t sysfs sys -o nosuid,noexec,nodev,ro /mnt/sys
mount -t devtmpfs -o mode=0755,nosuid udev /mnt/dev
mkdir -p /mnt/dev/pts /mnt/dev/shm
mount -t devpts -o mode=0620,gid=5,nosuid,noexec devpts /mnt/dev/pts
mount -t tmpfs -o mode=1777,nosuid,nodev shm /mnt/dev/shm
mount -t tmpfs -o nosuid,nodev,mode=0755 run /mnt/run
mount -t tmpfs -o mode=1777,strictatime,nodev,nosuid tmp /mnt/tmp
# 配置DNS
echo "nameserver 183.60.82.98" > /etc/resolv.conf
cp -L /etc/resolv.conf /mnt/etc
# 挂载一下自己
mount --bind / /mnt/mnt
# chroot进bootstrap
chroot /mnt
# 测试网络
ping baidu.com -c 4
# 配置镜像
sed -i '1i Server = http://mirrors.tencentyun.com/archlinux/$repo/os/$arch' /etc/pacman.d/mirrorlist
pacman -Sy
# 挂载一堆东西
mount -t proc proc -o nosuid,noexec,nodev /mnt/proc
mount -t sysfs sys -o nosuid,noexec,nodev,ro /mnt/sys
mount -t devtmpfs -o mode=0755,nosuid udev /mnt/dev
mkdir -p /mnt/dev/pts /mnt/dev/shm
mount -t devpts -o mode=0620,gid=5,nosuid,noexec devpts /mnt/dev/pts
mount -t tmpfs -o mode=1777,nosuid,nodev shm /mnt/dev/shm
mount -t tmpfs -o nosuid,nodev,mode=0755 run /mnt/run
mount -t tmpfs -o mode=1777,strictatime,nodev,nosuid tmp /mnt/tmp
# 配置DNS
echo "nameserver 183.60.82.98" > /etc/resolv.conf
cp -L /etc/resolv.conf /mnt/etc
# 挂载一下自己
mount --bind / /mnt/mnt
# chroot进bootstrap
chroot /mnt
# 测试网络
ping baidu.com -c 4
# 配置镜像
sed -i '1i Server = http://mirrors.tencentyun.com/archlinux/$repo/os/$arch' /etc/pacman.d/mirrorlist
pacman -Sy
# 挂载一堆东西 mount -t proc proc -o nosuid,noexec,nodev /mnt/proc mount -t sysfs sys -o nosuid,noexec,nodev,ro /mnt/sys mount -t devtmpfs -o mode=0755,nosuid udev /mnt/dev mkdir -p /mnt/dev/pts /mnt/dev/shm mount -t devpts -o mode=0620,gid=5,nosuid,noexec devpts /mnt/dev/pts mount -t tmpfs -o mode=1777,nosuid,nodev shm /mnt/dev/shm mount -t tmpfs -o nosuid,nodev,mode=0755 run /mnt/run mount -t tmpfs -o mode=1777,strictatime,nodev,nosuid tmp /mnt/tmp # 配置DNS echo "nameserver 183.60.82.98" > /etc/resolv.conf cp -L /etc/resolv.conf /mnt/etc # 挂载一下自己 mount --bind / /mnt/mnt # chroot进bootstrap chroot /mnt # 测试网络 ping baidu.com -c 4 # 配置镜像 sed -i '1i Server = http://mirrors.tencentyun.com/archlinux/$repo/os/$arch' /etc/pacman.d/mirrorlist pacman -Sy
硬盘分区
# 分区
fdisk /dev/vdb
# 格式化硬盘
mkfs.ext4 /dev/vdb1
# 分区示例,grub分区还是能用的,我们直接分个根分区
# 分区
fdisk /dev/vdb
# 格式化硬盘
mkfs.ext4 /dev/vdb1
# 分区示例,grub分区还是能用的,我们直接分个根分区
# 分区 fdisk /dev/vdb # 格式化硬盘 mkfs.ext4 /dev/vdb1 # 分区示例,grub分区还是能用的,我们直接分个根分区

安装系统
# 挂载硬盘
mkdir re
mount /dev/vdb1 re
mkdir /re/boot
mount /dev/vda1 re/boot
# 安装系统
pacman-key --init && pacman-key --populate archlinux
pacstrap /re base vim linux-lts linux-lts-headers networkmanager grub openssh arch-install-scripts --noconfirm
# 再次挂载系统分区,否则读不到信息
mount -t proc proc -o nosuid,noexec,nodev re/proc
mount -t sysfs sys -o nosuid,noexec,nodev,ro re/sys
mount -t devtmpfs -o mode=0755,nosuid udev re/dev
mkdir -p re/dev/pts re/dev/shm
mount -t devpts -o mode=0620,gid=5,nosuid,noexec devpts re/dev/pts
mount -t tmpfs -o mode=1777,nosuid,nodev shm re/dev/shm
mount -t tmpfs -o nosuid,nodev,mode=0755 run re/run
mount -t tmpfs -o mode=1777,strictatime,nodev,nosuid re/tmp
# chroot进安装的系统
chroot re
# 手动设置一下fstab genfstab用不了
vim /etc/fstab
/dev/vdb1 / ext4 rw,relatime 0 0
# 配置grub
grub-install /dev/vda
grub-mkconfig -o /boot/grub/grub.cfg
# 设置root密码
passwd
# 一些服务自启动
systemctl enable NetworkManager
systemctl enable sshd
# 设置允许root登录
PermitRootLogin yes
# 差不多了,退出重启
exit
exit
sync
reboot -f
# 挂载硬盘
mkdir re
mount /dev/vdb1 re
mkdir /re/boot
mount /dev/vda1 re/boot
# 安装系统
pacman-key --init && pacman-key --populate archlinux
pacstrap /re base vim linux-lts linux-lts-headers networkmanager grub openssh arch-install-scripts --noconfirm
# 再次挂载系统分区,否则读不到信息
mount -t proc proc -o nosuid,noexec,nodev re/proc
mount -t sysfs sys -o nosuid,noexec,nodev,ro re/sys
mount -t devtmpfs -o mode=0755,nosuid udev re/dev
mkdir -p re/dev/pts re/dev/shm
mount -t devpts -o mode=0620,gid=5,nosuid,noexec devpts re/dev/pts
mount -t tmpfs -o mode=1777,nosuid,nodev shm re/dev/shm
mount -t tmpfs -o nosuid,nodev,mode=0755 run re/run
mount -t tmpfs -o mode=1777,strictatime,nodev,nosuid re/tmp
# chroot进安装的系统
chroot re
# 手动设置一下fstab genfstab用不了
vim /etc/fstab
/dev/vdb1 / ext4 rw,relatime 0 0
# 配置grub
grub-install /dev/vda
grub-mkconfig -o /boot/grub/grub.cfg
# 设置root密码
passwd
# 一些服务自启动
systemctl enable NetworkManager
systemctl enable sshd
# 设置允许root登录
PermitRootLogin yes
# 差不多了,退出重启
exit
exit
sync
reboot -f
# 挂载硬盘 mkdir re mount /dev/vdb1 re mkdir /re/boot mount /dev/vda1 re/boot # 安装系统 pacman-key --init && pacman-key --populate archlinux pacstrap /re base vim linux-lts linux-lts-headers networkmanager grub openssh arch-install-scripts --noconfirm # 再次挂载系统分区,否则读不到信息 mount -t proc proc -o nosuid,noexec,nodev re/proc mount -t sysfs sys -o nosuid,noexec,nodev,ro re/sys mount -t devtmpfs -o mode=0755,nosuid udev re/dev mkdir -p re/dev/pts re/dev/shm mount -t devpts -o mode=0620,gid=5,nosuid,noexec devpts re/dev/pts mount -t tmpfs -o mode=1777,nosuid,nodev shm re/dev/shm mount -t tmpfs -o nosuid,nodev,mode=0755 run re/run mount -t tmpfs -o mode=1777,strictatime,nodev,nosuid re/tmp # chroot进安装的系统 chroot re # 手动设置一下fstab genfstab用不了 vim /etc/fstab /dev/vdb1 / ext4 rw,relatime 0 0 # 配置grub grub-install /dev/vda grub-mkconfig -o /boot/grub/grub.cfg # 设置root密码 passwd # 一些服务自启动 systemctl enable NetworkManager systemctl enable sshd # 设置允许root登录 PermitRootLogin yes # 差不多了,退出重启 exit exit sync reboot -f

重启后配置
# 添加archzfs源
vim /etc/pacman.conf
[archzfs]
Server = http://archzfs.com/$repo/x86_64
# 可选镜像源
# archzfs
# Origin Server - France
# Server = http://archzfs.com/$repo/x86_64
# Mirror - Germany
# Server = http://mirror.sum7.eu/archlinux/archzfs/$repo/x86_64
# Mirror - Germany
# Server = https://mirror.biocrafting.net/archlinux/archzfs/$repo/x86_64
# Mirror - India
# Server = https://mirror.in.themindsmaze.com/archzfs/$repo/x86_64
# Mirror - US
# Server = https://zxcvfdsa.com/archzfs/$repo/$arch
# 安装key
pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76
pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76
# 安装zfs
pacman -Sy zfs-linux
# 加载zfs模块
/sbin/modprobe zfs
# 添加archzfs源
vim /etc/pacman.conf
[archzfs]
Server = http://archzfs.com/$repo/x86_64
# 可选镜像源
# archzfs
# Origin Server - France
# Server = http://archzfs.com/$repo/x86_64
# Mirror - Germany
# Server = http://mirror.sum7.eu/archlinux/archzfs/$repo/x86_64
# Mirror - Germany
# Server = https://mirror.biocrafting.net/archlinux/archzfs/$repo/x86_64
# Mirror - India
# Server = https://mirror.in.themindsmaze.com/archzfs/$repo/x86_64
# Mirror - US
# Server = https://zxcvfdsa.com/archzfs/$repo/$arch
# 安装key
pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76
pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76
# 安装zfs
pacman -Sy zfs-linux
# 加载zfs模块
/sbin/modprobe zfs
# 添加archzfs源 vim /etc/pacman.conf [archzfs] Server = http://archzfs.com/$repo/x86_64 # 可选镜像源 # archzfs # Origin Server - France # Server = http://archzfs.com/$repo/x86_64 # Mirror - Germany # Server = http://mirror.sum7.eu/archlinux/archzfs/$repo/x86_64 # Mirror - Germany # Server = https://mirror.biocrafting.net/archlinux/archzfs/$repo/x86_64 # Mirror - India # Server = https://mirror.in.themindsmaze.com/archzfs/$repo/x86_64 # Mirror - US # Server = https://zxcvfdsa.com/archzfs/$repo/$arch # 安装key pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76 pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76 # 安装zfs pacman -Sy zfs-linux # 加载zfs模块 /sbin/modprobe zfs
配置系统
# 挂载zpoool
zpool import zroot -R /mnt
# 挂载/boot
mount /dev/vda1 /mnt/boot
# chroot进原系统
arch-chroot /mnt
# 添加Archzfs源
[archzfs]
Server = http://mirror.sum7.eu/archlinux/archzfs/$repo/x86_64
# 添加key
pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76
pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76
pacman -Syu archlinuxcn-keyring
# 重新安装zfs-dkms
pacman -Rs zfs-dkms
pacman -Sy zfs-dkms
# 更新下grub
grub-mkconfig -o /boot/grub/grub.cfg
# 退出重启
exti
umount -R /mnt
reboot
# 进入原系统后即可删除云硬盘
# 再更新下grub
grub-mkconfig -o /boot/grub/grub.cfg
# 挂载zpoool
zpool import zroot -R /mnt
# 挂载/boot
mount /dev/vda1 /mnt/boot
# chroot进原系统
arch-chroot /mnt
# 添加Archzfs源
[archzfs]
Server = http://mirror.sum7.eu/archlinux/archzfs/$repo/x86_64
# 添加key
pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76
pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76
pacman -Syu archlinuxcn-keyring
# 重新安装zfs-dkms
pacman -Rs zfs-dkms
pacman -Sy zfs-dkms
# 更新下grub
grub-mkconfig -o /boot/grub/grub.cfg
# 退出重启
exti
umount -R /mnt
reboot
# 进入原系统后即可删除云硬盘
# 再更新下grub
grub-mkconfig -o /boot/grub/grub.cfg
# 挂载zpoool zpool import zroot -R /mnt # 挂载/boot mount /dev/vda1 /mnt/boot # chroot进原系统 arch-chroot /mnt # 添加Archzfs源 [archzfs] Server = http://mirror.sum7.eu/archlinux/archzfs/$repo/x86_64 # 添加key pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76 pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76 pacman -Syu archlinuxcn-keyring # 重新安装zfs-dkms pacman -Rs zfs-dkms pacman -Sy zfs-dkms # 更新下grub grub-mkconfig -o /boot/grub/grub.cfg # 退出重启 exti umount -R /mnt reboot # 进入原系统后即可删除云硬盘 # 再更新下grub grub-mkconfig -o /boot/grub/grub.cfg
0 条评论