Linux命令查询网站:https://www.linuxcool.com/。
1、删除文件或目录
2、列出目录中的内容
3、显示时间
4、查看字符集的方法
5、简单的计算器
6、查找文件或目录
7、在线查询命令
8、创建目录
9、查询用户
10、查看网络联网状态
11、查看后台执行的程序
12、关机
关机:poweroff。
13、用户帐号管理
创建一个新用户:adduser 用户名。
完全参考默认值创建一个新目录:useradd 用户名。
效果如下图所示。
上图中默认建立用户的家目录为【/home/用户名】,权限是700,该用户登陆时使用的shell为bash,并且会创建一个与该用户名相同的用户组。
创建一个指定UID和初始用户组的用户:useradd -u 未使用UID -g 已经存在的用户组 用户名(-u选项后面跟一个未使用的UID作为新用户的UID,-g选项后面跟一个已经存在的用户组作为新用户的初始用户组)。
如下图例子所示。
从上图中可以看出UID和初始用户组被设置成指定的值,由于初始用户组被指定,所以系统没有自动创建一个同名用户组。
创建一个指定家目录的新用户:useradd -d /home/用户名 用户名(-d选项后面跟上一个目录,是家目录路径)
创建一个系统帐号:useradd -r 用户名(-r选项表示创建的帐号是一个系统帐号)
例子如下图所示。
上图中可以看出系统帐号的UID和初始用户组GID都是小于1000的,由于系统帐号是用来执行系统所需服务的权限设置,所以系统帐号默认都不会主动建立家目录。
查看useradd命令创建新用户时使用的默认值:useradd -D。
效果图如下。
这些数据记录在目录【/etc/default/useradd】中。
给用户的帐号添加说明信息:usermod -c “说明信息” 用户名(-c选项可以修改用户在/etc/passwd文件中第5栏的说明信息)。
如下图所示。
设置用户的帐号在某个日期(YYYY-MM-DD)后失效:usermod -e “YYYY-MM-DD” 用户名(-e选项可以修改/etc/shadow文件第8栏的信息)。
效果图如下。
删除已经创建的一个用户:userdel -r 用户名(-r选项表示连同家目录也一并删除)
显示某个用户的帐号属性:finger 用户名。
效果如下图所示。
上图中倒数第二栏的mail是读取的文件【/var/spool/mail】中的邮件数据。
上图中的最后一栏中的Plan,是finger命令读取的文件【~/.plan】中的内容,用户可以把自己想写入的东西写入该文件,之后finger会将内容读出来。效果如下图所示。
显示目前在系统上登陆的使用者与登陆时间:finger。
如下图所示。
某个用户修改自己的相关信息,比如全名,办公室号码,办公室电话,家里电话等:chfn 用户名。
效果如下所示。
上图中可以看到这些和用户的相关信息被写入到文件【/etc/passwd】的第五栏说明信息中,并且用逗号进行分隔。
之后在使用命令【finger 用户名】可以看到更全用户相关信息。如下图。
14、更改用户密码
15、对用户组的相关操作
16、将用户添加到用户组中
17、修改文件/目录所属的组
18、修改文件拥有者
19、复制文件或目录
20、修改文件/目录权限
21、创建一个空文件
22、查看一个文件中的内容
23、切换目录
24、显示所在的目录
25、输出指定字符串或变量的值
26、将文件移动到一个目录
27、更改某个文件的文件名
28、获取完整文件名中的目录名
29、获取完整文件名中的文件名
30、如何查看建立文件或目录是的权限默认值
31、如何修改建立文件或目录是的权限默认值
32、如何设置文件的隐藏属性
33、观察文件的类型
34、命令与文件的查找
35、切换命令行模式下的用户
使用non-login shell的方式切换到root用户:su(往往需要输入root密码)。
使用这种方式是以non-login shell的方式登陆root。效果如下图所示。
从上图中可以看出,当前使用的用户的UID是0,也就是root,说明已经成功切换到了root用户。
重点如下图所示。
虽然已经成功切换到了root,可是众多环境变量还是和之前使用的一般用户的环境变量保持一致,因此可以得出结论,使用命令【su】切换到root用户,很多变量还是切换之前的一般用户的,所以还是有很多数据无法被使用。所以建议使用命令【su -】来切换到root用户。如下图所示。
从上图中可以看出,当前用户是root,并且变量也从一般用户的转变成root使用的。
使用login shell的方式切换到root用户:su -。
相比于命令【su】,命令【su -】除了会将当前的用户切换到root,还会将一些变量也切换为root用户所使用的。如下图所示。
而如果使用命令【su】,则是如下图所示。
以root身份执行一次命令,不切换使用的用户:su - -c “命令”(-c选项后面接命令,该命令会以前面指定的用户身份执行一次,且不切换当前用户)。
如下图所示。
从上图中可以看出,-c选项后面的命令虽然是以root身份执行的,可是并没有切换用户身份,用户还是948cshell。
使用login shell方式切换到一般用户:su -l 用户名(需要输入切换的用户的密码)。
使用login shell方式进行登陆,切换的同时会配置好切换后的用户使用的变量。
如下图所示。
使用non-login shel方式切换到一般用户:su 用户名(需要输入切换的用户的密码)。
该命令和命令【su】类似,是以non-login的 shell的方式进行登陆的,变量还是之前的用户使用的变量,因此最好是使用命令【su -l 用户名】进行切换。
如下图所示。
36、查看XFS文件系统的描述数据
37、列出文件系统的整体磁盘使用量、查看文件系统的磁盘使用量以及目录所占磁盘空间
将系统内所有的文件系统都列出来:df(在Linux下如果df不加任何参数,默认会将系统内所有的都以1KBytes的容量列出来)。
如下图所示。
将系统内所有的文件系统(包括特殊文件)的格式及名称都列出来:df -aT(-a选项列出包括特殊文件在内的所有文件,这些特殊文件几乎都在内存中,不占用磁盘,-T选项则列出文件系统的格式及名称)
如下图所示。
将/etc下面的可用的磁盘容量以易读的容量格式显示:df -h /etc。
df后面如果加上目录或者文件时,df会自动分析该目录或者文件的硬盘分区,并将该硬盘分区的容量显示出来,这样可以知道某个目录下还有多少容量可供使用。
命令执行如下图。
列出当前目录下所有目录的容量:du(直接输入du而不加任何选项时,du默认会分析当前目录下所有目录的容量,而不分析文件的容量,输出的数据单位是1KBytes)。
执行的效果如下图所示(部分截图)。
列出当前目录下所有目录及文件的容量(数据单位是1KBytes):du -a。
和命令(du)类似,只是增加了文件。
检查根目录下每个目录所占用的容量:du -sm /*(-s选项只会显示目录的总容量而不会详细的显示该目录下的每个文件的容量,比如上面的命令只会显示/usr的总量而不会显示/usr/bin的详细情况,-m选项是将显示的数据单位改成MBytes)。
以上命令常用来检查每个目录下的子目录的容量,目录的子目录可以通过通配符来表示,例如根目录的子目录就是 / *。如下图所示。
列出/etc目录下所有目录本身的容量,不包括子目录的容量累和:du -S /etc。
一定要注意命令(du)和命令(du -S)的区别,du显示的某个目录的容量是将所有子目录的容量和自身的容量相加得到的,而du -S显示的容量是某个目录自身的容量。下面是两者分别运行的截图。
从命令(du)的图可以看出:目录(./.mozilla/firefox)总容量=(./.mozilla/firefox/6bmz6vlx.default-default)总容量 + (./.mozilla/firefox/n5smt0vj.default)总容量 + (./.mozilla/firefox)自身容量 = 73476。由于(./.mozilla/firefox/6bmz6vlx.default-default)总容量 + (./.mozilla/firefox/n5smt0vj.default)总容量为73468,所以可以得到(./.mozilla/firefox)自身容量为8,与du -S 的执行效果相符。所以可以得出结论,du -S显示的目录容量为自身容量而不是包括子目录容量的总容量。一个目录本身的容量来源于其记录的文件名与指向这些文件inode的指针的大小之和,如果不相信的话,写个脚本建立几千个空目录之后再执行该命令就可以看出效果了。
显示当前目录使用的磁盘总量:du -sb(-s或–summarize 仅显示总计,只列出最后加总的值,-b或-bytes 显示目录或文件大小时,以byte为单位)。
38、创建文件或目录的链接
39、列出系统上所有的磁盘列表
列出本系统下所有的磁盘与磁盘内的分区信息:lsblk。
如下图所示。
列出/dev/sda设备内的所有数据的完整文件名:lsblk -ip /dev/sda(-i, --ascii, use ascii characters only。-p选项表示列出该设备完整的文件名,而不是最后的名字)。
列出设备的UUID,文件类型等参数:blkid。
如下图所示。
列出磁盘的分区类型与分区信息(比如/dev/sdb):parted /dev/sdb print。
如下图所示。
上图中的Partition Table一栏显示的就是磁盘的分区类型。
40、压缩 / 解压文件
41、XFS文件系统的备份与还原
将/dev/sdb5进行挂载,不过在挂载之前一定要给新复制的分区重新分配一个全局唯一标示,因为是扇区复制所以会将原文件的全局唯一标识也复制过来,导致无法挂载。如下图所示。
之后查看两个分区对应的挂载点对应的磁盘容量和大小。如下图所示。
从上图可知两个文件系统的信息一幕一样,因为是直接扇区复制的。
有一点需要注意,两者的容量都是1014M,我记得我当时分区是分了2个G,但却只有1014M,可能是我不记得df命令读取机制了,不过我猜应该df是直接读文件系统超级块的信息然后显示出来的吧?。
如果想要将/mnt的容量改成当时分区时设置的2G,可以通过使用命令(xfs_growfs)来实现。如下图所示。
42、比较两个文件(或目录)之间的差异
43、对GPT格式的磁盘进行的相关操作。
44、创建文件系统(磁盘格式化)
45、查看关于cpu的信息
46、文件系统检验
47、查看文件系统超级块的相关信息
48、创建某个文件系统的挂载
49、自定义磁盘/文件系统参数
50、产生一个新的全局唯一标示
51、显示内存使用情况
52、自动扩展XFS文件到最大可用大小
53、文本文件格式转换
54、命令别名
55、查询命令的种类
56、为shell变量或函数设置导出属性(让普通变量变成环境变量)
57、对变量的操作
58、声明变量,设置或显示变量的值和属性
59、读取来自键盘输入的变量
60、控制shell程序的资源
61、查看历史命令
62、在当前shell环境中从指定文件中读取或执行
63、终端环境设置
64、设置bash自己的终端设置值
65、管道命令中的选取命令
66、列出目前与过去登入系统的用户相关信息
67、管道命令中的排序命令
显示排序之后的所有用户:cat /etc/passwd | sort。
sort默认情况是以文字进行排序。
如下图所示。
由于/etc/passwd记录的每一条信息是以":"分割成很多栏,显示以第三栏来排序的结果:cat /etc/passwd | sort -t ‘:’ -k 3(-t选项表示每条信息的分割符,默认是tab,-k选项经常和-t选项搭配着使用,一条信息可以被分割成好几栏,-k就是指定按照第几栏进行排序的意思,后面跟数字)。
如下图所示。
利用last显示登陆的用户,只显示用户名,并对这些用户名进行排序:last | cut -d ’ ’ -f 1 | sort。
如下图所示。
利用last显示登陆的用户,只显示用户名,对这些用户名进行排序,并将重复的用户名去掉:last | cut -d ’ ’ -f 1 | sort | uniq。
排序之后的去重利用的示uniq命令。
如下图所示。
利用last显示登陆的用户,只显示用户名,对这些用户名进行排序,将重复的用户名去掉,并显示出每个用户出现的次数:last | cut -d ’ ’ -f 1 | sort | uniq -c(uniq命令的-c选项可以显示每一天数据出现的次数)
如下图所示。
显示当前注册的用户数目:wc /etc/passwd。
如下图所示。
上面显示的三个数分别是行、字数、字符数。由于/etc/passwd中每一行代表一个用户,所以行数就是注册的用户数。
利用last显示登陆的用户并保存到指定文件,同时在屏幕上只将用户名显示显示出来:last | tee last.list | cut -d ’ ’ -f 1。
tee命令示双向重定向命令,可以实现同时将数据保存到文件(相当于示数据重定向)和在屏幕上显示信息。
如下图所示。
68、管道命令中的字符转换命令
将last命令输出的内容中所有的小写字母变成大写字母:last | tr ‘[a-z]’ ‘[A-Z]’。
tr命令的作用是将一段文字中的字符进行替换和删除。
比如上面命令的意思就是将last输出的内容作为标准输出给tr命令,第一个表示要替换的字符(或字符串),’[a-z]'表示a到z中的任何一个字符都应该被替换,第二个表示用来替换的字符。
效果如下图所示。
将cat命令的输出作为标准输出,将标准输出中的某个字符(或字符串)删除:cat 文件名 | tr -d ‘字符’(-d选项表示删除的意思,后面紧跟一个字符,将该字符从标准输出中删除后,再将文件内容显示出来)
效果如下图所示。
将cat打开的文件中,所有的[tab]变成同等数量的空格:cat 文件名 | col -x | cat -A | more。
col命令的作用是进行控制字符的过滤,最常见的就是搭配-x选型将[tab]转换成等量的空格。
转化之前如下图所示。
从上图中可以发现非常多的’^I’,这个就是[tab]。
使用col命令处理之后如下图所示。
可以发现所有的[tab]都变成了等量的空格。
将两个文件中的相关数据整合成一行:join -t ‘分割符’ 文件名1 文件名2(-t选项后面紧跟分割符,用这个分割符将两个文件每行的数据进行分割,之后比较两个文件第一栏的数据)。
以上命令的具体的工作流程是:将两个文件的每行用分割符进行分割,分割成许多栏,比较两个文件第一栏的数据,如果相同,就将两个文件的第一栏的数据合并成一个(即,只显示一个第一栏数据,剩下的两个文件的数据也放到这一行上)。
效果如下图所示。
合并前。
合并后
将两个文件中的相关数据整合成一行,且相关的数据不在同一栏:join -t ‘:’ -1 n 文件名1 -2 n 文件名2(-1选项后面紧跟数字,表示第一个文件用第n栏和第二个文件进行比较,-2选项后面紧跟数字,表示第二个文件用第n栏和第一个文件进行比较)。
效果图如下。
合并前。
合并后
上面好像第一行的数据合并有点不成功。
直接将两个文件同一行的数据贴在一起:paste 文件名1 文件名2(没有选项默认将两个文件同一行的数据用[tab]进行分割)。
如下图所示。
将标准输入的数据和其他的文件数据粘贴在一起:cat 文件名1 | paste 文件名2 文件名3 - | head -n 3(命令中的文件名3后面的-表示标准输入的意思)
效果图如下。
将某个文件中所有的[tab]设置成n个空格并输出:cat 文件名1 | expand -t n - | cat -A(expand命令中的选项-t后面紧跟数字n,表示将[tab]用n个字符代替,后面的-表示标准输入。cat 中的-A选项可以显示向[tab]这样的特殊字符,[tab]会被显示成’^I’)
示例如下图所示。
69、管道中的划分命令
将一个较大文件,按照指定的大小,划分成多个小文件:split -b n(单位:b, k, m) 被划分的文件名 划分后的文件名(-b选项用来指定划分大文件的大小,后面紧跟一个数字,数字后面紧跟单位)。
效果如下。
从上图中可以看出被划分出来的小文件后面对了个a、b、c。
如果要将上面的三个小文件进行还原的话,可以进行以下操作。
上图中利用了累加的数据重定向。
将第一个命令的标准输出作为标准输入,对标准输入的内容按行划分并保存到相关的文件中:ls -al / | split -l n - 文件名(-l选项后面紧跟数字表示按多少行来划分)
效果图如下所示。
70、查询用户的UID和GID
71、管道命令中的参数代换
72、显示Linux系统启动信息
73、基础正则表达式练习
上图中的’^'符号在中括号内表示反向选择,在中括号外面表示开头的意思。
查找结尾是小数点的行:grep -n ‘\.$’ 文件名。
由于小数点是特殊字符需要进行转义。$符号表示结尾的意思。
如下图所示。
查找空白行:grep -n ‘^$’ 文件名。
如下图所示。
74、功能强大的流式文本编辑器(sed工具)
以行为单位的新增 / 删除功能
将前一个命令的标准输出作为sed的标准输入,删除内容的n1~n2行,再将内容输出:nl 文件名 | sed -e ‘n1,n2d’(sed命令的 -e选项表示在命令行执行sed命令的意思,不过没有-e选项也可以在命令行执行 ,sed命令的操作一般用单引号阔起来,模板是【‘n1,n2操作名’】,n1和n2表示行,不一定会存在,都存在的时候表示行区间,n2行后面紧跟操作,例如上面命令中的"d"表示删除的意思)
效果如下图所示。
从上图中可以看出2到5行被删除了。
以上命令如果改成只删除第二行,操作部分可以这么写【‘2d’】。
以上命令如果改成删除第3行到最后一行,操作部分可以这么写【‘3,$d’】。
将前一个命令的标准输出作为sed的标准输入,在标准输入的n2的下一行加上某些内容后,再进行输出:nl 文件名 | sed ‘n2a 内容’(n2后面的a操作是表示在n2的下一行加数据的意思)。
效果如下图所示。
以上命令如果是在n2行的前一行加入内容,操作部分可以这么写【‘n2i 内容’】。
将前一个命令的标准输出作为sed的标准输入,在标准输入的n2的下两行(可以推广到多行)加上某些内容后,再进行输出:nl 文件名 | sed ‘n2a 内容(每输入完一行后输入’’,即可继续输入第二行,等所有内容输入完后再用单引号括回来)’(n2后面的a操作是表示在n2的下一行加数据的意思)。
如下图所示。
注意上图命令中的第二个单引号一定要最后打上,如果直接在单引号中添加反斜杠,是出不来效果的。
以行为单位的替换与显示功能
将前一个命令的标准输出作为sed的标准输入,替换标准输入的n1~n2行,再进行输出:nl 文件名 | sed ‘n1,n2c 替换的内容’(sed命令的 -e选项表示在命令行执行sed命令的意思,不过没有-e选项也可以在命令行执行 ,sed命令的操作一般用单引号阔起来,模板是【‘n1,n2操作名’】,n1和n2表示行,不一定会存在,都存在的时候表示行区间,n2行后面紧跟操作,例如上面命令中的"c"表示替换的意思)
效果图如下。
将前一个命令的标准输出作为sed的标准输入,显示其中的n1行到n2行的内容:nl 文件名 | sed -n ‘n1,n2p’(-n选项表示sed工具使用安静模式,这个名词有点儿抽象,没有它的时候,sed会将标准输入全部输出到屏幕上,有它的时候只会将被操作的那些行,即单引号中的n1和n2描述的行,进行输出)。
效果图如下图所示。
没有-n选项输出如下图。
部分数据的查找并替换的功能
找出/etc/man_db.conf中所有含有MAN关键字的行,并且将含有注释,即’#‘的行去掉:nl /etc/man_db.conf | grep ‘MAN’ | sed ‘s/^.*#.*$//g’ | sed ‘/^$/d’。
每一步的效果图如下所示。
第一步,原始文件输出结果如下图。
第二步,筛选出含有MAN关键字的行。如下图。
第三步,将含有注释的行变成空白行。
上图中sed的操作用单引号阔起来,由于是将整个标准输入部分数据的替换,省略的可有可无的行号,s表示局部替换的操作,里面的写法类似于vim中的字符串替换的写法,上图中的sed命令的意思是将所有含有’#'的行变成空白行。
第四步,删除空白行。如下图所示。
上图中最后一个sed命令的意思是,查找所有的空白行,然后执行删除操作。
直接修改文件(危险操作)
直接对某个文件中的字符串进行替换:sed -i ‘s/被替换字符串/替换字符串/g’ 文件名(-i选项表示直接修改文件)。
直接在某个文件的最后一行添加内容:sed -i ‘$a 要增加的内容’ 文件名。
75、shell环境中测试条件表达式
76、获得连续的数字
77、shell脚本的debug
#!/bin/bash
# Program:
# Using for ... loop to print 3 animals
# History:
# 2020/08/12 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
for animal in dog cat elephant
do
echo "There are ${animal}s..."
done
执行过程如下图所示。78、查询/etc/shadow文件的密码加密机制
79、用户所属的用户组的操作
查看当前用户所属的用户组:groups。
输出的所有用户组中,第一个用户组是有效用户组,如果创建一个新文件或者目录,该文件或者目录的用户组就是有效用户组。
如下图所示。
上图中的有效用户组是948cshell。
切换当前用户的有效用户组:newgrp 用户组名。
该命令后的用户组名必须是当前用户所属的用户组其中的一个。该命令会让当前用户以另一个shell环境进行登陆,如果用户在命令行输入exit或者ctrl + D之后,便会回到之前的shell环境。
效果图如下所示。
从上图中可以看到有效用户组已经切换了。
80、关于shell的相关操作
81、查看文件系统是否支持ACL,即访问控制列表
82、ACL的设置与查看
针对某个文件,给特定用户设置权限:setfacl -m u:特定用户名:权限(r、w、x) 文件名(-m选项表示将后面的ACL参数给文件使用)。
如下图所示。
可以看到上途中的权限后面多了个【+】号。
针对某个文件,给当前用户设置权限:setfacl -m u::权限(r、w、x) 文件名(-m选项表示将后面的ACL参数给文件使用)。
针对某个文件,给特定用户组设置权限:setfacl -m u:特定用户组名:权限(r、w、x) 文件名(-m选项表示将后面的ACL参数给文件使用)。
如下图所示。
针对某个文件,设置他的有效权限,即mask:setfacl -m m:权限(r、w、x) 文件名。
有效权限mask表示的是用户或用户组所设置的权限必须要存在于mask的权限设置范围内才会生效。
如下图所示。
上图中的用户vbird1虽然有rx权限,但有限权限之后r,所以x权限是无效的。
针对某个目录,为特定用户或用户组设置默认ACL权限,并且让新建的子目录继承父目录的ACL权限:setfacl -m d:u(或g):用户名(或用户组):权限 父目录名。
只要在该目录中创建了目录,这些目录就会继承父目录的默认ACL权限。这些默认ACL权限只对目录有效(可能还没有遇到对文件有效的)。
总的来说,ACL权限可以分为普通权限和默认权限,两者的区别在于默认权限拥有继承属性,可以让子目录继承父目录的ACL默认权限,而对于普通权限,子目录无法继承父目录。
效果如下图所示。
可以看到上图中子目录zzz2继承了父目录projecta的ACL权限。
显示某个文件acl权限的内容:getfacl 文件名。
如下图所示。
删除某个文件的所有ACL权限:setfacl -b 文件名(-b选项表示删除某个文件的所有ACL权限)。
删除某个文件的默认ACL权限:setfacl -k 文件名(-k选项表示删除某个文件的默认ACL权限)。
针对某个文件,删除某个用户(或用户组的)的ACL权限:setfacl -x u:用户名(或g:用户组名) 文件名(-x选项和-m选项相反,-m选项是将后面的权限参数对某个文件使用,-x选项是取消后面的权限参数对某个文件使用)。
83、命令解释器
84、让一般用户使用root权限执行命令。
85、用户之间的交流
某个在线用户给另一个在线用户发送信息:write 接受者用户名 所在的终端页面。
首先先用命令【who】查询一下在线用户与其使用的终端页面。如下图。
从上图中可以看出用户【948cshell】和用户【root】是在线的,用户名后面的选项就是终端界面。
通过用户【948cshell】给用户【root】发送消息如下图。
这下用户【root】就会立刻查看到用户【948cshell】给他发送的信息。由于用户【root】是通过终端登陆,不是图形界面,因此不好截图,所以用用户【root】给用户【948cshell】发行消息,用户【948cshell】如下图。
屏蔽用户发送的信息(针对write命令):mesg n。
使用命令【mesg n】可以其他用户发送的信息,除了root用户发送的。如果给一个屏蔽接受信息的用户发送信息会出现下图的情况。
重新开放接受信息,可以通过命令【mesg y】。
如何判断当前是不是允许接受信息,可以通过命令【mesg】,如下图。
出现信息【is y】表示允许接受,如果是信息【is n】表示屏蔽接受。
对所有用户广播发送信息:wall “信息”。
如下图所示
从上图可以看出发送者自己也会收到信息。
给某个本机用户发送邮件:mail -s “标题” 用户名(-s选项后面可以设置标题)。
会将邮件的内容发送到本机的文件【/var/spool/mail/用户名】下。
查看接收到的邮件:mail。
如下图所示。
上图中输入【?】可以查看有哪些可以使用的命令,图中的【message list】就是邮件前面的标号。如果要查看某个文件的内容,可以直接输入【n 邮件标号】就可以在这个maiil程序中查看。【q】是保存并退出,【x】是不保存退出。【h 数字】可以显示后面数字封邮件的标头。
86、帐号检测工具
87、磁盘配额的相关操作(以xfs文件系统的磁盘配额为例)
以下命令是以xfs文件系统为例进行的磁盘配额的相关操作,默认状态的xfs文件系统是支持磁盘配额的,不过没有开启,因此需要先在文件【/etc/fstab】中进行相应的配置。样例配置如下。只是一个样例,不一定非要这么配置,要依情况而定。
注意上图中的grpquota参数与prjquota参数不能同时存在。
88、关于软件磁盘阵列的操作。
创建一个软件磁盘阵列并将其格式化与挂载使用:案例如下。
案例的RAID 5级别的软件磁盘阵列的环境为:利用4个分区组成RAID 5。每个分区大小是1G,需确定每个分区一样大较佳。将1个分区设置为热备份磁盘。chunk设置为256KB这么大即可。这个热备份磁盘的大小与其他RAID所需分区一样大。将RAID 5设备挂载到目录【/srv/raid】下。
第一步:创建5个分区。如果是GPT格式的分区表,使用gdisk命令进行分区。分完之后如下图所示。
第二步使用mdadm命令创建RAID。如下图所示。
上图中的最后大括号内的14~18是分区编号,从第一步的图中可以看出。关于mdadm的参数参考【导学e479】。到此磁盘阵列的创建已经成功了。
列出刚刚创建的软件磁盘阵列的详细信息,如下图。
还可以通过查看内存中的文件【/proc/mdstat】文件来显示正在运行的软件磁盘阵列信息。如下图。
上图中的第二行分区后面有【(S)】的表示这是用来备份的。第三行的【[4/4]】表示此磁盘阵列需要4个设备,其中有4个设备正常运行,后面的【[UUUU]】中的U表示正常运行的意思,如果是不正常运行则会是【_】。
第三步,格式化软件磁盘阵列并使用。如下图。
关于上图中的命令【mkfs.xfs】的使用参考【导学a240】。到此完成了软件磁盘阵列的挂载使用。
模拟RAID错误的恢复模式
1、模拟软件磁盘阵列出错并恢复的案例(以14.2.3创建的软件磁盘阵列为例)。
第一步:设置磁盘为错误。
先复制一些数据到软件磁盘阵列挂载的的目录中。如下图所示。
可以看到上图中的目录已经存入了数据。
假设分区【/dev/sdb14】出错了,将分区【/dev/sdb14】设置为出错状态模拟出现了错误。如下图所示。
上图中可以看到【Failed Devices】变成了1,然后从最后一行可以看出原来是热备份的分区,现在顶替了坏掉的分区14,状态是【spare rebuilding】。热备份磁盘重建完毕后会出现下图。
上图中的热备份已经变为了活跃状态。
第二步:将出错的磁盘删除并加入新磁盘。
先从软件磁盘阵列中删除坏掉的磁盘或分区。如下图。
由于操作目标是分区,所以不需要关机更换磁盘。如果是磁盘坏掉了,在移除出磁盘阵列之后,需要更换磁盘。
将新的磁盘加入到磁盘阵列中,设备名一般还是和之前移出的设备名相同。如下图所示。
将新的完好的分区或磁盘作为备份,如上图最后一行所示。
89、关于LVM的相关操作
通过LVM创建LV并格式化挂载使用:例子,建立一个名为vbirdvg的卷组,在这个卷组中划出一个名为vbirdlv的分区,并将其挂载到目录【/srv/lvm】。
第一步:disk阶段,即实际的磁盘。
使用命令gdisk随便划分5个分区,将他们的分区编码设置为8e00,即Linux LVM。如下图,分区14到17所示。
第二步:PV阶段,将分区变成物理卷。
使用到的命令有如下:
pvcreate:将物理分区建立为物理卷(PV)。
pvscan:查找目前系统里面任何具有物理卷(PV)的磁盘。
pvdisplay:显示出目前系统上面的PV状态。
pvremove:将PV属性移除,让该分区不具有PV属性。
具体操作如下。
先扫描看系统中有没有PV。如下图。
从上图中可以发现有一个PV存在,这是系统安装时候创建的。
将第一步划分的物理分区(分区14到17)建立成为PV。如下图。
上图中利用大括号,一口气创建了4个PV。再进行一次PV的扫描,如下图。
上图中检索到了刚刚创建的4个分区。
可以查看更加详细的PV的状态信息。下面以分区【/dev/sdb14】举例。
Allocatable字段表示是否被分配,NO表示没有被分配,PE Size表示一个PE的大小,Total PE表示PV共分了多少个PE出来,Free PE表示未被LV用掉的PE数量,Allocated PE表示尚可分配出去的PE数量。这些有关PE的字段的信息会在将该PV分配给VG时进行更新。
第三步:VG阶段,创建VG大磁盘
使用到的命令如下:
vgcreate:主要建立VG的命令。
vgscan:查找系统上面是否有VG存在。
vgdisplay:显示目前系统上面的VG状态。
vgextend:在VG内增加额外的PV。
vgreduce:在VG内删除PV。
vgchange:设置VG是否启动。
vgremove:删除一个VG。
具体操作如下。
创建一个VG。如下图。
上图中命令【vgcreate】的选项【-s】后面跟一个数字用来指定PE的大小(单位是m,g,t),倒数第二个参数是自定义的VG名称(vbirdvg),最后一个参数是用到的PV名称。
查看系统中的有多少VG。
从上图中查看到了刚刚创建的vbirdvg。之后在扫描以下系统中所有的PV,如下图。
可以发现上图中的PV14到PV16都属于名称为vbirdvg的卷组(VG),这是在创建卷组vbirdvg时指定的。
查看vbirdvg卷组的详细信息。
从上图中可以看出,字段PE Size的大小时16M,这是创建时指定的,Total PE表示总的PE数目,Free PE表示商可配置给LV的PE数量,由于目前还没有建立LV,所以PE可自由使用。PE是在建立卷组后自动创建的。
可以查看以下分配给卷组的物理卷的详细信息,如下图。
刚创建PV的时候字段Total PE等都是0,由于没有分配给卷组,当分配给卷组后就会有PE的数目了。
可以对一个创建好的卷组进行容量的扩充。如下图。
上图中的命令vgextend后面一个参数是卷组,最后面一个参数是被加入的PV。
第三步:LV阶段,对大磁盘VG进行分区(LV)
使用的命令如下:
lvcreate:建立LV。
lvscan:查询系统上面的LV。
lvdisplay:显示系统上面的LV状态。
lvextend:在LV里面增加容量。
lvreduce:在LV里面减少容量。
lvremove:删除一个LV。
lvresize:对LV进行容量大小的调整。
具体操作如下。
在一个已经创建好的卷组中创键一个LV分区。如下图。
上图中命令lvcreate的选项-L后面跟数字用来指定划分的LV分区的大小,该倒数第二个选项是要创建的LV分区的名称,最后一个参数是被划分的已经创建的卷组。
查看系统中所有的LV分区。如下图。
可以看到刚刚创建的LV分区vbirdlv处于活跃状态。
查看LV分区vbirdlv的详细信息。如下图。
上图中可以看出这个LV分区的大小时2G。
第四步:文件系统阶段,将LV分区格式化并挂载。
进行xfs文件系统的格式化。如下图。
将其进行挂载。如下图。
测试是否可以使用。如下图。
从上图可以看出,的确可以使用。
放大文件系统容量:比如给上个案例的目录【/srv/lvm】增加500MB的容量。
第一步:查看卷组【vbirdvg】有多少容量。如下图。
从上图可以看出卷组的容量足够500M,可以直接放大LV分区的大小。
第二步:放大LV,利用命令lvresize来增加。如下图。
从上图可以看出原来vbirdlv分区是2G,放大后变成了2.5G了。虽然LV分区放大到了2.5G,可是可以发现文件系统并没有增加容量。如下图,依然还是2G大小。
第三步:增加文件系统的容量。
先查看以下文件系统的信息。如下图。
增加文件系统的大小,使用命令【xfs_growfs】命令。如下图。
发现容量变成了2.5G了。
磁盘容量存储池(LVM thin Volume)使用范例。
范例内容:将上面例子中创建出来的卷组vbirdvg的剩余容量取出1GB来做出一个名为vbirdtpool的thin pool LV设备,这就是所谓的磁盘容量存储池,由vbirdvg内的vbirdtpool产生一个名为vbirdthin1的10GB LV设备,将此设备格式化未xfs文件系统,并且挂载于目录【/srv/thin】。
第一步:使用命令lvcreate建立一个vbirdtpool的thin pool设备。
上图中命令lvcreate的选项-T表示创建一个磁盘容量存储池,该选项后面跟的参数格式为【卷组名/待创建的磁盘容量存储池名称】。
显示一下磁盘容量存储池的详细信息。如下图。
从上图中可以看到还有Allocated的选项,这是存储池的标志。或者可以更加直观的看一下,如下图。
第二步:建立vbirdthin1这个有10GB的设备,必须使用–thin(即-T选项)与vbirdtpool链接。如下图。
从上图中可以看出明明没有10G以上的容量,可是却能够通过thin pool进行创建。上图中的lvcreate命令的-V选项用来指定虚拟容量,经常和和-T选项连用,-n选项是指定创建的设备的文件名。
第三步:建立文件系统。如下图。
可以看到虽然真实容量只有1G,可是文件系统信息显示却有10G。
第四步:测试容量的使用情况。如下图。
从上图中可以看出设备vbirdthin1只使用了0.23%的容量(应该是5%左右才对,不知道为什么会这样),而存储池用了39.81%(应该是50%左右才对),毕竟只有1G。如果往存储池增加容量,可以看到下图的情况。
从上图中可以看出存储池的容量使用率变成25%左右了,而在存储池基础上创建的设备还是5%左右。
建立LV快照区给上面例子中的逻辑卷vbirdlv作备份。
第一步:查看卷组vbirdvg还剩下多少容量。如下图。
从上图中可以看出只剩下25PE了。
第二步:利用lvcreate建立逻辑卷vbirdlv的快照区,命名为vbirdsnap1,且给予25个PE。如下图。
上图中的lvcreate命令的-s选项表示创建的是一个快照文件的意思,-l选项后面跟一个数字,表示使用多少个PE的意思,-n选项用来指定创建的快照的名称,最后一个参数是创建快照的目标文件。查看一下快照的详细信息,如下图。
上图中的LV Size表示原始文件的大小,在这里的例子中指的是vbirdlv的大小,COW-table size是快照可以记录的最大容量,Allocated to snapshot是目前已经被用掉的容量。将快照文件进行挂载,查看文件系统的信息。如下图。
从上图中的可以看出被快照的文件与快照文件是一样的,这里有个细节就是在挂载快照文件的时候由于快照文件与被快照的文件拥有相同的uuid所以在使用挂载命令mount的时侯要忽略相同uuid的影响。
使用快照功能恢复系统的例子,拿上面案例的逻辑卷vbirdlv和它的快照vbirdsnap1举例。
第一步:将逻辑卷vbirdlv做一点修改。注意修改的容量不要超过快照文件的大小。
经过修改之后可以发现这两个文件已经是不一样的了。检测一下快照文件,如下图所示。
从上图中可以发现快照已经使用了37%左右的容量。
第二步:利用快照将原来的文件系统进行备份,使用命令xfsdump。如下图。
从上图中可以看出成功根据快照创建了vbirdlv的备份文件【/home/lvm.dump】文件。
第三步:删除快照vbirdsnap1,因为备份文件已经建立了,之后恢复逻辑卷vbirdlv对应的文件。
删除快照。如下图。
之后将逻辑卷vbirdlv重新格式化。如下图。
将vbirdlv设备重新挂载,并进行数据的恢复。如下图。
可以看到,已经恢复成功了。
补充一点:在进行数据的测试时,可以将快照区作为测试用的文件,原系统作为备份数据,这样子就算搞砸了,直接将快照删了,在根据原系统建一个新的快照就行,非常的方便。
删除系统中的某LVM:以删除上面建立的LV、VG和PV为例。
删除LVM的流程如下:
先卸载系统上面的LVM文件系统(包括快照和所有的LV)。
使用lvremove删除LV。
使用vgchange -a n VGname让该卷组不具有Active标志。
使用vgremove删除VG。
使用pvremove删除PV。
最后使用gdisk或者fdisk将分区的System ID改回来。
具体操作如下图。
删除存储池,存储上的设备,逻辑卷的顺序是:存储池、存储上的设备、逻辑卷(快照之前已经删了,如果还有快照也要删除)。
接下来将分区的System ID改回来就行了。如下图。
90、实际运行单一计划任务
91、查看系统启动时间与任务负载
92、任务管理相关的操作
93、循环型计划任务的相关操作。
94、进程管理相关的操作
F:代表这个进程旗标 (process flags),说明这个进程的权限,常见有:
若4 表示此进程的权限 root ;
若1 則表示此子进程仅能fork。
S:代表这个进程的状态 (STAT),主要的状态有:
R (Running):该进程正在运行;
S (Sleep):该进程正在睡眠,可被唤醒。
D :不可被唤醒
T :停止状态(stop);
Z (Zombie):僵尸进程。
UID/PID/PPID:代表【此进程被该 UID 所拥有/进程的 PID 号/此进程的父进程 PID 】
C:代表 CPU 使用率,单位为百分比;
PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先顺序,数值越小代表该进程越快被 CPU 执行。
ADDR/SZ/WCHAN:都与内存,ADDR 是 kernel function,指出该进程在内存的哪個部分,如果是个 running 进程,一般就会显示【 - 】 ; SZ 代表此进程用掉多少内存 ; WCHAN 表示目前进程是否工作,同样的, 若为 - 表示正在工作中。
TTY:登入者的终端机位置,若为远程登入则使用动态終端介面 (pts/n);
TIME:使用掉的 CPU 时间,注意,是实际花费掉的 CPU 运作的时间,而不是系統时间;
CMD:就是 command 的缩写,造成此进程的指令。
其中显示的在终端的是【新PRI】,【新PRI】= 内核指定的【老PRI】 + 【NI】。也就是说内核指定的PRI是不会显示给用户的,不过用户可以根据显示出来的【新PRI】减去【NI】就可以得到内核指定给进程的PRI了。USER: 进程所属的用户名。
PID: pid。
%CPU: 进程用掉的 CPU 资源百分比。
%MEM: 该进程所占用的物理内存百分比。
VSZ: 该进程使用掉的虚拟内存量。
RSS: 该进程占用的固定内存量。
TTY: 该进程是哪个终端上面运行的,若与终端无关则显示【?】,tty1~tty6是本机上的登陆进程,若为pts/0等,则表示是由网络连接进入主机的进程。
STAT: 该行程的状态,linux的进程有5种状态:
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process
注: 其它状态还包括W(无驻留页), <(高优先级进程), N(低优先级进程), L(内存锁页).
START: 进程开始时间(即,进程被出发启动的时间)
TIME: 执行的时间(该进程实际使用CPU运行的时间)
COMMAND:所执行的指令(即,该进程的实际命令是什么)
将进程信息以类似进程树的方式显示出来:ps axjf(axjf前面没有【-】)。
效果如下图所示,部分截图。
从上图中可以看出进程之间的相关性,以及父子进程的关系。
动态显示进程信息,每n秒刷新一次:top -d n(-d选项后面指定每隔几秒刷新一次top显示进程信息的界面,默认是5秒)。
大致的信息如下图所示。
上图中每一行的信息如下。
第一行,任务队列信息,同 uptime 命令的执行结果。
系统时间:07:27:05
运行时间:up 1:57 min,
当前登录用户: 3 user
负载均衡(uptime) load average: 0.00, 0.00, 0.00
average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
第二行,Tasks — 任务(进程)。
总进程:150 total, 运行:1 running, 休眠:149 sleeping, 停止: 0 stopped, 僵尸进程: 0 zombie
第三行,cpu状态信息。
0.0%us【user space】— 用户空间占用CPU的百分比。
0.3%sy【sysctl】— 内核空间占用CPU的百分比。
0.0%ni【】— 改变过优先级的进程占用CPU的百分比
99.7%id【idolt】— 空闲CPU百分比
0.0%wa【wait】— IO等待占用CPU的百分比
0.0%hi【Hardware IRQ】— 硬中断占用CPU的百分比
0.0%si【Software Interrupts】— 软中断占用CPU的百分比
第四行,内存状态。
1003020k total, 234464k used, 777824k free, 24084k buffers【缓存的内存量】
第五行,swap交换分区信息
2031612k total, 536k used, 2031076k free, 505864k cached【缓冲的交换区总量】
备注:
可用内存=free + buffer + cached
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,
第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。
纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
第六行,空行
第七行以下:各进程(任务)的状态监控
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S —进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
如果想要让top中的进程按照CPU使用率、内存使用率、PID或者进程使用CPU总时间进行排序的话可以分别按下按键【P】、【M】、【N】或者【T】。可以通过按键【?】查看top界面还有哪些可以使用的按键。退出top界面可以通过按键【q】。
将top显示的进程信息刷新n次,将结果重定向到一个文件中:top -b -n n(数字n) > 文件名(-b选项表示以批量的方式执行top,可以搭配选项-n指定刷新top界面的次数,再搭配数据流重定向【>】将批量处理结果写入到文件中,-b选项很重要,如果没有的话重定向到文件中的进程信息是不全的,只会显示一个屏幕的进程信息,只有加上了-b选项才会将所有的进程信息都重定向到文件中)。
每隔n秒持续动态显示某个进程的信息:top -d n -p PID(-p选项后面跟一个PID,持续显示该进程的相关信息)。
例如显示当前用户的bash进程的相关信息。如下图所示。
获取等前用户bash的PID,如下图。
持续显示该进程的相关信息。如下图。
如果还想要修改这个进程的NI(nice)数值,可以在top界面中按下r,之后先输入进程PID回车,在输入想要设置的nice值在回车,就可以修改成功了。 将上图中的进程5640的nice从0改成10,如下图所示。
从上图中可以发现已经将其修改成功了,nice值和进程执行的先后顺序有关,越小优先级越高。
以进程树的形式显示出系统中进程的相关性,进程之间的连接采用ASCII字符:pstree -A(-A表示指定连接符是ASCII,-U表示指定连接符是Unicode)。
如下图所示。
以进程树的形式显示出系统中进程的相关性,进程之间的连接采用ASCII字符,同时显示出进程的PID和所属的用户:pstree -Aup(-u和-p选项分别表示显示进程的拥有者和PID)。
如下图所示。
用户名和PID会在一对圆括号内显示出来,两者用逗号进行分隔。
先用ps查询某个进程的PID,之后让该进程重新读取自己的配置文件,即类似于重新启动:例子如下图。
先用ps查询进程【rsyslogd】的进程PID,之后让这个服务(名称结尾有d)重新读取配置文件。
上图中让进程重新读取自己的配置文件对应的信号是【SIGHUP】,也就是【-1】,执行完之后查询日志文件,从最后一行的信息可知,服务rsyslogd的确是重起了。
将一个信号传递给指定的一个命令(或服务),让该命令(或服务)启动的所有的进程重新加载配置文件,重新启动:killall -1 命令名称或服务名称。
kill命令在使用的时候需要指定对应进程的PID,从而精准的将某个信号给这个进程。而killall命令则是根据命令名称对因这个命令(或者服务)启动的进程进行批量操作。常用在要删除某个服务是,将因这个服务而启动的所有进程都删除。
将一个信号传递给指定的一个命令(或服务),删除该命令(或服务)启动的所有的进程:killall -9 命令(或服务)名称。
效果图如下。
上图中欲将bash启动的进程都删除,-i选项用来进行询问,因为一开始我使用普通帐号登陆的,对应一个bash,之后切换到root用户,对应另一个bash,所以上面的命令会询问两次。如果没有-i选项,那么会强制直接删除。
执行一个新的命令,并在执行的开始就给它设置一个nice值:nice -n 数字 命令(-n选项后面跟的数字与设置NI值有关,根据该数字算出来的NI值的范围一定是在【-20~19】之间)。
该新命令的最后通过命令【ps -Al】显示在终端的NI值是【默认的NI】加上命令【nice】设置的数字。最终显示在终端的的PRI值是默认的PRI加上最终的NI值。该新执行的命令的默认的PRI值和nice值往往会继承父进程的这两个值。
效果图如下。
上图中命令【nice】后面跟的数字是【-5】,由于是在bash的后台中执行的vim,所以vim默认的PRI和NI继承了bash的【80】和【10】,由于命令【nice】后面的数字是【-5】,所以显示在终端的最终的NI值为【10-5=5】,显示在终端最终的PRI值为默认的PRI加上最终显示在终端的NI值,即【80+5=85】。
给一个已经存在的进程进行nice值的重新调整:renice 数值 进程的PID。
可以将一个进程通过命令【ps -Al】显示在终端的NI设置为命令【renice】指定的数值,而不需要进行任何计算。和命令【top】异曲同工。
效果如下图所示。
从上图中可以看出改变了bash这个父进程,子进程ps的NI也跟着改变了。因此可以看出更改进程执行的优先级是具有继承效果的。
95、查看系统与内核相关的信息
97、检测系统资源的变化
procs
r:列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu,即处于就绪态的进程数量。
b:列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等,即处于阻塞态的进程数量。
cpu 表示cpu的使用状态
us:显示了用户方式下所花费 CPU 时间的百分比,即非内核层的CPU使用状态。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy:显示了内核进程所花费的cpu时间的百分比,即内核层的CPU使用状态。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa:显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id:显示了cpu处在空闲状态的时间百分比。
st:显示被虚拟机所使用的CPU时间百分比。
system
in:每秒进程被中断的次数。
cs:每秒执行的上下文切换次数,即线程切换与进程切换次数。例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
注意:进程之间的切换是通过中断来进行的,通过中断保存一些寄存器的数据信息。如果这两个数值比较大,说明IO操作频繁。
memory
swpd:切换到内存交换区的内存容量,即虚拟内存被使用的容量。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常,也就是说系统虽然进程比较多,但不怎么进行进程之间的切换,所以性能也还算可以。
free:未被使用的内存容量。
buff:作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache:作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap
si:进程由内存进入交换区的容量。
so:进程由内存交换区进入内存的容量。
注意:如果si和so的数值太大,表示内存中的数据常常在磁盘与内存之间传输,系统性能会很差。
IO
bi:从磁盘(块设备)读入的区块数量。
bo:向磁盘(块设备)写入的区块数量。
如果该部分数值比较高说明,IO比较忙碌,阻塞的进程会很多。
98、查询已使用文件或已执行进程使用的文件
c:代表当前目录
e:将此文件作为程序的可执行对象使用
f:打开的文件。默认不显示。
F:打开的文件,用于写操作。默认不显示。
r:指示该目录为进程的根目录。
m:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。
s:将此文件作为共享库(或其他可装载对象)使用
99、与SELinux有关的操作
列出目前的SELinux使用的策略是什么:sestatus。
效果如下图所示。
上图中的第一栏的信息分别是:
是否启动SELinux。
SELinux的相关文件挂载点。
SELinux的根目录所在。
目前的SELinux策略是什么。
目前的SELinux模式是什么。
目前配置文件内规范的SELinux模式。
是否含有MLS的模式机制。
是否默认阻止未知的主体进程。
最大的内核策略版本。
将SELinux的模式在enforcing与permissive之间进行切换:setenforce 0(切换至permissive),setenforce 1(切换至enforcing)。
注意一开始的SELinux模式如果是disable的话,可能需要重启才会生效,如果不是disable将会立刻生效。
效果如下图所示。
查看系统上所有的规则,并以布尔值的形式显示他们是否被启动:getsebool -a 或 sestatus -b。
如下图所示。
上图只是其中的一个命令,两个都差不多,就是形式有所不同。
查看SELinux在采用命令【sestatus】输出的策略下的统计信息,包括SELinux的状态、规则布尔值、身份识别、角色等信息:seinfo(-u选项可以查看当前策略下的所有身份种类,-r选项可以查看当前策略下的所有角色种类,-r选项可以查看当前策略下所有的类型种类,-b选项可以查看所有的规则种类)。
该命令需要下载:yum install setools-console-*。
效果图如下所示。
上图中的Types字段显示的就是当前策略下的类型种类数,Booleans字段显示的是当前策略下规则的总数。
查询某个主体进程类型可以读取哪些文件类型,即一个进程SELinux类型可以与哪些文件SELinux类型配对:sesearch -A -s 进程SELinux类型名(-A参数表示列出后面数据中,允许【读取或放行】的相关信息,-s选项后面跟进程的SELinux类型名)。
效果如下图所示。
从上图中可以看出进程SELinux的类型【crond_t】可以支持【system_cron_spool_t】等文件SELinux类型的文件。allow后面跟的是主体进程以及文件的SELinux类型,之后后面的【:】后面表示该文件SELinux类型支持的是文件还是目录。上图中的数据只是截取的一部分。再如下图所示。
从上图中可以看出进程SELinux的类型【crond_t】支持的文件SELinux类型为【admin_home_t】的文件是链接文件和目录,也就是说如果有个普通文件的SELinux类型为【admin_home_t】,含有进程SELinux的类型【crond_t】的进程是读取不了的。
查看含有某个规则的进程能够读取的文件SELinux类型:sesearch -A -b 规则名(-b选项后面跟规则名)。
如下图所示。
上图中总共有77条记录,太多了,没有截全。
修改某个规则的布尔值,从而控制规则的开启与关闭:setsebool -P 规则名 1或0(1表示开启,0表示关闭,-P选项会将设置值直接写入配置文件)。
如下图所示。
指定某个文件SELinux类型并将其套用在某个文件上:chcon -v -t 文件SELinux类型名 文件名(-v选项会将修改变化显示出来,-t选项后面接文件SELinux类型名,用来指定最后一个文件名参数的文件SELinux类型,-R选项会连同目录下的子目录也一同修改)。
如下图所示。
将某个文件1使用的文件SELinux类型套用到另一个文件2上:chcon -v --reference=文件名1 文件名2(–reference选项后面跟文件名)。
如下图所示。
自动将某个目录下的文件的文件SELinux类型转变成正确的默认类型:restorecon -Rv 目录名(-R选项会将目录下的子目录也一同修改,-v显示修改的过程)。
如下图所示。
上图中的文件【/etc/cron.d/checktime】由于文件SELinux类型与进程SELinux类型对不上,再重起crond服务后,该服务无法正确读取,使用上面命令恢复正确的默认文件SELinux类型之后再重启crond服务就可以正常读取了。
查询某个目录默认的SELinux类型:semanage fcontext -l | grep ‘目录名’(fcontext是命令semanage的一个功能选项,后面的查找命令可以搭配扩展正则表达式命令【egrep】或【grep -E】,-l选项表示查询之意)。
如下图所示,我要查询目录【/etc/cron.d】的默认SELinux类型。
从上图中可以提取目录【/etc/cron.d】的SELinux类型为下图。
使用semanage命令修改某个目录的默认SELinux类型:范例。
第一步,先建立一个测试用的目录【/srv/mycron】,同时放入一些配置文件。如下图所示。
第二步,查看一下目录【/srv】的SELinux类型,如下图所示。
从上图中可以总结:在某个目录下面建立文件会继承父目录的默认的SELinux类型。
第三步,将mycron默认的SELinux值改为system_cron_spool_t,如下图所示。
上图中的命令【semanage fcontext -a -t system_cron_spool_t “/srv/mycron(/.*)?”】中的选项-a表示增加一些SELInux安全上下文类型设置,-t选项用来指定需要增加的文件SELinux类型,最后面一个参数是文件名或者目录名。
第四步,恢复目录【srv/mycron】及其子目录的相关的SELinux类型,如下图所示。
从上图中可以看出已经修改成功了。