路由器挂载虚拟内存教程

对于内存小的路由器,运行GoLang编译的可执行程序经常会遇到Out of memory这样的一堆异常报错,那么你非常有必要挂载个U盘作为交换区了(前提是路由器得有USB接口)。

使用我开发的Clash路由器插件时,如果不挂载虚拟内存,这个AC86U路由器上就无法启动Clash服务,这也是一些人反馈安装上了但无法启动的原因。

今天,给大家介绍下如何给自己的路由器挂载虚拟内存(交换区),让Golang语言编写的程序不再因内存问题而无法启动。

准备工具:

  • 路由器(支持USB接口)
  • 一个优盘(使用1GB空间即可)

U盘:创建一个Ext4分区,大小是自己路由器实际内存的2倍足够。
比如:一个 32GBU盘,可以分区1 GBExt4分区作为交换区,其余作为数据分区挂载到路由器上使用。

操作步骤:

  1. 开机中的路由器,优盘插到路由器上,此时路由器上识别地址为/dev/sda(一定要正确!)。
  2. 创建分区(分配1GB虚拟内存交换区)
  3. 挂载虚拟内存交换区!
  4. 配置开启自动挂载虚拟内存。

到这里就搞定啦!

优盘分区

使用工具: 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

开启自动挂载交换区方法

上面的操作,下次重启后并不会自动挂载交换区,因此还需要添加个开机自动挂载交换区操作,这个方法有很多:

  1. 通常是配置到/etc/fstab文件中即可,但是路由器上不能这么用
  2. 添加到cron调度中,重启后自动挂载交换区@reboot swapon /dev/sda1,可选,但是添加不久后会被其他脚本给删除掉,不能用。
  3. 添加开启自动挂载脚本强烈推荐,具体操作如下:
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

忆捷 64GB Type-C/USB3.1手机U盘双接口,读速140MB/s
忆捷 64GB Type-C/USB3.1手机U盘双接口,读速140MB/s

推荐二:小巧便携的U盘

闪迪(SanDisk)小巧便携u盘 酷豆CZ33(黑)USB2.0 16GB

闪迪(SanDisk)小巧便携u盘 酷豆CZ33(黑)USB2.0 16GB
闪迪(SanDisk)小巧便携u盘 酷豆CZ33(黑)USB2.0 16GB

推荐三:MLC芯片固态U盘

【MLC芯片】兰科芯USB3.1高速读写固态优盘 32G

【MLC芯片】兰科芯USB3.1高速读写固态优盘 32G
【MLC芯片】兰科芯USB3.1高速读写固态优盘 32G
【MLC芯片】兰科芯USB3.1高速读写固态优盘 32G
【MLC芯片】兰科芯USB3.1高速读写固态优盘 32G

如果打算买固态优盘,还是推荐MLC芯片的优盘吧,因为MLC芯片的优盘寿命更长(同容量同主控芯片的 TLC 芯片相比),写入次数更多,读写速度更稳定.