Come creare un file immagine di partizione formattata da zero?


16

Devo creare un filesystem con una sola partizione dal nulla ( /dev/zero). Ho provato questa sequenza di comandi:

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

Fondamentalmente, devo creare un file di immagine da 64 MB pieno di zero. Quindi uso fdiskuna nuova partizione per il nuovo filesystem (che dovrebbe finalmente essere FAT32), a partire dal settore 2048e usando tutti i settori rimanenti.

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

Ma qui sto colpendo problemi. Se installo un loopdispositivo e lo formatto usando mkfs -t vfat, la tabella delle partizioni viene sovrascritta e il filesystem (FAT32) viene posizionato sul disco. Non ho bisogno di un intero disco formattato con FAT32, ho solo bisogno che la mia partizione primaria sia così.

Qualcuno sa come posso formattare solo una partizione dell'immagine del disco grezzo, non l'intera immagine?


Chiarisci cosa intendi impostando un dispositivo loop e pubblica l'intera mkfschiamata. Ho dovuto leggere il tuo post 3 volte per capire il tuo problema. Anche se non posso aiutarti, sono interessato al motivo per cui crei un file di immagine (!) Ma voglio comunque lasciare inutilizzati i primi n "settori".
Bananguin,

Ok, l'ho modificato. Voglio lasciare inutilizzati i primi n settori (cosa c'è che non va nei settori?), Poiché devo posizionare i miei bootloader da qualche parte.
user35443


@MichaelMrozek Ci sono considerazioni che si applicano ad alcune distribuzioni Linux ma non a Ubuntu (importa se si looptratta di un modulo o incorporato nel kernel), quindi penso che sia utile per ogni sito avere la sua versione della domanda e ho votato per riaprire.
Gilles 'SO- smetti di essere malvagio' il

@MichaelMrozek Personalmente, penso che AskUbuntu sia più specifico di Unix e Linux, quindi se una domanda viene inviata in cross-post ad entrambi, a meno che non ci siano motivi specifici per chiudere qui è quella su AskUbuntu che dovrebbe essere chiusa come cross-post se fosse postati uno vicino all'altro nel tempo, indipendentemente da dove sia stato pubblicato "primo" (possibilmente con una menzione delle risposte Ubuntu / non Ubuntu qui). Qui ha una risposta accettata, cosa che non su AskUbuntu, che favorisce fortemente mantenendo questo IMO aperto. Non ho il rappresentante per votare per chiudere su AskUbuntu ma sto votando per riaprire la domanda qui.
un CVn

Risposte:


20

Se su Linux, durante il caricamento del loopmodulo, assicurarsi di passare max_partun'opzione al modulo in modo che i dispositivi loop siano partizionabili.

Verifica il valore corrente:

cat /sys/module/loop/parameters/max_part

Se è 0:

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

Per rendere persistente questa impostazione, aggiungere la seguente riga a /etc/modprobe.confo a un file /etc/modprobe.dse quella directory esiste sul sistema:

options loop max_part=31

Se modprobe -r loopfallisce perché "Modulo loop è incorporato", dovrai aggiungere loop.max_part=31alla riga di comando del kernel e riavviare. Se il tuo bootloader è Grub2, aggiungilo al valore di GRUB_CMDLINE_LINUXin etc/default/grub.

Ora puoi creare un dispositivo loop partizionabile:

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/

(nota che hai bisogno di una versione relativamente recente di Linux).


FATAL: il loop del modulo è incorporato, è possibile risolvere questo problema installando l'ultima versione di Ubuntu (ho 12.04)?
user35443

Se è integrato semplicemente non è necessario per modprobe, passa la loop.max_part=31riga di comando del kernel
Alex

1
Ah, vedo, se hai un kernel recente e passi il max_part, l'offset e il sizelimit non sono affatto necessari
Alex

Hmm, riga di comando del kernel, troppo difficile per me. Ancora grazie, accetta.
user35443

È loop.maxpart=31o loop.max_part=31dalla riga di comando del kernel?
Cristian Ciupitu,

4

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

L'offset specificato deve essere in byte (1048576 = 2048 settori * 512 byte per settore).

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

Per ulteriori informazioni, consultare losetup e mount .


Hmm, offset, questo dovrebbe funzionare. E se avessi avuto più partizioni su di esso?
user35443

Immagino un loop = una partizione = un offset.
Alex,

uhm, e c'è un'opzione per specificare anche la dimensione, così potrei limitarla e posizionare lì più partizioni?
user35443

Scusate la colpa mia per aver creato una nuova risposta con una soluzione parziale, la risposta giusta è di @ "Stephane Chazelas", può solo aggiungere le opzioni offset e sizelimit (quindi eliminerò la mia)
Alex

Non lasciarlo qui, altrimenti il ​​mio +1 non andrà da nessuna parte.
user35443,

2

Le seguenti procedure consentono di montare le partizioni dell'immagine per modificarle.

losetup 2.21 -P opzione

losetup -P -f --show my.img

Crea uno /dev/loopXpYper partizione.

Vantaggio: eseguibile preinstallato in molte distribuzioni (pacchetto util-linux).

Svantaggio: opzione abbastanza recente, non presente in Ubuntu 14.04.

losetup -P automazione

Uso:

$ 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

Fonte:

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

Produzione:

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

dov'è loop0p1la prima partizione, quindi possiamo fare:

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

Vantaggio di questo metodo: funziona su Ubuntu 14.04 senza riavviare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.