Apakah mungkin untuk memasang file loopback sebagai hanya-baca, dan mengarahkan semua tulis ke RAM?
sumber
Apakah mungkin untuk memasang file loopback sebagai hanya-baca, dan mengarahkan semua tulis ke RAM?
Dimungkinkan menggunakan lapisan sistem berkas gabungan seperti aufs .
Demo:
# dd if=/dev/zero of=/tmp/image bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.0028428 s, 369 MB/s
# mke2fs /tmp/image
...
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
Opsi pemasangan itu untuk membuat "cabang" baru ( br
) dengan menumpuk /tmp/rammnt
(baca-tulis) di atas /tmp/imgmnt
(hanya baca). "Cabang" ini dibuat terlihat sebagai sistem file (baca-tulis) aktif /tmp/combined
.
(Lihat halaman manual aufs (5) untuk semua detailnya.)
Sekarang semua sudah selesai, inilah yang Anda miliki:
# ls /tmp/combined
hello.txt lost+found
# cat /tmp/combined/hello.txt
hello
# echo bye > /tmp/combined/hello.txt
# cat /tmp/combined/hello.txt
bye
# cat imgmnt/hello.txt
hello
# cat rammnt/hello.txt
bye
Jadi tulis "berhenti" di sistem tmpfs
file, mereka tidak berusaha untuk menyebar kembali ke file gambar loop-mount.
Anda bisa menggunakan direktori biasa (pada sistem file baca / tulis), atau mungkin direktori di bawah /dev/shm
jika itu berfungsi untuk Anda, alih-alih membuat spesifik tmpfs
untuk itu.
Teknik ini (atau variasi daripadanya) digunakan oleh beberapa LiveCD distribusi. Entri Wikipedia aufs mencantumkan beberapa.
fstab
, sehingga titik mountnya adalah/
? (Yaitu, sistem melakukan booting dari gambar yang bisa dibuang, cukup banyak.)/
, saya yakin Anda lebih baik dengan initrd (begitulah yang dilakukan untuk livecds saya percaya). Anda mungkin dapat melakukannya dari skrip init meskipun itu terdengar rumit.Memperbarui:
Tampaknya ada 2 cara lain yang lebih sederhana untuk melakukan ini di Ubuntu (setidaknya versi yang lebih baru):
sudo apt-get install overlayroot
diikuti dengan menetapkanoverlayroot="tmpfs:swap=1,recurse=0"
di/etc/overlayroot.local.conf
.sudo apt-get install fsprotect
diikuti dengan meneruskanfsprotect
sebagai parameter kernelSaya akhirnya menemukan cara untuk melakukan ini dengan sistem file root (di Ubuntu 11.04)!
Langkah-langkah untuk membuat sistem dapat di-boot adalah sederhana. Saya menggunakan panduan ini dalam kombinasi dengan panduan ini dan banyak pencarian web untuk mengetahui cara membuatnya berfungsi dengan baik, tanpa bug.
Ringkasan:
Menjalankan:
Simpan ini untuk
/etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Saya tidak berpikir nama sebenarnya penting, tetapi awalnya__
mungkin digunakan untuk tujuan pemesanan, jadi jika Anda mengubah nama, Anda mungkin ingin mempertahankan garis bawah. (Ini adalah salinan file ini .)Di
/etc/default/grub
, cari baris yang dimulai denganGRUB_CMDLINE_LINUX_DEFAULT
, dan di dalam tanda kutip yang mengikuti, tambahkan parameteraufs=tmpfs
.Bonus: Jika Anda perlu sesekali mematikan pengalihan sementara, cukup hapus argumen ini dari daftar parameter kernel. Anda mungkin dapat melakukan ini dengan menahan tombol Shift ketika sistem boot, untuk menampilkan menu GRUB; lalu tekan e untuk mengedit parameter, dan hapus saja
aufs=...
parameter dari daftar.Tambahkan baris ini ke
/etc/sysctl.conf
. ( Peringatan : Risiko keamanan potensial.)Jalankan baris ini:
Jika semuanya berjalan dengan baik, ketika Anda reboot, Anda akan melakukannya ke sistem file sementara. Bagian RAM akan berada pada
/rw
, dan disk image akan berada di/ro
, tetapi tentu saja itu akan menjadi hanya-baca.Namun demikian, jika Anda telah mem-boot ke sistem sementara tetapi perlu melakukan perubahan permanen, Anda dapat memasang kembali
/ro
sistem file dengan mengatakanuntuk membuatnya dapat ditulis, dan kemudian Anda dapat membuat modifikasi apa pun yang diperlukan untuk direktori itu.
sumber
Ya, oleh unionfs, lihat unionfs.filesystems.org . Anda telah me-mount filesystem read-only pertama, dan sebagai filesystem read-write RAM kedua melalui unionfs.
Di Ubuntu Anda dapat menemukan paket unionfs-fuse, yang merupakan implementasi lain dari hal-hal yang sama, tetapi dalam ruang pengguna, bukan sebagai modul kernel.
sumber
Anda juga dapat melakukan ini pada tingkat perangkat, tanpa serikat seperti auf. Lihat device-mapper
snapshot-origin
.sumber