Tuesday, April 22, 2008

Linux Volume Manager Tutorial

Discos del Infierno


Introduccion a LVM.



La mayoria de las instalaciones que realizamos, usando una Distro cualquiera sea, de ellas, como puede ser debian, redhat, Tuquito o Condorlinux(1), se realizan, por lo general utilizando discos communes.

Imaginemos esto, que hacemos una instalacion, donde particionamos de la siguiente manera.
/ 10 Gb
/boot 200 mb
/var 1 Gb


Esta puede ser una tabla de particionado generico, no digo que sea la mas optima, es solo para ejemplos.

Supongamos, que nuestro directorio /var, esta lleno, por que estamos usando un servidor de correo sendmail(2), y nos quedamos sin espacio. Tambien supongamos, que tenemos todo este particionado en un disco Serial Ata , al que el sistema lo detecto como sda, y que para darle mas espacio a /var, deberia agregar un nuevo disco, y copiar todos los datos de /var/, al nuevo disco, crear la partición via fdisk, editar el /etc/fstab, y todas esas cosas que Uds, por supuesto que ya saben.

Podriamos haber evitado esto desde el principio, si en el diseño de la Instalacion Hubieramos optado por usar, LVM, o Linux Volume Manager.


Vamos a Dar una Definición de Lvm, pero para no rompernos la cabeza, voy a tomar una definición de Daniel Coletti, en su documento

“Logical Volume Manager (LVM) . Administrador de Volúmenes Lógicos”.

El LVM es un módulo que se le agrega al núcleo Linux y genera una abstracción entre los
discos físicos y los dispositivos para accederlos. Con la ayuda de herramientas de administración, el administrador puede acceder a los beneficios de utilizar LVM.
Básicamente lo que se logra es tener un nuevo dispositivo que apunta no a un disco o una
partición, sino a un grupo de discos y particiones como un todo (manejar muchos espacios de disco como si fuera un único disco).

Es importante aclarar, que si bien se puede “migrar” un OS, a LVM, lo mas conveniente es el diseño del LVM, antes del Comenzar la instalacion.

Para la siguiente explicación, Utilizare una Instalacion en vmware, sobre debian etch.

¿Por que es Importante LVM?



Es importante entender LVM ya que otros sistemas de manejadores de discos, como puede ser el de Solaris, o el de productos como veritas, utilizan conceptos similares. De hecho, se deja de pensar en un disco aislado, sino en un File System.


Conceptos a Definir.

(Tambien tomado del mismo texto, de Daniel Coletti).

Entrando en detalle vamos a encontrarnos inicialmente con tres nuevos conceptos que utiliza
el LVM, Volumen Físico, Volumen Lógico y Grupo Volumen. Los Volúmenes Físicos (VF) son los discos o particiones de un disco, los Volúmenes Lógicos (VL) son dispositivos donde se pueden crear sistemas de archivos y por último, el Grupo Volumen (GV) es un área donde se juntan los VF y VL.

Una aclaracion fundamental.

Para que el Sistema Operativo trabaje con LVM, debera esto estar soportado en el kernel. Si bien el Kernel que utiliza debian etch, ya trae por defecto el soporte a LVM y a Raid, esta aclaracion es valida por si estamos compilando nuestro propio Kernel.

Habilitando el Soporte a Raid y LVM en el Kernel:

Multi-device support (RAID and LVM). -> .Logical volumen manager (LVM)
support.

Luego, lo que debemos hacer, es instalar el soporte a LVM, para eso, lo que debemos hacer, es

debian:/#apt-get install lvm2


Vamos, a tomar una medicion de cuanto disco rigido tenemos ocupado en este momento.

debian:/# df -k
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/sda3 2877872 881244 1850440 33% /
tmpfs 128484 0 128484 0% /lib/init/rw
udev 10240 68 10172 1% /dev
tmpfs 128484 0 128484 0% /dev/shm
/dev/sda2 279999 28188 237353 11% /boot
/dev/mapper/gv1-vl1 7845572 411752 7035280 6% /var



Y luego, en el vmware, agrego un disco virtual, para hacer el sistema Volume Manager.

Lo primero que debo hacer con este disco virtual, es formatearlo.


debian:~# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.


The number of cylinders for this disk is set to 1044.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044):
Using default value 1044

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


Lo que haremos sobre esta partición creada, es montar un Volumen Logico, y luego le asignaremos el directorio /var. Luego, una vez que el Volumen Logico este creado, le agregaremos otro disco mas, de 2 GB aproximadamente.

Lo primero que hacemos, es generar

pvcreate /dev/sdc1

Con esto generamos el disco fisico, para que sea veo por el grupo de volúmenes de discos.

Luego,

vgcreate gv1 /dev/sdc1

Con esto generamos el grupo de volumenes.

Luego,

lvcreate -L 7,6 GB -n vl1 gv1

Con esto, se genera el Volumen Logico, desde cual puede ser accedido desde el Sistema Operativo.

Luego,

mkfs.ext3 /dev/gv1/vl1

Montamos la particion del volumen, par aver que todo este marchando como esperamos

mount /dev/gv1/vl1 /mnt

Copiamos todo lo del /var/ actual, a lo que va a ser el nuevo /var, que ahora esta en /mnt

Nota:

Quizas tengas que hacer

debian:/#apt-get install rsync

Luego

debian:/#rsync -ax /var/. /mnt


Luego, movemos el actual /var, a /usr (Por ejemplo, por si algo falla). Por ultimo, debemos editar el /etc/fstab, para que tenga una apariencia parecida a esta. Nota: En tu equipo seguro sera distinto, es dependiente a la tabla de particionamiento.


debian:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
#
proc /proc proc defaults 0 0
/dev/sda3 / ext3 defaults,errors=remount-ro 0 1
/dev/sda2 /boot ext3 defaults 0 2
/dev/sda1 none swap sw 0 0
/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/gv1/vl1 /var ext3 defaults,errors=remount-ro 0 1
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0


Una vez, que hacemos esto, booteamos el equipo. Si todo anda bien, al realizar un mount, veremos algo similar a esto.

debian:~# mount
/dev/sda3 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda2 on /boot type ext3 (rw)
/dev/mapper/gv1-vl1 on /var type ext3 (rw,errors=remount-ro)


Veamos la ultima linea,

/dev/mapper/gv1-vl1 on /var type ext3 (rw,errors=remount-ro)


Esto significa, que ya tenemos un volumen logico, y en el , montado el directorio /var.

Viendo las diferencias:

Realizando un df, vemos que el tamaño ocupado en /, disminuyo, y que se genero un volumen logico.

debian:/# df
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/sda3 2877872 618312 2113372 23% /
tmpfs 128484 0 128484 0% /lib/init/rw
udev 10240 68 10172 1% /dev
tmpfs 128484 0 128484 0% /dev/shm
/dev/sda2 279999 28188 237353 11% /boot
/dev/mapper/gv1-vl1 7845572 411752 7035280 6% /var



Agregando Discos al volumen logico.

Supongamos, aunque este no es el caso, que necesitamos agregar un disco nuevo, a nuestro volumen logico. Para esto, conectamos un disco mas, que nuestro OS, lo va a detectar como sdb, y obviamente, lo formateamos.

debian:/# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
debian:/# vgextend gv1 /dev/sdb1
Volume group "gv1" successfully extended









debian:/# vgdisplay -v
Finding all volume groups
Finding volume group "gv1"
--- Volume group ---
VG Name gv1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 9,99 GB
PE Size 4,00 MB
Total PE 2558
Alloc PE / Size 1946 / 7,60 GB
Free PE / Size 612 / 2,39 GB
VG UUID J3TtQI-wo2U-IQgp-DNvU-jsNz-lUo6-yPjYHW

--- Logical volume ---
LV Name /dev/gv1/vl1
VG Name gv1
LV UUID cqX3IW-N1Gq-xo75-NQDJ-hFyZ-p6Ia-0nVah6
LV Write Access read/write
LV Status available
# open 1
LV Size 7,60 GB
Current LE 1946
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0

--- Physical volumes ---
PV Name /dev/sdc1
PV UUID gMTq2t-H27D-7X1a-vRAR-BJfo-56KW-oCR02x
PV Status allocatable
Total PE / Free PE 2047 / 101

PV Name /dev/sdb1
PV UUID Q4FSVy-IzHd-GZHx-bj0J-sW6j-7aJB-o1HW80
PV Status allocatable
Total PE / Free PE 511 / 511



debian:/# lvextend -L +1,6G /dev/gv1/vl1
Rounding up size to full physical extent 1,60 GB
Extending logical volume vl1 to 9,20 GB
Logical volume vl1 successfully resized



debian:/# resize2fs -p /dev/gv1/vl1
resize2fs 1.40-WIP (14-Nov-2006)
Filesystem at /dev/gv1/vl1 is mounted on /var; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/gv1/vl1 to 2412544 (4k) blocks.
The filesystem on /dev/gv1/vl1 is now 2412544 blocks long.

Ahora, realizaremos un df –k, para ver la nueva asignacion de espacio.

debian:/# df
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/sda3 2877872 618316 2113368 23% /
tmpfs 128484 0 128484 0% /lib/init/rw
udev 10240 68 10172 1% /dev
tmpfs 128484 0 128484 0% /dev/shm
/dev/sda2 279999 28188 237353 11% /boot
/dev/mapper/gv1-vl1 9498256 411756 8605240 5% /var

Y vemos, con en la ultima linea, disponemos de mayor espacio en var. Con esto, podemos imaginarnos un monton de utilidades.

Por ultimo, voy a dejar, un compendio de comandos que tambien voy a sacar del excelente apunte de Daniel Coletti,


Comandos de volúmenes físicos
pvchange Cambia los atributos de un volumen físico
pvcreate Crea un volumen físico
pvdata Muestra información de depuración sobre un volumen físico
pvdisplay Muestra información sobre un volumen físico
pvmove Mueve extensiones físicas de un volumen físico a otro.
pvscan Localiza y enumera todos los volúmenes físicos








Comandos de Grupo Volumen
vgcfgbackup Hace una copia del área del descriptor de grupo volumen
vgcfgrestore Recupera el área del descriptor de grupo volumen al disco
vgchange Cambia los atributos de un grupo volumen
vgck Comprueba la consistencia del área del descriptor de grupo volumen
vgcreate Crea un grupo volumen a partir de volúmenes físicos
vgdisplay Muestra los atributos de un grupo volumen
vgexport Exporta un grupo volumen del sistema
vgextend Añade volúmenes físicos a un grupo volumen
vgimport Importa un grupo volumen al sistema
vgmerge Combina dos grupos volumen
vgmknodes Combina un directorio y los archivos especiales de un grupo volumen
vgreduce Elimina volúmenes físicos de un grupo volumen
vgremove Elimina un grupo volumen
vgrename Renombra un grupo volumen
vgscan Localiza y enumera todos los grupos volumen del sistema
vgsplit Divide un grupo volumen

Comandos de Volumen Logico
lvchange Cambia los atributos de un volumen lógico
lvcreate Crea un volumen lógico
lvdisplay Muestra los atributos de un volumen lógico
lvextend Incrementa el tamaño de un volumen lógico
lvreduce Reduce el tamaño de un volumen lógico
lvremove Elimina un volumen lógico
lvrename Renombra un volumen lógico
lvscan Localiza y enumera todos los volúmenes lógicos, creando /etc/lvmtab y /etc/lvmtab.d/*

Comandos de Administración de Volúmenes Logicos

lvmchange Cambia los atributos del sistema LVM
lvmdiskscan Localiza y enumera todos los discos disponibles, los dispositivos múltiples y las particiones
lvmsadc Recoge información sobre la actividad de LVM
lvmsar Muestra información sobre la actividad de LVM

Notas:

1) El sendmail utiliza por defecto /var/spool/mail para alojar esto
2) ¿Pablo, para cuando?


Referencias:

Daniel Coletti: Administrador de Volúmenes Logicos en Linux.

Marcos Ruso: Ayuda para entender la “magia”.

Introduccion al Squid

Octopusy


Esta nota servira para mostrar una configuracion adecuada de squid, con cosas que probablemente no se ven en otros tutoriales.
Introduccion.
El squid es un proxy a nivel de aplicacion, que viene con la mayoria de las distros de linux. En particular, usare para la nota debian, por lo que lo que de
beriamos hacer, en esta ocasion, es lo siguiente.


debian:~# apt-get install squid
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias... Hecho
Se instalarán los siguientes paquetes extras:
squid-common
Paquetes sugeridos:
squidclient squid-cgi logcheck-database resolvconf smbclient
Se instalarán los siguientes paquetes NUEVOS:
squid squid-common


Esto nos bajara el squid, en nuestra pc, y de aca, lo que deberemos hacer, es configurar el archivo /etc/squid/squid.conf.
pero antes, deberemos tener en cuenta, que antes, el squid, genera archivos de logueo, en /var/log/squid/, y que estos seran muy importantes, para en el
futuro poder ver la actividad del proxy.

Empezando.

Veremos los archivos de configuracion:
Directivas:

Las directivas en el squid, son los parametros a pasar. Asi , por ejemplo, es normal, que el http_port (Puerto de Squid), este seteado en el port 3128,
pero tambien, mucha gente lo usa en el 8080 (Como lo usaba el viejo Proxy de Microsoft).
¿Como cambiar esto?.
Sencillo, deberemos ubicar la directiva
http_port 3128
y la cambiamos a
http_port 8080
Visible Hostname
Existe una clausula, llamada visible hostname, que es muy importante. En esta clausula, se define el nombre del proxy
por ejemplo
visible_hostname proxy.midominio.com.ar
Es muy importante que este clausula este correctamente seteada, sino, no se podra iniciar el servicio de squid.

ACLS:

Bueno, aca empieza la parte fundamental del funcionamiento del squid. Todos sabemos que la funcion primordial del squid, es el filtrado de contenido. Las
acls, lo que hacen, precisamente es ello.
Por ejemplo, vamos a ver lo siguiente
acl redlocal src 192.168.4.0/24
Que significa todo esto?
Se define una acl llamada red local, y se define como src (origen), todo lo que viene desde la red, 192.168.4.0/24, o sea toda la red con mascara 2
255.255.255.0.
Esta es una ACL mas bien sencilla, ya veremos mas adelante, como se complicara todo.
Paso a paso:

Insertaremos la nueva acl, en el archivo de configuracion simplificado, le hemos sacado todos los comentarios a nuestro archivo, para una mejor compresion

http_port 3128
visible_hostname proxy.midominio.com.ar
acl redlocal src 192.168.4.0/24
#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access allow red_local
http_access deny all


Digamos que con esta minima configuracion, tenemos acceso a toda la red, 192.168.4.0/24, sin ningun tipo de restricciones. Ahora bien, supongamos que por
un enlace punto a punto, o tambien podria ser via vpn, o diversas configuraciones locales, tenemos una red, por ejemplo en Villa Dolores(Cba). Definiremos
esa red
acl villa_dolores 192.168.5.0/24
donde es obvio, que estamos dejando pasar a toda la red 192.168.5.0/24

Complicando un poco mas, y entendiendo la sintaxis de las acls.

Veremos, en un primer momento, yo quisiera que toda la red de villa dolores, tenga acceso a internet, pero que no pueda descargarse archivos.
esto ya se esta complicando aun un poco mas, por eso, deberemos primero generar una acl archivos, y ya veremos como.
acl archivos urlpath_regex "/etc/squid/archivos"
aca vemos, que usaremos una regex(Expresion regular), para ver que tipos de archivos estan envueltos en esta regla. Obviamente, como la mayoria habra
supuesto, existira un archivo llamado /etc/squid/archivos. En caso de no existir este archivo, al restartear squid, seremos informados.
en el archivo, /etc/squid/archivos, pongo lo siguiente

exe
avi
mp3
mpeg
mp4
rad



Y con esto, agregamos estos tipos de archivos a la acl archivos. Ahora veremos como aplicar esta acl.
Supongamos que a la red de villa dolores, le quisiera dar internet, pero no quisiera que se pudieran bajar de una pagina, los siguientes archivos, entonces,
generaria una regla del siguiente tipo

http_access allow villa_dolores !archivos

como vemos, el !archivos, funciona como un NOT. entonces, dejara pasar la acl definida en villa_dolores, que es que toda la red 192.168.5.0 pueda navegar,
pero no dejare que bajen los archivos.

Viendo otro ejemplo mas

Supongamos ahora mismo, que queremos filtrar una gran cantidad de palabras obsenas, como puede ser, (vamos, las que uds. ya conocen!!).
generamos una acl, que ahora, tenga como sentido el filtro de palabras.
acl filtrar url_regex "/etc/squid/filtrar"
con esto, el url_regex, filtrara las palabras que estaran en el archivo filtrar
en el archivo filtrar por ejemplo ponemos
pedofilia
gays
travestis
Y si en la url destino, encontraramos esas palabras, se denegaria el acceso.

filtro MSN:

Esto me costo bastante, y fue mas bien viendo por donde se metia el msn, en los logs del squid.
acl filtro_msn dstdomain "/etc/squid/msn"
aca vemos la directiva dstdomain. Se filtrara por el dominio de destino, que estara especificado en /etc/squid/msn
en ese archivo, pondremos.

gateway.messenger.hotmail.com
login.live.com
login.live.com:443
messenger.hotmail.com
messenger.msn.com
messenger.microsoft.com
echo-v1.msgr.hotmail.com
echo-v2.msgr.hotmail.com
echo-v3.msgr.hotmail.com
echo-v4.msgr.hotmail.com
echo-v5.msgr.hotmail.com
echo-v6.msgr.hotmail.com
echo-v7.msgr.hotmail.com
echo-v8.msgr.hotmail.com
echo-v9.msgr.hotmail.com
echo-v10.msgr.hotmail.com
g.msn.com
rsi.hotmail.com
config.messenger.msn.com


y con esto, nos aseguramos que no se puedan conectar al msn. Si bien anteriormente al MSN Live, se podia hacer una regla por aplicacion, pero ahora ya no.
entonces, simplificando, imaginemos que queremos que la red de villa dolores, no tenga ni msn, ni baje archivo, ni vea paginas con palabras prohibidas,
generamos la siguiente acl.
http_access allow villa_dolores !filtro_msn !archivos !filtrar
con esto, demostramos que se puede filtrar, y usando la logica, podemos incluir muchisimas directivas.


Configuracion final del /etc/squid/squid.conf

http_port 3128
visible_hostname proxy.midominio.com.ar
acl redlocal src 192.168.4.0/24
acl villa_dolores src 192.168.5.0/24
acl filtrar url_regex "/etc/squid/filtrar"
acl filtro_msn dstdomain "/etc/squid/msn"
acl archivos urlpath_regex "/etc/squid/archivos"

#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access allow red_local
http_access allow villa_dolores !filtro_msn !archivos !filtrar
http_access deny all



Otros tipos de configuraciones y directivas:



Existe la posibilidad de filtrar por horario de trabajo, por grupos y dominios (Para eso utilizaremos Winbind, si queremos unir el server a un dominio),
o tambien, la posibilidad de conectar a un arbol de directorio LDAP, (OpenLdap, Novell eDirectory, y tambien hasta a Microsoft Active Directory).
Tambien existe la validacion basica, usuario a usuario.

Vamos por el log

Si nosotros quisieramos visualizar la actividad del squid, deberiamos buscar esto en el archivo de log del squid (/var/log/squid/squid.log)

Continuara.

Monday, April 21, 2008

Probando

esta es una nueva entrada de prueba