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


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


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


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?


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.