OK, tenho um problema simples: tenho um CD ao vivo e quero que o CD seja ejetado quando o computador for reiniciado ou interrompido.
A execução /usr/bin/eject -m
faz com que o CD seja ejetado muito bem ... o problema é que, como você poderia esperar, isso causa um travamento no sistema operacional porque agora não é possível ler nenhum arquivo. Portanto, a reinicialização nunca acontece, porque /sbin/reboot
é inacessível. (Tentei executar reboot --help > /dev/null
logo antes da reinicialização, mas ainda existem outros arquivos que ainda não podem ser lidos ...)
Em resumo, parece que preciso fazer com que a ejeção seja a última coisa que acontece. Parece que systemd
é com o filhote que eu preciso brincar ... Mas perdi literalmente horas da minha vida cutucando e cutucando-o, e não importa o que eu faça, ele nunca, nunca, sob nenhuma circunstância, realmente ejeta o CD. E eu não tenho ideia do porquê. Eu tentei uma dúzia de maneiras diferentes de invocar eject
, mas nada acontece.
Alguém pode me dizer a maneira mais simples de correr eject
? (Eu imagino logo depois umount.target
seria sensato ...)
eject
lá, você ficaria bem?Respostas:
Eventualmente, meu colega encontrou o seguinte artigo:
http://lists.freedesktop.org/archives/systemd-devel/2012-September/006573.html
Em resumo, criei um arquivo nomeado
/lib/systemd/system/eject.service
que contémEu também tive que correr
systemctl enable eject.service
para fazer isso realmente fazer qualquer coisa. Mas agorasystemd
ejeta o CD logo antes do desligamento, exatamente como eu queria.... infelizmente, o sistema operacional ainda se segmenta quando não consegue encontrar o restante dos arquivos com o CD ejetado. Tentei ajustar o arquivo acima para que o tenhamos
After=unmount.target
, o que você acha que executa o script depois que os sistemas de arquivos foram desmontados. Mas não, ainda segfaults.Parece que vou ter que descobrir como copiar a imagem do CD ao vivo na RAM na inicialização - mas essa é outra questão ...
fonte
As seguintes podem ajudá-lo:
Adicione seu comando de ejeção em /etc/init.d/halt.local
Você também pode olhar para o modelo /etc/init.d/skeleton e personalizá-lo para adicionar alguma saída, por exemplo, desligamento do sistema, pressionar qualquer tecla para ejetar o cdrom etc.
Confira os scripts em /etc/init.d aos quais estão vinculados os diretórios de nível de execução /etc/rc0.d (halt).
fonte
Confira os scripts nos
/etc/init.d
quais estão vinculados os diretórios de nível de execução/etc/rc0.d
(parada) e/etc/rc6.d
(reinicialização). Por exemplo, eu coloquei o comando ejetar/etc/init.d/reboot
e funcionou bem.Mas, como não estou em um Live CD, não posso testar o que funcionaria.
Se você pensar sobre isso, algo como isso, é difícil imaginar colocar um script ou até um binário compilado. Mesmo um binário requer alguma sobrecarga de alocação / desalocação e, assim que você ejeta o CD, está pronto. Em vez disso, deve ser como uma bandeira e um ponteiro para uma instrução de máquina, armazenada em alguma memória super persistente ...
Talvez seja mais fácil executar o comando e travar o sistema operacional deliberadamente, mas fazê-lo quando quase tudo estiver off-line, para que não importe que você travar o sistema restante.
(Editar) Outro pensamento: você poderia, de alguma forma, particionar seu sistema de arquivos, criando uma partição apenas para o comando eject e reiniciar, desmontar todos os outros e executar o comando? (Mas, provavelmente o fsck deveria ser instruído a não reclamar toda vez, de que a partição de ejeção não foi desmontada corretamente.) Ou você poderia colocá-la em um pendrive? (Esse é um problema muito interessante; se você resolver, diga-nos!)
(Editar 2) Que tal mesclar ejetar e reiniciar, para que você obtenha um binário, ele é carregado na memória, ejeta o CD, mas não precisa carregar a reinicialização de nenhum sistema de arquivos, ele já está na memória principal?
fonte
o ubuntu pode usar
eject -m; reboot -f
fonte