2020年8月22日,开始学习liunx系统的一天,liunx系统的内容有很多,大致可以分为五个阶段:
第一个阶段:熟练使用 Linux 命令行
第二个阶段:通过系统调用或者 glibc,学会自己进行程序设计
第三个阶段:了解 Linux 内核机制
第四个阶段:阅读 Linux 内核代码,聚焦核心逻辑和场景
第五个阶段:实验定制化 Linux 组件
目录
- 第一个阶段:熟练使用 Linux 命令行
- 第二个阶段:通过系统调用或者 glibc,学会自己进行程序设计
- 第三个阶段:了解 Linux 内核机制
- 第四个阶段:阅读 Linux 内核代码,聚焦核心逻辑和场景
- 第五个阶段:实验定制化 Linux 组件
第一个阶段:熟练使用 Linux 命令行
学习 Linux 的第一步,要先从 Windows 的思维习惯,切换成 Linux 的“命令行 + 文件”使用模式。
在 Linux 中,无论我们做什么事情,都会有相应的命令工具。因为命令数量众多,所以想要用好liunx,学会liunx的命令使用必不可少,也是绕不过的坎,在这里我使用《liunx就该这么学》 来学习liunx系统,在我跟进的课程中推荐阅读《鸟哥的 Linux 私房菜》和《Linux 系统管理技术手册》,但我认为这些书都比较厚,简直就是”入门都放弃"的最佳书籍了。 所以我最终选择了《liunx就该这么学》,它有免费的电子书籍与配套的视频讲解(链接https://www.linuxprobe.com/chapter00.html)。
网络命令
ifconfig: 查看网络
1.设置IP地址:
ifconfig 网卡名称 ip地址 network 子网掩码
2.禁用网卡
1.ifconfig 网卡名称 down //禁用网卡
2.ifconfig 网卡名称 up //启用网卡
3.ifdown 网卡名称
4.ifup 网卡名称
3.route设置默认网关
route add default gw IP地址 //设置默认网关
route del default gw IP地址 //删除默认网关
route: 查看本机路由表
4.设置网卡配置文件
/etc/sysconfig/network-scripts :网卡配置文件所在目录
第一章 必须掌握的liunx命令
1.1 liunx内核与shell的关系
liunx系统的内核负责完成对硬件资源的分配、调度等管理任务。内核对于liunx系统是十分重要的,一般不建议取用户取直接修改内核参数,而是让用户通过基于系统调用接口开发出来的服务或程序来管理计算机。
shell是一个命令行工具,shell(也称终端或壳)充当的是人与内核之间的桥梁,用户将一些命令行”告诉“shell, shell会通过系统接口调用相应的程序与服务取完成这些命令。主流的liunx系统使用Bash解释器作为命令行终端,主要有一下4个优势:
1.通过上下方向键查看之前的命令
2.可以用TAB键补全命令
3.具有强大的批处理脚本
4.具有实用的环境变量功能
1.2 执行查看帮助命令
常见的linux命令格式:
命令名称 [命令参数][命令对象]
命令名称、命令参数、命令对象之间要用空格隔开
命令对象一般是指要处理的文件、目录、用户等资源,而命令参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分别用–与-作为前缀。
例如: man --help man -help
man命令中常用按键以及用途
man命令用于查看命令的详细文档
按键 | 用处 |
---|---|
空格键 | 向下翻一页 |
PaGe down | 向下翻一页 |
PaGe up | 向上翻一页 |
home | 直接前往首页 |
end | 直接前往尾页 |
/ | 从上至下搜索某个关键词,如“/linux” |
? | 从下至上搜索某个关键词,如“?linux” |
n | 定位到下一个搜索到的关键词 |
N | 定位到上一个搜索到的关键词 |
q | 退出帮助文档 |
1.3 常用的系统工作命令
1.echo命令
echo命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。
输出字符串到屏幕终端:
提取变量SHELL的值,并将其输出到屏幕上:
2.date命令
date命令用于显示及设置系统的时间或日期,格式为“date [选项] [+指定的格式]”。
参数 | 作用 |
---|---|
%t | 跳格[Tab键] |
%H | 小时(00~23) |
%I | 小时(00~12) |
%M | 分钟(00~59) |
%S | 秒(00~59) |
%j | 今年中的第几天 |
date -s 修改系统时间
3.reboot
reboot命令用于重启系统,其格式为reboot。
4.poweroff命令
poweroff命令用于关闭系统,其格式为poweroff。
5.wget命令
wget命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”。
如果某些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个&符号,这样命令将进入系统后台执行
参数 | 作用 |
---|---|
-b | 后台下载模式 |
-P | 下载到指定目录 |
-t | 最大尝试次数 |
-c | 断点续传 |
-p | 下载页面内所有资源,包括图片、视频等 |
-r | 递归下载 |
6.ps命令
ps命令用于查看系统中的进程状态,格式为“ps [参数]”。
参数 | 作用 |
---|---|
-a | 显示所有进程(包括其他用户的进程) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
linux 运行这许多程序,它们有五种状态运行、中断、僵死、停止、不可中断;
R(运行):进程正在运行或在运行队列中等待。
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。
Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
T(停止):进程收到停止信号后停止运行。
7. top命令
top命令用于动态地监视进程活动与系统负载等信息,其格式为top。
8.pidof命令
pidof命令用于查询某个指定服务进程的PID值,格式为“pidof [参数] [服务名称]”。
9.kill命令
kill命令用于终止某个指定PID的服务进程,格式为“kill [参数] [进程PID]”。
kill 2156 : 强制终止PID为2156的服务进程
10.killall命令
killall命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [参数] [服务名称]”。
通常来讲,复杂软件的服务程序会有多个进程协同为用户提供服务,如果逐个去结束这些进程会比较麻烦,此时可以使用killall命令来批量结束某个服务程序带有的全部进程。
如果某些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个&符号,这样命令将进入系统后台执行
2.4 系统状态检测命令
该小节介绍网卡网络、系统内核、系统负载、内存使用情况、当前启用终端数量、历史登录记录、命令执行记录以及救援诊断等相关命令的使用方法。
1.ifconfig 命令
ifconfig命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]”。
使用ifconfig命令来查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就是网卡名称、inet参数后面的IP地址、ether参数后面的网卡物理地址(又称为MAC地址),以及RX、TX的接收数据包与发送数据包的个数及累计流量:
2.uname命令
uname命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。
在使用uname命令时,一般会固定搭配上-a参数来完整地查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。
3.uptime命令
uptime用于查看系统的负载信息,格式为uptime。
uptime命令真的很棒,它可以显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。
平均负载: 指在最近的 1分钟、5分钟、 15分钟的压力情况, 值越小越好,在日常使用不要长期超过1.
4.free命令
free用于显示当前系统中内存的使用量信息,格式为“free [-h]”。
5.who命令
who用于查看当前登入主机的用户终端信息,格式为“who [参数]”。
6.last命令
last命令用于查看所有系统的登录记录,格式为“last [参数]”。
last命令查看的日志, 而日志容易被篡改,所以不要单纯地以该命令的输出判断系统是否被入侵了。
7.history命令
history命令用于显示历史执行过的命令,格式为“history [-c]”。
可以使用![数字] 来使用之前的命令
history -c 清空历史记录
history命令会展现1000条历史记录,可以进/etc/profile文件修改HISTISIZE变量值改变记录条数。
命令记录存储在当前用户目录下的.bash_history文件中, 可以用 cat ~.bash_history 查看。
8.sosreport命令
sosreport命令用于收集系统配置及架构信息并输出诊断文档,格式为sosreport。
2.5 工作目录切换命令
工作目录指的是用户当前在系统中所处的位置。
1.pwd命令
pwd命令用于显示用户当前所处的工作目录,格式为“pwd [选项]”。
2.cd命令
cd - :返回上一次的目录
3.ls命令
ls命令用于显示目录中的文件信息,格式为“ls [选项] [文件] ”。
2.6 文本文件编辑命令
Linux系统中“一切都是文件”,而对服务程序进行配置自然也就是编辑程序的配置文件。
1.cat命令
cat命令用于查看纯文本文件(内容较少的),格式为“cat [选项] [文件]”
cat一般用于较小文件的查看
cat -n: 查看是显示行数
2.more命令
more命令用于查看纯文本文件(内容较多的),格式为“more [选项]文件”。
3.head命令
head命令用于查看纯文本文档的前N行,格式为“head [选项] [文件]”。
head -n 20 [文件] : 查看文件的前二十行的内容
4.tail命令
tail命令用于查看纯文本文档的后N行或持续刷新内容,格式为“tail [选项] [文件]”。
tail -n 20 文件名:查看文件的后二十行的内容
tail -f 文件名: 持续刷新这个文件的内容
5.tr命令
tr命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”。
cat anaconda-ks.cfg | tr [a-z] [A-Z]:将文件中所有小写字母变为大写字母
6.wc命令
wc命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。
参数 | 作用 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
查询有多少个用户:
7.stat命令
stat命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。
Access:访问时间
Modify:修改时间
Change:属性改变时间
8.cut命令
cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。
cut -d: -f1 /etc/passwd: 提取出用户名;
”-d: “ 设定分隔符为 “:”;
“-f1” 设定为第一列的内容
9.diff命令
diff命令用于比较多个文本文件的差异,格式为“diff [参数] 文件”。
diff --brief命令显示比较后的结果,判断文件是否相同。
带有-c参数的diff命令来描述文件内容具体的不同。
2.7 文件目录管理命令
1.touch命令
touch命令用于创建空白文件或设置文件的时间,格式为“touch [选项] [文件]”。
touch 文件名: 创建一个空的文件
参数 | 作用 |
---|---|
-a | 仅修改“读取时间”(atime) |
-m | 仅修改“修改时间”(mtime) |
-d | 同时修改atime与mtime |
2.mkdir命令
mkdir命令用于创建空白的目录,格式为“mkdir [选项] 目录”。
mkdir 目录名 : 创建一个空目录
mkdir -p 路径: 递归创建目录
3.cp命令
cp命令用于复制文件或目录,格式为“cp [选项] 源文件 目标文件”。
在linux中复制操作分为3中情况:
如果目标文件是目录,则会把源文件复制到目录中
如果目标文件是普通文件,则会询问是否要覆盖它
如果目标文件不存在,则执行正常的复制操作
参数 | 作用 |
---|---|
-p | 保留原始文件的属性 |
-d | 若对象为“链接文件”,则保留该“链接文件”的属性 |
-r | 递归持续复制(用于目录) |
-i | 若目标文件存在则询问是否覆盖 |
-a | 相当于-pdr(p、d、r为上述参数) |
5.rm命令
rm命令用于删除文件或目录,格式为“rm [选项] 文件”。
-f强制删除,不询问
-r删除目录
6.dd命令
dd命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式为“dd [参数]”。
参数 | 作用 |
---|---|
if | 输入的文件名称 |
of | 输出的文件名称 |
bs | 设置每个“块”的大小 |
count | 设置要复制“块”的个数 |
bs 与 count 的关系为: 总大小 = bs * count;
7.file命令
file命令用于查看文件的类型,格式为“file 文件名”。
2.8 打包压缩与搜索命令
1.tar命令
tar命令用于对文件进行打包压缩或解压,格式为“tar [选项] [文件]”。
tar -czvf [压缩包名称.tar.gz] [要打包的目录] : 压缩文件放在当前目录下
tar -xzvf [压缩包名称.tar.gz] : 解压文件到当前目录下
2.grep命令
grep命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为“grep [选项] [文件]”。
使用正则表达式搜索;
-n 显示搜索到信息的行号;
-v 参数用于反选信息(即没有包含关键词的所有信息行;
3.find命令
find命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”。
寻找条件有:文件名、大小、修改时间、权限等信息。
参数 | 作用 |
---|---|
-name | 匹配名称 |
-perm | 匹配权限(mode为完全匹配,-mode为包含即可) |
-user | 匹配所有者 |
-group | 匹配所有组 |
-mtime -n +n | 匹配修改内容的时间(-n指n天以内,+n指n天以前) |
-atime -n +n | 匹配访问文件的时间(-n指n天以内,+n指n天以前) |
-ctime -n +n | 匹配修改文件权限的时间(-n指n天以内,+n指n天以前) |
-nouser | 匹配无所有者的文件 |
-nogroup | 匹配无所有组的文件 |
-newer f1 !f2 | 匹配比文件f1新但比f2旧的文件 |
–type b/d/c/p/l/f | 匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件) |
-size | 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) |
-prune | 忽略某个目录 |
-exec …… {}; | 后面可跟用于进一步处理搜索结果的命令(下文会有演示) |
第二章 管道符、重定向与环境变量
文件读写操作有关的重定向技术的5种模
1.标准覆盖输出重定向,
2.标准追加输出重定向,
3.错误覆盖输出重定向,
4.错误追加输出重定向以及输入重定向,
2.1 输入输出重定向
输入重定向 : 指把文件导入到命令中
输出重定向: 指把原本要输出到屏幕的数据信息写入到指定文件中
输出重定向又可分为: 标准输出重定向和错误输出重定向
标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
输入重定向:
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
输出重定向:
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1或命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
“>” 当用标准输出时,如果命令出现了错误信息那么会打印到屏幕上; 使用 “2>"也是一样的
2.2 管道命令符
管道命令符的作用也可以用一句话来概括“把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入”。
2.3 命令行通配符
通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。
2.4 常用的转义字符
4个最常用的转义字符如下所示:
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
单引号(’’):转义其中所有的变量为单纯的字符串。
双引号(""):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。
2.5 重要的环境变量
alias命令: 设置命令的别名;
unalias命令: 取消别名
前文中曾经讲到,在Linux系统中一切都是文件,Linux命令也不例外。那么,在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?简单来说,命令在Linux中的执行分为4个步骤:
第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。
第2步:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用alias命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”。若要取消一个命令别名,则是用unalias命令,格式为“unalias 别名”。我们之前在使用rm命令删除文件时,Linux系统都会要求我们再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令,接下来我们把它取消掉:
第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令。
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
可以使用env命令来查看到Linux系统中所有的环境变量;
比较重要的10个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。不同用户的环境变量不共用
第三章 Vim编辑器与Shell命令脚本
“在Linux系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数”
3.1 Vim编辑器
Vim中常用的命令
命令 | 作用 |
---|---|
dd | 删除(剪切)光标所在整行 |
yy | 复制光标所在整行 |
n | 显示搜索命令定位到的下一个字符串 |
N | 显示搜索命令定位到的上一个字符串 |
u | 撤销上一步的操作 |
p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 |
末行模式中可用的命令
命令 | 作用 |
---|---|
:w | 保存 |
:wq! | 强制保存退出 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:命令 | 执行该命令 |
:整数 | 跳转到该行 |
: s/one/two | 将当前光标所在行的第一个one替换成two |
: s/one/two/g | 将当前光标所在行的所有one替换成two |
:%s/one/two/g | 将全文中的所有one替换成two |
?字符串 | 在文本中从下至上搜索该字符串 |
/字符串 | 在文本中从上至下搜索该字符串 |
3.1.1 编写简单文档
使用a、i、o三个键从命令模式切换到输入模式。
a键与i键分别是在光标后面一位和光标当前位置切换到输入模式,而o键则是在光标的下面再创建一个空行.
用文档编辑器完成几个任务:
3.1.2 配置主机名称
为了便于在局域网中查找某台特定的主机,或者对主机进行区分,除了要有IP地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问。
hostname :查看主机名称
/etc/hostname: 主机名放在这个文件下, 修改这个文件的内容就可以修改主机名。
3.1.3 配置网卡信息
/etc/sysconfig/network-scripts : 该目录下有网卡的配置文件, 配置文件名为网卡名称;
3.1.4 配置Yum仓库
/etc/yum.repos.d/: 改目录存放yum软件仓库的配置文件
3.2 编写Shell脚本
Shell脚本命令的工作方式有两种:交互式和批处理。
交互式(Interactive):用户每输入一条命令就立即执行。
交互式(Interactive):用户每输入一条命令就立即执行。
3.2.1 编写简单的脚本
脚本第一行需要声明使用那个解释器, “#! /bin/bash ” 形如这样的指令
#: 注释代码
3.2.2 接收用户的参数
例如$0
对应的是当前Shell脚本程序的名称,$#
对应的是总共有几个参数,$*
对应的是所有位置的参数值,$?
对应的是显示上一次命令的执行返回值,而$1
、$2
、$3
……则分别对应着第N个位置的参数值
3.2.3 判断用户的参数
条件测试语句(选择语句): 格式 : [ 条件表达式 ](两边都有一个空格)
条件成立则返回数字0,否则便返回其他随机数值。
条件测试语句可以分为4种:
文件测试语句; 逻辑测试语句; 整数值比较语句; 字符串比较语句。
文件测试所用的参数
操作符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
-d :如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在;
-f :如果返回值为0,则代表文件存在,且为一般文件;
在Shell终端中逻辑“与”的运算符号是&&,表示当前面的命令执行成功后才会执行它后面的命令;
逻辑“或”它在Linux系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令;
逻辑语句是“非”,在Linux系统中的运算符号是一个叹号!,它表示把条件测试中的判断结果取相反值;
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作。
可用的整数比较运算符
操作符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
常见的字符串比较运算符
操作符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
-z : 通过判断String变量是否为空值,进而判断是否定义了这个变量;
3.3 流程控制语句
3.3.1 if条件测试语句
单分支选择语句
if [] //条件测试操作
then //语句执行
fi //结束
if []
then
else
fi
多分支选择语句
if []
then
elif
then
else
if
ping 命令:-c参数来规定尝试的次数,-i参数定义每个数据包的发送间隔,以及使用-W参数定义等待超时时间。
3.3.2 for条件循环语句
for 'name' in 'list'
do
//操作
done
3.3.3 while条件循环语句
while 条件测试操作
do
//操作
done
3.3.4 case条件测试语句
case ' ' in
,,
,,
*)
esac
3.4 计划任务服务程序
Linux可以在无需人为介入的情况下,在指定的时间段自动启用或停止某些服务或命令,从而实现运维的自动化。
计划任务分为一次性计划任务与长期性计划任务;
一次性计划任务只执行一次,一般用于满足临时的工作需求。
at命令:
at -l:查看已设置好但还未执行的一次性计划任务
atrm 任务序号:删除设置好但还未执行的一次性计划任务
长期性计划任务:希望Linux系统能够周期性地、有规律地执行某些具体的任务;
crond命令
crontab -e:创建、编辑计划任务
crontab -l:查看当前计划任务
crontab -r:删除某条计划任务
另外,如果您是以管理员的身份登录的系统,还可以在crontab命令中加上-u参数来编辑他人的计划任务。
crond服务设置任务的参数格式:“分、时、日、月、星期 命令”
字段 | 说明 |
---|---|
分钟 | 取值为0~59的整数 |
小时 | 取值为0~23的任意整数 |
日期 | 取值为1~31的任意整数 |
月份 | 取值为1~12的任意整数 |
星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
用逗号(,)来分别表示多个时间段,例如“8,9,12”表示8月、9月和12月。
用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15日)。
用除号(/)表示执行任务的间隔时间(例如“/2”表示每隔2分钟执行一次任务)。
尤其需要注意的是,在crond服务的计划任务参数中,所有命令一定要用绝对路径的方式来写。
**计划任务中的“分”字段必须有数值,绝对不能为空或是号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。**
第四章 用户身份与文件权限。
4.1 用户身份与能力
root管理员权限:添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备。
用户的身份号码即UID(User IDentification)的数值为0的用户为管理员用户
管理员UID为0:系统的管理员用户。
系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
另外,在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
1. useradd命令
useradd命令用于创建新的用户,格式为“useradd [选项] 用户名”。
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
可以使用useradd命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。
2. groupadd命令
groupadd命令用于创建用户组,格式为“groupadd [选项] 群组名”。
3. usermod命令
usermod命令用于修改用户的属性,格式为“usermod [选项] 用户名”。
Linux系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,诸如用户的UID、基本/扩展用户组、默认终端等。
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
4. passwd命令
passwd命令用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]”。
普通用户只能使用passwd命令修改自身的系统密码,而root管理员则有权限修改其他所有人的密码(且不需要验证密码)。
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
–stdin | 允许通过标准输入修改用户密码,如echo “NewPassWord” |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
5. userdel命令
userdel命令用于删除用户,格式为“userdel [选项] 用户名”。
可以通过userdel命令删除用户的所有信息。
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
4.2 文件权限与归属
文件的属性:
-:普通文件。
d:目录文件。
l:链接文件。
b:块设备文件。
c:字符设备文件。
p:管道文件。
普通文件的权限:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。
用数字表示文件权限:
4.3 文件的特殊权限
每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。
1. SUID
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
被赋予SUID权限的文件可以临时需要权限。
查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
2. SGID
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
chmod命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。
chown可以设置文件或目录的所有者和所属组,其格式为“chown [参数] 所有者:所属组 文件或目录名称”
当chmod命令 与 chown 命令时修改目录时: 需要加参数 ‘-R’;
3. SBIT
保护位: 被设定了这个权限的目录,可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
对其他目录来设置SBIT特殊权限位,用chmod命令就可以了。对应的参数o+t代表设置SBIT保护位权限。
4.4 文件的隐藏属性
隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
1. chattr命令
chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”,执行该命令需要管理员权限。
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
2. lsattr命令
lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。
4.5 文件访问控制列表
希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)。
如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
1. setfacl命令
setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。
使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的修改。
针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数。如果想要删除某个文件的ACL,则可以使用-b参数。
常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。
2.getfacl命令
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。
4.6 su命令与sudo服务
1.su命令
su命令: 切换用户,su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
2.sudo命令
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”。
sudo服务中的可用参数以及作用
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u | 用户名或UID值 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
总结来说,sudo命令具有如下功能:
限制用户执行指定的命令:
记录用户执行的每一条命令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
使用visudo命令配置sudo命令的配置文件时,其操作方法与Vim编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出。在sudo命令的配置文件中,按照下面的格式将第99行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
第五章 存储结构与磁盘划分。
加入一个硬盘到可以使用硬盘
1.加入物理硬盘 /dev, 设备文件存放在这个目录下
2.管理磁盘分区, 创建磁盘分区 fdisk(交互式命令) “fdisk [磁盘名称]”,例如:给硬盘分区 fdisk /dev/sdb
3.分区格式化 mkfs.xfs /dev/sdb1
4.挂载分区 mount /dev/sdb1 /new
5.1 一切从“/”开始
在Linux系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件,一切皆是文件。
Linux目录结构:
Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件,以及定义了常见目录的用途。Linux文件名区分大小写
FHS标准:
Linux系统中常见的目录名称以及相应内容
目录名称 | 应放置文件的内容 |
---|---|
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户主目录 |
/bin | 存放单用户模式下还可以操作的命令 |
/lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
5.2 物理设备的命名规则
在Linux系统中一切都是文件,硬件设备也不例外。
硬件设备的名称又udev设备管理器规范,udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;
Linux系统中常见的硬件设备的文件名称如表:
常见的硬件设备及其文件名称
硬件设备 | 文件名称 |
---|---|
IDE设备 | /dev/hd[a-d] |
SCSI/SATA/U盘 | /dev/sd[a-p] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
目前IDE设备很少使用了, 一般的硬盘设备都是以“/dev/sd” 开头的。 而一太主机有多块硬盘,系统采用a~p来代表16块不同的硬盘(默认从a开始分配)。
“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件”。
5.3 文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。
Linux系统支持数十种的文件系统,常见的文件系统:
Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
硬盘在使用之前一定要格式化,
5.4 挂载硬件设备
Linux系统中添加硬件设备,在拿到一块全新的硬盘存储设备后要先分区,然后格式化,最后还需要挂载才可以正常使用。
mount命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。
mount命令中的参数以及作用
参数 | 作用 |
---|---|
-a | 挂载所有在/etc/fstab中定义的文件系统 |
-t | 指定文件系统的类型 |
按照上面的方法执行mount命令后就能立即使用文件系统了,系统在重启后挂载就会失效,如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”(各字段的意义见表6-4)写入到/etc/fstab文件中。
用于挂载信息的指定填写格式中,各字段所表示的意义:
字段 | 意义 |
---|---|
设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
umount命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。
5.5 添加硬盘设备
5.5.1 fdisk命令
disk命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”;这是一个交互式命令
参数 | 作用 |
---|---|
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区表信息 |
w | 保存并退出 |
q | 不保存直接退出 |
5.5.2 mkfs命令
mkfs命令 : 格式化分区 ,mkks 设备文件名
因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果
[root@linuxprobe ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。
5.5.3 df -h命令
df -h命令:查看挂载状态和硬盘使用量信息。
5.5.4 du命令
du命令:查看文件大小,其格式为“du [选项] [文件]”
使用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小。
5.6 添加交换分区
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。
5.6.1mkswap命令
mkswap:SWAP分区专用的格式化命令
5.6.2 swapon命令
swapon命令把准备好的SWAP分区设备正式挂载到系统中。
为了能够让新的交换分区设备在重启后依然生效,可以将相关信息写入到配置文件/etc/fstab中,
5.7 磁盘容量配额
这小节没看懂,下面网址有这节内容
https://www.linuxprobe.com/chapter-06.html
5.8 软硬方式链接
硬链接(hard link):(暂时理解为别名)可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
**软链接(也称为符号链接[symbolic link]):**仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。
ln命令
ln命令用于创建链接文件,格式为“ln [选项] 目标”,
参数 | 作用 |
---|---|
-s | 创建“符号链接”(如果不带-s参数,则默认创建硬链接) |
-f | 强制创建文件或目录的链接 |
-i | 覆盖前先询问 |
-v | 显示创建链接的过程 |
第六章 使用RAID与LVM磁盘阵列技术。
冗余磁盘阵列技术(RAID): RAID0、RAID5、RAID10技术详解
6.1.1 部署磁盘阵列
mdadm命令用于管理Linux系统中的软件RAID硬盘阵列,格式为“mdadm [模式] <RAID设备名称> [选项] [成员设备名称]”。
mdadm命令的常用参数和作用
参数 | 作用 |
---|---|
-a | 检测设备名称 |
-n | 指定设备数量 |
-l | 指定RAID级别 |
-C | 创建 |
-v | 显示过程 |
-f | 模拟设备损坏 |
-r | 移除设备 |
-Q | 查看摘要信息 |
-D | 查看详细信息 |
-S | 停止RAID磁盘阵列 |
部署RAID磁盘阵列的步骤:
1.mdadm命令部署磁盘阵列
2.格式化磁盘阵列
3.挂载
其中,-C参数代表创建一个RAID阵列卡;-v参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID磁盘阵列的名称;-a yes参数代表自动创建设备文件;-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;而-l 10参数则代表RAID 10方案;最后再加上4块硬盘设备的名称就搞定了。bush
[root@linuxprobe ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc //部署RAID磁盘阵列
6.1.2 损坏磁盘阵列及修复
在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,应该使用mdadm命令将其移除,
[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb //移除/dev/sdb这个磁盘
6.1.3 磁盘阵列+备份盘
RAID 10磁盘阵列中**最多允许50%**的硬盘设备发生故障。
mdadm -x : 该命令可以设置一个磁盘为备份盘
6.2 LVM逻辑卷管理器
LVM逻辑卷详解: https://blog.51cto.com/13438667/2084924
硬盘分区后,当用户想要随着实际需求的变化调整硬盘分区的大小时,会受到硬盘“灵活性”的限制。这时就需要用到另外一项非常普及的硬盘设备资源管理技术了—LVM(逻辑卷管理器)。LVM可以允许用户对硬盘资源进行动态调整。
PV(Physical Volume):物理卷,处于LVM最底层E,可以是物理硬盘或者分区。
PE(Physical Extend):物理区域,PV中可以用于分配的最小存储单元,可以在创建PV的时候制定(默认为4MB),如1M, 2M, 4M, 8M, 32M, 64M…组成同一VG中所有PV的PE大小应该相同。
VG(Volume Group):卷组,建立在PV之上,可以含有一个到多个PV。
LV(Logical Volume):逻辑卷,建立在VG之上,相当于原来分区的概念。不过大小可以动态改变。
2.LVM的创建
LVM:将磁盘分为一个个小区域称为PE,相应的,许多PE组成PV,多个PV组成VG;VG是许多PE的集合,所有同一个VG中的PE大小相同;从VG中选择若干个PE组成LV,用户的操作作用于LV上。
6.2.1 部署逻辑卷
常用的LVM部署命令
功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
扫描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | vgextend | lvextend | |
缩小 | vgreduce | lvreduce |
第1步:让新添加的两块硬盘设备支持LVM技术(将物理磁盘创建为PV)。
第2步:把两块硬盘设备加入到storage卷组中,然后查看卷组的状态 (创建VG)。
第3步:切割出一个约为150MB的逻辑卷设备(创建lV)。
lvcreate -L : 直接划分生成
lvcreate -l: 以基本单元的个数为单位,每个基本单元的大小默认为4MB。例如,使用-l 37可以生成一个大小为37×4MB=148MB的逻辑卷。
第4步:把生成好的逻辑卷进行格式化,然后挂载使用。
Linux系统会把LVM中的逻辑卷设备存放在/dev设备目录中(实际上是做了一个符号链接),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组名称/逻辑卷名称)。
第5步:查看挂载状态,并写入到配置文件,使其永久生效。
echo “/dev/storage/vo /linuxprobe ext4 defaults 0 0” >> /etc/fstab //在/etc/fstab 中追加一条配置
6.2.2 扩容逻辑卷
扩展前请一定要记得卸载设备和挂载点的关联。
第1步:把上一个实验中的逻辑卷vo扩展至290MB。
[root@linuxprobe ~]# lvextend -L 290M /dev/storage/vo
第2步:检查硬盘完整性,并重置硬盘容量。
[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
e2fsck命令: e2fsck命令用于检查使用 Linux ext 档案系统的 partition 是否正常工作, e2fsck命令可以检查ext2、ext3、ext4文件系统.
调整逻辑卷文件系统大小:
[root@linuxprobe ~]# resize2fs /dev/storage/vo
resize2fs命令: 是用来增大或者收缩未加载的“ext2/ext3/ext4”文件系统的大小。
第3步:重新挂载硬盘设备并查看挂载状态。
[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
mount -a: 自动挂载在/etc/fstab配置文件中未挂载的设备
6.2.3 缩小逻辑卷
第1步:检查文件系统的完整性。
[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
第2步:把逻辑卷vo的容量减小到120MB。
[root@linuxprobe ~]# resize2fs /dev/storage/vo 120M
第3步:重新挂载文件系统并查看系统状态。
[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
6.2.4 逻辑卷快照
LVM还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。LVM的快照卷功能有两个特点:
快照卷的容量必须等同于逻辑卷的容量;
快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
第1步:使用-s参数生成一个快照卷,使用-L参数指定切割的大小。另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作。
[root@linuxprobe ~]# lvcreate -L 120M -s -n SNAP /dev/storage/vo
lvcreate -s: 创建一个逻辑卷
第2步:在逻辑卷所挂载的目录中创建一个100MB的垃圾文件,然后再查看快照卷的状态。可以发现存储空间占的用量上升了。
第3步:为了校验SNAP快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
[root@linuxprobe ~]# lvconvert --merge /dev/storage/SNAP //恢复快照
第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的100MB的垃圾文件也被清除了。
6.2.5 删除逻辑卷
删除逻辑卷的顺序: 依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒。
第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
[root@linuxprobe ~]# umount /linuxprobe
[root@linuxprobe ~]# vim /etc/fstab
第2步:删除逻辑卷设备,需要输入y来确认操作。
[root@linuxprobe ~]# lvremove /dev/storage/vo
第3步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
[root@linuxprobe ~]# vgremove storage
第4步:删除物理卷设备。
[root@linuxprobe ~]# pvremove /dev/sdb /dev/sdc
这些操作过后,物理卷就会被删除。
第二个阶段:通过系统调用或者 glibc,学会自己进行程序设计
Glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库。Glibc 为程序员提供丰富的 API,除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。