Fork me on GitHub

Linux系统磁盘管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[toc]

磁盘基本概述

磁盘分类

  • 固态硬盘

  • 机械硬盘

  • 服务器硬盘

固态硬盘的优缺点

优点:

  • 读写速度快
  • 防震抗摔性
  • 低功耗
  • 无噪音
  • 工作温度范围大
  • 轻便

缺点

  • 容量小
  • 寿命有限制
  • 售价高

Linux中磁盘命令方式

Linux中磁盘的命名方式与磁盘的接口有关,规则如下:

  • 传统IDE接口硬盘:/dev/hd[a-z]
  • SCISI接口硬盘:/dev/sd[a-z]
  • 虚拟化硬盘:/dev/vd[a-z]

在设备名称的定义规则如下, 其他的分区可以以此类推
系统的第一块SCSI接口的硬盘名称为/dev/sda
系统的第二块SCSI接口的硬盘名称为/dev/sdb
系统中分区由数字编号表示, 1-4留给主分区使用和扩展分区, 逻辑分区从5开始

1
2
3
4
5
6
//第一块磁盘
/dev/sda
//第一块磁盘的第一个分区
/dev/sda1
//第二块磁盘的第一个分区
/dev/sdb1

MBR与GPT

在使用新磁盘之前,你必须对其进行分区。MBR(Master Boot Record)和GPT(GUID Partition Table)是在磁盘上存储分区信息的两种不同方式。这些分区信息包含了分区从哪里开始的信息,这样操作系统才知道哪个扇区是属于哪个分区的,以及哪个分区是可以启动的。在磁盘上创建分区时,你必须在MBR和GPT之间做出选择

MBR是Master Boot Record的简称,也就是主引导记录,是位于磁盘最前边的一段引导(Loader)代码,主要用来引导操作系统的加载与启动,在传统硬盘分区模式中,引导扇区是每个分区(Partition)的第一扇区,而主引导扇区是硬盘的第一扇区。为了方便计算机访问硬盘,把硬盘上的空间划分成许许多多的区块(英文叫sectors,即扇区),然后给每个区块分配一个地址,称为逻辑块地址(即LBA)。

特点:

  1. MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘
  2. 只支持最多4个主分区。若想要更多分区,需要创建扩展分区,并在其中创建逻辑分区

GPT磁盘是指使用GUID分区表的磁盘,GUID磁盘分区表(GUID Partition Table,缩写:GPT)其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准,

特点:

  1. GPT对磁盘大小没有限制
  2. 最多可以创建128个分区

注意:

MBR与GPT之间互相转换会导致数据丢失

MBR

GPT

MBR和GPT分区区别

磁盘容量检查

使用df命令查看磁盘容量,不加参数以k为单位:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
df -i   //查看inode使用情况
df -h //以G或者T或者M人性化方式显示
df -T //查看文件类型

//使用df命令查看磁盘,下面分别介绍每列什么含义
[root@zhoulijie ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.4G 14G 20% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 5.9M 987M 1% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 3.8G 3.8G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 28K 199M 1% /run/user/0

使用lsblk查看分区情况:

1
2
3
4
5
6
7
8
[root@zhoulijie ~]#  lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 3.8G 0 rom /mnt/cdrom

使用du命令查看目录或者文件的容量,不加参数以k为单位:

1
2
3
du -sh opt  //人性化输出显示大小
-s:列出总和
-h:人性化显示容量信息

查看etc目录的大小

1
2
[root@zhoulijie ~]# du -sh /etc
43M /etc

磁盘分区

分区之前, 需要先给虚拟机添加一块磁盘,以便于我们做后续的实验vmware虚拟机,请按如下进行操作:

1.找到对应虚拟主机点击右键, 选择设置
2.在硬件向导里面点击添加按钮, 在硬件类型中选中“硬盘”, 点击下一步
3.磁盘类型选择默认, 然后创建新虚拟磁盘, 调整大小(不要勾选立即分配空间)
4.最后点击下一步, 完成即可

分区工具有fdisk和gdisk,当硬盘小于2T的时候我们应该用fdisk来分区,而当硬盘大于2T的时候则应用gdisk来进行分区

fdisk分区

生产分区建议:如无特殊希求,直接使用整个磁盘即可,无需分区

学习分区建议: 1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适用于练习)

1P:一个主分区

1E:一个扩展分区

3L:三个逻辑分区

本章切记 学习分区加入两块磁盘,虚拟机中会出现/dev/sdb,sdc,请使用sdb或者sdc来练习,最好fdisk分区使用/dev/sdb,gdisk分区使用/dev/sdc

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# fdisk -l /dev/sda

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000bf37c

设备 Boot Start End Blocks Id System
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
[root@zhoulijie ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):m //输入m获取帮助
命令操作
a toggle a bootable flag //切换分区启动标记
b edit bsd disklabel //编辑sdb磁盘标签
c toggle the dos compatibility flag //切换dos兼容模式
d delete a partition //删除分区
g create a new empty GPT partition table //创建新的空GPT分区表
G create an IRIX (SGI) partition table //创建IRIX(SGI)分区表
l list known partition types //显示分区类型
m print this menu //显示帮助菜单
n add a new partition //新建分区
o create a new empty DOS partition table //创建新的空白分区表
p print the partition table //显示分区表的信息
q quit without saving changes //不保存退出
s create a new empty Sun disklabel //创建新的Sun磁盘标签
t change a partition's system id //修改分区ID,可以通过l查看id
u change display/entry units //修改容量单位,磁柱或扇区
v verify the partition table //检验分区表
w write table to disk and exit //保存退出
x extra functionality (experts only) //拓展功能


# 创建主分区
命令(输入 m 获取帮助):n //新建分区
Partition type:
p primary (0 primary, 0 extended, 4 free) //主分区
e extended //扩展分区
Select (default p): p //选择主分区
分区号 (1-4,默认 1): //默认回车
起始 扇区 (2048-41943039,默认为 2048): //默认扇区回车
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+505M //分配505M
分区 1 已设置为 Linux 类型,大小设为 505 MiB



# 创建扩展分区
命令(输入 m 获取帮助):n //新建分区
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e //创建扩展分区
分区号 (2-4,默认 2): //默认回车
起始 扇区 (1036288-41943039,默认为 1036288): //默认扇区回车
将使用默认值 1036288
Last 扇区, +扇区 or +size{K,M,G} (1036288-41943039,默认为 41943039): //默认划分所有空间给扩展分区
将使用默认值 41943039
分区 2 已设置为 Extended 类型,大小设为 19.5 GiB



# 创建逻辑分区
命令(输入 m 获取帮助):n //新建分区
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l //创建逻辑分区
添加逻辑分区 5
起始 扇区 (1038336-41943039,默认为 1038336):
将使用默认值 1038336
Last 扇区, +扇区 or +size{K,M,G} (1038336-41943039,默认为 41943039):+10G //分配10G的逻辑分区
分区 5 已设置为 Linux 类型,大小设为 10 GiB

# 查看分区创建
命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000bf37c

设备 Boot Start End Blocks Id System
/dev/sda1 2048 1036287 517120 83 Linux
/dev/sda2 1036288 41943039 20453376 5 Extended
/dev/sda5 1038336 22009855 10485760 83 Linux

# 保存分区
命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。

# 检查磁盘是否是MBR分区方式
[root@zhoulijie ~]# fdisk -l /dev/sda | grep 类型
磁盘标签类型:dos

# 安装parted, 刷新内核立即生效,无需重启
[root@zhoulijie ~]# yum -y install parted
[root@zhoulijie ~]# partprobe /dev/sda

gdisk分区

在这里可以把刚才加入的磁盘拿出来使用:/dev/sdc,下面sda都皆是指代sdc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 安装gdisk工具
[root@zhoulijie ~]# yum -y install gdisk

[root@zhoulijie ~]# gdisk /dev/sda
Command (? for help): n //创建新分区
Partition number (1-128, default 1): //默认回车
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: //默认扇区回车
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +505M //分配505M空间
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): //默认回车
Changed type of partition to 'Linux filesystem'

Command (? for help): p //打印查看
Disk /dev/sda: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 2EFF9F0B-87D9-4140-9ECE-AFBE23BB0C81
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 40908733 sectors (19.5 GiB)

Number Start (sector) End (sector) Size Code Name
1 2048 1036287 505.0 MiB 8300 Linux filesystem



Command (? for help): w //保存分区

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y //确认
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

# 检查磁盘是否是gpt格式
[root@zhoulijie ~]# fdisk -l /dev/sda | grep 类型
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
磁盘标签类型:gpt

# 安装parted, 刷新内核立即生效,无需重启
[root@zhoulijie ~]# yum -y install parted
[root@zhoulijie ~]# partprobe /dev/sda

磁盘格式化

使用mkfs命令格式化磁盘,创建文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# mkfs常用的选项有
-b //设定数据区块占用空间大小,目前支持1024、2048、4096 bytes每个块。
-t //用来指定什么类型的文件系统,可以是ext3,ext4, xfs
-i //设定inode的大小
-N //设定inode数量,防止Inode数量不够导致磁盘不足
-L //预设该分区的标签label

# 首先使用lsblk,列出磁盘分区情况
[root@zhoulijie ~]# lsblk

# 格式化整个sdb磁盘为ext4文件系统
[root@localhost ~]# mkfs.ext4 /dev/sdb1

# 也可以使用-t指定方式创建ext4文件系统
[root@localhost ~]# mkfs -t ext4 /dev/sdb1

# 也可以格式化sdb1分区为xfs文件系统
[root@localhost ~]# mkfs.xfs /dev/sdb1

磁盘挂载

在上面的内容中讲到了磁盘的分区和格式化, 那么格式化完了后, 如何使用, 这就涉及到了挂载这块磁盘

挂载分区前需要创建挂载点, 挂载点以目录形式出现
如果往挂载点目录写入数据, 实际上会写入到该分区
挂载点建议是空目录, 不是也不影响挂载分区的使用,但是会隐藏原有的文件

临时挂载磁盘

1
2
3
4
5
6
7
8
9
10
11
命令:mount挂载磁盘,实质为文件系统指定访问入口
mount -t //指定文件系统挂载分区,如ext3,ext4, xfs
mount -a //重新读取/etc/fstab配置文件的所有分区
mount -o //指定挂载参数

# fstab被损坏情况下,让只读文件系统可写(正常情况下不使用)
[root@localhost ~]#mount -o rw,remount /

# 挂载/dev/sdb1至db1目录
[root@localhost ~]# mkdir /db1
[root@localhost ~]# mount -t xfs /dev/sdb1 /db1

永久挂载磁盘

1
2
3
4
5
6
7
8
9
10
11
12
13
//使用blkid命令获取各分区的UUID
[root@localhost ~]# blkid |grep "sdb1"
/dev/sdb1: UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" TYPE="xfs"

//使用UUID挂载磁盘sdb1分区至于db1, 临时挂载
[root@localhost ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" /db1

//也可以把下面这行写到/etc/fstab中,永久挂载, 开机自动挂载
[root@localhost ~]# tail -1 /etc/fstab
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0

//加载fstab配置文件, 同时检测语法是否有错误
[root@localhost ~]# mount –a

fstab配置文件介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# vim /etc/fstab

//分区标识(UUID或设备名) 挂载点 文件类型 挂载参数 不检查 不备份
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0

//挂载参数, 可写fstab配置文件, 也可以mount时使用-o参数指定
参数 参数意义 系统默认值
async 系统每隔一段时间把内存数据写入磁盘中,
sync 时时同步内存和磁盘中数据;
suid,nosuid 允许/不允许分区有suid属性 suid
rw,ro 可以指定文件系统是只读(ro)或可写(rw) rw
exec,noexec 允许/不允许可执行文件执行,不要挂载根分区 exec
user,nouser 允许/不允许root外的其他用户挂载分区 nouser
auto,noauto 开机自动挂载/不自动挂载 auto
default 默认文件系统挂载设置 rw, suid, dev, exec, auto, nouser, async

//加载所有配置
[root@localhost ~]# mount -a

卸载挂载磁盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
umount -lf  //强制卸载挂载

//使用站点目录卸载
[root@localhost ~]# umount /db1
//使用设备名卸载/dev/sdb1
[root@localhost ~]# umount /dev/sdb1


//umount不能卸载的情况
[root@localhost db1]# umount /db1
umount: /db1: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1)

//如上情况解决办法有两种, 切换至其他目录 或使用'-l'选项强制卸载
[root@localhost db1]# umount -l /db1

学以致用环节

创建/mnt/cdrom目录,首先临时挂载光盘镜像,光盘镜像在/dev/cdrom

其次卸载挂载磁盘,然后永久挂载,写出详细的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@zhoulijie ~]# mkdir /mnt/cdrom
[root@zhoulijie ~]# mount /dev/cdrom /mnt/cdrom
mount: /dev/sr0 写保护,将以只读方式挂载
[root@zhoulijie ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.4G 14G 20% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 5.9M 987M 1% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 28K 199M 1% /run/user/0
/dev/sr0 iso9660 3.8G 3.8G 0 100% /mnt/cdrom
[root@zhoulijie ~]# umount /mnt/cdrom
[root@zhoulijie ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.4G 14G 20% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 5.9M 987M 1% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 28K 199M 1% /run/user/0
[root@zhoulijie ~]# vim /etc/fstab
[root@zhoulijie ~]# cat /etc/fstab | tail -n 1
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0
[root@zhoulijie ~]# mount -a
mount: /dev/sr0 写保护,将以只读方式挂载
[root@zhoulijie ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.4G 14G 20% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 5.9M 987M 1% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 28K 199M 1% /run/user/0
/dev/sr0 iso9660 3.8G 3.8G 0 100% /mnt/cdrom

交换分区swap

交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。

交换分区一般指定虚拟内存的大小为实际内存的1~1.5倍。如果实际内存超过8GB,可以直接划分16GB给虚拟内存即可,如果虚拟内存不够用的情况,须增加一个虚拟磁盘,由于不能给原有的磁盘重新分区,所以可以选择新建。

创建swapfile

1
2
3
4
5
6
7
[root@localhost ~]# dd if=/dev/zero of=/opt/newdisk bs=1M count=1024
//if:指定源 一般写/dev/zero
//of:指定目标
//bs:定义块大小
//count:数量

# 一般适用于制作光盘

格式化swap分区

1
2
3
[root@zhoulijie ~]# mkswap -f /opt/newdisk
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=f8ce4f29-2c01-4d93-8e9c-f1f7d7349526

检测当前swap分区情况

1
2
3
4
[root@zhoulijie ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 958M 78M 24M 947M 766M
Swap: 2.0G 16K 2.0G

开启新建的swap分区情况

1
2
3
4
5
6
7
[root@zhoulijie ~]# swapon /opt/newdisk
swapon: /opt/newdisk:不安全的权限 0644,建议使用 0600。
[root@zhoulijie ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 959M 77M 24M 947M 765M
Swap: 3.0G 16K 3.0G
# 此时此刻这里多出来1G

关闭新建的swap分区

1
2
3
4
5
6
[root@zhoulijie ~]# swapoff /opt/newdisk
[root@zhoulijie ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 958M 78M 24M 947M 766M
Swap: 2.0G 16K 2.0G
# 还原到原来的2G

生产磁盘故障案例

Inode被占满,导致磁盘有可用的剩余空间也无法继续使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
[root@localhost ~]# mkfs.ext4 -i 1024 /opt/newdisk
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount -t ext4 -o loop /opt/newdisk /data/

//inode被占满
[root@localhost ~]# touch {1..20000}
touch: cannot touch `19997': No space left on device
touch: cannot touch `19998': No space left on device
touch: cannot touch `19999': No space left on device
touch: cannot touch `20000': No space left on device

//inode被占满,剩余block也是无法继续使用
[root@localhost ~]# df -i|grep data
/opt/newdisk 1024 1024 0 100% /data
[root@localhost ~]# df -h|grep data
/opt/newdisk 891K 34K 806K 5% /data

Block空间即将被占满, 但删除大文件也没有释放空间

假设现在线上正在运行Nginx服务, Nginx产生的日志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启Nginx的方式如何处理

1
2
3
4
5
6
7
//是会删除文件, 但Nginx持续占用着文件, 所以空间并不会被释放
rm -f access.log

//正确做法如下, 清空该文件即可释放文件内容
> access.log
# 意思就是echo “” > access.log
# 标准覆盖输出

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
例子: 给系统新增加一个交换分区(swap)

考试题目:一般是要求新建一个分区,并且把分区作为swap分区使用

查看内存和交换分区的使用情况
# free -m
total used free shared buffers cached
Mem: 1841 613 1227 16 0 258
-/+ buffers/cache: 354 1486
Swap: 0 0 0 <--- 没有交换分区

# swapon -s 也能用该命令查看,只是默认也是没有交换分区所有没有输出

# fdisk -l /dev/sdb
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 6293503 2097152 83 Linux <---准备把该分区作为交换分区



1、新建一个分区,并且把分区类型更改为82
新分区我们在上面的练习已经完成了,所以本例子不用分区,而是需要修改该分区的类型

# fdisk /dev/sdb

命令(输入 m 获取帮助):l 列出所有支持的分区类型对应的id

命令(输入 m 获取帮助):t 修改分区id
分区号 (1-5,默认 5):2 修改第2个分区
Hex 代码(输入 L 列出所有代码):82 修改成id为82
已将分区“Linux”的类型更改为“Linux swap / Solaris”

命令(输入 m 获取帮助):p

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 6293503 2097152 82 Linux swap / Solaris <---修改成功


命令(输入 m 获取帮助):w

强烈建议: 对分区做了修改后都刷新一下
# partprobe /dev/sdb


2、把sdb2格式化为交换分区
# mkswap /dev/sdb2
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=ba08eb90-2003-44e6-9769-9a9351aebb05


3、启动交换分区
# swapon /dev/sdb2 或者 # swanon -a 启动所有交换分区


查看
# swapon -s
文件名 类型 大小 已用 权限
/dev/sdb2 partition 2097148 0 -1


4、持久化保存交换分区的使用
# blkid /dev/sdb2
/dev/sdb2: UUID="ba08eb90-2003-44e6-9769-9a9351aebb05" TYPE="swap"

# vim /etc/fstab
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=cb3299d6-16e0-4644-9686-27907eefb8f3 /boot xfs defaults 0 0
UUID=ba08eb90-2003-44e6-9769-9a9351aebb05 swap swap defaults 0 0

源码安装管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

源码包基本概述

在linux环境下面安装源码包是比较常见的,在早期运维管理工作当中,大部分软件都是通过源码安装的。那么安装一个源码包,是需要我们自己把源代码编译成二进制的可执行文件。

源码包的编译用到了linux系统里的编译器,通常源码包都是用C语言开发的,这也是因为C语言为linux上最标准的程序语言。Linux上的C语言编译器叫做gcc,利用它就可以把C语言变成可执行的二进制文件。所以如果你的机器上没有安装gcc就没有办法去编译源码。可以使用yum -y install gcc来完成安装。

源码包的好处

  • 自定义修改源代码
  • 定制需要的相关功能
  • 新版软件优先更新源码

源码包的获取

官方网站, 可以获得最新的软件包

Apache官方网站

Nginx官方网站

Mysql官方网站

例如在nginx官网上下载nginx安装包

  • 首先我们提前在windows上面进入nginx网站,找到下载,找打一个包右键,选择复制链接地址
  • 进入Linux系统,输入以下命令
1
[root@zhoulijie ~]# wget
  • 将复制的地址粘贴上去
1
[root@zhoulijie ~]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
  • 在当前目录就可以ls出我们下载下来的文件
1
2
3
[root@zhoulijie ~]# ls
anaconda-ks.cfg nginx-1.14.2.tar.gz 模板 图片 下载 桌面
initial-setup-ks.cfg 公共 视频 文档 音乐

源码包的分类

  • 源码格式(需要编译安装)
  • 二进制格式(解压后可以直接使用)

源码包的安装

编译需要编译环境,开发环境,开发库,开发工具。 常用的编译环境有c、c++、perl、java、python5种 c环境的编译器:gcc(GNU C Complier) c++环境的编译器:g++ make:c、c++的统一项目管理工具,编译时有可能调用gcc也有可能调用g++。使用makefile文件定义make按何种次序去编译源程序文件中的源程序

源码安装三部曲(常见):
第一步: ./configure(定制组件)

1.指定安装路径,例如 –prefix=/opt/nginx-1.12
2.启用或禁用某项功能, 例如 –enable-ssl
3.和其它软件关联,例如–with-pcre
4.检查安装环境,例如是否有编译器 gcc,是否满足软件的依赖需求
5.检测通过后生成Makefile文件

第二步: make

1.执行make命令进行编译, 可以使用-j指定CPU核心数进行编译
2.按Makefile文件进行编译, 编译成可执行二进制文件
3.生成各类模块和主程序

第三步: make install

1.按Makefile定义好的路径拷贝至安装目录中

上面介绍的源码三部曲不能百分百通用于所有源码包, 也就是说源码包的安装并非存在标准安装步骤,但是大部分源码安装都是类似的步骤

建议:
拿到源码包解压后,然后进入到目录找相关的帮助文档,通常会以INSTALL或者README为文件名

configure脚本的功能

  • 让用户选定编译特性
  • 检查编译环境是否符合程序编译的基本需要

源码包编译事例

下面我们就来实战一番

在linux中编译nginx 启动nginx服务

1
2
[root@zhoulijie ~]# tar -xf nginx-1.14.2.tar.gz
[root@zhoulijie ~]# cd nginx-1.14.2/
  • 源码安装三部曲

第一步: ./configure

1
2
3
4
5
6
[root@zhoulijie nginx-1.14.2]# ./configure
checking for OS
+ Linux 3.10.0-693.el7.x86_64 x86_64
checking for C compiler ... not found

./configure: error: C compiler cc is not found

哦霍,完蛋 出征未捷身先死。那么往下看吧

1
2
// 解决方法
[root@zhoulijie nginx-1.14.2]# yum install -y gcc gcc-c++ make

再次执行

1
2
3
4
5
6
7
[root@zhoulijie nginx-1.14.2]# ./configure
........................省略一大片....................

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

下面来看解决办法

1
[root@zhoulijie nginx-1.14.2]# yum install -y pcre-devel

再次执行

1
2
3
4
5
6
7
[root@zhoulijie nginx-1.14.2]# ./configure
........................省略一大片....................

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

下面来看解决办法

1
[root@zhoulijie nginx-1.14.2]# yum -y install zlib-devel

再次执行

1
2
3
4
5
6
7
8
9
10
11
[root@zhoulijie nginx-1.14.2]# ./configure
........................省略一大片....................

nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"

出现这样就表示完成,其实还有一种错误,这里由于我可能安装openssl-devel

1
2
3
4
5
6
7
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL
library into the system, or build the OpenSSL library statically
from the source with nginx by using --with-openssl=<path> option.

// 解决办法
yum install openssl-devel

第二步:make

1
[root@zhoulijie nginx-1.14.2]# make

第三步: make instal

1
2
3
4
5
6
[root@zhoulijie nginx-1.14.2]# make install

// 此时未知是否安装好,可以使用echo $?
[root@zhoulijie nginx-1.14.2]# echo $?
0
## 0代表没有错误 1代表错误
  • 启动nginx
1
2
3
4
5
6
7
8
9
[root@zhoulijie nginx-1.14.2]# ls
[root@zhoulijie nginx-1.14.2]# cd objs/
[root@zhoulijie objs]# ./nginx
[root@zhoulijie objs]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:80 *:*

## nginx 80端口

实验成果

编译安装注意事项

  • 如果安装时不是使用的默认路径,则必须要修改PATH环境变量,以能够识别此程序的二进制文件路径;
    • 修改/etc/profile文件或在/etc/profile.d/目录建立一个以.sh为后缀的文件,在里面定义export PATH=$PATH:/path/to/somewhere
  • 默认情况下,系统搜索库文件的路径只有/lib,/usr/lib
    • 增添额外库文件搜索路径方法:
      • 在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中。此时库文件增添的搜索路径重启后有效,若要使用增添的路径立即生效则要使用ldconfig命令
    • ldconfig:通知系统重新搜索库文件
1
2
3
4
/etc/ld.so.conf和/etc/ls.so.conf.d/*.conf    //配置文件
/etc/ld.so.cache //缓存文件
-v //显示重新搜索库的过程
-p //打印出系统启动时自动加载并缓存到内存中的可用库文件名及文件路径映射关系
  • 头文件:输出给系统
    • 默认:系统在/usr/include中找头文件,若要增添头文件搜索路径,使用链接进行
  • man文件路径:安装在–prefix指定的目录下的man目录
    • 默认:系统在/usr/share/man中找man文件。此时因为编译安装的时候不是安装到默认路径下,如果要查找man文件则可以使用以下两种方法:
      • man -M /path/to/man_dir command
      • 在/etc/man.config文件中添加一条MANPATH

网络进阶管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

链路聚合

网卡的链路聚合就是将多块网卡连接起来,当一块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度。

桥接网络

桥接网络也即网桥,可基于MAC地址在网络间转发流量。网桥识别哪些主机连接到每个网络,构建MAC地址表,然后根据该表做出包转发决策。

软件网桥的最常见应用是在虚拟化应用程序中,用于在一个或多个虚拟NIC中共享一个硬件NIC。

链路聚合配置

配置bond聚合链路

配置bong0

1
2
3
4
5
6
7
[root@zhoulijie ~]# nmcli device
设备 类型 状态 连接
virbr0 bridge 连接的 virbr0
eth0 ethernet 连接的 eth0
eth1 ethernet 已断开 --
lo loopback 未托管 --
virbr0-nic tun 未托管 --
创建bond0, 模式为balance-rr,名字为zhoulijie
1
2
[root@zhoulijie ~]# nmcli connection add type bond mode balance-rr con-name zhoulijie ifname bond0 ipv4.method manual ipv4.addresses 192.168.83.250/24 ipv4.gateway 192.168.83.2 ipv4.dns 192.168.83.2
连接“zhoulijie”(99fe45cb-5d4a-4288-b0b1-1fd2202d25e1) 已成功添加。
添加物理网卡至bond0
1
2
3
4
[root@zhoulijie ~]# nmcli connection add type bond-slave con-name zlj ifname eth0 master bond0
连接“zlj”(4a185231-5752-4e60-b20d-92fce9ed90e2) 已成功添加。
[root@zhoulijie ~]# nmcli connection add type bond-slave con-name zlj1 ifname eth1 master bond0
连接“zlj1”(2883fd9a-2ce9-4e51-bde2-679b3920fae5) 已成功添加。
查看bond配置信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@zhoulijie ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:cc:71
Slave queue ID: 0
关闭eth0网卡, 测试bond0是否正常
1
2
[root@zhoulijie ~]# nmcli device disconnect eth0
成功断开设备 'eth0'

配置bong1

1
2
3
4
5
6
7
[root@zhoulijie ~]# nmcli device
设备 类型 状态 连接
virbr0 bridge 连接的 virbr0
eth0 ethernet 连接的 eth0
eth1 ethernet 已断开 --
lo loopback 未托管 --
virbr0-nic tun 未托管 --
创建bond1,模式为active-backup,名字为zhoulijie
1
2
[root@zhoulijie ~]# nmcli connection add type bond con-name zhoulijie ifname bond1 mode active-backup ipv4.method manual ipv4.addresses 192.168.83.250/24 ipv4.gateway 192.168.83.2 ipv4.dns 192.168.83.2
连接“zhoulijie”(c4c7078e-f912-46fd-af84-6c414267a45b) 已成功添加。
添加物理网卡连接至bond1
1
2
3
4
[root@zhoulijie ~]# nmcli connection add type bond-slave con-name zlj ifname eth0 master bond1
连接“zlj”(280b5deb-e05f-45f7-b771-1c2a325b63c7) 已成功添加。
[root@zhoulijie ~]# nmcli connection add type bond-slave con-name zlj1 ifname eth1 master bond1
连接“zlj1”(d0c28c77-5808-43cc-86f2-f2aefda5304f) 已成功添加。
启用连接
1
2
3
4
5
6
[root@zhoulijie ~]# nmcli connection up zhoulijie
成功激活(主服务器等待从服务器)连接(D-Bus 激活路径:/org/freedesktop/NetworkManager/ActiveConnection/7)
[root@zhoulijie ~]# nmcli connection up zlj
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/9)
[root@zhoulijie ~]# nmcli connection up zlj1
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/10)
验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@zhoulijie ~]# cat /proc/net/bonding/bond1
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:cc:67
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:cc:71
Slave queue ID: 0
停止eth0物理网卡设备
1
2
[root@zhoulijie ~]# nmcli device disconnect eth0
成功断开设备 'eth0'
eth1物理网卡设备会进行自动切换
1
2
[root@zhoulijie ~]# grep "Currently Active Slave" /proc/net/bonding/bond1
Currently Active Slave: eth1

配置team聚合链路

centos/rhce7使用teaming实现聚合链路,能够提供网卡绑定之后的网络吞吐性能,并且提供网卡的故障切换处理能力。
Team是基于一个小型内核驱动实现聚合链路,在用户层提供teamd命令实现链路管理。

teamd可以实现以下模式的聚合链路

broadcast 广播容错
roundrobin 负载轮询
activebackup 主备(必考)
loadbalance 负载均衡
lacp 需要交换机支持lacp协议

请使用命令行配置,图形界面配置不稳定
1
2
[root@zhoulijie ~]# nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}' ipv4.addresses 192.168.83.222/24 ipv4.gateway 192.168.83.2 ipv4.dns 192.168.83.2 ipv4.method manual
连接“team0”(80474187-7e56-4874-9d24-e228cb39b851) 已成功添加。
添加物理网卡连接至team0
1
2
3
4
[root@zhoulijie ~]# nmcli connection add type team-slave con-name team0-port1 ifname eth1 master team0
连接“team0-port1”(4c6539de-8ea3-43fc-beb1-598587a8c05f) 已成功添加。
[root@zhoulijie ~]# nmcli connection add type team-slave con-name team0-port2 ifname eth2 master team0
连接“team0-port2”(0798fb06-daee-4b5f-bd1f-8ad455964cb6) 已成功添加。
检查team0状态
1
2
[root@zhoulijie ~]# ping -I team0 192.168.83.222
[root@zhoulijie ~]# teamdctl team0 state
断掉后检测
1
2
[root@zhoulijie ~]# nmcli dev disconnect eth1
[root@zhoulijie ~]# teamdctl team0 state

动态修改team模式

1
2
3
4
5
6
7
8
9
10
11
// 导出配置进行修改 (man teamd.conf)
[root@zhoulijie ~]# teamdctl team0 config dump > /tmp/team.conf
[root@zhoulijie ~]# vim /tmp/team.conf

//以最新修改的配置选项修改team0属性
[root@zhoulijie ~]# nmcli con mod team0 team.config /tmp/team.conf

//修改之后需要重启team0
[root@zhoulijie ~]# nmcli connection down team0;nmcli connection up team0
[root@zhoulijie ~]# nmcli connection up team0-port1
[root@zhoulijie ~]# nmcli connection up team0-port2

桥接网络配置

创建桥接网络br1
1
[root@zhoulijie ~]# nmcli connection add type bridge con-name br1 ifname br1 ipv4.addresses 192.168.83.222/24 ipv4.method manual
桥接至eth1
1
[root@zhoulijie ~]# nmcli connection add type bridge-slave con-name br1-port1 ifname eth1 master br1 nmcli connection add type bridge-slave con-name br1-port1 ifname eth1 master br1
1
2
[root@zhoulijie ~]# ping -I br1 192.168.83.1
[root@zhoulijie ~]# brctl show

网络基础管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

网卡命名

传统网卡命名机制

传统命名:

以太网eth[0,1,2,…]

wlan[0,1,2,…]

redhat7网卡命名机制

systemd对网络设备的命名方式:

  1. 如果Firmware或BIOS为主板上集成的设备提供的索引信息可用,且可预测,则根据此索引进行命名,例如eno1
  2. 如果Firmware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名,例如ens1
  3. 如果硬件接口的物理位置信息可用,则根据此信息进行命名,例如enp2s0
  4. 如果用户显式启动,也可根据MAC地址进行命名,例如enx2387a1dc56
  5. 上述均不可用时,则使用传统命名机制

上述命名机制中,有的需要biosdevname程序的参与。所以必须安装biosdevname程序且启用它。

网络接口名称组成格式

网卡设备的命名过程

  1. udev,辅助工具程序/lib/udev/rename_device会根据/usr/lib/udev/rules.d/60-net.rules中的信息设定网卡名称
  2. biosdevname会根据/usr/lib/udev/rules.d/71-biosdevname.rules中的信息设定网卡名称
  3. 通过udev检测网络接口设备,根据/usr/lib/udev/rules.d/75-net-description中的变量信息设定网卡名称

回归传统命名

修改网卡配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@zhoulijie ~]# cd /etc/sysconfig/network-scripts/
[root@zhoulijie network-scripts]# mv ifcfg-ens33 ifcfg-eth0
[root@zhoulijie network-scripts]# vim ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth0 //此处要把ens33改成eth0
UUID=bb501ad9-f26f-4310-b857-14a1fc520546
DEVICE=eth0 //此处要把ens33改成eth0
ONBOOT=yes
IPADDR=192.168.83.140
NETMASK=255.255.255.0
GATEWAY=192.168.83.2
DNS1=192.168.83.2
编辑/etc/default/grub配置文件

在以GRUB_CMDLINE_LINUX开头的行内rhgb的前面加上net.ifnames=0 biosdevname=0

1
2
3
4
5
6
7
8
[root@zhoulijie network-scripts]# vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap net.ifnames=0 biosdevname=0 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
为grub2生成其配置文件
1
2
3
4
5
6
7
[root@zhoulijie network-scripts]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-fd0bcf5782d24ba5b903b175c35f328e
Found initrd image: /boot/initramfs-0-rescue-fd0bcf5782d24ba5b903b175c35f328e.img
done
重启系统
1
[root@zhoulijie network-scripts]# reboot

网络管理常用命令

ifconfig

查看当前处于活动状态的所有网络接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@zhoulijie ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.83.140 netmask 255.255.255.0 broadcast 192.168.83.255
inet6 fe80::20c:29ff:feab:cc67 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ab:cc:67 txqueuelen 1000 (Ethernet)
RX packets 694 bytes 64096 (62.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 435 bytes 53145 (51.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 18 bytes 1624 (1.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 18 bytes 1624 (1.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:f0:f8:b0 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
仅查看单个网卡状态
1
2
3
4
5
6
7
8
9
[root@zhoulijie ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.83.140 netmask 255.255.255.0 broadcast 192.168.83.255
inet6 fe80::20c:29ff:feab:cc67 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ab:cc:67 txqueuelen 1000 (Ethernet)
RX packets 726 bytes 66886 (65.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 453 bytes 56481 (55.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
查看所有网卡状态信息, 包括禁用和启用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@zhoulijie ~]# ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.83.140 netmask 255.255.255.0 broadcast 192.168.83.255
inet6 fe80::20c:29ff:feab:cc67 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ab:cc:67 txqueuelen 1000 (Ethernet)
RX packets 763 bytes 70122 (68.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 475 bytes 60789 (59.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 18 bytes 1624 (1.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 18 bytes 1624 (1.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:f0:f8:b0 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0-nic: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 52:54:00:f0:f8:b0 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
网卡配置信息含义如下

UP: 网卡处于活动状态

BROADCAST: 支持广播

RUNNING: 网线已接入

MULTICAST: 支持组播

MTU: 最大传输单元(字节),即此接口一次所能传输的最大封包

inet: 显示IPv4地址行

inet6: 显示IPv6地址行

link/enther: 指设备硬件(MAC)地址

txqueuelen: 传输缓存区长度大小

RX packets: 接收的数据包

TX packets: 发送的数据包

errors: 总的收包的错误数量

dropped: 由于各种原因, 导致拷贝在内存过程中被丢弃

collisions: 网络信号冲突情况, 值不为0则可能存在网络故障

IP

//语法:ip [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT:
link:网络接口属性
addr:协议地址
route:路由

查看网络有接口地址
1
2
3
4
5
6
7
8
9
[root@zhoulijie ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:ab:cc:67 brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT qlen 1000
link/ether 52:54:00:f0:f8:b0 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT qlen 1000
link/ether 52:54:00:f0:f8:b0 brd ff:ff:ff:ff:ff:ff
显示报文统计信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@zhoulijie ~]# ip -s link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
1624 18 0 0 0 0
TX: bytes packets errors dropped carrier collsns
1624 18 0 0 0 0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:ab:cc:67 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
35806 380 0 0 0 0
TX: bytes packets errors dropped carrier collsns
27393 240 0 0 0 0
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT qlen 1000
link/ether 52:54:00:f0:f8:b0 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT qlen 1000
link/ether 52:54:00:f0:f8:b0 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
1
2
[root@zhoulijie ~]# ip link set lo down
[root@zhoulijie ~]# ip link set lo up
查看网络接口的地址
1
2
3
4
5
6
7
[root@zhoulijie ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ab:cc:67 brd ff:ff:ff:ff:ff:ff
inet 192.168.83.140/24 brd 192.168.83.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feab:cc67/64 scope link
valid_lft forever preferred_lft forever
添加IP地址
1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# ip addr add 192.168.83.141/24 dev eth0
[root@zhoulijie ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ab:cc:67 brd ff:ff:ff:ff:ff:ff
inet 192.168.83.140/24 brd 192.168.83.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.83.141/24 scope global secondary eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feab:cc67/64 scope link
valid_lft forever preferred_lft forever
删除IP地址
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# ip addr del 192.168.83.141/24 dev eth0
[root@zhoulijie ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ab:cc:67 brd ff:ff:ff:ff:ff:ff
inet 192.168.83.140/24 brd 192.168.83.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feab:cc67/64 scope link
valid_lft forever preferred_lft forever

路由管理

ip route:routing table management

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//添加路由:ip route add TARGET via GW dev IFACE src SOURCE_IP
TARGET:
主机路由:IP
网络路由:NETWORK/MASK

//删除路由:ip route del TARGET
TARGET:
主机路由:IP
网络路由:NETWORK/MASK

//查看路由:ip route show

//刷新路由表:ip route flush
[dev IFACE]
[via PREFIX]

route

Linux主机之间是使用IP进行通信, 假设A主机和B主机同在一个网段内且网卡都处于激活状态, 则A具备和B直接通信的能力, 但如果A主机和B主机处于两个不同的网段, 则A必须通过路由器才能和B通信, 路由器属于IT设备的基础设施, 每一个网段都应该至少有一个网关

查看当前路由表
1
2
3
4
5
6
[root@zhoulijie ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 eth0
192.168.83.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
以数字方式显示各主机或端口等相关信息
1
2
3
4
5
6
[root@zhoulijie ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.83.2 0.0.0.0 UG 100 0 0 eth0
192.168.83.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0

增加路由
语法:route add [-net|-host] target [netmask Nm][gw Gw] [[dev] If]

增加网段路由
1
2
[root@zhoulijie ~]# route add -net 192.168.83.0/24 gw 192.168.83.2 dev eth0
[root@zhoulijie ~]# route add -net 0.0.0.0 gw 192.168.83.2 dev eth0
增加主机路由
1
[root@zhoulijie ~]# route add -host 192.168.83.144 gw 192.168.83.2
删除路由
1
2
[root@zhoulijie ~]# route del -net 192.168.83.0/24
[root@zhoulijie ~]# route del -net 0.0.0.0/0 gw 192.168.83.2

hostname与hostnamectl

生产环境中必须配置主机名,同时主机名也需要遵循一定的规范, 比如:

地区 项目 业务 服务 节点 地址
wuhan Supermarket Library file mysql master01 192.168.83.1
guangzhou Bank Library file mysql master01 192.168.83.111
shanghai Street Library file mysql master01 192.168.83.10
查看主机名
1
2
[root@zhoulijie ~]# hostname
zhoulijie
hostname临时修改主机名
1
2
3
[root@zhoulijie ~]# hostname 123
[root@zhoulijie ~]# bash
[root@123 ~]#
设置永久主机名
1
2
3
4
5
[root@123 ~]# vim /etc/hostname
[root@123 ~]# cat /etc/hostname
zhoulijie
[root@123 ~]# bash
[root@zhoulijie ~]#

注意: 在Linux中以命令方式修改网络配置只在当前状态有效,重启后将失效。故若想使修改的配置重启后依然有效,则必须编辑配置文件进行配置的修改。

网络相关配置文件

网络配置文件

网络配置文件:/etc/sysconfig/network

1
2
NETWORKING={yes|no}:设定整个系统是否启用网络功能,若设为no,则不论网卡如何设置都不能使用网络功能。
HOSTNAME:设置主机名

网络接口配置文件

网络接口即网卡,其配置文件的路径是/etc/sysconfig/network-scripts/ifcfg-INTERFACE_NAME

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@zhoulijie ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet //接口类型。常见的接口类型有:Ethernet,Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static //引导协议,可选值有{static|none|dhcp|bootp}。如果要使用静态地址,使用static或none都可以
DEFROUTE=yes //将接口设定为默认路由[yes|no]
IPV4_FAILURE_FATAL=no
NAME=eth0 //连接名称
UUID=bb501ad9-f26f-4310-b857-14a1fc520546 //设备的惟一标识
DEVICE=eth0 //关联的设备名称,要与文件名的后半部"INTERFACE_NAME"保持一致
ONBOOT=yes //在系统引导时是否自动激活此网络接口,可选值有{ yes | no }
IPADDR=192.168.83.140 //固定IP地址
NETMASK=255.255.255.0 //子网掩码
GATEWAY=192.168.83.2 //默认网关
DNS1=192.168.83.2 //第一个DNS服务器指向(还可以有DNS2、DNS3)

路由配置文件

路由配置文件的路径是/etc/sysconfig/network-scripts/route-INTERFACE_NAME

添加格式1:

1
2
3
[root@zhoulijie ~]# vim /etc/sysconfig/network-scripts/route-eth0
[root@zhoulijie ~]# cat /etc/sysconfig/network-scripts/route-eth0
192.168.83.0/24 via 192.168.83.2

添加格式2:

1
2
3
4
5
[root@zhoulijie ~]# vim /etc/sysconfig/network-scripts/route-eth0
[root@zhoulijie ~]# cat /etc/sysconfig/network-scripts/route-eth0
ADDRESS0=192.168.83.0
NETMASK0=255.255.255.0
GATEWAY0=192.168.83.2

DNS配置文件

DNS配置文件的路径是/etc/resolv.conf

1
2
3
4
[root@zhoulijie ~]# vim /etc/resolv.conf
[root@zhoulijie ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.83.2

NerworkManager管理网络

RHEL/CentOS7系统默认使用NetworkManager来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。
NetworkManager提供的命令行和图形配置工具对网络进行设定, 设定保存的配置文件在/etc/sysconfig/network-scripts目录下, 工具有 nmcli, nmtui, nm-connect-editor

device物理设备, 例如 ens33,enp2s0,virbr0,team0
connection连接设置, 具体网络配置方案

1.不同的网络连接配置可以应用到相同的物理设备,但物理设备同一时间只能应用其中某个网络连接
2.针对物理网络接口, 设定不同的网络连接, 在不同的使用环境中激活相应的网络连接,就可以实现网络配置信息的自动切换了

使用nmcli命令查看设备以及连接情况

查看设备状态
1
2
3
4
5
6
[root@zhoulijie ~]# nmcli device
设备 类型 状态 连接
virbr0 bridge 连接的 virbr0
eth0 ethernet 连接的 eth0
lo loopback 未托管 --
virbr0-nic tun 未托管 --
查看指定设备的详细状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@zhoulijie ~]# nmcli device show eth0
GENERAL.设备: eth0
GENERAL.类型: ethernet
GENERAL.硬盘: 00:0C:29:AB:CC:67
GENERAL.MTU: 1500
GENERAL.状态: 100 (连接的)
GENERAL.连接: eth0
GENERAL.连接路径: /org/freedesktop/NetworkManager/ActiveConnection/1
WIRED-PROPERTIES.载波: 开
IP4.地址[1]: 192.168.83.140/24
IP4.网关: 192.168.83.2
IP4.路由[1]: dst = 192.168.83.144/32, nh = 192.168.83.2, mt = 0
IP4.DNS[1]: 192.168.83.2
IP6.地址[1]: fe80::20c:29ff:feab:cc67/64
IP6.网关: --
查看连接状态
1
2
3
4
[root@zhoulijie ~]# nmcli connection
名称 UUID 类型 设备
eth0 bb501ad9-f26f-4310-b857-14a1fc520546 802-3-ethernet eth0
virbr0 d8b4e76e-b469-4ff4-8937-cef5cc254873 bridge virbr0
查看所有活动的连接
1
2
3
4
[root@zhoulijie ~]# nmcli connection show
名称 UUID 类型 设备
eth0 bb501ad9-f26f-4310-b857-14a1fc520546 802-3-ethernet eth0
virbr0 d8b4e76e-b469-4ff4-8937-cef5cc254873 bridge virbr0
查看指定设备连接的详细情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
[root@zhoulijie ~]# nmcli connection show eth0
connection.id: eth0
connection.uuid: bb501ad9-f26f-4310-b857-14a1fc520546
connection.stable-id: --
connection.interface-name: eth0
connection.type: 802-3-ethernet
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (默认)
connection.timestamp: 1555937607
connection.read-only: no
connection.permissions: --
connection.zone: --
connection.master: --
connection.slave-type: --
connection.autoconnect-slaves: -1 (默认)
connection.secondaries: --
connection.gateway-ping-timeout: 0
connection.metered: 未知
connection.lldp: -1 (default)
802-3-ethernet.port: --
802-3-ethernet.speed: 0
802-3-ethernet.duplex: --
802-3-ethernet.auto-negotiate: no
802-3-ethernet.mac-address: --
802-3-ethernet.cloned-mac-address: --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist: --
802-3-ethernet.mtu: 自动
802-3-ethernet.s390-subchannels: --
802-3-ethernet.s390-nettype: --
802-3-ethernet.s390-options: --
802-3-ethernet.wake-on-lan: 1 (default)
802-3-ethernet.wake-on-lan-password: --
ipv4.method: manual
ipv4.dns: 192.168.83.2
ipv4.dns-search: --
ipv4.dns-options: (默认)
ipv4.dns-priority: 0
ipv4.addresses: 192.168.83.140/24
ipv4.gateway: 192.168.83.2
ipv4.routes: --
ipv4.route-metric: -1
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-timeout: 0
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.dhcp-fqdn: --
ipv4.never-default: no
ipv4.may-fail: yes
ipv4.dad-timeout: -1 (默认)
ipv6.method: ignore
ipv6.dns: --
ipv6.dns-search: --
ipv6.dns-options: (默认)
ipv6.dns-priority: 0
ipv6.addresses: --
ipv6.gateway: --
ipv6.routes: --
ipv6.route-metric: -1
ipv6.ignore-auto-routes: no
ipv6.ignore-auto-dns: no
ipv6.never-default: no
ipv6.may-fail: yes
ipv6.ip6-privacy: -1 (未知)
ipv6.addr-gen-mode: stable-privacy
ipv6.dhcp-send-hostname: yes
ipv6.dhcp-hostname: --
ipv6.token: --
proxy.method: none
proxy.browser-only: no
proxy.pac-url: --
proxy.pac-script: --
GENERAL.名称: eth0
GENERAL.UUID: bb501ad9-f26f-4310-b857-14a1fc520546
GENERAL.设备: eth0
GENERAL.状态: 已激活
GENERAL.默认: 是
GENERAL.默认6: 否
GENERAL.VPN 参数: 否
GENERAL.区: --
GENERAL.DBUS路径: /org/freedesktop/NetworkManager/ActiveConnection/1
GENERAL.连接路径: /org/freedesktop/NetworkManager/Settings/1
GENERAL.指定对象: --
GENERAL.主路径: --
IP4.地址[1]: 192.168.83.140/24
IP4.网关: 192.168.83.2
IP4.路由[1]: dst = 192.168.83.144/32, nh = 192.168.83.2, mt = 0
IP4.DNS[1]: 192.168.83.2
IP6.地址[1]: fe80::20c:29ff:feab:cc67/64
IP6.网关: --

使用原生network管理网络

CentOS/RHEL的网络配置文件默认目录为/etc/sysconfig/network-scripts
默认第一块物理网卡配置文件为ifcfg-eth0, 如果有第二块物理网卡, 配置文件则为ifcfg-eth1以此类推。 注意: 如果新增物理网卡没有配置文件,可选择复制系统默认的进行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//设置NetworkManger开机不启动, 同时停止NetworkManger服务
[root@zhoulijie ~]# systemctl disable NetworkManager
[root@zhoulijie ~]# systemctl stop NetworkManager

//添加一块物理网卡, 然后新增网络连接配置文件
//复制配置eth0配置文件为eth1
[root@zhoulijie ~]# cd /etc/sysconfig/network-scripts/
[root@zhoulijie network-scripts]# cp ifcfg-eth0 ifcfg-eth1

//编辑网卡配置文件
[root@zhoulijie ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth1
UUID=bb501ad9-f26f-4310-b857-14a1fc520546
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.83.141
NETMASK=255.255.255.0
GATEWAY=192.168.83.2
DNS1=192.168.83.2

//重启network网络服务加载网络并设置开机启动
[root@zhoulijie ~]# systemctl restart network
[root@zhoulijie ~]# systemctl enable network

网络检测工具与故障排查

ping

ping命令的目的在于测试另一台主机是否可达, 如果ping不到某台主机,就说明对方主机已经出现了问题, 但是不排除由于链路中的防火墙、ping被丢弃等原因造成ping不通的情况

1
2
3
4
//ping命令常用选项:
-c 指定ping的次数
-i 指定ping包的发送间隔
-w 如果ping没有回应, 则在指定超时时间后退出

host与nslookup

host/nslookup命令用于查询DNS记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@zhoulijie ~]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 180.97.33.107
www.a.shifen.com has address 180.97.33.108

[root@zhoulijie ~]# nslookup www.baidu.com
Server: 192.168.83.2
Address: 192.168.83.2#53

Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 180.97.33.108
Name: www.a.shifen.com
Address: 180.97.33.107

traceroute

traceroute命令用于路由跟踪, 检测网络故障出现在ISP运营商或是对端服务无法响应

1
2
3
4
5
6
7
8
[root@zhoulijie ~]# traceroute www.baidu.com
traceroute to www.baidu.com (180.97.33.107), 30 hops max, 60 byte packets
1 gateway (192.168.83.2) 0.143 ms 0.066 ms 0.089 ms
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *

在武汉地区,路由追踪被运营商限制

在北上广深可以路由追踪

netstat

netstat用于查看网络状态

显示路由表
1
2
3
4
5
6
7
[root@zhoulijie ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
192.168.83.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.83.144 gateway 255.255.255.255 UGH 0 0 0 eth0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
以数字方式显示路由表
1
2
3
4
5
6
7
[root@zhoulijie ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.83.2 0.0.0.0 UG 0 0 0 eth0
192.168.83.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.83.144 192.168.83.2 255.255.255.255 UGH 0 0 0 eth0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
显示建立的tcp连接
1
2
3
[root@zhoulijie ~]# netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
显示udp连接
1
2
3
[root@zhoulijie ~]# netstat -u
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
显示监听状态的连接
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 zhoulijie:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
..................以下省略.......................
显示所有状态的连接
1
2
3
4
5
6
7
8
9
[root@zhoulijie ~]# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 zhoulijie:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
..................以下省略.......................
常用选项

-antlp

1
2
3
4
5
6
7
[root@zhoulijie ~]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:55033 0.0.0.0:* LISTEN 1732/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1726/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
..................以下省略.......................

ss

ss是一种网络状态查看工具,取代netstat

语法:ss [options][ FILTER ]
常用的options:
-t:tcp协议相关
-u:udp协议相关
-w:裸套接字相关
-x:unix套接字相关
-l:listen状态的连接
-a:所有
-n:数字格式
-p:相关的程序及pid
-e:扩展的信息
-m:内存用量
-o:显示计时器信息

1
2
3
4
5
6
7
8
9
10
11
12
13
常见的FILTER:
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
如:ss -tan state ESTABLISHED

常见的state:
//tcp finite state machine:有限状态机
LISTEN:监听
ESTABLISHED:已建立的连接

EXPRESSION:
dport =
sport =
示例:'( dport = :ssh or sport = :ssh)',此处的ssh也即服务名可以使用其对应的端口号代替,等号两边必须有空格
常用组合
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
ESTAB 0 0 172.16.12.128:22 172.16.12.1:56187
ESTAB 0 0 172.16.12.128:22 172.16.12.1:53808
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
1
2
3
4
5
6
[root@zhoulijie ~]# ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
1
2
3
4
5
6
[root@zhoulijie ~]# ss -antlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:* users:(("sshd",pid=889,fd=3))
LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=1007,fd=13))
LISTEN 0 128 :::22 :::* users:(("sshd",pid=889,fd=4))
LISTEN 0 100 ::1:25 :::* users:(("master",pid=1007,fd=14))
1
2
3
4
5
[root@zhoulijie ~]# ss -anu
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:23511 *:*
UNCONN 0 0 *:68 *:*
UNCONN 0 0 :::35299 :::*
常见端口
1
2
3
4
5
6
7
http    80/tcp 
https 443/tcp
ssh 22/tcp
ftp 20,21/tcp
mysql 3306/tcp
rsync 873/rsync
redis 6379/tcp

网络故障排查

练习

1.如何查看系统中每个ip的连接数

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n

1
2
3
[root@zhoulijie ~]# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
1 Address
1 servers)

2.请列出下列服务使用的端口,http,ftp,ssh,telnet,mysql,dns

http 80

ftp 20,21

ssh 22

telnet 23

mysql 3306

dns 53

3.如何在虚拟机上新增加一块网卡,并配置IP为172.16.0.10,指定网关为172.16.0.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@zhoulijie ~]# cd /etc/sysconfig/network-scripts/
[root@zhoulijie network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@zhoulijie network-scripts]# vim ifcfg-eth1
[root@zhoulijie network-scripts]# cat ifcfg-eth1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth1 //此处eth0改成eth1
UUID=bb501ad9-f26f-4310-b857-14a1fc520546
DEVICE=eth1 //此处eth0改成eth1
ONBOOT=yes
IPADDR=172.16.0.10 //此处更改IP
NETMASK=255.255.255.0
GATEWAY=172.16.0.1 //此处更改网关
DNS1=172.16.0.1 //此处更改DNS1
[root@zhoulijie network-scripts]# systemctl restart network

4.详细描述dns解析过程,以访问www.baidu.com为例

打开浏览器,输入一个域名:www.baidu.com,这时,你使用的电脑会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

查询www.baidu.com的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。

本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。

最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

5.如何查看系统中运行了多少个进程

ps -aux | wc -l

1
2
[root@zhoulijie network-scripts]# ps -aux | wc -l
243

6.如何查看系统中启动了哪些端口

ss -tan

1
2
3
4
5
6
7
8
9
10
11
[root@zhoulijie ~]#  ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25

7.如何查看是否开启80端口,及查看sshd进程是否存在

netstat -nultp | grep 80

1
2
3
[root@zhoulijie ~]# netstat   -nultp | grep 80

[root@zhoulijie ~]#

ps -aux | grep sshd

1
2
3
[root@zhoulijie ~]# ps -aux | grep sshd
root 1193 0.0 0.2 105996 4076 ? Ss 18:48 0:00 /usr/sbin/sshd -D
root 6448 0.0 0.0 112676 984 pts/0 R+ 22:23 0:00 grep --color=auto sshd

8.列出所有处于监听状态的tcp端口

netstat -l | grep tcp

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# netstat -l | grep tcp
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 zhoulijie:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN

9.查看所有的端口信息, 包括 PID 和进程名称

netstat -antlp

1
2
3
4
5
6
7
8
9
10
11
12
[root@zhoulijie ~]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1391/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1193/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1197/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1321/master
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1193/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1197/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1321/master

linux进程管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

进程基本概述

进程是已启动的可执行程序的运行中实例。

/proc目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息。每一个进程的PID是唯一的,就算进程退出了,其它进程也不会占用其PID。

进程的组成部分

  • 已分配内存的地址空间
  • 安全属性,包括所有权凭据和特权
  • 程序代码的一个或多个执行线程
  • 进程状态

进程的环境

  • 本地和全局变量
  • 当前调度上下文
  • 分配的系统资源,如文件描述符和网络端口

进程的产生

现有的(父)进程复制自己的地址空间(fork)来创建一个新的(子)进程结构。 每个新进程分配有一个唯一的进程ID(PID),满足跟踪和安全性之需。PID与父进程ID(PPID)是新进程环境的元素。 任何进程可创建子进程。所有进程都是第一个系统进程的后代。RHEL7上,第一个系统进程是systemd。

通过fork例程,子进程继承安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec其自己的程序代码。通常,父进程在子进程运行期间处于睡眠状态,设置一个在子进程完成时发出信号的请求(wait)。在退出时,子进程可能已经关闭或丢弃了其资源和环境,剩余的部分被称作僵停。父进程在子进程退出时收到信号而被唤醒,清理剩余结构,然后继续执行其自己的程序代码。

进程的分类

  • 前台进程:与终端相关的进程,通过终端启动的进程
    • 注意:也可把在前台启动的进程送往后台,以守护模式运行
  • 守护进程:daemon,与终端无关的进程(如内核),在系统引导过程中启动的进程

进程状态

Excuting //运行态
Ready //就绪态,也可以称作睡眠态
Uninterruptible sleep //不可中断的睡眠。不可随时唤醒,只有当IO资源加载成功后才能唤醒
Interruptible sleep //可中断的睡眠。可随时唤醒
Zombie //僵尸进程。正常运行结束了,但是不释放占据的内存
Stopped //停止态,暂停于内存中,但不会被调度,除非手动启动之

进程睡眠的原因: 当一个执行中的进程,需要加载额外的IO资源的时候,由于IO设备的速度太慢,所以会转入睡眠状态等待,交出CPU给其他进程,以免浪费剩余执行时间

在多任务处理操作系统中,每个CPU(或CPU核心)在一个时间点上处理一个进程。在进程运行时,它对CPU时间和资源分配的直接要求会有变化。进程分配有一个状态,它随着环境要求而改变。

Linux进程状态
标志 内核定义的状态名称和描述
R TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪
S TASK_INTERRUPTIBLE:进程处于睡眠状态且正在等待某一条件:硬件请求、系统资源访问或信号。当事件或信号满足该条件时,该进程将返回到运行中
D TASK_UNINTERRUPTIBLE:此进程也在睡眠,但与S状态不同,不会响应传递的信号。仅在特定的条件下使用,其中进程中断可能会导致意外的设备状态
K TASK_KILLABLE:进程处于睡眠状态,与不可中断的D状态相同,但有所修改,允许等待中的任务通过响应信号而被中断(彻底退出)。实用程序通常将可中断的进程显示为D状态
T TASK_STOPPED:进程已被停止(暂停),通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复)
T TASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标志
Z EXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释放
X EXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放。此状态从不会在进程列出实用程序中看到
< 高优先级进程
N 低优先级进程
+ 前台进程组中的进程
| 多线程进程
s 会话进程首进程

进程优先级

linux进程调度与多任务

现代计算机系统中既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每个CPU上具有多个核心,它们可以并行执行数以百计的指令。但是所有这些系统往往具有一个共同点:它们需要运行的进程数量总是超出实际具有的核心数。

通过时间分片技术,Linux(和其他操作系统)实际能够运行的进程数(和线程数)可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间进行快速切换,从而给用户一种有多个进程在同时运行的印象。

执行此切换的Linux内核部分称为进程调度程序。

进程优先级

  • 进程优先级范围:0-139,数字越小,优先级越高
    • 0-99:实时优先级,内核调整
    • 100-139:静态优先级,用户可控制
  • 进程优先级高的特点:
    • 获得更多的CPU运行时间
    • 更优先获得CPU运行的机会

要修改进程的优先级可以通过调整进程的nice值来实现,nice值越小,优先级越高: nice值的范围是(-20,19),-20对应100,19对应139

相对优先级

由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为SCHED_OTHER(也称为SCHED_NORMAL),但还有一些其他策略可用于不同的目的。

由于并非所有进程都以同样的方式创建,可为采用SCHED_NORMAL策略运行的进程指定相对优先级。此优先级称为进程的nice值。一个进程可以有40种不同级别的nice值。

这些nice级别的范围是从-20到19。默认情况下,进程将继承其父进程的nice级别,通常为0

nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)
如果不存在资源争用(例如当活动进程数少于可用CPU核心数时),即使nice级别高的进程也将仍使用它们可使用的所有可用CPU资源。但当请求CPU时间的进程数超过可用核心数时,nice级别较高的进程将比nice级别较低的进程收到更少的CPU时间

nice级别与权限

为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。

普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别。

进程优先级调整

进程优先级调整:调整nice值

//调整已经启动的进程的nice值:
renice NI PID(例:renice 3 3704)
//在启动时指定nice值:(-20,19)
nice -n NI COMMAND

进程管理命令

Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

ps

ps命令用于查看系统中的进程状态

-a 显示所有进程(包括其他用户的进程)

-u 用户以及其他详细信息

-x 显示没有控制终端的进程

Linux系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在Linux系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。

R(运行):进程正在运行或在运行队列中等待。

S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。

D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。

Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。

T(停止):进程收到停止信号后停止运行。

当执行ps aux命令后通常会看到如下:

1
2
3
4
5
6
7
8
9
[root@zhoulijie ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 50776 7212 ? Ss 4月08 0:01 /usr/lib/syst
root 2 0.0 0.0 0 0 ? S 4月08 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 4月08 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 4月08 0:00 [kworker/0:0H
root 7 0.0 0.0 0 0 ? S 4月08 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 4月08 0:00 [rcu_bh]
...............................以下省略...............................

pstree

pstree用于显示当前系统上的进程树

如果没有 使用yum安装

yum install -y psmisc

pgrep

以grep风格指定只显示哪些进程,在当前系统中找符合某些特性的进程。只显示进程号

1
2
3
4
5
[root@zhoulijie ~]# pgrep vim
3469
[root@zhoulijie ~]# ps aux | grep vim
root 3469 0.0 0.2 151920 5036 pts/0 S+ 01:24 0:00 vim 1
root 3502 0.0 0.0 112656 988 pts/2 R+ 01:32 0:00 grep --color=auto vim

pidof

pidof命令用于查询某个指定服务进程的PID值

每个进程的进程号码值(PID)是唯一的,因此可以通过PID来区分不同的进程。例如,可以使用如下命令来查询本机上正在运行的vim的PID:

1
2
3
4
5
6
# 打开两个终端
# 在第一个终端上输入:
[root@zhoulijie ~]# vim a
# 在第二个终端上输入:
[root@zhoulijie ~]# pidof vim
3358

vmstat

虚拟内存状态查看命令

vmstat 2 //表示每2秒刷新一次
vmstat 2 5 //表示每2秒刷新一次,刷新5次后退出

-s //显示内存的统计数据

1
2
3
4
[root@zhoulijie ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1489572 1524 152768 0 0 8 2 12 21 0 0 100 0 0

procs:
r(running) //表示等待运行的队列长度,也即等待运行的进程的个数
b(block) //表示阻塞队列长度,也即处于不可中断睡眠态的进程个数
memory:
swpd //交换内存的使用总量
free //空闲物理内存总量
buffer //用于buffer的内存总量
cache //用于cache的内存总量
swap:
si(swap in) //表示从物理内存有多少页面换进swap,也即数据进入swap的数据速率(kb/s)
so(swap out) //表示从swap有多少页面换进物理内存,也即数据离开swap的数据速率(kb/s)
io:
bi(block in) //表示磁盘块有多少个被调入内存中,也即从块设备读入数据到系统的速率(kb/s)
bo(block out) //表示有多少个磁盘块从内存中被同步到硬盘上去了,也即保存数据至块设备的速率(kb/s)
system:
in( interrupts) //表示中断的个数,也即中断速率(kb/s)
cs(context switch) //表示上下文切换的次数,也即进程切换速率(kb/s)
CPU:
us //表示用户空间
sy //表示内核空间
id //表示空闲百分比
wa //表示等待IO完成所占据的时间百分比
st //表示steal,被虚拟化技术偷走的时间(比如运行虚拟机)

控制作业

作业与会话

作业控制是shell的一种功能,它允许单个shell实例运行和管理多个命令。

作业与在shell提示符中输入的每个管道相关联。该管道中的所有进程均是作业的一部分,并且是同一个进程组的成员。(如果在shell提示符中仅输入了一条命令,则这条命令可视为命令的最小管道。该命令将是该作业的唯一成员)

一次只能有一个作业从特定终端窗口读取输入和键盘生成的信号。属于该作业的进程是该控制终端的前台进程。

该控制终端的后台进程是与该终端相关联的任何其他作业的成员。终端的后台进程无法从终端读取输入或接收键盘生成的中断,但可以写入终端。后台中的作业可能已停止(暂停),也可能正在运行。如果某个正在运行的后台作业尝试从终端读取内容,则该作业将自动暂停。

每个终端是其自身的会话,并且可以具有一个前台进程和多个独立的后台进程。一个作业只能属于一个会话,也就是属于其控制终端的会话。

作业分类

Linux作业分为前台作业与后台作业两种。其各自的特点如下:

  • 前台作业:通过终端启动,且启动后一直占据了命令提示符
  • 后台作业:可以通过终端启动,但启动之后,释放命令提示符,后续的操作在后台完成
    • 此类作业虽然被送往后台运行,但其依然与终端相关。如果希望送往后台后,剥离与终端的关系需要执行(nohup COMMAND &)

在后台运行作业

在命令后跟上&符号可以生成一个后台作业

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# sleep 1000 &
[1] 3538
[root@zhoulijie ~]# sleep 1000 &
[2] 3540
[root@zhoulijie ~]# ps
PID TTY TIME CMD
3475 pts/2 00:00:00 bash
3538 pts/2 00:00:00 sleep
3540 pts/2 00:00:00 sleep
3541 pts/2 00:00:00 ps

jobs命令用于显示当前所有的后台作业

1
2
3
[root@zhoulijie ~]# jobs
[1]- 运行中 sleep 1000 &
[2]+ 运行中 sleep 1000 &

fg命令用于将后台作业调至前台运行

1
2
[root@zhoulijie ~]# fg
sleep 1000

当只有一个后台作业时,直接使用fg命令,不跟任何参数即可将后台作业调至前台运行,但是当有多个作业时则必须跟上%+作业号,也就是上面命令执行结果中以[]括起来的数字。

1
2
3
[root@zhoulijie ~]# jobs
[1]- 运行中 sleep 1000 &
[2]+ 运行中 sleep 1000 &

使用ctrl+z可将前台进程发送到后台,此时作业将处于停止状态

1
2
3
4
[root@zhoulijie ~]# fg %1
sleep 1000
^Z
[1]+ 已停止 sleep 1000

使用bg命令+作业号可使后台已停止的作业重新运行

1
2
3
4
5
[root@zhoulijie ~]# bg %1
[1]+ sleep 1000 &
[root@zhoulijie ~]# jobs
[1]- 运行中 sleep 1000 &
[2]+ 运行中 sleep 1000 &

kill加上作业号可以手动杀死指定作业

1
2
3
4
5
6
7
[root@zhoulijie ~]# jobs
[1]- 运行中 sleep 1000 &
[2]+ 运行中 sleep 1000 &
[root@zhoulijie ~]# kill %1
[root@zhoulijie ~]# jobs
[1]- 已终止 sleep 1000
[2]+ 运行中 sleep 1000 &

jobs命令的结果中

  • //命令将默认操作的作业
    • //命令将第二个默认操作的作业

进程间通信

进程间通信(IPC:Inter Process Communication)

进程间通信方式:

  • 同一主机

    • 共享内存
    • 信号:Signal
  • 不同主机

    • rpc:remote procecure call

      • 基于socket实现进程间通信

        socket 套接字 ip加接口 ss -natl

使用信号控制进程

信号是传递至进程的软件中断。信号向执行中的程序报告事件。生成信号的事件可以是错误或外部事件(如I/O请求或计时器过期),或者来自于明确请求(如使用信号发送命令)

下表列出了系统管理员用于日常进程管理的基本信号。请通过短名称(HUP)或正确名称(SIGHUP)指代信号。

  • 指定一个信号的方法:
    • 信号号码(数字标识):kill -1
    • 信号完整名称:kill -SIGKILL
    • 信号简写名称:kill -TERM或kill -KILL或kill -INT或kill -HUP

基本进程管理信号

信号编号 ID 短名称 定义 用途
1 HUP 挂起 让一个进程不用重启就可以重读配置文件,并让新的配置信息生效
2 INT 键盘中断 中断一个前台进程。ctrl+c就是用的SIGINT信号
9 KILL 中断,无法拦截 导致立即终止程序。无法被拦截、忽略或处理
15 默认值 TERM 终止 导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式,允许自我清理

用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程。

kill

kill命令根据ID向进程发送信号。虽其名称为kill,但该命令可用于发送任何信号,而不仅仅是终止程序的信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@zhoulijie ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
1
2
3
4
5
6
[root@zhoulijie ~]# kill 3571
[root@zhoulijie ~]# ps
PID TTY TIME CMD
3475 pts/2 00:00:00 bash
3610 pts/2 00:00:00 ps
[2]+ 已终止 sleep 1000

监控进程活动

IO负载

负载平均值代表一段时间内感知的系统负载。Linux通过预期服务等待时间的表示来实施平均负载计算。

Linux不仅计算进程数,也作为独立的任务计算线程数。运行中线程和等待I/O资源的线程的CPU请求队列对应于R和D进程状态。等待I/O包括处于睡眠而等待预期磁盘和网络响应的任务。

负载数属于全局计数器计算,是所有CPU的总和数。由于从睡眠返回的任务可能会重新调度到不同的CPU,难以精确的每CPU计数,但累计数的准确度可以保障。显示的平均负载代表所有的CPU。

1
2
[root@zhoulijie ~]# grep 'model name' /proc/cpuinfo
model name : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz

一些UNIX系统仅考虑CPU使用率或运行队列长度来指示系统负载。由于具有空闲CPU的系统可能会因为磁盘或网络资源忙而遇到很长时间的等待,因此Linux负载平均值中包含了对I/O的考量。遇到负载平均值很高但CPU活动很低时,请检查磁盘和网络活动。

Linux中可以使用topuptime显示负载平均值的情况。

1
2
[root@zhoulijie ~]# uptime
02:11:29 up 5:54, 3 users, load average: 0.00, 0.01, 0.05

将显示的负载平均值除以系统中的逻辑CPU数。当值低于1表示资源利用率较好,等待时间很短。当值高于1表示资源饱和,而且有一定的服务等待时间。

空闲CPU队列的负载数为0。每个就绪和等待的线程使计数增加1。总队列数为1时,资源(CPU、磁盘或网络)正在使用中,但没有请求把时间花在等待上。增加的请求数会累积该计数,但由于许多请求可以在时限内处理,资源使用率会很高,而等待时间则不会。

因为磁盘或网络资源忙碌等待I/O而处于睡眠的进程包含在该计数内,而且使负载平均值增大。虽然不能表示CPU使用率,队列数依然表明用户和程序正在等待资源服务。

在资源饱和前,平均负载将保持在1以下,因为几乎不会在队列中发现等待的任务。只有资源饱和导致请求留在排队状态并且被负载计算例程计数时,负载平均才会增大。当资源使用率接近100%时,每个增加的请求将开始遭遇服务等待时间。

实时进程监控

top

top命令用于动态地监视进程活动与系统负载等信息

top命令相当强大,能够动态地查看系统运维状态,完全将它看作Linux中的“强化版的Windows任务管理器” .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
top - 01:07:42 up  4:50,  4 users,  load average: 0.00, 0.01, 0.05
Tasks: 412 total, 2 running, 410 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1870760 total, 323388 used, 1547372 free, 780 buffers
KiB Swap: 2097148 total, 0 used, 2097148 free. 101676 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 50776 7212 2480 S 0.0 0.4 0:01.26 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
...............................以下省略..................................

第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。

第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。

第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为CPU数据并以百分比格式显示,例如“97.1 id”意味着有97.1%的CPU处理器资源处于空闲。

第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。

第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。

练习

写出以下描述对应的进程状态标志:

描述 状态标志
进程已被停止(暂停) T
进程已释放了其所有资源(pid除外) Z
进程正在CPU上运行或者正在等待于CPU上运行 R
进程正处于睡眠状态,直至满足某些条件后才会启动 S
进程正在等待I/O或某些条件得到满足,并且绝对不会影响信号 D

按以下顺序练习后台与前台进程操作:

并排打开两个终端窗口,分别称为左窗口和右窗口

1
[root@zhoulijie ~]# 1
1
[root@zhoulijie ~]# 2

在左窗口中,启动一个进程,该进程以一秒为间隔持续向~/outfile文件附加单词”rock”和一个空格。整个命令集必须包含在括号内,以便作业控制可以将该集合解译为一个作业

[root@localhost ~]# (while true;do echo -n ‘rock ‘ >> ~/outfile;sleep 1;done)

1
[root@zhoulijie ~]# (while true;do echo -n 'rock ' >> ~/outfile;sleep 1;done)

在右窗口中,使用tail确认新进程正在写入该文件

[root@localhost ~]# tail -f ~/outfile

1
2
[root@zhoulijie yum.repos.d]# tail -f ~/outfile
rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock rock

在左窗口中,使用ctrl+z快捷键暂停正在运行的进程。shell将返回作业ID并用方括号括起。在右窗口中确认进程输出已经停止

1
2
3
4
5
[root@zhoulijie ~]#  (while true;do echo -n 'rock ' >> ~/outfile;sleep 1;done)
^Z
[1]+ 已停止 ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )

在左窗口中,查看jobs列表。+表示当前的作业。使用bg命令在后台重新启动该作业,并再次查看jobs列表,在右窗口中,确认进程输出再次处于活动状态

1
2
3
4
5
6
7
8
9
10
11
12
[root@zhoulijie ~]# jobs
[1]+ 已停止 ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
[root@zhoulijie ~]# bg
[1]+ ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &
[root@zhoulijie ~]# jobs
[1]+ 运行中 ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &

在左窗口中,再启动两个进程,以便向同一输出文件附加内容。将”rock”替换为”paper”,再替换为”scissors”。要将进程正确置于后台,整个命令集必须包含在括号内,并且以&符号结尾

[root@localhost ~]# (while true;do echo -n ‘paper ‘ >> ~/outfile;sleep 1;done) &

[root@localhost ~]# (while true;do echo -n ‘scissors ‘ >> ~/outfile;sleep 1;done) &

1
2
3
4
[root@zhoulijie ~]#  (while true;do echo -n 'paper ' >> ~/outfile;sleep 1;done) &
[3] 3858
[root@zhoulijie ~]# (while true;do echo -n 'scissors ' >> ~/outfile;sleep 1;done) &
[4] 3887

在左窗口中,检查jobs,以查看所有三个进程都在运行中。在右窗口中,确认所有三个进程都附加内容到文件中

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# jobs
[1] 运行中 ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &
[2]- 运行中 ( while true; do
echo -n 'paper ' >> ~/outfile; sleep 1;
done ) &
[3]+ 运行中 ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &

仅使用之前学习的命令,暂停”rock”进程。在左窗口中,使用从jobs列表中确定的作业ID使作业进入前台,然后使用ctrl+z暂停该作业,确认”rock”进程为已停止。在右窗口中,确认”rock”输出不再活动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@zhoulijie ~]# jobs
[1] 运行中 ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done ) &
[2]- 运行中 ( while true; do
echo -n 'paper ' >> ~/outfile; sleep 1;
done ) &
[3]+ 运行中 ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &
[root@zhoulijie ~]# fg %1
( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )
^Z
[1]+ 已停止 ( while true; do
echo -n 'rock ' >> ~/outfile; sleep 1;
done )

终止”paper”进程。在左窗口中,使作业进入前台,然后使用ctrl+c终止该作业,确认”paper”进程已经消失。在右窗口中,确认”paper”输出不再活动

1
2
3
4
5
6
7
8
9
10
11
12
[root@zhoulijie ~]# jobs
[3]- 运行中 ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &
[4]+ 运行中 ( while true; do
echo -n 'paper ' >> ~/outfile; sleep 1;
done ) &
[root@zhoulijie ~]# fg %4
( while true; do
echo -n 'paper ' >> ~/outfile; sleep 1;
done )
^C
1
scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors scissors

在左窗口中,使用ps查看剩余的作业。暂停中的作业具有状态T标志。其他后台作业为睡眠中(S),因为ps在显示时处于”CPU上”(R)

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# ps j
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
960 2580 2580 2580 tty1 2580 Ss+ 0 0:00 -bash
3333 3337 3337 3337 pts/0 4653 Ss 0 0:00 -bash
3470 3475 3475 3475 pts/2 5657 Ss 0 0:00 -bash
3337 3690 3690 3337 pts/0 4653 T 0 0:00 tail -f /root/outfil
3337 4653 4653 3337 pts/0 4653 S+ 0 0:00 tail -f /root/outfil
3475 4699 4699 3475 pts/2 5657 S 0 0:00 -bash
4699 5656 4699 3475 pts/2 5657 S 0 0:00 sleep 1
3475 5657 5657 3475 pts/2 5657 R+ 0 0:00 ps j

停止剩余的两个作业。在左窗口中,使其中一个作业进入前台。使用ctrl+c将其终止,对剩余的作业重复此操作。停止的作业在前入前台时会临时重新启动。确认没有剩余的作业,输出也已停止。

1
2
3
4
5
6
7
8
9
10
11
[root@zhoulijie ~]# jobs
[1]+ 运行中 ( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done ) &
[root@zhoulijie ~]# fg %1
( while true; do
echo -n 'scissors ' >> ~/outfile; sleep 1;
done )
^C
[root@zhoulijie ~]# jobs
[root@zhoulijie ~]#

在右窗口中,停止tail命令。关闭多余的终端窗口

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie yum.repos.d]# ps
PID TTY TIME CMD
3337 pts/0 00:00:00 bash
3690 pts/0 00:00:00 tail
5870 pts/0 00:00:00 ps
[root@zhoulijie yum.repos.d]# kill 3690
[root@zhoulijie yum.repos.d]# ps
PID TTY TIME CMD
5876 pts/0 00:00:00 bash
5897 pts/0 00:00:00 ps

软件管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

软件包的途径

软件包管理的职责

  • 将二进制程序,库文件,配置文件,帮助文件打包成一个文件;
  • 安装软件时按需将二进制文件,库文件,配置文件,帮助文件放到相应的位置;
  • 生成数据库,追踪所安装的每一个文件;
  • 软件卸载时根据安装时生成的数据库将对应的文件删除

软件包管理的核心功能

  • 制作软件包
  • 安装软件
  • 卸载软件
  • 升级软件
  • 查询软件
  • 校验软件

软件包管理

软件包分类

软件包管理工具

软件安装方式

  • 通过前端工具安装
  • 通过后端工具安装
  • 编译安装

rpm包命名规范

rpm包管理

什么是rpm包及其作用

rpm是Redhat Package Manager的简称,用于管理软件包。 rpm有一个强大的数据库/var/lib/rpm。 rpm的管理工作包括软件的安装、卸载、升级、查询、校验、重建数据库、验证软件包来源合法性等等。

rpm包安装

语法: rpm -ivh /PATH/TO/PACKAGE_FILE …

常用选项:
-i: 安装
-v: 显示详细信息
-h: 显示安装进度条
–test: 测试安装,但不真正执行安装过程
–nodeps: 忽略依赖关系
–replacepkgs: 重新安装,替换原有安装
–oldpackage: 降级
–force: 强行安装,可以实现重装或降级
–nodigest: 不检查包的完整性
–nosignature: 不检查包的来源合法性
–noscripts: 不执行程序包脚本片断
%pre:安装前脚本 –nopre
%post:安装后脚本 –nopost
%preun:卸载前脚本 –nopreun
%postun:卸载后脚本 –nopostun

安装软件包, 需要指定软件包绝对路径
1
2
3
4
5
[root@zhoulijie ~]# rpm -ivh /mnt/cdrom/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm 
警告:/mnt/cdrom/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:vsftpd-3.0.2-22.el7 ################################# [100%]
在软件包所在目录下可以不指定绝对路径
1
2
3
4
5
6
[root@zhoulijie ~]# cd /mnt/cdrom/Packages/
[root@zhoulijie Packages]# rpm -ivh tree-1.6.0-10.el7.x86_64.rpm
警告:tree-1.6.0-10.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:tree-1.6.0-10.el7 ################################# [100%]
测试一个软件包是否能在该系统上安装
1
2
3
4
[root@zhoulijie Packages]# rpm -ivh --test vsftpd-3.0.2-22.el7.x86_64.rpm
警告:/mnt/cdrom/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中... ################################# [100%]
软件包 vsftpd-3.0.2-22.el7.x86_64 已经安装
如果软件包存在, 强制再次安装
1
2
3
4
5
[root@zhoulijie Packages]# rpm -ivh --force vsftpd-3.0.2-22.el7.x86_64.rpm 
警告:vsftpd-3.0.2-22.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:vsftpd-3.0.2-22.el7 ################################# [100%]
安装samba服务需要依赖其他组件, 使用–nodeps可重新强制安装
1
2
3
4
[root@zhoulijie Packages]# rpm -ivh --nodeps tree-1.6.0-10.el7.x86_64.rpm 
警告:tree-1.6.0-10.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中... ################################# [100%]
软件包 tree-1.6.0-10.el7.x86_64 已经安装

rpm包查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
rpm -q PACKAGE_NAME                 //查询指定的包是否已安装
rpm -qa //查询已经安装的所有包
rpm -qi PACKAGE_NAME //查询指定包的说明信息
rpm -ql PACKAGE_NAME //查询指定软件包安装后生成的文件列表
rpm -qf /path/to/somefile //查询指定的文件是由哪个rpm包安装生成的
rpm -qc PACKAGE_NAME //查询指定包安装的配置文件
rpm -qd PACKAGE_NAME //查询指定包安装的帮助文件
rpm -q --scripts PACKAGE_NAME //查询指定包中包含的脚本
rpm -q --whatprovides CAPABILITY //查询指定的CAPABILITY(能力)由哪个包所提供
如:rpm -q --whatprovides /bin/cat
rpm -q --whatrequires CAPABILITY //查询指定的CAPABILITY被哪个包所依赖
rpm -q --changelog COMMAND //查询COMMAND的制作日志
rpm -q --scripts PACKAGE_NAME //查询指定软件包包含的所有脚本文件
rpm -qR PACKAGE_NAME //查询指定的软件包所依赖的CAPABILITY
rpm -q --provides PACKAGE_NAME //列出指定软件包所提供的CAPABILITY

rpm -qpi /PATH/TO/PACKAGE_FILE //查询指定未安装包的说明信息
rpm -qpl /PATH/TO/PACKAGE_FILE //查询未安装的软件包会产生哪些文件
查询vsftpd这个rpm包是否安装
1
2
[root@zhoulijie Packages]# rpm -q vsftpd
vsftpd-3.0.2-22.el7.x86_64
模糊查找系统已安装的rpm包
1
2
[root@zhoulijie Packages]# rpm -qa |grep vsftpd
vsftpd-3.0.2-22.el7.x86_64
查询vsftpd软件包的相关信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@zhoulijie Packages]# rpm -qi vsftpd
Name : vsftpd
Version : 3.0.2
Release : 22.el7
Architecture: x86_64
Install Date: 2019年04月23日 星期二 21时46分42秒
Group : System Environment/Daemons
Size : 356220
License : GPLv2 with exceptions
Signature : RSA/SHA256, 2017年03月23日 星期四 22时25分48秒, Key ID 199e2f91fd431d51
Source RPM : vsftpd-3.0.2-22.el7.src.rpm
Build Date : 2017年03月23日 星期四 22时01分19秒
Build Host : x86-034.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Vendor : Red Hat, Inc.
URL : https://security.appspot.com/vsftpd.html
Summary : Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.
查询rpm包所安装的文件
1
2
3
4
5
6
7
8
9
[root@zhoulijie Packages]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
。。。。。。省略以下。。。。。。。。
查询rpm包相关的配置文件
1
2
3
4
5
6
[root@zhoulijie Packages]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
查询配置文件或命令来自于哪个rpm包
1
2
3
4
[root@zhoulijie Packages]# rpm -qf /etc/vsftpd/vsftpd.conf
vsftpd-3.0.2-22.el7.x86_64
[root@zhoulijie Packages]# rpm -qf /usr/sbin/vsftpd
vsftpd-3.0.2-22.el7.x86_64
查询未安装的软件包会产生哪些文件
1
2
3
4
5
6
7
8
9
10
11
[root@zhoulijie Packages]# rpm -qlp vsftpd-3.0.2-22.el7.x86_64.rpm 
警告:vsftpd-3.0.2-22.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/systemd/system-generators/vsftpd-generator
。。。。。。省略以下。。。。。。。。
查询未安装的软件说明信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@zhoulijie Packages]# rpm -qip vsftpd-3.0.2-22.el7.x86_64.rpm 
警告:vsftpd-3.0.2-22.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
Name : vsftpd
Version : 3.0.2
Release : 22.el7
Architecture: x86_64
Install Date: (not installed)
Group : System Environment/Daemons
Size : 356220
License : GPLv2 with exceptions
Signature : RSA/SHA256, 2017年03月23日 星期四 22时25分48秒, Key ID 199e2f91fd431d51
Source RPM : vsftpd-3.0.2-22.el7.src.rpm
Build Date : 2017年03月23日 星期四 22时01分19秒
Build Host : x86-034.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Vendor : Red Hat, Inc.
URL : https://security.appspot.com/vsftpd.html
Summary : Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.

rpm包升级

1
2
3
4
5
6
7
8
rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE  //如果装有老版本的,则升级;否则,则安装
rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE //如果装有老版本的,则升级;否则,退出
--oldpackage:降级

[root@zhoulijie Packages]# rpm -Uvh vsftpd-3.0.2-22.el7.x86_64.rpm
警告:vsftpd-3.0.2-22.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中... ################################# [100%]
软件包 vsftpd-3.0.2-22.el7.x86_64 已经安装

rpm包卸载

1
2
3
4
5
6
//语法:rpm -e PACKAGE_NAME

//先查询, 然后卸载
[root@zhoulijie Packages]# rpm -qa | grep vsftpd
vsftpd-3.0.2-22.el7.x86_64
[root@zhoulijie Packages]# rpm -e vsftpd

注意:如果其他包依赖于要卸载的包,这个被依赖的包是无法卸载的,除非强制卸载,强制卸载后依赖于这个包的其他程序将无法正常工作

rpm包校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 如果执行以下命令无内容输出说明此包未被修改过
[root@localhost ~]# rpm -V vsftpd
S.5....T. c /etc/pam.d/vsftpd
.......T. c /etc/vsftpd/ftpusers
S.5....T. c /etc/vsftpd/vsftpd.conf
.M....... /var/ftp/pub

S //文件的容量大小是否被改变
M //文件的类型或者文件的属性是否被修改
5 //MD5这一种指纹加密的内容已经不同
D //装置的主/次代码已经改变
L //路径已经被改变
U //文件的所属主已被修改
G //文件的所属组已被修改
T //文件的创建时间已被改变

rpm重建数据库

数据库信息在/var/lib/rpm目录中

1
2
rpm --rebuilddb     //重建数据库,一定会重新建立
rpm --initdb //初始化数据库,没有才建立,有就不用建立

检察软件包来源合法性和完整性

1
2
3
4
5
6
7
8
9
10
11
12
加密类型:
对称加密 //加密解密使用同一个密钥
公钥加密 //一对密钥,公钥和私钥。公钥隐含于私钥中,可以提取出来并公布出去
单向加密 //只能加密不能解密

/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release //红帽官方公钥

rpm -K PACKAGE_FILE //检查指定包有无密钥信息
dsa,gpg //验证来源合法性,也即验证签名。可以使用--nosignatrue略过此项
sha1,md5 //验证软件包完整性。可以使用--nodigest略过此项
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release //导入密钥文件
CentOS 7发行版光盘提供的密钥文件 //RPM-GPG-KEY-CentOS-7

练习

如何查询 util-linux 软件包安装了哪些文件?

1
[root@zhoulijie Packages]# rpm -ql util-linux

如何查询 mkdir 命令是由哪个 RPM 软件包安装的?

1
[root@zhoulijie Packages]# rpm -qf /usr/bin/mkdir

升级软件包时,-F、-U选项有何区别?

1
2
rpm -Uvh 如果装有老版本的,则升级;否则,则安装
rpm -Fvh 如果装有老版本的,则升级;否则,退出

如何检查vsftpd软件包是否安装?

1
[root@zhoulijie Packages]# rpm -q vsftpd

如何检查vsftpd软件包所有的文件存放目录?

1
[root@zhoulijie Packages]# rpm -ql vsftpd

如何检查vsftpd软件包的配置文件?

1
[root@zhoulijie Packages]# rpm -qc vsftpd

如何使用rpm安装vsftpd服务?

1
[root@zhoulijie Packages]# rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm

如何使用rpm强制安装依赖包?

1
[root@zhoulijie Packages]# rpm -ivh --force vsftpd-3.0.2-22.el7.x86_64.rpm

如何使用rpm卸载vsftpd软件包?

1
[root@zhoulijie Packages]# rpm -e vsftpd

将本章学习到的rpm命令整理成一个列表,写明每个命令的作用

安装软件的命令格式 rpm -ivh RPM安装包
升级软件的命令格式 rpm -Uvh RPM安装包
卸载软件的命令格式 rpm -e RPM安装包
查询软件描述信息的命令格式 rpm -qpi RPM安装包
列出软件文件信息的命令格式 rpm -qpl RPM安装包
查询文件属于哪个RPM的命令格式 rpm -qf RPM安装包

用户和组管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

用户和组管理

[TOC]

何为用户何为组?

用户和组的概念

例如:小明和他的家人

小明就是用户,他的家就是这个组,他的家人就是这个组里面的组员

*用户存在的目的是为了实现资源的分派。 *

小明在家里有知识,可以教给小明的爸爸妈妈,小明的妈妈会做饭,可以做的饭给小明和小明爸爸吃,小明的爸爸有钱,可以给小明和小明妈妈花。

用户分类

Linux用户分为管理员和普通用户两种:

用户类别 用户ID
管理员 0
普通用户 1-65535

其中普通用户又分为系统用户和登录用户两种:

用户类别 用户ID
系通用户 1-999(为 守护类进程获取系统资源而完成权限指派的用户 )
登陆用户 1000-60000(为了完成交互式登录使用的用户)

Linux安全上下文

运行中的程序:进程

以进程发起者的身份运行

进程所能够访问的所有资源的权限取决于进程的发起者的身份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 首先我们打开两个终端
# 在第一个终端里输入
[root@MR ~]# cd /tmp
[root@MR tmp]# ls
shadow
[root@MR tmp]# touch 123
[root@MR tmp]# ls -l
总用量 4
-rw-r--r--. 1 root root 0 3月 27 07:37 123
----------. 1 root root 608 3月 8 15:48 shadow
# 在这里我们可以看到root是可读可写的权限
# 在第二个终端里输入
[root@MR ~]# su - zhou
上一次登录:三 3月 27 04:27:47 CST 2019pts/1 上
[zhou@MR ~]$ cd /tmp
[zhou@MR tmp]$ ls -l
总用量 4
-rw-r--r--. 1 root root 0 3月 27 07:37 123
----------. 1 root root 608 3月 8 15:48 shadow
[zhou@MR tmp]$ vim 123
~
"123" [只读] 0L, 0C 0,0-1 全部
# 然后我们在第一个终端里输入
[root@MR tmp]# ps aux | grep vim
zhou 4946 0.1 0.2 151916 5004 pts/0 S+ 07:40 0:00 vim 123
root 4948 0.0 0.0 112656 992 pts/2 R+ 07:40 0:00 grep --color=auto vim
# 在这里我们可以看到 vim 123 是由zhou用户发起的进程
# 但是我们子啊第二步骤里面可以看到这个文件只是一个只读文件

Linux通过安全上下文的概念完成用户权限的指派。

先判断用户是否是某文件的属主

再判断用户是否属于某个组

最后定其为其他用户

Linux用户组类别

用户组类别 特征
私有组 创建用户时,如果没有为其指定所属的组, 系统会自动为其创建一个与用户名相同的组
基本组 用户的默认组
附加组(额外组) 默认组以外的其它组

Linux 用户和组相关的配置文件

各配置文件的说明

配置文件 作用
/etc/passwd 用户及其属性信息(名称、uid、基本组id等等)
/etc/group 组及其属性信息
/etc/shadow 用户密码及其相关属性
/etc/gshadow 组密码及其相关属性。在用户执行基本组切换时使用
1
2
3
4
5
6
[root@MR tmp]# tail -n5 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
zhou:x:1000:1000::/home/zhou:/bin/bash
wangqing:x:1001:1003:wu liang tian zun:/opt/123:/bin/csh
openstack:x:1002:1005::/home/openstack:/bin/bash
1
2
3
4
5
6
[root@MR tmp]# tail -n5 /etc/group
taoist:x:1001:wangqing
tianzun:x:1002:wangqing
wangqing:x:1003:
123:x:1004:
openstack:x:1005:
配置文件 /etc/passwd /etc/group
第一字段 用户名 组名
第二字段 密码占位符号 组名
第三字段 UID 组密码
第四字段 GID GID
第五字段 用户的描述信息 以当前组为附加组的用户列表(分隔符为逗号)
第六字段 用户家目录
第七字段 用户的登录shell
1
2
3
4
5
6
[root@MR tmp]# tail -n5 /etc/shadow
postfix:!!:17961::::::
sshd:!!:17961::::::
zhou:!!:17981:0:99999:7:::
wangqing:!!:17981:0:99999:3::17986:
openstack:!!:17981:0:99999:7:::
1
2
3
4
5
6
[root@MR tmp]# tail -n5 /etc/gshadow
taoist:!::wangqing
tianzun:!::
wangqing:!::
123:$6$f3I23/woA$DV6eA/Qc0KsZkbwOo1uqC3YRx30riDKd/ZOtrEulPnct2knx4gBakc8rFYwnCOXFKaG4H7Cdf1alzK/V6fpTl/::
openstack:!::
配置文件 /etc/shadow
第一字段 登录名
第二字段 加密后的密码
第三字段 最近一次更改密码的日期
第四字段 密码的最小使用期限
第五字段 密码的最大使用期限
第六字段 密码警告时间段
第七字段 密码禁用期
第八字段 帐号的过期日期
第九字段 保留字段

以上配置文件均可用vim 进行改动

加密方法

  • 对称加密:加密和解密使用同一个密钥
  • 公钥加密:每个密码都成对出现,一个为私钥(secret key),一个为公钥(public key)
  • 单向加密:也叫散列加密,提取数据特征码,能加密不能解密,常用于做数据完整性校验

单向加密的特点:

  • 雪崩效应(初始条件的微小改变,将会引起结果的巨大改变)

  • 定长输出

    ​ 1.MD5:128位定长输出

    ​ 2.SHA1:160位定长输出

    ​ 3.SHA224:224位定长输出

    ​ 4.SHA256:256位定长输出

    ​ 5.SHA384:384位定长输出

    ​ 6.SHA512:512位定长输出

一般我们只用MD5进行加密

Linux用户密码加密方式

Linux密码是使用的单向加密方式进行加密

意思是每个密码都不一样,在加密前给用户设置的密码加上一点杂质,再对这个杂质+用户密码一起使用单向加密。由于单向加密的雪崩效应,就算两人设置的密码是一样的,但因为杂质的不同,最终的结果也会截然不同

密码复杂性策略:

  • 使用数字、大写字母、小写字母及特殊字符中至少3种
  • 足够长
  • 使用随机密码,不要使用有意义的单词或数字
  • 定期更换,不要使用最近曾经使用过的密码

用户和组相关的命令

用户管理

用户创建命令useradd

-u 指定uid

1
2
3
4
[root@MR tmp]# cd
[root@MR ~]# useradd -u 8888 yue
[root@MR ~]# id yue
uid=8888(yue) gid=8888(yue) 组=8888(yue)

-g 指定gid

1
2
3
4
5
6
7
8
9
[root@MR home]# tail -n5 /etc/group
taoist:x:1001:wangqing
tianzun:x:1002:wangqing
wangqing:x:1003:
123:x:1004:
openstack:x:1005:
[root@MR home]# useradd -g tianzun yue
[root@MR home]# id yue
uid=1003(yue) gid=1002(tianzun) 组=1002(tianzun)

-G 指定附加组,组与组之间用逗号隔开,记住附加组必须存在

1
2
3
4
5
6
7
8
9
[root@MR home]# tail -n5 /etc/group
taoist:x:1001:wangqing
tianzun:x:1002:wangqing
wangqing:x:1003:
123:x:1004:
openstack:x:1005:
[root@MR home]# useradd -G tianzun,taoist yue
[root@MR home]# id yue
uid=1003(yue) gid=1006(yue) 组=1006(yue),1001(taoist),1002(tianzun)

-c 添加注释信息

1
2
3
4
5
6
7
[root@MR home]# useradd -c"hahahahahaha" yue
[root@MR home]# tail -n5 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
zhou:x:1000:1000::/home/zhou:/bin/bash
wangqing:x:1001:1003:wu liang tian zun:/opt/123:/bin/csh
openstack:x:1002:1005::/home/openstack:/bin/bash
yue:x:1003:1006:hahahahahaha:/home/yue:/bin/bash

-d 指定用户的家目录

1
2
3
4
5
6
7
[root@MR home]# cd /tmp
[root@MR tmp]# ls
123 shadow
[root@MR tmp]# mkdir abc
[root@MR tmp]# useradd -d /tmp/abc yue
useradd:警告:此主目录已经存在。
不从 skel 目录里向其中复制任何文件。

-s 指定shell,但这个shell必须在/etc/shells里面存在

1
2
3
4
5
6
7
[root@MR tmp]# useradd -s /sbin/nologin yue
[root@MR tmp]# tail -n5 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
zhou:x:1000:1000::/home/zhou:/bin/bash
wangqing:x:1001:1003:wu liang tian zun:/opt/123:/bin/csh
openstack:x:1002:1005::/home/openstack:/bin/bash
yue:x:1003:1006::/home/yue:/sbin/nologin

-M 创建用户时不给其创建家目录

1
2
3
[root@MR tmp]# useradd -M yue
[root@MR /]# ls /home
openstack wangqing zhou
用户删除命令userdel

-r 删除用户的同时删除其家目录(userdel默认不会删除其家目录)

1
2
3
4
5
6
[root@MR /]# useradd yue
[root@MR /]# ls /home
openstack wangqing yue zhou
[root@MR /]# userdel -r yue
[root@MR /]# ls /home
openstack wangqing zhou
查看用户账号的信息命令id
1
2
[root@MR /]# id zhou
uid=1000(zhou) gid=1000(zhou) 组=1000(zhou),0(root)
修改用户账号属性的命令usermod

-u 修改uid

1
2
3
4
5
[root@MR /]# id yue
uid=1003(yue) gid=1006(yue) 组=1006(yue)
[root@MR /]# usermod -u 8888 yue
[root@MR /]# id yue
uid=8888(yue) gid=1006(yue) 组=1006(yue)

-g 修改gid

1
2
3
4
5
6
[root@MR /]# id yue
uid=8888(yue) gid=1006(yue) 组=1006(yue)
[root@MR /]# groupadd -g 7777 hah
[root@MR /]# usermod -g 7777 yue
[root@MR /]# id yue
uid=8888(yue) gid=7777(hah) 组=7777(hah)

-a -G 不使用-a选项,会覆盖此前的附加组

1
2
3
4
5
[root@MR /]# id yue
uid=8888(yue) gid=7777(hah) 组=7777(hah)
[root@MR /]# usermod -a -G yue yue
[root@MR /]# id yue
uid=8888(yue) gid=7777(hah) 组=7777(hah),1006(yue)

-d -m 改变用户家目录的同时把原来家目录的文件移动到新的家目录中

切记-d在-m后面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@MR /]# ls /home
openstack wangqing yue zhou
[root@MR /]# cd /home/yue
[root@MR yue]# touch 123
[root@MR yue]# ls
123
[root@MR yue]# cd /tmp
[root@MR tmp]# ls
abc shadow
[root@MR tmp]# mkdir qqq
[root@MR tmp]# ls
abc qqq shadow
[root@MR tmp]# usermod -md /tmp/qqq yue
usermod:目录 /tmp/qqq 不存在
[root@MR tmp]# tail -n5 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
zhou:x:1000:1000::/home/zhou:/bin/bash
wangqing:x:1001:1003:wu liang tian zun:/opt/123:/bin/csh
openstack:x:1002:1005::/home/openstack:/bin/bash
yue:x:1003:1006::/tmp/qqq:/bin/bash
切换用户命令su
切换用户的方式 特点
su USERNAME 非登录式切换,即不会读取目标用户的配置文件
su - USERNAME 登录式切换,即会读取目标用户的配置文件。完全切换
su - 不指定用户时默认切换至root用户

root su至其他用户不需要密码,非root用户su至其他用户时需要输入目标用户的密码

bash的配置文件:

配置文件类型 配置文件路径
全局配置 /etc/profile /etc/profile.d/*.sh /etc/bashrc
个人配置 ~/.bash_profile ~/.bashrc
配置文件类型 功能
profile类 为交互式登录的shell提供配置,用来设定环境变量、运行命令或脚本
bashrc类 为非交互式登录的shell提供配置,用来设定本地变量、定义命令别名

登录式shell如何读取配置文件

/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc

非登录式shell如何读取配置文件

~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh

密码管理

密码管理命令passwd

–stdin 从标准输入获取用户密码

1
2
3
4
[root@MR qqq]# useradd yue
[root@MR qqq]# echo "123456" | passwd --stdin yue
更改用户 yue 的密码 。
passwd:所有的身份验证令牌已经成功更新。
改变用户密码过期信息命令chage

-E 过期时间

1
2
3
4
5
6
7
8
[root@MR ~]# chage -E 2019-05-31 yue
[root@MR ~]# tail -n5 /etc/shadow
sshd:!!:17961::::::
zhou:!!:17981:0:99999:7:::
wangqing:!!:17981:0:99999:3::17986:
openstack:!!:17981:0:99999:7:::
yue:$6$BRQKiE3H$Ns7arFcpyOipUDWQ9CzJJlxvodMKEDN9iGfSYxo1V0PsW7OF5DU7cFpdCAi8EbyPv7KoVl1.PXnSUatlRU2jN/:17982:0:99999:7::18047:
# 此时间代表从1970年1月1日开始的多少天

-w 警告时间

1
2
3
4
5
6
7
8
# 默认提前7天警告
[root@MR ~]# chage -W 3 yue
[root@MR ~]# tail -n5 /etc/shadow
sshd:!!:17961::::::
zhou:!!:17981:0:99999:7:::
wangqing:!!:17981:0:99999:3::17986:
openstack:!!:17981:0:99999:7:::
yue:$6$BRQKiE3H$Ns7arFcpyOipUDWQ9CzJJlxvodMKEDN9iGfSYxo1V0PsW7OF5DU7cFpdCAi8EbyPv7KoVl1.PXnSUatlRU2jN/:17982:0:99999:3::18047:
密码生成工具openssl

version 查看程序版本号

1
2
[root@MR ~]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

dgst 提取特征码

1
2
3
4
[root@MR ~]# openssl dgst -md5 /home/yue
Read Error in /home/yue
139969262737312:error:0200B015:system library:fread:Is a directory:bss_file.c:24 5:
139969262737312:error:20082002:BIO routines:FILE_READ:system lib:bss_file.c:246:

passwd 生成密码

1
2
3
[root@MR ~]# openssl passwd -1 -salt hello
Password:
$1$hello$bs8EXZ2u6YMHz8lF7E05u0

rand 生成伪随机数

1
2
[root@MR ~]# openssl rand -base64 30
J7oxn34FkHcdxdTvmtsyf3VCUaZf/SU8I5jprwMS

组管理

创建组命令groupadd

-g 指定GID

1
2
3
4
5
6
7
[root@MR ~]# groupadd -g 6666 natasha
[root@MR ~]# tail -n5 /etc/group
123:x:1004:
openstack:x:1005:
hah:x:7777:
yue:x:7778:
natasha:x:6666:
修改组命令groupmod

-g 修改gid

1
2
3
4
5
6
7
[root@MR ~]# groupmod -g 4444 natasha
[root@MR ~]# tail -n5 /etc/group
123:x:1004:
openstack:x:1005:
hah:x:7777:
yue:x:7778:
natasha:x:4444:

-n 修改组名

1
2
3
4
5
6
7
[root@MR ~]# groupmod -n hahahaha natasha
[root@MR ~]# tail -n5 /etc/group
123:x:1004:
openstack:x:1005:
hah:x:7777:
yue:x:7778:
hahahaha:x:4444:
删除组命令groupdel
1
2
3
4
5
6
7
[root@MR ~]# groupdel hahahaha
[root@MR ~]# tail -n5 /etc/group
wangqing:x:1003:
123:x:1004:
openstack:x:1005:
hah:x:7777:
yue:x:7778:

给组设定密码命令gpasswd

1
2
3
4
[root@MR ~]# gpasswd hahahaha
正在修改 hahahaha 组的密码
新密码:
请重新输入新密码:

练习

1.创建用户wangqing,附加组为taoist和tianzun,默认shell为/bin/csh,注释信息为“wu liang tian zun”

groupadd taoist

groupadd tianzun

useradd -G taoist,tianzun -c”wu liang tian zun” -s /bin/csh wangqing

yum工具的使用

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[toc]

rpm的弊端

rpm弊端是显而易见的,当用rpm安装软件时,若遇到有依赖关系的软件,必须先安装依赖的软件才能继续安装我们要安装的软件,当依赖关系很复杂的情况下,这种安装方式就很气人,所以我们需要另一种安装方式来解决这个问题——-yum工具的使用

yum的优劣势

  • yum最大的优势就是能够解决rpm的依赖问题,yum能够自动解决软件安装时的依赖关系。
  • yum的缺陷就是如果在未完成安装的情况下强行中止安装过程,下次再安装时将无法解决依赖关系,

什么是yum及其作用

yum是yellowdog update manager的简称,它能够实现rpm管理的所有操作,并能够自动解决各rpm包之间的依赖关系。yum是rpm的前端工具,是基于rpm来实现软件的管理的一个工具。

  • 挂载光盘

  • 插入光盘

  • 执行挂载命令

1
2
3
4
5
6
7
8
[root@zhoulijie ~]# mkdir /mnt/cdrom
[root@zhoulijie ~]# mount /dev/cdrom /mnt/cdrom/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@zhoulijie ~]# ls /mnt/cdrom/
addons GPL media.repo RPM-GPG-KEY-redhat-release
EFI images Packages TRANS.TBL
EULA isolinux repodata
extra_files.json LiveOS RPM-GPG-KEY-redhat-beta

yum的原理

yum的工作需要两部分来合作,一部分是yum服务器,另一部分就是client的yum工具。下面分别介绍两部分工作原理。

yum服务器端工作原理

所有要发行的rpm包都放在yum服务器上以提供别人来下载,rpm包根据kernel的版本号,cpu的版本号分别编译发布。yum服务器只要提供简单的下载就可以了,ftp或者http的形式都可以。yum服务器有一个最重要的环节就是整理出每个rpm包的基本信息,包括rpm包对应的版本号、conf文件、binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张“清单”,这张“清单”就是描述每个rpm包的spec文件中信息。

client端工作原理

client每次调用yum install或者search的时候,都会去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件,这些配置文件指定了yum服务器的地址。yum会定期去更新yum服务器上的rpm包清单,然后把清单下载保存到yum客户端自己的cache里面,根据/etc/yum.conf里配置(默认是/var/cache/yum下面),每次调用yum装包的时候都会去这个cache目录下去找清单,根据清单里的rpm包描述从而来确定安装包的名字、版本号、所需要的依赖包等,然后再去yum服务器下载rpm安装。(前提是不存在rpm包的cache)

yum的元数据

yum的配置文件

1
2
3
4
5
6
7
8
9
10
[bendiyum]      //仓库名称
name=bendiyum //描写信息
baseurl=file:///mnt/cdrom //仓库具体路径,可填以下三种
ftp://
http://
file:///
enabled=1 //可选1或者0,1为启用此仓库,0为禁用此仓库
gpgcheck=0 //可选1或者0,1为检查软件和发性,0为不检查来源
若gpgcheck=1,则必须用gpgkey定义密钥文件的具体路径
gpgkey=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@zhoulijie ~]# vim /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever //缓存目录
keepcache=0 //缓存软件包, 1启动 0 关闭
debuglevel=2 //调试级别
logfile=/var/log/yum.log //日志记录位置
exactarch=1 //检查平台是否兼容
obsoletes=1 //检查包是否废弃
gpgcheck=1 //检查来源是否合法,需要有制作者的公钥信息
plugins=1 //是否启用插件
installonly_limit=3

This is the default, if you make this bigger yum won't see if the metadata

is newer on the remote and so you'll "gain" the bandwidth of not having to

download the new metadata and "pay" for it by yum not having correct

information.

It is esp. important, to have correct metadata, for distributions like

Fedora which don't keep old packages around. If you don't like this checking

interupting your command line usage, it's much better to have something

manually check the metadata once an hour (yum-updatesd will do this).

metadata_expire=90m //每小时手动检查元数据

PUT YOUR REPOS HERE OR IN separate files named file.repo

in /etc/yum.repos.d //包含repos.d目录

yum仓库管理

yum本地仓库

  • 备份挂载目录
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# mkdir /opt/myrepo
[root@zhoulijie ~]# cp -r /mnt/cdrom /opt/myrepo/
[root@zhoulijie ~]# ls /opt/myrepo/
[root@zhoulijie ~]# ls /opt/myrepo/cdrom
addons GPL media.repo RPM-GPG-KEY-redhat-release
EFI images Packages TRANS.TBL
EULA isolinux repodata
extra_files.json LiveOS RPM-GPG-KEY-redhat-beta
  • 配置repo文件
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# cd /etc/yum.repos.d/
[root@zhoulijie yum.repos.d]# vim bendiyum.repo
[root@zhoulijie yum.repos.d]# cat bendiyum.repo
[bendiyum]
name=bendiyum
baseurl=file:////opt/myrepo/cdrom
enabled=1
gpgcheck=0
  • 清空yum本地缓存
1
2
3
4
5
6
[root@zhoulijie yum.repos.d]# yum clean all
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
正在清理软件源: bendiyum
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
  • 检验yum本地仓库
1
2
[root@zhoulijie yum.repos.d]# yum list | wc -l
5096

yum网络仓库

  • 官方网络yum仓库(国外)
1
wget http://mirrors.aliyun.com/repo/Centos-7.repo
  • 阿里云yum仓库
1
wget http://mirrors.aliyun.com/repo/Centos-5.repo
  • 163yum仓库
1
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
  • xx大学yum仓库
1
https://mirror.tuna.tsinghua.edu.cn/help/centos/
  • epel源
1
2
3
4
5
//国外
yum -y install epel-release

//阿里
wget http://mirrors.aliyun.com/repo/epel-7.repo
软件官方仓库
1
2
3
4
5
6
7
// 源查找方式基本一致,zabbix,mysql,saltstack,openstack等等,上官网找
[root@localhost ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

redhat7使用centos7的yum源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1.卸载红帽yum源
[root@localhost ~]# rpm -e $(rpm -qa|grep yum) --nodeps

2.删除所有repo相关文件
[root@localhost ~]# rm -f /etc/yum.conf
[root@localhost ~]# rm -rf /etc/yum.repos.d/
[root@localhost ~]# rm -rf /var/cache/yum

3.下载centos相关yum组件
[root@localhost ~]# wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-154.el7.centos.noarch.rpm
[root@localhost ~]# wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
[root@localhost ~]# wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-42.el7.noarch.rpm
[root@localhost ~]# wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-updateonboot-1.1.31-42.el7.noarch.rpm
[root@localhost ~]# wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-42.el7.noarch.rpm

//如果没有wget命令则使用curl命令
[root@localhost ~]# curl -o yum-utils-1.1.31-42.el7.noarch.rpm https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-42.el7.noarch.rpm
[root@localhost ~]# curl -o yum-3.4.3-154.el7.centos.noarch.rpm https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-154.el7.centos.noarch.rpm
[root@localhost ~]# curl -o yum-metadata-parser-1.1.4-10.el7.x86_64.rpm https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
[root@localhost ~]# curl -o yum-plugin-fastestmirror-1.1.31-42.el7.noarch.rpm https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-42.el7.noarch.rpm
[root@localhost ~]# curl -o yum-updateonboot-1.1.31-42.el7.noarch.rpm https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-updateonboot-1.1.31-42.el7.noarch.rpm

3.安装所有相关组件
[root@localhost ~]# rpm -ivh yum-* --nodeps

4.下载base和epel仓库
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# sed -i 's#\$releasever#7#g' /etc/yum.repos.d/CentOS-Base.repo

[root@localhost ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum管理软件

yum命令语法:

1
yum [options] [command] [package ...]
常用的选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
--nogpgcheck                //如果从网上下载包有时会检查gpgkey,此时可以使用此命令跳过gpgkey的检查
-y //自动回答为"yes"
-q //静默模式,安装时不输出信息至标准输出
--disablerepo=repoidglob //临时禁用此处指定的repo
--enablerepo=repoidglob //临时启用此处指定的repo
--noplugins //禁用所有插件
```bash



###### 常用的命令

```bash
list //列表
all //默认项
available //列出仓库中有的,但尚未安装的所有可用的包
installed //列出已经安装的包
updates //可用的升级

clean //清理缓存
packages
headers
metadata
dbcache
all

repolist //显示repo列表及其简要信息
all
enabled //默认项
disabled

install //安装
yum install packages [...]

update //升级
yum update packages [...]
update_to //升级为指定版本

downgrade package1 [package2 ...] //降级

remove|erase //卸载

info //显示rpm -qi package的结果
yum info packages

provides|whatprovides //查看指定的文件或特性是由哪个包安装生成的

search string1 [string2 ...] //以指定的关键字搜索程序包名及summary信息

deplist package [package2 ...] //显示指定包的依赖关系

history //查看yum的历史事务信息

localinstall //安装本地rpm包,自动解决依赖关系

grouplist //列出可用的组

groupinstall "group name" //安装一组软件

createrepo命令 //创建yum仓库的元数据信息
[root@localhost ~]# yum install createrepo -y
[root@localhost ~]# createrepo [options] <directory>

#### 具体实例
###### 搜索软件包

```bash
//列出软件仓库中可用的软件
[root@localhost ~]# yum list all

//进行模糊查找
[root@localhost ~]# yum list | grep ftp

//列出软件包详情
[root@localhost ~]# yum info ftp
安装软件包
1
2
3
4
5
6
7
8
9
10
11
//安装软件只需要给出软件名称
[root@localhost ~]# yum install traceroute

//安装过程中分析依赖关系后, 直接安装, 无需交互
[root@localhost ~]# yum -y install php

//安装本地的rpm包, 如果有依赖关系, 会自动从软件仓库中下载所需依赖(非来自.repo定义的软件仓库)
[root@localhost ~]# yum localinstall /mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm

//安装网络上rpm包
[root@localhost ~]# yum install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
重装软件包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//检查软件是否存在
[root@localhost ~]# rpm -q vsftpd
vsftpd-2.2.2-24.el6.x86_64

//检查vsftpd软件配置文件
[root@localhost ~]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf

//不小心删除vsftpd配置文件
[root@localhost ~]# rm -f /etc/vsftpd/vsftpd.conf

//重新安装软件
[root@localhost ~]# yum reinstall vsftpd

//再次检查
[root@localhost ~]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf

更新软件包

1
2
3
4
5
//对比Linux已安装的软件和yum仓库中的软件, 有哪些需要升级
[root@localhost ~]# yum check-update

//更新软件
[root@localhost ~]# yum update acl -y
删除软件包
1
2
3
4
5
6
//先安装一个samba软件
[root@localhost ~]# yum -y install samba

//删除该软件包,不会删除依赖, 但是我们尽可能不要使用删除软件操作
[root@localhost ~]# yum -y erase samba
[root@localhost ~]# yum -y remove samba
与仓库相关的命令
1
2
3
4
5
6
7
8
9
10
//列出yum源可用的软件仓库
[root@localhost ~]# yum repolist

//列出全部yum源可用和禁用的仓库
[root@localhost ~]# yum repolist all

//查看这个文件或命令属于哪个包
[root@localhost ~]# yum provides /etc/my.cnf
[root@localhost ~]# yum provides cd
[root@localhost ~]# yum provides *bin/pstree
与缓存相关的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//缓存yum源软件仓库, xml元数据文件
[root@localhost ~]# yum makecache

//缓存软件包, 修改yum全局配置文件
[root@localhost ~]# vim /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1 //启动缓存


//查看缓存的xml文件
[root@localhost ~]# ls /var/cache/yum/x86_64/7/base/

//查看缓存软件包路径
[root@localhost ~]# ls /var/cache/yum/x86_64/7/


#另一种缓存rpm包方式

//1.安装插件支持只下载软件包不安装
[root@localhost ~]# yum -y install yum-plugin-downloadonly
//2.将软件下载至指定目录
[root@localhost ~]# yum -y install --downloadonly --downloaddir=/tmp httpd


//清除所有yum缓存
[root@localhost ~]# yum clean all

//只清除缓存的软件包
[root@localhost ~]# yum clean packages
与包组相关的命令
1
2
3
4
5
6
7
8
9
10
//列出已经安装和所有可使用的软件组
[root@localhost ~]# yum groups list

//安装一整个组的软件
[root@localhost ~]# yum groups install Development tools \
Compatibility libraries \
Base Debugging Tools

//yum删除包组
[root@localhost ~]# yum groups remove -y Base

####### 与历史记录相关的命令

1
2
3
4
5
6
7
8
//查看历史执行yum命令
[root@localhost ~]# yum history

//查询历史执行yum命令ID详细信息
[root@localhost ~]# yum history info N

//撤销历史执行过的yum命令
[root@localhost ~]# yum history undo N
YUM签名检查机制
  • rpm软件提供组织redhat在构建rpm包时, 使用其私钥private key对 rpm进行签名
  • 客户端在使用rpm为了验证其合法性, 可以使用redhat提供的公钥public key进行签名检查

方式1:指定公钥位置

1
2
3
4
5
[root@localhost ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

方式2:提前导入公钥

1
2
3
4
5
6
7
[root@localhost ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@localhost ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1

方式3:不进行签名验证

1
2
//不检查软件包的签名
[root@localhost ~]# yum install httpd --nogpgcheck

练习

如何配置本地光盘yum仓库以及网络yum仓库

1
2
3
4
5
6
7
8
9
10
11
12
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom

vim /etc/yum.repo.d/bendiyum.repo
[bendiyum]
name=bendiyum
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0

yum clean all
yum list | wc -l
1
2
首先了解到网络源的位置
使用wget下载

如何使用yum安装 httpd php nginx

1
yum install -y httpd php nginx

如何配置yum缓存rpm包(至少阐述两种方式)

1
2
3
yum localinstall /mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm

yum install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

如何使用yum安装本地缓存好的rpm包

1
yum localinstall /mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm

如何使用yum删除httpd软件包

1
yum remove httpd

如何构建企业内部yum仓库服务(请写出详细步骤,至少准备两台虚拟机,使用http方式)

1
2


Linux计划任务

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

crond计划任务概述

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

1
2
3
4
5
6
7
8
9
10
Schedule one-time tasks with at.   一次性调度执行 at
Schedule recurring jobs with cron. 循环调度执行 cron
Schedule recurring system jobs. 所有计划任务执行中的输出都会以邮件的方式发送给指定用户, 除非重定向


//循环调度执行cron 进程每分钟会处理一次计划任务
[root@zhoulijie ~]# systemctl status crond
[root@zhoulijie ~]# ps aux | grep crond
root 1238 0.0 0.0 126236 1672 ? Ss 00:27 0:00 /usr/sbin/crond -n
root 16029 0.0 0.0 112680 984 pts/0 S+ 21:58 0:00 grep --color=auto crond

计划任务分为以下两种情况:

  • 系统级别的定时任务:

    清理系统缓存
    临时文件清理
    系统信息采集
    日志文件切割

  • 用户级别的定时任务:

    定时同步互联网时间
    定时备份系统配置文件
    定时备份数据库文件

crond配置文件详解

  • Linux下的任务调度分为两类,系统任务调度和用户任务调度。

  • 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

1
2
3
4
5
文件              说明
/etc/crontab //crontab配置文件
/etc/cron.deny //该文件中所列用户不允许使用crontab命令
/var/spool/cron/* //所有用户定时文件都存放此目录,文件以用户名命名
/var/log/cron //定时任务执行后的日志文件,可用来回溯

crond计划任务管理

crond任务管理

1
2
3
4
5
6
参数          含义                指定示例
-e 编辑crontab文件内容 crontab -e
-l 查看crontab文件内容 crontab -l
-r 删除crontab文件内容 crontab -r
-u 管理其他用户的计划任务 crontab -u zhou -l
注意: crontab {-l -e}实际上就是在操作/var/spool/cron/username

crond时间含义

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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 //星期
# | | | | |
# * * * * * command to be executed

// * 表示任意的(分、时、日、月、周)时间都执行
// - 表示一个时间范围段, 如5-7点
// , 表示分隔时段, 如6,0,4表示周六、日、四
// */n 表示每隔n单位时间, 如*/10 每10分钟

crond编写示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
00 02 * * * command      //每天2:00整 
00 02 1 * * command //每月1号2:00整
00 02 14 2 * command //每年2月14号2:00整
00 02 * * 7 command //每周日2:00整
00 02 * 6 5 command //每年6月的周五2:00整
00 02 14 * 7 command //每月14号2:00整或每周日2:00整,这两个时间都执行
00 02 14 2 7 command //每年 2 月 14 号 2:00 整 或者 每周日 2:00 整,这两个时间都执行
00 02 * * * command //每天2:00整
* 02 * * * command //每天2:00中的每一分钟 (错误示范)
* * * * * command //每分钟执行 ls
* * 14 2 * command //2月14号的每分钟(错误示范)
*/5 * * * * command //每隔5分钟
00 02 * 1,5,8 * command //每年1,5,8月的每天2:00整
00 02 1-8 * * command //每月1到8号的2:00整

crond书写规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//1.为计划任务增加必要的注释
[root@zhoulijie ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@zhoulijie ~]# crontab -l
##time sync
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null

//2.规范计划任务执行脚本存放的路径/scripts/
[root@zhoulijie ~]# crontab -e
crontab: installing new crontab
[root@zhoulijie ~]# crontab -l
##backup www to /backup
30 01 * * * /bin/sh /scripts/www_backup.sh &>/dev/null

//3.执行shell脚本任务前加/bin/sh, 脚本结尾加&>/dev/null
//调试好后应屏蔽debug输出信息,避免产生系统垃圾占用过多inode, 如需输出日志, 可重定向至日志文件
[root@zhoulijie ~]# crontab -e
crontab: installing new crontab
[root@zhoulijie ~]# crontab -l
####backup www to /backup
30 01 * * * /bin/sh /scripts/www_backup.sh &>/tmp/www_backup.log

crond配置编写实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@zhoulijie ~]# crontab -e

#每天凌晨切割nginx日志
05 00 * * * /bin/bash -x /scripts/cut_nginx.sh &> /scripts/log/nginx.log

#每天5点备份数据库
00 05 * * * /bin/bash -x /scripts/dump_sql.sh &>/scripts/log/mysql.log



//注意:
1.我们所有的crond服务是运行的程序。而crontab命令用户用来设置定时规则的命令。
2.crond服务是企业生产工作中常用的重要服务,at很少使用,可以忽略。
3.几乎每个服务器都会用到crond服务。

crond计划任务调试

  1. 调整任务每分钟执行, 检测是否是否正常, 有些任务不要频繁执行
  2. 调整系统时间然后在检测任务, 生产不建议直接使用此方式
  3. 执行脚本, 将脚本执行输出写入指定日志文件, 观察日志内容是否正常
  4. 注意一些任务命令带来的问题echo “wangqing” >>/tmp/test.log &>/dev/null
  5. 命令使用绝对路径, 防止无法找到命令导致定时任务执行故障
  6. 查看/var/log/cron日志进行调试

建议: 将需要定期执行的任务写入脚本中, 建立/scripts目录统一存放脚本, 脚本中命令必须使用绝对路径,手动执行脚本检测输出是否正常, 然后将脚本加入计划任务测试, 测试后无问题将脚本输出写入对应的日志文件中即可。

计划任务添加步骤:

  1. 手动执行保留执行命令的正确结果
  2. 编写脚本
    • 脚本需要统一路径/scripts
    • 脚本开头建议填写注释信息, 包括执行时间、周期、任务
    • 脚本内容复制执行成功的命令至脚本文件中(减少每个环节出错几率)
    • 脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
    • 脚本执行的输出信息不要随意打印, 可以重定向至其他位置保留或丢入黑洞
  3. 执行脚本
    • 使用bash执行, 防止脚本没有增加执行权限(/bin/bash)
    • 执行命令以及脚本成功后并复制该命令
  4. 编写计划任务
    • 加上必要的注释信息, 人、时间、任务
    • 设定计划任务执行的周期
    • 加入执行脚本的命令
  5. 调试计划任务
    • 增加任务频率测试、调整系统时间测试(不能用于生产)
    • 检查环境变量问题、检查crond服务产生日志进行排查

练习

1.在linux系统中备份脚本backup.sh需要再每周1-5的每天下午1点和晚上8点执行,下列哪个cron命令可以完成(D)

a. 00 13,20 * 1-5 * backup.sh

1
每年的1-5月的13点和20点执行backup.sh

b. 0 13,20 1,5 * * backup.sh

1
每月的1号和5号的13点和20点执行backup.sh

c. * 13,20 * * 1-5 backup.sh

1
错误显示

d. 00 13,20 * * 1-5 backup.sh

1
每周一-周五的13点和20点执行backup.sh

说明以上答案每一行是什么含义

2.新建/scripts/httpd.sh文件,并让/scripts/httpd.sh脚本在每天的00:10分执行

1
2
3
4
5
6
7
8
[root@zhoulijie ~]# mkdir /scripts
[root@zhoulijie ~]# touch /scripts/httpd.sh
[root@zhoulijie ~]# whereis sh
sh: /usr/bin/sh /usr/share/man/man1/sh.1.gz /usr/share/man/man1p/sh.1p.gz
[root@zhoulijie ~]# crontab -e
crontab: installing new crontab
[root@zhoulijie ~]# crontab -l
10 00 * * * /usr/bin/sh /scripts/httpd.sh

3.新建/backup目录,每周一下午5:50将/backup目录下的所有文件打包成 backup.tar.gz

1
2
3
4
5
6
7
[root@zhoulijie ~]# mkdir /bachup
[root@zhoulijie ~]# whereis tar
tar: /usr/bin/tar /usr/share/man/man1/tar.1.gz /usr/share/man/man5/tar.5.gz
[root@zhoulijie ~]# crontab -e
crontab: installing new crontab
[root@zhoulijie ~]# crontab -l
50 17 * * 1 /usr/bin/tar -czf backup.tar.gz /backup

4.写一个定时任务,每天0点5分把/var/log/nginx下7天前的文件转移到/backup/2018_xx_xx的目录中

1
2
[root@zhoulijie ~]# crontab -l
5 0 * * * /usr/bin/find /var/log/nginx -mtime +7 | xargs /usr/bin/mv {} /backup/$(date '+%Y_%m_%d')

5.系统脚本/scripts/which.sh,如何定时每隔7分钟执行一次?

1
2
[root@zhoulijie ~]# crontab -e
*/7 * * * *

6.如何不小心删除了/var/spool/cron/root文件,该如何恢复。

权限管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

权限管理

[TOC]

权限简介

1.文件的权限主要针对三类对象进行定义:

  • owner:属主,u
  • group:属组,g
  • other:其它,o

我们可以把owner 当成小明,group当成小明他家里人,other当成隔壁老王

2.每个文件针对每个访问者都定义了三种权限:

权限 对应的操作对象 权限说明
r 文件 可读,可以使用类似cat等命令查看文件内容
w 文件 可写,可以编辑或删除此文件
x 文件 可执行,eXacutable,可以在命令提示符下当作命令提交给内核运行
r 目录 可以对此目录执行ls以列出内部的所有文件
w 目录 可以在此目录中创建文件,也可删除此目录中的文件
x 目录 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息

3.权限的八进制与十进制转换:

|权限|八进制|十进制|
|—|000|0|
|–x|001|1|
|-w-|010|2|
|-wx|011|3|
|r–|100|4|
|r-x|101|5|
|rw-|110|6|
|rwx|111|7|

权限管理命令

修改权限的命令chmod

-R 递归修改权限

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@MR tmp]# ls
123 abc qqq shadow
[root@MR tmp]# ls -l abc
总用量 0
-rw-r--r--. 1 root root 0 3月 27 09:54 123
-rw-r--r--. 1 root root 0 3月 27 09:54 3445
-rw-r--r--. 1 root root 0 3月 27 09:55 efsf
[root@MR tmp]# chmod -R 666 abc
[root@MR tmp]# ls -l abc
总用量 0
-rw-rw-rw-. 1 root root 0 3月 27 09:54 123
-rw-rw-rw-. 1 root root 0 3月 27 09:54 3445
-rw-rw-rw-. 1 root root 0 3月 27 09:55 efsf

修改文件属主和属组的命令chown

-R 修改目录及其内部文件的属主(中间用冒号或者逗号隔开)

1
2
3
4
5
6
7
8
9
10
11
[root@MR tmp]# ls -l abc
总用量 0
-rw-rw-rw-. 1 root root 0 3月 27 09:54 123
-rw-rw-rw-. 1 root root 0 3月 27 09:54 3445
-rw-rw-rw-. 1 root root 0 3月 27 09:55 efsf
[root@MR tmp]# chown -R zhou:zhou abc
[root@MR tmp]# ls -l abc
总用量 0
-rw-rw-rw-. 1 zhou zhou 0 3月 27 09:54 123
-rw-rw-rw-. 1 zhou zhou 0 3月 27 09:54 3445
-rw-rw-rw-. 1 zhou zhou 0 3月 27 09:55 efsf

遮罩码

为什么文件创建以后默认权限是644?
为什么目录创建以后默认权限是755?

这是由遮罩码umask来控制的。

1
2
3
[root@MR ~]# cat /usr/bin/umask
#!/bin/sh
builtin umask "$@"

从名字就能看出来,遮罩码umask是用来隐藏一些权限的。举例:如果你不想让人家认出你,你会怎么办?

1
2
[root@zhoulijie ~]# umask
0022

文件最终的权限为:

  • 666-umask

目录最终的权限为:

  • 777-umask

文件默认是不能具有执行权限的,如果算得的结果有执行权限则将其权限整体加1

Linux安全上下文与特殊权限

Linux安全上下文

前提:进程有属主和属组;文件有属主和属组

  • 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有可执行权限;
  • 启动为进程后,其进程的属主为发起者,属组为发起者所属的组
  • 进程访问文件时的权限取决于进程的发起者:
    • 进程的发起者是文件的属主时,则应用文件属主权限
    • 进程的发起者是文件的属组时,则应用文件属组权限
    • 应用文件“其它”权限

特殊权限

linux默认权限是根据linux安全上下文的方式来控制的,而特殊权限的存在打破了linux安全上下文的规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SUID(4)     //运行程序时,这个程序启动的进程的属主是程序文件自身的属主,而不是启动者为属主
chmod u+s file
chmod u-s file
//如果file本身原来就有执行权限,则SUID显示为s,否则显示为S

SGID(2) //运行程序时,这个程序启动的进程的属组是程序文件自身的属组,而不是启动者所属的基本组
//默认情况下,用户创建文件时,其属组为此用户所属的基本组;
//一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件或目录,其所属的组 \
//为此设定了SGID的目录的属组
chmod g+s DIR
chmod g-s DIR
//如果file本身原来就有执行权限,则SGID显示为s,否则显示为S

Sticky(1) //在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件
chmod o+t DIR
chmod o-t DIR
//如果DIR本身原来就有执行权限,则Sticky显示为t,否则显示为T

4755 //有SUID,文件权限为755
2755 //有SGID,文件权限为755
1755 //有Sticky,文件权限为755
7755 //有SUID、SGID、Sticky,文件权限为755
//这里前面的4、2、1分别表示SUID、SGID、Sticky

文件系通访问控制列表facl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//语法:setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m //设定
u:UID:perm
g:GID:perm
//setfacl -m u:test:rw file
//setfacl -m g:test:rw file
//如果要为某个目录设定默认的访问控制列表,只需要设定时在u或g前面加上d即可。 如:\
//setfacl -m du:test:rw file,此时在此目录中创建的文件均继承此访问控制列表所设置的权限
-x //取消
u:UID
g:GID
//setfacl -x u:test file
//setfacl -x g:test file
-b //Remove all

//语法:getfacl [-aceEsRLPtpndvh] file ...
//getfacl file


//文件权限应用次序:
//默认情况下:
Owner --> Group --> Other
//有设置facl的情况下:
Owner --> facl,user --> Group --> facl,group --> Other

sudo

sudo可以实现某个用户能够以另外哪一个用户的身份通过哪些主机执行什么命令

sudo的配置文件:/etc/sudoers

使用visudo命令进行sudo的配置,每一行就是一个sudo条目,条目格式如下:

  • who which_hosts=(runas) command
    • who:User_Alias,表示运行命令者的身份
    • which_hosts:Host_Alias,通过哪些主机
    • runas:Runas_Alias,以哪个用户的身份
    • command:Cmnd_Alias,运行哪些命令

别名必须全部而且只能使用大写英文字母的组合,可以使用感叹号取反

别名分类:

  • 用户别名:

    • User_Alias NETWORKADMIN =
      • 用户的用户名
      • 组名,使用%引导
      • 还可以其它已经定义的用户别名
  • 主机别名:

    • Host_Alias =
      • 主机名
      • IP地址
      • 网络地址
      • 其它主机别名
  • Runas别名:

    • Runas_Alias =
      • 用户名
      • %组名
      • 其它的Runas别名
  • 命令别名:

    • Cmnd_Alias =
      • 命令路径
      • 目录(此目录内的所有命令)
      • 其它已定义的命令别名
1
2
3
4
5
6
7
8
9
sudo命令语法:sudo [options] COMMAND
-V //显示版本编号
-h //会显示版本编号及指令的使用方式说明
-l //列出当前用户可以使用的所有sudo类命令
-v //因为sudo在第一次执行时或是在N分钟内没有执行(N默认为5)会问密码,这个参数 \
//是重新做一次确认,如果超过N分钟,也会问密码
-k //让认证信息失效,如果不指定-k,默认认证信息在5分钟后失效
-b //将要执行的指令放在后台执行
-u USERNAME //以指定的用户名执行命令,默认为root

管理命令

w 显示当前登录到系统的用户有哪些,以及其正在做什么

1
2
3
4
5
[zhou@zhoulijie ~]$ w
20:36:03 up 18 min, 2 users, load average: 0.00, 0.01, 0.05
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root tty1 20:18 17:47 0.02s 0.02s -bash
root pts/0 20:18 3.00s 0.13s 0.04s w

sleep //睡眠

s:秒,默认
m:分
h:小时
d:天

last 显示/var/log/wtmp文件,显示用户登录历史及系统重启历史

1
2
3
4
5
[zhou@zhoulijie ~]$ last
root pts/0 192.168.83.1 Mon Apr 8 20:18 still logged in
root tty1 Mon Apr 8 20:18 still logged in
reboot system boot 3.10.0-123.el7.x Mon Apr 8 20:17 - 20:37 (00:19)
............................以下省略............................

​ -n # 显示最近#次的相关信息

1
2
3
4
5
[zhou@zhoulijie ~]$ last -n 2
root pts/0 192.168.83.1 Mon Apr 8 20:18 still logged in
root tty1 Mon Apr 8 20:18 still logged in

wtmp begins Wed Mar 6 16:48:05 2019

lastb 显示/var/log/btmp文件,显示用户错误的登录尝试

1
2
3
4
5
6
[root@zhoulijie ~]# lastb
root ssh:notty 192.168.83.1 Wed Mar 27 09:48 - 09:48 (00:00)
root pts/0 Wed Mar 6 17:16 - 17:16 (00:00)
root tty1 Wed Mar 6 16:48 - 16:48 (00:00)

btmp begins Wed Mar 6 16:48:38 2019

​ -n # 显示最近#次的相关信息

1
2
3
4
5
[root@zhoulijie ~]# lastb -n 2
root ssh:notty 192.168.83.1 Wed Mar 27 09:48 - 09:48 (00:00)
root pts/0 Wed Mar 6 17:16 - 17:16 (00:00)

btmp begins Wed Mar 6 16:48:38 2019

lastlog 显示每个用户最近一次成功登录信息

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/0 一 4月 8 20:42:13 +0800 2019
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
lp **从未登录过**
sync **从未登录过**
shutdown **从未登录过**
............................以下省略............................

-u username //显示特定用户最近的登录信息

1
2
3
[root@zhoulijie ~]# lastlog -u zhou
用户名 端口 来自 最后登陆时间
zhou pts/0 一 4月 8 20:28:24 +0800 2019

练习

1、新建一个没有家目录的用户openstack

useradd -M openstack

2、复制/etc/skel为/home/openstack

cp -r -p /etc/skel /home/openstack

3、改变/home/openstack及其内部文件的属主属组均为openstack

chown -R openstack:openstack /home/openstack/

4、设置/home/openstack及其内部的文件,属组和其它用户没有任何访问权限

chmod -R 700 /home/openstack

  • © 2019-2020 Li Jie
  • Powered by Hexo Theme Ayer
    • PV:
    • UV:

喜欢就打赏吧~

支付宝
微信