introduzione
Per un'unità con partizioni PC (che è ciò che troverai sulla maggior parte delle chiavette USB), il bootloader consiste in una piccola parte all'inizio dell'unità (il bootloader di livello 1, nel settore di avvio dell'unità) e un parte più grande altrove (il bootloader fase 2, in un file). I dati dello stage 1 contengono la posizione fisica dello stage 2. Se copi l'intero dispositivo (cosa hai provato con dd
), la parte dello stage 1 si trova nella stessa posizione fisica e lo stick funziona, ma il nuovo stick deve essere almeno grande come l'originale. Se si ricreano le partizioni e si copiano i file, manca la fase 1 poiché non è un file.
Penso (ma non ho verificato) che lo stadio 2 sia nella prima partizione (FAT32). In tal caso, puoi copiare quella partizione all'ingrosso e copiare anche il settore di avvio, quindi modificare la tabella delle partizioni in modo che la seconda partizione occupi esattamente lo spazio rimasto e copiare i file sulla seconda partizione. Potresti anche conservare un'immagine non elaborata del settore di avvio e della prima partizione in un file su un disco rigido (ma puoi clonarli anche da una chiavetta USB).
Creazione di un clone di dimensioni diverse
Di seguito chiamerò il dispositivo contenente lo stick originale /dev/sdb
e il dispositivo contenente il clone /dev/sdc
; sostituire i nomi secondo necessità. Creare punti di montaggio, se necessario. Presumo che la partizione FAT32 (all'inizio del disco) sia numerata 1 e la partizione ext3 sia numerata 2; sostituire numeri diversi, se necessario.
Prima parte, se la clonazione da un bastone:
head -c 512 </dev/sdb >/dev/sdc
partprobe /dev/sdc
cat </dev/sdb1 >/dev/sdc1
Prima parte, se la clonazione da file di immagine:
cat boot_sector.img >/dev/sdc
partprobe /dev/sdc
cat first_partition.img >/dev/sdc1
La chiamata a partprobe
è necessaria affinché il kernel ricarichi la tabella delle partizioni dal disco (si trova nel settore di avvio e il primo comando in uno dei due scenari sopra modifica il settore di avvio). Se lo ometti, otterrai errori o il kernel scriverà silenziosamente spazzatura sul bastone.
Per creare i file di immagine:
head -c 512 </dev/sdb >boot_sector.img
cat /dev/sdb1 >first_partition.img
Ora dopo aver ottenuto il settore di avvio e la prima partizione, è necessario modificare nuovamente la tabella delle partizioni, per ridimensionare la seconda partizione. Puoi farlo automaticamente fornendo il giusto input a fdisk
. Attenzione, questo è estremamente soggetto a errori e non l'ho testato. Se non ti senti completamente a tuo agio con questa parte, fallo a mano.
sed -e 's/ *#.*//' <<EOF | tr -s ' ' '\n' | tr -d _ | fdisk /dev/sdc
d 2 # delete partition 2
n p 2 # new primary partition 2...
_ _ # ... using all available space
w q # write and quit
EOF
Alla fine ricaricare nuovamente la tabella delle partizioni, creare un filesystem ext3 e copiarvi i file.
partprobe /dev/sdc
mke2fs -j /dev/sdc2
mount /dev/sdc2 /media/sdc2
cp -a /media/sdb2/ /media/sdc2/
umount /media/sdc2
Metodo semplificato per creare un clone più grande
Se preferisci, puoi memorizzare un'immagine dell'intero stick. Sarai in grado di utilizzare quell'immagine direttamente su qualsiasi stick che sia almeno altrettanto grande: basta copiare quell'immagine sul nuovo stick con cat <whole.img >/dev/sdc
, quindi eseguire partprobe /dev/sdc
(o scollegare il stick e rimetterlo dentro) per rileggere la tabella delle partizioni.
Quindi, se lo desideri, puoi ingrandire il clone. In questo ordine:
- Ingrandisci la partizione. Sfortunatamente, non so come farlo in modo semplice.
parted
puoi farlo con il move
comando (no resize
, che ridimensiona il filesystem), ma devi capire gli argomenti giusti - passa a settori ( unit s
) per evitare errori di arrotondamento.
- Ingrandisci il filesystem. Quella parte è semplice: basta eseguire
resize2fs /dev/sdc2
per fare in modo che il filesystem utilizzi l'intera dimensione della partizione.
Se stai iniziando da uno stick più grande del necessario, puoi ridurlo seguendo i passaggi sopra nell'ordine inverso (prima riduci il filesystem con resize2fs
, quindi riduci la partizione con parted
).
In alternativa, puoi prima copiare lo stick in un file di immagine, quindi lavorare su quel file di immagine. Per accedere alle partizioni, utilizzare un dispositivo loop , associando in modo specifico una parte del file a un disco . Ecco uno schizzo dei passaggi se desideri ridurre l'immagine (avviso, non testato, procedi con attenzione e ricontrolla la matematica).
fdisk -lu whole.img # note starting sector of partition 2: $S
losetup -fs -o $(($S * 512)) whole.img
# Let $D be the desired size of partition 2, in kB
resize2fs /dev/loop0 $ # replace /dev/loop0 by whatever losetup prints
losetup -d /dev/loop0
parted whole.img
# Use parted to resize the second partition
dd if=/dev/null of=/file/to/truncate seek=1 bs=$(($S/2+$D+1))k