学自尚硅谷武晟然老师,结合老师课堂内容和自己笔记所写博文。
Shell的定义
Shell可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我们可以
通过终端控制台来输入命令,由Shell进行解释并最终交给内核执行。所以Shell其实就是连接外部应用和Linux内核的一个桥梁,也是我们在Linux系统上执行操作的主要手段。
Shell的由来
在Linux中,Shell的具体实现可以多种多样。在当前Centos7中,bin下面有一个叫做sh的命令,它就是整个shell命令的入口。控制台交互式界面中执行的就是这个sh命令。
sh
前面我们发现sh图标有一个小箭头,我们看一下它的属性就会发现其实是链接到了bash,所以在centos7下边默认的shell工具其实就是bash。
测试:
我们是通过ls -l /bin/ | grep sh
命令,去bin目录下筛选出带着sh的项目,然后每一个都用一行把它的完整信息列举出来。在这里也可以看到sh链接的就是bash。
man
man是manual的缩写,就是我们的命令手册。它里边的内容非常丰富,几乎包含了Linux使用的方方面面的问题。
示例:
我们通过man ls来查看ls的具体用法:
①NAME:说明ls这个命令要做的事就是列出目录下的内容
②提要:当前命令的基本使用语法。首先ls,然后可以给出各种各样的选项(这个选项一般就是后面要加一个杠,然后给一个参数),最后面可以加上文件名。
③描述:列出了所有参数的含义,这部分基本上就包含了这条命令的所有用法。
翻页等操作:用上、下键头可以一行一行挪动。
----如果我们嫌这个挪得太慢的话,直接按空格进行翻页。和可以按Page Down和Page Up向下、向上翻页。
----还可以通过快捷键F朝下翻页,B朝上翻页
退出:q
外部命令与内置命令
我们man cd查看cd的用法,进来后会发现这是对bash的解释。
这是因为一部分基础功能的系统命令是直接内嵌在shell中的,系统加载启动之后会随着 shell一起加载,常驻系统内存中。这部分命令被称为内置(built-in)命令;相应的其它命令被称为外部命令
判断一个命令是内嵌命令还是外部命令:type
命令。
可以看到cd是内置命令,就会有相应提示。
可以看到ls不是内置命令,就不会有相应提示。
我们可以看到history是内置命令
查看内置命令的方法:
直接在man
和命令
中间加上-f
即可:man -f 命令
。
我们可以看出cd的描述如下。man手册是分册来管理,所以cd在第1册、3tcl册、1p册中均有描述。其中,1p的p代表POSIX标准,代表IEEE提出的开发可移植操作系统接口的标准。
简化版的命令查询
man本身也是一个命令,我们直接man man可以看到内容非常复杂,有时候我们只是想看命令的那参数怎么用的。
可以使用help 命令,但是只能查询shell内置命令的帮助信息。比如我们这里看cd命令的用法,很简洁。
Shell中常用的快捷键
①ctrl + c:停止进程
②ctrl+l:清屏,等同于 clear。这种方式其实本质上并不是清屏,它只是把显示界面往上推了一下而已。
③彻底清屏:reset。这种方式本质上是把当前的shell环境全部重新启动,这个时候你要再往上翻就没有了。
④善于用tab键提示(更重要的是可以防止敲错)
⑤上下键查找执行过的命令
pwd
pwd的全称是print working directory
,打印当前工作目录的绝对路径(从根目录开始一直走到当前工作目录这条路),是个内置命令。在终端中那个小波浪号就代表当前用户的主文件夹。
示例:我们不在虚拟机上打开终端去输命令了,因为实际工作的时候一般都是用远程登录的方式,所以我们使用XShell远程登陆进行操作。我们输入pwd【内嵌】,结果如下:
当我们切换目录后,再使用pwd可以看到当前工作目录改变了。
绝对路径:从始到终每一级都在
相对路径:针对当前所在的位置
cd
cd的全称是change directory,用法为cd 参数,参数目录如下:
cd 绝对路径:切换路径
cd 相对路径:切换路径
cd ~或者 cd:回到自己的家目录
cd -:回到上一次所在目录
cd …:回到当前目录的上一级目录
cd -P:跳转到实际物理路径,而非快捷方式路径
示例: 切换目录之桌面,可以看到当前的工作目录就变成了/root/桌面
问题:现在有两个目录a/b/c/d和a/b/c/e,如果我想从d跳转到e,难道每次使用cd命令都要加上前面的a/b/c?
答案:不需要,可以使用相对路径。比如说我们当前在/root/桌面目录下,而root目录下还有个视频目录,则我们可以通过cd …/视频/切换到视频目录。
…/ 退回到上级目录
ls
ls就是list的缩写,作用是列出目录内容,包括文件和文件夹。ls后面可以跟许多选项,常用的是下面两种。
基本语法: ls [选项] [目录或文件]
常用选项
示例: 直接使用ls,可以看出列出了当前目录下的所有文件和目录。黑色的是文件,蓝色的是目录。
示例: 使用ls -a,可以看到隐藏的文件和文件夹都列出来了。在Linux中,以.开头的是隐藏文件/目录。
以 . 开头,就是隐藏的文件或文件夹
我们注意到这里面有个.
和..
,其中.
代表当前目录,..
代表上一级目录。这也是为什么我们可以在当前目录下使用cd ..
跳转到上层目录,也可以使用cd ./
以相对路径的方式跳转到其它目录,比如说这里我们通过cd ./桌面/
跳转到桌面目录中。
.bashrc
·.bashrc·这个文件非常重要,它就是我们当前用户的一个非常重要的配置文件,很多相关的环境变量、一些别名等都可以在里边去进行配置。这个是后话,我们用到的时候再说。
示例: ls -l中的-l是指以长数据串列出,l就是long的意思。也就是把当前文件的属性、权限、所属用户等各种信息全列出来,列成一行。
可以看到文件许多详细信息都被列举出来了。之前我们区分是文件还是文件夹是按照颜色来判别的,但是这个东西貌似不太靠谱,万一要是颜色错了就搞不清楚到底是什么东西了。其实这里很明确的判别方式:如果是一般文件,它的开头就是-。如果是目录,它的开头就是d,代表directory。
ls -l与ll
ls -l与ll是同一个东西,我们可以通过type ll看出他就是ls -l的一个别名而已。
mkdir
mkdir: 就是make directory的缩写,创建目录
基本语法: mkdir [选项] 要创建的目录
示例: 通过mkdir a在当前目录创建一个目录a
示例: 通过mkdir /b在当根目录创建一个目录b
示例: 通过mkdir b c在当根目录创建一个目录b和一个目录c
注意: 不能嵌套地去创建目录。比如说我想创建一个目录d,然后在d下面创建一个目录e,然后在e下面创建一个目录f。不能直接通过mkdir d/e/f来创建。
解决方案①:依次创建各级目录:mkdir d、mkdir d/e、mkdir d/e/f
rmdir
rmdir: 就是remove directory的缩写,移除一个空目录。
基本语法: rmdir 要删除的空目录
示例: 通过rmdir a删除当前目录中的目录a
解决方案②:通过使用rmdir -p来删除,但是无法直接使用
这时需要删除最底层的目录,如果删完了之后它的父目录变成空的了,这个时候就可以直接删掉
touch
基本语法: touch 文件名称
示例: 通过touch hello
在当前目录下创建一个hello文件。文件不带后缀名时默认就是文本文件,可以直接打开。
示例: 通过touch /home/xzz/hello2
在/home/xzz目录下创建一个hello2文件。
示例: 可以通过vim创建文本文件,但是如果是以q退出文本文件,则无法保存文件,文件也就会不存在。而touch是可以创建空文件的。
cp
cp: 就是copy的缩写,复制文件或目录到另一个地方。
基本语法: cp [选项] source dest (复制source文件到dest)
使用vim打开hello2文件,可以看到内容被覆盖
当我们复制一个文件到另外一个含有同名文件的目录下时,也会提醒我们是否覆盖。我们这里再将initial-setup-ks.cfg
复制一次到/home/xzz/
目录下。
取消提示: 在cp前面加个\
就可以不再提示是否覆盖而是直接进行覆盖。我们这里将initial-setup-ks.cfg
复制到/home/xzz/
目录下的hello3
中。
然后可以看到hello3的内容被覆盖
原因分析: 我们使用type cp命令可以看到cp其实是cp -i的别名
cp
是个内置命令,我们通过cp --help
去看看这个-i
选项代表什么。可以看到-i代表以交互式的形式进行复制,所以会有提醒。
同样的,ls
也是个内置命令,我们通过cp --ls
可以看到ls
是ls --color=auto
的别名,代表将文件和目录以不同颜色显示出来。
在命令前面加个
\
代表使用原生命令,即不加参数。于是我们在ls
前面加个\
,通过\ls
可以看出不再显示文件和目录颜色了。
复制目录:
我们也可以将目录复制到其它地方,但是直接复制目录没有意义,需要将目录下的所有内容一起复制过去。此时需要加上-r
选项,代表递归复制整个文件夹。
示例: 首先在当前目录下创建一个目录a
,然后将initial-setup-ks.cfg
复制到目录a
下,最后通过cp -r
将整个目录a下的所有内容复制到/home/xzz/
下。可以看到成功将所有内容复制过去了,包括这个initial-setup-ks.cfg
文件。
查看别名的命令:alias
rm
基本语法: rm [选项] 要删除的文件
功能描述: 删除指定的文件。加上一些选项还可以删除目录中的所以内容。
选项说明:
示例: 通过rm hello
直接删除当前目录下的hello文件,会让我们确认是否删除
这是因为rm
是rm -i
的别名
通过加上参数-f可以不提示。这里我们通过rm -f hello4
删除hello4文件。
示例: 加上-r可以递归删除目录下的所有内容。我们这里使用rm -r a\
删除目录a\
下的所有内容。
可以看到会一直提示我们是否删除,所以加上-r,即使用命令rm -rf c\可以直接删除目录c\下的所有内容。
注意: 不要使用rm -rf /*
,这就相当于把根目录下边的所有内容都删除掉。这个可以认为是一个通配符,将目录下的内容都删除,但是保留这个目录名。
示例: 我们这里有一个目录e,里面有个文件hello。我们通过rm -rf ./e/*
删除这个目录下的所有内容,但是保留这个目录。
mv
基本语法:
①mv 需要移动的文件名 新的文件名
②mv 需要移动的文件名 路径
功能描述: 语法①代表将文件移动到新的路径,并且改个名字。语法②代表将文件移动到新的路径。
示例: 当前目录下有文件hello,有空目录e。现在通过命令mv hello ./e/
将文件hello移动过去。
示例: 现在通过命令mv ./e/hello aaaa
将目录e下的文件hello移动到当前目录下,然后将名字改为aaaa。
cat
基本语法: cat [选项] 要查看的文件
功能描述: 直接打开文件查看其内容,不对其做任何修改。但是一次会将所有内容全部显示出来,如果文件内容较多,需要一直往上移动才能看到前面的内容。
选项说明: -n
:显示所有行的行号,包括空行
示例: 通过cat initial-setup-ks.cfg
查看该配置文件的内容
more
基本语法: more 要查看的文件
功能描述: more指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。
操作说明:
示例: 通过more initial-setup-ks.cfg
查看该配置文件
less
基本语法: less 要查看的文件
功能描述: less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
操作说明:
示例: 通过less initial-setup-ks.cfg
查看该配置文件
echo
基本语法:echo [选项] [输出内容]
功能描述: 输出内容到控制台
选项:-e
代表支持反斜线控制的字符转换,
如
\\
代表输出\
本身,
\n
代表换行符号,
\t
代表制表符(Tab键)
示例: echo还可以看当前系统的环境变量,用法为echo $环境变量
。如果我们不知道看什么环境变量,直接echo $制表符(Tab)
,然后输入y,就能显示所有的环境变量。
里面有很多我们熟悉的环境变量,如PATH、USER、HOSTNAME,在这里路径下可以直接去执行系统命令。
诸如ls、cp等命令这些命令明明不在当前目录下却可以执行,这是因为这些命令所在路径都在环境变量PATH里面声明。所以我们调用命令就像在当前目录下调用一样。
输出重定向
基本语法:
head
基本语法:
head 文件 (功能描述:查看文件头10行内容)
head -n 5 文件 (功能描述:查看文件头5行内容,5可以是任意行数)
功能描述: head用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容。
示例: 使用head命令来查看info文件的开头部分内容。
tail
功能描述: tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的后10行内容
基本语法:
监控文件变化
我们打开两个终端,一个终端输入tail -f info
,另一个终端用于向info
文件中追加内容。
现在我们向info追加一些字符串,可以看到左边也会同步更新。
我们在左边按ctrl s暂停监控,然后在右边继续追加字符串,可以看到左边没有同步更新(但是追加的内容实际上是保存着的)。
我们在左边按ctrl q继续,可以看到之前暂停监控期间追加的东西又一下子出现了。
最后按ctrl c退出。
==注:==如果不是追加而是直接覆写会报错
一些特殊情况:
如果我们用vim在这个文件末尾追加内容,然后保存退出。
左边监控的内容不会增加:这是因为Linux里面所有硬盘分区的文件都会分配一个编号,我们把这个编号叫做index,即索引节点号。可以用ls -i命令直接看到这个节点号,在跟踪时是根据这个索引号去跟踪的。当我们用vim修改后这个索引号就变了,所以可以认为这个文件本质上变成了另外一个文件。
软连接
ln就是link的简写,很显然就是要创建一个链接,链接到某个其他文件或者目录上面。所以我们一般用ln来创建一个软链接
软链接
软链接跟Windows里边的快捷方式非常的类似。如果说我们要为一个文件或者一个目录创建一个软链接的话,那就相当于另外一个地方有一个单独的文件,这个文件链接到这个原始文件上的。链接文件有自己的数据块,它保存的主要就是链接的那个文件或目录的路径。这样的话,通过当前的快捷方式,这个链接就可以跳转到我们真正要访问的那个文件上。这其实就有点像指针,当前我们创建的链接就相当于是一个指针,它指向另外一个内存空间对应的变量,而自己也可以看成一个单独的特殊的变量。
linux中的软链接案例
在根目录下的bin目录是一个快捷方式,它链接到的是user下边的bin目录。同样,sbin目录也是一个软链接,它链接到的是user下边的sbin目录。
ln
基本语法: ln -s [原文件或目录] [软链接名]
软链接还有另外一个名字,符号链接。因为本质上来讲,我们是为原始的文件创建了一个链接到它的符号。在使用的过程中,一般就是要ln后边加一个固定的选项,那就是-s
。s就是soft的第一个字母,ln -s
就是创建一个软链接的标准语法,后面就是我们的源文件或者目录的名称、创建的软连接的名称。
示例: 链接一个文件
我们想在用户xzz的主目录下创建一个链接,链接到root主目录下的info文件。
在用户xzz的主目录下通过命令ln -s /root/info Myinfo
创建链接。创建之后i我们看到它的颜色跟前面普通文件以及目录的颜色都完全不一样,我们用ls -l看一下,前面是l开头,表示当前这是一个链接文件。
示例: 链接一个目录
我们在root根目录下创建一个folder目录,里面再创建一个file文件。
我们在用户xzz的主目录下创建一个链接,链接到root主目录下的floder文件夹,这个链接名字叫做myFolder。可以看到,该链接下有文件fold
我们进入这个软链接下,使用pwd查看当前file文件的目录,可以看到,显示的就是当前的目录,而不是file文件实际的目录。
接着,我们在root根目录下使用cd -P命令转到这个软链接所在目录。可以看到会转到这个软链接指向的目录实际所在目录。
示例: 删除软链接目录
使用命令rm -rf 链接名删除链接目录。可以看到删除之后软链接没了,而原始的目录还在。
如果rm -rf 链接名/
删除链接目录,则会把软链接对应的真实目录下内容删掉。这里可以看到虽然原始目录folder还在,但是里面的文件file已经没了。
示例: 删除原始目录,不删除软链接文件,然后使用软连接文件去访问原始目录。
可以发现提示不存在这个文件夹。
硬链接
单独给文件建一个链接
基本语法: ln [原文件或目录] [软链接名]
硬链接的定义:
文件有一个非常重要的信息叫做inode,保存了文件对应的一些元信息(meta data),如文件的类型、文件的权限、当前的链接数、创建时间等等。这里边有一个非常关键的信息就是这个文件的唯一编号,即索引节点号。Linux允许不同的文件名称指向同一个inode节点,这样的话就有了一种用法,即创建一个新的硬链接去链接到具体存放数据的那一块区域。这样的话我们可以直接创建一个指向inode的相同的一个文件名,这对于之前的这个文件没有任何的影响,只是纯粹多了一个新的链接而已,这种链接方式就叫做硬链接。
硬链接的特点:
比如说有两个硬链接a和b都链接到同一个文件,删除a后对b没影响,因为a和b是完全平等的。而对于软链接,如果删除了原始文件或目录,就无法通过软链接再去访问原始文件了。
当前文件的链接数:
指的并不是软链接的数量,因为软链接可以认为就是一个单独的链接文件。真正指的是它的硬链接的数量,硬链接相当于都是完全平等的,你删掉一个那另外一个还可以直接访问。在实际使用的时候,硬链接用的比较少,因为这种方式跟文件的inode相关,只能创建一个文件的硬链接,而不能针对目录去创建硬链接。
history
功能描述: 查看历史输入的命令
示例: 通过history查看所以已经执行过的历史命令
通过history 10查看最近10条使用的指令
通过!345查看第345条指令
使用history -c删除历史命令
date
基本语法:date [选项]… [+时间日期格式]
选项说明:
-d <时间字符串>:显示指定的“时间字符串”表示的时间,而非当前时间。
-s <日期时间>:设置系统日期时间。
参数说明:
<+日期时间格式>:指定显示时使用的日期时间格式
date显示当前时间:
在date后面加上%Y、%y、%m、%d等选项,显示当前年、月、日等信息
通过命令date +%Y-%m-%d-%H:%M:%S
来按照年-月-日-时:分:秒的方式来显示当前时间。
大写S和小写s的区别:S代表当前的秒数,s代表时间戳(显示从1970年1月1日到现在过去了多少秒)。在写系统日志的时候,时间戳是很有用的。
可以通过ntpdate 服务器来同步当前时间,会显示时间的差值。
asia.pool.ntp.org
cal
基本语法: cal [选项] (功能描述:不加选项,显示本月日历)
选项:
cal -[数字]:显示前后指定月的日历。
cal -m:将周1放在最前面
cal [具体年份]:看具体年份的日历
cal -y:看本年度的日历
背景
Linux系统是一个多用户多任务的分时操作系统,所以可能会有很多人都用同一台机器进行操作,甚至有可能还是同时登陆同时操作的。所以人一多,我们就要进行很好的管理才行,必须对于不同的用户给予他们一个相应的身份呢。也就是说给用户一个特别的帐号,这个帐号可以设置自己的密码,然后就会有着不同的权限。用户想要登录系统的时候,就分配的账号去登录系统,然后就可以获取到不同的系统资源。这就是用户管理的基本的思想。(注:必须以root的身份去进行用户管理操作)
useradd 添加新用户
基本语法: useradd 用户名 (功能描述:添加新用户)
示例: root用户的主目录是/root,普通用户的主目录是/home/用户。现在通过useradd tony
创建一个普通用户tony,看看是否会存在/home/目录下。
可以看出创建的普通用户出现在/home/目录下。
示例: 对于普通用户的主目录是可以改变的。我们通过useradd -d /home/dave david
创建一个普通用户david,同时让其主目录为/home/dave。
可以看出,当我们查看home目录时,出现的是david的主文件夹名称dave,但是用户的名称是david。
passwd 密码设置
基本语法: passwd 用户名 (功能描述:设置用户密码)
示例: 通过passwd tony给tony设置密码。
设置之后就可以用tony的账号登录了。
id 查看用户是否存在
基本语法: id 用户名
示例: 通过id查看一些用户是否存在。
可以发现存在的用户会打印出uid(用户ID)和gid(组ID),而dave是david的主目录而不是用户名称,所以不存在。
cat /etc/passwd 查看创建了哪些用户
从中可以看出:
①最上面有一堆其他的用户,这些用户好像我们都从来没见过,没什么用。实际上这里的大多数用户都是系统默认创建出来的,比方说bin、daemon、shutdown等。这都是跟系统服务相关的,这些用户就是单独创建出来运行相应的系统服务。所以这些用户一般被称为系统用户,或者叫伪用户,就是它并不能作为真正用户的身份去登录,它就是用来去运行系统里边的服务。
②刚才创建出来的那些用户在文档最后面。分别列出了uid、gid、主目录、登录交互方式。
每个用户登录系统时需要跟系统进行交互,/bin/bash代表跟shell交互。前面很多系统用户跟系统交互的方式都是nologin,即不用去登录,本身默认就是运行系统服务的。
su 切换用户
基本语法
su 用户名称 (功能描述:切换用户,只能获得用户的执行权限,不能获得环境变量)
su - 用户名称 (功能描述:切换到用户并获得该用户的环境变量及执行权限)
案例: 通过su xzz切换用户xzz,可以看到当前的主目录也变成了/home/xzz。
当前用户是xzz,我们继续使用su tony切换到tony用户,可以看出要输入密码。执行ls,可以发现普通用户无法查看另一个普通用户的主目录下的内容。
切换回root用户
①通过su root
②当前的用户切换跳转是一个层层嵌套的会话,即root嵌套xzz嵌套tony。我们可以通过exit层层返回。
查看当前登录的用户
who am i
查看当前登录的用户的进程相关信息。
whoami
查看当前登录的用户。
案例: 通过root用户登录,查看登录的用户信息。然后切换用户,再查看登录的用户信息。可以看到who am i始终显示真正的登陆的用户,因为切换用户还是基于当前的root用户创建的会话,这个进程还是root创建的。
sudo 设置普通用户具有root权
现在我们登录的是普通用户tony,无法访问root用户的主目录。
如果我们想临时赋予tony一些超级管理员的权限,可以使用sudo加上命令。
但是这里还是没有成功,我们需要在root用户下去修改/etc/sudoers
这个配置文件。可以看到下面这一行代表了root可以在任何地方执行任何指令。
然后进行测试,此时就可以使用sudo ls查看root主目录下的内容了。
userdel 删除用户
基本语法:
userdel 用户名 (功能描述:删除用户但保存用户主目录)
userdel -r 用户名 (功能描述:用户和用户主目录,都删除)
==注:==该操作要在root用户下操作。
示例:
使用userdel tony删除tony用户,但是保留主目录。一般这种情况用的多,因为虽然用户不在了,但是可能他之前的文件还有用。
使用cat /etc/passwd可以看到没有tony用户了
我们userdel -r david删除david,可以看到主目录没了。
同时,passwd文件也没有david用户了。
用户组管理
用户组就相当于一个小组,比如一个公司里面有研发组、测试组、运维组等等。每个组内的用户负责不同的事情,这就相当于拥有了系统里面不同的权限。Linux里面默认创建新用户时,会创建一个跟用户名相同的组名、跟用户ID相同的组ID。
现在,我们想新建一个meifa组,使用命令groupadd meifa
。然后使用命令cat /etc/group去查看group配置文件,可以看见成功创建了meifa组。
如果想修改组名,可以通过group -n 新组名 老组名
来完成修改,我们这里将meifa修改为harcut。
现在我们想将tony和david加入haircut组,可以使用usermod -n 用户组 用户名
。
此时查看tony和david的gid,可以发现已经变为1005了。
最后,由于将tony和david移动到了haircut组,所以我们将原来的david和tony组删除。可以通过groupdel 组名
来删除。
查看group配置文件,可以发现已经删除了。
wheel用户组
sudoers配置文件中有一个wheel用户组,它比较特殊,是管理组。在这个组里面的用户拥有权限去执行所有的命令。
我们可以先将atguigu用户移动到wheel组,然后切换到atguigu用户,执行sudo ls。可以发现虽然sudoers配置文件里面没有设置atguigu用户,但是仍然可以直接使用命令,这就是由于atguigu在wheel工作组里面的原因。
可以看到这里还是需要输入密码,可以使用下面那一行,即在sudoers配置文件的wheel后面加上NOPASSWD:ALL。这样使用sudo就不用输入密码了。
背景
问题: 前面我们介绍了用户管理和用户组管理的相关命令,我们就会思考一个问题:用户组划分出来之后是为了干什么?
答: 就是为了把很多用户做集中化管理。
问题: 这些用户集中在一起构成了一个用户组,怎样去针对他和其他的组进行区别?
答: 他们的区别在于拥有不同的系统操作权限。
问题: 用户除了可以访问各自的主目录里面的内容,其他的目录里的内容谁才可以访问呢?
答: 除了用户自己的主目录访问外,别的文件和文件夹针对不同的用户、用户组也有一个权限的划分。这就是文件权限的管理。
文件属性
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定,具体如下图所示。
文件权限涉及到硬件是因为Linux系统里边一切皆文件,所有的设备也是用文件来进行管理的,当然就得有对应的文件类型。对应这些设备文件可以在/dev/设备目录下边看到所有的内容。在Linux中我们可以使用ll或者ls -l命令来显示一个文件的属性以及文件所属的用户和组。
文件权限标识字符:
①0首位表示类型
-:代表文件
d:代表目录
l:代表链接文档(link file)
c:字符类型的设备文件。比如鼠标键盘,它们输入的操作可能涉及到字符。
b:块设备文件。比如硬盘。
②第1-3位确定属主(该文件的所有者)拥有该文件的权限 —User
③第4-6位确定属组(所有者的同组用户)拥有该文件的权限 —Group
④第7-9位确定其他用户拥有该文件的权限 —Other
rwx 作用文件和目录的不同解释:
①作用到文件:
[r]代表可读(read): 可以读取,查看
[w]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前
提条件是对该文件所在的目录有写权限,才能删除该文件。
[x]代表可执行(execute):可以被系统执行
②作用到目录:
[r]代表可读(read): 可以读取,ls查看目录内容
[w]代表可写(write): 可以修改,目录内创建+删除+重命名目录
[x]代表可执行(execute): 可以进入该目录,即cd命令
示例: 下面这些目录文件夹对于属主root有读、写、可执行权限,属组和其他用户拥有读和执行。
我们可以测试一下。
①退到根目录/,然后ll看当前目录的权限。可以看到root是有权限访问这个root目录的,root组的用户也可以访问,但是其他用户不能。
②使用ls -al,其中-a代表可以看到隐藏文件和目录(以一个点开头的)。因此,我们这里可以看到.和…对应的权限,对于当前目录.其他用户是无法访问的。
示例: 将这里的anaconda和initialsetup这两个cfg文件拷贝到普通用户xzz的用户目录下。
可以看到这两个文件的所属还是没变,权限也没变。因此使用cat访问anaconda这个配置文件就会出错。
而initialsetup配置文件是可以访问的,但是不能写入,除非使用sudo和wq!。
其中,如果查看到是文件:链接数指的是硬链接个数。如果查看的是文件夹:链接数指的是子文件夹个数。
示例: 这里的公共目录里面有2个子文件夹。
chmod 改变权限
背景: 如果当前想要去访问或修改一个文件里面的内容,但是又没有权限,这时最简单的想法当然就是切成root用户,或者说加上sudo,但是这个权限显然是非常大的。一般情况我只想访问某一个文件的时候,只要把对应这个文件的权限进行更改即可,这就相当于给我们提供了更加丰富、更加精细的对于权限的管理。
基本语法
第一种方式变更权限: chmod [{ugoa}{±=}{rwx}] 文件或目录
其中:u g o a分别代表属主、属组、其它、全部。+ - = 分别代表增加、减少、指定权限。rwx代表读、写、执行。
示例: 使用chmod u+x initial-setup-ks.cfg
命令为initial这个配置文件添加属主的执行权限。
通过chmod a=rw initial-setup-ks.cfg
为所有用户指定对initial配置文件的读写权限。
第二种方式变更权限: chmod [mode=421] [文件或目录]
其中,r=4 w=2 x=1, rwx=4+2+1=7
,其实就对应了rwx三位二进制的值。
rwx 1-x。001 2-w。010 3-wx。011 4-r。100 5-rx。101 6-rw。110 7-rwx。111
示例: 使用chmod 777 initial-setup-ks.cfg
为initial配置文件指定所有权限。
修改目录的权限
问题引出: 修改目录的权限涉及到另外一个问题:我们对于目录进行操作,当前目录拥有可读可写可执行权限了。假如它下面还有其他的子目录和子文件的话,那里边还是不可读不可写,那怎么办呢?
答案: 这时我们希望嵌套地递归,内部的所有子文件、子文件夹都拥有相关的权限。
具体做法为:加上-R,如chmod -R 777 xiyou/
。这是比较强大的一招,接下来这个目录就相当于谁都可以用,但是也要小心,这相当于开放了完整的权限,谁都可以去改,谁都可以去删。
chown 改变所有者
基本语法: chown [选项] [最终用户] [文件或目录]
(功能描述:改变文件或者目录的所有者)
选项: -R:递归操作,用于更改目录的所有者。
chgrp 改变所属组
基本语法: chgrp [最终用户组] [文件或目录] (功能描述:改变文件或者目录的所属组)
示例: 修改initial配置文件的属主和属组用户。
案例描述: 在公司里有不同的部门不同的组,比如大数据是一个部门,测试是一个部门。同一个组里面的人可以读取、修改属于该组的文件和目录,但是其他组成员就只能访问。
1、创建组和用户
使用groupadd bigdata
和groupadd test
创建大数据组和测试组。
查看/etc/group
配置文件,可以看到成功创建。
使用useradd -g 组名 用户名
为大数据组和测试组添加成员,并使用id 用户名
查看相关信息。
2、创建文件
切换到用户小明,在其主目录下创建代码文件import_code
该文件的权限如下。
此时如果切换到同组的小亮,可以看到小亮无法访问小明的主目录。
切换到home目录去,可以看到小明的主目录只对小明有所有权限
因此,需要让小明的主目录为属组成员开启可执行权限(代表可进入目录)和可访问权限。
此时小亮就可以进入小明的主目录并访问import_code文件了。
但是不能去修改该文件
即使加上wq!也无法保存,因为加感叹号相当于执行sudo,而小亮是没有sudo权限的。
如果想让该文件对组内成员可修改,则切换到小明,然后修改import_code的权限。
3、组外成员访问
假设测试组的小红想要访问该文件,可以看到连小明的主目录都进不去,于是需要为小明的主目录指定权限。
然后小红就能进去并访问import_code目录了,但是仍然不能修改。
如果此时测试组的小蓝转部门到大数据组,则可以看到成功转过来了。
小蓝此时对import_code文件也有修改权限了。
find
功能: find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件显示在终端。
基本语法: find [搜索范围] [选项]
选项说明:
-name<查询方式>
:按照指定的文件名查找模式查找文件
-user<用户名>
:查找属于指定用户名所有文件
-size<文件大小>
:按照指定的文件大小查找文件,单位为:
在文件大小前要加上 + 或 - 或 = ,代表大于、小于、等于文件大小。
示例: 当前目录下有个info文件,我在公共目录下也创建一个info文件,最后使用find -name info查找info文件。可以看出成功将两个info文件列举出来。
示例: 我们不光能够查找对应名字的文件,还可以按照名字的模式来查找。比方说我们最常用的星号就可以表示一个通配符,所有类似的文件都可以指定。现在我们使用find /root -name "*.cfg*
查找root目录下的所有.cfg文件,可以看到包括隐藏文件也查找出来了。
示例: 使用命令find /home -user tony
查找/home目录下的属于tony用户的文件。
现在使用find -size +1M来查看当前目录下大于1M的文件。
locate
功能: locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。
基本语法: locate 搜索文件
经验技巧: 由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库。(如果有错误说明没安装locate数据库,yum -y install mlocate)
示例: 使用locate tmp查找所有带tmp的文件和目录。
查找命令:
grep
功能: 前面的locate、find命令都是查找文件名,而grep是在文件里面去查找指定的内容,有点类似于在vim中的命令行模式下去搜索指定内容。
基本语法: grep 选项 查找内容 源文件
选项说明: -n 显示匹配行及行
示例: initial配置文件里面有一些boot,我们使用grep -n boot initial-setup-ks.cfg
在该文件中查找boot,并显示行号。
管道符
功能: 管道符|表示将前一个命令的处理结果输出传递给后面的命令处理,通常搭配grep使用。
示例: 目前桌面有两个.cfg文件,于是我们使用ls | grep .cfg
来筛选出ls出来的文件和目录中以.cfg结尾的文件。
示例: 前面我们统计了initial文件中的boot,现在我们想统计boot出现的次数。我们这里需要使用wc命令,wc就是word count的意思。比如我想统计info文件,可以使用wc info看出统计出行数、单词数、字节数信息。
现在我们将grep、|、wc命令结合使用,统计initial文件中boot出现的次数。可以看到出现了8次。
gzip/gunzip
基本语法:
gzip 文件 (功能描述:压缩文件,只能将文件压缩为.gz 文件)
gunzip 文件.gz (功能描述:解压缩文件命令)
经验技巧:
①只能压缩文件不能压缩目录
②不保留原来的文件
③同时多个文件会产生多个压缩包
示例: 我们这里有一个7M的文件,使用gzip进行压缩,可以发现压缩到3M。
zip/unzip
基本语法:
zip [选项] XXX.zip 将要压缩的内容 (功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip (功能描述:解压缩文件)
选项说明:
注: zip压缩命令在windows/linux都通用,可以压缩目录且保留源文件。
示例: 由于zip可以保留源目录与文件,所以我们使用zip -r myRoot.zip /root
将/root
目录进行压缩,并将压缩文件命名为myRoot.zip。
现在我们使用命令unzip -d /tmp myRoot.zip将这个压缩包解压缩到/tmp目录下。
现在我们去/tmp目录查看解压缩后的内容,可以发现root目录就在这里了。
进入root目录,可以发现里面的内容与root主目录的内容相同。
tar
基本语法:
tar [选项] XXX.tar.gz 将要打包进去的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)
选项说明:
示例: 使用命令tar -zcvf temp.tar.gz initial-setup-ks.cfg 公共/将initial
配置文件和公共目录进行打包,然后进行压缩,压缩后的文件名为temp.tar.gz。
现在使用tar -zxvf temp.tar.gz -C /tmp
将temp.tar.gz解压到/tmp目录
进入到/tmp目录中,可以发现这两个文件和目录就在这里了。
背景
①展示目录详细信息
前面我们讲过,使用ls -l
或者ll
命令可以详细地展示目录的信息。但是如果它的子目录里边又有嵌套的子目录,还有很多层级,这个时候我们就不方便直接看到了。对于这种显示,Linux里边有另外的一个小工具,tree。它以一个标准的树状目录把想要列举出的目录下面的所有子目录层级全部列出来。默认的Centos7里边没有这个工具,可以通过yum install tree
安装。安装完成后,查看当前目录的结构,如下所示。里面由于有汉字,所以这些数字是对应的Unicode。
②展示磁盘使用情况
不过我们还有另外一个需求,就是在实际的操作过程当中,我们不光是想要知道当前的目录结构,随着使用的时间越来越长,文件目录越来越多,这个层级结构会越来越复杂,所占用的硬盘空间也会越来越大。因此,我们随时都要关心当前的硬盘占用情况。虽然ls -lh可以明显的看出当前目录下边每一个文件到底有多大,但是假如我们使用ls -lg /查看根目录的文件大小,可以发现大小仅28K。
这是因为ls -lh
只是简单地把这里所有列举出来的文件和目录的大小做了叠加,而这里列举大小的时候并不是嵌套地把每一个目录的总大小都放在一起算。比如这里的root,我们前面看过root里边有很多几十M的东西,而在这里只有4K,他其实算的就只有当前这个目录。
所以我们更加希望的是,有单独的一个命令可以直接统计出当前目录里边所有内容,包括他下面的子文件、子文件夹占用硬盘空间大小。
du
du: disk usage 磁盘占用情况
基本语法: du 目录/文件 (功能描述:显示目录下每个子目录的磁盘使用情况)
如果直接使用du,则会把当前目录下所有占据空间大小的东西都列举出来。这样看着会很乱,我们其实只希望用一个比较简单的方式看一下当前目录到底有多大,可以直接看最后一行,这就是当前目录的大小。当然,du有很多可选的一些选项,能让输出更加的友好一些。
选项说明:
使用du -ah简化显示。
使用du -sh展示当前目录大小总和
使用du --max-depth=1 -ah
展示当前目录大小总和,但是只显示第一层深度。
背景
我们现在可以使用
du -sh /
查看根目录的大小,可以看到大小为11G。但是这不是我们现在硬盘被占用的总共的大小,看起来是差不多,但是跟真正磁盘的占用还是不太一样。之前安装系统时做了磁盘分区的操作,划分了一个引导分区、一个交换分区和根分区。平常我们使用的所有的文件存放的地方是这个根分区。因为Linux文件系统是一个虚拟目录,我们并没有办法从目录结构里边看到到底哪块磁盘占用了多少空间。这个时候我们就不能用du命令了,需要用df
df
df: disk free 空余磁盘
基本语法: df 选项 (功能描述:列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况)
示例: 使用df -h查看磁盘的使用情况,如下所示。
可以看到:
基于内存的文件系统
tmpfs或者dvtmpfs,它表示的是一个临时的文件系统
它是Linux里边比较特殊的一种文件系统类型。所以这里边我们不光是对于硬盘有一个展示,内存相应的那些设备其实也是有一个展示。
问: 什么样的设备对应的是内存给我们设置的这个临时文件系统?
答: 真正的内存和swap分区。swap分区主要是跟内存进行页面的置换来进行交换,可以当做虚拟内存,所以它们俩的文件系统是一致的,就都使用的是tmpfs这个temporary file system。
这里我们可以看得非常清楚:
/dev/shm
。shm就是shared memory,即就是共享内存。也就是说这一块内存空间是所有系统进程都去共享的,这些进程都能访问到这个目录。这块内存大小默认是系统内存的一半,2G。free
示例:使用free -h
查看内存的使用情况。
我们可以看到当前的物理内存以及虚拟内存(swap分区)总共有多少空间、使用了多少空间、空余多少空间、正在共享的内存空间。
lsblk
功能描述: 查看设备挂载情况。
前面两个命令没有详细地看到真正的磁盘信息,而lsbkc就可以看到。lsblk就是list block的缩写,列出当前所有的块设备(硬盘光盘之类的存储设备)的挂载情况。
示例:
使用lsblk查看磁盘的挂载情况。
可以看出:
cdrom
除了sda这块硬盘之外,我们看到下面还有一个sr0,它的type是rom。我们当时做系统安装的时候用到了光盘,我们使用光驱把ISO镜像文件加载进去,从光驱启动系统。现在尽管没有用那个光盘里边的信息了,没有把它直接挂载进来,但是这个光驱设备还是在的,它的type就是cdrom。
所有的设备都在/dev/目录下边,我们通过ls /dev/ | grep sr0
可以找到。
使用ll /dev/ | grep sr0
显示完整的信息。
可以发现sr0类型是b,即block,块存储设备。除此之外还有一个cdrom,它是一个软链接(类型是l),直接链接到了sr0。这是Linux为了方便我们去管理,直接给了sr0一个更加容易理解的名字,叫做cdrom。
硬盘名称的由来
使用lsblk查看设备挂载情况时,根据硬盘的不同会看到不同的名称,如sda、hda、vda。这里主要看第一个字母的含义,最常见的是sda。不管是个人电脑还是服务器,我们所使用的硬盘根据不同的接口类主要划分为以下几类:
①IDE硬盘:早期的硬盘用IDE的比较多,现在就很少见了,因为它的读写性能都比较差。
②SATA硬盘:串行ATA接口规范的硬盘,支持热插拔。比起传统的IDE硬盘,它快很多,而且数据存储容量大、成本更低,所以现在我们的个人电脑一般用的都是SATA硬盘。
③SCSI硬盘:
SCSI是一种计算机系统标准接口,所以不光是硬盘可以用这种接口,像光驱、扫描仪等各种各样的电脑外设都可以使用这种接口。所以它本身是有一个专门的控制器去进行数据操作、数据传输,它的数据传输速度会更快。服务器要求的是性能要更强,所以用SCSI硬盘会更多一点。之前我们在做虚拟机配置的时候,我们对硬盘默认选择的就是SCSI硬盘。
Linux对硬盘分区命名的规则
①如果有多块硬盘,如IDE硬盘,则它们的名称都是HD开头。第一块硬盘就叫做HDA,第二块就是HDB…以此类推。
②如果有多块SATA或者SCSI硬盘,则都是SD开头。同样第一块硬盘叫SDA,第二块硬盘叫SDB。
③如果你用到了虚拟化的模拟设备,则是以VD开头。
如果每一块硬盘要分区,则直接在名称后加上数字1、2、3…即可。所以我们在前面看到了sda1、sda2、sda3。
lsblk -f
lsblk -f:查看详细的设备挂载情况,显示文件系统信息。
示例: 使用lsblk -f,可以看到文件系统信息。
可以看出:
背景
①前面我们发现除了挂载的硬盘外,下面还有一个光盘。这个光盘没有挂载点,所以无法直接访问到它,因为所有的设备必须要对应着一个目录。在/dev/下的是我们的设备文件,肯定不可能找到光盘里边的东西。要找到光盘里面的东西,就必须把光盘挂载到某个位置去。
②之前讲硬盘分区的时候就提到了挂载点,我们当前有一块硬盘,我们把它划分了三个分区:boot分区(1G)、swap分区(4G)、根分区(45G)。平常在执行操作的时候,并不会说直接把一个很大的文件放到哪个分区里面去。一般来说这里有一个文件系统,里面有许多目录,比如根目录、root目录、home目录等等。现在我们直接把这个文件放到对应的目录下边去就可以了。
③那这个目录到底又对应着我们硬盘上的哪一个存储位置呢?这种对应关系就需要用一种映射来表示,这种映射就是我们所说的挂载点。文件系统本来是一个虚拟的目录结构,我们在使用这个目录的时候并不关心它的底层存放位置在哪里,而Linux需要知道这个对应关系,只要在硬盘分区的时候一次性的把它配置好了,后面我们就不用管了。
④这个配置的过程我们就知道了第一个分区的挂载点挂载到了boot下边,所以只要你在boot这个目录下边的所有文件都会存入到1G的第一个分区的磁盘空间里面去。第二个分区的4G是swap分区,我们不会把文件放进去了,这是我们的交换分区,虚拟内存。最后这45个G直接挂载到了根目录下边,所以除了boot这个目录里边的内容,剩下所有的东西我们都是基于这个根目录扩展出来的分支。所以所有的剩下的文件和文件夹都是存放到第三个分区这45个G空间里面去。
⑤所以现在我们又多了一个光盘出来,尽管我们不用再去对它做分区了,那同样也应该考虑当前这个光盘里边的文件。只要我们给这个光盘设置一个挂载点挂载上去就可以通过文件系统访问到了。之前我们说过有一个叫/mnt/的目录,它本来就是让我们去挂载外部的一些存储设备,所以我们就把这个光盘挂载到/mnt/目录下边去,接下来在这个目录里边就可以访问到光盘里面的东西了
mount/umount
准备工作:
接下来我们实际操作一下,既然要挂载一个光盘,我们首先得有这个光盘。可以使用安装Centos时那个镜像文件,我们首先对虚拟机做一些配置。选择哪个镜像文件,状态选择为已连接。
我们回到桌面会发现这里直接就弹出来了一个光盘的图标,这跟Windows里面其实是一样的,它默认整个系统有桌面环境,就会给我们直接做一个挂载。挂载完就可以直接点击进去看到里面的内容了。
但是我们并不是希望直接在桌面里面去访问光盘的文件,我们还是希望在命令行里去做访问。我们先查看一下当前镜像文件的挂载点在哪里,通过lsblk可以进行查看。
现在我们想要手动尝试一下挂载命令,于是先将其弹出。
可以看到没有挂载了。
mount
基本语法:mount [-t vfstype] [-o options] device dir (功能描述:挂载设备)
参数功能:如下图所示
我们在/mnt下新建一个cdrom文件夹,然后将准备将光盘挂载到那里去。
这里直接提找不到媒体,这个因为刚才我们做了弹出操作。弹出之后CD/DVD这里就又不是连接状态了。如果又选上已连接的话,因为这边我们有图形化的界面,它又会自动帮我们挂载。
②然后再去选中已连接。
③最后重新登陆,使用lsblk可以看到没有自动挂载了。
于是再次执行挂载命令mount /dev/cdrom /mnt/cdrom/
(把cdrom换成sr0也可以),可以看到挂在成功。
再次执行lsblk也可以看到挂载成功。
我们进入到/mnt/cdrom/下ls可以看到光盘的文件内容了。
umount
基本语法:umount 设备文件名或挂载点
示例:使用umount /mnt/cdrom
卸载掉sr0/cdrom。
我们再次访问这个/mnt/cdrom
目录的话,我们会发现这个目录还存在,但是里边的东西就都没有了。
设置自动挂载
背景: 每次一开机进来之后我就希望它默认就能将上面那个光盘识别出来,直接就把它挂载上,就像我提前已经分好的一个区一样。
自动挂载: 需要修改/etc/fstab
配置文件。
我们做自动挂载配置时要去改一个配置文件,叫做fstab(file system tab)。我们进去看看里面的内容。
可以看出:里边其实就是所有的设备的挂载信息
①三个分区的挂载点、UUID、文件类型。
②最后有两个0,代表的含义如下:
添加信息: 我们不用写UUID,直接写设备名称就可以了。然后跟上挂载点、文件类型、默认选项、两个0。
背景
现在我们知道了:
①查看当前硬盘的使用情况
②查看当前块设备的挂载情况
③对一个新加入的设备进行挂载
思考: 前面挂载的光盘,如果挂载硬盘该怎么做呢?这就不止是挂载的问题了,我们首先对它进行分区操作,然后按照不同的文件系统类型进行格式化、最后设置挂载点。对于硬盘分区格式化操作,有一个专门的命令,即fdisk。
fdisk -l
fdisk -l
:只是查看一下当前磁盘的分区详情,看到的信息会比lsblk看到的分区信息更加详情。
示例: 查看当前磁盘的分区详情。
可以看出:
fdisk
一些配置:
目前我们只有一块硬盘,需要再添加一块。
默认磁盘类型为SCSI、创建新虚拟磁盘、磁盘大小为20GB、默认名称。
然后可以看出多了一块新硬盘
查看:
我们输入fdisk -l
可以看出仍然只有原来的sda硬盘。
然后输入lsblk
也可以看出只有sda这个硬盘。
这是因为硬盘不像光盘可以热启动、热插拔,我们当前必须要重启才可以,所以我们直接reboot。现在再执行lsblk,可以看到就有sdb了。
执行fdisk -l可以看到多了一个sdb,它的类型也是硬盘。它下面没有做分区,而且也没有挂载点,所以接下来我们要做的事情就是对sdb进行处理。
硬盘分区
基本语法:fdisk 硬盘名
我们这里执行fdisk /dev/sdb
,看到这里有非常明确的中文提示
我们输入M获取帮助
我们主要能够用到的命令操作有以下几个:
**p:p指的是primary,主分区。**对于Linux而言,它的一块磁盘里边最多划分4个主分区。e:如果想划分更多的分区,可以把这里边的一个主分区替换成扩展分区。换成扩展分区之后,就可以扩展出若干个逻辑分区,严格意义上来讲逻辑分区已经不算真正意义上的分区。逻辑分区最多能划分多少12,前面这4个主分区就是1 2 3 4,后边的扩展分区编号是5到16。
我们这里输入p,或者直接回车也行。接着输入分区号,我们直接输入1即可。
接下来都选择默认选项,起始扇区设置为2048,分区大小为20G
然后输入p查看。
接下来按w直接保存退出,开始同步磁盘
然后我们输入lsblk -f
查看,可以发现sdb的分区信息就已经有了。但是这里没有文件系统,也没有UUID,所以说系统其实没有办法识别它。因为我们没有对它进行格式化,不知道用什么文件系统,当然也就不会分配UID了,对应的也就没有挂载点。
格式化
基本语法:mkfs -t 文件系统类型 设备名 (make file system)
我们输入mkfs -t xfs /dev/sdb1
,结果如下。
输入lsblk -f
,可以看到这里的类型也有了,后边的UUID也有了,现在就差最后一步做挂载了。
挂载
思考: 接下来我们把sdb1挂载到哪里呢?之前我们有一块硬盘叫sda,它有3个分区。第一个分区是挂载到了boot下边,第二个分区是swap,第三个分区直接挂载到根目录下边。除了boot下边的内容,其它所有的内容都存放在了sda这块硬盘的第三个分区里面,那这里面存放东西太多了。我们的/home/目录下边有各种普通用户的主目录吗,比方说atguigu。我们希望把atguigu下面的东西单独都放在一块新的硬盘上,也就是我们新添加的sdb这块新硬盘,
挂载
基本语法:mount 设备名 挂载点
我们输入mount /dev/sdb1 /home/atguigu/,可以看到把sdb1挂载到了atguigu下。
测试:
使用df -h
查看一下当前的硬盘占用的空间,当前这块sdb磁盘里面已经写入了一些初始的配置信息,占用了33MB。
我们现在复制一个大的文件(xshell的安装包)到/home/atguigu下面去,可以看出sdb1的已用大小变大了。
卸载
我们使用umount /dev/sdb1
卸载掉sdb1,之后使用df -h
可以看到卸载成功,没有任何sdb的信息。
使用lsblk还可以识别到这个硬盘,但是他已经被卸载掉了,对应的文件访问不到了。
/athuigu目录也就划分到sda3分区来了,我们再去查看atguigu下的内容,可以看到没有安装包了,只有这两个配置文件了。
基本概念
进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。有些进程在内存中停留的时间会非常的短(如ls、cd这些命令),而有些进程(如网络服务)会一直常驻在内存里,这种进程叫做服务。
Linux系统中,进程可以分为两大类:
①前台显示的进程
②后台运行的进程。
系统服务往往都属于后台进程,具体执行这些系统服务的那个进程一般叫做守护进程。这些守护进程的命令都是以d.service结尾,他们都在/usr/lib/systemd/system
中。然后
ls /usr/lib/systemd/system | grep d.service
进行筛选,就可以看到许多守护进程了。
其中里面有一个sshd.service,我们用Xshell做远程连接的时候就使用了SSH服务连接到了我们的虚拟机上。sshd.service就是SSH服务的守护进程。
windows查看进程
ctrl + alt +del打开任务管理器,这些进程分为了两类:应用和后台进程,我们就可以认为前台跑着的是用户进程,这些后台进程大部分就是系统服务。
Linux查看进程
ps:process status 进程状态
基本语法:
ps aux | grep xxx (功能描述:查看系统中所有进程)
ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)
选项说明:
示例: 使用ps显示进程,如下所示。
它只显示当前用户调用的进程、跟当前这个终端控制台相关联的所有进程,所以就很少了。
选项分类:
BSD风格:
示例: 使用ps aux
显示相关进程信息
我们看到这里的进程非常多,可以做一个管道ps aux | more
进行翻页显示。
示例: 执行ps -ef | more
命令显示进程信息。
里面有个PPID,其实就是他的父进程的ID。
注意: 写这些命令需要注意,比如ps aux
不要写成ps -aux
,因为如果刚好有x这个用户,则显示x相关的进程。但是默认情况下,如果找不到X这个用户的话,Linux会自动把它理解成ps aux
。
ps aux的信息
输入ps aux | more
,显示进程的相关信息。
----问号:表示它没有任何的终端
----tty1:图形化终端(早期的交互式终端就是一个类似于打字机的东西,所以叫tele type writer)
----tty2-tty6:本地的字符界面终端。前面我们按ctrl +alt +F1~F6进入的大黑屏就是这几个东西。
----pts/0-255:代表虚拟终端。不管是在当前的虚拟机里边直接打开一个终端,还是在X shell里面打开一个终端,其实产生的都是一个虚拟终端。
----R:运行状态
----S:睡眠状态。进程已经启起来了,但是现在没有进行处理,可能在等待某个事件或信号来唤醒它继续执行。
----T:暂停状态
----Z:僵尸状态。这个进程已经马上要结束了,但是它有一些信息还没有删除,父进程可能还需要它的一些信息,只剩下了一个空壳。正常情况下当它的父进程退出的时候就会把它彻底清掉。
----s:包含子进程
----l:多线程
----+:前台显示
----<:很高的优先级
----N:很低的优先级
注:
①虚拟内存占用的更多,比物理内存占的还大。交换分区不是来扩充物理内存的吗?物理内存都没用完怎么就开始用虚拟内存了呢?
答:Linux对内存管理有一整套完整的机制。如果内存里边有一些页面不常用,并不是等把内存全占满了之后才把它替换到外边的虚拟内存中。而是只要判断当前内存有一些页面长时间都没有用到的话,就直接把它换到虚拟内存里面去了。经常使用的才保留在当前的物理内存里面,当前对内存的占用就会更少,就会更加的高效啊,就可以尽量的把物理内存空出来去处理更多的事情。
②第一个就是pid为1的一号进程,该进程执行/usr/lib/systemd/systemd
的命令。
二号进程专门负责所有内核线程的调度和管理的,始终运行在内核空间。所以后面可以看到很多系统级别的服务都是以系统线程的形式运行的
ps -ef的信息
运行ps -ef
,信息如下。
主体都差不多,最大的区别就在于多了一个PPID和C。
PPID:父进程的PID。一号进程systemd和二号进程kthreadd的父进程是0号进程。0号进程比较特殊,是idle进程。因为一号进程是第一个启动的用户进程,所以启动他的父进程就只能是系统级别的进程。
C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高。
总结
如果想查看进程的 CPU 占用率和内存占用率,可以使用 aux;
如果想查看进程的父进程 ID 可以使用 -ef
远程登陆进程与ssh相关,使用ps -ef | grep sshd
筛选和ssh相关的进程,搜索出了三条结果。
①第一条就是我们直接启动sshd服务的那条命令,对应的进程的PID是1130,它的父进程直接就是一号进程。我们使用systemctl status sshd
查看ssh服务的状态,可以看到是正在运行的状态,而且它是开机启动,即由一号进程直接启动。
②第二个就代表我们的XShell以root的身份打开了一个虚拟的终端去登陆到了我们远程的服务器上。它是通过sshd这个守护进程创建出来的一个子进程。
③最后还有一个grep --color=auto sshd,这是我们当前进行ps然后进行筛选sssh这条命令对应产生的一个。
新创建一个远程连接,以root用户身份登录
在XShell中新创建一个链接,以root登录
然后执行ps -ef | grep sshd
,可以看到多了个pts/1,这就是我们现在的远程连接。
新创建一个远程连接,以普通t用户身份登录
在XShell中新创建一个链接,以普通用户登录。
然后执行ps -ef | grep sshd
,可以看到多了两个sshd进程。
原因: atguigu@pts/1
很显然我们这里又打开了一个远程登陆的终端,用户是atguigu。上面有个atguigu [priv]
,用户是root。这主要是为了权限分离。一个进程单独列出来。它保留Root身份,我们在想要使用root权限去执行一些操作的时候就使用这个进程去进行操作。如果是普通的艾特硅谷用户去进行操作的话,就用下面的这个远程登录的进程去进行操作。这样的话权限分离,我们在安全性上、性能上都可以得到更好的保证。
kill 终止进程
①kill [选项] 进程号 (功能描述:通过进程号杀死进程)
②killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
示例: 现在我们通过远程登录了两个root和一个atguigu用户
现在要终止掉atguigu用户。可以使用kill 3081,也可以使用kill 3085。现在再去看进程信息,可以发现atguigu进程就没了。
回到XShell也可以看到显示atguigu的链接被其他主机关闭掉。
示例: 还可以kill掉另外一个使用root登录的远程连接进程
回到XShell,可以看到链接断开。
示例: 还可以kill掉自己,Kill之后直接断开。
示例: 现在我们将这三个远程连接用户重新连接上,然后准备kill掉他们的守护进程1163
我们执行kill 1163,可以看到三个远程登陆的进程的父进程全部变为1了。
除此之外,我们无法再通过远程连接登录其他用户了。而且如果关闭这三个远程连接进程,他们就再也连接不上了。
解决方案: 查看下sshd服务的状态,可以看到是关闭状态
于是我们重新打开即可,可以看到处于运行状态。
现在我们将atguigu用户重新登陆,可以看到atguigu进程的父进程就是我们重新启动的sshd守护进程3740的子进程。
注: 我们这里一直有个代表当前sshd命令的进程grep -color=auto sshd
,我们来看看它的父进程是谁。通过ps -ef | grep 3862
可以看到它的父进程就是我们这个终端界面bash。现在sshd的调用关系就很明显了:1->sshd->远程连接->bash。
kill -9 强制终止进程
我们想要看到当前所有的bash
现在我们想要kill掉pts1的虚拟终端进程3402,尝试后发现无法Kill。因为Shell控制台是正在运行的一个进程,如果直接kill是不行的。
解决方案: kill 9 进程
这个-9代表系统的信号值,代表杀死信号。
现在我们强制杀掉pts2的bash,可以看到成功杀掉。
killall sshd
killall需要小心使用,比如我们这里使用killall sshd,可以看待所有窗口都断开连接了。连守护进程都关掉了,我们重连不上了,我们就只能去服务器将sshd开启。
pstree
①基本语法:pstree [选项]
②选项说明:
示例: 使用pstree查看进程树,可以看到最初的进程就是systemd,然后由它延申出许多进程。
使用pstree -p
将所属用户显示出来。
top 实时监控系统
ps:更像一个快照,把当前正在活动的进程信息直接咔嚓一下拍下来,然后使用more或者less做分页展示,看看里面到底是什么东西。
top:实时的监控展示,他会给我们打开一个交互式的界面,然后实时地刷新当前的进程信息。
示例: 运行top,信息如下所示,共两大部分。
①上面部分
第一行:top是当前程序的名称;显示当前的时间;一个up;系统启动运行之后到现在持续的时间;现在登陆了多少个用户(服务器端1个+XShell3个+服务器端图形化桌面环境进来的时候也是一个root用户);平均负载(这三个数代表过去的1分钟、5分钟和15分钟之内整个系统的平均负载。一般情况下这个平均负载小于0.7的话我们就认为这个负载不太大,如果大于1就说明超出了当前的系统负荷)
第二行:总共的任务(进程)数量。后面分别是各种状态的进程的数量。
第三行:对CPU的占用了。
第四行:当前的内存占用的情况,单位是KB。
第五行:当前的虚拟内存占用情况,单位是KB。
②下面部分是关于整体系统运行的状态。
切换排序顺序:
①M或者shift m,按照占用内存从大到小排序。
②P或者shift p,按照占用CPU时间从大到小排序(默认这样排序)。
③N或者shift n,按照PID从大到小排序。
选项说明
示例: 使用top -p命令来过滤掉闲置进程。闲置的标准是从上一次显示之后到目前这一次要显示的时候一直都没有再去占用CPU,也就是说这段时间没占用CPU就是闲置的就不显示。所以进程状态未必都是R,可能占用下CPU又sleep了,所以也可能是S。
示例: 在监控期间,按下小写u,然后输入用户名即可监控指定用户的进程。比如我们在XShell中登录atguigu,然后再来这里指定显示XShell的进程。
运行,可以看到atguigu相关的进程了。
示例: 在监控过程按k,然后输入PID可以kill掉指定进程。
然后需要输入信号名称或信号值
netstat
基本用法:
netstat -anp | grep 进程号 (功能描述:查看该进程网络信息)
netstat –nlp | grep 端口号 (功能描述:查看网络端口号占用情况)
选项说明:
示例: 使用命令netstat -anp | less
查看
Proto:使用套接字进行这个网络传输对应的网络协议,这里的tcp指的是IPV6下相关的一些协议。
Recv-Q:连接到当前这个socket的用户程序还没有拷贝的字节数,也就是代表已经接收到了但是还没有拷贝出来的字节数量。
Send-Q:已经发出去了但是远程的主机还没有确认收到的字节数,有可能是被丢掉需要重新传递的数据。
Local Address:当前的地址(socket的形式),即IP+冒号+端口号。
----0.0.0.0:本机本地的所有地址
----127.0.0.1:回环地址,一般用来做本地监听和测试
Foreign Address:远程地址
192.168.123.1是我们物理PC机的IP地址,这里我们有两个用户通过不同端口连接上了VM的22端口,状态就是ESTABLISHED。
基本语法: crontab [选项]
crontab 的守护进程:crond
选项说明:
参数说明:
①进入 crontab 编辑界面。会打开 vim 编辑你的工作
②特殊符号
③特定时间执行命令
示例: 输入crontab -e
进入编辑页面,然后输入*/1 * * * * echo "hello, world" >> /root/hello
,代表每隔一分钟向hello文件中追加hello, world这句话。
然后隔一分钟去看hello文件,可以看到就有内容了。
我们还可以使用tail -f hello查看hello文件的变化
也可以使用crontab -l查看定时任务文件的内容
最后可以使用crontab -r清除crontab任务