zoukankan      html  css  js  c++  java
  • LVS.md

    LVS 概述

    简介

    LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,官方站点。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

    作用

    LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

    术语

    • vs:Virtual Server 虚拟服务,可称为Director、Dispatcher分发器、Balancer负载均衡器

    • rs:Real Server 真实服务器

    • CIP:Client IP 客户端IP

    • VIP:Director Virtual IP 等同于FIP(流动IP),负载均衡器虚拟IP

    • DIP:Director IP 调度IP(第二张网卡IP地址)

    • RIP:Real Server IP 真实服务器IP

    LVS 详细说明

    工作模型

    lvs-nat

    通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
    说明
    (1) RIP和DIP应该使用私网地址,RS的网状应该指向DIP;
    (2) 请求和响应报文都要经由director转发;极高负载的场景中,Director可能会成为系统瓶颈;
    (3) 支持端口映射;
    (4) VS必须为Linux,RS可以是任意的OS;
    (5) RS的RIP与Director的DIP必须在同一IP网络;
    工作流量

     


     

     

    传送门:http://www.cnblogs.com/edisonchou/p/4281978.html

    lvs-dr

    VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。

     


     

     

    说明
    (1) 确保前端路由器将目标IP为VIP的请求报文一定会发送给Director;实际使用中是修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;
    (2) RS的RIP可以使用私有地址,也可以使用公网地址;
    (3) RS跟Director必须在同一物理网络中;
    (4) 请求报文必须由Director调度,但响应报文必须不能经由Director;
    (5) 不支持端口映射;
    (6) 各RS可以使用大多数的OS;

    lvs-tun

    采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

    说明
    (1) RIP,DIP,VIP全得是公网地址;
    (2) RS的网关不能也不可能指向DIP;
    (3) 请求报文经由Director调度,但响应报文将直接发给CIP;
    (4) 不支持端口映射;
    (5) RS的OS必须支持IP隧道功能;

    调度算法

    轮叫(Round Robin)

    调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

    加权轮叫(Weighted Round Robin)

    调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

    最少链接(Least Connections)

    调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

    加权最少链接(Weighted Least Connections)

    在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

    基于局部性的最少链接(Locality-Based Least Connections)

    "基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。

    带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

    "带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。

    目标地址散列(Destination Hashing)

    "目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

    源地址散列(Source Hashing)

    "源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

    ipvsadm 命令

    用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;

     # yum install -y ipvsadm
    

    管理集群服务

    ipvsadm  -A|E -t|u|f  service-address  [-s scheduler][-p [timeout]]
    ipvsadm  -D -t|u|f service-address
    

    说明

    • -A:添加

    • -E:修改

    • -D:删除

    • service-address:服务地址和 -t|u|f 结合使用

    • -t, tcp, vip:port:TCP的ip和port

    • -u, udp, vip:port:UDP的ip和port

    • -f, fwm, MARK:防火墙标记

    • -s scheduler:默认为WLC调度算法,可省;

    • -p [timeout] :超出时长,持久连接相关,默认时长为300秒

    • --set tcp tcpfin udp 设置连接超时值

    管理集群服务上的RS

    ipvsadm-a|e  -t|u|f service-address -rserver-address [-g|i|m] [-w weight]
    ipvsadm -d -t|u|f service-address -rserver-address
    

    说明

    • -a:添加一个RS

    • -e:修改一个RS

    • -d:删除一个RS

    • server-address指的是rip[:port],端口可省表示与之前的service-address相同,只有nat模式支持端口映射才会使用

    • -g:GATEWAY (默认),lvs-dr模型

    • -i: IPIP, lvs-tun隧道模型

    • -m: MASQUERADE,lvs-nat模型

    查看

    ipvsadm -L|l[options]
    

    说明

    • -n:numeric,数字格式显示地址和端口;

    • -c:connection,显示ipvs连接;

    • --stats:统计自该条转发规则生效以来的;

    • --rate:速率

    • --exact:精确值,不经过单位换算的数值
      应用举例

    [test@LVS ~]$ sudo /sbin/ipvsadm -l 
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.1.17.10:http wlc
      -> 10.2.4.35:http            Route   100    25095      18542     
      -> 10.2.4.31:http            Route   100    25097      17657     
      -> 10.2.4.30:http            Route   100    25123      18953     
      -> 10.2.4.29:http            Route   100    25091      18727     
      -> 10.2.4.24:http            Route   100    25075      17703     
      -> 10.2.4.23:http            Route   100    25086      17465     
      -> 10.2.4.22:http            Route   100    25124      17628  
    

    InActConn 指非活跃连接数,我们将处于 TCP ESTABLISH 状态以外的连接都称为不活跃连接。例如处于 SYN_RECV 状态的连接,处于 TIME_WAIT 状态的连接等。

    [test@LVS ~]$ sudo /sbin/ipvsadm -l --rate 
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
      -> RemoteAddress:Port
    TCP  192.1.17.10:http               2438    16241        0  6385560        0
      -> 10.2.4.35:http                 146      965        0   372714        0
      -> 10.2.4.34:http                 164     1089        0   423347        0
      -> 10.2.4.28:http                 152     1035        0   406658        0
      -> 10.2.4.27:http                 157     1031        0   411744        0
      -> 10.2.4.22:http                 160     1078        0   425447        0
      -> 10.2.4.21:http                 159     1078        0   423759        0
    

    CPS (current connection rate) 每秒连接数
    InPPS (current in packet rate) 每秒的入包个数
    OutPPS (current out packet rate) 每秒的出包个数
    InBPS (current in byte rate) 每秒入流量(字节)
    OutBPS (current out byte rate) 每秒入流量(字节)

    [test@LVS ~]$ sudo /sbin/ipvsadm -l --stats
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
      -> RemoteAddress:Port
    TCP 192.1.17.10:http            326629K    3588M        0   22517G        0
      -> 10.2.4.23:http             584349K    3896M        0    1469G        0
      -> 10.2.4.34:http             597422K    3956M        0    1501G        0
      -> 10.2.4.28:http             631106K    4198M        0    1592G        0
      -> 10.2.4.27:http             578297K    3850M        0    1459G        0
      -> 10.2.4.22:http             580208K    3859M        0    1463G        0
      -> 10.2.4.21:http             685758K  283146K        0    1737G        0
    
    

    Conns (connections scheduled) 已经转发过的连接数
    InPkts (incoming packets) 入包个数
    OutPkts (outgoing packets) 出包个数
    InBytes (incoming bytes) 入流量(字节)
    OutBytes (outgoing bytes) 出流量(字节)

    清空规则

    ipvsadm  -C
    

    数器清零

    ipvsadm  -Z [-t|u|f service-address]
    

    保存和重载

    保存

    ipvsadm -S  > /PATH/TO/SOME_RULE_FILE
    ipvsadm-save  > /PATH/TO/SOME_RULE_FILE
    

    重载

    ipvsadm  -R < /PATH/FROM/SOME_RULE_FILE
    ipvsadm-restore< /PATH/FROM/SOME_RULE_FILE
    

    其他

    修改 LVS 表中的 fin_timeout 使用指令如下

    ipvsadm --set 900 60 300
    

    中间的 60 就是 tcp 的 fin_timeout 时间
    查看默认的值使用如下命令:

    $ sudo /sbin/ipvsadm -Ln --timeout 
    Timeout (tcp tcpfin udp): 900 60 300
    

    参考1
    参考2

    使用举例

    lvs-nat模型构建

    环境说明

    vs DIP:192.168.182.190 VIP:192.168.5.190
    rs1 192.168.182.193
    rs2 192.168.182.194

    上面中vs机器需要安装ipvsadm,而后端的rs全部安装httpd做测试使用。

    # curl 192.168.182.193
    192.168.182.193
    # curl 192.168.182.194
    192.168.182.194
    

    rs主机配置

    测试页面

    # curl http://192.168.182.193
    192.168.182.193
    # curl http://192.168.182.194
    192.168.182.194
    

    网络配置

    # route add default gw 192.168.182.190
    # route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.182.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
    169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
    0.0.0.0         192.168.182.190 0.0.0.0         UG    0      0        0 eth1
    

    注意两台rs 都需要将默认网关指向vs的DIP。

    vs主机配置

    安装ipvsadm

    # yum install -y ipvsadm
    

    启动网卡间核心转发功能

    # sysctl -w net.ipv4.ip_forward=1
    # cat /proc/sys/net/ipv4/ip_forward
    1
    

    注意:上面的修改只是临时生效,如果想永久有效则需要修改配置文件:/etc/sysctl.conf。
    定义ipvsadm负载均衡集群规则

    # ipvsadm -A -t 192.168.5.190:80 -s rr
    # ipvsadm -a -t 192.168.5.190:80 -r 192.168.182.193:80 -m
    # ipvsadm -a -t 192.168.5.190:80 -r 192.168.182.194:80 -m
    

    测试

    # curl http://192.168.5.190
    192.168.182.193
    # curl http://192.168.5.190
    192.168.182.194
    

    扩展学习

    保存规则

    # ipvsadm-save -n > /tmp/ipvsadm.bak
    # cat /tmp/ipvsadm.bak
    -A -t 192.168.5.190:80 -s rr
    -a -t 192.168.5.190:80 -r 192.168.182.193:80 -m -w 1
    -a -t 192.168.5.190:80 -r 192.168.182.194:80 -m -w 1
    

    删除并还原

    # ipvsadm -C
    # curl http://192.168.5.190
    curl: (7) couldn't connect to host
    # ipvsadm-restore < /tmp/ipvsadm.bak
    # ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.5.190:80 rr
      -> 192.168.182.193:80           Masq    1      0          1         
      -> 192.168.182.194:80           Masq    1      0          2 
    # curl http://192.168.5.190
    192.168.182.194
    

    修改调度算法

    # ipvsadm -E -t 192.168.5.190:80 -s wrr
    # ipvsadm -e -t 192.168.5.190:80 -r 192.168.182.193:80 -m -w 2
    # ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.5.190:80 wrr
      -> 192.168.182.193:80           Masq    2      0          0         
      -> 192.168.182.194:80           Masq    1      0          0
    # curl http://192.168.5.190
    192.168.182.193
    # curl http://192.168.5.190
    192.168.182.193
    # curl http://192.168.5.190
    192.168.182.194
    

    显示lvs目前的连接

    # ipvsadm -Lnc
    IPVS connection entries
    pro expire state       source             virtual            destination
    TCP 01:06  TIME_WAIT   192.168.5.190:52413 192.168.5.190:80   192.168.182.193:80
    TCP 01:07  TIME_WAIT   192.168.5.190:52414 192.168.5.190:80   192.168.182.194:80
    TCP 01:08  TIME_WAIT   192.168.5.190:52415 192.168.5.190:80   192.168.182.193:80
    TCP 01:09  TIME_WAIT   192.168.5.190:52416 192.168.5.190:80   192.168.182.193:80
    TCP 01:11  TIME_WAIT   192.168.5.190:52417 192.168.5.190:80   192.168.182.194:80
    

    lvs-dr模型构建

    环境说明

    vs VIP:192.168.5.188
    rs1 192.168.5.229
    rs2 192.168.5.230
    测试页面

    # curl 192.168.5.229
    192.168.5.229
    # curl 192.168.5.230
    192.168.5.230
    

    vs配置

    # ifconfig eth0:0 192.168.5.188 netmask 255.255.255.255 broadcast 192.168.5.188 up
    # ifconfig eth0:0
    eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:1A:0A:84  
              inet addr:192.168.5.188  Bcast:192.168.5.188  Mask:255.255.255.255
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    

    rs配置

    rs1:

    # ifconfig lo:0 192.168.5.188/32 broadcast 192.168.5.188 up
    # route add -host 192.168.5.188 dev lo:0
    # echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    # echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    # echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    # echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    # ifconfig lo:0
    lo:0      Link encap:Local Loopback  
              inet addr:192.168.5.188  Mask:0.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
    # route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.5.188   0.0.0.0         255.255.255.255 UH    0      0        0 lo
    192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
    169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
    0.0.0.0         192.168.5.1     0.0.0.0         UG    0      0        0 eth0          
    

    rs2:
    和上面的配置相同。
    内核参数说明
    arp_annouce定义通告级别:

    • 0:默认级别,将本地的任何接口上的配置的地址都在网络中通告

    • 1:尽量避免向本主机上的其他网卡进行网络通信,特殊情况下其他接口也可以

    • 2:总是使用最佳网络地址接口(仅使用定义的网卡接口在同网络通信)

    arp_ignore定义响应级别(0-8九个级别),响应时忽略方式

    • 0:都全都响应

    • 1:只对从本接口进入的请求响应,且本接口地址是个网络地址

    注释:一般使用arp_annouce=2,arp_ignore=1

    vs主机ipvsadm配置

    # ipvsadm -A -t 192.168.5.188:80 -s rr
    # ipvsadm -a -t 192.168.5.188:80 -r 192.168.5.229:80 -g
    # ipvsadm -a -t 192.168.5.188:80 -r 192.168.5.230:80 -g
    # ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.5.188:80 rr
      -> 192.168.5.229:80             Route   1      0          0         
      -> 192.168.5.230:80             Route   1      0          0  
    

    测试

    注意:测试的客户端不要在vs 主机上。

    # curl 192.168.5.188
    192.168.5.229
    # curl 192.168.5.188
    192.168.5.230
    

    通过防火墙标记来定义lvs

    FWM防火墙标记功能

    防火墙标记可以实现多个集群服务绑定为同一个,实现统一调度;将共享一组RS的集群服务统一进行定义FWM基于iptables的mangle表实现防护墙标记功能,定义标记做策略路。

    FWM定义集群的步骤

    在director上netfilter的mangle表的PREROUTING定义用于"打标"的规则

    # iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $serviceport -j MARK --set-mark #
    

    定义集群服务

    # ipvsadm -A -f # [-s scheduler]
    

    举例

    # iptables -t mangle -A PREROUTING -d 172.16.50.50 -p tcp --dport 80 -j MARK --set-mark 5
    # ipvsadm -A -f 5 -s rr
    # ipvsadm -a -f 5 -r 172.16.200.10 -g
    # ipvsadm -a -f 5 -r 172.16.200.11 -g
    

    LVS持久连接功能

    lvs persistence

    无论ipvs使用何种scheduler,其都能够实现在指定时间范围内始终将来自同一个ip地址的请求发往同一个RS;实现方式和lvs调度的十种算法无关,通过lvs持久连接模板(hash表)实现,当超过自定义的可持节连接时长候再根据LVS算法本身进行调度。
    ipvsadm命令中-p选项实现,在-p后不指定具体数字(单位:秒),默认为300,到时候会自动延长2分钟,对于web本身就是15秒

    每端口持久(PPC)

    客户端对同一服务端口发起请求,会基于该服务的端口实现请求在一段时间内对同一RS服务器持久连接;
    例如:有两台主机做为RS服务器做http和hssh的两种服务的集群,仅http做每端口持久,Client请求会实现绑定在,但是22号端口请求不会绑定在同一台RS
    举例

    # ipvsadm -C
    # ipvsadm -A -t 192.168.1.88:0 -s rr -p 120
    # ipvsadm -a -t 192.168.1.88:0 -r 192.168.1.9 -g
    # ipvsadm -a -t 192.168.1.88:0 -r 192.168.1.10 -g
    # ipvsadm -L -n
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.88:0 rr persistent 120
      -> 192.168.1.9:0                Route   1      0          0         
      -> 192.168.1.10:0               Route   1      0          0
    

    每客户端持久(PCC)

    director会将用户的任何请求都识别为集群服务,并向RS进行调度;同一客户端的请求任何端口都发往同一台第一次选定的RS服务器
    举例

    # ipvsadm -A -t 192.168.1.88:80 -s rr -p 120 
    # ipvsadm -a -t 192.168.1.88:80 -r 192.168.1.9 -g
    # ipvsadm -a -t 192.168.1.88:80 -r 192.168.1.10 -g
    

    每防火墙标记持久(PFWMC)

    将两个或两个以上服务通过防火墙打标绑定在一起,这些服务的请求实现同时定向与同一台RS服务器,服务绑定同一RS
    举例
    lvs-dr模式下以rr算法绑定http和https服务

    ~]#iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK--set-mark 99
    ~]#iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 443 -j MARK--set-mark 99
    ~]#ipvsadm -A -f 99 -s rr -p
    ~]#ipvsadm -a -f 99 -r 172.16.100.68 -g
    ~]#ipvsadm -a -f 99 -r 172.16.100.69 -g
    

    LVS-DR类型RS脚本示例

    #!/bin/bash
    #
    vip=172.16.50.50
    interface="lo:0"
    case$1 in
    start)
    echo1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig$interface $vip broadcast $vip netmask 255.255.255.255 up
    routeadd -host $vip dev $interface
    ;;
    stop)
    echo0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig$interface down
    ;;
    status)
    ififconfig lo:0 |grep $vip &> /dev/null; then
    echo"ipvs is running."
    else
    echo"ipvs is stopped."
    fi
    ;;
    *)
    echo"Usage: `basename $0` {start|stop|status}"
    exit1
    esac
    

    扩展学习:
    http://xuding.blog.51cto.com/4890434/1740228
    http://www.cnblogs.com/edisonchou/p/4281978.html

  • 相关阅读:
    Python·安装扩展包的几种方法
    Arduino系列硬件资源介绍
    树莓派USB摄像头的使用
    树莓派frp服务器和客户端配置教程
    树莓派frp内网穿透
    用Windows远程桌面连接树莓派的方法
    控制窗体的位置和大小
    树霉派更换软件镜像源
    I2C的库函数应用示例
    I2C总线的Arduino库函数
  • 原文地址:https://www.cnblogs.com/cuchadanfan/p/6491787.html
Copyright © 2011-2022 走看看