文件系统目录结构

文件系统的目录结构
文件和目录被组织成一个单根倒置树结构
文件系统从根目录下开始,用“/”表示
根文件系统(rootfs):root filesystem
标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
以 . 开头的文件为隐藏文件
路径分隔的 /
文件名最长255个字节
包括路径在内文件名称最长4095个字节
蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件
除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
Linux的文件系统分层结构:FHS Filesystem Hierarchy Standard
常见的文件系统目录功能
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
/bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
b: block device,随机访问
c: character device,线性访问
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置
/usr: universal shared, read-only data
bin: 保证系统拥有完整功能而提供的应用程序
sbin:
lib:32位使用
lib64:只存在64位系统
include: C程序的头文件(header files)
share:结构化独立的数据,例如doc, man等
local:第三方应用程序的安装位置
bin, sbin, lib, lib64, etc, share
/var: variable data files
cache: 应用程序缓存数据目录
lib: 应用程序状态信息数据
local:专用于为/usr/local下的应用程序存储可变数据
lock: 锁文件
log: 日志目录及文件
opt: 专用于为/opt下的应用程序存储可变数据
run: 运行中的进程相关数据,通常用于存储进程pid文件
spool: 应用程序数据池
tmp: 保存系统两次重启之间产生的临时数据
/proc: 用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置
应用程序的组成部分
二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64 配置文件:/etc, /etc/DIRECTORY, /usr/local/etc 帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/docLinux下的文件类型
- 普通文件 d 目录文件directory l 符号链接文件link b 块设备block c 字符设备character p 管道文件pipe s 套接字文件socket
文件操作命令
显示当前工作目录
每个shell和系统进程都有一个当前的工作目录 CWD:current work directory 显示当前shell CWD的绝对路径pwd命令: printing working directory
-P 显示真实物理路径
-L 显示链接路径(默认)
绝对和相对路径
绝对路径 以正斜杠/ 即根目录开始 完整的文件的位置路径 可用于任何想指定一个文件名的时候 相对路径名 不以斜线开始 一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置 可以作为一个简短的形式指定一个文件名 基名:basename,只取文件名而不要路径 目录名:dirname,只取路径,不要文件名 范例:更改目录
命令 cd : change directory 改变目录 选项:-P 切换至物理路径,而非软链接目录 可以使用绝对或相对路径 切换至父目录: cd .. 切换至当前用户主目录: cd 切换至以前的工作目录: cd - 范例:列出目录内容
ls 命令可以列出当前目录的内容或指定目录 用法:ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义 ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小
查看文件状态 stat
文件相关信息:metadata, data 每个文件有三个时间戳: access time 访问时间,atime,读取文件内容 modify time 修改时间,mtime,改变文件内容(数据) change time 改变时间,ctime,元数据发生改变确定文件内容
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用 格式:🌟文件通配符模式wildcard pattern
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件 通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符 常见的通配符如下:练习
1、显示/etc目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录列表创建空文件和刷新时间
touch命令可以用来创建空文件或刷新文件的时间复制文件和目录
利用 cp(copy)命令可以实现文件或目录的复制 格式
范例:
移动和重命名文件
mv 命令可以实现文件或目录的移动和改名
同一分区移动数据,速度很快:数据位置没有变化
不同分区移动数据,速度相对慢:数据位置发生了变化
格式:
利用 rename 可以批量修改文件名
格式:
删除文件

目录操作
显示目录树 tree 常见选项: -d: 只显示目录 -L level:指定显示的层级数目 -P pattern: 只显示由指定wild-card pattern匹配到的路径 创建目录 mkdir 常见选项: -p: 存在于不报错,且可自动创建所需的各目录 -v: 显示详细信息 -m MODE: 创建目录时直接指定权限 删除空目录 rmdir 常见选项: -p 递归删除父空目录 -v 显示详细信息 注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树 范例文件元数据和节点表结构
inode 表结构
据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个 文件的元数据信息 每一个inode表记录对应的保存了以下信息:

硬(hard)链接
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件 硬链接特性符号 symbolic (或软 soft)链接
一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件 软链接特点🌟硬链接和软链接区别总结
生产案例
案例1:提示空间满 No space left on device,但 df 可以看到空间很多,为什么? 假设你有一个文件系统,其总inode数为4194304个。当前已经使用了60830个inode,剩余可用的inode数量为4133474个。你尝试创建大量文件,直到inode耗尽。
创建大量文件耗尽inode
假设你使用以下命令创建了大量文件:
df和df -i的输出可能如下:
IUsed达到了4194303,IFree只剩下1,IUse%达到了100%。
/dev/mapper/openeuler-root的磁盘空间使用率仅为5%,还有大量的空间可用。
尝试创建新文件
此时,你尝试创建一个新文件:touch /test/newfile
你会收到以下错误:
结论:为什么会出现“案例2:提示空间快满,使用 rm 删除了很大的无用文件后,df仍然看到空间不足,为什么?如何解决? 复现过程 查看df状态 利用率5%No space left on device”? 尽管磁盘空间充足,但inode已经耗尽。每个文件和目录都需要一个inode来存储其元数据。当inode耗尽时,即使磁盘空间还有剩余,也无法创建新的文件或目录。因此,当你尝试创建新文件时,系统会报出“No space left on device”的错误。


rm删除了很大的无用文件后,df仍然看到空间不足”的情况。原因是文件被某个进程占用,导致磁盘空间没有立即释放。通过查找并关闭占用文件的进程,可以解决这个问题。
IO 重定向和管道
标准输入和输出
程序:指令+数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: file descriptor (文件描述符) Linux给程序提供三种 I/O 设备 标准输入(STDIN) -0 默认接受来自终端窗口的输入 标准输出(STDOUT)-1 默认输出到终端窗口 标准错误(STDERR) -2 默认输出到终端窗口 范例:文件描述符I/O重定向redirect
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标标准输出和错误重新定向
STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端 格式>> 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件
(CMD1;CMD2......) 或者{ CMD1;CMD2;....; }合并多个程序的STDOUT
范例:
- 前四条命令:
- 都是先处理标准输出或标准错误的重定向,然后再处理另一个流的重定向。
- 例如,
ls /data /xxx > /data/all.log 2>&1先将标准输出重定向到文件,再将标准错误重定向到标准输出。
- 第五条命令:
ls /data /xxx 2>&1 > /data/all.log先将标准错误重定向到标准输出,然后再将标准输出重定向到文件。- 这种顺序在某些情况下可能会导致不同的行为,尤其是在更复杂的命令中。但在这个特定的例子中,最终结果是相同的。
标准输入重定向
从文件中导入STDIN,代替当前终端的输入设备,使用 < 来重定向标准输入 某些命令能够接受从文件中导入的STDINtr 命令
tr 转换和删除字符标准输入重定向
实现标准输入重定向的符号把多行重定向
使用<<终止词 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,有时被称为就地文本(here documents)其中终止词可以是任何一个或多个符号,比如:!,@,$,EOF(End Of File),magedu等,其中EOF比较常用
高级重定向写法
cmd <<< "string"
含义是 here-string ,表示传给给cmd的stdin的内容从这里开始是一个字符串。
范例:
cmd1 < <(cmd2)
名称为 Process substitution ,是由两个部分组成
<(cmd2) 表示把cmd2的输出写入一个临时文件, 注意:<和(之间无空格
cmd1 < 这是一个标准的stdin重定向
把两个合起来,就是把cmd2的输出stdout传递给cmd1作为输入stdin, 中间通过临时文件做传递
管道
管道
管道(使用符号“|”表示)用来连接多个命令
格式
