Повністю підроблена перезавантаження [закрита]


21

Цей виклик простий. Напишіть код, який створює те, що виглядає як повне перезавантаження комп'ютера. Він не повинен показувати нічого на екрані, що вказує, що це не справжня перезавантаження, і він повинен закінчуватися на звичайному екрані входу, який ви отримаєте після перезавантаження.

Правила.

  1. Ви можете вибрати будь-яку ОС, яку ви хочете наслідувати. Наприклад, ви можете перезавантажити Linux з Windows або будь-якої іншої комбінації, яку ви обрали.
  2. Код повинен відображати повний екран послідовності вимкнення / перезавантаження без ознак того, що це не реально.
  3. Це конкурс на популярність, тому чим крутіше, тим краще.
  4. Насправді код повинен бути абсолютно нешкідливим, не виконувати перезавантаження і b легко закрити в будь-який момент.
  5. Якщо вам потрібно використовувати зовнішні зображення, щоб зробити перезавантаження більш реалістичним, тоді ваш код повинен автоматично захоплювати їх з Інтернету.
  6. Ваш код повинен бути самостійним, покладаючись лише на стандартні вільно доступні бібліотеки чи інструменти, та легко виконуватись, дотримуючись наданих вами інструкцій.
  7. Удачі!

Оскільки це конкурс на популярність, я присуджую перемогу у відповіді з найбільшою кількістю голосів 1 червня 2014 року.


Після запиту звузити питання, ось додаткове правило.

  • Система повинна імітувати будь-яку версію Windows або Mint, Ubuntu, Debian, Fedora, Archlinux або Mageia, дистрибутивів Linux або OS X. Для додаткової прохолоди слід закрити в одній і відкрити в іншій.

Зацікавлені люди можуть захотіти подивитися на темну пітч (спогад за годину Землі), де пропонується ряд способів використання повного екрану навіть при запуску в xterm.


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

@PeterTaylor Я сподівався, що відповіді типу a) просто отримають низькі голоси, і оскільки це буде конкурс на популярність. Якщо ви можете допомогти мені уточнити це, щоб вирішити точку б), я був би дуже вдячний.

Очевидним рішенням проблеми 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) Робіть усе це у вікні повноекранного терміналу з чорним фоном та білим текстом. Kudos to Mechanical Snail для цього фокусу, який використовується у: Створіть зображення PNG із написом "Hello World!" з API програмування, в найкоротший термін

4) Відключення звуку при відключенні, відновлення гучності після завершення сценарію.

5) Сховати курсор миші, відновити, коли сценарій закінчується.

6) Відображення екранів сплеску BIOS та Syslinux.

Виконати з: xterm -fu -fg білий -bg чорний -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
Це дійсно добре і, безумовно, найбільш вражаючий, який я міг перевірити досі.

дуже приємний завантажувальний екран
Клавдіу

Ха-ха, ти пов’язав моє власне питання! Але це дуже хороший код. Я збираюся спробувати.
figgycity50

cat /etc/issue | tail -n +2 : марне використання кота . tail -n +2 /etc/issueпростіше, особливо коли немає трубопроводу.
Пітер Кордес

Влучне зауваження. Виправили його і виправили зламані зв’язки.
напівкрединне

12

Commodore 64

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

Інтегратор BASIC автоматично відобразить 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
Щоб уникнути "Готово", вам слід додати додатковий рядок з однією цитатою.
Тімтех

Це не імітує перезавантаження. Якщо ви просто натисніть кнопку 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. Проблема Futhermore / тощо / не існує в ОС 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
Ви можете спробувати шукати API HTML5 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 та звуковим звуком
  • Активи, завантажені з GitHub за допомогою urlib
  • Блокує Mac користувача, зберігаючи будь-яку роботу за допомогою термінальної команди та os.system()

Приємно. Незначна нітпік - правила говорять: "Якщо вам потрібно використовувати зовнішні зображення, щоб перезавантаження виглядало реалістичніше, ваш код повинен автоматично захоплювати їх з Інтернету".
напів зовнішній

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

1
@ напів-зовнішній брухт мій попередній коментар, функціональність додана.
Гаррі Бісл

Це показує лише логотип яблука на весь екран протягом декількох секунд. Це, безумовно, потрібен "Бунг" :)

@Lembik Я додав, що зараз, разом із переміщенням активів до GitHub для надійності :)
Гаррі Бідл,

2

Цей робить Linux з параметрами "тих" і "init = / bin / sh"

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

зазвичай системи або показують зображення або консольний вихід. і не всі
біоси

1
@ masterX244 - зображення є налаштованим параметром збірки в Linux. при тиші немає вихідного ядра, а при init = / bin / sh немає запуску, тому що init - це просто запустити оболонку. Вам слід спробувати це колись і побачити, що саме потрібно для запуску X. з включеним devtmfs + automount, я можу дістатись до X у <0,2сек. За допомогою 1-лайнера.
технозавр

ах, не звичайна конфігурація, чому я так прокоментував
masterX244,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.