低成本家庭nas搭建

最近在研究流媒体服务器,想实现无论是在客厅还是卧室、无论是躺着还是坐着都可以快乐追番,首先微软自带的windows media player很好用,基本上电视都支持dlna,同一局域网就可以远程播放多媒体文件,而平板、手机上都是有相关app支持dlna的,我个人实验下来还不错的移动端app如下:

1
2
iOS: infuse
Android: VLC (或者 BubbleUPnP + MXplayer)

再者大多播放器也支持smb协议,可以用电脑来共享文件。也就是说,只要有一台24h运行、设置好相关服务的电脑,就可以满足我的需求。

但全天开着电脑,很不环保,完全可以用树莓派来替代。(今天实战了一下,播放1080P视频非常流畅,包括拖动进度条、切换视频等)

有网友很好奇,怎么弄?成本是多少?那我就把搭建材料、过程都分享出来。

最终成品

材料

1
2
3
4
1T移动硬盘:¥399 (京东西数自营店价格。可以买一块2T的机械硬盘+硬盘盒,价格和这差不多)
树莓派4b: ¥579 (淘宝某店4G主板基础套餐价格,带TF卡、读卡器、micro-HDMI线等配件)

P.S.后面了解到一些入门的nas好像也就不到一千块,如果你不想折腾其实完全可以直接买一个真正的nas。

以上两个东西是我很早之前就买了,一直在吃灰,今天才拿出来废物利用使用。价格也是现查的,之前买的时候貌似比这还便宜吧。。。

所以只要有一个硬盘(支持usb3.0),有一块树莓派4b的板子(我的是4G内存,你也可以用性能更好的8G),就可以开始制作了。

其他需要的一些东东:

  • 一台电脑(我只有windows,后面都用windows举例)

  • 一个路由器(电脑、树莓派都接入该路由器的wifi)

  • TF卡,不用太大,16G就可以了,拿来做树莓派系统绰绰有余

  • 读卡器

  • 键盘、鼠标、micro-HDMI线 、显示器(接树莓派,做输入输出)

装系统

树莓派官网下载地址: Raspberry Pi Imager

选择自己电脑对应的系统版本下载就好了,我这里下载的是windows版的Raspberry Pi Imager。

拿出TF卡,使用读卡器插到电脑上,如下图,依次选择树莓派64位系统(注意,不要选Lite,Lite不带图形界面),TF卡,点击“烧录”按钮。

树莓派镜像烧录器

烧录完成后,拔出读卡器,将TF卡插到树莓派主板上,通电等待启动即可。

因为烧录的图形化界面的系统,这里最好给树莓派接上显示器、鼠标、键盘,根据显示,依次设置用户名、密码、wifi等。

网上关于树莓派怎么安装,有很多教程,有不清楚的可以直接问搜索引擎。

远程

能正常进入系统后,可以按照如下所示将vnc、ssh服务都打开

设置

打开服务

vnc 支持远程图形界面访问

ssh 支持远程命令行访问

这意味着,之后将无需显示器、鼠标、键盘这些设备,也能通过其他电脑对树莓派进行控制。

当然前提是路由器分配给树莓派的内网ip要可知(最好固定下来),可通过命令行输入ip a 进行查询。

IP

网上关于vnc、ssh的教程有很多,这里不展开说了。

安装samba

smb是一个比较通用的资源共享协议,windows天然支持,树莓派则需要安装samba:

1
2
3
4
5
6
# 更新apt
sudo apt-get update
# 安装vim
sudo apt-get install vim
# 安装samba
sudo apt-get install samba

此时可以接入硬盘,树莓派会自动挂载在/media/pi下面,我这里路径为/media/pi/Elements

挂载

对samba进行配置

1
sudo vim /etc/samba/smb.conf

在文件的末尾追加如下内容,将整个media目录进行共享:

1
2
3
4
5
6
7
[myshare]
path = /media
writeable=Yes
create mask=0777
directory mask=0777
public=yes
browseable=yes

设置smb用户密码:

1
2
sudo smbpasswd -a pi
# pi为用户名,之后按照提示,依次设定密码

重启服务:

1
sudo systemctl restart smbd

重启完成后,便可远程访问硬盘上的资源。

以windows举例,只需在“映射网络驱动器”中输入\\${树莓派ip}\myshare,然后使用上面设置的smb用户密码登入即可:

windows远程访问硬盘

安装minidlna

我家电视是不支持smb的(可能支持,只是我不会用),为了能直接播放硬盘上的视频,还需要给树莓派安装minidlna:

1
sudo apt-get install minidlna

在移动硬盘上建立视频文件夹,该文件夹后续用来存放视频:

1
mkdir -p /media/pi/Elements/nas/video

修改minidlna配置:

1
sudo vim /etc/minidlna.conf

主要是media_dir这一行, 将视频目录指向刚创建的文件夹:

1
media_dir=V,/media/pi/Elements/nas/video

重启minidlna服务

1
sudo service minidlna start

可以往/media/pi/Elements/nas/video目录拷一个mp4文件上去,用电视测试一下,一般是可以正常播放了的。

安装下载器

对于下载器,我没怎么研究,目前只用过windows上的qbittorrent,感觉还不错,给树莓派也装了一个:

1
sudo apt-get install qbittorrent

长这样(文件丢失是因为我暴力移动了下载文件的位置):

qbittorrent

后续打算利用树莓派进行BT下载,下载目录为/media/pi/Elements/nas/video/new/

也许有其他命令行的下载器,比qbittorrent更好用,后面再研究研究。

至此,就算折腾完毕了。

弄完了,接上电源,丢在电视柜就可以不管了

个人定制

因为我找新番的论坛,最外层页面只有磁力链接的特征码,我设想的使用方式是:

  1. 用PC上论坛收集特征码,将特征码写到共享盘上某个文本文件上
  2. 远程VNC树莓派,运行脚本,自动拼接磁力链接,并拷贝到剪切板
  3. 打开qbittorrent,新建(会自动读取剪切板的内容),开始下载
  4. 下载完后,根据某定义的规则,将视频分目录进行归档存放

于是我规划了一下文件目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建下载辅助目录
mkdir -p /media/pi/Elements/nas/qbit

cd /media/pi/Elements/nas/qbit

# 创建特征码收集文件
touch hash.txt
# 创建视频分类规则文件
touch dir.json

# 创建脚本文件夹,内存放有文件qbit_tool.py
mkdir -p /tools
touch /tools/qbit_tool.py
vim /tools/qbit_tool.py # 将后面的脚本内容拷贝进该文件即可

特征码文件长这样:

hash.txt

分类规则文件是个json文件,由n对k-v组成,key是视频分类的目录,value是一组可能出现在视频文件名中的字符串(有的字幕组会用罗马拼音,有的字幕组直接使用汉字),这个文件具体内容需要自己进行维护,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"不死少女杀人笑剧": [
"Undead Girl Murder Farce"
],

"无职转生S2": [
"Mushoku Tensei II"
],

"夫妻交欢": [
"Fuufu Koukan"
]
}

python脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env python
import json
import os
import shutil
import sys

import pandas.io.clipboard as cb


MAGNET_PREFIX = "magnet:?xt=urn:btih:"

# 特征码文件
HASH_FILE = "/media/pi/Elements/nas/qbit/hash.txt"
# 完整磁力链接生成位置
RESULT_FILE = "/media/pi/Elements/nas/qbit/result/result.txt"

# 文件名与目录规则映射文件
JSON_FILE = "/media/pi/Elements/nas/qbit/dir.json"
# 下载目录
NEW_VIDEO_PATH = "/media/pi/Elements/nas/video/new"

# 定义换行符
LF = "\n"
CRLF = "\r\n"


# 将新下载的视频按照规则归档到指定文件夹
def archive_new_video(new_path, json_file):
home_path = os.path.split(new_path)[0]

# 列出父目录下所有文件
videos = os.listdir(new_path)

with open(json_file, encoding="utf-8") as f:
dir_relation = json.load(f)

for video in videos:
for k, v in dir_relation.items():
for name in v:
if name in video:
target_dir = os.path.join(home_path, k)
if not os.path.exists(target_dir):
os.makedirs(target_dir)

target_path = os.path.join(target_dir, video)
ori_path = os.path.join(new_path, video)
shutil.move(ori_path, target_path)

print("move [%s] --> [%s]" % (ori_path, target_path))


# 删除文件
def del_path(path):
if os.path.exists(path):
print("now remove last result file: " + path)
os.remove(path)


# 生成结果文件
def write_txt_result(result, result_path):
path_list = os.path.split(result_path)
parent_path = path_list[0]
if not os.path.exists(parent_path):
os.makedirs(parent_path)
with open(result_path, 'a', encoding='utf-8') as f:
f.write(result)


# 拼接完整的磁力链接
def gen_full_magnet(ori_path, result_path, prefix):
# 清理上次产生的结果文件
# del_path(result_path)

# 读取文件
with open(ori_path, 'r') as f:
# 先把所有内容以行为单位读取到内存里
lines = f.readlines()

# 初始化结果文本
result = ""

# 循环每一行字符串
for line in lines:
# 对该行字符串做替换,并与结果进行拼接
result = result + prefix + line

# 循环完毕加一个换行符,便于多文件的结果显示
# result = result + LF

# 将结果写到文件中
# write_txt_result(result, result_path)

#复制到剪切板
cb.copy(result)

# 打印结果
print(result)


# 脚本入口
if __name__ == '__main__':
arg = sys.argv[1]
if arg == "link":
gen_full_magnet(HASH_FILE, RESULT_FILE, MAGNET_PREFIX)
elif arg == "archive":
archive_new_video(NEW_VIDEO_PATH, JSON_FILE)
else:
print("input error.")

input("press any button.")

实际使用时,需要先安装一个依赖包:

1
pip install pandas

设置别名

1
alias qbit="python /media/pi/Elements/nas/qbit/tools/qbit_tool.py"

生成磁力链接

1
qbit link

qbit link

qbittorrent会自动读取生成的结果

下载完成后进行归档

1
qbit archive

归档


低成本家庭nas搭建
https://honosv.github.io/2023/08/19/低成本家庭nas搭建/
作者
Nova
发布于
2023年8月19日
许可协议