Câu trả lời:
Có thể sử dụng một lớp hệ thống tập tin liên minh như aufs .
Bản giới thiệu:
# 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
Tùy chọn gắn kết đó để tạo một "nhánh" ( br
) mới bằng cách xếp chồng /tmp/rammnt
(đọc-ghi) lên trên /tmp/imgmnt
(chỉ đọc). "Nhánh" này được hiển thị dưới dạng hệ thống tệp (đọc-ghi) trên /tmp/combined
.
(Xem trang man của aufs (5) để biết tất cả các chi tiết.)
Bây giờ tất cả đã xong, đây là những gì bạn có:
# 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
Vì vậy, ghi "dừng" trong tmpfs
hệ thống tập tin, họ không cố gắng truyền trở lại tập tin hình ảnh gắn kết vòng lặp.
Bạn có thể đã sử dụng một thư mục đơn giản (trên hệ thống tệp đọc / ghi) hoặc có thể là một thư mục bên dưới /dev/shm
nếu nó hoạt động cho bạn, thay vì tạo một thư mục cụ thể tmpfs
cho điều đó.
Kỹ thuật này (hoặc các biến thể của chúng) được sử dụng bởi một số LiveCD phân phối. Mục nhập aufs Wikipedia liệt kê một vài.
/
, tôi tin rằng bạn tốt hơn với một initrd (đó là cách nó được thực hiện cho các cuộc sống mà tôi tin). Bạn có thể làm điều đó từ một tập lệnh init mặc dù điều đó nghe có vẻ khó khăn.
Có vẻ như có 2 cách đơn giản khác để làm điều này trên Ubuntu (ít nhất là các phiên bản mới hơn):
Các bước để tạo một hệ thống khởi động rất đơn giản. Tôi đã sử dụng hướng dẫn này kết hợp với hướng dẫn này và một loạt các tìm kiếm trên web để tìm ra cách làm cho nó hoạt động đúng, không có lỗi.
Tóm lược:
Chạy:
sudo apt-get install fsprotect apparmor-utils
Lưu cái này vào /etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Tôi không nghĩ rằng tên thực sự quan trọng, nhưng sự khởi đầu __
có thể được sử dụng cho mục đích đặt hàng, vì vậy nếu bạn thay đổi tên, bạn có thể muốn giữ dấu gạch dưới. (Đây là bản sao của tập tin này .)
#!/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
Trong /etc/default/grub
, tìm dòng bắt đầu bằng GRUB_CMDLINE_LINUX_DEFAULT
, và bên trong dấu ngoặc kép theo sau, thêm tham số aufs=tmpfs
.
Phần thưởng: Nếu bạn cần thỉnh thoảng tắt chuyển hướng tạm thời, chỉ cần xóa đối số này khỏi danh sách tham số kernel. Bạn có thể có thể làm điều này bằng cách giữ phím Shift khi hệ thống khởi động, để hiển thị menu GRUB; sau đó nhấn e để chỉnh sửa các tham số và chỉ cần xóa aufs=...
tham số khỏi danh sách.
Nối các dòng này vào /etc/sysctl.conf
. ( Cảnh báo : Rủi ro bảo mật tiềm năng.)
kernel.yama.protected_nonaccess_hardlinks = 0
kernel.yama.protected_sticky_symlinks = 0
Chạy các dòng sau:
sudo aa-complain dhclient3
sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs
sudo update-initramfs -k all -u
sudo update-grub
Nếu mọi thứ đều ổn, khi bạn khởi động lại, bạn sẽ làm như vậy thành một hệ thống tệp tạm thời. Phần RAM sẽ ở /rw
, và hình ảnh đĩa sẽ ở /ro
, nhưng tất nhiên nó sẽ ở chế độ chỉ đọc.
Tuy nhiên, nếu bạn đã khởi động vào một hệ thống tạm thời nhưng cần thực hiện thay đổi vĩnh viễn, bạn có thể gắn lại /ro
hệ thống tệp bằng cách nói
sudo mount -o remount,rw /ro
để làm cho nó có thể ghi, và sau đó bạn có thể thực hiện bất kỳ sửa đổi nào cần thiết cho thư mục đó.
Vâng, bởi unionfs, xem unionfs.filesystems.org . Bạn đã gắn kết hệ thống tệp chỉ đọc đầu tiên và như hệ thống tệp RAM đọc ghi thứ hai thông qua unionfs.
Trong Ubuntu, bạn có thể tìm thấy gói unionfs-fuse, đây là một triển khai khác của cùng một thứ, nhưng trong không gian người dùng, không phải là một mô-đun hạt nhân.
Bạn cũng có thể làm điều này ở cấp độ thiết bị, mà không cần kết hợp như aufs. Xem bản đồ thiết bị snapshot-origin
.
fstab
, sao cho điểm gắn kết là/
? (tức là hệ thống khởi động từ một hình ảnh bị loại bỏ, khá nhiều.)