Como uso o OverlayFS?

54

Esta resposta e mensagem de email indicam que algo chamado "OverlayFS" está disponível no Ubuntu 11.10 e substituirá forçosamente os aufs no Ubuntu 12.04.

Como eu uso isso? Onde está a documentação?

ændrük
fonte
11
Você e eu, irmão. Eu me deparei com isso até agora: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Além disso, eu não tenho noção. Estou mexendo com ele em um sistema ativo, mas ainda não consegui fazê-lo funcionar. Eu gostaria de descobrir exatamente o que "upperdir" e "lowerdir" significam. Não encontrei nada.
mandril R

Respostas:

63

Edit: Desde que escrevemos esta resposta, algumas coisas mudaram em overlayfs, a saber, a adição de um parâmetro necessário workdir, consulte a resposta de totti abaixo para obter uma descrição detalhada desse novo parâmetro.

Eu finalmente consegui encontrar. Encontrei referências a ele no código-fonte do kernel, mas por algum motivo ele não aparece na árvore do git no kernel.org. Mas! Se você puxar a fonte do kernel do Ubuntu assim: apt-get source linux-image-3.0.0-16-genericvocê pode encontrá-la linux-3.0.0/Documentation/overlayfs.txt. Também está disponível no pacote linux-doc em /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Como a documentação de ajuda real é mais "como funciona" em vez de "como montar com ela", aqui está um breve resumo (há um exemplo na documentação do kernel):

mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]

Onde [opções de montagem] podem estar:

  • lowerdir = somedir: lowerdir é o diretório em que você colocará seu novo sistema de arquivos, se houver duplicatas, essas serão substituídas pela (na verdade, oculta a favor da) versão do upperdir
  • upperdir = somedir: upperdir é o diretório com o qual você deseja sobrepor o lowerdir. Se existirem nomes de arquivos duplicados em lowerdir e upperdir, a versão do upperdir terá precedência.
  • opções de montagem padrão. O único que eu vi do código é ro / rw, mas você pode experimentar.

Uma coisa que me confundiu no começo, então eu provavelmente deveria esclarecer, é que montar um overlayfs na verdade não monta um sistema de arquivos. Eu estava tentando montar um sistema de arquivos squashfs usando uma montagem overlayfs, mas não é assim que funciona. Você deve primeiro montar o sistema de arquivos (no meu caso, squashfs) em um diretório arbitrário e depois usar overlayfs para mesclar o ponto de montagem (um diretório) e outro diretório em um diretório terciário (o ponto de montagem overlayfs) (editar: este diretório "terciário" pode realmente ser o diretório upperdir =). O diretório terciário é onde você verá os sistemas de arquivos mesclados (ou árvores de diretórios - é flexível).

Exemplo 1, sobrepondo o sistema de arquivos raiz

Estou trabalhando em um disco de inicialização híbrido do Ubuntu, onde o sistema Ubuntu básico existe como filesystem.squashfs e tenho arquivos chamados ubuntu.overlay kubuntu.overlay xubuntu.overlay e lubuntu.overlay. Os arquivos .overlay são instalações básicas dos referidos sistemas com o conteúdo de filesystem.squashfs podado (para economizar espaço). Então eu modifiquei os scripts init para sobrepor o arquivo .overlay da distribuição correta (a partir de um parâmetro de inicialização) usando overlayfs e as opções acima e funciona como um encanto!

Estas são as linhas que eu usei nos meus scripts init (depois que todas as variáveis ​​forem traduzidas):

mkdir -p /overlay
mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay
mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs /

Observe que o filesystem.squashfs acima é um diretório criado pelo casper, não um arquivo.

Essas três instruções criam um /overlaydiretório, montam um sistema de arquivos squashfs no /overlaydiretório e, em seguida, usam OverlayFS para mesclar essencialmente o conteúdo de /overlayover /.

Exemplo 2, mesclagem transparente de dois diretórios

No processo de reconstrução do meu USB ativo para cada versão, uso o OverlayFS para economizar muito tempo. Começo com um diretório chamado ubuntu-base, que contém o conteúdo da imagem do ubuntu-core, que é a instalação mais básica. Vou então criar diretórios chamados ubuntu, kubuntu, lubuntu e xubuntu.

Então, eu uso o OverlayFS para fazer com que os arquivos da base do ubuntu apareçam nos diretórios individuais. Eu usaria algo como isto:

mount -t overlayfs -o lowerdir=ubuntu-base,upperdir=kubuntu overlayfs kubuntu

Isso faz com que os arquivos do ubuntu-base apareçam na pasta kubuntu. Então, posso chrootir para a pasta do kubuntu e fazer algo parecido apt-get install kubuntu-desktop. Quaisquer alterações feitas durante a montagem do OverlayFS permanecerão no diretório superior, neste caso, na pasta do kubuntu. Então, uma vez desmontado, o OverlayFS monta os arquivos que realmente existem no ubuntu-base, mas que são "espelhados" na pasta do kubuntu desaparecem, a menos que tenham sido alterados. Isso me impede de ter várias cópias dos arquivos no ubuntu-base e ainda poder usá-las como se elas existissem fisicamente em cada local.

Chuck R
fonte
3
"mas, por algum motivo, ele não aparece na árvore git no kernel.org" - Isso ocorre porque o overlayfs não está no kernel upstream, assim como o aufs não está (e nunca estará). Esses sistemas de arquivos da união são integrados pelo Ubuntu Kernel Team.
MestreLion
2
Aparentemente, o OverlayFS está entrando no kernel 3.10.
David C. Bishop
8
Finalmente, deve entrar em 3,18 lwn.net/Articles/617099
Rmano
4
@Rmano: na minha máquina funciona apenas com overlaynão comoverlayfs
Janus Troelsen
11
Obrigado @austinmarton, também achei isso um tempo atrás e o totti cobriu o assunto abaixo antes de atualizar minha resposta, por isso dei crédito à sua resposta na parte superior da minha.
mandril R
20

Em https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt :

Alto e baixo

Um sistema de arquivos de sobreposição combina dois sistemas de arquivos - um sistema de arquivos 'superior' e um sistema de arquivos 'inferior'. Quando existe um nome nos dois sistemas de arquivos, o objeto no sistema de arquivos 'superior' fica visível enquanto o objeto no sistema de arquivos 'inferior' está oculto ou, no caso de diretórios, é mesclado com o objeto 'superior'.

Seria mais correto se referir a uma 'árvore de diretórios' superior e inferior do que a um 'sistema de arquivos', pois é possível que ambas as árvores de diretórios estejam no mesmo sistema de arquivos e não é necessário que a raiz de um sistema de arquivos seja fornecida para superior ou inferior.

O sistema de arquivos inferior pode ser qualquer sistema de arquivos suportado pelo Linux e não precisa ser gravável. O sistema de arquivos inferior pode até ser outro overlayfs. O sistema de arquivos superior normalmente será gravável e, se for, deve suportar a criação de atributos estendidos confiáveis. * E deve fornecer d_type válido nas respostas readdir, para que o NFS não seja adequado.

Uma sobreposição somente leitura de dois sistemas de arquivos somente leitura pode usar qualquer tipo de sistema de arquivos.

Diretórios

A sobreposição envolve principalmente diretórios. Se um determinado nome aparecer nos sistemas de arquivos superior e inferior e se referir a um não diretório em qualquer um deles, o objeto inferior ficará oculto - o nome se refere apenas ao objeto superior.

Onde os objetos superior e inferior são diretórios, um diretório mesclado é formado.

No momento da montagem, os dois diretórios fornecidos como opções de montagem "lowerdir" e "upperdir" são combinados em um diretório mesclado:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

O "workdir" precisa ser um diretório vazio no mesmo sistema de arquivos que o upperdir.

Então, sempre que uma pesquisa é solicitada em um diretório mesclado, a pesquisa é realizada em cada diretório real e o resultado combinado é armazenado em cache no dentry pertencente ao sistema de arquivos de sobreposição. Se as duas pesquisas reais encontrarem diretórios, ambos serão armazenados e um diretório mesclado será criado; caso contrário, apenas um será armazenado: o superior, se existir, e o inferior.

Somente as listas de nomes dos diretórios são mescladas. Outros conteúdos, como metadados e atributos estendidos, são relatados apenas para o diretório superior. Esses atributos do diretório inferior estão ocultos.

totti
fonte
4
Obrigado pelo esclarecimento sobre o workdir. Essa foi uma mudança relativamente recente e, por qualquer motivo, nunca consegui encontrar nenhuma documentação sobre o que o 'workdir' realmente fez. Não estava na ajuda do kernel nem na última vez que olhei. Adiciona uma camada de confusão ao overlayfs IMO, desejando que as versões mais recentes pudessem ser usadas sem ele - isso meio que atrapalha o meu fluxo de trabalho.
Chuck R
7

Estendi esses artigos para incluir um script para overlayfs que configura um fs raiz somente leitura.

Espero que ajude.

Floyd42
fonte
11
Graças ao trabalho que outros fizeram, Dustin e eu adicionamos um pacote banary chamado 'overlayroot' ao quantal, que faz parte do pacote de código - fonte do cloud-initramfs-tools . Veja a documentação de uso em /etc/overlayroot.conf
smoser
2

Exemplo mínimo executável

# Create the filesystems.
dd if=/dev/zero of=lower.ext4 bs=1024 count=102400
mkfs -t ext4 lower.ext4
cp lower.ext4 upper.ext4
mkdir lower upper overlay
sudo mount lower.ext4 lower
sudo mount upper.ext4 upper
sudo chown "$USER:$USER" lower upper
printf lower-content > lower/lower-file
# Upper and work must be on the same filesystem.
mkdir upper/upper upper/work
printf upper-content > upper/upper/upper-file
# Work must be empty. E.g. this would be bad:
#printf work-content > upper/work/work-file
# Make the lower readonly to show that that is possible:
# writes actually end up on the upper filesystem.
sudo mount -o remount,ro lower.ext4 lower

# Create the overlay mount.
sudo mount \
  -t overlay \
  -o lowerdir=lower,upperdir=upper/upper,workdir=upper/work \
  none \
  overlay \
;

# Interact with the mount.
printf 'overlay-content' > overlay/overlay-file
ls lower upper/upper upper/work overlay

# Write to underlying directories while mounted
# gives undefined behaviour.
#printf lower-content-2 > lower/lower-file-2
#printf upper-content-2 > upper/upper-file-2

# Unmount the overlay and observe state.
sudo umount overlay
ls lower upper/upper upper/work

# Cleanup.
sudo umount upper lower

GitHub upstream .

Saída do primeiro lscom o suporte:

lower:
lost+found  lower-file

overlay:
lost+found  lower-file  overlay-file  upper-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Saída do segundo lssem a montagem:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Interpretação:

  • inferior: permaneceu inalterado após gravar na sobreposição
  • superior: recebeu a modificação para sobrepor
  • sobreposição: mostra arquivos das partes superior e inferior
  • trabalho: contém algum conteúdo aleatório (um work/diretório) com o qual não devemos nos preocupar

Exemplo adaptado de: Exemplo de uso de OverlayFS

Aqui está um exemplo mais complexo com várias camadas inferiores: Overlayfs são recarregados com várias camadas (migração para longe de aufs)

Testado no Ubuntu 18.04, kernel do Linux 4.15.0.

Ciro Santilli adicionou uma nova foto
fonte