La version vraiment 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 une archive tar. Créer le fichier image, le partitionner, l'associer à un bouclage à l'aide de kpartx
et appliquer un système de fichiers semblent fonctionner, mais quand j'essaie de monter /dev/mapper/loopXp1
, Le montage dit you must specify a filesystem type
. Bien sûr, cela n'aide pas.
Détails:
J'ai vu des tonnes de tutoriels sur la façon de créer une image à partir d'une SD existante, puis de l'écrire sur une autre, mais cela signifierait que mes utilisateurs téléchargent une image qui peut ne pas correspondre à la taille de leur SD, dont une grande partie n'est que des zéros ou autre indésirable, car le système de fichiers de départ n'est pas très plein.
Ainsi, il semble judicieux de demander aux gens de télécharger uniquement un dd du chargeur de démarrage, plus un tarball du root fs, puis d'exécuter un script qui crée une image de la taille souhaitée pour la distribution locale.
Malheureusement, bien que je puisse jurer que ces étapes ont fonctionné dans le passé, je continue de 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 la sortie complète de bash -x
Si quelqu'un le veut. Notez que les sorties de parted et mkfs suggèrent toutes les deux que le "disque" est correctement partitionné et formaté.
Si quelqu'un peut voir ce qui ne va pas ici, j'apprécierais vraiment d'en entendre parler. Merci!
$ 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
pdate: Je n'ai pas fourni la solution correcte complète avant; ce qui a réellement fonctionné pour moi, il fallait aussi utiliser gparted
, ce que vous ne pouvez pas utiliser.
Cette méthode devrait fonctionner (je l'ai testée); vous pouvez ajuster chaque étape à vos besoins et automatiser tout dans le script:
dd if=/dev/zero of=/image.img bs=1 count=100000000
(100MB
)Sudo parted -s image.img 'mklabel msdos mkpart primary 2048s 100%'
Sudo mkfs.ext4 image.img
La clé ici (je pense) c'est la deuxième étape: pour une raison quelconque, pendant le test, je n'ai pas pu créer une image disque de travail à partir d'une image disque avec une partition mal alignée jamais . L'alignement de la partition a fait l'affaire pour moi.