busybox制作根文件系統2

上篇內容使用busybox制作好了根文件系統,接下來需要進行一些測試和功能的完善!

根文件系統的測試

測試根文件系統的時候不是直接燒寫到EMMC里面,這樣測試效率太低了,Ubuntu的rootfs目錄已經保存了根文件系統,只需要在開發板上通過nfs掛載Ubuntu下的rootfs目錄即可。也就是說,根文件系統一直在Ubuntu下,開發板通過網絡在使用這個根文件系統,這樣方便開發調試。

采用掛載網絡根文件系統,使用NFS。要求:

1、linux內核網絡驅動要工作正常。

2、設置uboot的bootargs,也就是linux內核的命令行參數。

從ubuntu的tftp里面加載我們前面移植的uboot、zImage和dtb,設置bootcmd。

前提設置

在開發板上設置網絡相關變量確保網絡正常使用,下面是我根據Ubuntu上IP和開發板IP的設置參數。

setenv serverip '192.168.3.200'
setenv gatewayip '192.168.3.254'
setenv netmask '255.255.255.0'
setenv ipaddr '192.168.3.167'
setenv ethaddr '32:34:46:78:9A:DC'
saveenv

設置使用tftp服務(tftp服務的搭建看這里)加載鏡像zImage和dtb。將所要用到的zImage 和imx6ull-14x14-evk-emmc.dtb文件放到Ubuntu上tftp服務的共享目錄中。

setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-14x14-evk-emmc.dtb;bootz 80800000 - 83000000'

保存環境變量

saveenv

image-20231027112217875

設置ubuntu上NFS服務支持低版本運行

在Ubuntu上,輸入下面命令打開/etc/default/nfs-kernel-server文件

vim /etc/default/nfs-kernel-server

Ubuntu18的 nfs默認只支持3和4版本的nfs,uboot默認使用的是版本2,所以直接修改Ubuntu上的nfs配置,否則nfs根文件系統無法掛載。然后在最后面添加下面這一行:

RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"

image-20231027104209579

添加完成以后保存退出,輸入如下命令重啟NFS服務即可:

sudo /etc/init.d/nfs-kernel-server restart

image-20231027104407148

bootargs環境變量設置

接下來要啟動開發板,在mobaxterm上操作了。

主要是設置里面的root值,將root的值改為NFS掛載即可。在Linux內核源碼里面有相應的文檔講解如何設置,文檔為內核目錄下Documentation/filesystems/nfs/ nfsroot.txt,格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

:服務器IP地址,就是Ubuntu的IP地址。

:根文件系統的存放路徑,這里我的是/home/workdir/rootfs

:NFS的其他可選選項,一般不設置。

:客戶端IP地址,即開發板的IP地址, 此地址一定要和Ubuntu的IP在同一個網段且沒有被其他設備使用。

:服務器IP地址,Ubuntu的IP地址。

:網關地址

:子網掩碼,教程中就是255.255.255.0。

:客戶機的名字,一般不設置,此值可以空著。

:設備名,也就是網卡名,一般是eth0,eth1….,正點原子STM32MP157開發板
只有一個網口,名字為eth0。

:自動配置,一般不使用,所以設置為off。

:DNS0服務器IP地址,不使用。

:DNS1服務器IP地址,不使用。

根據上面的格式,bootargs環境變量的root值如下:

root=/dev/nfs nfsroot=192.168.3.200:/home/workdir/rootfs,proto=tcp rw ip=192.168.3.167:192.168.3.200:192.168.3.1:255.255.255.0::eth0:off

proto=tcp表示使用TCP協議,rw表示nfs掛載的根文件系統為可讀可寫。

通過上面的了解,我們設置參數使用的命令如下:

啟動開發板,進入uboot命令行模式,然后重新設置bootargs環境變量,命令如下:

setenv bootargs 'console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.3.200:/home/workdir/rootfs,proto=tcp ip=192.168.3.167:192.168.3.200:192.168.3.1:255.255.255.0::eth0:off'

image-20231027112331458

將上述的環境變量設置好后,要注意保存!!

saveenv

查看環境變量

查看設置后的環境變量,是否正確設置。

print

image-20231027112454646

確保上面的沒有問題后,接下來輸入boot命令開始啟動

boot

如下圖剛開始啟動:

image-20231027113022727

最終畫面如下圖:

可以看到根文件系統已經掛載成功了。

image-20231027122156053

完善根文件系統

創建/etc/init.d/rcS文件

can't run '/etc/init.d/rcS': No such file or directory 提示很簡單,說是無法運行/etc/init.d/rcS這個文件,因為這個文件不存在。如下圖所示:

image-20231027140426472

在ubunru下,根文件系統的/etc/init.d/目錄下創建rcS文件,然后在rcS中輸入如下所示內容:

#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib 
export PATH LD_LIBRARY_PATH mount -a 
mkdir /dev/pts 
mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

對上述參數的簡單理解如下:

PATH環境變量保存著可執行文件可能存在的目錄,這樣在執行一些命令或者可執行文件的時候就不會提示找不到文件這樣的錯誤。LD_LIBRARY_PATH環境變量保存著庫文件所在的目錄。使用export來導出上面這些環境變量,相當于聲明一些“全局變量”。第7行,使用mount命令來掛載所有的文件系統,這些文件系統由文件/etc/fstab來指定,所以一會還要創建/etc/fstab文件。第8和9行,創建目錄/dev/pts,然后將devpts掛載到/dev/pts目錄中。第11和12行,使用mdev來管理熱插拔設備,通過這兩行,Linux內核就可以在/dev目錄下自動創建設備節點。關于mdev的詳細內容可以參考busybox中的docs/mdev.txt文檔。

示例代碼的rcS文件內容是最精簡的,如果去看Ubuntu或者其他大型Linux操作系統中的rcS文件,就會發現其非常復雜。因為是初次學習,所以不用搞這么復雜的,而且這么復雜的rcS文件也是借助其他工具創建的,比如buildroot等。

創建好文件/etc/init.d/rcS以后一定要給其可執行權限!使用如下命令給予權限:

chmod 777 rcS

image-20231027135615191

設置好以后就重新啟動Linux內核,啟動以后如下圖所示:

image-20231027135903332

從上圖可以看到,提示找不到/etc/fstab文件,還有一些其他的錯誤,先把/etc/fstab這個錯誤解決了。前面說了mount -a掛載所有根文件系統的時候需要讀取/etc/fstab,因為/etc/fstab里面定義了該掛載哪些文件,接下來就是創建/etc/fstab文件。

創建/etc/fstab文件

在rootfs中創建/etc/fstab文件,fstab在Linux開機以后自動配置哪些需要自動掛載的分區,格式如下:


:要掛載的特殊的設備,也可以是塊設備,比如/dev/sda等等。

:掛載點。

:文件系統類型,比如ext2、ext3、proc、romfs、tmpfs等等。

:掛載選項,在Ubuntu中輸入“man mount”命令可以查看具體的選項。一般使用defaults,也就是默認選項defaults包含了rw、suid、dev、exec、auto、nouser和async。

:為1的話表示允許備份,為0不備份,一般不備份,因此設置為0。

:磁盤檢查設置,為0表示不檢查。根目錄‘/’設置為1,其他的都不能設置為1,其他的分區從2開始。一般不在fstab中掛載根目錄,因此這里一般設置為0。

按照上述格式,/etc/fstab文件中輸入如下內容:

#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0 
tmpfs /tmp tmpfs defaults 0 0 
sysfs /sys sysfs defaults 0 0

操作如下圖

image-20231102111807032

fstab文件創建完成后重新啟動Linux,結果如下圖所示:

image-20231027141228914

從上圖可以看出,在運行/etc/init.d/rcS腳本第11行出現問題,提示不能創建“/proc/sys/kernel/hotplug”,這個是Linux內核配置問題,最后在講解怎么處理。接下來還需要創建一個文件/etc/inittab。

創建/etc/inittab文件

init程序會讀取/etc/inittab這個文件,inittab由若干條指令組成。每條指令的結構都是一樣的,以“:”分隔的4個段組成,格式如下:

:::
:每個指令的標識符,不能重復。但是對于busybox的init來說, ,有著特殊意義。對于busybox而言用來指定啟動進程的控制tty,一般將串口或LCD屏幕設置為控制tty。

:對busybox來說此項完全沒用,所以空著。

:動作,用于指定可能用到的動作。busybox支持的動作如下圖所示:

:具體的動作,比如程序、腳本或命令等。

/etc/inittab內容:

#etc/inittab 
::sysinit:/etc/init.d/rcS 
console::askfirst:-/bin/sh 
::restart:/sbin/init 
::ctrlaltdel:/sbin/reboot 
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
第2行,系統啟動以后運行/etc/init.d/rcS這個腳本文件。第3行,將console作為控制臺終端,也就是ttySTM0。第4行,重啟的話運行/sbin/init。第5行,按下ctrl+alt+del組合鍵的話就運行/sbin/reboot,看來ctrl+alt+del組合鍵用于重
啟系統。第6行,關機的時候執行/bin/umount,也就是卸載各個文件系統。第7行,關機的時候執行/sbin/swapoff,也就是關閉交換分區。

操作如下圖:

image-20231027142851474

/etc/inittab文件創建好重啟開發板即可。根文件系統要創建的文件就已經全部完成了!!

重啟開發板,如下圖:

image-20231027143038956

從上圖可以看出,沒有任何錯誤提示,說明根文件系統工作已經正常了。

根文件系統其他功能測試

軟件運行測試

使用Linux系統的目的就是運行自己的軟件,編譯的應用軟件一般都使用動態庫,使用動態庫的話應用軟件體積就很小,但是得提供庫文件,庫文件已經添加到了根文件系統中。可以編寫一個小小的測試軟件來測試一下庫文件是否工作正常,在根文件系統下創建一個名為“drivers”的文件夾,以后學習 Linux驅動的時候就把所有的實驗文件放到這個文件夾里面。

在Ubuntu下使用vim編輯器新建一個hello.c文件,輸入如下內容:

#include <stdio.h> int main(void) 
{ while(1){ printf("hello world!\r\n"); sleep(2); } return 0; 
}

用交叉編譯器去編譯,也就是使用arm-linux-gnueabihf-gcc編譯,命令如下:

arm-linux-gnueabihf-gcc hello.c -o hello

使用arm-linux-gnueabi-gcc將hello.c編譯為hello可執行文件。image-20231027144102402

在開發板上執行 hello

程序成功運行了,結果如下圖所示:

image-20231027144251738

可以看出, hello這個軟件運行正常,說明根文件系統中的共享庫是沒問題的,要想終止hello的運行,按下“ctrl+c”組合鍵即可。

中文字符測試

在ubuntu中向在rootfs目錄新建一個名為chinese.txt的文件在里面輸入中文,然后在MobaXterm下查看這個文件里的內容。結果如下圖所示:

image-20231027144712498

從上圖可以看出文件里中文內容顯示正確,而且中文路徑也完全正常,說明根文件系統已經完美支持中文了!

開機自啟動測試

在之前測試hello軟件的時候都是等Linux啟動進入根文件系統以后手動輸入命令“./hello”來完成的。一般做好產品以后都是需要開機自動啟動相應的軟件,本節就以hello這個軟件為例,講解一下如何實現開機自啟動。前面說過,進入根文件系統的時候會執行/etc/init.d/rcS這個shell文件,因此可以在這個腳本里面添加要執行的shell命令。添加完成以后的/etc/init.d/rcS文件內容如下:

image-20231027151747674

重啟開發板,結果如下圖所示:

image-20231027151859680

從上圖可看出,hello開機自動運行,證明開機自啟動成功。

外網連接測試

這里說的外網是百度、淘寶等這些網站的測試。也
就是說看看開發板能不能上網,能不能和局域網外的這些網站進行通信。測試方法很簡單,就是通過ping命令來ping一下百度的官網:www.baidu.com。輸入如下命令:

ping www.baidu.com

結果是失敗的,提示“bad address”,如下圖:

image-20231027152111572

出現這個錯誤提示是因為 www.baidu.com的地址解析失敗了,并沒有解析出其對應的IP地址。需要配置域名解析服務器的IP地址,一般域名解析地址可以設置為所處網絡的網關地址,比如192.168.1.1。 也可以設置為114.114.1144.114,這個是運營商的域名解析服務器地址。

如何解決

在rootfs中的/etc目錄下創建resolv.conf,然后在里面輸入如下內容:

nameserver 114.114.114.114 
nameserver 192.168.3.1

設置很簡單,nameserver表示這是個域名服務器,設置了兩個域名服務器地址:114.114.114.114和192.168.1.1,也可以改為其他的域名服務器試試。

image-20231027153305244

將上述文件,保存后退出。重啟開發板!重啟以后重新ping一下百度官網,成功ping通。結果如下圖所示:

image-20231027152812175

可以看出ping百度官網成功了!域名也成功的解析了,至此!根文件系統就徹底的制作完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160484.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160484.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

向量數據庫,展望AGI時代

無論是向量數據庫&#xff0c;還是大模型&#xff0c;歸根結底&#xff0c;大家在追捧它時的心態&#xff0c;焦慮大于需求。 向量數據庫的熱潮&#xff0c;在一定程度上“外化”了人們的焦慮。 但這并不能否定向量數據庫的實際價值&#xff0c;甚至更長遠來看&#xff0c;向…

【C++】linux下的gdb程序調試

目錄 【C】Linux 下的 GDB 程序調試1. 安裝 GDB2. 編譯程序3. 啟動 GDB4. 設置斷點5. 執行程序6. 調試命令7. 調試崩潰8. 結束調試 【C】Linux 下的 GDB 程序調試 在開發 C 程序時&#xff0c;出現 bug 是常見的。調試是找出程序錯誤的關鍵步驟之一。在 Linux 環境下&#xff…

RedisTemplate使用詳解

RedisTemplate介紹StringRedisTemplate介紹RedisConnectionFactory介紹RedisConnectionFactory源碼解析 RedisOperations介紹RedisOperations源碼解析 RedisTemplate使用連接池配置RedisTemplate連接池連接池配置 RedisTemplate應用場景RedisTemplate主要特點RedisTemplate使用…

redis運維(十六) 有序集合

一 有序集合 把握一點&#xff1a; 各種redis 命令都提供各種語言對應的API 接口,后續API是關鍵 ① 概念 1、sorted set --> 有序集合2、redis有序集合也是集合類型的一部分&#xff0c;所以它保留了集合中元素不能重復的特性3、但是不同的是,有序集合給每個元素多設置…

什么是數字孿生?

數字孿生是指通過數字化技術手段&#xff0c;將現實世界中的實體物理系統或過程與其數字化模型相連接&#xff0c;實現實體物理系統或過程的虛擬仿真、監測、預測和優化等功能的一種技術。數字孿生技術可以將物理系統的運行狀態、性能參數、故障信息等實時反饋到數字模型中&…

轉型做視頻了,博客就是稿子,繼續堅持寫博客,同時發布視頻,能寫博客說明思路清晰了,能再講明白,理解就更透徹了,緊跟上時代發展。

1&#xff0c;今天特別記錄下&#xff0c;B站給開通了《合集》功能 最近使用視頻制作了幾個視頻。播放量還不錯&#xff0c;最好的已經到了 2.6K了。 然后粉絲也漲到了 200個。 添加鏈接描述 緊跟時代&#xff1a;從寫博客到錄視頻&#xff0c;粉絲大漲&#xff0c;突破200個&…

vue開發一、在Vue中引入ElementUI二、在Vue中使用阿里圖標庫

目錄 一、在Vue中引入ElementUI1. 安裝ElementUI2. 引入ElementUI3. 使用ElementUI組件 二、在Vue中使用阿里圖標庫1. 在阿里圖標庫中選擇圖標2. 下載圖標3. 引入圖標4. 使用圖標 總結 一、在Vue中引入ElementUI ElementUI是一種基于Vue的第三方UI庫&#xff0c;提供了許多常用…

接口自動化測試 —— 工具、請求與響應

一、工具&#xff1a; 1.工具介紹 postman &#xff1a;很主流的API測試工具&#xff0c;也是工作里面使用最廣泛的研發工具。 JMeter&#xff1a; ApiPost&#xff1a; 2.安裝postman&#xff1a; 安裝好直接打開&#xff0c;不用注冊。 二、通信模式&#xff1a; 1、…

【Java 進階篇】從Java對象到JSON:Jackson的魔法之旅

在現代的軟件開發中&#xff0c;處理數據的能力是至關重要的。而當我們談及數據格式時&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;通常是首選。為了在Java中輕松地將對象轉換為JSON&#xff0c;我們需要一種強大而靈活的工具。這時&#xff0c;Jackso…

【Java 進階篇】Redis:打開緩存之門

介紹 Redis&#xff08;Remote Dictionary Server&#xff09;是一個高性能的鍵值對存儲系統&#xff0c;被廣泛用作緩存、消息中間件和數據庫。它以其快速的讀寫能力、支持多種數據結構和豐富的功能而聞名。在這篇博客中&#xff0c;我們將深入了解Redis的概念、安裝以及基本…

MQTT協議消息代理服務遠程連接

目錄 1. Linux 搭建 Mosquitto 2. Linux 安裝Cpolar 3. 創建MQTT服務公網連接地址 4. 客戶端遠程連接MQTT服務 5. 代碼調用MQTT服務 6. 固定連接TCP公網地址 7. 固定地址連接測試 Mosquitto是一個開源的消息代理&#xff0c;它實現了MQTT協議版本3.1和3.1.1。它可以在不…

第二十章:多線程

進程 線程的特點 1.進程是資源分配的最小單位&#xff0c;線程是最小的執行單位 2.一個進程可以有多個線程 3.線程共享進程資源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//繼承重…

Unity開發之C#基礎-File文件讀取

前言 今天我們將要講解到c#中 對于文件的讀寫是怎樣的 那么沒接觸過特別系統編程小伙伴們應該會有一個疑問 這跟文件有什么關系呢&#xff1f; 我們這樣來理解 首先 大家對電腦或多或少都應該有不少的了解吧 那么我們這些軟件 都是通過變成一個一個文件保存在電腦中 我們才可以…

【2023C卷最新題目】20天拿下華為OD筆試之【貪心】2023C-找座位/2023B-座位調整-全網注釋最詳細分類最全的華為OD真題題解

文章目錄 題目描述與示例題目描述輸入輸出說明示例一輸入輸出 示例二輸入輸出說明 解題思路代碼PythonJavaC時空復雜度 相同問題不同描述2023C-找座位題目描述輸入描述輸出描述示例一輸入輸出 示例二輸入輸出 華為OD算法/大廠面試高頻題算法練習沖刺訓練 題目描述與示例 題目描…

Spring Boot創建和使用(重要)

Spring的誕生是為了簡化Java程序開發的&#xff01; Spring Boot的誕生是為了簡化Spring程序開發的&#xff01; Spring Boot就是Spring框架的腳手架&#xff0c;為了快速開發Spring框架而誕生的&#xff01;&#xff01; Spring Boot的優點&#xff1a; 快速集成框架&#x…

2023年G2電站鍋爐司爐證考試題庫及G2電站鍋爐司爐試題解析

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2023年G2電站鍋爐司爐證考試題庫及G2電站鍋爐司爐試題解析是安全生產模擬考試一點通結合&#xff08;安監局&#xff09;特種作業人員操作證考試大綱和&#xff08;質檢局&#xff09;特種設備作業人員上崗證考試大綱…

MySQL 事務的底層原理和 MVCC(一)

在事務的實現機制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;預寫式日志&#xff09;機制來實現的。 在使用 WAL 的系統中&#xff0c;所有的修改都先被寫入到日志中&#xff0c;然后再被應用到系統中。通常包含 redo 和 undo 兩部分信息。 …

【Java開發】 Springboot集成Mybatis-Flex

1 Mybatis-Flex 介紹 1.1簡介 Mybatis-Flex 是一個優雅的 Mybatis 增強框架&#xff0c;它非常輕量、同時擁有極高的性能與靈活性。我們可以輕松的使用 Mybaits-Flex 鏈接任何數據庫&#xff0c;其內置的 QueryWrapper 亮點幫助我們極大的減少了 SQL 編寫的工作的同時&#xff…

cocos2dx ??Animate3D(二)

Twirl 扭曲旋轉特效 // 持續時間(時間過后不會回到原來的樣子) // 整個屏幕被分成幾行幾列 // 扭曲中心位置 // 扭曲的數量 // 振幅 static Twirl* create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude)…

編程語言發展史:C語言的誕生及其影響

預計更新 第一部分&#xff1a;早期編程語言 1.1布爾代數和機器語言 1.2匯編語言的出現和發展 1.3高級語言的興起 第二部分&#xff1a;主流編程語言 1.1 C語言的誕生及其影響 1.2 C語言的發展和應用 1.3 Java語言的出現和發展 1.4 Python語言的興起和特點 1.5 JavaScript語言…