Linux最优秀的地方之一,就在于它的多用户、多任务环境。而为了让各个用户具有较保密的文件数据,因此文件的权限管理就变得很重要了。Linux一般将文件可存取访问的身份分为 3 个类别,分别是 owner、group、others,且 3 种身份各有 read、write、execute等权限。若管理不当,你的Linux主机将会变得很不舒服!另外,如果第一次接触Linux的话,那么,在Linux下面这么多的目录、文件,到底每个目录、文件代表什么意义呢?下面我们就来一一介绍。
文章目录
用户与用户组
1.文件所有者
初次接触Linux的读者大概会觉得很怪异,怎么“Linux有这么多用户,还分什么用户组,有什么用?”。这个“用户与用户组”的功能可是相当健全而且好用的一个安全防护。怎么说呢?由于Linux是个多用户、多任务的系统,因此可能常常会有多人同时使用这台主机来进行工作的情况发生,为了考虑每个人的隐私权以及每个人喜好的工作环境,因此,这个“文件所有者”的角色就显得相当重要了。
例如当你将你的Email情书转存成文件之后,放在你自己的主文件夹中,你总不希望被其他人看见自己的情书吧?这个时候你就把该文件设置成只有文件所有者才能查看与修改这个文件的内容,那么即使其他人知道你有这个相当“有趣”的文件,不过由于你有设置适当的权限,所以其他人自然也就无法知道该文件的内容。
2.用户组概念
那么用户组呢?为何要配置文件还有所属的用户组?其实用户组最有用的功能之一,就是当你在团队开发资源的时候,举例来说,假设主机上有两个团体,第一个团体名为projecta,里面的成员有class1,class2,class3三个;第二个团体名为projectb,里面的成员有class4, class5,class6。这两个团体之间是有竞争性质的,但却要交纳同一份报告。每组的组员之间必须要能够互相修改对方的数据,但是其他组的组员则不能看到本组自己的文件内容,此时该如何是好?
在Linux下面这样的限制是很简单的,可以进行简单的文件权限设置,就能限制非自己团队(也即是用户组)的其他人不能够阅览内容,而且也可以让自己的团队成员可以修改你所创建的文件。同时,如果你自己还有私人隐密的文件,仍然可以设置成让自己的团队成员也看不到我的文件数据。
另外,如果teacher这个账号是projecta与projectb这两个用户组的老师,他想要同时查看两者的进度,因此需要能够进入这两个用户组的权限时,你可以设置 teacher 这个账号,同时支持projecta与projectb这两个用户组,也就是说:每个账号都可以有多个用户组的支持。
这样说或许你还不容易理解这个用户与用户组的关系吧?没关系,我们可以使用目前“家庭”的观念来进讲解。假设有一家人,家里只有三兄弟,分别是王大毛、王二毛与王三毛3个人,而这个家庭是登记在王大毛的名下的。所以“王大毛家有 3 个人,分别是王大毛、王二毛与王三毛”,而且这3个人都有自己的房间,并且共同拥有一个客厅。
用户的意义:由于王家三人各自拥有自己的房间,所以王二毛虽然可以进入王三毛的房间,但是王二毛不能翻王三毛的抽屉,因为抽屉里面可能有王三毛自己私人的东西,例如情书、日记等,这是“私人的空间”,所以当然不能让王二毛随便动了。
用户组的概念:由于共同拥有客厅,所以王家三兄弟可以在客厅打开电视机、翻阅报纸、坐在沙发上面发呆等。反正只要是在客厅的东西,三兄弟都可以使用,因为大家都是一家人嘛。
这样比喻应该清楚了吧?那个“王大毛家”就是所谓的“用户组”,至于三兄弟就是分别为 3个“用户”,而这3个用户是在同一个用户组里面的。而3个用户虽然在同一用户组内,但是我们可以设置“权限”,好让某些用户个人的信息不被用户组的拥有者查询,以保留“私人的空间”。而设置用户组共享,则可让大家共同分享。
3.其他人的概念
比如有个人叫张小猪,他是张小猪家的人,与王家没有关系。这个时候除非王家认识张小猪,然后开门让张小猪进入王家,否则张小猪永远没有办法进入王家,更不要说进到王三毛的房间了。不过,如果张小猪通过关系认识了王三毛,并且跟王三毛成为好朋友,那么张小猪就可以通过王三毛进入王家。那个张小猪就是所谓的“其他人,Others”。
因此我们就可以知道在Linux里面,任何一个文件都具有“User,Group及Others”3种身份的个别权限,我们可以将上面的说明以下面的图6-1来解释。
我们以王三毛为例,王三毛这个“文件”的所有者为王三毛,他属于王大毛这个用户组,而张小猪相对于王三毛,则只是一个“其他人(others)”而已。
不过这里有个特殊的人物要来介绍,那就是“万能的天神”。这个天神具有无限的神力,所以他可以到达任何他想要去的地方,那个人在 Linux 系统中的身份是“root”,所以要小心。那个root可是“万能的天神”。
无论如何,“用户身份”与该用户所支持的“用户组”概念,在Linux的世界里面是相当重要的,它可以帮助你让你的多任务Linux环境变得更容易管理。更详细的“身份与用户组”设置,我们将在第14章账号管理再进行说明。下面我们将针对文件系统与文件权限来进行说明。
Linux用户身份与用户组记录的文件
在我们的Linux系统当中,默认的情况下所有的系统上的账号与一般身份用户,还有那个root的相关信息,都是记录在/etc/passwd 这个文件内。至于个人的密码则是记录在/etc/shadow这个文件下。此外,Linux所有的组名都记录在/etc/group内。这3个文件可以说是Linux系统里面账号、密码、用户组信息的集中地。不要随便删除这3个文件。
至于更多的与账号用户组有关的设置,还有这3个文件的格式,我们在第14章的账号管理时再详细介绍,所以不要急。
6.2 Linux文件权限概念
大致了解了Linux的用户与用户组之后,接着下来我们要来谈一谈这个文件的权限要如何针对这些所谓的“用户”与“用户组”来设置呢?这个部分是相当重要的,尤其对于初学者来说,因为文件的权限与属性是学习Linux的一个相当重要的关卡,如果没有这部分的概念,那么你可能老是听不懂别人在讲什么。尤其是当你的屏幕前面出现了“Permission deny”的时候,不要担心,肯定是权限设置错误。
6.2.1 Linux 文件属性
既然要让你了解Linux的文件属性,那么有个重要的也是常用的命令就必须要先跟你说。就是“Sls”这一个查看文件的命令。在你以 root 的身份登录 Linux之后,执行“ls –al”看看,会看到下面的内容:
[root@www ~]# ls -al
total 156
drwxr-x— 4 root root 4096 Sep 8 14:06 .
drwxr-xr-x 23 root root 4096 Sep 8 14:21 ..
-rw——- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg
-rw——- 1 root root 199 Sep 8 17:14 .bash_history
-rw-r–r– 1 root root 24 Jan 6 2007 .bash_logout
-rw-r–r– 1 root root 191 Jan 6 2007 .bash_profile
-rw-r–r– 1 root root 176 Jan 6 2007 .bashrc
-rw-r–r– 1 root root 100 Jan 6 2007 .cshrc
drwx—— 3 root root 4096 Sep 5 10:37 .gconf <=范例说明处
drwx—— 2 root root 4096 Sep 5 14:09 .gconfd
-rw-r–r– 1 root root 42304 Sep 4 18:26 install.log <=范例说明处
-rw-r–r– 1 root root 5661 Sep 4 18:25 install.log.syslog
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ]
[ 权限 ][连接][所有者][用户组][文件容量][ 修改日期 ][ 文件名 ]
由于本章后续的chgrp, chown 等命令可能都需要使用root 的身份才能够处理,所以这里建议你以root的身份登录Linux来学习本章。
ls 是“list”的意思,重点在显示文件的文件名与相关属性。而参数“-al”则表示列出所有的文件详细的权限与属性(包含隐藏文件,就是文件名第一个字符为“.”的文件)。如上所示,在你第一次以root身份登录Linux时,如果你输入上述命令后,应该有上列的几个东西,先解释一下上面七列的意思。
第一列代表这个文件的类型与权限(permission)。
这个地方最需要注意了。仔细看的话,你应该可以发现其中共有10个字符。(图6-2及图6-3内的权限并无关系。)
第一个字符代表这个文件是“目录、文件或链接文件等”。
若是[d]则是目录,例如上面文件名为“.gconf”的第11行。
若是[-]则是文件,例如上面文件名为“install.log”第5行。
若是[l]则表示为连接文件(linkfile)。
若是[b]则表示设备文件里面的可供存储的接口设备。
若是[c]则表示设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备)。
接下来的字符中,以3个为一组,且均为“rwx”的3个参数的组合。其中[r]代表可读(read), [w]代表可写(write),[x]代表可执行(execute)。要注意的是,这3个权限的位置不会改变,如果没有权限,就会出现减号[-]而已。
第一组为“文件所有者的权限”,以“install.log”那个文件为例,该文件的所有者可以读写,但不可执行。
第二组为“同用户组的权限”。
第三组为“其他非本用户组的权限”。
若有一个文件的类型与权限数据为“-rwxr-xr–”,请说明其意义。
答:先将整个类型与权限数据分开查阅,并将10个字符整理成为如下所示:
[-][rwx][r-x][r–]
1 234 567 890
1:代表这个文件名为目录或文件,本例中为文件(-);
234:拥有者的权限,本例中为可读、可写、可执行(rwx);
567:同用户组用户权限,本例中为可读可执行(rx);
890:其他用户权限,本例中为可读(r)。
同时注意到rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号(-)就是了。
另外目录与文件的权限意义并不相同,这是因为目录与文件所记录的数据内容不相同所致。由于目录与文件的权限意义非常重要,所以鸟哥将它独立到6.2.3小节的目录与文件的权限意义中再来谈。
第二列表示有多少文件名连接到此节点(i-node)。
每个文件都会将它的权限与属性记录到文件系统的i-node中,不过我们使用的目录树却是使用文件名来记录,因此每个文件名就会连接到一个i-node。这个属性记录的就是有多少不同的文件名连接到相同的一个i-node号码。关于i-node的相关资料我们会在第8章谈到文件系统时再加强介绍的。
第三列表示这个文件(或目录)的“所有者账号”。
第四列表示这个文件的所属用户组。
在Linux系统下,你的账号会附属于一个或多个的用户组中。举刚刚我们提到的例子,class1, class2,class3均属于projecta这个用户组,假设某个文件所属的用户组为projecta,且该文件的权限如图6-3所示(-rwxrwx—),则class1,class2,class3三人对于该文件都具有可读、可写、可执行的权限(看用户组权限)。但如果是不属于projecta的其他账号,对于此文件就不具有任何权限了。
第五列为这个文件的容量大小,默认单位为B。
第六列为这个文件的创建文件日期或者是最近的修改日期。
这一列的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。如下所示:
[root@www ~]# ls -l /etc/termcap /root/install.log
-rw-r–r– 1 root root 807103 Jan 7 2007 /etc/termcap
-rw-r–r– 1 root root 42304 Sep 4 18:26 /root/install.log
# 如上所示,/etc/termcap 为 2007 年所修改过的文件,离现在太远之故;
# 至于 install.log 是今年 (2009) 所创建的,所以就显示完整的时间了。
如果想要显示完整的时间格式,可以使用 ls 的参数,即“ls -l –full-time”,就能够显示出完整的时间格式了,包括年、月、日、时间。另外,如果你当初是以简体中文安装你的 Linux 系统,那么日期字段将会以中文来显示。可惜的是中文并没有办法在纯文本的终端机模式中正确显示,所以此栏会变成乱码。那你就得要使用“LANG= en_US”来修改语言。
如果想要让系统默认的语言变成英文的话,那么你可以修改系统配置文件“/etc/sysconfig/i18n”,利用第5章谈到的nano来修改该文件的内容,使LANG这个变量成为上述的内容即可。
第七列为该文件名。
这个字段就是文件名了。比较特殊的是:如果文件名之前多一个“ . ”,则代表这个文件为“隐藏文件”,例如前面的.gconf 那一行,该文件就是隐藏文件。你可以使用“s”及“ls –a”这两个命令去感受一下什么是隐藏文件。
对于更详细的 ls 用法,还记得怎么查询吗?对啦!使用 man ls 或 info ls 去看看它的基础用法去!。自我进修是很重要的,因为“师傅带进门,修行看个人!”,自古只有天才学生,没有天才老师呦!加油吧!
这七个字段的意义是很重要的。务必清楚知道各个字段代表的意义,尤其是第一个字段的9个权限,那是整个Linux文件权限的重点之一。下面我们来做几个简单的练习,你就会比较清楚。
假设test1,test2,test3同属于testgroup这个用户组,如果有下面的两个文件,请说明两个文
件的所有者与其相关的权限。
-rw-r–r– 1 root root 238 Jun 18 17:22 test.txt
-rwxr-xr– 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai
答:文件 test.txt 的所有者为 root,所属用户组为 root。至于权限方面则只有 root 这个账号可以访问此文件,其他人则仅能读此文件。
另一个文件 ping_tsai 的所有者为 test1,而所属用户组为 testgroup。其中:
test1可以针对此文件具有可读可写可执行的权限;
而同用户组的test2,test3两个人与test1同样是testgroup的用户组账号,则仅可读可执行,但不能写(也即不能修改);
至于非testgoup这一个用户组的人则仅可以读,不能写也不能执行。
如果我的目录为下面的样式,请问testgroup这个用户组的成员与其他人(others)是否可以进入本目录?
drwxr-xr– 1 test1 testgroup 5238 Jun 19 10:25 groups/
答:文件所有者 test1[rwx]可以在本目录中进行任何工作;
而 testgroup 这个用户组[r-x]的账号,例如 test2,test3 也可以进入本目录进行工作,但是不能在本目录下进行写入的操作;
X 至于 other 的权限中[r–]虽然有 r,但是由于没有 x 的权限,因此 others 的用户并不能进入此目录。
Linux文件权限的重要性
与Windows系统不一样的是,在Linux系统当中,每一个文件都多加了很多的属性进来,尤其是用户组的概念,这样有什么用途呢?其实,最大的用途是在“数据安全性”上面的。
系统保护的功能
举个简单的例子,在你的系统中,关于系统服务的文件通常只有 root 才能读写或者是执行,例如/etc/shadow这一个账号管理的文件,由于该文件记录了你系统中所有账号的数据,因此是很重要的一个配置文件,当然不能让任何人读取(否则密码会被窃取),只有root才能够来读取。所以该文件的权限就会成为[-rw——-]。
团队开发软件或数据共享的功能
如果你有一个软件开发团队,在你的团队中,你希望每个人都可以使用某一些目录下的文件,而非你的团队的其他人则不予以开放呢!以上面的例子来说,testgroup的团队共有三个人,分别是 test1,test2,test3,那么我就可以将团队所需的文件权限定为[-rwxrwx—]来提供给testgroup的工作团队使用。
未将权限设置妥当的危害
再举个例子来说,如果你的目录权限没有设置好的话,可能造成其他人都可以在你的系统上面乱来。例如本来只有 root 才能执行的开关机、ADSL 拨号、新增或删除用户等的命令,若被你改成任何人都可以执行的话,那么如果用户不小心给你重新启动、重新拨号。那么你的系统不就会常常莫名其妙挂掉了。而且万一你的用户密码被其他不明人士取得的话,只要他登录你的系统就可以轻而易举地执行一些root的工作。
因此在你修改你的 linux 文件与目录的属性之前,一定要先搞清楚,什么数据是可变的,什么是不可变的。接下来我们来处理一下文件属性与权限的更改。
6.2.2 如何改变文件属性与权限
我们现在知道文件权限对于一个系统的安全重要性了,也知道文件的权限对于用户与用户组的相关性,那么如何修改一个文件的属性与权限呢?又有多少文件的权限我们可以修改呢?其实一个文件的属性与权限有很多。我们先介绍几个常用于用户组、所有者、各种身份的权限的修改的命令,如下所示。
chgrp:改变文件所属用户组。
chown:改变文件所有者。
chmod:改变文件的权限。
改变所属用户组:chgrp
改变一个文件的用户组真是很简单的,直接以chgrp来改变即可,这个命令就是change group的简称。不过,请记得,要被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误。
假设你是以root的身份登录Linux系统的,那么在你的主文件夹内有一个install.log的文件,如何将该文件的用户组改变一下呢?假设你已经知道在/etc/group里面存在一个名为users的用户组,但是testing这个用户组名字就不在/etc/group当中了,此时改变用户组为users与testing分别会有什么现象发生呢?
[root@www ~]# chgrp [-R] dirname/filename …
选项与参数:
-R : 进行递归(recursive)的持续更改,也即连同子目录下的所有文件、目录都更新成为这个用户组之意。常常用在更改某一目录内所有的文件情况。
范例:
[root@www ~]# chgrp users install.log
[root@www ~]# ls -l
-rw-r–r– 1 root users 68495 Jun 25 08:53 install.log
[root@www ~]# chgrp testing install.log
chgrp: invalid group name `testing’ <== 发生错误信息,找不到这个用户组名~
发现了吗?文件的用户组被改成users了,但是要改成testing的时候就会发生错误。要检查错误信息的内容。
改变文件所有者:chown
如何改变一个文件的所有者呢?既然改变用户组是 change group,那么改变所有者就是change owner。那就是 chown 这个命令的用途,要注意的是,用户必须是已经存在于系统中的账号,也就是在/etc/passwd这个文件中有记录的用户名称才能改变。
chown 的用途还挺多的,它还可以顺便直接修改用户组的名称。此外如果要连目录下的所有子目录或文件都同时更改文件所有者的话,直接加上-R的参数即可。我们来看看语法与范例:
[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
参数:
-R : 进行递归(recursive)的持续更改,即连同子目录下的所有文件都更改
范例:将install.log的所有者改为bin这个账号:
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r–r– 1 bin users 68495 Jun 25 08:53 install.log
范例:将install.log的所有者与用户组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r–r– 1 root root 68495 Jun 25 08:53 install.log
事实上chown 也可以使用“chown user.group file”,即在所有者与用户组间加上小数点“.”也行。不过很多朋友设置账号时,喜欢在账号当中加入小数点(例如 vbird.tsai 这样的账号格式),这就会造成系统的误判了。所以我们一般建议使用冒号“:”来隔开所有者与用户组。此外,chown 也能单纯地修改所属用户组呢。例如“chown .sshd install.log”就是修改用户组,就是那个小数点的用途。
知道如何改变文件的用户组与所有者了,那么什么时候要使用chown或chgrp呢?或许你会觉得奇怪吧?确实有时候需要更改文件的所有者的,最常见的例子就是在复制文件给你之外的其他人时,我们使用最简单的cp命令来说明好了:
[root@www ~]# cp 源文件 目标文件
假设你今天要将.bashrc这个文件复制成为.bashrc_test文件名,并且是要给bin这个人,你可以这样做:
[root@www ~]# cp .bashrc .bashrc_test
[root@www ~]# ls -al .bashrc*
-rw-r–r– 1 root root 395 Jul 4 11:45 .bashrc
-rw-r–r– 1 root root 395 Jul 13 11:31 .bashrc_test <==新文件的属性没变
由于复制行为(cp)会复制执行者的属性与权限,.bashrc_test 还是属于 root 所有,如此一来,即使你将文件给予bin这个用户了,那他仍然无法修改的(看属性/权限就知道了吧),所以你就必须要修改这个文件的所有者与用户组。
改变权限:chmod
文件权限的改变使用的是chmod这个命令,但是权限的设置方法有两种,分别可以使用数字或者是符号来进行权限的更改。我们就来谈一谈:
数字类型改变文件权限
Linux文件的基本权限就有9个,分别是owner、group、others三种身份各有自己的read、write、execute权限,先复习一下刚刚上面提到的数据:文件的权限字符为“-rwxrwxrwx”,这 9 个权限是三个三个一组的。其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
r:4
w:2
x:1
每种身份(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,更改权限的命令chmod的语法是这样的:
[root@www ~]# chmod [-R] xyz 文件或目录
参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续更改,即连同子目录下的所有文件都会更改
举例来说,如果要将.bashrc这个文件所有的权限都设置启用,那么就执行:
[root@www ~]# ls -al .bashrc
-rw-r–r– 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
那如果要将权限变成“-rwxr-xr”呢?那么权限的分数就成为[4+2+1][4+0+1] [4+0+0]=754了。所以你需要执行“chmod 754 filename”。另外在实际的系统运作中最常发生的一个问题就是,常常我们以vim编辑一个shell的文字批处理文件后,它的权限通常是“-rw-rw-r—”,也就是664,如果要将该文件变成可执行文件,并且不要让其他人修改此文件的话,那么就需要“-rwxr-xr-x”这样的权限,此时就得要执行“chmod 755 test.sh”命令。
如果有些文件你不希望被其他人看到,那么应该将文件的权限设置为例如“-rwxr—–”,那就执行“chmod 740 filename”。
将刚刚你的.bashrc这个文件的权限修改回“-rw-r–r—”的情况。
答:“-rw-r–r—”的分数是644,所以命令为:
chmod 644 .bashrc
符号类型改变文件权限
还有一个改变权限的方法。从之前的介绍中我们可以发现,基本上就9个权限,分别是user、group、others3种身份。那么我们就可以通过u,g,o来代表3种身份的权限。此外a代表all,也即全部的身份。那么读写的权限就可以写成r,w,x,也就是可以使用表6-1所示的方式来看。
来实践一下。假如我们要设置一个文件的权限成为“-rwxr-xr-x”时,基本上就是:
user(u):具有可读、可写、可执行的权限;
group与others(g/o):具有可读与执行的权限。
所以就是:
[root@www ~]# chmod u=rwx,go=rx .bashrc
# 注意:那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格。
[root@www ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
那么假如是“-rwxr-xr”这样的权限呢?可以使用“ chmod u=rwx,g=rx,o=r filename”来设置。如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限,那么我就可以使用:
[root@www ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod a+w .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
而如果是要将权限去掉而不更改其他属性呢?例如要去掉全部人的可执行权限,则:
[root@www ~]# chmod a-x .bashrc
[root@www ~]# ls -al .bashrc
-rw-rw-rw- 1 root root 395 Jul 4 11:45 .bashrc
知道+、-、=的不同点了吗?在+与-的状态下,只要是没有指定到的选项,则该权限“不会被变动”,例如上面的例子中,由于仅以-去掉 x 则其他两个保持当时的值不变。多练习你就会知道如何改变权限。这在某些情况下面很好用。举例来说,你想要教一个朋友如何让一个程序可以拥有执行的权,但你又不知道该文件原本的权限,此时利用“chmoda+xfilename”就可以让该程序拥有执行的权限了,很方便。
6.2.3 目录与文件的权限意义
现在我们知道了Linux系统内文件的三种身份(所有者、用户组与其他人),知道每种身份都有三种权限(r、w、x),已知道能够使用chown,chgrp,chmod去修改这些权限与属性,当然,利用ls-l去查看文件也没问题。前两小节也谈到了这些文件权限对于数据安全的重要性。那么这些文件权限对于一般文件与目录文件有何不同呢?下面来详细介绍。
权限对文件的重要性
文件是实际含有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件(binary program)等。因此权限对于文件来说,它的意义如下。
r(read):可读取此文件的实际内容,如读取文本文件的文字内容等。
w(write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
x(eXecute):该文件具有可以被系统执行的权限。
那个可读(r)代表读取文件内容是还好了解,那么可执行(x)呢?这里你就必须要小心啦!因为在 Windows 下面一个文件是否具有执行的能力是通过“扩展名”来判断的,例如.exe,.bat,.com等,但是在Linux下面,我们的文件是否能被执行则是由是否具有“x”这个权限来决定,而跟文件名是没有绝对的关系。
至于最后一个w权限呢?当你对一个文件具有w权限时,你可以具有写入、编辑、新增、修改文件的内容的权限,但并不具备删除该文件本身的权限。对于文件的 r、w、x 来说,主要都是针对“文件的内容”而言,与文件名的存在与否没有关系的。因为文件记录的是实际的数据。
权限对目录的重要性
文件是存放实际数据的所在,目录主要的内容是记录文件名列表,文件名与目录有强烈的关联。所以如果是针对目录时,那个r、w、x对目录是什么意义呢?
r(read contents in directory)
表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据,所以你就可以利用ls这个命令将该目录的内容列表显示出来。
w(modify contents of directory)
这个可写入的权限对目录来说是很强大的。因为它表示你具有更改该目录结构列表的权限,也就是下面这些权限:
新建新的文件与目录;
删除已经存在的文件与目录(不论该文件的权限为何);
将已存在的文件或目录进行重命名;
转移该目录内的文件、目录位置。
总之,目录的w权限就与该目录下面的文件名变动有关就对了。
x(access directory)
目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错,目录不可以被执行,目录的 x 代表的是用户能否进入该目录成为工作目录的用途,所谓的工作目录(work directory)就是你目前所在的目录。举例来说,当你登录 Linux时,你所在的主文件夹就是你当下的工作目录。而变换目录的命令是“cd”(change directory)。
大致的目录权限概念是这样,下面我们来看几个范例,让你了解一下啥是目录的权限。
有个目录的权限如下所示:
drwxr–r– 3 root root 4096 Jun 25 08:35 .ssh
系统有个账号名称为vbird,这个账号并没有支持root用户组,请问vbird对这个目录有何权限?是否可切换到此目录中?
答:vbird对此目录仅具有r的权限,因此vbird可以查询此目录下的文件名列表。因为vbird不具有x的权限,所以vbird并不能切换到此目录内。(相当重要的概念!)
上面这个例题中因为vbird具有r的权限,因为r一看之下好像就具有可以进入此目录的权限,其实那是错的。能不能进入某一个目录,只与该目录的 x 权限有关。此外,工作目录对于命令的执行是非常重要的,如果你在某目录下不具有x的权限,那么你就无法切换到该目录下,也就无法执行该目录下的任何命令,即使你具有该目录的r权限。
很多朋友在架设网站的时候都会卡在一些权限的设置上,他们开放目录数据给因特网的任何人来浏览,却只开放r的权限,如上面的范例所示那样,那样的结果就是导致网站服务器软件无法到该目录下读取文件(最多只能看到文件名),最终用户总是无法正确查阅到文件的内容(显示权限不足)。要注意:要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给。为什么w不能随便给?我们来看下一个例子:
假设有个账号名称为dmtsai,他的主文件夹在/home/dmtsai/,dmtsai对此目录具有[rwx]的权限。若在此目录下有个名为the_root.data的文件,该文件的权限如下:
-rwx—— 1 root root 4365 Sep 19 23:20 the_root.data
请问dmtsai对此文件的权限是什么?可否删除此文件?
答:如上所示,由于dmtsai对此文件来说是“others”的身份,因此这个文件他无法读、无法编辑也无法执行,也就是说他无法变动这个文件的内容。
但是由于这个文件在他的主文件夹下,他在此目录下具有rwx的完整权限,因此对于the_root.data这个“文件名”来说,他是能够“删除”的。结论就是,dmtsai这个用户能够删除the_root.data这个文件。
我们下面就来设计一个练习,让你实际练习下。不过由于很多命令我们还没有教,所以下面的命令有的先了解即可,详细的命令用法我们会在后面继续介绍的。
先用root的身份新建所需要的文件与目录环境
我们用root的身份在所有人都可以工作的/tmp目录中新建一个名为testing的目录,该目录的权限为744且目录拥有者为root。另外,在testing目录下再新建一个空的文件,文件名也为 testing。新建目录可用 mkdir(make directory),新建空文件可用 touch(下一章会说明)来处理。所以过程如下所示:
[root@www ~]# cd /tmp <==切换工作目录到/tmp
[root@www tmp]# mkdir testing <==新建新目录
[root@www tmp]# chmod 744 testing <==更改权限
[root@www tmp]# touch testing/testing <==新建空的文件
[root@www tmp]# chmod 600 testing/testing <==更改权限
[root@www tmp]# ls -ald testing testing/testing
drwxr–r– 2 root root 4096 Sep 19 16:01 testing
-rw——- 1 root root 0 Sep 19 16:01 testing/testing
# 仔细看一下,目录的权限是 744 ,且所属用户组与用户均是 root 。
# 那么在这样的情况下面,一般身份用户对这个目录/文件的权限是什么?
一般用户的读写权限是什么?
在上面的例子中,虽然目录是 744 的权限设置,一般用户应该能有 r 的权限,但这样的权限用户能做啥事呢?假设系统中含有一个账号名为 vbird 的,我们可以通过“ su – vbird ”这个命令来切换身份。看看下面的操作先。
[root@www tmp]# su – vbird <==切换身份成为 vbird!
[vbird@www ~]$ cd /tmp <==看一下,身份变了喔!提示符也变成 $ 了!
[vbird@www tmp]$ ls -l testing/
?——— ? ? ? ? ? testing
# 因为具有 r 的权限可以查询文件名。不过权限不足(没有x),所以会有一堆问号。
[vbird@www tmp]$ cd testing/
-bash: cd: testing/: Permission denied
# 因为不具有 x ,所以当然没有进入的权限。有没有呼应前面的权限说明啊?
如果该目录属于用户本身,会有什么状况
上面的练习我们知道了只有r确实可以让用户读取目录的文件名列表,不过详细的信息却还是读不到的,同时也不能将该目录变成工作目录(用 cd 进入该目录)。那如果我们让该目录变成用户的,那么用户在这个目录下面是否能够删除文件呢?下面的练习做做看。
[vbird@www tmp]$ exit <==让 vbird 切换回原本的 root 身份喔!
[root@www tmp]# chown vbird testing <==修改权限,让vbird拥有此目录
[root@www tmp]# su – vbird <==再次变成vbird来操作
[vbird@www ~]$ cd /tmp/testing <==可以进入目录了呢!
[vbird@www testing]$ ls -l
-rw——- 1 root root 0 Sep 19 16:01 testing <==文件不是vbird的!
[vbird@www testing]$ rm testing <==尝试删掉这个文件看看!
rm: remove write-protected regular empty file `testing’? y
# 竟然可以删除,这样理解了吗?
通过上面这个简单的步骤,你就可以清楚地知道,x在目录当中是与“能否进入该目录”有关,至于那个 w 则具有相当重要的权限,因为它可以让用户删除、更新、新建文件或目录,是个很重要的参数。
6.2.4 Linux 文件种类与扩展名
我们在基础篇一直强调一个概念,那就是:任何设备在Linux下面都是文件,不仅如此,连数据通信的接口也有专门的文件负责。所以,你会了解到,Linux 的文件种类真的很多,除了前面提到的一般文件(-)与目录文件(d)之外,还有哪些种类的文件呢?
文件种类
我们在刚刚提到使用“ls-l”查看到第一列那 10 个字符中,第一个字符为文件的类型。除了常见的一般文件(-)与目录文件(d)之外,还有哪些种类的文件类型呢?
普通文件(regular file)
就是一般我们在进行访问类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为[-],例如[-rwxrwxrwx]。另外,依照文件的内容,又大略可以分为:
纯文本文件(ASCII):这是 Linux 系统中最多的一种文件类型,称为纯文本文件是因为内容为我们可以直接读到的数据,例如数字、字母等。几乎只要我们可以用来作为设置的文件都属于这一种文件类型。举例来说,你可以执行“cat~/.bashrc”就可以看到该文件的内容。(cat是将一个文件内容读出来的命令。)
二进制文件(binary):还记得我们在第 0 章计算机概论里面的软件程序的运行中提过,我们的系统其实仅认识且可以执行二进制文件(binary file)。你的Linux当中的可执行文件(scripts、文字批处理文件不算)就是这种格式的。举例来说,刚刚执行的命令cat就是一个binary file。
数据格式文件(data):有些程序在运行的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件(data file)。举例来说,我们的 Linux在用户登录时,都会将登录的数据记录在/var/log/wtmp 那个文件内,该文件是一个 data file,它能够通过 last 这个命令读出来。但是使用cat时,会读出乱码,因为它属于一种特殊格式的文件。
目录(directory)
第一个属性为[d],例如[drwxrwxrwx]。
连接文件(link):
就是类似Windows系统下面的快捷方式,第一个属性为[l](英文L的小写),例如[lrwxrwxrwx]。
设备与设备文件(device)
与系统外设及存储等相关的一些文件,通常都集中在/dev这个目录。通常又分为两种:
块(block)设备文件:就是一些存储数据,以提供系统随机访问的接口设备,例如硬盘、软盘等。你可以随机地在硬盘的不同块读写,这种设备就是成组设备,你可以自行查一下/dev/sda看看,会发现第一个属性为[b]。
字符(character)设备文件:也即是一些串行端口的接口设备,例如键盘、鼠标等。这些设备的特征就是“一次性读取”的,不能够截断输出。举例来说,你不可能让鼠标“跳到”另一个界面,而是“滑动”到另一个地方。其第一个属性为[c]。
套接字(sockets)
既然被称为数据接口文件,这种类型的文件通常被用在网络上的数据连接。我们可以启动一个程序来监听客户端的请求,而客户端就可以通过这个socket来进行数据的通信了。其第一个属性为[s],通常在/var/run这个目录中可看到这种文件类型了。
管道(FIFO,pipe)
FIFO也是一种特殊的文件类型,它主要的目的在解决多个程序同时访问一个文件所造成的错误问题。FIFO是first-in-first-out的缩写。第一个属性为[p]。
除了设备文件是我们系统中很重要的文件,最好不要随意修改之外(通常它也不会让你修改的),另一个比较有趣的文件就是连接文件。如果你常常将应用程序放到桌面来的话,你就应该知道在Windows下面有所谓的“快捷方式”。同样,你可以将linux下的连接文件简单地视为一个文件或目录的快捷方式。至于socket与FIFO文件比较难理解,因为这两个东西与进程(process)比较有关系,这个等到将来你了解process之后再回来查阅。此外你也可以通过 man fifo 及man socket 来查阅系统上的说明。
Linux文件扩展名
基本上Linux的文件是没有所谓的“扩展名”,我们刚刚就谈过,一个Linux文件能不能被执行,与它的第一列的 10 个属性有关,与文件名根本一点关系也没有。这个观念跟 Windows的情况不相同。在Windows下面,能被执行的文件扩展名通常是.com、.exe、.bat等,而在Linux 下面,只要你的权限当中具有x的话,例如[ -rwx-r-xr-x ]即代表这个文件可以被执行。
不过可以被执行跟可以执行成功是不一样的。举例来说,在root主文件夹下的install.log是一个纯文本文件,如果经由修改权限成为-rwxrwxrwx后,这个文件能够真的执行成功吗?当然不行,因为它的内容根本就没有可以执行的数据。所以说这个 x 代表这个文件具有可执行的能力,但是能不能执行成功,当然就得要看该文件的内容。
虽然如此,不过我们仍然希望可以由扩展名来了解该文件是什么东西,所以通常我们还是会以适当的扩展名来表示该文件是什么种类的。下面有数种常用的扩展名:
*.sh:脚本或批处理文件(scripts),因为批处理文件为使用shell写成的,所以扩展名就编成.sh。
*Z、*.tar、*.tar.gz、*.zip、*.tgz:经过打包的压缩文件。这是因为压缩软件分别为gunzip、tar 等的,由于不同的压缩软件,而取其相关的扩展名。
*.html、*.php:网页相关文件,分别代表HTML语法与PHP语法的网页文件。.html的文件可使用网页浏览器来直接开启,至于.php的文件,则可以通过客户端的浏览器来服务端浏览,以得到运算后的网页结果。
基本上Linux系统上的文件名真的只是让你了解该文件可能的用途而已,真正的执行与否仍然需要权限的规范才行。例如虽然有一个文件为可执行文件,如常见的/bin/ls这个显示文件属性的命令,不过如果这个文件的权限被修改成无法执行时,那么ls就变成不能执行了。
上述的这种问题最常发生在文件传送的过程中。例如你在网络上下载一个可执行文件,但是偏偏在你的Linux系统中就是无法执行。那么就是可能文件的属性被改变了。不要怀疑,从网络上传送到你的Linux系统中,文件的属性与权限确实是会被改变的。
Linux文件长度限制
在Linux下面,使用默认的Ext2/Ext3文件系统时,针对文件的文件名长度限制为:
单一文件或目录的最大容许文件名为255个字符;
包含完整路径名称及目录(/)的完整文件名为4096个字符。
我们希望 Linux 的文件名可以一看就知道该文件在做什么的,所以文件名通常是很长。而用惯了Windows的人可能会受不了,因为文件名通常真的都很长,对于用惯Windows而导致打字速度不快的朋友来说,真的是很困扰。不过,只得劝你好好加强打字的训练了。
而由第5章谈到的热键你也会知道,其实可以通过[Tab]按键来确认文件的文件名。如果你已经读完了本书第三篇关于 bash 的用法,那么你将会发现“变量真是一个相当好用的东西”!具体的到第三篇谈到bash再详细说明。
Linux文件名的限制
由于Linux在文字界面下的一些命令操作关系,一般来说,你在设置Linux下面的文件名时,最好可以避免一些特殊字符。例如下面这些:
* ? > < ; & ! [ ] | \ ‘ ” ` ( ) { }
因为这些符号在命令行界面下是有特殊含义的。文件名的开头为小数点“.”时,代表这个文件为“隐藏文件”。同时由于命令执行当中,常常会使用到 -option 之类的参数,所以你最好也避免将文件名的开头以 − 或 + 来命名。
6.3 Linux目录配置
在了解了每个文件的相关种类与属性,以及了解了如何更改文件属性/权限的相关信息后,再来要了解的就是,为什么每套 Linux distributions 版本的配置文件、执行文件、每个目录内放置的内容其实都差不多?原来是有一套标准依据的。我们下面就来介绍这方面的内容。
6.3.1 Linux目录配置标准:FHS
因为利用Linux来开发产品或distributions的团队/公司与个人实在太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰。你能想象,你进入一个企业之后,所接触到的Linux目录配置方法竟然跟你以前学的完全不同吗?很难想象吧。所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准的出炉了。
根据 FHS(http://www.pathname.com/fhs/)的官方文件指出,其主要目的是希望让用户可以了解到已安装软件通常放置于那个目录下,所以其希望独立的软件开发商、操作系统制作者以及想要维护系统的用户,都能够遵循FHS的标准。也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。
事实上,FHS是根据过去的经验一直在持续改版的,FHS依据文件系统使用的频繁与否与是否允许用户随意改动,而将目录定义成为四种交互作用的形态,用表6-2来说明如下。
上表中的目录就是一些代表性的目录,该目录下面所放置的数据在下面会谈到,这里先略过不谈。我们要了解的是,什么是那四个类型?
可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录。
不可分享的:自己机器上面运行的设备文件或者是与程序有关的socket文件等,由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
不变的:有些数据是不会经常变动的,跟随着distribution而不变动。例如函数库、文件说明文件、系统管理员所管理的主机服务配置文件等。
可变动的:经常改变的数据,例如登录文件、新闻组等。
事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:
/(root,根目录):与开机系统有关;
/usr(UNIX software resource):与软件安装/执行有关;
/var (variable):与系统运作过程有关。
为什么要定义出这三层目录呢?其实是有意义的。每层目录下面所应该放置的目录也都又特定的规定。由于我们尚未介绍完整的Linux系统,所以下面的介绍你可能会看不懂。没关系,先有个概念即可,等到你将基础篇全部看完后,再从头将基础篇再看一遍,到时候你就会豁然开朗。
这个 root 在 Linux 里面的意义真的很多很多,多到让人搞不懂那是啥玩意儿。如果以“账号”的角度来看,所谓的 root 指的是“系统管理员”的身份,如果以“目录”的角度来看,所谓的 root 意即指的是根目录,就是 / 。
根目录(/)的意义与内容
根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机、还原、系统修复等操作有关。由于系统开机时需要特定的开机软件、内核文件、开机所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。因为根目录是这么重要,所以在FHS的要求方面,其希望根目录不要放在非常大的分区内,因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。
因此FHS标准建议:根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较好,根目录所在的文件系统也较不容易发生问题。
有鉴于上述的说明,因此 FHS 定义出根目录(/)下面应该要有下面这些子目录的存在才好,如表6-3所示。
除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载,其他分区则是在开机完成之后才会持续进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录就不能够与根目录放到不同的分区去。那底哪些目录不可与根目录分开呢?有下面这些:
/etc:配置文件
/bin:重要执行文件
/dev:所需要的设备文件
/lib:执行文件所需的函数库与内核所需的模块
/sbin:重要的系统执行文件
这五个目录千万不可与根目录分开放在不同的分区。谈完了根目录,接下来我们就来谈谈/usr以及/var,先看/usr里面有些什么东西:
/usr的意义与内容
依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable,static),如果你知道如何通过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网内的其他主机来使用。
很多读者都会误会/usr 为 user 的缩写,其实 usr 是 UNIX Software Resource 的缩写,也就是“UNIX 操作系统软件资源”所放置的目录,而不是用户的数据。这点要注意。FHS 建议所有软件开发者应该将他们的数据合理地分别放置到这个目录下的子目录,而不要自行新建该软件自己独立的目录。
因为是所有系统默认的软件(distribution 发布者提供的软件)都会放置到/usr 下面,因此这个目录有点类似 Windows 系统的“C:\Windows\”和“C:\Program files\”这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr的子目录建议有表6-5所示的这些:
/var的意义与内容
如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。因为/var目录主要针对常态性变动的文件,包括缓存(cache)、登录文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file,run file),或者例如 MySQL数据库的文件等。常见的子目录如表6-6所示。
建议在你读完整个基础篇之后,可以挑战FHS官方英文文件(参考本章参考数据),相信会让你对于Linux操作系统的目录有更深入的了解。
针对FHS,各家distributions的异同
由于FHS仅是定义出最上层(/)及子层(/usr,/var)的目录内容应该要放置的文件或目录数据,因此,在其他子目录层级内,就可以随开发者自行来配置了。举例来说,CentOS的网络设置数据放在/etc/sysconfig/network-scripts/目录下,但是 SuSE 则是将网络放置在/etc/sysconfig/network/目录下,目录名称可是不同的。不过只要记住大致的FHS标准,差异性是有限的。
6.3.2 目录树(directory tree)
另外在Linux下面,所有的文件与目录都是由根目录开始的。那是所有目录与文件的源头。然后再一个一个分支下来,有点像是树枝状。因此我们也称这种目录配置方式为“目录树(directorytree)”。这个目录树有什么特性呢?它主要的特性有:
目录树的起始点为根目录(/,root);
每一个目录不只能使用本地端的文件系统,也可以使用网络上的文件系统。举例来说,可以利用Network File System(NFS)服务器挂载某特定目录等。
每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
好,谈完了FHS的标准之后,实际来看看CentOS在根目录下面会有什么样的数据。我们可以执行以下的命令来查询:
[root@www ~]# ls -l /
drwxr-xr-x 2 root root 4096 Sep 5 12:34 bin
drwxr-xr-x 4 root root 1024 Sep 4 18:06 boot
drwxr-xr-x 12 root root 4320 Sep 22 12:10 dev
drwxr-xr-x 105 root root 12288 Sep 22 12:10 etc
drwxr-xr-x 4 root root 4096 Sep 5 14:08 home
drwxr-xr-x 14 root root 4096 Sep 5 12:12 lib
drwx—— 2 root root 16384 Sep 5 01:49 lost+found
drwxr-xr-x 2 root root 4096 Mar 30 2007 media
drwxr-xr-x 2 root root 0 Sep 22 12:09 misc
drwxr-xr-x 2 root root 4096 Mar 30 2007 mnt
drwxr-xr-x 2 root root 0 Sep 22 12:09 net
drwxr-xr-x 2 root root 4096 Mar 30 2007 opt
dr-xr-xr-x 95 root root 0 Sep 22 2008 proc
drwxr-x— 4 root root 4096 Sep 8 14:06 root
drwxr-xr-x 2 root root 12288 Sep 5 12:33 sbin
drwxr-xr-x 4 root root 0 Sep 22 2008 selinux
drwxr-xr-x 2 root root 4096 Mar 30 2007 srv
drwxr-xr-x 11 root root 0 Sep 22 2008 sys
drwxrwxrwt 6 root root 4096 Sep 22 12:10 tmp
drwxr-xr-x 14 root root 4096 Sep 4 18:00 usr
drwxr-xr-x 26 root root 4096 Sep 4 18:19 var
上面比较特殊的应该是/selinux 这个目录了,这个目录的内容数据也是在内存中的信息,同样不会占用任何的硬盘容量。这个/selinux 是Secure Enhance Linux(SELinux)的执行目录,而 SELinux是Linux内核的重要外挂功能之一,它可以用来作为具体权限的管理,主要针对程序(尤其是网络程序)的访问权限来限制。关于SELinux我们会在后续的章节继续做介绍的。如果我们将整个目录树以图示的方法来显示,并且将较为重要的文件数据列出来的话,那么目录树架构如图6-4所示。
这里只有就各目录进行简单的解释,看看就好,详细的解释请回到刚刚说明的表格中去查阅。看完了FHS标准之后,现在回到第3章里面去看看安装前Linux规划的分区情况,对于当初为何需要分区为这样的情况有点想法了吗?。根据FHS的定义,你最好能够将/var独立出来,这样对于系统的数据还有一些安全性的保护。因为至少/var 死掉时,你的根目录还会活着,还能够进入救援模式。
6.3.3 绝对路径与相对路径
除了需要特别注意的 FHS 目录配置外,在文件名部分我们也要特别注意。因为根据文件名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative)。这两种文件名/路径的写法依据是这样的:
绝对路径:由根目录(/)开始写起的文件名或目录名称,例如 /home/dmtsai/.bashrc。
相对路径:相对于目前路径的文件名写法。例如 ./home/dmtsai 或 ../../home/dmtsai/等。反正开头不是/就属于相对路径的写法。
而你必须要了解,相对路径是以“你当前所在路径的相对位置”来表示的。举例来说,你目前在/home这个目录下,如果想要进入/var/log这个目录时,可以怎么写呢?
1.cd/var/log(absolute)
2.cd../var/log(relative)
因为你在/home 下面,所以要回到上一层(../)之后,才能继续往/var 来移动的!特别注意这两个特殊的目录:
.:代表当前的目录,也可以使用./来表示;
..:代表上一层目录,也可以../来表示。
这个“.”与“..”目录概念是很重要的,你常常会看到cd..或./command之类的命令执行方式,就是代表上一层与目前所在目录的工作状态。
如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?
答:由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中,因此最简单的命令执行方法为:
1.cd/var/spool/mail
2.cd../cron
如此就不需要再由根目录开始写起了。这个相对路径是非常有帮助的,尤其对于某些软件开发商来说。一般来说,软件开发商会将数据放置到/usr/local/里面的各相对目录,你可以参考图 6-4 的相对位置。但如果用户想要安装到不同目录呢?就得要使用相对路径。
网络文件常常提到类似“./run.sh”的数据,这个命令的意义是什么?
答:由于命令的执行需要变量(bash章节才会提到)的支持,若你的执行文件放置在本目录,并且本目录并非正规的执行文件目录(/bin、/usr/bin 等为正规),此时要执行命令就得要严格指定该执行文件。“./”代表“本目录”的意思,所以“./run.sh”代表执行本目录下名为 run.sh 的文件。
6.3.4 CentOS 的查看
某些时刻你可能想要知道你的 distribution 使用的是那个 Linux 标准(Linux Standard Base),而且我们也知道distribution使用的都是Linux的内核!那你如何查看这些基本的信息呢?可以使用如下的命令来查看:
[root@www ~]# uname –r
2.6.18 -128.el5<==可以查看实际的内核版本
[root@www ~]# lsb_release -a
LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:
graphics-3.1-ia32:graphics-3.1-noarch <==LSB 的版本
Distributor ID: CentOS
Description: CentOS release 5.3 (Final) <==distribution 的版本
Release: 5.3
Codename: Final
6.4 重点回顾
Linux的每个文件中,依据权限分为用户、用户组与其他人三种身份。
用户组最有用的功能之一,就是当你在团队开发资源的时候,且每个账号都可以有多个用户组的支持。
利用 ls -l 显示的文件属性中,第一个字段是文件的权限,共有 10 位,第一位是文件类型,接下来三个为一组共三组,为用户、用户组、其他人的权限,权限有r,w,x三种。
如果文件名之前多一个“ . ”,则代表这个文件为“隐藏文件”。
更改文件的用户组支持可用chgrp,修改文件的所有者可用chown,修改文件的权限可用chmod。
chmod修改权限的方法有两种,分别是符号法与数字法,数字法中r,w,x的分数为4,2,1。
对文件来讲,权限的效能为:
r:可读取此文件的实际内容,如读取文本文件的文字内容等。
w:可以编辑、新增或者是修改该文件的内容(但不含删除该文件)。
x:该文件具有可以被系统执行的权限。
对目录来说,权限的属能为:
r(read contents in directory)
w(modify contents of directory)
x(access directory)
要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给予。
Linux文件名的限制为:单一文件或目录的最大容许文件名为255个字符;包含完整路径名称及目录(/)的完整文件名为4096个字符。
根据 FHS 的官方文件指出,其主要目的是希望让用户可以了解到已安装软件通常放置于哪个目录下。
FHS制定出来的四种目录特色为shareable,unshareable,static,variable。
FHS所定义的三层主目录为/、/var、/usr。
有五个目录不可与根目录放在不同的分区,分别为/etc、/bin、/lib、/dev、/sbin五个。
6.5 本章练习
请说明/bin与/usr/bin目录所放置的执行文件有何不同之处。
请说明/bin与/sbin目录所放置的执行文件有何不同之处。
哪几个目录不能够与根目录(/)放置到不同的分区中?并请说明该目录所放置的数据是什么。
试说明为何根目录要小一点比较好。另外在分区时,为什么/home、/usr、/var、/tmp最好与根目录放到不同的分区?试说明可能的原因为何(由目录放置数据的内容谈起)。
早期的UNIX系统文件名最多允许14个字符,而新的UNIX与Linux系统中,文件名最多可以容许几个字符?
当一个文件权限为-rwxrwxrwx,则表示这个文件的意义是什么?
我需要将一个文件的权限改为-rwxr-xr–,请问该如何执行命令?
若我需要更改一个文件的所有者与用户组,该用什么命令?
请问下面的目录主要放置什么数据?
/etc/、/etc/initd、/boot、/usr/bin、/bin、/usr/sbin、/sbin、/dev、/var/log。
若一个文件的文件名开头为“.”,例如.bashrc这个文件,代表什么?另外如何显示出这个文件名与它的相关属性?
6.6 参考数据与扩展阅读
FHS的标准官方文件:http://proton.pathname.com/fhs/,是非常值得参考的文献!
关于Journaling(日志式)文章的相关说明:
http://www.linuxplanet.com/linuxplanet/reports/3726/1/