Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->嵌入式系统 ->正文

教你怎么样从FireWire 设备引导Linux

来源:linux.chinaunix.net 作者:SSL  时间:2007-04-22 点击: [收藏] [投稿]

  两阶段引导

  到了内核版本 2.0.X,向 Linux 内核添加了一项引人注意的能力 —— 使用“initial RAM disk”(或 initrd)提供两阶段引导过程。

  简而言之,内核像平常一样引导;但不安装“真实的”根文件系统,而是在 RAM 中创建微型根文件系统并安装该系统。在安装真实的根、切换为使用真实的根并销毁 initial RAM disk 之前,任何步骤都可以在此初始环境中执行。

  这在各种环境中都有用,但是为了便于说明,我们将仅使用我们的迷你环境重新扫描 SCSI 总线,等待外置磁盘被识别,然后切换为使用该磁盘作为真实的根继续引导。

  为了使用这种方法,我们需要创建两项,内核和 initrd 映像。

  内核就是具有内置 initrd 支持的普通内核。initrd 映像是包含我们的迷你根文件系统的回送文件系统映像(此映像可以使用 gzip 进行压缩以减少其大小)。

  有关创建或定制自己的 initrd 映像的详细信息,可以查看参考资料部分。

  在 initrd 映像中,有一个名为 linuxrc 的文件。当加载 initrd 时会执行此文件,所以确保其具有执行权限!我们为了进行说明,所以 linuxrc 非常简单:

  清单1. initrd linuxrc

  #!/bin/sh REAL_ROOT=/dev/sda1 # mount the /proc filesystem

  mount -t proc none /proc #for scsi-emulation # modprobe sd_mod #for pcmcia

  # modprobe pcmcia_core #for FireWire # modprobe ieee1394 # modprobe ohci1394

  # modprobe raw1394 # modprobe sbp2 #for USB # modprobe usbcore # modprobe

  ohci-hcd # modprobe uhci-hcd# modprobe usb-storage # loop rescanning the

  scsi bus + rerunning devfsd retries=5 i=1 until [ -e $REAL_ROOT ] do if

  [ $i -gt $retries ] then echo "Unable to mount real root ($REAL_ROOT)

  - Giving up!" /bin/ash exit fi echo "Real root ($REAL_ROOT) not

  found, retrying ($i)" sleep 1 echo "scsi addsingle-device 0 0 0" > /proc/scsi

  /scsi echo "scsi add-single-device 1 0 0"> /proc/scsi/scsi echo "scsi add-

  single-device 2 0"> /proc/scsi/scsi /bin/devfsd /dev -np i=$((i+1))

  done #umount /proc asit will be remounted by the normal init process umount

  /proc #now we simply exit, and the normal boot process should continue

  exit 0

  我们做的所有操作都是加载适当的模块来支持外置驱动器:它们应该根据需要被解注。(我在内核中构建了所有必需的支持,因此不需要任何模块。)然后我们进行循环,重新扫描 SCSI 总线(通过将命令回送到 /proc pseudo-filesystem 中的特殊文件,并调用 devfsd),直到出现根设备(我的例子中为 /dev/sda1)。在我的例子中,讨论的仿真 FireWire SCSI 总线是 1 0 0,不过也可以尝试其他的,而不会有任何负面影响 —— 如果您知道要使用的总线,可以裁剪脚本。同样,如果您有其他 SCSI 设备(或仿真 SCSI 设备),驱动器可能会有不同的字母(例如,/dev/sdb1)。如果不使用外置驱动器的第一个分区,则需要使用不同的编号(例如,/dev/sda2)。

  现在所需要做的就是将相关文件复制到 initrd 映像中(可以使用 mount -o loop 命令安装未压缩的映像)。特别地,需要确保具有 linuxrc 文件、在其中使用的所有命令和那些命令依靠的所有库。然后,(未装载的)映像可以进行压缩。

  接着把内核(bzImage)和 initrd 映像(initrd.gz)复制到(bootable, ext3)软盘中。

  最后一步是在软盘中安装引导加载程序,并使用下列选项引导内核:kernel bzImage root=/dev/sda1 initrd=initrd.gz。

  现在应该可以使用软盘进行引导:它将从软盘加载内核,将 initrd 映像加载到 RAM 中,等待识别根设备,然后像平常一样从那里继续引导。从此以后,可以移除软盘。

  如果软盘不适合(例如,如果计算机没有软盘驱动器),则可以使用能够通过 BIOS 引导的任何设备。就个人而言,为了写作本文,我使用小的 32Mb USB 盘。或者,如果您不介意改变内置硬盘驱动器的话,为了更便于引导,可以在其中创建小的分区。



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:嵌入式程序员应知道的几个基本问题(2)   下一篇:怎么样从FireWire 设备引导Linux

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号