第八节 Linux 文件的属性(下半部分)
标签(空格分隔): Linux教学笔记
---
第1章 链接的概念
在linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软连接或符号链接(Symbolic Link or Soft link)。我们在前面讲解过ln这个命令就是创建链接文件的,在默认不带参数的情况下,执行ln命令创建的链接是硬链接。
第2章 硬链接
- 硬链接是指通过索引节点(Inode)来进行连接。在Linux(ext2,ext3,ext4)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Index Inode)简称Inode,即在系统中文件的编号。
- 在Linux文件系统中,多个文件名指向同一个索引节点(inode号相同)是正常且允许的。这种情况的文件就称为硬链接。
- 提示:硬链接文件就相当于文件的另外一个入口。硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口),这样用户就可以建立硬链接到重要的文件,以防止“误删除”源数据(很多硬件存储,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?
- 因为文件系统(ext2)的原理是,只要文件的索引节点(Inode Index)还有一个以上的硬链接。只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似fsck做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。
- 也就是说,在linux系统中,删除静态文件(没有进程调用)(目录也是文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会讲和进程的占用也有关)
- 下面给出一个文件多个链接的形象图帮助大家理解:
- 硬链接示意图:如果使用ln -s 创建链接则为软链接,前面文件类型为1(字母L)的是软链接。硬链接:ln 源文件 目标文件软链接:ln -s 源文件 目标文件(目标文件不能事先存在
硬链接的创建
直接执行命令“ln 源文件 硬链接文件”,即可完成创建硬链接。2.1 硬链接知识小结
1,如何创建及含义:
- 通过执行命令“ln 源文件 硬链接文件”,即可完成创建硬链接。
- 具有相同inode节点号的多个文件是互为硬链接文件。
2,硬链接与删除
- 删除硬链接文件或者删除源文件任意之一,文件实体(block 数据 文件内容)并未被删除。
- 只有删除了源文件及所有对应的硬链接文件,文件实体(block 数据 文件内容)才会被删除
- 当所有的硬链接文件及源文件被删除后,再存放新的数据会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收(养成删除及多套环境测试的好习惯)
3,硬链接文件就是文件的另一个入口(相当于超市的前门,后门一样)。
4,可以通过给文件设置硬链接文件,来防止重要文件被误删。
5,硬链接文件是普通文件,因此可以用rm命令删除
6,文件彻底删除:
对于静态文件(没有进程正在调用的文件)来讲,当对应硬链接数为0(i_link),文件就被删除。 i_link的查看方法(ls -lhi结果的第三列就是)
7,查看文件的硬链接数ls -lhi/stat,i_link的查看方法(ls -lhi结果的第三列就是)
2.2 软连接
- 软连接(Soft Link)也称为符号链接(Symbolic Link)。linux里的软链接文件就类似于Windows系统中的快捷方式。linux里的软链接文件实际上是一个特殊的文件,文件类型是l。软链接文件实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一个源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。
- 下面给出一个软连接文件的形象图帮助大家理解:
查看软链接的value:
[root@chensiqi1 ~]# ll annn
lrwxrwxrwx. 1 root root 15 12月 30 07:48 annn -> anaconda-ks.cfg[root@chensiqi1 ~]#
软链接的创建
- 执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接。
- 误区:创建软链接的源文件是需要存在的,要创建的软链接文件是不能存在的,是要用ln命令创建的
2.3 企业面试题
在配置apache时,执行了./configure --prefix=/application/apache2.2.17来编译apache,在make install 完成后,希望用户的访问路径更简单,需要给/application/apache2.2.17目录做一个软链接/application/apache,使得内部开发或管理人员通过/application/apache就可以访问到apache的安装目录/application/apache2.2.17下的内容,请你给出实现的命令。(提示:apache为一个httpd web服务)
思路:
软件的安装位置/application/apache2.2.17给开发人员使用的位置/application/apache2.2.17升级软件,新的软件的安装位置/application/apache2.4.17思考:如何给别人使用的始终是一个路径,即使更新了软件
所以,我们要做软链接,这样不论软件如何更新,通过修改软链接的指向就可以,然后软链接的路径始终不变。1,创建软链接2,软件更新了,重新创建软链接3,如图软链接的地址始终不变,不会影响开发人员的使用,这就是实际工作中软链接的意义软链接知识小结
1,软链接类似windows的快捷方式(可以通过readlink查看指向)2,软链接类似一个文本文件,里面存放的是源文件的路径(ls -l),指向源文件实体。3,删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容。4,失效的时候一般是白字红底闪烁提示。5,执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接(目标不能存在)6,软链接和源文件是不同类型的文件,也是不同的文件。inode号也不相同7,软链接文件的文件类型为“1(字母1)”,可以用rm命令删除2.4 示例演示
2.4.1 文件软硬链接示例
目录的软链接在实际生产场景中经常用到,硬链接用的不多。
思考:下图为何不能创建硬链接
分析:
- 硬链接的本质其实就是有多个入口,都可以看到目标文件的内容。这些入口就是门,也就是硬链接。
- 硬链接其实也就相当于做备份--超市A ---超市A.bak
- 软链接就相当于windows的快捷方式,这就如同超市并没有多开新的门,仍旧用的旧门,只不过告诉你通过多条路都可以来到这个门而已。
- 因此,对linux来说,硬链接需要系统将目标文件做备份,删除其中的任何一个,文件内容都不会消失,只不过是删除了其中的一份备份而已;而软链接并没有做备份,他只是多增加了一条来到门前的通路而已。
- 故,假如linux允许给目录做硬链接的话,他就同时需要给目录下的所有文件在做一个硬链接,这样会导致系统不断的进行遍历,拖慢系统的运行速度。
测试
通过软硬链接都能看到目标内容,因此,对其中的一个的内容做出改变,所有都改变。当删除源文件后,硬链接的文件不受影响,但是软链接文件失效
测试结论:
- 软链接和硬链接都指向相同的文件内容,因此其中一个的文件内容发生改变,所有的链接文件内容都发生改变
- 当源文件chensiqi被删除,软链接受到影响,进入失效状态,因为软链接是通过源文件作为入口才能看到文件内容的,入口没了,软链接自然失效。
- 而源文件被删除,硬链接不受影响,是因为,硬链接单独开辟了一个能够看到文件内容的入口,源文件的入口没了,不影响硬链接的入口的正常使用。
2.6 链接总结
2.6.1 软硬链接小结
通过测试,我们可以得到以下几个结论:
1,删除软链接,对源文件和硬链接文件无影响2,删除硬链接,对源文件和软链接无影响3,删除源文件,对硬链接无影响,但是软链接失效4,同时删除源文件和硬链接,整个文件就会真正的被删除5,源文件和硬链接文件具有相同的索引节点号,可以认为是同一个文件或一个文件的多个入口。6,源文件和软链接文件索引节点号不同,是不同的文件,软链接相当于源文件的快捷方式,含有源文件的位置指向。2.6.2 有关目录链接小结
1,对于目录,不可以创建硬链接,但可以创建软链接
2,对于目录的软链接是生产场景运维中常用的技巧3,目录的硬链接不能跨越文件系统(从硬链接原理可以理解)4,每个目录下面都有一个硬链接“.”号,和对应上级目录的硬链接“..”5,再父目录里创建一个子目录,父目录的链接数增加1(每个子目录里都有..来指向父目录)但是在父目录立创建文件,父目录的链接数不会增加。2.6.3 企业面试题
描述linux下软链接和硬链接的区别
解答:
1,默认不带参数情况下,ln命令创建的是硬链接,带-s参数的ln命令创建的事软链接
2,硬链接文件与源文件的inode节点号相同,而软链接文件的inode节点号与源文件不同。3,ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到。4,删除软链接文件,对源文件及硬链接文件无任何影响5,删除文件的硬链接文件,对源文件及软链接文件无任何影响6,删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效7,同时删除源文件及硬链接文件,整个文件才会被真正的删除8,软链接可以跨文件系统,硬链接不可以跨文件系统2.6.4 链接知识扩展
李小龙说过一句话,他不怕一千个动作只练一遍的人,而怕一个动作练一千遍的人
简单的事情重复做就是高手,不断重复下去就是专家
综上:请千万记得,正在使用当中的文件,即便你删除了i_nlink(硬链接数),文件实际上也并没有被删除,因为,文件还正在处于读写状态。只有i_count的数也为零时,文件才会被彻底删除。
再生产环境中,有时会遇到apache等类似服务,磁盘满了的情况,会要求你去删掉些日志,如果此时你去删除了,你会发现磁盘空间占用没有改变,还是满的,而且查询不到。这是因为,后台进程仍旧在占用着被删掉了的日志文件,因此linux并没有将内容删除(block),你的删除只是清除了inode和文件名而已。解决这个问题就需要重新启动apache较好的处理方案,清空日志而不删除日志>/app/logs/access_log
第3章 文件的权限
3.1 文件权限概述
- Linux中每个文件或目录都有一组共9个基础权限位,每三位字符被分为一组,他们分别是属主权限位(占三个字符),用户组权限位(占三个字符),其他用户权限位(占三个字符)。比如rwxr-xr-x,在linux中正是这9个权限位来控制文件属主,用户组以及其他用户权限。
3.2 权限位说明
- Linux文件或目录的权限位是由9个权限位来控制,每三位为一组:
- 文件的所有者权限:Owner的读写执行
- 文件所有者属于的组的权限:Group用户组的读写执行
- 其他人Other其他用户的读写执行
- r(read)可读权限,对应数字4
- w(write)可写权限,对应数字2
- x(Execute)可执行权限,对应数字1
- 没有任何权限,对应数字0
3.3 linux多用户多任务介绍
Linux/Unix是一个多用户,多任务的操作系统;在讲Linux账号及账号组管理之前,我们先简单了解下多用户,多任务操作系统的基本概念。
- 鉴于大家对windows比较熟悉了,因此我们先以windows系统为例阐述。当我们以管理员账号administrator用户登录windows系统后,我可能需要编辑word文档内容,但在编辑文件的过程中,又可能会同时打开音乐播放器听音乐;同时还可能会打开MSN/QQ。其中编辑word文档,开播放器,MSN/QQ,这些操作每种都是一项任务。因此,在以上过程中,我们同时执行了几个任务。一个用户如administrator用户,为了完成工作和相关任务,同时执行了几个服务或进程;那么,Linux也是这样的一个操作系统,当你登陆后,你也可以同时开启很多的服务任务和进程,而各自服务都会跑的很好却对其他任务没有任何影响,这种一个用户登陆系统执行多个服务任务和进程的情况,就称为单用户多任务。
- 有时可能是很多用户同时用同一个系统,如老男孩所在公司几十个运维人员,每台机器都可以被若干个运维人员登陆部署或解决相关故障问题,但并不是所有的运维人员都要做同一件事,所以这就有多用户,多任务的情况。
- 举个例子,比如etiantian.org服务器,上面有系统管理员root用户,apache用户,常规普通用户等。在同一时刻,可能有的人正在上传软件包部署apache服务;有的查看服务器日志,有的人正在登陆编写shell程序;不同的维护人员对系统的维护或查看,用的可以是不同的普通账户或超级账户root;不同用户所具有的权限也不同,不同的任务工作由不同的维护人员来完成,也可以说是不同的用户。
- 值得注意的是:多用户,多任务并不是大家同时挤到一起在一台机器的键盘和显示器前来操作机器,多用户可能是通过SSH客户端工具等远程登陆服务器来进行,比如对服务器的远程控制,只要具有相关用户的权限,任何人都是可以上去操作访问服务器。
3.4 linux系统中用户角色划分
-
在linux系统中用户是分角色的,在linux系统中,由于角色不同,权限和所完成的任务也不同;值得注意的是,对于linux系统来说,用户的角色是通过UID和GID识别的;
-
特别是UID,在linux系统运维工作中,一个UID是唯一标识一个系统用户的账号(相当于我们的身份证)。用户系统账号的名称(如chensiqi)其实给人(管理员)看的,linux系统能够识别的仅仅是UID和GID这样的数字。
用户的UID就相当于我们的身份证号一样,用户名就相当于我们的名字。
- 超级用户:root(皇帝)
- 默认是root用户,UID和GID均为0.root用户在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任意文件和命令,拥有最高的管理权限
- 在生产环境中,一般会禁止root账号通过SSH远程连接服务器,当然了,也会更改默认的SSH端口,以加强系统安全。
- 最小化安全:1,安装系统(最小化安装+必要的包组)2,开启的服务最小化
- 企业工作中:没有特殊需求,应该尽量在普通用户下操作任务,而不是root
- 再linux系统中,uid为0的用户就是超级用户。但是通常不这么做,而是sudo管理提权,可以细到每个命令权限分配怒。
- 普通用户:为普通用户授权(sudo)su -root:角色切换,切换超级用户sudo ls:申请提权,临时提高自己的权限
虚拟用户
与真实普通用户区分开来,这类用户最大的特点是安装系统后默认就会存在,且默认情况大多数不能登录系统,但是,他们是系统正常运行不可缺少的,他们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如:系统默认的bin,adm,nobody,mail用户等。由于服务器业务角色的不同,有部分用不到的系统服务被紧致开机执行,因此,在做系统安全优化时,被禁止开机启动了的服务对应的虚拟用户也是可以处理掉的(删除或注释)虚拟用户角色傀儡:
linux安全优化:1,安装系统后可以删除用不到的虚拟用户,但最好不删而是注释掉,万一出问题可以恢复回来。2,我们自己部署服务的时候,也会创建虚拟用户,满足服务的需求!例如;apache,nginx,mysql,nfs,rsync,nagios,zabbix,redis3.5 linux系统中不同角色对应的UID说明
服务的运行需要用户角色,可以不用登陆,因此,工作中我们需要运行如mysql数据库,可以创建如下虚拟用户:
命令被linux启动的过程:
1,linux先在$PATH环境变量里找这个命令的脚本的位置2,找到以后通过shell来执行3,shell执行(bash + 命令)
- 因此,useradd-s/bin/bash(的本质意思就是-s 让shell 用 bin目录下的bash脚本来进行登录)
- 而,useradd -s /sbin/nologin(的本质意思就是-s 让shell用sbin目录下的nologin脚本来登录)
3.6 多用户操作系统的安全
多用户系统从实际来说使得系统管理更为方便了。从安全角度来说,多用户系统也更为安全,比如普通用户chensiqi下的某个文件不想让其他用户看到,只是设置一下该文件的权限为只有普通用户chensiqi一个用户可读可写可编辑(后文会详细讲权限)就行了,这样一来只有普通用户chensiqi一个用户可以对其私有文件进行操作,从而达到了保护每个用户的私有数据安全。
第4章 账户(user)和账户组(group)
4.1 用户(user)介绍
- 通过上文对Linux系统多用户特征的理解,我们知道Linux是一个多用户,多任务的分时操作系统,如果要使用系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统。这个账户和用户是一个概念,通过建立不同属性的用户,一方面,可以合理的利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。
- 每个用户都有一个唯一的用户名和用户口令,在登陆系统时,只有正确输入了用户名和密码,才能登入系统和相应的目录(除了密码验证外,还可以是密钥验证)。
- 在生产环境中,我们一般会为每个有权限管理服务器的运维人员分配一个独立的普通用户账号及8位(包含数字,字母,特殊字符)以上的密码,如chensiqi。该人员只能通过建立的这个账号登陆到系统中进行维护,当需要超级用户权限时,可以通过“sudo + 命令名”的方式来执行仅有root用户才允许执行的权限。当然,sudo权限要尽量小。还有,当运维人数不多时,如2-3个,也可以直接su - 切换到超级用户root下,在执行相应的维护工作,在这里要特别提醒大家,维护时,如果不需要root权限,就不要进入root用户下操作,以减少误操作对系统带来的损失,请谨记!
提示:
sudo 和su是两个重要切换用户角色的命令,以后会详细讲解
4.2 用户组(group)介绍
- 简单的说,linux系统中的用户组(group)就是具有相同特征的用户(user)集合;为了便于大家理解,我做个比喻:一个公司,一个家庭就是一个集合,类似这里的用户组,公司的员工和家庭中的成员就相当于这里的用户。
- 有时我们需要让多个用户具有相同的权限,比如查看,修改某一文件或目录,如果不用用户组,这种需求在授权时就很难实现。如果使用用户组就方便多了,只需要把授权的用户都加入到同一用户组里,然后通过修改该文件或目录的对应的用户组的权限,让用户组具有符合需求的操作权限,这样用户组下的所有用户对该文件或目录就会具有相同的权限,这就是用户组的用途。
- 将用户分组是Linux系统(windows中也是一样)中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了运维管理工作。
- 实际上,在日常生活中,对人类的分组也是无处不在的,大到国家,小到公司,家庭,学校,班级等等都类似linux中用户组的概念,而其中的成员就类似linux用户组中用户的概念。
4.3 用户和用户组的对应关系
用户和用户组的对应关系有:一对一,一对多,多对一和多对多,方便大家理解,通过下图进行展示:
- 一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。如:root
- 一对多:即一个用户可以存在于多个用户组中。比如,上图中普通用户chensiqi可以是sa组成员,也可以是java用户组成员,还可以是tech用户组成员,这里的chensiqi用户具有sa,java,tech多个组的共同权限。
- 多对一:多个用户可以存在于一个组中,这些用户具有和组相同的权限,这条是上文讲过的。
- 多对多:多个用户可以存在多个组中。并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展;理解了上面三条,这条也就好理解了。
4.4 用户及用户组配置文件介绍
linux系统下的账户文件主要有/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow 四个文件
4.4.1 与用户相关的配置文件
- /etc/passwd #用户的配置文件
- /etc/shadow #用户影子口令文件
(1) 用户的配置文件:/etc/passwd:
/etc/passwd文件中每行定义一个用户账号,有多少行就表示多少个账号,在一行中可以清晰的看出,各内容之间又通过“:”号划分了多个字段,共7个部分,这7个部分分别定义了账号的不同属性,passwd文件实际内容如下:
提示:
passwd文件中有很多虚拟帐号,如bin,daemon等,一般来说,这些账号是系统正常运行所需要的,在不确定的情况下,请不要随意删改此类账号。
小结论:
1,useradd 添加用户会更改/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow2,passwd为用户设置密码会更改/etc/shadow(2)用户的影子口令文件/etc/shadow
前面提到了,由于passwd文件必须要被所有的用户读,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。我们来看下/etc/shadow文件的权限:
- passwd -n 7 -x 60 -w 10 -i 30 chensiqichage -m 7 -M 60 -W 10 -I 30 chensiqichage -m 7 -M 60 -W 10 -I 30 chensiqi
小结论
1,useradd 添加用户会更改/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow2,passwd为用户设置密码会更改/etc/shadow4.4.2 与用户组相关的配置文件
/etc/group #用户组配置文件
/etc/gshadow #用户组的影子文件
用户组配置文件/etc/group:
- /etc/group文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户归属哪个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特征。比如我们把某一用户加入到root用户组,那么这个用户就可以浏览root用户家目录的文件,如果root用户把某个文件的读写执行权限开放,root用户组的所有用户都可以修改此文件,如果是可执行的文件(比如脚本),root用户组的用户也是可以执行的;用户组的特性在系统管理中为系统管理员提供了极大的方便,但安全性也是值得关注的,如某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进去。
- /etc/group文件就是前面提到的记录GID与用户组名称的。/etc/group文件同/etc/passwd类似,其文件权限也是644
小结论
1,groupadd 添加用户组会更改/etc/group,/etc/gshadow/etc/gshadow是/etc/group的加密咨询文件,比如用户组(Group)管理密码就是存放在这个文件。/etc/gshadow和/etc/group是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码:/etc/gshadow格式如下,每个用户组独占一行;