自己电脑上各种资源实在太多,硬盘空间紧张。此时搭建一个 NAS 放在家里就显得很有必要了。于是今年终于动手了。

硬件

IMG_8828.jpg

由于专门的 NAS 硬件太贵,动辄好几千。我便在淘宝上四百多块钱买了一块 12 * 12 cm 的主板,上面带一块 J1800 双核赛扬(有的 Atom 主板尺寸更小功耗更低,然而价格贵了些)。单独购买外置的 12 V 电源时,考虑到可能同时带一块 3.5" 硬盘和一块 2.5" 硬盘,于是买了 7 A 的适配器。又在淘宝上买了一块 3T 的西数红盘(WD30EFRX)作为硬盘。最后,把老笔记本上的 2G SO-DIMM 内存条拆下来装到主板上。

IMG_8844.jpg

现在硬盘和主板直接放在柜子里,不过有个「机箱」更好。我于是拿卡尺量了一下它们的尺寸和螺丝孔的位置,画了一个外壳:由四片亚克力拼成,硬盘放下面,主板放上面。准备到淘宝上找商家切亚克力板,自己拿螺纹塞规钻出螺纹。

frame.png

软件

软件上考虑使用 NFS 实现文件访问。借用办公室的显示器和键盘安装 Ubuntu 15.04 后将 NAS 拿回家,搭建 NFS 服务器。

考虑到网络读写不稳定,且 NAS 很大作用是保证数据即使在其它客户端被攻陷后也不丢失损坏,便想到用 union mount。Union mount 简而言之就是把一个只读目录(lower)和一个可读写目录(upper)映射到同一个目录(union)里。用户读取 union 中的文件时,实际就是从 upper 或 lower 中读取,而用户修改 union 中的文件时,所有改动都会被存进 upper 里。这样 union 看起来就是一个完全可读写的普通目录,然而 lower 目录实际并不会被更改,因此处于相对安全的境地。我只要定期 ssh 到 NAS 上看看具体修改了哪些内容,把确定需要保留改动从 upper 里写入 lower 里就好。

Union mount 现在最常见的两个实现是 AuFS 和 OverlayFS。前者由于被 Docker 采用,前两年忽然又火了一阵,然而实现非常复杂。后者的原理和实现都非常简洁,且在 3.18 时被合并进了 Linux 内核。因此我选择了 OverlayFS,并且专门为其写了一个工具。事与愿违的是,我发现无法在 OverlayFS 之上建立 NFS 服务器(i.e. OverlayFS 无法被 export 到 NFS)。于是我只好改用 AuFS 了,毕竟 AuFS 官方主页里就有 export to NFS 的指南。

具体设置较为简单:AuFS 部分,在 /etc/fstab 中加入

none /mnt/aufs aufs noauto,x-systemd.automount,br=/var/userdata/upper=rw:/var/userdata/lower=ro 0 3

NFS 部分,安装 nfs-kernel-server 后在 /etc/exports 中加入

/mnt/aufs *(rw,async,fsid=0,crossmnt,root_squash,no_subtree_check)

外网访问

就此,NFS 就已经可以在家里的内网放问了。然而,要在外网访问,需要考虑安全的问题。NFSv4 开始支持使用 Kerberos 进行身份验证。然而搭建 Kerberos 相对麻烦,我便想到曲线救国,直接使用 ssh 进行端口转发完成加密和认证。虽然这样会带来一些 overhead,不过由于我在外网访问 NAS 的频率低于在家里访问,所以问题尚不算大。

接下来就是在路由上设置端口转发允许外网访问到 NAS 的 22 端口。首先想到的是 MiniUPnPc,这样不用进入路由器设置里也可以完成端口映射,且不需要 NAS 有固定的内网 IP。然而联通配的路由器没有开启 UPnP。进路由器设置界面,发现里面既无法直接设置端口映射,也无法打开 UPnP。好在根据网上找到的方法破解了它后,就可以设置端口转发了。既然已经进了路由器管理界面,干脆直接给 NAS 设置了固定的 IP,打开固定的端口映射。再配合上 DDNS,就可以畅快地从外网也访问 NAS 了。

北京联通免费安装的 HG8346R GPON 终端实在非常糟糕。它自带了路由器的功能,但却无法开启端口映射或 UPnP。

于是我根据 [1][2] 的教程,花一个多小时快速破解了它,打开了这些设置。

在此记录下我的操作:

gpon.jpg

  1. 使用网上能很容易下载到的「华为光猫 ONT 维修使能工具」打开 HG8346R 的 telnet。这个过程中必须拔出光纤,我于是不得不打开了 HG8346R 的外壳。
  2. telnet 192.168.1.1 连接上 HG8346R。用户名 root,密码 admin。
  3. 在 192.168.1.2(亦可是其它内网主机)架设 TFTP 服务器后,在 telnet 中使用 back cfg by tftp svrip 192.168.1.2 remotefile hw_ctree.xml 将配置文件导出至 192.168.1.2。
  4. 在 telnet 中运行 su,此时需使用 [2] 中提供的 Python 脚本计算出验证码。
  5. 在 su 后的 telnet 中进入 shell,然后使用 restorehwmode.sh 将 HG8346R 从联通版本的界面恢复至华为版本的界面,并恢复了出厂设置。
  6. 恢复出厂设定后,DHCP 默认被关闭。于是电脑需暂时手动设置 IP 为 192.168.100.*,网关为 192.168.100.1 才可连上 HG8346R。
  7. http://192.168.100.1/ 进入管理界面,使用用户名 telecomadmin,密码 admintelecom 登录。
  8. 成功进入功能完整的管理界面。但是由于设置已被覆盖,此时无法连接广域网,此时可选择以下其中一种方法:

    • 在管理界面中上传之前导出的配置文件覆盖掉原厂设置。缺点是就无法再有管理员权限,只能有普通用户权限。然而这对于使用端口映射、UPnP 等功能来说已经完全足够了。
    • 或是手动输入原先有用的设置,缺点是体力工作量较大。
    • 或是修改导出的配置文件后重新上传。但是这样就需要如 [2] 中那样设法使用华为的 aescrypt2 先将配置文件解密后修改,再重新加密后上传。

解开后发现这款路由器一旦恢复华为界面,功能还是非常强大的。DDNS 什么的都有内置支持,甚至还可以作轻量级 NAS 用。

不得不万分感谢前人的努力和他们无私的分享!

7 月初的时候有幸去了新竹,参加「两岸清华与香港科大程式设计竞赛」。这个比赛每年举办一次,在北京、新竹和香港三地由三校轮流举办。运气很好,今年是去新竹,而非留在香港或是回北京。

周四早上从香港出发,周日中午便回来,时间并不算长。然而,给我留下的记忆恐怕却比半个月后再次去台湾环岛的那十多天留下的记忆深刻。

第一天晚上到了新竹,所住的旅店并不大,也并不奢华。和我住同一间的两个学弟,其中 YQ 君是湖北来的新生。当晚睡觉前,我提议先上 Codeforces 做上几题练手。随后便发现,他的实力比我不知高到哪里去——每一题都能很快想出来,并且写出来。而他说的数据结构我甚至都没听说过。

比赛

第二天比赛时,果然基本是靠 YQ 君一个人做题;而我们作为科大二队,最后运气很好拿到了全场第三,次于两只清华的队,领先于一队、清大的两只队和女队。

Programming team

于是我常常是庆幸的——虽然由于各种阴差阳错,我到了大四才进入 programming team,并且最终也只参加了一次 ICPC regional。

大学的前两年,我根本没有听说过学校有 programming team——因为那时每年招新的邮件都只发给 CS 的学生,而我那时还没有进 CS 的邮件列表。到了后来我知道有 programming team 时,和 YW 君一起刷了半个月的题,然而最后校内选拔时,最终只解出一道题排在第七——那年招了六个人组两只队。那天晚上我心情可谓沉痛,看了看,有两三道题都是差一点点细节就能做对的。

到 final year 进了 team 后,我才意识到事情完全不是这样。每次 training 时,队友都展现出远胜于我的知识和熟练度;而比赛时他们的沉着和自信也完全不是我能比的。在这个 team 里,我总能深深体会到,比我年轻的 teammates,各方面比我强得太多——我能够混进 team 已经是全靠运气。

一路上他们的谈话跟我都不是在一个 level 上的——他们拿着 above 4 的 GPA,修着 pure mathematics (advanced) 专业,上着全理论的 PG 课——尽管只是新生萌妹子。

于是我总意识到,自己的水平和努力程度远远不如别人,怎么可能能有资格幻想美好的前途。

清大打 Ingress

比赛之后的夜晚,我就和萌妹子 RY 君去清大打 Ingress,做校徽拼图的 mission——虽然她半途而废了。校园里当是时下着阵雨,于是我们不得不打伞和避雨。她的手机看来是比我快不少,每次都能抢在我前面拿到 UPC。

她先回旅店之后,我一个人回到清大校园继续完成校徽拼图的 mission。

清大的校园有不少和清华神似的地方——譬如狭长的大草坪和其边的日晷。而在校园里的山坡边上见到有 portal 是「西南联大时期校歌纪念碑」;联想起我创建的西南联大的 mission,我瞬间有了种历史的苍凉感——尤其是再一联想到,校门外面那条路名赫然是「光复路」,更觉得一丝凄凉。

就在雨后的凄凉里做完所有 30 个 mission,已经凌晨两点。第二天晚上又和 RY 君在周边散步,做了几个闲杂 mission。

  • 去偏远的地方旅行:Patagonia、Iceland、Unalaska……
  • 在除中国以外的至少三个国家工作过。
  • 买很多辆自行车,有旅行车,有山地车,有公路车,有躺车。
  • 系统地学习数学。

小的时候在学校家长会一类的场合,常常会被当作「优秀学生」表扬。可是上了大学以后,似乎就真的再没有过了。大约,是学渣本质完全暴露了的缘故吧。

于是在这些年,有偶尔听到有人用「优秀」这个词形容我,心里都会有一丝颤动。

譬如 14 年初在北京的寒冬里,在 768 园区里和资助我奖学金的伍体贤基金会的伍碧雁女士通话,听到她用「优秀」二字形容我,那满目萧索的枯枝景象,仿佛都变得不一样。

譬如 14 年春天,在知乎实习的最后一天,知乎的联合创始人暨 CTO 李申申,请我到公司对面吃饭。他说他觉得我很出色,学东西很快,并且给人感觉很正直,我亦铭记至今。

譬如 14 年夏天,在 TUM 的学期快结束时,去考 Online and Approximation Algorithms 课的 oral exam。虽然我几乎一问三不知,最后只能拿最差的 pass 成绩,但授课的 Susanne Albers 教授说我上课时思维敏捷,很有想法,给她印象深刻,并祝我回香港后一切好运。那一天我走出 IN 教学楼时,看见早晨的阳光迎面撒在每间隔一段种了一颗树的水泥地上,那场景至今无法忘怀。

直到——直到 14 年的夏天快要结束的时候,在 Granada 的旅店里,SG 对我说「你是我遇到过最优秀的男生」。