?網絡啟動,是用 TFTP 在服務器下載內核、dtb 文件到目標機的內存中,同時可以用 NFS 掛載網絡根文件系統到目標機上,實現目標機的無盤啟動。
準備工作:
- Firefly-RK3399 板卡;
- 路由器、網線;
- 安裝有 NFS 和 TFTP 的服務器;
- 一份制作好的根文件系統。
注:示例中使用的是 Ubuntu 系統的 PC 機作為服務器,通過路由器和網線實現與設備的連接。
1 服務器部署
1、在服務器上部署 TFTP 服務:
參考我博客這篇文章:Linux工具篇 | Ubuntu搭建TFTP服務器
假設 TFTP 目錄是 /tftpboot
。
2、在服務器上部署 NFS 服務:
參考我博客這篇文章:Linux工具篇 | Ubuntu搭建NFS服務器
然后將制作好的根文件系統復制到網絡文件系統目錄中,假設網絡文件系統目錄是 /nfs/rootfs
。
2 內核的配置
- 內核網址:FireflyTeam/kernel: BSP kernel source (github.com)
- 當前內核 git-commit:3710f06d1cc4e0a35d686d0806c42f0409084cdd
如果要做到掛載網絡根文件系統,需要在內核中做相關配置,并在 dts 中修改相關掛載根文件系統的配置。
首先進行內核配置,在內核目錄中執行 make menuconfig
,選擇相關配置:
[*] Networking support --->Networking options --->[*] IP: kernel level autoconfiguration[*] IP: DHCP support[*] IP: BOOTP support[*] IP: RARP supportFile systems --->[*] Network File Systems --->[*] Root file system on NFS
注意:配置完成后要覆蓋原來的config文件!否則編譯的時候還是使用原來的config文件。
修改 rk3399-linux.dtsi
配置,在 dts 文件中修改 chosen
節點下的 bootargs
參數,選擇使用 NFS 掛載遠程根文件系統,內容如下。
源內容:
chosen {bootargs = "earlycon=uart8250,mmio32,0xff1a0000 swiotlb=1 console=ttyFIQ0 ro root=PARTLABEL=rootfs rootfstype=ext4 rootwait overlayroot=device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1 coherent_pool=1m systemd.gpt_auto=0 cgroup_enable=memory swapaccount=1";};
修改后:
chosen {bootargs = "earlycon=uart8250,mmio32,0xff1a0000 swiotlb=1 console=ttyFIQ0 rw root=/dev/nfs rootfstype=ext4 rootwait overlayroot=device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1 coherent_pool=1m systemd.gpt_auto=0 cgroup_enable=memory swapaccount=1";};
編譯內核:
make ARCH=arm64 rk3399-firefly.img -j12
編譯完成后,將編譯好的內核文件 boot.img
和 rk3399-firefly.dtb
文件復制到 /tftpboot
目錄中:
cp boot.img /tftpboot
cp arch/arm64/boot/dts/rockchip/rk3399-firefly.dtb /tftpboot
詳細說明可以參考內核目錄中的 kernel/Documentation/filesystems/nfs/nfsroot.txt
3 U-Boot設置
請先確保目標機網線已插入,接入到服務器的局域網內。
目標機啟動進入 U-Boot 命令行模式,設置以下參數:
#設置目標機 IP 地址
=> setenv ipaddr 192.168.31.101
#設置 serverip 為服務器 IP 地址
=> setenv serverip 192.168.31.106 #設置從 TFTP 下載內核和 dtb 文件到相應地址,用戶請根據自己實際的目標機修改相應地址
=> setenv bootcmd tftpboot 0x0027f800 boot.img \; tftpboot 0x08300000 rk3399-firefly.dtb \; bootm 0x0027f800 - 0x08300000#設置掛載網絡根文件系統,IP 參數依次為:目標機 IP:服務器 IP:網關:網絡掩碼:設備名:off,可以更簡單的設置 ip=dhcp,通過 DHXP 自動分配 IP
=> setenv bootargs root=/dev/nfs rw nfsroot=192.168.31.106:/nfs/rootfs,v3 ip=192.168.31.101:192.168.31.106:192.168.31.1:255.255.255.0::eth0:off#啟動目標機
=> boot
ethernet@fe300000 Waiting for PHY auto negotiation to complete. done
Speed: 100, full duplex
Using ethernet@fe300000 device
TFTP from server 192.168.31.106; our IP address is 192.168.31.101
Filename 'boot.img'.
Load address: 0x27f800
Loading: #######################################################################################################################################################################################################################################################################################################################################################################################475.6 KiB/s
done
Bytes transferred = 20072448 (1324800 hex)
Speed: 100, full duplex
Using ethernet@fe300000 device
TFTP from server 192.168.31.106; our IP address is 192.168.31.101
Filename 'rk3399-firefly.dtb'.
Load address: 0x8300000
Loading: #######645.5 KiB/s
done
Bytes transferred = 97212 (17bbc hex)
## Booting Android Image at 0x0027f800 ...
Kernel load addr 0x00280000 size 19377 KiB
## Flattened Device Tree blob at 08300000Booting using the fdt blob at 0x8300000XIP Kernel Image ... OKLoading Device Tree to 0000000073edc000, end 0000000073ef6bbb ... OK
Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000)
Adding bank: 0x0a200000 - 0x80000000 (size: 0x75e00000)
Total: 912260.463 msStarting kernel ......
在開機內核日志中可見:
[ 12.146297] VFS: Mounted root (nfs filesystem) on device 0:16.
說明已經掛載上了網絡根文件系統。
注意事項
- 確保 TFTP 服務器、NFS 服務器可用;
- 確保目標機先插入網線后在開機,且和服務器在同一局域網內,如果是直連目標機和服務器,請使用交叉網線;
- 內核配置中,
Root file system on NFS
依賴于IP: kernel level autoconfiguration
選項,請先選擇IP: kernel level autoconfiguration
,之后才可以找到Root file system on NFS
選項; - 在 U-Boot 命令行中,請確認
boot.img
燒錄地址和 dtb 文件燒錄地址。(提示:boot.img
的文件結構中,開頭有2k的頭文件,然后才是 kernel。所以在 TFTP 下載內核到目標機時,要下載到對應 kernel 地址減去0x0800的地址上); - 在設置掛載遠程根文件系統時,
nfsroot=192.168.31.106:/nfs/rootfs,v3
中的v3
代表 NFS 版本信息,請添加上以避免出現掛載不成功的問題。
?