Re: [問題] 開機時根目錄用aufs, move mount

看板Linux作者 (幽光)時間13年前 (2012/10/19 09:44), 編輯推噓3(3016)
留言19則, 3人參與, 最新討論串2/2 (看更多)
回文太多又太長,我就直接回文了, 小弟退伍後是到某公司做thin client的,常常跟aufs在做搏鬥, 這邊略為闡述一下小弟的心得,若有謬誤之處望各位前輩指正。 Q:為何要squashfs配aufs? A:squashfs的壓縮率很高,直接把squshfs掛起來當作/是目前distro livecd主流作法。 當我們一片live cd開機進去系統時,你明明整個檔案系統是在一片光碟上,那應該是 唯獨的,但是我們卻可以任意touch檔案,為什麼?因為系統在/上鋪了一層aufs。 檔案系統(兩個類似bind在一起) | ------- 唯 可 讀 寫 squashfs aufs 如果我們在上面更改任何一個檔案,aufs會把更改後的檔案存在它那邊,把原本的唯獨 的檔案藏起來,也因為aufs是存在ram裡面的,一旦開機重開之後,aufs就重新鋪回去, 之前做的修改也就都不見了,整個系統就恢復原狀。 Q:掛aufs有沒有什麼限制? A:有,你在自己底下掛自己是OK的,但是一定要跳出來再回去,否則不會生效。 例如我現在在/home底下執行: sudo mount -n -t aufs -o "br:/wfs/aufs//home=rw://home=ro" aufs //home 我如果沒有cd ..出去再進來,那麼/home的aufs就不會生效。 這產生了一個問題: 該死,我已經在/底下了,我如果這時候要掛/為aufs,我跳不出來!! 只有一個辦法,就是先在initrd/initramfs先掛好,因為當時你的/跟pivot chroot進 真正的/是不同的。這個問題在ubuntu下有詳述做法: https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash 這邊也有個project在做這個(簡介:不讓愚蠢的使用者破壞我們心愛的系統): http://code.google.com/p/rootaufs/ 上述兩個作法是需要initrd/initramfs的。 Q:有別的想法嗎? A:我們重新檢視一下,為什麼我們要掛整個系統是aufs??我是說,有人平常會在 /底下隨便touch檔案或是把東西丟到那邊嗎?我想不會,大部分的時候,我們只不過 是在/home/user底下作業而已,所以真正該掛的目錄其實只有: 1. /etc 2. /home 3. /usr/share 大概就這樣,/var 跟 /tmp系統在mountall時會幫你mount成tmpfs,剩下就讓它唯獨吧。 好處是你不用重新更改initrd/initramfs,你只要新增一個開機script丟在mountall之前 做aufs就好了。 不過我因為要開發東西,有時候懶得重新把squshfs燒到flash上,所以我多mount了幾個 資料夾: 1. /bin 2. /sbin 3. /lib 4. /opt 5. /usr (就不用mount /usr/share了) 因為平常dpkg或是apt-get套件,東西大部分會丟這幾個資料夾。 這樣衍生了一個問題,/ 是唯獨,apt-get會出錯: 我發了一個ask 在 launchpad上: https://answers.launchpad.net/ubuntu/+source/util-linux/+question/210118 那個時候,我的解法是下參數 --instdir=來解決。 可是這樣還是有一小部份帶有postinst script 的 package不能裝。 直到我的經理翻出了linux kernel squashfs給我看: fs/squashfs/super.c: 有一個初始函式squashfs_fill_super 中有一行: sb->s_flags |= MS_RDONLY; 難怪我在kernel cmdline下明明都下rw,進系統後還是ro。因為根本就強制幫你加上去。 註解掉這一行後,你就可以騙系統,把squashfs mount成rw了。反正你硬要touch,系統 還是會阻止你。但是,現在就可以騙過dpkg跟apt-get了。 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.74.105

10/19 14:39, , 1F
好像也有 live CD 是用 device mapper 來作這件事(?)
10/19 14:39, 1F

10/19 15:13, , 2F
其實我比較好奇的是:為什麼我用的方法會出問題
10/19 15:13, 2F

10/19 20:56, , 3F
你第二個部分講的只掛一部分,我現在就是這樣做
10/19 20:56, 3F

10/19 20:58, , 4F
想把整個/掛起來,算是好玩吧?我現的在想法是:不知到aufs怎麼
10/19 20:58, 4F

10/19 21:00, , 5F
認br:的路徑,因為我平常看到的作做都是: /ro /rw 直接在/下
10/19 21:00, 5F

10/19 21:02, , 6F
mount -t aufs -o br=/rw:/ro /root,再用move mount吧/ro,rw
10/19 21:02, 6F

10/19 21:02, , 7F
放到/root/ro,rw 再exec chroot
10/19 21:02, 7F

10/19 21:03, , 8F
可是現在看到的(debian6)的做法(沒有用aufs時)是:
10/19 21:03, 8F

10/19 21:05, , 9F
mount device /root, 然後用klibc的run_init
10/19 21:05, 9F

10/19 21:09, , 10F
run_init先cd /root,清掉tmpfs,再mount('.','/',0,MS_MOVE,0)
10/19 21:09, 10F

10/19 21:13, , 11F
再chroot('.'), chdir('/'), exec(init)
10/19 21:13, 11F

10/19 21:43, , 12F
這次放假我試試,要不然我只能跟學長要他的script來看。
10/19 21:43, 12F

10/20 00:10, , 13F
我是弄得出來沒有問題, 只是好奇為什麼這一個方法行不通啦
10/20 00:10, 13F

10/20 00:13, , 14F
是說你第一部分講的:要跳出再跳入,其實在mountpoint那一層
10/20 00:13, 14F

10/20 00:13, , 15F
cd . 就可以了
10/20 00:13, 15F

10/20 00:15, , 16F
現在是在想move mount有沒有干擾到aufs
10/20 00:15, 16F

10/20 00:43, , 17F
剛看了一下code,好像是用一開始拿到的directory struct去讀原
10/20 00:43, 17F

10/20 00:43, , 18F
本的檔案系統上的東西?
10/20 00:43, 18F

10/20 00:44, , 19F
跟kernel不熟,其實不太懂中間的很多操作
10/20 00:44, 19F
文章代碼(AID): #1GWB1igE (Linux)
文章代碼(AID): #1GWB1igE (Linux)