路由器挂载虚拟内存教程
对于内存小的路由器,运行
GoLang编译的可执行程序
经常会遇到Out of memory
这样的一堆异常报错,那么你非常有必要挂载个U盘作为交换区了(前提是路由器得有USB接口)。
使用我开发的Clash路由器插件时,如果不挂载虚拟内存,这个AC86U路由器上就无法启动Clash服务,这也是一些人反馈安装上了但无法启动的原因。
今天,给大家介绍下如何给自己的路由器挂载虚拟内存(交换区),让Golang语言编写的程序不再因内存问题而无法启动。
准备工具:
- 路由器(支持USB接口)
- 一个优盘(使用1GB空间即可)
U盘:创建一个Ext4
分区,大小是自己路由器实际内存的2倍足够。
比如:一个 32GBU盘,可以分区1 GB
的Ext4
分区作为交换区,其余作为数据分区挂载到路由器上使用。
操作步骤:
- 开机中的路由器,优盘插到路由器上,此时路由器上识别地址为
/dev/sda
(一定要正确!)。 - 创建分区(分配1GB虚拟内存交换区)
- 挂载虚拟内存交换区!
- 配置开启自动挂载虚拟内存。
到这里就搞定啦!
优盘分区
使用工具: fdisk
使用fdisk命令分两个Linux分区,第一个1GB
,剩余空间为第二个分区。
fdisk操作过程这里不介绍了。
文件方式挂载交换区
使用文件方式
挂载交换区的命令如下:
# 说明: 假如挂载U盘目录为 /tmp/mnt/sda1
#
# 第一步: 创建交互区文件, 1GB
dd if=/dev/zero of=/tmp/mnt/sda1/swapfile bs=1MB count=1024
# 第二步: 在一个文件里创建linux交换区
mkswap /tmp/mnt/sda1/swapfile
# 第三步: 激活使用交换区
swapon /tmp/mnt/sda1/swapfile
简化后的操作命令如下:
# /tmp/mnt/sdx1 为插入优盘后自动挂载目录( df 命令查看),需要修改为自己的优盘路径!!!!
usb_dir=/tmp/mnt/sdx1
ls -d ${usb_dir} && dd if=/dev/zero of=${usb_dir}/swapfile bs=1MB count=1024 && mkswap ${usb_dir}/swapfile && swapon ${usb_dir}/swapfile
操作过程的演示视频如下:
相信看过上视频很快你就可以自己完成虚拟内存挂载操作的.
接下来,我们再来了解一下使用分区方式完成挂载虚拟内存操作.
分区方式挂载交换区
如果想使用整个分区方式
作为交换区,那就这样执行:
# 前提: 操作前,先卸载分区
$ umount /dev/sda1
# 第一步: 在一个分区设备里创建linux交换区
$ mkswap /dev/sda1
Setting up swapspace version 1, size = 1073737728 bytes
UUID=f31d66a2-f49d-4ff3-93df-96c7676e889d
# 第二步: 激活使用交换区
swapon /dev/sda1
开启自动挂载交换区方法
上面的操作,下次重启后并不会自动挂载交换区,因此还需要添加个开机自动挂载交换区操作,这个方法有很多:
- 通常是配置到
/etc/fstab
文件中即可,但是路由器上不能这么用。 - 添加到
cron
调度中,重启后自动挂载交换区@reboot swapon /dev/sda1
,可选,但是添加不久后会被其他脚本给删除掉,不能用。 - 添加开启自动挂载脚本强烈推荐,具体操作如下:
cat <<END > /koolshare/init.d/S90MountSwap.sh
#!/bin/sh
# 挂载虚拟内存开启脚本
res="失败"
# 文件方式挂载
/sbin/swapon ${usb_path}/swapfile
[ "\$?" = "0" ] && res="成功"
logger -st "\$(date +'%Y年%m月%d日%H:%M:%S'):S90MountSwap" "挂载虚拟内存: \${res}"
END
这里要注意文件名规则
S90
开头了,如果设置S01
开头会因为早于磁盘挂载前执行了挂虚拟内存脚本而失败的哦。
最新版本自动挂载虚拟内存脚本
上面的脚本在重启路由后是有问题的,U盘还没挂载成功就执行了挂载虚拟内存脚本,因此会由于无法找到swapfile而执行失败.
最好的办法就是等待swapfile能找到时再执行自动挂载虚拟内存,因此就有了下面的脚本:
#!/bin/sh
# 挂载虚拟内存开启脚本
res="失败"
swapfile=/dev/sda1
filename=`basename $0`
i=1
while [ "$i" -le "10" ] ;
do
ls $swapfile
if [ "$?" = "0" ] ; then
logger -st "$(date +'%Y年%m月%d日%H:%M:%S'):$filename" "$swapfile 已准备好!"
break
fi
logger -st "$(date +'%Y年%m月%d日%H:%M:%S'):$filename" "$swapfile 没找到!"
i=`expr $i + 1`
sleep 1
done
/sbin/swapon $swapfile
[ "$?" = "0" ] && res="成功"
logger -st "$(date +'%Y年%m月%d日%H:%M:%S'):$filename" "挂载虚拟内存: ${res}"
怎么查看是否挂载成功了呢?
$ free -h # 查看 Swap 是否为0? 还是0说明失败了.
$ grep S90MountSwap /tmp/syslog.log # 查看输出日志,分析执行过程和结果.
最后
为什么不用插件?
实际体验了一下自带的挂载虚拟内存插件,低速的U盘插件检测不通过!
可能作者出于性能考虑,低速U盘会降低服务响应速度,但虚拟内存实际情况下被用到的时候不多,因此我选择了自己动手挂载个普通低速优盘就可以了.
为什么选择低速U盘?
废物利用(速度也不是很低,32GB的USB3.0闪存优盘),等手里的固态优盘淘汰时再给路由器加个固态U盘吧。
路由器有两个USB接口,一个USB2.0,一个USB3.0,USB3.0接了硬盘,USB2.0接固态盘也是浪费。
没有U盘?
推荐几个U盘:
推荐一:双接口TYPE-C/USB3.1接口的U盘
忆捷 64GB Type-C/USB3.1手机U盘双接口,读速140MB/s
推荐二:小巧便携的U盘
闪迪(SanDisk)小巧便携u盘 酷豆CZ33(黑)USB2.0 16GB
推荐三:MLC芯片固态U盘
【MLC芯片】兰科芯USB3.1高速读写固态优盘 32G
如果打算买固态优盘,还是推荐MLC芯片
的优盘吧,因为MLC芯片的优盘寿命更长(同容量同主控芯片的 TLC 芯片相比),写入次数更多,读写速度更稳定.
我这里自动挂载没效果。
swapfile的路径我改了,S90MountSwap.sh也chmod 777了,但是路由一重启,用free看就全是0
这个脚本重启后会因为执行顺序问题,再U盘没挂载成功时就执行了,因此虚拟内存没执行成功,最后更新了一下,加个u盘挂载成功判断条件就解决了.
请教大神:开启自动挂载交换区方法中,把第一行从cat 开始一直到最后一行的end 复制后通过SSH一次性黏贴进去?编程小白不懂这些。
目前被华硕AC86u 虚拟内存无法加载优盘困扰了很久,你的这个方法好像可行。但是自动挂载这部分没有看懂,敬请大神多多指导。
对,cat 到 END 内容复制后直接在SSH控制台界面执行就可以。
S90表示脚本执行的优先级,数值小的脚本先执行,依赖挂载优盘的脚本放在S90之后,通常普通的后台脚本会使用S99开头命名。
这样解释,明白没? 另外这里也有视频操作演示的,放心执行,有错误可以反馈留言。