栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Linux文件系统

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux文件系统

Linux文件系统 1.磁盘 1.1 分类

​ 由于计算机内存通常太小而不能永久保存所有数据和程序,因此计算机系统必须提供外存来备份数据和程序。现代计算机系统采用磁盘来作为信息的主要存储介质。磁盘是一种磁性材料记录信息的盘状物,主要分两类:硬盘和软盘。

1.2 结构 1.2.1 内部结构

​ 一个磁盘统常由多个盘片(磁面)组成,盘片正反两面皆可存储二进制数据。每个盘片都配有一个读写磁头(正反面各一个),磁头悬浮在盘片上方(微米距离)。所有磁头附着在同一磁臂上,所有磁头随磁臂一起整体移动。盘片正常以一定速度绕转轴旋转。

​ 每个盘片可分为多个圆形磁道(),每个磁道可再细分为扇区(sector,磁盘I/O读写的最小单位,512B、4KB),同一磁臂位置的的不同磁道形成了柱面。

1.2.2 外部结构

​ 磁盘内部配上固定板、磁盘控制器和磁盘接口就可以组成一个完整的磁盘了。固定板用于保护整个硬盘,和地板合成一个密封整体,保证磁盘稳定运行(磁头和盘片表面有接触危险,出现磁头碰撞以后通常无法修复)。磁盘控制器用于驱动转轴、磁头、定位及读写等功能。磁盘接口包括电源和数据接口等,数据接口用于和主机之间进行数据传输,通常有多种可用总线,包括硬盘接口技术(ATA)、串行 ATA(SATA)、外部串行 ATA(eSATA)、通用串口总线(USB)等。

1.2.3 补充
  • 通过柱面号、盘面号和扇区号可以确定一个地址。
  • 首先通过柱面号移动磁臂,让磁头指向指定柱面;然后根据盘面号激活对应的磁头;在磁盘旋转过程中,让磁头从指定的扇区号下面划过,即可完成对指定扇区的读/写。
  • SSD采用半导体闪存(Flash)作为存储设备,由控制单元、存储单元(Flash、DRam)以及缓存单元组成,原理和机械硬盘不同。固态硬盘接口通常有SATA、mSATA、m.2及PCI-E4种。
2.文件系统 2.1 Linux 文件系统层次

​ 在 Linux 文件系统结构如下图所示,硬盘驱动,文件系统,虚拟文件系统,以及系统调用,都属于内核空间;而用户空间主要是一些对磁盘的读写访问操作。

​ **硬盘驱动:**与不同类型硬盘进行通信(PATA、SATA以及AHCI)。

​ 通用块设备层:不同的硬盘有不同的驱动,那么内核为了方便管理,于是定义统一抽象的硬盘驱动接口, 屏蔽不同硬盘驱动带来的IO接口的多样性和复杂性。

​ 文件系统:内核所支持的文件系统(磁盘、内存、网络文件系统)类型,可以通过下载内核源码,查看目录树 fs 中的类型,常用的如Ext2、Ext4等。

​ **虚拟文件系统:不同的文件系统有不同的api,VFS将这些API统一,供SCI调用。常见有mkdir()/open()**等

​ **系统调用:**为用户程序提供系统调用的接口。

2.2 Ext2文件系统 2.2.1 概述

​ Ext2 文件系统在格式化的时候基本上是区分为引导块(Boot Sector)和多个区块群组 (block group)。引导块(Boot Sector)在文件系统最前面,这个开机扇区可以安装开机管理程序,在系统启动时用于启用引导。我们能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的 MBR。每个区块群组都有独立的 inode/block/superblock 系统。

2.2.2 组成
  • superblock(超级块)

    ​ 记录文件系统的类型、block大小、block总数、inode大小、inode总数、group的总数等。文件系统中会存在磁盘的多个不同位置(按一定规则,存储在个别快组开头)会存在主superblock的备份副本,一旦系统出问题后还可以通过备份的superblock对文件系统进行修复。

  • Block Group Descriptor Table(块组描述符表)

    ​ 描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。

  • block bitmap(区块位图)

    ​ 一个block bitmap占用一个block大小,而block bitmap中每个bit表示一个对应block的占用情况,0表示对应的block为空,为1表示相应的block中存有数据。新增/删除文件时会查询/置位对应bit。

  • inode bitmap(inode 对照表)

    ​ 与 block bitmap 功能类似,只是 block bitmap 记录的是使用与未使用的 block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码。

  • inode table(inode 表)

    ​ 每个Group中的所有inode存放在inode table中。

  • inode

    ​ 一个文件占用一个 inode(128 Bytes),每个inode有编号。每个inode主要记录文件的属性以及该文件实际数据是放置在哪些block中(文件名存储在目录的block中)。

    ​ 里面有 12 个直接指向 block 号码的对照。所谓的间接就是再拿一个 block 来当作block 号码的记录区,如果文件太大时, 就会使用间接的 block 来记录码。当中间接只是拿一个 block 来记录额外的号码而已。 同理,如果文件持续长大,那么就会利用所谓的双间接,第一个 block 仅再指出下一个记录号码的 block 在哪里, 实际记录的在第二个 block 当中。依此类推,三间接就是利用第三层 block 来记录号码。此时我们知道当文件系统将 block 格式化为 1K 大小时,能够容纳的最大文件为 16GB(12 + 28+ 216 + 224 (K))。

2.2.3 总结

​ 目录

​ 创建:当我们在 Linux 下的文件系统创建一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。


​ 文件

  • **创建: ** 当我们在 Linux 下的 ext2 创建一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件。

    示例:假设我的一个 block 为 4 KBytes ,而我要创建一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 block 来储存该文件! 但同时请注意,由于 inode 仅有 12 个直接指向,因此还要多一个 block 来作为区块号码的记录。

  • **读取:**因为文件名是记录在目录的 block 当中, 因此当我们要读取某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码, 最终才会读到正确的文件的 block 内的数据。

    示例:读取etc/passwd文件。

    1. / 的 inode: 通过挂载点的信息找到 inode 号码为 2的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r 与 x) ;
    2. / 的 block: 经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (783361);
    3. etc/ 的 inode: 读取 783361号 inode 得知具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
    4. etc/ 的 block: 经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (796958);
    5. passwd 的 inode: 读取 796958号 inode 得知具有 r 的权限,因此可以读取 passwd 的 block 内容;
    6. passwd 的 block: 最后将该 block 内容的数据读出来
  • 移动:

    同文件系统下移动文件实际上是修改目标文件所在目录的data block,向其中添加一行指向inode table中待移动文件的inode指针,如果目标路径下有同名文件,则会提示是否覆盖,实际上是覆盖目录data block中冲突文件的记录,由于同名文件的inode记录指针被覆盖,所以无法再找到该文件的data block,也就是说该文件被标记为删除。所以在同文件系统内移动文件相当快,仅仅在目标目录data block中添加或覆盖了一条记录而已。也因此,移动文件时,文件的inode号是不会改变的。对于不同文件系统内的移动,相当于先复制再删除的动作。


  • 在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。
  • 一个block只能存放一个文件,剩余空间将被浪费掉。因此如果你的文件都非常小,但是你的 block 在格式化时却选用最大的 4K 时,可能会产生一些容量的浪费。所以我们可以说,在进行文件系统的格式化之前,先想好该文件系统预计使用的情况。
  • 创建一个文
    • 文件具体内存记录在block中,block是新生成文件


2.3 相关内容 2.3.1 文件类型

​ Linux的文件类型(dcb-lsp,7种):

文件类型标识颜色备注
普通文件-白/红/绿纯文本文件(ascii);二进制文件(binary);各种压缩文件
目录文件d蓝能用cd命令进入的
链接文件l红符号链接文件
块设备文件b黄存储数据以供系统存取的接口设备(硬盘)
字符设备文件c黄指在I/O传输过程中以字符为单位进行传输的设备
管道文件p土黄管道都是一端写入、另一端读取,它们是单方向数据传输的,
它们的数据都是直接在内存中传输的,如父进程写,子进程读。
套接字文件s桃红用来实现两端通信,可以实现双向管道的进程间通信功能
2.3.2 链接
  • 符号链接(soft link)

    符号链接相当于重新创建一个文件,这个文件有独立的 inode,但是这个文件的内容是另外一个文件的路径,所以访问符号链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至**目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。**符号链接与windows下的快捷方式类似。

    • 创建符号链接指令:ln -s source_file target_file
    • 软链接可对文件或目录创建
    • 创建软链接时,链接计数 i_nlink 不会增加
    • 可对不存在的文件或目录创建软链接
    • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)

  • 硬链接(hard link)

    ​ 一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。Linux系统允许,多个文件名指向同一个inode号码。可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。

    • 只能对已存在的文件进行创建
    • 不能对目录进行创建,只可对文件创建
    • inode 是不可能跨越文件系统的,所以硬链接是不可用于跨文件系统的
    • 只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件
    • 创建硬链接指令:ln source_file target_file
    • 创建目录时,默认会生成两个目录项:“.“和”…”。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接", 总是等于2加上它的子目录总数(含隐藏目录);后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。

2.3.3 挂载

​ **含义:**将文件系统与目录树结合的动作我们称为“挂载”。指的就是将设备文件中的顶级目录连接到 Linux根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。

**原因:**在 Linux看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。
mount命令格式
mount [-t vfstype] [-o options] [设备名称] [挂载点]
  • 挂载点: 必须是一个已经存在的目录,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用,umount以后会恢复正常;挂载点目录不可被其他进程使用到
  • 设备名称: 可以是一个分区,一个usb设备,光驱,软盘,网络共享等
  • -t 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:

光盘或光盘镜像:iso9660;
DOS fat16文件系统:msdos;
Windows 9x fat32文件系统:vfat;
Windows NT ntfs文件系统:ntfs;
Mount Windows文件网络共享:smbfs;
UNIX(LINUX) 文件网络共享:nfs

  • -o 主要用来描述设备或档案的挂接方式。常用的参数有:

loop:用来把一个文件当成硬盘分区挂接上系统;
ro:采用只读方式挂接设备;
rw:采用读写方式挂接设备;
iocharset:指定访问文件系统所用字符集

1、mount挂载光驱系统

一般来说CDROM的设备文件是/dev/hdc 或dev/cdrom或media/cdrom

首先我们在mnt目录新建cdrom目录:

$ mkdir /mnt/cdrom

执行挂载命令:

$ mount /dev/cdrom /mnt/cdrom
2、mount挂载u盘

如果计算机没有其它SCSI设备和usb外设的情况下,插入的U盘的设备路径是 /dev/sda1:

$ mkdir /mnt/upan
$ mount /dev/sda1 /mnt/upan
umount卸载文件系统

​ umount 命令用于卸载已经挂载的硬件设备,该命令的基本格式如下::

$ umount 设备文件名或挂载点

​ 注意,卸载命令后面既可以加设备文件名,也可以加挂载点,不过只能二选一,比如卸载光盘:

$ umount /mnt/cdrom

​ 命令加设备文件名同样是可以卸载的:

$ umount /dev/cdrom

​ 如果加了两个(如下所示),从理论上分析,会对光驱卸载两次,当然,卸载第二次的时候就会报错。

`$ umount /dev/cdrom /mnt/cdrom/

​ 另外,我们在卸载时有可能会出现以下情况:

cd /mnt/cdrom/
#进入光盘挂载点
umount /mnt/cdrom/
umount: /mnt/cdrom: device is busy.
#报错,设备正忙

​ 这种报错是因为我们已经进入了挂载点,因此,如果要卸载某硬件设备,在执行 umount 命令之前,用户须退出挂载目录。

​ 卸载硬件设备成功与否,除了执行 umount命令不报错之外,还可以使用 df 命令或 mount -l 来查看目标设备是否还挂载在系统中。

2.3.4 存取与日志

假设我们想要新增一个文件,此时文件系统的行为是:

  • 先确定使用者对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
  • 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
  • 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block 指向数据;
  • 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。

​ 你的文件在写入文件系统时,因为不知名原因导致系统中断(例如突然的停电、 系统核心发生错误),所以写入的数据仅有 inode table 及 data block 而已, 最后一个同步更新中介数据的步骤并没有做完,此时就会发生 metadata 的内容与实际数据存放区产生不一致 (Inconsistent) 的情况。

​ 为了避免上述提到的文件系统不一致的情况发生,在我们的 filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤。也就是说:

  1. **预备:**当系统要写入一个文件时,会先在日志记录区块中记录某个文件准备要写入的信息;
  2. **实际写入:**开始写入文件的权限与数据;开始更新 metadata 的数据;
  3. **结束:**完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。

​ 在这样的程序当中,万一数据的纪录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道哪个文件发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到快速修复 filesystem 的能力了。

2.3.5 常用文件结构

下面我们介绍一下 Linux 系统根目录下面的目录名

  • /bin,它是重要的二进制应用程序,包含二进制文件,系统的所有用户使用的命令都在这里
  • /boot,启动包含引导加载程序的相关文件
  • /dev,包含设备文件,终端文件,USB 或者连接到系统的任何设备
  • /etc,配置文件,启动脚本等,包含所有程序所需要的配置文件,也包含了启动/停止单个应用程序的启动和关闭 shell 脚本
  • /home,本地主要路径,所有用户用 home 目录存储个人信息
  • /lib,系统库文件,包含支持位于 /bin 和 /sbin 下的二进制库文件
  • /lost+found,在根目录下提供一个遗失+查找系统,必须在 root 用户下才能查看当前目录下的内容
  • /media,挂载可移动介质
  • /mnt,挂载文件系统
  • /opt,提供一个可选的应用程序安装目录
  • /proc,特殊的动态目录,用于维护系统信息和状态,包括当前运行中进程信息
  • /root,root 用户的主要目录文件夹
  • /sbin,重要的二进制系统文件
  • /tmp, 系统和用户创建的临时文件,系统重启时,这个目录下的文件都会被删除
  • /usr,包含绝大多数用户都能访问的应用程序和文件
  • /var,经常变化的文件,诸如日志文件或数据库等

​ 虽然 Linux 的标准文件系统是 ext2 ,且还有增加了日志功能的 ext3/ext4 ,事实上,Linux 还有支持很多文件系统格式的, 尤其是最近这几年推出了好几种速度很快的日志式文件系统,包括 SGI 的 XFS 文件系统, 可以适用更小型文件的 Reiserfs 文件系统,以及 Windows 的 FAT 文件系统等等, 都能够被 Linux 所支持喔!常见的支持文件系统有:

  • 传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;
  • 日志式文件系统: ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS
  • 网络文件系统: NFS / SMBFS

想要知道你的 Linux 支持的文件系统有哪些,可以察看下面这个目录:

ls -l /lib/modules/$(uname -r)/kernel/fs

系统目前已载入到内存中支持的文件系统则有:

cat /proc/filesystems

使用 ll 查看一个文件时,会显示一个文件的信息,例如:

drwxr-xr-x 3 root root 17 May 6 00:14 .config

对这个信息的解释如下:

  • drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段。9 位的文件权限字段中,每 3 个为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。
  • 3:链接数。
  • root:文件拥有者。
  • root:所属群组。
  • 17:文件大小。
  • May 6 00:14:文件最后被修改的时间。
  • .config:文件名。

​ df -T -h:

​ df 显示包含每个文件名参数的文件系统上可用的磁盘空间量。如果未指定文件名,则显示当前挂载的所有文件系统上的可用空间。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027717.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号