论坛风格切换切换到宽版
  • 695阅读
  • 0回复

[问题求助]zf usb boot linux [复制链接]

上一主题 下一主题
离线phantomsr.
 
发帖
2109
C币
-271763
威望
404
贡献值
3
银元
-5
铜钱
4604
人人网人气币
0
只看楼主 正序阅读 使用道具 楼主  发表于: 2009-05-01
Linux支持

正如您可.能期望的那样,Linux.对这些盘盒的支持确实很好。任何遵守“大容量存储设备”的SBP(.Serial Bus Protocol)标准的设备都可以很容易地与Linux一起使用。

一般来说,要启用对这些设备的.支持,内核需要支持许多内容(直接编译.或通过模块)。           鲜花

对于USB和FireWire,SBP设备支持都通过SCSI仿真实现-即,设备显示给Linux就好像它们是SCSI磁盘一样.。这是在Linux.中抽象存储设备的一种通用方法(例如,IDE CD/DVD驱动器也通常使用SCS.I仿真连接)。因此.,需要下列内核支持:域名

* SCSI支持

* SCSI仿真

* SCSI磁盘支持

另外,根.据连接方法,还会需要下列支持:             电子

对于FireWire:

IEEE1394支持

OHCI1394支持

RAW1394支持

SBP-2支持

对于USB:

(主机端)USB支持

OHCI支持

UHCI支持

USB大容量存储支持

显然,您必须完全正常支持其他硬件(显卡等等..),根据您实际的硬件情况,可能还需要一些其他模块。投资

例如,我使用PCMCIA(cardbus) FireWi.re卡,.所以需要添加:           女人

PCMCIA支持

cardbus支持

安装

现在我们有.了外置设备,将开始在其中安装Linux。             电子

现在安装Linux的最容易的方法(当然是我的观点)是连接所有硬件(在这里,包含插入PCMCIA FireWire卡、.将FireWire线缆连到PCM.CIA卡和驱动器上、.打开驱动器的电源开关);然后使用您选择的发行版的安装CD来引导计算机。健康

我选择的发行版是Gentoo(请参阅参考资料获得相关链接),所以我使用最新的“Univ.ersal” x86 Live CD (20.04.1)。其他发行版所需的步骤应该会比这里讲述的步骤多或者少。..

一旦已经使用安装CD引导,如果幸运的话,它应该已经识别了您的驱动器。驱动器应该显示为/dev/sdX下的磁盘,其中X是从“a”开始的小.写字母。在我的系统中,外置驱动器被检测为/dev/sda,但是如果您有其他SCSI磁盘(模拟的SCSI磁盘),这将发生变化;在那种情况下,它可能是/dev/sdb或其他字母。如果驱动器没有被自动检测,可能需要进一步的步骤-例如,您可能必须通过引导选项来启.用Fi.reWire或PCMCIA,或者可能.必须手工加载.一些内核模块或类似的其他项(请参阅参考资料获.得故障排除指南的链接)。           鲜花

一旦驱动器已经被识别,就考虑安装的其余部分而言,它应该确实像内置硬盘驱动器一样运转;所以..您应该可以根据需要对其进行分区和像平常一样安装Linux。域名

不过,提醒一句:当.决定安装引导加载程序(通常是GRUB或LILO)的位置时一定要小心-我建议不要将其安装在Mas.ter Boot Record (MBR)(通常默认就是这样)中。而是应该安装在外置驱动.器的根分区(或引导分区,如果使用单独的引导加载程序.)中。             电子

现在我们已经在设备中安装了Linux,接着要引导Linux。从这里可以开.始有一些.技巧。.

引导

在讨论引导新的驱动器之前,需要了解一些引导加载程序理论..。           女人

引导加载程序.通常安装在计算机第一个硬盘的MBR中。调用引导加载程序时(BIOS自动.执行MBR中的代码),它通常显示可以引导的O.S的菜单。选择一个给定OS引导。服务器

关于此场景应该注意两点:

* OS选择菜单(通常)从磁盘加.载。    健康

* 要引导相关O.S,引导加.载程序需要从磁盘读取相关内核。(广告)

由于以上操作在加载OS之前发生,它意味着所有磁盘读取都必须通过BIOS调用的方式发生。这会涉及严重的问题:即为了直接引导磁盘.,您的.BIOS必须支持通过FireWire或USB连接的磁盘。这通常可以看作从这.些类型的磁盘引导的一个BIO.S选项。实际上FireWire .BIOS支持当前很少见,但USB支持正在变得相当普遍。因此,如果您在相对较新的计算机中使用USB,应该可以直接在Linux中引导驱动器。           鲜花

在外置驱动器的MBR中安装了GRUB之后,当通过US.B连.接时,我可.以直接引导该驱动器。当引导连接的磁盘时很简单地进入了BIOS设置程序。外置磁盘将显示为普通的硬盘驱动器:移动该磁盘使它在引导顺序中位于内置驱动器之前。.

我也可以在内置驱动器的MB.R中安.装引导加载程序,并使用它引导USB驱动器(这时它在GRUB中显示为hd1 in GR.UB)。如果您使用FireWire,有可能BIOS不能直接引导驱动器,将需要一些其他操作。电影

幸运地是,因为Linux的灵活性,如果您不能直接引导.(.使用PCMCIA FireWire卡,我的情况肯定是这.样!),会有相当简单的解决方案。可以从支持的设备(如软盘驱动器、CD、USB key 或主驱动器上的微小分.区)执行初始引导步骤,然后使用外置驱动器进行其他操作。电脑

构建引导映像

可以使用两种方法引导:

* 一阶段引导

内核引导、安装根文件系统,并通过调用初始化脚本(通常是./sbin/init.)继续进行初始化。.

* 两阶段(i.nitrd)引导--- 印刷

内核引导、安.装初始ram磁盘(initrd),执.行进一步的可定制初始化,然后安装根文件系统并继续进行初始化(通常也是通过调用/sbi.n/init)这两种方法都有自己的优点和缺点。           建材
一阶段引导

为.了使用一阶段引导,我们需要构建内核,.其具有安装内置根文件系统所需的所有驱动器(其他任何驱动器都.可以在正常初始化过程中,在能够从根分区加载的模块中构建)。.

如果我们要从非常小的设备引导(如软盘),最好的方法是构建的内核仅具有足够使我们可以安装根外置文件系统的内置驱动器-然后将其.他所有项构建为模.块。例如,我内置了SC.SI支持、PCMCIA支持、I.EE1394、SBP和类似支持,但是其他所有项(包括显卡支持、网络设备支持等等)都作为模块构建,这些模块存储在根分区(在外置驱动器上)中,而不是软盘上。           建材

使用简单(一阶段)引导过程,我们应该能够构建具有所需支持的内核,将其放在软盘驱动器中,.在软盘中安装引导加载程序(我使用 GRUB,但还有其他选择,如LILO),然后使用与此内核(.对于GRUB)相.似的内核引导:.

root (fd0)

kernel. (fd0)/boot/bzImage. root=/dev/sda1 (        游戏          )

这种方法基本上可以工作,但有.两个问题:.

因为SBP支持使用.SCSI仿真,为了检测磁盘和允许安装/dev/sda1,需要“重新扫描”仿真的.SCSI总线。这种扫描使用一组简单的命令执行。不过,遗憾的是,使用一阶段引导,我们不能运行任何命令,直到内核已经完成引导,而内核直到安装了根文件系统才能完成引导-典型的自相矛盾困境。令人感到高兴的是,对于导致SCSI总线在启动时被扫描的2.4内核有可用的修补程序(有关更多详细信息,请参阅参考资料)。通过应用此修补程序,我可以使外置驱动器在引导.过程中由内核自动检测,而不需要.任何重.新扫描命.令。这使我们进入了下一个问题。    外汇

内核中有定时窗口.,这意味着内核经常在其能够被正确的监测和初始化之前尝试安装根设备。对于此问题,也有可用的修补程序(请参阅参考资料获得相关链接),它只是使内核.在启动时等待很短的时间,并使其在安装根文件系统失败时重试.(为外置驱动器提供时间识别)。    健康

通过应用这两个修补程序,我可以成功地在可引导软盘上构建内核,其将引导,然后使用.外置FireWire驱动器.作为根。<性病>

这种方法的主要问题是需要我们给内核源码打补丁-这最多是.一.件痛苦之事(当发行新.的内核版本时),严重时会是个大问题(如果没有维护补丁程序与内核发生的其他更改保持一致的话)。域名

您可能已经想到如果我们的BIOS支.持USB或FireWire.且我们直接引导,我们就可以避免这两个问题。不幸的是,情况并不是这样:虽然此方.法在引导过程中使用BIOS调用来访问磁盘,一旦内核开始初始化,将不再使用BIOS.,而是使用内核驱动器访问磁盘-这样就会遇到相同的问题。          婚庆

两阶段引导

到了内核版本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
R.EAL_ROOT=/dev/sda1投资
# moun.t the /.proc filesystem
m.ount -t proc none /proc             电子

#for .scsi-emulation.
# modp.robe sd_mod    健康

#for pcmcia
# .modprobe pcmcia_core外贸

#for FireWire
# modprobe ieee1.394           建材
# modp.robe ohci1394.
# modprobe raw13.94服务器
# mod.probe sbp2教育

#for USB
# modpr.obe usbcore    健康
# modprobe ohci-h.cd虚拟主机
# modprobe .uhci-hcd           鲜花
# modpro.be usb-storage学习

# loop rescann.ing the scsi .bus + rerunning devfsd虚拟主机
retries=5
i=1
un.til [ -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_RO.OT) not found, r.etrying ($i)"    外汇
sleep 1
echo. "scsi add-single-device 0 0 0" >. /proc/scsi/scsi              乙肝
echo "scsi add-single-device 1 0 0" > /pr.oc/scsi/scs.i外贸
echo "scsi add-sin.gle-device 2 0 0". > /proc/scsi/scsi           建材
/bin/devfsd /dev -n.p健康
i=$((i+1))
done

#umount /p.roc as it will be remounted by the normal init. process[成人用品]
umount /proc

#now. we si.mply exit, and the normal boot process should continue.
exit 0




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

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

接着把内核(.bzImage)和initrd像(initrd..gz)复制到(bootable,ext3)软盘中。[成人用品]

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

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

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

精彩

感动

搞笑

开心

愤怒

无聊

灌水
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个