Übertragen Sie ein VM-Image zwischen Cloud-Hostern oder installieren Sie Windows Server auf Digital Ocean

  • Tutorial
Digital Ocean bietet beispielsweise nicht die Möglichkeit, ein eigenes virtuelles Image herunterzuladen. Außerdem können Sie kein ISO-Image zur Installation hinzufügen (obwohl es KVM gibt - und danke dafür).
Deshalb muss man den schwierigen Weg gehen und alles durch ssh machen. Die Hauptidee ist, das Root-Dateisystem auf der neuen virtuellen Maschine zu entfernen, die Dateien / das Image von der alten hochzuladen, die Grub-Einstellungen zu aktualisieren, die Netzwerk- und Fstab-Einstellungen zu aktualisieren und neu zu starten.
Das Unscheinbarste im ersten Schritt. Sie können / und auf einem Live-System aussteigen, es ist real, wenn auch trostlos. Es ist viel einfacher, einen SSH-Server und ein paar Dienstprogramme zur initramdisk hinzuzufügen und von dort aus alles zu erledigen In dieser Phase des Startens des Betriebssystems ist das Root-System noch nicht bereitgestellt.
Tatsächlich ist der gesamte Artikel eine Demonstration eines Dienstprogramms zum Einbinden eines SSH-Servers in eine RAM-Disk + zwei analysierte Beispiele.



Migration eines Debian-Servers von Xen mit Paravirtualisierung auf Digital Ocean.


Es ist wichtig, dass die virtuelle DigitalOcean-Maschine den Kernel von der virtuellen Maschine aus ändern kann (In der DigitalOcean-Systemsteuerung sollte auf der Registerkarte Kernel angegeben werden, dass der Kernel im Host geändert werden soll).
Quelle auf Xen:

Es gibt Nginx mit einer solchen Demo-Seite


Schritt 1. Vorbereiten des Quellservers für die Migration


Sie können nichts vorbereiten. Schalten Sie einfach den Quellserver aus und geben Sie die Dateien / das Image vom Hypervisor weiter. Dies ist jedoch nicht interessant. Außerdem befindet sich die Quelle möglicherweise nicht auf der virtuellen Maschine, sondern auf Bare-Metal-Basis. Daher besteht der erste Schritt darin, das Root-Dateisystem (und dementsprechend den verbundenen FS, falls vorhanden) schreibgeschützt erneut bereitzustellen. Das erneute Einhängen in den Nur-Lese-Modus ist viel einfacher als das vollständige Aushängen. Es reicht aus, Dämonen zu nageln, die etwas schreiben können.
/etc/init.d/nginx stop
apt-get install lsof rsync
lsof /

Wir schauen uns an, was bleibt. Wir sind in den Linien interessiert , wo die Säulenenden auf der FD w oder u

Ja, blieb rsyslog
kill 6288
mount -o remount,ro /

Wenn es funktioniert, ist es gut, wenn nicht, suchen Sie weiter, wer die Dateien zum Schreiben geöffnet hält. In der Regel reicht es aus, alle zusätzlich installierten Daemons + Syslog auszuschalten.

Schritt 2. Hängen Sie den Root-FS auf dem Zielserver aus


Der Empfänger wird Ubuntu 16.04 sein. Theoretisch ist es absolut nicht wichtig, wie der Empfänger vor der Überweisung steht, denn all dies wird überschrieben, nur ein Hilfsprogramm zur Automatisierung der initramdisk-Einstellungen funktioniert mit Ubuntu / Debian.
Also das frisch erstellte Ubuntu 16.04 auf DigitalOcean:
apt-get install -y git dropbear && \
git clone https://github.com/roginvs/early-ssh && \
cd early-ssh && \
./build_deb.sh && \
dpkg -i early-ssh*.deb && \
sed -ie 's/DISABLED=1/DISABLED=0/' /etc/early-ssh/early-ssh.conf  && \
update-initramfs -u && \
reboot

Wir pingen die IP-Adresse des Empfängers und folgen dieser in TTL. Sobald sich die TLL in den Antworten ändert, hat initramdisk gebootet und wartet auf Verbindungen. Standardmäßig dauert es nicht lange. Wenn nach 15 Sekunden keine Verbindung hergestellt wurde, wird der Download fortgesetzt.

Verbinde dich über ssh und erhalte eine Shell. In meinem Fall erfolgt die Root-Autorisierung über einen Schlüssel, sie funktioniert jedoch auch über ein Kennwort, selbst wenn sshd_config 'PermitRootLogin without-password' enthält (da initbramdisk dropbear und nicht sshd enthält).

Eigentlich ein Abschnitt.

Schritt 3. Datenübertragung


Sie können alle Daten entweder über dd (natürlich, wenn die Festplattengröße des Empfängers nicht kleiner als die der Quelle ist) oder über rsync übertragen. dd ist vorzuziehen, wenn nicht genügend freier Speicherplatz im Dateisystem vorhanden ist oder wenn viele kleine Dateien vorhanden sind.

Option von dd nach ssh:

dd if=/dev/xvda2 bs=65536 | ssh root@198.199.127.149 'dd of=/dev/vda1 bs=65536'


Option mit dd ohne Verschlüsselung, aber mit Komprimierung:


# На получателе
nc -q 1 -l 8000 | gzip -d | dd bs=65536 of=/dev/vda1
# На источнике
dd if=/dev/xvda2 bs=65536 | gzip | nc -q 1 198.199.127.149 8000

Von der benachbarten Konsole können Sie ständig das Signal USR1 an dd senden, um zu sehen, wie die Dinge laufen:
while true; do kill -USR1 `pidof dd`; sleep 10; done


Option mit rsync:


Auf dem Empfänger erstellen wir das Dateisystem neu und hängen es ein:
mkfs.ext3 /dev/vda1
mkdir /mnt
mount /dev/vda1 /mnt

Das ext3-Dateisystem, nicht ext4, nur weil die Quelle ext3 ist. Jetzt vom Quellserver:
rsync -aAXv --one-file-system --progress / root@198.199.127.149:/mnt/

(Seien Sie vorsichtig mit Schrägstrichen am Ende, sie sollten sein)

Schritt 4. Überprüfen des Kernels, Überprüfen von / etc / fstab, Konfigurieren des Netzwerks und Aktualisieren der Grub-Einstellungen


Auf dem Receiver mounten wir ein frisch kopiertes Dateisystem und erstellen dort ein Chroot:
mount /dev/vda1 /mnt
mount -o bind /dev/ /mnt/dev/
mount -o bind /proc/ /mnt/proc/
mount -o bind /sys/ /mnt/sys/
chroot /mnt
PATH=$PATH:/usr/sbin
bash


Stellen Sie sicher, dass der Kernel installiert ist (dies ist erforderlich, wenn das Quell-Betriebssystem mit Paravirtualisierung auf Xen war).
apt-cache search linux-image
apt-get install linux-image-3.16.0-4-amd64
dpkg-reconfigure linux-image-3.16.0-4-amd64


Aktualisieren der Netzwerkeinstellungen in / etc / network / interfaces
nano /etc/network/interfaces

Hier gibt es eine kleine Gefahr: In einigen Fällen können Schnittstellen auf einigen Kernen anders aufgerufen werden. Zum Beispiel kann es in Ubuntu ens3 heißen und auf dem Debian-Kernel ist es bereits eth0. Es ist nur für den Fall besser, Datensätze für beide Optionen zu erstellen. Oder Sie können Kernel-Einstellungen in / etc / default / grub hinzufügen, sodass der ens-Name nicht verwendet wird (ersetzen / fügen Sie die GRUB_CMDLINE_LINUX-Zeile hinzu):
...
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
...

+ lösche die Datei /etc/udev/rules.d/70-persistent-net.rules, damit der Kernel anfängt, Interfaces mit eth0 zu lesen.

Der Root fs selbst in / etc / fstab (Das Gerät heißt jetzt vda1 + delete swap)
nano /etc/fstab


Sie können die UUID auch über blkid herausfinden und eingeben:
UUID="66bd1995-a4e5-418f-a1f7-0ec2f81ac017" / ext4 errors=remount-ro 0 1


Nun, der Bootloader:
apt-get install grub2
grub-install /dev/vda
update-grub2


Alles, Sie können alles aushängen und neu starten:
exit # Из bash
exit # Из chroot
cd /
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt
reboot


Nach dem Neustart überprüfen wir, ob die Webseite mit einer neuen IP geöffnet wird:


Installieren Sie Windows Server 2012r2 auf DigitalOcean



Schritt 1. Quelle vorbereiten


Bei Windows sind die Dinge etwas komplizierter, daher habe ich zuerst eine virtuelle Maschine in VmWare erstellt und diese dann vom Hypervisor übertragen. Während der Installation gab er an, dass das Betriebssystem Linux ist, der Lsi SAS-Festplattentreiber.
Der installierte Windows-Server muss für die Migration vorbereitet sein:

Download Treiber für KVM


Laden Sie fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso (https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers) herunter , entpacken und installieren Sie die Tools und für jede inf Datei für unseren Versionslauf
Pnputil -i -a .inf


(Oder sofort für alle
forfiles / S / M * .inf / C cmd / c pnputil -i -a @Path
)

Ein bisschen Krückenmagie


Crutches dies, weil es in guter Weise durch unattended.xml getan werden muss. Wir erstellen die Datei c: \ firstrun.bat und schreiben dort das Folgende, wobei wir gleichzeitig das Mac / IP / Mask / Gateway / Passwort durch das ersetzen, was wir auf dem virtuellen Empfänger haben:
@Echo Off
:: Mac is in Windows format (dashes)!
SET MAC=00-50-56-9E-B8-57
SET IP=192.168.2.85
SET MASK=255.255.255.0
SET GW=192.168.2.1
SET ADMINPW=QWEasd123
echo Started >> c:\firstrun.log
date /T >> c:\firstrun.log
time /T >> c:\firstrun.log
ipconfig /all >> c:\firstrun.log
echo "Start to search network interface" >> c:\firstrun.log
:start_loop
  For /f "delims=, tokens=1,3 skip=1" %%a In ('getmac /V /FO CSV') Do ( 
    IF /I %%b == "%MAC%" (
      echo "Found card" >> firstrun.log
      echo %%a >> firstrun.log
      netsh interface ip set address %%a static %IP% %MASK% %GW% 10
      netsh interface ip add dns %%a 8.8.8.8
      goto :end_loop
    )
  )
  ping 127.0.0.1  
goto :start_loop
:end_loop
net user Administrator %ADMINPW%
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
NetSh Advfirewall set allprofiles state off
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\State" /v ImageState /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\Setup" /v OOBEInProgress /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\Setup" /v RestartSetup /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\Setup" /v SetupPhase /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\Setup" /v SetupType /t REG_DWORD /d 0 /f
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v DigitalOceanHack /f
echo "Ok, reboot" >> c:\firstrun.log
shutdown -r -t 20


Fügen Sie als Nächstes in der Konsole dieses Skript zur automatischen Ausführung hinzu und führen Sie sysprep in audit aus:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v DigitalOceanHack /t REG_SZ /d "C:\firstrun.bat" /f
%WINDIR%\system32\sysprep\sysprep /generalize /audit /shutdown


Das Image ist fertig, beim nächsten Start beginnt es sich selbst zu konfigurieren.
Auf sysprep kann verzichtet werden
Übertragen von Windows 10 von ESXi auf KVM vor dem endgültigen Herunterfahren: Geräte-Manager -> IDE ATA / ATAPI-Controller -> auf jeder rechten Seite Treibersoftware aktualisieren -> Meinen Computer durchsuchen ... -> Auswahl ... -> Wählen Sie "Standart ...". "(Natürlich wird das Kontrollkästchen" Kompatible Hardware anzeigen "nicht entfernt).
Es lief normal an.


Schritt 2. Hängen Sie den Root-FS in der Quelle aus, partitionieren Sie die Partitionen neu


Wir booten in Ramdisk wie im vorherigen Beispiel, verschieben den Root-FS, erstellen neue Partitionen am Anfang der Festplatte und aktualisieren die Grub-Einstellungen:
e2fsck -f /dev/vda1
resize2fs /dev/vda1 25G
fdisk /dev/vda
 Command: d
 Command: n
 Select (default p): p
 Partition number: 1
 First sector: 2048
 Last sector: +716799       ### Такой же как в образе Windows = 716800 секторов минус 1
 Command: n
 Select (default p): p
 Partition number: 2
 First sector: 718848
 Last sector: +32833535   ### Точно так же значение из образа минус 1
 Command: n
 Select (default p): p
 Partition number: 3
 First sector: 73400320 ### Хочу взять 25Гб = 52428800 секторов с конца диска объемом 125829120 секторов. 
 Last sector: +52428799   # 25Гб в секторах - 1
 Command: t
 Partition number: 1
 Partition type: 7
 Command: t
 Partition number: 2
 Partition type: 7
 Command: a
 Partition number: 1
 Command: a
 Partition number: 3
 Command: w


Der erste Abschnitt ist bootfähig für Windows, 350 MB, der zweite ist Windows selbst, der dritte ist Linux. Woher diese Zahlen stammen, wird im nächsten Schritt klar sein. Zunächst können Sie zwei Partitionen in zufälliger Größe erstellen (aber der letzte Sektor ist nicht kleiner als die Größe des Windows-Abbilds) und diese dann aus Ubuntu neu erstellen, wenn das Abbild in das Ubuntu-Dateisystem kopiert wird. Letztendlich ist es wichtig, dass sich die Partitionen für Windows an denselben Orten und in derselben Größe befinden wie im Quellimage.
Ich habe so viel auf dem Root-FS gelassen, weil ich dort vorübergehend eine vmdk-Datei ablegen werde. Theoretisch können Sie es sofort durch die Pipe in einen Abschnitt schreiben.
Kopieren Sie nun Ubuntu (es liegt immer noch am Anfang der Festplatte), 25 GB mit / dev / vda ab dem Sektor 2048 in / dev / vda3:
dd if=/dev/vda bs=4096 skip=256 count=6553600 of=/dev/vda3

(Überspringen und Zählen sind 8-fach reduziert, da der Block nicht 512, sondern 4096 ist.)
Aktualisieren Sie die Grub-Einstellungen und bearbeiten Sie gegebenenfalls / etc / fstab (ersetzen Sie / dev / vda1 durch / dev / vda3):
mkdir /mnt
mount /dev/vda3 /mnt
mount -o bind /dev/ /mnt/dev/
mount -o bind /proc/ /mnt/proc/
mount -o bind /sys/ /mnt/sys/
chroot /mnt
PATH=$PATH:/usr/sbin
grub-install /dev/vda
update-grub2
nano /etc/fstab
exit
cd /
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt
reboot


Schritt 3. Kopieren Sie auf irgendeine Weise die vmdk-Datei auf das neu geladene Ubuntu


Nun, wenn die vmdk-Datei sofort ein Disk-Image darstellt (wenn nicht, müssen Sie es mit "qemu-img convert -p -f vmdk original.vmdk -O raw conversion.raw" in raw konvertieren)
fdisk Windows2012r2.vmdk


Hier, woher die Werte für / dev / vda1 und / dev / vda2 für den vorherigen Schritt stammen.

Kopieren Sie Windows aus dem Image in die Abschnitte:
dd bs=4096 skip=256 count=89600 if=Windows2012r2.vmdk of=/dev/vda1
dd bs=4096 skip=89856 count=4104192 if=Windows2012r2.vmdk of=/dev/vda2

(Überspringen, und gelten als umeshnennye 8 mal)
Sie können versuchen , mount / dev / VDA1 und / dev / VDA2 überprüfen , ob alles in Ordnung ist , und , wenn nötig, die Einstellungen in der Spitze Skript anpassen.

Update Grub, sehen, was er Windows sah:
update-grub2

Jetzt schalten wir Windows für den nächsten Neustart ein. Es ist praktisch, wenn etwas schief geht. Sie können das Problem beheben, indem Sie die virtuelle Maschine aus- und wieder einschalten:
grub-reboot 2
reboot

Weil Wenn das Image mit dem Skript sysprep + crutch erstellt wurde, möchte Windows 2-mal im Abstand von mehreren Minuten neu starten. Das heißt 2 weitere Male müssen Sie sich bei Ubuntu anmelden und die letzten 2 Befehle ausführen.

Schritt 4. Booten Sie Windows standardmäßig


Anstatt Fenster in den Standard in grub aufzunehmen, ist es besser, einfach /etc/rc.local hinzuzufügen:
sleep 60 && grub-reboot 2 && reboot &

- Wenn Windows nicht mehr geladen wird, haben Sie möglicherweise Zeit, sich bei Ubuntu anzumelden und "killall sleep" zu aktivieren.

Nach dem Neustart können Sie zu RDP wechseln:


Links:
Installieren Sie eine beliebige Linux-Distribution auf Digital Ocean

Jetzt auch beliebt: