linux文件、目录、Inode
inode负责文件的元数据和数据存储,文件存储块负责实际数据的存储,而目录文件维护文件名和inode之间的联系。
1. 用户空间到内核空间
首先,当用户程序请求打开一个文件时(例如使用
open
系统调用),程序将文件路径名传递给操作系统。这是从用户空间向内核空间进行系统调用的过程。2. 解析路径名
操作系统需要解析提供的路径名。如果路径是绝对路径,解析从根目录开始;如果是相对路径,则从当前工作目录开始。路径名可能包含多个组件,由斜杠(
/
)分隔。3. 查找目录项
文件系统会逐级查找路径中的每个目录项。每个目录项都有一个关联的inode和文件名。从当前目录(或根目录)的inode开始,文件系统读取目录内容,寻找与第一个路径组件匹配的目录项。
4. 获得inode号
一旦找到了匹配的目录项,就会获得与之关联的inode号。如果路径中还有更多的组件,文件系统会使用这个inode号获取下一级目录的信息,并重复步骤3和4,直到找到最终文件名对应的inode号。
5. 读取inode结构
文件系统使用inode号来索引inode表,读取该文件的inode结构。inode结构包含了文件的元数据,如文件大小、权限、所有者以及指向文件实际数据块的指针。
6. 权限检查
在打开文件之前,系统会检查当前进程是否有足够的权限(基于inode中的权限信息)来执行请求的操作(读、写或执行)。
7. 创建文件描述符
权限检查通过后,内核会为该文件创建一个文件描述符(file descriptor)。文件描述符是一个非负整数,它在内核中唯一标识已打开的文件,并可被进程用来读写文件。
8. 返回文件描述符
最后,文件描述符会返回给用户空间的程序,程序接下来就可以使用这个文件描述符来进行文件读写等操作。
当我们尝试打开/usr/local/a.txt这个文件时,操作系统会经历以下步骤: 1. 路径解析: 操作系统首先解析文件的路径。根据路径/usr/local/a.txt,它会从根目录开始查找。 首先,它会读取根目录/的内容,查找usr这个目录条目对应的inode号码。 一旦找到usr目录的inode,系统就会加载这个inode,并访问存储在usr目录下的`文件条目和子目录`的列表。 接着在usr目录下查找名为local的目录,并重复上述过程,即加载其inode,查找local目录下的内容。 最后在local目录的内容中找到名为a.txt的`文件条目`,并获取其对应的`inode号码`。 2. inode加载: 系统根据得到的inode号码,从磁盘上的`inode表`中加载a.txt文件的`inode结构`。 inode结构包含了文件的各种属性信息,如文件类型、权限、所有者、组、文件大小、时间戳(创建、修改、访问时间)以及指向文件实际数据的指针。 3. 权限检查: 不通过将返回一个错误,通常是“Permission denied”。 4. 文件打开: 一旦确认用户有相应的权限,系统会在内核中为该文件创建一个文件描述符(`整数`)。 有了文件描述符之后,就可以通过Linux提供的系统调用(如read(), write()等)来操作文件内容了。 文件的实际数据可能存储在硬盘的不同位置,inode中的`指针`会指向这些数据所在的数据块。 系统会根据需要从磁盘读取数据到内存中,或者将内存中的数据写入到磁盘。 5. 关闭文件: 完成对文件的操作后,程序会调用close()系统调用来关闭文件描述符。 关闭文件描述符后,相关资源会被释放,该文件描述符也可以被其他文件使用。
Linux文件目录
绝对路径是从根目录(/)开始的完整路径,它可以唯一地标识一个文件或目录
相对路径是相对于当前工作目录的路径
cd: 改变当前工作目录 pwd: 显示当前工作目录的路径 ls: 列出指定目录下的文件和子目录 其实就是输出了目录文件的内容 chdir: 改变当前工作目录 getcwd: 获取当前工作目录的路径 access: 判断文件是否存在或是否有指定的权限
Linux系统目录文件是什么?
在Linux中,目录是一种特殊类型的文件。它的主要作用是存储其他文件和子目录的索引。一个目录文件包含了一系列的条目,每个条目都连接着一个文件名到相应文件(或子目录)的inode号码。
- 文件名:在该目录下的文件或子目录的名称。
- inode号码:与每个文件名对应的inode的唯一标识符。这个inode号码指向文件系统中的inode表里的一个特定的inode
Linux系统文件种类有哪些?
在Linux操作系统中,几乎所有的外接设备都是以文件的形式表示和访问的。这一设计理念体现在Linux的常说原则“一切皆文件”(Everything is a file)上。无论是硬盘、USB驱动器、打印机还是其他外围设备,它们在Linux中通常都有对应的文件表示。这些设备文件通常位于
/dev
目录下DT_REG:普通文件
DT_DIR:目录文件
DT_FIFO:命名管道
DT_SOCK:套接字文件
DT_CHR:字符设备文件
DT_BLK:块设备文件
DT_LNK:符号链接文件(软链接)套接字文件:
本地套接字通常位于
/tmp
目录、/var/run
目录,如:
- /var/run/mysqld/mysqld.sock:MySQL
- /proc/net/tcp:所有的TCP套接字文件
字符设备文件:
特点:
- 数据按字符(字节)流处理。
- 支持串行访问。
- 通常用于像键盘、鼠标、串口和打印机这样的设备。
示例:
/dev/tty
- 表示当前终端的控制终端。/dev/null
- 一个特殊的字符设备,任何写入它的数据都会被丢弃,读取它总是返回文件结束。/dev/random
和/dev/urandom
- 随机数生成器设备,提供随机数据。/dev/ttyUSB0
- 第一个 USB 串行端口设备文件。块设备文件:
特点:
- 数据按块(通常是512字节或更大)处理。
- 支持随机访问。
示例:
/dev/sda
- 第一个SCSI或SATA硬盘。/dev/sdb
,/dev/sdc
等 - 其他SCSI或SATA硬盘。ls -l命令查看/dev目录下的内容来区分字符设备和块设备 brw-rw---- 1 root disk 8, 0 Mar 10 08:53 /dev/sda crw-rw-rw- 1 root tty 5, 0 Mar 10 09:08 /dev/tty
Linux文件按块存储
在Linux文件系统中,一个数据块通常只用于存储单个文件的数据。每个数据块被分配给文件时,它将专门用于该文件的内容,并且不会与其他文件共享。
块的大小有1 KB、2 KB、4 KB或更大,当一个文件小于一个块的大小时,产生的未使用空间称为内部碎片。
Linux系统 Inode表是什么?
inode表是一个数据结构,它位于Unix和类Unix文件系统中,用来存储文件的元数据信息(除了文件名和目录信息之外的所有信息)。每个文件或目录在文件系统中都有一个唯一的inode,并且有一个对应的条目在inode表中。
每个inode条目通常包含以下信息:
文件的类型:比如普通文件、目录、符号链接、字符设备、块设备等。
权限位:指明哪些用户对该文件有读、写、执行权限。
所有者:文件的所有者的用户ID(UID)。
所属组:文件的所属组的组ID(GID)。
文件大小:文件的字节大小。
时间戳:文件的最后访问时间、最后修改时间、inode状态的最后改变时间等。
链接计数:指向该文件的硬链接数量。
数据块指针:指向文件实际内容的数据块的指针。这可能包括直接指针、间接指针、双重间接指针和三重间接指针。
`直接指针`: 这些指针直接指向包含文件数据的硬盘块。在inode中,通常有多个直接指针,每个指向一个不同的数据块。小文件的数据可能完全由直接指针引用。 `间接指针`: 一旦直接指针不足以引用文件数据时,就会使用间接指针。一个间接指针指向一个硬盘块,而这个硬盘块完整地被用作存储其他指针的数组,这些新指针各自指向实际包含文件数据的硬盘块。 `双重间接指针`: 当一个间接指针还不够时,双重间接指针会被利用 `三重间接指针`: 在极少数情况下,如果文件非常大,即使双重间接指针也不够用时,就会使用到三重间接指针 实际数据: 所以Linux文件系统是通过这种`索引分配`方法来管理文件的数据块 有些文件系统(FAT32,EXFAT)是通过`链接分配`来管理的 `顺序分配`比较少用,因为容易产生碎片
当文件系统被格式化时,inode表会被创建并预分配一定数量的inode,这些inode会占据连续的空间。每个inode都有一个数字标识符(称为inode号),文件系统通过这个inode号来引用特定的文件元数据。
文件名与inode之间的映射存储在目录项中。目录本身也是一种特殊的文件,它的内容包含了文件名和相应的inode号码。这样设计可以允许多个文件名(硬链接)指向
同一个inode
,因此同一个文件可以出现在多个位置,但是其元数据实际上只存储一份。Inode相关命令
在 /home/user 目录下查找 inode 号为 123 的文件: find /home/user -inum 123 查看 filename的 inode 号 ls -i filename
硬链接和软链接
硬链接:
- 定义:硬链接是指向文件inode的直接指针。创建硬链接时,实际上是在不同的位置创建了相同的文件名,这些文件名指向同一个inode号。
- 硬链接像是给文件创建了一个额外的“别名”,与原始文件完全等同。
软链接:
- 定义:软链接(符号链接)是一个特殊类型的文件,它包含了另一个文件的路径名信息。软链接文件自己有独立的inode和数据块,数据块中存储的是其所指向的目标文件的路径名。
- 属性独立:软链接与它所指向的文件有着不同的权限、所有者和大小信息。软链接的大小通常是它所包含的路径字符串的字符数。
- 限制:软链接可以跨文件系统创建,因为它们通过路径名而非inode号来引用文件。软链接可以指向目录,也可以指向不存在的文件或目录。
- 删除行为:删除软链接不会影响目标文件。如果删除了目标文件,软链接将成为一个悬空链接,也就是说它不再指向一个有效的文件,尝试访问该软链接将产生错误。
Linux文件权限
每个文件和目录都有三组权限:
- 所有者(Owner)权限:文件的创建者通常是其所有者,并且可以设置文件的权限。
- 组(Group)权限:文件属于一个用户组,该组内的所有用户共享相同的权限。
- 其他用户(Others)权限:系统上的其他用户的权限。
每组权限三种类型:
- 读(Read, r):允许读取文件内容或列出目录中的内容。
- 写(Write, w):允许修改文件内容或向目录中添加/删除文件。
- 执行(Execute, x):允许执行文件,或允许进入目录并访问其包含的文件和子目录。
- 所以 验证权限时 需要递归向上级目录验证权限
示例:
-rwxr-xr-- 1 user group 1024 Mar 10 08:53 example.txt 第一个字符表示文件类型(例如-代表普通文件,d代表目录,l代表符号链接等)。 chmod u=rwx,g=rx,o=r example.txt # 使用字母设置权限 chmod 754 example.txt # 使用数字设置权限