Salt okunur bir dosya sistemi bağlayın ve yeniden yazma RAM'e mi?


Yanıtlar:


18

Aufs gibi bir birleşim dosya sistemi katmanı kullanmak mümkündür .

Demo:

Bir dosya sistemi görüntüsü oluşturun

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

Bağla, doldur

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

Salt okunur monte edin

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

Küçük bir RAM dosya sistemi

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

Her ikisini de birleştir

# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined

Bu mount seçeneği yeni bir "şube" ( br) oluşturarak /tmp/rammnt(salt okunur) üstüne koyarak (okuma-yazma /tmp/imgmnt). Bu "şube" açık (okuma-yazma) dosya sistemi olarak görünür hale getirilir /tmp/combined.

(Tüm detaylar için aufs (5) kılavuz sayfasına bakınız.)

Şimdi bunların hepsi yapıldı, işte sahip olduklarınız:

# 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

Bu yüzden tmpfsdosya sisteminde "dur" yazar , tekrar döngüye monte edilmiş görüntü dosyasına yayılmaya çalışmazlar.

Düz bir dizin (bir okuma / yazma dosya sisteminde) veya /dev/shmbunun için belirli bir şey oluşturmak yerine, bunun sizin için işe yarayıp yaramadığını içeren bir dizin tmpfskullanabilirsiniz.


Bu teknik (veya varyasyonları), bazı dağıtım LiveCD'leri tarafından kullanılır. Vikipedi aufs giriş birkaç listeler.


+1 teşekkürler! Bir soru: (1) bunu yapmak mümkün fstab, montaj noktası öyle /mi? (yani sistem hemen hemen göz ardı edilebilecek bir görüntüden önyüklenir.)
Mehrdad

Sanmıyorum Bunu yapmak istiyorsanız /, initrd ile daha iyi olduğunuza inanıyorum (inanıyorum, bu şekilde inanıyorum. Zor olsa da bunu bir init betiğinden de yapabilirsin.
Mat

8

Güncelleştirme:

Ubuntu'da bunu yapmanın daha basit iki yolu var (en azından sonraki sürümler):

  1. sudo apt-get install overlayrootayarlayarak takip overlayroot="tmpfs:swap=1,recurse=0"içinde/etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotectardından fsprotectçekirdek parametresi olarak geçen


Sonunda bunun kök dosya sistemiyle nasıl yapılacağını öğrendim (Ubuntu 11.04'te)!

Bir sistemi önyüklenebilir hale getirme adımları basittir. Kullandığım bu kılavuzu ile birlikte bu kılavuzun bu hatalar olmadan, düzgün çalışmıyor nasıl anlamaya ve web aramalarının bir demet.

Özet:

  1. Koşmak:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Bunu sakla /etc/initramfs-tools/scripts/init-bottom/__rootaufs. Adın gerçekten önemli olduğunu sanmıyorum, ancak başlangıç __sipariş vermek için kullanılabilir, bu nedenle adı değiştirirseniz, alt çizgileri korumak isteyebilirsiniz. (Bu, bu dosyanın bir kopyasıdır .)

    #!/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. İçinde /etc/default/grubbaşlayan satırı GRUB_CMDLINE_LINUX_DEFAULTve ardından gelen tırnakların içine parametreyi ekleyin aufs=tmpfs.

    Bonus: Yönlendirmeyi ara sıra geçici olarak kapatmanız gerekirse, bu argümanı çekirdek parametre listesinden kaldırın. GRUB menüsünü göstermek için, sistem önyüklenirken Shift tuşunu basılı tutarak büyük olasılıkla bunu yapabilirsiniz; sonra parametreleri düzenlemek için e tuşuna basın ve aufs=...parametreyi listeden silin .

  4. Bu satırları şuna ekle /etc/sysctl.conf. ( Uyarı : Potansiyel güvenlik riski.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Bu satırları çalıştır:

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

Her şey yolunda giderse, yeniden başlattığınızda, bunu geçici bir dosya sistemine girmiş olursunuz. RAM bölümü /rwve disk görüntüsü de olacak /ro, fakat elbette salt okunur olacak.

Bununla birlikte, geçici bir sisteme önyükleme yaptıysanız ancak kalıcı bir değişiklik yapmanız gerekiyorsa, /rodosya sistemini söyleyerek yeniden takabilirsiniz.

sudo mount -o remount,rw /ro

yazılabilir yapmak ve sonra bu dizinde gerekli değişiklikleri yapabilirsiniz.


2

Evet, unionfs tarafından bkz. Unionfs.filesystems.org . İlk önce salt okunur dosya sistemini, ikincil olarak ise unionfs aracılığıyla okuma-yazma RAM dosya sistemini bağladınız.

Ubuntu'da, aynı şeylerin bir başka uygulaması olan unionfs-fuse paketini bulabilirsiniz, ancak kullanıcı alanında, çekirdek modülü olarak değil.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.