本节书摘来自华章出版社《构建高可用linux服务器 第3版》一 书中的第1章,第1.3节,作者:余洪春 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
linux服务器的系统安装好后,就要在机房或公司内网环境中配置它的ip了,这是最重要的一个环节,下面我就以centos 5.8 x86_64服务器为例来说明如何通过命令或图形来配置linux服务器的ip、网关、dns,以及如何用命令查看linux的进程或网络连接等。
1.手动修改配置网卡文件
手动配置网卡是最直接的方式,熟练的系统管理员在平时维护系统的时候更喜欢使用这种方式,因为手工配置有很多优点:
熟悉命令之后,手工配置更快速,并且不需要重新启动;
能够使用配置命令的高级特性;
更容易维护配置文件,找出系统故障;
能更深刻地了解系统配置是如何进行的。
下面就介绍一下如何手动配置网卡文件。首先检查网卡是否正常安装,centos 5.8系统自带的驱动非常多,基本上市面上的服务器网卡都可以正常安装;即使是在组装的pc机上安装网卡驱动也会很顺利,我们可以用如下命令检查网卡是否正常安装,命令如下:
lspci |grep ether
命令显示结果如下:
06:07.0 ethernet controller: intel corporation 82541gi gigabit ethernet controller (rev 05)
07:08.0 ethernet controller: intel corporation 82541gi gigabit ethernet controller (rev 05)
一般来说,2.4版本以后的linux可以支持的网卡芯片组驱动已经很完备了,包括著名厂商(如intel),以及使用广泛的realtek、via等网卡芯片,所以大家可以很轻松地使用网卡,我们还可以用lsmod命令通过加载模块的方法来加载特殊的网卡。
在配置linux网络设备时,它们分别被赋予别名,该别名由一个描述性的缩略词和一个编号组成。第一个设备的编号为0,其他设备依次为1、2、3……其中,eth0、eth1是以太网卡接口,大多数以太网卡都用此名表示,包括许多并行端口以太网卡,接下来主要讨论这种类型的网卡。与网卡相关的tcp/ip网络配置文件是/etc/sysconfig/network-scripts/ifcfg-ethx,其中x是从0开始的,第一个以太网配置文件即/etc/sysconfig/network-scripts/ifcfg-eth0,下面以笔者的公网机器上的此文件为例说明,如下所示:
device=eth0
bootproto=none
hwaddr=00:14:22:1b:71:20
ipv6init=yes
ipv6_autoconf=yes
onboot=yes
netmask=255.255.255.192
ipaddr=203.93.236.146
gateway=203.93.236.129
type=ethernet
peerdns=yes
userctl=no
上述代码解释如下:
device=eth0表示设定网卡的名称,它要跟文件名称对应。
bootproto=none是启动时ip取得的协议,这里是固定的(此值也可以为static),如果是动态主机,要改成dhcp。
hwaddr=00∶14∶22∶1b∶71∶20指网卡的mac地址,可以用ifconfig来取值,当然,如果我们不指定这项,centos 5.8也会默认指定。
ipv6init=yes表示支持ipv6,no的话表示不支持。
ipv6_autoconf=yes表示自动配置ipv6。
onboot=yes表示在开机的时候启动网卡,这里肯定选择yes,如果选择no则网卡在系统引导都不会被分配ip地址,那就很麻烦了。
netmask=255.255.255.192和ipaddr=203.93.236.146,这两个就没什么好说了,这是idc机房分配给笔者的机器的公网ip地址和子网掩码,顺序反了一样生效。
gateway=203.93.236.129是网关地址。
type=ethernet表示网卡的类型为以太网型。
peerdns=yes表示允许从dhcp获得的dns覆盖本地的dns。
userctl=no表示不允许普通用户修改配置。
配置完成后记得保存,然后重启网络服务即可生效。当然,如果认为麻烦,可以用centos 5.8的setup工具中的“网络配置”来操作,方法很简单(如图1-1所示),这里就不浪费篇幅了。
2.修改机器的hostname名
下面来修改机器的hostname名,编辑/etc/sysconfig/network文件,如下所示:
networking=yes
networking_ipv6=yes
hostname=localhost.localdomain
hostname后面紧跟的就是我们的主机名,这里是系统默认的localhost.localdomain。
重启后就可以用hostname命令来查看当前主机名,如果只是简单地使用命令hostname,仅仅对当前生效;重启后会失效,比较好的方法是写到文件中并保存。
3.修改主机名查询静态表/etc/hosts
linux主机名的相关配置文件就是/etc/hosts,这个文件告诉本主机域名和ip是如何对应的(哪些域名对应哪些ip,哪些主机名对应哪些ip)。
下面对/etc/hosts的格式进行说明。一般/etc/hosts的内容与下面的内容类似:
127.0.0.1 localhost.localdomain localhost
192.168.21.100 webserver.cn7788.com webserver
192.168.21.111 ftp.cn7788.com ftp
通常hosts文件的每行为一个主机的信息,并且每行由三部分组成,各个部分间由空格隔开,这三部分所表示的意思分别如下所示。
第一部分:网络ip地址;
第二部分:主机名或域名;
第三部分:主机名别名。
当然每行也可以是两部分,即主机ip地址和主机名,比如:
192.168.21.100 webserver.cn7788.com
另外,hosts文件中#号开头的行是说明,不被系统解释。
这里稍微解释一下主机名(hostname)和域名(domain)的区别:主机名通常在局域网内使用,通过hosts文件,主机名就被解析到对应的ip地址上;域名通常在internet上使用,但如果本机不想使用internet上的域名解析,可以更改hosts文件,加入自己的域名解析。
目前/etc/hosts多用于集群环境或开发测试环境。
4.配置dns域名解析服务器
配置dns域名就比较简单了,只需要配置/etc/resolv.conf文件即可,如下所示。
nameserver 202.96.128.86
nameserver 202.96.128.166
resolv.conf中最重要的选项是nameserver,它给出了要使用的名字服务器的ip地址。如果你通过nameserver选项指定了几个名字服务器,那么它们会以给出的先后顺序来决定主从服务器,如果主服务器上没有对应的域名,系统会自动从dns上寻找。因此,你首先应该给出最可靠的服务器。目前,它至多支持三个服务器名字。
1.3.2 查看linux服务器的网络连接
查看linux服务器的网络连接时,可以用ifconfig、ping、netstat等命令。它们都是我们经常会用到的查看网络连接方面的命令,很实用,下面将分别介绍一下这几个命令的用法。
1.ifconfig
这个命令用来显示所有网络接口的详细情况,可以显示/设置ip地址、子网掩码、广播地址等,由于它只是暂时生效,所以推荐大家使用前面所介绍的网卡文件来设置。此命令和windows的ipconfig命令很相似,用法简单,大家可以用man来了解其详细语法。
下面用ifconfig显示服务器的所有网络接口配置,命令如下:
ifconfig-a
eth0 link encap:ethernet hwaddr 00:14:22:1b:71:20
inet addr:203.93.236.146 bcast:203.93.236.191 mask:255.255.255.192
inet6 addr: fe80::214:22ff:fe1b:7120/64 scope:link
up broadcast running multicast mtu:1500 metric:1
rx packets:7864481 errors:0 dropped:0 overruns:0 frame:0
tx packets:8121233 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
rx bytes:1689037931 (1.5 gib) tx bytes:9937152687 (9.2 gib)
eth1 link encap:ethernet hwaddr 00:14:22:1b:71:21
broadcast multicast mtu:1500 metric:1
rx packets:0 errors:0 dropped:0 overruns:0 frame:0
tx packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
rx bytes:0 (0.0 b) tx bytes:0 (0.0 b)
lo link encap:local loopback
inet addr:127.0.0.1 mask:255.0.0.0
inet6 addr: ::1/128 scope:host
up loopback running mtu:16436 metric:1
rx packets:48909 errors:0 dropped:0 overruns:0 frame:0
tx packets:48909 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
rx bytes:27821974 (26.5 mib) tx bytes:27821974 (26.5 mib)
lo:0 link encap:local loopback
inet addr:203.93.236.148 mask:255.255.255.255
sit0 link encap:ipv6-in-ipv4
noarp mtu:1480 metric:1
如果只显示eth0的网络配置,则在ifconfig后面接上eth0即可,命令如下所示:
ifconfig eth0
结果如下所示:
rx packets:7864647 errors:0 dropped:0 overruns:0 frame:0
tx packets:8121308 errors:0 dropped:0 overruns:0 carrier:0
rx bytes:1689050791 (1.5 gib) tx bytes:9937166253 (9.2 gib)
如果想显示eth0的ip地址,则可以用如下命令组合:
ifconfig eth0 | grep "inet addr" | awk -f[:" "]+ '{print$4}'
结果显示如下所示:
203.93.236.146
这里稍微解释下此命令,它是条awk语句,会以空格和:为分隔符,然后打印出第四列。
2.ping
ping命令相信大家都很熟悉了,它用于检查网络上某台主机是否为活动状态或发生故障。它会利用tcp/ip协议族中的icmp协议的echo_request数据报强制从特定的主机上返回响应,一般我们在发现无法连接某网站时,首先想到的就是这个命令。因为ping命令的执行过程中同样会涉及路由、地址解析、网关等,所以如果ping不通,则表明网络不正常。用其他方法也只能得到这样的结果,所以我们把它作为检测网络状态的首选。但是,由于它只经过底层的几个协议,所以即使它运行成功了,还是需要用其他的方法测试高层是否提供所需的服务。
下面我们试着用5个数据包去ping下www.163.com,命令如下所示:
ping -c 5 www.163.com
显示结果如下:
ping 163.xdwscache.glb0.lxdns.com (210.51.213.180) 56(84) bytes of data.
64 bytes from 210.51.213.180: icmp_seq=1 ttl=62 time=1.28 ms
64 bytes from 210.51.213.180: icmp_seq=2 ttl=62 time=1.41 ms
64 bytes from 210.51.213.180: icmp_seq=3 ttl=62 time=1.38 ms
64 bytes from 210.51.213.180: icmp_seq=4 ttl=62 time=1.59 ms
64 bytes from 210.51.213.180: icmp_seq=5 ttl=62 time=1.31 ms
--- 163.xdwscache.glb0.lxdns.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 1.286/1.399/1.598/0.117 ms
通常大家比较关心ping通的time长短(它可以反映你与对方网站之间的连接速度)和有无丢包,这个命令的语法比较简单,大家可以多用man去了解其详细语法。
3.netstat
netstat命令的功能是显示网络连接、路由表和网络接口的信息,可以让用户得知目前都有哪些网络连接正在运作。
下面是它的重要参数,以及详细的说明:
-a:显示任何关联的协议控制块的地址。主要用于调试。
-a:显示所有套接字的状态。在一般情况下不显示与服务器进程相关联的套接字。
-i:显示自动配置接口的状态。那些在系统初始引导后配置的接口状态不在输出之列。
-m:打印网络存储器的使用情况。
-n:打印实际地址,而不是对地址的解释或显示主机、网络名之类的符号。
-r:打印路由选择表。
-f address:family会对于给出名字的地址簇打印统计数字和控制块信息。到目前为止,它唯一支持的地址簇是inet。
-i interface:表示只打印给出名字的接口状态。
-p protocol-name:表示只打印给出名字的协议的统计数字和协议控制块信息。
-s:打印每个协议的统计数字。
-t:表示在输出显示中用时间信息代替队列长度信息。
我们用得最多的,也是最习惯的参数有两个,即netstat-an,如下所示:
netstat -an | grep –v unix
命令显示结果如下所示:
active internet connections (servers and established)
proto recv-q send-q local address foreign address state
tcp 0 0 127.0.0.1:2208 0.0.0.0:*listen
tcp 0 0 0.0.0.0:740 0.0.0.0:*listen
tcp 0 0 0.0.0.0:3306 0.0.0.0:*listen
tcp 0 0 0.0.0.0:111 0.0.0.0:*listen
tcp 0 0 0.0.0.0:80 0.0.0.0:*listen
tcp 0 0 127.0.0.1:631 0.0.0.0:*listen
tcp 0 0 127.0.0.1:25 0.0.0.0:*listen
tcp 0 0 127.0.0.1:6010 0.0.0.0:*listen
tcp 0 0 127.0.0.1:2207 0.0.0.0:*listen
tcp 0 0 203.93.236.146:80 117.34.91.54:4991time_wait
tcp 0 0 203.93.236.146:80 117.34.91.54:1066time_wait
tcp 0 0 203.93.236.146:80 117.34.91.54:3067time_wait
tcp 0 0 ::ffff:127.0.0.1:8005 :::*listen
tcp 0 0 :::8009 :::*listen
tcp 0 0 :::8080 :::*listen
tcp 0 0 :::22 :::*listen
tcp 0 0 ::1:6010 :::*listen
tcp 1 0 ::ffff:203.93.236.146:41844 ::ffff:203.93.236.146:3306 close_wait
tcp 1 0 ::ffff:203.93.236.146:42287 ::ffff:203.93.236.146:3306 close_wait
tcp 1 0 ::ffff:203.93.236.146:42289 ::ffff:203.93.236.146:3306 close_wait
tcp 0 52 ::ffff:203.93.236.146:22 ::ffff:220.249.72.138:23527 established
udp 0 0 0.0.0.0:58153 0.0.0.0:*
udp 0 0 0.0.0.0:734 0.0.0.0:*
udp 0 0 0.0.0.0:737 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:631 0.0.0.0:*
udp 0 0 :::33835 :::*
udp 0 0 :::5353 :::*
active unix domain sockets (servers and established)
proto refcnt flags type state i-node path
netstat -an参数中state的含义如下所示。
listen:侦听来自远方的tcp端口的连接请求。
syn_sent:在发送连接请求后等待匹配的连接请求。
syn_received:在收到和发送一个连接请求后等待对方对连接请求的确认。
established:代表一个打开的连接,我们常用此作并发连接数。
fin_wait1:等待远程tcp连接中断请求,或先前的连接中断请求的确认。
fin_wait2:从远程tcp等待连接中断请求。
close_wait:等待从本地用户发来的连接中断请求。
closing:等待远程tcp对连接中断的确认。
last_ack:等待原来发向远程tcp的连接中断请求的确认。
time_wait:等待足够的时间以确保远程tcp接收到连接中断请求的确认。
closed:没有任何连接状态。
这里介绍我们经常在工作中用到的一个命令组合,可以用来查看服务器网络连接状态并汇总信息,命令如下所示:
netstat -an | awk '/^tcp/ {++s[$nf]} end {for (a in s) print a, s[a]}'
time_wait 21
established 185
listen 9
参数说明:
closed:无连接是活动的或正在进行。
listen:服务器在等待进入呼叫。
syn_recv:一个连接请求已经到达,等待确认。
syn_sent:应用已经开始,打开一个连接。
established:正常数据传输状态。它的值也可以近似理解为当前服务器的并发数。
fin_wait1:应用说它已经完成。
fin_wait2:另一边已同意释放。
itmed_wait:等待所有分组死掉。
closing:两边同时尝试关闭。
time_wait:另一边已初始化一个释放。
last_ack:等待所有分组死掉。
很多时候我们需要查看系统的路由表,这时可以通过命令来查看,下面介绍在linux下查看路由的方法。当然,我们也可以通过查看路由表来确定机器的网关,方法有两种:route-n和netstat-rn,两个命令得到的结果是一样的,如下所示:
netstat–rn
kernel ip routing table
destination gateway genmask flags metric ref use iface
203.93.236.148 0.0.0.0 255.255.255.255 uh 0 0 0 lo
203.93.236.128 0.0.0.0 255.255.255.192 u 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 u 0 0 0 eth0
0.0.0.0 203.93.236.129 0.0.0.0 ug 0 0 0 eth0
所显示的内容中有“ug”的这行即系统的默认网关。
另外在工作中还会经常用到的一种方法,即用traceroute来随意跟踪一个网络地址(如下所示),其中第一条地址即我们机器的网关。
traceroute www.163.com
显示结果如下所示:
traceroute to www.163.com (210.51.213.180), 30 hops max, 40 byte packets
1 203.93.236.129 (203.93.236.129) 0.861 ms 0.840 ms 0.825 ms
2 210.5.142.225 (210.5.142.225) 0.789 ms 0.779 ms 0.759 ms
3 218.106.127.82 (218.106.127.82) 1.478 ms 1.468 ms 1.456 ms
4 218.104.110.82 (218.104.110.82) 1.427 ms 1.429 ms 1.651 ms
5 220.249.83.130 (220.249.83.130) 1.639 ms 2.114 ms 2.349 ms
6 210.51.213.180 (210.51.213.180) 1.585 ms 1.670 ms 1.432 ms
很多时候,我们需要追踪网络数据包的路径,这个时候该用什么命令呢?其实可以用traceroute来轻松解决这个问题。traceroute命令的功能是追踪网络数据包的路由途径,数据包默认的大小为40b。跟踪到目的地需要经过几个路由器,所以,简单来说,这个命令就是用来进行路由跟踪的。命令的用法如下所示:
1 203.93.236.129 (203.93.236.129) 0.861 ms 0.840 ms 0.825 ms
2 210.5.142.225 (210.5.142.225) 0.789 ms 0.779 ms 0.759 ms
以上命令显示我们的机器到达www.163.com的数据包之间的完整路由,1表示离我们最近的路由器的ip地址,其他以此类推。
4.nslookup
nslookup命令的功能是查询一台机器的ip地址及其对应的域名。通常需要一台域名服务器来提供域名服务,如果用户已经设置好域名服务器,就可以用这个命令来查看不同主机的ip地址所对应的域名。
它的用法也很简单,其使用方法及步骤如下:
nslookup
mail.163.com
server: 218.104.111.114
address: 218.104.111.114#53
non-authoritative answer:
mail.163.com canonical name = mcache.mail.163.com.
mcache.mail.163.com canonical name = email.163.com.lxdns.com.
email.163.com.lxdns.com canonical name = 163.xxcache.z.lxdns.com.
163.xxcache.z.lxdns.com canonical name = 06811.xdwscache.glb0.lxdns.com.
name: 06811.xdwscache.glb0.lxdns.com
address: 210.51.213.180
exit
5.dig
如果大家不喜欢nslookup命令的这种交互式用法,我们可以用dig命令来查看,值得一说的是,dig只存在于linux及freebsd等开源系统中。
dig最基本的用法即查询域名的a记录,命令如下所示:
dig sina.com.cn
; <<>> dig 9.3.6-p1-redhat-9.3.6-20.p1.el5 <<>> sina.com.cn
;; global options: printcmd
;; got answer:
;; ->>header<<- opcode: query, status: noerror, id: 20674
;; flags: qr rd ra; query: 1, answer: 1, authority: 4, additional: 4
;; question section:
;sina.com.cn. in a
;; answer section:
sina.com.cn. 12 in a 202.108.33.60
;; authority section:
sina.com.cn.62215innsns1.sina.com.cn.
sina.com.cn.62215innsns3.sina.com.cn.
sina.com.cn.62215innsns4.sina.com.cn.
sina.com.cn.62215innsns2.sina.com.cn.
;; additional section:
ns1.sina.com.cn. 66412ina202.106.184.166
ns2.sina.com.cn. 79225ina61.172.201.254
ns3.sina.com.cn. 68833ina123.125.29.99
ns4.sina.com.cn. 70070ina121.14.1.22
;; query time: 3 msec
;; server: 210.52.207.2#53(210.52.207.2)
;; when: wed mar 5 21:41:24 2014
;; msg size rcvd: 181
查询域sina.com.cn的ns记录,命令如下所示:
dig sina.com.cn ns
; <<>> dig 9.3.6-p1-redhat-9.3.6-20.p1.el5 <<>> sina.com.cn ns
;; ->>header<<- opcode: query, status: noerror, id: 15529
;; flags: qr rd ra; query: 1, answer: 4, authority: 0, additional: 4
;sina.com.cn.inns
sina.com.cn.63151innsns3.sina.com.cn.
sina.com.cn.63151innsns2.sina.com.cn.
sina.com.cn.63151innsns1.sina.com.cn.
sina.com.cn.63151innsns4.sina.com.cn.
ns1.sina.com.cn. 66269ina202.106.184.166
ns2.sina.com.cn. 79082ina61.172.201.254
ns3.sina.com.cn. 68690ina123.125.29.99
ns4.sina.com.cn. 69927ina121.14.1.22
;; query time: 4 msec
;; when: wed mar 5 21:43:46 2014
;; msg size rcvd: 165
我们还可以在特定的dns服务器查询sina.com.cn,格式如下所示:
dig @210.51.176.71 sina.com.cn
; <<>> dig 9.3.6-p1-redhat-9.3.6-20.p1.el5 <<>> @210.51.176.71 sina.com.cn
; (1 server found)
;; ->>header<<- opcode: query, status: noerror, id: 50336
;sina.com.cn.ina
sina.com.cn.24ina202.108.33.60
sina.com.cn.62751innsns2.sina.com.cn.
sina.com.cn.62751innsns3.sina.com.cn.
sina.com.cn.62751innsns1.sina.com.cn.
sina.com.cn.62751innsns4.sina.com.cn.
ns1.sina.com.cn. 65870ina202.106.184.166
ns2.sina.com.cn. 78683ina61.172.201.254
ns3.sina.com.cn. 68291ina123.125.29.99
ns4.sina.com.cn. 69528ina121.14.1.22
;; server: 210.51.176.71#53(210.51.176.71)
;; when: wed mar 5 21:50:27 2014
从根服务器开始追踪一个域名的解析过程,可以用如下命令:
dig www.163.com +trace
; <<>> dig 9.3.6-p1-redhat-9.3.6-4.p1.el5_4.2 <<>> www.163.com +trace
.518380 in ns l.root-servers.net.
.518380innsa.root-servers.net.
.518380innsg.root-servers.net.
.518380innse.root-servers.net.
.518380innsc.root-servers.net.
.518380innsb.root-servers.net.
.518380innsi.root-servers.net.
.518380innsd.root-servers.net.
.518380innsh.root-servers.net.
.518380innsm.root-servers.net.
.518380innsf.root-servers.net.
.518380innsk.root-servers.net.
.518380innsj.root-servers.net.
;; received 500 bytes from 218.104.111.114#53(218.104.111.114) in 2 ms
com.172800innsm.gtld-servers.net.
com.172800innsd.gtld-servers.net.
com.172800innsi.gtld-servers.net.
com.172800innse.gtld-servers.net.
com.172800innsl.gtld-servers.net.
com.172800innsc.gtld-servers.net.
com.172800innsh.gtld-servers.net.
com.172800innsj.gtld-servers.net.
com.172800innsf.gtld-servers.net.
com.172800innsk.gtld-servers.net.
com.172800innsg.gtld-servers.net.
com.172800innsa.gtld-servers.net.
com.172800innsb.gtld-servers.net.
;; received 501 bytes from 198.41.0.4#53(a.root-servers.net) in 256 ms
163.com. 172800innsns2.nease.net.
163.com. 172800innsns3.nease.net.
163.com. 172800innsns4.nease.net.
;; received 140 bytes from 192.55.83.30#53(m.gtld-servers.net) in 56 ms
www.163.com.600incname
www.cache.wangsu.netease.com.
www.cache.wangsu.netease.com. 600 incnamewww.163.com.lxdns.com.
;; received 100 bytes from 114.113.197.12#53(ns2.nease.net) in 49 ms
6.finger
finger命令的功能是查询用户的信息,通常会显示系统中某个用户的用户名、主目录、停滞时间、登录时间、登录shell等信息。w的命令效果与其类似。命令如下所示:
finger
login name tty idle login time office office phone host
root root pts/0 mar 5 16:26 (192.168.1.99)
root root pts/1 24 mar 5 19:32 (192.168.1.99)
7.lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在unix环境下,任何事物都是以文件的形式存在的,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以像传输控制协议(tcp)和用户数据报协议(udp)套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符都会为应用程序与基础操作系统之间的交互提供通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序的信息,因此通过lsof工具查看这个列表对系统监测,以及排错非常有帮助。顺便提一下,这工具首先出现在unix系统中,后才移植到linux平台下。工作中用得最多的是-i参数,可以用它来查看特定端口的情况,比如,我可以用lsof-i:22查看22端口是由哪些程序占用的,命令显示结果如下所示:
command pid user fd type device size/off node name
sshd 2343 root 3u ipv4 7374 0t0 tcp *:ssh (listen)
sshd 3336 root 3u ipv4 9880 0t0 tcp localhost:ssh->localhost:50416 (established)
sshd 4372 root 3u ipv4 12583 0t0 tcp localhost:ssh->localhost:61070 (established)
8.sockstat
在freebsd 8.1中,我们可以使用sockstat查看打开的socket的情况,包括端口相应进程的进程名、pid、用户等,用得最多的是sockstat -4l,这是非常实用的一个命令。
注意 说明一下,此命令只能用于freebsd、openbsd系统中,centos 5.8中无此命令。
linux服务器正常启动后,提供服务时会调用程序,占用进程,这时候如何查看系统中有哪些进程在被调用呢?我们可以通过以下命令来查看。
1.ps
ps命令是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和它所运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等。总之大部分信息都可以通过执行该命令得到。ps命令最常用的还是监控后台进程的工作情况,因为后台进程是不和屏幕、键盘这些标准输入/输出设备进行通信的,所以如果需要检测后台情况,就需要使用ps命令了。它的格式如下所示:
格式:ps[选项]
其主要选项如下所示。
-a:显示系统中所有进程的信息。
-e:显示所有进程的信息。
-f:显示进程的所有信息。
-l:以长格式显示进程信息。
-r:只显示正在运行的进程。
-u:显示面向用户的格式(包括用户名、cpu及内存的使用情况等信息)。
-x:显示所有非控制终端上的进程信息。
-p:显示由进程id指定的进程信息。
-t:显示指定终端上的进程信息。
对进程进行监测和控制,首先要了解当前进程的情况,当然也就需要查看当前进程的状态了。通过ps命令查看进程,根据所显示的信息可以了解哪个进程正在运行、哪个进程被挂起、进程已运行了多久、进程正在使用的资源、进程的相对优先级,以及进程的标志号(pid)。所有这些信息对用户都很有用,对于系统管理员来说尤为重要。使用“ps aux”命令可以获得终端上所有用户的有关进程的所有信息,这个也是我们平时用得最多的命令之一,命令如下所示:
ps axu
user pid %cpu %mem vsz rss tty stat start time command
root 1 0.0 0.0 10348 688 ? ss mar16 0:01 init [5]
root 2 0.0 0.0 0 0 ? s< mar16 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? sn mar16 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? s< mar16 0:00 [watchdog/0]
root 5 0.0 0.0 0 0 ? s< mar16 0:00 [migration/1]
root 6 0.0 0.0 0 0 ? sn mar16 0:00 [ksoftirqd/1]
root 7 0.0 0.0 0 0 ? s< mar16 0:00 [watchdog/1]
root 8 0.0 0.0 0 0 ? s< mar16 0:00 [migration/2]
root 9 0.0 0.0 0 0 ? sn mar16 0:00 [ksoftirqd/2]
root 10 0.0 0.0 0 0 ? s< mar16 0:00 [watchdog/2]
root 11 0.0 0.0 0 0 ? s< mar16 0:00 [migration/3]
root 12 0.0 0.0 0 0 ? sn mar16 0:00 [ksoftirqd/3]
root 13 0.0 0.0 0 0 ? s< mar16 0:00 [watchdog/3]
root 14 0.0 0.0 0 0 ? s< mar16 0:00 [events/0]
root 15 0.0 0.0 0 0 ? s< mar16 0:00 [events/1]
root 16 0.0 0.0 0 0 ? s< mar16 0:00 [events/2]
root 17 0.0 0.0 0 0 ? s< mar16 0:00 [events/3]
root 18 0.0 0.0 0 0 ? s< mar16 0:00 [khelper]
root 59 0.0 0.0 0 0 ? s< mar16 0:00 [kthread]
root 66 0.0 0.0 0 0 ? s< mar16 0:00 [kblockd/0]
root 67 0.0 0.0 0 0 ? s< mar16 0:00 [kblockd/1]
root 68 0.0 0.0 0 0 ? s< mar16 0:00 [kblockd/2]
root 69 0.0 0.0 0 0 ? s< mar16 0:00 [kblockd/3]
root 70 0.0 0.0 0 0 ? s< mar16 0:00 [kacpid]
root 168 0.0 0.0 0 0 ? s< mar16 0:00 [cqueue/0]
root 169 0.0 0.0 0 0 ? s< mar16 0:00 [cqueue/1]
root 170 0.0 0.0 0 0 ? s< mar16 0:00 [cqueue/2]
root 171 0.0 0.0 0 0 ? s< mar16 0:00 [cqueue/3]
root 174 0.0 0.0 0 0 ? s< mar16 0:00 [khubd]
root 176 0.0 0.0 0 0 ? s< mar16 0:00 [kseriod]
root 263 0.0 0.0 0 0 ? s mar16 0:00 [khungtaskd]
root 266 0.0 0.0 0 0 ? s< mar16 0:00 [kswapd0]
root 267 0.0 0.0 0 0 ? s< mar16 0:00 [aio/0]
root 268 0.0 0.0 0 0 ? s< mar16 0:00 [aio/1]
root 269 0.0 0.0 0 0 ? s< mar16 0:00 [aio/2]
root 270 0.0 0.0 0 0 ? s< mar16 0:00 [aio/3]
root 421 0.0 0.0 0 0 ? s< mar16 0:00 [kpsmoused]
root 473 0.0 0.0 0 0 ? s< mar16 0:00 [scsi_eh_0]
root 484 0.0 0.0 0 0 ? s< mar16 1:43 [ata/0]
root 485 0.0 0.0 0 0 ? s< mar16 0:53 [ata/1]
root 486 0.0 0.0 0 0 ? s< mar16 2:36 [ata/2]
root 487 0.0 0.0 0 0 ? s< mar16 0:26 [ata/3]
root 488 0.0 0.0 0 0 ? s< mar16 0:00 [ata_aux]
root 509 0.0 0.0 0 0 ? s< mar16 0:00 [kstriped]
root 530 0.0 0.0 0 0 ? s< mar16 0:11 [kjournald]
root 556 0.0 0.0 0 0 ? s< mar16 0:01 [kauditd]
root 589 0.0 0.0 13028 1204 ? s
root 1157 0.0 0.0 0 0 ? s< mar16 0:00 [kedac]
root 1179 0.0 0.0 0 0 ? s< mar16 8:50 [scsi_eh_1]
root 1180 0.0 0.0 0 0 ? s< mar16 0:00 [scsi_eh_2]
root 2013 0.0 0.0 0 0 ? s< mar16 0:00 [kmpathd/0]
root 2014 0.0 0.0 0 0 ? s< mar16 0:00 [kmpathd/1]
root 2016 0.0 0.0 0 0 ? s< mar16 0:00 [kmpathd/2]
root 2017 0.0 0.0 0 0 ? s< mar16 0:00 [kmpathd/3]
root 2018 0.0 0.0 0 0 ? s< mar16 0:00 [kmpath_handlerd]
root 2130 0.0 0.0 0 0 ? s< mar16 0:01 [kjournald]
root 2132 0.0 0.0 0 0 ? s< mar16 0:00 [kjournald]
root 2517 0.0 0.0 92860 868 ? s
root 2519 0.0 0.0 81800 788 ? s
root 2541 0.0 0.0 5908 624 ? ss mar16 0:03 syslogd -m 0
root 2544 0.0 0.0 3804 432 ? ss mar16 0:00 klogd -x
root 2626 0.0 0.0 10760 372 ? ss mar16 0:03 irqbalance
rpc 2637 0.0 0.0 8052 600 ? ss mar16 0:00 portmap
root 2666 0.0 0.0 0 0 ? s< mar16 0:00 [rpciod/0]
root 2667 0.0 0.0 0 0 ? s< mar16 0:00 [rpciod/1]
root 2668 0.0 0.0 0 0 ? s< mar16 0:00 [rpciod/2]
root 2669 0.0 0.0 0 0 ? s< mar16 0:00 [rpciod/3]
root 2678 0.0 0.0 10160 800 ? ss mar16 0:00 rpc.statd
root 2702 0.0 0.0 55180 772 ? ss mar16 0:00 rpc.idmapd
dbus 2717 0.0 0.0 213561032 ? ss mar16 0:04 dbus-daemon --system
root 2726 0.0 0.0 10432 784 ? ss mar16 0:00 /usr/sbin/hcid
root 2732 0.0 0.0 5936 540 ? ss mar16 0:00 /usr/sbin/sdpd
root 2761 0.0 0.0 0 0 ? s< mar16 0:00 [krfcommd]
root 2799 0.0 0.0 31416 1384 ? ssl mar16 0:00 pcscd
root 2809 0.0 0.0 3800 568 ? ss mar16 0:00 /usr/sbin/acpid
68 2818 0.0 0.1 31360 4304 ? ss mar16 0:01 hald
root 2819 0.0 0.0 21692 1076 ? s mar16 0:00 hald-runner
68 2827 0.0 0.0 12324 856 ? s mar16 0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.s
68 2841 0.0 0.0 12324 856 ? s mar16 0:00 hald-addon-keyboard: listening on /dev/input/event0
68 2848 0.0 0.0 12324 848 ? s mar16 0:00 hald-addon-keyboard: listening on /dev/input/event5
root 2852 0.0 0.0 10228 688 ? s mar16 8:15 hald-addon-storage: polling /dev/scd0
root 2854 0.0 0.0 10228 688 ? s mar16 6:06 hald-addon-storage: polling /dev/sdb
root 2876 0.0 0.0 8516 488 ? ss mar16 0:00 /usr/bin/hidd --server
root 2899 0.0 0.0 121988 1532 ? ssl mar16 0:03 automount
root 2916 0.0 0.026324 528 ? ss mar16 0:00 ./hpiod
root 2921 0.0 0.1 159340 6768 ? s mar16 0:00 python ./hpssd.py
root 2934 0.0 0.062608 1216 ? ss mar16 0:01 /usr/sbin/sshd
root 2943 0.0 0.0 133528 2720 ? ss mar16 0:00 cupsd
root 2960 0.0 0.065920 1312 ? s mar16 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid
mysql 3015 0.0 0.5 149616 23832 ? sl mar16 0:28 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --use
root 3048 0.0 0.071100 2344 ? ss mar16 0:00 sendmail: accepting connections
smmsp 3056 0.0 0.0 57688 1768 ? ss mar16 0:00 sendmail: queue runner@01:00:00 for /var/spool/clientmqueue
root 3066 0.0 0.0 6452 364 ? ss mar16 0:00 gpm -m /dev/input/mice -t exps2
root 3075 0.0 0.074800 1164 ? ss mar16 0:00 crond
xfs 3108 0.0 0.021072 1856 ? ss mar16 0:00 xfs -droppriv -daemon
root 3125 0.0 0.018732 452 ? ss mar16 0:00 /usr/sbin/atd
avahi 3152 0.0 0.023268 1292 ? ss mar16 0:00 avahi-daemon: running [localhost-3.local]
avahi 3153 0.0 0.023148 336 ? ss mar16 0:00 avahi-daemon: chroot helper
root 3214 0.0 0.018416 476 ? s mar16 0:00 /usr/sbin/smartd -q never
root 3219 0.0 0.0 3792 488 tty1 ss+ mar16 0:00 /sbin/mingetty tty1
root 3220 0.0 0.0 3792 484 tty2 ss+ mar16 0:00 /sbin/mingetty tty2
root 3221 0.0 0.0 3792 488 tty3 ss+ mar16 0:00 /sbin/mingetty tty3
root 3222 0.0 0.0 3792 488 tty4 ss+ mar16 0:00 /sbin/mingetty tty4
root 3224 0.0 0.0 3792 488 tty5 ss+ mar16 0:00 /sbin/mingetty tty5
root 3226 0.0 0.0 3792 488 tty6 ss+ mar16 0:00 /sbin/mingetty tty6
root 3233 0.0 0.0 169912 2756 ? ss mar16 0:00 /usr/sbin/gdm-binary -nodaemon
root 3322 0.0 0.0 197124 2564 ? s mar16 0:00 /usr/sbin/gdm-binary -nodaemon
root 3324 0.0 0.1 189808 4112 ? sl mar16 0:00
/usr/libexec/gdm-rh-security-token-helper
root 3325 0.0 0.1 90548 6264 tty7 ss+ mar16 0:02 /usr/bin/xorg :0 -br -audit 0 -auth /var/gdm/:0.xauth -noli
root 3339 0.0 0.4 257920 16784 ? sn mar16 0:20 /usr/bin/python -tt /usr/
sbin/yum-updatesd
root 3341 0.0 0.0 12916 1188 ? sn mar16 0:00 /usr/libexec/gam_server
gdm 3351 0.0 0.8 379612 36176 ? ss mar16 0:00 /usr/libexec/gdmgreeter
root 4342 0.0 0.0 41096 896 ? ss mar16 0:00 nginx: master process /usr/local/webserver/nginx/sbin/nginx
www 4343 0.0 0.6 65920 26232 ? s mar16 0:05 nginx: worker process
www 4344 0.0 0.6 65920 26160 ? s mar16 0:02 nginx: worker process
www 4345 0.0 0.6 66076 26460 ? s mar16 0:03 nginx: worker process
www 4346 0.0 0.6 65920 26104 ? s mar16 0:03 nginx: worker process
www 4347 0.0 0.6 66052 26228 ? s mar16 0:04 nginx: worker process
www 4348 0.0 0.6 66012 26372 ? s mar16 0:04 nginx: worker process
www 4349 0.0 0.6 65788 26076 ? s mar16 0:03 nginx: worker process
www 4350 0.0 0.6 65920 26188 ? s mar16 0:06 nginx: worker process
root 5314 0.0 0.0 0 0 ? s mar28 0:00 [pdflush]
root 5315 0.0 0.0 0 0 ? s mar28 0:00 [pdflush]
root 6767 0.0 0.0 68284 1564 tty8 ss+ mar17 0:00 /bin/bash
root 10369 0.0 0.0 65556 932 pts/2 r+ 14:23 0:00 ps -axu
贾洋洋
root 18906 0.0 6.4 1443024 261272 ? sl 00:15 0:46 /usr/local/jdk/bin/java
-djava.util.logging.config.file=/us
root 20573 0.0 0.0 90140 3344 ? ss 09:02 0:00 sshd: root@pts/2
root 20575 0.0 0.0 68412 1756 pts/2 ss 09:02 0:00 -bash
user:表示启动进程用户。
pid:表示进程标志号。
%cpu:表示运行该进程占用cpu的时间与该进程总的运行时间之比例。
%mem:表示该进程占用内存和总内存的比例。
vsz:表示占用的虚拟内存大小,以kb为单位。
rss:表示进程占用的物理内存值,以kb为单位。
tty:表示该进程建立时所对应的终端,“?”表示该进程不占用终端。
stat:表示进程的运行状态,包括以下几种代码:d,不可中断的睡眠;r,就绪(在可运行队列中);s,睡眠;t,被跟踪或停止;z,终止(僵死)的进程,这些进程不存在,但暂时无法消除;w,没有足够的内存分页可分配;<,高优先序的进程;n,低优先序的进程;l,有内存分页分配并锁在内存体内(实时系统或i/o)。
start:为进程开始时间。
time:为执行的时间。
command:是对应的命令名。
由于ps执行后结果太多了,所以我们一般会带上grep参数来精确定位需要的进程号。例如,要查看nginx占用的进程,可以用如下命令:
ps axu | grep -v grep | grep nginx
2.top
动态显示服务器的进程信息。top命令和ps命令的基本作用是相同的,都显示系统当前进程的状况。但是top是一个动态显示过程,即用户可以通过按键来不断刷新当前状态。此命令的使用举例如下所示。
top - 22:26:54 up 5 days, 22:39, 4 users, load average: 0.69, 0.57, 0.44t
tasks: 162 total, 1 running, 160 sleeping, 0 stopped, 1 zombie
cpu(s): 1.0%us, 0.3%sy, 0.0%ni, 85.9%id, 0.0%wa, 0.3%hi, 12.5%si, 0.0%st
mem: 8166152k total, 4328628k used, 3837524k free, 245328k buffers
swap: 10482404k total, 0k used, 10482404k free, 2689332k cached
pid user pr ni virt res shr s %cpu %mem time+ command
16646 glenx 17 0 2643m 1.0g 11m s 7.0 12.7 19:54.24 java
20610 root 15 0 12740 1124 808 r 0.3 0.0 0:00.08 top
1 root 15 0 10348 636 540 s 0.0 0.0 0:00.59 init
2 root rt -5 0 0 0 s 0.0 0.0 0:00.00 migration/0
3 root 34 19 0 0 0 s 0.0 0.0 0:00.01 ksoftirqd/0
4 root rt -5 0 0 0 s 0.0 0.0 0:00.00 watchdog/0
5 root rt -5 0 0 0 s 0.0 0.0 0:00.00 migration/1
6 root 34 19 0 0 0 s 0.0 0.0 0:00.00 ksoftirqd/1
7 root rt -5 0 0 0 s 0.0 0.0 0:00.00 watchdog/1
8 root rt -5 0 0 0 s 0.0 0.0 0:00.00 migration/2
9 root 34 19 0 0 0 s 0.0 0.0 0:00.00 ksoftirqd/2
10 root rt -5 0 0 0 s 0.0 0.0 0:00.00 watchdog/2
11 root rt -5 0 0 0 s 0.0 0.0 0:00.00 migration/3
12 root 34 19 0 0 0 s 0.0 0.0 0:00.00 ksoftirqd/3
13 root rt -5 0 0 0 s 0.0 0.0 0:00.00 watchdog/3
14 root 10 -5 0 0 0 s 0.0 0.0 0:00.00 events/0
15 root 10 -5 0 0 0 s 0.0 0.0 0:00.00 events/1
16 root 10 -5 0 0 0 s 0.0 0.0 0:00.00 events/2
17 root 10 -5 0 0 0 s 0.0 0.0 0:00.00 events/3
第一行内容依次表示当前时间、系统启动的时间、当前系统登录的用户数、平均负载。第二行依次显示的是所有启动的、目前运行的、挂起(sleeping)的和无用(zombie)的进程。第三行显示的是目前cpu的使用情况,包括系统占用的比例、用户使用比例、闲置(idle)比例。第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。第五行显示交换分区的使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的交换分区。第六行显示的内容最多,下面分别进行详细解释。
pid(process id):进程标志号,是非零正整数。
user:进程所有者的用户名。
pr:进程的优先级别。
ni:进程的优先级别数值。
virt:进程占用的虚拟内存值。
res:进程占用的物理内存值。
shr:进程使用的共享内存值。
stat:进程的状态,其中s表示休眠,r表示正在运行,z表示僵死状态,n表示该进程优先值是负数。
%cpu:该进程占用的cpu使用率。
%mem:该进程占用的物理内存和总内存的百分比。
time:该进程启动后占用的总cpu时间。
command:进程启动的启动命令名称,如果这一行显示不下,在进程中会有一个完整的命令行。
在使用top命令的过程中,还可以通过一些交互命令来完成其他参数的功能。这些命令是通过快捷键启动的,格式如下所示。
<空格>:立刻刷新
其主要参数如下所示。
p:根据cpu使用的多少进行排序。
t:根据时间、累计时间排序。
q:退出top命令。
m:切换显示内存信息。
t:切换显示进程和cpu状态信息。
c:切换显示命令名称和完整命令行。
m:根据使用内存的大小进行排序。
w:将当前设置写入~/.toprc文件中,这是写top配置文件的推荐方法。
3.pgrep命令
pgrep命令的作用是查找当前运行的进程,并列出匹配给定条件进程的pid。所有的条件都必须匹配才会被列出。使用权限为所有用户。
以下是我在一台freebsd 8.1 x86_64的机器上以用户名andrewyu查看nginx的所有进程号,命令如下所示:
pgrep nginx
2834
2833
2832
2831
2830
2828
2827
2826
2825
4.kill命令
kill命令的作用是终止一个进程。其格式为:
kill [-s signal |-p] [-a] pid…
kill -l [ signal ]
它的主要参数如下所示。
-s:指定发送的信号。
-p:模拟发送信号。
-l:指定信号的名称列表。
pid:要终止的进程的id号。
signal:表示信号。
kill命令可将指定的信息送至程序中。预设的信息为sigterm(15),可将指定程序终止。若仍无法终止该程序,则可以使用sigkill(9)信息尝试强制删除程序。kill命令的工作原理是,向linux系统的内核发送一个系统操作信号和某个程序的进程标志号,然后系统内核就可以对进程标志号指定的进程进行操作了。当需要中断一个前台进程的时候,通常使用ctrl+c组合键;但是对于一个后台进程来说,就不是一个组合键所能解决的了,这时就必须使用kill命令。另外,kill-9可以强制杀掉进程,尤其适用于僵尸进程。
5.killall
killall命令的作用是通过程序的名字,直接杀死所有进程,这里简单介绍一下。
若想杀掉nginx的所有进程,用kill命令就要执行9次,但如果用killall nginx则能很轻松地一次性解决问题。
在linux系统下,最强大的进程管理命令莫过于ps和top了,我们应该掌握它们详细语法,在工作中灵活地使用它们。
目前公司所用的服务器系统种类繁多,有freebsd 8.1 x86_64、windows server 2003 x86_64和centos 5.8 x86_64等,并且所规划的网段也不少,比如192.168.4.0、192.168.10.0、192.168.20.0、192.168.21.0,还有10.1.0.0等,其中192.168.4.0属于办公网络;192.168.20.0和192.168.21.0属于开发环境,192.168.10.0和10.1.0.0属于线上环境(对外提供服务)。另外,公司的路由器及防火墙都做了严格控制(基于安全方面的原因不能随便更改其rule规则),为了服务器与服务器之间能互访,这时需要手动在服务器或客户机上添加路由。本节将简单归纳一下添加路由的方法,希望对大家的工作有所帮助。
先简要说一下最简单的windows server 2003及windows pc端下静态路由配置,命令如下所示:
route add 192.168.4.0 mask 255.255.255.0 192.168.4.2
route add是windows下route添加网段的特定语法(注意,非route add-net),192.168.4.0是需要路由的网段,mask后面是此网段的子网掩码,192.168.4.2是下一条地址,这里要注意用route操作时跟在centos 5.8和freebsd 8.1环境下的区别,否则很容易混淆。
如果要永久添加路由该怎么做呢?
route命令可以在windows系统中手工配置静态路由,但是重启之后路由便丢失了,还要重新增加,那么如何让路由一直保持,重启后仍然存在呢?其实很简单,在增加路由的命令后加上-p开关就可以了。例如:
route -p add 10.10.0.0 mask 255.255.0.0 192.168.4.222
参数说明:-p与add命令共同使用时,可指定路由被添加到注册表中,并在启动tcp/ip协议的时候初始化ip路由表。默认情况下,启动tcp/ip协议时不会保存添加的路由。-p在与print命令一起使用时,则会显示永久路由列表。所有其他的命令都忽略此参数。永久路由存储在注册表中的完整路径如下所示(见图1-2):
注意图1-3中“persistent routes”下面的内容,它表示无论重启或关机,此条静态路由在我们的机器上是永久生效的。
下面再介绍一下centos 5.8中比较常见的永久添加静态路由的方法。手动添加路由的方式如下所示:
route add -net 172.16.6.0 netmask 255.255.255.0 gw 172.16.2.25
其中,route add-net是centos 5.8下添加静态路由网络的方式,netmask是网络段的子网掩码,gw表示下一条地址,其实就是指172.16.6.0此网段的路由通过172.16.2.25出去,这只是临时的效果,如果服务器重启则失效,如何能让其永久生效呢?可以将其写进文件中,过程如下所示:
vim /etc/sysconifg/network-scripts/route-eth0
127.16.6.0/24 via 172.16.2.25
写进文件后,服务器重启也不需要担心了,它会一直生效。
在freebsd 8.1中添加路由并不常见,相对于上面两种服务器而言算很少了,而且有时还很容易混淆。如果要添加一条网段为172.16.6.0,下一条地址为172.16.2.25的路由,即:
route add -net 172.16.0.0/24 172.16.2.25
如果要在freebsd 8.1中添加永久的路由,其实也很简单,即在/etc/rc.conf的最后添加相应的命令,如下命令行可以为你的freebsd 8机器添加4条永久静态路由。
static_routes="net1 net2 net3 net4"
route_net1="-net 192.168.4.0/24 192.168.21.3"
route_net2="-net 192.168.10.0/24 192.168.21.3"
route_net3="-net 192.168.20.0/24 192.168.21.3"
route_net4="-net 10.1.0.0/16 192.168.21.3"
本节主要介绍如何通过命令配置和监控linux服务器的网络设置及进程状态等,由于网络对于linux服务器来说意义重大,所以这一节的内容相对比较重要,建议大家熟练掌握本节内容。