相信安装过Windows的小伙伴都知道在安装Windows系统的时候往往会考虑C盘给多少空间合适,D盘给多少空间合适,这个其实在安装系统的时候往往需要着重考虑的。也就是分区的相关问题。
其实在Linux上也有着类似的结构,我们将其称之为目录树结构。
为什么这么称呼呢?这其实很大程度上跟Unix系统有一定的渊源。
众所周知,Linux内的所有数据都是以文件的形式存储。因此目录树结构可以类比为Linux系统的骨架,这是整个Linux系统的最重要的地方。
所谓的目录树结构:就是以根目录为主,然后向下呈现分支状的目录结构的一种文件架构
整个目录树结构中最重要的就是根目录,并且根目录的表示方法为“/”
/
开始的,由根目录开始衍生出来的。.
开头的属于文件,其他的则为目录(directory).bashrc
文件,则路径为/home/dmstail/.bashrc
以上就是对Linux系统的文件架构进行了简单的解释。但是有一个问题,其实我们的文件数据往往都是存储在磁盘分区中的(例如Windows中的C盘、D盘),那么如何才能建立文件系统与磁盘之间的联系呢?
这个时候就需要牵扯到挂载的问题。
所谓挂载,**也就是利用一个目录当作进入点,将磁盘分区的数据存放到该目录下。**即:当进入该目录的时候也就是相当于是读取了该分区的数据。
那么挂载某个分区的那个目录即成为挂载点。
根目录作为整个系统的核心,自然需要对其进行相应的挂载操作(这个是必须的!),这个主要依据实际情况而定。除了根分区,其他分区用户可以根据自身的实际需要进行相应的挂载操作。(同样的windows也是使用的挂载的概念。)
那么如何通过某个文件的路径名判断出该文件在哪个分区呢?
其实很简单,需要使用到反向寻找追踪。例如某个文件的路径为/usr/local/bin/redis.conf
,那么我们经过反向追踪就可以发现,其实它挂载的分区就是根分区/
了解Linux的文件系统的相关架构,相信很多人会被它惊艳到。其实令人着迷的不仅仅是它那严谨的目录架构,更多的是Linux文件系统的权限设置。
其实Linux系统的文件权限设置也是相当的严谨,很多时候甚至会给人一种冗余的错觉,但其实很大程度上保证了系统的安全性和协调性。
在介绍用户与用户组的概念之前,需要首先明确一点,Linux从本质上来说是一个多人多任务的系统。因此常常存在很多人同时使用同一台主机的情况出现。考虑到个人隐私权以及给每个人一个喜好的工作环境的需求,Linux设计了用户与用户组的有关权限。
接下来一一介绍有关概念。
所谓用户,对于Linux的使用者来说其实就是登录Linux系统的帐号,系统的管理员(root用户)需要为每个用户分配一个帐号,使用者依据该帐号登录系统。**值得一提的是虽然是同一个系统,但是不同帐号登录之后所呈现的某些内容是不一样的。**也就是说A帐号登录之后看不见B帐号的一些隐私文件。这也符合多人多任务系统的有关要求。
例如在本机中,存在另一个用户的相关文件
当然除了通过图形化界面的方式查看之外,还可以通过命令行的方式来查看本机中的用户都有哪些
cat /etc/passwd
...相关用户信息
所谓用户组,对于Linux来说就是登陆该系统的帐号的一个集合。每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。就相当于我们现在的小组、团队的概念。
举个例子,假设领导Leader分管2个团队,团队A成员有甲、乙、丙。团队B成员有丁、戊、庚。他们两个团队需要各自完成一个项目,并且该项目有一定的竞争性,需要进行评比。那么如何才能保证自己团队的项目细节不被另一个团队的人看见。
这个时候Leader为了保证这两个团队的竞争的公平性,因此为这两个团队设置了相应的权限,即:团队A成员无法查看到团队B的项目的任何内容,反之亦然。团队内的成员可以查看团队内公有的内容,并且如果团队成员私有的内容,即使是同一个团队的成员,也无法查看。
当然Leader也必须设置一个权限,自己能够同时查看团队A与团队B的所有内容。也就是说Leader拥有天花板权限。
这样看来,似乎设置用户组确实能够带来很多益处。当然,用户组最有用的功能是团队协作。
并且同一个账户也可以拥有多个用户组的支持。(上例中的Leader就是同时拥有团队A与团队B的权限)
并且每个用户所加入的用户组的数量是没有限制的,也就是说你可以根据需要加入很多的用户组。形成一个庞大的用户网络。
其他人权限,简单来说就是除了文件拥有者(用户)、文件用户组(用户组)的以外权限。
这么说可能有点模棱两可,来看张图:
相对于ABC来说,D就是其他人,因为他并不属于ABC这个用户组,因此也就无法直接访问ABC用户内的公有内容。如果想要D访问到该用户组的信息,则可以选择将该用户D也加入到对应的用户组内,则就可以实现对共有信息的访问。
这里还需要提出来的是,这个D只是一个普通的用户,并不是root。
那么什么是root?
可以这么说root是当前系统权限的天花板,没有它达不到的地方。换句话说,在root管理员面前,所有的用户、用户组、其他人都没有任何的隐私可言。但是权力越大,责任也就越大。root用户是最整个Linux系统最核心的用户,所以需要合理地使用root帐号,以免给系统造成不必要的麻烦。
在Linux系统中,默认情况下,所有的系统上的帐号与一般身份用户,root用户的信息都存储在/etc/passwd
文件之中。(有兴趣的可以查看)
个人用户的密码则是保存在/etc/shadow
文件中。
Linux所有的组名都是记录在/etc/group
中。
cat /etc/passwd
# cat表示查看某一个文件,后跟文件的路径
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
..........
sudo su
# 切换到管理员查看(此处是强制进行的)
# 查看个人密码文件
cat /etc/shadow
root:*:18717:0:99999:7:::
daemon:*:18717:0:99999:7:::
bin:*:18717:0:99999:7:::
.......
并且为了保证安全性,Linux对于密码文件采用了SHA512 散列加密算法,每一行对应一个用户,其具体含义如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
# 以普通用户的身份查看
cat /etc/group
# 以下是所有的用户组
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
..........
相信初次接触Linux的小伙伴都曾经在终端中输入命令之后出现Permission deny(至少我初学的时候出现过很多次),该提示表示当前没有相应的权限对某个文件进行读写或者执行操作,也就是权限不足,需要提高权限。(如果您从没有遇到过,那说明您对于权限的掌握已经足够好了)出现这种情况往往是对Linux的文件权限没有一个很好的认识。
那么如何查看已存在文件的相关权限呢?很简单,只需要一个命令ls
。
以本机为例子
# 切换到管理员用户
sudo su
# 进入到根目录
cd /
# 查看当前目录下的文件
ls -al
drwxr-xr-x 4 root root 4096 4月 10 14:54 home
lrwxrwxrwx 1 root root 7 3月 31 2021 lib -> usr/lib
lrwxrwxrwx 1 root root 9 3月 31 2021 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 3月 31 2021 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 3月 31 2021 libx32 -> usr/libx32
drwx------ 2 root root 16384 9月 20 2021 lost+found
drwxr-xr-x 6 root root 4096 4月 10 14:58 media
drwxr-xr-x 2 root root 4096 4月 10 15:35 mnt
........
[权限] [链接][拥有者][用户组] [文件容量] [修改日期] [文件名]
# 切换到普通用户
exit
sudo su
从普通用户切换到管理员用户,但不建议直接使用管理员进行操作。al
选项表示详细地展示所有的文件,包括隐藏文件(该类型的文件以.开头,默认是看不见的。)从上面的输出中也可看出,几乎所有的文件输出格式都是类似的。下面来简单介绍一下以下格式的含义
lrwxrwxrwx
表示的是文件类型权限,这里一共有10个字符。
d
表示。-
表示的是文件。l
表示的是链接文件。b
表示的是设备文件里面可供存储的周边设备(可按块随机读写的设备)c
表示设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备)。.
开头的,则说明该文件是一个隐藏文件。上面提到了一个文件被列出来的时候所拥有的所有相关信息,我想最引人注目的便是文件类型权限了吧。下面详细介绍一下这个文件类型权限。
在文件类型的十个字符中,大致可以分为4组。第一个字符单独为一组。后面,每3个字符为一组。
其中,r
表示可读权限,w
表示可写权限,x
表示可执行权限。并且这三个权限的位置是恒定不变的。如果某个位置没有该权限,则使用-来代替,不能够不写。
rw-
的权限,则表示文件拥有者对该文件可读可写,但是不能执行,因为没有执行权限。不论是哪一组权限,基本上都是针对某些帐号来设计相应的权限。
Linux文件系统与Windows系统不一样,Linux对文件添加了很多的属性。显然这些属性其实很大程度上保证了数据安全性。
前面我们介绍了文件属性与权限对于Linux文件系统的重要意义,其实尽管某些文件的属性或权限限制了某些用户的某些行为,但是我们依旧可以通过相应的方法来修改,使某一个文件的属性或权限发生变化。
与Linux用户、用户组与其他人的概念类似,修改权限自然也会存在对于不同的属性来进行修改。主要有以下三类:
也许很多人会好奇,为什么没有修改其他人的权限,原因很简单,因为如果想要其他人获取某些权限,只需要将该用户(帐号)加入到该用户组即可。
那么,为什么我们需要修改用户、用户组以及相应的文件权限呢?
究其原因,主要还是出于**安全的考虑。例如当你需要复制某个文件给另一个用户,但是在Linux中,在复制文件的时候往往会在复制文件的同时也复制了当前用户的属性与权限。**这就很容易造成一个权限问题,文件的接收方可能因为某些权限问题无法访问你复制给他的文件,这时候就需要对文件的相关属性或者权限进行修改。
修改用户所属群组,使用命令chgrp,简单来说就是change group的缩写。虽然chgrp命令可以修改用户所属的群组,但是需要注意的是所要被修改的组名,必须要在/etc/group之中才可以成功,否则会报错。
chgrp的命令语法如下:
chgrp [-R] dirname/filename
其实语法相对来说是比较简单的。需要注意的是[-R]
选项,该选项表示进行递归操作,也就是说如果被修改的目录下有其子目录或者子文件,这些文件或者目录都会被同步更新。
来看一个例子:该例子将123.txt文件的用户组修改为root(该用户组在/etc/group
中存在)
# 切换到管理员用户
sudo su
# 此处以文件为例,可以看出,123.txt文件属于lambda用户及用户组
ls -l
-rw-r--r-- 1 lambda lambda 61 9月 26 2021 123.txt
# 修改123.txt文件的用户组
chgrp root 123.txt
#再次查看123.txt文件的相关属性,用户组由lambda变为root
ls- l
-rw-r--r-- 1 lambda root 61 9月 26 2021 123.txt
# 尝试将该文件修改到不存在的用户组中
chgrp test 123.txt
chgrp: invalid group: 'test'
我们可以通过chgrp
命令将某些文件或者目录的用户组进行修改,但是如果修改的用户组并不在/etc/group
中,就会显示出现错误(如上的chgrp: invalid group: 'test'
)。
那么如何修改某个文件的拥有者呢?其实和修改文件的用户组类似,只是命令不同罢了。很显然,修改文件拥有者的命令全称应该是change owner
,即chown。与chgrp类似,我们在修改文件拥有者之时也需要保证目标用户必须要在/etc/passwd
文件中被记录。否则也会出现相应的错误。
这里需要注意的一点是,chown的用途比chgrp稍微多一点。
这是因为,chown不仅仅可以修改文件拥有者,还可以顺便修改用户组名称。听上去似乎不可思议,但是其实是可以实现的。与此同时,如果需要连同目录下的所有文件都一起修改拥有者的话,只需要添加-R选项即可。
来看看有关的语法:
chown [-R] 帐号名称(用户) 文件或者目录
chown [-R] 帐号名称(用户):用户组名称 文件或者目录
同样的 [-R]
选项表示递归修改,也就是表示其子目录下的所有文件的都需要被同步修改。
这里为了更好地显示chown的作用,我们可以将123.txt文件的拥有者修改为root, 并且将用户组改回lambda
# 首先查看123.txt文件当前的所有属性
ls -l
-rw-r--r-- 1 lambda root 61 9月 26 2021 123.txt
#修改123.txt文件的属性:将拥有者改为root,将用户组改回lambda
chown root:lambda 123.txt
# 再次查看123.txt文件的所有属性
-rw-r--r-- 1 root lambda 61 9月 26 2021 123.txt
可以看出在执行了chown root:lambda 123.txt
命令之后,123.txt文件的文件拥有者变为了root,所属用户组变为了lambda
其实在使用chown命令修改文件拥有者的时候,顺带修改文件所属用户组,其实还有一种方式,即:chown user.group filename/dirname,也就是说在用户和用户组之间添加
.
也可以。但是不建议使用这种方式,因为可能会造成系统的误判,所以最推荐的方式还是使用:
来分隔用户与用户组。
说起文件的权限,其实Linux的文件权限一共有9个,分别是文件拥有者、文件所属用户组、其他人三种身份各自的读(read)、写(write)以及执行(execute)权限。每种身份3个不同类型权限,总共是9种权限。
自然这些权限也是可以进行相应的更改的。但是文件权限的更改并不像修改用户名以及用户组那么直接,它需要首先明了各个权限的含义(这是为了防止出现不正常的权限出现),以及代表权限的数字(也就是说修改文件权限的时候是用相应的数字来表示对应的权限类型)。
修改文件权限的命令为chmod
。
数字类型修改文件属性
因为我们的不同的权限所占的位置是恒定不变的,所以可以有如下的权限与数字的对应
# 读权限
r:4
# 写权限
w:2
# 执行权限
x:1
# 因此某个文件属性拥有所有的权限时,该位置上所对应的数字为7=4+2+1
也就是说每种身份所对应的权限是需要累加的。
来看个例子:
owner =rwx=4+2+1=7
group=rw-=4+2+0=6
others=r--=4+0+0=4
# 也就是说我们可以为某一个文件设置相应的属性为764,该文件所对应的权限为: rwx rw- r--
chmod
语法如下
chmod [-R] xyz 文件或者目录
[-R]
依旧是表示递归修改,也就是说当进行权限修改的时候,连同它的子文件的权限也进行相应的更改。来看一个例子,假设将123.txt文件修改为只有文件拥有者可读可写可执行,其他用户组或者他人没有任何权限。
# 查看123.txt文件的权限
ls -l
# 此时表示文件拥有者有读写权限,用户组成员有读权限,其他人有读的权限
-rw-r--r-- 1 root lambda 62 4月 30 20:45 123.txt
# 对权限进行修改
chmod 700 123.txt
# 再次查看123.txt的权限
ls -l
# 此时123.txt表示拥有者有读写执行权限,用户组或者其他人没有任何权限,即只有root可以对文件进行操作。
-rwx------ 1 root lambda 62 4月 30 20:45 123.txt
符号类型修改文件权限
Linux文件系统中一共有三种身份,分别是文件拥有者(owner)、文件所属用户组(group)以及其他人(othrs)。那么其实可以由u、g、o来表示三种身份的权限,并且加上一个a表示所有的身份。
来看个例子,还是以123.txt文件为例子,此时我们可以将该文件的权限设置为文件拥有者可读可写但不可执行,文件用户组设置为可读可执行,其他人可执行。
# 查看文件的权限
ls -l
# 此时文件只有root可以读写执行,其他用户均无权限
-rwx------ 1 root lambda 62 4月 30 20:45 123.txt
# 进行相应的权限更改
chmod u-x,g=rx,o+x 123.txt
# 再次查看权限
ls -l
# 修改成功
-rw-r-x--x 1 root lambda 62 4月 30 20:45 123.txt
下面仅用一个表格来简单介绍一下对于目录和文件不同权限的含义:
组件 | 内容 | r | w | x |
---|---|---|---|---|
文件 | 详细数据data | 读取文件内容 | 修改文件内容 | 执行文件内容 |
目录 | 文件名 | 读到文件名 | 修改文件名 | 进入到该目录的权限(key) |