您的位置:首页 > 运维架构 > Linux

在Linux下配置TCP/IP

2008-06-03 19:07 239 查看
关键文件和脚本

  网络接口初始化的实际过程(有时也称做“启动接口”)是由一组配置文件和脚本控制的,这些文件和脚本大多数在/etc
目录下。这些配置文件告诉 Linux 它的 IP
地址、主机名和域名;脚本则负责网络接口的初始化。

  遗憾的是,不同分发版(distribution)中文件位置和命名约定至今还没有统一的标准。为给本文提供具体的示例,将基于广泛使用的
Red Hat 7.0 包做出描述。请记住,若您的分发版不是使用 Red Hat 或不是基于 Red Hat 约定(如 Mandrake
分发版),在此所引用的一些文件会位于别的目录中或有其它的名称。然而,网络效果和实际效果是一样的 —
将存储在一系列配置文件中的网络信息传递给脚本,然后用脚本初始化接口和网络路由。

  涉及初始化和配置网络接口的关键文件有:

  /etc/hosts
(将主机名映射到 IP 地址)

  /etc/networks
(将域名映射到网络地址)

  /etc/sysconfig/network
(打开或关闭联网,设置主机名和网关)

  /etc/resolv.conf (设置名称服务器或 DNS 服务器的 IP
地址)

  /etc/rc.d/rc3.d/S10network (在引导时激活已配置的以太网接口,由运行级别目录
/etc/rc.d/rcN.d/ 中的符号链接调用)

  /etc/sysconfig/network-scripts
中一些文件的集合。这些文件包括用于网络连接的主要配置,以及提供接口状态和控制功能的符号链接。

  /etc/hosts

  /etc/hosts
是将 IP 地址和主机名联系起来的简单文本文件。 TCP/IP 网络中的每台计算机都必须有唯一的 IP 地址。hosts 文件只允许用户将主机名与 IP
地址联系起来,以便当访问计算机时使用该名称,而不用输入一长串数字。/etc/hosts 中的每一项都依次包含一个 IP
地址、空白和主机名和/或别名。井号(#)表示注释开始。例如:

  # /etc/hosts

  # last updated
12/3/2000

  127.0.0.1 loopback localhost # loopback (lo0)
name/address

  192.168.1.5 janus.syroidmanor.com
janus

  192.168.1.6 thumper.syroidmanor.com thumper

  192.168.1.7
donovan.syroidmanor.com donovan

  192.168.1.8
raidserver

  192.168.1.20 phoenix.syroidmanor.com
phoenix

  192.168.1.15 hydras.syroidmanor.com hydras

  在上面显示的
Hosts 文件中,IP 地址 192.168.1.5 映射到主机 janus.syroidmanor.com
,并且分配给它一个备用主机名(或别名)janus。尽管 DNS
已经取代了这个主机文件,但出于以下原因仍然使用它:

  大多数系统都有一个包含本地网络上的关键主机的名称和地址信息的小主机表。当 DNS
未运行时,例如,在最初系统启动期间,则使用该表。即便本地 DNS 服务器正在运行,在每个系统上也应该有一个小 hosts 文件,该文件包含一个主机本身项、一个
localhost 项以及局域网上任何主要的网关和服务器项。

  未连接到因特网或其他网络的小网络不需要 DNS
服务。然而,这些网络上的主机也需要知道如何定位同一网络上的其它主机。

  /etc/networks

  就如主机有名称和地址一样,为方便起见,也可以为网络和子网命名。
/etc/networks 文件在布局上与 /etc/hosts 很相似,只不过名称和地址互换了一下。

  # /etc/networks for
syroidmanor.com

  localnet 127.0.0.0 #loopback

  syroid-C1
192.168.1 #development, class C

  syroid-C2 192.168.2 #support, class
C

  在上面的示例中,可将网络名称 syroid-C1 用于脚本或任何命令行实用程序中来引用 192.168.1 这个 C
类网。

  /etc/sysconfig/network

  将 /etc/sysconfig/network(注意与
/etc/networks 文件不同,这个 network
是单数而不是复数)用于指定所期望的网络配置信息;在引导时,有几个脚本要使用它。该文件可以包含下列所示的一个或多个关键字/值对:

  NETWORKING=YES|NO
-- YES 表示需要配置网络;NO 表示不需要配置网络。

  HOSTNAME=hostname —
主机的全限定域名;为与较老的程序兼容,这应该与在 /etc/hosts 中的主机项相匹配。

  GATEWAY=gw-ip — 网络网关的 IP
地址。

  GATEWAYDEV=gw-dev — 网关设备的名称(例如 eth0)。

  NISDOMAIN=dom-name —
表示 NIS 域,如果有的话。

  下面是 /etc/sysconfig/network
最小配置的示例:

  NETWORKING=yes

  HOSTNAME=phoenix.syroidmanor.com

  GATEWAY=192.168.1.1

  /etc/resolv.conf
和 /etc/rc.d/rc3.d/S10network

  /etc/resolv.conf
是网络用来确定主机解析的关键文件之一。在此可以标识最多三个名称服务器;如果列在第一位的服务器未对查询做出响应,则后面两个起到备用的作用。domain
项定义缺省域名。解析器(顺便提一下,该解析器不是一个单独的进程,而是由网络进程调用的例程库)将这里所列出的域名附加在任何不包含句点的主机查询上。

  #
/etc/resolv.conf

  # domain name resolver config file

  domain
syroidmanor.com

  nameserver 192.168.1.7

  nameserver
192.168.1.10

  nameserver
165.142.268.19

  在上面所显示的示例中,如果提交给解析器的查询是想要查询找主机
phoenix(注意,没有点),则将该域附加到这个请求之后,这会将该查询扩展为
phoenix.syroidmanor.com。若需要了解更多详细信息和可以使用的选项,请输入 man resolv.conf


  /etc/rc.d/rc3.d/S10network 是指向 /etc/rc.d/init.d/network
脚本的符号链接。当系统达到运行级别 3
时,它负责初始化所有已配置的网络接口。在这里我们不想花时间来详细讨论该文件后面的逻辑,因为该文件主要是调用本节中所提到的其它脚本和程序。但是,如果您对
S10network 中初始化各种网络组件和服务的顺序感兴趣的话,则可以使用 less /etc/rc.d/rc3.d/S10network
命令来仔细研读它。

  /etc/sysconfig/network-scripts/

  最后,通常可在
/etc/sysconfig/network-scripts/
目录中查找到下列文件:

  /etc/sysconfig/network-scripts/ifup

  /etc/sysconfig/network-scripts/ifdown

  /etc/sysconfig/network-scripts/network-functions

  /etc/sysconfig/network-scripts/ifcfg-interface-name

  /etc/sysconfig/network-scripts/ifcfg-interface-name:clone-name

  /etc/sysconfig/network-scripts/chat-interface-name

  /etc/sysconfig/network-scripts/dip-interface-name

  /etc/sysconfig/network-scripts/ifup-post

  ……/network-scripts/,第一部分

  /etc/sysconfig/network-scripts
中的 ifup 和 ifdown 项实际是分别指向 /sbin/ifup 和 /sbin/ifdown
的符号链接。这两个脚本是在该目录下唯一应该直接调用的脚本,并且它们按需要调用所有其它脚本。

  ifup 和 ifdown
通常只带一个参数:设备名(例如 eth0)。系统在引导过程期间用参数“boot”调用它们,以便于不激活没有被配置成在系统启动时初始化的设备(请参阅下面关于
interface-name 描述中的 ONBOOT=no)。

  network-function
不是公共文件。它包含这个目录中的几个脚本所需的函数。具体地说,它包含了用于处理替代接口配置的大多数代码。

  ……/network-scripts/,第二部分

  配置文件
ifcfg-interface-name 和 ifcfg-interface-name:clone-name
包含了初始化接口所需的大部分详细信息。第一个文件定义接口,而第二个文件仅包含与“别名”(或替代)接口相关的部分定义。例如,网络地址或许不同,但其它可能会一样。

  在
ifcfg 文件中定义的各项目取决于接口类型;下列值很常见:

  DEVICE=name ,其中 name
是物理设备名

  IPADDR=addr ,其中 addr 是 IP 地址

  NETMASK=mask ,其中 mask
是网络掩码值

  NETWORK=addr ,其中 addr 是网络地址

  BROADCAST=addr ,其中 addr
是广播地址

  GATEWAY=addr ,其中 addr 是网关地址

  ONBOOT=answer ,其中 answer
是“yes”(引导时激活设备)或“no”

  USERCTL=answer ,其中 answer 是“yes”(非 root
用户可以控制该设备)或“no”

  BOOTPROTO=proto ,其中 proto
取下列值之一:“none”(引导时不使用协议)“bootp”(使用 BOOTP 协议)或“dhcp”(使用 DHCP
协议)

  此外,下列值对所有的 SLIP(串行线 IP)文件是公共的:

  PERSIST=answer ,其中 answer
是“yes”(即使调制解调器已经挂断连接,也保持设备处于激活状态)或“no”(不保持激活状态)

  MODEMPORT=port ,其中 port
是调制解调器端口的设备名(例如,/dev/modem)

  LINESPEED=baud ,其中 baud
是调制解调器的线路速度

  DEFABORT=answer ,其中 answer
是“yes”(当创建/编辑该接口的脚本时,插入缺省的异常终止字符串)或“no”(不插入缺省的异常终止字符串)

  ……/network-scripts/,第三部分

  chat-interface-name
文件是用于 SLIP 连接的交谈脚本(chat script)。它的功能是启动 SLIP 连接。对于 SLIP 设备,DIP
脚本是根据这个交谈脚本编写的。

  chat-interface-name 是只写脚本,它由程序 netcfg
根据交谈脚本创建的。不要修改该文件。

  当初始化任何网络设备(除了 SLIP 设备)时,调用
/etc/sysconfig/network-scripts/ifup-post。它调用
/etc/sysconfig/network-scripts/ifup-routes
以启动依赖于该设备的静态路由,它还启动为该设备配置的任何别名,并且,如果还没有设置主机名,则设置主机名 — 这样找到与该设备 IP
地址匹配的主机名。最后,ifup-post
给请求通知网络事件的任何程序发送信号(SIGIO)。

  配置网络接口和路由

  ifconfig
程序

  ifconfig 命令设置、检查或监控网络接口的配置值。它还可以用于设置接口的“状态”—
即“up”(启动)或“down”(关闭)。一个对 ifconfig 简单的调用是:

  ifconfig interface-name
ip-address up|down

  这会激活指定的接口并将所提供的 IP 地址分配给它。

  ifconfig
有许多个可用的选项(metric、mtu 以及 pointtopoint
等等;有关详细信息,请参阅帮助页)用于显式地设置唯一的接口参数,但一般来说,提供接口名称(例如, eth0)、IP
地址和网络掩码就足够了。例如:

  ifconfig eth0 192.168.1.5 netmask 255.255.255.0
up

  分配给接口 eth0 的 IP 为 192.168.1.5,网络掩码为 255.255.255.0
并“启动该接口”或将其初始化。类似的,若将接口“关闭”,则输入 ifconfig eth0 down ;不需要指定 IP 和网络掩码。

  使用
ifconfig 检查接口

  运行不带参数的 ifconfig 会使该程序显示所有网络接口的状态。若要检查特定接口的状态,则在 ifconfig
后附加这个接口的名称。例如:

  [tom@phoenix tom]$ /sbin/ifconfig eth0

  eth0
Link encap:Ethernet HWaddr 00:10:5A:00:87:22

  inet addr:192.168.1.20
Bcast:192.168.1.255 Mask:255.255.255.0

  UP BROADCAST RUNNING MULTICAST
MTU:1500 Metric:1

  RX packets:9625272 errors:0 dropped:0 overruns:0
frame:0

  TX packets:6997276 errors:0 dropped:0 overruns:0
carrier:0

  collisions:0 txqueuelen:100

  Interrupt:19 Base
address:0xc800

  以上输出显示 MAC 地址(Hwaddr)、所分配的 IP 地址(inet
addr)、广播地址(Bcast)和网络掩码(Mask)。另外可以看出该接口处于 UP 状态,其 MTU 为 1500 并且 Metric 为
1。接下来的两行给出有关接收到(RX)和已发送的(TX)信息包数,以及错误、丢弃和溢出信息包数的统计。最后两行显示冲突信息包的数目、发送队列大小(txqueuelen)和
IRQ 以及这块卡的基址。

  配置路由

  让我们通过查看尚未配置网关的网络接口来看一下如何配置路由。正如您所见,使用不带参数的
route 命令将显示内核路由表。

  [root@phoenix tom]# /sbin/route

  Kernel IP
routing table

  Destination Gateway Genmask Flags Metric Ref Use
Iface

  127.0.0.0 127.0.0.1 255.0.0.0 U 0 0 0 lo

  192.168.1.0
192.168.1.5 255.255.255.0 U 0 0 0 eth0

  第一项是到 localhost 的回送路由,它是在配置 lo
时自动创建的。第二项是通过接口 eth0 到网络 192.168.1.0 的路由。地址 192.168.1.5 不是远程网关地址。它是分配给 phoenix
eth0 的地址。

  注意每项的标志。它们都设置了 U(启动)标志,这表示准备使用它们,但它们都未设置 G(网关)标志。不设置 G
标志是因为这两个路由都是通过本地接口,而不是通过外部网关的直接路由。

  上述示例仅包含一个网络路由 192.168.1.0。因而 phoenix
仅可以与位于 192.168.1.0
网络中的主机进行通信。

  添加静态路由

  最小的路由表仅允许在同一网络中的主机互相通信。要与远程主机通信,必须将通过外部网关的路由添加到路由表中。达到该目的的一种方法是通过使用
/sbin/route 命令。拿上页中的例子来说,我们现在就将路由 192.168.1.1 添加到网络配置中。

  [root@phoenix
tom]# /sbin/route add default 192.168.1.1 1

  在上面这个示例中,route
命令后的第一个参数是关键字 add 。在 route 命令上的第一个关键字要么是 add 要么是 del
(删除路由)。下一个值是目的地地址,它是通过该路由到达的地址。如果关键字 default
用于目的地地址,则创建缺省路由。只要没有到目的地的特定路由时,就使用缺省路由;通常,这就是您在路由表中唯一需要的项。如果网络中只有一个网关,则使用缺省路由引导所有要到远程网络的数据流量通过那个网关。

  这个命令行的下一个参数是网关地址。该地址必须是直接连接本机所在网络的网关地址。在到远程目的地的网络路径中,TCP/IP
路由要指定下一跳(next-hop)。这个下一中继必须是本机可直接访问的;因而,它必须是在直接连接在本机所在的网络中。

  注:因为大多数的路由都是在系统启动过程早期时添加的,所以建议用数字的
IP 地址替代主机名。这样做就可以确保路由配置不依赖于名称服务器的状态。而且要确保总是使用完整的数字地址(共 4 个字节);如果不用完整的 IP
地址,则路由只能猜想部分 IP 地址,这样可能会导致不正确的配置。

  route 命令中,最后一个参数是数字 1,称之为路由度量(routing
metric)。当删除路由时是不需要此 metric 参数的,但是在添加路由时许多系统都需要它。尽管需要度量,route
仅使用它来确定路由是通过直接连接的接口还是通过外部的网关。如果 metric 是 0,建立的这条路由是通过本机接口且不设置 G 标志;如果 metric 值比
0 大,则建立的这条路由带 G 标志且网关地址被认为是外部的。静态路由不使用其它 metric 值。需要真正用到多个 metric
值的是动态路由。

  要显示新的路由表,输入 /sbin/route 或使用 netstat -rn
命令(我们将再下一节讨论该命令):

  [root@phoenix tom]# netstat -rn

  Kernel IP
routing table

  Destination Gateway Genmask Flags MSS Window irtt
Iface

  192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

  127.0.0.0
0.0.0.0 255.0.0.0 U 0 0 0 lo

  0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0
eth0

  最后做一个测试来证明一切都如同我们讲到的那样运行,ping
另一个网络上的主机;应该可以接收到响应。如果没有接收到响应,则重新检查您的配置。

  要熟悉 route 其它的选项和参数,请输入 man
route 。

  netstat 程序

  如果管理任意规模的 TCP/IP 网络,则 netstat
程序是一个相当有价值的工具。它可以显示内核路由表,活动网络连接的状态和每个已安装网络接口的一些有用的统计信息。

  象大多数 Linux
管理命令行程序一样,netstat 可以通过其后面的附加选项或标志来选择所显示信息的细节数量和/或信息的范围。一些常用选项有:

  -a —
显示所有连接的信息,包括那些正在侦听的

  -i — 显示所有已配置网络设备的统计信息

  -c —
持续更新网络状态(每秒一次)直至被人为中止(^C)

  -r — 显示内核路由表

  -n —
以数字(原始)格式而不是已解析的名称显示远程和本地地址

  -t — 仅显示 TCP 套接字信息(不包括任何 UCP
套接字信息)

  -v — 显示 netstat 的版本信息

  输入 man netstat
可获得所有可用标志的完整列表和详细说明每个标志的用途。请注意还可以组合这些标志,所以输入 netstat -rn 将以原始的 IP
地址格式显示关于本地和远程主机(n)的系统路由表(r)。

  显示活动的网络连接

  netstat
支持一组显示活动或非活动的套接字的选项:-t、-u、-w 和 -x 分别显示活动的 TCP、UDP、RAW 或 UNIX 套接字连接。如果加上 -a
标志,还会显示等待连接的(换句话说,就是侦听)套接字。这将为您显示现在正在系统上运行的所有服务器。

  例如:在主机 phoenix 上输入
netstat -ta 会显示下列内容:

  [tom@phoenix tom]$ netstat -ta

  Active
Internet connections (servers and established)

  Proto Recv-Q Send-Q
Local Address Foreign Address State

  tcp 0 40 phoenix.syroidmanor:ssh
192.168.1.5:1132 ESTABLISHED

  tcp 0 0 *:ssh *:* LISTEN

  tcp 0 0
phoenix.syroidmano:1028 hydras.syro:netbios-ssn ESTABLISHED

  tcp 0 0
phoenix.syroidmano:1027 raidserver:netbios-ssn ESTABLISHED

  tcp 0 0
*:printer *:* LISTEN

  tcp 0 0 *:auth *:* LISTEN

  tcp 0 0 *:1024
*:* LISTEN

  tcp 0 0 *:sunrpc *:*
LISTEN

  上述输出显示大多数的服务器仅仅在等待到来的连接(LISTEN)。但是,第一行显示主机 phoenix 和 IP 地址为
192.168.1.5 之间的连接;第三和第四行显示两个 netbios 连接(Samba SMB 共享)。

  用 netstat
查看路由表

  当使用 -r 标志时,netstat 显示内核中的路由表,这类似于输入 /sbin/route
:

  [tom@phoenix tom]$ netstat -nr

  Kernel IP routing
table

  Destination Gateway Genmask Flags MSS Window irtt
Iface

  192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

  127.0.0.0
0.0.0.0 255.0.0.0 U 0 0 0 lo

  0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0
eth0

  -n 选项强制 netstat 以点分四组 IP 数字的形式,而不是主机和网络名称的形式输出地址。当您不想通过网络(例如,用 DNS
或 NIS
服务器)进行地址查询时,这个选项特别有用。

  第二列显示路由项中所指向的网关。如果没有使用网关,就会显示星号。第三列是路由的网络掩码。内核在将信息包的
IP 地址与路由的目的地 IP 地址进行比较之前,将 Genmask 值与信息包的 IP
地址逐位进行“与”操作,从而使路由“通用化”。

  第四列显示路由的标志:U 表示处于活动状态,H 表示主机,G 表示网关,D 表示动态路由,而
M 表示已经修改过。

  [tom@phoenix tom]$ netstat -nr

  Kernel IP routing
table

  Destination Gateway Genmask Flags MSS Window irtt
Iface

  192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

  127.0.0.0
0.0.0.0 255.0.0.0 U 0 0 0 lo

  0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0
eth0

  接下来的三列显示 MSS、Window 和 irtt,它们将被应用于通过该路由建立的 TCP 连接。MSS(Maximum
Segment Size)表示“最大分段尺寸”,也是内核所构建以通过该路由发送的数据报的最大尺寸。Window
表示系统一次从远程主机接收突发的最大量数据。

  首字母缩写词 irtt 代表“初始往返时间(initial round trip
tim)”。TCP 协议确保主机间可靠地发送数据,如果数据已经丢失,则重新发送。TCP
协议一直对发送给远程端点的数据报和接收到的确认所花费的时间进行记数,以便知道假定要重发数据报前需要等待的时间;这个过程称为往返时间。TCP
协议将使用第一次建立连接时所用时间作为初始往返时间的值。对于大多数类型的网络,用缺省值就够了,但对某些速度较慢的网络(特别是某些业余的分组无线网络),这个时间太短了,会造成不必要的重发。可以使用
route 命令设置 irtt
值。在上面这个路由表中,这些字段均为零值,这表明正在使用缺省值。

  最后,最后这个字段表示的是所显示的路由使用的网络接口。

  用
netstat 显示一些网络接口使用的统计信息

  用 -i 选项调用 netstat 可以显示所有已配置接口的一些有用的统计信息 —
这是一个用于排除网络故障的非常有用的工具。有了该命令,很容易检查连接的状态以及连接是否“正常”。

  [tom@phoenix tom]$
netstat -i

  Kernel Interface table

  eth0 Link encap:Ethernet
HWaddr 00:10:5A:00:87:22

  inet addr:192.168.1.20 Bcast:192.168.1.255
Mask:255.255.255.0

  UP BROADCAST RUNNING MULTICAST MTU:1500
Metric:1

  RX packets:10554374 errors:0 dropped:0 overruns:0
frame:0

  TX packets:8528339 errors:0 dropped:0 overruns:0
carrier:0

  collisions:0 txqueuelen:100

  Interrupt:19 Base
address:0xc800

  lo Link encap:Local Loopback

  inet
addr:127.0.0.1 Mask:255.0.0.0

  UP LOOPBACK RUNNING MTU:3924
Metric:1

  RX packets:5612 errors:0 dropped:0 overruns:0
frame:0

  TX packets:5612 errors:0 dropped:0 overruns:0
carrier:0

  collisions:0 txqueuelen:0

  RX packets 和 TX packets
行分别显示了已经接收到的信息包或已经发送了的信息包数目以及出错的信息包、丢失的信息包以及溢出的 RX/TX
统计信息。最常见的接口错误都是源于不正确的配置,所以,如果遇到了某些困难,最好再三检查所有的设置来进行诊断。

  假使接口已经启动,则应该没有信息包排队等候发送(txqueuelen)—
如果有,则可能是由于网络电缆或网卡有问题。首先换一根备用电缆,然后重新检查连接。RX/TX 错误应该近乎为零。如果 TX
错误过多,则表示网络已经饱和或物理连接有问题;如果 RX
错误过多,则表示网络已经饱和、物理连接有问题或主机过载。如果遇到过高的冲突率(冲突率是输出信息包(output
packet)的百分比,而不是从发送/接收信息包的总数中计算得出),它可能也表示网络已经饱和;通过从同一子网上的另一台主机执行 netstat -i
命令并比较结果来证实这一点。

  要解决网络中错误,一定要仔细地以及系统地分析接口的所有方面(硬件和软件),这是必要的。不要匆忙行事,……啊……我们提到了总是要先检查网络电缆。在这一点,相信我。

  参考资料

  在网上有:

  Linux
System Administrator's Guide

  学习如何 Easily configure TCP/IP on your AIX
system

  IBM 提供了一些用于网络监控的工具,譬如 Tivoli NetView Performance Monitor for
TCP/IP

  访问 TCP/IP for OS/40O 的主页

  请阅读关于实现 iSeries 和 AS/400 的
TCP/IP 和因特网访问

  如果您可以在线搜索和参考,则我强烈向您推荐 O'Reilly 新的 Safari
订阅服务。您可以完全搜索并选择一些曾经出版过的有关网络方面最好的书籍。

  出版的书籍有:

  TCP/IP Network
Administration, 2nd Edition,Craig
Hunt(O'Reilly)ISBN:1-56592-322-7

  Linux in a Nutshell, 3rd
Edition,Siever, Spainhour, Figgins, and
Hekman(O'Reilly)ISBN:0-596-00025-1

  Running Linux, 3rd Edition, Welsh,
Dalheimer, and Kaufman(O'Reilly)ISBN:1-56592-469-X本文来自:http://doc.linuxpk.com/63.html
发表您的高见!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 职场 休闲