技巧方案

梅林固件挂载虚拟内存

鹏少 · 3月28日 · 2020年 · · 1802次已读

前段时间由于特殊原因,需要在路由器上挂载虚拟内存,但根据要求将磁盘格式化成ext2|3|4格式后,却显示磁盘格式不符合严要求,尝试很多办法后,仍然无果。

功夫不负有心人,最后终于在KoolShare论坛找到了一个比较靠谱并且简单暴力的教程,成功解决问题。

在此感谢作者@ bbis ,教程如下:(主要内容不变,更换了所有截图)

软配置

登录路由器后台,进入【 系统管理 】-【 系统设置 】,开启 JFFS2 和 SSH 功能 ,应用设置后,重启路由器生效;

下载 WinSCP 后,输入路由器IP,选择SCP协议,填写用户名与密码后登录;

进入路由器主目录<root>;

依次进入 /jffs/scripts/目录后,新建文件,命名为 sdaswap ;

双击打开 sdaswap 文件后, 选择 UTF-8 编码 ,将下面脚本代码复制到编辑器后保存;

也可下载文件版 sdaswap ,解压后直接拖拽至 /jffs/scripts/目录 ;


#!/bin/sh
R_BOLD="\033[31m\033[1m"
G_BOLD="\033[32m\033[1m"
BOLD="\033[33m\033[1m"
NORM="\033[0m"
INFO="$BOLD Info: $NORM"
ERROR="$BOLD *** Error: $NORM"
INPUT="$BOLD => $NORM"

SWAP_FILE=`nvram get apps_swap_file`
SWAP_SIZE=`nvram get apps_swap_size`
i=1
cd /tmp

swap_info(){
       echo -e "**********************************************************"
       echo -e ""
       echo -e "  ${G_BOLD}虚拟内存:$NORM  总计($G_BOLD$(free |grep -A1 "Swap" |awk   '{print $2}')$NORM)  已用($G_BOLD$(free |grep -A1 "Swap" |awk   '{print $3}')$NORM)  可用($G_BOLD$(free |grep -A1 "Swap" |awk   '{print $4}')$NORM)"
       echo -e ""
       echo -e "**********************************************************"
}


case "$1" in
  start)
echo -e "$INFO 此脚本文件指导创建虚拟内存"
echo -e "$INFO 默认创建的虚拟内存文件存放在 \"swap\" 文件夹并不可改变"
echo -e "$INFO 检查可用的挂载分区......"
for mounted in `/bin/mount |awk '{if($0 ~/mnt/){ print $3}}'` ; do
  echo -e "$G_BOLD [$i] --> $mounted $NORM"
  eval mounts$i=$mounted
  i=`expr $i + 1`
done

if [ $i == "1" ] ; then
  echo -e "$ERROR $R_BOLD 未找到挂载磁盘,执行退出。$NORM"
  exit 1
fi

echo -en "$INPUT $BOLD 请输入磁盘分区序号或键入 0 退出程序 $NORM\n$BOLD[0-`expr $i - 1`]$NORM: "
read partitionNumber
if [ "$partitionNumber" == "0" ] ; then
  echo -e $INFO 执行退出...  
  exit 0
fi
if [ "$partitionNumber" = "" ] || [ "`echo $partitionNumber|sed 's/[0-9]//g'`" != "" ] ; then  
  echo -e "$ERROR $R_BOLD 无效的参数,执行退出...$NORM"
  exit 1
fi
if [ "$partitionNumber" -gt `expr $i - 1` ] ; then
  echo -e "$ERROR $R_BOLD 分区序号无效,执行退出...$NORM"
  exit 1
fi

eval entPartition=\$mounts$partitionNumber
echo -e "$INFO 已选择$G_BOLD $entPartition $NORM磁盘分区"
APPS_INSTALL_PATH=$entPartition/swap


mem_size=`free |awk '$0 ~/Swap/{print $4}'`
pool_size=`df |awk '{if($0 ~"'$entPartition'") {print $4}}'`
if [ $pool_size -gt $SWAP_SIZE ]; then
        [ -e "$APPS_INSTALL_PATH/$SWAP_FILE" ] && swapoff $APPS_INSTALL_PATH/$SWAP_FILE
        [ -d "$APPS_INSTALL_PATH" ] && rm -rf $APPS_INSTALL_PATH
        echo -e "$INFO 创建虚拟内存文件夹: $APPS_INSTALL_PATH "
        mkdir -p $APPS_INSTALL_PATH
        echo -en "$INFO 默认虚拟内存大小: [$BOLD$SWAP_SIZE$NORM],新文件大小:\c $BOLD"
        read answer
        if [ "$answer" = "" ]
        then
        {
        echo -e "$INFO 虚拟内存大小未改变"
        }
        else
        {
             if [ "$answer" != "" ] && [ "`echo $answer|sed 's/[0-9]//g'`" = "" ] && [ $answer -lt $pool_size ]
             then
             {
                  SWAP_SIZE=$answer                                                                  
                  echo -en "$INFO 虚拟内存大小已改变: $BOLD[$SWAP_SIZE]$NORM \n"
             }
            else
            {
                  echo -e "$ERROR $R_BOLD 无效的参数! $NORM"
                  exit 1
            }
            fi
        }
        fi
       swap_count=`expr $SWAP_SIZE / 1000 - 1`
       echo -e "$INFO dd if=/dev/zero of=$APPS_INSTALL_PATH/$SWAP_FILE bs=1M count=$swap_count"
       dd if=/dev/zero of=$APPS_INSTALL_PATH/$SWAP_FILE bs=1M count=$swap_count
       echo -e "$INFO 已创建虚拟内存文件: $APPS_INSTALL_PATH/$SWAP_FILE"
       mkswap $APPS_INSTALL_PATH/$SWAP_FILE
       echo -e "$INFO $G_BOLD 虚拟内存路径:$APPS_INSTALL_PATH/$SWAP_FILE $NORM"
       swapon $APPS_INSTALL_PATH/$SWAP_FILE

           swap_info

       fi
       echo -e "$INFO 是否创建启动项? y? :\c "
       read yor
       if [ "$yor" = "y" ]
       then
       {
       [ -e "/jffs/scripts/services-start" ] && [ `cat /jffs/scripts/services-start |awk '{if($0 ~/swapon/) {print $0}}'|wc -l` -ge 1 ] &&\
       sed -i 'N;/\n.*swapon/!P;D' /jffs/scripts/services-start && sed -i '/swapon/d' /jffs/scripts/services-start
       [ ! -e "/jffs/scripts/services-start" ] && echo "#!/bin/sh" > /jffs/scripts/services-start
       [ `grep "#!/bin/sh" /jffs/scripts/services-start |wc -l` -lt 1 ] && sed -i '1i#!\/bin\/sh' /jffs/scripts/services-start
       sed -i '1asleep 30' /jffs/scripts/services-start
       sed -i '2aswapon '$APPS_INSTALL_PATH'/'$SWAP_FILE'' /jffs/scripts/services-start
           chmod 755 /jffs/scripts/services-start
       echo -e "$INFO $G_BOLD开机启动项已创建! $NORM"
       }
       else
       {
       echo -e "$INFO $G_BOLD开机启动项未创建成功,执行退出... $NORM"
       exit 1
       }
       fi
       ;;
  stop)
echo -e "$INFO 请选择要卸载虚拟内存的文件路径"
echo -e "$INFO 检查可用的挂载分区......"
for mounted in `/bin/mount |awk '{if($0 ~/mnt/){ print $3}}'` ; do
  echo -e "$G_BOLD [$i] --> $mounted $NORM"
  eval mounts$i=$mounted
  i=`expr $i + 1`
done

if [ $i == "1" ] ; then
  echo -e "$ERROR $R_BOLD 未找到挂载磁盘,执行退出。$NORM"
  exit 1
fi

echo -en "$INPUT $BOLD 请输入磁盘分区序号或键入 0 退出程序 $NORM\n$BOLD[0-`expr $i - 1`]$NORM: "
read partitionNumber
if [ "$partitionNumber" == "0" ] ; then
  echo -e $INFO 执行退出...  
  exit 0
fi
if [ "$partitionNumber" = "" ] || [ "`echo $partitionNumber|sed 's/[0-9]//g'`" != "" ] ; then  
  echo -e "$ERROR $R_BOLD 无效的参数,执行退出...$NORM"
  exit 1
fi
if [ "$partitionNumber" -gt `expr $i - 1` ] ; then
  echo -e "$ERROR $R_BOLD 分区序号无效,执行退出...$NORM"
  exit 1
fi

eval entPartition=\$mounts$partitionNumber
echo -e "$INFO 已卸载$G_BOLD $entPartition/swap/$SWAP_FILE $NORM虚拟内存文件"
APPS_INSTALL_PATH=$entPartition/swap

       [ -e "/jffs/scripts/services-start" ] && [ `cat /jffs/scripts/services-start |awk '{if($0 ~/swapon/) {print $0}}'|wc -l` -ge 1 ] &&\
       sed -i 'N;/\n.*swapon/!P;D' /jffs/scripts/services-start && sed -i '/swapon/d' /jffs/scripts/services-start
       [ -e "$APPS_INSTALL_PATH/$SWAP_FILE" ] && swapoff $APPS_INSTALL_PATH/$SWAP_FILE                        
       [ -d "$APPS_INSTALL_PATH" ] && rm -rf $APPS_INSTALL_PATH      
           swap_info
       ;;

  info)
       swap_info
       ;;

  *)
  exit 1
  ;;
esac

右键 sdaswap 文件,打开属性,权限设置为0755(可读写、执行)后关闭 WinSCP 窗口即可;

准备工作

进入路由器软件中心, 安装并打开 shellinabox 命令工具( 或者 PuTTy 运行命令 ) ;

命令参数

  • 创建虚拟内存:/jffs/scripts/sdaswap start
  • 停用虚拟内存:/jffs/scripts/sdaswap stop
  • 虚拟内存用量:/jffs/scripts/sdaswap info

注意事项

脚本自动扫描路由器外接的USB设备,列出所有存储类设备供选择使用哪个USB硬盘作为虚拟内存的载体。( 支持NTFS\EXT2,3,4 )

建议使用高速U盘或者SSD硬盘,虚拟内存类似于普通内存,需要多次高速读写,整体速度取决于USB设备的速度。

执行命令

创建虚拟内存

在编辑器内输入路由器账号与登录密码,回车后输入命令 :/jffs/scripts/sdaswap start 并执行, 此时会自动加载USB硬盘,选择需要挂载的盘符(绿色区),输入相应数字后,回车执行;

下面可以根据需求选择虚拟内存大小,回车执行;

  • 默认为32M=33000
  • 256M =>256144
  • 512M => 524288
  • 1GB => 1048576

回车执行后,稍等片刻即可创建成功,最后提示,是否创建开机启动项;

输入 y,回车即可创建成功。

查看内存用量

输入代码后执行: /jffs/scripts/sdaswap info

停用虚拟内存

输入代码后执行: /jffs/scripts/sdaswap stop

文章转载自KoolShare论坛,点击查看原文

3 条回应
  1. 头像
    逍遥2020-4-17 · 14:15

    鹏少大大,我TL-WDR6300咋刷梅林想去墙外看看,不过网上资料少的可怜,只见几个人刷成功了,教程几乎没有…

    • 鹏少
      鹏少2020-4-18 · 12:51

      不一定要刷梅林啊,用其它客户端也可以啊

    • 头像
      bosshhh2020-4-23 · 15:13

      其实只要能刷的固件,都有去墙外的功能,你可以找找其他的