1.使用者与群组
1.1 文件拥有者
提问:Linux有这么多使用者,还分什么群组,有什么用?
由于Linux是个多人多任务的系统,因此可能常常会有多人同时使用这部主机来进行工作,为了考虑每个人的隐私权以及每个人喜好的工作环境,因此,文件拥有者的角色就显得相当重要了。
1.2 群组概念
假设有一家人,家里有三兄弟:大毛、二毛和三毛。这个家庭是登记在大毛名下的,所以是"大毛家有三个人,分别是大毛、二毛、三毛",这三个人都有自己的房间,并且共同拥有一个客厅。
使用者:由于大毛家三个人各自拥有自己的房间,所以二毛虽然可以进入三毛的房间,但是二毛不能翻三毛的东西。因为三毛房间是私人的。
群组:由于共同拥有客厅,所以这三兄弟可以共享这个客厅。只有是客厅的东西,三兄弟都可以使用。
这么说来,"大毛家"就是所谓的"群组","三兄弟"就是分别为三个"使用者",而这个三个使用者是在同一个群组里的。虽然他们在同一个群组,但是我们也可以设定权限保护私有空间;也可以设定群组共享,群组里的让共同分享。
1.3 其他人的概念
今天又有个人,叫小猪,与大毛家没关系。除非大毛家认识小猪,才能让小猪进入大毛家。小猪就是所谓的"其他人"。
因此,在Linux里面任何一个文件都具有"User、Group、Others"三种身份的权限。
1.4 用户身份与群组记录的文件
在Linux系统中,默认的情况下,所有的系统上的账号与一般身份使用者,还有root的信息都记录在/etc/passwd文件内;个人密码记录在/etc/shadow文件内;Linux所有的组名都记录在/etc/group文件内。
2.Linux文件权限概念
2.1 Linux文件属性
命令"ls -al"就可以查看文件的权限属性:
第一栏代表这个文件的类型与权限
-
第一自负代表文件是什么(目录、文件、链接文件等):
[d]:表示目录;
[-]:表示文件;
[l]:表示连接档(link file);
[b]:表示装置文件里面的可供存储的接口设备(可随机存取装置);
[c]:表示装置文件里面的串行端口设备,例如键盘、鼠标;
-
接下来的字符,三个为一组,且均为"[rwx]"的三个参数的组合。其中"r"表示可读(read),"w"表示可写(write),"x"表示可执行(execute)。需要注意到是,这三个权限的位置不会改变,如果没有权限,就会出现"-"号而已。
第一组为"文件拥有者可具备的权限",以上图中"initial-setup-ks.cfg"文件为例,该文件的拥有者可以读写,但不可执行;
第二组为"加入此群组的账号的权限";
第三组为"非本人且没有加入本群组的其他账号的权限"。
第二栏表示又多少档名连接到此节点(i-node):
每个文件都会将它的权限与属性记录到文件系统的i-node中,因为目录树使用文件名来记录,因此每个档名就连接到一个i-node。这个属性记录的,就是有多少不同的档名连接到相同的一个i-node号码。第七章详解。
第三栏表示这个文件(或目录)的拥有者账号
第四栏表示这个文件的所属群组
第五栏为这个文件的容量大小,默认单位为bytes
第六栏为这个文件的建党日期或修改日期
第七栏为这个文件的档名
2.2 如何改变文件属性与权限
这里先介绍几个常用于群组、拥有者、各种身份的权限修改指令:
改变所属群组:chgrp
注意:要被改变的组名必须要在/etc/group文件内存在才行,否则会显示错误。
用法:
改变文件拥有者:chown
注意:用户必须是已经存在系统中的账号,在/etc/passwd文件中有记录的用户名称才能改变。
用法:
我们知道如何改变文件的群组与拥有者了,那么什么时候用chown恶化chgrp呢?最常见的例子就是复制文件给其他人时,这里用cp指令来说明:
假设你要将.bashrc文件拷贝称为.bashrc_test档名,然后给bin这个账号,你可以这样做:
所以,这怎么做呢?.bashrc_test还是属于root所拥有,所以就需要将这个文件的拥有者与群组修改一下!通过上述知道如何修改了吧。
改变权限:chmod
权限的设定方法有两种,分别可以使用数字和符号来进行权限的变更:
- 数字类型改变文件权限
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。例如,文件的权限字符为"-rwxrwx---",这九个权限三个一组,其中,"r"代表数字"4","w"代表数字"2","x"代表数字"1":
owner = rwx = 4 + 2 + 1 = 7
group = rwx = 4 + 2 + 1 = 7
others = --- = 0 + 0 + 0 = 0
所以,该文件的权限数字就是770了。变更权限的指令chmod语法如下:
例如,如果将.bashrc这个文件所有的权限都设定启用:
- 符号类型改变文件权限
九个权限分别是user、group、others三种身份,我们分别用u、g、o代表三种身份的权限;此外,a则代表all表示全部的身份:
例如我们要设定一个文件的权限是"-rwxr-xr-x"时,可以做以下操作:
此外,如果我们不知道原先的文件属性,而我们只想增加.bashrc这个文件的每个人均可写入的权限,可以做以下操作:
2.3 目录与文件的权限意义
- 权限对文件的重要性
文件是实际有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件等。因此,权限对于文件,它的意义是:
r :可读取本文件的实际内容,如读取文本文件的文字内容等。
w:可以编辑、新增或修改该文件的内容(不包含删除该文件)。
x : 该文件具有可以被系统执行的权限。
- 权限对目录的重要性
r :表示具有读取目录结构列表的权限。
w:表示你具有移动该目录结构列表的权限:建立新的文件与目录;删除已经存在的文件与目录(无论该文件的权限为何);将已存在的文件或目录进行更名;搬移该目录内的文件、目录位置。
x:用户能否进入该目录称为工作目录。
总结一下就是:
- 用户操作功能与权限
有两个档名:
/dir1/file1
/dir2
假设现在在系统使用dmtsai这个账号,那么这个账号对/dir1,/dir1/file1,/dir2这三个档名来说分别需要哪些最小的权限?
2.4 Linux文件种类与扩展名
文件种类
- 正规文件(regular file):第一个字符为"-",例如"-rwxrwxrwx"。
纯文本挡(ASCII):几乎所有文件都是这种类型。
二进制文件(binary):就是Linux可执行文件。
数据格式文件(data):程序在运行中会读取某些特定格式的文件。举例来说,Linux在使用者登入时,会将登录的数据保存在/var/log/wtmp文件,该文件就是(data file),可以使用"last"指令读出来。但是使用"cat"指令时,会读出乱码。
目录(directory):第一个属性为"d",例如"drwxrwxrwx"。
连结档(link):类似windows中的快捷方式,第一个属性为"l"。例如"lrwxrwxrwx"。
设备与装置文件(device):与系统周边及存储等相关的一些文件,通常集中在/dev这个目录下。分为两种:
区块(block)设备档:一些存储数据,以提供系统随机存取的接口设备。例如硬盘和软盘。可以随机的在硬盘的不同区块读写,这种装置就是组设备。第一个属性为"b"。
字符(character)设备文件:一些串行端口的设备,例如键盘、鼠标等。这些设备的特点是一次性读取的,不能够截断输出。第一个属性为"c"。
资料接口文件(sockets):通常被用于网络上的数据连接。我们可以启动一个程序来坚挺客户端的要求,而客户端可以透过这个socket来进行数据的沟通。第一个属性为"s"。通常在/run或/tmp这些目录中看到这种文件类型。
数据输送文件(FIFO,pipe):一种特殊的文件类型,主要目的在解决多个程序同时存取一个文件所造成的错误问题。第一个属性为"p"。
Linux文件扩展名
Linux没有所谓的扩展名的 ,一个Linux文件能不能被执行,与他的可执行权限有关。
"可执行的权限"和"可执行的程序代码"是两回事。例如有一个文本文件test.txt,你具有"可执行的权限",但是这个文件显然无法执行,因为它不具备可执行的程序代码。
不过通常还是会以适当的扩展名来表示该文件是什么种类的:
*.sh :脚本或批处理文件。
Z,.tar,.tar.gz,.zip,*.tgz:进过打包的压缩文件。
.html,.php:网页相关文件。
Linux文件长度限制
在Linux下,使用传统的Ext2/Ext3/Ext4文件系统及被CentOS7当作预设文件系统的xfs而言,针对文件的档名长度限制为:
- 单一文件或目录的最大容许文件名为255bytes,以一个ASCII英文占用一个bytes来说,大约是255个字符长度。
3. Linux目录配置
3.1 Linux目录配置的依据—FHS
使用Linux开发产品或distributions的社群与个人实在太多了,后来就有了Filesystem Hierarchy Standard(FHS)标准出炉了。
FHS依据文件系统使用的频繁与否和是否允许使用者随意改动,将目录定义成四种交互作用的形态:
事实上,FHS针对目录树架构仅定义出三层目录底下应该放置什么数据:
/(root,根目录):与开机系统有关;
/usr(unix software resource):与软件安装/执行有关;
/var(variable):与系统运作过程有关;
根目录(/)的意义和内容
根目录很重要,所有的目录都是由根目录衍生出来的,同时也与开机/还原/系统修复等动作有关。因此FHS要求根目录不要放在大分区槽内,因为越大的分区槽你会放越多的数据,这样可能会有较多发生错误的机会。
所以FHS建议:根目录所在分区槽应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区槽,不容易发生问题。
第一部分:FHS要求必须要存在的目录
/bin:它放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般账号所使用,主要有cat,chmod,chown,date,mv,mkdir,cp,bash等。
/boot:这个目录主要放置开机要使用的文件。
/dev:在Linux系统上,任何装置与接口设备都是以文件的形态存在于这个目录当中的。只要透过存取这个目录底下的某个文件,就等于存取某个装置了。
/etc:系统主要配置文件几乎都放在这里。例如人员的账号密码文件、各种服务的启动档等。一般来说,这个目录下的文件可以让一般使用者查询,但是只有root可以修改。
/lib:系统的函式库非常多,/lib放的是开机时会使用的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库。
/media:这个目录下放置的是可移除的装置。包括软盘、光盘、DVD等都暂时挂载于此。
/mnt:如果想暂时挂载某些额外的装置,一般放在这个目录。
/opt:这个是给第三方协力软件放置的目录。
/run:FHS规定系统开机后所产生的各项信息配置到这个目录。
/sbin:Linux有很多指令用来设定系统环境,这些指令只有root才能使用来设定系统,其他用户最多只能查询。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统需要的指令。
/srv:一些网络服务启动之后,这些服务所需要取用的目录。常见的服务如www,ftp等。www服务器需要的网页资料可以放在/srv/www里面。
/tmp:一般用户或正在执行的程序暂时放置文件的地方。这个目录任何人都可以存取的。
/usr:的二层FHS设定。
/var:第二层FHS设定,主要放变动性的数据。
第二部分:FHS建议可以存在的目录
/home:是系统默认的用户家目录。
/lib<qual>:存放与/lib不同格式的二进制函式库,例如支持64位的/lib64函式库等。
/root:系统管理员(root)的家目录。如果进入单人模式而仅挂载根目录时,该目录就能够拥有root的家目录,我们希望root的家目录与根目录放置在同一个分区槽中。
/lost+found:这个目录是使用ext2/ext3/ext4文件系统格式才会产生的一个目录,目的在于当文件发生错误时,将一些遗失的片段放到这个目录下。
/proc:这个目录本事是一个虚拟文件系统。放置的数据都在内存中,例如系统核心、行程信息、周边装置的状态及网络状态等。因为它的数据在内存中,所以本身不占用任何硬盘空间。
/sys:这个目录也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息较相关的信息。也是在内存中的。
/usr的意义和内容
依据FHS定义,/usr里面放置的数据属于不可分享与不可变动的。如果你知道如何透过网络进行分区槽的挂载,那么/usr确实可以分享给局域网络内的其他主机来使用。
FHS建议所有开发者,应该将他们的数据合理的分别放置在/usr目录的此目录下,而不要自行建立该软件自己独立的目录。
一般来说,/usr的此目录建议有以下这些:
FHS要求必须存在的目录
/usr/bin:所有一般用户能够使用的命令都放在这里。也就是说/usr/bin与/bin是一模一样了。另外,FHS要求此目录下不应该有子目录。
/usr/lib:基本上与/lib功能相同,所以/lib就是链接到此目录中的。
/usr/local:系统管理员在本机自行安装自己下载的软件,建议安装到此目录。
/usr/sbin:非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)。基本功能与/sbin一样,所以也是/sbin链接到此目录中国的。
/usr/share:主要放置只读的数据文件,也包括共享文件。
第二部分:FHS建议可以存在的目录
/usr/games:与游戏相关的数据放置处。
/usr/include:C/C++等程序语言的档头与包含档放置处。当我们以*.tar.gz的方式安装软件时,会使用到里面的许多包含档。
/usr/libexec:某些不被一般使用者惯用的执行档或脚本放在这里。例如大部分的X窗口底下的操作命令。
/usr/lib<qual>:与/lib<qual>功能相同,所以/lib<qual>链接到此目录中。
/usr/src:一般原始码建议放在这里,核心原始码建议放在/usr/src/linux目录下。
/var的意义与内容
/var是在系统运作后才会逐渐占用硬盘容量的目录。因为/var目录主要针对常态性变动的文件,包括快取(cache)、登录档(log file)以及某些软件运作所产生的文件,包括程序文件(lock file,run file),或者例如mysql数据库的文件等。
第一部分:FHS要求必须存在的目录
/var/cache:应用程序本身运作过程中会产生的一些暂存档。
/var/lib:程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。例如mysql的数据库放置在/var/lib/mysql而rpm的数据库放到/var/lib/rpm。
/var/lock:某些装置或是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该装置,可能产生一些错误。因此需要给该装置上锁,确保该装置只会给单一软件使用。
/var/log:很重要,登录文件放置的目录。里面比较重要的文件如/var/log/messages,/var/log/wtmp(记录登入者信息)等。
/var/mail:放置个人电子邮箱的目录。
/var/run:某些程序或者服务启动后,会将他们的PID放置在这个目录下。与/run相同,这个目录链接到/run了。
/var/spool:通常放置一些队列数据,这些数据被使用过后通常都会被删除。