tiri technology blog

im web oder während unserer arbeit gefunden

12. März 2009

XENserver export/import virtueller Maschinen

Abgelegt unter: Wissen — Tags:, , , , , — tirili @ 22:45
time xe vm-export vm=742ba99e-5f8b-b29d-e5a4-2f0e647838cb filename=/data/xtradius.xvm

In ca. 5 minuten ist er mit 4GB fertig.
Was macht XENserver da ? Es erstellt ein Archiv mit allen Daten der VM.

[root@xen211 data]# file xtradius.xvm 
xtradius.xvm: tar archive
[root@xen211 data]# tar tvf xtradius.xvm
---------- 0/0           73769 1970-01-01 01:00:00 ova.xml
---------- 0/0         1048576 1970-01-01 01:00:00 Ref:42/00000000
---------- 0/0              40 1970-01-01 01:00:00 Ref:42/00000000.checksum
---------- 0/0         1048576 1970-01-01 01:00:00 Ref:42/00000001
---------- 0/0              40 1970-01-01 01:00:00 Ref:42/00000001.checksum
---------- 0/0         1048576 1970-01-01 01:00:00 Ref:42/00000003
...

Die ova.xml sieht ungefähr so aus:

<value>
  <struct>
    <member>
      <name>version</name>
      <value>
        <struct>
          <member>
            <name>hostname</name>
            <value>chocky-2</value>
          </member>
          <member>
            <name>date</name>
            <value>2009-01-30</value>
          </member>
          <member>
            <name>product_version</name>
            <value>5.0.0</value>
          </member>
          <member>
            <name>product_brand</name>
            <value>XenServer</value>
          </member>
          <member>
            <name>build_number</name>
            <value>12527p</value>
          </member>
          <member>
            <name>xapi_major</name>
            <value>1</value>
          </member>
          <member>
            <name>xapi_minor</name>
            <value>2</value>
          </member>
          <member>
            <name>export_vsn</name>
            <value>2</value>
          </member>
        </struct>
      </value>
    </member>
    <member>
      <name>objects</name>
      <value>
        <array>
          <data>
            <value>
              <struct>
                <member>
                  <name>class</name>
                  <value>VM</value>
                </member>
                <member>
                  <name>id</name>
                  <value>Ref:36</value>
                </member>
                <member>
                  <name>snapshot</name>
                  <value>
                    <struct>
                      <member>
                        <name>uuid</name>
                        <value>742ba99e-5f8b-b29d-e5a4-2f0e647838cb</value>
                      </member>
                      <member>
                        <name>allowed_operations</name>
                        <value>
                          <array>
                            <data>
                              <value>copy</value>
                              <value>clone</value>
                              <value>export</value>
                            </data>
                          </array>
                        </value>
                      </member>
                      <member>
                        <name>current_operations</name>
                        <value>
                          <struct>
                            <member>
                              <name>OpaqueRef:3f0b3fc4-771d-a131-a254-27c6bcbe941f</name>
                              <value>export</value>
                            </member>
                          </struct>
                        </value>
                      </member>
                      <member>
                        <name>power_state</name>
                        <value>Halted</value>
                      </member>
                      <member>
                        <name>name_label</name>
                        <value>xtradius .178.14</value>
                      </member>
                      <member>
                        <name>name_description</name>
                        <value/>
                      </member>
                      <member>
                        <name>user_version</name>
                        <value>1</value>
                      </member>
                      <member>
                        <name>is_a_template</name>
                        <value>
                          <boolean>0</boolean>
                        </value>
                      </member>
                      <member>
                        <name>suspend_VDI</name>
                        <value>OpaqueRef:NULL</value>
                      </member>
                      <member>
                        <name>resident_on</name>
                        <value>OpaqueRef:NULL</value>
                      </member>
                      <member>
                        <name>affinity</name>
                        <value>OpaqueRef:23f2b1c8-1a4d-324b-6e91-a98a091ac0de</value>
                      </member>
                      <member>
                        <name>memory_target</name>
                        <value>268435456</value>
                      </member>
                      <member>
                        <name>memory_static_max</name>
                        <value>268435456</value>
                      </member>
                      <member>
                        <name>memory_dynamic_max</name>
                        <value>268435456</value>
                      </member>
                      <member>
                        <name>memory_dynamic_min</name>
                        <value>268435456</value>
                      </member>
                      <member>
                        <name>memory_static_min</name>
                        <value>16777216</value>
                      </member>
                      <member>
                        <name>VCPUs_params</name>
                        <value>
                          <struct/>
                        </value>
                      </member>
                      <member>
                        <name>VCPUs_max</name>
                        <value>1</value>
                      </member>
                      <member>
                        <name>VCPUs_at_startup</name>
                        <value>1</value>
                      </member>
                      <member>
                        <name>actions_after_shutdown</name>
                        <value>destroy</value>
                      </member>
                      <member>
                        <name>actions_after_reboot</name>
                        <value>restart</value>
                      </member>
                      <member>
                        <name>actions_after_crash</name>
                        <value>restart</value>
                      </member>
                      <member>
                        <name>consoles</name>
                        <value>
                          <array>
                            <data/>
                          </array>
                        </value>
                      </member>
                      <member>
                        <name>VIFs</name>
                        <value>
                          <array>
                            <data>
                              <value>Ref:37</value>
                              <value>Ref:39</value>
                            </data>
                          </array>
                        </value>
                      </member>
                      <member>
                        <name>VBDs</name>
                        <value>
                          <array>
                            <data>
                              <value>Ref:41</value>
                              <value>Ref:44</value>
                              <value>Ref:45</value>
                            </data>
                          </array>
                        </value>
                      </member>
                      <member>
                        <name>crash_dumps</name>
                        <value>
                          <array>
                            <data/>
                          </array>
                        </value>
                      </member>
...

Die exportierte Maschine können wir jetzt mittels scp auf einen anderen XENserver bringen und dort
importieren. Da wir eine identische Kopie wollen mit denselben MAC-Adressen, wird der Parameter “preserve” verwendet.

xe vm-import filename=/data/xtradius.xvm preserve=true

Nach ca. 20 Minuten ist die VM komplett verfügbar, taucht auch im XENcenter des neuen Hosts auf und
kann gestartet und genutzt werden. Allerdings hat die Maschine nun eine neue UUID, weshalb man beim Skripten besser auf den Namen gehen sollte.

xe vm-start name-label="xtradius .178.14"

Alternativ kann man import und start auch verknüpfen:

xe vm-start uuid=$(xe vm-import filename=/data/xtradius.xvm preserve=true)

Migration von einer XEN VM auf einen anderen Host

Abgelegt unter: Wissen — Tags:, , , , , , — tirili @ 21:46

Ziel ist es, hier eine Migration einer bestehenden VM auf einen anderen XEN-Server ohne Shared Storage vorzunehmen. Keine Live-Migration, sondern Offline, um die Integrität zu wahren.

Bestimmen der uuid unserer zu migrierenden Maschine und aller Parameter

[root@xen211 ~]# xe vm-list params=all uuid=742ba99e-5f8b-b29d-e5a4-2f0e647838cb
uuid ( RO)                          : 742ba99e-5f8b-b29d-e5a4-2f0e647838cb
                    name-label ( RW): xtradius .178.14
              name-description ( RW): 
                  user-version ( RW): 1
                 is-a-template ( RW): false
                 is-a-snapshot ( RO): false
                   snapshot_of ( RO): <not in database>
                     snapshots ( RO): 
                 snapshot_time ( RO): 19700101T00:00:00Z
             is-control-domain ( RO): false
                   power-state ( RO): running
                 memory-actual ( RO): 268435456
                 memory-target ( RO): 268435456
             memory-static-max ( RW): 268435456
            memory-dynamic-max ( RW): 268435456
            memory-dynamic-min ( RW): 268435456
             memory-static-min ( RW): 16777216
              suspend-VDI-uuid ( RO): <not in database>
                  VCPUs-params (MRW): 
                     VCPUs-max ( RW): 1
              VCPUs-at-startup ( RW): 1
        actions-after-shutdown ( RW): Destroy
          actions-after-reboot ( RW): Restart
           actions-after-crash ( RW): Restart
                 console-uuids (SRO): 1814bfe2-510e-bbc5-64f0-9100ac1f94d0
                      platform (MRW): nx: false; acpi: true; apic: true; pae: true; viridian: true
            allowed-operations (SRO): snapshot; pause; clean_shutdown; clean_reboot; hard_shutdown; hard_reboot; suspend; changing_VCPUs_live; pool_migrate
            current-operations (SRO): 
            blocked-operations (MRW): 
           allowed-VBD-devices (SRO): <expensive field>
           allowed-VIF-devices (SRO): <expensive field>
                possible-hosts ( RO): <expensive field>
               HVM-boot-policy ( RW): 
               HVM-boot-params (MRW): 
         HVM-shadow-multiplier ( RW): 1.000
                     PV-kernel ( RW): 
                    PV-ramdisk ( RW): 
                       PV-args ( RW): 
                PV-legacy-args ( RW): 
                 PV-bootloader ( RW): pygrub
            PV-bootloader-args ( RW): 
           last-boot-CPU-flags ( RO): 
              last-boot-record ( RO): <expensive field>
                   resident-on ( RO): 14b1b468-6294-4f7f-8af6-c7d5c5e86d63
                      affinity ( RW): 14b1b468-6294-4f7f-8af6-c7d5c5e86d63
                  other-config (MRW): last_shutdown_time: 20090311T11:44:01Z; last_shutdown_action: Destroy; last_shutdown_initiator: external; last_shutdown_reason: halted; linux_template: true; install-methods: ; mac_seed: fafd65c2-fa2a-7cbd-49e4-d2770a34fdf5
                        dom-id ( RO): 3
               recommendations ( RO): <restrictions><restriction field="memory-static-max" max="34359738368" /><restriction field="vcpus-max" max="8" /><restriction property="number-of-vbds" max="7" /><restriction property="number-of-vifs" max="7" /></restrictions>
                 xenstore-data (MRW): 
                 ha-always-run ( RW): false
           ha-restart-priority ( RW): 
                         blobs ( RO): 
                    start-time ( RO): 20090312T20:21:00Z
                  install-time ( RO): 20090130T20:36:09Z
                  VCPUs-number ( RO): 1
             VCPUs-utilisation (MRO): <expensive field>
                    os-version (MRO): name: Debian 5.0; uname: 2.6.18.8.xs5.0.0.10.439; distro: debian; major: 5; minor: 0
            PV-drivers-version (MRO): major: 5; minor: 0; micro: 0; build: 10918
         PV-drivers-up-to-date ( RO): true
                        memory (MRO): 
                         disks (MRO): 
                      networks (MRO): 0/ip: 192.168.178.14
                         other (MRO): 
                          live ( RO): true
    guest-metrics-last-updated ( RO): 20090312T20:21:07Z

Durchführen eines “Safe-Shutdown” unserer Virtuellen Maschine

xe vm-shutdown uuid=742ba99e-5f8b-b29d-e5a4-2f0e647838cb

Herausfinden aller Virtual Disks der VM

[root@xen211 ~]# xe vbd-list params=all vm-uuid=742ba99e-5f8b-b29d-e5a4-2f0e647838cb
uuid ( RO)                        : 2af47033-2fc8-e377-d4c1-7b77a25833af
                     vm-uuid ( RO): 742ba99e-5f8b-b29d-e5a4-2f0e647838cb
               vm-name-label ( RO): xtradius .178.14
                    vdi-uuid ( RO): df44a238-b528-48be-b870-58bb73e217d3
              vdi-name-label ( RO): 1
          allowed-operations (SRO): pause; unpause; attach
          current-operations (SRO): 
                       empty ( RO): false
                      device ( RO): xvdb
                  userdevice ( RW): 1
                    bootable ( RW): false
                        mode ( RW): RW
                        type ( RW): Disk
                 unpluggable ( RW): false
          currently-attached ( RO): false
                  attachable ( RO): <expensive field>
                storage-lock ( RO): false
                 status-code ( RO): 0
               status-detail ( RO): 
          qos_algorithm_type ( RW): 
        qos_algorithm_params (MRW): 
    qos_supported_algorithms (SRO): 
                other-config (MRW): owner: 
                 io_read_kbs ( RO): <expensive field>
                io_write_kbs ( RO): <expensive field>
 
 
uuid ( RO)                        : 460b14ee-b566-d622-ed69-4ff765074b7b
                     vm-uuid ( RO): 742ba99e-5f8b-b29d-e5a4-2f0e647838cb
               vm-name-label ( RO): xtradius .178.14
                    vdi-uuid ( RO): <not in database>
              vdi-name-label ( RO): <EMPTY>
          allowed-operations (SRO): insert; pause; unpause; attach
          current-operations (SRO): 
                       empty ( RO): true
                      device ( RO): 
                  userdevice ( RW): 3
                    bootable ( RW): false
                        mode ( RW): RO
                        type ( RW): CD
                 unpluggable ( RW): false
          currently-attached ( RO): false
                  attachable ( RO): <expensive field>
                storage-lock ( RO): false
                 status-code ( RO): 0
               status-detail ( RO): 
          qos_algorithm_type ( RW): 
        qos_algorithm_params (MRW): 
    qos_supported_algorithms (SRO): 
                other-config (MRW): 
                 io_read_kbs ( RO): <expensive field>
                io_write_kbs ( RO): <expensive field>
 
 
uuid ( RO)                        : d4f56044-e7f3-17fb-9149-268fdd0fe302
                     vm-uuid ( RO): 742ba99e-5f8b-b29d-e5a4-2f0e647838cb
               vm-name-label ( RO): xtradius .178.14
                    vdi-uuid ( RO): 854c68ca-ce5c-4e02-8101-3dce30e847dd
              vdi-name-label ( RO): 0
          allowed-operations (SRO): pause; unpause; attach
          current-operations (SRO): 
                       empty ( RO): false
                      device ( RO): xvda
                  userdevice ( RW): 0
                    bootable ( RW): true
                        mode ( RW): RW
                        type ( RW): Disk
                 unpluggable ( RW): false
          currently-attached ( RO): false
                  attachable ( RO): <expensive field>
                storage-lock ( RO): false
                 status-code ( RO): 0
               status-detail ( RO): 
          qos_algorithm_type ( RW): 
        qos_algorithm_params (MRW): 
    qos_supported_algorithms (SRO): 
                other-config (MRW): owner: 
                 io_read_kbs ( RO): <expensive field>
                io_write_kbs ( RO): <expensive field>

Für uns interessant sind alle Zeilen, die die vdi-uuid enthalten, und dort auch nur die, die in der Datenbank vorhanden sind, also auch im LVM sichtbar sind.

xe vbd-list params=vdi-uuid vm-uuid=742ba99e-5f8b-b29d-e5a4-2f0e647838cb | awk '/[:alnum:]/ && !/not in database/{print $NF}'

Die zugehörigen LVs heißen dann

lvs | grep -E $(echo $(xe vbd-list params=vdi-uuid vm-uuid=742ba99e-5f8b-b29d-e5a4-2f0e647838cb | awk '/[:alnum:]/ && !/not in database/{printf "|%s",$NF}' | cut -c2-)) | awk '{print $1}'

Soweit so gut. Jetzt müssen wir die virtuellen Platten noch exportieren, am besten auf unseren lokalen Storage (wenn auch NFS oder eine Pipe ebenfalls möglich wäre). Hierzu sollten wir (generell) eine lokale Datenpartition nutzen.

lvcreate -n datalv -L 20G VG_XenStorage-fa726b3d-8ba1-dc56-e22a-2bec0b519663
mkfs.ext3 /dev/VG_XenStorage-fa726b3d-8ba1-dc56-e22a-2bec0b519663/datalv
tune2fs -c0 -i0 /dev/VG_XenStorage-fa726b3d-8ba1-dc56-e22a-2bec0b519663/datalv
mount /dev/VG_XenStorage-fa726b3d-8ba1-dc56-e22a-2bec0b519663/datalv /data

Damit wir allerdings auf die LVs der virtuellen Maschinen überhaupt zugreifen können, müssen wir
die VG erneut einlesen.

vgchange -a y

Jetzt kann der Export stattfinden.

dd if=/dev/VG_XenStorage-fa726b3d-8ba1-dc56-e22a-2bec0b519663/LV-854c68ca-ce5c-4e02-8101-3dce30e847dd of=/data/xtradius-4G.img bs=1M
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 219.663 seconds, 19.6 MB/s

Diesen bringen wir mittels scp auf den neuen Server (auf dem bereits eine datalv gemountet ist).
Im Gigabit Netzwerk klappt das für unser 4GB Image in wenigen Minuten (ca 20-30MB/sec).

Auf der anderen Maschine erzeugen wir uns wieder eine VM in der wir die Images in die entsprechenden lokalen LVs hineinbringen.

Soweit EDV zu Fuß. Viel gelernt, viel Skripting, aber es geht auch einfacher mittels xe vm-export ;-) !

Powered by WordPress ( WordPress Deutschland )