¿Cómo crear una imagen ext2 sin derechos de superusuario?

¿Cómo crear una imagen ext2 sin derechos de superusuario?

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 -dejemplo mínimo ejecutable sinsudo

mke2fses 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"

GitHub ascendente.

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 mke2fsfalla 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 tmpfsen lugar de extX como esos sistemas de archivos.no parece tener propiedades extendidas.

mke2fsa menudo tiene un enlace simbólico mkfs.extXy man mke2fsdice que si usa call if con dicho enlace simbólico, entonces -testá 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=1y 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:

Múltiples particiones en un archivo de imagen

Mira esto:https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-image- without-root-privileges/52850819#52850819

Respuesta2

Descubrí por qué e2fsimagefalla. 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 e2fsimagecon -nun 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

información relacionada