使用RAID与LVM磁盘阵列技术

news2024/11/27 20:35:03

 前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 

目录

一、RAID磁盘冗余阵列

1、部署磁盘整列

2、损坏磁盘阵列及修复

3、磁盘阵列+备份盘

4、删除磁盘阵列

二、LVM逻辑卷管理器

致谢


一、RAID磁盘冗余阵列

硬盘设备是计算机中比较容易故障的元器件之一,加之由于其需要存储数据的特殊性质,不能像CPU、内存、电源甚至主板故障后更换新的就好,所以生产环境中一定要未雨绸缪,提前做好数据的冗余及异地备份等工作

1988年,美国加利福尼亚大学伯克利分校首次提出并定义了Redundant Array of Independent Disks技术的概念,中文名称是磁盘冗余阵列,简称RAID。RAID技术通过多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利分散读写技术来提升磁盘阵列整体的性能,同时把多个重要的数据的副本同步到不同的物理邮硬盘设备上,从而起到数据冗余备份效果

目前已有的RAID磁盘阵列的方案至少有十几种,RAID 0,RAID 1,RAID 5与RAID 10这4种最常见的方案

RAID级别最少硬盘可用容量读写性能安全性特点
02nn追求最大容量和速度,任何一块盘损坏,数据全部异常
12n/2n追求最大安全性,只要阵列组中有一块硬盘可用,数据不受影响
53n-1n-1在控制成本的前提下,追求硬盘的最大容量、速度及安全性,允许有一块硬盘异常,数据不受影响
104n/2n/2综合RAID 1和RAID 0的优点,追求硬盘的速度和安全性,允许有一半硬盘异常(不可同组),数据不受影响

1、RAID 0

RAID 0技术把多块物理设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依此写入到各个物理硬盘中。通俗来说,RAID 0技术能有效的提升硬盘数据的吞吐速度,但是不具备数据备份和错误修复能力。

数据被分别写入到不同的硬盘设备中,即硬盘A和硬盘B设备分别保存数据资料,最终实现提升读取、写入速度的效果

2、RAID 1

RAID 1技术把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中的一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用

因为在多块硬盘设备中写入了相同的数据,因此硬盘设备的利用率下降,理论上说硬盘空间真实利用率只有50%,由三块硬盘设备组成的RAID 1磁盘阵列的可用率只有33%。无疑增大了系统计算功能的负载

3、RAID 5

RAID 5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5磁盘阵列中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上;图中parity部分存放的就是数据的奇偶校验信息,换句话说,就是RAID 5技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据

RAID 5最少由三块硬盘组成,使用的是Disk Striping硬盘切割技术。比RAID 1级别好处在于保存的是奇偶校验信息而不是一模一样的内容,所以当重复写入某个文件时,RAID 5级别磁盘阵列只需要对应一个奇偶校验信息就可以,效率更高,存储成本也降低。

4、RAID 10

鉴于RAID 5对各方面有了妥协,但是大部分企业更在乎的是数据本身的价值而非硬盘价格,因此生产环境中主要使用RAID 10技术

RAID 10就是RAID 1+RAID 0技术的一个“组合体”。RAID 10技术至少需要4块硬盘来组建,其中分别两两制作成RAID 1磁盘阵列,以保证数据的安全性;然后再对两个RAID 1磁盘阵列实施RAID 0技术,进一步提高硬盘设备的读写速度。

1、部署磁盘整列

首先在虚拟机中添加4块硬盘设备来制作一个RAID 10磁盘阵列,SCSI或SATA接口类型

这些硬盘是模拟出来的,当前生产环境中用到的服务器一般都配备RAID阵列卡,我们学习阶段没必要单独去购买一台服务器,而是学会用mdadm命令在Linux系统中创建和管理软件RAID磁盘阵列。

1.1、mdadm命令

mdadm命令用于创建、调整、监控和管理RAID设备,语法:"mdadm 参数 硬盘名称"

参数作用
-a检测设备名称
-n指定设备数量
-l指定RAID级别
-C创建
-v显示过程
-f模拟设备损坏
-r移除设备
-Q查看摘要信息
-D查看详细信息
-S停止RAID磁盘阵列

接下来,使用mdadm命令创建RAID 10,名称为"/dev/md0"

前面讲过,udev是Linux系统内核中用来给硬件命名的服务,其命名规则也非常简单。可以猜测到第二个SCSI存储设备的名称会是/dev/sdb,以此类推。mdadm命令中的参数-C代表创建一个RAID阵列卡-v参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/mdo就是创建后的RAID磁盘阵列的名称;-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;而-l 10参数则代表RAID 10方案;最后再加上4块硬盘设备的名称就OK了

 [root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
 mdadm: layout defaults to n2
 mdadm: layout defaults to n2
 mdadm: chunk size defaults to 512K
 mdadm: size set to 20954112K
 mdadm: Defaulting to version 1.2 metadata
 mdadm: array /dev/md0 started.

初始化过程使用-D参数进行查看,也可以用-Q参数查看简要信息

 [root@linuxprobe ~]# mdadm -Q /dev/md0
 /dev/md0: 39.97GiB radi10 4 devices, 0 spares. Use mdadm --detail for more detail.

四块20G大小的硬盘组成的磁盘阵列可用空间只有39.97了,RAID 10技术通过两两一组硬盘组成的RAID 1保证了数据的可靠性,每一份数据都被保存两次,50%的使用率

把制作好的RAID磁盘阵列格式化为ext4格式

 [root@linuxprobe ~]# mkfs.ext4 /dev/md0
 ...

创建挂载点后把硬盘设备进行挂载操作:

 [root@linuxprobe ~]# mkdir /RAID
 [root@linuxprobe ~]# mount /dev/md0 /RAID
 [root@linuxprobe ~]# df -h
 ...
 /dev/md0            40G     49M     38M     1%      /RAID

查看/dev/md0磁盘阵列组设备的详细信息,确认下RAID级别(Raid Level)、大小(Array Size)和总硬盘数(Total Devices)是否正确;

 [root@linuxprobe ~]# mdadm -D /dev/md0
 /dev/md0:
     ...

最后想让创建好的RAID磁盘阵列能够一直为我们服务,不会因每次的重启操作而取消,记得将信息添加到/etc/fstab文件中:

 [root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
 [root@linuxprobe ~]# cat /etc/fstab
 ...
 /dev/md0                /RAID       ext4        defaults        0   0

2、损坏磁盘阵列及修复

首先确认有一块物理硬盘设备出现损坏后不能再继续正常使用后,使用mdadm命令来予以移除之后查看下RAID磁盘阵列组的状态已经被改变

 [root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
 mdadm: set /dev/sdb faulty in /dev/md0
 [root@linuxprobe ~]# mdadm -D /dev/md0
 /dev/md0:
     ...
     0       8       16      -       faulty      /dev/sdb

使用-f参数是让硬盘模拟损坏,为了能够彻底的将故障盘移除,还要再一步操作:

 [root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdb
 mdadm: hot removed /dev/sdb from /dev/md0

当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用。更换硬盘后使用-a参数进行添加操作,默认会自动开始数据的同步工作,使用-D参数即可看到整个过程和百分比进度:

 [root@linuxprobe ~]# mdadm /dev/md0 -a /dev/sdb
 mdadm: added /dev/sdb
 [root@linuxprobe ~]# mdadm -D /dev/md0
 /dev/md0:
     ...

3、磁盘阵列+备份盘

RAID 10磁盘阵列中最多允许50%的硬盘设备发生故障,但存在一个极端情况,即同一RAID 1磁盘阵列中的硬盘设备若全部损坏,也会导致数据丢失。怎么办呢,可以使用RAID备份盘技术来预防。该技术的核心理念就是准备一块足够大的硬盘,这块硬盘平时处于闲置状态一旦RAID磁盘阵列中有硬盘出现故障后则会马上顶替上去

示例:恢复虚拟机初始状态,现在看一下RAID 5的部署效果。部署RAID 5磁盘阵列时,至少需要用到3块硬盘,还需再加一块备份硬盘(也叫热备盘),所以总计需要在虚拟机中模拟4块硬盘设备:

现在创建一个RAID 5磁盘阵列+备份盘。

 # 参数-n 3代表创建这个RAID 5磁盘阵列所需的硬盘数
 # 参数-l 5代表RAID的级别
 # 参数-x 1则代表有一块备份盘
 [root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
 mdadm: layout defaults to left-symmetric
 mdadm: layout defaults to left-symmetric
 ...
 [root@linuxprobe ~]# mdadm -D /dev/md0
     ...
     3   8   64  -   spare   /dev/sde

现将部署好的RAID 5磁盘阵列格式化为ext4文件格式,然后挂载到目录上,之后就使用了:

 [root@linuxprobe ~]# mkfs.ext4 /dev/md0
 ...
 [root@linuxprobe ~]# mkdir /RAID
 [root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab  

由三块硬盘组成的RAID 5级别磁盘阵列,它对应的可用空间是n-1,也就是40G。热备盘的空间是不算入内的,平时完全就是在“睡觉”中,只有意外出现时才开始工作

 [root@linuxprobe ~]# mount -a
 [root@linuxprobe ~]# df -h
 ...
 /dev/md0        40G     49M     38G     1%  /RAID

实验:我们把硬盘设备/dev/sdb溢出磁盘阵列,然后迅速查看/dev/md0磁盘阵列的状态,就会发现备份盘已经自动顶替上去并开始了数据同步。RAID中这种备份盘技术非常实用,可以在保证RAID磁盘阵列数据安全性的基础上进一步提高数据可靠性;

 [root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
 mdadm: set /dev/sdb faulty in /dev/md0
 [root@linuxprobe ~]# mdadm -D /dev/md0
 /dev/md0:
     ...
     0       8       16      -       faulty      /dev/sdb

4、删除磁盘阵列

生产环境中,RAID磁盘阵列组部署后一般不会轻易被停用了,万一赶上了,还是需要知道怎么删除的。上面这种RAID 5+热备盘损坏的情况是比较复杂的,就以这种情况讲解:

首先需要将所有的磁盘都设置成停用状态:

 [root@linuxprobe ~]# umount /RAID
 [root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdc
 mdadm: set /dev/sdc faulty in /dev/md0
 [root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdd
 mdadm: set /dev/sdd faulty in /dev/md0
 [root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sde
 mdadm: set /dev/sde faulty in /dev/md0

然后再逐一的移除出去:

[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sdd
mdadm: hot removed /dev/sdd from /dev/md0
[root@linuxprobe ~]# mdadm /dev/md0 -r /dev/sde
mdadm: hot removed /dev/sde from /dev/md0

着急的同学也可以用"mdadm /dev/md0 -f /dev/sdb -r /dev/sdb" 一条命令搞定。但由于这个命令在早期版本不能一起使用,保险还是一步一步执行。移除后查看磁盘阵列状态:

[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
	...
	-		0 		0		0		removed
	-		0 		0		1		removed
	-		0 		0		2		removed

继续再停用整个RAID磁盘组:

[root@linuxprobe ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@linuxprobe ~]# ls /dev/md0
ls: cannot access '/dev/md0': No Such file or directory

二、LVM逻辑卷管理器

前面的硬盘管理技术虽然能够有效地提高硬盘设备的读写速度以及数据的安全性,但是在硬盘分区好或者部署为RAID磁盘阵列后,再想修改硬盘分区大小就不容易了。这时需要另外一项非常普及的硬盘设备资源管理技术了—Ligical Volume Manager(逻辑卷管理器,简称LVM)。LVM允许用户对硬盘资源进行动态调整

逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制,理论性较强。LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。LVM技术架构如下:

物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列。卷组建立在物理卷之上,一个卷组能够包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立以后可以动态地扩展或缩小空间。这就是LVM的核心理念。

1、部署逻辑卷

原先分配的硬盘分区不够用。通过部署LVM来解决。部署时需要逐个配置物理卷、卷组和逻辑卷,常用的部署命令如下:

功能/命令物理卷管理卷组管理逻辑卷管理
扫描pvscanvgscanlvscan
建立pvcreatevgcreatelvcreate
显示pvdisplayvgdisplaylvdisplay
删除pvremovevgremovelvremove
扩展vgextendlvextend
缩小vgreducelvreduce

示例:还原虚拟机,并重新添加两块新硬盘设备(更好的演示LVM理念中用户无需关心底层物理硬盘设备的特性)

第1步:让新添加的两块硬盘设备支持LVM技术:

 [root@linuxprobe ~]# pvcreate /dev/sdb /dev/sdc
 Physical volume "dev/sdb" successfully created.
 Physical volume "dev/sdc" successfully created.

第2步:把两块硬盘设备加入到storage卷组中,然后查看卷组的状态:

 [root@linuxprobe ~]# vgcreate storage /dev/sdb /dev/sdc
 Volume group "storage" successfully created.
 [root@linuxprobe ~]# vgdisplay
 --- Volume group ---
 ...
 Free PE / Size  10238 / 39.99 GiB

第3步:再切割出一个约为150MB的逻辑卷设备。

这里需要注意切割单位的问题。在对逻辑卷进行切割时有两种计量单位。第一种是容量为单位,所使用参数为-L:使用-L 150M生成一个大小为150MB的逻辑卷。另外一种是以基本单元的个数为单位,所使用参数为-l,每个基本单元的大小默认是4MB:使用-l 37可以生成一个大小为37*4MB = 148MB的逻辑卷。

 [root@linuxprobe ~]# lvcreate -n vo -l 37 storage
 Logical volume "vo" created.
 [root@linuxprobe ~]# lvdisplay
 --- Logical volume ---
 ...
 LV Size             148.00 MiB

第4步,把生成好的逻辑卷进行格式化,然后挂载使用:

Linux系统会把LVM中的逻辑卷设备存放在/dev设备目录中,实际上就是个快捷方式,同时会以卷名的名称来建立一个目录,其中保存了逻辑卷的设备映射文件,即/dev/卷组名称/逻辑卷名称

 [root@linuxprobe ~]# mkfs.ext4 /dev/storage/vo
 mke2fs 1.44.3 (10-July-2018)
 ...
 [root@linuxprobe ~]# mkdir  /linuxprobe
 [root@linuxprobe ~]# mount /dev/storage/vo /linuxprobe

第5步:查看挂载状态,并写入到配置文件,使其永久生效

 [root@linuxprobe ~]# df -h
 ...
 /dev/mapper/storage-vo      140M 1.6M 128M 2% /linuxprobe
 [root@linuxprobe ~]# echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab
 [root@linuxprobe ~]# cat /etc/fstab
 ...
 /dev/storage/vo /linuxprobe ext4 defaults 0 0

2、扩容逻辑卷

前面实验中,卷组是由两块硬盘设备共同组成的,用户在使用存储设备时感知不到设备底层的架构和布局,只要卷中有足够的资源,就可以一直为逻辑卷扩容。扩展前请一定要记得卸载设备和挂载点的关联

[root@linuxprobe ~]# umount /linuxprobe

第1步:把上一个实验中的逻辑卷vo扩展至290M

[root@linuxprobe ~]# lvextend -L 290M /dev/storage/vo
Rounding size to boundary between physical extents: 290.00 MiB
...

第2步:检查硬盘的完整性,确认目录结构、内容和文件内容没有丢失,没有报错均为正常

[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
e2fsck 1.44.3 (10-July-2018)
...
/dev/storage/vo: 11/38000 files (0.0% non-contiguous),

第3步:重置设备在系统中的容量,刚刚是对LV逻辑卷设备进行了扩容操作,但系统内核还没有同步到这部分新修改的信息,手动同步:

[root@linuxprobe ~]# resize2fs /dev/storage/vo

第4步:重新挂载硬盘设备并查看挂载状态

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
...
/dev/mapper/storage-vo  279M 2.1M 259M 1% /linuxprobe

3、缩小逻辑卷

相比较与扩容,缩容风险更大,所以在执行前一定要提前备份好数据。另外Linux系统规定,在对LVM逻辑卷进行缩容操作前,要先检查文件系统的完整性。在执行缩容操作前记得把文件系统卸载掉:

[root@linuxprobe ~]# umount /linuxprobe

第1步:检查文件系统的完整性

 [root@linuxprobe ~]# e2fsck -f /dev/storage/vo

第2步:通知系统内核将逻辑卷vo的容量减小到120M

 [root@linuxprobe ~]# resize2fs /dev/storage/vo 120M

第3步:将LV逻辑卷的容量修改为120M

 [root@linuxprobe ~]# lvreduce -L 120M /dev/storage/vo

发现,步骤与扩容相反

第4步:重新挂载文件系统并查看系统状态

 [root@linuxprobe ~]# mount -1
 [root@linuxprobe ~]# df -h
 ...
 /dev/mapper/storage-vo 113M 1.6M 103M   2% /Linuxprobe

4、逻辑卷快照

LVM还具有"快照卷"功能,该功能类似于虚拟机软件的还原时间点功能。特点:

  • 快照卷的容量必须等同于逻辑卷的容量
  • 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除

在操作前,先看看VG卷组中的容量是否够用:

 [root@linuxprobe ~]# vgdisplay
 ...
 Free PE / Size      10208 / <39.88 GiB

通过卷组的输出信息可以看到,卷组中已经使用了120MB的容量,空闲容量还有39.88GB。接下来用重定向逻辑卷设备所挂载的目录中写入一个文件:

 [root@linuxprobe ~]# echo "Welcome to Linuxprobe.com" > /linuxprobe/readme.txt
 [root@linuxprobe ~]# ls -l /linuxprobe

第1步:使用-s参数生成一个快照卷,使用-L参数指定切割的大小,需要与要做快照的设备容量保持一致。另外还需要在命令后面写上是针对哪个逻辑卷执行的快照操作,稍后数据也会还原到这个对应的设备上:

[root@linuxprobe ~]# lvcreate -L 120M -s -n SNAP /dev/storage/vo
Logical volume "SNAP" created
[root@linuxprobe ~]# lvdisplay
...
LV Path						/dev/storage/SNAP
LV snapshot status          active destination for vo
LV Size						120.00 MiB

第2步:在逻辑卷所挂载的目录中创建一个100MB的垃圾文件,然后再查看快照卷的状态。发现存储空间占的用量上升了

[root@linuxprobe ~]# dd if =/dev/zero of=/linuxprobe/files  count=1 bs=100M
1+0 records in
...
[root@linuxprobe ~]# lvdisplay
...
Allocated to snapshot				83.71%

第3步:为了检验SNAP快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载

lvconvert命令用于管理逻辑卷的快照,语法:“lvconvert [参数] 快照卷名称”

使用lvconvert能够将逻辑卷的快照进行自动恢复,使用 “--merge”参数进行操作,系统会自动分辨设备的类型:

 [root@linuxprobe ~]# umount /linuxprobe
 [root@linuxprobe ~]# lvconvert --merge /dev/storgae/SNAP

第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备呗执行快照操作后再创建出来的100MB的垃圾文件也被清除了

 [root@linuxprobe ~]# mount -a
 [root@linuxprobe ~]# cd /linuxprobe
 [root@linuxprobe linuxprobe]# ls
 lost+found readme.txt
 [root@linuxprobe linuxprobe]# cat readme.txt
 Welcome to Linuxprobe.com

5、删除逻辑卷

当生产环境中想要重新部署LVM或者不再需要使用时,则需要执行LVM的删除操作;为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒!!

第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数:

 [root@linuxprobe ~]# umount /linuxprobe
 [root@linuxprobe ~]# vim /etc/fstab
 ...
 /dev/storage/vo             /linuxprobe     ext4    defaults    0 0(删除掉这行)

第2步:删除逻辑卷设备,需要输入y来确认操作:

 [root@linuxprobe ~]# lvremove /dev/storage/vo
 Do you really want to remove active logical volume storage/vo? [y/n]: y
 Logical volume "vo" successfully removed

第3步:删除卷组,此处只写卷组名即可,不需要设备的绝对路径。

 [root@linuxprobe ~]# vgremove storgae
 Volume group "storage" successfully removed

第4步:删除物理卷设备:

 [root@linuxprobe ~]# pvremove /dev/sdb /dev/sdc
 Labels on Physical volume "/dev/sdb" successfully wiped.
 Labels on Physical volume "/dev/sdc" successfully wiped.

上述操作执行完毕后,再执行display、vgdisplay、pvdisplay命令来查看LVM的信息时就不会再看到信息了。

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux中可执行文件在运行过程中为什么不能拷贝覆盖

对于一个普通的文件&#xff0c;假如有两个文件&#xff0c;分别是file和file1&#xff0c;我们使用 cp file1 file的方式使用file1的内容来覆盖file的内容&#xff0c;这样是可以的。 但是对于可执行文件来说&#xff0c;当这个文件在执行的时候&#xff0c;是不能通过cp的方…

Python 算法交易实验76 QTV200日常推进

说明 最近实在太忙&#xff0c; 没太有空推进这个项目&#xff0c;我想还是尽量抽一点点时间推进具体的工程&#xff0c;然后更多的还是用碎片化的时间从整体上对qtv200进行设计完善。有些结构的问题其实是需要理清的&#xff0c;例如&#xff1a; 1 要先基于原始数据进行描述…

【ROS2】初级:客户端-编写一个简单的服务和客户端(Python)

目标&#xff1a;使用 Python 创建并运行服务节点和客户端节点。 教程级别&#xff1a;初学者 时间&#xff1a;20 分钟 目录 背景 先决条件 任务 1. 创建一个包2. 编写服务节点3. 编写客户端节点4. 构建并运行 摘要 下一步 相关内容 背景 当节点通过服务进行通信时&#xff0c…

【机器学习】机器学习重塑广告营销:精准触达,高效转化的未来之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 机器学习基础与广告营销的结合&#x1f9e9;机器学习在广告营销中的核心应用领域&#x1f339;用…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接&#xff1a; https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中&#xff0c;多智能体合作问题因原始感官观察、高昂…

穿梭印度风情记:维乐 Angel Revo Halo坐垫,让每一寸旅程闪耀光辉!

想象骑乘在印度的万花筒世界中&#xff0c;斑斓色彩与悠久历史交织&#xff0c;每一转轮都是对神秘东方的深刻探索。在这样的骑行之旅中&#xff0c;维乐Angel Revo Halo坐垫不仅是你的坐骑上的宝石&#xff0c;更是舒适与探险的完美媒介。    探索印度的色彩与灵魂&#x…

每日一题~oj(贪心)

对于位置 i来说&#xff0c;如果 不选她&#xff0c;那她的贡献是 vali-1 *2&#xff0c;如果选他 &#xff0c;那么她的贡献是 ai. 每一个数的贡献 是基于前一个数的贡献 来计算的。只要保证这个数的前一个数的贡献是最优的&#xff0c;那么以此类推下去&#xff0c;整体的val…

【项目设计】负载均衡式——Online Judge

负载均衡式——Online Judge&#x1f60e; 前言&#x1f64c;Online Judge 项目一、项目介绍二、项目技术栈三、项目使用环境四、项目宏观框架五、项目后端服务实现过程1、comm模块设计1.1 Log.hpp实现1.2 Util.hpp实现 2、compiler_server 模块设计2.1compile.hpp文件代码编写…

【QT】容器类控件

目录 概述 Group Box 核心属性 Tab Widget 核心属性 核心信号 核心方法 使用示例&#xff1a; 布局管理器 垂直布局 核心属性 使用示例&#xff1a; 水平布局 核⼼属性 (和 QVBoxLayout 属性是⼀致的) 网格布局 核心属性 使用示例&#xff1a; 示例&#x…

【C++ OpenCV】机器视觉-二值图像和灰度图像的膨胀、腐蚀、开运算、闭运算

原图 结果图 //包含头文件 #include <opencv2/opencv.hpp>//命名空间 using namespace cv; using namespace std;//全局函数声明部分//我的腐蚀运算 Mat Erode(Mat src, Mat Mask, uint32_t x0, uint32_t y0) {uint32_t x 0, y 0;Mat dst(src.rows, src.cols, CV_8U…

设计模式之状态机模式

一、状态机模式介绍 状态机模式&#xff08;State Machine Pattern&#xff09;是一种用于描述对象行为的软件设计模式&#xff0c;属于行为型设计模式。在状态机模式中&#xff0c;对象的行为取决于其内部状态&#xff0c;并且在不同的状态下&#xff0c;对象可能会有不同的行…

RAG 案框架(Qanything、RAGFlow、FastGPT、智谱RAG)对比

各家的技术方案 有道的QAnything 亮点在&#xff1a;rerank RAGFLow 亮点在&#xff1a;数据处理index 智谱AI 亮点在文档解析、切片、query改写及recall模型的微调 FastGPT 优点&#xff1a;灵活性更高 下面分别按照模块比较各框架的却别 功能模块QAnythingRAGFLowFastG…

【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式

不同类型的链表 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 不同类型…

Day05-04-持续集成总结

Day05-04-持续集成总结 1. 持续集成2. 代码上线目标项目 1. 持续集成 git 基本使用, 拉取代码,上传代码,分支操作,tag标签 gitlab 用户 用户组 项目 , 备份,https,优化. jenkins 工具平台,运维核心, 自由风格工程,maven风格项目,流水线项目, 流水线(pipeline) mavenpom.xmlta…

Android 10年,35岁,该往哪个方向发力

网上看到个网友发的帖子&#xff0c;觉的这个可能是很多开发人员都会面临和需要思考的问题。 不管怎样&#xff0c; 要对生活保持乐观&#xff0c;生活还是有很多的选择和出路的。 &#xff08;内容来自网络&#xff0c;不代表个人观点&#xff09; 《Android Camera开发入门》…

关闭vue3中脑瘫的ESLine

在创建vue3的时候脑子一抽选了ESLine,然后这傻卵子ESLine老是给我报错 博主用的idea开发前端 ,纯粹是用不惯vscode 关闭idea中的ESLine,这个只是取消红色波浪线, 界面中的显示 第二步,在vue.config.js中添加 lintOnSave: false 到这里就ok了,其他的我试过了一点用没有

专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

顺利上岸天津大学&#xff0c;专业课815信号与系统140&#xff0c;总分420&#xff0c;总结一些自己的复习经历&#xff0c;希望对于报考天大的同学有些许帮助&#xff0c;少走弯路&#xff0c;顺利上岸。专业课&#xff1a; 815信号与系统&#xff1a;指定教材吴大正&#xf…

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入 上一篇创建好数据表之后&#xff0c;接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇&#xff08;飞书 API 2-4&#xff09;创建的数据表进行操作。上面最终的数据表只有 2 个字段&#xff1a;序号和邮箱。序…

(完整音频)DockerHub、OpenAI、GitCode,脱钩时代,我们该如何自处?

本期主播 朱峰&#xff1a;「津津乐道播客网络」创始人&#xff0c;产品及技术专家。&#xff08;微博&#xff1a;zhufengme&#xff09;高春辉&#xff1a;「科技乱炖」主播。“中国互联网站长第一人”&#xff0c;科技、互联网领域的连续创业者。&#xff08;微博&#xff1…

SCI一区TOP|准随机分形搜索算法(QRFS)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;LA Beltran受到分形几何、低差异序列启发&#xff0c;提出了准随机分形搜索算法&#xff08;Quasi-random Fractal Search, QRFS&#xff09;。 2.算法原理 2.1算法思…