Bien, tengo un problema simple: tengo un CD en vivo y quiero que el CD se expulse cuando la computadora se reinicie o se detenga.
La ejecución /usr/bin/eject -m
hace que el CD se expulse bien ... el problema es que, como es de esperar, esto bloquea el sistema operativo porque ahora no puede leer ningún archivo. Entonces el reinicio nunca ocurre, porque /sbin/reboot
es inaccesible. (Intenté ejecutar reboot --help > /dev/null
justo antes del reinicio, pero todavía hay otros archivos que aún no se pueden leer ...)
En resumen, parece que necesito hacer que la expulsión sea lo último que suceda. Parece que ese systemd
es el cachorro con el que necesito jugar ... Pero he desperdiciado literalmente horas de mi vida hurgando y empujándolo, y no importa lo que haga, nunca, bajo ninguna circunstancia, expulsa el CD. Y no tengo idea de por qué. He intentado una docena de formas diferentes de invocar eject
, pero nunca pasa nada.
¿Alguien puede decirme la forma más sencilla de correr eject
? (Me imagino que justo después umount.target
sería sensato ...)
eject
allí, ¿estarías bien?Respuestas:
Finalmente, mi colega encontró el siguiente artículo:
http://lists.freedesktop.org/archives/systemd-devel/2012-September/006573.html
En resumen, creé un archivo llamado
/lib/systemd/system/eject.service
que contieneTambién tuve que correr
systemctl enable eject.service
para que esto realmente hiciera cualquier cosa. Pero ahorasystemd
expulsa el CD justo antes del apagado, exactamente como quería.... desafortunadamente, el sistema operativo sigue siendo predeterminado cuando no puede encontrar el resto de los archivos con el CD expulsado. Traté de ajustar el archivo anterior para que tengamos
After=unmount.target
, lo que pensarías que ejecuta el script después de que los sistemas de archivos se hayan desmontado. Pero no, todavía se daña.Parece que voy a tener que descubrir cómo copiar la imagen del CD en vivo en la RAM en el arranque, pero esa es otra pregunta ...
fuente
Los siguientes pueden ayudarlo:
Agregue su comando de expulsión en /etc/init.d/halt.local
También puede mirar la plantilla /etc/init.d/skeleton y personalizarla para agregar alguna salida, por ejemplo, apagado del sistema, presionar cualquier tecla para expulsar cdrom, etc.
Consulte los scripts en /etc/init.d que están vinculados en los directorios de nivel de ejecución /etc/rc0.d (detener).
fuente
Consulte los scripts
/etc/init.d
que están vinculados en los directorios de nivel de ejecución/etc/rc0.d
(detener) y/etc/rc6.d
(reiniciar). Por ejemplo, puse el comando de expulsión/etc/init.d/reboot
y funcionó bien.Pero no estoy en un Live CD, así que no puedo probar qué funcionaría.
Si lo piensas, algo así, es difícil de imaginar, poner un script o incluso un binario compilado. Incluso un binario requiere una sobrecarga de asignación / desasignación, y tan pronto como expulse el CD, habrá terminado. Más bien, debería ser como una bandera y un puntero a una instrucción de máquina, almacenada en una memoria súper persistente ...
Tal vez sea más fácil ejecutar el comando y bloquear deliberadamente el sistema operativo, pero hacerlo cuando casi todo esté desconectado, por lo que no importará que bloquee el sistema restante.
(Editar) Otro pensamiento: ¿Podría de alguna manera particionar su sistema de archivos, crear una partición solo para el comando de expulsión y reiniciar, desmontar todos los demás y luego ejecutar el comando? (Pero, probablemente, entonces fsck tendría que tener que decirle que no se queje cada vez, que la partición de expulsión no se desmontó correctamente.) O, ¿podría colocarlo en una memoria USB? (Este es un problema muy interesante; si lo resuelve, ¡díganos!)
(Edición 2) ¿Qué pasa con la fusión de expulsión y reinicio, por lo que obtiene un binario, se carga en la memoria, expulsa el CD, pero no tiene que cargar el reinicio desde ningún sistema de archivos, ya está en la memoria principal?
fuente
ubuntu puede usar
eject -m; reboot -f
fuente