作者: 027导航

  • Linux CPU 上下文切换的故障排查

    CPU 上下文切换是保证 Linux 系统正常运行的核心功能。可分为进程上下文切换、线程上下文切换和中断上下文切换。
    检查 CPU 的上下文切换

    我们知道,过多的上下文切换会消耗 CPU 的时间来保存和恢复寄存器、程序计数器、内核栈和虚拟内存等数据,从而导致系统性能显着下降。

    既然上下文切换对系统性能的影响如此之大,那么我们如何检查它呢?好了,你可以使用 vmstat 工具来查询你系统的上下文切换。

    vmstat

    vmstat 是一种常用的系统性能分析工具。主要用于分析内存使用情况,也常用于分析 CPU 上下文切换和中断的次数。

    例如 vmstat 5(5 秒输出间隔):

    让我们看一下输出:

    • cs(context switch):每秒上下文切换的次数。
    • in(interrupt):每秒的中断数。
    • r(running | runnable):就绪队列的长度,即正在运行和等待 CPU 的进程数。
    • b(blocked):处于不间断睡眠状态的进程数。

    在上面的例子中,我们可以看到上下文切换次数为 33​ 次,系统中断次数为 25​ 次,就绪队列长度,不间断状态进程数均为 0。

    pidstat

    vmstat​ 工具只给出了系统的整体上下文切换的信息。要查看每个进程的详细信息,您需要使用 pidstat​。添加 -w 选项,您可以看到每个进程的上下文切换:

    例如:

    $ pidstat -w 5
    Linux 4.15.0 (ubuntu)  09/23/18  _x86_64_  (2 CPU)
    08:18:26      UID       PID   cswch/s nvcswch/s  Command
    08:18:31        0         1      0.20      0.00  systemd
    08:18:31        0         8      5.40      0.00  rcu_sched
    ...

    结果中有两列需要我们注意:cswch​ 和 nvcswch​。其中,cswch​ 表示每秒自愿上下文切换的次数,nvcswch 表示每秒非自愿上下文切换的次数。

    自愿上下文切换:指进程无法获得所需资源而导致的上下文切换。例如,当 I/O 和内存等系统资源不足时,就会发生自愿上下文切换。

    非自愿上下文切换:指进程因时间片已过期而被系统强制重新调度时发生的上下文切换。例如,当大量进程竞争 CPU 时,很容易发生非自愿的上下文切换。

    您必须牢记这两个概念,因为它们意味着不同的性能问题。

    案例分析

    既然您知道如何查看这些指标,那么就会出现另一个问题,上下文切换频率多久才是正常的呢?让我们看一个示例案例。

    我们将使用 ​​sysbench​​​ ,一个多线程的基准测试工具通过生成负载来模拟上下文切换过多的问题。假设您已经在 Linux 系统上安装了 sysbench​ 和 sysstat。

    在我们模拟负载之前,让我们在一个终端中运行一下 vmstat:

    在这里可以看到当前的上下文切换次数 cs​ 是 35​,中断次数 in​ 是 19​,r​ 和 b​ 都是 0。由于我目前没有其他任务在运行,因此它们是空闲系统中的上下文切换数量。

    现在让我们运行 sysbench 来模拟多线程调度系统的瓶颈:

    $ sysbench --threads=10 --max-time=300 threads run

    现在,您应该会看到 vmstat 输出了与上面不同的结果:

    应该可以发现 cs​ 栏的上下文切换次数从之前的 35​ 次突增到 139 万次。同时,注意观察其他几个指标:

    r​:就绪队列的长度已达到 8
    us​ 和 sy:us 和 sy 的 CPU 使用率加起来是 100%,系统 CPU 使用率是 84%,说明 CPU 主要被内核占用。
    in​:中断数也上升到了 10000,说明中断处理也是一个潜在的问题。

    结合这些指标我们可以知道系统的就绪队列太长了,也就是有太多的进程在运行等待 CPU,导致大量的上下文切换,而大量的上下文切换导致了系统 CPU 使用率的增长。

    那么是什么过程导致了这些问题呢?

    我们继续分析,同时在第三个终端使用 pidstat,看看 CPU 和进程上下文切换的情况:

    $ pidstat -w -u 1
    08:06:33      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
    08:06:34        0     10488   30.00  100.00    0.00    0.00  100.00     0  sysbench
    08:06:34        0     26326    0.00    1.00    0.00    0.00    1.00     0  kworker/u4:2
    08:06:33      UID       PID   cswch/s nvcswch/s  Command
    08:06:34        0         8     11.00      0.00  rcu_sched
    08:06:34        0        16      1.00      0.00  ksoftirqd/1
    08:06:34        0       471      1.00      0.00  hv_balloon
    08:06:34        0      1230      1.00      0.00  iscsid
    08:06:34        0      4089      1.00      0.00  kworker/1:5
    08:06:34        0      4333      1.00      0.00  kworker/0:3
    08:06:34        0     10499      1.00    224.00  pidstat
    08:06:34        0     26326    236.00      0.00  kworker/u4:2
    08:06:34     1000     26784    223.00      0.00  sshd

    从 pidstat​ 的输出可以发现,CPU 使用率的增加确实是 sysbench​ 造成的,它的 CPU 使用率已经达到了 100%​。但上下文切换来自其他进程,包括非自愿上下文切换频率最高的 pidstat​,以及自愿上下文切换频率最高的内核线程 kworker​ 和 sshd。

    注意:默认情况下 pidstat​ 只显示进程的上下文切换,如果要查看实际线程的上下文切换,请添加 -t 选项。

    中断

    要找出中断数量也很高的原因所在,您可以检查 /proc/interrupts 文件。该文件会提供一个只读的中断使用情况。

    $ watch -d cat /proc/interrupts
               CPU0       CPU1
    ...
    RES:    2450431    5279697   Rescheduling interrupts
    ...

    观察一段时间后,可以发现变化最快的是重新调度中断(RES, REScheduling interrupt)。这种中断类型表明处于空闲状态的 CPU 被唤醒以调度新的任务运行。所以这里的中断增加是因为太多的任务调度问题,这和前面上下文切换次数的分析结果是一致的

    现在回到最初的问题,每秒多少次上下文切换是正常的?

    这个值实际上取决于系统本身的 CPU 性能。在我看来,如果系统的上下文切换次数比较稳定的话,几百到一万应该是正常的。但是,当上下文切换次数超过 10000,或者切换次数快速增加时,很可能是出现了性能问题。

    结论

    此时,你应该可以根据上下文切换的类型做一些具体的分析了。

    自愿上下文切换较多,说明进程在等待资源,可能会出现 I/O 饱和等其他问题。
    非自愿上下文切换较多,说明进程正在被强制调度,也就是都在争抢 CPU,说明 CPU 确实产生了瓶颈。
    中断次数增多,说明 CPU 被中断处理程序占用,需要通过查看 ​​/proc/interrupts​​ 文件来分析具体的中断类型。

  • 如何利用LINUX服务器安装宝塔面板

    使用工具

    LINUX服务器

    PUTTY工具,下载地址:https://down10.zol.com.cn/tongxin/putty_0.74.zip


    1、下载好Putty,运行“putty”,然后填写你的服务器或LINUX服务器的IP,填好后点击“Open”开始连接。

    如何利用LINUX服务器安装宝塔面板

    2、输入主机管理账号和密码完成连接(输入完成账号回车键确认)

    如何利用LINUX服务器安装宝塔面板

    3、输入密码,这里要提醒大家,你输入密码时,窗口是不会显示密码的。另外我们复制好密码,在此控制台窗口按鼠标右键就会自动粘贴。

    如何利用LINUX服务器安装宝塔面板

    4、如下图所示,表示连接成功

    如何利用LINUX服务器安装宝塔面板

    5、然后我们打开宝塔的官网地址,查看安装宝塔一键脚本

    宝塔官网地址:https://www.bt.cn/download/linux.html

    (这边我们装的是LINUX_CentOS7.6位系统,所以我们选择CentOS脚本进行安装)

    如何利用LINUX服务器安装宝塔面板

    6、复制成功后我们回到Putty软件,鼠标右键粘贴您复制的命令,然后回车安装即可

    7、安装途中会看到有一个(Y/N)的选项,这个时候我们选择Y,代表继续安装

    如何利用LINUX服务器安装宝塔面板

    8、安装完成后即可看到您的宝塔面板地址以及账号密码

    如何利用LINUX服务器安装宝塔面板

  • linux服务器一键优化脚本

    你是不是也经常遇见服务器特别卡顿,服务器里面安装东西特别的慢,或者说这场安装不了,yum install特别难用,网站解析速度特别慢?如果你也经常有这些问题,那么就快过来试一下这款linux服务器一键优化脚本吧!,可以一下子解决以上几个问题,让你的国外服务器流畅起来。

    这个linux服务器一键优化脚本是双翼鸟数据开发的(95盾老板)这两个是一家的,这两天我在他们网站里面看见,我给我的服务器也使用了这个脚本,我下载的这个脚本,好好研究了一下,觉得还行。

    原来我分享的那款服务器测速脚本,有人跟我说不能用了,我今天又测试了一下,这个脚本不能说,不能用了吧,差不多有一半不能用了,现在只能测硬盘速度,测不了全国连接速度了,大概是原来那些免费的节点已经没了,等我过一段时间再分享一个可以正常用的。

    这个linux服务器一键优化脚本执行命令

    curl -o yum.sh https://www.synidc.cn/yum.sh && chmod 777 yum.sh && ./yum.sh

    执行之后会出现下图这个

    linux服务器一键优化脚本

    可以无脑扣4然后直接什么也不用管了,如果你不需要全部优化可以根据自己实际情况选择。

    linux服务器一键优化脚本

    如果报错的话,有可能是没有安装curl,curl安装方法:

    yum install curl -y

    一般不用执行这个命令,大部分都是装了curl的,这个服务器优化脚本,无毒无公害,本人已经亲自检测了一下,这个脚本无加密,脚本下载地址:https://www.synidc.cn/helpcontent/18.html大家可以下载来研究研究。

    那么咱们说一下这个脚本的原理,这个原理其实很简单,这个脚本我下载下来看了一看,说白了就是修改yum源修改成国内阿里源,然后修改dns修改到国内阿里dns,外加国外谷歌dns,然后改一下ssh链接,就完事了。

     

  • Nginx查看并发连接数的2种方法

    生产环境中越来越多的项目使用Nginx作为WEB Server,与此同时我们也需要时刻关注Nginx状态,比如查看nginx当前并发连接数,确保正常运行。这篇文章分享下查看Nginx并发连接数的两种方法。

    方法一:通过WEB界面查看

    此方法需要依赖于nginx的http_stub_status_module模块,可输入nginx -V查看是否已经安装此模块,如果没有安装需要重新编译该模块。

    在您的任意一个server段内,添加如下配置:

    location /status {
       stub_status on;
    }

    配置修改完毕后输入命令:nginx -t确保语法没有问题,并重载一次nginx配置nginx -s reload,使其生效。再访问http://youdomain.com/status就可以看到连接数状态了,如下截图。

    上面参数的含义如下:

    • Active connections:当前 Nginx 正处理的活动连接数(1186),也就是当前的并发连接数
    • server accepts handled requests:总共处理了420484个连接,成功创建420484次握手,总共处理了408348个请求.
    • Reading:nginx 读取到客户端的 Header 信息数.
    • Writing:nginx 返回给客户端的 Header 信息数.
    • Waiting:开启 keep-alive 的情况下,这个值等于active-(reading+writing),意思就是Nginx已经处理完正在等候下一次请求指令的驻留连接.

    方法二:命令查看

    如果您只是想单纯的查看nginx当前并发连接数,不需要更详细的信息,直接使用下面的命令(netstat -apn|grep nginx: worker|wc -l)即可。

    [root@rakcdn ~]# netstat -apn|grep nginx: worker|wc -l
    1096

    引用

    此文部分内容参考了:NGINX:查看并发连接数

  • 打印机正常但无法打印打印机连接正常打印没反应

    (1)检查打印机的连接线有没有插好,比如说电源线、打印机数据线等;

    (2)检查打印机是否已经处于开机状态;

    (3)检查打印机驱动是否正常,如果不正常,或者需要更新,可以使用驱动总裁等软件进行安装或更新驱动;

    1、按 Win + R 组合键,打开运行,并输入:control 命令,确定或回车,可以快速打开控制面板,所有控制面板项窗口中,切换到小图标查看方式,然后找到并点击设备和打印机;

    2、右键点击无法打印的打印机;

    3、在打开的菜单项中,选择打印机属性;

    4、打开的界面中,切换到高级选项卡,设置一下,点新驱动程序;

    5、找到打印机的驱动就点下一步;

    6、弹出更新驱动的框,点完成即可;

    (4)检查一下Bios的打印机端口,有的打印机不支持ECP类型的打印端口信号,应将打印端口设置为容【Normal】、【ECP+EPP】方式;

  • Linux 环境下编译安装 PHP 扩展

    线上的生产环境通常为 LNMP,当因为业务需求需要用到某些扩展包,而那个扩展包需要相应版本的 PHP 扩展的时候,就需要安装对应的 PHP 扩展。

    编译安装扩展的方式都大同小异,这里就以安装 Yaf 框架的扩展为例,来演示如何编译安装 PHP 的扩展。

    1. 进入 PHP 扩展的官网 。

    2. 找到右上角的搜索框,输入 Yaf,下载最新版本的压缩包到服务器的指定目录。

    [root@localhost src]# wget http://pecl.php.net/get/yaf-3.0.7.tgz
    --2018-12-17 00:06:28--  http://pecl.php.net/get/yaf-3.0.7.tgz
    正在解析主机 pecl.php.net (pecl.php.net)... 104.236.228.160
    正在连接 pecl.php.net (pecl.php.net)|104.236.228.160|:80... 已连接。
    已发出 HTTP 请求,正在等待回应... 200 OK
    长度:97140 (95K) [application/octet-stream]
    正在保存至: yaf-3.0.7.tgz
    
    100%[========================================================================================================>] 97,140      43.9KB/s 用时 2.2s   
    
    2018-12-17 00:06:32 (43.9 KB/s) - 已保存 yaf-3.0.7.tgz [97140/97140])
    
    [root@localhost src]# 
    
    3. 解压缩软件包。
    [root@localhost src]# tar -zxvf yaf-3.0.7.tgz
    4. 配置、编译、安装
    [root@localhost src]# cd yaf-3.0.7/
    [root@localhost yaf-3.0.7]# /usr/local/php/bin/phpize 
    Configuring for:
    PHP Api Version:         20151012
    Zend Module Api No:      20151012
    Zend Extension Api No:   320151012
    [root@localhost yaf-3.0.7]# ./configure --with-php-config=/usr/local/php/bin/php-config
    checking for grep that handles long lines and -e... /usr/bin/grep
    checking for egrep... /usr/bin/grep -E
    checking for a sed that does not truncate output... /usr/bin/sed
    checking for cc... cc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether cc accepts -g... yes
    checking for cc option to accept ISO C89... none needed
    checking how to run the C preprocessor... cc -E
    checking for icc... no
    checking for suncc... no
    checking whether cc understands -c and -o together... yes
    checking for system library directory... lib
    checking if compiler supports -R... no
    checking if compiler supports -Wl,-rpath,... yes
    checking build system type... x86_64-unknown-linux-gnu
    checking host system type... x86_64-unknown-linux-gnu
    checking target system type... x86_64-unknown-linux-gnu
    checking for PHP prefix... /usr/local/php
    checking for PHP includes... -I/usr/local/php/include/php -I/usr/local/php/include/php/main -I/usr/local/php/include/php/TSRM -I/usr/local/php/include/php/Zend -I/usr/local/php/include/php/ext -I/usr/local/php/include/php/ext/date/lib
    checking for PHP extension directory... /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012
    checking for PHP installed headers prefix... /usr/local/php/include/php
    checking if debug is enabled... no
    checking if zts is enabled... no
    checking for re2c... no
    configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
    checking for gawk... gawk
    checking whether to enable yaf support... yes, shared
    checking PHP version... 7.0.32, ok
    checking for ld used by cc... /usr/bin/ld
    checking if the linker (/usr/bin/ld) is GNU ld... yes
    checking for /usr/bin/ld option to reload object files... -r
    checking for BSD-compatible nm... /usr/bin/nm -B
    checking whether ln -s works... yes
    checking how to recognize dependent libraries... pass_all
    checking for ANSI C header files... yes
    checking for sys/types.h... yes
    checking for sys/stat.h... yes
    checking for stdlib.h... yes
    checking for string.h... yes
    checking for memory.h... yes
    checking for strings.h... yes
    checking for inttypes.h... yes
    checking for stdint.h... yes
    checking for unistd.h... yes
    checking dlfcn.h usability... yes
    checking dlfcn.h presence... yes
    checking for dlfcn.h... yes
    checking the maximum length of command line arguments... 1572864
    checking command to parse /usr/bin/nm -B output from cc object... ok
    checking for objdir... .libs
    checking for ar... ar
    checking for ranlib... ranlib
    checking for strip... strip
    checking if cc supports -fno-rtti -fno-exceptions... no
    checking for cc option to produce PIC... -fPIC
    checking if cc PIC flag -fPIC works... yes
    checking if cc static flag -static works... no
    checking if cc supports -c -o file.o... yes
    checking whether the cc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
    checking whether -lc should be explicitly linked in... no
    checking dynamic linker characteristics... GNU/Linux ld.so
    checking how to hardcode library paths into programs... immediate
    checking whether stripping libraries is possible... yes
    checking if libtool supports shared libraries... yes
    checking whether to build shared libraries... yes
    checking whether to build static libraries... no
    
    creating libtool
    appending configuration tag "CXX" to libtool
    configure: creating ./config.status
    config.status: creating config.h
    [root@localhost yaf-3.0.7]# 
    [root@localhost yaf-3.0.7]# make && make install
    
    
    编译和安装的过程省略了...
    
    /bin/sh /usr/local/src/yaf-3.0.7/libtool --mode=install cp ./yaf.la /usr/local/src/yaf-3.0.7/modules
    cp ./.libs/yaf.so /usr/local/src/yaf-3.0.7/modules/yaf.so
    cp ./.libs/yaf.lai /usr/local/src/yaf-3.0.7/modules/yaf.la
    PATH="$PATH:/sbin" ldconfig -n /usr/local/src/yaf-3.0.7/modules
    ----------------------------------------------------------------------
    Libraries have been installed in:
     /usr/local/src/yaf-3.0.7/modules
    
    If you ever happen to want to link against installed libraries
    in a given directory, LIBDIR, you must either use libtool, and
    specify the full pathname of the library, or use the `-LLIBDIR
    flag during linking and do at least one of the following:
     - add LIBDIR to the `LD_LIBRARY_PATH environment variable
       during execution
     - add LIBDIR to the `LD_RUN_PATH environment variable
       during linking
     - use the `-Wl,--rpath -Wl,LIBDIR linker flag
     - have your system administrator add LIBDIR to `/etc/ld.so.conf
    
    See any operating system documentation about shared libraries for
    more information, such as the ld(1) and ld.so(8) manual pages.
    ----------------------------------------------------------------------
    
    Build complete.
    Dont forget to run make test.
    
    Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/
    [root@localhost yaf-3.0.7]# 
    
    5. 修改 PHP 配置文件,验证配置

    由上面可知,扩展已经被安装到了 /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/ 这个目录里面,接下来需要在 PHP 的配置文件中添加 Yaf 这个扩展。

    vim /etc/php.ini
    846 
    847 ;;;;;;;;;;;;;;;;;;;;;;
    848 ; Dynamic Extensions ;
    849 ;;;;;;;;;;;;;;;;;;;;;;
    850 
    851 ; If you wish to have an extension loaded automatically, use the following
    852 ; syntax:
    853 ;
    854 ;   extension=modulename.extension
    855 ;
    856 ; For example, on Windows:
    857 ;
    858 ;   extension=msql.dll
    859 ;
    860 ; ... or under UNIX:
    861 ;
    862 ;   extension=msql.so
    863 ;
    864 ; ... or with a path:
    865 ;
    866 ;   extension=/path/to/extension/msql.so
    867 ;
    868 ; If you only provide the name of the extension, PHP will look for it in its
    869 ; default extension directory.
    870 ;
    871 ; Windows Extensions
    872 ; Note that ODBC support is built in, so no dll is needed for it.
    873 ; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5+)
    874 ; extension folders as well as the separate PECL DLL download (PHP 5+).
    875 ; Be sure to appropriately set the extension_dir directive.
    876 ;
    877 ;extension=php_bz2.dll
    878 ;extension=php_curl.dll
    879 ;extension=php_fileinfo.dll
    880 ;extension=php_ftp.dll

    在这块区域附近加入一行代码:

    extension=yaf.so

    关闭配置文件,重启服务。

    [root@localhost no-debug-non-zts-20151012]# service php-fpm restart 
    Gracefully shutting down php-fpm . done
    Starting php-fpm  done

    在浏览器中查看 phpinfo,确认扩展是否安装成功。

    至此,PHP的扩展安装结束。

  • Linu Torvald 宣布 Linux Kernel 57 释出

    Linus Torvalds 在内核邮件上宣布释出了 Linux 5.7。其在发布公告中评论道:“所以,上周我们表现得相当平静,没有任何尖叫声让我们再拖一个rc。祈祷好运-希望这次我们不会出现像上次在 5.6 中那样,即在最后一刻还进行了 wifi 回归的之类情况。 ”

    Linux 5.7 主要新特性包括:任务调度器支持热压,当 CPU 过热时热量调节器会限制 CPU 的最高频率降低其最大可用计算能力,如果任务调度器不感知这一频率变化,它的调度决策将会假定可用计算能力大于实际计算能力;移除微软实现的 exFAT 文件系统加入三星的 exFAT;Split Lock 检测;频率一致性调度器;ARM 内核指针验证支持,防止指针遭修改减少安全漏洞;userfaultfd() 写保护支持;基于 BPF 的安全模块 bpf-lsm;等等,更多可浏览 KernelNewbies 5.7:https://kernelnewbies.org/Linux_5.7

    Linus 表示,“不过尽管上次最后一刻的回归令人尴尬,但看起来一切都很好。上一两周我见过的大多数讨论都与即将发布的功能有关,因此合并窗口现在已打开,明天我将照常开始处理请求。但与此同时,请稍作调整。”

    此外,Linus 还透露,“与往常一样,我们在 5.7 中进行了很多更改(所有统计信息看起来都很正常,但对我们来说‘正常’显然相当大,这意味着‘从近两千名开发人员开始,几乎有 1.4 万个非合并提交’), 因此,附加的简短日志只是自 rc7 以来上周出现的一些小内容。”

    Linux Kernel 5.7 版本包含了许多新功能和改进,例如 Apple USB“Fast Charge”驱动程序;Intel Tiger Lake“Gen12”显卡现在被认为是稳定的,并且已脱离了实验性标志;以及状态良好的 AMD Renoir 显卡;F2FS Zstd 支持;和 Qualcomm Snapdragon 865 支持等等。

  • 无公网服务器通过另一台有公网服务器向外联网

    公司最近为了节约成本,将原来部署测试环境的阿里云的服务器停止续费,从腾讯云新购了四台服务器。

    为了尽可能的节约成本,四台服务器,只购买了一个公网 IP,其他服务器计划通过内网桥接之类的联网,实际操作后,发现事情没有这么简单,折腾了几天才解决,现在记录一下。

    一开始搜了很多教程,都是 window 宿主机安装 VM 虚拟机进行桥接的教程,最后找到一个内网服务器通过代理使用有外网的服务器下载公网数据,但是这样不能 ping 通外网,好像速度也有限制,代理的教程链接如下:

    内网服务器如何设置代理访问外网

    最后感觉一些 docker 相关的东西还是联网困难,还是需要一个完美的联网方式,又搜了很久,搜到这篇利用建立虚拟网关进行联网的教程,测试一切联网正常,也可以在没有公网的服务器里 ping 通 baidu.com ,教程链接如下:

    无公网服务器通过另一台有公网服务器联网

    这里也搬运一下教程,防止链接失效

    有公网服务器操作:

    1、安装

    yum install -y pptpd

    2、修改配置

    vim /etc/pptpd.conf

    在编辑的文件里最下面添加以下代码(原文:代码意思是通过虚拟网关实现,localip即本地的虚拟网关,remoteip是开放的网关ip,类似于路由器一样,分配给链接的服务器。):

    localip 192.168.0.1
    remoteip 192.168.0.234-238,192.168.0.245

    3、增加配置

    打开 /etc/ppp/chap-secrets 配置文件,执行以下命令。

    //用户名    pptpd    密码    *
    root    pptpd    123456    *

    4、启动pptpd服务

    systemctl start pptpd

    若想添加自启则执行以下命令,关闭则将on改为off

    chkconfig pptpd on

    5、开启转发

    同时还需要开启转发,及iptables功能。

    echo 1 > /proc/sys/net/ipv4/ip_forward

    以上命令为临时开启,重启消失。如想永久开启,则执行以下命令编辑,将 net.ipv4.ip_forward=0 改为 net.ipv4.ip_forward=1 即可。

    vim /etc/sysctl.conf

    6、开启iptables nat功能

    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE

    若想自动生效,则安装iptables-services,之后开启功能,然后保存配置。并配置自启。

    yum install iptables-services
    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
    service iptables save
    systemctl enable iptables.service

    内网服务器操作

    1、安装PPTP和PPTP-SETUP

    安装PPTP和PPTP-SETUP,在centos无法安装pptp-setup,需要自行配置拨号文件(详见下面)。

    yum install -y pptp pptp-setup

    2、配置拨号文件

    首先要知道 公网服务器的内网ip ,替换下面的 xxx.xxx.xxx.xxx 。这里创建了一个名为test的拨号文件

    pptpsetup --create test --server xxx.xxx.xxx.xxx --username root --password 123456 --encrypt

    其代表含义为:

    pptpsetup --create 配置文件的名称 --server 有公网 IP 的云服务器的内网 IP --username 连接 PPTP 的用户名 --password 连接 PPTP 的密码 --encrypt

    3、进行拨号

    pppd call test

    4、设置路由

    route add -net 0.0.0.0 dev ppp0

    Ps. 3,4步骤开机自动生效

    若想3,4步骤开机自动生效。则在cd /etc/rc.d/init.d并创建个.sh文件,例如叫 a.sh,内容如下:

    #!/bin/bash
    #chkconfig:2345 65 65 //
    pppd call test
    sleep 5s
    route add -net 0.0.0.0 dev ppp0

    之后执行以下代码,即可实现自启。

    chkconfig --add a.sh
    chkconfig a.sh on

    5、测试网络

    最后ping www.baidu.com,若能够ping通,则证明联网成功。

    最后

    经实测、全程按照教程设置,三台内网服务器都能通过有外网的服务器 ping 通 baidu.com 了,但是大量下载时,会出现拨号断开的情况,需要重复操作上面内网服务器的 3、4 步骤操作恢复拨号,网上能搜到拨号断开自动重新拨号的教程,没测试,可以自己搜搜测试一下。

  • OpenJFX On Rapberry Pi

    OpenJFX On Raspberry Pi

    • 硬件:树莓派4B
    • 系统:Raspberry Pi OS(64bit) beta test version
      • 下载地址:https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2020-05-28/2020-05-27-raspios-buster-arm64.zip

    想在树莓派上做一个监控软件可以实时监控PC或者MAC电脑的性能状态,最好的方法就是做个网页通过js显示并更新电脑端传来的数据。这里获取电脑端数据的方式目前有几种可行的方法,一个是通过网络:在电脑端实现一个网页实时显示数据,树莓派通过ip访问电脑端的网页来展示,或者是电脑只更新数据到某个文本文件,树莓派通过ip拿到文件再把数据放进自己的网页或其他方式展示。一个是通过USB:电脑端通过USB将数据传输给树莓派,树莓派解码后通过网页或者其他方式展示。

    但是自己又不会前端开发。只是个浅浅的Java狗,怎么办。好在Java有个桌面应用程序的技术——JavaFX,相比于Java之前的AWT,Swing,JavaFX是个全新的代替,之前用过Swing,挺烂,然而JavaFX也没好到哪去,现在国内有几个人在用呢?

    应该是为了推广JavaFX,Oracle从Java 8开始直接在JDK捆绑了JavaFX,所以在Mac和Windows甚至Linux上,只需要装了JDK 8 以上的版本,就可以使用JavaFX。

    但是对于ARM平台,JDK并不包含JavaFX。所以在树莓派上运行JavaFX会稍微麻烦一些。一边查一边试,用了一下午终于在树莓派上运行起来了,具体方法如下。

    前提

    JFX 程序是提前在电脑上编写的。打包生成jar文件后拷贝到树莓派。目前没在树莓派上开发只是为了尽快实现树莓派运行JFX,后续还是要在树莓派上进行开发的,因为可能会涉及到USB串口读写等硬件相关的开发。

    方法一: OpenJDK + OpenJFX

    1. 安装OpenJDK_11
      sudo apt install openjdk-11-jdk

      然后可以通过 java -version 查看java是否正常安装成功

      pi@raspberrypi:~ $ java -version
      openjdk version "11.0.7" 2020-04-14
      OpenJDK Runtime Environment (build 11.0.7+10-post-Debian-3deb10u1)
      OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Debian-3deb10u1, mixed mode)
    2. 安装OpenJFX_11
      sudo apt install openjfx

      OpenJFX默认安装位置: /usr/share/openjfx/

    3. 设置环境变量
      sudo nano /etc/profile

      文件尾部添加

      export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64
      export PATH=$JAVA_HOME/bin:$PATH
      export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export JFX_PATH=/usr/share/openjfx/lib
    4. 将打包好的jar文件解压,进入目录执行
      java --module-path $JFX_PATH --add-modules javafx.controls,javafx.fxml sample.Main

      sample.Main是主类的包名+类名

      程序可以正常运行了。但是提示了一个Error。作为一名程序员,warning可以忍,error不行!

      Error - GLX extension is not supported 
      GLX version 1.3 or higher is required

      查了一下,只需要关闭硬件加速即可。 运行时候加速 -Dprism.order=sw 参数

  • 树莓派4入门教程:更改用户,SSH配置和密钥登录,以及FRP客户端配置文件

    更改用户名

    使用切换到root账号: sudo su
    添加新的用户名,例如newuser: adduser newuser
    给新用户分配权限,注意最后一个为新用户的用户名: usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi newuser
    删除默认的pi用户名,此处会删除/home/pi/文件夹内的所有文件,如果无法删除,可以重启后,再次切换到root账号尝试: deluser -remove-home pi

    SSH配置和密钥登录

    以下全程使用新用名称登录终端进行操作
    更改SSH默认端口,比如由22改为12345

    sudo vim /etc/ssh/sshd_config

    找到#port 22,将其更改为port 12345
    在文件末尾添加AllowUsers newuser,确保只允许此用户通过SSH登录。
    找到以下段落,确保都是no并且删除#

    ChallengeResponseAuthentication no
    PasswordAuthentication no
    UsePAM no

    找到MaxAuthTries,去掉#号,将数字改为2,以为每个账号只能尝试两次登录,都失败之后就会被封IP
    找到以下段落,并且删除#号以及更改内容

    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

    保存文件,暂时不要重启SSH服务,需要更改密钥登录。
    执行以下操作

    cd ~
    mkdir .ssh
    cd .ssh
    touch authorized_keys
    cat id_rsa.pub >> authorized_keys
    chmod 600 authorized_keys
    cd ..
    chmod 700 .ssh

    注意SSH的公钥(id_ras.pub)和密钥(id_rsa)可以使用ssh-keygen -t rsa命令直接生成,默认放在.ssh文件夹。务必保存好,不然就只能重装系统才能进系统。

    此时,通过systemd重启SSH服务,随后使用新用户名和密钥,即可正常登录。

    sudo systemctl restart ssh

    FRP客户端配置文件

    以下全程使用新用名称登录终端进行操作

    cd ~
    wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_arm.tar.gz
    tar -zxvf frp_0.34.3_linux_arm.tar.gz
    cd frp_0.34.3_linux_arm/
    sudo mkdir /etc/frp/
    sudo mv frpc.ini /etc/frp/frpc.ini
    sudo mv frpc /bin/
    sudo mv systemd/frpc.service /etc/systemd/system/frpc.service
    sudo systemctl enable frp
    sudo systemctl start frp

    注意要修改frpc.ini文件,内容如下:

    [common]
    server_addr = 服务器ip
    server_port = 7000 #服务器通讯端口
    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 12345 #ssh端口
    remote_port = 6001 #服务器转发端口,用来登录SSH

    使用ip:6001即可远程登录树莓派