NVRAM WakeUp
Материал из RuVDRWiki
Содержание |
Введение
Автор: Сергей Халлер
Возможность своевремённого включения цифрового видеомагнитофона до начала записи была бы особенно практична. Для VDR имеется решение в форме маленькой программы под названием nvram-wakeup, которая была написана специально для VDR. Тем самым во время отключения компьютера возможно указать в BIOS дату для автоматического включения.
Инсталляция
Инсталляция программы начинается, к примеру, из каталога /usr/local/src/. При этом Binary производится для nvram-wakeup и несколько других утилит.
tar -xjvf nvram-wakeup-0.97.tar.bz2 cd nvram-wakeup-0.97 make devices make make install
При инсталляции готовый Binary устанавливается в каталог /usr/local/bin. Одновременно копируется также приложенный примерный файл vdrshutdown в /usr/local/bin и заменяет его при необходимости на наличествующий прежний файл с этим наименованием. При выключении VDR оценивается при этом переданные параметры к новому старту в форме количества секунд до следущей запрограммированной записи.
После инсталляции так же можно вызывать Manual-Pages
man nvram-wakeup man nvram-wakeup.conf
Известная мат. плата
NVRAM-WAKEUP распознаёт мат. плату посредством данных DMI. Соответствующие данные должны находиться в файле nvram-wakeup-mb.c. Там занесены известные мат. платы. Приведёными ниже командами можно узнать поддерживается ли ваша мат. плата:
biosinfo
nvram-wakeup --debug
Неизвестная мат. плата
Чтобы мочь ставить дату из операционной системы для автоматического старта компьютера, прежде всего должны быть известны затронутые адреса в (Non-Volatile RAM - NVRAM) BIOS-a. Принципиальный образ действий для вычесления неизвестныx адресов выглядит так, что по очереди вносятся в BIOS вручную определёные даты и затем вычитывается содержание области памяти. Сравнениями устанавливают потом позиции искомых адресов в NVRAM. Содержание считывается через /dev/nvram или /dev/rtc. Детали разъясняются в файле README.mb.
guess-helper
Скрипт "guess-helper.sh" пытается узнать позиции отдельных полей в NVRAM. Для этого требуются минимум 4 новых старта компьютера: пользователь должен активировать сначало в биосе функцию просыпания и вносить после каждого старта указанные скриптом даты. При этом содержание NVRAM будет автоматически записанно в промежуточные файлы для последующей обработки.
Это происходит в 4 шага после первого вызова скрипта с правами системного администратора root:
/usr/local/sbin/guess-helper ; для ArVDR /usr/sbin/guess-helper
- В первом шаге нужно активировать в BIOS функцию Wakeup и внести значения: день "31" , час "23" и "59" минут&секунд как максимальные величины.
- В следующем шаге вносятся промежуточные величены: день "11", час "12", минут "13" и секунд "14".
- Затем вносятся минимальные величины: день "01" , час, минута и секунда "00".
- В последнем шаге остаются последние величины и деактивировать функцию Wakeup в BIOS.
Скрипт вызывается после каждой перезагрузки компьютера между отдельными шагами. В конце процедуры автоматически создаётся файл конфигурации для до сих пор неизвестной мат. платы.
Принципиально создаются 2 файла в каталогах /root/guess-directisa и /root/guess.
- /root/guess-directisa для метода посредством непосредственного доступа к I/O,
- /root/guess-nvram-module для метода через /dev/nvram.
Здесь описывается только более универсальный метод с непосредственным доступом I/O. Это избегает проблем с возможно необходимыми патчами ядра и не читаемыми областями NVRAM, если соответствующие значения выше байта 114 и ниже байта 128. Также этот метод единственная возможность для более новых мат. плат обращаться к области между 128 и 256 байтов. При этом нужно указывать соответствующий чип мат. платы с опцией "upper_method". Правда до сих пор поддерживаются не все чипы.
Недостаток этого метода в том, что при одновременном доступе другой программы к /dev/nvram или /dev/rtc значения могут переставляться в BIOS!
В следующем шаге созданный файл конфигурации копируется в предназначенный каталог /etc:
cp /root/guess-directisa/nvram-wakeup.conf /etc
Файл и дополнительная опция должны указываться всегда при вызове программы:
/usr/local/bin/nvram-wakeup -C /etc/nvram-wakeup.conf --directisa
Первый тест
Используйте сначало опцию --nowrite
/usr/local/bin/nvram-wakeup -C /etc/nvram-wakeup.conf --directisa -s $((`date +%s` + 10 * 60)) --nowrite
Если скрипт создал коректный nvram-wakeup.conf, тогда в консоле должно появиться что-то вроде
All values are displayed as they are stored in the nvram/rtc. (and do not correspond necessarily to the system date/time) WakeUp : Enabled (0xA0) Day : 17 (0x11) Hour : 19 (0x13) Minute : 08 (0x08) Second : 00 (0x00) Checksum: 0x3D38 Enabling (0xA0) WakeUp-on-RTC in nvram. New Day : 19 (0x13) New Hour : 17 (0x11) New Minute : 53 (0x35) New Second : 55 (0x37) New Checksum: 0x3D9C Actually, nothing was written into /dev/nvram nor into /dev/rtc. (since --nowrite option was used)
После введения приведённых ниже команд, компьютер должен самостаятельно включиться через 5 минут:
/usr/local/bin/nvram-wakeup -C /etc/nvram-wakeup.conf --directisa -s $((`date +%s` + 10 * 60))
poweroff
Проблематичность Reboot
Принципиально имеются 2 причины для необходимости дополнительной перезагрузки после прекращения работы компьютера. Либо значения перенимаются при изменениях в BIOS только после перезагрузки компьютера, либо существует принципиальная проблема в Powermanagement APM и соответственно ACPI. Для этих причин имеются соответственно разные решения, так как при проблемах в области Powermanagement, решения в рамках программы nvram-wakeup не могут хватать. Можно провести 2 коротких теста для выяснения вида проблемы. Детали описаны в файле README.reboot.
- Короткий тест
Для простоты проведём тест к полному часу, например 12:00. Сначало активируем автоматический старт компьютера через 15 минут
nvram-wakeup -C /etc/nvram-wakeup.conf --directisa -s $((`date +%s` + 1200))
и перезагружаем компьютер
shutdown -r now
После того как компьютер включился, програмируем в 12:05 следущий старт в 12:10
nvram-wakeup -C /etc/nvram-wakeup.conf --directisa -s $((`date +%s` + 601))
и тут же выключаем
shutdown -h now
Если компьютер не включился позднее 12:20, тогда существует проблема в Powermanagement. В этом случае нужно изменить в файле /usr/local/bin/vdrshutdown часть "case 1)" на "case 0,1)" и удалить "case 0)", чтобы в будущем при каждом прекращении работы компьютера проводился перед окончательным выключением короткий Reboot.
В случае самостоятельного старта в 12:15 значит, что при изменении времени старта на вашей мат. плате сначала необходим дополнительный Reboot. Тогда нужно сделать соответствующее дополнение в /etc/nvram-wakeup.conf:
need_reboot = ON_ANY_CHANGE
- Короткий тест
В случае самостаятельного старта в 12:10, компьютер может всё ещё нуждаться в Reboot, при активизации или деактивировании функциональности Wakeup. Это можно проверить, запрограммировав в 12:30 следущий старт компьютера на 12:45
nvram-wakeup -C /etc/nvram-wakeup.conf --directisa -s $((`date +%s` + 1200))
потом перезапускаем компьютер
shutdown -r now
После включения деактивируйте функцию Wakeup
nvram-wakeup -C /etc/nvram-wakeup.conf -d
и выключите компьютер
shutdown -h now
Если компьютер всётаки включился в 12:45, тогда введите следущую строчку в /etc/nvram-wakeup.conf:
need_reboot = ON_STAT
Если Вы установили после второго короткого теста, что компьютер до 12:50 вообще не включился и нет никаких проблем с Reboot, то никакие следующие(дальнейшие) мероприятия здесь не необходимы.
Во всех других проблемных случаях упомянутыми с изменениями в файлах vdrshutdown и nvram-wakeup.conf требуются также дополнительная установкa опции в Boot-Manager системы для дополнительного Reboot:
boot = /dev/hda
read-only
lba32
default = linux
image = /boot/vmlinuz
label = linux
root = /dev/hda2
initrd = /boot/initrd
append = "enableapic vga=0x0314 splash=silent desktop hdc=ide-scsi hdclun=0"
## VDR-WakeUp
image = /boot/vmlinuz
label = PowerOff
root = /dev/hda2
initrd = /boot/initrd
append = "0"
В заключении активируем изменения
lilo
Еще остается упоминуть, что этот простой и элегантный метод возможен только с Boot-Manager Lilo.
WakeUp после простого выключения
Если выключить компьютер не пультом или через меню VDR, то время следущего старта не будет прописано в NVRAM, так как в этих случаях не используется скрипт Shutdown. Поэтому нужно ввести следущие команды перед полным выключением:
nvram-wakeup -s $(svdrpsend.pl -d localhost NEXT abs|grep -i 250 |cut -c 8-17)
Snapshot
svn co https://nvram-wakeup.svn.sourceforge.net/svnroot/nvram-wakeup nvram-wakeup
SETTIME
Простой метод самостоятельного просыпания компьютера, который работает с каждой мат. платой, является »settime«. Пользователь программирует один раз твёрдую дату просыпания, например 31 числа в 23:59:59. При выключении скрипт вычисляет временную разницу между выключением и просыпанием, потом отнимает этот период от 31 мая 2004, 23:59:59 часов и устанавливает время системы и RTC соответственно на один день в мае 2004. При следущем старте скрипт »correcttime« должен только откоригировать системное время.
"SETTIME" делает так, что время в RTC компьютера продолжает идти нормально. Таким образом не необходимо после каждого старта сравнивать системное время с другим компьютером или часами - достаточно знать, сколько секунд часы отстают по сравнению с нормальным временем. Также не требуются осложненные расчеты даты при учете високосных годов, "date" предоставляет в распоряжение все необходимые функции.
Таким образом, следующая команда переставляет системное время на один час вперёд:
date -s "+3600 seconds"
Назад в прошлое командой:
date -s "3600 seconds ago"
Кроме того, "date" позволяет пересчитывать дату во всемирно обыкновенном стиле в течение секунд с Epoch:
debian:~# date -d "2004-05-31 23:59:59" +%s
Коррекция времени при старте компьютера
Скрипт "settime" вызывается только по требованию, если компьютер должен просыпаться по назначенному времени - потом непосредственно перед выключением. Это значит, "correcttime" должен установить, идет ли при времени RTC речь о нормальном времени или компьютер находится в прошлом.
Выписка из »correcttime«:
01 #!/bin/bash
02 if [ -r /etc/timediff ]; then
03 Timediff=`date -r /etc/timediff +%s`
04 Now=`date +%s`
05 if [ "${Timediff}" -gt "${Now}" ]; then
06 Diff=`cat /etc/timediff | head -n 1`
07 date -s "+${Diff} seconds" >/dev/null
08 hwclock -w --noadjfile --utc
09 exit 0
10 fi
11 fi
- В строке 3 призыв "date" определяет дату последнего изменения файла "/etc/timediff" в течение секунд с Epoch. Если эта дата изменения лежит в строке 5 в будущем, то системное время однозначно восстанавливалось в прошлое. Если дата изменения лежит, напротив, в прошлом, то системное время является актуальным поясным временем. В строках от 6 до 8, "correcttime" читает временную разницу между системным временем и поясным временем из файла "/etc/timediff" и добовляет её к времени системы, за счёт этого компьютер снова достигает поясного времени.
