J4125折腾笔记5 把 Alpine 装进内存
前言
普通的硬件路由器,没有意外的情况下,不管你怎么断电,怎么重启,内置的系统一般都不会出现损坏,即使真遇到了什么问题,重置一下就能解决大部分问题;反观我所折腾的软路由,由于使用的是普通的 Linux 发行版,系统文件都是存储在磁盘上的,常见的 EXT4 和 XFS 文件系统可没有对意外断电进行优化,那么,有很大概率因为意外断电就挂了(特别是在进行数据读写的时候),为此,我计划对此进行一些改进,比如:把系统安装进内存。
OpenWRT 也是运行在内存上的,用惯了的朋友其实没必要折腾了,当然,想要尝试一下新方案的朋友,也可以看看,希望能给大家一点启发
上一篇分享中实现的路由功能主要基于虚拟机,这次使用实机进行安装配置,当然为了更加实用,稍微调整了一些功能操作。不过把系统装进内存,并不是真的只需要有内存就能运行,而是在系统正常启动之后,所有运行所需的文件和配置都加载到内存,此时不管有没有硬盘都不会影响系统的正常运行,这就像是 PE 启动盘,PE 正常加载之后完全可以拔掉启动 U 盘,不仅可以脱离引导磁盘,还减少了系统对磁盘的读写,对于一些矿机上面的那种战损固态来说,这样可以有效延长寿命,很不幸的是,我连战损固态都没有,不过我有很多客户送的杂牌 U 盘,用U盘做引导和临时存储其实也不错,性能渣也没事,系统启动载入之后就没它什么事了
系统安装
Alpine Linux 的安装镜像可以直接从其官网进行下载,注意需要下载 EXTENDED 版本
需要准备的材料:
alpine-extended-3.15.4-x86_64.iso(支持 x86_64 和 i686,选择哪个取决于你所使用的硬件,一般建议使用 x86_64,现在很多应用都只支持 x86_64,比如 docker)
2个 U 盘,其中一个已经安装好 Ventoy,另外一个用于最终的安装,所以里面请不要存放重要的文件
J4125主机(不需要硬盘)
将系统镜像写入 U 盘,此处依然使用 Ventoy,只需要将 iso 文件存储在 U 盘中就可以了,使用 U 盘引导后就可以看到刚刚丢进去的镜像了
跑过一串加载信息之后,就正式启动系统了,使用 root 账户进行登录了,默认情况下无密码
之后使用 df -h 命令查看分区的挂载情况,此处需要注意 /media/dm-0 这个挂载点,这个相当于是整个安装镜像的挂载目录,后续安装所需要的文件都在这个目录下,记住其命名,后续会用到
此时就可以将另一个 U 盘插上了,插上后直接使用 fdisk -l 查看设备名,确定为 sdb
一般设备的命名按照 a b c d 这样的字母顺序依次进行,所以后插入的设备肯定排在现有设备名之后
确定设备名之后直接使用 fdisk /dev/sdb 进入分区操作,下述操作清空了所有分区,然后创建了两个分区,第一个分区2G,作为引导分区,另一个分区使用剩余空间
分区使用的指令及说明如下所示:
m -> 回车 # 显示工具说明
o -> 回车 # 新建主引导,相当于清空分区信息
n -> 回车 # 新建分区
p -> 回车 # 设置分区类型
p 是 primary的意思,即主分区,e 是 extended的意思,即扩展分区
1 -> 回车 # 设置分区号
1 是第一个分区,2 是第二个分区,以此类推,需要注意的是现在使用的是 *mbr* 主引导,所以主分区数量不能超过4,一般情况下最多使用前三个分区号,后续的一个分区使用扩展分区,然后在扩展分区中创建新的分区,一般分区号从5起始
回车 # 扇区起始位置,默认即可
+2G -> 回车 # 设置分区大小
此处设置为2G,其实1G也够了
n -> 回车 # 建立第二个分区
p -> 回车 # 设置分区类型
2 -> 回车 # 设置分区号为2
a -> 回车 # 激活分区
类似于 Windows 安装系统时候将 C 盘设置为活动分区,如果不激活的话讲不能引导,切记、切记、切记
1 -> 回车 # 激活分区号为1
p -> 回车 # 查看分区信息
注意此时第一个分区上有个 “*”,表示此分区已被激活
w -> 回车 # 将修改写入磁盘
不过当执行后续的格式化操作时,系统会提示找不到新创建的分区,在 /dev 目录下亦没有新创建的sdb1 和 sdb2
这个时候插拔一下新插入的 U盘,让系统重新识别一下即可,此处需要注意使用
partprobe命令并没有什么用,还是插拔一下实在
格式化两个分区,直接使用 fat32 文件系统 mkdosfs -F32 和 mkfs.vfat 都可以,并使用 setup-bootable 命令将系统写入引导分区,注意系统镜像的挂载点为 /media/dm-0
接下来就可以拔掉第一个 U 盘,直接重启系统,使用第二个 U 盘进行引导,使用 root 账户登录,查看一下分区挂载情况,可以看到镜像目录名变成了 /media/sda1 ,容量也是2G
在进行安装之前,先将 U 盘上的第二个分区挂载一下,方便后续安装识别
mkdir /media/sda2
mount /dev/sda2 /media/sda2
使用 setup-alpine 进行最后的系统安装和配置
具体的安装步骤如下:
Select keyboard layout: [none] -> 回车
Enter system hostname (fully qualified form, e.g. ‘foo.example.org’) [localhost] router -> 回车
将其命名为 router
Which one do you want to initialize? (or ‘?’ or ‘done’) [eth0] -> 回车
初始化网卡 eth0
Ip address for eth0? (or ‘dhcp’, ‘none’, ‘?’) [dhcp] -> 回车
自动获取
done -> 回车
不对后续网卡进行配置
Do you want to do any manual network configuration? (y/n) [n] -> 回车
不进行手动配置
New password: xxxx -> 回车
输入密码
Retype password: xxxx -> 回车
再次输入密码
Which timezone are you in? (‘?’ for list) [UTC] Asia/Shanghai -> 回车
设置时区为上海,即东八区时间,默认为协调时间时
HTTP/FTP proxy URL? (e.g. ‘http://proxy:8080‘, or ‘none’) [none] -> 回车
不设置代理
Which NTP client to run? (‘busybox’, ‘openntpd’, ‘chrony’ or ‘none’) [chrony] -> 回车
设置为 chrony,即时间同步服务
Enter mirror number (1-72) or URL to add (or r/f/e/done) [1] f -> 回车
自动选择最优源
Which SSH server? (‘openssh’, ‘dropbear’ or ‘none’) [openssh] -> 回车
ssh 服务选择为 openssh
No disks available. Try boot media /media/sda1? (y/n) [n] -> 回车
使用 /media/sda1 进行引导
Enter where to store configs (‘floppy’, ‘sda1’, ‘sda2’, ‘usb’ or ‘none’) [sda2] -> 回车
将配置文件存储在 /media/sda2 下,安装前需要先进行挂载,否则无法自动识别
Enter apk cache directory (or ‘?’ or ‘none’) [/media/sda2/cache] -> 回车
将 apk 缓存文件存储在 /media/sda2/cache 下
忽略最后的提示
上述的操作结束之后,还需要最后一步操作 lbu commit -d 将配置信息写入 /media/sda2,系统将在下次启动的时候调用此处的 router.apkovl.tar.gz 完成系统的初始化,切记不要忘了这一步,当然,如果哪天你想清空配置,也可以将这个文件直接删除,重启之后就恢复默认配置了
重启后登录系统,通过挂载信息发现,系统的根目录使用的是 tmpfs,相当于挂载在内存上,如果你有兴趣尝试一下的话,完全可以拔掉 U 盘尝试下会不会挂
软路由配置
完整的配置可以参考我上一篇分享
以下主要介绍一些做出改动的地方:
1.通过网桥合并多个网口
apk add bridge 安装网桥组件,之后编辑 /etc/network/interfaces 文件,将后续的三个网口合并为一个网桥作为 LAN 使用
service networking restart 重启网络,通过 ip link 命令就可以查询到新增加的网桥信息了
考虑到一般的 x86 设备都不会配置专用的转发芯片,建立网桥的性能自然无法和交换机相比,局域网中设备较多,或者经常需要复制文件的用户,建议还是配置一台多口的交换机以提高交换性能
2.通过 dnsmasq 过滤部分广告
dnsmasq 作为轻量的 DNS 服务器,自然可以通过屏蔽一些广告域名来减少网页上广告,但具体的效果取决于网页上的元素和广告的加载方式,加上这个功能总比不加强,当然,也有可能只是图个心理安慰而已
DNS 和 DHCP 的配置不需要有多少改变,只需要在 /etc/dnsmasq.d 目录下新增一个过滤的配置文件,这个时候很多人就要纠结了,网上的广告那么多,难道要自己收集那些域名,想想就觉得可怕,这肯定是不现实的,网上已经有现成的别人收集好的配置,我个人使用了这个项目 anti-ad:
只需要将 anti-ad-for-dnsmasq.conf 文件下载到 /etc/dnsmasq.d 目录下即可,然后重启 dnsmasq 服务就能生效,其提供了多种过滤工具的支持,可以根据需求选择合适的配置文件导入
wget https://anti-ad.net/anti-ad-for-dnsmasq.conf -O /etc/dnsmasq.d/anti-ad-for-dnsmasq.conf
rc-update add dnsmasq default
如果还没添加启动项的话,记得先将其设置为开机启动
service dnsmasq restart
3.使用 nftables 替换 iptables
上一篇我使用 iptables 作为防火墙配置工具对防火墙规则进行了配置,这次我将使用 nftables 代替其工作,至于 nftables 是什么:nftables 是一个 netfilter 项目,旨在替换现有的 {ip,ip6,arp,eb}tables 框架,为 {ip,ip6}tables 提供一个新的包过滤框架、一个新的用户空间实用程序(nft)和一个兼容层。它使用现有的钩子、链接跟踪系统、用户空间排队组件和 netfilter 日志子系统。 官方的说明是这么写的,没看懂也没关系,只要能实现功能即可
安装 nftables apk add nftables,之后就可以使用 nft 命令来配置防火墙规则了,为了便于理解,表和链的命名方式依然沿用 iptables 中使用的命名, nftables 和 iptables 一样,由表(table)、链(chain)和规则(rule)组成,其中表包含链,链包含规则,规则是真正的动作
nftables 与 iptables 常见命令比较:
| 命令 | iptables | nftables |
|---|---|---|
| 列出所有规则 | iptables-save | nft list ruleset |
| 新建表 | iptables 表内置,无法创建 | nft add table ip filter |
| 新建链 | iptables -N | nft add chain ip filter input |
如果需要在 eth0 口上对外开放 ssh 端口,那么可以这样配置:
创建一个名为 filter 的表,匹配 ipv4 数据
nft add table ip filter
在 filter 表中新建一个名为 input 的链,并设置优先级为 0
nft add chain ip filter input { type filter hook input priority 0 ; }
在 eth0 接口上开启 ssh 端口
nft add rule ip filter input iif eth0 tcp dport 22 accept
接受已建立的连接
nft add rule ip filter input ct state { established, related } accept
修改默认的策略,阻止所有连接
nft add chain ip filter input { policy drop ; }
如果要实现上一篇中 iptables 所实现的功能,那么进行如下的配置:
允许回环网口上的连接
nft add rule ip filter input iif lo accpet
允许 br0 网桥上的连接,相当于允许 LAN 上的连接
nft add rule ip filter input iif br0 accept新建 forward 链,用于转发连接,默认阻止一切转发
nft add chain ip filter forward { type filter hook forward priority 0 ; policy drop ; }
允许转发连接,网卡名根据实际的情况决定
nft add rule ip filter forward iif br0 ip saddr 192.168.1.0/24 accept
nft add rule ip filter forward iif eth0 ip daddr 192.168.1.0/24 accept新建 nat 表
nft add table ip nat
新建 postrouting 链,进行源地址转换
nft add chain ip nat postrouting { type nat hook postrouting priority srcnat ; policy accept ; }
在 eth0 上进行地址伪装
nft add rule ip nat postrouting oif eth0 masquerade
使用动态 IP 的防火墙规则如上所述,如果需要使用拨号上网的话,只需要将上面配置中的 eth0 修改为 ppp0 并使用 iifname 或者 oifname 进行匹配,之所以需要换用这种匹配模式,主要是考虑到拨号并不能保证在防火墙启动之前就连接上,iifname 和 oifname 允许匹配不存在的设备名,而 iif 和 oif 基于设备 id,如果不存在就会直接报错,最终导致整个防火墙规则加载失败,软路由就废了
在规则较少的情况下 nftables 和 iptables 的性能差别不大,不过如果你的规则数量超过了 200 条,那么还是推荐使用 nftables 进行配置,性能会更好一些,主要现在很多的主流发行版(包括最新版的 OpenWRT)已经开始使用 nftables 作为防火墙规则的默认配置工具了
所有规则配置完之后记得添加启动项,并保存规则,如果想要深入的学习 nftables,可以参考:
注意事项
重要的事情说三遍,如果要重启或者关机,记得使用
lbu commit命令来固化所有修改,如果要重启或者关机,记得使用lbu commit命令来固化所有修改,如果要重启或者关机,记得使用lbu commit命令来固化所有修改有些时候使用
lbu cmmmit不一定能完全保留所有已经修改的配置文件,可以使用lbu include add 文件完整路径进行手动添加,之后再通过lbu cmmmit合并保存,此时就可以通过lbu ls |grep 文件名查询到了
实测
最终收获了和上一次同样的效果,还不怕意外断电了,60分及格了,后续再优化扩充一下吧!
最后
将 Alpine 安装进内存并充当软路由的过程大致就是这样了,朋友们,希望你们能有所启发,那么,咱们下回见,谢谢!
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~




























allen2000
因为没有用过软路由,想问一下这样做的话,系统稳定性如何?比如可以半年或者以上不重启稳定运行吗?性能应该足够普通家庭网络使用了吧?
另外最后你只打了个60分及格,是系统有什么不足之处或者缺点吗?是否也可以分享一下?
校验提示文案
一名二白
校验提示文案
蓝色精英S
校验提示文案
值友1090261596
校验提示文案
值友1090261596
校验提示文案
allen2000
因为没有用过软路由,想问一下这样做的话,系统稳定性如何?比如可以半年或者以上不重启稳定运行吗?性能应该足够普通家庭网络使用了吧?
另外最后你只打了个60分及格,是系统有什么不足之处或者缺点吗?是否也可以分享一下?
校验提示文案
蓝色精英S
校验提示文案
一名二白
校验提示文案