Monta um sistema de arquivos somente leitura e redireciona as gravações para a RAM?

21

É possível montar um arquivo de loopback como somente leitura e redirecionar todas as gravações para a RAM?

    
por Mehrdad 22.12.2011 / 23:01

4 respostas

8

Atualização:

Parece que há duas outras maneiras mais simples de fazer isso no Ubuntu (pelo menos nas versões posteriores):

  1. sudo apt-get install overlayroot seguido pela definição de overlayroot="tmpfs:swap=1,recurse=0" in /etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotect seguido pela passagem de fsprotect como parâmetro do kernel

Eu finalmente descobri como fazer isso com o sistema de arquivos raiz (no Ubuntu 11.04)!

As etapas para tornar um sistema inicializável são simples. Eu usei este guia em combinação com este guia e um monte de pesquisas na web para descobrir como fazê-lo funcionar corretamente, sem erros.

Resumo:

  1. Executar:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Salve isso em /etc/initramfs-tools/scripts/init-bottom/__rootaufs . Eu não acho que o nome realmente importa, mas o começo __ pode ser usado para fins de ordenação, então se você mudar o nome, você pode querer manter os sublinhados. (Esta é uma cópia do este arquivo .)

    #!/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. Em /etc/default/grub , localize a linha que começa com GRUB_CMDLINE_LINUX_DEFAULT e, dentro das cotações a seguir, adicione o parâmetro aufs=tmpfs .

    Bônus: Se você precisar desabilitar o redirecionamento temporariamente, simplesmente remova este argumento da lista de parâmetros do kernel. Você provavelmente pode fazer isso segurando a tecla Shift quando o sistema estiver inicializando, para mostrar o menu do GRUB; em seguida, pressione e para editar os parâmetros e apenas apague o parâmetro aufs=... da lista.

  4. Anexe estas linhas a /etc/sysctl.conf . ( Aviso : risco de segurança potencial.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Execute estas linhas:

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

Se tudo correr bem, quando você reiniciar, você estará fazendo isso em um sistema de arquivos temporário. A parte da RAM estará em /rw e a imagem do disco estará em /ro , mas é claro que será somente leitura.

No entanto, se você inicializou em um sistema temporário, mas precisa fazer uma alteração permanente, é possível montar novamente o sistema de arquivos /ro dizendo

sudo mount -o remount,rw /ro

para torná-lo gravável e, em seguida, você pode fazer as modificações necessárias para esse diretório.

    
por 27.05.2012 / 06:34
16

É possível usar uma camada de sistema de arquivos de união como aufs .

Demo:

Crie uma imagem do sistema de arquivos

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

Monte, preencha

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

Montar somente leitura

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

Um pequeno sistema de arquivos RAM

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

Combine os dois

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

Essa opção de montagem para criar uma nova "ramificação" ( br ) empilhando /tmp/rammnt (leitura-gravação) na parte superior de /tmp/imgmnt (somente leitura). Esta "ramificação" torna-se visível como um sistema de arquivos (leitura-gravação) em /tmp/combined .

(Veja a página do manual aufs (5) para todos os detalhes.)

Agora, tudo que foi feito, aqui está o que você tem:

# 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

Portanto, as gravações "stop" no sistema de arquivos tmpfs , elas não tentam se propagar de volta para o arquivo de imagem montado em loop.

Você poderia ter usado um diretório simples (em um sistema de arquivos de leitura / gravação) ou possivelmente um diretório em /dev/shm se isso funcionar para você, em vez de criar um tmpfs específico para isso.

Esta técnica (ou suas variações) é usada por algum LiveCD de distribuição. A Wikipedia aufs lista de entrada alguns.

    
por 22.12.2011 / 23:50
2

Sim, por unionfs, consulte unionfs.filesystems.org . Você montou o primeiro sistema de arquivos somente para leitura e como segundo sistema de arquivos de RAM de leitura-gravação através de unionfs.

No Ubuntu você pode encontrar o pacote unionfs-fuse, que é outra implementação das mesmas coisas, mas no espaço do usuário, não como um módulo do kernel.

    
por 22.12.2011 / 23:56
0

Você também pode fazer isso no nível do dispositivo, sem um unionfs como aufs. Veja mapeador de dispositivos snapshot-origin .

    
por 12.08.2015 / 12:15