SI模型的七层结构

1 物理层 :二进制传输;为启动,维护以及关闭物理链路定义了电气规范,机械规范,过程规范和功能规范。 2 数据链路层:访问介质;定义如何格式化数据以便进行传输以及如何控制对网络的访问 ;支持错误检测 3 网络层 :数据传输;路由数据包 ; 选择传递数据的最佳路径 ; 支持逻辑寻址和路径选择 4 传输层 :端到端链接;传输问题 ; 确保数据传输的可靠性 ; 建立,维护和终止虚拟电路 ; 通过错误检测和恢复 ; 信息流控制来保障可靠性 5 会话层 : 端链接;主机间通信 ; 建立,管理和终止在应用程序之间的会话 6 表示层 : 数据显示 ;数据表示 ; 确保接收系统可以读出该数据 ; 格式化数据 ; 构建数据 ; 协商用于应用层的数据传输语法 ; 提供加密 7 应用层 : 网络进程访问应用层 ;为应用程序进程(例如,电子邮件,文件传输和终端仿真)提供网络服务 ; 提供用户身份验证 TCP 包头:

TCP包头 源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0 开始 确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节

TCP 三次握手:

TCP 四次挥手:

TCP 协议中的三次握手和四次挥手

ARP 表 [root@magedu ~]#ip neigh 192.168.1.110 dev eth0 lladdr 60:02:b4:e3:8a:c0 STALE 192.168.1.156 dev eth0 lladdr 50:01:d9:8a:1d:3f STALE 192.168.1.114 dev eth0 lladdr 40:8d:5c:e1:97:34 STALE 192.168.1.118 dev eth0 lladdr 94:65:2d:38:44:82 STALE [root@magedu ~]#arp -n Address HWtype HWaddress Flags Mask Iface 192.168.1.110 ether 60:02:b4:e3:8a:c0 C eth0 192.168.1.156 ether 50:01:d9:8a:1d:3f C eth0 192.168.1.114 ether 40:8d:5c:e1:97:34 C eth0 192.168.1.118 ether 94:65:2d:38:44:82 C eth0

IP PDU 报头

IP PDU 报头 版本:占4位,指 IP 协议的版本目前的IP协议版本号为4 首部长度:占4位,可表示的最大数值是15个单位,一个单位为4字节,因此IP 的首部长度的最大值是60字节 区分服务:占8位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过.后改名为区分服务.只有在使用区分服务(DiffServ)时,这个字段才起作用.一般的情况下不使用 总长度:占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节.总长度必须不超过最大传送单元 MTU 标识:占16位,它是一个计数器,通常,每发送一个报文,该值会加1, 也用于数据包分片,在同一个包的若干分片中,该值是相同的 标志(flag):占3位,目前只有后两位有意义 DF: Don’t Fragment 中间的一位,只有当 DF=0 时才允许分片 MF: More Fragment 最后一位,MF=1表示后面还有分片,MF=0 表示最后一个分片

IP PDU 报头示例 片偏移以8个字节为偏移单位,假定MTU=1500 三个包标识 ID都相同,三个包DF都为0,前两个MF=1,最后一个MF=0

IP地址 它们可唯一标识 IP 网络中的每台设备 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址 IP地址由两部分组成 •网络ID: •标识网络 •每个网段分配一个网络ID •主机 ID: •标识单个主机 •由组织分配给各设备

IPv4地址格式:点分十进制记法

IP地址分类

IP地址分类 A类: 0 000 0000 - 0 111 1111: 1-127 网络数:126, 127 每个网络中的主机数:2^24-2 默认子网掩码:255.0.0.0 私网地址:10.0.0.0 B类: 10 00 0000 - 10 11 1111:128-191 网络数:2^14 每个网络中的主机数:2^16-2 默认子网掩码:255.255.0.0 私网地址:172.16.0.0-172.31.0.0 IP地址分类 C类: 110 0 0000 - 110 1 1111: 192-223 网络数:2^21 每个网络中的主机数:2^8-2 默认子网掩码:255.255.255.0 私网地址:192.168.0.0-192.168.255.0 D类:组播 1110 0000 - 1110 1111: 224-239 E类:保留未使用 240-255

公共IP地址

私有IP地址

特殊地址 0.0.0.0 0.0.0.0不是一个真正意义上的IP地址。它表示所有不清楚的主机和目的网络 255.255.255.255 限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机 127.0.0.1~127.255.255.254 本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为“127.0.0.1”的 数据包 224.0.0.0到239.255.255.255 组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器。224.0.0.5指OSPF 路由器,地址多用于一些特定的程序以及多媒体程序 169.254.x.x 如果Windows主机使用了DHCP自动分配IP地址,而又无法从DHCP服务器获取地址,系统会为主机分配这样地址

保留地址

子网掩码

有子网的子网络掩码

子网掩码的八位

可变长度子网掩码

跨网络通信 跨网络通信:路由 路由分类: 主机路由 网络路由 默认路由 优先级:精度越高,优先级越高

基本网络配置 将Linux主机接入到网络,需要配置网络相关设置 一般包括如下内容: 主机名 IP/netmask 路由:默认网关 DNS服务器 主DNS服务器 次DNS服务器 第三DNS服务器

CentOS 6 网卡名称 接口命名方式:CentOS 6 以太网:eth[0,1,2,...] ppp:ppp[0,1,2,...] 网络接口识别并命名相关的udev配置文件: /etc/udev/rules.d/70-persistent-net.rules 查看网卡: dmesg |grep –i eth ethtool -i eth0 卸载网卡驱动: modprobe -r e1000 rmmod e1000 装载网卡驱动: modprobe e1000

网络配置方式 静态指定: ifconfig, route, netstat ip: object {link, addr, route}, ss, tc system-config-network-tui,setup 配置文件 动态分配: DHCP: Dynamic Host Configuration Protocol

配置网络接口 ifconfig命令 ifconfig [interface] ifconfig -a ifconfig IFACE [up|down] ifconfig interface [aftype] options | address ... ifconfig IFACE IP/netmask [up] ifconfig IFACE IP netmask NETMASK 注意:立即生效 启用混杂模式:[-]promisc

route命令 路由管理命令 查看:route -n 添加:route add route add [-net|-host] target [netmask Nm] [gw Gw] [[dev] If] 目标:192.168.1.3 网关:172.16.0.1 route add -host 192.168.1.3 gw 172.16.0.1 dev eth0 目标:192.168.0.0 网关:172.16.0.1 route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 dev eth0 route add -net 192.168.0.0/24 gw 172.16.0.1 dev eth0

route命令 默认路由,网关:172.16.0.1 route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.16.0.1 route add default gw 172.16.0.1 删除:route del route del [-net|-host] target [gw Gw] [netmask Nm] [[dev] If] 目标:192.168.1.3 网关:172.16.0.1 route del -host 192.168.1.3 目标:192.168.0.0 网关:172.16.0.1 route del -net 192.168.0.0 netmask 255.255.255.0

netstat命令 显示网络连接: netstat [--tcp|-t] [--udp|-u] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n] [--extend|-e[--extend|-e]] [--program|-p] -t: tcp协议相关 -u: udp协议相关 -w: raw socket相关 -l: 处于监听状态 -a: 所有状态 -n: 以数字显示IP和端口 -e:扩展格式 -p: 显示相关进程及PID

netstat命令 常用组合: -tan, -uan, -tnl, -unl 显示路由表: netstat {--route|-r} [--numeric|-n] -r: 显示内核路由表 -n: 数字格式 显示接口统计数据: netstat {--interfaces|-I|-i} [iface] [--all|-a] [--extend|-e] [--program|-p] [--numeric|-n] netstat -i netstat –I=IFACE ifconfig -s eth0

ip命令 配置Linux网络属性:ip 命令 ip - show / manipulate routing, devices, policy routing and tunnels ip [ OPTIONS ] OBJECT { COMMAND | help } OBJECT := { link | addr | route } ip link - network device configuration set dev IFACE 可设置属性: up and down:激活或禁用指定接口 ifup/ifdown show [dev IFACE]:指定接口 [up]:仅显示处于激活状态的接口

ip命令 ip addr { add | del } IFADDR dev STRING [label LABEL]:添加地址时指明网卡别名 [scope {global|link|host}]:指明作用域 global: 全局可用 link: 仅链接可用 host: 本机可用 [broadcast ADDRESS]:指明广播地址 ip address show - look at protocol addresses [dev DEVICE] [label PATTERN] [primary and secondary] ip addr flush 使用格式同show ip addr add 172.16.100.100/16 dev eth0 label eth0:0 ip addr del 172.16.100.100/16 dev eth0 label eth0:0 ip addr flush dev eth0 label eth0:0

ip命令 ip route - routing table management 添加路由:ip route add ip route add TARGET via GW dev IFACE src SOURCE_IP TARGET: 主机路由:IP 网络路由:NETWORK/MASK ip route add 192.168.0.0/24 via 172.16.0.1 ip route add 192.168.1.13 via 172.16.0.1 添加网关:ip route add default via GW dev IFACE ip route add default via 172.16.0.1 删除路由:ip route del TARGET 显示路由:ip route show|list 清空路由表:ip route flush [dev IFACE] [via PREFIX] ip route flush dev eth0

ss命令 格式:ss [OPTION]... [FILTER] netstat通过遍历proc来获取socket信息,ss使用netlink与内核tcp_diag模块通信获取socket信息 选项: -t: tcp协议相关 -u: udp协议相关 -w: 裸套接字相关 -x:unix sock相关 -l: listen状态的连接 -a: 所有 -n: 数字格式 -p: 相关的程序及PID -e: 扩展的信息 -m:内存用量 -o:计时器信息

ss命令 FILTER : [ state TCP-STATE ] [ EXPRESSION ] TCP的常见状态: tcp finite state machine: LISTEN: 监听 ESTABLISHED:已建立的连接 FIN_WAIT_1 FIN_WAIT_2 SYN_SENT SYN_RECV CLOSED EXPRESSION: dport = sport = 示例:’( dport = :ssh or sport = :ssh )’ 常用组合: -tan, -tanl, -tanlp, -uan

常见用法 ss -l 显示本地打开的所有端口 ss -pl 显示每个进程具体打开的socket ss -t -a 显示所有tcp socket ss -u -a 显示所有的UDP Socekt ss -o state established '( dport = :ssh or sport = :ssh )' 显示所有已建立的ssh连接 ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接 ss -s 列出当前socket详细信息

网络配置文件 ONBOOT:在系统引导时是否激活此设备 TYPE:接口类型;常见有的Ethernet, Bridge UUID:设备的惟一标识 IPADDR:指明IP地址 NETMASK:子网掩码 GATEWAY: 默认网关 DNS1:第一个DNS服务器指向 DNS2:第二个DNS服务器指向 USERCTL:普通用户是否可控制此设备 PEERDNS:如果BOOTPROTO的值为“dhcp”,YES将允许dhcp server分配的dns服务器信息直接覆盖至/etc/resolv.conf文件,NO不允许修改resolv.conf

网络配置文件 设备配置被保存在文本文件中 •/etc/sysconfig/network-scripts/ifcfg-<name> •帮助文档列出完整选项列表:/usr/share/doc/initcripts-*/sysconfig.txt

主机名和本地解析器 配置当前主机的主机名: hostname [HOSTNAME] /etc/sysconfig/network HOSTNAME= 解析器执行正向和逆向查询 /etc/hosts •本地主机名数据库和IP地址的映像 •对小型独立网络有用 •通常,在使用DNS前检查 •getent hosts 查看/etc/hosts 内容

dns名字解析 /etc/resolv.conf nameserver DNS_SERVER_IP1 nameserver DNS_SERVER_IP2 nameserver DNS_SERVER_IP3 search magedu.com /etc/nsswitch.conf 与/etc/hosts相比优先于DNS 正向解析:FQDN-->IP dig -t A FQDN host -t A FQDN 反向解析:IP-->FQDN dig -x IP host -t PTR IP

网络配置文件 /etc/sysconfig/network-scripts/route-IFACE •注意:需service network restart生效 •两种风格: (1) TARGET via GW 如:10.0.0.0/8 via 172.16.0.1 (2) 每三行定义一条路由 ADDRESS#=TARGET NETMASK#=mask GATEWAY#=GW

网卡别名 对虚拟主机有用 将多个IP地址绑定到一个NIC上 eth0:1 、eth0:2、eth0:3 ifconfig命令: ifconfig eth0:0 192.168.1.100/24 up ifconfig eth0:0 down ip命令: ip addr add 172.16.1.2/16 dev eth0 ip addr add 172.16.1.1/16 dev eth0 label eth0:0 ip addr add 172.16.1.2/16 dev eth0 label eth0:0 ip addr del 172.16.1.1/16 dev eth0 label eth0:0 ip addr flush dev eth0 label eth0:0

设备别名 为每个设备别名生成独立的接口配置文件 •关闭NetworkManager服务 •ifcfg-ethX:xxx •必须使用静态联网 DEVICE=eth0:0 IPADDR=10.10.10.10 NETMASK=255.0.0.0 ONPARENT=yes 注意:service network restart 生效 参考:/usr/share/doc/initscripts-*/sysconfig.txt

网络接口配置-bonding Bonding 将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址

Bonding工作模式 Mode 0 (balance-rr) 轮转(Round-robin)策略:从头到尾顺序的在每一个slave 接口上面发送数据包。本模式提供负载均衡和容错的能力 Mode 1 (active-backup) 活动-备份(主备)策略:只有一个slave被激活,当且仅当活动的slave接口失败时才会激活其他slave.为了避免交换机发生混乱此时绑定的MAC地址只有一个外部端口上可见 Mode 3 (broadcast) 广播策略:在所有的slave接口上传送所有的报文,提供容错能力 active-backup、balance-tlb 和 balance-alb 模式不需要交换机的任何特殊配置。其他绑定模式需要配置交换机以便整合链接。如:Cisco 交换机需要在模式 0、2 和 3 中使用 EtherChannel,但在模式4中需要 LACP和 EtherChannel

Bonding配置 创建bonding设备的配置文件 /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 BOOTPROTO=none BONDING_OPTS= “miimon=100 mode=0” /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none MASTER=bond0 SLAVE=yes USERCTL=no 查看bond0状态:/proc/net/bonding/bond0

Bonding配置 miimon 是用来进行链路监测的。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有一条线路不通就转入另一条线路 删除bond0 ifconfig bond0 down rmmod bonding 详细帮助: /usr/share/doc/kernel-doc- version/Documentation/networking/bonding.txt https://www.kernel.org/doc/Documentation/networking/bonding.txt

采用传统命名方式 使用传统命名方式: (1) 编辑/etc/default/grub配置文件 GRUB_CMDLINE_LINUX="rhgb quiet net.ifnames=0" 或:修改/boot/grub2/grub.cfg (2) 为grub2生成其配置文件 grub2-mkconfig -o /etc/grub2.cfg (3) 重启系统

CentOS 7网络配置工具 CentOS7主机名 配置文件:/etc/hostname ,默认没有此文件,通过DNS反向解析获取主机名,主机名默认为:localhost.localdomain 显示主机名信息 hostname hostnamectl status 设置主机名 hostnamectl set-hostname centos7.magedu.com 删除文件/etc/hostname,恢复主机名localhost.localdomain CentOS 7网络配置工具 图形工具:nm-connection-editor 字符配置tui工具:nmtui 命令行工具:nmcli

nmcli命令 地址配置工具:nmcli nmcli [ OPTIONS ] OBJECT { COMMAND | help } device - show and manage network interfaces nmcli device help connection - start, stop, and manage network connections nmcli connection help 修改IP地址等属性: nmcli connection modify IFACE [+|-]setting.property value setting.property: ipv4.addresses ipv4.gateway ipv4.dns1 ipv4.method manual | auto 修改配置文件执行生效:systemctl restart network nmcli con reload nmcli命令生效: nmcli con down eth0 ;nmcli con up eth0

使用nmcli配置网络

NeworkManager是管理和监控网络设置的守护进程 设备即网络接口,连接是对网络接口的配置,一个网络接口可有多个连接配置,但同时只有一个连接配置生效 显示所有包括不活动连接 nmcli con show 显示所有活动连接 nmcli con show --active 显示网络连接配置 nmcli con show "System eth0“ 显示设备状态 nmcli dev status 使用nmcli配置网络

使用nmcli配置网络 显示网络接口属性 nmcli dev show eth0 创建新连接default,IP自动通过dhcp获取 nmcli con add con-name default type Ethernet ifname eth0 删除连接 nmcli con del default 创建新连接static ,指定静态IP,不自动连接 nmcti con add con-name static ifname eth0 autoconnect no type Ethernet ipv4.addresses 172.25.X.10/24 ipv4.gateway 172.25.X.254

nmcli实现bonding 添加bonding接口 nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup 添加从属接口 nmcli con add type bond-slave ifname ens7 master bond0 nmcli con add type bond-slave ifname ens3 master bond0 注:如无为从属接口提供连接名,则该名称是接口名称加类型构成 要启动绑定,则必须首先启动从属接口 nmcli con up bond-slave-eth0 nmcli con up bond-slave-eth1 启动绑定 nmcli con up mybond0

管理网络组配置文件 /etc/sysconfig/network-scripts/ifcfg-team0 DEVICE=team0 DEVICETYPE=Team TEAM_CONFIG="{"runner": {"name": "broadcast"}}" BOOTPROTO=none IPADDR0=172.16.0.100 PREFIX0=24 NAME=team0 ONBOOT=yes

管理网络组配置文件

/etc/sysconfig/network-scripts/ifcfg-team0-eth1 DEVICE=eth1 DEVICETYPE=TeamPort TEAM_MASTER=team0 NAME=team0-eth1 ONBOOT=yes

删除网络组 nmcli connection down team0 teamdctl team0 state nmcli connection show nmcli connectioni delete team0-eth0 nmcli connectioni delete team0-eth1 nmcli connection show

Ubuntu网络配置 官网文档: https://help.ubuntu.com/lts/serverguide/network-configuration.html.zh-CN 配置自动获取IP cat /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: ens33: dhcp4: yes 修改网卡配置文件后需执行命令生效:netplan apply

Ubuntu网络配置 配置静态IP: cat /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: eth0: addresses:

  • 192.168.6.10/24
  • 10.10.10.10/24 gateway4: 192.168.6.1 nameservers: search: [mydomain, otherdomain] addresses: [223.5.5.5, 8.8.8.8, 1.1.1.1]

Ubuntu网络配置 查看ip和gateway ip addr route -n 查看DNS ls -l /etc/resolv.conf lrwxrwxrwx 1 root root 39 Dec 12 11:36 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf systemd-resolve –status 修改主机名 hostnamectl set-hostname ubuntu1804

查看进程进程ps ps [OPTION]... 支持三种选项: UNIX选项 如-A -e BSD选项 如a GNU选项 如--help •选项:默认显示当前终端中的进程 •a 选项包括所有终端中的进程 •x 选项包括不链接终端的进程 •u 选项显示进程所有者的信息 •f 选项显示进程树,相当于 --forest •k|--sort 属性 对属性排序,属性前加- 表示倒序 •o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem •L 显示支持的属性列表

ps常见选项 -C cmdlist 指定命令,多个命令用,分隔 -L 显示线程 -e: 显示所有进程,相当于-A -f: 显示完整格式程序信息 -F: 显示更完整格式的进程信息 -H: 以进程层级格式显示进程相关信息 -u userlist 指定有效的用户ID或名称 -U userlist 指定真正的用户ID或名称 -g gid或groupname 指定有效的gid或组名称 -G gid或groupname 指定真正的gid或组名称 -p pid 显示指pid的进程 --ppid pid 显示属于pid的子进程 -M 显示SELinux信息,相当于Z

ps 输出属性 VSZ: Virtual memory SiZe,虚拟内存集,线性内存 RSS: ReSident Size, 常驻内存集 STAT:进程状态 R:running S: interruptable sleeping D: uninterruptable sleeping T: stopped Z: zombie +: 前台进程 l: 多线程进程 L:内存分页并带锁 N:低优先级进程 <: 高优先级进程 s: session leader,会话(子进程)发起者

ps ni: nice值 pri: priority 优先级 psr: processor CPU编号 rtprio: 实时优先级 示例: ps axo pid,cmd,psr,ni,pri,rtprio 常用组合: aux -ef -eFH -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps示例 查询你拥有的所有进程 ps -x 显示指定用户名(RUID)或用户ID的进程 ps -fU apache ps -fU 48 显示指定用户名(EUID)或用户ID的进程 ps -fu wang ps -fu 1000 查看以root用户权限(实际和有效ID)运行的每个进程 ps -U root -u root 列出某个组拥有的所有进程(实际组ID:RGID或名称) ps -fG nginx

ps示例 列出有效组名称(或会话)所拥有的所有进程 ps -fg mysql ps -fg 27 显示指定的进程ID对应的进程 ps -fp 1234 以父进程ID来显示其下所有的进程,如显示父进程为1234的所有进程 ps -f --ppid 1234 显示指定PID的多个进程 ps -fp 1204,1239,1263 要按tty显示所属进程 ps -ft pts/0

ps示例 以进程树显示系统中的进程如何相互链接 ps -e --forest 以进程树显示指定的进程 ps -f --forest -C sshd ps -ef --forest | grep -v grep | grep sshd 要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列 ps -fL -C nginx 要列出所有格式说明符 ps L 查看进程的PID,PPID,用户名和命令 ps -eo pid,ppid,user,cmd

ps示例 自定义格式显示文件系统组,ni值开始时间和进程的时间 ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime 使用其PID查找进程名称: ps -p 1244 -o comm= 要以其名称选择特定进程,显示其所有子进程 ps -C sshd,bash 查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用 ps -C httpd,sshd -o pid= 检查一个进程的执行时间 ps -eo comm,etime,user | grep nginx

ps示例 查找占用最多内存和CPU的进程 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head 显示安全信息 ps -eM ps --context 使用以下命令以用户定义的格式显示安全信息 ps -eo euser,ruser,suser,fuser,f,comm,label 使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视 watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'

进程优先级 进程优先级调整 静态优先级:100-139 进程默认启动时的nice值为0,优先级为120 只有根用户才能降低nice值(提高优先性) nice命令 nice [OPTION] [COMMAND [ARG]...] renice命令 renice [-n] priority pid... 查看 ps axo pid,comm,ni

搜索进程 最灵活:ps 选项 | 其它命令 按预定义的模式:pgrep pgrep [options] pattern -u uid: effective user,生效者 -U uid: real user,真正发起运行命令者 -t terminal: 与指定终端相关的进程 -l: 显示进程名 -a: 显示完整格式的进程名 -P pid: 显示指定进程的子进程 按确切的程序名称:/sbin/pidof pidof bash

进程管理工具 top:有许多内置命令 排序: P:以占据的CPU百分比,%CPU M:占据内存百分比,%MEM T:累积占据CPU时长,TIME+ 首部信息显示: uptime信息:l命令 tasks及cpu信息:t命令 cpu分别显示:1 (数字) memory信息:m命令 退出命令:q 修改刷新时间间隔:s 终止指定进程:k 保存文件:W

top命令 栏位信息简介 us:用户空间 sy:内核空间 ni:调整nice时间 id:空闲 wa:等待IO时间 hi:硬中断 si:软中断(模式切换) st:虚拟机偷走的时间

进程管理工具 选项: -d # 指定刷新时间间隔,默认为3秒 -b 全部显示所有进程 -n # 刷新多少次后退出 -H 线程模式,示例:top -H -p pidof mysqld htop命令:EPEL源 选项: -d #: 指定延迟时间; -u UserName: 仅显示指定用户的进程 -s COLUME: 以指定字段进行排序 子命令: s:跟踪选定进程的系统调用 l:显示选定进程打开的文件列表 a:将选定的进程绑定至某指定CPU核心 t:显示进程树

内存空间 内存空间使用状态: free [OPTION] -b 以字节为单位 -m 以MB为单位 -g 以GB为单位 -h 易读格式 -o 不显示-/+buffers/cache行 -t 显示RAM + swap的总和 -s n 刷新间隔为n秒 -c n 刷新n次后即退出

内存工具 vmstat命令:虚拟内存信息 vmstat [options] [delay [count]] vmstat 2 5 procs: r:可运行(正运行或等待运行)进程的个数,和核心数有关 b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度) memory: swpd: 交换内存的使用总量 free:空闲物理内存总量 buffer:用于buffer的内存总量 cache:用于cache的内存总量 swap: si:从磁盘交换进内存的数据速率(kb/s) so:从内存交换至磁盘的数据速率(kb/s)

内存工具 io: bi:从块设备读入数据到系统的速率(kb/s) bo: 保存数据至块设备的速率 system: in: interrupts 中断速率,包括时钟 cs: context switch 进程切换速率 cpu: us:Time spent running non-kernel code sy: Time spent running kernel code id: Time spent idle. Linux 2.5.41前,包括IO-wait time. wa: Time spent waiting for IO. 2.5.41前,包括in idle. st: Time stolen from a virtual machine. 2.6.11前, unknown. 选项: -s: 显示内存的统计数据

系统监控工具 iostat:统计CPU和设备IO信息 示例:iostat 1 10 iftop:显示带宽使用情况,EPEL源 示例:iftop -n -i eth1 pmap命令:进程对应的内存映射 pmap [options] pid [...] -x: 显示详细格式的信息 示例:pmap 1 另外一种实现 cat /proc/PID/maps

系统监控工具 glances命令:EPEL源 glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output] 内建命令: a Sort processes automatically l Show/hide logs c Sort processes by CPU% b Bytes or bits for network I/O m Sort processes by MEM% w Delete warning logs p Sort processes by name x Delete warning and critical logs i Sort processes by I/O rate 1 Global CPU or per-CPU stats d Show/hide disk I/O stats h Show/hide this help screen f Show/hide file system stats t View network I/O as combination n Show/hide network stats u View cumulative network I/O s Show/hide sensors stats q Quit (Esc and Ctrl-C also work) y Show/hide hddtemp stats

系统监控工具 常用选项: -b: 以Byte为单位显示网卡数据速率 -d: 关闭磁盘I/O模块 -f /path/to/somefile: 设定输入文件位置 -o {HTML|CSV}:输出格式 -m: 禁用mount模块 -n: 禁用网络模块 -t #: 延迟时间间隔 -1:每个CPU的相关数据单独显示

系统监控工具 C/S模式下运行glances命令 服务器模式: glances -s -B IPADDR IPADDR: 指明监听的本机哪个地址 客户端模式: glances -c IPADDR IPADDR:要连入的服务器端地址

系统监控工具 dstat命令:系统资源统计,代替vmstat,iostat dstat [-afv] [options..] [delay [count]] -c 显示cpu相关信息 -C #,#,...,total -d 显示disk相关信息 -D total,sda,sdb,... -g 显示page相关统计数据 -m 显示memory相关统计数据 -n 显示network相关统计数据 -p 显示process相关统计数据 -r 显示io请求相关的统计数据 -s 显示swapped相关的统计数据

系统监控工具 --tcp --udp --unix --raw --socket --ipc --top-cpu:显示最占用CPU的进程 --top-io: 显示最占用io的进程 --top-mem: 显示最占用内存的进程 --top-latency: 显示延迟最大的进程

iotop iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO iotop输出 第一行:Read和Write速率总计 第二行:实际的Read和Write速率 第三行:参数如下: 线程ID(按p切换为进程ID) 优先级 用户 磁盘读速率 磁盘写速率 swap交换百分比 IO等待所占的百分比 线程/进程命令

iotop常用参数 -o, --only只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效 -b, --batch非交互模式,一般用来记录日志 -n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用 -d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非×××数据例如1.1 -p PID, --pid=PID指定监测的进程/线程 -u USER, --user=USER指定监测某个用户产生的I/O -P, --processes仅显示进程,默认iotop显示所有线程 -a, --accumulated显示累积的I/O,而不是带宽 -k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用

iotop常用参数和快捷键 -t, --time 加上时间戳,非交互非模式 -q, --quiet 禁止头几行,非交互模式,有三种指定方式 -q 只在第一次监测时显示列名 -qq 永远不显示列名 -qqq 永远不显示I/O汇总 交互按键 left和right方向键:改变排序 r:反向排序 o:切换至选项--only p:切换至--processes选项 a:切换至--accumulated选项 q:退出 i:改变线程的优先级

nload 查看网络实时吞吐量 nload是一个实时监控网络流量和带宽使用情况,以数值和动态图展示进出的流量情况 安装:yum -y install nload (EPEL源) 界面操作 上下方向键、左右方向键、enter键或者tab键都就可以切换查看多个网卡的流量情况 按 F2 显示选项窗口 按 q 或者 Ctrl+C 退出 nload 示例: nload:默认只查看第一个网络的流量进出情况 nload eth0 eth1:在nload后面指定网卡,可以指定多个 设置刷新间隔:默认刷新间隔是100毫秒,可通过 -t命令设置刷新时间(单位是毫秒) nload -t 500 eth0 设置单位:显示两种单位一种是显示Bit/s、一种是显示Byte/s,默认是以Bit/s,也可不显示/s -u h|b|k|m|g|H|B|K|M|G 表示的含义: h: auto, b: Bit/s, k: kBit/s, m: MBit/s, H: auto, B: Byte/s, K: kByte/s, M: MByte/s nload -u M eth0

lsof lsof:list open files查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符 命令参数 -a:列出打开文件存在的进程 -c<进程名>:列出指定进程所打开的文件 -g:列出GID号进程详情 -d<文件号>:列出占用该文件号的进程 +d<目录>:列出目录下被打开的文件 +D<目录>:递归列出目录下被打开的文件

lsof 命令参数 -n<目录>:列出使用NFS的文件 -i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip ) -p<进程号>:列出指定进程号所打开的文件 -u:列出UID号进程详情 -h:显示帮助信息 -v:显示版本信息。 -n: 不反向解析网络名字

lsof示例 进程管理 查看由登陆用户启动而非系统启动的进程 lsof /dev/pts/1 指定进程号,可以查看该进程打开的文件 lsof -p 9527 文件管理 查看指定程序打开的文件 lsof -c httpd 查看指定用户打开的文件 lsof -u root | more 查看指定目录下被打开的文件 lsof +D /var/log/ lsof +d /var/log/ 参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文件

lsof示例 查看所有网络连接 lsof -i –n lsof -i@127.0.0.1 通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如:sshd等。也可以通过指定ip查看该ip的网络连接情况 查看端口连接情况 lsof -i :80 -n 通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等 查看指定进程打开的网络连接 lsof -i –n -a -p 9527 参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程 查看指定状态的网络连接 lsof -n -P -i TCP -s TCP:ESTABLISHED -n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等

lsof示例 恢复删除文件 lsof |grep /var/log/messages rm -f /var/log/messages lsof |grep /var/log/messages cat /proc/653/fd/6 cat /proc/653/fd/6 > /var/log/messages

进程管理工具 kill命令:向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写 显示当前系统可用信号: kill –l 或者 trap -l 常用信号:man 7 signal

  1. SIGHUP 无须关闭进程而让其重读配置文件
  2. SIGINT 中止正在运行的进程;相当于Ctrl+c
  3. SIGQUIT 相当于ctrl+\
  4. SIGKILL 强制杀死正在运行的进程
  5. SIGTERM 终止正在运行的进程
  6. SIGCONT 继续运行
  7. SIGSTOP 后台休眠 指定信号的方法 : (1) 信号的数字标识:1, 2, 9 (2) 信号完整名称:SIGHUP (3) 信号的简写名称:HUP

进程管理工具 按PID:kill [-SIGNAL] pid … kill –n SIGNAL pid kill –s SIGNAL pid 按名称:killall [-SIGNAL] comm… 按模式:pkill [options] pattern -SIGNAL -u uid: effective user,生效者 -U uid: real user,真正发起运行命令者 -t terminal: 与指定终端相关的进程 -l: 显示进程名(pgrep可用) -a: 显示完整格式的进程名(pgrep可用) -P pid: 显示指定进程的子进程

作业管理 Linux的作业控制 前台作业:通过终端启动,且启动后一直占据终端 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端) 让作业运行于后台 (1) 运行中的作业: Ctrl+z (2) 尚未启动的作业: COMMAND & 后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系 nohup COMMAND &>/dev/null & screen;COMMAND 查看当前终端所有作业:jobs 作业控制: fg [[%]JOB_NUM]:把指定的后台作业调回前台 bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行 kill [%JOB_NUM]: 终止指定的作业

并行运行 同时运行多个进程,提高效率 方法1 vi all.sh f1.sh& f2.sh& f3.sh& 方法2 (f1.sh&);(f2.sh&);(f3.sh&) 方法3 { f1.sh& f2.sh& f3.sh& }

任务计划 Linux任务计划、周期性任务执行 •未来的某时间点执行一次任务 at 指定时间点,执行一次性任务 batch 系统自行选择空闲时间去执行此处指定的任务 •周期性运行某任务 cron

at任务 包:at at 命令:at [option] TIME 常用选项: -V 显示版本信息 -t time 时间格式 [[CC]YY]MMDDhhmm[.ss] -l 列出指定队列中等待运行的作业;相当于atq -d 删除指定的作业;相当于atrm -c 查看具体作业任务 -f /path/file 指定的文件中读取任务 -m 当任务被完成之后,将给用户发送邮件,即使没有标准输出 注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

at任务 TIME:定义出什么时候进行 at 这项任务的时间 HH:MM [YYYY-mm-dd] noon, midnight, teatime(4pm) tomorrow now+#{minutes,hours,days, OR weeks}

at时间格式 HH:MM 02:00 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务 HH:MM YYYY-MM-DD 02:00 2016-09-20 规定在某年某月的某一天的特殊时刻进行该项任务 HH:MM[am|pm] [Month] [Date] 04pm March 17 17:20 tomorrow HH:MM[am|pm] + number [minutes|hours|days|weeks] 在某个时间点再加几个时间后才进行该项任务 now + 5 min 02pm + 3 days

at任务 执行方式: 1)交互式 2)输入重定向 3)at –f 文件 依赖与atd服务,需要启动才能实现at任务 at队列存放在/var/spool/at目录中 /etc/at.{allow,deny}控制用户是否能执行at任务 白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令 黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行 如果两个文件都不存在,只有 root 可以执行 at 命令

周期性任务计划cron 周期性任务计划:cron 相关的程序包: cronie:主程序包,提供crond守护进程及相关辅助工具 cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务 crontabs:包含CentOS提供系统维护任务

计划任务 确保crond守护处于运行状态: CentOS 7: systemctl status crond CentOS 6: service crond status 计划周期性执行的任务提交给crond,到指定时间会自动运行 系统cron任务:系统维护作业 /etc/crontab 用户cron任务: crontab命令 日志:/var/log/cron

计划任务 系统cron任务:/etc/crontab 注释行以 # 开头 详情参见 man 5 crontab

Example of job definition:

.---------------- minute (0 - 59)

| .------------- hour (0 - 23)

| | .---------- day of month (1 - 31)

| | | .------- month (1 - 12) OR jan,feb,mar,apr ...

| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

| | | | |

* * * * * user-name command to be executed

例如:晚上9点10分运行echo命令 10 21 * * * wang /bin/echo "Howdy!"

计划任务 时间表示法: •(1) 特定值 给定时间点有效取值范围内的值 •(2) * 给定时间点上有效取值范围内的所有值 表示“每...” •(3) 离散取值 #,#,# •(4) 连续取值 #-# •(5) 在指定时间范围上,定义步长 /#: #即为步长

时间格式 @reboot Run once after reboot @yearly 0 0 1 1 * @annually 0 0 1 1 * @monthly 0 0 1 * * @weekly 0 0 * * 0 @daily 0 0 * * * @hourly 0 * * * * 示例:每3小时echo和wall命令 0 */3 * * * centos /bin/echo “howdy”; wall “welcome to Magedu!”

计划任务 •系统的计划任务: /etc/crontab 配置文件 /etc/cron.d/ 配置文件 /etc/cron.hourly/ 脚本 /etc/cron.daily/ 脚本 /etc/cron.weekly/ 脚本 /etc/cron.monthly/ 脚本

用户计划任务 crontab命令定义 每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME crontab命令: crontab [-u user] [-l | -r | -e] [-i] -l 列出所有任务 -e 编辑任务 -r 移除所有任务 -i 同-r一同使用,以交互式模式移除指定任务 -u user 仅root可运行,指定用户管理cron任务 控制用户执行计划任务: /etc/cron.{allow,deny}

at和crontab 一次性作业使用 at 重复性作业使用crontab Create at time crontab -e List at -l crontab -l Details at -c jobnum crontab -l Remove at -d jobnum crontab -r Edit N/A crontab -e 没有被重定向的输出会被邮寄给用户 root能够修改其它用户的作业

计划任务 注意:运行结果的标准输出和错误以邮件通知给相关用户 (1) COMMAND > /dev/null (2) COMMAND &> /dev/null 对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义

计划任务 思考: (1) 如何在秒级别运行任务?

          • for min in 0 1 2; do echo "hi"; sleep 20; done (2) 如何实现每7分钟运行一次任务? sleep命令: sleep NUMBER[SUFFIX]... SUFFIX: s: 秒, 默认 m: 分 h: 小时 d: 天