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