树莓派:完美的家庭服务器
自从树莓派发布以来,互联网上各种网站都提出了许多有趣且富有挑战性的设备用途。虽然所有这些想法都很棒,但树莓派 (RPi) 最明显且可能最不起眼的应用是创建您完美的家庭服务器。
如果您有多台不同的计算机需要一致且自动化的备份策略,RPi 可以做到这一点。如果您有音乐和视频,希望能够从家中的几乎任何屏幕访问,RPi 也可以实现。也许您有一两台打印机想要轻松地与所有人共享?树莓派可以用最少的硬件和时间投入来满足所有这些需求。
树莓派的优势低成本: 树莓派 B 型号仅需 35 美元,几乎是一台完整的计算机,拥有 512MB 内存、100Mb 以太网、SD 卡插槽、两个 USB 端口、音频输出和 HDMI 或 RCA 视频输出。我见过 HDMI 电缆比这还贵。
节能高效: 硬件成本只是服务器费用的一个组成部分,因为您还需要考虑保持设备持续运行的能源成本。家庭使用所需的服务不会对 CPU 造成太大压力,并且大部分时间它都将处于空闲状态,等待执行某些操作。RPi 的超低功耗组件非常适合这种工作负载,这有助于降低您的电费。我的 B 型号设备加上外置硬盘总共只消耗 8 瓦功率,而它取代的旧 Athlon 基础机在空闲时消耗 54 瓦。假设每千瓦时 10 美分,RPi 的年度电费为 7 美元,而 Athlon 基础机器为 47 美元。RPi 基本上在不到一年的时间内就能收回成本!
低噪音: 由于 RPi 没有风扇或移动部件,因此您最终配置中唯一产生噪音或任何明显热量的组件将是硬盘。如果您担心噪音,像 Silent PC Review 这样的爱好者网站通常会在其存储评测中包含噪音基准。我的经验是,任何现代硬盘都足够安静,可以避免在任何已经有其他东西运行的地方(例如媒体中心、游戏机或其他计算机)被检测到。如果您的家庭在布线选项方面没有太多灵活性,RPi 的小尺寸、最小的热输出和低噪音足迹可能会使您有可能在过去难以证明合理性的地方偷偷安装一台服务器。

图 1. 紧凑但功能强大的家庭服务器
新的机会: 一个不太明显的优势是尝试新事物的简单乐趣!对我来说,这是我第一次真正使用基于 Debian 的发行版,对于许多 Linux 爱好者来说,这可能是第一次有机会尝试基于 ARM 的架构。
硬件布置对于家庭服务器,您需要一张中等大小的 SD 闪存卡用于本地存储。可以使用 USB 拇指驱动器进行启动,但这会占用两个宝贵的 USB 插槽之一。闪存卡不需要很大,但速度越快越好。我选择了一张名牌 SD 卡,容量为 8GB,速度等级为 Class 10。对于备份和多媒体文件,必须配备大容量硬盘和一个 USB 底座。我选择了一块 1.5TB 硬盘和一个 Calvary EN-CAHDD-D 2 槽 USB 2.0 硬盘底座。此底座具有以 RAID-0 模式运行两个硬盘的功能,这在将来可能很有用。最后,RPi 没有配备电源,但大多数智能手机充电器都提供所需的 5v-over-micro USB。为了查看 RPi 是否对电源挑剔,我更换了三个不同的 micro-USB 手机充电器作为电源。我尝试了每个充电器大约一周,所有设备都没有任何问题。
安装操作系统RPi 操作系统的安装在其他地方有详细介绍,但这里有一些特定于家庭服务器的技巧,大致按需排列。
1) 直接从 http://www.raspberrypi.org/downloads 获取 Raspbian "Wheezy" 安装镜像,并按照网站上列出的步骤将其复制到 SD 卡上。
2) 首次启动 RPi 时,连接键盘、鼠标和显示器。不要忘记在启动 RPi 之前打开显示器,以便它可以检测到正确的 HDMI 或复合输出端口。
3) RPi 有一个不错的 "raspi-config" 屏幕,您将在首次启动时看到。对于家庭服务器,以下选择将很有用
-
expand_rootfs:调整默认的 2GB 操作系统镜像大小以填充闪存卡的其余部分。
-
change_pass:默认密码是 "raspberry",但比这更安全的密码会更好。
-
设置您的区域设置和时区。
-
memory_split:为 GPU 分配尽可能小的量 (16),以尽可能多地为服务留下空间。
-
SSH:不要忘记启用 SSH 服务器。
-
boot_behaviour:关闭启动到桌面(同样,为了为您的服务节省内存)。
完成后,您将看到 pi@raspberrypi
提示符。可以随时通过 sudo raspi-config
重新运行设置脚本。
还有一些配置项,然后操作系统就可以使用了。
1) 静态 IP 使一切变得更容易,因此切换 eth0 的网络设置
>> sudo nano -w /etc/network/interfaces
将 eth0 行 iface eth0 inet dhcp
更改为以下内容(修改以满足您的家庭网络设置)
======/etc/network/interfaces======
...
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
...
======/etc/network/interfaces======
2) 创建本地用户,并将其放入 users 和 sudo 组
>> sudo adduser YOURUSERIDHERE
>> sudo usermod -a -G users YOURUSERIDHERE
>> sudo usermod -a -G sudo YOURUSERIDHERE
3) 更新系统以确保它拥有所有库的最新版本
>> sudo apt-get update; sudo apt-get upgrade
4) 此时,您已准备好进行无头操作!关闭 PI
>> sudo /sbin/shutdown -h now
一旦它关闭(监控 RPi 电路板上的绿色状态 LED 以了解它何时完成关闭),拔下显示器、键盘、鼠标和电源线。连接 USB 存储,然后重新插入电源以重启 RPi。
5) 一旦 RPi 启动(同样,这些绿色 LED 是其状态的线索),您可以从网络上的任何其他机器 ssh
连接到 RPi,并从此处远程完成所有配置(修改以下内容以适应您的静态 IP)
>> ssh YOURUSERIDHERE@192.168.1.10
恭喜,您拥有一个可用的树莓派!
外围设备首要任务是挂载外部存储设备。使用 dmesg
查找存储设备的位置——它几乎肯定会是 /dev/sda。我喜欢使用 automounter 来处理挂载可移动存储设备,因为它在处理启动时可能不存在或未就绪的设备方面更加灵活
>> sudo apt-get install autofs
>> sudo nano -w /etc/auto.master
======/etc/auto.master======
...
/misc /etc/auto.misc
...
======/etc/auto.master======
>> sudo nano -w /etc/auto.misc
注意,我的外部存储设备使用 ext4 格式化——如果需要,请根据您的需求进行修改
======/etc/auto.misc======
...
storage -fstype=ext4 :/dev/sda1
...
======/etc/auto.misc======
>> sudo /etc/init.d/autofs restart
>> ls -lat /misc/storage
可选地,创建一个符号链接以缩短路径
>> ln -s /misc/storage /storage
备份存储库
任何家庭服务器功能列表的首位都是提供坚如磐石的备份。借助 RPi,这非常简单,这要归功于 Linux 中广泛的网络共享选项:适用于 Windows 机器的 Samba/CIFS、适用于基于 UNIX 的设备的 NFS,甚至适用于更高级备份客户端(如 deja-dup)的 SFTP。由于 RPi 只有 100Mb 以太网,并且存储设备位于 USB 上,因此它不会有超快的传输速度。另一方面,良好的备份客户端会自动在后台运行,因此您不太可能注意到稍慢的传输速度。
我的家庭网络包括一台 Windows 7 机器。对于它,我通过 Samba 导出了 RPi 外部 USB 存储设备上的备份目录。由于基本版本的 Windows 7 中的备份实用程序不支持网络驱动器作为备份目标,因此我使用了 SyncBack Free 来设置自动化的每日备份。
配置 Samba 很简单。
1) 安装 samba 和 common-bin 库(其中包含 smbpasswd 实用程序)
>> sudo apt-get install samba samba-common-bin
2) 使用 smbpasswd
让您的本地 ID 拥有访问权限
>> sudo smbpasswd -a YOURUSERIDHERE
3) 编辑 samba 配置文件
>> sudo nano -w /etc/samba/smb.conf
4) 更改 workgroup = WORKGROUP
行以匹配您的 Windows 工作组名称。
5) 注释掉或删除 [homes] 和 [printers] 共享。(打印机共享稍后将通过直接 CUPS 访问完成。)
6) 为 Windows 备份路径添加一个条目。这是我的示例,我将其放在文件的底部
======/etc/samba/smb.conf======
...
[win7pc]
comment=Backup for windows PC
path=/storage/win7pc
writeable=Yes
create mask=0777
directory mask=0777
browsable=Yes
public=Yes
valid users=YOURUSERIDHERE
...
======/etc/samba/smb.conf======
7) 重启 Samba 以实施您的编辑
>> sudo /etc/init.d/samba restart
8) 通过从文件资源管理器映射网络驱动器来测试来自 Windows 机器的连接。
对于 Linux 设备,deja-dup 设置和使用起来非常简单。它已默认安装在我的 Fedora 18 和 Ubuntu 12.10 安装中。虽然软件包名称是 "deja-dup",但前端简称为 "Backup"。虽然 RPi 可以轻松支持 NFS 导出,但我发现使用 deja-dup 的 SSH 选项更简单且更具可移植性,并且它消除了对 RPi 上额外服务的需求。指定 deja-dup 加密密码可能是一个好主意,除非您喜欢所有文件在有人偷走存储驱动器时被泄露的想法
>> sudo mkdir /storage/linuxlaptop
>> sudo chown -R YOURUSERIDHERE:YOURUSERIDHERE /storage/linuxlaptop
从客户端 Linux 机器,启动备份实用程序,选择 "SSH" 作为备份位置,然后输入 RPi 的 IP 地址和您刚创建的存储位置。首次备份会很慢,但未来的运行将仅发送增量更改,这会快得多。

图 2. Deja-dup 客户端设置
多媒体服务器:DLNA现在每个人的文件都已安全备份,让我们继续进行一些有趣的事情!DLNA 服务器将为您提供一个集中位置来存储您的电影、音乐和图片。从这个中央存储库,家中每个屏幕的 DLNA 客户端都可以轻松播放此内容。
至少,这就是承诺。现实情况是,DNLA 规范并没有完全确定许多重要的事情,例如支持哪些格式或编码。每个客户端通常对它希望支持的格式和服务器功能有稍微不同的想法。功能更强大的服务器可能能够在运行时将本地内容转码为设备支持的格式,但这在 RPi 上是不可能的,并且运行时转码通常会弄乱暂停、快进和倒带等其他功能。一般来说,像 PS3、Xbox 和 WD TV 设备这样的功能更强大的设备可以处理大多数格式,而无需任何转码。像智能电视或蓝光播放器这样的低端设备支持的代码列表要有限得多。
对于 RPi,最好的选择是简单地编码为您的主要 DLNA 设备支持的标准,然后测试您的其他 DLNA 客户端。如果它们不能很好地播放,下一节中的提示可能会有所帮助。在我的情况下,我的 PlayStation 3 充当 DLNA 客户端,它可以很好地播放 Handbrake 生成的紧凑型 .m4v 文件。
Minidlna 是 RPi DLNA 服务器的绝佳选择。它已经包含在 Raspbian 发行版中,设置非常简单,并且在运行时使用最少的服务器资源
>> sudo apt-get install minidlna
>> sudo nano -w /etc/minidlna.conf
以下是我的 /etc/minidlna.conf 的相关部分
...
# I found keeping video + audio in different paths helpful
media_dir=V,/storage/dlna/video
media_dir=A,/storage/dlna/music
...
presentation_url=http://192.168.1.10:8200/
...
friendly_name=MyRPi
...
# Since I add new media infrequently, turning off
# inotify keeps minidlna for polling for
# content changes. It's simple enough to run
# sudo /etc/init.d/minidlna force-reload
# when new content is added.
inotify=no
完成编辑后,告诉 minidlna 重启并重新扫描内容
>> sudo /etc/init.d/minidlna force-reload
Minidlna 能够为支持它的设备(如 PS3)提供电影海报缩略图。当滚动浏览数十个电影文件时,它可以更方便地找到特定电影。我发现最兼容的文件布局是每个电影一个目录,仅包含电影文件加上名为 "Cover.jpg" 的缩略图图像。使用像 "MovieName.m4v" 和 "MovieName.jpg" 这样的格式对于 PS3 来说效果很好,但它会破坏 VLC(如果您能说服 VLC uPNP 插件首先找到服务器)。
从 PS3,您可以通过转到 XMB 栏上的 "视频" 来测试连接。当在视频部分向下滚动时,您之前设置的 "friendly_name" 应该可见。如果您找不到它,请通过使用 Web 浏览器转到 http://192.168.1.10:8200/ 来测试以确保 Minidlna 正常运行。
非 DLNA 设备的多媒体一旦您让 DNLA 与您的某些设备一起工作,您可能会发现它不想与之一起工作的设备,因此多媒体计划 B 是一个好主意。nginx Web 服务器有一个 MP4 插件,它试图改进通过普通 HTTP 的流式传输,但浏览器播放性能差异很大,并且电影中的快进也无法始终如一地工作。对于跨挑剔或非 DLNA 设备的媒体共享,最低公分母似乎是具有访客只读访问权限的良好老式 Samba 共享。
以下是 /etc/samba/smb.conf 中的示例部分
[dlna]
path=/storage/dlna
read only=yes
browsable=yes
public=yes
在定义共享并重启 Samba(sudo /etc/init.d/samba restart
)后,您可以开始测试您的客户端。
我使用 Handbrake 编码为 m4v 文件的视频组合测试了以下客户端
-
Android 4.0.4 手机:“ES 文件浏览器”与 “ES 媒体播放器”(播放器随安装包提供)。
-
Android 4.1.2 平板电脑:“ES 文件浏览器”与 “ES 媒体播放器”(播放器随安装包提供)。
-
Linux 设备:automount ://192.168.1.10/dlna,然后使用 VLC 或 MPlayer。
-
Windows:挂载 //192.168.1.10:/dlna,然后使用 VLC。
所有设备都能够几乎立即开始播放并且快速前进,没有延迟。
打印服务器RPi 可以很好地运行 CUPS,因此很容易共享没有本地网络功能的旧打印机。
安装 CUPS 和打印机所需的任何软件包。由于我有一台 HP 喷墨打印机,所以我需要 hplip-cups
>> sudo apt-get install cups hplip-cups
更新 “Listen” 行,并将 Allow @LOCAL
代码块添加到 Location 指令中,如下所示(这样您就可以使用 LAN 上的其他机器来管理 CUPS)
======/etc/cups/cupsd.conf======
#Listen localhost:631 #Comment this out
Listen 192.168.1.10:631 #Add this line
...
<Location />
Order allow,deny
Allow @LOCAL
</Location>
# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow @LOCAL
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow @LOCAL
</Location>
======/etc/cups/cupsd.conf======
将您的本地 ID 添加到 lpadmin 组,以便您可以管理 CUPS
>> sudo usermod -a -G lpadmin YOURUSERIDHERE
重启 CUPS
>> sudo /etc/init.d/cups restart
然后,转到 http://192.168.1.10:631/ 并点击 “添加打印机和类” 以设置您的打印机。我的打印机在 USB 上自动发现,所以我所要做的就是点击 “共享”。还要访问 https://192.168.1.10:631/admin,并确保选中 “共享连接到此系统的打印机”。
完成后,您可以像往常一样设置您的客户端。我的 Linux 客户端在输入主机名后自动发现了打印机并选择了正确的打印机驱动程序。在我的 Windows 7 机器上,一旦我选择 “网络打印机”,我必须点击 “我想要的打印机未列出”,选择 “按名称选择共享打印机”,然后输入来自 CUPS Web 界面的 URL:http://192.168.1.10:631/printers/HP_J4500。
结论只需最少的额外硬件和配置,树莓派就可以成为功能强大、紧凑的家庭服务器。它可以将 Linux 提供的各种企业级服务带入家庭环境,而硬件成本极低。