回答

收藏

Linux启动盘boot/root盘的制作 (1)

其他 其他 4148 人阅读 | 0 人回复 | 2007-02-05

boot/root盘由两部分组成,即核心和根文件系统。要把这两部分都放到一个1.44MB的软盘上去,通常要对内核和根文件系统进行压缩,压缩核心的最好方法是进行重新编译内核,将一些不必要的支持去掉,如对网络和其它周边设备的支持,重要的一点是记住内核必须支持RAMDISK及ext2,否则系统不能正常引导。关于内核的编译本文不再阐述,下面重点介绍如何生成根文件系统的压缩包。对于根文件系统的压缩包括两方面的问题,第一是只保留必要的根文件系统组件,第二是将根文件系统做成一个压缩包,类似于内核工作的原理。?

  (1)根文件系统概述?

  一个根文件系统必须包括支持完整Linux系统的全部东西,它至少应包括以下几项:?

  基本文件系统结构?
  至少含有以下目录:/dev、?/proc、?/bin、?/etc、?/lib、?/usr、?/tmp?
  最基本的应用程序,如sh、?ls、?cp、?mv等?
  最低限度的配置文件,如rc、?inittab、?fstab等?
  设备:/dev/hd*、?/dev/tty*、?/dev/fd0?
  基本程序运行所需的库函数?

  以上所需文件一般情况下会超过1.44M,因此我们通常的做法是先准备好内容后再压缩到软盘中,当用软盘启动时,再把文件解压到内存中,形成一个虚拟盘(RAMDISK),通过RAMDISK控制系统启动。?

  为了能创建以上的根文件系统,你必须有一个空闲的能够放下大约4MB文件的RAMDISK。系统缺省情况下已替我们建好了一个大小为4096KB的RAMDISK,其设备名一般为/dev/ram0,我们就使用它来保存我们预先准备好的根文件系统。?
  ?
  (2)?创建根文件系统?

  Linux内核识别两种可以直接拷贝到RAMDISK的文件系统,它们是minix?和ext2,ext2性能更好。mke2fs缺省情况下在1.44M的软盘上产生360个信息节点,使用压缩格式的根文件系统需要更多的信息节点,所以使用如下命令创建文件系统可以创建2000个信息节点,而且一般不会用完。?

  mke2fs?-m?0?-i?2000?/dev/ram0?

  mke2fs将会自动判断设备容量的大小并相应地配置自身,-m?0参数防止它给root保留空间,这样会腾出更多的有用空间。接着把虚拟盘挂在节点/mnt上:?

  mount?-t?ext2?/dev/ram0?/mnt/floppy?

接着是创建目录。根文件系统最少应该有如下8个目录:?

  /dev?—?设备?
  /proc?—?proc?文件系统所需目录?
  /etc?—?系统配置文件?
  /sbin?—?重要的系统程序?
  /bin?—?基本应用程序?
  /lib?—?共享函数库?
  /mnt?—?装载其他磁盘节点?
  /usr?—?附加应用程序?
  执行如下命令创建这些目录:?
  #cd?/mnt/floppy?
  #mkdir?dev?proc?etc?sbin?bin?lib?mnt?usr?

  接下来的工作就是确定各个目录下的内容了:?

  /dev:/dev中含有系统不可缺少的设备文件。可以把现有系统中/dev的文件拷贝过来,然后删除不必要的文件。命令cp?-dpR?/dev?/mnt会拷贝/dev整个目录但不拷贝文件内容,dp开关保证链接文件仍然不变,不会拷贝链接所指原文件,而且属性不变。如果你没有SCSI设备,删除所有的以sd开头的文件。如果你不想使用串口设备,删除所有以cua开头的文件。不过记住一定要保留console、kmem、mem、null、ram、tty1等文件。?

  /etc:这个目录中含有一些必不可少的系统配置文件。这下面的文件比较多,那么到底哪些文件是必需的,哪些可有可无呢?由于这下面的文件一般是一些文本文件,都不是很大,干脆全部保留算了。?

  我的启动盘中含有不到15个配置文件,大致可分为3部分:?

  rc.d/*?—?系统启动脚本?
  fstab?—?列出要登录的文件系统?
  inittab?—?包含启动过程参数?

  而且这些文件都是最简单的。rc应该包括:?

  #!/bin/sh?
  /bin/mount?-av?
  /bin/hostname?yjy?
  fstab应包括:?
  /dev/ram0?/?ext2?defaults?
  /dev/fd0?/?ext2?defaults?
  /proc?/proc?proc?defaults?
  inittab包括:?
  id:2:initdefault:?
  si::sysinit:/etc/rc?
  1:2345:respawn:/sbin/getty?9600?tty1?
  2:23:respawn:/sbin/getty?9600?tty2?

/bin和/sbin:该目录中包含有必不可少的应用程序,如ls,?mv,?cat,你可以根据自己的需要选择,不过一定要记住包括以下程序:init,?getty,login,?mount,运行你的rc的外壳shell。?

  /lib:?该目录中包含有你的启动盘启动过程中所需要的共享函数库,如果缺少必须的函数库,系统会停止启动或出现一大堆错误信息,所以一定要注意。?

  几乎所有的程序都需要libc库,列一下目录/lib中的libc:?

  ?ls?-l?/lib/libc*?
  -rwxr-xr-x?1?root?root?4016683?Apr?16?18:48?libc-2.1.1.so*?
  lrwxrwxrwx?1?root?root?13?Apr?10?12:25?libc.so.6?->?libc-2.1.1.so*?
  libc.so.6的6表示版本号,它指向的文件才是你真正需要的。?

  查看每一个程序使用的函数库,用命令ldd,如:?

  ?ldd?/sbin/mke2fs?
  libext2fs.so.2?=>?/lib/libext2fs.so.2?(0x40014000)?
  libcom_err.so.2?=>?/lib/libcom_err.so.2?(0x40026000)?
  libuuid.so.1?=>?/lib/libuuid.so.1?(0x40028000)?
  libc.so.6?=>?/lib/libc.so.6?(0x4002c000)?
  /lib/ld-linux.so.2?=>?/lib/ld-linux.so.2?(0x40000000)?

  输出右边的库都是必须的,有的可能是链接文件。?

  在/lib目录下你还必须有函数库装载器,这个装载器或是ld.so?(对?a.out?库)?或是?ld-linux.so?(对?ELF?库)。新版本的ldd一般会告诉你所需库的装载器。?

  把装载器和库拷贝到/lib后,再仔细检查一遍,一定保证没有遗漏。?

  ?模块?

  如果你有一个模块化的内核,你还得考虑需要加载的模块,它们都位于/lib/modules,你可以把不是很重要的模块放到别的盘上,当系统启动后再加载,这样会节省启动盘的空间。?

  ?打包?

  一旦你完成了上述工作,卸下虚拟盘,拷贝到一个文件中,然后压缩。?

  umount?/mnt?
  dd?if=/dev/ram0?bs=1k?|?gzip?-v9>rfs.gz?

  压缩结束后,你就拥有了一个压缩的根文件系统,不过你得检查它的大小,如果大了,你还得删除一些东西。?

  (3)?组织引导盘?

  有了根文件系统和内核之后,最后的工作就是把它们组织在一起。?

  先检查总文件的大小,如果超出1.44MB,就得考虑重新创建所需或用两张磁盘,即使用两张磁盘,你的根文件系统也得小于1.44MB。?

接着就是确定是用LILO控制启动还是直接用拷贝到盘上的内核控制启动。用LILO的好处是你能增加支持初始化硬件的参数到内核中,缺点是较复杂且占用珍贵的磁盘空间,不过我还是建议使用LILO控制系统启动。下面我就介绍用LILO的过程,直接用拷贝到盘上的内核控制启动的方法就不作叙述了。?

  用LILO控制启动首先就得写一个LILO配置文件,以下是一个最简单的配置文件,但是已经够用了。?

  boot?=/dev/fd0?
  install?=/boot/boot.b?
  map?=/boot/map?
  read-write?
  backup?=/dev/null?
  compact?
  image?=?KERNEL?
  label?=?Bootdisk?
  root?=/dev/fd0?

  参数说明见相关资料。然后把它命名为bdlilo.conf。 接下来就是创建一个内核文件系统。把一张干净的软盘插入软驱,在上面创建ext2文件系统。?

  mke2fs?-i?8192?-m?0?/dev/fd0?50?
  “-i?8192”表示每8192位创建一个信息节点。接着登录系统:?
  mount?/dev/fd0?/mnt/floppy?
  rm?-rf?/mnt/floppy/lost+found?
  mkdir?/mnt/floppy{boot,dev}?
  删去目录/?lost+found,创建两个目录/boot和/dev,再执行:?
  cp?-R?/dev/{null,fd0}?/mnt/floppy/dev?
  接着拷贝启动加载器boot.b到目录/boot中,?
  cp?/boot/boot.b?/mnt/floppy/boot?
  最后,拷贝你创建的配置文件bdlilo.conf和内核到内核文件系统的根目录下,?
  cp?bdlilo.conf?KERNEL?/mnt/floppy?

  现在,根文件系统所需的所有文件都准备就绪了。再执行下面的命令可以帮助安装LILO引导器到软盘的根文件系统上面:?

  lilo?-v?-C?bdlilo.conf?-r?/mnt?

  OK,可以运行它了,如果运行结果没有错误就表明成功,否则就应该仔细检查一下上面的设置。


【发表回复】【查看论坛原帖】【添加到收藏夹】【关闭】?

--------------------------------------------------------------------------------
jeffreyli?回复于:2004-02-09?10:52:18?
1.?软盘上安装引导器(grub)?

一般制作软盘上跑的linux引导器都使用syslinux这个工具(这个工具不支持ext2分区格式,只能支持fat分区格式),因为我对grub比较熟悉,并且我在软盘上安装grub只用了132KB空间,不是很耗磁盘空间。?
具体操作如下:?

#?mke2fs?/dev/fd0?

创建了?ext2?文件系统后,需要安装该文件系统:?

#?mount?/dev/fd0?/mnt/floppy?

现在,需要创建一些目录,并将一些关键文件(原先安装?GRUB?时已安装了这些文件)复制到软盘:?

#?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?

再有一个步骤,就能得到可用的引导盘。?

在linux?bash中,从?root?用户运行“grub”,该程序非常有趣并值得注意,因为它实际上是?GRUB?引导装入器的半功能性版本。尽管?Linux?已经启动并正在运行,您仍可以运行?GRUB?并执行某些任务,而且其界面与使用?GRUB?引导盘或将?GRUB?安装到硬盘?MBR?时看到的界面(即GRUB控制台)完全相同。?

在?grub>?提示符处,输入:?

grub>?root?(fd0)?
grub>?setup?(fd0)?
grub>?quit?

现在,引导盘完成了。?

2.?安装根文件系统:?

一套linux系统要正常启动,根文件系统要包括下列文件夹:?

/bin?/etc?/proc?/tmp?/var?/dev?/mnt?

要包括下列基本的设备文件:?

/dev/console?/dev/fd0?/dev/null?/dev/ram0?/dev/tty?/dev/tty0?

要包括下列配置文件:?

/etc/rc.d/inittab?/etc/rc.d/rc.sysinit?/etc/fstab?

要实现基本的功能,还要包括一些常用工具:?

如:sh,ls,cd,cat……?

其中,前面三个部分不要多少空间的,但是常用工具会占用很多空间,要是用原来系统中的这些命令,就是全部用静态编译,不是用动态连接库,大概有2MB~3MB,放不进软盘。网络上解决的方案是使用BusyBox工具。具体可以到官方网站www.busybox.net看看。?

下载BusyBox工具的源代码,编译:?

注意:?

(1)?译的时候要静态编译,修改?Makefile?中的?DOSTATIC?参数,从false?改为?true,这样,编译出来的代码就不要依赖glibc了。?

(2)?因为我们用的是?BusyBox?上的?init,与一般所使用的?init?不太一样,会先执行?/etc/init.d/rcS?而非?/etc/rc.d/rc.sysinit,为了做出来的?FloppyLinux?架构与?Redhat?的架构一样,所以修改了?BusyBox?中的?init.c底下是修到的部分内容∶?

#ifndef?INIT_script?
#define?INIT_SRCIPT?"/etc/rc.d/rc.sysinit"?
#endif?

具体操作如下:?

(1)?官方网站上下载BusyBox的最新版本:busybox-0.60.5.tar.gz解开,按照上面的注意点修改源代码?

(2)?运行下列命令:?

#make?
#make?install?

(3)?译好的可势行文件放在?./_install?文件夹里的。?

#cp?./_install?/tmp/floppy-linux?-r?

(4)?动建立其它的文件或文件夹:?


#cd?/tmp/floppy-linux?
#?mkdir?dev?etc?etc/rc.d?proc?mnt?tmp?var?
#?chmod?755?dev?etc?etc/rc.d?bin?mnt?tmp?var?
#?chmod?555?proc?
#?cd?dev?
#?mknod?tty?c?5?0?
#?mknod?console?c?5?1?
#?chmod?666?tty?console?
#?mknod?tty0?c?4?0?
#?chmod?666?tty0?
#?mknod?ram0?b?1?0?
#?chmod?600?ram0?
#?mknod?fd0?b?2?0?
#?chmod?600?fd0?
#?mknod?null?c?1?3?
#?chmod?666?null?


(5)?建启动配置文件:(inittab,rc.sysinit,fstab)?

initab:?
::sysinit:/etc/rc.d/rc.sysinit?
::askfirst:/bin/sh?
rc.sysinit:?
#!/bin/sh?
mount?-a?
#?chmod?755?rc.sysinit?
fstab:?
proc?/proc?proc?defaults?0?0?

(6)?作Ramdisk的镜像文件:?


#?dd?if=/dev/zero?of=/tmp/initrd?bs=1k?count=4096?
#?losetup?/dev/loop0?/tmp/initrd?
#?mke2fs?-m?0?/dev/loop0>?
#?mount?-t?ext2?/dev/loop0?/mnt?
#?cp?-r?/tmp/floppy-linux/*?/mnt?
#?umount?/mnt?
#?losetup?-d?/dev/loop0?
#?dd?if=/tmp/initrd?|?gzip?-9?>?/tmp/initrd.gz?
#?rm?-f?/tmp/initrd?
#?sync?
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条