FreeNas 0.7 上架设Mac OSX Time Machine 时光机

Mac平台下的Time Machine时光机让一贯使用windows的我表示十分向往。只要有移动硬盘或是独立分区即可增量备份系统数据,即使更换新的电脑或重装系统也能快速恢复自己习惯的使用环境。相比同一个硬盘分区的损坏风险或移动硬盘连接不便(从稳定性上说移动硬盘本身就是不那么靠谱的设备,它的使用环境决定了它的损坏概率是很大的),通过网络备份到NAS服务器无疑是最可靠且不影响正常使用的方法(你不会经常想到在家用电脑的时候也接个硬盘备份吧,尤其是在只有2个usb口的mbp上)

要使用网络备份时光机,最简单直接的办法就是买Apple的Time capsule路由器,自带1T/2T硬盘,秉承苹果配件一贯的高价易用风格。廉价的方案就是在FreeNAS 0.7系统上自己DIY时光机服务。

首先开启AFP服务

添加共享

注意勾选
Automatic disk discovery – Enable automatic disk dicovery
Automatic disk discovery mode – Time Machine

接下来打开Time Machine程序

选择磁盘

接下来输入freenas上的用户名密码,确保该用户对你在第二步添加的共享目录有读写权限即可。

第一次备份可能花费大量时间,建议接上网线备份。以后的增量备份在无线网络的环境下也速度也可以接受。

快捷分享你的文件

我们都经历过这样的场景,手头有几张图片,一首mp3或者几篇文档需要与朋友共享。但是发email太慢,msn传输又不稳定,网盘又担心内容不符合XXX规定而和谐,况且国内多数网盘还需要下载安装XXX插件,安全方面让人担心。

现在有两种新的选择。

1.多平台用户 – Ge.tt
Ge.tt 界面非常简洁,硕大的一个图标 ‘Select files’ 点击即可浏览本地文件,确定即开始上传。无需注册,上传完毕后将得到一个类似 http://ge.tt/39cNlRv 的短链接,把这个链接直接在IM上告诉朋友,他就可以开始下载。非注册用户上传的文件只能在线保存30天,注册用户之后可以无限保存(内容不能违反美帝法律),并且可以看到每个文件的下载数据统计,历史上传记录等等,单个文件大小不限,总容量不限。

2. Mac用户有更简单的办法 – Droplr
Droplr Mac用户有福气,下载一个2兆多的文件,安装后桌面status bar上会多出一个droplr的图标。直接把想共享的内容往里一拖就搞定,甚至都无需打开浏览器。上传完成后会自动得到一个d.pr的短链接。该服务无需注册,只需要用你的twitter账户授权登录即可,同样可以看到历史上传文件,并且删除你不想保存的文件链接。官方网站有一个45秒的视频介绍,看完就明白了。顺便提一句,Droplr还有iPhone客户端。该服务为每个账户提供1GB免费空间,将来会开通付费扩容。

对于生活在千年盛世,和谐社会的用户来说,最难能可贵的是上面两项服务目前均还没有被反党反社会主义的境外敌对势力所利用,所以,你懂得,无需费力翻墙即可快捷分享。

2010年我所购买的软件和服务

2010即将过去,在此总结下自己在这一年里付费购买的软件以及服务。作为一个软件行业从业人员,尊重软件开发者的劳动价值,树立版权意识,以及对于网络付费应用(当然我指的不是收费成人网站)的接受程度应该是循序渐进的。仅以此文献给诸多读者,希望大家在读后能更多的支持开发者以得到更好的服务和高质量的软件作品。

1. Flickr 年费 $24.95 尽管自己是Google服务的忠实拥趸,但Picasa在国内的境遇实在是惨了点。被墙的后果就是当你想分享照片给不善于网络翻墙的亲友时会有诸多不便。付费成为Pro后即没有每个月100兆流量限制,并且可以看到自己照片被浏览的数据统计。胶州路的一场大火让自己对物理胶片的保存心存后怕,有条件的情况下还是尽量数字化后异地在线多点保存吧。对于墙外的用户来说Picasa有一大优势就是你所购买的容量是和Gmail共享,完全不浪费。

2. Last Pass 年费 $12 在密码保存领域尽管有1Password这样更好的选择,但能用Yubico key来做二次验证算是Last Pass最终吸引我购买的原因。每次验证的时候需要插入YubiKey并且按动那个绿色光圈实在是一件很Geek的举动。同时Last Pass也支持PC/Mac/Android/iOS 全平台。

3. Linode VPS 年费 $239 此blog发布的主机,也可以自己安装配置来提供各式各样的网络服务,你懂的。

4. MyWi 购买费 $19.99 iOS上用来做WIFI tethering的利器,有了它,WIFI Only的iPad出门也可以共享iPhone上的3G网络。不过和Android 2.2引入的Mobile AP功能不同,MyWi所创建的网络是基于Ad-hoc的。在截至Android 2.2.1的系统上还不支持接入Ad-hoc无线网,关于这个功能实现进度的读者可以参看 点此访问

5. 3G Unrestrictor 购买费 $3.99 Cydia Store上的又一好软件,用于“欺骗”程序将3G网络识别为WIFI。这样就可以在3G网络下使用Facetime(经测试联通网络下速度流畅),并且App Store也可以在3G网络下下载超过20兆的软件。

6. Office 2010 Home & Student Edition for PC / Office 2011 for Mac 用了多年的盗版Office,这次下定决心买了PC/MAC各一套正版。PC版虽然不带Outlook但已经完全不影响使用了,个人邮件重心都在Gmail上,不需要本地邮件客户端了。并且在你的邮件超过1G之后Outlook的搜索速度就变得让人难以忍受。

7. Mobile Me 年费 $99 Apple自家的云服务。你拥有的Mac设备越多,它就越有用。使用下来感觉me的邮件推送在iOS上速度比Gmail的更快。不过相比Android上的Gmail Push还是略逊一筹,不知道明年Apple在北卡的新数据中心投入使用后会不会有所改善。包含的iDisk,也是在Dropbox被墙之后分享文件给墙内用户的无奈之选。至于Gallery,手机上传不太稳定,不如Flickr好。Contacts同步和Android上用户体验无异。总体来说,如果你有超过两样Mac/iOS设备并且对价格不十分敏感的话,Mobile Me是个好选择。

8. Apple iTunes Store的诸多软件。今年已经充值了$75用户购买各种软件和游戏,唯一的不满就是不提供iPhone和iPad套装购买。同一款软件如果有HD版本的必须分开两次购买,如果Apple能提供bundle purchase加上稍许折扣,那会方便诸多同时拥有大小两件iOS的用户。

这篇文章的写作有感于 @tinyfool 的《盗版带给我们的是什么?》 自己和身边的人都是IT业内人士,如果连自己人都无视知识产权的重要性,那又如何指望别人来尊重自己的劳动成果?买得起iPhone/iPad的人不会买不起$0.99的软件,一套Office家庭与学生版可以用几年无须到处找激活码,即装即用。尊重他人就是尊重自己的劳动力。

搭建个人家用NAS网络存储服务器 [一]

随着家用宽带的不断提速和高清电影的普及外带单反的家庭占有率越来越搞,仅靠台式机里那几块硬盘越来越不够用了。
简单的计算了一下,家里的台式机上2T的容量(1T+640G+320G)已经接近于80%满,外接一个1.5T的移动硬盘也不是办法。同时还有笔记本上零散的一些数据文件(诸如写的文档),外加数码相机前后拍摄了几个G的照片(尽管我不是Teacher Chan),这些数据如何存放一直都是一个让人不安的话题。考虑再三,决定上一台个人用的NAS(Network attached storage)服务器。

在市场上考察了一番,先是考虑了成品的NAS服务器。比较看得中的有Netgear的ReadyNAS系列,2槽和4槽都比较感兴趣。首先排除的是2槽的机器,因为2槽不足以实现Raid5,并且最大4T的容量也略嫌小了一些。

4槽的机器里还是以Netgear为首选,这一系列产品正处于换代时期,老的NV+ RND4000 4槽服务器是用的600~800mhz的Risc CPU,性能不足以实现诸如Time capsule和DLNA服务,并且传输速率在千兆环境下也只有30余兆。新的ULTRA系列RNDU4000倒是都满足要求,样子也很不错,可惜国内还没有铺货,国外在eBay上是600美金。这东西要运回来可不容易,包装好足有16磅的重量。再考虑到最近海关的丧心病狂,从eBay搞一套回来成本起码在6000以上,太贵了。对于性能不太讲究的话倒是可以考虑上一代的NV+ RND4000,eBay上已经在清仓,全新的机器只要300刀,有路子机场托运一台回来的朋友可以考虑。

Netgear之后考虑了QNAP,但还是觉得价钱不太实惠。这里要提的一点是,对于WD或者Buffalo这样玩票性质的NAS最好不予考虑,他们提供那只能算是带网络服务的外置硬盘。对于数据安全性和扩展性是在是差了点。QNAP这个牌子有所考虑,但我对于它所提供的花里胡哨的Mysql/PHP/Apache服务不感兴趣,我是买NAS的又不是买共享web主机,先把数据安全性做好吧。

一番考量之后,4槽的机器正规渠道最低也要3700,用的还不是X86的CPU,千兆网下性能有瓶颈。一般大厂的机器都要在4500以上,于是萌发了自己动手组装的想法。

自己动手首先想到的是采用ATOM的CPU+主板一体的板子,功耗低而且价钱便宜。可惜INTEL为了保证低端C2D产品线的销量,对NM11芯片组采取了限制,一般都只提供了2个SATA口。即使有像技嘉这样大厂通过外接JMicro的芯片额外提供了2个SATA,也最多不过4口,并且第三方芯片提供的串口稳定性也有待商榷。只有超微Supermicro的一款X7SPA-H服务器用的ATOM主板提供了6个板载SATA(ICH9R)。可惜那块主板在国内的渠道又是个问题,工包也要1500左右,遂放弃。

在找主板的同时机箱倒是很方便的确定好了,联力的一款PC-Q08 ITX小机箱是个不错的选择,支持ITX规格主板,全尺寸ATX电源,并且还能支持6个横置的3.5寸硬盘。这简直就是为了做NAS而设计的。价钱的话淘宝差不多780的样子,不管太贵。当然,如果能接受全尺寸塔式机箱的话那三四百可以买很多提供6个3.5寸槽的机箱了。这里要提的是电源,如果你打算接4个或更多的硬盘,电源最好别考虑那种DC-ATX的小电源(无论内置外置混合置),多个硬盘在启动的时候瞬间电流很大,如果供电不足硬盘寿命大大缩短。我们弄NAS是为了数据存储,不是为了搭个硬盘棺材。全尺寸ATX电源可供选择的就太多了。这里我还是按照传统选了Antec ECO 400w。

机箱确定后,主板也只能买ITX的了。考虑INTEL H55芯片组 + i3 CPU。这样功耗比ATOM约高出30~50w,但性能强很多,万一以后不搞nas了还能做个播放器或压片机之类的。第一考虑的目标还是技嘉,但它只提供4个SATA,有点浪费机箱。最后选择了索泰H55U3,提供6个SATA,还有USB3.0口(极品,将来接外置硬盘拷贝数据太方便了)和WIFI(这个非必需),机器背板自带一个eSata口。我只能说这板子简直就是为了做NAS而设计的,6个串口和机箱配合完美。这块主板也是全固态电容,做工也还可以。WIFI是通过主板上的mini PCIE接口提供的,可以拆卸,将来换个mini PCIE的固态硬盘也不是没可能。同时主板也提供了板载千兆网卡,DVI/HDMI,接口该有的都有了。

CPU没啥好挑的,就INTEL i3 530,双核四线程,做NAS足够了。内存2G也够了(注意,上ZFS的话内存2G是有必要的)硬盘暂时就先上了一块WD的20EARS绿盘,这块硬盘用的4k sector和AFD (Advanced Format Driver)后来给我带来了不少麻烦,下文会提到。

综上所述,最后的配置如下
索泰 H55U3
INTEL i3 530
联力 PC-Q08
OCZ DDR3 1333 2G
WD 20EARS 2T
Antec Eco 400w
不带硬盘的价钱差不多是2900,可以实现6槽最大12T的容量。系统配置会在下文提到。

ProFTP 在MySQL中配置用户信息

服务器运行2个月了一直靠着sftp在传文件,决定还是配个ftp server方便下其他需要文件传输的朋友。

根据版本号原则(选择版本号最丰富最高的那个),在ProFTP/Pure-ftp/vsftp中选择了ProFTP,部分原因也是为了能搭配Mysql来保存用户信息。
这样做的好处在于可以不必暴露服务器上真实的用户名密码,即使信息外泄也不会引发严重安全问题,而且修改用户信息定义也方便,无需root登录只要修改下数据库就生效了。

在Gentoo上安装时需要USE参数中有mysql才会编译proftpd的mysql支持。
下面就是proftpd.conf里的配置,辅以简单说明
[code lang=”bash”]
# 申明从mysql中读取用户信息
AuthOrder mod_sql.c
# SQL信息log输出,方便调试
SQLLogFile /var/log/proftpd.sqllog
# 指定验证方法,Backend即调用特定数据库的密码加密方法,如Mysql下的password()函数
SQLAuthTypes Backend
SQLBackend mysql
SQLAuthenticate users groups
#用户库连接信息 数据库名@主机名 用户名 密码
SQLConnectInfo dbname@localhost dbuser dbpassword
# 数据库表的结构,如果你采用后文给出的db schema则无需更改
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
# 当用户登录时更新数据库表中count字段的值+1并且更新accessed字段值为当前时间。
#这两条并非必须,只是为了记录下用户登录时间次数。同理,可以将用户执行STOR或DELE的信息输出到日志
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1,accessed=now() WHERE userid=’%u'” ftpusers
[/code]

[code lang=”sql”]
# 数据表结构如下
CREATE TABLE IF NOT EXISTS `ftpusers` (
`userid` varchar(40) NOT NULL,
`passwd` varchar(50) NOT NULL,
`uid` int(11) NOT NULL default ‘0’,
`gid` int(11) NOT NULL default ‘0’,
`homedir` text NOT NULL,
`shell` text NOT NULL,
`count` int(11) NOT NULL default ‘0’,
`accessed` datetime default NULL,
PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `ftpgroups` (
`groupname` varchar(50) NOT NULL,
`gid` int(11) NOT NULL,
`members` text NOT NULL,
PRIMARY KEY (`groupname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
[/code]

这里需要注意的是,user表中每个user的uid和gid字段值必须是系统中存在的并且有足够权限读写homedir指向的路径。举个例子,如果有虚拟用户ayue且homedir指向/var/ftp/ayue,并且/var/ftp/ayue实际上是由用户Juda拥有,则ayue的uid和gid必须和/etc/passwd中Juda的一样才能正常读写该目录。也就是说,我们在数据库中创建的虚拟用户ayue可以理解为系统中真实存在的用户Juda的一个映射,ayue上传的文件在系统里就是Juda(同uid,同gid)所拥有的。

rTorrent中schedule设置技巧

rTorrent中可以配置schedule让其监控某个指定目录,发现.torrent文件后自动下载。搭配事件控制可以达到讲下载好的文件自动移动到另一个目录并且继续做种的效果。

某些情况下我们希望监控多个目录,并且将下载完毕的文件根据种子源目录的不同移动到不同的目录,这时候就要用到下面的配置。

[code]
schedule = watch_directory_1,10,10,”load_start=~/Download/watch_stuff1/*.torrent,d.set_custom1=~/Download/stuff1/”
schedule = watch_directory_2,10,10,”load_start=~/Download/watch_stuff2/*.torrent,d.set_custom1=~/Download/stuff2/”

# 下载完成后将文件移动到变量custom1指定的目录
system.method.set_key =event.download.finished,move_complete,”d.set_directory=$d.get_custom1= ;execute=mv,-u,$d.get_base_path=,$d.get_custom1=”
[/code]

上面的mv就是指系统自带的命令。同理我们可以让rTorrent在下载完毕后执行指定的命令,比如发送一封email到指定信箱提醒。
[code]
# First and only argument to rtorrent_mail.sh is completed file’s name (d.get_name)
system.method.set_key = event.download.finished,notify_me,”execute=~/rtorrent_mail.sh,$d.get_name=”
[/code]
rtorrent_mail.sh如下
[code]
#!/bin/sh
echo “$(date) : $1 – Download completed.” | mail -s “[rtorrent] – Download completed : $1” alerts@example.com
[/code]

MySQL 同步和备份策略 [一]

最近遇到一个案列,MySQL主机已经存有10G左右的数据并且每天还在以1G为单位增长。现在需要制定备份策略并且用于数据备份和服务器维护的停机时间要尽可能的短。

对此,我们打算配置Master主服务器 -> Slave从服务器单向同步复制并且在Slave机上做周期增量备份。如果Master因意外灾难无法继续服务可以立即切换Slave机顶替服务。以下内容中Master机指主服务器,Slave机指从服务器。

1. 开启二进制日志服务(5.1版本中二进制日志替换了老的更新日志),启动MySQL时加–log-bin参数或在my.cnf中加上这一行。后面可以跟文件名来指定日志名,扩展名会被自动忽略。默认文件名为mysqld-bin.0000x。数字x会自动增长并且mysqld-bin.index中会指定当前的日志文件索引,请勿手工维护.index文件。

2. 建立账户用户数据复制,该账户必须授予REPLICATION SLAVE权限。鉴于我们还需要从Slave机上执行LOAD DATA FROM MASTER 和 LOAD DATA FROM MASTER,还需要授予账户SUPER和RELOAD全局权限。并且为所有想要装载的表授予SELECT权限。任何该 账户不能SELECT的主服务器上的表被LOAD DATA FROM MASTER忽略掉。
例如[code lang=”sql”]
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%.mydomain.com’ IDENTIFIED BY ‘slavepass’;
[/code]

3. 执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句:
[code lang=”sql”]
mysql> FLUSH TABLES WITH READ LOCK;
[/code]

4. 鉴于原始数据库已经有超过10G的容量,现在使用mysqldump把数据备份成一个巨大的.sql文件显然是不明智的选择。可以简单地复制数据库文件到Slave机来快速创建一个主机的快照。Unix上用tar,windows上用winzip均可。

5. 当FLUSH TABLES WITH READ LOCK所置读锁定有效时,读取主服务器上当前的二进制日志名和偏移量值:
[code lang=”sql”]
mysql> SHOW MASTER STATUS;
[/code]

File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为mysql-bin.000007,偏移量为2268600。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,从服务器应从该点开始从主服务器上进行新的更新。

6. 主服务器数据库文件备份完成并且记录上述日志名和偏移量后,可以在主服务器上重新启用写活动:
[code lang=”sql”]
mysql> UNLOCK TABLES;
[/code]

7. 检查Master机上的my.cnf配置,确保在[mysqld]部分除开启log-bin外且指定server-id=1。这里我们将Master机上的server-id指定为1,Slave机上的my.cnf中将其指定为2。

8. 启动Slave机(在此之前已经复制了Master上的数据文件),用–skip-slave-start选项启动从服务器,以便它不立即尝试连接主服务器。

9. 在从服务器上执行下面的语句,用Master机的实际值替换选项值:
[code lang=”sql”]
mysql> CHANGE MASTER TO
-> MASTER_HOST=’master_host_name’,
-> MASTER_USER=’replication_user_name’,
-> MASTER_PASSWORD=’replication_password’,
-> MASTER_LOG_FILE=’recorded_log_file_name’,
-> MASTER_LOG_POS=recorded_log_position;
[/code]

10. 启动Slave服务器上的复制进程
[code lang=”sql”]
mysql> START SLAVE;
[/code]
执行这些程序后,从服务器应连接主服务器,并补充自从数据库文件备份以来发生的任何更新。

至此,我们备份策略中的主从机单向复制同步已经配置完成。

iPad 3.2.1 越狱

感谢hacker们的努力,现在的iOS越狱真是越来越简单了。

  • 打开包装,iPad连接iTunes激活,惊喜发现版本还是3.2.1 (再高就暂时无法越狱)
  • 用iPad上的safari访问http://jailbreakme.com (好网站,也没被GFW),直接slide to jailbreak。这个过程都无需连接电脑
  • 耐心等待进度条跑完之后你会发现桌面上已经有Cyndia了,越狱完成,真是太简单了。

根据个人口味可以选择安装SBSettings,OpenSSH,Aptitude等等所需要的工具。至此你可以在国内各大apple爱好者论坛上下载各式各样的ipa安装包来填满你的iPad。

Android手机Nexus One连接Apple Bluetooth Keyboard

首先所有带蓝牙的android手机理论上都是可以连接蓝牙键盘鼠标的(Human Interface Device),不幸地是官方的蓝牙profile中默认不包括HID profile。所以只有采用第三方的ROM如Cyanogen(CM6版本以上)或在官方的rom上搭配bluez utility来实现蓝牙键鼠的连接。

这里我们仅讨论第二种在官方ROM上添加工具的方案。手机必须取得root权限,或者是ADP (Android Dev Phone),并且需要安装busybox。

1. 先下载需要的工具。
[code lang=”bash”]
$ wget http://androidobex.googlecode.com/files/hciconfig
$ wget http://androidobex.googlecode.com/files/hcitool
$ wget http://androidobex.googlecode.com/files/hidd
[/code]

2. 提升到root权限,并且将/system挂载成可读写,默认为read-only
[code lang=”bash”]
$ su
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
# chmod 777 /system/xbin
[/code]

3. 从本地复制第一步下载的文件到手机
[code lang=”bash”]
$ adb push hidd /system/xbin
$ adb push hcitool /system/xbin
$ adb push hciconfig /system/xbin
[/code]

4. 如果你的手机不是ADP的话,可能无法直接从本地电脑复制文件到手机。这样你可以先用usb线连接手机,把以上三个文件复制到sdcard根目录上,然后执行。
[code lang=”bash”]
# cp /sdcard/hidd /system/xbin/
# cp /sdcard/hcitool /system/xbin/
# cp /sdcard/hciconfig /system/xbin/
[/code]

5. 打开手机蓝牙,在Settings -> Wireless & network settings -> Bluetooth settings中找到键盘并且配对。pin code可以填写0000,配对成功后会发现该设备显示为’paried but not connected’,这是因为缺少HID profile。

6. 现在要用到之前拷入手机的三个文件。实际情况中设备的Mac地址会与下面的例子有所不同,根据实际情况输入。
[code lang=”bash”]
# hciconfig
hci0: Type: UART
BD Address: 00:22:A5:B8:AD:65 ACL MTU: 1021:4 SCO MTU: 180:4
UP RUNNING PSCAN
RX bytes:8672 acl:98 sco:0 events:285 errors:0
TX bytes:3336 acl:102 sco:0 commands:89 errors:0

# hcitool dev
Devices:
hci0 00:22:A5:B8:AD:65

# hcitool scan
Scanning …
00:1D:4F:A7:9A:49 Apple Wireless Keyboard

# hidd –connect 00:1D:4F:A7:9A:49

# hcitool con
Connections:
< ACL 00:1D:4F:A7:9A:49 handle 1 state 1 lm MASTER [/code] 9. 至此,Apple Bluetooth Keyboard连接成功。打开任意程序,蓝牙键盘敲击的键将出现在输入栏。经过测试,谷歌中文法也可以正常使用并且可以用数字键选择候选字。 10. 剩下的问题就是苹果的键盘的多功能键(调节音量,屏幕亮度)暂时还不能在手机里使用,有待进一步研究如何修改这几个键位。

Hello world!

玩了几年虚拟主机,先是从国内的某不知名群租服务器上搬到了上海神话科技的主机,接着又是托同服务器上爱搞点不和谐内容的“邻居”的福三天两头被CT查封服务器,再后来兴起了ICP良民备案制度。不堪其扰之下把域名和主机都搬迁到了US Dreamhost的旗下。尽管dreamhost的服务挺好,而且速度和空间也不构成瓶颈,本着电工就是爱折腾的想法最后还是租了VPS。现正在把所有站点慢慢迁移至VPS主机,情绪稳定。