我正在尝试让我的NAS服务器在用户访问NAS时从S3睡眠状态中唤醒。我想这样做是为了增加服务器的寿命,并限制其电力使用。我见过人们寻求类似的建议,但我发现没有一个人能提供一个健壮的解决方案,大多数帖子都没有得到回应。
所以简单地说一下我的问题:在我家,我有一台定制的电脑,NAS服务器,运行Ubuntu服务器,主要存储媒体和文档。此服务器当前设置为在预定义的非活动时间段后休眠。目前,可以使用WOL魔术包将NAS带出S3状态。我想要实现的是,当用户从他们的PC访问其中一个共享时,这个神奇的数据包会自动发送到服务器。用户主要运行的是windows7,我不确定这是否完全流行,但我有一个运行DD-WRT的Linksys WRT54G作为我的家庭路由器/DHCP/DNS。
在我的研究过程中,我遇到了许多文章,这些文章只是在定时循环中自动唤醒服务器,没有真正的智能。下面给出的文章似乎做了我想做的事情:
http://wdtvhd.com/index.php?showtopic=7908
给出了一个脚本,该脚本试图通过在进行查询时使用DD-WRT路由器发送lan唤醒分组来解决此问题。这似乎是一种很好的方法,但是我无法获得链接中给出的脚本来正确操作。
我认为这涵盖了我的问题的大部分方面。任何帮助都将不胜感激。
发布于 2012-08-17 00:34:51
我只是想发布我对上面提到的问题的最终解决方案。为了解决这个问题,我编写了一个自定义脚本,该脚本在我的dd-wrt路由器上的定时cron作业上运行。当此脚本运行时,它访问该文件
\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
doneDISCLAMER:代码按原样提供。我知道这并不好,也不是最好的解决方案。但它对我来说很有效,这就是我真正需要的。
希望有人觉得这篇文章有用!
发布于 2012-06-06 17:54:37
我从WD那里得到了我的网络连接存储,我可以告诉你,他们在/tmp,/var目录中使用内存驱动器。
因此,每个写入内存的日志都是如此,并且硬盘驱动器不必在线。希望这能对你有所帮助。
如果有人想访问硬盘,系统会自动启动硬盘。因此,除了系统始终在线之外,您将获得您想要的东西。
发布于 2017-10-31 21:06:08
我通过@Rabid对脚本进行了一些修改,添加了对多台PC的支持。
它还检查在ARP中找到的条目是否将其标志设置为0x2 ( =~ active ),因为对我来说,在PC脱机后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_ key:
在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 在网络连接存储上(使用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_keyshttps://stackoverflow.com/questions/10911825
复制相似问题