存储结构与管理磁盘

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

目录

一、一切从“/”开始

二、物理设备的命名规则

三、文件系统与数据资料

四、挂载硬件设备

五、添加硬盘设备

六、添加交换分区

七、磁盘容量配额

八、VDO虚拟数据优化

九、软硬方式链接

致谢


一、一切从“/”开始

在Linux系统中,目录、字符设备、套接字、硬盘、光驱、打印机等都会被抽象成文件形式,即“Linux系统中一切都是文件”。Linux系统中一切的文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS:Filesystem Hierarchy Standard)采用倒树状结构来存放文件,以及定义了常见目录的用途。

目录名称应放置文件的内容
/boot开机所需文件—内核、开机菜单记忆所需配置文件
/dev以文件形式存放任何设备与接口
/etc配置文件
/home用户主目录
/bin存放单用户 模式下还可以操作的命令
/lib开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数
/sbin开机过程中需要的命令
/media用于挂载设备文件的目录
/opt放置第三方的软件
/root系统管理员的家目录
/srv一些网络服务的数据文件目录
/tmp任何人均可使用的“共享”临时目录
/proc虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local用户自行安装的软件
/usr/sbinLinux系统开机时不会使用到的软件/命令/脚本
/usr/share帮助与说明文件,也可放置共享文件
/var主要存放经常变化的文件,如日志
/lost+found当文件系统发生错误时,将一些丢失的文件片段放在这里

Linux系统中还有一个重要的概念—路径:绝对路径、相对路径

二、物理设备的命名规则

系统内核中的udev设备管理器会自动把硬件名称规范起来;udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出来的信号来管理/dev目录下的设备文;常见硬件设备及文件名称:

硬件设备文件名称
IDE设备/dev/hd[a-d]
SCSI/SATA/U盘/dev/sd[a-z]
virtio设备/dev/vd[a-z]
软驱/dev/fd[0-1]
打印机/dev/lp[0-15]
光驱/dev/cdrom
鼠标/dev/mouse
磁带机/dev/st0或/dev/ht0

由于现在的IDE设备已经很少见了,所以一般的硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用a~z来代表24块不同的硬盘(默认从a开始分配),而且硬盘的分区编号也有讲究:

  • 主分区或扩展分区的编号从1开始,到4结束
  • 逻辑分区从编号5开始

硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节分区表为64字节结束符占用2字符;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。

为了解决分区不够的问题,可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。这样,用户一般会选择使用3个分区加1个扩展分区,然后在扩展分区中创建数个逻辑分区,从而满足多分区(大于4个)的需求。规划:

三、文件系统与数据资料

用户硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求

Linux系统最常见的文件系统如下:

  • Ext2:最早追溯到1993年,是Linux系统第一个商业级文件系统,基本沿袭的是Unix文件系统的设计标准。但由于不包含读写日志功能,数据丢失可能性很大,能不用就不用,顶多建议用于SD存储卡或U盘
  • Ext3:一款日志文件系统,把整个硬盘的每个写入动作的细节都预先记录下来,然后再实际操作,以便在发生异常宕机后能够回溯追踪到被中断的部分。Ext3能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。
  • Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的目录。能够批量分配block块,极大提高读写效率。
  • XFS一种高性能的日志文件系统,而且是RHEL 7/8中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB。

RHEL 7/8系统中一个比较大的变化是使用了XFS作为文件系统,这不同于RHEL 6使用的Ext4.

拿到了一块新的硬盘存储设备后,先需要分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但必须对硬盘进行格式化处理。

(就像拿到了一张未裁剪的完整纸张,首先要进行裁剪以方便使用(分区),接下来在裁切后的纸张上画格以便能书写工整(格式化),最后是正式的使用(挂载))

为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。

四、挂载硬件设备

1、mount命令

mount命令用于挂载文件系统,语法:“mount 文件系统 挂载目录”。挂载是在使用硬件设备前所执行的最后一步操作。只需使用mount命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。-a参数会在执行后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。mount参数如下:

参数作用
-a挂载所有在/etc/fstab中定义的文件系统
-t指定文件系统的类型

示例:要把设备/dev/sdb2挂载到/backup目录,只需要在mount命令中填写设备与挂载目录参数,系统会自动判断要挂载文件的类型:

 [root@linuxprobe ~]# mount /dev/sdb2 /backup

2、blkid命令

blkid命令用于显示设备的属性信息,语法:“blkid [设备名]

如果在工作中要挂载的是一块网络存储设备,名字可能会变来变去,这时推荐使用UUID(通用唯一标识码)进行挂载操作,这是一串用于标识每块独立硬盘的字符串,具有唯一性及稳定性,特别适合挂载网络设备时使用

 [root@linuxprobe ~]# blkid/dev/sda1: UUID="388c3bda-5f06-4efe-9f02-0b5dd5ade2c3" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="1d2352b2-01"/dev/sda2: UUID="GFbkIx-6yrE-v4eM-QP8z-DC8s-1DLd-3cnGRC" TYPE="LVM2_member" PARTUUID="1d2352b2-02"​[root@linuxprobe ~]# mount UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /backup

按照上面操作执行后就能立即使用文件系统了,但系统在重启后挂载就会失效,也就是需要每次开机后都手动挂载一下。如果想要让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”写入到/etc/fstab文件中。这个文件中包含着挂载所需的诸多信息项目,一旦配置好后就能一劳永逸了。填写格式各字段表示意义:

字段意义
设备文件一般为设备的路径+设备名称,也可以写唯一标识码(UUID)
挂载目录指定要挂载到的目录,需在挂载前创建好
格式类型指定文件系统的格式,比如Ext3、Ext4、、XFS、SWAP、iso9660(此为光盘设备)
权限选项若设置为defaults,则默认权限为:rw、suid、dev、exec、auto、nouser、async
是否备份若是1则开机后使用dump进行磁盘备份,为0则不备份
是否自检若是1则开机后自动进行磁盘自检,为0则不自检

示例:将文件系统为ext4的硬件设备/dev/sdb2在开机后自动挂载到/backup目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab文件中写入下面的信息,这样重启后会自动挂载:

 [root@linuxprobe ~]# vim /etc/fstab# # /etc/fstab# Created by anaconda on Wed Mar 13 14:29:02 2024## Accessible filesystems, by reference, are maintained under '/dev/disk/'.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.## After editing this file, run 'systemctl daemon-reload' to update systemd# units generated from this file.#/dev/mapper/rhel-root   /                       xfs     defaults        0 0UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /boot                   xfs     defaults        0 0#/dev/mapper/rhel-swap   none                    swap    defaults        0 0/dev/sdb2                               /backup ext4 defaults 0 0

由于后面需要使用系统镜像制作Yum/DNF软件仓库,所以提前把光盘设备挂载到/media/cdrom目录中。光盘设备的文件系统格式是iso9660:

 [root@linuxprobe ~]# vim /etc/fstab# # /etc/fstab# Created by anaconda on Wed Mar 13 14:29:02 2024## Accessible filesystems, by reference, are maintained under '/dev/disk/'.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.## After editing this file, run 'systemctl daemon-reload' to update systemd# units generated from this file.#/dev/mapper/rhel-root   /                       xfs     defaults        0 0UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /boot                   xfs     defaults        0 0#/dev/mapper/rhel-swap   none                    swap    defaults        0 0/dev/sdb2                               /backup ext4 defaults 0 0/dev/cdrom                              /media/cdrom    iso9660 defualts 0 0

写入到/etc/fstab文件中的设备信息不会立即生效,使用mount -a参数进行自动挂载:

 [root@linuxprobe ~]# mount -a

3、df命令

df命令用于查看已挂载的磁盘空间使用情况,语法:“df -h

df命令不仅能列出系统中正在被使用的设备有哪些,还可以使用-h参数便捷的对存储容量进行“进位”操作,例如遇到10240k的时候会自动进位写成10M,便于阅读:

 [root@linuxprobe ~]# df -hFilesystem             Size  Used Avail Use% Mounted ondevtmpfs               4.7G     0  4.7G   0% /devtmpfs                  4.7G     0  4.7G   0% /dev/shmtmpfs                  4.7G  9.6M  4.7G   1% /runtmpfs                  4.7G     0  4.7G   0% /sys/fs/cgroup/dev/mapper/rhel-root   35G  7.2G   28G  21% //dev/sdb                10G  104M  9.9G   2% /app/dev/loop0              13G   13G     0 100% /mnt/dev/sda1             1014M  273M  742M  27% /boottmpfs                  952M   12K  952M   1% /run/user/42tmpfs                  952M  4.0K  952M   1% /run/user/0

对于网络存储设备,建议加上_netdev参数。系统会等待联网成功后再尝试挂载这块网络存储设备,避免了开机时间过长或失败的情况

 [root@linuxprobe ~]# vim /etc/fstab.../dev/mapper/rhel-root   /                       xfs     defaults        0 0UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /boot                   xfs     defaults        0 0#/dev/mapper/rhel-swap   none                    swap    defaults        0 0/dev/sdb2                               /backup ext4 defaults,_netdev  0 0/dev/cdrom                              /media/cdrom    iso9660 defualts 0 0

挂载文件系统的目的是为了使用硬件资源,而卸载文件系统就意味着不再使用硬件的设备资源;相对应的,挂载操作就是把硬件设备与目录两者进行关联的动作,因此卸载操作只需要说明想要取消关联的设备文件或挂载目录的其中一项即可

4、umount命令

umount命令用于卸载设备或文件系统,语法:“umount [设备文件/挂载目录]

 [root@linuxprobe ~]# umount /dev/sdb2

如果处在设备所挂载的目录时,系统会提示该设备繁忙,这种情况只需要退出到其他目录再尝试一次就可以了

[root@linuxprobe ~]# cd /media/cdrom
[root@linuxprobe cdrom]# umount /dev/cdrom
umount: /media/cdrom: target is busy.
[root@linuxprobe cdrom]# cd ~
[root@linuxprobe ~]# umount /dev/cdrom
[root@linuxprobe ~]# 

5、lsblk命令

lsblk命令用于挂载的磁盘空间使用情况

[root@linuxprobe ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0           7:0    0 12.6G  1 loop /mnt
sda             8:0    0   40G  0 disk 
├─sda1          8:1    0    1G  0 part /boot
└─sda2          8:2    0   39G  0 part ├─rhel-root 253:0    0   35G  0 lvm  /└─rhel-swap 253:1    0    4G  0 lvm  
sdb             8:16   0   10G  0 disk /app
sr0            11:0    1 12.6G  0 rom  

五、添加硬盘设备

思路:在虚拟机中模拟添加一块新的硬盘存储设备、然后进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加

  • 第1步:虚拟机系统关机,单击“编辑虚拟机设置”选项,在弹出的界面中单击“添加”按钮,新增一块硬件设备
  • 第2步:选择类型为“硬盘”,然后单击“下一步“
  • 第3步:选择虚拟硬盘类型为SATA,并单击“下一步”按钮,这样虚拟机中的设备名称过一会后应该为/dev/sdb
  • 第4步:选中“创建新虚拟磁盘”单选按钮,而不是其他选项,单击“下一步”
  • 第5步:将“最大磁盘大小”设置为默认的20GB,这个数值是限制这台虚拟机所使用的最大硬盘空间,而不是立即将其填满,因此默认20GB就很合适了。单击“下一步”
  • 第6步:设置磁盘文件的文件名和保存位置(这里采用默认设置即可,无需修改),直接单击“完成”按钮
  • 第7步:将新硬盘添加好后就可以看到设备信息了

按照前文讲解的udev服务命名规则,第二个被识别的SATA设备应该会被保存为/dev/sdb,这个就是硬盘设备文件了,但在开始使用之前还需要进行分区操作,例如从中取出一个2GB的分区设备以供后面的操作使用

1、fdisk命令-(分区)

fdisk命令用于新建、修改及删除磁盘的分区表信息,语法:“fdisk 磁盘名称

在Linux系统中,管理硬盘设备最常用的方法就属fdisk命令;它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”;这些参数是交互式的;其参数有:

参数作用
m查看全部可用的参数
n添加新的分区
d删除某个分区信息
l列出所有可用的分区类型
t改变某个分区的类型
p查看分区表信息
w保存并退出
q不保存直接退出

第1步:使用fdisk命令来尝试管理/dev/sdb硬盘设备,在看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:

[root@linuxprobe ~]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x3b69fc1b.Command (m for help): p		# 查看硬盘设备内的已有分区信息
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3b69fc1b

第2步:输入参数n尝试添加新的分区。系统会要求您是选择继续输入参数p来创建主分区、还是输入参数e来创建扩展分区。这里输入p来创建主分区:

Command (m for help): n			# 参数n尝试添加新分区
Partition typep   primary (0 primary, 0 extended, 4 free)e   extended (container for logical partitions)
Select (default p): p		# 参数p创建主分区、e创建扩展分区

第3步:确认后,系统要求您先输入主分区的编号。在前文得知,主分区的编号范围是1~4,因此这里输入默认的1就可以。接下来系统会提示定义起始的扇区位置,这里不需要改动,敲击回车即可,系统会自动计算出最靠前的空闲扇区位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入+2G即可创建一个容量为2GB的硬盘分区。

Partition number (1-4, default 1): 1	# 输入主分区的编号
First sector (2048-20971519, default 2048): 	# 不改动,系统自定义
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519): +2GCreated a new partition 1 of type 'Linux' and of size 2 GiB.

第4步:再次使用参数p查看硬盘设备中的分区信息。果然能看到一个名称为/dev/sdb1、起始扇区位置为2048、结束扇区位置为4196351的主分区了。敲击参数w回车,这样分区信息才是真正的写入成功!

Command (m for help): p		# 查看硬盘设备中的分区信息
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3b69fc1bDevice     Boot Start     End Sectors Size Id Type
/dev/sdb1        2048 4196351 4194304   2G 83 LinuxCommand (m for help): w		# 保存退出
The partition table has been altered.
Syncing disks.

分区信息中第六个字段的Id值代表标识该分区作用的编码,帮助用户快速了解该分区的作用,一般没必要修改。使用l参数查看都有哪些的磁盘编码,之后做SWAP再修改:

Command (m for help): l0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignmente  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor      
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary  
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE 
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT  

第5步:执行完毕后,Linux系统会自动把这个硬盘主分区抽象成/dev/sbd1设备文件。可使用file命令查看该文件的属性,有时候系统并没有自动同步,这时可以输入partprobe命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,如果不行,就重启;

[root@linuxprobe ~]# file /dev/sdb1
/dev/sdb1: cannot open `/dev/sbd1' (No such file or directory)
[root@linuxprobe ~]# partprobe 
[root@linuxprobe ~]# partprobe 
[root@linuxprobe ~]# file /dev/sdb1
/dev/sdb1: block special (8/17)

2、mkfs命令-(格式化)

如果硬件存储设备没有进行格式化,则Linux系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux系统中用于格式化操作的命令是mkfs。在终端输入mkfs后再敲击两下Tab键,会有如下:

[root@linuxprobe ~]# mkfs
mkfs         mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.fat     mkfs.minix   mkfs.msdos   mkfs.vfat    mkfs.xfs 

命令把常用的文件系统名称用后缀的方式保存成了多个命令文件,语法:“mkfs.文件类型名称

示例:格式分区为XFS的文件系统:

[root@linuxprobe ~]# mkfs.xfs /dev/sdb1

3、(挂载)

接下来就是挂载并使用存储设备了。首先创建一个用于挂载设备的挂载点目录;然后使用mount命令将存储设备与挂载点进行关联;最后使用df -h命令来查看挂载状态和硬盘使用量信息

[root@linuxprobe ~]# mkdir newFS
[root@linuxprobe ~]# mount /dev/sdb1 /newFS
[root@linuxprobe ~]# df -h
df: /run/user/0/gvfs: Transport endpoint is not connected
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               4.7G     0  4.7G   0% /dev
tmpfs                  4.7G     0  4.7G   0% /dev/shm
tmpfs                  4.7G  9.6M  4.7G   1% /run
tmpfs                  4.7G     0  4.7G   0% /sys/fs/cgroup
/dev/mapper/rhel-root   35G  7.2G   28G  21% /
/dev/sdb                10G  104M  9.9G   2% /app
/dev/loop0              13G   13G     0 100% /mnt
/dev/sda1             1014M  273M  742M  27% /boot
tmpfs                  952M   12K  952M   1% /run/user/42
tmpfs                  952M  4.0K  952M   1% /run/user/0
/dev/sdb1              2.0G   47M  2.0G   3% /newFS

4、du命令

du命令用于查看分区或目录所占用的磁盘容量大小,语法:“du -sh 目录名称

[root@linuxprobe ~]# du -sh /*
0	/aa
0	/app
0	/bin
233M	/boot
0	/dev
34M	/etc
136K	/git_app
13M	/home
0	/lib
0	/lib64
0	/media
13G	/mnt
...

先从某些目录复制过来一批文件,然后查看这些文件共占用了多大的容量:

[root@linuxprobe ~]# cp -rf /etc/* /newFS
[root@linuxprobe ~]# ls /newFS
asjtime 				hostname				profile.d
aliases					hosts					protocols
...
[root@linuxprobe ~]# du -sh /newFS
39M	/newFS/

要想使这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件:

[root@linuxprobe ~]# vim /etc/fstab
...
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /boot xfs     defaults        0 0
/dev/mapper/rhel-swap   none                    swap    defaults        0 0
/dev/cdrom								/media/cdrom	iso9660	defualts 0 0
/dev/sdb1                               /newFS  xfs     defaults 		0 0

六、添加交换分区

SWAP交换分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让活跃的程序服务来使用的技术。

就是让硬盘帮内存分担压力。但由于交换分区是通过硬盘设备读写数据的,速度肯定比物理内存慢,因此只有当真实内存耗尽后才会调用交换分区的资源;

交换分区的创建过程与前面讲到的挂载并使用存储设备的过程相似。在对/dev/sdb存储设备进行分区操作前,下面是建议:在生成环境,交换分区的大小一般为真实物理内存的1.5~2倍。

# 这里取出5G的主分区作为交换分区资源
[root@linuxprobe ~]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.Command (m for help): n		# 
Partition typep   primary (1 primary, 0 extended, 3 free)e   extended (container for logical partitions)
Select (default p): p		# 
Partition number (2-4, default 2): 
First sector (4196352-20971519, default 4196352): 
Last sector, +sectors or +size{K,M,G,T,P} (4196352-20971519, default 20971519): +5GCreated a new partition 2 of type 'Linux' and of size 5 GiB.# 我们就得到了一个容量为5G的新分区,下面修改硬盘的标识码:改成82(Linux swap)方便以后知道它的作用
Command (m for help): t		# 
Partition number (1,2, default 2): 2		#
Hex code (type L to list all codes): 82		# Changed type of partition 'Linux' to 'Linux swap / Solaris'.Command (m for help): p		# 
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3b69fc1bDevice     Boot   Start      End  Sectors Size Id Type
/dev/sdb1          2048  4196351  4194304   2G 83 Linux
/dev/sdb2       4196352 14682111 10485760   5G 82 Linux swap / SolarisCommand (m for help): w		# w参数退出分区表编辑工具
The partition table has been altered.
Syncing disks.

1、mkswap命令

mkswap命令用于对新设备做出交换分区格式化,语法:“mkswap 设备名称”

[root@linuxprobe ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=45a44047...

2、swapon命令

swapon命令用于激活新的交换分区设备,语法:“swapon 设备名称

示例:使用swapon命令把准备好的SWAP硬盘设备正式挂载到系统中,可以使用free -m命令查看交换分区的大小变化:

[root@linuxprobe ~]# free -mtotal        used        free      shared  buff/cache   available
Mem:           9519         730        7704          10        1084        8472
Swap:          2047           9        2038
[root@linuxprobe ~]# swapon /dev/sdb2
[root@linuxprobe ~]# free -mtotal        used        free      shared  buff/cache   available
Mem:           9519         730        7704          10        1084        8472
Swap:          7167           9        7158

为了能够让新的交换分区设备在重启后依然生效,将其写入配置文件中:

[root@linuxprobe ~]# vim /etc/fstab
...
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /boot xfs     defaults        0 0
/dev/mapper/rhel-swap   none                    swap    defaults        0 0
/dev/cdrom								/media/cdrom	iso9660	defualts 0 0
/dev/sdb1                               /newFS  xfs     defaults 		0 0
/dev/sdb2								swap	swap	defaults		0 0

七、磁盘容量配额

1、quota技术

root管理员需要使用磁盘容量限额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用quota技术进行磁盘容量配置限额管理,从而限制用户的硬盘可用容量或能创建的最大文件个数。quota技术还有软限制和硬限制的功能。

  • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用
  • 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作

RHEL 8系统中已经安装了quota磁盘容量配额服务程序包,但存储设备却默认没有开启对quota技术的支持,此时需要手动编辑配置文件再重启一次,让系统中的启动目录(/boot)能够支持quota磁盘配额技术

[root@linuxprobe ~]# vim /etc/fstab
...
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /boot xfs     defaults,uquota        1 2
/dev/mapper/rhel-swap   none                    swap    defaults        0 0
/dev/cdrom								/media/cdrom	iso9660	defualts 0 0
/dev/sdb1                               /newFS  xfs     defaults 		0 0
[root@linuxprobe ~]# reboot

早期的Linux系统使用的是usrquota参数,而RHEL 7/8系统使用是uquota参数。重启系统后使用mount命令查看,发现/boot目录已经支持quota磁盘配额技术了:

[root@linuxprobe ~]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)

接下来创建一个用于检查quota磁盘容量配额效果的用户tom,并针对/boot目录增加其他人的权限,保证用户能够正常写入数据:

[root@linuxprobe ~]# useradd tom
[root@linuxprobe ~]# chmod -R o+w /boot

2、xfs_quota命令

xfs_quota命令用于管理设备的磁盘容量配额,语法:“xfs_quota [参数] 配额 文件系统

这是专门针对XFS文件系统来管理quota磁盘容器配额服务而设计的命令,其中-c参数用于以参数的形式设置要执行的命令-x参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置。接下来使用xfs_quota命令来设置用户tom对/boot目录的quota磁盘容量配额。

# 硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
[root@linuxprobe ~]# xfs_quota -x -c report /bootBlocks
UserID		Used		Soft		Hard		Warn/Grace
----------------------------------------------------------
root		114964		0			0			00[-------]
tom				0		3072		6144		00[-------]

Linux系统中,每个文件都会被一个独立的inode信息块所保存属性信息,一个文件对应一个inode信息块,所有isoft和ihard就是通过限制了系统最大使用的inode个数来限制了文件格式bsoft和bhard则是代表文件所占block块大小,也就是文件最多所占用的总统计

切换普通用户,然后分别创建一个体积为5MB和8MB的文件,发现收到了限制:

[root@linuxprobe ~]# su - tom
[tom@linuxprobe ~]$ cd /boot
[tom@linuxprobe boot]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB, 5.0 MiB) copied, 0.00298178 s,1.8 GB/s
[tom@linuxprobe boot]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd:error writing '/boot/tom':Disk quota exceeded
1+0 records in
1+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.00298178 s,1.1 GB/s

3、edquota命令

edquota命令用于管理系统的磁盘配额,语法:”edquota [参数] 用户名

在为用户设置quota磁盘容量配额限制后,可以使用edquota命令按需修改限额的数值,其中-u参数表示要针对哪个用户进行设-g参数表示要针对哪个用户组进行设置

参数作用
-u对某个用户进行设置
-g对某个用户组进行设置
-p复制原有的规则到新的用户/组
-t限制宽限期限

edquota命令会调用Vi或Vim编辑器来让root管理员修改要限制的具体细节。

# 手动把用户tom的硬盘使用量的硬限额从5MB提升到8MB
[root@linuxprobe ~]# edquota -u tom
Disk quotas for user tom (uid 1001):Filesystem 		blcoks 		soft 		hard		inodes		soft		hard/dev/sda1			4096		3072		8192		1			3			6
[root@linuxprobe ~]# su - tom
[tom@linuxprobe ~]$ cd /boot
[tom@linuxprobe boot]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd:error writing '/boot/tom':Disk quota exceeded
1+0 records in
1+0 records out
8388608 bytes (8.2 MB, 4.0 MiB) copied, 0.00298178 s,452 GB/s

八、VDO虚拟数据优化

Virtual Data Optimize是一种通过压缩或删除存储设备上的数据来优化存储空间技术,简称VOD,中文叫虚拟数据优化。VDO技术的关键就是对硬盘内原有的数据进行删重操作。还可以对日志和数据库进行自动压,进一步减少存储浪费的情况,针对各种类型文件的压缩效果如下:

文件名描述类型原始大小(KB)实际占用空间(KB)
dickens狄更斯文集英文原文99539948
mozillaMozilla的1.0可执行文件执行程序5002033228
mr医用resonanse图像图片97369272
nci结构化的化学数据库数据库3276710168
oofficeOpen Oiffce.org 1.01 DLL可执行程序60085640
osdb基准测试用的MySQL格式示例数据库数据库98499824
reymont瓦迪斯瓦夫·雷蒙特的书PDF64716312
sambasamba源代码src源码2110011768
sao星空数据天文格式的bin文件70817036
webster辞海HTML4048740144
xmlXML文件HTML52202180
x-ray透视医学图片医院数据82758260

VDO可以作为本地文件系统、iSCSI或Ceph存储下的附加存储层,支持本地和远程存储。专家建议做虚拟机或容器时,采用逻辑与物理10:1的比率进行配置,即使用1TB的物理存储对应10TB的逻辑存储;而做对象存储时(例如Ceph)则采用3:1的比率进行配置

特殊情况:

  • 如果公司服务器上已有DM crypt之类的技术是可以与VDO兼容的,但记得先做加密卷再使用VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现,始终记得把加密层放到VDO之下

  • VDO技术不可叠加使用,1T物理存储提升成10T逻辑存储没问题,再用10T翻成100T就不行了

示例:把虚拟机关闭,添加一块容量为20G的新SATA硬盘,开机后就能看到这块名称为/dev/sdc的新硬盘了

[root@linuxprobe ~]# ls -l /dev/sdc
brw-rw---- 1 root disk 8, 32 Jul  6 10:27 /dev/sdc

RHEL/CentOS 8系统中默认已经启用VDO技术了;如果系统没有安装的话,使用yum/dnf命令即可完成:

[root@linuxprobe ~]# dnf install kmod-kvdo vdo
Updating Subscription Management repositories.
Last metadata expiration check: -88 days, 17:01:19 ago on Tue 01 Oct 2024 05:32:39 PM CST.
Package kmod-kvdo-6.2.8.7-94.el8.x86_64 is already installed.
Package vdo-6.2.9.7-14.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

第1步:创建一个全新的VDO卷

管理设备用的就是vdo命令本身,name参数代表新的设备卷的名称;device参数代表由哪块磁盘进行操作;vdoLogicalSize参数代表制作后的逻辑卷大小,遵循红帽推荐原则,20G硬盘翻成200G逻辑卷:

[root@linuxprobe ~]# vdo create --name=storage --device=/dev/sdc --vdoLogicalSize=200G
Creating VDO storage
Starting VDO storage
Starting VDO storage
VDO instance - volume is ready at /dev/mapper/storage

第2步:使用status参数查看新建卷的概述信息:

[root@linuxprobe ~]# vdo status --name=storage
VDO status:...
# 输出信息中包含了VDO卷的创建时间、主机名、版本、是否删重(Deduplication)及是否压缩(Compression)等关键指标

第3步:对新建卷做格式化操作并挂载使用

新建的VDO卷设备会存放在/dev/mapper目录下,以设备名称命名的文件,另外挂载前可以用udevadm settle命令来对设备进行一次刷新操作,避免刚刚的配置没有生效:

[root@linuxprobe ~]# mkfs.xfs /dev/mapper/storage
meta-data=/dev/mapper/storage  isize=512
...
[root@linuxprobe ~]# udevadm settle
[root@linuxprobe ~]# mkdir /storage
[root@linuxprobe ~]# mount /dev/mapper/storage /storage

如果想看设备的实际使用情况,用vdostats命令即可,human-readable参数作用是存储容量自动进位,以更易读的单位输出

[root@linuxprobe ~]# vdostats --human-readable
Device				Size			Used	Available	Use%	Space	saving%
/dev/mapper/storage	20.0G			4.0G	16.0G		20%				99%

这里显示的Size是实际物理存储空间大小,20.0G是硬盘的大小,如果想看逻辑存储空间可以用df命令进行查看:

[root@linuxprobe ~]# df -h
...
/dev/mapper/storage		200G	2.4G	198G	%2	/storage

第4步:随便复制来一个大文件,看看占用了多少容量,以及空间节省率Space saving是多少?

[root@linuxprobe ~]# cp /media/cdrom/images/install.img /storage/rhel.img
[root@linuxprobe ~]# vdostats --human-readable
Device				Size			Used	Available	Use%	Space	saving%
/dev/mapper/storage	20.0G			4.5G	15.5G		22%				55%

第5步:将设备设置成永久挂载生效,一直提供服务

[root@linuxprobe ~]# blkid /dev/mapper/storage
/dev/mapper/storage: UUID="cd4ef12..." TYPE="xfs"[root@linuxprobe ~]# vim /etc/fstab
...
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=388c3bda-5f06-4efe-9f02-0b5dd5ade2c3 /boot xfs     defaults        0 0
/dev/mapper/rhel-swap   none                    swap    defaults        0 0
/dev/cdrom								/media/cdrom	iso9660	defualts 0 0
/dev/sdb1                               /newFS  xfs     defaults 		0 0
/dev/sdb2								swap	swap	defaults		0 0
UUID=cd4ef12...							/storage	xfs	defaults,_netdev 0 0	

九、软硬方式链接

在Linux系统中存在软链接硬链接

软链接:也叫符号链接,仅仅包含所链接文件的名称和路径,像个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问,可以对文件、目录做软链接,跨文件系统也不是问题。

硬链接:“指向原始文件block的指针”,系统会创建出一个与原来一模一样的inode信息块。每添加一个硬链接,该文件的inode个数就会加1;而且只有当该文件的inode个数为0时,才算彻底将它删除。因此即便原始文件被删除,依然可以通过硬链接来访问它。不能跨分区对目录文件进行硬链接

1、ln命令

ln命令用于创建文件的软硬链接,语法:“ln [参数] 原始文件名 链接文件名

其参数如下;在使用ln命令时,是否添加-s参数,将创建出性质不同的两种“快捷方式

参数作用
-s创建“符号链接”(如果不带-s参数,则默认创建硬链接
-f强制创建文件或目录的链接
-i覆盖前先询问
-v显示创建链接的过程

示例:创建一个文件,做个软链接:

[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > old.txt
[root@linuxprobe ~]# ln -s old.txt new.txt
[root@linuxprobe ~]# cat old.txt 
Welcome to linuxprobe.com
[root@linuxprobe ~]# cat new.txt 
Welcome to linuxprobe.com
[root@linuxprobe ~]# ls -l old.txt 
-rw-r--r-- 1 root root 26 Jul  6 14:01 old.txt

原始文件叫old,新的软链接文件叫new。删掉原始文件后,软链接立刻无法读取了:

[root@linuxprobe ~]# rm -f old.txt 
[root@linuxprobe ~]# cat new.txt 
cat: new.txt: No such file or directory

接下来创建硬链接:

[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > old.txt
[root@linuxprobe ~]# ln old.txt new.txt
[root@linuxprobe ~]# cat old.txt 
Welcome to linuxprobe.com
[root@linuxprobe ~]# cat new.txt 
Welcome to linuxprobe.com
[root@linuxprobe ~]# ls -l old.txt 
-rw-r--r-- 2 root root 26 Jul  6 14:05 old.txt

发现创建的硬链接文件竟然会让文件属性第二列的数字变成了2,这个数字就是文件的inode信息块数量

[root@linuxprobe ~]# rm -f old.txt 
[root@linuxprobe ~]# cat new.txt 
Welcome to linuxprobe.com

致谢

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp报错--app.json: 在项目根目录未找到 app.json

【问题】 刚创建好的uni-app项目&#xff0c;运行微信小程序控制台报错如下&#xff1a; 【解决方案】 1. 程序根目录打开project.config.json文件 2. 配置miniprogramRoot&#xff0c;指定小程序代码的根目录 我的小程序代码编译后的工程文件目录为&#xff1a;dist/dev/mp…

评价ChatGPT与强人工智能的未来

在人工智能领域&#xff0c;ChatGPT的出现无疑是一个里程碑事件。它不仅展示了自然语言处理技术的巨大进步&#xff0c;也引发了人们对于强人工智能&#xff08;AGI&#xff09;的无限遐想。本文将从多个角度评价ChatGPT&#xff0c;并探讨强人工智能距离我们还有多远。 ChatGP…

Google RichHF-18K 文本到图像生成中的丰富人类反馈

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

IDA*——AcWing 180. 排书

IDA* 定义 IDA*&#xff08;Iterative Deepening A*&#xff09;是一种结合了深度优先搜索&#xff08;DFS&#xff09;的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题&#xff0c;尤其是当搜索空间很大或者搜索成本不确定时。 IDA* 是…

场景管理分析平台介绍

在数字化浪潮的推动下&#xff0c;数据已成为企业决策的重要依据。特别是在智能驾驶、虚拟现实和物联网等领域&#xff0c;场景数据的高效管理和利用至关重要。在智能驾驶领域面对海量的场景数据&#xff0c;如何高效处理、精准分析&#xff0c;并将其转化为有价值的决策支持&a…

C++基础(十一):STL简介

从今天开始&#xff0c;我们正式步入STL的学习&#xff0c;STL&#xff08;标准模板库&#xff0c;Standard Template Library&#xff09;是C标准库的重要组成部分&#xff0c;提供了一系列通用的类和函数模板&#xff0c;包括容器、算法、迭代器等。它的设计极大地提高了代码…

AI让大龄程序员重新焕发活力

AI是在帮助开发者还是取代他们&#xff1f; 在软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试&#xff0c;AI工具正在成为开发者的得力助手。然而&#xff0c;这也引发了对开发者职业…

Python爬虫零基础实战,简洁实用!

1.爬虫简介 简单来讲&#xff0c;爬虫就是一个探测机器&#xff0c;它的基本操作就是模拟人的行为去各个网站溜达&#xff0c;点点按钮&#xff0c;查查数据&#xff0c;或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。 你可以简单地想象&#xff1a;每个…

【SPIE独立出版】第四届智能交通系统与智慧城市国际学术会议(ITSSC 2024)

第四届智能交通系统与智慧城市国际学术会议&#xff08;ITSSC 2024&#xff09;将于2024年8月23-25日在中国西安举行。本次会议主要围绕智能交通、交通新能源、无人驾驶、智慧城市、智能家居、智能生活等研究领域展开讨论&#xff0c; 旨在为该研究领域的专家学者们提供一个分享…

文心一言最常用的20条指令及指令说明,含增强指令

下面是20条文心一言的指令及其说明&#xff0c;每条指令尽量简洁明了&#xff0c;以便在有限的字数内提供尽可能多的信息。以下是这些指令及其说明&#xff1a; 1. 查询天气 指令&#xff1a;今天北京的天气怎么样&#xff1f;说明&#xff1a;此指令用于查询特定城市&#xf…

无人机5公里WiFi低延迟图传模组,抗干扰、长距离、低延迟,飞睿智能无线通信新标杆

在科技日新月异的今天&#xff0c;我们见证了无数通信技术的飞跃。从开始的电报、电话&#xff0c;到如今的4G、5G网络&#xff0c;再到WiFi的广泛应用&#xff0c;每一次技术的革新都极大地改变了人们的生活方式。飞睿智能5公里WiFi低延迟图传模组&#xff0c;它以其独特的优势…

Python 获取tiktok视频评论回复数据 api接口

TIKTOK api接口 用于爬取tiktok视频评论回复数据 详细采集页面如图 https://www.tiktok.com/dailymail/video/7329872821990182190?qneural%20link&t1706783508149 请求API http://api.xxxx.com/tt/video/info/comment/reply?video_id7288909913185701125&comment_…

ELK优化之Filebeat部署

目录 1.安装配置Nginx 2.安装 Filebeat 3.设置 filebeat 的主配置文件 4.修改Logstash配置 5.启动配置 6.kibana验证 主机名ip地址主要软件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

AE的首选项设置

打开AE,点击 编辑->首选项->常规 显示 点击“所有关键帧”&#xff0c;这样显示路径就会显示所有关键帧 导入 将序列素材改为25帧每秒&#xff0c;作为以后制作的默认 媒体和磁盘缓存 根据个人需求选择磁盘缓存的文件夹&#xff0c;如果d盘空间充足&#xff0c;就改成…

上海外贸建站公司wordpress模板推荐

Sora索啦高端制造业wordpress主题 红色高端制造业wordpress主题&#xff0c;适合外贸企业出海建独立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Yamal外贸独立站wordpress主题 绿色的亚马尔Yamal外贸独立站wordpress模板&#xff0c;适用于外贸公司建独立站…

Autosar MCAL-S32k324 Crypto配置-RandomNumber生成及使用

文章目录 前言CryptoPrimitivesCryptoPrimitiveAlgorithmFamilyCryptoPrimitiveAlgorithmModeCryptoPrimitiveAlgorithmSecondaryFamilyCryptoPrimitiveServiceCryptoDriverObject代码使用Random Generate执行流程配置job函数使用示例总结前言 之前介绍过AES-CMAC算法的配置,…

Linux|信号

Linux|信号 信号的概念信号处理的三种方式捕捉信号的System Call -- signal 1.产生信号的5种方式2.信号的保存2.1 core 标志位 2.信号的保存2.1 对pending 表 和 block 表操作2.2 阻塞SIGINT信号 并打印pending表例子 捕捉信号sigaction 函数验证当前正在处理某信号&#xff0c…

视觉语言模型:融合视觉与语言的未来

1. 概述 视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;是能够同时处理和理解视觉&#xff08;图像&#xff09;和语言&#xff08;文本&#xff09;两种模态信息的人工智能模型。这种模型结合了计算机视觉和自然语言处理的技术&#xff0c;使得它们能够在…

代码随想录-Day49

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 …

使用握手信号实现跨时钟域数据传输

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 分别编写一个数据发送模块和一个数据接收模块&#xff0c;模块的时钟信号分别为clk_a&#xff0c;clk_b。两个时钟的频率不相同。数据发送模块循环发送0-7&#xff0c;在每个数据传输完成之后&#xf…