实操篇(下)
# 1. 网络配置
# 1.1 Linux 网络配置原理
假设我们的物理主机在一个教室的局域网内:
- Linux 虚拟机和 vmnet8 在一个子网内形成一个网络,可以互通(ping 通)
- 本机电脑的无线网卡与教室局域网的网管互通,vmnet8 又和无线网卡互通
# 1.2 查看网络 IP 和网关
# 1.2.1 查看虚拟机 IP
在 Linux 中的 ifconfig
可以看到本机的 IP:
$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.220.134 netmask 255.255.255.0 broadcast 192.168.220.255
inet6 fe80::c84d:947f:c9c3:2aa3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f9:c5:14 txqueuelen 1000 (Ethernet)
RX packets 142 bytes 14858 (14.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 130 bytes 17101 (16.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2
3
4
5
6
7
8
9
可以看到 Linux 虚拟机的 IP 为 192.168.220.134。
# 1.2.2 查看网络编辑器和网关
在 VMware 的虚拟网络编辑器中,可以看到 NAT 连接方式下本机的子网 IP:
![image-20220214171502174](https://notebook-img-1304596351.cos.ap-beijing.myqcloud.com/img/image-20220214171502174.png)
然后在点击 NAT 设置
可以看到网关:
# 1.2.3 查看 Windows 环境中的 VMnet8 网络配置
使用 ipconfig
命令:
> ipconfig
...
以太网适配器 VMware Network Adapter VMnet8:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::c823:6a37:c475:ed49%24
IPv4 地址 . . . . . . . . . . . . : 192.168.220.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
...
2
3
4
5
6
7
8
9
10
# 1.3 ping 测试连通性
ping 目的主机
:测试当前服务器是否可以连接目的主机
测试是否可以连接百度:
ping www.baidu.com
# 1.4 Linux 网络环境配置
# 1.4.1 第一种方法:自动获取
登录后,通过界面来设置自动获取 IP。特点:Linux 启动后会自动获取 IP,但每次自动获取的 IP 地址可能不一样。
# 1.4.2 第二种方法:指定 IP ⭐️
直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)。
配置文件根据网卡不同名字有所区别,但文件路径一致:/etc/sysconfig/network-scripts/,常见的配置文件名有 ifcfg-eth0 或者 ifcfg-ens33,可以通过 ifconfig 查看后缀。
以 ifcfg-ens33 为例,使用 vim 修改此文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33
:
YPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
- BOOTPROTO="dhcp"
+ BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="1af88ac9-573c-49da-993c-9ab4e6c73159"
DEVICE="ens33"
ONBOOT="yes"
+ IPADDR=192.168.200.130 # 本机 IP 地址
+ NETMASK=255.255.255.0 # 子网掩码
+ GATEWAY=192.168.200.2 # 默认网关
+ DNS1=192.168.200.2 # 域名解析器
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
修改好后并保存。然后进入 VMware 的虚拟网络编辑器,将 NAT 配置中的子网 IP 改为 192.168.200.0
,将网关 IP 改为 192.168.200.2
。修改位置可见本文的 1.2.2 节所示。
完成以上操作后,重启网络服务或重启系统生效:
service network restart
、reboot
以上这些操作就是将本文 1.1 节图中的 Linux 虚拟机和 vmnet8 的地址分别改成了 192.168.200.130
和 192.168.200.1
。这时在虚拟机中使用 ifconfig
命令可以看到:
$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.130 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::c84d:947f:c9c3:2aa3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f9:c5:14 txqueuelen 1000 (Ethernet)
RX packets 792 bytes 825124 (805.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 456 bytes 33428 (32.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2
3
4
5
6
7
8
9
- 本机 IP 已经成功改为了 192.168.200.130。
# 1.5 设置主机名和 hosts 映射
# 1.5.1 设置主机名
为了方便记忆,可以给 Linux 系统设置主机名,也可以根据需要修改主机名。
指令 hostname
:查看主机名
修改文件在 /etc/hostname 指定。修改后重启生效。
# 1.5.2 设置 hosts 映射
思考:如何通过主机名能够找到(比如 ping)某个 Linux 系统?
Hosts:一个记录 IP 和 hostname 之间映射关系的文本文件。
✏️ Windows 中,在 C:\Windows\System32\drivers\etc\hosts
文件指定即可。
案例:
192.168.200.130 hspEdu100
- 前半部分是 IP 地址,后半部分是其对应的主机名
PS:还有一个常见的案例是
127.0.0.1 localhost
✏️ Linux 中,在 /etc/hosts
文件指定即可。
案例:
192.168.200.1 ThinkPad-PC
# 1.6 应用实例:浏览器解析 www.baidu.com
的过程
- 浏览器先检查浏览器中有没有该域名解析 IP,有就先调用这个 IP 完成解析。如果没有,就再检查 DNS 解析器缓存,如果有就直接返回 IP 完成解析。这两个缓存可以理解为本地解析器缓存。
- 一般来说,当电脑第一次成功访问某一个网站后,在一定时间内浏览器或 OS 会缓存它的 DNS 解析记录。
ipconfig /displaydns // 查看 DNS 域名解析缓存
ipconfig /flushdns // 手动清理 DNS 缓存
2
- 如果本地解析器缓存没有找到对应的映射,就检查系统中 hosts 文件中有没有对应的域名 IP 映射,有则完成解析并返回。
- 如果本地 DNS 解析器缓存和 hosts 文件都没能解析出对应的 IP,则到域名服务 DNS 进行解析域。
# 2. 进程管理(重点)
# 2.1 基本介绍
在 Linux 中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个 ID 号,即进程号,PID。
每个进程都可能以两种方式存在的:前台与后台。所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才才结束。
# 2.2 ps 显示系统执行的进程
# 2.2.1 ps 命令
ps
命令是 Process Status 的缩写,用来列出系统中当前正在运行的那些进程,就是执行 ps 命令的那个时刻的那些进程的快照。
ps 查看的结果不是动态连续的,如果想要动态的显示进程信息,就可以使用 top、htop 命令。
$ ps
PID TTY TIME CMD
2149 pts/0 00:00:00 zsh
2228 pts/0 00:00:00 ps
2
3
4
ps 显示的信息字段:
- PID:进程识别号
- TTY:终端机号
- TIME:进程使用 CPU 的总时间
- CMD:正在执行的命令或进程名
常用选项:
- -a:显示当前终端的所有进程信息
- -u:以用户的格式显示进程信息
- -x:显示后台进程运行的参数
常见情况下是
ps -aux | more
三个选项一块用,并分页查看
# 2.2.2 ps 详解
输入 ps -aux|more
后可以看到:
- USER:用户名称
- %CPU:进程占用 CPU 百分比
- %MEM:进程占用物理内存的百分比
- VSZ:进程占用的虚拟内存大小(单位 KB)
- RSS:进程占用的物理内存大小(单位 KB)
- TTY:终端名称,缩写
- STAT:进程状态。S 睡眠,s 表示该进程是会话的先导进程,N 表示该进程拥有比普通优先级更低的优先级,R 正在运行,D 短期等待,Z 僵死进程,T 被跟踪或被停止等
- START:进程的启动时间
- TIME:进程使用 CPU 的总时间
- COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
但是直接 ps 会显示太多的进程了,如果想看有没有某个进程,可以用 ps -aux|grep xxx
。
# 2.2.3 应用实例
要求:以全格式显示当前所有的进程
ps -ef
:以全格式查看系统上的运行的所有进程 【常用】
- -e:显示运行在系统上的所有进程
- -f:全格式,即扩展显示输出
- C 字段是 CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行的优先级会降低;数值越小,表明进程是 IO 密集型运算,执行优先级会提高。
- PPID:父进程的 PID
# 2.3 kill 和 killall
这部分在 CSAPP 中有讲解
kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。预设的信息为 SIGTERM(15),可将指定程序终止。
这里只讲用 kill 命令终止进程:
kill [选项] 进程号
:终止进程killall 进程名称
:通过进程名称杀死进程(及其子进程),也支持通配符,这在系统因负载过大而变得很慢时很有用。
常用选项:
- -9:表示强迫进程立即终止
# 🖊 案例 1:踢掉某个非法用户
我们先让用户 fox 登录,然后 root 下输入 ps -aux | grep sshd
,可以看到:
$ ps -aux | grep sshd
root 1462 0.0 0.2 112984 4324 ? Ss 12:24 0:00 /usr/sbin/sshd -D
root 2140 0.0 0.2 161072 5584 ? Ss 12:24 0:00 sshd: yubin [priv]
yubin 2148 0.0 0.1 161072 2556 ? S 12:24 0:00 sshd: yubin@pts/0
root 2900 0.3 0.2 161080 5584 ? Ss 13:22 0:00 sshd: fox [priv]
fox 2907 0.0 0.1 161080 2560 ? S 13:22 0:00 sshd: fox@pts/1
root 3006 0.0 0.0 112828 984 pts/0 S+ 13:23 0:00 grep --color=auto sshd
2
3
4
5
6
7
可以看到 fox 登录的时候,是通过进程 2900 登录的,于是我们 kill 2900
后可以看到 fox 用户被踢掉。
# 🖊 案例 2:终止远程登录服务 sshd,并在适当时候再次重启 sshd 服务
类似于案例1,在案例 1 的输出中可以看到,sshd 服务(/usr/sbin/sshd -D
启动的进程)的进程号是 1462,所以 kill 1462
即可终止 sshd 服务。终止后会发现别的用户无法再远程登录。
终止 sshd 后,通过 /bin/systemctl start sshd.service
即可重启该服务。
# 🖊 案例 3:终止多个 gedit
先在图形化界面下用 gedit 打开多个文本编辑页面,然后 killall gedit
即可一次性关闭全部。
# 🖊 案例 4:强制杀掉一个终端
先开一个 bash 终端,然后 ps -aux|grep bash
即可看到所有的 bash 进程,找到要杀死的 bash 进程号 xxxx,然后使用 kill -9 bash对应的进程号
即可杀死。
- 加上 -9 选项是因为如果不加的话,系统会认为由于要被 kill 的 bash 正在工作,而认为你的 kill 是一个误操作,从而置之不理,只有加了 -9 才会强制杀掉。
# 2.4 pstree 查看进程树
pstree [选项]
:可以更加直观的来看进程信息。
- -p:显示进程的 PID
- -u:显示进程的所属用户
案例:
- pstree -p:树状的形式显示进程的 PID。
- pstree -u:树状的形式显示进程的用户
# 2.5 服务(service)管理
服务本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql、sshd、防火墙等),因此我们又称为守护进程。
# 2.5.1 service 管理指令
service 服务名 [start | stop | restart | reload | status]
- 在 CentOS 7.0 后 不再使用 service ,而是 systemctl(后面专门介绍)
- service 指令管理的服务在 /etc/init.d 查看,即 ls -l /etc/init.d 命令。
案例:
- 查看网络:
service network status
- 关闭网络:
service network stop
- 启动网络:
service network start
# 2.5.2 查看服务名
✏️ 方式一:执行命令 setup
-> 系统服务
就可以看到全部:
![image-20220215154611493](https://notebook-img-1304596351.cos.ap-beijing.myqcloud.com/img/image-20220215154611493.png)
- 带星号的是开机自启动的服务
- 可以通过命令
sevice
或systemctl
启动。
✏️ 方式二:运行 ls -l /etc/init.d 查看 service
指令管理的服务。
# 2.5.3 服务的运行级别
Linux 系统有7种运行级别(runlevel):常用的是级别 3 和 5。
- 运行级别 0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动。
- 运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆。
- 运行级别 2:多用户状态(没有 NFS),不支持网络。
- 🔺运行级别 3:完全的多用户状态(有 NFS),无界面,登陆后进入控制台命令行模式。【工作常用】
- 运行级别 4:系统未使用,保留。
- 运行级别 5:X11 控制台,登陆后进入图形 GUI 模式
- 运行级别 6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。
开机的流程说明:开机 -> BIOS -> /boot -> systemd 进程 1(所有进程的老祖宗)-> 确定运行级别 -> 启动运行级对应的服务
# 2.5.4 CentOS 7 后运行级别说明
在 /etc/initab 进行了简化,multi-user.target 等同于运行级别 3,graphical.target 等同于运行级别 5。
- 命令
systemctl get-default
:获取当前的运行级别 - 命令
systemctl set-default multi-user.target
:将默认运行级别设置为 mulit-user
# 2.5.5 chkconfig 指令
chkconfig 命令用于检查,设置系统的各种服务。通过 chkconfig 命令可以给每个服务的各个运行级别设置“自启动”/“关闭”,此处的服务是指 service 指令管理的服务,在 /etc/init.d 查看,即 ls -l /etc/init.d 命令。
在 CentOS 7.0之后,很多服务使用 systemctl 管理。
基本语法:
- 查看服务:
chkconfig --list | grep 服务名
chkconfig --level 5 服务名 on/off
:将某一个服务在特定级别下设置为“自启动”/“关闭”
chkconfig 重新设置服务自启动或关闭后,需要重启机器才能生效。
# 2.6 systemctl 命令
systemctl:system ctl
# 2.6.1 systemctl 管理指令
命令:systemctl [start | stop | restart | status] 服务名
- systemctl 指令管理的服务在 /usr/lib/systemd/system 目录查看
# 2.6.2 systemctl 设置服务自启动状态
systemctl list-unit-files| grep 服务名
:查看服务开机启动状态,使用 grep 进行过滤。systemctl enable
:设置服务开机自启动。systemctl disenable 服务名
:关闭服务开机自启动。systemctl is-enable 服务名
:查询某个服务是否开机自启动。
案例:查看当前防火墙的状况,关闭并重启它 => firewalld.service
- 查看状况:
systemctl status firewalld
- 这里写
firewalld
或者全名firewalld.service
均可- 关闭防火墙:
systemctl stop firewalld
细节讨论:这种关闭防火墙是立即生效,但只是临时生效,重启系统后还是回归以前对服务的设置。如果希望某个服务自启动或者关闭永久生效,要使用
systemctl [enable|disable] 服务名
。
# 2.7 防火墙打开和关闭指定端口
在真正的生产环境,往往需要将防火墙打开。但如果把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯。这时,需要打开指定的端口。
防火墙的一个功能就是将请求允许的端口放行,不允许的端口过滤掉
firewall 指令:
- 打开端口:
firewall-cmd --permanent --add-port=端口号/协议
- 关闭端口:
firewall-cmd --permanent --remove-port=端口号/协议
- 重新载入,才能生效:
firewall-cmd --reload
- 查询端口是否开放:
firewall-cmd --query-port=端口号/协议
- 端口号和协议可以通过
netstat
进行监听
案例:
- 先启用防火墙,然后在 Windows 中测试请求 Linux 的 111 端口能否 telnet => 不能
> telnet 192.168.200.130 111 正在连接192.168.200.130...无法打开到主机的连接。 在端口 111: 连接失败
1
2
- 开放 111 端口:
$ firewall-cmd --permanent --add-port=111/tcp; success $ firewall-cmd --reload success
1
2
3
4
- 在 Windows 中测试 telnet 就可以成功了
- 关闭 111 端口:
$ firewall-cmd --permanent --remove-port=111/tcp; success $ firewall-cmd --reload success
1
2
3
4
# 2.8 top 动态监控进程
top 与 ps 命令很相似,它们都用来显示正在执行的进程。top 与 ps 最大的不同之处,在于 top 在执行一段时间可以更新正在运行的的进程。
命令:top [选项]
- -d:指定 top 命令每隔几秒更新,默认 3 秒
- -i:使 top 不显示任何闲置或者僵死进程
- -p:通过指定监控进程 ID 来仅仅监控某个进程的状态
- 各字段含义可以百度
执行 top
后进入监控页面,还可以通过键盘输入一下按键来交互:
- P:以 CPU 使用率排序,默认就是此项
- M:以内存的使用率排序
- N:以 PID 排序
- q:退出 top
# 🖊 案例 1:监视特定用户
输入 top 命令,查看执行的进程,然后输入 u 回车,再输入用户名。
# 🖊 案例 2:终止指定的进程
输入 top 命令,查看执行的进程,然后输入 k 回车,再输入要结束的进程 PID 号。
# 2.9 netstat 监控网络状态
netstat [选项]
:查看系统网络情况
- -an:按一定顺序排列输出
- -p:显示哪个进程在调用
案例:
- 查看服务名为 sshd 服务的信息:
netstat -anp|grep sshd
# 2.10 ping 检测主机连接
ping 是一种网络检测工具,它主要是用来检测远程主机是否正常,或是两部主机间的网线或网卡故障。如 ping 对方IP地址
。
# 3. RPM 与 YUM
# 3.1 RPM 包的管理
rpm 是用于互联网下载包的打包及安装工具,它包含在某些 Linux 发行版中。它生成具有.RPM 扩展名的文件。RPM 是 RedHat Package Manager(RedHat 软件包管理工具)的缩写,类似 Windows 的 setup.exe,这一文件格式名称虽然打上了 RedHat 的标志,但理念是通用的。Linux 的发行版本都有采用(RedHat,CentOS等等),可以算是公认的行业标准了。
# 3.1.1 rpm 包的简单查询指令
查询指令的选项是 -q(query),然后再和其他选项组合来使用。
rpm -qa
:查询已安装的全部 rpm 软件包
案例:看看当前系统是否安装了 Firefox:
rpm -qa|grep firefox
$ rpm -qa|grep firefox firefox-91.5.0-1.el7.centos.x86_64
1
2
# 3.1.2 rpm 包名基本格式
一个 rpm 包名:firefox-91.5.0-1.el7.centos.x86_64
- 名称:firefox
- 版本号:91.5.0-1
- 适用 OS:el7.centos.x86_64
- 表示 centos7.x 的 64 位系统
- 如果是 i686、i386表示32位系统,noarch 表示通用
# 3.1.3 RPM 包的其它查询指令
rpm -qa | grep 软件包名
:查询所安装的是否有该软件包rpm -qi 软件包名
:查询软件包信息rpm -ql 软件包名
:查询软件包中的文件rpm -qf 文件全路径
:查询文件所属的软件包,如rpm -qf /etc/passwd
# 3.1.4 卸载 rpm 包
rpm -e RPM包的名称
- 包名不需要写全称,比如卸载火狐只需要写 firefox 即可。
- e —— erase
案例:删除 firefox 软件包:
rpm -e firefox
细节问题
- 如果其它软件包依赖于要卸载的软件包,卸载时则会产生错误信息。
- 如果就是要删除这个 rpm 包,可以增加参数 --nodeps,就可以强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行。
# 3.1.5 安装 rpm 包
rpm -ivh RPM包全路径名称
- -i:install,安装
- -v:verbose,提示
- -h:hash,进度条
案例:卸载和安装 Firefox 浏览器
- 卸载:
rpm -e firefox
- 安装:
rpm -ivh firefox的rpm安装包
# 3.2 yum
YUM 是一个 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。使用 YUM 的前提是可以联网。
- 查询 YUM 服务器是否有需要安装的软件:
yum list | grep 软件名
- 安装指定的 yum 包:
yum install 软件名
案例:使用 yum 的方式来安装 firefox
- 删除 Firefox:
rpm -e firefox
- 查询 Firefox:
yum install | grep firefox
- 安装:
yum install firefox