jueves, 31 de diciembre de 2009

Montar partición de dentro de un archivo imagen

kpartx es la herramienta que crea el apartir de la tabla de particiones un mapa del dipositivo. Suponemos que tenemos una imagen de disco .img que contiene varias particiones y queremos montar una o varias de ellas. kpartx mapeará cada partición a un dispositivo loop bajo /dev/mapper y permitirá montar el dispositivo loop a un directorio local.

Mapeo de una imagen:

# kpartx -a /foo/bar/disk.img

Checking que dispositivos loop se usaron para montar la partición:

# kpartx -l /foo/bar/disk.img
loop1p1 : 0 8177022 /dev/loop1 63

La Imagen de disco tiene un partición y esta mapeada en /dev/loop1p1. Ahora podemos montar la partición:

# mount /dev/mapper/loop1p1 /mnt/img

Una vez terminado, podemos desmontar y remover el mapeo del dispositivo:

# umount /mnt/img
# kpartx -d /foo/bar/disk.img
loop deleted : /dev/loop1

sábado, 12 de diciembre de 2009

Publicar codigo en Blogger

En Blogger:
Ir a Personaliza --> Diseño --> Edicion de HTML

Buscar la línea:
<div class="codeview">
]]></b:skin>
</div>

Y arriba de esta colocar:

.codeview {
font-family: Arial, Helvetica, sans-serif;
color: #001f49;
margin : 15px 35px 15px 15px;
padding : 10px;
clear : both;
list-style-type : none;
border-top : 2px solid #cccccc;
border-right : 2px solid #cccccc;
border-bottom : 2px solid #cccccc;
border-left : 2px solid #cccccc;
background : #f9f9f9 no-repeat right bottom;
background-color: #FFFFFF;
}
.codeview li {
font-size : 13px;
line-height : 24px;
font-family : "Courier New", "MS Sans Serif", sans-serif, serif;
color : #333333;
font-weight : normal;
margin : 0;
padding : 0;
}

Listo, para publicar codigo, en la entrada nueva del blog:
<div class="codeview">
Insertar el codigo aquí.
</div>

Instalar Xen en Ubuntu 8.04 LST

Pasos previos
Nos loguemos como root:

sudo su

Es buena idea deshabilitar AppArmor:(si existe)

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove

Instalando Xen

Para Instalar Xen lo único que debemos hacer es ejecutar el comando:

aptitude install ubuntu-xen-server
mv /lib/tls /lib/tls.disabled

vim /etc/modules
[...]
loop max_loop=64
[...]

ls -l /boot/

total 36052
-rw-r--r-- 1 root root 420395 2009-04-01 21:41 abi-2.6.24-23-server
-rw-r--r-- 1 root root 74171 2009-04-01 21:41 config-2.6.24-23-server
-rw-r--r-- 1 root root 82847 2009-04-15 14:57 config-2.6.24-24-xen
drwxr-xr-x 2 root root 4096 2009-06-17 12:55 grub
-rw-r--r-- 1 root root 7496287 2009-06-17 12:42 initrd.img-2.6.24-23-server
-rw-r--r-- 1 root root 7218067 2009-06-16 15:39 initrd.img-2.6.24-23-server.bak
-rw-r--r-- 1 root root 7439996 2009-06-17 12:49 initrd.img-2.6.24-24-xen
-rw-r--r-- 1 root root 7439756 2009-06-17 12:49 initrd.img-2.6.24-24-xen.bak
-rw-r--r-- 1 root root 103204 2007-09-28 08:03 memtest86+.bin
-rw-r--r-- 1 root root 1163432 2009-04-01 21:41 System.map-2.6.24-23-server
-rw-r--r-- 1 root root 1128034 2009-04-15 14:57 System.map-2.6.24-24-xen
-rw-r--r-- 1 root root 1930136 2009-04-01 21:41 vmlinuz-2.6.24-23-server
-rw-r--r-- 1 root root 1894234 2009-04-15 14:57 vmlinuz-2.6.24-24-xen
-rw-r--r-- 1 root root 401328 2009-02-21 01:04 xen-3.2.gz

ls -l /usr/lib/xen-tools

total 36
drwxr-xr-x 2 root root 4096 2009-06-17 12:49 centos-4.d
drwxr-xr-x 2 root root 4096 2009-06-17 12:49 centos-5.d
-rwxr-xr-x 1 root root 4409 2008-04-05 22:12 common.sh
drwxr-xr-x 2 root root 4096 2009-06-17 12:49 dapper.d
drwxr-xr-x 2 root root 4096 2009-06-17 12:49 debian.d
drwxr-xr-x 2 root root 4096 2009-06-17 12:49 edgy.d
lrwxrwxrwx 1 root root 8 2009-06-17 12:49 etch.d -> debian.d
lrwxrwxrwx 1 root root 15 2009-06-17 12:49 fedora-core-4.d -> fedora-core-6.d
lrwxrwxrwx 1 root root 15 2009-06-17 12:49 fedora-core-5.d -> fedora-core-6.d
drwxr-xr-x 2 root root 4096 2009-06-17 12:49 fedora-core-6.d
lrwxrwxrwx 1 root root 15 2009-06-17 12:49 fedora-core-7.d -> fedora-core-6.d
lrwxrwxrwx 1 root root 6 2009-06-17 12:49 feisty.d -> edgy.d
drwxr-xr-x 2 root root 4096 2009-06-17 12:49 gentoo.d
lrwxrwxrwx 1 root root 6 2009-06-17 12:49 gutsy.d -> edgy.d
lrwxrwxrwx 1 root root 6 2009-06-17 12:49 hardy.d -> edgy.d
lrwxrwxrwx 1 root root 8 2009-06-17 12:49 lenny.d -> debian.d
lrwxrwxrwx 1 root root 8 2009-06-17 12:49 sarge.d -> debian.d
lrwxrwxrwx 1 root root 8 2009-06-17 12:49 sid.d -> debian.d


Como vemos podemos instalar cualquiera de las siguientes distribuciones:

* Debian: Lenny, Sid, Etch, Sarge
* Ubuntu: Dapper Drake, Edgy Eft, Feisty Fawn, Gutsy Gibbon, Hardy Heron
* CentOS 4, CentOS 5
* Fedora Core 4, 5, 6, Fedora 7
* Gentoo

Para mantener un orden vamos a guardar las maquinas virtuales en el directorio /home/xen:

mkdir /home/xen


Utilizaremos xen-tools para crear maquinas virtuales. El paquete xen-tools se instala junto con el paquete ubuntu-xen-server package

Ahora editamos el fichero /etc/xen-tools/xen-tools.conf. Este fichero contiene los valores por defecto con los que se creará la maquina virtual, a mones que en su momento especifiquemos un valor diferente, es decir, funciona como una plantilla.

dir = /home/xen
use-ide = 1
install-method = debootstrap
size = 4Gb # Disk image size.
memory = 512Mb # Memory size
swap = 256Mb # Swap size
# noswap = 1 # Don't use swap at all for the new system.
fs = ext3 # use the EXT3 filesystem for the disk image.
dist = hardy # Default distribution to install.
image = sparse # Specify sparse vs. full disk images.
gateway =
netmask =
passwd = 1
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
mirror = http://archive.ubuntu.com/ubuntu/
ext3_options = noatime,nodiratime,errors=remount-ro
ext2_options = noatime,nodiratime,errors=remount-ro
xfs_options = defaults
reiser_options = defaults
disk_device = xvda #default


Ahora reiniciamos el sistema:

init 6


Si el sistema reinicia sin problemas, todo anduvo bien.
Ejecutamos:

uname -r

y nuestro nuevo Xen kernel debe mostrar algo así:

2.6.24-24-xen


Network Bridge a medida
La solucion con Puentes/bridge's es la mas comoda segun nuestro analisis.
consta de la interfaz fisica en si un puente a ella, y luego varias vif asociadas a la anterior .

ej: eth1 ---->peth1----->bridge_eth1{vif1 vif2 vif3}

Xen trae consigo las herramientas necesarias [lease scripts en bash] para poder crear puentes rapidamente. por esto, solo hay q tener en claro el numero de vif, la interfaz y el nombre q le deseamos dar dar al bridge. entonces:

vifnum=1 netdev=eth1 bridge=lan

este anterior, seria el argumento del script. Ya que esta dentro de los procesos de arranque de Xen es necesario colocarlo dentro del mismo para que funcione.

llamaremos al script "redes", [el que colocamos en xend-config.sxp para que sea invocado al momento del arranque de xen debe tener permisos de ejecucion]

el contenido del script seria el siguiente:

#!/bin/sh
dir=$(dirname "$0")
echo "$dir"
"$dir/network-bridge" "$1" vifnum=1 netdev=eth1 bridge=lan
ifconfig lan up
"$dir/network-bridge" "$1" vifnum=2 netdev=eth2 bridge=wan
ifconfig wan up


es bueno aclarar que los ifconfig***** se los coloca por precaucion ya que en ubuntu no suele funcionar el punte si no esta bringed up la interfaz.

Otro detalle problematico en ubuntu es q en algunos casos no suele funcionar bien el bridge.[perdida de paquetes] tomar la precaucion de corroborar si mii-tool pethx alerta un "link ok" solo. de ser este el caso, realizar ifdown/ifup a la interface hasta que mii-tool alerte "negotiated 100baseTx-FD flow-control, link ok"



Crear un Guest


xen-create-image --hostname NOMBRE --ip=


En Ubuntu debemos editar el archivo de configuración de la maquina virtual para que reconozca el los discos virtuales.

Cambiamos 'file:' por 'tap:aio:'

vim /etc/xen/NOMBRE.cfg
[...]
#
# Disk device(s).
#
root = '/dev/xvda2 ro'
disk = [
'tap:aio:/home/xen/domains/NOMBRE/swap.img,xvda1,w',
'tap:aio:/home/xen/domains/NOMBRE/disk.img,xvda2,w',
]
[...]


Administrar Maquinas Virtuales en XEN

xm create NOMBRE # Arrancar VM
xm create NOMBRE -c # Arrancar VM e ingresar en consola de la VM
xm console NOMBRE # Ingresar en consola de la VM
xm list # Mostrar lista de VM activas
xm destroy NOMBRE # Detener VM
xm top # ver el estado activo de cada equipo
Dentro de la maquina virtual si ingresamos con xm create NOMBRE.cfg -c para salirnos de la consola debemos presionar ctrl+5 y volveremos a la consola de la que partimos.

GIT y GITOSIS en Ubuntu 8.04 LST

1.Installar GIT

Primero instalamos los paquetes para que funcione git y ademas instalamos gitosis que nos permitira trabajar en un entorno de desarrollo multiusuario.

sudo su
cd /usr/src
aptitude install git git-clone
git clone git://eagain.net/gitosis.git
cd gitosis
python setup.py install


Nota: Si hay error con python se dede:
aptitude install python-setuptools


Creamos una usuario para git, en cuyo home tendremos los proyectos de desarrollo.

adduser --system \
--shell /bin/sh \
--gecos 'git version control' \
--group \
--disabled-password \
--home /home/git \
git


2.Habilitar llaves ssh para el acceso.

El usuario/administrador que desee poder acceder a GIT debe generar una clave pública.
Desde la línea de comandos debe ejecutar:
ssh-keygen -t rsa

Ahora se debe copiar la clave publica contenida en el archivo id_rsa.pub al servidor que contiene GIT.
Ejemplo:
scp $HOME/.ssh/id_rsa.pub usuario@server:/home/usuario/id_rsa.pub


Ahora en el server debemos hacer que gitosis agregue la clave publica del usuario, para darle permiso de acceso.

sudo -H -u git gitosis-init < path_to_file/id_rsa.pub
chmod 755 /home/git/repositories/gitosis-admin/hooks/post-update


3.Configurar GITOSIS desde la maquina del usuario/administrador

El usuario/administrador debe instalar GIT en su maquina.

sudo aptitude install git


El usuario/administrador debe crear una réplica del repositorio GIT que está en el servidor.

mkdir $HOME/proyectos
cd $HOME/proyectos
git clone git@:gitosis-admin.git
cd gitosis-admin


3.a. Archivo de configuración de GITOSIS

vim gitosis.conf

##Archivo de configuración de gitosis
[gitosis]
gitweb = yes #Habilitan el acceso web a todos
daemon = yes #los proyectos del repositorio


[group gitosis-admin]
writable = gitosis-admin #Nombre del proyecto, existe un directorio con el mismo nombre
members = user@worksation #Usuarios con acceso, debe existir el
#archivo user@worksation.pub en gitosis-admin/keydir/
[repo gitosis-admin]
gitweb = no #Acceso web al proyecto
daemon = no

## Agregamos los proyectos de desarrollo

[group develop]
writable = proyecto1 #Nombre del proyecto, existe un directorio con el mismo nombre
members = user@worksation #Usuarios con acceso, debe existir el
#archivo user@worksation.pub en gitosis-admin/keydir/
[repo proyecto1]
owner = El Administrador #Propietario del proyecto
description = Test repository #Descripción del proyecto


Siempre despues de editar el archivo gitosis.conf debemos subir los cambios al server.

Cambiar, add, commit, push !!!!

git add .
git commit -a -m "Añadido "
git push


4. Comenzando a trabajar con GIT y GITOSIS

El administrador crea un nuevo proyecto, todo se realiza desde el workstation y no en el server.

1. Agregar los cambios en el gitosis.conf
2. git add, commit, push !!!!

Ahora tenemos creado el proyecto, pero no existe el directorio, entonces:

mkdir proyecto1
cd proyecto1
git init
git remote add origin git@YOUR_SERVER_HOSTNAME:proyecto1.git


Creamos un archivo de pruebas

touch test
git add .
git commit -a -m "Creado el directorio del proyecto y un archivo de pruebas"
git push origin master:refs/heads/master

miércoles, 9 de diciembre de 2009

Usando GIT en el desarrollo

1.Uso de GIT

Comandos usuales:

git add archivo #Añadir archivo nuevo
git add . #Añadir todos los archivos
git commit -m "Mensaje" #Hace un commit, solo cuando hay cambios
git commit -a -m "Mensaje" #Hace commit si solo hemos modificado archivos existentes
git push #Sube las cosas al Repositorio GIT
git status #Muestra el estado actul del repositorio
git log #Nos da la historia del repositorio (ID_commit, Autor, Fecha)

git checkout -b #Crea un Branch nuevo (Vovemos haci atras)
git checkout #Para cambiar de branch
git branch #¿En que branch estoy?
git merge #Para unir el branch en el que estoy con otro

2. Trabajando con Ramas

En la imagen de ejemplo vemos el master branch y dos ramas (rama1 y rama2).

Como son los comandos que utilizamos para crear este "esquema"
Supongamos que estabamos trabajando en el master y decidimos volver a un commit del pasado, pues bien lo que haremos es:


#Averiguar el ID del commit al que queremos volver
git log
#Crear una rama nueva con el contenido que existia en el commit2
#"RAMA1"
git checkout -b rama1 id_commit2
git checkout rama1
#Ahora estamos en una nueva rama, donde la version es la que había en el commit2
#Podemos Simultanemente crear una segunda rama copia de la rama1
#"RAMA2"
git checkout rama2
#Ahora podemos trabajar en esta rama, cuanco tengamos una version definitiva podemos unirla a la master branch
#Primero nos movemos a la master branch
git checkout master
git merge rama2

viernes, 4 de diciembre de 2009

resolviendo gpg issues :P

el error es comun..
hacemos un aptitude update y nos encontramos algo como:

W: GPG error: http://ftp.de.debian.org stable/non-US Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F1D53D8C4F368D5D
W: You may want to run apt-get update to correct these problems

llamaremos PUBLICKEY=F1D53D8C4F368D5D

a resolverlo entonces.


gpg -vv --keyserver subkeys.pgp.net --recv $PUBLICKEY
gpg --export --armor $PUBLICKEY | apt-key add -

un issue q meencuentro seguido es q el server de llaves no tiene la llave, en debian tuve q usar wwwkeys.eu.pgp.net

done..

martes, 6 de octubre de 2009

Instalar GlusterFS (Parte 2)

Innstalación del CLiente

Instalar Dependencias
aptitude install sshfs build-essential flex bison byacc libdb4.6 libdb4.6-dev

Descargar, compilar e instlar Fuse
cd /tmp
wget ftp://ftp.zresearch.com/pub/gluster/glusterfs/fuse/fuse-2.7.4glfs11.tar.gz
tar -zxvf fuse-2.7.4glfs11.tar.gz
cd fuse-2.7.4glfs11
./configure
make && make install


Descargar, compilar e instlar GlusterFS
cd /tmp
wget http://ftp.gluster.com/pub/gluster/glusterfs/2.0/LATEST/glusterfs-2.0.7.tar.gz
tar xvfz glusterfs-2.0.7.tar.gz
cd glusterfs-2.0.7



Por defecto se instala en /usr/etc/glusterfs , vamos a modificar esto haciendo prefix='' en el archivo configure.
vim configure

server1:/tmp/glusterfs-2.0.7# ./configure



GlusterFS configure summary
===========================
FUSE client : yes
Infiniband verbs : no
epoll IO multiplex : yes
Berkeley-DB : yes
libglusterfsclient : yes
mod_glusterfs : no ()
argp-standalone : no

Instalamos:
make && make install
ldconfig
glusterfs --version


Ejemplo de configuración de GlusterFS (cliente)

vi /etc/glusterfs/glusterfs.vol


Ejemplo:

volume remote
type protocol/client
option transport-type tcp
option remote-host server1.example.com # can be IP or hostname
option remote-subvolume brick
end-volume

volume writebehind
type performance/write-behind
option window-size 4MB
subvolumes remote
end-volume

volume cache
type performance/io-cache
option cache-size 512MB
subvolumes writebehind
end-volume



glusterfs -f /etc/glusterfs/glusterfs.vol /mnt/glusterfs

o

mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/glusterfs


mount

df -h

vi /etc/fstab


[...]
/etc/glusterfs/glusterfs.vol /mnt/glusterfs glusterfs defaults 0 0

init 6

Instalar GlusterFS (Parte 1)

Innstalación del Server

Instalar Dependencias
aptitude install sshfs build-essential flex bison byacc libdb4.6 libdb4.6-dev

Descargar, compilar e instlar GlusterFS
cd /tmp
wget http://ftp.gluster.com/pub/gluster/glusterfs/2.0/LATEST/glusterfs-2.0.7.tar.gz
tar xvfz glusterfs-2.0.7.tar.gz
cd glusterfs-2.0.7

Por defecto se instala en /usr/etc/glusterfs , vamos a modificar esto haciendo prefix='' en el archivo configure.
vim configure

server1:/tmp/glusterfs-2.0.7# ./configure



GlusterFS configure summary
===========================
FUSE client : no
Infiniband verbs : no
epoll IO multiplex : yes
Berkeley-DB : yes
libglusterfsclient : yes
mod_glusterfs : no ()
argp-standalone : no

Instalamos:
make && make install
ldconfig
glusterfs --version


Ejemplo de configuración de GlusterFS (server)

vi /etc/glusterfs/glusterfsd.vol


Ejemplo:

volume posix
type storage/posix
option directory /data/export
end-volume

volume locks
type features/locks
option mandatory-locks on
subvolumes posix
end-volume

volume brick
type performance/io-threads
option thread-count 8
subvolumes locks
end-volume

volume server
type protocol/server
option transport-type tcp
option auth.addr.brick.allow 192.168.0.101 # Edit and add list of allowed clients comma separated IP addrs(names) here
subvolumes brick
end-volume



update-rc.d glusterfsd defaults

/etc/init.d/glusterfsd start

miércoles, 30 de septiembre de 2009

Modem Huawei 3G en Ubuntu

Instalar WVDIAL

sudo aptitude install wvdial

Conectar el Módem 3G. Editar el archivo wvdial.conf

sudo vim /etc/wvdial.conf

Ingresar las siguientes líneas para Movistar:

Phone = *99#
Username = internet
Password = internet

Luego, ejecutar:

sudo wvdialconf

Esto va a completar los datos del archivo wvdial.conf dejando algo como ésto (mi caso):

[Dialer movistar]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = Analog Modem
ISDN = 0
Phone = *99#
Modem = /dev/ttyUSB0
Username = internet
Password = internet
Baud = 460800

DNS Movistar:

nameserver 200.49.193.140
nameserver 200.49.206.140

Ejecutar:

sudo wvdial movistar

miércoles, 16 de septiembre de 2009

RAID1 en Ubuntu

1. Instalación
NOTA: REALIZAR DURANTE LA INSTALACIÓN DE UBUNTU

En el particionado de discos elegimos la opción "Manual". Debemos estar seguros de que ambos discos rígidos fueron encontrados por el instalador. (se recomiendan dos discos idénticos).
Segido eliminamos cualquier partición existente.

Seguido creamos 3 particiones en ambos discos (para el /,la swap y el /home).
Las particiones deben ser del tipo "physical volume for RAID" (0xFD en fdisk) en ves de "Ext3 journaling file system". Tambien la primera partición de ambos discos debe ser marcada como bootable.

Seguido seleccionamos "Configure software RAID".

Guardamos las modificaciones hechas en la tabla de particiones.

Creamos (3) MD devices (cada uno configurado como RAID1 con 2 activos y 0 hotspace en disco).

Seguido elegimo el la partición del disco físico que será incluida en la RAID1. Es importantr seleccionar dos particiones con idéntico tamaño en nuestro ejemplo md0=sda1+sbd1, md1=sda2+sdb2 y md2=sda3+sdb3.


Configuramos el sistema de ficheros y los puntos de montaje para cada dispositivo RAID. En nuestro ejemplo "RAID device #0" es ext3 montada en /, "RAID device #1" es swap y "RAID device #2" es ext3 montada en /home.

Finalmente seleccionamos "Done setting up the partitions" y "Yes" para escribir los cambios en la tabla de particiones. El resto de la instalación de Ubuntu es normal.

Despues de la instalación y el primer reboot, debemos instalar grub en el segundo disco en el Master Boot Record (MBR). Sin esto la PC no arrancara si el primer disco (/dev/sda) falla y/o es removido de la PC.


~$ sudo grub-install /dev/sda

~$ sudo grub
grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)
grub> quit


WARNING: Hay un bug que hace fallar el boot si uno de los discos físicos seteados en la RAID1 falta. El siguente patch corrige el bug.


~$ cd /tmp
~$ wget http://www.iki.fi/kuparine/comp/ubuntu/en/local.diff
~$ cd /usr/share/initramfs-tools/scripts
~$ sudo patch -p0 < /tmp/local.diff
~$ sudo update-initramfs -k all -u


Aplicar el patch cada vez que initramfs-tools package es actualizado o reinstalado. (con la actualizacion del kernel) .

2. Testeando


~$ grep /dev/md /etc/fstab
~$ df -h / /home
~$ cat /proc/mdstat
~$ sudo mdadm --query --detail /dev/md0
~$ sudo mdadm --query --detail /dev/md1
~$ sudo mdadm --query --detail /dev/md2


3. Recuperar luego del fallo de un disco.


~$ cat /proc/mdstat
~$ sudo mdadm --query --detail /dev/md0
~$ sudo mdadm --query --detail /dev/md1
~$ sudo mdadm --query --detail /dev/md2

~$ sudo mdadm --add /dev/md0 /dev/sdb1
~$ sudo mdadm --add /dev/md1 /dev/sdb2
~$ sudo mdadm --add /dev/md2 /dev/sdb3

cat /proc/mdstat

miércoles, 12 de agosto de 2009

Sparse image con dd :P

Aca muestro dos ejemplos con sus resultados para crear una imagen sparse.
(los ejemplos son mas que ilustrativos)

Ejemplo 1

$ dd if=/dev/zero of=disk.img bs=1 count=0 seek=10G
0+0 records in
0+0 records out
0 bytes (0 B) copied, 6,007e-06 s, 0,0 kB/s

$ du -sh --apparent-size disk.img
10G disk.img

$ du -sh disk.img
0 disk.img

Ejemplo 2

$ dd if=/dev/zero of=disk.img bs=1024k count=1 seek=10000
1+0 records in
1+0 records out
1048576 bytes (1,0 MB) copied, 0,00201991 s, 519 MB/s

$ du -sh --apparent-size disk.img
9,8G disk.img

$ du -sh disk.img
1,1M disk.img


En Xen debemos crear una partición con formato dentro de la imagen:


mkfs.ext3 -F disk.img


En kvm no hace falta porque al crear una maquina virtual nueva el instalador del SO que usemos va a crear su tabla de particiones.

lunes, 27 de julio de 2009

Usando GIT

1.Uso de GIT

Comandos usuales:

git add archivo #Añadir archivo nuevo
git add . #Añadir todos los archivos
git commit -m "Mensaje" #Hace un commit, solo cuando hay cambios
git commit -a -m "Mensaje" #Hace commit si solo hemos modificado archivos existentes
git push #Sube las cosas al Repositorio GIT
git status #Muestra el estado actul del repositorio
git log #Nos da la historia del repositorio (ID_commit, Autor, Fecha)

git checkout -b #Crea un Branch nuevo (Vovemos haci atras)
git checkout #Para cambiar de branch
git branch #¿En que branch estoy?
git merge #Para unir el branch en el que estoy con otro

2. Trabajando con Ramas

En la imagen de ejemplo vemos el master branch y dos ramas (rama1 y rama2).

Como son los comandos que utilizamos para crear este "esquema"
Supongamos que estabamos trabajando en el master y decidimos volver a un commit del pasado, pues bien lo que haremos es:


#Averiguar el ID del commit al que queremos volver
git log
#Crear una rama nueva con el contenido que existia en el commit2
#"RAMA1"
git checkout -b rama1 id_commit2
git checkout rama1
#Ahora estamos en una nueva rama, donde la version es la que había en el commit2
#Podemos Simultanemente crear una segunda rama copia de la rama1
#"RAMA2"
git checkout rama2
#Ahora podemos trabajar en esta rama, cuanco tengamos una version definitiva podemos unirla a la master branch
#Primero nos movemos a la master branch
git checkout master
git merge rama2

lunes, 20 de julio de 2009

Notificaciones de Sistema en el Mail (Parte 2)

La anterior entrada explicaba como habilitar el correo y hacer que Cron notifique sus actividades.
Ahora vamos a explicar como hacer par que los mensajes de syslog sean notificados en nuestra cuenta de correo.

Creamos un named-pipe

# mkdir /etc/syslog.pipes
# mknod /etc/syslog.pipes/criticalMessages p
# chmod 600 /etc/syslog.pipes/criticalMessages

Un named-pipe es un tipo de archivo que implementa un fifo stream, permitiendo a dos procesos diferentes halaer entre ellos Utilizaremos named-pipes para implementar mensajes en tiempo real entre syslog y nuestro mailer.

Editamos /etc/syslog.conf y añadimos la entrada para mensajes criticos

*.crit |/etc/syslog.pipes/criticalMessages


Enviar los mensajes por correo:
Creamos un script shell que lea los mensajes de la fifo y los envie por email:

/usr/bin/syslogMailer


#!/bin/bash

# syslogMailer: a script to read stdin and turn each line into an alert
# email typically this is used to read a named-pipe written to by syslog
#
# example usage: syslogMailer < /etc/syslog.pipes/criticalMessages
#

alertRecipient="fireman@example.com" # the mail recipient for alerts
TMOUT=1 # don't wait > 1 second for input

# process each line of input and produce an alert email
while read line
do
# remove any repeated messages
echo ${line} | grep "message repeated" > /dev/null 2>&1
if test $? -eq 1
then
# send the alert
echo "${line}" | mail -s "critical error on syslog" ${alertRecipient}
fi
done


chmod u+x /usr/bin/syslogMailer

Ejecutamos el script cada 5 minutos con una regla de cron como la siguiente:

# m h dom mon dow command
0-59/5 * * * * /usr/bin/syslogMailer < /etc/syslog.pipes/criticalMessages > /dev/null 2>&1

Alternativamente podemos ampliar el tipo de mensajes que deseasmos recibir en la cuenta de correos:

# Email root on crit, err, emerg
*.crit |/etc/syslog.pipes/logMessages
*.emerg |/etc/syslog.pipes/logMessages
*.err |/etc/syslog.pipes/logMessages
*.alert |/etc/syslog.pipes/logMessages
*.warn |/etc/syslog.pipes/logMessages

Nota: Crear un pipe con /etc/syslog.pipes/logMessages y modificar la entrada del Cron hacia /etc/syslog.pipes/logMessages

viernes, 17 de julio de 2009

Notificaciones de Sistema en el Mail

En esta nota voy a explicar como hacer para que cada vez que Cron realice algo, nos envie un mail a una cuenta de correos.

Requerimos de un MTA funcionando en nuestro servidor, y de algunas herramientas básica.


aptitud install sendmail mailutils


Despues devemos configurar sendmail o el MTA que usemos para que envie los correos a la direccion deseada:

vim /etc/mail/sendmail.conf

[...]
#------------------------------------------------------------------------------
# Cron Job Configuration
#
# CRON_MAILTO="root"; String cronjob output
# Recipient of *rare* cronjob output. Some cronjobs will be running
# under user `mail`, so any problems encountered would probably be missed
# so define a user who actually (hopefully) checks email now and again.
#
CRON_MAILTO="ladireccion@empresa.com";
#
# CRON_PARMS=""; String cron specific parmeters
# Cron parameters - applied *only* when sendmail queue running is done
# via a cronjob. Applied after QUEUE_PARMS and MISC_PARMS, and can
# therefore override them if need be.
#
CRON_PARMS="";
#
#------------------------------------------------------------------------------
[...]


Y editamos el archivo /etc/crontab


vim /etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="ladireccion@empresa.com"
# m h dom mon dow user command
[...]


Si creamos un nuevo Cron Jobs con el comando crontab -e debemos agregar al comienzo del archivo la linea MAILTO="ladireccion@empresa.com"


crontab -e

MAILTO="ladireccion@empresa.com"
# m h dom mon dow command
25 13 * * * /PATH_AL_SCRIPT/script.sh
[...]


Importante!!!
Sendmail puede dar un error de FQDN (Fully Qualified Domain Name) debido a que no encuentra el nombre en /etc/hosts
Corrección:

vim /etc/hosts

[...]
127.0.0.1 localhost.mydomain localhost server1 #<----- El orden Importa!!!!
[...]

lunes, 13 de julio de 2009

KVM en Ubuntu 8.04

Intoducción

Lo más importante es que el procesador tenga Virtual Technology, empezamos comprobando si el procesador esta incluido en la lista de CPUs que soportan HVM.

Verificamos si el procesador soporta el conjunto instrucciones de virtualización compatible con KVM. Buscamos la cadena vmx o svm en los flags del procesador.


cat /proc/cpuinfo | grep vmx # Intel
cat /proc/cpuinfo | grep svm # AMD


deberías obtener un resultado parecido a:
INTEL

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 pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr dca sse4_1 lahf_lm

AMD

flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_goodpni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch

Si no obtenemos la salida, KVM no funcionará.

Revisar que el BIOS de la maquina tenga habilitada la opción de Virtual Technology

Instalar KVM y otros.

Activar el repositorio Universe y actualizar el sistema.

sudo su
vim /etc/apt/source.list

[...]
deb http://ar.archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://ar.archive.ubuntu.com/ubuntu/ hardy universe
deb http://ar.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb-src http://ar.archive.ubuntu.com/ubuntu/ hardy-updates universe
[...]

aptitude update

aptitude upgrade

aptitude install qemu virt-manager libvirt-bin kvm

Añadimos los usuarios que queremos administren KVM al grupo kvm

adduser kvm


Reiniciamos el Equipo.

Probamos el comando kvm

kvm


Si aparece el siguiente mensaje, el procesador no soporta instrucciones de virtualización (aun habiendo aprobado el test de flags) o el BIOS tiene deshabilitado la opción de Virtualización.

open /dev/kvm: No such file or directory
Could not initialize KVM, will disable KVM support
Ubuntu does not support running KVM without hardware acceleration. Sorry.


Para ser ordenados creamos un directorio donde alojaremos nuestras maquinas virtuales.


mkdir /home/kvm
chown nobody.nogroup /home/kvm

KVM y Qemu se pueden manejar desde comand line (de ahora en adelante 'CL') o desde un entorno grafico.

Administrar KVM desde CL.

Creando un Guest.

aptitude install ubuntu-vm-builder

ubuntu-vm-builder kvm hardy \
--domain vmX \
--dest /home/kvm/vmX \
--arch i386 \
--hostname vmX \
--mem 256 \
--user bgx \
--pass elpass \
--ip \
--mask \
--net \
--bcast \
--gw \
--dns \
--mirror http://archive.localubuntumirror.net/ubuntu \
--components main,universe \
--addpkg vim openssh-server molly-guard etckeeper \
--libvirt qemu:///system ;

Usar una imagen de CD de la distribucion linux que mas nos guste.
Cambiamos la opción mirror:

mount -o loop path_to_image/imagen.iso /mnt

ubuntu-vm-builder --mirror /mnt


Otras herramientas con las que contamos son python-virtinst (virt-install, virt-clone, virt-viewer).

Ejemplo clonado de guest usando virt-clone.

virt-clone -o vm_origen -n hostname_nuevo --file /home/kvm/nueva_maquina/disco.img


Para visualizar la cantidad de maquinas funcionando, detenerlas, arrancarlas, hacer hot-plug de un dispositivo usb, etc... utilizamos "Virtual Shell".
El comando virsh es parte del paquete libvirt.

Existen multitud de comandos para manipular imagenes con virsh. Para manipular las imagenes con virsh necesitamos ser agregado al grupo libvirtd.


aptitude install libvirt-bin
adduser libvirtd

virsh

Welcome to virsh, the virtualization interactive terminal.

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

virsh # help

Commands:

help print help
attach-device attach device from an XML file
attach-disk attach disk device
attach-interface attach network interface
autostart autostart a domain
capabilities capabilities
connect (re)connect to hypervisor
console connect to the guest console
create create a domain from an XML file
start start a (previously defined) inactive domain
destroy destroy a domain
detach-device detach device from an XML file
detach-disk detach disk device
detach-interface detach network interface
define define (but don't start) a domain from an XML file
domid convert a domain name or UUID to domain id
domuuid convert a domain name or id to domain UUID
dominfo domain information
domname convert a domain id or UUID to domain name
domstate domain state
domblkstat get device block stats for a domain
domifstat get network interface stats for a domain
dumpxml domain information in XML
freecell NUMA free memory
hostname print the hypervisor hostname
list list domains
migrate migrate domain to another host
net-autostart autostart a network
net-create create a network from an XML file
net-define define (but don't start) a network from an XML file
net-destroy destroy a network
net-dumpxml network information in XML
net-list list networks
net-name convert a network UUID to network name
net-start start a (previously defined) inactive network
net-undefine undefine an inactive network
net-uuid convert a network name to network UUID
nodeinfo node information
quit quit this interactive terminal
reboot reboot a domain
restore restore a domain from a saved state in a file
resume resume a domain
save save a domain state to a file
schedinfo show/set scheduler parameters
dump dump the core of a domain to a file for analysis
shutdown gracefully shutdown a domain
setmem change memory allocation
setmaxmem change maximum memory limit
setvcpus change number of virtual CPUs
suspend suspend a domain
ttyconsole tty console
undefine undefine an inactive domain
uri print the hypervisor canonical URI
vcpuinfo domain vcpu information
vcpupin control domain vcpu affinity
version show version
vncdisplay vnc display



Administrar KVM desde GUI a través de SSH.
Esta opción es mucho mas intuitiva y "user friendly"


aptitude install virt-manager xauth


Desde una maquina remota con X11 podemos acceder al servidor a través de ssh habilitando la opción de gráficos.


ssh -X server_hostname_o_ip


El resultado será la GUI de Virt-manager en nuestro escritorio, de donde podemos administrar todas las maquina virtuales, crear nuevas y modificar las existentes.



viernes, 10 de julio de 2009

Instalar Clamav en Ubuntu desde repositorios

  • Simplemente ejecutamos:

aptitude update

  • Para usar en forma manual instalamos el paquete clamav


aptitude install clamav

  • Para usar automáticamente instalamos el paquete clamav-daemon.

aptitude install clamav-daemon

  • Para configurar clamav editamos los archivos:
clamav.conf o clamd.conf
freshclam.conf
  • Luego de configurar ClamAV con las opciones requeridas:

/etc/init.d/clamav-daemon restart

martes, 16 de junio de 2009

Instalando Apache+Mysql+Proftp

El server lo vamos a hacer con Ubuntu 8.04 por ser la versión LTS actualmente vigente.

Desde consola instalaremos apache2, php y mysql

Trabajamos como superusuario (root):
sudo su
apt-get install apache2 php5 libapache2-mod-php5 php5-mysql php5-gd php5-curl php5-cgi mysql-server mysql-client mysql-doc-5.0 mysql-query-browser

Conjuntamente podemos instalar: phpmyadmin y mysql-admin

Podemos probar los servicios haciendo:
/etc/init.d/apache2 restart
/etc/init.d/mysql restart
/etc/init.d/mysql status

Y para probar que nuestro si apache esta funcionando:
http://localhost o http://

Con eso nos muestra el mensaje It works!

Si queremos probar php podemos:
vim /var/www/test.php

Luego de realizar cualquier cambio en la carpeta o contenido de /var/www debemos reiniciar o recargar el servicio apache
/etc/init.d/apache2 reload

y nos dirijimos a
http://localhost/test.php o http://ip_del_server/test.php

Configurando Mysql

Durante la instalación de mysql se nos pidio una clave de root.

Vamos a modificarla:
mysql -uroot -p
Enter password:
mysql> UPDATE user SET Password=PASSWORD(’newrootpassword’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
mysql>quit


Instalando y Configurando Proftpd

sudo su
aptitude install proftpd openssl
Run proftpd: <-- standalone



Agregamos el usuario userftp.


echo '/bin/false' >> /etc/shells

useradd userftp -p password -d /home/ftp -s /bin/false
passwd userftp


Editamos proftpd.conf:


vim /etc/proftpd/proftpd.conf

Include /etc/proftpd/modules.conf

UseIPv6 off

ServerName "FTP FileServer"
ServerType standalone
IdentLookups off
ServerIdent on "FTP Server ready."
DeferWelcome off

MultilineRFC2228 on
DefaultServer on
ShowSymlinks on

TimeoutNoTransfer 600
TimeoutStalled600
TimeoutIdle 1200

DisplayLogin welcome.msg
DisplayChdir .message true
ListOptions "-l"

DenyFilter \*.*/

DefaultRoot /var/www/

Port 21

MaxInstances 30

User nobody
Group nogroup

Umask 022 022

AllowOverwriteon
PersistentPasswd off

TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log


QuotaEngine off



Ratios off



DelayEngine on



ControlsEngine off
ControlsMaxClients 2
ControlsLog /var/log/proftpd/controls.log
ControlsInterval 5
ControlsSocket /var/run/proftpd/proftpd.sock



AdminControlsEngine off


# Limit the maximum number of anonymous logins
MaxClients 8
MaxClientsPerHost 8
MaxClientsPerUser 8
MaxHostsPerUser 8
MaxLoginAttempts 5

#VALID LOGINS

AllowUser userftp
DenyALL



Umask 022 022
AllowOverwrite on

AllowUser userftp
DenyAll



Chekeamos la sintaxis
proftpd -td5

Reinicio el servicio
/etc/init.d/proftpd restart

Eso es todo.

Errores:

Si queremos acceder a nuestra basa desde fuera del server editamos el archivo my.cnf

vim /etc/mysql/my.cnf
bind-address = 127.0.0.1


la comentamos o cambiamos la ip 127.0.0.1 por la ip de la interfaz de red en la que queremos que escuche.


/etc/init.d/mysql restart


Nota: En caso de que aparezca el error:
/usr/bin/mysqladmin: connect to server at ‘localhost’ failed
error: ‘Access denied for user ‘debian-sys-maint’@'localhost’ (using password: YES)’

lo que hacemos es:

mysql -uroot -p
mysql> use mysql;
mysql> SELECT Host,User,Password FROM user WHERE User='debian-sys-maint';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'password_que_esta_en_/etce/mysql/debian.cnf' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
mysql>quit

/etc/init.d/mysql restart