Gắn kết hệ thống tập tin chỉ đọc và chuyển hướng ghi vào RAM?


Câu trả lời:


18

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:

Tạo một hình ảnh hệ thống tập tin

# 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 
...

Gắn kết nó, dân cư

# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt

Gắn kết nó chỉ đọc

# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt 
-su: /tmp/imgmnt/hello.txt: Read-only file system

Một hệ thống tập tin RAM nhỏ

# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt

Kết hợp cả hai

# 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 tmpfshệ 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/shmnếu nó hoạt động cho bạn, thay vì tạo một thư mục cụ thể tmpfscho đ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.


+1 cảm ơn! Một câu hỏi: (1) có thể làm điều này với 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.)
Mehrdad

Tôi không nghĩ vậy. Nếu bạn muốn làm điều đó cho /, 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.
Mat

8

Cập nhật:

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):

  1. sudo apt-get install overlayroottiếp theo là thiết lập overlayroot="tmpfs:swap=1,recurse=0"trong/etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotecttheo sau là truyền fsprotecttham số kernel


Cuối cùng tôi đã tìm ra cách để làm điều này với hệ thống tập tin gốc (trong Ubuntu 11.04)!

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:

  1. Chạy:

    sudo apt-get install fsprotect apparmor-utils
    
  2. 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
    
  3. 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.

  4. 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
    
  5. 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 /rohệ 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 đó.


2

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.


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.