La version courte :
J'essaie de créer une image disque qui inclut un MBR/bootloader fourni dans une autre image, et une partition avec un système de fichiers racine fourni dans un tarball. Créer le fichier image, le partitionner, l'associer à un loopback en utilisant la fonction kpartx
et l'application d'un système de fichiers semblent fonctionner. /dev/mapper/loopXp1
, mount dit you must specify a filesystem type
. Bien entendu, cela ne sert à rien.
Détails :
J'ai vu des tonnes de tutoriels sur la façon de créer une image à partir d'une carte SD existante et de l'écrire sur une autre, mais cela signifierait que mes utilisateurs devraient télécharger une image qui pourrait ne pas correspondre à la taille de leur carte SD, dont une grande partie n'est que des zéros ou d'autres déchets, puisque le système de fichiers de départ n'est pas très rempli.
Il semble donc judicieux de demander aux gens de télécharger un dd contenant uniquement le chargeur de démarrage, ainsi qu'un tarball du fs racine, puis d'exécuter un script qui crée une image de la taille souhaitée pour une distribution locale.
Malheureusement, bien que je puisse jurer que ces étapes ont fonctionné dans le passé, je continue à rencontrer le problème décrit ci-dessus.
Voici exactement ce que je fais :
#!/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 $1}')
# 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
Voici le texte complet bash -x
si quelqu'un le souhaite. Notez que les sorties de parted et de mkfs suggèrent toutes deux que le "disque" est partitionné et formaté avec succès.
Si quelqu'un voit ce qui ne va pas ici, j'apprécierais beaucoup qu'il me le dise. Je vous remercie de votre attention.
$ 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 $1}'
+ 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