#1 2012-06-15 15:02:59
U-Boot啟動Linux OS的變數值設定
遙想當初以微軟視窗的思維, 開始接觸Linux. 搞不定X window, 只能看著游標閃爍而發呆. 而後承蒙站長啟發, 由路由器第三方韌體到Optware, 對我最大的改變就是擺脫視窗與滑鼠. 每個操作步驟, 都得扎實的輸入指令. 藉著路由器學得的基礎, 再轉向NAS. 亮麗的WebUI與駭客們的Optware, 還不能滿足我這顆笨腦袋. 自力救濟, 再往底層鑽研, 碰到U-Boot.
以接觸過的NAS來說, 除PCi MZK-NAS01SG使用RedBoot, 其餘皆使用U-Boot. 每款NAS使用的U-Boot版本未必相同. Marvell CPU的NAS, 使用自己的U-Boot變形版本. 但不論怎麼變, 我要的是能由我掌控, 進入我要的Linux OS.
先期測試, 由TFTP server載入核心最方便. 自認沒問題後, 接著就得想, 如何開機一路到底, 無需人為介入, 直接進入Linux OS. 這時, 就得由U-Boot著手.
先查看核心可棲身之處.
Marvell>> help
...
nand - NAND sub-system
ide - IDE sub-system
usb - USB sub-system
ide: SATA硬碟; usb: USB隨身碟. 而我還不想動原廠韌體, nand暫不考慮.
當然, 仍可照舊維持由TFTP server載入核心, 不必將核心轉移陣地.
再查看檔案系統格式
ext2load - load binary file from a Ext2 filesystem
fatload - load binary file from a dos filesystem
Ext2, FAT攏ㄟ通. 所以, SATA硬碟或USB隨身碟, 自行分割格式化吧.
參考U-Boot Environment Variables, 其中bootcmd環境變數, 若未中斷U-Boot, 倒數後, 自動執行. 所以, 載入核心的相關指令, 可放在bootcmd. 想像是autoexec.bat就對了.
bootargs環境變數, 是代入Linux核心的啟動參數. 參考Linux原始碼內, Documentation/kernel-parameters.txt. 其中, root=, 指定了Linux OS的Root filesystem所在的位置.
核心放在儲存媒體, 載入前, 要先驅動儲存媒體. 每款NAS實作也不相同. 例如: NAS-M25, 開機自動驅動USB; NAS-34, 開機自動驅動第一顆SATA硬碟; 迷你筋斗雲, 開機先認SATA老爹; TonidoPlug2, 兩腳開開等投胎. 所以, 若理解自己NAS的U-Boot特性, 就不必大幅更動U-Boot預設值.
參考Linux原始碼內, Documentation/arm/Booting, 其中提到machine type. 這就是我第一次轉念到Linux OS而碰壁的地方. 若使用現成的uImage, 某些機型還得補上arcNumber變數值. 參考The ARM Linux Project的Machines.
韌體內精簡的rootfs, 一般是由晶片商提供, 使用BusyBox當shell. NAS製造商再依功能需求, 補上其他應用程式. 如果使用韌體內建的Linux, 而想要安裝其他套件, 套件最大來源應該是NSLU2-Linux Optware. 若rootfs改用自己喜歡的Linux OS, 套件來源則為自選的Linux OS. 在U-Boot補上mainlineLinux=yes, 證明自己純正的血統. 不過, 實作過程中, 有些機型, 混血也行啦. Linux是肚大能容的.
其他U-Boot變數值, 尤其是Marvell變形版本, 變數特多. 這些變數可能用於Marvell核心與rootfs, 我沒深入研究. 覆寫U-Boot預設值前, 記得先備份原始值.
另外, 也可自行編譯核心, 屈就U-Boot預設值. 在不更動任何設定值下, 開機直達Linux OS. 例如: NAS-M25.
離線