本地 NAS 数据去重
我使用一个相对廉价的 NAS (网络存储) 设备,叫做 My Book Live,来存储我需要从多台电脑访问的东西。不过,直到最近我才学会如何启用该设备的 SSH 访问,结果发现它是一个基于 PowerPC 的嵌入式开发板,运行 Linux:MyBookLive:~# uname
引言
我使用一个相对廉价的 NAS (网络存储) 设备,叫做 My Book Live,来存储我需要从多台电脑访问的东西。不过,直到最近我才学会如何启用 SSH 访问该设备,结果发现它是一个基于 PowerPC 的嵌入式开发板,运行 Linux
MyBookLive:~# uname -a
Linux MyBookLive 2.6.32.11-svn48181 #1 Thu Sep 15 18:22:06 PDT 2011 ppc GNU/Linux
MyBookLive:~# cat /proc/cpuinfo
processor : 0
cpu : APM82181
clock : 800.000008MHz
revision : 28.130 (pvr 12c4 1c82)
bogomips : 1600.00
timebase : 800000008
platform : PowerPC 44x Platform
model : amcc,apollo3g
Memory : 256 MB
启用 SSH 让我能够通过 sshfs 挂载该设备,这真的很有帮助(如果 NAS 位于路由器后面,NFS 配置起来很麻烦,FTP 不保留时间戳,SMB 有一堆自己的问题),所以我想感谢 Western Digital 是一家如此极客友好的公司。
这也意味着我可以本地执行某些文件操作,通过直接在 NAS 上运行软件,而无需通过网络传输数据。其中一项(耗时)操作是数据去重,或者查找完全相同的文件副本(可能名称已更改)。一个好的工具是 fdupes,它使用校验和来识别“重复”文件。
尽管 NAS 预装了大量 Unix 软件,但 fdupes 不在列表中。编译器当然也缺失了(谁会在嵌入式设备上附带编译器?),但是...
构建 GCC 很容易!
好吧,至少如果你有 POSIX 环境和区分大小写的文件系统(也包括基于 Windows 的 Cygwin,前提是 NTFS 开启了区分大小写)。
有一个很好的工具叫做 crosstool-ng,如果有人想构建 GNU 工具链(gcc + friends),几乎不需要设置。该工具主要面向构建交叉编译器,即针对与运行它的系统不同的 CPU/平台(ARM、PowerPC、MIPS,随你选择)的编译器,但 crosstool 也可以为 x86 目标构建。如果你使用提供的配置之一,则可能根本不需要设置 - 这实际上就是针对 NAS 的 gcc 的情况。
在构建完 crosstool-ng
本身之后(这是一个典型的 configure && make && make install
过程,不值得关注),我分析了提供的工具链配置的数量 (ct-ng list-samples
) 并找到了一个足够接近目标平台的:powerpc-405-linux-gnu
。
使用 crosstool-ng
构建工具链时,重要部分是:不要更改它想要使用的路径。或者如果你确实要更改(该工具设置为用源文件和输出来弄乱主目录),请确保它们是绝对的,而不是相对的 - 否则你会在此过程后期遇到一堆奇怪的错误。另外,在构建之前配置工具链也会有所帮助:) (ct-ng menuconfig
) 并删除 Java、Fortran 和所有调试工具 (gdb
、lstrace
/strace
、duma
等),这些工具构建起来可能存在问题(而且速度慢)。
因此,在选择面向 PowerPC 405 的工具链(PowerPC 440 似乎向后兼容)并等待几十分钟(或者说是几个小时?)ct-ng build
之后,新的闪亮的 gcc
以及 binutils 等就可以使用了。
在设备上运行。
现在到了简单的部分:检出 fdupes 源代码,使用交叉 gcc 为 PowerPC 编译它(fdupes 的 Makefile 中只需更改一行),将其复制到设备并从那里运行它......一切都按原样工作,即使我没有花时间弄清楚设备上的内核是否与新构建的 GNU 工具链使用的内核头文件兼容。
现在关于一个预期的提问,这样做是否值得。简短的答案是:可能值得。 iostat
显示的速度远高于 Ethernet 100BASE-T 的速度,而在千兆以太网上,需要在整个漫长的操作期间将大部分带宽分配给设备(以及自然地,计算机)。此外,我现在可以关闭计算机,让 NAS 自己“整理东西”。
这里的问题是,特别是 fdupes,需要大量的内存来处理 TB 级的数据(大约 1GB 的 RAM)。NAS 只有 256 MB 的 RAM,其余的都进入了交换空间 - 这可能会减慢该过程。我没有完全比较本地去重与远程去重的性能,所以我不确定。
不过,构建软件以在似乎是外部磁盘驱动器上运行仍然很有趣。现在,我有一部可以 SSH 连接的手机,一台可以安装软件的路由器,一台运行 Linux 的 PlayStation(完全合法,从未更新到 3.21 系统软件之后),现在,有点偶然地,还有一个运行 Linux 的网络磁盘驱动器。我是一个快乐的极客:)