目录

Linux 文件权限和目录配置

本文全文摘抄自《鸟叔的 LInux 私房菜》,对部分用词做了转换,仅保留了我感兴趣的部分,便于以后查找

Linux 文件属性

ls -al: ls 是 “list” 的意思,重点在显示文件的文件名与相关属性。而选项 “-al” 则表示列出所有的文件详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为 “ . ” 的文件)

https://s1.ax1x.com/2020/05/19/YIhreU.png

  • 第一栏代表这个文件的类型与权限( permission )

    • 第一个字符代表这个文件是 “ 目录、文件或链接文件等等 ” :

      • 当为 [ d ] 则是目录,例如上表文件名为 “boot” 的那一行;
      • 当为 [ - ] 则是文件,例如上表文件名为 “.autorelabel” 那一行;
      • 若是 [ l ] 则表示为链接文件( link file );
      • 若是 [ b ] 则表示为设备文件里面的可供储存的周边设备(可随机存取设备);
      • 若是 [ c ] 则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)。
    • 接下来的字符中,以三个为一组,且均为 “rwx” 的三个参数的组合。其中, [ r ] 代表可读( read )、 [ w ] 代表可写( write )、 [ x ] 代表可执行( execute )。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 [ - ] 而已。

      • 第一组为 “ 文件拥有者可具备的权限 ” ,以 “.autorelabel” 那个文件为例, 该文件的拥有者可以读-

        写,但不可执行;

      • 第二组为 “ 加入此群组之后帐号的权限 ” ;

      • 第三组为 “ 非本人且没有加入本群组之其他帐号的权限 ” 。

  • 第二栏表示有多少文件名链接到此节点( i-node )

  • 第三栏表示这个文件(或目录)的 “ 拥有者帐号 ”

  • 第四栏表示这个文件的所属群组

  • 第五栏为这个文件的容量大小,默认单位为 Bytes

  • 第六栏为这个文件的创建日期或者是最近的修改日期:

    有的年代过于久远的可能只会显示年份,如果想要显示完整的时间格式,可以利用 ls 的选项,亦即: “ls -l –full-time” 就能够显示出完整的时间格式了!包括年、月、日、时间

  • 第七栏为这个文件的文件名

    这个字段就是文件名了。比较特殊的是:如果文件名之前多一个 “ . ” ,则代表这个文件为 “ 隐藏文件 ” ,例如上表中的 .autorelabel 那一行,该文件就是隐藏文件,使用 -a可以查看到

改变文件属性

改变所属群组 , chgrp

改变一个文件的群组真是很简单的,直接以 chgrp 来改变即可,咦!这个指令就是 change group 的缩写嘛!这样就很好记了吧! ^_^ 。不过,请记得,要被改变的群组名称必须要在 /etc/group 文件内存在才行,否则就会显示错误, -R 可以递归更改权限

改变文件拥有者 , chown

如何改变一个文件的拥有者呢?很简单呀!既然改变群组是 change group ,那么改变拥有者就是 change owner 啰! BINGO !那就是 chown 这个指令的用途,要注意的是, 使用者必须是已经存在系统中的帐号,也就是在 /etc/passwd 这个文件中有纪录的使用者名称才能改变。-R 可以递归更改权限

chown 还可以顺便直接修改群组的名称 :“ chown user.group file”,亦即在拥有者与群组间加上小数点

知道如何改变文件的群组与拥有者了,那么什么时候要使用 chown 或 chgrp 呢?或许你会觉得奇怪吧? 是的,确实有时候需要变更文件的拥有者的,最常见的例子就是在复制文件给你之外的其他人时,cp 复制了文件但是属性并没有变,这个时候别人仍然看不见,所以需要修改文件属性

改变权限 , chmod

  • 数字类型改变文件权限

    Linux 文件的基本权限就有九个,分别是 owner/group/others 三种身份各有自己的 read/write/execute 权限, 先复习一下刚刚上面提到的数据:文件的权限字符为: “-rwxrwxrwx” , 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

    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 [-R] xyz 文件或目录

  • 符号类型改变文件权限

    还有一个改变权限的方法呦!从之前的介绍中我们可以发现,基本上就九个权限分别是( 1 ) user ( 2 ) group ( 3 ) others 三种身份啦!那么我们就可以借由 u, g, o 来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成 r, w, x 啰!+ (加入),-(除去) ,=(设置)

    ‘+‘与’–‘的状态下,只要是没有指定到的项目,则该权限 “ 不会被变动 ” ,而=是直接设置

    命令:chmod u+x filechmod u=x,g=rw file

权限的意义

文件的权限

  • r ( read ):可读取此一文件的实际内容,如读取文本文件的文字内容等
  • w ( write ):可以编辑、新增或者是修改该文件的内容(但不含删除该文件
  • x ( execute ):该文件具有可以被系统执行的权限

目录的权限

  • r ( read contents in directory ):表示具有读取目录结构清单的权限,所以当你具有读取( r )一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来

  • w ( modify contents of directory ):这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有改变该目录结构的权限,也就是下面这些权限:创建新的文件与目录;删除已经存在的文件与目录(不论该文件的权限为何!)将已存在的文件或目录进行更名;搬移该目录内的文件、目录位置。总之,目录的 w 权限就与该目录下面的文件名改变有关就对了啦!

    自己测试了一下,开了 w 还是不能删也不能加也不能改,实际上这里书上没有介绍清楚,这个 w 权限只有在 x 权限打开之后才有用(其实想一下就知道了,如果 w 有这么多权限,那还要 x 干嘛)

  • x ( access directory ):能否进入目录(cd)

FHS

根目录 ( / ) 的意义与内容:

因此 FHS 定义出根目录( / )下面应该要有下面这些次目录的存在才好,即使没有实体目录, FHS 也希望至少有链接文件存在才好 FHS 要求必须要存在的目录

  • /bin: 系统有很多放置可执行文件的目录,但 /bin 比较特殊。因为 /bin 放置的是在单人维护模式下还能够被操作的指令。 在 /bin 下面的指令可以被 root 与一般帐号所使用,主要有: cat, chmod, chown, date, mv, mkdir, cp, bash 等等常用的指令。
  • /boot: 这个目录主要在放置开机会使用到的文件,包括 Linux 核心文件以及开机菜单与开机所需配置文件等等。 Linux kernel 常用的文件名为: 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 等等
  • /lib:系统的函数库非常的多,而 /lib 放置的则是在开机时会用到的函数库, 以及在 /bin 或 /sbin 下面的指令会调用的函数库而已。什么是函数库呢?你可以将他想成是 “ 外挂 ” ,某些指令必须要有这些 “ 外挂 ” 才能够顺利完成程序的执行之意。 另外 FSH 还要求下面的目录必须要存在:/lib/modules/ :这个目录主要放置可抽换式的核心相关模块(驱动程序)喔!
  • /media: media 是 “ 媒体 ” 的英文,顾名思义,这个 /media 下面放置的就是可移除的设备啦! 包括软盘、光盘、 DVD 等等设备都暂时挂载于此。常见的文件名有: /media/floppy, /media/cdrom 等等。
  • /mnt: 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。 在古早时候,这个目录的用途与 /media 相同,只是有了 /media 之后,这个目录就用来暂时挂载用了
  • /opt: 这个是给第三方软件放置的目录。什么是第三方软件啊? 举例来说, KDE 这个桌面管理系统是一个独立的软件,不过他可以安装到 Linux 系统中,因此 KDE 的软件就建议放置到此目录下了。 另外,如果你想要自行安装额外的软件(非原本的 distribution 提供的),那么也能够将你的软件安装到这里来。 不过,以前的 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 下的数据都删除

FHS 建议可以存在的目录

  • /home:这是系统默认的使用者主文件夹( home directory )。在你新增一个一般使用者帐号时, 默认的使用者主文件夹都会规范到这里来。比较重要的是,主文件夹有两种代号喔: ~ :代表目前这个使用者的主文件夹 ~dmtsai :则代表 dmtsai 的主文件夹!
  • /root:系统管理员( root )的主文件夹。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时, 该目录就能够拥有 root 的主文件夹,所以我们会希望 root 的主文件夹与根目录放置在同一个分区中。 事实上 FHS 针对根目录所定义的标准就仅有上面的,不过我们的 Linux 下面还有许多目录你也需要了解一下
  • /lost+found: 这个目录是使用标准的 ext2/ext3/ext4 文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时, 将一些遗失的片段放置到这个目录下。不过如果使用的是 xfs 文件系统的话,就不会存在这个目录了!
  • /proc: 这个目录本身是一个 “ 虚拟文件系统( virtual filesystem ) ” 喔!他放置的数据都是在内存当中, 例如系统核心、行程信息( process )、周边设备的状态及网络状态等等。因为这个目录下的数据都是在内存当中, 所以本身不占任何硬盘空间啊! 比较重要的文件例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等等。
  • /sys: 这个目录其实跟 /proc 非常类似,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息较相关的信息。 包括目前已载入的核心模块与核心侦测到的硬件设备信息等等。这个目录同样不占硬盘容量喔!

早期 Linux 在设计的时候,若发生问题时,救援模式通常仅挂载根目录而已,因此有五个重要的目录被要求一定要与根目录放置在一起, 那就是 /etc, /bin, /dev, /lib, /sbin 这五个重要目录。现在许多的 Linux distributions 由于已经将许多非必要的文件移出 /usr 之外了, 所以 /usr 也是越来越精简,同时因为 /usr 被建议为 “ 即使挂载成为只读,系统还是可以正常运行 ” 的模样,所以救援模式也能同时挂载 /usr 喔! 例如,我们的这个 CentOS 7.x 版本在救援模式的情况下就是这样。因此那个五大目录的限制已经被打破了呦!例如 CentOS 7.x 就已经将 /sbin, /bin, /lib 通通移动到 /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 的次目录建议有下面这些:

FHS 要求必须要存在的目录

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

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/ 目录中!

参考

FHS3.0