玩转树莓派-搭建家庭NAS

编程/技术 更新时间: 2019-11-30 @ 11:46:56 创建时间: 2019-11-22 @ 08:37:51 浏览数: 81 净访问: 53 By: skyrover

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议


5年前买了一个WD的移动硬盘,基本上是闲置状态,刚好最近在搞树莓派,那么就用它做一个家庭NAS(Network Attached Storage)吧。

连接并挂载硬盘

我的树莓派是3B,移动硬盘是1TB,直接连上就识别出来了,很方便。

pi@raspberrypi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        13G  4.7G  7.4G  39% /
devtmpfs        458M     0  458M   0% /dev
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           462M   12M  450M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           462M     0  462M   0% /sys/fs/cgroup
/dev/mmcblk0p6   65M   21M   45M  33% /boot
tmpfs            93M     0   93M   0% /run/user/1000
/dev/sda1       932G   41G  892G   5% /media/pi/Elements
/dev/mmcblk0p5   30M  398K   28M   2% /media/pi/SETTINGS

这里如果移动硬盘是NTFS的文件系统,那么就需要多几个步骤,首先可以通过parted命令来查看硬盘是什么文件系统:

pi@raspberrypi:/mnt $ sudo parted /dev/sda1
GNU Parted 3.2
Using /dev/sda1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

在此键入print list,可以获取到硬盘详细信息,里面就包含了文件系统:

Model: Unknown (unknown)
Disk /dev/sda1: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags: 

Number  Start  End     Size    File system  Flags
 1      0.00B  1000GB  1000GB  ntfs


Model: WD Elements 10B8 (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1000GB  1000GB  primary  ntfs


Model: SD 00000 (sd/mmc)
Disk /dev/mmcblk0: 15.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  1690MB  1689MB  primary   fat32        lba
 2      1690MB  15.7GB  14.0GB  extended
 5      1690MB  1724MB  33.6MB  logical   ext4
 6      1724MB  1793MB  69.2MB  logical   fat32        lba
 7      1795MB  15.7GB  13.9GB  logical   ext4


(parted)

如果是NTFS那么就需要ntfs-3g这个软件来让树莓派可以读取NTFS格式。

#安装所需软件包
sudo apt-get install ntfs-3g
#加载内核模块
modprobe fuse

创建挂载点,并且挂载硬盘:

sudo mkdir /mnt/nas1
#编辑fstab让移动硬盘开机自动挂载
sudo vim /etc/fstab
#在最后一行添加如下内容
/dev/sda1 /mnt/nas1 ntfs-3g defaults,noexec,umask=0000 0 0
#保存重启,即可生效

如果没有重要数据,也可以将硬盘重新格式化为Linux支持的ext4文件系统:

umount /dev/sda1
sudo mkfs -t ext4 /dev/sda1

注意:下面这块是有问题的

# 同样加入/etc/fstab
/dev/sdb1 /mnt/nas1 ext4 defaults 0 0
# 重启生效

上面这个ext4加入fstab出现了问题,导致树莓派没法启动了,估计是fstab改错了。。只能连上显示器,键盘鼠标,然后重启按住shift进入recovery模式,然后在配置的cmdline.txt最后加入init=/bin/sh,然后退出重启,之后会进入到紧急模式,这里发现根本没法进行写入,因为整个根目录都是只读,所以使用mount -o remount rw /将根目录重新挂载为可读写,然后修复/etc/fstab,将错误的地方删除,重启后继续shift进入recovery模式把cmdline.txt加入的init=/bin/sh删掉,然后重启就正常了。

以后修改完/etc/fstab一定要mount -a试一下,要不然这样成本太高了。。

正确mount的姿势

首先查看硬盘格式: sudo blkid,会有类似下面的输出

/dev/sda1: UUID="xxx" TYPE="ext4" PARTUUID="f804f8da-01"

可以看到我的硬盘在/dev/sda1上,UUID是xxx

下来建立挂载点,并且设置权限

sudo mkdir /mnt/nas1  # nas1是自己取的名字
sudo chown pi:pi /mnt/nas1

挂载: sudo mount -t ext4 /dev/sda1 /mnt/nas1

确认挂载: df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        13G  5.6G  6.5G  47% /
devtmpfs        426M     0  426M   0% /dev
tmpfs           430M     0  430M   0% /dev/shm
tmpfs           430M   13M  418M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           430M     0  430M   0% /sys/fs/cgroup
/dev/mmcblk0p6   65M   21M   45M  33% /boot
tmpfs            86M     0   86M   0% /run/user/1000
/dev/mmcblk0p5   30M  461K   28M   2% /media/pi/SETTINGS
/dev/sda1       916G  110G  760G  13% /mnt/nas1

卸载:sudo umount /mnt/nas1

然后设置开机自动挂载,把刚才sudo blkid输出的UUID复制下来

# 备份文件
sudo cp /etc/fstab /etc/fstab.backup
sudo vim /etc/fstab

然后添加下面的一行:UUID=@@@ /mnt/nas1 ext4 defaults 0 0,其中@@@是复制下来的UUID,没有引号

最后sudo mount -a看是否生效,df -h如果正确挂载则表示成功

samba

接下来要让局域网内可以访问,网内设备都可以访问,实现局域网共享。

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install samba samba-common-bin
#复制一下配置文件留个备份
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
#编辑配置文件
sudo vim /etc/samba/smb.conf

在文件的最后按照上面的格式写下自己的配置

[share]
comment = Test share
path = /media/pi/26cbf0a8-0deb-4fef-9a7c-2b9094010b26 
valid users = pi
force group = users
browseable = yes
writable = yes
create mask = 0660
directory mask = 0771
read only = no

配置好以后重启一下samba服务

sudo /etc/init.d/smbd restart

添加pi这个用户:

sudo smbpasswd -a pi
New SMB password:

Retype new SMB password:
Added user pi

完成之后,就可以在局域网设备里面查看树莓派的内容了。

测试samba共享

IOS设备用的是Documents,如图:

Windows上:

在win7系统上,开始-运行: \\192.168.3.104 (你的树莓派IP地址),进行访问:

为了方便,我们可以把share目录添加到映射,下载访问就不用 \\192.168.3.104 这种方式了。

Aria2

不能下载东西的nas与咸鱼有何区别?Aria2是一个命令行下载工具,很强大,从magnet到ftp,简直就是神器。

sudo apt-get install aria2

aria2运行的时候需要两个文件,并且需要我们手动配置,一个是配置文件aria2.conf,保存配置,另一个是aria2.session,要不每次aria2关闭的时候,之前下载的进度都没了。为了显得我的目录很整齐,我把他放到/home/pi/aria2/目录下面

cd /home/pi
mkdir aria2
cd aria2 
#摸一个空白的aria2s session文件出来  
touch aria2.session  
#编辑一下配置文件
vim aria2.conf

配置如下

AHOME=/home/pi/aria2
ARIASESSION=$AHOME/aria2.session
ARIACMD="--dir=/media/pi/26cbf0a8-0deb-4fef-9a7c-2b9094010b26/download --continue=true --enable-rpc -D --rpc-allow-origin-all  --rpc-listen-all --disable-ipv6 --input-file=/home/pi/aria2/aria2.session -j 3"

顺便给aria2c做成服务吧,用起来会方便的多

新建一个aria2c的服务sudo vim /usr/lib/systemd/system/aria2c.service

[Unit]
Description=aria2 Service
Requires=network.target
After=network.target

[Service]
Type=forking
User=pi
Group=pi
EnvironmentFile=/home/pi/aria2/aria2.conf
WorkingDirectory=/home/pi/aria2
ExecStart=/usr/bin/aria2c $ARIACMD
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

启动: sudo service aria2c start,设置开机自启sudo systemctl enable aria2c.service

Aria2 界面

比较靠谱的 Aria2 Web 管理界面有 webui-aria2, AriaNG 等,这里我选择的是 webui-aria2。

首先安装Nginx: sudo apt-get install nginx

Nginx 的默认 web 根目录是 /var/www/html ,所以我选择部署 webui-aria2 到 /var/www/html/webui-aria2 下。

cd /var/www/html
git clone https://github.com/ziahamza/webui-aria2.git

重启 nginx: sudo systemctl restart nginx

此时用浏览器访问 [主机IP地址或域名]/webui-aria2/docs/,应当能够看到 webui-aria2 的页面。

可以加一条Nginx配置,修改下url,毕竟太长了,rewrite /aria2 /webui-aria2/docs/index.html redirect;

这样就可以访问[主机IP地址或域名]/aria2

文件取回

这里使用另一个端口号(7080)做文件服务器,若要访问下载目录,在浏览器输入 [主机IP地址或域名]:7080 访问。

/etc/nginx/sites-available/ 下新建一个站点配置 sudo vim /etc/nginx/sites-available/aria2File 输入以下内容:

server {
        listen 7080 default_server;
        listen [::]:7080 default_server;
        root /media/pi/26cbf0a8-0deb-4fef-9a7c-2b9094010b26/download;  # 这块要根据自己实际情况改一下
        server_name _;
        auth_basic "Authorization needed";
        auth_basic_user_file /var/www/auth/auth4aria2File;
        location / {
                autoindex on;
                autoindex_exact_size on;
                autoindex_localtime on;
        }
}

然后 cd /etc/nginx/sites-enabled/ ,创建配置文件的软链接: sudo ln -s /etc/nginx/sites-available/aria2File ./aria2File

最后 vim /etc/nginx/nginx.conf,修改 nginx 配置文件首行的内容如下:

# user www-data;
user pi;  # 或者其他具有下载文件夹访问权限的用户名称

从而避免因默认的 www-data 用户无权访问下载文件夹导致的 403 错误。

上面我们在 aria2File 站点配置文件中写了一行 auth_basic_user_file /var/www/auth/auth4aria2File; # 设置要求密码登陆 ,所以这里我们在对应位置也要生成一个访问验证文件。

sudo apt-get install apache2-utils 安装 apache2-utils,其包含用于生成密钥文件的工具 htpasswd 。

mkdir -p /var/www/auth/
cd /var/www/auth/
htpasswd -c ./auth4aria2File $USERNAME

$USERNAME 改为你想要的登录用户名。

然后根据提示设置密码,生成文件 auth4aria2File。

再次访问[主机IP地址或域名]:7080就需要输入用户名密码了,输入正确后,就进入了下载文件列表页面。

完了之后去界面上添加了几个任务,发现没速度啊。。。尴尬

解决办法

具体原理就不细说了,因为我也没有细究。

Github上有一个项目: trackerslist 包含了所有public BitTorrent trackers

下载一份,我用的是trackers_best_ip.txt,将tracker的内容用逗号连接,将下面内容写入配置文件:

bt-tracker=udp://62.138.0.158:6969/announce,udp://188.241.58.209:6969/announce,udp://93.158.213.92:1337/announce,udp://62.210.97.59:1337/announce,udp://151.80.120.115:2710/announce,udp://151.80.120.112:2710/announce,udp://208.83.20.20:6969/announce,udp://5.206.54.49:6969/announce,udp://185.181.60.67:80/announce,udp://54.37.235.149:6969/announce,udp://91.216.110.52:451/announce,udp://35.156.19.129:6969/announce,udp://159.100.245.181:6969/announce,udp://176.113.71.19:6961/announce,udp://142.44.243.4:1337/announce,udp://51.15.40.114:80/announce,udp://184.105.151.164:6969/announce,udp://95.211.168.204:2710/announce,udp://46.148.18.250:2710/announce,udp://95.216.171.255:6969/announce,udp://185.83.215.123:6969/announce,udp://91.217.91.21:3218/announce,udp://15.188.67.15:6969/announce,udp://185.97.255.30:6969/announce,udp://207.246.121.172:2000/announce,udp://52.58.128.163:6969/announce,udp://194.182.176.251:6969/announce,udp://109.72.83.214:80/announce,udp://78.30.254.12:2710/announce,udp://212.1.226.176:2710/announce,udp://217.76.183.53:80/announce,udp://46.148.18.254:2710/announce,udp://207.241.231.226:6969/announce,udp://207.241.226.111:6969/announce,http://79.133.36.244:6969/announce,http://91.217.91.21:3218/announce,http://93.158.213.92:1337/announce,http://104.244.79.229:80/announce,http://78.30.254.12:2710/announce,http://91.207.136.85:80/announce,http://34.235.200.97:80/announce,http://184.105.151.164:6969/announce,udp://37.235.174.46:2710/announce,udp://176.113.68.67:6961/announce,udp://75.127.14.224:2710/announce,udp://104.244.79.229:6969/announce,udp://51.15.3.74:6969/announce,udp://218.5.41.211:2710/announce,udp://80.211.26.119:9696/announce,udp://94.130.103.190:8080/announce,https://54.37.157.173:443/announce,http://182.150.53.61:8080/announce,http://95.107.48.115:80/announce,http://194.143.148.21:2710/announce,http://176.113.71.19:6961/announce,http://176.113.68.67:6961/announce,http://34.92.10.197:6789/announce,http://178.17.170.169:6969/announce,http://62.210.202.61:80/announce,http://194.30.12.195:6969/announce,http://176.123.5.118:80/announce,http://212.47.237.124:8888/announce,http://2.234.154.249:2710/announce,http://51.79.71.167:80/announce,http://54.37.157.173:80/announce,http://62.210.177.88:1096/announce,http://51.68.122.172:80/announce,http://45.79.176.39:6969/announce,http://94.130.103.190:8080/announce,http://51.83.109.116:2710/announce
enable-dht=true
dht-listen-port=6881-6999
bt-enable-lpd=true
enable-peer-exchange=true
dht-file-path=/home/pi/aria2/dht.data
bt-max-peers=100
max-connection-per-server=13

等一会下载就有速度了。

hdparm

最后,还有一个问题没解决。硬盘24小时工作总感觉有点对不起它。为了延长硬盘使用寿命,当硬盘不使用时,需要让硬盘休眠,目前有一些软件可以自动做这事,像 hdparm, hd-idle 和 sdparm,具体用哪个取决于USB to SATA控制器和硬盘本身,其实说白了就是一个一个试,哪个有用就用哪个。当然,这里说的都是机械硬盘,固态硬盘没研究过。

注意:不要让机械硬盘频繁地休眠唤醒,这样会给电机和轴承较大负荷,会加剧硬盘损耗. 一般制造商建议的最小休眠时间是 3-5 分钟。参考(http://hd-idle.sourceforge.net/)

首先查看硬盘设备名,一般就是/dev/sda,dev/sdb之类的

sudo blkid

例如输出

/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="boot" UUID="15CD-3B79" TYPE="vfat"
/dev/mmcblk0p2: UUID="13d368bf-6dbf-4751-8ba1-88bed06bef77" TYPE="ext4"
/dev/sda1: UUID="7e623443-f19a-4564-8e60-e9d2170ac32a" TYPE="ext4"
/dev/sdb1: LABEL="COLORSPACE" UUID="F8E6-4FDB" TYPE="vfat"
/dev/sdb2: UUID="3007-F316" TYPE="exfat"
硬盘设备名为/dev/sdb,硬盘有两个分区

安装和配置hdparm

sudo apt-get install hdparm

设置硬盘自动休眠

#立刻让硬盘休眠,先试试看好不好用
sudo hdparm -Y /dev/sda1

如果输出如下结果,就表明支持,

/dev/sdb:
 issuing standby command

如果看到类似如下输出,就表明不支持,可以跳到 hd-idle 或者 sdparm,

/dev/sda:
 issuing standby command
SG_IO: bad/missing sense data, sb[]:  70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

检查硬盘是否支持写缓存功能,

sudo hdparm -I /dev/sdb | grep 'Write cache'

如果看到 * (星号),表示支持,

*    Write cache

如果没有看到 * (星号),表示不支持,

Write cache

编辑配置文件,

sudo vim /etc/hdparm.conf

spindown_time值乘以 5 得到总的时间(单位秒). 例如想配置成空闲10分钟就休眠,spindown_time = 10 * 60 / 5 = 120

在文件结尾加入,

/dev/sdb {
write_cache = on
spindown_time = 120
}

如果不支持写缓存,去掉 write_cache = on。

重启 hdparm 服务,

sudo service hdparm restart

也可以直接用命令操作

#设置硬盘自动休眠,数值/12 = 分钟,设置为120就是无操作10分钟后休眠
sudo hdparm -S 120 /dev/sda1

安装和配置 hd-idle

如果你的硬盘不支持 hdparm,或者就想试下hd-idle, 可以删除hdparm

sudo apt-get remove hdparm -y

hd-idle 使用一个特殊的系统文件来检测磁盘活动, 如果没有这个文件,那么就不能使用hd-idle。输入

cat /proc/diskstats

应该会看到如下的输出, 如果提示找不到文件或目录,那就不支持hd-idle。

8 16 sdb 5604 130363 146538 16780 1814 51838 429152 763380 0 18230 780150
8 17 sdb1 5075 130363 139418 15370 8 0 8 10 0 8680 15370
8 18 sdb2 512 0 6984 1290 1805 51838 429144 763360 0 9770 764650

hd-idle的自己编译,

sudo apt-get install build-essential fakeroot debhelper -y

获取源代码,

wget http://sourceforge.net/projects/hd-idle/files/hd-idle-1.05.tgz

解压缩进入目录

编译安装,

dpkg-buildpackage -rfakeroot
sudo dpkg -i ../hd-idle_*.deb

继续检查硬盘是否支持hd-idle,

sudo hd-idle -i 0 -a sda -i 300 -d

You should see output like this

probing sda: reads: 13418, writes: 594344

按 Ctrl+C 停止 hd-idle,编辑配置文件,

sudo vim /etc/default/hd-idle

修改下面来开启hd-idle

START_HD_IDLE=true
调整空闲时间为10分钟 (60 秒 * 10)

HD_IDLE_OPTS="-i 0 -a sda -i 600"

重启服务,sudo service hd-idle restart

如果hd-idle也不支持,可以试下 sdparm

sdparm

首先删除 hdparm 和 hd-idle

sudo apt-get remove hdparm -y
sudo dpkg -r hd-idle

安装 sdparm

sudo apt-get install sdparm -y

测试sdparm是否支持,停止一切硬盘操作,输入

sydo sdparm --flexible --command=stop /dev/sdb

应该可以看到如下输出,

/dev/sdb: SANHO     IUSBPORT          0

如果需要每隔10分钟休眠硬盘,可以用如下crontab命令

sudo crontab -l | { cat; echo "/10 * * * * sdparm --command=stop /dev/sda"; } | sudo crontab -

经过以上折腾,终于可以放心了,不用担心硬盘一天24小时不要命的转。

查看硬盘使用信息

windows系统里有很多好用的软件可以查看硬盘的总使用时长,Linux下也有类似的工具smartmontools。S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology; often written as SMART),现在的硬盘基本都支持SMART,对于Debian,Ubuntu系统:

apt-get install smartmontools

使用如下命令查看硬盘挂载在哪个目录下:df -h

比如说我的硬盘挂载在/dev/sda1,使用如下命令查看。sudo smartctl -s on --all /dev/sda1

移动硬盘如果没结果就使用sudo smartctl -d sat --all /dev/sda1

结果如下:9 Power_On_Hours 0x0032 099 099 000 Old_age Always - 1130,最后一个数字1130表示用了1130小时了。


点赞走一波😏


评论

提交评论