由于路由器难免要刷openwrt的系统,做一个openwrt的使用备忘录,方便自己,方便大家。

目录

刷机后首次登录修改登陆密码

通过putty的软件登录192.168.1.1

在提示框中输入passwd. 你将会得到为root用户设置一个新密码的提示:

root@openwrt:~# passwd
Changing password for root
New password:
Retype password:
Password for root changed by root
root@openwrt:~#

修改密码。


更新软件源及web管理界面及汉化

root@openwrt:~# opkg update
root@openwrt:~# opkg install luci
root@openwrt:~# opkg list | grep -i luci-i18n-base    #查询web界面汉化源
root@openwrt:~# opkg install luci-i18n-base-zh-cn

更新软件源下载地址为国内较快镜像

opkg update的软件源地址为国外地址,国内下载速度常常很慢。可以将这些源地址更新为大陆提供镜像的地址,这样无论是安装还是更新都会快很多。

首先备份软件源下载地址文件
避免改错了或者镜像地址不能用了,方便改回源地址。

cp -p /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.bk

openwrt 21.02镜像更新update错误问题
如果更换镜像后,出现 wget returned 5 ,则说明wget有问题。

建议在更换镜像前,安装wget

opkg list | grep -i wget
opkg install wget-ssl

然后就不会出错了

然后替换软件源地址

  • 笨办法,逐行编辑/etc/opkg/distfeeds.conf

将里面所有的downloads.openwrt.org替换成openwrt的镜像地址,比如上海交大的地址mirror.sjtu.edu.cn/openwrt/.
具体有效镜像可以查阅官方文档 链接地址

  • 省事办法,输入以下命令

    sed -i 's_downloads\.openwrt\.org_mirror.sjtu.edu.cn/openwrt_' /etc/opkg/distfeeds.conf
    

万一镜像无效,又没备份

改回:

sed -i 's_mirror.sjtu.edu.cn/openwrt_downloads.openwrt.org_' /etc/opkg/distfeeds.conf

修改路由器默认IP地址

如果打算把IP修改为192.168.3.1,这主要是为了避免和光猫的路由器IP地址冲突。

root@openwrt:~# uci set network.lan.ipaddr='192.168.3.1'
root@openwrt:~# uci commit network

扩展根文件系统/overlay,以便安装更多openwrt软件

  • 首先路由器需要有USB插口

  • 然后将一个格式化的U盘或者硬盘插在路由器上。格式化为ext4的分区,EXT4的分区可以设置为4G.

  1. 如果路由器自带软件系统/overlay的空间大于8MB:
root@openwrt:~# opkg update && opkg install block-mount kmod-fs-ext4 kmod-usb-storage kmod-usb-ohci kmod-usb-uhci e2fsprogs fdisk
  1. 重启路由器
root@openwrt:~# reboot
  1. 通过浏览器登录路由器,找到系统,挂载点

可以看到

文件系统 挂载点 可用 已用
/dev/ubi0_1 /overlay 20.98 MB / 23.74 MB 6.38% (1.52 MB)

知道了根文件系统存储在/dev/ubi0_1的地址

输入以下代码,从而对/etc/config/fstab配置,:

root@openwrt:~# 

DEVICE="$(sed -n -e "/\s\/overlay\s.*$/s///p" /etc/mtab)"
uci -q delete fstab.rwm
uci set fstab.rwm="mount"
uci set fstab.rwm.device="${DEVICE}"
uci set fstab.rwm.target="/rwm"
uci commit fstab

如果通过编辑软件如VI查看/etc/config/fstab,会发现多了内容。

        option device '/dev/ubi0_1'
        option target '/rwm'

对应的也是上面/overlay的文件系统。

  1. 将外置挂载硬盘设置为openwrt文件根目录系统

硬盘的格式化

查看已连接路由器的硬盘、U盘

root@OpenWrt:~# fdisk -l

Device          Start        End    Sectors  Size Type
/dev/sda1  3888908288 3889956863    1048576  512M unknown
/dev/sda3  3889956864 3892054015    2097152    1G unknown
/dev/sda5  3892054016 3892086783      32768   16M unknown
/dev/sda7  3892086784 3892348927     262144  128M unknown
/dev/sda9  3865839616 3867936767    2097152    1G unknown
/dev/sda10 3863742464 3865839615    2097152    1G unknown
/dev/sda11 3870033920 3872131071    2097152    1G unknown
/dev/sda12 3867936768 3870033919    2097152    1G unknown
/dev/sda13 3846965248 3863742463   16777216    8G unknown
/dev/sda17       2048    2099199    2097152    1G unknown
/dev/sda19 3872131072 3888908287   16777216    8G unknown
/dev/sda25 3894446080 3907028991   12582912    6G unknown
/dev/sda27   35653632 3846965247 3811311616  1.8T unknown
/dev/sda29 3892348928 3894446079    2097152    1G unknown
/dev/sda31    2099200   35653631   33554432   16G unknown

/dev/sdb1

a下面不管有几个,都是一个硬盘(U盘),B下面无论几个都是一个硬盘(U盘)。

对现有硬盘进行分区,(如果你打算对sda的硬盘进行操作的前提下:)

fdisk /dev/sda

嫌麻烦可以安装ipk软件包,https://github.com/lisaac/luci-app-diskman

直接在luci界面安装(如果luci页面报错到本网页最下面找解决办法)

root@OpenWrt:~# block info
页面输出内容如下:
/dev/mtdblock2: UUID="9fd43c61-c3f2c38f-13440ce7-53f0d42d" VERSION="4.0" MOUNT="/rom" TYPE="squashfs"
/dev/mtdblock3: MOUNT="/overlay" TYPE="jffs2"
/dev/sda1: UUID="fdacc9f1-0e0e-45ab-acee-9cb9cc8d7d49" VERSION="1.4" TYPE="ext4"
  • 查看你打算作为overlay的分区,上图中为/dev/sda1。

  • 如果你对U盘或硬盘进行了分区,那么会显示/dev/sda1,/dev/sda2

  • 格式化分区为ext4的分区(如果需要的话),如果你打算挂载dev/sda1

root@OpenWrt:~# mkfs.ext4 /dev/sda1 #格式化为ext4格式
页面输出内容如下:
/dev/sda1 contains a ext4 file system
        last mounted on /tmp/extroot/overlay on Wed Dec 31 16:00:07 1969
Proceed anyway? (y,N)
  • /dev/sda1 设置为 新的 /overlay 根文件系统:
DEVICE="/dev/sda1"
eval $(block info "${DEVICE}" | grep -o -e "UUID=\S*")
uci -q delete fstab.overlay
uci set fstab.overlay="mount"
uci set fstab.overlay.uuid="${UUID}"
uci set fstab.overlay.target="/overlay"
uci commit fstab
  • 迁徙原/overaly文件到新系统
mount /dev/sda1 /mnt
cp -f -a /overlay/. /mnt
umount /mnt
  • 重启
root@openwrt:~# reboot
  • 测试是否成功:

通过web界面登录查看系统-挂载,看/overlay是你的U盘或硬盘空间大小

通过web界面登录查看系统-软件,查看freespace.

具体按照官方链接: 官方参照链接

以及https://openwrt.org/docs/guide-user/storage/start


挂载USB磁盘

输入如下命令:

opkg update
opkg install kmod-usb-storage
opkg install kmod-usb-storage-uas
opkg install usbutils

测试

lsusb -t
输入结果如下:
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-mtk/1p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci-mtk/2p, 480M
    |__ Port 1: Dev 5, If 0, Class=Mass Storage, Driver=usb-storage, 480M

当看到Driver=usb-storage就代表挂载了

the “Driver” 部分对应的内容是 xhci 则路由器上是USB3.0接口, ehci for USB2.0接口 and uhci or ohci for USB1.1接口.

openwrt识别exfat格式的硬盘

opkg update
opkg install kmod-fs-exfat
opkg install libblkid

重启后可以在挂载项目里看到exfat硬盘

其他格式格式硬盘请参考官方链接:https://openwrt.org/docs/guide-user/storage/filesystems-and-partitions

将挂载的硬盘作为NAS一样,减少闲置时运转功率。

opkg update && opkg install hdparm

hdparm -S 240 /dev/sda2

安装openwrt上的硬盘健康度S.M.A.R.T查询软件。

机械硬盘在坏掉前一般可以通过S.M.A.R.T(硬盘健康信息)查询检测到。
在openwrt上挂载的硬盘也不可能为了插健康度拔下来到PC上查询。
通过安装Smartmontools可以实现openwrt上读取硬盘的健康信息。

  • 安装
opkg update
opkg install smartmontools
  • 下载并配置数据信息
opkg install wget-ssl
cd /tmp
wget https://raw.githubusercontent.com/mirror/smartmontools/master/drivedb.h --no-check-certificate  #需要注意国内需要科学上网环境才能下载.(如果没有条件你可以使用我上传到服务器的)
wget https://www.lihaowen.com/free-time/openwrt-memo/drivedb.h --no-check-certificate                #如果上面的失败,则使用这个。(数据截至2021/04/11时最新)

mkdir /usr/share/smartmontools
mv drivedb.h /usr/share/smartmontools/drivedb.h
  • 查询命令

如果需要查询的硬盘是/dev/sda

smartctl -a /dev/sda

英文官方指引


路由器下载工具:aria2安装

opkg update
opkg list | grep -i aria2
opkg install aria2 ariang luci-i18n-aria2-zh-cn

退出web管理页,重新登录会发现多了服务-aria2.

如果已经添加了SSL(https)的链接方式,则会显示连接RPC失败,记得在LUCI的网页管理界面,勾选“PRC加密”,同时将加密证书和密钥添加到:
“prc选项”,“prc加密”项目里面。

aria2 PRC选项截图


添加samba作为文件服务器(局域网NAS)

samba有2个版本,最新版samba4较大,如果软件空间较小且没有扩容,那么建议选择samba36.

  • 更新防火墙:
uci -q delete firewall.samba_nsds
uci set firewall.samba_nsds="rule"
uci set firewall.samba_nsds.name="Allow-Samba/NS/DS"
uci set firewall.samba_nsds.src="lan"
uci set firewall.samba_nsds.dest_port="137-138"
uci set firewall.samba_nsds.proto="udp"
uci set firewall.samba_nsds.target="ACCEPT"
uci -q delete firewall.samba_ss
uci set firewall.samba_ss="rule"
uci set firewall.samba_ss.name="Allow-Samba/SS"
uci set firewall.samba_ss.src="lan"
uci set firewall.samba_ss.dest_port="139"
uci set firewall.samba_ss.proto="tcp"
uci set firewall.samba_ss.target="ACCEPT"
uci -q delete firewall.samba_smb
uci set firewall.samba_smb="rule"
uci set firewall.samba_smb.name="Allow-Samba/SMB"
uci set firewall.samba_smb.src="lan"
uci set firewall.samba_smb.dest_port="445"
uci set firewall.samba_smb.proto="tcp"
uci set firewall.samba_smb.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart
  • 安装samba
opkg update                    #更新软件源
opkg list | grep -i samba      #查看samba相关文件,找到带samba??-server的最新文件

opkg install samba4-server     #安装
opkg install luci-i18n-samba4-zh-cn    #安装界面及汉化包
  • 安装硬盘或U盘的格式系统支持文件,以exfat格式为例。
opkg list | grep -i kmod-fs-
opkg install kmod-fs-exfat

到此samba已经安装到你的路由器里面,接下来需要配置才可以访问。


配置samba4

配置samba4你需要调整2个文件

  1. /etc/samba/smb.conf.template
  2. /etc/config/samba4

对于第一个文件/etc/samba/smb.conf.template,你可以登录web管理界面,在edit template 页面修改。主要修改``security = user`,其他文件似乎不用变。

[global]
    netbios name = |NAME| 
    workgroup = |WORKGROUP|
    server string = |DESCRIPTION|
    syslog = 10
    encrypt passwords = true
    passdb backend = smbpasswd
    obey pam restrictions = yes
    socket options = TCP_NODELAY
    unix charset = ISO-8859-1
    local master = yes
    preferred master = yes
    os level = 20
    security = user
    guest account = nobody
    invalid users = root
    smb passwd file = /etc/samba/smbpasswd

对于第二个文件/etc/config/samba,也可以在

Shared Directories

Please add directories to share. Each directory refers to a folder on a mounted device.

下面修改。

我每次改不好,直接putty中,修改

vi /etc/config/samba4    #输入i,进入编辑模式。如果输错了,按ESC,然后输入:q退出。

插入以下内容,记得将'/mnt/sda2','sda2'换成你自己的硬盘挂载地址和想要显示的文件名。

config 'samba'
        option 'name' 'openwrt'
        option 'workgroup' 'WORKGROUP'
        option 'description' 'openwrt'
        option 'homes' '1'



config 'sambashare'
        option 'read_only' 'no'
        option 'create_mask' '0700'
        option 'dir_mask' '0700'
        option 'name' 'sda2'
        option 'path' '/mnt/sda2'
        option 'guest_ok' 'yes'

编辑好后,按ESC退出编辑模式,输入:wq存盘。

  • 重启samba4,刷新配置
root@OpenWrt:~# /etc/init.d/samba4 restart

添加samba用户newuser

vi /etc/passwd
root:!:0:0:root:/root:/bin/ash
nobody:*:65534:65534:nobody:/var:/bin/false
daemon:*:65534:65534:daemon:/var:/bin/false
newuser:*:1000:65534:newuser:/var:/bin/false
  • 添加上述用户,并配置samba的用户名密码。
root@OpenWrt:~# smbpasswd -a newuser
New SMB password:
Retype new SMB password:
Added user newuser.
  • 重启samba4
root@OpenWrt:~# /etc/init.d/samba4 restart

详细配置官方指引

尝试登录文件夹管理器

\\192.168.3.1 

成功~~~


添加FTP服务

ftp服务似乎没什么用,因为已经有samba了,即便传文件也应该转SFTP,但如果某些电脑因为管理员禁用的原因,但又出于工作不得不传递一些文件时,就可以用上。

当然前提是管理员并没有封禁FTP端口,这样开通后,可以通过资源浏览器就可以像本地文件夹一样复制粘贴。

opkg install vsftpd

编辑配置文件:

root@OpenWrt:~# vi /etc/vsftpd.conf

文件最下方新一行添加,/mnt/sda2换成你的NAS路径。

local_root=/mnt/sda2

重启FTP服务

/etc/init.d/vsftpd restart

在资源浏览器中输入:ftp://192.168.3.1/

开心的使用吧

具体官方指引


添加SFTP服务

主要用于向openwrt上传IPK安装包的用途。

opkg update
opkg install openssh-sftp-server

然后就可以愉快的使用winscp类文件上传到路由器了。


添加同步、备份软件syncthing

看到很多人用NAS搭配raid做备份,实际上这和NAS本身的定位不同。当然每个人有每个人的用法。用西瓜刀削苹果也是每个人的自由。只是NAS并不是唯一的或者最佳的选择。

NAS更多的应该是提供了持续性的(7*24H)读取,而国内实际上在非局域网提供服务可能需要备案。raid也大多是一种高可用性方案,即在硬盘内容中出错而导致无法使用时,另外的硬盘依然可以提供内容。
机械硬盘是有寿命的(无论是时间或者数据量),那么作为数据安全的角度当然是机械硬盘的通电量和读写量最少是最安全的备份方案,而NAS的硬盘是24小时通电的。
NAS厂家当然不会告诉你这些,要不他怎么卖给大多每天只需要3、4小时读下NAS上下载的电影电视剧在电视上观看的消费者呢。

我本也打算购买NAS,但觉得带个新设备又占位置又要24小时开着,还损耗硬盘寿命。我只是想备份数据,但又想随时读取硬盘数据不用开电脑。综合了解后,放弃NAS。
对于下载和随时读取而言,带AP(wifi)、usb功能的路由器无论是功耗还是本就是24小时开着而言,对一般消费者都是更加合适的选择。

syncthing在openwrt上的安装

opkg update
opkg install syncthing
mkdir -p /home/syncthing
chown syncthing /home/syncthing/

配置syncthing

vi /etc/config/syncthing

修改option enabled ‘1’
修改option home ‘/home/syncthing’
修改option gui_address ‘http://192.168.3.1:8384’ ,你也可以把127.0.0.1改成0.0.0.0(如果打算和广域网同步的话)

重启更新服务设置
/etc/init.d/syncthing restart

打开http://192.168.3.1:8384

成功,*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。


选择同步、备份文件夹

请参考 官方链接或同类文章,大致搜索了下蛮多的。

整体理念上,需要在2台需要同步的设备上“均”安装syncthing,比如你需要从PC(WINDOWS系统)上将文件和openwrt上进行同步。

那么PC上也安装syncthing,然后分别访问http://192.168.3.1:8384(访问openwrt),和运行了syncthing的http://127.0.0.1:8384/。
然后选择文件夹就可以进行同步了。

主要注意的将PC上的内容同步 openwrt,记得在openwrt-文件夹-选项-高级中选中“权限”-【忽略】,以避免SMB的权限限制。


编译.IPK软件

编译的概念,什么叫编译?

我之前一直不清楚什么叫编译(非计算机专业)。最近觉得知其然知其所以然,仔细去搜索学习后发现是编译是一个很有意思的概念。

人类编写的代码叫做源代码,人类在书写源代码时记录的内容是一种人类可以理解和看懂的文字内容(比如:ABCDEFG)。而计算机的处理器在运行时是看不懂ABCDEFG的,它类似中文读者看不懂英文,需要翻译软件翻译成中文后,才能看懂写英文内容的一样。

所以源代码是人类看的懂的文字(中文),而计算机看的懂的内容是二进制代码(010101001)。所以编译用我外行的理解就是翻译的意思,他把人类写好的源代码翻译成计算机处理器能看懂的语言用于执行。
不确定我的理解是否完全正确。

具体可以看下维基百科对源代码和编译的解释。 源代码, 编译器

.ipk文件是什么?

ipk软件就是类似在windows中的.exe可执行文件安装包,.ipk文件就是openwrt系统中的可执行安装包的意思。

编译所需的系统

openwrt是一种linux系统。所以用linux的系统编译。
大多是用ubuntu和debian来进行编译。
目前win10的系统也可以嵌入ubuntu等linux的系统,也很方便。具体可以搜索下。

安装编译器

安装编译器,就是安装翻译软件,将人类的语言翻译成计算机看懂的语言所需要的软件。

SDK(编译器)的官方指引 官方指引

SDK下载链接
对应你自己的路由器的版本,以及你路由器的内核系统找到文件名称:
查看路由器型号内核

类似
openwrt-sdk-mvebu-cortexa9_gcc-8.4.0_musl_eabi.Linux-x86_64

目前主流电脑都是x86_64的系统,苹果最近新出的M1的是ARM架构的,则不能使用这个工具编译(架构不同)。

安装IPK

  • 下载IPK文件的源代码

  • 将上述源代码放置在到openwrt的SDK的已解压缩后文件夹目录/package/下。

  • 命令行端登录到SDK所在的目录下

  • 输入$ ./scripts/feeds update -a更新包列表

  • 输入$ ./scripts/feeds install <packagename>,更新特定名称的IPK,注意把换成你的IPK源代码名。

    或输入$ ./scripts/feeds install -a添加所有你放入的安装源代码。

  • $ make menuconfig

    Global Build Settings

    怎么选,我也不太清楚具体有何不同。如果单独编译某个ipk,建议取消所有。然后去点选需要的ipk.
      
    all target specific packages by default(默认为:所有特定目标的软件包)
    Select all kernel module packages by default(默认选择所有内核模块包)
    Select all userspace packages by default(默认选择所有用户空间包)
    Cryptographically sign package lists(加密签署软件包列表)
    
  • 编译

    $ make package/<packagename>/compile -j8

上面你电脑CPU有几个核,就在-j后面输入几

排查openwrt编译错误

首先的观念是,自由软件是存在软件之间嵌套的,是的,站在巨人的肩膀上才能看的更远。
即:甲编写软件的代码A中含有乙编写的代码B。
当我们编译A的时候,A里面用的软件可能包含了B,那么B又可能含C,这在编译A的时候,可能会因为缺少B的某些文件或文件夹,或者编写软件环境而错误(严谨解释是否如此我没有仔细研究排查过)。

那么在当编译A,出错的话,如果是提示编译B错误,那么应该重新编译B,而不是编译A,通过排查B的错误是什么,然后追根溯源将问题的本源找到。可能是某个文件夹没有关联。

当你编译A,编译程序在运行过程中编译依赖B,出现错误时,他的提示内容往往只是编译B出错了。可能他不会告诉你编译B出错在那里。

编译B,提示错误,他会告诉你,你少了某个文件夹,而这个文件夹中有你需要的编译基础内容。(比如我的错误3)。

  • 排查具体错误的命令

    make package/具体.ipk名称/compile -j1 V=s
    

遇到的编译时的报错记录

  • 错误 1

    /libubox-2020-12-12-35787769/blobmsg_json.c:23:24: fatal error: json/json.h: No such file or directory
    #include <json/json.h> 
    

这个报错的解决方法如下:

把文件夹安装到全英文目录下。不能有非英文命名的目录。
解决搜索来源:https://forum.archive.openwrt.org/viewtopic.php?id=57362

  • 错误 2

  • 编译某些文件失败
    可能是没有装他的源代码语言,比如GO语言没有装。

    $ snap install --classic go

  • 错误 3

/staging_dir/host/bin/upx: No such file or directory

cp /usr/bin/upx /home/lee/openwrt-sdk/staging_dir/host/bin/
cp /usr/bin/upx-ucl /home/lee/openwrt-sdk/staging_dir/host/bin/

解决搜索来源:https://openwrt.club/128.html

编译docker实战演练(ARM处理器)

假设你的路由器是Linksys WRT1900ACS且已刷openwrt的操作系统。
由于docker并没有在openwrt的库中,这导致需要进行编译后安装。
另外截至19.07的openwrt稳定版本,ARM不能使用docker,所以如果要使用你需要使用docker,则下载版本超过R20+的snapshot(快照)版本。

快照版本一般自带了有编译好的docker组件。所以无需编译。快照由于很多功能是测试的,所以可能完全无法使用。
如果对docker需求不大,没有必要追求openwrt的快照版。

留下该内容是因为编译稳定版的docker出了各种问题,后来发现19的稳定版还不能运行arm处理器的docker…

编译adguardhome实战演练(已成功及debug memo)

假设你的路由器是Linksys WRT1900ACS且已刷openwrt的操作系统。
由于adguardhome并没有在openwrt的库中,则可以进行编译后安装。你也可以尝试使用内核及luci界面方式使用(不在本文范围)。

  • 首先找到adguardhome的openwrt的源代码:https://github.com/openwrt/packages

adguardhome在 https://github.com/openwrt/packages/tree/master/net/adguardhome

  • 找到路由器对应的SDK
    openwrt-sdk-mvebu-cortexa9_gcc-8.4.0_musl_eabi.Linux-x86_64.tar.xz

  • 在ubuntu或者debian操作系统下,解压缩到文件夹下

假设解压后,并重命名文件夹为/openwrt-sdk

  • 登陆该文件夹

    lee-ubuntu:~/openwrt-sdk$
    
* 将最早下载的adguardhome的文件夹放到目录**package**里面。

* 通过终端登陆到lee-ubuntu:~/openwrt-sdk$ 的目录下

./scripts/feeds update -a
./scripts/feeds install adguardhome

系统会报错,主要是显示

WARNING: Makefile ‘package/adguardhome/Makefile’ has a dependency on ‘ca-bundle’, which does not exist
WARNING: Makefile ‘package/adguardhome/Makefile’ has a build dependency on ‘golang/host’, which does not exist
WARNING: Makefile ‘package/adguardhome/Makefile’ has a build dependency on ‘node/host’, which does not exist
WARNING: Makefile ‘package/adguardhome/Makefile’ has a build dependency on ‘packr/host’, which does not exist

表示缺少4个依赖(其他软件)
对于`ca-bundle`,不用理会,因为回头可以通过`opkg install ca-bundle`进行安装。
对于golang和node,下载并放到目录**package**里面。

另外可以输入以下命令,来刷新依赖文件。

./scripts/feeds update packages
./scripts/feeds install -a -p packages

* 尝试编译



`make menuconfig`

取消所有的

选中`net`-`adguardhome`.变成`M`标记

保存并退出。

make package/adguardhome/compile -j8

报错,但原因不明。

使用以下命令排查:
`make package/adguardhome/compile -j1 V=s`

Makefile:30: ../../lang/golang/golang-package.mk: No such file or directory
make[2]: *** No rule to make target ‘../../lang/golang/golang-package.mk’. Stop.
make[2]: Leaving directory ‘/home/lee/openwrt-sdk/package/adguardhome’
time: package/adguardhome/compile#0.16#0.07#0.19
ERROR: package/adguardhome failed to build.
make[1]: *** [package/Makefile:114: package/adguardhome/compile] Error 1

提示缺少lang/golang/golang-package.mk的文件或文件夹。
并且给出的地址是`lang/golang/`
按图索骥: https://github.com/openwrt/packages/tree/master/lang

以及`packr`和`node`

将下载好的golang的文件夹放到之前的目录**package/lang/**里面。
继续`make package/adguardhome/compile -j8`。

注意GO的语言隶属于google,而谷歌被墙可能会导致你下载go的时候失败。

如果一直提示`Makefile:30: ../../lang/golang/golang-package.mk: No such file or directory`
则尝试编译golang。
`make package/golang/compile -j8`

make[1] package/golang/compile
make[2] -C package/lang/golang/golang host-compile
make[2] -C package/toolchain compile
make[2] -C package/lang/golang/golang compile

编译成功golang,说明golang没有问题。

继续`make package/adguardhome/compile -j1 V=s`

依然提示找不到文件夹,并且给出的是相对路径

Makefile:30: ../../lang/golang/golang-package.mk: No such file or directory
make[2]: *** No rule to make target ‘../../lang/golang/golang-package.mk’. Stop.
make[2]: Leaving directory ‘/home/lee/openwrt-sdk/package/adguardhome’
time: package/adguardhome/compile#0.16#0.07#0.19
ERROR: package/adguardhome failed to build.
make[1]: *** [package/Makefile:114: package/adguardhome/compile] Error 1

打开`adguardhome`的文件夹下的`Makefile`

nano Makefile


找到下列内容

include $(INCLUDE_DIR)/package.mk
include ../../lang/golang/lang/golang/golang-package.mk

如果你的编译器路径地址是:`/home/openwrt-sdk`,则修改`../../lang/golang/`为绝对路径:`/home/openwrt-sdk/package/lang/golang/`。

include $(INCLUDE_DIR)/package.mk
include /home/openwrt-sdk/package/lang/golang/golang-package.mk

退出。

尝试编译,成功~

ipk在路径`/home/openwrt-sdk/bin/packages/arm_cortex-a9_vfpv3-d16/base`下。

安装ca-bundle、adguardhome后,注意通过命令启动。

/etc/init.d/adguardhome start

登陆路由器端口:3000,如:192.168.3.1:3000,打开adguardhome配置页面。









## 安装BT客户端transmission
*****

[英文教程链接](https://openwrt.org/docs/guide-user/services/downloading_and_filesharing/transmission)

一步步跟着做就行。

相对于aria2的下载BT项目,transmission显示更明晰,个人感觉下载速度上也更好。
可以清楚的知道目前有多少种子和用户。另外如果加载完整模式,则体验上可以媲美PC版本的BT下载软件。

web管理页面添加中文:

opkg install luci-i18n-transmission-zh-cn

## openwrt安装docker作为容器宿主主机(host)
*****
随着openwrt稳定版更新到21.02,arm的CPU也可以安装docker容器,路由器自身作为docker的宿主主机了。这让1900acs的路由器可以作为一个平台来安装openwrt没有编译但docker下有的软件。下面是安装过程。

[官方指引链接](https://openwrt.org/docs/guide-user/virtualization/docker_host)

opkg update
opkg install docker

opkg install dockerd
opkg install luci-app-dockerman
opkg install luci-i18n-dockerman-zh-cn
opkg install luci-lib-docker

opkg install docker-compose

完成后重启路由器。


## openwrt下docker中安装adguardhome及设置
*****
luci adguardhome停更2年了,所以还是老实的用官方最新的。当然你也可以直接安装openwrt 21.02自带的adguardhome。

```shell
root@OpenWrt:~# docker pull adguard/adguardhome
cd
cd /home
root@OpenWrt:/home# mkdir adguardhome
root@OpenWrt:/home# cd adguardhome
root@OpenWrt:/home/adguardhome# nano docker-compose.yaml

编辑docker-compose.yaml,写入以下内容:

version: "3.9"
services:
  adguardhome:
    image: adguard/adguardhome
    container_name: adguardhome
    ports:
      - 5453:53/tcp
      - 5453:53/udp
      - 853:853/tcp
      - 3000:3000/tcp
      - 8080:80/tcp
      - 8443:443/tcp
      - 8443:443/udp
      - 784:784/udp
      - 8853:8853/udp
      - 5443:5443/tcp
      - 5443:5443/udp
    volumes:
      - ./workdir:/opt/adguardhome/work
      - ./confdir:/opt/adguardhome/conf
    restart: unless-stopped

保存并退出。

随后输入命令

root@OpenWrt:/home/adguardhome# docker-compose up -d

你也可以输入命令的方式(注意自行新建2个文件夹):

docker run --name adguardhome\
    --restart unless-stopped\
    -v /home/adguardhome/workdir:/opt/adguardhome/work\
    -v /home/adguardhome/confdir:/opt/adguardhome/conf\
    -p 5453:53/tcp -p 5453:53/udp\
    -p 8080:80/tcp -p 8443:443/tcp -p 8443:443/udp -p 3000:3000/tcp\
    -p 853:853/tcp\
    -p 784:784/udp -p 853:853/udp -p 8853:8853/udp\
    -p 5443:5443/tcp -p 5443:5443/udp\
    -d adguard/adguardhome

登录[192.168.3.1:3000](192.168.3.1:3000),修改相关内容。

~~网页管理界面监听接口,8080,DNS 服务器监听接口:5453,~~然后你会一脸懵逼的发现8080端口打不开。
实际你应该全部默认设置,即80,53不变。

这里面的理念很有意思。容器里面的端口地址实际是容器自成一派的端口地址。在8080:80/tcp的映射地址,是指把容器中的80端口投影到容器外的8080端口,所以在设置监听端口应该设置的是80端口和53端口。

打开[192.168.3.1:8080](192.168.3.1:8080)看下是否运行正常。随后开始修改openwrt的设置。

由于openwrt中luci占用了80端口,53端口由Dnsmasq使用,考虑到可能adguardhome可能弃用或调整,故不调整上述软件的端口。

备份原始文件

cp -p /etc/config/dhcp /etc/config/dhcp.bk #有dhcp-opkg,说明有安装Dnsmasq full,不要紧,实际配置不用到这个opkg后缀的文件。

nano /etc/config/dhcp

改成如下,把#list server的#去掉。

list server             '192.168.3.1#5453'

你也可以直接到luci-网络-“DNS-DHCP"中将“DNS转发”填入:192.168.3.1#5453,对于dhcp-opkg文件不需要改(如有)。

调整防火墙

iptables -t nat -A PREROUTING -i br-lan -p udp –dport 53 -j DNAT –to 192.168.3.1:5453
iptables -t nat -A PREROUTING -i br-lan -p tcp –dport 53 -j DNAT –to 192.168.3.1:5453

进入 192.168.3.1:8080,然后选择设置,DNS设置,在上游服务器里面填写:

https://dns.adguard.com/dns-query
https://dns.cloudflare.com/dns-query
tls://dns.google
tcp://8.8.8.8
tcp://8.8.4.4
176.103.130.130
114.114.114.114
119.29.29.29

不填上述内容,由于大陆网络的原因,会导致无法更新阻止列表。

然后页面选择“过滤器”,DNS封锁清单。“检查更新”。

参考:https://forum.openwrt.org/t/howto-running-adguard-home-on-openwrt/51678/1

公网的安全设置(非安全类专家)


https(SSL)访问

openwrt 21.02默认支持 TLS 与 HTTPS
OpenWrt 现在默认启用了 TLS 功能并内置了 Mozilla 信任的证书,这也就意味着 wget 和 opkg 命令在不做额外操作的情况下可以直接获取 HTTPS 的资源了。 现在,opkg 下载服务器将默认使用 HTTPS 加密连接

OpenWrt 已经将默认的 SSL 库从 mbedTls 切换为 wolfSSL。你也可以手动安装并切换为 mbedTLS 或是 OpenSSL。

从 OpenWrt 19.07 升级到 OpenWRrt 21.02 的话,HTTP 请求会被重定向到 HTTPS。但如果是全新安装 OpenWrt 21.02,则不会启用重定向。你可以使用以下命令手动开启或关闭重定向:

uci set uhttpd.main.redirect_https=1   # 1 为开启, 0 为关闭
uci commit uhttpd
service uhttpd reload

原文


修改默认端口

删除http页面访问端口,修改https访问端口

uci -q delete uhttpd.main.listen_http
uci -q delete uhttpd.main.listen_https
uci add_list uhttpd.main.listen_https="0.0.0.0:8443"
uci add_list uhttpd.main.listen_https="[::]:8443"
uci commit uhttpd
/etc/init.d/uhttpd restart

网页浏览器访问https://192.168.3.1:8443


动态域名DDNS(cloudflare)

需要动态域名的原因在于你的公网IP地址在ISP(网络服务供应商)是变动的。通过域名访问服务器本质上是访问域名所绑定的IP地址。

动态域名实际是固定的域名绑定动态的IP地址。通过及时更新域名所绑定的IP地址进而达到在公共网络访问路由器的目的。

这篇文章写的很详细包括一些细节,比如如果绑定的二级域名的”.“要换成”@".
点击阅读(英文)


取消浏览器访问警告

浏览器提示证书无效,是因为证书是没有第三方有效签发。内网访问,并不需要担心http的传输数据被截取。

如果有外网访问内网的需求,则证书有效无疑提高了安全性(不知道自签证书是不是也是相对安全的)。

https://github.com/acmesh-official/acme.sh/wiki/How-to-run-on-OpenWrt


安装nginx并替代uhttpd

opkg update && opkg install luci-nginx
opkg install luci-ssl-nginx
opkg install nginx-ssl
/etc/init.d/uhttpd disable
/etc/init.d/nginx enable
/etc/init.d/nginx start

杂项


opkg remove dnsmasq && opkg install dnsmasq-full

一般会出现:resolve_conffiles: Existing conffile /etc/config/dhcp is different from the conffile in the new package. The new conffile will be placed at /etc/config/dhcp-opkg.
告诉你我换位置了,并不需要在意。


opkg remove libdevmapper-selinux --force-depends && opkg install libdevmapper-normal

  • 文件夹建立软链接(用绝对地址),将/overlay/opt的地址建立/opt的快捷方式。

  • 即打开/opt文件夹实际是打开/overlay/opt文件夹。存入/opt的文件实际存放在/overlay/opt文件夹中。

    ln -s /overlay/opt /opt
    

luci界面报错

浏览器界面出现类似/usr/lib/lua/luci/dispatcher.lua:1347: module ‘luci.cbi’ not found:

rm -rf /tmp/luci-*
opkg update
opkg install luci luci-base luci-compat

最近一次更新:2021/12/16.