当前位置: 首页 > news >正文

【linux学习指南】】Ext系列文件系统(三)ext2 文件系统的认识与构成

请添加图片描述

文章目录

  • 📝ext2 ⽂件系统
  • 🌠 宏观认识
    • 🌉 Block Group
  • 🌠块组内部构成
    • 🌉超级块(SuperBlock)
  • 🌠GDT(GroupDescriptorTable)
    • 🌉块位图(BlockBitmap)
    • 🌉inode位图(InodeBitmap)
    • 🌉i节点表(InodeTable)
    • 🌉Data Block
    • 🌉块位图(BlockBitmap)
  • 🌠inode和datablock映射(弱化)
  • 🚩总结


📝ext2 ⽂件系统

🌠 宏观认识

所有的准备⼯作都已经做完,是时候认识下⽂件系统了。我们想要在硬盘上储⽂件,必须先把硬盘格式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。在Linux 系统中,最常⻅的是ext2系列的⽂件系统。其早期版本为ext2,后来⼜发展出ext3ext4ext3ext4虽然对ext2进⾏了增强,但是其核⼼设计并没有发⽣变化,我们仍是以较⽼的ext2作为演⽰对象。

ext2⽂件系统将整个分区划分成若⼲个同样⼤⼩的块组(BlockGroup),如下图所⽰。只要能管理⼀个分区就能管理所有分区,也就能管理所有磁盘⽂件。

在这里插入图片描述

上图中启动块(BootBlock/Sector)的⼤⼩是确定的,为1KB,由PC标准规定,⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。启动块之后才是ext2⽂件系统的开始。

🌉 Block Group

ext2⽂件系统会根据分区的⼤⼩划分为数个BlockGroup。⽽每个BlockGroup都有着相同的结构组成。
政府管理各区的例⼦:

  1. 类比政府管理各区来理解BlockGroup结构
    • 超级块(Superblock)副本 - 相当于区政府管理中心
      • 就像每个区都有一个管理中心(超级块副本),在文件系统中,每个BlockGroup都有超级块副本。它存储了文件系统的关键信息,如文件系统的类型(这里是ext2)、块大小、inode数量等。
      • 这就好比区政府管理中心掌握着本区的基本规划信息(如区域面积大小、功能分区数量等)。而且这些信息是非常重要的,当主超级块损坏时,这些副本可以用于恢复文件系统的基本参数。
    • 块位图(Block Bitmap) - 类似土地资源管理部门
      • 块位图负责记录块的使用情况,就像土地资源管理部门记录区内土地(块)的使用状态一样。如果块位图中的某一位为1,表示对应的块已经被使用;为0则表示块未被使用。
      • 当需要分配新的土地(数据块)用于存储文件数据时,这个“土地资源管理部门”(块位图)就会查找未使用的土地(空闲块)来进行分配。
    • inode位图(inode Bitmap) - 类似居民信息登记部门
      • inode位图用于记录inode的使用状态,类似于居民信息登记部门记录区内居民(inode)的居住(使用)情况。一位为1表示对应的inode已经被使用,为0表示未被使用。
      • 当有新居民(新文件)要入住(创建)时,这个“居民信息登记部门”(inode位图)就会查找空闲的居民名额(空闲inode)来登记新居民(存储文件属性)。
    • inode表(inode Table) - 类似居民档案库
      • inode表就像是一个居民档案库,每个inode(居民档案)存储了文件(居民)的各种属性信息,如文件的类型(普通文件、目录、符号链接等)、文件的访问权限、文件的大小、文件的创建时间、修改时间、访问时间以及最重要的文件数据块指针。
      • 当需要查询某个居民(文件)的详细信息(属性)时,就会通过居民编号(inode编号)在这个“居民档案库”(inode表)中查找对应的档案(inode)。
    • 数据块(Data Blocks) - 类似居民住宅和商业用地等实际土地用途区域
      • 数据块是真正存储文件数据内容的地方,就好比区内的居民住宅、商业用地等实际使用的土地。对于小文件,可能只占用少量的数据块,就像小商店只占用一小块土地一样;而大文件可能会占用多个数据块,如同大型商场需要占用大面积的土地。

🌠块组内部构成

🌉超级块(SuperBlock)

存放⽂件系统本⾝的结构信息,描述整个分区的⽂件系统信息。记录的信息主要有:bolck和inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。SuperBlock的信息被破坏,可以说整个⽂件系统结构就被破坏了

超级块在每个块组的开头都有⼀份拷⻉(第⼀个块组必须有,后⾯的块组可以没有)。为了保证⽂
件系统在磁盘部分扇区出现物理问题的情况下还能正常⼯作,就必须保证⽂件系统的superblock信
息在这种情况下也能正常访问。所以⼀个⽂件系统的superblock会在多个blockgroup中进⾏备份,
这些superblock区域的数据保持⼀致。

/** Structure of the super block*/
struct ext2_super_block
{__le32 s_inodes_count;/* Inodes count */__le32 s_blocks_count;/* Blocks count */__le32 s_r_blocks_count; /* Reserved blocks count */__le32 s_free_blocks_count;/* Free blocks count */__le32 s_free_inodes_count;__le32 s_first_data_block;/* Free inodes count *//* First Data Block */__le32 s_log_block_size; /* Block size */__le32 s_log_frag_size;/* Fragment size */__le32 s_blocks_per_group;/* # Blocks per group */__le32 s_frags_per_group; /* # Fragments per group */__le32 s_inodes_per_group;__le32 s_mtime;__le32 s_wtime;__le16 s_mnt_count;/* # Inodes per group *//* Mount time *//* Write time *//* Mount count */__le16 s_max_mnt_count;__le16 s_magic;__le16 s_state;__le16 s_errors;/* Maximal mount count *//* Magic signature *//* File system state *//* Behaviour when detecting errors */__le16 s_minor_rev_level; /* minor revision level */__le32 s_lastcheck;__le32 s_checkinterval;__le32 s_creator_os;__le32 s_rev_level;__le16 s_def_resuid;__le16 s_def_resgid;/* time of last check *//* max. time between checks *//* OS *//* Revision level *//* Default uid for reserved blocks *//* Default gid for reserved blocks *//** These fields are for EXT2_DYNAMIC_REV superblocks only.** Note: the difference between the compatible feature set and* the incompatible feature set is that if there is a bit set* in the incompatible feature set that the kernel doesn't* know about, it should refuse to mount the filesystem.** e2fsck's requirements are more strict; if it doesn't know* about a feature in either the compatible or incompatible* feature set, it must abort and not try to meddle with* things it doesn't understand...*/__le32 s_first_ino;              /* First non-reserved inode */__le16 s_inode_size;             /* size of inode structure */__le16 s_block_group_nr;         /* block group # of this superblock */__le32 s_feature_compat;         /* compatible feature set */__le32 s_feature_incompat;       /* incompatible feature set */__le32 s_feature_ro_compat;      /* readonly-compatible feature set */__u8 s_uuid[16];                 /* 128-bit uuid for volume */char s_volume_name[16];          /* volume name */char s_last_mounted[64];         /* directory where last mounted */__le32 s_algorithm_usage_bitmap; /* For compression *//** Performance hints.  Directory preallocation should only* happen if the EXT2_COMPAT_PREALLOC flag is on.*/__u8 s_prealloc_blocks;     /* Nr of blocks to try to preallocate*/__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */__u16 s_padding1;/** Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.*/__u8 s_journal_uuid[16]; /* uuid of journal superblock */__u32 s_journal_inum;    /* inode number of journal file */__u32 s_journal_dev;     /* device number of journal file */__u32 s_last_orphan;     /* start of list of inodes to delete */__u32 s_hash_seed[4];    /* HTREE hash seed */__u8 s_def_hash_version; /* Default hash version to use */__u8 s_reserved_char_pad;__u16 s_reserved_word_pad;__le32 s_default_mount_opts;__le32 s_first_meta_bg; /* First metablock block group */__u32 s_reserved[190];  /* Padding to the end of the block */
};

🌠GDT(GroupDescriptorTable)

块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描述符存储⼀个块组的描述信息,如在这个块组中从哪⾥开始是inodeTable,从哪⾥开始是Data Blocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。

// 磁盘级blockgroup的数据结构
/** Structure of a blocks group descriptor*/
struct ext2_group_desc
{__le32 bg_block_bitmap;/* Blocks bitmap block */__le32 bg_inode_bitmap;/* Inodes bitmap */__le16 bg_free_blocks_count; /* Inodes table block*/__le32 bg_inode_table;/* Free blocks count */__le16 bg_free_inodes_count;/* Free inodes count */__le16 bg_used_dirs_count; /* Directories count */__le16 bg_pad;__le32 bg_reserved[3];
};

🌉块位图(BlockBitmap)

BlockBitmap中记录着DataBlock中哪个数据块已经被占⽤,哪个数据块没有被占⽤

🌉inode位图(InodeBitmap)

每个bit表⽰⼀个inode是否空闲可⽤。

🌉i节点表(InodeTable)

  • 存放⽂件属性如⽂件⼤⼩,所有者,最近修改时间等
  • 当前分组所有Inode属性的集合
  • inode编号以分区为单位,整体划分,不可跨分区

🌉Data Block

数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:

🌉块位图(BlockBitmap)

  • 对于普通⽂件,⽂件的数据存储在数据块中。
  • 对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls-l命令看到的其它信息保存在该⽂件的inode中。
  • Block 号按照分区划分,不可跨分区

🌠inode和datablock映射(弱化)

  • inode内部存在_ _le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ , EXT2_N_BLOCKS =15,就是⽤来进⾏inode和block映射的
  • 这样⽂件=内容+属性,就都能找到了。

在这里插入图片描述
思考:
请解释:知道inode号的情况下,在指定分区,请解释:对⽂件进⾏增、删、查、改是在做什么?

  1. 查询操作
    • 查找文件属性
      • 首先,根据inode号在inode表中定位对应的inode。inode表通常存储在每个块组中,通过inode号可以快速计算出inode在inode表中的位置。
      • 一旦找到inode,就可以读取其中存储的文件属性,如文件类型(是普通文件、目录、符号链接等)、访问权限、文件大小、创建时间、修改时间和访问时间等信息。
    • 读取文件内容
      • inode中有一个i_block数组,它用于存储文件数据块的指针。对于小文件,文件数据可能直接通过i_block数组中的直接指针指向的数据块来读取。
      • 如果是较大的文件,可能会涉及间接指针。例如,一级间接指针指向的块中存储了其他数据块的地址,通过这些地址可以找到文件的其他数据部分。按照这种方式,根据inode中的指针信息,就可以将文件的数据块内容读取出来。
  2. 增加操作(以增加文件内容为例)
    • 分配新的数据块(如果需要)
      • 首先检查块位图,找到未使用的数据块。块位图记录了每个数据块的使用状态,通过查找其中为0的位对应的块,就可以确定空闲的数据块。
      • 然后更新块位图,将对应的位设置为1,表示该块已经被使用。
    • 更新inode指针信息
      • 如果文件原来的数据块已经存满,需要增加新的数据块来存储新增的文件内容。对于小文件,可能直接使用i_block数组中剩余的直接指针来指向新分配的数据块。
      • 对于较大的文件,可能需要更新间接指针。例如,如果一级间接指针指向的块已经存满了数据块地址,就需要分配一个新的块来存储更多的数据块地址,并更新间接指针指向这个新块。
      • 同时,更新inode中的文件大小属性,以反映文件内容的增加。
  3. 删除操作
    • 释放数据块
      • 根据inode中的i_block指针,找到文件所占用的数据块。然后将这些数据块在块位图中的对应位设置为0,表示这些块已经空闲,可以被重新分配。
    • 释放inode
      • 将inode在inode位图中的对应位设置为0,表示这个inode已经空闲。同时,可能会清除inode表中对应的inode内容,这样这个inode就可以被重新用于存储新文件的属性。
  4. 修改操作(以修改文件内容为例)
    • 小修改(文件大小不变)
      • 如果修改后的文件大小不变,只是内容改变,那么根据inode中的i_block指针找到文件的数据块,直接在这些数据块中修改文件内容即可。
    • 大修改(文件大小改变)
      • 如果修改后的文件变大,需要先按照增加文件内容的方式分配新的数据块,更新inode指针和文件大小属性,然后将新的内容写入新分配的数据块和原来的数据块中。
      • 如果修改后的文件变小,需要先释放多余的数据块(将块位图中对应的位设置为0),然后更新inode中的文件大小属性和i_block指针(如果有指针指向了释放的数据块,需要进行调整),最后修改剩余数据块中的文件内容。

🔴结论:

  • 分区之后的格式化操作,就是对分区进⾏分组,在每个分组中写⼊SB、GDT、Block Bitmap、InodeBitmap等管理信息,这些管理信息统称:⽂件系统
  • 只要知道⽂件的inode号,就能在指定分区中确定是哪⼀个分组,进⽽在哪⼀个分组确定是哪⼀个inode
  • 拿到inode⽂件属性和内容就全部都有了

下⾯,通过touch⼀个新⽂件来看看如何⼯作。

[root@localhost linux]# touch abc[root@localhost linux]# ls -i abc263466 abc

在这里插入图片描述
创建⼀个新⽂件主要有以下4个操作:

  1. 存储属性
    内核先找到⼀个空闲的i节点(这⾥是263466)。内核把⽂件信息记录到其中。
  2. 存储数据
    该⽂件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第⼀块
    数据复制到300,下⼀块复制到500,以此类推。
  3. 记录分配情况
    ⽂件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加⽂件名到⽬录
    新的⽂件名abc。linux如何在当前的⽬录中记录这个⽂件?内核将⼊⼝(263466,abc)添加到
    ⽬录⽂件。⽂件名和inode之间的对应关系将⽂件名和⽂件的内容及属性连接起来。

🚩总结

请添加图片描述

相关文章:

【linux学习指南】】Ext系列文件系统(三)ext2 文件系统的认识与构成

文章目录 📝ext2 ⽂件系统🌠 宏观认识🌉 Block Group 🌠块组内部构成🌉超级块(SuperBlock) 🌠GDT(GroupDescriptorTable)🌉块位图(Blo…...

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】 1.1 漏洞分析1.2 漏洞合约1.3 攻击分析1.4 攻击合约 重点:MaxMint721 漏洞合约的 mint 函数调用了 ERC721 合约中的 _checkOnERC721Received 函数,触发 to 地址中实…...

Linux中sed命令的使用技巧

一、sed语法介绍 sed命令主要用于文本内容的编辑,默认只处理模式空间,不处理原数据。 命令格式: sed [option] command filename示例:删除空白行 sed ‘/^\s*$/d’ filename option 参数: -n:只有经过sed…...

小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面

文章目录 前言一、开启SSH二、配置阿里云ddns1.准备工作2.创建ddns脚本3.添加定时任务 三、开启外网访问SSH和WEB管理界面1、解除WEB管理页面访问限制2.手动添加防火墙端口转发规则,开启外网访问WEB管理和SSH 前言 例如:随着人工智能的不断发展&#xf…...

Flink源码解析之:如何根据JobGraph生成ExecutionGraph

Flink源码解析之:如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中,我们介绍了Flink如何根据StreamGraph生成JobGraph的流程,并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…...

活动预告 |【Part2】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识

课程介绍 通过参加“Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中,你将获得所需的安全技能和培训,以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知…...

网络基础入门到深入(2):网络协议-TCP/IP协议栈

目录 一.TCP/IP协议栈的四层结构 二.每一层的作用与协议 1.作用层 作用: 常见协议: 示例: 2.传输层 作用: 核心功能: 3.网络层 作用: 核心功能: 常见协议: 示例: 4.数据链路层(物理层) 作用: 核心功能: 常见技术: 示例: 三.TCP/IP协议栈的分层…...

美畅物联丨视频上云网关获取视频流地址供第三方调用的方法

在视频监控与流媒体传输领域,视频流地址的获取与调用是极为关键的环节。视频上云网关作为一款高效且稳定的视频传输设备,为获取视频流地址提供了便捷途径,从而使外部系统或平台能够方便地进行调用。今天我们就来讨论一下如何在视频上云网关上…...

【Cesium】一、cesium简介

文章目录 前言1.什么是Cesium?2.Cesium能做什么?3.Cesium的依赖性4.Cesium学习参考 前言 本人是前端,主要是开发web,使用技术栈Vue、Js。最近因工作需要开始学习使用Cesium,找到一位博主的文章很好,一边学…...

微服务架构介绍

微服务架构是一种现代化的软件架构风格,它将应用程序构建为一组小型、自治的服务,每个服务都运行在其独立的进程中,服务与服务之间通过轻量级通信机制(通常是HTTP/RESTful API)进行通信。 1. 服务(Service&…...

SOLID-开闭原则

单一职责原则:https://blog.csdn.net/dmk877/article/details/143447010 在前面我们学习了单一职责原则,今天来一起学习一下SOLID原则中的开闭原则(Open-Closed Principle, OCP) 通过本篇博客你将学到到以下内容 ①什么是开闭原则 ②如何实现开闭原则 ③…...

Mac 安装 Flutter 提示 A network error occurred while checking

错误信息 A network error occurred while checking "https://maven.google.com/": Operation timed out原因 在中国大陆(由于访问 Google 服务器的限制导致超时),无法连接到 https://maven.google.com/ 解决方案 需要使用镜像网站 #flutter 使用国内的镜像 export …...

Rocky Linux下安装meld

背景介绍: meld是一款Linux系统下的用于 文件夹和文件的比对软件,非常常用; 故障现象: 输入安装命令后,sudo yum install meld,报错。 12-31 22:12:17 ~]$ sudo yum install meld Last metadata expirat…...

Sentinel 介绍与使用指南:构建高可用、可靠的微服务架构

在微服务架构中,服务间的依赖和调用非常复杂,这也带来了高并发、大流量等挑战。 如何确保系统在高负载情况下仍能稳定运行,如何避免某个服务的故障影响整个系统的稳定性?Sentinel,作为一个轻量级的、专为分布式系统设计…...

异步请求在TypeScript网络爬虫中的应用

异步请求的重要性 异步请求是现代网络应用中不可或缺的一部分,特别是在网络爬虫领域。它允许爬虫在等待网络响应的同时继续执行其他任务,从而提高效率和性能。在JavaScript和TypeScript中,异步请求可以通过多种方式实现,包括回调…...

智能商业分析 Quick BI

Quick BI 是阿里云提供的一款智能商业分析(BI)工具,旨在帮助企业快速获取业务洞察、优化决策过程、提升数据分析效率。通过强大的数据可视化和分析功能,Quick BI 能够帮助用户轻松连接多种数据源、创建多维度的报表和仪表盘&#…...

[算法] [leetcode-75] 颜色分类

75 颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函…...

抖音短视频矩阵系统源码开发技术解析

开发概览: 抖音短视频矩阵系统的构建基于一系列现代技术栈,主要包括VUE, Spring Boot和Django。本文档旨在为开发者提供关于短视频矩阵系统源代码的开发与部署指南。 技术框架分析: 前端技术选型: 对于前端界面的构建&#xf…...

Linux(CentOS)安装 MySQL

CentOS版本:CentOS 7 三种安装方式: 一、通过 yum 安装,最简单,一键安装,全程无忧。 二、通过 rpm 包安装,需具备基础概念及常规操作。 三、通过 gz 包安装,需具备配置相关操作。 --------…...

头歌实训数据结构与算法-二叉树及其应用(第9关:二叉树的顺序存储及基本操作)

任务描述 本关任务:以顺序结构存储二叉树,编写前序、中序、后序及层次顺序遍历二叉树的算法,并计算二叉树深度、所有结点总数。 相关知识 二叉树的定义 二叉树的递归定义: 二叉树或者是一棵空树。 或者是一棵由一个根结点和两…...

打印进度条

文章目录 1.Python语言实现(1)黑白色(2)彩色:蓝色 2.C语言实现(1)黑白颜色(2)彩色版:红绿色 1.Python语言实现 (1)黑白色 import sys import timedef progress_bar(percentage, width50):"""打印进度条:param percentage: 当前进度百分比…...

【LLM】Langflow 的简单使用

(PS:爆肝整理,请不要吝啬你的点赞和收藏。) 什么是 Langflow ?Langflow 是一种用于构建多智能体和RAG应用的可视化框架。它提供了个无需编码的 AI 生态系统,能够无缝集成各种常用工具和技术栈。Langflow 以 Python 为基础&#x…...

探索 DC-SDK:强大的 3D 地图开发框架

在现代 Web 开发中,地理信息系统(GIS)和 3D 地图可视化变得越来越重要。dc-sdk 是一个基于 Cesium 的开源 WebGL 地图开发框架,它提供了丰富的地图可视化功能和简单易用的 API,使开发者能够轻松地在 Web 应用中集成 3D…...

3.5mm耳机接口硬件连接

结构 以最复杂的结构为例 简单的结构无非就是没有MIC(麦克风)接口 上图的5就是Detect的作用 上面这两款产品都为3.5mm的音频插座,图一 为连接4节的音频座,而且有两个开关,1接地,2接MIC,3接左声…...

nvidia_gpu_exporter 显卡监控

导入 grafana/dashboard.json https://github.com/utkuozdemir/nvidia_gpu_exporter/blob/master/grafana/dashboard.json参考 nvidia_gpu_exporter...

聊聊 Mongod 以及 MongoDB 常用命令

Mongod mongod 是 MongoDB 数据库服务器的核心守护进程,它负责启动并管理 MongoDB 数据库实例。简单来说,mongod 是 MongoDB 数据库服务器程序,它负责处理数据存储、数据请求、数据复制等后台服务。运行 mongod 是启动 MongoDB 数据库的第一…...

webrtc 源码阅读 make_ref_counted模板函数用法

目录 1. 模板参数解析 1.1 typename T 1.2 typename... Args 1.3 typename std::enable_if::value, T>::type* nullptr 2. scoped_refptr 3. new RefCountedObject(std::forward(args)...); 4. 综合说明 5.在webrtc中的用法 5.1 peerConnectionFactory对象的构建过…...

僵尸进程,孤儿进程、守护进程以及wait函数,waitpid函数

僵尸进程 如果子进程退出&#xff0c;但是父进程没有调用 wait 或 waitpid 获取子进程的状态信息&#xff0c;那么子进程的进程描述符&#xff08;task_struct&#xff09;仍然保存在系统中&#xff0c;那么该子进程叫做僵尸进程 #include<iostream> #include<pthre…...

Kafka消息不丢失与重复消费问题解决方案总结

1. 生产者层面 异步发送与回调处理 异步发送方式&#xff1a;生产者一般使用异步方式发送消息&#xff0c;异步发送有消息和回调接口两个参数。在回调接口的重写方法中&#xff0c;可通过异常参数判断消息发送状态。若消息发送成功&#xff0c;异常参数为null&#xff1b;若发…...

Docker新手:在tencent云上实现Python服务打包到容器

1 使用docker的原因 一致性和可移植性&#xff1a;Docker 容器可以在任何支持 Docker 的环境中运行&#xff0c;无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致&#xff0c;减少了“在我的机器上可以运行”的问题。 隔离性&#xff…...

什么是 Spring 的组件(Bean)

什么是 Spring 的组件&#xff08;Bean&#xff09;&#xff1f; Spring 会自动创建、初始化、装配和销毁这些对象。Spring 使用 IoC&#xff08;控制反转&#xff09; 和 DI&#xff08;依赖注入&#xff09; 的理念&#xff0c;将应用程序的对象交给 Spring 容器统一管理&am…...

PawSQL性能巡检平台 (3) - 慢查询采集和优化

在数据库运维管理中&#xff0c;慢查询一直是影响系统性能的重要因素。本文将详细介绍PawSQL数据库性能巡检平台在慢查询管理和优化方面的功能特性&#xff0c;帮助数据库管理员更好地应对性能挑战。 一、PawSQL巡检平台慢查询管理概述 PawSQL平台提供了全面的慢查询管理功能&…...

虚拟机Centos下安装Mysql完整过程(图文详解)

目录 一. 准备工作 1. 设置虚拟机静态IP 2. 卸载Mysql 3. 给CentOS添加rpm源 二. 安装MySQL 1. 安装mysql服务 2. 启动mysql服务 3. 开启MySQL开机自启动 4. 查看mysql服务状态 5. 查看mysql初始密码 6. 登录mysql &#xff0c;修改密码 7. 允许外部访问MySQL数据库…...

微服务保护-sentinel

为什么要有微服务保护&#xff1f; 微服务保护是为了避免微服务雪崩而出现的&#xff0c;每个微服务能处理的请求是有限的&#xff0c;如果一个微服务出现问题导致一个请求进入微服务的时间太久&#xff0c;就会导致大量去请求停滞在微服务内部&#xff0c;这样就会过分占用系统…...

Redis Java 集成到 Spring Boot

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Redis &#x1f4da;本系列文章为个人学习笔…...

RabbitMQ实现生产者消费者

一.启动MQ 注意管理员身份进入cmd才行,我这里是在本地安装的MQ,推荐使用虚拟机安装 二.思路 官方解释RabbitMQ结构: 自我理解RabbitMQ结构: 其实RabbitMQ的服务器就像邮局一样,我们的生产者和消费者对于这个服务器来说都是消费者,因为服务器都可以向两者发送消息 环境准备 …...

stm32f103zet6 ds18b20

main.c // main.c #include "sys.h" #include "ds18b20.h"int main(void){ uart_init(9600);delay_init();while(DS18B20_Init()) //DS18B20初始化 {printf("error");delay_ms(200);}while(1){printf("%4.2f\r\n",Get_Temp());}}ds18…...

期权懂|期权入门知识:开通50ETF期权需要什么条件?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 开通50ETF期权需要什么条件&#xff1f; 一、基本资格要求 &#xff08;1&#xff09;年龄限制&#xff1a;投资者必须年满18周岁&#xff0c;具备完全民事行为能力。 &#…...

Linux day 1129

家人们今天继续学习Linux&#xff0c;ok话不多说一起去看看吧 三.Linux常用命令 3.1 Linux命令体验 3.1.1 常用命令演示 在这一部分中&#xff0c;我们主要介绍几个常用的命令&#xff0c;让大家快速感 受以下 Linux 指令的操作方式。主要包含以下几个指令&#xff1a; ls命…...

智能家居体验大变革 博联 AI 方案让智能不再繁琐

1. 全球AI技术发展背景及智能家居市场趋势 人工智能&#xff08;AI&#xff09;技术的飞速发展正在推动全球各行业的数字化转型。国际电信联盟与德勤联合发布《人工智能向善影响》报告指出&#xff0c;全球94%的商界领袖认为&#xff0c;人工智能技术对于其企业在未来5年内的发…...

git使用

git初始化 git init 指定要添加的文件 git add [文件名1] [文件名2] [文件名3] // 添加指定文件 git add . // 添加当前目录所有文件 将文件提交到本地仓库 git commit -m "备注信息" 添加远程仓库 git remote add origin [远程仓库地址] git remote -v // …...

嵌入科技的温情

嵌入式世界&#xff0c;是一个微小却无比精妙的宇宙。晶体管之间的脉动&#xff0c;仿佛是心跳的回响&#xff1b;代码中跳跃的逻辑&#xff0c;犹如人生中不可预知的转折。每一个嵌入式系统&#xff0c;都像是一个看不见的灵魂&#xff0c;将冰冷的机器唤醒&#xff0c;为生活…...

python利用selenium实现大麦网抢票

大麦网&#xff08;damai.cn&#xff09;是中国领先的现场娱乐票务平台&#xff0c;涵盖演唱会、音乐会、话剧、歌剧、体育赛事等多种门票销售。由于其平台上经常会有热门演出&#xff0c;抢票成为许多用户关注的焦点。然而&#xff0c;由于票务资源的有限性&#xff0c;以及大…...

PS等软件学习笔记

目录 一、ps基础操作快捷键 1、快速打开图片 2、屏幕画布变大变小 3、移动画布 4、CTRL回车&#xff0c;快速完成更改 5、还原 6、创建画布&#xff0c;CTRLN 7、复制图层&#xff0c;CTRLJ 8、一段文字行间距调整 9、反向选择&#xff0c;CTRLSHIFTI 10、抠图 二、…...

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…...

数据库基础知识---以MySQL为例

一、什么是MySQL 数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内 二、特点 开源--免费下载跨平台--可以在多个操作系统进行运行性能好--可以出来大量数据简单--安装配置简单支持多种编程语言--可以与多种编程语言进行无缝集成 三、分类 DDL--数据定义…...

013-spring的注解整合第三方框架

给spring的ioc容器中添加对象 常用这3个方法...

使用ForceBindIP绑定应用到指定IP

前言 使用ForceBindIP工具&#xff0c;用户可以轻松地将特定应用程序绑定到指定的IP地址&#xff0c;从而确保应用程序的网络连接通过指定的网络适配器进行。通过在命令提示符下运行ForceBindIP并指定IP地址和应用程序的完整路径&#xff0c;用户能够控制应用程序的网络流量&a…...

python-LeetCode-两数之和

1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:# 创建一个哈希表用于存储值和索引num_to_index {}for i, num in enumerate(nums):# 计算目标值需要的补数complement target - num# 如…...

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(四)

文章目录 一、管理员角色功能实现1、添加教师功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、教师管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下…...