oynix

于无声处听惊雷,于无色处见繁花

NanoPi R5S 软路由:从零安装到常用服务部署

去年买了一个R2S,放在家里当软路由用着挺合适的,但是最近用samba传文件用的频繁,奈何R2S只有USB-2.0的接口,被最大50MB每秒的速度卡的死死的,要传个几十GB的电影要等很久。最近换代升级,新买了一个R5S,主要为了上面的USB-3.0,原本以为基于去年的经验,可以快速配置好,然后无感切换,但实际的路走的有些曲折,特此做个记录。

1.前言

原本倒腾软路由只是为了家里所有设备科学上网方便,不用每个设备都装一个代理客户端,把代理挂到网关,这样子网内的设备都可以无感翻墙。

后来随着需求增长,便又在R2S上插了一块儿大硬盘,机械的,正好里面也有Samba服务,随手就在本地搭了一个网络文件共享服务器,配合着电视上的网络视频播放器,一个家庭影库就有了。我用的是免费的NOVA Video Player,带自动刮削、带电视墙、带自动字幕等,Infuse有的基本都有。

跑偏了,回到正题。

2.家庭网络拓扑

软路由的网络拓扑基本类似,光纤入户后进入光猫,然后通过网线进入R5S软路由的WAN口,路由器通过网线连到R5S的LAN口,这里路由器不需要路由,只是当个接入点,所以需要进到路由器的后台,把模式改成AP模式,这样就可以了。

所有需要上网的设备,通过无线/有线的方式连到路由器上,所有数据包会从路由器进入到软路由,软路由处理完会交给光猫。对于客户端来说,中间加了这么一个软路由基本是无感的,不过如何分流规则配置不正确的话,有些网站会打不开,这时候就有感觉了,而且很强烈。

3.刷固件:ImmortalWRT

3.1 概念

软路由只是一个功能的概念,需要由软件来实现,而R5S只是一块儿开发板子,属于物理硬件,需要先刷入固件,固件介于硬件和软件中间,是种特殊的低层软件,用来告诉硬件如何工作,有了固件便可以安装软件来做各种事了。

3.2 固件选择

我新买来的R5S带有eMMC,所以已经刷好了官方固件Friendly Wrt,实际上可选择的固件有多种,比如官方正统的OpenWrt,其他版本基本都是基于此的,我选择的是ImmortalWrt,之所以选它,因为它软件库较为丰富,常用的软件基本都有了,直接安装要比自己折腾方便很多。

固件是用来告诉硬件如何工作的,如果硬件不同那么固件也会不同,ImmortalWrt提供了一个友好的固件选择页面,只需要输入自己设备的型号和需要的版本,就可以下载构建好的固件了,地址如下:

Fireware Selector

如果输入的设备型号不存在,则说明目前还不支持。至于版本,不建议选最新的,因为可能会有兼容的问题,我选的是倒数第二个大版本里最新的,现在已经到了24了,所以我选的是23.05.7,之后便可以在下面看到下载按钮。

可下载类型有2种格式,一种是EXT4,一种是SQUASHFS,这两种主要区别在是否可重置。网络经常出问题的人应该都知道,路由器屁股后头有个小按钮,拿个针或者牙签长按,过几秒之后路由器就重置了,恢复出厂状态了,这正是SQUASHFS的特点,而EXT4想要实现同样的效果就要麻烦很多,需要手动备份。

一般来说,选SQUASHFS就可以了,当软路由折腾到无法挽回的地步时,重置系统是最后的保障,不然有可能就变砖了。

除此之外,选择页面还支持自定义构建,可以自定义固件包需要自带的软件包以及首次启动的脚本,这是给有特殊需求的人准备的,大多时候用官方构建的固件包就可以了。

3.3 刷入固件

R5S自带的Friendly Wrt自带了刷入固件的功能,通过网线接入到它的LAN口,浏览器访问192.168.1.1就可以进到它的后台,用户名是:root,初始密码是:password,之后就可以在系统栏里看到这个功能,只需要选择刚刚下载好的固件包,等待一小会儿就完成了。

一般都是192.168.1.1+root+password这个配置组合,我刷了2个了都是这个,如果行不通的就查查固件的信息,这些都是写到固件里的。

再次访问192.168.1.1,同样的用户名和密码,如果可以顺利进到系统后台,说明固件已成功刷入,R5S的系统就是Immortal Wrt了,原来的系统已经没有了。

这个时候,拿到手的就是一个毛坯房,接下来开始装修。

3.4 配置SSH连接

在此之前,先配置一下SSH连接,这是后面的操作中必不可少的工具,默认使用ssh登录到Immortal Wrt上时是使用密码,每次都要输过于麻烦,可以通过以下命令将本机的默认的ssh公钥添加到上面去:

1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1

3.5 修改LAN口网段

打开网络的接口页面,会看到有WAN口和LAN口,如果支持IPv6的话,会看到2个WAN口,不过v6的一般用不到,可以停止或者删除,真有需要了还可以再加回来。

默认情况,初始情况下,WAN口和LAN的IP在同一个网段,192.168.1.0/24,但实际上这两个接口分属不同的网络,WAN口上级光猫在同一个网络,光猫是网关,而LAN口和家庭中的各种设备在同一个网络,LAN口就是网关,不同网络中的接口如果使用相同的网段,会导致诸多问题,比如网关冲突、ARP混乱、DHCP和NAT都会混乱。

所以,上来第一步就是要把这两个接口的IP地址分开,简单点,把LAN口改到192.168.2.1/24就可以了,记住要使用静态IP,LAN口的IP不能变,LAN口的IP也是访问Immortal Wrt的IP

4.安装软件

这种路由器系统本质上和我们常用的桌面窗口系统很像,都提供了安装/卸载软件、配置、查看等功能。点开系统菜单里的软件包,这里就是软件管理页面:

点击更新列表后,就可以搜索需要的软件了,下面列举一些我用到的,搜索的时候,除非明确知道名字是哪个,否则一般都是选luci-app开头的,这样的是带GUI界面的,需要的依赖也会自动安装,而以zh-cn结尾的,自然是汉化过的版本。

4.1 主题包:luci-theme-argon

安装这个软件之后,会更换主题,argon的使用人数众多,可能起页面形式更友好,换上体验体验就知道了,只是一个主题,没什么其他影响。

4.2 科学上网:luci-app-openclash

ImmortalWrt提供的工具很多,比如HomeProxy,SingBox之类的,我之所以选择OpenClash是因为我电脑上用的是ClashX Meta,内核相同,配置文件基本能直接用,如果换用其他的还要花时间学习怎么配置,况且现在这个已经能满足需求,等什么时候不得不换了再去研究。

OpenClash安装只是万里长征第一步,后面配置它才是重头戏,因为功能实在多,我也没全部研究,只是把平常用到的涉及了。我一直在用的是规则模式,简答来说就是一个数据包过来,被OpenClash拦截,根据配置好的规则判断,要么走代理,要么直接连,要么拒绝,关于怎么配置,我之前写过一篇文章,可以参考:

如何在ClashX Pro上优雅地管理多个订阅服务

当然,也可以详细的学习一下OpenClash都有哪些配置,以及各个配置项如何使,我推荐一个博主的介绍,我就是从他那里学的,说的很详细,我只配置了一部分就可以满足日常需求了:

全网最细】openclash新手入门教程指南!降低延迟提升响应速度!无污染、无泄漏,一次性讲清楚redirect、tproxy、TUN模式、兼容模式、增强模式、混合模式、路由决策、防火墙

4.3 NAS:luci-app-samba4

Samba是一种协议,用来提供网络文件服务,也就是NAS。

我的NAS十分简约,只是插了一块儿12T的大硬盘到R5S的USB接口上,冗余、备份什么的都没有。首先,这是一块机械硬盘,我赌它不会像SSD那样轻易坏,这是一场豪赌,其次,里面存的数据不是那种损坏后就要了命的,如果真的意外坏了也可接受,最后,现在硬盘价格涨的飞快,贵的离谱,要做RAID的成本太高了,这是主要原因,所以我选择单硬盘硬抗。

页面很简单,如图所示,配置分为2部分,一个是常规设置,一个是模版设置。

共享目录我配置了2个目录,一个Public,指向/mnt/sda1/Public,允许的用户为master和rott,一个Private,指向/mnt/sda1/Private,允许的用户为root,那块12T的大硬盘就挂在了/mnt/sda1目录。

这里的用户需要多说一句,samba的用户和系统用户是两组用户,但前者依附于后者,系统刚装好的时候,默认只有一名为root的系统用户,此时可以可以创建一个名为root的samba用户,如果需要再创建一个名为master的samba用户,则需要先创建一个名为master的系统用户,大致就是这个关系。

创建系统用户以及设置密码的命令:

1
2
3
4
5
# -m 表示创建home目录
useradd -m username

# 按照提示输入新密码即可
passwd username

samba用户需要存在同名的系统用户,密码是和系统用户的密码互相独立的,设置samba用户和密码的命令:

1
2
# -a表示添加一个新的用户
smbpasswd -a username

这里需要注意权限问题,当设置允许的用户为非root时,要注意该用户有没有指向目录的权限,包括...,比如下图master指向的Public目录。root用户具有最高权限,不用担心这个问题,但是一般不建议暴露root用户出来。

1
2
3
root@ImmortalWrt:/mnt/sda1/Public# ls -la
drwxr-xr-x 10 master master 4096 Nov 14 22:49 .
drwxr-xr-x 8 master master 4096 Nov 29 22:06 ..

至于第二部分的模版配置,一般不用修改,用默认配置即可,当需要修改时多数是特殊需求,也不是问题,里面每一行都有说明,介绍什么情况需要使用。

4.4 带宽监控:luci-app-nlbwmon-zh-cn

这个是用来统计流量使用情况的,提供多维度查看,比如按照MAC地址分,也可以按照应用层协议类型分,如果发现里面有大流量的陌生设备,有可能是蹭网的,也有可能是哪个家用电器在跑PCDN。

这个软件有一个特点,只有月初才会开始干活儿,如果安装后发现统计数据一直是0,不用太担心,等到下个月1号自然就正常了。头一次装的时候,总是统计不到数据,前后一通折腾,更神奇的是,网上一搜,遇到同类情况的人不少,提供了各种方案,我一一试过之后均不奏效。

恰巧看到一个人说到了1号自动就好了,已是麻木的我只能寄希望于此,苦苦等到下个月1号后,果然如此,看到统计数据里终于不是一大片0的时候,喜出望外之余,想到之前好一通的折腾又有些无奈,不知道如此巧妙的设计究竟是bug还是作者原本的意图。

5.扩容Overlay分区

随着安装的软件慢慢变多,就会发现系统状态信息里可用的磁盘空间越来越少,因为总量才不到300MB,这个大小大概是兼容了各种水平和用途的设备,但是对于拥有64GB eMMC的R5S来说,这等同于闲置了99%的磁盘空间,是一种严重浪费,接下来说说怎么把剩下的磁盘空间全步利用上。

首先需要先说说SQUASHFS系统的大致结构,上面在选择下载固件类型时提到过,它和EXT4类型的区别在于,SQUASHFS可以一键重置,恢复到出厂状态,原因在于它把系统文件单独放到一个分区上,挂在/rom的位置,后面新增以及修改的所有内容,单独存放到另一个分区上,挂在/overlay的位置,供用户读写,也就是overlay的大小是300MB。

我采取的是较为保守,但是不易出错的方案:把eMMC剩余的磁盘空间,都划到同一个分区,挂载之后,将现有/overlay全部内容,复制进去,然后用新分区替换,当作overlay使用,全程不触碰正在使用中的overlay的热数据,操作热数据很多命令都会报错:Resource busy,且风险高。

整体6步走。

5.1 分区

分区之前,先明白几个概念,一块磁盘或者是其他存储介质,插到主板上之后并不能直接使用,首先需要在这个磁盘上划好分区,分区之后需要将分区格式化成目标文件系统,linux常用的是ext4,格式化好文件系统的分区对应/dev下的一个文件,可以理解成一个设备,设备需要挂载到一个位于/mnt下的目录,该目录则是这个设备的访问入口。

看着有些抽象,打个比方吧。

现在拿到一大块土地(磁盘),地上按顺序画了1m x 1m的方格子(扇区),一共有1000个方格子(磁盘总大小),现在把第1-200个格子单独围了起来(划分区),然后在土地所登记站那里做个登记(/dev/disk1p1),然后派了一个人去里面管理物品存放,他有多种选择:横着放、竖着放、斜着放,也可以闭着眼随手扔,总之在确定一种方式(文件系统)之后,就不可再更改,然后在这块区域外面凿个窟窿,装个门(/mnt/disk1p1),通过这个门,就可以往这块区域放物品,也可以从里面取物品(读写数据)。

它们之间的关系大致如此,装门那块比喻的不够恰当,更恰当一点应该是,某个地方(/mnt)都是门,其中写着disk1p1的门,就可以通往刚刚划好的1-200个格子的区域。但是一个都是门的地方又很难想象,不过不重要,既然是打比方,差不多就得了。

R5S自带的eMMC属于只有一小部分的格子被划到某个区域中,剩下的绝大部分格子都处于闲置中,现在要做的就是把所有闲置的格子圈起来,那么从第几个格子开始呢?话没少说,该来点命令了。

查看磁盘分区状态使用fdisk -l命令,我的如下:

1
2
3
4
5
6
7
8
9
10
11
12
root@ImmortalWrt:/mnt# fdisk -l
Disk /dev/mmcblk1: 58.24 GiB, 62537072640 bytes, 122142720 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3c56a29b

Device Boot Start End Sectors Size Id Type
/dev/mmcblk1p1 * 65536 98303 32768 16M 83 Linux
/dev/mmcblk1p2 131072 976562 845491 412.8M 83 Linux
/dev/mmcblk1p3 978944 122142719 121163776 57.8G 83 Linux

我这个是已经分好区的,可以看到总大小,以及总扇区的数量:12142720,以及每个扇区的大小,所有扇区大小加一块儿就是磁盘总大小。下面是目前一共划好了的3个分区,在我增加分区之前,这里只有2行,每行代表一个分区,包括开始的扇区编号、结束的扇区编号、分区包含了多少扇区,以及总大小。

第一个分区是从65536开始的,而不是从0开始的,而第二个分区的开始扇区也不是第一个分区最后一个扇区的下个扇区,没错,没有规定要求所有分区必须都用上,出于各种原因和未来规划或者追求性能对齐文件等,一般分区中间都会预留一些扇区,有的后面可能会扩展。

而我新加的p3分区在p2的末尾预留了好几十MB则是为了数据安全,因为之前的误操作,我直接把剩余的50多GB的扇区都分到p2分区了,但是并没有影响/overlay的大小,因为/overlay指向的是个虚拟设备/dev/loop,这个特殊设备的大小没有跟随分区调整而变化,后面恢复p2分区大小时,担心卡的太严会把/dev/loop指向的文件截断,所以直接给了这个不到300MB的文件留了400多MB的空间,后面定p3分区起始扇区时,又向后偏移了几十MB,给了/dev/loop足够的空间。

同时/dev/loop虽然在p2分区,但是也不是从第一个扇区开始,通过以下命令可以查询偏移量

1
2
root@ImmortalWrt:~# losetup -a 
/dev/loop0: [0021]:15 (/mmcblk1p2), offset 6291456

扇区可以闲置不用,但不能同时分给多个分区,这会导致出现意料之外的问题。

分区命令有多个选择,我这里用的fdisk交互式操作,除了每个分区会在/dev下有个关联的文件,磁盘自身也会在/dev下有个关联文件,且这些文件的名字上有着固定规律,从上面fdisk的结果就可以看出:

1
2
3
4
Disk /dev/mmcblk1
Device /dev/mmcblk1p1
Device /dev/mmcblk1p2
Device /dev/mmcblk1p3

使用lsblk命令可以更加直观的看这几者之间的关联,看TYPE便知道,哪个是磁盘哪个是磁盘下的分区,以及挂在了哪里:

1
2
3
4
5
6
7
8
root@ImmortalWrt:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk1 179:0 0 58.2G 0 disk
├─mmcblk1p1 179:1 0 16M 0 part /mnt/mmcblk1p1
├─mmcblk1p2 179:2 0 412.8M 0 part /rom
└─mmcblk1p3 179:3 0 57.8G 0 part /overlay
mmcblk1boot0 179:32 0 4M 1 disk
mmcblk1boot1 179:64 0 4M 1 disk

我们要给mmcblk1添加新分区,命令后面直接加设备文件即可进入交互模式

1
2
3
4
5
6
7
8
9
10
11
12
root@ImmortalWrt:~# fdisk /dev/mmcblk1

Welcome to fdisk (util-linux 2.39).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.


Command (m for help):

进入交互模式后,这里会有一个提示,意思是这个磁盘正在使用用,现在对其调整存在风险,不过可以忽略,因为要操作的扇区确定没有使用中的热数据:

  • 输入n,新建分区
  • 选择p,主分区
  • 分区号,3
  • 起始扇区,根据分区2的最后一个分区,额外增加100-200MB就够用了
  • 结束扇区,磁盘最后一个扇区,当然也可以预留一部分扇区
  • w,保存并退出

5.2 格式化文件系统

先安装命令,然后再格式化,这一步很简单,我选择是ext4文件系统

1
2
3
4
opkg update
opkg install mkfs.ext4

mkfs.ext4 /dev/mmcblk3

5.3 挂载

如果是首次挂载,需要先创建挂载点的目录,然后再执行挂载操作

1
2
3
mkdir -p /mnt/mmcblk1p3 # 用别的名字也可以,比如/mnt/temp

mount /dev/mmcblk1p3 /mnt/mmcblk1p3

5.4 复制

这一步将原/overlay中所有内容复制到/mnt/mmcblk1p3中,这里使用rsync命令较为方便

1
rsync -avh /overlay/ /mnt/mmcblk1p3

5.5 改overlay配置

这一步需要在Immortal Wrt后台网页上修改。

先通过blkid命令可以查看分区id

1
2
3
4
root@ImmortalWrt:/overlay# blkid
/dev/mmcblk1p3: UUID="fc63bb01-81c1-4aaf-980e-9c89eb5f061e" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3c56a29b-03"
/dev/mmcblk1p1: LABEL="kernel" UUID="84173db5-fa99-e35a-95c6-28613cc79ea9" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3c56a29b-01"
/dev/mmcblk1p2: BLOCK_SIZE="262144" TYPE="squashfs" PARTUUID="3c56a29b-02"

在系统->挂载点中,在挂载点部分,先查看有没有刚刚创建的新分区,通过uuid来区分,如果没有,则通过添加按钮找到uuid为p3的设备,勾选「已启用」,挂载点选择作为外部overlay使用,然后保存,然后保存并应用

5.6 重启

这一步简单,只需要在系统菜单中,点一下重启,然后耐心等待,等设备完全运行起来后,再次通过网页登录后台查看,这个时候在系统的挂载点中的已挂载的文件系统中,就可以看到/dev/mmcblk1p3挂到/overlay了,可用空间也变成了刚刚的58GB。

至此,扩容overlay完成。

6.常见问题

6.1 配置过SSH后,使用git命令+git协议依旧让输入密码,像是在使用https协议

缺少完整的SSH Client工具,只带了最小的SSH,在系统软件源页面安装下即可,名字是:openssh-client,也可以使用命令行安装:

1
2
opkg update
opkg install openssh-client

6.2 使用git命令报错:fatal:detected dubious owenership in repositoryat ‘xxx’

这是Git中的安全机制触发的,当前用户名操作的目录拥有者名称不同时便会报此错,需要将目录权限改成当前登录用户

1
sudo chown -R username:usergroup /path/to/directory

R表示递归修改,同时修改owner和group

------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2025/11/1a3001b9ade5/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道