एक फाइलसिस्टम को केवल माउंट करें, और रीडायरेक्ट रैम को लिखता है?


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

एक छोटा रैम फाइल सिस्टम

# 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

उस माउंट को (केवल पढ़ने के लिए) brस्टैकिंग /tmp/rammnt(रीड-राइट) द्वारा एक नई "शाखा" ( ) बनाने का विकल्प /tmp/imgmnt। इस "शाखा" को (रीड-राइट) फाइलसिस्टम पर दिखाई देता है /tmp/combined

( सभी विवरण के लिए aufs (5) मैन पेज देखें।)

अब यह सब हो चुका है, यहाँ आपके पास क्या है:

# 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 द्वारा किया जाता है। विकिपीडिया aufs प्रविष्टि कुछ सूचीबद्ध करता है।


+1 धन्यवाद! एक प्रश्न: (1) क्या ऐसा करना संभव है fstab, जैसे कि आरोह बिंदु /? (यानी तो एक discardable छवि से प्रणाली जूते, काफी।)
Mehrdad

मुझे ऐसा नहीं लगता। अगर आप ऐसा करना चाहते हैं /, तो मेरा मानना ​​है कि आप एक बेहतर बदलाव के साथ बेहतर हैं (ऐसा मेरा मानना ​​है कि यह लाइवकार्ड्स के लिए किया जाता है)। तुम एक init स्क्रिप्ट से यह करने में सक्षम हो सकता है, हालांकि यह मुश्किल लगता है।
Mat

8

अद्यतन करें:

ऐसा लगता है कि उबंटू पर ऐसा करने के 2 अन्य सरल तरीके हैं (कम से कम बाद के संस्करण):

  1. sudo apt-get install overlayrootस्थापित करने के बाद overlayroot="tmpfs:swap=1,recurse=0"में/etc/overlayroot.local.conf

  2. sudo apt-get install fsprotectfsprotectकर्नेल पैरामीटर के रूप में गुजरने के बाद


मैं अंत में पता लगा कि रूट फाइलसिस्टम के साथ ऐसा कैसे किया जाए (उबंटू 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_DEFAULT, और उद्धरण के अंदर, पैरामीटर जोड़ें aufs=tmpfs

    बोनस: यदि आपको कभी-कभी अस्थायी रूप से पुनर्निर्देशन बंद करने की आवश्यकता होती है , तो बस इस तर्क को कर्नेल पैरामीटर सूची से हटा दें। GRUB मेनू दिखाने के लिए, सिस्टम बूट होने पर Shift कुंजी दबाकर आप शायद ऐसा कर सकते हैं; फिर मापदंडों को संपादित करने के लिए दबाएं , और 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
    

यदि सब कुछ ठीक हो जाता है, जब आप रिबूट करते हैं, तो आप एक अस्थायी फ़ाइल सिस्टम में ऐसा करेंगे। रैम भाग में होगा /rw, और डिस्क छवि पर होगा /ro, लेकिन निश्चित रूप से यह केवल पढ़ने के लिए होगा।

फिर भी, यदि आपने एक अस्थायी प्रणाली में बूट किया है, लेकिन एक स्थायी परिवर्तन करने की आवश्यकता है, तो आप /roकह कर फ़ाइल सिस्टम को फिर से माउंट कर सकते हैं

sudo mount -o remount,rw /ro

इसे लिखने योग्य बनाने के लिए, और फिर आप उस निर्देशिका के लिए जो भी आवश्यक हो, कर सकते हैं।


2

हां, Unionfs द्वारा, Unionfs.filesystems.org देखें । आपने पहले रीड-ओनली फाइलसिस्टम माउंट किया है, और यूनियनफस के माध्यम से दूसरे रीड-राइट रैम फाइल सिस्टम के रूप में।

उबंटू में आप यूनियनफॉज-फ्यूज पैकेज पा सकते हैं, जो समान चीजों का एक और कार्यान्वयन है, लेकिन उपयोगकर्ता अंतरिक्ष में, कर्नेल मॉड्यूल के रूप में नहीं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.