把 Xen PV 的 VPS 中的 CentOS 5 强行换成 Debian 7

我前两天买到一个 VPS,买完之后发现甚是奇葩,可又由于某些原因不想退掉。奇葩之处在于(包括但不仅限于),不给 Console,系统只有 Windows 2003 和 CentOS 5,机器是 32 位。虽然说能装 Windows 的应该是 Xen HVM,但是在 CentOS 5 里面有发现 /proc/xen 的存在,也就是说 CentOS 5 貌似是 Xen PV(还是说其实是 HVM 不过只是装了个 Xen 的内核,总之没 Console 没 VNC 还是没法用正常的途径装系统)。CentOS 5 里面的东西太旧了怎么能忍,于是有了各种折腾以及这篇文章。如果你也想要这样做,请确认你的 VPS 支持 PV-GRUB 或 PyGRUB,并且有或能折腾出另一个可以作为 root 的硬盘或分区

说心里话,还是希望你不要遇到这么奇葩的商家。

在一切开始之前,我还是介绍下详细情况,其实我觉得我遇上这样的情况,不知道是运气太好还是运气太差。奇葩之处:

  • VPS 的系统如果是 Linux 只有 CentOS 5
  • 机器是 32 位的
  • 没 console 没 VNC
  • 商家好像不懂什么技术

特别要说一下的是第三点,有人会说有 SSH 不就好了,问题是,一旦启动不了了,尤其是我这么作死的想法,就没辙了,你不知道原因,你只能重装系统。商家什么的我就不说什么了。我研究了下 VPS 的控制面板终于知道为什么会没有了,控制面板是国人做的。这个控制面板据说以前版本还有 VNC 的,但是有漏洞能用来操控母机,于是后来为了「安全」考虑,VNC 就只有管理员能用了。我无语。

于是我的目的很明确,用非常规途径安装 Debian 7。

基础知识

为了让读者明白我之后的一大堆操作我做了什么,我有必要从一些基础知识讲起。如果不想看这些废话,可以直接开始

Linux 系统的启动流程大致是这样的:

Boot loader => Kernel => init => …

Boot loader

Boot loader 对于一般 PC 上运行的 Linux 来说,可以是 GRUB、LILO 之类的。它用于加载内核、initrd(Initial RAM disk),并且可以传递参数给 Kernel,比如指定 root 设备等。如果装了多个操作系统,就可以选择要启动的操作系统。显然等我系统装好后,要来这里进行一些修改。

然而,在很多的 VPS 里面,boot loader 有些不一样的地方。多数的 VPS 是 Xen PV,而不太多的 Xen HVM、KVM 则是和上面提到的普通 PC 是一样的,OpenVZ 的话我没有了解过。Xen PV 的虚拟机里面,boot loader 是虚拟化软件 Xen 的一部分,多数的 Xen PV 虚拟机,启动时 Xen 读取母鸡上的配置文件来载入内核,也就是说,内核及内核参数,都是不能改的,带来的影响我后面会说。少数 Xen PV 虚拟机,会设置使用 PV-GRUBPyGRUB 作为 boot loader,PV-GRUB 或 PyGRUB 会像一般的 GRUB 一样读取虚拟机里面的配置文件,来让用户选择或设置内核和参数。对于不能接触母机的 VPS 用户,可定制性变高了。

Boot loader 之后会将一切都交给内核。

Kernel

接着是 Kernel,内核。Linux 内核是 Linux 系统的核心,它会给用户态的程序提供各种各样的服务。不同版本的内核含有的功能不一样,因此很多用户态的程序都对内核有版本的要求,宏观来看,发行版会对内核版本有要求(自带的显然是符合要求的)。CentOS 5 自带的内核,对于 Debian 7 来说就是不符合要求的。

对于 Xen PV 虚拟机,内核有其他的要求。Xen PV 的虚拟化方式,要求对虚拟的操作系统进行修改,这里就是 Linux 内核。早期的内核需要打补丁,后来这些代码已经合并进入了主干(但要在编译时开启)。没打开 Xen 虚拟化的 Linux 内核,是无法在 Xen PV 虚拟机里面运行的(不给用户换内核,也就没有不能运行的担忧了)。这样的虚拟化方式也许很奇怪,但是多数的 VPS 都是这样的。

在启动过程中,内核获得机器的控制权限后,自身进行初始化后,会挂载 root 设备,之后会将 init 程序载入内存,再进行 fork。

init

Linux 内核不是 Linux 系统的全部,还有很多的用户态程序,在内核的管理、帮助下运行。init 是内核 fork 出来的第一个用户态程序,pid 为 1。从 init 开始,各个不同的发行版就各有各世界了。init 程序会启动各种其他的程序,一切你看到过的熟悉的。包括 init 程序本身,以及之后它运行的程序,不同的发行版上他们都有可能是不一样的。

读者有兴趣的可以看一看 init 的维基百科条目

悲惨的经历

悲惨的经历放到这里来说,是不想让后面介绍一步一步怎么做时掺杂太多吐槽和血泪;也不想让后面变成流水账,然后某个遇到同样奇葩情况的倒霉蛋读到我的文章之后,跟着一步一步失败无数次。

对,折腾这东西我失败了不知道多少次。前面说到过,弄错了,机器开不了机,就重装。原因你只能猜一猜,我直到后来,在其他地方试验,才能猜到一些,真实原因之后失败后的成功能解答。谢天谢地,VPS 有两个硬盘,重装可以只抹掉系统盘而不影响另一个所谓数据盘,节省了我很多时间;这也让我有第二个可以作为 root 的设备,如果就一个硬盘,想要分区,好像太难了一点。

除了在目标的 VPS 上失败过很多次,我也在我自己电脑上的虚拟机失败过很多次,性别不同怎么谈恋爱大误 环境从头到尾都不一样怎么能类比;后来我找到了非常相似的环境,Linode,单独开了一个一个月的 VPS 来试验,幸亏有它我才得到了某个百思不得其解的问题的原因,先在它上成功完成了目标,使得在奇葩 VPS 上完成目标成为可能。

当然,一些当时遇到的情况,后面不可避免会提到,和我给出的操作密切相关。正式开始前,竟然已经说了这么多。

开始吧

Kernel

目的是要换发行版,但是需要兼容的内核,内核不合适的话安装过程都不能顺利完成。如果你的内核兼容 Debian 7,请跳至 Debian 7 的安装

Update 2014/8/19: 根据 Debian Wiki 对于 Debian 7,686-pae 和 amd64 的内核都支持 Xen,自己装上就是了,具体步骤就不详细说了。

下内核源码、make oldconfig、make menuconfig 什么的怎么用我就不讲了,这应该不是你第一次编译内核。

从已有的 config 来会比较方便,我拿的 Linode 的 3.12.9 的,偷懒。

我会说 CentOS 的 Volume Group 有多坑爹吗?内核分分钟找不到 root 设备,我在自己电脑上的虚拟机自始至终就没成功过。。。偷懒拿 Linode 的内核参数,改成 32 位的之后又呵呵,Xen 的支持自动关了。。。然后没打开 Volume Group 支持,又呵呵……

根据 Linode 的指引,内核需要打开一下的功能

  • CONFIG_PARAVIRT=y
  • CONFIG_PARAVIRT_GUEST=y
  • CONFIG_PARAVIRT_CLOCK=y
  • CONFIG_XEN=y
  • CONFIG_XEN_BLKDEV_FRONTEND=y
  • CONFIG_XEN_NETDEV_FRONTEND=y
  • CONFIG_XEN_SCRUB_PAGES=y
  • CONFIG_HVC_XEN=y

在我的机器上,因为是 32 位的,需要去 make menuconfig 关掉 64 位,又为了支持 Xen,然后要打开

  • CONFIG_HIGHMEM64G=y

然后为了 Volume Group 需要打开(其实这对 Debian 的 udev 有影响,不过为了继续,不管先)

  • CONFIG_SYSFS_DEPRECATED=y
  • CONFIG_SYSFS_DEPRECATED_V2=y

接着请仔细检查上面这些设置是不是都打开了,如果是,而且不冲突(make menuconfig 里面没问题,保存后这些也都还在)那就编译吧。

我来好心提供一个,也许你们的情况都不一样,使用请小心。config 3.9.12

make modules -j4
make bzImage -j4
make modules_install
make install

然后请修改 /boot/grub/menu.lst 默认要选择新编译的内核。reboot 重启吧,祝你好运!

如果成功启动了,请执行 uname -a 检查。如果是你自己的内核,请继续!

Debian 7 的安装

到这里,你已经成功了一半。下面的步骤我参考了不少这篇文章,非常谢谢他。也请读者移步去下载一下那篇文章中的 debootstrap-1.0.48+deb7u1-1.noarch,我就不盗链了。下面会用到 debootstrap,自己折腾这个软件很麻烦,所以我推荐读者过去下载。

debootstrap 是一个用于安装 Debian 基本系统的软件,它甚至可以运行在其他的发行版上面,也许你听说过 archbootstrap,用途是一样的。

准备

说白了就是准备个地方装 Debian。普通的一个目录行不行的通我就不知道了,我是单独拿了一个分区出来(第二个硬盘上分的一个区),这个设备会在之后指定为内核的 root 参数。

请格式化为 ext3。

ext4 应该是可以的,但是我自己遇到的情况是,明明是 ext4 却被当成 ext3 然后无法挂载,内核加上参数 rootfstype=ext4 貌似不管用,于是简单粗暴的如此推荐。

mkfs.ext3 /dev/xvdb1
mkdir /mnt/debian
mount /dev/xvdb1 /mnt/debian

安装

接着上神器 debootstrap 了(镜像什么的自己选,然后因为是 32 为的机器所以架构写的 i386)

debootstrap --no-check-gpg --arch i386 wheezy /mnt/debian http://mirrors.163.com/debian

如果内核版本太旧,这里会报错。一般这里过后就是 chroot,但是加多一步有益无害。

mount -o bind /dev /mnt/debian/dev

可能你在其他的 debootstrap 教程中很少会见到这样做的,一般的做法是 chroot 进去之后执行 MAKEDEV。但是我觉得那样太丑陋的,而且 /dev/xvdb 之类的虚拟硬盘也不会自动出现。之前提到过,内核的某参数会影响之后 udev 的运行,而我也试过装好 Debian 7 之后无视 Volume Group,不要那个参数,结果还是起不来。保险起见,现在的内核跑得起来也就不折腾它了,然后 MAKEDEV 之后还是装上的好。

让我们进入 Debian 7 吧!

LANG=C chroot /mnt/debinst /bin/bash
export TERM=xterm-color
apt-get install makedev

嗯,现在你使用的一切都是 Debian 7 里的了,让我们来配置它。先补上 /proc、/sys 让系统更正常一些吧。修改 /etc/fstab,其中的内容请根据实际情况作改变

/dev/xvdb1      /       ext3    defaults        0       0
/dev/xvda1      /boot   ext3    defaults        0       0
proc            /proc   proc    defaults        0       0
sys             /sys    sysfs   defaults        0       0

上面是我这里的情况。接着 mount -a。然后系统应该就正常多了。

接着请自行配置网卡、DNS、主机名。

然后自行配置 /etc/apt/sources.list

接着执行 apt-get update 然后自己装软件什么的吧,尤其是 ssh

执行下面的一步你的系统会更加完整一些

tasksel install standard

完成后,你的系统就应该可以用了。但是还有一些步骤,忘记了的话还是启动不了的。

执行 passwd 设置 root 的密码!

把内核模块要从原来的系统拿过来啊!大致的做法如下

exit
#现在回到了 CentOS 5
cp -r /root/linux-3.12.9 /mnt/debian/root/linux-3.12.9
#回来 Debian 7
LANG=C chroot /mnt/debinst /bin/bash
export TERM=xterm-color
apt-get install gcc
#不装的话会有一些小错误
cd /root/linux-3.12.9
make modules_install

看到最后这个关键步骤了吗,ko 少了会怎么样自己想吧。

貌似,快结束了。

当时的我激动过无数次,然后失望了无数次。直到后来在 Linode 上试验成功之后,我才在奇葩 VPS 上面成功。我容易吗?!。。。

然后就改下启动菜单 /boot/grub/menu.lst 了

default=0
timeout=5
hiddenmenu
title Debian 7 (3.12.9)
    root (hd0,0)
    kernel /vmlinuz-3.12.9 ro root=/dev/xvdb1 console=xvc0
    initrd /initrd-3.12.9.img

其他都不重要,最关键的是 root,以前是 /dev/VolGroup00/LogVol00,我可以竖中指吗?文明是什么?现在 Debian 7 安装的地方了 /dev/xvdb1。

网配好了?ssh 装好了?设置了 root 密码了?好……

reboot

上面这个命令我敲了不知道多少次,不知道多少次之后都是连不上机器,然后去重装。。。伤不起啊 QAQ

不知道有没有读者照着这篇文章做的,我希望你能成功的 ping 通机器以及 ssh 登录上去(是啊,一切操作都是直接 ssh 上去做的,说过的没 console 嘛)。总之,最终我是成功了。。。泪目

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NOWARRANTY, to the extent
permitted by applicable law.

其他什么的就自己慢慢玩吧。。。

结语

连续折腾了两三天,虽然最后成功了很开心,但还是深感这是带着镣铐跳舞。也许你会好奇是什么让我对这奇葩 VPS 不离不弃,我很自私的不想告诉你,也请不要在评论中讨论这点。

最后的最后,我还是希望读者不要遇到这样的奇葩 VPS。

PS:试验品 Linode 退掉了,点了 remove 之后会把剩下时间的钱还给你的。

在〈把 Xen PV 的 VPS 中的 CentOS 5 强行换成 Debian 7〉中有 3 則留言

發佈回覆給「Jz」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *