另眼观潮 打开软盘里的Linux小世界(转)
时间:2006-07-07 来源:wwling2001
笔者在测试AMD的64位CPU时,插入含有AMD官方测试软件Maxpower64的软盘后,系统提示不能引导。关于这个软件AMD公司提供的信息很少,只知道它必须在Linux环境下执行。笔者打开软盘,发现里面只有syslinux.cfg和Maxpower64两个文件。
显然,靠这两个文件是无法引导进入Linux系统的,更不用说执行Maxpower64。于是笔者自己制作了一张可以引导进入Linux环境的软盘。该软盘必须由两部分组成,即内核和根文件系统。下面介绍制作的方法。
内核的编译
要把内核放到一张1.44MB的软盘上去,通常要对内核进行压缩。压缩内核的最好方法是重新编译,将一些不必要的支持去掉,比如对网络和其它周边设备的支持。注意,内核必须支持RAM Disk和ext2,否则系统不能正常引导。
编译之前首先请确认是以root的身份在进行操作,否则会返回“Permission Denied”的错误提示。然后进入合适的编译路径,一般是在/usr/src/Linux-xx下,比如,Red Hat 9.0的编译路径是在/usr/src/Linux-2.4下。只有在正确的路径下编译命令才会生效。否则会显示如下提示:
make: *** No rule to make target 'config'
如果以前编译过内核,则应当先执行“make mrproper”命令删除以前编译的痕迹。接下来执行“make menuconfig”命令开始配置内核,把不需要的东西去掉,并保存为.config文件。随后,依次执行以下命令(括号中是关于命令的解释):
#make dep (设置依赖关系)
#make clean (准备要构建的源码树)
#make bzImage (构建内核)
#make modules (配置模块)
#make modules_install (使用配置的模块)
#make install (编译新内核) 执行完这些命令后,在/boot目录下会看到一个名字为vmlinuz-2.4.22custom的文件,这就是编译所得到的内核。如果该文件大于1.44MB,就得重新编译,再去掉一些不必要的东西,直到它小于1.44MB为止。为了便于记忆,不妨将它重新命名为newkernel。 根文件系统的制作
一个根文件系统要实现基本的功能,必须包括一些常用工具,比如,sh、ls、cd及cat等。但是这些常用的工具会占用很多空间,即使只用原系统中的这些命令,即全部用静态编(不用动态连接库),大概也要有2MB~3MB。<BR><BR>使用BusyBox工具可以解决此问题。BusyBox包含了70多种Linux上的标准工具程序,而且只需要几百KB空间,在嵌入式系统上常用到它(比如Linux Router Project和Debian Boot Floppy)。 1.建立 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。
2.制作根文件系统 首先为根文件系统建一个floppy-Linux目录:
# mkdir floppy-Linux # cd floppy-Linux ================3>>>>>>>>>>>>>>> 然后为根文件系统建立一些标准的目录: # 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 ram 建立Floppy设备: # mknod fd0 b 2 # chmod 600 fd0 建立Null设备: # mknod null c 1 3 # chmod 666 null 到此为止就有了一个初步的小型根文件系统,但是还需要编辑一些Shell Script来完善它。 =============4>>>>>>>>>>>> 3.编辑Shell Script 首先到/floppy-Linux/etc/目录下编辑inittab、rc.sysinit和fstab三个文件,内容分别如下: # vi inittab ::sysinit:/etc/rc.d/rc.sysinit ::askfirst:/bin/sh # vi rc.sysinit #!/bin/sh mount -a # vi fstab proc /proc proc defaults 0 0 然后修改这三个文件的权限: # chmod 644 inittab # chmod 755 rc.sysinit # chmod 644 fstab 注意,这些Shell Script会使用一些/bin目录下的命令。但是/bin目录下是空的。现在就需要使用BusyBox来制作这些常用命令。
4.使用BusyBox制作常用命令 将文件busybox复制到软盘的/bin目录下,并且改名为init:
# cp busybox /floppy-Linux/bin/init 然后创建常用命令的链接,具体的工作原理请参阅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 这样根文件系统就制作完成了。
5.压缩根文件系统
和内核一样,要把根文件系统放到一张1.44MB的软盘上也要进行压缩。一般采取RAM Disk方式实现根文件系统的压缩,即将准备好的根文件系统压缩成为RAM Disk的镜像文件。当用软盘启动时,会把镜像文件解压到内存中,形成一个虚拟盘,通过该虚拟盘可以控制系统启动。 依次执行如下命令,制作RAM Disk的镜像文件: # 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
这样就得到了压缩过的根文件系统文件Image.gz。 ===========6>>>>>>>>>> 整合内核和根文件系统
目前为止已经有了内核和压缩过的根文件系统,现在剩下的就是把它们整合到一张软盘里。根据引导方式的不同,有三种整合方案。 1.用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 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 =======7>>>>>>>>>> 2.用sysLinux引导 首先依次执行如下命令: # mkdosfs /dev/fd0 # sysLinux /dev/fd0 然后编辑文件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 3.直接引导 首先依次执行如下命令: # dd if=newkernel of=/dev/fd0 bs=1k 252+1 records in 252+1 records out 在这个例子中,dd命令写入了252个完整记录(Record)和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。因此该例中为16637。
最后执行如下命令即可完成整合: #dd if= root system file of=/dev/fd0 bs=1k seek=<KERNEL_BLOCKS> KERNEL_BLOCKS就是上一步dd命令所产生的数值(253)。 小结 现在就拥有了一张可以自动激活到Linux环境的软盘。想要执行AMD官方测试软件Maxpower64,只要将该文件复制到/bin目录即可。也可以在使用BusyBox制作常用命令时完成该操作: # cp Maxpower64 /floppy-Linux/bin 如果希望一进入系统就直接执行Maxpower64,则需要在编辑Shell Script时,修改rc.sysinit文件为如下内容:
#!/bin/sh mount -a /bin/Maxpower64 这样软盘引导进入Linux后就会直接执行Maxpower64,而不再显示“#”命令提示符。 除了以上方法,还可以将内核和根文件系统分别放置在不同的软盘上,通过引导器给内核传递参数来实现以上功能。这样内核就可以再大一些,支持的功能也就多些。总之,制作一张包含小型Linux系统的软盘并不困难,关键是要细心和耐心。 此外,了解BusyBox和RAM Disk的工作原理对于更好地完善系统有很大帮助。
#make clean (准备要构建的源码树)
#make bzImage (构建内核)
#make modules (配置模块)
#make modules_install (使用配置的模块)
#make install (编译新内核) 执行完这些命令后,在/boot目录下会看到一个名字为vmlinuz-2.4.22custom的文件,这就是编译所得到的内核。如果该文件大于1.44MB,就得重新编译,再去掉一些不必要的东西,直到它小于1.44MB为止。为了便于记忆,不妨将它重新命名为newkernel。 根文件系统的制作
一个根文件系统要实现基本的功能,必须包括一些常用工具,比如,sh、ls、cd及cat等。但是这些常用的工具会占用很多空间,即使只用原系统中的这些命令,即全部用静态编(不用动态连接库),大概也要有2MB~3MB。<BR><BR>使用BusyBox工具可以解决此问题。BusyBox包含了70多种Linux上的标准工具程序,而且只需要几百KB空间,在嵌入式系统上常用到它(比如Linux Router Project和Debian Boot Floppy)。 1.建立 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。
2.制作根文件系统 首先为根文件系统建一个floppy-Linux目录:
# mkdir floppy-Linux # cd floppy-Linux ================3>>>>>>>>>>>>>>> 然后为根文件系统建立一些标准的目录: # 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 ram 建立Floppy设备: # mknod fd0 b 2 # chmod 600 fd0 建立Null设备: # mknod null c 1 3 # chmod 666 null 到此为止就有了一个初步的小型根文件系统,但是还需要编辑一些Shell Script来完善它。 =============4>>>>>>>>>>>> 3.编辑Shell Script 首先到/floppy-Linux/etc/目录下编辑inittab、rc.sysinit和fstab三个文件,内容分别如下: # vi inittab ::sysinit:/etc/rc.d/rc.sysinit ::askfirst:/bin/sh # vi rc.sysinit #!/bin/sh mount -a # vi fstab proc /proc proc defaults 0 0 然后修改这三个文件的权限: # chmod 644 inittab # chmod 755 rc.sysinit # chmod 644 fstab 注意,这些Shell Script会使用一些/bin目录下的命令。但是/bin目录下是空的。现在就需要使用BusyBox来制作这些常用命令。
4.使用BusyBox制作常用命令 将文件busybox复制到软盘的/bin目录下,并且改名为init:
# cp busybox /floppy-Linux/bin/init 然后创建常用命令的链接,具体的工作原理请参阅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 这样根文件系统就制作完成了。
5.压缩根文件系统
和内核一样,要把根文件系统放到一张1.44MB的软盘上也要进行压缩。一般采取RAM Disk方式实现根文件系统的压缩,即将准备好的根文件系统压缩成为RAM Disk的镜像文件。当用软盘启动时,会把镜像文件解压到内存中,形成一个虚拟盘,通过该虚拟盘可以控制系统启动。 依次执行如下命令,制作RAM Disk的镜像文件: # 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
这样就得到了压缩过的根文件系统文件Image.gz。 ===========6>>>>>>>>>> 整合内核和根文件系统
目前为止已经有了内核和压缩过的根文件系统,现在剩下的就是把它们整合到一张软盘里。根据引导方式的不同,有三种整合方案。 1.用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 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 =======7>>>>>>>>>> 2.用sysLinux引导 首先依次执行如下命令: # mkdosfs /dev/fd0 # sysLinux /dev/fd0 然后编辑文件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 3.直接引导 首先依次执行如下命令: # dd if=newkernel of=/dev/fd0 bs=1k 252+1 records in 252+1 records out 在这个例子中,dd命令写入了252个完整记录(Record)和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。因此该例中为16637。
最后执行如下命令即可完成整合: #dd if= root system file of=/dev/fd0 bs=1k seek=<KERNEL_BLOCKS> KERNEL_BLOCKS就是上一步dd命令所产生的数值(253)。 小结 现在就拥有了一张可以自动激活到Linux环境的软盘。想要执行AMD官方测试软件Maxpower64,只要将该文件复制到/bin目录即可。也可以在使用BusyBox制作常用命令时完成该操作: # cp Maxpower64 /floppy-Linux/bin 如果希望一进入系统就直接执行Maxpower64,则需要在编辑Shell Script时,修改rc.sysinit文件为如下内容:
#!/bin/sh mount -a /bin/Maxpower64 这样软盘引导进入Linux后就会直接执行Maxpower64,而不再显示“#”命令提示符。 除了以上方法,还可以将内核和根文件系统分别放置在不同的软盘上,通过引导器给内核传递参数来实现以上功能。这样内核就可以再大一些,支持的功能也就多些。总之,制作一张包含小型Linux系统的软盘并不困难,关键是要细心和耐心。 此外,了解BusyBox和RAM Disk的工作原理对于更好地完善系统有很大帮助。
相关阅读 更多 +