小米路由器3G建站折騰筆記1 - 引言與路由器選擇
小米路由器3G建站折騰筆記2 - 刷ROM和開啟SSH
小米路由器3G建站折騰筆記3 - 網(wǎng)站架構(gòu)選擇
小米路由器3G建站折騰筆記4 - 安裝opkg和onmp
小米路由器3G建站折騰筆記5 - 安裝phpMyAdmin、Typecho、WordPress
小米路由器3G建站折騰筆記6 - 總結(jié)
本節(jié)是路由器建站的重頭戲,掛好U盤,安裝好opkg和onmp,后面就簡單了。
六、掛載U盤
路由器內(nèi)的存儲空間有限,僅僅128M,在我裝Go程序的時候,100來M的壓縮包都不能順利解壓,所以必須通過U盤來擴展空間,把要裝的程序、數(shù)據(jù)、文檔都撞到U盤上,這樣以后想進行數(shù)據(jù)遷移和備份都很方便。
1、首先格式化U盤。
前面刷機用的是FAT格式,但是在Linux下使用的時候,不能創(chuàng)建符號鏈接,安裝opkg時出現(xiàn)問題。之后將U盤格式化為NTFS,發(fā)現(xiàn)路由器系統(tǒng)只能讀不能寫,創(chuàng)建文件則報錯:“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分區(qū)工具也可以。
2、路由器上插入U盤,用df -h或ls /dev命令查看U盤設(shè)備為/dev/sda1。
3、創(chuàng)建路徑/userdisk/usbdisk。
4、掛載磁盤mount /dev/sda1 /userdisk/usbdisk,這樣就可以通過/userdisk/usbdisk訪問U盤;卸載命令為umount /userdisk/usbdisk,注意不是unmount。
5、實現(xiàn)開機自動掛載。
按照網(wǎng)上說的,在/etc/fstab文件中添加/dev/sda1 /userdisk/usbdisk或/dev/sda1 /userdisk/usbdisk ext3 defaults 0 0,均不能正常掛載,仔細查看/etc/fstab文件,發(fā)現(xiàn)有這么一句話:# WARNING: this is an auto generated file, please use uci to set defined filesys,看來需要用UCI(Unified Configuration Interface)命令來修改fstab才可以。
百度之后嘗試修改/etc/config/fstab文件,末尾添加以下內(nèi)容:
config 'mount'
option device '/dev/sda1'
option target '/userdisk/usbdisk'
option fstype 'ext3'
option enabled '1'
保存并重啟之后,發(fā)現(xiàn)U盤自動掛載成功,這樣就不用管UCI指令了。還有一種可行的方法是在/etc/rc.local文件里或者/etc/init.d/boot、/etc/init.d/fstab等文件的start函數(shù)中直接添加掛載命令mount /dev/sda1 /userdisk/usbdisk,經(jīng)測試都可以。
修改文件使用鼎鼎大名的vi或vim,如不會使用請自行百度。
七、安裝opkg
Opkg是OpenWrt的包管理軟件,據(jù)說之前的開發(fā)版是自帶的,現(xiàn)在需要安裝。安裝過程中需要用到/opt、/root目錄,因為這兩個目錄是一級目錄,也是限制為只讀的(Read-only file system),所以通過軟鏈接進行一下重定向。
1、首先創(chuàng)建兩個目錄/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、設(shè)置開機自動鏈接。
因為直接修改/etc/fstab無效,所以把上面兩個mount命令直接寫在/etc/rc.local文件中,這樣每次開啟路由器即可自動鏈接/opt和/root到U盤路徑。
執(zhí)行完上述準備工作后,就可以安裝opkg了,命令如下:
cd /root
wget http://pkg.entware.net/binaries/mipsel/installer/installer.sh
chmod +x installer.sh
./installer.sh
我一直很反感這種在線安裝命令,因為網(wǎng)絡(luò)總是不給力,經(jīng)常安裝失敗。我不知道apt-get、yum、pip這種命令,如果網(wǎng)絡(luò)不好該怎么辦,能否下載下來執(zhí)行呢?如有大神知曉,盼告知。根據(jù)墨菲定律,毫無疑問這次又發(fā)生了,在installer.sh執(zhí)行過程中,opkg下載.ipk 包的時候,總是無響應(yīng),安裝失敗。雖然一共也就2000多個包,400多M,雖然安裝過程中可能用不到幾個,然而我還是不清楚到底要下哪些包,下了之后如何安裝。不過我也沒放棄,我就一遍遍地重試,最后終于在網(wǎng)速較好的深夜安裝成功了。
安裝后的可執(zhí)行文件位于/opt/bin/opkg,需要設(shè)置環(huán)境變量,打開/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指南
http://www.itdecent.cn/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經(jīng)常無法訪問。我不知道之前是怎么解決這個問題的,但我依然選擇了最笨的辦法,在電腦虛擬機上下載再復(fù)制到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,因為這個包已經(jīng)不存在了,如果不刪除,后面會報安裝錯誤,提前退出。刪除后就可以安裝了。
將onmp.sh復(fù)制到/root,執(zhí)行命令:mkdir -p /opt/onmp && chmod +x onmp.sh && ./onmp.sh打開安裝界面:

輸入1正式開始安裝。
安裝過程出現(xiàn)下面錯誤,是因為沒有php7-pecl-redis包,這個不管它了,倒是不影響安裝,不知道后面有沒有什么影響。
Collected errors:
* opkg_install_cmd: Cannot install package php7-pecl-redis.
最后出現(xiàn)的錯誤才是最惱人的:
現(xiàn)在開始初始化ONMP
cp: can't stat '/opt/onmp/tz.php': No such file or directory
=================================
onmp 管理命令
onmp open
啟動 停止 重啟
onmp start|stop|restart
查看網(wǎng)站列表 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啟動失敗
好吧,來解決一下,關(guān)于tz.php的錯誤是最簡單的,將tz.php復(fù)制到/opt/onmp/即可,可能也要復(fù)制到/opt/wwwroot/default/,忘記了,也可能是自動的。
關(guān)于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。
再次執(zhí)行onmp mysql start,不報錯,但是執(zhí)行onmp mysql stop卻提示mysql沒有運行。執(zhí)行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。
再次執(zhí)行mysqld --skip-grant&,又報出內(nèi)存不足錯誤:
root@XiaoQiang:~/onmp# mysqld --skip-grant&
root@XiaoQiang:~/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
查看一下內(nèi)存吧:
root@XiaoQiang:~/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分區(qū)為0,據(jù)說啟用swap就能解決報錯,但是在啟用swap時出現(xiàn)問題,swapon失?。簊wapon failed: Function not implemented
dd if=/dev/zero of=/opt/.swap bs=1024k count=20 20M大小
mkswap /opt/.swap
swapon /opt/.swap
關(guān)閉并刪除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。發(fā)現(xiàn)mysql運行成功,提示“mysqld: ready for connections.”,“InnoDB: mmap(136839168 bytes) failed; errno 12”錯誤沒了,“mysqld: Out of memory (Needed 130760704 bytes)”有時還在。netstat -ntlp|grep 3306查看3306端口已經(jīng)開啟,不管了,先這樣吧,關(guān)閉mysql的命令是killall mysqld。
初始化數(shù)據(jù)庫:/opt/bin/mysql_install_db --user=root --basedir=/opt --datadir=/opt/var/mysql/
啟動數(shù)據(jù)庫:/opt/etc/init.d/S70mysqld start
設(shè)置數(shù)據(jù)庫密碼:mysqladmin -u root password 123456
測試下數(shù)據(jù)庫連接:mysql -u root -p
以上命令均成功,最后重啟一下onmp看看能夠正常啟動:
root@XiaoQiang:~/onmp# onmp restart
onmp正在重啟
nginx 啟動成功
php-fpm 啟動成功
mysqld 啟動成功
onmp已啟動
網(wǎng)站列表:
/opt/wwwroot/default/? ? ? ? 192.168.31.1:81
瀏覽器地址欄輸入:192.168.31.1:81 查看php探針
終于全部啟動了,瀏覽器輸入http://192.168.31.1:81打開探針看看,顯示了很多服務(wù)器的信息。探針下面有個MySQL數(shù)據(jù)庫連接檢測,輸入root和123456,點擊“MySQL檢測”居然檢測失敗,報出服務(wù)器不支持MySQL數(shù)據(jù)庫。頭疼,上面明明寫了數(shù)據(jù)庫為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