查看: 3653|回复: 0

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

[复制链接]

该用户从未签到

发表于 2007-2-5 00:26:39 | 显示全部楼层 |阅读模式
分享到:
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 
回复

使用道具 举报

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

本版积分规则

关闭

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



手机版|小黑屋|与非网

GMT+8, 2024-11-24 18:07 , Processed in 0.110262 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.