xml地图|网站地图|网站标签 [设为首页] [加入收藏]
module搭建流媒体服务器的正确姿势,Linux的网络管
分类:操作系统

1.今天申请搭建了自己的云虚拟主机

  之前在使用nginx和nginx-rtmp-module搭建流媒体服务器的时候遇到一个很尴尬的问题,就是在把nginx-rtmp-module模块添加到nginx中去的时候,我最开始采取的做法是先卸载原来的nginx,再下载nginx和nginx-rtmp-module的源码重新编译并安装.重装完之后我测试了一下流媒体服务器是正常的,但是接下来问题来了,由于我有一些WEB工程是部署在之前搭建好的LUMP环境下的,现在重装了nginx,这些工程需要重新部署.于是,我又开始重新部署这些WEB工程,但是结果让我哭晕在了厕所,因为nginx的目录结构发生了很大改变,导致我没办法配置原来的WEB工程了.此后我陷入了很长时间的挣扎和徘徊,网上搜寻了很多解决方案,但是这些方案大多都是侧重讲如何编译安装nginx以及进行推拉流测试,没有涉及到我这方面的问题.后来,我在浏览帖子的时候看到有人说把自己编译的nginx可执行文件替换掉原来的nginx共享库能解决问题,于是立马试了一把,结果发现真的可以!现在的nginx能同时运行流媒体服务和部署WEB工程,鱼与熊掌兼得!

在解释Linux网络管理相关的内容时,我觉得有必要先解释数据包转发功能以及因此涉及到的路由决策,这对厘清路由和未来的防火墙有重要帮助。然后再介绍网络配置命令和相关文件。

2.有挺多疑问:它只能使用ftp传入主页或者网站网页内容吗?没有后台代码之类的怎么实现程序的功能调用?

  下面简单介绍一下我的操作过程,希望能为遇到同样问题的你带来一些帮助(我的配置环境:Ubuntu Server 16.04 + nginx1.10.0 + nginx-rtmp-module-master).

13.1 Linux处理数据包过程

当向外界主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机,如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据,在响应包流出之前,需要做路由决策,根据目标决定从哪个网卡流出。如果不是流入本机的,而是要转发给其他主机的,则必然涉及到另一个流出网卡,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。如下图:

图片 1

另外,IP地址是属于内核的(不仅如此,整个tcp/ip协议栈都属于内核,包括端口号),只要能和其中一个地址通信,就能和另一个地址通信(这么说是不准确的,即使地址属于内核,但还存在一个检查数据包是否丢弃的问题,不过这不是本文内容),而不管是否开启了数据包转发功能。例如某Linux主机有两网卡eth0:172.16.10.5和eth1:192.168.100.20,某192.168.100.22主机网关指向192.168.100.20,若它ping 172.16.10.5,结果将是通的,因为地址属于内核,从eth1进来的数据包被内核分析时,发现目标地址为本机地址,直接就回应192.168.100.22,回应数据包继续从eth1出去。

如果Linux主机有多块网卡,如果不开启数据包转发功能,则这些网卡之间是无法互通的。例如eth0是172.16.10.0/24网段,而eth1是192.168.100.0/24网段,到达该Linux主机的数据包无法从eth0交给eth1或者从eth1交给eth0,除非Linux主机开启了数据包转发功能。

在Linux上开启转发功能有多种方法:

shell> echo 1 > /proc/sys/net/ipv4/ip_forward
shell> sysctl -w net.ipv4.ip_forward=1

以上两种方法是临时生效的,若要永久生效,则应该写入配置文件。在CentOS 6中,将/etc/sysctl.conf文件中的"net.ipv4.ip_forward"值改为1即可,但在CentOS 7中,systemd管理了太多的功能,sysctl的配置文件也分化为多个,包括/etc/sysctl.conf、/etc/sysctl.d/*.conf和/usr/lib/sysctl.d/*.conf,并且这些文件中默认都没有net.ipv4.ip_forward项。当然,直接将此项写入到这些配置文件中也都是可以的,建议写在/etc/sysctl.d/*.conf中,这是systemd提供自定义内核修改项的目录。例如:

shell> echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf

可以使用以下几种方式查看是否开启了转发功能。

[root@xuexi ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

[root@xuexi ~]# cat /proc/sys/net/ipv4/ip_forward
0

[root@xuexi ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0

  1.先采用apt-get的方式安装nginx.目前用此方式安装的nginx的版本号为1.10.0

13.2 和网络相关的几个文件说明

1 sudo apt-get update
2 sudo apt-get install nginx

13.2.1 网卡配置文件ifcfg-*

在/etc/sysconfig/network-scripts/目录下有不少文件,绝大部分都是脚本类的文件,但有一类ifcfg开头的文件为网卡配置文件(interface config),所有ifcfg开头的文件在启动网络服务的时候都会被加载读取,但具体的文件名ifcfg-XX的XX可以随意命名。

以下是一个(CentOS 7上)ifcfg-XX文件的内容示例。

[root@xuexi ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"      # 显示的名称,必须/sys/class/net/目录下的某个网卡名相同
IPV6INIT="no" 
BOOTPROTO="dhcp"
ONBOOT=yes 
TYPE="Ethernet"
DEFROUTE="yes"
PEERDNS="yes"      # 设置为yes时,此文件设置的DNS将覆盖/etc/resolv.conf,
                   # 若开启了DHCP,则默认为yes,所以dhcp的dns也会覆盖/etc/resolv.conf
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
NAME="System eth0"
DNS1=114.114.114.114
DNS2=8.8.8.8
DNS3=114.114.115.115

  2.到你喜欢的目录下用你喜欢的名字创建一个目录,用于存放nginx和nginx-rtmp-module的源码,例如:我在根目录/softwares(softwares也是我自己创建的)下面创建了nginx目录,接下来我会把nginx和nginx-rtmp-module下载到nginx目录下.

13.2.2 DNS配置文件/etc/resolv.conf

该文件用于设置DNS指向,以及解析顺序。该文件格式如下:

domain  domain_name       # 声明本地域名,即解析时自动隐式补齐的域名
search  domain_name_list  # 指定域名搜索顺序(最多6个),和domain不能共存,若共存了,则后面的行生效
nameserver  IP1           # 设置DNS指向,最多3个
nameserver  IP2
nameserver  IP3        
options timeout:n attempts:n  # 指定解析超时时间(默认5秒)和解析次数(默认2次)

例如将/etc/resolv.conf设置为下所示,为了测试,暂且不设置nameserver。

domain malong.com

当解析不带点"."的主机名时,如"www",认为不是fqdn,将自动加上".malong.com"变成解析"www.malong.com"。

[root@xuexi ~]# host -a www
Trying "www.malong.com"
;; connection timed out; trying next origin
Trying "www"
;; connection timed out; no servers could be reached

当解析的名称末尾不带点但中间带了点的,如"www.host",认为是fqdn,将直接解析"www.host",解析完这个后再解析加上"malong.com"的名称,即再解析"www.host.malong.com"。

[root@xuexi ~]# host -a www.host
Trying "www.host"
;; connection timed out; trying next origin
Trying "www.host.malong.com"
;; connection timed out; no servers could be reached

当解析末尾带点的名称时,如"www.host."认为是完整的fqdn,将直接解析"www.host",解析完后直接结束解析,不会再补齐本地域名再解析。

[root@xuexi ~]# host -a www.host.
Trying "www.host"
;; connection timed out; trying next origin
Trying "www.host"   # 默认解析两次
;; connection timed out; no servers could be reached

search关键字的作用和domain是一样的,只不过search同时还暗含域名搜索的顺序。例如设置search为如下内容:

search  malongshuai.com longshuai.com mashuai.com

此时若解析"www.host",将依次解析"www.host","www.host.malongshuai.com","www.host.longshuai.com","www.host.mashuai.com"。

[root@xuexi ~]# host -a www.host
Trying "www.host"
;; connection timed out; trying next origin
Trying "www.host.malongshuai.com"
;; connection timed out; trying next origin
Trying "www.host.longshuai.com"
;; connection timed out; trying next origin
Trying "www.host.mashuai.com"
;; connection timed out; no servers could be reached

[root@xuexi ~]# host -a www
Trying "www.malongshuai.com"
;; connection timed out; trying next origin
Trying "www.longshuai.com"
;; connection timed out; trying next origin
Trying "www.mashuai.com"
;; connection timed out; trying next origin
Trying "www"
;; connection timed out; no servers could be reached

domain部分和search部分不能共存,如果共存了,则后出现的行有效。

1 cd softwares/
2 sudo mkdir nginx

13.2.3 /etc/udev/rules.d/70-persistent-net.rules

当插入新的网络设备时,内核首先识别到,随后在sysfs文件系统(一般挂载在/sys下)中生成该设备对应的信息文件。然后内核通知udev的后台守护进程udevd(若不知道它是什么东西,请认为它是Windows系统中的设备管理器,管理和监视硬件设备),udevd将读取sysfs中对应设备的相关信息,并比对或生成udev的规则集,能匹配上的则做对应的操作。对于网卡来说,CentOS 6上它的的规则集文件默认为/etc/udev/rules.d/70-persistent-net.rules,匹配该规则集成功后,最后还在/sys/class/net目录中生成对应的设备子目录。

以下为两个网卡的规则集的内容:

[root@xuexi ~]# cat /etc/udev/rules.d/70-persistent-net.rules 

# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:7f:cf:a4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:7f:cf:ae", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

具体的udev规则集语法并非本文内容,所以此处仅简单解释下上面的两个规则集。规则集文件的写法都是key/value格式,但分为匹配key/vaule和行为key/value。上述例子中,从SUBSYSTEM直到KERNEL都是使用"=="号,表示匹配key/value,最后一个NAME使用单"="号,表示赋值key/value。所以上述文件的意思是:当/sys中的某设备各信息都能匹配上述某条规则,则赋值该设备名称为eth0或eth1,/sys/class/net目录下也由此名称命名设备信息的目录,ifcfg-*配置文件中的DEVICE的值必须和它们相同

注意,网络规则集文件会由内核检测到设备时自动生成或写入,因此清空它不会有任何影响

克隆虚拟机时,总是会出现MAC地址冲突,这是因为规则集文件和ifcfg配置文件都被克隆了,而新克隆出来的机器中MAC地址又是新的,所以会生成新的规则集,但克隆过来的ifcfg配置文件中的DEVICE值和该规则对应不上,导致克隆主机的网络将启动不了。解决办法是清空该文件,然后重启克隆主机,这样内核将新生成对应新MAC地址的规则集文件。当然,在克隆前清空模板主机的规则集文件,然后再克隆也是可以的。

值得一提的是,在CentOS 7中,systemd已经将udevd的功能整合在了一起,udev的规则集文件几乎都放到了/usr/lib/udev/rules.d/目录下,但却更方便了,克隆CentOS 7主机时,根本就不会出现MAC地址冲突的可能。不过,显式书写在/etc/udev/rules.d/目录下的规则集文件仍然是生效的。

  3.进入nginx目录.

13.2.4 /etc/services

该文件中记录的是端口和服务的对应关系。

[root@xuexi ~]# grep '^ftp|^ssh' /etc/services 
ftp-data        20/tcp
ftp-data        20/udp
ftp             21/tcp
ftp             21/udp          fsp fspd
ssh             22/tcp                          # The Secure Shell (SSH) Protocol
ssh             22/udp                          # The Secure Shell (SSH) Protocol
ftp-data        20/sctp                 # FTP
ftp             21/sctp                 # FTP
ssh             22/sctp                 # SSH
ftp-agent       574/tcp                 # FTP Software Agent System
ftp-agent       574/udp                 # FTP Software Agent System
sshell          614/tcp                 # SSLshell
sshell          614/udp                 #       SSLshell
ftps-data       989/tcp                 # ftp protocol, data, over TLS/SSL
ftps-data       989/udp                 # ftp protocol, data, over TLS/SSL
ftps            990/tcp                 # ftp protocol, control, over TLS/SSL
ftps            990/udp                 # ftp protocol, control, over TLS/SSL
ssh-mgmt        17235/tcp               # SSH Tectia Manager
ssh-mgmt        17235/udp               # SSH Tectia Manager
1 cd nginx/

13.3 网络接口配置和主机名

  4.下载nginx源码,注意:下载的源码版本需要与步骤1安装的nginx的版本保持一致,以避免不必要的问题.获取nginx源码的途径很多,此处推荐两种方式.

13.3.1 ifconfig

该命令虽然在man文档中被说明已废弃,但大众显然无法忘记它。ifconfig命令是一个接口配置命令,但更多的被用来显示已激活的网络接口信息。

ifconfig [ interface | -a ]
ifconfig interface options

选项说明:
interface:指定被操作的网络接口名,如eth0
up       :激活指定的网络接口,如果在命令行中为网络接口分配了IP地址,则默认会up
down     :将指定的接口设置为down状态
[-]arp   :启用或禁用该接口上使用ARP协议,如"ifconfig eth0 -arp"
mtu N    :设置指定接口的最大传输单元(MTU)
netmask  :设置该接口的IP netmask,默认会采用A/B/C类地址的掩码位数
address  :要分配给该接口的IP地址

ifconfig示例:

[root@xuexi ~]# ifconfig eth0:1 192.168.100.20 netmask 255.255.255.0 up  # 添加IP地址
[root@xuexi ~]# ifconfig eth0:1 192.168.100.20/24 up                     # 也可使用CIDR格式掩码
[root@xuexi ~]# ifconfig eth1 up       # 激活该网络接口
[root@xuexi ~]# ifconfig eth1 down     # 临时down掉eth1接口
[root@xuexi ~]# ifconfig eth1 -arp     # 抑制eth1上的arp
[root@xuexi ~]# ifconfig eth1 arp      # 启用eth1上的arp

需要注意的是,ifconfig所有的配置都是应用于内核的,所以只会临时生效,重启网络服务后会立即失效。

对于slave地址,即别名地址,若要永久生效,应该建立对应的别名接口配置文件,如/ets/sysconfig/network-scripts/ifcfg-eth0:0,然后在该文件中的DEVICE关键字上给定eth0:0名称,该DEVICE项必须配置正确。

  方式a:在终端执行apt-get source nginx命令,直接获取到对应版本的源码.

13.3.2 ifcfg

用法很简单。

ifcfg DEV [[add|del [ADDR[/LEN]] | stop]
       add - add new address
       del - delete address
       stop - completely disable IP

例如:

[root@xuexi ~]# ifcfg eth1:0 add 192.168.100.20/24   # 添加一个地址
[root@xuexi ~]# ifcfg eth1:0 del 192.168.100.20      # 删除一个地址
[root@xuexi ~]# ifcfg eth1 stop      # 临时禁用eth1
1 sudo apt-get source nginx

  此方式下载完之后会自动解压,nginx-1.10.0目录即nginx源码目录.

13.3.3 hostname命令

用于设置主机名,但也有几个其它好用的功能。

hostname [-I] [-f] [-d] [-s] [hostname]

选项说明:
-I         :获取该主机上所有非环回IP地址,该选项不依赖于主机名解析
-f,--fqdn  :获取fqdn
-d,--domain:获取fqdn的域名部分,等价于命令dnsdomainname
-s,--short :获取fqdn的主机名部分,严格地说是获取第一个"."前的部分,例如"www.baidu.com"将获取为"www"

使用-I选项可以直接获取该主机上的所有IP地址,包括别名地址,这在某些时候太方便了。

[root@xuexi ~]# hostname -I
192.168.100.54 172.16.10.10

hostname修改的主机名为临时生效,它修改的其实是/proc/sys/kernel/hostname文件。

[root@xuexi ~]# cat /proc/sys/kernel/hostname
xuexi.longshuai.com

虽然在man文档中说有个永久有效的选项(-b),但测试时却毫无效果。要想永久生效,需要修改配置文件/etc/hostname(CentOS 7)或/etc/sysconfig/network(CentOS 6)。例如在CentOS 7上:

[root@xuexi ~]# echo "ma.longshuai.com" >/etc/hostname

  方式b:在nginx的官网上面找到对应版本然后下载.

13.4 网关/路由

Linux上分为3种路由:

  • 主机路由:直接指明到某台具体的主机怎么走,主机路由也就是所谓的静态路由
  • 网络路由:指明某类网络怎么走
  • 默认路由:不走主机路由的和网络路由的就走默认路由。操作系统上设置的默认路由一般也称为网关。

若Linux上到某主机有多条路由可以选择,这时候会挑选优先级高的路由。在Linux中,路由条目的优先级确定方式是先匹配掩码位长度,再比较管理距离(比如metric)。也就是说,掩码位长的路由条目优先级一定比掩码位短的优先级高,所以主机路由的优先级最高,然后是直连网络(即同网段)的路由(也算是网络路由)次之,再是网络路由,最后才是默认路由。若路由条目的掩码长度相同,则比较节点之间的管理距离,管理距离短的生效。

例如下面的路由表中,若ping 192.168.5.20,则先比对192.168.100.78发现无法匹配,然后比对192.168.100.0,发现也无法匹配,接着再匹配192.168.0.0这条网络路由条目,发现能匹配,所以选择该路由条目。

[root@xuexi ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.100.2   0.0.0.0         UG    100    0        0 eth0
172.16.10.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1
192.168.0.0     192.168.100.70  255.255.0.0     UG    0      0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.100.78  0.0.0.0         255.255.255.255 UH    0      0        0 eth0

再比如下面的路由表。由于两块网卡eth0和eth1都是192.168.100.0/24网段地址,所以它们的路由条目在掩码长度的匹配上是相同的,但是和eth0直连的网段主机通信时,肯定会选择eth0这条路由条目,因为eth1和该网段主机隔了一个eth0,距离增加了1。

[root@xuexi ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.100.2   0.0.0.0         UG    100    0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     101    0        0 eth1
1 sudo wget http://nginx.org/download/nginx-1.10.0.tar.gz

13.4.1 route命令

route命令用于显示和管理路由表。当使用了add或del选项时,route命令将设置路由条目,否则route命令将显示路由表。

要显示路由表信息,只需简单的route -n即可,其中-n选项表示不解析主机名。

例如:

[root@xuexi ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.100.2   0.0.0.0         UG    100    0        0 eth0
172.16.10.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1
192.168.0.0     192.168.100.70  255.255.0.0     UG    0      0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.100.78  0.0.0.0         255.255.255.255 UH    0      0        0 eth0

对于CentOS 6以上的系统,请忽略Metric和Ref两列,它们已经不被内核使用,只是有些路由软件可能会用上。

对于Flags列,如果没有安装路由软件,则只可能出现下面的3种值:

U (route is up)

H (target is a host)

G (use gateway,也即是设置了下一跳的路由条目)

若要管理路由表,则使用add或del选项。

route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev]

选项说明:
add/del:增加或删除路由条目
-net:增加或删除的是一条网络路由
-host:增加或删除的是一条主机路由
default:增加或删除的是一条默认路由
netmask:明确使用netmask关键字指定掩码,要可以不使用该选项直接在地址上使用cidr格式的掩码,即IP/MASK。
gw:指定下一跳的地址。要求下一跳地址必须是能到达的,且一般是和本网段直连的接口。
dev:强制将路由条目关联到指定的接口上。一般内核会自动判断路由条目应该关联到哪个网络接口。

例如:

(1).添加和删除默认路由

shell> route add default gw 192.168.100.10
shell> route del default
shell> route del default gw 192.168.100.10   # 若有多条默认路由,则再加上gw即可唯一删除指定条目

因为默认路由的目的地是0.0.0.0,所以操作默认路由也可以使用0.0.0.0替代default关键字,但这样就麻烦的多了。

(2).添加和删除网络路由

shell> route add -net 172.16.10.0/24 gw 192.168.100.70
shell> route add -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70

若实在不知道下一跳给谁,那么指定本机接口也是可以的。

shell> route add -net 172.16.10.0/24 dev eth0

删除路由可以直接在增加路由的语句上将add改为del关键字。如

shell> route del -net 172.16.10.0/24 gw 192.168.100.70
shell> route del -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70
shell> route del -net 172.16.10.0/24 dev eth0

但大多数时候,可以偷懒,只要能唯一确定删除的是哪条路由即可。如:

shell> route del -net 172.16.10.0/24

(3)添加和删除主机路由

shell> route add -host 172.16.10.55 gw 192.168.10.20
shell> route del -host 172.16.100.55

  此方式下载完之后需要自己手动解压.解码命令:

13.4.2 配置永久路由

根据接口创建路由配置文件/etc/syconfig/network-scripts/route-ethX,要从那个接口出去X就是几。

路由配置文件的配置格式非常简单,每一行一个路由条目,先是要到达的目标,然后是via关键字,最后是下一跳地址。要求下一跳必须能到达,且一般都和ethX同网段。

DEST    via     nexthop

例如eth0网卡的IP地址是192.168.10.123,要通过网卡eth0出去到达10.0.0.10,那么下一跳的地址要和eth0的地址在同网段,如192.168.10.222。

10.0.0.0 via 192.168.10.222

添加主机路由、默认路由、网段路由示例如下,其中dev是可以省略的,因为没有任何用处,配置在哪个eth文件中就会从哪个接口出去。

#默认路由
default     via 192.168.100.1
0.0.0.0/0   via 192.168.100.1

#网段路由
192.168.10.0/24   via 192.168.100.1

#主机路由
192.168.100.52/32 via 192.168.100.33 dev eth1

配置完后,重启network服务即可立即生效。

route-ethX文件的还有另外一种永久路由的配置写法,但上面的方法更简单快捷,所以此处就不多说了。

配置永久路由时,需要注意几点:

(1).route-ethX的对应网卡配置文件ifcfg-ethX必须存在,否则路由无效。(对于虚拟机,通常新添加的网卡都没有对应的ifcfg-ethX文件,但ifconfig却能找到该网卡)

(2).如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件ifcfg-ethX中的DEFROUTE指令设置为"no",表示DHCP不设置默认路由。

(3).如果在route-ethX文件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的ifcfg-ethX文件中的PEERROUTES指令设置为"no",表示DHCP设置的路由允许被覆盖。

本文由澳门新葡亰手机版发布于操作系统,转载请注明出处:module搭建流媒体服务器的正确姿势,Linux的网络管

上一篇:vmtools的一些经历 下一篇:没有了
猜你喜欢
热门排行
精彩图文