NAP6官方旗舰店
搜索
发新帖
午饭无线 推广广告R7800 完胜 华硕路由器NETGEAR Vs ASUS T-Mobile定制版NETGEAR团购
开启左侧

给路由器的USB硬盘固定设备名并自动休眠功能

[复制链接]
1310 0

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
AirPort Extreme可以外接USB硬盘提供文件服务,但是和它的路由功能一样,都不够满足我的需求。而作为穿墙路由器的华硕小机器有4个USB口,我还用它兼作文件服务器使用,提供Samba和NFS。

但是这里遇到两个小问题。

第一个问题,USB硬盘是可以热拔插,这样由于载入顺序的问题,每个硬盘设备名称可能会变化。例如这个机器自带一个读卡器,在没有外挂USB硬盘时启动后候设备名为/dev/sdb。之后插入USB硬盘,USB硬盘的设备名为/dev/sdc。但是如果挂着USB硬盘启动,这两个设备的设备名就正好反过来了。我希望是固定的设备名。

第二个问题,USB硬盘长时间不访问的时候不会自动停下来,这样既不省电也不利延长硬盘的寿命。我希望在不用的时候它可以休眠。

设备名的问题可以用udev的rules解决。我加了一个udev配置文件/etc/udev/rules.d/99-external-storages.rules。
  1. KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0158", ATTRS{serial}=="20071114173400000", SYMLINK+="cardreader%n"
  2. KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1bcf", ATTRS{idProduct}=="0c31", ATTRS{serial}=="20090717090A", SYMLINK+="storage/neso%n"
复制代码

这样给内置的读卡器添加了一个设备名的符号链接/dev/cardreader;给我的NESO 1T硬盘添加了设备名符号链接/dev/storage/neso。用固定名称访问设备的问题就解决了。

第二个问题稍微复杂些,一直没找到方便的方法。laptop-mode-tools也没能满足我的要求。一番搜索后找到sdparm可以用来控制USB硬盘,还有一段perl脚本用来调度sdparm。这样就可以满足我的需求了。脚本的原始出外我给忘了,这里我稍微修改了一点,增加对设备名符号链接的支持。
  1. #!/usr/bin/perl -w
  2. use File::Basename;
  3. use Cwd 'abs_path';

  4. $statfile = "/proc/diskstats";
  5. die "$0: Cannot read $statfile\n" unless -r $statfile;

  6. $| = 1;
  7. ($disk, $interval) = (@ARGV);

  8. if (-l $disk) {
  9. $original_disk = $disk;
  10. while (-l $disk) {
  11. $disk = readlink $disk;
  12. }
  13. $disk = dirname($original_disk) . "/" . $disk;
  14. $disk = abs_path($disk);
  15. }

  16. $disk =~ s,/dev/,,;
  17. print "$0: disk: $disk, interval: $interval\n";

  18. $halted_data = $last_seen = '';
  19. while (1) {
  20. open(STATUS, $statfile);
  21. ($_) = grep(/^\s+\d+\s+\d+\s+$disk\s/o, <STATUS>);
  22. close STATUS;

  23. if ($last_seen eq $_ && $halted_data ne $_) {
  24. print "Spinning down: $disk\n";
  25. system "sync";
  26. system "sdparm", "--command=stop", "/dev/$disk";
  27. $halted_data = $_;
  28. }
  29. $last_seen = $_;
  30. sleep $interval;
  31. }
复制代码

最后在启动脚本里加上
  1. ebegin " - Spindown USB HD"
  2. nohup /usr/local/sbin/spindown-usbhd /dev/storage/neso 1200 >> /var/log/spindown-usbhd.log 2>&1 &
  3. eend $?
复制代码


好了,20分钟这块硬盘没有读写之后自动休眠。




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩推荐

热点动态

精彩图文

快速回复 返回顶部 返回列表