【Linux文件篇】磁盘到用户空间:Linux文件系统架构全景
W...Y的主页 😊
代码仓库分享 💕
前言:我们前面的博客中一直提到的是被进程打开的文件,而系统中不仅仅只有被打开的文件还有很多没被打开的文件。如果没有被打开,那么文件是在哪里进行保存的呢?那我们又如何快速定位一个文件的具体位置呢?话不多说,开始我们今天的旅程。
磁盘
说到文件的存储,我们先来了解一下磁盘的构成。
磁盘的机械构成
磁盘是计算机存储设备的一种,它用于存储和读取数据。磁盘的机械构成主要包括以下几个部分:
1. 盘片(Platter):这是磁盘的主要部分,通常由铝或其他磁性材料制成。数据以磁性形式存储在盘片上。现代硬盘驱动器(HDD)通常包含多个盘片,它们被堆叠在一起。
2. 读写头(Read/Write Head):这些是用于读取和写入数据到磁盘表面的精密设备。每个盘片的每个面都有一个读写头,它们悬浮在盘片上方非常微小的距离上。
3. 磁头臂(Actuator Arm):这是连接读写头和驱动器主体的机械臂。当数据被请求时,磁头臂会移动读写头到正确的盘片位置。
4. 主轴(Spindle):这是盘片中心的轴,盘片固定在主轴上并随其旋转。主轴的旋转速度通常以每分钟转数(RPM)来衡量,常见的转速有5400 RPM、7200 RPM等。
5. 电机(Motor):电机用于驱动主轴旋转,使盘片旋转到所需的速度。
6. 控制电路板(Control Circuit Board):这是硬盘的电子部分,包含用于控制磁盘操作的微处理器和接口电路。它负责协调读写头的位置、数据传输和与计算机的通信。
7. 外壳(Enclosure):这是硬盘的外部结构,用于保护内部组件免受物理损害。
8. 缓存(Cache):硬盘可能包含一个小型的快速存储器,称为缓存,用于临时存储频繁访问的数据,以提高性能。
9. 接口(Interface):这是硬盘与计算机其他部分通信的接口,常见的接口类型有SATA、SAS等。
硬盘的工作原理是通过电机驱动盘片旋转,磁头臂移动读写头到正确的盘片位置,然后读写头通过改变盘片表面的磁性来存储或读取数据。这个过程需要非常精密的机械协调和电子控制。随着技术的发展,固态硬盘(SSD)逐渐取代了传统的机械硬盘,因为它们没有移动部件,读写速度更快,耐用性更高。
磁盘的物理存储
磁盘的物理存储主要是指硬盘驱动器(HDD)中数据的物理存储方式。
盘片(Platter):硬盘驱动器包含一个或多个圆形的盘片,这些盘片通常由铝、玻璃或陶瓷材料制成,并覆盖有磁性涂层。数据以磁性的方式存储在盘片上。
磁性颗粒(Magnetic Particles):盘片上的磁性涂层由数以亿计的微小磁性颗粒组成。这些颗粒可以被磁化成两种不同的状态,通常表示二进制数据的0和1。
磁道(Track):数据在盘片上以同心圆的形式存储,每个同心圆称为一个磁道。磁道是数据存储的物理路径。
扇区(Sector):磁道被进一步划分为更小的单元,称为扇区。扇区是数据存储的基本单元,通常大小为512字节或4096字节(在现代硬盘中)。
读写头(Read/Write Head):硬盘驱动器的每个盘片面都有一个读写头,用于读取或写入数据。读写头通过电磁场的变化来检测或改变盘片上的磁性颗粒状态。
磁头臂(Actuator Arm):读写头安装在磁头臂上,磁头臂可以移动读写头到盘片上的不同位置,以便访问不同的磁道。
伺服系统(Servo System):硬盘驱动器使用伺服系统来精确控制磁头臂的位置,确保读写头能够准确地定位到正确的磁道和扇区。
旋转速度(Rotational Speed):盘片的旋转速度影响数据访问速度。转速以每分钟转数(RPM)来衡量,常见的转速有5400 RPM、7200 RPM等。
硬盘驱动器的物理存储方式依赖于磁头和盘片的精确协调。数据的读写是通过改变磁性颗粒的极性来实现的。
虽然说一个磁盘是一个圆形的物体,但是在上面存储的数据并不是杂乱无章的。其实磁盘上有很多同心圆——也叫磁道。而同心圆中的一小段被称作扇区,是磁盘IO的基本单位,但不一定是系统的基本单位,一般情况下大小为4kb或521字节。虽然扇区的面积不同,但是可以通过密度的调整让其扇区的大小都是一样的。
扇区、磁头、盘面、磁道都有自己的唯一编号,所以我们想要访问一个具体的扇区,首先我们先通过磁头定位到哪一个磁道/柱面,然后确认使用哪一个磁头进行读取(本质就是使用哪一个盘面),最后确认到哪一个扇区。这种在硬件层面上定位一个扇区被我们称为——CHS定位法。
磁盘的逻辑存储
磁带我们想必都见过,小学时使用的英语听力一般使用的就是磁带。磁带存储内容就是我们下图所看到的长条。当我们将磁带拉直像不像我们所学的一种数据结构——线性表。
我们通过磁带来类比磁盘,如果我们将一个个扇区看作一段空间,将他们全部拼接起来不也就是线性表吗!假设一个磁盘有800GB内存,一个扇区所占空间是512字节,那么我们就可以看到下图:
所以我们对磁盘的管理,也就变成了对数组的增删查改!!!
但操作系统觉得一个扇区512字节太小,因为磁盘是一个硬件而硬件的速度是很慢的,磁盘IO太麻烦,所以OS就将文件IO定在4KB。操作系统会选择连续的8个扇区作为数据块,这样操作系统又会形成一个数组,大小为4kb的数据块。
这样的操作系统也可以将自己的IO转换到磁盘中,4kb等于8个512字节,所以当数据块下标为1时,想要对应磁盘中的扇区只需要,1*8 + [0,1,2,3,4,5,6,7]即可一一对应。我们只需要知道起始扇区+偏移量就可以做到对应。
所以从此往后整个磁盘不会以扇区作为单位,而是以数据块作为单位,我们将数据块的下标叫做LBA地址。
系统对内容的管理
我们都见过Windows中的C盘D盘E盘等等,为什么要分这么多盘呢?因为系统要对我们的内存进行管理,如果800GB放一个盘中会比较大,不好进行管理,而且分盘可以对电脑的性能提升。所以我们要分区/分盘管理,Linux下也是如此。
分盘管理是将大的空间进行缩小化,磁盘的管理方式都是类似相同的,所以我们要把512GB内存管理好从而就进化到管理好256GB内存即可。但是256GB还是有些大,这时操作系统就会做一些我们看不到的事情——分组。
将256GB内存分成10GB左右更小的内存进行管理,这样我们的问题从如何管理好256GB转移到如何管理好10GB内存了。
作系统中的内存分组是指操作系统将内存划分成多个逻辑组或分区,以便于更有效地管理内存资源。内存分组可以基于不同的标准,例如用途、访问频率、安全性等。
代码区:存储程序的指令代码,通常被设置为只读,以防止程序代码被意外或恶意修改。
数据区:用于存储程序运行时的数据,包括全局变量和局部变量等。
堆栈区:每个线程或进程都有自己的堆栈,用于存储函数调用的参数、局部变量和返回地址。
堆区:动态内存分配区域,程序在运行时可以申请和释放内存。
内核区:操作系统内核代码和数据结构的存储区域,通常与用户空间隔离,以提高安全性。
缓存区:用于存储频繁访问的数据,以提高访问速度。
I/O缓冲区:用于临时存储输入输出操作的数据,可以减少I/O操作的延迟。
虚拟内存区:当物理内存不足时,操作系统可以使用硬盘空间作为虚拟内存,通过页面置换算法管理内存。
共享内存区:允许多个进程共享同一块内存区域,用于进程间通信。
保护模式:在某些操作系统中,内存分组还包括不同的保护级别,以确保进程不能访问不属于它们的内存区域。
内存分组的好处包括:
- 提高安全性:通过隔离不同区域的内存,防止恶意程序访问或修改其他程序的内存。
- 优化性能:通过合理分配内存资源,可以减少内存碎片,提高内存访问速度。
- 便于管理:分组管理使得操作系统更容易跟踪内存使用情况,简化内存分配和回收的过程。
- 支持多任务处理:允许多个任务同时运行,每个任务都有自己的内存空间,提高了系统的多任务处理能力。
- 提高可靠性:当一个程序崩溃时,分组管理可以限制错误的影响范围,减少系统崩溃的风险。
内存分组是操作系统内存管理的一个重要方面,它有助于提高系统的稳定性、安全性和效率。
那问题又来了,操作系统如何管理好分组中的内存呢?
理解文件系统
我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。
[root@localhost linux]# ls -l
总用量 12
-rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out
-rw-r--r--. 1 root root 654 "9月 13 14:56" test.c
每行包含7列:
模式
硬链接数
文件所有者
组
大小
最后修改时间文件名
ls -l读取存储在磁盘上的文件信息,然后显示出来
其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息
[root@localhost linux]# stat test.c
File: "test.c"
Size: 654 Blocks: 8 IO Block: 4096 普通文件
Device: 802h/2050d Inode: 263715 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-09-13 14:56:57.059012947 +0800
Modify: 2017-09-13 14:56:40.067012944 +0800
Change: 2017-09-13 14:56:40.069012948 +0800
系统文件 = 属性 + 内容,那内容是可大可小的但是属性都是固定大小,他们被放在一个struct inode的结构体中进行存储,只能说他们的属性内容不同,但是大小一定是相同的,在Linux操作系统下规定固定大小为128字节。所以文件的属性和内容就要分开进行存储。
我们又回到刚才的问题,10GB的内容我们要怎么样管理?我们先来看一张图:
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分组被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。
而在系统中标识一个文件用的不是其文件名,而是其inode。
那我们就来认识一下文件系统图中的各个区域的含义:
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
i节点表(inode table):存放文件属性 如 文件大小,所有者,最近修改时间等。
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。比特位的位置:第几个inode。比特位的内容:表示该inode是否被使用。
数据区(data blocks):存放文件内容。我们可以想象成数据区中是一个特别大的内存,内存中有非常多的4kb数据块,当我们想要存放数据时无非就是数据库使用的多少问题。
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。比特位的位置:第几个数据块。比特位的内容:表示该数据块是否被使用。
那inode属性区怎么与block数据区进行关联呢?在属性结构体struct inode中有一个数组,数组中存放的就是这个文件在数据区中使用数据块的下标。所以无论是内容还是属性,只要找到inode就可以将全部信息获取到。而我们删除一个文件的内容,不会去删除inode table 与data blocks中的内容,只会删除位图中的内容,让后面来的文件进行覆盖即可。
inode是在整个分区内唯一的,而想要寻找一个文件的inode首先我们得确认在哪个分组中。每个分区中都有其起始编号和终止编号,我们只需要将inode进行范围比较即可确认在哪个分组中。然后再减去分组中的起始编号后就可以得到inode table。
现在又有一个问题,inode table中存放文件的属性,而文件的属性中又有一个block[15]数组用来存放数据块的下标,但是有的文件是非常大的15个位置15个数据块是不够的,那怎么办?实际上block数组中0~11是直接保存的数据块的编号,而12~13并不是保存数据块的编号而是保存其他数据块的编号,其他数据块是内容。而14保存的是其他数据块的编号,其他数据块也是指向更多的数据块编号。这样我们就可以存储非常大的文件编号了。
GDT,Group Descriptor Table:块组描述符,描述块组属性信息。
即全局描述符表(Global Descriptor Table),是x86架构的CPU中用于定义不同内存段的一块内存区域。GDT是操作系统用来实现内存保护、分页和多任务处理的关键组成部分。每个条目(Descriptor)在GDT中定义了一个内存段的属性,包括段的基地址、大小、访问权限等。
所以GDT是对一个块组整体做管理的管理数据结构。描述了起始LBA是多少、起始inode编号是多少、一共有多少个inode多少个数据块、已经使用了多少个inode和数据块、下一次怎么分配等等信息。
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。整个分区是由super block进行管理的。而GDT是管理分区中的一个分组的数据结构。
还有一个Boot Block一般是在第一个分区才有,它是和开机有关系的。当开机时我们首先要识别磁盘,才可以将操作系统加载到内存中。我们可以简单理解为,了解整个磁盘的分区情况并且告诉操作系统在哪个分区中。
而这些文件信息不是在我们分区后就有的,而是在格式化后进行写入的。
我们可以在分区中写入相同或者不同的文件系统,以上的文件系统属于Ext*(2),现在我们用到的一般是Ext*(3)以上,但是核心原理是不变的。
文件系统中最核心的就是super block,所以操作系统在管理文件时就可以将每一个分组的super block加载到内存中建立一个数据结构进行管理,所以对文件的管理就进而转化成对super block的z增删查改工作。
现在我们已经知道文件系统的底层逻辑后,我们创建一个文件的逻辑是什么呢?
1. 存储属性
内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
2. 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
复制到300,下一块复制到500,以此类推。
3. 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
4. 添加文件名到目录
新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
因为目录也算文件,而任何一个文件都在目录中,那目录文件中就存放文件名和inode编号的映射关系,如果目录文件中没有写权限,我们就不能在目录中创建新的文件,因为它要修改目录文件内容。而差一个目录的内容都是从根目录开始的,因为它是从前一个目录中进行查找目录内容的,所以是逆向递归查找的。
一个inode是在一个分区中是唯一的,但是不知道其在哪一个分区。所以这时候我们的路径就出马了。一个文件写入文件系统的分区,要被Linux使用,必须要先把具有系统文件的分区进行“挂载”。一个文件系统所对应的分区挂载到对应的目录中我们才可以访问。所以分区的访问就是所挂载路径的访问。这里我们不讲什么是挂载,有兴趣的可以自己去学习以及mount指令。
以上就是我们本次的全部内容,感谢大家观看!!!
相关文章:
【Linux文件篇】磁盘到用户空间:Linux文件系统架构全景
W...Y的主页 😊 代码仓库分享 💕 前言:我们前面的博客中一直提到的是被进程打开的文件,而系统中不仅仅只有被打开的文件还有很多没被打开的文件。如果没有被打开,那么文件是在哪里进行保存的呢?那我们又如何快速定位…...
数据分析-Excel基础函数的使用
Excel基础函数: sum:求和 sumif:单条件求和 sumifs:多条件求和 subtotal:根据筛选求和 if:逻辑判断 vlookup:连接匹配数据 match:查找数值在区域中的位置 index:根据区域的位置返回数值 match、index:一起使用:自动根据列名查找数据 sumifs、match、ind…...
速盾的防护策略有哪些?
在当今数字化时代,网络安全至关重要,而速盾作为一款优秀的安全防护工具,拥有一系列全面且有效的防护策略。 首先,速盾采用了先进的访问控制策略。通过严格的身份验证和授权机制,确保只有合法的用户和应用程序能够访问特…...
LabVIEW RT在非NI硬件上的应用与分析
LabVIEW RT(实时操作系统)可运行在非NI(National Instruments)硬件上,如研华工控机,但需要满足特定硬件要求。本文从硬件要求、开发和运行差异、可靠性、稳定性、优势和成本等多角度详细分析在非NI硬件上运…...
使用Python批量处理Excel的内容
正文共:1500 字 10 图,预估阅读时间:1 分钟 在前面的文章中(如何使用Python提取Excel中固定单元格的内容),我们介绍了如何安装Python环境和PyCharm工具,还利用搭好的环境简单测试了一下ChatGPT提…...
k8s+pv+pvc+nas 数据持久化volumes使用
1 k8s pod申请持久化卷配置 apiVersion: v1 kind: Service metadata:name: $IMG_NAMEnamespace: rz-dtlabels:app: $IMG_NAME spec:type: NodePortports:- port: 8091nodePort: 31082 #service对外开放端口selector:app: $IMG_NAME --- apiVersion: apps/v1 kind: Deployment …...
C++算法-青蛙跳台阶【面试】
"青蛙跳台阶"问题是一个经典的递归问题,也与斐波那契数列有关。问题是这样的:一只青蛙站在一个n阶台阶上,它每次可以跳1阶或2阶,问青蛙跳到顶端总共有多少种跳法。 这个问题可以用递归或动态规划来解决。以下是使用C实…...
px转rem插件postcss-plugin-px2rem使用方法(浏览器缩放页面自适应)
px转rem插件postcss-plugin-px2rem使用方法(浏览器缩放页面自适应) 1. 常见屏幕自适应的布局 百分比布局rem布局css媒体查询在前端框架设计初期,应优先选择好页面布局方式 2. postcss-plugin-px2rem插件的使用 官网地址:https…...
批量文件重命名技巧:轻松替换删除文件夹名中的字母,实现高效文件管理新境界
在数字化时代,我们每天都会面对大量的文件和文件夹。无论是工作文档、学习资料还是个人收藏,文件命名的规范性都显得尤为重要。然而,手动一个一个去修改文件名,不仅耗时耗力,还容易出错。那么,有没有一种方…...
windows设备/路由设备上ip地址如何查看、使用
在Windows设备上查看本地IP地址(IPv4和IPv6): 使用命令提示符: 打开命令提示符(在Windows中按Win R,然后输入"cmd"并按Enter)。在命令提示符窗口中,输入以下命令以查看…...
服务端⾼并发分布式结构演进之路
在进行技术学习过程中,由于大部分读者没有经历过一些中大型系统的实际经验,导致无法从全局理解一些概念,所以本文以一个"电子商务"应用为例,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举…...
Stable Diffusion ProtoVisionXL大模型之艺术盛宴!
今天基于ProtoVisionXL这款大模型为大家呈现一些视觉上的艺术盛宴,视觉冲击宣传海报信手拈来,再配上你的宣传语,妥妥地让人眼前一亮。 实测参数: 分辨率:768*1024 采样方法 (Sampler):DPM 2M Karras 迭代步数 (Ste…...
浅谈golang字符编码
1、 Golang 字符编码 Golang 的代码是由 Unicode 字符组成的,并由 Unicode 编码规范中的 UTF-8 编码格式进行编码并存储。 Unicode 是编码字符集,囊括了当今世界使用的全部语言和符号的字符。有三种编码形式:UTF-8,UTF-16&#…...
Vite和Webpack的区别是什么,你站队谁?
Vite和Webpack有很多相同之处,也有区别,很多老铁分不清,贝格前端工场借助此文为大家详细介绍一下。 一、关于Vite和Webpack Vite和Webpack都是前端开发中常用的构建工具,用于将源代码转换为可在浏览器中运行的静态资源。它们在一…...
【微信小程序】事件传参的两种方式
文章目录 1.什么是事件传参2.data-*方式传参3.mark自定义数据 1.什么是事件传参 事件传参:在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在…...
前端针对需要递增的固定数据
这里递增的是1到12 data(){return{cycleOptions:Array.from({ length: 12 }, (v, k) > ({value: k 1,label: String(k 1)})),} }<el-select v-model"ruleForm.monthLength" placeholder"请选择周期数量"><el-optionv-for"item in cycle…...
红酒保存中的氧气管理:适度接触与避免过度氧化
在保存云仓酒庄雷盛红酒的过程中,我们不得不面对一个微妙的问题:氧气管理。氧气,这个我们生活中无处不在的气体,对于红酒的保存却有着至关重要的影响。适度接触氧气对红酒的陈年过程和品质维护具有积极作用,然而过度氧…...
从零开始搭建开源智慧城市项目(三)上升线效果
前言 上一节实现了添加建筑物线框,模型外墙和道路地面材质添加。这一节准备通过简单的shader实现上升线效果。 思路 简单的说一下思路,通过获取模型顶点坐标所在的高度Z来进行筛选,高度再某一区间内设置成上升线的颜色,其余高度…...
unity基础(五)地形详解
目录 一 创建地形 二 调整地形大小 三 创建相邻地形 四 创建山峰 五 创建树木 七 添加风 八 添加水 简介: Unity 中的基础地形是构建虚拟场景的重要元素之一。 它提供了一种直观且灵活的方式来创建各种地形地貌,如山脉、平原、山谷等。 通过 Unity 的地形…...
postman接口测试工具详解
Postman 是一个功能强大的 API 开发和测试工具,广泛应用于开发人员和测试人员进行 API 的调试、测试、文档生成等工作。以下是对 Postman 的详细介绍。 1. 功能概览 1.1 请求构建 请求类型: 支持 GET、POST、PUT、DELETE、PATCH、OPTIONS 等多种 HTTP 方法。URL …...
2024年护网行动全国各地面试题汇总(3)作者:————LJS
应急响应基本思路和流程 收集信息:收集客户信息和中毒主机信息,包括样本判断类型:判断是否是安全事件,何种安全事件,勒索、挖矿、断网、DoS 等等抑制范围:隔离使受害⾯不继续扩⼤深入分析:日志分…...
计算机专业的学生要达到什么水平才能进入大厂工作?越早知道越好
计算机专业的学生要达到什么水平才能进入BAT等大厂工作?越早知道越好. 一、算法题 各大公司笔试、面试基本都考这个,别的不说,《剑指Offer》所有题目背下来,Leetcode高频题目刷个一两百遍,搞过ACM也可以,…...
巡检费时费力?试试AI自动巡检
随着企业IT规模不断增长,设备、系统越来越多,运维工作压力也与日俱增。保障设备、系统健康稳定地运行,日常巡检是运维工作不可或缺的部分。通过巡检可以及时发现设备、系统的异常问题,提前预防及时处理,避免问题扩大产…...
46-4 等级保护 - 网络安全等级保护概述
一、网络安全等级保护概述 原文:没有网络安全就没有国家安全 二、网络安全法 - 安全立法 中华人民共和国主席令 第五十三号 《中华人民共和国网络安全法》已于2016年11月7日由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过,并自2017年6月1日起正式…...
css引入方式有几种?link和@import有什么区别?
在CSS中,引入外部样式表的方式主要有两种:<link>标签和import规则。 使用<link>标签引入外部样式表: <link rel"stylesheet" href"path/to/style.css">这种方式是在HTML文档的<head>部分或者…...
使用‘消除’技术绕过LLM的安全机制,不用训练就可以创建自己的nsfw模型
开源的大模型在理解和遵循指令方面都表现十分出色。但是这些模型都有审查的机制,在获得被认为是有害的输入的时候会拒绝执行指令,例如会返回“As an AI assistant, I cannot help you.”。这个安全功能对于防止误用至关重要,但它限制了模型的…...
解决使用elmessage 没有样式的问题
错误情况 这里使用了一个消息提示,但是没有出现正确的样式, 错误原因和解决方法 出现这种情况是因为,在全局使用了按需导入,而又在局部组件中导入了ElMessage组件,我们只需要将局部组件的import删除就可以了 import…...
pxe批量部署linux介绍
1、PXE批量部署的作用及必要性: 1)智能实现操作系统的批量安装(无人值守安装)2)减少管理员工作,提高工作效率3)可以定制操作系统的安装流程a.标准流程定制(ks.cfg)b.自定义流程定制(ks.cfg(%pos…...
RAG 实践-Ollama+AnythingLLM 搭建本地知识库
什么是 RAG RAG,即检索增强生成(Retrieval-Augmented Generation),是一种先进的自然语言处理技术架构,它旨在克服传统大型语言模型(LLMs)在处理开放域问题时的信息容量限制和时效性不足。RAG的…...
【超详细】使用RedissonClient实现Redis分布式锁
使用RedissonClient实现Redis分布式锁是一个非常简洁和高效的方式。Redisson是一个基于Redis的Java客户端,它提供了许多高级功能,包括分布式锁、分布式集合、分布式映射等,简化了分布式系统中的并发控制。 添加依赖 首先,你需要…...
网站建设合同模板/怎样做线上销售
题库来源:安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装试题及解析参考答案及R2移动式压力容器充装考试试题解析是安全生产模拟考试一点通题库老师及R2移动式压力容器充装操作证已考过的学员汇总,相对有效帮助R2移动式压力容器充装模拟考试…...
南川网站建设/自媒体平台大全
今天突然磁盘满了,查看了一下,都是k8s、docker关联的目录占用太大(/var/lib/docker/overlay2和/data/registry/docker/registry/v2/blobs/sha256),使用第一种方式删除了悬空镜像,清理了19G的空间࿰…...
怎么做淘宝客导购网站推广/seo网络优化师
第27卷第2期2010年2月机 械 设 计JOURNALOFMACHINEDESIGNVol.27No.2Feb.2010计算机辅助夹具设计技术回顾与发展趋势综述蔡瑾,段国林,姚涛,许红静(河北工业大学机械学院CAD/CAM研究所,天津 300130)3摘要:计算机辅助夹具设计(Computer2aidedfixturedesign,CAFD)技术从20世纪7…...
做网站设计制作的/google网页版
阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都会有分享,都是免费订阅,请您放心关注。注:本文转载自网络,不代表本平台立场,仅供…...
网站模板与网站定制版的区别/郑州网站开发顾问
之前其实也讨论过这个话题,但是没有总结出一个简单的结论,报错其实都是相对导入带来的问题,一定不要运行有.或者…相对导入的脚本,这是必然会报错的,这种情况,它只能作为被调用模块,且要么在执行…...
合肥建设局网站官网/怎么做seo信息优化
问题: 公司有很多代码工程(几十个),如果将Jenkinsfile文件放置在每个代码工程里面,维护量很大,且当脚本发生必要的变更后,所有的工程代码中的这个文件都要重新修改。 为了解决这个问题,我编写了一个通用的Jenkinsfile脚本。将该文件设置为全局默认的脚本文件。 设置方…...