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
  1. В первом шаге нужно активировать в BIOS функцию Wakeup и внести значения: день "31" , час "23" и "59" минут&секунд как максимальные величины.
  2. В следующем шаге вносятся промежуточные величены: день "11", час "12", минут "13" и секунд "14".
  3. Затем вносятся минимальные величины: день "01" , час, минута и секунда "00".
  4. В последнем шаге остаются последние величины и деактивировать функцию Wakeup в BIOS.

Скрипт вызывается после каждой перезагрузки компьютера между отдельными шагами. В конце процедуры автоматически создаётся файл конфигурации для до сих пор неизвестной мат. платы.

Принципиально создаются 2 файла в каталогах /root/guess-directisa и /root/guess.

  1. /root/guess-directisa для метода посредством непосредственного доступа к I/O,
  2. /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.

  1. Короткий тест

Для простоты проведём тест к полному часу, например 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
  1. Короткий тест

В случае самостаятельного старта в 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
  1. В строке 3 призыв "date" определяет дату последнего изменения файла "/etc/timediff" в течение секунд с Epoch. Если эта дата изменения лежит в строке 5 в будущем, то системное время однозначно восстанавливалось в прошлое. Если дата изменения лежит, напротив, в прошлом, то системное время является актуальным поясным временем. В строках от 6 до 8, "correcttime" читает временную разницу между системным временем и поясным временем из файла "/etc/timediff" и добовляет её к времени системы, за счёт этого компьютер снова достигает поясного времени.

Ссылки

Личные инструменты
На других языках