Como criar uma imagem ext2 sem direitos de superusuário?

Como criar uma imagem ext2 sem direitos de superusuário?

Preciso gerar várias imagens ext2. A maneira óbvia de fazer isso é criar uma imagem, montá-la e copiar o conteúdo. Mas requer permissões de root duas vezes (para exibir os arquivos e montar a imagem). Também encontrei duas ferramentas para geração de imagens: e2fsimage e genext2fs.

  • genext2fs coloca a imagem na RAM durante a geração, mas o tamanho de uma das minhas imagens é de aproximadamente 30GiB.

  • e2fsimage trava com alguns valores de tamanho de imagem.

Então, como posso gerar minhas imagens? Seria bom se a própria ferramenta calculasse o tamanho da imagem.

Responder1

mke2fs -dexemplo executável mínimo semsudo

mke2fsfaz parte do pacote e2fsprogs. Ele foi escrito pelo famoso desenvolvedor de sistema de arquivos do kernel Linux, Theodore Ts'o, que está no Google desde 2018, e o upstream de origem está em kernel.org em:https://git.kernel.org/pub/scm/fs/ext2/e2fsprogsPortanto, esse repositório pode ser considerado uma implementação de referência do usuário para operações do sistema de arquivos 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"

upstream do GitHub.

A opção principal é -d, que seleciona qual diretório usar para a imagem, e é uma adição relativamente nova à v1.43 no commit0d4deba22e2aa95ad958b44972dc933fd0ebbc59

Portanto, ele funciona no Ubuntu 18.04 pronto para uso, que possui o e2fsprogs 1.44.1-1, mas não no Ubuntu 16.04, que está no 1.42.13.

No entanto, podemos fazer como o Buildroot e compilá-lo facilmente a partir do código-fonte no Ubuntu 16.04 com:

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

Se mke2fsfalhar com:

__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system

ao adicionar a opção:

-E no_copy_xattrs

Isto é necessário, por exemplo, quando o diretório raiz está em NFS ou tmpfsem vez de extX como esses sistemas de arquivosnão parecem ter propriedades estendidas.

mke2fsgeralmente tem um link simbólico para mkfs.extXe man mke2fsdiz que se você usar call if com esse link simbólico, isso -testará implícito.

Como descobri isso e como resolver quaisquer problemas futuros:Raiz de construçãogera imagens ext2 sem sudocomo mostrado aqui, então apenas executei o build V=1e extraí os comandos da parte de geração de imagem que vem logo no final. O bom e velho copiar e colar nunca me falhou.

TODO: descreva como resolver os seguintes problemas:

Várias partições em um arquivo de imagem

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

Responder2

Descobri por que e2fsimagetrava. É causado pelo estouro do int32 quando o tamanho da imagem é maior que 4GiB. Portanto, a solução é contar os blocos e inodes necessários, criar o arquivo de loop ( truncate& mke2fs) e depois usar e2fsimagecom -nargumento (para que não crie o arquivo de loop, mas use um já criado)

Responder3

A criação de imagem não precisa de privilégio de root. Aqui está um exemplo para criar uma imagem ext2:

dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2

mas o privilégio root é necessário para montar o dispositivo:

mkdir MyDisk
sudo mount ./MyDisk.ext2 MyDisk

informação relacionada