Linux文件权限与目录配置

6 阅读10分钟

文件

在Linux中,除了一般文件和目录文件外,任何设备也都是文件,包括数据接口也有专属的文件在负责。

文件种类

  • 常规文件(regular file):一般进行存取的类型的文件,大致包括:纯文本文件(ASCII),即内容可以为人类直接所读取的文件;二进制文件(binary),系统可识其内容并运行的文件,如可执行文件;数据格式文件(data),程序运行过程中使用到的具有特定格式的文件;
  • 目录(directory);
  • 链接文件(link),类似于快捷方式
  • 设备(device):与周边设备及存储等相关的文件,一般集中在/dev目录下,通常分为:区块(block)设备文件,即提供随机存取的周边设备,如硬盘;字符(character)周边设备,即一些序列埠的周边设备,如键盘、鼠标等;
  • 数据接口文件(sockets):通常用于网络数据的承接;
  • 数据输送文件(FIFO,pipe):用于解决多个程序同时存取一个文件造成的问题。

文件扩展名

Linux文件没有扩展名的概念,Linux文件类型只与其属性的第一个字符有关,文件的“.xxx”样式的后缀只用于辅助理解文件的可能用途,并不与文件类型直接相关。

文件名的限制

Ext2/Ext3/Ext4/xfs文件系统下,单一文件最大长度为255 Bytes(大约255个ASCII字符、128个中文字符);文件名不能包含:?><;&![]|\'"`(){} ;同时开头的"."代表隐藏文件,下达命令时常常使用"-"开头的选项,因此应当避免使用 .-+ 作为开头进行命名。

文件权限

文件使用者身份

Linux一般将文件可存取的身份分为3类:

  • 拥有者(Owner)
  • 群组(Group):一个群组内有多个账号,一个账号可以属于多个群组
  • 其他用户(Others):相对于群组内的用户而言,群组外的用户称为其他用户。

默认情况下,系统上的账号相关信息(包括root)记录在 /etc/passwd文件内;个人秘密记录在 /etc/shadow文件内;群组名称记录在 /etc/group文件内。

文件属性

查看文件列表命令:

// 查看当前目录下的所有文件及目录
lntmtnl@ubuntu:~$ ls

// 查看当前目录下的所有文件及目录,以及文件属性
lntmtnl@ubuntu:~$ ls -al
-rw-r--r--                 1                 lntmtnl              lntmtnl                  220                 1024  2019                examples.desktop
[文件类型权限]    [连接数]    [文件拥有者]    [文件所属群组]    [文件大小]    [文件最后修改日期]    [文件名称]
                                                                                                                      (Bytes)                                                     (前面有"."的为隐藏文件)

文件类型与权限:

第一个字符代表文件类型,包括:

  • d :目录
  • - :文件
  • l :链接文件
  • b :可随机存取设备
  • c :一次性读取设备,如鼠标、键盘
  • s:数据接口文件
  • p:数据输送文件

接下来每3个一组,均为 “rwx” 的三个参数组合, 三个组合分别代表拥有者、群组内账号、其他用户所具备的权限。其中权限包括:

  • r :可读(read),对于文件,可以读取文件的实际内容;对于目录,可以查看目录下的文件名称
  • w :可写(write),对于文件,可以编辑、新增或修改文件内容,不包含删除文件本身;对于目录,可以新增、删除、更名、移动该目录下的文件或目录;
  • x :可执行(execute),对于文件,可以被系统执行;对于目录,使用者可以进入该目录;
  • - :没有对应位置的权限。

3组权限都是对于账号进行设计的,如(567)位置为rwx代表加入这个群组的账号拥有读写执行权限。

连接数

每个文件都会将它的权限与属性记录到i-node中,由于目录树使用文件名进行记录,因此每个文件名会连接到一个i-node;连接数用于记录有多少个不同的文件名连接到一个相同的i-node。

文件权限的重要性

  • 系统保护:防止系统重要文件被非root用户访问
  • 团队开发或数据共享的功能
  • 未将权限设置妥当可能造成危害

改变文件属性与权限

改变文件属性与权限的指令需要系统管理员(root) 身份才能使用,因此使用 su- 命令切换到root身份,离开root则使用 exit 命令。

  • 改变文件所属群组
chgrp [-R] groupname dirname/filename
// 选项-R表示递归更改,即目录、次级目录下的所有文件、目录都更改为该群组
  • 改变文件拥有者
chown [-R] username dirname/filename

// 同时修改拥有者和群组
chown [-R] username:groupname dirname/filename

改变文件拥有者的操作一般会在复制文件给其他用户时用到

cp source target
chown username target
  • 改变权限

数字类型权限:

Linux文件的基本权限有9个,分别是owner/group/others有自己的rwx权限,每一位权限用一位二进制位表示,0代表无权限,1代表有权限,3个权限为一组转为十进制,如:

- rwxrwx---,转为二进制为:111111000 B,三个为一组转为十进制后:owner=111B=4+2+1=7;group=111B=4+2+1=7;others=000B=0+0+0=0。因此该文件的权限数字是770。

数字类型变更权限指令:

chmod [-R] 764 dir/file
// xyz为数字权限属性

符号类型权限:

用u、g、o代表user、group、others,a代表all,即所有身份,权限名称用rwx表示。

符号类型变更权限指令:

chmod [-R] u=rwx,go=rx dir/file

————————————————————————————————————

Linux目录配置

文件系统层次结构标准FHS

FSH的重点在于规范每个特定的目录下应该放置什么样的数据,根据文件系统使用的频繁与否、是否允许使用者随意更动,而将目录定义成4种交互形态:

  • 可分享的(shareable):可以分享给其他系统挂载使用的目录,包括可执行文件、使用者的邮件等;
  • 不可分享(unshareable):本机上允许的设备文件或者与程序有关的socket文件等,仅与自身机器相关;
  • 不变的(static):存储不会经常变的数据,如函数库、文件说明文件、主机服务配置文件等;
  • 可变动的(variable):存储经常改变的数据,如登陆文件、新闻群组文件等。

事实上,FHS针对目录树架构仅定义出3层目录应该放置的数据:

  • / (root,根目录):与开机系统有关;
  • /usr (unix software resource):与软件安装、执行有关,可分享、不可变动
  • /var (variable):与系统运行过程有关,可变动

根目录(/)

Linux系统所有的目录都是由根目录所衍生出来的,同时根目录中包含系统开机时特定的开机软件、核心文件、开机所需程序、函数库等文件数据,也包含系统出现错误时的修复程序

FHS要求根目录(/)必须存在以下目录:

  • /bin :用于放置在单人维护模式下还能够被操作的指令,可以被root与一般账号所使用,如cat、chmod、chown、date、mv、mkdir、cp、bash等;
  • /boot :主要放置开机用到的文件,如Linux核心文件(Linux kernel)及开机菜单所需配置文件等;
  • /dev :用于存储本机设备及周边设备的文件;
  • /etc:用于放置系统主要的配置文件,如用户的账号密码文件、各种服务的起始文件等,一般用户可以查询,但是只有root可以修改。该目录不建议放置可执行文件;
  • /lib :用于放置开机时会用到的函数库,以及 /bin或/sbin下的指令会用到的函数库。;同时FHS要求该目录下必须存在 /lib/modules用于放置驱动程序
  • media :用于放置可移除的设备,如光盘、DVD、软盘等;
  • /mnt :用于暂时挂载额外的设备;
  • /opt :用于安装额外软件包
  • /run :用于存放开机后产生的各项信息;
  • /sbin :用于存放用于设置系统环境的指令,包括开机、修复、还原系统等,只有root才能使用这些指令;
  • /srv :用于存放一些网络服务所需要的数据目录;
  • /tmp :用于一般使用者或正在执行的程序放置临时文件,任何人都能存取,需要定期清理;
  • /usr
  • /var

FHS建议根目录(/)可以存在以下目录:

  • /home :使用者的主文件夹,“~”代表当前使用者的主文件夹;"~name"代表“name”这个用户的主文件夹;
  • /lib<qual> :用于存放与/lib不同格式的二进制函数库,如支持64位的/lib64函数库;
  • /root :系统管理员(root)的主文件夹

FHS中没有规定但也很重要的目录:

  • /lost+found :ext2/ext3/ext4文件系统格式才会产生,用于放置当系统发生错误时遗失的片段
  • /proc :相当于一个虚拟文件系统,该目录下的数据都存在内存中,如系统核心、周边设备状态、网络状态等,不占硬盘空间;
  • /sys :同样相当于一个虚拟文件系统,记录核心与系统硬件信息等,包括目前已载入的核心模块与核心侦测到的硬件设备信息等,同样不占用硬盘空间。

/usr

usr是unix software resource的缩写,即Unix操作系统系统软件资源所放置的目录。

FHS要求 /usr必须存在以下目录:

  • /usr/bin :用于存放所有一般用户都能使用的指令;
  • /usr/lib :/lib连接到此目录,因此基本上与/lib功能相同;
  • /usr/local :系统管理员在本机自行安装软件时建议安装到此目录;
  • /usr/sbin :非系统正常运行所需要的系统指令,/sbin连接到此目录,因此基本功能与/sbin差不多;
  • /usr/share :主要放置只读的数据文件,包括共享文件。

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

  • /usr/games :用于放置与游戏相关的数据;
  • /usr/include :用于放置程序头文件;
  • /usr/libexec :用于放置不被一般使用者所惯用的可执行文件或脚本;
  • /usr/lib<qual> :/lib<qual>连接到此目录,因此基本与/lib<qual>功能相同;
  • /usr/src :用于放置程序源代码。

/var

/var目录主要存放经常变动的文件,如高速缓存(cache)、登录文件、程序运行文件、数据库文件等。

FHS要求 /var必须存在以下目录:

  • /var/cache :应用程序运行过程中产生的缓存数据;
  • /var/lib :用于放置程序运行过程中需要用到的数据文件,各自的软件此目录下应该拥有各自的目录;
  • /var/lock :用于放置当多个程序运行时,程序的锁定状态;
  • /var/log :用于存放登录文件;
  • /var/mail :用于放置个人电子邮箱信件;
  • /var/run :用于存放已启动的程序或服务的PID;
  • /var/spool:用于存放在队列中等待程序调用的数据。

目录树(directory tree)

Linux的文件与目录采用树形结构,具有以下特点:

  • 目录树的起始节点为根目录(/,root);
  • 每一个目录不仅可以使用本地段的partition文件系统,也可以使用网络上的filesystem,如利用Network File System(NFS)服务器挂载某特定目录;
  • 每个文件在此目录树中的文件名(包含完整路径)都是唯一的。

绝对路径与相对路径

  • 绝对路径:由根目录(/)开始写起的文件或目录名称;
  • 相对路径:相对于当前路径的文件名写法,“.”或“./” 代表当前目录;“..”或“../” 代表上一层目录。