新闻中心

EEPW首页>嵌入式系统>设计应用> 软盘上的Linux系统方案

软盘上的Linux系统方案

作者: 时间:2011-05-20 来源:网络 收藏
四.定制内核

本文引用地址://m.amcfsurvey.com/article/150724.htm

  由于大小的限制,内核应尽可能只包含必要的一些支持,对于本文中的例子一定要选上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 -enSomething 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

  取4M大小的内存块格式化为ext2格式,并将其mount到bootldr/initrd/ramdisk上。

  dd if=/dev/zero of=/dev/ram9 bs=1k count=4096
  mke2fs /dev/ram9
  mount -t ext2 /dev/ram9 ramdisk/

  把local中的文件复制到ramdisk目录中,也就是那块内存中。

  cp -R local/* ramdisk/
  umount ramdisk

  将内存中的内容压缩为initrd.gz,并复制到bootldr盘中

  dd if=/dev/ram9 bs=1k | gzip -v9 > initrd.gz
  cp initrd.gz /mnt/floppy/
  umount /mnt/floppy

  这样,bootldr盘就完成了。

 六.定制根文件系统

  一个根文件系统需要包含支持系统运行的所有文件。通常包括:

  基本的文件系统结构

  基本的目录: /dev, /proc, /bin, /sbin, /etc, /usr, /tmp等。

  基本的工具: sh, ls, cp, cd, mv等。

  基本的配置文件: rc, inittab, fstab等。

  设备: /dev/hd*, /dev/tty*, /dev/fd0, /dev/ram*, /dev/console等.

  基本的运行库。

  Busybox和Tinylogin是在嵌入式系统上常用的工具包,它们包含了上面提到的常用的工具和目录结构等,而且经过重新改写后所生成的代码比普通的系统上的工具要小的多。

  编辑Busybox的Config.h文件,选择自己需要的工具。修改Busybox和Tinylogin的Makefile文件,制定它们使用静态链接方式(DOSTATIC=true),这样就不需要在生成的系统中添加运行库了。将编译好的Busybox和Tinylogin文件放到rootfs/local中。

  在rootfs/local中在自己创建下面几个目录:dev/, tmp/, etc/, proc/

  可以将系统中/dev下的设备复制到这个目录下,只需要复制必要的就可以了,例如:

  #cp -dpR /dev/tty[0-9] /mnt/rootfs/dev
  #cp -dpR /dev/ram* /mnt/rootfs/dev

  但是要注意一定要包含必要的接各设备/dev/console, /dev/kmem, /dev/mem, /dev/tty, /dev/ram0, /dev/null等。

  etc/目录下包含了目标系统运行所必须的配置文件,它包括的内容依赖与目标系统所要运行的程序。最低限度,它包括下面几个文件:inittab、rc、fstab、passwd、group、shadow、termcap等。做为init进程的参数,inittab可以非常简单,仅需要包括下面几行即可:

  ::sysinit:/etc/rc
  ::askfirst:/bin/login
  tty2::askfirst:/bin/login
  tty3::askfirst:/bin/login
  tty4::askfirst:/bin/login
  ::ctrlaltdel:/sbin/reboot
  ::restart:/sbin/init
  ::shutdown:/bin/umount -a -r
  ::shutdown:/sbin/swapoff -a

  其中sysinit指明系统初始化脚本rc。rc所包含内容也可以非常少:

  #!/bin/sh
  /bin/mount -av
  /bin/umount /mnt/initrd
  /bin/hostname papaya

  fstab的内容为:

  none /proc proc defaults 0 0
  none /tmp tmpfs defaults 0 0

  其他的配置文件可以从原来的系统中获得,然后修剪掉不必要的内容即可。

  现在在/mnt/rootfs中已经包含了运行一个最低限度Linux系统所必须的所有文件和工具,下面需要将它们压缩成一个文件系统了。插入rootfs软盘并执行bootldr/rootfs/mkrootfs.sh

  #!/bin/sh
  rm -f rootfs.cpio.bz2
  dd if=/dev/zero of=/dev/ram0 bs=1k count=4096
  mke2fs /dev/ram0
  mount -t ext2 /dev/ram0 ramdisk/
  cp -R local/* ramdisk/
  cd ramdisk/
  find . -depth -print | cpio -o > ../rootfs.cpio
  cd ..
  bzip2 rootfs.cpio
  umount ramdisk
  dd if=rootfs.cpio.bz2 of=/dev/fd0 bs=1k

  OK,rootfs盘也完成了,可以重启机器验证了。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭