Linux 的文件权限与目录配置

小引

It’s very easy to make the mistake of quickly dismissing a coworker’s idea so that you can present your own, but when you commit this grievous error in judgment, you’ll often find them deaf to your own ideas because you’ve made them feel unimportant. If you want people to accept your ideas and think them valuable, you have to extend the same courtesy first. You can never win a person’s heart if you do not leave their pride intact.此文源自《Soft Skills The software developer’s life manual》

破船译:我们经常犯的一个错误就是轻率的否决他人的意见,以便提出自己的想法。但是当你作出这样错误的举措时,会发现别人对你的想法充耳不闻,因为你让他们觉得自己无足轻重,没有受到尊重。如果希望人们接受并认可你的想法,你必须首先尊重别人,如果你做不到的话,那永远得不到别人的认同。

最近在学习 Docker,Docker 缘起于 Linux,自然需要一些 Linux 的知识才好,所以学习 Docker 过程中,顺道学习一下 Linux 的基础知识,此文就是我学习《鸟哥的 Linux 私房菜》的读书笔记之一(后续还会有几篇)。

文件权限

简介

Linux最优秀的地方之一就在于他的多用户多任务环境。而为了让各个使用者具有较保密的文件数据,因此文件的权限管理就变的很重要了。 Linux一般将文件可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限。

文件权限的查看

在终端,输入 ls -al 可以就可以看到文件的权限信息

1
2
3
-rw-r--r-- 1 BeyondVincent staff 9 8 29 11:26 README.md
-rw-r--r-- 1 BeyondVincent staff 21723 9 26 18:51 pom.xml
drwxr-xr-x 3 BeyondVincent staff 102 8 31 17:34 src

在上面的第一栏中-rw-r--r--,有十个字符,表示了文件的类型和权限信息。

  • 第一个字符表示文件的类型d:目录 -:文件
  • 接着以 3 字符个为一组,并且都是rwx的组合。其中,[ r ]代表可读 (read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个 权限的位置不会改变,如果没有权限,就会出现减号[ - ]。
    • 第一组为文件拥有者所具备的权限。README.md 文件为 rw-,表示可读写,不可执行。
    • 第二组为加入该群组(staff)的账号的权限。
    • 第三组为没有加入该群组(staff)的其他账号的权限。

ls 是 list 的意思,选项 “-al” 则表示列出所有的文件详细的权限与属性

文件的权限字符为:“- rwxrwxrwx”,共 3 种身份(owner/group/others),9 个权限。

文件权限的修改

文件权限对于系统的安全性非常重要,下面是几个常见的权限修改命令:

  • chgrp(change group) : 改变文件所属群组。范例:chgrp groupname filename
  • chown(change owner) : 改变文件拥有者。范例:chown username filename
  • chmod : 改变文件的权限, SUID, SGID, SBIT等的特性。可以通过数字或者符号进行权限的改变。
    • 数字:九个权限,3 个一组,每组的数值分别累加,即可算出对应的数字。权限分数对照表为(r:4 w:2 x:1)。例如当文件权限为: [-rwxrwx—] 数字是owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others= --- = 0+0+0 = 0,所以文件权限就为 770。范例:chmod 777 filename
    • 符号:借助u(user),g(group),o(others),a(all),代表身份,rwx代表权限,来对文件权限进行修改。范例:将文件权限设置为“-rwxr-xr-x”的命令chmod u=rwx,go=rx filename。也可以使用+或者-,例如对文件增加每个人都能写入的权限:chmod a+w filename

chgrp 和 chown 常用于将文件复制给其他人使用时,在复制过程中,会复制执行者的属性和权限,所以需要对文件权限进行修改,他人才能正常使用复制的文件。

目录配置

Linux 目录配置的依据是 FHS(Filesystem Hierarchy Standard:文件系统层次标准),FHS 的重点在于规范每个目录下应该要放置什么数据。FHS 依据文件系统使用的频繁与否与是否允许使用者随意改动,将目录定义为四种交互作用的形态:可分享的、不可分享的、不变的和可变的。

FHS针对目录树架构仅定义出三层目录下面应该放置什么数据,分别是下面这三个目录的定义:

  • /:(root, 根目录):与开机系统有关;

FHS 要求在根目录/下面必须存在的目录为:

  1. /bin:该目录放置的是在单人维护模式下还能够被操作的指令。 在 /bin 下面的指令可以被 root 和一般帐号所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等常 用的指令。
  2. /boot:这个目录主要存储开机时使用到的文件,包括 Linux 核心文件以及开机菜单与开机所需配置文件等。
  3. /dev:在 Linux 系统上,任何设备与周边设备都是以文件的型态存在于这个目录中。
  4. /etc:系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码、 各种服务的启动等。FHS 不建议将可执行文件放在这个目录,比较重要的文件有: /etc/modprobe.d/, /etc/passwd, /etc/fstab, /etc/issue 等。另外 FHS 也要求 opt 必须放在该目录下 (/etc/opt)。
  5. /lib:该目录主要存放在开机时会用到的函数库, 以及在 /bin 或 /sbin 下面的指令会调用到的函数库。另外,FHS 还要求该目录下有用于存放驱动程序的目录:/lib/modules/。
  6. /media:这个目录下面放置可移除的设备, 包括软盘、光盘、DVD等等设备都暂时挂载于此。
  7. /mnt:用于暂时挂载某些额外的设备。
  8. /opt:用于存储第三方软件。
  9. /run:系统开机后所产生的各项信息存放在此目录。
  10. /sbin:存放开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。
  11. /srv:是一些网络服务启动之后,这些服务所需要 读取的数据目录。
  12. /tmp:一般使用者或者是正在执行的程序暂时放置文件的地方。 这个目录任何人都能够存取。FHS 建议在开机的时候将该目录的数据删除。
  13. /usr:用于存放操作系统的软件资源。
  14. /var:用于存储经常变动的文件。

FHS 建议在根目录/下可以存在的目录有:

  1. /home:系统默认的使用者主文件夹。
  2. /lib<qual>:用来存放与 /lib 不同的格式的二进制函数库,例如支持 64 位的 /lib64 函数库等。
  3. /root:系统管理员(root)的主文件夹。

在根目录,除了 FHS 定义的以上目录外,还有一些目录,需要知道:

  1. /lost+found:使用标准的 ext2/ext3/ext4 文件系统格式才会产生的一个目录。目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。
  2. /proc:这个目录是一个虚拟文件系统,它存储的数据位于内存中(不占任何硬盘容量),例如系统核心、行程信息(process)、周边设备的 状态及网络状态等。
  3. /sys:与 /proc 类似,也是一个虚拟文件系统,主要也是记录 核心与系统硬件信息较相关的信息。同样不占硬盘容量。
  • /usr:该目录与软件安装/执行有关。/usr 里面放置的数据属于可分享的与不可变动的(shareable, static)。usr 并不是 user 的缩写,而是 Unix Software Resource的缩写,也就是 Unix 操作系统软件资源存放的目录。FHS 建议 所有软件开发者,应该将软件的数据合理的分别放置到这个目录下的次目录,而不要自行创建该软件自己独立的目录。该目录有点类似 Windows系统的 “C:\Windows\ (当中的一部份) + C:\Program files\” 这两个目 录的综合体。

FHS 要求在目录/usr下面必须存在的目录有:

  1. /usr/bin/:所有一般用户能够使用的指令都放在这里。FHS 要求在此目录下不应该有子目录。
  2. /usr/lib/:该目录基本上,与 /lib 功能相同,/lib 就是链接到此目录中的。
  3. /usr/local/:系统管理员在本机安装自己下载的软件(非distribution默认提供者)时,建议安装到此目录, 这样便于管理。该目录下也是具有 bin、etc、 include 和 lib等次目录。
  4. /usr/sbin/:非系统正常运行所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)。功能与 /sbin 差不多, 因此目前 /sbin 就是链接到此目录中的。
  5. /usr/share/:主要放置只读架构的数据文件,也包括共享文件。在这个目录下放置的数据几乎都是文字文 件,在此目录下常见的还有这些次目录:/usr/share/man(线上说明文档), /usr/share/doc(软件杂项的文件说明), /usr/share/zoneinfo(与时区有关的时区文件)。

FHS 建议在目录/usr下可以存在的目录有:

  1. /usr/games/:与游戏相关的数据。
  2. /usr/include/:C/C++等程序用到的头文件存放于此。
  3. /usr/libexec/:存放不常用的一些脚本或可执行文件。
  4. /usr/lib<qual>/:与 /lib/ 功能相同,目前 /lib 就是链接到此目录中。
  5. /usr/src/:一般源码存放于此。核心源码建议存放在 /usr/src/linux/ 目录。
  • /var(variable):与系统运行过程有关。如果 /usr 是安装时会占用较大硬盘容量的目录,那么/var 就是在系统运行后才会渐渐占用硬盘容量的目录。

FHS 要求在目录/usr下面必须存在的目录有:

  1. /var/cache/:应用程序本身运行过程中会产生的一些临时数据。
  2. /var/lib/:程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。
  3. /var/lock/:需要独占的资源或者设备。目前此目录也已经挪到 /run/lock 中。
  4. /var/log/:登录文件存放的位置。
  5. /var/mail/:放置个人电子邮件信箱的目录。这个目录也被放置到 /var/spool/mail/ 目录中,通常这两个目录是互为链接文件。
  6. /var/run/:某些程序或者是服务启动后,会将他们的PID放置在这个目录。
  7. /var/spool/:这个目录通常放置一些伫列数据,所谓的“伫列”就是排队等待其他程序使用的数据。

FHS 仅定义出最上层 / 及次层 /usr/var 的目录内容应该要放置的文件或目录数据,在其他次目录层级内,就可以随开发者自行来配置。

在 Linux 中,所有的文件和目录都是从根目录开始的,根目录是所有文件和目录的源头,然后一个一个的分支往下扩散,我们称这种配置方式为:目录树 (directory tree)。这颗目录树的特点:

  1. 目录树的启始点为根目录 (/, root)。
  2. 每一个目录不仅可以使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem。
  3. 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。

Linux 的目录树架构示意图
image