《Linux就该这么学》读书笔记
2024-10-08 22:17:56 11 举报
AI智能生成
《Linux就该这么学》读书笔记
作者其他创作
大纲/内容
Linux操作系统
常见的Linux系统版本
Linux 系统内核与 Linux 发行套件系<br>统的不同
Linux 系统内核指的是一个由 Linus Torvalds 负责维护,提供硬件抽象层、磁盘、文件<br>系统控制及多任务功能的系统核心程序(第 2 章会有详细介绍)。
Linux 发行套件系统是我们常说的 Linux 操作系统,也就是由 Linux 内核与各种常用<br>软件的集合产品。
RHEL
红帽企业版 Linux Red Hat Enterprise Linux;红帽企业版 Linux 最初于 2002 年 3 月面世,当年 Dell、HP、Oracle 以及 IBM 公司便<br>纷纷表示支持该系统平台的硬件开发,因此红帽企业版 Linux 系统的市场份额在近 20<br>年时间内不断猛增。红帽企业版 Linux 当时是全世界使用最广泛的 Linux 系统之一,<br>在世界 500 强企业中,所有的航空公司、电信服务提供商、商业银行、医疗保健公司<br>均无一例外地通过该系统向外提供服务。<br>红帽企业版 Linux 当前的最新版本是 RHEL 9,该系统具有极强的稳定性,在全球范<br>围内都可以获得完善的技术支持。该系统也是本书和红帽认证考试中默认使用的操作<br>系统。
CentOS
社区企业操作系统 Community Enterprise Operating System;CentOS 是由开源社区研发和维护的一款企业级 Linux 操作系统,从本质上来说,由于 CentOS 是针对红帽企业版 Linux 进行修改后再发布的版本,因<br>此不会针对它单独开发新功能,CentOS 的版本号也是随红帽企业版 Linux 而变更。<br>例如,CentOS 8.0 对应的就是 RHEL 8.0,CentOS 8.1 对应的就是 RHEL 8.1;以此类<br>推。再就是,CentOS 系统和 RHEL 系统的软件包可以通用。也就是说,如果工作中<br>用的是 RHEL,但是在安装某款软件时只找到了该软件的 CentOS 系统软件源,也是<br>可以正常安装该软件的。
centos 7的内核版本是3.10 centos8的内核版本是4.18
Fedora
Fedora 翻译为中文是“浅顶软呢男帽”的意思,翻译之后跟 Linux 系统很不<br>搭界,所以更多人干脆将其音译为“费多拉”系统。Fedora是桌面版本的Linux系统,可以理解成是微软公司的Windows XP或者Windows <br>10。它的目标用户是应付日常的工作需要,而不会追求稳定性的人群。用户可以在这<br>个系统中体验到最新的技术和工具,当这些技术和工具成熟后才会被移植到红帽企业<br>版 Linux 中,因此 Fedora 也被称为 RHEL 系统的“试验田”。运维人员如果想每天<br>都强迫自己多学点 Linux 知识,保持自己技术的领先性,就应该多关注此类 Linux 系<br>统的发展变化和新特征,不断调整自己的学习方向。
Debian
一款基于 GNU 开源许可证的 Linux 系统,Debian 系统具有很强的稳定性和安全性,并且提供了免费的基础支持,可以良好地适<br>应各种硬件架构,以及提供近十万种不同的开源软件,在国外拥有很高的认可度和使<br>用率。虽然 Debian 也是基于 Linux 内核,但是在实际操作中还是跟红帽公司的产品<br>有一些差别,例如RHEL 7和RHEL 8分别使用Yum和DNF工具来安装软件,而Debian<br>使用的则是 APT 工具。
Ubuntu
Ubuntu是一款桌面版 Linux 系统,以 Debian 为蓝本进行修改和衍生而来,发布周<br>期为 6 个月。Ubuntu 的中文音译为“乌班图”,Ubuntu 系统的第一个版本发布于 2004 年 10 月。2005 年 7 月,Ubuntu 基金会成立,<br>Ubuntu 后续不断增加开发分支,有了桌面版系统、服务器版系统和手机版系统。据<br>调查,Ubuntu 最高峰时的用户达到了 10 亿人。尽管 Ubuntu 基于 Debian 系统衍生而<br>来,但会对系统进行深度化定制,因此两者之间的软件并不一定完全兼容。Ubuntu<br>系统现在由 Canonical 公司提供商业技术支持,只要购买付费技术支持服务就能获得<br>帮助,桌面版系统最长时间 3 年,服务器版系统最长时间 5 年。
openSUSE
一款源自德国的 Linux 系统,在全球范围内有着不错的声誉及市场占有<br>率。openSUSE 的桌面版系统简洁轻快易于使用,而服务器版本则功能丰富极具稳定<br>性,而且即便是“菜鸟”也能轻松上手,用户可以完全自主选择要使用的<br>软件。例如,针对 GUI 环境,就提供了诸如 GNOME、KDE、Cinnamon、MATE、<br>LXQt、Xfce 等可选项;除此之外,还为用户提供了数千个免费开源的软件包。
Kali
这款系统一般是供黑客或安全人员使用的,能够以此为平台对网站进行渗透测<br>试,通俗来讲就是能“攻击”网站。Kali Linux 系统的前身名为 BackTrack,其设计<br>用途就是进行数字鉴识和渗透测试,内置有 600 多款网站及系统的渗透测试软件,包<br>括大名鼎鼎的 Nmap、Wireshark、sqlmap 等。Kali Linux 能够被安装到个人电脑、公<br>司服务器,甚至手掌大小的树莓派(一款微型电脑)上
Gentoo
Gentoo 系统最大的特色就是允许用户完全自由地进行定制。开发人员 Daniel 曾经说<br>过:“Gentoo 系统的设计出发点就是让用户随意使用,没有限制地使用”。只要理解<br>了这句话,后面也就不需要再解释什么了。在 Gentoo 系统中,任何一部分功能(包<br>括最基本的系统库和编译器)都允许用户重新编译;用户也可以选择喜欢的补丁或者<br>插件进行定制。但是,也因为 Gentoo 极高的自定制性,导致操作复杂,因此仅适合<br>有经验的运维人员使用。有兴趣的读者可以在学习完本书后尝试一下该系统。<br>如果大家今后真的安装了 Gentoo 系统,千万别忘记试一下 Portage 工具。这款软件管理工<br>具以模块化、可移植、易维护和灵活性而著称,几乎可以无限制地适应用户的计算机硬件。
深度操作系统(Deepin)
在过去的十多年,基于开源系统二次定制开发的“国产操<br>作系统”陆续出现过一些,但大多发展不好,深度操作系统却是少数能够将技术研发<br>与商业运作结合起来的成功案例。据 Deepin 的官网介绍,该系统是由武汉深之度科<br>技有限公司于 2011 年基于 Debian 系统衍生而来的,提供 32 种语言版本,目前累计<br>下载量已近 1 亿次,用户遍布 100 余个国家/地区。就Deepin来讲,最吸引人的还是它的本土化工作。Deepin默认集成了诸如WPS Office、<br>搜狗输入法、有道词典等国内常用的软件,对“小白”用户相当友好。
linux系统启动过程
<ul><li>启动bios</li><li>进入boot loader</li><li>加载系统内核</li><li>内核初始化</li><li>启动初始化进程</li></ul>
Linux 系统在启动时要进行大量的初始化工作,比如挂载文件系统和交换分区、启动各<br>类进程服务等,这些都可以看作是一个一个的单元(unit)
systemd 与 System V init 的区别以及作用
System V init 运行级别 systemd目标名称 systemd目标使用 <br>0 poweroff.target 关机<br>1 rescue.target 单用户模式<br>2 multi-user.target 多用户的文本界面<br>3 multi-user.target 多用户的文本界面<br>4 multi-user.target 多用户的文本界面<br>5 graphical.target 多用户的图形界面<br>6 reboot.target 重启<br>emergency emergency.target 救援模式
重置root密码
待实践
注意点
Linux 系统中以点(.)开头的文件均代表隐藏文件,这些文件大多数为系统服务文件
<font color="#e74f4c">在 Linux 系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数。</font>
Linux命令
软件安装方法
RPM
RPM是什么
RPM 有点像 Windows 系统中的控制面板,会建立统一的数据库,详细记录软件信息并<br>能够自动分析依赖关系。
常用命令
<ul><li>rpm –ivh filename.rpm 安装软件</li><li>rpm –Uvh filename.rpm 升级软件</li><li>rpm -e filename.rpm 卸载软件</li><li>rpm –qpi filename.rpm 查询软件描述信息</li><li>rpm -qpl filename.rpm 列出软件文件信息</li><li>rpm -qf filename 查询文件属于哪个 RPM</li></ul>
YUM
YUM是什么
尽管 RPM 能够帮助用户查询软件之间的依赖关系,但问题还是要运维人员自己来<br>解决,而有些大型软件可能与数十个程序都有依赖关系,在这种情况下安装软件依然很繁琐。<br>Yum 软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术。Yum 软件仓库可以<br>根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安<br>装到系统。Yum 软件仓库中的 RPM 软件包可以是由红帽官方发布的,也可以是由第三方发布的,<br>当然也可以是自己编写的。
常用命令
<ul><li>yum repolist all 列出所有仓库</li><li>yum list all 列出仓库中所有软件包</li><li>yum info 软件包名称 查看软件包信息</li><li>yum install 软件包名称 安装软件包</li><li>yum reinstall 软件包名称 重新安装软件包</li><li>yum update 软件包名称 升级软件包</li><li>yum remove 软件包名称 移除软件包</li><li>yum clean all 清除所有仓库缓存</li><li>yum check-update 检查可更新的软件包</li><li>yum grouplist 查看系统中已经安装的软件包组</li><li>yum groupinstall 软件包组 安装指定的软件包组</li><li>yum groupremove 软件包组 移除指定的软件包组</li><li>yum groupinfo 软件包组 查询指定的软件包组信息</li></ul>
DNF
DNF是什么
原本以为故事到此就要结束了,可是人们发现 Yum 虽然解决了软件的依赖关系问题,但<br>仍然还是存在分析不准确、内存占用量大、不能多人同时安装软件等硬伤。终于,在 2015 年<br>随着 Fedora 22 系统的发布,红帽又给了我们一个新的选择—DNF。DNF 实际上就是解决<br>了上述问题的 Yum 软件仓库的提升版,行业内称之为 Yum v4 版本。
常用命令
作为 Yum 软件仓库 v3 版本的接替者,DNF 特别友好地继承了原有的命令格式,且使用<br>习惯上也保持了一致。大家不用担心不会操作,我们来看一个例子。以前,安装软件用的命<br>令是“yum install 软件包名称”,那么现在则是“dnf install 软件包名称”(也就是说,将 yum<br>替换成 dnf 即可)。<br>当然 RHEL 8 系统也照顾到了老用户的习惯问题,同时兼容并保留了 yum 和 dnf 两个命<br>令,大家在实际操作中随意选择就好。甚至这两个命令的提示信息都基本一样,感知不到什<br>么区别。
RPM 与软件仓库的作用
RPM 是通过将源代码与安装规则打包在一起,降低了单个软件的安装难度。而 Yum与 DNF 软件仓库则是将大量常用的 RPM 软件包打包到一起,解决了软件包之间的依赖关系,这进一步降低了软件的整体安装难度。<br>
<ul><li>RPM 是一种软件包格式,以及用于安装、升级和卸载这些软件包的工具。</li><li>YUM 是基于 RPM 的软件包管理器,用于自动解决依赖关系并简化软件包的管理。</li><li>DNF 是 YUM 的下一代版本,保留了 YUM 的功能并引入了一些改进。在新一代的Red Hat发行版中,DNF已经取代了YUM。</li></ul>
shell
bash解释器是shell的一种
Linux命令的格式
命令名称 [命令参数] 命令对象
命令名称
就是语法中的“动词”,表达的是想要做的事情,例如创建用户、查看文<br>件、重启系统等操作。
命令参数
用于对命令进行调整,让“修改”过的命令能更好地贴合工作需求,达到<br>事半功倍的效果。
参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分<br>别用“--”与“-”作为前缀
长格式 man --help
短格式 man -h
命令对象
一般指要处理的文件、目录、用户等资源名称,也就是命令执行后的“承<br>受方”
注意点
命令名称、命令参数与命令对象之间要用空格进行分隔,且字母严格区分大小写
在 Linux 相关的图书中,我们会约定俗成地将可选择的、可加或可不加的、非必需<br>的参数使用中括号引起来,例如“man [命令参数]”;而命令所要求的、必须有的参数<br>或对象值,则不带中括号。这样一来,读者可以更好地理解下面出现的命令格式。
常用系统工作命令
echo
echo 命令用于在终端设备上输出字符串或变量提取后的值,语法格式为“echo [字符串] <br>[$变量]"
date
date 命令用于显示或设置系统的时间与日期,语法格式为“date [+指定的格式]”。
<ul><li>%S 秒(00~59)</li><li>%M 分钟(00~59)</li><li>%H 小时(00~23)</li><li>%I 小时(00~12)</li><li>%m 月份(1~12)</li><li>%p 显示出 AM 或 PM</li><li>%a 缩写的工作日名称(例如,Sun)</li><li>%A 完整的工作日名称(例如,Sunday)</li><li>%b 缩写的月份名称(例如,Jan)</li><li>%B 完整的月份名称(例如,January)</li><li>%q 季度(1~4)</li><li>%y 简写年份(例如,20)</li><li>%Y 完整年份(例如,2020)</li><li>%d 本月中的第几天</li><li>%j 今年中的第几天</li><li>%n 换行符(相当于按下回车键)</li><li>%t 跳格(相当于按下 Tab 键)</li></ul>
timedatectl
timedatectl 命令用于设置系统的时间,英文全称为“time date control”,语法格式为<br>“timedatectl [参数]”。
<ul><li>status 显示状态信息</li><li>list-timezones 列出已知时区</li><li>set-time 设置系统时间</li><li>set-timezone 设置生效时区</li></ul>
reboot
reboot 命令用于重启系统,输入该命令后按回车键执行即可。
由于重启计算机这种操作会涉及硬件资源的管理权限,因此最好是以 root 管理员的身份<br>来重启,普通用户在执行该命令时可能会被拒绝。
poweroff
poweroff 命令用于关闭系统,输入该命令后按回车键执行即可。<br>与上面相同,该命令也会涉及硬件资源的管理权限,因此最好还是以 root 管理员的身份<br>来关闭电脑。
wget
wget 命令用于在终端命令行中下载网络文件,英文全称为“web get”,语法格式为“wget <br>[参数] 网址”。<br>
<ul><li>-b 后台下载模式</li><li>-P 下载到指定目录</li><li>-t 最大尝试次数</li><li>-c 断点续传</li><li>-p 下载页面内所有资源,包括图片、视频等</li><li>-r 递归下载</li></ul>
ps
ps 命令用于查看系统中的进程状态,英文全称为“processes”,语法格式为“ps [参
数]”。
<ul><li>-a 显示所有进程(包括其他用户的进程)</li><li>-u 用户以及其他详细信息</li><li>-x 显示没有控制终端的进程</li></ul>
在 Linux 系统中有 5 种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各<br>自含义如下所示。
R (运行):进程正在运行或在运行队列中等待。
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 <br>状态。
D(不可中断):进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
Z(僵死):
进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数<br>后将进程释放。
T(停止):
进程收到停止信号后停止运行。
除了上面 5 种常见的进程状态,还有可能是高优先级(<)、低优先级(N)、被锁进内存<br>(L)、包含子进程(s)以及多线程(l)这 5 种补充形式。
pstree
pstree 命令用于以树状图的形式展示进程之间的关系,英文全称为“process tree”,输入<br>该命令后按回车键执行即可。
top
top 命令用于动态地监视进程活动及系统负载等信息,输入该命令后按回车键执行即可。
nice
nice 命令用于调整进程的优先级,语法格式为“nice 优先级数字 服务名称”。
pidof
pidof 命令用于查询某个指定服务进程的 PID 号码值,语法格式为“pidof [参数] 服务名称”。
kill
kill 命令用于终止某个指定 PID 值的服务进程,语法格式为“kill [参数] 进程的 PID”。
killall
killall 命令用于终止某个指定名称的服务所对应的全部进程,语法格式为“killall [参数] 服
务名称”。
系统状态检测命令
ifconfig
ifconfig 命令用于获取网卡配置与网络状态等信息,英文全称为“interface config”,语法<br>格式为“ifconfig [参数] [网络设备]”。
uname
uname 命令用于查看系统内核版本与系统架构等信息,英文全称为“unix name”,语法格<br>式为“uname [-a]”。
uptime
uptime 命令用于查看系统的负载信息,输入该命令后按回车键执行即可。
free
free 命令用于显示当前系统中内存的使用量信息,语法格式为“free [-h]”。<br>
who
who 命令用于查看当前登入主机的用户终端信息,输入该命令后按回车键执行即可。
last
last 命令用于调取主机的被访记录,输入该命令后按回车键执行即可。
ping
ping 命令用于测试主机之间的网络连通性,语法格式为“ping [参数] 主机地址”。
<ul><li>-c 总共发送次数</li><li>-l 指定网卡名称</li><li>-I 每次间隔时间(秒)</li><li>-W 最长等待时间(秒)</li></ul>
tracepath
tracepath 命令用于显示数据包到达目的主机时途中经过的所有路由信息,语法格式为<br>“tracepath [参数] 域名”。
netstat
netstat 命令用于显示如网络连接、路由表、接口状态等的网络相关信息,英文全称为<br>“network status”,语法格式为“netstat [参数]”。
<ul><li>-a 显示所有连接中的 Socket</li><li>-p 显示正在使用的 Socket 信息</li><li>-t 显示 TCP 协议的连接状态</li><li>-u 显示 UDP 协议的连接状态</li><li>-n 使用 IP 地址,不使用域名</li><li>-l 仅列出正在监听的服务状态</li><li>-i 现在网卡列表信息</li><li>-r 显示路由表信息</li></ul>
history
history 命令用于显示执行过的命令历史,语法格式为“history [-c]”。
历史命令会被保存到用户家目录中的.bash_history 文件中。
sosreport
sosreport 命令用于收集系统配置及架构信息并输出诊断文档,输入该命令后按回车键执行即可。
查找定位文件命令
pwd
pwd 命令用于显示用户当前所处的工作目录,英文全称为“print working directory”,输<br>入该命令后按回车键执行即可。
cd
cd 命令用于切换当前的工作路径,英文全称为“change directory”,语法格式为“cd [参<br>数] [目录]”。
ls
ls 命令用于显示目录中的文件信息,英文全称为“list”,语法格式为“ls [参数] [文件名称]”。
tree
tree 命令用于以树状图的形式列出目录内容及结构,输入该命令后按回车键执行即可。
find
find 命令用于按照指定条件来查找文件所对应的位置,语法格式为“find [查找范围] 寻<br>找条件”。
<ul><li>-name 匹配名称</li><li>-perm 匹配权限(mode 为完全匹配,-mode 为包含即可)</li><li>-user 匹配所有者</li><li>-group 匹配所属组</li><li>-mtime -n +n 匹配修改内容的时间(-n 指 n 天以内,+n 指 n 天以前)</li><li>-atime -n +n 匹配访问文件的时间(-n 指 n 天以内,+n 指 n 天以前)</li><li>-ctime -n +n 匹配修改文件权限的时间(-n 指 n 天以内,+n 指 n 天以前)</li><li>-nouser 匹配无所有者的文件</li><li>-nogroup 匹配无所属组的文件</li><li>-newer f1 !f2 匹配比文件 f1 新但比 f2 旧的文件</li><li>--type b/d/c/p/l/f 匹配文件类型(后面的字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件)</li><li>-size 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件)</li><li>-prune 忽略某个目录</li><li>-exec…… {}\; 后面可跟用于进一步处理搜索结果的命令(下文会有演示)</li></ul>
locate
locate 命令用于按照名称快速搜索文件所对应的位置,语法格式为“locate 文件名称”。
whereis
whereis 命令用于按照名称快速搜索二进制程序(命令)、源代码以及帮助文件所对应的<br>位置,语法格式为“whereis 命令名称”。
which
which 命令用于按照指定名称快速搜索二进制程序(命令)所对应的位置,语法格式为<br>“which 命令名称”。
文本文件编辑命令
cat
cat 命令用于查看纯文本文件(内容较少的),英文全称为“concatenate”,语法格式为“cat <br>[参数] 文件名称”
more
more 命令用于查看纯文本文件(内容较多的),语法格式为“more [参数] 文件名称”。
head
head 命令用于查看纯文本文件的前 N 行,语法格式为“head [参数] 文件名称”。
tail
tail 命令用于查看纯文本文件的后 N 行或持续刷新文件的最新内容,语法格式为“tail [参<br>数] 文件名称”。
tr
tr 命令用于替换文本内容中的字符,英文全称为“translate”,语法格式为“tr [原始字符] <br>[目标字符]”。
wc
wc 命令用于统计指定文本文件的行数、字数或字节数,英文全称为“word counts”,语<br>法格式为“wc [参数] 文件名称”。
<ul><li>-l 只显示行数</li><li>-w 只显示单词数</li><li>-c 只显示字节数</li></ul>
stat
stat 命令用于查看文件的具体存储细节和时间等信息,英文全称为“status”,语法格式为<br>“stat 文件名称”。
Linux 系统中的文件包含 3 种时间状态,分别是 <br>Access Time(内容最后一次被访问的时间,简称为 Atime),<br>Modify Time(内容最后一次被修改的时间,简称为 Mtime),<br>Change Time(文件属性最后一次被修改的时间,简称为 Ctime)。<br>
grep
grep 命令用于按行提取文本内容,语法格式为“grep [参数] 文件名称”。
<span style="font-size: inherit;">-b 将可执行文件(binary)当作文本文件(text)来搜索</span><br style="font-size: inherit;"><ul><li><span style="font-size: inherit;">-c 仅显示找到的行数</span></li><li><span style="font-size: inherit;">-I 忽略大小写</span></li><li><span style="font-size: inherit;">-n 显示行号</span></li><li><span style="font-size: inherit;">-v 反向选择—仅列出没有“关键词”的行</span></li></ul>
cut
cut 命令用于按“列”提取文本内容,语法格式为“cut [参数] 文件名称”。
diff
diff 命令用于比较多个文件之间内容的差异,英文全称为“different”,语法格式为“diff [参<br>数] 文件名称 A 文件名称 B”。<br>
uniq
uniq 命令用于去除文本中连续的重复行,英文全称为“unique”,语法格式为“uniq [参数] 文<br>件名称”
sort
sort 命令用于对文本内容进行再排序,语法格式为“sort [参数] 文件名称”。
<ul><li>-f 忽略大小写</li><li>-b 忽略缩进与空格</li><li>-n 以数值型排序</li><li>-r 反向排序</li><li>-u 去除重复行</li><li>-t 指定间隔符</li><li>-k 设置字段范围</li></ul>
文件目录管理命令
touch
touch 命令用于创建空白文件或设置文件的时间,语法格式为“touch [参数] 文件名称”。
<ul><li>-a 仅修改“访问时间”( Atime )</li><li>-m 仅修改“修改时间”( Mtime )</li><li>-d 同时修改 Atime 与 Mtime</li></ul>
mkdir
mkdir 命令用于创建空白的目录,英文全称为“make directory”,语法格式为“mkdir [参<br>数] 目录名称”。
cp
cp 命令用于复制文件或目录,英文全称为“copy”,语法格式为“cp [参数] 源文件名称 目<br>标文件名称”
<ul><li>-p 保留原始文件的属性</li><li>-d 若对象为“链接文件”,则保留该“链接文件”的属性</li><li>-r 递归持续复制(用于目录)</li><li>-i 若目标文件存在则询问是否覆盖</li><li>-a 相当于-pdr(p、d、r 为上述参数)</li></ul>
mv
mv 命令用于剪切或重命名文件,英文全称为“move”,语法格式为“mv [参数] 源文件<br>名称 目标文件名称”
<ul><li>-f 强制执行</li><li>-i 删除前询问</li><li>-r 删除目录</li><li>-v 显示过程</li></ul>
rm
rm 命令用于删除文件或目录,英文全称为“remove”,语法格式为“rm [参数] 文件 <br>名称”
<ul><li>-f 强制执行</li><li>-i 删除前询问</li><li>-r 删除目录</li><li>-v 显示过程</li></ul>
dd
dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件,语法格式为“dd if=<br>参数值 of=参数值 count=参数值 bs=参数值”。
<ul><li>if 输入的文件名称</li><li>of 输出的文件名称</li><li>bs 设置每个“块”的大小</li><li>count 设置要复制“块”的个数</li></ul>
file
file 命令用于查看文件的类型,语法格式为“file 文件名称”。
PS:在 Windows 系统中打开文件时,一般是通过用户双击鼠标完成的,系统会自行判<br>断用户双击的文件是什么类型,因此需要有后缀进行区别。而 Linux 系统则是根据用户<br>执行的命令来调用文件,例如执行 cat 命令查看文本,执行 bash 命令执行脚本等,所<br>以也就不需要强制让用户给文件设置后缀了。
tar
tar 命令用于对文件进行打包压缩或解压,语法格式为“tar 参数 文件名称”。
<ul><li>-c 创建压缩文件</li><li>-x 解开压缩文件</li><li>-t 查看压缩包内有哪些文件</li><li>-z 用 gzip 压缩或解压</li><li>-j 用 bzip2 压缩或解压</li><li>-v 显示压缩或解压的过程</li><li>-f 目标文件名</li><li>-p 保留原始的权限与属性</li><li>-P 使用绝对路径来压缩</li><li>-C 指定解压到的目录</li></ul>
管道符、重定向与环境变量
输入输出重定向:<br>
标准输入重定向( STDIN,文件描述符为0 )<br>
默认从键盘输入,也可从其他文件或<br>命令中输入。
输入重定向中用到的符号及其作用
<ul><li>命令 < 文件 将文件作为命令的标准输入</li><li>命令 << 分界符 从标准输入中读入,直到遇见分界符才停止</li><li>命令 < 文件 1 > 文件 2 将文件 1 作为命令的标准输入并将标准输出到文件 2</li></ul>
输出重定向
两种技术
标准输出重定向( STDOUT,文件描述符为1 )
默认输出到屏幕。<br>
错误输出重定向( STDERR,文件描述符为2 )
默认输出到屏幕。
输出重定向中用到的符号及其作用
<ul><li>命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)</li><li>命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)</li><li>命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)</li><li>命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)</li><li>命令 >> 文件 2>&1或命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)</li></ul>
两种模式
覆盖写入
追加写入
管道命令符
释义:把一个命令原本要输入到屏幕的信息当作后一个命令的标准输入<br>
命令行的通配符
通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,<br>问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配 0~9 之间的单个数字的字符,<br>而中括号内加上字母[abc]则是代表匹配 a、b、c 三个字符中的任意一个字符。
Linux 系统中的通配符及含义<br>
<ul><li>* 任意字符</li><li>? 单个任意字符</li><li>[a-z] 单个小写字母</li><li>[A-Z] 单个大写字母</li><li>[a-Z] 单个字母</li><li>[0-9] 单个数字</li><li>[[:alpha:]] 任意字母</li><li>[[:upper:]] 任意大写字母</li><li>[[:lower:]] 任意小写字母</li><li>[[:digit:]] 所有数字</li><li>[[:alnum:]] 任意字母加数字</li><li>[[:punct:]] 标点符号</li></ul>
可以同时创建这三个文件<br>touch {AA,BB,CC}.conf<br>
常用的转义字符
反斜杠 \ :使反斜杠后面的一个变量变为单纯的字符。
单引号 '' :
转义其中所有的变量为单纯的字符串。
双引号 "" :保留其中的变量属性,不进行转义处理。
反引号 ` ` :把其中的命令执行后返回结果。
重要的环境变量
linux中执行一条命林后系统做了什么
<span style="font-size:inherit;">判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是绝对</span><span style="font-size:inherit;">路径则直接执行,否则进入第 2 步继续判断。</span><br>
alias 命令
alias 别名=命令
unalias 命令
unalias 别名
Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。
Bash 解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤 4 继续处理。
type 命令名称
来判断用户输入的命令是内部命令还是外部命令
系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉 Bash 解释器待执行的命令可能存放的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找。
Linux 系统中最重要的 10 个环境变量
<ul><li>HOME 用户的主目录(即家目录)</li><li>SHELL 用户在使用的 Shell 解释器名称</li><li>HISTSIZE 输出的历史命令记录条数</li><li>HISTFILESIZE 保存的历史命令记录条数</li><li>MAIL 邮件保存路径</li><li>LANG 系统语言、语系名称</li><li>RANDOM 生成一个随机数字</li><li>PS1 Bash 解释器的提示符</li><li>PATH 定义解释器搜索用户执行命令的路径</li><li>EDITOR 用户默认的文本编辑器</li></ul>
export 命令
将其提升为全局变量,这样其他用户也就可以使用
WORKDIR=/home/workdir
export WORKDIR
unset 命令
取消掉这个变量的使用
unset WORKDIR
直接在终端设置的变量能够立即生效,但在重启服务器后就会失效,因此我们需<br>要将变量和变量值写入到.bashrc 或者.bash_profile 文件中,以确保永久能使用它们。
Vim编辑器与shell命令脚本
Vim 文本编辑器
VIM文本编辑器的三种模式
命令模式
控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
命令模式中最常用的一些命令
<ul><li>dd 删除(剪切)光标所在整行</li><li>5dd 删除(剪切)从光标处开始的 5 行</li><li>yy 复制光标所在整行</li><li>5yy 复制从光标处开始的 5 行</li><li>n 显示搜索命令定位到的下一个字符串</li><li>N 显示搜索命令定位到的上一个字符串</li><li>u 撤销上一步的操作</li><li>p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面</li></ul>
末行模式
保存或退出文档,以及设置编辑环境。
末行模式中常用的一些命令
<ul><li>:w 保存</li><li>:q 退出</li><li>:q! 强制退出(放弃对文档的修改内容)</li><li>:wq! 强制保存退出</li><li>:set nu 显示行号</li><li>:set nonu 不显示行号</li></ul>
<ul><li>:命令 执行该命令</li><li>:整数 跳转到该行</li><li>:s/one/two 将当前光标所在行的第一个 one 替换成 two</li><li>:s/one/two/g 将当前光标所在行的所有 one 替换成 two</li><li>:%s/one/two/g 将全文中的所有 one 替换成 two</li><li>?字符串 在文本中从下至上搜索该字符串</li><li>/字符串 在文本中从上至下搜索该字符串</li></ul>
输入模式
正常的文本录入。
a键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,o 键则是在光标的下面<br>再创建一个空行,此时可敲击 a 键进入编辑器的输入模式
编写简单文档
配置软件仓库
RPM 管理软件
RPM是“RPM Package Manager”(RPM软件包管理器)的缩写,它是一种用于Linux操作系统的软件包管理系统。RPM用于管理Red Hat Enterprise Linux(RHEL)、Fedora、CentOS、openSUSE等Linux发行版的软件包。
RPM系统使用.rpm为文件扩展名的文件,这些文件被称为RPM包,它们包含了预编译的软件以及用于安装软件的元数据,如依赖关系、安装脚本和其他配置信息。使用RPM,用户可以轻松地安装、更新、卸载和查询软件包。RPM还提供了用于验证软件包完整性和签名的功能,确保软件包在分发过程中未被篡改。
<ul><li>安装软件包:rpm -i package.rpm</li><li>升级软件包:rpm -U package.rpm</li><li>卸载软件包:rpm -e package_name</li><li>查询已安装的软件包:rpm -q package_name</li><li>查看软件包信息:rpm -qi package_name</li><li>验证软件包内容和安装的文件:rpm -V package_name</li></ul>
搭建并配置软件仓库的大致步骤
进入/etc/yum.repos.d/目录中(因为该目录存放着软件仓库的配置文件)。
使用 Vim 编辑器创建一个名为 rhel8.repo 的新配置文件(文件名称可随意,但<br>后缀必须为.repo),逐项写入下面的配置参数并保存退出。
仓库名称 :具有唯一性的标识名称,不应与其他软件仓库发生冲突。<br>描述信息 :可以是一些介绍性的词,易于识别软件仓库的用处。<br>仓库位置 :软件包的获取方式,可以使用 FTP 或 HTTP 下载,也可以是本<br>地的文件(需要在后面添加 file 参数)。<br>是否启用 :设置此源是否可用;1 为可用,0 为禁用。<br>是否校验 :设置此源是否校验文件;1 为校验,0 为不校验。<br>公钥位置 :若上面的参数开启了校验功能,则此处为公钥文件位置。若没<br>有开启,则省略不写。
按配置参数中所填写的仓库位置挂载光盘,并把光盘挂载信息写入/etc/fstab 文件中。<br>
使用“dnf install httpd -y”命令检查软件仓库是否已经可用。
编写 Shell 脚本
Shell 脚本命令的工作方式有下面两种
交互式
用户每输入一条命令就立即执行。
批处理
由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本<br>中诸多的命令。
编写简单的脚本
Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh 后缀加上,<br>以表示是一个脚本文件。
#!/bin/bash<br>#For Example BY linuxprobe.com<br>pwd<br>ls -al
第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本;<br>第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;<br>第三、四行的可执行语句也就是我们平时执行的 Linux 命令了。<br>
接收用户的参数
<ul><li>$0 对应的是当前 Shell 脚本程序的名称,</li><li>$#对应的是总共有几个参数,</li><li>$*对应的是所有位置的参数值,</li><li>$?对应的是显示上一次命令的执行返回值,</li><li>$1、$2、$3……则分别对应着第 N 个位置的参数值</li></ul>
判断用户的参数
系统在执行 mkdir 命令时会判断用户输入的信息,即判断用户指定的文件夹名称是否已经存在,如果存在则提示报错;反之则自动创建。Shell 脚本中的条<br>件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回非零值。
按照测试对象来划分,条件测试语句可以分为 4 种
<ul><li>文件测试语句</li><li>逻辑测试语句</li><li>整数值比较语句</li><li>字符串比较语句</li></ul>
文件测试所用的参数
<ul><li>-d 测试文件是否为目录类型</li><li>-e 测试文件是否存在</li><li>-f 判断是否为一般文件</li><li>-r 测试当前用户是否有权限读取</li><li>-w 测试当前用户是否有权限写入</li><li>-x 测试当前用户是否有权限执行</li></ul>
逻辑“与”的运算符号是&&
它表示当前面的命令执行成功后才会执行它后面的命令
逻辑“或”的运算符号为||
它在 Linux 系统中的,表示当前面的命令执行失败后才会执行它后面的命令
逻辑“非”的运算符号为!
在 Linux 系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。
<ul><li>&&是逻辑“与”,只有当前面的语句执行成功的时候才会执行后面的语句。</li><li>||是逻辑“或”,只有当前面的语句执行失败的时候才会执行后面的语句。</li><li>!是逻辑“非”,代表对逻辑测试结果取反值;之前若为正确则变成错误,若为错误则变成正确。</li></ul>
$USER = root ] && echo "user" || echo "root"
如果当前用户不是 root,则输出 "user",否则输出 "root"。
可用的整数比较运算符
<ul><li>-eq 是否等于</li><li>-ne 是否不等于</li><li>-gt 是否大于</li><li>-lt 是否小于</li><li>-le 是否等于或小于</li><li>-ge 是否大于或等于</li></ul>
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。
<ul><li>= 比较字符串内容是否相同</li><li>!= 比较字符串内容是否不同</li><li>-z 判断字符串内容是否为空</li></ul>
流程控制语句
if 条件测试语句
单分支结构
if 条件语句的单分支结构由 if、then、fi 关键词组成,而且只在条件成立后才执行预设的<br>命令,相当于口语的“如果……那么……”。
双分支结构
if 条件语句的双分支结构由 if、then、else、fi 关键词组成,它进行一次条件匹配判断,<br>如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令,相当于口<br>语的“如果……那么……或者……那么……”。
多分支结构
if 条件语句的多分支结构由 if、then、else、elif、fi 关键词组成,它进行多次条件匹配判
断,这多次判断中的任何一项在匹配成功后都会执行相应的预设命令,相当于口语的“如
果……那么……如果……那么……”。
for 条件循环语句
for 循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理。当要处理的<br>数据有范围时,使用 for 循环语句就再适合不过了。
while 条件循环语句
while 循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,<br>为假就结束循环。
case 条件测试语句
case 语句是在多个范围内匹<br>配数据,若匹配成功则执行相关命令并结束整个条件测试;如果数据不在所列出的范围内,<br>则会去执行星号(*)中所定义的默认命令。
<font color="#4ccbcd">/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删<br>除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。</font>
计划任务服务程序
一次性计划任务
今晚 23:30 重启网站服务
可以用 at 命令实现<br>这种功能,只需要写成“at 时间”的形式就行。
如果想要查看已设置好但还未执行的一次性<br>计划任务,可以使用 at -l 命令;要想将其删除,可以使用“atrm 任务序号”。
at 命令中的参数及其作用
<ul><li>-f 指定包含命令的任务文件</li><li>-q 指定新任务名称</li><li>-l 显示待执行任务的列表</li><li>-d 删除指定的待执行任务</li><li>-m 任务执行后向用户发邮件</li></ul>
长期性计划任务
每周一的凌晨 3:25 把/home/wwwroot 目录打包备份为 backup.tar.gz
Linux 系统中默认启用的 crond 服务
创建、编辑计划任务的命令为 crontab -e,查看当前计划任务的命令为 crontab -l,删除某条计划任务的命令为 crontab -r。另外,如<br>果您是以管理员的身份登录的系统,还可以在 crontab 命令中加上-u 参数来编辑他人的计划任务。
crontab 命令中的参数及其作用
<ul><li>-e 编辑计划任务</li><li>-u 指定用户名称</li><li>-l 列出任务列表</li><li>-r 删除计划任务</li></ul>
crond 服务设置任务的参数格式
“分、时、日、月、星期 命令”
需要注意的是,如果有些字段没有被设置,则需要使用星号( )占位
使用 crond 设置任务的参数字段说明<br>
<ul><li>分钟 取值为 0~59 的整数</li><li>小时 取值为 0~23 的任意整数</li><li>日期 取值为 1~31 的任意整数</li><li>月份 取值为 1~12 的任意整数</li><li>星期 取值为 0~7 的任意整数,其中 0 与 7 均为星期日</li><li>命令 要执行的命令或程序脚本</li></ul>
需要说明的是,除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、9 月和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的 12~15 日)。还可以用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔 2 分钟执行一次任务)。
<font color="#4ccbcd">尤其需要注意的是,在 crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用 whereis 命令进行查询。</font>
<font color="#4ccbcd">在 crond 服务的配置参数中,一般会像 Shell 脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。</font>
<font color="#4ccbcd">计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。</font>
用户身份与文件权限
用户身份与能力
用户身份
管理员UID为0:系统的管理员用户
系统用户UID为1-999:Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户UID从1000开始:是由管理员创建的用于日常工作的用户
<font color="#4ccbcd">另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳到其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。</font>
id 命令<br>
id 命令用于显示用户的详细信息,语法格式为“id 用户名”。
useradd 命令
useradd 命令用于创建新的用户账户,语法格式为“useradd [参数] 用户名”。
使用该命令创建用户账户时,默认的用户家目录会被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名<br>的基本用户组。
useradd 命令中的参数以及作用
<ul><li><font color="#f199c8">-d 指定用户的家目录(默认为/home/username)</font></li><li><font color="#f199c8">-e 账户的到期时间,格式为 YYYY-MM-DD.</font></li><li><font color="#f199c8">-u 指定该用户的默认 UID</font></li><li><font color="#f199c8">-g 指定一个初始的用户基本组(必须已存在)</font></li><li><font color="#f199c8">-G 指定一个或多个扩展用户组</font></li><li><font color="#f199c8">-N 不创建与用户同名的基本用户组</font></li><li><font color="#f199c8">-s 指定该用户的默认 Shell 解释器</font></li></ul>
groupadd 命令
groupadd 命令用于创建新的用户组,语法格式为“groupadd [参数] 群组名”。
usermod 命令
usermod 命令用于修改用户的属性,英文全称为“user modify”,语法格式为“usermod [参数] 用户名”。
usermod 命令中的参数以及作用
<ul><li><font color="#f199c8">-c 填写用户账户的备注信息</font></li><li><font color="#f199c8">-d -m 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去</font></li><li><font color="#f199c8">-e 账户的到期时间,格式为 YYYY-MM-DD</font></li><li><font color="#f199c8">-g 变更所属用户组</font></li><li><font color="#f199c8">-G 变更扩展用户组</font></li><li><font color="#f199c8">-L 锁定用户禁止其登录系统</font></li><li><font color="#f199c8">-U 解锁用户,允许其登录系统</font></li><li><font color="#f199c8">-s 变更默认终端</font></li><li><font color="#f199c8">-u 修改用户的 UID</font></li></ul>
passwd 命令
passwd 命令用于修改用户的密码、过期时间等信息,英文全称为“password”,语法格式为“passwd [参数] 用户名”。
passwd 命令中的参数以及作用
<ul><li><font color="#f199c8">-l 锁定用户,禁止其登录</font></li><li><font color="#f199c8">-u 解除锁定,允许用户登录</font></li><li><font color="#f199c8">--stdin 通过标准输入修改用户密码,如 echo "NewPassWord" | passwd --stdin Username</font></li><li><font color="#f199c8">-d 使该用户可用空密码登录系统</font></li><li><font color="#f199c8">-e 强制用户在下次登录时修改密码</font></li><li><font color="#f199c8">-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称</font></li></ul>
userdel 命令
userdel 命令用于删除已有的用户账户,英文全称为“user delete”,语法格式为“userdel [参数] 用户名”。
userdel 命令中的参数以及作用
<ul><li><font color="#f199c8">-f 强制删除用户</font></li><li><font color="#f199c8">-r 同时删除用户及用户家目录</font></li></ul>
文件权限与归属
在 Linux 系统中,每个文件都有归属的所有者和所属组,并且规定了文件的所有者、所用户身份与文件权限属组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。
对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序
对于目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。
可读、可写、可执行权限对应的命令在文件和目录上的区别
<ul><li><font color="#f199c8">可读(r) cat ls</font></li><li><font color="#f199c8">可写(w) vim touch</font></li><li><font color="#f199c8">可执行(x) ./script cd</font></li></ul>
文件权限的字符与数字表示
<font color="#4ccbcd">常见的文件类型包括普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)。</font>
<font color="#4ccbcd">普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及 Shell 脚本等,都属于普通文件。几乎在每个目录下都能看到普通文件(-)和目录文件(d)的身影。块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等,在/dev/目录中最为常见。</font>
文件的特殊权限
SUID
SUID 是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
SGID
SGID 特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
SGID 的第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文<br>件所有者的临时权限,而是获取到文件所属组的权限。
第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录<br>进行设置)
SBIT
SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录<br>中的文件就只能被其所有者执行删除操作了。
chmod 命令设置特殊权限的参数
<ul><li><font color="#f199c8">u+s 设置 SUID 权限</font></li><li><font color="#f199c8">u-s 取消 SUID 权限</font></li><li><font color="#f199c8">g+s 设置 SGID 权限</font></li><li><font color="#f199c8">g-s 取消 SGID 权限</font></li><li><font color="#f199c8">o+t 设置 SBIT 权限</font></li><li><font color="#f199c8">o-t 取消 SBIT 权限</font></li></ul>
SUID 和 SGID 的写法是,原先有执行权限则是小写 s,如果没有执行权限则是大写 S;而 SBIT 的写法则是,原先有执行权限是小写 t,没有执行权限是大写 T。
文件的隐藏属性
Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
既然叫隐藏权限,那么使用常规的 ls 命令肯定不能看到它的真面目。隐藏权限的专用设置命令是 chattr,专用查看命令是 lsattr。
chattr 命令
chattr 命令用于设置文件的隐藏权限,英文全称为 change attributes,语法格式为“chattr [参数] 文件名称”。
chattr 命令中的参数及其作用
<ul><li><font color="#f199c8">i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件</font></li><li><font color="#f199c8">a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)</font></li><li><font color="#f199c8">S 文件内容在变更后立即同步到硬盘(sync)</font></li><li><font color="#f199c8">s 彻底从硬盘中删除,不可恢复(用零块填充原文件所在的硬盘区域)</font></li><li><font color="#f199c8">A 不再修改这个文件或目录的最后访问时间(Atime)</font></li><li><font color="#f199c8">b 不再修改文件或目录的存取时间</font></li><li><font color="#f199c8">D 检查压缩文件中的错误</font></li><li><font color="#f199c8">d 使用 dump 命令备份时忽略本文件/目录</font></li><li><font color="#f199c8">c 默认将文件或目录进行压缩</font></li><li><font color="#f199c8">u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复</font></li><li><font color="#f199c8">t 让文件系统支持尾部合并(tail-merging)</font></li><li><font color="#f199c8">x 可以直接访问压缩文件中的内容</font></li></ul>
lsattr 命令
lsattr 命令用于查看文件的隐藏权限,英文全称为“list attributes”,语法格式为“lsattr [参数] 文件名称”。
文件访问控制列表
如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。
通俗来讲,基于普通文件或目录用户身份与文件权限设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准地派发权限。另外,如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL 权限;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL 权限。
setfacl 命令
setfacl 命令用于管理文件的 ACL 权限规则,英文全称为“set files ACL”,语法格式为“setfacl [参数] 文件名称”。
<font color="#e74f4c">ACL 权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制。</font>
setfacl 命令中的参数以及作用
<ul><li><font color="#f199c8">-m 修改权限</font></li><li><font color="#f199c8">-M 从文件中读取权限</font></li><li><font color="#f199c8">-x 删除某个权限</font></li><li><font color="#f199c8">-b 删除全部权限</font></li><li><font color="#f199c8">-R 递归子目录</font></li></ul>
<font color="#4ccbcd">常用的 ls 命令是看不到 ACL 信息的,但是却可以看到文件权限的最后一个点( )变成了加号( ),这就意味着该文件已经设置了 ACL。</font>
<font color="#e74f4c">如果我们不小心设置错了权限,就会覆盖掉文件原始的权限信息,并且永远都找不回来了。</font>
getfacl 命令
getfacl 命令用于查看文件的 ACL 权限规则,英文全称为“get files ACL”,语法格式为“getfacl [参数] 文件名称”。
需要注意,getfacl 在备份目录权限时不能使用绝对路径的形式,因此我们需要先切换到最上层根目录,然后再进行操作。
备份目录上的 ACL 权限时,可使用-R 递归参数
<font color="#f199c8">getfacl -R home > backup.acl</font>
ACL 权限恢复使用--restore 参数。由于在备份时已经指定是对/home目录进行操作,所以不需要写对应的目录名称,它能够自动找到要恢复的对象
<font color="#f199c8">setfacl --restore backup.acl</font>
su 命令与 sudo 服务
su 命令
可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户
授权原则:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo 命令用于给普通用户提供额外的权限,语法格式为“sudo [参数] 用户名”。
使用sudo命令可以给普通用户提供额外的权限来完成原本只有 root管理员才能完成的任务,可以限制用户执行指定的命令,记录用户执行过的每一条命令,集中管理用户与权限(/etc/sudoers),以及可以在验证密码后的一段时间无须让用户再次验证密码。
sudo 命令中的可用参数以及作用
<ul><li><font color="#f199c8">-h 列出帮助信息</font></li><li><font color="#f199c8">-l 列出当前用户可执行的命令</font></li><li><font color="#f199c8">-u 用户名或 UID 值 以指定的用户身份执行命令</font></li><li><font color="#f199c8">-k 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证</font></li><li><font color="#f199c8">-b 在后台执行指定的命令</font></li><li><font color="#f199c8">-p 更改询问密码的提示语</font></li></ul>
visudo 命令用于编辑、配置用户 sudo 的权限文件,语法格式为“visudo [参数]”。
这是一条会自动调用 vi 编辑器来配置/etc/sudoers 权限文件的命令,能够解决多个用户同时修改权限而导致的冲突问题。不仅如此,visudo 命令还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错提醒。
谁可以使用 允许使用的主机 = (以谁的身份)可执行命令的列表<br>
谁可以使用
稍后要为哪位用户进行命令授权。<br>
允许使用的主机
可以填写 ALL 表示不限制来源的主机,亦可填写如 192.168.10.0/24这样的网段限制来源地址,使得只有从允许网段登录时才能使用 sudo 命令。
以谁的身份
可以填写 ALL 表示系统最高权限,也可以是另外一位用户的名字。
可执行的列表
可以填写 ALL 表示不限制命令,亦可填写如/usr/bin/cat 这样的文件名称来限制命令列表,多个命令文件之间用逗号(,)间隔。
在每次执行 sudo 命令后都会要求验证密码,这个密码是当前登录用户的密码,可以添加 NOPASSWD 参数,使得用户下次执行 sudo 命令时不用密码验证
<font color="#f199c8">[root@linuxprobe~]# visudo<br>99 ## Allow root to run any commands anywhere<br>100 root ALL=(ALL) ALL<br>101 linuxprobe ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot</font>
存储结构与管理硬盘
一切从“/”开始
Linux 系统中常见的目录名称以及相应内容
<ul><li><font color="#f199c8">/boot 开机所需文件—内核、开机菜单以及所需配置文件等</font></li><li><font color="#f199c8">/dev 以文件形式存放任何设备与接口</font></li><li><font color="#f199c8">/etc 配置文件</font></li><li><font color="#f199c8">/home 用户主目录</font></li><li><font color="#f199c8">/bin 存放单用户模式下还可以操作的命令</font></li><li><font color="#f199c8">/lib 开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数</font></li><li><font color="#f199c8">/sbin 开机过程中需要的命令</font></li><li><font color="#f199c8">/media 用于挂载设备文件的目录</font></li><li><font color="#f199c8">/opt 放置第三方的软件</font></li><li><font color="#f199c8">/root 系统管理员的家目录</font></li><li><font color="#f199c8">/srv 一些网络服务的数据文件目录</font></li><li><font color="#f199c8">/tmp 任何人均可使用的“共享”临时目录</font></li><li><font color="#f199c8">/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等</font></li><li><font color="#f199c8">/usr/local 用户自行安装的软件</font></li><li><font color="#f199c8">/usr/sbin Linux 系统开机时不会使用到的软件/命令/脚本</font></li><li><font color="#f199c8">/usr/share 帮助与说明文件,也可放置共享文件</font></li><li><font color="#f199c8">/var 主要存放经常变化的文件,如日志</font></li><li><font color="#f199c8">/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里</font></li></ul>
路径
路径指的是如何定位到某个文件,分为绝对路径与相对路径。
绝对路径指的是从根目录(/)开始写起的文件或目录名称
相对路径则指的是相对于当前路径的写法
物理设备的命名规则
系统内核中的 udev 设备管理器会自动把硬件名称规范起来,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的设备文件。
常见的硬件设备及其文件名称
<ul><li><font color="#f199c8">IDE 设备 /dev/hd[a-d]</font></li><li><font color="#f199c8">SCSI/SATA/U 盘 /dev/sd[a-z]</font></li><li><font color="#f199c8">Virtio 设备 /dev/vd[a-z] </font>简单来说就是一种虚拟化设备</li><li><font color="#f199c8">软驱 /dev/fd[0-1]</font></li><li><font color="#f199c8">打印机 /dev/lp[0-15]</font></li><li><font color="#f199c8">光驱 /dev/cdrom</font></li><li><font color="#f199c8">鼠标 /dev/mouse</font></li><li><font color="#f199c8">磁带机 /dev/st0 或/dev/ht0</font></li></ul>
硬盘的分区编号
主分区或扩展分区的编号从 1 开始,到 4 结束
逻辑分区从编号 5 开始
/dev/目录中保存的应当是硬件设备文件;其次,sd 表示的是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备;最后,5 表示这个设备是一个逻辑分区。
<font color="#4ccbcd">硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表占用 64 字节,结束符占用 2 字节;其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。</font>
<font color="#4ccbcd">为了解决分区个数不够的问题,可以将第一个扇区的分区表中 16 字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用 16 字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用 3 个主分区加 1 个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于 4 个)的需求。</font>
<font color="#4ccbcd">所谓扩展分区,严格地讲它不是一个实际意义的分区,而仅仅是一个指向其他分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能存储数据,用户需要在其指向的对应分区(称之为逻辑分区)上进行操作。</font>
文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
Linux 系统支持数十种文件系统,常见的文件系统如下:
Ext2 :最早可追溯到 1993 年,是 Linux 系统的第一个商业级文件系统,它基本沿袭<br>了 UNIX 文件系统的设计标准。但由于不包含日志读写功能,数据丢失的可能性很大,<br>因此大家能不用就不用,或者顶多建议用于 SD 存储卡或 U 盘。<br>
Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,<br>然后再进行实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。Ext3 能够在<br>系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当<br>硬盘容量较大时,所需的修复时间也会很长,而且也不能 100%地保证资料不会丢失。
Ext4 :Ext3 的改进版本,作为 RHEL 6 系统中默认的文件管理系统,它支持的存储容<br>量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系<br>统能够批量分配 block(块),从而极大地提高了读写效率。现在很多主流服务器也会<br>使用 Ext4 文件系统。
XFS:是一种高性能的日志文件系统,而且是 RHEL 7/8 中默认的文件管理系统。它<br>的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大<br>的日志功能只需花费极低的计算和存储性能。它支持的最大存储容量为 18EB,这几<br>乎满足了所有需求。
在拿到一块新的硬盘存储设备后,先需要分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
Linux 系统中有一个名为 super block 的“硬盘地图”。Linux 并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整个文件系统的信息。因为如果把所有的文件内容都写入到这里面,它的体积将变得非常大,而且文件内容的查询与写入速度也会变得很慢。Linux 只是把每个文件的权限与属性记录在 inode 中,而且每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,里面记录着如下信息:
<ul><li><font color="#f199c8">➢ 该文件的访问权限(read、write、execute);</font></li><li><font color="#f199c8">➢ 该文件的所有者与所属组(owner、group);</font></li><li><font color="#f199c8">➢ 该文件的大小(size);</font></li><li><font color="#f199c8">➢ 该文件的创建或内容修改时间(Ctime);</font></li><li><font color="#f199c8">➢ 该文件的最后一次访问时间(Atime);</font></li><li><font color="#f199c8">➢ 该文件的修改时间(Mtime);</font></li><li><font color="#f199c8">➢ 文件的特殊权限(SUID、SGID、SBIT);</font></li><li><font color="#f199c8">➢ 该文件的真实数据地址(point)。</font></li></ul>
而文件的实际内容则保存在 block 块中(大小一般是 1KB、2KB 或 4KB),一个 inode 的默认大小仅为 128 字节,记录一个 block 则消耗 4 字节。当文件的 inode 被写满后,Linux 系统会自动分配出一个 block,专门用于像 inode 那样记录其他 block 块的信息,这样把各个 block块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的 block 块,有下面两种常见的情况(以 4KB 大小的 block 为例进行说明)。
<ul><li><font color="#f199c8">➢ 情况 1:文件很小(1KB),但依然会占用一个 block,因此会潜在地浪费 3KB。</font></li><li><font color="#f199c8">➢ 情况 2:文件很大(5KB),那么会占用两个 block(5KB−4KB 后剩下的 1KB 也要占用一个 block)</font></li></ul>
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用<br>关心底层的硬盘结构,Linux 内核中的软件层为用户程序提供了一个虚拟文件系统(Virtual File <br>System,VFS)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作<br>了。图 6-6 所示为 VFS 的架构示意图。从中可见,实际文件系统在 VFS 下隐藏了自己的特性<br>和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令<br>在任何文件系统中进行各种操作了(比如使用 cp 命令来复制文件)
挂载硬件设备
当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
挂载是在使用硬件设备前所执行的最后一步操作。
mount 命令
mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”
mount 命令中的参数以及作用
<ul><li><font color="#f199c8">-a 挂载所有在/etc/fstab 中定义的文件系统</font></li><li><font color="#f199c8">-t 指定文件系统的类型</font></li></ul>
blkid 命令
用于显示设备的属性信息,英文全称为“block id”,语法格式为“blkid [设备名]”。
mount UUID=478fRb-1pOc-oPXv-fJOS-tTvH-KyBz-VaKwZG /backup
让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”<br>写入到/etc/fstab 文件中。<br>
用于挂载信息的指定填写格式中,各字段所表示的意义
<ul><li><font color="#f199c8">设备文件 一般为设备的路径+设备名称,也可以写通用唯一识别码(UUID)</font></li><li><font color="#f199c8">挂载目录 指定要挂载到的目录,需在挂载前创建好</font></li><li><font color="#f199c8">格式类型 指定文件系统的格式,比如 Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等</font></li><li><font color="#f199c8">权限选项 若设置为 defaults,则默认权限为 rw、suid、dev、exec、auto、nouser、async</font></li><li><font color="#f199c8">是否备份 若为 1 则开机后使用 dump 进行磁盘备份,为 0 则不备份</font></li><li><font color="#f199c8">是否自检 若为 1 则开机后自动进行磁盘自检,为 0 则不自检</font></li></ul>
<font color="#4ccbcd">PS:建议在 fstab 文件挂载信息中加上_netdev 参数。加上后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况</font>
<font color="#ed77b6">/dev/sdb2 /backup ext4 defaults,_netdev 0 0</font>
df 命令
df 命令用于查看已挂载的磁盘空间使用情况,英文全称为“disk free”,语法格式为“df -h”。
umount 命令
umount 命令用于卸载设备或文件系统,英文全称为“un mount”,语法格式为“umount [设备文件/挂载目录]”。
lsblk 命令
sblk 命令用于查看已挂载的磁盘的空间使用情况,英文全称为“list block id”,输入该命令后按回车键执行即可。
添加硬盘设备
添加硬盘设备的操作思路
首先需要在虚拟机中模拟添加入一块新的硬盘存储设备,然后再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。
fdisk 命令
fdisk 命令用于新建、修改及删除磁盘的分区表信息,英文全称为“format disk”,语法格式为“fdisk 磁盘名称”。
fdisk 命令中的参数以及作用
<ul><li><font color="#ed77b6">m 查看全部可用的参数</font></li><li><font color="#ed77b6">n 添加新的分区</font></li><li><font color="#ed77b6">d 删除某个分区信息</font></li><li><font color="#ed77b6">l 列出所有可用的分区类型</font></li><li><font color="#ed77b6">t 改变某个分区的类型</font></li><li><font color="#ed77b6">p 查看分区表信息</font></li><li><font color="#ed77b6">w 保存并退出</font></li><li><font color="#ed77b6">q 不保存直接退出</font></li></ul>
partprobe
通知内核重新加载硬盘分区表,以便更新分区信息。当你在运行 fdisk 或其他分区工具后,对硬盘进行了分区的修改,而内核没有意识到这些变化时,你可以使用 partprobe 命令来通知内核重新读取分区表。
mkfs 命令
在对存储设备进行分区后还需要进行格式化操作。在 Linux 系统中用于格式化操作的命令是mkfs
<font color="#ed77b6">mkfs.xfs /dev/sdb1</font>
du 命令
du 命令用查看分区或目录所占用的磁盘容量大小,英文全称为“disk usage”,语法格式为“du -sh 目录名称”。
添加交换分区
交换(SWAP)分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。
只有当真实的物理内存耗尽后才会调用交换分区的资源。
<font color="#4ccbcd">PS:在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍</font>
mkswap 命令
对新设备进行交换分区格式化,英文全称为“make swap”,语法格式为“mkswap 设备名称”。
swapon 命令
激活新的交换分区设备,英文全称为“swap on”,语法格式为“swapon 设备名称”。
磁盘容量配额
使用 quota技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数
quota技术还有软限制和硬限制的功能
软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
RHEL 8 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 技术的支持,此时需要手动编辑配置文件并重启一次系统,让系统中的启动目录(/boot)能够支持 quota 磁盘配额技术。
xfs_quota 命令
xfs_quota 命令用于管理设备的磁盘容量配额,语法格式为“xfs_quota [参数] 配额 文件系统”。
这是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令。其中,-c 参数用于以参数的形式设置要执行的命令;-x 参数是专家模式,让运维人员能够对 quota服务进行更多复杂的配置。
edquota 命令
edquota 命令用于管理系统的磁盘配额,英文全称为“edit quota”,语法格式为“edquota [参数] 用户名”
edquota 命令中可用的参数以及作用
<ul><li><font color="#ed77b6">-u 对某个用户进行设置</font></li><li><font color="#ed77b6">-g 对某个用户组进行设置</font></li><li><font color="#ed77b6">-p 复制原有的规则到新的用户/组</font></li><li><font color="#ed77b6">-t 限制宽限期限</font></li></ul>
VDO(虚拟数据优化)
VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术。
VDO 针对各种类型文件的压缩效果
<font color="#ed77b6">文件名 描述 类型 原始大小KB 实际占用大小KB<br>dickens 狄更斯文集 英文原文 9953 9948<br>mozilla Mozilla 的 1.0 可执行文件 可执行程序 50020 33228<br>mr 医用 resonanse 图像 图片 9736 9272<br>nci 结构化的化学数据库 数据库 32767 10168<br>ooffice OpenOffice 1.01 DLL 可执行程序 6008 5640<br>osdb 基准测试用的 MySQL 格式示例数据库 数据库 9849 9824<br>reymont 瓦迪斯瓦夫·雷蒙特的图书 PDF 6471 6312<br>samba samba 源代码 src 源码 21100 11768<br>sao 星空数据 天文格式的bin文件 7081 7036<br>webster 辞海 HTML 40487 40144<br>xml XML 文件 HTML 5220 2180<br>x-ray 透视医学图片 医院数据 8275 8260</font><br>
首先,创建一个全新的 VDO 卷。新添加进来的物理设备就是使用 vdo 命令来管理的,其中 name 参数代表新的设备卷的名称;device 参数代表由哪块磁盘进行制作;vdoLogicalSize 参数代表制作后的设备大小。依据红帽公司推荐的原则,20GB 硬盘将翻成 200GB 的逻辑存储:
<font color="#4ccbcd">vdo create --name=storage --device=/dev/sdc --vdoLogicalSize=200G</font>
<font color="#4ccbcd">vdo status --name=storage</font>
使用 status 参数查看新建卷的概述信息;在输出信息中包含了 VDO 卷创建的时间、主机名、版本、是否压缩(Compression)<br>及是否删重(Deduplication)等关键信息。
<font color="#4ccbcd">mkfs.xfs /dev/mapper/storage</font>
对新建卷进行格式化操作
<font color="#4ccbcd">udevadm settle</font>
挂载前可以用 udevadm settle 命令对设备进行一次刷新操作,避免刚才的配置没有生效
<font color="#4ccbcd">mkdir /storage<br>mount /dev/mapper/storage /storage</font><br>
挂载使用
<font color="#4ccbcd">vdostats --human-readable</font>
查看设备的实际使用情况
软硬方式链接
软连接(soft link)
也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问题。从这一点来看,它与 Windows 系统的“快捷方式”具有一样的性质。
硬链接(hard link)
可以将它理解为一个“指向原始文件 block 的指针”,系统会创建出一个与原来一模一样的 inode 信息块。所以,硬链接文件与原始文件其实是一模一样的,只是名字不同。每添加一个硬链接,该文件的 inode 个数就会增加 1;而且只有当该文件的 inode 个数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 block 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,<font color="#ed77b6">不能跨分区对目录文件进行硬链接。</font>
ln 命令
ln 命令用于创建文件的软硬链接,英文全称为“link”,语法格式为“ln [参数]原始文件名 链接文件名”。
ln 命令中可用的参数以及作用
<ul><li><font color="#4ccbcd">-s 创建“符号链接”(如果不带-s 参数,则默认创建硬链接)</font></li><li><font color="#4ccbcd">-f 强制创建文件或目录的链接</font></li><li><font color="#4ccbcd">-i 覆盖前先询问</font></li><li><font color="#4ccbcd">-v 显示创建链接的过程</font></li></ul>
使用RAID与LVM磁盘阵列技术
RAID(独立冗余磁盘阵列)
RAID 0、1、5、10 方案技术对比
RAID级别<br>0 2 n n 低 追求最大容量和速度;但是任何一块硬盘损坏,数据将全部异常<br>1 2 n/2 n 高 追求最大安全性,只要阵列中有一块硬盘可用,数据就不受影响<br>5 3 n-1 n-1 中在控制成本的前提下,追求硬盘的最大容量、速度及安全性,允许有一块硬盘出现异常,且数据不受影响<br>10 4 n/2 n/2 高综合 RAID 1 和 RAID 0 的优点,追求硬盘的速度和安全性,允许有一半硬盘出现异常(不可发生在同一阵列中),且数据不受影响<br>
RAID 0
RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入各个物理硬盘中。这样一来,在最理想的状态下,硬盘设备的读写性能会提升数倍,但是若任意一块硬盘发生故障,将导致整个系统的数据都受到破坏。
RAID 1
把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用。
RAID 5
RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5 磁盘阵列中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上。
RAID 10
RAID 10 技术需要至少 4 块硬盘来组建,其中先分别两两制作成 RAID 1 磁盘阵列,以保证数据的安全性;然后再对两个 RAID 1 磁盘阵列实施 RAID 0 技术,进一步提高硬盘设备的读写速度。这样从理论上来讲,只要坏的不是同一阵列中的所有硬盘,那么最多可以损坏 50%的硬盘设备而不丢失数据。由于于 RAID 10 技术继承了 RAID 0 的高读写速度和 RAID 1 的数据安全性,在不考虑成本的情况下 RAID 10 的性能也超过了 RAID 5,因此当前成为广泛使用的一种存储技术。
RAID 01
将硬盘分为两组,然后使用 RAID 0 作为最低级别的组合,再将这两组 RAID 0 硬盘通过 RAID 1 技术组合到一起。RAID 10 技术和 RAID 01 技术的区别非常明显。在 RAID 10 中,任何一块硬盘损坏都不会影响到数据安全性,其余硬盘均会正常运作。但在 RAID 01 中,只要有任何一块硬盘损坏,最低级别的 RAID 0 磁盘阵列马上会停止运作,这可能造成严重隐患。所以 RAID 10 远比 RAID 01 常见,很多主板甚至不支持 RAID 01。
部署磁盘阵列
mdadm命令<br>
mdadm 命令用于创建、调整、监控和管理 RAID 设备,英文全称为“multiple devices <br>admin”,语法格式为“mdadm参数 硬盘名称”。
mdadm 命令中的常用参数及作用
<font color="#4ccbcd">-a 检测设备名称 <br>-n 指定设备数量 <br>-l 指定RAID级别 <br>-C 创建 <br>-v 显示过程 <br>-f 模拟设备损坏 <br>-r 移除设备 <br>-Q 查看摘要信息 <br>-D 查看详细信息 <br>-S 停止RAID磁盘阵列</font>
本次实验在centos7.9中默认没有这个工具,可以通过Yum直接安装即可
mdadm -Cv /dev/md0 -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
创建一个raid,名称是md0 ,指定raid使用raid10的方案、指定使用四块盘来创建<br><br>
mdadm -Q /dev/md0
查看简要信息<br><br>
mkfs.ext4 /dev/md0
将做好的md0RAID磁盘阵列格式化为Ext4格式
创建挂载点并挂载使用<br><br>
mdadm -D /dev/md0
查看/dev/md0磁盘阵列设备的详细信息<br><br>
确认RAID级别(Raid Level)、阵列大小<br>(Array Size)和总硬盘数(Total Devices)
echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
息添加到/etc/fstab 开机自启动
损坏磁盘阵列及修复
mdadm /dev/md0 -f /dev/sdb
模拟磁盘sdb损坏
mdadm -D /dev/md0
再次查看磁盘阵列信息<br><br>
磁盘阵列+备份盘
mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
参数-n 3代表创建这个 RAID 5 磁盘阵列所需的硬盘数
参数-l 5 代表 RAID 的级别
参数-x 1 则代表有一块备份盘
删除磁盘阵列
需要将所有的磁盘都设置成停用状态
umount /RAID
mdadm /dev/md0 -f /dev/sdc
mdadm /dev/md0 -f /dev/sdd
mdadm /dev/md0 -f /dev/sde
然后再逐一移除出去
mdadm /dev/md0 -r /dev/sdb
mdadm /dev/md0 -r /dev/sdc
mdadm /dev/md0 -r /dev/sdd
mdadm /dev/md0 -r /dev/sde
查看磁盘阵列组的状态
mdadm -D /dev/md0
停用整个 RAID 磁盘阵列
mdadm --stop /dev/md0
ls /dev/md0
mdadm --remove /dev/md0
在有一些老版本的服务器中,在使用--stop 参数后依然会保留设备文件。这很明显是没有处理
干净,这时再执行一下
LVM(逻辑卷管理器)
释义
LVM 是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为
了解决硬盘设备在创建分区后不易修改分区大小的缺陷。
LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。
物理卷处于 LVM 中的最底层,可以将其理解为物理硬盘、硬盘分区或者 RAID 磁盘阵列。卷组建立在物理卷之上,一个卷组能够包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是 LVM 的核心理念。<br>
部署逻辑卷<br>
常用的 LVM 部署命令
创建物理卷
<font color="#4ccbcd">创建物理卷的操作,可以将该操作简单理解成让硬盘设备支持LVM技术,或者理解成是把硬盘设备加入到LVM技术可用的硬件资源池中,然后对这两块硬盘进行卷组合并,卷组的名称可以自己自定义。</font>
步骤
pvcreate /dev/sdb /dev/sdc
1、让新添加的两块硬盘设备支持 LVM 技术。
vgcreate storage /dev/sdb /dev/sdc
2、把两块硬盘设备加入到 storage 卷组中,然后查看卷组的状态。
lvcreate -n vo -l 37 storage
3、切割出一个约为 150MB 的逻辑卷设备。
<font color="#4ccbcd">PS:这里需要注意切割单位的问题。在对逻辑卷进行切割时有两种计量单位。第一种是以容<br>量为单位,所使用的参数为-L。例如,使用-L 150M 生成一个大小为 150MB 的逻辑卷。另外<br>一种是以基本单元的个数为单位,所使用的参数为-l。每个基本单元的大小默认为 4MB。例<br>如,使用-l 37 可以生成一个大小为 37×4MB=148MB 的逻辑卷。</font>
mkfs.ext4 /dev/storage/vo<br>mkdir /linuxprobe<br>mount /dev/storage/vo /linuxprobe<br>
4、把生成好的逻辑卷进行格式化,然后挂载使用。
<font color="#4ccbcd">PS:Linux 系统会把 LVM 中的逻辑卷设备存放在/dev 设备目录中(实际上就是个快捷方式),<br>同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组名称/<br>逻辑卷名称)。</font>
<font color="#e74f4c">PS:如果使用了逻辑卷管理器,则不建议用 XFS 文件系统,因为 XFS 文件系统自身<br>就可以使用 xfs_growfs 命令进行磁盘扩容。这虽然不比 LVM 灵活,但起码也够用。在实测阶<br>段我们发现,在有一些服务器上,XFS 与 LVM 的兼容性并不好。</font>
df -h<br>echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab<br>cat /etc/fstab<br>
查看挂载状态,并写入配置文件,使其永久生效。
<font color="#4ccbcd">PS:刚刚明明写的是 148MB,怎么这里只有140MB 了呢?这是因为硬件厂商的制造标准是 1GB=1,000MB、1MB=1,000KB、1KB=1,000B,而计算机系统的算法是 1GB=1,024MB、1MB=1,024KB、1KB=1,024B,因此有 3%左右的“缩水”是正常情况。</font>
实验
lvcreate -n test-vp -L 20G test
切割出一个约为 20G的逻辑卷设备。<br>test-vp是这个逻辑卷设备的名称<br>test是这个逻辑卷组的名称
扩容逻辑卷
<font color="#e74f4c">扩容前请一定要记得卸载设备和挂载点的关联。</font>
umount /linuxprobe
步骤
1、把上一个实验中的逻辑卷 vo 扩展至 290MB。
lvextend -L 290M /dev/storage/vo
2、检查硬盘的完整性,确认目录结构、内容和文件内容没有丢失。一般情况下没有报错,均为正常情况。
e2fsck -f /dev/storage/vo
3、重置设备在系统中的容量。刚刚是对 LV(逻辑卷)设备进行了扩容操作,但系统内核还没有同步到这部分新修改的信息,需要手动进行同步。
resize2fs /dev/storage/vo
4、重新挂载硬盘设备并查看挂载状态。
mount -a<br>df -h<br>
缩小逻辑卷
<font color="#e74f4c">PS:相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,数据丢失的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外,Linux 系统规定,在对 LVM 逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证数据的安全)。</font>
在执行缩容操作前记得先把文件系统卸载掉。
umount /linuxprobe
步骤
1、检查文件系统的完整性。
e2fsck -f /dev/storage/vo
2、通知系统内核将逻辑卷 vo 的容量减小到 120MB。
resize2fs /dev/storage/vo 120M
<font color="#4ccbcd">这里与扩容不太一样,缩容是先通知内核我要缩容了,如果没有报错,这样才可以再缩容</font>
3、将 LV(逻辑卷)的容量修改为 120MB。
lvreduce -L 120M /dev/storage/vo
4、重新挂载文件系统并查看系统状态。
mount -a<br>df -h<br>
<font color="#e855a4">PS:mount -a 命令会根据/etc/fstab文件中的配置,挂载那些标记为自动挂载的文件系统。/etc/fstab文件包含了系统上的文件系统列表以及它们应该如何挂载的信息。</font>
逻辑卷快照
释义
LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。
LVM 的快照卷功能有两个特点
<font color="#e74f4c">快照卷的容量必须等同于逻辑卷的容量</font>
<font color="#e74f4c">快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除</font>
步骤
1、在正式操作前,先看看 VG(卷组)中的容量是否够用
vgdisplay
2、用重定向往逻辑卷设备所挂载的目录中写入一个文件
echo "Welcome to Linuxprobe.com" > /linuxprobe/readme.txt
ls -l /linuxprobe
3、使用-s 参数生成一个快照卷,使用-L 参数指定切割的大小,需要与要做快照的设备容量保持一致。
另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作,稍后数据也会还原到这个相应的设备上。
lvcreate -L 120M -s -n SNAP /dev/storage/vo
lvdisplay
4、在逻辑卷所挂载的目录中创建一个 100MB 的垃圾文件,然后再查看快照卷的状态。可以发现存储空间的占用量上升了。
dd if=/dev/zero of=/linuxprobe/files count=1 bs=100M
lvdisplay
5、为了校验快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
lvconvert 命令用于管理逻辑卷的快照,语法格式为“lvconvert [参数]快照卷名称”。
<font color="#4ccbcd">PS:使用 lvconvert 命令能自动回复逻辑卷的快照,在早期的 RHEL/CentOS 5 版本中要写全格式:“--mergesnapshot”,而从 RHEL 6 到 RHEL 8,已经允许用户只输入--merge 参数进行操作了,系统会自动分辨设备的类型。</font>
umount /linuxprobe<br>
lvconvert --merge /dev/storage/SNAP
6、快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的 100MB 的垃圾文件也被清除了。
mount -a<br>cd /linuxprobe/<br>ls<br>cat readme.txt<br>
删除逻辑卷
注意点
<font color="#e74f4c">提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒。</font>
在上述操作执行完毕之后,再执行 lvdisplay、vgdisplay、pvdisplay 命令来查看 LVM 的信息时就不会再看到相关信息了(前提是上述步骤的操作是正确的)。
步骤
1、取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
umount /linuxprobe
2、删除逻辑卷设备,需要输入 y 来确认操作。<br>
lvremove /dev/storage/vo
3、删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。<br>
vgremove storage
4、删除物理卷设备。
pvremove /dev/sdb /dev/sdc
使用iptables与firewalld防火墙
使用SSH服务管理远程主机
使用Apache服务部署静态网站
使用vsftpd服务传输文件
使用Samba或NFS实现文件共享
使用BIND提供域名解析服务
使用DHCP动态管理主机地址
使用Postfix与Dovecot部署邮件系统
使用Ansible服务实现自动化运维
使用iSCSI服务部署网络存储
使用MariaDB数据库管理系统
使用PXE+Kickstart无人值守安装服务
使用LNMP架构部署动态网站环境
0 条评论
下一页