# Linux的文件权限与目录配置

  • Linux最优秀的地方之一就在于它的多人多任务环境。而为了让各个用户具有保密的文件数据,因此文件权限管理就变得很重要了。Linux一般将文件可读写的身份分为三个类别,分别是拥有者(owner)、所属群组(group),其他人(others),且三种身份各有(read)、(write)、执行(execute)等权限。

  • Linux的每个文件中,可分别给予用户、用户组与其他人三种身份的rwx权限。

  • 用户组最有用的功能之一,就是当你在团队协同工作的时候,且每个账户都可以有多个用户组的支持。

  • 利用ls -l显示的文件属性中,第一个字段是文件的权限,共有十位,第一位是文件类型,接下来三位为一组,共三组,分别为用户、用户组、其他人的权限,权限有r、w、x三种。

  • 如果文件名之前多了一个'.',则代表这个文件为隐藏文件。

  • # 文件属性
    ls -al 
    
    drwxrwxrwx 39 work work     4096 Jul  7 16:01 .
    drwxr-xr-x 14 bvc  bvc      4096 Jan 22 16:04 ..
    -rwxrw-r--  1 work work     4096 May 27 17:38 ._agent.log
    -rw-rw-r--  1 work work 38377896 Jul  8 09:58 agent.log
    
    其对应意思分为为:
     
    文件类型权限 - 链接数 - 文件拥有者 - 文件所属用户组 - 文件大小 - 文件最后修改时间 - 文件名
    
  • 若需要root的权限时,可以使用su -命令来切换身份,操作完毕使用exit离开su命令环境。

  • 更改文件的用户组支持可用chgrp,修改文件的拥有者可用chown,修改文件的权限可用chmod。使用以上三个命令时,添加参数【-R】可以作用文件目录下的所有子文件。

  • chmod修改权限的方法有两种,分别是符号法与数字法。

    • 数字法中r、w、x数字分别为4、2、1。例如rwxrwxrwx,表示用户、用户组、其他人都拥有所有权限,当然还可以使用777简写来表示(4+2+1=7)。使用命令为:chmod 777 .bashrc
    • 符号法中u、g、o、a四个身份,分别为user、group、others、all(包含前三个)四种身份。使用命令为:chmod u=rwx,go=rx .bashrc
  • 对于文件来讲,权限的功能为:

    • r:可读取此文件的实际内容,如读取文本文件的文字内容等
    • w:可以编辑、新增或是修改该文件的内容(但不含删除该文件)
    • x:该文件具有可以被系统执行的权限
  • 对于目录来说,权限的功能为:

    • r:读取目录中的内容
    • w:修改目录中的内容(能改变该目录的结构)
    • x:访问内容(能否进入该目录)
  • 要开放目录给任何人浏览时,应该至少需要给予r及x的权限,但是w权限不可随便给。

  • 能否读取到某个文件的内容,跟该文件所在的目录权限也有关系(目录至少需要有x的权限)。

  • Linux中,文件是否能被执行,与文件名没有关系,而是由文件是否具有【x】这个权限来决定。在windows中文件是否能执行依靠扩展名来判断,例如.exe.zip

  • 文件是存放实际数据的所在,而目录主要的内容在记录文件名列表,文件名与目录有强烈的关联。

  • Linux文件名的限制为:单一文件或目录的最大容许文件名为255个英文字符或128个中文字符。

  • Linux文件种类

    • -,常规文件,例如纯文本文件、二进制文件、数据文件。
    • d,目录。
    • l,链接文件。
    • b,区块设备文件,一些存储数据,提供系统随机存储的接口设备,例如硬盘、软盘、u盘。
    • c,字符设备文件,一些串行端口的接口设备,例如键盘、鼠标。
    • s,数据接口文件。
    • p,数据传送文件。
  • 根据FHS的官方文件指出,它们主要目的是希望用户可以了解到已安装软件通常放置于哪个目录。

  • FHS制定出来的四种目录为:shareable、unshareable、static、variable等四种。

    • 可分享:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录。
    • 不可分享:自己机器上面运行的设备文件或是与程序有关的socket文件等,由于仅与自身机器有关,所以当然就不适合分享给其他主机。
    • 不变:有些数据是不会经常变动的,跟随着发行版而不变动。例如函数库,文件说明、系统管理员所管理的主机服务配置文件等。
    • 可变动:经常修改的数据,例如日志文件,一般用户可自行接受的新闻组等。
  • - 可分享(shareable) 不可分享(unshareable)
    不变(static) /usr(软件存放处) /etc(配置文件)
    /opt(第三方辅助软件) /boot(启动与内核文件)
    可变动(variable) /var/mail(用户邮箱) /var/run(程序相关)
    /var/spool/news(新闻组) /var/lock(程序相关)
  • FHS所定义的三层主目录为:/、/var、/usr三层。

    • /(root,根目录):与启动系统有关。
    • /usr(unix software resource):与软件安装/执行有关。
    • /var(variable):与系统运行过程有关。
  • 绝对路径为从根目录/开始写起,否则就是相对路径。

  • 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来,同时根目录也与启动、还原、系统修复等操作有关。

  • 根据FHS标准建议:根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。

  • 每一个目录不止能使用本地分区的文件系统,也可以使用网络上的文件系统。举例来说,可以利用Network File System(NFS)服务器挂载某些特定目录等。

  • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。

# 文件目录结构

鉴于上述说明,FHS定义根目录(/)下面应该有这些子目录存在,即使没有物理目录,FHS也希望至少有(link)目录存在。

一、FHS要求必须要存在的目录

目录 应放置文件内容
/bin 系统有很多存放执行文件的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被使用的命令。在/bin下面的命令可以被root与一般账户所使用,主要有:cat、chmod、chown、date、mv、mkdir、cp、bash等常用的命令。
/boot 这个目录主要在放置启动会使用的文件,包括Linux内核文件以及启动选项与启动所需配置文件等。Linux内核常用的文件名为:vmlinuz,如果使用的是grub2这个启动引导程序,则还会存在/boot/grub2/这个目录。
/dev 在Linux系统上,任何设备与接口设备都是以文件的形式存在于这个目录中。你只要通过读写这个目录下面的某个文件,就等于读写某个设备,比较重要的文件有/dev/null、/dev/zero、/dev/tty、/dev/loop*、/dev/sd*等。
/etc 系统主要的配置文件几乎都放置在这个目录内,例如人员的密码账号文件、各种服务的启动文件等。一般来说,这个目录下的各文件是可以让一般用户查看的,但是只有root有权力修改。FHS建议不要放置可执行文件(binary)在这个目录中。比较重要的文件有:/etc/modprobe.d/、/etc/passwd、/etc/fstab、/etc/issue等。另外FHS还规范几个重要的目录最好要存在/etc/目录下:
1. /etc/opt/(必要):这个目录放置第三方辅助软件/opt的相关配置
2. /etc/X11/(建议):与X Window有关的各种配置文件都在这里,尤其是xorg.conf这个x Server的配置文件
3. /etc/sgml/(建议):与SGML格式有关的各项配置文件
4. /etc/xml/(建议):与XML格式有关的各项配置文件
/lib 系统的函数库非常多,而/lib放置的则是在启动时会用到的函数库,以及在/bin或/sbin下面的命令会调用的函数库而已。什么是函数库?你可以将它想成是外挂,某些命令必须要有这些外挂才能够顺利完成程序的执行之意,另外FSH还要求下面的目录必须要存在。
1. /lib/modules/:这个目录主要放置可抽换式的内核相关模块(驱动程序)
/media media是媒体的英文,顾名思义,这个/media下面放置的就是可删除的设备,包括软盘、光盘、DVD等设备都暂时挂载于此。常见的文件名有:/media/floppt、/media/cdrom等。
/mnt 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在早些时候,这个目录的用途与/media相同。只是有了/media之后,这个目录就暂时用来挂载。
/opt 这个是给第三方辅助软件放置的目录。什么是第三方辅助软件?举例来说,KDE这个桌面管理系统是一个独立的软件,不过它可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下。另外,如果你想要自行安装额外的软件(非原本的发行版提供),那么也能够将你的软件安装到这里来,不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。
/run 早期的FHS规定系统启动后所产生的各项信息应该放置到/var/run目录下,新版的FHS则规范到/run下面,由于/run可以使用内存来模拟,因此性能上会好很多。
/sbin Linux有非常多命令是用来设置系统环境的,这些命令只有root才能够用来设置系统,其他用户最多只能用来查询而已。放在/sbin下面的为启动过程中所需要的,里面包括了启动、修复、还原系统所需要的命令。至于某些服务器软件程序,一般则放置到/usr/sbin/当中。至于本机自行安装的软件所产生的系统执行文件(system binary),则放置到/usr/local/sbin/当中了。常见的命令包括:fdisk、fsck、ifconfig、mkfs等。
/srv srv可以视为service的缩写,是一些网络服务启动之后,这些服务所需要使用的数据目录,常见的服务例如WWW、FTP等。举例来说,WWW服务器需要的网页数据就可以放置在/srv/www/里面。不过,系统的服务数据如果尚未要提供给因特网任何人浏览的话,默认还是建议放置到/var/lib下面即可。
/tmp 这是让一般用户或是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期地清理一下。当然,重要数据不可放置在此目录。因为FHS甚至建议在启动时,应该要将/tmp下的数据都删除。
/usr 第二层FHS设置,后续介绍
/var 第二层FHS设置,主要为放置变动性的数据,后续介绍

二、FHS建议存在的目录

目录 应放置文件内容
/home 这是系统默认的用户家目录(home directory)。在你新增一个一般用户账号时,默认的用户家目录都会规范到这里来,比较重要的是家目录有两种代号:
1. ~:代表目前这个用户的家目录
2. ~dmtsai:代表dmtsai的家目录
/lib(qual) 用来存放与/lib不同的格式的二进制函数库,例如支持64位的/lib64函数库等。
/root 系统管理员(root)的家目录,之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。

事实上FHS针对根目录所定义的标准就仅有上面的东西,不过我们的Linux下面还有许多目录你也需要了解一下。下面几个在Linux当中也非常重要的目录。

目录 应放置文件内容
/lost+found 这个目录是使用的ext2、ext3、ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下,不过如果使用的是xfs文件系统的话,就不会存在这个目录。
/proc 这个目录本身是一个虚拟文件系统(virtual filesystem),它放置的数据都是在内存当中,例如系统内核、进程信息(process)、外接设备的状态及网络状态等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间。比较重要的文件例如:/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/ioports、/proc/net/*等。
/sys 这个目录跟/proc类似,也是一个虚拟的文件系统,主要也是记录内核与系统硬件信息相关的内容。包括目前已加载的内核模块与内核检测到的硬件设备信息等,这个目录同样不占硬盘容量。

CentOS7.x版本已经将/sbin、/bin、/lib通通移到了/usr下面。

# /usr的意义与内容

依据FHS的基本定义,/usr里面放置的数据属于可分享与不可变动(shareable, static)。

/usr并不是user的缩写,而是UNIX software Resource的缩写,也就是UNIX操作系统软件资源所放置的目录,而不是用户的数据。FHS建议所有的软件开发者,应该将他们的数据合理地分别放置到这个目录下的子目录,而不是自行建立该软件的独立目录。

因为所有系统默认的软件(发行版发布者提供的软件)都会放置到/usr下面,因此这个目录有点类似Windows系统"C:\Windows\(当中的一部分)+C:\Program Files\"这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。

一、FHS要求必须存在的目录

目录 应放置文件内容
/usr/bin/ 所有一般用户能够使用的命令都放在这里。目前新的CentOS7已经将全部用户命令放置于此,而使用链接文件的方式将/bin链接至此。也就是说,/usr/bin与/bin是一模一样的。另外,FHS要求在此目录下不应该有子目录。
/usr/lib/ 基本上,与/lib功能相同,所以/lib就是链接到此目录中的。
/usr/local/ 系统管理员在本机安装自己下载的软件(非发行版默认提供者),建议安装到此目录,这样会比较便于管理。举例来说,你的发行版提供的软件较旧,你想安装较新的软件但又不想删除旧版,此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别。你可以自行到/usr/local去看看,该目录下也是具有bin、etc、include、lib...子目录。
/usr/sbin/ 非系统正常运行所需要的系统命令,最常见的就是某些网络服务器软件的服务命令(daemon)。不过基本功能与/sbin也差不多,因此目前/sbin就是链接到此目录中的。
/usr/share/ 主要放置只读的数据文件,当然也包括共享文件,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据,因为几乎都是文本文件。在此目录下常见的还有这些子目录:
1. /usr/share/man:在线帮助文件
2. /usr/share/doc:软件的说明文档
3. /usr/share/zoneinfo:与时区有关的时区文件

二、FHS建议存在的目录

目录 应放置文件内容
/usr/games/ 与游戏比较相关的数据放置处。
/usr/include/ c/c++等程序语言的头文件(header)与包含文件(include)放置处,当我们以Tarball方式(*.tar.gz的方式安装软件)安装某些程序时,会使用到里面的许多文件。
/usr/libexec/ 某些不被一般用户常用的执行文件或脚本(script)等,都会放置在此目录中。例如大部分的X 窗口下面的操作命令,很多都是放置在此目录下。
/usr/lib(qual)/ 与/lib(qual)/功能相同,因此目前/lib(qual)就是链接到此目录中。
/usr/src/ 一般源代码建议放置到这里,src有source的意思。至于内核源代码则建议放置到/usr/src/Linux/目录下。

# /var的意义与内容

如果说/usr是安装时会占用较大的硬盘容量的目录,那么/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/ 某些设备或是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时,就可以产生一些错误的状况,因此就得要将该设备上锁(lock),以确保该设备只会给单一软件所使用。举例来说,刻录机正在刻录一张光盘,你想一下会不会有两个人同时在刻录同一个刻录机上刻盘?如果两个人同时刻录,那光盘写入的是谁的数据?所以当第一个人在刻录时刻录机就会被上锁,第二个人就得要该设备被解除锁定(就是前一个人用完了)才能够继续使用,目前此目录也已经挪到/run/lock中。
/var/log/ 非常重要。这是日志文件放置的目录,里面比较重要的文件有/var/log/messages、/var/log/wtmp(记录登录信息等)。
/var/mail/ 放置个人电子邮箱的目录,不过这个目录也被放置到/var/spool/mail/目录中,通常这两个目录是互为链接文件。
/var/run/ 某些程序或是服务启动后,会将它们的PID放置在这个目录下,至于PID的意义我们会在后续章节提到,与/run相同,这个目录链接到/run目录。
/var/spool/ 这个目录通常放置一些队列数据,所谓的队列就是排队等待其他程序使用的数据,这些数据被使用后通常都会被删除。举例来说,系统收到新邮件会放置到/var/spool/mail/中,但用户收下该邮件后该封信原则上就会被删除,邮件如果暂时寄不出去会被放到/var/spool/mqueue/中,等到被送出后就被删除。如果是计划任务数据(crontab),就会被放置到/var/spool/cron/目录中。

CentOS 7目录变化大概如下

  • /bin --> /usr/bin
  • /sbin --> /usr/sbin
  • /lib --> /usr/lib
  • /lib64 --> /usr/lib64
  • /var/lock --> /run/lock
  • /var/run --> /run
最近更新时间: 2020/9/6 11:30:38