把Linux放进软盘里

发表于:2007-07-04来源:作者:点击数: 标签:
感谢zhl1979指出我的N多错误(汗......)已经修正。 把Linux放进软盘里 笔者的同事最近在 测试 AMD64bitCPU时,遇到这样一个问题:当插入含有AMD官方软件Maxpower64的软盘后,系统提示不能引导。关于这个软件AMD公司提供的信息很少,只知道它必须在 linux 环

感谢 zhl1979 指出我的N多错误 (汗......) 已经修正。

把Linux放进软盘里

笔者的同事最近在测试AMD 64bit CPU时,遇到这样一个问题:当插入含有AMD官方软件Maxpower64的软盘后,系统提示不能引导。关于这个软件AMD公司提供的信息很少,只知道它必须在linux环境下执行。所以笔者打开软盘,发现里面只有两个文件:syslinux.cfg,Maxpower64,这样问题就明确了,靠这两个文件是无法引导进入linux系统的,更不用说执行Maxpower64。下面我就介绍一下如何修复这个软件,使得它可以正常使用。
我们首先要得到一张可以引导进入linux环境的软盘,这种软盘必须由两部分组成,即内核和根文件系统。我们首先制作一个内核。
内核的编译
要把内核部分放到一张1.44MB的软盘上去,通常要对内核进行压缩,压缩内核的最好方法是进行重新编译内核,将一些不必要的支持去掉,如对网络和其它周边设备的支持,重要的一点是记住内核必须支持RAMDISK及ext2,否则系统不能正常引导。编译之前请确认您是以root的身份在进行操作,否则会返回Permission Denied的提示。
首先要到合适的编译路径,一般路径都在/usr/src/Linux,RH9的路径是在/usr/src/Linux-2.4,只有在这个路径你的命令才会生效。否则会显示
make: *** No  rule  to  make  target  'config' ,  stop的错误提示. 
如果你以前编译过内核,那应当先执行#make  mrproper 这个命令,它可以删除以前的建构的痕迹。如果你没有编译过,可以不执行它。
接下来执行#make  menuconfig 开始配置内核,把你认为不需要的东西都不要编译到内核,比如业余电台,scsi,I20,IrDA,isdn,bluetooth.最后保存为.config后退出。 
再接下来就依次执行以下命令:
#make  dep  (设置依赖关系) 
#make  clean  (准备要建构的源码树)
#make  bzImage  (建构内核 )
#make  modules ( 配置模块)
#make  modules_install  (使用配置的模块) 
#make  install  (把新的内核和相关文件复制到正确的目录)
执行到这里,在/boot下会看到名字为vmlinuz-2.4.22custom的文件。这就是我们编译得到的内核。如果它的size大于1.44M,那就得重新编译,再去掉一些不需要的东西,直到内核小于1.44M,为了便于记忆,我们不妨将它重新命名为newkernel,接下来我们紧接着制作根文件系统。
根文件系统的制作
制作根文件系统前,我们先要解决一个问题:因为一个根文件系统要实现基本的功能,必须包括一些常用工具:如:sh,ls,cd,cat…… 但是常用工具会占用很多空间,要是用原来系统中的这些命令,就是全部用静态编译,不是用动态连接库,大概也要有2MB~3MB,放不进软盘。因此我们我们的解决的方案是使用BusyBox工具。BusyBox 它包含了七十多种 Linux 上标准的工具程序,只需要的磁盘空间仅仅几百 k 。在嵌入式 系统上常用到它 (例如 Linux Router Project 和 Debian boot floppy就使用到它) 
建立 BusyBox
首先我们从官方网站上下载BusyBox的最新版本:busybox-1.00-rc3.tar.gz并且解开
#tar zxvf busybox-1.00-rc3.tar.gz
为了压缩空间,我们采用静态编译,修改 Makefile 中的 DOSTATIC 参数为true
DOSTATIC=true
然后修改 BusyBox 中的 init.c,设定系统要执行的第一个程序为: /etc/rc.d/rc.sysinit 
#define INIT_SRCIPT "/etc/rc.d/rc.sysinit" 
开始编译BusyBox
#make 
#make install
到这一步我们就得到了可执行命令busybox
解决了这个问题后,我们可以开始制作根文件系统
制作根文件系统
首先为根文件系统建一个目录叫做 floppy-Linux,然后进入 floppy-Linux 目录内
 # mkdir floppy-Linux
 # cd floppy-Linux
    然后为 root filesystem 建立一些标准的目录
# mkdir dev etc etc/rc.d bin proc mnt tmp var
    # chmod 755 dev etc  etc/rc.d bin mnt tmp var
    # chmod 555 proc
    # ln -s sbin bin
然后进入 /dev 目录下建立根文件系统必须的一些设备文件。 
    建立一般终端机设备
# mknod tty c 5 0 
    # mkdir console c 5 1
    # chmod 666 tty console
建立 VGA Display 虚拟终端机设备
# mknod tty0 c 4 0
    # chmod 666 tty0
   建立 RAM disk 设备
# mknod ram0 b 1 0
    # chmod 600 ram0
建立 floppy 设备
# mknod fd0 b 2 
    # chmod 600 fd0
建立 null 设备
# mknod null c 1 3
    # chmod 666 null
到这里我们就有了一个初步的小型根文件系统,但是还需要配置一些有关的 shell script来完善它。
编辑有关的 shell script
首先进入到 /floppy-Linux/etc/ 这个目录下编辑 inittab,rc.d/rc.sysinit,fstab这三个文件 ,内容分别如下:
inittab
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh
rc.sysinit
#!/bin/sh
mount –a
fstab
proc   /proc    proc    defaults   0   0
然后修改inittab,rc.sysinit,fstab这三个文件的权限
# chmod 644 inittab
# chmod 755 rc.sysinit
# chmod 644 fstab
配置完shell script后,我们注意到这些shell script会使用一些 /bin目录下的命令,但是我们的/bin目录下是空的。现在我们就使用BusyBox来制作这些常用命令。
使用BusyBox制作常用命令
将busybox 复制到软盘的/bin目录下,并且改名为init
# cp busybox /floppy-Linux/bin/init
    然后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。
# ln -s init ls
    # ln -s init cp
    # ln -s init mount
    # ln -s init umount
    # ln -s init more
    # ln -s init ps
    # ln -s init sh
现在我们就有了所需的常用命令。
到这里我们的根文件系统就制作完成了,但是和内核一样,要把根文件系统部分放到一张1.44MB的软盘上去,也要进行压缩,下面我们就着手压缩它。
压缩根文件系统
一般我们会采取 RAM Disk 的方式实现。简单的来说就是将准备好的根文件系压缩成为Ramdisk的镜像文件,当用软盘启动时,再把镜像文件解压到内存中,形成一个虚拟盘(RAMDISK),通过RAMDISK控制系统启动。
我们现在制作Ramdisk的镜像文件
    # dd if=/dev/zero of=/tmp/tmp_loop bs=1k count=2048
    # losetup /dev/loop0 /tmp/tmp_loop
    # mke2fs -m 0 /dev/loop0
    # mount -t ext2 /dev/loop0 /mnt
    # cp -a /floppy-Linux /mnt
    # umount /mnt
    # losetup -d /dev/loop0
    # dd if=/tmp/tmp_loop | gzip -9 > /tmp/Image.gz
    # rm -f /tmp/tmp_loop
    # sync
这样我们就得到了压缩过的根文件系统也就是Ramdisk的镜像文件Image.gz。
目前为止我们已经有了内核和压缩过的根文件系统.现在剩下的就是把它们整合在一张软盘里面。

整合核心和根文件系统
根据引导的方式不同,有以下三种整合方案:
用grub引导
依次执行:
# mke2fs /dev/fd0 
# mount /dev/fd0 /mnt/floppy 
# mkdir /mnt/floppy/boot 
# mkdir /mnt/floppy/boot/grub 
# cp /boot/grub/stage1 /mnt/floppy/boot/grub 
# cp /boot/grub/stage2 /mnt/floppy/boot/grub 
#grub
在 grub> 提示符处,输入: 
grub> root (fd0) 
grub> setup (fd0) 
grub> quit 
#cp newkernel  /mnt/floppy/boot 
#cp Image.gz  /mnt/floppy/boot
#cp /boot/grub/grub.conf  /mnt/floppy/boot/grub
编辑grub.conf, 内容如下:
timeout 10 
default 0 
title My little Linux 
  root (fd0) 
  kernel /boot/newkernel ro root=/dev/ram0
  initrd /boot/ Image.gz 
然后制作grub.conf的link文件menu.lst
#ln -s /mnt/floppy/boot/grub/grub.conf /mnt/floppy/boot/grub/menu.lst
#umount /mnt/floppy
整合完成!
用sysLinux引导
依次执行:
    # mkdosfs /dev/fd0
    # sysLinux /dev/fd0
    编辑 sysLinux 的组态档 sysLinux.cfg,内容如下
TIMEOUT 20
DEFAULT Linux
LABEL Linux
KERNEL newkernel
APPEND root=/dev/ram0 ro initrd=Image.gz
然后将 sysLinux.cfg、newkernel、Image.gz 拷贝到磁盘中
# mount /dev/fd0 /mnt/floppy
    # cp newkernel /mnt/floppy
    # cp Image.gz /mnt/floppy
    # cp sysLinux.cfg /mnt/floppy
#umount /mnt/floppy
整合完成!
直接引导
依次执行:
# dd if=newkernel of=/dev/fd0 bs=1k
 252+1 records in
 252+1 records out
在这个例子中,dd 写入了 252 个完整记录(records) + 1个partial record ,所以内核占用了 253 个软盘的 blocks 。这个数字称为 KERNEL_BLOCKS ,请记得它,这个数字还要使用. 
#rdev /dev/fd0 /dev/fd0
#rdev -R /dev/fd0 0
#rdev -r /dev/fd0 VALUE
在这里这个VALUE的值应为16384+ KERNEL_BLOCKS(上一步dd 命令所产生的数值)
所以本例应为:#rdev -r /dev/fd0 16637
#dd if= root system file of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS
在这里这个KERNEL_BLOCKS就是上一步dd 命令所产生的数值
所以本例应为:dd if= Image.gz of=/dev/fd0 bs=1k seek=253
整合完成!

现在我们就拥有了一张可以自激活到Linux环境的软盘。对于本例来讲,想要执行AMD官方测试软件Maxpower64,只要将Maxpower64这个可执行文件复制到 /bin目录就可以了。我们可以在“使用BusyBox制作常用命令“这个阶段来完成它.
# cp Maxpower64 /floppy-Linux/bin
这张软盘会自激活到linux环境下,并显示“#”命令提示符,我们只要执行Maxpower64就可以了。
#/bin/Maxpower64
如果希望系统一开机就直接执行Maxpower64,则需要在“编辑有关的 shell script”这个阶段编辑rc.sysinit文件为:
#!/bin/sh
mount –a
/bin/Maxpower64
这样软盘引导进入linux后会直接执行Maxpower64而不再显示“#”命令提示符。
小结
除了以上的方法,我们也可以通过引导器给内核传递参数来实现内核和根文件系统分别放置在不同的软盘上,这样内核就可以再大一些,支持的功能也就越多。总之制作一张包含小型linux的软盘并不困难,关键是要细心和耐心,此外最好能够了解BusyBox和RAMDISK的工作原理,这对于更好的完善系统是有很大帮助的。 



作者简介
姓名:雷凯
E-mail: tigerleihm@yahoo.com.cn 

参考资料:http://www.douzhe.com/docs/Linux/ ;<<Linux启动盘boot/root盘的制作>>
      http://www.nsfocus.com/ ;<<亲手打造 Floppy Linux 环境>>

 初学摄影 回复于:2005-03-23 10:56:42
老大还在升技?不是去上海了吗? :roll:

 tigerlei 回复于:2005-03-23 10:58:01
呵呵,忘了改了。。。

 platinum 回复于:2005-03-23 11:24:00
哈哈,tigerlei的头像总是这么搞笑 :m01:

 tigerlei 回复于:2005-03-23 11:25:08
呵呵,客气拉,不如你的奶嘴小弟有亲和力阿

 hezhiroy 回复于:2005-03-23 13:01:17
呵呵,不错

 jiyu2004 回复于:2005-03-23 18:23:25
不错

 风戬 回复于:2005-03-24 07:49:59
如果用2。6的内核也放得下么?

 tigerlei 回复于:2005-03-24 09:14:35
整个内核肯定不行,所以需要你根据需要适当裁减

 platinum 回复于:2005-03-24 09:37:14
其实最关键的部分就是“如何裁减内核”
至于怎么放到软盘里,或者放到光盘里、放到U盘里,网上都有很多介绍

但是,如何有效裁减内核到最小,而不影响系统的运行,至少能启动,这个谈到的寥寥无几,我目前也在研究中,看看到底什么是必须要的,必不可少的,否则就要出错的东西

 tigerlei 回复于:2005-03-24 10:12:08
嗯,没错,我做的时候基本上把一些类似于blue tooth,scsi等一些都去掉了,反复做了好几次才得到有小又可以用的内核,至于说到那些可以删哪些不能删,还没有研究过,还请老兄有结果了通知一下,我也好涨点见识。另外本文的目的就是抛砖引玉,就是想引出老兄的这块玉,还请指教

 platinum 回复于:2005-03-24 10:17:32
唉,我研究了好几天了,也是没有结果
因为,不同的硬件系统,要做不同的定制,很麻烦

我最后决定,还是自己做光盘启动的Linux比较好,呵呵
1、速度快
2、容量大,可以放自己的很多东西
3、找有光驱的机器简单,找有软驱的就难了
很多LiveCD都是这么做的,还有自己的X,比如koppix等

我感觉,做这个工作,对系统的启动机制会有更深层次的了解

 wingger 回复于:2005-03-24 10:21:27
玩玩gentoo吧,可以自己制作哦。嘿嘿

 风戬 回复于:2005-03-24 13:51:26
好像同样的config,2.6的比2.4要大很多,能大200多k,晕,大了近一倍。。
选项上除floppy,Loopback,RAM,initrd,System V ipc,systrl,kernel support,processor family基本都不是必需的吧。大概是这样

 风戬 回复于:2005-03-24 13:58:49
platinum做好了也借我玩玩好不好,不过建议不要压缩,我内存才256,不然会很慢
呵呵,我从前用lfs做过,不过一做图形界面就乱了。。。。
期待中。。。。

 platinum 回复于:2005-03-24 14:15:24
我曾经给我们公司定制过一张跑路由的LINUX光盘
放到光驱里以后自动拨pppoe,自动起防火墙,自动做NAT,支持远程te.net管理,支持高级路由策略
才15M大小,可以放到3寸光盘里,负责NAT的机器只需要64M内存,不用有硬盘、鼠标、键盘、显示器,跑起来很爽

不过后来公司的网络拓扑改了,也专门用了个机器做,我就装了个CentOS-3.4跑很多业务,没再继续研究

其实做起来不难,就是麻烦,需要注意几个问题
1、不用精简内核,因为我们是刻到光盘上
2、建议用高版本内核,把所有支持的东西都编译进去,这样可以支持各种硬件
3、iptables该升级升级,netfilter该打补丁打补丁
4、需要了解、掌握syslinux,这个是做引导系统用的
5、学会使用ldd命令来移植系统,有的时候busybox不行,需要自己单独从现有系统移植东西
6、了解、掌握LINUX的启动过程,知道boot的过程,知道boot以后要调用什么shell
7、巧用VMWARE,做出来的ISO不要急于刻盘,先在VMWARE里跑跑看

 风戬 回复于:2005-03-24 15:11:48
呵呵,谢谢platinum指导,不过对我来说,我只是个人使用,好多东西都不能少,就像我从前做的一个不到1m的系统,除了用它修复下系统,我真的没有找出其他用途。
尽管我已经能完全在命令行下上网,看电影,聊qq等一些基本的娱乐性操作,但我还是觉得不够,对个人使用者来说,命令行更适用于管理,图形界面是很重要的,还有不少带有娱乐性质的东西也都要用到,想什么ImageMagick之类的东西如果都加上就不小了
另外,刚才想了想,如果不要mount,我说的Loopback似乎也没必要一定编译进,这样,编译busybox时还可以把mount去掉,又少了些空间,或许能用来装点别的东东

 king1981 回复于:2005-04-14 22:54:44
ding ..............

 king1981 回复于:2005-04-14 23:11:30
ding ..............

原文转自:http://www.ltesting.net