├── .gitignore
├── LICENSE
├── README.md
├── kcptun
├── kcptun.sh
├── startup
│ ├── supervisord.init.debain
│ ├── supervisord.init.redhat
│ └── supervisord.systemd
└── version.json
└── ovz-bbr
├── bin
├── haproxy-lkl.sh
├── haproxy.linux2628_x86_64
└── rinetd-bbr
├── config
├── config.lkl
├── config.lkl.mini
└── haproxy.build.args
├── lib64
├── liblkl-hijack.so-20170419
├── liblkl-hijack.so-20170424
└── liblkl-hijack.so-20170724
├── ovz-bbr-installer.sh
├── patch
├── lkl-makefile.patch
├── net-default-bbr.patch
└── tcp_bbr.patch
└── startup
├── haproxy-lkl.init.debain
├── haproxy-lkl.init.redhat
└── haproxy-lkl.systemd
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Linux Shell Scripts
2 |
3 | 一些 Linux 脚本
4 |
5 | ```sh
6 | $ tree
7 | ├── kcptun
8 | │ └── kcptun.sh # kcptun 一键安装脚本
9 | └── ovz-bbr
10 | └── ovz-bbr-installer.sh # OpenVZ BBR 一键安装脚本
11 | ```
12 |
13 | ## Kcptun 一键安装脚本
14 |
15 | * Ubuntu:
16 | ```sh
17 | apt install python-is-python3 -y
18 | wget --no-check-certificate -O kcptun.sh https://github.com/kuoruan/shell-scripts/raw/master/kcptun/kcptun.sh
19 | sh kcptun.sh
20 | ```
21 |
22 |
23 | * 其他Linux安装命令:
24 | ```sh
25 | wget --no-check-certificate -O kcptun.sh https://github.com/kuoruan/shell-scripts/raw/master/kcptun/kcptun.sh
26 | sh kcptun.sh
27 | ```
28 |
29 | * 帮助信息
30 |
31 | ```sh
32 | # sh kcptun.sh help
33 | 请使用: kcptun.sh
34 |
35 | 可使用的参数 包括:
36 |
37 | install 安装
38 | uninstall 卸载
39 | update 检查更新
40 | manual 自定义 Kcptun 版本安装
41 | help 查看脚本使用说明
42 | add 添加一个实例, 多端口加速
43 | reconfig 重新配置实例
44 | show 显示实例详细配置
45 | log 显示实例日志
46 | del 删除一个实例
47 |
48 | 注: 上述参数中的 可选, 代表的是实例的ID
49 | 可使用 1, 2, 3 ... 分别对应实例 kcptun, kcptun2, kcptun3 ...
50 | 若不指定 , 则默认为 1
51 |
52 | Supervisor 命令:
53 | service supervisord {start|stop|restart|status}
54 | {启动|关闭|重启|查看状态}
55 | Kcptun 相关命令:
56 | supervisorctl {start|stop|restart|status} kcptun
57 | {启动|关闭|重启|查看状态}
58 | ```
59 |
60 | ## OpenVZ BBR 一键安装脚本
61 |
62 | * 安装命令:
63 |
64 | ```sh
65 | wget --no-check-certificate -O ovz-bbr-installer.sh https://github.com/kuoruan/shell-scripts/raw/master/ovz-bbr/ovz-bbr-installer.sh
66 | sh ovz-bbr-installer.sh
67 | ```
68 |
69 | * 卸载命令
70 |
71 | ```sh
72 | sh ovz-bbr-installer.sh uninstall
73 | ```
74 |
--------------------------------------------------------------------------------
/kcptun/kcptun.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | : <<-'EOF'
4 | Copyright 2017-2019 Xingwang Liao
5 | Licensed under the Apache License, Version 2.0 (the "License");
6 | you may not use this file except in compliance with the License.
7 | You may obtain a copy of the License at
8 | http://www.apache.org/licenses/LICENSE-2.0
9 | Unless required by applicable law or agreed to in writing, software
10 | distributed under the License is distributed on an "AS IS" BASIS,
11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | See the License for the specific language governing permissions and
13 | limitations under the License.
14 | EOF
15 |
16 | export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
17 |
18 | # 版本信息,请勿修改
19 | # =================
20 | SHELL_VERSION=26
21 | CONFIG_VERSION=7
22 | INIT_VERSION=3
23 | # =================
24 |
25 | KCPTUN_INSTALL_DIR='/usr/local/kcptun'
26 | KCPTUN_LOG_DIR='/var/log/kcptun'
27 | KCPTUN_RELEASES_URL='https://api.github.com/repos/xtaci/kcptun/releases'
28 | KCPTUN_LATEST_RELEASE_URL="${KCPTUN_RELEASES_URL}/latest"
29 | KCPTUN_TAGS_URL='https://github.com/xtaci/kcptun/tags'
30 |
31 | BASE_URL='https://github.com/kuoruan/shell-scripts/raw/master/kcptun'
32 | SHELL_VERSION_INFO_URL="${BASE_URL}/version.json"
33 |
34 | JQ_DOWNLOAD_URL="https://github.com/stedolan/jq/releases/download/jq-1.5/"
35 | JQ_LINUX32_URL="${JQ_DOWNLOAD_URL}/jq-linux32"
36 | JQ_LINUX64_URL="${JQ_DOWNLOAD_URL}/jq-linux64"
37 | JQ_LINUX32_HASH='ab440affb9e3f546cf0d794c0058543eeac920b0cd5dff660a2948b970beb632'
38 | JQ_LINUX64_HASH='c6b3a7d7d3e7b70c6f51b706a3b90bd01833846c54d32ca32f0027f00226ff6d'
39 | JQ_BIN="${KCPTUN_INSTALL_DIR}/bin/jq"
40 |
41 | SUPERVISOR_SERVICE_FILE_DEBIAN_URL="${BASE_URL}/startup/supervisord.init.debain"
42 | SUPERVISOR_SERVICE_FILE_REDHAT_URL="${BASE_URL}/startup/supervisord.init.redhat"
43 | SUPERVISOR_SYSTEMD_FILE_URL="${BASE_URL}/startup/supervisord.systemd"
44 |
45 | # 默认参数
46 | # =======================
47 | D_LISTEN_PORT=29900
48 | D_TARGET_ADDR='127.0.0.1'
49 | D_TARGET_PORT=12984
50 | D_KEY="very fast"
51 | D_CRYPT='aes'
52 | D_MODE='fast'
53 | D_MTU=1350
54 | D_SNDWND=512
55 | D_RCVWND=512
56 | D_DATASHARD=10
57 | D_PARITYSHARD=3
58 | D_DSCP=0
59 | D_NOCOMP='true'
60 | D_QUIET='false'
61 | D_TCP='false'
62 | D_SNMPPERIOD=60
63 | D_PPROF='false'
64 |
65 | # 隐藏参数
66 | D_ACKNODELAY='false'
67 | D_NODELAY=1
68 | D_INTERVAL=20
69 | D_RESEND=2
70 | D_NC=1
71 | # SMUX提高到64M提高SreamBuf效果
72 | D_SOCKBUF=67108868
73 | D_SMUXBUF=67108868
74 | D_KEEPALIVE=10
75 |
76 | # KCP新版支持,SMux默认为2,BUF大小改为16M
77 | D_SMUXVER=2
78 | D_STREAMBUF=16777217
79 | # ======================
80 |
81 | # 当前选择的实例 ID
82 | current_instance_id=""
83 | run_user='kcptun'
84 |
85 | clear
86 |
87 | cat >&1 <<-'EOF'
88 | #########################################################
89 | # Kcptun 服务端一键安装脚本 #
90 | # 该脚本支持 Kcptun 服务端的安装、更新、卸载及配置 #
91 | # 脚本作者: Index #
92 | # 作者博客: https://blog.kuoruan.com/ #
93 | # Github: https://github.com/kuoruan/shell-scripts #
94 | # QQ交流群: 43391448, 68133628 #
95 | # 633945405 #
96 | #########################################################
97 | EOF
98 |
99 | # 打印帮助信息
100 | usage() {
101 | cat >&1 <<-EOF
102 |
103 | 请使用: $0
104 |
105 | 可使用的参数 包括:
106 |
107 | install 安装
108 | uninstall 卸载
109 | update 检查更新
110 | manual 自定义 Kcptun 版本安装
111 | help 查看脚本使用说明
112 | add 添加一个实例, 多端口加速
113 | reconfig 重新配置实例
114 | show 显示实例详细配置
115 | log 显示实例日志
116 | del 删除一个实例
117 |
118 | 注: 上述参数中的 可选, 代表的是实例的ID
119 | 可使用 1, 2, 3 ... 分别对应实例 kcptun, kcptun2, kcptun3 ...
120 | 若不指定 , 则默认为 1
121 |
122 | Supervisor 命令:
123 | service supervisord {start|stop|restart|status}
124 | {启动|关闭|重启|查看状态}
125 | Kcptun 相关命令:
126 | supervisorctl {start|stop|restart|status} kcptun
127 | {启动|关闭|重启|查看状态}
128 | EOF
129 |
130 | exit $1
131 | }
132 |
133 | # 判断命令是否存在
134 | command_exists() {
135 | command -v "$@" >/dev/null 2>&1
136 | }
137 |
138 | # 判断输入内容是否为数字
139 | is_number() {
140 | expr "$1" + 1 >/dev/null 2>&1
141 | }
142 |
143 | # 按任意键继续
144 | any_key_to_continue() {
145 | echo "请按任意键继续或 Ctrl + C 退出"
146 | local saved=""
147 | saved="$(stty -g)"
148 | stty -echo
149 | stty cbreak
150 | dd if=/dev/tty bs=1 count=1 2>/dev/null
151 | stty -raw
152 | stty echo
153 | stty $saved
154 | }
155 |
156 | first_character() {
157 | if [ -n "$1" ]; then
158 | echo "$1" | cut -c1
159 | fi
160 | }
161 |
162 | # 检查是否具有 root 权限
163 | check_root() {
164 | local user=""
165 | user="$(id -un 2>/dev/null || true)"
166 | if [ "$user" != "root" ]; then
167 | cat >&2 <<-'EOF'
168 | 权限错误, 请使用 root 用户运行此脚本!
169 | EOF
170 | exit 1
171 | fi
172 | }
173 |
174 | # 获取服务器的IP地址
175 | get_server_ip() {
176 | local server_ip=""
177 | local interface_info=""
178 |
179 | if command_exists ip; then
180 | interface_info="$(ip addr)"
181 | elif command_exists ifconfig; then
182 | interface_info="$(ifconfig)"
183 | fi
184 |
185 | server_ip=$(echo "$interface_info" | \
186 | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | \
187 | grep -vE "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | \
188 | head -n 1)
189 |
190 | # 自动获取失败时,通过网站提供的 API 获取外网地址
191 | if [ -z "$server_ip" ]; then
192 | server_ip="$(wget -qO- --no-check-certificate https://ipv4.icanhazip.com)"
193 | fi
194 |
195 | echo "$server_ip"
196 | }
197 |
198 | # 禁用 selinux
199 | disable_selinux() {
200 | local selinux_config='/etc/selinux/config'
201 | if [ -s "$selinux_config" ]; then
202 | if grep -q "SELINUX=enforcing" "$selinux_config"; then
203 | sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' "$selinux_config"
204 | setenforce 0
205 | fi
206 | fi
207 | }
208 |
209 | # 获取当前操作系统信息
210 | get_os_info() {
211 | lsb_dist=""
212 | dist_version=""
213 | if command_exists lsb_release; then
214 | lsb_dist="$(lsb_release -si)"
215 | fi
216 |
217 | if [ -z "$lsb_dist" ]; then
218 | [ -r /etc/lsb-release ] && lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")"
219 | [ -r /etc/debian_version ] && lsb_dist='debian'
220 | [ -r /etc/fedora-release ] && lsb_dist='fedora'
221 | [ -r /etc/oracle-release ] && lsb_dist='oracleserver'
222 | [ -r /etc/centos-release ] && lsb_dist='centos'
223 | [ -r /etc/redhat-release ] && lsb_dist='redhat'
224 | [ -r /etc/photon-release ] && lsb_dist='photon'
225 | [ -r /etc/os-release ] && lsb_dist="$(. /etc/os-release && echo "$ID")"
226 | fi
227 |
228 |
229 | lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')"
230 |
231 | if [ "${lsb_dist}" = "redhatenterpriseserver" ]; then
232 | lsb_dist='redhat'
233 | fi
234 |
235 | case "$lsb_dist" in
236 | ubuntu)
237 | if command_exists lsb_release; then
238 | dist_version="$(lsb_release --codename | cut -f2)"
239 | fi
240 | if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then
241 | dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")"
242 | fi
243 | ;;
244 |
245 | debian|raspbian)
246 | dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')"
247 | case "$dist_version" in
248 | 9)
249 | dist_version="stretch"
250 | ;;
251 | 8)
252 | dist_version="jessie"
253 | ;;
254 | 7)
255 | dist_version="wheezy"
256 | ;;
257 | esac
258 | ;;
259 |
260 | oracleserver)
261 | lsb_dist="oraclelinux"
262 | dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')"
263 | ;;
264 |
265 | fedora|centos|redhat)
266 | dist_version="$(rpm -q --whatprovides ${lsb_dist}-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//' | sort | tail -1)"
267 | ;;
268 |
269 | "vmware photon")
270 | lsb_dist="photon"
271 | dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
272 | ;;
273 |
274 | *)
275 | if command_exists lsb_release; then
276 | dist_version="$(lsb_release --codename | cut -f2)"
277 | fi
278 | if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then
279 | dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
280 | fi
281 | ;;
282 | esac
283 |
284 | if [ -z "$lsb_dist" ] || [ -z "$dist_version" ]; then
285 | cat >&2 <<-EOF
286 | 无法确定服务器系统版本信息。
287 | 请联系脚本作者。
288 | EOF
289 | exit 1
290 | fi
291 | }
292 |
293 | # 获取服务器架构和 Kcptun 服务端文件后缀名
294 | get_arch() {
295 | architecture="$(uname -m)"
296 | case "$architecture" in
297 | amd64|x86_64)
298 | spruce_type='linux-amd64'
299 | file_suffix='linux_amd64'
300 | ;;
301 | i386|i486|i586|i686|x86)
302 | spruce_type='linux-386'
303 | file_suffix='linux_386'
304 | ;;
305 | *)
306 | cat 1>&2 <<-EOF
307 | 当前脚本仅支持 32 位 和 64 位系统
308 | 你的系统为: $architecture
309 | EOF
310 | exit 1
311 | ;;
312 | esac
313 | }
314 |
315 | # 获取 API 内容
316 | get_content() {
317 | local url="$1"
318 | local retry=0
319 |
320 | local content=""
321 | get_network_content() {
322 | if [ $retry -ge 3 ]; then
323 | cat >&2 <<-EOF
324 | 获取网络信息失败!
325 | URL: ${url}
326 | 安装脚本需要能访问到 github.com,请检查服务器网络。
327 | 注意: 一些国内服务器可能无法正常访问 github.com。
328 | EOF
329 | exit 1
330 | fi
331 |
332 | # 将所有的换行符替换为自定义标签,防止 jq 解析失败
333 | content="$(wget -qO- --no-check-certificate "$url" | sed -r 's/(\\r)?\\n/#br#/g')"
334 |
335 | if [ "$?" != "0" ] || [ -z "$content" ]; then
336 | retry=$(expr $retry + 1)
337 | get_network_content
338 | fi
339 | }
340 |
341 | get_network_content
342 | echo "$content"
343 | }
344 |
345 | # 下载文件, 默认重试 3 次
346 | download_file() {
347 | local url="$1"
348 | local file="$2"
349 | local verify="$3"
350 | local retry=0
351 | local verify_cmd=""
352 |
353 | verify_file() {
354 | if [ -z "$verify_cmd" ] && [ -n "$verify" ]; then
355 | if [ "${#verify}" = "32" ]; then
356 | verify_cmd="md5sum"
357 | elif [ "${#verify}" = "40" ]; then
358 | verify_cmd="sha1sum"
359 | elif [ "${#verify}" = "64" ]; then
360 | verify_cmd="sha256sum"
361 | elif [ "${#verify}" = "128" ]; then
362 | verify_cmd="sha512sum"
363 | fi
364 |
365 | if [ -n "$verify_cmd" ] && ! command_exists "$verify_cmd"; then
366 | verify_cmd=""
367 | fi
368 | fi
369 |
370 | if [ -s "$file" ] && [ -n "$verify_cmd" ]; then
371 | (
372 | set -x
373 | echo "${verify} ${file}" | $verify_cmd -c
374 | )
375 | return $?
376 | fi
377 |
378 | return 1
379 | }
380 |
381 | download_file_to_path() {
382 | if verify_file; then
383 | return 0
384 | fi
385 |
386 | if [ $retry -ge 3 ]; then
387 | rm -f "$file"
388 | cat >&2 <<-EOF
389 | 文件下载或校验失败! 请重试。
390 | URL: ${url}
391 | EOF
392 |
393 | if [ -n "$verify_cmd" ]; then
394 | cat >&2 <<-EOF
395 | 如果下载多次失败,你可以手动下载文件:
396 | 1. 下载文件 ${url}
397 | 2. 将文件重命名为 $(basename "$file")
398 | 3. 上传文件至目录 $(dirname "$file")
399 | 4. 重新运行安装脚本
400 |
401 | 注: 文件目录 . 表示当前目录,.. 表示当前目录的上级目录
402 | EOF
403 | fi
404 | exit 1
405 | fi
406 |
407 | ( set -x; wget -O "$file" --no-check-certificate "$url" )
408 | if [ "$?" != "0" ] || [ -n "$verify_cmd" ] && ! verify_file; then
409 | retry=$(expr $retry + 1)
410 | download_file_to_path
411 | fi
412 | }
413 |
414 | download_file_to_path
415 | }
416 |
417 | # 安装 jq 用于解析和生成 json 文件
418 | # jq 已进入大部分 Linux 发行版的软件仓库,
419 | # URL: https://stedolan.github.io/jq/download/
420 | # 但为了防止有些系统安装失败,还是通过脚本来提供了。
421 | install_jq() {
422 | check_jq() {
423 | if [ ! -f "$JQ_BIN" ]; then
424 | return 1
425 | fi
426 |
427 | [ ! -x "$JQ_BIN" ] && chmod a+x "$JQ_BIN"
428 |
429 | if ( $JQ_BIN --help 2>/dev/null | grep -q "JSON" ); then
430 | is_checked_jq="true"
431 | return 0
432 | else
433 | rm -f "$JQ_BIN"
434 | return 1
435 | fi
436 | }
437 |
438 | if [ -z "$is_checked_jq" ] && ! check_jq; then
439 | local dir=""
440 | dir="$(dirname "$JQ_BIN")"
441 | if [ ! -d "$dir" ]; then
442 | (
443 | set -x
444 | mkdir -p "$dir"
445 | )
446 | fi
447 |
448 | if [ -z "$architecture" ]; then
449 | get_arch
450 | fi
451 |
452 | case "$architecture" in
453 | amd64|x86_64)
454 | download_file "$JQ_LINUX64_URL" "$JQ_BIN" "$JQ_LINUX64_HASH"
455 | ;;
456 | i386|i486|i586|i686|x86)
457 | download_file "$JQ_LINUX32_URL" "$JQ_BIN" "$JQ_LINUX32_HASH"
458 | ;;
459 | esac
460 |
461 | if ! check_jq; then
462 | cat >&2 <<-EOF
463 | 未找到适用于当前系统的 JSON 解析软件 jq
464 | EOF
465 | exit 1
466 | fi
467 |
468 | return 0
469 | fi
470 | }
471 |
472 | # 读取 json 文件中某一项的值
473 | get_json_string() {
474 | install_jq
475 |
476 | local content="$1"
477 | local selector="$2"
478 | local regex="$3"
479 |
480 | local str=""
481 | if [ -n "$content" ]; then
482 | str="$(echo "$content" | $JQ_BIN -r "$selector" 2>/dev/null)"
483 |
484 | if [ -n "$str" ] && [ -n "$regex" ]; then
485 | str="$(echo "$str" | grep -oE "$regex")"
486 | fi
487 | fi
488 | echo "$str"
489 | }
490 |
491 | # 获取当前实例的配置文件路径,传入参数:
492 | # * config: kcptun 服务端配置文件
493 | # * log: kcptun 日志文件路径
494 | # * snmp: kcptun snmp 日志文件路径
495 | # * supervisor: 实例的 supervisor 文件路径
496 | get_current_file() {
497 | case "$1" in
498 | config)
499 | printf '%s/server-config%s.json' "$KCPTUN_INSTALL_DIR" "$current_instance_id"
500 | ;;
501 | log)
502 | printf '%s/server%s.log' "$KCPTUN_LOG_DIR" "$current_instance_id"
503 | ;;
504 | snmp)
505 | printf '%s/snmplog%s.log' "$KCPTUN_LOG_DIR" "$current_instance_id"
506 | ;;
507 | supervisor)
508 | printf '/etc/supervisor/conf.d/kcptun%s.conf' "$current_instance_id"
509 | ;;
510 | esac
511 | }
512 |
513 | # 获取实例数量
514 | get_instance_count() {
515 | if [ -d '/etc/supervisor/conf.d/' ]; then
516 | ls -l '/etc/supervisor/conf.d/' | grep "^-" | awk '{print $9}' | grep -cP "^kcptun\d*\.conf$"
517 | else
518 | echo "0"
519 | fi
520 | }
521 |
522 | # 通过 API 获取对应版本号 Kcptun 的 release 信息
523 | # 传入 Kcptun 版本号
524 | get_kcptun_version_info() {
525 | local request_version="$1"
526 |
527 | local version_content=""
528 | if [ -n "$request_version" ]; then
529 | local json_content=""
530 | json_content="$(get_content "$KCPTUN_RELEASES_URL")"
531 | local version_selector=".[] | select(.tag_name == \"${request_version}\")"
532 | version_content="$(get_json_string "$json_content" "$version_selector")"
533 | else
534 | version_content="$(get_content "$KCPTUN_LATEST_RELEASE_URL")"
535 | fi
536 |
537 | if [ -z "$version_content" ]; then
538 | return 1
539 | fi
540 |
541 | if [ -z "$spruce_type" ]; then
542 | get_arch
543 | fi
544 |
545 | local url_selector=".assets[] | select(.name | contains(\"${spruce_type}\")) | .browser_download_url"
546 | kcptun_release_download_url="$(get_json_string "$version_content" "$url_selector")"
547 |
548 | if [ -z "$kcptun_release_download_url" ]; then
549 | return 1
550 | fi
551 |
552 | kcptun_release_tag_name="$(get_json_string "$version_content" '.tag_name')"
553 | kcptun_release_name="$(get_json_string "$version_content" '.name')"
554 | kcptun_release_prerelease="$(get_json_string "$version_content" '.prerelease')"
555 | kcptun_release_publish_time="$(get_json_string "$version_content" '.published_at')"
556 | kcptun_release_html_url="$(get_json_string "$version_content" '.html_url')"
557 |
558 | local body_content="$(get_json_string "$version_content" '.body')"
559 | local body="$(echo "$body_content" | sed 's/#br#/\n/g' | grep -vE '(^```)|(^>)|(^[[:space:]]*$)|(SUM$)')"
560 |
561 | kcptun_release_body="$(echo "$body" | grep -vE "[0-9a-zA-Z]{32,}")"
562 |
563 | local file_verify=""
564 | file_verify="$(echo "$body" | grep "$spruce_type")"
565 |
566 | if [ -n "$file_verify" ]; then
567 | local i="1"
568 | local split=""
569 | while true
570 | do
571 | split="$(echo "$file_verify" | cut -d ' ' -f$i)"
572 |
573 | if [ -n "$split" ] && ( echo "$split" | grep -qE "^[0-9a-zA-Z]{32,}$" ); then
574 | kcptun_release_verify="$split"
575 | break
576 | elif [ -z "$split" ]; then
577 | break
578 | fi
579 |
580 | i=$(expr $i + 1)
581 | done
582 | fi
583 |
584 | return 0
585 | }
586 |
587 | # 获取脚本版本信息
588 | get_shell_version_info() {
589 | local shell_version_content=""
590 | shell_version_content="$(get_content "$SHELL_VERSION_INFO_URL")"
591 | if [ -z "$shell_version_content" ]; then
592 | return 1
593 | fi
594 |
595 | new_shell_version="$(get_json_string "$shell_version_content" '.shell_version' '[0-9]+')"
596 | new_config_version="$(get_json_string "$shell_version_content" '.config_version' '[0-9]+')"
597 | new_init_version="$(get_json_string "$shell_version_content" '.init_version' '[0-9]+')"
598 |
599 | shell_change_log="$(get_json_string "$shell_version_content" '.change_log')"
600 | config_change_log="$(get_json_string "$shell_version_content" '.config_change_log')"
601 | init_change_log="$(get_json_string "$shell_version_content" '.init_change_log')"
602 | new_shell_url="$(get_json_string "$shell_version_content" '.shell_url')"
603 |
604 |
605 | if [ -z "$new_shell_version" ]; then
606 | new_shell_version="0"
607 | fi
608 | if [ -z "$new_config_version" ]; then
609 | new_config_version="0"
610 | fi
611 | if [ -z "$new_init_version" ]; then
612 | new_init_version="0"
613 | fi
614 |
615 | return 0
616 | }
617 |
618 | # 下载并安装 Kcptun
619 | install_kcptun() {
620 | if [ -z "$kcptun_release_download_url" ]; then
621 | get_kcptun_version_info "$1"
622 |
623 | if [ "$?" != "0" ]; then
624 | cat >&2 <<-'EOF'
625 | 获取 Kcptun 版本信息或下载地址失败!
626 | 可能是 GitHub 改版,或者从网络获取到的内容不正确。
627 | 请联系脚本作者。
628 | EOF
629 | exit 1
630 | fi
631 | fi
632 |
633 | local kcptun_file_name="kcptun-${kcptun_release_tag_name}.tar.gz"
634 | download_file "$kcptun_release_download_url" "$kcptun_file_name" "$kcptun_release_verify"
635 |
636 | if [ ! -d "$KCPTUN_INSTALL_DIR" ]; then
637 | (
638 | set -x
639 | mkdir -p "$KCPTUN_INSTALL_DIR"
640 | )
641 | fi
642 |
643 | if [ ! -d "$KCPTUN_LOG_DIR" ]; then
644 | (
645 | set -x
646 | mkdir -p "$KCPTUN_LOG_DIR"
647 | chmod a+w "$KCPTUN_LOG_DIR"
648 | )
649 | fi
650 |
651 | (
652 | set -x
653 | tar -zxf "$kcptun_file_name" -C "$KCPTUN_INSTALL_DIR"
654 | sleep 3
655 | )
656 |
657 | local kcptun_server_file=""
658 | kcptun_server_file="$(get_kcptun_server_file)"
659 |
660 | if [ ! -f "$kcptun_server_file" ]; then
661 | cat >&2 <<-'EOF'
662 | 未在解压文件中找到 Kcptun 服务端执行文件!
663 | 通常这不会发生,可能的原因是 Kcptun 作者打包文件的时候更改了文件名。
664 | 你可以尝试重新安装,或者联系脚本作者。
665 | EOF
666 | exit 1
667 | fi
668 |
669 | chmod a+x "$kcptun_server_file"
670 |
671 | if [ -z "$(get_installed_version)" ]; then
672 | cat >&2 <<-'EOF'
673 | 无法找到适合当前服务器的 kcptun 可执行文件
674 | 你可以尝试从源码编译。
675 | EOF
676 | exit 1
677 | fi
678 |
679 | rm -f "$kcptun_file_name" "${KCPTUN_INSTALL_DIR}/client_$file_suffix"
680 | }
681 |
682 | # 安装依赖软件
683 | install_deps() {
684 | if [ -z "$lsb_dist" ]; then
685 | get_os_info
686 | fi
687 |
688 | case "$lsb_dist" in
689 | ubuntu|debian|raspbian)
690 | local did_apt_get_update=""
691 | apt_get_update() {
692 | if [ -z "$did_apt_get_update" ]; then
693 | ( set -x; sleep 3; apt-get update )
694 | did_apt_get_update=1
695 | fi
696 | }
697 |
698 | if ! command_exists wget; then
699 | apt_get_update
700 | ( set -x; sleep 3; apt-get install -y -q wget ca-certificates )
701 | fi
702 |
703 | if ! command_exists awk; then
704 | apt_get_update
705 | ( set -x; sleep 3; apt-get install -y -q gawk )
706 | fi
707 |
708 | if ! command_exists tar; then
709 | apt_get_update
710 | ( set -x; sleep 3; apt-get install -y -q tar )
711 | fi
712 |
713 | if ! command_exists pip; then
714 | apt_get_update
715 | ( set -x; sleep 3; apt-get install -y -q python-pip || true )
716 | fi
717 |
718 | if ! command_exists python; then
719 | apt_get_update
720 | ( set -x; sleep 3; apt-get install -y -q python )
721 | fi
722 | ;;
723 | fedora|centos|redhat|oraclelinux|photon)
724 | if [ "$lsb_dist" = "fedora" ] && [ "$dist_version" -ge "22" ]; then
725 | if ! command_exists wget; then
726 | ( set -x; sleep 3; dnf -y -q install wget ca-certificates )
727 | fi
728 |
729 | if ! command_exists awk; then
730 | ( set -x; sleep 3; dnf -y -q install gawk )
731 | fi
732 |
733 | if ! command_exists tar; then
734 | ( set -x; sleep 3; dnf -y -q install tar )
735 | fi
736 |
737 | if ! command_exists pip; then
738 | ( set -x; sleep 3; dnf -y -q install python-pip || true )
739 | fi
740 |
741 | if ! command_exists python; then
742 | ( set -x; sleep 3; dnf -y -q install python )
743 | fi
744 | elif [ "$lsb_dist" = "photon" ]; then
745 | if ! command_exists wget; then
746 | ( set -x; sleep 3; tdnf -y install wget ca-certificates )
747 | fi
748 |
749 | if ! command_exists awk; then
750 | ( set -x; sleep 3; tdnf -y install gawk )
751 | fi
752 |
753 | if ! command_exists tar; then
754 | ( set -x; sleep 3; tdnf -y install tar )
755 | fi
756 |
757 | if ! command_exists pip; then
758 | ( set -x; sleep 3; tdnf -y install python-pip || true )
759 | fi
760 |
761 | if ! command_exists python; then
762 | ( set -x; sleep 3; tdnf -y install python )
763 | fi
764 | else
765 | if ! command_exists wget; then
766 | ( set -x; sleep 3; yum -y -q install wget ca-certificates )
767 | fi
768 |
769 | if ! command_exists awk; then
770 | ( set -x; sleep 3; yum -y -q install gawk )
771 | fi
772 |
773 | if ! command_exists tar; then
774 | ( set -x; sleep 3; yum -y -q install tar )
775 | fi
776 |
777 | # CentOS 等红帽系操作系统的软件库中可能不包括 python-pip
778 | # 可以先安装 epel-release
779 | if ! command_exists pip; then
780 | ( set -x; sleep 3; yum -y -q install python-pip || true )
781 | fi
782 |
783 | # 如果 python-pip 安装失败,检测是否已安装 python 环境
784 | if ! command_exists python; then
785 | ( set -x; sleep 3; yum -y -q install python )
786 | fi
787 | fi
788 | ;;
789 | *)
790 | cat >&2 <<-EOF
791 | 暂时不支持当前系统:${lsb_dist} ${dist_version}
792 | EOF
793 |
794 | exit 1
795 | ;;
796 | esac
797 |
798 | # 这里判断了是否存在安装失败的软件包,但是默认不处理 python-pip 的安装失败,
799 | # 接下来会统一检测并再次安装 pip 命令
800 | if [ "$?" != 0 ]; then
801 | cat >&2 <<-'EOF'
802 | 一些依赖软件安装失败,
803 | 请查看日志检查错误。
804 | EOF
805 | exit 1
806 | fi
807 |
808 | install_jq
809 | }
810 |
811 | # 安装 supervisor
812 | install_supervisor() {
813 | if [ -s /etc/supervisord.conf ] && command_exists supervisord; then
814 | cat >&2 <<-EOF
815 | 检测到你曾经通过其他方式安装过 Supervisor , 这会和本脚本安装的 Supervisor 产生冲突
816 | 推荐你备份当前 Supervisor 配置后卸载原有版本
817 | 已安装的 Supervisor 配置文件路径为: /etc/supervisord.conf
818 | 通过本脚本安装的 Supervisor 配置文件路径为: /etc/supervisor/supervisord.conf
819 | 你可以使用以下命令来备份原有配置文件:
820 |
821 | mv /etc/supervisord.conf /etc/supervisord.conf.bak
822 | EOF
823 |
824 | exit 1
825 | fi
826 |
827 | if ! command_exists python; then
828 | cat >&2 <<-'EOF'
829 | python 环境未安装,并且自动安装失败,请手动安装 python 环境。
830 | EOF
831 |
832 | exit 1
833 | fi
834 |
835 | local python_version="$(python -V 2>&1)"
836 |
837 | if [ "$?" != "0" ] || [ -z "$python_version" ]; then
838 | cat >&2 <<-'EOF'
839 | python 环境已损坏,无法通过 python -V 来获取版本号。
840 | 请手动重装 python 环境。
841 | EOF
842 |
843 | exit 1
844 | fi
845 |
846 | local version_string="$(echo "$python_version" | cut -d' ' -f2 | head -n1)"
847 | local major_version="$(echo "$version_string" | cut -d'.' -f1)"
848 | local minor_version="$(echo "$version_string" | cut -d'.' -f2)"
849 |
850 | if [ -z "$major_version" ] || [ -z "$minor_version" ] || \
851 | ! ( is_number "$major_version" ); then
852 | cat >&2 <<-EOF
853 | 获取 python 大小版本号失败:${python_version}
854 | EOF
855 |
856 | exit 1
857 | fi
858 |
859 | local is_python_26="false"
860 |
861 | if [ "$major_version" -lt "2" ] || ( \
862 | [ "$major_version" = "2" ] && [ "$minor_version" -lt "6" ] ); then
863 | cat >&2 <<-EOF
864 | 不支持的 python 版本 ${version_string},当前仅支持 python 2.6 及以上版本的安装。
865 | EOF
866 |
867 | exit 1
868 | elif [ "$major_version" = "2" ] && [ "$minor_version" = "6" ]; then
869 | is_python_26="true"
870 |
871 | cat >&1 <<-EOF
872 | 注意:当前服务器的 python 版本为 ${version_string},
873 | 脚本对 python 2.6 及以下版本的支持可能会失效,
874 | 请尽快升级 python 版本到 >= 2.7.9 或 >= 3.4。
875 | EOF
876 |
877 | any_key_to_continue
878 | fi
879 |
880 | if ! command_exists pip; then
881 | # 如果没有监测到 pip 命令,但当前服务器已经安装 python
882 | # 使用 get-pip.py 脚本来安装 pip 命令
883 | if [ "$is_python_26" = "true" ]; then
884 | (
885 | set -x
886 | wget -qO- --no-check-certificate https://bootstrap.pypa.io/2.6/get-pip.py | python
887 | )
888 | else
889 | (
890 | set -x
891 | wget -qO- --no-check-certificate https://bootstrap.pypa.io/get-pip.py | python
892 | )
893 | fi
894 | fi
895 |
896 | # 如果使用脚本安装依然失败,提示手动安装
897 | if ! command_exists pip; then
898 | cat >&2 <<-EOF
899 | 未找到已安装的 pip 命令,请先手动安装 python-pip
900 | 本脚本自 v21 版开始使用 pip 来安装 Supervisior。
901 |
902 | 1. 对于 Debian 系的 Linux 系统,可以尝试使用:
903 | sudo apt-get install -y python-pip 来进行安装
904 |
905 | 2. 对于 Redhat 系的 Linux 系统,可以尝试使用:
906 | sudo yum install -y python-pip 来进行安装
907 | * 如果提示未找到,可以先尝试安装:epel-release 扩展软件库
908 |
909 | 3. 如果以上方法都失败了,请使用以下命令来手动安装:
910 | wget -qO- --no-check-certificate https://bootstrap.pypa.io/get-pip.py | python
911 | * python 2.6 的用户请使用:
912 | wget -qO- --no-check-certificate https://bootstrap.pypa.io/2.6/get-pip.py | python
913 |
914 | 4. pip 安装完毕之后,先运行一下更新命令:
915 | pip install --upgrade pip
916 |
917 | 再检查一下 pip 的版本:
918 | pip -V
919 |
920 | 一切无误后,请重新运行安装脚本。
921 | EOF
922 | exit 1
923 | fi
924 |
925 | if ! ( pip --version >/dev/null 2>&1 ); then
926 | cat >&2 <<-EOF
927 | 检测到当前环境的 pip 命令已损坏,
928 | 请检查你的 python 环境。
929 | EOF
930 |
931 | exit 1
932 | fi
933 |
934 | if [ "$is_python_26" != "true" ]; then
935 | # 已安装 pip 时先尝试更新一下,
936 | # 如果是 python 2.6,就不要更新了,更新会导致 pip 损坏
937 | # pip 只支持 python 2 >= 2.7.9
938 | # https://pip.pypa.io/en/stable/installing/
939 | (
940 | set -x
941 | pip install --upgrade pip || true
942 | )
943 | fi
944 |
945 | if [ "$is_python_26" = "true" ]; then
946 | (
947 | set -x
948 | pip install 'supervisor>=3.0.0,<4.0.0'
949 | )
950 | else
951 | (
952 | set -x
953 | pip install --upgrade supervisor
954 | )
955 | fi
956 |
957 | if [ "$?" != "0" ]; then
958 | cat >&2 <<-EOF
959 | 错误: 安装 Supervisor 失败,
960 | 请尝试使用
961 | pip install supervisor
962 | 来手动安装。
963 | Supervisor 从 4.0 开始已不支持 python 2.6 及以下版本
964 | python 2.6 的用户请使用:
965 | pip install 'supervisor>=3.0.0,<4.0.0'
966 | EOF
967 |
968 | exit 1
969 | fi
970 |
971 | [ ! -d /etc/supervisor/conf.d ] && (
972 | set -x
973 | mkdir -p /etc/supervisor/conf.d
974 | )
975 |
976 | if [ ! -f '/usr/local/bin/supervisord' ]; then
977 | (
978 | set -x
979 | ln -s "$(command -v supervisord)" '/usr/local/bin/supervisord' 2>/dev/null
980 | )
981 | fi
982 |
983 | if [ ! -f '/usr/local/bin/supervisorctl' ]; then
984 | (
985 | set -x
986 | ln -s "$(command -v supervisorctl)" '/usr/local/bin/supervisorctl' 2>/dev/null
987 | )
988 | fi
989 |
990 | if [ ! -f '/usr/local/bin/pidproxy' ]; then
991 | (
992 | set -x
993 | ln -s "$(command -v pidproxy)" '/usr/local/bin/pidproxy' 2>/dev/null
994 | )
995 | fi
996 |
997 | local cfg_file='/etc/supervisor/supervisord.conf'
998 |
999 | local rvt="0"
1000 |
1001 | if [ ! -s "$cfg_file" ]; then
1002 | if ! command_exists echo_supervisord_conf; then
1003 | cat >&2 <<-'EOF'
1004 | 未找到 echo_supervisord_conf, 无法自动创建 Supervisor 配置文件!
1005 | 可能是当前安装的 supervisor 版本过低。
1006 | EOF
1007 | exit 1
1008 | fi
1009 |
1010 | (
1011 | set -x
1012 | echo_supervisord_conf >"$cfg_file" 2>&1
1013 | )
1014 | rvt="$?"
1015 | fi
1016 |
1017 | local cfg_content="$(cat "$cfg_file")"
1018 |
1019 | # Error with supervisor config file
1020 | if ( echo "$cfg_content" | grep -q "Traceback (most recent call last)" ) ; then
1021 | rvt="1"
1022 |
1023 | if ( echo "$cfg_content" | grep -q "DistributionNotFound: meld3" ); then
1024 | # https://github.com/Supervisor/meld3/issues/23
1025 | (
1026 | set -x
1027 | local temp="$(mktemp -d)"
1028 | local pwd="$(pwd)"
1029 |
1030 | download_file 'https://pypi.python.org/packages/source/m/meld3/meld3-1.0.2.tar.gz' \
1031 | "$temp/meld3.tar.gz"
1032 |
1033 | cd "$temp"
1034 | tar -zxf "$temp/meld3.tar.gz" --strip=1
1035 | python setup.py install
1036 | cd "$pwd"
1037 | )
1038 |
1039 | if [ "$?" = "0" ] ; then
1040 | (
1041 | set -x
1042 | echo_supervisord_conf >"$cfg_file" 2>/dev/null
1043 | )
1044 | rvt="$?"
1045 | fi
1046 | fi
1047 | fi
1048 |
1049 | if [ "$rvt" != "0" ]; then
1050 | rm -f "$cfg_file"
1051 | echo "创建 Supervisor 配置文件失败!"
1052 | exit 1
1053 | fi
1054 |
1055 | if ! grep -q '^files[[:space:]]*=[[:space:]]*/etc/supervisor/conf.d/\*\.conf$' "$cfg_file"; then
1056 | if grep -q '^\[include\]$' "$cfg_file"; then
1057 | sed -i '/^\[include\]$/a files = \/etc\/supervisor\/conf.d\/\*\.conf' "$cfg_file"
1058 | else
1059 | sed -i '$a [include]\nfiles = /etc/supervisor/conf.d/*.conf' "$cfg_file"
1060 | fi
1061 | fi
1062 |
1063 | download_startup_file
1064 | }
1065 |
1066 | download_startup_file() {
1067 | local supervisor_startup_file=""
1068 | local supervisor_startup_file_url=""
1069 |
1070 | if command_exists systemctl; then
1071 | supervisor_startup_file="/etc/systemd/system/supervisord.service"
1072 | supervisor_startup_file_url="$SUPERVISOR_SYSTEMD_FILE_URL"
1073 |
1074 | download_file "$supervisor_startup_file_url" "$supervisor_startup_file"
1075 | (
1076 | set -x
1077 | # 删除旧版 service 文件
1078 |
1079 | local old_service_file="/lib/systemd/system/supervisord.service"
1080 | if [ -f "$old_service_file" ]; then
1081 | rm -f "$old_service_file"
1082 | fi
1083 | systemctl daemon-reload >/dev/null 2>&1
1084 | )
1085 | elif command_exists service; then
1086 | supervisor_startup_file='/etc/init.d/supervisord'
1087 |
1088 | if [ -z "$lsb_dist" ]; then
1089 | get_os_info
1090 | fi
1091 |
1092 | case "$lsb_dist" in
1093 | ubuntu|debian|raspbian)
1094 | supervisor_startup_file_url="$SUPERVISOR_SERVICE_FILE_DEBIAN_URL"
1095 | ;;
1096 | fedora|centos|redhat|oraclelinux|photon)
1097 | supervisor_startup_file_url="$SUPERVISOR_SERVICE_FILE_REDHAT_URL"
1098 | ;;
1099 | *)
1100 | echo "没有适合当前系统的服务启动脚本文件。"
1101 | exit 1
1102 | ;;
1103 | esac
1104 |
1105 | download_file "$supervisor_startup_file_url" "$supervisor_startup_file"
1106 | (
1107 | set -x
1108 | chmod a+x "$supervisor_startup_file"
1109 | )
1110 | else
1111 | cat >&2 <<-'EOF'
1112 | 当前服务器未安装 systemctl 或者 service 命令,无法配置服务。
1113 | 请先手动安装 systemd 或者 service 之后再运行脚本。
1114 | EOF
1115 |
1116 | exit 1
1117 | fi
1118 | }
1119 |
1120 | start_supervisor() {
1121 | ( set -x; sleep 3 )
1122 | if command_exists systemctl; then
1123 | if systemctl status supervisord.service >/dev/null 2>&1; then
1124 | systemctl restart supervisord.service
1125 | else
1126 | systemctl start supervisord.service
1127 | fi
1128 | elif command_exists service; then
1129 | if service supervisord status >/dev/null 2>&1; then
1130 | service supervisord restart
1131 | else
1132 | service supervisord start
1133 | fi
1134 | fi
1135 |
1136 | if [ "$?" != "0" ]; then
1137 | cat >&2 <<-'EOF'
1138 | 启动 Supervisor 失败, Kcptun 无法正常工作!
1139 | 请反馈给脚本作者。
1140 | EOF
1141 | exit 1
1142 | fi
1143 | }
1144 |
1145 | enable_supervisor() {
1146 | if command_exists systemctl; then
1147 | (
1148 | set -x
1149 | systemctl enable "supervisord.service"
1150 | )
1151 | elif command_exists service; then
1152 | if [ -z "$lsb_dist" ]; then
1153 | get_os_info
1154 | fi
1155 |
1156 | case "$lsb_dist" in
1157 | ubuntu|debian|raspbian)
1158 | (
1159 | set -x
1160 | update-rc.d -f supervisord defaults
1161 | )
1162 | ;;
1163 | fedora|centos|redhat|oraclelinux|photon)
1164 | (
1165 | set -x
1166 | chkconfig --add supervisord
1167 | chkconfig supervisord on
1168 | )
1169 | ;;
1170 | esac
1171 | fi
1172 | }
1173 |
1174 | set_kcptun_config() {
1175 | is_port() {
1176 | local port="$1"
1177 | is_number "$port" && \
1178 | [ $port -ge 1 ] && [ $port -le 65535 ]
1179 | }
1180 |
1181 | port_using() {
1182 | local port="$1"
1183 |
1184 | if command_exists netstat; then
1185 | ( netstat -ntul | grep -qE "[0-9:*]:${port}\s" )
1186 | elif command_exists ss; then
1187 | ( ss -ntul | grep -qE "[0-9:*]:${port}\s" )
1188 | else
1189 | return 0
1190 | fi
1191 |
1192 | return $?
1193 | }
1194 |
1195 | local input=""
1196 | local yn=""
1197 |
1198 | # 设置服务运行端口
1199 | [ -z "$listen_port" ] && listen_port="$D_LISTEN_PORT"
1200 | while true
1201 | do
1202 | cat >&1 <<-'EOF'
1203 | 请输入 Kcptun 服务端运行端口 [1~65535]
1204 | 这个端口就是 Kcptun 客户端连接的端口
1205 | 新版支持端口范围,可输入[30000-35000]来开启端口范围
1206 | EOF
1207 | read -p "(默认: ${listen_port}): " input
1208 |
1209 | if [ -n "$input" ]; then
1210 | if echo "$input" | grep -qE '^[0-9]+-[0-9]+$'; then
1211 | range_start=$(echo "$input" | cut -d'-' -f1)
1212 | range_end=$(echo "$input" | cut -d'-' -f2)
1213 |
1214 | if [ "$range_start" -ge 1 ] && [ "$range_start" -le 65535 ] && \
1215 | [ "$range_end" -ge 1 ] && [ "$range_end" -le 65535 ] && \
1216 | [ "$range_start" -le "$range_end" ]; then
1217 | if echo "$current_listen_port" | grep -qE '^[0-9]+-[0-9]+$'; then
1218 | current_range_start=$(echo "$current_listen_port" | cut -d'-' -f1)
1219 | current_range_end=$(echo "$current_listen_port" | cut -d'-' -f2)
1220 |
1221 | if [ "$range_start" -le "$current_range_end" ] && [ "$range_end" -ge "$current_range_start" ]; then
1222 | listen_port="$input"
1223 | else
1224 | echo "当前监听端口范围不在输入的范围内, 请重新输入!当前范围:${current_listen_port}"
1225 | continue
1226 | fi
1227 | else
1228 | listen_port="$input"
1229 | fi
1230 | else
1231 | echo "端口范围无效, 请输入类似 3000-5000 的有效端口范围!"
1232 | continue
1233 | fi
1234 | elif is_port "$input"; then
1235 | if echo "$current_listen_port" | grep -qE '^[0-9]+-[0-9]+$'; then
1236 | current_range_start=$(echo "$current_listen_port" | cut -d'-' -f1)
1237 | current_range_end=$(echo "$current_listen_port" | cut -d'-' -f2)
1238 |
1239 | if [ "$input" -ge "$current_range_start" ] && [ "$input" -le "$current_range_end" ]; then
1240 | listen_port="$input"
1241 | else
1242 | echo "输入的端口不在当前监听端口范围内, 请重新输入!当前范围:${current_listen_port}"
1243 | continue
1244 | fi
1245 | else
1246 | listen_port="$input"
1247 | fi
1248 | else
1249 | echo "输入有误, 请输入 1~65535 之间的数字或有效的端口范围!"
1250 | continue
1251 | fi
1252 | fi
1253 |
1254 | if port_using "$listen_port" && [ "$listen_port" != "$current_listen_port" ]; then
1255 | echo "端口已被占用, 请重新输入!"
1256 | continue
1257 | fi
1258 | break
1259 | done
1260 |
1261 | input=""
1262 | cat >&1 <<-EOF
1263 | ---------------------------
1264 | 端口 = ${listen_port}
1265 | ---------------------------
1266 | EOF
1267 |
1268 | [ -z "$target_addr" ] && target_addr="$D_TARGET_ADDR"
1269 | cat >&1 <<-'EOF'
1270 | 请输入需要加速的地址
1271 | 可以输入主机名称、IPv4 地址或者 IPv6 地址
1272 | EOF
1273 | read -p "(默认: ${target_addr}): " input
1274 | if [ -n "$input" ]; then
1275 | target_addr="$input"
1276 | fi
1277 |
1278 | input=""
1279 | cat >&1 <<-EOF
1280 | ---------------------------
1281 | 加速地址 = ${target_addr}
1282 | ---------------------------
1283 | EOF
1284 |
1285 | [ -z "$target_port" ] && target_port="$D_TARGET_PORT"
1286 | while true
1287 | do
1288 | cat >&1 <<-'EOF'
1289 | 请输入需要加速的端口 [1~65535]
1290 | EOF
1291 | read -p "(默认: ${target_port}): " input
1292 | if [ -n "$input" ]; then
1293 | if is_port "$input"; then
1294 | if [ "$input" = "$listen_port" ]; then
1295 | echo "加速端口不能和 Kcptun 端口一致!"
1296 | continue
1297 | fi
1298 |
1299 | target_port="$input"
1300 | else
1301 | echo "输入有误, 请输入 1~65535 之间的数字!"
1302 | continue
1303 | fi
1304 | fi
1305 |
1306 | if [ "$target_addr" = "127.0.0.1" ] && ! port_using "$target_port"; then
1307 | read -p "当前没有软件使用此端口, 确定加速此端口? [y/n]: " yn
1308 | if [ -n "$yn" ]; then
1309 | case "$(first_character "$yn")" in
1310 | y|Y)
1311 | ;;
1312 | *)
1313 | continue
1314 | ;;
1315 | esac
1316 | fi
1317 | fi
1318 |
1319 | break
1320 | done
1321 |
1322 | input=""
1323 | yn=""
1324 | cat >&1 <<-EOF
1325 | ---------------------------
1326 | 加速端口 = ${target_port}
1327 | ---------------------------
1328 | EOF
1329 |
1330 | [ -z "$key" ] && key="$D_KEY"
1331 | cat >&1 <<-'EOF'
1332 | 请设置 Kcptun 密码(key)
1333 | 该参数必须两端一致
1334 | EOF
1335 | read -p "(默认密码: ${key}): " input
1336 | [ -n "$input" ] && key="$input"
1337 |
1338 | input=""
1339 | cat >&1 <<-EOF
1340 | ---------------------------
1341 | 密码 = ${key}
1342 | ---------------------------
1343 | EOF
1344 |
1345 | [ -z "$crypt" ] && crypt="$D_CRYPT"
1346 | local crypt_list="aes aes-128 aes-192 salsa20 blowfish twofish cast5 3des tea xtea xor none"
1347 | local i=0
1348 | cat >&1 <<-'EOF'
1349 | 请选择加密方式(crypt)
1350 | 强加密对 CPU 要求较高,
1351 | 如果是在路由器上配置客户端,
1352 | 请尽量选择弱加密或者不加密。
1353 | 该参数必须两端一致
1354 | EOF
1355 | while true
1356 | do
1357 |
1358 | for c in $crypt_list; do
1359 | i=$(expr $i + 1)
1360 | echo "(${i}) ${c}"
1361 | done
1362 |
1363 | read -p "(默认: ${crypt}) 请选择 [1~$i]: " input
1364 | if [ -n "$input" ]; then
1365 | if is_number "$input" && [ $input -ge 1 ] && [ $input -le $i ]; then
1366 | crypt=$(echo "$crypt_list" | cut -d' ' -f ${input})
1367 | else
1368 | echo "请输入有效数字 1~$i!"
1369 | i=0
1370 | continue
1371 | fi
1372 | fi
1373 | break
1374 | done
1375 |
1376 | input=""
1377 | i=0
1378 | cat >&1 <<-EOF
1379 | -----------------------------
1380 | 加密方式 = ${crypt}
1381 | -----------------------------
1382 | EOF
1383 |
1384 | [ -z "$mode" ] && mode="$D_MODE"
1385 | local mode_list="normal fast fast2 fast3 manual"
1386 | i=0
1387 | cat >&1 <<-'EOF'
1388 | 请选择加速模式(mode)
1389 | 加速模式和发送窗口大小共同决定了流量的损耗大小
1390 | 如果加速模式选择“手动(manual)”,
1391 | 将进入手动档隐藏参数的设置。
1392 | EOF
1393 | while true
1394 | do
1395 |
1396 | for m in $mode_list; do
1397 | i=$(expr $i + 1)
1398 | echo "(${i}) ${m}"
1399 | done
1400 |
1401 | read -p "(默认: ${mode}) 请选择 [1~$i]: " input
1402 | if [ -n "$input" ]; then
1403 | if is_number "$input" && [ $input -ge 1 ] && [ $input -le $i ]; then
1404 | mode=$(echo "$mode_list" | cut -d ' ' -f ${input})
1405 | else
1406 | echo "请输入有效数字 1~$i!"
1407 | i=0
1408 | continue
1409 | fi
1410 | fi
1411 | break
1412 | done
1413 |
1414 | input=""
1415 | i=0
1416 | cat >&1 <<-EOF
1417 | ---------------------------
1418 | 加速模式 = ${mode}
1419 | ---------------------------
1420 | EOF
1421 |
1422 | if [ "$mode" = "manual" ]; then
1423 | set_manual_parameters
1424 | else
1425 | nodelay=""
1426 | interval=""
1427 | resend=""
1428 | nc=""
1429 | fi
1430 |
1431 | [ -z "$mtu" ] && mtu="$D_MTU"
1432 | while true
1433 | do
1434 | cat >&1 <<-'EOF'
1435 | 请设置 UDP 数据包的 MTU (最大传输单元)值
1436 | EOF
1437 | read -p "(默认: ${mtu}): " input
1438 | if [ -n "$input" ]; then
1439 | if ! is_number "$input" || [ $input -le 0 ]; then
1440 | echo "输入有误, 请输入大于0的数字!"
1441 | continue
1442 | fi
1443 |
1444 | mtu=$input
1445 | fi
1446 | break
1447 | done
1448 |
1449 | input=""
1450 | cat >&1 <<-EOF
1451 | ---------------------------
1452 | MTU = ${mtu}
1453 | ---------------------------
1454 | EOF
1455 |
1456 | [ -z "$sndwnd" ] && sndwnd="$D_SNDWND"
1457 | while true
1458 | do
1459 | cat >&1 <<-'EOF'
1460 | 请设置发送窗口大小(sndwnd)
1461 | 发送窗口过大会浪费过多流量
1462 | EOF
1463 | read -p "(数据包数量, 默认: ${sndwnd}): " input
1464 | if [ -n "$input" ]; then
1465 | if ! is_number "$input" || [ $input -le 0 ]; then
1466 | echo "输入有误, 请输入大于0的数字!"
1467 | continue
1468 | fi
1469 |
1470 | sndwnd=$input
1471 | fi
1472 | break
1473 | done
1474 |
1475 | input=""
1476 | cat >&1 <<-EOF
1477 | ---------------------------
1478 | sndwnd = ${sndwnd}
1479 | ---------------------------
1480 | EOF
1481 |
1482 | [ -z "$rcvwnd" ] && rcvwnd="$D_RCVWND"
1483 | while true
1484 | do
1485 | cat >&1 <<-'EOF'
1486 | 请设置接收窗口大小(rcvwnd)
1487 | EOF
1488 | read -p "(数据包数量, 默认: ${rcvwnd}): " input
1489 | if [ -n "$input" ]; then
1490 | if ! is_number "$input" || [ $input -le 0 ]; then
1491 | echo "输入有误, 请输入大于0的数字!"
1492 | continue
1493 | fi
1494 |
1495 | rcvwnd=$input
1496 | fi
1497 | break
1498 | done
1499 |
1500 | input=""
1501 | cat >&1 <<-EOF
1502 | ---------------------------
1503 | rcvwnd = ${rcvwnd}
1504 | ---------------------------
1505 | EOF
1506 |
1507 | [ -z "$datashard" ] && datashard="$D_DATASHARD"
1508 | while true
1509 | do
1510 | cat >&1 <<-'EOF'
1511 | 请设置前向纠错 datashard
1512 | 该参数必须两端一致
1513 | EOF
1514 | read -p "(默认: ${datashard}): " input
1515 | if [ -n "$input" ]; then
1516 | if ! is_number "$input" || [ $input -lt 0 ]; then
1517 | echo "输入有误, 请输入大于等于0的数字!"
1518 | continue
1519 | fi
1520 |
1521 | datashard=$input
1522 | fi
1523 | break
1524 | done
1525 |
1526 | input=""
1527 | cat >&1 <<-EOF
1528 | ---------------------------
1529 | datashard = ${datashard}
1530 | ---------------------------
1531 | EOF
1532 |
1533 | [ -z "$parityshard" ] && parityshard="$D_PARITYSHARD"
1534 | while true
1535 | do
1536 | cat >&1 <<-'EOF'
1537 | 请设置前向纠错 parityshard
1538 | 该参数必须两端一致
1539 | EOF
1540 | read -p "(默认: ${parityshard}): " input
1541 | if [ -n "$input" ]; then
1542 | if ! is_number "$input" || [ $input -lt 0 ]; then
1543 | echo "输入有误, 请输入大于等于0的数字!"
1544 | continue
1545 | fi
1546 |
1547 | parityshard=$input
1548 | fi
1549 | break
1550 | done
1551 |
1552 | input=""
1553 | cat >&1 <<-EOF
1554 | ---------------------------
1555 | parityshard = ${parityshard}
1556 | ---------------------------
1557 | EOF
1558 |
1559 | [ -z "$dscp" ] && dscp="$D_DSCP"
1560 | while true
1561 | do
1562 | cat >&1 <<-'EOF'
1563 | 请设置差分服务代码点(DSCP)
1564 | EOF
1565 | read -p "(默认: ${dscp}): " input
1566 | if [ -n "$input" ]; then
1567 | if ! is_number "$input" || [ $input -lt 0 ]; then
1568 | echo "输入有误, 请输入大于等于0的数字!"
1569 | continue
1570 | fi
1571 |
1572 | dscp=$input
1573 | fi
1574 | break
1575 | done
1576 |
1577 | input=""
1578 | cat >&1 <<-EOF
1579 | ---------------------------
1580 | DSCP = ${dscp}
1581 | ---------------------------
1582 | EOF
1583 |
1584 | [ -z "$nocomp" ] && nocomp="$D_NOCOMP"
1585 | while true
1586 | do
1587 | cat >&1 <<-'EOF'
1588 | 是否关闭数据压缩?
1589 | 对CPU性能有损耗
1590 | 如果是文本类数据,可设手动开启
1591 | 如果是数据套壳,则默认保持关闭直接
1592 | EOF
1593 | read -p "(默认: ${nocomp}) [y/n]: " yn
1594 | if [ -n "$yn" ]; then
1595 | case "$(first_character "$yn")" in
1596 | y|Y)
1597 | nocomp='true'
1598 | ;;
1599 | n|N)
1600 | nocomp='false'
1601 | ;;
1602 | *)
1603 | echo "输入有误,请重新输入!"
1604 | continue
1605 | ;;
1606 | esac
1607 | fi
1608 | break
1609 | done
1610 |
1611 | yn=""
1612 | cat >&1 <<-EOF
1613 | ---------------------------
1614 | nocomp = ${nocomp}
1615 | ---------------------------
1616 | EOF
1617 |
1618 | [ -z "$quiet" ] && quiet="$D_QUIET"
1619 | while true
1620 | do
1621 | cat >&1 <<-'EOF'
1622 | 是否屏蔽 open/close 日志输出?
1623 | EOF
1624 | read -p "(默认: ${quiet}) [y/n]: " yn
1625 | if [ -n "$yn" ]; then
1626 | case "$(first_character "$yn")" in
1627 | y|Y)
1628 | quiet='true'
1629 | ;;
1630 | n|N)
1631 | quiet='false'
1632 | ;;
1633 | *)
1634 | echo "输入有误,请重新输入!"
1635 | continue
1636 | ;;
1637 | esac
1638 | fi
1639 | break
1640 | done
1641 |
1642 | yn=""
1643 | cat >&1 <<-EOF
1644 | ---------------------------
1645 | quiet = ${quiet}
1646 | ---------------------------
1647 | EOF
1648 |
1649 | [ -z "$tcp" ] && tcp="$D_TCP"
1650 | while true
1651 | do
1652 | cat >&1 <<-'EOF'
1653 | 是否使用 TCP 传输
1654 | EOF
1655 | read -p "(默认: ${tcp}) [y/n]: " yn
1656 | if [ -n "$yn" ]; then
1657 | case "$(first_character "$yn")" in
1658 | y|Y)
1659 | tcp='true'
1660 | ;;
1661 | n|N)
1662 | tcp='false'
1663 | ;;
1664 | *)
1665 | echo "输入有误,请重新输入!"
1666 | continue
1667 | ;;
1668 | esac
1669 | fi
1670 | break
1671 | done
1672 |
1673 | if [ "$tcp" = "true" ]; then
1674 | run_user="root"
1675 | fi
1676 |
1677 | yn=""
1678 | cat >&1 <<-EOF
1679 | ---------------------------
1680 | tcp = ${tcp}
1681 | ---------------------------
1682 | EOF
1683 |
1684 | unset_snmp() {
1685 | snmplog=""
1686 | snmpperiod=""
1687 | cat >&1 <<-EOF
1688 | ---------------------------
1689 | 不记录 SNMP 日志
1690 | ---------------------------
1691 | EOF
1692 | }
1693 |
1694 | cat >&1 <<-EOF
1695 | 是否记录 SNMP 日志?
1696 | EOF
1697 | read -p "(默认: 否) [y/n]: " yn
1698 | if [ -n "$yn" ]; then
1699 | case "$(first_character "$yn")" in
1700 | y|Y)
1701 | set_snmp
1702 | ;;
1703 | n|N|*)
1704 | unset_snmp
1705 | ;;
1706 | esac
1707 | yn=""
1708 | else
1709 | unset_snmp
1710 | fi
1711 |
1712 | [ -z "$pprof" ] && pprof="$D_PPROF"
1713 | while true
1714 | do
1715 | cat >&1 <<-'EOF'
1716 | 是否开启 pprof 性能监控?
1717 | 地址: http://IP:6060/debug/pprof/
1718 | EOF
1719 | read -p "(默认: ${pprof}) [y/n]: " yn
1720 | if [ -n "$yn" ]; then
1721 | case "$(first_character "$yn")" in
1722 | y|Y)
1723 | pprof='true'
1724 | ;;
1725 | n|N)
1726 | pprof='false'
1727 | ;;
1728 | *)
1729 | echo "输入有误,请重新输入!"
1730 | continue
1731 | ;;
1732 | esac
1733 | fi
1734 | break
1735 | done
1736 |
1737 | yn=""
1738 | cat >&1 <<-EOF
1739 | ---------------------------
1740 | pprof = ${pprof}
1741 | ---------------------------
1742 | EOF
1743 |
1744 | unset_hidden_parameters() {
1745 | acknodelay=""
1746 | sockbuf=""
1747 | smuxbuf=""
1748 | keepalive=""
1749 | streambuf=""
1750 | smuxver=""
1751 | cat >&1 <<-EOF
1752 | ---------------------------
1753 | 不配置隐藏参数
1754 | ---------------------------
1755 | EOF
1756 | }
1757 |
1758 | cat >&1 <<-'EOF'
1759 | 基础参数设置完成,是否设置额外的隐藏参数?
1760 | 通常情况下保持默认即可,不用额外设置
1761 | EOF
1762 | read -p "(默认: 否) [y/n]: " yn
1763 | if [ -n "$yn" ]; then
1764 | case "$(first_character "$yn")" in
1765 | y|Y)
1766 | set_hidden_parameters
1767 | ;;
1768 | n|N|*)
1769 | unset_hidden_parameters
1770 | ;;
1771 | esac
1772 | else
1773 | unset_hidden_parameters
1774 | fi
1775 |
1776 | if echo "$input" | grep -qE '^[0-9]+-[0-9]+$'; then
1777 | range_start=$(echo "$input" | cut -d'-' -f1)
1778 | range_end=$(echo "$input" | cut -d'-' -f2)
1779 |
1780 | if [ "$range_start" -ge 1 ] && [ "$range_start" -le 65535 ] && \
1781 | [ "$range_end" -ge 1 ] && [ "$range_end" -le 65535 ] && \
1782 | [ "$range_start" -le "$range_end" ]; then
1783 | # 新增端口段检测逻辑
1784 | if [ "$range_start" -le 1024 ] || [ "$range_end" -le 1024 ]; then
1785 | run_user="root"
1786 | fi
1787 | fi
1788 | elif is_port "$input"; then
1789 | listen_port="$input"
1790 | # 端口检测逻辑
1791 | if [ "$listen_port" -le 1024 ]; then
1792 | run_user="root"
1793 | fi
1794 | fi
1795 |
1796 | echo "配置完成。"
1797 | any_key_to_continue
1798 | }
1799 |
1800 | set_snmp() {
1801 | snmplog="$(get_current_file 'snmp')"
1802 |
1803 | local input=""
1804 | [ -z "$snmpperiod" ] && snmpperiod="$D_SNMPPERIOD"
1805 | while true
1806 | do
1807 | cat >&1 <<-'EOF'
1808 | 请设置 SNMP 记录间隔时间 snmpperiod
1809 | EOF
1810 | read -p "(默认: ${snmpperiod}): " input
1811 | if [ -n "$input" ]; then
1812 | if ! is_number "$input" || [ $input -lt 0 ]; then
1813 | echo "输入有误, 请输入大于等于0的数字!"
1814 | continue
1815 | fi
1816 |
1817 | snmpperiod=$input
1818 | fi
1819 | break
1820 | done
1821 |
1822 | cat >&1 <<-EOF
1823 | ---------------------------
1824 | snmplog = ${snmplog}
1825 | snmpperiod = ${snmpperiod}
1826 | ---------------------------
1827 | EOF
1828 | }
1829 |
1830 | set_manual_parameters() {
1831 | echo "开始配置手动参数..."
1832 | local input=""
1833 | local yn=""
1834 |
1835 | [ -z "$nodelay" ] && nodelay="$D_NODELAY"
1836 | while true
1837 | do
1838 | cat >&1 <<-'EOF'
1839 | 是否启用 nodelay 模式?
1840 | (0) 不启用
1841 | (1) 启用
1842 | EOF
1843 | read -p "(默认: ${nodelay}) [0/1]: " input
1844 | if [ -n "$input" ]; then
1845 | case "$(first_character "$input")" in
1846 | 1)
1847 | nodelay=1
1848 | ;;
1849 | 0|*)
1850 | nodelay=0
1851 | ;;
1852 | *)
1853 | echo "输入有误,请重新输入!"
1854 | continue
1855 | ;;
1856 | esac
1857 | fi
1858 | break
1859 | done
1860 |
1861 | input=""
1862 | cat >&1 <<-EOF
1863 | ---------------------------
1864 | nodelay = ${nodelay}
1865 | ---------------------------
1866 | EOF
1867 |
1868 | [ -z "$interval" ] && interval="$D_INTERVAL"
1869 | while true
1870 | do
1871 | cat >&1 <<-'EOF'
1872 | 请设置协议内部工作的 interval
1873 | EOF
1874 | read -p "(单位: ms, 默认: ${interval}): " input
1875 | if [ -n "$input" ]; then
1876 | if ! is_number "$input" || [ $input -le 0 ]; then
1877 | echo "输入有误, 请输入大于0的数字!"
1878 | continue
1879 | fi
1880 |
1881 | interval=$input
1882 | fi
1883 | break
1884 | done
1885 |
1886 | input=""
1887 | cat >&1 <<-EOF
1888 | ---------------------------
1889 | interval = ${interval}
1890 | ---------------------------
1891 | EOF
1892 |
1893 | [ -z "$resend" ] && resend="$D_RESEND"
1894 | while true
1895 | do
1896 | cat >&1 <<-'EOF'
1897 | 是否启用快速重传模式(resend)?
1898 | (0) 不启用
1899 | (1) 启用
1900 | (2) 2次ACK跨越将会直接重传
1901 | EOF
1902 | read -p "(默认: ${resend}) 请选择 [0~2]: " input
1903 | if [ -n "$input" ]; then
1904 | case "$(first_character "$input")" in
1905 | 0)
1906 | resend=0
1907 | ;;
1908 | 1)
1909 | resend=1
1910 | ;;
1911 | 2)
1912 | resend=2
1913 | ;;
1914 | *)
1915 | echo "输入有误,请重新输入!"
1916 | continue
1917 | ;;
1918 | esac
1919 | fi
1920 | break
1921 | done
1922 |
1923 | input=""
1924 | cat >&1 <<-EOF
1925 | ---------------------------
1926 | resend = ${resend}
1927 | ---------------------------
1928 | EOF
1929 |
1930 | [ -z "$nc" ] && nc="$D_NC"
1931 | while true
1932 | do
1933 | cat >&1 <<-'EOF'
1934 | 是否关闭流控(nc)?
1935 | (0) 关闭
1936 | (1) 开启
1937 | EOF
1938 | read -p "(默认: ${nc}) [0/1]: " input
1939 | if [ -n "$input" ]; then
1940 | case "$(first_character "$input")" in
1941 | 0)
1942 | nc=0
1943 | ;;
1944 | 1)
1945 | nc=1
1946 | ;;
1947 | *)
1948 | echo "输入有误,请重新输入!"
1949 | continue
1950 | ;;
1951 | esac
1952 | fi
1953 | break
1954 | done
1955 | cat >&1 <<-EOF
1956 | ---------------------------
1957 | nc = ${nc}
1958 | ---------------------------
1959 | EOF
1960 | }
1961 |
1962 | set_hidden_parameters() {
1963 | echo "开始设置隐藏参数..."
1964 | local input=""
1965 | local yn=""
1966 |
1967 | [ -z "$acknodelay" ] && acknodelay="$D_ACKNODELAY"
1968 | while true
1969 | do
1970 | cat >&1 <<-'EOF'
1971 | 是否启用 acknodelay 模式?
1972 | EOF
1973 | read -p "(默认: ${acknodelay}) [y/n]: " yn
1974 | if [ -n "$yn" ]; then
1975 | case "$(first_character "$yn")" in
1976 | y|Y)
1977 | acknodelay="true"
1978 | ;;
1979 | n|N)
1980 | acknodelay="false"
1981 | ;;
1982 | *)
1983 | echo "输入有误,请重新输入!"
1984 | continue
1985 | ;;
1986 | esac
1987 | fi
1988 | break
1989 | done
1990 |
1991 | yn=""
1992 | cat >&1 <<-EOF
1993 | ---------------------------
1994 | acknodelay = ${acknodelay}
1995 | ---------------------------
1996 | EOF
1997 |
1998 | [ -z "$sockbuf" ] && sockbuf="$D_SOCKBUF"
1999 | while true
2000 | do
2001 | cat >&1 <<-'EOF'
2002 | 请设置 UDP 收发缓冲区大小(sockbuf)
2003 | EOF
2004 | read -p "(单位: MB, 默认: $(expr ${sockbuf} / 1024 / 1024)): " input
2005 | if [ -n "$input" ]; then
2006 | if ! is_number "$input" || [ $input -le 0 ]; then
2007 | echo "输入有误, 请输入大于0的数字!"
2008 | continue
2009 | fi
2010 |
2011 | sockbuf=$(expr $input \* 1024 \* 1024)
2012 | fi
2013 | break
2014 | done
2015 |
2016 | input=""
2017 | cat >&1 <<-EOF
2018 | ---------------------------
2019 | sockbuf = ${sockbuf}
2020 | ---------------------------
2021 | EOF
2022 |
2023 | [ -z "$smuxbuf" ] && smuxbuf="$D_SMUXBUF"
2024 | while true
2025 | do
2026 | cat >&1 <<-'EOF'
2027 | 请设置 de-mux 缓冲区大小(smuxbuf)
2028 | EOF
2029 | read -p "(单位: MB, 默认: $(expr ${smuxbuf} / 1024 / 1024)): " input
2030 | if [ -n "$input" ]; then
2031 | if ! is_number "$input" || [ $input -le 0 ]; then
2032 | echo "输入有误, 请输入大于0的数字!"
2033 | continue
2034 | fi
2035 |
2036 | smuxbuf=$(expr $input \* 1024 \* 1024)
2037 | fi
2038 | break
2039 | done
2040 |
2041 | input=""
2042 | cat >&1 <<-EOF
2043 | ---------------------------
2044 | smuxbuf = ${smuxbuf}
2045 | ---------------------------
2046 | EOF
2047 |
2048 | [ -z "$keepalive" ] && keepalive="$D_KEEPALIVE"
2049 | while true
2050 | do
2051 | cat >&1 <<-'EOF'
2052 | 请设置 Keepalive 的间隔时间
2053 | EOF
2054 | read -p "(单位: s, 默认值: ${keepalive}, 前值: 5): " input
2055 | if [ -n "$input" ]; then
2056 | if ! is_number "$input" || [ $input -le 0 ]; then
2057 | echo "输入有误, 请输入大于0的数字!"
2058 | continue
2059 | fi
2060 |
2061 | keepalive=$input
2062 | fi
2063 | break
2064 | done
2065 |
2066 | cat >&1 <<-EOF
2067 | ---------------------------
2068 | keepalive = ${keepalive}
2069 | ---------------------------
2070 | EOF
2071 |
2072 | [ -z "$smuxver" ] && smuxver="$D_SMUXVER"
2073 | while true
2074 | do
2075 | cat >&1 <<-'EOF'
2076 | 请设置 smux 的版本
2077 | EOF
2078 | read -p "(1,2, 默认值: ${smuxver}, 老版本默认1,新版本默认2): " input
2079 | if [ -n "$input" ]; then
2080 | if ! is_number "$input" || [ $input -le 0 ]; then
2081 | echo "输入有误, 请输入大于0的数字!"
2082 | continue
2083 | fi
2084 |
2085 | smuxver=$input
2086 | fi
2087 | break
2088 | done
2089 |
2090 | cat >&1 <<-EOF
2091 | ---------------------------
2092 | $smuxver = ${smuxver}
2093 | ---------------------------
2094 | EOF
2095 |
2096 | [ -z "$streambuf" ] && streambuf="$D_STREAMBUF"
2097 | while true
2098 | do
2099 | cat >&1 <<-'EOF'
2100 | 请设置 streambuf 大小,官方文档介绍本值不宜过大
2101 | EOF
2102 | read -p "(单位: MB, 默认: $(expr ${streambuf} / 1024 / 1024)): " input
2103 | if [ -n "$input" ]; then
2104 | if ! is_number "$input" || [ $input -le 0 ]; then
2105 | echo "输入有误, 请输入大于0的数字!"
2106 | continue
2107 | fi
2108 |
2109 | streambuf=$(expr $input \* 1024 \* 1024)
2110 | fi
2111 | break
2112 | done
2113 |
2114 | cat >&1 <<-EOF
2115 | ---------------------------
2116 | streambuf = ${streambuf}
2117 | ---------------------------
2118 | EOF
2119 | }
2120 |
2121 | # 生成 Kcptun 服务端配置文件
2122 | gen_kcptun_config() {
2123 | mk_file_dir() {
2124 | local dir=""
2125 | dir="$(dirname "$1")"
2126 | local mod=$2
2127 |
2128 | if [ ! -d "$dir" ]; then
2129 | (
2130 | set -x
2131 | mkdir -p "$dir"
2132 | )
2133 | fi
2134 |
2135 | if [ -n "$mod" ]; then
2136 | chmod $mod "$dir"
2137 | fi
2138 | }
2139 |
2140 | local config_file=""
2141 | config_file="$(get_current_file 'config')"
2142 | local supervisor_config_file=""
2143 | supervisor_config_file="$(get_current_file 'supervisor')"
2144 |
2145 | mk_file_dir "$config_file"
2146 | mk_file_dir "$supervisor_config_file"
2147 |
2148 | if [ -n "$snmplog" ]; then
2149 | mk_file_dir "$snmplog" '777'
2150 | fi
2151 |
2152 | if ( echo "$listen_addr" | grep -q ":" ); then
2153 | listen_addr="[${listen_addr}]"
2154 | fi
2155 |
2156 | if ( echo "$target_addr" | grep -q ":" ); then
2157 | target_addr="[${target_addr}]"
2158 | fi
2159 |
2160 | cat > "$config_file"<<-EOF
2161 | {
2162 | "listen": "${listen_addr}:${listen_port}",
2163 | "target": "${target_addr}:${target_port}",
2164 | "key": "${key}",
2165 | "crypt": "${crypt}",
2166 | "mode": "${mode}",
2167 | "mtu": ${mtu},
2168 | "sndwnd": ${sndwnd},
2169 | "rcvwnd": ${rcvwnd},
2170 | "datashard": ${datashard},
2171 | "parityshard": ${parityshard},
2172 | "dscp": ${dscp},
2173 | "nocomp": ${nocomp},
2174 | "quiet": ${quiet},
2175 | "tcp": ${tcp}
2176 | }
2177 | EOF
2178 |
2179 | write_configs_to_file() {
2180 | install_jq
2181 | local k; local v
2182 |
2183 | local json=""
2184 | json="$(cat "$config_file")"
2185 | for k in "$@"; do
2186 | v="$(eval echo "\$$k")"
2187 |
2188 | if [ -n "$v" ]; then
2189 | if is_number "$v" || [ "$v" = "false" ] || [ "$v" = "true" ]; then
2190 | json="$(echo "$json" | $JQ_BIN ".$k=$v")"
2191 | else
2192 | json="$(echo "$json" | $JQ_BIN ".$k=\"$v\"")"
2193 | fi
2194 | fi
2195 | done
2196 |
2197 | if [ -n "$json" ] && [ "$json" != "$(cat "$config_file")" ]; then
2198 | echo "$json" >"$config_file"
2199 | fi
2200 | }
2201 |
2202 | write_configs_to_file "snmplog" "snmpperiod" "pprof" "acknodelay" "nodelay" \
2203 | "interval" "resend" "nc" "sockbuf" "smuxbuf" "keepalive" "streambuf" "smuxver"
2204 |
2205 | if ! grep -q "^${run_user}:" '/etc/passwd'; then
2206 | (
2207 | set -x
2208 | useradd -U -s '/usr/sbin/nologin' -d '/nonexistent' "$run_user" 2>/dev/null
2209 | )
2210 | fi
2211 |
2212 | cat > "$supervisor_config_file"<<-EOF
2213 | [program:kcptun${current_instance_id}]
2214 | user=${run_user}
2215 | directory=${KCPTUN_INSTALL_DIR}
2216 | command=$(get_kcptun_server_file) -c "${config_file}"
2217 | process_name=%(program_name)s
2218 | autostart=true
2219 | redirect_stderr=true
2220 | stdout_logfile=$(get_current_file 'log')
2221 | stdout_logfile_maxbytes=1MB
2222 | stdout_logfile_backups=0
2223 | EOF
2224 | }
2225 |
2226 | # 设置防火墙开放端口
2227 | set_firewall() {
2228 | if command_exists firewall-cmd; then
2229 | if ! ( firewall-cmd --state >/dev/null 2>&1 ); then
2230 | systemctl start firewalld >/dev/null 2>&1
2231 | fi
2232 | if [ "$?" = "0" ]; then
2233 | if [ -n "$current_listen_port" ]; then
2234 | firewall-cmd --zone=public --remove-port=${current_listen_port}/udp >/dev/null 2>&1
2235 | fi
2236 |
2237 | if ! firewall-cmd --quiet --zone=public --query-port=${listen_port}/udp; then
2238 | firewall-cmd --quiet --permanent --zone=public --add-port=${listen_port}/udp
2239 | firewall-cmd --reload
2240 | fi
2241 | else
2242 | cat >&1 <<-EOF
2243 | 警告: 自动添加 firewalld 规则失败
2244 | 如果有必要, 请手动添加端口 ${listen_port} 的防火墙规则:
2245 | firewall-cmd --permanent --zone=public --add-port=${listen_port}/udp
2246 | firewall-cmd --reload
2247 | EOF
2248 | fi
2249 | elif command_exists iptables; then
2250 | if ! ( service iptables status >/dev/null 2>&1 ); then
2251 | service iptables start >/dev/null 2>&1
2252 | fi
2253 |
2254 | if [ "$?" = "0" ]; then
2255 | if [ -n "$current_listen_port" ]; then
2256 | iptables -D INPUT -p udp --dport ${current_listen_port} -j ACCEPT >/dev/null 2>&1
2257 | fi
2258 |
2259 | if ! iptables -C INPUT -p udp --dport ${listen_port} -j ACCEPT >/dev/null 2>&1; then
2260 | iptables -I INPUT -p udp --dport ${listen_port} -j ACCEPT >/dev/null 2>&1
2261 | service iptables save
2262 | service iptables restart
2263 | fi
2264 | else
2265 | cat >&1 <<-EOF
2266 | 警告: 自动添加 iptables 规则失败
2267 | 如有必要, 请手动添加端口 ${listen_port} 的防火墙规则:
2268 | iptables -I INPUT -p udp --dport ${listen_port} -j ACCEPT
2269 | service iptables save
2270 | service iptables restart
2271 | EOF
2272 | fi
2273 | fi
2274 | }
2275 |
2276 | # 选择一个实例
2277 | select_instance() {
2278 | if [ "$(get_instance_count)" -gt 1 ]; then
2279 | cat >&1 <<-'EOF'
2280 | 当前有多个 Kcptun 实例 (按最后修改时间排序):
2281 | EOF
2282 |
2283 | local files=""
2284 | files=$(ls -lt '/etc/supervisor/conf.d/' | grep "^-" | awk '{print $9}' | grep "^kcptun[0-9]*\.conf$")
2285 | local i=0
2286 | local array=""
2287 | local id=""
2288 | for file in $files; do
2289 | id="$(echo "$file" | grep -oE "[0-9]+")"
2290 | array="${array}${id}#"
2291 |
2292 | i=$(expr $i + 1)
2293 | echo "(${i}) ${file%.*}"
2294 | done
2295 |
2296 | local sel=""
2297 | while true
2298 | do
2299 | read -p "请选择 [1~${i}]: " sel
2300 | if [ -n "$sel" ]; then
2301 | if ! is_number "$sel" || [ $sel -lt 1 ] || [ $sel -gt $i ]; then
2302 | cat >&2 <<-EOF
2303 | 请输入有效数字 1~${i}!
2304 | EOF
2305 | continue
2306 | fi
2307 | else
2308 | cat >&2 <<-EOF
2309 | 请输入不能为空!
2310 | EOF
2311 | continue
2312 | fi
2313 |
2314 | current_instance_id=$(echo "$array" | cut -d '#' -f ${sel})
2315 | break
2316 | done
2317 | fi
2318 | }
2319 |
2320 | # 通过当前服务端环境获取 Kcptun 服务端文件名
2321 | get_kcptun_server_file() {
2322 | if [ -z "$file_suffix" ]; then
2323 | get_arch
2324 | fi
2325 |
2326 | echo "${KCPTUN_INSTALL_DIR}/server_$file_suffix"
2327 | }
2328 |
2329 | # 计算新实例的 ID
2330 | get_new_instance_id() {
2331 | if [ -f "/etc/supervisor/conf.d/kcptun.conf" ]; then
2332 | local i=2
2333 | while [ -f "/etc/supervisor/conf.d/kcptun${i}.conf" ]
2334 | do
2335 | i=$(expr $i + 1)
2336 | done
2337 | echo "$i"
2338 | fi
2339 | }
2340 |
2341 | # 获取已安装的 Kcptun 版本
2342 | get_installed_version() {
2343 | local server_file=""
2344 | server_file="$(get_kcptun_server_file)"
2345 |
2346 | if [ -f "$server_file" ]; then
2347 | if [ ! -x "$server_file" ]; then
2348 | chmod a+x "$server_file"
2349 | fi
2350 |
2351 | echo "$(${server_file} -v 2>/dev/null | awk '{print $3}')"
2352 | fi
2353 | }
2354 |
2355 | # 加载当前选择实例的配置文件
2356 | load_instance_config() {
2357 | local config_file=""
2358 | config_file="$(get_current_file 'config')"
2359 |
2360 | if [ ! -s "$config_file" ]; then
2361 | cat >&2 <<-'EOF'
2362 | 实例配置文件不存在或为空, 请检查!
2363 | EOF
2364 | exit 1
2365 | fi
2366 |
2367 | local config_content=""
2368 | config_content="$(cat ${config_file})"
2369 |
2370 | if [ -z "$(get_json_string "$config_content" '.listen')" ]; then
2371 | cat >&2 <<-EOF
2372 | 实例配置文件存在错误, 请检查!
2373 | 配置文件路径: ${config_file}
2374 | EOF
2375 | exit 1
2376 | fi
2377 |
2378 | local lines=""
2379 | lines="$(get_json_string "$config_content" 'to_entries | map("\(.key)=\(.value | @sh)") | .[]')"
2380 |
2381 | OLDIFS=$IFS
2382 | IFS=$(printf '\n')
2383 | for line in $lines; do
2384 | eval "$line"
2385 | done
2386 | IFS=$OLDIFS
2387 |
2388 | if [ -n "$listen" ]; then
2389 | listen_port="$(echo "$listen" | rev | cut -d ':' -f1 | rev)"
2390 | listen_addr="$(echo "$listen" | sed "s/:${listen_port}$//" | grep -oE '[0-9a-fA-F\.:]*')"
2391 | listen=""
2392 | fi
2393 | if [ -n "$target" ]; then
2394 | target_port="$(echo "$target" | rev | cut -d ':' -f1 | rev)"
2395 | target_addr="$(echo "$target" | sed "s/:${target_port}$//" | grep -oE '[0-9a-fA-F\.:]*')"
2396 | target=""
2397 | fi
2398 |
2399 | if [ -n "$listen_port" ]; then
2400 | current_listen_port="$listen_port"
2401 | fi
2402 | }
2403 |
2404 | # 显示服务端 Kcptun 版本,和客户端文件的下载地址
2405 | show_version_and_client_url() {
2406 | local version=""
2407 | version="$(get_installed_version)"
2408 | if [ -n "$version" ]; then
2409 | cat >&1 <<-EOF
2410 |
2411 | 当前安装的 Kcptun 版本为: ${version}
2412 | EOF
2413 | fi
2414 |
2415 | if [ -n "$kcptun_release_html_url" ]; then
2416 | cat >&1 <<-EOF
2417 | 请自行前往:
2418 | ${kcptun_release_html_url}
2419 | 手动下载客户端文件
2420 | EOF
2421 | fi
2422 | }
2423 |
2424 | # 显示当前选择实例的信息
2425 | show_current_instance_info() {
2426 | local server_ip=""
2427 | server_ip="$(get_server_ip)"
2428 |
2429 | printf '服务器IP: \033[41;37m %s \033[0m\n' "$server_ip"
2430 | printf '端口: \033[41;37m %s \033[0m\n' "$listen_port"
2431 | printf '加速地址: \033[41;37m %s:%s \033[0m\n' "$target_addr" "$target_port"
2432 |
2433 | show_configs() {
2434 | local k; local v
2435 | for k in "$@"; do
2436 | v="$(eval echo "\$$k")"
2437 | if [ -n "$v" ]; then
2438 | printf '%s: \033[41;37m %s \033[0m\n' "$k" "$v"
2439 | fi
2440 | done
2441 | }
2442 |
2443 | show_configs "key" "crypt" "mode" "mtu" "sndwnd" "rcvwnd" "datashard" \
2444 | "parityshard" "dscp" "nocomp" "quiet" "tcp" "nodelay" "interval" "resend" \
2445 | "nc" "acknodelay" "sockbuf" "smuxbuf" "keepalive" "streambuf" "smuxver"
2446 |
2447 | show_version_and_client_url
2448 |
2449 | install_jq
2450 | local client_config=""
2451 |
2452 | # 这里输出的是客户端所使用的配置信息
2453 | # 客户端的 *remoteaddr* 端口号为服务端的 *listen_port*
2454 | # 客户端的 *localaddr* 端口号被设置为了服务端的加速端口
2455 | client_config="$(cat <<-EOF
2456 | {
2457 | "localaddr": ":${target_port}",
2458 | "remoteaddr": "${server_ip}:${listen_port}",
2459 | "key": "${key}"
2460 | }
2461 | EOF
2462 | )"
2463 |
2464 | gen_client_configs() {
2465 | local k; local v
2466 | for k in "$@"; do
2467 | if [ "$k" = "sndwnd" ]; then
2468 | v="$rcvwnd"
2469 | elif [ "$k" = "rcvwnd" ]; then
2470 | v="$sndwnd"
2471 | else
2472 | v="$(eval echo "\$$k")"
2473 | fi
2474 |
2475 | if [ -n "$v" ]; then
2476 | if is_number "$v" || [ "$v" = "true" ] || [ "$v" = "false" ]; then
2477 | client_config="$(echo "$client_config" | $JQ_BIN -r ".${k}=${v}")"
2478 | else
2479 | client_config="$(echo "$client_config" | $JQ_BIN -r ".${k}=\"${v}\"")"
2480 | fi
2481 | fi
2482 | done
2483 | }
2484 |
2485 | gen_client_configs "crypt" "mode" "mtu" "sndwnd" "rcvwnd" "datashard" \
2486 | "parityshard" "dscp" "nocomp" "quiet" "tcp" "nodelay" "interval" "resend" \
2487 | "nc" "acknodelay" "sockbuf" "smuxbuf" "keepalive" "streambuf" "smuxver"
2488 |
2489 | cat >&1 <<-EOF
2490 |
2491 | 可使用的客户端配置文件为:
2492 | ${client_config}
2493 | EOF
2494 |
2495 | local mobile_config="key=${key}"
2496 | gen_mobile_configs() {
2497 | local k; local v
2498 | for k in "$@"; do
2499 | if [ "$k" = "sndwnd" ]; then
2500 | v="$rcvwnd"
2501 | elif [ "$k" = "rcvwnd" ]; then
2502 | v="$sndwnd"
2503 | else
2504 | v="$(eval echo "\$$k")"
2505 | fi
2506 |
2507 | if [ -n "$v" ]; then
2508 | if [ "$v" = "false" ]; then
2509 | continue
2510 | elif [ "$v" = "true" ]; then
2511 | mobile_config="${mobile_config};${k}"
2512 | else
2513 | mobile_config="${mobile_config};${k}=${v}"
2514 | fi
2515 | fi
2516 | done
2517 | }
2518 |
2519 | gen_mobile_configs "crypt" "mode" "mtu" "sndwnd" "rcvwnd" "datashard" \
2520 | "parityshard" "dscp" "nocomp" "quiet" "tcp" "nodelay" "interval" "resend" \
2521 | "nc" "acknodelay" "sockbuf" "smuxbuf" "keepalive" "streambuf" "smuxver"
2522 |
2523 | cat >&1 <<-EOF
2524 |
2525 | 手机端参数可以使用:
2526 | ${mobile_config}
2527 |
2528 | EOF
2529 | }
2530 |
2531 | do_install() {
2532 | check_root
2533 | disable_selinux
2534 | installed_check
2535 | set_kcptun_config
2536 | install_deps
2537 | install_kcptun
2538 | install_supervisor
2539 | gen_kcptun_config
2540 | set_firewall
2541 | start_supervisor
2542 | enable_supervisor
2543 |
2544 | cat >&1 <<-EOF
2545 |
2546 | 恭喜! Kcptun 服务端安装成功。
2547 | EOF
2548 |
2549 | show_current_instance_info
2550 |
2551 | cat >&1 <<-EOF
2552 | Kcptun 安装目录: ${KCPTUN_INSTALL_DIR}
2553 |
2554 | 已将 Supervisor 加入开机自启,
2555 | Kcptun 服务端会随 Supervisor 的启动而启动
2556 |
2557 | 更多使用说明: ${0} help
2558 |
2559 | 如果这个脚本帮到了你,你可以请作者喝瓶可乐:
2560 | https://blog.kuoruan.com/donate
2561 |
2562 | 享受加速的快感吧!
2563 | EOF
2564 | }
2565 |
2566 | # 卸载操作
2567 | do_uninstall() {
2568 | check_root
2569 | cat >&1 <<-'EOF'
2570 | 你选择了卸载 Kcptun 服务端
2571 | EOF
2572 | any_key_to_continue
2573 | echo "正在卸载 Kcptun 服务端并停止 Supervisor..."
2574 |
2575 | if command_exists supervisorctl; then
2576 | supervisorctl shutdown
2577 | fi
2578 |
2579 | if command_exists systemctl; then
2580 | systemctl stop supervisord.service
2581 | elif command_exists serice; then
2582 | service supervisord stop
2583 | fi
2584 |
2585 | (
2586 | set -x
2587 | rm -f "/etc/supervisor/conf.d/kcptun*.conf"
2588 | rm -rf "$KCPTUN_INSTALL_DIR"
2589 | rm -rf "$KCPTUN_LOG_DIR"
2590 | )
2591 |
2592 | cat >&1 <<-'EOF'
2593 | 是否同时卸载 Supervisor ?
2594 | 注意: Supervisor 的配置文件将同时被删除
2595 | EOF
2596 |
2597 | read -p "(默认: 不卸载) 请选择 [y/n]: " yn
2598 | if [ -n "$yn" ]; then
2599 | case "$(first_character "$yn")" in
2600 | y|Y)
2601 | if command_exists systemctl; then
2602 | systemctl disable supervisord.service
2603 | rm -f "/lib/systemd/system/supervisord.service" \
2604 | "/etc/systemd/system/supervisord.service"
2605 | elif command_exists service; then
2606 | if [ -z "$lsb_dist" ]; then
2607 | get_os_info
2608 | fi
2609 | case "$lsb_dist" in
2610 | ubuntu|debian|raspbian)
2611 | (
2612 | set -x
2613 | update-rc.d -f supervisord remove
2614 | )
2615 | ;;
2616 | fedora|centos|redhat|oraclelinux|photon)
2617 | (
2618 | set -x
2619 | chkconfig supervisord off
2620 | chkconfig --del supervisord
2621 | )
2622 | ;;
2623 | esac
2624 | rm -f '/etc/init.d/supervisord'
2625 | fi
2626 |
2627 | (
2628 | set -x
2629 | # 新版使用 pip 卸载
2630 | if command_exists pip; then
2631 | pip uninstall -y supervisor 2>/dev/null || true
2632 | fi
2633 |
2634 | # 旧版使用 easy_install 卸载
2635 | if command_exists easy_install; then
2636 | rm -rf "$(easy_install -mxN supervisor | grep 'Using.*supervisor.*\.egg' | awk '{print $2}')"
2637 | fi
2638 |
2639 | rm -rf '/etc/supervisor/'
2640 | rm -f '/usr/local/bin/supervisord' \
2641 | '/usr/local/bin/supervisorctl' \
2642 | '/usr/local/bin/pidproxy' \
2643 | '/usr/local/bin/echo_supervisord_conf' \
2644 | '/usr/bin/supervisord' \
2645 | '/usr/bin/supervisorctl' \
2646 | '/usr/bin/pidproxy' \
2647 | '/usr/bin/echo_supervisord_conf'
2648 | )
2649 | ;;
2650 | n|N|*)
2651 | start_supervisor
2652 | ;;
2653 | esac
2654 | fi
2655 |
2656 | cat >&1 <<-EOF
2657 | 卸载完成, 欢迎再次使用。
2658 | 注意: 脚本没有自动卸载 python-pip 和 python-setuptools(旧版脚本使用)
2659 | 如有需要, 你可以自行卸载。
2660 | EOF
2661 | }
2662 |
2663 | # 更新
2664 | do_update() {
2665 | pre_ckeck
2666 |
2667 | cat >&1 <<-EOF
2668 | 你选择了检查更新, 正在开始操作...
2669 | EOF
2670 |
2671 | if get_shell_version_info; then
2672 | local shell_path=$0
2673 |
2674 | if [ $new_shell_version -gt $SHELL_VERSION ]; then
2675 | cat >&1 <<-EOF
2676 | 发现一键安装脚本更新, 版本号: ${new_shell_version}
2677 | 更新说明:
2678 | $(printf '%s\n' "$shell_change_log")
2679 | EOF
2680 | any_key_to_continue
2681 |
2682 | mv -f "$shell_path" "$shell_path".bak
2683 |
2684 | download_file "$new_shell_url" "$shell_path"
2685 | chmod a+x "$shell_path"
2686 |
2687 | sed -i -r "s/^CONFIG_VERSION=[0-9]+/CONFIG_VERSION=${CONFIG_VERSION}/" "$shell_path"
2688 | sed -i -r "s/^INIT_VERSION=[0-9]+/INIT_VERSION=${INIT_VERSION}/" "$shell_path"
2689 | rm -f "$shell_path".bak
2690 |
2691 | clear
2692 | cat >&1 <<-EOF
2693 | 安装脚本已更新到 v${new_shell_version}, 正在运行新的脚本...
2694 | EOF
2695 |
2696 | bash "$shell_path" update
2697 | exit 0
2698 | fi
2699 |
2700 | if [ $new_config_version -gt $CONFIG_VERSION ]; then
2701 | cat >&1 <<-EOF
2702 | 发现 Kcptun 配置更新, 版本号: v${new_config_version}
2703 | 更新说明:
2704 | $(printf '%s\n' "$config_change_log")
2705 | 需要重新设置 Kcptun
2706 | EOF
2707 | any_key_to_continue
2708 |
2709 | instance_reconfig
2710 |
2711 | sed -i "s/^CONFIG_VERSION=${CONFIG_VERSION}/CONFIG_VERSION=${new_config_version}/" \
2712 | "$shell_path"
2713 | fi
2714 |
2715 | if [ $new_init_version -gt $INIT_VERSION ]; then
2716 | cat >&1 <<-EOF
2717 | 发现服务启动脚本文件更新, 版本号: v${new_init_version}
2718 | 更新说明:
2719 | $(printf '%s\n' "$init_change_log")
2720 | EOF
2721 |
2722 | any_key_to_continue
2723 |
2724 | download_startup_file
2725 | set -sed -i "s/^INIT_VERSION=${INIT_VERSION}/INIT_VERSION=${new_init_version}/" \
2726 | "$shell_path"
2727 | fi
2728 | fi
2729 |
2730 | echo "开始获取 Kcptun 版本信息..."
2731 | get_kcptun_version_info
2732 |
2733 | local cur_tag_name=""
2734 | cur_tag_name="$(get_installed_version)"
2735 |
2736 | if [ -n "$cur_tag_name" ] && is_number "$cur_tag_name" && [ ${#cur_tag_name} -eq 8 ]; then
2737 | cur_tag_name=v"$cur_tag_name"
2738 | fi
2739 |
2740 | if [ -n "$kcptun_release_tag_name" ] && [ "$kcptun_release_tag_name" != "$cur_tag_name" ]; then
2741 | cat >&1 <<-EOF
2742 | 发现 Kcptun 新版本 ${kcptun_release_tag_name}
2743 | $([ "$kcptun_release_prerelease" = "true" ] && printf "\033[41;37m 注意: 该版本为预览版, 请谨慎更新 \033[0m")
2744 | 更新说明:
2745 | $(printf '%s\n' "$kcptun_release_body")
2746 | EOF
2747 | any_key_to_continue
2748 |
2749 | install_kcptun
2750 | start_supervisor
2751 |
2752 | show_version_and_client_url
2753 | else
2754 | cat >&1 <<-'EOF'
2755 | 未发现 Kcptun 更新...
2756 | EOF
2757 | fi
2758 | }
2759 |
2760 | # 添加实例
2761 | instance_add() {
2762 | pre_ckeck
2763 |
2764 | cat >&1 <<-'EOF'
2765 | 你选择了添加实例, 正在开始操作...
2766 | EOF
2767 | current_instance_id="$(get_new_instance_id)"
2768 |
2769 | set_kcptun_config
2770 | gen_kcptun_config
2771 | set_firewall
2772 | start_supervisor
2773 |
2774 | cat >&1 <<-EOF
2775 | 恭喜, 实例 kcptun${current_instance_id} 添加成功!
2776 | EOF
2777 | show_current_instance_info
2778 | }
2779 |
2780 | # 删除实例
2781 | instance_del() {
2782 | pre_ckeck
2783 |
2784 | if [ -n "$1" ]; then
2785 | if is_number "$1"; then
2786 | if [ "$1" != "1" ]; then
2787 | current_instance_id="$1"
2788 | fi
2789 | else
2790 | cat >&2 <<-EOF
2791 | 参数有误, 请使用 $0 del
2792 | 为实例ID, 当前共有 $(get_instance_count) 个实例
2793 | EOF
2794 |
2795 | exit 1
2796 | fi
2797 | fi
2798 |
2799 | cat >&1 <<-EOF
2800 | 你选择了删除实例 kcptun${current_instance_id}
2801 | 注意: 实例删除后无法恢复
2802 | EOF
2803 | any_key_to_continue
2804 |
2805 | # 获取实例的 supervisor 配置文件
2806 | supervisor_config_file="$(get_current_file 'supervisor')"
2807 | if [ ! -f "$supervisor_config_file" ]; then
2808 | echo "你选择的实例 kcptun${current_instance_id} 不存在!"
2809 | exit 1
2810 | fi
2811 |
2812 | current_config_file="$(get_current_file 'config')"
2813 | current_log_file="$(get_current_file 'log')"
2814 | current_snmp_log_file="$(get_current_file 'snmp')"
2815 |
2816 | (
2817 | set -x
2818 | rm -f "$supervisor_config_file" \
2819 | "$current_config_file" \
2820 | "$current_log_file" \
2821 | "$current_snmp_log_file"
2822 | )
2823 |
2824 | start_supervisor
2825 |
2826 | cat >&1 <<-EOF
2827 | 实例 kcptun${current_instance_id} 删除成功!
2828 | EOF
2829 | }
2830 |
2831 | # 显示实例信息
2832 | instance_show() {
2833 | pre_ckeck
2834 |
2835 | if [ -n "$1" ]; then
2836 | if is_number "$1"; then
2837 | if [ "$1" != "1" ]; then
2838 | current_instance_id="$1"
2839 | fi
2840 | else
2841 | cat >&2 <<-EOF
2842 | 参数有误, 请使用 $0 show
2843 | 为实例ID, 当前共有 $(get_instance_count) 个实例
2844 | EOF
2845 |
2846 | exit 1
2847 | fi
2848 | fi
2849 |
2850 | echo "你选择了查看实例 kcptun${current_instance_id} 的配置, 正在读取..."
2851 |
2852 | load_instance_config
2853 |
2854 | echo "实例 kcptun${current_instance_id} 的配置信息如下:"
2855 | show_current_instance_info
2856 | }
2857 |
2858 | # 显示实例日志
2859 | instance_log() {
2860 | pre_ckeck
2861 |
2862 | if [ -n "$1" ]; then
2863 | if is_number "$1"; then
2864 | if [ "$1" != "1" ]; then
2865 | current_instance_id="$1"
2866 | fi
2867 | else
2868 | cat >&2 <<-EOF
2869 |
2870 | 参数有误, 请使用 $0 log
2871 | 为实例ID, 当前共有 $(get_instance_count) 个实例
2872 | EOF
2873 |
2874 | exit 1
2875 | fi
2876 | fi
2877 |
2878 | echo "你选择了查看实例 kcptun${current_instance_id} 的日志, 正在读取..."
2879 |
2880 | local log_file=""
2881 | log_file="$(get_current_file 'log')"
2882 |
2883 | if [ -f "$log_file" ]; then
2884 | cat >&1 <<-EOF
2885 | 实例 kcptun${current_instance_id} 的日志信息如下:
2886 | 注: 日志实时刷新, 按 Ctrl+C 退出日志查看
2887 | EOF
2888 | tail -n 20 -f "$log_file"
2889 | else
2890 | cat >&2 <<-EOF
2891 | 未找到实例 kcptun${current_instance_id} 的日志文件...
2892 | EOF
2893 | exit 1
2894 | fi
2895 | }
2896 |
2897 | # 重新配置实例
2898 | instance_reconfig() {
2899 | pre_ckeck
2900 |
2901 | if [ -n "$1" ]; then
2902 | if is_number "$1"; then
2903 | if [ "$1" != "1" ]; then
2904 | current_instance_id="$1"
2905 | fi
2906 | else
2907 | cat >&2 <<-EOF
2908 | 参数有误, 请使用 $0 reconfig
2909 | 为实例ID, 当前共有 $(get_instance_count) 个实例
2910 | EOF
2911 |
2912 | exit 1
2913 | fi
2914 | fi
2915 |
2916 | cat >&1 <<-EOF
2917 | 你选择了重新配置实例 kcptun${current_instance_id}, 正在开始操作...
2918 | EOF
2919 |
2920 | if [ ! -f "$(get_current_file 'supervisor')" ]; then
2921 | cat >&2 <<-EOF
2922 | 你选择的实例 kcptun${current_instance_id} 不存在!
2923 | EOF
2924 | exit 1
2925 | fi
2926 |
2927 | local sel=""
2928 | cat >&1 <<-'EOF'
2929 | 请选择操作:
2930 | (1) 重新配置实例所有选项
2931 | (2) 直接修改实例配置文件
2932 | EOF
2933 | read -p "(默认: 1) 请选择: " sel
2934 | echo
2935 | [ -z "$sel" ] && sel="1"
2936 |
2937 | case "$(first_character "$sel")" in
2938 | 2)
2939 | echo "正在打开配置文件, 请手动修改..."
2940 | local config_file=""
2941 | config_file="$(get_current_file 'config')"
2942 | edit_config_file() {
2943 | if [ ! -f "$config_file" ]; then
2944 | return 1
2945 | fi
2946 |
2947 | if command_exists vim; then
2948 | vim "$config_file"
2949 | elif command_exists vi; then
2950 | vi "$config_file"
2951 | elif command_exists gedit; then
2952 | gedit "$config_file"
2953 | else
2954 | echo "未找到可用的编辑器, 正在进入全新配置..."
2955 | return 1
2956 | fi
2957 |
2958 | load_instance_config
2959 | }
2960 |
2961 | if ! edit_config_file; then
2962 | set_kcptun_config
2963 | fi
2964 | ;;
2965 | 1|*)
2966 | load_instance_config
2967 | set_kcptun_config
2968 | ;;
2969 | esac
2970 |
2971 | gen_kcptun_config
2972 | set_firewall
2973 |
2974 | if command_exists supervisorctl; then
2975 | supervisorctl restart "kcptun${current_instance_id}"
2976 |
2977 | if [ "$?" != "0" ]; then
2978 | cat >&2 <<-'EOF'
2979 | 重启 Supervisor 失败, Kcptun 无法正常工作!
2980 | 请查看日志获取原因,或者反馈给脚本作者。
2981 | EOF
2982 | exit 1
2983 | fi
2984 | else
2985 | start_supervisor
2986 | fi
2987 |
2988 | cat >&1 <<-EOF
2989 |
2990 | 恭喜, Kcptun 服务端配置已更新!
2991 | EOF
2992 | show_current_instance_info
2993 | }
2994 |
2995 | #手动安装
2996 | manual_install() {
2997 | pre_ckeck
2998 |
2999 | cat >&1 <<-'EOF'
3000 | 你选择了自定义版本安装, 正在开始操作...
3001 | EOF
3002 |
3003 | local tag_name="$1"
3004 |
3005 | while true
3006 | do
3007 | if [ -z "$tag_name" ]; then
3008 | cat >&1 <<-'EOF'
3009 | 请输入你想安装的 Kcptun 版本的完整 TAG
3010 | EOF
3011 | read -p "(例如: v20160904): " tag_name
3012 | if [ -z "$tag_name" ]; then
3013 | echo "输入无效, 请重新输入!"
3014 | continue
3015 | fi
3016 | fi
3017 |
3018 | if [ "$tag_name" = "SNMP_Milestone" ]; then
3019 | echo "不支持此版本, 请重新输入!"
3020 | tag_name=""
3021 | continue
3022 | fi
3023 |
3024 | local version_num=""
3025 | version_num=$(echo "$tag_name" | grep -oE "[0-9]+" || "0")
3026 | if [ ${#version_num} -eq 8 ] && [ $version_num -le 20160826 ]; then
3027 | echo "不支持安装 v20160826 及以前版本"
3028 | tag_name=""
3029 | continue
3030 | fi
3031 |
3032 | echo "正在获取信息,请稍候..."
3033 | get_kcptun_version_info "$tag_name"
3034 | if [ "$?" != "0" ]; then
3035 | cat >&2 <<-EOF
3036 | 未找到对应版本下载地址 (TAG: ${tag_name}), 请重新输入!
3037 | 你可以前往:
3038 | ${KCPTUN_TAGS_URL}
3039 | 查看所有可用 TAG
3040 | EOF
3041 | tag_name=""
3042 | continue
3043 | else
3044 | cat >&1 <<-EOF
3045 | 已找到 Kcptun 版本信息, TAG: ${tag_name}
3046 | EOF
3047 | any_key_to_continue
3048 |
3049 | install_kcptun "$tag_name"
3050 | start_supervisor
3051 | show_version_and_client_url
3052 | break
3053 | fi
3054 | done
3055 | }
3056 |
3057 | pre_ckeck() {
3058 | check_root
3059 |
3060 | if ! is_installed; then
3061 | cat >&2 <<-EOF
3062 | 错误: 检测到你还没有安装 Kcptun,
3063 | 或者 Kcptun 程序文件已损坏,
3064 | 请运行脚本来重新安装 Kcptun 服务端。
3065 | EOF
3066 |
3067 | exit 1
3068 | fi
3069 | }
3070 |
3071 | # 监测是否安装了 kcptun
3072 | is_installed() {
3073 | if [ -d '/usr/share/kcptun' ]; then
3074 | cat >&1 <<-EOF
3075 | 检测发现你由旧版升级到了新版
3076 | 新版中将默认安装目录设置为了 ${KCPTUN_INSTALL_DIR}
3077 | 脚本会自动将文件从旧版目录 /usr/share/kcptun
3078 | 移动到新版目录 ${KCPTUN_INSTALL_DIR}
3079 | EOF
3080 | any_key_to_continue
3081 | (
3082 | set -x
3083 | cp -rf '/usr/share/kcptun' "$KCPTUN_INSTALL_DIR" && \
3084 | rm -rf '/usr/share/kcptun'
3085 | )
3086 | fi
3087 |
3088 | if [ -d '/etc/supervisor/conf.d/' ] && [ -d "$KCPTUN_INSTALL_DIR" ] && \
3089 | [ -n "$(get_installed_version)" ]; then
3090 | return 0
3091 | fi
3092 |
3093 | return 1
3094 | }
3095 |
3096 | # 检查是否已经安装
3097 | installed_check() {
3098 | local instance_count=""
3099 | instance_count="$(get_instance_count)"
3100 | if is_installed && [ $instance_count -gt 0 ]; then
3101 | cat >&1 <<-EOF
3102 | 检测到你已安装 Kcptun 服务端, 已配置的实例个数为 ${instance_count} 个
3103 | EOF
3104 | while true
3105 | do
3106 | cat >&1 <<-'EOF'
3107 | 请选择你希望的操作:
3108 | (1) 覆盖安装
3109 | (2) 重新配置
3110 | (3) 添加实例(多端口)
3111 | (4) 检查更新
3112 | (5) 查看配置
3113 | (6) 查看日志输出
3114 | (7) 自定义版本安装
3115 | (8) 删除实例
3116 | (9) 完全卸载
3117 | (10) 退出脚本
3118 | EOF
3119 | read -p "(默认: 1) 请选择 [1~10]: " sel
3120 | [ -z "$sel" ] && sel=1
3121 |
3122 | case $sel in
3123 | 1)
3124 | echo "开始覆盖安装 Kcptun 服务端..."
3125 | load_instance_config
3126 | return 0
3127 | ;;
3128 | 2)
3129 | select_instance
3130 | instance_reconfig
3131 | ;;
3132 | 3)
3133 | instance_add
3134 | ;;
3135 | 4)
3136 | do_update
3137 | ;;
3138 | 5)
3139 | select_instance
3140 | instance_show
3141 | ;;
3142 | 6)
3143 | select_instance
3144 | instance_log
3145 | ;;
3146 | 7)
3147 | manual_install
3148 | ;;
3149 | 8)
3150 | select_instance
3151 | instance_del
3152 | ;;
3153 | 9)
3154 | do_uninstall
3155 | ;;
3156 | 10)
3157 | ;;
3158 | *)
3159 | echo "输入有误, 请输入有效数字 1~10!"
3160 | continue
3161 | ;;
3162 | esac
3163 |
3164 | exit 0
3165 | done
3166 | fi
3167 | }
3168 |
3169 | action=${1:-"install"}
3170 | case "$action" in
3171 | install|uninstall|update)
3172 | do_${action}
3173 | ;;
3174 | add|reconfig|show|log|del)
3175 | instance_${action} "$2"
3176 | ;;
3177 | manual)
3178 | manual_install "$2"
3179 | ;;
3180 | help)
3181 | usage 0
3182 | ;;
3183 | *)
3184 | usage 1
3185 | ;;
3186 | esac
3187 |
--------------------------------------------------------------------------------
/kcptun/startup/supervisord.init.debain:
--------------------------------------------------------------------------------
1 | #! /bin/sh
2 | #
3 | ### BEGIN INIT INFO
4 | # Provides: supervisor
5 | # Required-Start: $remote_fs $network $named
6 | # Required-Stop: $remote_fs $network $named
7 | # Default-Start: 2 3 4 5
8 | # Default-Stop: 0 1 6
9 | # Short-Description: Start/stop supervisor
10 | # Description: Start/stop supervisor daemon and its configured
11 | # subprocesses.
12 | ### END INIT INFO
13 |
14 | . /lib/lsb/init-functions
15 |
16 | PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
17 |
18 | PREFIX=/usr/local/bin
19 | SUPERVISORD=$PREFIX/supervisord
20 | SUPERVISORCTL=$PREFIX/supervisorctl
21 | NAME=supervisord
22 | PIDFILE=/var/run/supervisord.pid
23 | OPTIONS="-c /etc/supervisor/supervisord.conf"
24 | STOP_TIMEOUT=10
25 | RETVAL=0
26 |
27 | SCRIPT_OK=0
28 | SCRIPT_ERROR=1
29 |
30 | test -x $SUPERVISORD || exit 1
31 |
32 | is_running() {
33 | # Check if the process is running looking at /proc
34 | # (works for all users)
35 |
36 | # No pidfile, probably no daemon present
37 | [ ! -f "$PIDFILE" ] && return 1
38 | # Obtain the pid and check it against the binary name
39 | pid=`cat $PIDFILE`
40 | (ps aux | grep -v grep | grep $SUPERVISORD | grep -q $pid) || return 1
41 | return 0
42 | }
43 |
44 | do_start() {
45 | log_daemon_msg "Starting $NAME: "
46 |
47 | if is_running; then
48 | log_end_msg $SCRIPT_ERROR
49 | echo "$NAME is already running."
50 | RETVAL=0
51 | else
52 | start-stop-daemon --start --quiet --pidfile $PIDFILE \
53 | --startas $SUPERVISORD -- $OPTIONS -j $PIDFILE
54 | [ -f $PIDFILE ] || sleep 1
55 | if is_running; then
56 | log_end_msg $SCRIPT_OK
57 | $SUPERVISORCTL $OPTIONS status
58 | RETVAL=0
59 | else
60 | log_end_msg $SCRIPT_ERROR
61 | RETVAL=1
62 | fi
63 | fi
64 | }
65 |
66 | do_stop() {
67 | log_daemon_msg "Stopping $NAME: "
68 | if is_running; then
69 | start-stop-daemon --stop --retry TERM/$STOP_TIMEOUT/KILL/5 --quiet --oknodo --pidfile $PIDFILE
70 | log_end_msg $SCRIPT_OK
71 | RETVAL=0
72 | else
73 | log_end_msg $SCRIPT_ERROR
74 | echo "$NAME is not running."
75 | RETVAL=0
76 | fi
77 | }
78 |
79 | chk_status() {
80 | echo -n "$NAME is "
81 | if is_running; then
82 | echo "running."
83 | $SUPERVISORCTL $OPTIONS status
84 | RETVAL=0
85 | else
86 | echo "not running."
87 | RETVAL=0
88 | fi
89 | }
90 |
91 | case "$1" in
92 | start)
93 | do_start
94 | ;;
95 | stop)
96 | do_stop
97 | ;;
98 | restart)
99 | do_stop
100 | do_start
101 | ;;
102 | status)
103 | chk_status
104 | ;;
105 | *)
106 | echo "Usage: /etc/init.d/$NAME {start|stop|restart|status}"
107 | RETVAL=2
108 | ;;
109 | esac
110 |
111 | exit $RETVAL
112 |
--------------------------------------------------------------------------------
/kcptun/startup/supervisord.init.redhat:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 | #
3 | # chkconfig: 345 83 04
4 | # description: Supervisor is a client/server system that allows \
5 | # its users to monitor and control a number of processes on \
6 | # UNIX-like operating systems.
7 | # processname: supervisord
8 | # config: /etc/supervisor/supervisord.conf
9 | # pidfile: /var/run/supervisord.pid
10 | #
11 | ### BEGIN INIT INFO
12 | # Provides: supervisord
13 | # Required-Start: $all
14 | # Required-Stop: $all
15 | # Short-Description: start and stop Supervisor process control system
16 | # Description: Supervisor is a client/server system that allows
17 | # its users to monitor and control a number of processes on
18 | # UNIX-like operating systems.
19 | ### END INIT INFO
20 |
21 | # Source function library
22 | . /etc/rc.d/init.d/functions
23 |
24 | PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
25 |
26 | PREFIX=/usr/local/bin
27 | SUPERVISORD=$PREFIX/supervisord
28 | SUPERVISORCTL=$PREFIX/supervisorctl
29 | NAME=supervisord
30 | PIDFILE=/var/run/supervisord.pid
31 | OPTIONS="-c /etc/supervisor/supervisord.conf"
32 | STOP_TIMEOUT=10
33 | RETVAL=0
34 |
35 | test -x $SUPERVISORD || exit 1
36 |
37 | do_start() {
38 | if status -p $PIDFILE $SUPERVISORD >&/dev/null; then
39 | echo "$NAME is already running."
40 | RETVAL=0
41 | else
42 | echo -n $"Starting $NAME: "
43 | daemon --pidfile=$PIDFILE $SUPERVISORD $OPTIONS -j $PIDFILE
44 | RETVAL=$?
45 | echo
46 | [ $RETVAL -eq 0 ] && $SUPERVISORCTL $OPTIONS status
47 | fi
48 |
49 | }
50 |
51 | do_stop() {
52 | if status -p $PIDFILE $SUPERVISORD >&/dev/null; then
53 | echo -n $"Stopping $NAME: "
54 | killproc -p $PIDFILE -d $STOP_TIMEOUT $SUPERVISORD
55 | RETVAL=$?
56 | echo
57 | [ $RETVAL -eq 0 ] && rm -rf $PIDFILE
58 | else
59 | echo "$NAME is not running."
60 | RETVAL=0
61 | fi
62 | }
63 |
64 | chk_status() {
65 | status -p $PIDFILE $SUPERVISORD
66 | RETVAL=$?
67 | [ $RETVAL -eq 0 ] && $SUPERVISORCTL $OPTIONS status
68 | }
69 |
70 | case "$1" in
71 | start)
72 | do_start
73 | ;;
74 | stop)
75 | do_stop
76 | ;;
77 | status)
78 | chk_status
79 | ;;
80 | restart)
81 | do_stop
82 | do_start
83 | ;;
84 | *)
85 | echo $"Usage: /etc/init.d/$NAME {start|stop|restart|status}"
86 | RETVAL=2
87 | ;;
88 | esac
89 |
90 | exit $RETVAL
91 |
--------------------------------------------------------------------------------
/kcptun/startup/supervisord.systemd:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=Supervisor process control system for UNIX
3 | Documentation=http://supervisord.org
4 | After=network.target
5 |
6 | [Service]
7 | Type=forking
8 | ExecStart=/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf
9 | ExecStop=/usr/local/bin/supervisorctl $OPTIONS shutdown
10 | ExecReload=/usr/local/bin/supervisorctl $OPTIONS reload
11 | KillMode=process
12 | Restart=on-failure
13 | RestartSec=30s
14 |
15 | [Install]
16 | WantedBy=multi-user.target
17 |
--------------------------------------------------------------------------------
/kcptun/version.json:
--------------------------------------------------------------------------------
1 | {
2 | "shell_version": 26,
3 | "shell_url": "https://github.com/kuoruan/shell-scripts/raw/master/kcptun/kcptun.sh",
4 | "change_log": "1. smuxver 和 streambuf 支持;\n2. 添加端口范围支持",
5 | "config_version": 7,
6 | "config_change_log": "1. sockbuf 和 smuxbuf 默认值改为 16M;\n2. nocomp 默认改为 true",
7 | "init_version": 3,
8 | "init_change_log": "1.修复 CentOS 上找不到 Supervisor 执行文件的问题;\n2.由于 Supervisor 的版本不同, 执行文件的目录可能不一样, 如果你出现无法安装或启动失败的问题, 请及时联系我"
9 | }
10 |
--------------------------------------------------------------------------------
/ovz-bbr/bin/haproxy-lkl.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | : <<-'EOF'
4 | Copyright 2017 Xingwang Liao
5 | Licensed under the Apache License, Version 2.0 (the "License");
6 | you may not use this file except in compliance with the License.
7 | You may obtain a copy of the License at
8 | http://www.apache.org/licenses/LICENSE-2.0
9 | Unless required by applicable law or agreed to in writing, software
10 | distributed under the License is distributed on an "AS IS" BASIS,
11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | See the License for the specific language governing permissions and
13 | limitations under the License.
14 | EOF
15 |
16 | INTERFACE='venet0'
17 | HAPROXY_LKL_DIR='/usr/local/haproxy-lkl'
18 | LKL_TAP_NAME='lkl'
19 | LKL_IN_CHAIN_NAME='LKL_IN'
20 |
21 | HAPROXY_CFG_FILE="${HAPROXY_LKL_DIR}/etc/haproxy.cfg"
22 | PIDFILE=
23 | LOGFILE='/dev/null'
24 |
25 | RETVAL=0
26 |
27 | usage() {
28 | cat >&2 <<-EOF
29 | Usage: $(basename $0) [options]
30 |
31 | Valid options are:
32 |
33 | -p Writes pid to this file
34 | -l Writes log to this file
35 | -c Clear haproxy-lkl iptables rules
36 | -h Show this help message
37 | EOF
38 | exit $1
39 | }
40 |
41 | command_exists() {
42 | command -v "$@" >/dev/null 2>&1
43 | }
44 |
45 | make_file_dir() {
46 | local file="$1"
47 | local dir="$(dirname $file)"
48 | if [ ! -d "$dir" ]; then
49 | mkdir -p "$dir" 2>/dev/null
50 | fi
51 |
52 | touch "$file" 2>/dev/null
53 | }
54 |
55 | pre_check() {
56 | if [ -z "$INTERFACE" ]; then
57 | cat >&2 <<-EOF
58 | Error: Please set your network interface first.
59 | * Edit $0 and set INTERFACE at the top.
60 | EOF
61 | exit 1
62 | fi
63 |
64 | if [ -z "$HAPROXY_LKL_DIR" ]; then
65 | cat >&2 <<-EOF
66 | Error: Please set your haproxy lkl install dir first.
67 | * Edit $0 and set HAPROXY_LKL_DIR at the top.
68 | * Default is /usr/local/haproxy-lkl
69 | EOF
70 | exit 1
71 | fi
72 |
73 | notice_wrong_interface() {
74 | cat >&2 <<-EOF
75 | Error: You have set a wrong network interface.
76 | * Edit $0 and reset the INTERFACE at the top.
77 | EOF
78 | exit 1
79 | }
80 |
81 | if command_exists ip; then
82 | if ! ( ip -o link show | grep -q "$INTERFACE" ); then
83 | notice_wrong_interface
84 | fi
85 | elif command_exists ifconfig; then
86 | if ! ( ifconfig -s | grep -q "$INTERFACE" ); then
87 | notice_wrong_interface
88 | fi
89 | else
90 | cat >&2 <<-'EOF'
91 | Error: Can't find command ip or ifconfig.
92 | Please install first.
93 | EOF
94 | exit 1
95 | fi
96 |
97 | if ! command_exists iptables; then
98 | cat >&2 <<-'EOF'
99 | Error: Can't find iptables.
100 | Please install first.
101 | EOF
102 | exit 1
103 | fi
104 | }
105 |
106 | clear_iptables_rules() {
107 | iptables -t nat -D PREROUTING -i ${INTERFACE} -j ${LKL_IN_CHAIN_NAME} 2>/dev/null
108 |
109 | iptables -t nat -F ${LKL_IN_CHAIN_NAME} 2>/dev/null
110 | iptables -t nat -X ${LKL_IN_CHAIN_NAME} 2>/dev/null
111 | }
112 |
113 | set_network() {
114 | if ( command_exists ip && ip tuntap >/dev/null 2>&1 ); then
115 | ip tuntap del dev ${LKL_TAP_NAME} mode tap 2>/dev/null
116 | ip tuntap add dev ${LKL_TAP_NAME} mode tap 2>/dev/null
117 | elif command_exists tunctl; then
118 | tunctl -d ${LKL_TAP_NAME} >/dev/null 2>&1
119 | tunctl -t ${LKL_TAP_NAME} -u haproxy >/dev/null 2>&1
120 | else
121 | cat >&2 <<-'EOF'
122 | Error: Can't find command ip (with tuntap) or tunctl.
123 | Please install first.
124 | EOF
125 | exit 1
126 | fi
127 |
128 | if command_exists ip; then
129 | ip addr add dev ${LKL_TAP_NAME} 10.0.0.1/24 2>/dev/null
130 | ip link set dev ${LKL_TAP_NAME} up 2>/dev/null
131 | elif command_exists ifconfig; then
132 | ifconfig ${LKL_TAP_NAME} 10.0.0.1 netmask 255.255.255.0 up
133 | fi
134 |
135 | clear_iptables_rules
136 |
137 | iptables -P FORWARD ACCEPT 2>/dev/null
138 |
139 | iptables -t nat -N ${LKL_IN_CHAIN_NAME} 2>/dev/null
140 | iptables -t nat -A PREROUTING -i ${INTERFACE} -j ${LKL_IN_CHAIN_NAME} 2>/dev/null
141 | }
142 |
143 | generate_config() {
144 | local port_rules_file="${HAPROXY_LKL_DIR}/etc/port-rules"
145 |
146 | if [ ! -r "$port_rules_file" ]; then
147 | cat >&2 <<-EOF
148 | Error: Can't read port rules file:
149 | ${port_rules_file}
150 | Please check.
151 | EOF
152 | exit 1
153 | fi
154 |
155 | local port_rule_lines="$(grep -v '^#' ${port_rules_file} | \
156 | sed 's/[[:space:]]//g' | sed '/^$/d' 2>/dev/null)"
157 |
158 | if [ -z "$port_rule_lines" ]; then
159 | cat >&2 <<-EOF
160 | Error: Can't find rules in your port rules file:
161 | ${port_rules_file}
162 | Please check.
163 | EOF
164 | exit 1
165 | fi
166 |
167 | touch "$HAPROXY_CFG_FILE" 2>/dev/null
168 |
169 | if [ ! -w "$HAPROXY_CFG_FILE" ]; then
170 | cat >&2 <<-EOF
171 | Error: Can't create HAproxy config file
172 | or we don't have write permission to file:
173 | ${HAPROXY_CFG_FILE}
174 | Please check.
175 | EOF
176 | exit 1
177 | fi
178 |
179 | cat >"$HAPROXY_CFG_FILE" <<-EOF
180 | # Autogenerate by port rules file
181 | # Config will lost after restart haproxy-lkl
182 | # Do not edit this file.
183 | global
184 | user haproxy
185 | group haproxy
186 | defaults
187 | mode tcp
188 | timeout connect 5s
189 | timeout client 30s
190 | timeout server 30s
191 | backend local
192 | server srv 10.0.0.1
193 | EOF
194 |
195 | local legal_rules=
196 | local i=0
197 |
198 | add_rule() {
199 | local ports="$1"
200 |
201 | legal_rules="$(printf "%s\n%s" "${legal_rules}" "${ports}")"
202 | i=`expr $i + 1`
203 |
204 | cat >>"$HAPROXY_CFG_FILE" <<-EOF
205 | frontend proxy-${i}
206 | bind 10.0.0.2:${ports}
207 | default_backend local
208 | EOF
209 |
210 | iptables -t nat -A ${LKL_IN_CHAIN_NAME} -p tcp \
211 | --dport "$(echo "$ports" | tr '-' ':')" -j DNAT \
212 | --to-destination 10.0.0.2 2>/dev/null
213 | }
214 |
215 | is_port() {
216 | local port=$1
217 |
218 | `expr $port + 1 >/dev/null 2>&1` && \
219 | [ "$port" -ge "1" -a "$port" -le "65535" ]
220 | return $?
221 | }
222 |
223 | local start_port=
224 | local end_port=
225 | for line in $port_rule_lines; do
226 | start_port="$(echo $line | cut -d '-' -f1)"
227 | end_port="$(echo $line | cut -d '-' -f2)"
228 |
229 | if [ -n "$start_port" -a -n "$end_port" ]; then
230 | if ( is_port "$start_port" && is_port "$end_port" ); then
231 | add_rule "$line"
232 | fi
233 | elif [ -n "$start_port" ]; then
234 | if is_port "$start_port"; then
235 | add_rule "$start_port"
236 | fi
237 | fi
238 | done
239 |
240 | if [ "$i" = "0" ]; then
241 | cat >&2 <<-EOF
242 | Error: Port rules file format error
243 | Please check ${port_rules_file}
244 | EOF
245 |
246 | exit 1
247 | fi
248 |
249 | if [ -w "$port_rules_file" ]; then
250 | cat >"$port_rules_file" <<-EOF
251 | # You can config HAproxy-lkl ports in this file.
252 | # Eg. 8800 or 8800-8810
253 | # It is the port(s) you want accelerate.
254 | # One port(port range) per line.
255 | ${legal_rules}
256 | EOF
257 | fi
258 | }
259 |
260 | start_haproxy_lkl() {
261 | local haproxy_bin="${HAPROXY_LKL_DIR}/sbin/haproxy"
262 | local lkl_lib="${HAPROXY_LKL_DIR}/lib64/liblkl-hijack.so"
263 |
264 | if [ ! -f "$haproxy_bin" ]; then
265 | cat >&2 <<-EOF
266 | Error: Can't find haproxy bin.
267 | Please put haproxy in $(dirname ${haproxy_bin})
268 | EOF
269 | exit 1
270 | fi
271 |
272 | if [ ! -f "$lkl_lib" ]; then
273 | cat >&2 <<-EOF
274 | Error: Can't find Linux kernel library.
275 | Please put liblkl-hijack.so in $(dirname ${lkl_lib})
276 | EOF
277 | exit 1
278 | fi
279 |
280 | if [ ! -s "$HAPROXY_CFG_FILE" ]; then
281 | cat >&2 <<-EOF
282 | Error: HAproxy config file is empty.
283 | May be insufficient disk space.
284 | ${HAPROXY_CFG_FILE}
285 | EOF
286 | exit 1
287 | fi
288 |
289 | [ ! -x "$haproxy_bin" ] && chmod +x "$haproxy_bin"
290 |
291 | LD_PRELOAD="$lkl_lib" \
292 | LKL_HIJACK_NET_QDISC='root|fq' \
293 | LKL_HIJACK_SYSCTL='net.ipv4.tcp_wmem=4096 65536 67108864' \
294 | LKL_HIJACK_NET_IFTYPE=tap \
295 | LKL_HIJACK_NET_IFPARAMS="$LKL_TAP_NAME" \
296 | LKL_HIJACK_NET_IP=10.0.0.2 \
297 | LKL_HIJACK_NET_NETMASK_LEN=24 \
298 | LKL_HIJACK_NET_GATEWAY=10.0.0.1 \
299 | LKL_HIJACK_OFFLOAD=0x8883 \
300 | $haproxy_bin -f "$HAPROXY_CFG_FILE" >"$LOGFILE" 2>&1 &
301 | }
302 |
303 | do_start() {
304 | pre_check
305 | set_network
306 | generate_config
307 |
308 | local pid=
309 | start_haproxy_lkl && pid=$! || RETVAL=$?
310 |
311 | if [ -n "$pid" -a -n "$PIDFILE" ]; then
312 | echo "$pid" >"$PIDFILE" 2>/dev/null
313 | fi
314 | }
315 |
316 | while getopts "p:l:hc" opt; do
317 | case "$opt" in
318 | c)
319 | clear_iptables_rules
320 | exit 0
321 | ;;
322 | p)
323 | if [ -n "$OPTARG" ]; then
324 | PIDFILE="$OPTARG"
325 | make_file_dir "$PIDFILE"
326 | fi
327 | ;;
328 | l)
329 | if [ -n "$OPTARG" ]; then
330 | LOGFILE="$OPTARG"
331 | make_file_dir "$LOGFILE"
332 | fi
333 | ;;
334 | h)
335 | usage 0
336 | ;;
337 | [?])
338 | usage 1
339 | ;;
340 | esac
341 | done
342 |
343 | do_start
344 |
345 | exit $RETVAL
346 |
--------------------------------------------------------------------------------
/ovz-bbr/bin/haproxy.linux2628_x86_64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuoruan/shell-scripts/45f96e24c4abd9f4a81b9af11727f68d2b0c57ad/ovz-bbr/bin/haproxy.linux2628_x86_64
--------------------------------------------------------------------------------
/ovz-bbr/bin/rinetd-bbr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuoruan/shell-scripts/45f96e24c4abd9f4a81b9af11727f68d2b0c57ad/ovz-bbr/bin/rinetd-bbr
--------------------------------------------------------------------------------
/ovz-bbr/config/config.lkl:
--------------------------------------------------------------------------------
1 | #
2 | # Automatically generated file; DO NOT EDIT.
3 | # Linux/lkl 4.10.0 Kernel Configuration
4 | #
5 | CONFIG_LKL=y
6 | CONFIG_OUTPUT_FORMAT="elf64-x86-64"
7 | CONFIG_ARCH_DMA_ADDR_T_64BIT=y
8 | CONFIG_64BIT=y
9 | # CONFIG_BIG_ENDIAN is not set
10 | CONFIG_GENERIC_CSUM=y
11 | CONFIG_GENERIC_HWEIGHT=y
12 | CONFIG_NO_IOPORT_MAP=y
13 | CONFIG_RWSEM_GENERIC_SPINLOCK=y
14 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
15 | CONFIG_IRQ_WORK=y
16 |
17 | #
18 | # General setup
19 | #
20 | CONFIG_BROKEN_ON_SMP=y
21 | CONFIG_INIT_ENV_ARG_LIMIT=32
22 | CONFIG_CROSS_COMPILE=""
23 | # CONFIG_COMPILE_TEST is not set
24 | CONFIG_LOCALVERSION=""
25 | # CONFIG_LOCALVERSION_AUTO is not set
26 | CONFIG_DEFAULT_HOSTNAME="(none)"
27 | # CONFIG_SYSVIPC is not set
28 | # CONFIG_POSIX_MQUEUE is not set
29 | # CONFIG_FHANDLE is not set
30 | # CONFIG_USELIB is not set
31 | # CONFIG_AUDIT is not set
32 |
33 | #
34 | # IRQ subsystem
35 | #
36 | CONFIG_GENERIC_CLOCKEVENTS=y
37 |
38 | #
39 | # Timers subsystem
40 | #
41 | CONFIG_TICK_ONESHOT=y
42 | CONFIG_NO_HZ_COMMON=y
43 | # CONFIG_HZ_PERIODIC is not set
44 | CONFIG_NO_HZ_IDLE=y
45 | # CONFIG_NO_HZ is not set
46 | CONFIG_HIGH_RES_TIMERS=y
47 |
48 | #
49 | # CPU/Task time and stats accounting
50 | #
51 | CONFIG_TICK_CPU_ACCOUNTING=y
52 |
53 | #
54 | # RCU Subsystem
55 | #
56 | CONFIG_TINY_RCU=y
57 | # CONFIG_RCU_EXPERT is not set
58 | # CONFIG_TASKS_RCU is not set
59 | # CONFIG_RCU_STALL_COMMON is not set
60 | # CONFIG_TREE_RCU_TRACE is not set
61 | # CONFIG_RCU_EXPEDITE_BOOT is not set
62 | # CONFIG_BUILD_BIN2C is not set
63 | # CONFIG_IKCONFIG is not set
64 | CONFIG_LOG_BUF_SHIFT=17
65 | # CONFIG_CGROUPS is not set
66 | # CONFIG_CHECKPOINT_RESTORE is not set
67 | # CONFIG_SCHED_AUTOGROUP is not set
68 | # CONFIG_RELAY is not set
69 | # CONFIG_BLK_DEV_INITRD is not set
70 | CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
71 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
72 | CONFIG_SYSCTL=y
73 | CONFIG_ANON_INODES=y
74 | CONFIG_BPF=y
75 | CONFIG_EXPERT=y
76 | # CONFIG_MULTIUSER is not set
77 | # CONFIG_SGETMASK_SYSCALL is not set
78 | # CONFIG_SYSFS_SYSCALL is not set
79 | # CONFIG_SYSCTL_SYSCALL is not set
80 | CONFIG_POSIX_TIMERS=y
81 | CONFIG_KALLSYMS=y
82 | CONFIG_KALLSYMS_ALL=y
83 | # CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set
84 | CONFIG_KALLSYMS_BASE_RELATIVE=y
85 | CONFIG_KALLSYMS_USE_DATA_SECTION=y
86 | CONFIG_PRINTK=y
87 | CONFIG_BUG=y
88 | # CONFIG_BASE_FULL is not set
89 | # CONFIG_FUTEX is not set
90 | CONFIG_EPOLL=y
91 | # CONFIG_SIGNALFD is not set
92 | # CONFIG_TIMERFD is not set
93 | CONFIG_EVENTFD=y
94 | # CONFIG_BPF_SYSCALL is not set
95 | # CONFIG_AIO is not set
96 | # CONFIG_ADVISE_SYSCALLS is not set
97 | CONFIG_MEMBARRIER=y
98 | CONFIG_EMBEDDED=y
99 |
100 | #
101 | # Kernel Performance Events And Counters
102 | #
103 | # CONFIG_VM_EVENT_COUNTERS is not set
104 | # CONFIG_COMPAT_BRK is not set
105 | # CONFIG_SLAB is not set
106 | CONFIG_SLUB=y
107 | # CONFIG_SLOB is not set
108 | # CONFIG_SLAB_FREELIST_RANDOM is not set
109 | # CONFIG_MMAP_ALLOW_UNINITIALIZED is not set
110 | # CONFIG_SYSTEM_DATA_VERIFICATION is not set
111 | # CONFIG_PROFILING is not set
112 | CONFIG_HAVE_64BIT_ALIGNED_ACCESS=y
113 | CONFIG_ARCH_THREAD_STACK_ALLOCATOR=y
114 | # CONFIG_CC_STACKPROTECTOR is not set
115 | CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
116 | CONFIG_PGTABLE_LEVELS=2
117 | # CONFIG_HAVE_ARCH_HASH is not set
118 | # CONFIG_ISA_BUS_API is not set
119 | # CONFIG_CPU_NO_EFFICIENT_FFS is not set
120 | # CONFIG_HAVE_ARCH_VMAP_STACK is not set
121 |
122 | #
123 | # GCOV-based kernel profiling
124 | #
125 | # CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
126 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
127 | CONFIG_BASE_SMALL=1
128 | # CONFIG_MODULES is not set
129 | # CONFIG_BLOCK is not set
130 | CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
131 | CONFIG_INLINE_READ_UNLOCK=y
132 | CONFIG_INLINE_READ_UNLOCK_IRQ=y
133 | CONFIG_INLINE_WRITE_UNLOCK=y
134 | CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
135 | CONFIG_NET=y
136 |
137 | #
138 | # Networking options
139 | #
140 | # CONFIG_PACKET is not set
141 | # CONFIG_UNIX is not set
142 | # CONFIG_XFRM_USER is not set
143 | # CONFIG_NET_KEY is not set
144 | CONFIG_INET=y
145 | # CONFIG_IP_MULTICAST is not set
146 | # CONFIG_IP_ADVANCED_ROUTER is not set
147 | CONFIG_IP_PNP=y
148 | CONFIG_IP_PNP_DHCP=y
149 | # CONFIG_IP_PNP_BOOTP is not set
150 | # CONFIG_IP_PNP_RARP is not set
151 | # CONFIG_NET_IPIP is not set
152 | # CONFIG_NET_IPGRE_DEMUX is not set
153 | CONFIG_NET_IP_TUNNEL=y
154 | # CONFIG_SYN_COOKIES is not set
155 | # CONFIG_NET_UDP_TUNNEL is not set
156 | # CONFIG_NET_FOU is not set
157 | # CONFIG_NET_FOU_IP_TUNNELS is not set
158 | # CONFIG_INET_AH is not set
159 | # CONFIG_INET_ESP is not set
160 | # CONFIG_INET_IPCOMP is not set
161 | # CONFIG_INET_XFRM_TUNNEL is not set
162 | CONFIG_INET_TUNNEL=y
163 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
164 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set
165 | # CONFIG_INET_XFRM_MODE_BEET is not set
166 | # CONFIG_INET_DIAG is not set
167 | CONFIG_TCP_CONG_ADVANCED=y
168 | # CONFIG_TCP_CONG_BIC is not set
169 | # CONFIG_TCP_CONG_CUBIC is not set
170 | # CONFIG_TCP_CONG_WESTWOOD is not set
171 | # CONFIG_TCP_CONG_HTCP is not set
172 | # CONFIG_TCP_CONG_HSTCP is not set
173 | # CONFIG_TCP_CONG_HYBLA is not set
174 | # CONFIG_TCP_CONG_VEGAS is not set
175 | # CONFIG_TCP_CONG_NV is not set
176 | # CONFIG_TCP_CONG_SCALABLE is not set
177 | # CONFIG_TCP_CONG_LP is not set
178 | # CONFIG_TCP_CONG_VENO is not set
179 | # CONFIG_TCP_CONG_YEAH is not set
180 | # CONFIG_TCP_CONG_ILLINOIS is not set
181 | # CONFIG_TCP_CONG_DCTCP is not set
182 | # CONFIG_TCP_CONG_CDG is not set
183 | CONFIG_TCP_CONG_BBR=y
184 | CONFIG_DEFAULT_BBR=y
185 | # CONFIG_DEFAULT_RENO is not set
186 | CONFIG_DEFAULT_TCP_CONG="bbr"
187 | # CONFIG_TCP_MD5SIG is not set
188 | CONFIG_IPV6=y
189 | # CONFIG_IPV6_ROUTER_PREF is not set
190 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set
191 | # CONFIG_INET6_AH is not set
192 | # CONFIG_INET6_ESP is not set
193 | # CONFIG_INET6_IPCOMP is not set
194 | # CONFIG_IPV6_MIP6 is not set
195 | # CONFIG_INET6_XFRM_TUNNEL is not set
196 | # CONFIG_INET6_TUNNEL is not set
197 | # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
198 | # CONFIG_INET6_XFRM_MODE_TUNNEL is not set
199 | # CONFIG_INET6_XFRM_MODE_BEET is not set
200 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
201 | CONFIG_IPV6_SIT=y
202 | # CONFIG_IPV6_SIT_6RD is not set
203 | CONFIG_IPV6_NDISC_NODETYPE=y
204 | # CONFIG_IPV6_TUNNEL is not set
205 | # CONFIG_IPV6_FOU is not set
206 | # CONFIG_IPV6_FOU_TUNNEL is not set
207 | # CONFIG_IPV6_MULTIPLE_TABLES is not set
208 | # CONFIG_IPV6_MROUTE is not set
209 | # CONFIG_IPV6_SEG6_LWTUNNEL is not set
210 | # CONFIG_IPV6_SEG6_HMAC is not set
211 | # CONFIG_NETWORK_SECMARK is not set
212 | # CONFIG_NET_PTP_CLASSIFY is not set
213 | # CONFIG_NETWORK_PHY_TIMESTAMPING is not set
214 | # CONFIG_NETFILTER is not set
215 | # CONFIG_IP_DCCP is not set
216 | # CONFIG_IP_SCTP is not set
217 | # CONFIG_RDS is not set
218 | # CONFIG_TIPC is not set
219 | # CONFIG_ATM is not set
220 | # CONFIG_L2TP is not set
221 | # CONFIG_BRIDGE is not set
222 | CONFIG_HAVE_NET_DSA=y
223 | # CONFIG_VLAN_8021Q is not set
224 | # CONFIG_DECNET is not set
225 | # CONFIG_LLC2 is not set
226 | # CONFIG_IPX is not set
227 | # CONFIG_ATALK is not set
228 | # CONFIG_X25 is not set
229 | # CONFIG_LAPB is not set
230 | # CONFIG_PHONET is not set
231 | # CONFIG_6LOWPAN is not set
232 | # CONFIG_IEEE802154 is not set
233 | CONFIG_NET_SCHED=y
234 |
235 | #
236 | # Queueing/Scheduling
237 | #
238 | # CONFIG_NET_SCH_CBQ is not set
239 | # CONFIG_NET_SCH_HTB is not set
240 | # CONFIG_NET_SCH_HFSC is not set
241 | # CONFIG_NET_SCH_PRIO is not set
242 | # CONFIG_NET_SCH_MULTIQ is not set
243 | # CONFIG_NET_SCH_RED is not set
244 | # CONFIG_NET_SCH_SFB is not set
245 | # CONFIG_NET_SCH_SFQ is not set
246 | # CONFIG_NET_SCH_TEQL is not set
247 | # CONFIG_NET_SCH_TBF is not set
248 | # CONFIG_NET_SCH_GRED is not set
249 | # CONFIG_NET_SCH_DSMARK is not set
250 | # CONFIG_NET_SCH_NETEM is not set
251 | # CONFIG_NET_SCH_DRR is not set
252 | # CONFIG_NET_SCH_MQPRIO is not set
253 | # CONFIG_NET_SCH_CHOKE is not set
254 | # CONFIG_NET_SCH_QFQ is not set
255 | # CONFIG_NET_SCH_CODEL is not set
256 | # CONFIG_NET_SCH_FQ_CODEL is not set
257 | CONFIG_NET_SCH_FQ=y
258 | # CONFIG_NET_SCH_HHF is not set
259 | # CONFIG_NET_SCH_PIE is not set
260 | # CONFIG_NET_SCH_PLUG is not set
261 |
262 | #
263 | # Classification
264 | #
265 | # CONFIG_NET_CLS_BASIC is not set
266 | # CONFIG_NET_CLS_TCINDEX is not set
267 | # CONFIG_NET_CLS_ROUTE4 is not set
268 | # CONFIG_NET_CLS_FW is not set
269 | # CONFIG_NET_CLS_U32 is not set
270 | # CONFIG_NET_CLS_RSVP is not set
271 | # CONFIG_NET_CLS_RSVP6 is not set
272 | # CONFIG_NET_CLS_FLOW is not set
273 | # CONFIG_NET_CLS_BPF is not set
274 | # CONFIG_NET_CLS_FLOWER is not set
275 | # CONFIG_NET_CLS_MATCHALL is not set
276 | # CONFIG_NET_EMATCH is not set
277 | # CONFIG_NET_CLS_ACT is not set
278 | CONFIG_NET_SCH_FIFO=y
279 | # CONFIG_DCB is not set
280 | # CONFIG_BATMAN_ADV is not set
281 | # CONFIG_OPENVSWITCH is not set
282 | # CONFIG_VSOCKETS is not set
283 | # CONFIG_NETLINK_DIAG is not set
284 | # CONFIG_MPLS is not set
285 | # CONFIG_HSR is not set
286 | # CONFIG_NET_SWITCHDEV is not set
287 | # CONFIG_NET_L3_MASTER_DEV is not set
288 | # CONFIG_NET_NCSI is not set
289 | CONFIG_NET_RX_BUSY_POLL=y
290 |
291 | #
292 | # Network testing
293 | #
294 | # CONFIG_NET_PKTGEN is not set
295 | # CONFIG_HAMRADIO is not set
296 | # CONFIG_CAN is not set
297 | # CONFIG_IRDA is not set
298 | # CONFIG_BT is not set
299 | # CONFIG_AF_RXRPC is not set
300 | # CONFIG_AF_KCM is not set
301 | # CONFIG_STREAM_PARSER is not set
302 | # CONFIG_WIRELESS is not set
303 | # CONFIG_WIMAX is not set
304 | # CONFIG_RFKILL is not set
305 | # CONFIG_NET_9P is not set
306 | # CONFIG_CAIF is not set
307 | # CONFIG_CEPH_LIB is not set
308 | # CONFIG_NFC is not set
309 | # CONFIG_LWTUNNEL is not set
310 | CONFIG_DST_CACHE=y
311 | # CONFIG_NET_DEVLINK is not set
312 | CONFIG_MAY_USE_DEVLINK=y
313 |
314 | #
315 | # Device Drivers
316 | #
317 |
318 | #
319 | # Generic Driver Options
320 | #
321 | # CONFIG_UEVENT_HELPER is not set
322 | # CONFIG_DEVTMPFS is not set
323 | CONFIG_STANDALONE=y
324 | CONFIG_PREVENT_FIRMWARE_BUILD=y
325 | # CONFIG_FW_LOADER is not set
326 | CONFIG_ALLOW_DEV_COREDUMP=y
327 | # CONFIG_DEBUG_DRIVER is not set
328 | # CONFIG_DEBUG_DEVRES is not set
329 | # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
330 | # CONFIG_SYS_HYPERVISOR is not set
331 | CONFIG_GENERIC_CPU_DEVICES=y
332 | # CONFIG_DMA_SHARED_BUFFER is not set
333 |
334 | #
335 | # Bus devices
336 | #
337 | # CONFIG_CONNECTOR is not set
338 | # CONFIG_MTD is not set
339 | # CONFIG_OF is not set
340 | # CONFIG_PARPORT is not set
341 |
342 | #
343 | # Misc devices
344 | #
345 | # CONFIG_DUMMY_IRQ is not set
346 | # CONFIG_ENCLOSURE_SERVICES is not set
347 | # CONFIG_SRAM is not set
348 | # CONFIG_C2PORT is not set
349 |
350 | #
351 | # EEPROM support
352 | #
353 | # CONFIG_EEPROM_93CX6 is not set
354 |
355 | #
356 | # Texas Instruments shared transport line discipline
357 | #
358 |
359 | #
360 | # Altera FPGA firmware download module
361 | #
362 |
363 | #
364 | # Intel MIC Bus Driver
365 | #
366 |
367 | #
368 | # SCIF Bus Driver
369 | #
370 |
371 | #
372 | # VOP Bus Driver
373 | #
374 |
375 | #
376 | # Intel MIC Host Driver
377 | #
378 |
379 | #
380 | # Intel MIC Card Driver
381 | #
382 |
383 | #
384 | # SCIF Driver
385 | #
386 |
387 | #
388 | # Intel MIC Coprocessor State Management (COSM) Drivers
389 | #
390 |
391 | #
392 | # VOP Driver
393 | #
394 | # CONFIG_ECHO is not set
395 | # CONFIG_CXL_BASE is not set
396 | # CONFIG_CXL_AFU_DRIVER_OPS is not set
397 |
398 | #
399 | # SCSI device support
400 | #
401 | CONFIG_SCSI_MOD=y
402 | # CONFIG_SCSI_DMA is not set
403 | # CONFIG_SCSI_NETLINK is not set
404 | CONFIG_NETDEVICES=y
405 | CONFIG_NET_CORE=y
406 | # CONFIG_BONDING is not set
407 | # CONFIG_DUMMY is not set
408 | # CONFIG_EQUALIZER is not set
409 | # CONFIG_NET_TEAM is not set
410 | # CONFIG_MACVLAN is not set
411 | # CONFIG_VXLAN is not set
412 | # CONFIG_MACSEC is not set
413 | # CONFIG_NETCONSOLE is not set
414 | # CONFIG_NETPOLL is not set
415 | # CONFIG_NET_POLL_CONTROLLER is not set
416 | # CONFIG_TUN is not set
417 | # CONFIG_TUN_VNET_CROSS_LE is not set
418 | # CONFIG_VETH is not set
419 | CONFIG_VIRTIO_NET=y
420 | # CONFIG_NLMON is not set
421 |
422 | #
423 | # CAIF transport drivers
424 | #
425 |
426 | #
427 | # Distributed Switch Architecture drivers
428 | #
429 | # CONFIG_ETHERNET is not set
430 | # CONFIG_PHYLIB is not set
431 | # CONFIG_PPP is not set
432 |
433 | #
434 | # Host-side USB support is needed for USB Network Adapter support
435 | #
436 | # CONFIG_WLAN is not set
437 |
438 | #
439 | # Enable WiMAX (Networking options) to see the WiMAX drivers
440 | #
441 | # CONFIG_WAN is not set
442 | # CONFIG_ISDN is not set
443 |
444 | #
445 | # Input device support
446 | #
447 | # CONFIG_INPUT is not set
448 |
449 | #
450 | # Hardware I/O ports
451 | #
452 | # CONFIG_SERIO is not set
453 | # CONFIG_GAMEPORT is not set
454 |
455 | #
456 | # Character devices
457 | #
458 | # CONFIG_TTY is not set
459 | # CONFIG_DEVMEM is not set
460 | # CONFIG_DEVKMEM is not set
461 | # CONFIG_IPMI_HANDLER is not set
462 | # CONFIG_HW_RANDOM is not set
463 |
464 | #
465 | # PCMCIA character devices
466 | #
467 | # CONFIG_TCG_TPM is not set
468 |
469 | #
470 | # I2C support
471 | #
472 | # CONFIG_I2C is not set
473 | # CONFIG_SPI is not set
474 | # CONFIG_SPMI is not set
475 | # CONFIG_HSI is not set
476 |
477 | #
478 | # PPS support
479 | #
480 | # CONFIG_PPS is not set
481 |
482 | #
483 | # PPS generators support
484 | #
485 |
486 | #
487 | # PTP clock support
488 | #
489 | # CONFIG_PTP_1588_CLOCK is not set
490 |
491 | #
492 | # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
493 | #
494 | # CONFIG_GPIOLIB is not set
495 | # CONFIG_W1 is not set
496 | # CONFIG_POWER_AVS is not set
497 | # CONFIG_POWER_RESET is not set
498 | # CONFIG_POWER_SUPPLY is not set
499 | # CONFIG_HWMON is not set
500 | # CONFIG_THERMAL is not set
501 | # CONFIG_WATCHDOG is not set
502 | CONFIG_SSB_POSSIBLE=y
503 |
504 | #
505 | # Sonics Silicon Backplane
506 | #
507 | # CONFIG_SSB is not set
508 | CONFIG_BCMA_POSSIBLE=y
509 |
510 | #
511 | # Broadcom specific AMBA
512 | #
513 | # CONFIG_BCMA is not set
514 |
515 | #
516 | # Multifunction device drivers
517 | #
518 | # CONFIG_MFD_CORE is not set
519 | # CONFIG_HTC_PASIC3 is not set
520 | # CONFIG_MFD_KEMPLD is not set
521 | # CONFIG_MFD_MT6397 is not set
522 | # CONFIG_MFD_SM501 is not set
523 | # CONFIG_ABX500_CORE is not set
524 | # CONFIG_MFD_SYSCON is not set
525 | # CONFIG_MFD_TI_AM335X_TSCADC is not set
526 | # CONFIG_MFD_TMIO is not set
527 | # CONFIG_REGULATOR is not set
528 | # CONFIG_MEDIA_SUPPORT is not set
529 |
530 | #
531 | # Graphics support
532 | #
533 |
534 | #
535 | # ACP (Audio CoProcessor) Configuration
536 | #
537 |
538 | #
539 | # Frame buffer Devices
540 | #
541 | # CONFIG_FB is not set
542 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
543 | # CONFIG_VGASTATE is not set
544 | # CONFIG_SOUND is not set
545 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y
546 | # CONFIG_USB_SUPPORT is not set
547 | # CONFIG_UWB is not set
548 | # CONFIG_MMC is not set
549 | # CONFIG_MEMSTICK is not set
550 | # CONFIG_NEW_LEDS is not set
551 | # CONFIG_ACCESSIBILITY is not set
552 | # CONFIG_RTC_CLASS is not set
553 | # CONFIG_DMADEVICES is not set
554 |
555 | #
556 | # DMABUF options
557 | #
558 | # CONFIG_SYNC_FILE is not set
559 | # CONFIG_AUXDISPLAY is not set
560 | # CONFIG_VIRT_DRIVERS is not set
561 | CONFIG_VIRTIO=y
562 |
563 | #
564 | # Virtio drivers
565 | #
566 | CONFIG_VIRTIO_BALLOON=y
567 | CONFIG_VIRTIO_MMIO=y
568 | CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
569 |
570 | #
571 | # Microsoft Hyper-V guest support
572 | #
573 | # CONFIG_STAGING is not set
574 |
575 | #
576 | # Hardware Spinlock drivers
577 | #
578 |
579 | #
580 | # Clock Source drivers
581 | #
582 | # CONFIG_ATMEL_PIT is not set
583 | # CONFIG_SH_TIMER_CMT is not set
584 | # CONFIG_SH_TIMER_MTU2 is not set
585 | # CONFIG_SH_TIMER_TMU is not set
586 | # CONFIG_EM_TIMER_STI is not set
587 | # CONFIG_MAILBOX is not set
588 |
589 | #
590 | # Remoteproc drivers
591 | #
592 | # CONFIG_REMOTEPROC is not set
593 |
594 | #
595 | # Rpmsg drivers
596 | #
597 |
598 | #
599 | # SOC (System On Chip) specific Drivers
600 | #
601 |
602 | #
603 | # Broadcom SoC drivers
604 | #
605 | # CONFIG_SUNXI_SRAM is not set
606 | # CONFIG_SOC_TI is not set
607 | # CONFIG_PM_DEVFREQ is not set
608 | # CONFIG_EXTCON is not set
609 | # CONFIG_MEMORY is not set
610 | # CONFIG_IIO is not set
611 | # CONFIG_PWM is not set
612 | CONFIG_ARM_GIC_MAX_NR=1
613 | # CONFIG_IPACK_BUS is not set
614 | # CONFIG_RESET_CONTROLLER is not set
615 | # CONFIG_FMC is not set
616 |
617 | #
618 | # PHY Subsystem
619 | #
620 | # CONFIG_GENERIC_PHY is not set
621 | # CONFIG_PHY_PXA_28NM_HSIC is not set
622 | # CONFIG_PHY_PXA_28NM_USB2 is not set
623 | # CONFIG_BCM_KONA_USB2_PHY is not set
624 | # CONFIG_POWERCAP is not set
625 | # CONFIG_MCB is not set
626 |
627 | #
628 | # Performance monitor support
629 | #
630 | # CONFIG_RAS is not set
631 |
632 | #
633 | # Android
634 | #
635 | # CONFIG_ANDROID is not set
636 | # CONFIG_NVMEM is not set
637 | # CONFIG_STM is not set
638 | # CONFIG_INTEL_TH is not set
639 |
640 | #
641 | # FPGA Configuration Support
642 | #
643 | # CONFIG_FPGA is not set
644 |
645 | #
646 | # File systems
647 | #
648 | # CONFIG_FS_POSIX_ACL is not set
649 | # CONFIG_EXPORTFS_BLOCK_OPS is not set
650 | # CONFIG_FILE_LOCKING is not set
651 | # CONFIG_FSNOTIFY is not set
652 | # CONFIG_DNOTIFY is not set
653 | # CONFIG_INOTIFY_USER is not set
654 | # CONFIG_FANOTIFY is not set
655 | # CONFIG_QUOTA is not set
656 | # CONFIG_QUOTACTL is not set
657 | # CONFIG_AUTOFS4_FS is not set
658 | # CONFIG_FUSE_FS is not set
659 | # CONFIG_OVERLAY_FS is not set
660 |
661 | #
662 | # Caches
663 | #
664 | # CONFIG_FSCACHE is not set
665 |
666 | #
667 | # Pseudo filesystems
668 | #
669 | CONFIG_PROC_FS=y
670 | CONFIG_PROC_SYSCTL=y
671 | # CONFIG_PROC_CHILDREN is not set
672 | # CONFIG_KERNFS is not set
673 | # CONFIG_SYSFS is not set
674 | # CONFIG_HUGETLB_PAGE is not set
675 | # CONFIG_CONFIGFS_FS is not set
676 | # CONFIG_MISC_FILESYSTEMS is not set
677 | # CONFIG_NETWORK_FILESYSTEMS is not set
678 | # CONFIG_NLS is not set
679 | CONFIG_FLATMEM=y
680 | CONFIG_FLAT_NODE_MEM_MAP=y
681 | # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
682 | CONFIG_SPLIT_PTLOCK_CPUS=999999
683 | CONFIG_MEMORY_BALLOON=y
684 | CONFIG_PHYS_ADDR_T_64BIT=y
685 | CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1
686 | CONFIG_NEED_PER_CPU_KM=y
687 | # CONFIG_CLEANCACHE is not set
688 | # CONFIG_ZPOOL is not set
689 | # CONFIG_ZBUD is not set
690 | CONFIG_PREEMPT_NONE=y
691 | # CONFIG_PREEMPT_VOLUNTARY is not set
692 | # CONFIG_PREEMPT is not set
693 | CONFIG_HZ_100=y
694 | # CONFIG_HZ_250 is not set
695 | # CONFIG_HZ_300 is not set
696 | # CONFIG_HZ_1000 is not set
697 | CONFIG_HZ=100
698 | CONFIG_SCHED_HRTICK=y
699 |
700 | #
701 | # Security options
702 | #
703 | # CONFIG_KEYS is not set
704 | # CONFIG_SECURITY_DMESG_RESTRICT is not set
705 | # CONFIG_SECURITYFS is not set
706 | CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
707 | CONFIG_DEFAULT_SECURITY_DAC=y
708 | CONFIG_DEFAULT_SECURITY=""
709 | CONFIG_CRYPTO=y
710 |
711 | #
712 | # Crypto core or helper
713 | #
714 | CONFIG_CRYPTO_ALGAPI=y
715 | CONFIG_CRYPTO_ALGAPI2=y
716 | CONFIG_CRYPTO_AEAD=y
717 | CONFIG_CRYPTO_AEAD2=y
718 | CONFIG_CRYPTO_BLKCIPHER=y
719 | CONFIG_CRYPTO_BLKCIPHER2=y
720 | CONFIG_CRYPTO_HASH=y
721 | CONFIG_CRYPTO_HASH2=y
722 | CONFIG_CRYPTO_RNG2=y
723 | CONFIG_CRYPTO_AKCIPHER2=y
724 | CONFIG_CRYPTO_KPP2=y
725 | CONFIG_CRYPTO_ACOMP2=y
726 | # CONFIG_CRYPTO_RSA is not set
727 | # CONFIG_CRYPTO_DH is not set
728 | # CONFIG_CRYPTO_ECDH is not set
729 | CONFIG_CRYPTO_MANAGER=y
730 | CONFIG_CRYPTO_MANAGER2=y
731 | # CONFIG_CRYPTO_USER is not set
732 | CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
733 | # CONFIG_CRYPTO_GF128MUL is not set
734 | CONFIG_CRYPTO_NULL=y
735 | CONFIG_CRYPTO_NULL2=y
736 | CONFIG_CRYPTO_WORKQUEUE=y
737 | # CONFIG_CRYPTO_CRYPTD is not set
738 | # CONFIG_CRYPTO_MCRYPTD is not set
739 | CONFIG_CRYPTO_AUTHENC=y
740 |
741 | #
742 | # Authenticated Encryption with Associated Data
743 | #
744 | # CONFIG_CRYPTO_CCM is not set
745 | # CONFIG_CRYPTO_GCM is not set
746 | # CONFIG_CRYPTO_CHACHA20POLY1305 is not set
747 | # CONFIG_CRYPTO_SEQIV is not set
748 | # CONFIG_CRYPTO_ECHAINIV is not set
749 |
750 | #
751 | # Block modes
752 | #
753 | # CONFIG_CRYPTO_CBC is not set
754 | # CONFIG_CRYPTO_CTR is not set
755 | # CONFIG_CRYPTO_CTS is not set
756 | # CONFIG_CRYPTO_ECB is not set
757 | # CONFIG_CRYPTO_LRW is not set
758 | # CONFIG_CRYPTO_PCBC is not set
759 | # CONFIG_CRYPTO_XTS is not set
760 | # CONFIG_CRYPTO_KEYWRAP is not set
761 |
762 | #
763 | # Hash modes
764 | #
765 | # CONFIG_CRYPTO_CMAC is not set
766 | # CONFIG_CRYPTO_HMAC is not set
767 | # CONFIG_CRYPTO_XCBC is not set
768 | # CONFIG_CRYPTO_VMAC is not set
769 |
770 | #
771 | # Digest
772 | #
773 | # CONFIG_CRYPTO_CRC32C is not set
774 | # CONFIG_CRYPTO_CRC32 is not set
775 | # CONFIG_CRYPTO_CRCT10DIF is not set
776 | # CONFIG_CRYPTO_GHASH is not set
777 | # CONFIG_CRYPTO_POLY1305 is not set
778 | # CONFIG_CRYPTO_MD4 is not set
779 | # CONFIG_CRYPTO_MD5 is not set
780 | # CONFIG_CRYPTO_MICHAEL_MIC is not set
781 | # CONFIG_CRYPTO_RMD128 is not set
782 | # CONFIG_CRYPTO_RMD160 is not set
783 | # CONFIG_CRYPTO_RMD256 is not set
784 | # CONFIG_CRYPTO_RMD320 is not set
785 | # CONFIG_CRYPTO_SHA1 is not set
786 | # CONFIG_CRYPTO_SHA256 is not set
787 | # CONFIG_CRYPTO_SHA512 is not set
788 | # CONFIG_CRYPTO_SHA3 is not set
789 | # CONFIG_CRYPTO_TGR192 is not set
790 | # CONFIG_CRYPTO_WP512 is not set
791 |
792 | #
793 | # Ciphers
794 | #
795 | CONFIG_CRYPTO_AES=y
796 | # CONFIG_CRYPTO_ANUBIS is not set
797 | # CONFIG_CRYPTO_ARC4 is not set
798 | # CONFIG_CRYPTO_BLOWFISH is not set
799 | # CONFIG_CRYPTO_CAMELLIA is not set
800 | # CONFIG_CRYPTO_CAST5 is not set
801 | # CONFIG_CRYPTO_CAST6 is not set
802 | # CONFIG_CRYPTO_DES is not set
803 | # CONFIG_CRYPTO_FCRYPT is not set
804 | # CONFIG_CRYPTO_KHAZAD is not set
805 | # CONFIG_CRYPTO_SALSA20 is not set
806 | # CONFIG_CRYPTO_CHACHA20 is not set
807 | # CONFIG_CRYPTO_SEED is not set
808 | # CONFIG_CRYPTO_SERPENT is not set
809 | # CONFIG_CRYPTO_TEA is not set
810 | # CONFIG_CRYPTO_TWOFISH is not set
811 |
812 | #
813 | # Compression
814 | #
815 | # CONFIG_CRYPTO_DEFLATE is not set
816 | # CONFIG_CRYPTO_LZO is not set
817 | # CONFIG_CRYPTO_842 is not set
818 | # CONFIG_CRYPTO_LZ4 is not set
819 | # CONFIG_CRYPTO_LZ4HC is not set
820 |
821 | #
822 | # Random Number Generation
823 | #
824 | # CONFIG_CRYPTO_ANSI_CPRNG is not set
825 | # CONFIG_CRYPTO_DRBG_MENU is not set
826 | # CONFIG_CRYPTO_JITTERENTROPY is not set
827 | # CONFIG_CRYPTO_USER_API_HASH is not set
828 | # CONFIG_CRYPTO_USER_API_SKCIPHER is not set
829 | # CONFIG_CRYPTO_USER_API_RNG is not set
830 | # CONFIG_CRYPTO_USER_API_AEAD is not set
831 | # CONFIG_CRYPTO_HW is not set
832 |
833 | #
834 | # Certificates for signature checking
835 | #
836 | # CONFIG_BINARY_PRINTF is not set
837 |
838 | #
839 | # Library routines
840 | #
841 | CONFIG_GENERIC_NET_UTILS=y
842 | CONFIG_GENERIC_IO=y
843 | # CONFIG_CRC_CCITT is not set
844 | # CONFIG_CRC16 is not set
845 | # CONFIG_CRC_T10DIF is not set
846 | # CONFIG_CRC_ITU_T is not set
847 | # CONFIG_CRC32 is not set
848 | # CONFIG_CRC7 is not set
849 | # CONFIG_LIBCRC32C is not set
850 | # CONFIG_CRC8 is not set
851 | # CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
852 | # CONFIG_RANDOM32_SELFTEST is not set
853 | # CONFIG_XZ_DEC is not set
854 | # CONFIG_XZ_DEC_BCJ is not set
855 | CONFIG_HAS_IOMEM=y
856 | CONFIG_HAS_DMA=y
857 | CONFIG_NLATTR=y
858 | CONFIG_GENERIC_ATOMIC64=y
859 | # CONFIG_CORDIC is not set
860 | # CONFIG_DDR is not set
861 | # CONFIG_IRQ_POLL is not set
862 | # CONFIG_SG_SPLIT is not set
863 | # CONFIG_SG_POOL is not set
864 | # CONFIG_ARCH_HAS_SG_CHAIN is not set
865 |
866 | #
867 | # printk and dmesg options
868 | #
869 | CONFIG_PRINTK_TIME=y
870 | CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
871 | CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
872 |
873 | #
874 | # Compile-time checks and compiler options
875 | #
876 | # CONFIG_DEBUG_INFO is not set
877 | # CONFIG_ENABLE_WARN_DEPRECATED is not set
878 | # CONFIG_ENABLE_MUST_CHECK is not set
879 | CONFIG_FRAME_WARN=2048
880 | # CONFIG_STRIP_ASM_SYMS is not set
881 | # CONFIG_READABLE_ASM is not set
882 | # CONFIG_UNUSED_SYMBOLS is not set
883 | # CONFIG_DEBUG_FS is not set
884 | # CONFIG_HEADERS_CHECK is not set
885 | # CONFIG_DEBUG_SECTION_MISMATCH is not set
886 | # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
887 | CONFIG_ARCH_WANT_FRAME_POINTERS=y
888 | # CONFIG_FRAME_POINTER is not set
889 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
890 | # CONFIG_MAGIC_SYSRQ is not set
891 | CONFIG_DEBUG_KERNEL=y
892 |
893 | #
894 | # Memory Debugging
895 | #
896 | # CONFIG_PAGE_EXTENSION is not set
897 | # CONFIG_DEBUG_PAGEALLOC is not set
898 | # CONFIG_PAGE_POISONING is not set
899 | # CONFIG_DEBUG_OBJECTS is not set
900 | # CONFIG_DEBUG_STACK_USAGE is not set
901 | # CONFIG_DEBUG_VM is not set
902 | # CONFIG_DEBUG_NOMMU_REGIONS is not set
903 | # CONFIG_DEBUG_MEMORY_INIT is not set
904 | # CONFIG_DEBUG_SHIRQ is not set
905 |
906 | #
907 | # Debug Lockups and Hangs
908 | #
909 | # CONFIG_LOCKUP_DETECTOR is not set
910 | # CONFIG_DETECT_HUNG_TASK is not set
911 | # CONFIG_WQ_WATCHDOG is not set
912 | # CONFIG_PANIC_ON_OOPS is not set
913 | CONFIG_PANIC_ON_OOPS_VALUE=0
914 | CONFIG_PANIC_TIMEOUT=0
915 | # CONFIG_SCHED_DEBUG is not set
916 | # CONFIG_SCHED_INFO is not set
917 | # CONFIG_SCHEDSTATS is not set
918 | # CONFIG_SCHED_STACK_END_CHECK is not set
919 | # CONFIG_DEBUG_TIMEKEEPING is not set
920 | # CONFIG_TIMER_STATS is not set
921 |
922 | #
923 | # Lock Debugging (spinlocks, mutexes, etc...)
924 | #
925 | # CONFIG_DEBUG_SPINLOCK is not set
926 | # CONFIG_DEBUG_MUTEXES is not set
927 | # CONFIG_DEBUG_ATOMIC_SLEEP is not set
928 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
929 | # CONFIG_LOCK_TORTURE_TEST is not set
930 | # CONFIG_DEBUG_KOBJECT is not set
931 | # CONFIG_DEBUG_LIST is not set
932 | # CONFIG_DEBUG_PI_LIST is not set
933 | # CONFIG_DEBUG_SG is not set
934 | # CONFIG_DEBUG_NOTIFIERS is not set
935 | # CONFIG_DEBUG_CREDENTIALS is not set
936 |
937 | #
938 | # RCU Debugging
939 | #
940 | # CONFIG_PROVE_RCU is not set
941 | # CONFIG_SPARSE_RCU_POINTER is not set
942 | # CONFIG_TORTURE_TEST is not set
943 | # CONFIG_RCU_PERF_TEST is not set
944 | # CONFIG_RCU_TORTURE_TEST is not set
945 | # CONFIG_RCU_TRACE is not set
946 | # CONFIG_RCU_EQS_DEBUG is not set
947 | # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
948 | # CONFIG_NOTIFIER_ERROR_INJECTION is not set
949 | # CONFIG_FAULT_INJECTION is not set
950 |
951 | #
952 | # Runtime Testing
953 | #
954 | # CONFIG_TEST_LIST_SORT is not set
955 | # CONFIG_BACKTRACE_SELF_TEST is not set
956 | # CONFIG_RBTREE_TEST is not set
957 | # CONFIG_ATOMIC64_SELFTEST is not set
958 | # CONFIG_TEST_HEXDUMP is not set
959 | # CONFIG_TEST_STRING_HELPERS is not set
960 | # CONFIG_TEST_KSTRTOX is not set
961 | # CONFIG_TEST_PRINTF is not set
962 | # CONFIG_TEST_BITMAP is not set
963 | # CONFIG_TEST_UUID is not set
964 | # CONFIG_TEST_RHASHTABLE is not set
965 | # CONFIG_TEST_HASH is not set
966 | # CONFIG_TEST_UDELAY is not set
967 | # CONFIG_BUG_ON_DATA_CORRUPTION is not set
968 | # CONFIG_SAMPLES is not set
969 | # CONFIG_ARCH_WANTS_UBSAN_NO_NULL is not set
970 | # CONFIG_UBSAN is not set
971 |
--------------------------------------------------------------------------------
/ovz-bbr/config/config.lkl.mini:
--------------------------------------------------------------------------------
1 | #
2 | # Automatically generated file; DO NOT EDIT.
3 | # Linux/lkl 4.10.0 Kernel Configuration
4 | #
5 | CONFIG_LKL=y
6 | CONFIG_OUTPUT_FORMAT="elf64-x86-64"
7 | CONFIG_ARCH_DMA_ADDR_T_64BIT=y
8 | CONFIG_64BIT=y
9 | # CONFIG_BIG_ENDIAN is not set
10 | CONFIG_GENERIC_CSUM=y
11 | CONFIG_GENERIC_HWEIGHT=y
12 | CONFIG_NO_IOPORT_MAP=y
13 | CONFIG_RWSEM_GENERIC_SPINLOCK=y
14 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
15 | CONFIG_IRQ_WORK=y
16 |
17 | #
18 | # General setup
19 | #
20 | CONFIG_BROKEN_ON_SMP=y
21 | CONFIG_INIT_ENV_ARG_LIMIT=32
22 | CONFIG_CROSS_COMPILE=""
23 | # CONFIG_COMPILE_TEST is not set
24 | CONFIG_LOCALVERSION=""
25 | # CONFIG_LOCALVERSION_AUTO is not set
26 | CONFIG_DEFAULT_HOSTNAME="(none)"
27 | # CONFIG_SYSVIPC is not set
28 | # CONFIG_POSIX_MQUEUE is not set
29 | # CONFIG_FHANDLE is not set
30 | # CONFIG_USELIB is not set
31 | # CONFIG_AUDIT is not set
32 |
33 | #
34 | # IRQ subsystem
35 | #
36 | CONFIG_GENERIC_CLOCKEVENTS=y
37 |
38 | #
39 | # Timers subsystem
40 | #
41 | CONFIG_TICK_ONESHOT=y
42 | CONFIG_NO_HZ_COMMON=y
43 | # CONFIG_HZ_PERIODIC is not set
44 | CONFIG_NO_HZ_IDLE=y
45 | # CONFIG_NO_HZ is not set
46 | CONFIG_HIGH_RES_TIMERS=y
47 |
48 | #
49 | # CPU/Task time and stats accounting
50 | #
51 | CONFIG_TICK_CPU_ACCOUNTING=y
52 |
53 | #
54 | # RCU Subsystem
55 | #
56 | CONFIG_TINY_RCU=y
57 | # CONFIG_RCU_EXPERT is not set
58 | # CONFIG_TASKS_RCU is not set
59 | # CONFIG_RCU_STALL_COMMON is not set
60 | # CONFIG_TREE_RCU_TRACE is not set
61 | # CONFIG_RCU_EXPEDITE_BOOT is not set
62 | # CONFIG_BUILD_BIN2C is not set
63 | # CONFIG_IKCONFIG is not set
64 | CONFIG_LOG_BUF_SHIFT=17
65 | # CONFIG_CGROUPS is not set
66 | # CONFIG_CHECKPOINT_RESTORE is not set
67 | # CONFIG_SCHED_AUTOGROUP is not set
68 | # CONFIG_RELAY is not set
69 | # CONFIG_BLK_DEV_INITRD is not set
70 | CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
71 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
72 | CONFIG_SYSCTL=y
73 | CONFIG_ANON_INODES=y
74 | CONFIG_BPF=y
75 | CONFIG_EXPERT=y
76 | # CONFIG_MULTIUSER is not set
77 | # CONFIG_SGETMASK_SYSCALL is not set
78 | # CONFIG_SYSFS_SYSCALL is not set
79 | # CONFIG_SYSCTL_SYSCALL is not set
80 | CONFIG_POSIX_TIMERS=y
81 | # CONFIG_KALLSYMS is not set
82 | CONFIG_PRINTK=y
83 | CONFIG_BUG=y
84 | # CONFIG_BASE_FULL is not set
85 | # CONFIG_FUTEX is not set
86 | CONFIG_EPOLL=y
87 | # CONFIG_SIGNALFD is not set
88 | # CONFIG_TIMERFD is not set
89 | CONFIG_EVENTFD=y
90 | # CONFIG_BPF_SYSCALL is not set
91 | # CONFIG_AIO is not set
92 | # CONFIG_ADVISE_SYSCALLS is not set
93 | CONFIG_MEMBARRIER=y
94 | CONFIG_EMBEDDED=y
95 |
96 | #
97 | # Kernel Performance Events And Counters
98 | #
99 | # CONFIG_VM_EVENT_COUNTERS is not set
100 | # CONFIG_COMPAT_BRK is not set
101 | # CONFIG_SLAB is not set
102 | CONFIG_SLUB=y
103 | # CONFIG_SLOB is not set
104 | # CONFIG_SLAB_FREELIST_RANDOM is not set
105 | # CONFIG_MMAP_ALLOW_UNINITIALIZED is not set
106 | # CONFIG_SYSTEM_DATA_VERIFICATION is not set
107 | # CONFIG_PROFILING is not set
108 | CONFIG_HAVE_64BIT_ALIGNED_ACCESS=y
109 | CONFIG_ARCH_THREAD_STACK_ALLOCATOR=y
110 | # CONFIG_CC_STACKPROTECTOR is not set
111 | CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
112 | CONFIG_PGTABLE_LEVELS=2
113 | # CONFIG_HAVE_ARCH_HASH is not set
114 | # CONFIG_ISA_BUS_API is not set
115 | # CONFIG_CPU_NO_EFFICIENT_FFS is not set
116 | # CONFIG_HAVE_ARCH_VMAP_STACK is not set
117 |
118 | #
119 | # GCOV-based kernel profiling
120 | #
121 | # CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
122 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
123 | CONFIG_BASE_SMALL=1
124 | # CONFIG_MODULES is not set
125 | # CONFIG_BLOCK is not set
126 | CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
127 | CONFIG_INLINE_READ_UNLOCK=y
128 | CONFIG_INLINE_READ_UNLOCK_IRQ=y
129 | CONFIG_INLINE_WRITE_UNLOCK=y
130 | CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
131 | CONFIG_NET=y
132 |
133 | #
134 | # Networking options
135 | #
136 | # CONFIG_PACKET is not set
137 | # CONFIG_UNIX is not set
138 | # CONFIG_XFRM_USER is not set
139 | # CONFIG_NET_KEY is not set
140 | CONFIG_INET=y
141 | # CONFIG_IP_MULTICAST is not set
142 | # CONFIG_IP_ADVANCED_ROUTER is not set
143 | CONFIG_IP_PNP=y
144 | CONFIG_IP_PNP_DHCP=y
145 | # CONFIG_IP_PNP_BOOTP is not set
146 | # CONFIG_IP_PNP_RARP is not set
147 | # CONFIG_NET_IPIP is not set
148 | # CONFIG_NET_IPGRE_DEMUX is not set
149 | # CONFIG_NET_IP_TUNNEL is not set
150 | # CONFIG_SYN_COOKIES is not set
151 | # CONFIG_NET_UDP_TUNNEL is not set
152 | # CONFIG_NET_FOU is not set
153 | # CONFIG_INET_AH is not set
154 | # CONFIG_INET_ESP is not set
155 | # CONFIG_INET_IPCOMP is not set
156 | # CONFIG_INET_XFRM_TUNNEL is not set
157 | # CONFIG_INET_TUNNEL is not set
158 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
159 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set
160 | # CONFIG_INET_XFRM_MODE_BEET is not set
161 | # CONFIG_INET_DIAG is not set
162 | CONFIG_TCP_CONG_ADVANCED=y
163 | # CONFIG_TCP_CONG_BIC is not set
164 | # CONFIG_TCP_CONG_CUBIC is not set
165 | # CONFIG_TCP_CONG_WESTWOOD is not set
166 | # CONFIG_TCP_CONG_HTCP is not set
167 | # CONFIG_TCP_CONG_HSTCP is not set
168 | # CONFIG_TCP_CONG_HYBLA is not set
169 | # CONFIG_TCP_CONG_VEGAS is not set
170 | # CONFIG_TCP_CONG_NV is not set
171 | # CONFIG_TCP_CONG_SCALABLE is not set
172 | # CONFIG_TCP_CONG_LP is not set
173 | # CONFIG_TCP_CONG_VENO is not set
174 | # CONFIG_TCP_CONG_YEAH is not set
175 | # CONFIG_TCP_CONG_ILLINOIS is not set
176 | # CONFIG_TCP_CONG_DCTCP is not set
177 | # CONFIG_TCP_CONG_CDG is not set
178 | CONFIG_TCP_CONG_BBR=y
179 | CONFIG_DEFAULT_BBR=y
180 | # CONFIG_DEFAULT_RENO is not set
181 | CONFIG_DEFAULT_TCP_CONG="bbr"
182 | # CONFIG_TCP_MD5SIG is not set
183 | # CONFIG_IPV6 is not set
184 | # CONFIG_NETWORK_SECMARK is not set
185 | # CONFIG_NET_PTP_CLASSIFY is not set
186 | # CONFIG_NETWORK_PHY_TIMESTAMPING is not set
187 | # CONFIG_NETFILTER is not set
188 | # CONFIG_IP_DCCP is not set
189 | # CONFIG_IP_SCTP is not set
190 | # CONFIG_RDS is not set
191 | # CONFIG_TIPC is not set
192 | # CONFIG_ATM is not set
193 | # CONFIG_L2TP is not set
194 | # CONFIG_BRIDGE is not set
195 | CONFIG_HAVE_NET_DSA=y
196 | # CONFIG_VLAN_8021Q is not set
197 | # CONFIG_DECNET is not set
198 | # CONFIG_LLC2 is not set
199 | # CONFIG_IPX is not set
200 | # CONFIG_ATALK is not set
201 | # CONFIG_X25 is not set
202 | # CONFIG_LAPB is not set
203 | # CONFIG_PHONET is not set
204 | # CONFIG_IEEE802154 is not set
205 | CONFIG_NET_SCHED=y
206 |
207 | #
208 | # Queueing/Scheduling
209 | #
210 | # CONFIG_NET_SCH_CBQ is not set
211 | # CONFIG_NET_SCH_HTB is not set
212 | # CONFIG_NET_SCH_HFSC is not set
213 | # CONFIG_NET_SCH_PRIO is not set
214 | # CONFIG_NET_SCH_MULTIQ is not set
215 | # CONFIG_NET_SCH_RED is not set
216 | # CONFIG_NET_SCH_SFB is not set
217 | # CONFIG_NET_SCH_SFQ is not set
218 | # CONFIG_NET_SCH_TEQL is not set
219 | # CONFIG_NET_SCH_TBF is not set
220 | # CONFIG_NET_SCH_GRED is not set
221 | # CONFIG_NET_SCH_DSMARK is not set
222 | # CONFIG_NET_SCH_NETEM is not set
223 | # CONFIG_NET_SCH_DRR is not set
224 | # CONFIG_NET_SCH_MQPRIO is not set
225 | # CONFIG_NET_SCH_CHOKE is not set
226 | # CONFIG_NET_SCH_QFQ is not set
227 | # CONFIG_NET_SCH_CODEL is not set
228 | # CONFIG_NET_SCH_FQ_CODEL is not set
229 | CONFIG_NET_SCH_FQ=y
230 | # CONFIG_NET_SCH_HHF is not set
231 | # CONFIG_NET_SCH_PIE is not set
232 | # CONFIG_NET_SCH_PLUG is not set
233 |
234 | #
235 | # Classification
236 | #
237 | # CONFIG_NET_CLS_BASIC is not set
238 | # CONFIG_NET_CLS_TCINDEX is not set
239 | # CONFIG_NET_CLS_ROUTE4 is not set
240 | # CONFIG_NET_CLS_FW is not set
241 | # CONFIG_NET_CLS_U32 is not set
242 | # CONFIG_NET_CLS_RSVP is not set
243 | # CONFIG_NET_CLS_RSVP6 is not set
244 | # CONFIG_NET_CLS_FLOW is not set
245 | # CONFIG_NET_CLS_BPF is not set
246 | # CONFIG_NET_CLS_FLOWER is not set
247 | # CONFIG_NET_CLS_MATCHALL is not set
248 | # CONFIG_NET_EMATCH is not set
249 | # CONFIG_NET_CLS_ACT is not set
250 | CONFIG_NET_SCH_FIFO=y
251 | # CONFIG_DCB is not set
252 | # CONFIG_BATMAN_ADV is not set
253 | # CONFIG_OPENVSWITCH is not set
254 | # CONFIG_VSOCKETS is not set
255 | # CONFIG_NETLINK_DIAG is not set
256 | # CONFIG_MPLS is not set
257 | # CONFIG_HSR is not set
258 | # CONFIG_NET_SWITCHDEV is not set
259 | # CONFIG_NET_L3_MASTER_DEV is not set
260 | # CONFIG_NET_NCSI is not set
261 | CONFIG_NET_RX_BUSY_POLL=y
262 |
263 | #
264 | # Network testing
265 | #
266 | # CONFIG_NET_PKTGEN is not set
267 | # CONFIG_HAMRADIO is not set
268 | # CONFIG_CAN is not set
269 | # CONFIG_IRDA is not set
270 | # CONFIG_BT is not set
271 | # CONFIG_AF_RXRPC is not set
272 | # CONFIG_AF_KCM is not set
273 | # CONFIG_STREAM_PARSER is not set
274 | # CONFIG_WIRELESS is not set
275 | # CONFIG_WIMAX is not set
276 | # CONFIG_RFKILL is not set
277 | # CONFIG_NET_9P is not set
278 | # CONFIG_CAIF is not set
279 | # CONFIG_CEPH_LIB is not set
280 | # CONFIG_NFC is not set
281 | # CONFIG_LWTUNNEL is not set
282 | # CONFIG_DST_CACHE is not set
283 | # CONFIG_NET_DEVLINK is not set
284 | CONFIG_MAY_USE_DEVLINK=y
285 |
286 | #
287 | # Device Drivers
288 | #
289 |
290 | #
291 | # Generic Driver Options
292 | #
293 | # CONFIG_UEVENT_HELPER is not set
294 | # CONFIG_DEVTMPFS is not set
295 | # CONFIG_STANDALONE is not set
296 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set
297 | # CONFIG_FW_LOADER is not set
298 | # CONFIG_ALLOW_DEV_COREDUMP is not set
299 | # CONFIG_DEBUG_DRIVER is not set
300 | # CONFIG_DEBUG_DEVRES is not set
301 | # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
302 | # CONFIG_SYS_HYPERVISOR is not set
303 | CONFIG_GENERIC_CPU_DEVICES=y
304 | # CONFIG_DMA_SHARED_BUFFER is not set
305 |
306 | #
307 | # Bus devices
308 | #
309 | # CONFIG_CONNECTOR is not set
310 | # CONFIG_MTD is not set
311 | # CONFIG_OF is not set
312 | # CONFIG_PARPORT is not set
313 |
314 | #
315 | # Misc devices
316 | #
317 | # CONFIG_DUMMY_IRQ is not set
318 | # CONFIG_ENCLOSURE_SERVICES is not set
319 | # CONFIG_SRAM is not set
320 | # CONFIG_C2PORT is not set
321 |
322 | #
323 | # EEPROM support
324 | #
325 | # CONFIG_EEPROM_93CX6 is not set
326 |
327 | #
328 | # Texas Instruments shared transport line discipline
329 | #
330 |
331 | #
332 | # Altera FPGA firmware download module
333 | #
334 |
335 | #
336 | # Intel MIC Bus Driver
337 | #
338 |
339 | #
340 | # SCIF Bus Driver
341 | #
342 |
343 | #
344 | # VOP Bus Driver
345 | #
346 |
347 | #
348 | # Intel MIC Host Driver
349 | #
350 |
351 | #
352 | # Intel MIC Card Driver
353 | #
354 |
355 | #
356 | # SCIF Driver
357 | #
358 |
359 | #
360 | # Intel MIC Coprocessor State Management (COSM) Drivers
361 | #
362 |
363 | #
364 | # VOP Driver
365 | #
366 | # CONFIG_ECHO is not set
367 | # CONFIG_CXL_BASE is not set
368 | # CONFIG_CXL_AFU_DRIVER_OPS is not set
369 |
370 | #
371 | # SCSI device support
372 | #
373 | CONFIG_SCSI_MOD=y
374 | # CONFIG_SCSI_DMA is not set
375 | # CONFIG_SCSI_NETLINK is not set
376 | CONFIG_NETDEVICES=y
377 | CONFIG_NET_CORE=y
378 | # CONFIG_BONDING is not set
379 | # CONFIG_DUMMY is not set
380 | # CONFIG_EQUALIZER is not set
381 | # CONFIG_NET_TEAM is not set
382 | # CONFIG_MACVLAN is not set
383 | # CONFIG_VXLAN is not set
384 | # CONFIG_MACSEC is not set
385 | # CONFIG_NETCONSOLE is not set
386 | # CONFIG_NETPOLL is not set
387 | # CONFIG_NET_POLL_CONTROLLER is not set
388 | # CONFIG_TUN is not set
389 | # CONFIG_TUN_VNET_CROSS_LE is not set
390 | # CONFIG_VETH is not set
391 | CONFIG_VIRTIO_NET=y
392 | # CONFIG_NLMON is not set
393 |
394 | #
395 | # CAIF transport drivers
396 | #
397 |
398 | #
399 | # Distributed Switch Architecture drivers
400 | #
401 | # CONFIG_ETHERNET is not set
402 | # CONFIG_PHYLIB is not set
403 | # CONFIG_PPP is not set
404 |
405 | #
406 | # Host-side USB support is needed for USB Network Adapter support
407 | #
408 | # CONFIG_WLAN is not set
409 |
410 | #
411 | # Enable WiMAX (Networking options) to see the WiMAX drivers
412 | #
413 | # CONFIG_WAN is not set
414 | # CONFIG_ISDN is not set
415 |
416 | #
417 | # Input device support
418 | #
419 | # CONFIG_INPUT is not set
420 |
421 | #
422 | # Hardware I/O ports
423 | #
424 | # CONFIG_SERIO is not set
425 | # CONFIG_GAMEPORT is not set
426 |
427 | #
428 | # Character devices
429 | #
430 | # CONFIG_TTY is not set
431 | # CONFIG_DEVMEM is not set
432 | # CONFIG_DEVKMEM is not set
433 | # CONFIG_IPMI_HANDLER is not set
434 | # CONFIG_HW_RANDOM is not set
435 |
436 | #
437 | # PCMCIA character devices
438 | #
439 | # CONFIG_TCG_TPM is not set
440 |
441 | #
442 | # I2C support
443 | #
444 | # CONFIG_I2C is not set
445 | # CONFIG_SPI is not set
446 | # CONFIG_SPMI is not set
447 | # CONFIG_HSI is not set
448 |
449 | #
450 | # PPS support
451 | #
452 | # CONFIG_PPS is not set
453 |
454 | #
455 | # PPS generators support
456 | #
457 |
458 | #
459 | # PTP clock support
460 | #
461 | # CONFIG_PTP_1588_CLOCK is not set
462 |
463 | #
464 | # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
465 | #
466 | # CONFIG_GPIOLIB is not set
467 | # CONFIG_W1 is not set
468 | # CONFIG_POWER_AVS is not set
469 | # CONFIG_POWER_RESET is not set
470 | # CONFIG_POWER_SUPPLY is not set
471 | # CONFIG_HWMON is not set
472 | # CONFIG_THERMAL is not set
473 | # CONFIG_WATCHDOG is not set
474 | CONFIG_SSB_POSSIBLE=y
475 |
476 | #
477 | # Sonics Silicon Backplane
478 | #
479 | # CONFIG_SSB is not set
480 | CONFIG_BCMA_POSSIBLE=y
481 |
482 | #
483 | # Broadcom specific AMBA
484 | #
485 | # CONFIG_BCMA is not set
486 |
487 | #
488 | # Multifunction device drivers
489 | #
490 | # CONFIG_MFD_CORE is not set
491 | # CONFIG_HTC_PASIC3 is not set
492 | # CONFIG_MFD_KEMPLD is not set
493 | # CONFIG_MFD_MT6397 is not set
494 | # CONFIG_MFD_SM501 is not set
495 | # CONFIG_ABX500_CORE is not set
496 | # CONFIG_MFD_SYSCON is not set
497 | # CONFIG_MFD_TI_AM335X_TSCADC is not set
498 | # CONFIG_MFD_TMIO is not set
499 | # CONFIG_REGULATOR is not set
500 | # CONFIG_MEDIA_SUPPORT is not set
501 |
502 | #
503 | # Graphics support
504 | #
505 |
506 | #
507 | # ACP (Audio CoProcessor) Configuration
508 | #
509 |
510 | #
511 | # Frame buffer Devices
512 | #
513 | # CONFIG_FB is not set
514 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
515 | # CONFIG_VGASTATE is not set
516 | # CONFIG_SOUND is not set
517 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y
518 | # CONFIG_USB_SUPPORT is not set
519 | # CONFIG_UWB is not set
520 | # CONFIG_MMC is not set
521 | # CONFIG_MEMSTICK is not set
522 | # CONFIG_NEW_LEDS is not set
523 | # CONFIG_ACCESSIBILITY is not set
524 | # CONFIG_RTC_CLASS is not set
525 | # CONFIG_DMADEVICES is not set
526 |
527 | #
528 | # DMABUF options
529 | #
530 | # CONFIG_SYNC_FILE is not set
531 | # CONFIG_AUXDISPLAY is not set
532 | # CONFIG_VIRT_DRIVERS is not set
533 | CONFIG_VIRTIO=y
534 |
535 | #
536 | # Virtio drivers
537 | #
538 | CONFIG_VIRTIO_BALLOON=y
539 | CONFIG_VIRTIO_MMIO=y
540 | CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
541 |
542 | #
543 | # Microsoft Hyper-V guest support
544 | #
545 | # CONFIG_STAGING is not set
546 |
547 | #
548 | # Hardware Spinlock drivers
549 | #
550 |
551 | #
552 | # Clock Source drivers
553 | #
554 | # CONFIG_ATMEL_PIT is not set
555 | # CONFIG_SH_TIMER_CMT is not set
556 | # CONFIG_SH_TIMER_MTU2 is not set
557 | # CONFIG_SH_TIMER_TMU is not set
558 | # CONFIG_EM_TIMER_STI is not set
559 | # CONFIG_MAILBOX is not set
560 |
561 | #
562 | # Remoteproc drivers
563 | #
564 | # CONFIG_REMOTEPROC is not set
565 |
566 | #
567 | # Rpmsg drivers
568 | #
569 |
570 | #
571 | # SOC (System On Chip) specific Drivers
572 | #
573 |
574 | #
575 | # Broadcom SoC drivers
576 | #
577 | # CONFIG_SUNXI_SRAM is not set
578 | # CONFIG_SOC_TI is not set
579 | # CONFIG_PM_DEVFREQ is not set
580 | # CONFIG_EXTCON is not set
581 | # CONFIG_MEMORY is not set
582 | # CONFIG_IIO is not set
583 | # CONFIG_PWM is not set
584 | CONFIG_ARM_GIC_MAX_NR=1
585 | # CONFIG_IPACK_BUS is not set
586 | # CONFIG_RESET_CONTROLLER is not set
587 | # CONFIG_FMC is not set
588 |
589 | #
590 | # PHY Subsystem
591 | #
592 | # CONFIG_GENERIC_PHY is not set
593 | # CONFIG_PHY_PXA_28NM_HSIC is not set
594 | # CONFIG_PHY_PXA_28NM_USB2 is not set
595 | # CONFIG_BCM_KONA_USB2_PHY is not set
596 | # CONFIG_POWERCAP is not set
597 | # CONFIG_MCB is not set
598 |
599 | #
600 | # Performance monitor support
601 | #
602 | # CONFIG_RAS is not set
603 |
604 | #
605 | # Android
606 | #
607 | # CONFIG_ANDROID is not set
608 | # CONFIG_NVMEM is not set
609 | # CONFIG_STM is not set
610 | # CONFIG_INTEL_TH is not set
611 |
612 | #
613 | # FPGA Configuration Support
614 | #
615 | # CONFIG_FPGA is not set
616 |
617 | #
618 | # File systems
619 | #
620 | # CONFIG_FS_POSIX_ACL is not set
621 | # CONFIG_EXPORTFS_BLOCK_OPS is not set
622 | # CONFIG_FILE_LOCKING is not set
623 | # CONFIG_FSNOTIFY is not set
624 | # CONFIG_DNOTIFY is not set
625 | # CONFIG_INOTIFY_USER is not set
626 | # CONFIG_FANOTIFY is not set
627 | # CONFIG_QUOTA is not set
628 | # CONFIG_QUOTACTL is not set
629 | # CONFIG_AUTOFS4_FS is not set
630 | # CONFIG_FUSE_FS is not set
631 | # CONFIG_OVERLAY_FS is not set
632 |
633 | #
634 | # Caches
635 | #
636 | # CONFIG_FSCACHE is not set
637 |
638 | #
639 | # Pseudo filesystems
640 | #
641 | CONFIG_PROC_FS=y
642 | CONFIG_PROC_SYSCTL=y
643 | # CONFIG_PROC_CHILDREN is not set
644 | # CONFIG_KERNFS is not set
645 | # CONFIG_SYSFS is not set
646 | # CONFIG_HUGETLB_PAGE is not set
647 | # CONFIG_CONFIGFS_FS is not set
648 | # CONFIG_MISC_FILESYSTEMS is not set
649 | # CONFIG_NETWORK_FILESYSTEMS is not set
650 | # CONFIG_NLS is not set
651 | CONFIG_FLATMEM=y
652 | CONFIG_FLAT_NODE_MEM_MAP=y
653 | # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
654 | CONFIG_SPLIT_PTLOCK_CPUS=999999
655 | CONFIG_MEMORY_BALLOON=y
656 | CONFIG_PHYS_ADDR_T_64BIT=y
657 | CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1
658 | CONFIG_NEED_PER_CPU_KM=y
659 | # CONFIG_CLEANCACHE is not set
660 | # CONFIG_ZPOOL is not set
661 | # CONFIG_ZBUD is not set
662 | CONFIG_PREEMPT_NONE=y
663 | # CONFIG_PREEMPT_VOLUNTARY is not set
664 | # CONFIG_PREEMPT is not set
665 | CONFIG_HZ_100=y
666 | # CONFIG_HZ_250 is not set
667 | # CONFIG_HZ_300 is not set
668 | # CONFIG_HZ_1000 is not set
669 | CONFIG_HZ=100
670 | CONFIG_SCHED_HRTICK=y
671 |
672 | #
673 | # Security options
674 | #
675 | # CONFIG_KEYS is not set
676 | # CONFIG_SECURITY_DMESG_RESTRICT is not set
677 | # CONFIG_SECURITYFS is not set
678 | CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
679 | CONFIG_DEFAULT_SECURITY_DAC=y
680 | CONFIG_DEFAULT_SECURITY=""
681 | CONFIG_CRYPTO=y
682 |
683 | #
684 | # Crypto core or helper
685 | #
686 | CONFIG_CRYPTO_ALGAPI=y
687 | CONFIG_CRYPTO_ALGAPI2=y
688 | # CONFIG_CRYPTO_RSA is not set
689 | # CONFIG_CRYPTO_DH is not set
690 | # CONFIG_CRYPTO_ECDH is not set
691 | # CONFIG_CRYPTO_MANAGER is not set
692 | # CONFIG_CRYPTO_MANAGER2 is not set
693 | # CONFIG_CRYPTO_USER is not set
694 | # CONFIG_CRYPTO_GF128MUL is not set
695 | # CONFIG_CRYPTO_NULL is not set
696 | # CONFIG_CRYPTO_CRYPTD is not set
697 | # CONFIG_CRYPTO_MCRYPTD is not set
698 | # CONFIG_CRYPTO_AUTHENC is not set
699 |
700 | #
701 | # Authenticated Encryption with Associated Data
702 | #
703 | # CONFIG_CRYPTO_CCM is not set
704 | # CONFIG_CRYPTO_GCM is not set
705 | # CONFIG_CRYPTO_CHACHA20POLY1305 is not set
706 | # CONFIG_CRYPTO_SEQIV is not set
707 | # CONFIG_CRYPTO_ECHAINIV is not set
708 |
709 | #
710 | # Block modes
711 | #
712 | # CONFIG_CRYPTO_CBC is not set
713 | # CONFIG_CRYPTO_CTR is not set
714 | # CONFIG_CRYPTO_CTS is not set
715 | # CONFIG_CRYPTO_ECB is not set
716 | # CONFIG_CRYPTO_LRW is not set
717 | # CONFIG_CRYPTO_PCBC is not set
718 | # CONFIG_CRYPTO_XTS is not set
719 | # CONFIG_CRYPTO_KEYWRAP is not set
720 |
721 | #
722 | # Hash modes
723 | #
724 | # CONFIG_CRYPTO_CMAC is not set
725 | # CONFIG_CRYPTO_HMAC is not set
726 | # CONFIG_CRYPTO_XCBC is not set
727 | # CONFIG_CRYPTO_VMAC is not set
728 |
729 | #
730 | # Digest
731 | #
732 | # CONFIG_CRYPTO_CRC32C is not set
733 | # CONFIG_CRYPTO_CRC32 is not set
734 | # CONFIG_CRYPTO_CRCT10DIF is not set
735 | # CONFIG_CRYPTO_GHASH is not set
736 | # CONFIG_CRYPTO_POLY1305 is not set
737 | # CONFIG_CRYPTO_MD4 is not set
738 | # CONFIG_CRYPTO_MD5 is not set
739 | # CONFIG_CRYPTO_MICHAEL_MIC is not set
740 | # CONFIG_CRYPTO_RMD128 is not set
741 | # CONFIG_CRYPTO_RMD160 is not set
742 | # CONFIG_CRYPTO_RMD256 is not set
743 | # CONFIG_CRYPTO_RMD320 is not set
744 | # CONFIG_CRYPTO_SHA1 is not set
745 | # CONFIG_CRYPTO_SHA256 is not set
746 | # CONFIG_CRYPTO_SHA512 is not set
747 | # CONFIG_CRYPTO_SHA3 is not set
748 | # CONFIG_CRYPTO_TGR192 is not set
749 | # CONFIG_CRYPTO_WP512 is not set
750 |
751 | #
752 | # Ciphers
753 | #
754 | CONFIG_CRYPTO_AES=y
755 | # CONFIG_CRYPTO_ANUBIS is not set
756 | # CONFIG_CRYPTO_ARC4 is not set
757 | # CONFIG_CRYPTO_BLOWFISH is not set
758 | # CONFIG_CRYPTO_CAMELLIA is not set
759 | # CONFIG_CRYPTO_CAST5 is not set
760 | # CONFIG_CRYPTO_CAST6 is not set
761 | # CONFIG_CRYPTO_DES is not set
762 | # CONFIG_CRYPTO_FCRYPT is not set
763 | # CONFIG_CRYPTO_KHAZAD is not set
764 | # CONFIG_CRYPTO_SALSA20 is not set
765 | # CONFIG_CRYPTO_CHACHA20 is not set
766 | # CONFIG_CRYPTO_SEED is not set
767 | # CONFIG_CRYPTO_SERPENT is not set
768 | # CONFIG_CRYPTO_TEA is not set
769 | # CONFIG_CRYPTO_TWOFISH is not set
770 |
771 | #
772 | # Compression
773 | #
774 | # CONFIG_CRYPTO_DEFLATE is not set
775 | # CONFIG_CRYPTO_LZO is not set
776 | # CONFIG_CRYPTO_842 is not set
777 | # CONFIG_CRYPTO_LZ4 is not set
778 | # CONFIG_CRYPTO_LZ4HC is not set
779 |
780 | #
781 | # Random Number Generation
782 | #
783 | # CONFIG_CRYPTO_ANSI_CPRNG is not set
784 | # CONFIG_CRYPTO_DRBG_MENU is not set
785 | # CONFIG_CRYPTO_JITTERENTROPY is not set
786 | # CONFIG_CRYPTO_USER_API_HASH is not set
787 | # CONFIG_CRYPTO_USER_API_SKCIPHER is not set
788 | # CONFIG_CRYPTO_USER_API_RNG is not set
789 | # CONFIG_CRYPTO_USER_API_AEAD is not set
790 | # CONFIG_CRYPTO_HW is not set
791 |
792 | #
793 | # Certificates for signature checking
794 | #
795 | # CONFIG_BINARY_PRINTF is not set
796 |
797 | #
798 | # Library routines
799 | #
800 | CONFIG_GENERIC_NET_UTILS=y
801 | CONFIG_GENERIC_IO=y
802 | # CONFIG_CRC_CCITT is not set
803 | # CONFIG_CRC16 is not set
804 | # CONFIG_CRC_T10DIF is not set
805 | # CONFIG_CRC_ITU_T is not set
806 | # CONFIG_CRC32 is not set
807 | # CONFIG_CRC7 is not set
808 | # CONFIG_LIBCRC32C is not set
809 | # CONFIG_CRC8 is not set
810 | # CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
811 | # CONFIG_RANDOM32_SELFTEST is not set
812 | # CONFIG_XZ_DEC is not set
813 | # CONFIG_XZ_DEC_BCJ is not set
814 | CONFIG_HAS_IOMEM=y
815 | CONFIG_HAS_DMA=y
816 | CONFIG_NLATTR=y
817 | CONFIG_GENERIC_ATOMIC64=y
818 | # CONFIG_CORDIC is not set
819 | # CONFIG_DDR is not set
820 | # CONFIG_IRQ_POLL is not set
821 | # CONFIG_SG_SPLIT is not set
822 | # CONFIG_SG_POOL is not set
823 | # CONFIG_ARCH_HAS_SG_CHAIN is not set
824 |
825 | #
826 | # printk and dmesg options
827 | #
828 | CONFIG_PRINTK_TIME=y
829 | CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
830 | CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
831 |
832 | #
833 | # Compile-time checks and compiler options
834 | #
835 | # CONFIG_DEBUG_INFO is not set
836 | # CONFIG_ENABLE_WARN_DEPRECATED is not set
837 | # CONFIG_ENABLE_MUST_CHECK is not set
838 | CONFIG_FRAME_WARN=2048
839 | # CONFIG_STRIP_ASM_SYMS is not set
840 | # CONFIG_READABLE_ASM is not set
841 | # CONFIG_UNUSED_SYMBOLS is not set
842 | # CONFIG_DEBUG_FS is not set
843 | # CONFIG_HEADERS_CHECK is not set
844 | # CONFIG_DEBUG_SECTION_MISMATCH is not set
845 | # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
846 | CONFIG_ARCH_WANT_FRAME_POINTERS=y
847 | # CONFIG_FRAME_POINTER is not set
848 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
849 | # CONFIG_MAGIC_SYSRQ is not set
850 | CONFIG_DEBUG_KERNEL=y
851 |
852 | #
853 | # Memory Debugging
854 | #
855 | # CONFIG_PAGE_EXTENSION is not set
856 | # CONFIG_DEBUG_PAGEALLOC is not set
857 | # CONFIG_PAGE_POISONING is not set
858 | # CONFIG_DEBUG_OBJECTS is not set
859 | # CONFIG_DEBUG_STACK_USAGE is not set
860 | # CONFIG_DEBUG_VM is not set
861 | # CONFIG_DEBUG_NOMMU_REGIONS is not set
862 | # CONFIG_DEBUG_MEMORY_INIT is not set
863 | # CONFIG_DEBUG_SHIRQ is not set
864 |
865 | #
866 | # Debug Lockups and Hangs
867 | #
868 | # CONFIG_LOCKUP_DETECTOR is not set
869 | # CONFIG_DETECT_HUNG_TASK is not set
870 | # CONFIG_WQ_WATCHDOG is not set
871 | # CONFIG_PANIC_ON_OOPS is not set
872 | CONFIG_PANIC_ON_OOPS_VALUE=0
873 | CONFIG_PANIC_TIMEOUT=0
874 | # CONFIG_SCHED_DEBUG is not set
875 | # CONFIG_SCHED_INFO is not set
876 | # CONFIG_SCHEDSTATS is not set
877 | # CONFIG_SCHED_STACK_END_CHECK is not set
878 | # CONFIG_DEBUG_TIMEKEEPING is not set
879 | # CONFIG_TIMER_STATS is not set
880 |
881 | #
882 | # Lock Debugging (spinlocks, mutexes, etc...)
883 | #
884 | # CONFIG_DEBUG_SPINLOCK is not set
885 | # CONFIG_DEBUG_MUTEXES is not set
886 | # CONFIG_DEBUG_ATOMIC_SLEEP is not set
887 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
888 | # CONFIG_LOCK_TORTURE_TEST is not set
889 | # CONFIG_DEBUG_KOBJECT is not set
890 | # CONFIG_DEBUG_LIST is not set
891 | # CONFIG_DEBUG_PI_LIST is not set
892 | # CONFIG_DEBUG_SG is not set
893 | # CONFIG_DEBUG_NOTIFIERS is not set
894 | # CONFIG_DEBUG_CREDENTIALS is not set
895 |
896 | #
897 | # RCU Debugging
898 | #
899 | # CONFIG_PROVE_RCU is not set
900 | # CONFIG_SPARSE_RCU_POINTER is not set
901 | # CONFIG_TORTURE_TEST is not set
902 | # CONFIG_RCU_PERF_TEST is not set
903 | # CONFIG_RCU_TORTURE_TEST is not set
904 | # CONFIG_RCU_TRACE is not set
905 | # CONFIG_RCU_EQS_DEBUG is not set
906 | # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
907 | # CONFIG_NOTIFIER_ERROR_INJECTION is not set
908 | # CONFIG_FAULT_INJECTION is not set
909 |
910 | #
911 | # Runtime Testing
912 | #
913 | # CONFIG_TEST_LIST_SORT is not set
914 | # CONFIG_BACKTRACE_SELF_TEST is not set
915 | # CONFIG_RBTREE_TEST is not set
916 | # CONFIG_ATOMIC64_SELFTEST is not set
917 | # CONFIG_TEST_HEXDUMP is not set
918 | # CONFIG_TEST_STRING_HELPERS is not set
919 | # CONFIG_TEST_KSTRTOX is not set
920 | # CONFIG_TEST_PRINTF is not set
921 | # CONFIG_TEST_BITMAP is not set
922 | # CONFIG_TEST_UUID is not set
923 | # CONFIG_TEST_RHASHTABLE is not set
924 | # CONFIG_TEST_HASH is not set
925 | # CONFIG_TEST_UDELAY is not set
926 | # CONFIG_BUG_ON_DATA_CORRUPTION is not set
927 | # CONFIG_SAMPLES is not set
928 | # CONFIG_ARCH_WANTS_UBSAN_NO_NULL is not set
929 | # CONFIG_UBSAN is not set
930 |
--------------------------------------------------------------------------------
/ovz-bbr/config/haproxy.build.args:
--------------------------------------------------------------------------------
1 | make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy
2 |
--------------------------------------------------------------------------------
/ovz-bbr/lib64/liblkl-hijack.so-20170419:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuoruan/shell-scripts/45f96e24c4abd9f4a81b9af11727f68d2b0c57ad/ovz-bbr/lib64/liblkl-hijack.so-20170419
--------------------------------------------------------------------------------
/ovz-bbr/lib64/liblkl-hijack.so-20170424:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuoruan/shell-scripts/45f96e24c4abd9f4a81b9af11727f68d2b0c57ad/ovz-bbr/lib64/liblkl-hijack.so-20170424
--------------------------------------------------------------------------------
/ovz-bbr/lib64/liblkl-hijack.so-20170724:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuoruan/shell-scripts/45f96e24c4abd9f4a81b9af11727f68d2b0c57ad/ovz-bbr/lib64/liblkl-hijack.so-20170724
--------------------------------------------------------------------------------
/ovz-bbr/ovz-bbr-installer.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | : <<-'EOF'
4 | Copyright 2017-2019 Xingwang Liao
5 | Licensed under the Apache License, Version 2.0 (the "License");
6 | you may not use this file except in compliance with the License.
7 | You may obtain a copy of the License at
8 | http://www.apache.org/licenses/LICENSE-2.0
9 | Unless required by applicable law or agreed to in writing, software
10 | distributed under the License is distributed on an "AS IS" BASIS,
11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | See the License for the specific language governing permissions and
13 | limitations under the License.
14 | EOF
15 |
16 | export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
17 |
18 | # Haproxy-lkl 服务名称
19 | SERVICE_NAME='haproxy-lkl'
20 | # Haproxy-lkl 默认安装路径,修改之后需要同时修改服务启动文件
21 | HAPROXY_LKL_DIR="/usr/local/$SERVICE_NAME"
22 |
23 | BASE_URL='https://github.com/kuoruan/shell-scripts/raw/master/ovz-bbr'
24 | HAPROXY_BIN_URL="${BASE_URL}/bin/haproxy.linux2628_x86_64"
25 | HAPROXY_LKL_BIN_URL="${BASE_URL}/bin/haproxy-lkl.sh"
26 | HAPROXY_LKL_SERVICE_FILE_DEBIAN_URL="${BASE_URL}/startup/haproxy-lkl.init.debain"
27 | HAPROXY_LKL_SERVICE_FILE_REDHAT_URL="${BASE_URL}/startup/haproxy-lkl.init.redhat"
28 | HAPROXY_LKL_SYSTEMD_FILE_URL="${BASE_URL}/startup/haproxy-lkl.systemd"
29 | LKL_LIB_URL="${BASE_URL}/lib64/liblkl-hijack.so-20170724"
30 | LKL_LIB_MD5='b50fc6a7ccfc70c76f44506814e7e18b'
31 |
32 | # 需要 BBR 加速的端口
33 | ACCELERATE_PORT=
34 |
35 | clear
36 |
37 | cat >&2 <<-'EOF'
38 | #######################################################
39 | # OpenVZ BBR 一键安装脚本 #
40 | # 该脚本用于在 OpenVZ 服务器上安装配置 Google BBR #
41 | # 脚本作者: Xingwang Liao #
42 | # 作者博客: https://blog.kuoruan.com/ #
43 | # Github: https://github.com/kuoruan/shell-scripts #
44 | # QQ交流群: 43391448, 68133628 #
45 | # 633945405 #
46 | #######################################################
47 | EOF
48 |
49 | command_exists() {
50 | command -v "$@" >/dev/null 2>&1
51 | }
52 |
53 | check_root() {
54 | local user="$(id -un 2>/dev/null || true)"
55 | if [ "$user" != "root" ]; then
56 | cat >&2 <<-'EOF'
57 | 权限错误, 请使用 root 用户运行此脚本!
58 | EOF
59 | exit 1
60 | fi
61 | }
62 |
63 | check_ovz() {
64 | if [ ! -d /proc/vz ]; then
65 | cat >&2 <<-'EOF'
66 | 当前服务器好像不是 OpenVZ 架构,你可以直接更换内核以启用 BBR。
67 | 当然,你也可以继续安装。
68 | EOF
69 | any_key_to_continue
70 | fi
71 | }
72 |
73 | check_ldd() {
74 | local ldd_version="$(ldd --version 2>/dev/null | grep 'ldd' | rev | cut -d ' ' -f1 | rev)"
75 | if [ -n "$ldd_version" ]; then
76 | if [ "${ldd_version%.*}" -eq "2" -a "${ldd_version#*.}" -lt "14" ] || \
77 | [ "${ldd_version%.*}" -lt "2" ]; then
78 | cat >&2 <<-EOF
79 | 当前服务器的 glibc 版本为 $ldd_version。
80 | 最低版本需求 2.14,低于这个版本无法正常使用。
81 | 请先更新 glibc 之后再运行脚本。
82 | EOF
83 | exit 1
84 | fi
85 | else
86 | cat >&2 <<-EOF
87 | 获取 glibc 版本失败,请手动检查:
88 | ldd --version
89 | 最低版本需求 2.14,低于这个版本可能无法正常使用。
90 | EOF
91 |
92 | ( set -x; ldd --version 2>/dev/null )
93 | any_key_to_continue
94 | fi
95 | }
96 |
97 | check_arch() {
98 | architecture=$(uname -m)
99 | case $architecture in
100 | amd64|x86_64)
101 | ;;
102 | *)
103 | cat 1>&2 <<-EOF
104 | 当前脚本仅支持 64 位系统,你的系统为: $architecture
105 | 你可以尝试从源码编译安装 Linux Kernel Library
106 | https://github.com/lkl/linux
107 | EOF
108 | exit 1
109 | ;;
110 | esac
111 | }
112 |
113 | any_key_to_continue() {
114 | echo "请按任意键继续或 Ctrl + C 退出"
115 | local saved="$(stty -g)"
116 | stty -echo
117 | stty cbreak
118 | dd if=/dev/tty bs=1 count=1 2> /dev/null
119 | stty -raw
120 | stty echo
121 | stty $saved
122 | }
123 |
124 | get_os_info() {
125 | lsb_dist=''
126 | dist_version=''
127 | if command_exists lsb_release; then
128 | lsb_dist="$(lsb_release -si)"
129 | fi
130 |
131 | if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then
132 | lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")"
133 | fi
134 | if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then
135 | lsb_dist='debian'
136 | fi
137 | if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then
138 | lsb_dist='fedora'
139 | fi
140 | if [ -z "$lsb_dist" ] && [ -r /etc/oracle-release ]; then
141 | lsb_dist='oracleserver'
142 | fi
143 | if [ -z "$lsb_dist" ] && [ -r /etc/centos-release ]; then
144 | lsb_dist='centos'
145 | fi
146 | if [ -z "$lsb_dist" ] && [ -r /etc/redhat-release ]; then
147 | lsb_dist='redhat'
148 | fi
149 | if [ -z "$lsb_dist" ] && [ -r /etc/photon-release ]; then
150 | lsb_dist='photon'
151 | fi
152 | if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then
153 | lsb_dist="$(. /etc/os-release && echo "$ID")"
154 | fi
155 |
156 | lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')"
157 |
158 | if [ "${lsb_dist}" = "redhatenterpriseserver" ]; then
159 | lsb_dist='redhat'
160 | fi
161 |
162 | case "$lsb_dist" in
163 | ubuntu)
164 | if command_exists lsb_release; then
165 | dist_version="$(lsb_release --codename | cut -f2)"
166 | fi
167 | if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then
168 | dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")"
169 | fi
170 | ;;
171 |
172 | debian|raspbian)
173 | dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')"
174 | case "$dist_version" in
175 | 9)
176 | dist_version="stretch"
177 | ;;
178 | 8)
179 | dist_version="jessie"
180 | ;;
181 | 7)
182 | dist_version="wheezy"
183 | ;;
184 | esac
185 | ;;
186 |
187 | oracleserver)
188 | lsb_dist="oraclelinux"
189 | dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')"
190 | ;;
191 |
192 | fedora|centos|redhat)
193 | dist_version="$(rpm -q --whatprovides ${lsb_dist}-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//' | sort | tail -1)"
194 | ;;
195 |
196 | "vmware photon")
197 | lsb_dist="photon"
198 | dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
199 | ;;
200 |
201 | *)
202 | if command_exists lsb_release; then
203 | dist_version="$(lsb_release --codename | cut -f2)"
204 | fi
205 | if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then
206 | dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
207 | fi
208 | ;;
209 | esac
210 |
211 | if [ -z "$lsb_dist" -o -z "$dist_version" ]; then
212 | cat >&2 <<-EOF
213 | 无法确定服务器系统版本信息。
214 | 请联系脚本作者。
215 | EOF
216 | exit 1
217 | fi
218 | }
219 |
220 | install_deps() {
221 | ip_support_tuntap() {
222 | command_exists ip && ip tuntap >/dev/null 2>&1
223 | }
224 | case "$lsb_dist" in
225 | ubuntu|debian|raspbian)
226 | local did_apt_get_update=
227 | apt_get_update() {
228 | if [ -z "$did_apt_get_update" ]; then
229 | ( set -x; sleep 3; apt-get update )
230 | did_apt_get_update=1
231 | fi
232 | }
233 |
234 | if ! command_exists wget; then
235 | apt_get_update
236 | ( set -x; sleep 3; apt-get install -y -q wget ca-certificates )
237 | fi
238 |
239 | if ! command_exists ip; then
240 | apt_get_update
241 | ( set -x; sleep 3; apt-get install -y -q iproute )
242 | fi
243 |
244 | if ! command_exists timeout; then
245 | apt_get_update
246 | ( set -x; sleep 3; apt-get install -y -q coreutils )
247 | fi
248 |
249 | if ! command_exists iptables; then
250 | apt_get_update
251 | ( set -x; sleep 3; apt-get install -y -q iptables )
252 | fi
253 |
254 | if ! ip_support_tuntap; then
255 | apt_get_update
256 | ( set -x; sleep 3; apt-get install -y -q uml-utilities )
257 | fi
258 | ;;
259 | fedora|centos|redhat|oraclelinux|photon)
260 | if [ "$lsb_dist" = "fedora" ] && [ "$dist_version" -ge "22" ]; then
261 | if ! command_exists wget; then
262 | ( set -x; sleep 3; dnf -y -q install wget ca-certificates )
263 | fi
264 |
265 | if ! command_exists ip; then
266 | ( set -x; sleep 3; dnf -y -q install iproute )
267 | fi
268 |
269 | if ! command_exists timeout; then
270 | ( set -x; sleep 3; dnf -y -q install coreutils )
271 | fi
272 |
273 | if ! command_exists iptables; then
274 | ( set -x; sleep 3; dnf -y -q install iptables )
275 | fi
276 |
277 | if ! ip_support_tuntap && ! command_exists tunctl; then
278 | ( set -x; sleep 3; dnf -y -q install tunctl )
279 | fi
280 | elif [ "$lsb_dist" = "photon" ]; then
281 | if ! command_exists wget; then
282 | ( set -x; sleep 3; tdnf -y install wget ca-certificates )
283 | fi
284 |
285 | if ! command_exists ip; then
286 | ( set -x; sleep 3; tdnf -y install iproute )
287 | fi
288 |
289 | if ! command_exists timeout; then
290 | ( set -x; sleep 3; tdnf -y install coreutils )
291 | fi
292 |
293 | if ! command_exists iptables; then
294 | ( set -x; sleep 3; tdnf -y install iptables )
295 | fi
296 |
297 | if ! ip_support_tuntap && ! command_exists tunctl; then
298 | ( set -x; sleep 3; tdnf -y install tunctl )
299 | fi
300 | else
301 | if ! command_exists wget; then
302 | ( set -x; sleep 3; yum -y -q install wget ca-certificates )
303 | fi
304 |
305 | if ! command_exists ip; then
306 | ( set -x; sleep 3; yum -y -q install iproute )
307 | fi
308 |
309 | if ! command_exists timeout; then
310 | ( set -x; sleep 3; yum -y -q install coreutils )
311 | fi
312 |
313 | if ! command_exists iptables firewall-cmd; then
314 | ( set -x; sleep 3; yum -y -q install iptables )
315 | fi
316 |
317 | if ! ip_support_tuntap && ! command_exists tunctl; then
318 | ( set -x; sleep 3; yum -y -q install tunctl )
319 | fi
320 | fi
321 | ;;
322 | *)
323 | cat >&2 <<-EOF
324 | 暂时不支持当前系统:${lsb_dist} ${dist_version}
325 | EOF
326 |
327 | exit 1
328 | ;;
329 | esac
330 | }
331 |
332 | check_nat_create() {
333 | if ( command_exists ip && ip tuntap >/dev/null 2>&1 ); then
334 | (
335 | set -x
336 | ip tuntap del dev lkl-tap-test mode tap >/dev/null 2>&1
337 | ip tuntap add dev lkl-tap-test mode tap
338 | )
339 | elif command_exists tunctl; then
340 | (
341 | set -x
342 | tunctl -d lkl-tap-test >/dev/null 2>&1
343 | tunctl -t lkl-tap-test
344 | )
345 | else
346 | cat >&2 <<-'EOF'
347 | 无法找到已安装的 ip 命令(支持 tuntap) 或者 tunctl
348 | 应该是脚本自动安装失败了。
349 | 请手动安装 iproute 和 tunctl
350 | EOF
351 | exit 1
352 | fi
353 |
354 | if [ "$?" != "0" ]; then
355 | cat >&2 <<-'EOF'
356 | 无法创建 NAT 网络。
357 | 由于某些服务商的 VPS 无法创建 NAT 网络,
358 | 所以不支持用此方法开启 BBR,安装脚本将会退出。
359 | EOF
360 | exit 1
361 | fi
362 | }
363 |
364 | download_file() {
365 | local url=$1
366 | local file=$2
367 |
368 | ( set -x; wget -O "$file" --no-check-certificate "$url" )
369 | if [ "$?" != "0" ]; then
370 | cat >&2 <<-EOF
371 | 一些文件下载失败!安装脚本需要能访问到 github.com,请检查服务器网络。
372 | 注意: 一些国内服务器可能无法正常访问 github.com。
373 | EOF
374 |
375 | exit 1
376 | fi
377 | }
378 |
379 | install_haproxy() {
380 | (
381 | set -x
382 | mkdir -p "${HAPROXY_LKL_DIR}"/etc \
383 | "${HAPROXY_LKL_DIR}"/lib64 \
384 | "${HAPROXY_LKL_DIR}"/sbin
385 | )
386 |
387 | if ! grep -q '^haproxy:' '/etc/passwd'; then
388 | (
389 | set -x
390 | useradd -U -s '/usr/sbin/nologin' -d '/nonexistent' haproxy 2>/dev/null
391 | )
392 | fi
393 |
394 | local haproxy_bin="${HAPROXY_LKL_DIR}/sbin/haproxy"
395 | download_file "$HAPROXY_BIN_URL" "$haproxy_bin"
396 | chmod +x "$haproxy_bin"
397 |
398 | if ! ( $haproxy_bin -v 2>/dev/null | grep -q 'HA-Proxy' ); then
399 | cat >&2 <<-EOF
400 | HAproxy 可执行文件无法正常运行
401 | 可能是 glibc 版本过低,或者文件不适用于你的系统。
402 | 请联系脚本作者,寻求支持。
403 | EOF
404 | (
405 | set -x
406 | ldd --version
407 | )
408 | exit 1
409 | fi
410 |
411 | local haproxy_lkl_bin="${HAPROXY_LKL_DIR}/sbin/${SERVICE_NAME}"
412 | download_file "$HAPROXY_LKL_BIN_URL" "$haproxy_lkl_bin"
413 |
414 | sed -i -r "s#^HAPROXY_LKL_DIR=.*#HAPROXY_LKL_DIR='"${HAPROXY_LKL_DIR}"'#" \
415 | "$haproxy_lkl_bin"
416 |
417 | set_interface() {
418 | local has_vnet=0
419 | if command_exists ip; then
420 | ip -o link show | grep -q 'venet0'
421 | has_vnet=$?
422 | elif command_exists ifconfig; then
423 | ifconfig -s | grep -q 'venet0'
424 | has_vnet=$?
425 | fi
426 |
427 | if [ "$has_vnet" != 0 ]; then
428 | cat >&2 <<-EOF
429 | 检测发现你的公网接口不是 venet0,需要你手动输入一下网络接口名称。
430 | 我们会根据网络接口设置转发规则,如果网络接口名称设置不正确,
431 | 外部网络将无法正常访问到内部服务端口。
432 | * 网络接口是具有公网 IP 的接口名称。
433 |
434 | 你可以从下面的信息中找到你的公网接口名称:
435 | EOF
436 |
437 | if command_exists ip; then
438 | ip addr show
439 | else
440 | ifconfig
441 | fi
442 |
443 | local input=
444 | while :
445 | do
446 | read -p "请输入你的网络接口名称(例如: eth0): " input
447 | echo
448 | if [ -n "$input" ]; then
449 | sed -i -r "s#^INTERFACE=.*#INTERFACE='"${input}"'#" "$haproxy_lkl_bin"
450 | else
451 | echo "输入信息不能为空,请重新输入!"
452 | continue
453 | fi
454 |
455 | break
456 | done
457 | fi
458 | }
459 | set_interface
460 |
461 | chmod +x "$haproxy_lkl_bin"
462 |
463 | local haproxy_lkl_startup_file=
464 | local haproxy_lkl_startup_file_url=
465 |
466 | if command_exists systemctl; then
467 | haproxy_lkl_startup_file="/lib/systemd/system/${SERVICE_NAME}.service"
468 | haproxy_lkl_startup_file_url="${HAPROXY_LKL_SYSTEMD_FILE_URL}"
469 |
470 | download_file "$haproxy_lkl_startup_file_url" "$haproxy_lkl_startup_file"
471 | elif command_exists service; then
472 | haproxy_lkl_startup_file="/etc/init.d/${SERVICE_NAME}"
473 | case "$lsb_dist" in
474 | ubuntu|debian|raspbian)
475 | haproxy_lkl_startup_file_url="${HAPROXY_LKL_SERVICE_FILE_DEBIAN_URL}"
476 |
477 | download_file "$haproxy_lkl_startup_file_url" "$haproxy_lkl_startup_file"
478 | chmod +x "$haproxy_lkl_startup_file"
479 | ;;
480 | fedora|centos|redhat|oraclelinux|photon)
481 | haproxy_lkl_startup_file_url="${HAPROXY_LKL_SERVICE_FILE_REDHAT_URL}"
482 |
483 | download_file "$haproxy_lkl_startup_file_url" "$haproxy_lkl_startup_file"
484 | chmod +x "$haproxy_lkl_startup_file"
485 | ;;
486 | *)
487 | echo "没有适合当前系统的服务启动脚本文件。"
488 | exit 1
489 | ;;
490 | esac
491 |
492 | else
493 | cat >&2 <<-'EOF'
494 | 当前服务器未安装 systemctl 或者 service 命令,无法配置服务。
495 | 请先手动安装 systemd 或者 service 之后再运行脚本。
496 | EOF
497 |
498 | exit 1
499 | fi
500 |
501 | echo "$ACCELERATE_PORT" > "${HAPROXY_LKL_DIR}/etc/port-rules"
502 | }
503 |
504 | install_lkl_lib() {
505 | local lib_file="${HAPROXY_LKL_DIR}/lib64/liblkl-hijack.so"
506 | local retry=0
507 | download_lkl_lib() {
508 | download_file "$LKL_LIB_URL" "$lib_file"
509 | if command_exists md5sum; then
510 | (
511 | set -x
512 | echo "${LKL_LIB_MD5} ${lib_file}" | md5sum -c
513 | )
514 | if [ "$?" != "0" ]; then
515 | if [ "$retry" -lt "3" ]; then
516 | echo "文件校验失败!3 秒后重新下载..."
517 | retry=`expr $retry + 1`
518 | sleep 3
519 | download_lkl_lib
520 | else
521 | cat >&2 <<-EOF
522 | Linux 内核文件校验失败。
523 | 通常是网络原因造成文件下载不全。
524 | EOF
525 | exit 1
526 | fi
527 | fi
528 | fi
529 | }
530 |
531 | download_lkl_lib
532 |
533 | chmod +x "$lib_file"
534 | }
535 |
536 | enable_ip_forward() {
537 | local ip_forword="$(sysctl -n 'net.ipv4.ip_forward' 2>/dev/null)"
538 | if [ -z "$ip_forword" -o "$ip_forword" != "1" ]; then
539 | (
540 | set -x
541 | echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
542 | sysctl -p /etc/sysctl.conf 2>/dev/null
543 | )
544 | fi
545 | }
546 |
547 | set_config() {
548 | is_port() {
549 | local port=$1
550 | expr $port + 1 >/dev/null 2>&1 && \
551 | [ "$port" -ge "1" -a "$port" -le "65535" ]
552 | }
553 |
554 | local input=
555 |
556 | if [ -z "$ACCELERATE_PORT" ] || ! is_port "$ACCELERATE_PORT"; then
557 | while :
558 | do
559 | read -p "请输入需要加速的端口 [1~65535]: " input
560 | echo
561 | if [ -n "$input" ] && is_port $input; then
562 | ACCELERATE_PORT="$input"
563 | else
564 | echo "输入有误, 请输入 1~65535 之间的数字!"
565 | continue
566 | fi
567 | break
568 | done
569 | fi
570 |
571 | cat >&2 <<-EOF
572 | ---------------------------
573 | 加速端口 = ${ACCELERATE_PORT}
574 | ---------------------------
575 | EOF
576 |
577 | any_key_to_continue
578 | }
579 |
580 | is_running() {
581 | (
582 | set -x
583 | sleep 3
584 | # https://bugs.centos.org/view.php?id=12407
585 | # ping may not work with IPv4 under OpenVZ on CentOS 7
586 |
587 | # ping -q -c3 10.0.0.2 2>/dev/null
588 | timeout 2 bash -c "/dev/null
589 | )
590 | return $?
591 | }
592 |
593 | enable_service() {
594 | if command_exists systemctl; then
595 | (
596 | set -x
597 | systemctl daemon-reload
598 | systemctl enable "${SERVICE_NAME}.service"
599 | )
600 | elif command_exists service; then
601 | case "$lsb_dist" in
602 | ubuntu|debian|raspbian)
603 | (
604 | set -x
605 | update-rc.d -f "${SERVICE_NAME}" defaults
606 | )
607 | ;;
608 | fedora|centos|redhat|oraclelinux|photon)
609 | (
610 | set -x
611 | chkconfig --add "${SERVICE_NAME}"
612 | chkconfig "${SERVICE_NAME}" on
613 | )
614 | ;;
615 | esac
616 | fi
617 | }
618 |
619 | start_service() {
620 | if command_exists systemctl; then
621 | (
622 | set -x
623 | sleep 3
624 | systemctl start "$SERVICE_NAME"
625 | )
626 | else
627 | (
628 | set -x
629 | sleep 3
630 | service "$SERVICE_NAME" start
631 | )
632 | fi
633 |
634 | if [ "$?" != "0" ] || ! is_running; then
635 | do_uninstall
636 | cat >&2 <<-EOF
637 | 很遗憾,服务启动失败。
638 | 你可以查看上面的日志来获取原因,
639 | 或者,你可以到我们的群里反馈一下。
640 | EOF
641 | exit 1
642 | fi
643 | }
644 |
645 | end_install() {
646 | clear
647 |
648 | cat >&2 <<-EOF
649 | 恭喜!BBR 安装完成并成功启动
650 |
651 | 已加速的端口: ${ACCELERATE_PORT}
652 |
653 | 你可以通过修改文件:
654 | ${HAPROXY_LKL_DIR}/etc/port-rules
655 |
656 | 来配置需要加速的端口或端口范围。
657 | EOF
658 | if command_exists systemctl; then
659 |
660 | cat >&2 <<-EOF
661 |
662 | 请使用 systemctl {start|stop|restart} ${SERVICE_NAME}
663 | 来 {开启|关闭|重启} 服务
664 | EOF
665 | else
666 |
667 | cat >&2 <<-EOF
668 |
669 | 请使用 service ${SERVICE_NAME} {start|stop|restart}
670 | 来 {开启|关闭|重启} 服务
671 | EOF
672 | fi
673 | cat >&2 <<-EOF
674 |
675 | 服务已自动加入开机启动,请放心使用。
676 |
677 | 如果这个脚本帮到了你,你可以请作者喝瓶可乐:
678 | https://blog.kuoruan.com/donate
679 |
680 | 享受加速的快感吧!
681 | EOF
682 | }
683 |
684 | do_uninstall() {
685 | check_root
686 | get_os_info
687 |
688 | if command_exists systemctl; then
689 | systemctl stop "${SERVICE_NAME}.service" 2>/dev/null
690 | (
691 | set -x
692 | systemctl disable "${SERVICE_NAME}.service" 2>/dev/null
693 | rm -f "/lib/systemd/system/${SERVICE_NAME}.service"
694 | )
695 | elif command_exists service; then
696 | service "${SERVICE_NAME}" stop 2>/dev/null
697 | case "$lsb_dist" in
698 | ubuntu|debian|raspbian)
699 | (
700 | set -x
701 | update-rc.d -f "${SERVICE_NAME}" remove 2>/dev/null
702 | )
703 | ;;
704 | fedora|centos|redhat|oraclelinux|photon)
705 | (
706 | set -x
707 | chkconfig "${SERVICE_NAME}" off 2>/dev/null
708 | chkconfig --del "${SERVICE_NAME}" 2>/dev/null
709 | )
710 | ;;
711 | esac
712 | (
713 | set -x
714 | rm -f "/etc/init.d/${SERVICE_NAME}"
715 | )
716 | fi
717 |
718 | (
719 | set -x
720 | ${HAPROXY_LKL_DIR}/sbin/${SERVICE_NAME} -c 2>/dev/null
721 | rm -rf "${HAPROXY_LKL_DIR}"
722 | )
723 | }
724 |
725 | do_install() {
726 | check_root
727 | check_ovz
728 | check_ldd
729 | check_arch
730 | get_os_info
731 | set_config
732 | install_deps
733 | enable_ip_forward
734 | check_nat_create
735 | install_haproxy
736 | install_lkl_lib
737 | start_service
738 | enable_service
739 | end_install
740 | }
741 |
742 | action=${1:-"install"}
743 | case "$action" in
744 | install|uninstall)
745 | do_${action}
746 | ;;
747 | *)
748 | cat >&2 <<-EOF
749 | 参数有误,请使用 $(basename $0) install|uninstall
750 | EOF
751 | exit 255
752 | esac
753 |
--------------------------------------------------------------------------------
/ovz-bbr/patch/lkl-makefile.patch:
--------------------------------------------------------------------------------
1 | diff --git a/tools/lkl/Makefile b/tools/lkl/Makefile
2 | index 08f73f8..c8a5231 100644
3 | --- a/tools/lkl/Makefile
4 | +++ b/tools/lkl/Makefile
5 | @@ -139,7 +139,7 @@ $(OUTPUT)%-in.o: $(OUTPUT)lib/lkl.o FORCE
6 | $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(patsubst %/,%,$(dir $*)) obj=$(notdir $*)
7 |
8 | $(OUTPUT)lib/lkl.o:
9 | - $(Q)$(MAKE) -C ../.. ARCH=lkl $(KOPT) defconfig
10 | + $(Q)$(MAKE) -C ../.. ARCH=lkl $(KOPT) olddefconfig
11 | $(Q)$(MAKE) -C ../.. ARCH=lkl $(KOPT) install INSTALL_PATH=$(OUTPUT)
12 |
13 | $(OUTPUT)liblkl.a: $(OUTPUT)lib/lkl-in.o $(OUTPUT)lib/lkl.o
14 |
--------------------------------------------------------------------------------
/ovz-bbr/patch/net-default-bbr.patch:
--------------------------------------------------------------------------------
1 | diff --git a/net/Kconfig b/net/Kconfig
2 | index a29bb4b..7ca15d3 100644
3 | --- a/net/Kconfig
4 | +++ b/net/Kconfig
5 | @@ -4,6 +4,7 @@
6 |
7 | menuconfig NET
8 | bool "Networking support"
9 | + default y
10 | select NLATTR
11 | select GENERIC_NET_UTILS
12 | select BPF
13 | diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig
14 | index 6e7baaf..dd8ba41 100644
15 | --- a/net/ipv4/Kconfig
16 | +++ b/net/ipv4/Kconfig
17 | @@ -453,6 +453,7 @@ config INET_DIAG_DESTROY
18 |
19 | menuconfig TCP_CONG_ADVANCED
20 | bool "TCP: advanced congestion control"
21 | + default y
22 | ---help---
23 | Support for selection of various TCP congestion control
24 | modules.
25 | @@ -650,7 +651,7 @@ config TCP_CONG_CDG
26 |
27 | config TCP_CONG_BBR
28 | tristate "BBR TCP"
29 | - default n
30 | + default y
31 | ---help---
32 |
33 | BBR (Bottleneck Bandwidth and RTT) TCP congestion control aims to
34 | @@ -665,7 +666,7 @@ config TCP_CONG_BBR
35 |
36 | choice
37 | prompt "Default TCP congestion control"
38 | - default DEFAULT_CUBIC
39 | + default DEFAULT_BBR
40 | help
41 | Select the TCP congestion control that will be used by default
42 | for all connections.
43 | @@ -724,7 +725,7 @@ config DEFAULT_TCP_CONG
44 | default "dctcp" if DEFAULT_DCTCP
45 | default "cdg" if DEFAULT_CDG
46 | default "bbr" if DEFAULT_BBR
47 | - default "cubic"
48 | + default "bbr"
49 |
50 | config TCP_MD5SIG
51 | bool "TCP: MD5 Signature Option support (RFC2385)"
52 | diff --git a/net/sched/Kconfig b/net/sched/Kconfig
53 | index 87956a7..aa2c576 100644
54 | --- a/net/sched/Kconfig
55 | +++ b/net/sched/Kconfig
56 | @@ -275,6 +275,7 @@ config NET_SCH_FQ_CODEL
57 |
58 | config NET_SCH_FQ
59 | tristate "Fair Queue"
60 | + default y
61 | help
62 | Say Y here if you want to use the FQ packet scheduling algorithm.
63 |
64 |
--------------------------------------------------------------------------------
/ovz-bbr/patch/tcp_bbr.patch:
--------------------------------------------------------------------------------
1 | --- a/net/ipv4/tcp_bbr.c
2 | +++ b/net/ipv4/tcp_bbr.c
3 | @@ -121,9 +121,9 @@ struct bbr {
4 | #define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */
5 |
6 | /* Window length of bw filter (in rounds): */
7 | -static const int bbr_bw_rtts = CYCLE_LEN + 2;
8 | +static const int bbr_bw_rtts = CYCLE_LEN + 7;
9 | /* Window length of min_rtt filter (in sec): */
10 | -static const u32 bbr_min_rtt_win_sec = 10;
11 | +static const u32 bbr_min_rtt_win_sec = 20;
12 | /* Minimum time (in ms) spent at bbr_cwnd_min_target in BBR_PROBE_RTT mode: */
13 | static const u32 bbr_probe_rtt_mode_ms = 200;
14 | /* Skip TSO below the following bandwidth (bits/sec): */
15 | @@ -138,15 +138,15 @@ struct bbr {
16 | /* The pacing gain of 1/high_gain in BBR_DRAIN is calculated to typically drain
17 | * the queue created in BBR_STARTUP in a single round:
18 | */
19 | -static const int bbr_drain_gain = BBR_UNIT * 1000 / 2885;
20 | +static const int bbr_drain_gain = BBR_UNIT * 1200 / 2885;
21 | /* The gain for deriving steady-state cwnd tolerates delayed/stretched ACKs: */
22 | static const int bbr_cwnd_gain = BBR_UNIT * 2;
23 | /* The pacing_gain values for the PROBE_BW gain cycle, to discover/share bw: */
24 | static const int bbr_pacing_gain[] = {
25 | - BBR_UNIT * 5 / 4, /* probe for more available bw */
26 | + BBR_UNIT * 3 / 2, /* probe for more available bw */
27 | BBR_UNIT * 3 / 4, /* drain queue and/or yield bw to other flows */
28 | - BBR_UNIT, BBR_UNIT, BBR_UNIT, /* cruise at 1.0*bw to utilize pipe, */
29 | - BBR_UNIT, BBR_UNIT, BBR_UNIT /* without creating excess queue... */
30 | + BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8, /* cruise at 1.0*bw to utilize pipe, */
31 | + BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8, BBR_UNIT * 9 / 8 /* without creating excess queue... */
32 | };
33 | /* Randomize the starting gain cycling phase over N phases: */
34 | static const u32 bbr_cycle_rand = 7;
35 | @@ -402,7 +402,7 @@ static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs,
36 | done:
37 | tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); /* apply global cap */
38 | if (bbr->mode == BBR_PROBE_RTT) /* drain queue, refresh min_rtt */
39 | - tp->snd_cwnd = min(tp->snd_cwnd, bbr_cwnd_min_target);
40 | + tp->snd_cwnd = max(tp->snd_cwnd >> 1, bbr_cwnd_min_target);
41 | }
42 |
43 | /* End cycle phase if it's time and/or we hit the phase's in-flight target. */
44 | @@ -756,7 +756,7 @@ static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs)
45 | if (!bbr->probe_rtt_done_stamp &&
46 | tcp_packets_in_flight(tp) <= bbr_cwnd_min_target) {
47 | bbr->probe_rtt_done_stamp = tcp_time_stamp +
48 | - msecs_to_jiffies(bbr_probe_rtt_mode_ms);
49 | + msecs_to_jiffies(bbr_probe_rtt_mode_ms >> 1);
50 | bbr->probe_rtt_round_done = 0;
51 | bbr->next_rtt_delivered = tp->delivered;
52 | } else if (bbr->probe_rtt_done_stamp) {
53 |
--------------------------------------------------------------------------------
/ovz-bbr/startup/haproxy-lkl.init.debain:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | ### BEGIN INIT INFO
3 | # Provides: haproxy
4 | # Required-Start: $local_fs $network $remote_fs $syslog $named
5 | # Required-Stop: $local_fs $remote_fs $syslog $named
6 | # Default-Start: 2 3 4 5
7 | # Default-Stop: 0 1 6
8 | # Short-Description: fast and reliable load balancing reverse proxy
9 | # Description: This file should be used to start and stop haproxy.
10 | ### END INIT INFO
11 |
12 | # Author: Arnaud Cornet
13 |
14 | PATH=/sbin:/usr/sbin:/bin:/usr/bin
15 | BASENAME=haproxy-lkl
16 | HAPROXY_LKL_DIR=/usr/local/$BASENAME
17 | HAPROXY=${HAPROXY_LKL_DIR}/sbin/haproxy
18 | HAPROXY_LKL=${HAPROXY_LKL_DIR}/sbin/$BASENAME
19 |
20 | PIDFILE=/var/run/${BASENAME}.pid
21 | CONFIG=${HAPROXY_LKL_DIR}/etc/haproxy.cfg
22 |
23 | RETVAL=0
24 |
25 | test -x $HAPROXY || exit 0
26 | test -x $HAPROXY_LKL || exit 0
27 |
28 | . /lib/lsb/init-functions
29 |
30 | do_start() {
31 | if get_status; then
32 | return 1
33 | fi
34 |
35 | start-stop-daemon --quiet --oknodo --start --pidfile "$PIDFILE" \
36 | --exec $HAPROXY_LKL -- -p "$PIDFILE" || return 2
37 | return 0
38 | }
39 |
40 | do_stop() {
41 | # clear iptables rules
42 | $HAPROXY_LKL -c >/dev/null 2>&1
43 |
44 | if [ ! -f $PIDFILE ] ; then
45 | # This is a success according to LSB
46 | return 3
47 | fi
48 |
49 | ret=0
50 | start-stop-daemon --quiet --oknodo --stop \
51 | --retry 5 --pidfile "$PIDFILE" --exec $HAPROXY || ret=$?
52 |
53 | [ $ret -eq 0 ] && rm -f $PIDFILE
54 |
55 | return $ret
56 | }
57 |
58 | get_status() {
59 | if [ ! -f $PIDFILE ] ; then
60 | # program not running
61 | return 3
62 | fi
63 |
64 | if ! ps --no-headers p "$(cat $PIDFILE)" | grep -q 'haproxy'; then
65 | # program running, bogus pidfile
66 | return 1
67 | fi
68 |
69 | return 0
70 | }
71 |
72 | case "$1" in
73 | start)
74 | log_daemon_msg "Starting haproxy" "${BASENAME}"
75 | do_start
76 | RETVAL=$?
77 | case "$RETVAL" in
78 | 0)
79 | log_end_msg 0
80 | ;;
81 | 1)
82 | log_end_msg 1
83 | echo "pid file '$PIDFILE' found, and ${BASENAME} already running."
84 | ;;
85 | 2)
86 | log_end_msg 1
87 | ;;
88 | esac
89 | ;;
90 | stop)
91 | log_daemon_msg "Stopping haproxy" "${BASENAME}"
92 | do_stop
93 | RETVAL=$?
94 | case "$RETVAL" in
95 | 0|1)
96 | log_end_msg 0
97 | ;;
98 | 2)
99 | log_end_msg 1
100 | ;;
101 | 3)
102 | log_end_msg 1
103 | echo "Can't find pid file '$PIDFILE'."
104 | ;;
105 | esac
106 | ;;
107 | restart)
108 | log_daemon_msg "Restarting haproxy" "${BASENAME}"
109 | do_stop
110 | do_start
111 | RETVAL=$?
112 | case "$RETVAL" in
113 | 0)
114 | log_end_msg 0
115 | ;;
116 | 1)
117 | log_end_msg 1
118 | ;;
119 | 2)
120 | log_end_msg 1
121 | ;;
122 | esac
123 | ;;
124 | status)
125 | get_status
126 | RETVAL=$?
127 | case "$RETVAL" in
128 | 0)
129 | echo "${BASENAME} is running."
130 | ;;
131 | 1)
132 | echo "${BASENAME} dead, but $PIDFILE exists."
133 | ;;
134 | *)
135 | echo "${BASENAME} not running."
136 | ;;
137 | esac
138 | ;;
139 | *)
140 | echo "Usage: /etc/init.d/${BASENAME} {start|stop|restart|status}"
141 | RETVAL=255
142 | ;;
143 | esac
144 |
145 | exit $RETVAL
146 |
--------------------------------------------------------------------------------
/ovz-bbr/startup/haproxy-lkl.init.redhat:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | #
3 | # haproxy-lkl
4 | #
5 | # chkconfig: - 85 15
6 | # description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited \
7 | # for high availability environments.
8 | # processname: haproxy-lkl
9 | # config: /usr/local/haproxy-lkl/etc/haproxy.cfg
10 | # pidfile: /var/run/haproxy-lkl.pid
11 |
12 | # Source function library.
13 | if [ -f /etc/init.d/functions ]; then
14 | . /etc/init.d/functions
15 | elif [ -f /etc/rc.d/init.d/functions ] ; then
16 | . /etc/rc.d/init.d/functions
17 | else
18 | exit 0
19 | fi
20 |
21 | # Source networking configuration.
22 | . /etc/sysconfig/network
23 |
24 | # Check that networking is up.
25 | [ ${NETWORKING} = "no" ] && exit 0
26 |
27 | BASENAME=haproxy-lkl
28 | HAPROXY_LKL_DIR=/usr/local/$BASENAME
29 | HAPROXY=${HAPROXY_LKL_DIR}/sbin/haproxy
30 | HAPROXY_LKL=${HAPROXY_LKL_DIR}/sbin/$BASENAME
31 |
32 | PIDFILE=/var/run/${BASENAME}.pid
33 |
34 | RETVAL=0
35 |
36 | do_start() {
37 | if ( get_status >/dev/null 2>&1 ); then
38 | echo "$BASENAME is already running."
39 | RETVAL=1
40 | else
41 | echo -n "Starting $BASENAME: "
42 | daemon --pidfile=$PIDFILE $HAPROXY_LKL -p "$PIDFILE"
43 | RETVAL=$?
44 | echo
45 | fi
46 | }
47 |
48 | do_stop() {
49 | # clear iptables rules
50 | $HAPROXY_LKL -c >/dev/null 2>&1
51 |
52 | echo -n "Shutting down $BASENAME: "
53 | killproc -p $PIDFILE $HAPROXY
54 | RETVAL=$?
55 | echo
56 | [ $RETVAL -eq 0 ] && rm -f $PIDFILE
57 | }
58 |
59 | get_status() {
60 | status -p $PIDFILE $HAPROXY
61 | RETVAL=$?
62 | return $RETVAL
63 | }
64 |
65 | # See how we were called.
66 | case "$1" in
67 | start)
68 | do_start
69 | ;;
70 | stop)
71 | do_stop
72 | ;;
73 | restart)
74 | do_stop
75 | do_start
76 | ;;
77 | status)
78 | get_status
79 | ;;
80 | *)
81 | echo $"Usage: /etc/init.d/$BASENAME {start|stop|restart|status}"
82 | RETVAL=255
83 | esac
84 |
85 | exit $RETVAL
86 |
--------------------------------------------------------------------------------
/ovz-bbr/startup/haproxy-lkl.systemd:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=HAProxy Load Balancer with Linux Kernel Library
3 | After=network.target
4 |
5 | [Service]
6 | Type=forking
7 | PIDFile=/var/run/haproxy-lkl.pid
8 | ExecStart=/usr/local/haproxy-lkl/sbin/haproxy-lkl -p '/var/run/haproxy-lkl.pid'
9 | ExecStop=/bin/kill -USR1 $MAINPID
10 | ExecStopPost=/usr/local/haproxy-lkl/sbin/haproxy-lkl -c >/dev/null 2>&1
11 | KillMode=mixed
12 | Restart=always
13 |
14 | [Install]
15 | WantedBy=multi-user.target
16 |
--------------------------------------------------------------------------------