É possível montar um arquivo de loopback como somente leitura e redirecionar todas as gravações para a RAM?
fonte
É possível montar um arquivo de loopback como somente leitura e redirecionar todas as gravações para a RAM?
É possível usar uma camada de sistema de arquivos de união como aufs .
Demo:
# 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
...
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
# 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 e gravação) em cima de /tmp/imgmnt
(somente leitura). Este "ramo" é tornado visível como um sistema de arquivos (leitura / gravação) ativado /tmp/combined
.
(Consulte a página do manual aufs (5) para todos os detalhes.)
Agora tudo o que está feito, eis 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 "param" no tmpfs
sistema de arquivos e não tentam se propagar de volta ao 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 específico tmpfs
para isso.
Esta técnica (ou variações) é usada por alguma distribuição LiveCD. A entrada aufs da Wikipedia lista alguns.
fstab
, de modo que o ponto de montagem seja/
? (isto é, por isso o sistema é inicializado de uma imagem descartável, muito bonito.)/
, acredito que você está melhor com um initrd (é assim que é feito para os livecds que acredito). Você pode fazer isso a partir de um script init, embora isso pareça complicado.Atualizar:
Parece que existem 2 outras maneiras mais simples de fazer isso no Ubuntu (pelo menos nas versões posteriores):
sudo apt-get install overlayroot
seguido por ajusteoverlayroot="tmpfs:swap=1,recurse=0"
em/etc/overlayroot.local.conf
.sudo apt-get install fsprotect
seguido passandofsprotect
como um parâmetro do kernelEu 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 várias pesquisas na web para descobrir como fazê-lo funcionar corretamente, sem erros.
Resumo:
Corre:
Salve isso em
/etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Não acho que o nome realmente importe, mas o começo__
pode ser usado para fins de pedidos; portanto, se você mudar o nome, poderá manter os sublinhados. (Esta é uma cópia deste arquivo .)Em
/etc/default/grub
, localize a linha que começa comGRUB_CMDLINE_LINUX_DEFAULT
, e dentro das aspas que seguem, adicione o parâmetroaufs=tmpfs
.Bônus: Se você precisar ocasionalmente desativar o redirecionamento temporariamente, basta remover este argumento da lista de parâmetros do kernel. Provavelmente, você pode fazer isso mantendo pressionada a tecla Shift quando o sistema está inicializando, para mostrar o menu GRUB; depois pressione e para editar os parâmetros e apenas apague o
aufs=...
parâmetro da lista.Acrescente essas linhas a
/etc/sysctl.conf
. ( Aviso : risco potencial à segurança.)Execute estas linhas:
Se tudo correu bem, quando você reinicia, 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, poderá montar o
/ro
sistema de arquivos dizendopara torná-lo gravável e, em seguida, você pode fazer as modificações necessárias nesse diretório.
fonte
Sim, por unionfs, consulte unionfs.filesystems.org . Você montou o primeiro sistema de arquivos somente leitura e como o segundo sistema de arquivos RAM de leitura e gravação através do 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.
fonte
Você também pode fazer isso no nível do dispositivo, sem uma união como aufs. Consulte mapeador de dispositivos
snapshot-origin
.fonte