Algo de Linux: mayo 2014

viernes, 30 de mayo de 2014

Raspberry Pi como servidor de hora con ntp

NTP (Network Time Protocol) es un protocolo IP para mantener sincronizados los relojes de diferentes equipos informáticos que escucha en el puerto 123.

NTP define una jerarquía de estratos de reloj, donde:
  • Los sistemas de estrato 1 se encuentran sincronizados con un reloj externo como un reloj atómico o un reloj GPS.
  • Los sistemas de estrato 2 se encuentran sincronizados con sistemas de estrato 1.
  • Y así sucesivamente.
En este post vamos a ver cómo configurar:
  • Un servidor ntp en nuestra Raspberry Pi.
  • Un cliente ntp Debian de nuestra red.
Configurar un servidor ntp.-
En Debian utilizamos el demonio ntp tanto para el cliente como para el servidor. Disponer de este demonio es muy sencillo. Tan sólo tenemos que instalar el paquete ntp:
# apt-get install ntp
Una vez instalado, vamos a configurarlo. Para ello, paramos el servidor ntp:
# service ntp stop
Y editamos el fichero de configuración:
# nano /etc/ntp.conf
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift

# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: 
server hora.roa.es iburst
server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

# Local clock para que continue sirviendo su hora aunque no tenga acceso a internet
server 127.127.1.0
fudge  127.127.1.0 stratum 10

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page 
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust

# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient
Para que funcione, tan sólo tenéis que configurar los servidores de hora a los que vuestro servidor va a consultar. Podéis obtener una lista de servidores de hora en la siguiente página: http://www.pool.ntp.org/

Una vez configurado, arrancamos de nuevo el servicio:
# service ntp start

Para comprobar  que el servicio está bien configurado y los servidores de hora responden, ejecutamos:
root@raspberrypi:~# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 hora.roa.es     .INIT.          16 u    -   64    0    0.000    0.000   0.001
 147.83.123.133  .INIT.          16 u    -   64    0    0.000    0.000   0.001
 guti.uc3m.es    130.206.3.166    2 u    1   64    1   64.854    0.273   0.182
 i2t15.i2t.ehu.e .GPS.            1 u    2   64    1   86.872    8.485   0.001
 mx.saviacr.com  130.206.3.166    2 u    1   64    1  115.776    7.900   0.001
*LOCAL(0)        .LOCL.          10 l    -   64    1    0.000    0.000   0.001
Como podéis ver en la salida anterior, el servidor funciona y puede contactar con los servidores de hora que le hemos configurado.

Configurar un cliente ntp.-
El siguiente paso será configurar un cliente de nuestra red. Para ello:
Instalamos el paquete ntp en el cliente:
# apt-get install ntp
Editamos el fichero ntp.conf del cliente y le añadimos la siguiente línea:
server raspberrypi.local iburst
Asumimos que tenemos instalado avahi (para poder utilizar el nombre de máquina raspberrypi.local)y que el nombre de host de nuestra Raspberry es: raspberrypi.

Por último, reiniciamos el demonio ntp en el cliente:
# service ntp restart
Una vez reiniciado, ejecutamos en el cliente:
ldap:~# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 raspberrypi.loc 150.214.94.5     2 u    -   64    1    0.735   -1.966   0.001
 fw1.engloba.net .INIT.          16 u    -   64    0    0.000    0.000   0.001
 ns1.indaloweb.n .INIT.          16 u    -   64    0    0.000    0.000   0.001
 evl1900860-pip. .INIT.          16 u    -   64    0    0.000    0.000   0.001
 guti.uc3m.es    .INIT.          16 u    -   64    0    0.000    0.000   0.001

Como podéis comprobar en la primera línea de los resultados, nuestra Raspberry Pi está sirviendo su hora.
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 28 de mayo de 2014

El shell de linux: Obtener una lista de los paquetes expresamente instalados en el sistema

En un post anterior os mostré cómo podemos obtener una lista de todos los paquetes instalados en el sistema utilizando dpkg --get-selections, algo realmente útil para rellenar el fichero musthave de pkgsync y mantener el software uniforme en una serie de equipos. Ahora bien, en esta lista irán incluidos los paquetes que se instalan como dependencias de otros que hayamos instalado explícitamente, como por ejemplo librerías. 

Para instalar los paquetes del sistema, ya sea con pkgsync o dpkg --set-selections, no es necesario especificar la lista de librerías, puesto que, al fin y al cabo, éstas se van a instalar de todos modos, cuando instalemos los paquetes que nosotros queremos.

La forma más óptima de construir la lista de paquetes para pkgsync o dpkg --set-selections es creando una lista en la que se incluyan sólo los paquetes que expresamente queramos instalar. Para construir esta lista, lo mejor es apoyarnos en aptitude, que puede darnos mucha información y usar la siguiente combinación de comandos:

# aptitude show "?installed ?not(?priority(required)) ?not(?essential) ?not(?automatic)" | grep -e ^Package -e ^Paquete | cut -f 2 -d " " | sort > /etc/pkgsync/musthave

Esta combinación obtiene una lista de los paquetes instalados: ?installed , excluyendo:
  • Aquellos paquetes cuya prioridad sea required: ?not(?priority(required)), es decir, paquetes necesarios para el funcionamiento del sistema. 
  • Aquellos paquetes que no sean esenciales: ?not(?essential)
  • Aquellos paquetes no instalados automáticamente: ?not(?automatic)
Para que veáis lo reducida y "limpia" que queda la lista de paquetes, os diré que en un equipo workstation, he obtenido una lista de 682 paquetes de un total de 2372 paquetes instalados.

Publicado por primera vez en http://enavas.blogspot.com.es

martes, 27 de mayo de 2014

Establecer ajustes predeterminados y bloquear ajustes en GNOME3

En Debian Squeeze teníamos GNOME2 y utilizábamos gconf para definir ajustes predeterminados para todos los usuarios y bloquear aquellos que no queríamos que el usuario pudiera modificar.

Debian Wheezy trae instalado GNOME3 y éste utiliza dconf para estos fines.

Y como cambiamos de sistema, del mismo modo, cambiamos de herramientas. Por ejemplo:
  • Si en GNOME2 utilizábamos gconftool-2 para realizar ajustes desde el terminal, en GNOME3 utilizamos una nueva herramienta: gsettings.
  • Del mismo modo, si en GNOME2 usábamos gconf-editor para realizar ajustes desde el entorno gráfico, en GNOME3 usamos la herramienta: dconf-editor.
Como lo que me interesa en este caso es establecer ajustes para todos los usuarios de forma predeterminada a nivel de máquina, nos vamos a centrar en dos cosas:
  • Cómo establecer ajustes predeterminados.
  • Cómo bloquear determinados ajustes.
Primero.- Creamos un directorio /etc/dconf/ donde guardaremos los ajustes:
# mkdir /etc/dconf
Dentro de este directorio crearemos otros dos:
# mkdir /etc/dconf/profile
# mkdir /etc/dconf/db
Dentro del directorio /etc/dconf/profile, crearemos un fichero de perfil: user
# nano /etc/dconf/profile/user
user-db:user
system-db:local
Cada línea del fichero de perfil /etc/dconf/profile/user especifica una base de datos dconf. La primera línea indica la base de datos usada para guardar los cambios y el resto de líneas indican bases de datos de sólo lectura.

Una línea "system-db" especifica una base de datos de sistema. Estas bases de datos se encuentran almacenadas en /etc/dconf/db. Como a la base de datos de sistema la hemos llamado local, dentro del directorio /etc/dconf/db crearemos un nuevo directorio al que llamaremos local.d:
# mkdir /etc/dconf/db/local.d
Bien, pues con ésto, ya tenemos preparada la infraestructura.

Segundo.- Una vez creada la estructura de carpetas, establecer ajustes predeterminados es muy sencillo porque tan sólo tendremos que crear ficheros con ajustes dentro del directorio /etc/dconf/db/local.d/. Veamos un ejemplo que he usado en la realidad:

Supongamos que los portátiles se suspenden al cerrar la tapa, tanto cuando están conectados a la corriente como cuando están alimentados sólo con la batería y quiero cambiar este comportamiento para que no se suspendan en ningún caso.

Sé que existe una clave para controlar el comportamiento cuando se cierra la pantalla y el portátil está conectado a la corriente: lid-close-ac-action. Y otra para controlar el comportamiento cuando se cierra la pantalla y el portátil no está conectado a la corriente: lid-close-battery-action.

Podéis comprobar que ambas claves tienen 'suspend' como valor por defecto con gsettings:
# gsettings get org.gnome.settings-daemon.plugins.power lid-close-ac-action
'suspend'
# gsettings get org.gnome.settings-daemon.plugins.power lid-close-battery-action
'suspend'
Para conseguir que los portátiles no se suspendan al cerrar la tapa, cambiaremos el valor 'suspend' por 'blank'.  Esto lo lograremos creando un fichero al que llamaré 00-power dentro del directorio /etc/dconf/db/local.d/ con el siguiente contenido:
[org/gnome/settings-daemon/plugins/power]
lid-close-ac-action='blank'
lid-close-battery-action='blank'
Una vez creado el fichero /etc/dconf/db/local.d/00-power, ejecutamos en un terminal:
# dconf update
Y ya tendremos configurados los ajustes por defecto para todos los usuarios.

Tercero.- Ahora que ya tenemos definidos los ajustes por defecto, vamos a bloquear ambos ajustes para que el usuario no pueda cambiarlos. Para ello, creo un directorio locks dentro del directorio /etc/dconf/db/local.d/:
# mkdir /etc/dconf/db/local.d/locks
Dentro de él crearemos archivos con diferentes ajustes de bloqueo. Siguiendo con el ejemplo anterior, voy a bloquear los ajustes lid-close-ac-action y lid-close-battery-action para que el usuario no pueda cambiarlos. Creo un archivo power dentro del directorio /etc/dconf/local.d/locks:
# nano /etc/dconf/db/local.d/locks/power
/org/gnome/settings-daemon/plugins/power/lid-close-ac-action
/org/gnome/settings-daemon/plugins/power/lid-close-battery-action
Una vez creado el fichero /etc/dconf/db/local.d/locks/power, ejecutamos en un terminal:
# dconf update
Y con ésto, ambos ajustes quedarán bloqueados, de manera que el usuario no podrá modificarlos. Publicado por primera vez en http://enavas.blogspot.com.es

Script addFNMTfirefox: Añadir el certificado de la FNMT a los perfiles de Firefox de alumnos y profesores

En mi cuenta de GitHub he dejado un script para añadir el certificado de la FNMT a los perfiles de Firefox de alumnos y profesores. Aquí tenéis el código, por si queréis echarle un vistazo:


Y el enlace de descarga directa:
https://raw.githubusercontent.com/algodelinux/addFNMTfirefox/master/addFNMTfirefox.sh

También he añadido el archivo con el certificado actual de la FNMT, por si lo queréis utilizar.
Publicado por primera vez en http://enavas.blogspot.com.es

El shell de linux: Obtener la lista de particiones de un dispositivo de almacenamiento

Ésta es la combinación de comandos que uso habitualmente cuando estoy haciendo algún script en el que necesito detectar las particiones de un dispositivo de almacenamiento conectado al ordenador, ya sea un disco duro o dispositivo USB:
# fdisk -l /dev/sdX | grep -v -e 'Disk' -e 'Disco' | grep '/dev/sd' | awk '{print $1}'
Publicado por primera vez en http://enavas.blogspot.com.es

El shell de linux: Obtener la lista de dispositivos de almacenamiento detectados

Ésta es la combinación de comandos que uso habitualmente cuando estoy haciendo algú script en el que necesito detectar los dispositivos de almacenamiento conectados al ordenador, ya sean discos duros o dispositivos USB:
# fdisk -l 2>/dev/null | grep -i -e "Disk \/" -e "Disco \/" | grep -v "\/dev\/dm" | awk '{print $2}' | sed -e 's/://g'
Publicado por primera vez en http://enavas.blogspot.com.es

lunes, 26 de mayo de 2014

Raspberry Pi como servidor de e-books con Calibre

Calibre es una excelente aplicación de gestión de bibliotecas de e-books que, entre otras cosas, nos va a permitir convertir nuestra Raspberry Pi en un servidor de e-books.

¿Y para qué queremos tener un servidor de ebooks? Simplemente para disponer de una plataforma que nos permita el acceso a los libros electrónicos de nuestra colección o la descarga a cualquiera de nuestros dispositivos: ordenador, tablet o smartphone.

Para instalar calibre y todas sus dependencias, abrimos un terminal y ejecutamos:
# apt-get install calibre
Supondremos que tenéis instalado avahi-daemon en vuestra Raspberry Pi para acceder a ella por su nombre. Si no lo habéis configurado aún, os recomiendo echar un vistazo al siguiente post.

Una vez instalado, vamos a copiar el siguiente script de inicio al que llamaremos calibre en /etc/init.d/:
#!/bin/bash
### BEGIN INIT INFO
# Provides: calibre
# Required-Start: networking
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Controls the Calibre content server
# Description: Controls the Calibre content web server
#
### END INIT INFO
# Original author: Alexandrdos Schillings
# Modifications: K-Light
#
# UPDATES:
# - Added USERNAME and PASSWORD to DAEMON_ARGS
# - In version 0.7.27+ of calibre, the "auto reload" command has been unbundled from "--develop"
#
# Modifications: Marco Antonio Blanco (04/2012)
#
# UPDATES:
# - Changed "network" for "networking" in Required-Start field so it installs in Debian
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
#
#
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Servidor de Libros Calibre"
NAME=calibre-server
DAEMON=/usr/bin/$NAME
PIDFILE=/var/run/$NAME.pid
# Edit the CONTENT variable below to point it to your library directory.
# Edit the PORT variable below to change the port the server will run on.
# Edit the MAX_COVER variable below to change the maximum size of a book cover image.
# Edit the USERNAME variable below to your desired username
# Edit the PASSWORD variable below to your desired password
CONTENT=/media/MULTIMEDIA/Calibre
PORT=8080
MAX_COVER=300x400
USERNAME=
PASSWORD=

DAEMON_ARGS="--auto-reload --with-library=$CONTENT --pidfile=$PIDFILE --port=$PORT --max-cover=$MAX_COVER --username=$USERNAME --password=$PASSWORD --daemonize"
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null || return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2

# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2

# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
restart)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
exit 3
;;
esac
:
En este script debéis modificar las variables que os he resaltado en color amarillo:
  • DESC permite definir una descripción que se mostrará a la hora de iniciar y parar el servicio.
  • CONTENT sirve para indicarle al servidor de calibre en qué ubicación se encuentran los ebooks. En el ejemplo anterior hemos indicado que los libros están  en /media/MULTIMEDIA/Calibre, una carpeta de mi disco duro USB. 
  • PORT  nos permite indicar el puerto en el que escuchará calibre. Por defecto, veréis que hemos definido el puerto 8080, pero podéis cambiarlo por otro sin ningún problema.
  • USERNAME y PASSWORD: Nos van a permitir restringir el acceso al interfaz web de Calibre, de tal forma que el usuario tendrá que introducir ambos datos para poder ver el catálogo.  En el caso anterior, lo he dejado en blanco porque me interesa que cualquier usuario pueda verlo.
Una vez configurado el script de inicio, vamos a crear los enlaces que iniciarán y pararán el servidor automáticamente:
# insserv calibre
Para comprobar si funciona, podemos iniciar el servicio manualmente:
# service calibre start
A continuación, abrimos un navegador y escribimos la siguiente dirección: http://raspberrypi.local:8080
Si todo ha ido bien, veréis la pantalla de inicio de Calibre:

Publicado por primera vez en http://enavas.blogspot.com.es

Touchpad demasiado sensible en Debian

Llevaba un tiempo que me resultaba incomodísimo trabajar con el touchpad del portátil en Debian Squeeze y es que a partir de un determinado momento se había vuelto demasiado sensible y me costaba hacer cosas tan sencillas como hacer clic en el botón de cierre de una ventana. 

La solución ha sido descargar e instalar el módulo psmouse desde la siguiente web: http://www.dahetral.com/public-download 

Una vez descargado, el proceso de instalación es muy sencillo: 

Primero, instalamos dkms, si no lo tenemos instalado:
# apt-get install dkms
A continuación descomprimimos el archivo con el driver, y lo instalamos:
# tar xvf psmouse-alps-1.3-alt.tbz -C /usr/src/
# dkms add -m psmouse -v alps-1.3
# dkms build -m psmouse -v alps-1.3
# dkms install -m psmouse -v alps-1.3
Por último, quitamos el driver anterior y cargamos el nuevo:
# rmmod psmouse
# modprobe psmouse
Publicado por primera vez en http://enavas.blogspot.com.es

sábado, 24 de mayo de 2014

Actualizar paquetes Debian desde un mirror en un disco duro usb

Si váis a realizar una actualización completa de vuestro sistema Debian desde una versión a otra puede que tardéis mucho tiempo hasta que se descarguen todos los paquetes que se deben instalar. También puede ocurrir que simplemente queráis instalar paquetes en un equipo que no tiene conexión a internet. Estos problemas son muy fáciles de resolver si contáis con un mirror de un repositorio en un disco local.

Como en nuestros centros tenemos un mirror de diferentes repositorios Debian, tengo por costumbre realizar copias del mismo en un disco duro USB, utilizando rsync. De este modo:
  • Si por alguna razón cayera el disco duro del servidor donde se encuentra el mirror, podría restaurarlo fácilmente. 
  • Y si necesito realizar una instalación de paquetes o actualización de una máquina que no tiene conexión a internet o ésta es lenta, siempre puedo utilizar el disco duro USB.
¿Cómo lo hago? Muy sencillo. Veamos un ejemplo: Suponiendo que he almacenado el mirror de wheezy/wheezy-backports en un directorio llamado wheezy del disco duro externo:

Primero.- Conecto el disco duro y lo monto, si no se monta automáticamente. 

Segundo.- Suponiendo que el disco duro se ha montado en /media/EXT4, edito el archivo /etc/apt/sources.list de la máquina en la que quiero instalar paquetes:
# nano /etc/apt/sources.list
Y le añado las siguientes líneas:
deb file:/media/EXT4/wheezy/debian wheezy main contrib non-free
deb file:/media/EXT4/wheezy/debian wheezy-backports main contrib non-free
De este modo, ya puedo instalar los paquetes que quieras desde el mirror almacenado en el disco duro.
Cuando termine, edito de nuevo el archivo /etc/apt/sources.list y comento las líneas de los repositorios, por si volviera a necesitar instalar paquetes desde allí más adelante y quisiera utilizarlo de nuevo:
# deb file:/media/EXT4/wheezy/debian wheezy main contrib non-free
# deb file:/media/EXT4/wheezy/debian wheezy-backports main contrib non-free
Publicado por primera vez en http://enavas.blogspot.com.es

viernes, 23 de mayo de 2014

Suspender servidores LTSP para reducir el consumo de energía y evitar un calentamiento innecesario

Lo más habitual en los centros es encender los servidores LTSP de forma automática a primera hora y mantenerlos encendidos durante la mañana para evitar esperas cada vez que un profesor quiera iniciar sesión. El problema es que los servidores de terminales no van a estar en uso el 100% de la jornada y una parte del tiempo se encontrarán ociosos, consumiendo energía innecesariamente.

Para intentar reducir este consumo de energía y evitar que los equipos se calienten estando encendidos sin utilizarse, he preparado un script que, con una tarea cron, se ejecutará cada 15 minutos y comprobará si hay un usuario logueado en el entorno gráfico, de manera que:
  • Si hay un usuario en el entorno gráfico, no hará nada.
  • Si no hay ningún usuario, comprobará el tipo de aula: 
    • all: Aula con terminales y/o portátiles.
    • thinclients: Aula con terminales.
    • laptops: Aula con thinclients.
    • Si es un aula de terminales, ejecutará el script /usr/sbin/apagaterminales.sh que apaga los thinclients antes de suspender el servidor LTSP.
    • Suspenderá el servidor LTSP.
El código del script es muy sencillo, fundamentalmente porque utiliza otro script que ya tengo en el sistema para apagar los terminales (/usr/sbin/apagaterminales.sh) y aprovecha facter para comprobar el tipo de aula (En mi centro tengo definida una "variable" a la que he llamado clients en el fichero /etc/escuela2.0 para comprobar si el aula tiene thinclients o portátiles).

Para apagar los terminales utilizo pm-suspend, que se encuentra instalado en los servidores LTSP.
cat /usr/local/sbin/suspende.sh
#!/bin/bash
# Esteban M. Navas
# IES Valle del Jerte - Plasencia
# Fecha creación: 20/05/2014
# Fecha última modificación: 23/05/2014

# suspende.sh -> Apaga los terminales de un aula y suspende el equipo. Para apagar los terminales 
# utilizamos el script /usr/sbin/apagaterminales.sh y la herramienta pm-suspend que se encuentra instalada en los 
# servidores LTSP
#
# La idea es utilizar este script como tarea cron de forma que se ejecute cada cierto tiempo

# Si hay un usuario logueado en el terminal :0, no hacemos nada y finalizamos
if [ $(/usr/bin/w|/bin/grep ":0" | /usr/bin/cut -f1 -d" ") ]; then
   exit 0
fi

clientes=`facter clients`

# Si no hay un usuario logueado, apagamos los terminales
if [ $clientes = "all" ] || [ $clientes = "thinclients" ]; then
   /usr/sbin/apagaterminales.sh
fi

# Si no hay un usuario logueado en el terminal :0 suspendemos el equipo
/usr/sbin/pm-suspend &
La tarea cron que ejecuta el script es muy simple y se puede poner vía puppet:
cat /etc/cron.d/suspende

# Check every 15 minutes if no user logged and suspend
*/15 *    * * *    root    /usr/local/sbin/suspende.sh

He estado haciendo pruebas en un servidor y parece que todo funciona correctamente. Así que probaré en algún aula más y si todo va bien, pasaré la tarea para todos los servidores LTSP.

Tan sólo me he encontrado con un inconveniente: Por alguna razón, a la hora de reanudar el equipo, si queréis hacerlo pulsando el teclado, es necesario que éste se encuentre conectado mediante PS2. Mediante USB, por defecto, no funciona la reanudación. Supongo que habría que hacer pruebas y configurarlo, pero por no perder más tiempo y tener el sistema operativo lo antes posible, sobre todo ahora que comienza a hacer calor, he conectado todos los teclados de los servidores LTSP mediante PS2.
Publicado por primera vez en http://enavas.blogspot.com.es

Procedimiento para flashear la BIOS de un equipo


En el post de ayer, os expliqué cómo preparar un pendrive de arranque FreeDOS (basado en el trabajo de esta web: http://chtaube.eu/computers/freedos/bootable-usb/) para flashear la BIOS de un equipo, aunque no deja de ser un disco de FreeDOS que podéis utilizar para cualquier otra cosa que se os ocurra. Hoy lo he utilizado para flashear las BIOS de unos cuantos servidores LTSP y me ha venido fenomenal. 

Es cierto que podría haber automatizado el procedimiento para flashear automáticamente las BIOS nada más arrancar con el dispositivo, porque es tan sencillo como modificar el AUTOEXEC.BAT, pero he preferido dejarlo como venía originalmente para poder utilizarlo para otras cosas que se me están ocurriendo. 

Éste es el procedimiento que he seguido para flashear la BIOS de un servidor LTSP con placa base P5Q Deluxe:
  1. Apagamos el equipo o lo reiniciamos si estaba encendido.
  2. Introducimos el pendrive.
  3. Lo encendemos de nuevo y pulsamos F8. Esta opción es la que permite seleccionar el dispositivo de arranque en esta placa base.
  4. De la lista de dispositivos que aparecen en pantalla, seleccionamos el que corresponde a nuestro pendrive USB.
  5. El pendrive iniciará inmendiatamente y nos mostrará un menú de opciones. Escribimos fdos y pulsamos ENTER.
  6. Una vez elegido que queremos arrancar FreeDOS, nos mostrará un nuevo menú para elegir entre diferentes posibilidades de arranque de FreeDOS con/o sin drivers. Seleccionamos la última: Freedos without drivers.
  7. He creado un fichero llamado p5qflash.bat para iniciar el proceso de flasheo. Escribimos p5qflash y pulsamos ENTER para iniciarlo.
Y comenzará el proceso de flasheo. Cuando termine, nos informará de que es necesario reiniciar el equipo. Lo reiniciamos y arrancará con la nueva BIOS actualizada.

Publicado por primera vez en http://enavas.blogspot.com.es

Consultar las dependencias de un paquete en Debian

Cuando queremos consultar las dependencias de un paquete que se encuentra en los repositorios, utilizamos el siguiente comando:
apt-cache show paquete
Ahora bien, si el paquete lo tenemos descargado en el equipo, utilizaremos otro comando:
dpkg-deb -I paquete.deb
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 22 de mayo de 2014

Preparar un pendrive de arranque FreeDOS para flashear la BIOS

En muchas ocasiones necesitamos flashear la BIOS de un equipo y alguno de los procedimientos de flasheo requiere utilizar una herramienta que corre en DOS. Esto es, básicamente, porque antiguamente el procedimiento de flasheo se hacía desde un disquete. Pero, claro, hoy en día es raro encontrarse una máquina con diskette.

Muchas veces, curiosamente, el fabricante proporciona una herramienta de flasheo sólo para sistemas operativos propietarios, algo que no nos vale a los que trabajamos con sistemas operativos libres; o suministra una herramienta incorporada en la BIOS que requiere un sistema de archivos de un sistema operativo propietario, cosa que tampoco nos sirve. 

Entonces, no nos queda más que una opción: Utilizar las herramientas que corren en DOS.

Como tenía por ahí aparcado un pendrive de 256Mb que no utilizaba para nada, pensé en convertirlo en un dispositivo FreeDOS arrancable que pudiera utilizar fácilmente cada vez que tuviera que flashear una BIOS. 

Para no reinventar la rueda, os recomiendo utilizar las imágenes de arranque de esta web:

El autor ha publicado tres versiones:
Utilizad la que mejor se adapte a vuestras necesidades.

Son imágenes creadas con dd. Por lo tanto es muy fácil montarlas en nuestro pendrive.

Primero.- Descargad la imagen que queráis: http://chtaube.eu/computers/freedos/bootable-usb/#download

Segundo.- Una vez descargada, la descomprimís. Por ejemplo, supongamos que habéis descargado la imagen: FreeDOS-1.1-memstick-3-30M.img.bz2:
# bunzip2 FreeDOS-1.1-memstick-3-30M.img.bz2
Una vez descomprimida, tendréis un fichero FreeDOS-1.1-memstick-3-30M.img.

Tercero.- Introducís el pendrive, os fijáis en el nombre de dispositivo que tiene y ejecutáis:
# dd if=FreeDOS-1.1-memstick-3-30MB.img of=/dev/sdX bs=512k

En el nombre del dispositivo, debéis sustituir la X por la letra con la que se identifique.

Cuando termine el proceso, tendréis un "disco" Freedos grande en el que podréis añadir muchas roms y modificar a vuestro gusto los archivos del mismo. Una de las cosas que yo he hecho es añadir la siguiente línea al fichero AUTOEXEC.BAT para que cargue el idioma de teclado español:
KEYB SP,,C:\FDOS\BIN\KEYBOARD.SYS
También podéis crear diferentes ficheros .BAT que os permitan flashear las diferentes ROMS que tengáis guardadas en él o crear un menú que os permita escoger la ROM.
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 21 de mayo de 2014

DosEmu: Un emulador de DOS en Linux

Aunque parezca que ya nadie trabaja en DOS, todavía somos unos cuantos los que lo hacemos. No penséis que es por nostalgia, no; sino porque en algunas ocasiones nuestro trabajo lo requiere. Si bien es verdad que nos sentimos muy cómodos en un entorno en el que en su día echamos muchas horas y que quizás sea lo que nos ha llevado a sentirnos aún más cómodos en la línea de comandos de Linux.

DosEmu es un emulador de DOS en Linux que suelo usar con cierta frecuencia para preparar imágenes de diskette de arranque que me permitan flashear la BIOS de equipos desde un pendrive o desde CDROM si el equipo no arranca desde pendrive o incluso a través de la red.


Instalarlo es muy fácil porque se encuentra en los repositorios de Debian:
# apt-get install dosemu

Una vez instalado, se nos creará un acceso directo en el menú, aunque naturalmente, también podremos lanzarlo desde un terminal.

La primera vez que lo ejecutamos, se crea un directorio .dosemu en el HOME del usuario donde se guardarán todos sus archivos. Podéis comprobarlo:
ldap:~# tree .dosemu/
.dosemu/
├── boot.log
├── disclaimer
├── drive_c
│   ├── autoexec.bat
│   ├── config.sys
│   └── tmp
├── drives
│   ├── c -> /root/.dosemu/drive_c
│   └── d -> /usr/lib/dosemu/drive_z
└── run
    └── dosemu-midi

6 directories, 5 files

Si os fijáis en la imagen de más arriba, se configuran las siguientes unidades virtuales:
  • A: Para la unidad de disquete (si existe).
  • C: Apunta a la unidad C virtual que hay dentro del home del usuario, dentro del directorio ~/.dosemu/drive_c
  • D: Apunta al directorio HOME del usuario que ha iniciado DosEmu.
  • E: Apunta a la unidad de CDROM. 
  • Z: Apunta al directorio del sistema. Este directorio es de sólo lectura.
Si queréis crear alguna unidad virtual más que apunte a algún determinado lugar del sistema de archivos, podéis usar el comando LREDIR de DosEmu. Y si queréis que la unidad virtual se cree cada vez que arranquéis DosEmu, añadís el comando al archivo c:\autoexec.bat, por ejemplo.

Para reinstalar DOS en vuestro HOME, no tenéis más que iniciar dosemu con el parámetro -i:
$ dosemu -i

Os ofrecerá diferentes opciones de instalación, como instalar el sistema con un FreeDOS en modo de escritura, sólo lectura, instalarlo en otro directorio distinto del directorio por defecto, etc...

Como ya os decía al principio, suelo utilizar DosEmu para crear/modificar imágenes de disquete que luego voy a poder arrancar desde un dispositivo USB, CD o a través de la red. Veamos un ejemplo:

Supongamos que tengo una imagen de un disquete de arranque: dosdisk144.img y quiero modificarla para añadirle una imagen de la bios de un equipo para actualizarlo.

Creo un directorio dentro del HOME de root:
# mkdir /root/floppy
Monto la imagen del Floppy en dicho directorio:
# mount -o loop /root/floppies/dosdisk144.img /root/floppy
E inicio DosEmu:
# dosemu
Se iniciará DosEmu en la unidad C:\>
Recordad que hemos montado la imagen del disquete en /root/floppy y el directorio HOME es la unidad D:\>
Por lo tanto, en la ventana de DosEmu tendremos que cambiar a la unidad D:\> y entrar dentro del directorio floppy para modificar, copiar archivos y todo lo que queramos.
Cuando terminemos, cerramos la ventana de DosEmu y desmontamos la imagen del Floppy:
# umount /root/floppy

Luego ya tan sólo será cuestión de copiar la imagen al USB, al CD o al directorio tftp y realizar los ajustes necesarios para poder arrancarla.

Publicado por primera vez en http://enavas.blogspot.com.es

martes, 20 de mayo de 2014

Raspberry Pi como Punto de Acceso con hostapd

En un post anterior, vimos cómo conectar nuestra Raspberry Pi a la red usando un interfaz wifi. En este post, vamos a ver justo lo contrario: Cómo convertir nuestra Raspberry Pi en un Punto de Acceso que permita a otros clientes conectarse a la red vía wifi.

Lo primero que haremos será conectar el interfaz usb wifi a uno de los puertos de la Raspberry. Una vez conectado, abrimos un shell y ejecutamos el comando lsusb:
pi@raspberrypi:~$ lsusb 
Bus 001 Device 014: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 
Bus 001 Device 015: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 016: ID 046d:c52b Logitech, Inc. Unifying Receiver 
Bus 001 Device 017: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB 
Bus 001 Device 018: ID 048d:1336 Integrated Technology Express, Inc. SD/MMC Cardreader 
Bus 001 Device 019: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter 
Bus 001 Device 020: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge

Con este comando detectaremos todos los dispositivos usb conectados a la Raspberry, y en particular, el interfaz wifi usb que hemos conectado. Como podéis ver, en mi caso es un Ralink con chipset RT5370.

Instalamos el firmware para dispositivos con ralink y realtek. El primero lo instalo porque es el firmware de mi dispositivo y el segundo porque es muy común y me serviría en caso de que conecte un dispositivo Realtek:
pi@raspberrypi:~$ sudo -i root@raspberrypi:~# apt-get install firmware-ralink firmware-realtek
Instalamos también el paquete wireless-tools:
root@raspberrypi:~# apt-get install wireless-tools
A continuación, editamos el fichero /etc/network/interfaces para asignar una dirección IP estática al interfaz wlan0 (nuestro interfaz wifi):
auto lo

iface lo inet loopback
iface eth0 inet dhcp

iface wlan0 inet static
   address 192.168.2.1
   netmask 255.255.255.0

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp
Observad que he comentado la parte de configuración dinámica de la wifi en lugar de borrarla, más que nada para no perderla.

He marcado en negrita las líneas que definen la configuración de IP estática en este fichero. Resaltar que nuestra Raspberry estará conectada en cada interfaz a una red diferente:
  • Interfaz eth0 (conecta la Raspberry a nuestra LAN): 192.168.1.0/24
  • Interfaz wlan0 (hace de interfaz de acceso wifi): 192.168.2.0/24
Si os fijáis en la configuración del fichero /etc/network/interfaces, la asignación de dirección IP en la interfaz eth0 se hace por DHCP y en wlan0 de forma estática.

Una vez configurada la red, vamos a necesitar un servidor dhcp y, para ello, usaremos dnsmasq. No vamos a entrar en muchos detalles de configuración de dnsmasq porque lo trataremos en un artículo más adelante. Así que lo instalamos:
root@raspberrypi:~# apt-get install dnsmasq
Una vez instalado, vamos a configurarlo. Para ello, creamos un fichero en /etc/dnsmasq.d/, como por ejemplo: /etc/dnsmasq.d/mired con la siguiente configuración mínima:
interface=wlan0
dhcp-range=192.168.2.50,192.168.2.254,12h
dhcp-option=3,192.168.2.1
server=8.8.8.8
server=8.8.4.4
Con esta configuración mínima, le estamos indicando a dnsmasq:
  • Que escuche peticiones tan sólo en la interfaz wlan0.
  • Que asigne direcciones IP de forma dinámica en el rango 192.168.2.50 - 192.168.2.254.
  • Que la puerta de enlace es la 192.168.2.1 (la interfaz wlan0 de nuestra Raspberry Pi).
  • Que utilice los servidores DNS de Google: 8.8.8.8 y 8.8.4.4
Una vez realizados los cambios, reiniciamos el servicio:
root@raspberrypi:~# service dnsmasq restart
A continuación, instalamos el paquete hostapd:
root@raspberrypi:~# apt-get install hostapd
El siguiente paso será configurar hostapd. Para ello creamos un archivo de configuración /etc/hostapd/hostapd.conf:
# interface used by access point
interface=wlan0

# firmware driver
driver=nl80211

# access point SSID
ssid=MiWifi

# operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g)
hw_mode=g

# access point channel
channel=6

# options
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0

# key management algorithm
wpa_key_mgmt=WPA-PSK
wpa_passphrase=miclavewpa
wpa=2

# set ciphers
wpa_pairwise=TKIP
rsn_pairwise=CCMP

En este archivo es suficiente con que cambiéis los parámetros que os he marcado en negrita:
  • El nombre de la red: ssid
  • El canal: channel
  • La clave de acceso: wpa_passphrase
El siguiente paso será editar el archivo /etc/default/hostapd para añadir una línea que indique a hostapd cual es el fichero de configuración:
root@raspberrypi:~# echo 'DAEMON_CONF="/etc/hostapd/hostapd.conf"' >> /etc/default/hostapd 
A continuación reiniciamos el sistema para aplicar los cambios realizados en la configuración de red:
root@raspberrypi:~# reboot
Reinicio el sistema y no solo el servicio de red porque estoy conectado vía ssh y voy a perder la conexión al reiniciar el servicio.
Cuando vuelva a arrancar de nuevo, activo el IP Forwarding:
root@raspberrypi:~# nano /etc/sysctl.conf
Añadiendo la siguiente línea:
net.ipv4.ip_forward=1
Y aplico las reglas IPTABLES que me van a permitir redirigir el tráfico entre las dos interfaces:
root@raspberrypi:~# iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 
root@raspberrypi:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
root@raspberrypi:~# iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Si os conectáis ahora a la red Wifi que hemos creado, comprobaréis que ya podéis navegar. No obstante, las reglas de IPTABLES aplicadas se perderán cuando apaguemos el sistema. Para que se apliquen cada vez que se encienda el sistema vamos a hacer una cosa: 

Guardaremos las reglas aplicadas en este momento en un fichero:
root@raspberrypi:~# iptables-save > /etc/network/iptables.default
Y modificaremos el archivo /etc/network/interfaces para que se activen cada vez que se levante el interfaz de red, añadiendo la línea que os marco en negrita al archivo:

auto lo

iface lo inet loopback
iface eth0 inet dhcp

iface wlan0 inet static
   address 192.168.2.1
   netmask 255.255.255.0
   up iptables-restore < /etc/network/iptables.default

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

Y eso es todo. A partir de este momento, ya podéis utilizar vuestra Raspberry Pi como punto de acceso de cualquier red a la que la conectéis mediante ethernet.
Publicado por primera vez en http://enavas.blogspot.com.es

Cambio de caja al servidor ldap para bajar la temperatura

Como la caja del servidor ldap es pequeña no tiene buena refrigeración y los componentes se calientan demasiado, sobre todo los discos duros, algo muy lógico porque al fin y al cabo es un equipo diseñado para uso de escritorio. Además el ventilador que tiene es pequeño: 40x40 mm. Por este motivo decidí cambiar los componentes a otra con más espacio y, de paso, con mayor número de ventiladores para mover el aire del interior. 

Por lo que veo, el cambio ha dado buen resultado porque he conseguido bajar la temperatura de ambos discos duros una barbaridad:
  • La temperatura del disco /dev/sda ha bajado de 48ºC a 28ºC.
  • La temperatura del disco /dev/sdb ha bajado de 53ºC a 30ºC.


Aparte de tener más espacio, la caja disponía de dos ventiladores de chasis traseros de 80x80mm y le he montado otros dos delanteros también de 80x80mm.

Publicado por primera vez en http://enavas.blogspot.com.es

lunes, 19 de mayo de 2014

Conectar Raspberry Pi a la red usando un interfaz wifi

Como ya sabéis una Raspberry Pi dispone de conexión de red ethernet pero no tiene wifi. Si queremos lograr que nuestra Raspberry se conecte a nuestra red de área local vía wifi o queremos que se comporte como punto de acceso, tendremos que conectarle un interfaz wifi usb.


En este post vamos a ver cómo conectar nuestra Raspberry Pi a la red vía wifi desde la línea de comando. Configurarlo desde el interfaz gráfico es muy sencillo en Raspbian y está muy bien, pero puede que no tengamos interfaz gráfica y no tengamos más remedio que realizar una configuración mediante comandos.

Lo primero que haremos será conectar el interfaz usb wifi a uno de los puertos de la Raspberry. Una vez conectado, abrimos un shell y ejecutamos el comando lsusb:
pi@raspberrypi:~$ lsusb
Bus 001 Device 014: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 015: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 016: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 017: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 018: ID 048d:1336 Integrated Technology Express, Inc. SD/MMC Cardreader
Bus 001 Device 019: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
Bus 001 Device 020: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge

Este comando detectará todos los dispositivos usb conectados a la Raspberry, y en particular, el interfaz wifi usb que hemos conectado. Como podéis ver, en mi caso es un Ralink con chipset RT5370.

Como tengo un Ralink, instalaré el firmware para dispositivos con firmware ralink. También instalaré el firmware realtek porque también es muy común:
pi@raspberrypi:~$ sudo -i
root@raspberrypi:~# apt-get install firmware-ralink firmware-realtek
Instalaré también el paquete wireless-tools:
root@raspberrypi:~# apt-get install wireless-tools

A continuación vamos a configurar el archivo /etc/network/interfaces para que se conecte a nuestra red wifi. Si tenéis instalado Raspbian y no habéis tocado la configuración, vuestro /etc/network/interfaces tendrá el siguiente contenido:
auto lo

iface lo inet loopback
iface eth0 inet dhcp

iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
Para no perder la configuración por defecto, vamos a comentar las líneas que he resaltado en negrita en el bloque anterior.

Y vamos a añadir las que permitan realizar la conexión a nuestra red wifi cuando se conecte el interfaz de red. Suponiendo que vuestra red wifi se llama WLAN_C54A y vuestra clave wifi es miClave, el archivo os quedará así:
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
   wpa-ssid "WLAN_C54A"
   wpa-psk "miClave"

# iface wlan0 inet manual
# wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
# iface default inet dhcp

Si os dáis cuenta, estamos configurando el interfaz wlan0 con allow-hotplug, de manera que se permita la conexión/desconexión en caliente del dispositivo. Además, lo configuramos de manera que se obtenga una dirección IP vía DHCP.

Una vez hecho ésto, reinciad la Raspberry:
root@raspberrypi:~# reboot
Si estáis conectados localmente, sería suficiente con reiniciar el servicio de red, pero si estáis conectados de forma remota por ssh, perderíais la conexión. Por eso reiniciamos el sistema completo.

Publicado por primera vez en http://enavas.blogspot.com.es

Error /usr/sbin/grub-probe: error: Couldn't find PV pv1. Check your device.map

Hace tiempo monté un segundo disco duro en el servidor ldap y lo configuré con lvm como un volúmen físico del grupo de volúmenes. El caso es que en estos días, al actualizarse el kernel, recibía una y otra vez el mismo error:

"Error /usr/sbin/grub-probe: error: Couldn't find PV pv1. Check your device.map" 

Eché un vistazo al archivo /boot/grub/device.map y observé que tan sólo aparecía el primer disco.

Para solucionar el problema, renombré el archivo device.map:
# mv /boot/grub/device.map /boot/grub/device.map.old
Para que se volviera a regenerar device.map ejecuté:
# update-grub
Eché un vistazo al contenido del device.map y ahora sí aparecía el segundo disco duro.

Hice un:
# dpkg --configure -a
Y el problema quedó resuelto.

Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 15 de mayo de 2014

Monitorizar la temperatura de la placa base, CPU y el disco duro con Monit

Una vez que tenía monitorizados los servicios de los servidores LTSP, el servidor ldap y el servidor nfs, me pareció que sería interesante monitorizar también la temperatura de la placa base, la cpu y el disco duro de los mismos, y, si fuera posible, las revoluciones de los ventiladores, sobre todo teniendo en cuenta que los servidores de terminales se encuentran en cajones cerrados donde la ventilación puede no ser tan buena como debería.

Como quería utilizar Monit y la versión de los repositorios no admitía programas definidos por el usuario, tuve que crear el paquete para Debian con la versión 5.8.

Para realizar la monitorización, instalé la versión 5.8 de Monit y me basé en lm-sensors y hddtemp:
# apt-get install monit lm-sensors hddtemp
Es importante destacar que instalé monit con apt-get porque lo tenía añadido al repositorio particular que tengo montado en mi centro. Si no lo tenéis añadido a un repositorio propio, tendréis que descargarlo e instalarlo mediante dpkg.

Una vez instalado  el paquete lm-sensors, ya podéis monitorizar voltajes, temperaturas y revoluciones de ventiladores con el comando:
# sensors
Los resultados que obtengáis dependerán de la placa base que tengáis. Os muestro un ejemplo de salida del comando:
# sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +40.0°C  (crit = +75.0°C)

atk0110-acpi-0
Adapter: ACPI interface
Vcore Voltage:      +1.34 V  (min =  +0.85 V, max =  +1.60 V)
 +3.3 Voltage:      +3.31 V  (min =  +3.00 V, max =  +3.60 V)
 +5.0 Voltage:      +4.92 V  (min =  +4.50 V, max =  +5.50 V)
+12.0 Voltage:     +12.16 V  (min = +11.20 V, max = +13.20 V)
CPU FAN Speed:     3229 RPM  (min =    0 RPM, max = 1800 RPM)
CHASSIS FAN Speed: 1493 RPM  (min =    0 RPM, max = 1800 RPM)
POWER FAN Speed:      0 RPM  (min =    0 RPM, max = 1800 RPM)
CPU Temperature:    +31.0°C  (high = +90.0°C, crit = +125.0°C)
MB Temperature:     +38.0°C  (high = +45.0°C, crit = +90.0°C)

k8temp-pci-00c3
Adapter: PCI adapter
Core0 Temp:   +28.0°C  
Core0 Temp:   +23.0°C  
Core1 Temp:   +32.0°C  
Core1 Temp:   +31.0°C  
Del mismo modo, una vez instalado el paquete hddtemp, podréis monitorizar la temperatura del disco duro:
# hddtemp /dev/sda
Un ejemplo:
# hddtemp /dev/sda
/dev/sda: ST32000542AS: 34°C
Bien, pues una vez que tenemos las herramientas necesarias instaladas, creamos un script que obtenga solamente los valores numéricos que necesito. Por ejemplo, yo creé un script /usr/local/sbin/mbtemp.sh que obtiene el valor de temperatura de la placa base y lo devuelve:
# cat /usr/local/sbin/mbtemp.sh 
#!/bin/bash
MBTEMP=`sensors |grep "MB Temperature"| cut -f6 -d" " | tr -d '+' | tr -d '°C'  | awk '{printf("%d\n",$1 + 0.5)}'`
# echo $MBTEMP # for debug only
exit $MBTEMP
Es necesario devolver el valor (exit $MBTEMP) para poder recogerlo en la configuración de Monit y actuar en consecuencia. Una vez que ya tenía el script, creé un fichero de configuración para almacenar las configuraciones de gestión de temperatura en el directorio /etc/monit.d/ con el siguiente contenido:
check program MBtemp with path "/usr/local/sbin/mbtemp.sh"
   if status > 60 then alert
   group temperature
La configuración anterior es muy sencilla. Le estamos diciendo a Monit que utilice el programa MBtemp ubicado en /usr/local/sbin/mbtemp.sh (el nombre MBtemp es identificativo nada más) y si el valor devuelto por el script (la temperatura) es mayor de 60, envíe una alerta.
Bien, pues para monitorizar la temperatura de la CPU, hacemos lo mismo: Creamos un script que obtenga el valor de temperatura de la CPU y lo devuelva:
# cat /usr/local/sbin/cputemp.sh 
#!/bin/bash
CPUTEMP=`sensors |grep "CPU Temperature"| cut -f5 -d" " | tr -d '+' | tr -d '°C'  | awk '{printf("%d\n",$1 + 0.5)}'`
# echo $CPUTEMP # for debug only
exit $CPUTEMP
Y añadimos la configuración de gestión de la temperatura al fichero de gestión de Monit que creamos en el caso anterior:
check program CPUtemp with path "/usr/local/sbin/cputemp.sh"
   if status > 60 then alert
   group temperature
Podríamos almacenar esta configuración en otro fichero nuevo si queremos, pero lo he almacenado en el mismo porque me ha parecido bien organizarlo así. Del mismo modo, creamos un script que obtenga el valor de temperatura del disco duro:
# cat /usr/local/sbin/hddtempsda.sh 
#!/bin/bash
HDDTEMPsda=`hddtemp /dev/sda | cut -f3 -d":" | tr -d ' ' | tr -d '°C'`
# echo $HDDTEMPsda # for debug only
exit $HDDTEMPsda
Y añadimos la configuración de gestión de la temperatura al fichero de gestión de Monit que creamos al principio:
check program HDDtempsda with path "/usr/local/sbin/hddtempsda.sh"
   if status > 50 then alert
   group temperature

Resumiendo. Hemos creado 4 ficheros:
  • /usr/local/sbin/mbtemp.sh (script que obtiene la temperatura de la placa base)
  • /usr/local/sbin/cputemp.sh (script que obtiene la temperatura de la cpu)
  • /usr/local/sbin/hddtemp.sh (script que obtiene la temperatura del disco duro)
  • /etc/monit.d/temperatura (fichero en el que hemos definido las reglas de gestión de temperatura)
El fichero /etc/monit.d/temperatura quedaría así:
check program MBtemp with path "/usr/local/sbin/mbtemp.sh"
   if status > 60 then alert
   group temperature

check program CPUtemp with path "/usr/local/sbin/cputemp.sh"
   if status > 60 then alert
   group temperature

check program HDDtempsda with path "/usr/local/sbin/hddtempsda.sh"
   if status > 50 then alert
   group temperature

Por último, reiniciamos el servicio monit:
# service monit restart

Si ahora abrimos el navegador y accedemos al interfaz web de monit, veremos que se muestra el control de las temperaturas.

Es importante controlar también las revoluciones de los ventiladores para saber si alguno ha bajado de revoluciones o ha dejado de funcionar y evitar que los servidores se calienten.

En los servidores de terminales que tenemos en mi centro es posible monitorizar las revoluciones del ventilador de la cpu y el que está conectado a la conexión CHASSIS FAN SPEED de la placa. No es posible monitorizar el ventilador de la caja porque está conectado directamente a la fuente. Lo peor es que después de revisar todos los servidores de terminales he visto que 12 de ellos tenían el ventilador de la caja gripado. Si hubieran estado conectados a la placa base, podría haberlos monitorizado de forma remota.

Publicado por primera vez en http://enavas.blogspot.com.es

Configurar el servidor nfs del centro como puerta de enlace + squid

En un post anterior os mostraba cómo he configurando los dos servidores de mi centro para tener una alta disponibilidad de servicios. Además, he instalado Monit en todos los servidores para monitorizar servicios y las temperaturas de la placa base, cpu y disco duro de cada uno de ellos. 

Pues bien, el otro día, monitorizando el servidor ldap he observado que los dos discos duros instalados en él tienen una temperatura demasiado alta (uno de ellos está cerca de los 45ºC), sobre todo si los comparamos con las temperaturas de los discos duros de los servidores LTSP (en torno a los 30-35ºC). Creo que el servidor de ldap tiene un problema fundamental y es que la caja es demasiado pequeña y no ventila bien. Además los ventiladores también son pequeños y los discos duros están justo uno encima del otro, por lo que se dan calorcito mutuamente.

Como tengo un ordenador que me trajo un compañero con una caja tipo torre más grande con varios ventiladores de 80x80mm, pensé: Voy a intercambiar  las cajas entre ambos ordenadores para reducir la temperatura de los componentes: Discos duros, placa base y procesador. Pero hay un problema. ¿Cuándo lo hago sin detener los servicios? Si el servidor ldap está funcionando siempre y además es la puerta de enlace... Así que revisé mi esquema y pensé: Si configuro el servidor nfs como puerta de enlace y le monto squid, tan sólo tengo que modificar un objeto en la configuración de dhcp de la base de datos ldap  para que se asigne como puerta de enlace  el servidor nfs. De este modo, podré parar el servidor ldap sin dejar de dar servicio. Así que me puse manos a la obra y ésta es la configuración que tengo actualmente:
Faltaría repasarlo detenidamente y hacer la prueba. ¿Cuándo? Ya veremos.
Publicado por primera vez en http://enavas.blogspot.com.es

martes, 13 de mayo de 2014

Publicar el servicio SSH de nuestra Raspberry Pi mediante avahi-daemon

En Raspbian, por ejemplo, cuando instalamos avahi-daemon, el servicio ssh no se publica en la red. ¿Qué quiere decir ésto? Que aunque podamos acceder a los servicios web de nuestra Raspberry por su nombre de host con el dominio .local, no podremos conectarnos a ella por dicho nombre.

¿Qué es lo que tenemos que hacer? Simplemente crear un fichero en el directorio /etc/avahi/services que publique el servicio ssh. En el directorio /usr/share/doc/avahi-daemon/examples/ encontraréis un archivo de configuración de ejemplo que publica el servicio ssh: ssh.service

Para publicar el servicio ssh, podéis copiar el archivo de ejemplo:
# cp /usr/share/doc/avahi-daemon/examples/ssh.service /etc/avahi/services/
Y reiniciar el servicio:
# service avahi-daemon restart
Publicado por primera vez en http://enavas.blogspot.com.es

lunes, 12 de mayo de 2014

ChocolateyGUI: Un Interfaz Gráfico de Usuario para Chocolatey

Aunque es muy sencillo usar Chocolatey mediante comandos, muchos usuarios están acostumbrados al entorno gráfico y les cuesta usarlos. Si eres de este tipo de usuario, te gustará saber que existe ChocolateyGUI, un Interfaz Gráfico de Usuario que te ocultará la línea de comandos permitiéndote realizar la instalación/desinstalación de paquetes de una forma gráfica:


Una cuestión a tener en cuenta, según nos muestran en la información de este paquete, debido a una dependencia del "Windows Management Framework" es que este paquete sólo funciona correctamente en Windows 7 SP1, Windows Server 2008 SP1 y Windows Server 2008 SP2 y versiones superiores.

Este paquete lo instaláis como otro cualquiera, mediante Chocolatey:
C:\> cinst ChocolateyGUI
Publicado por primera vez en http://enavas.blogspot.com.es

Chocolatey: Un gestor de paquetes tipo apt-get para Windows

Todos los que administramos principalmente máquinas Linux, echamos de menos un gestor de paquetes que nos permita instalar programas en Windows del mismo modo que lo hacemos en Linux: Usando un comando y sin tener que rebuscar entre montones de webs.

A raiz de impartir el curso de Administración centralizada de equipos mediante Puppet en la Escuela de Administración Pública de Extremadura, he profundizado bastante en el tema y había barajado, entre otras opciones, usar Puppet para gestionar también las máquinas Windows, pero no me acababa de convencer porque la versión de Puppet para Windows no está tan desarrollada como la de Linux. Pero si instalamos Puppet y lo complementamos con Chocolatey, la cosa mejora sustancialmente.

Teniendo en cuenta que Chocolatey va a poner a nuestra disposición más de 1.800 paquetes de software libre y/o gratuito para Windows que podremos instalar fácilmente mediante un sólo comando, estoy plenamente convencido de que sería de gran utilidad no sólo para administradores, sino también para usuarios, que muchas veces instalan sin saberlo malware al descargar programas desde determinadas webs que lo incluyen como regalito. 

Instalar Chocolatey en Windows es muy sencillo:

Abrid un terminal de comandos (cmd) y ejecutad el siguiente comando:
C:\> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
Una vez instalado, lo primero que os recomiendo hacer es no cerrar el terminal y consultar la ayuda del comando:
C:\> chocolatey /?
Veréis que es muy sencillo de utilizar: Por ejemplo, supongamos que queremos comprobar si el paquete vlc se encuentra en la galería de paquetes de Chocolatey:
C:\> chocolatey list vlc
Si se encuentra disponible, nos mostrará también la versión. Una vez comprobado que el paquete existe, podemos instalarlo de la siguiente manera:
C:\> chocolatey install vlc
Existe una forma abreviada del comando "chocolatey install": cinst. Si queréis instalar el paquete anterior usando la forma abreviada, podríais hacerlo así:
C:\> cinst vlc
Si ya tenéis un paquete instalado y lo que queréis es actualizarlo:
C:\> chocolatey update vlc

Si echáis un vistazo a la lista de paquetes disponibles, veréis que podréis instalar el software de uso más frecuente mediante Chocolatey:
https://chocolatey.org/packages
Publicado por primera vez en http://enavas.blogspot.com.es

viernes, 9 de mayo de 2014

DEBIAN_FRONTEND=noninteractive: Instalar un paquete de forma no interactiva

En ocasiones necesitamos instalar un programa de forma desatendida, ya sea mediante puppet o cualquier otro mecanismo, pero no podemos hacerlo porque está pensando para realizar una instalación en modo interactivo, de tal manera que el usuario responda a determinadas cuestiones de configuración.

Es posible instalar un paquete de forma desatendida de manera que no haga preguntas al usuario y tome las opciones por defecto  utilizando: DEBIAN_FRONTEND=noninteractive.

Por ejemplo: Supongamos que quiero instalar el paquete hddtemp sin que me pregunte si deseo iniciar el demonio hddtemp en el arranque del sistema, cuya respuesta por defecto es "No". Podría hacerlo de la siguiente manera:
DEBIAN_FRONTEND=noninteractive apt-get install hddtemp
Publicado por primera vez en http://enavas.blogspot.com.es

Enviar notificaciones de Monit usando el SMTP de Gmail

Podemos hacer que Monit nos envíe notificaciones mediante email cuando se produzca un determinado evento en los servicios, ficheros, directorios o dispositivos que estemos monitorizando.

Para ello debemos disponer de un servidor de correo en nuestra organización, pero no os preocupéis si no lo tenéis porque podéis usar el SMTP de Gmail, incluyendo las siguientes instrucciones en el fichero de configuración /etc/monit/monitrc:
set mailserver smtp.gmail.com port 587
   username "miusuario@gmail.com" password "mipassword"
   using tlsv1
   with timeout 30 seconds

En las instrucciones anteriores, deberéis sustituir "miusuario" por el nombre de usuario de una cuenta de Gmail y "mipassword" por la contraseña de dicha cuenta.

Con ésto, hemos definido el SMTP con el que se van a  enviar las notificaciones por email. Ahora bien, también tendremos que indicar el email de la persona que va a recibir dichas notificaciones, añadiendo la siguiente instrucción al fichero de configuración /etc/monit/monitrc:
set alert usuario@proveedor.dominio
Por ejemplo:
set alert administrador.valledeljerte@edu.gobex.es
Una vez configurado el servidor SMTP a utilizar y el receptor de las notificaciones, ya podemos crear reglas que monitoricen nuestros servicios y nos envíen alertas. Por ejemplo:
check process sshd with pidfile /var/run/sshd.pid
   group system
   group sshd
   start program = "/etc/init.d/ssh start"
   stop  program = "/etc/init.d/ssh stop"
   if failed host localhost port 22 with proto ssh then restart 
   if 5 restarts with 5 cycles then alert
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 8 de mayo de 2014

Acceso al interfaz web de Monit

El control de acceso al interfaz web de monit se encuentra definido en el siguiente conjunto de líneas del fichero de configuración /etc/monit/monitrc:
set httpd port 2812 and
    use address localhost  # only accept connection from localhost
    allow localhost        # allow localhost to connect to the server and
    allow admin:monit      # require user 'admin' with password 'monit'
    allow @monit           # allow users of group 'monit' to connect (rw)
    allow @users readonly  # allow users of group 'users' to connect readonly
En el fichero de configuración de monit, nos dice que si queremos acceder usando SSL, debemos consultarlo en su wiki, porque por defecto no viene activado.

Las reglas de acceso son muy fáciles de entender. Le estamos indicando a monit:
  • Que escuche en el puerto 2812 (set httpd port 2812).
  • Que el nombre del host por el que se debe acceder al interfaz es localhost (use address localhost). Si la máquina que estoy monitorizando se llama ldap.valledeljerte3, podría definir un "use address ldap.valledeljerte3" en el fichero de configuración para que hubiera que acceder al interfaz de la siguiente manera: http://ldap.valledeljerte:2812.
  • Que se permite el acceso a la máquina localhost (allow localhost). Podríamos definir otra línea con la IP de nuestro equipo para poder acceder desde él al interfaz web de monit. Por ejemplo: allow 192.168.1.14
  • Que se requiere introducir el usuario admin con la contraseña monit para lograr el acceso (allow admin:monit).
  • Que se permite el acceso completo a los usuarios del grupo "monit" (allow @monit).
  • Que se permite acceso de sólo lectura a los usuarios del grupo "users" (allow @users).
Comprendiendo ésto, es muy fácil establecer nuestras propias reglas de acceso. Por ejemplo:
set httpd port 2812 and
    allow localhost 
    allow 172.19.144.14
    allow admin:mipassword

Instalar Monit para monitorizar nuestros servidores

El mes pasado escribí un post explicando qué era Monit y contando que lo había montado en todos los servidores ltsp, además del servidor ldap y el servidor nfs. Aunque en los servidores ltsp lo he instalado y configurado mediante un módulo puppet, hoy voy a explicar cómo instalarlo y configurarlo manualmente.

Para descargar Monit, podéis hacerlo desde la web oficial:

De este modo, podréis tener la versión más actualizada, aunque si buscáis la comodidad y simplicidad a la hora de instalar, hacedlo desde los repositorios. A día de hoy, la versión disponible en Debian Squeeze es demasiado antigua (5.1), pero en Debian Wheezy está más actualizada (5.4) y en Wheezy-backports un poco más aún (5.6).

Como ya comenté ayer en otro post, quería monitorizar la temperatura de la placa base de los servidores de terminales y no podía hacerlo por ser muy antigua la versión de los repositorios de Debian Squeeze, así que creé un paquete de la versión 5.8 para Squeeze. Si lo necesitáis podéis descargarlo desde los siguientes posts:
http://enavas.blogspot.com.es/2014/05/paquete-de-32-bits-de-monit-58-para.html

Para consultar la documentación sobre Monit, también podéis recurrir a la web oficial:
http://mmonit.com/monit/documentation/monit.html

Y para consultar la FAQ, tenéis el wiki:
http://mmonit.com/wiki/

Instalar Monit desde los repositorios de Wheezy es de lo más sencillo:
# apt-get update && apt-get -y install monit
Si váis a instalarlo en Squeeze, descargadlo desde mi cuenta de Box y lo instaláis con dpkg. Si vuestro sistema es de 64 bits:
# dpkg -i monit_1%3a5.8-2_amd64.deb
Y si vuestro sistema es de 32 bits:
# dpkg -i monit_1%3a5.8-2_i386.deb
Una vez instalado, encontraréis los siguientes ficheros/directorios de configuración:
  • /etc/default/monit
  • /etc/monit/monitrc
  • /etc/monit.d/
El fichero /etc/default/monit sirve para activar/desactivar Monit en el arranque de la máquina y definir opciones para el demonio.

El fichero /etc/monit/monitrc es el fichero de configuración principal de monit, donde realizaremos la configuración por defecto. Al final de este fichero encontraréis una línea comentada como la siguiente:
#  include /etc/monit.d/*
Si la "descomentáis", podréis colocar ficheros de configuración para definir servicios a monitorizar en /etc/monit.d/:
include /etc/monit.d/*
El directorio /etc/monit.d/, por decirlo de algún modo, sirve para incluir servicios a monitorizar en diferentes ficheros.
Para iniciar, parar, reiniciar, etc... el servicio:
/etc/init.d/monit {start|stop|reload|restart|force-reload|syntax|status}.

Publicado por primera vez en http://enavas.blogspot.com.es

Paquete de 32 bits de Monit 5.8 para Debian Squeeze

En el artículo anterior compartí la versión de 64 bits de Monit 5.8. Aquí dejo la versión de 32 bits que acabo de empaquetar:
https://app.box.com/s/7c2icyfu3tej4j1r9nd7
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 7 de mayo de 2014

Paquete de Monit 5.8 para Debian Squeeze

Quería monitorizar la temperatura de la placa base y de la cpu de los servidores de terminales utilizando la opción "check program" de Monit y después de tener los scripts preparados, compruebo que me da un error de sintaxis.

Después de investigar un poco, me doy cuenta de que este error se debe a que la versión de monit que hay en los repositorios de Debian (5.1.1) es un poco antigua y monit no reconoce los programas definidos por el usuario.

Para no perder mucho tiempo, he creado un paquete de forma "rápida" con la versión 5.8 de Monit. Lo cuelgo en mi cuenta de box.com por si alguien lo necesita:

Publicado por primera vez en http://enavas.blogspot.com.es

martes, 6 de mayo de 2014

Ejemplo de clonación de una partición con UDPcast

Creo que en alguna ocasión ya he comentado que hace tiempo decidí aprovechar la partición /dev/sda3 de nuestros portátiles para montar un sistema de clonación con clonezilla que me permitiera restaurar el disco duro o algunas particiones del portátil a su estado "original". Lo que hice fue montar clonezilla en dicha partición y almacenar allí la imagen de restauración, añadiendo entradas a grub que permitieran restaurar el sistema.

Más adelante, me pareció que sería interesante que, de algún modo, pudiera transferir el contenido de la partición /dev/sda3 cuando tuviera una nueva imagen de clonación desde un portátil modelo al resto de portátiles para poder restaurarlos nuevamente con una imagen más actualizada del sistema. 

Lo que pensé fue que podía conectar los portátiles a los que quisiera transferir la imagen de clonación a un switch y enviarles la imagen mediante UDP Cast, una herramienta con la que conseguiría remitir la imagen a todos los portátiles a la vez en modo multicast.

Como cuando hice la prueba fui tomando algunas fotos, os voy a mostrar el procedimiento que seguí:

Lo primero que hice fue añadir Udpcast a los portátiles y crear una nueva entrada de Grub (Ver https://www.udpcast.linux.lu/usb.html) que me permitiera iniciar UDP Cast en cualquiera de ellos:


Una vez añadida arrancamos el portátil y, en lugar de permitir que arranque el sistema operativo, elegimos arrancar "Udpcast" en ambos portátiles.

Nos pedirá que elijamos el idioma del interfaz. Como no había interfaz en español, yo escogí inglés:


Lo siguiente será escoger el mapa de teclado. A falta de español, dejé la distribución de teclado US, que conozco mejor:


El siguiente paso será escoger el driver de red de la tarjeta ethernet. Normalmente lo detectará por defecto:


A continuación nos pedirá que introduzcamos parámetros para la interfaz de red detectada. Normalmente no necesitaréis introducir ningún parámetro. Así que directamente pulsáis "OK":


Si todo ha ido bien, veréis que os muestra la información relativa a la tarjeta ethernet detectada, incluyendo su nombre y dirección MAC:


Lo siguiente que os preguntará es si queréis que la tarjeta de red se configure mediante bootp/DHCP:


Si habéis conectado el switch a la red de vuestro centro y tenéis un servidor DHCP, podéis dejar esta opción directamente. En caso contrario, podríais seleccionar "No" e introducir los datos de configuración de la tarjeta de red manualmente.

Si habéis elegido realizar la configuración de red automáticamente, veréis una pantalla como la siguiente, en que os muestra que está enviando una solicitud de dirección IP:


Y si todo va bien, comprobaréis que la máquina ha recibido una dirección IP:


El siguiente paso será responder que deseamos que se cargue un módulo para el disco duro:


Tendréis que elegir el módulo que hay que cargar para el disco duro. Como los portátiles que estaba utilizando tenían disco SATA (la opción más habitual hoy en día), escogí ahci:


Al igual que con la tarjeta de red, os preguntará si queréis introducir algún parámetro para el módulo de carga del disco duro:


Como probablemente no necesitaréis indicar ningún parámetro, seleccionad "OK" y listo.

Y os mostrará la información de carga del módulo:


Nos ofrecerá el puerto 9000 como puerto para realizar la transferencia. Si tenéis alguna aplicación que trabaja en dicho puerto, podéis cambiarlo. En caso contrario, nos sirve perfectamente y lo dejaremos:


A continuación nos pedirá que seleccionemos la partición que queremos transferir. Como ya os dije al principio, me interesa transferir la partición /dev/sda3 porque es donde tengo almacenada la imagen de restauración y la herramienta de restauración clonezilla. Si quisiera transferir todo el disco duro, podría escoger /dev/sda:


Os ofrecerá la posibilidad de introducir parámetros adicionales. Como normalmente, no lo necesitaréis seleccionad "OK" y pulsad ENTER:


También os pedirá que seleccionéis un método de compresión de datos, si queréis que el volumen de datos a enviar sea menor:


En el ordenador que va a enviar la partición, elegid la opción "Start sender":


En el ordenador que va a recibir la partición, elegid la opción "Start receiver":


Para realizar la prueba de clonación usé dos ordenadores. Aquí podéis ver la opción elegida en cada uno de ellos:


Si váis a clonar varios ordenadores seleccionaréis uno como "sender" y varios "receivers".

Al pulsar "OK" en los ordenadores que van a recibir la imagen, os mostrará la siguiente pantalla donde os pedirá que pulséis una tecla para comenzar a recibir datos:


Al pulsar "OK" en el ordenador que va a enviar la imagen, os mostrará la siguiente pantalla donde os pedirá que pulséis una tecla para comenzar a enviar datos a los receptores:


Pulsad una tecla para iniciar cada uno de los receptores en primer lugar y, después pulsad una tecla en el ordenador que va a enviar la imagen para que comience a  realizarse la transferencia.

Así es como se verá el proceso en el ordenador que envía:


Y así es como se verá en el que recibe:


Tardará un poco, pero cuando el proceso termine, tendréis clonada la partición /dev/sda3 en todos los ordenadores clientes.

Publicado por primera vez en http://enavas.blogspot.com.es