overlayfs之替換根目錄


簡介

Overlayfs是一種類似aufs的一種堆疊文件系統,於2014年正式合入Linux-3.18主線內核。

參考:
深入理解overlayfs(一):初識
深入理解overlayfs(二):使用與原理分析

overlayfs 主要有四個目錄:
lower:底層目錄,一般放置只讀文件
upper:上層目錄,一般是可讀寫的
merge:upper和loader合並后的目錄
work:一些中間、臨時文件

overlayfs最基本的特性,簡單的總結為以下3點:(1)上下層同名目錄合並;(2)上下層同名文件覆蓋;(3)lower dir文件寫時拷貝。這三點對用戶都是不感知的。
overlayfs結構
簡單舉例來說,
如果我在merge新創建了文件,那么文件會出現在upper;
如果刪除了一個merge中已有的來自upper的文件,那么upper中也會刪除;
如果刪除了一個merge中已有的來自lower的文件,那么lower中不會變化,只是在merge中屏蔽。

很簡單就可以驗證,只需要創建以上四個目錄,然后執行

mount -t overlay overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work /merge

這種應用方式比較簡單,詳細原理可以看參考,重點是下節。

overlay_init腳本

此腳本可以實現將系統原rootfs從根目錄轉移到其他位置,轉而將overlay合並后的目錄作為根目錄,這樣對於用戶是沒有任何感覺的,但是卻做到了安全隔離,防止損壞原系統。
tip:可以將腳本放到 /rtc/init.d/中讓其開機自啟動,掛載

#!/bin/sh
 
if [ ! -d /overlay ]
then
	mkdir /overlay
fi
mount -t ext4 /dev/mmcblk0p9 /overlay

if [ ! -d /rom ]
then
	mkdir /rom
fi

if [ ! -d /overlay/merge ]
then
	mkdir -p /overlay/merge
fi

if [ ! -d /overlay/upper ]
then
	mkdir -p /overlay/upper
fi

rm -rf /overlay/work
mkdir -p /overlay/work

mount -t overlay overlay -o lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work /overlay/merge

bin/mount -o noatime -v --move /proc /overlay/merge/proc && \
pivot_root /overlay/merge /overlay/merge/rom && {
#mount /dev/mmcblk0p7 /rom/oem #之前mountall.sh掛載就可以不用再掛了
#mount /dev/mmcblk0p9 /rom/data

bin/mount -o noatime -v --move /rom/dev /dev
bin/mount -o noatime -v --move /rom/tmp /tmp
bin/mount -o noatime -v --move /rom/run /run
bin/mount -o noatime -v --move /rom/sys /sys
bin/mount -o noatime -v --move /rom/oem /oem
bin/mount -o noatime -v --move /rom/data /data
bin/mount -o noatime -v --move /rom/overlay /overlay 
#bin/mount -o noatime -v --move rom/mnt /mnt

步驟理解:

  1. 創建相應目錄。
  2. 掛載一個可讀寫的物理分區到overlay。
  3. 創建目錄。
  4. 掛載,將根目錄作為lower,這樣意味着原來的根目錄是用戶不可以修改的;上層目錄用來存放可以修改的文件,這里其實隨便來一個就行,因為之中的文件一定是掛載動作之后產生的;work略過;merge點在/overlay。
  5. 將/proc切換,因為其中是系統運行所需的資源。
  6. pivot_root是一個系統命令,將現在的根目錄移動到/overlay/rom,/overlay作為新的根目錄。這樣相當於新的根目錄中會有一個rom目錄存放原來的(或者說不想被修改的)根目錄。
  7. 注意腳本前是否掛載過oem、data等其他物理分區,如果沒有記得掛載,可以掛在rom里再移出來,也可以等8完成直接掛在新的根下。
  8. 將原來的根下的一些目錄移動掛載出來,這樣他們就是可以直接讀寫,而不用做為upper。
    2、4、6是關鍵點
    overlay結果.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM