jueves, 25 de abril de 2013

Administración de usuarios con FreeIPA

Introducción

  IPA es una solución efectiva para resolver la problematica de centralización de usuarios, accesos y privilegios.
  IPA proviene de Identity,Policy Audit. Lamentablemente la parte de auditoria no esta implementada al momento de escribir esta nota.
  La solución consiste de los siguientes productos:

  • Kerberos,
  • DNS,
  • LDAP
  • NTP
 Se podría llegar a pensar en FreeIPA como un Active Directory para el mundo Unix ya que este se puede usar para autenticar Linux, Solaris, AIX y HP-UX
 La gestión de usuarios se puede hacer sencillamente mediante una interfase web, igualmente tambien provee una CLI. 
 

Instalación y configuración.


Para instalar FreeIPA podemos apoyarnos en yum

# yum install ipa-server

El proceso de instalación selecionara las dependencias y luego de unos minutos tendremos el software instalado.
Una vez instalado corremos el proceso de configuración, este proceso es guiado y para lanzarlo ejecutamos el siguiente comando:

# ipa-server-install

A continuación se nos presentara la siguiente pantalla

The log file for this installation can be found in /var/log/ipaserver-install.log
==============================================================================
This program will set up the IPA Server.

This includes:
  * Configure a stand-alone CA (dogtag) for certificate management
  * Configure the Network Time Daemon (ntpd)
  * Create and configure an instance of Directory Server
  * Create and configure a Kerberos Key Distribution Center (KDC)
  * Configure Apache (httpd)

To accept the default shown in brackets, press the Enter key.
Enter the fully qualified domain name of the computer
on which you're setting up server software. Using the form
<hostname>.<domainname>
Example: master.example.com.


Server host name [vmcentos1.domain]:

The domain name has been determined based on the host name.

Please confirm the domain name [domain]:


The kerberos protocol requires a Realm name to be defined.
This is typically the domain name converted to uppercase.

Please provide a realm name [DOMAIN]:
 


Como se puede ver hasta aqui las preguntas de instalacion son basicamente sencillas, hostname y domino y generalmente las constestaremos por default.


Certain directory server operations require an administrative user.
This user is referred to as the Directory Manager and has full access
to the Directory for system management tasks and will be added to the
instance of directory server created for IPA.
The password must be at least 8 characters long.
 

Directory Manager password: Password (confirm):

Ahora tendremos que ingresar una password para el usuario Directory Manager, la cual tendremos que confirmar para pasar al siguiente paso

 
The IPA server requires an administrative user, named 'admin'.
This user is a regular system account used for IPA server administration.

IPA admin password: 

Password (confirm):
En este paso tendremos que configurar la password del usuario administrador de la solucion de IPA, nuevamente tendremos que escribir una password y confirmarla


The IPA Master Server will be configured with:
Hostname:      vmcentos1.domain
IP address:    192.168.122.10
Domain name:   domain
Realm name:    DOMAIN

Continue to configure the system with these values? [no]:




Una vez parametrizada la instalacion, nos pedira la confirmacion de los mismos para proseguir. Si los parametros son correctos le diremos que si a la pregunta, lo cual significa escribir yes en pantalla.

Ahora veremos en pantalla el log de progreso de la configuracion de los productos que componen IPA

The following operations may take some minutes to complete.
Please wait until the prompt is returned.

Configuring NTP daemon (ntpd)
  [1/4]: stopping ntpd
  [2/4]: writing configuration
  [3/4]: configuring ntpd to start on boot
  [4/4]: starting ntpd
Done configuring NTP daemon (ntpd).
Configuring directory server for the CA (pkids): Estimated time 30 seconds
  [1/3]: creating directory server user
  [2/3]: creating directory server instance
  [3/3]: restarting directory server
Done configuring directory server for the CA (pkids).
Configuring certificate server (pki-cad): Estimated time 3 minutes 30 seconds
  [1/21]: creating certificate server user
  [2/21]: creating pki-ca instance
  [3/21]: configuring certificate server instance
  [4/21]: disabling nonces
  [5/21]: creating CA agent PKCS#12 file in /root
  [6/21]: creating RA agent certificate database
  [7/21]: importing CA chain to RA certificate database
  [8/21]: fixing RA database permissions
  [9/21]: setting up signing cert profile
  [10/21]: set up CRL publishing
  [11/21]: set certificate subject base
  [12/21]: enabling Subject Key Identifier
  [13/21]: setting audit signing renewal to 2 years
  [14/21]: configuring certificate server to start on boot
  [15/21]: restarting certificate server
  [16/21]: requesting RA certificate from CA
  [17/21]: issuing RA agent certificate
  [18/21]: adding RA agent as a trusted user
  [19/21]: configure certificate renewals
  [20/21]: configure Server-Cert certificate renewal
  [21/21]: Configure HTTP to proxy connections
Done configuring certificate server (pki-cad).
Configuring directory server (dirsrv): Estimated time 1 minute
  [1/38]: creating directory server user
  [2/38]: creating directory server instance
  [3/38]: adding default schema
  [4/38]: enabling memberof plugin
  [5/38]: enabling winsync plugin
  [6/38]: configuring replication version plugin
  [7/38]: enabling IPA enrollment plugin
  [8/38]: enabling ldapi
  [9/38]: disabling betxn plugins
  [10/38]: configuring uniqueness plugin
  [11/38]: configuring uuid plugin
  [12/38]: configuring modrdn plugin
  [13/38]: enabling entryUSN plugin
  [14/38]: configuring lockout plugin
  [15/38]: creating indices
  [16/38]: enabling referential integrity plugin
  [17/38]: configuring ssl for ds instance
  [18/38]: configuring certmap.conf
  [19/38]: configure autobind for root
  [20/38]: configure new location for managed entries
  [21/38]: restarting directory server
  [22/38]: adding default layout
  [23/38]: adding delegation layout
  [24/38]: adding replication acis
  [25/38]: creating container for managed entries
  [26/38]: configuring user private groups
  [27/38]: configuring netgroups from hostgroups
  [28/38]: creating default Sudo bind user
  [29/38]: creating default Auto Member layout
  [30/38]: adding range check plugin
  [31/38]: creating default HBAC rule allow_all
  [32/38]: Upload CA cert to the directory
  [33/38]: initializing group membership
  [34/38]: adding master entry
  [35/38]: configuring Posix uid/gid generation
  [36/38]: enabling compatibility plugin
  [37/38]: tuning directory server
  [38/38]: configuring directory to start on boot
Done configuring directory server (dirsrv).
Configuring Kerberos KDC (krb5kdc): Estimated time 30 seconds
  [1/10]: adding sasl mappings to the directory
  [2/10]: adding kerberos container to the directory
  [3/10]: configuring KDC
  [4/10]: initialize kerberos container
  [5/10]: adding default ACIs
  [6/10]: creating a keytab for the directory
  [7/10]: creating a keytab for the machine
  [8/10]: adding the password extension to the directory
  [9/10]: starting the KDC
  [10/10]: configuring KDC to start on boot
Done configuring Kerberos KDC (krb5kdc).
Configuring kadmin
  [1/2]: starting kadmin
  [2/2]: configuring kadmin to start on boot
Done configuring kadmin.
Configuring ipa_memcached
  [1/2]: starting ipa_memcached
  [2/2]: configuring ipa_memcached to start on boot
Done configuring ipa_memcached.
Configuring the web interface (httpd): Estimated time 1 minute
  [1/13]: setting mod_nss port to 443
  [2/13]: setting mod_nss password file
  [3/13]: enabling mod_nss renegotiate
  [4/13]: adding URL rewriting rules
  [5/13]: configuring httpd
  [6/13]: setting up ssl
  [7/13]: setting up browser autoconfig
  [8/13]: publish CA cert
  [9/13]: creating a keytab for httpd
  [10/13]: clean up any existing httpd ccache
  [11/13]: configuring SELinux for httpd
  [12/13]: restarting httpd
  [13/13]: configuring httpd to start on boot
Done configuring the web interface (httpd).
Applying LDAP updates
Restarting the directory server
Restarting the KDC
Sample zone file for bind has been created in /tmp/sample.zone.AOnBNe.db
Restarting the web server
==============================================================================
Setup complete

Next steps:
    1. You must make sure these network ports are open:
        TCP Ports:
          * 80, 443: HTTP/HTTPS
          * 389, 636: LDAP/LDAPS
          * 88, 464: kerberos
        UDP Ports:
          * 88, 464: kerberos
          * 123: ntp

    2. You can now obtain a kerberos ticket using the command: 'kinit admin'
       This ticket will allow you to use the IPA tools (e.g., ipa user-add)
       and the web user interface.

Be sure to back up the CA certificate stored in /root/cacert.p12
This file is required to create replicas. The password for this
file is the Directory Manager password


En este punto revisaremos la salida del instalador y verificaremos que todo se haya configurado correctamente. Una vez revisado pasaremos a probar la conectividad del web server, para esto abrimos un browser con la URL https://<hostname o ip del server>:443



Agregamos como excepcion a nuestro server



Luego de aceptar las excepciones de seguridad, se nos presentara la pantalla inicial de login a IPA

Una vez logueado tendremos el siguiente menu de aplicacion


En este menu podremos elegir los tabs que queramos para generar usuarios, grupos, politicas de sudo, selinux y con mucha flexibilidad.
Como primer paso, vamos a generar un nuevo usuario haciendo click en +add


Una vez creado podemos editar los seteos o podemos hacerlo antes de crearlo haciendo click en Add and Edit




Aqui podemos editar lo siguiente
  • Informacion de usuario
    • Titulo,
    • Nombre, Apellido,
    • Display name,
    • Iniciales
  • Informacion de cuenta
    • uids, 
    • gids, 
    • home dir
  • Politicas de expiracion de password
  • Politicas de tickets kerberos
  • Informacion de contacto
    • Telefono
    • Email
    • Fax
    • Pager
    • Movil
  • Direccion postal
  • Informacion organizacional
    • Unidad organizacional
    • Gerente
  • Informacion miscelanea
 Incluso desde esta pantalla se puede resetear la password del usuario en cuestion.

Una vez dado de alta el usuario, procederemos a probar el login

# ssh hmartine@vmcentos1
hmartine@vmcentos1's password:
Password expired. Change your password now.
Last login: Thu Apr 25 14:10:13 2013 from 192.168.122.1
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user hmartine.
Current Password:
New password:
Retype new password:
Your password will expire in 90 day(s).
passwd: all authentication tokens updated successfully.
Connection to vmcentos1 closed.
[root@walkure ~]# 


Volvemos a ingresar al host nuevamente y vemos que no tenemos creado el home directory


# ssh hmartine@vmcentos1
hmartine@vmcentos1's password:
Your password will expire in 89 day(s).
Last login: Thu Apr 25 14:11:00 2013 from 192.168.122.1
Could not chdir to home directory /home/hmartine: No such file or directory
-sh-4.1$ id
uid=983000003(hmartine) gid=983000003(hmartine) groups=983000003(hmartine) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
-sh-4.1$ pwd
/



Esto se puede solucionar creandolo manualmente, no obstante hay un metodo para que se cree automaticamente mediante un modulo de PAM.

Podemos instalar el modulo via yum
 [root@vmCentos1 ~]# yum install oddjob-mkhomedir

Una vez instalado chequeamos si se configuro el autoarranque del servicio
[root@vmCentos1 ~]# chkconfig --list oddjobd
oddjobd 0:off 1:off 2:off 3:off 4:off 5:off 6:off


Vemos que no esta activado, pasaremos a configurar el arranque y levantaremos el servicio

[root@vmCentos1 ~]# chkconfig  oddjobd on
[root@vmCentos1 ~]# service oddjobd start
Starting oddjobd:                                          [  OK  ]

[root@vmCentos1 ~]# authconfig --enablemkhomedir --update
Stopping sssd:                                             [  OK  ]
Starting oddjobd:                                          [  OK  ]
[root@vmCentos1 ~]# service sssd start
Starting sssd:                                             [  OK  ]


Ahora crearemos un usuario mas, siguiendo el mismo procedimiento que antes, para probar el comportamiento del modulo

[root@walkure ~]# ssh test1@vmcentos1
test1@vmcentos1's password:
Password expired. Change your password now.
Creating home directory for test1.
Last login: Thu Apr 25 14:53:46 2013 from 192.168.122.1
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user test1.
Current Password:
New password:
Retype new password:
Your password will expire in 90 day(s).
passwd: all authentication tokens updated successfully.
Connection to vmcentos1 closed.
 

[root@walkure ~]# ssh test1@vmcentos1
test1@vmcentos1's password:
Your password will expire in 89 day(s).
Last login: Thu Apr 25 15:15:42 2013 from 192.168.122.1
-sh-4.1$ pwd
/home/test1












De esta manera los home dir's se crearan automaticamente cada vez que creemos el usuario.

miércoles, 24 de abril de 2013

Usos del comando tar



En muchas ocasiones en las cuales tenemos que copiar contenidos de filesystems, preservando permisos, links archivos ocultos, etc. Justamente podemos utilizar el comando tar para este caso y lo mejor es que podemos hacerlo sin la necesidad de generar un archivo .tar intermedio facilitandonos de esta forma la copia.


Supongamos que queremos copiar toda una estructura de directorios a otro lado, por ejemplo de un filesystem a otro nuevo, solo tendremos que hacer lo siguiente


# cd /source
# tar cf - * | ( cd /target; tar xvfp -)


Tambien podemos usar el comando tar para copiar de un host a otro mediante SSH

# tar cvzf - /foo | ssh@target_host "cat  > /foo.tar.gz

lunes, 15 de abril de 2013

Linux virtualización - KVM

KVM (Kernel-based Virtual Machine), es una solución de virtualización basada en QEMU para la arquitectura x86 que utiliza las extensiones de virtualización de hardware, ya sean AMD-V (svm) o las de Intel-VT (vmx).
Requisitos

Como deciamos en el parrafo anterior, KVM utiliza extensiones de hardware para poder funcionar, con lo cual este sera nuestro único requisito para la instalación. Por lo general cualquier CPU moderno soporta estas características. De todas maneras, para verificar si nuestra CPU esta soportada por KVM  solo tenemos que correr los siguientes comandos

cat /proc/cpuinfo |grep svm (en el caso de tener un micro AMD) o
cat /proc/cpuinfo |grep vmx (en caso de tener Intel)

En caso de no encontrar ninguna extensión de vitrtualización, chequear si son soportadas por el CPU en la pagina del fabricante del micro y en caso afirmativo corroborar en el BIOS que estén activas.

Instalación

La máquina en la que estoy armando este tutorial tiene instalado un CentOS 6.4 64bits, dos procesadores Intel i7 1.2GHz, 8GBs de RAM y LVM con el suficiente espacio libre como para crear nuevos LVs que usaremos para alojar las imágenes ISO y las VMs

yum install kvm python-virtinst libvirt libvirt-python virt-manager \
virt-viewer libguestfs-tools

Creamos un FS de 12GBs para las ISO de instalación

# lvcreate -L 12G vg_pegasus2 -n lvol8
# mkdir /ISOs
# mkfs.ext4 -m 1 /dev/vg_pegasus2/lvol8

Y agregamos al fstab el FS que creamos

/dev/mapper/vg_pegasus2-lvol8 /ISOs                    ext4    defaults        1 2

Montamos el filesystem
# mount /ISOs

Creamos un FS de 80GBs para contener las VMs
# lvcreate -L 80G vg_pegasus2 -n lvol9
# mkdir /VMs
# mkfs.ext4 -m 1 /dev/vg_pegasus2/lvol9

Al igual que en el caso anterior agregamos la entrada al fstab

/dev/mapper/vg_pegasus2-lvol8 /ISOs                    ext4    defaults        1 2

y para chequear que hayamos echo bien el procedimiento montamos el FS

# mount /VMs

Verificamos con df -h

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_pegasus2-lvol1
                      5.0G  439M  4.5G   9% /
tmpfs                 849M  444K  849M   1% /dev/shm
/dev/sda1             485M   73M  388M  16% /boot
/dev/mapper/vg_pegasus2-lvol2
                      194M   47M  137M  26% /home
/dev/mapper/vg_pegasus2-lvol7
                      2.0G   68M  1.9G   4% /opt
/dev/mapper/vg_pegasus2-lvol3
                     1008M   35M  923M   4% /tmp
/dev/mapper/vg_pegasus2-lvol4
                      7.9G  1.8G  5.7G  24% /usr
/dev/mapper/vg_pegasus2-lvol6
                      2.0G   68M  1.9G   4% /usr/local
/dev/mapper/vg_pegasus2-lvol5
                       16G  333M   15G   3% /var
/dev/mapper/vg_pegasus2-lvol8
                       12G  4.4G  7.4G  37% /ISOs
/dev/mapper/vg_pegasus2-lvol9
                       78M  5.6M   72M   8% /VMs


Vemos que los dos últimos FSs son los que creamos, en este caso se ve que copie algunas ISOs al /ISOs

# ls -l /ISOs/
total 4353336
drwx------. 2 root root      16384 Feb 28 04:11 lost+found
-rwxr-xr-x. 1 root root 3729028147 Feb 28 04:33 SL-63-x86_64-2012-08-02-Install-DVD.iso
-rwxr-xr-x. 1 root root  728760320 Feb 28 04:09 SL-63-x86_64-2012-08-24-LiveCD.iso


Ya teniendo el software instalado, las ISOs y el lugar donde ubicaremos las VMs pasamos a la parte de configuración y creado de las VMs

Primeros pasos con KVM
Una vez configurado verificamos con el comando virsh.

El virsh es la interfase que se utiliza para administrar los entornos virtuales este comando nos permite modificar, apagar, prender, sacar snapshots y clonar VMs entre otras cosas. En particular el flag list nos muestra la información acerca de las maquinas virtuales (o dominios).

# virsh -c qemu:///system list
Id Name State
----------------------------------------------------


Una vez revisado que la instalación inicial de KVM fue exitosa procederemos a genera una VM de prueba

virt-install --connect qemu:///system -n vmCentOS1 -r 1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel6 --disk path=/VMs/vmCentOS1-d1.dsk,size=12 -c /VMs/iso/CentOS-6.4-x86_64-bin-DVD1.iso --graphics vnc

Luego de ejecutar este comando nos encontraremos con la pantalla de instalacion de CentOS6, el template de instalacion que se realizara sera por default y se selecionaran los paquetes de server basico.


Ahora finalizada la instalación tendremos que rebootear la VM

Posterior al reboot, bootearemos por primera vez la VM

Luego de realizar la instalacion del CentOS, tendriamos la VM lista para utilizar

# virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------
 3     vmCentOS1                      running


Configuracion de consola serie

Para poder entrar por consola de texto al host y evitarnos usar VNC y un entorno gráfico, debemos modificar las opciones de booteo del kernel del guest y habilitar el acceso vía serie, para hacer esto debemos editar el archivo /etc/grub.conf

Dentro de este archivo debemos agregar en la linea

...
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_walkure-lvol1 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_walkure/lvol1 SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0
...

Para terminar la configuración se debe agregar un manejador de terminal para que atienda en el puerto serie virtual. Para hacer esto tenemos que agregar al /etc/inittab del guest la siguiente entrada
  
...
T0:S12345:respawn:/sbin/agetty ttyS0 115200
...

Para que el sistema tome la configuración realizada al inittab tendremos que recargarla usando el comando initcl
# initctl reload-configuration

Ahora se esta en condiciones de conectarse a la consola de la VM en modo texto
# virsh -c qemu:///system console 3
Connected to domain vmCentOS1
Escape character is ^]

CentOS release 6.4 (Final)
Kernel 2.6.32-358.el6.x86_64 on an x86_64

vmCentos1 login:
 

o

# virsh -c qemu:///system console vmCentOS1
Connected to domain vmCentOS1
Escape character is ^]

CentOS release 6.4 (Final)
Kernel 2.6.32-358.el6.x86_64 on an x86_64

vmCentos1 login:


Administracion de VMs

Apagado

Podemos apagar una VM desde nuestro host corriendo
# virsh -c qemu:///system shutdown 3
Domain 3 is being shutdown

Este comando baja la VM en forma ordenada, desde la consola podemos observar como se bajan los servicios en la virtual
# virsh -c qemu:///system console 3
Connected to domain vmCentOS1
Escape character is ^]

vmCentos1 login:
CentOS release 6.4 (Final)
Kernel 2.6.32-358.el6.x86_64 on an x86_64

vmCentos1 login: Stopping certmonger: [  OK  ]
Stopping atd: [  OK  ]
Stopping cups: [  OK  ]
Stopping abrt daemon: [  OK  ]
Stopping sshd: [  OK  ]
Shutting down postfix: [  OK  ]
Stopping mcelog
Stopping crond: [  OK  ]
Stopping automount: [  OK  ]
Stopping acpi daemon: [  OK  ]
Stopping HAL daemon: [  OK  ]
Stopping block device availability: Deactivating block devices:
  [SKIP]: unmount of vg_vmcentos1-lv_swap (dm-1) mounted on [SWAP]
  [SKIP]: unmount of vg_vmcentos1-lv_root (dm-0) mounted on /
[  OK  ]
Stopping system message bus: [  OK  ]
Stopping rpcbind: [  OK  ]
Stopping auditd: [  OK  ]
Shutting down system logger: [  OK  ]
Shutting down loopback interface:  [  OK  ]
ip6tables: Flushing firewall rules: [  OK  ]
ip6tables: Setting chains to policy ACCEPT: filter [  OK  ]
ip6tables: Unloading modules: [  OK  ]
iptables: Flushing firewall rules: [  OK  ]
iptables: Setting chains to policy ACCEPT: filter [  OK  ]
iptables: Unloading modules: [  OK  ]
Stopping monitoring for VG vg_vmcentos1:   2 logical volume(s) in volume group "vg_vmcentos1" unmonitored
[  OK  ]
Sending all processes the TERM signal... [  OK  ]
Sending all processes the KILL signal... [  OK  ]
Saving random seed:  [  OK  ]
Syncing hardware clock to system time [  OK  ]
Turning off swap:  [  OK  ]
Turning off quotas:  [  OK  ]
Unmounting pipe file systems:  [  OK  ]
Unmounting file systems:  [  OK  ]
init: Re-executing /sbin/init
Halting system...
Power down.


Podemos verificar el estado de las VMs con el comando virsh -c qemu:///system list --all es importante especificar en este caso el flag --all ya que si lo omitimos no se listara la maquina

# virsh -c qemu:///system list --all
 Id    Name                           State
----------------------------------------------------
 -     vmCentOS1                      shut off


Prendido

Si quisieramos, levantar la maquina que hemos apagado, 

# virsh -c qemu:///system start vmCentOS1

Podemos borrar una VM con corriendo los siguientes comandos

# virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------
 3     vmCentOS1                      running


# virsh destroy vmCentOS1
Domain vmCentOS1 destroyed


# virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------

# virsh undefine vmCentOS1
Domain vmCentOS1 has been undefined


Clonado

Si la VM esta prendida primero debemos apagarla ya que si no la apagamos al querer clonarla nos dara el siguiente error

#  virt-clone --connect=qemu:///system -o vmCentOS1 -n vmCentOS2 -f /VMs/vmCentOS2.img
ERROR    Domain with devices to clone must be paused or shutoff.

Con lo cual como habiamos dicho debemos apagar la VM primero con el comando

# virsh -c qemu:///system shutdown vmCentOS1Domain vmCentOS1 is being shutdown

Verificamos que la operacion haya sido exitosa

# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     vmCentOS1                      shut off


Para comenzar el clonado corremos 

#  virt-clone --connect=qemu:///system -o vmCentOS1 -n vmCentOS2 -f /VMs/vmCentOS2.img
Cloning vmCentOS1-d1.dsk                                              56% [=================================                          ] 182 MB/s | 6.7 GB     00:29 ETA


La opcion -o indica la maquina origen, la maquina a la cual vamos a clonar, -n especifica el nombre de la nueva VM, -f es el full path al archivo de la nueva VM.

Al cabo de unos minutos la operacion terminara exitosamente con el siguiente mensaje

Clone 'vmCentOS2' created successfully.

Para verificar el estado de ambas maquinas corremos un virsh list --all

# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     vmCentOS1                      shut off
 -     vmCentOS2                      shut off
 

Para evitar problemas de red, nombres e ips duplicadas es conviente bootear la maquina en modo rescue o hacer un loopback device, en este caso como la VM esta creada con LVM vamos a utilizar el primer metodo

# virt-rescue vmCentOS2

Google, Inc.
Serial Graphics Adapter 12/07/11
SGABIOS $Id: sgabios.S 8 2010-04-22 00:03:40Z nlaredo $ (mockbuild@c6b18n1.dev.centos.org) Wed Dec  7 17:04:47 UTC 2011

.....
mdadm: No arrays found in config file or automatically
[    2.190404] device-mapper: uevent: version 1.0.3
[    2.191725] device-mapper: ioctl: 4.23.6-ioctl (2012-07-25) initialised: dm-devel@redhat.com
  Reading all physical volumes.  This may take a while...
  Found volume group "vg_vmcentos1" using metadata type lvm2
  2 logical volume(s) in volume group "vg_vmcentos1" now active

------------------------------------------------------------

Welcome to virt-rescue, the libguestfs rescue shell.

Note: The contents of / are the rescue appliance.
You have to mount the guest's partitions under /sysroot
before you can examine them.

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
><rescue>


Ahora necesitamos saber como esta compuesto el layout de LVM con lo cual corremos el comando lvs

><rescue> lvs
  LV      VG           Attr      LSize Pool Origin Data%  Move Log Cpy%Sync Convert
  lv_root vg_vmcentos1 -wi-a---- 9.54g                                            
  lv_swap vg_vmcentos1 -wi-a---- 1.97g     


Para montar el root FS tenemos que hacer lo siguiente

><rescue> mount /dev/vg_vmcentos1/lv_root /sysroot
[   99.953289] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts:



Una vez montado realizamos las operaciones que necesitamos, en este caso vamos a borrar la configuracion de los devices del host original

><rescue> rm /sysroot/etc/udev/rules.d/70-persistent-net.rules 

Ahora en el proximo booteo la maquina levantara con la interfaz correcta.
Como la VM original estaba configurada con DHCP, no es necesario cambiar la IP.


Modificacion de la VM

Agregado de disco

 Para agregarle un vdisk al dominio virtual primero debemos crear el vdisk. En este caso el vdisk lo armamos con formato raw


# qemu-img create -f raw shared.raw 5G
Formatting 'shared.raw', fmt=raw size=5368709120



Ahora para agregarlo a nuestra VM lo hacemos desde la interface de virsh 


#virsh 
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit


virsh # attach-disk vmCentOS1 /VMs/shared.raw vdb --configure
Disk attached successfully


Desde la VM podemos ver el nuevo disco con el comando fdisk -l

# fdisk -l
...
Disk /dev/vdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 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: 0x00000000


Ahora tenemos el disco listo para usar

Remocion de disco de la VM

Una vez que desmontamos, el filesystem, exportado el VG, en caso de estar usandolo, ya estariamos en condiciones de poder remover el vdisk de la VM.

# virsh detach-disk vmCentOS2 vdb
Disk detached successfully




Configuracion de red

La red por defecto que tendremos una vez instalado el KVM se llama justamente default, para ver la configuracion de esta correremos los sifguientes comandos,

virsh # net-list
Name                 State      Autostart     Persistent
--------------------------------------------------
default              active     yes           yes




De esta forma sabremos que la unica red definida es la default

Para obtener mas informacion acerca de la configuracion de la red lo mejor es correr un net-edit

virsh # net-edit default

Una vez que corremos el comando, nos aparece una pantalla del editor vi

<network>
  <name>default</name>
  <uuid>1cc2cd6d-ffa9-44cd-9c59-d04a455a4c4a</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:4C:C3:89'/>
  <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> 


Ahi podemos ver como esta configurada la red, el virtual switch, el modo en el cual trabaja, tenemos un DHCP y el rango de direcciones IP con el que trabaja

Si quisieramos asociar una IP a una MAC address, tendremos que hacer un net-edit y agregar la siguientes lineas que figuran en negrita

<network>
  <name>default</name>
  <uuid>1cc2cd6d-ffa9-44cd-9c59-d04a455a4c4a</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:4C:C3:89'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
      <host mac='52:54:00:58:26:37' name='vmCentOS1.domain' ip='192.168.122.10' />
      <host mac='52:54:00:1A:37:FC' name='vmCentOS2.domain' ip='192.168.122.11' />

    </dhcp>
  </ip>
</network>

Luego para que el KVM tome la configuracion que establecimos haremos lo siguiente en el guest
# ps -ef |grep dnsmaq |grep -v grep
nobody    2715     1  0 08:41 ?        00:00:00 /usr/sbin/dnsmasq --strict-order --local=// --domain-needed --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --bind-interfaces --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override --dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile --addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
 

# kill -HUP 2715

El kill se lo damos al pid del proceso dnsmasq para que este recarge la configuracion. En el cliente hacemos un release de la IP y pediremos otra.
 
Snapshots

Para poder utilizar esta caracteristica el formato de la imagen tiene que ser qcow2, dado que el formato raw no lo soporta. Como las VMs que hemos creado son de tipo raw (que es el default) tendremos que convertirlas a qcow2 para poder utilizar este feature.


# qemu-img convert -O qcow2 vmCentOS1-d1.dsk vmCentOS1-d1.qcow2

Donde -O indica el formato de salida vmCentOS1-d1.dsk es el file original donde reside la VM en formato raw y vmCentOS1-d1.qcow2 es el archivo de salida.
Luego de unos minutos tendremos el nuevo archivo de salida.
# ls -ltr
total 7062000
drwx------. 2 root root       16384 Apr 12 20:07 lost+found
drwxr-xr-x. 2 root root        4096 Apr 15 13:55 iso
-rwxr-xr-x  1 qemu qemu 12884901888 Apr 17 08:08 vmCentOS2.img
-rwxr-xr-x  1 root root 12884901888 Apr 17 10:01 vmCentOS1-d1.dsk
-rw-r--r--  1 qemu qemu  2349793792 Apr 17 13:55 vmCentOS1-d1.qcow2


Paso siguiente sera borrar la definicion del vmCentOS1 e importar el nuevo contenedor.

# virsh undefine vmCentOS1
Domain vmCentOS1 has been undefined
# virt-install --connect qemu:///system -n vmCentOS1 -r 1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel6 --disk path=/VMs/vmCentOS1-d1.qcow2,device=disk,format=qcow2 --graphics vnc --import


Chequeamos si la maquina levanto


# virsh undefine vmCentOS1
Domain vmCentOS1 has been undefined


Ahora estamos en condicion de poder tomar un snapshot del dominio vmCentOS1

viernes, 15 de febrero de 2013

Seteos de semáforos en linux



¿Que son los semáforos?


Los semáforos son mecanismos de comunicación inter-proceso que usa el sistema operativo para regular accesos a regiones criticas de código y recursos.
Al ser mecanismos que provee el kernel de Linux, para tunearlos es necesario modificar parámetros de kernel.

Configuración


Para ver como esta configurado actualmente el sistema y obtener una breve descripción de que es cada seteo podemos ejecutar el siguiente comando

[root@myserver ~]# ipcs -ls

------ Semaphore Limits --------

max number of arrays = 128

max semaphores per array = 250

max semaphores system wide = 32000

max ops per semop call = 32

semaphore max value = 32767

 

Los parámetros de kernel se configuran con el comando sysctl

[root@myserver~]# sysctl -a |grep sem

kernel.sem = 250 32000 32 128
 

Para ampliar o modificar los seteos actuales tenemos que editar el archivo de configuración /etc/sysctl.conf y establecer la siguiente linea (o reemplazar la existente)

kernel.sem = 250 256000 32 1024

Para que el sistema haga efectivo el cambio debemos correr

sysctl -p

jueves, 16 de agosto de 2012

Usando sudo

Sudo - Descripción de la herramienta

Es una utilidad GNU muy versátil que permite a un usuario común (sin privilegios)  correr comandos como si fuera root u otro usuario.
La configuración de sudo se guarda en /etc/sudores y este archivo se modifica mediante el comando visudo. Podemos invocar a este comando ya sea como root o mediante sudo visudo

[hmartine@infraUX ~]$ sudo /usr/sbin/visudo
[sudo] password for hmartine:

Para listar los contenidos del sudoers sin comentarios, ni blancos para poder visualizarlo mas facil corremos el comando que vemos abajo

[root@infraUX ~]# cat /etc/sudoers |grep -v "^#" |grep -v "^$"
User_Alias ADMINS = hmartine, dmelo
root    ALL=(ALL)      ALL
ADMINS  ALL=(ALL)      ALL


En el ejemplo de arriba se creo un alias, el cual funciona como un contenedor al que se le asignaron los usuarios hmartine y dmelo. Luego tanto al usuario root como al grupo ADMINS se les otorga permisos para que ejecuten desde cualquier terminal, como cualquier usuario cualquier comando.

Para poder ver que comandos puedo correr con mi usuario debo correr el comando sudo -l



[hmartine@infraUX ~]$ sudo -l
[sudo] password for hmartine:
Matching Defaults entries for hmartine on this host:
    requiretty, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC
    KDEDIR LS_COLORS MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE
    LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME
    LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS
    _XKB_CHARSET XAUTHORITY"

Runas and Command-specific defaults for hmartine:


User hmartine may run the following commands on this host:
    (ALL) ALL

Una forma mas segura de usar sudo es explicitar específicamente los comandos que queremos usar.


La ventaja principal de usar sudo es la de tener trazabilidad y control acerca de los comandos que se ejecutan como root.