目录Linux 快速学习总结 ( ͡° ͜ʖ ͡° ) 本文档采用 Centos Linux 8.x 学习测试
- 一、用户管理
- passwd文件
- shadow文件
- group文件
- gshadow文件
- 添加用户
- 设置密码
- 其他用户管理命令
- 用户间切换命令
- 二、文件管理
- 常用文件操作命令
- cat
- more 或者 less
- head 和 tail
- touch
- 文本处理三剑客
- grep
- sed
- awk
- rm
- mkdir
- ls
- ln
- 文件权限
- chown
- 三、进程管理
- ps
- pstree
- top
- lsof
- 进程优先级
- kill pkill
- 四、存储管理
- 存储设备分类
- 主引导记录
- 挂载存储设备
- 开机自动挂载
- 分区
- 磁盘管理
- df 命令
- du命令
- fsck 命令
- 磁盘阵列
- 五、设备管理
- 设备文件
- 常用的设备命令
- 查看CPU信息命令
- 查看内存信息命令
- 内存分析
- 查看块设备信息
- dmesg
- lsblk
- 六、网络管理
- 七、系统服务与日志
__ __ _______
/ | / | /
$$ | $$/ _______ __ __ __ __ $$$$$$$ | ______
$$ | / |/ / | / |/ / | $$ | $$ | /
$$ | $$ |$$$$$$$ |$$ | $$ |$$ /$$/ $$ | $$ |/$$$$$$ |
$$ | $$ |$$ | $$ |$$ | $$ | $$ $$< $$ | $$ |$$ | $$ |
$$ |_____ $$ |$$ | $$ |$$ __$$ | /$$$$ $$ |__$$ |$$ __$$ |
$$ |$$ |$$ | $$ |$$ $$/ /$$/ $$ | $$ $$/ $$ $$/
$$$$$$$$/ $$/ $$/ $$/ $$$$$$/ $$/ $$/ $$$$$$$/ $$$$$$/
一、用户管理
Linux 有 用户 和 用户组的概念,用户名 + 密码才能登陆到Linux系统中
用户和用户组是多对多关系,一个用户客户归属到多个用户组,一个用户组包含多个用户
Linux不认识用户名只认识对应的ID
Linux系统中会将所有用户名和ID的对应关系存储在 /etc/passwd
用户组名称也有一个ID与之对应, 存储在/etc/group
passwd文件[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
命令说明:
- 创建了一个用户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
- useradd 默认值文件主要有两个 /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 一切都是文件
- 文件名除“/”之外,所有字符都可以使用
- 长度不超过255个字符
- 名称“.”开头的表示这是一个隐藏的文件或目录
- 名称区分大小写
- /dev/目录下为各个设备 /dev/sd 硬盘 /dev/mouse 鼠标 /dev/cdrom 光驱
Linux 文件类型分为普通、目录、设备、符号
常用文件操作命令 catcat一次性全部展示文件内容,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 里more 或者 less
作业滚屏显示
-n 一次显示的行数
+n 从第n行开始显示文件内容
-c 不滚屏,先清屏后再显示内容
head 和 tailhead 从头开始看, tail从文件尾部开始看
head / tail -n 3 mytest.txt # 查看前面/尾部 3行内容touch
创建文件,也可以修改文件时间
文本处理三剑客 grep过滤来自一个文件或标准输入匹配模式内容
匹配至少三个字符,例如 abc:
# echo -e "anabcnc" | grep -E '[a-z]{3}'
sed
流编辑器,过滤和替换文本。
替换 aaa 字符串为 bbb
# tail /etc/services |sed 's/aaa/bbb/'awk
awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及
生成报表等等
打印第二字段,默认以空格分隔:
# tail -n3 /etc/services |awk '{print $2}'
48049/tcp
48128/tcp
48128/udp
指定冒号为分隔符打印第一字段:
# awk -F ':' '{print $1}' /etc/passwd
root
bin
daemon
...
rm
永久性删除文件或目录
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]#mkdir
创建目录
-p 级联创建目录
[root@ecs-b208 /]# mkdir -p /a/aa /b/bb [root@ecs-b208 /]# cd /b/bb/ [root@ecs-b208 bb]#ls
最常用的命令,列出目录下的文件信息,默认按照文件名称排序
[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
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:全部,以上三个
chown修改文件归属的用户或用户组,root用户可以修改任何文件的权限,普通用户只能修改自己的文件
[root@ecs-b208 ~]# chown 所有者 mytest.sh [root@ecs-b208 ~]# chown 所有者:所属组 mytest.sh三、进程管理
常用的进程管理命令 ps top 等
ps[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可以持续跟进当前进程情况:
# 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行开始是系统的进程情况
第一行
| 内容 | 说明 |
|---|---|
| 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的核数就表示系统高负荷运行 |
第二行
| 内容 | 说明 |
|---|---|
| 141 total | 系统中总进程数 |
| 1 running | 正在运行的进程数 |
| 140 sleeping | 睡眠的进程数 |
| 0 stopped | 停止的进程数 |
| 0 zombie | 僵尸进程数 |
第三行CPU信息
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)?
缓存: 硬盘里面数据提前加载到内存中,这样不用再次去硬盘取数据了,目的是加快数据读取
缓冲:先将要写的数据放入缓冲区,然后聚集一起写入硬盘,目的是加大“硬盘”写入的吞吐量
第五行 交换分区信息
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 优先级 进程idkill pkill
kill -9 强制结束
kill -15 正常结束 默认就是 15
killall 结束一个用户下的所有进程
pkill 通过进程名称进行结束进程
[root@ecs-2220 ~]# pkill -9 httpd四、存储管理 存储设备分类
- 机械硬盘 HDD Hard Disk Drive 采用磁性碟片来存储
- 固态硬盘 SSD Sold State Disk 闪存颗粒来存储
一般机械磁盘的大小 = 磁头数量 * 柱面数量 * 一个盘面上的扇区数量 * 单扇区大小(一般为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备份选项。
- 0表示不使用Linux dump备份。现在通常不使用dump备份,此处设置为0即可。
- 1表示使用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
- 执行如下命令之后,进入fdisk分区工具
[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):
- 输入“n”,按“Enter”,开始新建分区
Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended
表示磁盘有两种分区类型:
- “p”表示主要分区。
- “e”表示扩展分区。
- 以创建一个主要分区为例,输入“p”,按“Enter”,开始创建一个主分区
Select (default p): p Partition number (2-4, default 2):
- 以分区编号选择“2”为例,输入主分区编号“2”,按“Enter”
Partition number (2-4, default 2): 2 First sector (83886080-167772159, default 83886080):
- 输入新分区的起始磁柱编号,如设置默认值,按“Enter”
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):
- 输入“w”,按“Enter”,将分区结果写入分区表中
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磁盘管理 df 命令
查看硬盘使用情况
[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/0du命令
查看目录占用磁盘空间大小
–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]#fsck 命令
检查文件系统并尝试修复错误。
磁盘阵列独立冗余磁盘阵列(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常用的设备命令 查看CPU信息命令
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核数则表示需要增加CPU b: 等待其他资源(例如 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 CPUlsblk
查看可用块设备且显示他们之间的依赖关系。
[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 | 设备挂载点 |
持续更新中
七、系统服务与日志持续更新中



