En mi trabajo se acumulan una enorme cantidad de papeles, asi que no quiero ni pensar lo que le ocurrire por ejemplo a un abogado. Pero en fin, la cuestión es que los dispositivos de almacenamiento masivo (por ejemplo, discos duros externos USB) han bajado tanto de precio que hoy en dia resulta muy factible ponerse a escanear como un loco y convertir nuestro ordenador en una máquina de microfilmado.
En realidad ésta es una vieja idea que me rondaba en la cabeza desde hace años. De hecho, en su día (cuando usaba Windows), manejaba habitualmente el Pagis Pro de Xerox, un programa que me encantaba. Pero dejé de hacerlo porque tropecé con muchas limitaciones técnicas propias del momento (discos duros pequeños, escaner lentiiiisimo a pesar de ser SCSI, etc). Hoy, ya no tengo Windows ni Pagis Pro, claro, pero el escaneo documental en forma de microfilmado o facsimil (Gestión Documental, que se llama) es ya rentable porque la tecnología ha mejorado mucho. Solo necesitamos un programa Linux que lo permita hacer de forma decente, y aunque éste es un capítulo pendiente en el mundo Linux, todavía podemos hacer cosas bastante interesantes con DjVu.
DjVu es la versión libre (aunque limitada) de un programa comercial creado por la empresa LizardTech. Lo que hace, concretamente, es tomar una imagen (PNM, por ejemplo), y comprimirla con algoritmos terriblemente eficientes. Parece una tontería, un compresor vulgar, pero os aseguro que es espectacular. Para que os hagais una idea, una imagen BW (Lineart), tomada de una página A4 a 300 dpi, pasa de 1,1 Mb (PNM) a 32 Kb (DjVu). Si, habeis oído bien: ¡¡32 Kb!!.
Djvu incluye tres compresores diferentes y unas cuantas utilidades. Los compresores son:
Y para redondear, DjVu es un formato multipágina. Es decir, en un único fichero se almacenan todas las páginas de nuestro documento. Las páginas pueden ser de distinto tipo: la primera en color y las siguientes en BW, por ejemplo. El paquete de software también incluye otras utilidades adicionales así como un programa visor, DJView, que te permite ver los documentos microfilmados en Linux, pero para eso probablemente te sea más práctico usar Evince.
El programa comercial de Lizardtech es mucho más sofisticado que todo esto. Para que te hagas con la idea, lo que viene a hacer es tomar una página, sea como sea, por ejemplo con mezclas de diferentes tipos de gráficos y texto, y descomponerla adecuadamente para que los diferentes compresores hagan su trabajo, y luego ensamblarlo todo de nuevo en una única página DjVu que parece idéntica al documento original. Todo automáticamente. Puedes ver cómo sería, haciendo pruebas con ficheros PNM en el servidor Any2Djvu, que utiliza software de Lizartdtech para hacer las conversiones gratuitamente a quien lo solicite (eso si, es lento, ya te lo advierto).
Sinceramente, DjVu es tan práctico y eficiente, que he llegado a plantearme comprar el software comercial de Lizardtech. La versión profesional vienen a ser algo más de 300 euros, un poco caro pero asumible si de verdad lo vas a usar. El problema es que la versión profesional solo existe para Windows. Aaaaagh!. Hay otra versión, más avanzada, que es la versión empresarial y que sí incluye software Linux, pero el precio se vuelve inadmisible para un particular. Ya conoceis mi filosofía: no me gusta el pirateo, así que si no lo puedo comprar, no lo uso y punto. Afortunadamente, casi todo lo que vamos a necesitar puede apañarse perfectamente con el software libre de DjVu y unos cuantos scripts. Así que a ello vamos.
Lo que sigue son una serie de scripts personalizados para crear ficheros DjVu y organizarlos en una base de datos. Todo muy práctico para mi mismo, pero seguramente demasiado personalizado para tí, porque tendrás que adaptar o escribir de nuevo todos los scripts para que te funcionen en tu máquina. Al menos, servirá para darte unas cuantas ideas si sabes cómo programar scripts. Si no, seguramente preferirás algo más automático que funcione sin necesidad de hacer ninguna modificación al script, así que mejor échale un vistazo a mi script "escaneo", que lo hace todo de forma simple y automática. De nada. ;-)
Para organizarlo todo, vamos a suponer unas pocas cosas bastante elementales:
Vale, ahora tienes que crear un archivo ejecutable que se llame /etc/scanbuttond/sbd-scan.sh y que contenga lo siguiente:
#!/bin/bash device=`scanimage -L | grep plustek | cut -c 9-30` tmpfile="$HOME/scan/scan" ancho="215mm" alto="295mm" sonido="/usr/share/sounds/radarping.wav" modo="Lineart" if [ "$modo" = "Lineart" ]; then programa=cjb2 else programa=c44 fi if [ -f $HOME/scan/.num ]; then touch $HOME/scan/.num else echo 0 > $HOME/scan/.num fi reg=`cat $HOME/scan/.num` num=`expr $reg + 1` echo $num > $HOME/scan/.num if [ $num -lt 100 ]; then corr="0" else corr="" fi if [ $num -lt 10 ]; then recorr="0" else recorr="" fi num=${corr}${recorr}${num} scanimage --device-name ${device} --format pnm --mode $modo \ --resolution 300 -x $ancho -y $alto > ${tmpfile}${num}.pnm $programa ${tmpfile}${num}.pnm ${tmpfile}${num}.tmp djvm -c ${tmpfile}${num}.djvu ${tmpfile}${num}.tmp rm ${tmpfile}*.tmp if [ "$num" = "001" ]; then cp ${tmpfile}${num}.djvu ${tmpfile}_fichero.djvu chown lacofi:users ${tmpfile}_fichero.djvu else djvm -i ${tmpfile}_fichero.djvu ${tmpfile}${num}.djvu fi sudo -u lacofi artsplay $sonido &
Vale, ahora fijaos en las líneas marcadas en color verde. Vamos a comentarlas un poco, porque son las que debeis configurar para vuestro sistema. El resto debería funcionar sin ningún cambio en cualquier ordenador.
En primer lugar, la linea "device=" debe indicar a tu escaner. En mi caso, el Canon Lide 30 es identificado como un Plustek porque usan el mismo chip. Ejecuta un "scanimage -L" a mano para hacerte una idea de cómo es identificado tu escáner y qué cadena tienes que poner después del grep.
En segundo lugar, la entrada "tmpfile" debe apuntar a un directorio vacío y que exista, y dentro de él a una raiz de fichero. Me explico. En mi caso apunta al directorio $HOME/scan, que está vacío pero existe, y a la raiz "scan". A esta raiz, el script irá añadiendo números, de tal forma que se irán creando ficheros tal que $HOME/scan/scan001.pnm, $HOME/scan/scan002.pnm, etc. Cuando ejecutemos el segundo script que explico más tarde, el escaneo termina, el fichero djvu resultante es copiado al directorio definitivo, y luego el directorio $HOME/scan es vaciado de nuevo para que pueda empezar un nuevo escaneo desde cero.
En tercer lugar, la entrada "sonido" apunta a un fichero wav de sonido que exista. Daos cuenta de que el escaneo va a ser todo ciego, es decir, sin teclear comandos ni ver el resultado. Ese sonido servirá de toque de atención, para decirnos en qué momento el sistema está listo para una nueva página. Como uso KDE, el sonido será tocado mediante artsplay. Observad también que llamo a artsplay a traves de sudo. Eso no tiene mucho sentido ahora, pero sí lo tendrá más adelante, cuando integremos este mismo script en el demonio scanbuttond. De momento solo hacedme caso, ¿vale?. Naturalmente, para que sudo funcione, teneis que añadir una linea en /etc/sudoers que diga esto:
%lacofi ALL=(ALL) NOPASSWD: /usr/bin/artsplay /usr/share/sounds/*.wav
Y lógicamente, puede que tú no seas el usuario "lacofi", así que tendrás que sustitulo por tu verdadero login, tanto en la llamada a sudo como en el fichero /etc/sudoers, o incluso meter todo un grupo de usuarios (por ejemplo con "%users").
Ahora teneis que crear otro script idéntico a sbd-scan.sh pero que se llame /etc/scanbuttond/sbd-gris.sh. Es un script idéntico, pero en la línea "modo=" debe poner "Gray" en lugar de "Lineart". Y aún teneis que crear otro script más, que se llame /etc/scanbuttond/sbd-color.sh y que en la línea "modo=" ponga "Color".
Lo se, lo se. Un solo script hubiera bastado, metiendo la variable "modo" en línea de comandos. Pero esta forma de hacerlo con varios scripts será la correcta para cuando más adelante metamos estos scripts en scanbuttond.
Técnicamente ya podemos escanear, pero tendremos que ir tecleando los comandos que arrancan nuestros scripts, y nosotros pretendemos algo mucho más sencillo: que se pueda escanear pulsando una tecla. ;-)
Para eso utilizaremos el programa xhkeys, asignando nuestros tres script a tres teclas del teclado: F10 para escanear en BW, F11 para escanear en Grises, y F12 para escanear en Color. Para ello solo hay que configurar xhkeys:
[lacofi@jeanette ~]$ xhkconf ----------- ADD/MODIFY hot key ------------- Type a key combination you wish to add/modify Quits if idle within 10 secs [pulsamos F10] Unused scan code;modifier: 76;0 Select command type 1. Internal Function 2. Application 3. Plugin Call 4. Key Event 5. Mouse Event 6. Cancel Enter selection by number, or cap. letter: [pulsamos 2] Enter the shell command to call the application: [Tecleamos: /etc/scanbuttond/sbd-scan.sh] OSD title types: 1. Standard (command line) 2. Custom 3. Disabled (no OSD message) Select title type: [Pulsamos 2] Enter OSD title: [Tecleamos "Facsimil BW"] Scan code: 76 (0x4c) State: 0 (0x00) OperType: A [Application] OSD title: Facsimil BW Command: /etc/scanbuttond/sbd_scan.sh Accept? (y, n): [Pulsamos y]
Repetimos la operación para configurar F11 hacia /etc/scanbuttond/sbd-gris.sh y F12 hacia /etc/scanbuttond/sbd-color.sh. Ahora solo nos queda hacer que un demonio xhkeys se ponga en marcha cada vez que arranquemos la sesión gráfica. En el caso de KDE es muy fácil:
[lacofi@jeanette ~]$ ln -s /usr/bin/xhkeys .kde/Autostart/xhkeys
Después tendremos que salir de KDE y volver a entrar, si queremos activar el demonio xhkeys inmediatamente, claro.
A partir de ahora, para escanear un documento de, pongamos, 10 páginas lo tendremos muy fácil:
Si tienes un escaner con alimentador de hojas, la cosa es mucho más fácil todavía, porque se pueden modificar los scripts para que cuando pulses la tecla empiece a escanear y convertir a formato djvu todas las páginas el solito sin necesidad de hacer nada.
Pero yo no me conformo con eso, naturalmente, así que podemos ir más allá y rizar un poco el rizo. Lo que sigue a partir de ahora es para nota, y completamente opcional. Por decirlo en dos palabras: vamos a crear un nuevo script que lo resetee todo y grabe el fichero DjVu definitivo en el sitio correcto, dejando listo un registro adecuado para importar los datos del documento en una base de datos Tellico. Esto lo haremos a traves del siguiente script:
#!/bin/bash ejecuta="si" carpeta=$PWD raiz=`echo $carpeta| awk -F/ '{ print $2 }'` clase=`echo $carpeta| awk -F/ '{ print $3 }'` subclase=`echo $carpeta| awk -F/ '{ print $4 }'` fichero=$1 database="/var/log/escaneo.csv" log="/var/log/escaneo.log" directorio="$HOME/scan" insertar="no" ejecuta="si" valido="si" campos_tipo=`cat $estructura | grep Campos_tipo` color="$HOME/.colorscan" azul="\033[0;34m" azul_claro="\033[1;34m" verde="\033[0;32m" verde_claro="\033[1;32m" oro="\033[0;33m" oro_claro="\033[1;33m" cian="\033[0;36m" cian_claro="\033[1;36m" rojo="\033[0;31m" rojo_claro="\033[1;31m" blanco="\033[1;37m" nocolor="\033[0m" declare -i error1 declare -i error2 function ayuda { echo -e " " echo -e "${oro}Uso:${nocolor} resetea ${verde}[version]${nocolor} fichero.djvu" echo -e " " echo -e "${verde}[version] puede ser:${nocolor}" echo -e " ${oro}-h o --help${nocolor} (saldra esta ayuda)" echo -e " ${oro}insertar numero${nocolor} (insertara en la posicion indicada)" echo -e " ${oro}agregar numero${nocolor} (agregara en la posicion indicada)" echo -e " ${oro}borrar numero${nocolor} (borra la pagina indicada)" echo -e " ${oro}nolog${nocolor} (borra logs anteriores y termina)" echo -e " ${oro}anota${nocolor} (no hace nada, solo anota)" echo -e " " } function pregunta { if [ "$raiz" = "facsimil" ]; then if [ "$clase" = "personal" ]; then tipo=`echo $campos_tipo | awk -F, '{ print $2 }'` elif [ "$clase" = "profesional" ]; then case $subclase in administracion) tipo=`echo $campos_tipo | awk -F, '{ print $3 }'` ;; apuntes) tipo=`echo $campos_tipo | awk -F, '{ print $4 }'` ;; protocolos) tipo=`echo $campos_tipo | awk -F, '{ print $5 }'` ;; revistas) echo "Es un libro (Si/No):" read libro if [ "$libro" = "si" ] || [ "$libro" = "Si" ] || [ "$libro" = "SI" ]; then tipo=`echo $campos_tipo | awk -F, '{ print $6 }'` else tipo=`echo $campos_tipo | awk -F, '{ print $7 }'` fi ;; tutoria) tipo=`echo $campos_tipo | awk -F, '{ print $8 }'` ;; *) echo "Estas en el directorio $PWD" echo "Se supone que no deberías ejecutar eso ahi!." echo " " ayuda ejecuta="no" ;; esac else echo "Estas en el directorio $PWD" echo "y no deberias ejecutar esto ahi." echo " " ayuda ejecuta="no" fi else ayuda ejecuta="no" fi if [ "$ejecuta" = "si" ]; then echo "Dime el Autor:" read autor echo "Dame un titulo:" read titulo echo "Haz un comentario:" read comentario if [ "$comentario" = "" ]; then comentario=$titulo fi if [ "$clase" = "profesional" ] && [ "$tipo" != "Libro" ]; then echo "Si es una revista, pon cual es:" read revista if [ "$revista" != "" ]; then if [ "$revista" = "Medicina Intensiva" ] || [ "$revista" = "Med Intensiva" ]; then export revista="Medicina Intensiva" export medint="true" else export medint="" fi echo "Pon el volumen:" read volumen echo "Pon el numero:" read numero echo "Pon las paginas:" read paginas fi fi echo "Pon la fecha (AAAA | MM/AAAA | DD/MM/AAAA):" read fecha letras=`echo $fecha | wc -c` if [ $letras -eq 5 ]; then ano=$fecha mes="" dia="" elif [ $letras -eq 8 ]; then ano=`echo $fecha | cut -c 4-7` mes=`echo $fecha | cut -c 1-2` dia="" elif [ $letras -eq 11 ]; then ano=`echo $fecha | cut -c 7-10` mes=`echo $fecha | cut -c 4-5` dia=`echo $fecha | cut -c 1-2` else ano="" mes="" dia="" fi fecha=${ano}-${mes}-${dia} fi } function posicion { echo "Debes situarte en el directorio de destino" echo " " } function indefinido { echo "Uuups. Hubo un error." echo "Variable1= $1" echo "Variable2= $2" echo "Variable3= $3" echo " " } function limpia { if [ "$ejecuta" = "si" ]; then rm -Rf $directorio/* rm -f $directorio/.num fi } function registra { if [ "$ejecuta" = "si" ]; then echo " " >> $log date >> $log echo "-----------------------" >> $log echo "Fecha: $fecha" >> $log echo "Fichero: $fichero" >> $log echo "Directorio: $PWD" >> $log echo "Autor: $autor" >> $log echo "Titulo: $titulo" >> $log echo "Comentario: $comentario" >> $log echo "Tipo: $tipo" >> $log cod=`echo $tipo | cut -c 1-3` if [ "$cod" = "Art" ]; then echo "($revista $ano $volumen:$numero:$paginas)" >> $log echo "Medicina Intensiva = $medint" >> $log fi echo '"'$autor'"','"'$titulo'"','"'$PWD/$fichero'"',\ '"'$comentario'"',$tipo,'"'$revista'"',$volumen,$numero,$paginas,$fecha,\ Directorio,,,,true,$medint >> $database fi } if [ $# -eq 0 ]; then ayuda ejecuta="no" valido="si" else case $# in 1) extension=`echo $1 | rev | cut -c -4` ;; 2) extension=`echo $2 | rev | cut -c -4` ;; 3) extension=`echo $3 | rev | cut -c -4` ;; *) extension="----" echo "El numero de parametros no es correcto" ejecuta="no" ;; esac if [ "$extension" = "uvjd" ] || [ "$extension" = "fdp." ] || [ "$extension" = "fit." ] || [ "$extension" = "ffit" ]; then valido="si" else valido="no" fi fi case $1 in -h|--help) ayuda ;; nolog) echo "Esta subrutina vaciara el LOG donde se almacenan" echo "los datos de todos los escaneos." echo " " echo "Estas seguro? (Si/No)" read respuesta if [ "$respuesta" = "si" ] || [ "$respuesta" = "Si" ] || [ "$respuesta" = "SI" ]; then echo " " > $log echo "Autor,Titulo,Posicion,Descripcion,Publicado en,Revista,\ Vol,Num,Pag,Fecha,Carpeta,Número,Tipo,Archivo,Facsimil,\ Medicina Intensiva" > $database else echo "Ah, creia..." fi ;; insertar|agregar|borrar) if [ "$ejecuta" = "si" ]; then if [ -f "$3" ] && [ "$valido" = "si" ]; then mv $directorio/scan_fichero.djvu ./pag$2.djvu chmod go-w pag$2.djvu error=$? if [ $error -gt 0 ]; then posicion ejecuta="no" else limpia fi if [ "$ejecuta" = "si" ] || [ "$1" = "borrar" ]; then if [ "$1" = "insertar" ] || [ "$1" = "borrar" ]; then djvm -d $3 $2 error1=$? else error1=0 fi if [ "$1" = "insertar" ] || [ "$1" = "agregar" ]; then djvm -i $3 pag$2.djvu $2 error2=$? else error2=0 fi if [ $error1 -eq 0 ] && [ $error2 -eq 0 ]; then rm pag$2.djvu else ayuda indefinido fi fi else ayuda fi fi ;; anota) fichero=$2 if [ "$ejecuta" = "si" ] && [ "$valido" = "si" ]; then pregunta registra fi ;; *) if [ "$ejecuta" = "si" ] && [ "$valido" = "si" ]; then pregunta if [ -f "$color" ]; then echo "Pronto en sus pantallas" else mv $directorio/scan_fichero.djvu ./$1 chmod go-w $1 error=$? if [ $error -gt 0 ]; then posicion else limpia registra fi fi fi ;; esac
Parece complicado, pero no lo es tanto si tienes un poco de idea de programación Bash (observa que tiene múltiples rutinas en forma de funciones).
Para entender este script y lo que hace, hay que tener en cuenta que guardo todos mis documentos en subdirectorios del siguiente árbol:
[lacofi@jeanette ~]$ tree -d -L 2 -I lost* /facsimil
/facsimil
|-- personal
| |-- coche
| |-- comunidad_vecinos
| |-- docs_bancarios
| |-- folletos_informacion
| |-- libros
| `-- notas_casa
`-- profesional
|-- administracion
|-- apuntes
|-- protocolos
|-- revistas
`-- tutoria
13 directories
Partiendo de esta idea básica, este script tiene varias peculiaridades que restringen su funcionamiento y hacen que sea todo muy personalizado. No funcionará en tu sistema, asi que seguramente tendrás que reescribirlo entero, pero eso es precisamente lo más interesante. En cualquier caso, te será útil para darte unas cuantas ideas, a saber:
Bien, pues vamos a ejecutar el script:
[lacofi@jeanette ~]$ cd ~/facsimil/protocolos/vm [lacofi@jeanette vm]$ resetea reclutamiento_sdra.djvu Introduce el primer autor:
Contestamos tres o cuatro preguntas y ya está. El documento quedará archivado en el directorio adecuado, y $HOME/scan quedará vacío, listo para empezar un nuevo documento. El archivo /var/log/escaneo.log guardará información precisa de lo que ha hecho. Y lo que es más importante, el archivo /var/log/escaneo.csv guardará un nuevo registro CSV que nos permitirá importar todos esos datos en la base de datos Tellico (o cualquier otra que soporte importación de datos CSV).
A veces, si revisais el documento escaneado (djview reclutamiento_sdra.djvu), puede que una página esté mal escaneada, por ejemplo porque haya quedado torcida. No importa. Se escanea de nuevo, pero SOLO la página fallida, y luego se ejecuta "resetea" con el parámetro "insertar".
[lacofi@jeanette vm]$ resetea insertar 14 reclutamiento_sdra.djvu
Con lo que el documento reclutamiento_sdra.djvu es modificado para borrar la página errónea (la 14) y poner en su lugar la nueva página. Esta maniobra no quedará registrada en el fichero de log, claro. Más sencillo no puede ser.
Del mismo modo, podemos agregar una página (en vez de insertarla sustituyendo otra), o incluso borrarla por completo.
Pero ¿qué ocurre si no estamos logados?. ¿Podemos escanear?. Pues sí, claro. Estos mismos scripts (sbd-scan.sh sbd-gris.sh y sbd-color.sh) pueden ser asignados a los botones del escáner mediante el programa demonio scanbuttond. En el caso del Canon Lide 30, tiene tres botones frontales que se supone son para escanear, fotocopiar y enviar por correo electrónico, pero resulta más práctico asignarlos a nuestros scripts, al menos sbd-scan.sh y sbd-color.sh, dejando el botón del medio para fotocopiar. Luego podemos logarnos de forma remota para ejecutar "resetea".
En cualquier caso, la instalación y configuración de scanbuttond está bien documentada, así que no me voy a enrollar con ella. Los usuarios de Gentoo solo tienen que recurrir al gentoo-wiki, como siempre, pero los usuarios de otras distribuciones también deberían echarle un vistazo, porque viene todo muy bien explicado y con mucho detalle. ;-)
Actualmente el kernel linux ha migrado hacia el sistema UDEV, que ha sustituido por completo a DEVFS. Por decirlo en cinco palabras: ES EL MOMENTO DE MIGRAR, si es que no lo has hecho ya.
Y francamente, UDEV es muy superior a DEVFS. Merece la pena el esfuerzo. ¿Para qué, te preguntarás?. Bien, UDEV gestiona los dispositivos que aparecen en la carpeta /dev, pero lo hace dinámicamente, creando y destruyendo dispositivos según el kernel los necesite o no, y apoyándose para ello en hotplug, que hace de correveidile entre los eventos del kernel y el espacio de usuario.
UDEV es una gozada, por ejemplo porque permite gestionar de forma rigurosa los discos USB, dandoles nombres personalizados, que no dependen del orden en que los hemos enchufados, sino de su número de serie interno, o su marca, o algo que los identifica físicamente. Ya no tienes que buscar si tu Memorybird se ha instalado como /dev/sda1 o como /dev/sdb1: ahora siempre será /dev/memorybird. (!). Ya no tienes que volverte root (o usar sudo) para usar ese Dongle USB Bluetooth: ahora el dispositivo se creará perteneciendo al grupo que quieras, y con los permisos que quieras.
La instalación está bien documentada, tanto en sistemas linux inespecíficos como en Gentoo. Para convertir tu viejo sistema en una máquina UDEV, puedes leer las mejores instrucciones disponibles en la página de decibels. Si quieres jugar de verdad con las reglas y personalizar tu sistema, te recomiendo el manual de Daniel Drake, muy útil, clarito y sencillo de leer. A estas dos páginas me remito. Lo que te pongo a continuación no es mas que un montón de notas que tomé de ellas, una especie de traducción simplicada y libre. ¿Vamos allá?
Bien, pues debes entender en primer lugar que UDEV sustituye a DEVFS en el espacio de usuario, y para ello se apoya en sysfs y hotplug. UDEV crea y destruye las entradas /dev basandose en la configuración del sistema. Lo hace mirando los eventos de hotplug y leyendo la información sobre estos eventos a través de sysfs. Los pasos a seguir para la distribución Gentoo son:
Lo primero es crear un kernel apropiado. Se puede compilar simultáneamente UDEV y DEVFS en ese kernel, y luego elegir qué es lo que va a funcionar, simplemente poniendo opciones al arranque (las opciones son: devfs o udev). Eso sí, nunca, nunca se debe activar en el kernel la opción "Enable Devfs to automatically mount at Boot".
Bien. Se debe activar:
Bus options (PCI, PCMCIA, EISA, MCA, ISA) [*] Support for hot-pluggable devices File systems Pseudo filesystems [*] /proc file system support [*] /dev file system support (OBSOLETE) (esto es devfs!) [*] /dev/pts file system for Unix98 PTYs (a partir de 2.6.4 no está) [ ] /dev/pts Extended Attributes [*] Virtual memory file system support (former shm fs) [ ] HugeTLB file system support
A partir de la versión 2.6.13 del kernel, la opción "/dev file system support (OBSOLETE)" ya ni siquiera aparece: en esos kernels solo podremos usar UDEV.
Si usas un kernel menor que ese, se puede compilar DEVFS en el kernel, y luego elegir mediante opciones boot (en Lilo), si vamos a arrancar con DEFVS o UDEV. Sin embargo, los cambios que se hagan en DEVFS no serán reflejados en UDEV. La única forma en que se pueden salvar los cambios de DEVFS a UDEV es usando /lib/udev-state/devices.tar.bz2. Si prefieres usar un UDEV puro entonces ningún cambio que hagas en DEVFS será recuperable cuando arranques en UDEV, así que si quieres hacer cambios en tus dispositivos UDEV tendrás que probar a añadirlos en /etc/udev/rules.d/10-local.rules. Debes crear este script, no deberías nunca editar 50-udev.rules.
Una vez que tienes el kernel, hay que hacer un "emerge udev". Esto implica hacer también un "emerge hotplug", porque es una dependencia. Si no usas Gentoo, deberías comprobar cómo se instala udev y hotplug en tu sistema. Seguramente tendrás que hacer un apt-get o usar rpm.
En Gentoo tienes que añadir Hotplug al boot runlevel mediante "rc-update add hotplug boot". Deberías comprobar que no tienes Hotplug en el default runlevel (rc-update show), porque si es así deberías quitarlo de ahí mediante "rc-update del hotplug default". En otras distribuciones Linux tienes que añadir Hotplug al runlevel para que se ejecute automáticamente en el arranque.
Gentoo debería ahora crear /sys para montar sysfs ahí. Si no es así, deberías crear tú la carpeta /sys manualmente.
Gentoo puede ahora manejar el montaje de devpts y sys. Por eso ya no tienes que añadir ninguna entrada al respecto en /etc/fstab (los kernels modernos ya no lo hacían). En lugar de eso, el trabajo lo hará ahora el script /sbin/rc. Puedes chequearlo con "df -a". Si tienes entradas que se refieran a devpts y sys, es seguro retirarlas ahora de tu /etc/fstab. Si después tienes problemas con devpts o sys y no se montan o no eres capaz de abrir una sesión de consola, probablemente deberías mirar otras posibles causas.
Bien, llegados a este punto podrías creer que si tienes udev, sysfs, y hotplug instalados y funcionado. Pues no. Hasta que sysfs esté montado, /dev montado en tmpfs y hotplug arrancado, realmente no has hecho nada. Puede que veas cambios en /sys, si añades o quitas dispositivos, pero el sistema no está haciendo nada con esta información. ¿Qué es lo que falta?.
Lo siguiente que necesitas es "emerge baselayout", que contiene los init scripts necesarios para arrancarlo todo.
Hay un archivo que deberías comprobar que existe: /lib/udev-state/devices.tar.bz2, que es donde se guarda el actual estado de /dev desde tmpfs cuando reseteas o apagas.
La verdad es que salvar el estado de /dev, va en contra de la filosofía de UDEV, porque se supone que debe ser un sistema de archivos dinámico que crea solo los dispositivos del sistema que necesita. Si los salvas, estarán ahí la próxima vez que arranques, los necesites o no. La razón de hacer esto, es porque al principio solo se creaban dispositivos muy básicos, pero hoy en día UDEV ya ha evolucionado mucho y se crean toda clase de dispositivos, con lo que es posible instalar un sistema UDEV puro. Bien... todavía hay algunos problemas con esto, pero se pueden arreglar con algunos atajos aquí y allá. Si te sirve de algo, te diré que yo he instalado un UDEV puro en mi ordenador y no he tenido ningún problema con un Kernel 2.6.12-gentoo-r6.
En algún momento en el futuro, seguramente Gentoo dará el paso y eliminará devices.tar.bz2. Será cuando UDEV esté ya totalmente perfeccionado y, francamente, tal y como me ha ido a mí, yo diría que lo harán en menos de un año.
Asegúrate de poner los archivos de configuración adecuados en el sitio correcto ejecutando "etc-update". Si no lo haces, no se salvarán tus dispositivos /dev en el archivo devices.tar.bz2. Incluso si planeas usar un sistema puro UDEV, seguirás necesitando esos scripts.
Suponiendo un sistema "adecuadamente actualizado", tienes que editar /etc/conf.d/rc y ajustar:
RC_DEVICES="auto"
RC_DEVICE_TARBALL="yes" (o "no", si quieres un UDEV puro como yo).
¿Qué significa "adecuadamente actualizado"?. Bueno:
No son unos grandes requisitos. Todos ellos pueden conseguirse simplemente actualizando las distribuciones Linux principales.
En un sistema puro UDEV es porque no se crea /dev/console y /dev/null. Debes crear manualmente ambos dispositivos:
cd /dev mknod -m 660 console c 5 1 mknod -m 660 null c 1 3
En el caso de estar actualizado a una Gentoo 2005.1 como la mía cuando me pasé a UDEV, todos los dispositivos se crearon correctamente, incluyendo /dev/console y /dev/null
Tienes dos opciones:
Por ejemplo, con una entrada en lilo.conf tal que así:
image=/boot/vmlinuz-2.6.12-kal label=Gentooza append="gentoo=nodevfs" read-only root=/dev/hda3
Ahora deberías poder resetear y comprobar tu sistema UDEV. Deberías poder ver en el arranque algo así:
Mounting /dev for udev ... Configuring system to use udev ... Populating /dev with device nodes ... (si lo activaste con tarball) Setting /sbin/udevsend as hotplug agent ... (dependiendo de versión udev)
Y ahora, deberías crear reglas personalizadas para tus dispositivos removibles. ¡La diversión empieza ahora!. Que lo disfrutes. :-)
Si has cambiado a un sistema UDEV puro, puede que descubras que tu impresora paralelo deja de funcionar. Si rascas un poco, te encontrarás con que el dispositivo /dev/lp0 no existe.
En realidad no es un problema de UDEV, sino del kernel. Resulta que en los kernels más nuevos, se asume que no es necesario el módulo que controla el puerto paralelo. ¿Por qué?. Bueno, hoy en día la mayoría de las impresoras son USB, así que el puerto paralelo está un poco en desuso (solo se usa para eso, y ya ni para eso). Asi que el kernel no carga ese módulo salvo que se le indique específicamente con una órden:
[lacofi@jeanette ~]$ su Password: [lacofi@jeanette /home/lacofi]# modprobe lp
Una vez cargado el módulo, comprobarás que se ha creado correctamente el dispositivo /dev/lp0.
Si tienes una impresora paralelo, seguramente querrás que este módulo se cargue siempre en el arranque. Para eso, solo tienes que meterlo en el listado de /etc/modules.autoload.d/kernel-2.6:
# /etc/modules.autoload.d/kernel-2.6: kernel modules to load. # $Header: [bla bla bla] azarah Exp $ # # Note that this file is for 2.6 kernels. # # Add the names of modules that you'd like to load when the system # starts into this file, one per line. Comments begin with # and # are ignored. Read man modules.autoload for additional details. # For example: # 3c59x kqemu lp # <-- ahí
Has compilado una versión reciente de tu kernel, y despues haces un "emerge slmodem" (en el caso de Gentoo). La compilación da varios errores tipo warning que no abortan el proceso, por lo que acaba compilándose de todas formas.
Sin embargo, cuando intentas instalar los drivers te encuentras con que el kernel dice que nones:
[root@lynette]# modprobe slamr
FATAL: Error inserting slamr (/lib/modules/2.6.15-kal/extra/slamr.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
Vale. Acudes a dmesg para ver que te dice, y te suelta esto:
[root@lynette]# dmesg
[bla bla bla...]
slamr: Unknown symbol class_simple_device_add
slamr: Unknown symbol get_device
slamr: Unknown symbol class_simple_destroy
slamr: Unknown symbol put_device
slamr: Unknown symbol class_simple_device_remove
slamr: Unknown symbol class_simple_create
slamr: Unknown symbol device_release_driver
¿Que significa esto y cómo se soluciona?. Bueno, lo que está pasando es que tu nuevo kernel ya no tiene determinados simbolos que slmodem necesita: en otras palabras, o tu kernel es demasiado nuevo o tu versión de slmodem es demasiado vieja. Tienes que reducir la versión del kernel, o instalar un slmodem más reciente.
Asumiendo que no quieres regresar a un kernel más viejo, solo te queda instalar una versión más calentita de slmodem.
En mi caso, este problema me surgió al actualizar a un kernel 2.6.15 para un slmodem 2.9.9d. El problema es que al hacer "emerge slmodem", esa era la versión que se instalaba. Asi que la solución en Gentoo es sencilla: hay que desenmascarar el paquete slmodem para permitir que se instalen las versiones más nuevas (e inestables):
[root@lynette]# echo "net-dialup/slmodem ~x86" >> /etc/portage/package.keywords &&
> emerge slmodem
Calculating dependencies ...done!
>>> emerge (1 of 1) net-dialup/slmodem-2.9.11_pre20051101 to /
>>> md5 files ;-) slmodem-2.9.9d.ebuild
[etc... ]
Tras actualizar tu sistema Gentoo, te encuentras conque en el arranque te aparecen unos errores misteriosos que dicen:
* Re-caching dependency info (mtimes differ)... * Re-caching dependency info (mtimes differ)... * Re-caching dependency info (mtimes differ)... * Re-caching dependency info (mtimes differ)...
El error es trivial y se soluciona con una simple comendo de actualización del cache de dependencias:
[root@lynette]# /etc/init.d/depscan.sh --update
Y eso es todo :-).