Извлечь CD при выключении

12

Итак, у меня есть простая проблема: у меня есть live CD, и я хочу, чтобы CD извлекался при перезагрузке или остановке компьютера.

Выполнение /usr/bin/eject -mделает извлечение компакт-диска просто прекрасным ... проблема, как вы можете ожидать, приводит к сбою ОС, поскольку теперь она не может читать какие-либо файлы. Так что перезагрузка никогда не происходит, потому что /sbin/rebootнедоступна. (Я пытался выполнить reboot --help > /dev/nullпрямо перед перезагрузкой, но есть другие файлы, которые все еще не могут быть прочитаны ...)

Таким образом, кажется, что я должен сделать изгнание самым последним, что происходит. Так что, похоже, systemdэто тот щенок, с которым мне нужно играть ... Но я потратил буквально часы своей жизни, ковыряя и подталкивая его, и независимо от того, что я делаю, он никогда, ни при каких обстоятельствах, фактически не выбрасывает диск. И я понятия не имею, почему. Я пробовал дюжину разных способов вызова eject, но ничего не происходит.

Кто-нибудь может сказать мне самый простой способ бегать eject? (Я думаю, что после того, как umount.targetбыло бы разумно ...)

MathematicalOrchid
источник
Я так понимаю, у вас есть другая ОС на компьютере или почему вы хотели бы извлечь компакт-диск при перезагрузке? Если это причина, вы, вероятно, могли бы сделать лучше, если бы вы установили меню загрузки, где вы могли бы выбрать, загружаться ли с компакт-диска или с диска.
Эмануэль Берг
После того, как вы размонтируете компакт-диск, не останетесь ли вы с содержимым ваших initramfs? Если там ejectесть, с тобой все будет в порядке?
Ульрих Шварц
Оставайтесь на линии. Странно. Linux Mint, и я думаю, что Ubuntu делает это по умолчанию.
Linuxios

Ответы:

4

В конце концов мой коллега нашел следующую статью:

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

В итоге я создал файл с именем, /lib/systemd/system/eject.serviceкоторый содержит

[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

Я также должен был бежать, systemctl enable eject.serviceчтобы заставить это фактически делать что-нибудь. Но теперь systemdизвлекает CD прямо перед выключением, именно так, как я хотел.

... к сожалению, ОС по-прежнему работает с ошибками, когда не может найти остальные файлы с извлеченным компакт-диском. Я пытался регулировать вышеуказанный файл таким образом , мы имеем After=unmount.target, что вы могли бы подумать запускает сценарий после того, как файловые системы были демонтированы. Но нет, все-таки это segfaults.

Похоже, мне придется выяснить, как скопировать образ живого CD в ОЗУ при загрузке - но это совсем другой вопрос ...

MathematicalOrchid
источник
1

Следующее может помочь вам:

  • Добавьте вашу команду извлечения в /etc/init.d/halt.local

  • Вы также можете посмотреть на шаблон /etc/init.d/skeleton и настроить его так, чтобы, возможно, добавить какой-нибудь вывод, например, выключение системы, нажать любую клавишу, чтобы извлечь диск и т. Д.

  • Проверьте скрипты в /etc/init.d, связанные с каталогами уровня запуска /etc/rc0.d (halt).

Г-н Махбубур Рахман
источник
0

Проверьте сценарии, на /etc/init.dкоторые ссылаются каталоги уровней запуска /etc/rc0.d(останов) и /etc/rc6.d(перезагрузка). Например, я вставил команду eject, /etc/init.d/rebootи она работала нормально.

Но я не на Live CD, поэтому я не могу проверить, что будет работать.

Если вы думаете об этом, что-то вроде этого, трудно представить, вставляя скрипт или даже скомпилированный бинарный файл. Даже двоичный файл требует некоторых затрат на распределение / освобождение, и как только вы извлекаете компакт-диск, все готово. Скорее, это должно быть как флаг и указатель на машинную инструкцию, хранящуюся в некоторой сверхпостоянной памяти ...

Может быть, проще просто запустить команду и преднамеренно завершить работу ОС, но сделать это, когда почти все компоненты находятся в автономном режиме, поэтому не будет иметь значения, что вы выйдете из строя оставшейся системы.

(Правка) Еще одна мысль: не могли бы вы каким-то образом разделить файловую систему, создав раздел только для команды eject и перезагрузившись, размонтировав все остальные, а затем запустив команду? (Но, вероятно, тогда fsck нужно было бы сказать, чтобы каждый раз не жаловаться, что раздел извлечения не был правильно размонтирован.) Или, не могли бы вы положить его на флешку? (Это очень интересная проблема; если вы решите ее, сообщите нам!)

(Правка 2) Как насчет слияния eject и reboot, чтобы вы получили один двоичный файл, он загружен в память, eject извлекает компакт-диск, но не должен загружать перезагрузку из какой-либо файловой системы, он уже находится в основной памяти?

Эмануэль Берг
источник
0

Ubuntu может использовать eject -m; reboot -f

jamlee
источник