Linux系统是非常灵活的,不过一般都是通过安装介质或者安装内核来引导,然后安装。
我这几天折腾的系统安装采取这种方式,比较另类,当然,说另类是好听,其实是比较变态。为什么要这么干,听我徐徐道来:
我有一台远程服务器,系统是RedHat AS4 Update 1,我想换成Ubuntu 8.10 Server版,我无法直接接触到机器,而且在整个安装的过程中间,网络不能断,ssh服务不能断,因为我是通过ssh登录远程服务器的。因为要换的系统和目前运行的系统区别相差太大了,通过简单的升级不能完成(昨天我有一台服务器通过简单的yum update方式把Asianux Server 3.0换成了CentOS 5.3)。
通过kickstart的方式自动安装也不太可能,一来我找不到适合当前机器的ks配置文件,而来,即便找到了,在能自动安装之前,好像还有几个步骤是需要点击下一步的(也许是搞错了),总之,风险系数较大,一旦有一点点问题,机器就不能访问了。
走LFS的方式,应该可以成功,至少可以先搞出一个基本Debian系统,然后升级,但是LFS的方式实在是比较耗费时间,想想要二次编译gcc,glibc等,那可是需要大把大把时间的。
总而言之,直接把原来的系统覆盖掉,估计是不靠谱的(光如何保证ssh服务不断,我就不知道如何做),因此只能是先在另外一个分区上安装需要的系统了。
还有一个办法,我以前搞过,那就是用虚拟机软件,先通过虚拟机的方式再一个新分区上安装系统,然后重启系统,选择这个新系统,一般情况下,这招都比较灵光,我这次也首先想到了它,可是不知道为什么,我用的qemu总是在系统安装到一半的时候会崩溃,不知道和安装ubuntu系统是不是有关系。
于是,我的做法是,先搞出一个分区,然后下载busybox源代码,静态编译,一定是要静态编译,而后利用busybox的特征,在新分区上构建一个最小的系统,如果不知道构架一个最小系统需要那些目录,哪些文件,一个取巧的办法是把当前系统的/boot/initrd-.img文件解压到新分区上,然后把静态编译出来的Busybox拷贝过去。把安装镜像文件拷贝过去。接下来把Busybox内置的命令全部搞成符号链接的方式(方法可以参考这里),替换掉已经存在的命令,比如从initrd镜像文件里已经解压出了ls命令,现在用busybox内置的ls命令替换它。这样,大概一个基本系统就已经完成了。
接下来,chroot到这个新分区,如果前一步没有什么问题的话,这个步骤应该不会报错,否则的话,根据报错的信息自行调试,这里省去1万字。
为什么要利用busybox呢,那是因为busybox有我需要的一个东西,dpkg,基于Debian的系统,安装包都是dpkg格式的(deb),安装它就需要dpkg这个指令了(当然busybox也内置有rpm指令),安装包是简单的,直接使用dpkg -i xxx.deb就好了,但是Linux系统最令人痛苦的包依赖关系马上就展现在你面前了。我曾尝试把包的依赖关系理论,比如我会首先安装glibc包,不过会提示依赖binutils包,而binutils又会依赖libc6包。。。。,4个小时的尝试几乎让我崩溃。我想我不能干,要不就是我还没有找到好的办法,要不压根就不能这么干。
怎么办呢?不能安装,那就解压吧,为了保证不会出现缺少库文件的问题发生,我把系统镜像文件里所有的deb包都解压出来了。
解压包的安装包的差别在于后者会在安装前后执行一些脚本来做一些必要的配置,而这些配置有些是必须的,比如创建一些库的符号链接。因此接下来的任务是保证一些系统最基本的命令能够正确运行,比如ls,bash,dpkg,apt等。这又是一个耗时的工作,具体的步骤,这里省去1万字。
等到基本的命令可以使用了,特别是apt-get命令可以使用后,问题就好办多了,立刻利用apt-get的升级功能在把所有的包全部重新安装一遍(实际上,你可以需要安装3,4遍),方法是把系统镜像文件加入到仓库源里,然后开始apt-get install glibc,apt-get install bash等,也是先把基本系统重构造好,一定要保证最基本的命令,库稳定可靠。
等上面的步骤完成了,你就可以执行apt-get update && apt-get upgrade了。
到此,只能算是软件包安装完成,但是我发现还有一些文件无论你怎么安装包,它都不会自己创建的,比如/etc/{passwd,shadow,group}等重要文件,这个时候,就是秀出你Linux基本功的时候,你的凭空创建这些文件,然后自己根据每个文件的格式,慢慢的填写好,当然,你也可以从别的已经安装好的系统上拷贝一份过来,然后做一些必要的调整。
等上面的步骤都顺利完成,然后你也觉得没有问题的时候,修改系统的grub.conf文件,开始重启吧。
从我开始打算安装新系统,到最后顺利启动,然后远程能登录,我花了2天的时间,如果能接触到机器,也许30分钟就可以了。嗯,的确比较变态!