跨越15年的相逢,用 3.16 内核跑 RedHat 6.2古董 Linux
最近我在看《KVM 虚拟化技术–实战与原理解析》这本书,学到了不少虚拟机的玩法。 不由得感叹自己以前对虚拟机的功能认识还停留在非常简单的程度。有时间我会在另一篇文章里介绍一下我认为比较有意思的虚拟机折腾玩法。这里专门记录我为了能让15年前红帽出品的6.2发行版能跑在 QEMU 上所折腾的事情。
为啥要跑 Red Hat 6.2
某个夜深人静的夜晚,没有约妹子,我在网上乱逛,在 tldp 站点上看到一篇介绍如何构造最小 Linux 系统的HOWTO文章(http://users.cecs.anu.edu.au/~okeefe/p2b/buildMin/buildMin.html)。文章很老了,2000年的,而且里面所用的系统是Red Hat Linux 6.1版本的。我一直觉得 LFS 还是太复杂了,而这篇文章所涉及的组件最少,于是我就想找个6.1版的系统安装到qemu虚拟机上再照着做一个最小系统出来。在这个kernel archive可以找到很多古董发行版。我只找到了6.2版的iso镜像而文章里所用的6.1版没有提供镜像。所以我下载了redhat-6.2-i386.iso安装盘。
安装系统
我的host用的是 Ubuntu 14.10。系统安装有 QEMU 最新版本,启用kvm模块。
1. 创建一个硬盘镜像
qemu-img create -f qcow2 redhat.img 2G
这样创建了一个2G大小的镜像
2. 启动虚拟机&安装系统
qemu-system-x86_64 redhat.img -cdrom redhat-6.2-i386.iso -net nic,model=rtl8139 -m 128M
安装系统提供了字符菜单,至于中文就别指望了。不过安装过程倒很简单。
遇到的问题
1. 启动失败和对策
安装好系统以后,重启虚拟机,机器会提示如此错误:
在这里找到了线索。做法是在 LILO 提示符出来时按 Tab 键 ,出现两个启动选项,输入 linux-up 回车即可。此时系统就能无误启动成功了。
2. 网卡问题
从启动 QEMU 的命令行可以看出,QEMU 模拟了 rtl8139 这款较老的网卡。在6.2系统中内核已经认出了这个设备。但是用 ifconfig 可以看出网卡接收不到任何数据:
我怀疑可能是宿主机的桥接网络设置有问题,于是用相同的配置启动了ezgo 的虚拟机,发现网卡工作正常。那么可以确定是6.2自己的内核网卡驱动和 QEMU 的网卡配合起来出问题了。
试试看,用宿主机的内核来启动
QEMU 提供-kernel 和-initrd 选项用来指定启动虚拟机 Linux 的内核。我们来试试看用3.16的内核替代6.2红帽的2.4.7内核看看!
步骤一:
将geust的fstab文件中所有hdaX改为sdaX。在老内核中ide设备的命名形式是hda1,hdb2等等,sda是专门命名scsi设备的。现在的内核硬盘都使用了scsi设备驱动,统一都以scsi设备的形式命名。
步骤二:
新建/sys目录,下次启动就可以挂载sysfs文件系统,这个是2.4内核没有的功能。
步骤三:
qemu-system-x86_64 redhat.img -net nic,model=rtl8139 -sdl -net tap -enable-kvm -kernel /boot/vmlinuz-3.16.0-25-generic -append 'root=/dev/sda5' -initrd /boot/initrd.img-3.16.0-25-generic
注意在上面的选项中,用-append制定了向内核指定的参数,我们指定了root设备参数。当然推荐再加个vga参数,让一屏显示更多字符。
开机
哇塞!新内核可以顺利启动了!真是有点惊喜,经测试,网卡也终于允许正常了,甚至还能获取到 ipv6 地址。
简单测试一下,GCC 什么的工具都能运行,但是和内核打交道的工具肯定会有问题。例如ps会 core dump。guest中的ps期望读到的/proc目录里面的文件格式是2.4内核生成的文件格式。我们这个3.16内核生成的文件肯定不一样了。
更改了X配置文件中鼠标设备路径,从/dev/mouse 改成/dev/input/mouse0,X也可以启动了!不过分辨率还是有问题。应该深入一下可以解决的。
更新,可以体验传说中的 FVWM2 了
折腾了一晚上,还是没办法把 guest 上的X server正常工作, QEMU 的 cirrus 显卡始终不能在老的X server下工作。于是决定用宿主机开启一个X server,将 guest 作为X client。上图!
LILO 引导,新来的 Linux 小朋友可能还没见过…%>_<%
熟悉的 Red Hat 小红帽 Logo
xdm :
!!!在这里说一下,gdm和xdm现在还没法正常启动一个完整的gnome环境。gnome-session 会core dump。
但是FVMW2,也没有让我失望:
最后看看悲剧的 Netscape 浏览器,缅怀一下,当年 Red Hat 6.2 是带这款浏览器的,可惜后来被微软在 Windows 里绑定 IE 干死了,但是却诞生了伟大的 Mozilla 和 火狐 Firefox,生得光荣,死得伟大,敬礼…
具体做法是:
1. 在宿主机下载Xnest软件,在/etc/下添加一个配置文件X1.hosts,此文件允许guest连接本地 :1 服务器
inet 172.18.18.62 #此ip为guest的ip
2. 宿主机启动一个新的X server
Xnest :1 或者 xinit -- :1
3. guest 设置 DISPLAY 环境变量,输入 fvwm2
然后就可以体验了!!此外我为了体验一下xdm还将guest上的xdm配置成不启动本地 X server,只等待外部连接的设置。
尾声
古董系统是跌跌撞撞勉勉强强启动起来了。终于可以好好看那个howto继续做最小系统了。其实还有一些可以折腾的地方,比方说把procps源码包下载来调试调试,改改ps的源码让它在新内核上工作正常。
另一方面,3.16 内核还能带动15年前的发行版这个事实倒说明了内核对外的接口是非常稳定的。折腾完毕,打完收工。
一起折腾
有小伙伴看完这篇文章也想折腾,不折腾不爽的,我把我处理好的虚拟机文件上传到了网盘中提供下载欢迎一起折腾,下载地址:http://pan.baidu.com/s/1mg41b9u;文件名是:redhat-6.2-linuxstory.img;下载到本地在终端中直接执行如下命令即可奇迹发生(热泪盈眶),(用户名 root 密码 zhu)当然你得先安装 QEMU ,最新版本是 2.2.0。不谢。guest网卡设置了静态ip。看官记得根据自己需要修改。
最后总结一下我的启动命令:
qemu-system-x86_64 redhat-6.2-linuxstory.img -net nic,model=rtl8139 -sdl -net tap -enable-kvm -kernel /boot/vmlinuz-3.16.0-25-generic -append 'root=/dev/sda5 rhgb vga=792' -initrd /boot/initrd.img-3.16.0-25-generic -m 1G
有关于linux桥接网络的设置可以自行搜索。