1. 程式人生 > >Linux只讀檔案系統

Linux只讀檔案系統

By Toradex 胡珊逢

1.     簡介

檔案系統對於嵌入式系統,正如記憶對於大腦,嵌入式系統失去了檔案系統,這往往是嚴重的問題,輕則導致應用無法啟動,資料丟失,嚴重的情況可能是整個系統啟動失敗。Windows 電腦的藍屏、手機變磚,這其中很大比例是由於重要系統檔案丟失、損壞所致。如何保護嵌入式檔案系統的安全,這是系統開發人員打造一款穩定、可靠產品時應該考慮的事情。

損壞檔案系統,除了外部因素如高壓、高溫、強磁場干擾儲存器外,寫檔案系統那時的突然掉電往往會造成檔案系統結構本身的損壞,例如分割槽資訊。在 Linux 嵌入式系統常見的掛載 VFS 失敗就是由於rootfs 受損所致,而這之前的 U-Boot 和 Linux kernel 往往任可以正常工作。檔案針對此類情況,將介紹如何在 iMX6 平臺上,如何使用只讀檔案系統,並將使用者應用和資料儲存在獨立的分割槽,以及利用 Toradex Easy Installer 完成分割槽和系統安裝操作。

2.     生成只讀檔案系統

Yocto/OpenEmbedded 構建框架的一個特點是,系統軟體會根據所構建的目標映象的要求自動調整編譯軟體的功能。例如在 IMAGE_FEATURES 中新增 read-only-rootfs,那麼 BSP 中包含的軟體將不會往 Flash上寫入檔案,包括系統日誌。

在 local.conf 配置

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

EXTRA_IMAGE_FEATURES = "debug-tweakspackage-management read-only-rootfs"

DISTRO_EXTRA_RDEPENDS_remove = " angstrom-libc-fixup-hack"

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

3.     設定分割槽掛載

修改使用者分割槽掛載目錄

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

layers/meta-toradex-demos/recipes-core/base-files/base-files/fstab

/dev/root           /                   auto      ro,noatime              1  1

proc                /proc               proc      defaults             0  0

devpts              /dev/pts            devpts     mode=0620,gid=5       0  0

usbdevfs            /proc/bus/usb        usbdevfs   noauto               0  0

tmpfs               /run                tmpfs      mode=0755,nodev,nosuid,strictatime0  0

tmpfs               /var/volatile        tmpfs      defaults             0  0

# uncomment this if your device has aSD/MMC/Transflash slot

#/dev/mmcblk0p1      /media/card         auto      defaults,sync,noauto  0 0

/dev/mmcblk0p3       /mnt         ext4      defaults,sync,noauto  0 0

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

將系統根目錄設定為只讀狀態,並將獨立的使用者分割槽掛載到 /mnt 目錄,該目錄任具有讀寫許可權。使用者應用可以在該分割槽下儲存使用者配置檔案、應用日誌,甚至升級使用者應用本身。

4.     設定應用自啟動指令碼

由於檔案系統需要配置為只讀屬性,我們需要在 Yocto/OpenEmbedded 構建時直接包含應用開機啟動指令碼。目前 Toradex 的 Linux BSP 已經採用 systemd 啟動管理,使用者需要新增對應的 systemd service 檔案。為了方便演示,我們直接在 layers/meta-toradex-bsp-common/recipes-core/ 目錄下建立使用者自己的recipe 檔案,如 user-demo,當然你也可以在 Yocto/OpenEmbedded  根目錄中新增自己的  layer,將所需的 recipe 都包含進來,具體方法請參考這裡

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

[email protected]:~/Toradex/OE/v2.7/layers/meta-toradex-bsp-common/recipes-core/user-demo$tree -L 2

.

├── files

│   └── user-demo.service

└── user-demo.bb

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

user-demo.bb

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

SUMMARY = "Add user demo"

DESCRIPTION = "create folder withinhome and install auto-run service script"

LICENSE = "CLOSED"

PR = "r3"

SRC_URI =  " \

    file://user-demo.service \

"

do_install () {

    install-m 0644 ${WORKDIR}/user-demo.service ${D}${systemd_unitdir}/system

}

NATIVE_SYSTEMD_SUPPORT = "1"

SYSTEMD_PACKAGES = "${PN}"

SYSTEMD_SERVICE_${PN} = "user-demo.service"

inherit allarch systemd

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

user-demo.service

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

[Unit]

Description=launch user's demo on dedicatedpartition

ConditionFileIsExecutable=/mnt/helloworld

StartLimitIntervalSec=200

StartLimitBurst=5

After=multi-user.target

[Service]

Type=simple

ExecStart=/mnt/helloworld

Restart=on-failure

RestartSec=10

[Install]

WantedBy=multi-user.target

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

啟動指令碼中使用 ConditionFileIsExecutable來判斷使用者分割槽是否成功掛載並存在可執行檔案,等待分割槽檔案準備完成後才啟動,同時設定Restart ,當啟動失敗後會再次嘗試。

最後執行命令,生成用於 ToradexEasy Installer 的安裝檔案

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

bitbake console-tdx-image

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

將下面檔案複製到 SD 或者 U盤中

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

├── Colibri-iMX6_Console-Image.bootfs.tar.xz

├──Colibri-iMX6_Console-Image.rootfs.tar.xz

├── image.json

├── prepare.sh

├── slides_vga

├── SPL

├── toradexlinux.png

├── u-boot.imx

├── userapp.tar.xz

└── wrapup.sh

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

5.     修改 image.json 配置檔案

Toradex Easy Installer 中的 image.json  檔案可用於配置 iMX 6 模組上 Flash 的分割槽情況,並將檔案寫入對應的分割槽中。我們需要在 Flash 建立分割槽,存放使用者檔案  userapp.tar.xz,並去掉 rootfs 分割槽  want_maximised屬性。

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

{

                   "want_maximised": false,

                   "content": {

                       "mkfs_options": "-E nodiscard",

                       "filesystem_type": "ext4",

                       "uncompressed_size": 140.03515625,

                       "filename":"Colibri-iMX6_Console-Image.rootfs.tar.xz",

                       "label": "RFS"

                   },

                   "partition_size_nominal": 512

               },

               {

                   "want_maximised": true,

                   "content": {

                       "mkfs_options": "-E nodiscard",

                       "filesystem_type": "ext4",

                       "uncompressed_size": 7.01,

                       "filename": "userapp.tar.xz",

                       "label": "UserData"

                   },

                   "partition_size_nominal": 512

      }

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

userapp.tar.xz 壓縮包中包含了使用者檔案,如 helloworld和 taq.mp4,直接將其壓縮成 xz 格式即可。

6.     使用者應用

由於使用者應用存放在獨立的分割槽上,因此並不需要將其整合到  Yocto/OpenEmbedded,藉助 Toradex Easy Installer 可以直接將程式、資料等寫入分割槽。以下面應用為例,應用將列印“Hello world!”,並在使用者分割槽上寫如資料檔案。該應用由上面的 user-demo.service 指令碼在開機時啟動。

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

int main(int argc,char *argv[]){

 int file_hd;

 unsigned chardata[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};

 file_hd = open ("/mnt/log-file",O_CREAT |O_WRONLY | O_TRUNC);

 if(file_hd==-1)

 {

      printf("filecreate failed");

      return -1;

 }

 write (file_hd,(unsigned char *)data, 16);

 close(file_hd);

 printf("Hello world!\n");

 return 0;

}

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

7.     測試檔案系統

檢視掛載情況

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

[email protected]:/etc/udev/rules.d# mount -l

/dev/mmcblk0p2 on / type ext4 (ro,noatime,data=ordered) [RFS]

…… 

/dev/mmcblk0p3 on /media/mmcblk0p3 typeext4 (rw,relatime,data=ordered)[UserData]

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

在只讀檔案系統上無法建立目錄

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

[email protected]:~# pwd

/home/root

[email protected]:~# mkdirtestfolder

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

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

UserData 分割槽下的使用者檔案

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

[email protected]:/media/mmcblk0p3# ls

helloworld      lost+found       taq.mp4

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

應用啟動情況

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

[email protected]:~# journalctl-u user-demo.service

-- Logs begin at Wed 2018-03-07 04:48:18UTC, end at Mon 2018-03-12 08:30:56 UTC. --

Mar 12 08:30:51 colibri-imx6 systemd[1]:Started launch user's demo on dedicated partition.

Mar 12 08:30:51 colibri-imx6 helloworld[522]:Hello world!

[email protected]:~# hexdump-b /mnt/log-file 

0000000 000 001 002 003 004 005 006 007 010011 012 013 014 015 016 017

0000010

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

8.     總結

通過將 rootfs 設定為只讀模式,使用者的寫操作只縮小到一個單獨分割槽,可以降低由於 rootfs 損壞導致系統啟動失敗的發生。只讀模式的 rootfs 也會帶來其他影響,有些檔案是在系統執行時必須建立或者更新的,如密碼、random seed、SSH Keys、網路配置引數等。這些檔案的缺失使得系統無法儲存之前的配置,每次使用時都需重新建立。以上只是一個簡單的說明,如何使用只讀檔案系統提高系統穩定性。使用者也可以將應用直接整合到 BSP 中,當用戶分割槽上的檔案損壞或者丟失時,可以將其用作備份恢復。甚至採用額外的儲存介質,實現系統恢復、A/B 分割槽、OTA 等其他功能。

相關推薦

Linux只讀檔案系統

By Toradex 胡珊逢1.     簡介檔案系統對於嵌入式系統,正如記憶對於大腦,嵌入式系統失去了檔案系統,這往往是嚴重的問題,輕則導致應用無法啟動,資料丟失,嚴重的情況可能是整個系統啟動失敗。Windows 電腦的藍屏、手機變磚,這其中很大比例是由於重要系統檔案丟失、

linux掛載u盤時顯示只讀檔案系統,不能在裡面進行新建複製操作

問題現象: U盤掛載後,顯示是隻讀檔案系統,不能在裡面進行新建,複製的操作。 這個在方法在ubuntu以及fedora上驗證可用,其他的版本的Linux應該也可以借鑑。 1,插上U盤 2,執行df 命令,檢視U盤的掛載點(我的掛載點是 /mnt/usb) 3,執

三行命令教你解決linux系統下U盤只讀檔案系統問題

Ubuntu插入U盤為只讀檔案系統,無法新建檔案,資料夾或者向U盤中複製檔案 1.問題: 使用linux不管是centos還是ubuntu的小夥伴都難免遇到插入U盤的時候,不能對U盤進行操作。提示許可權不足或者是隻讀檔案系統。 現在教你三行命令教你解決U盤

[ADB]解決adb push,只讀檔案系統Read-only file system問題

解決方法 因命令2、adb disable-verity,需要新版adb工具才有,可以從以下連結下載使用 paltform adb 執行命令如下: adb root 獲取root許可權 adb disable-verity 關閉 system 分割槽的 verit

Linux 記憶體檔案系統

Linux記憶體檔案系統:可滿足高IO的要求 ramdisk: 基於虛擬在記憶體中的其他檔案系統(ex2fs)。 掛載方式:mount /dev/ram /mnt/ramdisk ramfs: 實體記憶體檔案系統,只存在於實體記憶體中。其大小也不是固定的,而是隨著所需要的

Linux.ext4檔案系統 .inode和extent

最近在看相關內容,不過總是不是很系統,今日看到此部落格,感覺恍然大悟,作者寫的非常棒:轉載: https://blog.csdn.net/stringNewName/article/details/73740155 為表示對作者的尊敬,一字不動的敲擊! 最近在看ext4

linux 檢視檔案系統型別

linux 檢視檔案系統型別 Linux 檢視檔案系統的方式有多種,列舉如下: mount :~$ mount /dev/sda1 on / type ext4 (rw,errors=remount-ro,user_xattr) proc on /proc type pr

linux檔案系統以及使用者組等概念

一、Linux檔案結構及基本資料夾 目錄 描述 / 根目錄 /bin 做為基礎系統所需要的最基礎的命令就是放在這裡。比如 ls、cp、mkdir等命令;功能和

Linux EXT檔案系統恢復誤刪檔案的方法

我們在管理資料庫和系統的時候,經常需要做rm 刪除檔案的操作。由於Linux是沒有回收站的,rm刪除了檔案或者目錄以後,資料是無法從Windows所謂的回收站中找到並恢復的。這樣的話,資料被誤刪除了以後,想要恢復我們一般需要從備份中,或者找資料恢復公司來恢復資料。但是,在某些比較特殊的情況下,使用了

[Linux] ARM檔案系統移植記錄

#arm-cotex-A9 M6708 檔案系統移植記錄 本文的主要內容是:記錄在移植檔案系統時所遇到的問題。 ##工具 * ubuntu 16.04.2 server i386(開啟ssh、samba功能) * buildroot-2017.02.3 (藉助buildroot工

linux 網路檔案系統NFS伺服器配置

NFS(網路檔案系統)服務可以將遠端Linux系統上的檔案共享資源掛載到本地主機的目錄上,從而使得本地主機(Linux客戶端)基於TCP/IP協議,像使用本地主機上的資源那樣讀寫遠端Linux系統上的共享檔案。 1.配置NFS伺服器,先安裝兩個必要的軟體包,通常是預設安裝的 yum in

Linux檔案系統介紹

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux檔案系統基本介紹

Linux及檔案系統基本介紹 1   網際網路行業現狀 在伺服器端市場: 超級計算機

如何將HDFS檔案系統掛載到Linux本地檔案系統

本文轉自https://cloud.tencent.com/developer/article/1078538,如果侵權請聯絡我刪除。 1.文件編寫目的 Hadoop支援通過NFSv3掛載HDFS檔案系統到本地目錄,允許使用者像訪問本地檔案系統一樣訪問HDFS,對於普通使用者來說大大的簡

LINUX學習—檔案系統及管理類命令

Windows: PE Linux: ELF 檔案系統: rootfs:根檔案系統 FHS:規定Linux應該建立哪些目錄和檔案 ls / 可檢視根目錄下一級子目錄, 也可以ls /目錄名:可以檢視該目錄下一級子目錄 /boot: 系統啟動相關的檔案, 如核心、initrd

Linux ext4檔案系統下 extundelete 恢復 誤刪除的檔案

1、檔案基本操作 1.1 檢視檔案 # ls   1.2 建立 1.2.1 建立檔案 # touch {file_name} # vim {file_name}   1.2.2 建立目錄 # mkdir -p {dir}   1.3 複製 1.3.1 複

Linux檔案系統製作與各種掛載方式的實現

Linux根檔案系統的製作 什麼是檔案系統 計算機的檔案系統是一種儲存和組織計算機資料的方法,它使得對其訪問和查詢變得容易,檔案系統使用檔案和樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理裝置使用資料塊的概念,使用者使用檔案系統來儲存資料不必關心資料實際儲存在硬碟(或者光碟)的地址為多少的資料

linux檔案系統 /etc/resolv.conf 檔案詳解

大家好,今天51開源給大家介紹一個在配置檔案,那就是/etc/resolv.conf。很多網友對此檔案的用處不太瞭解。其實並不複雜,它是DNS客戶機配置檔案,用於設定DNS伺服器的IP地址及DNS域名,還包含了主機的域名搜尋順序。該檔案是由域名解析器(resol

Linux裝置檔案系統

Linux檔案系統目錄結構 /bin----存放著最經常使用的基本命令,如ls、cp、mkdir 等,這個目錄中的檔案都是可執行的。 /boot----啟動Linux時使用的一些核心檔案,包括一些連線檔案以及映象檔案,如vmlinuz、initrd.img  /de

Linux檔案系統中的比較常見的目錄結構

/bin 存放二進位制可執行命令的目錄 /dev 存放裝置檔案的目錄 /etc 存放系統管理和配置檔案的目錄 /home 使用者主目錄,比如使用者user的主目錄就是/home/user,可以用~user表示 /lib 存放動態連結共享庫的目錄 /sbin存放系