Necesito generar varias imágenes ext2. La forma obvia de hacerlo es crear una imagen, montarla y copiar el contenido. Pero requiere permisos de root dos veces (para editar los archivos y montar la imagen). También encontré dos herramientas para generar imágenes: e2fsimage y genext2fs.
genext2fs coloca la imagen en la RAM mientras la genera, pero el tamaño de una de mis imágenes es ~30GiB.
e2fsimage falla con algunos valores de tamaño de imagen.
Entonces, ¿cómo puedo generar mis imágenes? Sería bueno que la herramienta calculara el tamaño de la imagen por sí misma.
Respuesta1
mke2fs -d
ejemplo mínimo ejecutable sinsudo
mke2fs
es parte del paquete e2fsprogs. Está escrito por el famoso desarrollador del sistema de archivos del kernel de Linux, Theodore Ts'o, que está en Google desde 2018, y la fuente ascendente se encuentra en kernel.org en:https://git.kernel.org/pub/scm/fs/ext2/e2fsprogsPor lo tanto, ese repositorio puede considerarse una implementación de referencia en el espacio de usuario de las operaciones del sistema de archivos ext:
#!/usr/bin/env bash
set -eu
root_dir=root
img_file=img.ext2
# Create a test directory to convert to ext2.
mkdir -p "$root_dir"
echo asdf > "${root_dir}/qwer"
# Create a 32M ext2 without sudo.
# If 32M is not enough for the contents of the directory,
# it will fail.
rm -f "$img_file"
mke2fs \
-L '' \
-N 0 \
-O ^64bit \
-d "$root_dir" \
-m 5 \
-r 1 \
-t ext2 \
"$img_file" \
32M \
;
# Test the ext2 by mounting it with sudo.
# sudo is only used for testing.
mountpoint=mnt
mkdir -p "$mountpoint"
sudo mount "$img_file" "$mountpoint"
sudo ls -l "$mountpoint"
sudo cmp "${mountpoint}/qwer" "${root_dir}/qwer"
sudo umount "$mountpoint"
La opción clave es -d
, que selecciona qué directorio usar para la imagen, y es una adición relativamente nueva a v1.43 en la confirmación.0d4deba22e2aa95ad958b44972dc933fd0ebbc59
Por lo tanto, funciona en Ubuntu 18.04 listo para usar, que tiene e2fsprogs 1.44.1-1, pero no en Ubuntu 16.04, que está en 1.42.13.
Sin embargo, podemos hacer lo mismo que Buildroot y compilarlo desde el código fuente fácilmente en Ubuntu 16.04 con:
git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
cd e2fsprogs
git checkout v1.44.4
./configure
make -j`nproc`
./misc/mke2fs -h
Si mke2fs
falla con:
__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system
cuando agregue la opción:
-E no_copy_xattrs
Esto es necesario, por ejemplo, cuando el directorio raíz está en NFS o tmpfs
en lugar de extX como esos sistemas de archivos.no parece tener propiedades extendidas.
mke2fs
a menudo tiene un enlace simbólico mkfs.extX
y man mke2fs
dice que si usa call if con dicho enlace simbólico, entonces -t
está implícito.
Cómo descubrí esto y cómo resolver cualquier problema futuro:raíz de compilacióngenera imágenes ext2 sin sudocomo se muestra aquí, así que simplemente ejecuté la compilación V=1
y extraje los comandos de la parte de generación de imágenes que viene justo al final. El buen copiar y pegar nunca me ha fallado.
TODO: describe cómo resolver los siguientes problemas:
- cree archivos propiedad de sudo en la imagen. Buildroot lo hace.
- Calcula automáticamente el tamaño mínimo requerido. La estimación inicial
du
para el tamaño del archivo yfind . | wc
la estructura del directorio, mínimo con 32 Mb (fallas más pequeñas), luego duplicar hasta que el comando funcione, es probablemente un enfoque muy decente. Buildroot solía hacer esto, pero se detuvo por alguna razón, pero es fácil de implementar nosotros mismos. - extraiga convenientemente todos los archivos de la partición:
Múltiples particiones en un archivo de imagen
Respuesta2
Descubrí por qué e2fsimage
falla. Es causado por el desbordamiento de int32 cuando el tamaño de la imagen es superior a 4GiB. Entonces, la solución es contar los bloques e inodos requeridos, crear un archivo de bucle ( truncate
& mke2fs
) y luego usarlo e2fsimage
con -n
un argumento (por lo que no creará el archivo de bucle sino que usará uno ya creado)
Respuesta3
Crear una imagen no necesita privilegios de root. Aquí hay un ejemplo para crear una imagen ext2:
dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2
pero se necesita el privilegio de root para montar el dispositivo:
mkdir MyDisk
sudo mount ./MyDisk.ext2 MyDisk