如果我有罪,应该让警察叔叔来抓我,而不是让我在2020年去编译一个可以塞进软盘里的Linux.
—我 自己说的
某课程在GCC命令
的课后练习中的作业是编译一个可启动的以BusyBox为内核的在软盘上启动的Linux,(即所谓的FloppyLinux,本世纪初某些爱好者的小玩具,用来炫耀Linux的高度可定制性,与当前的Windows To Go高度相似且都具有极度羸弱的性能),因为Grub并不识别我挂载Loop设备作为软盘镜像,所以我只能用虚拟机虚拟一个软盘设备,才勉强成功.整个过程花费了好几天的时间,总结下写在下面.
- 实际上借助Makefile,编译反而是整个过程中最简单的部分,难点在于配置环境.由于软盘的大小不过是1.44M,但是比较新的内核很难剪裁到这种程度,因此教程推荐了
2.4.20版本
.但是问题在于较老的Linux版本使用了很多过时的C语法并动态依赖
了很多硬件相关头文件,导致在gcc4
及以上版本不能编译通过,即使降级到gcc3
,也会因为一些动态依赖库的问题而失败. - Floppy-Linux的教程要求利用系统自身的grub完成配置,且要求版本为
grub legacy
在得出这些经验的过程中,我先后实验了Ubuntu 20.10
/ CentOS 6.5
/CentOS 5.6
,最后的选择是Red Hat 2.4
,(发行于2003年,NMD
在这种中古平台上操作有很多不便,比如系统的DHCP功能不能在虚拟机中正确使用需要手动指定IP信息,系统不内置yum
在线包管理器,只能靠rpm
管理….可想而知这种版本的Linux内核再精简的用户体验.
编译过程中仍然出现了几个Bug,例如在勾选了I2C驱动后会编译失败,Google得知是内核版本Bug,还有勾选了Network File System后如果未勾选网络也会失败(好像可以理解),跳过之后便完成了Floppy的编译.
一点个性化
- BusyBox 默认的终端是ash,在作为
login shell
时会读取用户目录下的.profile
或/etc/profile
,但是作为FloppyLinux,默认是以non-login
的模式启动的,在inittab
中,BusyBox通过::askfirst=-/bin/ash
配置项跳过登录程序,先行执行终端ash
.因此我们向ash传递--login
参数来使ash
进入login shell
模式. ash
通过读取PS1
变量的内容来设置命令行提示符(即#或$),可以在profile
文件中更改.- 通过
echo
可以输出字符画,甚至支持8位颜色.