Полностью поддельная перезагрузка [закрыто]


21

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

Правила.

  1. Вы можете выбрать любую ОС, которую хотите имитировать. Например, вы можете перезагрузиться в Linux из Windows или любой другой комбинации, которую вы выберете.
  2. Код должен отображать полный экран последовательности выключения / перезагрузки без признаков того, что это не реально.
  3. Это конкурс популярности, поэтому чем круче, тем лучше.
  4. На самом деле код должен быть абсолютно безвредным, не выполнять перезагрузку и легко выходить из системы в любой момент.
  5. Если вам нужно использовать внешние изображения, чтобы перезагрузка выглядела более реалистично, тогда ваш код должен автоматически получать их из Интернета.
  6. Ваш код должен быть самодостаточным, опираться только на стандартные свободно доступные библиотеки или инструменты и легко выполняться, следуя инструкциям, которые вы предоставляете.
  7. Удачи!

Поскольку это конкурс на популярность, я награжу победителя ответом с наибольшим количеством голосов 1 июня 2014 года.


После запроса, чтобы сузить вопрос, вот дополнительное правило.

  • Система должна имитировать любую версию Windows или дистрибутивов Linux или OS X для Mint, Ubuntu, Debian, Fedora, Archlinux или Mageia. Для большей крутости вы должны выключиться в одной и открыть в другой.

Заинтересованные люди могут захотеть взглянуть на Pitch dark (воспоминание о Часе Земли), где предлагается несколько способов использования полноэкранного режима даже при запуске в xterm.


2
В настоящее время этот вопрос слишком широк. Не ограничивая систему, которая должна быть сфальсифицирована, она сталкивается (по крайней мере, с этим списком, который может быть не исчерпывающим): a) со старыми системами на основе ПЗУ, которые мгновенно перезагружаются и могут быть фальсифицированы путем отображения одного изображения; б) с определением, соответствует ли подделка критериям приемлемости, когда, например, компьютер, на котором я работаю, является многоголовочным, а фальсифицированная ОС не поддерживает многоголовочные (или вообще какие-либо головки).
Питер Тейлор

@PeterTaylor Я надеялся, что ответы типа а) просто получат низкие голоса, и это будет популярный конкурс. Если бы вы могли помочь мне уточнить это, чтобы обработать пункт б) Я был бы очень благодарен.

Очевидное решение проблемы b) состоит в том, чтобы сузить вопрос, сказав, что ваше решение должно работать только в системе, которой оно подражает, и ограничивая системы, которые можно имитировать. Но даже тогда многие попытки обречены на неудачу из-за множества BIOS, доступных для IBM-совместимых машин.
Питер Тейлор

@PeterTaylor Спасибо. Я сильно сузил сферу. Как оно сейчас?

Да, у меня почти было идеальное решение для чистого ArchLinux (без заставки, только сообщения ядра и BIOS). Должен сказать, я никогда не понимал смысла тратить циклы процессора при загрузке, просто чтобы показать какую-то красивую графику.
Полуэкспериментальный

Ответы:


18

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

Я взял ответ @TheDoctor и побежал с ним. Эта версия имеет много улучшений и на 99% убедительна для опытного пользователя (меня) в моей системе Arch Linux. Я использую Zsh, так как он имеет хорошую поддержку массивов и чисел с плавающей точкой.
Зависимости: feh, unclutter, amixer, zsh, xterm

Улучшения:

1) Используйте число, напечатанное в первом столбце, как dmesg, то есть время с момента загрузки (например, [0,000000]), чтобы определить время для сна. Без этого это выглядит очень нереально на моей машине. Эти времена анализируются перед циклом (при раннем вызове в режим сна), поскольку анализ внутри цикла выполняется слишком медленно.

2) Не печатать строки, где время с момента загрузки превышает 16 секунд. Этот конкретный номер зависит от машины, но суть заключается в том, чтобы избежать печати более поздних dmesg-материалов, которые появляются при вставке / удалении USB-флешек и т. Д. И не связаны с загрузкой.

3) Сделайте все это в полноэкранном окне терминала с черным фоном и белым текстом. Слава механической улитке за этот трюк, используемый в: Создайте изображение PNG с "Hello World!" с API программирования, в кратчайшем коде

4) Отключить звук при выключении, восстановить громкость, когда сценарий завершится.

5) Скрыть курсор мыши, восстановить после завершения сценария.

6) Показать заставки BIOS и Syslinux.

Запустите с: xterm -fu -fg white -bg black -e '/ usr / bin / zsh fake-reboot.sh'

Код:

#!/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

3
Это действительно хорошо, и, безусловно, самый впечатляющий из всех, которые мне удалось проверить.

очень хороший, большой экран загрузки
Claudiu

Хаха, ты связал мой собственный вопрос! Но это очень хороший код. Я собираюсь попробовать это.
figgycity50

cat /etc/issue | tail -n +2 : бесполезное использование кота . tail -n +2 /etc/issueпроще, особенно когда нет конвейера.
Питер Кордес

Хорошая точка зрения. Исправлено, и исправлены неработающие ссылки.
полу-посторонний

12

Коммодор 64

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

Основной интерпретатор отобразит READY.подсказку автоматически.


2
Я бы предложил изменить строку 1 на: 1 POKE 53280,6:POKE 53281,14:?CHR$(159):?CHR$(147) ..., чтобы убедиться, что цвета правильные.
Марк

+1 за то, что слеза попала мне в глаза, хотя это не соответствует правилам.
ClickRick

10

TI-Basic

AxesOff
GridOff
LabelOff
CoordOff
ClrDraw
DispGraph
ClrHome

2
На моем Ti-83 Plus он показывает "Готово", не знаю, нарушит ли это правила ...
Джошуа

1
Чтобы избежать «Готово», необходимо добавить дополнительную строку с одинарной кавычкой.
Timtech

Это не имитирует перезагрузку. Если вы просто нажмете 2ND + ON, а затем снова включите, вы только переведете устройство в режим ожидания, и при пробуждении оно показывает (в большинстве случаев) экран, который у вас был, когда вы переводили его в режим ожидания. Реальную перезагрузку сделать сложнее. Есть способы сделать это, не вынимая батарею, но это самый простой. То, что вы видите после замены батарей, - это то, что программа должна имитировать. Это сложнее, но также возможно в TI-Basic.
Фабиан Релинг,

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

Это хорошо, если запустить с виртуального терминала. Есть ли способ сделать его полноэкранным, если он запущен в xterm? Я полагаю, в этот момент вы в основном внедряете заставку.

@Lembik xterm -fullscreen?


Пробовал на Mac; не работает
Jwosty

2
@Jwosty В OS X (Mavericks, 10.9) вам нужны привилегии суперпользователя, поэтому замените dmesgна sudo dmesg. Более того / etc / issue не существует в OS X.
CousinCocaine

5

Windows 8

Неудачная попытка, я не могу понять, как автоматически на весь экран. Я пытался.

<!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>

3
Вы можете попробовать поискать HTML5 API Element.RequestFullScreen()( developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/… )
Исмаэль Мигель,

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

Сейчас обновлено!

Функции:

  • Пустой экран
  • Белый экран с логотипом Apple и звуком Bung
  • Активы, загруженные с GitHub с помощью urlib
  • Блокирует Mac пользователя, сохраняя любую работу, используя команду терминала и os.system()

Ницца. Незначительные мелочи - правила гласят: «Если вам нужно использовать внешние образы, чтобы перезагрузка выглядела более реалистично, тогда ваш код должен автоматически получать их из Интернета».
полу-посторонний

@ semi-extrinsic Посмотрел на это, это более надоедливо, чем стоит, мне все равно пришлось редактировать изображение, и Pygame не дружит с любым типом файлов, который не является растровым изображением Windows, поэтому я думаю, что пока оставляю его таким, какой он есть.
Гарри Бидл

1
@ полуэкстремальный Записать мой предыдущий комментарий, функциональность добавлена.
Гарри Бидл

Это только показывает яблочный логотип на весь экран в течение нескольких секунд. Для этого определенно нужна "пробка" :)

@Lembik Я добавил это сейчас, вместе с переносом ресурсов в GitHub для надежности :)
Гарри Бидл

2

Этот делает Linux с параметрами "quiet" и "init = / bin / sh"

#!/bin/sh
echo shutting down
sleep 1
clear
echo Press F12 to enter setup. #everyone forgets the BIOS
sleep 1
clear

обычно системы показывают изображение или вывод на консоль. и не у всех биос есть на f12: P
masterX244

1
@ masterX244 - образ является настраиваемой опцией сборки в linux. при тихом выходе ядра нет, а при init = / bin / sh вывод при запуске отсутствует, потому что init просто запускает оболочку. Вы должны попробовать это когда-нибудь и посмотреть, что именно нужно для запуска X. с включенным devtmfs + automount, я могу добраться до X за <0.2sec с помощью 1 строки.
технозавр

ааа, не обычный
конфиг,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.