Ejetar 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 reiniciado ou interrompido.

A execução /usr/bin/eject -mfaz 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/nulllogo 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.targetseria sensato ...)

MathematicsOrchid
fonte
Suponho que você tenha outro sistema operacional no computador ou por que mais gostaria de ejetar o CD na reinicialização? Se esse for o motivo, você provavelmente poderá fazer melhor se configurar um menu de inicialização no qual poderá selecionar se deseja inicializar a partir do CD ou do disco.
Emanuel Berg
Depois de montar o CD, você ainda não fica com o conteúdo do seu initramfs? Se houver um ejectlá, você ficaria bem?
Ulrich Schwarz
Aguente. Isso é estranho. Linux Mint, e acho que o Ubuntu faz isso por padrão.
Linuxios

Respostas:

4

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.serviceque 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 correr systemctl enable eject.servicepara fazer isso realmente fazer qualquer coisa. Mas agora systemdejeta 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 ...

MathematicsOrchid
fonte
1

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).

Md Mahbubur Rahman
fonte
0

Confira os scripts nos /etc/init.dquais 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/reboote 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?

Emanuel Berg
fonte
0

o ubuntu pode usar eject -m; reboot -f

jamlee
fonte