Linux文件权限与目录配置
1. 使用者与群组
由于Linux是个多人多任务的系统,因此可能常常会有多人同时使用这部主机来进行工作的情况发生, 为了考虑每个人的隐私权以及每个人喜好的工作环境,因此,有了使用者(也叫文件拥有者)和群组概念。
在Linux里面,任何一个文件都具有『User(文件拥有者), Group(群组)及Others(其他人)』三种身份的个别权限。
用户身份与群组记录的文件:
Linux系统当中,默认的情况下,所有的系统上的账号与一般身份使用者,还有那个root的相关信息, 都是记录在/etc/passwd这个文件内的。至于个人的密码则是记录在/etc/shadow这个文件下。 此外,Linux所有的组名都纪录在/etc/group内!这三个文件可以说是Linux系统里面账号、密码、群组信息的集中地
文件权限概念
第一栏代表这个文件的类型与权限:
第一个字符代表这个文件是『目录、文件或链接文件等等』:
当为[ d ]则是目录,例如上表档名为『.gconf』的那一行;
当为[ - ]则是文件,例如上表档名为『install.log』那一行;
若是[ l ]则表示为连结档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
第一组为『文件拥有者的权限』,以『install.log』那个文件为例, 该文件的拥有者可以读写,但不可执行;
第二组为『同群组的权限』;
第三组为『其他非本群组的权限』。
第二栏表示有多少档名连结到此节点(i-node):
每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录, 因此每个档名就会连结到一个i-node。这个属性记录的,就是有多少不同的档名连结到相同的一个i-node号码
第三栏表示这个文件(或目录)的『拥有者账号』;
第四栏表示这个文件的所属群组;
第五栏为这个文件的容量大小,默认单位为bytes;
第六栏为这个文件的建档日期或者是最近的修改日期;
第七栏为这个文件的文档名:
这个字段就是档名了。比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏档』,例如上表中的.gconf那一行,该文件就是隐藏档
如何改变文件属性与权限
chgrp :改变文件所属群组
chown :改变文件拥有者
chmod :改变文件的权限, SUID, SGID, SBIT等等的特性
- 改变所属群组, chgrp
命令:chgrp [-R] dirname/filename
-R:进行递归的持续变。
chgrp命令用来改变所属群组,但是被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误!
- 改变文件拥有者, chown
命令:chown [-R] 账号名称 文件或目录
-R:进行递归的持续变。
chown命令用来改变文件拥有者,但是用户必须是已经存在系统中的账号,也就是在/etc/passwd 这个文件中有纪录的用户名称才能改变
- 改变权限, chmod
权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。
1,数字类型改变文件权限
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限, 先复习一下刚刚上面提到的数据:文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
1 | r:4 |
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx—] 分数则是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= — = 0+0+0 = 0
所以等一下我们设定权限的变更时,该文件的权限数字就是770
2,符号类型改变文件权限
从之前的介绍中我们可以发现,基本上就九个权限分别是(1)user (2)group (3)others三种身份!那么我们就可用由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x!也就是可以使用底下的方式来看:
假如我们要『设定』一个文件的权限成为『-rwxr-xr-x』时,基本上就是:
user (u):具有可读、可写、可执行的权限;
group 与 others (g/o):具有可读与执行的权限。
如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限, 那么我就可以使用:
如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
Linux文件种类与扩展名
强调一个概念,那就是:任何装置在Linux底下都是文件
文件种类:
- 正规文件(regular file ):
就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:
纯文本档(ASCII):这是Linux系统中最多的一种文件类型啰, 称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这一种文件类型。 举例来说,你可以下达『 cat ~/.bashrc 』就可以看到该文件的内容。 (cat 是将一个文件内容读出来的指令)
二进制文件(binary):还记得我们在『 第零章、计算器概论 』里面的软件程序的运作中提过, 我们的系统其实仅认识且可以执行二进制文件(binary file)吧?没错~ 你的Linux当中的可执行文件(scripts, 文字型批处理文件不算)就是这种格式的啦~ 举例来说,刚刚下达的指令cat就是一个binary file。
数据格式文件(data): 有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的Linux在使用者登入时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件。
- 目录(directory):
第一个属性为 [ d ],例如 [drwxrwxrwx]。 - 连结档(link):
类似Windows系统底下的快捷方式。 第一个属性为 l ,例如 [lrwxrwxrwx] ; - 设备与装置文件(device):
与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种:
区块(block)设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备啰!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]!
字符(character)设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出。 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [ c ]。
数据接口文件(sockets):
既然被称为数据接口文件, 想当然尔,这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/var/run这个目录中看到这种文件类型了。数据输送文件(FIFO, pipe):
FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO是first-in-first-out的缩写。第一个属性为[p] 。
Linux文件长度限制:
在Linux底下,使用预设的Ext2/Ext3文件系统时,针对文件的档名长度限制为:
单一文件或目录的最大容许文件名为 255 个字符;
包含完整路径名称及目录 (/) 之完整档名为 4096 个字符。
Linux文件名的限制:
由于Linux在文字接口下的一些指令操作关系,一般来说,你在设定Linux底下的文件名时, 最好可以避免一些特殊字符比较好!例如底下这些:
1 | * ? > < ; & ! [ ] | \ ' " ` ( ) { } |
因为这些符号在文字接口下,是有特殊意义的!另外,文件名的开头为小数点『.』时, 代表这个文件为『隐藏档』喔!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以你最好也避免将文件档名的开头以 - 或 + 来命名!
linux目录配置
因为linux版本过多,不同版本目录名称配置不同,过于混乱,
所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准。
FHS针对目录树架构仅定义出三层目录底下应该放置什么数据,分别是:
/ (root, 根目录):与开机系统有关;
/usr (unix software resource):与软件安装/执行有关;
/var (variable):与系统运作过程有关。
根目录 (/) 的意义与内容:
根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的, 同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、 函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分割槽内, 因为越大的分割槽妳会放入越多的数据,如此一来根目录所在分割槽就可能会有较多发生错误的机会。
因此FHS标准建议:根目录(/)所在分割槽应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分割槽内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。
有鉴于上述的说明,因此FHS定义出根目录(/)底下应该要有底下这些次目录的存在才好:
以上就是FHS针对根目录定义的标准,除此之外还有一些重要目录:
注意:
/etc:配置文件
/bin:重要执行档
/dev:所需要的装置文件
/lib:执行档所需的函式库与核心所需的模块
/sbin:重要的系统执行文件
这五个目录是开机启动就会被挂载的目录,不可与根目录分开
/usr 的意义与内容:
usr是Unix Software Resource的缩写, 也就是『Unix操作系统软件资源』所放置的目录。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。
一般来说,/usr的次目录建议有底下这些:
/var 的意义与内容:
如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var目录主要针对常态性变动的文件,包括缓存(cache)、登录档(log file)以及某些软件运作所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等等。常见的次目录有: