GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Mounten Sie ein schreibgeschütztes Dateisystem und leiten Sie Schreibvorgänge in den Arbeitsspeicher um?

Es ist möglich, eine Union-Dateisystemschicht wie aufs zu verwenden.

Demo:

Erstellen Sie ein Dateisystem-Image

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

Mounten, füllen

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

Nur lesen aktivieren

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

Ein kleines RAM-Dateisystem

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

Kombiniere beides

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

Diese Einhängeoption zum Erstellen eines neuen "Zweigs" (br ) durch Stapeln von /tmp/rammnt (Lesen-Schreiben) auf /tmp/imgmnt (schreibgeschützt). Dieser "Zweig" wird als (schreib-)Dateisystem auf /tmp/combined sichtbar gemacht .

(Alle Details finden Sie auf der Manpage zu aufs(5).)

Jetzt ist alles fertig, hier ist, was Sie haben:

# 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

Also schreibt er "stop" in die tmpfs Dateisystem, versuchen sie nicht, sich zurück zu der in der Schleife gemounteten Image-Datei auszubreiten.

Sie hätten ein einfaches Verzeichnis (auf einem Dateisystem mit Lese-/Schreibzugriff) oder möglicherweise ein Verzeichnis unter /dev/shm verwenden können wenn das für Sie funktioniert, anstatt einen bestimmten tmpfs zu erstellen dafür.

Diese Technik (oder Variationen davon) wird von einigen LiveCD-Distributionen verwendet. Der Wikipedia-Eintrag aufs listet einige auf.


Aktualisierung:

Es scheint, dass es zwei andere einfachere Möglichkeiten gibt, dies unter Ubuntu zu tun (zumindest in den späteren Versionen):

  1. sudo apt-get install overlayroot gefolgt von der Einstellung overlayroot="tmpfs:swap=1,recurse=0" in /etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotect gefolgt von der Übergabe von fsprotect als Kernelparameter

Endlich habe ich herausgefunden, wie man das mit dem Root-Dateisystem macht (in Ubuntu 11.04)!

Die Schritte, um ein System bootfähig zu machen, sind einfach. Ich habe diese Anleitung in Kombination mit dieser Anleitung und einer Reihe von Websuchen verwendet, um herauszufinden, wie man es richtig und ohne Fehler zum Laufen bringt.

Zusammenfassung:

  1. Ausführen:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Speichern Sie dies unter /etc/initramfs-tools/scripts/init-bottom/__rootaufs . Ich glaube nicht, dass der Name wirklich wichtig ist, aber der Anfang __ könnte für Bestellzwecke verwendet werden, wenn Sie also den Namen ändern, möchten Sie vielleicht die Unterstriche beibehalten. (Dies ist eine Kopie dieser Datei.)

    #!/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. In /etc/default/grub , suchen Sie die Zeile, die mit GRUB_CMDLINE_LINUX_DEFAULT beginnt , und fügen Sie innerhalb der folgenden Anführungszeichen den Parameter aufs=tmpfs hinzu .

    Bonus: Wenn Sie gelegentlich ausschalten müssen Um die Umleitung vorübergehend zu deaktivieren, entfernen Sie dieses Argument einfach aus der Kernel-Parameterliste. Sie können dies wahrscheinlich tun, indem Sie beim Booten des Systems die Umschalttaste gedrückt halten, um das GRUB-Menü anzuzeigen. drücken Sie dann e um die Parameter zu bearbeiten, und löschen Sie einfach den aufs=... Parameter aus der Liste.

  4. Hängen Sie diese Zeilen an /etc/sysctl.conf an . (Warnung :Potentielles Sicherheitsrisiko.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Führen Sie diese Zeilen aus:

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

Wenn alles gut gelaufen ist, werden Sie dies beim Neustart in ein temporäres Dateisystem tun. Der RAM-Teil befindet sich bei /rw , und das Disk-Image befindet sich unter /ro , aber natürlich ist es schreibgeschützt.

Wenn Sie jedoch in ein temporäres System gebootet haben, aber eine dauerhafte Änderung vornehmen müssen, können Sie /ro erneut einhängen Dateisystem, indem Sie sagen

sudo mount -o remount,rw /ro

um es beschreibbar zu machen, und dann können Sie alle erforderlichen Änderungen an diesem Verzeichnis vornehmen.


Ja, von unionfs, siehe unionfs.filesystems.org. Sie müssen das erste schreibgeschützte Dateisystem und das zweite schreibgeschützte RAM-Dateisystem über unionfs einhängen.

In Ubuntu finden Sie das Paket unionfs-fuse, das eine weitere Implementierung derselben Dinge ist, aber im Benutzerbereich, nicht als Kernelmodul.


Linux
  1. SSHFS? Was ist das und wie verwende ich es?

  2. So mounten und unmounten Sie Laufwerke unter Linux

  3. Ausgabe umleiten und leiten?

  4. Mount und Automount und Sicherheitsprobleme?

  5. Wie erstelle ich eine Datei und mounte sie als Dateisystem?

Linux-Dateisysteme verstehen:ext4 und darüber hinaus

So mounten und unmounten Sie Dateisysteme in Linux

So mounten Sie eine temporäre Partition im RAM unter Linux

So mounten und unmounten Sie Dateisysteme/Partitionen unter Linux (Mount/Umount-Befehlsbeispiele)

Problem beim Anhängen und Mounten eines vorhandenen EBS-Volumes an das Dateisystem der EC2-Instanz

Nur Binding-Mounts auflisten