Linux最优秀的地方之一,在于它的多用户、多任务环境。正因如此(为了让各用户具有较保密的文件数据),文件的权限管理就格外重要了。
Linux一般将文件可存取访问的身份分为3个类别,分别是owner、group、others,且3种身份各有read、write、execute等权限。
一、用户与用户组
由于Linux是个多用户、多任务的系统,因此可能常常会有多人同时使用这台主机进行工作,所以保护每个人的隐私就极为重要了。
1. 文件所有者
将该文件设置成只有文件所有者才能查看与修改这个文件的内容,那么其他人就无法知道该文件的内容了。
2. 用户组
用户组最有用的功能之一,就是当你在团队(所以一个团队也暗指一个用户组)开发资源的时候!
我们常常将本组内的文件设置为非自己团队(也即是用户组)的其他人不能够阅览内容,而可以让自己的团队成员能修改这些文件。当然,用户组的用户若有不想被组内其他用户看到的私人文件,也可以设置为仅自己可见。
3. 其他人
“其他人”不是用户组A内的用户,但他通过认识A内的用户而访问了用户组A 。
- 注意:root用户可以访问任何文件!
二、Linux文件权限概念
这一小节我们将谈一谈这个文件的权限要如何针对这些所谓的“用户”与“用户组”来设置呢?
文件的权限与属性是学习Linux的一个重要关卡!
1. Linux文件属性
我们以root的身份登录Linux之后,执行命令“ls -al”,将会看到以下内容:
- 第一列:这个文件的类型与权限
第一个字符代表的是这个文件是“文件、目录或链接文件等”([d]是目录, [-]是文件),接下来的字符中,从左至右每3个为一组(共分为3组,第一组为“文件所有者的权限”、第二组为“同用户组的权限”、第三组为“其他非本用户组的权限”),且均为“rwx”的3个参数的组合,其中[r]代表可读,[w]代表可写,[x]代表可执行,如果没有相应的权限,就会以减号[-]替代。
- 第二列:有多少文件名连接到此节点(i-node)
- 第三列:这个文件(或目录)的“所有者账号”
- 第四列:这个文件所属用户组
- 第五列:这个文件的容量大小,单位为B
- 第六列:这个文件的最近修改日期
- 第七列:该文件名
2. 修改文件属性与权限
从上面的分析,我们知道了文件权限对于一个系统的安全是很重要的,也知道了文件的权限对于用户与用户组的相关性。
这一节将讨论如何修改一个文件的属性与权限。
【改变文件所属用户组:chgrp】
改变一个文件的用户组,直接以chgrp来改变即可。不过,请记得,要被改变的组名必须要在/etc/group文件内存在才行。
【改变文件所有者:chown】
用户必须是已经存在于系统中的账户(即此用户名称已被记录于文件/etc/passwd中)
chown还可以顺便直接修改用户组的名称
【改变权限:chmod】
权限的设置方法有两种,即使用数字或者是符号来进行权限的更改。
3. 目录与文件的权限意义
我们现在知道了Linux系统内文件的三种身份(所有者、用户组与其他人),而且每种身份都有三种权限(r、w、x),并且能够使用chown、chgrp、chmod去修改这些权限与属性。之所以有这么严格的规定,是因为这些文件权限对于数据安全极其重要!
我们再来探讨一下这些文件权限对于一般文件与目录文件的不同之处。
【权限对文件的重要性】
- r:可读取此文件的实际内容
- w:可编辑、新增或修改该文件的内容(但不含删除该文件)
- x:该文件具有可以被该系统执行的权限
在Windows下面一个文件是否具有执行的能力是通过“扩展名”来判断的,而在Linux下面,我们的文件是否能被执行则是由是否具有“x”这个权限来决定,而跟文件名没有绝对的关系。
对于文件的r、w、x来说,主要都是针对“文件的内容”而言,与文件名的存在与否没有关系,因为文件记录的是实际的数据。
【权限对目录的重要性】
文件是存放实际数据的所在,目录主要的内容是记录文件名列表,文件名与目录有强烈的关联。
- r:可查询该目录下的文件名数据(所以你就可以利用ls命令将该目录的内容列表显示出来)
- w:可更改该目录结构列表(包括新建新的文件与目录、删除已存在的文件与目录<不论该文件的权限为何>、将已存在的文件或目录进行重命名、转移该目录内的文件、目录位置)
- x:可进入该目录(与r的重要区别,x可切换到该目录内,而r只能看到文件名)
三、Linux目录配置
介绍一下目录树中的各目录名的含义!
1. Linux目录配置:FHS
FHS标准的目的是让用户可以了解已安装软件通常放置于哪个目录,也就是规范特定的目录下应该要放置什么样的数据。
FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,下面是这三层目录的定义:
- /:与开机系统有关
- /usr:与软件安装/执行有关
- /var:与系统运作过程有关
【根目录/】
根目录是整个系统最重要的一个目录,因为它不仅衍生出来所有的目录,而且也与开机、还原、系统修复等操作有关。由于系统开机时需要特定的开机软件、内核文件、开机所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。
因为根目录是这么重要,所以FHS标准建议根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内。
FHS标准要求根目录(/)下面应该要有下面这些子目录存在:
目录 | 应放置文件内容 |
/bin | 放置命令,这些命令可以被root与一般账号使用 |
/boot | 放置开机会使用到的文件,包括Linux内核文件以及开机菜单与开机所需配置文件 |
/dev | 任何设备与接口设备都是以文件的形式存在于此目录,访问此目录下的某个文件,就等于访问某个设备 |
/etc | 放置系统主要的配置文件,一般用户可查阅,但只有root可修改,FHS建议不要放置可执行文件 |
/home | 系统默认的用户主文件夹 |
/lib | 放置开机时会用到的函数库,以及在/bin或/sbin下面的命令会调用的函数库 |
/opt | 放置第三方软件 |
/root | 系统管理员(root)的主文件夹 |
/sbin | 放置开机过程需要的命令(包括开机、修复、还原系统所需的命令) |
/srv | 一些网络服务启动后,这些服务所需要取用的数据目录,常见的服务例如WWW, FTP等 |
/tmp | 让一般用户或者正在执行的程序暂时放置文件的地方 |
上面列举的数据就是FHS针对根目录所定义的标准,不过Linux还有以下目录需要了解:
目录 | 应放置文件内容 |
/proc | 这个目录本身是一个虚拟文件系统。它放置的数据都是在内存当中,例如系统内核、进程、外部设备的状态及网络状态等。因为这个目录下的数据都是在内存中,所以本身不占任何硬盘空间! |
/sys | 这个目录也是一个虚拟文件系统,主要也是记录内核相关的信息。包括目前已加载的内核模块与内核检测到的硬件设备信息等。这个目录同样不占硬盘容量! |
因为根目录与开机有关,开机过程仅有根目录会被挂载,其他分区则是在开机完成之后才会持续进行挂载的行为。因此,根目录下与开机过程有关的目录就必须与根目录放到同一分区!下面这5个目录就不可与根目录分开:
- /etc:配置文件
- /bin:重要执行文件
- /dev:所需要的设备文件
- /lib:执行文件所需的函数库与内核所需的模块
- /sbin:重要的系统执行文件
【/usr】
FHS标准规定,/usr里面放置的数据属于可分享的与不可变动的。
usr是“UNIX操作系统软件资源”所放置的目录,而不是用户的数据。FHS建议软件开发者应该将它们的数据合理地放置到这个目录下的子目录而不要自行新建该软件自己独立的目录。
所有系统默认的软件都会放置到/usr下面,所以系统刚安装完毕时,这个目录会占用最多的硬盘容量!
下面列出一些/usr的子目录:
目录 | 应放置文件内容 |
/usr/bin/ | 绝大部分的用户可使用命令都放在这里。请注意它与/bin的不同之处(是否与开机过程有关) |
/usr/lib/ | 包含各应用软件的函数库、目录文件,以及不被一般用户惯用的执行文件或脚本。 |
/usr/sbin/ | 非系统正常运行所需要的系统命令。 |
/usr/src/ | 一般源码建议放置在这里,src有source之意。至于内核源码则建议放置到/usr/src/linux/目录下 |
【/var】
如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。
因为/var目录主要是针对常态性变动的文件,包括缓存、登录文件以及某些软件运行所产生的文件。
下面列出一些/var的子目录:
目录 | 应放置文件内容 |
/var/cache/ | 应用程序本身运行过程中产生的一些暂存文件 |
/var/lib/ | 程序本身执行的过程中,需要使用到的数据文件放置的目录。 |
/var/log/ | 放置登录文件的目录。 |
/var/mail/ | 放置个人电子邮件信箱的目录。 |
2. 目录树
我们将整个目录树以图示的方法来显示,并且将重要的文件数据列出来!
目录树架构如下图所示:
根据FHS的定义,我们最好能够将/var独立出来,这样对于系统的数据还有一些安全性的保护。因为至少/var死掉时,你的根目录还会活着,还能够进入救援模式。