2012-06-06 3 views
4

Я пытаюсь запустить мой NAS-сервер из состояния ожидания S3, когда пользователь обращается к NAS. Я хочу сделать это, чтобы увеличить долговечность сервера, а также ограничить его использование энергии. Я видел, как люди просили подобные советы, но ни один из них не нашел надежного решения, большинство потоков только что остались без ответа.Автоматическое пробуждение NAS при доступе

Чтобы просто подробно описать свою проблему быстро: У меня дома у меня есть пользовательский встроенный сервер со старым ПК NAS, работающий на сервере Ubuntu, который в основном хранит носители и документы. Этот сервер в настоящий момент настроен на спящий режим после предопределенного неактивного периода. В настоящее время NAS можно вывести из состояния S3 с помощью волшебного пакета WOL. Я хотел бы достичь того, что этот волшебный пакет автоматически отправляется на сервер, когда пользователь обращается к одной из своих акций со своего ПК. Пользователи в основном работают с Windows 7. Я не уверен, что это полностью распространено, но у меня есть Linksys WRT54G, работающий с DD-WRT как мой домашний маршрутизатор/DHCP/DNS.

Во время моего исследования я столкнулся со многими статьями, которые просто автоматически разбудили сервер по таймеру, без реального интеллекта. В статье приведены ниже, кажется, делать то, что я хочу:

http://wdtvhd.com/index.php?showtopic=7908

Сценарий дается, который пытается решить эту проблему с помощью DD-WRT маршрутизатор для отправки пакетов пробуждения по локальной сети, когда запрос сделал. Это похоже на хороший способ сделать это, однако я не смог заставить скрипт, указанный в ссылке, работать правильно.

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

+0

Вы можете повезти на ServerFault. Решение в http://serverfault.com/questions/389286/automatic-wake-on-lan-in-linux-when-accessing-remote-filesystem может помочь, хотя это будет связано с доступом к данным об общем доступе через постоянно действующий WRT54G, который может быть узким местом. – George

ответ

3

Просто подумал, что опубликую свое возможное решение вышеупомянутой проблемы. Чтобы решить эту проблему, я написал собственный скрипт, который запускается на моем dd-wrt-маршрутизаторе на заданном задании cron. При выполнении этого сценария он доступ к файлу

\proc\net\arp 

В в том, что файл хранится запись всех в настоящее время арендованного IP-адреса и соответствующие MAC-адреса. Таким образом, мой скрипт сравнивал адреса mac, хранящиеся в этом файле, с предопределенным списком MAC-адресов компьютеров в моей домашней сети. Список состоит только из ПК, с которыми я хотел бы иметь доступ к серверу NAS. Если один из компьютеров обнаружил, что у него активная аренда, маршрутизатор затем отправляет волшебный пакет wake-on-lan. Который затем пробуждает сервер. В этот момент я думал, что достиг своей цели, поскольку сервер включается с любого из компьютеров в сети, и ожидание не слишком велико. Однако после этого я обнаружил, что мой тайм-сон для сервера будет запускаться каждые 30 минут или около того, и спать сервер, чтобы снова разбудить пару секунд спустя.

Итак, чтобы решить эту проблему, я просто добавил еще одно условие к моему условному утверждению, которое будет спарить сервер, если ни один из требуемых ПК не будет иметь активную аренду. Для этого я использовал SSH и встроенную функцию dropbear ssh DD-WRT, чтобы спать с сервера. Ниже приведен сценарий

#!/bin/ash 

NAS="MA:CA:DD:RE:SS:00" 

PC="MA:CA:DD:RE:SS:00" 

varP='grep -o $PC /proc/net/arp' 

while true 
do 
    echo 'Entered Loop' 
    if ping -c 1 IPADDRESSOFNAS > /dev/null; then 
      echo 'NAS is Already ON' 

    if [[ "$varP" != "MA:CA:DD:RE:SS:00" ]]; then 
        echo 'All Hosts Offline' 
        echo IPADDRESSOFNAS ssh-rsa NASPUPLICKEY 
        #HOME=/temp/root/ 
        DROPBEAR_PASSWORD='NASPASSWORD' ssh [email protected] pm-suspend & 
      fi 
      exit 
    fi 

    if [[ "$varP" == "MA:CA:DD:RE:SS:00" ]]; then 
      echo 'waking from lan' 
      /usr/sbin/wol -i BROADCASTADDRESSOFNETORK -p 9 MA:CA:DD:RE:SS:00 
      /usr/sbin/wol -i BROADCASTADDRESSOFNETORK -p 9 MA:CA:DD:RE:SS:00 
      exit 
    fi 
    exit 
done 

DISCLAMER: Код предоставляется как есть.Я знаю, что это не очень красивое и лучшее решение. Но это работает для меня, и это все, что мне действительно нужно.

Надеюсь, что кто-то посчитает это полезным!

+0

Можно ли увидеть формат вашего файла '\ proc \ net \ arp'? – Colin747

+0

Это выглядит невероятно и должно отлично работать для WOL любого компьютера, который получает доступ к самбе, поскольку это не зависит от ОС. Мой HTPC фактически запускает Windows 8.1, поскольку он служит как для хостинга, так и для воспроизведения медиа. Я попытаюсь получить доступ к лучшему маршрутизатору, который поддерживает dd-wrt, и попробует это. – dnLL

+0

Да, это должно быть так, если ваш сетевой адаптер на HTPC (или других ПК) способен интерпретировать WOL Magic пакеты, он должен работать. Проверьте [link] (http://www.dd-wrt.com/site/support/router-database), вы можете быть приятно удивлены, что ваш маршрутизатор поддерживается. – Rabid

0

Я основал мой NAS от WD, и могу сказать, что они используют диски памяти для/tmp,/var каталогов.

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

Если кто-то хочет получить доступ к жесткому диску, система автоматически поднимет ваш жесткий диск. Таким образом, вы получите то, что хотите, за исключением того, что система всегда в сети.

+0

Я думаю, что вы, возможно, неправильно понимаете, мой NAS не является предварительно упакованным автономным (например, доступным от Seagate и WD и т. Д.). Скорее всего, это один из моих старых ПК, который я переназначил в NAS. – Rabid

+0

Я написал этот ответ в упоминании, что вы пытаетесь сэкономить энергию. Если yor harddrives находятся в автономном режиме, вы сэкономите энергию. – rekire

+0

Справедливо, я уже настроил Ubuntu, чтобы вращать диски, когда они активны. Тем не менее, я хотел бы отключить всю машину, а не только диски. – Rabid

0

Я внес некоторые изменения в скрипт @Rabid, чтобы добавить поддержку для нескольких ПК.

Он также проверяет, имеют ли записи, найденные в ARP, свой флаг, равный 0x2 (= ~ active), так как для меня записи ARP останутся в списке слишком долго после выхода компьютера из сети.

#!/bin/bash 
# This script is made to be run on an DD-/Open-WRT device to automatically wake a NAS 
# server if client PCs are online 

# Settings 

# Addresses of NAS that gets woken/put to sleep 
MACofNAS="MA:CA:DD:RE:SS:00" 
IPofNAS="192.168.2.1" 
BroadcastAddress="192.168.2.255" 
WOLPort=9 

# Location of SSH Private Key on WRT (if used for login) 
SSHPrivateKeyFile=~/.ssh/id_rsa 

# MAC addresses of PCs of which the online status will be checked 
PCs=(
    "MA:CA:DD:RE:SS:00" # PC1 
    "MA:CA:DD:RE:SS:00" # PC2 
    "MA:CA:DD:RE:SS:00" # PC3 
    "MA:CA:DD:RE:SS:00" # PC4 
) 



# Determine if any PCs are on 
SomePCisON=false 
for index in ${!PCs[@]}; do 
    # Try to detect PC's MAC address in ARP 

    ## Look for all entries in ARP ... 
    # PCFound=$(grep -o "${PCs[index]}" /proc/net/arp) 

    # ... OR look only for entries with flag set to 0x2 (~ active) 
    PCFound=$(grep "0x2" /proc/net/arp | grep -o "${PCs[index]}") 

    # If MAC address is found, the PC must be ON 
    if [[ ${PCFound} ]]; then 
     echo "PC ${PCs[index]} is ON" 
     SomePCisON=true 
    else 
     echo "PC ${PCs[index]} is OFF" 
    fi 
done 

if [[ "$SomePCisON" == true ]]; then 
    echo "Some PCs are turned ON" 
else 
    echo "All PCs are turned OFF" 
fi 

# Check if NAS is ON 
if ping -c 1 $IPofNAS > /dev/null; then 
    echo 'NAS is ON' 
    NASisON=true 
else 
    echo 'NAS is OFF' 
    NASisON=false 
fi 

# If NAS is ON, but all PCs are OFF, put NAS to Sleep 
if [[ "$NASisON" == true ]]; then 

    # If no PCs are ON, put NAS to sleep 
    if [[ "$SomePCisON" == false ]]; then 
      echo 'All Hosts Offline' 
      echo 'Suspending NAS' 

      # Log in with password (as in @Rabid's script, didn't work for me) ... 
      DROPBEAR_PASSWORD='NASPASSWORD' ssh [email protected] pm-suspend & 

      ## ... OR log in with authentication key 
      # ssh -i $SSHPrivateKeyFile [email protected]$IPADDRESSOFNAS pm-suspend & 
    fi 

# If NAS is OFF and any PCs are ON, wake NAS 
elif [[ "$SomePCisON" == true ]]; then 

    # Use wol package on DD-WRT ... 
    echo 'Waking NAS from LAN, Broadcasting to '$BroadcastAddress\ 
     'on port '$WOLPort' for '$MACofNAS 
    /usr/sbin/wol -i $BroadcastAddress -p $WOLPort $MACofNAS 
    /usr/sbin/wol -i $BroadcastAddress -p $WOLPort $MACofNAS; 

    ## ... OR use etherwake package on Open-WRT 
    ## (Install with: opkg update && opkg install etherwake) 
    # echo 'Waking NAS from LAN, '$MACofNAS 
    # /usr/bin/etherwake $MACofNAS 
    # /usr/bin/etherwake $MACofNAS 
fi 

Чтобы войти с помощью ключа аутентификации, сделать пару ключей и поместить открытый ключ в NAS: ~/.ssh/authorized_keys:

На WRT (с Dropbear):

mkdir -p ~/.ssh 

# Generate a private key and store it in ~/.ssh/id_rsa 
dropbearkey -t rsa -f ~/.ssh/id_rsa 

# Store the public key in ~/.ssh/id_rsa.pub 
dropbearkey -t rsa -f ~/.ssh/id_rsa -y | grep ssh > ~/.ssh/id_rsa.pub 

# Copy id_rsa.pub from WRT:~/.ssh/ to NAS:~/.ssh/ 
scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh/OpenWRT.pub 

на NAS (с OpenSSH):

# Back up the authorized_keys 
cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys_Backup 

# Add the new public key to authorized_keys 
cat ~/.ssh/OpenWRT.pub >> ~/.ssh/authorized_keys 
Смежные вопросы