User Tools

Site Tools


informatica:linux:escaner

This is an old revision of the document!


scanner

Instalar

1. Entrar en la BIOS del sistema y asegurarse de que el soporte de virtualización está activado

2. Instalar un sistema GNU/Linux reciente (yo pruebo con Debian 6.x=

3. Comprobar que el sistema operativo soporta virtualizacion:

sudo egrep '(vmx|svm)' --color=always /proc/cpuinfo

En caso de que SI soporte virtualizacion veremos lo siguiente:

flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow vnmi flexpriority
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow vnmi flexpriority

Con la palabra 'vmx' o 'svm' en rojo

4. Instalar los siguientes paquetes:

sudo aptitude install qemu-kvm libvirt-bin virtinst qemu-utils

Nota: qemu-utils es necesario para exportar de discos raw a qcow2

5. Anyadir el usuario X al grupo:

sudo adduser  USUARIO libvirt

6. Comprobar que el demonio libvirtd esta corriendo (necesario para poder administrar KVM desde un entorno grafico con virt-manager):

ps ax | grep libvirt
 4149 ?        Sl     0:00 /usr/sbin/libvirtd -d

Crear VM desde la linea de comando (probar)

Lanzar los comandos desde el hipervisor.

Debian estable desde red configurada con NAT, 512MB de RAM y 2 GB de disco duro:

virt-install \
-n vm1 \
-r 512 \
--vcpus=2 \
--os-variant=debiansqueeze \
--disk /var/lib/libvirt/images/vm1.img,size=2 \
--nographics \
--network user \
-l http://ftp.debian.org/debian/dists/squeeze/main/installer-amd64/ \
-x console=ttyS0,115200

Debian estable desde red configurada con bridge, 512MB de RAM y 2 GB de disco duro:

virt-install \
-n vm1 \
-r 512 \
--vcpus=2 \
--os-variant=debiansqueeze \
--disk /var/lib/libvirt/images/vm1.img,size=2 \
--nographics \
--bridge br0 \
-l http://ftp.debian.org/debian/dists/squeeze/main/installer-amd64/ \
-x console=ttyS0,115200

vmbuilder

http://www.howtoforge.com/virtualization-with-kvm-on-a-debian-squeeze-server

Administrar KVM (y VM) desde una GUI en el cliente

Escenario: NO quiero instalar las X en el hipervisor, y quiero administrar gráficamente el hipervisor y las máquinas virtuales desde otra máquina (cliente) con las X instaladas

1. (Hipervisor) Instalar los siguientes paquetes:

sudo aptitude update; sudo aptitude install netcat socat -R

2. (Hipervisor) Crear el siguiente archivo:

sudo vim /bin/netcatsocket

Con el siguiente contenido:

#!/bin/bash
socat - unix-client:$2

3. (Hipervisor) Darle permisos

sudo chmod +x /bin/netcatsocket

4. (Cliente) Instalar paquetes:

sudo aptitude update; sudo aptitude install virt-manager ssh-askpass -R

5. (Cliente) Conectarse al hipervisor:

virt-manager -c qemu+ssh://USUARIO@HIPERVISOR:PUERTO/system?netcat=netcatsocket

Conectarse a la consola de VM sin GUI

1. (VM) Editar

sudo vim /etc/inittab

Y anyadir:

T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

2. (VM) Editar

sudo vim /etc/default/grub

Y dejar la linea tal que asi:

GRUB_CMDLINE_LINUX="console=tty0"

3. (VM) Recargar grub:

sudo update-grub

4. (Hipervisor) Conectarse a la consla de la VM:

sudo virsh console template

Connected to domain template
Escape character is ^]

Toca un tecla (por ejemplo enter) y aparecera el prompt:

Debian GNU/Linux 6.0 template ttyS0

template login:

5. Para finalizar la conexion CTRL + ]

Comandos varios

* Listar todas las Maquinas Virtuales (VM):

virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     name                           shut off

* Eliminar por completo una VM:

virsh undefine vm2
Domain vm2 has been undefined

Salir de la consola (virt-manager)

CTRL + ALT + F7

Errores

* Cannot recv data: Host key verification failed. : Connection reset by peer

Sucede al lanzar:

virt-manager -c qemu+ssh://usuario@hipervisor/system

Solucion: iniciar una sesion SSH para almacenar las claves del hipervisor en el cliente:

ssh usuario@hipervisor

* Error starting network 'default': internal error

Suce al intentar activar o crear una nueva red virtual desde virt-manager debido a un bug de libvirt.

Solucion: actualizar los paquetes relacionados con libvirt

1. Editar:

sudo vim /etc/apt/sources.list

Y anyadir la siguiente linea:

deb http://backports.debian.org/debian-backports squeeze-backports main

2. Actualizar la cache de paquetes:

sudo aptitude update

3. Instalar la version de backports de los siguientes paquetes:

sudo aptitude -t squeeze-backports install libvirt-bin libvirt0 python-libvirt dnsmasq-base -R

4. Reiniciar el demonio libvirtd:

sudo /etc/init.d/libvirt-bin restart

Renombrar VM

sudo su -

cd /etc/libvirt/qemu/

virsh dumpxml dns-1.test.jj.com > dns-1.dev.jj.com.xml

Apagar la VM si no lo esta

Asegurar que NO tiene snapshot

virsh undefine dns-1.test.jj.com

vim dns-1.dev.jj.com.xml

(cambios)

virsh define dns-1.dev.jj.com.xml

Discos

Acronimos:

| LVM | Logical Volume Manager |
| PV | Physical Volume |
| VG | Volume Group |
| LV | Logical Volume |

(qcow2 + LVM) agrandar disco

La estrategia es extender el disco, crear una nueva particion en el nuevo espacio, crear un PV, anyadirlo al VG, extender el LV y redimensionar el sistema de archivos (EXT4…).

Para este ejemplo clonaremos una VM pre-existente (template_lvm) de 2GB a una nueva (test7). Necesitaremos por comodidad tener habilitada la consola (conectarse_a_la_consola_de_vm_sin_gui)

1. Clonar la VM. Original: template_lvm, copia: test7

sudo virt-clone --connect=qemu:///system -o template_lvm -n test7 -f /var/lib/libvirt/images/test7.qcow2Asignando 'test7.qcow2'                                                                         | 2.0 GB     00:02     
Clon 'test7' creado correctamente.

2. Extender el disco:

sudo qemu-img resize /var/lib/libvirt/images/test7.qcow2 +8G
Image resized.

3. Arrancar la nueva VM:

sudo virsh start test7
Domain test7 started

4. Conectarse a la consola de la VM:

sudo virsh console test7
[sudo] password for usuario: 
Connected to domain test7
Escape character is ^]

Debian GNU/Linux 6.0 template ttyS0

template login: 

5. Comprobar que el Sistema Operativa ve el nuevo espacio (10 GB):

sudo fdisk -l
Disk /dev/vda: 10.7 GB, 10737418240 bytes
16 heads, 63 sectors/track, 20805 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00031f27

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           3         496      248832   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/vda2             498        4159     1845249    5  Extended
Partition 2 does not end on cylinder boundary.
/dev/vda5             498        4159     1845248   8e  Linux LVM

Disk /dev/dm-0: 1753 MB, 1753219072 bytes
255 heads, 63 sectors/track, 213 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/dm-0 doesn't contain a valid partition table

Disk /dev/dm-1: 134 MB, 134217728 bytes
255 heads, 63 sectors/track, 16 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/dm-1 doesn't contain a valid partition table

6. Crear una nueva particion

sudo fdisk /dev/vda

2 opciones:

a) DOS-compatible mode

n
p
3
4160
Enter
w

a) Deshabilitar DOS-compatible mode (RECOMENDADO)

c
u
n
p
3
4192256
enter
w

En 'First cylinder' hemos especificado 4160 (o 4192256) que es el resultante de anyadirle 1 al cilindor final de la particion '/dev/vda5' (ver paso 5)

7. Aqui hay que reiniciar para que la particion sea usable por el Sistema Operativo:

sudo shutdown -r now

8. Crear un PV con la nueva particion:

sudo pvcreate /dev/vda3
Physical volume "/dev/vda3" successfully created

9. Anyadir ese PV al VG. Primero obtener el nombre del VG y del PV:

sudo vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "template" using metadata type lvm2
sudo pvscan
  PV /dev/vda5   VG template        lvm2 [1.76 GiB / 0    free]
  PV /dev/vda3                      lvm2 [8.00 GiB]
  Total: 2 [9.76 GiB] / in use: 1 [1.76 GiB] / in no VG: 1 [8.00 GiB]

Anyadimos el PV '/dev/vda3' al VG 'template':

sudo vgextend template /dev/vda3
Volume group "template" successfully extended

10. Extendemos el VL. Primero los listamos:

sudo lvscan
ACTIVE            '/dev/template/root' [1.63 GiB] inherit
ACTIVE            '/dev/template/swap_1' [128.00 MiB] inherit

Vamos a extender el LV '/dev/template/root' todo lo que podamos:

sudo lvextend -l +100%FREE /dev/template/root
Extending logical volume root to 9.63 GiB
Logical volume root successfully resized

11. Extendemos el sistema de archivos. El proceso tarda 1 minuto para 8GB:

sudo resize2fs /dev/mapper/template-root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/template-root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mapper/template-root to 2525184 (4k) blocks.
The filesystem on /dev/mapper/template-root is now 2525184 blocks long.

Comprobamos que todo ha ido bien:

df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/template-root
                      9.5G  565M  8.5G   7% /
tmpfs                 249M     0  249M   0% /lib/init/rw
udev                  244M  108K  244M   1% /dev
tmpfs                 249M     0  249M   0% /dev/shm
/dev/vda1             228M   16M  201M   8% /boot

Snapshots

http://redes-privadas-virtuales.blogspot.com.es/2011/03/taking-snapshots-on-kvm-with-libvirt.html

Caracteristicas/limitaciones:

* Virt-manager (0.9.1) NO soporta snapshots, por lo que tenemos que hacerlo desde la lina de comandos * Solo el formato de disco virtual qcow2 soporta snapshots * Se puede tomar un snapshot con la VM corriendo (2GB disco tarda 3m14.810s) * Se puede restaurar un snapshot con la VM corriendo (creo que Virtualbox NO lo soporta)

Tomar snapshot / migrar formato de disco raw a qcow2

1. Conectarse al hipervisor. Yo por simplicidad lo hago a traves de SSH, pero a lo mejor es posible conectarse desde el cliente con un virsh -c URL

ssh usuario@hipervisor

2. Crear un archivo .xml con informacion sobre el snapshot:

sudo vim /var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml

Con el siguiente contenido:

<domainsnapshot>
   <name>test2_snapshot_01_160520121140</name>
   <description>Fresh install of Debian Squeeze 64 bits</description>
</domainsnapshot>

Grabar y salir

3. IMPORTANTE: solo el formato qcow2 soporta snapshots. Vamos a comprobar que formato tiene el disco duro de la VM, que en este ejemplo se llama “test2”

sudo virsh edit test2

De la informacion que muestra nos fijamos en el disco:

...
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/var/lib/libvirt/images/test2.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
...

Si intentamos tomar el snapshot veremos que NO lo soporta (:q! para salir de la ventana de edicion):

sudo virsh snapshot-create test2 /var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml 
error: Requested operation is not valid: Disk '/var/lib/libvirt/images/test2.img' does not support snapshotting

Por lo que volvemos a editar:

sudo virsh edit test2

Y dejamos la seccion de disco tal que asi (solo cambiar qcow2):

...
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/test2.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
...

Grabar y salir

Domain test2 XML configuration edited.

TODO: quiza hay un comando para cambiar el formato del disco

4. Convertir el disco de formato raw a qcow2. La VM debe estar apagada

sudo qemu-img convert -f raw -O qcow2 -o preallocation=metadata /var/lib/libvirt/images/test2.img /var/lib/libvirt/images/test2.qcow2
sudo chown libvirt-qemu:kvm /var/lib/libvirt/images/test2.qcow2

5. Volver a tomar el snapshot:

sudo virsh snapshot-create test2 /var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml 
Domain snapshot test2_snapshot_01_160520121140 created from '/var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml'

Para verlo:

sudo virsh snapshot-list test2
 Name                 Creation Time             State
------------------------------------------------------------
 test2_snapshot_01_160520121140 2012-05-16 12:46:48 +0200 shutoff

RENDIMIENTO si tomamos el snapshot de una VM corriendo (2GB de disco duro) me tomo 03'14“

6. Arrancar la VM y verificar que funciona correctamente

sudo virsh start test2
Domain test2 started

7. Si ha arrancado correctamente, eliminar el viejo disco:

sudo rm -fr /var/lib/libvirt/images/test2.img

Script para tomar snapshot

  • Requiere python 2
  • Se tiene que ejecutar como root
  • Ejecutar 'sudo ./snapshot.py', o el nombre que le des al script
#!/usr/bin/python

import sys, commands, time, os, datetime

# Variables

path_snapshots = '/var/lib/libvirt/qemu/snapshot/'
header = ['Id', 'Name', 'State']
snapshot_template = """\
<domainsnapshot>
   <name>NAME</name>
   <description>DESCRIPTION</description>
</domainsnapshot>
"""

# Code

if not os.geteuid() == 0:
    print "You aren't root.  Goodbye."
    sys.exit()

output = commands.getoutput('virsh list --all')
print output
list_vm = [line for line in output.split('\n') if '---' not in line and not all(e in line for e in header)]
row_number_list_vm = int(raw_input('Select which VM to take snapshot.\nUse line number (1 for " %s" etc...): '\
 %(list_vm[0])))

line = list_vm[row_number_list_vm-1]
print 'You selected "%s"' %(line)

description = raw_input('Please type a description for this snapshot: ')

aux = line.split('   ')[0].split(' ')
vm_name = aux[len(aux)-1]
snapshot_name =  vm_name + '_' + str(time.time()).split('.')[0]

snapshot_xml_path = path_snapshots + snapshot_name + '.xml'
snapshot_xml = snapshot_template.replace('NAME',snapshot_name).replace('DESCRIPTION',description)

file = open(snapshot_xml_path, 'w+')
file.write(snapshot_xml)
file.close()

print "WARNING, the process takes a while. For a running machine with 2 GB disk can take 3 minutes"
print datetime.datetime.today()

output = commands.getstatusoutput('virsh snapshot-create %s %s' %(vm_name,snapshot_xml_path))
if output[0] != 0:
    print 'Error %s' %(str(output))

print datetime.datetime.today()

Restaurar snapshot

1. Conectarse al hipervisor. Yo por simplicidad lo hago a traves de SSH, pero a lo mejor es posible conectarse desde el cliente con un virsh -c URL

ssh usuario@hipervisor

2. Listar las snapshots que tenemos (nuestra VM se llama 'test2'):

sudo virsh snapshot-list test2
 Name                 Creation Time             State
------------------------------------------------------------
 test2_snapshot_01_160520121140 2012-05-16 12:46:48 +0200 shutoff
 test2_snapshot_02    2012-05-16 12:58:29 +0200 running
 test2_snapshot_03    2012-05-16 13:03:33 +0200 running

3. Restaurar por ejemplo segunda (test2_snapshot_02):

sudo virsh snapshot-revert test2 test2_snapshot_02

Tarda un par de segundos

Borrar snapshot

Los snapshots soportan como parametros –children, pero si no se le ha pasado en el momento de tomarlo, son considerados totalmente independientes, es decir, se pueden borar 1 a 1:

sudo virsh snapshot-delete test2 test2_snapshot_02
Domain snapshot test2_snapshot_02 deleted

Clonar

  • Se puede hacer tanto desde GUI (no lo he probado) como desde linea de comandos
  • Requiere pausar (mejor) o apagar la VM
  • Para una maquina de 2 GB de disco duro .qcow2 provisionado por completo el proceso completo tarda unos 20”

1. Conectar al hipervisor

ssh USUARIO@HIPERVISOR

2. Pausar la VM a clonar. Durante este tiempo consume recursos pero NO es accesible

sudo virsh suspend template
Domain template suspended

3. Clonar la VM:

sudo virt-clone  --connect=qemu:///system -o template -n template_clone -f /var/lib/libvirt/images/template_clone.qcow2
Asignando 'template_clone.qcow2'                                                                                                                                                                                        | 2.0 GB     00:02     

Clon 'template_clone' creado correctamente.

4. Reanudar la VM:

sudo virsh resume template
Domain template resumed/description
informatica/linux/escaner.1339173109.txt.gz · Last modified: 2015/04/13 20:19 (external edit)