【BASH】回顾与知识点梳理(二十一)

【BASH】回顾与知识点梳理 二十一

    • [二十一. Linux 的文件权限与目录配置](#二十一. Linux 的文件权限与目录配置)
      • [21.1 使用者与群组](#21.1 使用者与群组)
      • [21.2 Linux 文件权限概念](#21.2 Linux 文件权限概念)
        • [Linux 文件属性](#Linux 文件属性)
        • [Linux 文件权限的重要性](#Linux 文件权限的重要性)
      • [21.3 如何改变文件属性与权限](#21.3 如何改变文件属性与权限)
        • [改变所属群组, chgrp](#改变所属群组, chgrp)
        • [改变文件拥有者, chown](#改变文件拥有者, chown)
        • [改变权限, chmod](#改变权限, chmod)
      • [21.4 目录与文件之权限意义](#21.4 目录与文件之权限意义)
      • [21.6 Linux 文件种类与扩展名](#21.6 Linux 文件种类与扩展名)
        • 文件种类:
        • [Linux 文件扩展名](#Linux 文件扩展名)
        • [Linux 文件长度限制](#Linux 文件长度限制)
        • [Linux 文件名的限制](#Linux 文件名的限制)
      • [21.7 Linux 目录配置](#21.7 Linux 目录配置)
        • [Linux 目录配置的依据--FHS](#Linux 目录配置的依据--FHS)
        • [根目录 (/) 的意义与内容](#根目录 (/) 的意义与内容)
        • [/usr 的意义与内容](#/usr 的意义与内容)
        • [/var 的意义与内容](#/var 的意义与内容)
        • [针对 FHS,各家 distributions 的异同,与 CentOS7 的变化](#针对 FHS,各家 distributions 的异同,与 CentOS7 的变化)
        • [目录树(directory tree)](#目录树(directory tree))

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

二十一. Linux 的文件权限与目录配置

Linux 最优秀的地方之一就在于他的多人多任务环境。而为了让各个使用者具有较保密的文件数据,因此文件的权限管理就变的很重要了。 Linux 一般将文件可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有read/write/execute 等权限。若管理不当,你的 Linux 主机将会变的很『不苏湖!@_@』。另外,你如果首次接触 Linux 的话,那么, 在 Linux 底下这么多的目录/文件,到底每个目录/文件代表什么意义呢?底下我们就来一一介绍呢!

21.1 使用者与群组

属主(文件拥有者)

由于 Linux 是个多人多任务的系统,因此可能常常会有多人同时使用这部主机来进行工作的情况发生, 为了考虑每个人的隐私权以

及每个人喜好的工作环境,因此,这个『文件拥有者』的角色就显的相当的重要了!

当文件设定成『只有文件拥有者,就是我,才能看与修改这个文件的内容』, 那么即使其他人知道你有这个相当『有趣』的文件,不过由于你有设定适当的权限, 所以其他人自然也就无法知道该文件的内容啰!

属组(群组概念)

在 Linux 底下这样的限制是很简单啦!我可以经由简易的文件权限设定,就能限制非自己团队(亦即是群组啰) 的其他人不能够阅览内容啰!而且亦可以让自己的团队成员可以修改我所建立的文件! 同时,如果我自己还有私人隐密的文件,仍然可以设定成让自己的团队成员也看不到我的文件数据。

每个账号都可以有多个群组的支持呢!

举例:假设有一家人,家里只有三兄弟,分别是王大毛、王二毛与王三毛三个人, 而这个家庭是登记在王大毛的名下的!所以,『王大毛家有三个人,分别是王大毛、王二毛与王三毛』, 而且这三个人都有自己的房间,并且共同拥有一个客厅喔!

  • 使用者的意义:由于王家三人各自拥有自己的房间,所以, 王二毛虽然可以进入王三毛的房间,但是二毛不能翻三毛的抽屉喔!那样会被三毛 K 的! 因为抽屉里面可能有三毛自己私人的东西,例如情书啦,日记啦等等的,这是『私人的空间』,所以当然不能让二毛拿啰!
  • 群组的概念:由于共同拥有客厅,所以王家三兄弟可以在客厅打开电视机啦、 翻阅报纸啦、坐在沙发上面发呆啦等等的! 反正,只要是在客厅的玩意儿,三兄弟都可以使用喔! 因为大家都是一家人嘛!

这样说来应该有点晓得了喔!那个『王大毛家』就是所谓的『群组』啰, 至于三兄弟就是分别为三个『使用者』,而这三个使用者是在同一个群组里面的喔! 而三个使用者虽然在同一群组内,但是我们可以设定『权限』, 好让某些用户个人的信息不被群组的拥有者查询,以保有个人『私人的空间』啦! 而设定群组共享,则可让大家共同分享喔!

其他人的概念

这个文档和哪些用户没有任何的关系,此时那些用户就是其他人的范畴

root(万能的天神)

不过,这里有个特殊的人物要来介绍的,那就是『万能的天神』!这个天神具有无限的神力, 所以他可以到达任何他想要去的地方,呵呵!那个人在 Linux 系统中的身份代号是『 root 』啦!所以要小心喔!那个root 可是『万能的天神』喔!

Linux 用户身份与群组记录的文件

在我们 Linux 系统当中,默认的情况下,所有的系统上的账号与一般身份使用者,还有那个 root 的相关信息,都是记录在/etc/passwd 这个文件内的。至于个人的密码则是记录在/etc/shadow 这个文件下。此外,Linux 所有的组名都纪录在/etc/group 内!这三个文件可以说是 Linux 系统里面账号、密码、群组信息的集中地啰! 不要随便删除这三个文件啊! ^_^

bash 复制代码
[root@node-135 bin]# head -3  /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@node-135 bin]# head -3  /etc/shadow
root:$6$CxTq1OkkZPBr3c.8$mQEBysixMLtVF2I7vwH/78y0Kl3wT0n7PRVINuFPRWLPiyZZObH8fpC8ZgSu9AaetwuEf/zqNkuN99cUVIrzu1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
[root@node-135 bin]# head -3  /etc/group
root:x:0:
bin:x:1:
daemon:x:2:

21.2 Linux 文件权限概念

文件的权限主要针对这些所谓的『使用者』与『群组』来设定

Linux 文件属性

bash 复制代码
[root@study ~]# ls -al
total 48
...
drwxr-xr-x. 3 		root 		root 	17 			May 6 00:14 .config <=范例说明处
-rw-r--r--. 1 		root 		root 	1864 		May 4 18:01 initial-setup-ks.cfg <=范例说明处
[ 1 ]		[ 2 ]	[ 3 ]		[ 4 ]	[ 5 ]		[ 6 ] 			[ 7 ]
[ 权限 ]		[连结]	[拥有者]		[群组]	[文件容量]	[ 修改日期 ] 	[ 檔名 ]
  • 第一栏代表这个文件的类型与权限(permission)

    仔细看的话,你应该可以发现这一栏其实共有十个字符

    第一个字符代表这个文件是『目录、文件或链接文件等等』:

    • 当为[ d ]则是目录,例如上表档名为『.config』的那一行;
    • 当为[ - ]则是文件,例如上表档名为『initial-setup-ks.cfg』那一行;
    • 若是[ l ]则表示为连结档(link file);
    • 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
    • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

    接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[-]而已。

    • 第一组为『文件拥有者可具备的权限』,以『initial-setup-ks.cfg』那个文件为例, 该文件的拥有者可以读写,但不可执行;
    • 第二组为『加入此群组之账号的权限』;
    • 第三组为『非本人且没有加入本群组之其他账号的权限』

请你特别注意喔!不论是那一组权限,基本上,都是『针对某些账号来设计的权限』喔!以群组来说,他规范的是『加入这个群组的账号具有什么样的权限』之意, 以学校社团为例,假设学校有个童军社的社团办公室,『加入童军社的同学就可以进出社办』,主角是『学生(账号)』而不是童军社本身喔!这样可以理解吗?
细心的小伙伴一定还注意到了第一栏的第十一个字符:点(.),这个.是RedHat家族的linux系统(例如centos)所特有的,表示:该文件存在"SELinux的安全标签"。当关闭了selinux,这时候新建一个文件,发现文件权限后面的小点没了,和我们平时看到的文件权限一样,正常了。但当开启时已存在或者新创建的文件,无论selinux是否开启,.都是存在的。SELinux全称Security-Enhanced Linux,是一种访问控制体系,可以"简单的"理解为更安全的linux系统。"更安全"必然是有代价的,包括访问限制,权限限制等等,所以大多数情况下,我们都选择关闭,毕竟不需要那么"安全",或者有其他杀软保证相对安全就可以了。

  • 第二栏表示有多少档名连结到此节点(i-node):

    每个文件都会将他的权限与属性记录到文件系统的 i-node 中,不过,我们使用的目录树却是使用文件名来记录, 因此每个档名就会连结到一个 i-node 啰!这个属性记录的,就是有多少不同的档名连结到相同的一个 i-node 号码去就是了。

  • 第三栏表示这个文件(或目录)的『拥有者账号』

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

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

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

    这一栏的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。

    bash 复制代码
    [root@study ~]# ll /etc/services /root/initial-setup-ks.cfg
    -rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
    -rw-r--r--. 1 root root 1864 May 4 18:01 /root/initial-setup-ks.cfg
    # 如上所示,/etc/services 为 2013 年所修改过的文件,离现在太远之故,所以只显示年份;
    # 至于 /root/initial-setup-ks.cfg 是今年 (2015) 所建立的,所以就显示完整的时间了。
    
    [root@node-135 /]# ll --full-time
    ...
    drwxr-xr-x.   2 root root    6 2018-04-11 12:59:55.000000000 +0800 media
    drwxr-xr-x.   3 root root   36 2023-08-01 10:30:13.110995188 +0800 mnt

    ls -l --full-time』就能够显示出完整的时间格式了!包括年、月、日、时间喔。 另外,如果你当初是以繁体中文安装你的 Linux 系统,那么日期字段将会以中文来显示。 可惜的是,中文并没有办法在纯文本的终端机模式中正确的显示,所以此栏会变成乱码。 那你就得要使用『export LC_ALL=en_US.utf8』来修改语系喔!

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

    比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏档』

Linux 文件权限的重要性

与 Windows 系统不一样的是,在 Linux 系统当中,每一个文件都多加了很多的属性进来,尤其是群组的概念,这样有什么用途呢? 其实,最大的用途是在『数据安全性』上面的。

  • 系统保护的功能
  • 团队开发软件或数据共享的功能
  • 未将权限设定妥当的危害

21.3 如何改变文件属性与权限

我们先介绍几个常用于群组、拥有者、各种身份的权限之修改的指令,如下所示:

  • chgrp :改变文件所属群组
  • chown :改变文件拥有者
  • chmod :改变文件的权限, SUID, SGID, SBIT 等等的特性

改变所属群组, chgrp

这个指令就是 change group 的缩写嘛!要被改变的组名必须要在/etc/group 文件内存在才行,否则就会显示错误!

bash 复制代码
[root@study ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
bash 复制代码
# 范例:
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg
[root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group: `testing' <== 发生错误讯息啰~找不到这个群组名~

改变文件拥有者, chown

改变拥有者就是 change owner 啰!用户必须是已经存在系统中的账号,也就是在/etc/passwd 这个文件中有纪录的用户名称才能改变。

bash 复制代码
[root@study ~]# chown [-R] 账号名称 文件或目录
[root@study ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
bash 复制代码
# 范例:将 initial-setup-ks.cfg 的拥有者改为 bin 这个账号:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg

#范例:将 initial-setup-ks.cfg 的拥有者与群组改回为 root:
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg

事实上,chown 也可以使用『chown user.group file』,亦即在拥有者与群组间加上小数点『 . 』也行! 不过很多朋友设定账号时,喜欢在账号当中加入小数点(例如 vbird.tsai 这样的账号格式),这就会造成系统的误判了! 所以我们比较建议使用冒号『:』来隔开拥有者与群组啦!此外,chown 也能单纯的修改所属群组呢! 例如『chown .sshd initial-setup-ks.cfg』就是修改群组~看到了吗?就是那个小数点的用途!

那么什么时候要使用 chown 或 chgrp 呢?

以cp指令为例,简单说明:

bash 复制代码
[root@study ~]# cp 来源文件 目标文件
[root@study ~]# cp .bashrc .bashrc_test
[root@study ~]# ls -al .bashrc*
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
-rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test <==新文件的属性没变

由于复制行为(cp)会复制执行者的属性与权限,所以!怎么办?.bashrc_test 还是属于 root 所拥有, 如此一来,即使你将文件拿给 bin 这个使用者了,那他仍然无法修改的(看属性/权限就知道了吧), 所以你就必须要将这个文件的拥有者与群组修改一下啰!知道如何修改了吧?

改变权限, chmod

文件权限的改变使用的是 chmod 这个指令,但是,权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。我们就来谈一谈:

  • 数字类型改变文件权限

    文件的权限字符为:『-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
    
    bash 复制代码
    [root@study ~]# chmod [-R] xyz 文件或目录
    选项与参数:
    xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
    -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
    bash 复制代码
    [root@study ~]# ls -al .bashrc
    -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
    [root@study ~]# chmod 777 .bashrc
    [root@study ~]# ls -al .bashrc
    -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc
  • 符号类型改变文件权限

    从之前的介绍中我们可以发现,基本上就九个权限分别是(1)user (2)group (3)others 三种身份啦!那么我们就可以藉由u, g, o来代表三种身份的权限!此外,a则代表 all 亦即全部的身份!那么读写的权限就可以写成 r, w, x 啰!也就是可以使用底下的方式来看:

命令 选项 类型 权限 文件
chmod u g o a +(加入) -(除去) =(设定) r w x 文件或目录

来实作一下吧!假如我们要『设定』一个文件的权限成为『-rwxr-xr-x』时,基本上就是:

  • user (u):具有可读、可写、可执行的权限;
  • group 与 others (g/o):具有可读与执行的权限。
bash 复制代码
[root@study ~]# chmod u=rwx,go=rx .bashrc
# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格符!
[root@study ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod a+w .bashrc
[root@study ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod a-x .bashrc
[root@study ~]# ls -al .bashrc
-rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod 644 .bashrc # 测试完毕得要改回来喔!

那么假如是『-rwxr-xr--』这样的权限呢?可以使用『chmod u=rwx,g=rx,o=r filename』来设定。

21.4 目录与文件之权限意义

权限对文件的重要性

文件是实际含有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件(binary program)等等。 因此,权限对于文件来说,他的意义是这样的:

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

可执行(x)这里你就必须要小心啦! 因为在Windows 底下一个文件是否具有执行的能力是藉由『 扩展名 』来判断的, 例如:.exe, .bat, .com 等等,但是在 Linux 底下,我们的文件是否能被执行,则是藉由是否具有『x』这个权限来决定的!跟档名是没有绝对的关系的!

当你对一个文件具有 w 权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!对于文件的 rwx 来说, 主要都是针对『文件的内容』而言,与文件档名的存在与否没有关系喔!因为文件记录的是实际的数据嘛!

如果当前用户要删除他用户的文件,需要具备至少什么权限呢?

对文件需要有全部权限:-rwxr-xrwx

对文件所在目录有写权限:-rwxr-x-wx

权限对目录的重要性

文件是存放实际数据的所在,那么目录主要是储存啥玩意啊?目录主要的内容在记录文件名列表,文件名与目录有强烈的关连啦! 所以如果是针对目录时,那个 r, w, x 对目录是什么意义呢?

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

  • w (modify contents of directory):

    这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构列表的权限,也就是底下这些权限:

    • 建立新的文件与目录
    • 删除已经存在的文件与目录(不论该文件的权限为何!)
    • 将已存在的文件或目录进行更名
    • 搬移该目录内的文件、目录位置
  • x (access directory):

    咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的 x 代表的是用户能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登入 Linux 时, 你所在的家目录就是你当下的工作目录。而变换目录的指令是『cd』(change directory)啰!

组件 内容 迭代物件 r w x
文件 详细资料 data 文件文件夹 读到文件内容 修改文件内容
目录 檔名 可分类抽屉 读到档名 修改檔名 进入该目录的权限(key)

你可以看到,对一般文件来说,rwx 主要是针对『文件的内容』来设计权限,对目录来说,rwx 则是针对『目录内的文件名列表』来设计权限。

其中最有趣的大概就属目录的 x 权限了!『档名怎么执行』?没道理嘛!其实,这个 x 权限设计,就相当于『该目录,也就是该抽屉的 "钥匙" 』啦! 没有钥匙你怎么能够打开抽屉呢?对吧!

能不能进入某一个目录,只与该目录的 x 权限有关啦!此外, 工作目录对于指令的执行是非常重要的,如果你在某目录下不具有 x 的权限, 那么你就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的 r 或 w 的权限

要开放目录给任何人浏览时,应该至少也要给予 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 这个文件!

上述的例子解释是这样的,假设有个莫名其妙的人,拿着一个完全密封的文件夹放到你的办公室抽屉中,因为完全密封你也打不开、看不到这个文件夹
的内部数据(对文件来说,你没有权限)。 但是因为这个文件夹是放在你的抽屉中,你当然可以拿出/放入任何数据在这个抽屉中(对目录来说,你具有所有
权限)。 所以,情况就是:你打开抽屉、拿出这个没办法看到的文件夹、将他丢到走廊上的垃圾桶!搞定了 (顺利删除!)!

用户操作功能与权限

假设两个档名,分别是底下这样:

  • /dir1/file1
  • /dir2

分别需要『哪些最小的权限』才能达成各项任务?

操作动作 /dir1 /dir1/file1 /dir2 重点
读取file1内容 x r - 要能够进入/dir1才能读到里面的文件数据!
修改file1内容 x rw - 能够进入/dir1且修改file1才行!
执行file1内容 x rx - 能够进入/dir1且file1能运作才行!
删除file1文件 wx - - 能够进入/dir1具有目录修改的权限即可!
将file1复制到/dir2 x r wx 要能够读file1且能够修改/dir2内的数据

你可能会问,上面的表格当中,很多时候 /dir1 都不必有 r 耶!为啥?我们知道 /dir1 是个目录,也是个抽屉!那个抽屉的 r 代表『这个抽屉里面有灯光』, 所以你能看到的抽屉内的所有文件夹名称 (非内容)。但你已经知道里面的文件夹放在哪个地方,那,有没有灯光有差嘛?你还是可以摸黑拿到该文件夹的!对吧! 因此,上面很多动作中,你只要具有 x 即可!r 是非必备的!只是,没有r 的话,使用 [tab] 时,他就无法自动帮你补齐档名了!这样理解乎?

21.6 Linux 文件种类与扩展名

文件种类:

  • 正规文件 (regular file ),[-]

    就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如[-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:

    • 纯文本档(ASCII)
    • 二进制文件(binary)
    • 数据格式文件(data)
      有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的 Linux 在使用者登入时,都会将登录的数据记录在 /var/log/wtmp 那个文件内,该文件是一个 data file,他能够透过 last 这个指令读出来! 但是使用 cat 时,会读出乱码~因为他是属于一种特殊格式的文件。瞭乎?
  • 目录(directory),[ d ]

  • 连结档(link), [ l ]

  • 设备与装置文件(device),[b] [c]

    • 区块(block)设备档:就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦!
    • 字符(character)设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出。
  • 资料接口文件(sockets),[ s ]

  • 数据输送文件(FIFO, pipe),[p]

    FIFO 也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。

Linux 文件扩展名

基本上,Linux 的文件是没有所谓的『扩展名』的,我们刚刚就谈过,一个 Linux 文件能不能被执行,与他的第一栏的十个属性有关, 与文件名根本一点关系也没有。这个观念跟 Windows 的情况不相同喔!在 Windows 底下, 能被执行的文件扩展名通常是 .com .exe .bat 等等,而在 Linux 底下,只要你的权限当中具有 x 的话,例如[ -rwxr-xr-x ] 即代表这个文件具有可以被执行的能力喔!

具有『可执行的权限』以及『具有可执行的程序代码』是两回事!在 Linux 底下,你可以让一个文本文件,例如我们之前写的 text.txt 具有『可执行的权限』 (加入 x 权限即可), 但是这个文件明显的无法执行,因为他不具备可执行的程序代码!而如果你将上面提到的 cat 这个可以执行的指令,将他的 x 拿掉,那么 cat 将无法被你执行!

我们仍然希望可以藉由扩展名来了解该文件是什么东西,所以, 通常我们还是会以适当的扩展名来表示该文件是什么种类的。底下有数种常用的扩展名:

  • *.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用 shell 写成的,所以扩展名就编成 .sh 啰;
  • *Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名啰!
  • *.html, *.php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件啰! .html 的文件可使用网页浏览器来直接开启,至于 .php 的文件, 则可以透过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果呢!

基本上,Linux 系统上的文件名真的只是让你了解该文件可能的用途而已, 真正的执行与否仍然需要权限的规范才行!例如虽然有一个文件为可执行文件, 如常见的/bin/ls 这个显示文件属性的指令,不过,如果这个文件的权限被修改成无法执行时, 那么 ls 就变成不能执行啰!

上述的这种问题最常发生在文件传送的过程中。例如你在网络上下载一个可执行文件,但是偏偏在你的 Linux 系统中就是无法执行!呵呵!那么就是可能文件的属性被改变了!不要怀疑,从网络上传送到你的 Linux 系统中,文件的属性与权限确实是会被改变的喔!

Linux 文件长度限制

在 Linux 底下,使用传统的 Ext2/Ext3/Ext4 文件系统以及近来被 CentOS 7 当作预设文件系统的 xfs 而言,针对文件的档名长度限制为:

  • 单一文件或目录的最大容许文件名255bytes,以一个 ASCII 英文占用一个 bytes 来说,则大约可达 255 个字符长度。若是以每个中文字占用 2bytes 来说, 最大档名就是大约在 128 个中文字之谱!

Linux 文件名的限制

由于 Linux 在文字接口下的一些指令操作关系,一般来说,你在设定 Linux 底下的文件名时, 最好可以避免一些特殊字符比较好!例如底下这些:

bash 复制代码
* ? > < ; & ! [ ] | \ ' " ` ( ) { }

因为这些符号在文字接口下,是有特殊意义的!另外,文件名的开头为小数点『.』时, 代表这个文件为『隐藏档』喔!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以你最好也避免将文件档名的开头以 - +来命名啊!

21.7 Linux 目录配置

Linux 目录配置的依据--FHS

Filesystem Hierarchy Standard (FHS)标准 ,主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循 FHS 的标准。 也就是说,FHS 的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为 Linux 操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

将目录定义成为四种交互作用的形态

可分享的(shareable) 不可分享的(unshareable)
不变的(static) /usr (软件放置处) /etc (配置文件) /opt (第三方协力软件) /boot (开机与核心档)
可变动的(variable) /var/mail (使用者邮件信箱) /var/run (程序相关) /var/spool/news (新闻组) /var/lock (程序相关)
  • 可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;
  • 不可分享的:自己机器上面运作的装置文件或者是与程序有关的 socket 文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
  • 不变的:有些数据是不会经常变动的,跟随着 distribution 而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等;
  • 可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。

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

  • / (root, 根目录):与开机系统有关;
  • /usr (unix software resource):与软件安装/执行有关;
  • /var (variable):与系统运作过程有关。

这个root在 Linux 里面的意义真的很多很多~多到让人搞不懂那是啥玩意儿。 如果以『账号』的角度来看,所谓的 root 指的是『系统管理员!』的身份, 如果以『目录』的角度来看,所谓的 root 意即指的是根目录,就是/啦~ 要特别留意喔!

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

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在 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, /etc/issue 等等。另外 FHS 还规范几个重要的目录最好要存在 /etc/ 目录下喔: - /etc/opt(必要):这个目录在放置第三方协力软件 /opt 的相关配置文件 - /etc/X11/(建议):与 X Window 有关的各种配置文件都在这里,尤其是 xorg.conf 这个 X Server 的配置文件。 - /etc/sgml/(建议):与 SGML 格式有关的各项配置文件 - /etc/xml/(建议):与 XML 格式有关的各项配置文件
/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 下的数据都删除唷!
/usr 第二层 FHS 设定,后续介绍
/var 第二曾 FHS 设定,主要为放置变动性的数据,后续介绍

第二部份:FHS 建议可以存在的目录

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

事实上 FHS 针对根目录所定义的标准就仅有上面的咚咚,不过我们的 Linux 底下还有许多目录你也需要了解一下的。 底下是几个在 Linux 当中也是非常重要的目录喔:
第三部份:非FHS 建议的重要目录

目录 应放置文件内容
/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/ 主要放置只读架构的数据文件,当然也包括共享文件。在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文本文件嘛!在此目录下常见的还有这些次目录: - /usr/share/man:联机帮助文件 - /usr/share/doc:软件杂项的文件说明 - /usr/share/zoneinfo:与时区有关的时区文件

第二部份:FHS 建议可以存在的目录

目录 应放置文件内容
/usr/games/ 与游戏比较相关的数据放置处
/usr/include/ c/c++等程序语言的档头(header)与包含档(include)放置处,当我们以 tarball 方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档喔!
/usr/libexec/ 某些不被一般使用者惯用的执行档或脚本(script)等等,都会放置在此目录中。例如大部分的 X 窗口底下的操作指令, 很多都是放在此目录下的。
/usr/lib/ 与 /lib/功能相同,因此目前 /lib 就是链接到此目录中
/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/目录中!

建议在你读完整个基础篇之后,可以挑战 FHS 官方英文文件,相信会让你对于Linux 操作系统的目录有更深入的了解喔!

针对 FHS,各家 distributions 的异同,与 CentOS7 的变化

由于 FHS 仅是定义出最上层(/)及次层(/usr, /var)的目录内容应该要放置的文件或目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。举例来说,CentOS 的网络设定数据放在/etc/sysconfig/network-scripts/ 目录下,但是 SuSE 则是将网络放置在 /etc/sysconfig/network/ 目录下,目录名称可是不同的呢!不过只要记住大致的 FHS 标准,差异性其实有限啦

CentOS 7 在目录的编排上与过去的版本不同喔!

  • /bin --> /usr/bin
  • /sbin --> /usr/sbin
  • /lib --> /usr/lib
  • /lib64 --> /usr/lib64
  • /var/lock --> /run/lock
  • /var/run --> /run

目录树(directory tree)

所有的文件与目录都是由根目录开始的!那是所有目录与文件的源头~ 然后再一个一个的分支下来,有点像是树枝状啊~因此,我们也称这种目录配置方式为:『目录树(directory tree)』 这个目录树有什么特性呢?他主要的特性有:

  • 目录树的启始点为根目录 (/, root);
  • 每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。
  • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

相关推荐
Elihuss2 小时前
ONVIF协议操作摄像头方法
开发语言·php
Swift社区5 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht5 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht5 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20245 小时前
Swift 数组
开发语言
stm 学习ing6 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc7 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe8 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin8 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python