关键词: Linux 文件权限 目录管理
0. 前言
相比于Windows的伪多用户环境,Linux从本质上才是服务于多用户的操作系统。多用户多任务操作系统要处理的问题之一,便是要对每个用户的数据进行分离和保密,由此产生了Linux文件权限的概念。同时,与Windows相比,Linux的文件目录管理的风格迥然不同。本文将对Linux的文件权限和目录管理的内容进行总结。
1. Linux的文件权限
1.1 用户与用户组的概念
Linux一般将文件的可存取访问的身份分为3个类别,分别是owner(文件所有者)、group(用户组)和others(其他人),且每种身份各有read、write和execute等权限。那么为什么Linux要将文件及其权限进行这样的划分?我们可以结合具体的应用场景,来体会Linux文件权限中”用户与用户组”所带来的方便。
设想一个实验室里只有一台主机,实验室里的每位同学都要使用这台机器来完成相关的科研任务。但是在科研之余,有些同学也会在这台主机上进行类似收发邮件等私人行为,在主机上保存一些私人信息。这时,用户(owner)的概念便体现出其优势。比如同学A不想让别人访问自己保存在主机的邮件文件,同学A只需将此邮件文件的权限设定为只有自己可查看和修改即可,其他同学便无法访问同学A的邮件文件。同时,学校里举办了一次大数据比赛,实验室里的同学都各自组队参赛。每组同学都需要借用实验室主机来进行数据处理,用户组(group)便能实现每个小组的比赛代码分离的功能。同学A、B、C组成的小组1,只需将他们的比赛代码的用户组限定为小组1,其他小组便不可访问小组1的比赛代码。同时,小组1也无法访问其他小组的比赛代码,由此实现了每个用户组之间的隔离。
不过,在Linux中,存在一个”上帝视角”的身份–root。它的角色可以理解为实验室的教授,他有着对主机资源的完全控制权。他既可以访问同学A的邮件文件,也可以访问所有参赛同学的代码。它在Linux中相当于有着绝对控制权的君王,所以在root权限下一定要谨慎操作,以防对系统造成不可恢复的损坏。
在Linux中,/etc/passwd里记录系统上的账号和root的相关信息,/etc/shadow记录个人的密码,/etc/group记录所有的组名。
1.2 Linux文件属性
通过ls -al
命令来查看文件属性。
1 | root@snowball-wang:~# ls -al |
- 第一列代表此文件的类型与权限
第一个字符代表这个文件是”目录、文件或链接文件等”。
字符 | 含义 |
---|---|
d | 目录 |
- | 文件 |
l | 链接文件(linkfile) |
b | 可供存储的接口设备 |
c | 串行端口设备 |
接下来的字符中,每三个一组,均为”rwx”的3个参数的组合。
- 第一组为”文件所有者的权限(owner)”
- 第二组为”同用户组的权限(group)”
- 第三组为”其他非本用户组的权限(others)”
- 第二列表示连接到此节点的文件名的数目
每个文件都会将它的权限与属性记录到文件系统的i-node中,这个属性记录的就是有多少不同的文件名连接到相同的i-node。
- 第三列表示此文件或目录的”所有者账号”
- 第四列表示此文件的所属用户组
- 第五列为此文件的容量大小,默认单位为B
- 第六列为此文件的创建文件日期或者是最近的修改日期
- 第七列为该文件名
文件名之前的”.”,表示此文件为”隐藏文件”。
1.3 改变文件属性与权限
- chgrp:改变文件所属用户组
- chown:改变文件所有者
- chmod:改变文件的权限
上述命令加上参数-R
表示进行递归地持续更改,即连同子目录下的所有文件、目录。chown
可以使用chown user.group file
命令来同时设置文件的所有者和用户组。
1.4 文件权限的两种类型
- 数字类型
权限 | 分数 |
---|---|
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。
- 符号类型
身份 | 操作 | 权限 |
---|---|---|
u | +(加入) | r |
g | -(减去) | w |
o | =(设置) | x |
a(所有) |
举例来说,当想要把一个文件的权限设置为”-rwxr-xr-x”,其命令为:1
2$chmod u=rwx,go=rx .bashrc
注意u=rwx,go=rx是连接在一起的,中间没有空格
1.5 目录权限概念的理解
- 目录的
r
权限表示具有读取目录结构列表的权限,也就是可以查询该目录下的文件名数据,可以通过ls
命令来显示列表内容。 - 目录的
w
权限表示用户具有更改该目录结构列表的权限,具体含义为:新建文件和目录
删除文件与目录
对已存在的文件或目录进行重命名
转移目录内的文件、目录位置 - 目录的
x
权限表示用户能否进入该目录成为工作目录,即可以通过cd
命令来切换工作目录。
举例来说:1
drwx------ 3 root root 4096 11月 30 08:51 .dbus
此文件夹的用户是root,作为用户snowball对此文件没有任何权限,也就是不能通过cd
命令切入进入目录。1
2snowballwang:~$ cd .dbus -
bash: cd: .dbus: Permission denied
2. Linux目录管理
2.1 Linux目录配置标准–FHS(Firesystem Hierarchy Standard)
FHS的目的在于规定每个目录下应该存放的数据。FHS根据文件系统使用的频繁与否将目录定义为四种交互形态:可分享的、不可分享的、可变动的、不可变动的。
FHS定义了以下三层目录的内容:
- /(root,根目录):与开机系统有关
- /usr(UNIX software resource):与软件安装/执行有关
- /var(variable):与系统运作过程有关
根目录是系统中最重要的一个目录,开机、还原、系统修复等操作都与根目录有关。根据FHS标准,根目录所在的分区应该越小越好,以防分区过大出现问题导致系统损坏。
2.2 FHS三层目录文件内容
- 根目录(/)
- /bin: /bin放置的是单用户维护模式下还能被操作的命令。如cat, chmod, chown, date, mv等常用命令,可被root和一般账号所使用。
- /boot:放置Linux内核文件以及开机菜单与开机所需配置文件等。
- /dev:任何设备与接口设备都是以文件的形式存在于这个目录当中。通过访问此目录下的某个文件,就等于访问某个设备。常见的有/dev/null(”黑洞”)、/dev/zero(初始化数据存储)等。
- /etc:放置系统主要的配置文件,如人员的账号密码文件、各种服务的起始文件。
- /etc/init.d/:放置所有服务的默认启动脚本。若要启动或者关闭iptables,其命令分别为”/etc/init.d/iptables start”、”/etc/init.d/iptables stop”。
- /etc/xinetd.d/:super daemon管理的各项文件的配置文件目录
- /home:系统默认的用户主文件夹。一般可以用
~
或~snowball
来表示(这里的snowball表示的是我的用户名)。 - /lib:/lib放置的是开机时会使用的函数库,以及在/bin或/sbin下面的命令才会调用的函数库。
- /media:放置的时可删除的设备。常见的有/media/cdrom,/media/floppy。
- /opt:第三方软件放置的目录。
- /root:系统管理员(root)的文件夹。
- /sbin:/sbin包含的是开机、修复、还原系统所需的命令。
- /srv:一些网络服务启动之后,服务所需要取用的数据目录。
- /tmp:用户暂时放置文件的目录,一般开机自动删除。
- /proc:此目录本身是一个虚拟文件系统(vitual filesystem),其数据保存在内存中,所以不占用硬盘空间。通常保留的数据是系统内核、进程、外部设备的状态及网络状态等。如/proc/cpuinfo。
需要注意的是,开机过程中仅有根目录会被挂载,其他分区是在开机完成之后再进行挂载。所以要将根目录下与开机过程有关的目录放置再通根目录一致的分区,包括:
- /etc:配置文件
- /bin:执行文件
- /dev:所需设备文件
- /lib:执行文件所需函数库与内核所需模块
- /sbin:系统执行文件
- /usr目录
/usr目录很容易被误解为是用户(user)目录,其实usr是UNIX Software Resource的缩写,是UNIX操作系统软件资源所放置的目录,类似于Windows系统的”C:\Program files\”。
- /usr/bin/:用户可使用的命令。
- /usr/include/:C/C++等程序语言头文件和包含文件。
- /usr/lib/:各应用软件的函数库、目标文件。
- /usr/local/:用户再本机自行下载安装的软件。
- /usr/sbin/:包含网络服务器软件的服务命令。
- /usr/share/:放置共享文件。
- /usr/src/:放置Linux内核源码。
- /var目录
相比于/usr里放置的是可分享不可变动的数据,/var针对的是经常变动的文件,主要目录有:
- /var/lock/:某些设备或文件一次只能被一个应用程序所使用,所以通过上锁的方式避免错误。
- /var/log/:登陆文件放置的目录。
- /var/run/:有些程序或服务启动后,将PID放置再目录下。