Chinaunix首页 | 论坛 | 博客
  • 博客访问: 533598
  • 博文数量: 526
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 3235
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-29 17:52
文章分类

全部博文(526)

文章存档

2011年(1)

2008年(525)

我的朋友

分类: LINUX

2008-08-29 18:08:06

 
转贴
把Linux放进软盘里

  笔者的同事最近在测试AMD64bitCPU时,遇到这样一个问题:当插入含有AMD官方软件Maxpower64的软盘后,系统提示不能引导。关于这个软件AMD公司提供的信息很少,只知道它必须在linux环境下执行。所以笔者打开软盘,发现里面只有两个文件:syslinux.cfg,Maxpower64,这样问题就明确了,靠这两个文件是无法引导进入linux系统的,更不用说执行Maxpower64。下面我就介绍一下如何修复这个软件,使得它可以正常使用。

  我们首先要得到一张可以引导进入linux环境的软盘,这种软盘必须由两部分组成,即内核和根文件系统。我们首先制作一个内核。
内核的编译要把内核部分放到一张1.44MB的软盘上去,通常要对内核进行压缩,压缩内核的最好方法是进行重新编译内核,将一些不必要的支持去掉,如对网络和其它周边设备的支持,重要的一点是记住内核必须支持RAMDISK及ext2,否则系统不能正常引导。编译之前请确认您是以root的身份在进行操作,否则会返回PermissionDenied的提示。

  首先要到合适的编译路径,一般路径都在/usr/src/Linux,RH9的路径是在/usr/src/Linux-2.4,只有在这个路径你的命令才会生效。否则会显示

make:***Noruletomaketarget''config'',stop的错误提示.

  如果你以前编译过内核,那应当先执行#makemrproper这个命令,它可以删除以前的建构的痕迹。如果你没有编译过,可以不执行它。

  接下来执行#makemenuconfig开始配置内核,把你认为不需要的东西都不要编译到内核,比如业余电台,csi,I20,IrDA,isdn,bluetooth.最后保存为.config后退出。

再接下来就依次执行以下命令:

#makedep(设置依赖关系)
#makeclean(准备要建构的源码树)
#makebzImage(建构内核)
#makemodules(配置模块)
#makemodules_install(使用配置的模块)
#makeinstall(把新的内核和相关文件复制到正确的目录)

  执行到这里,在/boot下会看到名字为vmlinuz-2.4.22custom的文件。这就是我们编译得到的内核。如果它的size大于1.44M,那就得重新编译,再去掉一些不需要的东西,直到内核小于1.44M,为了便于记忆,我们不妨将它重新命名为newkernel,接下来我们紧接着制作根文件系统。

根文件系统的制作

  制作根文件系统前,我们先要解决一个问题:因为一个根文件系统要实现基本的功能,必须包括一些常用工具:如:sh,ls,cd,cat……但是常用工具会占用很多空间,要是用原来系统中的这些命令,就是全部用静态编译,不是用动态连接库,大概也要有2MB~3MB,放不进软盘。因此我们我们的解决的方案是使用BusyBox工具。BusyBox它包含了七十多种Linux上标准的工具程序,只需要的磁盘空间仅仅几百k。在嵌入式系统上常用到它(例如LinuxRouterProject和Debianbootfloppy就使用到它)

建立BusyBox

首先我们从官方网站上下载BusyBox的最新版本:busybox-1.00-rc3.tar.gz并且解开

#tarzxvfbusybox-1.00-rc3.tar.gz

为了压缩空间,我们采用静态编译,修改Makefile中的DOSTATIC参数为true

DOSTATIC=true

然后修改BusyBox中的init.c,设定系统要执行的第一个程序为:/etc/rc.d/rc.sysinit

#defineINIT_SRCIPT\"/etc/rc.d/rc.sysinit\"

开始编译BusyBox

#make
#makeinstall

到这一步我们就得到了可执行命令busybox

解决了这个问题后,我们可以开始制作根文件系统

制作根文件系统

首先为根文件系统建一个目录叫做floppy-Linux,然后进入floppy-Linux目录内

#mkdirfloppy-Linux
#cdfloppy-Linux

然后为rootfilesystem建立一些标准的目录

#mkdirdevetcetc/rc.dbinprocmnttmpvar
#chmod755devetcetc/rc.dbinmnttmpvar
#chmod555proc
#ln-ssbinbin

然后进入/dev目录下建立根文件系统必须的一些设备文件。

建立一般终端机设备

#mknodttyc50
#mkdirconsolec51
#chmod666ttyconsole

建立VGADisplay虚拟终端机设备

#mknodtty0c40
#chmod666tty0

建立RAMdisk设备

#mknodram0b10
#chmod600ram0

建立floppy设备

#mknodfd0b2
#chmod600fd0

建立null设备

#mknodnullc13
#chmod666null

到这里我们就有了一个初步的小型根文件系统,但是还需要配置一些有关的shellscript来完善它。

编辑有关的shellscript

首先进入到/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/procprocdefaults00

然后修改inittab,rc.sysinit,fstab这三个文件的权限

#chmod644inittab
#chmod755rc.sysinit
#chmod644fstab

配置完shellscript后,我们注意到这些shellscript会使用一些/bin目录下的命令,但是我们的/bin目录下是空的。现在我们就使用BusyBox来制作这些常用命令。

使用BusyBox制作常用命令

将busybox复制到软盘的/bin目录下,并且改名为init

#cpbusybox/floppy-Linux/bin/init

然后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。

#ln-sinitls
#ln-sinitcp
#ln-sinitmount
#ln-sinitumount
#ln-sinitmore
#ln-sinitps
#ln-sinitsh

现在我们就有了所需的常用命令。

  到这里我们的根文件系统就制作完成了,但是和内核一样,要把根文件系统部分放到一张1.44MB的软盘上去,也要进行压缩,下面我们就着手压缩它。

压缩根文件系统

  一般我们会采取RAMDisk的方式实现。简单的来说就是将准备好的根文件系压缩成为Ramdisk的镜像文件,当用软盘启动时,再把镜像文件解压到内存中,形成一个虚拟盘(RAMDISK),通过RAMDISK控制系统启动。

我们现在制作Ramdisk的镜像文件

#ddif=/dev/zeroof=/tmp/tmp_loopbs=1kcount=2048
#losetup/dev/loop0/tmp/tmp_loop
#mke2fs-m0/dev/loop0
#mount-text2/dev/loop0/mnt
#cp-a/floppy-Linux/mnt
#umount/mnt
#losetup-d/dev/loop0
#ddif=/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
#cpnewkernel/mnt/floppy/boot
#cpImage.gz/mnt/floppy/boot
#cp/boot/grub/grub.conf/mnt/floppy/boot/grub

编辑grub.conf,内容如下:

timeout10
default0
titleMylittleLinux
  root(fd0)
  kernel/boot/newkernelroroot=/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,内容如下

TIMEOUT20
DEFAULTLinux
LABELLinux
KERNELnewkernel
APPENDroot=/dev/ram0roinitrd=Image.gz

然后将sysLinux.cfg、newkernel、Image.gz拷贝到磁盘中

#mount/dev/fd0/mnt/floppy
#cpnewkernel/mnt/floppy
#cpImage.gz/mnt/floppy
#cpsysLinux.cfg/mnt/floppy
#umount/mnt/floppy

整合完成!

直接引导

依次执行:

#ddif=newkernelof=/dev/fd0bs=1k
252 1recordsin
252 1recordsout

在这个例子中,dd写入了252个完整记录(records) 1个partialrecord,所以内核占用了253个软盘的blocks。这个数字称为KERNEL_BLOCKS,请记得它,这个数字还要使用.

#rdev/dev/fd0/dev/fd0
#rdev-R/dev/fd00
#rdev-r/dev/fd0VALUE

在这里这个VALUE的值应为16384 KERNEL_BLOCKS(上一步dd命令所产生的数值)

所以本例应为:

#rdev-r/dev/fd016637
#ddif=rootsystemfileof=/dev/fd0bs=1kseek=KERNEL_BLOCKS

在这里这个KERNEL_BLOCKS就是上一步dd命令所产生的数值

所以本例应为:ddif=Image.gzof=/dev/fd0bs=1kseek=253

整合完成!

  现在我们就拥有了一张可以自激活到Linux环境的软盘。对于本例来讲,想要执行AMD官方测试软件Maxpower64,只要将Maxpower64这个可执行文件复制到/bin目录就可以了。我们可以在“使用BusyBox制作常用命令“这个阶段来完成它.

#cpMaxpower64/floppy-Linux/bin

这张软盘会自激活到linux环境下,并显示“#”命令提示符,我们只要执行Maxpower64就可以了。

#/bin/Maxpower64

如果希望系统一开机就直接执行Maxpower64,则需要在“编辑有关的shellscript”这个阶段编辑rc.sysinit文件为:

#!/bin/sh
mount–a
/bin/Maxpower64

这样软盘引导进入linux后会直接执行Maxpower64而不再显示“#”命令提示符。

小结

  除了以上的方法,我们也可以通过引导器给内核传递参数来实现内核和根文件系统分别放置在不同的软盘上,这样内核就可以再大一些,支持的功能也就越多。总之制作一张包含小型linux的软盘并不困难,关键是要细心和耐心,此外最好能够了解BusyBox和RAMDISK的工作原理,这对于更好的完善系统是有很大帮助的。

把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里把Linux放进软盘里
阅读(314) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~