- Statt einen neuen Laptop von Grund auf neu einzurichten, wurde die gesamte Festplatte des bisherigen Laptops per NVMe over TCP bereitgestellt und unverändert über das Netzwerk geklont
- Die bestehende Umgebung nutzte Full-Disk Encryption und eine 512-GB-Festplatte; der neue Laptop hat eine 1-TB-NVMe, daher mussten nach dem Klonen Partition, LUKS und BTRFS erweitert werden
- Für den Festplatten-Export wurden statt
systemd-storagetm.servicebeide Laptops mit einer GRML Rescue CD gebootet und mitnvmet-tcpsowie/sys/kernel/config/nvmetkonfiguriert - Die eigentliche Kopie erfolgte mit
dd; da der neue Laptop keinen Ethernet-Port hatte und nur WiFi genutzt wurde, dauerte das Klonen von 512 GB rund 7 Stunden 30 Minuten, bei etwa 18–20 MB/s - Nach dem Klonen wurde mit
parted,growpart,cryptsetup resizeund BTRFS resize angepasst, sodass die gesamten 1 TB nutzbar waren und die bisherige Laptop-Umgebung nahezu unverändert übernommen werden konnte
Bestehende Festplatte per NVMe over TCP exportieren
-
Um die Einrichtung des neuen Laptops nicht wiederholen zu müssen, wurde auf Vorschlag eines Kollegen entschieden, die gesamte Festplatte des bisherigen Laptops zu kopieren
-
Vor dem Start gab es zwei Hindernisse
- Es gab kein Werkzeug, um den bisherigen Laptop zu öffnen und die neue Festplatte per USB anzuschließen
- Der bisherige Laptop nutzte Full-Disk Encryption und eine 512-GB-Festplatte, während der neue Laptop eine 1-TB-NVMe hat, sodass eine Größenanpassung von LUKS nötig war
-
Der Ablauf bestand aus drei Schritten: Festplatte bereitstellen, kopieren und Kapazität erweitern
- Die Festplatte des bisherigen Laptops per
nvmet-tcpexportieren - Diese Festplatte auf dem neuen Laptop kopieren
- Die Partition auf die gesamten 1 TB erweitern
- Die Größe von LUKS anpassen
- Abschließend die Größe der BTRFS-Root-Festplatte anpassen
- Die Festplatte des bisherigen Laptops per
-
GRML statt systemd-storagetm.service verwenden
- Der einfachste Weg wäre die Nutzung von systemd-storagetm.service gewesen
- Durch Angabe von
rd.systemd.unit=storage-target-mode.targetkann instorage-target-mode.targetgebootet und der Dienst aufgerufen werden - Allerdings müsste dieser Ansatz Netzwerkdienste in das dracut-initrd-Image aufnehmen, und in diesem Modus ist die WiFi-Konfiguration umständlich, daher wurde er verworfen
- Stattdessen wurden beide Laptops mit einer GRML Rescue CD gebootet; anschließend wurde die NVMe-Festplatte auf dem bisherigen Laptop mit dem Linux-Modul
nvmet-tcpexportiert
modprobe nvmet-tcp cd /sys/kernel/config/nvmet mkdir ports/0 cd ports/0 echo "ipv4" > addr_adrfam echo 0.0.0.0 > addr_traaddr echo 4420 > addr_trsvcid echo tcp > addr_trtype cd /sys/kernel/config/nvmet/subsystems mkdir testnqn echo 1 >testnqn/allow_any_host mkdir testnqn/namespaces/1 cd testnqn # replace the device name with the disk you want to export echo "/dev/nvme0n1" > namespaces/1/device_path echo 1 > namespaces/1/enable ln -s "../../subsystems/testnqn" /sys/kernel/config/nvmet/ports/0/subsystems/testnqn- Mit dieser Konfiguration wird das Zielgerät per NVMe over TCP bereitgestellt
- Auf dem neuen Laptop wird das exportierte Gerät gesucht und verbunden
nvme discover -t tcp -a <ip> -s 4420 nvme connectl-all -t tcp -a <> -s 4420- Danach lässt sich das auf dem neuen Laptop verbundene Gerät mit
nvme listprüfen und die Festplattenkopie starten
Festplatte kopieren und Größe anpassen
-
512 GB mit
ddkopieren- Die Root-Festplatte wurde mit dem Befehl
ddkopiert - Da der neue Laptop keinen Ethernet-Port hatte und nur WiFi genutzt wurde, dauerte das vollständige Kopieren von 512 GB etwa 7 Stunden 30 Minuten
- Die Übertragungsrate lag bei etwa 18–20 MB/s
- Als Alternativen wären möglich gewesen, zunächst Partitionen und Dateisysteme anzulegen und dann die Root-Festplatte mit
rsynczu kopieren, oder die Dateisystem-Übertragung von BTRFS selbst zu nutzen
dd if=/dev/nvme2n1 of=/dev/nvme0n1 status=progress bs=40M - Die Root-Festplatte wurde mit dem Befehl
-
Partition, LUKS und BTRFS erweitern
partederkannte, dass die Partitionstabelle nicht zur Festplattengröße passte, fragte nach einer Korrektur und reparierte sie anschließend automatisch- Zum Erweitern der zweiten Partition wurde
cloud-guest-utilsinstalliert undgrowpartverwendet
growpart /dev/nvem0n1 p2- Im nächsten Schritt wurde der LUKS-Container mit
cryptsetupvergrößert
cryptsetup luksOpen /dev/nvme0n1p2 ENC cryptsetup resize ENC- Nach dem Neustart von der Festplatte wurde die korrekte Funktion geprüft; nach dem Login wurde die Größe des BTRFS-Dateisystems angepasst
- Für die Größenanpassung muss BTRFS gemountet sein, daher war dies im Live-Boot-Zustand nicht möglich
btfs fielsystem resize max /- Im Ergebnis entstand auf dem neuen Laptop eine Umgebung, die sich anfühlt, als würde man den bisherigen Laptop weiterverwenden
- Normalerweise dauert es etwa ein bis zwei Wochen, sich vollständig an einen neuen Laptop zu gewöhnen; mit diesem Ansatz wurde diese Zeit verkürzt
- Zusätzlich blieb die Erfahrung, wie man eine Festplatte per NVMe over TCP exportiert
1 Kommentare
Meinungen auf Hacker News
Im Szenario des Autors wird am Ende mit
dd(1)nur eine serielle Blockkopie durchgeführt, daher bringt NVMe/TCP kaum Vorteile. Der komplexe Befehl lässt sich durch ein einfachesnetcatersetzenZiel-Laptop:
$ nc -l -p 1234 | dd of=/dev/nvme0nX bs=1MQuell-Laptop:
$ nc x.x.x.x 1234Das
ddauf der Zielseite dient dazu, Schreibvorgänge zu puffern und sie schneller und effizienter zu machen. Fügt man auf Quelle/Zielgzip/gunziphinzu, wird es deutlich schneller, wenn die Platte nicht voll ist und es viele Nullblöcke gibt. Persönlich ist das meine bevorzugte Methode, um PC-Images übers Netzwerk zu erstellen, und ich habe sie schon mehrfach genutztBei GigE ist oft die Kompression der Flaschenhals, daher sollte man
gzip--fastmitgeben; noch besser ist es, stattgzip/gunziplz4/unlz4 zu verwenden, das ist schneller. Als ich früher einen neuen Windows-Laptop mit 1 TB NVMe über GigE als Image gesichert habe, dauerte es etwa 20 Minuten; der leere Speicherplatz wurde praktisch auf null komprimiert, und das resultierende Image war 20 GB groß. Normalerweise bewahre ich dieses lz4-Image als Backup auf und stelle es ein paar Jahre später, wenn ich den Laptop spende, mitunlz4 | ddwieder her — sehr bequemAllerdings kannte ich das Linux-Kernelmodul
nvme-tcpnicht; man lernt jeden Tag etwas Neues. Das scheint eher nützlich zu sein, um ein Dateisystem auf einer entfernten NVMe zu mounten, als für Rohzugriff mitddAußerdem beträgt die maximale Pipe-Puffergröße unter Linux 64 kB, daher muss das Argument
dd bs=Xtechnisch gesehen nicht größer sein. Trotzdem schadetbs=1Mnicht: Es sammelt 64-kB-Lesevorgänge, bis 1 MB erreicht ist, und ist auch für künftig größere Pipe-Größen vorbereitet. Einigenetcat-Versionen haben Optionen für die Ein-/Ausgabe-Blockgröße, sodassdd bs=Xnicht nötig ist; dasnetcatauf einer Rettungsdisk hat aber meist keine solche Optionddpvverwendet, muss man sich keine Gedanken über eine passende Blockgröße machen und bekommt außerdem eine hübsche Fortschrittsanzeigetestdiskdie Partitionstabellen rekonstruieren; vorher wollten wir die beschädigten Disks aber nicht anfassen, also kopierten wir mit Rettungs-Flash-Disk,netcatund Laufwerken rund 40 TBBei einigen Servern waren alle physischen RAID-Slots belegt, sodass wir nicht einmal einen freien Disk-Slot nutzen konnten, und wir verwendeten ungefähr
dd if=/dev/sdc bs=xxx | gzip | nc -l -p 8888sowie den entsprechenden umgekehrten Befehl auf der Gegenseite. Es funktionierte überraschend gut. Eine Sache, auf die man achten sollte, ist diedd bs-Kombination an die Sektorgröße anzupassen; die passende Größe hatte großen Einfluss auf den Durchsatz vonddddkann Beschädigungen verursachen. Damit Blöcke nicht abgeschnitten werden, braucht maniflag=fullblock; und auch wenn es eine blinde Angewohnheit sein kann, schadetconv=syncnicht. Persönlich bevorzuge ich einfachnc -l -p 1234 > /dev/nvme0nXWenn man
pvin die Pipeline setzt, kann man die geschätzte Abschlusszeit sehen, allerdings kann das die Performance leicht beeinflussenDanke an AWS/Annapurna/Nitro/Lightbits dafür, NVMe-over-TCP in Linux gebracht zu haben
https://www.techtarget.com/searchstorage/news/252459311/Ligh...
„Das NVM-Express-Konsortium ratifizierte NVMe/TCP im November 2018 als gebundene Transportschicht. Der Standard entwickelte sich ursprünglich aus einer Codebasis, die das Engineering-Team von Lightbits bei NVM Express eingereicht hatte.“
https://www.lightbitslabs.com/blog/linux-distributions-nvme-...
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/lin...
Wirkt deutlich umständlicher als Folgendes:
nbdkit file /dev/nvme0n1,nbdcopy nbd://otherlaptop localfilenbdcopykann Sparse Files verarbeiten, die Anzahl der Verbindungen und Threads an die Zahl der Kerne anpassen, vor dem Beenden einen erzwungenen Flush durchführen und eine Fortschrittsleiste aktivieren. Bei einem unverschlüsselten Laufwerk unterstützt es auch TLSKürzlich musste ich auf einem neuen Laptop xubuntu installieren. Früher habe ich geklont, aber diesmal wollte ich einige Einstellungen neu aufräumen.
Die Übertragung mit 10 Gb/s über ein USB-C-Kabel war wirklich nützlich. Die einzige Alternative wäre nämlich WiFi gewesen.
Wenn man die Computer direkt miteinander verbindet, entsteht ein temporäres Netzwerk, und man kann die Daten einfach mit
rsyncübertragen. Dem Anschein nach war der Link ausgelastet, daher schien ein anderes Protokoll kaum einen Unterschied zu machen. Natürlich ist es gut, etwas Neues zu lernen, aber vielleicht nicht gerade in dem Moment, in dem man einen Laptop klont.Die Übertragung selbst war extrem schnell; 1 TB war in wenigen Minuten drüben. Diesmal habe ich keine Verschlüsselung verwendet, was es deutlich einfacher gemacht hat.
Ich verstehe nicht, warum nicht einfach btrfs über das Netzwerk gepipet wurde. Erst einen btrfs-Snapshot erstellen und dann
btrfs send => nc => network => nc => btrfs receive; so werden nur die tatsächlich verwendeten Blöcke übertragen.btrfs send/receiveständig über SSH, und es funktioniert sehr gut. In einer GRML-Live-Session hätte man auch leicht einen SSH-Server starten können.Es gibt allerdings einen Haken. Bei btrfs kann man Snapshots nicht rekursiv senden; wenn es also viele rekursive Snapshots gibt, ist es vergleichsweise schwierig, dieselbe Struktur auf einer neuen Disk zu spiegeln. Bei Docker/LXD/Incus kann das vorkommen. Ich mag btrfs, aber rekursives send/receive ist ein Bereich, in dem ZFS besser ist.
Kürzlich musste ich etwa 200 GB an Dateien über WiFi kopieren. Damit ich bei einem Verbindungsabbruch nicht wieder von vorn anfangen muss und nichts verloren geht, habe ich
rsyncverwendet, aber es dauerte mindestens 6 Stunden. Ich frage mich, ob es eine bessere Methode gegeben hätte.Außerdem frage ich mich, welche Garantien die
dd-Methode bietet. Muss man den md5-Hash des resultierenden Block-Devices vergleichen?Bei WiFi gibt es deutlich mehr mögliche Performance-Flaschenhälse. Schon wenn nur eines der Geräte per Kabel am Router hängt und das andere drahtlos bleibt, hilft das ziemlich.
rsyncjeweils nur eine Datei auf einmal überträgt. Man kann die Dateiliste mitxargs/parallelaufteilen und mehrerersync-Instanzen laufen lassen, oder etwas wiercloneverwenden, das parallele Übertragungen von sich aus unterstützt.-zkomprimiert wurde. Wenn Ethernet möglich gewesen wäre, wären die meisten Geräte nahe an 100 MB/s gekommen, also etwa 35 Minuten.rsyncüber SSH übertragen hat, ist das häufig der Flaschenhals. OpenSSH hatte historisch seltsame Performance-Limits, und zeitweise brauchte man wenig bekannte Patches, um sie zu umgehen. Wenn nicht die CPU der Flaschenhals ist, kann es auch helfen, Kompression zu aktivieren.„In der Computernetzwerktechnik ist Carrier Sense Multiple Access with Collision Avoidance (CSMA/CA) ein Netzwerk-Mehrfachzugriffsverfahren, das Carrier Sensing nutzt, aber Kollisionen zu vermeiden versucht, indem eine Übertragung erst gestartet wird, nachdem der Kanal als ‚frei‘ erkannt wurde. Beim Senden überträgt ein Knoten seine Paketdaten vollständig.
Das ist besonders wichtig für drahtlose Netzwerke, in denen CSMA/CD mit Kollisionserkennung nicht verwendet werden kann, weil ein drahtloser Sender während der Paketübertragung seinen Empfänger desensibilisiert und damit praktisch abschaltet.
CSMA/CA ist wegen des Hidden-Node-Problems weniger zuverlässig.
CSMA/CA ist ein Protokoll, das auf der Sicherungsschicht arbeitet.“
https://en.wikipedia.org/wiki/Carrier-sense_multiple_access_...
Dieser Ansatz hat sicher seine Vorteile, aber als ich früher einen Laptop migriert habe, habe ich auf beiden Seiten den Installer gestartet und dann
ddmitnckombiniert. Soweit ich mich erinnere, habe ich auch gzip ergänzt, um große Nullbereiche schneller zu übertragen.Wenn der neue Laptop keinen Ethernet-Port hatte, war meine hackige Methode dank Kompression vielleicht sogar etwas schneller. Schließlich wäre der Netzwerkdurchsatz bei einem schnellen Link wohl nicht nahe an die Grenze gekommen, die die zusätzliche Kompression setzt.
Warum nicht einfach Clonezilla verwenden? Es kopiert nur tatsächlich belegte Datenblöcke und kann Partitionen automatisch in der Größe anpassen. Ich mache das immer so.
Normalerweise nehme ich allerdings die NVMe-Disk aus dem Laptop und stecke sie in ein schnelles Dock.
Ganz auf „starten und unbeaufsichtigt laufen lassen“ vertraue ich ihm noch nicht. Ein Backup ist nicht dasselbe wie Backup plus Restore, daher sind Tests empfehlenswert. Auch Clonezilla kann Probleme bekommen, wenn es Partitionen auf einer Disk neu erstellt, die sich stark vom Original unterscheidet.
Es ist Jahrzehnte her, dass ich auf einem Desktop oder Laptop ein Betriebssystem tatsächlich „installiert“ habe; ich habe immer Dateien kopiert und danach nur das Nötige angepasst. Meistens nutze ich die Gelegenheit, um ein neues Dateisystem anzulegen und Parameter wie Dateisystemtyp oder Blockgröße sowie Verschlüsselung zu aktualisieren, und verschiebe die Dateien dann mit
rsync.Wer aber gern im Voraus plant, ist mit einem deklarativeren Ansatz wie NixOS vermutlich besser bedient: nur die Konfiguration kopieren und den Rest automatisch neu installieren lassen.
Wenn man die Geräte per WiFi direkt verbindet, ohne AP dazwischen, ließe sich die Übertragungsgeschwindigkeit wahrscheinlich verdoppeln. In dieser Situation wäre das wohl einen Versuch wert gewesen.