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

21

Ist es möglich, eine Loopback-Datei schreibgeschützt bereitzustellen und alle Schreibvorgänge in den Arbeitsspeicher umzuleiten?

Mehrdad
quelle

Antworten:

18

Es ist möglich, eine Union-Dateisystemebene 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 
...

Hängen Sie es ein, füllen Sie es

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

Mounten Sie es schreibgeschützt

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

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

Diese Mount-Option zum Erstellen einer neuen "Verzweigung" ( br) durch Stapeln/tmp/rammnt (Lesen / Schreiben) über /tmp/imgmnt(Nur Lesen). Diese "Verzweigung" wird als (Lese- / Schreib-) Dateisystem weiter sichtbar gemacht /tmp/combined.

(Siehe die Informationen finden Manpage zu aufs (5) .)

Jetzt ist alles erledigt, 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 die schreibt "halt" in die tmpfs Dateisystem angehalten" werden, wird nicht versucht, sie in die Image-Datei mit eingebundener Schleife zu übertragen.

Sie hätten ein einfaches Verzeichnis (in einem Lese- / Schreib-Dateisystem) oder möglicherweise ein Verzeichnis unter verwenden können, /dev/shmwenn dies für Sie funktioniert, anstatt ein bestimmtes Verzeichnis zu erstellentmpfs dafür zu .


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

Matte
quelle
+1 Danke! Eine Frage: (1) ist es möglich, dies zu tun fstab, so dass der Einhängepunkt ist /? (Das heißt, das System startet so ziemlich von einem verwerfbaren Image.)
Mehrdad
Ich glaube nicht. Wenn du das machen willst, denke /ich, dass du mit einer initrd besser dran bist (so geht das für Live-CDs, von denen ich glaube). Möglicherweise können Sie dies von einem Init-Skript aus tun, obwohl dies schwierig klingt.
Mat
8

Aktualisieren:

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

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

  2. sudo apt-get install fsprotectgefolgt von der Übergabe fsprotectals Kernel-Parameter


Ich habe endlich herausgefunden, wie das mit dem Root-Dateisystem (in Ubuntu 11.04) geht!

Die Schritte zum Booten eines Systems sind einfach. Ich habe diesen Leitfaden in Kombination mit verwendet diesem Leitfaden und einer Reihe von Websuchen verwendet, um herauszufinden, wie ich ihn fehlerfrei zum Laufen bringen kann.

Zusammenfassung:

  1. Lauf:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Speichern Sie dies in /etc/initramfs-tools/scripts/init-bottom/__rootaufs. Ich glaube nicht, dass der Name wirklich wichtig ist, aber der Anfang __kann für Bestellzwecke verwendet werden. Wenn Sie den Namen ändern, möchten Sie möglicherweise 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/grubfinden Sie die Zeile, beginnt mit GRUB_CMDLINE_LINUX_DEFAULTund innerhalb der Anführungszeichen , die folgen, fügen Sie den Parameteraufs=tmpfs .

    Bonus: Wenn Sie gelegentlich deaktivieren die Umleitung vorübergehend, entfernen Sie einfach dieses Argument 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 den aufs=...Parameter einfach aus der Liste.

  4. Fügen Sie diese Zeilen an /etc/sysctl.conf. ( Warnung : Mögliches 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 beim Neustart alles geklappt hat, werden Sie dies in einem temporären Dateisystem tun. Der RAM-Teil ist auf /rwund das Disk-Image auf/ro , aber es ist natürlich schreibgeschützt.

Wenn Sie jedoch ein temporäres System gebootet haben und eine permanente Änderung vornehmen müssen, können Sie das /roDateisystem mit den folgenden Anweisungen erneut einbinden

sudo mount -o remount,rw /ro

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

Mehrdad
quelle
2

Ja, von unionfs, siehe unionfs.filesystems.org . Sie haben das erste Nur-Lese-Dateisystem und als zweites Lese-Schreib-RAM-Dateisystem über unionfs bereitgestellt.

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

Jan Marek
quelle
0

Sie können dies auch auf der Geräteebene tun, ohne eine Unionfs wie aufs. Siehe Geräte-Mapper snapshot-origin.

Tor Klingberg
quelle