安装虚拟机。
1.新建虚拟机
2.点击首页的创建新的虚拟机,或者点击标签栏“文件”下面的新建虚拟机
3.选择自定义,可以自己按照喜好设置虚拟机的配置。点击下一步
4.兼容性按照默认就好。点击下一步
5.选择稍后安装操作系统,点击下一步。(选择稍后安装系统,就是在这里如果直接选择镜像文件去安装的话,虚拟机会使用内置的安装向导自动进行安装,最终安装出来的系统和我们后续进行实验所需的系统环境有可能会不同)
6.选择Linux操作系统,版本为Red Hat Enterprise Linux 8 64 位,点击下一步
7.设置虚拟机名称以及安装位置,点击下一步
8.可选择虚拟机的CPU数量以及CPU核数(这个在任务管理器的性能中可以查看一下自己真实的物理机的一个情况然后在设置,不过我们目前要求不高,设置为1即可),完成后点击下一步
9.选择虚拟机的内存,依个人需求而定。点击下一步
10.选择网络连接类型,这里有三种方式。
使用桥接网络:相当于在物理机和虚拟机之间构建了一个桥梁,从而可以通过物理机的网卡访问外网。
使用网络地址转换(NAT):让虚拟的网络服务发挥路由器的作用,使得通过虚拟机软件模拟的主机可以通过物理主机访问外网,在物理机上对应的网卡是VMnet8。
使用仅主机模式网络:仅仅让虚拟机的系统与物理主机进行通信,不能访问外网,在物理机上对应的网卡是VMnet1。
这里选择NAT,点击下一步
11.选择I/O控制器类型,默认即可。点击下一步
12.选择虚拟磁盘类型,默认即可。点击下一步
13.选择磁盘,建议使用创建新磁盘。如现有虚拟磁盘也可以选择第二项,不建议直接使用物理磁盘。点击下一步
14.设置磁盘大小,40即可,其他保持默认。点击下一步
15.设置磁盘文件的名称,直接下一步即可
16.虚拟机至此已经创建成功,点击完成即可。接下来开始安装操作系统,通过虚拟光驱安装。
17.点击图中的CD/DVD,设置光盘文件
18.点击开启此虚拟机
19.鼠标点进去,用键盘选择第一项,Install Red Hat Enterprise Linux 8.0.0。等待界面加载完成
20..图示为每一项的中文意思,KDUMP是一个系统崩溃时收集信息的工具,如果系统用于练习则不需要开启。
21.键盘和语言看个人喜好修改,建议英文。时区修改为上海,点击Done(完成)
22.安装源默认为光盘,无需修改。软件选择Server with GUI(带有图形化界面)。
23.安装位置选择磁盘,选中automatic,点击确定更改磁盘。。
24.直接点击Begin Installation(开始安装)
25.安装过程中,需要为Root用户设置密码,并创建一个普通用户
26.如果设置的密码为弱密码,则需要点两次确定。
27.设置用户名密码,同样,弱密码需要确认两次。设置完成后等待安装成功
28.安装成功后点击Reboot(重启)
重置密码
#第一步重启系统,然后按键盘的下键将白色条放到第二行上输入e
#第二步在linux开头那一行尾部添加rd.break,然后使用ctrl+x继续后面
#第三步输入输入mount查看设备挂载信息(主要看/sysroot目录挂载权限)
接着输入mount -o remount,rw /sysroot目录重新挂载已经挂载的设备,并以其他的权限挂载,这里我们需要rw权限
#第四步输入chroot /sysroot/ ,使用chroot命令改变系统的根目录的位置,将其改到/sysroot之后就可以进行密码修改
#第五步passwd root 输入两次密码
#第六步输入touch /.autorelabel
#第七步两次输入exit完成root密码重置
远程连接xshell
ssh root@192.168.62.129
(如果输入密码的时候服务器一直拒绝,则需要在虚拟机中打开bash)
输入:vim /etc/ssh/sshd_config
进入后输入/Root 匹配后删掉这一行的#键,将后面的内容删掉改为yes,如图
改完后:wq保存退出,输入 systemctl restart sshd
然后再去重新远程链接一下。
reboot 重启 shutdown -r now 重启
shutdown -h now 关机 poweroff 关机
ip a ifconfig 查看IP地址
查看当前linux的发行版本:cat /etc/redhat-release
查看内核版本:uname -r
查看shell类型:cat /etc/shells chsh -l
查看当前的默认shell类型:echo $SHELL
linux的命令格式
命令名称 [命令参数] 命令对象
命令名称:我们可以把它认为是语法中的动词,意思就是我们想要做的事。
命令参数:对命令进行调整,让“修改”过的命令更好的去贴合工作需求。
命令对象:一般指要处理的文件、目录、用户等资源名称。其实就是你这个动作面对的对象。例如:创建一位叫小明的用户,查看一个叫工资表的文件。
在这里要强调一件事,就是我们的命令名称 [命令参数] 命令对象之间要用空格隔开,并且字母要严格的区分大小写。
#### 常用快捷键
Tab 键:在它能够实现对命令、参数或文件的内容补全。
Ctrl+C 组合键:当同时按下键盘上的 Cirl 和字 C 的时候,意味着终止当前进程的运行。
Ctrl+D 组合键:当同时按下盘上的Ctrl 和 D的时候,表示键盘输入结束
Ctr+l 组合键:当同时按下键盘上行的 Cirl 和l的时候,会清空当前终端中已有的内容(相当于清屏操作 )。
解释[root@localhost ~]#
#是一个标识符,标识的是当前用户是root、或者说当前用户的编号UID为0.
当方括号后面跟的是$,标识的是当前用户是一个普通用户。
**在这边要强调一件事,除了root之外,其余的都是普通用户,也就是其余的都是$。**
root:就是咱说的那个特殊用户,也就是管理员,也叫作超级管理员,根用户。
@:表示的是分隔符,分隔用户和主机的。
localhost:本意表示的是当前主机,也表示的是主机名。
将他们连起来root@localhost表示的是当前root这个用户在localhost这个主机上。
~:表示的是当前用户的家目录。切换成不同用户虽然后面跟的都是~,但是意义是不一样的。
家目录其实是存放用户个人数据的地方
Root用户的家目录是:/root
其他用户的家目录是:/home/username,例如用户rhcsa的家目录是/home/rhcsa
LS(英文全拼: list directory contents):命令用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。
如果指定,则列出指定目录;如果没有指定,则列出当前目录。
指定列出root用户下的内容:`[root@localhost ~]# ls /root`
不指定列出:`[root@localhost ~]# ls`
-l :以长格形式显示文件和目录的详细信息(包括权限、所有者、大小、创建时间等),ls命令默认只显示名称的短格式。
-a:显示所有子目录和文件的信息,包括名称以“.”开头的隐藏目录和隐藏文件。
-A:与-a选项的作用类似,但不显示表示当前目录的“.”和表示父目录的“..”。
-h:以更人性化的方式显示出目录或文件的大小,默认的大小单位为字节,使用-h选项后将显示为K、M等单位。此选项需要和-l选项结合使用才能体现出结果。
-d:只列出目录(不递归列出目录内的文件)。
#### 文件系统
Linux以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。而这些种类繁多的文件被Linux使用目录树进行管理, 所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。
filesystem hierarchy standard文件系统层级标准,定义了在类Unix系统中的目录结构和目录内容,即让用户了解到已安装软件通常放置于哪个目录下。
**Linux目录结构的特点**
- 使用树形目录结构来组织和管理文件。
- 整个系统只有一个根目录(树根),Linux的根目录用“/”表示
- 其他所有分区以及外部设备(如硬盘、光驱等)都是以根目录为起点,挂接在目录树的某个目录中的,通过访问挂载点目录,即可实现对这些分区的访问。
**/bin**
这个其实是快捷方式,只不过在Linux中叫做软链接,他还有一个标准名称叫做符号链接。bin -> usr/bin的意思是打开bin是 usr/bin的快捷方式,打开bin的时候,其实打开的是usr下面的bin。
bin 是 Binaries (二进制文件) 的缩写, 这个目录里面存放着可执行的程序。
**/boot:**
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。(其实就是引导你的操作系统启动,然后你可以在你的操作系统上去完成工作),所以它很重要不能删除。
**/dev:**
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备(例如光驱呀),在 Linux 中访问设备的方式和访问文件的方式是相同的。
**/etc:**
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。(配置文件是以纯文本的形式进行描述的,纯文本就是用记事本来编辑、修改,它的好处在于我不需要其他花里胡哨的工具,我只需要在Linux下有一个和Windows下的记事本一样的工具,我就可以打开配置文件进行修改)
**/home:**
普通用户的家目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
/root:root用户的家目录
**/lib:**
lib 是 Library(库) 的缩写,这个目录里存放着系统最基本的动态连接共享库,它的库是32位的库,其作用类似于 Windows 里的 DLL 文件(在c盘,Windows目录下可以看到,DLL文件是不能直接执行的,需要可执行的文件进行调用)。几乎所有的应用程序都需要用到这些共享库。
**/lib64:**
lib 是 Library(库) 的缩写,这个目录里存放着系统最基本的动态连接共享库,它的库是64位的库.
**/media:挂载点目录**
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
**/mnt:挂载点目录**
什么是挂载点那?就是光盘放进光驱后,必须要将设备关联到当前文件系统树上的某个节点上,才能进行访问,把某个设备和当前文件系统上某个目录进行关联的这个过程,就叫做挂载。在Windows中不同的盘是不同的分区,如果插入一个优盘,则会单独的形成一个分区,在Linux中是全部都在根下面的,所以系统会提供一个目录,让用户临时去挂载别的文件系统。该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。
**/opt:**
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
**/sbin:**
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。其实就是超级管理员能够用到的一些命令。
**/srv:**
第三方服务,该目录存放一些服务启动之后需要提取的数据。
**/tmp:**
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。大家就是不要把我们会用到放到这个目录里面,因为这个目录里面的东西隔一段时间就会清理。
**/usr:**
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
**/var:**
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
**/run:**
是一个临时文件系统,存储系统启动以来的信息(存放应用程序的守护进程)。
**/proc:**
proc 是 Processes(进程) 的缩写,程序是由源代码生成的可执行的文件,程序执行后形成了进程,进程的本质是内存中的东西,会占用内存资源。Proc存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。大家要记住这个目录的内容不在硬盘上而是在内存里.
路径
路径:它指的是从指定起始点到目的地所经过的位置。它可以实现层次化的文件管理,层次化的目的就是可以实现快速追溯文件。
绝对路径:以根开头的路径:/root/bin。
相对路径:不以根开头的路径:bin
pwd命令
pwd(英文全拼:print work directory): 命令用于显示工作目录。
执行 pwd 指令可立刻得知咱目前所在的工作目录的绝对路径名称。
`[root@localhost ~]# pwd`
su命令
su(英文全拼:switch user)命令用于变更为其他使用者的身份,管理员切换到任意身份都不需要密码验证,而任意身份切换到管理员都需要密码验证。
加上-是因为可以在切换身份的同时将用户的环境变量和身份权限全部获取
[root@localhost ~]# su - rhcsa
如果不加-的切换身份,我们是没有权限去列出里面的内容的
`[root@localhost ~]# su rhcsa`
这边要给大家提示一下,就是你每切换个用户,记得一定要退出当前的用户然后再去做别的操作
Cd(英文全拼:change directory)命令用于切换当前工作目录。**
如果直接写cd表示切换到当前用户的家目录:[root@localhost ~]# cd
切换到相对路径:[root@localhost ~]# cd test1
切换到绝对路径:[root@localhost ~]# cd /etc
cd -:表示切换到上一次切换的目录
cd ~:表示切换到当前用户的家目录
cd .. :表示切换到上一级目录
在linux中去查看帮助文档
1、查看bash内部命令帮助
[root@node13 ~]# help cd
2、命令 --help
[root@node13 ~]# cat ——help
示例如下:cat [OPTION]... [FILE]... 表明cat后面可以加上多个可选的选项以及多个可选的文件参数
3、man,它是manual的缩写,使用方式:man 命令名称。用来提供在线帮助,使用权限是所有用户。使用man命令可以调阅其中的帮助信息,非常方便实用。
man command [root@node13 ~]# man ls
在man命令帮助信息的界面中,所包含的常用操作按键如下:
按键 | 作用 |
空格键,PaGe down | 向下翻一页 |
PaGe up,b | 向上翻一页 |
home | 直接前往首页 |
end | 直接前往尾页 |
/ | 从上至下搜索某个关键词,如“/linux” |
? | 从下至上搜索某个关键词,如“?linux” |
n | 定位到下一个搜索到的关键词 |
N | 定位到上一个搜索到的关键词 |
q | 退出帮助文档 |
man命令的帮助信息的结构如下:
结构名称 | 代表意义 |
NAME | 命令的名称 |
SYNOPSIS | 参数的大致使用方法 |
DESCRIPTION | 介绍说明 |
EXAMPLES | 演示(附带简单说明) |
OVERVIEW | 概述 |
DEFAULTS | 默认的功能 |
OPTIONS | 具体的可用选项(带介绍) |
ENVIRONMENT | 环境变量 |
FILES | 用到的文件 |
SEE ALSO | 相关的资料 |
HISTORY | 维护历史与联系方式 |
man手册的几个部分
区段1:用户指令,查看命令的帮助
区段2:系统调用,查看可被内核调用的函数的帮助
区段3:程序库调用,查看函数和函数库的帮助
区段4:设备,查看特殊文件的帮助(主要是/dev目录下的文件)
区段5:文件格式,查看配置文件的帮助
区段6:游戏,查看游戏的帮助
区段7:杂项,惯例与协议等,例如Linux文件系统、网络协议、ASCII code等等的说明
区段8:系统指令,查看系统管理员可用的命令的帮助
区段9:内核内部指令,查看内核相关文件的帮助
4、info page
info与man的用途其实差不多,都是用来查询命令的用法或者是文件的格式。
[root@node13 info]# info info
关于时间的几个命令
**date命令**用于显示或设置系统的时间与日期,
语法格式为:` date [OPTION]... [+FORMAT]`
用户只需在强大的date命令后输入以 `+` 号开头的参数,即可按照指定格式来输出系统的时间或日期
date命令中的参数以及作用
| 参数 | 作用 |
| ---- | ---------------------- |
| %Y | 完整年份(例如:2020) |
| %m | 月份(1~12) |
| %d | 本月中的第几天 |
| %H | 小时(00~23) |
| %M | 分钟(00~59) |
| %j | 今年中的第几天 |
查看当前系统时间的date命令如下所示:
[root@kongd ~]# date
Sat Sep 5 09:13:45 CST 2020
date命令中的参数%j可用来查看今天是当年中的第几天。
[root@kongd ~]# date "+%j"
306
设置时间:date -s “年月日 时:分:秒“
date 月日时分年
clock,它是用来调整硬件时间的。
hwclock(hardware clock)命令用于显示与设定硬件时钟,在这我们需要了解它的三个参数.
-r or hwclock --show 查看时间
-w or hwclock --systohc 将系统时间同步到硬件时间
-s or hwclock --hctosys 将硬件时间写到系统内
### cal命令
日历的英文:Calendar
cal命令的作用是显示日历。
示例一:显示当月日历 ``[root@localhost ~]# cal`
示例二:显示2022年八月份的日历,cal 8 2022,先是月份,再是年份
``[root@localhost ~]# cal 8 2022`
示例三:显示2022年整年日历 `[root@localhost ~]# cal 2022`
文件命名规则
(1)不能使用/来当文件名,/是用来做根的,也是用来做路径分隔符的
(2)文件名不能超过255个字符
(3)区分大小写file File FILE fIle
(4)目录也是文件,在同一路径下,两个不同类型文件不能同名
- rw-------. 1 root root 1310 Feb 17 22:42 anaconda-ks.cfg
- 所在标记位说明 文件类型
- 标记的是普通文件/一般文件(不是其他类型的文件,这个里面大部分都是纯文本文件,不过有些可执行文件不是文本的)
d 标记的是目录文件(你看咱这个里面是D的是蓝色标签)
l 标记的是软链接的文件,link 符号链接,也是快捷方式.
b 块设备文件,块设备是以数据块为单位的存储设备,比如文件系统所在的硬盘,一般叫做文件系统块,也可以把它叫做随机存储的设备。
c 字符设备,以字符为单位存储的,按照顺序进行存储。例如ABC输入,存储也按照ABC存储。
p pipiline 管道文件,大家可以把它理解为水管
s socket 套接字文件,IP地址+端口号
软硬链接
文件,都有文件名和数据。这在Linux上被分为两部分:
- - 用户数据,即文件数据块(data block),数据块是记录文件真实内容的地方
- - 元数据,是文件的附加属性,如文件大小、创建时间、所有者等信息。
在Linux中,元数据中的`inode`号(inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)才是文件的唯一标识而不是文件名。(例如对一个文件重命名(mv)但inode号仍相同)。
Linux中,文件名仅仅是为了方便人们的记忆和使用,系统或程序通过`inode`号寻找正确的文件数据块。
为了解决文件的共享使用,Linux系统提供一种文件:链接文件,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。
硬链接,以文件副本的形式存在,所有的硬链接都指向同一个iNode X,他们都享有同一个inode X和一个数据块(data block)。但硬链接本身并不占用实际存储空间。
就像是:一个文件(file)拥有多个文件名一样(file-硬链接1,file-硬链接2...)
每增加一个硬链接,只是增加一个计数。这个可以用ls -l查看。
root@nat1 ~]# ls -l useful*.sh
-rwxr-xr-x. 2 root root 436 Jul 19 2022 useful_hd.sh
-rwxr-xr-x. 2 root root 436 Jul 19 2022 useful.sh
```因此,修改任何一个硬链接文件,都会改变文件内容。
删除任何一个硬链接文件并不影响其他相同的inode号的文件。直到删除所有硬链接和源文件,才能删除该文件。
硬链接特性:
1。只能对已存在的文件进行创建(必须事先要有一个原始文件)
2。 硬链接必须在同一个文件系统里创建
3。不能对**目录**进行创建
软链接特点:
1. 软链接(file-软链接1)本身是一个单独的文件,拥有自己的inode Y 和自己的数据块。因此拥有自己的文件属性和权限。 最大的特点是:明确自己是符号链接文件,并存放了指向源文件(file)的inode X.
2. 创建软链接时候,链接计数i_nlink不会增加。只是强调自己是"l" (软链接)
[root@nat1 bin]# ls -l | grep ^l
lrwxrwxrwx. 1 root root 6 Jun 28 2022 apropos -> whatis
lrwxrwxrwx. 1 root root 4 Jun 28 2022 awk -> gawk
软链接特性:
1。 可对不存在的目录和文件创建软链接
2。 可以对存在的文件或目录建软链接
3。 可以跨文件系统创建软链接
4。 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软链接被称为死链接(即dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
5。 软链接创建时原文件的路径指向使用绝对路径较好,相对路径的话原文件移除后可能会成为死链接。
然后我们来看下怎么去创建软连接和硬链接
创建软链接
创建硬链接时 ln 命令不带任何参数,但是要创建软链接需要加上 -s 参数
ln -s file1 file3
用 ls -i 查看inode号
第一个标记位了解完后我们再来看后面的。将这一块分为四部分去看,分别对应ABCD去了解
rw- --- --- .
A B C D
第一部分A:是该文件所有者对文件的权限
第二部分B:该文件的所属组的用户对该文件的权限(大家如果在一个组里所拥有的权限是一样的)
第三部分C:表示你既不是这个组的所属人,也不是这个组的所属组成员中的人,那就把你定义为其他人。所以总结就是除了AB描述的用户的其他用户对该文件的权限。
第四部分D:表示为扩展权限,然后具体咋扩展那,咱在这边先不讲,
r 表示的是对文件内容的读取。
w表示的是对文件内容的修改。
X 表示的是对文件的可执行权,这边要注意一点,当一个文件不是可执行程序,就算有权限,咱也没办法执行。
- 表示的没有所对应位的权限。
root 代表的是当前文件的所有者
root 代表的是当前文件的所属组
这串数字 指的是文件的大小,在这里需要注意的是,如果这里是目录的话,该目录的大小不是该目录下所有文件的大小之和。
文件的时间**
8.0的版本后是有四个时间的,
访问时间(access time)、修改时间(modify time)、改变时间(change time)、创建时间(create time)。默认显示的时间是修改时间。
访问时间那:是当我们读取文件内容的那个时间;
修改时间指的是修改文件内容的时间;
改变时间是用来标记文件元数据发生变化的时候;
创建时间指的是文件创建的时间。
stat命令
stat 命令用于显示 inode 内容.
inode 包含文件的元信息,具体来说有以下内容:
- 文件的字节数
- 文件拥有者的 User ID
- 文件的 Group ID
- 文件的读、写、执行权限
- 文件的时间戳,共有三个:ctime 指 inode 上一次变动的时间,mtime 指文件内容上一次变动的时间,atime 指文件上一次打开的时间。
- 链接数,即有多少文件名指向这个 inode
- 文件数据 block 的位置
``[root@localhost ~]# stat anaconda-ks.cfg`
touch命令
touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
创建单个文件 `[root@localhost ~]# touch yaya`
创建多个文件
方法一 `[root@localhost test1]# touch 1 2 3 4 5`
方法二 `[root@localhost test1]# touch abc{1..6}`
mkdir命令
mkdir(英文全拼:make directory)命令用于创建目录。
目录:它是一个路径映射的文件,不是容器,怎么说那,就是说我们把某些文件放到目录里面了,只是文件列表的保存方式,对于Linux来讲,它其实也是一个文件。
创建单个目录:`[root@localhost ~]# mkdir ahuhua`
创建多个目录:`[root@localhost ahuhua]# mkdir test{1..3}`
创建级联目录:[root@localhost ahuhua]# mkdir -p a/b
我们在创建级联目录的时候,得加上-p的选项,表示我们要先创建父目录,然后再创建父目录当中的子目录。
tree命令:用于以树状图列出目录的内容,按层级显示目录。
数据流和重定向
数据流**
- 标准输入(standard input,简称stdin):默认情况下,标准输入指从键盘获取的输入
`[root@localhost ~]# cat filename1`
`Mon Jul 10 02:51:10 PM CST 2023`
将filename1文件的内容通过cat做一个输入的动作
- 标准输出(standard output,简称stdout):默认情况下,命令执行所回传正确的信息会输出到屏幕上
`[root@localhost ~]# pwd`
`/root`
- 标准错误输出(standard error output,简称stderr):默认情况下,标准错误输出可理解为命令执行失败后,所回传的错误信息会输出到屏幕上
`[root@localhost ~]# cd /sjdhjsch`
`-bash: cd: /sjdhjsch: No such file or directory`
- 标准输入(stdin):代码为0
- 标准输出(stdout):代码为1
- 标准错误输出(stderr):代码为2
重定向操作符
重定向操作符可以将命令输入和输出数据流从默认设备重定向到其他位置。重定向操作符本身不是命令,而是命令中附加的可改变命令的输入和输出对象的特殊符号。
1、输出重定向操作符:
>输出重定向符;>>追加输出重定向符;
>输出重定向符(将输出的结果写入到指定文件,并且会覆盖源文件内容)
`[root@localhost ~]# date`
`Tue Jul 11 02:35:52 PM CST 2023`
`[root@localhost ~]# date > filename1`
如果直接使用输出重定向符 文件,则会创建这个文件。
`[root@localhost ~]# > 123`
`[root@localhost ~]# ll`
`total 13016`
`-rw-r--r--. 1 root root 0 Jul 11 14:43 123`
>>追加输出重定向符(写入文件时不会做覆盖)
`[root@localhost ~]# date >> filename1`
2、输入重定向符操作**
输入重定向符<
将filename1文件的内容通过cat做一个输入的动作,基于cat程序的0接口接收了这文件的信息。
`[root@localhost ~]# cat < filename1`
`Tue Jul 11 02:50:27 PM CST 2023`
cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。
输入的终止结束符<<
指定.作为终止结束符(终止结束符要单独占一行,因为它是按行结束的)
[root@localhost ~]# cat << .
输入的终止结束符还可以编辑文件
我们指明结束符是EOF,并将内容输入到文件filename1中,再查看。
[root@localhost ~]# cat << EOF > filename1
**把错误和正确结果都写入文件内
`[root@localhost ~]# date 1>filename1 2>filename1`
2和1一样写到filename1中。`[root@localhost ~]# date 1>filename1 2>&1`
echo命令用于在终端设备上输出字符串或变量提取后的值
语法格式为:“echo [字符串] [$变量]”。
执行“echo 字符串”或“echo $变量”就可以,其中$符号意思是提取变量的实际值,以便后续的输出操作。
示例一:通过echo查看shell变量。
`[root@localhost ~]# echo $SHELL`
`/bin/bash`
变量是一个可以命名的存储空间,给变量赋值的过程就是给这个存储空间存储数据的过程。
示例二:创建变量并赋值
[root@localhost ~]# var1=zhangsan
=不是等于的意思,而是在内存空间中开辟了一块名字叫做var1的内存,然后给这个内存内容是zhangsan.等下一次我们需要用zhansgan这个值的时候,只需要将var1拉过来就成了,也就是调用的时候只需要将var1这个变量名调用就成。
示例三:调用变量
`[root@localhost ~]# echo $var1`
`zhangsan`
示例四:更改变量值
`[root@localhost ~]# var1=lisi`
`[root@localhost ~]# echo $var1`
`lisi`
变量其实就是可以变化的量
示例五:查看当前主机名
`[root@localhost ~]# echo $HOSTNAME`
`localhost`
tee命令。
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
管道符|:用于两个命令或者多个命令相连接,将管道符左边命令的输出作为管道符右边命令的输入。
命令格式:命令 管道符 tee 文件
`[command] | tee [file]`
例如通过ls命令根下的目录全部输入到f2文件内
ls / | tee f2
cp(英文全拼:copy file)命令主要用于复制文件或目录。
语法:`cp [选项] 源文件 目标文件 `
(源文件)表示要复制的文件或目录的路径
(目标文件)表示复制后的文件或目录的路径。
选项:
-r 用于复制目录及其所有的子目录和文件,如果要复制目录,需要使用该选项。
-p 保留源文件的权限、所有者和时间戳信息。
-a 此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。
使用`cp -a`相当于将原数据原封不动的拷贝过来,不改变里面的任何信息
使用`cp -r`拷贝数据,拷贝的结果是生成新的时间戳等信息
mv(英文全拼:move file)命令用来为文件或目录改名、或将文件或目录移入其它位置。
语法为:`mv [选项] 源文件名称 目标文件名称`
快捷键的使用
Ctrl+a 跳到命令行行首
Ctrl+e 跳到命令行行尾
Ctrl+d 向后删除,类似delete
Ctrl+u 删除光标至行首的内容
Ctrl+k 删除光标至行尾的内容
Ctrl+左右箭头 在模拟终端中支持按单词跳转
Ctrl+l 清屏,等同于clear
rm命令
rm(英文全拼:remove)命令用于删除一个文件或者目录。
示例1:删除123文件
`[root@localhost ~]# rm 123`
`rm: remove regular empty file '123'? y`
在这边提示一下:就是只输入rm的时候其实是自带一个-i的选项的。
`[root@localhost ~]# alias rm`
`alias rm='rm -i'`
选项
-i 删除前逐一询问确认。
示例2:不加-i选项的rm使用
`[root@localhost ~]# \rm abc`
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
示例3:忽略提示信息,强制删除yaya文件
`[root@localhost ~]# rm -f yaya`
-r 将目录及以下之档案亦逐一删除。
示例4:删除目录ahuhua
`[root@localhost ~]# rm -rf ahuhua`
查找文件的路径
| whereis | 可以搜索系统命令的可执行文件路径和说明文档 whereis ls |
| which | which 是搜索系统命令的可执行文件 which ls |
| locate | 按照数据库搜索,搜索速度快,消耗资源小。 locate ls |
| find | 可按照文件名、大小、时间、权限、类型、所属者、所属组来搜索文件 | find [path...] [expression] |
which:基于环境变量路径搜索文件,搜索的是可执行文件 ,可查找命令
`[root@localhost ~]# which pwd`
`/usr/bin/pwd`
whereis:基于环境变量路径搜索文件
`[root@localhost ~]# whereis pwd`
`pwd: /usr/bin/pwd /usr/share/man/man1/pwd.1.gz /usr/share/man/man1p/pwd.1p.gz`
locate:基于数据库搜索文件名
`[root@localhost ~]# locate pwd`
find 命令用于在指定目录下查找文件和目录。
格式:find 搜索范围 -条件 参数
| -name 根据文件basename匹配名称 |
| -path -path可以对文件的dirname+basename进行查找。 |
| -size 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) |
| -mtime [+\|-]n 匹配修改内容的时间(-4指小于等于4天内的文件名;+4,大于等于5天前的文件名;4指前4~5那一天的文件) |
| -atime [+\|-]n 匹配访问文件的时间 |
| -ctime [+\|-]n 匹配修改文件权限的时间 |
| -newer f1 !f2 匹配比文件f1新但比f2旧的文件 |
| -perm 匹配权限(mode为完全匹配,-mode为包含即可) |
| -user 匹配所有者 |
| -group 匹配所有组 |
| -delete | 将找到的文件删除,如果是目录只能删除找到的空目录。 |
| -exec …… {}\; | 后面可跟用于进一步处理搜索结果的命令
示例1:在根的root下按照名字查找AAA这个文件(它这个其实是省略了-print操作,加和不加都能打印出来)。
`[root@localhost ~]# find /root -name AAA.txt`
`/root/test1/AAA.txt`
示例2:查找比AAA这个文件更新的文件
`[root@localhost ~]# find /root -newer AAA.txt`
示例3:查找比filename1新但比AAA早的文件
`[root@localhost ~]# find /root -newer filename1 ! -newer AAA.txt`
grep (global regular expression) 命令用于在指定的普通文件中查找并显示含有指定字符串的行,也可与管道符一起使用.
语法 grep 选项 关键字符串 文件名称...
常用选项:
- `-i`:忽略大小写进行匹配。
- `-v`:反向查找,只打印不匹配的行。
- `-n`:显示匹配行的行号。
- `-r`:递归查找子目录中的文件。
- `-l`:只打印匹配的文件名。
- `-c`:只打印匹配的行数。
实例
在文件 file.txt 中查找字符串 "hello",并打印匹配的行:
grep hello file.txt
在标准输入中查找字符串 "world",并只打印匹配的行数:
grep -c world f1
在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
使用特殊符号进行字符串的匹配
| 匹配模式 | 说明 |
| -------------------- | --------------------------------------- |
| grep h 文件名 | 查找文件里有字符h的行 |
| grep ^[q] 文件名 | 匹配以q开始的行 |
| grep ^[qf] 文件名 | 匹配以q或者f开头的行 |
| grep ^[ ^qf ] 文件名 | 不匹配以q或者f开头的行 |
| grep ^[0-9] 文件名 | 匹配以数字开头的行 |
| grep q$ 文件名 | 匹配以q结束的行 |
| grep ^$ | 过滤空白行 |
| grep -r h ./* | 如果要明确搜索当前目录中的子目录有h的行 |
| grep -d skip h ./* | 忽略当前目录下的子目录下的普通文件 |
在passwd文件内查找有字符a的行。
grep a /etc/passwd
在passwd文件内查找以字符a开始的行。
grep ^a /etc/passwd
在passwd文件内查找以字符h结束的行。
grep h$ /etc/passwd
在passwd文件内查找不以字符h结束的行。
grep -v h$ /etc/passwd
vim编辑器
在Linux中所有的配置文件都是纯文本的,然后我们就拿了个编辑器可以对配置文件进行编辑。这个编辑器就是我们接下来要学的vim编辑器。它的前身叫做vi,后来搞了个增强的版本,vim。
示例1:查看vim界面
[root@localhost ~]# vim
输入:q的作用是退出;输入:help的作用是获取帮助;输入:help version8的作用是获取版本信息。
vim的三种模式
Vim它是一个模式化的编辑器,一共有三个模式:命令模式、末行模式、编辑模式。
命令模式下的常用按键
命令模式就是输入vim进入的界面
(1)光标跳转按键
功能 | 按键 |
光标按单个字符移动 | ↑、↓、←、→ |
光标按照单词向后跳转 | w |
光标按照单词向前跳转 | b |
光标跳转至行首 | ^ |
光标跳转至行尾 | $ |
文档首行第一个字符 | gg |
文档最后一行第一个字符 | G |
跳转到指定行 | 行号gg 或者 行号G |
(2)复制、粘贴、删除
功能 | 按键 |
删除光标所在行 | dd |
删除从光标处开始的n行 | ndd |
删除光标前至行首字符 | d^ |
删除光标及之后的所有字符 | d$ |
复制光标所在行 | yy |
复制从光标处开始的n行 | nyy |
将缓冲区的内容粘贴到光标所在行的下一行 | p(小写) |
将缓冲区的内容粘贴到光标所在行的上一行 | P(大写) |
撤销操作 | u |
编辑模式
可通过如下任意一种功能键从命令模式切换到编辑模式。按esc键可从编辑模式切换到命令模式。
功能 | 按键 |
在光标前插入 | i |
在光标所在行行首第一个非空字符前插入 | I(大写字母i) |
在光标后插入 | a |
在光标所在行末尾插入 | A |
在光标所在行上一行插入 | O(大写字母) |
在光标所在行下一行插入 | o(小写字母) |
删除光标所在字符并进入插入模式 | s(小写字母) |
删除当前行并进入插入模式 | S(大写字母) |
末行模式
按:或者/可从命令模式切换到末行模式。按esc键可从末行模式切换到命令模式。
(1)查找关键字并替换
功能 | 按键 |
从上而下在文件中查找字符串“word”(可按n键定位到下一个匹配的被查找字符串) | /word |
将当前行中查找到的第一个字符“old”替换为“new” | :s /old/new |
将当前行中查找到的所有字符“old”替换为“new” | :s /old/new/g |
在行号“n1,n2”范围内替换所有的字符串“old”为“new” | :n1,n2 s/old/new/g |
将整个文件内的字符串“old”替换为“new” | :% s/old/new/g |
(2)保存退出
功能 | 按键 |
退出vi/vim编辑器,未对文件做任何编辑操作才可退出 | :q |
不保存文档内容,强制退出vi/vim编辑器 | :q! |
保存文件 | :w |
将文件另存为/dir/file | :w /dir/file |
保存文件内容并退出vi/vim编辑器 | :wq 或者 ZZ |
强制保存并退出 | :wq! |
(3)其他操作
功能 | 按键 |
在当前文件中读入其他文件内容 | :r /dir/file |
查找含有"word"的行并删除 | :g/word/d |
显示行号 | :set nu |
关闭行号显示 | :set nonu |
删除n1-n2行内容 | :n1,n2 d |
复制n1-n2行到第n行后面 | :n1,n2 co n |
浏览普通文件内容
cat
(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。
语法格式:cat 选项 文件
例如:读取f1文件的内容
cat f1
参数
**-n 或 --number**:由 1 开始对所有输出的行数编号。
**-b 或 --number-nonblank**:和 -n 相似,只不过对于空白行不编号。
把 f1 的文档内容加上行号后输入 f2 这个文档里:
cat -n f1 > f2
把 f1 和 f2 的文档内容加上行号(空白行不加)之后将内容附加到 f3 文档里:
cat -b f1 f2 >> f3
head
head 命令可用于查看文件的开头部分的内容,有一个常用的参数 **-n** 用于显示行数,默认为 10,即显示 10 行的内容。
语法格式:head 参数 文件
-q 隐藏文件名
-v 显示文件名
-c<数目> 显示的字节数。
-n<行数> 显示的行数。
显示passwd文件的前十行。 head /etc/passwd
显示passwd文件的前5行。 head -n 5 /etc/passwd
显示文件前20个字节。 head -c 20 /etc/passwd
tail
tail 命令可用于查看文件的内容,有一个常用的参数 **-f** 常用于查阅正在改变的日志文件。
语法格式:tail 参数 文件
例如:显示passwd文件的最后10行(默认显示最后10行)
tail passwd
more
more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示。
more 文件名
cut
cut命令用于按列提取文本内容,
语法为:`cut [选项] 文件名称`
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
- b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的 范围之内,该字符将被写出;否则,该字符将被排除
系统文件在保存用户数据信息时,每一项值之间是采用冒号来间隔的,先查看一下:
[root@kongd ~]# head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
``
接下来使用下述命令尝试提取出passwd文件中的用户名信息,即提取以冒号(:)为间隔符号的第一列内容
```shell
[root@kongd ~]# cut -d: -f1 /etc/passwd
如果打印第二列的内容
[root@kongd ~]# cut -d: -f2 /etc/passwd
显示前三行的第三个字符
[root@server ~]# cut -c 3 /etc/passwd | head -3
o
n
e
```
排序显示sort
sort命令用于对文本内容进行排序显示,
语法为:`sort [选项] 文件名称`
| 选项 | 作用 |
| ---- | ------------------ |
| -f | 忽略大小写 |
| -b | 忽略缩进与空格 |
| -n | 依照数值的大小排序 |
| -r | 反向排序 |
| -u | 去除重复行 |
| -t | 指定间隔符 |
| -k | 设置字段范围 |
首先,sort命令执行后默认会按照字母顺序进行排序,非常方便:
[root@kongd ~]# cat passwd
[root@kongd ~]# sort passwd
```
sort -u参数进行去重操作:
[root@kongd ~]# sort -u f1
对数字进行排序
[root@kongd ~]# cat number.txt
[root@kongd ~]# sort -n f2
去重显示uniq
uniq命令用于检查及删除文本文件中重复出现的行列
语法为:`uniq [选项] 文件名称`
-c或--count 在每列旁边显示该行重复出现的次数。
我们对两个文本内容进行操作,区别一目了然:
[root@kongd ~]# uniq uniq.txt
[root@master ~]# uniq -c uniq.txt
5.6 替换文件中的字符显示tr
tr 指令从标准输入读取数据,经过替换或者删除后,将结果输出到标准输出。
**语法**:`tr [OPTION]…SET1[SET2]`
**参数说明:**
-c 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-d 删除指令字符
-s 缩减连续重复的字符成指定的单个字符
示例:将文件testfile中的小写字母全部转换成大写字母,可使用如下命令:
[root@master ~]#cat testfile |tr a-z A-Z
```
文本内容统计wc
wc命令用于统计指定文本文件的行数、字数或字节数,语法为:`wc [选项] 文件名称`
wc -l文件名
第一个数字代表行数,第二个代表单词数,第三个代表字节数(统计字节的时候会把换行符也统计进去),最后是文件名。
可以在末行模式下输入set list显示换行符
压缩和解压缩
.zip:zip 程序压缩打包的档案;(很常见,但是因为不包含文档名编码信息,跨平台可能会乱码)
.rar:rar 程序压缩打包的档案;(在windows上很常见,但是是商业软件。)
.gz:gzip 程序压缩的档案; (linux目前使用最广泛的压缩格式)
.bz2:bzip2 程序压缩的档案
.xz:xz程序压缩的档案
.tar:tar 程序打包的资料,并没有压缩过。(但是tar打包的时候可以指定文件格式,就相当于压缩了)
.tar.gz:tar程序打包的档案,其中并且经过gzip 的压缩(最常见)
.tar.bz2:tar 程序打包的档案,其中并且经过 bzip2的压缩
.tar.xz:tar程序打包的档案,其中并且经过xz的压缩(新一代压缩选择)
.7Z:.7zip 程序压缩打包的档案
首先我们来看zip和unzip命令
zip: 可以压缩文件和目录。
语法:`zip FILE`
语法: `unzip FILE` 、
tar
格式:tar 选项 包名(压缩文件) 文件名
选项(选项中任选其一):
-c 创建.tar格式的包文件
-x 释放.tar格式的包文件
-t 查看包中的文件列表 (选项中任选其一)
必选项:
-f 用于指定打包文件名。当与-c选项一起使用时,创建的tar包文件使用该选项指定的文件名。当与-x选项一起使用时,则释放该选项指定的tar包文件
辅助选项:
-v 表示在命令执行时显示详细的提示信息
-p 打包时保留文件及目录的权限
-z 调用gzip程序,以gzip格式压缩或解压缩文件(.tar.gz)
-j 调用bzip2程序,以bzip2格式压缩或解压缩文件(.tar.bz2)
-J 使用xz压缩或解压缩文件(.tar.xz),xz的压缩率通常比bzip2更高
-C(大写字母C) 和-x选项一起使用,表示释放包时指定释放的目标路径
这边要注意一点,我们一般一起使用选项的时候,f要最后写,因为f是指定打包的文件名。
压缩:tar -cjvf ad.tar.bz2(压缩的名) 1(要压缩的文件名)
解压缩:tar -xvf ad.tar.bz2 -C test2 (-C指明解压后存放的路径)
文件的上传和下载
- xftp
- scp
scp,具有和ssh一样的验证机制,从而可以实现2台机器安全的远程拷贝文件
文件发送 格式:scp -r(如果发送的是目录文件需要-r选项) 当前主机文件 目标主机的对应路径
文件接收格式:scp 目标主机路径的文件 接收到当前主机路径 接收文件
Linux中的特殊符号
Linux中的特殊符号
;演示
?演示
反引号演示:
单引号是强引用(就是不管你里面是啥字符,都把它当做标准字符输出,不解释字符的含义)
双引号是弱引用(),可以解释字符的含义
shell:壳,命令解释器,负责解析用户输入的命令。命令分两类:
- 内置命令 (shell内置),shell为了完成自我管理和基本的管理,不同的shell内置不同的命令,但是大部分都差不多
- 外置命令,在文件系统的某个目录下,有个与命令名称相同的文件
file命令用于辨识文件类型。格式就是file 文件名 :file aa.txt
type这个命令是用来查看命令类型的
查看内置命令 type pwd
查看外置命令:type passwd
内置命令与外置命令的区别就是,shell为了完成自我管理和基本的管理,不同的shell内置不同的命令,但是大部分是差不多的。
系统为了让用户在命令行快速方便地执行命令,将可执行文件的路径存储在环境变量PATH中。当用户每次执行外部命令的时候都会去该变量所记录的路径下搜索和命令同名的二进制文件,如果有则执行该二进制文件,如果没有则提示命令找不到。
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
命令别名
别名是命令的快捷方式。对于需要经常执行,并需要很长时间输入的长命令创建快捷方式很有用。
语法:`alias 别名=’原命令 [选项]…… [参数]……’`
#查看设置的别名
[root@node13 ~]# alias
那假设我给haha起个别名‘ls’,
alias haha='ls'
#删除别名:
[root@node13 ~]#unalias 别名
> 在命令行中使用alias命令设置的别名仅在该次登入有效,如果重新开启一个 Shell,或者重新登录系统,则这些alias将无法使用。
命令历史
`history`命令可以查阅命令历史记录 ,也可在命令行利用向上或向下光标键来进行查询。
语法:`history [选项] [参数]`
选项:
number:显示最近number条命令历史
-c:清空当前历史命令
-a [file]:后面没跟文件时,默认将缓冲区中历史命令写入~/.bash_history中
-r [file]:将历史命令文件中的命令读入当前历史命令缓冲区中
-w:将当前历史命令缓冲区命令写入历史命令文件中;
然后我们之前输入的命令都可以看到,但这些机器重启后还会不会在,一共能存多少行,都是有要求的。
可以通过cat命令查看/etc/profile中有个HISTSIZE=1000 这边说的是最多能保存1000条命令
-c 清空整个命令历史
-d 删除指定命令历史(删除的时候是按照序号进行删除的)
-w 将缓冲区中的命令历史保存到命令历史文件
这个的意思是我们输入-c清空整个历史的时候,输入history的命令去查看的时候发现是清除完的,但是输入cat查看配置文件的时候会发现还没清完,再输入history -w,然后再通过cat命令去查看配置文件的时候就清干净了。
!n 执行命令历史中第n条命令
例如我们执行第二个命令就输入:!2
!-n执行命令历史中倒数第n个命令
!! 执行上一条命令
!KEY执行最近一次以指定KEY开头的命令
!$ 引用上一个命令中最后一个参数
ESC+ 同上,多次按还可以切换
ALT+ 同上,在远程终端无效?
用户和组管理
在Linux中用户可以分为三类:
第一种是超级用户——用户名为root,它具有一切权限,只有进行系统维护(例如:建立用户等)或其他必要情形下才用超级用户登录,以避免系统出现安全问题。
第二种是系统用户(伪用户)——是Linux系统正常工作所必需的用户。主要是为了满足相应的系统进程对文件属主的要求而建立的,专门用来运行后台进程和服务的用户,系统用户不能用来登录系统。例如:bin、daemon、adm、lp等用户。
第三种是普通用户——是为了让使用者能够使用Linux系统资源而建立的,我们的大多数用户属于此类。
在Linux中的组有两类:
第一种是基本组(私有组):建立账户时,若没有指定账户所属的组,系统会建立一个和用户名相同的组,这个组就是基本组。
第二种是附加组(公有组):可以容纳多个用户,组中的用户都具有组所拥有的权利。
然后除了这两个之外,我们还需要知道他们的配置文件,就是说在Linux中用户账号、密码、用户组信息和用户组密码均是存放在不同的配置文件中的。
(1)用户账号文件——/etc/passwd
ll /etc/passwd
passwd 是一个文本文件,用于定义系统的用户账号,由于所有用户都对passwd有读权限,所以该文件中只定义用户账号,而不保存口令。
/etc/passwd文件中字段说明
\> 账号名称:用户登录Linux系统时使用的名称。
\> 密码:以前是以加密格式保存密码的位置,现在密码保存在/etc/shadow文件中,此处只是密码占位符“x”或“*”。若为“x”,说明密码经过了shadow的保护。
\> UID:用户的标识,是一个数值,用它来区分不同的用户,每个用户都有一个UID数值:
超级用户的UID——0系统用户的UID——1~999普通用户的UID——≥1000
\> GID:用户所在基本组的标识,是一个数值,用它来区分不同的组,相同的组具有相同的GID。
\> 个人资料:可以记录用户的完整姓名、地址、办公室电话、家庭电话等个人信息。
\> 主目录:类似Windows 的个人目录,通常是/home/username,这里username是用户名,用户执行“cd~”命令时当前目录会切换到个人主目录。
\> Shell:定义用户登录后激活的Shell,默认是Bash Shell
(2)用户密码文件——/etc/shadow
ll /etc/shadow
/etc/shadow文件中的每行9个字段的含义分别为
| 字段 | 含义
| 登录名 | 登录名
| 加密口令 | 使用SHA-512/SHA-256/MD5算法加密后的密码($id$,id为1表示md5,5表示sha256,6为sha512),若为空,表示该用户无需密码即可登录,若为“*”表示该账号不能用于登录系统,若为“!!”表示该账号密码已被锁定 |
| 最后一次修改时间 | 最近一次更改密码的日期,以距离1970年1月1日的天数表示
| 最小时间间隔 | 密码在多少天内不能被修改。默认值为0,表示不限制
| 最大时间间隔 | 密码在多少天后必须被修改。默认值为99999,表示不进行限制
| 警告时间 | 提前多少天警告用户密码将过期,默认值为7天,0表示不提供警告
| 不活动时间 | 密码过期多少天后禁用此用户
| 失效时间 | 密码失效日期,以距离1970年1月1日的天数表示,默认为空,表示永久可用 |
| 标志 | 保留未用,以便以后发展之用
(3)用户组账号文件——/etc/group
ll /etc/group
系统中的每个组,在/etc/group文件中有一行记录,任何用户均可以读取用户组账户信息配置文件。
| 字段 | 说明 |
| Groupname | 组的名字 |
| Passwd | 组的加密口令 |
| GID | 是系统区分不同组的ID,在/etc/passwd域中的GID字段是用这个数来指定用户的基本组 |
| Userlist | 是用“,”分开的用户名,列出的成员以该组为附加组 |
首先来看怎么添加新用户,例如我们添加一个叫做zhangsan的用户
useradd zhangsan
添加后我们可以通过id去查看张三的信息
id zhangsan
这边要注意一下,就是在创建张三这个用户之前是没有张三这个组的,就是如果没有指定组则系统在你创建用户的时候会自动给你创一个和用户名字一模一样的组,这个就是基本组。
useradd要用到的选项
-u UID 指定uid
-g GID 指定基本组
-G GID1,GID2,… 指定附加组
-c “注释信息” 指定用户注释信息
-d /path/to/dir/ 指定某个目录为用户家目录
-s /shell 指定用户使用的shell
useradd -G rhcsa -g zhangsan -u 2001 -c "putongyonghu" -d /data/wangwu -s /usr/bin/sh wangwu
这个的意思是说我们创建了一个用户叫做王五,并且指定他的附加组是redhat的附加组,基本组是zhansgan的基本组,uid为2001,注释信息说他是一个普通用户,并将他的家目录指定为根下的data目录下面的xiaoming,它使用的shell是/usr/bin/sh 。
passwd wangsi
我们如果拿xshell远程登录的话,拿昵称是不能登录的,因为昵称是可以重复的,但是名字是不能重复的。所以还是通过名字加IP的方式进行登录
然后刚刚咱用了一个命令passwd,我们来了解一下,它是用来更改使用者的密码
然后来看下里面的选项:
-n 指定密码最短使用权限
-x 指定密码最长使用权
-w 指定警告时间
-d 删除用户密码,在红帽系统中,空密码用户禁止登录
修改用户信息,通过usermod命令来修改
usermod -u 2004 wangsi
常用的选项包括`-c,-d,-m,-g,-G,-s,-u`等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。另外,还可以使用如下选项:
-l 新用户名——更改账户的名称,必须在该用户未登录的情况下才能使用。
-L——锁定(暂停)用户账户,使其不能登录使用。
-U——解锁用户账户
删除用户
userdel wanger
删除的时候带上r的选项,-r——在删除该账户的同时,一并删除该账户对应的主目录。
如果删除的时候没有带r的选项,把用户删除后,用户的家目录和邮箱还是在的,但如果这些实在不想要的话可以通过这个方法进行删除,
查看邮箱,然后通过rm进行删除。
ll /var/spool/mail
首先创建组groupadd 用户组的名称
groupadd zhangsan
创建时常用的选项:-g GID——指定新用户组的组标识号(GID),默认值是已有的最大的GID加1。 -r——建立一个系统组账号,与-g不同时使用时,则分配一个1~999的GID。
删除组groupdel 用户组的名称,在删除组的时候,如果是基本组,则必须要先删除引用该基本组的用户,然后再删除该基本组。
groupdel zhangsan
修改组
groupadd zhangsan
groupmod -g 2008 zhangsan
修改组中常用的选项
-g GID——为用户组指定新的组标识号。
-n 新用户组——将用户组的名字改为新名字修改用户组的名称和 用户组的GID值。
组的名字:组的密码:组的ID:哪个用户把这个组作为附加组
/etc/gshadow 通过gpasswd给组设置密码后可查看
然后我们就开始手动去创建一个用户
进入到passwd这个配置文件中
![image-20231103222306109](C:\Users\15121\AppData\Roaming\Typora\typora-user-images\image-20231103222306109.png)
然后在最后一行按照之前用户的格式重新创建一个新的用户就好。
如果手动创建组的话就进入到group这个配置文件中按照之前的组的格式到最后一行重新创建一个新的组就好。
# 权限
rw-r--r--.我们把这10个分为四个部分,前三组每组三个,最后一组是那个点
第一组:指的是该文件拥有者对该文件的权限。owner 属主,缩写u
第二组:指的是该文件所属组对该文件的权限。group 属组,缩写g
第三组:指的是既不是该文件的拥有者,也不是该文件所属组的成员,也就是其他人对该文件的权限。other 其他,缩写o
第四组:指的是扩展权限
对文件来讲:r表示对该文件可读;w表示对该文件可写;x表示对该文件可执行。
对目录来讲:r表示可以列出目录下的文件;w表示可以在目录下创建删除文件;x表示可以进入该目录(也就是可以切换到目录)。
修改文件或目录的权限使用的命令是chmod(英文全拼:change mode)
`+``或``-``或``=`:表示设置权限的操作动作,+代表添加某个权限;-代表取消某个权限;=表示只赋予给定的权限,并取消原有的权限。 然后接下来我们挨个都来演示一下。
给1号文件的用户所有者添加执行的权限。
chmod u+x 1
给1号文件的用户所属组赋予写的权限
chmod g+w 1
如果想要同时给所有用户添加执行的权限,不需要我们三种身份挨个赋予
这里有个a代表的所有用户
chmod a+x 1
还有减掉某个权限、赋予某个并代替掉之前的权限也是都演示一下。
chmod u-x 文件名
chmod u=x 文件名
以上这些设置权限的方法我们统称为文字设定法,
还有一种叫做数字设定法。
在这里面:
-代表没有权限,可以用数字0表示;
x代表执行权限,可以用数字1表示
w代表写的权限,可以用数字2表示;
r代表读的权限,可以用数字4表示;
那假如我们要对1文件的三种身份全部只设置写的权限
chmod 222 文件名
这里一定要记住这三个数字分别对应了三种身份,每种身份的权限加起来就是该身份所在位的数值。
特殊权限
SUID
作用:是为了让一般用户执行某些程序的时候,在程序运行的期间,暂时获得该程序文件的所属者的权限。
Chmod u+s 文件名称
Chmod 0777 文件 去掉该文件的suid权限
Chmod 4777 文件 增加该文件的suid权限
SGID
文件:如果SGID设置在二进制文件上面,则不论用户是谁,都可以在执行该程序的时候程序的所属组将变成该文件的所属组。
目录:如果SGID设置A目录上,则在该目录内创建的文件或者目录的所属组会变成A目录的所属组。
Chmod 0777 文件 去掉该文件的sgid权限
Chmod 2777 文件 增加该文件的sgid权限
Chgrp (change group)
Sticky Bit t
SBit 只针对目录有效,在具有SBit权限的目录下,如果该用户在该目录下拥有wx权限,则当用户在该目录下创建文件或者目录的时候,只有文件拥有者和root用户才有权限去删除里面的东西。
Chmod 0777 文件 去掉该文件的sbit权限
Chmod 1777 文件 增加该文件的sbit权限
拓展权限
ACL:给指定的用户分配指定的权限。
查看acl权限
getfacl 文件名
设定acl权限
语法:`setfacl 选项 文件名`
选项:
> -m:设定 ACL 权限。
如果是给予用户 ACL 权限,则使用`u:用户名:权限`格式赋予;
如果是给予组 ACL 权限,则使用`g:组名:权限"`格式赋予;
> -x:删除指定的 ACL 权限;
> -b:删除所有的 ACL 权限;
> -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
> -k:删除默认 ACL 权限;
> -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;
管理Linux的联网
linux的IP地址配
动态配置IP地址:当前主机通过DHCP的方式去自动获取IP地址。
静态配置IP地址:根据动态获取的地址后期手动的去给他配置地址。
**nat模式**:主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,这样就实现了虚拟机联网。VMware Network Adapter VMnet8虚拟网卡主要是为了实现主机与虚拟机之间的通信。
**桥接模式:**桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。更改桥接模式的时候大家注意一下,有些主机按照咱之前的方式选择桥接就断卡网卡重新连接就可以获得IP,但是有些主机是拿不到地址的,拿不到地址的话需要点击编辑—虚拟网络编辑器-点击右下角的更改设置,桥接的原理是将虚拟的网卡桥接到真实的物理网卡上。桥的时候注意要选择你现在真实物理机上网的网卡,是有线就选择有线,是无线就选择无线。
仅主机模式:Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的,Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯。
配置IP地址
红帽9的配置文档
[root@localhost ~]# vim /etc/NetworkManager/systemconnections/ens160.nmconnection
注意一下,就是我们去更改的时候不要直接对配置文件进行更改,因为更改后系统是不会提示错误的
通过命令去更改IP地址
通过命令去更改的时候我们用的是软件NetworkManager提供的nmcli命令。
显示设备的状态信息
``[root@localhost ~]# nmcli device status`
显示设备的配置信息**
`[root@localhost ~]# nmcli device show`
connection选项
``[root@localhost ~]# nmcli connection`
add clone delete down edit export help import load modify monitor reload show up`
add 重新添加一个配置文件
delete删除配置文件;
edit编辑指定的配置文件
help 帮助;
load加载配置文件;
modify修改配置文件的内容;
reload重载
up 启用;
down禁用。
通过该选项对配置文件修改去更改IP地址。(非交互式)
示例:将模式更改为静态的模式并手动配置IP地址、子网掩码、网关、DNS。
`[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.192.120/24 ipv4.gateway 192.168.192.2 ipv4.dns 114.114.114.114 +ipv4.dns 8.8.8.8`
**通过cat获取配置文件查看更改后的内容**
`[root@localhost ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection`
**重新激活配置文件**[root@localhost ~]# nmcli connection up ens160
**创建一个新的配置文件**
**一个网卡可以对应多个配置文件,但是在应用的时候只能应用一个。**
`[root@localhost ~]# nmcli connection add type ethernet con-name work ifname ens160`
`Connection 'work' (ddb5861f-c520-46cb-9a8e-6f4d8e86b86f) successfully added.`
指定设备类型是ethernet,通过con-name起的连接名字是work,也就是我的新的配置文件名,通过ifname指定的是设备名。
**查看新的配置文件**
[root@localhost ~]# cat /etc/NetworkManager/system-connections/work.nmconnection
**激活work配置文件**
``[root@localhost ~]# nmcli connection up work`
`Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)`
**通过edit的方式去更改IP地址(交互式)****
[root@localhost ~]# nmcli connection edit work
nmcli> 通过tab键查看选项
activate back describe goto help nmcli print quit remove save set verify
通过goto进入Ipv4中
nmcli> goto ipv4
nmcli ipv4> 通过tab键查看选项
activate back describe goto help nmcli print quit remove save set verify
通过set将ipv44模式改为manual手动配置
nmcli ipv4> set method manual
改地址、掩码、网关、DNS,并保存退出
nmcli ipv4> set method manual
nmcli ipv4> set addresses 192.168.197.120/24
nmcli ipv4> set gateway 192.168.197.2
nmcli ipv4> set dns 114.114.114.114
nmcli ipv4> save
Connection 'work' (ddb5861f-c520-46cb-9a8e-6f4d8e86b86f) successfully updated.
nmcli ipv4> quit
激活。
两种更改方式推荐modify。
静态更改为动态之后配置文件中关于手动配置IP的部分还是存在的,需要通过eidt交互式删除。
通过delete删除配置文件
[root@localhost ~]# nmcli connection delete work
Connection 'work' (ddb5861f-c520-46cb-9a8e-6f4d8e86b86f) successfully deleted.
10.4 网络测试命令
ping命令 测试网络的连通性的。
命令一般格式为:`ping [选项] <目标主机名或IP地址>`
选项:
-c 数字——用于设定本命令发出的ICMP消息包的数量,若无此选项,则会无限次发送消息包直到用户按【Ctrl+C】组合键才终止命令。
-s 字节数——设置ping命令发出的消息包的大小,默认发送的测试数据大小为56字节;自动添加8字节的ICMP协议头后,显示的是64字节;再添加20字节的IP协议头,则显示的为84字节。最大设置值为65507B。
-i 时间间隔——设定前后两次发送ICMP消息包之间的时间间隔,无此选项时,默认时间间隔为1秒。为了保障本机和目标主机的安全,一般不要小于0.2秒。
-t——设置存活时间TTL(Time To Live)
`[root@localhost ~]# ping -c 4 www.baidu.com`
[root@localhost ~]# ping localhost
tracepath追踪并显示报文到达目的主机所经过的路由信息
命令一般格式为:`tracepath [选项] <目标主机名或目标IP地址>`
通过-b的选项对沿途各主机节点同时显示IP地址和主机名。
[root@localhost ~]# tracepath -b www.baidu.com
从网站下载文件
wget命令用于在终端命令行里下载网络文件,英文全称为:“web get”,语法格式为:`wget [选项] 网址`
在下载之前首先需要测试网络连通性,只有网络正常连通才可以
[root@localhost ~]# wget https://down.qq.com/qqweb/LinuxQQ/linuxqq_2.0.0-b2-1089_x86_64.rpm
选项:
-P 下载到指定目录
-t 最大尝试次数(这个如果不指定次数的话,在网络环境不好的时候下载中断了,是不会继续下载的,但如果我们设置了最大尝试次数,例如设置为3次,他会在中断后再次下载,尝试3次。)
-b 后台下载模式
-c 断点续传 (基于之前断点的位置继续下载)
-p 下载页面内所有资源,包括图片、视频等
-r 递归下载 (指定一个路劲,可以将路劲下的目录全部下载)
```
curl命令是一个网络工具,其主要作用是通过http、https、ftp等方式下载/上传文件,,还可以访问网站(这边访问的网站不是一个具体的页面,而是开发者的代码)。
[root@localhost ~]# curl http://www.baidu.com
[root@node12 ~]# curl www.baidu.com -o index.html -o的选项是将要访问的信息输出到指定文件
管理Linux软件包和进程
rpm
RPM(Red Hat Package Manager,Red Hat软件包管理器)是一种开放的软件包管理系统,按照GPL条款发行,可以运行于各种Linux系统上。RPM简化了Linux系统安装、卸装、更新和升级的过程,只需要使用简短的命令就可完成。RPM维护一个已经安装软件包和它们的文件的数据库,因此,可以在系统上使用查询和校验软件包功能。
红帽中的软件包它的管理格式是rpm的格式。
(1)RPM是红帽包管理(Redhat Package Manager)的缩写。
- 由Red Hat公司提出的一种软件包管理标准。
- 是Linux各发行版中应用最广泛的软件包格式之一(还有debian的发行版deb安装包)。
- RPM功能通过rpm命令使用不同参数来实现。
不同的发行系统它默认的管理格式是不一样的,它后续是通过统一的格式去开发的。
在Linux中它的软件包的格式就相当于是运行程序的格式。
rpm软件包中包含有关于本软件包的相关信息, 便于对软件包信息进行查询。
**RPM软件包的典型命名格式:**
`软件名-版本号-发行号.操作系统版本.硬件平台的类型.rpm`,比如 `zsh-5.0.2-14.el7.x86_64.rpm`
| zsh | -5 | 0 | 2 | 14 | el7 | x86 | 64 |
| ------ | -------- | -------- | ------ | ------------ | ----------- | ----------- | ------------ |
| 软件名 | 主版本号 | 次版本号 | 修订号 | 软件发布次数 | 发行商RHEL7 | CPU架构平台 | 支持系统位数 |
**软件包的获取方式**
一种是通过互联网的方式去下载,这种叫做网络源去获取。
一种是在本地去获取,通过光驱去获取软件包,这种叫做本地源去获取。
本地源获取软件包
首先我们需要去加载软件包,我们需要通过挂载的方式将当前主机下的某个目录和我的文件系统做一个连接,连接后类似于是我通过当前目录连接到某个设备的访问入口,切换到该目录就相当于切换到该设备,该文件系统。
查看本地光盘是否连接
[root@localhost ~]# ll /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 Jul 13 11:42 /dev/sr0
[root@localhost ~]#
sr0中的s代表的设备类型SATA,r代表的是ROM存储介质,0是光盘中的数据读取接口,第一个接口用0来标记。
cdrom也可以对光盘进行标记
[root@localhost ~]# ll /dev/cdrom
lrwxrwxrwx. 1 root root 3 Jul 13 11:42 /dev/cdrom -> sr0
[root@localhost ~]#
```
手动挂载光盘到目录中
mount用于挂载Linux系统外的文件。**
格式:mount 要挂载的文件 需挂载的目录
需挂载的目录:系统默认挂载目录:/media ;手动挂载的目录:/mnt。
通过mount查看当前已经挂载的文件
`[root@localhost ~]# mount`
**将光盘挂载到/mnt目录下**
[root@localhost ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
提示信息:对光盘有一个写保护,就是我们我只能读取,不能写。
提示:警告不影响命令的执行。
**一个设备可以同时挂载到多个目录下,也就是说一个设备可以同时指定多个挂载点。**
AppStream、BaseOS里面存放了红帽中的软件包。
packages中存放了rpm的软件包。
**RPM包的依赖性指的是一个软件依赖于其他的软件包或者库才能够正常运行。**
安装rpm包(不带依赖关系的 )
| 参数 | 说明 |
| ------------- | ---------------------------- |
| -i, --install | 安装软件包 |
| --nodeps | 不验证软件包依赖 |
| -v, --verbose | 提供更多的详细信息输出 |
| -h, --hash | 软件包安装的时候列出哈希标记 |
| -U | 软件包升级 |
| -e | 软件包卸载 |
```
[root@localhost Packages]# rpm -ivh zenity-3.32.0-7.el9.x86_64.rpm
warning: zenity-3.32.0-7.el9.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Verifying... ################################# [100%]
Preparing... ################################# [100%]
package zenity-3.32.0-7.el9.x86_64 is already installed
[root@localhost Packages]#
```
警告:没有密钥验证。(软件包在安装的时候是可以输入密钥进行验证的,如果忽略的话就会有一个警告)
处理秘钥验证:*
gpg就是公钥私钥的软件包的验证。
秘钥配置文件:
[root@localhost Packages]# ll /etc/pki/rpm-gpg/
total 8
-rw-r--r--. 1 root root 1669 Apr 6 2022 RPM-GPG-KEY-redhat-beta 测试版本
-rw-r--r--. 1 root root 3682 Apr 6 2022 RPM-GPG-KEY-redhat-release 发行版本
[root@localhost Packages]#
将发行版本秘钥导出
[root@localhost Packages]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
执行这个命令之后再去安装rpm软件包的时候就不会再提示警告信息了。
(这个不验证只基于本地的rpm软件包,如果是互联网上下载的可能还需要)。
卸载rpm包
[root@localhost Packages]# rpm -e 软件名
rpm查询功能(跟-q结合使用)
| 参数 | 说明 |
| ---- | ------------------------------------ |
| -a | 查询所有已安装的软件包 |
| -l | 显示已安装软件包的相关文件列表和信息 |
| -f | 查询文件所属软件包 |
| -i | 显示已经安装的rpm软件包信息 |
-q (查询已安装的软件包则显示该软件包信息,查询未安装的软件包则显示该包不存在)
[root@localhost Packages]# rpm -q zenity
zenity-3.32.0-7.el9.x86_64
[root@localhost Packages]# rpm -q httpd
package httpd is not installed
-qa (查询所有已经安装的软件包)
[root@localhost Packages]# rpm -qa
[root@localhost Packages]# rpm -qa | wc -l
1172
-ql 将安装软件以文件列表的形式展现出来(释放软件程序的所有文件)
[root@localhost Packages]# rpm -ql tar
-qf (查询文件是由哪个软件包释放的)
[root@localhost Packages]# rpm -qf /usr/share/man/man1/gtar.1.gz
tar-1.34-3.el9.x86_64
-qpi (查看一个包的详细信息,查看时需要指明绝对路径)
[root@localhost Packages]# rpm -qpi /mnt/BaseOS/Packages/coreutils-8.32-31.el9.x86_64.rpm
YUM/DNF管理工具
YUM (Yellow dog Updater,Modified) ,RHEL8中默认使用的软件批量管理工具由原版本的yum换成了速度更快的dnf(DNF = Dandified YUM),原有的yum命令仅为dnf的软链接,当然依旧可以使用。
[root@kongd ~]# ll `which yum`
lrwxrwxrwx. 1 root root 5 2月 14 2019 /usr/bin/yum -> dnf-3
(1)YUM/DNF 功能
- 在线下载、 安装、 卸载、 升级rpm软件包
- 自动查找并解决rpm包之间的依赖关系,一次性安装所有具有依赖关系的rpm包,而无需管理员逐个、 手工地去安装每一个rpm包
(2)如何实现yum/DNF安装
系统会去读取`/etc/yum.repos.d/`目录下的`.repo`结尾的文件,从该文件中读取以下内容实现装包:
- 包含各种rpm安装文件的软件仓库(rhel8有两个仓库,rhel7只有一个仓库)
- BaseOS存储库:提供一套核心的底层操作系统功能,为基础软件安装库
- AppStream存储库:包括额外的用户空间应用程序、运行时语言和数据库
- 软件仓库的地址信息
1、配置`.repo`文件,即yum源
配置文件就是一个软件程序的默认参数初始化的文件,程序在执行的时候,它会匹配初始化的信息。
在系统当中可以自定义yum的初始化文件。
repo文件是Linux系统中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,比如从哪里下载需要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用。软件仓库配置文件默认存储在/etc/yum.repos.d目录中建立本地源
[root@localhost Packages]# vim /etc/yum.repos.d/base.repo 创建base.repo配置文件
[AppStream] 仓库名称
name=REEL8.5-AppStream 仓库的描述名称
baseurl=file:///mnt/AppStream 软件包的路径,url是统一资源定位符,file指本地协议,//表示的是协议符,是固定用法,后边这个/表示的是根目录
gpgcheck=0 公私钥的验证,0代表关闭,1代表开启,为了避免公私钥验证失败,一般我们都将它关闭。
enable=1 是否启用该仓库,0代表关闭。1代表启用
[BaseOS]
name=BaseOS
baseurl=file:///mnt/BaseOS
gpgcheck=0
enable=1
- 建立网络源(Redhat9暂时无公开的网络源,暂不可配置,其他发行版本可自行选择对应网源仓库)
- 阿里云网络源,aliyun的镜像站点为https://mirrors.aliyun.com/
#此处以redhat8.5为例
[root@master ~]# cat /etc/redhat-release
Rocky Linux release 8.5 (Green Obsidian)
注:此处先查看自己的发行版本信息,选择相应的仓库。
#仓库文件可以自己写也可以从aliyun网站下载
[root@master ~]# cat /etc/yum.repos.d/aliyun.repo
[appstream]
name=appstream
baseurl=https://mirrors.aliyun.com/rockylinux/8.5/AppStream/x86_64/os/
gpgcheck=0
#gpgcheck=1 #如果gpgcheck为1,需要写秘钥文件路径
#gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
[baseos]
name=baseos
baseurl=https://mirrors.aliyun.com/rockylinux/8.5/BaseOS/x86_64/os/
gpgcheck=0
#gpgcheck=1
#gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
```
```
- 清华源镜像站点为https://mirrors.tuna.tsinghua.edu.cn/
- 中国科技大学镜像站点https://mirrors.ustc.edu.cn/
- 网易开源镜像站http://mirrors.163.com/
- ……等等很多大学开源镜像站点……
2、通过yum安装rpm软件包
格式:yum -y install 软件名
[root@localhost Packages]# yum -y install httpd
```
3、通过yum卸载rpm软件包
[root@localhost ~]# yum -y remove httpd
```
4、查看软件库里面的所有包组,并按照包组安装
[root@localhost ~]# yum grouplist 查看软件库里面的所有包组
[root@localhost ~]# yum group install "Development Tools" 按照包组名安装
```
5、搜索文件由哪个包产生
[root@localhost ~]# yum provides touch
[root@localhost ~]# yum whatprovides touch
```
6、模糊搜索包名
[root@localhost ~]# yum search rz 模糊搜索包含rz的文件
[root@localhost ~]# yum -y install lrzsz.x86_64 安装该文件
[root@localhost ~]# rz 通过rz打开弹窗,双击要传输的文件,就可以将文件传到Linux下面。
[root@localhost ~]# sz anaconda-ks.cfg 通过sz 文件名 将该文件从Linux下传到Windows中。
```
源代码编译
1)使用源代码安装软件的优点
- 由于自由软件的最新版本大都以源码的形式最先发布,编译安装可以获得软件的最新版本,及时修复bug
- 如果当前安装的程序无法满足需求,用户可以根据需要重新配置、自由修改源代码,加入新的功能
2)编译需求
- 确认源代码编译环境:需安装支持 C/C++程序语言的编译器`yum install gcc`
- 下载相应的源码软件包
3)安装
1、配置阶段:基于代码进行安装的时候检测有没有选择对应的路径。
[root@localhost ~]# mkdir /test 创建目录
[root@localhost ~]# cd /test
通过xftp将tar压缩包从Windows中传到Linux中
[root@localhost test]# ll
total 3872
-rw-r--r--. 1 root root 3962257 Jul 13 16:16 tar-1.29.tar.gz
[root@localhost test]# tar -xvzf tar-1.29.tar.gz tar-1.29/ 将该压缩包解压
[root@localhost test]# yum remove tar -y 卸载掉之前安装好的tar包
[root@localhost test]# yum -y install gcc* 安装gcc编译工具
[root@localhost test]# cd tar-1.29/
[root@localhost tar-1.29]# ./configure 运行该脚本文件
这边它只能够以普通用户的身份去执行,但如果之前拿root身份执行了会出错,出错后要先删除其中的config.log文件才能再去执行。
[root@localhost tar-1.29]# rm -rf config.log
[root@localhost tar-1.29]# su - rhcsa 切换到普通用户
[rhcsa@localhost ~]$ cd /test
[rhcsa@localhost test]$ cd tar-1.29/
[rhcsa@localhost tar-1.29]$ ./configure 重新运行该脚本文件
```
2、编译阶段:将源码编译成二进制文件。
[rhcsa@localhost tar-1.29]$ exit
logout
[root@localhost tar-1.29]# make make命令会将所有的.c文件生成.o文件。
3、安装。
[root@localhost tar-1.29]# make install 通过make install去将所有的.o文件安装
```
4、测试
[root@localhost test]# touch 1 2 3
[root@localhost test]# tar -cvzf a.tar.bz2 1 2 3
1
2
3
```
进程
(1)程序、进程、线程
**程序**: 二进制文件,文件存储在磁盘中,例如/usr/bin/目录下
**进程**:进程是已启动的可执行程序的运行实例。
**线程:**是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
。
(2)进程分类
ps命令查看进程显示当前运行进程
[root@localhost ~]# ps
PID TTY TIME CMD
12313 pts/1 00:00:01 bash
86367 pts/1 00:00:00 ps
选项:
-a :显示所有用户的进程
-u :显示用户名和启动时间
-x :显示 没有控制终端的进程
-e :显示所有进程,包括没有控制终端的进程
-l :长格式显示
-w:宽行显示,可以使用多个 w 进行加宽显示
-f:做一个更完整的输出
```
显示所有运行进程
[root@localhost ~]# ps -aux
#查看当前用户的进程
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 42097 42091 0 80 0 - 29040 wait pts/0 00:00:00 bash
0 R 0 43256 42097 0 80 0 - 34857 - pts/0 00:00:00 ps
说明:
F:代表这个程序标志(process flags),说明这个程序的权限。常见号码有:4表示此程序的权限为root;1表示此子程序仅进行复制(fork)而没有实际执行(exec)
S:代表这个程序的状态(STAT),主要的状态有:
R(Running):该程序正在运作中;
S(Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒;
D:不可被唤醒的睡眠状态,通常可能是在等待I/O的情况;
T:停止状态(stop),可能是在工作控制(后台暂停)或traced状态;
Z(Zombie):僵尸状态,程序已经终止但却无法被移除至记忆体外。
+:位于后台的进程组
UID/PID/PPID:代表此程序被该UID所拥有/程序的PID号码/此程序的父进程PID号码。
C:代表CPU使用率,单位为百分比;
PRI/NI:Priority/Nice的缩写,代表此程序被CPU所执行的优先顺序,数值越小代表该程序越快被CPU执行。
ADDR/SZ/WCHAN:都与内存有关,ADDR是kernel funcition,指出该程序在内存的哪个部分,如果是running的程序,一般会显示-。SZ代表此程序用掉多少内存,WCHAN表示目前程序是否运作中,若为-表示正在运行。
TTY:登入者的终端机位置,若为远程终端登入则使用动态终端界面(pts/n)。
TIME:使用掉的CPU时间,即此程序实际花费CPU运作的时间。
CMD:触发此进程的指令是什么。
```
#查看当前用户的进程
[root@localhost ~]# ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1280 2.2 0.2 237304 5408 tty1 Ss+ 15:54 0:00 -bash
root 1415 0.1 0.2 237172 5092 pts/0 Ss 15:55 0:00 -bash
root 1452 0.0 0.2 268484 4008 pts/0 R+ 15:55 0:00 ps -u
[root@localhost ~]# ps aux |less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2164 648 ? Ss 08:47 0:00 init [5]
说明:
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存
RSS: 占用实际内存 驻留内存
TTY: 进程运行的终端
STAT: 进程状态 man ps (/STATE)
R 运行
S 可中断睡眠 Sleep
D 不可中断睡眠
T 停止的进程
Z 僵尸进程
X 死掉的进程
s 进程的领导者,父进程
< <优先级较高的进程
N N优先级的进程
+ +表示是前台的进程组
l 以线程的方式运行
START: 进程的启动时间
TIME: 进程占用CPU的总时间
COMMAND: 进程文件,进程名
```
查看指定进程的PID
[root@localhost ~]# pgrep -l sshd
5945 sshd
12308 sshd
12312 sshd
根据ID号结束进程
[root@localhost ~]# kill 5945
结束所有批处理进程
[root@localhost ~]# killall sshd
这边将sshd的进程结束后,要从虚拟机的终端内重新启动
[root@localhost ~]# systemctl start sshd
```
top命令查看进程
语法:`top [-d 数字] | [-bnp]`
-d:后面可以接秒数,就是整个进程界面更新的秒数,默认是5秒
-b:以批次的方式执行top,还有更多的参数可用。通常会搭配数据流重定向来将批处理的结果输出为文件。
-n:与-b搭配,进行几次top的输出结果
-i:不显示闲置或者僵死的进程信息
-c:显示进程的整个命令路径,而不是只显示命令名称
-s:使top命令在安全模式下运行,此时top的交互式指令被取消,避免潜在危险
-p:指定某些个PID来进行查看检测
top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06
Tasks: 483 total, 3 running, 480 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1790.0 total, 1278.5 free, 240.5 used, 271.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1393.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 179104 13540 8728 S 0.0 0.7 0:01.22 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_perc+
10 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftir+
11 root 20 0 0 0 0 I 0.0 0.0 0:00.13 rcu_sch+
- 统计信息区
第一行为任务队列信息:top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06
> 17:21:03表示当前系统时间;up 4:32表示系统已经启动4小时32分钟了;
>
> 5 users表示当前登录系统的用户数;
>
> load average: 0.19, 0.08, 0.06表示系统1分钟、5分钟、15分钟前到现在的平均负载(如果是1表示满负载)
```bash
第二行:Tasks: 483 total, 3 running, 480 sleeping, 0 stopped, 0 zombie
> 483 total进程的总数; 3 running正在运行的进程数,;480 sleeping处于休眠状态的进程数, ; 0 stopped停止的进程数, ; 0 zombie僵死的进程数。
第三行:%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
> 0.3 us表示用户进程占用CPU的百分比;0.7 sy系统进程占用CPU的百分比;
>
> 0.0 ni用户进程空间内改变过优先级的进程占用CPU的百分比; 99.0 id空闲CPU占用的百分比;0.0 wa代表I/Owait表示等待输入、输出的进程占用CPU的百分比;
>
> 0.0 hi表示cpu服务于硬件中断所耗费的时间总额; 0.0 si表示cpu服务于软件中断所耗费的时间总额;
>
> 0.0 st表示虚拟机被hypervisor偷去的cpu时间。另外,如果是多内核设备,可按下数字键“1”来切换成不同cpu的负载率。
MiB Mem : 1790.0 total, 1278.5 free, 240.5 used, 271.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1393.8 avail Mem
> total系统的内存大小;free目前空余内存大小;used已经使用的内存大小
- 进程信息区:显示了每个进程的运行状态
```bash
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 179104 13540 8728 S 0.0 0.7 0:01.22 systemd
```
> PID:进程的id
> USER:进程所有者的用户名
> PR:进程优先级
> NI:nice值。负值表示高优先级,正值表示低优先级
> VIRT:进程使用的虚拟内存总量,单位为KB
> RES:进程使用的、未被换出的物理内存大小,单位KB
> SHR:共享内存大小,单位KB
> S:进程状态,D表示不可中断的睡眠状态,R表示运行状态,S表示睡眠状态,T表示跟踪/停止,Z表示僵死进程
> %CPU:上次更新到现在的CPU时间占用百分比
> %MEM:进程占用的物理内存百分比
> TIME+:进程总计使用的CPU时间,单位为1/100秒
> COMMAND:正在运行进程的命令名或者命令路径
在top执行过程中可以使用的按键命令:
| 交互式命令 | 说明 |
| ---------- | ------------------------------------------------------------ |
| h或? | 显示帮助信息,给出交互式命令的一些说明 |
| k | 终止一个进程,系统将提示用户输入一个需要终止进程的PID |
| i | 忽略闲置进程和僵死进程,这是一个开关式命令 |
| s | 改变top输出信息两次刷新之间的时间,系统将提示输入新的时间,单位是秒。如果输入小数,就换算成毫秒;如果输入0,系统输出将不断刷新,默认刷新时间是3秒;需要注意的是,如果设置太短的时间,可能会引起系统不断刷新,无法看清输出显示情况,而且系统负载也会加大 |
| o或者O | 改变top输出信息中显示项的顺序。按小写的a-z键可以将相应的列向右移动,而按大写的A-Z键可以将相应的列向左移动。最后按enter确定 |
| f或者F | 从当前显示列表中添加或者删除项,按f键之后会显示列的列表,按a-z键即可显示或隐藏对应的列。最后按enter确定 |
| m | 切换显示内存信息 |
| t | 切换显示进程和cpu状态信息 |
| r | 重新设置一个进程的优先级,系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10 |
| l | 切换显示平均负载和启动时间信息 |
| q | 退出top显示 |
| c | 切换显示完整命令行和命令名称信息 |
| M | 根据驻留内存大小进行排序输出 |
| N | 以PID来排序 |
| P | 根据CPU使用百分比大小进行排序输出 |
| T | 根据时间/累计时间进行排序输出 |
| S | 切换到累计模式 |
| W | 将当前top设置写入~/.toprc文件中 |
磁盘管理
什么是磁道呢?每个盘片都在逻辑上有很多的同心圆,最外面的同心圆就是 0 磁道。我们将每个同心圆称作磁道(注意,磁道只是逻辑结构,在盘面上并没有真正的同心圆)。硬盘的磁道密度非常高,通常一面上就有上千个磁道。但是相邻的磁道之间并不是紧挨着的,这是因为磁化单元相隔太近会相互产生影响。
在磁盘上每个同心圆是磁道,从圆心向外呈放射状地产生分割线(扇骨),将每个磁道等分为若干弧段,每个弧段就是一个扇区。每个扇区的大小是固定的,为 512Byte。扇区也是磁盘的最小存储单位。
柱面又是什么呢?如果硬盘是由多个盘片组成的,每个盘面都被划分为数目相等的磁道,那么所有盘片都会从外向内进行磁道编号,最外侧的就是 0 磁道。具有相同编号的磁道会形成一个圆柱,这个圆柱就被称作磁盘的柱面。
磁盘分区
磁盘分区是指对硬盘物理介质的逻辑划分。
分区的意义:
1、数据的安全性:2、系统的效能考虑:
分区类型
1、MBR分区
MBR(Master Boot Record,主引导记录)是传统的分区机制,使用BIOS引导PC设备,寻址空间只有32bit长。
- 分区空间最大支持2.2TB
- 支持的分区数量:4个主分区或者3个主分区1个扩展分区
MBR分区类型
- 主分区(primary partition)
> 一块硬盘最多4个主分区,主分区不可以再进行二次分区。
> 主分区可以直接建立文件系统,存放数据
> 可以用来引导、启动操作系统
- 扩展分区(extended partition)
> 一块硬盘最多一个扩展分区,加主分区最多4个
> 不能创建文件系统
> 可以划分逻辑分区
- 逻辑分区(logical partition)
> 可以创建文件系统,存放数据
> 逻辑分区的数量没有限制。
2、GPT分区**
GPT(GUID Partition Table,全局唯一标识分区表)是一种比MBR分区更先进、更灵活的磁盘分区模式
- 在默认情况下,GPT最多可支持128个分区
- 支持大于2.2TB的总容量及大于2.2TB的分区,最大支持18EB(1EB=1024PB,1PB=1024TB,1TB=1024GB)
- GPT分区表自带备份
- 向后兼容MBR,GPT分区表上包含保护性的MBR区域
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 8G 0 rom /mnt
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
[root@localhost ~]#
```
使用fdisk管理分区
fdisk命令工具默认将磁盘划分为mbr格式的分区
命令:`fdisk 设备名`
fdisk命令以交互方式进行操作的,在菜单中选择相应功能键即可
实验步骤:
创建一块新的硬盘。
把虚拟机关机,找到硬盘的位置,然后双击,
点击添加,全部下一步,大小改为10,然后全部下一步,点击完成,点击确定。
查看硬盘信息
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 8G 0 rom /run/media/root/RHEL-9-0-0-BaseOS-x86_64
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
nvme0n2 259:3 0 10G 0 disk
使用fdisk管理分区。
先找到本地硬盘位置
[root@localhost ~]# ll /dev/nvme0n2
brw-rw----. 1 root disk 259, 3 Jul 15 09:50 /dev/nvme0n2
了解fdisk的选项
选项:
| 指令 | 作用 | 指令 | 作用 |
| ---- | ------------------------ | ---- | -------------------------------------- |
| a | 调整磁盘的启动分区 | p | 显示当前磁盘的分区信息 |
| d | 删除磁盘分区 | t | 更改分区类型 |
| l | 显示所有支持的分区类型 | u | 切换所显示的分区大小单位 |
| m | 查看所有指令的帮助信息 | n | 创建新分区 |
| q | 不保存更改,退出fdisk命令 | w | 把修改写入磁盘分区表,然后退出fdisk命令 |
| g | 新建一个空的GPT分区表 | o | 新建一个空的DOS分区表 |
进入fdisk管理工具的交互界面
[root@localhost ~]# fdisk /dev/nvme0n2
Welcome to fdisk (util-linux 2.37.4).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x350daeb6.
进来之后会有一个欢迎提示,也就是缓冲区,接下来在缓冲区内进行操作,
DOS的意思是默认是BIOS引导的,但如果是gpt的话,就是UEFI引导的,默认会有128个分区。
Command (m for help): m 查看所有指令的帮助信息
Command (m for help): p 显示当前磁盘的分区信息
通过n命令新建分区
Command (m for help): n 创建新分区
Partition type
p primary (0 primary, 0 extended, 4 free) 主分区
e extended (container for logical partitions) 拓展分区
Select (default p): p 这边输入p、直接回车都是默认创建主分区
Partition number (1-4, default 1): 1 这边输入1、直接回车都是默认创建分区1
First sector (2048-20971519, default 2048): 起始扇区,一个扇区是512个字节,它是从2048扇区开始的,从这个开始的原因是前面需要预留空间存放磁盘的引导信息,这边它并不是全部被占用,会有一些空余,目的是防止引导信息发生变化。
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, default 20971519): +2G 结束扇区,该扇区大小为2G
删除的时候需要Ctrl+del一起按才可以删除,只按del它会认为输入字符。
Command (m for help): n 创建新分区
Partition type
p primary (1 primary, 0 extended, 3 free) 主分区
e extended (container for logical partitions) 扩展分区
Select (default p): e 创建拓展分区
Partition number (2-4, default 2): 2 创建分区2
First sector (4196352-20971519, default 4196352): 起始扇区
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4196352-20971519, default 20971519): +5G 结束扇区,该扇区大小设置为5G
Command (m for help): n 创建逻辑分区
Partition type
p primary (2 primary, 1 extended, 1 free) 主分区
l logical (numbered from 5) 逻辑分区
Select (default p): l 创建逻辑分区
Adding logical partition 5
First sector (4198400-14682111, default 4198400): 起始扇区
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4198400-14682111, default 14682111): 结束扇区,直接默认最大
Created a new partition 5 of type 'Linux' and of size 5 GiB.
注意一下如果把扩展分区删除,那它下面的逻辑分区也会全部被删掉。所以后续就可以通过直接删除拓展分区的方式将逻辑分区全部删掉。还有就是逻辑分区的编号是没有办法选择的。
Command (m for help): p
Disk /dev/nvme0n2: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3675abb3
Device Boot Start End Sectors Size Id Type
/dev/nvme0n2p1 2048 4196351 4194304 2G 83 Linux
/dev/nvme0n2p2 4196352 14682111 10485760 5G 5 Extended
/dev/nvme0n2p3 14682112 18876415 4194304 2G 83 Linux
/dev/nvme0n2p4 18876416 20971519 2095104 1023M 83 Linux
/dev/nvme0n2p5 4198400 14682111 10483712 5G 83 Linux
Partition table entries are not in disk order.
Command (m for help): w 保存并退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```
查看分区
[root@localhost ~]# fdisk /dev/nvme0n2 -l
Disk /dev/nvme0n2: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3675abb3
Device Boot Start End Sectors Size Id Type
/dev/nvme0n2p1 2048 4196351 4194304 2G 83 Linux
/dev/nvme0n2p2 4196352 14682111 10485760 5G 5 Extended
/dev/nvme0n2p3 14682112 18876415 4194304 2G 83 Linux
/dev/nvme0n2p4 18876416 20971519 2095104 1023M 83 Linux
/dev/nvme0n2p5 4198400 14682111 10483712 5G 83 Linux
Partition table entries are not in disk order.
```
分区的原因:不划分分区没有办法直接把数据写入到硬盘的,要存放数据之前必须要指定文件类型,指定文件类型只能对分区进行一个格式要求,对硬盘是没办法的。就跟在Windows下面可以格式化C盘,但是没有办法直接格式化硬盘。
###### 3、格式化
格式化的目的: 是为了形成文件系统,文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。
命令格式: `mkfs|mkfs.xfs|mkfs.ext4 [选项] 分区的设备名`
选项:
> -t 文件系统类型——当命令名为mkfs时,指定要创建的文件系统的类型(如:xfs、ext4、vfat等)。当命令名为mkfs.xfs、mkfs.ext4等时,不需要该选项。
> -c——建立文件系统前先检查坏块。
> -V——输出建立文件系统的详细信息。
注意:如果已有其他文件系统创建在此分区,必须在`mkfs.xfs` 命令中加上选项`-f`强行进行格式化
我们在这里选择mkfs.xfs,因为红帽自7后默认都是xfs.
对p1分区进行格式化
[root@localhost ~]# mkfs.xfs /dev/nvme0n2p1
4、挂载
挂载就是将一个分区或者设备挂载至挂载点目录。
将格式化后的分区(我们接下来称之为源)比作水桶,而挂载操作就相当于给源接了一根水管,之后,我们要往源中写入数据,就是通过这跟水管进行的。如果没有这根水管,数据就存不到源中,也就是数据无法保存到硬盘里面。因此,格式化操作后的硬盘,必须挂载在一个文件目录下,才能对此分区进行数据的书写。
#创建挂载点目录
[root@localhost ~]# mkdir /p1
#查看格式化后的磁盘分区信息
[root@localhost ~]# blkid
挂载分区
[root@localhost ~]# mount /dev/nvme0n2p1 /p1 将分区挂载到根下的P1的目录中
#查看挂载信息
[root@localhost ~]# mount | grep /p1
/dev/nvme0n2p1 on /p1 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
```
手动挂载的分区会在系统重启后失效,若用户需要永久挂载分区,则需要通过编辑`/etc/fstab`文件来实现。当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。
设置系统启动时的自动挂载
打开配置文件:[root@localhost ~]# vim /etc/fstab
设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=8504ce6d-661d-4c96-b3ff-452313748cd6 /boot xfs defaults 0 0
/dev/mapper/rhel-swap none swap defaults 0 0
```
用于挂载信息的指定填写格式中,各字段所表示的意义
| 字段 | 意义 |
| -------- | ------------------------------------------------------------ |
| 设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
| 挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
| 格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
| 权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
| 是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
| 是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
```
/dev/nvme0n2p1 /p1 xfs defaults 0 0 自己在配置文件中写的挂载信息 保存并退出
```
通过mount -a命令去读取配置文件中新添加的信息。
取消挂载:
- 卸载分区,要移除USB磁盘、U盘、光盘和硬盘时,需要先卸载。
命令:`umount 挂载点目录或存储设备名`
[root@localhost ~]# umount /p1
[root@localhost ~]# mount | grep /p1
[root@localhost ~]#
```
注意一点,就是之前有挂载的时候需要先取消挂载,再通过mount -a命令去读取配置文件中新添加的信息。
```
[root@localhost ~]# mount -a
[root@localhost ~]# mount | grep /p1
/dev/nvme0n2p1 on /p1 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
[root@localhost ~]#
```
交换分区
在Linux系统中,swap交换分区的作用类似于Windows系统中“虚拟内存”。当有程序被调入内存后,但是该程序又不是常被CPU所取用时,那么这些不常被使用的程序将会被放到硬盘的swap交换分区当中,而将速度较快的内存空间释放给真正需要的程序使用,以避免由于物理内存不足而造成的系统效能低的问题。如果系统没有swap交换分区,或者现有交换分区的容量不够用时,可扩展swap交换分区。
扩展swap交换分区的方式有两种:
| 命令 | 功能 |
| -------------------------- | ---------------------------------------------- |
| mkswap 分区设备名 | 将指定的分区格式化为swap交换文件系统 |
| swapon 交换分区设备名\|-a | 启用(或激活)指定的交换分区或所有交换分区 |
| swapoff 交换分区设备名\|-a | 禁用指定的交换分区或所有交换分区 |
| swapon -s | 查看交换分区的使用情况 |
| free -m | 以兆字节为单位显示物理内存、交换分区的使用情况 |
交换分区和之前分区的区别就是格式化的时候不一样的
格式化:
将P3分区格式化为交换分区
[root@localhost ~]# mkswap /dev/nvme0n2p3 (挂载)
激活swap分区(临时生效),并查看这个分区是否生效
[root@localhost ~]# swapon /dev/nvme0n2p3 激活swap分区
[root@localhost ~]# swapon -s 查看该分区是否生效
Filename Type Size Used Priority(优先级不看前面的-,数字越小优先级越高)
/dev/dm-1 partition 2097148 0 -2
/dev/nvme0n2p3 partition 2097148 0 -3
永久挂载和刚刚方式一样也是需要修改配置文件,并激活。
管理逻辑卷
在对磁盘进行分区大小规划时,有时往往不能确定这个分区要使用的总空间大小。而用fdisk对磁盘进行分区后,每个分区的大小就已经固定了,如果分区设置的过大,会白白浪费磁盘空间;分区设置的过小,就会导致空间不够用的情况。这个时候,就可以用到LVM(Logical Volume Manager,逻辑卷管理)。
LVM是 Logical Volume Manager(逻辑卷管理)的简写,LVM将若干个磁盘或者磁盘分区连接为一个整块的卷组,形成一个存储池。管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。(其实就是在标准分区上添加一个逻辑层)
- LVM基本概念
通过LVM技术,屏蔽了磁盘分区的底层差异,在逻辑上给文件系统提供了一个卷的概念,然后在这些卷上建立相应的文件系统。在了解LVM之前,先熟悉LVM中几个常用的术语。
(1)**物理存储设备**(The physical media):指系统的存储设备文件,如:/dev/hda1、/dev/sda等等。硬盘
(2)**物理卷**(physical volume):简称PV,物理卷可以是整个硬盘、硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
(3)**卷组**(Volume Group)**:**简称VG,可以看成单独的逻辑磁盘,建立在PV之上,一个卷组中至少要包括一个PV,在卷组建立之后可以动态的添加PV到卷组中。卷组的名称可以自定义。
部署逻辑卷
常用的LVM部署命令
| 功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
| --------- | ---------- | --------- | ---------- |
| 扫描 | pvscan | vgscan | lvscan |
| 建立 | pvcreate | vgcreate | lvcreate |
| 显示 | pvdisplay | vgdisplay | lvdisplay |
| 删除 | pvremove | vgremove | lvremove |
| 扩展 | | vgextend | lvextend |
| 缩小 | | vgreduce | lvreduce |
1、再添加一块硬盘,将目前添加的两块硬盘整和成一个硬盘
先通过lsblk看是都将硬盘添加成功
[root@localhost ~]# lsblk
将每个硬盘都做成一个分区
查看lvm工具在主机上是否存在
[root@localhost ~]# rpm -qa | grep lvm
llvm-libs-13.0.1-1.el9.x86_64
lvm2-libs-2.03.14-4.el9.x86_64
lvm2-2.03.14-4.el9.x86_64
libblockdev-lvm-2.25-11.el9.x86_64
udisks2-lvm2-2.9.4-3.el9.x86_64
```
创建pv
pv常用工具
[root@localhost ~]# pv
pvchange pvck pvcreate pvdisplay pvmove pvremove pvresize pvs pvscan
更改 检查 创建 显示 移动 移除 重置大小 显示 显示
```
创建物理卷 (创建前需要将该挂载的分区取消挂载)
[root@localhost ~]# pvcreate /dev/nvme0n2p1 /dev/nvme0n3p1
WARNING: xfs signature detected on /dev/nvme0n2p1 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/nvme0n2p1.
Physical volume "/dev/nvme0n2p1" successfully created.
Physical volume "/dev/nvme0n3p1" successfully created.
```
检查是否创建成功
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p2 rhel lvm2 a-- <19.00g 0
/dev/nvme0n2p1 lvm2 --- 2.00g 2.00g
/dev/nvme0n3p1 lvm2 --- <10.00g <10.00g
```
创建vg
将两个硬盘整合成一个空间,需要用的是卷组的命令,这边指定卷组名为vg1,并指明要整合的是哪些逻辑卷。
[root@localhost ~]# vgcreate vg1 /dev/nvme0n2p1 /dev/nvme0n3p1
Volume group "vg1" successfully created
```
查看卷组信息
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <19.00g 0
vg1 2 0 0 wz--n- 11.99g 11.99g
创建lv
有两种方式,一种是通过-L指定逻辑卷大小,一种是通过-l指定所占卷组的百分比。
在这边我们通过-l来实现。
[root@localhost ~]# lvcreate -n lv1 -l 100%FREE vg1
Logical volume "lv1" created.
[root@localhost ~]#
```
查看lv
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rhel -wi-ao---- <17.00g
swap rhel -wi-ao---- 2.00g
lv1 vg1 -wi-a----- 11.99g
```
格式化逻辑卷
[root@localhost ~]# mkfs.xfs /dev/vg1/lv1
meta-data=/dev/vg1/lv1 isize=512 agcount=4, agsize=785920 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=3143680, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]#
挂载后就可以使用了。
部署逻辑卷(从小分区扩大成大分区)
提示:在做分区之前都得先取消挂载。
删除逻辑卷
[root@localhost ~]# lvremove /dev/vg1/lv1
Do you really want to remove active logical volume vg1/lv1? [y/n]: y
Logical volume "lv1" successfully removed.
重新创建逻辑卷
[root@localhost ~]# lvcreate -n lv1 -L 8G vg1
WARNING: xfs signature detected on /dev/vg1/lv1 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/vg1/lv1.
Logical volume "lv1" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rhel -wi-ao---- <17.00g
swap rhel -wi-ao---- 2.00g
lv1 vg1 -wi-a----- 8.00g
格式化
[root@localhost ~]# mkfs.xfs /dev/vg1/lv1
meta-data=/dev/vg1/lv1 isize=512 agcount=4, agsize=524288 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=2097152, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载
[root@localhost ~]# mount /dev/vg1/lv1 /mnt
[root@localhost ~]# mount | grep /mnt
/dev/mapper/vg1-lv1 on /mnt type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
```
扩大
扩大的时候如果卷组空间不够的话,应该先扩大卷组,再扩大逻辑卷(这边因为空间是够的,所以直接去扩大逻辑卷)
扩大的时候是不需要去取消挂载的
[root@localhost ~]# lvextend /dev/vg1/lv1 -L +2g
Size of logical volume vg1/lv1 changed from 8.00 GiB (2048 extents) to 10.00 GiB (2560 extents).
Logical volume vg1/lv1 successfully resized.
对新添加的空间格式化
[root@localhost ~]# xfs_growfs /mnt
meta-data=/dev/mapper/vg1-lv1 isize=512 agcount=4, agsize=524288 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=2097152, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 2097152 to 2621440
```
通过df -h 查看
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 845M 0 845M 0% /dev
tmpfs 875M 0 875M 0% /dev/shm
tmpfs 350M 9.7M 341M 3% /run
/dev/mapper/rhel-root 17G 4.8G 13G 28% /
/dev/nvme0n1p1 1014M 261M 754M 26% /boot
tmpfs 175M 92K 175M 1% /run/user/0
/dev/sr0 8.0G 8.0G 0 100% /run/media/root/RHEL-9-0-0-BaseOS-x86_64
/dev/mapper/vg1-lv1 10G 104M 9.9G 2% /mnt
```
删除逻辑卷
怎么创建,倒着往回一层一层删除。
先取消挂载
[root@localhost ~]# umount /mnt
[root@localhost ~]# mount | grep /mnt
移除逻辑卷
[root@localhost ~]# lvremove /dev/vg1/lv1
Do you really want to remove active logical volume vg1/lv1? [y/n]: y
Logical volume "lv1" successfully removed.
移除vg
[root@localhost ~]# vgremove /dev/vg1
Volume group "vg1" successfully removed
移除pv
[root@localhost ~]# pvremove /dev/nvme0n2p1
Labels on physical volume "/dev/nvme0n2p1" successfully wiped.
[root@localhost ~]# pvremove /dev/nvme0n3p1
Labels on physical volume "/dev/nvme0n3p1" successfully wiped.
通过fdisk删除分区