由于某些原因,我一直想在自己的一台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的平台上试验的原因就是为了提供一种失联后补救的方案。
归根到底,最容易出现问题的部分就在于:
- sshd崩溃
- sshd重启后未启动
- 网络配置错误
- 账户未添加
对于其它发行版,应该也是大同小异,至少原理是相通的,细节部分各异。
最后,祝各位好运!
No zip no die why you try...
我很想知道你失败了多少次才写出这篇blog~
3次左右吧,主要是网络环境不太好,sshd老是会重连,科大云上面尚未试验成功。
centos 有 ml 的 kernel 啊。
http://elrepo.org/tiki/kernel-ml
孤陋寡闻了,没听过这个仓库。。。
看介绍其主要目标似乎是兼容新硬件,但是对于以下几点不太确定:
1. 是否会对现有的依赖产生影响
2. 很多和kernel版本相关的package似乎没有,诸如systemtap之类的
如果只需要最新的内核,我可以自行编译一个,但是很多周边的package会成为麻烦。
更何况这样就没法折腾了,哈哈哈
你可以试试,我用着没有问题。