首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

自己定制软盘上的Linux系统方案 02

自己定制软盘上的Linux系统方案 02

四.定制Linux内核  由于软盘大小的限制,内核应尽可能只包含必要的一些支持,对于本文中的例子一定要选上initrd支持。比如如果做为系统修复盘的话,必要的支持包括:IDE,PCI,和需要的文件系统类型等等就可以了,而没有必要网络支持,当然,如果做为路由器或者防火墙的话,网络支持是必要的,而其他的这可相应的删除掉。
  
  #make [xconfig | menuconfig | config]
  #make bzImage
  
  如果添加了模块的支持,还需要
  
  #make modules
  
  之后就得到了内核镜像bzImage。如果bzImage的大小超出了软盘的限制,就需要重新再来配置一下。将编译好的bzImage放到bootldr盘的根目录下,如果把bzImage改了名字,要注意与grub.conf中的名字一致。
  
  五.制定initrd
  在initrd/local目录下建立bin, dev, etc, lib, proc, sysroot, usr目录。其中dev目录下包括必要的设备文件,比如tty, ram, console等等, bin中必要的可执行文件有bzip2, chroot, cp, cpio, dd, echo, mount, pivot_root, readkey, sh, test等。Busybox提供了其中大部分。 bzip2, dd, cpio用来解压缩第二张软盘上的内容,chroot, pivot_root用来转换根目录。
  
  编辑initrd/local/linuxrc文件:
  
  #!/bin/sh
  
  把sysroot目录mount到一块内存上,并建立tmpfs文件系统。
  
  echo "Mounting new root filsystem ..."
  mount tmpfs /sysroot -t tmpfs
  cd /sysroot
  
  下面的readkey是一个很简单的程序,当启动过程执行到这里的时候暂停,等待换入第二章软盘,然后接受任意键输入继续执行启动过程。这个小程序读者可以自己实现,要注意的是最好使用静态链接。
  
  echo " "
  echo -en "Insert the second disk and press ANY key..."
  readkey > /dev/null
  echo " "
  
  将第二章软盘上的内容解压到sysroot目录(内存)中。
  
  echo "Loading root-archive from floppy ..."
  dd if=/dev/fd0 bs=1k | bzip2 -d | cpio -idv
  
  下面将initrd中的文件copy到sysroot/bin目录下,这样可以把根文件系统中一部分内容放到initrd(第一张软盘)中,因为软盘容量有限,当第一张软盘空间有剩余,而第二章软盘空间紧张的时候这会非常有用。
  
  echo "Copying:"
  for file in bzip2 chroot cp cpio echo readkey; do
   echo -en " "; echo -n $file
   cp /bin/$file ./bin/$file
  done
  
  下面将/目录设定为当前目录,即sysroot,并执行刚刚从rootfs盘中解压出来的init。
  
  echo " "
  echo "Pivoting / ..."
  pivot_root . mnt/initrd
  
  echo "Starting init process..."
  exec chroot . /sbin/init /dev/console 2>&1
  
  echo -en"Something went wrong ..."
  /bin/sh || /mnt/initrd/bin/sh
  
  当initrd所有必须的文件都放到bootldr/initrd/local目录下之后,就可以执行bootldr/initrd/mkinitrd.sh来创建initrd镜像文件。mkinitrd.sh的内容为:
  
  #!/bin/sh
  mount -t ext2 /dev/fd0 /mnt/floppy
  rm -f /mnt/floppy/initrd.gz
  rm -f initrd.gz
  
 
返回列表