.png)
der Kartenleser meines Laptops funktioniert nicht. Kann ich dd (oder ein anderes Tool) verwenden, um ein Image auf eine Netzwerkfestplatte zu schreiben?
Ich versuche, eine Raspberry-Pi-Distribution durch eine andere zu ersetzen. Die SD-Karte hat 6 GB frei und nutzt nur 2 GB.
von der SD-Karte
$ sudo parted -l
Model: SD SU08G (sd/mmc)
Disk /dev/mmcblk0: 7948MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 95.4MB 94.4MB primary fat16 lba
2 95.4MB 1878MB 1783MB extended
5 96.5MB 1878MB 1782MB logical ext4
3 1878MB 7948MB 6070MB primary ext4
UndBitte, bevor Sie kritisieren, warum ich das tun möchte, beantworten Sie die Frage … und sagen Sie mir dann, wie dumm ich bin.
Antwort1
Sie können über SSH weiterleiten:
dd if=something | ssh host dd of=something
Sie sollten jedoch einen besseren Grund für die Verwendung haben dd
als einen einfachen Dateikopiervorgang, bei dem Sie mit scp
, rsync
, und dergleichen besser dran sind.
Antwort2
Angenommen, Sie haben einen SSH-Server auf Ihrem Raspberry und die SD-Karte auf dem Raspberry wird unter angezeigt /dev/sda
, würden Sie etwa Folgendes tun:
dd if=SDcardimage.img | ssh -o MACs=hmac-ripemd160 -l raspberry-pi-user <your Raspberry's IP address> 'dd of=/dev/sda'
Ich erkläre:
dd
gibt an die Standardausgabe aus, wenn keineof
Ausgabedatei angegeben ist, und liest von der Standardeingabe, wenn keine Eingabedatei angegeben istif
.- Wenn Sie einen Befehl direkt an SSH übergeben, leitet Ihr Client seine Standardeingabe an den Server weiter und der Server übergibt diese Daten dann an die Standardeingabe des Prozesses, der im an den Server gesendeten Befehl angegeben ist.
- Da die Standardeingabe des SSH-Clients in diesem Fall von kommt
dd
und die Standardeingabe des Remote-Prozessesdd
vom SSH-Server, führt dies dazu, dass das SSH-Client-Server-Paar als verschlüsselter Datentransport fungiert und die Standardausgabe Ihres lokalen Computersdd
mit der Standardeingabe Ihres Remote-Prozesses verbindetdd
. (Dies ist tatsächlich die Art und Weise, wie SSH die Remote-Anmeldung durchführt, wobei die Standardeingabe von Ihrer Tastatur kommt und der Remote-Prozess, der die Standardeingabe empfängt, eine UNIX-Shell ist.) - Die
MACs
Option, die ich an SSH weitergebe, zwingt die Verbindung, den Algorithmus RIPEMD160 als Message Integrity Digest zu verwenden. Dadurch werden die übertragenen Daten geschützt, sodass Übertragungsfehler oder vorsätzliche Manipulationen erkannt werden. Dies ist hier wichtig, wenn man bedenkt, dass Sie ein Disk-Image über Funkwellen übertragen. Sie möchten möglicherweise eine Verschlüsselung hinzufügeno Ciphers=aes256-cbc
odero Ciphers=aes256-ctr
erzwingen, falls der Raspberry standardmäßig eine schwächere Verschlüsselung verwendet. -l
gibt den Benutzer an, den Sie zum Anmelden verwenden, einfach weil ich dazu neige, diese Syntax zu verwenden.
Antwort3
Das Aktualisieren des laufenden Systems, sodass das neue Root-Image beim nächsten Neustart verwendet wird, ist etwas komplizierter als einfach eine Kopie über das Netzwerk zu erstellen. Vorausgesetzt, dass das Root-Image aktiviert ist /dev/mmcblk0p5
(wie durch die Ausgabe von parted -l
und die Kommentare oben angezeigt), sollte der OP die Root-Partition problemlos vom Image nach kopieren können /dev/mmcblk0p3
(vorausgesetzt natürlich, dass Sie keine Daten haben, die Sie auf dieser Partition behalten möchten). Sie können den Anweisungen unten folgen.Stellen Sie jedoch sicher, dass Sie die vorgeschlagenen Prüfungen durchführen und die Befehle entsprechend ändern. Das blinde Kopieren der folgenden Befehle ist eine gute Möglichkeit, Ihr System zu zerstören.
Ich gehe davon aus, dass die Root-Partition auf dem neuen Image Partition 5 ist, aber das muss nicht unbedingt so sein. Sie können die Partitionstabelle eines
pi.img
mit aufgerufenen Images ausdruckenparted pi.image print
. Wenn Sie sich nicht sicher sind, fügen Sie die Ausgabe bitte Ihrer Frage hinzu.Da wir nur das Image für die Root-Partition und nicht das gesamte Disk-Image (das auch seine eigene Partitionstabelle und Boot-Partition enthält) kopieren möchten, müssen Sie dies vom Rest des Images trennen. Eine Möglichkeit, dies (auf einem Linux-System) zu tun, ist die Verwendung von
kpartx
:sudo kpartx -av pi.img
Wenn keine anderen Loop-Geräte verwendet werden, wird verwendet
loop0
. Überprüfen Sie jedoch die Ausgabe und ändern Sie weitere Befehle entsprechend.Stellen Sie sicher, dass die Zielpartition nicht auf dem Raspberry Pi gemountet ist, indem Sie Folgendes tun:
sudo umount /dev/mmcblk0p3
Für den nächsten Schritt müssen Sie in der Lage sein, Daten über SSH zu leitenUndRoot-Zugriff haben. Es gibt mehrere Möglichkeiten, dies zu tun, aber ich denke, die einfachste ist, einfach den Root-Login zu aktivieren. Normalerweise wird dies nicht empfohlen, aber da Sie ein neues Systemabbild hochladen möchten, denke ich nicht, dass dies ein Problem sein wird. Gehen Sie auf dem Raspberry Pi folgendermaßen vor:
sudo passwd root
Kopieren Sie anschließend das Image auf den Raspberry Pi (mitRAAKs Vorschlag zur Datenintegrität):
sudo dd if=/dev/mapper/loop0p5 | ssh -o MACs=hmac-ripemd160 root@host dd of=/dev/mmcblk0p3
host
/etc/hostname
kann alles sein, was sich auf dem Raspberry Pi befindet (anscheinendmypi
für den OP) oder die IP-Adresse des Raspberry Pi. Denken Sie auch daran, dies entsprechend zu ändern, wenn Sie nicht verwendenloop0
.Als nächstes ändern Sie die Root-Partition für den Raspberry Pi. Soweit ich sehe (ich habe keinen Raspberry Pi zum Testen), müssen Sie ändern
/boot/cmdline.txt
. Sie würden den Teil ändern, der besagt :root=/dev/mmcblk0p5
zuroot=/dev/mmcblk0p3
.Sie können die
loop
undmapper
-Geräte auf dem System, von dem Sie kopiert haben, wie folgt löschen:sudo kpartx -d pi.img
Starten Sie jetzt den Raspberry Pi neu und Sie sollten das neue Image verwenden!
Antwort4
Was wäre, wenn Sie Pi mit einem USB-ARM-Image booten, eine Verbindung zum Netz herstellen und der Speicher auf diese Weise ausreichend gezähmt wird? Ich bin kein Profi, ich gebe hier nur meine Meinung ab. Experten korrigieren mich bitte, wenn ich falsch liege.