红联Linux门户
Linux帮助

另眼观潮:打开软盘里的Linux小世界

发布时间:2005-09-19 22:53:09来源:红联作者:zz123
作者:雷凯 来源:赛迪网技术天地-开放系统世界
笔者在测试AMD的64位CPU时,插入含有AMD官方测试软件Maxpower64的软盘后,系统提示不能引导。关于这个软件AMD公司提供的信息很少,只知道它必须在Linux环境下执行。笔者打开软盘,发现里面只有sys linux.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。
文章评论

共有 11 条评论

  1. hfangrong 于 2007-03-23 11:07:23发表:

    。BusyBox 包含了
    七十多种 Linux 上标准的工具程序,仅需要几百 k 磁盘空间,在嵌入式系统上常用到它。下载了
    BusyBox的源代码包后可以按照如下的步骤操作:
    DOSTATIC=true
    然后修改 BusyBox 中的 init.c,设定系统要执行的第一个程序为: /etc/rc.d/rc.sysinit
    #define INIT_SRCIPT "/etc/rc.d/rc.sysinit"
    开始编译BusyBox
    #make
    #make install
    到这一步我们就得到了可执行命令busybox
    将busybox 复制到/mnt/initrd/bin目录下
    # cp busybox /mnt/initrd/bin
    然后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。
    我们可以使用 ./busybox --help 来查看busybox中都有哪些工具。常用的工具及busybox
    的用法如下:
    # ln -s busybox ls
    # ln -s busybox cp
    # ln -s busybox mount
    # ln -s busybox umount
    # ln -s busybox more
    # ln -s busybox ps
    # ln -s busybox sh
    现在我们就有了所需的常用命令。

  2. hfangrong 于 2007-03-23 11:06:21发表:

    。BusyBox 包含了
    七十多种 Linux 上标准的工具程序,仅需要几百 k 磁盘空间,在嵌入式系统上常用到它。下载了
    BusyBox的源代码包后可以按照如下的步骤操作:
    DOSTATIC=true
    然后修改 BusyBox 中的 init.c,设定系统要执行的第一个程序为: /etc/rc.d/rc.sysinit
    #define INIT_SRCIPT "/etc/rc.d/rc.sysinit"
    开始编译BusyBox
    #make
    #make install
    到这一步我们就得到了可执行命令busybox
    将busybox 复制到/mnt/initrd/bin目录下
    # cp busybox /mnt/initrd/bin
    然后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。
    我们可以使用 ./busybox --help 来查看busybox中都有哪些工具。常用的工具及busybox
    的用法如下:
    # ln -s busybox ls
    # ln -s busybox cp
    # ln -s busybox mount
    # ln -s busybox umount
    # ln -s busybox more
    # ln -s busybox ps
    # ln -s busybox sh
    现在我们就有了所需的常用命令。

  3. fulijun5858 于 2005-10-23 15:41:48发表:

    不错我也试一试

  4. eoboot 于 2005-10-06 00:38:42发表:

    不错

  5. thej 于 2005-09-20 00:11:36发表:

    支持,不错

  6. zz123 于 2005-09-19 22:56:42发表:

    2.用sysLinux引导

    首先依次执行如下命令:

    obr>
    # 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的值应为16384+KERNEL_BLOCKS。因此该例中为16637。

    最后执行如下命令即可完成整合:

    #dd if= root system file of=/dev/fd0 bs=1k seek=


    KERNEL_BLOCKS就是上一步dd命令所产生的数值。

  7. zz123 于 2005-09-19 22:56:02发表:

    整合内核和根文件系统

    目前为止已经有了内核和压缩过的根文件系统,现在剩下的就是把它们整合到一张软盘里。根据引导方式的不同,有三种整合方案。

    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

  8. zz123 于 2005-09-19 22:55:31发表:

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

    nobr>
    # 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。

  9. zz123 于 2005-09-19 22:54:56发表:

    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

  10. zz123 于 2005-09-19 22:54:19发表:

    然后为根文件系统建立一些标准的目录:

    th="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
    # 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来完善它。

  11. zz123 于 2005-09-19 22:53:39发表:

    根文件系统的制作

    一个根文件系统要实现基本的功能,必须包括一些常用工具,比如,sh、ls、cd及cat等。但是这些常用的工具会占用很多空间,即使只用原系统中的这些命令,即全部用静态编 译(不用动态连接库),大概也要有2MB~3MB。

    使用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