2011-08-23 8 views
6

Estoy usando udev para detectar la conexión y desconexión de la unidad USB en mi servidor Ubuntu 10.04 LTS x64. Todo funciona bien cuando los dispositivos USB están conectados mientras la máquina está en funcionamiento, pero si uno ya está presente en el momento del arranque, mi script no se completa, aparentemente porque mkdir /tmp/blah no funciona.udev: dispositivo conectado en el momento del arranque

Si posteriormente escribo sudo udevadm trigger en el terminal, todo está bien.

Supongo que en el momento en que udev evalúa por primera vez los dispositivos conectados contra sus reglas, el sistema de archivos raíz no se ha montado.

Mis preguntas son por lo tanto:

  1. ¿He identificado correctamente el problema?
  2. ¿Hay una manera estándar de resolverlo? ¿Existe alguna alternativa a /tmp/ que pueda usar tanto antes como después de montar /?
+0

Excelente pregunta para http://unix.stackexchange.com/ –

+0

Es posible que tenga razón ... eso o servidor. Sin embargo, estoy escribiendo un guión de bash: mi cabeza está en modo de programación, así que vine aquí, ¡quizás sin pensarlo bien! –

Respuesta

5

El sistema de archivos raíz está montado, pero es de solo lectura en ese momento. /dev/shm (un sistema de archivos en memoria) debería estar disponible; las distribuciones de Linux más nuevas también pueden tener un disco ram /run. También puede elegir un directorio permanente en alguna parte, montar un tmpfs sobre él en su secuencia de comandos y hacer su trabajo allí.

+0

Moviendo el procesamiento de '/ tmp /' a '/ dev/shm /' resuelve el problema, muchas gracias por su ayuda. Presumiblemente, este sistema de archivos es persistente mientras la máquina está funcionando. –

+0

Sí, pero es un sistema de archivos en memoria, así que no use demasiado espacio allí. – bdonlan

1

1- No sé, incluso en el initramfs, antes de que se monte el sistema de archivos raíz, hay un directorio escribible/tmp.

Cierto, cuando la raíz real está montada, este/tmp se descartará y el final/tmp estará vacío. ¿Estás seguro de que el comando mkdir /tmp/blah está fallando? ¿O lo asumes porque no está allí cuando lo buscas?

2- En Ubuntu (no sé de otras distribuciones) tiene un directorio oculto en /dev/.initramfs para este tipo de necesidades. Como /dev es un punto de montaje tmpfs (o devtmpfs) conservado en el sistema de archivos raíz final, aún lo tendrá allí.

+0

Las reglas de udev en el sistema de archivos raíz se ejecutarán con el sistema de archivos raíz '/ tmp'; esto puede ser antes de volver a montar el sistema de archivos raíz de lectura y escritura. – bdonlan

+0

Tiene razón: no he visto el comando 'mkdir' fallar (su salida no está registrada, actualmente), pero el siguiente comando (un' mount') falla, informando que el directorio 'mkdir' se supone que crea es no presente –

+0

@bdonlan que puede ser, de solo lectura. En este caso, configurar el/tmp como un tmpfs debería hacer el truco. El truco /dev/.initramfs también debería ser válido. – rodrigo

2

Una solución a este problema es escribir un script llamado por sus reglas de udev que se desprenda inmediatamente, y espera que ocurra algún evento para asegurar que el sistema "arranque lo suficiente" para crear puntos de montaje, etc. dispositivos. La persona que respondió la siguiente publicación (http://superuser.com/questions/53978/ubuntu-automatically-mount-external-drives-to-media-label-on-boot-without-au) escribió un script que verifica si "httpd" se está ejecutando antes de continuar. Estoy seguro de que probablemente haya otras formas "mejores" de hacer esto también.

Cuestiones relacionadas