Montare un filesystem di sola lettura e reindirizzare le scritture su RAM?


Risposte:


18

È possibile usare uno strato di filesystem union come aufs .

demo:

Crea un'immagine del filesystem

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

Montalo, popolalo

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

Montalo in sola lettura

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

Un piccolo filesystem RAM

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

Combina entrambi

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

Quell'opzione di mount per creare un nuovo "branch" ( br) impilando /tmp/rammnt(read-write) sopra /tmp/imgmnt(sola lettura). Questo "ramo" è reso visibile come file system (lettura-scrittura) su /tmp/combined.

(Vedi la pagina man aufs (5) per tutti i dettagli.)

Ora tutto ciò che è fatto, ecco cosa hai:

# 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

Quindi le scritture "si fermano" nel tmpfsfilesystem, non tentano di propagarsi al file di immagine montato in loop.

Avresti potuto usare una semplice directory (su un filesystem di lettura / scrittura), o eventualmente una directory sotto /dev/shmse funzionasse per te, invece di crearne una specifica tmpfs.


Questa tecnica (o sue varianti) è utilizzata da alcuni LiveCD di distribuzione. La voce di Wikipedia aufs ne elenca alcune.


+1 grazie! Una domanda: (1) è possibile farlo con fstab, in modo che il mount point sia /? (cioè il sistema si avvia da un'immagine scartabile, praticamente.)
Mehrdad,

Io non la penso così. Se vuoi farlo /, credo che stai meglio con un initrd (credo sia così per i livecd). Potresti essere in grado di farlo da uno script di init, anche se sembra complicato.
Mat,

8

Aggiornare:

Sembra che ci siano altri 2 modi più semplici per farlo su Ubuntu (almeno le versioni successive):

  1. sudo apt-get install overlayrootseguita impostando overlayroot="tmpfs:swap=1,recurse=0"in/etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotectseguito dal passaggio fsprotectcome parametro del kernel


Ho finalmente capito come farlo con il filesystem di root (in Ubuntu 11.04)!

I passaggi per rendere avviabile un sistema sono semplici. Ho usato questa guida in combinazione con questa guida e un sacco di ricerche sul web per capire come farlo funzionare correttamente, senza bug.

Sommario:

  1. Correre:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Salva questo in /etc/initramfs-tools/scripts/init-bottom/__rootaufs. Non penso che il nome contenga davvero, ma l'inizio __potrebbe essere usato per scopi di ordinazione, quindi se cambi il nome, potresti voler mantenere i caratteri di sottolineatura. (Questa è una copia di questo file .)

    #!/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, trova la riga che inizia con GRUB_CMDLINE_LINUX_DEFAULTe all'interno delle virgolette che seguono, aggiungi il parametro aufs=tmpfs.

    Bonus: Se hai bisogno di disabilitare temporaneamente il reindirizzamento, rimuovi semplicemente questo argomento dalla lista dei parametri del kernel. Probabilmente puoi farlo tenendo premuto il tasto Maiusc durante l'avvio del sistema, per mostrare il menu di GRUB; quindi premere e per modificare i parametri e cancellare il aufs=...parametro dall'elenco.

  4. Aggiungi queste righe a /etc/sysctl.conf. ( Avvertenza : potenziale rischio per la sicurezza.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Esegui queste linee:

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

Se tutto è andato bene, al riavvio, lo farai in un file system temporaneo. La parte RAM sarà a /rw, e l'immagine del disco sarà a /ro, ma ovviamente sarà di sola lettura.

Tuttavia, se è stato avviato un sistema temporaneo ma è necessario apportare una modifica permanente, è possibile reinstallare il /rofile system dicendo

sudo mount -o remount,rw /ro

per renderlo scrivibile e quindi è possibile apportare qualsiasi modifica necessaria a quella directory.


2

Sì, da unionfs, vedi unionfs.filesystems.org . È necessario montare il primo filesystem di sola lettura e come secondo filesystem RAM di lettura-scrittura tramite unionfs.

In Ubuntu puoi trovare il pacchetto unionfs-fuse, che è un'altra implementazione delle stesse cose, ma nello spazio utente, non come un modulo kernel.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.