Einführung
Bei einem Laufwerk mit PC-Partitionen (wie es bei den meisten USB-Sticks der Fall ist) besteht der Bootloader aus einem winzigen Teil ganz am Anfang des Laufwerks (dem Bootloader der Stufe 1 im Bootsektor des Laufwerks) und a größerer Teil an anderer Stelle (der Stage 2-Bootloader in einer Datei). Die Daten der Stufe 1 enthalten den physischen Standort von Stufe 2. Wenn Sie das gesamte Gerät kopieren (was Sie versucht haben dd
), befindet sich der Teil der Stufe 1 am selben physischen Ort und der Stick funktioniert, aber der neue Stick muss mindestens so sein groß wie das Original. Wenn Sie die Partitionen neu erstellen und die Dateien kopieren, fehlt Ihnen Stufe 1, da es sich nicht um eine Datei handelt.
Ich denke (aber ich habe nicht überprüft), dass sich die Stufe 2 in der ersten (FAT32) Partition befindet. In diesem Fall können Sie diese Partition im Großhandel und auch den Bootsektor kopieren, dann die Partitionstabelle so bearbeiten, dass die zweite Partition genau den verbleibenden Speicherplatz belegt, und die Dateien auf der zweiten Partition kopieren. Sie können auch ein Roh-Image des Bootsektors und der ersten Partition in einer Datei auf einer Festplatte speichern (Sie können sie jedoch auch von einem USB-Stick klonen).
Erstellen eines Klons einer anderen Größe
Im Folgenden werde ich das Gerät mit dem Original-Stick /dev/sdb
und das Gerät mit dem Klon aufrufen /dev/sdc
. Ersatznamen nach Bedarf. Erstellen Sie bei Bedarf Einhängepunkte. Ich gehe davon aus, dass die FAT32-Partition (am Anfang der Festplatte) mit 1 und die ext3-Partition mit 2 nummeriert ist. Ersetzen Sie bei Bedarf andere Nummern.
Erster Teil, wenn Sie von einem Stick klonen:
head -c 512 </dev/sdb >/dev/sdc
partprobe /dev/sdc
cat </dev/sdb1 >/dev/sdc1
Erster Teil beim Klonen aus Bilddateien:
cat boot_sector.img >/dev/sdc
partprobe /dev/sdc
cat first_partition.img >/dev/sdc1
Der Aufruf von partprobe
wird benötigt, damit der Kernel die Partitionstabelle von der Festplatte neu lädt (sie befindet sich im Bootsektor, und der erste Befehl in beiden oben genannten Szenarien ändert den Bootsektor). Wenn Sie es weglassen, werden entweder Fehler angezeigt oder der Kernel schreibt stillschweigend Müll auf den Stick.
So erstellen Sie die Bilddateien:
head -c 512 </dev/sdb >boot_sector.img
cat /dev/sdb1 >first_partition.img
Nachdem Sie den Bootsektor und die erste Partition erhalten haben, müssen Sie die Partitionstabelle erneut bearbeiten, um die Größe der zweiten Partition zu ändern. Sie können dies automatisch tun, indem Sie den richtigen Eingang eingeben fdisk
. Achtung, dies ist extrem fehleranfällig und ich habe es nicht getestet. Wenn Sie sich mit diesem Teil nicht ganz wohl fühlen, tun Sie es von Hand.
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
Laden Sie abschließend die Partitionstabelle erneut, erstellen Sie ein ext3-Dateisystem und kopieren Sie die Dateien dorthin.
partprobe /dev/sdc
mke2fs -j /dev/sdc2
mount /dev/sdc2 /media/sdc2
cp -a /media/sdb2/ /media/sdc2/
umount /media/sdc2
Vereinfachte Methode zum Erstellen eines größeren Klons
Wenn Sie möchten, können Sie ein Bild des gesamten Sticks speichern. Sie werden in der Lage, dieses Bild zu verwenden , um direkt auf jedem Stick , dass der mindestens so groß ist : gerade das Bild auf den neuen Stick kopieren mit cat <whole.img >/dev/sdc
, dann laufen partprobe /dev/sdc
(oder Auszugs - Stick und steckt es wieder in) , um wieder zu lesen die Partitionstabelle.
Wenn Sie möchten, können Sie den Klon vergrößern. In dieser Reihenfolge:
- Vergrößern Sie die Partition. Leider weiß ich nicht, wie ich das auf einfache Weise machen soll.
parted
kann dies mit dem move
Befehl tun (nicht resize
, der die Größe des Dateisystems ändert), aber Sie müssen die richtigen Argumente herausfinden - wechseln Sie zu Sektoren ( unit s
), um Rundungsfehler zu vermeiden.
- Vergrößern Sie das Dateisystem. Dieser Teil ist einfach: Führen Sie ihn einfach aus
resize2fs /dev/sdc2
, damit das Dateisystem die gesamte Partitionsgröße verwendet.
Wenn Sie von einem größeren Stick als erforderlich ausgehen, können Sie ihn verkleinern, indem Sie die obigen Schritte in umgekehrter Reihenfolge ausführen (verkleinern Sie zuerst das Dateisystem mit resize2fs
, dann verkleinern Sie die Partition mit parted
).
Alternativ können Sie den Stick zuerst in eine Bilddatei kopieren und dann an dieser Bilddatei arbeiten. Verwenden Sie für den Zugriff auf die Partitionen ein Schleifengerät , das speziell einen Teil der Datei einer Festplatte zuordnet . Hier ist eine Skizze der Schritte, wenn Sie das Bild verkleinern möchten (Warnung, ungetestet, vorsichtig vorgehen und die Mathematik überprüfen).
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