# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Cómo crear tu propio RPM

rpmEn esta entrada vamos a ver los pasos necesarios para crear nuestro propio paquete rpm (Red Hat Package Manager). En este caso se trata de un paquete muy sencillo que únicamente va a tener un script ejecutable y unos ficheros extra de configuración, pero una vez que sabemos como hacerlo podemos hacer paquetes muchos más complejos y similares a los reales que nos podemos encontrar en cualquier repositorio.

Lo primero es instalar los paquetes y herramientas necesarias para poder crear rpms (rpm-build y rpmdevtools):

# yum install rpm-build rpmdevtools -y

Vamos a trabajar con un usuario sin privilegios y comenzamos creando una carpeta en nuestra home que contendrá los ficheros que formarán el RPM:

$ ls -l test-package-1.0/
total 8
-rw-rw-r--. 1 alex alex 27 Nov 10 16:04 README.txt
-rw-rw-r--. 1 alex alex 92 Nov 10 16:06 test-check
-rwxr--r--. 1 alex alex  0 Nov 10 16:38 configure

Como podéis ver simplemente he creado un fichero de texto README.txt y un script en bash llamado “test-check”. El fichero configure es necesario aunque no vayamos a compilar nada de código fuente, si no lo incluís os aparecerá un error al crear el RPM:

/var/tmp/rpm-tmp.zzXus7: line 32: ./configure: No such file or directory
error: Bad exit status from /var/tmp/rpm-tmp.zzXus7 (%build)
$ touch configure 
$ chmod 0744 configure

Esto va a ser todo lo que contendrá nuestro RPM. Para poder comenzar a crearlo antes debemos crear en nuestra home la estructura de directorios necesaria para la gestión de rpms, código fuente, specs, etc. En lugar de crearlo a mano utilizamos el comando “rpmdev-setuptree” disponible gracias a la instalación de los paquetes del comienzo de la entrada:

$ rpmdev-setuptree

Y ya tenemos la estructura creada:

$ ls -ltrh rpmbuild/
total 20K
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 RPMS
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 SOURCES
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 SPECS
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 SRPMS
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 BUILD

Lo siguiente que debemos hacer es comprimir las sources de nuestro paquete (carpeta test-package-1.0/) y copiarla o moverla a la carpeta SOURCES dentro de rpmbuild:

$ tar -czvf test-package-1.0.tar.gz test-package-1.0/
test-package-1.0/
test-package-1.0/README.txt
test-package-1.0/test-check
$ cp -p test-package-1.0.tar.gz rpmbuild/SOURCES/

El último fichero que tenemos que crear para poder construir el rpm es el fichero.spec. Este fichero contiene toda la información del paquete rpm: nombre, número de versión, arquitectura, descripción, dependencias, ordenes de ejecución para la instalación… no es necesario crearlo desde cero. Podemos ejecutar el siguiente comando dentro de la carpeta SOURCES para que nos cree uno de muestra:

$ rpmdev-newspec 
Skeleton specfile (minimal) has been created to "newpackage.spec".

Lo copiamos o renombramos con el nombre de nuestro paquete:

$ cp -p newpackage.spec test-package.spec

Ahora lo editamos añadiendo los parámetros correspondientes, los más importantes serían:

El nombre del paquete rpm:

Name:          test-package

Número de versión:

Version:       1.0

Release de la distribución (lo dejamos por defecto):

Release:        1%{?dist}

Summary, simplemente descriptivo. Indica el contenido del rpm, no es necesario:

Summary:        Paquete de muestra que contiene un fichero de texto y un ejecutable

Group hace referencia al grupo al que pertenece el paquete (definidos en un XML en el sistema), en nuestro caso no pertenece a ningún grupo concreto (Base, System Environment, Database…) así que ponemos uno genérico:

Group:          Miscellaneous

También podemos especificar términos de licencia del paquete y URL en la que revisarlos:

License:        RPM de prueba sin licencia
URL:            http://rm-rf.es

Ojo con el siguiente parámetro pues sí que es importante, especifica donde se encuentran las sources (del paquete, en este caso nuestro tar.gz (podría ser una url remota), no se especifica rpmbuild/SOURCES porque es la ruta en la que tienen que estar:

Source0:        test-package-1.0.tar.gz

En nuestro caso no hay ninguna dependencia para el paquete RPM, pero para paquetes complejos puede ser necesario que algún paquete extra esté instalado para el funcionamiento correcto, los especificaríamos en este punto:

#BuildRequires:
#Requires:

Podemos especificar una descripción del paquete que se verá al buscarlo por yum o el comando rpm:

%description
Este es un paquete de prueba para el artículo de http://rm-rf.es

Los dos comandos siguientes sirven para preparar el código fuente antes de su instalación, en este caso básicamente descomprimirán el .tar.gz en el directorio rpmbuild/SOURCES:

%prep
%setup -q

El siguiente apartado sirve para compilar el código fuente (cuando es necesario). Como nuestro RPM es muy sencillo y no necesita compilación comentamos las líneas:

%build
#%configure
#make %{?_smp_mflags}

El siguiente apartado (%install) es en el que se especifican las acciones a realizar cuando instalemos el RPM. En nuestro caso básicamente es crear una nueva carpeta en “/usr/local” y copiar ahí los ficheros. Por defecto aparece así:

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

Lo que hace es en primera instancia borrar cualquier resto de instalaciones anteriores del mismo paquete y después ejecuta un make si hemos realizado tareas de compilación. Vamos a comentar el make ya que nosotros no compilamos nada:

%install
rm -rf $RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
install -d -m 0755 /var/tmp/test-package
install -m 0644 README.txt /var/tmp/test-package
install -m 0755 test-check /var/tmp/test-package

El comando install -d nos permite crear un directorio e install -m mover ficheros. Lo instalamos en /var/tmp simplemente porque es un rpm de prueba, lo normal sería /usr/local, /opt o lo que quisierais. Finalmente se limpian restos de la instalación:

%clean
rm -rf $RPM_BUILD_ROOT

Así quedaría nuestro test-package.spec:

Name:          test-package
Version:       1.0 
Release:        1%{?dist}
Summary:        Paquete de muestra que contiene un fichero de texto y un ejecutable

Group:		Miscellaneous
License:        RPM de prueba sin licencia
URL:            http://rm-rf.es
Source0:        test-package-1.0.tar.gz
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

#BuildRequires:  
#Requires:       

%description
Este es un paquete de prueba para el artículo de http://rm-rf.es

%prep
%setup -q

%build
#%configure
#make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
install -d -m 0755 /var/tmp/test-package
install -m 0644 README.txt /var/tmp/test-package
install -m 0755 test-check /var/tmp/test-package

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
%doc

%changelog

El último paso ya es empaquetar todo y crear el RPM, para ello utilizamos el siguiente comando pasando como argumento el fichero spec. Debemos esperar un exit 0 al final para descartar fallos:

$ rpmbuild -ba rpmbuild/SOURCES/test-package.spec 
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.9azqfP
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd /home/alex/rpmbuild/BUILD
+ rm -rf test-package-1.0
+ /bin/tar -xf -
+ /usr/bin/gzip -dc /home/alex/rpmbuild/SOURCES/test-package-1.0.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd test-package-1.0
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.VqJuDV
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd test-package-1.0
+ CFLAGS='-O2 -g -march=i386 -mtune=i686'
+ export CFLAGS
+ CXXFLAGS='-O2 -g -march=i386 -mtune=i686'
+ export CXXFLAGS
+ FFLAGS='-O2 -g -march=i386 -mtune=i686'
+ export FFLAGS
+ ./configure --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.U4egr2
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd test-package-1.0
+ rm -rf /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386
+ install -d -m 0755 /var/tmp/test-package
+ install -m 0644 README.txt /var/tmp/test-package
+ install -m 0755 test-check /var/tmp/test-package
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
+ /usr/lib/rpm/brp-compress
/usr/lib/rpm/brp-compress: line 8: cd: /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386: No such file or directory
+ /usr/lib/rpm/brp-strip
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
+ /usr/lib/rpm/brp-strip-static-archive
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
+ /usr/lib/rpm/brp-strip-comment-note
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
Processing files: test-package-1.0-1.el6.i386
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386
warning: Could not canonicalize hostname: CentOS
Wrote: /home/alex/rpmbuild/SRPMS/test-package-1.0-1.el6.src.rpm
Wrote: /home/alex/rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.byNcVu
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd test-package-1.0
+ rm -rf /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386
+ exit 0

Vemos que todo ha ido bien así que ya deberíamos tener nuestro nuevo RPM en la carpeta RPMS:

$ ls -l rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm 
-rw-rw-r--. 1 alex alex 1365 Nov 10 16:43 rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm

Y el RPM de las sources:

$ ls -l rpmbuild/SRPMS/test-package-1.0-1.el6.src.rpm 
-rw-rw-r--. 1 alex alex 2458 Nov 10 16:43 rpmbuild/SRPMS/test-package-1.0-1.el6.src.rpm

Lo podemos instalar como cualquier otro rpm:

# rpm -ivh rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm
Preparing...                ########################################### [100%]
   1:test-package           ########################################### [100%]

Vemos que se ha instalado correctamente:

# ls -l /var/tmp/test-package/
total 8
-rw-r--r--. 1 alex alex 27 Nov 10 16:43 README.txt
-rwxr-xr-x. 1 alex alex 92 Nov 10 16:43 test-check

Y podemos ver también toda la información del paquete rpm que indicamos en el fichero spec:

# rpm -qi test-package
Name        : test-package                 Relocations: (not relocatable)
Version     : 1.0                               Vendor: (none)
Release     : 1.el6                         Build Date: Sat 10 Nov 2012 04:43:48 PM CET
Install Date: Sat 10 Nov 2012 04:45:12 PM CET      Build Host: CentOS
Group       : Miscellaneous                 Source RPM: test-package-1.0-1.el6.src.rpm
Size        : 0                                License: RPM de prueba sin licencia
Signature   : (none)
URL         : http://rm-rf.es
Summary     : Paquete de muestra que contiene un fichero de texto y un ejecutable
Description :
Este es un paquete de prueba para el artículo de http://rm-rf.es

Este es el modo de crear un paquete rpm muy básico, a partir de aquí es cuestión de buscar más información para poder tener vuestras aplicaciones empaquetadas ;)

The Debian Administrator’s Handbook

The Debian Administrator’s HandbookGracias a www.ubuntips.com.ar he descubierto este recurso que seguro a más de uno le viene muy bien. Se trata de una guía disponible online, como eBook o en libro tradicional que comenzó siendo una traducción del best-seller francés “Cahier de l’admin Debia”.

The Debian Administrator’s Handbook enseña todo lo fundamental para ser un buen administrador de sistemas Debian GNU/Linux y derivados, y por consiguiente para tener una buena base en cualquier sistema GNU/Linux. El proyecto ha sido realizado por dos desarrolladores de Debian, Raphaël Hertzog y Roland Mas.

El libro está disponible bajo la licencia Debian Free Software Guidelines. Lo podéis conseguir por todas estas vías:

  1. Leerlo online.
  2. eBook/libro físico.
  3. Descargas las fuentes y contribuir.

FAQ de RHCS (Red Hat Cluster Suite)

Lo primero de todo, perdonad la falta de actualización durante las últimas semanas, no he estado en España y tampoco he tenido el tiempo suficiente para escribir en el blog, estudiar, etc. Vamos a ir retomando poco a poco el ritmo. Hoy simplemente os quiero dejar un enlace para que lo guardéis en vuestros favoritos. Os será de gran utilidad si administráis RHCS (Red Hat Cluster Suite).

Se trata de las FAQ (Frequently asked questions/Preguntas frecuentes) relacionadas con el clustering de Red Hat (en este caso a través de Fedora). Encontraremos un montón de preguntas resueltas sobre problemas comunes que nos encontramos en este sistema de Cluster, también configuraciones típicas, operación, etc. Para hacerlo más claro y fácil de revisar, está separado por secciones según componentes (cman, fencing, GFS, CLVM, DLM, rgmanager, etc).

¡Espero que os sean de utilidad!

Cómo instalar Oracle Solaris 11 Express

Hoy vamos a ver lo sencillo que resulta instalar Oracle Solaris 11 Express 2010.11 tanto en una máquina virtual como en un equipo físico. Lo primero que tenemos que hacer es descargar la imagen de instalación correspondiente desde este enlace del sitio web de Oracle (es necesario registro). En mi caso, como es habitual he utilizado la versión de instalación en modo texto para x86.

Vamos a ello, arrancamos el equipo con un CD con la imagen ISO grabada y empezamos la instalación. Seleccionamos el tipo de teclado, en nuestro caso ’39′ (español):

Ahora toca elegir el idioma, en mi caso selecciono inglés ya que prefiero instalar los sistemas en inglés que en español, sobre todo porque a la hora de buscar documentación y errores hay mucha más información:

Comienza la instalación de Oracle Solaris, elegimos ’1′ para empezar:

Tras la pantalla de bienvenida, empezamos con la configuración de discos y particiones. Primero toca elegir el disco sobre el que hacer la instalación y después la estructura de particiones. En este caso es un disco virtual sobre Virtualbox, así que elegimos el único disco disponible y usamos todo el disco para instalar el sistema.

Ahora introducimos el nombre de la máquina (hostname) y especificamos si deseamos que la configuración de red sea automática o si preferimos realizarla de forma manual posteriormente:

Establecemos la configuración regional del equipo, fecha, etc:

Llega el momento de asignar una clave al usuario root y la creación de una cuenta de usuario extra:

Antes de comenzar la instalación, podemos ver un resumen de las opciones configuradas y elegir cambiar alguna de ellas volviendo atrás (F3):

Cuando todo esté correcto, presionamos F2 y la instalación comenzará:

Una vez finalizada la instalación sólo nos queda presionar F8 para hacer un reboot y ya podemos comenzar a disfrutar de nuestro sistema Oracle Solaris:

alex@solaris:~$ uname -a
SunOS solaris 5.11 snv_151a i86pc i386 i86pc

En las próximas entradas empezaremos a ver cómo configurar las interfaces de red, la instalación de paquetes y una visión general del sistema.

Lighttpd: proteger una carpeta o website con contraseña

LighttpdSi utilizamos Lighttpd y necesitamos una funcionalidad similar a la que nos ofrece el servidor web Apache para proteger con password un directorio o virtualhost (en este caso vía .htaccess o directamente en el virtualhost con AuthType, AuthUserFile…) debemos hacer uso del módulo mod_auth y sus directivas. Vamos a ver como configurarlo.

Lo primero que debemos hacer es ver si el módulo está cargado en la configuración, para ello abrimos el fichero de configuración y revisamos la sección server.modules, donde debería mod_auth, sino lo añadís:

/etc/lighttpd/lighttpd.conf
server.modules              = (
            "mod_access",
            "mod_accesslog",
            "mod_fastcgi",
            "mod_rewrite",
            "mod_auth",
            "mod_cgi"
)

Después tenemos que configurar las tres directivas disponibles para la autenticación, el tipo de autenticación, el fichero en el que se almacenarán los datos de usuarios y claves y el nivel de debug:

auth.backend               = "htpasswd"
auth.backend.htpasswd.userfile = "/home/miwebsite/.lighttpdpasswd"
auth.debug = 0

Mediante auth.backend podemos especificar el tipo de autenticación, puede ser en texto plano (plain) o mediante htpasswd o LDAP. Elegimos htpasswd para tener la clave encriptada. Luego el fichero donde se almacenan las claves lo especificamos también (auth.backend.htpasswd.userfile). Finalmente el debug para verificar el funcionamiento, con 0 queda desactivado, con 1 vuelca a los logs cuando la autenticación es correcta y con 2 vuelca todo (access.log y error.log).

Ahora creamos fuera de la carpeta pública del sitio web el fichero con los usuarios y sus claves encriptadas por htpasswd:

# vim /home/miwebsite/.lighttpdpasswd
foo:soAb7vp63UATv7uaA2
chown lighttpd /home/miwebsite/.lighttpdpasswd && chmod 0600 .lighttpdpassword

Finalmente sólo nos queda seleccionar que directorio o website queremos proteger. Para ello buscaremos la sección $HTTP["host"] que contenga la web/directorio a proteger:

En negrita lo relacionado con la autenticación:

$HTTP["host"]  =~ "test.com" {
  server.document-root = "/home/test-com/"
  accesslog.filename         = "/var/log/lighttpd/test-access.log"
 auth.require = ( "/carpeta-protegida/" =>
 (
  "method" => "basic",
  "realm" => "Password protected area",
  "require" => "user=foo" 
 ) 
 )
}

Y ya podemos reiniciar lighttpd para activar los cambios. En este caso la carpeta test.com/carpeta-protegida/ quedará protegida y únicamente el usuario foo podrá acceder.

# /etc/init.d/lighttpd restart

Cómo instalar CentOS 6

Vamos a ver como instalar paso a paso la nueva versión de CentOS (6.0) que salió a la luz hace pocos días y tras muchos meses de espera. Vamos a seguir los mismos pasos que con la instalación de CentOS 5. Realizaremos una instalación mínima a través de la ISO netinstall.

El primer paso es descargar la ISO correspondiente desde un mirror de CentOS, por ejemplo:

ftp://ftp.udl.es/pub/centos/6.0/isos/

Podréis seleccionar tanto la versión de 32 como 64 bits. En esta guía vamos a instalar la versión de 32 bits:

CentOS-6.0-i386-netinstall.iso

Una vez bajada comenzamos la instalación arrancando con la ISO grabada en un CD. Nos encontraremos la pantalla de bienvenida, seleccionamos la primera opción:

Como instalar CentOS (1)

La primera opción que encontraremos será la de realizar un test del CD de instalación, podemos saltarla sin problemas a no ser que encontremos fallos extraños durante la instalación provocados por un CD defectuoso.

Sigue leyendo el resto de la entrada »

Cómo extraer vídeo, audio y subtitulos de un contenedor MKV

Existe una herramienta llamada MKVExtractGUI, gratuita y para Windows que permite extraer de forma muy sencilla el contenido de un contenedor MKV. Normalmente este tipo de ficheros cuentan con vídeo, audio, imágenes y subtítulos.
 

mkvextractgui

 
 
Como podéis ver en la imagen, el proceso es tan simple como:

  1. Seleccionar el archivo MKV a manipular (Input File).
  2. Elegir el directorio de destino para los ficheors extraidos (Output Dir). Podemos elegir el mismo directorio en el que se encuentra el fichero original marcando Source Dir.
  3. Seleccionar las pistas que queramos extraer, ya sea de audio, vídeo o subtitulos.
  4. Pinchar en Extract.

Este programa puede ser de utilidad, por ejemplo para aquellos que necesitan modificar los codecs de el audio o el vídeo o extraer los subtítulos para que sean compatibles con el reproductor multimedia.

Para usuarios de GNU/Linux, está disponible mkvextract, aplicación de línea de comandos disponible desde cualquier repositorio, podéis ver el funcionamiento en la página man del comando (muy sencillo también).

Podéis descargar MKVExtractGUI desde el sitio web oficial.

Howto: convertir audio DTS a AC3 en Linux

Audio DTSHoy vamos a aprender a convertir las pistas de audio de películas MKV que se encuentren en formato DTS (Digital Theater System) a AC3 (Dolby Digital) en sistemas GNU/Linux. El manual es aplicable a cualquier tipo de distribución excepto la parte de los requerimientos, que es únicamente para sistemas basados en Debian (p.ej Ubuntu) ya que hacemos uso del gestor de paquetes apt. Para otras distribuciones simplemente instalar las dependencias que se muestran a continuación con el gestor de paquetes que tengáis instalado (yum, apt, etc).

El proceso de conversión es realmente sencillo, únicamente necesitamos bajar este script programado en bash y ejecutarlo del siguiente modo dentro de la línea de comandos (terminal):

mkvdts2ac3.sh pelicula.mkv

El script utiliza ciertas librerías por lo que para evitar cualquier error de dependencias, las instalamos, ejecutamos el siguiente comando desde la terminal (si os resulta más sencillo, también lo podéis hacer desde Añadir o quitar aplicaciones, aunque no lo es), de todas formas si faltara cualquier requerimiento el propio script os avisaría (usamos apt en sistemas debian/ubuntu):

sudo apt-get install mkvtoolnix libdca0 libdca-dev aften

Y esto es todo, para el que le guste trastear, el script permite personalizar estas modificaciones. Por ejemplo podemos añadir una nueva pista AC3 en lugar de sustituir la DTS (de este modo mantenemos las dos), dejar la nueva pista AC3 como pista por defecto, borrar la pista DTS tras la modificación, etc.

Ver el perfil de Alejandro García García en LinkedIn