在學習資料滿天飛的大環境下,知識變得非常零散,體系化的知識并不多,這就導致很多人每天都努力學習到感動自己,最終卻收效甚微,甚至放棄學習,我的使命就是過濾掉大量的垃圾資訊,將知識體系化,以短平快的方式直達問題本質,把大家從大海撈針的痛苦中解脫出來,
1 制作jffs2根檔案系統鏡像
1.1 制作jffs2工具
由于jffs2檔案系統具有壓縮功能,所以制作jffs2工具時需要zlib壓縮庫,
- 安裝zlib動態庫
# 在ubuntu系統中操作
albert@ubuntu:/work/jffs2 $ tar xzvf zlib-1.2.3.tar.gz #解壓縮原始碼
albert@ubuntu:/work/jffs2/zlib-1.2.3 $ ./configure --shared #配置:需要生成動態庫
albert@ubuntu:/work/jffs2/zlib-1.2.3 $ make #編譯
albert@ubuntu:/work/jffs2/zlib-1.2.3 $ sudo make install #安裝
albert@ubuntu:/work/jffs2/zlib-1.2.3 $ ls /usr/local/lib #查看發現安裝成功(libz開頭的三個動態庫)
libz.so libz.so.1 libz.so.1.2.3 python2.7 python3.4 site_ruby
- 安裝jffs2工具
# 在ubuntu系統中操作
albert@ubuntu:/work/jffs2 $ tar xjvf mtd-utils-05.07.23.tar.bz2 #解壓縮原始碼
albert@ubuntu:/work/jffs2/mtd-utils-05.07.23/util $ make #編譯
albert@ubuntu:/work/jffs2/mtd-utils-05.07.23/util $ sudo make install #安裝
albert@ubuntu:/work/jffs2/mtd-utils-05.07.23/util $ mkfs<按tab> #查看發現安裝成功(mkfs.jffs2)
mkfs mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.jffs mkfs.minix mkfs.ntfs
mkfs.bfs mkfs.ext2 mkfs.ext4 mkfs.fat mkfs.jffs2 mkfs.msdos mkfs.vfat
1.2 制作jffs2根檔案系統鏡像
在上兩篇中我們已經準備好了根檔案系統的內容,下面只需要使用mkfs.jffs2工具制作成鏡像即可,
# 在ubuntu系統中操作
albert@ubuntu:/work/nfsroot $ mkfs.jffs2<然后回車> #這樣可以查看該工具的使用說明(各個引數的含義),
...
albert@ubuntu:/work/nfsroot $ mkfs.jffs2 -d minifs -o minifs.jffs2 -s 2048 -e 128KiB -n #制作鏡像
albert@ubuntu:/work/nfsroot $ ls -al #制作鏡像成功,發現minifs.jffs2比minifs.yaffs2的一半還要小
-rw-r--r-- 1 albert albert 4128688 Nov 2 22:18 minifs.jffs2
-rw------- 1 albert albert 8872512 Oct 31 23:19 minifs.yaffs2
1.3 配置uboot啟動引數
下載我們剛剛制作的minifs.jffs2到嵌入式設備啟動后報下述錯誤:
# S3C2440啟動程序中的控制臺列印
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
yaffs: auto selecting yaffs2 #這里默認掛載的根檔案系統型別是yaffs2
block 649 is bad
block 1335 is bad
block 1991 is bad
VFS: Mounted root (yaffs filesystem).
Freeing init memory: 140K
Warning: unable to open an initial console. #所以這里找不到/dev/console設備節點檔案
Failed to execute /linuxrc. Attempting defaults... #也找不到/linuxrc檔案
Kernel panic - not syncing: No init found. Try passing init= option to kernel. #init行程初始化失敗
產生上述錯誤主要是內核默認情況下認為根檔案系統的型別就是yaffs2,現在我們換成了jffs2,要通過某種方式告訴內核,這種方式就是配置uboot的啟動引數,
修改前:bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200,
修改后:bootargs=noinitrd root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0,115200
修改程序如下:
# 在S3C2440嵌入式設備中修改
# 使用uboot指令修改uboot啟動引數
OpenJTAG> set bootargs noinitrd root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0,115200 #設定啟動引數
OpenJTAG> print bootargs #查看設定結果(此時只是修改了記憶體)
bootargs=noinitrd root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0,115200
OpenJTAG> saveenv #保存修改結果到nand flash
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
修改uboot啟動引數之后重新啟動系統成功,
2 配置nfs根檔案系統
接下來,我們搞一個非常有意思的東西——讓嵌入式設備直接從你電腦硬碟啟動,這樣,每次修改完根檔案系統的代碼或者應用程式代碼,編譯完直接放到指定目錄就可以被嵌入式設備看到了,開發效率杠杠滴!!!
話不多說,我們馬上開始,
2.1 保證嵌入式開發板可以ping通電腦
先簡單說一下流程,首先要找一根網線連接嵌入式設備和電腦(我使用的是Ubuntu系統,不建議使用windows系統,否則還要裝nfs服務器),在電腦上(如果使用了虛擬機,記得網路訪問使用橋接模式)配置一個靜態除錯IP(比如172.27.45.101),在嵌入式設備上配置同一網段的靜態IP(比如172.27.45.250),然后就能相互ping通了(說起來好輕松啊,鄙視的表情),
這個程序中可能(或者說一定)會遇到些小問題,如果你裝的是windows,在windows中裝了一個虛擬機,然后在虛擬機中裝的Ubuntu系統,那么恭喜你,你必須要花時間搞清楚兩個問題:如何配置橋接模式并指定物理網卡;如何在Ubuntu系統中配置靜態IP地址,(由于篇幅問題,這里就不展開了,相信你能搞定滴,實在不行可以留言或私信我~)
另外一個,就是在嵌入式設備上配置靜態IP,這個我剛好寫過博客,鏈接如下:
https://blog.csdn.net/weixin_44873133/article/details/105938190
ping通后的效果如下圖:

2.2 開啟nfs服務器
我們以Ubuntu系統為例說明如何開啟nfs服務器,
先說一下nfs是個啥,nfs全拼net file system,所謂網路檔案系統和我們接觸過的yaffs2、jffs2有什么不同呢?最大的不同就是檔案的內容是通過網路加載到記憶體中的,而flash型別的檔案系統是通過讀flash加載到記憶體中的,先理解到這里就可以了,抓住 主要矛盾 ,細節上的差異等研究檔案系統實作的時候再 逐步 深入,
所以,開啟nfs服務也就很好理解了,就是將nfs程式運行起來,并且指定一個目錄允許別人通過網路訪問而已,
下面具體操作一下,
- 修改/etc/exports組態檔
# 在Ubuntu系統內操作
albert@ubuntu:/etc $ sudo vi exports #注意需要使用root權限
# 在/etc/exports(Unbunt目錄)檔案中把允許掛載的路徑添加進去
/work/nfsroot/minifs *(rw,sync,no_root_squash) #no_root_squash indicate the user has root authority
- 重啟nfs服務器
# 在Ubuntu系統內操作
albert@ubuntu:/etc/init.d $ sudo ./nfs-kernel-server restart #重啟nfs服務器
- 檢查是否啟動成功
# 在Ubuntu系統內操作(自己mount自己)
albert@ubuntu:~ $ sudo mount -t nfs 172.27.45.101:/work/nfsroot/minifs /mnt
albert@ubuntu:~ $ ls /mnt #自己mount自己成功
bin dev etc lib linuxrc proc sbin sys test usr
# 在嵌入式設備終端上操作
/ # mount -t nfs 172.27.45.101:/work/nfsroot/minifs /mnt -o nolock #注意不要使用檔案鎖,否則會失敗
/ # ls /mnt #已經成功mount到宿主機的路徑
bin etc linuxrc sbin test
dev lib proc sys usr
2.3 配置uboot啟動引數
修改前:bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
修改后:bootargs=noinitrd root=/dev/nfs nfsroot=172.27.45.101:/work/nfsroot/minifs ip=172.27.45.250:172.27.45.101:172.27.45.1:255.255.255.0:albert:eth0:off init=/linuxrc console=ttySAC0,115200
修改程序如下:
# 在S3C2440嵌入式設備中修改
# 使用uboot指令修改uboot啟動引數
OpenJTAG> set noinitrd root=/dev/nfs nfsroot=172.27.45.101:/work/nfsroot/minifs ip=172.27.45.250:172.27.45.101:172.27.45.1:255.255.255.0:albert:eth0:off init=/linuxrc console=ttySAC0,115200 #設定啟動引數
OpenJTAG> saveenv #保存修改結果到nand flash
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
下面對引數格式作一個說明(參考內核原始碼中/Documentation/nfsroot.txt),
| 引數項 | 引數格式 | 說明 |
|---|---|---|
| root | root=/dev/nfs | 只是告訴內核使用nfs虛擬檔案系統,其實并不存在/dev/nfs, |
| nfsroot | nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] | 用來指定nfs服務器ip和根檔案系統路徑,nfs-options可以省略, |
| ip | ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> | 主要作用是配置客戶端(本地)的網卡和ip,我們是用網線直連,gw-ip填多少無所謂,hostname隨便起,也可以空著,device一定要填對,是網卡名,autoconf自動配置選項關閉就可以了, |
重新啟動嵌入式設備,設備成功掛載nfs根檔案系統并啟動,如下圖:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BTroGOpU-1604419918925)(04%E6%9E%84%E5%BB%BA%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%EF%BC%88%E4%B8%89%EF%BC%89.assets/image-20201104000517006.png)]](https://img.uj5u.com/2020/11/05/174310051550492.png)
根檔案系統的制作/移植就告一段落了,是不是還回味無窮呢~
恭喜你又堅持看完了一篇博客,又進步了一點點!如果感徑訓不錯就點個贊再走吧,你的點贊和關注將是我持續輸出的噠噠噠動力~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/203395.html
標籤:其他
上一篇:Linux服務器安裝node
