Linux文件结构与文件权限

基于centos了解Linux文件结构

了解一下文件类型

Linux采用的一切皆文件的思想,将硬件设备、软件等所有数据信息都以文件的形式呈现在用户面前,这就使得我们对计算机的管理更加方便。所以本篇文章会对Linux操作系统的文件结构和文件权限进行讲解。

首先我们键入到达~目录

    cd ~   

然后键入ll查看所有非隐藏文件,可以看到在每个文件最前方都有一个由10个字符构成的字符串,就以第一行为例-rw-------.,可以看到第一行的10字符的第一个字符是-,在Linux操作系统中,这个符号就代表着文件是一般文件,也就是我们日常配置、文本文件等这类文件。

在这里插入图片描述

除了一般文件以外,每个文件第一栏的第一个字符还可能出现以下几种情况:

  1. d:代表当前文件为文件夹
  2. l:代表当前文件为超连接文件
  3. b:该文件提供为提供给系统存取的设备,例如你计算机的硬盘所存储的数据内容,可能都会保存在这个类型文件中
  4. c:代表着连接到你计算机的一些硬件设备,例如鼠标、键盘等配置文件开头都是以c开头的

为了验证这一点,我们随意创建一个文件夹:

mkdir /tmp/dir

然后使用ll命令查看其文件属性:

ll /tmp/

可以看到我们创建的文件夹是以d打头的

在这里插入图片描述

上文还提到了一个b打头的文件,这个文件是提供系统存储的数据且可能硬盘也可能是其他存储设备的,这类型文件一般都在设备目录dev下,我们可以进入dev目录看到这些文件:

ll /dev/sda

在这里插入图片描述

而c打头的文件则是硬件设备,我们不妨键入 ll /dev查看一下,如下图所示的BUS总线,以及CPU等这些都是硬件设备:

在这里插入图片描述

同样的在上文中我们也有提到关于隐藏文件的概念,在Linux中隐藏文件大多以.开头,这些文件使用常规的ll、ls等命令是看不到的,必须使用al选项查看所有文件才能看到(补充一句a的意思就是all):

ls -al查看

于是在当前目录的所有文件列表下,我们看到了隐藏目录:

在这里插入图片描述

文件名的限制

在现如今的Linux,文件系统基本采取XFS,所以文件名长度限制基本是255byte以内,说通俗一点,你的文件要是以英文命名就可以起一个长度为255的文件名,若为汉字则长度大约是127。注意由于Linux命令中常会用到-以及一些特殊符号,所以文件命名应该尽量避免以下几个特殊符号:

* ? > < ; & ! [ ] | \ ' " ` ( ) { } -

树形目录结构

Linux的文件结构总的来说类似于一棵树,用户可以按照规范约定在相应的文件夹下存储文件,就例如在var目录下可以存储一些与系统的运作有关的文件例如程序日志文件、在tmp目录下存储一些临时文件等。
需要了解的是,无论是何种Linux系统,他的目录都会遵循一个标准,包括下图中的文件结构,而这个标准名为Filesystem Hierarchy Standard (FHS)

在这里插入图片描述

FHS规定文件的整体结构应该是这样的:

1. /:根目录,与开机系统有关
2. /usr(unix software resource):与软件的安装和执行有关
3. /var(variable):与系统的运作有关

首先介绍一个根目录/,它的子节点文件基本都是和系统开机相关、各种程序、库函数的文件夹,所以在根目录这一级是非常重要的,所以FHS希望后续使用Linux的时候尽量不要将用户的文件夹或者文件存储到这一层级以避免误操作到重要文件导致系统崩溃。

在这里插入图片描述

根目录下有个bin文件夹,我们日常使用Linux的时候都会用到lscattouchmkdir等基本操作命令都存放于bin目录下:

在这里插入图片描述

接下来是/boot,这个目录存放的基本都是Linux开机会用到配置文件,像Linux kerner常用到的文件名 vmlinuz就会存放在这个文件夹下

在这里插入图片描述

接下来是/dev,这个文件夹基本存放的都是硬件设备,我们都知道Linux主张一切皆文件,所以所有的鼠标、键盘、硬盘的设备信息都是存放在这个文件夹下:

在这里插入图片描述

/etc目录则是存放配置文件的地方,常见我们的用户文件/etc/passwd,以及密码文件/etc/shadow,还有系统文件/etc/rc等都会存放在这个目录下。
除此之根目录下还有一些文件夹如下所示,这里就不一一介绍了:

  1. mnt存放挂载相关。
  2. lib存放库函数相关、
  3. sbin存放开机、系统还原、修复等众多指令。
  4. tmp存储临时文件习惯。

我们再来聊聊FHS规范中一个命名比较特殊导致用户使用时常受到误导的文件夹/usr,很多人最初都会误以为这是user的缩写,其实这个单词是unix software resource的缩写,这个文件夹是FHS规定存放软件资源相关的文件夹,他们建议用户软件相关的资源尽可能都放到这个目录。

首先来看看/usr/bin目录,这个目录实质上就FHS希望用户能够将一般用户所能够的使用的指令都放到这个目录下,所以我们在日常软件安装时对应各种启动指令脚本都建议存放到这个位置。此外usrbin目录下还存放了系统指令的软连接,参见下图:

在这里插入图片描述

除此之外usr下还有3个常见的目录:
1./usr/lib与根目录的lib功能相同,存放的基本是lib目录下的软链接。
2. /usr/local/则是FHS希望用户将下载的软件都放到这个目录下统一管理
3. /usr/sbin同样也是将根目录的sbin目录下的指令软链接到此。

最后我们再来介绍一些/var,这个目录FHS认为应该存放那些经常发生变化的文件,例如日志,他们希望日志统一存放到/var/log下。/var/lib存放的则是会临时改变的库文件。而/var/lock存放的则是被某个程序锁定的文件,已确保其他程序不会同时使用到这个文件。

在这里插入图片描述

绝对路径和相对路径

绝对路径则是以根节点作为其实节点的文件搜寻办法,例如我们想到达tmp文件夹,如果使用绝对路径的方式则是

cd /tmp

假如我们在boot目录下,而tmp和他一样都属root的子节点,所以使用相对路径的方式是先退到root目录,然后再进入tmp文件夹,如下图,所以在boot目录下,我们进入tmp文件夹的命令为 cd ../tmp/:

在这里插入图片描述

演示结果参见下图:
在这里插入图片描述

注意:../代表着退到上一级,那么就会有这么一个指令./,代表当前目录,这个指令是干什么用的是,很简单,假如我们Linux中某个sh文件不在binsbin/usr/bin这样的目录下,Linux规定我们执行可执行sh文件文件时都必须标明./,例如我在tmp目录下有个执行脚本test,那么我在test目录下执行这个脚本的格式就必须是

sh ./test.sh

文件权限

权限对应角色

我们在随意一个目录下键入ll查看文件信息,如下图我们可以看到每个文件的第一栏除去第一个字符串代表着文件类型外,其余字符都会显示rwx-相关,其含义为:

  1. r代表读权限。
  2. w代表写权限。
  3. x代表执行权限。

在这里插入图片描述

我们以dir的文件描述为例,第一个字符d代表它是个文件夹,2-4代表当前所有者权限为读写执行都有,而5-7代表所属组权限,即这个文件所属的组所拥有的权限为读和执行,最后一行代表其他人的权限也是读和执行。

d   rwx   r-x     r-x.

针对dir文件夹,可以看到第3列为root,说明这个文件属于root的,root用户拥有这个文件夹的读写执行权限。而第4列也为root,说明属于root组的用户拥有读写执行的权限。

假如此时有个名为xiaoming的用户进来,它属于xiaomingzu,那么对于这个dir文件夹而言,他就是other用户,那么它的权限只有读和执行。

文件夹与文件对应权限的相似与区别

Linux系统下文件系统下,文件的可执行权限和文件夹的可执行权限是有所不同的。假如一个用户对文件夹只有读和写权限,那么他就无法进入到这个目录,如下所示,我们有root创建一个testDir,所以对于其他用户来说只有读和写权限。
注意一下笔者赋权的命令,这里我们需要了解一下Linux中读权限用4表示,写权限用2表示,执行用1表示,所以766(4+2+1)+(4+2)+(4+2)代表着所属者读写执行,所属组和其他都是读和执行:

# 进入tmp目录cd /tmp/# 创建testDir文件夹
mkdir testDir# 设置这个文件夹 所属者有所有权限 所属组和其他用户只有读和写权限
chmod 766 testDir/

当笔者以其他用户登录(这个用户不是所属者root也不属于root组)时,就会报出没有权限的问题

在这里插入图片描述

这时候我们希望其他用户可以有执行的权限,要怎么做呢?很简单,我们也可以参考上面的数学公司对其他用户增加执行权限:

chmod 777 /test/testDir

当然我们也可以单独对其他用户增加一个可执行权限,命令如下所示,可以看到其他为o,增加一个可执行权限为+x。同理可知若是所者为u,所属组为g。增加权限用+,减去权限用-,赋值权限用=:

其他用户对于testDir文件夹的操作增加执行权限
chmod o+x testDir/

所以我们若希望所属者赋值为所有权限则是u=rwx,所属组和其他都希望是读和执行,那就是g和o合在一起写,并=rx,如下所示:

 chmod u=rwx,go=rx testDir/

当然有时候你希望这个文件改变所属组,你可以使用chgrp 指令,如下所示,这样意义文件夹所属组就改为otheruser

# 将文件夹testDir所属组改为otheruser
chgrp otherusertestDir/

同理若你希望改变所有者则可以使用chown :

chown otherusertestDir testDir/

当然,若你希望所有者和所属组都能改变则可以:

# 将testDir所有者改为冒号左边的root,将所属组改为冒号右边的root
chown root:root testDir/

在这里插入图片描述

回到问题,为了方便演示文件和文件夹可执行权限的区别,我们将文件夹所属者和所属者都改为root,并且所有用户都具备所有权限:

chmod 777 testDir/
chown root:root   testDir/

在这里插入图片描述

然后进去该文件夹,创建一个file1的文件,权限设置为700,即所属者才有权限,所属组和其他没有任何权限:

cd testDir/touch file1chmod 700 file1

使用ll -d查看testDir文件夹以及文件夹下对应的文件file1的权限,可以发现对于其他用户而言文件夹有所有的权限,而文件没有任何权限:

ll -d  /tmp/testDir/ /tmp/testDir/file1

在这里插入图片描述

所以我们使用别的账户可以进入路径,但是无法读写该文件如下图:

在这里插入图片描述

vim file1

在这里插入图片描述
但是以为其他用户拥有file文件的目录testDir的执行权限,所以它可以将这个文件删除。所以得出结论,文件夹的可执行权限意为着可以删除这个文件夹下所有的文件,但是并不意味着可以修改或者读取文件夹下文件的内容。

这种情况我们完全可以将文件夹testDir看作一个抽屉,任何人对其都有任何权限。此时root往里面放了一个小保险盒,读写权限只有root有。所以其他用户是无法打开或者修改盒子中的内容。但是他具有抽屉(testDir)的所有权限,所以他可以将这个保险盒扔掉。

在这里插入图片描述

以下这张表格就说明了操作文件夹下某些文件所需的最低权限,可以看到像删除、复制等这些无需读取文件内容的操作,文件所对应的文件夹甚至不一定需要rw的权限。用上面抽屉和文件的例子来说,我们删除完完全全可以看不到抽屉内部文件的具体的内容,复制文件不需要知道文件夹内有什么文件,我们完完全全可以瞎摸出来放到别的目录。
在这里插入图片描述

umask设置默认权限

默认情况下,用户创建的文件权限为:rw-rw-rw-,对应的数字为666,而文件夹则是:rwxrwxrwx对应数字是777。那是什么原因导致我们最后创建出来的文件权限变成rw-r--r--(644)以及文件夹变成rwxr-xr-x(755)呢?

答案就是umaskumask和默认权限进行取反和按位与运算,从而得出文件和文件夹创建的实际文件。
先来演算一下文件的权限运算,加入我们创建一个文件file

touch file

可以看到它的权限为0644(因为权限位最前面是-,说明是一般文件,可直接视为0)

-rw-r--r-- 1 root root    0 Dec  6 14:39 file

以上文所说,默认是0666,然后和0022进行取反按位与运算,所以我们首先对0022进行取反得到7755

在这里插入图片描述

然后和0666进行按位与运算,最终得出文件默认权限为rw-r--r--,文件夹同理这里就不多做演示:

  7755
& 06660644

上述运算属于标准的推算步骤,对于取反按位与这种运算,读者可直接视为减法,例如文件默认权限为0666,而umask为0022,两者直接相减即可直接得到0644。

如果我们希望文件权限保持最原始的权限,那么我们可以将umask改为0000

umask 0000

创建的文件权限就是 666,创建的文件夹就是 777

参考文献

鸟哥的Linux私房菜:https://book.douban.com/subject/4889838/

循序渐进Linux(第2版):https://book.douban.com/subject/26758194/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt生成动态链接库并使用动态链接库

项目结构 整个工程由一个主程序构成和一个模块构成(dll)。整个工程的结构目录如下 Define.priMyProject.proMyProject.pro.user ---bin ---MainProgrammain.cppMainProgram.proMainProgram.pro.userwidget.cppwidget.hwidget.ui ---MathDllMathDll.proMathDll.pro.userMyMath.…

Axios 拦截器实战教程:简单易懂

Axios 提供了一种称为 “拦截器&#xff08;interceptors&#xff09;” 的功能&#xff0c;使我们能够在请求或响应被发送或处理之前对它们进行全局处理。拦截器为我们提供了一种简洁而强大的方式来转换请求和响应、进行错误处理、添加认证信息等操作。在本文中&#xff0c;我…

Matlab 点云收缩L1中值(Weiszfeld算法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 对于之前的加权均值收缩方式,它存在一个很大的缺点,即容易受到噪声的影响,因此这里我们采用另一种统计学方案:L1中值。其形式如下所示: 其中 x i x_i

MongoDB的条件操作符

本文主要介绍MongoDB的条件操作符。 目录 MongoDB条件操作符1.比较操作符2.逻辑操作符3.元素操作符4.数组操作符5.文本搜索操作符 MongoDB条件操作符 MongoDB的条件操作符主要分为比较操作符、逻辑操作符、元素操作符、数组操作符、文本搜索操作符等几种类型。 以下是这些操作…

对String类的操作 (超细节+演示)

[本节目标] 1.认识String类 2.了解String类的基本用法 3.熟练掌握String类的常见操作 4.认识字符串常量池 5.认识StringBuffer和StringBuilder 1.String类的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&…

高速风筒安规方案中的安规测试及安规电路特性介绍--【其利天下技术】

作为家用电子产品&#xff0c;高速吹风筒做安规测试&#xff0c;过安规要求是必须保证的&#xff0c;一般电路要过安规测试&#xff0c;那么安规测试的目的是什么呢&#xff1f; 安规测试字面意思是安全规范测试&#xff0c;主要强调对使用人员的安全保护&#xff0c;也就是我…

P7 Linux C三种终止进程的方法

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专栏3: ​​​​​​《 链表_Chen…

什么是MyBatis、什么是MyBatis-Plus、简单详细上手案例

什么是MyBatis MyBatis是一个开源的Java持久层框架&#xff0c;用于简化与关系型数据库的交互。它通过将SQL语句与Java代码进行分离&#xff0c;提供了一种优雅的方式来处理数据库操作。 MyBatis的核心思想是将SQL语句与Java方法进行映射&#xff0c;使得开发人员可以通过配置…

C语言数据结构-基于单链表实现通讯录

文章目录 1 基础要求2 通讯录功能2.1 引入单链表的文件2.2 定义联系人数据结构2.3 打开通讯录2.4 保存数据后销毁通讯录2.5 添加联系人2.6 删除联系人2.7 修改联系人2.8 查找联系人2.9 查看通讯录 3 通讯录代码展示3.1 SeqList_copy.h3.2 SeqList_copy.c3.3 Contact.h3.4 Conta…

模块化机房在大数据时代的角色:高效、可扩展的数据存储和处理平台

随着大数据时代的到来&#xff0c;数据已经成为企业竞争的核心资源。然而&#xff0c;传统的数据中心已经无法满足现代业务的需求&#xff0c;尤其是在数据存储和处理方面。模块化机房作为一种新型的数据中心建设模式&#xff0c;具有高效、可扩展等优势&#xff0c;逐渐成为大…

PyCharm编辑器结合Black插件,轻松实现Python代码格式化

大家好&#xff0c;使用Black对Python代码进行格式化&#xff0c;可使代码看起来更美观。但是&#xff0c;随着项目规模不断变大&#xff0c;对每个文件运行Black变得很繁琐。本文就来介绍在PyCharm中实现这一目标的方法。 1.安装Black 首先&#xff0c;在虚拟环境中安装Blac…

二叉树的锯齿形层序遍历[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输…

认识线程和创建线程

目录 1.认识多线程 1.1线程的概念 1.2进程和线程 1.2.1进程和线程用图描述关系 1.2.2进程和线程的区别 1.3Java 的线程和操作系统线程的关系 2.创建线程 2.1继承 Thread 类 2.2实现 Runnable 接口 2.3匿名内部类创建 Thread 子类对象 2.4匿名内部类创建 Runnable 子类对…

使用贝叶斯网络检测因果关系,提升模型效果更科学(附Python代码)

虽然机器学习技术可以实现良好的性能&#xff0c;但提取与目标变量的因果关系并不直观。换句话说&#xff0c;就是&#xff1a;哪些变量对目标变量有直接的因果影响&#xff1f; 机器学习的一个分支是贝叶斯概率图模型(Bayesian probabilistic graphical models)&#xff0c;也…

【Com通信】Com模块详细介绍

目录 前言 1. Com模块功能介绍 2.关键概念理解 3.功能详细设计 3.1 Introduction 3.2 General Functionality 3.2.1 AUTOSAR COM basis 3.2.2 Signal Values 3.2.3 Endianness Conversion and Sign Extension 3.2.4 Filtering 3.2.5 Signal Gateway 3.3 Normal Ope…

2.2 网络多线程(私聊、群发、发送文件、推送新闻、离线留言)

文章目录 一、私聊1.1 分析1.2 客户端1.2.1 MessageClientService 私聊类1.2.2 ClientConnectServerThread 线程类 1.3 服务端1.3.1 ServerConnectClientThread 线程类 1.4功能演示 二、群发消息2.1 分析2.2 客户端2.2.1 MessageClientService类2.2.2 ClientConnectServerThrea…

通过仿真理解完整的阵列信号噪声模型

概要 噪声对无线电设备的信号接收会造成影响,是通信、雷达、导航、遥感等工程应用领域中的关键考虑因素。通常认为阵列合成能够提升信噪比,但忽略了这一论断的前提,即不同通道引入的噪声互不相关。但实际应用中,接收的噪声不仅仅包含信道引入的不相关噪声,还包含从外界环…

1-6、编程语言排行榜

语雀原文链接 https://www.tiobe.com/tiobe-index/

IntelliJ IDEA创建一个Maven项目

在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.创建一个新project:File>Project 2.修改Maven配置&#xff1a;File>Settings>搜索maven 创建好的工程如下&#xff1a; src/main…

Chart 8 内核优化

文章目录 前言8.1 内核融合和拆分8.2 编译选项8.3 Conformant&#xff08;规范&#xff09; vs. fast vs. native math functions8.4 Loop unrolling8.5 避免分支发散8.6 Handle image boundaries8.7 Avoid the use of size_t8.8 通用 vs. 具名内存地址空间8.9 Subgroup8.10 Us…