2012-06-06 3 views
4

사용자가 NAS에 액세스 할 때 NAS 서버가 S3 슬립 상태에서 깨어나려고합니다. 서버의 수명을 늘리고 전원 사용을 제한하기 위해이 작업을 수행하려고합니다. 비슷한 조언을 구하는 사람들을 보았지만 강력한 솔루션을 제공 한 사람은 없었습니다. 대부분의 스레드는 막 끝나지 않았습니다.액세스시 자동으로 웨이크 WD

그래서 내 문제를 빨리 자세히 설명해 드리겠습니다. 우리집에는 오래된 PC, NAS 서버, 주로 미디어와 문서를 저장하는 우분투 서버가 설치된 사용자 정의가 있습니다. 이 서버는 현재 미리 정의 된 비활성 기간 후에 절전 모드로 설정됩니다. 현재 NAS는 WOL 매직 패킷으로 S3 상태를 벗어날 수 있습니다. 내가 성취하고자하는 것은 사용자가 자신의 PC에서 공유 폴더 중 하나에 액세스 할 때이 마법 패킷이 자동으로 서버로 전송된다는 것입니다. 사용자가 주로 윈도우 7을 실행하고 있습니다. 이것이 전적으로 널리 퍼지지는 모르겠지만, 필자의 가정용 라우터/DHCP/DNS로 DD-WRT를 실행하는 Linksys WRT54G가 있습니다.

내가 연구하는 동안 시간이 걸린 루프에서 서버를 자동으로 깨우 쳤던 많은 기사가 나왔습니다. 진정한 인텔리전스가 아닙니다. 아래 기사는 내가 원하는 것을 할 것 같다 :

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 라우터에서 실행되는 사용자 정의 스크립트를 작성했습니다. 이 스크립트를 실행하면이 해당 파일의 모든 현재 임대 IP 주소와 해당 MAC 주소의 기록을 저장에 내 파일

\proc\net\arp 

에 액세스 할 수 있습니다. 따라서 내 스크립트는 해당 파일에 저장된 MAC 주소를 홈 네트워크에있는 PC의 미리 정의 된 MAC 주소 목록과 비교했습니다. 목록은 NAS 서버에 액세스 할 수있게하려는 PC만으로 구성됩니다. PC 중 하나에 활성 임대가있는 것으로 확인되면 라우터는 wake-on-lan 매직 패킷을 전송합니다. 그러면 서버를 깨 웁니다. 그 시점에서 나는 서버가 네트워크상의 PC 중 하나를 사용하여 스위치를 켜고 기다림이 너무 길지 않았기 때문에 내가 목표를 달성했다고 생각했습니다. 그러나이 작업을 완료 한 후 서버에 대한 시간 초과 대기가 매 30 분마다 시작되고 서버를 잠자면 몇 초 후에 다시 깨우는 것으로 나타났습니다.

이 문제를 해결하기 위해 필자는 조건부 명령문에 필요한 조건을 추가하여 필요한 PC에 활성리스가없는 경우 서버를 잠자 게했습니다. 이렇게하기 위해 나는 서버를 잠자기하기 위해 DDH-WRT의 SSH와 내장 된 dropbear SSH 기능을 사용했다. 아래는 스크립트입니다

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

OS에 의존하지 않으므로 Samba에 액세스하는 모든 컴퓨터가 믿을 수 없으며 WOL에서 잘 작동해야합니다. 내 HTPC는 실제로 호스팅 및 재생 미디어를 모두 제공하므로 Windows 8.1을 실행합니다. 나는 dd-wrt를 지원하는 더 나은 라우터에 손을 넣으려고 노력할 것이고 이것을 시도해 볼 것이다. – dnLL

+0

예, HTPC (또는 다른 PC)의 NIC가 WOL Magic 패킷을 해석 할 수 있으면 작동해야합니다. [link] (http://www.dd-wrt.com/site/support/router-database)에서 라우터가 지원된다는 것에 놀랄 것입니다. – Rabid

0

WD에서 NAS를 영감을 받았으며/tmp,/var 디렉토리에 메모리 드라이브를 사용하고 있다고 말할 수 있습니다.

그래서 모든 로그가 메모리에 쓰여지고 하드 드라이브는 온라인 상태가 아닙니다. 희망이 당신을 조금 도와줍니다.

누군가 하드 드라이브에 액세스하려는 경우 시스템이 자동으로 하드 드라이브를 업 스핀합니다. 시스템이 항상 온라인 상태에 있다는 것을 제외하면 원하는 것을 얻을 수 있습니다.

+0

나는 약간의 오해가있을 수 있다고 생각합니다. NAS는 미리 패키지 된 독립형이 아닙니다 (예 : seagate 및 WD 등에서 제공되는 것). 오히려 그것이 NAS로 다시 태어난 나의 오래된 PC 중 하나입니다. – Rabid

+0

나는 에너지 절약을 위해이 대답을 썼다. yor 하드 드라이브가 오프라인이면 에너지를 절약 할 수 있습니다. – rekire

+0

공정하게도, 이미 활성화되어있을 때 드라이브를 회전시키기 위해 우분투를 구성했습니다. 그러나, 나는 단지 드라이브가 아니라 전체 기계의 전원을 끄고 싶습니다. – Rabid

0

여러 대의 PC에 대한 지원을 추가하기 위해 @Rabid로 스크립트를 약간 변경했습니다.

또한 ARP 항목이 0x2 (= ~ active)로 설정되어 있는지 확인합니다. ARP 항목이 PC가 오프라인 상태로 된 후 너무 오랫동안 나열됩니다.

#!/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의 공개 키 배치하려면 : ~/스푸핑/authorized_keys에 : (Dropbreak 내부에) WRT에

:

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 
을 (OpenSSH를 포함) NAS에

:

# 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 
관련 문제