我前两天买到一个 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-GRUB 或 PyGRUB 作为 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=yCONFIG_PARAVIRT_GUEST=yCONFIG_PARAVIRT_CLOCK=yCONFIG_XEN=yCONFIG_XEN_BLKDEV_FRONTEND=yCONFIG_XEN_NETDEV_FRONTEND=yCONFIG_XEN_SCRUB_PAGES=yCONFIG_HVC_XEN=y
在我的机器上,因为是 32 位的,需要去 make menuconfig 关掉 64 位,又为了支持 Xen,然后要打开
CONFIG_HIGHMEM64G=y
然后为了 Volume Group 需要打开(其实这对 Debian 的 udev 有影响,不过为了继续,不管先)
CONFIG_SYSFS_DEPRECATED=yCONFIG_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 之后会把剩下时间的钱还给你的。
嗯……就是差了点……嗯……
简直有一种 LFS 的感觉…
踩过~