Espellere il CD allo spegnimento


12

OK, quindi ho un semplice problema: ho un CD live e voglio che il CD venga espulso quando il computer viene riavviato o arrestato.

L'esecuzione /usr/bin/eject -mfa espellere il CD bene ... il problema è che, come ci si potrebbe aspettare, questo provoca l'arresto anomalo del sistema operativo perché non è in grado di leggere alcun file. Quindi il riavvio non avviene mai, perché /sbin/rebootè inaccessibile. (Ho provato a eseguire reboot --help > /dev/nullsubito prima del riavvio, ma ci sono ancora altri file che non possono ancora essere letti ...)

In sintesi, sembra che devo fare in modo che l'espulsione sia l'ultima cosa che succede. Quindi sembra che systemdsia il cucciolo con cui devo giocare ... Ma ho letteralmente sprecato ore della mia vita a frugare e stimolarlo, e non importa quello che faccio, mai, mai e poi mai espulso il CD. E non ho idea del perché. Ho provato una dozzina di modi diversi di invocare eject, ma non succede mai nulla.

Qualcuno può dirmi il modo più semplice di correre eject? (Immagino che dopo umount.targetsarebbe sensato ...)


Suppongo che tu abbia un altro sistema operativo sul computer o perché altrimenti vorresti espellere il CD al riavvio? Se questo è il motivo, probabilmente si potrebbe fare di meglio se si imposta un menu di avvio in cui è possibile selezionare se eseguire l'avvio dal CD o dal disco.
Emanuel Berg,

Dopo aver smontato il CD, non ti rimane ancora il contenuto dei tuoi initramfs? Se c'è un ejectlì, staresti bene?
Ulrich Schwarz,

Resisti. È strano. Linux Mint, e penso che Ubuntu lo faccia per impostazione predefinita.
Linuxios,

Risposte:


4

Alla fine il mio collega ha trovato il seguente articolo:

http://lists.freedesktop.org/archives/systemd-devel/2012-September/006573.html

In sintesi, ho creato un file chiamato /lib/systemd/system/eject.serviceche contiene

[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

Ho dovuto anche a correre systemctl enable eject.serviceper fare questo in realtà fare nulla. Ma ora systemdespelle il CD subito prima dell'arresto, esattamente come volevo.

... sfortunatamente il SO continua a segfault quando non riesce a trovare il resto dei file con il CD espulso. Ho provato a modificare il file sopra così abbiamo After=unmount.target, che penseresti che esegua lo script dopo che i filesystem sono stati smontati. Ma no, è ancora segfault.

Sembra che dovrò capire come copiare l'immagine del CD live nella RAM all'avvio - ma questa è un'altra intera domanda ...


1

I seguenti possono aiutarti:

  • Aggiungi il tuo comando di espulsione su /etc/init.d/halt.local

  • Puoi anche guardare il modello /etc/init.d/skeleton e personalizzarlo per aggiungere forse un output, ad esempio lo spegnimento del sistema, premere un tasto qualsiasi per espellere cdrom ecc.

  • Controlla gli script in /etc/init.d che sono collegati nelle directory runlevel /etc/rc0.d (halt).


0

Controlla gli script in /etc/init.dcui sono collegati nelle directory runlevel /etc/rc0.d(halt) e /etc/rc6.d(reboot). Ad esempio, ho inserito il comando di espulsione /etc/init.d/reboote ha funzionato bene.

Ma non sono su un Live CD, quindi non posso provare cosa funzionerebbe.

Se ci pensate, qualcosa del genere, è difficile da immaginare, inserire una sceneggiatura o persino un binario compilato. Anche un binario richiede un certo overhead di allocazione / deallocazione e non appena si espelle il CD, il gioco è fatto. Piuttosto, dovrebbe essere come una bandiera e un puntatore a un'istruzione di macchina, memorizzata in una memoria super-persistente ...

Forse è più semplice eseguire il comando e arrestare deliberatamente il sistema operativo, ma farlo quando quasi tutte le cose sono offline, quindi non importa che si blocchi il sistema rimanente.

(Modifica) Un altro pensiero: potresti in qualche modo partizionare il tuo filesystem, creando una partizione solo per il comando di espulsione e riavviare, smontare tutti gli altri, quindi eseguire il comando? (Ma probabilmente a Fsck dovrebbe essere detto di non lamentarsi ogni volta che la partizione di espulsione non è stata smontata correttamente.) Oppure potresti metterlo su una chiavetta USB? (Questo è un problema molto interessante; se lo risolvi, informaci!)

(Modifica 2) Che dire della fusione di espulsione e riavvio, in modo da ottenere un file binario, viene caricato in memoria, espelle il CD, ma non deve caricare il riavvio da alcun file system, è già nella memoria principale?


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.