共计 7128 个字符,预计需要花费 18 分钟才能阅读完成。
大约一年前,My Book 世界版——一台西部数据制造的淘汰 NAS 设备 到了我手上。这是一个比较古老,低功率,基于 ARM 的文件服务器…尽管以今天的标准来说它很过时,但在一得到它时我就知道,我会非常享受 hack 进它并开始我的大计划:-)
我是一名职业程序员,但我真的不太认可规划和管理分离——在我看来,这在实践中都有很多优点。
拆卸和焊接
首先,我必需得把它拆开,这样我才可以将它装成我我想要的东西。依照众多工程师留下的传统,进过我半个小时的努力后终于把它解体了——之后才意识到应该记录这种灵魂拆解过程。嗯,自己将事情弄清楚是事情本身最好的部分:-)
我把机器中的两个硬盘取了出来,并将它们连接到我的拓展 USB/SATA 卡座上,然后运行 SMART 快速检查:smartctl -a /dev/sdX。结果显示这两个硬盘上都有坏块(Reallocated_Event_Count, Current_Pending_Sector都是非零的,硬盘不太可靠)…因此我拆了块旧的 160GB 外部 USB 硬盘,并将它连接到空的卡座上。
因为这是一个嵌入式平台,上面没有 VGA 或串行插头,我需要找到一个方法来监测其启动过程。Google 了一下,原来板子上有传统 RS-232 串行接口的焊盘。万能的因特网上搜到了规格,它很简单:
- Pin 1 = +3.3V
- Pin 2 = GND
- Pin 3 = Rx
- Pin 4 = Tx
…因为我们与使用 RS-232 接口主板的年龄相去甚远,我在一个网上电子商店订了一根 TTL 转 RS-232 线缆(翻译:一根线缆,一端连接到板子,另一端插入电脑的 USB 端口——这样任何串口程序都能够访问串行接口)。
板子上的串口,焊上了 3 根 针并接了 3 根线(红色箭头指示 )
两天后线缆包裹到了,我连了 3 跟线(2,3 和 4)到 USB/serial 转换线上。
在我的主机上(Atom 330 硬件上的 ArchLinux),我连接 USB 线缆,启动一个串口程序(minicom -D /dev/ttyUSB0 -b 115200),然后给小板上电…
游戏开始了 :-) 板子现在没有外壳赤裸裸的放着。
什么也没有!
额 …
从没有万能 BIOS 的板子上启动 U -boot
我本希望这里会显示一些 BIOS 输出信息,但也许这个小板子没有 BIOS 这么奢侈的东西…也许它要从连接到的磁盘读取它所需的一切?
我把老的硬盘挂到我脑的 USB/SATA 接口上,果然,基于 Linux 的迹象:我 ArchLinux 里的 RAID 驱动软件检测到了 raid 设备(cat /proc/mdstat 显示 RAID 结构的信息)。显然,MyBook 将这两个我打算成功挂载的硬盘以 RAID 形式组织。在这两个磁盘中每个都有 4 个分区,显然是 RAID1 镜像形式——第四及最后一个分区镜像为“文件服务器”的存储区。
我将前三个分区(包括分区表)复制到了我的 160GB 的硬盘(通过 add)。然后使用 fdisk 修改第四个分区的大小为硬盘的剩余空间。
将 160GB 硬盘添加后重新开机,minicom 输出成功:
Welcome to minicom 2.6.2
OPTIONS: I18n
Compiled on Mar 5 2013, 16:40:55.
Port /dev/ttyUSB0, 12:22:35
Press CTRL-A Z for help on special keys
�NASOx_0800
Mon Aug 5 21:45:27 EEST 2013
U-Boot 1.1.2 (Jan 21 2008 – 08:50:09)
U-Boot code: 48D00000 -> 48D17648 BSS: -> 48D1B2B8
RAM Configuration:
Bank #0: 48000000 32 MB
In: serial
Out: serial
Err: serial
Initialising disks
No FIS received from device 1
Detecting SATA busses:
Bus 0: Found first device OK
Device 0: Model: TOSHIBA MK1652GSX Firm: LV010J Ser#: 29GGF8WNS
Type: Hard Disk
Supports 48-bit addressing
Capacity: 152627.8 MB = 149.0 GB (312581808 x 512)
Device 1: not available
IDE read: device 0 block # 63, count 1 … 1 blocks read: OK
… 运行到启动一个正常的 Linux 内核
O 了!
安装 Debian(以及一些关于 Windows 的思考)
已经能访问到西数提供的 Linux 板子是一个不错的开始。接着我找到了一个篇一个令人惊讶的工程师所写的文章,他向我们描述了他如何 hack 他的板子使之能够做任何他想做的事情。根据他的指导,我已经成功的运用西数提供的 GPL 资源 build 了我自己的 kernel 和一个基于 busybox 的 mini-distro。我想要的不仅仅是个玩具,并且,正因为我在工作时使用的是 Debian,我遵循 Mario(上面那篇 链接 文章的作者,译者注)的加强版本的介绍,并且在 15 分钟内,就通过 debootstrap 工具在我的 160GB 设备上安装好了 Debian 的主要部分。
<rant>
在可能的情况下,我比较偏爱用命令行做事情 – 不仅是因为它为我提供了我工作时所使用的 OS 的一些知识,它也允许我通过串口线或者 SSH 连接来做事。我也可以把我在普通机器上使用的知识 同样地 运用到这个小 ARM 盒子上: 编辑 /etc/network/interfaces,/etc/resolv.conf 等。
悲剧的是,这是一个几乎被微软毁掉的技能,它使得人们无可救药的依赖于 ” 向导 ”。那,本身就已经相当不错了,如果不是不可避免的副作用:人们点了一个不知道接下来会发生什么的按钮,最终系统只能通过重装来恢复。我自己的设定 – 自从我用了 UNIX 系统 – 他们是一些在 /etc 或者 $HOME 等目录下的简单文件,它们一直都在版本控制之下 (例如 我的 main dot files 和vim 配置),在过去的 15 年里,它们在许多的机器上都愉快的迁移过。备份他们并且恢复他们,例如在新的品牌机上的安装工作就从一个 repo 简单的 check out 文件和文件夹 …
这样的做法,从我那些可怜的被窗户锁住 (Windows-locked,双关,译者注) 的弟兄们看来,是他们梦寐以求的。如果他们已经实现了whatapt-getdoes,并且已经用了它 10 年以上 …
跑题了 - 这些东西人们可能在读这篇博文的时候已经知道了。
</rant>
我很快安装好了网络接口,并且开始工作了 …
# apt-get update && apt-get upgrade
到此,我知道困难的部分已经过去啦 - 我现在有了一个 ARM 版的 Debian,我可以配置任何我想要的东西了。
大约一年前,My Book 世界版——一台西部数据制造的淘汰 NAS 设备 到了我手上。这是一个比较古老,低功率,基于 ARM 的文件服务器…尽管以今天的标准来说它很过时,但在一得到它时我就知道,我会非常享受 hack 进它并开始我的大计划:-)
我是一名职业程序员,但我真的不太认可规划和管理分离——在我看来,这在实践中都有很多优点。
拆卸和焊接
首先,我必需得把它拆开,这样我才可以将它装成我我想要的东西。依照众多工程师留下的传统,进过我半个小时的努力后终于把它解体了——之后才意识到应该记录这种灵魂拆解过程。嗯,自己将事情弄清楚是事情本身最好的部分:-)
我把机器中的两个硬盘取了出来,并将它们连接到我的拓展 USB/SATA 卡座上,然后运行 SMART 快速检查:smartctl -a /dev/sdX。结果显示这两个硬盘上都有坏块(Reallocated_Event_Count, Current_Pending_Sector都是非零的,硬盘不太可靠)…因此我拆了块旧的 160GB 外部 USB 硬盘,并将它连接到空的卡座上。
因为这是一个嵌入式平台,上面没有 VGA 或串行插头,我需要找到一个方法来监测其启动过程。Google 了一下,原来板子上有传统 RS-232 串行接口的焊盘。万能的因特网上搜到了规格,它很简单:
- Pin 1 = +3.3V
- Pin 2 = GND
- Pin 3 = Rx
- Pin 4 = Tx
…因为我们与使用 RS-232 接口主板的年龄相去甚远,我在一个网上电子商店订了一根 TTL 转 RS-232 线缆(翻译:一根线缆,一端连接到板子,另一端插入电脑的 USB 端口——这样任何串口程序都能够访问串行接口)。
板子上的串口,焊上了 3 根 针并接了 3 根线(红色箭头指示 )
两天后线缆包裹到了,我连了 3 跟线(2,3 和 4)到 USB/serial 转换线上。
在我的主机上(Atom 330 硬件上的 ArchLinux),我连接 USB 线缆,启动一个串口程序(minicom -D /dev/ttyUSB0 -b 115200),然后给小板上电…
游戏开始了 :-) 板子现在没有外壳赤裸裸的放着。
什么也没有!
额 …
耗电?没必要那么多吧 :-)
规格分段 …
# cat /proc/cpuinfo
Processor : ARM926EJ-Sid(wb) rev 5 (v5l)
BogoMIPS : 99.73
Features : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Cache type : write-back
Cache clean : cp15 c7 ops
Cache lockdown : format C
Cache format : Harvard
I size : 32768
I assoc : 4
I line length : 32
I sets : 256
D size : 32768
D assoc : 4
D line length : 32
D sets : 256
Hardware : Oxsemi NAS
Revision : 0000
Serial : 0000000000000000
… 这台机器绝对赢不了任何比赛:功率非常低,但这也可以被看作是其一个优点:空载时只消耗 0.7 瓦特的服务器随时“待命”没什么问题吧!随后加入了 160GB 磁盘驱动器,我一下将功耗提到了 3 -3.5W…,一点也不差。
DynDNS
我得机器在 DSL 线路的后面,所以我的 IP 地址是不断变化的。为了能从外部访问我这台迷你服务器,我在 DynDNS 上打开了一个(免费的)帐户。由于主板只有 32MB 的 RAM,我选择了禁止使用 DynDNS 的 Perl 脚本,而是采用了原生的 C 客户端,inadyn:
# apt-get install gcc
…
# wget http://inatech.eu/inadyn/inadyn.v1.96.2.zip
# unzip inadyn.v1.96.2.zip
# cd inadyn
# make
…
# cp bin/linux/inadyn /usr/local/bin
然后,通过 cron 我配置使其启动在运行状态:
# cat /var/spool/cron/crontabs/root
…
@reboot /usr/local/bin/inadyn
… 还有设置我的 DynDNS 凭据:
# cat /etc/inadyn.conf
–username USER –password PASSWORD –alias UBER-SECRET.dyndns.org –update_period_sec 300 –background
这就好了了——每 5 分钟(5×60=300),微小的服务器会使用当前的 IP 地址跟 DynDNS 进行一次通信是:
# host UBER-SECRET.dyndns.org
UBER-SECRET.dyndns.org has address AA.BB.CC.DD
如此,我就拥有一个永久的 Internet 存在了,是时候往里面放些“东西”了.
Nginx
首先,我要安装 nginx——这样就可以把任何我想的内容在朋友 / 家庭中分享——只要他们有一个浏览器访问即可。
当然,我这个 32MB 内存的迷你服务器及 700kbit 上行的 DSL 速度做不了大事,但还有其他的用途:我在我 iPhone 照片文件夹上运行 rsync-ed,将照片发布到一个 Nginx 密码保护的文件夹中…
# rsync -av mobile@iphone:/private/var/mobile/Media/DCIM/100APPLE/ \
/var/www/nginx-default/Media/
我的照片从此可以在世界任何地方访问到了,只要访问我的迷你服务器即可(需要使用文件夹密码)。欧耶!
我到 rsync 添加到了 cron 任务中,这样我 iPhone 内的照片每晚都会自动 rsync-ed 不论我在睡觉或充电。
Exim, mutt
隐私问题让人不能接受,所以能有一个不依靠第三方存在的邮件服务是极好的。apt-get install exim4,然后我的朋友就可以通过 ttsiod@UBER-SECRET.dyndns.org 这个地址给我发邮件了。我使用 ’mutt’ 工具 ssh 连接到服务器上来阅读这些邮件,它在这个微型服务器的小 CPU 上工作的很好。
<rant2>
如果世界上的人都自我尊重,那这个世界就结束了;不幸的是,即使 GMail 账户接收我发出来的邮件没有任何问题,剩下的 (例如 Yahoo) 则会把我当成是一个垃圾邮件者,因为我是从一个地狱的黑洞里发出邮件(例如我的 IP 属于 DSL 的一行)。他们如何确认我不是一个 Windows 僵尸机,被 malware 入侵并且为 Spam Lord 服务呢?
SPF 或者 DomainKeys 都不能确定这些 – 所以我转换我的出口到 usesmarthost 并且因此通过我的 ISP 路由 mail。
(叹气)
</rant2>
防火墙和 sslh
有一些地方是无法访问我的 SSH 服务器的(比如,通过 ssh - D 命令把它当作 SOCKS 代理使用的地方),因为这样的地方都有只允许 HTTP 流量通过的防火墙。
最初,我试图通过 HTTPS 的端口 (443) 把服务器呈现出来,不过这么做不能满足需求。我最终使用了 sslh,它非常巧妙地在端口和大量后台服务之间做着中介。在这种情形下,只要能解析 SSH 和 HTTPS 协议,它就能够确定什么时候给进入的连接 SSH 响应,什么时候给 HTTP 响应 - 而且在请求和正确的本地后台服务(sshd,nginx)之间建立通道。此时,防火墙就把它当作合法的 HTTPS 站点(我就是这么做的,多亏有 Nginx),接着运行 ssh -p 443…… 哈哈,可以访问了。
Samba
我可以使用这个微型服务器下载我想下载的任何东西。rtorrent 是一个运行良好的基于文本的 BT 客户端,不过由于我实际上不是一个跟随主流的人,因此真正让我感兴趣的事情不是这个工具。许多情况下,我宁愿收集我所感兴趣的 URL,然后建立使用 wget 或者 youtube-dl 的脚本来下载这些屏蔽在会话里的 URL。这样,在下班回家以后,我就从越狱的安卓平板(通过 Samba,即使用常用的 mount -f cifs…)连接到服务器的已下载文件夹, 接着就可以毫无网络“中断”地观看视频了。
你可能很想知道,我现在正在看的是 Drew Neil 的令人着迷的 VimCasts 系列视频和 egghead.io 上的有关 AngularJS 的视频吗。解答这个问题相当容易 - 我对 HTML 进行大量的分析,找到视频所在的 URL,然后把这些 URL 传递给使用了速度限制的 wget- 这样,我就不会让分享这些宝贵资源的人超负荷的运行了。
总结 – UNIX 的荣耀
如果你考虑一下,那结果是令人惊讶的,一切工作都是在 ARM 处理器上完成的,而不是 Intel:
- 我仅仅只需要付出 3 -3.5w 的能源就能获得一个一直在我房子里工作的服务器。
- 即使我使用的是动态 IP 我也能访问到我的服务器(通过 DynDNS)。
- Nginx web 服务器能够使我与我在这个世上真正关心的人们 (家人,和一些像我一样的 hacker) 共享一些东西。因为我的 iPhone 也运行的是 UNIX,我可以每天把里面的照片同步到我的小服务器上,并且因此我能够向我关心的任何人展示它。未来短期的计划: 利用 AngularJS/Flask 把一些东西 hack 到一起,这样我就能用一种更好的方法来呈现我的照片而不仅仅只是一些 JPG 文件(例如预览功能等)。
- Exim 邮件服务器允许我通过(E)SMTP 来接收邮件,储存在我家里,并且在任何地方通过 SSH/mutt 来阅读它们。
- 当我需要时,我会 SSH 连接到我的小服务器上并且使用 Wake-On-Lan 启动我的桌面电脑,然后就能访问到我 coding 生涯中的任何成果。或者我的音乐收藏。
- 我可以通过 screen 命令 (会话以 sessoin 形式保存,即使 ssh 退出后仍起效,译者注) 在上面跑长时间的 web 下载(例如 wget/youtube-dl),然后通过 Samba 共享给我家里的设备(例如从我的越狱过得安卓平板上看电影)。
- 感谢 sslh,我可以透过几道存在于不同地方的防火墙从而访问到我的小服务器。
总而言之,UNIX 的力量体现在使用中 - 在小服务器里,在我的手机上,在我的平板上。他们三个都有着 ARM 处理器。诚实的说,我没有想到:15 年前我很肯定 Intel 和微软是整个银河的核心 … 但不知怎么的,Linux 已经设法改变了这一切。
我仍然需要越狱或者 hack 他们来为我干活,当然啦 - 世事总不是那么完美的。
但这也正是它的乐趣所在 :-)