逻辑卷管理-LVM

news2024/11/27 15:31:16

目录

1. LVM的基本概念

2. Linux下创建和管理LVM

3. 环境准备

4. 物理卷管理

4.1. 创建物理卷

4.2. 显示物理卷

4.3. 删除物理卷

4. 卷组管理

4.1. 创建卷组

4.2. 显示卷组

4.3. 扩展卷组

4.4. 缩减卷组

4.5. 删除卷组

4.6. 分割卷组

4.7 组合卷组

5. 逻辑卷管理

5.1. 创建逻辑卷

5.2. 显示逻辑卷

5.3. 创建文件系统并挂载

5.4. 扩展逻辑卷

5.5. 缩减逻辑卷

5.6. 删除逻辑卷


       文件LVM是逻辑卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分析进行管理的一种机制。LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。在传统的磁盘管理机制中,上层应用是直接访问文件系统来对底层的物理硬盘进行读写。而在LVM中,它会将底层的硬盘进行封装,当我们通过软件去对底层的物理磁盘进行操作时,它不再是直接对分区进行操作,而是通过逻辑卷对底层的物理硬盘进行操作。LVM最大的特点就是可以对磁盘进行动态管理,因为逻辑卷的大小是可以动态调整的,而且不会丢失数据。逻辑卷的技术大大提高了磁盘管理的逻辑性。

1. LVM的基本概念

       LVM中的概念有物理卷、卷组、逻辑卷、物理区块和逻辑区块等,其含义如下:

  • 物理卷(Physical Volume, PV):物理卷是指硬盘/硬盘分区或者从逻辑上与硬盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但是与基本的物理存储介质(如硬盘、分区等)比较却包含有与LVM相关的管理参数。
  • 卷组(Volume Group, VG):卷组是由一个或多个物理卷组成的一个整体,在卷组中可以动态地添加或移除物理卷,卷组名称由用户自行定义。
  •  逻辑卷(Logical Volume,LV):逻辑卷是建立在卷组之上的,与物理卷无直接关系,对于逻辑卷来说,每一个卷组就是一个整体,从这个整体中切出一小块空间,作为用户创建文件系统基础,这一小块空间就称为逻辑卷。
  • 物理区块(Physical Extent, PE):每一个物理卷被划分为称为PE的基本单位,具有唯一编号的PE是可以被LVM寻址的最小单元,PE大小可配置,默认4MB。
  • 逻辑区块(Logical Extend,LE):逻辑卷也被划为为称为LE的可寻址的基本单元,在同一卷组中,LE的大小和PE是相同的,并且一一对应。

       图1描述了存储介质、物理卷、卷组、逻辑卷和文件系统之间的关系。

图1. 存储介质、物理卷、卷组、逻辑卷和文件系统之间的关系

2. Linux下创建和管理LVM

       在UbuntuDebian Linux Mint 上安装 LVM的命令:

          sudo apt install lvm2

       在 CentOSFedoraAlmaLinux Red Hat 上安装 LVM的命令:

          sudo dnf install lvms

       LVM中的主要管理命令如表1所示。

表1. LVM中的管理命令
功能物理卷管理卷组管理逻辑卷管理
扫描(scan)pvscanvgscanlvscan
建立(create)pvcreatevgcreatelvcreate
显示(display)pvdisplayvgdisplaylvdisplay
删除(remove)pvremovevgremovelvremove
缩减(reduce)vgreducelvreduce
扩展(extend)vgextendlvextend

3. 环境准备

     准备4块硬盘:/dev/sdb、/dev/sdc、/dev/sdd和/dev/sde,每个硬盘的容量为10G。将硬盘/dev/sdc划分两个分区:/dev/sdc1和/dev/sdc2,其中,/dev/sdc的容量为2G,/dev/sdc2的容量为8G;将硬盘/dev/sdd划分为两个分区:/dev/sdd1和/dev/sdd2,其中,/dev/sdd1的容量5G,/dev/sdd2的容量为8G。

查看机器分区情况:

lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
...
sda      8:0    0    50G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0  49.5G  0 part /
sdb      8:16   0    10G  0 disk 
sdc      8:32   0    10G  0 disk 
├─sdc1   8:33   0     2G  0 part 
└─sdc2   8:34   0     8G  0 part 
sdd      8:48   0    10G  0 disk 
├─sdd1   8:49   0     5G  0 part 
└─sdd2   8:50   0     5G  0 part 

sde     8:32   0    10G  0 disk 

...

4. 物理卷管理

4.1. 创建物理卷

       将硬盘/dev/sdb,以及硬盘分区/dev/sdc1、/dev/sdc2、/dev/sdd1、/dev/sdd2转换为物理卷,创建物理卷命令如下:

      # 将硬盘/dev/sdb创建为一个物理卷

         sudo pvcreate /dev/sdb   

WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y
  Wiping dos signature on /dev/sdb.
  Physical volume "/dev/sdb" successfully created.

      # 将硬盘分区/dev/sdc1和/dev/sdc2创建为两个物理卷

         sudo pvcreate /dev/sdc[1,2]   

Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdc2" successfully created.

       # 将硬盘分区/dev/sdd1和/dev/sdd2创建为两个物理卷

          sudo pvcreate /dev/sdd1 /dev/sdd2 

Physical volume "/dev/sdd1" successfully created.
Physical volume "/dev/sdd2" successfully created.

4.2. 显示物理卷

       # 显示所有物理卷信息:

       sudo pvdisplay

  "/dev/sdb" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
 
PV Name               /dev/sdb
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               X8hoHa-3Osn-laEc-QlI3-1sT5-aaJZ-TvdTjg
   
  "/dev/sdc1" is a new physical volume of "<2.00 GiB"
  --- NEW Physical volume ---

  PV Name               /dev/sdc1
  VG Name               
  PV Size               <2.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               xC3MDe-V3NL-Xgsx-NSFb-8aaW-6OkA-W5CTlr
   
  "/dev/sdc2" is a new physical volume of "<8.00 GiB"
  --- NEW Physical volume ---
 
PV Name               /dev/sdc2
  VG Name               
  PV Size               <8.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               MTKNlr-Rk8T-v3qN-l8lR-QhB5-UtxR-3r3Ygt
   
  "/dev/sdd1" is a new physical volume of "<5.00 GiB"
  --- NEW Physical volume ---

  PV Name               /dev/sdd1
  VG Name               
  PV Size               <5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               OL6a9y-oDZG-j8G1-S0kV-2QT9-kBwS-PcnMS5
   
  "/dev/sdd2" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---

  PV Name               /dev/sdd2
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               dM8BcS-tHa7-7mnd-WYZ0-U0TG-7bPW-HLklmR 

       输出显示已经创建了5个物理卷:/dev/sdb、/dev/sdc1、/dev/sdc2、/dev/sdd1、/dev/sdd2。

      # 显示单个物理卷信息:

       sudo pvdisplay /dev/sdb

 "/dev/sdb" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               X8hoHa-3Osn-laEc-QlI3-1sT5-aaJZ-TvdTjg

4.3. 删除物理卷

      删除一个物理卷的命令如下:

      sudo pvremove /dev/sdd2

 Labels on physical volume "/dev/sdd2" successfully wiped.

4. 卷组管理

4.1. 创建卷组

      将物理卷/dev/sdb、/dev/sdc1和/dev/sdd1组组合成一个卷组,卷组的名称为vg1;将物理卷/dev/sdc2和/dev/sdd2组成一个卷组,卷组的名称为vg2。

      # 创建卷组vg1,该卷组是由物理卷/dev/sdb、/dev/sdc1和/dev/sdd1组成

         sudo vgcreate vg1 /dev/sdb /dev/sdc1 /dev/sdd1

Volume group "vg1" successfully created

      # 创建卷组vg2,该卷组是由物理卷/dev/sdc2和/dev/sdd2组成

         sudo vgcreate vg2 /dev/sdc2 /dev/sdd2

Volume group "vg2" successfully created

4.2. 显示卷组

      # 显示所有卷组信息:

      sudo vgdisplay

--- Volume group ---

VG Name               vg2
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               12.99 GiB
  PE Size               4.00 MiB
  Total PE              3326
  Alloc PE / Size       0 / 0   
  Free  PE / Size       3326 / 12.99 GiB
  VG UUID               6nr7m3-ZsN5-YS6B-XKOd-XWPa-tuw6-hz365v
   
  --- Volume group ---
 
VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <16.99 GiB
  PE Size               4.00 MiB
  Total PE              4349
  Alloc PE / Size       0 / 0   
  Free  PE / Size       4349 / <16.99 GiB
  VG UUID               Isf2u3-0OGe-56zB-wf8k-0JZU-WOce-CJXJPt

       输出显示创建了2个卷组:vg1和vg2。

      # 显示单个卷组信息:

        sudo vgdisplay vg1

 --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <16.99 GiB
  PE Size               4.00 MiB
  Total PE              4349
  Alloc PE / Size       0 / 0   
  Free  PE / Size       4349 / <16.99 GiB
  VG UUID               Isf2u3-0OGe-56zB-wf8k-0JZU-WOce-CJXJPt

       显示卷组的命令还有:

      vgscan:扫描卷组的所有磁盘,并重新构建LVM缓存文件,同时显示卷组。

      vgs:使用可配置格式显示卷组信息,每行一个卷组。

4.3. 扩展卷组

      扩展卷组是指像一个卷组中增加一个或多个物理卷,示例如下:

      # 创建一个新的物理卷/dev/sde

         sudo pvcreate /dev/sde

 Physical volume "/dev/sde" successfully created.

      # 将新创建的物理卷/dev/sde加入到卷组vg2中

        sudo vgextend vg2 /dev/sde

 Volume group "vg2" successfully extended

4.4. 缩减卷组

      缩减卷组是指从一个卷组中移除一个    或多个物理卷,示例如下:

      # 将物理卷/dev/sde从卷组vg2中移除

       sudo vgreduce vg2 /dev/sde

Removed "/dev/sde" from volume group "vg2"

4.5. 删除卷组

      使用vgremove命令可以删除不包含逻辑卷的卷组,示例如下:

     # 删除逻辑卷vg2

      sudo vgremove vg2

Volume group "vg2" successfully removed

4.6. 分割卷组

       使用vgsplit命令可以拆分卷组中的物理卷,并创建新的卷组。示例如下:

      # 将卷组vg2中的物理卷/devsde拆分为一个新的卷组vg3

        sudo vgsplit vg2 vg3 /dev/sde

New volume group "vg3" successfully split from "vg2"

4.7 组合卷组

        使用lvmerge命令可以将两个卷组合并为一个更大的卷组,在合并卷组之前,确保两个卷组中的逻辑卷没有重叠,否则合并操作将会失败。示例如下:

      # 把卷组vg3合并到卷组vg2中

        sudo vgmerge -v vg2 vg3

 Checking for volume group "vg2"
  Checking for volume group "vg3"
  Archiving volume group "vg3" metadata (seqno 2).
  Archiving volume group "vg2" metadata (seqno 5).
  Writing out updated volume group
  WARNING: updating old metadata to 6 on /dev/sde for VG vg2.
  Creating volume group backup "/etc/lvm/backup/vg2" (seqno 6).

  Volume group "vg3" successfully merged into "vg2"

5. 逻辑卷管理

5.1. 创建逻辑卷

      在卷组vg1上创建一个大小为5GB,名称为lv11的逻辑卷:

      sudo lvcreate -L 5GB -n lv11 vg1

Logical volume "lv11" created.

      在卷组vg1上创建一个大小为6GB,名称为lv12的逻辑卷:

       sudo lvcreate -L 6GB -n lv12 vg1

Logical volume "lv12" created.

       在卷组vg2上创建一个名称为lv21的逻辑卷,该逻辑卷的大小为卷组剩余空间的40%:

       sudo lvcreate -l 40%VG -n lv21 vg2

Logical volume "lv21" created.

注:参数l指定卷组中剩余可用空间的百分比作为逻辑卷的大小

5.2. 显示逻辑卷

      显示所有的逻辑卷信息:

      sudo lvdisplay

 --- Logical volume ---
  LV Path                /dev/vg2/lv21
  LV Name                lv21
  VG Name                vg2

  LV UUID                4wmsnY-JJ6a-05wV-FXFn-ojN2-A1AS-0T2TYF
  LV Write Access        read/write
  LV Creation host, time myvm1, 2024-05-10 07:42:11 +0800
  LV Status              available
  # open                 0
  LV Size                <9.20 GiB
  Current LE             2354
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
   
  --- Logical volume ---

  LV Path                /dev/vg1/lv11
  LV Name                lv11
  VG Name                vg1

  LV UUID                5195Ei-gZA6-50iR-Dyv6-iUTY-8QlK-PCam7I
  LV Write Access        read/write
  LV Creation host, time myvm1, 2024-05-09 21:35:36 +0800
  LV Status              available
  # open                 1
  LV Size                6.00 GiB
  Current LE             1536
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
   
  --- Logical volume ---

  LV Path                /dev/vg1/lv12
  LV Name                lv12
  VG Name                vg1

  LV UUID                NQslUU-vRdZ-g6Wr-D6Sf-3Jzm-U0DY-CGiX2c
  LV Write Access        read/write
  LV Creation host, time myvm1, 2024-05-09 22:16:13 +0800
  LV Status              available
  # open                 1
  LV Size                6.00 GiB
  Current LE             1536
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

      sudo lvs

  LV   VG  Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv11 vg1 -wi-ao----  6.00g                                                    
  lv12 vg1 -wi-ao----  6.00g                                                    
  lv21 vg2 -wi-a----- <9.20g   

       显示单个逻辑卷的信息:

       sudo lvdisplay /dev/lvg1/lv11

--- Logical volume ---
  LV Path                /dev/vg1/lv11
  LV Name                lv11
  VG Name                vg1
  LV UUID                5195Ei-gZA6-50iR-Dyv6-iUTY-8QlK-PCam7I
  LV Write Access        read/write
  LV Creation host, time myvm1, 2024-05-09 21:35:36 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

5.3. 创建文件系统并挂载

       在逻辑卷/dev/vg1/lv11上创建ext4文件系统:

      sudo mkfs  -t ext4 /dev/vg1/lv11

创建含有 1310720 个块(每块 4k)和 327680 个inode的文件系统
文件系统UUID:45f86733-16e7-4b27-9fd2-80daaf8fb8d6
超级块的备份存储于下列块: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(16384 个块) 完成
写入超级块和文件系统账户统计信息: 已完成

      在逻辑卷/dev/vg1/lv12上创建ext4文件系统:

      sudo mkfs -t ext4 /dev/vg1/lv12

创建含有 1572864 个块(每块 4k)和 393216 个inode的文件系统
文件系统UUID:f6793315-8995-46ff-bd9b-a9cf7dee3624
超级块的备份存储于下列块: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(16384 个块) 完成
写入超级块和文件系统账户统计信息: 已完成

       创建挂载点

        sudo mkdir /mnt/lv11

        sudo mkdir /mnt/lv12

       挂载逻辑卷

        sudo mount /dev/vg1/vg11 /mnt/lv11

        sudo mount /dev/vg1/vg12 /mnt/lv12

      查看磁盘挂载信息:

       df -Th

文件系统             类型      容量  已用  可用 已用% 挂载点
...
/dev/mapper/vg1-lv11 ext4      4.9G   24K  4.6G    1% /mnt/lv11
/dev/mapper/vg1-lv12 ext4      5.9G   24K  5.6G    1% /mnt/lv12

      为了机器重启后自动挂载逻辑卷,打开文件:

       sudo nano /etc/fstab

     在文件中最后添加如下信息:

/dev/vg1/lv11 /mnt/lv11 ext4 defaults,nofail,discard 0 0
/dev/vg1/lv12 /mnt/lv12 ext4 defaults,nofail,discard 0 0

      保存并关闭文件。

5.4. 扩展逻辑卷

      逻辑卷的最大优点是,当空间不足时,可以随时对其进行扩展。

      将逻辑卷lv11的空间扩展1GB:

      sudo lvextend -L +1GB /dev/vg1/lv11

 Size of logical volume vg1/lv11 changed from 5.00 GiB (1280 extents) to 6.00 GiB (1536 extents).
  Logical volume vg1/lv11 successfully resized.

      上述命令   实际上并没有增加文件系统的大小,而只是增加了逻辑卷的大小。为了使文件系统增长,我们需要使用以下命令调整文件系统的大小。

        sudo resize2fs /dev/vg1/lv11

/dev/vg1/lv11 上的文件系统已被挂载于 /mnt/lv11;需要进行在线调整大小
old_desc_blocks = 1, new_desc_blocks = 1
/dev/vg1/lv11 上的文件系统现在为 1572864 个块(每块 4k)。

5.5. 缩减逻辑卷

       可以使用lvreduce命令减小一个逻辑卷的大小,但在执行此操作之前需要非常小心,以确保不会丢失数据。在对逻辑卷进行任何缩减操作之前,强烈建议备份相关数据,以避免意外丢失。对于要缩小的逻辑卷,需要确保其文件系统支持缩小,对于 ext4 文件系统,首先可以使用resize2fs命令先缩小文件系统,然后使用lvreduce命令实际缩小逻辑卷的大小。

      例如,逻辑卷/dev/vg1/lv11的大小为5GB,其文件系统的大小也为5GB,该逻辑卷挂载到目录/mnt/lv11上,如果想要将该逻辑卷缩减为4GB,步骤如下:

      1) 卸载目录

        sudo umount /mnt/lv11

     2) 检查文件系统

        sudo e2fsck -f /dev/vg1/lv11

e2fsck 1.45.5 (07-Jan-2020)
第 1 步:检查inode、块和大小
第 2 步:检查目录结构
第 3 步:检查目录连接性
第 4 步:检查引用计数
第 5 步:检查组概要信息
/dev/vg1/lv11:11/393216 文件(0.0% 为非连续的), 46190/1572864 块

      3) 缩小文件系统

         sudo resize2fs /dev/vg1/lv11 4G

将 /dev/vg1/lv11 上的文件系统调整为 1048576 个块(每块 4k)。
/dev/vg1/lv11 上的文件系统现在为 1048576 个块(每块 4k)。

     4) 缩小逻辑卷

        sudo lvreduce -L 4G /dev/vg1/lv11

WARNING: Reducing active logical volume to 4.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg1/lv11? [y/n]: y
  Size of logical volume vg1/lv11 changed from 6.00 GiB (1536 extents) to 4.00 GiB (1024 extents).
  Logical volume vg1/lv11 successfully resized.

5.6. 删除逻辑卷

       可以使用lvremove命令删除逻辑卷。在删除逻辑卷前,先卸载其挂载的目录,删除逻辑卷后,数据将无法恢复。

      例如,逻辑卷/dev/vg1/lv12挂载到目录/mnt/lv12,删除该逻辑卷的步骤:

     1) 卸载目录

        sudo umount /mnt/lv12

     2)删除逻辑卷

        sudo lvremove /dev/vg1/lv12

Do you really want to remove and DISCARD active logical volume vg1/lv12? [y/n]: y
  Logical volume "lv12" successfully removed

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

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

相关文章

VisualGDB:Linux静态库项目创建、编译及库的使用

接上篇《VisualGDB&#xff1a;Linux动态库项目创建、编译及库的使用》&#xff0c;静态库的创建和使用与动态库基本无差别&#xff0c;唯一需要做的就是指定项目生成静态库。 一、指定项目生成静态库 二、重新构建和编译项目 这里注意&#xff0c;同样要copy一个libxxx.so格式…

InternLM-Chat-7B部署调用-个人记录

一、环境准备 pip install modelscope1.9.5 pip install transformers4.35.2 二、下载模型 import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(Shanghai_AI_Laboratory/internlm-chat-7b, cache_di…

果味碳酸饮料二氧化碳气容量检测技术的创新与发展

果味碳酸饮料二氧化碳气容量检测技术的创新与发展 一、引言 随着健康饮食理念的普及和消费者对高品质饮料需求的增加&#xff0c;果味碳酸饮料的市场需求日益增长。在这一背景下&#xff0c;如何确保果味碳酸饮料的品质和口感成为了业界关注的焦点。二氧化碳气容量作为影响果味…

数据链路层之 以太网协议

以太网协议 这个协议即规定了数据链路层&#xff0c;同时也规定了物理层的内容。平时使用到的网线&#xff0c;其实也叫做“以太网线”&#xff08;遵守以太网协议的网线&#xff09;。 以太网帧格式 以太网数据帧 帧头 载荷 帧尾。 帧头&#xff1a;目的地址、源地址、类型…

Leetcode—232. 用栈实现队列【简单】

2024每日刷题&#xff08;131&#xff09; Leetcode—232. 用栈实现队列 实现代码 class MyQueue { public:MyQueue() {}void push(int x) {st.push(x);}int pop() {if(show.empty()) {if(empty()) {return -1;} else {int ans show.top();show.pop();return ans;}} else {i…

图像处理(二)

图像处理&#xff08;2&#xff09; 裁剪图片 from skimage import io,dataiimg io.imread(rD:\工坊\图像处理\十个勤天2.png)roiiimg[50:150,120:200,:]io.imshow(roi) 运行结果&#xff1a; 将图片进行二值化 from skimage import io,data,colorimg io.imread(r"…

TPB-1W 系列——1W 3KVDC 隔离 单输出 DC/DC 电源模块

TPB-1W系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压稳…

请求响应里面的日期参数

日期参数 需要在控制类使用DateTimeFormat注解 package com.ming.controller; ​ ​ import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Rest…

【LSTM】LSTM网络及参数学习笔记

图1 LSTM模型结构可视化 [6]. 图2 LSTM cell结构说明 图3 LSTM cell和num_units说明 [4]. 图4 LSTM的网络结构 1. LSTM 是对一个LSTM层的抽象&#xff0c;可以看成是由多个LSTM cell组成&#xff0c;是包含时间步的一个网络 2. LSTM cell 图2是LSTM在时间步上的结构&#xf…

「51媒体」教育论坛会议媒体邀约的资源有哪些

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 中国拥有众多教育方面的媒体资源&#xff0c;这些媒体在邀约时可以用于宣传和推广教育活动、论坛或项目。以下是一些具体的教育媒体邀约资源&#xff1a; 报纸类媒体&#xff1a; 《中…

STM32实现1.8寸液晶屏 LCD SPI串口显示屏模块 TFT彩屏(标准库和HAL库实现)

目录 一、所选模块 液晶模块选择&#xff08;淘宝上均有售卖&#xff09; 模块引脚 二、嵌入式单片机型号 三、接线表设计 四、开发环境版本说明 五、标准库实现 六、HAL库实现 七、完整工程&#xff08;内含标准库和HAL库源码&#xff09; 代码链接 一、所选模块 液…

OpenSSL实现AES的ECB和CBC加解密,可一次性加解密任意长度的明文字符串或字节流(QT C++环境)

本篇博文讲述如何在Qt C的环境中使用OpenSSL实现AES-ECB/CBC-Pkcs7加/解密&#xff0c;可以一次性加解密一个任意长度的明文字符串或者字节流&#xff0c;但不适合分段读取加解密的&#xff08;例如&#xff0c;一个4GB的大型文件需要加解密&#xff0c;要分段读取&#xff0c;…

Android system property运作流程源码分析

一.序 前文分析了build.prop这个系统属性文件的生成&#xff0c;每个属性都有一个名称和值&#xff0c;他们都是字符串格式。属性被大量使用在Android系统中&#xff0c;用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性&#x…

【ITK配准】第十六期 2D中BSpline可变形多分辨率配准样例

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK配准中的2D中BSpline可变形多分辨率配准,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 2…

文件摆渡系统与传统文件交换有什么区别|好用的文件摆渡系统分享

一、文件摆渡系统与传统文件交换方式的区别 文件摆渡系统与传统文件交换方式在多个方面存在显著的区别。随着信息化和网络化的发展&#xff0c;文件交换的方式也在不断演进&#xff0c;从传统的物理介质交换到现代化的网络交换&#xff0c;文件摆渡系统作为其中的一种重要方式…

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 #!usr/bin/perl open rf,"$ARGV[0]"; open wf,">test. tcl"; while (<rf>) { s/\[(\D[^\s\]]*)?\]/\\\[$1\\\]/g; if (/c…

CountDownLatch应用场景代码练习

目录 概念原理核心参数和方法两种应用场景实现代码应用一&#xff1a;让 主任务 等待 所有子任务执行完毕后&#xff0c;再继续执行执行结果应用二&#xff1a;让所有子任务同时执行&#xff0c;打印出发时间执行结果应用二&#xff08;扩展&#xff09;&#xff1a;让所有子任…

React:Router-2. createBrowserRouter函数式

参考文档&#xff1a;ReactRouter官网 前边的文章 BrowserRouter组件式路由 提供了组件式路由的方式&#xff0c;在react-router6.4.0及以上版本&#xff0c;提供了 createBrowserRouter 函数式路由创建方式。 一、创建路由 1. 新建router.js文件&#xff0c;使用createBrow…

WPF容器控件之dockpanel、布局控件

dockpanel 容器控件&#xff0c;对其子元素进行或者水平垂直排布&#xff0c;也可以叫停靠面板,也可以让子元素停靠到容器某一个边上&#xff0c;拉伸元素拾起充满全部的高度或者宽度&#xff0c;也可以使最后一个子元素是否铺满剩余的空间。 参数 LastChildFill最后一个子元素…

引用数据类型 栈内存 堆内存

let m { a: 10, b: 20 }; let n m; n.a 15; console.log(m.a) // 15 原因&#xff1a;基本数据类型存储在栈内存中&#xff0c;引用数据类型存储在堆内存中 &#xff0c;引用数据类型存储在堆内存中会在栈内存中创建一个指针&#xff0c;栈内存中的这个指针指向堆内存中的地…