¿Cómo uso OverlayFS?

54

Esta respuesta y este mensaje de correo electrónico indican que algo llamado "OverlayFS" está disponible en Ubuntu 11.10 y reemplazará a los aufs en Ubuntu 12.04.

¿Como lo uso? ¿Dónde está su documentación?

ændrük
fuente
1
Los dos juntos, hermano. Me he encontrado con esto hasta ahora: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Más allá de eso no tengo ni idea. Estoy jugando con él en un sistema en vivo, pero aún no he logrado que funcione. Desearía poder saber exactamente qué significan "upperdir" y "lowerdir". No he encontrado nada
Chuck R

Respuestas:

63

Editar: desde que escribimos esta respuesta, algunas cosas han cambiado en overlayfs, a saber, la adición de un parámetro requerido workdir, consulte la respuesta de totti a continuación para obtener una descripción detallada de este nuevo parámetro.

Finalmente logré encontrarlo. Encontré referencias a él en la fuente del kernel, pero por alguna razón no aparece en el árbol git en kernel.org. ¡Pero! Si extrae la fuente del núcleo de Ubuntu de esta manera: apt-get source linux-image-3.0.0-16-genericpuede encontrarla en linux-3.0.0/Documentation/overlayfs.txt. También está disponible en el paquete linux-doc en /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Como la documentación de ayuda real es más un "cómo funciona" en lugar de un "cómo montarlo", aquí hay un breve resumen (hay un ejemplo en la documentación del núcleo):

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

Donde [opciones de montaje] pueden ser:

  • lowerdir = somedir: lowerdir es el directorio sobre el que colocará su nuevo sistema de archivos, si hay duplicados, estos se sobrescriben (en realidad, se ocultan a favor de) la versión de upperdir
  • upperdir = somedir: upperdir es el directorio con el que desea superponer lowerdir. Si existen nombres de archivo duplicados en lowerdir y upperdir, la versión de upperdir tiene prioridad.
  • Opciones de montaje estándar. El único que he visto del código es ro / rw, pero puedes experimentar.

Una cosa que me confundió al principio, por lo que probablemente debería aclarar, es que montar un overlayfs en realidad no monta un sistema de archivos. Estaba tratando de montar un sistema de archivos squashfs usando un montaje overlayfs, pero no es así como funciona. Primero debe montar el sistema de archivos (en mi caso squashfs) en un directorio arbitrario, luego usar overlayfs para fusionar el punto de montaje (un directorio) y otro directorio en un directorio terciario (el punto de montaje overlayfs) (editar: este directorio "terciario" en realidad puede ser el directorio upperdir =). El directorio terciario es donde verá los sistemas de archivos fusionados (o árboles de directorios, es flexible).

Ejemplo 1, superposición del sistema de archivos raíz

He estado trabajando en un disco de arranque híbrido de Ubuntu donde el sistema base de Ubuntu existe como filesystem.squashfs y tengo archivos llamados ubuntu.overlay kubuntu.overlay xubuntu.overlay y lubuntu.overlay. Los archivos .overlay son instalaciones básicas de dichos sistemas con los contenidos de filesystem.squashfs podados (para ahorrar espacio). Luego modifiqué los scripts de inicio para superponer el archivo .overlay de la distribución correcta (desde un parámetro de arranque) usando overlayfs y las opciones anteriores y ¡funciona de maravilla!

Estas son las líneas que utilicé en mis scripts de inicio (una vez que se traducen todas las variables):

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

Tenga en cuenta que filesystem.squashfs anterior es un directorio creado por casper, no un archivo.

Estas tres declaraciones crean un /overlaydirectorio, montan un sistema de archivos squashfs en el /overlaydirectorio y luego usan OverlayFS para fusionar esencialmente el contenido de /overlayover /.

Ejemplo 2, fusión transparente de dos directorios

En el proceso de reconstrucción de mi USB en vivo para cada versión, uso OverlayFS para ahorrar un montón de tiempo. Comienzo con un directorio llamado ubuntu-base que contiene el contenido de la imagen ubuntu-core, que es la instalación más básica. Luego crearé directorios llamados ubuntu, kubuntu, lubuntu y xubuntu.

Luego, uso OverlayFS para hacer que los archivos de ubuntu-base aparezcan en los directorios individuales. Yo usaría algo como esto:

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

Esto hace que los archivos de ubuntu-base aparezcan en la carpeta kubuntu. Entonces, puedo chrootir a la carpeta kubuntu y hacer algo como apt-get install kubuntu-desktop. Cualquier cambio que se realice mientras está en este montaje OverlayFS permanecerá en el directorio superior, en este caso la carpeta kubuntu. Luego, una vez que desmonte el OverlayFS, monte los archivos que realmente existen en ubuntu-base pero que están "reflejados" en la carpeta kubuntu desaparecen a menos que hayan sido cambiados. Esto evita que tenga que tener múltiples copias de los archivos en ubuntu-base y al mismo tiempo poder usarlas como si existieran físicamente en cada ubicación.

Chuck R
fuente
3
"pero por alguna razón no aparece en el árbol de git en kernel.org" - Eso se debe a que overlayfs no está en el kernel ascendente, al igual que aufs no lo está (y nunca lo estará). Dichos sistemas de archivos de unión están integrados por Ubuntu Kernel Team.
MestreLion
2
OverlayFS aparentemente está entrando en el kernel 3.10.
David C. Bishop
8
Finalmente, debería ir en 3.18 lwn.net/Articles/617099
Rmano
44
@Rmano: en mi máquina solo funciona con overlayno conoverlayfs
Janus Troelsen
1
Gracias @austinmarton, encontré esto hace un tiempo también y totti lo cubrió a continuación antes de actualizar mi respuesta, así que le di crédito a su respuesta en la parte superior de la mía.
Chuck R
20

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

Superior e inferior

Un sistema de archivos superpuesto combina dos sistemas de archivos: un sistema de archivos 'superior' y un sistema de archivos 'inferior'. Cuando existe un nombre en ambos sistemas de archivos, el objeto en el sistema de archivos 'superior' es visible mientras que el objeto en el sistema de archivos 'inferior' está oculto o, en el caso de directorios, fusionado con el objeto 'superior'.

Sería más correcto referirse a un 'árbol de directorios' superior e inferior en lugar de a un 'sistema de archivos', ya que es bastante posible que ambos árboles de directorios estén en el mismo sistema de archivos y no es necesario que se proporcione la raíz de un sistema de archivos para ya sea superior o inferior.

El sistema de archivos inferior puede ser cualquier sistema de archivos compatible con Linux y no es necesario que se pueda escribir. El sistema de archivos inferior puede incluso ser otro overlayfs. El sistema de archivos superior normalmente se podrá escribir y, si lo es, debe admitir la creación de atributos extendidos. * Confiables y debe proporcionar d_type válido en las respuestas readdir, por lo que NFS no es adecuado.

Una superposición de solo lectura de dos sistemas de archivos de solo lectura puede usar cualquier tipo de sistema de archivos.

Directorios

La superposición implica principalmente directorios. Si un nombre dado aparece en los sistemas de archivos superior e inferior y hace referencia a un no directorio en cualquiera de ellos, entonces el objeto inferior está oculto; el nombre se refiere solo al objeto superior.

Donde los objetos superiores e inferiores son directorios, se forma un directorio combinado.

En el momento del montaje, los dos directorios dados como opciones de montaje "lowerdir" y "upperdir" se combinan en un directorio combinado:

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

El "workdir" debe ser un directorio vacío en el mismo sistema de archivos que upperdir.

Luego, cada vez que se solicita una búsqueda en dicho directorio combinado, la búsqueda se realiza en cada directorio real y el resultado combinado se almacena en caché en la dentry que pertenece al sistema de archivos de superposición. Si ambas búsquedas reales encuentran directorios, ambos se almacenan y se crea un directorio combinado; de lo contrario, solo se almacena uno: el superior si existe, y el inferior.

Solo se fusionan las listas de nombres de directorios. Otro contenido, como metadatos y atributos extendidos, se informa solo para el directorio superior. Estos atributos del directorio inferior están ocultos.

totti
fuente
44
Gracias por la aclaración sobre workdir. Ese fue un cambio bastante reciente y, por alguna razón, nunca pude encontrar ninguna documentación sobre lo que realmente hizo 'workdir'. No estaba en la ayuda del núcleo la última vez que miré. Agrega una capa de confusión a la superposición de IMO, desearía que las versiones más nuevas pudieran usarse sin ella, de alguna manera arruina mi flujo de trabajo.
Chuck R
7

He extendido estos artículos para incluir un Script para overlayfs que configura una raíz fs de solo lectura.

Espero eso ayude.

Floyd42
fuente
1
Gracias al trabajo que otros hicieron, Dustin y yo hemos agregado un paquete banary llamado 'overlayroot' a quantal, que es parte del paquete fuente cloud-initramfs-tools . Consulte la documentación de uso en /etc/overlayroot.conf
smoser
2

Ejemplo ejecutable mínimo

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

Salida del primero lscon el soporte:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Salida del segundo lssin el soporte:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Interpretación:

  • inferior: no se modificó después de escribir en superposición
  • superior: recibió la modificación para superponer
  • superposición: muestra archivos de arriba y de abajo
  • trabajo: contiene contenido aleatorio (un work/directorio) que no deberíamos preocuparnos

Ejemplo adaptado de: Ejemplo de uso de OverlayFS

Aquí hay un ejemplo más complejo con múltiples capas inferiores: Overlayfs recarga con múltiples capas (migración lejos de aufs)

Probado en Ubuntu 18.04, kernel de Linux 4.15.0.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente