Jadikan readonly / etc dapat ditulis

11

Saya sedang berurusan dengan perangkat tertanam yang menjalankan Linux. Pabrikan perangkat ini telah mengaturnya sehingga memuat sistem file root sebagai hanya baca.

Dari / etc / mtab:

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

Ini berarti bahwa saya tidak dapat memodifikasi file apa pun di dalam / etc, seperti menambahkan pengguna baru.

Saya sudah mencoba me-remount direktori root:

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

tapi saya hanya mendapatkan kesalahan

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

Saya mencari kesalahan ini dan orang-orang mengatakan untuk menggunakan blockdev. Sistem tidak memiliki blockdev yang diinstal, jadi saya membuat kompilasi silang dan menyalinnya. Lalu aku berlari

blockdev --setrw rootfs

tapi sekali lagi saya mendapat kesalahan:

blockdev: cannot open rootfs: No such file or directory

Apakah mungkin membuat / etc dapat ditulisi jika belum? Saya memiliki akses root ke sistem, tetapi saya tidak dapat mengakses sistem file 'offline', semua perubahan harus dilakukan melalui perintah Bash.

Joshua Walsh
sumber

Jawaban:

19

squashfsadalah sistem file terkompresi read-only. Tidak memiliki ketentuan untuk melakukan modifikasi setelah dibuat. Jadi, Anda tidak dapat menulis kepadanya meskipun perangkat blok yang mendasarinya dapat dibuat dapat ditulisi. Anda perlu membuat gambar squashfs baru dari keseluruhan sistem file dengan modifikasi Anda dan membakarnya ke perangkat penyimpanan tempat sistem file itu disimpan, yang akan bermasalah untuk dilakukan dari sistem live.

Opsi lain adalah memasang sistem file yang berbeda /etc. Itu bisa melalui mount union jika didukung oleh kernel, yang menggabungkan dua sistem file bersama-sama biasanya dengan satu sistem file merekam hanya perubahan pada sistem file read-only dasar .

Periksa dukungan untuk AUFS_FS atau OVERLAY_FS di konfigurasi kernel.

Sebagai contoh untuk me-union-mount direktori di /tmp(mudah-mudahan bisa ditulis meskipun mungkin tmpfsdalam memori (jadi tidak persisten saat reboot) dalam kasus Anda jika sistem tidak memiliki penyimpanan permanen yang dapat ditulis)

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

Maka /etcakan dapat ditulisi dan modifikasi yang Anda buat akan benar-benar disimpan /tmp/etc/upper.

Atau, jika hanya beberapa file yang ingin Anda modifikasi, Anda dapat mengikatnya (ya Anda dapat me-mount pada file apa pun, tidak hanya direktori) dari versi yang disimpan dalam sistem file yang dapat ditulis:

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

Maka /etc/passwdakan bisa ditulisi. Tentu saja Anda juga bisa melakukan itu untuk keseluruhan /etc. ( cp -a /etc /tmp && mount --bind /tmp/etc /etc).

Stéphane Chazelas
sumber
Beberapa sistem tertanam dapat mengganti file pada /etcsaat boot berdasarkan pengaturan tertentu di nvram. Jadi, untuk mengubah file di /etcAnda akan menetapkan variabel sistem "ajaib", komit ke nvram, lalu muat ulang konfigurasi atau reboot. Sebagian besar router rumahan bekerja seperti itu. Tetapi mekanisme dan perintah yang tepat adalah spesifik sistem.
Satō Katsura
Sempurna! Perangkat tidak mendukung mount overlay, tetapi mengikat file khusus di atas file di / etc berfungsi dengan sangat baik! Terima kasih atas bantuan Anda.
Joshua Walsh