Openwrt flash分割槽、檔案系統
轉載請註明博主
參考書籍Openwrt智慧路由系統開發 跟hoowa學智慧路由 王偉 孫冰 劉龍著
1、瞭解分割槽
在路由器的flash上時有分割槽的。
openwrt首次刷機完成後,再過一段時間會有以下提示
jffs2: notice: (246) jffs2_build_xattr_subsystem: complete building xattr subsystem, 1 of xdatum (0 unchecked, 0 orphan) and 9 of xref (0 dead, 2 orphan) found.
block: extroot: no root or overlay mount defined
這段話的意思是,使用jfffs2檔案系統完成了格式化。
不用管上面話的意思,先說說分割槽。
在linux系統中對快閃記憶體類儲存器是採用MTD(記憶體技術裝置)類裝置驅動實現的,MTD是用於訪問快閃記憶體類裝置(ROM,FLASH)的linux驅動子系統。它的主要目的是使Flash快閃記憶體類裝置更加容易的被訪問,為此它在硬體和上層提供了一個抽象的介面使得在作業系統下我們可以像操作硬碟一樣操作這類裝置。仔細觀察過linux啟動資訊的朋友會看到以下一段話。
[ 1.556000] Creating 5 MTD partitions on "raspi":
[ 1.564000] 0x000000000000-0x000001000000 : "ALL"
[ 1.576000] 0x000000000000-0x000000030000 : "Bootloader"
[ 1.588000] 0x000000030000-0x000000040000 : "Config"
[ 1.600000] 0x000000040000-0x000000050000 : "Factory"
[ 1.612000] 0x000000050000-0x000001000000 : "firmware"
[ 1.624000] 0x0000001853f2-0x000001000000 : "rootfs"
[ 1.632000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 1.660000] mtd: partition "rootfs_data" created automatically, ofs=0x670000, len=0x990000
這段話的意思是,系統在SPI(SPI是我們所使用的flash介面標準,路由器一般都用它)裝置上建立了是4個分割槽,這幾個分割槽的說明如表所示
分割槽id號 | 分割槽位置 | 分割槽大小 | 分割槽作用 |
Bootloader | 0x000000000000-0x000000030000 | 192KB | 載入程式 |
Config | 0x000000030000-0x000000040000 | 64KB | 載入程式配置 |
Factory | 0x000000040000-0x000000050000 | 64KB | MT7628初始引數 |
firmware | 0x000000050000-0x000001000000 | 15.68MB | 韌體分割槽 |
rootfs | 0x0000001853f2-0x000001000000 | 14827KB |
韌體分割槽 檔案系統子集 |
rootfs_data | 0x000000670000-0x000001000000 | 9792KB |
韌體分割槽 檔案系統子集 可寫分割槽子集 |
由於嵌入式的Flash容量很小,沒有調整的必要,所以分割槽都是固定的,也因此不需要"分割槽表"這種在計算機上有的東西。在路由器的flash中,分割槽的位置都是固化好的。
MTK7628配置的flash是16MB的,分割槽如圖所示
(1) 分割槽存在子分割槽,比如kernel和rootfs就是firmware的子分割槽。而rootfs_rom,rootfs_data就是rootfs的子分割槽。
(2)整個分割槽從0x000000000000開始到0x000001000000結束。
(3)kernel分割槽的容量計算公式如下,firmware大小減去rootfs大小。
2、檢視系統MTD分配
[email protected]:/# cat /proc/mtd
dev: size erasesize name
mtd0: 01000000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Factory"
mtd4: 00fb0000 00010000 "firmware"
mtd5: 00e7ac0e 00010000 "rootfs"
mtd6: 00990000 00010000 "rootfs_data"
3、檢視系統mtd的分割槽
[email protected]:/# cat /proc/partitions
major minor #blocks name
31 0 16384 mtdblock0
31 1 192 mtdblock1
31 2 64 mtdblock2
31 3 64 mtdblock3
31 4 16064 mtdblock4
31 5 14827 mtdblock5
31 6 9792 mtdblock6
4、將非檔案系統分割槽讀出來
hexdump -C /dev/mtd2 或者使用dd命令 dd if=/dev/mtd2 of=/tmp/mtd2
5、檔案系統
下面開始深入的瞭解檔案系統與上面分割槽 的關係,系統有rootfs_rom這個隱藏的只讀檔案系統,也有rootfs_data這個可寫的檔案分割槽,它們之間是什麼關係?這是Openwrt設計的一個有意思的地方。
①首先,載入程式啟動核心完成之後,由核心載入rootfs_rom只讀分割槽部分來完成系統的初步啟動。
②rootfs_rom只讀分割槽採用的是linux核心支援的squashFS檔案系統(一種只讀檔案系統),載入完畢後將其掛在到/rom目錄(同時也掛載為/根目錄)
③系統將使用JFFS2檔案系統格式化的rootfs_data可寫檔案分割槽並且將這部分掛載到/overlay目錄。
④系統再將/overlay 透明掛載為/根目錄
⑤最後將一部分記憶體掛載為/tmp目錄
⑥掛載情況如下
[email protected]:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 9792 408 9384 4% /
/dev/root 5120 5120 0 100% /rom
tmpfs 63108 92 63016 0% /tmp
/dev/mtdblock6 9792 408 9384 4% /overlay
overlayfs:/overlay 9792 408 9384 4% /
tmpfs 512 0 512 0% /dev
6、透明掛載/根目錄
Openwrt設計的一個特點是:系統先將rootfs_rom掛載為/根目錄,這樣具備了一個完整的系統,然後再將rootfs_data以透明方式掛載在/根目錄上。Openwrt透明掛載處理流程如圖所示,這樣重疊之後的效果是:
①我們所看到的根檔案系統是由rootfs_rom和rootfs_data兩個分割槽組合在一起的;
②當我們修改一個任何位置的檔案的時候,所做的修改在rootfs_data裡會有記錄。
③當我們刪除一個檔案的時候,所做的修改在rootfs_data裡會有記錄。
④當我們增加一個檔案的時候,所做的修改在rootfs_data裡會有記錄。
⑤當我們讀取檔案的時候,首先檢測rootfs_data裡的狀態,再檢測rootfs_rom裡的內容,一直到最後給你一個結果。
這樣做的好處和壞處為:
①當對檔案進行操作的時候,比如我們修改了一個名字為abc的檔案,那麼同時存在/rom裡面還有修改之前的abc,同時在/overlay裡面修改之後的abc,所佔的空間是倍增的。
②系統不論任何時候,只要通過簡單的刪除掉/overlay裡所有檔案,就能達到復原的效果。
openwrt採用了overlay檔案系統的優點
1.首先uboot啟動了kernel完成之後,由kernel載入"ROM分割槽"(就是rootfs減去rootfs_data得到的那一塊分割槽)
2.ROM分割槽採用的是Linux核心支援的squashFS檔案系統,載入完畢後將其掛載到/rom目錄(同時也掛載為根檔案系統)。
3.系統將使用JFFS2檔案系統格式化rootfs_data這部分並且將這部分掛載到/overlay目錄。
4.將/overlay透明掛載為/分割槽。
5.將一部分記憶體掛載為/tmp目錄。
OpenWRT設計的一個優點,它採用了一種叫Overlay透明掛載技術,首先將/rom掛載為/根檔案,然後再用/overlay覆蓋在/之上,這樣,當你進行檔案系統的變更,修改,所做的操作將在overlay中記錄。rom是不改變的。而最簡單的恢復出廠設定方法,即是刪除掉/overlay下所有檔案
下面詳細講解overlay檔案系統
overlay檔案系統解析
一個 overlay 檔案系統包含兩個檔案系統,一個 upper 檔案系統和一個 lower 檔案系統,是一種新型的聯合檔案系統。overlay是“覆蓋…上面”的意思,overlay檔案系統則表示一個檔案系統覆蓋在另一個檔案系統上面。
為了更好的展示 overlay 檔案系統的原理,現新構建一個overlay檔案系統。檔案樹結構如下:
1、在一個支援 overlay檔案系統的 Linux (核心3.18以上)的作業系統上一個同級目錄內(如/root下)建立四個檔案目錄 lower 、upper 、merged 、work其中 lower 和 upper 資料夾的內容如上圖所示,merged 和work 為空,same檔名相同,內容不同。
2、在/root目錄下執行如下掛載命令,可以看到空的merged資料夾裡已經包含了 lower 及 upper 資料夾中的所有檔案及目錄。
$mount -t overlay overlay -olowerdir=./lower,upperdir=./upper,workdir=./work ./merged
3、使用df –h 命令可以看到新構建的 overlay 檔案系統已掛載。
Filesystem Size Used Avail Use% Mounted on
overlay 20G 13G 7.8G 62% /root /merged
那麼 lower 和 upper 目錄裡有相同的資料夾及相同的檔案,合併到 merged 目錄裡時顯示的是哪個呢?規則如下:
1. 檔名及目錄不相同,則 lower 及 upper 目錄中的檔案及目錄按原結構都融入到 merged 目錄中;
2. 檔名相同,只顯示 upper 層的檔案。如上圖在 lower 和 upper 目錄下及下層目錄 dir_A 下都有 same.txt 檔案,但在合併到 merged 目錄時,則只顯示 upper 的,而 lower 的隱藏 ;
3. 目錄名相同, 對目錄進行合併成一個目錄。如上圖在 lower 及 upper 目錄下都有 dir_A 目錄,將目錄及目錄下的所有檔案合併到 merged 的 dir_A 目錄,目錄內如有檔名相同,則同樣只顯示 upper 的,如上圖中 dir_A 目錄下的same.txt檔案。
overlay只支援兩層,upper檔案系統通常是可寫的;lower檔案系統則是隻讀,這就表示著,當我們對 overlay 檔案系統做任何的變更,都只會修改 upper 檔案系統中的檔案。那下面看一下overlay檔案系統的讀,寫,刪除操作。
讀
¬ 讀 upper 沒有而 lower 有的檔案時,需從 lower 讀;
¬ 讀只在 upper 有的檔案時,則直接從 upper 讀
¬ 讀 lower 和 upper 都有的檔案時,則直接從 upper 讀。
寫
¬ 對只在 upper 有的檔案時,則直接在 upper 寫
¬ 對在lower 和 upper 都有的檔案時,則直接在 upper 寫。
¬ 對只在 lower 有的檔案寫時,則會做一個copy_up 的操作,先從 lower將檔案拷貝一份到upper,同時為檔案建立一個硬連結。此時可以看到 upper 目錄下生成了兩個新檔案,寫的操作只對從lower 複製到 upper 的檔案生效,而 lower 還是原檔案。
刪
¬ 刪除 lower 和 upper 都有的檔案時,upper 的會被刪除,在 upper 目錄下建立一個 ‘without’ 檔案,而 lower 的不會被刪除。
¬ 刪除 lower 有而 upper 沒有的檔案時,會為被刪除的檔案在 upper 目錄下建立一個 ‘without’ 檔案,而 lower 的不會被刪除。
¬ 刪除 lower 和 upper 都有的目錄時,upper 的會被刪除,在 upper 目錄下建立一個類似‘without’ 檔案的 ‘opaque’ 目錄,而 lower 的不會被刪除。
可以看到,因為 lower 是隻讀,所以無論對 lower 上的檔案和目錄做任何的操作都不會對 lower 做變更。所有的操作都是對在 upper 做, 。
copy_up只在第一次寫時對檔案做copy_up操作,後面的操作都不再需要做copy_up,都只操作這個檔案,特別適合大檔案的場景。overlay的 copy_up操作要比AUFS相同的操作要快,因為AUFS有很多層,在穿過很多層時可能會有延遲,而overlay 只有兩層。而且overlay在2014年併入linux kernel mailline ,但是aufs並沒有被併入linux kernel mailline ,所以overlay 可能會比AUFS快。
lower檔案系統可以為任何linux支援的檔案系統,甚至可以為另一個overlayfs。因為雖然overlay檔案系統的底層是由兩個檔案系統構成,但它本身只是一個檔案系統,就如前面用df命令看到的,所以也可以和其他檔案系統組成新的overlay檔案系統。而upper是可寫的,不支援NFS。多層 lower 可執行如下命令:
$mount -t overlay overlay -olowerdir=/lower1:/lower2:/lower3 ,upperdir=./upper,workdir=./work ./merged
上例中,lower 是由三個檔案系統合併成一個檔案系統,其中lower1在最上面,lower3在最底下。
Docker一直在用AUFS(高階多層次統一檔案系統)作為容器的檔案系統。AUFS是一個能透明覆蓋一或多個現有檔案系統的層狀檔案系統。當一個程序需要修改一個檔案時,AUFS建立該檔案的一個副本。AUFS可以把多層合併成檔案系統的單層表示。Docker 的image構採用的是AUFS,每個新版本都是一個與之前版本的簡單差異改動,有效地保持映象檔案最小化。那docker 使用 overlay 之後有什麼區別呢?
首先映象在下載時每一層的映象都有一個自己的映象ID,每個映象都會有自己的目錄,儲存在/var/lib/docker/overlay目錄下,但是這些層目錄的名字並不是下載映象時的ID名稱。我們都知道AUFS是多層,那如何體現為兩層呢?啟動一個容器後,也在這個目錄下產生一個層目錄,進入到目錄可以看到有三個資料夾,分別是merged,upper,work,和一個檔案lower-id,而在lower-id中儲存的就是映象最上層的ID,所以對容器來說,還是一個兩層的檔案系統。
這裡說明一下,docker pull image時顯示的映象ID名稱與/var/lib/docker/overlay目錄下的映象目錄名稱不一樣。映象目錄中儲存的是這層獨有的檔案和硬連結下層共享的檔案。這樣可以更有效的利用磁碟資源。
從上面這個圖可以看到,overlay的兩層對應的就是docker的映象層(只讀)和容器層(可寫),只是把原來AUFS中的多層映象合併成了lower層,而upper層代表的是容器層。
我們看到雖然overlay和AUFS都是聯合檔案系統,但結構比AUFS簡單,且併入了linux kernel mainline,可能會比AUFS快,但還是太年輕,要謹慎在生產使用。而AUFS做為docker的第一個儲存驅動,已經有很長的歷史,比較的穩定,且在大量的生產中實踐過,有較強的社群支援。
相關推薦
Openwrt flash分割槽、檔案系統
轉載請註明博主 參考書籍Openwrt智慧路由系統開發 跟hoowa學智慧路由 王偉 孫冰 劉龍著 1、瞭解分割槽 在路由器的flash上時有分割槽的。 openwrt首次刷機完成後,再過一段時間會有以下提示 jffs2: notice: (246) jffs2_b
linux flash、分割槽、檔案系統點滴
1. fdisk是用來檢視硬碟分割槽的,不能檢視flash分割槽,因為flash是沒有所謂的分割槽表。 2. 檢視flash分割槽使用命令cat /proc/partitions。 3. 不像硬碟通過命令分割槽,flash分割槽是Linux核心中實現的。 /** 1. Ub
Linux系統,磁碟、分割槽、檔案系統、格式化、掛載的理解。
1. 背景知識 學習Linux系統應該忘記Windows系統中劃分碟符(C:\。d:\。E:\ ...)的影響。 在Linux的系統中,是通過分割槽來把系統空間劃分成不同的應
Linux 檢視磁碟分割槽、檔案系統、使用情況的命令和相關工具介紹
提要:Linux 磁碟分割槽表、檔案系統的檢視、統計的工具很多,有些工具是多功能的,不僅僅是檢視磁碟的分割槽表,而且也能進行磁碟分割槽的操作;但在本文,我們只講磁碟分割槽的檢視,以及分割槽的使用情況的檢視;本文只是給新手上路之用;關於分割槽工具的操作,我將在以後做專門介紹;此文目的:主要是向初學者介紹一下入
Linux 磁碟分割槽,檔案系統建立、掛載和解除安裝
建立分割槽 (fdisk): 第一步先在Linux的虛擬機器上新增一塊硬碟,新增完成後需要重啟虛擬機器才能夠檢測識別到新硬碟。 重啟系統後可以使用 fdisk -l 命令檢視當前所有磁碟分割槽情況,sdb為我們剛剛建立的新磁碟,可以與上面的sda磁碟對比,發現新磁碟sdb還沒有分割槽。接下來就是為
RHCE——向Linux系統新增磁碟、分割槽和檔案系統
基礎知識 使用fdisk 採用MBR 分割槽方案在磁碟上建立和刪除磁碟分割槽 使用gdisk 採用GPT 分割槽方案在磁碟上建立和刪除磁碟分割槽 使用mkfs 格式化檔案裝置 將檔案系統掛載到目錄樹中 df -h 查詢記憶體使用情況 partprobe /d
[日更-2019.5.22、23] Android 系統的分割槽和檔案系統(二)--Android 檔案系統中的檔案
宣告 Android系統中有很多分割槽,每個分割槽內的檔案系統一般都不同的,使用ADB進入系統/目錄下可發現掛載這很多的目錄,不
Linux學習筆記(4)磁碟分割槽與檔案系統命令
df 檢查檔案系統的磁碟空間佔用情況,引數-a列出全部目錄,引數-h按KB,MB,GB顯示 du 檢車某個目錄或者檔案佔用的磁碟空間,引數-s顯示佔用總空間,引數-sh統計目錄大小 mo
Linux伺服器記憶體、CPU、檔案系統、磁碟IO效能以及網路連通性shell巡檢
shell自動巡檢伺服器基礎配置 每個專案都要部署在伺服器上,那麼伺服器的安全效能和一些基本情況是我們需要了解的,比如伺服器CPU、記憶體、檔案系統、磁碟IO、還有一些網路連通性
TCP/IP協議及配置、檔案系統
TCP/IP協議及配置 • TCP/IP是最廣泛支援的通訊協議集合 – 包括大量Internet應用中的標準協議 – 支援跨網路架構、跨作業系統平臺的通訊 • 主機與主機之間通訊的三個要素 – IP地址(IP address)– 子網掩碼(
spi flash(W25Q64)移植檔案系統LittleFS(作者:wenyun 日期:20180907)
一、移植步驟 注:使用的開發平臺:STM32F103ZET6 1、下載LittleFS原始碼包:https://github.com/ARMmbed/littlefs 2、把原始碼包裡的lfs.h、lfs.c、lfs_util.h、lfs_util.c拷貝到專案中 3、新增以下程式碼
Linux系統的檔案型別、檔案系統的層級結構
目錄 1.檔案型別: 2.檔案系統的層級結構: 注:本文章的系統環境為centos 7 1.檔案型別: -:常規檔案;即f; d: direct
Linux學習之檔案系統管理——回顧分割槽和檔案系統
一、回顧分割槽和檔案系統 1、分割槽型別: 》主分割槽:總共最多隻能分四個 》擴充套件分割槽:只能有一個,也算作主分割槽的一種,也就是說主分割槽加擴充套件分割槽最多有四個。但是擴充套件分球不能儲存資料和格式化,必須再劃分成邏輯分割槽才能使用。 》邏輯分割槽:邏輯分割槽是在擴充套件
你不知道的flash友好的檔案系統
f2fs (Flash-Friendly File System)有很多對SSD友好的特性,主要特性包括: 基於日誌結構 聚焦於優化日誌結構中的wander tree的雪崩效應和清除代價 此外,它還充分利用了SSD的內部的某些特殊指令,以減小WAF,值得試用、借鑑。下邊分享了Linux 環境
核心、裝置、驅動、檔案系統、核心空間、使用者空間
學習驅動過程中有一些疑問,記錄下來,並希望能在2015-6-30之前能夠有一個明確的答案。 疑問: 一、當裝置插上的時候,核心怎麼發現裝置並更新/sys、/dev、/proc檔案系統、怎麼通知給使用者空間?更具體一點是probe的過程 二、device和driver怎麼配對
mkfs格式化分割槽(為分割槽寫入檔案系統)
mkfs 命令非常簡單易用,不過是不能調整分割槽的預設引數的(比如塊大小是 4096 Bytes),這些預設引數除非特殊清況,否則不需要調整。如果想要調整,就需要使用 mke2fs 命令重新格式化。命令格式如下:[[email protected] ~]# mke2fs [選項]
初試 Ceph 儲存之塊裝置、檔案系統、物件儲存
目錄 Ceph 儲存介紹 環境、軟體準備 Ceph 塊裝置 Ceph 檔案系統 Ceph 物件儲存 1、Ceph 儲存介紹 Ceph 是一個開源的分散式儲存系統,包括物件儲存、塊裝置、檔案系統。它可靠性高、管理方便、伸縮性強,能夠輕鬆應對PB
檢視磁碟分割槽的檔案系統格式 檢視分割槽UUID 新增新硬碟,分割槽及掛載
1.檢視磁碟分割槽的檔案系統格式: df -T 只可以檢視已經掛載的分割槽和檔案系統型別; 2.檢視分割槽UUID: sudo blkid .ls -l /dev/disk/by-uuid 3.新增新硬碟,分割槽及掛載: 輸入fdisk -l命令看當前磁碟
Linux 磁碟分割槽和檔案系統
本文以Ext2檔案系統為例講述Linux檔案系統,由於Ext3檔案系統是直接從Ext2檔案系統發展而來,它完全相容Ext2檔案系統,所以本文的內容對於Ext2和Ext3都是適用的。 我們首先看一下磁碟分割槽和檔案系統的結構圖: 圖 1 磁碟分割槽和檔案系統結構圖
linux下檢視磁碟分割槽的檔案系統格式
原文連結:https://www.cnblogs.com/youbiyoufang/p/7607174.html-------------------------------------------------------------------------df -T 只可以