赞
踩
操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序
OS是软件的一部分,它是硬件基础上的第一层软件,也是硬件和其它软件沟通的桥梁
操作系统会控制其他程序运行,管理系统资源,提供最基本的计算功能,如管理及配置内存、决定系统资源供需的优先次序等,同时还提供一些基本的服务程序,包括:
1) 文件系统
提供计算机存储信息的结构,信息存储在文件中,文件主要存储在计算机的内部硬盘里,在目录的分层结构中组织文件。文件系统为操作系统提供了组织管理数据的方式。
2) 设备驱动程序
提供连接计算机的每个硬件设备的接口,设备驱动器使程序能够写入设备,而不需要了解执行每个硬件的细节。简单来说,就是让你能吃到鸡蛋,但不用养一只鸡。
3) 用户接口
操作系统需要为用户提供一种运行程序和访问文件系统的方法。如常用的 Windows 图形界面,可以理解为一种用户与操作系统交互的方式;智能手机的 Android 或 iOS 系统,也是一种操作系统的交互方式。
4) 系统服务程序
当计算机启动时,会自启动许多系统服务程序,执行安装文件系统、启动网络服务、运行预定任务等操作。
层级关系大概是这样的:
更多OS内容请移驾我的操作系统专栏
Linux 是一个类似 Unix 的操作系统,Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和用户体验上进行优化
UNIX/Linux 系统可以粗糙地抽象为 3 个层次:内核、Shell层、应用层
国内大多数企业使用的都是 RHEL 或者 CentOS 作为服务器操作系统
初学者建议选择CentOS,因为其中的yum
工具可以免费使用(其实我觉得ubuntu更好)
Linux一切皆文件
所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构
处理目录的常用命令
ls: 列出目录及文件名 [-a -d -l]
cd: 切换目录
pwd:显示目前的目录
mkdir:创建一个新的目录 [-m(配置权限,例如777) -p(递归创建)]
rmdir:删除一个空的目录 [-p 连同上一级『空的才行』目录也一起删除]
cp: 复制文件或目录 [-p:连同文件的属性一起复制过去,而非使用默认属性 -r:递归持续复制]
rm: 移除文件或目录 [-f 强制 -r 递归删除 -i 主动询问]
mv: 移动文件与目录,或修改文件与目录的名称
你可以使用 man [命令] 来查看各个命令的使用文档,如 :
man cp
touch
命令创建文件,参考
ln
命令,创建软连接,参考
文件内容查看
cat 由第一行开始显示文件内容
-b/-n 列出行号
-E 将结尾的断行字节 $ 显示出来
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号! [nl [-bnw] 文件]
more 一页一页的显示文件内容
space 向下翻一页
Enter 向下翻一行
/字串 搜索字串
[ctrl]-b 代表往回翻页
:f 立刻显示出档名以及目前显示的行数
q 立刻离开
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行 [-n 后面接数字,代表显示几行的意思]
tail 只看尾几行
这个人说的很深入,参考
简单来说分为以下四个步骤:
/bin/ls
),如果是绝对路径的话直接执行alias
命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称rm
命令,其实就是 rm -i
这个整体的别名type
命令实现,例如:> [root@localhost ~]# type pwd
> pwd is a shell builtin <-- pwd是内部命令
> [root@localhost ~]# type top
> top is /usr/bin/top <-- top是外部命令
什么是环境变量呢?
env
命令来查看到 Linux 系统中所有的环境变量,下面列举是个重要的:环境变量名称 | 作用 |
---|---|
HOME | 用户的主目录(也称家目录) |
SHELL | 用户使用的 Shell 解释器名称 |
PATH | 定义命令行解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本解释器 |
RANDOM | 生成一个随机数字 |
LANG | 系统语言、语系名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
PS1 | Bash解释器的提示符 |
邮件保存路径 |
Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境
因此,一个相同的环境变量会因为用户身份的不同而具有不同的值例如我们使用
su
切换到不同的用户下,使用echo $HOME
会发现不同
注:打包并不是压缩,只不过tar命令可以打包可以压缩,可以解打包解压缩
打包:命令格式:tar -cvf filename
选项 | 含义 |
---|---|
-c | 将多个文件或目录进行打包。 |
-A | 追加 tar 文件到归档文件。 |
-f 包名 | 指定包的文件名。包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名; |
-v | 显示打包文件过程; |
#把anacondehks.cfg打包为 anacondehks.cfg.tar文件
[root@localhost ~]# tar -cvf anaconda-ks.cfg.tar anaconda-ks.cfg
#把目录打包为test.tar文件
[root@localhost ~]# tar -cvf test.tar test/
# 打包并压缩目录
[root@localhost ~]# gzip test.tar
注:压缩命令不能直接压缩目录,必须先用 tar 命令将目录打包,然后才能用 gzip 命令或 bzip2 命令对打包文件进行压缩
解包:tar [选项] 压缩包
选项 | 含义 |
---|---|
-x | 对 tar 包做解打包操作。 |
-f | 指定要解压的 tar 包的包名。 |
-t | 只查看 tar 包中有哪些文件或目录,不对 tar 包做解打包操作。 |
-C 目录 | 指定解打包位置。 |
-v | 显示解打包的具体过程。 |
# 就是一个c和x的去呗
[root@localhost ~]# tar -xvf anaconda-ks.cfg. tar
# 解打包到/tmp/目录下
[root@localhost ~]# tar -xvf test.tar -C /tmp
# 如果只想查看文件包中有哪些文件,则可以把解打包选项 "-x" 更换为测试选项 "-t"
打包压缩一起来,解压解包一起嗨
选项 | 功能 |
---|---|
-z | 压缩和解压缩 “.tar.gz” 格式 |
-j | 压缩和解压缩 ".tar.bz2"格式 |
# 打包压缩为".tar.gz"格式
[root@localhost ~]# tar -zcvf tmp.tar.gz /tmp/
# 解压解打包".tar.gz"格式
[root@localhost ~]# tar -zxvf tmp.tar.gz
# 同理
[root@localhost ~]# tar -jcvf tmp.tar.bz2 /tmp/
[root@localhost ~]# tar -jxvf tmp.tar.bz2
前两个命令非常常用,记一下!
zip 压缩命令需要手工指定压缩之后的压缩包名,注意写清楚扩展名
选项 | 含义 |
---|---|
-r | 递归压缩目录,及将制定目录下的所有文件以及子目录全部压缩。 |
-m | 将文件压缩之后,删除原始文件,相当于把文件移到压缩文件中。 |
-v | 显示详细的压缩过程信息。 |
-q | 在压缩的时候不显示命令的执行过程。 |
-压缩级别 | 压缩级别是从 1~9 的数字,-1 代表压缩速度更快,-9 代表压缩效果更好。 |
-u | 更新压缩文件,即往压缩文件中添加新文件。 |
[root@localhost ~]# zip ana.zip anaconda-ks.cfg
# 可以同时压缩多个文件
[root@localhost ~]# zip test.zip install.log install.log.syslog
# 使用 zip 命令压缩目录,需要使用“-r”选项
[root@localhost ~]# zip -r dir1.zip dir1
压缩了得解压啊
选项 | 含义 |
---|---|
-d 目录名 | 将压缩文件解压到指定目录下。 |
-n | 解压时并不覆盖已经存在的文件。 |
-o | 解压时覆盖已经存在的文件,并且无需用户确认。 |
-v | 查看压缩文件的详细信息,包括压缩文件中包含的文件大小、文件名以及压缩比等,但并不做解压操作。 |
-t | 测试压缩文件有无损坏,但并不解压。 |
-x 文件列表 | 解压文件,但不包含文件列表中指定的文件。 |
# 不论是文件压缩包,还是目录压缩包,都可以直接解压缩
[root@localhost ~]# unzip dir1.zip
只能压缩文件,不能压缩目录
选项 | 含义 |
---|---|
-c | 将压缩数据输出到标准输出中,并保留源文件。 |
-d | 对压缩文件进行解压缩。 |
-r | 递归压缩指定目录下以及子目录下的所有文件。 |
-v | 对于每个压缩和解压缩的文件,显示相应的文件名和压缩比。 |
-l | 对每一个压缩文件,显示以下字段:压缩文件的大小;未压缩文件的大小;压缩比;未压缩文件的名称。 |
-数字 | 用于指定压缩等级,-1 压缩等级最低,压缩比最差;-9 压缩比最高。默认压缩比是 -6。 |
# 压缩文件生成,但是源文件也消失了
[root@localhost ~]# gzip install.log
# 使用-c选项,但是不让压缩数据输出到屏幕上,而是重定向到压缩文件中,这样可以缩文件的同时不删除源文件
[root@localhost ~]# gzip -c anaconda-ks.cfg >anaconda-ks.cfg.gz
# 如果强行压缩目录,会把目录下所有的子文件分别压缩
必须解压啊
选项 | 含义 |
---|---|
-r | 递归处理,解压缩指定目录下以及子目录下的所有文件。 |
-c | 把解压缩后的文件输出到标准输出设备。 |
-f | 强制解压缩文件,不理会文件是否已存在等情况。 |
-l | 列出压缩文件内容。 |
-v | 显示命令执行过程。 |
-t | 测试压缩文件是否正常,但不对其做解压缩操作。 |
[root@localhost ~]# gunzip install.log.gz
# 如果之前是压缩了目录,那就用这个直接解压下面的所有压缩子文件
[root@localhost ~]# gunzip -r test/
yum install vim
默认在命令模式
使 Vim 进行输入模式的方式是在命令模式状态下输入 i、I、a、A、o、O 等插入命令
快捷键 | 功能描述 |
---|---|
i | 在当前光标所在位置插入随后输入的文本,光标后的文本相应向右移动 |
I | 在光标所在行的行首插入随后输入的文本,行首是该行的第一个非空白字符,相当于光标移动到行首执行 i 命令 |
o | 在光标所在行的下面插入新的一行。光标停在空行首,等待输入文本 |
O | 在光标所在行的上面插入新的一行。光标停在空行的行首,等待输入文本 |
a | 在当前光标所在位置之后插入随后输入的文本 |
A | 在光标所在行的行尾插入随后输入的文本,相当于光标移动到行尾再执行a命令 |
小i用的比较顺手!
在命令模式下敲个:
就到了编辑模式,一般咱都是用这个保存退出
无论在哪个模式,按个ESC
退回命令模式即可
查找文本:在命令模式下,使用正则查询
快捷键 | 功能描述 |
---|---|
/abc | 从光标所在位置向前查找字符串 abc |
/^abc | 查找以 abc 为行首的行 |
/abc$ | 查找以 abc 为行尾的行 |
?abc | 从光标所在为主向后查找字符串 abc |
n | 向同一方向重复上次的查找指令 |
N | 向相反方向重复上次的查找指定 |
要查找的字符串是严格区分大小写的
替换文本
快捷键 | 功能描述 |
---|---|
r | 替换光标所在位置的字符 |
R | 从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束 |
: s/a1/a2/g | 将当前光标所在行中的所有 a1 用 a2 替换 |
:n1,n2s/a1/a2/g | 将文件中 n1 到 n2 行中所有 a1 都用 a2 替换 |
:g/a1/a2/g | 将文件中所有的 a1 都用 a2 替换 |
# 从第一行到最后一行,root替换成liudehua
:1, $s/root/liudehua/g
:g/root/liudehua/g
复制粘贴
快捷键 | 功能描述 |
---|---|
p | 将剪贴板中的内容粘贴到光标后 |
P(大写) | 将剪贴板中的内容粘贴到光标前 |
y | 复制已选中的文本到剪贴板 |
yy | 将光标所在行复制到剪贴板,此命令前可以加数字 n,可复制n行 |
yw | 将光标位置的单词复制到剪贴板 |
合并撤销
快捷键 | 功能描述 |
---|---|
J | 文件中有两行文本,现在需要将其合并成一行 |
u | 撤销刚才执行的命令,如果要撤销刚才的多次操作,可以多按几次 |
快捷键 | 功能 |
---|---|
J | 文件中有两行文本,将其合并成一行 |
u(小写) | undo 的第 1 个字母,功能是撤销最近一次对文本做的修改操作。 |
Ctrl+R | Redo 的第 1 个字母,功能是恢复最近一次所做的撤销操作。 |
U(大写) | 第一次会撤销对一行文本(光标所在行)做过的全部操作,第二次使用该命令会恢复对该行文本做过的所有操作。 |
退出
命令 | 功能描述 |
---|---|
:wq | 保存并退出 Vim 编辑器 |
:wq! | 保存并强制退出 Vim 编辑器 |
:q | 不保存就退出 Vim 编辑器 |
:q! | 不保存,且强制退出 Vim 编辑器 |
:w | 保存但是不退出 Vim 编辑器 |
:w! | 强制保存文本 |
:w filename | 另存到 filename 文件 |
x! | 保存文本,并退出 Vim 编辑器,更通用的一个 vim 命令 |
ZZ | 直接退出 Vim 编辑器 |
快捷方向键
快捷键 | 功能描述 |
---|---|
h | 光标向左移动一位 |
j | 光标向下移动一行(以回车为换行符),也就是光标向下移动 |
k | 光标向上移动一行(也就是向上移动) |
l | 光标向右移动一位 |
快捷键 | 功能描述 |
---|---|
w 或 W | 光标移动至下一个单词的单词首 |
b 或 B | 光标移动至上一个单词的单词首 |
e 或 E | 光标移动至下一个单词的单词尾 |
nw 或 nW | n 为数字,表示光标向右移动 n 个单词 |
nb 或 nB | n 为数字,表示光标向左移动 n 个单词 |
快捷键 | 功能描述 |
---|---|
fx | 光标移动至当前行中下一个 x 字符处 |
Fx | 光标移动至当前行中下一个 x 字符处 |
快捷键 | 功能描述 |
---|---|
gg | 光标移动到文件开头 |
G | 光标移动至文件末尾 |
nG | 光标移动到第 n 行,n 为数字 |
:n | 命令模式下使用的快捷键,可以将光标快速定义到指定行的行首 |
光标移动到匹配的括号处,例如现在在“{”,要到匹配的“}”,只需要用
%
即可
多窗口
静态开窗:
$ vim -o file1 file2
打开一个编辑会话,显示为水平分割成两半的窗口,一个文件占用一个窗口
$ vim -O file1 file2
和上面相同,不过是垂直分割两半的窗口
$ vim -o5 file1 file2
将分配5个相同的窗口,有3个是闲置动态开窗:
:split
新建一个窗口,将当前窗口分割成两半,他们显示的是相同缓冲区的内容
:vsplit
创建全新的垂直分割的窗口,同样是显示和当前窗口同一个文件内容
:split otherfile
动态开启新文件窗口
:sview filename
以只读的方式水平分割打开一个新窗口窗口间移动:
Ctrl + w + h
向左移动窗口
Ctrl + w + j
向下移动窗口
Ctrl + w + k
向上移动窗口
Ctrl + w + l
向右移动窗口
Ctrl + w + w
这个命令会在所有窗口中循环移动调整窗口大小:
Ctrl + W + =
让所有窗口调整至相同尺寸(平均划分)
Ctrl + W + -
将当前窗口的高度减少一行,也可在ex命令中,:resize -4明确指定减少的尺寸
Ctrl + W + +
将当前窗口的高度增加一行,同样在ex命令中,:resize +n 明确指定增加尺寸
Ctrl + W + <
将当前窗口的宽度减少
Ctrl + W + >
将当前窗口的宽度增加关闭窗口:
ctrl + w + o
关闭当前窗口意外的所有窗口
ctrl + w + c
关闭当前窗口
显示行号
在vim命令模式下:
:nu
显示光标所在行号
:set nu
显示所有行号,:set nonu
取消设置永久显示行号:
/etc/.vimrc 是系统范围的初始化配置
~/.vimrc 个人的vim初始化配置
vim ~/.vimrc
,输入:set nu
保存退出即可其他配置文件参数可以参考
批量注释
:1,10s/^/#/g
表示在第 1~10 行行首加"#"注释
:1,10s/^#//g
将行首的"#"替换为空,即删除
:1,5s/^/\/\//g
添加//
注释还可以自定义快捷键,参考
:!ls
前面说了文件管理和一个编辑器
在此之前,先介绍一些查看和操作文件的其他命令
cat
选项 | 含义 |
---|---|
-A | 相当于 -vET 选项的整合,用于列出所有隐藏符号; |
-E | 列出每行结尾的回车符 $; |
-n | 对输出的所有行进行编号; |
-b | 同 -n 不同,此选项表示只对非空行进行编号。 |
-T | 把 Tab 键 ^I 显示出来; |
-V | 列出特殊字符; |
-s | 当遇到有连续 2 行以上的空白行时,就替换为 1 行的空白行。 |
cat file1.txt file2.txt > file3.txt
将文件 file1.txt 和 file2.txt 的内容合并后输出到文件 file3.txt 中more
选项 | 含义 |
---|---|
-f | 计算行数时,以实际的行数,而不是自动换行过后的行数。 |
-p | 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容。 |
-c | 跟 -p 选项相似,不同的是先显示内容再清除其他旧资料。 |
-s | 当遇到有连续两行以上的空白行时,就替换为一行的空白行。 |
-u | 不显示下引号(根据环境变量 TERM 指定的终端而有所不同)。 |
+n | 从第 n 行开始显示文件内容,n 代表数字。 |
-n | 一次显示的行数,n 代表数字。 |
交互指令 | 功能 |
---|---|
h 或 ? | 显示 more 命令交互命令帮助。 |
q 或 Q | 退出 more。 |
v | 在当前行启动一个编辑器。 |
:f | 显示当前文件的文件名和行号。 |
!<命令> 或 :!<命令> | 在子Shell中执行指定命令。 |
回车键 | 向下移动一行。 |
空格键 | 向下移动一页。 |
Ctrl+l | 刷新屏幕。 |
= | 显示当前行的行号。 |
’ | 转到上一次搜索开始的地方。 |
Ctrf+f | 向下滚动一页。 |
. | 重复上次输入的命令。 |
/ 字符串 | 搜索指定的字符串。 |
d | 向下移动半页。 |
b | 向上移动一页。 |
head
选项 | 含义 |
---|---|
-n K | 这里的 K 表示行数,该选项用来显示文件前 K 行的内容;如果使用 “-K” 作为参数,则表示除了文件最后 K 行外,显示剩余的全部内容。 |
-c K | 这里的 K 表示字节数,该选项用来显示文件前 K 个字节的内容;如果使用 “-K”,则表示除了文件最后 K 字节的内容,显示剩余全部内容。 |
-v | 显示文件名; |
less
选项 | 选项含义 |
---|---|
-N | 显示每行的行号。 |
-S | 行过长时将超出部分舍弃。 |
-e | 当文件显示结束后,自动离开。 |
-g | 只标志最后搜索到的关键同。 |
-Q | 不使用警告音。 |
-i | 忽略搜索时的大小写。 |
-m | 显示类似 more 命令的百分比。 |
-f | 强迫打开特殊文件,比如外围设备代号、目录和二进制文件。 |
-s | 显示连续空行为一行。 |
-b <缓冲区大小> | 设置缓冲区的大小。 |
-o <文件名> | 将 less 输出的内容保存到指定文件中。 |
-x <数字> | 将【Tab】键显示为规定的数字空格。 |
交互指令 | 功能 |
---|---|
/字符串 | 向下搜索“字符串”的功能。 |
?字符串 | 向上搜索“字符串”的功能。 |
n | 重复*前一个搜索(与 / 成 ? 有关)。 |
N | 反向重复前一个搜索(与 / 或 ? 有关)。 |
b | 向上移动一页。 |
d | 向下移动半页。 |
h 或 H | 显示帮助界面。 |
q 或 Q | 退出 less 命令。 |
y | 向上移动一行。 |
空格键 | 向下移动一页。 |
回车键 | 向下移动一行。 |
【PgDn】键 | 向下移动一页。 |
【PgUp】键 | 向上移动一页。 |
Ctrl+f | 向下移动一页。 |
Ctrl+b | 向上移动一页。 |
Ctrl+d | 向下移动一页。 |
Ctrl+u | 向上移动半页。 |
j | 向下移动一行。 |
k | 向上移动一行。 |
G | 移动至最后一行。 |
g | 移动到第一行。 |
ZZ | 退出 less 命令。 |
v | 使用配置的编辑器编辑当前文件。 |
[ | 移动到本文档的上一个节点。 |
] | 移动到本文档的下一个节点。 |
p | 移动到同级的上一个节点。 |
u | 向上移动半页 |
tail
选项 | 含义 |
---|---|
-n K | 这里的 K 指的是行数,该选项表示输出最后 K 行,在此基础上,如果使用 -n +K,则表示从文件的第 K 行开始输出。 |
-c K | 这里的 K 指的是字节数,该选项表示输出文件最后 K 个字节的内容,在此基础上,使用 -c +K 则表示从文件第 K 个字节开始输出。 |
-f | 输出文件变化后新增加的数据。 |
# 可以使用 "-f" 选项来监听文件的新増内容,一直监听在结尾处
[root@localhost ~]#tail -f anaconda-ks.cfg
# 这时如果向文件中追加一些数据(需要开启一个新终端)
# Ctrl+C退出
输入输出重定向
cat < /etc/passwd > a.txt
,作用是显示并复制到a.txtgrep 命令主要用来搜索指定文本
grep 命令的由来可以追溯到 UNIX 诞生的早期,在 UNIX 系统中,搜索的模式(patterns)被称为正则表达式(regular expressions),为了要彻底搜索一个文件,有的用户在要搜索的字符串前加上前缀 global(全面的),一旦找到相匹配的内容,用户就像将其输出(print)到屏幕上,而将这一系列的操作整合到一起就是 global regular expressions print,而这也就是 grep 命令的全称
grep命令常和正则表达式一起使用,常见的正则特殊字符如下:
通配符 | 功能 |
---|---|
c* | 将匹配 0 个(即空白)或多个字符 c(c 为任一字符)。 |
. | 将匹配任何一个字符,且只能是一个字符。 |
[xyz] | 匹配方括号中的任意一个字符。 |
[^xyz] | 匹配除方括号中字符外的所有字符。 |
^ | 锁定行的开头。 |
$ | 锁定行的结尾。 |
命令格式:[root@localhost ~]# grep [选项] 模式 文件名
选项 | 含义 |
---|---|
-c | 仅列出文件中包含模式的行数。 |
-i | 忽略模式中的字母大小写。 |
-l | 列出带有匹配行的文件名。 |
-n | 在每一行的最前面列出行号。 |
-v | 显示不包括查找字符的所有行 |
-w | 把表达式当做一个完整的单字符来搜寻,忽略那些部分匹配的行 |
如果是搜索多个文件,grep 命令的搜索结果只显示文件中发现匹配模式的文件名;而如果搜索单个文件,grep 命令的结果将显示每一个包含匹配模式的行
# 职位为 CLERK 的员工的人数,使用-c选项,模式直接是CLERK字符串
[root@localhost ~]# grep -c CLERK emp.data
使用举例:
# 搜索test中以abc开头的行并显示行号
grep -n '^abc' test.txt
sed 会根据脚本命令来编辑处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中
采用的是流编辑模式,当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕
命令格式:[root@localhost ~]# sed [选项] [脚本命令] 文件名
选项 | 含义 |
---|---|
-e 脚本命令 | 该选项会将其后跟的脚本命令添加到已有的命令中。 |
-f 脚本命令文件 | 该选项会将其后文件中的脚本命令添加到已有的命令中。 |
-n | 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。 |
-i | 此选项会直接修改源文件,要慎用 |
即sed命令==不会直接修改文件==,都是先加载到缓冲区,使用指定命令处理完后显示出来
很明显,脚本命令怎么搞才是关键!参考
这个脚本命令并不是手写Shell命令,而是一些指定的字母
命令 | 功能 |
---|---|
s | 替换,例如sed 's/test/trial/2' data4.txt 表示在第二次匹配到时用trial替换test |
c | 全部替换,sed '3c\This is a changed line of text.' data6.txt 表示第三行中的所有内容,替换成后面的字符串 |
d | 删除,sed '3d' data6.txt 表示删除第三行,sed '2,4d' data6.txt 删除第2到4行 |
a | 附加在后面,sed '3a\This is an appended line.' data6.txt 表示附加到第三行后(即第四行) |
i | 插入在前面,sed '3i\This is an appended line.' data6.txt 表示插入到第三行前(可以使用反斜线在要插入数据的每行末,从而添加多行首) |
y | 转换,sed 'y/123/789/' data8.txt 表示将123依次替换为789;echo "This 1 is a test of 1 try." 即这是一个全局命令,映射上的都会替换;如果与替换内容长度不同会报错 |
w | 数据流写入到文件,sed '1,2w test.txt' data6.txt 表示将数据流的前两行写入到test文件中 |
文件写入到数据流,sed '$r data12.txt' data6.txt 插入到数据流的末尾 | |
退出,sed '2q' test.txt 打印输出第 2 行之后,就退出 |
可以发现,脚本命令必须都用单引号包起来,别和sed参数搞混了!
使用任何脚本命令都可以在前加上[address]
,表示要处理的文件的具体的行,有两种指定模式
sed '2s/dog/cat/' data1.txt
,sed '2,4s/dog/cat/' data1.txt
sed '/demo/s/bash/csh/' /etc/passwd
在demo用户的信息中将bash换成csh通过文本匹配来指定具体数据行有很多不便,因此可以使用正则表达式匹配,就很强大了
最后在来个sed高级玩法
这是一个和sed命令类似但更加强大的文本处理工具,还是流处理模式(按行处理)
使用方式:awk [选项] '脚本命令' 文件名
选项 | 含义 |
---|---|
-F fs | 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。 |
-f file | 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。 |
-v var=val | 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val |
脚本命令由两部分组成:‘匹配规则{执行命令}’
匹配规则,和 sed 命令中的 address 部分作用相同,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正则表达式指定
整个脚本命令是用单引号(’’)括起,其中的执行命令部分需要用大括号({})括起来
例如:awk '/^$/ {print "Blank line"}' test.txt
整个命令的功能是,如果 test.txt 有 N 个空白行,那么执行此命令会输出 N 个 Blank line
也可以将命令写在脚本文件中
[root@localhost ~]# cat awk.sh
{print $1 "'s home directory is " $6}
[root@localhost ~]# awk -F: -f awk.sh /etc/passwd
awk的特性在于可以将数据行按照指定字符划分字段(例如空格或者制表符)
$0 代表整个文本行;
$1 代表文本行中的第 1 个数据字段;
$2 代表文本行中的第 2 个数据字段;
$n 代表文本行中的第 n 个数据字段
[root@localhost ~]# cat data2.txt
One line of test text.
Two lines of test text.
Three lines of test text.
[root@localhost ~]# awk '{print $1}' data2.txt
One
Two
Three
允许使用多个脚本命令,分号分隔
[root@localhost ~]# echo "My name is Rich" | awk '{$4="Christine"; print $0}'
My name is Christine
# bash shell(Shell客户端) 会使用 > 来提示输入更多数据
[root@localhost ~]# awk '{
> $4="Christine"
> print $0}'
My name is Rich
My name is Christine
# 此时如果要结束命令可以直接输入Ctrl+D
BEGIN
关键字
在处理数据前运行一些脚本命令,类似于java测试时候那个@before或者说中间件
[root@localhost ~]# cat data3.txt
Line 1
Line 2
Line 3
[root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
> {print $0}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
END
关键字
[root@localhost ~]# awk 'BEGIN {print "The data3 File Contents:"}
> {print $0}
> END {print "End of File"}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
End of File
最后再来个awk高级玩法
下载安装软件有时候是个很头疼的事情,我们安装使用的可以是源码包(没经过编译器编译过的程序员手写的代码),也可以是二进制包(编译成机器语言)
源码包通常是用来看源代码实现的,通过它安装容易出错,初学者基本无法解决
但是也可以改源码,根据自己需求编译安装,灵活性好、效率高
目前主要有以下 2 大主流的二进制包管理系统:
RPM 包管理系统:功能强大,安装、升级、査询和卸载非常简单方便,因此很多 Linux 发行版都默认使用此机制作为软件安装的管理方式,例如 Fedora、CentOS、SuSE 等。
DPKG 包管理系统:由 Debian Linux 所开发的包管理机制,通过 DPKG 包,Debian Linux 就可以进行软件包管理,主要应用在 Debian 和 Ubuntu 中。
这里主要介绍rpm包,由于是使用tar.gz格式打包压缩所以也叫“塔包”
RPM 二进制包的命名需遵守统一的命名规则,用户通过名称就可以直接获取这类包的版本、适用平台等信息
一般格式如下:
包名-版本号-发布次数-发行商-Linux平台-适合的硬件平台-包扩展名
RPM 包的名称是
httpd-2.2.15-15.el6.centos.1.i686.rpm
,其中:
- httped:软件包名。这里需要注意,httped 是包名,而 httpd-2.2.15-15.el6.centos.1.i686.rpm 通常称为包全名,包名和包全名是不同的,在某些 Linux 命令中,有些命令(如包的安装和升级)使用的是包全名,而有些命令(包的查询和卸载)使用的是包名,一不小心就会弄错。
- 2.2.15:包的版本号,版本号的格式通常为
主版本号.次版本号.修正号
。- 15:二进制包发布的次数,表示此 RPM 包是第几次编程生成的。
- el*:软件发行商,el6 表示此包是由 Red Hat 公司发布,适合在 RHEL 6.x (Red Hat Enterprise Unux) 和 CentOS 6.x 上使用。
- centos:表示此包适用于 CentOS 系统。
- i686:表示此包使用的硬件平台,目前的 RPM 包支持的平台如表 1所示
- rpm:RPM 包的扩展名,表明这是编译好的二进制包,可以使用 rpm 命令直接安装。此外,还有以 src.rpm 作为扩展名的 RPM 包,这表明是源代码包,需要安装生成源码,然后对其编译并生成 rpm 格式的包,最后才能使用 rpm 命令进行安装
平台名称 | 适用平台信息 |
---|---|
i386 | 386 以上的计算机都可以安装 |
i586 | 686 以上的计算机都可以安装 |
i686 | 奔腾 II 以上的计算机都可以安装,目前所有的 CPU 是奔腾 II 以上的,所以这个软件版本居多 |
x86_64 | 64 位 CPU 可以安装 |
noarch | 没有硬件限制 |
通常情况下,RPM 包采用系统默认的安装路径
安装路径 | 含 义 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
RPM 包也支持手动指定安装路径,但此方式并不推荐。因为一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别)
安装
# 安装命令
[root@localhost ~]# rpm -ivh 包全名
# -i:安装(install);
# -v:显示更详细的信息(verbose);
# -h:打印显示安装进度(hash),显示#进度条;
# 可能软件包在光盘中,因此需提前做好设备的挂载工作
[root@localhost ~]# rpm -ivh \
/mnt/cdrom/Packages/httpd-2.2.15-15.el6.centos.1.i686.rpm
# 上面是个apache服务,可以启动
service 服务名 start|stop|restart|status
# 启动后,可以查看端口号 80 是否出现
netstat -tlun | grep 80
-nodeps
:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
-replacefiles
:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
-replacepkgs
:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
-force
:强制安装。不管是否已经安装,都重新安装。也就是 -replacefiles 和 -replacepkgs 的综合。
-test
:测试安装。不会实际安装,只是检测一下依赖性。
-prefix
:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径源码包安装就先不介绍了,参考,参考,分为rpm源码包和tar源码包
注:上面使用
service
操作系统服务,CentOS7.x需要使用systemctl
升级
rpm -Uvh 包全名
# -U:如果该软件没安装过则直接安装;若没安装则升级至最新版本
# -F:必须安装有较低版本才能升级
卸载
# RPM 软件包的卸载要考虑包之间的依赖性,先安装的后卸载,手工操作,加量不加价!
[root@localhost ~]# rpm -e 包名
# erase
查询
# 是否安装,query [root@localhost ~]# rpm -q httpd # 查询系统中所有安装的软件包 [root@localhost ~]# rpm -qa # 查询软件包的详细信息 [root@localhost ~]# rpm -qi httpd # 查询未安装包详细信息 [root@localhost ~]# rpm -qip 包全名 # 查询安装信息(位置) [root@localhost ~]# rpm -ql httpd # 查询未安装软件包中包含的所有文件以及打算安装的路径 [root@localhost ~]# rpm -qlp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm # 查询系统文件属于哪个RPM包 [root@localhost ~]# rpm -qf /bin/ls # 查询软件包的依赖关系,Requires # 同样可以加-p查询未安装的包 [root@localhost ~]# rpm -qR httpd
Linux 系统中装有大量的 RPM 包,且每个包都含有大量的安装文件
因此,为了能够及时发现文件误删、误修改文件数据、恶意篡改文件内容等问题,Linux 提供了以下两种监控(检测)方式
RPM 包校验:其实就是将已安装文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,确定文件内容是否被修改。
RPM 包数字证书校验:用来校验 RPM 包本身是否被修改
精力有限,详情请参考
cpio 命令可以从归档包中提取文件(或目录),也可以将文件(或目录)复制到归档包中
说白了就是备份恢复的一种方式
主要有三种模式
# "-o" 模式:指的是 copy-out 模式,就是把数据备份到文件库中 [root@localhost ~]# cpio -o[vcB] > [文件丨设备] -o:copy-out模式,备份; -v:显示备份过程; -c:使用较新的portable format存储方式; -B:设定输入/输出块为 5120Bytes,而不是模式的 512Bytes; # 利用find命令指定要备份/etc/目录,使用>导出到etc.cpio文件 [root@localhost ~]#find /etc -print | cpio -ocvB > /root/etc.cpio # "-i" 模式:指的是 copy-in 模式,就是把数据从文件库中恢复 # 即以数据的原本位置为中心 [root@localhost ~]# cpio -i[vcdu] < [文件|设备] -i:copy-in 模式,还原; -v:显示还原过程; -c:较新的 portable format 存储方式; -d:还原时自动新建目录; -u:自动使用较新的文件覆盖较旧的文件; # 还原etc的备份 [root@localhost ~]# cpio -idvcu < /root/etc.cpio # "-p"模式,直接复制为其他文件 # 备份/boot/目录到/tmp/test/目录中,而不是备份到库 [root@localhost tmp]# find /boot/ -print | cpio -p /tmp/test # 后面会介绍find
在服务器使用过程,如果系统文件被误修改或误删除,可以考虑使用 cpio 命令提取出原 RPM 包中所需的系统文件,从而修复被误操作的源文件
[root@localhost ~]# rpm2cpio 包全名|cpio -idv .文件绝对路径
# 假如我们删除了/bin/ls这个文件(命令),提取ls命令文件到当前目录下
[root@localhost ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls
# 把提取出来的ls命令文件复制到/bin/目录下
[root@localhost ~]# cp /root/bin/ls /bin/
Linux一切皆文件,解释不通,Shell强攻
RPM相关文件在/var/lib/rpm
下,有个数据库,是干嘛的呢?
RPM 包是很多 Linux 发行版(Fefora、RedHat、SuSE 等)采用的软件包管理方式,安装到系统中的各 RPM 包,其必要信息都会保存到 RPM 数据库中,以便用户使用 rpm 命令对软件包执行查询、安装和卸载等操作
但并非所有的用户操作都“按常理出牌”,例如 RPM 包在升级过程被强行退出、RPM 包安装意外中断等误操作,都可能使 RPM 数据库出现故障,后果是当安装、删除、査询软件包时,请求无法执行,此时就需要修复RPM数据库了
# 删库,重建
[root@localhost ~]# rm -f /var/lib/rpm/_db.*
[root@localhost -]# rpm -rebuilddb
如果黑客入侵系统后,会修改RPM数据库,然后再窜改文件,怎么判断文件是否被修改过?
这时候我们需要查找比对一些信息
[root@localhost ~]# rpm -ql -dump samba|grep /etc/rc.d/init.d/smb
,参考
RPM包依赖性,参考
前面分别介绍了使用 SRPM 源码包和 RPM 二进制包安装软件,这两种方法都比较繁琐,需要手动解决包之间具有依赖性的问题,尤其是库文件依赖,需要自行去 http://www.rpmfind.net 网站上查找相关的 RPM 包
这里有一种更好的方式,yum
yum,全称“Yellow dog Updater, Modified”,类似于Windows的360;可以这么说,yum 是改进型的 RPM 软件管理器,可以使用rpm安装yum
按道理来讲,网络正常就可以使用yum源,配置文件在/etc/yum.repos.d/
其中以“.repo”结尾的都是源配置
分为网络yum源和本地yum源(带在镜像文件中),参考
yum命令
# 查询 yum list # 查询所有已安装和可安装的软件包 yum list 包名 # 查询软件包安装的情况(是否可安装) yum search 关键字 # 从 yum 源服务器上查找与关键字相关的所有软件包 yum info 包名 # 查询软件包的详细信息 # 安装 [root@localhost yum.repos.d]# yum -y install 包名 # -y:自动回答 yes。如果不加 -y,那么每个安装的软件都需要手工回答 yes; # 升级 # 升级所有软件包。不过考虑到服务器强调稳定性,因此该命令并不常用 yum -y update # 升级特定的软件包。 yum -y update 包名 # 卸载 yum remove 包名
使用 yum 卸载软件包时,会同时卸载所有与该包有依赖关系的其他软件包,即便有依赖包属于系统运行必备文件,也会被 yum 无情卸载,带来的直接后果就是使系统崩溃
除非你能确定卸载此包以及它的所有依赖包不会对系统产生影响,否则不要使用 yum 卸载软件包
Linux yum管理软件组
这个暂时不常用,也是一个命令而已,参考
这里的函数库就是系统程序执行或系统调用内核所使用的函数(可以理解成高级语言层和内核层之间的接口),分为静态函数库和动态函数库
静态函数库
函数库文件一般以"*.a"扩展名结尾,这种函数库在被程序调用时会被直接整合到程序当中。优点:程序执行时,不需要在调用外部数据,可以直接执行。
缺点:因为把所有内容都整合到程序中,所以编译文件会比较大,升级比较困难,需要把整个程序重新编译。
动态函数库
函数库文件通常以"*.so"扩展名结尾,这种函数库在被程序调用时,并没有直接整合到程序当中,当程序需要用到函数库的功能时,再去读取函数库,在程序中只保存了函数库的指向优点:因为没有把整个函数库整合到程序中,所以文件较小,升级方便,不需要把整个程序重新编译,只需要重新编译安装函数库就好。
缺点:程序在执行时需要调用外部函数,如果这时函数出现问题,或指向位置不正确,那么程序将不能正确执行
前面都是基基操,必必必须的!下面的用户和文件的设置、权限管理才是真正理解Linux
Linux 是多用户多任务操作系统,不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务
Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制(权限隔离)
用户组是具有相同特征用户的逻辑集合
简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,可以将这些用户加入同一用户组
用户和用户组的关系
- 一对一:一个用户可以存在一个组中,是组中的唯一成员;
- 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
- 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
- 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展
用户名登录时,系统使用的是用户名对应的ID,用户的名称与 ID 的对应关系都存储在 /etc/passwd
文件中
每个用户的 ID 细分为 2 种,分别是用户 ID(User ID,简称 UID)和组 ID(Group ID,简称 GID)
/etc/group
文件中,利用 GID 可以找到对应的群组名
/etc/passwd
[root@localhost ~]# vi /etc/passwd
roy:x:1000:1000:roy:/home/roy:/bin/bash
hadoop:x:1001:1001::/home/hadoop:/bin/bash
含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
UID 范围 | 用户身份 |
---|---|
0 | 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。 |
1~499 | 系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~499 分配给有系统账号需求的用户。 其实,除了 0 之外,其他的 UID 并无不同,这里只是默认 500 以下的数字给系统作为保留账户,只是一个公认的习惯而已。 |
500~65535 | 普通用户。通常这些 UID 已经足够用户使用了。但不够用也没关系,2.6.x 内核之后的 Linux 系统已经可以支持 232 个 UID 了。 |
Shell 就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁
/etc/shadow
用于存储 Linux 系统中用户的密码信息,又称为“影子文件”
只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
忘记密码怎么办?
对于普通账户的密码遗失,可以通过 root 账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用 root 的身份使用 passwd 命令即可)
如果 root 账号的密码遗失,则需要重新启动进入单用户模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd 命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow,将账户的 root 密码清空的方法,此方式可使用 root 无密码即可登陆,建议登陆后使用 passwd 命令配置 root 密码
/etc/group
用户组配置文件,即用户组的所有信息都存放在此文件中
[root@localhost ~]#vim /etc/group
hadoop:x:1001:hdfs,yarn,mapred
# hadoop是hdfs的附加组
含义如下:
组名:密码:GID:该用户组中的用户列表
每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加。
初始组就是用户诞生时所属的那个组,比如root用户属于root组,也就不需要在最后写个root
详细了解初始组和附加组
/etc/gshadow
组用户的密码信息存储在 /etc/gshadow 文件中
[root@localhost ~]#vim /etc/gshadow
hadoop:!::hdfs,yarn,mapred
含义如下:
组名:加密密码:组管理员:组附加用户列表
/etc/login.defs
用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。
需要注意的是,该文件的用户默认配置对 root 用户无效。并且,当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准
详细了解
useradd
新建用户
[root@localhost ~]# useradd [选项] 用户名
详情请看:参考
passwd
密码配置
创建新用户时,并没有设定用户密码,因此还无法用来登陆系统,就需要 passwd 配置命令
# 使用 root 账户修改 lamp 普通用户的密码
[root@localhost ~]#passwd lamp
Changing password for user lamp.
New password: <==直接输入新的口令,但屏幕不会有任何反应
BAD PASSWORD: it is WAY too short <==口令太简单或过短的错误!这里只是警告信息,输入的密码依旧能用
Retype new password: <==再次验证输入的密码,再输入一次即可
passwd: all authentication tokens updated successfully. <==提示修改密码成功
# 查看用户密码的状态,只有root用户可操作
[root@localhost ~]# passwd -S lamp
# 锁定 lamp 用户,此用户就不能登录系统了,解锁用-u
[root@localhost ~]# passwd -I lamp
usermod
修改用户信息
[root@localhost ~]#usermod [选项] 用户名
# 选项如下:
-c 用户说明:修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段;
-d 主目录:修改用户的主目录,即修改 /etc/passwd 文件中目标用户信息的第 6 个字段,需要注意的是,主目录必须写绝对路径;
-e 日期:修改用户的失效曰期,格式为 "YYYY-MM-DD",即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段;
-g 组名:修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段(GID);
-u UID:修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID);
-G 组名:修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件;
-l 用户名:修改用户名称;
-L:临时锁定用户(Lock);
-U:解锁用户(Unlock),和 -L 对应;
-s shell:修改用户的登录 Shell,默认是 /bin/bash
# 可以使用 man usermod 查看
chage
查看密码详情
# 查看详情
[root@localhost ~]#chage [选项] 用户名
-l:列出用户的详细密码状态;
-d 日期:修改 /etc/shadow 文件中指定用户密码信息的第 3 个字段,也就是最后一次修改密码的日期,格式为 YYYY-MM-DD;
-m 天数:修改密码最短保留的天数,也就是 /etc/shadow 文件中的第 4 个字段;
-M 天数:修改密码的有效期,也就是 /etc/shadow 文件中的第 5 个字段;
-W 天数:修改密码到期前的警告天数,也就是 /etc/shadow 文件中的第 6 个字段;
-i 天数:修改密码过期后的宽限天数,也就是 /etc/shadow 文件中的第 7 个字段;
-E 日期:修改账号失效日期,格式为 YYYY-MM-DD,也就是 /etc/shadow 文件中的第 8 个字段
# 强制修改密码
[root@localhost ~]#chage -d 0 lamp
# 通过chage命令设置此账号密码创建的日期为 1970 年 1 月 1 日(0 就表示这一天)
# 这样用户登陆后就必须修改密码
不是change,是chage
userdel
删除用户的相关数据
前面学习到:
- 用户基本信息:存储在 /etc/passwd 文件中;
- 用户密码信息:存储在 /etc/shadow 文件中;
- 用户群组基本信息:存储在 /etc/group 文件中;
- 用户群组信息信息:存储在 /etc/gshadow 文件中;
- 用户个人文件:主目录默认位于 /home/用户名,邮箱位于 /var/spool/mail/用户名
userdel
命令的作用就是从以上文件中,删除与指定用户有关的所有数据信息
[root@localhost ~]# userdel -r lamp
# 可以尝试通过上面的命令创建好用户再一步步删除!
id
查询
id 命令可以查询用户的UID、GID 和附加组的信息
su
用户切换
[root@localhost ~]# su [选项] 用户名
-:当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),使用 - 选项可省略用户名,默认会切换为 root 用户。
-l:同 - 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。
-p:表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。
-m:和 -p 一样;
-c 命令:仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令
使用
-
和不使用是完全不一样的哦!以前还没发现
whoami
我是谁?
[Cyuyan@localhost ~] su - root
[root@localhost ~]$ whoami
root
[root@localhost ~]$ who am i
Cyuyan pts/0 2017-10-09 15:30 (:0.0)
# 看出来了吗?
# who am i 用来打印登陆当前 Linux 系统的用户名
groupadd
添加用户组
groupmod
修改用户组的相关信息
groupdel
于删除用户组(群组)
gpasswd
给群组设置一个群组管理员
选项 | 功能 |
---|---|
选项为空时,表示给群组设置密码,仅 root 用户可用。 | |
-A user1,… | 将群组的控制权交给 user1,… 等用户管理,也就是说,设置 user1,… 等用户为群组的管理员,仅 root 用户可用。 |
-M user1,… | 将 user1,… 加入到此群组中,仅 root 用户可用。 |
-r | 移除群组的密码,仅 root 用户可用。 |
-R | 让群组的密码失效,仅 root 用户可用。 |
-a user | 将 user 用户加入到群组中。 |
-d user | 将 user 用户从群组中移除。 |
newgrp
切换用户的初始组
# 创建user1,指定 user1 的初始组为 group1,附加组为 group2 和 group3 [root@localhost ~]# useradd -g group1 -G group2,group3 user1 # [root@localhost ~]# passwd user1 # 切换至 user1 用户 [root@localhost ~]# su - user1 [root@localhost ~]# whoami user1 # 使用 newgrp 命令一边切换 user1 的初始组,一边创建文件 [root@localhost ~]# mkdir user1_doc [root@localhost ~]# newgrp group2 [root@localhost ~]# mkdir user2_doc [root@localhost ~]# newgrp group3 [root@localhost ~]# mkdir user3_doc # 查看各文件的详细信息 [root@localhost ~]# ll total 12 drwxr-xr-x 2 user1 group1 4096 Oct 24 01:18 user1_doc drwxr-xr-x 2 user1 group2 4096 Oct 24 01:18 user2_doc drwxr-xr-x 2 user1 group3 4096 Oct 24 01:19 user3_doc
作用是什么呢?
切换附加组成为新的初始组,从而让用户获得使用各个附加组的权限
底层原理呢?
每一次切换用户的初始组,该用户都会以另外一个 shell(新进程,也可以说是子进程)登陆,只不过在新 shell 上登陆的该用户其初始组改变了而已
当然,如果你想回到原本的环境,需要通过
exit
命令不断回退到当前进程的父进程,最终才能回到初始组为 group1 时的 user1 运行的 shell 中
以下是几个主要的文件指令:
# 修改文件(或目录)的所属组 # -R(注意大写)选项表示连同子目录中的所有文件,都更改所属组 [root@localhost ~]# chgrp group1 install.log # 修改install.log文件的所属组为group1 # 修改文件所有者 [root@localhost ~]# chown user file # 注意:所有者就是用户,所属组就是用户组 [root@localhost ~]# chown user:group file # 不推荐通过这个命令改所属组 # 修改文件目录权限,分为rwx三种权限 # 如下图所示,一个文件的权限属于三种身份:所有者、所属组、其他人 # 一般来说具体分配是: 所有者 = rwx = 4+2+1 = 7 所属组 = rw- = 4+2 = 6 其他人 = r-x = 4+1 = 5 [root@localhost ~]# chmod 755 .bashrc # 还有另外的比较直接的但很繁琐的修改方式,如下图2 [root@localhost ~]# chmod u=rwx,go=rx .bashrc # 文件和目录默认权限设置 # Windows 系统中,新建的文件和目录时通过继承上级目录的权限获得的初始权限 # 而 Linux 不同,它是通过使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的 [root@localhost ~]# umask # root用户默认是0022,普通用户默认是 0002 # 这里的第一位数字后面再论,后三位对应rwx
文件和目录的真正初始权限,可通过以下的计算得到:
对文件来讲,其可拥有的最大默认权限是 666,即 rw-rw-rw-
(-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)
目录的默认权限最大可以是 777,换算成字母就是 drwxrwxrwx
(drwxrwxrwx) - (-----w--w-) = (drwxr-xr-x)
即默认权限如何修改默认权限?umask 033
如何永久修改?
[root@localhost ~]# vim /etc/profile
...省略部分内容...
if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then
umask 002
#如果UID大于199(普通用户),则使用此umask值
else
umask 022
#如果UID小于199(超级用户),则使用此umask值
fi
咋们要有个意识:执行权限是文件的最高权限,赋予时绝对要慎重,因此绝不能在新建文件的时候就默认赋予,只能通过用户手工赋予
可以直接添加某个权限:
chmod u +x xxx
给用户添加执行权限考虑如图所示的情景:
老师(root)将所有学生加入到tgroup用户组,赋权rwx,将
/project
目录所属改为tgroup之后,就可以玩耍了!此时来个屌丝st,他能看看,蛋不能加到tgroup
但文件夹只能所属一个用户组,怎么搞?之前的三种身份+三种权限已不能满足需求了!
ACL,是 Access Control List(访问控制列表)的缩写
设定 ACL 权限,参考
# 查看文件或目录当前设定的 ACL 权限信息
getfacl
# 直接设定用户或群组对指定文件的访问权限
setfacl
# 选项参数如下:
选项 | 功能 |
---|---|
-m 参数 | 设定 ACL 权限。如果是给予用户 ACL 权限,参数则使用 “u:用户名:权限” 的格式,例如 setfacl -m u:st:rx /project 表示设定 st 用户对 project 目录具有 rx 权限;如果是给予组 ACL 权限,参数则使用 “g:组名:权限” 格式,例如 setfacl -m g:tgroup:rx /project 表示设定群组 tgroup 对 project 目录具有 rx 权限。 |
-x 参数 | 删除指定用户(参数使用 u:用户名)或群组(参数使用 g:群组名)的 ACL 权限,例如 setfacl -x u:st /project 表示删除 st 用户对 project 目录的 ACL 权限。 |
-b | 删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录的所有 ACL 权限。 |
-d | 设定默认 ACL 权限,命令格式为 “setfacl -m d:u:用户名:权限 文件名”(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。 |
-R | 递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 “setfacl -m u:用户名:权限 -R 文件名”(群组使用 g:群组名:权限),例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。 |
-k | 删除默认 ACL 权限 |
有了ACL,人(用户用户组)和物(文件目录)的关系就可以被清晰定义了
对于用户,分初始组和附加组;对于文件和目录,称为所属组
为什么不给文件分初始组和附加组?
mask 权限
指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理
类似于文件目录的最大默认权限和umask权限对比,这里是mask(最大)权限和ACL权限对比计算
不过,我们一般不更改 mask 权限,只要赋予 mask 最大权限(也就是 rwx)
之前在聊身份和权限的时候,发现在x权限位上会出现s,此种权限通常称为 SetUID,简称 SUID 特殊权限
SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失
类似于
newgrp
命令,修改初始化组,让用户有其他组的权限,当然,那是人与组之间
举个栗子吧
我们都知道,Linux 系统中所有用户的密码数据都记录在 /etc/shadow 这个文件中,通过 ll /etc/shadow 命令可以看到,此文件的权限是 0(---------),也就是说,普通用户对此文件没有任何操作权限
这就会产生一个问题,为什么普通用户可以使用 passwd 命令修改自己的密码呢?
可以看到,
passwd
命令拥有 SUID 特殊权限,而且其他人对此文件也有执行权限,这就意味着,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令
不要轻易设置SetUID(SUID)权限,否则会带来重大安全隐患!
SGID 特殊权限
当 s 权限位于所属组的 x 权限位时,就被称为 SetGID
既可以对文件进行配置,也可以对目录进行配置;其他和SUID类似(对于文件),用户在执行具有 SGID 权限的可执行文件时,用户的群组身份会变为文件所属群组
对于目录则很常见:当一个目录被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录的所属组,会就使得用户在创建文件(或目录)时,该文件(或目录)的所属组将不再是用户的所属组,而使用的是目录的所属组
#建立测试目录
[root@localhost tmp]# mkdir dtest
#给测试目录赋予SetGID权限
[root@localhost tmp]# chmod g+s dtest
Sticky BIT,简称 SBIT 特殊权限
SBIT 权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件
例如:Linux 系统中,存储临时文件的 /tmp 目录就设定有 SBIT 权限
[root@localhost ~]# ll -d /tmp
drwxrwxrwt. 4 root root 4096 Apr 19 06:17 /tmp
关于这三个特殊权限的设置,可以通过数字和字母的方式,参考,例如:
chmod 4777 test.log
,chmod u+s test
管理 Linux 系统中的文件和目录,除了可以设定普通权限和特殊权限外,还可以利用文件和目录具有的一些隐藏属性
chattr
命令,专门用来修改文件或目录的隐藏属性,只有 root 用户可以使用
#建立测试文件
[root@localhost ~]# touch ftest
[root@localhost ~]# chattr +i ftest
[root@localhost ~]# rm -rf ftest
#被赋予i属性后,root不能删除
rm:cannot remove 'ftest':Operation not permitted
#权限不够,不能修改文件中的数据
[root@localhost ~]# echo 111>>ftest
bash:ftest:Permission denied
属性选项 | 功能 |
---|---|
i | 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据; 如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件; |
a | 如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据; 如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件; |
u | 设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录。 |
s | 和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复 |
强吗?root都不行,只能改掉这个属性!可以说是对文件的一种保护吧
怎么改?看到上面那个
+
了吗,变成-
再来一遍可以用
lsattr
查看
sudo
命令
前面的
su
,仅仅为了一个特权操作就直接赋予普通用户控制系统的完整权限;这是有隐患的!而且有些账户中,默认 Shell 是 /sbin/nologin,无法使用su命令,这是???
sudo
命令类似于上面的SUID特权,只需使用用户自己的密码,在执行后面命令的时候切换到指定身份!这个身份怎么指定?
[root@localhost ~]# sudo [-b] [-u 新使用者账号] 要执行的命令
-b :将后续的命令放到背景中让系统自行运行,不对当前的 shell 环境产生影响。
-u :后面可以接欲切换的用户名,若无此项则代表切换身份为 root 。
-l:此选项的用法为 sudo -l,用于显示当前用户可以用 sudo 执行那些命令。
默认只允许root用户使用,这应该是劳苦大众的政策啊!需要修改sudo命令的配置文件
/etc/sudoers
,而且需要使用visudo
[root@localhost ~]# visudo
…省略部分输出…
root ALL=(ALL) ALL <--大约 76 行的位置
# %wheel ALL=(ALL) ALL <--大约84行的位置
#这两行是系统为我们提供的模板,我们参照它写自己的就可以了
具体方式请查看
最后,结合实例分析Linux权限对指令执行的影响
主要是一些常见操作涉及到的权限,参考
例如,进入目录使用
cd
命令,需要有x权限,再使用ls
命令需要有r权限
在 Linux 系统中,文件系统是创建在硬盘上的,因此,要想彻底搞清楚文件系统的管理机制,就要从了解硬盘开始
如果从存储数据的介质上来区分,硬盘可分为机械硬盘(Hard Disk Drive, HDD)和固态硬盘(Solid State Disk, SSD)
机械硬盘采用磁性碟片来存储数据,而固态硬盘通过闪存颗粒来存储数据
HDD
机械硬盘主要由磁盘盘片、磁头、主轴与传动轴等组成,数据就存放在磁盘盘片中;硬盘是上下双磁头,盘片在两个磁头中间高速旋转,也就是说,机械硬盘是上下盘面同时进数据读取的
由于机械硬盘的超高转速,如果内部有灰尘,则会造成磁头或盘片的损坏,所以机械硬盘内部是封闭的,如果不是在无尘环境下,则禁止拆开机械硬盘
机械硬盘的逻辑结构主要分为磁道、扇区和拄面,详情参考
机械硬盘通过接口与计算机主板进行连接。如果接口的性能很差,则同样会影响机械硬盘的性能,常见的是SATA 接口(Serial ATA,串口)和SCSI 接口(Small Computer System Interface,小型计算机系统接口)
驱动应该就是控制接口的吧?
SSD
固态硬盘和传统的机械硬盘最大的区别就是不再采用盘片进行数据存储,而采用存储芯片进行数据存储
固态硬盘的存储芯片主要分为两种:一种是采用闪存作为存储介质的(较多);另一种是采用DRAM作为存储介质的
对比项目 | 固态硬盘 | 机械硬盘 |
---|---|---|
容量 | 较小 | 大 |
读/写速度 | 极快 | —般 |
写入次数 | 5000〜100000 次 | 没有限制 |
工作噪声 | 极低 | 有 |
工作温度 | 极低 | 较高 |
防震 | 很好 | 怕震动 |
重量 | 低 | 高 |
价格 | 高 | 低 |
不同的文件系统代表硬盘不同的分区方式,Linux中最常见的文件系统类型是ext4,Windows中常见的是FAT32和NTFS(一代更比一代强)
目前最新的 CentOS 7.x 默认使用 xfs 格式
对硬盘进行格式化的真实目的就是为了写入文件系统
Linux系统是怎样识别硬盘设备和硬盘分区的?可以参考
Linux 系统初始化时(启动时),会根据 MBR 来识别硬盘设备。MBR 中前 446 个字节的
boot loader
程序(引导加载程序)用来载入操作系统,之后的 64 个(16×4)字节的空间,就是存储的分区表(Partition table)相关信息(这段引导程序可以理解为并不属于Linux系统,只是给我们开了一扇门进入Linux的世界!)由于 MBR 留给分区表的磁盘空间只有 64 个字节,而每个分区表的大小为 16 个字节,所以在一个硬盘上最多可以划分出 4 个主分区。如果想要在一个硬盘上划分出 4 个以上的分区时,可以通过在硬盘上先划分出一个可扩展分区的方法来增加额外的分区
百度一个安装双系统的方法过一遍就可以了解这些话的意思咯!
查看文件系统硬盘使用情况
到了Linux这个世界后…
Linux系统也是安装在磁盘上的,例如我们分配给这个系统500G的电脑空间,安装完毕后相当于这500G让Linux占用,按照xfs的设计方式进行了分区(这和整个电脑的磁盘分区不是一回事,相当于电脑是一张白纸,剪了一部分来操作!怎么剪自行百度)
这500G形成了一个有规律的系统,叫文件系统,可以发现,这部分是Linux的更深层次的姿势了!一切都是基于此文件系统,Linux一切皆文件!(可以简单认为平时所说的Linux系统就是这个文件系统)
df
命令,用于显示 Linux 系统中各文件系统分区的硬盘使用情况
选项 | 作用 |
---|---|
-a | 显示所有文件系统信息,包括系统特有的 /proc、/sysfs 等文件系统; |
-m | 以 MB 为单位显示容量; |
-k | 以 KB 为单位显示容量,默认以 KB 为单位; |
-h | 使用人们习惯的 KB、MB 或 GB 等单位自行显示容量; |
-T | 显示该分区的文件系统名称; |
-i | 不用硬盘容量显示,而是以含有 inode 的数量来显示。 |
目录或文件所占磁盘空间大小
du
是统计目录或文件所占磁盘空间大小的命令,如果后面不跟目录或文件,就是当前目录的占用情况;如果后面跟文件名则是显示当前文件大小du 命令是面向文件的,只会计算文件或目录占用的磁盘空间。也就是说,df 命令统计的分区更准确,是真正的空闲空间
dumpe2fs
命令来查看文件系统的详细信息
# -h 选项的含义是仅列出 superblock(超级块)的数据信息; [root@www ~]# dumpe2fs [-h] 文件名 [root@localhost ~]# df <==这个命令可以列出目前挂载的装置 Filesystem 1K-blocks Used Available Use% Mounted on /dev/hdc2 9920624 3822848 5585708 41% / /dev/hdc3 4956316 141376 4559108 4% /home /dev/hdc1 101086 11126 84741 12% /boot tmpfs 371332 0 371332 0% /dev/shm [root@localhost ~]# dumpe2fs /dev/hdc2 dumpe2fs 1.39 (29-May-2006) Filesystem volume name: /1 <==这个是文件系统的名称(Label) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file Default mount options: user_xattr acl <==默认挂载的参数 Filesystem state: clean <==这个文件系统是没问题的(clean) Errors behavior: Continue Filesystem OS type: Linux Inode count: 2560864 <==inode的总数 Block count: 2560359 <==block的总数 Free blocks: 1524760 <==还有多少个 block 可用 Free inodes: 2411225 <==还有多少个 inode 可用 First block: 0 Block size: 4096 <==每个 block 的大小啦! Filesystem created: Fri Sep 5 01:49:20 2008 Last mount time: Mon Sep 22 12:09:30 2008 Last write time: Mon Sep 22 12:09:30 2008 Last checked: Fri Sep 5 01:49:20 2008 First inode: 11 Inode size: 128 <==每个 inode 的大小 Journal inode: 8 <==底下这三个与下一小节有关 Journal backup: inode blocks Journal size: 128M Group 0: (Blocks 0-32767) <==第一个 data group 内容, 包含 block 的启始/结束号码 Primary superblock at 0, Group descriptors at 1-1 <==超级区块在 0 号 block Reserved GDT blocks at 2-626 Block bitmap at 627 (+627), Inode bitmap at 628 (+628) Inode table at 629-1641 (+629) <==inode table 所在的 block 0 free blocks, 32405 free inodes, 2 directories <==所有 block 都用完了! Free blocks: Free inodes: 12-32416 <==剩余未使用的 inode 号码 Group 1: (Blocks 32768-65535) #由于数据量非常的庞大,这里省略了一部分输出信息
前半部分显示的是超级块的信息,后半部分是每个区块群组的详细信息
Linux 文件系统(EXT 系列)在格式化的时候,会分为多个区块群组(block group);那么什么是超级块呢?
可以参考,简单理解就是一个文件系统对应一个super_block,主要存放了该物理磁盘中文件系统结构的相关信息,并且对各个部分的大小进行说明
注意:“文件系统”和“文件系统类型”不一样!,一般一台主机中,类型只能是一个,系统(区块)分多个
挂载系统外文件
什么是挂载?可以参考
注意:任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)
挂载指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件所有的硬件设备必须挂载之后才能使用,只不过,有些硬件设备(比如硬盘分区)在每次系统启动时会自动挂载,而有些(比如 U 盘、光盘)则需要手动进行挂载
u盘的超级块也会被读入内存中生成新的超级块
# 自动检查 /etc/fstab 文件中有无疏漏被挂载的设备文件
[root@localhost ~]# mount -a
/etc/fstab
文件,此文件是自动挂载文件,系统开机时会主动读取 /etc/fstab 这个文件中的内容,根据该文件的配置,系统会自动挂载指定设备
[root@localhost ~]# mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点
- -t 系统类型:指定欲挂载的文件系统类型。Linux 常见的支持类型有 EXT2、EXT3、EXT4、iso9660(光盘格式)、vfat、reiserfs 等。如果不指定具体类型,挂载时 Linux 会自动检测。
- -L 卷标名:除了使用设备文件名(例如 /dev/hdc6)之外,还可以利用文件系统的卷标名称进行挂载。
- -n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 文件中,但在某些场景下(例如单人维护模式),为了避免出现问题,会刻意不写入,此时就需要使用这个选项;
- -o 特殊选项:可以指定挂载的额外选项,比如读写权限、同步/异步等,如果不指定,则使用默认值(defaults)。具体的特殊选项参见表 1;
选项 | 功能 |
---|---|
rw/ro | 是否对挂载的文件系统拥有读写权限,rw 为默认值,表示拥有读写权限;ro 表示只读权限。 |
async/sync | 此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为异步 async。 |
dev/nodev | 是否允许从该文件系统的 block 文件中提取数据,为了保证数据安装,默认是 nodev。 |
auto/noauto | 是否允许此文件系统被以 mount -a 的方式进行自动挂载,默认是 auto。 |
suid/nosuid | 设定文件系统是否拥有 SetUID 和 SetGID 权限,默认是拥有。 |
exec/noexec | 设定在文件系统中是否允许执行可执行文件,默认是允许。 |
user/nouser | 设定此文件系统是否允许让普通用户使用 mount 执行实现挂载,默认是不允许(nouser),仅有 root 可以。 |
defaults | 定义默认值,相当于 rw、suid、dev、exec、auto、nouser、async 这 7 个选项。 |
remount | 重新挂载已挂载的文件系统,一般用于指定修改特殊权限 |
umount
命令用于卸载已经挂载的硬件设备
[root@localhost ~]# umount 设备文件名或挂载点
[root@localhost ~]# umount /mnt/usb
#卸载U盘
[root@localhost ~]# umount /mnt/cdrom
#卸载光盘s
“服务器一定要先关闭服务再进行重启”,但人总是会误操作,突然断电可能会让系统崩溃甚至损坏硬件
对于一些小问题,使用fsck
命令就可以很好地解决
[root@localhost ~]# fsck [选项] 分区设备文件名
选项 | 功能 |
---|---|
-a | 自动修复文件系统,没有任何提示信息。 |
-r | 采取互动的修复模式,在修改文件前会进行询问,让用户得以确认并决定处理方式。 |
-A(大写) | 按照 /etc/fstab 配置文件的内容,检查文件内罗列的全部文件系统。 |
-t 文件系统类型 | 指定要检查的文件系统类型。 |
-C(大写) | 显示检查分区的进度条。 |
-f | 强制检测,一般 fsck 命令如果没有发现分区有问题,则是不会检测的。如果强制检测,那么不管是否发现问题,都会检测。 |
-y | 自动修复,和 -a 作用一致,不过有些文件系统只支持 -y |
此命令通常只有身为 root 用户且文件系统出现问题时才会使用,否则,在正常状况下使用 fsck 命令,很可能损坏系统
说白了,这个命令使用时有风险的,当一个受损文件系统中包含了非常有价值的数据时,务必首先进行备份!如果你怀疑已经格式化成功的硬盘有问题,也可以使用此命令来进行检查
我们在安装操作系统的过程中已经对系统硬盘进行了分区,但如果新添加了一块硬盘,想要正常使用,就需要新建分区而不是重装系统!
也就是说,目前我们所说的分区有两个意思
- 整个电脑系统的磁盘分区,例如安装双系统,一部分空间给Windows,一部分用来安装Linux(MBR搞好就行)
- Linux的文件系统分区,在安装Linux系统时,选择文件系统类型后会分为多个区块群组
这里需要使用命令fdisk
,详情参考
fdisk命令只能加入小于2TB的分区
其实这个过程并不复杂,依托已经建立的Linux系统,注入文件系统后只不过是相当于多了个硬件设备而已
分区完成后,如果不格式化写入文件系统,则是不能正常使用的。这时就需要使用 mkfs
命令对硬盘分区进行格式化
即安装完成后系统只是个骨架,文件系统是血肉
# -t 文件系统格式:用于指定格式化的文件系统,如 ext3、ext4;
[root@localhost ~]# mkfs [-t 文件系统格式] 分区设备文件名
# 前面我们建立了 /dev/sdb1(主分区)、/dev/sdb2(扩展分区)、/dev/sdb5(逻辑分区)和 /dev/sdb6(逻辑分区)这几个分区
[root@localhost ~]# mkfs -t ext4 /dev/sdb6
mke2fs
命令可以手动调整分区的默认参数,可以参考
虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(又称 swap 空间)
作为物理内存的扩展,Linux 会在物理内存不足时,使用交换分区的虚拟内存,更详细地说,就是内核会将暂时不用的内存块信息写到交换空间,这样一来,物理内存得到了释放,这块内存就可以用于其他目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存
简而言之,就是为了释放物理内存而在磁盘开辟的暂存空间
如何建立swap分区?参考
想了解高级文件系统管理吗?请参考
这一章学的是实实在在的东西——磁盘,作为实体,也是一切的依托!无论执行什么样的命令(Shell自带的命令在内存中咳咳),调用什么样的硬件,都离不开这里的配合。还记得最上面的Linux分层图吗?内核、Shell也都依托(存储)在硬件上
当然,这里也只是磁盘,还有内存,CPU等等,配合完成一项命令(进程),他们统称为硬件,即:Shell将用户命令解析完后传递给内核执行就是在调度这些硬件资源
这部分主要搞清楚文件系统的概念即可
上面学习了Linux的底层原理,解释了“一切皆文件”的由来,对一个系统内部的分区方式有了大致的认识,主要总结成下面几点:
硬件也看做文件,Linux所使用的硬件都需要挂载,只不过一部分是启动时为了系统需要自动挂载的
文件系统类型决定了系统内部区块群组的设置方式,常见的是ext4和xfs
新安装的系统或者新加入的分区都需要格式化才能使用,格式化就是文件系统注入的过程
如何加入新的分区以及交换分区的建立需要掌握
这个话题就比较大了,系统管理只是一个统称,软件管理、文件系统管理、启动管理和服务管理都可以归入系统管理当中
这里主要学习进程管理、工作管理和系统定时任务,不仅包括了磁盘(文件系统),还涉及内存、CPU等!可以说终于要全面解释Linux的运行机制
Linux 中可以使用命令进行进程管理,查看系统中运行的程序和进程、判断服务器的健康状态和强制中止不需要的进程
进程是正在执行中的程序,当程序(磁盘中)被执行时,执行人的权限和属性,以及程序的代码都会被加载入内存,操作系统(CPU)给这个进程分配一个 ID,称为 PID(进程 ID)
在操作系统中,所有可以执行的程序与命令都会产生进程。只是有些程序和命令非常简单,如 ls 命令、touch 命令等,它们在执行完后就会结束,相应的进程也就会终结,所以我们很难捕捉到这些进程。但是还有一些程和命令,比如 httpd 进程,启动之后就会一直驻留在系统当中,我们把这样的进程称作常驻内存进程
子进程是依赖父进程而产生的,如果父进程不存在,那么子进程也不存在了
具体内容可以看我的操作系统笔记
手工启动
手工启动进程指的是由用户输入命令直接启动一个进程,又可细分为前台启动进程和后台启动进程(这里就不包括系统正运行需要自启动的进程了)
前台启动:Shell客户端(bash)中输入命令执行,可以用
ps
查看进程信息(或者jps
)后台启动:在命令结尾加
&
,一般是该进程非常耗时,且用户也不急着需要其运行结果的时候;输入命令并运行之后,Shell 会提供给我们一个数字,此数字就是该进程的进程号
配置自启
主要是系统性能监控和网络状态信息,常见命令如下:
ps
:查看进程信息
[root@localhost ~]# ps -aux
# 查看系统中所有的进程,使用 BS 操作系统格式,下表具体解释
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 2872 1416 ? Ss Jun04 0:02 /sbin/init
[root@localhost ~]# ps -le
# 查看系统中所有的进程,使用 Linux 标准命令格式,更详细
F S UID PID PPID C PRI Nl ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 718 - ? 00:00:02 init
[root@localhost ~]# ps -l
# 只能看到当前 Shell 产生的进程
ps -aux
,也有ps -ef
,显示的字段有区别
- a:显示一个终端的所有进程,除会话引线外;
- u:显示进程的归属用户及内存的使用情况;
- x:显示没有控制终端的进程;
- -l:长格式显示更加详细的信息;
- -e:显示所有进程;
表头 | 含义 |
---|---|
USER | 该进程是由哪个用户产生的。 |
PID | 进程的 ID。 |
%CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB。 |
RSS | 该进程占用实际物理内存的大小,单位为 KB。 |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。 |
STAT | 进程状态。常见的状态有以下几种:-D:不可被唤醒的睡眠状态,通常用于 I/O 情况。-R:该进程正在运行。-S:该进程处于睡眠状态,可被唤醒。-T:停止状态,可能是在后台暂停或进程处于除错状态。-W:内存交互状态(从 2.6 内核开始无效)。-X:死掉的进程(应该不会出现)。-Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。-<:高优先级(以下状态在 BSD 格式中出现)。-N:低优先级。-L:被锁入内存。-s:包含子进程。-l:多线程(小写 L)。-+:位于后台。 |
START | 该进程的启动时间。 |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
COMMAND | 产生此进程的命令名。 |
注意一下这几个状态STAT
表头 | 含义 |
---|---|
F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
UID | 运行此进程的用户的 ID; |
PID | 进程的 ID; |
PPID | 父进程的 ID; |
C | 该进程的 CPU 使用率,单位是百分比; |
PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行; |
NI | 进程的优先级,数值越小,该进程越早被执行; |
ADDR | 该进程在内存的哪个位置; |
SZ | 该进程占用多大内存; |
WCHAN | 该进程是否运行。"-"代表正在运行; |
TTY | 该进程由哪个终端产生; |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
CMD | 产生此进程的命令名; |
僵尸进程
一般是由于进程非正常停止或程序编写错误,子进程结束而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中
一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后强制中止(干掉)
top
:动态持续监听
使用
ps
得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。为此,Linux 提供了
top
命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状
[root@localhost ~]# top [选项]
[root@localhost ~]# top -b -n 1 > /root/top.log
#让top命令只执行一次,然后把执行结果保存到top.log文件中,这样就能看到所有的进程了
- -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
- -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
- -n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
- -p 进程PID:仅查看指定 ID 的进程;
- -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
- -u 用户名:只监听某个用户的进程;
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
- ? 或 h:显示交互模式的帮助;
- P:按照 CPU 的使用率排序,默认就是此选项;
- M:按照内存的使用率排序;
- N:按照 PID 排序;
- T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
- k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
- r:按照 PID 给某个进程重设优先级(Nice)值;
- q:退出 top 命令;
详情请参考
vmstat
以及free
命令类似,都属于系统监控缓存和缓冲
简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的(提前拿出来),而缓冲(buffer)是用来加速数据"写入"硬盘的(凑在一起写)
pstree
以树形结构显示程序和进程之间的关系
[root@localhost ~]# pstree [选项] [PID或用户名]
选项 | 含义 |
---|---|
-a | 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。 |
-c | 不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。 |
-n | 根据进程 PID 号来排序输出,默认是以程序名排序输出的。 |
-p | 显示进程的 PID。 |
-u | 显示进程对应的用户名称。 |
如果不指定进程的 PID 号,也不指定用户名称,则会以 init 进程为根进程,显示系统中所有程序和进程的信息;
若指定 PID 号或用户名,则将以 PID 或指定命令(关于用户的)为根进程,显示 PID 或用户对应的所有程序和进程
注:init 进程是系统启动的第一个进程,进程的 PID 是 1,也是系统中所有进程的父进程
# mysql用户启动了哪些进程
[root@1ocalhost ~]# pstree mysql
mysqid---6*[{mysqid}]
# 此输出结果显示了 mysql 用户对应的进程为 mysqid,并且 mysqid 进程拥有 5 个子进程(外加 1 个父进程,共计 6 个进程)
lsof
ps 命令可以查询到系统中所有的进程,那么,是否可以进一步知道这个进程到底在调用哪些文件吗(刨根问底的精神b)
[root@localhost ~]# lsof [选项]
选项 | 功能 |
---|---|
-c 字符串 | 只列出以字符串开头的进程打开的文件。 |
+d 目录名 | 列出某个目录中所有被进程调用的文件。 |
-u 用户名 | 只列出某个用户的进程打开的文件。 |
-p pid | 列出某个 PID 进程打开的文件 |
[root@localhost ~]# lsof | more
#查询系统中所有进程调用的文件
除了上面的系统性能监控,查看网络系统的状态信息也较为常用
netstat
命令ping www.baidu.com
curl -X POST --header"Content-Type:application/json" --data ‘{}’ url
使用post方式json格式发送请求curl www.baidu.com
获取该网址的文本信息CPU 在一个时钟周期内只能运算一条指令,谁应该先运算,谁应该后运算呢?这就需要由进程的优先级来决定了
CPU 在运算数据时,不是把一个进程算完,再进行下一个进程的运算,而是先运算进程 1,再运算进程 2,接下来运算进程 3,然后再运算进程 1,直到进程任务结束
你的眼睛欺骗了你,感觉进程是在并行!其实一个CPU就是一个大脑,没法同时干多件事(只能并发),但每个进程内部的线程就可以实现并行
表示进程优先级的有两个参数:Priority
和 Nice
,数值越小代表该进程越优先被 CPU 处理
PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级
PRI (最终值) = PRI (原始值) + NI
,说白了,改NI就行
需要注意:
- NI 范围是 -20~19
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程
优先级设置
nice
命令可以给要启动的进程赋予 NI 值,但是不能修改已运行进程的 NI 值
renice
命令可以在进程运行时修改其 NI 值
[root@localhost ~]# nice [-n NI值] 命令
[root@localhost ~]# nice -n -5 service httpd start
[root@localhost ~] # renice [优先级] PID
[root@localhost ~]# renice -10 2125
依赖进程的信号(Signal),我们可以关闭或者重启进程
# 使用命令"kill -l"或"man 7 signal"来查询系统中可以识别的信号
[root@localhost ~]#kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP......
信号代号 | 信号名称 | 说 明 |
---|---|---|
1 | SIGHUP | 该信号让进程立即关闭.然后重新读取配置文件之后重启 |
2 | SIGINT | 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键 |
8 | SIGFPE | 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误 |
9 | SIGKILL | 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程 |
14 | SIGALRM | 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号 |
15 | SIGTERM | 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9 |
18 | SIGCONT | 该信号可以让暂停的进程恢复执行。本信号不能被阻断 |
19 | SIGSTOP | 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断 |
最重要的就是 “1”、“9”、"15"这三个信号
OK,接下来就是怎么把这些信号传递给进程!(信号就像触发器,工作原理是什么呢???)
kill
这个命令或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号
后面只能跟进程号
[root@localhost ~]# kill 2248
#杀死PID是2248的httpd进程,默认信号是15,正常停止
[root@localhost ~]# kill -1 2246
# 让httpd的主进程重新启动
kill 命令只是“发送”一个信号,因此,只有当信号被程序成功“捕获”,系统才会执行 kill 命令指定的操作;反之,如果信号被“封锁”或者“忽略”,则 kill 命令将会失效
感觉有点像硬件电路上的知识了!
killall
通过程序的进程名来杀死一类进程,常与 ps、pstree 等命令配合使用
传递的信号类型同上,还有两个选项:
- -i:交互式,询问是否要杀死某个进程;
- -I:忽略进程名的大小写;
[root@localhost ~]# service httpd start
[root@localhost ~]# killall httpd
#杀死所有进程名是httpd的进程
[root@localhost ~]# ps aux | grep "httpd" | grep -v "grep"
#查询发现所有的httpd进程都消失了
# 交互式杀死sshd进程
[root@localhost ~]# killall -i sshd
pkill
pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程
还有个更重要的功能:按照终端号来踢出用户登录
不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会
[root@localhost ~]# w
#使用w命令查询本机已经登录的用户
20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyl - 19:47 18:52 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.09s 0.04s w
root pts/1 192.168.0.100 19:51 14:56 0.02s 0.02s -bash
#当前主机已经登录了三个root用户,一个是本地终端ttyl登录,另外两个是从192.168.0.100登陆的远程登录
[root@localhost ~]# pkill -9 -t pts/1
#强制杀死从pts/1虚拟终端登陆的进程
工作管理指的是在单个登录终端(也就是登录的 终端 界面)同时管理多个工作的行为
把命令放入后台,然后把命令恢复到前台,或者让命令恢复到后台执行,这些管理操作就是工作管理,有几点注意:
第一种:在命令后面加入 空格&
。使用这种方法放入后台的命令,在后台处于执行状态;即上来就放后台
每个后台命令会被分配一个工作号。命令既然可以执行,就会有进程产生,所以也会有进程号
[root@localhost ~]# find / -name install.log &
[1] 1920 # 工作号,进程号
# 如果在终端上出现如下信息,则证明后台命令已完成
[1]+ Done find / -name install.log
第二种:命令执行过裎中按 Ctrl+Z
快捷键,命令在后台处于暂停状态;即从前台挪到后台
也会给个工作号
[root@localhost ~]# tar -zcf etc.tar.gz /etc
#压缩一下/etc/目录
tar:从成员名中删除开头的"/"
tar:从硬链接目标中删除开头的"/"
^Z
#在执行过程中,按下Ctrl+Z快捷键
[2]+ Stopped tar-zcf etc.tar.gz/etc
#tar命令被放入后台,工作号是2,状态是暂停
总的来说,都会给个工作号,这是个特点
第三种:nohup
命令的作用就是让后台工作在离开操作终端时,也能够正确地在后台执行,也叫挂起
例如当我们以远程管理服务器的方式,使用的还是上面两种放后台的方式,在远程终端执行后台命令,如果在命令尚未执行完毕时就退出登陆,后台命令肯定会中断
# 写个脚本循环执行
[root@localhost ~]# vi for.sh
#!/bin/bash
for ((i=0;i<=100;i=i+1))
#循环1000次
do
echo 11 >> /root/for.log
#在for.log文件中写入11
sleep 10s
#每次循环睡眠10秒
done
[root@localhost ~]# chmod 755 for.sh
[root@localhost ~]# nohup /root/for.sh &
[1] 2478
# 接下来退出登录,重新登录之后,这个脚本仍然可以通过“ps aux”命令看到
&
还是要有的,表示放在后台,nohup
只是保证不受登录状态的影响
jobs
命令可以用来查看当前终端放入后台的工作
[root@localhost ~]#jobs [选项]
选项 | 含义 |
---|---|
-l(L 的小写) | 列出进程的 PID 号。 |
-n | 只列出上次发出通知后改变了状态的进程。 |
-p | 只列出进程的 PID 号。 |
-r | 只列出运行中的进程。 |
-s | 只列出已停止的进程 |
[root@localhost ~]#jobs -l
[1]- 2023 Stopped top
[2]+ 2034 Stopped tar -zcf etc.tar.gz /etc
"+“号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。”-"号代表倒数第二个放入后台的工作(有什么卵用?)
fg
命令用于把后台工作恢复到前台执行
[root@localhost ~]#fg %工作号
[root@localhost ~]# fg %1
#恢复1号工作
若将
% 工作号
全部省略,则此命令会将带有 + 号的工作恢复到前台
bg
命令可以让不需要和前台交互的命令在后台执行
前面使用
ctrl+z
把任务放在后台,但是处于暂停状态
[root@localhost ~]# bg %1 <--- 等同于 bg 1
[root@localhost ~]# bg %2 <--- 等同于 bg 2
#把两个命令恢复到后台执行
[root@localhost @]# jobs
[1]+ Stopped top
[2]- Running tar -zcf etc.tar.gz /etc &
# tar命令的状态变为了Running,但是top命令需要和前台交互
是针对后台任务的,即必须先放到后台! 相当于
&
指令的分解
定时执行任务,需要使用at
命令,得提前安装好 at 软件包,并开启 atd
服务
# 查看是否已安装
[root@localhost ~]# rpm -q at
# 安装
[root@localhost ~]# yum -y install at
# atd 服务是独立的服务,启动的命令如下
[root@localhost ~]# service atd start
# 开机自启动atd
[root@localhost ~]# chkconfig atd on
独立服务的自启动也可以修改 /etc/rc.local 配置文件
at
命令的访问控制
访问控制指的是允许哪些用户使用 at 命令设定定时任务,或者不允许哪些用户使用 at 命令
可以将其想象成设定黑名单或白名单at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,可以参考
[root@localhost ~] # at [选项] [时间]
选项 | 含义 |
---|---|
-m | 当 at 工作完成后,无论命令是否输出,都用 E-mail 通知执行 at 命令的用户。 |
-c 工作标识号 | 显示该 at 工作的实际内容。标识一般是任务序号 |
-t 时间 | 在指定时间提交工作并执行,时间格式为 [[CC]YY]MMDDhhmm。 |
-d | 删除某个工作,需要提供相应的工作标识号(ID),同 atrm 命令的作用相同。 |
-l | 列出当前所有等待运行的工作,和 atq 命令具有相同的额作用。 |
-f 脚本文件 | 指定所要提交的脚本文件 |
格式 | 用法 |
---|---|
HH:MM | 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。 |
Midnight(midnight) | 代表 12:00 AM(也就是 00:00)。 |
Noon(noon) | 代表 12:00 PM(相当于 12:00)。 |
Teatime(teatime) | 代表 4:00 PM(相当于 16:00)。 |
英文月名 日期 年份 | 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。 |
MMDDYY、MM/DD/YY、MM.DD.YY | 比如 011518 表示 2018 年 1 月 15 号。 |
now+时间 | 以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行 |
命令可以是普通终端命令,也可以是执行 Shell 脚本
[coot@localhost ~]# cat /root/hello.sh #!/bin/bash echo "hello world!!" # 该脚本会打印"hello world!!" [root@localhost ~]# at now +2 minutes at> /root/hello.sh >> /root/hello.log # 执行hello.sh脚本,并把输出写入/root/hello.log文件 at> <EOT> # 使用Ctrl+D快捷键保存at任务 job 8 at 2013-07-25 20:54 # 这是一段提示信息,表示第八个at任务 # 查看当前等待运行的工作 [root@localhost ~]# atq # 查询第8个at任务的内容 [root@localhost ~]# at -c 8 ...省略部分内容... # 主要定义系统的环境变量 /root/hello.sh >> /root/hello.log # 可以看到at执行的任务 # 删除指定的工作 [root@localhost ~]# atrm 8
最好使用绝对路径来写命令,这样不容易报错。at 任务一旦使用
Ctrl+D
快捷键保存,实际上写入了/var/spool/at/
这个目录,这个目录内的文件可以直接被 atd 服务调用和执行
crontab
循环定时任务(常用!)
系统的定时任务一般是需要重复执行的。而 at 命令显然无法满足需求,这是就需要使用 crontab 命令来执行循环定时任务
crontab 命令需要
crond
服务支持,crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程在安装完成操作系统后,默认会安装 crond 服务工具;这么说atd服务也是系统带的?
[root@localhost ~]# service crond restart
[root@localhost ~]# chkconfig crond on
[root@localhost ~]# crontab [选项] [file]
选项 | 功能 |
---|---|
-u user | 用来设定某个用户的 crontab 服务,例如 “-u demo” 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 |
-e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。 |
-l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。 |
-r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。 |
-i | 在删除用户的 crontab 文件时,给确认提示 |
# 使用很简单
[root@localhost !]# crontab -e
# 进入 crontab 编辑界面。会打开Vim编辑你的任务
# 包括指定时间和编辑任务脚本或者Shell命令
时间的指定有详细的规则,可以参考
anacron
会重新执行定时任务
这个命令会以 1 天、1周(7天)、一个月作为检测周期,判断是否有定时任务在关机之后没有执行。如果有这样的任务,那么 anacron 会在特定的时间重新执行这些定时任务
anacron 会分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,将两者进行比较
不像crond,现在anacron 不再是单独的服务,而变成了系统命令
在当前的 Linux 中,其实不需要执行任何 anacron 命令,只需要配置好
/etc/anacrontab
文件,文件内容如下:
[root@localhost ~]# vi /etc/anacrontab # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root #前面的内容和/etc/crontab类似 #the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 #最大随机廷迟 #the jobs will be started during the following hours only START_H0URS_RANGE=3-22 #fanacron的执行时间范围是3:00~22:00 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily #每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行 7 25 cron.weekly nice run-parts /etc/cron.weekly #每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,就会执行 ©monthly 45 cron.monthly nice run-parts /etc/cron.monthly #每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没有被执行,那就执行
详细的配置技巧可以参考其他资料
vmstat
命令
ps
可以查看进程,jobs
可以查看任务
vmstat
可动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息
详细参数参考
[root@localhost proc]# vmstat 1 3
# 使用vmstat检测,每隔1秒刷新一次,共刷新3次
procs ——memory—— swap —io system ——cpu——
r b swpd free buff cache si so bi bo in cs us sy id wa st
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 407376 55772 84644 0 0 5 2 9 10 0 0 100 0 0
0 0 0 407368 55772 84644 0 0 0 0 12 10 0 0 100 0 0
0 0 0 407368 55772 84644 0 0 0 0 15 13 0 0 100 0 0
如果是非正常进程占用了系统资源,则需要判断这些进程是如何产生的,不能一杀了之;如果是正常进程占用了系统资源,则说明服务器需要升级了
dmesg
在系统启动过程中,内核还会进行一次系统检测(第一次是 BIOS 进行加测),但是检测的过程不是没有显示在屏幕上,就是会快速的在屏幕上一闪而过那么,如果开机时来不及查看相关信息,我们是否可以在开机后查看呢?
只要是内核产生的信息,都会被存储在系统缓冲区中,如果开机时来不及查看相关信息,可以使用
dmesg
命令将信息调出开机信息也可以通过
/var/log/
目录中的 dmesg 文件进行查看
# 查看CPU的信息
[root@localhost ~]# dmesg | grep CPU
free
用来显示系统内存状态,包括系统物理内存、虚拟内存(swap 交换分区)、共享内存和系统缓存的使用情况
其输出和 top 命令的内存部分非常相似
[root@localhost ~]# free [选项]
选项 | 含义 |
---|---|
-b | 以 Byte(字节)为单位,显示内存使用情况。 |
-k | 以 KB 为单位,显示内存使用情况,此选项是 free 命令的默认选项。 |
-m | 以 MB 为单位,显示内存使用情况。 |
-g | 以 GB 为单位,显示内存使用情况。 |
-t | 在输出的最终结果中,输出内存和 swap 分区的总量。 |
-o | 不显示系统缓冲区这一列。 |
-s 间隔秒数 | 根据指定的间隔时间,持续显示内存使用情况。 |
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 725 666 59 0 132 287
-/+ buffers/cache: 245 479
Swap: 996 0 996
- total 是总内存数;
- used 是已经使用的内存数;
- free 是空闲的内存数;
- shared 是多个进程共享的内存总数;
- buffers 是缓冲内存数;
- cached 是缓存内存数
w
&who
使用 w 或 who 命令都可以查看服务器上目前已登录的用户信息,两者的区别在于,w 命令除了能知道目前已登陆的用户信息,还可以知道每个用户执行任务的情况
一般直接使用即可!详情参考
last
&lastlog
如果原先登录的用户现在已经退出登录,需要使用 last 和 lastlog 命令查看用户登录信息
last 命令可以查看当前和过去登陆系统用户的相关信息
lastlog 命令可以查看到每个系统用户最近一次登陆系统的时间
在执行 last 命令时,它默认会读取
/var/log/wtmp
日志文件,这是一个二进制文件;lastlog 命令默认是去读取 /var/log/lastlog 日志文件的,这个文件同样是二进制文件每个命令都有很多选项啦,可以
man last
,可以参考
精力有限,这里只介绍一下如何查看CPU运行状态,其他可参考
前面介绍了vmstat
命令,还有几个可以分析查看CPU性能的命令
sar
该命令可以全面的获取CPU、运行队列、磁盘IO、内存等性能参数,详情参考
# 查看系统 CPU 的整理负载状况,每 3 秒统计一次,统计 5 次
[root@localhost ~]# sar -u 35
iostat
主要用于统计磁盘 I/O 状态,但也能用来查看 CPU 的使用情况
[root@localhost ~]# iostat -c
uptime
监控系统性能最常用的一个命令,主要用来统计系统当前的运行状况
[root@localhost ~]# uptime
05:38:26 up 1:47, 2 users, load average: 0.12, 0.08, 0.08
注意:
load average
这 3 个输出值一般不能大于系统 CPU 的个数。例如,本测试系统有 8 个 CPU,如果 load average 中这 3 个值长期大于 8,就说明 CPU 很繁忙,负载很高,系统性能可能会受到影响
其他详情请参考
日志是系统信息最详细、最准确的记录者,如果能够善用日志,那么当系统出现问题时,我们就能在第一时间发现问题,也能够从日志中找到解决问题的方法
现在的Linux日志服务由rsyslogd
提供
# 查看服务是否启动
[root@localhost ~]# ps aux | grep "rsyslog" | grep -v "grep"
[root@localhost ~]# chkconfig --list | grep rsyslog
rsyslog 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
#rsyslog服务在2、3、4、5运行级别上是开机自启动的
系统中的绝大多数日志文件是由 rsyslogd 服务来统一管理的,只要各个进程将信息给予这个服务
有一部分日志不是由 rsyslogd 服务来管理的,比如 apache 服务,自己搞!
/var/log/
目录就是系统日志文件的保存位置,下表是重要的日志文件
日志文件 | 说 明 |
---|---|
/var/log/cron | 记录与系统定时任务相关的曰志 |
/var/log/cups/ | 记录打印信息的曰志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信总。也可以使用dmesg命令直接查看内核自检信息 |
/var/log/btmp | 记录错误登陆的日志。这个文件是二进制文件,不能直接用Vi查看,而要使用lastb命令查看。命令如下: [root@localhost log]#lastb root tty1 Tue Jun 4 22:38 - 22:38 (00:00) #有人在6月4 日 22:38便用root用户在本地终端 1 登陆错误 |
/var/log/lastlog | 记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog命令查看 |
/var/Iog/mailog | 记录邮件信息的曰志 |
/var/log/messages | 它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O 错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为 root,已经用户自定义安装软件的日志,也会在这里列出。 |
/var/log/secure | 记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
/var/log/wtmp | 永久记录所有用户的登陆、注销信息,同时记录系统的后动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看 |
/var/tun/ulmp | 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users等命令查看 |
采用 RPM 包方式安装的系统服务也会默认把日志记录在 /var/log/ 目录中(源码包安装的服务日志存放在源码包指定的目录中),不过这些日志不是由 rsyslogd 服务来记录和管理的,而是各个服务使用自己的日志管理文档来记录自身的日志(借坑下蛋)
了解一下rsyslogd日志文件的格式
日志文件的格式包含以下 4 列:
- 事件产生的时间。
- 产生事件的服务器的主机名。
- 产生事件的服务名或程序名。
- 事件的具体信息。
[root@localhost ~]# vi /var/log/secure
Jun 5 03:20:46 localhost sshd[1630]:Accepted password for root from 192.168.0.104 port 4229 ssh2
# 6月5日 03:20:46 本地主机 sshd服务产生消息:接收从192.168.0.104主机的4229端口发起的ssh连接的密码
Jun 5 03:20:46 localhost sshd[1630]:pam_unix(sshd:session):session opened for user root by (uid=0)
#时间 本地主机 sshd服务中pam_unix模块产生消息:打开用户root的会话(UID为0)
Jun 5 03:25:04 localhost useradd[1661]:new group:name=bb, GID=501
#时间 本地主机 useradd命令产生消息:新建立bb组,GID为501
实际上,只要感觉到服务器不是很正常就应该查看日志,甚至在服务器没有什么问题时也要养成定时查看系统日志的习惯
其他的命令和日志服务工具可以参考
BIOS自检 -> 启动 GRUB -> 加载内核 -> 执行第一个进程 -> 配置系统初始环境
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。