Całkowicie fałszywy restart [zamknięty]

21

To wyzwanie jest proste. Napisz kod, który produkuje coś, co wygląda dokładnie jak pełne ponowne uruchomienie komputera. Nie może pokazywać na ekranie niczego, co wskazywałoby na to, że nie jest to prawdziwy restart i powinien zakończyć się na normalnym ekranie logowania, który otrzymasz po ponownym uruchomieniu.

Zasady

  1. Możesz wybrać dowolny system operacyjny, który chcesz naśladować. Na przykład możesz ponownie uruchomić system Linux z systemu Windows lub dowolną inną kombinację, którą wybierzesz.
  2. Kod powinien wyświetlać sekwencję pełnego zamykania / ponownego uruchamiania na pełnym ekranie bez znaków, że to nie jest prawdziwe.
  3. To konkurs popularności, więc im fajniejszy, tym lepiej.
  4. Kod musi w rzeczywistości być całkowicie nieszkodliwy, nie może uruchamiać się ponownie i być łatwy do zakończenia w dowolnym momencie.
  5. Jeśli potrzebujesz użyć obrazów zewnętrznych, aby ponowne uruchomienie wyglądało bardziej realistycznie, kod powinien pobrać je automatycznie z Internetu.
  6. Twój kod powinien być samodzielny, polegać tylko na standardowych, ogólnodostępnych bibliotekach lub narzędziach i być łatwo wykonywalny, postępując zgodnie z dostarczonymi instrukcjami.
  7. Powodzenia!

Ponieważ jest to konkurs popularności, przyznam zwycięstwo odpowiedzi, która uzyska największą liczbę głosów 1 czerwca 2014 r.


Po prośbie o zawężenie pytania, oto dodatkowa zasada.

  • System powinien naśladować dowolną wersję systemu Windows lub dystrybucje Mint, Ubuntu, Debian, Fedora, Archlinux lub Mageia w systemie Linux lub OS X. Aby uzyskać dodatkowe chłodzenie, należy zamknąć się w jednej i otworzyć w drugiej.

Zainteresowani mogą chcieć spojrzeć na Pitch Dark (pamięć o Godzinie dla Ziemi), gdzie sugeruje się wiele sposobów korzystania z pełnego ekranu, nawet gdy zaczyna się w Xtermie.

Społeczność
źródło
2
W tej chwili pytanie jest zbyt ogólne. Nie ograniczając systemu, który powinien zostać sfałszowany, napotyka (przynajmniej - ta lista może nie być wyczerpująca) problemy: a) ze starymi systemami opartymi na pamięci ROM, które uruchamiają się ponownie natychmiast i można je sfałszować, wyświetlając jeden obraz; b) z ustaleniem, czy fałszywy spełnia kryteria akceptacji, gdy np. komputer, na którym go uruchamiam, jest wielogłowicowy, a sfałszowany system operacyjny nie obsługuje wielu głowic (lub żadnych głowic).
Peter Taylor
@PeterTaylor Miałem nadzieję, że odpowiedzi typu a) otrzymają po prostu niskie głosy i ponieważ jest to konkurs popularności, który byłby OK. Jeśli mógłbyś mi pomóc w dopracowaniu go do punktu b) byłbym bardzo wdzięczny.
Oczywistym rozwiązaniem problemu b) jest zawężenie pytania, mówiąc, że twoje rozwiązanie musi działać tylko w systemie, który imituje, i ograniczając systemy, które można imitować. Ale nawet wtedy wiele prób jest skazanych na niepowodzenie z powodu różnorodności BIOS-ów dostępnych dla maszyn kompatybilnych z IBM.
Peter Taylor
@PeterTaylor Thanks. Znacznie zawęziłem zakres. Jak jest teraz?
Gah, prawie miałem idealne rozwiązanie dla czystego ArchLinuksa (brak powitalny rozruchu, tylko komunikaty jądra i BIOS). Muszę powiedzieć, że nigdy nie rozumiałem sensu marnowania cykli procesora podczas rozruchu, aby wyświetlić ładną grafikę.
pół-zewnętrzny zewnętrzny

Odpowiedzi:

18

zsh + coreutils + unclutter + amixer + xterm (Arch Linux)

Wziąłem odpowiedź @TheDoctor i pobiegłem z nią. Ta wersja ma wiele ulepszeń i jest w 99% przekonująca dla doświadczonego użytkownika (mnie) w moim systemie Arch Linux. Używam Zsh, ponieważ ma dobrą obsługę tablic i liczb zmiennoprzecinkowych.
Zależności: feh, unclutter, amixer, zsh, xterm

Ulepszenia:

1) Użyj liczby wydrukowanej w pierwszej kolumnie przez dmesg, czyli czasu od uruchomienia (np. [0,000000]), aby określić czas do spania. Bez tego na mojej maszynie wygląda to bardzo nierealnie. Te czasy są analizowane przed pętlą (we wczesnym wezwaniu do uśpienia), ponieważ parsowanie w pętli jest zbyt wolne.

2) Nie drukuj linii, w których czas od uruchomienia jest dłuższy niż 16 sekund. Ta konkretna liczba jest zależna od maszyny, ale chodzi o to, aby uniknąć późniejszego drukowania plików dmesg, które pochodzą z wkładania / wyjmowania pamięci USB itp. I nie są związane z uruchamianiem.

3) Zrób to wszystko w oknie terminala na pełnym ekranie z czarnym tłem i białym tekstem. Wyrazy uznania dla Mechanical Snail za tę sztuczkę zastosowaną w: Zrób obraz PNG z „Hello World!” z programistycznymi interfejsami API, w możliwie najkrótszym kodzie

4) Wycisz dźwięk przy wyłączaniu, przywróć głośność po zakończeniu skryptu.

5) Ukryj kursor myszy, przywróć po zakończeniu skryptu.

6) Pokaż ekrany powitalne BIOS i Syslinux.

Uruchom z: xterm -fu -fg biały -bg czarny -e '/ usr / bin / zsh fake-reboot.sh'

Kod:

#!/usr/bin/zsh
# Remove (undisplay) the mouse pointer
unclutter -idle 0 -jitter 255 &
# Since there is no easily-accessible (i.e. without being root) shutdown log, we
# fake these messages.
echo "The system is going down for maintenance NOW."
sleep 2.0
echo "[21656.404742] systemd[1]: Shutting down."
echo "[21656.404742] systemd[1]: Stopping Session 1 of user `id -u -n`."
echo "[21656.404742] systemd[1]: Stopped Session 1 of user `id -u -n`."
echo "[21656.404742] systemd[1]: Stopping Sound Card."
# For added effect, store volume and then mute sound
volume=`amixer -- sget Master | awk -F'[][]' 'END{print $2}'`
amixer -- sset Master 0% &> /dev/null
echo "[21656.404742] systemd[1]: Stopped target Sound Card."
sleep 0.5
echo "[21656.919792] systemd[1]: Stopping system-systemd\x2dfsck.slice."
echo "[21656.919792] systemd[1]: Removed slice system-systemd\x2dfsck.slice."
echo "[21656.919792] systemd[1]: Stopping system-netctl\x2difplugd.slice."
echo "[21656.919793] systemd[1]: Removed slice system-netctl\x2difplugd.slice."
echo "[21656.919793] systemd[1]: Stopping User Manager for UID `id -u`..."
sleep 0.7
echo "[21657.624741] systemd[1]: Stopping Graphical Interface."
echo "[21657.624742] systemd[1]: Stopped target Graphical Interface."
echo "[21657.624745] systemd[1]: Stopping Multi-User System."
sleep 0.9
echo "[21658.606561] systemd[1]: Stopped target Multi-User System."
echo "[21658.606562] systemd[1]: Stopping Paths."
echo "[21658.606562] systemd[1]: Stopped D-Bus System Message Bus."
echo "[21658.606562] systemd[1]: Stopped target Paths."
echo "[21658.606568] systemd[1]: Stopping Timers."
echo "[21658.606568] systemd[1]: Stopped target Timers."
echo "[21658.606568] systemd[1]: Stopping Sockets."
echo "[21658.606568] systemd[1]: Stopped target Sockets."
echo "[21658.606568] systemd[1]: Starting Shutdown."
echo "[21658.606571] systemd[1]: Reached target Shutdown."
echo "[21658.606571] systemd[1]: Starting Exit the Session..."
echo "[21658.606571] systemd[1]: Received SIGRTMIN+26 from PID 10988 (kill)."
echo "[21658.606571] systemd[1]: Deactivated swap."
sleep 0.4
echo "[21659.001741] systemd[1]: Starting Unmount All Filesystems."
echo "[21659.001742] systemd[1]: Unmounted /home."
echo "[21659.001742] systemd[1]: Reached target Unmount All Filesystems."
echo "[21659.001742] systemd[1]: Stopping Remount Root and Kernel File Systems..."
echo "[21659.001742] systemd[1]: Stopped Remount Root and Kernel File Systems."
echo "[21659.001743] systemd[1]: Reached target Shutdown."
echo "[21659.001743] systemd[1]: Starting Final Step."
echo "[21659.001743] systemd[1]: Reached target Final Step."
echo "[21659.001754] systemd[1]: Shutting down."
sleep 0.3
echo "[21659.304341] systemd-journal[250]: Journal stopped"
sleep 0.2
echo "System halted."
sleep 2
clear
sleep 1
# Get the BIOS splash screen and display it
wget http://pvv.ntnu.no/~asmunder/bios.jpg  &> /dev/null
feh -Z -x -F -N --force-aliasing bios.jpg &
pid=$! # Store PID of Feh, so we can kill it later
# While showing the BIOS splash, use the time to parse dmesg output into arrays
tim=`dmesg | awk '{print $2}' | sed 's/]//' | grep "[0-9][0-9][0-9][0-9][0-9]"`
tim=($=tim)
dmsg=("${(@f)$(dmesg)}")
sleep 2.5
kill $pid
sleep 0.5
# Get the Syslinux splash and display it
wget http://pvv.ntnu.no/~asmunder/syslinux.png  &> /dev/null
feh -Z -x -F -N --force-aliasing syslinux.png &
pid=$!
sleep 1.3
kill $pid
# Loop through the arrays we created. Calculate the time we have to wait before
# displaying this line. If the wait time is less than 0.1 sec, we skip waiting.
T1=0.0
T2=0.0
n=0
for d in $dmsg; do
  T1=$T2
  T2=${tim[$n]}
  ((dT = $T2-$T1))
  if (( $dT > 0.1));then
    sleep $dT
  fi
  echo $d
  if (( $T2 > 16.0 )); then
    break
  fi
  ((n=$n+1))
done
sleep 1
clear
# It's normally agetty that parses /etc/issue and handles escape codes in a 
# special way. Thus we skip the first line of /etc/issue and do that manually.
echo "Arch Linux "`uname -r`" (tty1)"
tail -n +2 /etc/issue 
echo `hostname`" login:"
sleep 10
# Reset the mouse pointer so it is visible again
unclutter -idle 5 -jitter 0 &
# Reset the audio volume
amixer -- sset Master $volume &> /dev/null
pół-zewnętrzny
źródło
3
To jest naprawdę dobre i zdecydowanie najbardziej imponujące, jakie udało mi się przetestować do tej pory.
bardzo fajny ekran startowy
Claudiu
Haha, połączyłeś moje własne pytanie! Ale to jest bardzo dobry kod. Spróbuję tego.
figgycity50
cat /etc/issue | tail -n +2 : bezużyteczne użycie kota . tail -n +2 /etc/issuejest prostsze, zwłaszcza gdy nie ma potoku.
Peter Cordes,
Słuszna uwaga. Naprawiłem i naprawiłem zepsute linki.
pół-zewnętrzny zewnętrzny
12

Commodore 64

1?CHR$(147)
2?"    **** COMMODORE 64 BASIC V2 ****"
3?
4?" 64K RAM SYSTEM  38911 BASIC BYTES FREE"

Interpreter języka BASIC automatycznie wyświetli READY.monit.

marinus
źródło
2
Sugeruję zmianę linii 1 na: 1 POKE 53280,6:POKE 53281,14:?CHR$(159):?CHR$(147) ... aby upewnić się, że kolory są prawidłowe.
Mark
+1 za wywołanie łzy w moim oku, mimo że nie spełnia zasad.
ClickRick
10

TI-Basic

AxesOff
GridOff
LabelOff
CoordOff
ClrDraw
DispGraph
ClrHome
qwr
źródło
2
Na moim Ti-83 Plus pokazuje „Gotowe”, nie wiem, czy to łamie zasady ...
Joshua
1
Aby uniknąć „Gotowe”, należy dodać dodatkowy wiersz z pojedynczym cytatem.
Timtech
Nie symuluje to ponownego uruchomienia komputera. Jeśli po prostu naciśniesz 2ND + ON, a następnie ponownie ON, przełączysz urządzenie w tryb gotowości, a wybudzenie go (w większości przypadków) spowoduje wyświetlenie ekranu, który miałeś po przejściu w tryb gotowości. Prawdziwe ponowne uruchomienie jest trudniejsze. Istnieją sposoby, aby to zrobić bez wyjmowania baterii, ale to jest najłatwiejsze. Zatem po wymianie baterii zobaczysz to, co program powinien symulować. To trudniejsze, ale możliwe także w TI-Basic.
Fabian Röling,
10

Bash + Coreutils (Linux)

echo "The system is going down for maintenance NOW."
clear
sleep 5
dmesg|while read i; do echo "$i"; sleep 0.1; done
cat /etc/issue
login
Doktor
źródło
Jest to dobre, jeśli jest uruchamiane z wirtualnego terminala. Czy jest jakiś sposób, aby zrobić to na pełnym ekranie, jeśli jest uruchamiany w Xtermie? Podejrzewam, że w tym momencie zasadniczo wdrażasz wygaszacz ekranu.
@Lembik xterm -fullscreen?
Próbowałem na Macu; nie działa
Jwosty
2
@Jwosty Na OS X (Mavericks, 10,9), trzeba mieć uprawnienia użytkownika Super, więc zastąpić dmesgz sudo dmesg. Wydanie
Futhermore
5

Windows 8

Tandetna próba, nie mogę wymyślić, jak auto pełny ekran. Próbowałem.

<!DOCTYPE html>
<html>
<body>

<iframe width="1600" height="900" src="http://www.youtube.com/embed/VgQ87b7muWs?start=510&end=524&autoplay=1" frameborder="0" allowfullscreen></iframe> 

</body>
</html>
qwr
źródło
3
Możesz spróbować poszukać interfejsu API HTML5 Element.RequestFullScreen()( developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/… )
Ismael Miguel
4

Python / Pygame OSX

import pygame, time, os, urllib # Import Modules
pygame.init() # Initalise Pygame
pygame.mouse.set_visible(0) # Hide the Cursor
stdscr = pygame.display.set_mode((1280,800),pygame.FULLSCREEN) # Set up the display
stdscr.fill((255,255,255)) # Fill the screen white
urllib.urlretrieve("http://harrybeadle.github.io/FakeRestart/apple.bmp", "apple.bmp") # Get Apple Logo
urllib.urlretrieve("http://harrybeadle.github.io/FakeRestart/startup.wav", "startup.wav") # Get Startup Sound
time.sleep(1) # Wait for 1 second, screen still black
applelogo = pygame.image.load('apple.bmp').convert() # Load the Logo
pygame.mixer.music.load('startup.wav') # Load the Bung
stdscr.blit(applelogo,(580, 340)) # Blit the logo
pygame.mixer.music.play(1) # Play the sound
pygame.display.flip() # Flip the buffers
time.sleep(5) # Wait 5 seconds
pygame.quit() # Quit the pygame window
os.remove('apple.bmp') # Delete logo
os.remove('startup.wav') # Delete bung
os.system('/System/Library/CoreServices/"Menu Extras"/User.menu/Contents/Resources/CGSession -suspend') # Lock the Mac

Teraz zaktualizowane!

Cechy:

  • Pusty ekran
  • Biały ekran z logo Apple i Bung Sound
  • Zasoby pobrane z GitHub przy użyciu urlib
  • Blokuje komputer Mac użytkownika, zachowując dowolną pracę za pomocą polecenia terminala i os.system()
Harry Beadle
źródło
Miły. Drobny nitpick - zasady mówią: „Jeśli musisz użyć obrazów zewnętrznych, aby ponowne uruchomienie wyglądało bardziej realistycznie, kod powinien pobrać je automatycznie z Internetu”.
pół-zewnętrzny zewnętrzny
@ semi-extrinsic Patrząc na to, jest to bardziej kłopotliwe niż warte, musiałem i tak edytować obraz, a Pygame nie jest przyjazny z żadnym typem pliku, który nie jest bitmapą systemu Windows, więc myślę, że pozostawiam go takim, jaki jest na razie.
Harry Beadle
1
@ semi-extrinsic Złom mój poprzedni komentarz, dodano funkcjonalność.
Harry Beadle
Pokazuje to tylko pełny ekran logo jabłka przez kilka sekund. Zdecydowanie potrzebuje „Bung” :)
@Lembik Dodałem to teraz, wraz z przeniesieniem zasobów do GitHub dla niezawodności :)
Harry Beadle
2

Ten robi Linuksa z parametrami „quiet” i „init = / bin / sh”

#!/bin/sh
echo shutting down
sleep 1
clear
echo Press F12 to enter setup. #everyone forgets the BIOS
sleep 1
clear
technozaur
źródło
zwykle systemy wyświetlają obraz lub dane wyjściowe konsoli. i nie wszyscy bios są na f12: P
masterX244
1
@ masterX244 - obraz jest konfigurowalną opcją kompilacji w systemie Linux. w trybie cichym nie ma wyjścia jądra, a przy init = / bin / sh nie ma wyjścia startowego, ponieważ init ma po prostu uruchomić powłokę. Powinieneś kiedyś spróbować i zobaczyć dokładnie, co jest potrzebne do uruchomienia X. z włączonym devtmfs + automount mogę dostać się do X w <0,2 sekundy za pomocą 1-liniowej linii.
technozaur
ahh, nie jest to powszechna konfiguracja, dlatego skomentowałem
masterX244