Linux 是多人多任务的环境,文件权限管理让各个用户具有保密的文件数据。Linux 一般将文件可读写的身份分为三个类别:拥有者(owner)、所属群组(group)、其他人(other),三种身份各有读(read)、写(write)、执行(execute)等权限。
用户与用户组
Linux 的用户有唯一的用户名和各自的登录口令,多个用户可以同时操作 Linux 系统。考虑每个用户的隐私和工作环境需求,文件拥有者的角色就十分重要。用户可以将自己的文件设置成只有自己才能查看与修改,这样就算别人知道这个文件的存在也没有权限去访问。
用户组是具有相同特征用户的逻辑集合。用户组的用户具有所属用户组的权限。每个用户都可以有多个用户组的支持。其他人是不属于用户组的用户。每个文件的拥有者、用户组与其他人的关系如下。
User1 的文件的拥有者为 User1,这个文件属于 Group1用户组,User2 可以共享组内 User1 的文件。User3 对于 User1 就是陌生人,无法访问 User1 的文件。root 虽然是 User1 的陌生人,但仍可以访问 User1 的文件。
默认情况下,所有系统上的账号和一般身份用户,以及 root 的信息都记录在 /etc/passwd
文件内,个人密码会记录在 /etc/shadow
文件内,所有的组名记录在 /etc/group
中。这三个文件不要随便删除。
文件属性
了解 Linux 的文件属性,有个常用的命令 ls
,执行 ls -al
后,会列出当前所有的文件的详细权限与属性(包括以 .
开头的隐藏文件)。
以框选的文件 .bashrc
为例,接下来看看每一栏都有什么含义。
-
第一栏表示文件的类型和权限
第一个字符代表文件是目录、文件或链接文件等。如果为d
代表目录,如.
就是一个目录。如果为-
代表文件,如.bashrc
文件。若是|
表示链接文件。若是b
表示设备文件里的可供存储的周边设备。若是c
表示设备文件的串行端口设备,如键盘鼠标等。
接下来的字符三个为一组,以rwx
的参数组合,其中r
代表可读,w
代表可写,x
代表可执行。这三个权限的位置不会改变。如果没有权限,就会出现-
。例如上表的文件权限,文件拥有者可以读写而不能执行,文件所属用户组和其他人只能读,不能写和执行。 -
第二栏表示有多少文件链接到此节点(inode)
每个文件都会将它的权限和属性记录到文件系统的 inode 中,由于目录树使用的是文件名记录,因此每个文件名都会连接到一个 inode。这个属性记录的就是有多少不同的文件名链接到相同的一个 inode 号码。 -
第三栏表示这个文件或目录的拥有者
-
第四栏表示这个文件的所属用户组
-
第五栏为这个文件的容量大小
-
第六栏为这个文件的创建日期或最近的修改日期
这一栏的内容为日期(月/日)及时间。如果文件被修改的时间离现在太久,时间部分会仅显示年份。 -
第七栏为文件名
如果文件名前多一个.
,就代表这个文件为隐藏文件。使用ls
指令不会显示隐藏文件。
这些文件属性的最大用途是在数据安全性上。系统服务的文件通常只有 root 才能进行读写或执行,例如/etc/shadow
管理了系统中的账号数据,只有 root 才能获取文件内容,所以文件权限为 ----------
。root 基本不受系统的权限限制,所以可以进行读写。
修改文件属性与权限
chgrp
想要修改一个文件的用户组,可以直接使用 chgrp
命令来修改(change group)。被修改的组名必须要在 etc/group
文件中才行,否则会报错。
chgrp [-R] dirname/filename ...
选项与参数:
-R :进行递归修改,即连同子目录下的所有文件、目录都更新成这个用户组
如果要将目录下的 .bash_history
用户组设置为 group1,可以执行命令 chgrp group1 .bash_history
。
chown
chown 可以修改文件的拥有者(change owner),用户必须是系统中已经存在的账号。chown 命令还可以修改文件的用户组。
chown [-R] 账号名称 文件或目录
chown [-R] 账号名称:用户组名称 文件或目录
选项与参数:
-R :进行递归修改,即连同子目录下的所有文件都修改
将 .bash_history
的拥有者修改为用户 wcy
,执行 chown wcy .bash_history
。
再将 .bash_history
的拥有者和用户组改回 root
,执行 chown root:root .bash_history
。
chmod
文件权限的修改使用的是 chmod
命令。可以使用数字或符号来进行权限的修改。
- 数字类型修改文件权限
chmod [-R] xyz 文件或目录
选项与参数:
xyz :数字类型的权限属性,为 rwx 属性数值的相加
-R :进行递归修改,即连同子目录下的所有文件都修改
前面提到过文件的类型和权限数据是 -rwxrwxrwx
的形式,权限数据中的九个权限每三个一组,可以用数字来表示各个权限: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
。若是要将 .bash_history
的权限改为 770
,可以执行 chmod 770 .bash_history
。
- 符号类型修改文件权限
权限数据分别是 user,group 和 others 三种身份,可以借 u
,g
,o
来表示,再加上 a
来表示全部的身份。读写的权限就写成 r
,w
,x
。例如要设置 .bash_history
的文件权限为 -rwxr-xr-x
,u
具有rwx
的权限,g/o
具有 rx
的权限,可以执行 chmod u=rwx,go=rx .bash_history
。注意 u=rwx
与 go=rx
之间没有空格,通过 ,
相连。
如果要将 .bash_history
修改回 -rw-------
权限,也可以执行 chmod u-x,go-rwx .bash_history
。
目录与文件的权限意义
权限对于文件的重要性
文件是实际含有数据的地方,包括一般文本文件,数据库文件,二进制可执行文件等。权限对于文件的意义如下:
r(read) :可读取此文件的实际内容,如读取文本文件的文字内容。
w(write) :可以编辑,新增或是修改文件的内容(不包括删除该文件)。
x(execute) :具有可以被系统执行的权限。
Windows 下面的文件借由扩展名判断是否具有执行的能力,例如 .exe
, .bat。
但在 Linux 下,文件是否能被执行,是借由是否具有 x
权限来决定的,和文件名没有绝对的关系。对于文件的 rwx
来说,主要都是针对文件的内容而言。
权限对于目录的重要性
目录主要的内容在记录文件名列表,文件名与目录有强关联性。对于目录来说,rwx
对目录的意义如下:
r :表示具有读取目录结构列表的权限。当你具有该权限时,就可以用 ls 命令把该目录的内容列表显示出来。
w :表示具有改动该目录结构列表的权限,也就是下面的权限。
建立新的文件或目录
删除已经存在的文件或目录
将已经存在的文件或目录进行更名
移动该目录内的文件、目录位置
x :表示用户能否进入该目录成为工作目录(当前目录)。
关于文件和目录的权限也可以用下面的表格理解。
例如如果要修改目录下某个文件的内容,需要先切换到该目录下执行命令,这时需要具备目录的 x
权限和文件的 rw
权限。如果是删除文件,则需要目录的 wx
权限,与文件权限无关。
Linux 文件种类与扩展名
文件种类
-
常规文件
一般进行读写类型的文件,文件属性为-
。文件根据内容可以大概分成纯文本文件,二进制文件,数据文件。
纯文本文件:Linux 系统最多的一种文件类型。可以直接从文件中读出数据,例如数字、字母等。执行cat
命令就可以看到文件的内容。
二进制文件:计算机系统只能识别并执行二进制文件,Linux 中的可执行文件就是这种格式,例如命令cat
就是一个二进制文件。
数据文件:有些程序运行时会读取特定格式的文件,这些文件可以被称为数据文件。例如登录 Linux 时,登录的数据会记录在/var/log/wtmp
中,该文件是一个数据文件。通过last /var/log/wtmp
可以读出该文件的数据,但执行cat /var/log/wtmp
会读出乱码。 -
目录
目录是一个特殊的文件,保存了文件的索引。文件属性为d
。 -
链接文件
类似于快捷方式,文件属性为l
。 -
设备与设备文件
与系统设备及存储相关的文件。通常集中在 /dev 文件夹下,通常分为区块设备文件和字符设备文件。
区块设备文件:就是一些存储数据,以提供系统随机存取的接口设备,可以随机地在不同区块进行读写,例如硬盘和软盘等。文件属性为b
。
字符设备文件:一些串行端口的接口设备,例如键盘,鼠标等。这些设备以字符流方式被访问。文件属性为c
。 -
数据接口文件
常用在网络上的数据交换,应用程序可以借 socket 发送或接收数据。常在/run
和/tmp
下。文件属性为s
。 -
数据输送文件
FIFO 或管道文件,目的是解决多个程序同时读写一个文件造成的错误问题。文件属性为p
。
文件扩展名
Linux 文件没有所谓的扩展名,一个 Linux 文件能不能被执行,与它的属性有关,和文件名没有关系。如果权限为 x
,就代表文件具有可以被执行的能力。但有可执行的权限和具有可执行的程序代码又是两码事了。通常处理文件还是会以适当的扩展名表示文件的种类。
文件名长度限制
Linux 下对传统的 ext2,ext3,ext4 文件系统和 xfs 文件系统而言,单一文件或目录的最大文件名为 255 字节,一个 ASCII 英文占一个字节,一个汉字占两个字节。
文件名限制
由于命令行模式的命令操作,设置文件名最好避免 *
?
<
>
;
&
!
{
}
|
\
'
"
(
)
[
]
`
。文件名开头最好避免 .
-
+
,.
是隐藏文件的前缀,-option
之类的选项常会用到 -
+
。
FHS
Filesystem Hierarchy Standard(FHS)标准是 Linux 文件目录配置的依据,它的主要目标是希望让用户可以了解到已安装软件通常放置于哪个目录下,所以它希望独立的软件开发商、操作系统制作者以及想要维护的用户都能够遵循 FHS的标准。
FHS 根据文件系统使用的频繁与否与是否允许用户随意更改,将目录定义成四种交互作用的形态:
- 可分享:可以分享给其他系统挂载使用的目录,包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录。
- 不可分享:自己机器上运行的设备文件或是与程序有关的 sockets 文件等,由于仅与自身机器有关,不适合分享给其他主机。
- 不变:不会经常变动的数据,例如函数库、文件说明、主机服务配置文件等。
- 可变动:经常修改的数据,例如日志文件、一般用户可自行接受的新闻组等。
以下是一些代表性的目录:
FHS 针对目录树架构仅定义出三层目录下应该放置什么数据:
/
(root):与启动系统相关。/usr
(unix software resource):与软件安装执行相关。/var
(variable):与系统运行相关。
根目录 / 的意义和内容
根目录是系统最重要的目录,所有的目录由根目录衍生,根目录也与启动、还原、系统修复等有关。FHS 标准建议:根目录所在分区应该越小越好,不但性能较佳,根目录所在的文件系统也较不容易发生问题。
HFS 要求必须存在的目录:
目录 | 应放置文件内容 |
---|---|
/bin | 放置单人维护模式下还能使用的命令,可以被 root 和一般账号使用,如:cat 、chown 、mkdir |
/boot | 放置启动会使用的文件,包括 Linux 内核文件以及启动选项与所需配置文件等 |
/dev | 设备与接口设备都是以文件的形式存放在这个项目,读写目录下的某些文件就等于读写某个设备 |
/etc | 系统主要的配置文件几乎都放在这个目录,一般用户可以查看各文件属性,但只有 root 能够修改 |
/lib | 放置系统启动时会用到的函数库,以及 /bin 和 /sbin 目录下的命令会调用的函数库 |
/media | 放置可删除的设备,包括软盘、光盘、DVD 等设备都暂时挂载于此 |
/mnt | 想要暂时挂载某些额外的设备可以放置到这个目录 |
/opt | 放置第三方辅助软件的目录 |
/run | 放置系统启动后产生的各项信息 |
/sbin | 启动过程需要的命令,包括启动、修复、还原系统的命令,如 fdisk 、ifconfig |
/srv | 网络服务启动后,需要使用的数据目录,如 WWW、FTP 等 |
/tmp | 一般用户或是正在执行的程序暂时放置文件的地方,不可放置重要数据 |
/usr | 放置 UNIX 操作系统的软件资源 |
/var | 放置经常性变动的文件,包括缓存、日志文件、程序文件等 |
FHS 建议存在的目录:
目录 | 应放置文件内容 |
---|---|
/home | 系统默认的用户家目录。新增一个一般用户账号时,默认的用户家目录都会规范到这里。家目录有两种代号:~ 代表当前用户的家目录,~wcy 代表用户 wcy 的家目录 |
/lib<qual> | 用来存放与 /lib 不同格式的二进制函数库,例如支持 64 位的 /lib64 函数库等 |
/root | 系统管理员的家目录 |
还有几个 Linux 当中也很重要的目录:
目录 | 应放置文件内容 |
---|---|
/lost+found | 使用标准的 ext2、ext3、ext4 文件系统格式时产生的目录,当文件系统发生错误时,将一些遗失的片段放在这个目录。如果使用的是 xfs 文件系统则不会存在这个目录 |
/proc | 这个目录本身是一个虚拟文件系统,放置的数据都在内存当中,如内核、进程信息等,本身不占硬盘空间 |
/sys | 和 /proc 类似,也是一个虚拟文件系统,记录内核与系统硬件信息内容,包括已加载的内核模块与内核检测到的硬件设备信息等,同样不占硬盘容量 |
早期 Linux 在设计时,若发生问题,恢复模式通常仅挂载根目录,因此有五个重要的目录被要求与根目录放置在一起,分别是 /etc
、/bin
、/dev
、/lib
、/sbin
。现在 Linux 发行版将许多非必要的文件移出了 /usr
外,/usr
越来越简洁,恢复模式也能同时挂载 /usr
,五大目录的限制已经被打破。
/usr 的意义和内容
usr 是 UNIX Software Resource 的缩写,是操作系统软件资源放置的目录,FHS 建议所有的软件开发者将他们的数据合理地放置到这个目录下的子目录。
HFS 要求必须存在的目录:
目录 | 应放置文件内容 |
---|---|
/usr/bin | 一般用户能够使用的命令都放在这里,FHS 要求此目录下不应有子目录 |
/usr/lib | 与 /lib 功能相同,/lib 链接到此目录 |
/usr/local | 系统管理员在本机安装自己下载的软件建议放到此处,便于管理 |
/usr/sbin | 非系统正常运行所需要的系统命令,如网络服务器软件的服务命令。/sbin 链接到此目录 |
/usr/share | 放置只读的数据文件,包括共享文件。此目录下常见的目录有 usr/share/man 、usr/share/doc |
FHS 建议可以存在的目录:
目录 | 应放置文件内容 |
---|---|
/usr/games | 与游戏相关的数据放置处 |
/usr/include | c/c++ 等程序语言的头文件与包含文件的放置处 |
/usr/libexec | 不被一般用户常用的执行文本或脚本,例如 X 窗口下的操作命令 |
/usr/lib<qual> | 与 /lib<qual> 文件相同,/lib<qual> 链接到此处 |
/usr/src | 一般源代码建议放置在这里 |
/var 的意义和内容
系统默认软件会安装在 /usr
下,所以 /usr
目录在系统刚安装完毕时会占用最多的硬盘容量。/var
主要针对经常性变动的文件,包括缓存、日志文件、程序文件等,在系统运行后才会逐渐占用硬盘容量。
HFS 要求必须存在的目录:
目录 | 应放置文件内容 |
---|---|
/var/cache | 应用程序运行过程中产生的一些缓存 |
/var/lib | 程序本身执行时,需要使用的数据文件放置的目录 |
/var/lock | 某些设备或文件资源一次只能被一个应用程序使用,因此要将该资源上锁确保只会被单一软件访问。此目录移动到了 /var/run 下 |
/var/log | 这是日志文件放置的目录,是十分重要的目录。重要的文件有 /var/log/messages ,/var/log/wtmp 等 |
/var/mail | 放置个人电子邮箱的目录。这个目录也被放置到 /var/spool/mail 目录下 |
/var/run | 某些程序或服务启动后,会将 PID 放置在这个目录,与 /run 相同。目录链接到 /run |
/var/spool | 通常放置一些队列数据,即排队等待其他应用程序使用的数据。数据使用后通常会删除 |
由于 FHS 仅定义出最上层 /
及次层 /usr
、/var
内的目录内容,因此在其他子目录层级内,可以由开发者自行配置。更多关于 FHS 的内容可以查看文档 fhs-3.0.pdf。
目录树
Linux 下,所有的文件和目录都是由根目录开始,像树枝一样分成一个一个的分支。这种目录配置方式也称目录树(directory tree),它的特性有:
- 目录树的起始点为根目录
/
- 每一个目录不止能使用本地分区的文件系统,也可以使用网络上的文件系统
- 每一个文件在此目录中的文件名(包含完整路径)都是独一无二的
绝对路径和相对路径
根据文件名的不同,可以将路径定义为绝对路径与相对路径。
- 绝对路径:由根目录
/
开始写起的文件名或目录名称,如/home/wcy
。 - 相对路径:相对于当前路径的写法,如:
./home/wcy
。相对路径中有两个特殊的目录:.
代表当前目录,..
代表上一层目录。