使唯讀 /etc 可寫

使唯讀 /etc 可寫

我正在處理運行 Linux 的嵌入式設備。該設備的製造商已將其設定為以唯讀方式載入根檔案系統。

來自 /etc/mtab:

rootfs / rootfs rw 0 0
/dev/root / squashfs ro,relatime 0 0

這意味著我無法修改 /etc 中的任何文件,例如新增使用者。

我嘗試重新掛載根目錄:

mount -o remount,rw -t squashfs /dev/root /

但我只是收到一個錯誤

mount: cannot remount block device /dev/root read-write, is write-protected

我查了一下這個錯誤,人們說要用 blockdev。系統沒有安裝blockdev,所以我交叉編譯了它並複製了它。然後我跑了

blockdev --setrw rootfs

但我再次收到錯誤:

blockdev: cannot open rootfs: No such file or directory

如果 /etc 尚未可寫,是否可以使其可寫?我擁有系統的 root 存取權限,但無法「離線」存取檔案系統,所有變更都必須透過 Bash 命令完成。

答案1

squashfs是唯讀壓縮檔案系統。一旦創建,就無法對其進行修改。因此,即使底層塊設備可寫,您也無法對其進行寫入。您需要根據您的修改建立整個檔案系統的新 squashfs 映像,燒傷將其傳輸到儲存該檔案系統的儲存設備,這在即時系統中會出現問題。

另一種選擇是在 上安裝不同的檔案系統/etc。如果核心支援的話,它可以透過聯合掛載來實現,它將兩個檔案系統合併在一起,通常一個檔案系統只記錄對一個檔案系統的變更。根據只讀檔案系統。

檢查核心配置中是否支援 AUFS_FS 或 OVERLAY_FS。

例如,如果系統沒有永久可寫存儲,則聯合掛載一個目錄/tmp(希望可寫,但可能在內存中(因此在重新啟動後不會持久))tmpfs

mkdir -p /tmp/etc/work /tmp/etc/upper
mount -t overlay \
      -o lowerdir=/etc,upperdir=/tmp/etc/upper,workdir=/tmp/etc/work \
       overlay /etc

然後/etc將是可寫的,並且您對其所做的修改實際上將存儲在/tmp/etc/upper.

或者,如果您只想修改幾個文件,您可以從儲存在可寫入文件系統中的版本綁定掛載它們(是的,您可以掛載到任何文件,而不僅僅是目錄):

cp /etc/passwd /tmp
mount --bind /tmp/passwd /etc/passwd

然後/etc/passwd就可以寫了。當然,您也可以整體這樣做/etc。 ( cp -a /etc /tmp && mount --bind /tmp/etc /etc)。

相關內容