Linux 快速学习总结 ( ͡° ͜ʖ ͡° ) 本文档采用 Centos Linux 8.x 学习测试
Linux快速学习-基础篇
__ __ _______
/ | / | / \
$$ | $$/ _______ __ __ __ __ $$$$$$$ | ______
$$ | / |/ \ / | / |/ \ / | $$ | $$ | / \
$$ | $$ |$$$$$$$ |$$ | $$ |$$ \/$$/ $$ | $$ |/$$$$$$ |
$$ | $$ |$$ | $$ |$$ | $$ | $$ $$< $$ | $$ |$$ | $$ |
$$ |_____ $$ |$$ | $$ |$$ \__$$ | /$$$$ \ $$ |__$$ |$$ \__$$ |
$$ |$$ |$$ | $$ |$$ $$/ /$$/ $$ | $$ $$/ $$ $$/
$$$$$$$$/ $$/ $$/ $$/ $$$$$$/ $$/ $$/ $$$$$$$/ $$$$$$/
Linux 有 用户 和 用户组的概念,用户名 + 密码才能登陆到Linux系统中
用户和用户组是多对多关系,一个用户客户归属到多个用户组,一个用户组包含多个用户
Linux不认识用户名只认识对应的ID
Linux系统中会将所有用户名和ID的对应关系存储在 /etc/passwd
用户组名称也有一个ID与之对应, 存储在/etc/group
[root@ecs-b208 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
....
/etc/passwd中每一行表示一个用户记录,记录中用“:” 分割,分表定义了用户的各个属性
第n分割字段 | 含义说明 |
---|---|
字段1 | 用户名 |
字段2 | 密码,用 “x” 表示,真正密码保存在 /etc/shadow 只有root用户才可访问此文件 |
字段3 | UID 用户名对应的ID 1-499 系统自用,手动添加的用户必须不小于500 |
字段4 | GID 用户对应的组ID,用户有初始组合附加组概念,初始组只能一个,附加组可以多个,创建用户时默认将同时创建和用户名相同的用户组作为该用户的初始组 |
字段5 | 描述性信息 |
字段6 | 主目录 |
字段7 | 默认的shell,如果为 /sbin/nologin 表示这个用户就不能登录了 |
这个文件存储了用户密码信息,称为“影子文件”,只有root用户可以访问该文件。
[root@ecs-b208 ~]# cat /etc/shadow
root:$6$5dXucC$DY9fCJvQ9/dXMRSG1Wpde1QKiBvTUzqDXHmDzZ0:18199:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
.....
/etc/shadow中每一行表示一个用户密码,记录中用“:” 分割,分表定义了用户密码的各个属性
第n分割字段 | 含义说明 |
---|---|
字段1 | 用户名 |
字段2 | 加密密码,采用的是SHA512散列加密算法,密码前面加"!" “*” “x” 可使密码暂时失效 |
字段3 | 最后一次修改时间,这里是整数,表示从1970年1月1日算,一天加1,累加今日的值 |
字段4 | 最小可被修改时间间隔(天),0表示随时可以修改 |
字段5 | 密码有效期(天) |
字段6 | 密码需变更前的告警天数 |
字段7 | 密码过期后的宽限天数 |
字段8 | 密码失效的时间,该值同字段3,从1970年1月1日算,一天加1 |
字段9 | 保留字段 |
[root@ecs-b208 ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
...
第n分割字段 | 含义说明 |
---|---|
字段1 | 组名称 |
字段2 | 密码 ,主要作用是用来指定组管理员 |
字段3 | GID 组ID |
字段4 | 附加用户列表 |
第n分割字段 | 含义说明 |
---|---|
字段1 | 组名称 同group文件中的组名 |
字段2 | 真正的加密密码 ,一般不用,如果显示 “!” 号表示没有组管理员也没有密码 |
字段3 | 组管理员 |
字段4 | 附加用户列表 同group文件 |
使用 useradd 命令直接增加用户,有很多参数,但一般直接添加不携带参数
[root@ecs-b208 ~]# useradd student
执行此命令Linux会自动在上述所说的几个文件中添加相应的信息:
[root@ecs-b208 ~]# grep "student" /etc/passwd
student:x:1000:1000::/home/student:/bin/bash
[root@ecs-b208 ~]# grep "student" /etc/shadow
student:!!:18921:0:99999:7:::
[root@ecs-b208 ~]# grep "student" /etc/group
student:x:1000:
[root@ecs-b208 ~]# grep "student" /etc/gshadow
student:!::
再来一个比较常见的指定一些参数的例子:
[root@ecs-b208 student]# useradd -u 550 -g student99 -G root -d /home/student99 -c "用户说明信息" -s /bin/bash student1
命令说明:
-u 550
指定UID为550-g student99
指定初始组为student99-G root
指定附加组为root-d /home/student99
指定用户主目录-c
说明信息-s
指定用哪一种shell增加了一个student用户Linux系统所做的工作如下:
linux先后自动在以上4个文件中添加相应的内容。
/etc/shadow
中的 “!!”
表示还没有设置合法的密码
默认创建用户的主目录和邮箱 /var/spool/mail/student
将 /etc/skel
目录中的配置文件复制到用户的主目录中,一般三个文件
[root@ecs-b208 skel]# ls -al
total 20
drwxr-xr-x. 2 root root 4096 Apr 11 2018 .
drwxr-xr-x. 80 root root 4096 Oct 21 14:38 ..
-rw-r--r--. 1 root root 18 Oct 31 2018 .bash_logout
-rw-r--r--. 1 root root 193 Oct 31 2018 .bash_profile
-rw-r--r--. 1 root root 231 Oct 31 2018 .bashrc
/etc/default/useradd 和 /etc/login.defs
查看 /etc/default/useradd
的内容也可以使用命令 useradd -D
查看
[root@ecs-b208 student]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/login.defs
文件主要是对用户的一些基本属性设置默认值,ID范围,过期时间,密码最大长度等。
总结创建用户的流程:
/etc/default/useradd 和 /etc/login.defs
,在 /etc/passwd /etc/group /etc/shadow /etc/gshadow
中添加用户相关信息/etc/default/useradd
创建用户主目录/etc/skel
目录中的配置文件复制到用户的主目录中创建了用户之后需要设置密码才可登录。
[root@ecs-b208 student]# passwd student
Changing password for user student.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
passwd -l 锁定用户 -u 解除锁定
[root@ecs-b208 student]# passwd -l student
Locking password for user student.
passwd: Success
[root@ecs-b208 student]# passwd -u student
Unlocking password for user student.
passwd: Success
修改用户信息 usermod
删除用户信息 userdel 加上-r 表示同时删除用户主目录
查看用户UID 和 GID id 用户名
[root@ecs-b208 ~]# su [选项] 用户名
一般选项为 “-” 表示连同当前的环境变量也一并切换
Linux 一切都是文件
“/”
之外,所有字符都可以使用Linux 文件类型分为普通、目录、设备、符号
cat一次性全部展示文件内容,cat可以合并文件内容到新的文件中,全称 concatenate(连接、连续)
-n 或 --number 输出行数编号
-b 或 --number-nonblank 输出非空行数编号
-s 或 --squeeze-blank 将连续两行以上的空白行代换为一行的空白行
[root@ecs-b208 ~]# cat -n mytest.txt
1 这是第一行
2 这是第2行
3
4 这是第3行,上面的是空白行
5
6
7
8 连续几个空白行测试
9 over 完毕
[root@ecs-b208 ~]# cat -sbn mytest.txt
1 这是第一行
2 这是第2行
3 这是第3行,上面的是空白行
4 连续几个空白行测试
5 over 完毕
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里
作业滚屏显示
-n 一次显示的行数
+n 从第n行开始显示文件内容
-c 不滚屏,先清屏后再显示内容
head 从头开始看, tail从文件尾部开始看
head / tail -n 3 mytest.txt # 查看前面/尾部 3行内容
创建文件,也可以修改文件时间
过滤来自一个文件或标准输入匹配模式内容
匹配至少三个字符,例如 abc:
# echo -e "a\nabc\nc" | grep -E '[a-z]{3}'
流编辑器,过滤和替换文本。
替换 aaa 字符串为 bbb
# tail /etc/services |sed 's/aaa/bbb/'
awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及
生成报表等等
打印第二字段,默认以空格分隔:
# tail -n3 /etc/services |awk '{print $2}'
48049/tcp
48128/tcp
48128/udp
指定冒号为分隔符打印第一字段:
# awk -F ':' '{print $1}' /etc/passwd
root
bin
daemon
...
永久性删除文件或目录
rm -f 强制删除
rm -r 级联删除,如果删除目录必须带此参数
rm -ri 询问方式删除
[root@ecs-b208 /]# cd /b/bb/
[root@ecs-b208 bb]# rm -ri /a/aa
rm: remove directory ‘/a/aa’? y
[root@ecs-b208 bb]#
创建目录
-p 级联创建目录
[root@ecs-b208 /]# mkdir -p /a/aa /b/bb
[root@ecs-b208 /]# cd /b/bb/
[root@ecs-b208 bb]#
最常用的命令,列出目录下的文件信息,默认按照文件名称排序
[root@ecs-b208 /]# ls -al
total 172
dr-xr-xr-x. 30 root root 4096 Oct 22 16:14 .
dr-xr-xr-x. 30 root root 4096 Oct 22 16:14 ..
drwxr-xr-x 2 root root 4096 Oct 22 16:16 a
drwxr-xr-x 3 root root 4096 Sep 29 2020 agv-docker-image
drwxr-xr-x 3 root root 4096 Feb 20 2021 api
-rw-r--r-- 1 root root 0 Feb 27 2019 .autorelabel
drwxr-xr-x 3 root root 4096 Oct 22 16:16 b
lrwxrwxrwx. 1 root root 7 Feb 27 2019 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Feb 3 2020 boot
-a 全部列出,包括隐藏文件
-l 使用列表长格式展示
-S 按照容量大小排序
-h 文件大小 按照 1 KB MB GB展示
-t 按照时间排序
-r 将排序结果翻转
[root@ecs-b208 ~]# ls -lhS
total 2.1G
-rw------- 1 root root 629M Nov 10 2020 java-8.tar
-rw-r--r-- 1 root root 526M Nov 9 2020 mysql.tar
-rw------- 1 root root 516M Nov 10 2020 tomcat-latest.tar
-rw------- 1 root root 153M Sep 30 14:30 middol-rabbitmq.tar
-rw------- 1 root root 139M Nov 10 2020 nginx-1.18.1.tar
-rw-r--r-- 1 root root 97M Oct 4 14:26 redis5.tar
-rw------- 1 root root 40M Nov 10 2020 sjqzhang-go-fastdfs-latest.tar
-rw-r--r-- 1 root root 31M Nov 3 2020 IQMS_HY_M.war
drwxr-xr-x 2 root root 4.0K Oct 19 17:45 abc
drwxr-xr-x 2 root root 4.0K Oct 19 17:45 tdir
-rw-r--r-- 1 root root 718 Oct 20 17:21 qiuxing.sh
....
ln可生成链接文件或目录,链接分为 软链接 和 硬链接
了解一下ext文件系统的架构, 主要分两部分 索引信息(inode) 和 数据块信息(block)
inode-1 | inode-2 | inode-n |
---|---|---|
block1 | block2 | block3 |
block4 | block5 | block6 |
block7 | blockn | |
inode 默认大小128字节,记录文件权限、所有者、大小、修改时间等 以及 保存的block编号
block 每一个数据块的大小可以是 1KB 2KB 4KB 默认4KB,block用于实际存储数据包括文件名。
每一个文件都独占一个inode,文件内容由inode的记录来指向
查找一个文件,例如 /root/test时,经过如下步骤:
首先到根目录的inode信息(根目录/的inode是系统预先知道的)
判断当前用户是否有权限访问 根目录的inode
如果有权限,则在根目录的inode中找到对应的根目录block,
在根目录block中找到 /root的文件名和对应的inode号
通过/root的inode号,查找/root的inode信息,从而判断用户是否有权限访问/root目录的block
如果有权限,从/root目录的block读取 test文件的文件名和对应的inode号
通过test文件对应的inode号,判断用户是否有权限访问 test文件的block
如果有权限,则可以读取test文件中block中数据,这样完成了对 /root/test文件的读取访问操作
通过上面的信息,再来看 上面是 软链接 和 硬链接 ?
[root@ecs-b208 ~]# ln -s 源文件 要生成的链接文件名
-s : 生成软链接 不带则表示硬链接
[root@ecs-b208 ~]# cat /root/test
hello, 这是一个链家测试文件
[root@ecs-b208 ~]# ln /root/test /root/file1
[root@ecs-b208 ~]# ln -s /root/test /root/file2
上面源文件是 /root/test
软连接文件是 /root/file2
硬连接文件是 /root/file2
通过 ls -i 查看每一个文件的 inode号,就是文件唯一编号(不同的文件系统-即:分区,inode号是重新计算的)
[root@ecs-b208 ~]# ls -il /root/
total 2178632
2371656 -rw-r--r-- 2 root root 38 Oct 22 17:24 file1
2371653 lrwxrwxrwx 1 root root 10 Oct 22 17:37 file2 -> /root/test
2371656 -rw-r--r-- 2 root root 38 Oct 22 17:24 test
....
硬链接和源文件的inode号一样:都是2371656,软连接则重新生成一个inode号。
硬链接和软链接最大区别:硬链接不会建立自己的inode和block,全部指向源文件, 软链接则会建立自己的 inode和block,但block写的不是真正数据,而是源文件的文件名和inode号。
硬链接和软链接的区别总结:
区别点 | 硬链接 | 软链接 |
---|---|---|
修改源文件,链接文件数据是否同时修改 | 是 | 是 |
删除源文件,链接文件是否可以继续访问 | 是 | 否 |
是否建立新的inode,修改inode总数 | 否 |
是 |
是否可以跨分区(文件系统)建立链接文件 | 否 |
是 |
是否可以链接目录 | 否 |
是 |
Linux 常见的文件权限有3个权限位 r( 是否可读) w(是否可写) x( 是否可执行)
ls -l 可以查询每一个文件的权限, 权限分三部分:
[root@ecs-b208 ~]# ls -l
total 2178632
drwxr-xr-x 2 root root 4096 Oct 19 17:45 abc
-rw-r--r-- 1 root root 273 Oct 20 16:06 case-test.sh
...
drwxr-xr-x 除第一位外,后面每3个一分组
所有者权限 | 所属组权限 | 其他人权限 |
---|---|---|
drwx | r-x | r-x |
第一位d代表目录,如果是- 代表普通文件,如果是l代表链接文件,b块文件,c字符文件,root用户可对其进行读写执行 | 与root在一个组的用户可对该文件进行 读或运行 | 其他用户可对该文件进行 读或运行 |
### chmod
采用chmod修改某文件权限,
[root@ecs-b208 ~]# chmod 权限值 文件名称
权限值是如何算出的?
权限标识位中, r对应整数4 w对应整数2 x对应整数1
这样可以用来,修改某文件权限
rwx = 4+2+1 =7, r-x=4+1=5 等等,例如下面修改mytest.sh 文件,让所有者或和所有者在一个组的人可读写可执行,其他的用户只能读和执行,不可修改此文件,就可以用如下命令:
[root@ecs-b208 ~]# chmod 775 mytest.sh
还可以这样,只对单独某个部分增加或清除某个权限值
[root@ecs-b208 ~]# chmod u=rwx, go=rx mytest.sh
u:所有者权限
g:所属组权限
o:其他人权限
a:全部,以上三个
修改文件归属的用户或用户组,root用户可以修改任何文件的权限,普通用户只能修改自己的文件
[root@ecs-b208 ~]# chown 所有者 mytest.sh
[root@ecs-b208 ~]# chown 所有者:所属组 mytest.sh
常用的进程管理命令 ps top 等
[root@ecs-b208 ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 51780 2848 ? Ss 2020 85:54 /usr/lib/systemd/systemd --system --deserialize 15
root 2 0.0 0.0 0 0 ? S 2020 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2020 9:07 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 2020 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 2020 1:53 [migration/0]
root 8 0.0 0.0 0 0 ? S 2020 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 2020 204:30 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 2020 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 2020 1:58 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 2020 1:39 [watchdog/1]
root 13 0.0 0.0 0 0 ? S 2020 1:44 [migration/1]
root 14 0.0 0.0 0 0 ? S 2020 8:23 [ksoftirqd/1]
root 16 0.0 0.0 0 0 ? S< 2020 0:00 [kworker/1:0H]
root 18 0.0 0.0 0 0 ? S 2020 0:00 [kdevtmpfs]
root 19 0.0 0.0 0 0 ? S< 2020 0:00 [netns]
root 20 0.0 0.0 0 0 ? S 2020 0:42 [khungtaskd]
......
-a
线上一个终端所有进程
-u
显示进程归属用户和内存情况
-x
显示没有终端的进程
-e
可显示进程的父进程
ps
命令输出的各字段含义
字段 | 含义 |
---|---|
USER | 由哪个用户产生 |
PID | 进程ID |
%CPU | CPU使用率 |
%MEM | 物理内存使用率 |
VSZ | 占用虚拟内存大小(KB) |
RSS | 占用物理内存大小(KB) |
TTY | 在哪一个终端运行,tty1-tty7代表本地控制台(Alt + F1~F7 组合键切换),tty7是图形终端,pts/0-255一般代表远程连接终端 |
STAT | 进程状态, D-进程不可被唤醒通常用于IO R-进程正在运行 S-进程睡眠,且可被唤醒 T-进程暂停,可能是在调试 W-处于内存交换状态 Z-僵尸进程 <-具备高优先级 s-包含子进程 l-进程有多线程 +-进程位于后台 N-具备低优先级 L-进程被锁入内存 |
START | 进程的启动时间 |
TIME | 进程占用CPU时间 |
COMMAND | 产生进程的命令 |
ps -el
或 ps -l
查看父进程相关信息, 不加e 则表示只查看当前登录的终端产生了哪些进程。
[root@ecs-b208 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 17541 17536 0 80 0 - 29129 do_wai pts/2 00:00:00 bash
0 S 0 17908 17541 0 80 0 - 365 pipe_w pts/2 00:00:00 ps
0 R 0 17909 17908 0 80 0 - 38310 - pts/2 00:00:00 ps
字段 | 含义 |
---|---|
F | 进程权限标志,1:进程可被复制,但不能被执行 4:进程使用的是root用户权限 |
S | 进程状态 同 aux 中的 STAT |
UID | 进程的用户ID |
PID | 进程ID |
PPID | 父进程ID |
C | CPU占用率 |
PRI | 优先级 数值越小优先级越高 ,越被CPU早执行 |
NI | 优先级 |
ADDR | 内存地址 |
SZ | 占用内存大小 |
WCHAN | 进程是否在运行 “-” 表示在运行 |
TTY | 哪一个终端产生 |
TIME | 占用CPU时间 |
CMD | 产生进程的命令 |
显示程序和进程的关系
[root@ecs-2220 ~]# pstree [选项] [PID 或用户名]
显示某一个java进程的所有pstree信息,包括下面的线程进程信息
[root@middol-dev ~]# pstree -aup 3211280
java,3211280 -Xmx256m -Xms256m -Djava.security.egd=file:/dev/./urandom -jar -Dspring.profiles.active=test ...
├─{java},3211321
├─{java},3211329
├─{java},3211330
├─{java},3211331
├─{java},3211332
...
-a 显示进程对应的完整指令
-p 显示进程的PID
-u 显示进程用户
可以持续跟进当前进程情况:
# top [选项]
选项中可以的参数:
-d 指定top每隔几秒,默认3秒
-p 指定某一个进程的PID
在top展示的信息时,按下指定的大写字母可以有如下结果:
P : CPU占用率排序
M:内存排序
N:pid排序
T:CPU累加时间排序
[root@k8s-master ~]# top
top - 14:04:59 up 287 days, 20:43, 1 user, load average: 0.08, 0.07, 0.07
Tasks: 141 total, 1 running, 140 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.5 us, 2.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.8 hi, 0.7 si, 0.0 st
MiB Mem : 7541.0 total, 172.2 free, 5272.5 used, 2096.3 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2003.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1791952 root 20 0 4080852 1.2g 14352 S 3.0 16.0 3144:49 java
734295 root 20 0 3034416 440076 15916 S 1.0 5.7 17:42.49 java
2511899 root 10 -10 238536 89176 11140 S 1.0 1.2 425:53.50 AliYunDun
3224137 root 20 0 3171100 520132 11600 S 1.0 6.7 95:06.81 java
4078739 root 20 0 2941564 458284 10496 S 1.0 5.9 208:31.61 java
349825 101 20 0 63808 6996 4388 S 0.3 0.1 284:40.86 nginx
712594 root 20 0 3158172 592640 10612 S 0.3 7.7 188:15.72 java
1130111 root 20 0 0 0 0 I 0.3 0.0 0:00.21 kworker/0:2-events_power_efficient
3222655 root 20 0 3172480 532652 11536 S 0.3 6.9 91:56.15 java
4078287 root 20 0 2943960 452544 10760 S 0.3 5.9 205:57.33 java
1 root 20 0 179032 12036 8016 S 0.0 0.2 4:41.94 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:07.43 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
top的信息前5行显示系统整体情况,从第6行开始是系统的进程情况
第一行
top - 14:04:59 up 287 days, 20:43, 1 user, load average: 0.08, 0.07, 0.07
内容 | 说明 |
---|---|
14:04:59 | 系统当前时间 |
up 287 days, 20:43 | 已经运行287天20个小时43分钟 |
1 user | 当前登录了1 个用户 |
load average: 0.08, 0.07, 0.07 | 系统过去1分钟,5分钟,15分钟的负载情况,这个值如果超过CPU的核数就表示系统高负荷运行 |
第二行
Tasks: 141 total, 1 running, 140 sleeping, 0 stopped, 0 zombie
内容 | 说明 |
---|---|
141 total | 系统中总进程数 |
1 running | 正在运行的进程数 |
140 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
第三行CPU信息
%Cpu(s): 2.5 us, 2.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.8 hi, 0.7 si, 0.0 st
内容 | 说明 |
---|---|
2.5 us | 用户模式CPU占用率 |
2.2 sy | 系统模式CPU占用率 |
0.0 ni | 改变过进程优先级的用户进程CPU占用率 |
93.8 id | 空闲的CPU占用率 |
0.0 wa | 等待输入/输出的进程CPU占用率 |
0.8 hi | 硬中断请求服务的CPU占用率 |
0.7 si | 软中断请求服务的CPU占用率 |
0.0 st | 虚拟机中的CPU等待实际CPU的时间比例 |
第四行 内存信息
MiB Mem : 7541.0 total, 172.2 free, 5272.5 used, 2096.3 buff/cache
内容 | 说明 |
---|---|
7541.0 total, | 内存总量 KB |
172.2 free | 空闲 |
5272.5 used | 已用 |
2096.3 buff/cache | 作为缓冲/缓存的内存容量 |
解释一下什么叫 缓冲(Buffer) 和 缓存(Cache)?
缓存: 硬盘里面数据提前加载到内存中,这样不用再次去硬盘取数据了,目的是加快数据读取
缓冲:先将要写的数据放入缓冲区,然后聚集一起写入硬盘,目的是加大“硬盘”写入的吞吐量
第五行 交换分区信息
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2003.0 avail Mem
内容 | 说明 |
---|---|
0.0 total, | 内存总量 KB |
0.0 free, | 空闲 |
0.0 used | 已用 |
2003.0 avail Mem |
进程信息的各个字段含义:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
字段 | 含义 |
---|---|
PID | 进程id |
USER | 用户 |
PR | 优先级,数值越小,优先级越高 |
NI | 优先级,数值越小,优先级越高 |
VIRT | 虚拟内存使用量 KB |
RES | 物理内存使用量 KB |
SHR | 共享内存使用量 KB |
S | 进程状态 |
%CPU | CPU占用率 |
%MEM | 内存占用率 |
TIME+ | 占用CPU的时间 |
COMMAND | 进程的命令 |
list opened files 的缩写,可以进一步知道这个进程到底在调用哪些文件.
[root@ecs-2220 ~]# lsof -p 进程号
查看目录被哪些进程调用
[root@ecs-2220 ~]# lsof 目录
2个参数表示进程优先级 PRI 和 NI
PRI( 最终值) = PRI(原始值) + NI
PRI 用户不可修改, 只能修改 NI ,只有root用户可以设置为负数,NI 范围是 -20 ~ 19
普通用户只能调高且大于0,且只能自己的进程
采用 nice 启动程序时一并调整优先级,采用renice 调整已经启动的进程优先级
# nice -n NI值 启动程序的命令
# nice -n 10 java -jar mytest.jar
# renice 优先级 进程id
kill -9 强制结束
kill -15 正常结束 默认就是 15
killall 结束一个用户下的所有进程
pkill 通过进程名称进行结束进程
[root@ecs-2220 ~]# pkill -9 httpd
一般机械磁盘的大小 = 磁头数量 * 柱面数量 * 一个盘面上的扇区数量 * 单扇区大小(一般为4096 字节)
固态硬盘采用存储芯片作为存储介质,一般两种介质:闪存 和 DRAM
MBR (master boot record) 主引导记录
是Linux系统初始化的时候,根据此记录来识别硬盘设备。
MBR 占据一块磁盘的第一个磁道的第一个扇区里面。
引导程序 boot loader (446 字节) |
分区表 partition table (16 x 4 字节) |
结束标志 (2 字节) |
---|
分区表 partition table 中存储了 包括分区号、分区起始柱面和分区柱面数量,其中常见的分区号如下:
分区号 | 说明 |
---|---|
0x5 或 0xf | 可扩展分区 extended |
0x82 | 交换分区 swap |
0x83 | 普通分区 Linux |
0x8e | LVM 分区 LVM |
0xfd | RAID 分区 RAID |
每一个分区表大小是 16字节,MBR对每一块硬盘的分区表总大小就只有64字节,因此一个硬盘上最多4 个主分区
但是
, 一般设置为3个主分区,1个扩展分区,扩展分区部署一个真正分区,是一个16字节的分区表空间指针,指向数个逻辑分区
mount [options] [--source] <物理设备存储块> | [--target] <要挂载到的Linux目录>
mount /dev/sdb1 /apps/web
如果要挂载**U盘
**, U盘的设备文件名是Linux自动分配的,需要通过 fdisk -l
命令查看具体的名称,然后挂载
假如是 sda1
[root@ecs-2220 ~]# mount -t vfat /dev/sda1 /apps/upan
因为U盘是Windows分区,需要指定 文件系统格式 为 vfat
如果出现乱码
(因为linux默认 UTF-8编码,U盘在window中保存数据采用的是GBK编码) ,则还需要指定编码格式
[root@ecs-2220 ~]# mount -t vfat -o iocharset=utf8 /dev/sda1 /apps/upan
Linux 默认读取 /etc/fstab
配置文件来自动挂载硬盘
[root@middol-dev ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Feb 26 01:24:48 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=d2f8ba84-ffb6-4480-803c-3ae03326c905 / ext4 defaults 1 1
UUID=d8c812a4-7fbc-4cb7-803c-7c995b5e0c74 /opt ext4 defaults 0 2
fstab文件中每一行一条独立配置信息,每一行分6列,空格隔开
第一列为UUID,此处可通过blkid
命令生成磁盘分区的UUID。
第二列为磁盘分区的挂载目录,可以通过df -TH命令查询。
第三列为磁盘分区的文件系统格式, 可以通过df -TH命令查询。
第四列为磁盘分区的挂载选项,此处通常设置为defaults即可。
第五列为Linux dump备份选项。
第六列为fsck选项,即开机时是否使用fsck检查磁盘。
0表示不检验。
挂载点为(/)根目录的分区,此处必须填写1。
根分区设置为1,其他分区只能从2开始,系统会按照数字从小到大依次检查下去。
说明:磁盘的UUID(universally unique identifier)是Linux系统为磁盘分区提供的唯一的标识字符串。
执行如下命令,查询磁盘分区的UUID。
[root@ecs-2220 ~]# blkid 磁盘分区
以查询磁盘分区**“/dev/xvdb1”**的UUID为例:
[root@ecs-2220 ~]# blkid /dev/xvdb1
回显类似如下信息:
[root@ecs-b656 test]# blkid /dev/xvdb1
/dev/xvdb1: UUID="1851e23f-1c57-40ab-86bb-5fc5fc606ffa" TYPE="ext4"
表示**“/dev/xvdb1”**的UUID。
[root@ecs-2220 ~]# fdisk -l
Disk /dev/vda: 85.9 GB, 85899345920 bytes, 167772160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0008d18f
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83886079 41942016 83 Linux
[root@ecs-2220 ~]# fdisk /dev/vda
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
表示磁盘有两种分区类型:
Select (default p): p
Partition number (2-4, default 2):
Partition number (2-4, default 2): 2
First sector (83886080-167772159, default 83886080):
First sector (83886080-167772159, default 83886080):
Using default value 83886080
Last sector, +sectors or +size{K,M,G} (83886080-167772159,default 167772159):
输入新分区的截止磁柱编号,按“Enter”
Last sector, +sectors or +size{K,M,G} (83886080-167772159,
default 167772159):
Using default value 167772159
Partition 2 of type Linux and of size 40 GiB is set
Command (m for help):
输入“p”,按“Enter”,查看新建分区
Command (m for help): p
Disk /dev/vda: 85.9 GB, 85899345920 bytes, 167772160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0008d18f
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83886079 41942016 83 Linux
/dev/vda2 83886080 167772159 41943040 83 Linux
Command (m for help):
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
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)
Syncing disks.
partprobe
命令,将新的分区表变更同步至操作系统执行以下命令,设置新建分区文件系统格式
# 以“ext4” 文件格式为例:
[root@ecs-2220 ~]# mkfs -t ext4 /dev/vda2
# 设置xfs文件系统的操作与ext3或者ext4一样,命令为:
[root@ecs-2220 ~]# mkfs -t xfs /dev/vda2
[root@ecs-bab9 test]# mount /dev/vda2 /opt
查看硬盘使用情况
[root@middol-dev ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 770M 7.0G 10% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vda1 40G 14G 24G 37% /
tmpfs 1.6G 0 1.6G 0% /run/user/0
查看目录占用磁盘空间大小
–max-depth : <目录层数> 超过指定层数的目录后,予以忽略。
-h : 以K,M,G为单位,提高信息的可读性。
[root@middol-dev opt]# du -h --max-depth=1 /opt/
16K /opt/lost+found
22G /opt/lib
23M /opt/frp
12K /opt/containerd
8.9G /opt/apps
31G /opt/
[root@middol-dev opt]#
检查文件系统并尝试修复错误。
独立冗余磁盘阵列(Redundant Array of Independent Disks,RAID),是把多块独立的磁盘(物理磁盘)按照一定的方式组合构建磁盘组(逻辑磁盘)。相比单个磁盘,能够提升存储性能和数据可靠性。
常见RAID磁盘阵列介绍
RAID级别 | 简介 | 读写性能 | 安全性能 | 磁盘使用率 | 组建不同RAID阵列所需的最少磁盘数量 |
---|---|---|---|---|---|
RAID0 | RAID0将数据分条存储在多个磁盘上,可实现并行读写,提供最快的读写速率。 | 多个磁盘并行读写获取更高性能 | 最差没有冗余能力,一个磁盘损坏,整个RAID阵列数据都不可用 | 100% | 两块 |
RAID1 | 通过构造数据镜像实现数据冗余,阵列中一半的磁盘容量投入使用,另一半磁盘容量用来做镜像,提供数据备份。 | 读性能:与单个磁盘相同写性能:需要将数据写入是两个磁盘,写性能低于单个磁盘 | 最高提供磁盘数据的完整备份,当阵列中的一个磁盘失效时,系统可以自动采用镜像磁盘的数据 | 50% | 两块 |
RAID01 | 结合RAID0和RAID1两种磁盘阵列,先将一半磁盘组建成RAID0分条存储数据,再用另一半磁盘做RAID1镜像。 | 读性能:和RAID0相同写性能:和RAID1相同 | 比RAID10的安全性能低 | 50% | 四块 |
RAID10 | 结合RAID1和RAID0两种磁盘阵列,先将磁盘两两组建成RAID1镜像,再组建RAID0将数据分条存储。 | 读性能:RAID0相同写性能:RAID1相同 | 和RAID1的安全性能相同 | 50% | 四块 |
RAID5 | RAID5不需要单独指定数据校验磁盘,而是将每块磁盘生成的校验信息分块存储至阵列中的每块磁盘中。 | 读性能:和RAID0相同写性能:由于要写入奇偶校验信息,写性能低于单个磁盘 | 比RAID10的安全性能低 | 75% | 三块 |
通过mdadm工具创建RAID阵列,以RAID10为例:
参考华为云手册:
https://support.huaweicloud.com/bestpractice-evs/evs_02_0019.html
Linux系统中,用户通过文件系统和设备连接的,设备文件的目录在 /dev
下面
设备的文件名由两部分组成: 主设备号
和 次设备号
主设备号代表设备类型,次设备号代表同一类型中的当前第几个设备
例如 /dev/sda /dev/sdb … 代表SCSI第1块硬盘和第2块硬盘
硬盘设备文件 /dev/sda5 各组成部分说明:
/dev | /sd | a | 5 |
---|---|---|---|
硬件设备文件所在目录 | sd表示SCSI设备 | 硬盘的编号,以字母a,b,c…表示 | 分区编号,以数字1,2,3,4,5…表示, 1-4表示主分区,5开始表示逻辑分区 |
Linux中 设备文件可分物理设备文件
和虚拟设备文件
虚拟设备文件没有对应具体的物理设备,它们有专门的用处,下面列举常见的虚拟设备:
/dev/null
表示空设备,所有写入此设备的信息都将丢失
/dev/zero
是一个伪文件系,可以连续产生null流(二进制的零流)
/dev/full
特殊的设备文件,想起写入内容时,总返回"设备无剩余空间"的信息。
[root@ecs-s6 dev]# echo 'test' > /dev/full
-bash: echo: write error: No space left on device
lscpu
查看CPU的处理单元信息,它从 sysfs
和/proc/cpuinfo
收集CPU体系结构信息。
[root@ecs-s6 tmps]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Gold 6278C CPU @ 2.60GHz
Stepping: 7
CPU MHz: 2600.000
BogoMIPS: 5200.00
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 1024K
L3 cache: 36608K
NUMA node0 CPU(s): 0-3
主要字段说明 | 说明 |
---|---|
Architecture | 架构 |
Vendor ID | CPU厂商ID |
Thread(s) per core | 单个核线程数 |
Core(s) per socket | CPU核数 |
CPU family | CPU系列 |
CPU MHz | 主频 |
Virtualization type | 支持的虚拟化技术 |
L1d cache | 一级缓存 L1数据缓存 |
L1i cache | 一级缓存 L1指令缓存 |
采用 free
命令查看内存使用情况。
[root@ecs-s6 tmps]# free -h
total used free shared buff/cache available
Mem: 7.6G 1.5G 159M 357M 6.0G 5.5G
Swap: 0B 0B 0B
[root@ecs-s6 tmps]#
第一列
Mem
内存的使用信息
Swap
交换空间的使用信息
第一行
total
系统总的可用物理内存大小
used
已被使用的物理内存大小
free
还有多少物理内存可用
shared
被共享使用的物理内存大小
buff/cache
被 buffer 和 cache 使用的物理内存大小
available
还可以被 *应用程序* 使用的物理内存大小
其中有两个概念需要注意
free 与 available 的区别
free
是真正尚未被使用的物理内存数量。
available
是应用程序认为可用内存数量,available = free + buffer + cache
(注:大概的计算方法)
Linux 为了提升读写性能,会提前申请一些内存空间作为缓存和缓冲,
对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。
但当应用程序申请内存时,如果free内存不够,内核就会回收buffer和cache的内存
来满足应用程序的请求
解释一下什么叫 缓冲(Buffer) 和 缓存(Cache)?
缓存: 硬盘里面数据提前加载到内存中,这样不用再次去硬盘取数据了,目的是加快数据读取
缓冲:先将要写的数据放入缓冲区,然后聚集一起写入硬盘,目的是加大“硬盘”写入的吞吐量
如果你进一步向了解物理内存和虚拟内存使用情况,可使用 vmstat
命令:
[root@ecs-s6 tmps]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 161316 435760 5821112 0 0 0 2 0 0 14 6 79 0 0
0 0 0 161324 435760 5821112 0 0 0 32 403 599 1 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 0 291 494 0 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 0 291 480 0 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 56 222 410 0 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 0 202 383 0 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 0 236 443 0 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 12 198 382 0 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 0 200 373 0 0 100 0 0
0 0 0 161324 435760 5821112 0 0 0 0 179 345 0 0 100 0 0
vmstat 1 10 表示每隔1秒刷新一次,一共刷新10次
字段项 | 说明 |
---|---|
procs | r : 当前运行或等待CPU的进程数 , 如果长期大于CPU核数则表示需要增加CPUb : 等待其他资源(例如 I/O)的进程数 |
member | swpd : 虚拟内存已使用容量 free : 空闲物理内存 buff : 缓冲区大小cache : 缓存区大小 |
swap | si : 这一秒磁盘进入内存的大小 so : 这一秒内存进入磁盘的大小 |
io | bi 这一秒写磁盘总量 bo 这一秒读磁盘总量 bi+bo 值过大,且wa值较大,则表示系统 I/0性能瓶颈 |
system | in : 某一时间检测到的设备总数 cs : 每一秒产生的上下文切换数量 |
cpu | us : 用户进程消耗CPU时间比 sy : 系统内核进程消耗CPU时间比例,一般 us+sy 值大于80%则说明CPU瓶颈 id : CPU空闲的时间比 wa :I/0等待所占用CPU的时间比例 , 参考值为 20% ,超过则可能是IO瓶颈 st : 虚拟机 占用CPU的百分比 |
查看内核产生的信息,内核在系统启动过程中,检测并加载驱动程序时,信息一闪而过,之后可以通过dmesg
命令查看具体信息
查看第一块网卡信息:
[root@ecs-s6 tmps]# dmesg |grep eth0
查看CPU信息
[root@ecs-s6 tmps]# dmesg |grep CPU
查看可用块设备且显示他们之间的依赖关系。
[root@ecs-s6 tmps]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 50G 0 disk
└─vda1 253:1 0 50G 0 part /
vdb 253:16 0 100G 0 disk
└─vdb1 253:17 0 100G 0 part /opt
列名 | 含义 |
---|---|
NAME | 块设备名 |
MAJ:MIN | 主:次设备号 |
RM | 是否是移动设备 1表示是 0表示否 |
SIZE | 存储空间大小 |
RO | 是否只读 |
TYPE | 是否是一个分区, dist表示磁盘 part表示一个分区 |
MOUNTPOINT | 设备挂载点 |
网络管理主要包括:网络接口管理、基本IP路由和网关、配置DNS、网络诊断等
网络接口卡(NIC)
网络接口
Linux系统通过网络接口访问NIC,每一个NIC,内核都生成一个网络接口,并且按照eth0、eth1命名
字母表示数据连接技术,数字表示这个技术的第几个接口卡
eth代表以太网,例如fddi0 代表光纤、tr0代表令牌环
利用 ifconfig检测接口、配置接口,默认列出活跃的接口, 加参数-a
列出所有接口信息
[root@middol-dev /]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:6dff:fe2a:8d6b prefixlen 64 scopeid 0x20<link>
ether 02:42:6d:2a:8d:6b txqueuelen 0 (Ethernet)
RX packets 435533321 bytes 156706844872 (145.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 335468853 bytes 151352883542 (140.9 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.9 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::f816:3eff:fe03:2833 prefixlen 64 scopeid 0x20<link>
ether fa:16:3e:03:28:33 txqueuelen 1000 (Ethernet)
RX packets 348076396 bytes 116815739938 (108.7 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 430972181 bytes 205118804741 (191.0 GiB)
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 1000 (Local Loopback)
RX packets 596689 bytes 1366705050 (1.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 596689 bytes 1366705050 (1.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ifconfig可以做网络接口的配置操作,例如:up down 操作
使eth1 网络接口禁用
[root@middol-dev /]# ifconfig eth1 down
Linux 网络接口配置文件 在: /etc/sysconfig/network-scripts/
中,按照ifcfg-
这样的格式命名的配置文件。
例如: vi /etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #网卡设备名称
ONBOOT=yes #启动时是否激活 yes | no
BOOTPROTO=static #协议类型 dhcp bootp none
IPADDR=192.168.1.90 #网络IP地址
NETMASK=255.255.255.0 #网络子网地址
GATEWAY=192.168.1.1 #网关地址
BROADCAST=192.168.1.255 #广播地址
HWADDR=00:0C:29:FE:1A:09 #网卡MAC地址
TYPE=Ethernet #网卡类型为以太网
复习一下,网际互联及OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
参考博客:https://blog.csdn.net/taotongning/article/details/81352985
每一层都是承上启下的作用,接受上层或下层的数据
发送数据端从应用层 ------》物理层,
接受数据端从物理层-----》应用层。
OSI模型 | 说明 | 举例 |
---|---|---|
应用层 | 为应用软件提供了很多服务 | FTP协议,SSH远程登录协议,SMTP/POP3邮件协议,HTTP协议等 |
表示层 | 格式化数据 | 数据的格式化,变成 JPG、GIF格式的数据,数据加密解密等,数据解压缩等 |
会话层 | 控制会话,建立管理终止应用程序会话 | 各类软件中 session的概念 |
传输层 | 提供可靠和尽力而为的端到端的数据传输 | TCP、UDP协议,3次握手建立连接,负责网络传输和会话建立。 |
网络层 | IP选址和路由选择 | 链路层 通过MAC地址进行数据通讯,必须同一个局域网,数据完全广播传输。IP地址的出现就是解决不同局域网之间的数据通讯,网关负责转发。 |
链路层 | 定义如何格式化二进制数据流,支持错误检测 | 以太网协议规定一组电信号称之为一个数据包,或者叫做一个**“帧”**。[head头部 发送接收的MAC地址] + [data数据部分 最短46字节,最长1500字节] 举例:交换机通过MAC地址转发数据,逻辑链路控制 |
物理层 | 物理传输、硬件、物理特性 | 二进制数据流0110…,光纤,网线,无线电波等,该层没有寻址的概念 |
以太网硬件物理地址-MAC地址,主要工作在链路。
以太网接口的地址有两个 IP地址
和 硬件MAC地址
MAC地址用于同一个局域网间的主机通讯,同一个局域网内MAC地址不可重复
C:\Windows\system32>ipconfig /all
....
以太网适配器 以太网 4:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Sangfor SSL VPN CS Support System VNIC
物理地址. . . . . . . . . . . . . : 00-FF-25-16-00-F8
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
...
上面的 物理地址 00-FF-25-16-00-F8 就是MAC地址。
IP地址用于网络层,对于不同的局域网采用IP地址+网关进行寻址通讯,例如路由器担任网络的网关工作。
每一个ip地址分成四个部分
,每个部分是一个字节即8位
比特位 0~255:
例如一个IP地址 192.118.12.66的组成和表示格式如下:
表现格式 | 第1段 | 第2段 | 第3段 | 第4段 |
---|---|---|---|---|
十进制 | 192 | 118 | 12 | 66 |
二进制 | 11000000 | 10101000 | 00001100 | 01000010 |
十六进制 | C0 | A8 | 0C | 42 |
每一个ip地址分为 网络地址部分
和 主机地址部分
如何识别网络部分和主机部分? 答案是采用子网掩码(Netmask)
子网掩码说白了就是,组成IP地址的四个部分有多少位置是1,多少位置是0,从头开始数,全部1的部分就表示这个IP地址的网络部分。
网络地址部分 = IP地址 与运算(&) 子网掩码
第1段 | 第2段 | 第3段 | 第4段 | |
---|---|---|---|---|
IP地址 | 192 | 118 | 12 | 66 |
子网掩码-二进制 | 11111111 | 11111111 | 00000000 | 00000000 |
子网掩码-十进制 | 255 | 255 | 0 | 0 |
& 计算得到网络地址 | 192 | 118 | 0 | 0 |
类别 | 子网掩码 | IP地址示例 | 得到的网络地址部分 |
---|---|---|---|
A类 | 255.0.0.0 | 192.118.12.66 | 192.0.0.0 |
B类 | 255.255.0.0 | 192.118.12.66 | 192.118.0.0 |
C类 | 255.255.255.0 | 192.118.12.66 | 192.118.12.0 |
划分了子网类 | 255.255.128 .0 |
192.118.129 .66 |
192.118.128.0 |
划分了子网类 | 255.255.128 .0 |
192.118.127 .66 |
192.118.0.0 |
备注: 子网络类,就是在现有基础A/B/C类网络位上,向主机位借1或几位
上面的例子,最后两个 子网掩码是 255.255.128
.0 , 其实就是 B类网络
255.255.0.0 向主机位借了 1
位 。
第1段 | 第2段 | 第3段 | 第4段 | |
---|---|---|---|---|
划分了子网络的子网掩码 | 192 | 118 | 128 | 0 |
对应的十进制数据 | 255 | 255 | 128 |
0 |
对应的二进制数 据 | 255 | 255 | 1 0000000 |
00000000 |
说明 | 原B类子网掩码 | 原B类子网掩码 | 向原主机位借了1位 充当子网络标识位,划分了两个 子网络 192.118.0.0/17 和 192.118.128.0/17 |
0 |
备注: 192.118.0.0/17 这里面的 /17
代表 子网掩码位数为17位
, 即从第一部分开始1的个数,例如A类是/8, B类是/16, C类是/24
例如 源主机 192.168.10.51 和 目的主机 192.168.10.8 之间的通讯过程。
(1)验证目的主机是否和自己在同一个网络上
验证方法:自己的子网掩码 与运算目的主机ip判断 网络部分是一致
(2)如果是同一网络上,接下来获得目的主机的MAC地址
获得方法:使用本地网络的底层协议 ARP
( Address Resolution Protocol )地址解析协议,
源主机会群发广播整个本地网络:“告诉我(192.168.10.51)谁是 192.168.10.8 的主机,收到消息后把你的MAC地址给我,谢谢!”
(3) 本地网络中只有 192.168.10.8 的主机会回复 源主机 192.168.10.51 ,并且把MAC地址给源主机。
(4) 源主机获得目的主机的MAC地址后,即可通讯开始,另外也会缓存目的地址的MAC地址
通过 arp -a
查看一台主机内的ARP缓存
[root@ecs-b208 ~]# arp -a
? (172.16.0.254) at fa:fa:fa:fa:fa:01 [ether] on eth0
? (172.17.0.6) at <incomplete> on docker0
? (172.17.0.2) at 02:42:ac:11:00:02 [ether] on docker0
? (172.17.0.4) at 02:42:ac:11:00:04 [ether] on docker0
? (172.16.0.156) at fa:16:3e:d2:2a:d9 [ether] on eth0
? (172.17.0.3) at 02:42:ac:11:00:03 [ether] on docker0
gateway (172.16.0.1) at fa:16:3e:af:61:8d [ether] on eth0
? (172.17.0.5) at 02:42:ac:11:00:05 [ether] on docker0
和 上面类似,就是第2步开始,由于不是同一个网络, 这时源主机只能将请求发往它的默认网关
。
如果源主机还不知道默认网关是谁,他还是通过 ARP协议 找寻他的网关。
网关有多个网卡,连接内部和外部网络,并且还有路由转发功能
。
每一个Linux内核都会有一个内部表格,即路由表。路由表定义了本地网络接口上的数据转发规则。
[root@ecs-b208 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.0.1 0.0.0.0 UG 100 0 0 eth0
169.254.169.254 172.16.0.1 255.255.255.255 UGH 100 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
”*”
表示目标是本主机所属的网络,不需要路由U
— 路由是活动的 H
— 目标是一个主机 G
— 路由指向网关!
— 拒绝路由linux 系统中,可以自定义从1-252
个路由表,其中,linux系统维护了4个
路由表:
路由表序号和表名的对应关系在 /etc/iproute2/rt_tables
文件中,可手动编辑
路由表的查看可有以下二种方法:
ip route list table
table_numberip route list table
table_name[root@ecs-b208 ~]# ip route list table 255
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 172.16.0.0 dev eth0 proto kernel scope link src 172.16.0.34
local 172.16.0.34 dev eth0 proto kernel scope host src 172.16.0.34
broadcast 172.16.0.255 dev eth0 proto kernel scope link src 172.16.0.34
broadcast 172.17.0.0 dev docker0 proto kernel scope link src 172.17.0.1
local 172.17.0.1 dev docker0 proto kernel scope host src 172.17.0.1
broadcast 172.17.255.255 dev docker0 proto kernel scope link src 172.17.0.1
根据子网掩码,可以将路由分为三种类型:
主机路由
机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ------ --- --- -----
10.0.0.10 192.168.1.1 255.255.255.255 UH 0 0 0 eth0
网络路由
网络路由是代表主机可以到达的网络。网络路由的Flags字段为N。例如,在下面的示例中,本地主机将发送到网络192.19.12的数据包转发到IP地址为192.168.1.1的路由器
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ----- --- --- -----
192.19.12 192.168.1.1 255.255.255.0 UN 0 0 0 eth0
默认路由
当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上。默认路由的Flags字段为G。例如,在下面的示例中,默认路由是IP地址为192.168.1.1的路由器
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ------ --- --- -----
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表根据其建立的方法,可以分为动态路由表
和静态路由表
静态路由是指由用户或网络管理员手工配置的路由信息
route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
举例:
(1)添加一条网络路由 ( 发往192.168.62这个网段的全部要经过网关192.168.1.1 )
route add -net 192.168.62.0 netmask 255.255.255.0 gw 192.168.1.1
(2)删除一条路由
# 删除的时候不用写网关
route del -net 192.168.62.0 netmask 255.255.255.0
(3) 添加一条主机路由 ( 发往192.168.1.110 的数据包从 eth0网络接口出去 )
route add –host 192.168.1.110 dev eth0
动态路由是指路由器
能够自动
地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整
。
路由器能够根据路由器之间的交换的特定路由信息自动地建立自己的路由表,并且能够根据链路和节点的变化适时
地进行自动调整。当网络中节点或节点间的链路发生故障
,或存在其它可用路由时,动态路由可以自行选择
最佳可用的路由继续转发报文。
常见的动态路由协议有以下几个:路由信息协议(RIP)、OSPF(Open Shortest Path First开放式最短路径优先)、IS-IS(Intermediate System-to-Intermediate System,中间系统到中间系统)、边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。
在 CentOS 中默认的内核配置已经包含了路由功能,但默认并没有在系统启动时启用此功能。开启 linux 的路由功
能可以通过调整内核的网络参数来实现。要配置和调整内核参数可以使用 sysctl 命令。例如:要开启 Linux 内核的
数据包转发功能可以使用如下的命令:
sysctl -w net.ipv4.ip_forward=1
这样设置之后,当前系统就能实现包转发,但下次启动计算机时将失效。为了使在下次启动计算机时仍然有效,需
要将下面的行写入配置文件 /etc/sysctl.conf
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
用户还可以使用如下的命令查看当前系统是否支持包转发
sysctl net.ipv4.ip_forward
这部分属于专业网络管理知识,推荐博客:
Linux下ip route、ip rule、iptables的关系
https://www.cnblogs.com/sammyliu/p/4713562.html
linux下IPTABLES配置详解
https://www.cnblogs.com/klb561/p/9011546.html
iptables和firewalld防火墙总结(史上最全)
https://www.cnblogs.com/wdp-home/p/11651855.html
路由表和iptables - Linux实现路由器
https://blog.csdn.net/melancholy123/article/details/80782567
这里重点说一下 iptables/NAT 网络地址转换技术:
DNS IP地址和域名直接的转换服务
通过查询 /etc/hosts
LInux 中 IP地址和 主机名直接的对应关系在此文件中。
通过查询 /etc/resolv.conf
[root@ecs-b208 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
# domain mydomain.com
# search google.com baidu.com
nameserver 100.125.135.29
nameserver 100.125.17.29
options single-request-reopen
充当search的默认值
外,没有其它用途。也就说一旦配置search,那domain就没用了常用的网络诊断工具 ping host traceroute
tcpdump
等
telnet命令通常用来远程登录,继而可以查看 端口是否开放,默认端口号为23/tcp
例如:查看远方服务器ssh端口是否开放:
telnet 192.168.25.133 22
超简单查看服务器端口是否开放
[root@DB-Server ~]# tcping 192.168.27.57 1433
192.168.27.57 port 1433 open.
traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40或60Bytes,用户可另行设置。
traceroute原理参考:https://www.jianshu.com/p/75a5822d0eec
具体参数格式:
traceroute [-dFlnrvx
] [-f<存活数值>] [-g<网关>...
] [-i<网络界面>] [-m<存活数值>] [-p<通信端口>]
[-s<来源地址>] [-t<服务类型>] [-w<超时秒数>] [主机名称或IP地址
] [数据包大小]
命令参数:
-d 使用Socket层级的排错功能。
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g 设置来源路由网关,最多可设置8个
-i 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w 设置等待远端主机回报的时间。
-x 开启或关闭数据包的正确性检验。
-q 每次TTL发送几个数据包,默认3次
Linux 上使用 traceroute
[root@localhost ~]# traceroute www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
1 192.168.74.2 (192.168.74.2) 2.606 ms 2.771 ms 2.950 ms
2 211.151.56.57 (211.151.56.57) 0.596 ms 0.598 ms 0.591 ms
3 211.151.227.206 (211.151.227.206) 0.546 ms 0.544 ms 0.538 ms
4 210.77.139.145 (210.77.139.145) 0.710 ms 0.748 ms 0.801 ms
5 202.106.42.101 (202.106.42.101) 6.759 ms 6.945 ms 7.107 ms
6 61.148.154.97 (61.148.154.97) 718.908 ms * bt-228-025.bta.net.cn (202.106.228.25) 5.177 ms
7 124.65.58.213 (124.65.58.213) 4.343 ms 4.336 ms 4.367 ms
8 202.106.35.190 (202.106.35.190) 1.795 ms 61.148.156.138 (61.148.156.138) 1.899 ms 1.951 ms
9 * * *
30 * * *
[root@localhost ~]#
控制台信息说明:
行号代表能到达第几站路由
,可使用参数-m
控制3个时间
表示先后发3个UDP数据包
到该站路由,每个包到达所需要的时间, 个数由 -q
控制"*"
信息,其实这个时候数据包已经到达目标服务器了,因为安全问题大部分的服务器不提供UDP服务(或者被防火墙挡掉),所以我们拿不到服务器的任何返回只能展示 "*"
号,程序就理所当然的认为还没有结束,一直尝试增加数据包的TTL,努力尝试让数据包到底目标主机。当然也许你会看到每一行网关的ip地址都不一样,一行有3个不一样的路由IP,表示到达目标主机的路径不是唯一的
,可以并行网关选择其中一条路径进行继续传递数据包。
[root@k8s-master ~]# traceroute www.baidu.com
traceroute to www.baidu.com (112.80.248.75), 30 hops max, 60 byte packets
1 10.90.183.122 (10.90.183.122) 2.361 ms 2.450 ms 2.383 ms
2 11.73.1.149 (11.73.1.149) 6.378 ms * 11.73.1.185 (11.73.1.185) 5.514 ms
3 11.228.249.26 (11.228.249.26) 1.964 ms 11.228.249.18 (11.228.249.18) 1.922 ms 10.255.100.117 (10.255.100.117) 14.495 ms
4 103.41.142.70 (103.41.142.70) 2.604 ms 103.52.72.126 (103.52.72.126) 2.658 ms 103.41.142.54 (103.41.142.54) 3.718 ms
5 116.251.113.213 (116.251.113.213) 2.878 ms 10.54.37.238 (10.54.37.238) 2.818 ms 140.205.50.229 (140.205.50.229) 2.953 ms
6 140.206.207.69 (140.206.207.69) 4.789 ms 140.206.207.81 (140.206.207.81) 13.156 ms *
7 139.226.213.121 (139.226.213.121) 16.261 ms 140.206.207.58 (140.206.207.58) 4.207 ms 139.226.230.157 (139.226.230.157) 5.219 ms
......
window 上使用 tracert,可以看出:
C:\Windows\system32>tracert www.baidu.com
通过最多 30 个跃点跟踪
到 www.a.shifen.com [180.101.49.12] 的路由:
1 2 ms 1 ms 1 ms 192.168.1.1
2 8 ms 9 ms 6 ms 1.168.78.124.broad.xw.sh.dynamic.163data.com.cn [124.78.168.1]
3 7 ms 4 ms 3 ms 61.152.4.185
4 3 ms 4 ms * 61.152.24.54
5 5 ms 5 ms 5 ms 202.97.19.242
6 * * 8 ms 58.213.95.158
7 10 ms 9 ms * 58.213.95.134
8 9 ms 7 ms 8 ms 58.213.96.122
9 * * * 请求超时。
10 * * * 请求超时。
11 * * * 请求超时。
12 8 ms 8 ms 8 ms 180.101.49.12
跟踪完成。
为了到达目标主机 www.baidu.com(180.101.49.12) 一共走了12步,进过了11个路由网关。
tcpdump是一个用于截取网络分组,并输出分组内容的工具。凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。
tcpdump 支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
参考博客:https://www.jianshu.com/p/d9162722f189
例如:
监视指定网络接口的数据包
tcpdump -i ens33
监视指定主机的数据包,例如所有进入或离开node1的数据包
tcpdump -i ens33 host node1
Linux 系统服务有时也称为守护程序,守护程序可分为 独立启动的服务
和 通过一个总管程序来统一管理的服务
Stand Alone 独立启动的服务
Super Daemon 通过一个总管程序来统一管理的服务
独立发服务想要启动,主要有两种方法:
使用 /etc/init.d/
目录中的启动脚本来启动独立服务
使用 service
命令来启动独立的服务
service 命令实际上只是一个脚本,底层还是调用 /etc/init.d/ 中的启动脚本来启动服务。
service Red Linux 系统专有的命令。
绝大多数日志文件是由 rsyslogd
服务来统一管理的,只要各个进程的信息输出给这个服务,都会按照统一格式记录到不同的日志文件中。
/var/log/
目录就是系统日志文件保持的位置。
[root@k8s-master ~]# ls -al /var/log/
total 8668
drwxr-xr-x. 13 root root 4096 Nov 14 03:10 .
drwxr-xr-x. 21 root root 4096 Nov 20 2020 ..
drwxr-xr-x. 2 root root 282 Nov 20 2020 anaconda
drwx------. 2 root root 99 Oct 14 06:10 audit
-rw------- 1 root root 0 Jan 10 2021 boot.log
-rw------- 1 root root 20555 Dec 30 2020 boot.log-20201230
-rw------- 1 root root 5187 Jan 10 2021 boot.log-20210110
-rw------- 1 root utmp 38784 Nov 14 19:16 btmp
-rw------- 1 root utmp 89472 Oct 31 18:16 btmp-20211101
drwxr-xr-x. 2 chrony chrony 6 Nov 19 2019 chrony
-rw-r--r-- 1 root root 0 Nov 20 2020 cloudinit-deploy.log
-rw-r--r-- 1 root adm 323212 Jan 9 2021 cloud-init.log
-rw-r--r-- 1 root root 9593 Jan 9 2021 cloud-init-output.log
drwxr-xr-x 2 root root 4096 Jan 10 2021 containers
-rw------- 1 root root 10454 Nov 15 15:01 cron
-rw------- 1 root root 49736 Oct 24 03:01 cron-20211024
-rw------- 1 root root 50016 Oct 31 03:01 cron-20211031
-rw------- 1 root root 50015 Nov 7 03:01 cron-20211107
-rw------- 1 root root 49366 Nov 14 03:01 cron-20211114
-rw------- 1 root root 27398 Nov 15 14:43 dnf.librepo.log
-rw------- 1 root root 120570 Oct 24 02:08 dnf.librepo.log-20211024
-rw------- 1 root root 125314 Oct 31 03:11 dnf.librepo.log-20211031
.....
查看某一个日志文件中的内容:
[root@k8s-master ~]# cat /var/log/cron-20211114
Nov 7 03:36:01 k8s-master anacron[3777128]: Job `cron.daily' started
Nov 7 03:36:01 k8s-master run-parts[3782009]: (/etc/cron.daily) starting logrotate
Nov 7 03:36:01 k8s-master run-parts[3782009]: (/etc/cron.daily) finished logrotate
Nov 7 03:36:01 k8s-master anacron[3777128]: Job `cron.daily' terminated
Nov 7 03:36:01 k8s-master anacron[3777128]: Normal exit (1 job run)
Nov 7 04:01:01 k8s-master CROND[3785480]: (root) CMD (run-parts /etc/cron.hourly)
Nov 7 04:01:01 k8s-master run-parts[3785480]: (/etc/cron.hourly) starting 0anacron
Nov 7 04:01:01 k8s-master run-parts[3785480]: (/etc/cron.hourly) finished 0anacron
Nov 7 05:01:01 k8s-master CROND[3793825]: (root) CMD (run-parts /etc/cron.hourly)
一共4列:
rsyslogd
服务依赖配置文件 /etc/rsyslog.conf
来确定各个服务不同等级的日志信息被记录的位置。
CentOS 中,自带了一个日志分析工具, 就是 logwatch
[root@localhost Packages]# yum -y install logwatch
安装完成之后,需要手工生成 logwatch 的配置文件。默认配置文件是 /etc/logwatch/conf/logwatch.conf,不过这个配置文件是空的,需要把模板配置文件复制过来。命令如下:
[root@localhost ~]# cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
#复制配置文件
这个配置文件的内容中绝大多数是注释,我们把注释去掉,那么这个配置文件的内容如下所示:
[root@localhost ~]# vim /etc/logwatch/conf/logwatch.conf
#查看配置文件
LogDir = /var/log
#logwatch会分析和统计/var/log/中的日志
TmpDir = /var/cache/logwatch
#指定logwatch的临时目录
MailTo = root
#日志的分析结果,给root用户发送邮件
MailFrom = Logwatch
#邮件的发送者是Logwatch,在接收邮件时显示
Print =
#是否打印。如果选择“yes”,那么日志分析会被打印到标准输出,而且不会发送邮件。我们在这里不打印,#而是给root用户发送邮件
#Save = /tmp/logwatch
#如果开启这一项,日志分析就不会发送邮件,而是保存在/tmp/logwatch文件中
#如果开启这一项,日志分析就不会发送邮件,而是保存在/tmp/logwatch文件中
Range = yesterday
#分析哪天的日志。可以识别“All”“Today”“Yesterday”,用来分析“所有日志”“今天日志”“昨天日志”
Detail = Low
#日志的详细程度。可以识别“Low”“Med”“High”。也可以用数字表示,范围为0~10,“0”代表最不详细,“10”代表最详细
Service = All
#分析和监控所有日志
Service = "-zz-network"
#但是不监控“-zz-network”服务的日志。“-服务名”表示不分析和监控此服务的日志
Service = "-zz-sys"
Service = "-eximstats"
这个配置文件基本不需要修改(我在实验时把 Range 项改为了 All,否则一会儿的实验可以分析的日志过少),它就会默认每天执行。
使用参考:http://c.biancheng.net/view/1108.html