เมานต์ระบบไฟล์เป็นแบบอ่านอย่างเดียวและเปลี่ยนเส้นทางการเขียนไปที่ RAM หรือไม่


21

เป็นไปได้หรือไม่ที่จะเมานต์ไฟล์ลูปแบ็คเป็นแบบอ่านอย่างเดียวและเปลี่ยนเส้นทางการเขียนทั้งหมดไปยัง RAM?

คำตอบ:


18

มันเป็นไปได้โดยใช้ชั้นระบบแฟ้มสหภาพเช่นaufs

การสาธิต:

สร้างอิมเมจระบบไฟล์

# 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

ระบบไฟล์ RAM ขนาดเล็ก

# 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

ตัวเลือกการเมาต์นั้นเพื่อสร้าง "branch" ใหม่ ( br) โดยการซ้อน/tmp/rammnt(อ่าน - เขียน) ที่ด้านบนของ/tmp/imgmnt(อ่านอย่างเดียว) นี้ "สาขา" จะทำให้มองเห็นเป็น (อ่านเขียน) /tmp/combinedระบบแฟ้มบน

(ดูหน้าaufs (5) man page สำหรับรายละเอียดทั้งหมด)

ตอนนี้เสร็จแล้วนี่คือสิ่งที่คุณมี:

# 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

ดังนั้นการเขียน "หยุด" ในtmpfsระบบไฟล์พวกเขาไม่ได้พยายามที่จะเผยแพร่กลับไปยังไฟล์ภาพที่ติดห่วง

คุณสามารถใช้ไดเรคทอรีธรรมดา (ในระบบไฟล์การอ่าน / เขียน) หรืออาจเป็นไดเรคทอรีภายใต้/dev/shmที่เหมาะกับคุณแทนที่จะสร้างเฉพาะtmpfsสำหรับมัน


เทคนิคนี้ (หรือรูปแบบดังกล่าว) ถูกใช้โดยการแจกจ่าย LiveCD บางส่วน รายการ Wikipedia aufsแสดงรายการบางอย่าง


+1 ขอบคุณ! คำถาม: (1) เป็นไปได้ไหมที่จะทำfstabเช่นนั้นจุดยึดคือ/? (นั่นคือระบบจะบูทจากอิมเมจที่ถูกทิ้งให้ทิ้งไปมาก)
Mehrdad

ฉันไม่คิดอย่างนั้น หากคุณต้องการที่จะทำเพื่อ/ฉันเชื่อว่าคุณดีกว่าด้วย initrd (นั่นคือวิธีการทำเพื่อ livecds ที่ฉันเชื่อ) คุณอาจจะสามารถทำได้จากสคริปต์เริ่มต้น แต่ดูเหมือนจะยุ่งยาก
Mat

8

ปรับปรุง:

ดูเหมือนว่ามีวิธีที่ง่ายกว่า 2 วิธีในการทำเช่นนี้บน Ubuntu (อย่างน้อยรุ่นที่ใหม่กว่า):

  1. sudo apt-get install overlayrootตามมาด้วยการตั้งค่าoverlayroot="tmpfs:swap=1,recurse=0"/etc/overlayroot.local.confใน

  2. sudo apt-get install fsprotectตามด้วยการส่งผ่านfsprotectเป็นพารามิเตอร์เคอร์เนล


ในที่สุดฉันก็รู้วิธีการทำเช่นนี้กับระบบไฟล์รูท (ใน Ubuntu 11.04)!

ขั้นตอนในการทำให้ระบบสามารถบูตได้นั้นง่าย ฉันใช้คำแนะนำนี้ร่วมกับคำแนะนำนี้และการค้นเว็บมากมายเพื่อหาวิธีทำให้มันทำงานอย่างถูกต้องโดยไม่มีข้อบกพร่อง

สรุป:

  1. วิ่ง:

    sudo apt-get install fsprotect apparmor-utils
    
  2. /etc/initramfs-tools/scripts/init-bottom/__rootaufsบันทึกนี้ ฉันไม่คิดว่าชื่อมีความสำคัญจริง ๆ แต่__อาจใช้จุดเริ่มต้นเพื่อวัตถุประสงค์ในการสั่งซื้อดังนั้นหากคุณเปลี่ยนชื่อคุณอาจต้องการรักษาขีดเส้นใต้ไว้ (นี่คือสำเนาของไฟล์นี้)

    #!/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. ใน/etc/default/grubการค้นหาบรรทัดที่เริ่มต้นด้วยและภายในคำพูดที่ติดตามเพิ่มพารามิเตอร์GRUB_CMDLINE_LINUX_DEFAULTaufs=tmpfs

    โบนัส:หากคุณต้องการปิดการเปลี่ยนเส้นทางชั่วคราวเป็นครั้งคราวเพียงแค่ลบอาร์กิวเมนต์นี้ออกจากรายการพารามิเตอร์เคอร์เนล คุณสามารถทำได้โดยกดปุ่ม Shift ค้างไว้เมื่อระบบบูทเพื่อแสดงเมนู GRUB จากนั้นกดeเพื่อแก้ไขพารามิเตอร์และเพียงแค่ลบaufs=...พารามิเตอร์จากรายการ

  4. /etc/sysctl.confท้ายบรรทัดเหล่านี้ไป ( คำเตือน : ความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้น)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. เรียกใช้บรรทัดเหล่านี้:

    sudo aa-complain dhclient3
    sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs
    sudo update-initramfs -k all -u
    sudo update-grub
    

หากทุกอย่างเป็นไปด้วยดีเมื่อคุณรีบูทคุณจะเข้าสู่ระบบไฟล์ชั่วคราว ส่วน RAM จะอยู่ที่/rwและภาพดิสก์จะอยู่ที่/roแต่แน่นอนมันจะเป็นแบบอ่านอย่างเดียว

อย่างไรก็ตามหากคุณทำการบูทเข้าสู่ระบบชั่วคราว แต่จำเป็นต้องทำการเปลี่ยนแปลงอย่างถาวรคุณสามารถเมาต์/roระบบไฟล์อีกครั้งโดยพูด

sudo mount -o remount,rw /ro

เพื่อให้สามารถเขียนได้และจากนั้นคุณสามารถทำการแก้ไขสิ่งที่จำเป็นสำหรับไดเรกทอรีนั้น


2

ใช่โดย unionfs ดูunionfs.filesystems.org คุณมีระบบไฟล์แบบอ่านอย่างเดียวเป็นครั้งแรกและเป็นระบบไฟล์ RAM แบบอ่าน - เขียนครั้งที่สองผ่าน unionfs

ในอูบุนตูคุณสามารถค้นหาแพ็คเกจ unionfs-fuse ซึ่งเป็นการใช้งานสิ่งเดียวกัน แต่ในพื้นที่ของผู้ใช้ไม่ใช่โมดูลเคอร์เนล


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.