Monta a raiz como overlayfs

4

Eu tenho tentado montar a raiz (/) como overlayfs.

O SO está inicializando através do NFS para a RAM. Eu adicionei um script de premissa no initrd, que cria os diretórios 'work', 'upper' e 'lower'.

Durante o processo de boot estou copiando o conteúdo do NFS para o diretório 'inferior'. O Overlayfs está sendo montado em $ {rootmnt} depois disso.

Finalmente, o script de inicialização é chroots para $ {rootmnt} (próximo, init a partir da raiz real etc ...) e o SO funciona bem.

Naturalmente, não consigo ver os diretórios 'work' e 'upper'. Como posso fazer isso? O que devo mudar no initrd?

    
por Yurij Goncharuk 30.01.2018 / 12:30

1 resposta

3

O desafio de montar a raiz como overlayfs foi resolvido.

Resumidamente, os diretórios 'lower', 'work' e 'upper' devem ser movidos para o diretório 'merge'. No entanto, você deve considerar:

1) Não há necessidade de fazer algo se o diretório 'inferior' estiver presente como uma imagem de disco. Apenas montando. Se não, crie o ponto de montagem tmpfs e copie todos os arquivos necessários através do NFS para ele.

2) Os diretórios 'upper' e 'lower' devem estar localizados em um sistema de arquivos. Criar outro ponto de montagem tmpfs e, assim, colocar os diretórios 'upper' e 'lower' nele será suficiente.

3) Assegure-se de que seu initrd.img tenha módulos para NFS e Overlayfs. Se eles não existirem, adicione-os em / etc / initramfs-tools / modules.

4) Assegure-se de que seu initrd.img tenha a versão completa do comando 'mount'. Ele não existe e, em seguida, inclui-o em ganchos em /etc/initramfs-tools/hooks .

Por exemplo (alguns detalhes foram omitidos):

/etc/initramfs-tools/hooks/mount_full:

#!/bin/sh
PREREQ="/bin/mount"
prereqs()
{
    echo "$PREREQ"
}

case $1 in
    prereqs)
            prereqs
            exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions
# Begin real processing below this line

copy_exec /bin/mount /bin/mount_full

exit 0 

Por fim, adicione o script de pré-montagem em /etc/initramfs-tools/scripts/init-premount/ . Por exemplo:

/etc/initramfs-tools/scripts/init-premount/ramboot:

#!/bin/sh
PREREQ=""
prereqs()
{
    echo "$PREREQ"
}

case $1 in
    prereqs)
            prereqs
            exit 0
    ;;
esac

. /scripts/functions
# Begin real processing below this line

# Preparing work dirs
mkdir /overlaytmp
mkdir /overlaytmp/lower
mkdir /overlaytmp/upper_and_work
mkdir /overlaytmp/merge
mkdir /ramboottmp

# Preparing RAM disks and thus layers
mount -t tmpfs -o size=100% none /overlaytmp/lower
mount -t tmpfs -o size=100% none /overlaytmp/upper_and_work
mkdir /overlaytmp/upper_and_work/upper
mkdir /overlaytmp/upper_and_work/work

...
mount nfs_share /ramboottmp
...

# Copy root content over NFS to RAM
echo "Copying / to RAM ..."
cp -rfa /ramboottmp/* /overlaytmp/lower
# Preparing layers mount points
mkdir /overlaytmp/lower/mnt/lower
mkdir /overlaytmp/lower/mnt/upper_and_work
# Lower layer will be read-only
mount -o remount,ro /overlaytmp/lower

# Mounting overlayfs
mount -t overlay -olowerdir=/overlaytmp/lower,upperdir=/overlaytmp/upper_and_work/upper,workdir=/overlaytmp/upper_and_work/work none /overlaytmp/merge

# Moving layers to merge layer
mount --move /overlaytmp/lower /overlaytmp/merge/mnt/lower
mount --move /overlaytmp/upper_and_work /overlaytmp/merge/mnt/upper_and_work

# Moving merge layer to finally root
mount --move /overlaytmp/merge ${rootmnt}

umount /ramboottmp
    
por 02.02.2018 / 16:37