桑巴抽签等待。

这是一篇来自IBM developerworks的非常好的文章,可以很清晰的解释如何启动FireWire和USB设备的Linux操作系统的原理。

希望对有兴趣在外接设备上安装Linux操作系统的人有所帮助。

原始网址/开发者或...l-fireboot.html

从FireWire设备启动Linux

在可移动驱动器上安装Linux操作系统。

难度:中等

马丁Honeyford(martynh@uk.ibm.com)软件工程师,IBM英国实验室。

宣克达·(austin.dada@gmail.com)译webzi@linuxsir。

2004年7月15日

2005年7月26日开始翻译,7月28日完成。

翻译经验不多。如果有任何问题,请发电子邮件给我们。

使用外部驱动器是一种很好的方式,可以为您的旧硬件带来新的生命,并让您在无法(或不想)更换内置硬盘的计算机上使用Linux系统。

假设您想在双引导环境中使用Linux,但是您的计算机硬盘没有任何可用空间。一种解决方案是使用像Knoppix这样的“live”Linux发行版,它可以直接从CD启动。对于偶尔使用,这是一个可行的方法,但它有几个缺点:

*您仍然需要一些固定的文件存储。如果只操作少量文件,1.44MB的磁盘可以,或者u盘适合中等文件,但这些都不太理想。

*在使用LiveCD时,最困难、最糟糕、最不可能的事情就是安装自己的应用程序或者定制现有的程序。

*使用LiveCD的性能牺牲在所有设备测试开始时尤为明显,在使用中也时有发生(所有文件从CD加载通常比从硬盘加载慢)。

事实上,还有其他选择。例如,您可以购买额外的内置驱动器,并在此安装Linux操作系统。但是通常情况下,你可能没有多余的扩张土堆。(这种情况在笔记本上特别容易发生,通常他们只允许一个内置硬盘。)

或者,您可以使用更大的硬盘来代替当前的硬盘,以获得额外的空间来安装Linux操作系统。然而,这确实是一个耗时的解决方案,需要你在新硬盘上重新安装现有的操作系统,重新安装和配置你的所有应用程序,并恢复所有数据。

比较好的解决办法是买个外置硬盘,安装Linux操作系统。这样就可以在不涉及现有软硬件的情况下使用Linux系统,只需要简单的连接外部驱动即可。

可选可移动设备

可用于安装Linux操作系统的设备包括磁盘驱动器、USB闪存设备、通过USB/ Firewire连接的硬盘等。

linux安装在小容量的设备上是可行的,比如1.44MB的磁盘或者32MB的u盘。它们通常(必须)为特定目的定制,并采用一个简化的发行版本,例如,以节省中断的安装过程。

外置硬盘为使用通用linux系统提供了最大的灵活性,同时也带来了合理的成本。

许多不同的制造商提供多种不同容量的外部驱动器。(迈拓、西西数据等。).这些驱动器还将包含一个外盒,用于固定标准的3-1/2英寸或2-1/2英寸IDE硬盘。这些驱动器然后通过USB或IEEE1394 (Firewire)连接到计算机。

USB受两大版本影响,1.1和2.0的速度。1.1版本为12 Mbit/ s(每秒1Mbit),而2.0版本传输速度最高支持480 Mbit/s..大部分兼容2.0的驱动器也是向后兼容1.1的,所以一般建议尽量不要使用1.1接口,除非没有其他选择(因为其速度低不适合这种环境)。)

FireWire标准还定义了几种不同的速度。其实大多数人所指的firewire是“FireWire400”标准,支持最大400 Mbit/s的传输速度。

USB2.0和FireWire在速度上并驾齐驱:虽然USB 2.0的传输速度相对较高,但实际上由于协议不同,两者的速度非常接近。如果你的电脑有两种接口,最好用USB而不是firewire(原因我后面会解释),但如果只有firewire接口,你当然选择它。为了获得最大的灵活性,您可以从众多支持USB 2.0和FireWire的驱动程序中选择一个。就像我将在本文后面使用的那样。)

对于没有必要接口的人来说,PCI(台式机用)和PCMCIA(笔记本电脑用),FireWire和USB 2.0扩展卡现在都不算太贵:比如我在文章后面会提到,PCMCIA FireWire扩展卡大概10英镑(不到20美元)。

为了达到本文的目的,我购买了一个5-1/4英寸外接式硬盘盒。这是一个非常灵活的硬盘盒,不提供驱动器,可以固定任何标准的ide设备,包括3-1/2英寸驱动器和5-1/4英寸像CD-RW/DVD-RW这样的IDE设备。硬盘盒既有USB 2.0又有firewire接口。

为了将硬盘盒连接到我的IBM Thinkpad T30笔记本电脑上,我还买了一个PCMCIA FireWire适配卡。(因为内置USB接口只支持USB 1.1)

硬盘盒子和firewire适配器相对便宜。(分别约50斤和10斤。)

测试时,我在硬盘盒里放了一个闲置的13 GB 3-1/2寸IDE硬盘——真实情况,我会买一个更大容量的硬盘,现在再买一个硬盘还挺便宜的(每个50斤左右!)

Linux支持

如你所料,linux真的非常支持这些硬盘盒子。任何符合SBP(串行总线协议)标准的大型存储设备在linux中使用起来都非常简单。

一般来说,使您能够支持这些设备将需要在您的核心中支持某些选项(直接编译或传递模块)。)

对于USB和firewire,SBP设备是通过SCSI仿真实现的——也就是说,Linux将它们视为SCSI硬盘。这是在Linux世界中使用存储设备的一种常见方式。(例如,IDE CD/DVD设备通常通过SCSI仿真连接)。出于上述原因,内核需要支持以下选项:

* SCSI支持

* SCSI仿真

* SCSI磁盘支持

此外,不同的连接方法需要以下内核支持:

*对于火线:

* IEEE1394支持

* OHCI1394支持

* RAW1394支持

* SBP新协议支持

*对于USB:

*(主机端)USB支持

* OHCI支持

* UHCI支持

* USB大容量存储支持

显然,你还必须定期编译支持其他硬件(如显卡等。),并且您可能需要一些额外的模块,这取决于您的特定硬件。

例如,我正在使用PCMCIA(cardbus) Firewire适配器,所以我需要添加:

* PCMCIA支持

* cardbus支持

固定

现在我们有了一个完美的外部驱动器,我们将开始在上面安装Linux。

目前安装linux最简单的方法(当然只是个人观点)是连接你所有的硬件;(在我的例子中,插入FireWire适配器,连接接线盒驱动程序,然后打开驱动程序的电源)然后从您选择的发行版安装CD启动您的计算机。

我使用的发行版是Gentoo(参见参考资料链接),所以我使用最新的“通用”x86 LiveCD。(2004.1)其他分布的必要步骤大致类似。

一旦你开始使用安装光盘,让他认识你的驱动器有点运气。该磁盘应该出现在/dev/sdx中,其中x是以“a”开头的小写字母。在我的系统上,外置硬盘被视为/dev/sda,但如果你有其他SCSI硬盘,这个数字会改变;在这种情况下,它可能是/dev/sdb或其他字母。如果无法自动检测到您的驱动器,您需要采取进一步的措施——例如,您可能需要打开启动选项来使用FireWire或PCMCIA接口,或者您可能需要手动加载一些内核模块,或者其他选项。(详细资源请参考故障发现和维护指南链接。)

一旦驱动器被识别,安装过程就像内置硬盘一样工作。然后,您可以对其进行分区,并以正常方式安装linux。

有一个重要的警告。在选择安装引导加载程序(通常是GRUB和LILO)的位置时要小心——我建议您不要将其安装在主引导记录(MBR)(通常是默认值)中,而是安装在外部驱动器的根分区(或者/boot分区,如果您分开一个的话)。

既然我们已经在这个设备上安装了Linux,我们想从上面启动它。事情变得有点复杂了。

开始

在我讨论如何在新的驱动器上启动之前,我想解释一些关于boot loader的小知识。

引导加载程序通常安装在计算机第一个硬盘的MBR上。当boot loader被调用时(BIOS自动运行MBR中的代码),通常会显示一个菜单来启动操作系统。以便选择给定的操作系统来启动计算机。

本章应注意两个细节:

*操作系统选择菜单(通常)是从磁盘加载的。

*为了启动相关的操作系统,boot loader需要从磁盘中读取相关的内核。

在加载操作系统之前,已经执行了上述步骤,这意味着所有的磁盘读取都是在BIOS调用时进行的。这是一个必要的前提,就是为了直接引导磁盘,你的BIOS必须支持通过firewire或者USB连接的磁盘。您通常可以在BIOS中看到从这些设备引导的选项。Firewire BIOS支持现在真的很少了,但是USB支持变得相当普遍。因此,如果您在相对较新的计算机上使用USB接口,您应该能够将驱动程序直接引导到Linux。

当通过USB连接时,我可以在安装了外置驱动的MBR的幼虫后直接启动。当使用连接的磁盘启动时,只需进入BIOS设备实用程序。外部磁盘将像普通硬盘一样出现:移动它,使其在引导顺序中位于内部驱动器之前。

我也可以在内置硬盘的MBR上安装一个引导加载程序,用它来启动一个USB硬盘(GRUB里叫hd1)。如果你用的是FireWire,有可能你的BIOS会无法直接引导硬盘,你需要多一点步骤。

好在由于Linux的多样性,这个很好解决,如果不能直接开机,(我就是这种情况,用的是PCMCIA转接卡!您可以从支持的设备运行初始启动步骤,如软盘驱动器、CD-ROM、USB棒或主硬盘上的小分区,然后使用外部驱动器继续其他步骤。

创建启动映像包

我们有两种方式开始:

*单订单启动

内核启动,挂载根分区文件系统,然后调用初始化教材继续初始化(通常是/sbin/init)。

*两步启动的开始(initrd)

内核启动,挂载一个初始ram磁盘(initrd),进一步运行定制的初始化,然后挂载根分区文件系统继续初始化(类似地,通常调用/sbin/init)。

每种方法都有自己的优缺点。

单步启动

为了使用单级引导,我们需要构建一个包含挂载根分区文件系统所需的所有驱动程序的内核。任何其他驱动程序都可以被编译成一个模块,并在加载根分区时正常初始化。)

如果我们试图从一个非常小的设备(如软盘)启动,最好的方法是创建一个合适的内核,编译安装根外部分区系统所需的所有驱动程序,并编译其他模块。比如我的内核编译有SCSI支持,PCMCIA支持,IEEE 1394,SBP,以及其他类似的支持,但是其他(包括显卡支持,网络设备支持等。)被编译成模块并存储在根分区(在外部驱动器上)而不是软盘上。

这种方法的主要问题是,我们需要修补内核源代码——这是最糟糕的痛苦(当一个新的内核发布时),而真正的问题是,如果补丁没有得到维护,它就跟不上内核的变化。

你可能会想,如果电脑BIOS支持USB和firewire直接启动,我们就可以避免以上两个问题了。可惜事实并非如此:这种方法在启动时使用BIOS调用磁盘,一旦内核开始初始化,BIOS就失去了作用,使用内核驱动程序调用磁盘——所以你还是会遇到同样的问题。

二级启动

内核2.0.X版本给内核增加了一个有趣的功能——利用“初始RAM磁盘”(或initrd)实现二阶启动。

简而言之,内核总是启动的;挂载在内存中创建的迷你根分区文件系统,而不是挂载“真正的”根分区系统。在挂载“真正的”根分区系统之前,任何命令都在这个初始环境中执行,直到我们切换到真正的根分区文件系统并销毁初始RAM磁盘。

这在各种环境中都非常有用,但我们的目标只是使用我们的小型环境来重新扫描SCSI总线,等待外部驱动器识别它,然后使用它切换到我们的真正根目录并继续引导。

使用这种方法,我们需要创建两个文件,一个内核和一个初始映像文件。

内核只是一个内置的引导映像(initrd ),支持常规内核。initrd映像是一个循环文件系统映像,包括我们的迷你根分区系统。(图像可以选择性地使用gzip压缩来减小其大小)。

您可以在参考资料部分找到更多关于如何创建和定制您自己的初始图像的信息。

在镜像文件中,有一个linuxrc文件。加载图像时,文件会自动运行,所以请确保它有运行权限!为了实现我们的目标,linuxrc文件非常简单:

枚举1。initrd linuxrc

#!/bin/sh

REAL_ROOT=/dev/sda1

#挂载/proc文件系统

mount -t进程无/进程

#用于scsi模拟(SCSI模拟)

# modprobe sd_mod

#用于PCMCIA (PCMCIA卡)

# modprobe pcmcia_core

#针对FireWire

# modprobe ieee1394

# modprobe ohci1394

# modprobe raw1394

# modprobe sbp2

#用于USB(通用串行总线)

# modprobe USB核心

# modprobe ohci-hcd

# modprobe uhci-hcd

# modprobe usb存储

#循环重新扫描scsi总线+重新运行devfsd

重试次数=5

i=1

直到[ -e $REAL_ROOT ]

如果[$ I-gt $重试次数]

然后

echo“无法挂载真正的根($REAL_ROOT) -放弃!”

/bin/ash

出口

船方不负担装货费用

echo“未找到真正的根($REAL_ROOT),正在重试($i)”

睡眠1

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

echo " SCSI add-single-device 100 " >/proc/scsi/scsi

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

/bin/devfsd /dev -np

我=$((i+1))

完成的

#umount /proc,因为它将由正常的init进程重新装载

当/proc分区将重新挂载常规的INIT进程时,卸载它。

卸载/处理

#现在我们简单地退出,正常的引导过程应该继续

现在我们可以退出了,正常的启动过程将继续。

出口0

我们正在加载适当的模块来支持外部驱动器:请根据需要查看相应的行。我把所有必要的支持都编译进了内核,所以我不需要模块。然后循环扫描SCSI总线(响应/proc虚拟文件系统下一个特殊文件的命令,调用devfsd程序),直到根分区设备出现(在我的例子中是/dev/sda1)。以我的情况来说,接入的FireWire模拟SCSI总线是1000,但是不影响尝试其他一些总线——如果你知道会用哪一个,可以把这个教材剪下来。此外,如果您有其他SCSI设备(或模拟SCSI设备),驱动器可能会有不同的盘符。(例如/dev/sdb1)如果您不使用外部驱动器上的第一个分区,您将需要使用不同的编号。(例如/dev/sda2)

现在我们需要做的就是将相关文件复制到initrd映像中。(您可以使用mount -o loop命令挂载未压缩的映像。)特别是,我们需要确保我们有linuxrc文件、所有使用的命令和依赖于它的库。这个(未安装的)映像可以有可选的折叠压缩。

将内核(bzImage)和initrd映像(initrd.gz)复制到磁盘。

最后一步是在磁盘上安装一个引导加载程序,并使用以下选项启动内核:kernel image root =/dev/sda 1 initrd = initrd.gz。。

现在,您应该能够使用该磁盘进行引导了:它将从软盘加载内核,将initrd映像加载到内存中,然后从那里继续正常的引导。之后,可以移除磁盘。

如果磁盘不合适(比如电脑没有软驱),可以使用BIOS中任何可以用于启动的设备。我个人是用一个小小的32MB的u盘来达到这个目的。

参考资料:

http://www.linuxsir.org/bbs/showthread.php? t = 211021