miércoles, 22 de septiembre de 2010

Instalación de un servidor de correo (parte 1)


En cualquier empresa en la actualidad el servicio de correo electrónico es más que indispensable y los costos de software y licencias de software propietario son muy altos. Por lo que el uso de software libre puede ser una buena alternativa.

El correo electrónico en Internet, utiliza principalmente el protocolo SMTP, básicamente la forma en la que se hace el envío es por medio de una aplicación cliente, el usuario redacta un mensaje, al hacer el envío el software cliente lo "sube" a un servidor de correo, éste hace el envío al servidor de la cuenta destino y finalmente este servidor lo agrega al buzón del destinatario.

Este servicio que estoy presentando se basa en el sendmail, nos debe quedar muy claro que esta aplicación actúa como MTA (Mail Transfer Agent), es decir, como un agente de transferencia de correo, por lo que es necesario complementarlo con otras aplicaciones para poder contar con un servicio de correo electrónico empresarial.

Los requisitos que debe cumplir nuestro servidor además de tener instalado el gcc junto con librerías y el make, se debe tener instalado el autoconf y el m4.

Es muy recomendable también tener instalada la base de datos Berkeley DB, es muy fácil encontrarla en cualquier distro, por ejemplo en una instalación completa de Solaris 10 tenemos la versión 4.2.52

Otro programa que es recomendable tener es el procmail, el cual, es llamado LDA (Local Delivery Agent) y se encarga de colocar los mensajes recibidos a su correspondiente buzón (inbox).

En este ejemplo utilice nuevamente mi servidor Ubuntu, lo primero que hice fue instalar por medio del aptitude (en general, prefiero utilizar el aptitude en lugar del apt-get) el m4, autoconf y procmail.

Para la base de datos, baje el fuente desde el sitio de Oracle, lo compilé y lo instalé con el path /usr/local. Desde el subdirectorio generado al descomprimir el archivo:

cd build_unix
../dist/configure --prefix=/usr/local
make
sudo make install
Para que nuestra instalación de sendmail ocurra sin errores, debemos crear los directorios /usr/man/man1, /usr/man/man5, /usr/man/man8, /var/spool/mqueue y /var/spool/clientmqueue, además de la cuenta smmsp con el grupo smmsp, no es necesario que esta cuenta tenga un shell válido.

Los permisos para /var/spool/mqueue deben ser 0700 con propietario root y grupo root, para /var/spool/clientmqueue debe ser 0770 con propietario smmsp y grupo smmsp.

El fuente de sendmail lo obtenemos de su sitio, el más reciente es el de la versión 8.14.4, desde el subdirectorio generado al descomprimir ejecutamos:

sh ./Build -I/usr/local/include -L/usr/local/lib
sudo sh ./Build install
Es muy importante revisar las salidas del script Build, en ocasiones se presentan errores sin que se detenga la ejecución del script, por lo que al final de la corrida aparece como finalizado pero más arriba aparecen errores de que no pudo instalar tal o cual cosa. La mayor parte de las veces en las que ocurre error, es por permisos o algún directorio que haga falta.

Terminado de instalar, vamos a configurar, nos cambiamos al subdirectorio cf/cf, en este subdirectorio vamos a encontrar varios archivos *.mc, de estos solo necesitamos 2, el submit.mc, que aparece tal cual, y el sendmail.mc, el cual, vamos a obtener copiando el archivo que mejor se adapte a nuestro sitio, en mi caso, mi servidor es Linux, por lo que utilicé el archivo generic-linux.mc, lo copié a sendmail.mc. Ya que tenemos estos archivos vamos a compilar e instalar con:

sh ./Build sendmail.cf
sudo sh ./Build install-cf
Para continuar con la configuración del servidor nos cambiamos al directorio /etc/mail

Creamos el archivo de texto local-host-names, en su primer línea, simplemente vamos a escribir el nombre completo del servidor, en mi caso, ubuntu.unixymas.com.mx.

También vamos a crear un archivo vacío aliases, después de esto, vamos a ejecutar:

newaliases
Listo, con esto concluido podemos tratar de iniciar el servicio, vamos a levantar dos procesos, el MTA y otro al que se le denomina MSP (Mail Submission Program) de esta forma:

/usr/sbin/sendmail –bd –q15m
/usr/sbin/sendmail –Ac –q15m
Nota: el path en que se encuentra el sendmail puede variar según la plataforma, por ejemplo, en el caso de Solaris, el sendmail se encuentra en /usr/lib, cierto es que no debería estar ahí, pero por razones de compatibilidad se ha mantenido en ese path hasta la fecha.

Probamos el servicio haciendo un telnet al puerto 25 (SMTP) del servidor:

telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ubuntu.unixymas.com.mx ESMTP Sendmail 8.14.4/8.14.4; Wed, 22 Sep 2010 20:04:44 -0500
ehlo ubuntu.unixymas.com.mx
250-ubuntu.unixymas.com.mx Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-DELIVERBY
250 HELP
mail from:<hajarami@ubuntu.unixymas.com.mx>
250 2.1.0 <hajarami@ubuntu.unixymas.com.mx>... Sender ok
rcpt to:<hajarami@ubuntu.unixymas.com.mx>
250 2.1.5 <hajarami@ubuntu.unixymas.com.mx>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
Subject: Prueba
 
Mensaje de prueba
.
250 2.0.0 o8N14iTY001384 Message accepted for delivery
quit
221 2.0.0 ubuntu.unixymas.com.mx closing connection
Connection closed by foreign host.
Con el comando mail desde la cuenta del destinatario voy a revisar que tengo un nuevo mensaje.

mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/hajarami": 1 message 1 new
>N  1 hajarami@unixymas  Wed Sep 22 20:13   12/508   Prueba
Con esto tenemos un servidor sendmail ejecutando, podemos hacer pruebas enviando mensajes y recibiéndolos utilizando el alpine.

En la próxima entrada, vamos a ver cómo configurar a este servidor para que sea nuestro servidor corporativo.

lunes, 20 de septiembre de 2010

Instalación de un servidor LAMP


En esta ocasión vamos a ver cómo crear un servidor LAMP (Linux, Apache, MySQL, PHP) a partir del código fuente, para esto vamos a utilizar un servidor Linux, en mi caso, voy a emplear Ubuntu en su versión Server 10.04.1, esta distro según DistroWatch es la más popular.

Previamente, instalé el paquete build-essential por medio del aptitude:

hajarami@ubuntu:~$ sudo aptitude install build-essential
Este paquete incluye el gcc, g++, libstdc y make; los cuales, son esenciales para compilar.

Después de esto, instalé un servidor Apache HTTP, esta instalación es igual a la que realice para un servidor Solaris en una entrada anterior.

hajarami@ubuntu:~/lab/httpd-2.2.16$ ./configure --prefix=/usr/local/apache --enable-so --enable-ssl=shared
hajarami@ubuntu:~/lab/httpd-2.2.16$ make
hajarami@ubuntu:~/lab/httpd-2.2.16$ sudo make install
Seguido de esto, instalé un servidor MySQL, en mi caso, lo hice a partir de compilar el archivo fuente que corresponde a Linux Genérico ya que mi intención es mostrar la forma más genérica, sin embargo, el fabricante recomienda utilizar los binarios que corresponden a la distro que se vaya a emplear.

Después de bajar el archivo mysql-5.1.50.tar.gz lo descomprimí en el subdirectorio lab que creé con ese propósito.

hajarami@ubuntu:~/lab$ tar xvzf ../mysql-5.1.50.tar.gz
También instalé 2 paquetes que nos recomiendan, el libtool y el libncurses5-dev

hajarami@ubuntu:~$ sudo aptitude install libtool libncurses5-dev
Se crea una cuenta y un grupo para administrar la aplicación

hajarami@ubuntu:~$ sudo groupadd mysql
hajarami@ubuntu:~$ sudo useradd -g mysql mysql
De acuerdo a la documentación, es recomendable configurar de la siguiente forma:

hajarami@ubuntu:~/lab/mysql-5.1.50$ CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \
> -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler \
> --with-mysqld-ldflags=-all-static
Se compila y se instala:

hajarami@ubuntu:~/lab/mysql-5.1.50$ make
hajarami@ubuntu:~/lab/mysql-5.1.50$ sudo make install
Como último paso se procede a configurar el servidor y arrancarlo, desde la cuenta de root hice lo siguiente:

root@ubuntu:~/lab/mysql-5.1.50# cp support-files/my-medium.cnf /etc/my.cnf
root@ubuntu:~/lab/mysql-5.1.50# cp include/my_compiler.h /usr/local/mysql/include/mysql
root@ubuntu:~/lab/mysql-5.1.50# cd /usr/local/mysql
root@ubuntu:/usr/local/mysql# chown -R mysql:mysql .
root@ubuntu:/usr/local/mysql# bin/mysql_install_db --user=mysql
root@ubuntu:/usr/local/mysql# chown -R root .
root@ubuntu:/usr/local/mysql# chown -R mysql var
root@ubuntu:/usr/local/mysql# bin/mysqld_safe --user=mysql &
Nota: En realidad, la documentación de MySQL no indica que deba copiarse el archivo my_compiler.h, sin embargo, la falta de este archivo provoca un error de compilación en el PHP, por lo que estoy recomendando su copia en forma manual. En la actualidad, casi todo el software libre se compila de la misma manera: config, make y make install; sin embargo, dependiendo de la plataforma, en ocasiones se presentan errores de lo más extraño, es por eso que el compilar se podría considerar un "arte", aquí en este caso se solucionó resolviendo una dependencia no documentada, pero hay veces en la que es necesario incluso el revisar el código que genera error.

Si hasta aquí todo ha salido bien, estamos listos para compilar e instalar el PHP, bajamos el archivo php-5.3.3.tar.gz, en mi ejemplo, instalé un PHP con soporte para zlib y gd, además del soporte a MySQL mejorado.

Lo primero que hice fue instalar los paquetes libpng12-dev y libjpeg62-dev para activar la extensión gd, también instalé el libxml2-dev ya que por default, el PHP instala la extensión XML, después de esto, procedí a configurar, compilar e instalar de la siguiente manera:

hajarami@ubuntu:~/lab/php-5.3.3$ ./configure --prefix=/usr/local/apache2 \
> --with-config-file-path=/usr/local/apache2/conf --with-apxs2=/usr/local/apache2/bin/apxs \
> --with-mysqli=/usr/local/mysql/bin/mysql_config --with-zlib --with-gd
hajarami@ubuntu:~/lab/php-5.3.3$ make
hajarami@ubuntu:~/lab/php-5.3.3$ sudo make install
Copié el archive de configuración recomendado para un ambiente de desarrollo

hajarami@ubuntu:~/lab/php-5.3.3$ sudo cp php.ini-development /usr/local/apache2/conf/php.ini
Agregué al archivo /usr/local/apache2/conf/httpd.conf la siguiente línea:

AddType application/x-httpd-php .php .phtml
Inicié el servidor Apache

hajarami@ubuntu:~/lab/php-5.3.3$ sudo /usr/local/apache2/bin/apachectl start
Y finalmente probé el servidor con una página muy simple en la ruta /usr/local/apache2/htdocs/phpinfo.php

<?php
        phpinfo();
?>

martes, 14 de septiembre de 2010

Instalación de servidor Apache HTTP


Un componente muy importante para una intranet sin duda es el servidor web, el más usado en internet es el Apache HTTP Server.

El fuente lo podemos obtener desde la página de Apache, en mi caso voy a usar el fuente de la versión 2.2.16 por ser el más reciente, básicamente se instalan igual las versiones 1.3 y 2.0, sin embargo, mi recomendación es no instalar una versión menor a la 2.0

Para iniciar la compilación lo primero que debo hacer es asegurarme que tengo en la variable PATH incluidos todos las rutas en las que se encuentran el gcc, el make y demás utilerías que normalmente se emplean para la compilación, para este caso, voy a utilizar nuevamente a Solaris 10, por lo que en el PATH debo incluir a /usr/sfw/bin, /usr/xpg4/bin y /usr/ccs/bin

[solaris10:~]$ echo $PATH

/usr/bin:/usr/sbin:/usr/sfw/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ccs/bin

Ahora si ya estamos listos para compilar.

Lo primero es descomprimir el archivo http-2.2.16.tar.gz en un subdirectorio que cree para esta tarea dentro de mi home directory

[solaris10:~/lab]$ /usr/bin/gtar xvzf ../httpd-2.2.16.tar.gz

Nota: En Solaris hay diferencias entre el comando tar (Estándar) y el gtar (GNU tar), una de ellas es que el tar estándar no tiene la capacidad de comprimir el respaldo. En el caso de las distribuciones Linux el tar utilizado es el GNU

Ya descomprimido, me cambio al nuevo directorio que se creó y procedo a configurar.

[solaris10:~/lab]$ cd httpd-2.2.16

[solaris10:~/lab/httpd-2.2.16]$ ./configure --prefix=/usr/local/apache2 --enable-so --enable-ssl=shared

Los parámetros con los que estoy configurando son:

--prefix: indica que el directorio en el que deseo que se instale la aplicación es /usr/local/apache2
--enable-so: esto va a activar el uso de módulos cargables, los cuales, agregan más funcionalidades al servidor HTTP, está opción es necesaria para hacer una instalación posterior de PHP (la cual, veremos posteriormente)
--enable-ssl: este parámetro nos permitirá la activación del módulo SSL, el cual, vamos a utilizar posteriormente para hacer una instalación de certificados para encriptación de páginas, nótese que estoy indicando con =shared que instale el módulo como un módulo cargable, si no le agregamos esta opción va a instalar el módulo en forma estática.
Después de configurar, procedo a compilar

[solaris10:~/lab/httpd-2.2.16]$ make

Si no aparecen errores estamos listos para instalar, al igual que la instalación anterior de alpine utilizo el sudo para adquirir privilegios de root, es completamente opcional, en su lugar se puede utilizar el comando su, solamente es necesario revisar la variable PATH antes de iniciar la instalación.

[solaris10:~/lab/httpd-2.2.16]$ sudo make install

En caso de no aparecer errores nuestro servidor HTTP está instalado y listo para operar.

Ahora sí, con la cuenta root, nos pasamos al directorio /usr/local/apache2

[root@solaris10:~] cd /usr/local/apache2

En el subdirectorio conf está el archivo de configuración httpd.conf, vamos a editarlo

[root@solaris10:apache2] vi conf/httpd.conf

Buscamos la línea que inicia con la palabra User, voy a cambiar el usuario que indica (deamon) por un usuario que previamente yo cree para que sea el usuario propietario del servicio, es la cuenta web, cuyo grupo principal también se llama web. También voy a modificar la línea que inicia con la palabra Group con web.

User web

Group web

Esta cuenta no debe tener ningún tipo de privilegio y preferentemente debe estar inactiva y con restricciones para no poder iniciar sesión, esta medida es muy recomendable ya que, en el caso que la seguridad de servidor se viera comprometida, al menos no tuviera acceso a información sensible.

Por último, procedemos a levantar el servicio por medio del comando apachectl

[root@solaris10:apache2] bin/apachectl start

Para probar, solo basta utilizar un navegador y abrir la página con la url del servidor, en mi caso http://solaris10.unixymas.com.mx
Esta página nos confirma que el HTTP opera correctamente


lunes, 13 de septiembre de 2010

Configuración de un servidor DNS BIND


Este servidor nos va a permitir implementar el servicio DNS dentro de nuestra red, lo cual, nos va a facilitar el encontrar los servidores con las aplicaciones a las que necesitamos entrar y esto va a ser el punto de partida para nuestra intranet.

Normalmente el BIND se encuentra ya instalado en Solaris y casi en cualquier distro de Linux, lo recomendable es utilizar versiones nuevas de sistema operativo y que sea el mismo sistema de actualización del S.O. el que se encargue de actualizar, la desventaja de esto es que las versiones y funcionalidades disponibles son a criterio del fabricante. Si queremos hacer nuestra propia instalación es muy sencillo, solo se debe obtener el archivo fuente de ISC, compilarlo e instalarlo; la desventaja de esto es que debemos estar muy pendientes de las actualizaciones, especialmente, aquellas en las que la seguridad del servidor se vea comprometida.

En este ejemplo vamos a habilitar un servidor BIND 9 para que pueda resolver direcciones del internet, además de crear una zona para el dominio "unixymas.com.mx".

En internet hay un conjunto de servidores que nos va a permitir resolver direcciones, a estos se les llama "servidores raíz", siempre que lo necesitemos podemos obtener una lista actualizada de estos servidores y que además nos puede ser útil para nuestro servidor, se puede obtener por un ftp anónimo a la IP 198.41.0.6, buscamos y bajamos el archivo named.root o db.cache, son el mismo.

Por convención, el directorio donde vamos a alojar a los archivos con las zonas es el /var/named, si no existe, lo creamos, es posible utilizar otro, siempre y cuando, sea para uso exclusivo del BIND.

También es lo usual nombrar a los archivos con las zonas cómo db.dominio. Por ejemplo, para la zona "unixymas.com.mx" el archivo se va a llamar db.unixymas.com.mx, el archivo con los servidores raíz va a llamarse db.cache, por lo que al archivo que bajamos por ftp lo vamos a renombrar así y lo vamos a depositar en /var/named.

El archivo db.unixymas.com.mx va a incluir en este ejemplo a todos los nodos de mi red interna, es muy recomendable que todos los nodos de nuestra red tengan un nombre, podemos hacer una especificación de nombres genéricos para la mayor parte de las IP's y solo emplear nombres específicos para IP's de servidores, en mi ejemplo, mi red es 192.168.188.0/24, esto quiere decir que tengo direcciones desde la 192.168.188.1 hasta la 192.168.188.254, por lo que decidí nombrar a las direcciones de la forma: 188-1.unixymas.com.mx, 188-2.unixymas.com.mx hasta 188-254.unixymas.com.mx y solo la 192.168.188.138 que es la de mi servidor la voy a llamar solaris10.unixymas.com.mx

$TTL 3h
@      IN SOA solaris10.unixymas.com.mx. webmaster.solaris10.uniymas.com.mx. (
           2010091201 ; serial
           3h ; refresh
           1h ; retry
           1w ; expire
           1h ) ; negative TTL
 
@      IN NS solaris10.unixymas.com.mx.
 
188-1  IN A 192.168.188.1
188-2  IN A 192.168.188.2

solaris10 IN A 192.168.188.138

 
El primer renglón corresponde al tiempo en el que los datos de esta zona deben permanecer en el cache de un servidor DNS (Time To Live), aquí se le indica que deben ser 3 horas.

El carácter @ es una abreviatura que se sustituye por el nombre definido para la zona.

Lo siguiente es el registro SOA, el cual, le otorga la autoridad sobre este dominio al servidor indicado, en este caso, solaris10.unixymas.com.mx, además, indica que la cuenta de correo a la que se puede recurrir para cualquier asunto relacionado a este dominio es webmaster@solaris10.unixymas.com.mx, nótese que no estamos utilizando el caracter @ para la dirección de correo y que al final de las direcciones estamos agregando un punto, es muy importante no olvidarlo. Después de esto hay un paréntesis y continua el registro en las siguientes líneas, en la que dice serial es un número cualquiera y que debe ser actualizado siempre que se realice una actualización sobre este archivo, no hay ninguna restricción en lo que respecta al número inicial, puede ser simplemente el número 1, yo en lo personal, utilizo la fecha en la que cree el archivo para tener una idea de cuándo fue que se creó. El siguiente es una indicación para los servidores esclavos del tiempo que debe transcurrir para que corroboren la información. A continuación, tiempo en el que debe hacer un reintento en el caso de que recibiera una respuesta incorrecta. El siguiente es el tiempo en el que el servidor esclavo va a dar respuestas a peticiones que tengan que ver con esta zona a pesar de no tener comunicación con el maestro, después de ese tiempo, se considera la zona como ya muerta. Finalmente el TTL negativo se refiere al tiempo de permanencia en caso de tener respuesta negativa (honestamente, no sé qué diferencia hay con el refresh).

El siguiente registro es el NS el cual, indica el nombre del servidor con la información de la zona, aunque en este caso es el mismo, no siempre es igual, se puede ser un servidor con autoridad y obtener las direcciones de otro.

Finalmente, esta toda la lista de direcciones de nuestro dominio en registros A, estos son lo que indican que IP corresponde a cada dirección del dominio, aquí debemos tomar nota que las direcciones no tienen punto final, esto es porque al no tener un punto final, el servidor va a agregar toda la zona a estas direcciones, es decir, el 188-1 va ser llamado 188-1.unixymas.com.mx.

Omití el agregar todo el archivo, solo destaco el registro que corresponde a la dirección del servidor.

Otra zona que vamos a agregar es en la que se encuentra la IP 127.0.0.1, al archivo lo vamos a llamar db.127.0.0, Esta dirección se reserva para el "loopback" es decir, la IP se traduce como "yo mismo".

$TTL 3h
@      IN SOA solaris10.unixymas.com.mx. webmaster.solaris10.uniymas.com.mx. (
            2010091201 ; serial
            3h ; refresh
            1h ; retry
            1w ; expire
            1h ) ; TTL
 
@      IN NS solaris10.unixymas.com.mx.
 
1      IN PTR localhost.
 
En este caso, tenemos el TTL, un registro SOA, un registro NS y para el número 1, el cual corresponde a 127.0.0.1, hay un registro PTR (apuntador) al cual se le llama dirección inversa, es decir, una IP que apunta a una dirección, las zonas que se refieren a IP's son parte de un dominio reservado "in-addr.arpa" y su nomenclatura es inversa a la dirección IP, en este ejemplo, la zona es: "0.0.127.in-addr.arpa".

Terminado todo esto, procedemos a "activar" nuestras zonas por medio del archivo de configuración /etc/named.conf

options {
     directory "/var/named";
};

zone "." in {
     type hint;
     file "db.cache";
};
 
zone "0.0.127.in-addr.arpa" in {
     type master;
     file "db.127.0.0";
};
 
zone "unixymas.com.mx" in {
     type master;
     file "db.unixymas.com.mx";
};

La directiva "options" es la que corresponde las opciones globales, aquí solamente estamos indicando el directorio de trabajo.

Después aparecen directivas zone para cada una de las zonas que definimos, dentro de las directivas tenemos la opción type, la cual indica la relación de este servidor con la zona (aquí utilizamos solo 2, "hint" que indica que para la zona "." (raíz) el archivo proporciona los servidores raíz y "master" que indica que el servidor es el maestro) y la opción file, la cual, corresponde al archivo con la zona.

Ya configurado, podemos ejecutar el programa named, el cual, se va a ejecutar en forma de demonio, van a aparecer en bitácora mensajes similares a estos:

Sep 13 16:20:19 solaris10 named[877]: [ID 873579 daemon.notice] starting BIND 9.6.1-P3
Sep 13 16:20:19 solaris10 named[877]: [ID 873579 daemon.notice] built with --prefix=/usr --with-libtool --bindir=/usr/sbin --sbindir=/usr/sbin --libdir=/usr/lib/dns --sysconfdir=/etc --localstatedir=/var --with-openssl=/usr/sfw --enable-threads=yes --enable-devpoll=yes --enable-fixed-rrset --disable-openssl-version-check -DNS_RUN_PID_DIR=0
Sep 13 16:20:22 solaris10 named[877]: [ID 873579 daemon.notice] command channel listening on 127.0.0.1#953
Sep 13 16:20:22 solaris10 named[877]: [ID 873579 daemon.notice] couldn't add command channel ::1#953: address not available
Sep 13 16:20:22 solaris10 named[877]: [ID 873579 daemon.notice] running
 
Hay un error que menciona que no puede abrir el Puerto 953, esto quiere decir que no tiene activo el servicio rndc para su administración remota, por lo que no afecta para este ejemplo, lo importante es el último que dice: running

Con esto damos por finalizado este ejemplo, espero no haberme extendido mucho.

jueves, 9 de septiembre de 2010

Instalación del cliente de correo alpine

Vamos a instalar el cliente de correo alpine, el cual, nos va a permitir accesar a nuestra cuenta de correo desde una terminal de texto en una forma agradable.

Podemos simplemente instalar el paquete desde sunfreeware.com, sin embargo, nos va a pedir que instalemos otros paquetes para resolver dependencias, por lo que, la forma que considero más sencilla, al menos en Solaris 10, es bajar el fuente, compilarlo e instalarlo en forma manual.

Una instalación completa y normal de Solaris 10, posee todas las librerías y utilerías que requerimos.
Por seguridad, podemos realizar la compilación con un usuario sin privilegios, pero la instalación, preferentemente, la debemos realizar con root si deseamos que todos los usuarios tengan acceso a la aplicación.

El primer paso es descomprimir el archivo en un directorio, preferentemente vacío, podemos usar el GNU tar que se encuentra en /usr/sfw/bin de esta manera:

/usr/sfw/bin/gtar xvzf alpine.tar.gz

Esto va a crear el subdirectorio alpine-2.00, el cual, va a contener todos los archivos fuente.
Vamos a asegurarnos que en la variable PATH estén incluidos: /usr/sfw/bin, /usr/xpg4/bin, /usr/ccs/bin
Dentro del subdirectorio alpine-2.00, vamos a “configurar” la instalación con el script configure de esta forma:

./configure --without-ldap --without-krb5 --disable-nls

Con estas opciones, vamos a desactivar el uso de las librerías para Kerberos y LDAP, además de módulo de soporte para traducciones, el cual, según la documentación de alpine, de todos modos no sirve, ya que no hay todavía traducciones disponibles. Por default, esta instalación quedará en el directorio /usr/local, la cual, podemos modificar con la opción –prefix. Si queremos saber que otras opciones hay, podemos utilizar la opción –help.

Una vez que termine sin marcar error vamos a compilar con el comando make

make

Después de compilar ya se encuentra listo para instalar, en este caso, como yo dejé la ruta por default que es /usr/local necesito utilizar a root para hacer la instalación, debo asegurarme antes de instalar que las rutas que agregué al PATH del usuario con el que compilé, estén en el PATH de root también, personalmente para facilitarme esto, utilizo el sudo para hacer esta compilación. El comando para instalar es make install

sudo make install

Si no marco ningún error, está listo, hay que agregar en el PATH de los usuarios que van a utilizar el alpine la ruta /usr/local/bin, para ejecutarlo solamente tecleamos alpine y enter.

Pantalla de bienvenida de alpine

miércoles, 8 de septiembre de 2010

Creando un nuevo filesystem en Solaris

Para este ejemplo voy a utilizar la partición creada en la entrada anterior.

La partición la tenemos identificada como c1t1d0s0, es muy importante tener bien claro cuál es la partición que debemos utilizar, una confusión puede ocasionar la destrucción de un filesystem con datos y, si les ocurre lo que a mí alguna vez, para acabarla de amolar no había respaldo.

Una vez identificada la partición, debemos tener claro cuál es el “raw device” que le corresponde, normalmente a cada partición se le asocia con 2 dispositivos, el “raw” o carácter (/dev/rdsk/c?t?d?s?), y el de bloque (/dev/dsk/c?t?d?s?), podríamos decir de una manera sencilla que el raw es el que vamos a utilizar para operaciones de mantenimiento (crear, borrar, modificar, etc.) y el de bloques para las operaciones de acceso a la información (montar, desmontar, respaldar, etc.) el dispositivo que utilizaremos en el ejemplo es: /dev/rdsk/c1t1d0s0

El comando que nos permite crear nuevos filesystems es mkfs, sin embargo, para el caso de filesystems UFS lo recomendable es utilizar newfs, el cual, es uno de los llamados comandos “frontend” el cual va a invocar a mkfs con los parámetros correctos para UFS. En su forma más simple, solamente necesitamos darle como parámetro el raw device en que se va a crear el filesystem: newfs /dev/rdsk/c1t1d0s0

[root@solaris10:~] newfs /dev/rdsk/c1t1d0s0
newfs: construct a new file system /dev/rdsk/c1t1d0s0: (y/n)? y
Warning: 870 sector(s) in last cylinder unallocated
/dev/rdsk/c1t1d0s0:     20980890 sectors in 3415 cylinders of 48 tracks, 128 sectors
        10244.6MB in 214 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
 20055584, 20154016, 20252448, 20350880, 20449312, 20547744, 20646176,
 20744608, 20843040, 20941472

Lo siguiente es montar el filesystem para poder tener acceso a él, suponiendo que requerimos que el punto de montaje sea /apache, primero creamos el directorio con mkdir y montamos el filesystem con el comando mount

[root@solaris10:~] mkdir /apache
[root@solaris10:~] mount /dev/dsk/c1t1d0s0 /apache

Aquí podemos observar en el comando mount que el dispositivo que utilizamos en este caso es el de bloque, no es necesario el indicarle que tipo de filesystem es ya que, por default, Solaris asume que un filesystem de disco es UFS.

Finalmente, para que la siguiente vez que reiniciemos el sistema operativo monte automáticamente este filesystem, debemos agregarlo al archivo /etc/vfstab de esta forma:

/dev/dsk/c1t1d0s0   /dev/rdsk/c1t1d0s0   /apache  ufs  2  yes     -

Lo primero es el dispositivo de bloque, después el raw, continua el punto de montaje, sigue el tipo de filesystem, un número que indica en qué momento se le ejecuta un fsck, si se va a montar en forma automático o no y por al final las opciones de montaje. Si alguno de los parámetros no aplica o se desean las opciones por default se sustituye por “-“.

martes, 7 de septiembre de 2010

Definir particiones con format en Solaris

El comando format nos permite definir particiones en los discos duros, las cuales pueden contener un filesystem o pueden ser utilizados como swap e inclusive pueden formar parte de un administrador de volúmenes.

Al ejecutar format lo primero que aparece es una lista de discos que son reconocidos por el sistema.

[root@solaris10:~] format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c1t1d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@1,0
Specify disk (enter its number): 1


Elegimos el disco, en este caso el 1 y procedemos con el siguiente paso:

selecting c1t1d0
[disk formatted]


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> p


En esta parte indicamos que comando es el que vamos a emplear con el disco seleccionado, en este caso, le damos una "p" para seleccionar el comando partition

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition> p


En partition lo primero que nos presenta es un menú con las diferentes operaciones que podemos realizar con la tabla de particiones, prácticamente las únicas que nos son útiles para este caso son del 0 al 7, print y label. Por supuesto que antes de realizar cualquier modificación a la tabla de particiones, debemos revisar cómo se encuentra utilizando la letra "p" de print.

Current partition table (original):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0


Ya que para este ejemplo estoy utilizando un Solaris x86 aparecen 2 particiones, la 8 y la 9, las cuales estan reservadas, cuando esto lo realizamos en una SPARC esto no aparece.



La partición 2 es una representación del total del disco, esta no debe ser modificada.


El resto: 0, 1, 3, 4, 5, 6 y 7 son las que tenemos disponibles, para este ejemplo, vamos a definir la partición 0 con 10 Gb, por lo que damos un "0" y enter.


Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 1
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 10gb


Lo primero que nos pregunta es el tag, si le damos ? nos da una lista de las opciones disponibles, generalmente utilizo unassigned, puede ser cualquiera. Para flags hay dos letras, la primera puede ser "w" que indica que es de lectura escritura y la "r" solo lectura, la segunda puede ser "m" que indica que puede ser montado y la "u" que indica que no. En la siguiente indicamos el cilindro con el que vamos a iniciar, aquí si debemos ser muy cuidadosos y revisar muy bien la geometría de las particiones para evitar que unas se "empalmen" con otras. La última opción es el tamaño de la partición, en este caso los 10 Gb que requerimos.

Una vez realizado todo esto, procedemos a revisar con el comando print.

Current partition table (unnamed):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       1 - 1306       10.00GB    (1306/0/0) 20980890
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0
Si no encontramos ningún problema procedemos a guardar los cambios "etiquetando" con el comando label.



Ready to label disk, continue? y

El término etiquetar se refiere a que la tabla de particiones forma parte de la VTOC, también llamada etiqueta del disco, por lo que los cambios en la tabla implican un cambio en dicha etiqueta.

Por último salimos del comando partition con "q" y nuevamente otra "q" para salir de format.

El disco que modificamos es el c1t1d0 y la partición que creamos es "0" por lo que el nombre completo con el que lo va a reconocer el sistema es c1t1d0s0, posteriormente vamos a crear un nuevo filesystem con esta partición y la vamos a montar.