Dimungkinkan menggunakan lapisan sistem file gabungan seperti aufs.
Demo:
Buat gambar sistem file
# 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
...
Pasang, isi
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
Pasang hanya-baca
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
Sistem file RAM kecil
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
Gabungkan keduanya
# 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 berkas (baca-tulis) pada /tmp/combined
.
(Lihat halaman manual aufs(5) untuk semua detailnya.)
Sekarang semua 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 tulisan "stop" di tmpfs
filesystem, mereka tidak berusaha menyebarkan kembali ke file gambar yang terpasang di loop.
Anda dapat menggunakan direktori biasa (pada sistem file baca/tulis), atau mungkin direktori di bawah /dev/shm
jika itu berhasil untuk Anda, alih-alih membuat tmpfs
tertentu untuk itu.
Teknik ini (atau variasinya) digunakan oleh beberapa distribusi LiveCD. Entri aufs Wikipedia mencantumkan beberapa.
Pembaruan:
Sepertinya ada 2 cara lain yang lebih sederhana untuk melakukan ini di Ubuntu (setidaknya versi yang lebih baru):
-
sudo apt-get install overlayroot
diikuti dengan pengaturanoverlayroot="tmpfs:swap=1,recurse=0"
di/etc/overlayroot.local.conf
. -
sudo apt-get install fsprotect
diikuti dengan meneruskanfsprotect
sebagai parameter kernel
Saya akhirnya menemukan cara melakukan ini dengan sistem file root (di Ubuntu 11.04)!
Langkah-langkah untuk membuat sistem dapat di-boot sangatlah sederhana. Saya menggunakan panduan ini dalam kombinasi dengan panduan ini dan banyak penelusuran web untuk mengetahui cara membuatnya berfungsi dengan baik, tanpa bug.
Ringkasan:
-
Jalankan:
sudo apt-get install fsprotect apparmor-utils
-
Simpan ini ke
/etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Menurut saya nama sebenarnya tidak penting, tetapi awal__
mungkin digunakan untuk tujuan pengurutan, jadi jika Anda mengubah nama, Anda mungkin ingin mempertahankan garis bawah.(Ini adalah salinan dari file ini.)#!/bin/sh -e case $1 in prereqs) exit 0 ;; esac for x in $(cat /proc/cmdline); do case $x in root=*) ROOTNAME=${x#root=} ;; aufs=*) UNION=${x#aufs=} case $UNION in LABEL=*) UNION="/dev/disk/by-label/${UNION#LABEL=}" ;; UUID=*) UNION="/dev/disk/by-uuid/${UNION#UUID=}" ;; esac ;; esac done if [ -z "$UNION" ]; then exit 0 fi # make the mount points on the init root file system mkdir /aufs /ro /rw # mount read-write file system if [ "$UNION" = "tmpfs" ]; then mount -t tmpfs rw /rw -o noatime,mode=0755 else mount $UNION /rw -o noatime fi # move real root out of the way mount --move ${rootmnt} /ro mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro # test for mount points on union file system [ -d /aufs/ro ] || mkdir /aufs/ro [ -d /aufs/rw ] || mkdir /aufs/rw mount --move /ro /aufs/ro mount --move /rw /aufs/rw # strip fstab off of root partition grep -v $ROOTNAME /aufs/ro/etc/fstab > /aufs/etc/fstab mount --move /aufs /root exit 0
-
Di
/etc/default/grub
, temukan 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 melakukannya dengan menahan tombol Shift saat sistem melakukan booting, 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 :Potensi risiko keamanan.)kernel.yama.protected_nonaccess_hardlinks = 0 kernel.yama.protected_sticky_symlinks = 0
-
Jalankan baris ini:
sudo aa-complain dhclient3 sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs sudo update-initramfs -k all -u sudo update-grub
Jika semuanya berjalan dengan baik, saat Anda reboot, Anda akan melakukannya ke dalam sistem file sementara. Bagian RAM akan berada di /rw
, dan disk image akan berada di /ro
, tapi tentu saja itu hanya bisa dibaca.
Namun demikian, jika Anda telah mem-boot ke sistem sementara tetapi perlu melakukan perubahan permanen, Anda dapat memasang ulang /ro
sistem file dengan mengatakan
sudo mount -o remount,rw /ro
untuk membuatnya dapat ditulisi, lalu Anda dapat melakukan modifikasi apa pun yang diperlukan pada direktori tersebut.
Ya, oleh unionfs, lihat unionfs.filesystems.org. Anda harus memasang sistem file read-only pertama, dan sebagai sistem file RAM baca-tulis kedua melalui unionfs.
Di Ubuntu Anda dapat menemukan paket unionfs-fuse, yang merupakan implementasi lain dari hal yang sama, tetapi di ruang pengguna, bukan sebagai modul kernel.