弹霄博科

小谈谈一亩三分地



在路由器中运行 Python


发布日期: 2017/09/24
更新日期: 2020/04/27
作者: 小谈谈
分类: 笔记
标签: python, openwrt, lede
阅读时间: 4 分钟
字数: 1005 字


本文原文名:记在路由器中实现热点自动认证

本文主要记录我在路由器中实现热点自动认证的过程,由于一些原因,本文不讨论程序。

本文主要提及以下内容。

1.使用 U 盘扩展 OpenWrt 路由器的存储空间并安装 Python 2.解决 Python 无法加载共享库 libpython2.7.so.1.0 3.将脚本注册为启动项

一些约定

系统:LEDE(OpenWrt) 内存:128M 存储体:128M U 盘:/dev/sda U 盘挂载点:/mnt/usb

OpenWrt 挂载 USB

安装软件包

以下为必要包:

opkg update #更新源 opkg install kmod-usb-ohci #支持部分USB芯片的驱动 opkg install kmod-usb2 #USB2.0驱动 opkg install kmod-usb-storage #USB储存驱动 opkg install block-mount #挂载程序(安装完成后重启会在LuCI界面的System下出现Moint Point选项) opkg install kmod-fs-ext4 #支持EXT4分区格式

以下包为选装:

opkg install kmod-fs-vfat #挂载FAT opkg install kmod-fs-ext2 #安装ext2分区支持 opkg install ntfs-3g #挂载NTFS opkg install kmod-fs-ntfs #ntfs内核驱动 opkg install e2fsprogs #分区格式化工具

挂载 U 盘分区

在挂载 U 盘前,需要将 U 盘格式化为 EXT4(mkfs.ext4 /dev/sda),因为 FAT 无法支持软连接,后期安装一些软件会报错。

两种方法均可实现功能,既可以在 LuCI 界面下进入 System -> Moint Point 下挂载 U 盘,也可以执行 mount /dev/sda /mnt/usb

设置 Opkg 安装目录

修改 opkg 配置文件(vi /etc/opkg.conf),在 dest root/ 下添加一行,保存退出。

dest usb /mnt/usb/optware

配置环境变量

修改文件(vi /etc/profile),在相关位置增加两行,保存退出。

export LDLIBRARYPATH=/mnt/usb/optware/usr/lib:/mnt/usb/optware/lib export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/mnt/usb/optware/usr/bin:/mnt/usb/optware/usr/sbin

使环境变量生效(source /etc/profile

安装 Python

使用源安装

如果你的路由器系统 opkg 源没有问题,直接安装到 U 盘就好,也推荐直接安装,编译安装可能会有其他问题。

opkg install python -d usb

等待安装完成即可。

一个小问题

笔者这样安装之后,在终端中执行 python 命令,没有问题,但加载到启动项后就就会报找不到 Python,如果你指定一下 Python 的 路径,加载到启动项又会出现如下问题。

Error loading shared library libpython2.7.so.1.0: No such file or directory (needed by /mnt/usb/optware/usr/bin/python2.7) Error relocating /mnt/usb/optware/usr/bin/python2.7: Py_Main: symbol not found

最终笔者是采用建立软连接解决以上问题的。

ln -s  /mnt/usb/optware/usr/bin/python /usr/bin/python ln -s  /mnt/usb/optware/usr/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0

分别在系统存储中建立 Python 程序和其动态链接库的软连接。这样就可以在启动项中正常启动 Python。

加载启动项

这里说两个方法

注册启动项

编辑 rc.local(vi /etc/rc.local),直接把命令写入到 exit 0 之前即可,或在 LuCI 中完成相关操作。

注册服务

这时需要为这个服务写一个自启动脚本放在 /etc/init.d/ 目录下,一个服务大概有启动、重启两个选项,当然你也可以自己定义,下面是一个例子(drcom)。

#!/bin/sh /etc/rc.common

START 是启动优先级,STOP 是关闭优先级,这个决定在启动或在关闭的过程中服务执行的先后顺序,比如你一些程序放在 U 盘里,就需要在挂载 U 盘服务启动之后再去执行这个服务。

START=99 STOP=15

start(){

# 启动程序,把输出和错误都重定向到了/dev/null python /mnt/usb/drcom/dr.py >/dev/null 2>&1 }

stop(){

# 停止

}

然后 enable 一下(/etc/init.d/drcom enable),你会发现 /rc.d/ 中新增了一个这个脚本的软连接,到此自启动服务配置成功。

后记

大概这就是我周末做的一些微小的事情,主要是分享经验,感谢我的一些朋友给我的帮助,由于知识水平有限,本文可能有些许问题,欢迎在留言区批评指正。