特別鳴謝《構建嵌入式Linux系統》第九章 設置bootloader U-Boot引導
cubieboard6本想把rootfs放到移動硬盤上/dev/sda1,結果修改uenv.txt后,無法啟動。
用網上的辦法,把固件燒到TF卡上也不能啟動,最后通過修改uboot啟動參數解決。
另外的方法沒試:1. 直接連接miniUSB重新裝系統 2.uboot tftp方式啟動
經此一役,趕緊把uenv.txt做了一個備份uenv.txt.bak,下次直接改uboot的環境變量bootenv=uEnv.txt即可。
默認uenv.txt的內容(在/dev/mmcblk0p1路徑下)
uenvcmd=setenv os_type ubuntu;setenv ramdisk_addr_r -; bootargs=earlyprintk clk_ignore_unused selinux=0 root=/dev/mmcblk0p2 rw console==ttyS3 real_rootflags=rw loglevel=4 rootfstype=ext4
uboot常用命令:
printenv查看環境變量
setenv 設置環境變量
setenv abc 123
printenv abc查看設置的環境變量
setenv abc 不跟值即是刪除環境變量
saveenv 保存環境變量
第一步,接上串口,拷貝出所有的錯誤日志
Hit any key to stop autoboot: 0
boot from emmc card ...
reading uEnv.txt
183 bytes read in 2 ms (88.9 KiB/s)
Loaded environment from uEnv.txt
Running uenvcmd ...
reading boot.scr
reading uImage
5681616 bytes read in 242 ms (22.4 MiB/s)
... 省略
cmdline: console=ttyS3 earlyprintk clk_ignore_unused selinux=0
root=/dev/sda1 rw console=ttyS3 real_rootflags=rw loglevel=4 rootfstype2
boot_append_bootargs_add, bootargs console=ttyS3 earlyprintk clk_ignore_unused selinux=0 root=/dev/sda1 rw console=ttyS3 real_rootflag2
Starting kernel ...
第二步,啟動過程中按任意鍵,進入uboot
Hit any key to stop autoboot: 0
owl> printenv
...省略
研究第一步中串口啟動過程中的打印日志和printenv打印出的內容推測啟動順序:
bootcmd=run emmcboot
emmcboot=echo boot from emmc card ...; run emmcargs; run setbootenv
setbootenv=if run loadbootenv; then echo
Loaded environment from ${bootenv};env import -t ${scriptaddr} ${filesize};fi;if test -n "${uenvcmd}"; then echo Run;
mboot=
run loadkernel; run loadramdisk; run loadfdt;bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
第三步,測試推測
setenv emmcboot '
echo boot from emmc card zzz...; run emmcargs; run setbootenv'
printenv emmcboot
saveenv
reset #重啟
從啟動過程中的日志打印,能夠看出推測是正確的
第四步,在啟動內核之前,修改啟動參數,以下兩條命令均是單行命令,沒有換行。
setenv bootargs_base 'setenv bootargs 'earlyprintk clk_ignore_unused selinux=0 root=/dev/mmcblk0p2 rw console==ttyS3 real_rootflags=rw loglevel=4 rootfstype=ext4'' setenv mboot 'run bootargs_base; run loadkernel; run loadramdisk; run loadfdt;bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}'
查看修改是否生效:
printenv bootargs_base
printenv mboot
保存修改:saveenv
重啟:reset
終於可以正常啟動了,看到了久違的Welcome to Debian GNU/Linux 9 (stretch)!
