搭建imx6ull環境--tftp加載鏡像,nfs掛載根文(wen)件系統
1.環境介紹
開發板:野火imx6ullPro郵票孔EMMC
主機:Win11
虛擬機:virtualbox
虛擬機版本:Ubuntu20.04
Windows遠程連接(jie)虛擬(ni)機(ji)
由于這(zhe)個板(ban)子比(bi)較老,野火提供的虛擬機(ji)是基(ji)于18.04的這(zhe)個版(ban)本不(bu)再支持vscode環(huan)境,于是就想(xiang)著開(kai)始學習驅動從頭到尾先搭建(jian)一(yi)(yi)下(xia)環(huan)境,中(zhong)間也是折騰了很久,所(suo)以都記錄一(yi)(yi)下(xia)
環境:
準備從SD卡加載uboot,通過tftp從Ubuntu中加載內核鏡像,設備樹,并通過nfs將根文件系統掛載到Ubuntu上
開發板直連電腦,虛擬機通過NAT連接無線網卡,保證虛擬機可以連接外網,橋接有線網卡,讓有線網卡、Windows、開發板在同一局域網內
vscode通過SSH遠程連(lian)接(jie)虛(xu)擬機(ji),在Windows環境下開(kai)發比(bi)較舒服
2.虛擬機環境搭建,并配置SSH連接
可以看我這篇博客
3.uboot編譯
3.1源碼下載
#環境下載
sudo apt install make git gcc-arm-none-eabi gcc bison flex libssl-dev dpkg-dev lzop libncurses5-dev
#直接克隆野火提供的倉庫
git clone -b ebf_v2020_10_imx //gitee.com/Embedfire/ebf_linux_uboot --depth 1
3.2編譯uboot
- 創建編譯內核腳本
touch build_uboot.sh
chmod 0777 build_uboot.sh
- 向文件中寫入如下內容
make distclean
make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_mmc_defconfig
- 查看生成的固件
ls u-boot-dtb.imx
3.3燒錄uboot
- sd卡插到讀卡器上,掛載到Ubuntu上

設備名(ming)稱可能不(bu)一(yi)樣(yang),可以(yi)插拔(ba)讀(du)卡器看一(yi)下變(bian)化的是哪個,哪個就是我們的讀(du)卡器
- 查看Ubuntu上掛載的分區,輸入lsblk

一般不會是sda,根據(ju)自己情況確定
- 進入uboot源碼目錄,執行如下命令
sudo dd iflag=dsync oflag=dsync if=u-boot-dtb.imx of=/dev/sdb seek=2
- 取下設備將SD卡插入開發板就能看到uboot啟動了
4.網絡環境搭建
開發板,主機和虛擬機可以通過網(wang)線通信,需要設置三(san)者(zhe)有共同的網(wang)關和掩碼,三(san)者(zhe)在同一網(wang)段的不同ip
操作之前關閉(bi)電腦(nao)所(suo)有電腦(nao)管(guan)家(jia)以及防火(huo)墻
4.1Windows網絡配置
-
打開控制面板->網絡和Internet->網絡和共享中心->更改適配器設置,找到我們的有線網卡

-
右鍵屬性->Internet協議版本4(TCP/IPV4)

可(ke)隨意(yi)配(pei)置(zhi)網段,只要保(bao)證三者(zhe)在(zai)同一網段即(ji)可(ke),不(bu)懂得可(ke)以按(an)照我的配(pei)置(zhi)
4.2Ubuntu網絡配置
-
Ubuntu關機,添加網卡選擇橋接模式,橋接的網卡一定是上邊配置的有線網卡名字

-
進入虛擬機網絡配置

-
配置網絡

-
驗證網絡
虛擬機終端輸入ifconfig,查看(kan)是否有(you)我們配置的網絡
4.3開發板網絡配置
開發板進(jin)入uboot,輸入如(ru)下命令
setenv ipaddr 192.168.100.30
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.100.1
setenv netmask 255.255.255.0
setenv serverip 192.168.100.30
saveenv
分(fen)別是ip地址,mac地址,網關,掩碼(ma),虛(xu)擬機(ji)ip,保存環境變量
驗證能與虛擬機跑通
ping 192.168.100.30
顯示如下即可

5.kernel編譯
5.1源碼下載
#環境下載
sudo apt install gcc-arm-linux-gnueabihf
#直接克隆野火提供的內核倉庫
git clone -b ebf_4.19.35_imx6ul //github.com/Embedfire/ebf_linux_kernel.git --depth 1
5.2編譯內核
- 編譯腳本
#進入內核后執行
touch build_kernel.sh
chmod 0777 build_kernel.sh
- 向build_kernel.sh中寫入
#清除編譯
make mrproper
# 編譯內核
make ARCH=arm npi_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j3
- 查看內核和設備樹
#應該會出現這兩個文件,記住這兩個文件位置
ls arch/arm/boot/zImage
ls arch/arm/boot/dts/imx6ull-mmc-npi.dtb
6.tftp加載內核和設備樹
- 安裝環境
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
- 創建目錄
cd ~
mkdir tftp
chmod 0777 tftp
- 配置TFTP
sudo vim /etc/xinetd.d/tftp
# 輸入如下內容,路徑根據自己的來,要絕對路徑
server tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/wanderpurr/tftp/
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
- 重啟TFTP服務
sudo service tftpd-hpa start
- 重置服務器
sudo vim /etc/default/tftpd-hpa
# 修改成如下內容,路徑還是按自己的來
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/wanderpurr/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
- 重啟TFTP服務
sudo service tftpd-hpa restart
- 將上邊我們編譯生成的內核鏡像和設備樹拷貝到我們的tftp目錄
- 修改內核和設備樹權限為777
- 測試加載鏡像,在uboot中輸入如下內容重啟
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-mmc-npi.dtb; bootz 80800000 - 83000000'
saveenv
重啟后會看到如下

后面會(hui)啟動(dong)內核,但缺(que)少根文件系統會(hui)啟動(dong)失(shi)敗
7.根文件系統編譯
- 下載源碼安裝環境
源碼可以去官網下載即可,根文件系統不向內核和uboot有很多板級配置需要向供應商所要指定版本
安裝環境
sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg build-essential libncurses5 libncurses5-dev u-boot-tools traceroute gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
- 配置根文件系統
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
配置如下操作
- Settings -> Build static binary (no shared libs) 勾選上
- Linux System Utilities->mdev 勾選上
- Settings -> vi-style line editing commands 勾選上
- Linux Module Utilities -> Simplified modutils 取消勾選
- 編譯
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
#指定安裝路徑為家目錄下rootfs
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=/home/wanderpurr/rootfs install
- 補全缺失文件
cd ~/rootfs
mkdir dev etc lib var proc tmp home root mnt sys
cd ./dev
sudo mknod console c 5 1
sudo mknod null c 1 3
cd ../etc
echo console::askfirst:-/bin/sh > inittab
8.nfs掛載根文件系統
上邊已經將根文件系統制(zhi)作好(hao)了,下面來通過(guo)網線掛載起來
- 安裝環境
sudo apt-get install nfs-kernel-server rpcbind
- 添加根文件系統
sudo echo "/home/wanderpurr/rootfs *(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports
- 重啟nfs
sudo /etc/init.d/nfs-kernel-server restart
- 修改uboot參數
#板子IP,虛擬機IP以及根文件系統路徑根據自己的配置好
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.100.30:/home/wanderpurr/rootfs,proto=tcp,nfsvers=4 rw ip=192.168.100.50:192.168.100.30:192.168.100.1:255.255.255.0::eth0:off'
saveenv
- 重啟開發板

這里就(jiu)(jiu)配置(zhi)結束了,我們開發板的根目錄就(jiu)(jiu)是虛擬機(ji)的rootfs目錄,這樣(yang)傳輸文件就(jiu)(jiu)非常方便了
結語
配置過程中(zhong)可能(neng)出現(xian)很多(duo)問題,我斷斷續(xu)續(xu)搞了一周(zhou),但(dan)每填一個坑(keng)都是對自己的一種(zhong)成(cheng)長
參考:
這個寫的非常全,有需要從頭自己配置的可以參考一下這個,但注意他bootargs最后網口挖了坑,讓我找了好幾天
以及野火官方文檔
有問題歡迎留言

使用網線直連開發板和電腦,通過tftp從虛擬機中加載鏡像,并通過nfs掛載根文件系統







