使用Squashfs和Overlayfs提高嵌入式Linux文件系統(tǒng)可靠性

By Toradex胡珊逢


在使用嵌入式?Linux?系統(tǒng)的時沛豌,會出現(xiàn)由于設(shè)備意外斷電引起文件系統(tǒng)損壞而最終使該設(shè)備無法啟動的現(xiàn)象趋箩。為了應(yīng)對這種情況,通常會從硬件設(shè)計如采用備用電源加派,無論是鋰電池還是超級電容等叫确,或者從系統(tǒng)軟件設(shè)上加以規(guī)避。本文接下來將介紹如何使用?squashfs?只讀文件系統(tǒng)制作?Linux?系統(tǒng)文件芍锦,并采用?overlayfs?為用戶目錄增加可寫權(quán)限竹勉。演示采用?Colibri iMX6?計算機(jī)模塊,該方法同樣也適用于?Toradex?其他產(chǎn)品醉旦,如?iMX8?計算機(jī)模塊饶米。


Squashfs?是一種只讀壓縮文件系統(tǒng),通常被用于數(shù)據(jù)備份或者系統(tǒng)資源受限的計算機(jī)系統(tǒng)上使用车胡,如?Linux?發(fā)行版的?LiveCD檬输,OpenWRT?系統(tǒng)也采用?squashfs。OverlayFS?一個結(jié)合其他文件系統(tǒng)的聯(lián)合掛載匈棘,將多個掛載點疊加為一個目錄丧慈。常見的應(yīng)用是在一個只讀的分區(qū)上疊加可讀寫的另一個分區(qū)。嵌入式?Linux?設(shè)備通常的功能都是被設(shè)計好的,極少需要在后期安裝其他軟件或更改?Linux?系統(tǒng)軟件逃默,更多的是更新設(shè)備應(yīng)用程序和相關(guān)數(shù)據(jù)鹃愤。因此基于?squashfs?的只讀文件系統(tǒng),結(jié)合?overlayfs?為用戶應(yīng)用和數(shù)據(jù)提供讀寫操作完域,能夠提高嵌入式?Linux?文件系統(tǒng)可靠性软吐。


在?Colibri iMX6?的?eMMC?上我們將使用以下分區(qū)規(guī)劃。BootFS?為?FAT32?格式吟税,該分區(qū)上包含?Linux?內(nèi)核文件凹耙,device tree?等啟動文件,如果是?iMX8肠仪,則還包含一些其他固件文件肖抱。該分區(qū)通常只在文件系統(tǒng)燒寫階段被寫入。RootFS?分區(qū)是?Linux?運行的文件系統(tǒng)异旧,usr, bin, lib, etc, home?等目錄都在上面意述。一般該分區(qū)是EXT3,EXT4?格式吮蛹,支持文件的寫入和刪除荤崇。而文件系統(tǒng)的損壞也常發(fā)生于此,最終導(dǎo)致設(shè)備啟動失敗匹涮。因此我們這里會采用只讀格式的?squashfs?天试。UserData?是能夠讀寫的?EXT4?分區(qū)。該分區(qū)通過?overlayfs?會被掛載到原本位于只讀?squashfs?中的?/home/root?目錄然低。用戶應(yīng)用可以毫無察覺得使用該目錄喜每,在上面寫入和刪除文件,但不破壞只讀?squashfs?文件系統(tǒng)雳攘,所有的操作都會被轉(zhuǎn)移到?UserData?分區(qū)上带兜。用戶的應(yīng)用也會存在?UserData?分區(qū)上,啟動的時候從這里加載應(yīng)用程序吨灭。該分區(qū)是可寫的刚照,所有這上面的文件是可以被更新。

?

下面我們會具體說明如何在?Yocto?環(huán)境生成符合上面規(guī)劃的?BSP?喧兄,并通過?Toradex Easy Installer?工具實現(xiàn)這些分區(qū)和寫入文件无畔。


首先需要在?Yocto?環(huán)境中生成?squashfs?格式的系統(tǒng)文件?rootfs。修改?build/conf/local.conf?吠冤,結(jié)尾添加以下內(nèi)容浑彰。

------------------------------------

IMAGE_FSTYPES_append = " squashfs"

------------------------------------


默認(rèn)?Linux?內(nèi)核配置下?squahfs?是通過加載內(nèi)核驅(qū)動模塊實現(xiàn)對其支持,而模塊驅(qū)動文件位于?rootfs?中拯辙,為了保證?Linux?內(nèi)核在啟動時能夠正確處理該格式郭变,需要將?squahfs?內(nèi)核驅(qū)動模塊配置為靜態(tài)驅(qū)動颜价,直接編譯進(jìn)內(nèi)核中。為內(nèi)核配置的文件系統(tǒng)支持添加?squahfs?和?overlay?格式诉濒。

------------------------------------

$ MACHINE=colibri-imx6 bitbake -c menuconfig virtual/kernel

→?File systems

<*> Overlay filesystem support


→?File systems?→?Miscellaneous filesystems

?<*>?? SquashFS 4.0 - Squashed file system support?

------------------------------------


EXT4?格式的?UserData?分區(qū)會通過?overlay?機(jī)制掛載到只讀的?rootfs?上的?/home/root周伦,但這之前需要通過?fstab?將該分區(qū)掛載到系統(tǒng)中,/dev/mmcblk0p3 -> /media/data-> /home/root未荒。在?Yocto?中专挪,layers/meta-toradex-demos/recipes-core/base-files/base-files/fstab?會被編譯到?Colibri IMX6 BSP?中,在該文件中添加:

------------------------------------

/dev/mmcblk0p3?????? /media/data???????? auto?????? defaults,sync,noauto? 0? 0

------------------------------------


然后再添加一個開機(jī)自啟動腳本片排,將?/media/data?使用?overlay掛載到?/home/root狈蚤。?在?layers/meta-toradex-bsp-common/recipes-core目錄中添加?mount-overlayfs?文件夾,里面包含編譯需要的?bb?文件和?systemd service划纽。mount-overlayfs.bb?中?install -d ${D}/media/data?會在?/media?目錄中創(chuàng)建?data?文件夾,F(xiàn)ILES_${PN} = "/media/data"?將該空文件夾添加到?BSP?中锌畸。?mount-overlayfs.service?通過?RequiresMountsFor?保證?/media/data?目錄通過?fstab?掛載后才運行勇劣。Overlay?的目錄結(jié)構(gòu)如下,lowerdir?為/home/root upperdir?為?/media/data/home/root/upper潭枣,workdir?為?/media/data/home/root/work比默。這樣應(yīng)用可以在?/home/root?下直接讀寫文件,overlayfs?對應(yīng)用和用戶都是透明的盆犁。

------------------------------------

[Service]

Type=simple

ExecStart=/bin/sh -c 'mount -t overlay -o lowerdir=/home/root,upperdir=/media/data/home/root/upper,workdir=/media/data/home/root/work overlay /home/root'

------------------------------------


在?build/conf/local.conf?中將?mount-overlayfs?添加到?BSP?中命咐。

------------------------------------

IMAGE_INSTALL_append = " mount-overlayfs"

------------------------------------


由于?rootfs?是只讀格式,無法像之前一樣直接在開發(fā)板上運行?systemctl?命令添加開機(jī)自啟動腳本谐岁。我們需要像上面一樣醋奠,在?Yocto?中增加一個?test-app?來開機(jī)自動運行位于?UserData?分區(qū)(該分區(qū)通過?overlay?會被最終掛載到?/home/root?目錄)上的測試程序?test。在?layers/meta-toradex-bsp-common/recipes-core目錄中添加?test-app?文件夾伊佃,里面包含編譯需要的?bb?文件和?systemd service窜司。


在?build/conf/local.conf?中將?test-app?添加到?BSP?中。

------------------------------------

IMAGE_INSTALL_append = " mount-overlayfs test-app"

------------------------------------


至此我們已經(jīng)通過修改?Yocto?能夠生成所需結(jié)構(gòu)的BSP航揉,執(zhí)行下面命令完成編譯任務(wù)塞祈。

------------------------------------

$ MACHINE=colibri-imx6 bitbake tdx-reference-minimal-image

------------------------------------


在?build/deploy/images/colibri-imx6?有相關(guān)文件生成,我們需要下面兩個文件帅涂,文件名字中的時間戳對應(yīng)具體編譯的日期议薪。

Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0.tar

Colibri-iMX6_Reference-Minimal-Image.rootfs.squashfs


解壓?Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0.tar。因為rootfs?是?squahfs?格式媳友,需要使用定制的?boot.src?來啟動斯议。

------------------------------------

$ cd ~/

$ tar vxf Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0.tar

$ cd Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0

$ tar vxf Reference-Minimal-Image-colibri-imx6.bootfs.tar.xz

------------------------------------


修改其中的?emmcargs_set?參數(shù)。

------------------------------------

env set emmcargs_set 'env set rootfsargs root=/dev/mmcblk0p2 rootfstype=squashfs ro rootwait'

------------------------------------


可以使用該?boot.cmd?直接生成對應(yīng)的?boot.src,?替換解壓目錄中同名文件,?重新打包?Reference-Minimal-Image-colibri-imx6.bootfs.tar.xz

------------------------------------

$ cd Reference-Minimal-Image-colibri-imx6.bootfs

$ rm boot.src

$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Distro boot script" -d boot.cmd boot.scr

$ cd ..

$ tar cJf Reference-Minimal-Image-colibri-imx6.bootfs.tar.xz -C Reference-Minimal-Image-colibri-imx6.bootfs .

------------------------------------


將?squashfs?的?rootfs?文件系統(tǒng)復(fù)制到?Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0?目錄中庆锦。

------------------------------------

$ cp Colibri-iMX6_Reference-Minimal-Image.rootfs.squashfs Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0

------------------------------------


接下來創(chuàng)建需要復(fù)制到?UserData?分區(qū)中的文件捅位。如上面提到的?overlay?掛載需要有對應(yīng)目錄結(jié)構(gòu),依次創(chuàng)建以下目錄,并將測試程序?test?復(fù)制到?upper?目錄中艇搀。這里的測試程序?test?是一個非常簡單的?C?應(yīng)用尿扯,它會輸出“Hello Toradex!”到系統(tǒng)日志中。

------------------------------------

$ cd ~/Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0

$ mkdir rootfs

$ cd rootfs

$ mkdir -p home/root/upper

$ mkdir -p home/root/work

$ cp ~/test home/root/upper

$ tree

------------------------------------


打包為?rootfs.tar.xz焰雕。

------------------------------------

$ cd ..

$ sudo tar cJf rootfs.tar.xz -C rootfs .

------------------------------------


修改?image.json?文件衷笋,在blockdevs?中增加?RAW?格式分區(qū)用于直接寫入?squashfs?系統(tǒng)文件,以及?EXT4?格式的DATA分區(qū)用于寫入上面生成的?rootfs.tar.xz矩屁。


Colibri-iMX6_Reference-Minimal-Image-Tezi_5.1.0-devel-20201112022057+build.0?目錄下最終包含以下文件辟宗。

將上面的?BSP?通過?Toradex Easy Installer?重新安裝到?Colibri iMX6?上,安裝的時候注意需要點擊?Erase?擦除?eMMC?上的內(nèi)容吝秕。


燒寫后重啟模塊泊脐。可以通過?mount?命令查看掛載分區(qū)的情況烁峭。

------------------------------------

root@colibri-imx6:~# mount

/dev/mmcblk0p2 on / type squashfs (ro,noatime)

……

/dev/mmcblk0p3 on /media/data type ext4 (rw,relatime,sync)

overlay on /home/root type overlay (rw,relatime,lowerdir=/home/root,upperdir=/media/data/home/root/upper,workdir=/media/data/home/root/work)

------------------------------------


mmcblk0p2?為寫入?squashfs?只讀文件系統(tǒng)的分區(qū)容客,例如在?/etc?目錄無法創(chuàng)建文件。

------------------------------------

root@colibri-imx6:/etc# mkdir test-folder

mkdir: can't create directory 'test-folder': Read-only file system

------------------------------------


EXT4?格式的?/dev/mmcblk0p3?分區(qū)上是用戶文件约郁,被掛載到?/media/data缩挑。而?/home/root?會通過?overlay?具有可讀寫權(quán)限。

------------------------------------

root@colibri-imx6:~# cd ~/

root@colibri-imx6:~# pwd

/home/root

root@colibri-imx6:~# mkdir test-folder

root@colibri-imx6:~# ls

test???????? test-folder

root@colibri-imx6:~# ls -lh

-rwxrwxr-x??? 1 1000???? 1000?????? 11.3K Nov 11? 2020 test

drwxr-xr-x??? 2 root???? root??????? 4.0K Feb? 7 16:25 test-folder

------------------------------------


位于?UserData?上的測試程序?test?也在開機(jī)的時候自動運行鬓梅。

------------------------------------

root@colibri-imx6:~# journalctl -u test-app

-- Logs begin at Fri 2020-02-07 15:50:53 UTC, end at Fri 2020-02-07 16:11:49 UTC. --

Feb 07 15:50:57 colibri-imx6 systemd[1]: Started start a demo on overlay mount folder.

Feb 07 15:50:57 colibri-imx6 test[456]: Hello Toradex!

Feb 07 15:50:57 colibri-imx6 systemd[1]: test-app.service: Succeeded.

------------------------------------



總結(jié)

上面我們演示結(jié)合使用?squashfs?和?overlay供置,將系統(tǒng)文件放在一個只讀分區(qū),把讀寫操作在單獨的分區(qū)上進(jìn)行绽快。降低系統(tǒng)文件因意外斷電受損從而導(dǎo)致無法啟動的風(fēng)險芥丧。在使用只讀?squashfs?只讀文件系統(tǒng)時需要保證?rootfs?盡量精簡,建議在?Reference-Minimal-Image?基礎(chǔ)上構(gòu)建用戶自己的?BSP谎僻,甚至對其進(jìn)行裁剪娄柳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市艘绍,隨后出現(xiàn)的幾起案子赤拒,更是在濱河造成了極大的恐慌,老刑警劉巖诱鞠,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挎挖,死亡現(xiàn)場離奇詭異,居然都是意外死亡航夺,警方通過查閱死者的電腦和手機(jī)蕉朵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阳掐,“玉大人始衅,你說我怎么就攤上這事冷蚂。” “怎么了汛闸?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵蝙茶,是天一觀的道長。 經(jīng)常有香客問我诸老,道長隆夯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任别伏,我火速辦了婚禮蹄衷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厘肮。我一直安慰自己愧口,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布类茂。 她就那樣靜靜地躺著调卑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪大咱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天注益,我揣著相機(jī)與錄音碴巾,去河邊找鬼。 笑死丑搔,一個胖子當(dāng)著我的面吹牛厦瓢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啤月,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煮仇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谎仲?” 一聲冷哼從身側(cè)響起浙垫,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎郑诺,沒想到半個月后夹姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡辙诞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年辙售,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飞涂。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡旦部,死狀恐怖祈搜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情士八,我是刑警寧澤容燕,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站曹铃,受9級特大地震影響缰趋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陕见,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一秘血、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧评甜,春花似錦灰粮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佩研,卻和暖如春柑肴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旬薯。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工晰骑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绊序。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓硕舆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骤公。 傳聞我的和親對象是個殘疾皇子抚官,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容