阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

构建一个微型的 ARM 服务器

216次阅读
没有评论

共计 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 端口——这样任何串口程序都能够访问串行接口)。

构建一个微型的 ARM 服务器
板子上的串口,焊上了 3 针并接了 3 根线(红色箭头指示 )

两天后线缆包裹到了,我连了 3 跟线(2,3 和 4)到 USB/serial 转换线上。

在我的主机上(Atom 330 硬件上的 ArchLinux),我连接 USB 线缆,启动一个串口程序(minicom -D /dev/ttyUSB0 -b 115200),然后给小板上电…

构建一个微型的 ARM 服务器
游戏开始了 :-) 板子现在没有外壳赤裸裸的放着。

什么也没有!

额 …

从没有万能 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 filesvim 配置),在过去的 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 端口——这样任何串口程序都能够访问串行接口)。

构建一个微型的 ARM 服务器
板子上的串口,焊上了 3 针并接了 3 根线(红色箭头指示 )

两天后线缆包裹到了,我连了 3 跟线(2,3 和 4)到 USB/serial 转换线上。

在我的主机上(Atom 330 硬件上的 ArchLinux),我连接 USB 线缆,启动一个串口程序(minicom -D /dev/ttyUSB0 -b 115200),然后给小板上电…

构建一个微型的 ARM 服务器
游戏开始了 :-) 板子现在没有外壳赤裸裸的放着。

什么也没有!

额 …

耗电?没必要那么多吧 :-)

规格分段 …

# 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 他们来为我干活,当然啦 - 世事总不是那么完美的。

但这也正是它的乐趣所在 :-)

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计7128字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中