ITPub博客

首页 > 数据库 > 数据库开发技术 > Linux 入门必看-系统结构剖析

Linux 入门必看-系统结构剖析

原创 数据库开发技术 作者:步步运维步步坑 时间:2023-12-19 11:00:00 0 删除 编辑

概述

我们都知道Linux 系统一般分为4个主要部分:

内核

shell

文件系统

应用程序

他们的关系为,内核+shell+文件系统形成基础操作系统让用户可以运行程序,管理文件或其他系统使用行为

内核

内核是一个操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

组成

内存管理、进程管理、设备驱动程序、文件系统和网络管理等

系统调用接口:SCI (System Call Interface)层提供了某些机制执行从用户空间到内核的函数调用。是操作系统中用于实现系统调用的接口。在Linux中,系统调用是用户空间程序与内核之间进行交互的重要机制。

在 Linux内核的源代码树中 ./linux/kernel 中可以找到 SCI 的实现,并在这个路径可能是指Linux内核源代码树中的 ./linux/arch 中找到依赖于体系结构的部分

内存管理

在Linux中,为了满足应用程序对内存的大需求,采用了虚拟内存的管理方式。这种方式将有限的物理内存划分为容易处理的内存页,通常为 4KB。Linux内核提供了一种灵活的内存管理模式,以处理各种大小的内存需求

虚拟内存和内存页

  • 虚拟内存:是一种抽象概念,允许每个进程看到的内存空间更大于实际物理内存。这通过将不常用的数据移至磁盘上的交换空间来实现。

  • 内存页: Linux以页面为基本单位进行内存管理,通常将内存划分为4KB的页面。这简化了内存管理和交换操作。

内存管理机制

  • slab 分配器: 用于高效地管理内核数据结构的缓存,通过将内存划分为大小固定的块,以便更快地分配和释放内存。

  • 伙伴系统:用于处理大块内存的分配和释放,通过将内存划分为2的幂次方大小的块,以适应不同大小的内存需求。

页面置换和交换空间

  • 页面置换: 当物理内存不足时,系统使用页面置换算法将不活跃的页面移至交换空间,以便释放物理内存。

  • 交换空间: 是硬盘上的一块区域,用于暂时存储不活跃的页面。这允许系统在需要时将数据从内存移到磁盘上。

内存管理源代码

  • ./linux/mm 目录:包含了Linux内核中与内存管理相关的源代码。你可以在这里找到实现虚拟内存、页面分配、交换等功能的代码。

这种内存管理方式使得系统能够更灵活地处理各种内存需求,通过动态调整内存使用来适应系统的实际情况。如果系统中有多个用户同时使用内存,Linux可以通过交换机制将不活跃的数据移至硬盘,以便释放物理内存供其他用户或应用程序使用。

进程管理

在 Linux 系统中,进程是某个特定应用程序的运行实体。系统能够同时运行多个进程,通过在短时间内轮流运行这些进程来实现多任务。这个短时间间隔被称为“时间片”,进程轮流运行的方式被称为“进程调度”,由调度程序完成。

进程调度控制着进程对CPU的访问。当需要选择下一个要运行的进程时,调度程序选择最值得运行的进程。可运行进程是指仅等待CPU资源的进程,而不可运行进程是在等待其他资源。Linux采用了基于优先级的简单进程调度算法来选择新的进程。

通过多任务机制,每个进程似乎独占计算机,简化了程序的编写。每个进程都有自己独立的地址空间,只能由自己访问,避免了进程之间的干扰和“坏”程序对系统的危害。为了完成某些任务,有时需要综合两个程序的功能,例如一个程序输出文本,另一个程序对文本进行排序。为此,操作系统提供了进程间通信机制,如信号、管道、共享内存、信号量和套接字等。

内核通过 System Control Interrupt(SCI)提供了一个应用程序编程接口(API),用于创建新进程(fork、exec 或 POSIX 函数),停止进程(kill、exit),以及在它们之间进行通信和同步(信号或 POSIX 机制)

文件系统

和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。

Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。

Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。

Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统.

虚拟文件系统(VirtualFileSystem,VFS):

隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS在用户和文件系统之间提供了一个交换层。

VFS在用户和文件系统之间提供了一个交换层:

  1. VFS(Virtual File System)层:

  • 位于文件系统层的最上层,提供了对通用文件系统操作(如 open、close、read 和 write)的通用 API 抽象。这允许用户和进程使用统一的接口来访问不同类型的文件系统。

  • 文件系统层:

    • 在 VFS 下面,这一层实现了上层函数的具体方式,形成文件系统的抽象。超过 50 种不同类型的文件系统可以作为插件嵌入到这一层中。文件系统的源代码存放在 ./linux/fs 目录中。用户和进程无需知道文件所在的具体文件系统类型,只需使用统一的接口来访问它们。

  • 缓冲区缓存层:

    • 位于文件系统层之下,为文件系统提供了通用的函数集,与具体文件系统无关。这一层通过在内存中保留数据一段时间(或者在需要时预读取数据)来优化对物理设备的访问。

  • 设备驱动程序层:

    • 位于缓冲区缓存层之下,实现了特定物理设备的接口。设备驱动程序负责与硬件设备进行通信,提供对设备的抽象访问。

    通过这个层次结构,用户和进程可以使用统一的文件系统接口,而无需了解文件所在的具体文件系统类型。这种抽象层次使得 Linux 操作系统更加灵活,支持多种文件系统,并提供了对底层硬件设备的统一访问方式。

    设备驱动程序

    设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。

    设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。

    网络接口(NET)

    Linux 能够进行网络通信。这一子系统的核心组件包括网络协议、网络驱动程序以及对 BSD 套接字的支持。

    1. 网络协议:

    • 网络协议部分负责实现各种可能的网络传输协议。在 Linux 中,完整支持 TCP/IP 协议,这是 Internet 的标准协议,也是工业标准。这意味着 Linux 可以与其他系统通过 TCP/IP 协议进行通信。

  • 网络驱动程序:

    • 网络驱动程序是网络子系统的另一部分,负责与硬件设备通信。每一种可能的硬件设备都有相应的设备驱动程序。这些驱动程序允许 Linux 与不同类型的网络硬件设备(例如网卡)进行交互,实现数据的传输和接收。

  • BSD 套接字支持:

    • Linux 的网络实现支持 BSD 套接字,这是一种通用的套接字编程接口。它使得开发者能够使用一致的套接字 API 进行网络编程,无论是在本地通信还是在 Internet 上进行通信。

    Linux Shell

    Shell是操作系统提供给用户的界面,通过它用户可以与内核进行交互操作。Shell接收用户输入的命令并将其传递给内核执行,因此它充当了命令解释器的角色。此外,Shell编程语言具备普通编程语言的特点,使用这种语言编写的Shell程序与其他应用程序具有相同的效果。

    目前有多个版本的Shell,其中一些主要的版本包括:

    1. Bourne Shell: 由贝尔实验室开发。

    2. BASH(Bourne Again Shell):是GNU操作系统上默认的Shell,大多数Linux发行套件都采用这个Shell。

    3. Korn Shell: 是对Bourne Shell的发展,与Bourne Shell在大部分内容上兼容。

    4. C Shell:是SUN公司Shell的BSD版本。

    Linux文件系统是文件在磁盘等存储设备上的组织方法。Linux系统支持多种流行的文件系统,如EXT2、EXT3、FAT、FAT32、VFAT和ISO9660

    文件类型

    Linux下面的文件类型主要有:

    1) 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。

    2) 目录文件:目录,存储文件的唯一地方。

    3) 链接文件:指向同一个文件或目录的的文件。

    4) 设备文件:与系统外设相关的,通常在/dev下面。分为块设备和字符设备。

    5)管道(FIFO)文件: 提供进程之间通信的一种方式

    6)套接字(socket) 文件: 该文件类型与网络通信有关

    可以通过ls –l, file, stat几个命令来查看文件的类型等相关信息。

    Linux文件目录

    文件结构是指文件存放在磁盘等存储设备上的组织方式,主要体现在对文件和目录的组织上。在Linux系统中,采用了标准的目录结构,安装程序在安装时会为用户创建文件系统并设置一个完整而固定的目录组成形式,同时明确每个目录的作用和其中的文件类型。

    这个目录结构形成了一个树型结构,最顶层是根目录(/),其他目录都是从根目录出发而生成的。Linux的目录树包括了一些主要部分,如:

    1. 根目录(/):整个目录树的根节点,包含系统的所有文件和子目录。

    2. /usr目录: 包含系统软件和用户应用程序。

    3. /var目录: 包含经常变化的文件,如日志文件、缓存文件等。

    4. /home目录:包含用户的主目录,每个用户有自己的子目录。

    这种目录结构的好处在于可以将相对稳定的部分和经常变化的部分存放在不同的分区上,以便进行备份或系统管理。整个目录树形成了一个层级关系,方便管理和组织文件。与Windows的盘符并列的磁盘树不同,Linux采用了统一的根目录,使得各个磁盘分区上的目录不一定是并列的,而是形成一个整体的树型结构。这有助于更灵活地管理文件系统

    inux磁盘分区

    在Linux系统中,硬盘分区包括主分区(Primary Partition)、扩展分区(Extended Partition)和逻辑分区(Logical Partition)三种类型。

    1. 主分区(Primary Partition):

    • 可以直接被使用,但不能再进行分区。

    • 每个硬盘最多可以有四个主分区。

    • 主分区的标识通常为 /dev/hd[a-z]X 或 /dev/sd[a-z]X,其中 [a-z] 代表硬盘号,X 代表硬盘内的分区号,如 /dev/hda1 表示硬盘hda的第一个分区。

  • 扩展分区(Extended Partition):

    • 必须在创建后再进行二次分区才能使用,它本身并不能存储数据。

    • 扩展分区是为了克服主分区数量限制而引入的,一个硬盘上最多只能有一个扩展分区。

    • 扩展分区的标识同样为 /dev/hd[a-z]X 或 /dev/sd[a-z]X。

  • 逻辑分区(Logical Partition):

    • 由扩展分区建立起来的分区,逻辑分区没有数量上限制。

    • 逻辑分区的标识通常是 /dev/hd[a-z]5 开始,或者 /dev/sd[a-z]5 开始。

    在硬盘分区的标识中,IDE接口的硬盘(例如 /dev/hda)和SCSI接口的硬盘(例如 /dev/sda)采用不同的命名方式。IDE接口硬盘的分区标识是 /dev/hd[a-z]X,其中 [a-z] 代表硬盘号,X 代表分区号。SCSI接口硬盘的分区标识是 /dev/sd[a-z]X。

    总体而言,硬盘的分区命名约定为:

    • /dev/hda、/dev/sda 等表示整块硬盘。

    • /dev/hda1、/dev/sda1 等表示硬盘的主分区或扩展分区。

    • /dev/hda5、/dev/sda5、/dev/hda6、/dev/sda6 等表示硬盘的逻辑分区。

    这样的划分使得硬盘分区在Linux系统中能够方便地进行标识和管理。

    对于/dev/hda 类似的表示方法,也并不寞生吧;我们在Linux通过fdisk -l 就可以查到硬盘是/dev/hda还是/dev/hdb;

    [root@localhost ~]# fdisk -l
    Disk /dev/hda: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Device Boot Start End Blocks Id System
    /dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS
    /dev/hda2 971 9729 70356667+ 5 Extended
    /dev/hda5 971 2915 15623181 b W95 FAT32
    /dev/hda6 2916 4131 9767488+ 83 linux
    /dev/hda7 4132 5590 11719386 83 linux
    /dev/hda8 5591 6806 9767488+ 83 linux
    /dev/hda9 6807 9657 22900626 83 linux
    /dev/hda10 9658 9729 578308+ 82 linux swap / Solaris

    请注意第一行, Disk /dev/hda: 80.0 GB, 80026361856 bytes ,这个就是表示机器中只有一个硬盘设备/dev/hda ,体积大小为 80.0G;下面的就是硬盘的分区,每个分区都有详细的信息,在这里不详细说了;

    Linux下磁盘分区和目录的关系

    – 任何一个分区都必须挂载到某个目录上。

    – 目录是逻辑上的区分。分区是物理上的区分。

    – 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。

    – 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。

    linux主要目录的功用
    /bin:
    存放系统二进制可执行命令。
    /dev:
    包含设备文件,用于与硬件设备进行交互。
    /etc:
    存放系统管理和配置文件,包括各种应用程序的配置文件。
    /etc/rc.d:
    存放启动时的配置文件和脚本,用于管理系统的启动过程。
    /home:
    用户主目录的基点,每个用户有一个单独的子目录,如/home/user。
    /lib:
    存放标准程序设计库,也称为动态链接共享库,类似Windows中的.dll文件。
    /sbin:
    包含系统管理命令,存放供系统管理员使用的管理程序。
    /tmp:
    用于存放公用的临时文件。
    /root:
    系统管理员的主目录,拥有特权级别的用户目录。
    /mnt:
    用于临时挂载其他文件系统。
    /lost+found:
    系统非正常关机而留下的“无家可归”文件的存放目录。
    /proc:
    虚拟的目录,提供对系统内存的映射,可用于获取系统信息。
    /var:
    存放某些大文件的溢出区,如各种服务的日志文件。
    /usr:
    包含大部分用户和系统应用程序的目录,包括:
    /usr/X11R6:存放X Window系统的目录。
    /usr/bin:存放众多的应用程序。
    /usr/sbin:存放超级用户的一些管理程序。
    /usr/doc:包含Linux文档。
    /usr/include:存放开发和编译应用程序所需的头文件。
    /usr/lib:包含常用的动态链接库和软件包配置文件。
    /usr/man:存放帮助文档。
    /usr/src:包含源代码,Linux内核的源代码通常在/usr/src/linux中。
    /usr/local/bin:存放本地增加的命令。
    /usr/local/lib:存放本地增加的库。

    linux文件系统

    文件系统是一种组织和存储文件的方式,它定义了文件在存储设备上的布局和管理方式。在Linux系统中,每个分区都被视为一个独立的文件系统,而这些分区的集合构成了系统的整体目录结构。这个目录结构是一个层次化的树形结构,用于组织和管理文件和目录。

    每个文件系统都有自己的根目录和目录结构,包含着该文件系统下的所有文件和子目录。Linux系统通过将这些文件系统按照一定规则挂载到总的目录层次结构中,形成了一个统一的文件系统视图。这使得用户和应用程序可以方便地访问和操作存储在不同分区中的文件。

    文件系统的管理是操作系统运行的基础之一,因为它负责对文件的创建、读取、写入、删除等操作,同时也维护文件的属性和权限等信息。整个文件系统的设计和管理对于系统的性能和稳定性具有重要意义。

    文件系统类型
    ext2:早期Linux中常用的文件系统,是一种简单而可靠的文件系统。
    ext3:是ext2的升级版,引入了日志功能,提高了文件系统的稳定性。
    RAMFS:内存文件系统,将文件存储在内存中,因此访问速度非常快。
    NFS:网络文件系统,由SUN公司发明,用于实现不同计算机之间的文件共享。
    MS-DOS:MS-DOS文件系统,用于与MS-DOS和Windows之间进行文件交互。
    VFAT:Windows 95/98采用的文件系统,支持长文件名。
    FAT:Windows XP采用的文件系统,是VFAT的后继者。
    NTFS:Windows NT/XP采用的文件系统,提供更强大的功能和安全性。
    HPFS:OS/2操作系统采用的文件系统,具有较高的性能。
    PROC:虚拟的进程文件系统,提供有关系统和进程的信息。
    ISO9660:大部分光盘所采用的文件系统,用于光盘的标准格式。
    ufsSun:Sun OS采用的文件系统,用于Solaris操作系统。
    NCPFS:Novell服务器所采用的文件系统,用于与Novell NetWare进行通信。
    SMBFS:Samba的共享文件系统,用于与Windows共享文件夹。
    XFS:由SGI开发的先进的日志文件系统,支持超大容量文件和高性能。
    JFS:IBM的AIX使用的日志文件系统,具有快速恢复和高性能的特点。
    ReiserFS:基于平衡树结构的文件系统,提供了高效的文件访问。
    udf:可擦写的数据光盘文件系统,用于可擦写的光盘。
    文件系统特性

    在磁盘分区完成后,下一步是对分区进行格式化(formatting)。格式化的目的是使操作系统能够使用这个分区,并为其创建适当的文件系统。每种操作系统支持的文件系统类型可能不同。例如,早期的Windows版本主要使用FAT(或FAT16)文件系统,而Windows 2000及以后的版本则采用NTFS文件系统。对于Linux系统,其主要的文件系统为Ext2(Linux第二扩展文件系统,ext2fs)。

    传统上,一个分区只能被格式化为一个文件系统,因此我们可以将文件系统视为分区。然而,随着新技术的发展,例如逻辑卷管理(LVM)和软件磁盘阵列(software RAID),一个分区可以被格式化为多个文件系统(例如LVM),也可以将多个分区组合成一个文件系统(LVM,RAID)。因此,在格式化时,我们不再仅仅说针对分区进行格式化,通常我们可以称呼一个可挂载的数据为一个文件系统而不是一个分区。

    文件系统的运行方式与操作系统的文件数据有关。较新的操作系统文件数据除了文件的实际内容外,通常还包含许多属性,如Linux操作系统的文件权限(rwx)和文件属性(所有者、群组、时间戳等)。文件系统通常将这两部分数据分别存储在不同的区块中,将权限和属性存储在inode中,将实际数据存储在数据块区块中。此外,还有一个超级块(superblock)记录整个文件系统的总体信息,包括inode和block的总量、使用量、剩余量等。

    对于一个磁盘分区,在指定为相应的文件系统后,整个分区被划分为1024、2048和4096字节大小的块。根据块的使用方式,可以分为:

    1. 超级块(Superblock): 整个文件系统的第一个块空间,包括文件系统的基本信息,如块大小、inode/block的总量、使用量、剩余量,指向inode和数据块的指针等相关信息。

    2. inode块(文件索引节点): 文件系统索引,记录文件的属性。它是文件系统中文件的基本单元,是连接任何子目录和文件的桥梁。每个子目录和文件只有唯一的一个inode块,包含了文件的基本属性(文件长度、创建及修改时间、权限、所有者等)和存放数据的位置等相关信息。

    3. 数据块(Block): 实际记录文件内容的块,如果文件太大,可能会占用多个block。为了提高目录访问效率,Linux还提供了表达路径与inode对应关系的dentry结构,描述了路径信息并连接到节点inode,包括各种目录信息,还指向了inode和超级块。

    可以将文件系统的结构比喻为一本书,超级块相当于封面,inode块相当于目录,数据块则相当于正文,记录具体内容。在Linux中,正统的文件系统(如ext2、ext3等)将硬盘分区时划分为超级块、inode表区块和数据块。一个文件由一个超级块、inode和数据区域块组成。当查看某个文件时,首先从inode表中查找文件属性及数据存放位置,然后从数据块中读取数据。

    我们将 inode与block区块用图解来说明一下,如下图所示,文件系统先格式化出inode与block的区块,假设某一个文件的属性与权限数据是放置到 inode 4号(下图较小方格内),而这个inode记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个 block 内容读出来!那么数据的读取就如同下图中的箭头所指定的模样了。

    这种数据存取的方法我们称为索引式文件系统(indexed allocation)。那有没有其他的惯用文件系统可以比较一下啊?有的,那就是我们惯用的闪盘(闪存),闪盘使用的文件系统一般为 FAT 格式。FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中, 其读取方式有点像下图所示:

    上图中我们假设文件的数据依序写入1->7->4->15号这四个 block 号码中, 但这个文件系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!

    碎片整理

    “碎片整理”通常是因为文件写入的block太过于离散,导致文件读取效能变差。在FAT文件系统中,由于其文件分配表的特性,碎片整理是常见的需求。然而,在Ext2文件系统中,由于其采用索引式文件系统,通常不太需要频繁进行碎片整理。

    Ext2文件系统的设计使得碎片整理的需求相对较少。由于它是索引式文件系统,即文件的索引信息存储在inode中,而不是像FAT那样分散在整个文件系统。因此,即使文件系统使用时间较长,也不容易导致文件数据过于离散。

    对于硬连接和软连接,它们是文件系统中用于建立文件之间关联的方式:

    硬连接: 原文件名和连接文件名都指向相同的物理地址,它们共享inode。硬连接不能跨越文件系统,文件在磁盘中只有一个实体,这有助于节省硬盘空间。删除文件要在所有硬连接都删除后才会释放磁盘空间。

    软连接: 通过ln -s命令建立的文件符号连接。软连接是一种特殊的文件,它的数据是连接文件的路径名。软连接允许文件跨越文件系统,但相对于硬连接,它不共享inode。删除原文件并不影响软连接,但软连接失效。

    3.6 文件系统在内核中的表示

    内核数据结构

    Linux内核的VFS子系统可以图示如下:

    在Linux系统中,文件和I/O(输入/输出)操作涉及多个关键概念,其中VFS(Virtual File System)扮演着重要角色。以下是一些核心概念的通俗解释:

    1. 文件描述符表: 每个进程在PCB(Process Control Block)中都有一个文件描述符表,文件描述符是该表的索引。文件描述符指向一个file结构体,用于表示已打开的文件。每个file结构体维护了文件的状态标志、当前读写位置等信息。

    2. file结构体: 表示内核中已打开的文件,包含了文件状态标志和读写位置。每个file结构体指向file_operations结构体,后者包含了各种文件操作的函数指针。

    3. file_operations结构体: 包含了文件操作的函数指针,例如read、write等。针对不同类型的文件,可以有不同的file_operations结构体。

    4. dentry结构体: 表示目录项,用于在内核中缓存目录的树状结构,以提高查找效率。每个dentry结构体指向inode结构体。

    5. inode结构体: 包含了文件的元数据信息,如所有者、文件大小、权限等。每个inode结构体指向inode_operations结构体。

    6. inode_operations结构体: 包含了影响文件和目录布局的函数指针,如添加删除文件和目录等。

    7. super_block结构体: 包含了超级块的信息,如文件系统类型、块大小等。super_block结构体的s_root成员指向文件系统的根目录。

    这些结构体共同构成了VFS的核心概念。对于不同的文件系统,如ext2、FAT32、NTFS等,它们在磁盘存储布局上可能有不同的结构,但在VFS中,这些概念被抽象为通用的接口,以便能够处理各种文件系统。VFS使得Linux可以支持多种不同的文件系统,使得文件操作能够透明地适用于这些文件系统。

    挂载文件系统

    linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。这里所说的“按一定方式”就是指的挂载。

    将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点.

    例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些设备。挂载后将物理分区细节屏蔽掉,用户只有统一的逻辑概念。所有的东西都是文件。

    注意:

    1、挂载点必须是一个目录。

    2、一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。

    同的存储设备或其他操作系统使用不同的文件系统格式,因此在挂载之前需要确保Linux支持所要挂载的文件系统格式。

    一些常见的文件系统格式及其对应的设备和操作系统包括:

    • ISO9660:光盘文件系统,通常用于 CD-ROM 和 DVD。

    • FAT16: 用于早期的硬盘、软盘和一些移动设备。在Linux中,可以使用vfat模块来挂载FAT16文件系统。

    • FAT32: 用于较大容量的硬盘和移动设备。同样,可以使用vfat模块来挂载FAT32文件系统。

    • ext2/ext3/ext4: Linux自己的文件系统格式。ext2是早期的版本,而ext3和ext4是后来的改进版本。Linux可以直接支持这些文件系统。

    • NTFS: 由Windows NT引入的文件系统,用于Windows NT和后来的Windows版本。在Linux中,可以使用ntfs-3g模块来挂载NTFS文件系统。

    在挂载之前,可以使用lsblk、fdisk -l等命令查看当前系统中的磁盘和分区信息,以确保选择正确的设备和文件系统类型进行挂载。此外,要确保系统已经加载了相应的文件系统模块,或者在内核中编译了相关的文件系统支持

    挂载时使用mount命令,其格式:mount [-参数] [设备名称] [挂载点]

    其中常用的参数有:

    -t 指定设备的文件系统类型(前面提到的文件类型)

    -o 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有

    codepage=XXX 代码页
    iocharset=XXX 字符集
    ro 以只读方式挂载
    rw 以读写方式挂载
    nouser 使一般用户无法挂载
    user 可以让一般用户挂载设备

    例如:挂载windows的文件系统:

    1)首先我们使用sudo fdisk -l查看挂载的设备,例如最下面有:/dev/sdb1

    2)mkdir创建一个目录,这里的目录是作为挂在目录,就是你要把E盘挂到这个目录下:mk /mnt/test

    3)windows和linux使用的不是一个文件系统,一般情况下linux不挂载windows文件系统,所以要你手动mount:

     # mount -t vfat /dev/sdb1 /mnt/test ( -t vfat指出这里的文件系统fat32)

    现在就可以进入/mnt/winc等目录读写这些文件了。

    2.挂载光盘:# mk /mnt/cdrom

     # mount -t iso9660 /dev/cdrom /mnt/cdrom (关盘的名字一般都是cdrom,这条命令一般都通用)

    3.虚拟机共享文件夹:例如在VirtualBox下,主机是Windows,Ubuntu是Guest。

    共分三步:

    1). 首先要安装虚拟电脑工具包:

    在VirtualBox的菜单里选择”设备”->”安装虚拟电脑工具包”,你会发现在Ubuntu桌面上多出一个光盘图标,这张光盘默认被自动加载到了文件夹/media/cdom0,而且/cdrom自动指向这个文件夹。默认设置下文件管理器会自动打开这张光盘,可以看到里面有个”VBoxLinuxAdditions.run”文件。打开一个命令行终端,依次输入”cd /cdrom”和”sudo sh ./VBoxLinuxAdditions.run”,不含双引号,开始安装工具包。安装完毕,会用英文提示要重启Ubuntu,建议立刻重启。重启后,比较明显的变化是鼠标是共享模式,并且剪贴板也和Windows共享了。如果有这些变化,说明虚拟电脑工具包已经装成功。

    2). 下一步设置共享文件夹。

    在共享文件夹设置窗口中,单击右侧的”添加一个共享文件夹”,路径选择你想要共享的Windows文件夹,共享名任取一个自己喜欢的,比如”myshare”,选项read-only是指是否只允许ubuntu读这个文件夹,请根据需要选择这个选项。

    3). 在ubuntu下挂载这个共享文件夹:sudo mount -t vboxsf myshare /media/share

    其中”myshare”是之前取的共享文件夹的名字,”/media/share”是要挂载到的目标文件.

    自动挂载windows分区

    每次开机访问windows分区都要运行mount命令显然太烦琐,为什么访问其他的linux分区不用使用mount命令呢?

    其实,每次开机时,linux自动将需要挂载的linux分区挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分区,如windows分区,以实现文件系统的自动挂载呢?

    这是完全可以的。在/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表。我的/etc/fstab文件如下:

    /dev/hda2 / ext3 defaults 1 1
    /dev/hda1 /boot ext3 defaults 1 2
    none /dev/pts devpts gid=5,mode=620 0 0
    none /proc proc defaults 0 0
    none /dev/shm tmpfs defaults 0 0
    /dev/hda3 swap swap defaults 0 0
    /dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0
    /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
    /dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
    /dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0

    在/etc/fstab文件中,各列的含义如下:

    1. 设备名(Device):这是要挂载的文件系统的设备名称或者UUID(Universally Unique Identifier,通用唯一标识符)。这一列告诉系统在哪里找到文件系统的数据。

    2. 挂载点(Mount Point):这是文件系统将要被挂载到的目录路径。挂载点是文件系统在整个目录树中的位置。

    3. 文件系统类型(File System Type): 这一列指定了文件系统的类型。常见的文件系统类型包括ext4、ntfs、vfat、iso9660等。可以使用man fstab命令来查看支持的文件系统类型。

    4. 挂载选项(Mount Options):这一列包含一系列用逗号分隔的选项,用于指定挂载文件系统的行为。例如,你可以设置是否允许读写、是否启用自动挂载、是否启用日志记录等。常见的选项有rw(读写)、ro(只读)、auto(自动挂载)、noauto(不自动挂载)、exec(允许执行二进制文件)等。

    5. Dump备份标志: 这一列的数值用于控制dump命令备份文件系统时的行为。通常设置为0,表示不备份。如果设置为1,表示备份时应该考虑该文件系统。

    6. Pass检查顺序:这一列的数值用于控制fsck命令在系统启动时检查文件系统的顺序。如果设置为0,表示不检查。如果设置为1,表示在系统启动时按顺序检查。如果设置为2,表示在系统启动时并且在根文件系统之后按顺序检查

    在最后两行是我手工添加的windows下的C;D盘,加了codepage=936和iocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数:

    rw 以可读写模式挂载
    suid 启用户ID和群组ID设置位
    dev 可解读文件系统上的字符或区块设备
    exec 可执行二进制文件
    auto 自动挂载
    nouser 使一般用户无法挂载
    async 以非同步方式执行文件系统的输入输出操作

    可以看到在这个列表里,光驱和软驱是不自动挂载的,参数设置为noauto。(如果你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘)

    软连接、硬链接

    硬链接和符号链接是Linux系统中用于连接文件的两种不同方式。

    1. 硬链接:

    • 硬链接创建了一个新的文件名,但该文件名与原始文件实际上是同一个索引节点的不同引用。这意味着文件系统中只有一个实际的数据块,但有多个文件名指向这个数据块。

    • 硬链接不能跨越文件系统,即它们必须存在于同一文件系统中。

    • 修改其中一个硬链接会影响其他硬链接,因为它们都指向相同的数据块。删除一个硬链接并不会影响其他链接,直到所有链接都被删除才会释放磁盘空间。

    • 目录不能包含硬链接,硬链接只能链接到文件。

  • 符号链接(软链接):

    • 符号链接是一个独立的文件,其中包含指向目标文件或目录的路径。它创建了一个新的文件,该文件的内容是指向原始文件的路径。

    • 符号链接可以跨越文件系统,因为它们只是包含路径信息而不是直接引用文件的索引节点。

    • 修改符号链接不会影响原始文件,反之亦然。删除符号链接不会影响原始文件,但如果原始文件被删除,符号链接将失效。

    • 符号链接可以链接到文件或目录。

    具体关系可以看下图:

    从图上可以看出硬链接和软链接的区别:

    1:硬链接原文件和新文件的inode编号一致。而软链接不一样。

    2:对原文件删除,会导致软链接不可用,而硬链接不受影响。

    3:对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。

    文件目录管理命令

    磁盘和文件空间 :fdisk df du

    文件目录与管理:cd pwd mkdir rmdir ls cp rm mv

    查看文件内容 cat、tac、more、less、head 、tail

    文件目录与权限 :chmod chown chgrp umask

    文件查找:which、whereis、locate、find、find

    linux 应用

    标准的Linux系统一般都有一套都有称为应用程序的程序集,它包括文本编辑器、编程语言、X Window、办公套件、Internet工具和数据库等。

    linux内核优化

    内核参数是用户和系统内核之间交互的一个接口,通过这个接口,用户可以在系统运行的同时动态更新内核配置,而这些内核参数是通过Linux Proc文件系统存在的。因此,可以通过调整Proc文件系统达到优化Linux性能的目的。

    添加博主

    微信号|yfq940-

    原文作者:步步运维步步坑;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2022-10-08

    • 博文量
      100
    • 访问量
      51716