[2020.02.14]从零开始的低功耗网络存储搭建(NAS)
零 序言
疫情在外,肥宅困家。想起有几部从高中时一直欠下来的番剧,无奈某粉站对其百般删减,遂寻新径。同时,家中设备数与日俱增,几日前又得友赠惠普垃圾板一张,欲入 PT 大坑与赵国奠信一战高下。
一 硬件选择
硬件类型 | 参数 | 价格 | 备注 |
---|---|---|---|
主板 * | 惠普 Godstow R1-C | - | 同学那儿 PY 来的 |
内存条 | 三星 DDR3 4G 1333MHz | - | 单条,随主板一起捡来的 |
处理器 | 牙膏厂 N3050 | - | 功耗约 4 -6W,主板集成 |
电源 | 祖传全汉 230W | 估值 20 大洋 | 无 SATA 电源接口,需备转接线 |
硬盘 | 3TB 容量日立监控盘 | 180 元 / 块 | 某黄色二手市,X2 |
阵列卡 | LSI 9207-8i | 推友价 $0 | 已刷 IT 模式 |
系统盘 | 32GB SSD | 40 包邮 | 国产杂牌 |
- 此板大小 17X17,具有千兆网卡、PCI 16x 插槽、俩 SATA 接口,可玩性较高。
硬盘下单后第二天下午就到了,在此感谢疫情中维护城市正常运行的顺丰小哥。纸箱内有减震气垫,两块硬盘装在独立的防静电袋中,硬盘上表面有少许划痕,标签与网图一致,整体感觉较新。上电后坏道扫描全绿飘过,检查通电时间约有 4.5 年(灵车警告)
硬盘正面有几道不明显划痕
主板部分安装完毕后的样子↓ 日后再找个可爱点的箱子装起来。
二 系统环境安装
系统选用 Ubuntu Server 18.04 LTS
,安装前将软件源修改为 阿里开源镜像站。安装后为 ROOT 用户添加 SSH 登录公钥。PHP
选用当前最新的 7.4 版本可提高执行效率,减少 CPU 一定量的工作负担。分别添加 nginx
php
transmission
软件源,并安装它们。
add-apt-repository ppa:ondrej/php
add-apt-repository ppa:nginx/stable
add-apt-repository ppa:transmissionbt/ppa
apt install wget unzip python3 nginx certbot transmission-daemon syslinux sysstat php7.4-fpm
apt install php7.4-gd php7.4-json php7.4-mysql php7.4-curl php7.4-mbstring #安装一些常用的PHP组件
apt install php7.4-intl php-imagick php7.4-xml php7.4-zip
三 设置存储空间
因为家中网络只有千兆,暂时没有双栈 / 升级光纤的想法,单块硬盘的读写速度也有近 100MB/s,所以呢不需要再组什么阵列了,简单地合并两块硬盘空间,建立一个超大(其实也没多大)的逻辑卷即可。因为单块硬盘的大小已经超过了 2T,使用 MBR 分区表不能充分地使用空间,需要更换为 GPT 分区表。
- 使用
parted
建立 GPT 分区表并标记 LVM
root@mynasrbq:~# parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt #创建GPT分区表
(parted) mkpart
Partition name? []?
File system type? [ext2]? #默认
Start? 2048KiB #保留一部分扇区,并保证4K对齐
End? 100% #使用剩下的全部空间
(parted) toggle 1 lvm #标记LVM
(parted) p #检查操作是否正确
Model: HITACHI HUS723030ALS640 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 2097kB 3001GB 3001GB ext2 lvm
(parted) quit
Information: You may need to update /etc/fstab.
- 对 sdc 也进行相同操作创建分区并标记为 LVM
- 建立 LVM,此步骤需依次创建 PV, VG, LVM
①. 建立 PV
root@mynasrbq:~# pvcreate /dev/sdb1 /dev/sdc1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
②. 建立 VG,并命名为 "vg0"
root@mynasrbq:~# vgcreate vg0 /dev/sdb1 /dev/sdc1
Volume group "vg0" successfully created
③. 建立 LVM,并命名为 "lvm0"
root@mynasrbq:~# lvcreate -n lvm0 -l 100%FREE vg0
Logical volume "lvm0" created.
- 将这个大卷格式化为 ext4
root@mynasrbq:~# mkfs.ext4 /dev/vg0/lvm0
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 1465131008 4k blocks and 183144448 inodes
Filesystem UUID: 92be7340-6475-4f12-b242-6e5680c2c592
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
- 添加挂载点
个人比较喜欢挂载到/var/www
root@mynasrbq:/var# mount /dev/vg0/lvm0 /var/www
root@mynasrbq:/var# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 386M 1.1M 385M 1% /run
/dev/sda2 29G 6.8G 20G 26% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/loop0 90M 90M 0 100% /snap/core/8268
/dev/loop1 92M 92M 0 100% /snap/core/8592
/dev/sda1 511M 6.1M 505M 2% /boot/efi
tmpfs 386M 0 386M 0% /run/user/1000
/dev/sdd2 293G 254G 24G 92% /mnt/hda
tmpfs 386M 0 386M 0% /run/user/0
/dev/mapper/vg0-lvm0 5.5T 89M 5.2T 1% /var/www #挂载成功,总空间5.5T
添加开机自动挂载,修改/etc/fstab
,在最后添加一行
/dev/vg0/lvm0 /var/www/ ext4 defaults 0 0
四 配置 Certbot 证书
因为 NAS 是不直接暴露在公网上的,联通和电信也不允许家宽在未备案的情况下开放 80 端口,所以在 NAS 上撸 Certbot 证书不适合常规的验证方法,需要通过 DNS 记录验证域名合法。之前写过的 一篇文章 里面有提到过具体操作。
五 安装在线文件管理程序
在线文件管理程序可以让咱们通过浏览器方便地访问和修改 NAS 中的文件,类似于搭建一个私人云盘。目前风评比较好的有Nextcloud, owncloud, h5ai, KodExplorer, etc。考虑到 N3050 那可怜的 1.6GHz 主频,轻量的 KodExplorer 是不错的选择。
root@mynasrbq:/var# mkdir /var/www/kodcloud
root@mynasrbq:/var# cd /var/www/kodcloud
root@mynasrbq:/var/www/kodcloud# wget -q "http://static.kodcloud.com/update/download/kodexplorer4.40.zip"
root@mynasrbq:/var/www/kodcloud# unzip -q kodexplorer4.40.zip
root@mynasrbq:/var/www/kodcloud# rm kodexplorer4.40.zip
root@mynasrbq:/var/www/kodcloud# chown -R www-data ./ #设置权限
然后新建一个 Nginx 站点,配置如下:
server {
listen 80;
listen [::]:80;
root /var/www/kodcloud;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php;
server_name yourdomain.xxx IP; #主机名,加上内网IP地址方便内网通过IP直接连接
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
location /web/ { #代理 Transmission 网页管理
proxy_pass http://127.0.0.1:8080; #Transmission远程管理监听端口,与下文Transmission配置文件保持相同
}
location /rpc { #代理 Transmission RPC 服务
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 4154 ssl; # 外网端口
ssl_certificate /etc/letsencrypt/live/yourdomain.xxx/fullchain.pem; # 证书
ssl_certificate_key /etc/letsencrypt/live/yourdomain.xxx/privkey.pem; # 证书私钥
include /etc/letsencrypt/options-ssl-nginx.conf; # Certbot配置,如果没有这个文件,运行一次certbot生成即可
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Certbot配置
root /var/www/kodcloud;
# Add index.php to the list if you are using PHP
index index.php;
server_name **********; #为保护当事人隐私
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
location /web/ {
proxy_pass http://127.0.0.1:8080;
}
location /rpc {
proxy_pass http://127.0.0.1:8080;
}
location ^~ /data { # 安全起见禁止外网直接访问 data 目录,但会造成外网浏览器不能在线播放视频的错误
deny all;
}
server_tokens off; # 隐藏版本号提升安全性
}
为获得更佳体验,可以开启 TLS 1.3。方法:修改/etc/letsencrypt/options-ssl-nginx.conf
,将ssl_protocols
那一行改为ssl_protocols TLSv1.3;
。
最后保存并重启nginx
。
六 安装Transmission
作为 BT, PT 工具
root@mynasrbq:~# apt install transmission-daemon -y
进度条爬到头后需要配置一下Transmission
。
先选择一个下载目录,个人比较喜欢放在可道云的管理员主目录里
root@mynasrbq:~# mkdir /var/www/kodcloud/data/User/admin/home/transmission
root@mynasrbq:~# chown -R www-data /var/www/kodcloud/data/User/admin/home/transmission
root@mynasrbq:~# setfacl -d -m u:www-data:rwx /var/www/kodcloud/data/User/admin/home/transmission #授予 www-data 用户权限
然后修改Transmission
的 配置文件,必须先停止Transmission Daemon
服务,否则修改后的配置会被覆盖!
root@mynasrbq:~# service transmission-daemon stop
root@mynasrbq:~# vi /etc/transmission-daemon/settings.json
主要修改几个地方:
"download-dir" → "/var/www/kodcloud/data/User/admin/home/transmission"
"rpc-enabled" → true # 启用远程管理
"rpc-password" → RPC 口令
"peer-port" → BT 监听端口
修改完毕后保存,启动Transmission Daemon
服务:
root@mynasrbq:~# service transmission-daemon start
现在访问http://NAS内网IP/web/
,输入 RPC 用户名和口令,应该可以看到Transmission
自带的管理界面了(是不是很丑?是不是??)
七 设置 SMB 共享,方便家中的设备访问
root@mynasrbq:~# apt install samba -y
修改samba
配置文件, 位于 /etc/samba/smb.conf[global]
增加下面几项作为性能优化:
aio read size = 16384
aio write size = 16384
aio write behind = true
read raw = Yes
write raw = Yes
write cache size = 2097152
max xmit = 65536
large readwrite = yes
follow symlinks = yes
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
增加一个共享项目(kodcloud):
[kodcloud]
comment = share folder
browseable = yes
writeable=yes
path = /var/www/kodcloud/data/User/admin/home/
create mask = 0766
directory mask = 0766
guest ok = no # 禁止guest访问
保存,重启samba
服务:
root@mynasrbq:~# service smbd restart
添加一个smb
用户,与www
目录的所有者相同,否则无法上传 / 修改文件。
(此处的密码与系统登陆密码互不影响)
root@mynasrbq:~# smbpasswd -a www-data
New SMB password:
Retype new SMB password:
Added user www-data.
八 路由器配置静态 IP 以及端口转发
先看看网卡 MAC 地址
root@mynasrbq:~# ifconfig -a |grep ether
ether 11:22:33:44:55:66 txqueuelen 1000 (Ethernet)
运行在路由器上的操作系统是OpenWrt 19.07.1
,不同路由器设置界面可能不同。
添加一个内网 HOST,否则内网中的访问流量会绕外网一圈,不安全且效率极低。使用内网 HOST 需将客户端 DNS 设置为路由器 IP,否则可能需要逐一修改客户端系统的 HOST 记录,因为只有向路由器查询 NAS 的主机名,路由器才可返回 NAS 的内网 IP。
九 桌面端配置远程访问
桌面端运行着Windows 10 x64
,配合Chrome
浏览器。
先使用浏览器登录可道云,网址为http://nasip或主机名/
,初次登录需要设置管理员密码。点击右上角用户名(默认为 admin), 系统设置,禁用guest
账户自动登录
彻底禁用guest
账户和demo
账户
接下来创建一个Transmission
网页管理界面的快捷方式,方便管理。进入desktop
文件夹,右键 → 新建文件 → 轻应用 → 右上角【创建应用】,像这样填入基本信息,链接填入/web/
( 注意斜杠方向),保存即可,下一次双击图标可以进入Transmission
网页管理。
更改云桌面壁纸:上传一张瑟图(划掉),左上方切换到【桌面】选项卡,右键空白处 → 设置壁纸
最后 PO 一张效果图(桌面壁纸 PID 79043826),最右的探针可以在 这里 下载,放入网站目录并做好轻应用的链接。
(效果图与探针皆为转载,侵删)
(If infringement is involved, please contact to delete)
然后设置smb
访问,打开计算机,映射网络驱动器,路径\\NAS的IP或主机名\kodcloud\
(注意斜杠方向),用户名及密码均为上文创建的smb
用户,登录后可以看到可道云中的文件了。
还可以像操作本地文件那样右键通过其它播放器播放视频、加载字幕:
关于Transmission
,除了网页端外还有 桌面客户端 可供食用,带有如【效验文件】【Trackers 添加 / 修改】等网页端没有的功能。
transgui-5.18.0-x86_64-win64.zip下载后解压安装,右上角文件 → 连接到 Transmission
→ 新建 ,远程主机为 NAS 内网 IP 或主机名,端口 80,勾上【需要认证】并填写 RPC 用户名 & 密码,勾上高级选项,RPC 路径为/rpc
。
十 移动端配置远程访问
移动端咱使用的是Android Pie
操作系统。配置smb
访问与计算机大体相同,Android Pie
平台上支持SMB
访问和串流的文件管理器有 ES 文件浏览器 、Solid Explorer 等,支持串流播放的播放器有 VLC 等。
(Solid_Explorer 通过 SMB 访问主目录)
(VLC 通过串流在线播放视频)
移动端也有 管理工具 ,同样比网页端强大得多
再说一些可选操作
十一 * 防止外网端口扫描(增加安全性)
此操作 不适用于完全防止 运营商方面 的WEB 探测 ,因运营商可在链路上抓包并得到您使用的主机头,而此处介绍的方法以 对方未知您使用的主机名 为前提,固不可完全规避运营商方面的 WEB 检测。在未使用此方法配置的条件下,一般路过们直接访问https://公网IP:4433
可以获得主机名以及进入可道云的登陆界面。为防止一般通过的端口扫描,咱们可以让nginx
自动切断他们的对端口直接连接。编辑nginx
默认站点配置/etc/nginx/sites-available/default
, 新增一项网页服务器
server {
# SSL configuration
#
listen 4433 ssl default_server; #default_server标记用于匹配端口扫描发送的主机名
ssl_certificate /root/pub.crt; #自签一张证书,证书通用名应与NAS外网访问使用的真实主机名不同
ssl_certificate_key /root/pri.key; #自签证书的私钥
include /etc/letsencrypt/options-ssl-nginx.conf;
server_name _;
return 444; #直接切断连接
error_page 497 /shut; #通过HTTP访问也直接切断连接,避免暴露nginx作为网页服务器的身份
error_page 400 /shut; #非标准的HTTP请求也直接切断连接
location /shut {
return 444;
}
}
配置完毕后需要重启nginx
服务。处于外网的任何人(包括爬虫)在未知主机名的情况下通过 HTTPS 协议访问 NAS 时,只能得到自签证书,甚至不能判断是否为nginx
服务。浏览器访问则会给出【未发送任何数据】的提示(在 Chrome 80 上测试)
本文链接:https://blog.hiirachan.moe/archives/259.html
This blog is under a CC BY-NC-SA 3.0 Unported License
本站不提供任何可用于侵入、非法控制计算机信息系统的程序、工具
亦不提供非法定信道进行国际联网