L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

Linux文件系统

字数:3791 写于:2021-12-29
最新更新:2021-12-29 阅读本文预计花费您11分钟

文件与目录类型

常见的文件类型

  1. 普通文件:最为常见的文件类型,包括纯文本文件(ASCII),二进制文件(binary),数据文件(data)等
  2. 目录:即文件夹,用于包含更多目录和文件
  3. 块设备文件:将硬盘、光盘等存储设备以文件形式供用户操作
  4. 字符设备文件:将串行端口的接口设备,如键盘、鼠标等以文件形式供用户操作
  5. 套接字文件:又称为数据接口文件,用于网络数据连接
  6. 管道文件:用于进程间的通讯
  7. 链接文件:分为硬链接和软链接,用于通过快捷方式或引用快速访问另一个文件或目录

Linux目录

指令集
  • /bin   Binaries的缩写,存放普通用户可使用的系统命令,如:ls
  • /sbin Super user Binary的缩写,存放只有系统管理员才能使用的系统命令,如:shutdown、reboot
  • /usr/bin 存放安装软件后,普通用户可以使用的软件命令,如:c++、make、wget等
  • /usr/sbin 存放系统管理员用户安装使用的高级管理程序和系统服务程序,如:httpd、netconfig、tcpd等
系统文件
  • /etc Etcetera(其他)的缩写,这个目录用来存放所有系统管理所需要的配置文件和子目录
  • /var 存放一些经常被修改、扩充的文件,如各种日志文件
  • /boot 存放引导启动Linux时使用的核心文件,如镜像文件等
  • /sys  Linux2.6内核新增的文件系统sysfs,sysfs文件系统集成了3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统
  • /lib 存放系统所需要的动态链接库(如C++库),相当于windows的dll文件
  • /dev Device的缩写, 将Linux主机的硬件以文件形式存储并提供访问,相当于Windows的设备管理器
  • /usr/src 内核源代码、说明文档等默认放置目录
  • /opt 默认为空,常用于安装额外软件
  • /proc Processes(进程)的缩写,虚拟的目录,用于管理内存空间,是系统内存的映射,我们可以直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里
  • /selinux 全称为security-enhanced linux,该目录是 Redhat/CentOS 所特有的目录,是Redhat/CentOS的安全子系统
  • /srv service缩写,存放一些服务启动后需要提取的数据
用户
  • /root 系统管理员的账号主目录
  • /home 存放普通用户的相关文件,Linux会在home目录下为每一个用户生成一个以用户账号命名的目录
  • /usr Unix Software Resource(共享资源)的缩写,放置用户的应用程序和文件,类似于windows下的program files目录
  • /usr/local 软件安装目录,一般通过源码编译安装方式安装的软件都会存放于该目录下
  • /usr/include 放置如c/c++等程序语言的头文件(header)与包含档(include)
  • /usr/lib 放置各应用软件的函式库、目标文件等,如果使用的是X86_64的Linux系统,则可能会生成/usr/lib64文件夹
外部文件
  • /media 挂载U盘、光驱等设备的目录,类似于windows的其他设备
  • /mnt 让用户挂载其他的文件系统,如将Windows上的某个目录挂载在/mnt下,可用于共享文件等

临时文件

  • /lost+found 一般情况下为空目录,用于存放系统非法关机或者发生意外错误后,fsck(磁盘修复)过程修复的部分文件
  • /tmp 用于存放临时文件
  • /run 一个临时文件系统,存放存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。

文件系统

简介

与Windows不同,Linux在路径中不使用驱动器盘符。Windows将物理磁盘驱动器分为盘符(如C盘、D盘),每个盘都会有自己的目录结构,并通过诸如C:\Users\ Administrator \Documents等方式访问文件。

Linux则采用了一种不同的方式,Linux内核采用虚拟文件系统(Virtual File System,VFS),内核将所有安装在PC上的存储设备的文件纳入单个目录结构中,这个目录被称为虚拟目录(virtual directory)。Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出,并使用正斜线 /(windows使用反斜线\)来做路径划分。

Linux文件系统结构是从Unix文件结构演进过来的,并遵守文件系统层级标准(filesystem hierarchy standard,FHS),它确定了Linux系统中每个目录的用途和应该包含的内容,并保证不同Linux发行版之间的文件布局是一致的

Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Windows)采用的文件系统中读写数据,但内核必须在编译时加入对所有可能用到的文件系统的支持,以下为Linux系统用来读写数据的标准文件系统

文件系统 说明
ext Linux扩展文件系统,最早的Linux文件系统
ext2 第二代扩展文件系统,在ext的基础上提供了更多的功能
ext3 第三代扩展文件系统,支持日志功能
ext4 第四代扩展文件系统(Fourth Extended File System),支持高级日志功能,目前Linux主流的文件系统
tmpfs 一种临时文件系统,常见于类Unix操作系统,使用内存(RAM)作为文件存储区,适合需要高速读写和不需要持久存储的数据情况
devtmpfs 临时设备文件系统,常见于类Unix操作系统,该文件系统会在内存中创建一个区域,用于管理/dev目录下的设备文件,方便动态管理硬盘、网络接口、终端等物理设备,可以简化设备管理,提高系统启动速度
FAT16 用于微软的ms-dos操作系统,Windows最初是作为MS-DOS的一个图形用户界面(GUI)扩展而开发的,但随着技术的进步,Windows操作系统逐渐发展成一个独立的操作系统,从Windows NT 4.0 开始,Windows不再依赖于MS-DOS
VFAT FAT32的扩展版本,在FAT32的基础上加入了长文件名支持功能,名称上实际仍称为FAT32。FAT32是windows98等旧版本windows的主要文件系统,现在广泛用于相机SD卡、U盘等,最大支持的单个文件大小为4GB,最大分区大小为2TB
NTFS 全称为New Technology File System,目前windows主要使用的高级文件系统,广泛用于windows7、10,支持数据加密,文件权限控制,日志记录与恢复等功能,最大支持的单个文件大小为16TB(取决于分区大小),分区大小可达到256TB或更高
hpfs OS/2高性能文件系统
jfs IBM日志文件系统
iso9660 标准CD-ROM文件系统,主要用于CD
minix MINIX文件系统
ncp Netware文件系统
nfs 网络文件系统
proc 访问系统信息
ReiserFS 高级Linux文件系统,能提供更好的性能和硬盘恢复功能
smb 支持网络访问的Samba SMB文件系统
sysv 较早期的Unix文件系统
ufs BSD文件系统
umsdos 建立在msdos上的类Unix文件系统
XFS 高性能64位日志文件系统

文件系统的架构

Linux 文件系统采用了层次化的设计,通常分为以下几层:

  • 虚拟文件系统(Virtual File System,VFS):虚拟文件系统是操作系统内核的一部分,它为不同类型的文件系统提供了统一的接口,屏蔽了底层文件系统的差异性,使Linux能够同时挂载各种文件系统
  • 实际文件系统(File System Implementation Layer):该层实现了具体的文件系统,如 ext4、XFS、Btrfs、FAT32 等,每种文件系统都有其独特的数据结构和实现方式,但它们都通过 VFS 提供一致的接口,向上层应用程序隐藏具体细节
  • 存储设备层(Storage Device Layer):该层包括实际的存储设备(如 HDD、SSD、USB 闪存盘等)及其驱动程序,管理设备的物理 I/O 操作。文件系统将逻辑数据映射到这些物理设备上,通过块设备接口(如 /dev/sda)来访问硬盘的块(block)数据
简单预览: +--------------------+ | 应用程序层 | <---- 用户通过命令或程序操作文件 +--------------------+ | 系统调用层 | <---- 系统调用(如 `open`、`read`、`write`) +--------------------+ | 虚拟文件系统 (VFS)| +--------------------+ | 实际文件系统层 | <---- ext4, XFS, Btrfs, FAT32, NFS 等 +--------------------+ | 存储设备层 | <---- 硬盘、SSD、USB 驱动器 +--------------------+

Linux文件系统都有以下几个重要组成部分:

  • 超级块(Superblock):超级块包含了文件系统的元数据,比如文件系统的大小、块大小、inode 数量、已用和可用的 inode 及数据块等信息。超级块是文件系统的控制信息,通常被加载到内存中,用于文件系统的管理和访问。
  • 索引节点(Inode):Inode是每个文件或目录的描述符,每个文件都有唯一的inode标识符,在文件系统中,文件通过inode号来唯一标识,inode包含文件的元数据,如:
    • 文件类型(普通文件、目录、符号链接等)
    • 文件大小
    • 所有者(用户 ID 和组 ID)
    • 访问权限(读、写、执行)
    • 时间戳(创建时间、修改时间、访问时间)
    • 指向数据块的指针
  • 数据块(Data Block):数据块是文件的实际内容存储区域。每个数据块大小通常为4KB,文件系统通过 inode 中的指针(direct 和 indirect pointers)来定位文件的数据块
  • 目录(Directory):目录是一种特殊类型的文件,它包含了其他文件或子目录的列表。每个目录项包含文件名和对应的inode号。当用户查找一个文件时,系统会先根据目录文件中的inode号找到对应的 inode,再通过inode中的指针找到数据块。
  • 日志(Journaling):大多数现代Linux文件系统(如 ext3、ext4、XFS)都使用日志机制来提高数据可靠性。日志记录文件系统中所有的元数据变化操作,确保在系统崩溃或突然断电时,可以通过重播日志恢复文件系统的完整性。

文件系统的工作

  • 文件查找: 当用户要访问某个文件时(如 /home/user/file.txt),系统会按照以下步骤进行查找:
    1. 从根目录 / 开始,找到 home 目录的 inode。
    2. 根据 home 目录 inode 中的数据块指针,找到 user 目录的 inode。
    3. 最终找到 file.txt 的 inode,然后通过该 inode 访问文件的数据块。
  • 文件读操作: 当文件被读取时(例如使用 cat 命令),系统会:
    1. 根据目录结构找到文件的 inode。
    2. 读取 inode 中指向的数据块指针。
    3. 从数据块中读取文件内容,并将其返回给用户。
  • 文件写操作: 当文件被修改或创建时(例如使用 echo 命令),系统会:
    1. 为新文件分配一个 inode,设置文件的元数据(所有者、权限等)。
    2. 分配新的数据块,并写入文件内容。
    3. 更新 inode 中的指针,使其指向新的数据块。
    4. 更新文件系统的超级块信息(例如可用 inode 和数据块数量)。
  • 元数据更新和日志记录:为了防止数据丢失,文件系统通常会先将元数据更新写入到日志区域中,然后再进行实际操作。这种机制被称为 “Write Ahead Logging”。在日志写入成功后,再进行实际的文件写操作,确保在系统故障时能够快速恢复文件系统。

文件的信息

时间信息

在 Linux 系统中,文件的时间戳主要包括以下三种类型:

  • 访问时间(Access Time,atime):文件上次被读取的时间,使用cat、less、head等命令读取文件内容,或通过bash script.sh执行脚本文件,都会更新atime。但认情况下,为了提升性能,大多数 Linux 文件系统(如 ext4)会使用relatime挂载选项,这意味着只有在 atime 比 mtime 或 ctime 旧时,atime 才会更新。因此,某些文件访问操作不会立即反映到atime中
  • 修改时间(Modification Time,mtime):文件内容上次被修改的时间,通过echo、vim、nano和重定向符修改文件内容都会更新mtime
  • 更改时间(Change Time,ctime):文件的元数据(如权限、所有者、文件名等文件属性)上次被更改的时间,通过chmod、chown、chattr修改文件属性,使用mv命令移动、重命名文件都会更新ctime,使用vim,nano修改文件时,编辑器可能会创建临时文件,并使用新文件覆盖原文件,也会更新ctime
  • 创建时间(Birth Time或Creation Time,btime):表示文件首次被创建时的时间,这是一个教新引入的时间戳,因此,一些传统的文件系统不支持该时间戳,一些新的文件系统(如 ext4)也默认不保存创建时间,需要特定文件系统(如 btrfs)或内核版本支持才可以查看

df查看文件系统空间使用情况

GNU提示:df命令仅安装在拥有挂载表的系统上,因此跨平台可移植脚本不应该依赖该命令

df [参数] [挂载点]

  • 默认情况下,命令会输出所有当前已挂载文件系统的信息
  • -a  显示所有文件系统信息,包括特殊文件系统,这些文件系统通常无法直接访问,因此默认不显示
  • -h  将磁盘大小单位换算为KB、MB等单位,以1024作为基数进行换算
  • -H  等价于-‌-si选项,换算单位为K、M等单位,以1000作为基数进行换算
  • -m  以MB为单位显示容量
  • -k  以KB为单位显示容量,默认值
  • -T  显示文件系统类型
  • -i  列出 inode 使用情况信息,而不是块使用情况
  • -l  只列出本地文件系统,默认情况下还会列出远程文件系统
  • -‌-output=项目:只列出指定项目,指定多个项目可以用逗号分隔(如-‌-output=source,target),接收的参数有:source(挂载来源,通常是设备)、target(挂载点)、fstype(文件系统类型)、itotal(inode总数)、iused(已用inode数量)、iavail(可用inode数量)、ipcent(iused除以 itotal的百分比)、size(块总数)、used(已使用的块数)、avail(可用的块数)、pcent(used除以size)、file(文件名,需要在命令行指定)
  • -t 文件系统:只显示某个文件系统的信息,可以指定多个-t选项
df命令会输出以下信息: 1.文件系统名或挂载源 2.能容纳多少个1024字节大小的块 3.已用了多少个1024字节大小的块 4.还有多少个1024字节大小的块可用 5.已用空间所占的比例 6.设备挂载到了哪个挂载点上(挂载点) 如: Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 234280 0 234280 0% /dev tmpfs 246136 0 246136 0% /dev/shm tmpfs 246136 29192 216944 12% /run tmpfs 246136 0 246136 0% /sys/fs/cgroup /dev/vda1 9778432 3429132 5808684 38% / tmpfs 49228 0 49228 0% /run/user/0
df命令会统计包括一些磁盘碎片在内的空间,而该类空间是被程序占用后释放的碎片空间,需要Linux整理后才能使用,因此df命令统计结果也往往比du命令统计结果大,但更能正确反映系统可用的空间大小

du显示目录或文件大小

通过df命令发现磁盘空间快满时,可以通过du命令查看是哪些文件占用了较大的存储空间

du [参数] [目录或文件名]…

  • 默认情况下,命令会显示当前目录中每个子目录的磁盘块占用数量,并在最后一行输出当前目录总占用数量,该行为会递归进行,即会打印子目录的后代子目录信息,它会以磁盘块为单位来表明每个文件或目录占用了多大存储空间
  • -a 打印每个子目录以及子文件的大小
  • -h 将文件大小单位换算为K、M等单位
  • -k 以K为单位打印占用空间
  • -m 以M为单位打印占用空间
  • -c 在处理完所有文件后,打印总计
  • -s 只统计总大小,不列出子目录和文件
  • -d 值depth:只从当前目录向下统计depth层(文件的层次结构),当前目录为第0层
  • -‌-inodes 列出inode的使用情况,而不是块使用情况
  • -L 显示链接指向的文件或目录的所占用空间大小,而不是链接文件本身
  • -t 值:如果给定的值为正数,则只打印大于等于该值的目录或文件信息,如果值为负数,则只打印小于等于该值的目录或文件,这里的值可以使用kB、k、KiB等单位
  • -‌-time:打印文件或目录的上一次内容修改时间mtime
  • -‌-time=ctime:打印文件或目录上一次属性修改时间ctime
  • -‌-time=atime:打印文件或目录上一次访问时间atime
  • -‌-exclude=正则pattern:递归统计时,跳过与pattern匹配的子目录或文件,如du -‌-exclude=’*.o’ 排除以.o结尾的文件
  • -X 文件名:从该文件中获取需要排除的文件或目录,每一行表示一个或一类文件,可以使用正则表达式,如果文件名为-,表示从标准输入获取
ls命令只统计目录下一级子文件和子目录文件信息大小,而不统计子目录下属文件大小,du命令更能准确统计出子文件、子目录和子目录所含文件的数据大小

文件系统修复

fsck [参数] 分区设备名

  • -a  不显示用户提示,自动修复文件系统
  • -y  功能同-a,部分文件系统仅支持-y

文件系统挂载与卸载

Linux文件系统将所有的磁盘都并入一个虚拟目录下。在使用新的存储媒体之前(如载入U盘等),需要把它放到虚拟目录下,这个步骤称为挂载(mounting)

查询挂载信息

mount显示已经挂载的设备

  • -l显示卷标
mount命令提供如下四部分信息: 1.媒体的设备文件名 2.媒体挂载到虚拟目录的挂载点 3.文件系统类型 4.已挂载媒体的访问状态 如:/dev/vda1 on / type ext4 (rw,relatime,data=ordered) /dev/vda1为设备文件名,该设备挂载在根目录下 /,文件系统为ext4,其余为该设备的访问状态
自动挂载

在桌面版Linux中,默认会自动挂载设备,也可以通过命令完成自动挂载,自动挂载会根据文件/etc/fstab中指定的文件系统完成挂载

mount -a根据配置文件 /etc/fstab 自动挂载

  • -a 挂载所有未挂载的文件系统
  • -aF 会同时挂载所有文件系统
  • -aO 可以在/etc/fstab中为某个文件系统指定特定的挂载选项,并应用这些选项
手动挂载

mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点

  • -t 文件系统:挂载指定文件系统,如 ext4、iso9660
  • -L 卷标名:自定义卷标的名字
  • -f 模拟挂载设备,但并不真的挂载
  • -s 忽略该文件系统不支持的挂载选项
  • -r 将设备挂载为只读的
  • -w 将设备挂载为可读写的(默认参数)
  • -v 详细模式,详细说明挂在设备的每一步
  • -n 挂载设备,但不注册到/etc/mtab已挂载设备文件中
  • -s 忽略该文件系统不支持的挂载选项
  • -o 特殊选项:指定挂载的额外选项,以下是几个常用的选项:
参数 说明
ro 以只读方式挂载,
rw 以可读写方式挂载
user/nouser 是否允许普通用户挂载文件系统,默认为不允许
check=none 挂载文件系统时不进行完整性校验
loop 挂载一个文件
atime/noatime 访问分区文件时是否更新文件访问时间
exec/noexec 是否允许文件系统中的可执行程序可以运行,默认为exec允许
remount 重挂载已经挂载的文件系统,一般用于修改特殊权限后重挂载
示例: # mount -o remount,noexec /home/ 禁止 /home/分区中的所有可执行程序执行,包括root用户
硬件设备文件名

通过文件名可以判断该设备文件对应的设备,以下说常用的设备文件名

硬件 设备文件名
IDE硬盘 /dev/hd[a-d]
SCSI/SATA/USB硬盘 /dev/sd[a-p]
光驱 /dev/cdrom 或 /dev/sr0
软盘 /dev/fd[0-1]
打印机(25针) /dev/lp[0-2]
打印机(USB) /dev/usb/lp[0-15]
鼠标 /dev/mouse
挂载光盘

为方便文件查找,一般将光盘挂载于根目录下的 /media ,U盘挂载于/mnt目录下,iso9660为光盘默认文件系统,因此-t iso9660 可以省略

mount -t iso9660 /dev/cdrom /media

挂载U盘
  1. fdisk -l查看U盘设备文件名

  2. mount -t  文件系统  /dev/U盘设备文件名  /mnt

linux默认不支持NTFS文件系统(大部分移动硬盘设备使用NTFS文件系统),但可以通过插件提供支持

卸载设备

注意,如果有任何程序正在使用设备上的文件,系统就不允许卸载,而是会提示 device is busy,注意命令不是un开头,没有n
umount 设备文件名或挂载点目录名卸载设备

如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。如:lsof /path/to/device/node,或者lsof /path/to/mount/point

压缩与解压缩

文件的压缩与解压(.gz格式)

.gz是GNU gzip软件的压缩格式,与windows不同,下述命令只能压缩与解压缩文件,不能处理文件夹,并且压缩完只保留压缩文件,不保留原文件

  • gzip 文件名 压缩(GUN zip)
  • gunzip 文件名 解压缩(GUN unzip)
  • gzcat 文件名 原来查看压缩过的文本文件内容
e.g.可以在命令中指定多个文件名,或使用通配符一次压缩多个文件,每个文件单独生成一个.gz压缩文件 $ gzip my* #压缩所有my开头的文件

文件的打包、压缩与解压(.tar.gz格式)

打包与压缩

tar命令用于文件的归档打包,它将指定的文件或目录以指定的方式进行组织和存储,包括文件的权限、所有者、时间戳等信息,并打包成一个单独的文件,打包后的文件格式一般为.tar,打包后的文件可以用gzip命令压缩,生成.tar.gz(或.tgz)格式的压缩包文件,tar命令也支持直接将文件重定向给gzip命令,一次性完成打包、压缩操作,打包压缩后的文件名可以不写.tar.gz等后缀,但不方便用户识别

tar [参数] [打包后文件名] [打包文件/目录] 打包文件或目录

  • -c(-‌-create)  打包为一个新的归档文件
  • -z  将输出重定向给gzip命令,即打包后压缩(需要和-c等参数一起使用)
  • -r(-‌-append)  追加文件到已有tar归档文件末尾
  • -A(-‌-concatenate)  将一个已有tar归档文件追加到另一个已有tar归档文件
  • -d(-‌-diff)  检查该文件和其在归档文件中的不同之处,如果被修改则标记为changed,被删除标记为deleted,该文件未被打包到归档文件中则标记为added
  • -‌-delete  从已有tar归档文件中删除
  • -u(-‌-update) 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
  • -p 保留所有文件权限
  • -v  显示详细信息
  • -t(-‌-list) 列出已有tar归档文件的内容
  • -f  指定文件名(该参数必须)
示例: # tar -cvf test1.tar test1 打包test1文件夹中文件为test1.tar文件,并显示详细信息 # tar -zcf test.tar.gz test1 打包并压缩test1文件夹为test.tar.gz
解压

tar [参数] [解压缩的文件]

  • -x  解包,提取文件
  • -v  显示详细信息
  • -f  指定解压缩的文件(该参数必须)
  • -z  解包后解压缩(需要和x参数一起使用)

    最常用的是解压一个.tar.gz文件,因此大多数情况下-zxf为必用参数

    示例: # tar -zxvf test.tar.gz 解压缩test.tar.gz文件,并显示详细信息

.zip格式的压缩与解压

zip [选项] [-r] [压缩后文件名] [压缩文件或目录]

  • -r 压缩目录

    .zip格式为Linux和windows通用格式,zip命令会保留原文件,并且一个命令就可以处理文件与文件夹

unzip [解压的文件名]

解压文件

.bz2、.tar.bz2格式的压缩与解压

1. 压缩
对文件(格式为.bz2)

bzip2 [参数] [-k][文件]

  • -k  压缩后保留原文件
对文件夹(格式为.tar.bz2)

tar -jcf [压缩后文件名] [压缩目录]

即将tar中的z参数改为j参数就是压缩为.tar.bz2格式

2. 解压
对文件(格式为.bz2)

bunzip2 [-k] [解压文件]

  • -k  解压缩后保留原文件
对文件夹(格式为.tar.bz2)

tar -jxf [解压文件]

同样将tar中的z参数改为j参数就是解压.tar.bz2格式

上一篇:Linux用户与权限管理
下一篇:Linux文件操作
z z z z z