martes, 16 de agosto de 2011

#008 - Logical Volume Manager

Actualmente una de las mayores fortalezas de los sistemas GNU/Linux es entre otras, la administración de volúmenes lógicos. Su principal característica es que podemos asignar uno o varios discos rígidos formando parte de lo que en LVM se denomina "Logical Volume Group". En ellos podemos definir Volúmenes Lógicos, que son para que nos entendamos, una distribución lógica del espacio de ese grupo de volúmenes (Se maneja igual al particionado del disco duro), con la gran diferencia de que estos volúmenes lógicos pueden formar parte de un sólo disco duro o estar compuesto por varios.

Para una persona recién iniciada en los sistemas UNIX y GNU/Linux, resulta dificil comprender como realizar un correcto particionado del disco para aprovechar sus recursos al máximo. Hablando de mi caso en particular, las primeras 2 o 3 veces que realicé en aquel entonces la instalación de mi "Ubuntu 6.06" no entendía la estructura de directorios, por lo cual las particiones me quedaban realmente horribles.

Es una situación así, usar LVM nos soluciona la vida dado que nos permite "malear" a gusto como está distribuido el espacio del cual hacen uso los volúmenes lógicos asignados. Hoy por hoy, distrubuciones como Fedora y Debian lo utilizan por defecto en su instalación. De entre sus muchas posibilidades, lo que hace más interesante a LVM es que podemos redimensionar según se requieran los volúmenes lógicos una vez creados sin necesidad de hacer uso de herramientas como "gparted" o "partition magic" (En mi experienca, herramientas que tienen el poder de "fallar" habiendome arruinado la vida mas que solucionarmela).
Otra de las grandes ventajas que tiene usar LVM es que podemos añadir discos duros a nuestros grupos de volúmenes, con lo cual, podemos ir agrandando nuestros volúmenes manteniendo nuestro sistema de ficheros como si sólo tuviéramos un disco duro en el equipo.

Para ir entendiendo bien como es este tipo de tecnología, veamos como se compone su estructura:


NIVEL 1: Physical Volumes (Discos duros de nuestro sistema o PVs)
hda
hdb
hdc
sda2


NIVEL 2: Volume Group (Grupo de Volúmenes o VGs)
vg01


NIVEL 3: Logical Volumes (Volúmenes Lógicos o LVs)
lvhome
lvusr
lvvar
lvroot
lvswap


NIVEL 4: Filesystems (Formato que puede contener cada LV)
ext3
reiserfs
xfs


NIVEL 5: Archivos y Directorios (Sistemas de Archivos, almacenan archivos y directorio)
/home
/usr
/var
/

A grandes razgos podemos apreciar que el espacio total de nuestro sistema sera la suma del tamaño de cada Disco Duro (PVs), luego todo ese gran disco virtual se convierte en un Volume Group (En el ejemplo anterior decidí utiluizar un sólo VG llamado “vg01”) y dentro de éste VG se crean los LVs conteniendo cada unos de ellos diferentes Sistemas de Archivos y dentro de ellos archivos y directorio.

Por ejemplo si tenemos un disco rígido de 120Gb con 3 particiones:

Root /   =====> 15 GB (Prefiero que sobre, y no que me falte)
Swap     =====> 2  GB

V. Group =====> 103GB (Volume Group)
   - lvhome ==> 50Gb
   - lvboot ==>  1Gb
   - lvtmp  ==>  5Gb

Dentro del VG decidí crear 3 LVs para /home, /boot y /tmp de 50Gb, 1Gb y 5Gb respectivamente (Podemos hacerlo para varios puntos de montaje, teniendo en cuenta que no es recomendable tener la raiz / en un volumen lógico dado que para desmontarla vamos a tener que superar terribles inconvenientes). Quedando entonces 52G de espacio disponible en el VG que pueden ser utilizados tanto para extender los LVs ya creados y crear nuevos LVs.

Vamos a un ejemplos real.

Creé una máquina virtual dispuesta de la siguiente forma:


Phisical Volume
============

PV Name                /dev/sda1
VG Name                vg-debian
PV Size                12.00 GiB / not usable 2.00 MiB
Allocatable            yes
PE Size                4.00 MiB
Total PE            3071
Free PE                18
Allocated PE        3053
PV UUID                TqBWiW-pxNn-9GHp-nKCg-chd7-V3gu-1Bu50W

Volume Group
===========

VG Name                    vg-debian
System ID         
Format                    lvm2
Metadata Areas            1
Metadata Sequence No    7
VG Access                read/write
VG Status                resizable
MAX LV                    0
Cur LV                    3
Open LV                    3
Max PV                    0
Cur PV                    1
Act PV                    1
VG Size                    12.00 GiB
PE Size                    4.00 MiB
Total PE                3071
Alloc PE / Size            3053 / 11.93 GiB
Free  PE / Size            18 / 72.00 MiB
VG UUID                    QRSOcN-mbv4-KzML-c3b5-RCAM-Tl9Q-Zdc37p

Logical Volumes
=============

LV Name                    /dev/vg-debian/lv-root
VG Name                    vg-debian
LV UUID                    Xj6hhA-YR5k-31Tb-4aqQ-AN7q-lyd1-23ftFZ
LV Write Access            read/write
LV Status                available
# open                    1
LV Size                    4.30 GiB
Current LE                1101
Segments                2
Allocation                inherit
Read ahead sectors        auto
- currently set to        256
Block device            254:0

LV Name                    /dev/vg-debian/lv-home
VG Name                    vg-debian
LV UUID                    76egEE-Ktxv-Z08I-dgtB-qAEx-m7cV-F6U2il
LV Write Access            read/write
LV Status                available
# open                    1
LV Size                    6.67 GiB
Current LE                1708
Segments                1
Allocation                inherit
Read ahead sectors        auto
- currently set to        256
Block device            254:2

LV Name                    /dev/vg-debian/lv-swap
VG Name                    vg-debian
LV UUID                    whH232-wAT9-zOam-E28Y-dVzD-zi06-g6Ps3v
LV Write Access            read/write
LV Status                available
# open                    1
LV Size                    976.00 MiB
Current LE                244
Segments                1
Allocation                inherit
Read ahead sectors        auto
- currently set to        256
Block device            254:1

  
En resumen:
=========
# ==> PV = 12Gb (Un disco rígido de 12.00Gb) 
# ==> VG = 12Gb (Con bloques definidos de 4MB) 
# ==> lv-root  =  4.30 GiB (Montado en /) 
# ==> lv-home  =  6.67 GiB (Montado en /home)
# ==> lv-swap  =  976.00 MiB (Área de intercambio)

Como podemos ver, el particionado esta armado con espacio justo para la partición raíz (Digo justo porque planeo instalarle GNOME como entorno gráfico, y me consume mas de 1,3Gb.) y mucho espacio de /home teniendo en cuenta que es una máquina virtual de prueba, y que no planeo meterle muchos archivos personales.

Supongamos que despues de instalar todo el sistema con sus correspondientes aplicaciones, me encuentro con la siguiente situación:

Filesystem                                       Size   Used   Avail   Use%    Mounted on
/dev/mapper/vg--debian-lv--root             4.3G   4.2G   100M    99%      /
/dev/mapper/vg--debian-lv--home           6.6G  222M   6.1G    4%       /home

En un sistema de particiones regular, la unica opción que tendría sería la de lamentarme durante horas en diferentes idiomas dado que deberia reinstalar todo el sistema desde 0 y armar una mejor distribución del espacio libre.

Pero, como nosotros estamos haciendo uso de LVM, tenemos una solución mucho mas amigable.

Lo primero que debemos verificar es si tenemos espacio disponible en nuestro Volume Group:

root@squeeze:~# vgdisplay | grep -i free
  Free  PE / Size       18 / 72.00 MiB

En efecto, disponemos de 72MiB libres. Pero lamentablemente no es significativo para nosotros, por lo cual, vamos a requerir mas espacio.

¿Como podemos disponer de mas espacio, si utilizamos todo el disco?

Simple, reducimos el tamaño de /home 1GB menos siendo que le asignamos mas espacio del que vamos a utilizar.


root@squeeze:~# umount -f /home
root@squeeze:~# lvresize -L 5.6G /dev/vg-debian/lv-home
root@squeeze:~# resize2fs /dev/vg-debian/lv-home 5.6G
root@squeeze:~# mount /home

(Como aclaración, en GNU/Linux por lo menos, siempre específicar la unidad de medida que estamos utilizando, sea G para Gigabytes, M para Megabytes, s para Sectores de 512k.)


Listo. Con esto nuestro filesystem quedaría así.


Filesystem                                       Size   Used   Avail   Use%    Mounted on
/dev/mapper/vg--debian-lv--root             4.3G   4.2G   100M    99%      /
/dev/mapper/vg--debian-lv--home           5.6G  222M   5.1G    7%       /home

Una vez que ya tengamos acomodado el espacio que necesitabamos, podemos pasar a extender nuestro /.

Como en este caso, mi / esta en un LVM, no voy a poder desmontarlo. Así que vamos a tener que recurrir a una extension "on-line".


root@squeeze:~# lvresize -L 5.3G /dev/vg-debian/lv-root
root@squeeze:~# resize2fs /dev/vg-debian/lv-root 5.3G 

Listo. Con esto nuestro filesystem quedaría así.


Filesystem                                       Size   Used   Avail   Use%    Mounted on
/dev/mapper/vg--debian-lv--root             5.3G   4.2G   1.1G    88%      /
/dev/mapper/vg--debian-lv--home           5.6G  222M   5.1G    7%       /home

 Para mayor información sobre LVM, les recomiendo revisar el siguiente link:

http://tldp.org/HOWTO/LVM-HOWTO/commontask.html

Que sigan bien, cualquier duda o consulta no duden en hacermela llegar.

Saludos!!


miércoles, 10 de agosto de 2011

#007 - MSN en una consola GNU/Linux o Unix

Buenas a todos:

Muchas veces nos encontramos ante la situación de que trabajamos en alguna empresa donde el cliente de mensajería instantánea de Microsoft está fuera de norma, y aún así queremos utilizarlo para mantenernos en contacto con nuestra gente.

Hoy, mientras navegaba por internet, me encontré con el siguiente aplicativo que despertó mi atención.




Básicamente es un cliente ligero de MSN que se ejecuta desde una terminal común y corriente. Sinceramente no tuve mucho tiempo de probarlo, así que desconozco su rendimiento.

Es liviano: 524KB estando instalado.
Es rápido: Consume extremadamente poca memoria Ram

¿Que se requiere para ejecutarlo? Únicamente tener instalado el intérprete de Python en el equipo donde lo ejecutemos.

Les adjunto el link de donde conseguí la información.

http://120linux.com/msn-por-consola/


Espero que les sea de la misma utilidad que a mi.

Un abrazo!

lunes, 8 de agosto de 2011

#006 - Perderle el miedo al editor VI

Una de las cosas que por ahí resulta mas complejo a la hora de utilizar sistemas "UNIX like" es el editor de texto vi. En primera instancia resulta complejo, poco atractivo y tal vez no exprese toda la robustez y funcionalidad que posee. Yo personalmente considero que es básico a la hora de utilizar el sistema. Asi que espero que este pequeño tutorial les sea de utilidad.

Introducción

El editor vi es un editor de texto de pantalla completa que maneja en memoria el texto entero de un archivo. Es el editor clásico de los sistemas UNIX. Por defecto se encuentra en el sistema base de todas las versiones de UNIX y GNU/Linux. 
En las distribuciones GNU/Linux el editor vi que viene con el sistema es el nuevo vim (VI iMproved) que contiene facilidades adicionales, así como todas las excelentes funcionalidades del vi original. En ambos casos, el conjunto de comandos básicos es el mismo. 

Hablando de las raices, vi está en todas las distribuciones UNIX, requiere pocos recursos, se usa mucho en administración, para programar y en situaciones de emergencia. En casos de roturas de discos, corrupción de sistemas de archivos, errores en el arranque y otras catástrofes, puede ser el único editor disponible. Como la mayoría de las configuraciones en UNIX se manejan editando archivos, disponer de esta capacidad es esencial en la administración de un sistema. 

¿Como se ve Vi?




¿Como se ve Vim?



Modos de Vi
Existen dos modos vi:

Comando:
Las teclas ejecutan acciones que permiten desplazar el cursor, recorrer el archivo, ejecutar comandos de manejo del texto y salir del editor. Es el modo inicial de vi.

Inserción:
Las teclas ingresan caracteres en el texto.

Confundir un modo con otro al principio puede ser la de mayor de las dificultades para el manejo de vi. De cualquier manera, puede activarse un indicador de modo escribiendo ":set showmode".
Esto hace aparecer una leyenda que indica si se está en modo comando o inserción.

Invocación de Vi
vi 
Abre la ventana de edición sin abrir ningún archivo.

vi arch1
Edita el archivo arch1 si existe; si no, lo crea.

vi arch1 arch2
Edita sucesivamente los archivos arch1 y luego arch2.

vi +45 arch1
Edita el archivo arch1 posicionando el cursor en la línea 45.

vi +$ arch1
Edita el archivo arch1 posicionando el cursor al final del archivo.

vi +/Uno arch1
Edita el archivo arch1 en la primera ocurrencia de la palabra "Uno".

Desplazamiento en pantalla
El editor vi, al igual que todo UNIX, diferencia mayúsculas y minúsculas. Confundir un comando en minúscula digitando uno en mayúscula suele tener consecuencias catastróficas.
Se aconseja evitar sistemáticamente el uso de la traba de mayúsculas y siempre mantener el teclado en minúsculas.

h o flecha izquierda
Mueve el cursor un caracter a la izquierda

j o flecha abajo
Mueve el cursor una línea hacia abajo

k o flecha arriba 
Mueve el cursor una línea hacia arriba.

l o flecha derecha 
Mueve el cursor un caracter a la derecha

$
Fin de línea

0
Principio de línea

1G
Comienzo del archivo

G
Fin del archivo

18G
Línea número 18

Ctrl-G
Mostrar número de línea actual

w 
Comienzo de la palabra siguiente

e
Fin de la palabra siguiente

E
Fin de la palabra siguiente antes de espacio

b
Principio de la palabra anterior

^
Primera palabra de la línea

%
Hasta el paréntesis que aparea

H
Parte superior de la pantalla

L
Parte inferior de la pantalla

M
Al medio de la pantalla

Comandos básicos
i
Inserta texto a la izquierda del cursor

a
Agrega texto a la derecha del cursor

ESC
Vuelve a modo comando

x
Borra el caracter bajo el cursor

dd
Borra una línea

:w 
Guarda el archivo

:wq!
Guarda el archivio y Sale del editor


Comando a texto
i
Inserta texto donde se encuentra ubicado el cursor

I
Inserta texto antes del primer caracter blanco de la línea

a
Inserta texto a la izquierda del cursor

A
Inserta texto al final de la línea

o
Inserta texto debajo de la línea actual creando una nueva línea en blanco

O
Inserta texto encima de la línea actual creando una nueva línea en blanco

R
Inserta texto reemplazando los caracteres que tenga a su izquierda.


Control de pantalla
Ctrl-f
Una pantalla adelante

Ctrl-b 
Una pantalla atrás

Ctrl-l
Redibujar la pantalla

Ctrl-d 
Media pantalla adelante

Ctrl-u 
Media pantalla atrás

Borrar
x
Borrar caracter bajo el cursor

dd
Borrar línea, queda guardada

D
Borrar desde cursor a fin de línea

dw
Borrar desde cursor a fin de palabra

d$
Borrar desde cursor a fin de línea

d0
Borrar desde cursor a principio de línea

Copiar y pegar

Y o yy
Copiar línea

P 
Pegar antes del cursor

p 
Pegar después del cursor

yw 
Copiar palabra

y$ 
Copiar de cursor a fin de línea

"ayy o "aY 
Copiar línea en buffer llamado 'a' 'a'

"ayw 
Copiar palabra en buffer llamado

"ap
Pegar desde buffer 'a' a la derecha del cursor

"aP 
Pegar desde buffer 'a' a la izquierda del cursor

"bdd
Borrar línea y guardar en buffer 'b'

"bdw
Borrar palabra y guardar en buffer 'b'

Búsqueda
/str 
Buscar hacia adelante cadena de caracteres 'str'

?str 
Buscar hacia atrás cadena de caracteres 'str'

n  
Repetir último comando / o ?

N 
Repetir último comando / o ? para el otro lado

fc 
Buscar el siguiente caracter 'c' en la línea

Fc 
Buscar el anterior caracter 'c' en la línea

tc 
Ir al caracter anterior al siguiente 'c'

Tc 
Ir al caracter posterior al precedente 'c'

; 
Repetir el último comando f, F, t, o T

, 
Último comando f, F, t, o T para el otro lado

La cadena a buscar en / o ? puede ser una expresión regular.
La acción de f, F, t y T alcanza sólo a la línea actual; si el caracter buscado no está en esa línea el cursor no se mueve.

Reemplazo
Estos comandos admiten multiplicadores: un número delante del comando. Al dar un comando de reemplazo el editor coloca un símbolo $ en donde termina el pedido de reemplazo. El usuario escribe normalmente, sobreescribiendo, hasta donde necesite, y sale con ESC. Estos comandos admiten multiplicadores: 3cw abre un área de reemplazo para 3 palabras.

c
Reemplaza caracteres

cw
Reemplaza palabras

C o c$
Reemplaza hasta el fin de línea

c0 
Reemplaza desde el comienzo de línea

Otros
J
Unir dos líneas en una

ZZ 
Grabar cambios si los hubo y salir 

u
Deshacer última acción

U 
Deshacer todos los cambios en una línea

Modo Texto
BS
Borrar caracter hacia la izquierda

ESC
Pasar a modo comando

Modo ex o última línea
:q    
Salir si no hubo cambios

:q!    
Salir sin guardar cambios

:w     
Guardar cambios

:w arch1    
Guardar cambios en archivo arch1

:wq   
Guardar cambios y salir

:r arch2   
Insertar un archivo

:e arch2
Editar un nuevo archivo

:e! arch2
Idem sin salvar anterior

:r! comando
Insertar salida de comando

:shell
Salir al shell (vuelve con exit)

Mover
:1
Mueve a línea 1

:15
Mueve a línea 15

:$
Mueve a última línea

Opciones
:set
Cambio de opciones

:set nu   
Mostrar números de línea

:set nonu   
No mostrar números de línea

:set showmode   
Mostrar modo actual de vi 

:set noshowmode   
No mostrar modo actual de vi

miércoles, 3 de agosto de 2011

#005 - Uso de la terminal

No hay lugar a dudas que el componente mas importante de nuestro sistema operativo ya sea Unix o GNU/Linux es la terminal (También llamada consola o línea de comandos).

Es completamente necesario conocer como trabajar con la terminal para poder manejar el sistema aprovechando todo su potencial. De ahí mi idea de brindar una breve introduccion a las herramientas necesarias para lograrlo.

Shell
Antes que nada, debemos comprender que es lo que estamos utilizando. Se llama shell al "Intérprete de comandos". Este interpreta las ordenes brindadas por el usuario y le dice al sistema que es lo que debe hacer.
Hay diferentes intérpretes diseñados con distintos fines. Hoy en día, el mas utilizado (Por lo menos hablando de GNU/Linux) es BASH (Bourne Again SHell).

Entre los diferentes intérpretes, voy a destacar a los principales:

- Bourne Shell (/bin/sh)
- Korn Shell (/bin/ksh)
- C Shell (/bin/csh)
- Bourne Again SHell (/bin/bash)
- Tenex C Shell (/bin/tcsh)
- Zero Shell (/bin/zsh)

Aquí les dejo un link con la comparación entre ellas y muchas otras mas: http://en.wikipedia.org/wiki/Comparison_of_command_shells

Pero en nuestro caso, nos vamos a concentrar en BASH.

Bash
A partir de 1978, donde Bourne Shell era el intérprete de comandos predeterminado de UNIX muchos usuarios comenzaron a buscar otras formas de comunicarse con el sistema. Fue entonces que en 1987 Brian Fox sorprendió al mundo con bash. En 1990 fue Chet Ramey quien tomó las riendas del proyecto convirtiendose en su principal desarrollador.
Hoy en día, se ha convertido en el intérprete predeterminado de la mayoría de sistemas GNU/Linux teniendo la posibilidad de poder ser instalado en sistemas UNIX.Los nuevos sistemas operativos Mac OS tambien lo utilizan (Estos, basados en el desarrollo de BSD), inclusive puede ejecutarse en Microsoft Windows por gracias al proyecto Cygwin.

Comandos

Ayuda
Lo primero que debemos saber, es como solicitar ayuda. Para ello, contamos con 2 excelentes herramientas.

<Comando> --help

--help nos devuelve una breve referencia de como utilizar el comando. Ideal para aquellos que ya conocen el comando y tan solo desean refrescar conocimientos.

man <Comando>

man ya es un poco mas extenso, pero mucho mas util. Las "man pages" contienen una reseña del comando, su correcta sintaxis con su explicación correspondiente, ejemplos y sugerencias.

Ya que sabemos como soliciar ayuda, les paso la lista de comandos mas utilizados para defenderse en el sistema. Su correcto uso, se irá explicando posteriormente en los siguientes posts. Les sugiero realizar un --help del comando que necesiten para ver sus atributos o un man si quieren algo mas específico.

ls:        Lista los archivos y directorios
sort:    Ordena una lista de archivos
cd:       Cambio de directorio
pwd:    Muestra la ruta al directorio actual
tree:    Muestra la estructura de directorios según su jerarquía.
mkdir: Crea un directorio
rmdir:  Borra directorios, cuyo directorio debe estar vacío.
cp:        Copia archivos
rm:       Borra archivos
mv:       Mueve o renombra archivos y directorios
cat:       Muestra el contenido de uno o varios archivos
more:   Explora el contenido de los archivos
less:     Como more, pero con la posibilidad de desplazarse dentro del archivo.
split:     Dividir archivos
find:      Busca archivos
locate:  Localiza archivos según una lista estandar.
file:       Muestra el tipo de archivo
whatis:  Muestra descripción del archivo
wc:        Cuenta líneas, palabras o caracteres en un archivo
grep:     Busca un string en archivos
head:     Muestra el inicio de un archivo
tail:        Muestra el final de un archivo
tr:          Reemplaza caracteres en un fichero de texto
paste:    Une dos archivos con la posibilidad de especificar un delimitador
uniq:      Elimina líneas repetidas adyacentes del archivo
cut:        Sirve para seleccionar columnas de una tabla o campos de cada línea de archivo
diff:        Muestra las diferencias entre dos archivos
fuser:     Muestra que usuario tiene en uso o bloqueado un archivo o recurso
tar:         Empaquetado archivos
gzip:       Comprime archivos gz
gunzip:   Descomprime archivos gz
chmod:   Cambio permisos a archivos y directorios
chown:    Cambio de propietario
chgrp:     Cambio de grupo
vi:           Abre el editor de texto vi
pico:       Edita un fichero de texto
nano:      Otra forma de editar un fichero de texto
top:        Muestra los procesos que se están ejecutando y permite matarlos
ps:          Muestra la lista de procesos del usuario
kill:        Mata proceso por el PID
killall:    Mata proceso por nombre
fg:          Trae a primer plano un proceso parado o en segundo plano
bg:         Pone un proceso en segundo plano
&:          Colocado al final de la línea de comando ejecuta en segundo plano
nice:      Ajusta la prioridad de un proceso de -20 a 19
mount:   Monta un filesystem
umount: Desmonta un filesystem
df:          Muestra el espacio libre de los discos
du:         Muestra el espacio usado por el disco o un directorio
mkfs:     Crea un filesystem
fsck:      Verifica el estado de un filesystem
fdisk:     Gestión de particiones
ifconfig: Muestra la configuración del dispositivo de red
ping:       Indica si hay respuesta por parte del servidor
pr:          Imprime un archivo
lpq:        Muestra colas de impresión
lprm:      Eliminar un trabajo de la cola de impresión


Por ahora, esto es todo. De ser posible, voy a ir profundizando cada uno de ellos en futuras publicaciones. Les recuerdo que es una lista muy limitada de comandos que yo considero básicos. En Unix / GNU Linux, la unica limitación es la imaginación.

Atte.
Santiago Glandarelli

#004 - Instalación y Configuración de las ACL en Debian

En la publicación anterior estuve hablando de las ACL's como una forma "especial" de manejar permisos. Dado que estas no vienen instaladas por defecto en la mayoria de las distribuciones GNU/Linux prometí que iba a explicar su correcta instalación y configuración.

Link a la nota: http://carnage-servers.blogspot.com/2011/08/003-access-control-list.html

Bien, habiendo refrescado ese concepto, pasemos a su implementación.

¿Qué necesito para poder instalar Access Control Lists? 
Cualquier distribución GNU/Linux con un Kernel de la familia 2.6

Verificamos que el Kernel tenga soporte para las ACL 
saglanda@squeeze:~$ cat /boot/config-2.6.32-5-686 | grep -i _acl
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_OCFS2_FS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
 
Yo estoy trabajando con un Debian Squeeze, y en este equipo mi filesystem es de tipo EXT4. Luego de verificar que tengo soporte en la salida del cat ( CONFIG_EXT4_FS_POSIX_ACL=y ) puedo proceder a instalar los paquetes necesarios.

Actualizar los repositorios y la distribución.
Yo no se hasta que punto es necesario esto, pero nunca está de mas mantener nuestra distribución actualizada.

saglanda@squeeze:~$ sudo aptitude update && sudo aptitude upgrade
Get:1 http://ftp.ccc.uba.ar squeeze Release.gpg [1,672 B]
Ign http://ftp.ccc.uba.ar/pub/linux/debian/debian/ squeeze/main Translation-en
Ign http://ftp.ccc.uba.ar/pub/linux/debian/debian/ squeeze/main Translation-en_US
...
[ La salida de esto es larga, asi que voy a economizar líneas ]
...
Get:8 http://ftp.ccc.uba.ar squeeze-updates/main Sources/DiffIndex [1,471 B]
Get:9 http://ftp.ccc.uba.ar squeeze-updates/main i386 Packages/DiffIndex [1,471 B]
Get:10 http://ftp.ccc.uba.ar squeeze-updates/main i386 Packages [10.9 kB]
Fetched 11.3 MB in 14s (795 kB/s)                                              
                           
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

Una vez que nuestra distribución se encuentra actualizada, procedemos con la instalación de las ACL.
saglanda@squeeze:~$ sudo aptitude install acl
The following NEW packages will be installed:
  acl
0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 61.7 kB of archives. After unpacking 295 kB will be used.
Get:1 http://ftp.ccc.uba.ar/pub/linux/debian/debian/ squeeze/main acl i386 2.2.49-4 [61.7 kB]
Fetched 61.7 kB in 0s (228 kB/s)
Selecting previously deselected package acl.
(Reading database ... 129786 files and directories currently installed.)
Unpacking acl (from .../archives/acl_2.2.49-4_i386.deb) ...
Processing triggers for man-db ...
Setting up acl (2.2.49-4) ...

Ya con las ACL instaladas, tenemos que volver a remontar nuestros discos incluyendo esta nueva opción.
saglanda@squeeze:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/vg--debian-lv--root / ext4 errors=remount-ro 0 1
/dev/mapper/vg--debian-lv--home /home ext4 defaults 0 2

Sabiendo cuales son los filesystems que tenemos que remontar, procedemos a hacerlo.

saglanda@squeeze:~$ sudo mount -o remount,acl /dev/mapper/vg--debian-lv--root
saglanda@squeeze:~$ sudo mount -o remount,acl /dev/mapper/vg--debian-lv--home

Recordemos que esto es solo temporal hasta que se reinicie el equipo. Para que los cambios sean permanentes debemos modificar el /etc/fstab

saglanda@squeeze:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/vg--debian-lv--root / ext4 acl,errors=remount-ro 0 1
/dev/mapper/vg--debian-lv--home /home ext4 acl,defaults 0 2

Como pueden observar, en la columna "<options>" incluí el string "acl," antes de la opción por defecto.

¿Esto qué logra? Que cada vez que yo reinicie el sistema y se monten nuevamente los dispositivos, levante la configuración de las acl automáticamente.

Listo, con esto ya tendríamos configuradas las ACL en nuestro equipo.

A continuación, refresco un poco los conceptos mencionados en la nota #003.

getfacl --> Obtengo el estado de las acl del archivo
saglanda@squeeze:~$ getfacl test.acl
# file: test.acl/
# owner: saglanda
# group: admin
user::rwx
group::r-x
other::r-x

setfacl  --> Modifico las acl según lo necesite
saglanda@squeeze:~$ setfacl -m u:sperez:rw test.acl/
saglanda@squeeze:~$ getfacl test.acl/

# file: test.acl/
# owner: saglanda
# group: admin
user::rwx
user:sperez:rw-
group::r-x
mask::rwx
other::r-x

saglanda@squeeze:~$ setfacl -m g:admin:rw test.acl/
saglanda@squeeze:~$ getfacl test.acl/

# file: test.acl/
# owner: saglanda
# group: admin
user::rwx
user:sperez:rw-
group::r-x
group:admin:rw-
mask::rwx
other::r-x

Bueno, esto es todo por ahora. Recuerden que cualquier duda o consulta que tengan pueden ponerse en contacto conmigo ya sea por mi mail carnage@arnet.com.ar o comentando cada uno de mis post.

Cada pregunta será tratada como un post aparte para mayor comodidad. Que tengan un excelente dia.

Atte.
Santiago Glandarelli

martes, 2 de agosto de 2011

#003 - Access Control List

En la nota anterior, si bien no poseo dotes de profesor intenté explicar de la mejor manera como es que funcionan los permisos en sistemas Unix y derivados.

Ahora bien, ¿Es el único método de control que tenemos para evitar que cualquier usuario tenga acceso a nuestros archivos o directorios?

No. Para esta función (Y algúna otras mas) se utilizan las denominadas "ACL's".

Por defecto, no vienen incluídas en la instalación regular del sistema. Prometo que en alguna próxima entrada voy a explicar como es que se instala y configura esta utilidad.

A diferencia de los permisos regulares, este tipo de "Permisos Especiales" no permiten, por ejemplo, que todos los miembros del grupo "dba" puedan acceder al filesystem "oracle".

Son mas específicos porque trabajan a nivel usuario sin necesitar que este sea el dueño del archivo o directorio, o que sea miembro del grupo al cual pertenece dicho objeto.

Por ejemplo:

sglandar@e500 ~ $ ls -lh estoesunscript.sh
-rw-r----- 1 sglandar sglandar 666M 2011-06-22 00:28 estoesunscript.sh

El usuario sglandar tiene permisos de lectura y escritura sobre el archivo dado que es el dueño del mismo. A su vez, si no fuese el dueño del archivo, podría leerlo porque es miembro del grupo al que el archivo es miembro (sglandar)

¿Qué pasa? Ninguna otra persona podrá leer ese archivo dado que no tiene permisos sobre el mismo.

Pero, yo quiero que el usuario sperez pueda leerlo y modificarlo.

Lo mas sencillo sería hacer miembro a sperez del grupo sglandar. Pero el podría tener acceso a todos los archivos que fuesen miembros del grupo y no es lo que se necesita en este momento. Por lo cual, para ser mas específico voy a hacer uso de un Access Control List.

Al igual que ls -l me mostraría entre otras cosas, los permisos del archivo, el comando utilizado para verificar el estado de las ACL es el siguiente:

sglandar@e500 ~ $ getfacl estoesunscript.sh
# file: estoesunscript.sh
# owner: sglandar
# group: sglandar
user::rw-
group::r--
other::---

¿Para que nos sirve getfacl?
El man lo define como "get file access control lists" lo cual en castellano, sería mas o menos "obtener lista de control de acceso del archivo".

Ahora, una vez que ya tenemos definido en que estado se encuentra, ¿Cómo lo modificamos?

Simple, hacemos uso del comando setfacl.

sglandar@e500 ~ $ sudo setfacl -m u:sperez:rxw estoesunscript.sh

sglandar@e500 ~ $ getfacl estoesunscript.sh
# file: estoesunscript.sh
# owner: sglandar
# group: sglandar
user::rw-
user:sperez:rwx
group::r--
other::---

sglandar@e500 ~ $ ls -lh estoesunscript.sh
-rw-r-----+ 1 sglandar sglandar 666M 2011-06-22 00:28 estoesunscript.sh

Cabe destacar que el símbolo + que aparece junto al listado de permisos del fichero nos indica que existen permisos controlados por la ACL que no están reflejados en la lista tradicional.

Eso es todo, ahora el usuario sperez tiene permisos de lectura y escritura sobre el archivo.

Cualquier duda o pregunta, no duden en hacermela saber.

Atte.
Santiago Glandarelli

#002 - Permisos en sistemas Unix Based (GNU/Linux, Unix)

En sistemas operativos de la rama Unix, todo lo que se encuentra dentro de ellos se trata como si fuera archivos.

- Terminales
- Dispositivos
- Periféricos
- Directorios
- Etc.


Pero para poder hacer uso de los mismos, primero debemos entender que se aplican ciertos filtros para que no todos los usuarios tengan acceso a verlos, ejecutarlos y/o modificarlos. Dichos filtros, son conocidos como Permisos.

Cuando listamos un archivo con el comando ls -lh este nos devuelve la información "completa" del archivo.

# ls -lh
-rwxr-xr-x 1 saglanda admin           10.3K Feb  4 21:02 archivo


La misma está dividida de la siguiente forma. 

-rwxr-xr-x     Tipo de archivo y permisos     
1                    Cantidad de links existentes al archivo
Saglanda       Usuario dueño del archivo
admin            Grupo dueño del archivo
10.3K            Tamaño del archivio específicado en KiloBytes (Gracias a la opcion -h del ls)
Feb                Mes de la última modificación del archivo.
4                    Día de la última modificación del archivo.
21:02             Hora de la última modificación del archivo.
archivo          Nombre del archivo.
       
En este caso solo vamos a centrarnos en el primer campo: Tipo y Permisos del Archivo.

Tipos de archivo:
- Archivo normall Enlace Débil (Soft Link)
b Block-oriented device file (Archivos especiales de dispositivo)
c Character-oriented device file
p Fifo o Pipe
d Directorio

Permisos de archivo: Los permisos sirven en linux para limitar el acceso y privilegios de determinados usuarios a ciertos archivos o directorios. Los permisos se organizan en tres grupos. El primero se refiere al usuario dueño del archivo, el segundo se refiere al grupo al cual pertenece el archivo y el tercero a todos los demás.

Los permisos se pueden asignar de forma octal (numérica) o con combinaciones de letras.
R
Read (Lectura)
W Write (Escritura)
X Execute (Ejecución).


La forma octal, a diferencia de la anterior está diseñada en base binaria. Teniendo en cuenta que el 1 es un On y el 0 es un Off.


R W E
0  0  0  =  0      Ningún permiso (Lectura = 0 + Escritura = 0 + Ejecución = 0)
0  0  1  =  1      Permiso de Ejecución (Lectura = 0 + Escritura = 0 + Ejecución = 1)
0  1  0  =  2      Permiso de Escritura (Lectura = 0 + Escritura = 2 + Ejecución = 0)
0  1  1  =  3      Permiso de Escritura y Ejecución (Lectura = 0, Escritura = 2, Ejecución = 1)
1  0  0  =  4      Permiso de Lectura (Lectura = 4 + Escritura = 0 + Ejecución = 0)
1  0  1  =  5      Permiso de Lectura y Ejecución (Lectura = 4 + Escritura = 0 + Ejecución = 1)
1  1  0  =  6      Permiso de Lectura y Escritura (Lectura = 4 + Escritura = 2 + Ejecución = 0)
1  1  1  =  7      Permiso de Lectura, Escritura y Ejecución (Lectura = 4 + Escritura = 2 + Ejecución = 1)


Ahora bien, volviendo al ejemplo anterior. ¿Que permisos tiene el archivo?

# ls -lh
-rwxr-xr-x 1 saglanda admin           10.3K Feb  4 21:02 archivo

Tipo de archivo:  -           # Es un archivo normal
Usuario Dueño:   rwx       # El usuario dueño puede leerlo, modificarlo y ejecutarlo
Grupo Dueño:     r-x        # Los miembros del grupo dueño pueden leerlo y ejecutarlo
Otros:                 r-x        # Todos los demas usuarios del sistema pueden leerlo y ejecutarlo

¿Quedó claro? Voy a hacer de cuenta que si.

Entonces, si yo quisiera cambiar los permisos de este archivo para que solo yo sea quien tiene acceso a el. ¿Como puedo modificar esos permisos? Para esto existe el comando chmod

chmod [opciones] [permisos] <Archivo/Carpeta>

Este comando se aplica sobre todo tipo de archivos o carpetas. En el caso de que sean carpetas podemos usar la opcion -R para dar permisos recursivamente a todas las carpetas y ficheros que contenga.


# chmod 700 archivo
o bien
# chmod u=rwx,go= archivo

Obviamente, el comando chmod contiene muchas más opciones y formas de asignar permisos. Para mas información, teclear en cualquier terminal man chmod.
Por lo pronto, no tengo mas que aportar. En las siguiente notas voy a profundizar un poco mas el tema de permisos.

Atte.
Santiago Glandarelli