Linux的文件权限与目录配置(From:鸟哥的Linux私房菜)
Linux的文件权限与目录配置
**Linux最优秀的地方之一,就在于它的多用户、多任务环境。为了让用户有较保密的文件数据,文件的权限管理很重要。
**Linux一般将文件可存取访问的身份分为3个类别,分别是owner、group、others,且3种身份各有read、write、execute等权限。
Linux文件属性
**ls是list的意思。
1[-rw--r--] 2[1] 3[root] 4[root] 5[42304] 6[Sep 4 18:26] 7[install.log]
**第一列代表这个文件的类型与权限(permission)
++第一个字符代表这个文件的文件类型(目录、文件或链接文件)等等:
--当为[ d ]则是目录
--当为[ - ]则是文件
--当为[ l ]则是连接文件
--当为[ b ]则表示为设备文件里面的可供储存的接口设备(硬盘)
--当为[ c ]则表示为设备文件里面的串行端口设备(鼠标、键盘)
++[ r ]代表可读(read)
++[w]代表可写(write)
++[ x ]代表可执行(execute)
++这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]。
++第一组为文件拥有者的权限
++第二组为同群组的权限
++第三组为其他非本群组的权限。
**第二栏表示有多少文件名连结到此节点
**第三栏表示这个文件(或目录)的拥有者账号
**第四栏表示这个文件的所在的组
++在Linux系统下,账号会附属于一个或多个的群组中
**第五栏为这个文件的大小,默认单位为bytes
**第六栏为这个文件的文件创建的日期或者是最近的修改日期
**第七栏为文件名或目录名
++如果档名之前多一个 . ,则代表这个文件为隐藏文件
改变文件属性与权限
**chgrp:改变文件所属用户组
注意:要被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误。
[root@www ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录
都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
**chown:改变文件所有者。Chown也可顺便直接修改用户组的名称。如果连目录下的所有子目录或文件都同时更改文件所有者的话,直接加上-R参数即可。
[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
**chmod:改变文件的权限。两种设置方法,分别是可以使用数字或者是符号来进行权限修改。
++数字类型改变文件权限:
[root@www ~]# chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
++符号类型改变文件权限:
chmod | u | +(加入) | r | 文件或目录 |
--u:代表文件拥有者
--g:代表该用户所在的其他组员
--o:代表其他用户,a代表所有的身份
[root@www ~]# chmod u=rwx,go=rx .bashrc
# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格!
[root@www ~]# chmod a+w .bashrc
[root@www ~]# chmod a-x .bashrc
目录与文件的权限意义
**文件的权限
++r (read):可读取此文件的实际内容,如读取文本文件的文字内容等
++w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件)
++x (execute):该文件具有可以被系统执行的权限
++文件是否能被执行是由是否具有x这个权限来决定的,跟文件名是没有绝对的关系
++对一个文件具有w权限时,可以具有写入/编辑/新增/修改文件的内容的权限,但并不具备有删除该文件本身的权限!
++对于文件的rwx来说, 主要都是针对文件的内容而言,与文件名的存在与否没有关系,因为文件记录的是实际的数据
**目录的权限
++目录主要内容为记录文件名列表,文件名与目录有强烈的关连
++r (read contents in directory):表示具有读取目录结构列表的权限,具有r权限时,表示可以查询目录下的文件名数据。 可以利用 ls 这个指令将该目录的内容列表显示出来
++w (modify contents of directory):这个权限对目录来说是很强大的。它表示具有更改该目录结构列表的权限
--建立新的文件与目录
--删除已经存在的文件与目录(不论该文件的权限为何!)
--将已存在的文件或目录进行更名
--转移该目录内的文件、目录位置
--目录的w权限就与该目录下的文件名变动有关
++x (access directory):目录的x代表的是用户能否进入该目录成为工作目录
Linux文件种类与扩展名
**文件种类:
++普通文件:ls –al所显示出来的属性,第一个字符为”-”。
--纯文本文件(ASCII):使用cat直接可以看到的文件。
--二进制文件(binary):Linux中的可执行文件(script、批处理文件不算)。
--数据格式文件(data):程序运行时读取的特定格式文件。
--目录:第一个属性为[d]
--连接文件:第一个属性为[l]
--设备与设备文件(device)
^^块(block)设备文件:一些存储数据,以提供系统随机访问的接口设备如硬盘
^^字符(character)设备文件:例如键盘、鼠标等
--套接字(socket):[s]
--管道(FIFO,pie):第一个属性为[p]。
**Linux文件扩展名:
++Linux的文件没有 “扩展名”,只与第一列的10个属性有关,与文件名没有关系
++使用扩展名为了标识是什么文件类型,只是让用户了解文件可能的用途而已
--*.sh——脚本或批处理文件
--*.Z、*.tar.gz、*.zip、*.tgz——经过打包的压缩文件
--*.html、*.php——网页相关文件
++在文件传送过程中,文件的属性可能被更改。
**Linux文件长度限制
**ext2/ext3文件名长度限制为:
++单一文件或目录的文件名长度最大为255个字符
++包含完整路径名称及目录(/)的完整文件名最大为4096个字符
++使用Tab键来确认文件的文件名。
++使用变量(非常方便)
**Linux文件名的限制
++避免使用* ? > < ; & ! [ ] | \ ‘ “ ` ( ) { }
++文件开头为小数点,表示为隐藏文件。在命令执行当中,常常会使用-option之类的参数,尽量避免以-或+命名
Linux目录配置标准:FHS
**FHS重点在于规范每个特定的目录下应该放置什么数据
**FHS依据文件系统使用的频繁与否是否允许用户随意改动,而将目录定义成为四种交互作用的形态。
| 可共享的(shareable) | 不可共享的(unshareable) |
不变的(static) | /usr(软件放置处) | /etc(配置文件) |
/opt(第三方软件) | /boot(开机与内核文件) | |
可变的(varible) | /var/mail(用户邮件信箱) | /var/run(程序相关) |
/var/spool/news(新闻组) | /var/lock(程序相关) |
++可共享的:可以共享给其他系统挂载使用的目录,包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂在用的目录。
++不可共享的:自己机器上运行的设备文件或者与程序有关的socket文件等,由于仅与自身机器有关,所以不适合分享给其他机器了。
++不变的:有些数据是不会经常变动的,跟随者发行版而不变动。例如:函数库、文件说明文件、系统管理员所管理的主机服务配置文件等。
++可变动的:经常改变的数据,例如:登陆文件、新闻组等。
**目录的定义:
++/(root,根目录):与开机系统有关
++/usr(Unix software resource):与软件安装/执行有关
++/var(varible):与系统运作过程有关。
根目录(/)的意义与内容
**根目录是最重要的一个目录,所有的目录都是由根目录衍生出来的,根目录与开机/还原/系统修复等动作有关。
**FSH希望根目录不要放在非常大的分区内,分区越大放入的数据越多,根目录所在的分区出现错误的机会越大
**FSH标准建议:根目录所在的分区应该越小越好,且应用程序安装的软件最好不要与根目录在同一个分区,保持根目录越小越好。
目录 | 应放置文件内容 |
/bin | /bin放置的是在单人维护模式下还能够被操作的指令。 主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。 |
/boot | 主要放置开机会使用到的文件,包括Linux核心文件以及开机选单与开机所需配置文件等等。 Linux kernel常用的档名为:vmlinuz,如果使用的是grub这个开机管理程序,则还会存在/boot/grub/这个目录! |
/dev | 所有设备与接口设备都是以文件的型态放置在这个目录。通过存取这个目录底下的某个文件,就等于存取某个装置啰 |
/etc | 系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件、各种服务的启始档等等。这个目录下的各文件属性是可以让一般使用者查阅的,但是只有root有权力修改。FHS建议不要放置可执行文件(binary)在这个目录中喔。 |
/home | 系统默认的用户家目录。在新增一个一般使用者账号时,默认的用户家目录都会规范到这里来。比较重要的是,家目录有两种代号: |
/lib | /lib放置的则是在开机时使用的库,以及在/bin或/sbin底下的指令会调用的库而已。尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模块(驱动程序) |
/media | /media下放置的就是可移除的设备。包括软盘、光盘、DVD等等设备都暂时挂载于此。常见的文件名有:/media/floppy, /media/cdrom等等。 |
/mnt | 想要暂时挂载某些额外的设备,建议放置到这个目录。较早,这个目录的用途与/media相同!有了/media之后,这个目录就用来暂时挂载用了。 |
/opt | 给第三方软件放置的目录。以前的Linux系统中,习惯放置在/usr/local目录下! |
/root | 系统管理员(root)的家目录。如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。 |
/sbin | /sbin目录下的为开机过程中所需要的,包括了开机、修复、还原系统所需要的指令。 常见的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。 |
/srv | srv可以看作service的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。常见的服务例如WWW, FTP等等。举例来说,WWW服务器需要的网页数据就可以放置在/srv/www/里面。 |
/tmp | 这是让一般使用者或者是正在执行的程序暂时放置文件的地方。任何人都能够存取,所以需要定期清理一下。重要数据不可放置在此目录啊! FHS甚至建议在开机时,应该要将/tmp下的数据都删除! |
其他目录
目录 | 应放置文件内容 |
/lost+found | 使用标准的ext2/ext3文件系统格式才会产生的一个目录,在当文件系统发生错误时,将一些遗失的片段放置到这个目录下。这个目录通常会在分区的最顶层存在,例如你加装一块硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录“/disk/lost+found” |
/proc | 这个目录本身是一个“虚拟文件系统(virtual filesystem)”。放置的数据都是在内存当中,例如系统核心、行程信息(process)、外部设备的状态及网络状态等等。本身不占任何硬盘空间! |
/sys | 跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录与核心相关的信息。包括目前已加载的核心模块与核心侦测到的硬件装置信息等等。这个目录同样不占硬盘容量. |
<!--[if !supportLists]-->Ø <!--[endif]-->这些根目录下与开机过程有关的目录,不能够与根目录放到不同的分区。
<!--[if !supportLists]-->n <!--[endif]-->/etc
<!--[if !supportLists]-->n <!--[endif]-->/bin
<!--[if !supportLists]-->n <!--[endif]-->/dev
<!--[if !supportLists]-->n <!--[endif]-->/lib
<!--[if !supportLists]-->n <!--[endif]-->/sbin
/usr目录
**所有系统默认的软件都会放置到/usr下,这个目录有点类似Windows系统上的C:\Windows与C:\Program Files这两个目录的综合体,系统装完后,这个目录占用最多的硬盘空间。
目录 | 应放置文件内容 |
/usr/X11R6/ | 为X Window System重要数据所放置的目录,之所以取名为X11R6是因为最后的X版本为第11版,且该版的第6次释出之意。 |
/usr/bin/ | 绝大部分的用户可使用指令都放在这里,请注意到他与/bin的不同之处。(是否与开机过程有关) |
/usr/include/ | 放置c/c++等程序语言的头文件与包含文件,当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档! |
/usr/lib/ | 包含各应用软件的库、目标文件,以及不被一般使用者惯用的执行档或脚本(script)。如果使用的是X86_64的Linux系统,那可能会有/usr/lib64/目录! |
/usr/local/ | 系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录,这样会比较便于管理。举例来说,distribution提供的软件较旧,想安装较新的软件但又不想移除旧版,此时可以将新版软件安装于/usr/local/目录下,该目录下也是具有bin, etc, include, lib...的子目录! |
/usr/sbin/ | 非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)! |
/usr/share/ | 放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据,在此目录下常见的还有这些次目录: <!--[if !supportLists]-->· <!--[endif]-->/usr/share/man:联机帮助文件 <!--[if !supportLists]-->· <!--[endif]-->/usr/share/doc:软件杂项的文件说明 <!--[if !supportLists]-->· <!--[endif]-->/usr/share/zoneinfo:与时区有关的时区文件 |
/usr/src/ | 一般源码建议放置到这里。至于核心原始码则建议放置到/usr/src/linux/目录下。 |
/var
**/var在系统工作后逐渐占用硬盘空间的目录。/var目录主要存放经常会变动的文件,包括缓存、登陆文件以及某些软件运行后生成的文件,包括程序文件(lock file, run file)或者例如MySQL数据库的文件等。
目录 | 应放置文件内容 |
/var/cache/ | 应用程序本身运行过程中会产生的一些暂存文件; |
/var/lib/ | 程序本身执行的时,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去! |
/var/lock/ | 某些设备或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时,就可能产生一些错误的状况,因此就得要将该设备上锁(lock),以确保该设备只会给单一软件所使用。举例来说,刻录机正在刻录一块光盘,你想一下,会不会有两个人同时在使用一个刻录机烧片?如果两个人同时刻录,那片子写入的是谁的数据?所以当第一个人在刻录时该刻录机就会被上锁,第二个人就得要该装置被解除锁定(就是前一个人用完了)才能够继续使用。 |
/var/log/ | 非常重要。这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登入者的信息)等。 |
/var/mail/ | 放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中!通常这两个目录是互为链接文件! |
/var/run/ | 某些程序或者是服务启动后,会将他们的PID放置在这个目录下! |
/var/spool/ | 这个目录通常放置一些队列数据,所谓的队列就是排队等待其他程序使用的数据! 这些数据被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中,但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中,等到被送出后就被删除。如果是工作排程数据(crontab),就会被放置到/var/spool/cron/目录中! |
**FHS仅定义/、/usr、/var的目录内容,在其他目录层次内,可以随开发者自行来配置。
目录树
**在Linux下,所有的文件与目录都是由根目录开始的。
++目录树的起始点为根目录(/、root)
++每一个目录不仅能够使用本地分区的文件系统,也可以使用网络上的文件系统。
++每一个文件在目录中的文件名都是独一无二的
**CentOS的目录
++/selinux:这个目录内容数据也是内存中的信息,不占用任何的硬盘空间。主要针对程序(或网络程序)的访问权限来限制