Apakah menggunakan sistem file root hanya baca ide yang bagus untuk pengaturan tertanam?

15

Saya telah ditugaskan menjalankan Linux sebagai sistem operasi pada perangkat yang disematkan.

Target memiliki prosesor x86 dan memiliki perangkat CompactFlash 8 GB untuk penyimpanan.

Saya telah berhasil menggunakan buildroot untuk membuat kernel image dan alat kompilasi silang. Saya telah mempartisi perangkat CF menjadi partisi FAT kecil di mana gambar kernel berada serta syslinuxkonfigurasi boot dan ext3sistem file di mana saya telah mendekompresi sistem file root yang dihasilkan oleh buildroot.

Sistem melakukan booting berhasil menggunakan syslinuxdengan mengatur direktori root ke partisi CF ext3 di mana sistem file buildroot saya berada.

Pertanyaan saya terpusat di sekitar perlunya ketahanan dalam menghadapi kehilangan daya langsung (dan sering) karena sangat penting bagi perangkat untuk boot berhasil setelah pemadaman listrik. Saya telah membaca bahwa memasang sistem file root sebagai hanya baca adalah cara untuk memastikan integritas data. Apakah ini cara yang masuk akal bagi saya untuk melanjutkan?

Saya juga telah membaca tentang kemungkinan memuat sistem file root ke dalam RAM untuk mencapai hal yang sama tetapi belum tahu bagaimana melakukannya.

Adakah cara yang lebih disukai untuk mencapai tujuan ini dan jika demikian apa cara terbaik bagi saya untuk melanjutkan?

ahli matematika1975
sumber

Jawaban:

11

Jawaban baru (2015-03-22)

( Catatan: Jawaban ini lebih sederhana dari sebelumnya, tetapi tidak lebih aman. Jawaban pertama saya lebih kuat karena Anda dapat menyimpan file hanya-baca oleh opsi pemasangan fs sebelum flag izin. Jadi memaksa untuk menulis file tanpa izin untuk menulis tidak akan berfungsi sama sekali.)

Ya, di bawah Debian , ada paket: fsprotect ( beranda ).

Ini menggunakan aufs(secara default, tetapi bisa menggunakan unionfsalat lain ) untuk mengizinkan perubahan sesi langsung tetapi dalam RAM secara default, jadi semuanya dilupakan saat reboot.

Anda dapat menginstalnya dengan menjalankan:

apt-get install fsprotect

Setelah selesai, dari dokumen online:

Setelah itu:

  • Edit /boot/grub/menu.lstatau /etc/default/grub2atau /etc/lilo.confdan tambahkan " fsprotect=1G" ke parameter kernel.
  • Ubah 1G sesuai kebutuhan.
  • Terapkan perubahan (mis. Jalankan update-grub)
  • Edit /etc/default/fsprotectjika Anda ingin melindungi filesystem selain /.
  • reboot

Anda mungkin juga ingin melindungi kata sandi bootloader grub atau melarang perubahan apa pun.

Dari sana, jika beberapa file dilindungi terhadap perubahan, untuk sampel oleh

chmod ugo-w myfile

jika Anda menggunakan untuk sampel vi myfiledan mencoba untuk menulis di atasnya dengan perintah :w!, ini akan berhasil dan Anda myfilemenjadi berubah. Anda dapat memulai ulang untuk mengambil yang belum dimodifikasi myfile.

Itu bahkan tidak mungkin dengan solusi pertama saya berikut:

Jawaban lama (pertama):

Ya, ini adalah solusi yang kuat, tetapi kuat!

Membuat r / o bisa digunakan

Anda harus memasang beberapa direktori di rw , like /var, /etcdan mungkin /home. Ini bisa dilakukan dengan menggunakan aufs atau unionfs . Saya suka ini dengan cara lain , menggunakan /dev/shmdan mount --bind:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

Anda bisa sebelumnya, pindahkan semua direktori yang tidak harus berubah dalam operasi normal di static-var, daripada membuat symlink di / var:

mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on

Jadi ketika remounting di ro, menyalin /vardi /dev/shmtidak akan memakan banyak ruang karena sebagian besar file dipindahkan ke /static-vardan hanya symlink yang akan disalin dalam ram.

Cara yang lebih baik untuk melakukan ini dengan baik adalah membuat siklus daya penuh, satu hari kerja penuh dan menjalankan perintah seperti:

find / -type f -o -type f -mtime -1

Jadi Anda akan melihat file mana yang perlu ditempatkan di partisi baca-tulis.

Penebangan

Karena di host ini tidak ada memori statis yang dapat ditulisi, untuk menyimpan histori dan log lainnya, Anda harus mengkonfigurasi syslogserver jarak jauh .

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

Dengan cara ini, jika sistem Anda rusak karena alasan apa pun, semua yang sebelumnya dicatat.

Perbaikan

Ketika menjalankan dengan beberapa yang mount --bindsedang digunakan, untuk melakukan upgrade seperti itu ketika sistem sedang digunakan (tanpa perlu menjalankan init 1, untuk mengurangi down-time), cara sederhana adalah dengan membangun kembali root bersih , dapat melakukan upgrade:

Setelah mengount ulang '/' dalam mode baca-tulis :

mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /

Dan sekarang:

shutdown -r now
F. Hauri
sumber
Terima kasih atas jawaban anda. Saya tidak sepenuhnya memahaminya karena kemampuan Linux saya tidak bagus saat ini. Ini masih sangat membantu dan memberi saya beberapa area untuk diteliti.
ahli matematika1975
Jawaban diedit! Solusi baru dan menjelaskan perbedaan!
F. Hauri
Ini tidak menjawab pertanyaan, ini adalah jawaban yang bagus untuk sistem berbasis debian, tetapi Buildroot bukan berbasis debian.
LovesTha
@LovesTha Lihatlah jawaban Old (pertama) ! Ini kurang berbasis Debian dan Anda dapat memahami prinsip dan mekanisme yang sama yang tidak penting untuk segala jenis distribusi / instalasi. (bahkan jika bagian Peningkatan menunjukkan perintah Debian, Anda dapat melakukan hal yang sama untuk peningkatan manual atau upgrade berbasis distrib lainnya.)
F. Hauri
Jawaban lama Anda akan menjadi jawaban yang bagus untuk pertanyaan umum tentang pengaturan hanya baca sistem Linux. Setelah saya menyelesaikan penjelajahan saya untuk membuat buildroot kami hanya dibaca, saya berharap untuk kembali dan memberikan jawaban yang terperinci pada pertanyaan spesifik di sini. Buildroot sudah memiliki bit sementara / var yang dikaitkan dengan / tmp yang merupakan tempfs. / etc seharusnya tidak digunakan sebagai ruang awal untuk program, jadi tidak perlu ditangani secara khusus.
LovesTha
3

Saya hanya punya pengalaman menggunakan buildroot yang lebih baru (2014-02). Dalam versi itu Anda dapat menonaktifkan 'remount root filesystem boot baca-tulis duing' dalam file konfigurasi dengan:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW tidak disetel

Saya berhasil membuat gambar yang hanya menggunakan ext4 / partisi sebagai hanya membaca sehingga mencabut kekuatan sistem tidak ada salahnya sama sekali. Ini berfungsi dengan baik, jadi jika Anda tidak perlu menulis ke sistem file Anda, mungkin ini adalah solusi yang jauh lebih sederhana daripada yang disebutkan di atas (yang tampaknya lebih atau kurang berlaku untuk sistem Debian karena mengacu pada apt-get).

barang dagangan
sumber
Terima kasih atas jawabannya - namun pada akhirnya saya memilih setup initramfs dengan memasang hanya beberapa direktori dengan opsi sinkronisasi pada drive CF untuk kegigihan data. Ini telah membantu saya dengan cukup baik untuk saat ini.
ahli matematika1975
Untuk menambah ini: menggunakan versi buildroot yang lebih lama, periksa /etc/inittabapakah remounting /terjadi di sana. Jika demikian, ubah sesuai kebutuhan Anda.
evnu
Jawaban ini adalah bagian penting dari 'cara membangun' untuk melakukannya. Sebagian besar saran dalam jawaban yang diterima akan diperlukan untuk membuat sistem yang lebih kompleks bekerja. Kemungkinannya adalah bahwa semua yang perlu dilakukan adalah menyiapkan beberapa symlink tambahan ke / tmp (tempfs) dan semuanya berfungsi.
LovesTha