原创文章,转载请注明出处
https://qiedd.com/

0. 简介

之前在腾讯云上尝试了在根分区上使用ZFS
但是我用的是 Aur 源的 zfs-dkms,它更新时需要总 github 下载源码,网络不好导致出错
最后滚挂了内核,导致内核里没有ZFS模块
然后费了点力气才把它救回来

1. 准备

首先我们要知道我们需要做什么

  1. 我们需要一个完整的系统来安装 zfs 模块
  2. 在这个系统上,需要chroot到原来的zpool去重新安装内核
  3. 理论成立,实验开始

然后,我们需要去买一块云硬盘挂载,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

下载 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

挂载 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

硬盘分区

# 分区
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

配置系统

# 挂载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 --populate archlinux &>/dev/null
pacman-key --recv-keys F75D9D76 --keyserver keyserver.ubuntu.com &>/dev/null
pacman-key --lsign-key F75D9D76 &>/dev/null
pacman -Syy

# 重新安装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
分类: Linux

0 条评论

发表评论

Avatar placeholder

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据