Virtualización con Libvirt
Warning: This information may be outdated. Please note the date of the post.
En este post se va a llevar a cabo una práctica para manejar libvirt. Saber gestionar un sistema de virtualización a bajo nivel.
Para conceptos previos puedes acceder a este post
Tarea:
- Crea con
virt-installuna imagen de Debian Buster con formato qcow2 y un tamaño máximo de 3GiB. Esta imagen se denominarábuster-base.qcow2. El sistema de ficheros del sistema instalado en esta imagen será XFS. La imagen debe estar configurada para poder usar hasta dos interfaces de red por dhcp. El usuariodebiancon contraseñadebianpuede utilizar sudo sin contraseña.
Crear redes
Primero tenemos que crear las redes que necesitamos, en este caso usaremos la default que es ‘virbr0’ y una nueva que vamos a crear ‘virbr2’.
La red default tiene estas caracteristicas:
<network>
<name>default</name>
<uuid>4a90cfb3-6969-40c7-99df-d2440cca4d1b</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:b0:ec:fd'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
Actualmente tenemos dos redes, una es la que está por defecto y la otra es una que ha creado vagrant llamada virbr1 (esta no la vamos a usar), por lo que vamos a crear la virbr2
Crear virbr2
Creamos la red virbr2, dándole un direccionamiento 192.168.200.0/24 en modo NAT.
nano red2.xml
<network>
<name>red2</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr2' stp='on' delay='0'/>
<ip address='192.168.200.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.200.2' end='192.168.200.254'/>
</dhcp>
</ip>
</network>
Definimos la nueva red virbr2
root@debian:/etc/libvirt/qemu/networks# virsh net-define red2.xml
Network red2 defined from red2.xml
Listar las redes
root@debian:/etc/libvirt/qemu/networks# virsh net-list --all
Name State Autostart Persistent
------------------------------------------------------
default inactive no yes
red2 active no no
vagrant-libvirt inactive no yes
Iniciamos las redes oportunas, las marcamos como autostart para que se inicien automáticamente.
Listamos las redes y comprobamos que estan activas
root@debian:/etc/libvirt/qemu/networks# virsh net-list --all
Name State Autostart Persistent
------------------------------------------------------
default active yes yes
red2 active yes yes
vagrant-libvirt inactive no yes
Crear mv con la imagen qcow2
Una vez creadas las redes y activadas vamos a crear la mv con la imagen qcow2
virt-install --connect qemu:///system --name buster-base --cdrom ~/isos/debian-10.8.0-amd64-netinst.iso --disk size=3 --network bridge=virbr0 --network bridge=virbr2 --memory 1024 --vcpus 1
Hacemos la instalación, teniendo en cuenta el sistema de archivos con formato XFS. No me voy a demorar con la instalación y suponemos que sabemos hacerlo. Una vez iniciado el sistema comprobamos los discos del sistema.
debian@debian-kvm:~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sr0
vda
└─vda1 xfs 30a9cfb1-0b31-4368-8b7a-c6779804e450 2G 35% /
Cuando se haya finalizado la instalación vamos a descargar sudo, ya que necesitaremos que el usuario debian en este caso tenga privilegios de administrador.
su -
apt install sudo
adduser debian sudo
nano /etc/sudoers
Añadimos al usuario debian a sudoers de forma que pueda usar sudo sin contraseña.
# User privilege specification
root ALL=(ALL:ALL) ALL
debian ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
%debian ALL=(ALL:ALL) ALL
debian ALL=(ALL) NOPASSWD:ALL
Comprobamos que se ha creado el archivo buster-base.xml que contiene la informacion de la máquina que hemos creado.
celiagm@debian:/etc/libvirt/qemu$ sudo cat buster-base.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit buster-base
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>buster-base</name>
<uuid>01dd42ef-072b-4a96-9108-e62a19260b2e</uuid>
<metadata>
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
<libosinfo:os id="http://debian.org/debian/10"/>
</libosinfo:libosinfo>
</metadata>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-q35-3.1'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<vmport state='off'/>
</features>
<cpu mode='host-model' check='partial'>
<model fallback='allow'/>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/buster-base.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='sda' bus='sata'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='qemu-xhci' ports='15'>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</controller>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pcie-root'/>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</controller>
<controller type='pci' index='1' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='1' port='0x10'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
</controller>
<controller type='pci' index='2' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='2' port='0x11'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
</controller>
<controller type='pci' index='3' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='3' port='0x12'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
</controller>
<controller type='pci' index='4' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='4' port='0x13'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
</controller>
<controller type='pci' index='5' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='5' port='0x14'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
</controller>
<controller type='pci' index='6' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='6' port='0x15'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
</controller>
<controller type='pci' index='7' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='7' port='0x16'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
</controller>
<controller type='pci' index='8' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='8' port='0x17'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:e4:0c:13'/>
<source bridge='virbr0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
<interface type='bridge'>
<mac address='52:54:00:d8:83:43'/>
<source bridge='virbr2'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
</channel>
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='spice' autoport='yes'>
<listen type='address'/>
<image compression='off'/>
</graphics>
<sound model='ich9'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='3'/>
</redirdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
</memballoon>
<rng model='virtio'>
<backend model='random'>/dev/urandom</backend>
<address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
</rng>
</devices>
</domain>
Comprobamos que se ha creado el fichero .qcow2 en el directorio /var/lib/libvirt/images/
root@debian:/var/lib/libvirt/images# ls
buster-base.qcow2 compilar_default.img debian-VAGRANTSLASH-buster64_vagrant_box_image_10.4.0.img
Crear par de claves
Crea un par de claves ssh en formato ecdsa y sin frase de paso y agrega la clave pública al usuario debian
Creamos el par de claves indicado en la máquina anfitriona.
ssh-keygen -t ecdsa -b 521
En la mv creamos el fichero authorized_keys e introducimos la clave pública.
debian@debian-kvm:~/.ssh$ cat authorized_keys
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAF5SCIOXoPk1sXDH43L1r4YqoP15DHGxRfCvat01stXT0YEIeXujgFalyETMu3WqlIjLtca/b5JV4Gk//rk0IdfVQAXhQFgruXQ6e7EYSru0D9XCaTuiJ4oMzoFu/+caYUT+o5HeOSHTWj1EfOqqbJDsuACJ5vvjubPrQ54P6orN3D1dQ== celiagm@debian
Reducir el tamaño: virt-sparsify
Utiliza la herramienta virt-sparsify para reducir al máximo el tamaño de la imagen
root@debian:/var/lib/libvirt/images# virt-sparsify --compress buster-base.qcow2 buster-base_red.qcow2
[ 0.0] Create overlay file in /tmp to protect source disk
[ 0.0] Examine source disk
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ --:--
[ 7,1] Fill free space in /dev/sda1 with zero
[ 8,7] Copy to destination and make sparse
[ 64,8] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.
Comprobamos que está creada la imagen y ocupa menos espacio
root@debian:/var/lib/libvirt/images# ls -lh
total 5,8G
-rw------- 1 root root 3,1G mar 22 17:38 buster-base.qcow2
-rw-r--r-- 1 root root 377M mar 22 17:46 buster-base_red.qcow2
Subir imagen a un sitio
Sube la imagen y la clave privada ssh a alguna ubicación pública desde la que se pueda descargar
Lo subimos a Mega
2. Escribe un shell script que ejecutado por un usuario con acceso a qemu:///system realice los siguientes pasos:
Crear nueva imagen desde una imagen base
1. Crea una imagen nueva, que utilice
buster-base.qcow2como imagen base y tenga 5 GiB de tamaño máximo. Esta imagen se denominarámaquina1.qcow2
Creamos la imagen
qemu-img create -f qcow2 -b buster-base_red.qcow2 maquina1.qcow2 5G
Salida:
root@debian:/var/lib/libvirt/images# qemu-img create -f qcow2 -b buster-base_red.qcow2 maquina1.qcow2 5G
Formatting 'maquina1.qcow2', fmt=qcow2 size=5368709120 backing_file=buster-base_red.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16
Comprobamos que se ha creado maquina1.qcow2
root@debian:/var/lib/libvirt/images# ls -lh
total 5,8G
-rw------- 1 root root 3,1G mar 22 17:38 buster-base.qcow2
-rw-r--r-- 1 root root 377M mar 22 17:46 buster-base_red.qcow2
-rw------- 1 root root 3,2G mar 18 17:51 compilar_default.img
-rwxr--r-- 1 libvirt-qemu libvirt-qemu 1,1G ene 27 11:01 debian-VAGRANTSLASH-buster64_vagrant_box_image_10.4.0.img
-rw-r--r-- 1 root root 193K mar 22 18:18 maquina1.qcow2
Crear red interna intra
2. Crea una red interna de nombre intra con salida al exterior mediante NAT que utilice el direccionamiento
10.10.20.0/24
Creamos el nuevo fichero .xml.
Le proporcionamos un identificador y le proporcionamos una mac respetando los tres primeros octetos.
cat /proc/sys/kernel/random/uuid
intra.xml
<network>
<name>intra</name>
<uuid>697e03ff-85da-45ff-815b-b16170e2125f</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr3' stp='on' delay='0'/>
<mac address='52:54:00:a1:51:25'/>
<ip address='10.10.20.0' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.20.2' end='10.10.20.254'/>
</dhcp>
</ip>
</network>
La definimos, la iniciamos y comprobamos que esta activo
root@debian:/etc/libvirt/qemu/networks# virsh net-define intra.xml
Network intra defined from intra.xml
root@debian:/etc/libvirt/qemu/networks# virsh net-start intra
Network intra started
root@debian:/home/celiagm/isos# virsh net-autostart intra
Network intra marked as autostarted
root@debian:/home/celiagm/isos# virsh net-list --all
Name State Autostart Persistent
------------------------------------------------------
default active yes yes
intra active yes yes
red2 active yes yes
vagrant-libvirt inactive no yes
Crear MV
3. Crea una máquina virtual (maquina1) conectada a la red intra, con 1 GiB de RAM, que utilice como disco raíz
maquina1.qcow2y que se inicie automáticamente. Arranca la máquina.
Creamos el dominio, llamado maquina1.xml
<domain type="kvm">
<name>dominio1</name>
<memory unit="G">1</memory>
<vcpu>1</vcpu>
<os>
<type arch="x86_64">hvm</type>
</os>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/maquina1.qcow2'/>
<target dev='vda'/>
</disk>
<interface type="network">
<source network="intra"/>
<mac address="52:54:00:87:c1:a5"/>
</interface>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' />
</devices>
</domain>
Comprobamos que es válido el fichero xml
root@debian:/etc/libvirt/qemu# virt-xml-validate maquina1.xml
maquina1.xml validates
Definimos y arrancamos la máquina
root@debian:/etc/libvirt/qemu# virsh define maquina1.xml
Domain maquina1 defined from maquina1.xml
root@debian:/etc/libvirt/qemu# virsh start maquina1
Domain maquina1 started
Comprobamos que está encendida
root@debian:/etc/libvirt/qemu# virsh list --all
Id Name State
-----------------------------------
3 maquina1 running
- buster-base shut off
- compilar_default shut off
Nos conectamos a ella
$ virt-viewer -c qemu:///system maquina1
Crear volumen adicional RAW (pool por defecto)
4. Crea un volumen adicional de 1 GiB de tamaño en formato RAW ubicado en el pool por defecto
Creamos el xml del volumen de 1Gb
vol.xml
<volume type='file'>
<name>vol1.img</name>
<key>/var/lib/libvirt/images/vol1.img</key>
<source>
</source>
<allocation>0</allocation>
<capacity unit="G">1</capacity>
<target>
<path>/var/lib/libvirt/images/vol1.img</path>
<format type='raw'/>
</target>
</volume>
Creamos el volumen en el pool por defecto
root@debian:/var/lib/libvirt/images# virsh vol-create default vol.xml
Vol vol1.img created from vol.xml
Listar volumenes
root@debian:/var/lib/libvirt/images# virsh vol-list default
Name Path
------------------------------------------------------------------------------------------------------------------------------------------------
buster-base.qcow2 /var/lib/libvirt/images/buster-base.qcow2
compilar_default.img /var/lib/libvirt/images/compilar_default.img
debian-VAGRANTSLASH-buster64_vagrant_box_image_10.4.0.img /var/lib/libvirt/images/debian-VAGRANTSLASH-buster64_vagrant_box_image_10.4.0.img
vol1.img /var/lib/libvirt/images/vol1.img
Gestión del volumen nuevo para postgresql
5. Una vez iniciada la MV maquina1, conecta el volumen a la máquina, crea un sistema de ficheros XFS en el volumen y móntalo en el directorio
/var/lib/postgresql. Ten cuidado con los propietarios y grupos que pongas, para que funcione adecuadamente el siguiente punto.
Conectamos el volumen creado de 1Gb a la máquina
root@debian:/var/lib/libvirt/images# virsh attach-disk maquina1 --source /var/lib/libvirt/images/vol1.img --target vdc --persistent
Disk attached successfully
Le damos formato XFS , para ello tenemos que intalar los siguientes paquetes
sudo apt-get install xfsprogs dosfstools
root@debian-kvm:/home/debian# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.bfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
root@debian-kvm:/home/debian# lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 254:0 0 5G 0 disk
vda1 254:1 0 3G 0 part /
vdb 254:16 0 1G 0 disk
root@debian-kvm:/home/debian# mkfs.xfs /dev/vdb
meta-data=/dev/vdb isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
root@debian-kvm:/home/debian# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
vda
└─vda1 xfs 30a9cfb1-0b31-4368-8b7a-c6779804e450 2G 35% /
vdb xfs 6ebae309-2c2f-4c67-b098-20a9afbda1a5
Conceder permisos adecuados
Antes de montarlo en el directorio /var/lib/postgresql. vamos a ver qué permisos tenemos que darle y que usuarios tenemos que crear para la base de datos en postgresql.
Creamos el grupo postgres
debian@debian-kvm:~$ sudo groupadd postgres
debian@debian-kvm:~$ sudo useradd postgres -m -g postgres
Creamos el directorio y le damos los permisos adecuados
root@debian-kvm:/var/lib# mkdir postgresql
root@debian-kvm:/var/lib# chown -R postgres:postgres postgresql/
root@debian-kvm:/var/lib# ls -l | grep 'post'
drwxr-xr-x 2 postgres postgres 6 abr 5 19:50 postgresql
Montamos el disco en el directorio requerido
root@debian-kvm:/var/lib# mount -t xfs /dev/vdb /var/lib/postgresql/
Comprobamos que se ha montado
root@debian-kvm:/var/lib# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
vda
└─vda1 xfs 30a9cfb1-0b31-4368-8b7a-c6779804e450 1,7G 43% /
vdb xfs 6ebae309-2c2f-4c67-b098-20a9afbda1a5 980,8M 3% /var/lib/postgresql
Instalar postgresql vía ssh
6. Instala en maquina1 el sistema de BBDD PostgreSQL que ubicará sus ficheros con las bases de datos en
/var/lib/postgresqlutilizando una conexión ssh.
Accedemos por ssh a la mv.
Instalamos prostgres como se indica en el siguiente post
Comprobamos que se ha creado el directorio 11 correspondiente a la versión de postgresql.
root@debian-kvm:/var/lib/postgresql# ls -lh
total 0
drwxr-xr-x 3 postgres postgres 18 abr 7 15:11 11
Vamos a darle una contraseña al usuario postgres
passwd postgres
Poblar la base de datos de PostgreSQL
7. (Opcional) Puebla la base de datos con una BBDD de prueba (escribe en la tarea el nombre de usuario y contraseña para acceder a la BBDD).
Creamos el usario celia y la base de datos prueba
debian@debian-kvm:~$ sudo su
root@debian-kvm:/home/debian# su - postgresql
su: el usuario postgresql no existe
root@debian-kvm:/home/debian# su - postgres
$ psql
psql (11.11 (Debian 11.11-1.pgdg100+1))
Digite «help» para obtener ayuda.
postgres=# create user celia with password 'celia';
CREATE ROLE
postgres=# create database prueba;
CREATE DATABASE
postgres=# grant all privileges on database prueba to celia;
GRANT
postgres=# exit
Entramos como usuario celia y poblamos la base de datos
psql -h localhost -U celia -W -d prueba
Agregamos una tabla de prueba con sus registros
create table departamento(
dept_no integer,
dnombre varchar(20),
loc varchar(20),
primary key (dept_no)
);
-- Añadimos registros
insert into departamento
values ('10','CONTABILIDAD','SEVILLA');
insert into departamento
values ('20','INVESTIGACION','MADRID');
insert into departamento
values ('30','VENTAS','BARCELONA');
insert into departamento
values ('40','PRODUCCION','BILBAO');
Mostramos la tabla con los registros
prueba=> \d
Listado de relaciones
Esquema | Nombre | Tipo | Dueño
---------+--------------+-------+-------
public | departamento | tabla | celia
(1 fila)
prueba=> select * from departamento;
dept_no | dnombre | loc
---------+---------------+-----------
10 | CONTABILIDAD | SEVILLA
20 | INVESTIGACION | MADRID
30 | VENTAS | BARCELONA
40 | PRODUCCION | BILBAO
(4 filas)
Regla NAT
8. Crea una regla de NAT para que la base de datos sea accesible desde el exterior
Ahora vamos a editar el fichero de configuracion de postgres para hacer que sea accesible desde otras maquinas
nano /etc/postgresql/11/main/postgresql.conf
Buscamos las líneas siguientes y las modificamos así, de tal forma que sea accesible desde el exterior.
listen_addresses = '*' # what IP address(es) to listen on;
#unix_socket_group = '' # (change requires restart)
unix_socket_permissions = 0700 # begin with 0 to use octal notation
Editamos el siguiente fichero también y cambiamos lo siguiente
nano /etc/postgresql/11/main/pg_hba.conf
Cambiamos
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# lo cambiamos por
host all all all md5
Para permitir las conexiones desde cualquier dirección ip con cualquier usuario y base de datos (si éste tiene permiso para ello).
Ahora reiniciamos el servicio de postgres
sudo systemctl restart postgresql
Comprobamos que está funcionando
root@debian-kvm:/# sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2021-03-31 22:18:03 CEST; 5s ago
Process: 3249 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 3249 (code=exited, status=0/SUCCESS)
mar 31 22:18:03 debian-kvm systemd[1]: Starting PostgreSQL RDBMS...
mar 31 22:18:03 debian-kvm systemd[1]: Started PostgreSQL RDBMS.
Ahora que está accesible solo tenemos que crear la regla NAT
Primero miramos por donde está escuchando postgres
root@debian-kvm:/home/debian# netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 408/sshd
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 8164/postgres
tcp6 0 0 :::22 :::* LISTEN 408/sshd
tcp6 0 0 :::5432 :::* LISTEN 8164/postgres
Comprobamos que es el puerto 5434, por lo tanto
sudo iptables -A INPUT -p tcp -s 10.10.20.158/24 --dport 5432 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m state --state ESTABLISHED -j ACCEPT
Acceso remoto a la base de datos (anfitriona - maquina virtual)
Comprobamos que podemos acceder desde la máquina anfitriona y podemos ver la tabla creada. Le pasaremos el parámetro -h (host) –port (puerto ) -U (usuario) -W (contraseña de forma forzada)
celiagm@debian:~$ psql -h 10.10.20.158 --port 5432 -U celia -W prueba
Contraseña:
psql (11.11 (Debian 11.11-0+deb10u1))
conexión SSL (protocolo: TLSv1.3, cifrado: TLS_AES_256_GCM_SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.
prueba=> \d
Listado de relaciones
Esquema | Nombre | Tipo | Dueño
---------+--------------+-------+-------
public | departamento | tabla | celia
(1 fila)
prueba=>
Punto de control
9. Pausa la ejecución para comprobar los pasos hasta este punto
Los pasos hasta aquí parecen correctos. (El script nos mostraría un OK)
10. Continúa la ejecución cuando el usuario pulse ‘C’
Crear imagen nueva desde imagen base: maquina2
11. Crea una imagen que utilice
buster-base.qcow2como imagen base y que tenga un tamaño de 4 GiB. Esta imagen se llamarámaquina2.qcow2
Hacemos el mismo procedimiento que al principio
qemu-img create -f qcow2 -b buster-base_red.qcow2 maquina2.qcow2 4G
root@debian:/var/lib/libvirt/images# qemu-img create -f qcow2 -b buster-base_red.qcow2 maquina2.qcow2 4G
Formatting 'maquina2.qcow2', fmt=qcow2 size=4294967296 backing_file=buster-base_red.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16
- Comprobamos que se ha creado también la máquina2.
root@debian:/var/lib/libvirt/images# ls -lh | grep 'maquina'
-rw-r--r-- 1 libvirt-qemu libvirt-qemu 347M abr 5 19:32 maquina1.qcow2
-rw-r--r-- 1 root root 193K abr 5 19:33 maquina2.qcow2
12. Crea una nueva máquina (maquina2) que utilice imagen anterior, con 1 GiB de RAM y que también esté conectada a intra.
- Creamos el xml de maquina2
<domain type="kvm">
<name>dominio2</name>
<memory unit="G">1</memory>
<vcpu>1</vcpu>
<os>
<type arch="x86_64">hvm</type>
</os>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/maquina2.qcow2'/>
<target dev='vda'/>
</disk>
<interface type="network">
<source network="intra"/>
<mac address="52:54:00:23:c8:a9"/>
</interface>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' />
</devices>
</domain>
- Validamos la sintaxis
root@debian:/var/lib/libvirt/images# virt-xml-validate maquina2.xml
maquina2.xml validates
- Definimos la máquina
root@debian:/var/lib/libvirt/images# virsh define maquina2.xml
Domain maquina2 defined from maquina2.xml
root@debian:/var/lib/libvirt/images# virsh start maquina2
Domain maquina2 started
- Comprobamos que se ha creado
root@debian:/var/lib/libvirt/images# virsh list --all
Id Name State
-----------------------------------
2 maquina2 running
- buster-base shut off
- compilar_default shut off
- dominio2 shut off
- maquina1 shut off
- Nos conectamos por ssh
debian@debian-kvm:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 254:0 0 4G 0 disk
└─vda1 254:1 0 3G 0 part /
debian@debian-kvm:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:23:c8:a9 brd ff:ff:ff:ff:ff:ff
inet 10.10.20.161/24 brd 10.10.20.255 scope global dynamic enp0s3
valid_lft 3456sec preferred_lft 3456sec
inet6 fe80::5054:ff:fe23:c8a9/64 scope link
valid_lft forever preferred_lft forever
13. Para el servicio postgreSQL, desmonta el dispositivo de bloques, desmonta el volumen de maquina1, monta el volumen en maquina2 en el directorio /var/lib/pgsql teniendo de nuevo cuidado con los propietarios y permisos del directorio.
- Paramos el servicio de postgresql
debian@debian-kvm:~$ sudo systemctl stop postgresql
debian@debian-kvm:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2021-05-10 21:19:21 CEST; 5s ago
Process: 308 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 308 (code=exited, status=0/SUCCESS)
may 10 21:17:52 debian-kvm systemd[1]: Starting PostgreSQL RDBMS...
may 10 21:17:52 debian-kvm systemd[1]: Started PostgreSQL RDBMS.
may 10 21:19:21 debian-kvm systemd[1]: postgresql.service: Succeeded.
may 10 21:19:21 debian-kvm systemd[1]: Stopped PostgreSQL RDBMS.
- Desmontamos el dispositivo de bloques.
debian@debian-kvm:~$ sudo umount /var/lib/postgresql
debian@debian-kvm:~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
vda
└─vda1 xfs 30a9cfb1-0b31-4368-8b7a-c6779804e450 1,6G 48% /
vdb xfs 6ebae309-2c2f-4c67-b098-20a9afbda1a5
- Apagamos la máquina
virsh destroy maquina1
- Desmontamos el volumen de máquina 1
root@debian:/var/lib/libvirt/images# virsh detach-disk maquina1 vdc --persistent
Disk detached successfully
- Apagamos la maquina2
virsh destroy maquina2
- Montamos el volumen
root@debian:/var/lib/libvirt/images# virsh attach-disk maquina2 --source /var/lib/libvirt/images/vol1.img --target vdc --persistent
Disk attached successfully
- Encendemos la máquina2, creamos el directorio con los permisos adecuados y montamos el dispositivo
debian@debian-kvm:~$ sudo su
root@debian-kvm:/home/debian# cd /var/lib/
# Creamos el directorio de postgresql
root@debian-kvm:/var/lib# mkdir postgresql
# Creamos el grupo de postgresql
root@debian-kvm:/var/lib# sudo groupadd postgres
# Creamos el usuario postgresql
root@debian-kvm:/var/lib# sudo useradd postgres -m -g postgres
# Le concedemos los permisos necesarios
root@debian-kvm:/var/lib# chown -R postgres:postgres postgresql/
# comprobamos que se ha creado el directorio
root@debian-kvm:/var/lib# ls -l | grep 'post'
drwxr-xr-x 2 postgres postgres 6 may 11 19:06 postgresql
# Montamos el disco en el directorio
root@debian-kvm:~# mount -t xfs /dev/vdb /var/lib/postgresql/
# Vemos que se ha montado correctamente
root@debian-kvm:~# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
vda
└─vda1 xfs 30a9cfb1-0b31-4368-8b7a-c6779804e450 2G 35% /
vdb xfs 6ebae309-2c2f-4c67-b098-20a9afbda1a5 933,5M 8% /var/lib/postgresql
# Entramos en el directorio y comprobamos que nos aparece el directorio correspondiente 11.
root@debian-kvm:~# cd /var/lib/postgresql/
root@debian-kvm:/var/lib/postgresql# ls
11
14. Copia de forma adecuada todos los ficheros de configuración de PostgreSQL de maquina1 a maquina2
## miramos donde se ubica la información de postgresl en maquina1
root@debian-kvm:/home/debian# whereis postgresql
postgresql: /usr/lib/postgresql /etc/postgresql /usr/share/postgresql
copiar de maquina1 a maquina2 la carpeta de configuracion de postgresql
# MAQUINA1
root@debian-kvm:/home/debian# cd /etc/postgresql/11/main/
conf.d/ pg_ctl.conf pg_ident.conf start.conf
environment pg_hba.conf postgresql.conf
root@debian-kvm:/home/debian# scp -r /etc/postgresql debian@10.10.20.161:/home/debian/
The authenticity of host '10.10.20.161 (10.10.20.161)' can't be established.
ECDSA key fingerprint is SHA256:Kmbtz8Ne+I5COcMNI2EnNxEEipTjZ5UPcCBzhLZ1DG4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.20.161' (ECDSA) to the list of known hosts.
debian@10.10.20.161's password:
start.conf 100% 317 73.2KB/s 00:00
pg_ctl.conf 100% 143 42.2KB/s 00:00
postgresql.conf 100% 24KB 4.1MB/s 00:00
pg_hba.conf 100% 4677 1.0MB/s 00:00
pg_ident.conf 100% 1636 448.7KB/s 00:00
environment 100% 315 87.2KB/s 00:00
root@debian-kvm:/home/debian# ls -l /etc/ | grep 'postgresql'
drwxr-xr-x 3 postgres postgres 16 abr 7 15:11 postgresql
drwxr-xr-x 3 root root 122 abr 7 15:11 postgresql-common
# MAQUINA2
root@debian-kvm:/home/debian# ls -l
total 0
drwxr-xr-x 3 debian debian 16 may 11 19:20 postgresql
root@debian-kvm:/home/debian# chown -R postgres:postgres postgresql/
root@debian-kvm:/home/debian# ls -l
total 0
drwxr-xr-x 3 postgres postgres 16 may 11 19:20 postgresql
root@debian-kvm:/home/debian# mv postgresql/ /etc/
root@debian-kvm:/home/debian# cd /etc/postgresql/
root@debian-kvm:/etc/postgresql# ls
11
15. Instala PostgreSQL en maquina2 a través de ssh
Nos aseguramos que la versión de postgres que vamos a instalar es la misma que la maquina 1
sudo apt-get install gnupg
sudo apt install -y vim wget
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
RELEASE=$(lsb_release -cs)
echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt -y install postgresql-11
- Comprobamos que está instalado
debian@debian-kvm:~$ whereis postgresql
postgresql: /usr/lib/postgresql /etc/postgresql /usr/share/postgresql
debian@debian-kvm:~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
vda
└─vda1 xfs 30a9cfb1-0b31-4368-8b7a-c6779804e450 1,8G 41% /
vdb xfs 6ebae309-2c2f-4c67-b098-20a9afbda1a5 933,8M 8% /var/lib/postgresql
debian@debian-kvm:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2021-05-11 19:32:13 CEST; 3min 18s ago
Main PID: 3663 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 1149)
Memory: 0B
CGroup: /system.slice/postgresql.service
may 11 19:32:13 debian-kvm systemd[1]: Starting PostgreSQL RDBMS...
may 11 19:32:13 debian-kvm systemd[1]: Started PostgreSQL RDBMS.
- Nos metemos como usuario postgresql y comprobamos que tenemos la base de datos de prueba
debian@debian-kvm:~$ sudo su
root@debian-kvm:/home/debian# su - postgres
$ psql -h localhost -U celia -W -d prueba
Contraseña:
psql (11.11 (Debian 11.11-1.pgdg100+1))
conexión SSL (protocolo: TLSv1.3, cifrado: TLS_AES_256_GCM_SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.
prueba=> \d
Listado de relaciones
Esquema | Nombre | Tipo | Dueño
---------+--------------+-------+-------
public | departamento | tabla | celia
(1 fila)
prueba=>

16. Conecta maquina2 al bridge exterior de tu equipo, comprueba la IP que tiene el equipo en el bridge exterior y muéstrala por la salida estándar. Desconecta maquina2 de intra.
Creamos el fichero de configuracion xml para el bridge externo br0 que se llama en la máquina anfitriona.
root@debian:/etc/libvirt/qemu/networks# nano br0.xml
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
Lo definimos y comprobamos que se ha creado aunque aún no está activo.
root@debian:/etc/libvirt/qemu/networks# virsh net-define br0.xml
Network host-bridge defined from br0.xml
root@debian:/etc/libvirt/qemu/networks# virsh net-list --all
Name State Autostart Persistent
------------------------------------------------------
default active yes yes
host-bridge inactive no yes
intra active yes yes
red2 active yes yes
vagrant-libvirt inactive no yes
La iniciamos
root@debian:/etc/libvirt/qemu/networks# virsh net-list --all
Name State Autostart Persistent
------------------------------------------------------
default active yes yes
host-bridge active no yes
intra active yes yes
red2 active yes yes
vagrant-libvirt inactive no yes
Comprobamos la ip de nuestro br0 en la maquina anfitriona
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:d8:61:07:23:7e brd ff:ff:ff:ff:ff:ff
inet 192.168.100.124/24 brd 192.168.100.255 scope global dynamic br0
valid_lft 3498sec preferred_lft 3498sec
inet6 fe80::2d8:61ff:fe07:237e/64 scope link
valid_lft forever preferred_lft forever
Apagamos la máquina2
virsh desroy maquina2
Editamos el fichero de xml de maquina2
virsh edit maquina2
Cambiamos la red que está puesta en este caso intra por host-bridge que es nuestro br0
virsh edit maquina2
Le cambiamos el nombre a la red
<interface type='network'>
<mac address='52:54:00:23:c8:a9'/>
<source network='host-bridge'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
Encendemos la máquina y comprobamos que coge la dirección ip modo puente
debian@debian-kvm:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:23:c8:a9 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.62/24 brd 192.168.100.255 scope global dynamic enp0s3
valid_lft 3566sec preferred_lft 3566sec
inet6 fe80::5054:ff:fe23:c8a9/64 scope link
valid_lft forever preferred_lft forever
17. Comprueba que el servicio PostgreSQL funciona accediendo a través del bridge exterior.
Antes de comprobar todo esto habría que hacer un checkeo de que todo está en funcionamiento
- Comprobar que está montado el disco
- Reiniciar el servicio de postgres
- Comprobar que postgres está funcionando
Una vez hecho eso en la máquina anfitriona accedemos a la base de datos con la dirección ip que ha adoptado ahora del puente.
celiagm@debian:~$ psql -h 192.168.100.62 -U celia -W -d prueba
Contraseña:
psql (11.11 (Debian 11.11-0+deb10u1))
conexión SSL (protocolo: TLSv1.3, cifrado: TLS_AES_256_GCM_SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.
prueba=> \d
Listado de relaciones
Esquema | Nombre | Tipo | Dueño
---------+--------------+-------+-------
public | departamento | tabla | celia
(1 fila)
prueba=>
18. Apaga maquina1 y aumenta la RAM de maquina2 a 2 GiB.
Apagamos la maquina 1
virsh destroy maquina1
root@debian:/home/celiagm# virsh list --all
Id Name State
-----------------------------------
5 maquina2 running
- buster-base shut off
- compilar_default shut off
- dominio2 shut off
- maquina1 shut off
Apagamos la máquina2
Aumentamos la RAM de máquina2 a 2GiB
1 Gb _> 1048576
2 Gb _> 2097152
virsh setmem maquina2 2097152 --config
virsh setmaxmem maquina2 2097152 --config
Vemos que ha cambiado el fichero xml
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
Comprobamos la RAM una vez encendida la máquina
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.
Handle 0x1000, DMI type 16, 23 bytes
Physical Memory Array
Location: Other
Use: System Memory
Error Correction Type: Multi-bit ECC
Maximum Capacity: 2 GB
Error Information Handle: Not Provided
Number Of Devices: 1
Handle 0x1100, DMI type 17, 40 bytes
Memory Device
Array Handle: 0x1000
Error Information Handle: Not Provided
Total Width: Unknown
Data Width: Unknown
Size: 2048 MB
Form Factor: DIMM
Set: None
Locator: DIMM 0
Bank Locator: Not Specified
Type: RAM
Type Detail: Other
Speed: Unknown
Manufacturer: QEMU
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified
Rank: Unknown
Configured Memory Speed: Unknown
Minimum Voltage: Unknown
Maximum Voltage: Unknown
Configured Voltage: Unknown