访问时自动唤醒 NAS



我正在尝试让我的 NAS 服务器在用户访问 NAS 时从 S3 睡眠状态唤醒。我想这样做是为了延长服务器的使用寿命,并限制其电源使用。我见过有人寻求类似的建议,但我发现没有一个提供强大的解决方案,大多数线程都没有回答。

因此,快速详细说明我的问题:在我的家里,我有一个定制的,从一台旧的PC,NAS服务器,运行Ubuntu服务器,主要存储媒体和文档。此服务器当前设置为在预定义的非活动时段后休眠。目前,NAS 可以使用 WOL 魔术数据包从 S3 状态中取出。我想实现的是,当用户从其PC访问其中一个共享时,此魔术数据包会自动发送到服务器。 用户主要运行Windows 7。我不确定这是否完全流行,但我有一个运行DD-WRT的Linksys WRT54G作为我的家庭路由器/DHCP/DNS。

在我的研究过程中,我遇到了许多文章,这些文章只是在定时循环中自动唤醒服务器,没有真正的智能。下面给出的文章似乎做了我想要的:

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

给出了一个脚本,该脚本尝试通过在进行查询时使用 DD-WRT 路由器发送 lan 唤醒数据包来解决此问题。这似乎是一个很好的方法,但是我无法使链接中给出的脚本正常运行。

我认为这涵盖了我问题的大部分方面。任何帮助将不胜感激。

只是想我会发布上述问题的最终解决方案。为了解决这个问题,我编写了一个自定义脚本,该脚本在我的 dd-wrt 路由器上以定时 cron 作业运行。当此脚本运行时,它访问文件

procnetarp

该文件中存储了所有当前租用的 IP 地址和相应 mac 地址的记录。因此,我的脚本将存储在该文件中的 mac 地址与家庭网络上 PC 的预定义 mac 地址列表进行了比较。该列表仅包含我希望能够访问 NAS 服务器的 PC。如果发现其中一台 PC 具有活动租约,则路由器将发送局域网唤醒幻数据包。然后唤醒服务器。那时,我认为我已经实现了我的目标,因为服务器与网络上的任何一台PC一起打开,等待的时间不会太长。但是,完成此操作后,我发现服务器的定时睡眠将每 30 分钟左右启动一次,并且服务器处于睡眠状态,几秒钟后才再次被唤醒。

因此,为了解决这个问题,我只是在我的条件语句中添加了另一个条件,如果所需的 PC 都没有活动租约,服务器将休眠。为此,我使用了SSH和DD-WRT内置的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 root@IPADDRESSOFNAS 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

声明者:代码按原样提供。我知道这并不漂亮,也不是最好的解决方案。但它对我有用,这就是我真正需要的。

希望有人觉得这有用!

我从WD安装了我的NAS,我可以告诉你,他们使用内存驱动器作为/tmp,/var目录。

写入内存的每个日志也是如此,硬盘驱动器不必联机。希望对您有所帮助。

如果有人想访问硬盘驱动器,系统将自动升级您的硬盘驱动器。因此,除了系统始终在线之外,您将获得所需的内容。

我通过@Rabid对脚本进行了一些更改,以添加对多台PC的支持。

它还检查在 ARP 中找到的条目是否将其标志设置为 0x2 ( =~ 活动 ),因为对我来说,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 root@IPADDRESSOFNAS pm-suspend &
            ## ... OR log in with authentication key
            # ssh -i $SSHPrivateKeyFile root@$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 root@nas:~/.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

相关内容

  • 没有找到相关文章

最新更新