嵌入式linux系統的開發——基於JFSS2檔案系統的分割槽及映象製作

at_1發表於2021-09-09
前言

對於嵌入式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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章