在线替换Linux系统

由于某些原因,我一直想在自己的一台VPS上使用尽可能新的kernel。

然而,绝大多数供应商提供的镜像均相对保守,像ArchLinux基本不会在他们的可选范围之内。

因此,问题就来了,既然官方不提供比较新的镜像,而你又迫切想要使用,应该怎么办?本文会提供一种方案来实现在线的Linux系统替换,目前只在DO上成功过,如果各位想要尝试,可以在提供网页console的平台上尝试。

注意:目前本人仅在Debian7和CentOS7上实验成功,基本可以确定本文对于CentOS6.5并不适用。以下操作存在未知的风险,请事先备份数据,谨慎处理。

以下选择的镜像是ArchLinux,官方wiki有提供一份相关指南,各位亦可以移步参考,原系统建议使用CentOS,版本没有什么影响,如果是Debian,可能会出问题。

下载bootstrap包

和从镜像安装ArchLinux一样,在进行在线的系统替换之前,我们需要一个“最小系统”,就跟安装镜像一样。

国内的话,可以从USTC镜像站下载,这个包的名字形式为archlinux-bootstrap-YYYY.MM.DD-ARCH.tar.gz,如下指令可以实现:

cd /tmp
wget http://mirrors.ustc.edu.cn/archlinux/iso/2017.02.01/archlinux-bootstrap-2017.02.01-x86_64.tar.gz
tar xf archlinux-bootstrap-2017.02.01-x86_64.tar.gz

修改mirrorlist

特别需要说明的一点是,bootstrap包内部并没有任何编辑器,所以你需要在原系统内修改mirrorlist,选择一个合适的镜像服务器。

vi /tmp/root.x86_64/etc/pacman.d/mirrorlist

切换根目录

接下来你需要将根目录切换到root.x86_64,为简便起见,可以使用arch-chroot

/tmp/root.x86_64/bin/arch-root /tmp/root.x86_64

切换之后,我们就进入到了这个“最小系统”。

初始化pacman密钥

使用pacman安装之前,使用如下命令初始化pacman的密钥:

pacman-key --init
pacman-key --populate archlinux

注意,第一条命令会消耗很长时间,即使是4-5个小时,也不要觉得惊讶,你的系统越干净整洁,消耗的时间就越长。

安装前的一些准备

到目前为止,你的VPS还是安全的,并不会无故失联。但是还请务必使用提供网页版console的平台,以备不时之需。

目前的内存中已经加载了所需的动态链接库、内核以及sshd,按理说,我们可以放心地卸载原根目录上的所有文件,包括sshd,但是这并不能确保原系统的所有文件被移除后,sshd依旧能够正常工作,至少我在DO上第一次尝试时就失败了。无论如何,我们最好还是在最小系统上先安装一个sshd,即使并不能在chroot状态下启动sshd,至少可能在sshd进程企图访问某些文件时,起到“欺骗”作用。

pacman -Syy
pacman -S openssh

抹除原系统

既然是替换系统,而非安装,关键就在于“抹除”,在此之前,先将原系统盘挂载到/mnt,我这里的盘符是vda1,各位根据需要而定。

mount /dev/vda1 /mnt

接下来,就是尽可能地删除/mnt下的文件,尽情rm吧!

安装新系统

请参考ArchLinux安装教程,从“选择更新源”开始操作,这里不再赘述,但是请不要重启,不然就等着后悔吧。

后续操作

重启前,你需要确保已经设置了root的密码,如果不允许root登录,则添加一个普通用户。

其次,你需要安装sshd,否则就重启后就直接失联了,安装后执行下列命令,以确保重启后sshd正确运行。

systemctl enable sshd

最后一步,请务必确保你已经正确设置ip地址,具体操作参考netctl的wiki,否则依旧会失联的。

总结

多次提醒大家在提供网页版console的平台上试验的原因就是为了提供一种失联后补救的方案。

归根到底,最容易出现问题的部分就在于:

  1. sshd崩溃
  2. sshd重启后未启动
  3. 网络配置错误
  4. 账户未添加

对于其它发行版,应该也是大同小异,至少原理是相通的,细节部分各异。

最后,祝各位好运!

已有 5 条评论
  1. No zip no die why you try...
    我很想知道你失败了多少次才写出这篇blog~

    1. 3次左右吧,主要是网络环境不太好,sshd老是会重连,科大云上面尚未试验成功。

  2. Jeffrey4l Jeffrey4l

    centos 有 ml 的 kernel 啊。

    http://elrepo.org/tiki/kernel-ml

    1. 孤陋寡闻了,没听过这个仓库。。。

      看介绍其主要目标似乎是兼容新硬件,但是对于以下几点不太确定:

      1. 是否会对现有的依赖产生影响
      2. 很多和kernel版本相关的package似乎没有,诸如systemtap之类的

      如果只需要最新的内核,我可以自行编译一个,但是很多周边的package会成为麻烦。

      更何况这样就没法折腾了,哈哈哈

  3. 你可以试试,我用着没有问题。

说两句: