用 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 桥接网络的设置可以自行搜索。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论