档案拥有者就是这个档案的所属用户,比如说我新建的文件,档案拥有者就是我,这个应该很好懂。
群组的存在是为了团队方便共享资源。可以通过权限设置,让使用者所在群组内的其他人获得对一个档案的某种权限。
Linux中有其他人的概念,如果一个用户即不是使用者,又不在使用者所在群组,对使用者来说就属于其他人。
如图所示,一个档案的使用者是王三毛,他属于王大毛家这个群组,而张小猪对于王大毛来说就是个其他人。王大毛和王二毛对王三毛来说就属于群组成员。而图中的天神指的就是linux系统中的特殊用户root。
默认情况下,linux系统中的所有账号和一般身份使用者,包括root账号信息都被记录在/etc/passwd档案中,而个人密码则记录在/etc/shadow档案中,linux所有群组都记录在/etc/group档案中,所以这三个档案不能随便删除。
ls是linux中用来查看文件的指令,ls -al可以用于查看文件属性。
如图所示,拿tmp这个文件夹来举例
drwxrwxrwt应该把d和rwxrwxrwt分开来看。d描述的是档案类型,是目录。rwxrwxrwt中,r是可读权限,w是可写权限,x是可执行权限,而这9个字符分别代表了使用者,群组和其他人对这个文档的权限。如果没有权限,以-号表示。
9表示连结数有9个。每个档案都会把他的权限和属性记录到文件系统的i-node中,但是我们的目录树是用文件名来记录的,因此每个档名都会连结到一个i-node。这个属性记录的就是有多少个档名连结到同一个i-node。
第一个root代表档案使用者,第二个root代表档案所在群组。229代表档案大小229b。Aug 7 17:19代表创建日期或者最近修改日期是8月7日17:19,而tmp代表档名。
注:如果档案被修改日期距离现在太久,仅显示年份。
档案属性代表字母 | 档案属性 |
---|---|
d | 目录 |
- | 档案 |
l | 连结档(link file) |
b | 装置文件里可供存储的接口设备(可随机存取装置) |
c | 装置文件里的串行端口设备,如键盘,鼠标等(一次性读取装置) |
注:如果档名前多了一个.,代表该档案是隐藏档。如下图,隐藏档用ls指令查看文件不显示,用ls -a指令查看可以显示隐藏档。
和Windows相比,linux多加了很多属性进来,尤其是群组的概念,在数据安全性上面发挥了很大作用。
linux系统中关于系统服务的档案通常只有root才能读写和执行,例如/etc/shadow这种账号管理档案。
假如档案的使用者希望团队中所有人都能共享档案,可以直接设置群组的权限。
未将权限设定妥当的危害
如果没有将档案权限设置好,那么其他人可以任意操作别人的数据,系统服务也可以任意修改,数据安全性得不到保障
chgrp的语法和参数
chgrp [-R] dirname/filename
-R:以递归的方式持续变更,连同此目录下的所有目录和档案的所属群组都进行变更。常常用于变更某一目录内所有目录和档案的群组时。
示例1:如图/root/test下有test1,test2,test3这三个档案,其中/root/test/test1是目录,/root/test/test1下还有/root/test/test1/test4档案,所属群组都是root,将这些目录和档案的所属群组都修改成huyan
那么我只需要用递归的方式执行chgrp指令,改变/root/test目录的所属群组就行了,如图所示,执行chgrp -R huyan /root/test
示例2:在示例1的结果中,将test1的所属群组修改为root
结果如图所示
而/root/test/test1中的test4档案所属群组依然是huyan没有变化。
chown的语法和参数
chown [-R] 账号名称:群组名 档案或目录
注:通过chown可以直接修改群组
示例1:/root/test目录及其下所有档案和目录的拥有者和所属群组都是root,将/root/test目录及其下所有档案和目录的拥有者都改成huyan,并且把群组名改成huyan所在群组名
示例2:将/root/test/test1/test4档案的拥有者改成root,但不改变其群组
如图所示,一个档案的拥有者和群组未必要匹配,拥有者不一定非要在群组中。
使用chgrp和chown指令最常见的应用场景是用cp指令复制档案给其他人的时候,因为复制命令会复制档案的所有者群组和权限。
示例3:cp指令和chown指令的结合应用,复制/root/test/test1/test4档案给huyan ,要求复制后的档案拥有者是huyan,群组是huyan
如图所示,第一次执行chown指令时,发现仅仅是将/root/test/test1/testcopy的拥有者改成了huyan,而群组还是root。于是利用chown huyan:huyan /root/test/test1/testcopy将拥有者和群组都改成huyan。
Linux中共有9个基本权限分别是owner/group/others各有他们的read/write/execute权限。
我们可以用数字代表各个权限。
权限 | 权限分数 |
---|---|
r(read) | 4 |
w(write) | 2 |
x(execute) | 1 |
每种身份各自的3个权限分数是要累加的,例如rwxrw-r–权限
owner=rwx=4+2+1=7
group=rw-=4+2+0=6
others=r–=4+0+0=4
所以rwxrw-r–的权限分数为764,而764反之也可以代表权限为rwxrw-r–
而利用chmod指令修改权限也可以用权限分数来代表权限。
示例1:修改/root/test及其下所有目录和档案的权限为rwxrwxrwx。
如图所示,下图是/root/test目录的权限及其下所有档案和目录的权限截图。
首先我们来算一下目标权限的分数是777
执行下列语句并观察结果
这些目录和档案的权限都变成了rwxrwxrwx。同chgrp和chown指令一样,chmod有个参数-R,代表递归的意思,对目标目录及其下所有目录和档案都做修改。
不加-R参数,只修改一个目录或档案。
示例2:修改/root/test的权限为rwxr–r–
目标权限的分数经计算为744,执行下列语句
如图所示,只有/root/test目录的权限改变了,而其下所有目录及档案的权限都没有改变。
在指令中不止可以用如744,777这种数字代表权限,直接用rwx符号代表权限,用u,g,o来代表user/group/others也是可以修改权限的。
身份 | 符号 |
---|---|
user | u |
group | g |
others | o |
all | a |
用+,-,=符号来代表操作
符号 | 操作 |
---|---|
+ | 加入 |
- | 除去 |
= | 设定 |
示例3:修改/root/test/test1/test4权限为rwxrwxr–。
如图所示,/root/test/test1/test4的原始权限为rwxrwxrwx。
执行下列语句
如图,o-wx的意思是其他人的权限除去可写可执行这两个权限,这个代码也可以这样写:
如图所示,o=r的意思是设置others的权限为可读。
示例4:在示例3的基础上设置/root/test/test1/test4档案的权限为rwxrwxrwx
如图所示,o+wx参数的意思是others的权限增加可写可执行权限。同理,也可以写成o=rwx。
示例5:有一个/root/test/test1/loser档案权限为r–r–r–,将它的权限修改为rwxrwxrwx
如图所示,a+wx参数的意思是所有身份的权限都添加可写可执行权限。同理这个参数也可以写成a=rwx
注:用符号代表权限最大的好处是可以单独对某个身份的某个权限进行修改,而用数字代表权限是对所有身份的权限做统一修改。
权限对档案来说的意义是这样的:
在windows系统下,一个档案能否执行,是根据扩展名来判断的,如.com,.bat,.exe等,而linux系统下,一个档案能否执行,是根据x这个权限来判断的。
注:w权限不包括可以删除档案,因为rxw权限是对档案的内容来说的,与档案档名存在与否没有任何关系。那么怎样才代表用户有删除档案的权限呢?
权限对目录来说的意义是这样的:
当用户在一个目录上拥有w权限时,用户可以对该目录做以下操作:
在该目录下建立新的档案和目录。
删除该目录下的档案和目录(不论该档案的权限为何)。
重命名该目录下的档案和目录。
移动该目录下的档案和目录位置。
所谓工作目录,就是用户的家目录,即用户进入linux时默认所在的目录。换句话说,用户能不能进入该目录,要看该用户对该目录有没有x权限,如果没有,是不能用cd进入该目录的。
注:所以判断一个用户能否对档案做删除操作,要看该用户在档案所在目录的权限有没有w权限。
示例1:huyan用户的家目录是/home/huyan,对该目录有rwx权限,该目录下有一个test档案,档案权限为rwx——,拥有者和群组都是root,那么huyan用户对该档案能做哪些操作,不能做哪些操作?
答:因为huyan用户对test档案来说是其他人,在test档案上没有可读可写可执行权限,因此无法对test档案的内容做任何操作,但是huyan用户对test档案所在目录/home/huyan有rwx权限,因此huyan用户对test档案有删除,重命名,移动位置的权限。
任何装置在linux下都是档案,不仅如此,连数据沟通的接口都有专门的档案在负责。Linux的档案种类很多,包括前面提到的目录档案(d)和一般档案(-),还有其他的。
就是我们前面说的一般档案,第一个字符为-,如-rwxrwxrwx。
正规档案一般根据内容又分为以下几种:
纯文本档案(ASCII):档案中存储的是直接可以读取的文字,字母和数字。(可以用cat指令将档案内容读取到屏幕上)
二进制文件(binary):档案中存储的是二进制数据,可供linux执行的。Linux中可执行的文件都是二进制文件(script,批处理文件不算),举个例子,cat指令本身就是一个二进制档案,因此它可以执行。
数据格式文件(data):有些程序在运行过程中会读取特定格式的档案,哪些特定格式的档案就是数据格式文件(data file),比如说,当linux用户登录时,登录数据会被存储在/var/log/wtmp那个档案内,该档案就是数据格式文件。它能够通过last指令读取出来,但是使用cat指令读取就会出现乱码。
通过cat指令读取/var/log/wtmp数据格式文件
而且通过cat指令读取过数据格式文件后整个页面包括命令提示符都会显示成乱码。
通过last指令读取/var/log/wtmp数据格式文件
不多说了,第一个字符为d。目录档案中记录的是档案列表。
类似于windows系统下的快捷方式。第一个字符为l。
与系统周边及存储相关的一些档案,通常都存储在/dev这个目录下。通常又分为两种:
区块(block)设备档:一些存储数据,以提供系统随机存取的设备,如软盘,硬盘等,第一个字符为b。如/dev/sda
字符(charactor)设备文件:即一些串行端口的接口设备,如键盘,鼠标等,这些设备的特色是一次性读取,不能截断输出,比如你不能让鼠标突然跳到另一个地方,你只能让鼠标滑动到另一个地方。第一个字符为c。
数据接口文件,通常被用在网络上的数据承接。比如我们可以启动一个程序来监听客户端的请求,而客户端就可以通过这个socket来进行数据的沟通了,最常在/var/run中看到这种文件类型,第一个字符为s。
FIFO也是一种特殊的文件类型,主要解决多个程序同时存取一个档案所造成的错误问题。FIFO是first-in-first-out的缩写,第一个字符为p。如下图
基本上linux档案是没有什么扩展名的,从权限那里我们也知道程序能否执行和扩展名无关。但是我们可以通过扩展名来了解档案可能的用途,了解档案中存储的是什么类型的数据。
*.sh:脚本或批处理文件(scripts),因为脚本或批处理文件使用shell写成的,所以扩展名就编写成.sh
.Z,.tar,.tar.gz,.zip,*.tgz:经过打包的压缩文件
.html,.php:网页相关档案,分别代表html语法的网页档案和php语法的网页档案
使用预设的ext2/ext3文件系统时,档案档名的长度限制为:
单一档案或目录允许的档名最大长度为225个字符
包含完整路径名称及目录(/)的完整档名最大长度为4096个字符
由于linux在文字接口的一些指令的关系,规定linux档名时最好避免使用一些特殊字符,如*,?,>,<,&等,不多举例了。因为这些符号在文字接口下是有特殊意义的。另外,档案名的开头为.,表示该档案是隐藏档。
为什么每套linux发行版的配置文件,执行文件,每个目录里放的档案都差不多,是有一套标准依据的。
由于利用linux开发产品的个人和企业实在太多了,所以就有一套FHS标准(Filesystem Hierarchy Standard),主要目的是为了让使用者了解已安装软件通常放在哪个目录下。
FHS依据文件系统使用的频繁与否,是否允许使用者进行随意变更,将目录定义成四种交互作用的形态。用表格来说有点像底下这样:
可分享的(shareable) | 不可分享的(unshareable) | |
不变的(static) | /usr(软件放置处) | /etc(配置文件) |
/opt(第三方软件) | /boot(开机与内核文件) | |
可变动的(variable) | /var/mail(用户邮件信箱) | /var/run(程序相关) |
/var/spool/news(新闻组) | /var/lock(程序相关) |
上面就是一些代表性的目录。
可分享的:可以分享给网络上其他主机挂载使用的,如执行文件和用户邮件等数据。
不可分享的:在自己机器上运行的设备文件或是与程序相关的socket文件等。
可变动的:经常改变的数据如登陆文件,新闻组等。
不可变动的:如函数库,文件说明文件,系统管理员所管理的主机服务配置文件等,是不会经常变动的。
事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据:
/(root根目录):与开机系统有关;
/usr(UNIX software resource):与软件安装和执行有关;
/var(variable):与系统运作过程有关;
注:root在Linux中的意义有很多,从账号角度来看,root指的是系统管理员的身份。从目录角度来看,root指的是根目录/。
根目录是Linux系统最终要的一个目录,与开机,还原,系统修复等操作有关,根目录所在分区越小越好,且应用程序所安装的软件最好不要和根目录在同一个分区内,保持根目录越小越好,这样不止能保证性能,根目录所在的文件系统也不容易发生错误。
根目录下各子目录及其文件内容
目录 | 应放置的文件内容 |
---|---|
/bin | 单用户维护模式下还能够被操作的命令。在/bin目录下的命令可以被root和一般用户所使用,如cat,chmod,date,mv,mkdir,cp,bash等命令 |
/boot | 开机会使用到的文件,如Linux内核文件及开机所需的配置文件等 |
/dev | 在Linux中任何设备与接口设备都以文件的形式存在于这么目录中的,如键盘,鼠标和存储设备等,通过访问某个文件来访问这个设备 |
/etc | 系统的主要配置文件几乎都放在这个目录内,如人员的账号密码,各种服务的起始文件等。该目录下的文件可以被一般用户查阅,但只有root有权利修改 |
/home | 系统默认的用户主文件夹,当新建一个用户时,/home目录下就会新建一个以该用户名命名的文件夹作为该用户登陆后的家目录 |
/lib | 开机时会用到的函数库,以及/bin和/sbin下面命令会调用的函数库 |
/media | 放置可删除的设备如软盘,光盘,DVD等设备,都暂时挂载于此 |
/mnt | 如果你想暂时挂载一些额外的设备,可以放在这个目录下 |
/opt | 给第三方软件放置的目录。什么是第三方软件,举例来说KDE桌面管理系统是个独立的计划,但它可以安装到Linux系统中,因此KDE软件就建议放置在该目录下。如果你想安装额外的软件(非原本的distribution所提供的)也能将你的软件安装到这里来。不过,我们还是习惯放置在/usr/local目录下 |
/root | 系统管理员的主文件夹。root的家目录在根目录下而不在/home目录下,是因为如果进入单用户维护模式而仅挂在根目录,可以拥有root的主文件夹 |
/sbin | 存放只有root才能使用的命令,一般这些命令是用来设置系统环境或是用于开机,还原,修复系统的。至于某些服务器软件程序,一般放置到/usr/sbin中。而本机自行安装的软件所产生的系统执行文件,一般放置到/usr/local/sbin中 |
/srv | 是service的缩写,放置某些网络服务启动后需要取用的数据,如WWW,FTP服务等 |
/tmp | 让一般用户或是正在执行的程序暂时放置文件的地方,这个目录一般需要定期清理,重要的数据不建议放置在该目录,因为FHS甚至建议开机时应该要将/tmp目录清空 |
事实上,FHS针对根目录所定义的标准就仅有上面列举的数据,不过我们的Linux下面还有许多目录也是需要了解一下的,以下几个目录在Linux中也是非常重要的。
目录 | 应放置的文件内容 |
---|---|
/lost+found | 这个目录是使用标准的ext2/ext3文件系统格式才会产生的一个目录(我的CentOS 7没有这个目录)。当文件系统发生错误时将一些丢失的片段放在这个目录下 |
/proc | 这个目录本身是一个虚拟文件系统,它的数据都是放置在内存中的,如系统的内核,进程,外部设备的状态,网络状态等 |
/sys | 和/proc类似也是一个虚拟文件系统,用于记录与内核相关信息,包括目前已加载的内核模块与内核检测到的硬件设备信息等 |
开机过程中仅根目录会被挂载,其他分区是在开机完成后才会持续进行挂载。因此以下这些根目录下与开机过程有关的目录就不能够跟根目录放到不同分区去。
根据FHS的定义,/usr中的数据属于可分享和不可变动的。如果你知道如何通过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网内其他主机来使用。
/usr是UNIX software resource的缩写,也就是UNIX操作系统软件资源,FHS建议所有软件开发者将他们的数据合理地放置到这个目录下的子目录,而不是自行新建该软件自己独立的目录。/usr相当于Windows系统中的C:\Windows\和C:\Program files\这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr的子目录建议有下表所示这些。
目录 | 应放置的文件内容 |
---|---|
/usr/X11R6/ | 为X Window系统重要数据所放置的目录 |
/usr/bin/ | 绝大部分用户可使用的命令都放置在这里。它与/bin的区别在于这些命令与开机过程无关,大多是系统自行安装的软件的可执行命令 |
/usr/include/ | C/C++等程序语言的头文件(header)和包含文件(include)放置处,当我们以tarball(*.tar.gz的方式安装软件)安装某些数据时,会用到里头许多的include文件 |
/usr/lib/ | 包含各个应用软件的函数库,目标文件(object file),以及不被一般用户惯用的执行文件或脚本。某些软件会提供一些特殊的命令来进行服务器的设置,这些命令也不会经常被系统管理员操作,那么就会被放在这个目录下。如果你使用的时X86_64的Linux系统,那可能会有/usr/lib64/目录产生 |
/usr/local/ | 系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录 |
/usr/sbin/ | 非系统正常运行所需要的系统命令,如某些网络服务器软件的服务命令 |
/usr/share/ | 放置共享文件的地方,这个目录下放置的数据几乎是不分硬件架构均可读取的数据,因为几乎都是文本文件 |
/usr/src/ | 一般源码建议放置在这里,src有source的意思。至于内核源码则建议放置到/usr/src/linux/目录下(CentOS 7上只有/usr/src/kernel目录) |
如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。因为/var目录主要针对常态性变动的文件,如缓存(cache),登陆文件(log file)以及某些软件运行所产生的文件,包括程序文件,或者例如mysql数据库的文件等。常见的子目录如下表所示。
目录 | 应放置的文件内容 |
---|---|
/var/cache/ | 应用程序本身运行过程中会产生的一些缓存文件 |
/var/lib/ | 程序本身执行的过程中需要使用到的数据文件放置的目录。在此目录下各个软件应该要有自己的目录来存放自己的数据 |
/var/lock/ | 某些设备或资源文件一次只能被一个应用程序所使用,为了防止第二个程序使用,就要将该设备上锁。 |
/var/log/ | 登陆文件放置的目录,比较重要的文件有/var/log/messages,/var/log/wtmp(记录登陆者的信息)等 |
/var/mail/ | 放置个人电子邮件信箱的目录,这个目录一般也被放置在/var/spool/mail/目录中,通常这两个目录是互为连接文件 |
/var/run/ | 某些程序或者服务启动后会将它们的PID放置在这个目录下 |
/var/spool/ | 这个目录通常放置一些队列数据,就是排队等待其他程序使用的数据,这些数据使用后通常都会被删除 |
针对FHS各家distributions的异同
由于FHS仅是定义出最上层/及子层/usr,/var的目录内容应该要放置的文件或目录数据,其他子目录层级内就可以随开发者自行来配置了。距离来说,CentOS的网络这只数据放置在/etc/sysconfig/network-scripts/目录下,而SuSE则是将网络放置在/etc/sysconfig/network/目录下。
Linux下面,所有目录都是从根目录开始的,然后再一个一个分支下来,有点像树枝状,因此我们也称这种目录配置方式为目录树,目录树的特性有
目录树的起始点是根目录
目录树中每个目录的目录名(包含完整路径)都是独一无二的
每个目录不止能使用本地端的文件系统,也能使用网络上的文件系统,如可以利用Network File System(NFS)服务器挂载某些特定目录。
CentOS 7根目录下的子目录如图所示
目录树架构如图所示
示例1:绝对路径与相对路径的切换
如图所示,当前目录为/home目录,访问/home/huyan时输入cd huyan是相对路径的写法,因为/home/huyan就是/home的子目录,绝对路径的写法应该是cd /home/huyan。而进入/home/huyan目录后,访问根目录时输入cd /是绝对路径的写法。而在根目录访问/home/huyan时输入cd /home/huyan也是绝对路径的写法,在/home/huyan目录下访问/root目录时输入cd ../../root就是相对路径的写法。这块内容具体以后还会讲到。
.与..的概念在相对路径的使用中是非常重要的。
如何查看Linux的内核和distribution使用的是哪个Linux标准,可以使用uname –r和lsb_release命令,如图所示
如图所示,我的CentOS 7内核版本为3.10.0-862.e17.x86_64