Éjecter le CD à l'arrêt

12

OK, j'ai donc un problème simple: j'ai un CD live et je veux que le CD soit éjecté lorsque l'ordinateur est redémarré ou arrêté.

L'exécution /usr/bin/eject -mrend le CD éjecté très bien ... le problème est, comme vous vous en doutez, cela bloque alors le système d'exploitation car il ne peut plus lire aucun fichier. Le redémarrage ne se produit donc jamais, car il /sbin/rebootest inaccessible. (J'ai essayé de l'exécuter reboot --help > /dev/nulljuste avant le redémarrage, mais il y a encore d'autres fichiers qui ne peuvent toujours pas être lus ...)

En résumé, il semble que je doive faire de l'éjection la toute dernière chose qui se produise. Il semble donc que systemdc'est le chiot avec lequel je dois jouer ... Mais j'ai gaspillé littéralement des heures de ma vie à le piquer et à le pousser, et peu importe ce que je fais, il n'éjecte jamais, en aucune circonstance, le CD. Et je ne sais pas pourquoi. J'ai essayé une douzaine de façons différentes d'invoquer eject, mais rien ne se passe jamais.

Quelqu'un peut-il me dire la façon la plus simple de courir eject? (J'imagine que juste après umount.targetserait raisonnable ...)

MathematicalOrchid
la source
Je suppose que vous avez un autre système d'exploitation sur l'ordinateur ou pourquoi voulez-vous éjecter le CD au redémarrage? Si c'est la raison, vous pourriez probablement faire mieux si vous configurez un menu de démarrage où vous pouvez choisir de démarrer à partir du CD ou du disque.
Emanuel Berg
Après avoir démonté le CD, ne vous reste-t-il pas encore avec le contenu de vos initramfs? S'il y en a un eject, ça irait?
Ulrich Schwarz
Attendez. C'est étrange. Linux Mint, et je pense qu'Ubuntu le fait par défaut.
Linuxios

Réponses:

4

Finalement, mon collègue a trouvé l'article suivant:

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

En résumé, j'ai créé un fichier nommé /lib/systemd/system/eject.servicequi contient

[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

J'ai aussi dû courir systemctl enable eject.servicepour que ça fasse quoi que ce soit. Mais systemdéjecte maintenant le CD juste avant l'arrêt, exactement comme je le voulais.

... malheureusement, le système d'exploitation se sépare toujours lorsqu'il ne trouve pas le reste des fichiers avec le CD éjecté. J'ai essayé d'ajuster le fichier ci-dessus pour que nous en ayons After=unmount.target, ce qui, selon vous, exécute le script après le démontage des systèmes de fichiers. Mais non, il se sépare toujours.

Il semblerait que je vais devoir trouver comment copier l'image live du CD dans la RAM au démarrage - mais c'est une toute autre question ...

MathematicalOrchid
la source
1

Les éléments suivants peuvent vous aider:

  • Ajoutez votre commande d'éjection à /etc/init.d/halt.local

  • Vous pouvez également consulter le modèle /etc/init.d/skeleton et le personnaliser pour peut-être ajouter une sortie, par exemple l'arrêt du système, appuyez sur n'importe quelle touche pour éjecter le cdrom, etc.

  • Consultez les scripts dans /etc/init.d qui sont liés dans les répertoires de niveau d'exécution /etc/rc0.d (arrêt).

Md Mahbubur Rahman
la source
0

Découvrez les scripts dans /etc/init.dlesquels sont liés dans les répertoires de niveau d'exécution /etc/rc0.d(arrêt) et /etc/rc6.d(redémarrage). Par exemple, j'ai mis la commande d'éjection /etc/init.d/rebootet cela a bien fonctionné.

Mais, je ne suis pas sur un Live CD donc je ne peux pas tester ce qui fonctionnerait.

Si vous y pensez, quelque chose comme ça, il est difficile d'imaginer, mettre un script ou même un binaire compilé. Même un binaire nécessite une surcharge d'allocation / désallocation, et dès que vous éjectez le CD, vous avez terminé. Au contraire, cela devrait être comme un drapeau et un pointeur vers une instruction machine, stocké dans une mémoire super persistante ...

Il est peut-être plus facile d'exécuter simplement la commande et de planter délibérément le système d'exploitation, mais pour ce faire, lorsque presque toutes les choses sont hors ligne, il importe peu que vous plantiez votre système restant.

(Modifier) Une autre pensée: pourriez-vous en quelque sorte partitionner votre système de fichiers, créer une partition pour la commande d'éjection et redémarrer, démonter toutes les autres, puis exécuter la commande? (Mais, probablement alors il faudrait dire à fsck de ne pas se plaindre à chaque fois, que la partition d'éjection n'a pas été démontée correctement.) Ou, pourriez-vous la mettre sur une clé USB? (C'est un problème très intéressant; si vous le résolvez, dites-le nous!)

(Edit 2) Qu'en est-il de la fusion de l' éjection et du redémarrage, de sorte que vous obtenez un binaire, il est chargé en mémoire, éjecte le CD, mais n'a pas à charger le redémarrage à partir d'un système de fichiers, il est déjà dans la mémoire principale?

Emanuel Berg
la source
0

ubuntu peut utiliser eject -m; reboot -f

jamlee
la source