Comment créer un fichier image de partition formatée à partir de zéro?

16

J'ai besoin de créer un système de fichiers avec une seule partition à partir de rien ( /dev/zero). J'ai essayé cette séquence de commandes:

dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
    n
    p 
    2048
    131072

Fondamentalement, je dois créer un fichier image de 64 Mo rempli de zéros. Ensuite, j'utilise fdiskpour ajouter une nouvelle partition pour le nouveau système de fichiers (qui devrait finalement être FAT32), en commençant par le secteur 2048et en utilisant tous les secteurs restants.

losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1

Mais ici, je rencontre des problèmes. Si je configure un looppériphérique et le formate en utilisant mkfs -t vfat, la table de partition est écrasée et le système de fichiers (FAT32) est placé sur le disque. Je n'ai pas besoin d'un disque entier formaté en FAT32, j'ai juste besoin que ma partition principale le soit.

Est-ce que quelqu'un sait comment formater une seule partition de l'image disque brute, pas l'image entière?

user35443
la source
Veuillez clarifier ce que vous entendez par configurer un périphérique en boucle et publier votre mkfsappel en entier . J'ai dû lire votre message 3 fois pour comprendre votre problème. Bien que je ne puisse pas vous aider, je suis intéressé par la raison pour laquelle vous créez un fichier image (!) Mais vous voulez toujours laisser les n premiers "secteurs" inutilisés.
Bananguin
Ok, édité. Je veux laisser les n premiers secteurs (qu'est-ce qui ne va pas avec les secteurs?) Inutilisés, car je dois placer mes chargeurs de démarrage quelque part.
user35443
Crossposted
Michael Mrozek
@MichaelMrozek Il y a des considérations qui s'appliquent à certaines distributions Linux mais pas à Ubuntu (cela importe qu'il s'agisse d' loopun module ou intégré au noyau), donc je pense qu'il est utile que chaque site ait sa version de la question et j'ai voté pour la réouverture.
Gilles 'SO- arrête d'être méchant'
@MichaelMrozek Personnellement, je pense que AskUbuntu est plus spécifique qu'Unix et Linux, donc si une question est post-cross pour les deux, à moins qu'il y ait des raisons spécifiques de fermer ici, c'est celle sur AskUbuntu qui devrait être fermée comme post-cross si elle était affichés à temps les uns par rapport aux autres, quel que soit l'endroit où ils ont été publiés "en premier" (éventuellement avec une mention des réponses Ubuntu / non Ubuntu ici). Ici, il a une réponse acceptée, ce qui n'est pas le cas sur AskUbuntu, ce qui favorise fortement le maintien de cette OMI ouverte. Je n'ai pas le représentant pour voter pour clore AskUbuntu mais je vote pour rouvrir la question ici.
un CVn le

Réponses:

20

Si sous Linux, lors du chargement du loopmodule, assurez-vous de passer une max_partoption au module afin que les périphériques de boucle soient partitionnables.

Vérifiez la valeur actuelle:

cat /sys/module/loop/parameters/max_part

Si c'est 0:

modprobe -r loop # unload the module
modprobe loop max_part=31

Pour rendre ce paramètre persistant, ajoutez la ligne suivante à /etc/modprobe.confou dans un fichier /etc/modprobe.dsi ce répertoire existe sur votre système:

options loop max_part=31

Si modprobe -r loopéchoue parce que «la boucle de module est intégrée», vous devrez ajouter loop.max_part=31à votre ligne de commande du noyau et redémarrer. Si votre chargeur de démarrage est Grub2, ajoutez-le à la valeur de GRUB_CMDLINE_LINUXin etc/default/grub.

Maintenant, vous pouvez créer un périphérique de boucle partitionnable:

truncate -s64M file # no need to fill it with zeros, just make it sparse
fdisk file # create partitions
losetup /dev/loop0 file
mkfs.vfat /dev/loop0p1 # for the first partition.
mount /dev/loop0p1 /mnt/

(notez que vous avez besoin d'une version relativement récente de Linux).

Stéphane Chazelas
la source
FATAL: La boucle de module est intégrée, cela peut-il être résolu en installant la dernière version d'ubuntu (j'ai 12.04)?
user35443
Si est intégré tout simplement pas nécessaire pour modprobe, passez le loop.max_part=31à la ligne de commande du noyau
Alex
1
Ah je vois, si vous avez un noyau récent et que vous passez la max_part, l'offset et la sizelimit ne sont pas du tout nécessaires
Alex
Hmm, ligne de commande du noyau, trop difficile pour moi. Merci encore, acceptez.
user35443
Est-ce loop.maxpart=31ou loop.max_part=31sur la ligne de commande du noyau?
Cristian Ciupitu
4

losetup /dev/loop0 file -o 1048576 --sizelimit limit

Le décalage spécifié doit être en octets (1048576 = 2048 secteurs * 512 octets par secteur).

mount -o loop,offset=1048576,sizelimit=limit

Pour plus d'informations, voir losetup et mount .

Alex
la source
Hmm, offset, cela devrait fonctionner. Et si j'avais plus de partitions dessus?
user35443
Je suppose qu'une boucle = une partition = un décalage.
Alex
euh, et y a-t-il une option pour spécifier également la taille, donc je pourrais la limiter et y placer plus de partitions?
user35443
Désolé ma faute pour créer une nouvelle réponse avec une solution partielle, la bonne réponse est de @ "Stéphane Chazelas", il peut simplement ajouter les options de décalage et de taille limite (puis je supprimerai la mienne)
Alex
Non, que ce soit ici, ou le mien +1 n'ira nulle part.
user35443
2

Les procédures suivantes vous permettent de monter les partitions de l'image pour les modifier.

option losetup 2.21 -P

losetup -P -f --show my.img

Crée un /dev/loopXpY par partition.

Avantage: exécutable pré-installé dans de nombreuses distributions (paquet util-linux).

Inconvénient: option assez récente, non présente dans Ubuntu 14.04.

losetup -P automatisation

Usage:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

La source:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

kpartx

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

Production:

/dev/mapper/loop0
/dev/mapper/loop0p1

loop0p1est la première partition, nous pouvons donc faire:

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

Avantage de cette méthode: fonctionne sur Ubuntu 14.04 sans redémarrage.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source