用树莓派作为 nas 还是不错的,连续运行几十天了没有任何异常

前提

首先保证树莓派运行 Raspbian 系统正常,并将空间扩展至整张 SD 卡,需要安装各种软件以防空间不够
操作树莓派直接使用 ssh 就可以了,不需要显示器的

在进行操作之前,最好先更新一下软件源

sudo apt-get update

然后再更新一下软件(非必须)

sudo apt-get upgrade

准备硬盘

若需要组建 raid1, 可看我写的另一篇文章《Debian 组建软 RAID 1 磁盘阵列

最好使用隔离式带电源的 USB HUB, 保护硬盘也保护树莓派

如果硬盘是 NTFS 格式的,那么需要安装 ntfs-3g 模块或者将硬盘格式化为 ext4 格式。

  • 安装 ntfs-3g 模块,就能读写 ntfs 格式了。不安装的话只能读,但是不能写

    sudo apt-get install ntfs-3g
    
  • 格式化硬盘为 ext4 格式

    1. 查看硬盘的内核名称,其中的 “/dev/mmcblk0” 指的是树莓派中的 SD 卡,而 “/dev/sda” 一般就是指硬盘了

      sudo fdisk -l
      
    2. 按照提示对硬盘进行进行分区

      sudo fdisk /dev/sda
      
    3. 将硬盘分区格式化为 ext4 格式,格式化之前必须先卸载硬盘,使用 umount 命令即可

      sudo mkfs.ext4 /dev/sda1
      

开机自动挂载硬盘

  1. 先挂载一下硬盘,修改权限,要不然我们的 pi 可是写不了的
    ext4 格式是可以记录权限信息的,所以修改一次下次挂载 pi 就可以写了
    ntfs 格式的话,挂载的时候指定 uid=pi,gid=pi 就可以了,直接看第2步

    mkdir /home/pi/nas-data
    sudo mount /dev/sda1 /home/pi/nas-data
    sudo chown pi:pi /home/pi/nas-data
    
  2. 查看硬盘的 uuid

    $ sudo blkid
    /dev/sda1: UUID="d5a3d30a-d2e7-4b12-bb31-b4439c5db200" TYPE="ext4"
    
  3. 编辑 sudo vim /etc/fstab 文件,在末尾加入以下内容,文件格式说明请看 man fstab 或者《配置启动挂载

    UUID=d5a3d30a-d2e7-4b12-bb31-b4439c5db200       /home/pi/nas-data   ext4    defaults    0       2
    

    如果是 ntfs 格式,如下

    UUID=588650B08650907C   /home/pi/nas-data   ntfs    gid=pi,uid=pi,dmask=002,fmask=113   0   0
    

安装并配置 Samba

首先安装 samba

sudo apt-get install samba samba-common-bin

然后配置 samba

  1. 备份配置文件,备份是个好习惯

    sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
    
  2. 编辑配置文件 sudo vim /etc/samba/smb.conf , 做如下修改

    # 找到 "#   security = user" 这一行,将前面的"#"去掉,修改后内容如下
        # 使用本地用户来登陆
        security = user
    
    # 在末尾加入如下内容
    # 分享名称
    [nas]
        # 说明信息
        comment = NAS Storage
        # 要问我为啥多加了个 nas-data,因为我把 ext4 格式的硬盘挂载在 /home/pi/nas-data 下
        # ext4 文件系统会在根目录下产生 lost+found 文件夹,看着烦,就让它“消失了”(多加一层目录)
        # 共享文件的路径
        path = /home/pi/nas-data/nas-data
        # 可被其他人看到资源名称(非内容)
        browseable = yes
        # 可写
        writable = yes
        # 新建文件的权限为 664
        create mask = 0664
        # 新建目录的权限为 775
        directory mask = 0775
    

    可以把配置文件中你不需要的分享名称删除,例如 [homes], [printers] 等

  3. 测试配置文件是否有错误,"[ ]“之前的为错误信息,根据提示做相应修改

    $ testparm
    rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
    Processing section "[nas]"
    Loaded services file OK.
    ...
    

    出现 rlimit_max 这个问题,一搜发现出现这个问题的很多啊,摘录一个回答

    It’s a warning, you can safely ignore it. Windows 7 clients need to have exactly the same number of open handles available as Windows servers, else it fails in some file copy situations with a “out of handles” message. Samba has taken care of it for you, but it’s just letting you know your fd limit is set a bit low.
    ——Jeremy

    既然这样,那就把这个提示忽略吧

  4. 给 samba 添加用户并创建密码(登陆 samba 用的),其中的用户必须是 linux 已存在的用户

    sudo smbpasswd -a pi
    
  5. 配置好后,使用如下命令重启 samba 服务

    sudo /etc/init.d/samba restart
    

到这里,各个设备应该都可以访问了,大功告成?
还差点,下面进行测试

测试 Samba

我的网络拓扑结构如下:
linux 主机 <--无线--> 300M 路由器 <--网线--> 树莓派

打开 linux 主机,首先挂载好 samba (可用 smbclient -L [raspberrypi ip] 查看树莓派分享的资源)

sudo mount -t cifs //192.168.1.2/nas /mnt -o username=pi,password=raspberry

分别在路由器附近和工作地点测试(距离路由器10米左右,穿过2堵墙)

  • 路由器附近

    向树莓派写入文件,四次测试分别为 10.0 MB/s, 9.8 MB/s, 10.1 MB/s, 10.0 MB/s
    平均 9.975 MB/s
    samba-速度测试

    从树莓派中读取文件,四次测试分别为 10.2 MB/s, 10.2 MB/s, 10.2 MB/s, 10.2 MB/s
    平均 10.2 MB/s
    samba-速度测试

  • 工作地点

    向树莓派写入文件,四次测试分别为 6.8 MB/s, 6.9 MB/s, 6.8 MB/s, 6.9 MB/s
    平均 6.85 MB/s
    samba-速度测试

    从树莓派中读取文件,四次测试分别为 8.7 MB/s, 8.2 MB/s, 8.0 MB/s, 8.7 MB/s
    平均 8.4 MB/s
    samba-速度测试

100 以太网卡能有这样的速度已经相当不错了
距离路由器近的话性能瓶颈在树莓派的以太网卡,算它 9MB/s,相当于 72Mbps,播放蓝光原盘肯定是没有问题的,本来想下部电影来试试的,可惜某些站点最近上不去了,而我又没存货
手头有部 10G 的电影,在工作地点测试,播放完全没有问题,拖动进度条也能瞬间反应

按我家的情况来说,就算把树莓派换成千兆网卡,还是那个速度,树莓派是够用的了


以下纯属理论上的 YY,没设备来验证

难道树莓派就被百兆网卡耍着玩,认命了吗?
树莓派沉思了一下,不对啊,我明明是被折腾的命
拼了,外接一个千兆 USB 网卡,那到底有没有用呢?不说别的,CPU 就受不了
当然树莓派的 IO 性能也是个瓶颈,先来张图吧,树莓派功能模块之间的关系
Raspberrypi block function
其中的 USB hub 和 Ethernet 应该就是 LAN9512 芯片,不管如何,网卡和硬盘是连在一个 USB hub 上的
那么这个 USB hub 的 IO 性能如何呢,可用 dd if=/dev/sda of=/dev/null bs=32M count=10 iflag=direct 这个命令测试,大概是 31 MB/s
所以,假设树莓派啥都不干,只通过硬盘和网卡传输数据,最大也就 15MB/s 的样子,150M 网卡就是极限了。等等,既然是折腾嘛,那就继续吧。别忘了你还有 SD 卡,这可没连在 USB hub 上哦,直接和 soc 相连的,读取速度算它 20M/s 吧。综合起来看,SD 卡和硬盘同时读取数据,网卡负责传输数据。理想情况下,SD 卡 20M/s,硬盘 5M/s,网卡 25M/s,实际网络传输速度 25M/s。上 300M 网卡应该可以试试,好像也没谁那么蛋疼吧。如果你的树莓派还充当无线 AP,那么 300M 网卡也是可以的

FTP 服务器安装及配置

安装 vsftpd 软件,全名 very secure FTP daemon

sudo apt-get install vsftpd

备份配置文件

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

创建这个文件,下面有说为什么创建它 sudo touch /etc/vsftpd.chroot_list
修改配置文件 sudo vim /etc/vsftpd.conf

# 不允许匿名者登陆
anonymous_enable=NO
# 允许本地用户登陆
local_enable=YES
# 允许用户上传数据
write_enable=YES
# 本地用户上传文件权限为 664, 文件夹为 775
local_umask=002
# 使用本地时间
use_localtime=YES
# 本地用户启用 chroot, 意思就是,根被改变为用户的家目录,就进不去其它目录了,当然是为了安全了
chroot_local_user=YES
chroot_list_enable=YES
# 在这个列表中的账号不进行 chroot, 即使没有账号也必须要有 "/etc/vsftpd.chroot_list" 这个文件
chroot_list_file=/etc/vsftpd.chroot_list

# 只列出了一些的配置,还有很多可查看配置文件内部的说明,更详细请 "man 5 vsftpd.conf"

但是问题来了,从 vsftpd 2.3.5 开始,chroot 目录必须为不可写
最简单的解决办法就是 sudo chmod ugo-w /home/pi (对于系统默认的 pi 用户来说)
但是这样又出现新问题了,家目录变成不可写了,如果你没必要在家目录里写的话那也无所谓,但如果要写呢?

这里提供一个办法,而不改变原来用户家目录
新建一个用户 ftppi, 将它的家目录变为不可写,且 pi 和 ftppi 属于同一个组 pi,实现协作编辑。我们上传下载使用这个目录 /home/pi/nas-data/nas-data,也是我们配置 samba 共享所使用的目录,详情见上上个标题《安装并配置 Samba
如果你不想让父母修改 /home/pi/nas-data/nas-data 中的文件,但是要能读取。可以新建一个用户 ftpparents, 不将 ftpparents 用户加入组 pi 就可以了。因为 nas-data 中的文件对于除 pi 和 ftppi 用户之外的用户是只读的
因 Raspbian 系统默认 umask 为 022, 所以需要一些额外的操作

  1. 新建一个用户 ftppi, 家目录为 /home/pi/nas-data, 指定所属组 pi

    sudo useradd -d /home/pi/nas-data -g pi ftppi
    
  2. 创建 ftppi 用户的密码

    sudo passwd ftppi
    
  3. 如果不允许 ftppi 账户登陆系统,但是能用 ftp, 做如下修改

    • sudo vim /etc/passwd, 找到 “ftppi” 这一行,将最后的 “/bin/bash” 改为 “/bin/false”
    • sudo vim /etc/shells, 添加一行 “/bin/false”
  4. 将家目录变为不可写
    /home/pi/nas-data 不可写,/home/pi/nas-data/nas-data 可写(实际我们要用的是这个目录)

    sudo chmod 555 /home/pi/nas-data
    
  5. 将 pi 用户的 umask 修改为 002, 只有 pi 用户登陆才有效,系统才会去执行 “/home/pi/.profile” 这个脚本
    sudo vim /home/pi/.profile, 添加一行 “umask 002”
    这样新建文件权限为 664,而 pi 和 ftppi 同属于 pi 组,即可相互编辑文件

  6. 修改 /home/pi/nas-data 文件夹内所有文件权限为 664, 文件夹权限为 775

    find /home/pi/nas-data/ -type f -print0 | xargs -0 chmod 664
    find /home/pi/nas-data/ -type d -print0 | xargs -0 chmod 775
    

以上步骤完成后,即实现了 pi 和 ftppi 可共同编辑 /home/pi/nas-data/nas-data 目录下的文件
一般情况下用 ftppi 登陆 ftp 就可以了
顺便一说,umask 为 002,方便团队协作;umask 为 022 看上去貌似是 owner, 只有自己私有(组用户和其它用户不可写)

aria2 安装及配置 + web 前端 + 迅雷离线

aria2 安装及配置

关于这软件就不多说了,太有名了,总之占用资源少且非常好用
下面来安装 aria2

  1. 直接用 apt-get 安装的话,版本比较老(aria2 version 1.15.11),可自行编译最新版

    sudo apt-get install aria2
    

    或者改变 apt-get 的源来安装比较新的版本

    sudo vim /etc/apt/sources.list
    

    将 deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
    改为 deb http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi
    然后更新源并安装新版的 aria2

    sudo apt-get update
    sudo apt-get install aria2
    

    若继续用稳定版的系统及其它软件的话,记得把源改回来

  2. 创建 aria2 配置文件 “/home/pi/.aria2/aria2.conf” 和 “/home/pi/.aria2/aria2.session” 这个文件 (我是以 pi 账户启动 aria2 的),
    命令是 mkdir /home/pi/.aria2, touch /home/pi/.aria2/aria2.sessionvim /home/pi/.aria2/aria2.conf 配置文件内容如下,只是参考

    # 基本配置
    # 下载目录
    dir=/home/pi/nas-data/nas-data/Inbox
    # 下载从这个文件中找到的 urls, 需自己建立这个文件
    # touch /home/pi/.aria2/aria2.session
    input-file=/home/pi/.aria2/aria2.session
    # 最大同时下载任务数,默认 5
    max-concurrent-downloads=3
    # 断点续传,只适用于 HTTP(S)/FTP
    continue=true
    
    # HTTP/FTP 配置
    # 关闭连接如果下载速度等于或低于这个值,默认 0
    lowest-speed-limit=0
    # 对于每个下载在同一个服务器上的连接数,默认 5
    max-connection-per-server=5
    # 每个文件最小分片大小,例如文件 20M,设置 size 为 10M, 则用2个连接下载,默认 20M
    min-split-size=10M
    # 下载一个文件的连接数,默认 5
    split=5
    
    # BT 特殊配置
    # 启用本地节点查找,默认 false
    bt-enable-lpd=true
    # 指定最大文件数对于每个 bt 下载,默认 100
    bt-max-open-files=100
    # 单种子最大连接数,默认 55
    bt-max-peers=55
    # 设置最低的加密级别,可选全连接加密 arc4,默认是头加密 plain
    bt-min-crypto-level=plain
    # 总是使用 obfuscation handshake,防迅雷必备,默认 false
    bt-require-crypto=true
    # 如果下载的是种子文件则自动解析并下载,默认 true
    follow-torrent=true
    # 为 BT 下载设置 TCP 端口号,确保开放这些端口,默认 6881-6999
    listen-port=6881-6999
    # 整体上传速度限制,0 表示不限制,默认 0
    max-overall-upload-limit=0
    # 每个下载上传速度限制,默认 0
    max-upload-limit=0
    # 种子分享率大于1, 则停止做种,默认 1.0
    seed-ratio=1
    # 做种时间大于2小时,则停止做种
    seed-time=120
    
    # RPC 配置
    # 开启 JSON-RPC/XML-RPC 服务,默认 false
    enable-rpc=true
    # 允许所有来源,web 界面跨域权限需要,默认 false
    rpc-allow-origin-all=true
    # 允许外部访问,默认 false
    rpc-listen-all=true
    # rpc 端口,默认 6800
    rpc-listen-port=6800
    # 设置最大的 JSON-RPC/XML-RPC 请求大小,默认 2M
    rpc-max-request-size=2M
    # rpc 密码,可不设置
    rpc-passwd=raspberry
    # rpc 用户名,可不设置
    rpc-user=aria2pi
    
    # 高级配置
    # This is useful if you have to use broken DNS and
    # want to avoid terribly slow AAAA record lookup.
    # 默认 false
    disable-ipv6=true
    # 指定文件分配方法,预分配能有效降低文件碎片,提高磁盘性能,缺点是预分配时间稍长
    # 如果使用新的文件系统,例如 ext4 (with extents support), btrfs, xfs or NTFS(MinGW build only), falloc 是最好的选择
    # 如果设置为 none,那么不预先分配文件空间,默认 prealloc
    file-allocation=falloc
    # 整体下载速度限制,默认 0
    max-overall-download-limit=0
    # 每个下载下载速度限制,默认 0
    max-download-limit=0
    # 保存错误或者未完成的下载到这个文件
    # 和基本配置中的 input-file 一起使用,那么重启后仍可继续下载
    save-session=/home/pi/.aria2/aria2.session
    # 每5分钟自动保存错误或未完成的下载,如果为 0, 只有 aria2 正常退出才回保存,默认 0
    save-session-interval=300
    
    # 若要用于 PT 下载,需另外的配置,这里没写
    

    什么你配置得还不过瘾,请移步《官方配置文档》,看完记得过来指正我这个配置的不当之处,我表示我只看了一部分

  3. 运行 aria2, 测试配置是否有错误

    aria2c --conf-path=/home/pi/.aria2/aria2.conf
    
  4. 为 aria2 添加自启动服务

    1. 新建 sudo vim /etc/init.d/aria2 文件,输入以下内容

      #!/bin/sh
      ### BEGIN INIT INFO
      # Provides:          aria2
      # Required-Start:    $remote_fs $network
      # Required-Stop:     $remote_fs $network
      # Default-Start:     2 3 4 5
      # Default-Stop:      0 1 6
      # Short-Description: Aria2 Downloader
      ### END INIT INFO
      
      USER=pi
      CONF=/home/pi/.aria2/aria2.conf
      
      case "$1" in
      start)
          echo "Start aria2c"
          umask 0002
          su - $USER -c "aria2c --conf-path=$CONF -D"
          ;;
      stop)
          echo "Stopping aria2c, please wait..."
          killall -w aria2c
          ;;
      restart)
          echo "Stopping aria2c, please wait..."
          killall -w aria2c
          echo "Start aria2c"
          umask 0002
          su - $USER -c "aria2c --conf-path=$CONF -D"
          ;;
      *)
          echo "$0 {start|stop|restart|status}"
          ;;
      esac
      exit
      

      本来我新建的是 /etc/init.d/aria2c 文件,但是其中的 killall -w aria2c, 这用的是字符串匹配,不光 kill 了 aria2c 还把脚本本身给 kill 了,所以我把脚本文件名改成了 aria2

    2. 赋予可执行权限

      sudo chmod 755 /etc/init.d/aria2
      
    3. 测试服务是否可以启动

      sudo service aria2 start
      

      如果出现 “Start aria2c”, 而没有其它错误的话,表示服务可以正常启动

    4. 使 aria2 服务自动运行,其中当然也包括了开机运行

      sudo update-rc.d aria2 defaults
      

web 前端的配置 yaaw 和 webui-aria2

yaaw 和 webui-aria2 都是不错的,yaaw 界面简洁,wubui-aria2 功能强大,可以根据自己的喜好来选择,或者两个同时使用也可以

首先保证 aria2c 正常运行着,然后进行下面的动作

YAAW

  1. YAAW, 这是 yaaw 的主页,打开它
  2. 打开左边的 Live Demo 链接
  3. 点击右上角的小扳手,在 JSON-RPC Path 中填入 “http://raspberrypi-ip:6800/jsonrpc”
    如果设置了 rpc 密码,那么填入 “http://user:passwd@raspberrypi-ip:6800/jsonrpc”

yaaw


webui-aria2

  1. webui-aria2, 这是 webui-aria2 的主页,打开它
  2. 在其中找到这个链接 http://ziahamza.github.com/webui-aria2/, 打开
  3. 点击 “Settings” - “Connection Settings”, 一看你就明白了

webui-aria2

以上两个工具都是用 HTML/CSS/Javascirpt 写的,你也可以下载下来,扔到网页服务器,本地服务器虚拟主机随你玩

常见问题

若无法连接到 web 前端,请手动访问你的 JSON-RPC 地址 http://raspberrypi-ip:6800/jsonrpc?jsoncallback=1, 如果没有返回,请确认 aria2 是否启动以及连通性
如果是从外网访问的, 别忘记在路由器上做好 ddns 和端口映射

迅雷离线下载

ThunderLixianExporter, 将迅雷离线地址导出成 aria2/wget 等下载命令的工具
ThunderLixianAssistant, 这个项目是上个项目在 chrome 上的一个封装
以上两个工具使用方法在主页中已经说的很详细了,就不多说了
导出功能没有一个个去试,实测导出 yaaw 可用

aria2 出现问题的解决方法

有读者反馈,aria2 出问题还蛮多的,我就写一点解决的方法

若 yaaw 无法使用,首先看看 aria2 是否启动以及连通性,前面不远处有说明

还有一些是 aria2 本身出现了问题,这里面出现问题的可能性就多了,我只是说一下检测问题的方法,知道了问题之后,google 一下就能解决了

  1. 首先把 aria2 进程关闭,使用命令 sudo killall -w aria2c
  2. 使用 aria2c --conf-path=/home/pi/.aria2/aria2.conf 命令来运行 aria2
  3. 这样就能看到 aria2 的反馈,可能会出现一些 [ERROR] 提示,这样你就知道问题具体出现在哪里了

磁盘阵列 RAID1 与异地备份

一个硬盘,不管它来自什么厂商,也不管它是机械的还是固态的,它出现故障只是时间早晚的问题
一个人,不管 TA 来自什么地方,也不管 TA 是男的还是女的,TA 总有误操作的时候
我就不信你们没有丢过一点数据!

既然问题摆在面前那怎么办呢?

  • 我觉得对于实时更新的重要数据至少本地 raid + 异地备份
  • 对于需要永久保存的数据来说至少异地备份

最好还要加上版本控制功能
当然你还得注意硬盘的健康状况,真的是比人还要脆弱
btrfs 文件系统的一些特性非常不错,快照,克隆,字卷,校验等,不知道现在稳定到什么程度了,听说上个月在最新的 Linux 稳定版内核 3.12 中被修改成了 stable, 有时间去试一试

这篇文章比较长,关于如何在树莓派上组建磁盘阵列 raid1, 我另外写了一篇文章《Debian 组建软 RAID 1 磁盘阵列


下面就来说说怎么异地备份吧,使用 rsync 工具, 且通过 ssh 传输,比较安全
在本地主机上(将树莓派中的数据备份到这个机子)操作

  1. 首先创建公钥和私钥,一路回车就可以了。假设生成为 “~/.ssh/id_rsa” 和 “~/.ssh/id_rsa.pub”

    ssh-keygen -t rsa
    
  2. 将私钥加入 ssh-agent

    ssh-add ~/.ssh/id_rsa
    
  3. 将公钥复制到树莓派上

    ssh-copy-id [email protected]
    
  4. 执行下面的命令,作用是:保存所有文件属性与权限,删除 dst 中 src 没有的文件(传输结束以后再删除),通过 ssh 将 192.168.1.2 机子中 “/home/pi/nas-data/nas-data/save/” 目录备份到本地主机 “/home/mwum/save/” 目录,并且显示详细信息

    rsync -av -delete-after -e ssh [email protected]:/home/pi/nas-data/nas-data/save/ /home/mwum/save/
    

如果需要定时执行备份,方法如下

  1. 编辑当前用户的任务

    crontab -e
    
  2. 例如加入一行,表示每天凌晨2点自动备份

    0 2 * * * rsync -av -delete-after -e ssh [email protected]:/home/pi/nas-data/nas-data/save/ /home/mwum/save/
    

    基本格式,共 6 列,如下
    分钟(0-59) | 小时(0-23) | 日期(1-31) | 月份(1-12) 星期(0-6, 0 表示星期日) | 命令

如果是通过外网访问,也是一样的,把 ip 改一下就可以了
若没有固定的公网 ip, 请使用 ddns; 若使用了路由器,请设置端口映射

不知不觉写那么多了,就告一段落吧,为啥是今天呢,是一部动画完结的日子