嵌入式linux系統的開發——基於JFSS2檔案系統的分割槽及映象製作
對於嵌入式Linux系統來說,絕大多數硬體裝置採用Flash作為儲存介質,LEDE/OPENWRT發行版會使用squash檔案系統和jffs2檔案系統相結合的方式作為整個系統的檔案系統,其中squash檔案系統是一種壓縮只讀檔案系統,而jffs2檔案系統支援可讀可寫操作。
當uboot啟動kernel後,kernel載入由squashFS檔案系統格式化的ROM分割槽,將其掛載到/rom目錄,由JFFS2檔案系統格式化的Flash剩餘空間則掛載到了/overlay目錄,/rom最終掛載到/根目錄下, /overlay覆蓋在/rom之上,即所謂的Overlay透明掛載技術,從使用者的使用角度看,/根目錄下可以任意修改、刪除、新增檔案,但實際上對/rom目錄下只讀檔案修改後會將修改的檔案放到/overlay目錄下,當對/overlay和/rom目錄下同名的檔案修改時只會對/overlay目錄下檔案影響,/rom目錄下檔案保持不變,這種方式的好處是恢復出廠設定時只需清空/overlay分割槽下檔案,/rom目錄下的檔案會成為出廠狀態,但這樣/rom目錄下始終佔用一定的空間來存放系統所必要檔案來恢復系統。
本文將介紹如何在LEDE發行版17.01.4上只使用JSFF2檔案系統的方法以及映象的製作,相比與squash檔案系統無需佔用空間備份相同的檔案。
JFSS2格式配置在source-17.01.4/config/路徑下包含Config-images.in檔案對應LEDE Configuration介面中Target Images選項內容,由於預設並未開放對JSFF2檔案系統的選擇,此處需要更改以下程式碼增加對JFSS2檔案系統支援。
menu "Target Images"
...
config TARGET_ROOTFS_JFFS2
bool "jffs2"
default y if USES_JFFS2
#depends on USES_JFFS2
help
Build a JFFS2 root filesystem.
...
系統分割槽 dts檔案為實現更加靈活的硬體支援和配置,對裝置的硬體資訊進行描述,涉及到系統flash型別、系統分割槽、網口暫存器、led gpio宣告等。在source-17.01.4/target/linux/ramips/dts/路徑下更改對應硬體平臺(LEDE Configuration——>Target Profile選項中配置)dts檔案的系統分割槽部分。
&spi0 {
status = "okay";
m25p80@0 {
#address-cells = ;
#size-cells = ;
compatible = "jedec,spi-nor";
reg = ;
spi-max-frequency = ;
m25p,chunked-io = ;
partition@0 {
label = "u-boot";
reg = ;
read-only;
};
partition@30000 {
label = "u-boot-env";
reg = ;
#read-only;
};
factory: partition@40000 {
label = "factory";
reg = ;
read-only;
};
kernel: partition@50000 {
label = "kernel";
reg = ;/*1.5M*/
};
rootfs: partition@1D0000 {
label = "rootfs";
reg = ;/*13M 0x0D00000*/
};
upgrade: partition@ED0000 {
label = "upgrade";
reg = ;/*14.5M 0x0D00000*/
};
partition {
label = "firmware";
reg = ;
};
};
spidev@1 {
#address-cells = ;
#size-cells = ;
compatible = "linux,spidev";
reg = ;
spi-max-frequency = ;
};
};
韌體合成 將/source-17.01.4/build_dir/target-mipsel_24kc_musl-1.1.16/linux-ramips_mt7628/路徑下的kernel和 rootfs的bin檔案進行韌體合成。由於在dts檔案中kernel分割槽大小為1.5M、rootfs分割槽大小為13.5M,需要透過dd命令將bin檔案擴充後,再使用cat命令將兩份bin檔案連線合成為一份韌體。
Linux的dd命令可用指定大小塊複製一個檔案,並在複製的同時進行指定的轉換。如wrtnode2p-kernel.bin檔案的擴充,以768k為1個block,2個blocks即為1.5M, 不足部分用空(NUL)字元補齊。具體引數如下所示:
1)if=檔名:輸入檔名,預設為標準輸入。即指定原始檔。
2)of=檔名:輸出檔名,預設為標準輸出。即指定目的檔案。
3)ibs=bytes:一次讀入bytes個位元組,即指定一個塊大小為bytes個位元組。
4)obs=bytes:一次輸出bytes個位元組,即指定一個塊大小為bytes個位元組。
5)bs=bytes:同時設定讀入/輸出的塊大小為bytes個位元組。
6)cbs=bytes:一次轉換bytes個位元組,即指定轉換緩衝區大小。
7)skip=blocks:從輸入檔案開頭跳過blocks個塊後再開始複製。
8)seek=blocks:從輸出檔案開頭跳過blocks個塊後再開始複製。
9) count=blocks:僅複製blocks個塊,塊大小等於ibs指定的位元組數。
10) conv=conversion:用指定的引數轉換檔案。
- ascii:轉換ebcdic為ascii
- ebcdic:轉換ascii為ebcdic
- ibm:轉換ascii為alternate ebcdic
- block:把每一行轉換為長度為cbs,不足部分用空格填充
- unblock:使每一行的長度都為cbs,不足部分用空格填充
- lcase:把大寫字元轉換為小寫字元
- ucase:把小寫字元轉換為大寫字元
- swab:交換輸入的每對位元組
- noerror:出錯時不停止
- notrunc:不截短輸出檔案
- sync:將每個輸入塊填充到ibs個位元組,不足部分用空(NUL)字元補齊。
Linux的cat命令可用於建立檔案、顯示檔案內容以及連線檔案,此處使用cat命令可將填充後的kernel和rootfs檔案連線。
dd if=wrtnode2p-kernel.bin of=dwrtnode2p-kernel.bin bs=768k count=2 conv=sync
dd if=root.jffs2-64k of=droot.jffs2-64k bs=6656K count=2 conv=sync
cat dwrtnode2p-kernel.bin droot.jffs2-64k > ledeupdate.bin
注:將命令以shell指令碼方式呼叫(./xx.sh)更為便捷
將合成後的韌體以TFTP協議下載至裝置Flash中,具體方法可參考中韌體燒寫章節。
映象製作所謂映象檔案製作即像照鏡子一樣將燒寫在原裝置上的韌體複製成一份檔案,繼而再燒寫至其他同類裝置上。
透過cat /proc/mtd命令檢視當前系統分割槽資訊,結合dts檔案中分割槽資訊,可透過dd命令或cat命令從MTD(Memory Technology Devices)介面訪問Flash分割槽中的韌體,並製作成映象檔案,對kernel和rootfs單獨分割槽的好處即是可單獨製作分割槽的映象檔案。
dd if=/dev/mtd3 of=/tmp/kernel.bin
dd if=/dev/mtd4 of=/tmp/rootfs.bin
cat /dev/mtd3 > /tmp/kernel.bin
cat /dev/mtd4 > /tmp/rootfs.bin
總結 使用jffs2檔案系統不僅可以多出M級以上的可支配空間,而且可以方便地單獨更新kernel或rootfs韌體。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2801581/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux 磁碟分割槽及檔案系統管理Linux
- Linux 製作系統映象Linux
- 小白自制Linux開發板 五. Debian檔案系統製作,以及WIFI配置、交換分割槽配置LinuxWiFi
- Linux系統檔案系統及檔案基礎篇Linux
- Linux Centos系統 磁碟分割槽和檔案系統管理 (深入理解)LinuxCentOS
- 基於javaEE的土地檔案管理系統的設計及開發Java
- Linux系統中分割槽是什麼?Linux系統分割槽方式有幾種?Linux
- 如何在Linux 中獲取硬碟分割槽或檔案系統的UUID?Linux硬碟UI
- Linux系統怎麼分割槽Linux
- zynq 按照傳統的Linux開發模式製作系統Linux模式
- Linux作業系統支援的檔案系統有哪些?Linux作業系統
- Dragonfly 基於 P2P 的檔案和映象分發系統Go
- Linux 中獲取硬碟分割槽或檔案系統的 UUID 的七種方法Linux硬碟UI
- 如何在 Linux 分割槽或邏輯卷中建立檔案系統Linux
- 檔案系統&&磁碟管理(六)–swap分割槽、迴環裝置、檔案系統配置檔案fstab
- rootfs -根檔案系統製作
- 在Linux下製作一個簡單的給ARM開發板使用的檔案系統Linux
- 嵌入式系統開發:基於Linux學習筆記整理Linux筆記
- linux的檔案系統Linux
- Linux系統的目錄及重要檔案Linux
- 【Linux系統】fdisk相關分割槽命令。Linux
- Linux系統對分割槽有哪些要求?Linux
- Linux系統如何進行分割槽?swap分割槽是什麼?Linux
- Linux嵌入式系統開發,嵌入式Linux開發教程Linux
- 【檔案系統】嵌入式檔案系統Fatfs簡介
- 『學了就忘』Linux檔案系統管理 — 62、手動分配swap分割槽Linux
- Linux系統篇-檔案系統&虛擬檔案系統Linux
- 在linux系統中對檔案進行分割Linux
- Android系統常用分割槽Android
- 『學了就忘』Linux檔案系統管理 — 61、使用parted命令進行分割槽Linux
- TX2系統環境映象製作及燒寫
- 作業系統 『動態(可變)分割槽分配』作業系統
- 信創的作業系統都是基於linux嗎作業系統Linux
- linux系統配置及相關檔案Linux
- Linux檔案系統iNode及stat命令Linux
- Linux系統中常見的檔案系統有哪些?Linux
- Linux系統掛載win系統的共享檔案Linux
- 使用Busybox製作最小檔案系統並燒寫入開發板