Linux权限管理和文件属性
目录
1. 权限的概念
2. 权限管理
2.1 文件访问者的分类
2.2 文件类型和访问权限(事物属性)
2.2.1 文件类型
2.2.2 file指令
2.2.3 基本权限
3. 文件访问权限的相关设置方法
3.1 chmod
3.2 chown 和 chgrp
3.3 umask
4. 粘滞位
1. 权限的概念
Linux下有两种用户:
超级用户(root):可以在linux系统下做任何事,不受限制;命令行提示符是 “#”
普通用户:在Linux下做有限的事;命令行提示符是 “$”
相关命令:
增加普通用户:adduser 用户名
设置密码(不显现):passwd 用户名
删除用户:userdel -r 用户名
【只有拥有root用户权限,才能编辑普通用户;增加的用户家目录文件位于:/home/用户名/】
查看当前登录用户:whoami
查看当前在线的所有用户:who
切换用户:su 【用户名】
(root用户切换到任何用户,不需要密码;普通用户切换到其它用户(包括自己),需要输入其它对应用户的密码)
或者 su - 以root身份重新登录
配置普通用户的root权限:
vim /etc/sudoers
# 添加
用户名 ALL=(ALL) ALL
保存退出【命令模式(shift+;):wq!】
接着就可以root身份执行命令(第一次 和 一定的时间段要验证普通用户的密码):比如:sudo ls
2. 权限管理
2.1 文件访问者的分类
文件和目录的所有者:u --- User
文件和目录的所有者所在的组的用户:g --- Group
其它用户:o --- Others
2.2 文件类型和访问权限(事物属性)
示例:
如下说明:
2.2.1 文件类型
d:文件夹
-:普通文件
l:软链接(类似快捷方式)语法:ln -s src(源路径) dec(指向路径)
b:块设备文件:
【 块设备文件用于与硬盘、光驱、U 盘等设备进行交互,它们通常位于 /dev
目录下,如 /dev/vda或sda
、/dev/vda1或sda1
等; 块设备文件允许用户和程序以块为单位读取或写入数据,是直接访问物理设备的接口。
比如:使用 lsblk
命令可以查看系统中已连接的块设备:
表示我的系统中块设备的情况如下:
sr0
是一个大小为 223.6MB 的光盘驱动器的设备文件:可用于读取光盘数据,比如音频 CD、数据 CD/DVD 或者 ISO 镜像文件;或者挂载光盘到文件系统,方便访问和管理光盘中的文件;或者制作镜像,将光盘内容制作成 ISO 文件,便于存档和分享。vda
是一个 40GB 的虚拟磁盘。vda1
是vda
上的一个 40GB 分区,并已挂载到根目录/;然后就可以在上面创建使用文件了.
或者使用 df -h 显示 当前的文件系统使用情况。
并且:块设备允许在任意位置读取或写入数据(随机读取),而不是像字符设备那样只能顺序访问。这样可以直接定位到设备的任意偏移位置进行读写操作,因此非常适合存储设备的操作需求,比如硬盘和 SSD。
测试:sudo dd if=/dev/vda of=output.bin bs=512 count=1 skip=1000
说明:
dd
:是一个用于低级别数据复制的命令。if=/dev/vda
:指定输入文件(input file),这里是整个虚拟磁盘设备vda
。of=output.bin
:指定输出文件(output file),这里是要创建的文件output.bin
。bs=512
:设置块大小为 512 字节,表示每次读取和写入 512 字节。count=1
:表示读取 1 个块(即 512 字节)。skip=1000
:跳过输入文件的前 1000 个块(blocks),从第 1001 个块开始读取。
示例输出:
可以使用 xxd output.bin
命令将其以十六进制格式输出:
小编当前的输出示例:
(可以看到:小编此次示例读取的数据可能恰好在一个未使用的空间,或者这部分空间没有写入过任何数据,所以都是0)
也可以使用 hexdump -C output.bin 命令更简洁显示:
此外,还可以添加新的虚拟磁盘(类似于为计算机购买加装新的硬盘) 或者 在现有的磁盘上划分新的分区(类似于硬盘分区 C / D / E 卷盘)。
下面,小编新建虚拟机做简单演示(centos7镜像;在创建阶段已经做了简单的手动分区):
步骤一:lsblk查看当前的磁盘分区和剩余空间
磁盘剩余 16G 未被使用。
假设现在要用剩下的空间,为超级用户root 和 普通用户nxf 各自专门划分一块区域(假设每人8G),实现:系统文件和用户某些个人数据(私有) 在磁盘区级划分上的隔离管理。
步骤二:使用剩余空间划分新的分区
sudo fdisk /dev/sda
在 fdisk
命令中执行以下操作:
- 输入
n
创建一个新分区。 - 选择
p
(主分区,大小创建时确定,不可更改)或e
(扩展分区,允许创建多个逻辑分区并可按需调整和扩展,比如上面的 /dev/sda2的dm-0,dm-1)。选择e - 输入分区号(如 3,4等;默认sda*的下一个)。输入3
- 设置起始扇区(直接按回车使用默认)。
- 设置结束扇区(直接按回车使用所有剩余空间,或指定大小,例如
+10G
)。
成功:Partition 3 of type Extended and size of 16 GiB is set
完成后输入 w
保存更改并退出。
步骤三:创建逻辑分区
再次进入fdisk:输入n 创建逻辑分区;选择逻辑分区类型(通常会自动识别为 l);设置起始扇区(回车默认);设置结束扇区(+8G)【逻辑分区从5开始】
看到输出:Partition 5/6 type Linux and of sze 8 GiB is Set
使用命令 sudo partprobe 重新加载分区表
注意:lsblk显示这样:
这种显示方式可能会让人觉得3/5/6它们是同级的,但实际上,逻辑分区是嵌套在扩展分区内的。这种显示方式是因为工具在展示分区信息时,主要是按分区号顺序排列,而不是按层级关系;可以使用 fdisk -l 查看详细信息:
步骤四:格式化文件分区
sudo mkfs.ext4 /dev/vda5 # 对于第一个逻辑分区
sudo mkfs.ext4 /dev/vda6 # 对于第二个逻辑分区
在选择文件系统时,常见的选项包括:
-
ext4:
- 优点:稳定性高,性能良好,支持大文件和大容量分区,广泛使用于 Linux 系统。
- 适用情况:适合大多数用途,包括一般的文件存储和服务器应用。
-
xfs:
- 优点:高性能,特别适合处理大文件和高并发操作,支持动态扩展。
- 适用情况:适合需要高性能的应用,如数据库和大数据存储。
-
btrfs:
- 优点:支持快照、压缩和多种高级功能。
- 适用情况:适合需要先进特性的环境,但相对较新,可能不如 ext4 和 xfs 稳定。
推荐:
- 对于一般用途,推荐使用 ext4,因为它简单易用,兼容性好。
- 如果你有特定的性能需求,可以考虑使用 xfs。
步骤五:创建挂载点 并 进行挂载
sudo mkdir /root/private
sudo mkdir /home/nxf/private
//挂载
sudo mount /dev/sda5 /root/private
sudo mount /dev/sd6 /home/nxf/private
//修改目录权限
sudo chown nxf:nxf /home/nxf/private
步骤六:持久化挂载
在系统重启(sudo reboot)后依然有效,需要编辑 /etc/fstab
文件:
sudo vim /etc/fstab
末尾添加:
/dev/sda5 /root/private defaults 0 0
/dev/sda6 /home/nxf/private defaults 0 0
保存退出。
至此,就实现了系统文件和用户私有数据的分区(分盘)管理!
以后,如果需要解除挂载,可使用 umount 命令 (数据依旧存在,除非格式化);或者调整分区的大小,使用 resize2fs
调整文件系统(e2fsck -f检查修复文件系统)(适用于 ext 文件系统);更新挂载信息......
但是,在实际生产环境中,业务服务器的分区通常会在部署之初就规划好,典型的做法是根据工作负载及预估的增长进行合理分区,并留出一些未分配的空间以备未来扩展。
如果需要大规模调整或新增分区,通常会选择添加新的磁盘而不是直接调整现有的分区结构。这样做的好处是:
1. 数据安全性
- 降低风险:调整现有分区可能导致数据丢失或损坏,尤其是在操作不当或出现故障时。添加新磁盘可以避免影响现有数据。
2. 系统稳定性
- 减少停机时间:在现有分区上进行调整可能需要卸载、重启等操作,这会导致服务中断。添加新磁盘通常不会影响正在运行的服务。
3. 灵活性
- 便于扩展:添加新磁盘可以根据需求动态扩展存储,而无需改变现有的分区结构。这种灵活性使得系统能够适应不断变化的业务需求。
4. 更好的性能
- 分散负载:新磁盘可以分散读写负载,从而提高整体性能。将不同的应用程序或数据存储在不同的磁盘上可以提高 I/O 性能。
5. 简化管理
- 避免复杂性:调整分区可能会增加管理复杂性,特别是在多分区环境中。添加新磁盘使得管理更为简单,特别是当业务需求发生变化时,可以简单地添加新的存储设备。
6. 便于备份与恢复
- 简化备份策略:独立的磁盘可以专门用于备份数据,便于实施差异化备份、快照等策略,减少恢复时间。
7. 便于监控和维护
- 独立监控:新磁盘可以单独监控,便于追踪性能问题或故障,有助于及早识别潜在风险。
8. 硬件兼容性
- 适应性强:有时新技术的硬件(如 NVMe、SSD 等)可以提升性能,而不需要修改现有的分区结构
......
】
p:管道(pipe)文件
【允许将一个命令(进程)的输出直接传递作为另一个命令(进程)的输入(单向)。
通过管道,可以将多个命令组合在一起,以实现复杂的数据处理;通过使用“|”符号实现
示例1:cat /etc/passwd | cut -d: -f1 | sort | uniq
这个命令将 /etc/passwd
文件的内容输出的每一行中提取以冒号为分隔符的第一个字段,提取用户名,然后排序(默认升序;-r降序)并去重。
示例二:
创建管道文件:mkfifo mypipe
在终端1运行:cat > mypipe
在终端2运行:cat mypipe
此时,在终端1的输入内容会输出到终端2(终止:ctrl + c)
管道文件在linux中的作用有:
- 进程间通信:(先简单理解成 不同的运行程序记之间)
- 管道文件允许不同进程之间进行数据交换,提供一种简单的方式来传递信息。
- 缓冲机制:
- 管道文件在读写之间提供了缓冲,数据写入管道后,如果没有进程读取,它会在管道中保持,直到被读取或达到限制。
- 同步机制:
- 使用管道时,如果写入端没有数据被读取,写入操作会被阻塞,从而实现了一种基本的同步机制。】
c:字符设备文件
【例如:键盘,鼠标,串口等,用于表示与硬件设备的交互,它们是通过文件系统提供的接口访问设备的关键;通过字符设备文件,用户和应用程序能够方便地与各种硬件进行通信和控制。
这类文件主要分布在 /dev/ 目录下
串口(Serial Port)是计算机上一种用于数据传输的接口,允许数据按位(bit)进行逐位传输。广泛用于设备之间的通信,尤其是在早期计算机和外围设备(如鼠标、调制解调器、打印机等)之间。虽然串口在个人电脑上逐渐被USB等接口替代,但它在嵌入式系统、工业控制和一些通信设备中依然被广泛使用。
在Linux系统中,串口设备通常表示为 /dev/ttyS*
(物理串口)和 /dev/ttyUSB*
(USB转串口设备)。
总结一下 字符设备 的特性:
-
数据流:
- 字符设备以字节为单位进行读写,数据是以流的形式传输的。
-
不支持随机访问:
- 字符设备只能顺序访问,不支持随机访问。
-
无缓冲:
- 字符设备通常是无缓冲的,每次读写操作直接与设备交互。
】
s:套接字文件
在Linux中,套接字(Socket)文件是一种用于网络通信的特殊文件类型,允许程序(进程)之间通过网络接口进行数据传输。
它在操作系统中提供了一种标准化的通信方式(API),用于管理和实现网络连接。
2.2.2 file指令
功能:识别文件类型
格式:file [选项] 文件/目录
常用选项:-C 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
2.2.3 基本权限
r(Read): 对文件而言,具有读取文件内容的权限;对目录而言,具有浏览该目录下文件信息的权限
w(Write):对文件而言,具有修改文件内容的权限;对目录而言,具有 增加/删除/移动 目录文件的权限
x(Execute):对文件而言,具有执行文件的权限(如果要像程序一样可运行,还要保证其是可执行的二进制机器语言);对目录而言,具有进入目录的权限
现在就可以解释一 为什么会存在所属组这个概念:
在Linux中,所属组是为了实现更灵活和安全的权限管理而设计的,它为文件和资源的访问控制提供了一个中间层次。通过将用户归类到不同组,并为文件分配组权限,Linux可以简化权限管理、而不是为每个用户单独设置权限,便于团队协作,并提高系统安全性。
所属组的概念支持多用户系统的资源共享,使得团队成员能轻松共享资源,同时确保敏感数据的访问权限得到有效控制。
举个例子:某游戏公司决定做一款moba游戏,但是在具体玩法,盈利方式等 存在较大分歧,大致分为两大阵营,于是领导决定 分为A/B两组,同时独立制作,最后根据市场测试反馈 决定重点扶持哪组的游戏上线运营。但是公司的资源配置有限,两组必须使用同一服务器资源:此时组内成员就需要数据共享,组外成员无法获取数据;如果领导需要检查工作进度,此时领导的身份就是 Others, 如果不存在组的划分,A/B两组就只能允许 其它用户的读权限,但A和B两组 也是相对的Others,此时也能看到相互的数据;所以,好的办法就是把领导加到各自的组中,确保 数据只在组内可见。
3. 文件访问权限的相关设置方法
3.1 chmod
格式:chmod [参数] 权限 文件/目录名
常用选项:R 递归修改目录下所有文件的权限
说明:只有文件的拥有者和root权限可以改变文件的权限
命令权限值的格式:
方式1:用户标识符+/- 权限字符(r/w/x)
+:增加
-:取消
用户标识符:u(拥有者) g(所属组) o(其它用户) a(所有用户)
示例:chmod g-w,o+w text
chmod a+x text
方式2:三位8进制数字
比如:- rw- rw- r-- 每一个权限位对应一个二进制比特位——> - 110 110 100 转化成十进制就是:664
所以,640 就是 rw-r-----;775 就是 rwxrwxr-x;......
3.2 chown 和 chgrp
改变文件的拥有者和所属组:chown [-R] 拥有者:所属组 文件/目录名
只改变所属组:chown [-R] :所属组 文件/目录名
或者 chgrp [-R] 所属组 文件/目录名
说明:只有文件的拥有者和root权限可以修改
3.3 umask
查看或修改 权限掩码
新建普通文件的默认权限:666;目录默认权限;777
但是,实际上我们看到的并不是这样的,一般普通用户的umask==002,那么新建的普通文件/目录的默认权限是:664 / 775,即去掉 002(000 000 010) 出现的权限;计算(八进制)也可以当成 默认权限(666 / 777)- umask
示例:umask 077 表示只有拥有者可以编辑
4. 粘滞位
当一个目录被设置为 ‘’粘滞位“ 【chmod 用户+t】,则该目录下的文件/目录只能由:
1. 超级管理员(root)删除
2. 拥有者删除
比如,linux下的/tmp/ 目录常用来存储 临时数据(常见的如日志,缓存,交换文件等,系统重启后被删除),其权限通常为 rwxrwxrwt
粘滞位只能用于 Others 才能被设置成功
另外简单提一下,普通文件也可以设置粘滞位,但是其会显示成大写的 T(无实际作用,现代Linux系统对普通文件忽略粘滞位设置)