miércoles, 28 de mayo de 2008

Servidor de correo con Ubuntu 8.04

En este artículo abordaremos la implementación de un servidor de correo utilizando solamente software libre.

Su sistema operativo será Ubuntu 8.04, y el MTA (Mail Transfer Agent) será Postfix.

Fase I: Instalación del sistema operativo

Bueno, como ya se debe estar pensando, esta fase no presenta ningún problema en sí mismo, dado que la instalación que se seguirá es la del sistema operativo Ubuntu 8.04 Server por omisión.

Comienza con el booteo, se selecciona el lenguaje (yo elegí "English"), luego por la zona en la cual me encuentro (yo elegí "other", y luego "South America - Argentina"), luego por el teclado, donde seguí todas las instrucciones hasta que detectó que el teclado de seguro estaba configurado como "latam".

Configuró sólo la tarjeta de red, y por un error de planificación, levantó su dirección IP desde un servidor de DHCP. Eso no hace sino más interesante la tarea, dado que también debo explicar aquí cómo hacer para que se fije una dirección IP. El nombre que elegí para el servidor, en un esfuerzo de imaginación, fue "mailer".

Luego configuró el reloj, particioné el disco (en la sección "Partition Disks" elegí "Manual", luego generé tres particiones, la /dev/sda1, de sólo 150 MB, para /boot, la /dev/sda2, de 1.5 GB, para swap, y la /dev/sda3, del resto, para /), instaló todos los paquetes básicos del servidor, lo cual me llevó menos de 15 minutos, y me solicitó la creación de un nuevo usuario, que será luego el que hará "sudo" cuando sea necesario.

Luego de eso, le avisé que no estaba usando ningún proxy, se realizó la configuración automática de "apt", me pidió que seleccione qué paquetes de software quería instalar, en base a la función del equipo (DNS, LAMP, Mail, OpenSSH, PostgreSQL, Print ó Samba server, de las cuales no seleccioné ninguna, dado que me ocuparé luego de esa instalación de una forma más personalizada y selectiva de paquetes), comenzó la instalación de software (Select and Install software), realizó automáticamente la instalación del GRUB, y finalizó la instalación, con reboot.

En el primer booteo parecía que el servidor estaba colgado, dado que tardó un poco más de lo normal para un equipo de sus características (casi 15 segundos en dar alguna señal de vida), pero a continuación levantó perfectamente.

El nombre del equipo es, sencillamente, "mailer".

Al realizar un "ifconfig -a" encontré que la dirección IP, efectivamente, coincidía con una del rango del DHCP Server que tengo conectado a la red, por lo que ahora comienza la parte donde configuramos la dirección IP final de la tarjeta de red.

Ingresé como el usuario que había configurado, y cambié mi personalidad (no es recomendable trabajar como root siempre) haciendo "sudo /bin/bash". Me pidió la contraseña mía propia, y pude obtener el tan amado prompt "#". Todas las siguientes tareas serán realizadas mediante la cuenta del usuario generado, y el "sudo /bin/bash".

Edité el archivo "/etc/network/interfaces" para que su contenido sea:

auto lo
iface lo inet loopback

iface eth0 inet static
address 192.9.200.20
netmask 255.255.255.0
gateway 192.9.200.1

network 192.9.200.0
broadcast 192.9.200.255

auto eth0

...dado que la dirección de red que le quiero dar es la 192.9.200.200, suponiendo que esa es una dirección pública válida (obviamente, quien alguna vez tuvo algún contacto con Internet desde el punto de vista serio, sabe que no lo es).

Edité el archivo "/etc/resolv.conf", agregándole los que son mis dos servidores de DNS:

nameserver 200.42.0.108
nameserver 200.42.0.109
domain hecsa.com.ar

Ahora, para verificar que todo quedaba como es debido, relancé los procesos de red mediante "/etc/init.d/networking restart"

El siguiente paso, dentro de lo que es el sistema operativo en sí mismo, consistió en instalarle el paquete OpenSSH Server, lo cual hice como siempre, con "apt-get install openssh-server"

Fase II: Vamos por los paquetes

Ahora, lo jugoso. Se viene la instalación del sistema de correo electrónico, se viene!!!

Vamos a comenzar instalando los paquetes que sean necesarios, y para eso, también como siempre, realizaremos las actualizaciones que correspondan.

Para eso, la receta de cocina adecuada es ejecutar "apt-get update", y "apt-get upgrade", aceptando las actualizaciones que nos proponga nuestro amigo "mailer". Se recomienda, luego de esto, realizar un nuevo reboot, sólo por si las actualizaciones han sido profundas, y sus efectos, luego de un "reboot", son requeridos.

Ahora, con los últims paquetes instalados, procedemos a instalar los que serán necesarios para nuestro servidor de correo electrónico, a través de los siguientes comandos:

# apt-get install postfix courier-imap courier-pop mailx

Pocos paquetes, no? Bueno, esto nos va a dejar bajando cerca de 10 MB de paquetes, lo cual nos permite tomar algún café en el medio de la implementación, que nunca viene mal.

Cuando instalemos el paquete postfix, se nos preguntará qué tipo de sistema queremos, a lo cual responderemos que el mismo será un "Internet Site". Acto seguido, nos pedirá que agreguemos un valor para el dominio, considerando que los mails salientes que no lo posean lo terminarán teniendo como agregado. Si bien en este caso la opción por default es el hostname completo, se deberá colocar el nombre del dominio del cual saldrán los mensajes.

Cuando instalemos los paquetes courier-imap y courier-pop, veremos que se nos pregunta si queremos generar algunos directorios del tipo Maildir para algunos usuarios, a lo cual responderemos que no.


Fase III: A configurar todo

Por suerte, la simplicidad de estos paquetes nos llevarán a no tener que configurar demasiadas cosas cuando lo que queremos es un servidor de correo para un solo dominio, por lo que en general, veremos que los pasos son pocos, y sencillos.

El primer archivo que tocaremos será el "/etc/postfix/main.cf". Allí configuraremos lo siguiente:

smtpd_banner = Cualquiera (OpenCualquiera)
biff = no

append_dot_mydomain = no

readme_directory = no

smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

myhostname = mailer.dominio.com.ar
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = dominio.com.ar, mailer.dominio.com.ar, localhost.dominio.com.ar, localhost
relayhost =
mynetworks = 192.9.200.0/24, 192.168.100.0/24, 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 # Redes desde las cuales permito que se envíen mails.
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/ # Este es el formato del mail, maildir, y en cada home directory habra un subdirectorio llamado Maildir, que contendra cur, tmp y new.
mailbox_command =

Por ahora, no tengo que tocar nada más, ya que el mismo courier-imap y courier-pop se han ocupado de configurarse como es debido.


Fase IV: Seguridad

Ahora bien, con la configuración anterior, tendremos un excelente servidor de correo, pero será un blanco perfecto para cuanto spammer haya dando vueltas, por lo que se recomienda seguir estos pasos para asegurar que no terminaremos en una blacklist de spam.

Fase IV-A: Shorewall

Como este servidor tiene más de una tarjeta de red (véase que hay dos en la declaración de mail.cf, una con IP 192.9.200.x y la otra con 192.168.100.x), se ha configurado la misma desde el archivo "/etc/network/interfaces":

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.9.200.20
        netmask 255.255.255.0
        network 192.9.200.0
        broadcast 192.9.200.255
        gateway 192.9.200.1
        dns-nameservers 200.42.0.108 200.42.0.109
        dns-search dominio.com.ar

auto eth1
iface eth1 inet static
        address 192.168.100.250
        netmask 255.255.255.0
        network 192.168.100.0
        broadcast 192.168.100.255

Ahora, comenzaremos a realizar la configuración del paquete shorewall. Primero, lo instalamos con el comando "apt-get install shorewall shorewall-doc".

Una vez que tengamos estos dos paquetes instalados, procederemos a configurar sus archivos, de la siguiente manera:

cp /usr/share/doc/shorewall-common/default-config/interfaces /etc/shorewall/ vi /etc/shorewall/interfaces

En este archivo agregaremos las definiciones de nuestras dos tarjetas de red:

net eth0 detect dhcp,tcpflags,logmartians,nosmurfs

net eth1 detect dhcp,tcpflags,logmartians,nosmurfs

Luego:

cp /usr/share/doc/shorewall-common/default-config/zones /etc/shorewall/ vi /etc/shorewall/zones

Aquí configuraremos las dos zonas que estaremos utilizando, es decir, la de la red, y la del firewall en sí mismo:

net ipv4

Luego:

cp /usr/share/doc/shorewall-common/default-config/hosts /etc/shorewall/

Luego:

cp /usr/share/doc/shorewall-common/default-config/policy /etc/shorewall/ vi /etc/shorewall/policy

Aquí agregaremos las políticas que deseamos:

$FW net ACCEPT

net $FW DROP info

net all DROP info

# Esta politica debe estar al final

all all REJECT info

Luego:

cp /usr/share/doc/shorewall-common/default-config/routestopped /etc/shorewall/ vi /etc/shorewall/routestopped

Y agregamos:

eth0 0.0.0.0 routeback

eth1 0.0.0.0 routeback

Luego:

cp /usr/share/doc/shorewall-common/default-config/rules /etc/shorewall/ vi /etc/shorewall/rules

Y agregamos:

SSH/ACCEPT net $FW

Ping/ACCEPT net $FW

# Permit all ICMP traffic FROM the firewall TO the net zone

ACCEPT $FW net icmp

# mail lines

SMTP/ACCEPT net $FW

SMTPS/ACCEPT net $FW

Submission/ACCEPT net $FW

IMAP/ACCEPT net $FW

IMAPS/ACCEPT net $FW

POP3/ACCEPT net $FW

#web

Web/ACCEPT net $FW

Chequearemos que todo esté correctamente configurado mediante:

shorewall check

Editamos "vi /etc/default/shorewall" y modificamos el valor de "startup" para que esté en 1:

startup=1

Ahora, si queremos, podemos realizar un reboot y ver cómo levantan todos los servicios implementados, inclusive los del firewall (shorewall - realmente iptables)

Fase IV-B: Fail2ban

Si bien en este mismo blog habrán visto algunos detalles sobre cómo implementar estar herramienta, les cuento que la misma ha cambiado desde la publicación de este artículo, por lo que ahora veremos la versión que se puede implementar desde un servidor Ubuntu 8.04 (fail2ban 0.8.2-2).

Comenzamos instalando un paquete como lo hacemos siempre, mediante la ejecución de "apt-get install fail2ban".

Una vez instalado, sólo les recomiendo que modifiquen el archivo "/etc/fail2ban/jail.conf" de la siguiente forma:

destemail = yo@dominio2.com.ar

De esa manera, cada vez que algún caco de la información y el ancho de banda quiera ingresar y falle por más de cierta cantidad de veces, le llegará un mail a esta dirección, aparte de deshabilitar a la dirección IP de origen.

Recordemos que siempre luego de hacer cualquier modificación a los archivos del fail2ban, tendremos que relanzar sus procesos mediante "/etc/init.d/fail2ban stop" y "/etc/init.d/fail2ban start".

Fase IV-C: Postgrey

Ahora, uno de los platos fuertes de esta noche, aparte de todo lo que vimos antes. Vamos a implementar el sistema postgrey, que no es ni más ni menos que un greylisting para el servidor de correos Postfix.

El principio del proceso es el mismo de siempre, debemos instalarlo con el comando "apt-get install postgrey".

Luego, tendremos que modificar el archivo "/etc/postfix/main.cf" para que comience a utilizar este sistema. Le agregaremos las siguientes líneas:

smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        check_policy_service inet:127.0.0.1:60000

Y finalmente relanzamos los procesos del postfix para que se tomen los cambios ("/etc/init.d/postfix stop" y "/etc/init.d/postfix start").

domingo, 25 de mayo de 2008

Servidor Hogareño - Versión GNU/Linux

Este artículo tendrá por objeto dar las explicaciones necesarias para poder montar un servidor hogareño basado en GNU/Linux. Los servicios que se pretenden brindar son: DHCP, PDC, FileServer, Proxy, y Filtrado de Páginas. Si hay tiempo, un servidor del tipo Portal estaría también muy bueno.

La versión de GNU/Linux elegida, en este momento, es la Ubuntu 8.04, que si bien ha demostrado que no es la más rápida, por lo menos está basada en paquetes .deb, verifica de una forma medianamente coherente dependencias, y permite su actualización con un grado bastante sencillo de tareas.

El primer punto ha sido instalar la distribución por default, generando una partición de 8 GBpara el swap, y de 130 GB para /.

Lo ideal no es dejar todo el contenido del primer disco sin dividir filesystems, pero en este caso, como el servidor tendrá características hogareñas, no hace falta más.

Cayendo sin red

Mi motherboard es un ASUS P5GC-MX/1333, que tiene una tarjeta de red Attansic L2, por supuesto, como me gustan los desafíos, no soportada directamente por Ubuntu 8.04. Y digo no soportada directamente, porque si bien el driver aparece dentro de los existentes en esta versión, sencillamente no funcionan con este motherboard. Los módulos de esta tarjeta de red aparecen como cargados al ejecutar un "lspci", pero no funcionan, lo cual nos lleva, ante todo, a tener que buscar un nuevo driver, que deberá funcionar mejor que éste.

Efectivamente, con el motherboard me llegó un CD con drivers. Entre ellos, encontré que aparecía un directorio llamado "LinuxDrivers". Excelente, me dije, y sin pensarlo, seguí el procedimiento necesario para compilarlos. Nada más inútil, porque llegué a un mensaje de error que me decía que no tenía el directorio /usr/src/linux-headers-2.6.24-16-generic. No hay problema, utilicé el ingenio, y saqué de internet, en otra máquina, desde el sitio packages.ubuntu.com, esos paquetes y sus dependencias. Los grabé en un memory stick, y los instalé en el equipo.

Para poder compilar lo que necesitaba, sin saber si era o no necesario, pero sabiendo que en algún momento lo sería, instalé, desde el CD de Ubuntu, el paquete build-essential.

Pero tampoco funcionó, dado que me apareció, al ejecutar "make", un mensaje haciendo referencias a problemas de CFLAGS, requiriendo que se modifiquen los parámetros para que se utilicen EXTRA_CFLAGS. Cuando estaba a punto de darme por vencido, y comenzar con alguna otra distro, que me diera más y mejores drivers (según tengo entendido, ya hay varias que así lo hacen), encontré un código fuente dedicado a esta tarjeta, que se encuentra en http://people.redhat.com/csnook/atl2/atl2-2.0.4.tar.bz2 . Lo bajé, lo compilé, y el módulo atl2.ko resultante, lo copié a /lib/modules/2.6.24-16-generic/ubuntu/net/atl2/atl2.ko.

Rebooteé el equipo, y la configuración de red comenzó a funcionar. La familia, contenta. Ahora puedo hacer un "apt-get update", y que funcione. Lo sé, no me olvidé de comentar las entradas del CD de Ubuntu en "/etc/apt/sources.list".

Conexión vía terminal y VNC

Una de las primeras cosas que necesité, fue el servidor OpenSSH, dado que me resultaría más cómodo trabajar con el servidor de esta manera, en forma remota. Para ello, instalé el paquete openssh-server con el comando "apt-get install openssh-server". El sistema bajó también el "libssl0.9.8.0.9.8g-4ubuntu", el "openssh-client", y el "openssh-blacklist". Luego de la instalación, y sólo para ver si todo levantaba correctamente desde el principio, rebotee el sistema.

Una cosa que me encantó de este motherboard es que un reboot dura menos de 30 segundos. Increíble.

Inmediatamente después, me pude conectar desde otros equipos sin problemas:

login as: hecsa
hecsa@192.9.200.2's password:
Linux dshecsa01 2.6.24-16-generic #1 SMP Thu Apr 10 13:23:42 UTC 2008 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
hecsa@dshecsa01:~$

Excelente, el primer paso estaba dado!

Ahora, vamos por la conexión vía VNC. Como es sabido, el paquete a instalar es el vncserver.

Al hacer un "apt-cache search vncserver", encontré que uno de los listados era el "vnc4server". Lo instalé con el comando "apt-get install vnc4server", y posteriormente lo inicié con el comando "vncserver". Así de sencillo.

Ahora bien, la primera imágen es que el entorno en sí se veía bastante básico, por lo que descomenté las siguientes dos líneas en el archivo $HOME/.vnc/xstartup, para que levante por VNC un entorno más completo, como el que tengo en la consola del equipo:

unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

Claro que lo que el sistema quiere es levantar el TWM, que no tenía instalado, por lo cual ejecuté "apt-get install twm". Reinicé el servidor con los comandos "vncserver -kill :1", y "vncserver", y todo quedó de maravillas.

Compartiendo los archivos

Por supuesto, lo que debía hacer ahora era instalar el servidor Samba, y configurarlo para que pueda funcionar como un PDC.

Primer paso, instalar el paquete samba: "apt-get install samba".

El paquete aparentemente, se instaló correctamente, pero arrojó unos mensajes extraños, que luego analizaré (Veremos el resultado de este análisis en el apéndice dedicado a tales fines):

tdbsam_open: Converting version 0 database to version 3.
account_policy_get: tdb_fetch_uint32 failed for field 1 (min password length), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 2 (password history), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 3 (user must logon to change password), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 4 (maximum password age), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 5 (minimum password age), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 6 (lockout duration), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 7 (reset count minutes), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 8 (bad lockout attempt), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 9 (disconnect time), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 10 (refuse machine password change), returning 0

Ahora, pasaremos a la configuración, que calculo que no será una tarea menor. Veamos cómo transformamos este servidor en un Samba PDC.

Para eso, lo primero que hago es generar un archivo "/etc/samba/smb.conf" como el siguiente:

[global]
workgroup = GRUPETE
netbios name = SERVER1
server string = %h server
obey pam restrictions = Yes
passdb backend = tdbsam
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n .
log level = 2
log file = /var/log/samba/log.%m
max log size = 1000
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
add user script = /usr/sbin/useradd -m %u
delete user script = /usr/sbin/userdel -r %u
add group script = /usr/sbin/groupadd %g
delete group script = /usr/sbin/groupdel %g
add user to group script = /usr/sbin/usermod -G %g %u
add machine script = /usr/sbin/useradd -d /var/lib/nobody -s /bin/false -M %u
logon script = %U.cmd
domain logons = Yes
os level = 65
domain master = Yes
dns proxy = No
wins support = Yes
ldap ssl = no
panic action = /usr/share/samba/panic-action %d
invalid users = bin, daemon, sys, man, postfix, mail, ftp
admin users = @wheel

[homes]
comment = Home Directories
valid users = %S
read only = No
create mask = 0700
directory mask = 0700
browseable = No
dont descend = profile

[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon
share modes = No

[printers]
comment = All Printers
path = /tmp
create mask = 0700
printable = Yes
browseable = No

[print$]
comment = Printer Drivers
path = /var/lib/samba/printers

[archive]
comment = Directorio Archivos
path = /archivos
valid users = @interno, root
read only = No
create mask = 0770
directory mask = 0770
browseable = No

Ahora, a generar los usuarios. Comienzo por el mío, así que como sé que está generado en el sistema GNU/Linux, ejecuto "smbpasswd -a hecsa".

Inmediatamente, o mejor dicho, luego de esperar unos minutos, pude levantar desde una máquina separada los directorios compartidos mediante el protocolo de Samba. Otro éxito, y ya van varios!

Dame una dirección, por favor

Ahora, le llegaba el turno al servidor DHCP, que tantas alegrías nos da siempre.

Lo primer, es instalar el paquete que nos dará este servicio. Al hacer un "apt-cache search dhcpd" encontré a mi viejo amigo y aliado "dhcp3-server", que como siempre, instalé con el comando "apt-get install dhcp3-server".

Lo interesante es que luego de instalarlo, aparecen estos mensajes:

* Starting DHCP server dhcpd3 [fail]
invoke-rc.d: initscript dhcp3-server, action "start" failed.

Pero al mirar archivos como el "/var/log/messages", o el "/var/log/daemon.log", no encontramos más que mensajes de subida el dhcpd, lo cual desconcierta bastante.

Para evitar seguir hurgando en detalles extravagantes, sencillamente dejé el archivo "/etc/dhcp3/dhcpd.conf" de la siguiente forma:

option domain-name "hecsa.com.ar";
option domain-name-servers 200.42.0.108, 200.42.0.109;

default-lease-time 600;
max-lease-time 7200;

subnet 192.9.200.0 netmask 255.255.255.0 {
range 192.9.200.220 192.9.200.230;
option routers 192.9.200.1;
option domain-name-servers 200.42.0.108, 200.42.0.109;
authoritative;
}

host hecsadv {
hardware ethernet 00:13:02:61:23:C4;
fixed-address 192.9.200.142;
}

A que no se imaginan qué pasó cuando levantó de nuevo el servicio dhcpd, con los comandos "/etc/init.d/dhcp3-server stop" y "/etc/init.d/dhcp3-server start"? Mírenlo ustedes mismos:

root@dshecsa01:/etc# /etc/init.d/dhcp3-server stop
* Stopping DHCP server dhcpd3 [fail]
root@dshecsa01:/etc# /etc/init.d/dhcp3-server start
* Starting DHCP server dhcpd3 [ OK ]

Sí, así es...quedó funcionando. Ya tenemos servidor de direcciones, y hasta una dirección fijada para una de las máquinas de la red. Qué tal, eh?

Servidor Proxy

Nada más sencillo que instalar un servidor proxy en GNU/Linux, y ni que hablar sobre Ubuntu.
Lo único que tendremos que hacer es ejecutar "apt-get install squid".
Ahora viene la parte de la configuración, que si bien tampoco es complicada, merece que se explique de forma adecuada para evitar problemas.
Lo primero que tendremos que hacer es ingresar al directorio /etc/squid, y copiar el archivo instalado por omisión, squid.conf, como squid.conf.original, o lo que querramos que sea.
Ahora, lo editaremos, y le cambiaremos las siguientes líneas:

visible_hostname dshecsa01
acl mi_red src 192.9.200.0/24
http_access allow mi_red

Ahora, bajamos y subimos el squid con el set de comandos "/etc/init.d/squid stop" y "/etc/init.d/squid start", y todo queda funcionando.

Apéndices

Solución de backup

Para realizar backups, y dado que remarco la característica de "hogareño" de este servidor, nada como un buen DVD-RW.

Para poder usarlo con GNU/Linux, nada como implementar el excelente programa K3B, realmente una versión mejorada de cualquier programa de grabación de CD/DVD que haya visto.

Como siempre, lo instalo con el comando "apt-get install k3b". Pero como el K3B requiere de otros programas para funcionar perfectamente, ejecuto también "apt-get install normalize-audio", "apt-get install sox", "apt-get install transcode", "apt-get install vcdimager", y me faltaría algo que levante el eMovix, pero por ahora no lo encuentro. Con lo que tengo, ya podré realizar la mayor parte de todas las cosas que generalmente hago con un programa como el K3B.

viernes, 9 de mayo de 2008

Diario íntimo de mis experiencias con OpenSolaris en una HP DV5000

Prefacio
Veremos que la primer instalación de OpenSolaris corresponderá a la 2008.05, que es la que me ha llegado a mis manos en este momento. A medida que vaya actualizando el sistema operativo, encontraremos en el futuro modificaciones a este blog basándonos en estas novedades.
Bueno, gracias a la llegada a mis manos del tan esperado Indiana, decidí instalarlo en mi notebook HP DV5000, desde la cual estoy escribiendo este artículo (eso quiere decir que instalarlo pude, y fue bien sencillo).
Símplemente, reventé mis particiones de GNU/Linux (no lloren, tengo otra de mis máquinas que tiene instalada la versión que hasta ahora veo con mayor performance del mercado, que es Arch Linux), y decidí comenzar con el proceso de booteo desde el LiveCD, para luego darle un click en el ícono de "Install OpenSolaris".
Todo se instaló perfectamente. Pude setear los locales en español, que en este momento ya me parece una rareza para lo que venía siendo OpenSolaris (o mejor dicho, antes de OSOL 2008.05, lo que era el SXDE y el SXCE), y tengo un bonito escritorio con el Compiz instalado, gracias a haber habilitado los efectos de escritorio. Para esto, sólo hice un click derecho sobre el escritorio, y cuando abrí el selector de fondos de escritorio, elegí habilitar los efectos. Nada más, y absolutamente igual a cualquier escritorio que haya instalado en esta misma máquina.
Lo que vengo probando de funciones de Internet realmente funcionan muy bien, está bastante aceitado, y es hasta más rápido que en el entorno Ubuntu que tenía antes (eso no es raro, Ubuntu ya hace tiempo que tardaba en bootear hasta más que Windoze eXtraPollution SystemPanic 2, que no es poco).
Ahora bien, comienzo este blog para registrar las vueltas que tendré que dar hasta tanto tenga configurado todo de la forma que debiera.

Sonamos
Comienzo por el sonido, que por lo visto, es parte de las figuritas difíciles de OpenSolaris.
Mi tarjeta de sonido, según la salida del comando /usr/X11/bin/scanpci es:


-bash-3.2# ./scanpci | grep -i audio
Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller


Los primeros indicios que encontré en la red son poco alentadores, así que me tendré que poner a ver cómo hago que esta belleza me entregue el primer mp3 como la gente.

Así es que me bajé de la página del proyecto OSS el paquetito famoso, y lo instalé:


-bash-3.2# pkgadd -d oss-solaris-v4.0-1015-i386.pkg

The following packages are available:
1 oss Open Sound System
(i386) v4.0-1015

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]:

Processing package instance from
...
Using as the package base directory.
## Processing package information.
## Processing system information.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.

This package contains scripts which will be executed with super-user
permission during the process of installing this package.

Do you want to continue with the installation of [y,n,?] y

Installing Open Sound System as

## Installing part 1 of 1.
...
[ verifying class ]
[ verifying class ]
## Executing postinstall script.
Setting up Open Sound System....please wait
add_drv -m '* 0666 root sys' osscore
add_drv -m '* 0666 root sys' -i '"pci8086,27d8"' hdaudio
add_drv -m '* 0666 root sys' -i '"usbif,class1"' ossusb
add_drv -m '* 0666 root sys' vmix
add_drv -m '* 0666 root sys' sadasupport

Open Sound System installation complete

You can use the osstest command to test audio playback in your system.

It may be necessary to reboot the system before all devices get properly
detected by the system.

Installation of was successful.
Rebooteé, ejecuté "osstest", saqué los pedazos de parlante que quedaron pegados en las paredes, y seguí adelante con mi linda máquinita.
Ni hablar de la forma en la que mejoró el sonido cuando levanté el programa gráfico "ossxmix", y cambié, en el jack, la entrada de "mix" por "pcm1". Créanme, suena mejor, por lejos!!!

Samba de mi esperanza
Otra de las cosas que yo, exótico del arte informático quise hacer es montar un espacio compartido de un servidor Samba que tengo en mi casa. Claro, lo que pasa es que yo soy un extraño vicioso, y quiero cosas estrafalarias en mi máquina. Por eso no me funcionó de entrada. Acá les copio la salida inmoral al intentar montar el filesystem famoso:


-bash-3.2# mount -F smbfs -o username=hecsa,password=QueTeImportaPibe //192.9.200.2/hecsarchive /media/samba
mount_smbfs: service "svc:/network/smb/client:default" not enabled.


Divino, no? Claro, montar un filesystem Samba es algo que no es común que la gente haga, así que es muy lógico tener que habilitar un servicio, mandar un cohete a la luna y pensar en la fusión en frío para poder volver a hacer uso de este extraño feature.
Así que me cargué de paciencia, y ejecuté este comando:


-bash-3.2# svcadm enable -r smb/client
Luego de un mensaje que me decía que dependía de varios rezos para que funcione, pude montar mi filesystem, pero con otros flags, como podrán ver aquí:
-bash-3.2# mount -F smbfs //hecsa@192.9.200.2/hecsarchive /media/samba
Password:
-bash-3.2# df -k /media/samba
Filesystem kbytes used avail capacity Mounted on
//hecsa@192.9.200.2/hecsarchive
240362656 170983848 69378808 72% /media/samba


Bien! Primer prueba superada! Ya tengo mi filesystem Samba montado en mi máquina! Juro que mi emoción es sublime. Y casi no tuve que hacer nada.

No me gustaban los horarios de oficina
Bueno, ahora me digo: quiero editar un archivo de "oficina". Oh, sorpresa, en el menú de Oficina sólo tengo el Evince. Parece que en una oficina la gente sólo mira PDF's, por ejemplo.
Vamos, nomás. Instalemos el openoffice, a ver si podemos llegar a la victoria, y tener un sistema de escritorio funcionando como se debe.
Ejecuto los siguientes comandos:
(Para ver qué paquete instalar)


-bash-3.2# pkg search -s pkg.opensolaris.org openoffice
INDEX ACTION VALUE PACKAGE
basename dir opt/openoffice.org2.4/share/registry/modules/org/openoffice pkg:/openoffice@2.4.0-0.86
basename dir opt/openoffice.org2.4/share/registry/modules/org/openoffice pkg:/openoffice@2.4.0-0.86
basename dir opt/openoffice.org/share/registry/modules/org/openoffice pkg:/openoffice@0.5.11-0.79


(Y para instalarlo)


-bash-3.2# pkg install openoffice
DOWNLOAD PKGS FILES XFER (MB)
Completed 1/1 4220/4220 420.64/420.64

PHASE ACTIONS
Install Phase 4798/4798

Luego de un minuto, me aparecieron en el menú los íconos tan gloriosos de todos los productos incluídos en el OpenOffice, y la familia oficinista, contenta...

El compilado de este verano
Ahora bien, como de seguro voy a tener que usar el compilador C para poder hacer uso de cualquier driver que haya que compilar, me decido a buscarlo, simplemente con "which gcc". No está en el path, o directamente no está instalado.
Vamos:
(Para buscar el paquetito)

-bash-3.2# pkg search -s pkg.opensolaris.org gcc
INDEX ACTION VALUE PACKAGE
basename link usr/bin/gcc pkg:/SUNWgcc@3.4.3-0.86
basename link usr/bin/gcc pkg:/SUNWgcc@3.4.3-0.79
basename link usr/bin/gcc pkg:/SUNWgcc@3.4.3-0.75
basename link usr/bin/gcc pkg:/SUNWgcc@3.4.3-0.86
(Y para instalar el bendito paquete)
(Me baja el SUNWgcc, SUNWbinutils, SUNWarc, y el SUNWhea)
-bash-3.2# pkg install SUNWgcc
DOWNLOAD PKGS FILES XFER (MB)
Completed 4/4 2035/2035 88.13/88.13

PHASE ACTIONS
Install Phase 2457/2457


Bien, ahora ya puedo hacer mi "Hola, mundo" sin problemas...bueno, casi...

Permiso, por favor!
Lo cierto es que para poder hacer muchas de las cosas que quiero hacer, necesitaría algo parecido al gtksu, lo cual no pido, por lo que ejecuto:
-bash-3.2# usermod -R root hecsa
UX: usermod: hecsa is currently logged in, some changes may not take effect until next login.
[ACTUALIZACIÓN] Luego de algunas actualizaciones, este efecto ya no aparece. El entorno se ha vuelto bastante dinámico. Creo que estoy viviendo el proceso de construcción de un S.O., pero esta vez, en serio.

Mi primera vez
Sin duda, tiene que tener un apartado especial el dedicado a la primera actualización. Lo intenté realizar desde la interface gráfica, y al menos al primer intento, no pude. La razón? No sé, la veremos luego.
Un delirio que cuando me fijo en el tamaño de lo que tenía que bajar de internet era ni más ni menos que 1900 MB!!!
Encima de eso, la interface sistemáticamente se colgó cuando llegaba a los 1000 MB, por lo que tuve que cerrar la interface gráfica, y volver a abrirla.
No sé qué problema tiene, pero cuatro pulgares para abajo al gestor de paquetes, justamente por haber hecho que baje ni más ni menos que 1 GB de información que luego no sirvió para nada.
Aparte, las descripciones de los upgrades son un chiste.
Me aparecieron sólo cuatro paquetes que actualizar, y con sus dependencias llegamos a ese tamaño abominable.
[ACTUALIZACIÓN] - Luego de determinados updates, las imágenes son más chicas, y el gestor de paquetes ha sido mejorado notablemente. Ahora puedo instalar paquetes desde allí, si bien mi naturaleza de antaño me hace usar CLI. Bien por los desarrolladores, que están haciendo las cosas como se debe!

The (wired) network is the computer
Bueno, le llegó la hora a la tarjeta de red WiFi.
La cuestión es sencilla: en esta maquinita, he instalado los sistemas operativos más estrafalarios que una mente enferma pueda concebir. Y no me refiero sólo a los compatibles con M$ o Linux.
Pero al intentar levantar la tarjeta de red WiFi, oh, sorpresa, ni siquiera se digna a encender su luz.
Al ejecutar un scanpci, como lo hice antes, encontré que la tarjeta es una:


pci bus 0x0006 cardnum 0x00 function 0x00: vendor 0x8086 device 0x4222
Intel Corporation PRO/Wireless 3945ABG Network Connection


Cómo hacemos para que esta verdadera belleza funcione?
Buscando en foros del más allá, encontré uno que mencionaba que era necesario instalar el driver wpi, y por eso ejecuté:


-bash-3.2# pkg search wpi
INDEX ACTION VALUE PACKAGE
basename file kernel/drv/wpi pkg:/SUNWwpi@0.5.11-0.86
driver_name driver wpi pkg:/SUNWwpi@0.5.11-0.86


...quería ver si había algo de ese estilo dando vueltas por ahí.
Pero la sorpresa la tuve cuando quise instalarlo, y me encontré con que ya estaba en el sistema:


-bash-3.2# pkg install SUNWwpi
Nothing to install in this image (is this package already installed?)


Entonces...qué le pasa a la niña?
Bueno, el primer lugar para buscar es en /var/log/messages. Lo que ahí encontré fue esto:


May 10 01:38:38 invid wpi: [ID 133862 kern.warning] WARNING: wpi_init(): timeout waiting for firmware init


Entonces, usamos la munición gruesa:
La salida del comando scanpci -v nos entrega:


pci bus 0x0006 cardnum 0x00 function 0x00: vendor 0x8086 device 0x4222
Intel Corporation PRO/Wireless 3945ABG Network Connection
CardVendor 0x103c card 0x135b (Hewlett-Packard Company, Card unknown)
STATUS 0x0010 COMMAND 0x0046
CLASS 0x02 0x80 0x00 REVISION 0x02
BIST 0x00 HEADER 0x00 LATENCY 0x00 CACHE 0x10
BASE0 0xd2100000 addr 0xd2100000 MEM
MAX_LAT 0x00 MIN_GNT 0x00 INT_PIN 0x01 INT_LINE 0x03


...y el comando prtconf -pv nos entrega:


Node 0x000017
assigned-addresses: 82060010.00000000.d2100000.00000000.00001000
reg: 00060000.00000000.00000000.00000000.00000000.02060010.00000000.00000000.00000000.00001000
compatible: 'pciex8086,4222.103c.135b.2' + 'pciex8086,4222.103c.135b' + 'pciex8086,4222.2' + 'pciex8086,4222' + 'pciexclass,028000' + 'pciexclass,0280' + 'pci8086,4222
.103c.135b.2' + 'pci8086,4222.103c.135b' + 'pci103c,135b' + 'pci8086,4222.2' + 'pci8086,4222' + 'pciclass,028000' + 'pciclass,0280'
model: 'Network controller'
power-consumption: 00000001.00000001
devsel-speed: 00000000
interrupts: 00000001
subsystem-vendor-id: 0000103c
subsystem-id: 0000135b
unit-address: '0'
class-code: 00028000
revision-id: 00000002
vendor-id: 00008086
device-id: 00004222
pcie-capid-pointer: 000000e0
pcie-capid-reg: 00000011
name: 'pci103c,135b'


Cómo sé que se trata de la tarjeta en cuestión, y no de la ethernet? Sencillo, porque en "model" no dice nada de ethernet.
Intenté, entonces, removiendo el driver con el comando "rem_drv wpi", y luego agregándolo de nuevo con "add_drv -i "pci8086,4222" wpi", pero no pasó nada...snif...
[ACTUALIZACIÓN] - Luego de pasar la versión snv_95, todo funciona perfectamente. Me conecto a redes WiFi como con cualquier otro S.O. Brillante!!! Luego de la snv_101a, hasta me aparece un bonito mensaje avisándome de cuanto elemento necesito para saber el estado de la red. Brillante x 2!!!

Ambiente de desarrollo en pleno desarrollo
Bueno, otra de las cosas que deseo de mi escritorio es que me sirva como ambiente de desarrollo.
Para eso, necesito tener instalado por lo menos el Netbeans 6.1, y el Glassfish v2.
El Netbeans 6.1 no está en el repositorio, pero por suerte sí el 6.0.1, que dado mi nivel de desarrollo es más que suficiente para lo que necesito hacer.
El tema viene con el Glassfish, que no está disponible desde el momento en el cual se instala el sistema operativo, como pasó con el OpenOffice.org.
Al final, descubrí la trampita. Hay que hacer un "pkg install glassfishv2", lo cual me muestra un par de cuestiones interesantes.
La primera, que es medio complicado tener que hacer una búsqueda por palabras para saber qué paquete instalar, y la segunda (que es peor que la primera) es que no hay un metapaquete que permita, en el futuro, pasar automáticamente de una versión a la siguiente, si uno lo desea.
Atención, que se entienda bien este punto, no me parece mal que haya un paquete específico para el Glassfish V2, ya que si queremos mantener una versión, y probar con la siguiente, podríamos hacer, en el futuro, "pkg install glassfishv3", por ejemplo; el problema está en los que, como yo, quieren tener metapaquetes para este tipo de programas.
[ACTUALIZACIÓN] - Actualicé a la versión snv_101b, y para mi sorpresa, toda la paquetería de Netbeans quedó en versión 6.5, que es la última y flamante. Realmente, un caño. Mis viejos proyectos siguien siendo reconocidos por la nueva IDE, y cuando los ejecuto, aún funcionan. Mis miedos, por ahora, quedan guardados.

Ojo con las actualizaciones
Atención, y mucho cuidado con las actualizaciones, dado que hay ciertas cosas que nos pueden poner los pelos de punta, sobre todo si nuestra máquina no tiene un dual boot (o aún teniéndolo), o si se hizo la instalación por default, como ocurre en el 100% de los casos que conozco (y eso incluye el uso de ZFS como filesystem por default).
El tema viene cuando al ejecutar "pkg refresh", y luego "pkg image-update", y si por algún motivo se genera un error en la actualización del sistema operativo, ya que quedará un ambiente de booteo absolutamente inutilizable, que sólo rebooteará nuestra máquina, sin ningún sistema operativo.
Ante eso, lo primero que nos vendrá a la mente es hacer un "beadm destroy nombre_del_ambiente". Bueno, dado uno de esos bonitos bugs, ocurrirá que el GRUB quedará completamente vacío, motivo por el cual habrá que encontrar formas bastantes extravagantes de recuperar todo nuestro trabajo sobre el entorno OpenSolaris.
Dado lo anterior, el nivel de recuperabilidad del sistema operativo, en caso de problemas (incluso generados por las mismas "características" del mismo), se puede considerar como prácticamente nulo (al menos en la versión que estoy probando).
[ACTUALIZACIÓN] - Luego de algunas actualizaciones, este problema desapareció por completo, y ahora todo me funciona perfectamente en lo que respecta a boot environments. Cool!
Sumado a lo anterior, encontré algunas cosas interesantes respecto de las actualizaciones, como por ejemplo:
- La actualización a snv_94 nunca funcionó. Sencillamente, el sistema operativo rebooteaba sin parar, por lo que tuve que eliminar el boot environment a mano, con el comando beadm destroy.
- La actualización a snv_95 sí funcionó, pero no me dejó arrancar el Sun xVM (VirtualBox) a menos que antes le configure una variable de ambiente (mensaje: Failed to create COM object), específicamente la LD_NODIRECT=1. Esta solución me ha llevado un buen rato para encontrarla. Espero que no se repita la experiencia. De todas formas, intenté instalar un RH4.5, y luego de todo el proceso de instalación, se queda colgado en "booting the kernel". A seguir remando, que hay agua para rato.
- La actualización a snv_101b fue buenísima, no sólo me instaló las últimas versiones de Netbeans, OpenOffice, etc., sino que aparte cambió mucho de lo que antes no me funcionaba. Se puede decir que ahora me anda todo, inclusive la tarjeta WiFi en forma nativa, cosa que verifiqué hoy mismo.

Resumen general, mi general - Just the facts
Como resumen, sólo se puede pensar en que el OpenSolaris es un buen sistema operativo, sus funciones de virtualización están perfectamente armadas, como pasa con el SXDE y SXCE.
Un aspecto interesante es que automáticamente detectó mi tarjeta gráfica, y la puso a trabajar, inclusive activando el entorno Compiz.