很久没更新了,最近闲下来,分享一下我是如何在 CentOS7 下快速部署 SS 的教程吧。 整套下来一般在 5 分钟之内即可部署完毕。

一、更新 CentOS7 到最新版并同步时间

更新 CentOS7 到最新

yum install epel-release -y
yum update -y
yum install bind-utils net-tools wget ntp -y

同步时间

timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp yes
timedatectl

重启系统

systemctl reboot

二、CentOS7 强制安装支持锐速的最新内核,并永久指定使用该内核启动系统

强制更新内核到:kernel-3.10.0-327.36.3.el7.x86_64

rpm -ivh http://vault.centos.org/7.2.1511/updates/x86\_64/Packages/kernel-3.10.0-327.36.3.el7.x86\_64.rpm –force

永久指定使用该内核启动

grub2-set-default “CentOS Linux (3.10.0-327.36.3.el7.x86_64) 7 (Core)”

检查指定内核是否生效

grub2-editenv list

重启系统

systemctl reboot

再次检查当前运行的内核

uname -r

三、安装锐速

wget -N –no-check-certificate https://github.com/91yun/serverspeeder/raw/master/serverspeeder-v.sh && bash serverspeeder-v.sh CentOS 7.2 3.10.0-327.el7.x86_64 x64 3.11.20.5 serverspeeder_72327

四、安装 SS

https://teddysun.com/342.html

建议采用 chacha20-ietf-poly1305 协议,该协议在路由器上可以达到更高的速度。

五、修改最大文件链接数 NOFILE 设置

修改该数值才可以让 SS 支持更多的端口,否则会导致重启机器后 SS 起不来。

打开 /etc/systemd/system.conf 文件,找到 #DefaultLimitNOFILE= 修改为如下:

DefaultLimitNOFILE=51200

六、安装 SS 自动重启监控

每五分钟检查一次 SS 是否在运行,如果不在运行则会自动重启

wget –no-check-certificate -O /opt/shadowsocks-crond.sh https://raw.githubusercontent.com/teddysun/shadowsocks\_install/master/shadowsocks-crond.sh
chmod 755 /opt/shadowsocks-crond.sh
(crontab -l ; echo “*/5 * * * * /opt/shadowsocks-crond.sh”) crontab -
crontab -l
service crond restart

七、Firewalld 防火墙配置

打开 /etc/firewalld/zones/public.xml 文件,使用开放相应的端口:

PublicFor use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.

重启 Firewalld 并查看端口配置是否生效

service firewalld restart
systemctl enable firewalld
firewall-cmd –zone=public –list-all

八、最终检查

检查锐速是否在运行

/serverspeeder/bin/serverSpeeder.sh status

检查 SS 是否在运行

参考上方刚刚的安装链接中的介绍

检查 SS 运行是否正常

参考上方刚刚的安装链接中的介绍

九、效果

本次教程使用的是 Vultr Seattle 节点进行的,以下测试结果基于全局模式。

更多 VPS 推荐

【强烈推荐】搬瓦工 CN2,查看测试结果其他 VPS 推荐

gdnsd 是一款权威 DNS (Authoritative-only DNS)服务器软件,因为自带 GeoIP 插件,所以很适合自建 CDN 做分区解析,著名的喂鸡百科就是使用 gdnsd 进行全球 CDN 分区解析 众所周知,天朝的网络环境,国内访问国外慢,同理国外访问国内也慢,所以我们很有必要搭建 CDN 并且使用 DNS 进行分区解析 而国内比较知名的权威 DNS 服务商如 CloudXNSDNSpod 他们免费版的 DNS 服务器都在国内,这样会造成国外的用户解析你的域名很慢,同理,如果使用国外的权威 DNS 服务商如 CloudflareAWS Route53 他们的 DNS 服务器都部属在国外,国内访问基本要走美国节点,这样会造成国内的用户解析你的域名很慢 所以我们需要选择一家对国内外速度都友好的 ISP 来托管你的权威 DNS 服务器,如果您没有找到合适的,我们这里推荐 cat.net 以及阿里云国际版 以下安装步骤都在 root 用户下完成,请自行使用 su 命令切换到 root 用户

1、注册 DNS 服务器

假设您的 DNS 域名是 example.com ,购买并安装好了两台 NS 服务器,分别为

ns1.example.com 对应 IPv4 192.0.2.2 IPv6 2001:DB8::2
ns2.example.com 对应 IPv4 192.0.2.3 IPv6 2001:DB8::3

首先,您需要在您的域名注册商注册 Name Servers 由于每个注册商的控制面板不同,我们这里以 cat.net 为例,登陆 Custom Portal 后,点击 Domains > My Domains 如图 然后进入您的域名管理页面,点击小工具的箭头,如图 接着点击左侧的 Private Nameservers 如图 然后在右侧即可注册、管理或删除 NS 服务器,如图 我们分别注册 ns1 和 ns2 即可 PS: cat.net 后台只能一次提交注册一个 IP 地址,如果需要一个 NS 服务器对应多个 IP 地址,则只需要发服务单让客服帮忙修改即可 好了,到这里我们已经注册好 NS 服务器,接下来开始搭建 gdnsd

2、安装 gdnsd

Debian 9.x 自带的 gdnsd 已有编译好的版本,所以我们不需要编译安装,直接一条命令即可,同样适合 Debian 8.x

1
apt-get install gdnsd

如果加了 Backports 则可以使用

1
apt-get -t stretch-backports install gdnsd

Debian 8.x 则是

1
apt-get -t jessie-backports install gdnsd

记得检查系统或服务商的防火墙,我们需要打开的端口是 TCP / UDP 的 53 端口,请安装后检查服务商是否给您打开了这个端口,否则 DNS 是无法工作的

3、配置 gdnsd

gdnsd 的 Github Wiki 上已经提供了很详细的 config 以及 zonefile 配置,但是对新手来说坑比较多,由于我们的需求是根据国内外分区解析,所以这里我简单的提供一下本站的配置文件,感谢肥猫童鞋的细心指导 这里假设阁下的网站域名是 example.org 国内服务器节点 IPv4 为 192.0.2.4 IPv6 为 2001:DB8::4 国外服务器节点 IPv4 为 192.0.2.5 IPv6 为 2001:DB8::5 那我们的逻辑就是,当国内用户请求 example.org 解析的时候, gdnsd 判断用户本地的 DNS 是否在国内,是的话解析到国内对应的服务器节点,如果不是,则默认解析到国外服务器节点,能理解这个逻辑以后我们就开始配置吧 首先登陆 ns1.example.com

ssh root@ns1.example.com

gdnsd 需要有一个对应的 config 文件,需要自己创建,这里默认新建一个 /etc/gdnsd/config 文件,输入以下内容

options => {
listen => any
dns_port => 53
chaos_response => “SBDNS”
}

service_types => {
example_monitor => {
plugin => http_status
ok_codes => [200, 301, 302, 403, 404]
vhost => example.org
url_path => /
}
}

plugins => { geoip => {
maps => {
china_map => {
geoip_db => GeoLiteCity.dat
datacenters => [default-dc, cn-dc]
map => {
AS => {CN => [cn-dc, default-dc]}
}
}

}
resources => {

example\_org => {
  map => china\_map
  service\_types => example\_monitor
  dcmap => {

    cn-dc => {

addrs_v4 => 192.0.2.4
addrs_v6 => 2001:DB8::4
},

    default-dc => {

addrs_v4 => 192.0.2.5
addrs_v6 => 2001:DB8::5
},

  }
}

}

}

}

我们来一条一条解释

options => {
listen => any
dns_port => 53
chaos_response => “SBDNS”
}

options 是 gdnsd 的配置选项,一般无特殊需求的话可以监听本机的所有 IP ,所以这里 listen 选的是 any, DNS 服务器端口选默认的 53chaos_response 则是 DNS 返回的软件版本,可以自己随便指定个名字

service_types => {
example_monitor => {
plugin => http_status
ok_codes => [200, 301, 302, 403, 404]
vhost => example.org
url_path => /
}
}

这里因为我们开启了监控,并且使用的插件是 http_status ,如果不需要监控的话可以忽略

plugins => { geoip => {
maps => {
china_map => {
geoip_db => GeoLiteCity.dat
datacenters => [default-dc, cn-dc]
map => {
AS => {CN => [cn-dc, default-dc]}
}
}

}
resources => {

example\_org => {
  map => china\_map
  service\_types => example\_monitor
  dcmap => {

    cn-dc => {

addrs_v4 => 192.0.2.4
addrs_v6 => 2001:DB8::4
},

    default-dc => {

addrs_v4 => 192.0.2.5
addrs_v6 => 2001:DB8::5
},

  }
}

}

}

}

这一段才是最重要的,也是本文的精髓所在,这里我们启用了 GeoIP 插件,设置的默认解析到国外的节点,国内用户对应一个 datacenter 叫做 cn-dc ,只要 gdnsd 判断该用户是国内请求的解析,那么就返回我们设置的国内 IP ,否则就返回默认的国外节点,如果不需要 IPv4 则可以直接写

cn-dc => 192.0.2.4
default-dc => 192.0.2.5

更多的 GeoIP 配置信息可以在 Github Wiki 页面中找到

4、安装 GeoIP 数据库

我们的数据库使用的是 Maxmind 免费的 GeoLite City,大多数情况下也足够使用,下载和解压的命令如下

1
cd /etc/gdnsd/geoip && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz && gzip -df GeoLiteCity.dat.gz

5、配置 zonefile

首先,细心的读者肯定发现我们还没配置 DNS 域名 example.com 所以新建一个 /etc/gdnsd/zones/example.com 文件,举例如下

$TTL86400

@INSOA ns1.example.com.hostmaster.example.com.(
1 ; serial
7200 ; refresh
900 ; retry
1209600 ; expire
10800 ; ncache
)

@NSns1.example.com.
@NSns2.example.com.

ns1A192.0.2.2
ns2A 192.0.2.3

ns1 AAAA2001:DB8::2
ns2 AAAA2001:DB8::3

这里默认设置的 TTL 是 86400 也就是一天,可以根据需要修改 接着需要创建 /etc/gdnsd/zones/example.org 文件,举例如下

$TTL3600

@INSOA ns1.example.com.hostmaster.example.com.(
1 ; serial
7200 ; refresh
900 ; retry
1209600 ; expire
10800 ; ncache
)

@NSns1.example.com.
@NSns2.example.com.

@DYNAgeoip!example_org

wwwCNAMEexample.org.

6、检查 gdnsd 配置

一条命令即可

1
gdnsd checkconf

如果最后三行输出如下,即成功配置

1
2
3
# info: rfc1035: Loaded 71 zonefiles from '/etc/gdnsd/zones/'
# info: rfc1035: quiescence time is 3 seconds
# info: Configuration and zone data loads just fine

7、重启 gdnsd

如果修改了 config 文件,那么我们则需要重启 gdnsd 服务,如果之后只是修改 zonefile 那么则无需这个步骤

1
gdnsd restart

8、安装配置 ns2.example.com 并同步

由于 gdnsd 是个轻量级的 DNS 服务器,不带同步功能,所以您需要按照上面的步骤重新配置一次 ns2.example.com 并且让他重启生效,为了今后方便同步,我们可以使用 rsync 来进行 首先,在 ns1 和 ns2 都安装 rsync

1
apt-get install rsync

然后我们以 ns1 作为 master ,ns2 作为 slave ,每次修改 ns1 的文件并且自动同步到 ns2,以下命令均在 ns1 操作 生成 SSH Key

1
ssh-keygen -t ed25519

查看并复制公钥 id_ed25519.pub

1
cat ~/.ssh/id_ed25519.pub

把公钥的内容复制到 ns2 服务器的 ~/.ssh/authorized_keys 即可 然后执行同步

1
rsync -avz --delete /etc/gdnsd/ ns2.example.com:/etc/gdnsd/

也可以写入 bash 脚本,比如 sync.sh

1
2
CONFDIR=/etc/gdnsd
rsync -avz --delete $CONFDIR/ ns2.example.com:/etc/gdnsd/

赋予权限

1
chmod +x sync.sh

之后就可以直接执行脚本,不需要每次输入代码

1
./sync.sh

另外这里还有肥猫写的更新 GeoIP 数据库的脚本 geoip.sh

1
2
3
4
URL=http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
FILENAME=GeoLiteCity.dat.gz
DIR=/etc/gdnsd/geoip
cd $DIR; rm -f $FILENAME; wget $URL; gzip -df $FILENAME

9、修改域名 DNS 服务器

这个应该大多数读者会,直接去您的注册商把 example.com 和 example.org 的 DNS 服务器设置为 ns1.example.com 和 ns2.example.com 并耐心等待生效

10、测试生效

一般耐心等待一段时间(取决于您的旧 DNS 服务器 TTL 失效时间)后,我们自建的 gdnsd 已经生效,建议找一台国内的机器和国外的 Linux 机器来分别测试,Windows 下命令不好记,嘎嘎 首先安装必要的 DNS 工具 Debian / Ubuntu 下

1
apt-get install dnsutils

CentOS 下

1
yum install bind-utils

然后我们使用 dig 命令来检测 首先检测 NS 记录是否生效

1
2
3
root@debian ~ # dig NS example.com +short
ns1.example.com.
ns2.example.com.

检测 A 记录或 AAAA 记录是否生效 国内对应解析到 192.0.2.4 和 2001:DB8::4

1
2
3
4
root@china ~ # dig A example.com +short @223.5.5.5
192.0.2.4
root@china ~ # dig AAAA example.com +short @223.5.5.5
2001:DB8::4

国外对应解析到 192.0.2.5 和 2001:DB8::5

1
2
3
4
root@australia ~ # dig A example.com +short @8.8.8.8
192.0.2.5
root@australia ~ # dig AAAA example.com +short @8.8.8.8
2001:DB8::5

更多节点检测的话可以去 ping.chinaz.com 或 just-ping.com 查看全国以及全世界各地的解析情况 检测 DNS 是否生效的话可以使用 IntoDNS 如有疑问欢迎在下方留言,之后会详细介绍如何使阁下搭建的 gdnsd 服务完美符合 DNS RFC 标准

如果您一直观注 Ubuntu 系统性能,可能已经注意到,系统会随着使用时间的推移而逐渐变慢。这本身也不算是什么严重问题,无论你使用 Windows、Linux 或是 macOS 系统,也都是如此。 本文中系统极客将向大家汇总 10 个简单步骤,完成这些任务您的 Ubuntu 机器就可以再次以最佳速度运行,并为您提供所需的高效系统性能。

1.限制「启动应用程序」

很多随 Ubuntu 系统自动启动的应用程序其实都没有太大的必要,反而会拖慢系统的启动和登录时间。您可以搜索「启动应用程序」来管理「启动应用程序首选项」。

2.减少Grub加载时间

当您的 Ubuntu 系统启动时,会显示一个加载选项,让您可以进入双系统启动或进入恢复模式。这个 Grub 加载选单默认会等待 10 秒种才能通过或需要用户手动按「回车」键才能跳过。 其实,我们可以将 Grub 等待时间设置到 10 秒以下来让机器启动更快,例如可以通过以下命令来将GRUB_TIMEOUT=10改成GRUB_TIMEOUT=2,这样就只需等待 2 秒:

  1. sudo gedit /etc/default/grub
  2. sudo update-grub

将 GRUB 等待超时设置得过短将无法选择要引导的(多个)操作系统。

3. 用TLP降低发热

TLP 是一个有助于「系统冷却」的应用程序,可以让 Ubuntu 运行得更快、更顺畅。安装完成后,运行命令启动它即可,而无需任何配置。

1
2
3
4
sudo add-apt-repository ppa:linrunner/tlp
sudo apt update
sudo apt install tlp tlp-rdw
sudo tlp start

您还可以使用 TLP 延长 Ubuntu 笔记本电池续航时间

4. 设置软件更新镜像

无论您的网速是否畅快,确保 Ubuntu 从最佳服务器获取更新始终是一个好习惯。 您可以搜索打开「软件和更新」——选择「Ubuntu 软件」选项卡——在「下载自…」中选择一个最适合您的软件源。

国内用户建议选择「阿里云(Aliyun)」或「中国科学技术大学(USTC)」的更新源镜像。

5.使用apt-fast取代apt-get

如果您是 Ubuntu 系统的老鸟用户,应该经常使用apt-get命令。如果您希望下载速度更快,可以安装apt-fast并在使用apt-get命令的地方用apt-fast来替换。

1
2
3
sudo add-apt-repository ppa:apt-fast/stable
sudo apt-get update
sudo apt-get install apt-fast

Linux 中 apt 与 apt-get 命令的区别与解释

6.清理Ubuntu

在 Ubuntu 安装之后的带个生命周期中,您一定安装和卸载过很多应用程序。这些使用过的软件都会在系统中留下缓存、应用程序依赖和历史索引等等,积累过多就会限制 Ubuntu 计算机的性能。 考虑到这一点,保持您的 PC 清洁就是管理员的一项重要职责。如果您想以最快速、最简单的方式来清理 Ubuntu,可以执行如下两条命令:

  1. sudo apt clean
  2. sudo apt autoremove

7. 启用专有驱动程序

在 Ubuntu 系统中为特殊硬件安装和启用专有驱动程序可以大大提高 Ubuntu 计算机的性能,您可以搜索打开「软件和更新」——在「附加驱动」选项卡中为显卡等硬件启用专有驱动程序。

通过 PPA 为 Ubuntu 安装 Nvidia 驱动

8.安装Preload

Preload(预加载)会在后台工作,以「研究」您如何使用计算机并增强计算机的应用程序处理能力。安装好 Preload 后,您使用频率最高的应用程序的加载速度就会明显快于不经常使用的应用程序。

sudo apt install preload

9.使用轻量级的桌面环境

Ubuntu 系统可以与许多 DE(桌面环境)兼容,让桌面拥有不同的风格来吸引各种用户。目前可以让您 Ubuntu 性能显着提升的轻量级桌面环境就有 Xfce 和 LXDE。

7 款应用最广泛的 Linux 桌面环境盘点

10. 移除Apt-Get的翻译包

如果你在sudo apt-get update之后仔细观注过「终端」输出,定然会在其中发现一些与语言翻译有关的行。如果您在服务器上只使用英文,就无需翻译包数据库了。

sudo gedit /etc/apt/apt.conf.d/00aptitude

将这行代码附加到文件末尾:

Acquire::Languages “none”;

这段时间,有一些人看着我的逗比云觉得好看,同时觉得 简介说明 的功能很好,想要问我怎么做,所以我干脆开源好了。

魔改特点:

我之所以使用Directory Lister,就是因为这个程序非常的简洁,符合我心中对 目录列表程序的定义,在使用期间,根据我个人喜好和审美做了一些改变。

  1. 界面式样魔改
  2. 支持中文目录和文件名
  3. 支持显示各文件夹内的简介说明
  4. 默认调用的各种 CDN文件本地化
  5. 等等 …

Github 项目地址:https://github.com/ToyoDAdoubi/DirectoryLister

更新:2018/08/20,更新 不需要再手动配置域名后缀了,新版本会自动检测。 更新:2018/08/20,更新 网站式样 - 素色简洁风(对比见下图)。 更新:2018/07/18,修复 当程序位置网站子目录下时,CSS JS 路径错误的问题。 更新:2018/03/26,修复 当前文件夹下无 README.html 文件时,PHP会提示警告的问题。

演示示例:

逗比云

下载安装:

下载后,解压并上传到已经搭建好 PHP环境 的服务器中,然后就可以上传文件和创建文件夹了! Github打包:https://github.com/ToyoDAdoubi/DirectoryLister/archive/master.zip 逗比云 打包:https://softs.loan/Website/Directory%20Lister%E9%AD%94%E6%94%B9%E7%89%88%28by-Toyo%29%20v2.6.1.zip

文件结构

假设你的虚拟主机根目录是 /home/wwwroot/xxx.xx

  1. /home/wwwroot/xxx.xx/
  2. ├─ resources/
  3. │ ├ themes/
  4. │ │ └ bootstrap/
  5. │ │ ├ css/
  6. │ │ ├ fonts/
  7. │ │ ├ img/
  8. │ │ ├ js/
  9. │ │ ├ default_footer.php # 底部公共文件 #
  10. │ │ ├ default_header.php # 顶部公共文件(可以放网站流量统计代码) #
  11. │ │ └ index.php # 网页主文件,其中可以修改顶部公告栏内容 #
  12. │ │
  13. │ ├ DirectoryLister.php
  14. │ ├ config.php
  15. │ └ fileTypes.php
  16. ├ README.html # 该文件夹页面内的 说明简介文件 #
  17. ├ index.php
  18. ├─ 其他文件夹/
  19. │ ├ 其他文件.txt
  20. │ └ README.html # 该文件夹页面内的 说明简介文件 #
  21. └ 其他文件.txt

注意事项:

不显示文件和目录

如果安装 lnmp一键包上传Directory Lister后,Directory Lister不显示文件和目录,那么可能是 PHP函数scandir被禁用了,取消禁用即可。

  1. sed -i ‘s/,scandir//g’ /usr/local/php/etc/php.ini
  2. # 取消scandir函数禁用
  3. /etc/init.d/php-fpm restart
  4. # 重启 PHP生效

简介功能说明

我也不知道该给这个功能起什么名字,好捉急偶。 可以在每个文件夹下面放一个README.html文件,这个文件里写着 简介说明内容即可,格式参考自带的示例文件。 为了避免中文乱码,把README.html文件用 UTF-8 无BOM 编码 保存!

文件修改说明

文件修改说明修改网站中头部导航标题,去这个文件里搜索DOUBI Soft然后全部替换为自己要改的。\resources\DirectoryLister.php 修改网站标签栏的标题,去这个文件里把开头<title>标签中的DOUBI Soft替换为自己要改的。\resources\themes\bootstrap\index.php 修改网站顶部公告栏内容,去这个文件里搜索顶部公告栏。 \resources\themes\bootstrap\index.php 网站头部公共文件: \resources\themes\bootstrap\default_header.php 网站底部公共文件: \resources\themes\bootstrap\default_footer.php 如果想要插入流量统计代码,那只需要把代码写到default_header.php文件内即可。


本程序基于 Directory Lister原版修改:http://www.directorylister.com/

转载请超链接注明:逗比根据地 » 『开源』Directory Lister 逗比魔改版 Github开源(逗比云)

**责任声明:**本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!

**说明:**之前博主发过一个雨落大神写的Ping值监测工具uPing,不过有点单一,也缺少Web界面,今天再分享个SmartPing工具,可以同时Ping多个IP,支持正向Ping绘制,反向Ping绘制,互Ping拓扑绘制及报警功能。支持自定义延迟、丢包阈值报警。

截图

安装

Github地址:https://github.com/gy-games/smartping 运行命令:

1
2
3
4
5
mkdir smartping && cd smartping
#请去https://github.com/gy-games/smartping/releases下载最新版本的smartping
wget https://github.com/gy-games/smartping/releases/download/v0.5.0/smartping-v0.5.0.tar.gz
tar zxvf smartping-v0.5.0.tar.gz
./control start

然后可以使用ip:8899打开Web界面查看了,管理界面默认密码为smartping,若需要修改请修改conf/config.jsonconf/config-base.json

1
2
3
4
5
6
7
8
9
#如果你是CentOS系统,且打不开Web页面的,则需要开启防火墙端口
#Centos 6系统
iptables -I INPUT -p tcp --dport 8899 -j ACCEPT
service iptables save
service iptables restart

#CentOS 7系统
firewall-cmd --zone=public --add-port=8899/tcp --permanent
firewall-cmd --reload

相关命令

1
2
3
4
5
6
7
8
9
10
./control buildrunstartstoprestartstatus

build : 源码编译,最终构建成至 bin
run : 直接启动smartping
start : 以nohup(deamon)形式启动smartping
stop : 关闭smartping
restart : 执行 stop & start
status : 查看smartping的运行状态
version : 查看当前smartping版本
pack : 执行Build并进行二进制包制作

总结

一般我们可以在搭建网站的服务器上安装,然后添加全国各个地区的IP进行监测,如果你找不到很全的IP来源,可以去ipip上找,地址:https://tools.ipip.net/ping.php,先进去ping一下,然后可以看到各个地区的IP地址了,之后就可以很清楚看到网络情况了。

本文全文转载自:https://tech.cxthhhhh.com/linux/2018/08/08/original-one-click-installation-of-desktop-environment-rdp-windows-support-for-linux-cn.html 帖子:https://www.hostloc.com/thread-467096-1-1.html 如有任何冒犯或侵权,请联系本人TG:@copyylws

在一些时候下,我们需要安装简单快速的桌面环境并且通过RDP访问。 例如:运行浏览器,或者一些Linux应用程序,甚至一些Windows应用程序。 现在,你有了一个更好的解决方案,只需一键,就可以快速的帮你安装好桌面环境和远程桌面连接以及Windows支持。如果你正在寻找这样的解决方案,就来试试吧。

#脚本# CentOS 7 一键安装桌面环境(可远程RDP连接)-主机博客

我将使用CentOS7来演示如何操作。

使用要求

  • 最低硬件要求:CPU核心≥1核心,内存≥1 GB,磁盘空间≥15 GB
  • 系统为全新CentOS 7 最小化安装版本
  • 请尽量不要使用 OpenVZ 虚拟化的机器运行此脚本

脚本功能

  1. 只需一键,即可为CentOS安装桌面环境和RDP远程桌面连接。
  2. 为您的Linux系统运行Windows应用程序。脚本自动帮你安装Wine X64和X86,现在可以在Linux上运行Windows应用程序。例如:Telegram、WeChat、Thunder
  3. 默认创建3GB交换内存。 避免内存不足导致的错误。(交换位置:/var/swapd)
  4. 自动安装中文输入环境,中文支持。
  5. 安装人们推荐的软件,例如浏览器和输入法。(包含Chrome,Firefox)
  6. 安装远程桌面客户端。(支持RDP/SSH/NX/SFTP/VNC/XDMCP协议)

使用教程

请仔细阅读上述详情后,使用Root用户运行如下脚本:

1

yum install curl ca-certificates -y && curl -sSL https://raw.githubusercontent.com/MeowLove/CentOS\-One\-click\-Installation\-of\-Desktop\-Environment\-and\-Remote\-Desktop\-Connection\-RDP/master/download/main/install.sh sudo bash

完成后。你就可以连接IP:3389(通过远程桌面连接)。默认RDP登陆账号:root,密码:你的root密码

其他说明

  • 创建新用户时,请授权新用户RDP远程连接。 你需要这样做。(我将演示授权新用户CXT)
    • ① 首先你应该在[控制中心]-[用户和组群]创建新用户。
    • ② 使用root用户切换进入到CXT的目录。 cd /home/CXT
    • ③ 输入下面的命令(你需要注意,下面命令中引号是”英文状态单引号”。) touch ./.Xclients echo 'mate-session' > ./.Xclients chmod a+x ./.Xclients
  • Chrome浏览器不能通过root用户运行。如果您需要运行,请新建账户。(或者附加运行命令 --no-sandbox)
  • 一些Windows应用程序不工作,也许需要您关闭SELinux。(不推荐,一般情况下不需要)
  • 一些Windows软件看起来模糊,你需要调整软件后面的背景颜色为暗色调。(例如更换壁纸为深色壁纸)
  • 当前的默认系统语言是中文。如果您是英语用户,请执行 sudo localectl set-locale LANG = en_US.UTF-8

源码对比

左侧为原BBR   右侧为魔改BBR  (能看懂的可以瞅瞅) 源码地址: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git/plain/net/ipv4/tcp_bbr.c https://gist.github.com/anonymous/ba338038e799eafbba173215153a7f3a/raw/55ff1e45c97b46f12261e07ca07633a9922ad55d/tcp_tsunami.c  

大佬特别提醒:编译时系统必须安装4.10以上版本的kernel及对应的linux-header,gcc版本应在4.9以上

鉴于之前的那篇文章内核是 4.9的,所以再水一篇文章吧!!

特别提醒:OpenVZ虚拟不能直接升级。升级内核可能会造成服务器无法启动。请酌情使用。

 

CentOS 6 X64

CentOS系统本文演示使用 4.11.8 内核。如果下面代码中的内核地址失效,请自行搜索最新的内核地址即可。 内核地址:http://elrepo.org/linux/kernel

升级系统内核

1)依次执行以下代码。

1
2
3
4
5
rpm —import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install –y http://elrepo.org/linux/kernel/el6/x86_64/RPMS/kernel-ml-4.11.8-1.el6.elrepo.x86_64.rpm
yum remove –y kernel–headers
yum install –y http://elrepo.org/linux/kernel/el6/x86_64/RPMS/kernel-ml-headers-4.11.8-1.el6.elrepo.x86_64.rpm
yum install –y http://elrepo.org/linux/kernel/el6/x86_64/RPMS/kernel-ml-devel-4.11.8-1.el6.elrepo.x86_64.rpm

设置启动引导

2)修改启动引导,修改配置文件即可。 执行命令:

1
vi /etc/grub.conf

  红框可看见我们新安装的内核。修改 default=0  即可。然后保存。重启服务器。  

编译安装

依次执行以下脚本

1
2
3
4
5
6
7
8
9
10
yum install –y make gcc
wget –O ./tcp_tsunami.chttps://gist.github.com/anonymous/ba338038e799eafbba173215153a7f3a/raw/55ff1e45c97b46f12261e07ca07633a9922ad55d/tcp_tsunami.c
echo “obj-m:=tcp_tsunami.o” > Makefile
make –C /lib/modules/$(uname –r)/build M=`pwd` modules CC=/usr/bin/gcc
chmod +x ./tcp_tsunami.ko
cp –rf ./tcp_tsunami.ko /lib/modules/$(uname –r)/kernel/net/ipv4
insmod tcp_tsunami.ko
depmod –a
echo “net.core.default_qdisc=fq” >> /etc/sysctl.conf
echo “net.ipv4.tcp_congestion_control=tsunami” >> /etc/sysctl.conf

执行完之后 重启一下服务器。

1
reboot

重启成功后,执行以下命令。如果有显示内容说明启动成功。

1
lsmod  grep tsunami

>> tcp_tsunami 6053 5    

CentOS 7 X64

由于手头暂时没有CentOS7 系统的服务器。以下代码并没有测试。 升级系统内核,请执行以下代码。其他的请参考 CentOS 6 X64!!

1
2
3
4
5
rpm —import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install –y http://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-4.11.8-1.el7.elrepo.x86_64.rpm
yum remove –y kernel–headers
yum install –y http://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-headers-4.11.8-1.el7.elrepo.x86_64.rpm
yum install –y http://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.11.8-1.el7.elrepo.x86_64.rpm

Debian 8/Ubuntu 14

升级系统内核

  分别安装 headers   和 images 即可。 内核地址:http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.9/ 你可以选择更高版本的内核试一试,注意自己替换命令中的 v4.10.9

1
2
3
4
5
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.9/linux-headers-4.10.9-041009_4.10.9-041009.201704080516_all.deb
dpkg –i linux–headers–4.10.9*.deb

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.9/linux-image-4.10.9-041009-generic_4.10.9-041009.201704080516_amd64.deb
dpkg –i linux–image–4.10.9*.deb

设置启动引导

1)查看系统内核列表,执行以下命令

1
dpkg –lgrep linux–image

执行命令后,可见多个内核如下:

1
2
3
ii linux–image–3.16.0–4–amd64 3.16.7–ckt9–3~deb8u1 amd64 Linux 3.16 for 64–bit PCs
ii linux–image–4.10.9–041009–generic 4.10.9–041009.201704080516 amd64 Linux kernel image forversion 4.10.9 on 64 bit x86 SMP
ii linux–image–amd64 3.16+63 amd64 Linux for 64–bit PCs (meta–package)

上面显示的我们需要将 linux-image-3.16.0  这个删除掉。 PS : 如果你显示的是其他的内核版本,那么就删掉它。只保留 4.10.9。   2)删除内核。

1
apt–get remove linux–image–3.16.0–4–amd64

注意:Debian8 系统会弹出一个提示,直接【Tab】选择 【NO】然后回车。   3)重新生成启动引导。

1
update–grub

4)重启系统。

1
reboot

安装gcc

根据大佬的要求 gcc版本必须 >= 4.9 ,否则无法编译。 我在 Ubuntu 14上安装gcc的时候竟然是 4.8版本,可能是由于 Ubuntu 14版本的问题。 1)查看 gcc 版本 。如果 版本 >= 4.9 可跳过这个步骤了。

1
gcc –v

2) 执行以下命令来安装 gcc-4.9

1
2
3
4
apt–get install build–essential
add–apt–repository ppa:ubuntu–toolchain–r/test
apt–get update
apt–get install gcc–4.9

编译安装

1)请依次执行以下脚本。执行完重启服务器。

1
2
3
4
5
6
7
8
9
apt–get install make gcc–4.9
wget –O ./tcp_tsunami.chttps://gist.github.com/anonymous/ba338038e799eafbba173215153a7f3a/raw/55ff1e45c97b46f12261e07ca07633a9922ad55d/tcp_tsunami.c
echo “obj-m:=tcp_tsunami.o” > Makefile
make –C /lib/modules/$(uname –r)/build M=`pwd` modules CC=/usr/bin/gcc–4.9
install tcp_tsunami.ko /lib/modules/$(uname –r)/kernel
cp –rf ./tcp_tsunami.ko /lib/modules/$(uname –r)/kernel/net/ipv4
depmod –a
echo “net.core.default_qdisc=fq” >> /etc/sysctl.conf
echo “net.ipv4.tcp_congestion_control=tsunami” >> /etc/sysctl.conf

2)重启成功后,执行以下命令。如果有显示内容 说明启动成功。

1
lsmod  grep tsunami

>> tcp_tsunami 6053 5  

一键安装脚本

对于小白用户,以上手动安装可能有点复杂。那么就推荐你使用大佬的一键脚本吧。 提醒一下几位大佬的一键暂不支持 CentOS系统。大佬们的一键脚本可能在 Ubuntu14 下执行可能出问题。 如果一键出错,那么只能上面的内容手动安装了。 谢谢@Leonn 的博客 收集以下内容。

落雨无声版本

原文地址:https://ylws.me/tech/68.html 注意只支持 Debian8 / Ubuntu16 +

1
wget –N —no–check–certificate https://raw.githubusercontent.com/FunctionClub/YankeeBBR/master/bbr.sh && bash bbr.sh install

Vicer版本

原文地址:https://moeclub.org/2017/06/24/278/ 注意只支持 Debian8 / Ubuntu16 +

1
wget —no–check–certificate –qO ‘BBR_POWERED.sh’‘https://moeclub.org/attachment/LinuxShell/BBR_POWERED.sh’ && chmod a+x BBR_POWERED.sh &&bash BBR_POWERED.sh

91Yun版本

原文地址:https://www.91yun.org/archives/16781 注意只支持 Debian8 / Ubuntu16 +

1
2
3
wget https://raw.githubusercontent.com/singhigh/502newbbr/master/502newbbr.sh
chmod +x 502newbbr.sh
./502newbbr.sh

Crontab是一个Unix/Linux系统下的常用的定时执行工具,可以在无需人工干预的情况下运行指定作业。很多时候我们都要用到Crontab命令,例如在Let’s Encrypt Wildcard 免费泛域名SSL证书中提到了acme.sh 脚本就是利用了Crontab定时任务的形式来更新SSL证书。 通过crontab命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本,在Linux VPS挂载Google Drive和Dropbox中就可以用Crontab命令实现定时同步备份,用Crontab实现每天定时重启VPS、服务器或者是Nginx、PHP、MysqL服务等。 总之,掌握基本的Crontab命令语法对于我们管理自己的VPS主机是非常有必要的,本篇文章通过实例来讲解如何使用Linux Crontab命令,不作深入的探究,主要是方便日后的快速查询与参考。 Linux Crontab命令定时任务基本语法与操作教程-VPS/服务器自动化操作 更多的关于VPS主机有关的命令使用方法与应用,可以看看:

  1. Linux系统监控命令整理汇总-掌握CPU,内存,磁盘IO等找出性能瓶颈
  2. 三个命令工具Rsync,SCP,Tar-快速解决VPS远程网站搬家与数据同步
  3. Linux共享文件夹目录三种方法-NFS远程挂载,GlusterFS共享存储和samba共享目录

一、Crontab查看编辑重启

1、查看crontab定时执行任务列表

1
crontab -l

2、编辑crontab定时执行任务

1
crontab -e

3、删除crontab定时任务

crontab -r

4、相关命令:

1
2
3
4
5
sudo service crond start     #启动服务
sudo service crond stop #关闭服务
sudo service crond restart #重启服务
sudo service crond reload #重新载入配置
sudo service crond status #查看服务状态

二、Crontab基本格式语法

crontab 的时间表达式:

1
2
3
基本格式 :
*  *  *  *  *  command
分 时 日 月 周 命令

先来看一个例子。每天凌晨1:00执行备份程序:0 1 * * * /root/wzfou.com/backup.sh 。其中/root/wzfou.com/backup.sh 这是脚本路径,要使用绝对路径,前面的日期格式请直接看下图就知道了。 Linux Crontab命令日期格式 crontab还有操作符,用来实现一些复杂的时间设定需要。操作符有:

1、* 取值范围内的所有数字 ,代表所有。 2、/ 每过多少个数字 ,代表每隔n长时间。 3、- 从X到Z ,代表一段时间范围。 **4、,**散列数字,代表分割开多个值。

**PS:2018年4月15日更新,**感谢好友云落提醒,如果还有搞不懂代码公式的,可以使用这个在线Cron表达式生成器:http://cron.qqe2.com/

三、20个经典Crontab应用实例

以脚本/root/wzfou.com/backup.sh 为演示,大家在使用时记得替换为自己的脚本路径。感谢bukai.men提醒,请在相应的脚本第一行加上#!/bin/bash,否则脚本在定时任务中无法执行。 Linux Crontab命令应用实例 **实例1:**每1分钟执行一次

* * * * * /root/wzfou.com/backup.sh

**实例2:**每小时的第3和第15分钟执行一次

3,15 * * * * /root/wzfou.com/backup.sh

**实例3:**每天的8点到11点的第3和第15分钟执行一次

3,15 8-11 * * * /root/wzfou.com/backup.sh

**实例4:**每隔两天的上午8点到11点的第3和第15分钟执行一次

3,15 8-11 */2 * * /root/wzfou.com/backup.sh

**实例5:**每周一上午8点到11点的第3和第15分钟执行一次

3,15 8-11 * * 1 /root/wzfou.com/backup.sh

**实例6:**每晚的21:30执行一次

30 21 * * * /root/wzfou.com/backup.sh

**实例7:**每月1、10、22日的4 : 45执行一次

45 4 1,10,22 * * /root/wzfou.com/backup.sh

**实例8:**每周六、周日的1 : 10执行一次

10 1 * * 6,0 /root/wzfou.com/backup.sh

**实例9:**每天18 : 00至23 : 00之间每隔30分钟执行一次

0,30 18-23 * * * /root/wzfou.com/backup.sh

**实例10:**每星期六的晚上23: 00 pm执行一次

0 23 * * 6 /root/wzfou.com/backup.sh

**实例11:**每一小时执行一次

* */1 * * * /root/wzfou.com/backup.sh

**实例12:**每天晚上23点到第二天7点之间,每隔一小时执行一次

* 23-7/1 * * * /root/wzfou.com/backup.sh

实例13: 每个星期的第一天执行一次(即每个星期天晚上24:00开始执行).

@weekly /root/wzfou.com/backup.sh

**实例14:**每个月的15日执行一次.

0 11 15 * * /root/wzfou.com/backup.sh

**实例15:**每个月的第一天执行一次(即每个月的1日凌晨0点开始执行).

@monthly /root/wzfou.com/backup.sh

实例16: 在指定的月份执行一次(在1月,4月和 6月每天晚上0点执行一次).

0 0 * jan,apr,jun * /root/wzfou.com/backup.sh

实例17: 重启后执行一次.

@reboot /root/wzfou.com/backup.sh

**实例18:**定时任务执行后发一封邮件通知.

MAILTO=”raj”
1 1 * * * /root/wzfou.com/backup.sh

**实例19:**指定shell (默认的是/bin/bash)

SHELL=/bin/sh
1 1 * * * /root/wzfou.com/backup.sh

**实例20:**指定环境变量.

PATH=/sbin:/bin:/usr/sbin:/usr/bin
1 1 * * * /root/wzfou.com/backup.sh

四、Crontab可能存在的问题

4.1  Crontab不立即生效

大家新建的Crontab定时任务保存后需要等待2分钟后才会执行,当然如果想要立即执行可以重启Crontab。当crontab失效时,可以尝试/etc/init.d/crond restart解决问题,或者查看日志看某个任务有没有执行/报错tail -f /var/log/cron。

4.2  Crontab不执行

脚本中涉及文件路径时写全局路径,更新系统时间时区后需要重启cron。当手动执行脚本OK,但是crontab死活不执行时很有可能是环境变量,可尝试在crontab中直接引入环境变量解决问题,例如:

0 * * * * . /etc/profile;/bin/sh /root/wzfou.com/backup.sh

4.3  Crontab无权限执行

要注意系统级任务调度与用户级任务调度。只有 root 用户和 crontab 文件的所有者可以在 -e 、-l-r 和 -v标志后面使用 UserName 以编辑、列出、除去或验证指定用户的 crontab 文件。 root用户的任务调度操作可以通过”crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件。 想编辑别的用户的 crontab, 使用root运行下面的命令,同一个格式 (追加 “-u username” 到命令后) 也可以用来列出或删除 crontabs。

crontab -u username -e

4.4  Crontab执行后通知

Crontab定时任务在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,可以在日志中**/var/log/cron**看到。若是你不希望收到这样的通知,请在每一行空一格之后加上 > /dev/null 2>&1 即可。

    • 背景:

原版的BBR对于我们来说,速度不太稳定. 通过修改BBR源码,调整参数,使其更强劲.


  • 更新:

  • [2017.07.25]

  • 修复一个由检测gcc版本引起的不可预料的错误.

  • [2017.07.15]

  • 自动检测gcc版本,如果gcc版本大于4.9的将不会再安装gcc.

  • [2017.07.12]

  • 支持用户自行指定内核版本(需要与 -f 命令同时使用).


    • 准备:

使用前,请确认能够开启BBR. 可参考: Debian/Ubuntu 开启 TCP BBR 拥塞算法 或者直接执行此命令进行开启.

1
wget --no-check-certificate -qO 'BBR.sh' 'https://moeclub.org/attachment/LinuxShell/BBR.sh' && chmod a+x BBR.sh && bash BBR.sh -f

注意:执行此命令会自动重启.


    • 一键地址:
1
wget --no-check-certificate -qO 'BBR_POWERED.sh' 'https://moeclub.org/attachment/LinuxShell/BBR_POWERED.sh' && chmod a+x BBR_POWERED.sh && bash BBR_POWERED.sh
    • 指定内核版本(以v4.11.9内核版本为例):
1
wget --no-check-certificate -qO 'BBR_POWERED.sh' 'https://moeclub.org/attachment/LinuxShell/BBR_POWERED.sh' && chmod a+x BBR_POWERED.sh && bash BBR_POWERED.sh -f v4.11.9

    • 说明:
      • 执行过程中会重新编译模块.
      • 模块默认为开机自动加载.
      • 模块名称:tcp_bbr_powered
      • 可用 modprobe tcp_bbr_powered 命令进行加载模块.
      • 可执行 lsmod grep 'bbr_powered' 结果不为空,则加载模块成功
      • 可执行 sysctl -w net.ipv4.tcp_congestion_control=bbr_powered 使用此模块.

以上只是说明,直接使用一键脚本即可.


    • 完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/bin/bash

[ "$EUID" -ne '0' ] && echo "Error,This script must be run as root! " && exit 1
[ $# -gt '1' ] && [ "$1" == '-f' ] && tmpKernelVer="$2" tmpKernelVer='';
[ -z "$(dpkg -l grep 'grub-')" ] && echo "Not found grub." && exit 1
which make >/dev/null 2>&1
[ $? -ne '0' ] && {
echo "Install make..."
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq make >/dev/null 2>&1
which make >/dev/null 2>&1
[ $? -ne '0' ] && {
echo "Error! Install make. "
exit 1
}
}
which awk >/dev/null 2>&1
[ $? -ne '0' ] && {
echo "Install awk..."
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq gawk >/dev/null 2>&1
which awk >/dev/null 2>&1
[ $? -ne '0' ] && {
echo "Error! Install awk. "
exit 1
}
}
which gcc >/dev/null 2>&1
[ $? -ne '0' ] && {
echo "Install gcc..."
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq gcc >/dev/null 2>&1
which gcc >/dev/null 2>&1
[ $? -ne '0' ] && {
echo "Error! Install gcc. "
echo "Please 'apt-get update' and try again! "
exit 1
}
}
GCCVER="$(readlink `which gcc` grep -o '[0-9].*')"
GCCVER1="$(echo $GCCVER awk -F. '{print $1}')"
GCCVER2="$(echo $GCCVER awk -F. '{print $2}')"
[ -n "$GCCVER1" ] && [ "$GCCVER1" -gt '4' ] && CheckGCC='0' CheckGCC='1'
[ "$CheckGCC" == '1' ] && [ -n "$GCCVER2" ] && [ "$GCCVER2" -ge '9' ] && CheckGCC='0'
[ "$CheckGCC" == '1' ] && {
echo "The gcc version require gcc-4.9 or higher. "
echo "You can try apt-get install -y gcc-4.9 or apt-get install -y gcc-6"
echo "Please upgrade it manually! "
exit 1
}
KernelVer='';
KernelBitVer='';
MainURL='http://kernel.ubuntu.com/~kernel-ppa/mainline'
[ -n "$tmpKernelVer" ] && {
wget -qO /dev/null "$MainURL/$tmpKernelVer"
[ $? -ne '0' ] && echo 'Please input a vaild kernel version! exp: v4.11.9.' && exit 1
KernelVer="$tmpKernelVer"
}
[ -z "$tmpKernelVer" ] && {
KernelVerBIG="$(wget -qO- "$MainURL" awk -F '/">href="'%20'{print%20$2}'%20sed%20'/rc/d;/^$/d'%20tail%20-n1)"
[ -n "$KernelVerBIG" ] && KernelVer="$(wget -qO- "$MainURL" awk -F '/">href="'%20'{print%20$2}'%20sed%20'/rc/d;/^$/d'%20grep%20''${KernelVerBIG}''%20sort%20-n%20tail%20-n1)"
}
[ -z "$KernelVer" ] && echo 'Error,Get Kernel fail! ' && exit 1
ReleaseURL="$(echo -n "$MainURL/$KernelVer")"
KernelBit="$(getconf LONG_BIT)"
[ "$KernelBit" == '32' ] && KernelBitVer='i386'
[ "$KernelBit" == '64' ] && KernelBitVer='amd64'
[ -z "$KernelBitVer" ] && echo "Error! " && exit 1
HeadersFile="$(wget -qO- "$ReleaseURL" awk -F '">href="'%20'/generic.*.deb/{print%20$2}'%20grep%20'headers'%20grep%20"$KernelBitVer" head -n1)"
[ -n "$HeadersFile" ] && HeadersAll="$(echo "$HeadersFile" sed 's/-generic//g;s/_'${KernelBitVer}'.deb/_all.deb/g')"
[ -z "$HeadersAll" ] && echo "Error! Get Linux Headers for All." && exit 1
echo "$HeadersFile" grep -q "$(uname -r)"
[ $? -ne '0' ] && echo "Error! Header not be matched by Linux Kernel." && exit 1
echo -ne "Download Kernel Headers for All\n\t$HeadersAll\n"
wget -qO "$HeadersAll" "$ReleaseURL/$HeadersAll"
echo -ne "Install Kernel Headers for All\n\t$HeadersAll\n"
dpkg -i "$HeadersAll" >/dev/null 2>&1
echo -ne "Download Kernel Headers\n\t$HeadersFile\n"
wget -qO "$HeadersFile" "$ReleaseURL/$HeadersFile"
echo -ne "Install Kernel Headers\n\t$HeadersFile\n"
dpkg -i "$HeadersFile" >/dev/null 2>&1
echo -ne "Download BBR POWERED Source code\n"
[ -e ./tmp ] && rm -rf ./tmp
mkdir -p ./tmp && cd ./tmp
[ $? -eq '0' ] && {
wget --no-check-certificate -qO- 'https://moeclub.org/attachment/LinuxSoftware/bbr/tcp_bbr_powered.c.deb' >./tcp_bbr_powered.c
echo 'obj-m:=tcp_bbr_powered.o' >./Makefile
make -s -C /lib/modules/$(uname -r)/build M=`pwd` modules CC=`which gcc`
echo "Loading TCP BBR POWERED..."
[ -f ./tcp_bbr_powered.ko ] && [ -f /lib/modules/$(uname -r)/modules.dep ] && {
cp -rf ./tcp_bbr_powered.ko /lib/modules/$(uname -r)/kernel/net/ipv4
depmod -a >/dev/null 2>&1
}
modprobe tcp_bbr_powered
[ ! -f /etc/sysctl.conf ] && touch /etc/sysctl.conf
sed -i '/net.core.default_qdisc.*/d' /etc/sysctl.conf
sed -i '/net.ipv4.tcp_congestion_control.*/d' /etc/sysctl.conf
echo "net.core.default_qdisc = fq" >>/etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr_powered" >>/etc/sysctl.conf
}
lsmod grep -q 'bbr_powered'
[ $? -eq '0' ] && {
sysctl -p >/dev/null 2>&1
echo "Finish! "
exit 0
} {
echo "Error, Loading BBR POWERED."
exit 1
}

    • 注意事项:

如遇报错:Error! Header not be matched by Linux Kernel. 请用使用本博客提供的脚本重新开启BBR,或使用-f参数.可参考本篇中的准备步骤. 如遇报错:Error! Install makeError! Install gcc. 首先尝试apt-get update,再次执行此脚本. 如果未解决想办法自行安装gcc(>=4.9),或切换系统后再试. 本脚本在Debian8,Debian9,Ubuntu16.04上通过测试.


    • 引用评论中提供的在Ubuntu安装gcc-4.9的方法:
1
2
3
4
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y install g++-4.9

按:前些天本站分享了 BBR2 ,但是因为这玩意发包太猛,那怎么样调 BBR 的参数呢?之前  @EvanVane 大佬给我分享过一篇文章,本人实践中也很受用。如果你有一定的技术底气可以看看这篇文章,小白可以略过。另外也请不要伸手党,比如针对 C3 优化的 BBR 对 QN 就不一定适用(网络状况不同),今天调的参数下个月就不一定有用(因为其他人也会调,人家抢带宽后,我怎么样抢更多的带宽?那需要重新调参数。) 这个技术目前看来也不可能出一键包,要是想享受,还是好好自学下网络基础吧。 原题: 深夜聊聊 Bufferbloat 以及 TCP BBR  原作者: Bomb250 这篇文章的写作动机来源于知乎上的一个问题,有人问既然 Bufferbloat 是个问题,为什么路由器的缓存还要设计那么大。起初,我也是觉得缓存越大越好,这个就像人们拼命比拼谁的电脑内存大一样,因为在一般人眼里,内存越大就越快!然而对于网络而言,恰好相反,内存越大,越让人不想归家。 酒店舒适,但只是路过,没人会把家装修成酒店的样子,家才是越大越好。 路由器设计成携带大缓存的设备,这是一个错误!路由器不该有那么大的缓存,然而 TCP 大牛当年的一个“ AIMD 错误决定”让路由器的缓存越来越大,最终引发了 Bufferbloat !事情还要从安迪 – 比尔定律说起。

网络上的“安迪 – 比尔定律”

先解释一下安迪 – 比尔定律,即“比尔 . 盖茨拿走了安迪 . 格鲁夫所给的”。狭义的讲就是无论 Intel 的芯片快到多么牛逼的地步,微软的下一个 Windows 版本总是能把芯片的性能榨干,然而广义的讲,安迪 – 比尔定律连同摩尔定律一起事实上构成了信息产业的一台泵,典型的一个正反馈系统,这是决定互联网产业大爆发的本质原因,这个系统如下: 摩尔定律 -> 硬件性能提升 -> 软件填补硬件提升的空间

我们可以理解为,摩尔定律和安迪 – 比尔定律驱动了信息革命的车轮不断滚动从而碾压一切!

可以把路由器的越来越大的 Buffer 以及 TCP 贪婪地占据这些路由器 Buffer 两者看作是另一个“安迪 – 比尔定律”。因为 BBR 之前的 TCP 拥塞算法都是盲目且贪婪的,路由器加大的 Buffer 总是能被 TCP 的 AI( 加性增窗 ) 过程快速榨干,反过来大缓存延迟了 TCP 的丢包,同时增加了丢包的成本,这要求路由器提供更多的缓存。 具体来讲就是,如果路由器 Buffer 过小,基于丢包的拥塞算法固有的全局同步现象将会使得带宽的利用率极低,所以必须增加 Buffer 来弥补。这就是一个正反馈循环,肇事者可以说是基于丢包的 TCP 算法,它驱动了路由器 Buffer 越来越大,当 Buffer 越来越大, TCP 又会瞬间用完,永远喂不饱,直到永远。 好在有摩尔定律和 TCP 的 MD( 乘性减窗 ) 过程二者从中协调,如果同时失去了二者, TCP 早晚会全局崩溃! 我们假设硬件已经逼近了热密度的极限,摩尔定律失效了,此时不会再增加 Buffer 的大小了,会发生什么呢? 只要有 TCP 的 MD 过程在,互联网就不会崩溃,所以说, TCP 的 AI 过程保障了其效率,而 MD 过程则保证了收敛。 Google 的新拥塞控制框架来了以后, MD 过程便不被保证了,任何人都可以写一个永不降窗的算法,如果把主动的 MD 过程看作道德的话,那么路由器的 AQM 就是法律了。这就是 TCP/IP 的几乎全部内容了,我们可以看到,它极其复杂。 值得注意的是, TCP/IP 的安迪 – 比尔定律展现的这种复杂性,其促进因素不是摩尔定律,而是“人们对带宽的高利用率的追求”,因此便有了以下的关系: 提高带宽利用率 -> 路由器加大 Buffer->TCP 的 AIMD 填补加大的 Buffer 其实,这完全是错觉, TCP/IP 的框架不该这么复杂的。或许, AIMD 根本就不需要,事实上,是路由器不断加大的 Buffer 和 AIMD 一起纵容了坏事的频繁发生。这一点正如人们不断买新电脑,不断买新手机,然而过不了多久,你依然会发现不管再新的机器都卡的要死一样的道理,只不过,人们买的电脑也好,手机也好,它们的更新换代是摩尔定律驱动的,机器完全是个人所有的,你随时可以跟着摩尔定律的节奏更新换代,然而对于网络设备却不是这样。 网络设备,比如路由器,交换机之类,它们只是整个 TCP/IP 系统的一个环节而已,机房里面的设备是不可能频繁更新换代的,摩尔定律几乎被它们所无视。虽然摩尔定律依旧影响着设备的实际制造和升级,但由于这种周期相对较长,也就是可以忽略的了。但这里面有一个不变的定论,那就是 TCP 几乎全部都是以 AIMD 原则来运作的, UDP 则是无限贪婪的。 TCP 的 AI 会造成主动丢包,这也是基于丢包的拥塞控制算法的核心,而 MD 会造成全局同步,这两点无疑造成了带宽利用率的低下,这是 TCP 的硬伤,不得不靠不断加大的路由器 Buffer 来弥补,至少是延迟了悲剧的发生,在延迟悲剧的这段时间内,路由器当然希望端系统可以意识到事情正在悄悄起变化并采取一些措施。 …… AIMD ,正如以太网的 CSMA/CD 一样,并不完美,但是可用。现在的人们在千兆以太网出现之前,曾经推导出一个结论,那就是依靠 CSMA/CD 是不可能达到千兆 bps 的,然而如今已经是万兆甚至 4 万兆了 … 如果说以太网的载波监听,冲突检测是不必要且可被替换的,那么 TCP 的 AIMD 也是不必要且可被替换的,二者简直太像了!

Bufferbloat 问题

我不想说 TCP 的 AI/MD( 加性增和乘性减 ) 是错误的,我也不敢给出如此决绝的否定,然而,至少我想表达的是,在“安迪 – 比尔定律”的作用下, AI/MD 是有问题的!什么问题呢? Bufferbloat 问题! 再次重申,路由器携带很大的 Buffer ,是错误的!路由器 Buffer 在够用前提下越小越好,没有 Buffer ,自然就不会 bloat ,本来无一物,何处惹尘埃?!但是不能没有 Buffer…Buffer 到底是用来干什么的?到底多少合适? Buffer 其实就比较类似我们吃的食物,曾经,在物资贫乏的年代,大家都在追求要多吃,现在营养过剩了,则反过来了,要少吃,实际上,人体根本不需要太多的食物,够用即可,人体大部分的精力要用来做更有意义的事情。同样基于存储 / 转发 TCP/IP 网络上的路由器其根本任务不是做存储,而是做转发,存储只是在理论上不得已的一个手段。我来解释下是为什么。 路由器的入口和出口分别接收到达的数据包和转发数据包,一台路由器上往往有多个接口同时全双工地进行接收 / 转发,数据包的到达频率是统计意义上的,符合泊松分布,然而数据包的发送则是固有的接口速率,这是分组交换网的核心根基!路由器扮演什么角色?它是一个典型的多服务台排队系统!所以路由器必须携带一个 Buffer 用来平滑泊松分布的包到达和固定速率的包发送之间的关系。 那么,设计多大的 Buffer 合适呢?按照排队理论的现成公式计算,够用即可! 我们考虑极端一点的情况,如果我们把存储队列的 Buffer 设计成无穷大,从而转发延迟也将是无穷大 ( 因为排队延迟会趋向无穷大 ) ,会发生什么?无疑,这台路由器将会变成一个超级存储器,它将会拥有全世界所有的信息! 爆炸!转发设备变成了存储设备!这就是 Bufferbloat 。注意, Bufferbloat 的恶劣影响并不是会造成丢包,而是会无端增加无辜连接的延迟。这里有个认识上的误区,这种认识在中国人的思维中特别明显。很多人会觉得 Bufferbloat 会造成“丢包反馈延迟增加”,其实丢不丢包是你自己的事,如果你通过 RTT 梯度检测到了 Bufferbloat ,你依旧继续猛发,结果被 AQM 给丢了,那完全是你自己全责,事实上,这个时候大家都应该全局 MD 才对。

真正的危害在于,由于 Bufferbloat 造成了整个大 Buffer 被填充,所有的数据包都将等待一个固有的排队延迟,这会严重影响任意经过的实时类应用!千万别扯什么 QoS ,区分服务,综合服务,流量工程什么的,这些要真有用, 120 救护车就不会被堵在路上了,请注意,事在人为,事在人不为。

我最喜欢的其实不是 TCP/IP 网络什么的,而是城市规划,道路规划以及机械设计 (2002 年我的专业就是机械工程 ) ,我只是在 2004 年的时候初识了路由器,交换机之类的东西,发现自己竟然可以不用挖地铲土浇筑建桥就可以完成一条自己想象中的道路,并且还有那么多的现实场景,这不禁可以让人随时进入禅境 … 实际上,关于城市规划,道路规划以及机械设计也有很多电脑上的模拟器,但问题是它们毕竟只是模拟,是不真实的,而路由器,交换机是真实的,它们就摆在那,登录设备打开 Monitor ,我看到的是真实的东西,这与模拟器有大不同。

在后来的学习中,我发现路由器交换机之上有个 TCP/IP ,折腾起来一点也不比挖地铲土浇筑建桥来的轻松,但至少除了搬机器,上架,插线之外,没有什么体力活了,也还好。

路由器 Buffer 是什么?以高架路为例,它相当于上匝道前面的位置:

图中的汇入区就相当于路由器的 Buffer ,可以看出,如果汇入区过大的话,单位时间内就会有更多的车辆汇入主线,当这个量超过主线流量的时候,就会造成汇入区拥堵,同时大大降低主线的通行能力。这意味着,很多无辜的车辆被堵在了汇入区,主线上的车辆也会由于汇入去有大量车辆汇入而显示拥堵迹象,我给出给具体的例子吧,那就是上海南北高架广中路由南向北上匝道,那个汇入区太长了,足足 200 米 + ,结果造成那个位置几乎持续拥堵,不光广中路上匝道新上南北高架的车辆走不动,就连主路上的车辆也被拥堵,这是什么造成的?这是错觉造成的!广中路上匝道下面准备上高架的司机一看匝道是空的,唰唰全上去了,结果堵在汇入区了 … 如果广中路上匝道的汇入区修的短一些,那么拥堵只会体现在上匝道或者广中路路口,这种拥堵反馈到准备上高架的司机那里,结果就是,要么等,要么绕,至少会阻止他们上主线汇入区去添堵,伤害无辜的流量。 好了,该回到 TCP 了。路由器 Buffer 减小有什么好处呢?好处在于,即使有连接拼命去 AI 添堵,那么丢包会很快到来,并且很快反馈给发送方,于是发送方会执行 MD 以表示忏悔,整个过程中,实时流量不会受到丝毫影响。

劣币驱良币

BBR 是什么我就不解释了,我写了很多文章。这些文章中没有提到的是, BBR 属于那种即便上匝道汇入区修的再长也不上去添堵的德国好司机。那么结果是什么?你以为这种行为会感动全中国吗? 错了,这正是中国人所期许的,你谦让,我就流氓。你不去堵,我去堵。结果就是, BBR 即便不去主动添堵,也会被其它人堵在路上, BBR 只能说,这拥堵不是自己造成的,仅此而已。吃亏做好事又不被认可反被讹,这是我们这里常有的事, BBR 到了中国应该入乡随俗,你堵,我也堵!

BBR 开始为网络添堵

永远不要欺负老实人, BBR 开始做损人不利己的事了。在中国,所有的 TCP 拥塞控制算法都无法被公正评估,请注意,这个修改的意义在于, BBR 对于自身的性能没有任何提升,只是为了损人而已。我跑得慢,我踹你一脚把你整瘸了,你会更慢,这样我就第一了,竞速,竞速而已! 那么,这件坏事如何来做呢? 我的第一个版本不公开,事实证明它更有效,起码上了我的版本,别的就没的跑了,但问题是上两个我的版本,他俩双胞胎也会打架打得头破血流 … 本着和谐共存的原则,我从不教人学坏,所以我会删除并忘掉代码,再不提起。我这里给出稍微温和点的版本,兄弟俩打架的情况依然存在,但不严重,问题是,如何区别对方是否是自家人 … 难! BBR 计算总的最大发送量的时候,不是按照 max-Bandwidth 和 min-RTT 的乘积计算的吗?我这里维护了一个最小 RTT 窗口内的 max-RTT ,只要在一个最小 RTT 窗口内的实际 RTT 不大于上一次的 max-RTT ,我就让 BBR 使用这个实际的 RTT 而不是什么最小的 RTT 。这里的原则在于, BBR 会尝试在排队不丢包的情况下也去主动排队,入乡随俗。 代码非常简单,先为 BBR 增加一个字段,即 max_rtt_us ,与 min_rtt_us 相对,然后修改 update RTT 和 calc CWND 的逻辑:

1. 修改 bbr_update_min_rtt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Track min RTT seen in the min_rtt_win_sec filter window: */  
filter_expired = after(tcp_time_stamp,  
                            bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);  
if (rs->rtt_us >= 0 &&  
    (rs->rtt_us <= bbr->min_rtt_us filter_expired)) {  
        bbr->min_rtt_us = rs->rtt_us;  
        bbr->min_rtt_stamp = tcp_time_stamp;  
        bbr->rtt_us = rs->rtt_us;  
        if (filter_expired)  
            bbr->max_rtt_us = rs->rtt_us;  
}  
bbr->rtt_us = bbr->min_rtt_us;  
  
if (!filter_expired && rs->rtt_us >= 0 && rs->rtt_us < bbr->max_rtt_us) {  
    bbr->rtt_us = rs->rtt_us;  
}

2. 修改 bbr_target_cwnd

1
2
3
4
if (inet_csk(sk)->icsk_ca_state != TCP_CA_Open)  
    w = (u64)bw * bbr->min_rtt_us;  
else  
    w = (u64)bw * bbr->rtt_us;

最大 RTT 和最小 RTT 之差就是排队延迟,充分利用这个排队延迟去添堵是一件简单的好事,但是如何去对抗 AQM 则是一件非常复杂的事,因为你并不知道 AQM 的行为。以上的讨论均建立在尾部丢包的基础之上,然而现实情况则要面临复杂的 AQM ,在文章《 Linux Kernel 4.9 中 TCP BBR 算法的科普解释 》的“君莫舞,君不见玉环飞燕皆尘土”以及“ BBR 的优势之 – 与 AQM 的关系”两节中,我有阐述 BBR 如何乐观地等待 CUBIC 之流被惩罚以及如何愉快地上位,然而在“广中路上匝道”情形中, CUBIC 并不会被惩罚, BBR 自然也就不会上位,那怎么办,只能添堵,至于 AQM 怎么处理,一视同仁吧。换句话说, BBR 在 CUBIC 以及任意所谓“ TCP 加速者”面前,不必客气,他们抽烟,你就放火。

快递或者网络可靠吗

现在人们没了互联网就不能生活,这也是一种错觉。 其实互联网本身就是一种错觉,它是一种不得已而为之的错觉! 去年 1 月我去深圳万象城 ( 之所以说万象城而不是人人乐,我是想说我买的东西有多么高大上,以至于我多么迫不及待地想拥有 ) 买东西,无货,咋办?店主说次日可取,他们从广州拿货。现在问题来了,去一趟广州难吗?为什么我自己不直接去广州买,还要深圳万象城去广州拿货后再卖给我?因为我没时间!如果我有大把的时间又那么喜欢那件物品,我肯定自己去广州了,顺带旅游,然而我缺的正是时间。 快递业务填补了人们的时间间隙。但是快递业务真的可靠吗? 如果我自己去广州拿货,假设高铁不脱轨,汽车不翻车,自己不被人捅的情况下,一路上我愉快地去,拿到货后愉快地归来,一路上我亲自护送货品,我放心,我踏实。如果交由快递,我不知道快递车会不会翻车,会不会被人抢,里面会不会是假货 … 一切我都不确定,在送到我手里前,我只能祷告 ~ !但好处在于,这段送货的时间,在我信任快递公司的前提下,我可以做别的工作,如果我不信任快递公司,我只能心急如焚。好在,现在的快递公司,特别是顺丰还算靠谱,你不需要心急如焚。

但是网络,其可靠性完全是另一回事,幸亏人们用了 TCP ,不然就别玩了。字节的复制往往比丝帛的织造更加廉价,所以 TCP 有一个存储重发的机制,发送信息前先存储信息,一段时间没有收到回应,就重发被存储的信息,收到回应则将信息删除,如果发了一批丝绸到远方,一段时间没有反馈,然后再去织一批新的,那代价可就大了去了 …

我不亲自去广州而去委托快递公司,正是因为我没有时间,那么如果快递公司的快递过程“弥补”了我本应该节省的时间 ( 比如快递员懒惰 ) ,我还不如自己去拿货呢。 网络也一样,如果网络的延迟太高,那还不如用 U 盘拷贝信息,用汽车运输 U 盘,然后交付呢 … 网络和快递一样,就是图快,用专业的运输代替你自己的自取。然而,如果网络中有 Bufferbloat ,那么还不如去自取,甚至去用 U 盘拷贝。 Bufferbloat 让网络丧失了快速传输通道的名声。

新的 Bloat 版本的 BBR 算法

周日早晨,我登录到了温州老板提供的位于国外的 VPS 机器上,演绎了一个新版的 BBR 。也是添堵版的,在我的 WIFI 环境下碾压了标准的 BBR ,这就好像魔人布欧的分身一样,一个是好人的时候,另一个必须是恶棍。 非常简单:

1. 为 bbr 增加一个 minmax 类型的 max_rtt 字段

2. 修改 bbr_update_min_rtt 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
filter_expired = after(tcp_time_stamp,  
                            bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);  
if (rs->rtt_us >= 0 &&  
        (rs->rtt_us <= bbr->min_rtt_us filter_expired)) {  
    bbr->min_rtt_us = rs->rtt_us;  
    bbr->min_rtt_stamp = tcp_time_stamp;  
    bbr->rtt_us = rs->rtt_us;  
}  
bbr->rtt_us = rs->rtt_us;  
rtt_prior = minmax_get(&bbr->max_rtt);  
// 迄今为止最大的RTT与当前RTT取其小!是不是拿最大RTT和最小RTT求个"平均"什么的更合理呢?  
// 反正我是占点Buffer空间  
bbr->rtt_us = min(bbr->rtt_us, rtt_prior);  
  
minmax_running_max(&bbr->max_rtt, bbr_bw_rtts, bbr->rtt_cnt, rs->rtt_us);

我祝愿所有的 TCP 连接早日崩溃,我祝愿互联网越来越拥堵,最终不可用。

为什么 BBR 是合理的

AIMD 是基于丢包的拥塞控制算法的根基,这必然会 Buffer bloat ,解决之道就是不采用基于丢包的算法,而采用基于时延的算法,但是 …. 但是只要有一个基于丢包的算法还跑在互联网上,那么所有基于时延的算法都会集体退让 … 这是基于时延算法弊端,既然它基于时延而不是丢包,那么它就是注定要吃亏的。正确的做法是什么? BBR 无视丢包 ( 也并非绝对, BBR 在处理非 Open 状态时还是有措施的 ) ,无视时延 ( 也非绝对, BBR 只是无视了 RTT 的瞬时变化值 ) ,采用了实时采集并保留时间窗口的策略,这初看起来是吃亏的算法,与基于时延的算法无异,但是 BBR 拥有 Probe More 和 Drain Less 过程,这非常合理。 合理的并不意味着是可用的。我依然祝愿所有的 TCP 连接早日崩溃,我祝愿互联网越来越拥堵,最终变得不可用。我有一个梦想,每个人抡起铁锤去炼钢,少说多做,最好不说。

0%