Criando uma imagem de disco SD desde o início: “você deve especificar um tipo de sistema de arquivos”

2

A versão realmente curta:

Estou tentando criar uma imagem de disco que inclui um MBR / bootloader fornecido em outra imagem e uma partição com um sistema de arquivos raiz fornecido em um tarball. Criar o arquivo de imagem, particioná-lo, associá-lo a um loopback usando kpartx e aplicar um sistema de arquivos parece funcionar, mas quando tento montar /dev/mapper/loopXp1 , o mount diz you must specify a filesystem type . Fazer isso, claro, não ajuda.

Detalhes:

Eu vi vários tutoriais sobre como fazer uma imagem a partir de um SD existente e depois escrevê-lo para outro, mas isso significaria fazer com que meus usuários fizessem o download de uma imagem que não correspondesse ao tamanho de seu SD, muito do qual é apenas zeros ou outro lixo, já que o sistema de arquivos inicial não está muito cheio.

Assim, parece sensato apenas fazer com que as pessoas façam o download de apenas um dd do bootloader, além de um tarball do root fs, então execute um script que crie uma imagem do tamanho desejado para a distribuição local.

Infelizmente, embora eu possa jurar que esses passos funcionaram no passado, continuo encontrando o problema descrito acima.

Veja exatamente o que estou fazendo:

#!/bin/bash
# Adapted from instructions at http://linux-sunxi.org/Bootable_SD_card

# Settings
img_fn=test.img
img_size=2 #Gigs
img_mountpoint="fs"
img_bootsect="bootsect.img"
img_rootfs="rootfs.tar.bz2"

# Start a disk image file
dd if=/dev/zero of=$img_fn bs=1024 count=10 || exit

# Apply the bootloader
dd if=$img_bootsect of=$img_fn bs=1024 seek=8 || exit

# Extend the image to the desired size
truncate -s ${img_size}G $img_fn || exit

# Create one partition that fills the "disk"
# Using '0 -0' or '0 -1' here warns produces a warning that  the
# partition "is not properly aligned for best performance."
parted -s $img_fn 'mklabel msdos mkpart primary 1 -1 print' || exit

# Associate the file with a loopback device
sudo kpartx -a $img_fn || exit

# Get the name of the loopback device
rootfs_dev=/dev/mapper/$(sudo kpartx -l $img_fn | awk '{print }')

# Create mountpoint and filesystem, mount the new FS
[ -e $img_mountpoint ] || mkdir -p $img_mountpoint  || exit
sudo mkfs.ext4 $rootfs_dev  || exit

###
### THINGS BREAK HERE 
### mkfs appears to succeed, but mount fails with:
### "mount: you must specify the filesystem type"
###
sudo mount $rootfs_dev $img_mountpoint  || exit

sudo tar -C $img_mountpoint -jxf $img_rootfs  || exit

sudo umount $img_mountpoint
sudo kpartx -d $img_fn
rmdir $img_mountpoint

Heres é a saída completa de bash -x se alguém quiser. Note que as saídas de parted e mkfs sugerem que o "disco" está sendo particionado e formatado com sucesso.

Se alguém pode ver o que está errado aqui, eu realmente aprecio ouvir sobre isso. Obrigado!

$ bash -x mkimg.sh
+ img_fn=test.img
+ img_size=2  
+ img_mountpoint=fs
+ img_bootsect=bootsect.img
+ img_rootfs=rootfs.tar.bz2
+ dd if=/dev/zero of=test.img bs=1024 count=10
10+0 records in
10+0 records out
10240 bytes (10 kB) copied, 0.000968263 s, 10.6 MB/s
+ dd if=bootsect.img of=test.img bs=1024 seek=8
254+1 records in
254+1 records out
260260 bytes (260 kB) copied, 0.067996 s, 3.8 MB/s
+ truncate -s 2G test.img
+ parted -s test.img 'mklabel msdos mkpart primary 1 -1 print'
Model:  (file)
Disk /usr/local/tunapanda/provision/x2go_mystery/test.img: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  2147MB  2146MB  primary

+ sudo kpartx -a test.img
++ sudo kpartx -l test.img
++ awk '{print }'
+ rootfs_dev=/dev/mapper/loop3p1
+ '[' -e fs ']'
+ sudo mkfs.ext4 /dev/mapper/loop3p1
mke2fs 1.42 (29-Nov-2011)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524287 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

+ sudo mount /dev/mapper/loop3p1 fs
mount: you must specify the filesystem type
+ exit
    
por UsernameNumber 22.04.2015 / 22:32

1 resposta

0

Atualização : não forneci a solução correta antes; o que de fato funcionou para mim exigiu o uso de gparted , que você não pode usar.

Esse método deve funcionar (testei); você pode aplicar cada etapa às suas necessidades e automatizar tudo no script:

  1. Crie a imagem bruta em branco: dd if=/dev/zero of=/image.img bs=1 count=100000000 ( 100MB )
  2. Crie a tabela de partições e a partição: sudo parted -s image.img 'mklabel msdos mkpart primary 2048s 100%'
  3. Crie o sistema de arquivos: sudo mkfs.ext4 image.img

A chave aqui ( eu acho ) é a segunda etapa: por algum motivo, durante o teste eu não consegui criar uma imagem de disco de trabalho a partir de uma imagem de disco com uma partição mal alinhada sempre . Alinhar a partição fez o truque para mim.

    
por kos 22.04.2015 / 22:49