Ubuntu 唯讀系統

在前一篇提到了Win10 企業版唯讀系統 ,這篇要來寫一下 Ubuntu 下的唯讀系統。Ubuntu 下的機制相對比較瞭解,Kernel 載入這個過程本來就是唯讀的,而在 mount  filesystem 時,就以readonly的模式來完成,這樣基本上就是唯讀的了。接著在透過 overlayfs 來決定將暫存資料,寫在 RAM 或者是  DISK 內。寫在 RAM 的就是重開就不見,寫在 DISK 的則是下次重開還會在。

不過說歸說,要每個步驟自己設定起來可能還是要研究一下陣子,好在現在都有現成的安裝包可以完成這些功能了。

Ubuntu Overlayroot

要實現 readonly 系統,在 Ubuntu 下只要安裝 overlayroot 這個套件就可以了。

設定選項也很簡單,編輯 /etc/overlayroot.conf 最後面的  overlayroot 欄位,簡單來說設定有三個選項

  • overlayroot=”disabled” : 關閉唯讀系統
  • overlayroot=”tmpfs” : 將暫存資料寫在 RAM 裡
  • overlayroot=”/dev/sdaX” : 將暫存資料寫在 DISK 內,下次重開還會在。

關於將暫存資料寫在DISK內,這邊跟 Windows 比較不一樣。Windows 是重開就不見,而 Linux 則仍然會存在,這是利用 Linux overlayfs 的功能,讓使用者可以對唯讀系統做”修改”。但只要將 overlayroot 功能關閉或切換成RAM,就會看到原本的系統。

另外 「/dev/sdaX」也要依自己的設定,指向一塊專屬的磁碟分區,而此分區要是一個已經可以掛載的系統,這點是要注意的。系統會在裡面產生兩個目錄「overlay」與「overlay-working」,用來記錄檔案的變更。

用 sda5 來暫存

要用哪一個分割來暫存,可以 fdisk -l 來觀看有哪些分割可用。以我測試的系統來說,就是以 /dev/sda5 來做測試。如果該分割還沒使用過,可用 mkfs.ext4 來做格式化。

檢視狀態

要看目前的設定,除了要看 /etc/overlayroot.conf 內的設定外,還要看一下目前設定是否生效。是否生效,可以下達 df| grep root-rw

 

以磁碟為暫存

 

以RAM為暫存

若沒有顯示任何東西,則代表唯讀狀態沒有啟用。

變更暫存設定

如果你看到這邊之前就已經開始試的話,可能會發現一但設定了 RAM 或 DISK 暫存,就無法再變更設定了,甚至也不能停用。這是因為開機過程,overlayroot 讀取的設定是原本的資料,而非暫存的資料。因此要先在開機中就從GRUB中停用 overlayroot,才能變更設定,這點的確是比較麻煩。

要停用 overlayroot ,需要在開機 GRUB 時,在 Kernel Option 加入一行 “overlayroot=disabled”。步驟如下

進入 Grub 選單

電腦重開機,重覆按 ESC 鍵,就可以看到 GRUB 的選單。

Grub 選單

編輯選項

在預設的選項上按 “e“,就可以編輯該選項的參數。找到一行 linux 開頭的文字,這就是開機參數,在最後面加入 “overlayroot=disabled” 。

加入開機參數

然後按下 Ctrl+x ,就可以此設定進行開機。

如果有需要常常修改這些設定,也可以考慮直接在 Grub 選單裡新增一個選項,就不用手動變更了。

修改 Overlayroot 設定

進入 Linux 後,此時可用剛說的 “df | grep root-rw” 來確定是否唯讀狀態已關閉,命令下達後若沒任何訊息就代表已關閉。此時再去修改 /etc/overlayroot.conf 的選項,重開後就可讓新設定生效。

刪除 overlayroot=DISK 內容

使用 overlayroot=”DISK”,經過一段時間後可能會覺得系統變亂了。此時可以先重開,透過 GRUB 關閉 overlayroot,進 Linux 後將該分割重新格式化,或刪除裡面的兩個 overlay 和 overlay-working 目錄,就可以恢復原始的狀態了。

結語

雖然說本文是以唯讀系統做title,但本質是唯讀系統+overlayfs,就看 overlay 的系統要放在 RAM 還是 DISK 上。Windows 上的DISK選項重開後並無效,也許只是我沒有研究到這麼深入,有需要的人也許可以再研究多一點了。

參考資料

本文是參考這篇「Protecting the Root Filesystem on Ubuntu with Overlayroot」完成的。

Latest Comments

Leave a Reply(Name請以user_開頭,否則會被判定會垃圾息)

請輸入答案 3 × 3 =