OpenWrt在线编译(官方网址)及自定义(openclash,设备名,密码等等)

流程导图
现在不是很想折腾了,稳定在了OpenWrt 官方的在线编译了。想升级时将参数拷贝进去,直接点击构建。
刚刚跟新了下uci-defaults,有变量的注释掉使用默认,ddns需要注释掉整段部分。

日常使用中所有更改的配置都应该可以使用 uci-defaults 配置完成,这样在线编译的固件可以直接使用,省去了事后的手动配置。

刷机有风险,执行需谨慎。仅供参考。

硬件配置

主板:h77n-wifi (老主板,设备刷写部分有BIOS添加nvme模块实现pcie启动系统)
cpu:i5-3470t
硬盘:英特尔傲腾16G的

目前再用

主板:asus MAXIMUS VII IMPACT
cpu:i7-4790k
硬盘:三星 nvme 固态硬盘

使用固件为 x86 设备或 Hyper-v 虚拟机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 x86 硬盘分区
root@OpenWrt-X86:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 232.9G 0 disk
├─nvme0n1p1 259:1 0 16M 0 part /boot
│ /boot
├─nvme0n1p2 259:2 0 1G 0 part /rom
├─nvme0n1p99 259:3 0 231.9G 0 part /overlay/opt/docker
│ /overlay
└─nvme0n1p128 259:4 0 239K 0 part

Hyper-v 虚拟硬盘分区
root@OpenWrt-X86:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 5G 0 disk
├─sda1 8:1 0 16M 0 part /boot
│ /boot
├─sda2 8:2 0 1G 0 part /rom
├─sda99 259:0 0 4G 0 part /overlay/opt/docker
│ /overlay
└─sda128 259:1 0 239K 0 part

在线编译

编译网址:https://firmware-selector.openwrt.org/

本人常用型号:x86 和 ac88u;型号右侧有 openwrt 版号。
设备差异性,需适配修改。

package

简要说明

网页端会有默认的必需的包,要添加额外的包就需要将额外包所需的依赖添加上。

x86 的 package(包含 openclash )

点击 ‘自定义已安装的软件包和/或首次启动脚本’ 三角展开。已安装的软件包中可以添加你需要的插件需要的依赖包名(官方源没有的插件)。

这是我自用的 x86 的包,包含了GitHub中插件 oc 所需的所有依赖。安装完成只需要把 ipk 文件上传安装一下就成了。
可能有少的包,灵活性添加,删减把。

1
2
3
4
5
base-files brcmfmac-firmware-4366b1-pcie brcmfmac-firmware-4366c0-pcie busybox ca-bundle dnsmasq dropbear firewall4 fstools iwinfo kmod-brcmfmac kmod-brcmfmac kmod-gpio-button-hotplug kmod-leds-gpio kmod-nft-offload kmod-phy-bcm-ns-usb2 kmod-phy-bcm-ns-usb3 kmod-usb-ledtrig-usbport kmod-usb-ohci kmod-usb2 kmod-usb3 libc libgcc libustream-mbedtls logd luci mtd netifd nftables nvram odhcp6c odhcpd-ipv6only opkg osafeloader oseama otrx ppp ppp-mod-pppoe procd procd-seccomp procd-ujail uci uclient-fetch urandom-seed urngd wpad-basic-mbedtls wpad-basic-mbedtls

-dnsmasq block-mount blockd cfdisk docker-compose dockerd e2fsprogs fdisk kmod-fs-ext4 kmod-fs-ntfs kmod-fs-vfat kmod-usb-storage luci-i18n-attendedsysupgrade-zh-cn luci-i18n-base-zh-cn luci-i18n-ddns-zh-cn luci-i18n-dockerman-zh-cn luci-i18n-filebrowser-zh-cn luci-i18n-firewall-zh-cn luci-i18n-ksmbd-zh-cn luci-i18n-opkg-zh-cn luci-i18n-ttyd-zh-cn mount-utils mtd ntfs-3g kmod-lp kmod-usb-printer luci-i18n-p910nd-zh-cn blkid lsblk

coreutils-nohup bash dnsmasq-full curl ca-certificates ipset ip-full libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip kmod-nft-tproxy luci-compat luci luci-base

添加额外的 package( openclash 为例)

找到 openclash 的源码,readme 中有安装 openclash 所需的依赖 。或者 Tags 中同样也有:

依赖

将所需要的依赖复制粘贴到在线固件选择网页中。我上面的代码已经包含这些依赖了。然后下载 openclash 的 ipk 文件,ipk 文件需要后面安装完成后,在软件包页面手动上传安装。

安装

uci-defaults

简要说明实现

首次启动脚本实现自定义有以下几种:

  1. 通过uci set命令

    判断变量是否非空,执行uci setuci show显示的内容并不是直接使用uci set就能设置的,没有的选项需要先uci add添加,在执行。还有些需要删除,不然uci set同样无效,删除命令uci delete

  2. 通过追加,删除配置文件

    判断相关是否存在,追加或删除配置文件。

可以在/etc/1setup.log文件中查看执行结果,排查问题。

目前自用的 uci-defaults

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
cat << "EOF" > /etc/uci-defaults/99-custom

# Beware! This script will be in /rom/etc/uci-defaults/ as part of the image.
# Uncomment lines to apply:

##########################################################
###################私人配置,分享要改#######################
# 密码
root_password="***************"
# wan 拨号 pppoe 协议
pppoe_username="0000000000000"
pppoe_password="000000000"
# openclash 订阅地址
clash_rules="http://****************"
# ddns
ddns_host='*************'
ddns_username='**************'
ddns_password='*************'
# wifi 名称及密码
#wlan_name="************"
#wlan_password="************"
##########################################################

# log potential errors
exec >/etc/1setup.log 2>&1

#sed -i 's/ash/bash/' /etc/passwd
#re_boot=yes
#shopt -s extglob

# Test: 配置测试用(lan wan自定义无效);Used: 日常使用
CHOICE=Test
#CHOICE=Used

# 主机名,时区
host_name="OpenWrt-X86"
zone_name="Asia/Shanghai"

# lan 静态协议地址
lan_ip_address="10.0.0.1"
lan_netmask="255.255.255.0"

# lan 其它协议
#lan_proto="dhcp"

# wan 其它协议
#wan_proto="dhcp"

# 终端自动登录
ttyd_login="/bin/login -f root"

# 文件共享
k_smbd=yes

# 磁盘分区:
# yes(格式化已有 free 分区)
# no (不格式化已有 free 分区)
# new(空盘写入后格式化出 free 分区)
format_disk='no'
#
# 磁盘挂载 (可单独设置分区,单独挂载不生效。根目录(/)x86 不能使用)
# 1: /mnt
# 2: /overlay
# 3: /
mnt_disk="2"
#
# disk_nub 为分区后,磁盘名称编号
disk_nub=99

# ############################# test 用 ###############################
# 网口数量
eth_nub='1'

# 开放端口
echo -e "
config rule
option name 'ALLOW_PORT_OUT'
option dest 'wan'
option target 'ACCEPT'

config rule
option name 'ALLOW_PORT_IN'
option src 'wan'
option target 'ACCEPT'" >> firewall_port
#######################################################################

# 端口转发
#echo -e "
#config redirect
# option dest 'lan'
# option target 'DNAT'
# option name 'alist'
# option src 'wan'
# option src_dport '5678'
# option dest_ip '$lan_ip_address'
# option dest_port '5678'" >> firewall_port_Forwards

# ddns
echo -e "
config service 'ddns'
option service_name 'google.com'
option use_ipv6 '0'
option enabled '1'
option lookup_host '$ddns_host'
option domain '$ddns_host'
option username '$ddns_username'
option password '$ddns_password'
option ip_source 'interface'
option interface 'pppoe-wan'
option use_syslog '2'
option check_unit 'minutes'
option force_unit 'minutes'
option retry_unit 'seconds'
option ip_interface 'pppoe-wan'" >> d_dns

funTest(){
#----------------------------------- test --------------------------------------------------
# 开放端口(选择 test 用)
if [ -f firewall_port ]; then
cat firewall_port >> /etc/config/firewall
uci commit firewall
rm firewall_port
else echo "test/区域未执行: firewall_port"
fi

case $eth_nub in
"1")
#单网口,wan(eth0) 口测试
uci set network.wan=interface
uci set network.wan.proto='static'
uci set network.wan.device='eth0'
uci set network.wan.ipaddr='10.0.0.240'
uci set network.wan.netmask='255.255.255.0'
uci set network.wan.gateway='10.0.0.1'
uci set network.wan.dns='10.0.0.1'

uci set network.@device[0].ports='eth1'
#uci delete network.lan
uci commit network
#/etc/init.d/network reload

uci delete dhcp.wan
uci commit dhcp

uci add firewall zone
uci set firewall.@zone[-1]=zone
uci set firewall.@zone[-1].name='wan'
uci set firewall.@zone[-1].input='REJECT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='REJECT'
uci set firewall.@zone[-1].masq='1'
uci set firewall.@zone[-1].mtu_fix='1'
uci commit firewall
#/etc/init.d/network reload
;;
"2")
#双网口,wan(eth1) 口测试
uci set network.lan.proto='static'
uci set network.lan.ipaddr="10.0.1.0"
uci set network.lan.netmask="255.255.255.0"

uci set network.wan.proto='static'
#uci set network.wan.device='eth1'
uci set network.wan.ipaddr='10.0.0.240'
uci set network.wan.netmask='255.255.255.0'
uci set network.wan.gateway='10.0.0.1'
uci commit network
###/etc/init.d/network reload

uci set ttyd.@ttyd[0]=ttyd
uci set ttyd.@ttyd[0].interface='@wan'
uci set ttyd.@ttyd[0].command='/bin/login -f root'
uci set ttyd.@ttyd[0].debug='7'
uci commit ttyd
;;
*)
echo "区域未执行:eth_nub"
;;
esac

}

funUsed(){
# LAN 静态协议
# More options: https://openwrt.org/docs/guide-user/base-system/basic-networking
if [ -n "$lan_ip_address" ]; then
uci set network.lan.proto='static'
uci set network.lan.ipaddr="$lan_ip_address"
uci set network.lan.netmask="$lan_netmask"
uci commit network
else echo "区域未执行: lan_ip_address"
fi

# LAN 其它协议
# More options: https://openwrt.org/docs/guide-user/base-system/basic-networking
if [ -n "$lan_proto" ]; then
uci set network.lan.proto="$lan_proto"
uci commit network
else echo "区域未执行: lan_proto"
fi

# Wan pppoe 协议
# More options: https://openwrt.org/docs/guide-user/network/wan/wan_interface_protocols#protocol_pppoe_ppp_over_ethernet
if [ -n "$pppoe_username" -a "$pppoe_password" ]; then
uci set network.wan.proto=pppoe
uci set network.wan.username="$pppoe_username"
uci set network.wan.password="$pppoe_password"
uci delete network.wan6
uci commit network
else echo "区域未执行: pppoe_username"
fi

# WAN 其它协议
if [ -n "$wan_proto" ]; then
uci set network.wan.proto="$wan_proto"
uci commit network
else echo "区域未执行: wan_proto"
fi
}

funAll(){
# 主机名
if [ -n "$host_name" ]; then
uci set system.@system[0].hostname="$host_name"
uci commit system
uci set luci.languages.zh_cn='简体中文 (Chinese Simplified)'
uci set luci.main.lang='zh_cn'
uci commit luci
else echo "区域未执行: host_name"
fi

# 时区
if [ -n "$zone_name" ]; then
uci set system.@system[0].zonename="$zone_name"
uci set system.@system[0].timezone='UTC-8'
uci commit system
/etc/init.d/system reload
else echo "区域未执行: zone_name"
fi

# root密码
if [ -n "$root_password" ]; then
(echo "$root_password"; sleep 1; echo "$root_password") | passwd > /dev/null
else echo "区域未执行: root_password"
fi

## WLAN
## More options: https://openwrt.org/docs/guide-user/network/wifi/basic#wi-fi_interfaces
#if [ -n "$wlan_name" -a -n "$wlan_password" -a ${#wlan_password} -ge 8 ]; then
# uci set wireless.@wifi-device[0].disabled='0'
# uci set wireless.@wifi-iface[0].disabled='0'
# uci set wireless.@wifi-iface[0].encryption='psk2'
# uci set wireless.@wifi-iface[0].ssid="$wlan_name"
# uci set wireless.@wifi-iface[0].key="$wlan_password"
# uci commit wireless
# else echo "区域未执行: wlan_name"
#fi

# 终端自动登录
if [ -n "$ttyd_login" ]; then
uci set ttyd.@ttyd[0].command="$ttyd_login"
uci delete ttyd.@ttyd[0].interface
uci commit ttyd
else echo "区域未执行: ttyd_login"
fi

# ddns
if [ -n "$ddns_host" ]; then
cat d_dns >> /etc/config/ddns
uci commit ddns
rm d_dns
else echo "区域未执行: ddns_host"
fi

# 端口转发
if [ -f firewall_port_Forwards ]; then
cat firewall_port_Forwards >> /etc/config/firewall
rm firewall_port_Forwards
uci commit firewall
else echo "区域未执行: firewall_port_Forwards"
fi

if [ -n "$clash_rules" ]; then
#openclash
#uci set openclash.config.enable='1'
#uci set openclash.config.dashboard_password='OpenClash8517'
###uci set openclash.@authentication[0].password='OpenClash8517'
#uci commit openclash
#/etc/init.d/openclash reload
uci add openclash config_subscribe
uci set openclash.@config_subscribe[-1]=config_subscribe
uci set openclash.@config_subscribe[-1].enabled='1'
uci set openclash.@config_subscribe[-1].name='clash-rules'
uci set openclash.@config_subscribe[-1].address="$clash_rules"
uci set openclash.@config_subscribe[-1].sub_ua='Clash'
uci set openclash.@config_subscribe[-1].sub_convert='0'
uci commit openclash
/etc/init.d/openclash reload
else echo "区域未执行: clash_rules"
fi

# 文件共享 磁盘管理
# 格式化format
#uuid=$(blkid -s UUID -o value $dev_device)
#dev_device=$(blkid -U $uuid)
#mnt_device=$(echo $(blkid -U $uuid) | sed 's/dev/mnt/')
disk_name=$(lsblk -Sno NAME;lsblk -Nno NAME)
partn=$(lsblk -no PARTN | grep -v "1\|2\|128\|^$" | awk '{sub(/^ */, "");sub(/ *$/, "")}1')
if [ "$partn" != '99' -a -n "$partn" ]; then
disk_nub=$partn
echo "分区序号不是 99 且不为空"
else echo "区域未执行: partn"
fi
case $disk_name in
*"nvme"*)
p_disk_nub="p$disk_nub"
dev_device="/dev/$disk_name$p_disk_nub"
mnt_device=$(echo $dev_device | sed 's/dev/mnt/')
;;
"sda")
dev_device="/dev/$disk_name$disk_nub"
mnt_device=$(echo $dev_device | sed 's/dev/mnt/')
;;
*)
format_disk='no'
;;
esac

# dockerd/共享 根目录路径
directory_path="$mnt_disk"
case $directory_path in
"1")
dockerd_dir="$mnt_device/opt/docker"
#匹配替换整行
sed -i "/data_root/c\ option data_root \'$dockerd_dir\'" /etc/config/dockerd
#sed -i 's/opt\/docker/$dockerd_dir/' /etc/config/dockerd
uci commit dockerd
ksmbd_dir="$mnt_device"
;;
"2")
dockerd_dir="/overlay/opt/docker"
sed -i "/data_root/c\ option data_root \'$dockerd_dir\'" /etc/config/dockerd
uci commit dockerd
ksmbd_dir="/overlay"
;;
"3")
dockerd_dir="/opt/docker"
sed -i "/data_root/c\ option data_root \'$dockerd_dir\'" /etc/config/dockerd
uci commit dockerd
ksmbd_dir="/opt"
;;
*)
ksmbd_dir='/tmp'
esac

# 文件共享
if [ -n "$k_smbd" ]; then
uci set ksmbd.@globals[0].interface='lan wan'
uci add ksmbd share
uci set ksmbd.@share[-1]=share
uci set ksmbd.@share[-1].name='x86_mnt'
uci set ksmbd.@share[-1].path="$ksmbd_dir"
uci set ksmbd.@share[-1].force_root='1'
uci set ksmbd.@share[-1].read_only='no'
uci set ksmbd.@share[-1].guest_ok='yes'
uci set ksmbd.@share[-1].create_mask='0666'
uci set ksmbd.@share[-1].dir_mask='0777'
uci add ksmbd share
uci set ksmbd.@share[-1]=share
uci set ksmbd.@share[-1].name='x86_etc'
uci set ksmbd.@share[-1].path='/etc'
uci set ksmbd.@share[-1].force_root='1'
uci set ksmbd.@share[-1].read_only='no'
uci set ksmbd.@share[-1].guest_ok='yes'
uci set ksmbd.@share[-1].create_mask='0666'
uci set ksmbd.@share[-1].dir_mask='0777'
uci commit ksmbd
else echo "区域未执行: k_smbd"
fi

# 磁盘格式化/挂载
case $format_disk in
"yes")
#echo -e "d\n$disk_nub\nn\n$disk_nub\n\n\nw" | fdisk /dev/$disk_name
echo "y" | mkfs.ext4 $dev_device
;;
"no")
echo 'no 格式化'

if [ -e "$dev_device" ]; then
mkdir -p $mnt_device
mount $dev_device $mnt_device
cd $mnt_device
ls | grep -v opt | awk '{system("rm -rf "$1)}'
cd -
umount $mnt_device
rm -r $mnt_device
fi
;;
"new")
echo -e "n\n$disk_nub\n\n\nw" | fdisk /dev/$disk_name
echo "y" | mkfs.ext4 $dev_device
esac

if [ -e "$dev_device" ]; then
block detect > /etc/config/fstab
uci show fstab > nub
nub=$(cat nub | grep "$disk_name")
nub=${nub#*'['}
nub=${nub%']'*}
case $mnt_disk in
"1")
uci set fstab.@mount["$nub"].enabled='1'
uci commit fstab
/etc/init.d/fstab reload
;;
"2")
uci set fstab.@mount["$nub"].target='/overlay'
uci set fstab.@mount["$nub"].enabled='1'
uci commit fstab
/etc/init.d/fstab reload
reboot
;;
"3")
mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount "$dev_device" /tmp/extroot
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
wait
#umount /tmp/introot
#umount /tmp/extroot

uci set fstab.@mount["$nub"].target="/"
uci set fstab.@mount["$nub"].enabled='1'
uci commit fstab
/etc/init.d/fstab reload
#reboot
;;
*)
echo "没有选择挂载"
esac
else echo "不存在 $dev_device 设备。区域未执行: 磁盘格式化/挂载"
fi
}

main(){
case $CHOICE in
Test)
funTest
funAll
;;
Used)
funUsed
funAll
;;
esac
}

main "$@"

EOF

uci-defaults 说明

使用环境是 nvme 硬盘,除了 openwrt 占用的空间,其它自由空间格式化为一个分区。后面的挂载就是在这基础上进行的。

funNvme:实体设备,nvme 硬盘
funSdabc:虚拟机设备,一直还没随着 nvme 更新。

密码

通过 passwd命令改 root 密码

1
2
3
4
5
6
7
# 密码
root_password="***************"

# root密码
if [ -n "$root_password" ]; then
(echo "$root_password"; sleep 1; echo "$root_password") | passwd > /dev/null
fi
拨号

wan.proto
wan.username
wan.password
这三个一起配置,协议/用户名/密码

1
2
3
4
5
6
7
8
9
10
# wan 拨号 pppoe 协议
pppoe_username="0000000000000"
pppoe_password="000000000"
# Wan pppoe 协议
if [ -n "$pppoe_username" -a "$pppoe_password" ]; then
uci set network.wan.proto=pppoe
uci set network.wan.username="$pppoe_username"
uci set network.wan.password="$pppoe_password"
uci commit network
fi
订阅地址(在线编译可能不实现,因为还未安装 openclash 的 ipk 文件)

目前想的是,可以将 ipk 放到外置设备上,首次开机执行 uci-defaults 时,去搜索外置设备上的 ipk 文件,然后安装。然后在添加订阅地址

订阅地址需要添加才能配置,先使用uci add添加在配置参数。

uci set openclash.config.dashboard_password=’OpenClash8517’
uci set openclash.@authentication[0].password=’OpenClash8517’
这两项始终不生效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# openclash 订阅地址
clash_rules="http://****************"

if [ -n "$clash_rules" ]; then
#openclash
#uci set openclash.config.enable='1'
uci set openclash.config.dashboard_password='OpenClash8517'
uci set openclash.@authentication[0].password='OpenClash8517'
uci commit openclash
uci add openclash config_subscribe
uci set openclash.@config_subscribe[-1]=config_subscribe
uci set openclash.@config_subscribe[-1].enabled='1'
uci set openclash.@config_subscribe[-1].name='clash-rules'
uci set openclash.@config_subscribe[-1].address="$clash_rules"
uci set openclash.@config_subscribe[-1].sub_ua='Clash'
uci set openclash.@config_subscribe[-1].sub_convert='0'
uci commit openclash
/etc/init.d/openclash reload
fi
ddns

ddns 参数太多,使用在/etc/config/ddns文件中追加参数的方式。先将参数写入到 d_dns 文件,判断文件存在执行追加命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# ddns
ddns_host='*************'
ddns_username='**************'
ddns_password='*************'

# ddns
echo -e "
config service 'ddns'
option service_name 'google.com'
option use_ipv6 '0'
option enabled '1'
option lookup_host '$ddns_host'
option domain '$ddns_host'
option username '$ddns_username'
option password '$ddns_password'
option ip_source 'interface'
option interface 'pppoe-wan'
option use_syslog '2'
option check_unit 'minutes'
option force_unit 'minutes'
option retry_unit 'seconds'
option ip_interface 'pppoe-wan'" >> d_dns

# ddns
if [ -n "$ddns_host" ]; then
cat d_dns >> /etc/config/ddns
uci commit ddns
rm d_dns
fi
WiFi 名称及密码

WiFi 我注释掉了,我 x86 没有装可以驱动 ap 的网卡。

1
2
3
4
5
6
7
8
9
10
11
12
13
# wifi 名称及密码
#wlan_name="************"
#wlan_password="************"
## WLAN
## More options: https://openwrt.org/docs/guide-user/network/wifi/basic#wi-fi_interfaces
#if [ -n "$wlan_name" -a -n "$wlan_password" -a ${#wlan_password} -ge 8 ]; then
# uci set wireless.@wifi-device[0].disabled='0'
# uci set wireless.@wifi-iface[0].disabled='0'
# uci set wireless.@wifi-iface[0].encryption='psk2'
# uci set wireless.@wifi-iface[0].ssid="$wlan_name"
# uci set wireless.@wifi-iface[0].key="$wlan_password"
# uci commit wireless
#fi
主机名,时区

使用命令设置保存应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 主机名,时区
host_name="OpenWrt-X86"
zone_name="Asia/Shanghai"
# 主机名
if [ -n "$host_name" ]; then
uci set system.@system[0].hostname="$host_name"
uci commit system
fi

# 时区
if [ -n "$zone_name" ]; then
uci set system.@system[0].zonename="$zone_name"
uci set system.@system[0].timezone='UTC-8'
uci commit system
/etc/init.d/system reload
fi
lan 配置

静态地址或 dhcp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# lan 静态协议地址
lan_ip_address="10.0.0.1"
lan_netmask="255.255.255.0"

# lan 其它协议
#lan_proto="dhcp"

# LAN 静态协议
# More options: https://openwrt.org/docs/guide-user/base-system/basic-networking
if [ -n "$lan_ip_address" ]; then
uci set network.lan.proto='static'
uci set network.lan.ipaddr="$lan_ip_address"
uci set network.lan.netmask="$lan_netmask"
uci commit network
fi

# LAN 其它协议
# More options: https://openwrt.org/docs/guide-user/base-system/basic-networking
if [ -n "$lan_proto" ]; then
uci set network.lan.proto="$lan_proto"
uci commit network
fi
wan 配置

dhcp 或 pppoe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# wan 拨号 pppoe 协议
pppoe_username="0000000000000"
pppoe_password="000000000"
# wan 其它协议
# wan_proto="dhcp"

# Wan pppoe 协议
# More options: https://openwrt.org/docs/guide-user/network/wan/wan_interface_protocols#protocol_pppoe_ppp_over_ethernet
if [ -n "$pppoe_username" -a "$pppoe_password" ]; then
uci set network.wan.proto=pppoe
uci set network.wan.username="$pppoe_username"
uci set network.wan.password="$pppoe_password"
uci commit network
fi

# WAN 其它协议
if [ -n "$wan_proto" ]; then
uci set network.wan.proto="$wan_proto"
uci commit network
fi
ttyd 终端自动登陆

注释掉取消

1
2
3
4
5
6
7
8
9

# 终端自动登录
ttyd_login="/bin/login -f root"

# 终端自动登录
if [ -n "$ttyd_login" ]; then
uci set ttyd.@ttyd[0].command="$ttyd_login"
uci commit ttyd
fi
开放端口

开放端口(选择 test 用) 修改配置文件方式,注释掉取消

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 开放端口(选择 test 用)
echo -e "
config rule
option name 'ALLOW_PORT_OUT'
option dest 'wan'
option target 'ACCEPT'

config rule
option name 'ALLOW_PORT_IN'
option src 'wan'
option target 'ACCEPT'" >> firewall_port

# 开放端口(选择 test 用)
if [ -f firewall_port ]; then
cat firewall_port >> /etc/config/firewall
uci commit firewall
rm firewall_port
fi
端口转发

端口转发 修改配置文件方式,注释掉取消

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 端口转发
echo -e "
config redirect
option dest 'lan'
option target 'DNAT'
option name 'alist'
option src 'wan'
option src_dport '5678'
option dest_ip '$lan_ip_address'
option dest_port '5678'" >> firewall_port_Forwards


# 端口转发
if [ -f firewall_port_Forwards ]; then
cat firewall_port_Forwards >> /etc/config/firewall
rm firewall_port_Forwards
uci commit firewall
fi
文件共享

k_smbd 参数随意,注释掉为取消

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 文件共享
k_smbd="1"

# 文件共享
if [ ! -n "$ksmbd_dir" ]; then
ksmbd_dir='/mnt'
fi
if [ -n "$k_smbd" ]; then
uci set ksmbd.@globals[0].interface='lan wan'
uci add ksmbd share
uci set ksmbd.@share[-1]=share
uci set ksmbd.@share[-1].name='x86_mnt'
uci set ksmbd.@share[-1].path="$ksmbd_dir"
uci set ksmbd.@share[-1].force_root='1'
uci set ksmbd.@share[-1].read_only='no'
uci set ksmbd.@share[-1].guest_ok='yes'
uci set ksmbd.@share[-1].create_mask='0666'
uci set ksmbd.@share[-1].dir_mask='0777'
uci add ksmbd share
uci set ksmbd.@share[-1]=share
uci set ksmbd.@share[-1].name='x86_etc'
uci set ksmbd.@share[-1].path='/etc'
uci set ksmbd.@share[-1].force_root='1'
uci set ksmbd.@share[-1].read_only='no'
uci set ksmbd.@share[-1].guest_ok='yes'
uci set ksmbd.@share[-1].create_mask='0666'
uci set ksmbd.@share[-1].dir_mask='0777'
uci commit ksmbd
fi
格式化设备,挂载设备为 /overlay 或 /mnt 或 /

挂载为根目录(/)始终不能使用,重启后提示下面两行。回车循环显示,网口不能使用。
挂载到 / 目录,需要完全启动系统后在执行,uci-defaults 执行太早,后面有网口等没有加载出来,因此失效。使用 ac88u,却能直接启动挂载 / 目录,x86 却不行,应该是代码不相同。

1
2
failed to execute /usr/libexec/login.sh
Please press Enter to activate this console

nvme 固态硬盘,挂载自由分区设备的名称:nvme0n1p99
可以自己定分区序号,不用指定设备名称了。使用lsblk -Sn -o NAME;lsblk -Nn -o NAME命令看看设备,sda 或 nvme0n1 都行或其他名,只能输出是一个设备名,多个不生效。
测试使用…….

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
disk_nub=99
format_disk='no'
mnt_disk="2"

disk_name=$(lsblk -Sn -o NAME;lsblk -Nn -o NAME)
case $disk_name in
*"nvme"*)
p_disk_nub="p$disk_nub"
dev_device="/dev/$disk_name$p_disk_nub"
;;
"sda")
dev_device="/dev/$disk_name$disk_nub"
;;
*)
format_disk='no'
;;
esac

case $format_disk in
"yes")
echo "y" | mkfs.ext4 $dev_device
;;
"no")
echo 'no 格式化'
;;
"new")
echo -e "n\n$disk_nub\n\n\nw" | fdisk /dev/$disk_name
echo "y" | mkfs.ext4 $dev_device
esac

if [ -n "$format_disk" ]; then
mnt_device=$(echo $dev_device | sed 's/dev/mnt/')

mkdir -p $mnt_device
mount $dev_device $mnt_device
cd $mnt_device
ls | grep -v opt | awk '{system("rm -rf "$1)}'
cd -
umount $mnt_device
rm -r $mnt_device

block detect > /etc/config/fstab
uci show fstab > nub
nub=$(cat nub | grep "$disk_name")
nub=${nub#*'['}
nub=${nub%']'*}
fi

case $mnt_disk in
"1")
uci set fstab.@mount["$nub"].enabled='1'
uci commit fstab
/etc/init.d/fstab reload
;;
"2")
uci set fstab.@mount["$nub"].target='/overlay'
uci set fstab.@mount["$nub"].enabled='1'
uci commit fstab
/etc/init.d/fstab reload
reboot
;;
"3")
mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount "$dev_device" /tmp/extroot
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
wait
#umount /tmp/introot
#umount /tmp/extroot

uci set fstab.@mount["$nub"].target="/"
uci set fstab.@mount["$nub"].enabled='1'
uci commit fstab
/etc/init.d/fstab reload
#reboot
;;
*)
echo "挂载选择 1: /mnt 2: /overlay 3: /"
esac
其它可以自定义

其它可使用uci set的自定参数可在自己已在运行使用的 openwrt 的终端或 ssh 中使用uci show命令显示。这些参数可以添加到uci-defaults中修改。

1
2
3
4
5
root@OpenWrt:~# uci show
ddns.global=ddns
ddns.global.ddns_dateformat='%F %R'
ddns.global.ddns_loglines='250'
......

下面是终端或ssh中执行的命令

1
2
3
4
5
6
7
root@OpenWrt:~# uci set network.lan.proto='static'
root@OpenWrt:~# uci set network.lan.ipaddr='192.168.10.100'
root@OpenWrt:~# uci set network.lan.netmask='255.255.255.0'
root@OpenWrt:~# uci set network.lan.gateway='192.168.10.1'
root@OpenWrt:~# uci set network.lan.dns='8.8.8.8'
root@OpenWrt:~# uci commit network
root@OpenWrt:~# /etc/init.d/network reload

这几项完成后就可以请求构建,等待几分钟完成下载固件了。

设备刷写

我是u盘安装Ventoy,直接加载pe的iso文件,在pe中使用 IMG写盘工具.exe 直接写入ssd。

因为是老主板,要pcie启动ssd 需要添加nvme模块,有兴趣可以查看一个 pcie 插槽损坏的 h77n-wifi(BIOS添加nvme模块实现pcie启动操作系统)这篇文章。

进入pe后打开 IMG写盘工具 程序,选择要写入的盘和需要写入到盘的img文件。

选择要写入的盘和需要写入到盘的img文件

开始刷写

2024-05-23-20-03-35-037

完成后重启退出pe,进入op。

2024-05-23-20-03-41-831

这次重启进入op后uci-defaults中的文件并没有执行,因为文件还存在,op执行完成后会删除uci-defaults中文件。

2024-05-23-20-05-02-413

所以,reboot一下就行了。

2024-05-23-20-06-36-302

视频或文章链接

bili 视频 OpenWrt在线编译(官方网址)及自定义
openclash 自定义的本地节点转换(subconverter)
openwrt 默认配置编译(密码 语言 IP))

arm 设备
使用固件选择器编译 ac88u 的固件,同时自定义参数
路由器cmcc-cr8808(8818)取消运营商限制,开启 telnet,ssh
RAX3000M 修改配置文件,刷 u-boot 及 openwrt 固件

自用的节点商,对于非常高清的视频没有需求可以试试,关键便宜,一个月十几块。
闪电

Q群:290979342(聚焦单车交流群)

Q群:977922094(聚焦 openwrt 路由器交流)