前言
本次實驗的啓動方式是:通過網絡掛載rootfs,內核從sd卡加載,並沒有通過網絡下載
關於uboot的兩點配置bootargs,bootcmd
bootargs:傳遞給內核使用的參數,對uboot來說只是一個環境變量
bootcmd:uboot啓動命令,主要是加載內核,設備樹,rootfs,然後用bootm啓動內核
1.先將隨便燒寫個官方鏡像到sd卡(也不能太隨便,只要你要編譯的內核要接近鏡像的,否則後面替換內核可能導致uboot和內核版本不匹配,從而無法啓動),由於我只需要使用內核所以只需要燒錄到第一個分區截至,嗯,我這裏用了一張128M的古董及sd卡,物盡其用了。先看一下鏡像分區表
可以看到我這個鏡像內核分區截至到地133119扇區(1扇區=512字節),拷貝到sd卡:
sudo dd if=s5p4418-kitkat-sd8g-20171017.img of=/dev/sdd bs=512 count=133119 conv=fsync
2.再回到uboot的參數配置,看一下bootcmd參數。
bloader=ext4load mmc 0:1
bootcmd=$bloader 0x48000000 $kernel;$bloader 0x49000000 root.img.gz;bootm 0x48000000
可以看到bootcmd使用ext4load mmc 0:1(=bloader) 加載了內核和根文件系統。由於內核都是從sd加載的,所以bootcmd我們不用改,至於bootcmd也加載了rootfs,這個不影響後續的啓動。
3.配置bootargs,bootargs的配置只需要保留console,添加ip地址設置,nfsroot,init進程地址
bootargs=console=ttyAMA0,115200n8 nfsroot=192.168.0.109:/home/minicoco/disk1/Dev/nanopi/rootfs
ip=192.168.0.99:192.168.0.109:192.168.0.1:255.255.255.0::eth0::off root=/dev/nfs rw init=/sbin/init
配置內核支持NFS啓動
make menuconfig
-
Networking support
- –>Networking options
- –>TCP/IP networking
- –>IP:kernel level autoconfiguration
-
File systems
- –>Network File System
- –>NFS client support
- –>Root file system on NFS
重點檢查ramdisk是否開啓,這個開啓了很有可能掛不上NFS
- General setup
- –>Initial RAM filesystem and RAM disk(initramfs/initrd) support//去掉
重新編譯內核
make -j16 #得到zImage
make uImage LOADADDR=0x48000000 #從uboot可以看出loadaddr地址爲0x48000000
獲取uImage,插上sd卡替換
搭建NFS服務器
1.安裝nfs服務
sudo apt install nfs-kernel-server
2.配置nfs
sudo nano /etc/exports
------------------------------
在/etc/exports結尾添加,no_root_squash參數很重要,不能少
/home/rootfs 192.168.0.0/24(rw,sync,no_subtree_check,no_root_squash)
3.測試nfs服務器
可以吧鏡像中自帶的root.img.gz拷貝出來解壓,先當做rootfs測試下
最後我測試失敗了,卡在了網絡驅動加載的地方,初步懷疑是nfs沒有掛載成功
經過網上各種搜索分析,最後發現這裏有個非常大的坑,nfs服務器不能用最新的1.1.3的版本,需要降級。我是用的是Lubuntu,什麼版本已經不記得了,看了下服務器倉庫中的版本,只有1.1.3。嘗試下載deb包自己裝,一堆依賴無法解決,最後被迫換到ubuntu16系統。血淋淋的教訓,以後還是用老一點版本的系統比較好。
最後這個樣子就算掛載成功了