GNU/Linux >> Linux Esercitazione >  >> Linux

Montare un filesystem in sola lettura e reindirizzare le scritture sulla RAM?

È possibile utilizzare un layer di file system 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 montaggio per creare un nuovo "ramo" (br ) impilando /tmp/rammnt (lettura-scrittura) sopra /tmp/imgmnt (sola lettura). Questo "ramo" è reso visibile come filesystem (lettura-scrittura) su /tmp/combined .

(Vedi la pagina man di 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 scrive "stop" nel tmpfs filesystem, non tentano di propagarsi nuovamente al file immagine montato in loop.

Avresti potuto usare una semplice directory (su un filesystem di lettura/scrittura), o possibilmente una directory sotto /dev/shm se funziona per te, invece di creare uno specifico tmpfs per questo.

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


Aggiornamento:

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

  1. sudo apt-get install overlayroot seguito dall'impostazione overlayroot="tmpfs:swap=1,recurse=0" in /etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotect seguito dal superamento di fsprotect come parametro del kernel

Finalmente ho 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 una serie di ricerche sul web per capire come farlo funzionare correttamente, senza bug.

Sommario:

  1. Esegui:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Salva questo in /etc/initramfs-tools/scripts/init-bottom/__rootaufs . Non penso che il nome sia importante, ma l'inizio __ potrebbe essere utilizzato per scopi di ordinamento, 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_DEFAULT , e tra le virgolette che seguono, aggiungi il parametro aufs=tmpfs .

    Bonus: Se hai bisogno di disattivare occasionalmente il reindirizzamento temporaneamente, è sufficiente rimuovere questo argomento dall'elenco dei parametri del kernel. Probabilmente puoi farlo tenendo premuto il tasto Maiusc durante l'avvio del sistema, per mostrare il menu di GRUB; quindi premi e per modificare i parametri, e basta cancellare il aufs=... parametro dall'elenco.

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

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

    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, quando riavvierai, lo farai in un file system temporaneo. La parte RAM sarà a /rw e l'immagine del disco sarà in /ro , ma ovviamente sarà di sola lettura.

Tuttavia, se hai eseguito l'avvio in un sistema temporaneo ma hai bisogno di apportare modifiche permanenti, puoi rimontare il /ro file system dicendo

sudo mount -o remount,rw /ro

per renderlo scrivibile, e quindi puoi apportare tutte le modifiche necessarie a quella directory.


Sì, per unionfs, vedi unionfs.filesystems.org. Hai montato 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 modulo del kernel.


Linux
  1. Come reindirizzare l'output su un file e Stdout in Linux

  2. Come montare un filesystem, mappare gli ID utente?

  3. Montare un filesystem Cifs direttamente o tramite Fstab?

  4. Montaggio e montaggio automatico e problemi di sicurezza?

  5. Come creare un file e montarlo come filesystem?

Comprensione dei filesystem Linux:ext4 e oltre

Come montare e smontare i file system in Linux

Come montare una partizione temporanea nella RAM in Linux

Come registrare il tipo di filesystem FUSE con mount (8) e fstab?

Elenca solo i supporti bind

Monta il file zip come filesystem di sola lettura