Ejeta CD no desligamento

12

OK, tenho um problema simples: tenho um CD ao vivo e quero que o CD seja ejetado quando o computador for reinicializado ou interrompido.

A execução de /usr/bin/eject -m faz com que o CD seja ejetado bem ... o problema é, como você pode esperar, isso trava o sistema operacional porque agora ele não consegue ler nenhum arquivo. Portanto, a reinicialização nunca acontece, porque /sbin/reboot está inacessível. (Eu 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 eu preciso fazer a ejeção ser a última coisa que acontece. Então parece que systemd é o filhote que eu preciso brincar ... Mas eu desperdicei literalmente horas da minha vida cutucando e cutucando, e não importa o que eu faça, nunca, nunca , sob quaisquer circunstâncias, ejeta o CD. E eu não tenho ideia do porque. Eu tentei uma dúzia de maneiras diferentes de invocar eject , mas nada acontece.

Alguém pode me dizer a maneira mais simples de executar eject ? (Eu imagino que logo após umount.target seria sensato ...)

    
por MathematicalOrchid 22.11.2012 / 23:34

4 respostas

4

Eventualmente, meu colega encontrou o seguinte artigo:

link

Em resumo, criei um arquivo chamado /lib/systemd/system/eject.service , que contém

[Unit]
Description=Eject the DVD
Before=final.target
After=shutdown.target
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/usr/bin/eject -m
StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit

[Install]
WantedBy=shutdown.target

Eu também tive que executar systemctl enable eject.service para fazer isso realmente fazer qualquer coisa. Mas agora systemd ejeta o CD logo antes do desligamento, exatamente como eu queria.

... infelizmente o sistema operacional ainda se contorce quando não consegue encontrar o resto dos arquivos com o CD ejetado. Eu tentei ajustar o arquivo acima, então temos After=unmount.target , 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 durante a inicialização - mas essa é uma outra pergunta ...

    
por 26.11.2012 / 13:30
1

Os seguidores podem ajudá-lo:

  • Adicione seu comando de ejeção em /etc/init.d/halt.local

  • Você também pode ver o modelo /etc/init.d/skeleton e personalizar isso para talvez adicionar alguma saída, por exemplo, sistema de desligamento, pressione qualquer tecla para ejetar cdrom, etc.

  • Confira os scripts em /etc/init.d que estão vinculados no diretórios de runlevel /etc/rc0.d (halt).

por 23.11.2012 / 06:06
0

Verifique os scripts em /etc/init.d que estão vinculados nos diretórios de nível de execução /etc/rc0.d (halt) e /etc/rc6.d (reboot). Por exemplo, eu coloquei o comando de ejeção em /etc/init.d/reboot e funcionou bem.

Mas eu não estou em um Live CD, então não posso testar o que funciona.

Se você pensar sobre isso, algo assim, é difícil imaginar, colocando em um script ou até mesmo um binário compilado. Até mesmo um binário requer alguma sobrecarga de alocação / desalocação, e assim que você ejeta o CD, você 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 simplesmente executar o comando e travar deliberadamente o sistema operacional, mas isso ocorre quando quase todas as coisas estão off-line, portanto, não importará que você bloqueie o sistema restante.

(Edit) Outro pensamento: Você poderia de alguma forma particionar seu sistema de arquivos, criar uma partição apenas para o comando ejetar e reiniciar, desmontar todos os outros e depois executar o comando? (Mas, provavelmente, então o fsck teria que ser avisado para não reclamar todas as vezes, que a partição de ejeção não foi desmontada corretamente.) Ou, você poderia colocá-la em um pendrive? (Este é um problema muito interessante; se você resolver, diga-nos!)

(Edit 2) O que acha de fundir ejetar e reiniciar, assim você obtém um binário, ele é carregado na memória, ejeta ejeta o CD, mas não tem que carregar reboot a partir de qualquer sistema de arquivos, ele já está na memória principal?

    
por 23.11.2012 / 02:59
0

o ubuntu pode usar eject -m; reboot -f

    
por 24.05.2018 / 05:47