linux如何编写crontab定时脚本,linux下编写定时任务crontab

linux下的crontab服务:

1、crontab 是用来让使用者在固定时间或固定间隔执行程序之用

在linux平台上如果需要实现任务调度功能可以编写cron脚本来实现。

以某一频率执行任务

linux缺省会启动crond进程,crond进程不需要用户启动、关闭。

crond进程负责读取调度任务并执行,用户只需要将相应的调度脚本写入cron的调度配置文件中。

cron的调度文件有以下几个:

1. crontab

2. cron.d

3. cron.daily

4. cron.hourly

5. cron.monthly

6. cron.weekly

如果用的任务不是以hourly monthly weekly方式执行,则可以将相应的crontab写入到crontab 或cron.d目录中。

示例:

每隔一分钟执行一次脚本 /opt/bin/test-cron.sh

可以在cron.d新建脚本 echo-date.sh

内容为

*/1 * * * * root /opt/bin/test-cron.sh

2、cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,如果它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:

在/etc/rc.d/rc.local这个脚本的末尾加上:

/sbin/service crond start

现在Cron这个服务已经在进程里面了,我们就可以用这个服务了

查看服务是否已经运行用 ps -ax | grep cron

3、crontab命令

查看该用户下的crontab服务是否创建成功, 用 crontab -l 命令

命令 which php 查看linux下安装的php的路径

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数

crontab -l //列出某个用户cron服务的详细内容

crontab -r //删除没个用户的cron服务

crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l

再例如,root想删除fred的cron设置:crontab -u fred -r

在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

任务调度的crond常驻命令crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此 任务调度命令。crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

crontab命令选项:

-u指定一个用户

-l列出某个用户的任务计划

-r删除某个用户的任务

-e编辑某个用户的任务

4、cron文件语法:

分 小时 日 月 星期 命令

0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)

记住几个特殊符号的含义:

“*”代表取值范围内的数字,

“/”代表”每”,

“-”代表从某个数字到某个数字,

“,”分开几个离散的数字

5、 新增调度任务

新增调度任务可用两种方法:

1)、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。

2)、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。

6、 查看调度任务

crontab -l //列出当前的所有调度任务

crontab -l -u jp //列出用户jp的所有调度任务

7、 删除任务调度工作

crontab -r //删除所有任务调度工作

8、 任务调度执行结果的转向

例1:每天5:30执行ls命令,并把结果输出到/jp/test文件中

30 5 * * * ls >/jp/test 2>&1

注:2>&1 表示执行结果及错误信息。

编辑/etc/crontab 文件配置cron

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次 /etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。

用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号

HOME=/ //使用者运行的路径,这里是根目录

# run-parts

01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本

02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本

22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行 /etc/cron.weekly内的脚本

42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意”run-parts”这个参数了,如果去掉这个参数的话,后面就可以写::要运行的某个脚本名,而不是文件夹名了。

例如:

1) 在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。

2)直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务

11 2 21 10 * rm -rf /mnt/fb

总结:

编写定时任务的两种方式:1.sudo vim /etc/crontab 2. sudo crontab -e

查看定时任务的两种方式:1.sudo cat /etc/crontab 2.sudo crontab -l

*/1 * * * * appuser cd /app/webserver/website/api-cb.chuchujie.com/master/current/script/ && ./back_coupon.sh 2 10 >> /dev/null 2>&1

查看定时任务是否运行:

sudo tail -f /var/log/cron //定时任务日志(查看刚才设置的任务是否执行)

注:脚本有可执行权限

sh a.sh(不需要执行权限)

./sh (需要执行权限)

1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别的。./filename是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。

关于img文件的扩容

新建一个img文件

dd if=/dev/zero bs=1M count=4096 >> FydeOS.img

关联设备

sudo losetup /dev/loop18 FydeOS.img #挂载img文件
sudo partprobe /dev/loop18 #重载分区表

重建分区

sudo parted /dev/loop18
unit s
print
rm 1
mkpart STATE 5898240s 100%
quit

查看磁盘分区

fdisk -l

磁盘检查和扩容

sudo e2fsck -f -y -v -C 0 ‘/dev/loop18p1’
sudo resize2fs -p ‘/dev/loop18p1’

卸载设备

sudo losetup -d /dev/loop18

如果修改img文件

sudo mkdir /mnt/lswjj #创建临时文件夹
sudo mount /dev/loop18p1 /mnt/lswjj #根据重载分区表后的情况是p1还是p2等
修改文件
sudo sync #同步文件
sudo umount /mnt/lswjj #卸载挂载的目录
sudo losetup -d /dev/loop18 #卸载挂载的设备

一个B类地址,它的子网掩码为255.255.224.0,能划分多少个子网

一个B类地址,它的子网掩码为255.255.224.0,能划分多少个子网? 每个子网容纳多少台主机?

255.255.224.0转成二进制是:
11111111.11111111.11100000.00000000

从上可以看出它向主机位借了三位,子网为2的3次方等于8,所以它有8个子网,分别为:000 001 010 011 100 101 110 111
减去首尾即:001-110 六个子网

再看主机位,减去子网尾,也就是2的13次方减去2 等于8190 也就是每个子网可以容纳8190台主机 上述子网掩码化成二进制就是
11111111 11111111 11100000 00000000
就是说向主机位借了3位
1.子网个数=把借的主机位个数做为2的几次方,也就是2的三次方=8个子网:
2,每个子网容纳的主机数=把网络位(0的位数)做为2的几次方再减去2=2的13次方-2=8190。

这是规率,如果不知道原因就先记规率,以后会明白的。 255.255.224.0/19 这个19代表是19位16进制的1 由于是一个B类的地址,所有前16位是网络位。而后16位才包括子网为和主机位。
要记住几个公式
主机数 是2的N次幂-2 这里的N是代表这16位0的个数。
255.255.224.0 他的十六进制就是11111111.11111111.11100000.00000000 后面的0的数量就是N,也就是主机数。
所以该掩码的主机数是2的13次幂-2 等于8192个

子网数 后16位中1个个数就是 2的3次幂 8个子网数

可用的子网号分别是 0,32,64,96,128,160,192,224这八个。 (是用256-224=32 然后依次递加32 直到224)

所以他们的可用的子网地址就是172.16.0.0
172.16.32.0以此类推到172.16.224.0这8个。

每个子网可用主机地址的范围是172.16.0.1~172.16.31.254 172.16.32.1172.16.63.254以此类推直到 172.16.192.1~172.16.223.254

新安装的Linux系统建议Bench命令

新安装的Linux系统,建议安装好后,运行3个bench测试命令。

wget -qO- bench.sh | bash
wget -qO- git.io/superbench.sh | bash
wget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh
chmod +x unixbench.sh
./unixbench.sh

需要有外网支持,因为要测试一下网络速度,用的是speedtest的cli,有些节点是境外的,所以请注意。

Superspeed.sh

Usage:

| No.      | Bash Command                    
|----------|---------------------------------
| 1        | wget https://raw.githubusercontent.com/oooldking/script/master/superspeed.sh      
| 2        | chmod +x superspeed.sh
| 3        | ./superspeed.sh

Superbench.sh

Usage:

| No.      | Bash Command                    |
|----------|---------------------------------|
| 1        | wget -qO- git.io/superbench.sh | bash       |
| 2        | curl -Lso- git.io/superbench.sh | bash      |

Bench.sh使用方法:
命令1:

wget -qO- bench.sh | bash

或者

curl -Lso- bench.sh | bash

命令2:

wget -qO- 86.re/bench.sh | bash

或者

curl -so- 86.re/bench.sh | bash

备注:
bench.sh 既是脚本名,同时又是域名。

下载地址:
https://github.com/teddysun/across/blob/master/bench.sh

同时最好做一下Unixbench

UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能。Unixbench的主要测试项目有:系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能提供测试数据。

最新版本UnixBench5.1.3,包含system和graphic测试,如果你需要测试graphic,则需要修改Makefile,不要注释掉”GRAPHIC_TESTS = defined”,同时需要系统提供x11perf命令gl_glibs库。
下面的脚本使用了最新版UnixBench5.1.3来测试,注释了关于graphic的测试项(大多数VPS都是没有显卡或者是集显,所以图像性能无需测试),运行10-30分钟后(根据CPU内核数量,运算时间不等)得出分数,越高越好。

测试方法:

wget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh
chmod +x unixbench.sh
./unixbench.sh

测试项目:
Dhrystone 2 using register variables
此项用于测试 string handling,因为没有浮点操作,所以深受软件和硬件设计(hardware and software design)、编译和链接(compiler and linker options)、代码优化(code optimazaton)、对内存的cache(cache memory)、等待状态(wait states)、整数数据类型(integer data types)的影响。

Double-Precision Whetstone
这一项测试浮点数操作的速度和效率。这一测试包括几个模块,每个模块都包括一组用于科学计算的操作。覆盖面很广的一系列 c 函数:sin,cos,sqrt,exp,log 被用于整数和浮点数的数学运算、数组访问、条件分支(conditional branch)和程序调用。此测试同时测试了整数和浮点数算术运算。

Execl Throughput
此测试考察每秒钟可以执行的 execl 系统调用的次数。 execl 系统调用是 exec 函数族的一员。它和其他一些与之相似的命令一样是 execve() 函数的前端。

File copy
测试从一个文件向另外一个文件传输数据的速率。每次测试使用不同大小的缓冲区。这一针对文件 read、write、copy 操作的测试统计规定时间(默认是 10s)内的文件 read、write、copy 操作次数。

Pipe Throughput
管道(pipe)是进程间交流的最简单方式,这里的 Pipe throughtput 指的是一秒钟内一个进程可以向一个管道写 512 字节数据然后再读回的次数。需要注意的是,pipe throughtput 在实际编程中没有对应的真实存在。

Pipe-based Context Switching
这个测试两个进程(每秒钟)通过一个管道交换一个不断增长的整数的次数。这一点很向现实编程中的一些应用,这个测试程序首先创建一个子进程,再和这个子进程进行双向的管道传输。

Process Creation
测试每秒钟一个进程可以创建子进程然后收回子进程的次数(子进程一定立即退出)。process creation 的关注点是新进程进程控制块(process control block)的创建和内存分配,即一针见血地关注内存带宽。一般说来,这个测试被用于对操作系统进程创建这一系统调用的不同实现的比较。

System Call Overhead
测试进入和离开操作系统内核的代价,即一次系统调用的代价。它利用一个反复地调用 getpid 函数的小程序达到此目的。

Shell Scripts
测试一秒钟内一个进程可以并发地开始一个 shell 脚本的 n 个拷贝的次数,n 一般取值 1,2,4,8。(我在测试时取 1, 8)。这个脚本对一个数据文件进行一系列的变形操作(transformation)。

转载自:秋水逸冰 » Linux性能测试UnixBench一键脚本

关于在Linux下挂载蒲公英的共享U盘

很有趣,家里有蒲公英的路由器,其实已经不怎么用了,因为有一些硬盘还没来得及放到nas里面,所以挂到了蒲公英的U盘共享里面。

目前碰到了一个问题是如何在Linux里面挂载这个硬盘。

  1. 安装smbclient和cifs-utils, sudo apt install smbclient cifs-utils
  2. 确认蒲公英的共享名,smbclient -U 用户名 -L //192.168.1.88/
  3. 确认后,用命令 sudo mount -t cifs //192.168.31.2/网盘共享名/ ~/本机共享名/ -o user=用户名,pass=密码,rw,vers=2.0(可以是1.0或2.0,不能是3.0,应该是蒲公英的支持的samba版本比较旧)

红色部分非常关键,蒲公英共享如果不输入这部分是没有办法正常共享的。

被Linux创始人称做艺术品的组网神器——WireGuard

这是转发的一篇文章,没经过作者同意,如有冒犯请告知,我将删除,原网址:被Linux创始人称做艺术品的组网神器——WireGuard – 知乎 (zhihu.com)

被Linux创始人称做艺术品的组网神器——WireGuard

WireGuard 是由 Jason Donenfeld 等人用 C 语言编写的一个开源3层网络隧道工具,被视为下一代 VPN 协议,旨在解决许多困扰 IPSec/IKEv2OpenVPN 或 L2TP 等其他 VPN 协议的问题。它与 Tinc 和 MeshBird 等现代 VPN 产品有一些相似之处,即加密技术先进、配置简单。从 2020 年 1 月开始,它已经并入了 Linux 内核的 5.6 版本,这意味着大多数 Linux 发行版的用户将拥有一个开箱即用的 WireGuard。

无论你是想破墙而出,还是想在服务器之间组网,WireGuard 都不会让你失望,它就是组网的『乐高积木』,就像 ZFS 是构建文件系统的『乐高积木』一样。

Linux创始人Linus Torvalds在邮件中称其为一件艺术品:work of art,邮件原文:https://lists.openwall.net/netdev/2018/08/02/124

Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s a work of art.
我能再说一次我非常喜欢它并且希望它能尽快并入内核么?或许代码不是最完美的,但是我大致浏览了一下,和OpenVPN、IPSec的恐怖相比,它就是一件艺术品。

特点

WireGuard 与其他 VPN 协议的性能测试对比:

可以看到 WireGuard 直接碾压其他 VPN 协议。再来说说 OpenVPN,大约有 10 万行代码,而 WireGuard 只有大概 4000 行代码,代码库相当精简。

WireGuard 优点:

  • 配置精简,可直接使用默认值
  • 只需最少的密钥管理工作,每个主机只需要 1 个公钥和 1 个私钥。
  • 就像普通的以太网接口一样,以 Linux 内核模块的形式运行,资源占用小。
  • 能够将部分流量或所有流量通过 VPN 传送到局域网内的任意主机。
  • 能够在网络故障恢复之后自动重连,戳到了其他 VPN 的痛处。
  • 比目前主流的 VPN 协议,连接速度要更快,延迟更低(见上图)。
  • 使用了更先进的加密技术,具有前向加密和抗降级攻击的能力。
  • 支持任何类型的二层网络通信,例如 ARPDHCP 和 ICMP,而不仅仅是 TCP/HTTP。
  • 可以运行在主机中为容器之间提供通信,也可以运行在容器中为主机之间提供通信。

WireGuard 不能做的事:

  • 类似 gossip 协议实现网络自愈。
  • 通过信令服务器突破双重 NAT。
  • 通过中央服务器自动分配和撤销密钥。
  • 发送原始的二层以太网帧。

当然,你可以使用 WireGuard 作为底层协议来实现自己想要的功能,从而弥补上述这些缺憾。

注意

  • 关于深度包检测:WireGuard并不关注混淆问题。相反,混淆应该发生在WireGuard之上的一层,WireGuard专注于以简单的实现方式提供坚实的加密技术,可以在上层进行混淆操作。
  • UDP协议:WireGuard默认使用UDP协议,由于TCP-over-TCP隧道的网络性能非常糟糕,WireGuard明确地不支持TCP隧道。相反,将WireGuard的UDP数据包转化为TCP是上层混淆的工作,可以由udptunnel和udp2raw等项目完成。

安装

WireGuard 的安装条件非常苛刻,对内核版本要求极高,不仅如此,在不同的系统中,内核,内核源码包,内核头文件必须存在且这三者版本要一致,Red Hat、CentOS、Fedora 等系统的内核,内核源码包,内核头文件包名分别为 kernelkernel-develkernel-headers;Debian、Ubuntu 等系统的内核,内核源码包,内核头文件包名分别为 kernellinux-headers。果这三者任一条件不满足的话,则不管是从代码编译安装还是从 repository 直接安装,也只是安装了 wireguard-tools 而已。而 WireGuard 真正工作的部分,是 wireguard-dkms,也就是动态内核模块支持(DKMS),是它将 WireGuard 编译到系统内核中。

目前 WireGuard 已经被合并到 Linux 5.6 内核中了,如果你的内核版本 >= 5.6,就可以用上原生的 WireGuard 了,只需要安装 wireguard-tools 即可,内核版本<5.6,可能需要首先更新内核,否则可能会报错:Unable to access interface: Protocol not supported,如下为更新内核版本示例(CentOS)

了,只需要安装 wireguard-tools 即可,内核版本<5.6,可能需要首先更新内核,否则可能会报错:Unable to access interface: Protocol not supported,如下为更新内核版本示例(CentOS)

# 查看当前内核版本
uname --kernel-release
​
# 安装必要工具,卸载旧的内核源码包
yum -y install epel-release curl
sed -i "0,/enabled=0/s//enabled=1/" /etc/yum.repos.d/epel.repo
yum remove -y kernel-devel
​
# 导入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 升级安装 elrepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# 安装新版本工具包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum -y --enablerepo=elrepo-kernel install kernel-ml
# 设置默认启动
sed -i "s/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/" /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.15.10-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-ml-devel-5.15.10-1.el7.elrepo.x86_64.rpm
yum -y --enablerepo=elrepo-kernel install kernel-ml-devel

最后重启

# 重启
reboot
​
# 查看升级后的内核版本
uname --kernel-release

牛刀小试

最开始尝试可以在内网中进行,避开互联网不稳定或者防火墙等因素,节点可以是内网中的两台虚拟机或者跑两个docker容器进行尝试。

下面在docker容器中进行最简单的配置,环境信息如下:

  • Linux:CentOS Linux release 7.9.2009 (Core)
  • docker版本:20.10.11

环境准备

创建两个容器wg1和wg2

  • -v /lib/modules:/lib/modules:指定了共享操作系统lib,否则会安装linux kernel header
# 创建wg1
docker run --rm -it --entrypoint=bash \
  --name=wg1 \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  -e PUID=1000 \
  -e PGID=1000 \
  -v /lib/modules:/lib/modules \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  linuxserver/wireguard 
  
# 同样的方式,新开一个session创建wg2
docker run --rm -it --entrypoint=bash \
  --name=wg2 \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  -e PUID=1000 \
  -e PGID=1000 \
  -v /lib/modules:/lib/modules \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  linuxserver/wireguard 
  
# 在新开一个session查看wg1和wg2的ip,记住此IP,后续会用到
docker inspect wg1 | grep IPAddress # 假设是172.17.0.2
docker inspect wg2 | grep IPAddress # 假设是172.17.0.3

配置生成

在wg1上执行如下命令生成wg1和wg2的配置

​
cd ~
​
# 生成wg1和wg2的公钥私钥配对
wg genkey | tee wg1-prikey | wg pubkey > wg1-pubkey
wg genkey | tee wg2-prikey | wg pubkey > wg2-pubkey
​
# 分别赋值
WG1_PRIKEY=`cat wg1-prikey`
WG1_PUBKEY=`cat wg1-pubkey`
WG2_PRIKEY=`cat wg2-prikey`
WG2_PUBKEY=`cat wg2-pubkey`
# 此例中以wg1作为服务端,所以endpoint配置成wg1的
WG1_IP=172.17.0.2
WG1_PORT=10240
​
​
# 生成适用于wg1的配置
cat > wg1.conf<<EOF
[Interface]
Address = 5.5.5.1/24
ListenPort = ${WG1_PORT}
PrivateKey = ${WG1_PRIKEY}
​
[Peer]
PublicKey = ${WG2_PUBKEY}
AllowedIPs = 5.5.5.2/32
EOF
​
# 生成适用于wg2的配置
cat > wg2.conf<<EOF
[Interface]
Address = 5.5.5.2/24
PrivateKey = ${WG2_PRIKEY}
​
[Peer]
PublicKey = ${WG1_PUBKEY}
Endpoint = ${WG1_IP}:${WG1_PORT}
AllowedIPs = 5.5.5.1/32
EOF
​
​

生成的配置类似如下,由于wireguard中是不区分服务端于客户端的,只添加peer,谁主动发起连谁就是客户端,因此发起一方必须得知道应该往哪里发,所以至少在发起端配置endpoint,本例中以wg2作为发起端,因此在wg2中配置wg1的endpoint。

注意IP地址的CIRD(Classless Inter-Domain Routing)表示法:

  • 首先明确子网掩码的含义:A subnet mask is a number that defines a range of IP addresses available within a network,即子网掩码用于表示一个网络中IP地址的范围,如255.255.255.0表示该网络中IP地址的最后一位可以变化,因为IP地址点分子节,一个字节表示范围是0~255,一共256个IP地址,其中0表示该网络自身(如192.168.1.0),255表示该网络中的广播地址(如192.168.1.255),其余均表示该网络中主机,一共能表示254个主机。
  • 5.5.5.1/24:表示IP为5.5.5.1/24表示子网掩码是255.255.255.0,其中255表示一个字节,一个字节有8位,所以255.255.255.0的二进制中一共有3*8=24个1,因此是/24
  • 5.5.5.1/32:表示IP为5.5.5.1,子网掩码位255.255.255.255
  • 5.5.5.0/24:不表示具体IP,表示整个IP段(范围),即5.5.5.0 ~ 5.5.5.255

wg1.conf

# 定义网络接口
[Interface]
# 定义wireguard的内网IP
Address = 5.5.5.1/24
# 定义固定监听端口,让主动连接的一方配置
ListenPort = 10240 
PrivateKey = UEoWVGCrF5J54H0ocflf9E+ALfC484Os4GfI0sHxj2E=
​
# 定义peer
[Peer]
PublicKey = mdiAU//BGJJTSr+fGl/BKByarfHKhQ3Giqp4Pazz4nU=
# 非常重要,AllowedIPs本质上是路由规则,表示目标地址为5.5.5.2的数据包都往该peer发送
# AllowedIPs支持列表,如AllowedIPs = 5.5.5.2/32,192.168.2.0/24
AllowedIPs = 5.5.5.2/32

wg2.conf

[Interface]
Address = 5.5.5.2/24
PrivateKey = IMu5e3LfN75Tx9lwewXH9ZDJBYwb1Kzsg8l7BfBQ7lk=
​
[Peer]
PublicKey = BlrbMx27LcCqAkRJ485m87ShfTLnJPeei+6COiDTWC4=
# 定义需要链接的服务端的IP和端口
Endpoint = 172.17.0.2:10240
AllowedIPs = 5.5.5.1/32

启动服务

wireguard默认配置文件路径为/etc/wireguard,使用快速配置工具wg-quick可快速启停,该工具本质是一个shell脚本

  • wg1上操作
# 拷贝配置文件到默认目录
$ cp wg1.conf /etc/wireguard
​
# 启动
$ wg-quick up wg1
​
[#] ip link add wg1 type wireguard
[#] wg setconf wg1 /dev/fd/63
[#] ip -4 address add 5.5.5.1/24 dev wg1
[#] ip link set mtu 1420 up dev wg1
​
# 查看
$ wg
​
interface: wg1
  public key: BlrbMx27LcCqAkRJ485m87ShfTLnJPeei+6COiDTWC4=
  private key: (hidden)
  listening port: 10240
​
peer: mdiAU//BGJJTSr+fGl/BKByarfHKhQ3Giqp4Pazz4nU=
  allowed ips: 5.5.5.2/32
​
  • wg2上操作和wg1操作相同,wg显示信息略有不同
$ wg
​
interface: wg2
  public key: mdiAU//BGJJTSr+fGl/BKByarfHKhQ3Giqp4Pazz4nU=
  private key: (hidden)
  listening port: 49238 # 端口为随机生成的UDP端口
​
peer: BlrbMx27LcCqAkRJ485m87ShfTLnJPeei+6COiDTWC4=
  endpoint: 172.17.0.2:10240  # 有指定wg1的IP和端口
  allowed ips: 5.5.5.1/32

测试

此时如果在wg1上ping wg2的内网IP 5.5.5.2是ping不通的,因为wg1其实不知道wg2应该连接哪个IP和端口

$ ping 5.5.5.2
PING 5.5.5.2 (5.5.5.2) 56(84) bytes of data.
From 5.5.5.1 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Destination address required
...

但是在wg2上ping wg1的内网IP 5.5.5.1是可以ping通的,因为配置了相应的endpoint

$ ping 5.5.5.1
PING 5.5.5.1 (5.5.5.1) 56(84) bytes of data.
64 bytes from 5.5.5.1: icmp_seq=1 ttl=64 time=0.493 ms
64 bytes from 5.5.5.1: icmp_seq=2 ttl=64 time=0.195 ms

此时wg1和wg2 peer已经配对,再在wg1上ping wg2可以ping通,至此简单的隧道已搭建完毕。

场景一:直连

所谓直连,是指peer的一端位于NAT后,没有公网IP地址,另一端位于公网中,有独立的不变IP地址,通过位于NAT后的peer主动加入位于公网的peer达到组网的目的,假设位于NAT后的peer提供了局域网服务,那么位于公网的peer就可以直接访问NAT后的局域网服务,如下图所示:

假设位于公网主机的IP为3.68.156.128,称为peer2,位于NAT后的主机称为peer1,那么peer2的配置应该如下,注意,以下配置私钥只是举例,请勿照搬,应参考牛刀小试中自行修改。

peer2配置

[Interface]
Address = 5.5.5.1/24
# 端口定义,peer1需要指定
ListenPort = 43155
PrivateKey = aHWomHYVWebT+lAPyZcofEfdQYXdFOXpVWRKD91OyXA=
​
# peer1的配置
[Peer]
PublicKey = 451o6In0DqSTyg1GE4WzrK4Z0BLuFXTrjdqjBJ/RLwc=
# 非常重要,指定将目标IP匹配上5.5.5.2/32或192.168.2.0/24的数据包发送给该peer
AllowedIPs = 5.5.5.2/32,192.168.2.0/24

注意,如果配置之后连不上,可能是由于防火墙的干扰,如下命令放行UDP端口

# 放开udp 43155端口
iptables -A INPUT -p udp --destination-port 43155 -j ACCEPT
# 关闭该端口
#iptables -D INPUT -p udp --destination-port 43155 -j ACCEPT
​

peer1配置

peer1的配置应该如下:

  • 其中iptables规则中eth0根据实际情况修改,原则是要将wireguard网卡收到的数据转发给主机网卡发送出去,并且配置了MASQUERADE,源地址将修改成eth0的地址,达到该数据包是peer1产生并发送到内网其他主机的(其实该数据包来源于位于公网的peer2)
  • PersistentKeepalive参数用于保持链接的存活,默认情况下wireguard在不使用的情况下尽量少发送数据包,但是在对于位于NAT后的peer1来讲,其公网地址随时都在变化,所以我们希望通过定时发送存活包让peer2知晓peer1的公网地址与对应的端口,保持链接的存活性,这就是所谓的IP漫游。
[Interface]
Address = 5.5.5.2/24
# 内网转发规则,将数据包做MASQUERADE源地址转换,并通过eth0转发出去
# eth0根据实际情况修改,ifconfig可查看
PostUp   = iptables -A FORWARD -i %i -j ACCEPT
PostUp   = iptables -A FORWARD -o %i -j ACCEPT
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 在wireguard关闭时清除这些iptables转发规则
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PrivateKey = oAaT5OjURGvVqs/pbMa2HAsZXpbwNQCEzW0MZBmGJ1Y=
​
​
# 指定peer2
[Peer]
PublicKey = 1yrnzlpVNhpQyyBj0oehVqCaL/06RjK/tcd3icMuZ0Q=
AllowedIPs = 5.5.5.1/32
# 指定peer2的Endpoint,用于隧道外层网络的链接
Endpoint = 3.68.156.128:43155
# 每隔15s发送一个keepalive数据包
# 让位于公网的peer2记住peer1的最新链接地址
PersistentKeepalive = 15

在peer2中启动服务,输出如下信息

$ wg
interface: wg10
  public key: 1yrnzlpVNhpQyyBj0oehVqCaL/06RjK/tcd3icMuZ0Q=
  private key: (hidden)
  listening port: 43155

在peer1中启动服务,输出如下信息,可以观察到

  • latest handshake: 3 seconds ago:最后一次握手在3秒前,配置了PersistentKeepalive会主动握手
  • persistent keepalive: every 15 seconds:保持链接存储周期,每个15秒发送keepalive包
$ wg
interface: wg10
  public key: 451o6In0DqSTyg1GE4WzrK4Z0BLuFXTrjdqjBJ/RLwc=
  private key: (hidden)
  listening port: 33807
​
peer: 1yrnzlpVNhpQyyBj0oehVqCaL/06RjK/tcd3icMuZ0Q=
  endpoint: 3.68.156.128:43155
  allowed ips: 5.5.5.1/32
  latest handshake: 3 seconds ago
  transfer: 92 B received, 180 B sent
  persistent keepalive: every 15 seconds

此时,再去peer2中查看wg信息,可以看到peer1的endpoint自动加上了,该endpoint和端口会根据NAT进行变化,这就是所谓IP漫游,而这一点是用户感知不到的,无需关心。

$ wg
interface: wg10
  public key: 1yrnzlpVNhpQyyBj0oehVqCaL/06RjK/tcd3icMuZ0Q=
  private key: (hidden)
  listening port: 43155
​
peer: 451o6In0DqSTyg1GE4WzrK4Z0BLuFXTrjdqjBJ/RLwc=
  endpoint: 5.20.222.65:33807
  allowed ips: 5.5.5.2/32, 192.168.2.0/24
  latest handshake: 26 seconds ago
  transfer: 212 B received, 92 B sent

尝试在peer2上访问peer1上的内网服务

# 用于wireguard自身的内网IP
ping 5.5.5.2
PING 5.5.5.2 (5.5.5.2) 56(84) bytes of data.
64 bytes from 5.5.5.2: icmp_seq=1 ttl=64 time=192 ms
...
​
# 用于真实访问的内网IP,如家庭内网中的影音服务
ping 192.168.2.5
PING 192.168.2.5 (192.168.2.5) 56(84) bytes of data.
64 bytes from 192.168.2.5: icmp_seq=1 ttl=127 time=193 ms
...

最后请注意,peer1最好使用Linux系统,因为需要使用iptables进行流量转发,windows系列转发实现较为复杂,可能需要使用powershell来实现相关转发。

如下为测试直连场景时的截图说明

场景二:中转

注意,应该先看直连方案后在看中转方案,中转方案是基于直连方案之上的。且对wireguard配置文件有一定了解

在现实情况中更多的场景是中转,如两台设备都处于NAT中,一台设备需要访问另外一台设备所处的内网,假设是peer1,peer2仍然是处于公网中的主机(假设IP为3.68.156.128),peer3则是需要访问peer1中内网服务的主机,如下图所示:

peer1配置

本地使用iptables进行家庭内网转发,指定peer为中转服务器peer2,并配置peer2的endpoint

[Interface]
Address = 5.5.5.2/24
# 注意eth0应修改为实际的网卡名字
PostUp   = iptables -A FORWARD -i %i -j ACCEPT
PostUp   = iptables -A FORWARD -o %i -j ACCEPT
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PrivateKey = oAaT5OjURGvVqs/pbMa2HAsZXpbwNQCEzW0MZBmGJ1Y=
​
# 指定为peer2(即中转服务器)
[Peer]
PublicKey = 1yrnzlpVNhpQyyBj0oehVqCaL/06RjK/tcd3icMuZ0Q=
#AllowedIPs = 5.5.5.1/32
#注意此处配置成网段5.5.5.0/24,而不仅仅是中转机的内网IP 5.5.5.1/32
#因为5.5.5.3也需要发给中转机去做转发,后续配置peer3的时候也是一样
AllowedIPs = 5.5.5.0/24
Endpoint = 3.68.156.128:43155
PersistentKeepalive = 15

peer2配置

中转服务器的配置,中转服务器也需配置iptables转发规则,将peer3的流量转发给peer1

[Interface]
Address = 5.5.5.1/24
PostUp   = iptables -A FORWARD -i %i -j ACCEPT
PostUp   = iptables -A FORWARD -o %i -j ACCEPT
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 43155
PrivateKey = aHWomHYVWebT+lAPyZcofEfdQYXdFOXpVWRKD91OyXA=
​
[Peer]
PublicKey = 451o6In0DqSTyg1GE4WzrK4Z0BLuFXTrjdqjBJ/RLwc=
#注意此处配置成具体的IP而不是IP段:5.5.5.2/32
#192.168.2.0/24配置成IP段是想让所有该网段的流量都流向peer1
AllowedIPs = 5.5.5.2/32,192.168.2.0/24
​
​
[Peer]
PublicKey = QOY2VaTZLtof4rtSrTS42d2Ld8vOc8hJwNcJu9DA8h8=
#同理,此处配置为IP
AllowedIPs = 5.5.5.3/32
​

注意,如果配置之后连不上,可能是由于防火墙的干扰,如下命令放行UDP端口

# 放开udp 43155端口
iptables -A INPUT -p udp --destination-port 43155 -j ACCEPT
# 关闭该端口
#iptables -D INPUT -p udp --destination-port 43155 -j ACCEPT
​

peer3配置

peer3配置最简单,只作为流量接收,不做转发,需要配置peer2的endpoint

[Interface]
Address = 5.5.5.3/24
PrivateKey = AA7GomiYl60DW5ZAGgn7VlwGWX8/Jw74qiYWPpknGWQ=
​
​
[Peer]
PublicKey = 1yrnzlpVNhpQyyBj0oehVqCaL/06RjK/tcd3icMuZ0Q=
# 特别注意,此处应该配置成IP段
# 因为就peer3而言,整个5.5.5.0/24和192.168.2.0/24网段都应该发给中转机处理
AllowedIPs = 5.5.5.0/24,192.168.2.0/24
Endpoint = 3.68.156.128:43155
PersistentKeepalive = 15

测试

基础的测试是在三台主机上分别ping 5.5.5.1、5.5.5.2、5.5.5.3这三个IP,能ping通说明组网成功,最后在peer3上ping目标内网域名

$ ping 192.168.2.5
PING 192.168.2.5 (192.168.2.5) 56(84) bytes of data.
64 bytes from 192.168.2.5: icmp_seq=1 ttl=127 time=213 ms
64 bytes from 192.168.2.5: icmp_seq=2 ttl=127 time=213 ms
...

如下为测试中转(网关)场景时的截图说明

IP路由规则

  • pee1中,指定peer2为中转机peer,并且所有5.5.5.0/24网段的IP数据都发送给该peer,因此指定AllowedIPs = 5.5.5.0/24
  • peer2中作为纯流量转发,一个原则就是是谁的数据就发送给相应的peer
  • peer3和peer1情况类似,指定peer2作为中转机,并且将所有5.5.5.0/24网段的IP数据都发送给该peer

iptables注意事项

如果发现主机peer3去ping主机peer1能成功,但是telnet端口不通有可能是iptables规则顺序问题,wireguard中有如下几条规则

该情况可能发生在peer1或peer2,主要看规则是不是加在丢弃所有包的规则之后!

PostUp   = iptables -A FORWARD -i %i -j ACCEPT
PostUp   = iptables -A FORWARD -o %i -j ACCEPT
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

这几条规则其实会在FORWARD链中末尾追加内容,如下所示(使用iptables -nvL FORWARD可查看)

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    ...
    # 该规则会舍弃掉所有包
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
    7   448 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0
    ...
    # 如下为追加的规则
    0     0 ACCEPT     all  --  wg21   *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  *      wg21    0.0.0.0/0            0.0.0.0/0
​

仔细观察一下上面的规则其实是有问题的,因为iptables会从上往下匹配,发现有DROPREJECT两条规则,规则都是所有丢弃所有包,我们自己添加的规则由于顺序问题导致优先级更低,所以其实没生效,因此只要将PostUp中的追加(-A)该为插入(-I),如下所示

PostUp   = iptables -I FORWARD -i %i -j ACCEPT
PostUp   = iptables -I FORWARD -o %i -j ACCEPT
PostUp   = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

改完之后规则顺序如下

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   # 自己添加的规则在最上面去了
   13   676 ACCEPT     all  --  *      wg21    0.0.0.0/0            0.0.0.0/0
   14   782 ACCEPT     all  --  wg21   *       0.0.0.0/0            0.0.0.0/0
    ...
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
    7   448 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

参考

关于在OpenWrt中的Wireguard和frp配合使用的心得

我写这篇文章的目的是记录在openwrt中使用wireguard,因为没有公网IP,所以需要配合frp来反向代理我的vps来进行组网。为什么不用zerotier,可能感觉wireguard更安全吧。

  1. 首先,wireguard是linux内核5.10以上一般默认自带的东东。但我们是在openwrt中使用,还是需要在编译openwrt的时候选择上这个应用的。
  2. 由于网上有详细的介绍,我就照抄这部分wireguard的了。

以下为恩山论坛的教学文章,https://www.right.com.cn/FORUM/thread-7553422-1-1.html,没有询问是否可以转载,如有侵权,请告知,我将删除,谢谢

一、路由端的设置
首先用SSH工具连接上路由器,我使用的工具是FinalShell,打开FinalShell,点击左上角的【文件夹】图标,点击【新建连接】按钮的图标,选择【SSH连接】

在弹出来的窗口中填写连接信息,名称任意,主机填写路由器的地址,认证方法选择【密码】,用户名和密码填写进入路由器的Web管理界面的用户名和密码,也就是路由器的管理员账号和密码,填写完成后点击【确当】按钮添加

在主页面中就可以看到刚刚添加的路由器了,点击路由器名称进行连接,弹出是否保存密钥,点击【接受并保存】

连接到路由器之后,我们需要在root文件夹下新建一个文件夹用来存储WireGuard的信息,输入一下命令新建文件夹

  1. cd /
  2. cd root
  3. mkdir WireGuard

复制代码
输入完以上命令后输入ls然后回车就可以看到刚刚新建的文件夹了

使用cd命令进入刚刚新建的文件夹

  1. cd WireGuard

复制代码

输入一下命令对文件夹设置权限

  1. umask 077

复制代码

为路由器端创建公钥和私钥,sprivatekey为私钥,spublickey为公钥

  1. wg genkey | tee sprivatekey | wg pubkey > spublickey

复制代码
输入完上面的命令后输入ls就可以看到创建的公钥和私钥了,在使用cat命令查看公钥和私钥的内容并且记录下来

  1. ls
  2. cat sprivatekey
  3. cat spublickey

复制代码

在浏览器打开路由器的Web管理界面,点击【网络】>【接口】>【添加新接口】

接口名称任意,我自己填写的是WG0,新接口的协议选【WireGuard virtual**】,然后点击【提交】

在【基本设置】中,把刚刚记录下来的私钥填写上去,监听端口自己指定一个,IP地址填写一个私有IP,不能与自己的局域网冲突就可以

【高级设置】保持默认

【防火墙设置】悬着【virtual**】,如果没有【virtual**】选项的就选【LAN】,我这个就没有【virtual**】选项,选好了之后点击【保持&应用】

在接口里面就可以看到刚刚新增的WG0接口了

接口新建完了之后还需要设置防火墙规则,点击【网络】>【防火墙】>【自定义规则】,把下面的命令粘贴进去,注意:192.168.5.0/24是WireGuard的网段,就是刚刚在接口里面填写的那个IP地址的网段,-o参数如果路由器的LAN口没有取消桥接就是br-lan,如果取消桥接了就是网口,例如eth0或者eth1等,如果不清楚自己的是什么可以在【网络】下的【接口】里面查看【LAN】口的名称或者网口,添加完成后点击【重启防火墙】

  1. iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -o br-lan -j MASQUERADE

复制代码

防火墙规则自定义完成后还需要开放端口,点击【网络】>【防火墙】>【通信规则】,滑倒最下面,在名称处填写一个名称,名称自定义,协议选【UDP】,外部端口填刚刚添加新端口时填写的监听端口,填写完成后点击【添加】,然后点击【保存&应用】,如果OpenWrt是旁路有,那么需要在主路由上做端口转发,外部端口和内部端口都填刚刚新建端口时填写的监听端口,IP地址填旁路有的IP地址,协议填UDP协议。

二、创建以及配置其他用户端
回到命令模式,在WireGuard文件夹下在新建一个文件夹,这样的目的是方便管理,一个用户一个文件夹,我这里创建了一个01文件夹,创建完成后使用cd命令进入文件夹

  1. mkdir 01

复制代码

先给01这个用户创建一个预共享密钥并查看记录下来,这个预共享密钥不是必须的,但是有这个可以提升访问的速度,使用以下命令

  1. wg genpsk > sharekey

复制代码

在使用创建01用户的私钥和公钥并且查看记录下来

  1. wg genkey | tee cprivatekey | wg pubkey > cpublickey

复制代码

公钥和私钥都生成后返回路由器的Web管理界面,点击【网络】>【接口】并找到刚刚创建的接口然后点击【修改】

找到Peers这一项,点击【添加】,在公钥那个地方填写刚刚01用户的公钥,允许的IP填写一个IP,要和刚刚创建的新接口在同一个网段上的,但是不能冲突,勾选上路由允许的IP,最下面的【更多选项】选泽【预共享密钥】,然后点击旁边的【添加】

点击【预共享密钥】旁边的【添加】之后,就可以看到预共享密钥这个填写框了,把刚刚创建的01用户的预共享密钥填写进去,填写完成后点击【保存&应用】按钮

这样路由器这端就设置好了,只需要生成配置文件然后再其他端导入配置文件就可以使用了,如果需要外网访问的话可以做一个端口映射,如果自己没有公网地址的话可以使用FRP进行穿透,配置文件是不能自动生成的,所以需要自己用文本文档填写好然后改成conf格式的文件,配置文件的格式如下,把对应的部分替换成自己的就可以,最后一行保持默认就可以。

  1. [Interface]
  2. Address = 分配到的virtual**地址
  3. PrivateKey = 客户端私钥
  4. DNS = 路由器IP
  5. [Peer]
  6. PublicKey = 路由器端公钥  
  7. AllowedIPs = 0.0.0.0/0
  8. presharedKey = 共享密钥
  9. Endpoint = 公网IP:端口号
  10. PersistentKeepalive = 25

复制代码
下面这个是我配置好的文件,可以做一个参考

  1. [Interface]
  2. Address = 192.168.5.2
  3. PrivateKey = WDCXBefHouhLKoAtIzZdl6PaCMZYxWuvTV4/0dPLRnw=
  4. DNS = 192.168.0.119
  5. [Peer]
  6. PublicKey = mAunaCFut7TsLgA5q0IRCc1ibcP8kvrA+jKvapR1x3Y=
  7. AllowedIPs = 0.0.0.0/0
  8. presharedKey = LK30DwbxuAwRfyJySRCNYEofXd5pJPeau6n87GyyeCE=
  9. Endpoint = 10.10.10.10:2000
  10. PersistentKeepalive = 25

复制代码

配置完成后点击【文件】>【另存为】,文件名为:xxx.conf,保持类型为:所有文件(*.*)

最后把这个文件导入到用户端使用就可以了。

以上是wireguard的用法,下面就是frp反向代理的具体操作方法了。也是从别人那里转发的,没经过同意,如果有问题,请告知,我将删除。原地址:第023期 两种方法搭建FRP内网穿透服务器|附防火墙设置避坑指南 – First Sunlight (126126.xyz)

视频连接

本期视频内容

本期视频给大家介绍两种方法搭建FRP内网穿透服务器,一种方法是使用Docker,另外一种方法是直接创建服务。 视频的最后会讲一下防火墙的设置,这也是萌新经常遇到的一个坑。

免费FRP服务器信息

请访问 https://frp.104300.xyz

服务器模板文件frps.ini

[common]
bind_addr = 0.0.0.0
bind_port = 7000

vhost_http_port = 80
vhost_https_port = 443

dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = yourpassowrd

token = 1234567890
allow_ports = 10001-50000
subdomain_host = your.subdomain

Docker代码

docker run --restart=always \
--network host -d \
-v /etc/frp/frps.ini:/etc/frp/frps.ini \
--name frps \
snowdreamtech/frps

直接创建FRP服务

# 下载
curl -L -o frp_0.37.1_linux_amd64.tar.gz https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.37.1_linux_amd64.tar.gz
# 复制文件
cp frp_0.37.1_linux_amd64/frps /usr/bin
cp frp_0.37.1_linux_amd64/systemd/frps.service /usr/lib/systemd/system
# 修改配置
sed -i 's/^User=nobody/# &/' /usr/lib/systemd/system/frps.service
# 启动服务
systemctl enable frps
systemctl start frps
# 查看服务状态
systemctl status frps

防火墙设置

  1. RedHat/CentOS
firewall-cmd --state
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=7000/tcp
firewall-cmd --permanent --zone=public --add-port=7500/tcp
firewall-cmd --permanent --zone=public --add-port=10001-50000/tcp
firewall-cmd --permanent --zone=public --add-port=10001-50000/udp
firewall-cmd --reload
  1. Debian/Ubuntu
ufw status
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 7000/tcp
ufw allow 7500/tcp
ufw allow 10001:50000/tcp
ufw allow 10001:50000/udp
  1. 其他
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 7000 -j ACCEPT
iptables -I INPUT -p tcp --dport 7500 -j ACCEPT
iptables -I INPUT -p tcp --dport 10001:50000 -j ACCEPT
iptables -I INPUT -p udp --dport 10001:50000 -j ACCEPT

如何快速判断主机端口是否开放

在使用 WLAN 联网的树莓派上安装 Proxmox VE 并创建虚拟机

本文转自https://blog.iks.moe/archives/Raspberry-Pi-Proxmox-VE-setup.html目前还没有授权,如有意见请告知,我将删除

  去年的这个时候收了一台树莓派 4B,到手之后宝塔建站一把梭之后就放在那里吃灰(没办法,技术太菜玩不了别的)。最近迷上了 PVE,想想手头也没有什么可以实践的物理设备,百般寻找之后便把目光锁定在了吃灰中的树莓派。
  Proxmox 论坛的 https://forum.proxmox.com/threads/how-to-run-pve-7-on-a-raspberry-pi.95658/ 帖子讲的是在有线网络接入 (eth0) 时的安装过程,目前我手里没有网线,所以只能修修改改踩踩坑探索一下 WLAN 接入网络 (wlan0) 时的安装和配置。

  本教程需求:Raspberry Pi 4 Model B(内存 2GB 或以上)、拥有宽带连接的 2.4GHz 或 5GHz 的 WLAN(SSID 不可带有下划线 (_)、DHCP 服务器能够给指定的 MAC 地址分配固定的 IP 地址功能、需要能够顺畅连接 raw.githubusercontent.com)、一台显示器、USB 接口的键盘以及一张容量至少为 16GB 且速度等级为 C10 或以上的 MicroSD 卡。

一、准备工作

1.1 刷写系统镜像

1.1.1 下载系统镜像

  访问 https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_lite_arm64/images/ 下载 Raspberry Pi OS ARM64 Lite 最新的版本,本文写作时的版本为 2021-11-08 (https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_lite_arm64/images/raspios_lite_arm64-2021-11-08/2021-10-30-raspios-bullseye-arm64-lite.zip)

Raspberry-Pi-Proxmox-VE-setup-image-système-base-télécharger

  清华大学 TUNA 源的速度还是很不错的。此外,阿里云镜像站(mirrors.aliyun.com)也提供相同的镜像。
系统镜像下载完成后,解压之,得到 ISO 文件。

Raspberry-Pi-Proxmox-VE-setupimage-système-base-décompresser

1.1.2 刷写系统镜像至 MicroSD 卡中

  下载 SD Card Formatter (https://www.sdcard.org/downloads/formatter/eula_windows/SDCardFormatterv5_WinEN.zip) 并安装。
  下载 Win32 Disk Imager (https://sourceforge.net/projects/win32diskimager/) 并安装。不建议拿其他刷写软件替代,比如 Rufus 刷写后不会给 BOOT 分区分配盘符。

  使用 SD Card Formatter 格式化 MicroSD 卡。

Raspberry-Pi-Proxmox-VE-setup-Formater-SD

  格式化完成后,打开 Win32 Disk Imager,向 MicroSD 卡写入系统镜像。

Raspberry-Pi-Proxmox-VE-setup-flash-miroir

1.2 准备网络环境

1.2.1 分配固定 IP 地址

  登录 WLAN AP (路由器)后台,给树莓派的 WLAN MAC 地址分配一个固定的 IP 地址。若暂时不知道其 MAC 地址,可以跳过此步。本文树莓派被分配到的 IP 地址为 192.168.1.233/24,网关为 192.168.1.1,DNS 地址为 192.168.1.1

Raspberry-Pi-Proxmox-VE-setup-attribuer-IP-fixe

1.2.2 使能 SSH 功能和 WLAN 连接

  步骤 1.1.2 刷写完成后,MicroSD 卡的 boot 分区会被分配一个盘符,进入此分区,新建文件 wpa_supplicant.conf 和 SSH。使用编辑器(不得使用 Window 记事本)编辑 wpa_supplicant.conf 文件,填入以下内容:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="WiFi的SSID"
psk="WiFi密码"
}

  保存即可,SSH 文件则保持空白。
  拔出 MicroSD 卡,将其插入树莓派。

二、配置底层系统

2.1 重新配置用户和密码

  使用 SSH 终端登录至树莓派(默认用户名 pi,密码 raspberry),执行 sudo -i 切换至 root 用户,执行 passwd root 和 passwd pi 修改 root 用户和 pi 用户的密码。

Raspberry-Pi-Proxmox-VE-setup-réinitialiser-passe

2.2 允许 root 用户通过 SSH 登录

  执行 echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config 后执行 systemctl restart sshd,使用 root 用户重新 SSH 连接至树莓派即可。

2.3 增加和修改源并安装内核头文件

  执行 rm /etc/apt/sources.list.d/*.list 清除不必要的源。
  编辑 /etc/apt/sources.list 文件,将 deb.debian.org 和 security.debian.org 尽数替换为 mirrors.cloud.tencent.com 并在下方添加以下两行内容:

deb https://raw.githubusercontent.com/pimox/pimox7/master/ dev/
deb http://mirrors.cloud.tencent.com/raspberrypi bullseye main

  效果如图

Raspberry-Pi-Proxmox-VE-setup-source-paquet

  其中,前 3 行的 mirrors.cloud.tencent.com 可以替换为其他支持 Debian 11 的源,第 5 行的 mirrors.cloud.tencent.com 可以替换为其他支持 Raspberry Pi OS 的源。部分源并不同时支持两者。

  执行 curl https://raw.githubusercontent.com/pimox/pimox7/master/KEY.gpg | sudo apt-key add – 以安装 Pimox7 的 gpg 公钥。

  执行 apt update && sudo apt dist-upgrade -y && apt install -y raspberrypi-kernel-headers 以更新软件包数据库、更新软件包和安装 raspberrypi 内核头文件。

2.4 静态化网卡

  编辑 /etc/network/interfaces 文件,清除原有内容后填入以下内容:

auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet static
address 192.168.1.233/24
gateway 192.168.1.1

  其中,192.168.1.233/24 和 192.168.1.1 分别为步骤 1.2.1 中提到的树莓派被分配到的 IP 地址和网关。修改完成后保存。

2.5 配置主机名

  执行 hostnamectl set-hostname RPi4-PVE-01,其中 RPi4-PVE-01 请自定义。
  编辑 /etc/hosts 文件,清除原有内容后填入以下内容:

127.0.0.1    localhost
192.168.1.233 RPi4-PVE-01

  其中,192.168.1.233 和 RPi4-PVE-01 分别为步骤 1.2.1 中提到的树莓派被分配到的 IP 地址和主机名。

2.6 扩大 SWAP

  树莓派默认的 SWAP 大小只有 100M,非常不适合本文场景,故请编辑 /etc/dphys-swapfile 文件,将原先 CONF_SWAPSIZE 的值从 100 改为 2048;执行 /etc/init.d/dphys-swapfile stop && /etc/init.d/dphys-swapfile start 以应用更改。

Raspberry-Pi-Proxmox-VE-setup-augmenter-taille-partition-d-échange

  一切完成后,重新启动系统。

三、安装 Proxmox VE

3.1 安装 Proxmox VE 本体

  将树莓派连接至显示器,插入键盘,执行 apt install -y proxmox-ve。因安装过程中将重置网络,故请勿直接在 SSH 中直接执行 apt install -y proxmox-ve

  弹出配置 Postfix 时,请选择 Local system

  安装需要半个小时左右,建议耐心等待;安装完成后,请重新启动设备。

3.2 配置无线网卡和虚拟网桥

  编辑 /etc/network/interfaces 文件,在 source-directory /etc/network/interfaces.d 此行上方插入以下内容:

auto wlan0
iface wlan0 inet dhcp
        wpa-ssid 114514
        wpa-psk qweasdzxc123

auto vmbr0
iface vmbr0 inet static
        address  10.154.46.1
        netmask  255.255.255.0
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up   iptables -t nat -A POSTROUTING -s '10.154.46.0/24' -o wlan0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.154.46.0/24' -o wlan0 -j MASQUERADE

  其中,wpa-ssid 后为 WLAN 的 SSID,wpa-psk 后为 WLAN 的密码。其他内容请按需修改。
执行 systemctl restart networking 以重启网络设备。

Raspberry-Pi-Proxmox-VE-setup-configurer-pont-virtuel

3.3 内核参数调整

  编辑 /etc/sysctl.conf 文件,添加以下内容:

vm.overcommit_memory=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp=0
net.ipv4.conf.default.send_redirects=1
net.ipv4.conf.all.send_redirects=0

  保存后执行 sysctl -p 使其生效。

Raspberry-Pi-Proxmox-VE-setup-réglage-paramètres-noyau

3.4 配置 Proxmox VE 用户界面

  访问 https://IP 地址:8006 (以下以 https://pve.iks.moe:28006 作为演示)登录 Proxmox VE 用户面板。

Raspberry-Pi-Proxmox-VE-setup-interface-utilisateur

  用户名和密码与步骤 2.1 中设置的系统用户名和密码一致;语言可选 Chinese (Simplified)

Raspberry-Pi-Proxmox-VE-setup-certificat-ssl

  单击本机唯一的节点,选择“凭证”,单击上方的“上传自定义凭证”按钮上传自定义的证书。此操作会让 Proxmox VE 用户界面在重载时使用自定义的证书,在主机名对应的情况下提供基于 TLS 的身份验证和加密的安全性。(把 pve.iks.moe 解析到步骤 1.2.1 中提到的 192.168.1.233 然后再传证书,刷新即可。)

Raspberry-Pi-Proxmox-VE-setup-arriverà-une-fin

四、创建 QEMU-KVM 虚拟机

4.1 下载镜像

  单击节点下的 local,选择 ISO映像,单击上方的“上传”(如果本地有镜像的话)或“从 URL 下载”下载相应的镜像。

Raspberry-Pi-Proxmox-VE-setup-télécharger-image-kvm

  因树莓派 4B 为 ARM64 架构,因此下载的镜像亦需要为 arm64 架构,腾讯云源 (https://mirrors.cloud.tencent.com/ubuntu-cdimage/https://mirrors.cloud.tencent.com/debian-cd/current/arm64/iso-cd/ 等有 Ubuntu 和 Debian 的镜像。本章以 Debian 11.1.0 ARM64 为例。

Raspberry-Pi-Proxmox-VE-setup-boîte-dialogue-téléchargement

  将镜像的 URL 粘贴到文本框后单击右边的“查询网址”,待文件名成功显示后即可单击下方的“立即下载”按钮。下载过程将在后台进行,进度将被实时打印。

Raspberry-Pi-Proxmox-VE-setup-télécharger-journal-kvm

4.2 创建虚拟机

  镜像下载完成后,单击右上角的“创建虚拟机”,弹出相关对话框。

Raspberry-Pi-Proxmox-VE-setup-créer-machine-virtuelle

  名称请自定义,其他内容请留空;在单击对话框底部的“下一步”前,请勾选左边的“高级”。

Raspberry-Pi-Proxmox-VE-setup-sélection-système-d-exploitation

  此处“操作系统”选择“不使用任何介质”。

Raspberry-Pi-Proxmox-VE-setup-paramètres-virtualisation-couche-matérielle

  勾选“QEMU代理”,并将 BIOS 改为 OVMF (UEFI),“添加EFI磁盘”下的“存储”选择 local

  随后的“磁盘大小 (GiB)”和“内存 (MiB)”请按需选择,其他配置建议默认。

Raspberry-Pi-Proxmox-VE-setup-configuration-terminée-kvm

  单击“完成”以开始创建虚拟机。

4.3 调整虚拟机的硬件

4.3.1 删除 CD/DVD 驱动器

  单击刚刚创建的虚拟机,选择“硬件”,单击选中 CD/DVD驱动器 (ide2) 后点击上方的“删除”按钮。

Raspberry-Pi-Proxmox-VE-setup-supprimer-CD-DVD

4.3.2 添加镜像驱动器

  单击上方的“添加”,选择“CD/DVD驱动器”。

Raspberry-Pi-Proxmox-VE-setup-créer-CD-DVD-étape

  “总线/设备” 选择 SCSI,顺序为 2;使用“存储”为 local,“ISO映像”为步骤 4.1 下载的 Debian 11.1 ARM64 镜像;单击对话框底部的“创建“按钮。

Raspberry-Pi-Proxmox-VE-setup-créer-CD-DVD-détaillé

4.3.3 调整开机顺序

  单击“选项”,双击右方的“引导顺序”,将 scsi2 改为如图在 scsi0 后、在 net0 前的顺序,单击对话框下方的“OK”保存之。

Raspberry-Pi-Proxmox-VE-setup-ajuster-séquence-démarrage

4.4 启动安装

4.4.1 开机

  单击右上角的“启动”按钮,再单击右方的“控制台”进入 noKVM,稍等片刻即可进入 Debian 安装程序。

Raspberry-Pi-Proxmox-VE-setup-départ-kvm

  请按照默认值进行安装。

4.4.2 手动配置网络

  当出现 Network autoconfiguration fails 时请不要惊慌,因为我们在步骤 3.2 配置的网桥 vmbr0 没有 DHCP 功能,故自动 DHCP 无法生效,此时我们需要指定网络配置。

Raspberry-Pi-Proxmox-VE-setup-configurer-manuellement-réseau

  此处选择 Configure network manually,在后续页面输入步骤 3.2 中提到的 10.154.46.2/24

Raspberry-Pi-Proxmox-VE-setup-entrez-l-adresse-IP

  此处的 Name server address 应该为步骤 1.2.1 中提到的 192.168.1.1

Raspberry-Pi-Proxmox-VE-setup-entrez-l-adresse-nameserver

  后续配置不是特别复杂,在此按下不表。(注意:需要手动配置软件包源为 China 以加快后续的安装速度)

Raspberry-Pi-Proxmox-VE-setup-finir-kvm

  KVM 虚拟机安装大功告成。

五、创建 LXC 虚拟机

5.1 下载镜像

  单击节点下的 local,选择 CT模板,单击上方的“上传”(如果本地有镜像的话)或“从 URL 下载”下载相应的镜像。

Raspberry-Pi-Proxmox-VE-setup-télécharger-image-lxc

  适用于 ARM64 的 LXC 镜像可以在 https://uk.lxd.images.canonical.com/images/ 找到,本章以 Debian 11 为例。

Raspberry-Pi-Proxmox-VE-setup-sélection-miroir-lxc

  将镜像的 URL 粘贴到文本框后单击右边的“查询网址”,待文件名成功显示后修改文件名为方便辨识发行版名称和版本的格式,然后单击下方的“立即下载”按钮。下载过程同样将在后台进行,进度也将被实时打印。

Raspberry-Pi-Proxmox-VE-setup-télécharger-journal-lxc

5.2 创建 CT

  镜像下载完成后,单击右上角的“创建CT”,弹出相关对话框。

Raspberry-Pi-Proxmox-VE-setup-créer-ct

  “密码”(需要“确认密码”)和“SSH 公钥”(可以通过下方的“加载SSH密钥文件”按钮载入)任选其一设置即可。

Raspberry-Pi-Proxmox-VE-setup-modèle-lxc

  “存储”选择 local,“模板”选择在步骤 5.1 中下载的模板;单击对话框底部的“下一步”;随后的“磁盘大小 (GiB)”和“内存 (MiB)”请按需选择,其他配置建议默认。

Raspberry-Pi-Proxmox-VE-setup-espace-lxc

  “IPv4/CIDR” 填写步骤 3.2 中提到的 10.154.46.3/24,“网关 (IPv4)”填写 步骤 3.2 中提到的 10.154.46.1,其他内容保持默认;单击在步骤“确认”下方的“完成”按钮以开始创建 LXC 容器。

Raspberry-Pi-Proxmox-VE-setup-réseau-lxc

5.3 开机

  开机方法与 KVM 相同,单击右上角的“启动”按钮,再单击右方的“控制台”即可直接进入已经安装完成的容器。

Raspberry-Pi-Proxmox-VE-setup-finir-lxc

  终。

鸣谢

在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法

2021-02-08 16:13:19作者:xww5稿源:深度站

2022-04-07 转自云牛网站 在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法_Linux教程_云网牛站 (ywnz.com)目前还没有授权,如有意见请告知,我将删除

本文图文介绍在深度Deepin 20.1系统中安装和配置最新英伟达NVIDIA显卡驱动的方法。需要先去下载驱动程序,比如下载NVIDIA-Linux-x86_64-460.39.run,然后进行安装及各方面的配置。可先参考在Deepin V20系统中给笔记本双显卡安装NVIDIA闭源驱动一文。 Deepin 20.1中安装和配置最新NVIDIA显卡驱动的全过程1、下载驱动如果不确定电脑显卡型号,可以用如下指令查看:sudo lshw -numeric -C display在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法进入NVIDIA官网下载Linux驱动,访问:https://www.nvidia.cn/,或者直接访问https://www.nvidia.cn/Download/index.aspx?lang=cn。找到对应驱动后下载,记住下载位置:在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法在下载里面找到:NVIDIA-Linux-x86_64-460.39.run,或者最新的NVIDIA显卡驱动程序。
2、安装深度的“显卡驱动管理器”在Deepin v20.1应用商店里面如果没有显卡驱动管理器,可以使用命令安装,命令如下:sudo apt install deepin-graphics-driver-manager安装深度的“显卡驱动器”,切换到因特尔默认驱动,然后重启两次,确认切换成功后,进行下一步。
3、卸载英伟达开源驱动和闭源驱动如果刚刚安装好系统,什么都没操作,那么这一步可以省略:sudo apt autoremove nvidia-*
4、禁止nouveau驱动nouveau是通过逆向“Nvidia的Linux驱动”创造的一个开源第三方Nvidia显卡驱动程序,因此其效果差,性能低。在手动安装NVIDIA闭源驱动时需要禁用nouveau驱动。终端执行以下命令修改文件(deepin-editor是Deepin自带的文本编辑器,gedit是Ubuntu自带的文本编辑器,如果你vim足够熟练你也可以使用vim):sudo deepin-editor /etc/modprobe.d/blacklist.conf在打开的blacklist.conf文件中复制以下内容并保存关闭:blacklist nouveaublacklist lbm-nouveauoptions nouveau modeset=0alias nouveau offalias lbm-nouveau off给blacklist.conf可以执行的权限:sudo chmod +x /etc/modprobe.d/blacklist.conf其中,blacklist nouveau是禁用nouveau第三方驱动,之后不需要改回来,由于nouveau是构建在内核中的,所以要执行下面命令生效:sudo update-initramfs -u好了,截止到目前,安装英伟达显卡的前期准备工作已经全部完成了。
5、重启运行以下命令:reboot重启后查看nouveau有没有运行,没输出代表禁用生效:lsmod | grep nouveau
6、关闭图形界面安装Nvidia闭源驱动程序时,需要停止当前的图形界面。使用快捷键CTRL+ALT+F2进入超级终端,登录账号(自己安装系统时候创建的个人账号),并关闭图形界面:sudo service lightdm stop
7、给驱动文件添加执行权限下载好的nvidia驱动文件是.run,需要添加执行权限。使用cd指令进入下载好的驱动文件路径,如果没有改浏览器的下载路径,路径一般是/home/(你的用户名)/Downloads:sudo chmod +x NVIDIA***.run #记得文件名改成自己下载的文件
8、开始安装驱动:sudo ~/Downloads/NVIDIA-Linux-x86_64-455.45.01.run -no-opengl-files -no-nouveau-check-no-opengl-files : 只安装驱动文件,不安装OpenGL文件-no-nouveau-check :安装驱动时不检查Nouveau安装过程中会出现一个页面,需要选择安装,以下是大致意思:
1].安装DKMP,选择YES,以后内核更新后,不用手动再次更新驱动。
2].安装32-bits兼容文件,选择Yes和No都可以。出现OK问我们是否安装。肯定安装,选择OK,按回车,等待安装完成。
3].安装Nvidia X-config允许更新xorg.conf配置文件重启时生效,选择NO。一定选择NO,不要相信网上说的一路yes。一定选择No。为什么呢,因为选择YES,你的笔记本(某些笔记本)或是双屏电脑,登录系统的时候,登录不了系统,会屏幕上左边全部是OK字样。因为显卡驱动检查到你的这个屏幕不是主要屏幕。
9、安装成功后重启运行以下命令:reboot如果安装过程 3选择了Yes,则可能出现界面显示一系列[OK] xxx后无法进入开机密码界面,是安装Nvidia驱动更新了xorg.conf配置文件,配置笔记本自带的显示屏居然不是主显示屏(问号?),两种解决方法:再接一个外接显示器重启,外接显示器可能正常展示开机密码界面。组合键ctrl+alt+F2进入tty2终端,删除/etc/X11/xorg.conf,重新安装驱动。如果安装过程 3选择了NO,正常启动,输入命令查看驱动信息:nvidia-smi使用nvidia-settings调出Nvidia图形界面。
10、检测NVIDIA驱动是否成功安装使用nvidia-settings命令:nvidia-settings终端执行这个命令会调出NVIDIA的驱动管理程序,如下:在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法这里可以看到NVIDIA驱动版本:460.39。
12、使用nvidia-smi命令英伟达系统管理接口(NVIDIA System Management Interface,简称nvidia-smi)是基于NVIDIA Management Library 的命令行管理组件,旨在帮助管理和监控NVIDIA GPU设备:nvidia-smi执行这条命令将会打印出当前系统安装的NVIDIA驱动信息,如下:在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法可以看到我的独立显卡型号2070以及其他信息。
13、命令行搜索集显和独显lspci | grep VGA # 查看集成显卡lspci | grep NVIDIA # 查看NVIDIA显卡
14、查看nouveau是否运行lsmod | grep nouveau没有返回代表没有运行。
15、集显与独立显切换笔记本外出时使用集显可以节省电量,增长待机时间。可以使用插件:dde-dock-switch_graphics_cardGithub:https://github.com/zty199/dde-dock-switch_graphics_card安装后可以方便地在dock栏切换显卡:在Deepin 20.1系统中安装和配置最新NVIDIA显卡驱动的方法
16、解决方案:安装dde-dock-graphics-plugin,地址:https://gitee.com/deepin-opensource/switch-graphics-card/releases,主页有教程:https://gitee.com/deepin-opensource/switch-graphics-card,下载xx.deb安装程序后,可直接双击安装。安装默认位置为/opt/apps/dde-dock-graphics-plugin,在终端输入命令:cd /opt/apps/dde-dock-graphics-pluginsudo sh ./files/bin/NVIDIA.sh重启后,Nvidia驱动运行正常,且多屏幕扩展问题也解决。
注:到这里,安装和配置NVIDIA全部结束。