Renuncia de responsabilidad:
Este documento ya no es válido y carece de soporte.
|
Guía del Sistema de Archivos de Dispositivos
1.
¿Qué es el devfs?
Los (¿buenos?) viejos tiempos
Aviso:
devfs está obsoleto y ha sido eliminado del árbol estable 2.6
en la versión 2.6.13 del mismo. A los usuarios que estén usando
núcleos 2.6 se les aconseja cambiarse a udev. Para mayor información
sobre udev, por favor vea la Guía
de udev en Gentoo
|
La implementación tradicional de Linux provee a los usuarios con un
directorio abstracto, llamado /dev. Dentro de este se
pueden encontrar los nodos de dispositivos, archivos especiales
que representan los dispositivos dentro del sistema. Por ejemplo,
/dev/hda representa el primer dispositivo IDE en el
sistema. Al proveer archivos de dispositivos a los usuarios, estos
pueden crear programas que interactúen con el hardware como si este
fuese un archivo regular en vez de utilizar APIs especiales.
Los archivos de dispositivos están divididos en dos grupos, los
llamados dispositivos de caracteres y lo dispositivos de
bloques.El primer grupo consiste en el hardware cuyos procesos
de lectura/escritura no tienen buffer. El segundo grupo, naturalmente,
consiste en el hardware cuyo proceso de lectura/escritura sí tiene
buffer. Ambos tipos pueden ser leídos un carácter a la vez, o en
bloques. Por lo que la nomenclatura puede sonar confusa y en realidad
es incorrecta.
Si le echas una mirada a algún archivo de dispositivo, es probable que
encuentres algo parecido a esto:
Listado de Código 1.1: Revisando la información sobre un archivo de dispositivo |
# ls -l /dev/hda
brw-rw---- 1 root disk 3, 0 Jul 5 2000 /dev/hda
|
En el ejemplo previo podemos ver que /dev/hda es un
dispositivo de bloques. Sin embargo, más importante aún, tiene dos
números especiales asignados a él: 3, 0. Este par es
llamado el par mayor-menor. Es utilizado por el núcleo para
convertir el archivo de dispositivo en un dispositivo real. El mayor
corresponde a cierto dispositivo, el menor a un
sub-dispositivo. ¿Parece confuso? No lo es.
Dos ejemplos son /dev/hda4 y /dev/tty5. El
primer archivo de dispositivo corresponde a la cuarta partición del
primer dispositivo IDE. Su par mayor-menor es 3, 4. En
otras palabras, el menor corresponde a la partición mientras que el
mayor corresponde al dispositivo. El segundo ejemplo tiene 4,
5 como par mayor-menor. En este caso, el mayor corresponde al
controlador del terminal, mientras que el menor corresponde al numero
de terminal (en este caso, el quinto terminal).
Los problemas
Si le das una mirada al directorio /dev, encontrarás que
no solo todos tus dispositivos están listados, sino todos los
dispositivos que te puedas imaginar. En otras palabras, tienes
archivos de dispositivos por dispositivos que no tienes. Manejar tal
grupo de dispositivos es pesado, por decir menos. Imagine tener que
cambiar permisos a todos los archivos de dispositivos que tienen un
dispositivo correspondiente en tu sistema, y dejar el resto intacto.
Cuando añades un nuevo hardware a tu sistema, y este nuevo hardware no
tiene un archivo de dispositivo previamente diseñado, tienes que crear
uno. Los usuarios avanzados saben como hacer esto utilizado
./MAKEDEV dentro del árbol del /dev, pero ¿Sabes
inmediatamente qué dispositivo crear?
Cuando tienes programas interactuando con el hardware utilizando
archivos de dispositivos, no puedes tener la partición raíz montada como
solo lectura, dado que no puedes tener el directorio /dev
en otra partición, ya que mount necesita de /dev
para montar las particiones.
Las soluciones
Como puedes imaginar, los hackers del núcleo han encontrado varias
soluciones para los problemas previamente mencionados. Sin embargo,
muchos de ellos sufren de otras carencias como se describe en
http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#faq-why
.
Nosotros no vamos a hablar acerca de estas soluciones, sino que nos
concentraremos en una implementación que llegó a las fuentes oficiales
del núcleo: devfs.
¿devfs como un ganador completo?
devfs ataca todos los problemas listados. Solo provee al usuario con
dispositivos existentes, añade nuevos nodos cuando un dispositivo es
encontrado, y hace posible montar el sistema de archivos raíz como
solo lectura. También soluciona otros problemas que no hemos discutido
previamente porque no son de mucho interés a los usuarios...
Por ejemplo, con devfs, no tienes que preocuparte por los pares
mayores/menores. Aunque siguen siendo soportados (por compatibilidad
con el antiguo sistema), ya no es necesario. Esto hace posible a Linux
soportar incluso más dispositivos, dado que ya no hay límites (los
números siempre tienen límites :).
Pero devfs también tiene sus propios problemas; para los usuarios
finales estos no son realmente visibles, pero para los mantenedores
del núcleo los problemas son lo suficientemente grandes como para
marcar a devfs como obsoleto en favor de
udev, que Gentoo soporta y se
usa por defecto en la mayoría de las arquitecturas desde el lanzamiento
de la versión 2005.0 con núcleos 2.6.
Para más información sobre por qué devfs ha sido marcado como obsoleto,
por favor lea udev
PUF (en Inglés) y udev
versus devfs.
2.
Navegando a través del árbol de dispositivos
Directorios
Una de las primeras cosas que debes haber notado, es que devfs utiliza
directorios para agrupar los dispositivos. Esto mejora la
comprensibilidad, ya que todos los dispositivos relacionados están
dentro de un mismo directorio.
Por ejemplo, todos los dispositivos IDE o relacionados, se encuentran
dentro del directorio /dev/ide/, y todos los SCSI o
relacionados están dentro de /dev/scsi/. Los discos SCSI
e IDE son vistos de la misma manera, lo que significa que ambos tienen
la misma estructura de subdirectorios.
Los discos IDE y SCSI son controlados por un adaptador (incorporado o
en una tarjeta separada), llamado anfitrión. Cada adaptador
puede tener varios canales. El canal es llamado bus. En cada
canal, puedes tener varios IDs. Un ID identifica un disco. Este Id es
llamado el objetivo. Algunos dispositivos SCSI pueden tener
varios luns (abreviatura en inglés de Números de Unidad
Lógica), un ejemplo son los dispositivos que manejan múltiples
medios al mismo tiempo (Controladores de cinta de alto
desempeño). Mayormente solo tendrás un único lun, lun0/.
Así, de tener el previo /dev/hda4, ahora tenemos
/dev/ide/host0/bus0/target0/lun0/part4. Esto es mucho más
simple ... no, tranquilo ... de verdad es más fácil ... naa, ¡no
importa! :)
Nota:
También puedes utilizar un nombre de archivo de dispositivo más Unix,
como c0b0t0u0p2. Estos pueden ser encontrados en
/dev/ide/hd, /dev/scsi/hd, etc.
|
Para darte una idea de los directorios, esta es una lista de los
directorios que yo tengo en mi laptop:
Listado de Código 2.1: Directorios en /dev |
cdroms/ cpu/ discs/ floppy/
ide/ input/ loop/ misc/
netlink/ printers/ pts/ pty/
scsi/ sg/ shm/ sound/
sr/ usb/ vc/ vcc/
|
Compatibilidad con anteriores utilizando devfsd
Usar este nuevo esquema suena divertido, pero varias herramientas y
programas hacen uso del antiguo esquema. Para asegurarse de que no se
rompa el sistema, se creó devfsd. Este demonio crea enlaces
simbólicos con los nombres antiguos, apuntando hacia los nuevos
archivos de dispositivos.
Listado de Código 2.2: Enlaces simbólicos creados |
$ ls -l /dev/hda4
lr-xr-xr-x 1 root root 33 Aug 25 12:08 /dev/hda4 -> ide/host0/bus0/target0/lun0/part4
|
Con devfsd, también puedes configurar los permisos, crear
nuevos archivos de dispositivos, definir acciones, etc. Todo esto está
descrito en el siguiente capítulo.
3.
Administrando el árbol de dispositivos
Reiniciando devfsd
Cuando modificas el archivo /etc/devfsd.conf, y quieres
que los cambios sean aplicados a tu sistema, no necesitas reiniciar
todo el sistema. Dependiendo de lo que quieras hacer, puedes utilizar
cualquiera de las dos siguientes señales:
SIGHUP hará que devfsd relea el archivo de
configuración, recargue los objetos compartidos y genere los eventos
REGISTER para cada nodo hoja del árbol de dispositivos.
SIGUSR1 hará lo mismo, pero no generará los eventos REGISTER.
Para enviar una señal, simplemente utiliza kill o killall:
Listado de Código 3.1: Enviando la señal SIGHUP a devfsd |
# kill -s SIGHUP `pidof devfsd`
# killall -s SIGHUP devfsd
|
Removiendo los enlaces simbólicos de compatibilidad
Aviso:
Actualmente, Gentoo no funciona sin los enlaces simbólicos de
compatibilidad.
|
Si quieres remover los enlaces de compatibilidad que rellenan
/dev de tu sistema Gentoo (Gentoo lo activa por defecto),
edita /etc/devfsd.conf y remueve las siguientes dos
lineas:
Listado de Código 3.2: /etc/devfsd.conf con compatibilidad con anteriores |
REGISTER .* MKOLDCOMPAT
UNREGISTER .* RMOLDCOMPAT
|
Necesitas reiniciar tu sistema para que los cambios se ejecuten.
Removiendo la funcionalidad de auto cargado
Cuando tu cargas un módulo, devfs automáticamente creará los archivos
de dispositivos. Si no quieres que esto ocurra, remueve la siguiente
linea del archivo /etc/devfsd.conf:
Listado de Código 3.3: /etc/devfsd.conf, funcionalidad de auto-cargado |
LOOKUP .* MODLOAD
|
4.
Puntos relacionados con los permisos
Asignar/cambiar los permisos con devfsd
Importante:
Estas instrucciones son válidas mientras que pam_console haya sido
deshabilitada en /etc/pam.d/system-auth. Si habilitas la
pam_console aquí, entonces PAM tiene la última palabra sobre los
permisos. De todas maneras, no debería seguir usando pam_console, ya
que ha sido eliminado
de Portage.
|
Si quieres configurar los permisos utilizando
/etc/devfsd.conf, entonces utiliza la sintaxis del
siguiente ejemplo:
Listado de Código 4.1: Permisos en /etc/devfsd.conf |
REGISTER ^cdroms/.* PERMISSIONS root.cdrom 0660
|
El segundo campo es el grupo de dispositivos, empezando desde
/dev. Es una expresión regular, lo que quiere decir que
puede seleccionar varios archivos de dispositivos en una sola regla.
El cuarto campo es el dueño del archivo de dispositivo y el quinto
campo contiene los permisos del archivo de dispositivos.
Configurar manualmente los permisos y hacer que devfsd los guarde
Este es el comportamiento normal de Gentoo: si ejecutas chown y
chmod sobre algún archivo de dispositivo, devfsd salvará
la información incluso cuando se reinicie el sistema. Esto es porque
el archivo /etc/devfsd.conf contiene las siguientes
lineas:
Listado de Código 4.2: /etc/devfsd.conf salvando permisos |
REGISTER ^pt[sy]/.* IGNORE
CHANGE ^pt[sy]/.* IGNORE
CREATE ^pt[sy]/.* IGNORE
DELETE ^pt[sy] IGNORE
REGISTER ^log IGNORE
CHANGE ^log IGNORE
CREATE ^log IGNORE
DELETE ^log IGNORE
REGISTER .* COPY /lib/dev-state/$devname $devpath
CHANGE .* COPY $devpath /lib/dev-state/$devname
CREATE .* COPY $devpath /lib/dev-state/$devname
DELETE .* CFUNCTION GLOBAL unlink
/lib/dev-state/$devname
RESTORE /lib/dev-state
|
En otras palabras, los cambios sobre los archivos de dispositivos son
copiados a /lib/dev-state en el instante que suceden, y
son copiados de regreso a /dev al iniciar el sistema.
Otra posibilidad es montar /lib/dev-state en
/dev en tiempo de arranque. Para hacer esto necesitas
asegurarte que devfs no es montado automáticamente (para lo cual
deberás recompilar tu núcleo) y que /dev/console
existe. Luego, en algún momento en el inicio de los guiones de inicio
de tu sistema coloca:
Listado de Código 4.3: Montando /lib/dev-state encima de /dev |
mount --bind /dev /lib/dev-state
mount -t devfs none /dev
devfsd /dev
|
5.
Recursos
Para mayor información acerca de devfs, revisa los siguientes
recursos.
La página del manual devfsd.conf explica la sintaxis del archivo
/etc/devfsd.conf. Para verla, escribe man
devfsd.conf.
El devfs
PUF (en inglés) explica todo acerca de devfs. También contiene
información acerca de la estructura interna de devfs y como los
controladores pueden soportar devfs.
En LinuxJournal hay un
interesante artículo sobre devfs for
Management and Administration.
Daniel Robbins ha escrito un par de artículos para IBM's
DeveloperWorks acerca de sistemas de archivos avanzados. Tres de ellos
tratan sobre (todos en inglés):
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logotipo y nombre de Gentoo.
|