扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在讨论引导新的驱动器之前,需要了解一些引导加载程序理论。
引导加载程序通常安装在计算机第一个硬盘的 MBR 中。调用引导加载程序时(BIOS 自动执行 MBR 中的代码),它通常显示可以引导的 OS 的菜单。选择一个给定 OS 引导。
关于此场景应该注意两点:
- OS 选择菜单(通常)从磁盘加载。
- 要引导相关 OS,引导加载程序需要从磁盘读取相关内核。
由于以上操作在加载 OS 之前发生,它意味着所有磁盘读取都必须通过 BIOS 调用的方式发生。这会涉及严重的问题:即为了直接引导磁盘,您的 BIOS 必须支持通过 FireWire 或 USB 连接的磁盘。这通常可以看作从这些类型的磁盘引导的一个 BIOS 选项。实际上 FireWire BIOS 支持当前很少见,但 USB 支持正在变得相当普遍。因此,如果您在相对较新的计算机中使用 USB,应该可以直接在 Linux 中引导驱动器。
在外置驱动器的 MBR 中安装了 GRUB 之后,当通过 USB 连接时,我可以直接引导该驱动器。当引导连接的磁盘时很简单地进入了 BIOS 设置程序。外置磁盘将显示为普通的硬盘驱动器:移动该磁盘使它在引导顺序中位于内置驱动器之前。
我也可以在内置驱动器的 MBR 中安装引导加载程序,并使用它引导 USB 驱动器(这时它在 GRUB 中显示为 hd1 in GRUB)。如果您使用 FireWire,有可能 BIOS 不能直接引导驱动器,将需要一些其他操作。
幸运地是,因为 Linux 的灵活性,如果您不能直接引导(使用 PCMCIA FireWire 卡,我的情况肯定是这样!),会有相当简单的解决方案。可以从支持的设备(如软盘驱动器、CD、USB key 或主驱动器上的微小分区)执行初始引导步骤,然后使用外置驱动器进行其他操作。
构建引导映像
可以使用两种方法引导:
一阶段引导
内核引导、安装根文件系统,并通过调用初始化脚本(通常是 /sbin/init)继续进行初始化。
两阶段(initrd)引导
内核引导、安装初始 ram 磁盘(initrd),执行进一步的可定制初始化,然后安装根文件系统并继续进行初始化(通常也是通过调用 /sbin/init)
这两种方法都有自己的优点和缺点。
一阶段引导
为了使用一阶段引导,我们需要构建内核,其具有安装内置根文件系统所需的所有驱动器(其他任何驱动器都可以在正常初始化过程中,在能够从根分区加载的模块中构建)。
如果我们要从非常小的设备引导(如软盘),最好的方法是构建的内核仅具有足够使我们可以安装根外置文件系统的内置驱动器 —— 然后将其他所有项构建为模块。例如,我内置了 SCSI 支持、PCMCIA 支持、IEE1394、SBP 和类似支持,但是其他所有项(包括显卡支持、网络设备支持等等)都作为模块构建,这些模块存储在根分区(在外置驱动器上)中,而不是软盘上。
使用简单(一阶段)引导过程,我们应该能够构建具有所需支持的内核,将其放在软盘驱动器中,在软盘中安装引导加载程序(我使用 GRUB,但还有其他选择,如 LILO),然后使用与此内核(对于 GRUB)相似的内核引导:
root (fd0)
kernel (fd0)/boot/bzImage root=/dev/sda1
这种方法基本上可以工作,但有两个问题:
1. 因为 SBP 支持使用 SCSI 仿真,为了检测磁盘和允许安装 /dev/sda1,需要“重新扫描”仿真的 SCSI 总线。这种扫描使用一组简单的命令执行。不过,遗憾的是,使用一阶段引导,我们不能运行任何命令,直到内核已经完成引导,而内核直到安装了根文件系统才能完成引导 —— 典型的自相矛盾困境。令人感到高兴的是,对于导致 SCSI 总线在启动时被扫描的 2.4 内核有可用的修补程序(有关更多详细信息,请参阅参考资料)。通过应用此修补程序,我可以使外置驱动器在引导过程中由内核自动检测,而不需要任何重新扫描命令。这使我们进入了下一个问题。
2. 内核中有定时窗口,这意味着内核经常在其能够被正确的监测和初始化之前尝试安装根设备。对于此问题,也有可用的修补程序(请参阅参考资料获得相关链接),它只是使内核在启动时等待很短的时间,并使其在安装根文件系统失败时重试(为外置驱动器提供时间识别)。
通过应用这两个修补程序,我可以成功地在可引导软盘上构建内核,其将引导,然后使用外置 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 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 盘。或者,如果您不介意改变内置硬盘驱动器的话,为了更便于引导,可以在其中创建小的分区。
婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋婵愭綗闁逞屽墮閸婂湱绮嬮幒鏂哄亾閿濆簼绨介柛鏃撶畱椤啴濡堕崱妤€娼戦梺绋款儐閹瑰洭寮诲☉銏″亜闂佸灝顑呮禒鎾⒑缁洘鏉归柛瀣尭椤啴濡堕崱妤€娼戦梺绋款儐閹稿墽妲愰幘鎰佸悑闁告粌鍟抽崥顐⑽旈悩闈涗粶闁哥噥鍋夐悘鎺楁煟閻樺弶绌块悘蹇旂懅缁綁鎮欓悜妯锋嫼閻熸粎澧楃敮鎺撶娴煎瓨鐓曢柟鎯ь嚟濞叉挳鏌熼钘夊姢閻撱倖銇勮箛鎾村櫝闁归攱妞藉濠氬磼濮樺崬顤€闂佸憡顨嗗ú鐔风暦婵傜ǹ唯闁靛/鍕弰濠电姷鏁告慨鎾晝閵堝洠鍋撳鐓庡籍鐎规洩缍€缁犳盯寮崒婊呮濠电姷鏁告慨鎾磹缂佹ɑ娅犳繛鎴欏灪閻撴洟鎮楅敐鍐ㄥ濠碘€茬矙閺屾洟宕惰椤忣厾鈧鍠曠划娆愪繆濮濆矈妲归梺閫炲苯澧悽顖ょ節瀵鎮㈤崗鐓庣檮婵犮垼娉涢敃銉モ枔婵犳碍鈷戦柛婵嗗閻忛亶鏌涢悩宕囧⒌妤犵偛鍟オ浼村醇濠靛牆骞愰梻浣呵归張顒傜矙閹惧箍浜归悗锝庡枟閻撶喖骞栧ǎ顒€鈧倕岣块幇顓犵闁告瑥顥㈤鍫熷仼婵犻潧鐗忛惌娆撴偣閹帒濡芥繛鍫ョ畺濮婃椽宕滈幓鎺嶇凹濠电偛寮堕悧鐘诲箖閳ユ枼妲堥柕蹇ョ磿閸橀亶鏌h箛鏇炰粶濠⒀傜矙閹瞼鈧綆鍋嗙粻楣冩煕椤愩倕鏋戦柛濠冨姈閹便劍绻濋崟顓炵闂佺懓鍢查幊鎰垝閻㈢鍋撻敐搴濈凹闁伙絼鍗冲缁樻媴鐟欏嫬浠╅梺鍛婃煥椤戝鐣烽敓鐘茬闁肩⒈鍓氬▓楣冩⒑闂堟稓绠為柛濠冩礋瀹曟﹢鍩€椤掆偓椤啴濡堕崱妤€顫囬梺绋块瀹曨剟鎯冮鍕拻闁稿本鐟ч崝宥夋倵缁楁稑鎳愰惌娆撴煙鐎电ǹ袥闁稿鎸搁~婵嬫偂鎼达紕鐫勯柣搴ゎ潐濞叉垿宕¢崘鑼殾闁告鍊i悢鍏尖拹闁归偊鍠氬▔鍧楁⒒閸屾瑧绐旀繛浣冲洦鍋嬮柛鈩冪☉缁犵娀骞栧ǎ顒€鐏柛娆忕箲閵囧嫰骞掗崱妞惧闂備礁鐤囬~澶愬垂閸ф鏄ラ柕澶嗘櫅楠炪垺淇婇悙鎻掆挃闁告垼顫夌换婵嬫偨闂堟刀鐐烘煕閵婏附銇濋柡浣割儔閺屟囨嚒閵堝懍娌繛锝呮搐閿曨亝淇婇崼鏇炲窛妞ゆ柨鍚嬮锟犳⒒娴e懙褰掝敄閸涙潙纾归柛锔诲幗瀹曞弶绻涢幋娆忕仼妤犵偑鍨烘穱濠囶敍濠垫劕娈紒鐐緲缁夊綊寮婚敐鍡樺劅闁靛骏绲介ˉ婵嗩渻閵堝繐顩柡浣筋嚙椤曪絿鎷犲顔兼倯闂佸壊鍋掗崑鍛搭敁閸ヮ剚鈷掑ù锝呮啞閸熺偤鏌熼幖浣虹暫鐎规洜澧楅幆鏃堚€﹂幋鐐存珨闂備焦瀵х换鍌炈囨禒瀣瀬闁糕剝銇滈埀顒佸笒椤繈顢楁繝鍌氼潬闂備焦妞块崢浠嬨€冮崱娆愬床婵炴垯鍨圭粻濠氭煛婢跺鐏╅柛鏂惧嵆濮婅櫣绮欏▎鎯у壉闂佸湱鎳撳ú顓烆嚕婵犳碍鏅查柛娑变簼椤秴鈹戦悙鍙夘棡闁告梹娲滄竟鏇㈠箮閼恒儮鎷洪梺鍛婄箓鐎氼厼锕㈤幍顔剧<閻庯綆鍋勯悘鎾煕閳哄啫浠辨鐐差儔閺佸啴鍩€椤掆偓椤斿繐鈹戦崶銉ょ盎闂佸搫娲ㄩ崑鐐哄闯濞差亝鐓冮悹鍥嚋閸旂喓绱掓潏銊﹀磳鐎规洘甯掗埢搴ㄥ箣濠靛棭鐎村┑锛勫亼閸婃垿宕濆畝鍕疇婵せ鍋撴鐐叉閻f繈宕熼銈忕床闂備胶绮崝娆忈缚瑜忕划濠囨晝閸屾稓鍘甸梺绋跨箺閸嬫劙寮冲鈧弻娑㈠棘鐠恒劎鍔梺璇″枤閸嬨倕鐣疯ぐ鎺濇晝闁绘ǹ浜惄搴ㄦ⒒娴e憡璐¢柛搴涘€濆畷褰掓偨閸撳弶鏅滈梺鍐叉惈閹冲繘宕愰崹顐e弿婵妫楁晶缁樹繆閹绘帞绉洪柡灞炬礋瀹曟儼顦叉い蹇e幘閳ь剚顔栭崰鏇犲垝濞嗘劒绻嗘慨婵嗙焾濡插ジ姊洪棃鈺冪シ闁稿骸纾Σ鎰板箻鐎涙ê顎撶紓浣圭☉椤戝懎鈻撻鐐╂斀闁宠棄妫楁禍婵堢磼鐠囪尙澧曟い鏇稻缁绘繂顫濋鐐扮盎缂備胶鍋撴刊鑺ャ仈閹间礁鐤鹃柨婵嗩槹閸嬧剝绻濇繝鍌氭殶閺佸牓姊虹拠鈥虫灍闁挎洏鍨介獮濠囨偐濞茬粯鏅㈤梺绋挎湰缁絿妲愰弻銉︹拺闁告繂瀚峰Σ鎼佹煟濡も偓鐎氭澘鐣峰┑鍥ㄥ劅闁挎繂娲g粭澶愭⒑缂佹ê濮夐柛搴涘€濋幃鈥斥槈閵忊€斥偓鍫曟煟閹邦垱纭剧悮姘舵⒑閸濄儱校闁挎洏鍨藉濠氬焺閸愨晛顎撻梺鑽ゅ枑濠㈡﹢锝為幒妤佸€甸悷娆忓缁€鍫ユ煕閻樺磭澧甸柕鍡曠椤粓鍩€椤掑嫬绠栭柍鍝勬噺閹偞銇勯幇鈺佲偓婵嬪箯婵犳碍鈷掗柛灞捐壘閳ь剙鍢查湁闁搞儜鍛闂佸壊鐓堥崑鍛村矗韫囨稒鐓欓柟顖涙緲琚氶梺鎶芥敱濮婂鍩€椤掆偓缁犲秹宕曢柆宓ュ洭顢涢悙鎻掔€梺绋跨灱閸嬬偤鎮¢姀鈥茬箚妞ゆ牗绮岄惃鎴犵磼鏉堛劌鍝洪柡灞诲妼閳规垿宕遍埡鍌傦妇绱撴担鎻掍壕闁诲函缍嗛崑浣圭濠婂牊鐓涚€广儱鍟俊鍧楁煃閽樺妲圭紒缁樼洴瀹曞ジ鎮㈤搹鍦帨婵犳鍠栭敃銊モ枍閿濆應妲堥柣銏⑶瑰婵囥亜閺傛儳瀚庨柍褜鍓氶崝鏇⑩€旈崘顔嘉ч幖绮光偓鑼嚬婵犵數鍋犵亸娆撳窗閺嵮呮殾婵炲樊浜滈悞鍨亜閹哄秹妾峰ù婊勭矒閺岀喖宕崟顒夋婵炲瓨绮撶粻鏍ь潖濞差亜绠伴幖娣灮閳规稒绻濈喊妯峰亾閾忣偅鎮欓柛妤呬憾閺岀喖鎮ч崼鐔哄嚒缂備緡鍋勭粔褰掑蓟濞戙埄鏁冮柨婵嗘川閻g厧顪冮妶鍡樺鞍婵$偠妫勯~蹇涙惞閸︻厾锛滃┑鈽嗗灠閹碱偊锝炲畝鍕€垫繛鍫濈仢濞呮﹢鏌涢幘瀵告噯闁诲繐鍟村娲川婵犱胶绻侀梺鍝ュУ瀹€绋跨暦閵忋倕绠瑰ù锝呭帨閹锋椽姊洪崨濠冨鞍鐟滄澘鍟粋宥嗙鐎n偆鍘遍柣搴秵娴滄粓顢旈銏$厵妞ゆ梹鏋婚懓鍧楁煛娴gǹ鏆g€规洘甯掗埥澶婎潩椤掆偓缁犵偤姊绘担绛嬪殭闁告垹鏅槐鐐哄幢濞戞ḿ锛涢梺绯曞墲钃辨繛鍛У閵囧嫰骞掗幋婵冨亾閼姐倕顥氬┑鍌氭啞閻撴洟鎮橀悙鎻掆挃闁宠棄顦辩槐鎺戭渻閿曗偓濞诧箓鎮″▎鎾寸厽闁绘柨鎲$欢鍙夈亜韫囷絽寮柡宀€鍠栭幃鈩冩償閵忥絿顢呴梻浣烘嚀瀵爼骞愰崘鑼殾闁绘柨鍚嬮ˉ鍫熺箾閹寸偟鎳勯柣婵撶節濮婂宕掑顑藉亾閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋為悧鐘汇€侀弴銏犖ч柛灞剧煯婢规洖鈹戦鐭亜鐣烽鍕偍閻庣數纭堕崑鎾舵喆閸曨剛顦ョ紓鍌氱Т閿曨亜顕f繝姘耿婵°倕锕ら幃鎴︽⒑閸涘﹣绶遍柛銊ф櫕濡叉劙鏌嗗鍡欏幗闁硅壈鎻槐鏇㈡偩椤撱垺鐓曢幖娣妺閹查箖鎸婂┑鍠㈠綊宕楅崗鑲╃▏缂佺偓宕樺▔鏇㈠焵椤掆偓缁犲秹宕曢柆宓ュ洦瀵肩€涙ê浜楅梺鍝勬储閸ㄦ椽鎮″☉銏$厱闁靛绲介崝姘攽閿涘嫬甯舵い顓″劵椤т線鏌涢妸銈呭祮婵犫偓娓氣偓濮婅櫣绱掑Ο鎾虫贡缁棃顢氶埀顒勩€侀弮鍫濋唶闁绘棁娅i弳銏ゆ⒒閸屾艾鈧兘鎮為敂閿亾缁楁稑鎳忓畷鏌ユ煕鐏炵虎鍤ゆ繛鎴烆焸閺冨牆宸濇い鎾跺Т楠炴帡姊绘担鍛婃儓婵炲眰鍨藉畷鐟懊洪鍛簵闂佸憡鍔︽禍婵嬪窗閹邦厾绡€濠电姴鍊绘晶鏇犵磼閳ь剟宕奸悢绋垮伎濠碘槅鍨辩€笛呮兜妤e啯鐓㈤柛鎰典簻閺嬫盯鏌$仦鐐缂佺粯绋栭ˇ鏌ユ倵濮樺崬鍘寸€规洘鍨挎俊鎼佸煛閸屾瀚肩紓鍌氬€烽悞锕傛晪婵犳鍠栧ú锕傚Φ閸曨垰鍗抽柕濞垮劚缁秹姊虹化鏇熸澓闁搞劏妫勯锝夊箻椤旂⒈娼婇梺鐐藉劜閺嬪ジ宕戦幘缁樺仺闁告稑锕﹂崣鍡椻攽閻樼粯娑ф俊顐n殜閸┾偓妞ゆ帒鍊归崵鈧梺瀹狀嚙缁夌懓鐣烽崼鏇炍╅柨婵嗗閻╁酣姊绘繝搴′簻婵炶濡囩划娆撳箛閺夎法鐤呮俊銈忕到閸燁垶鎮″☉銏″€堕柣鎰版涧娴滃墽绱掗埀顒傗偓锝庡厴閸嬫挾鎲撮崟顒傤槹婵炲瓨绮岄悥濂稿Υ娴e壊娼ㄩ柍褜鍓熼獮鍐閿涘嫰妾繝銏f硾椤﹁鲸寰勯敓锟�
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者