J4125折腾笔记5 把 Alpine 装进内存

2022-04-27 11:23:45 16点赞 69收藏 11评论

前言

普通的硬件路由器,没有意外的情况下,不管你怎么断电,怎么重启,内置的系统一般都不会出现损坏,即使真遇到了什么问题,重置一下就能解决大部分问题;反观我所折腾的软路由,由于使用的是普通的 Linux 发行版,系统文件都是存储在磁盘上的,常见的 EXT4 和 XFS 文件系统可没有对意外断电进行优化,那么,有很大概率因为意外断电就挂了(特别是在进行数据读写的时候),为此,我计划对此进行一些改进,比如:把系统安装进内存

OpenWRT 也是运行在内存上的,用惯了的朋友其实没必要折腾了,当然,想要尝试一下新方案的朋友,也可以看看,希望能给大家一点启发

上一篇分享中实现的路由功能主要基于虚拟机,这次使用实机进行安装配置,当然为了更加实用,稍微调整了一些功能操作。不过把系统装进内存,并不是真的只需要有内存就能运行,而是在系统正常启动之后,所有运行所需的文件和配置都加载到内存,此时不管有没有硬盘都不会影响系统的正常运行,这就像是 PE 启动盘,PE 正常加载之后完全可以拔掉启动 U 盘,不仅可以脱离引导磁盘,还减少了系统对磁盘的读写,对于一些矿机上面的那种战损固态来说,这样可以有效延长寿命,很不幸的是,我连战损固态都没有,不过我有很多客户送的杂牌 U 盘,用U盘做引导和临时存储其实也不错,性能渣也没事,系统启动载入之后就没它什么事了

系统安装

Alpine Linux 的安装镜像可以直接从其官网进行下载,注意需要下载 EXTENDED 版本

alpinealpine

需要准备的材料:

  • 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 盘引导后就可以看到刚刚丢进去的镜像了

VentoyVentoy

跑过一串加载信息之后,就正式启动系统了,使用 root 账户进行登录了,默认情况下无密码

bootboot

loginlogin

之后使用 df -h 命令查看分区的挂载情况,此处需要注意 /media/dm-0 这个挂载点,这个相当于是整个安装镜像的挂载目录,后续安装所需要的文件都在这个目录下,记住其命名,后续会用到

dfdf

此时就可以将另一个 U 盘插上了,插上后直接使用 fdisk -l 查看设备名,确定为 sdb

fdiskfdisk

一般设备的命名按照 a b c d 这样的字母顺序依次进行,所以后插入的设备肯定排在现有设备名之后

确定设备名之后直接使用 fdisk /dev/sdb 进入分区操作,下述操作清空了所有分区,然后创建了两个分区,第一个分区2G,作为引导分区,另一个分区使用剩余空间

partpart

分区使用的指令及说明如下所示:

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

sda1sda1

这个时候插拔一下新插入的 U盘,让系统重新识别一下即可,此处需要注意使用 partprobe 命令并没有什么用,还是插拔一下实在

格式化两个分区,直接使用 fat32 文件系统 mkdosfs -F32mkfs.vfat 都可以,并使用 setup-bootable 命令将系统写入引导分区,注意系统镜像的挂载点为 /media/dm-0

bootablebootable

接下来就可以拔掉第一个 U 盘,直接重启系统,使用第二个 U 盘进行引导,使用 root 账户登录,查看一下分区挂载情况,可以看到镜像目录名变成了 /media/sda1 ,容量也是2G

new usbnew usb

在进行安装之前,先将 U 盘上的第二个分区挂载一下,方便后续安装识别

mkdir /media/sda2
mount /dev/sda2 /media/sda2

使用 setup-alpine 进行最后的系统安装和配置

J4125折腾笔记5 把 Alpine 装进内存

J4125折腾笔记5 把 Alpine 装进内存

J4125折腾笔记5 把 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 完成系统的初始化,切记不要忘了这一步,当然,如果哪天你想清空配置,也可以将这个文件直接删除,重启之后就恢复默认配置了

apkvovlapkvovl

重启后登录系统,通过挂载信息发现,系统的根目录使用的是 tmpfs,相当于挂载在内存上,如果你有兴趣尝试一下的话,完全可以拔掉 U 盘尝试下会不会挂

installedinstalled

软路由配置

完整的配置可以参考我上一篇分享

我的另类软路由方案——Alpine Linux改造创作立场声明:不为别的,只为分享自己的一些经验收获起因现在说到软路由,好像大家第一个想到的就是OpenWRT,OpenWRT的确是很好用,但好奇心作祟,既然OpenWRT是一款Linux发行版,那么如果使用别的Linux发行版是不是也能获得相同的功能?答案当然是肯定的,由于使用过不少Linux发行版干脆面爱洗手| 106 评论71 收藏239查看详情

以下主要介绍一些做出改动的地方:

1.通过网桥合并多个网口

apk add bridge 安装网桥组件,之后编辑 /etc/network/interfaces 文件,将后续的三个网口合并为一个网桥作为 LAN 使用

bridgebridge

interfaceinterface

service networking restart 重启网络,通过 ip link 命令就可以查询到新增加的网桥信息了

J4125折腾笔记5 把 Alpine 装进内存

考虑到一般的 x86 设备都不会配置专用的转发芯片,建立网桥的性能自然无法和交换机相比,局域网中设备较多,或者经常需要复制文件的用户,建议还是配置一台多口的交换机以提高交换性能

2.通过 dnsmasq 过滤部分广告

dnsmasq 作为轻量的 DNS 服务器,自然可以通过屏蔽一些广告域名来减少网页上广告,但具体的效果取决于网页上的元素和广告的加载方式,加上这个功能总比不加强,当然,也有可能只是图个心理安慰而已

DNS 和 DHCP 的配置不需要有多少改变,只需要在 /etc/dnsmasq.d 目录下新增一个过滤的配置文件,这个时候很多人就要纠结了,网上的广告那么多,难道要自己收集那些域名,想想就觉得可怕,这肯定是不现实的,网上已经有现成的别人收集好的配置,我个人使用了这个项目 anti-ad:

anti-ADanti-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

download confdownload conf

J4125折腾笔记5 把 Alpine 装进内存

3.使用 nftables 替换 iptables

上一篇我使用 iptables 作为防火墙配置工具对防火墙规则进行了配置,这次我将使用 nftables 代替其工作,至于 nftables 是什么:nftables 是一个 netfilter 项目,旨在替换现有的 {ip,ip6,arp,eb}tables 框架,为 {ip,ip6}tables 提供一个新的包过滤框架、一个新的用户空间实用程序(nft)和一个兼容层。它使用现有的钩子、链接跟踪系统、用户空间排队组件和 netfilter 日志子系统。 官方的说明是这么写的,没看懂也没关系,只要能实现功能即可

install nftablesinstall nftables

安装 nftables apk add nftables,之后就可以使用 nft 命令来配置防火墙规则了,为了便于理解,表和链的命名方式依然沿用 iptables 中使用的命名, nftablesiptables 一样,由表(table)、链(chain)和规则(rule)组成,其中表包含链,链包含规则,规则是真正的动作

nftables 与 iptables 常见命令比较:

命令iptablesnftables
列出所有规则iptables-savenft list ruleset
新建表iptables 表内置,无法创建nft add table ip filter
新建链iptables -Nnft 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 ; }

enable sshenable ssh

如果要实现上一篇中 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

J4125折腾笔记5 把 Alpine 装进内存

enable nftablesenable nftables

使用动态 IP 的防火墙规则如上所述,如果需要使用拨号上网的话,只需要将上面配置中的 eth0 修改为 ppp0 并使用 iifname 或者 oifname 进行匹配,之所以需要换用这种匹配模式,主要是考虑到拨号并不能保证在防火墙启动之前就连接上,iifnameoifname 允许匹配不存在的设备名,而 iifoif 基于设备 id,如果不存在就会直接报错,最终导致整个防火墙规则加载失败,软路由就废了

在规则较少的情况下 nftablesiptables 的性能差别不大,不过如果你的规则数量超过了 200 条,那么还是推荐使用 nftables 进行配置,性能会更好一些,主要现在很多的主流发行版(包括最新版的 OpenWRT)已经开始使用 nftables 作为防火墙规则的默认配置工具了

所有规则配置完之后记得添加启动项,并保存规则,如果想要深入的学习 nftables,可以参考:

注意事项

  • 重要的事情说三遍,如果要重启或者关机,记得使用 lbu commit 命令来固化所有修改,如果要重启或者关机,记得使用 lbu commit 命令来固化所有修改,如果要重启或者关机,记得使用 lbu commit 命令来固化所有修改

  • 有些时候使用 lbu cmmmit 不一定能完全保留所有已经修改的配置文件,可以使用 lbu include add 文件完整路径 进行手动添加,之后再通过 lbu cmmmit 合并保存,此时就可以通过 lbu ls |grep 文件名 查询到了

实测

最终收获了和上一次同样的效果,还不怕意外断电了,60分及格了,后续再优化扩充一下吧!

testtest

最后

将 Alpine 安装进内存并充当软路由的过程大致就是这样了,朋友们,希望你们能有所启发,那么,咱们下回见,谢谢!

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
11评论

  • 精彩
  • 最新
  • 文章写的很不错,适合有一定技术背景的读者。比较吸引我的是看到了alpine linux diskless mode,结合之前的一篇文章,可以DIY一个不怕断电的路由器系统,并在上面跑一些轻量级的服务。
    因为没有用过软路由,想问一下这样做的话,系统稳定性如何?比如可以半年或者以上不重启稳定运行吗?性能应该足够普通家庭网络使用了吧?
    另外最后你只打了个60分及格,是系统有什么不足之处或者缺点吗?是否也可以分享一下?

    校验提示文案

    提交
    稳定性没有问题,J4125应该算是去年最热门的处理器了,性能应付家庭网络是无需担心的,至于为啥只有60分,主要是因为有些功能不方便在平台上细讲,并不完整,自然只能算及格啦,后续看看怎么讲比较合适

    校验提示文案

    提交
    好的,知道了。技术性的文章总是能让人体验到学习的快乐,十分感谢。

    校验提示文案

    提交
    收起所有回复
  • 可以 十分专业了

    校验提示文案

    提交
    感谢你的支持

    校验提示文案

    提交
    收起所有回复
  • 感谢分享,思路很好。不过这个最怕的是以外断电了吧?

    校验提示文案

    提交
    这个完全运行在内存上,使用的u盘只在开机或者保存配置的时候才会写入,平时正常运行的时候你甚至可以直接拔掉,我这样操作的目的主要就是为了避免断电导致的磁盘损坏

    校验提示文案

    提交
    恩,原理听明白了。我说的意外断电是指如果对路由做了一些修改,没有保存的话,意外断电,就是噩梦了吧?

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 有个问题想问下,为什么一定要格式化为 fat32 ,直接用ext4应该也行吧

    校验提示文案

    提交
    efi引导必须fat

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
69
扫一下,分享更方便,购买更轻松