OK, więc mam prosty problem: mam CD na żywo i chcę, aby CD wysunął się, gdy komputer zostanie ponownie uruchomiony lub zatrzymany.
Wykonywanie /usr/bin/eject -m
sprawia, że CD wysuwa się dobrze ... kłopot polega na tym, jak można się spodziewać, powoduje to awarię systemu operacyjnego, ponieważ nie można teraz odczytać żadnych plików. Ponowne uruchomienie nigdy się nie dzieje, ponieważ /sbin/reboot
jest niedostępne. (Próbowałem uruchomić reboot --help > /dev/null
tuż przed ponownym uruchomieniem komputera, ale nadal istnieją inne pliki, których nadal nie można odczytać ...)
Podsumowując, wydaje się, że muszę sprawić, aby wysunięcie było ostatnią rzeczą, która się wydarzy. Wygląda na to, że systemd
to szczeniak, z którym muszę się bawić ... Ale zmarnowałem dosłownie godziny życia na szturchanie go i szturchanie go, i bez względu na to, co robię, nigdy, nigdy, w żadnym wypadku, nie wyrzuca CD. I nie mam pojęcia dlaczego. Wypróbowałem kilkanaście różnych sposobów wywoływania eject
, ale nic się nigdy nie dzieje.
Czy ktoś może mi powiedzieć najprostszy sposób na bieganie eject
? (Wyobrażam sobie, że zaraz potem umount.target
byłoby rozsądne ...)
eject
, wszystko będzie dobrze?Odpowiedzi:
W końcu mój kolega znalazł następujący artykuł:
http://lists.freedesktop.org/archives/systemd-devel/2012-September/006573.html
Podsumowując, stworzyłem plik o nazwie,
/lib/systemd/system/eject.service
który zawieraMiałem również uruchomić
systemctl enable eject.service
, aby to rzeczywiście zrobić cokolwiek. Ale terazsystemd
wysuwa CD tuż przed wyłączeniem, dokładnie tak, jak chciałem.... niestety system operacyjny nadal działa nieprawidłowo, gdy nie może znaleźć pozostałych plików z wysuniętą płytą CD. Próbowałem dopasować powyższy plik, abyśmy mieli
After=unmount.target
, co według ciebie uruchamia skrypt po odmontowaniu systemów plików. Ale nie, nadal działa nieprawidłowo.Wygląda na to, że będę musiał wymyślić, jak skopiować obraz Live CD do pamięci RAM podczas uruchamiania - ale to jest zupełnie inne pytanie ...
źródło
Poniższe informacje mogą ci pomóc:
Dodaj swoje polecenie wysuwania na /etc/init.d/halt.local
Możesz także spojrzeć na szablon /etc/init.d/skeleton i dostosować go, aby dodać jakieś wyjście, np. Wyłączenie systemu, nacisnąć dowolny klawisz, aby wysunąć cdrom itp.
Sprawdź skrypty w /etc/init.d, do których prowadzą linki w katalogach poziomu uruchamiania /etc/rc0.d (halt).
źródło
Sprawdź skrypty,
/etc/init.d
które są powiązane z katalogami poziomu uruchamiania/etc/rc0.d
(zatrzymanie) i/etc/rc6.d
(ponowne uruchomienie). Na przykład wstawiłem polecenie wysuwania/etc/init.d/reboot
i działało dobrze.Ale nie jestem na Live CD, więc nie mogę przetestować, co by działało.
Jeśli się nad tym zastanowić, trudno to sobie wyobrazić, umieszczając skrypt lub nawet skompilowany plik binarny. Nawet plik binarny wymaga narzutu związanego z alokacją / dezalokacją, a gdy tylko wyjmiesz dysk CD, gotowe. Powinien raczej przypominać flagę i wskaźnik do instrukcji maszynowej, przechowywany w jakiejś bardzo trwałej pamięci ...
Może łatwiej jest po prostu uruchomić polecenie i celowo zawiesić system operacyjny, ale zrobić to, gdy prawie wszystkie rzeczy są w trybie offline, więc nie będzie miało znaczenia, że zawiesisz pozostały system.
(Edytuj) Inna myśl: czy możesz jakoś podzielić system plików na partycje, tworząc partycję dla samego polecenia wysuwania i restartu, odmontuj wszystkie pozostałe, a następnie uruchom polecenie? (Ale prawdopodobnie fsck musiałby być za każdym razem proszony, aby nie narzekał, że partycja wysuwania nie została odmontowana poprawnie). Czy możesz umieścić ją na pamięci USB? (To bardzo interesujący problem; jeśli go rozwiążesz, powiedz nam!)
(Edycja 2) Co z połączeniem wysuwania i ponownego uruchamiania, więc dostajesz jeden plik binarny, jest on ładowany do pamięci, wysuwa wysuwa CD, ale nie musi ładować ponownego uruchomienia z dowolnego systemu plików, jest już w pamięci głównej?
źródło
ubuntu może korzystać
eject -m; reboot -f
źródło