web-dev-qa-db-fra.com

Créer une image disque SD à partir de zéro: "vous devez spécifier un type de système de fichiers"

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
2
UsernameNumber

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:

  1. Créez l'image brute vierge: dd if=/dev/zero of=/image.img bs=1 count=100000000 (100MB)
  2. Créez la table de partition et la partition: Sudo parted -s image.img 'mklabel msdos mkpart primary 2048s 100%'
  3. Créez le système de fichiers: 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.

0
kos