Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 访问时自动唤醒NAS_Windows_Nas_Ubuntu Server_Dd Wrt - Fatal编程技术网

Windows 访问时自动唤醒NAS

Windows 访问时自动唤醒NAS,windows,nas,ubuntu-server,dd-wrt,Windows,Nas,Ubuntu Server,Dd Wrt,当用户访问NAS时,我试图让我的NAS服务器从S3睡眠状态唤醒。我想这样做是为了延长服务器的使用寿命,同时限制其功耗。我见过有人征求类似的建议,但我发现没有一个能提供可靠的解决方案,大多数线程都没有得到回答 因此,要快速详细说明我的问题: 在我的家里,我有一个定制的,从一台旧电脑,NAS服务器,运行Ubuntu服务器,主要存储媒体和文档。此服务器当前设置为在预定义的非活动期后休眠。目前,NAS可以通过WOL magic数据包脱离S3状态。我想实现的是,当用户从PC访问其中一个共享时,这个神奇的数

当用户访问NAS时,我试图让我的NAS服务器从S3睡眠状态唤醒。我想这样做是为了延长服务器的使用寿命,同时限制其功耗。我见过有人征求类似的建议,但我发现没有一个能提供可靠的解决方案,大多数线程都没有得到回答

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

在我的研究中,我遇到了许多文章,它们只是在定时循环中自动唤醒服务器,没有真正的智能。下面给出的文章似乎符合我的要求:

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


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

我从WD检查了我的NAS,我可以告诉您,他们使用内存驱动器用于/tmp,/var目录

因此,每个日志都写入内存,硬盘驱动器不必在线。希望这对你有点帮助


如果有人想访问硬盘,系统将自动向上旋转硬盘。所以你会得到你想要的,除了系统总是在线。

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

\proc\net\arp
该文件中存储了所有当前租用IP地址和相应mac地址的记录。因此,我的脚本将存储在该文件中的mac地址与家庭网络上PC的预定义mac地址列表进行了比较。该列表仅包括我希望能够访问NAS服务器的PC。如果发现其中一台PC具有活动租约,路由器将发送lan唤醒魔术包。然后唤醒服务器。在那一点上,我认为我已经实现了我的目标,因为服务器与网络上的任何一台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
DISCLAMER:代码按原样提供。我知道这既不美观,也不是最好的解决办法。但它对我有用,这就是我真正需要的


希望有人觉得这个有用

我对@Rabid的脚本做了一些修改,添加了对多台PC的支持

它还检查在ARP中找到的条目是否将其标志设置为0x2(=活动),因为对我来说,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 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):

在NAS上(使用OpenSSH):


我想你可能有点误解,我的NAS不是一个预先打包的单机版(如seagate和WD等提供的)。相反,这是我的一台旧电脑,我把它改造成了NAS。我在提到你试图节约能源时写下了这个答案。如果你的硬盘处于离线状态,你将节省能源。公平地说,我已经将Ubuntu配置为在处于活动状态时关闭硬盘。但是,我想关闭整个机器的电源,而不仅仅是驱动器。在我自己的盒子上,当我尝试旋转驱动器时,我遇到了一个问题,即它们会在几秒钟后醒来,因为它们会将一些无用的东西写入头驱动器。如果那台机器有足够的内存,内存驱动器的解决方案将对我有所帮助。如果你不喜欢我的答案,我可以删除:-)不,没关系,你的答案可能会帮助其他人。我的驱动器降速良好,因为它们不是主驱动器。我想你会很难用可引导分区来降低驱动器的速度。你在ServerFault上的运气可能会更好。中的解决方案可能会有所帮助,尽管这可能涉及通过始终在线的WRT54G访问共享数据,这可能是一个瓶颈。是否可以查看
\proc\net\arp
文件的格式?这看起来不可思议,并且对于任何访问samba的计算机来说都可以正常工作,因为这不依赖于操作系统。我的HTPC实际上运行的是Windows 8.1,因为它同时提供主机和播放媒体。我会尝试找到一个更好的路由器,支持dd wrt,并尝试一下。是的,它应该可以,只要你在HTPC(或其他PC)上的NIC能够解释WOL魔术包,它应该可以工作。看看你可能会惊喜地发现你的路由器是支持的。
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 
# 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