小米路由器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打开安装界面:
输入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,虚惊一场。
好了,把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