Linux权限管理和文件属性

目录

[1. 权限的概念](#1. 权限的概念)

[2. 权限管理](#2. 权限管理)

[2.1 文件访问者的分类](#2.1 文件访问者的分类)

[2.2 文件类型和访问权限(事物属性)](#2.2 文件类型和访问权限(事物属性))

[2.2.1 文件类型](#2.2.1 文件类型)

[2.2.2 file指令](#2.2.2 file指令)

[2.2.3 基本权限](#2.2.3 基本权限)

[3. 文件访问权限的相关设置方法](#3. 文件访问权限的相关设置方法)

[3.1 chmod](#3.1 chmod)

[3.2 chown 和 chgrp](#3.2 chown 和 chgrp)

[3.3 umask](#3.3 umask)

[4. 粘滞位](#4. 粘滞位)


1. 权限的概念

Linux下有两种用户:

超级用户(root): 可以在linux系统下做任何事,不受限制;命令行提示符是 "#"

普通用户: 在Linux下做有限 的事;命令行提示符是 "$"

相关命令:

增加普通用户:adduser 用户名

设置密码(不显现):passwd 用户名

删除用户:userdel -r 用户名

只有拥有root用户权限,才能编辑普通用户;增加的用户家目录文件位于:/home/用户名/

查看当前登录用户:whoami

查看当前在线的所有用户:who

切换用户:su 【用户名】

(root用户切换到任何用户,不需要密码;普通用户切换到其它用户(包括自己),需要输入其它对应用户的密码)

或者 su - 以root身份重新登录

配置普通用户的root权限:

vim /etc/sudoers

bash 复制代码
# 添加
用户名     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 的虚拟磁盘。
    • vda1vda 上的一个 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),实现:系统文件和用户某些个人数据(私有)在磁盘区级划分上的隔离管理。

步骤二使用剩余空间划分新的分区

cpp 复制代码
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 查看详细信息:

步骤四:格式化文件分区

cpp 复制代码
sudo mkfs.ext4 /dev/vda5  # 对于第一个逻辑分区
sudo mkfs.ext4 /dev/vda6  # 对于第二个逻辑分区

在选择文件系统时,常见的选项包括:

  1. ext4

    • 优点:稳定性高,性能良好,支持大文件和大容量分区,广泛使用于 Linux 系统。
    • 适用情况:适合大多数用途,包括一般的文件存储和服务器应用。
  2. xfs

    • 优点:高性能,特别适合处理大文件和高并发操作,支持动态扩展。
    • 适用情况:适合需要高性能的应用,如数据库和大数据存储。
  3. btrfs

    • 优点:支持快照、压缩和多种高级功能。
    • 适用情况:适合需要先进特性的环境,但相对较新,可能不如 ext4 和 xfs 稳定。

推荐:

  • 对于一般用途 ,推荐使用 ext4,因为它简单易用,兼容性好。
  • 如果你有特定的性能需求 ,可以考虑使用 xfs

步骤五:创建挂载点 并 进行挂载

cpp 复制代码
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. 数据安全性
  • 降低风险:调整现有分区可能导致数据丢失或损坏,尤其是在操作不当或出现故障时。添加新磁盘可以避免影响现有数据。
  1. 系统稳定性
  • 减少停机时间:在现有分区上进行调整可能需要卸载、重启等操作,这会导致服务中断。添加新磁盘通常不会影响正在运行的服务。
  1. 灵活性
  • 便于扩展:添加新磁盘可以根据需求动态扩展存储,而无需改变现有的分区结构。这种灵活性使得系统能够适应不断变化的业务需求。
  1. 更好的性能
  • 分散负载:新磁盘可以分散读写负载,从而提高整体性能。将不同的应用程序或数据存储在不同的磁盘上可以提高 I/O 性能。
  1. 简化管理
  • 避免复杂性:调整分区可能会增加管理复杂性,特别是在多分区环境中。添加新磁盘使得管理更为简单,特别是当业务需求发生变化时,可以简单地添加新的存储设备。
  1. 便于备份与恢复
  • 简化备份策略:独立的磁盘可以专门用于备份数据,便于实施差异化备份、快照等策略,减少恢复时间。
  1. 便于监控和维护
  • 独立监控:新磁盘可以单独监控,便于追踪性能问题或故障,有助于及早识别潜在风险。
  1. 硬件兼容性
  • 适应性强:有时新技术的硬件(如 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系统对普通文件忽略粘滞位设置)

相关推荐
Lovyk2 小时前
Linux 正则表达式
linux·运维
Fireworkitte2 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9003 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char3 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘125 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
华强笔记8 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发8 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建
phoenix09819 小时前
ansible部署lnmp-allinone
linux·运维·ansible
winds~9 小时前
【git】 撤销revert一次commit中的某几个文件
linux·c++
iY_n10 小时前
Linux网络基础
linux·网络·arm开发