NAS实践
阅读量
0
阅读人次
0
在折腾完软路由之后,发现其还可以做很多事,但是R86s只能插一个NVME的固态硬盘,很容易数据损坏。
Unraid
Unraid是个不错的系统,我当时最喜欢的一点是,他是用U盘作为数据盘,所以理论上所有的SATA口和NVME口都可用作数据盘。基于这个原因,一咬牙就买入了Pro版。
安装
在安装完成后,最先碰到的问题就是无法下载应用插件。
- 首先先在
设置
➡日期和时间
更新国内能正常访问的 NTP 服务器,设置正确的时区,确保时间正确。 - 因为 unraid 的插件基本上都是存放在 github 上的,而国内不知道为啥总是污染
raw.githubusercontent.com
这个域名的解析,导致下载失败。所以我们可以将正确的 IP 地址解析加入/etc/hosts
文件中。
在 DNS Lookup 搜索 raw.githubusercontent.com
的 IP 为 185.199.110.133
。修改 /etc/hosts
:
185.199.110.133 raw.githubusercontent.com
Unraid除了提供了奇偶校验数据盘的特性,还集成了Docker以及虚拟机的支持。有了Docker,我们可以部署很多应用,当然,占用的端口也多了。
Unraid自带的功能多了,但是感觉又变得相对不稳定了,特别是对于想要折腾 All in One 的人来说,在最开始折腾的过程中,特别是在使用VFIO将PCI设备直通到虚拟机的情况。
无论是什么情况下,都请先备份好U盘里面的所有文件,然后再进行操作!
有遇到网卡 eth0 eth1 顺序调换导致不能通过管理网口访问的情况,此时网卡直通出 现了混乱导致的。(这种情况总是碰到)
有遇到PCI直通出问题,导致虚拟机无法自启动的。
总结下来,好像都和直通有关系。如果不想重装系统,这个时候就只能插上显示器,通过终端使用命令行来解决问题了。所以下文会记录一些命令帮助使用命令行来解决问题。
/boot/config/vfio-pci.cfg
:这个文件应该就是我们在 工具
➡ 系统设备
下选择使用 vfio 进行直通的设备的 pci 编号。其内容大致如下,以空格作为分隔符:
BIND=0000:01:00.0|1002:6779 0000:01:00.1|1002:aa98 0000:00:1f.0|8086:a305 0000:00:1f.3|8086:a348 0000:00:1f.4|8086:a323 0000:00:1f.5|8086:a324 0000:00:1f.6|8086:15bc 0000:03:00.1|8086:10fb
有时候我们换了PCI设备,但是其编号在留在里面,这会导致虚拟机无法自启动。这时就需要我们仔细排查 vfio-pci.cfg
文件,看看哪个PCI设备已经没有了。
针对无法使用管理网口的问题:
-
首先,我们需求查看
vfio-pci.cfg
文件,来确定这个网口是不是被直通了。如果被直通了,那就将它的编号删除,然后重启。 -
通过 virsh 将使用了直通网口的虚拟机(或者全部虚拟机)关掉自启动,排除下是不是因为虚拟机导致无法使用管理网口。
-
检查
/boot/config/network.cfg
文件, -
最后实在搞不定,终结大招就是把上述
vfio-pci.cfg
、network.cfg
两个文件都删了。unraid 会默认生成network.cfg
文件,以 dhcp 方式获取 IP 地址。默认内容如下:# 表示使用 DHCP 服务 器自动获取 IP 的方式向路由器申请 IP 给到 unRAID 使用。
USE_DHCP="yes"
# 当前 unRAID 的内网 IP
IPADDR=
# 子网掩码,一般的值为 255.255.255.0
NETMASK=
# unRAID 的网关
GATEWAY=
# 是否启用绑定(默认为 yes )
BONDING="yes"
# 是否启用桥接(默认为是 yes )
BRIDGING="yes"如果需要静态IP,可作如下配置:
# 取消 DHCP 自动获取 IP。
USE_DHCP="no"
# 请将 IPADDR 的值设置为你需要的 IP 。
IPADDR="192.168.2.3"
# NETMASK 不需要修改。
NETMASK="255.255.255.0"
# GATEWAY 是网关地址,根据你自己实际的情况来。
GATEWAY="192.168.2.1"
# BONDING 和 BRIDGING 不需要修改,等你能够访问 unRAID 之后再在网络设置中修改即可。
BONDING="yes"
BRIDGING="yes"
# DNS 服务器地址,可以填写两个,根据你的需求来。
DNS_SERVER1="192.168.2.1"
DNS_SERVER2="114.114.114.114"
当然,我们也可以仅修改 USE_DHCP="no"
这一行,然后通过 ifconfig
命令暂时配置 IP:
ifconfig br0 192.168.2.3 netmask 255.255.255.0
然后使用 PC 修改静态IP保持同一网段直连 Unraid,最好是将 PC 的网关直接改成 Unraid 的 IP 地址。
等我们能够成功访问 Web 控制台的时候,再通过其修改 IP 地址获取方式。
更换 Docker 镜像源
以阿里云镜像源为例,在 镜像容器服务➡镜像工具➡镜像加速器
找到 加速器地址,然后在 Unriad /boot/config/go
添加如下内容:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6bcoyx9o.mirror.aliyuncs.com"]
}
EOF
使用FRP
使用FRP时,前往不要将Web访问端口直接映射出去。这样外网可以直接无需尼玛,直接跳转至URL。
可以使用FRP提供的 HTTP基本认证 实现账号密码验证登录(在nginx反向代理一侧,请使用HTTPS)。
[[proxies]]
name = "unraid"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["unraid.amass.fun"]
httpUser = "your_account"
httpPassword = "your_password"
Docker及端口占用
端口号 | 组件 | 作用 |
---|---|---|
80 | Unraid | 访问Unraid |
1022 | Ubuntu Develop | 容器用于开发调试,ssh 端口 |
1443 | NextCloud | 私有云盘 |
1883 | NanoMQ | MQTT TCP监听端口 |
2022 | Gitea ssh | 用于 pull/push 仓库 |
2443 | Docker Register | Docker Register https 端口,由 nginx 提供 |
3000 | Gitea | 仓库镜像备份 |
3100 | HomeBox | 物品收纳管理 |
3306 | MySQL | 被NextCloud所用 |
5000 | Docker Register | 存放Docker镜像 |
8082 | Calibre | Calibre webserver gui. |
8083 | Calibre | Calibre desktop gui. |
8084 | calibre-web | calibre-web |
8085 | librespeed | 用于内网测速 |
8086 | Docker Registry UI | 管理 Docker Registry 的 Web UI |
8087 | Code Server | 用于在线编写代码 |
8088 | reader | 电纸书阅读 |
8089 | Chevereto | 图片分享,图床 |
8096 | Jellyfin | 影音播放 |
8920 | Jellyfin HTTPS | https接口,通过 frpc + nginx 访问8096端口 |
Ubuntu
日常使用中,还是需要在NAS做一些事的,例如构建Docker镜像,体验一些应用等。这个时候是不推荐在 Unraid 上直接操作的,一个原因是 Unraid 是基于 Slackware 开发的,我不太熟悉这个系统。另一个更重要的原因是因为如果直接在 Unriad 做实验,会污染其环境或可能产生冲突增加其不稳定性,如果要导致数据不见了,或者需要重装 Unraid,那就非常麻烦了。
所以,比较好的方式就是我们自己构建一个 Ubuntu 的 Docker 镜像,然后在容器上做我们想做的事。
id amass # 确认amass用户的uid、gid
docker run -it --privileged -d -e PUID=1000 -e PGID=100 --network host --name ubuntu --hostname Ubuntu \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mnt/user/appdata/code-server:/root/.local/share/code-server \
-v /mnt/user/appdata/code-server:/root/.config/code-server \
-v /mnt/user/appdata/vscode-server:/root/.vscode-server \
-v /mnt/user/appdata/frpc:/opt/frpc \
-v /mnt/user/Documents:/root/Documents \
-v /mnt/user/Backup/Projects:/root/Projects frp-by1.wwvvww.cn:45288/ubuntu_dev:24.04
docker exec -it ubuntu bash
在本地 ssh config
配置:
Host ubuntu_unraid
HostName 192.168.3.3
User root
IdentityFile E:/Projects/id_rsa_amass
Port 1022
IdentityFile
在 Windows 下的权限问题:
Bad permissions. Try removing permissions for user: NT AUTHORITY\\Authenticated Users (S-1-5-11) on file E:/Projects/id_rsa_amass.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'E:\\Projects\\id_rsa_amass' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "E:\\Projects\\id_rsa_amass": bad permissions
使用命令行修改权限:
# 移除 NT AUTHORITY\\Authenticated Users 的权限
icacls "E:\Projects\id_rsa_amass" /remove "NT AUTHORITY\Authenticated Users"
# 确保只有当前用户(假设用户名为 amass)有权限访问
icacls "E:\Projects\id_rsa_amass" /inheritance:r
icacls "E:\Projects\id_rsa_amass" /grant:r amass:F
Code Server
下载 C/C++ 插件,然后手动安装。
frp
frp的具体使用可以参考之前写的笔记,这里使用Docker运行frpc:
docker run --restart=always --network host -d -v /mnt/user/appdata/frpc/frpc.toml:/etc/frp/frpc.toml --name frpc frpc:develop
docker run --restart=always --network host -d -v /mnt/user/appdata/frpc/wwooww_frpc.toml:/etc/frp/frpc.toml -v /mnt/user/appdata/frpc/nginx.conf:/etc/nginx/nginx.conf -v /mnt/user/appdata/frpc:/config --name wwooww_frpc frpc:develop
如果我们想自己构建frpc,可以参考,我构建的 frpc 集成了 nginx,这样方便我们通过 frp 使用 https 访问,然后再将请求反向代理至内部服务,以 jellyfin 为例:
upstream jellyfin {
server 192.168.2.3:8096;
}
server {
listen 8920 ssl;
server_name frp-by1.wwvvww.cn;
ssl_certificate /config/cert/frp-by1.wwvvww.cn_bundle.pem;
ssl_certificate_key /config/cert/frp-by1.wwvvww.cn.key;
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x-wiz-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://jellyfin;
}
}