配置了一台自己的小服务器
如题,自己的电子笔记都是用reStructuredText来写的,数量庞大,所以一年多以前就开始用subversion来管理了。后来自己也有些程序希望用svn管理,但是又不方便用公司的。考虑良久之后自己配置了这个小服务器。
期间考虑过多种方案,如下:
1、belkin-7231-4P+U盘:无线路由上安装openwrt,然后安装subversion。
优点:省电,可以长时间运行
缺点:只有一个USB接口,存储容量较小,且没有备份机制。安装复杂,成本仅仅比EPIA服务器的方案低一点。
2、mss+硬盘:迈拓的网络硬盘盒,有些爱好者在上面研究的,可以自己把原来的firmware改成openwrt。
优点:省电,不过不如7231的省电,使用台式机硬盘存储容量大
缺点:成本已经高于EPIA的方案了,改装openwrt需要自己焊接串口线,openwrt对mss的支持是Untested状态,稳定性值得怀疑。FlashRom只有2MB,太小了
3、EPIA方案:VIA EPIA系列全集成主板+内存+硬盘+机箱。
优点:x86平台,支持的软件多,安装方便,接口丰富
缺点:耗电量很大,50-70w的样子,已经不太适合全天开机了
当然,最后我选了EPIA的方案。其中各个配件如下:
主板:EPIA M9000,处理器C3 933MHz、DDR266内存插槽、集成显卡、2个IDE插槽、软驱插槽、集成声卡、集成网卡、PS2键盘鼠标接口、并行口、1个串行口、USB2.0x4前后各2个。RCA接口,S-Video接口,3个音频口。板载2个1394接口,FIR接口、CIR连接器、网络唤醒……。尺寸是17x17cm的Mini-ITX规格。零售价280。
内存:现代512MB DDR400,128元。
机箱:大水牛NC机箱,黑色,内置50w电源(峰值150w)。实测同时挂接IDE光驱和硬盘时运行稳定。售价210。
如上的3件东西由taobao的商家负责组装测试OK以后再发货给我,含邮费共600元。机器到了以后我装上了大学时剩下的120GB台式机硬盘。不过很可惜,大水牛的NC机箱装上那个主板以后就没有空间安装台式机硬盘了,只能装笔记本硬盘,所以我把IDE线引出机箱安装的硬盘。如果比较注重美观的可以另外去买笔记本硬盘。
操作系统是FreeBSD 7.0,最近刚刚开始学,因为有linux的基础,学起来轻车熟路。用了两天的时间就搞定了所需的所有软件。
另外就是省电的问题。这个主机虽然使用了嵌入式主板、CPU,不过耗电量还是不可忽视。所以这里就有个需要时才开机的问题了。多年前有一项技术叫Wake On Lan,使用网络可以唤醒一台计算机的开机。我拿到机器的第二天晚上第一次测试就通过了,甚至我都没有在BIOS中设置就是默认支持了。
随后给家里的路由做了ssh和svn的端口映射,路由上的tomato-1.17是直接支持WOL的,测试也通过。
现在每天早晨起来懒懒的上班,工作时远程连接到家里的7231-4p无线路由,用WOL给小服务器开机,等待一分钟以后可以用ssh登录了。随后subversion之类的都是默认启动。如果要去开会或者长时间不用,则可以通过ssh发送一条”halt -p”过去(确保apm功能打开),然后机器就关闭了。
嗯,和谐多了。
下面给出使用Python来发送WOL开机数据包的脚本,网上抄来的。缩进所需的空格全部替换成”^”了,因为我的wordpress还不会修改css。
# Wake-On-LAN
#
# Copyright (C) 2002 by Micro Systems Marc Balmer
# Written by Marc Balmer, marc@msys.ch, http://www.msys.ch/
# This code is free software under the GPL
import struct, socket
def WakeOnLan(ethernet_address):
^^^^# Construct a six-byte hardware address
^^^^addr_byte = ethernet_address.split(‘:’)
^^^^hw_addr = struct.pack(‘BBBBBB’, int(addr_byte[0], 16),
^^^^^^^^int(addr_byte[1], 16),
^^^^^^^^int(addr_byte[2], 16),
^^^^^^^^int(addr_byte[3], 16),
^^^^^^^^int(addr_byte[4], 16),
^^^^^^^^int(addr_byte[5], 16))
^^^^# Build the Wake-On-LAN “Magic Packet”…
^^^^msg=’\xff’*6 + hw_addr*16
^^^^# …and send it to the broadcast address using UDP
^^^^s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
^^^^s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
^^^^s.sendto(msg, (‘<broadcast>’, 9))
^^^^s.close()
# Example use
mac=’00:00:00:00:00:00′ #改成你需要WOL开机的MAC地址
WakeOnLan(mac)