小米路由器3G建站折腾笔记4 - 安装opkg和onmp

时间:2024-04-04 16:01:45

小米路由器3G建站折腾笔记1 - 引言与路由器选择
小米路由器3G建站折腾笔记2 - 刷ROM和开启SSH
小米路由器3G建站折腾笔记3 - 网站架构选择
小米路由器3G建站折腾笔记4 - 安装opkg和onmp
小米路由器3G建站折腾笔记5 - 安装phpMyAdmin、Typecho、WordPress
小米路由器3G建站折腾笔记6 - 总结

本节是路由器建站的重头戏,挂好U盘,安装好opkg和onmp,后面就简单了。

六、挂载U盘

路由器内的存储空间有限,仅仅128M,在我装Go程序的时候,100来M的压缩包都不能顺利解压,所以必须通过U盘来扩展空间,把要装的程序、数据、文档都撞到U盘上,这样以后想进行数据迁移和备份都很方便。

1、首先格式化U盘。

前面刷机用的是FAT格式,但是在Linux下使用的时候,不能创建符号链接,安装opkg时出现问题。之后将U盘格式化为NTFS,发现路由器系统只能读不能写,创建文件则报错:“Read-only file system”,mount命令显示/dev/sda1 on /userdisk/usbdisk type ntfs (ro,relatime,uid=0,gid=0...),用chmod 666、mount -o remount,rw /和mount -t ntfs -w /dev/sda1 /userdisk/usbdisk也不能解决。最后格式化为ext3一切正常,但是这样Windows下就不方便访问了。

路由器下阉割了fdisk和mkfs命令,我是在Linux虚拟机下用mkfs.ext3格式化的,使用MiniTool分区工具也可以。

2、路由器上插入U盘,用df -h或ls /dev命令查看U盘设备为/dev/sda1。

3、创建路径/userdisk/usbdisk。

4、挂载磁盘mount /dev/sda1 /userdisk/usbdisk,这样就可以通过/userdisk/usbdisk访问U盘;卸载命令为umount /userdisk/usbdisk,注意不是unmount。

5、实现开机自动挂载。

按照网上说的,在/etc/fstab文件中添加/dev/sda1 /userdisk/usbdisk或/dev/sda1 /userdisk/usbdisk ext3 defaults 0 0,均不能正常挂载,仔细查看/etc/fstab文件,发现有这么一句话:# WARNING: this is an auto generated file, please use uci to set defined filesys,看来需要用UCI(Unified Configuration Interface)命令来修改fstab才可以。

百度之后尝试修改/etc/config/fstab文件,末尾添加以下内容:

config 'mount'

option device '/dev/sda1'

option target '/userdisk/usbdisk'

option fstype 'ext3'

option enabled '1'

保存并重启之后,发现U盘自动挂载成功,这样就不用管UCI指令了。还有一种可行的方法是在/etc/rc.local文件里或者/etc/init.d/boot、/etc/init.d/fstab等文件的start函数中直接添加挂载命令mount /dev/sda1 /userdisk/usbdisk,经测试都可以。

修改文件使用鼎鼎大名的vi或vim,如不会使用请自行百度。

七、安装opkg

Opkg是OpenWrt的包管理软件,据说之前的开发版是自带的,现在需要安装。安装过程中需要用到/opt、/root目录,因为这两个目录是一级目录,也是限制为只读的(Read-only file system),所以通过软链接进行一下重定向。

1、首先创建两个目录/userdisk/usbdisk/opt和/userdisk/usbdisk/root。

mkdir /userdisk/usbdisk/opt

mkdir /userdisk/usbdisk/root

2、进行链接。

mount --bind /userdisk/usbdisk/opt /opt

mount --bind /userdisk/usbdisk/root /root

3、设置开机自动链接。

因为直接修改/etc/fstab无效,所以把上面两个mount命令直接写在/etc/rc.local文件中,这样每次开启路由器即可自动链接/opt和/root到U盘路径。

执行完上述准备工作后,就可以安装opkg了,命令如下:

cd /root

wget http://pkg.entware.net/binaries/mipsel/installer/installer.sh

chmod +x installer.sh

./installer.sh

我一直很反感这种在线安装命令,因为网络总是不给力,经常安装失败。我不知道apt-get、yum、pip这种命令,如果网络不好该怎么办,能否下载下来执行呢?如有大神知晓,盼告知。根据墨菲定律,毫无疑问这次又发生了,在installer.sh执行过程中,opkg下载.ipk 包的时候,总是无响应,安装失败。虽然一共也就2000多个包,400多M,虽然安装过程中可能用不到几个,然而我还是不清楚到底要下哪些包,下了之后如何安装。不过我也没放弃,我就一遍遍地重试,最后终于在网速较好的深夜安装成功了。

安装后的可执行文件位于/opt/bin/opkg,需要设置环境变量,打开/etc/profile文件,修改export PATH=/bin:/sbin:/usr/bin:/usr/sbin为export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin,保存即可。

最后测试一下opkg,安装个unzip试试吧,后面要用的。

opkg update

opkg install unzip

参考资料

小米路由器3G安装opkg指南

https://www.jianshu.com/p/09c104eb0e70

八、安装onmp

xzhih 的onmp一键安装脚本https://raw.githubusercontent.com/xzhih/ONMP/master/oneclick.sh(https://github.com/xzhih/ONMP)真的很棒,但是路由器上wget --no-check-certificate不能下载https地址的文件,可能要用curl吧,而且raw.githubusercontent.com经常无法访问。我不知道之前是怎么解决这个问题的,但我依然选择了最笨的办法,在电脑虚拟机上下载再复制到U盘上。

主要用到的是两个文件:

https://raw.githubusercontent.com/xzhih/ONMP/master/onmp.sh

https://raw.githubusercontent.com/WuSiYu/PHP-Probe/master/tz.php

安装之前,先修改一下onmp.sh,删除mariadb-server-extra,因为这个包已经不存在了,如果不删除,后面会报安装错误,提前退出。删除后就可以安装了。

将onmp.sh复制到/root,执行命令:mkdir -p /opt/onmp && chmod +x onmp.sh && ./onmp.sh打开安装界面:

小米路由器3G建站折腾笔记4 - 安装opkg和onmp

输入1正式开始安装。

安装过程出现下面错误,是因为没有php7-pecl-redis包,这个不管它了,倒是不影响安装,不知道后面有没有什么影响。

Collected errors:

* opkg_install_cmd: Cannot install package php7-pecl-redis.

最后出现的错误才是最恼人的:

现在开始初始化ONMP

cp: can't stat '/opt/onmp/tz.php': No such file or directory

=================================

onmp 管理命令

onmp open

启动 停止 重启

onmp start|stop|restart

查看网站列表 onmp list

Nginx 管理命令

onmp nginx start|restart|stop

MySQL 管理命令

onmp mysql start|restart|stop

PHP 管理命令

onmp php start|restart|stop

Redis 管理命令

onmp redis start|restart|stop

=================================

onmp正在启动

nginx 启动成功

php-fpm 启动成功

mysqld 启动失败

onmp启动失败

好吧,来解决一下,关于tz.php的错误是最简单的,将tz.php复制到/opt/onmp/即可,可能也要复制到/opt/wwwroot/default/,忘记了,也可能是自动的。

关于mysql的,先手动启动一下看看,onmp mysql start,报错:/opt/bin/onmp: line 143: /opt/etc/init.d/S70mysqld: not found,在/opt/etc/init.d/目录没有看到S70mysqld,但是有S70mariadbd,将S70mariadbd重命名为S70mysqld:mv /opt/etc/init.d/S70mariadbd /opt/etc/init.d/S70mysqld。

再次执行onmp mysql start,不报错,但是执行onmp mysql stop却提示mysql没有运行。执行mysqld --skip-grant&直接启动mysql,报错Can't find messagefile '/opt/share/mariadb/errmsg.sys',打开/opt/etc/mysql/my.cnf文件,将lc_messages_dir = /opt/share/mariadb改为lc_messages_dir = /opt/share/mysql

再次执行mysqld --skip-grant&,又报出内存不足错误:

[email protected]:~/onmp# mysqld --skip-grant&

[email protected]:~/onmp# 200214  5:59:10 [Note] mysqld (mysqld 5.5.58-MariaDB) starting as process 17793 ...

200214  5:59:10 [ERROR] mysqld: Out of memory (Needed 130760704 bytes)

200214  5:59:11 InnoDB: The InnoDB memory heap is disabled

200214  5:59:11 InnoDB: Mutexes and rw_locks use InnoDB's own implementation

200214  5:59:11 InnoDB: Compressed tables use zlib 1.2.11

200214  5:59:11 InnoDB: Initializing buffer pool, size = 128.0M

InnoDB: mmap(136839168 bytes) failed; errno 12

200214  5:59:11 InnoDB: Completed initialization of buffer pool

200214  5:59:11 InnoDB: Fatal error: cannot allocate memory for the buffer pool

200214  5:59:11 [ERROR] Plugin 'InnoDB' init function returned error.

200214  5:59:11 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.

200214  5:59:11 [ERROR] Unknown/unsupported storage engine: InnoDB

200214  5:59:11 [ERROR] Aborting

200214  5:59:11 [Note] mysqld: Shutdown complete

查看一下内存吧:

[email protected]:~/onmp# free -m

            total      used      free    shared    buffers    cached

Mem:          247        193        54          0        12        102

-/+ buffers/cache:        78        168

Swap:            0          0          0

Swap分区为0,据说启用swap就能解决报错,但是在启用swap时出现问题,swapon失败:swapon failed: Function not implemented

dd if=/dev/zero of=/opt/.swap bs=1024k count=20 20M大小

mkswap /opt/.swap

swapon /opt/.swap

关闭并删除swap文件,swapoff同样报错:swapoff failed: Function not implemented

swapoff /opt/.swap

rm /opt/.swap

看来小米路由器不支持开启swap,那么把mysql缓存改小试试。

打开/opt/etc/mysql/my.cnf文件,在[mysqld]下添加innodb_buffer_pool_size = 8M,其它的24M也改为8M,保存后再次启动mysql。发现mysql运行成功,提示“mysqld: ready for connections.”,“InnoDB: mmap(136839168 bytes) failed; errno 12”错误没了,“mysqld: Out of memory (Needed 130760704 bytes)”有时还在。netstat -ntlp|grep 3306查看3306端口已经开启,不管了,先这样吧,关闭mysql的命令是killall mysqld。

初始化数据库:/opt/bin/mysql_install_db --user=root --basedir=/opt --datadir=/opt/var/mysql/

启动数据库:/opt/etc/init.d/S70mysqld start

设置数据库密码:mysqladmin -u root password 123456

测试下数据库连接:mysql -u root -p

以上命令均成功,最后重启一下onmp看看能够正常启动:

[email protected]:~/onmp# onmp restart

onmp正在重启

nginx 启动成功

php-fpm 启动成功

mysqld 启动成功

onmp已启动

网站列表:

/opt/wwwroot/default/        192.168.31.1:81

浏览器地址栏输入:192.168.31.1:81 查看php探针

终于全部启动了,浏览器输入http://192.168.31.1:81打开探针看看,显示了很多服务器的信息。探针下面有个MySQL数据库连接检测,输入root和123456,点击“MySQL检测”居然检测失败,报出服务器不支持MySQL数据库。头疼,上面明明写了数据库为5.5.58-MariaDB,下面却检测不到,不会探针有问题吧,简单分析了一下,还真是探针的问题,在检测的时候只判断了mysql_close,没判断mysqli_close,虚惊一场。

小米路由器3G建站折腾笔记4 - 安装opkg和onmp

好了,把onmp添加到开机自启动里面去吧,打开/etc/rc.local,添加下列命令即可,搞定onmp,剩下的事就简单多了。

export PATH=/opt/sbin:/opt/bin:$PATH

onmp start

参考资料

自己安装ONMP,安装过程和mysql出错解决办法

https://www.right.com.cn/forum/thread-1137597-1-1.html