GNU/Linux >> Tutoriels Linux >  >> Linux

Monter un système de fichiers en lecture seule et rediriger les écritures vers la RAM ?

Il est possible d'utiliser une couche de système de fichiers union comme aufs.

Démo :

Créer une image du système de fichiers

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

Montez-le, remplissez-le

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

Montez-le en lecture seule

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

Un petit système de fichiers RAM

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

Combinez les deux

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

Cette option de montage pour créer une nouvelle "branche" (br ) en empilant /tmp/rammnt (lecture-écriture) au-dessus de /tmp/imgmnt (lecture seulement). Cette "branche" est rendue visible en tant que système de fichiers (lecture-écriture) sur /tmp/combined .

(Voir la page de manuel aufs(5) pour tous les détails.)

Maintenant que tout est fait, voici ce que vous avez :

# 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

Donc les écritures "stop" dans le tmpfs système de fichiers, ils ne tentent pas de se propager vers le fichier image monté en boucle.

Vous auriez pu utiliser un répertoire simple (sur un système de fichiers en lecture/écriture), ou éventuellement un répertoire sous /dev/shm si cela fonctionne pour vous, au lieu de créer un tmpfs spécifique pour ça.

Cette technique (ou ses variantes) est utilisée par certaines distributions LiveCD. L'entrée Wikipedia aufs en énumère quelques-unes.


Mise à jour :

Il semble qu'il existe 2 autres façons plus simples de le faire sur Ubuntu (au moins les versions ultérieures) :

  1. sudo apt-get install overlayroot suivi du réglage overlayroot="tmpfs:swap=1,recurse=0" en /etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotect suivi en passant fsprotect en tant que paramètre du noyau

J'ai enfin compris comment faire cela avec le système de fichiers racine (dans Ubuntu 11.04) !

Les étapes pour rendre un système amorçable sont simples. J'ai utilisé ce guide en combinaison avec ce guide et un tas de recherches sur le Web pour comprendre comment le faire fonctionner correctement, sans bogues.

Résumé :

  1. Exécuter :

    sudo apt-get install fsprotect apparmor-utils
    
  2. Enregistrez-le dans /etc/initramfs-tools/scripts/init-bottom/__rootaufs . Je ne pense pas que le nom importe vraiment, mais le début __ peut être utilisé à des fins de commande, donc si vous modifiez le nom, vous voudrez peut-être conserver les traits de soulignement.(Ceci est une copie de ce fichier.)

    #!/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. En /etc/default/grub , trouvez la ligne qui commence par GRUB_CMDLINE_LINUX_DEFAULT , et à l'intérieur des guillemets qui suivent, ajoutez le paramètre aufs=tmpfs .

    Bonus : Si vous devez occasionnellement éteindre temporairement la redirection, supprimez simplement cet argument de la liste des paramètres du noyau. Vous pouvez probablement le faire en maintenant la touche Maj enfoncée lorsque le système démarre, pour afficher le menu GRUB ; puis appuyez sur e pour éditer les paramètres, et juste effacer le aufs=... paramètre de la liste.

  4. Ajoutez ces lignes à /etc/sysctl.conf . (Attention  :Risque de sécurité potentiel.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Exécutez ces lignes :

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

Si tout s'est bien passé, lorsque vous redémarrez, vous le ferez dans un système de fichiers temporaire. La partie RAM sera à /rw , et l'image disque sera à /ro , mais bien sûr, il sera en lecture seule.

Néanmoins, si vous avez démarré sur un système temporaire mais que vous devez apporter une modification permanente, vous pouvez remonter le /ro système de fichiers en disant

sudo mount -o remount,rw /ro

pour le rendre accessible en écriture, puis vous pourrez apporter les modifications nécessaires à ce répertoire.


Oui, par unionfs, voir unionfs.filesystems.org. Vous avez monté le premier système de fichiers en lecture seule et le deuxième système de fichiers RAM en lecture-écriture via unionfs.

Dans Ubuntu, vous pouvez trouver le paquet unionfs-fuse, qui est une autre implémentation des mêmes choses, mais dans l'espace utilisateur, pas en tant que module du noyau.


Linux
  1. Comment rediriger la sortie vers un fichier et Stdout sous Linux

  2. Comment monter un système de fichiers, mapper les ID utilisateur ?

  3. Rediriger et canaliser la sortie ?

  4. Problèmes de montage et de montage automatique et de sécurité ?

  5. Comment créer un fichier et le monter en tant que système de fichiers ?

Comprendre les systèmes de fichiers Linux :ext4 et au-delà

Comment monter et démonter des systèmes de fichiers sous Linux

Comment monter une partition temporaire dans la RAM sous Linux

Comment créer/supprimer et monter un système de fichiers Stratis dans CentOS/RHEL 8

Comment enregistrer le type de système de fichiers FUSE avec mount(8) et fstab ?

Comment monter un système de fichiers dans un environnement en lecture seule ?