Linux 中的逻辑卷 LVM 管理完整初学者指南

linux 中的逻辑卷 lvm 管理完整初学者指南

这是 Linux 中 LVM(逻辑卷管理)的完整初学者指南。

在本教程中,您将了解 LVM 的概念、它的组件以及为什么要使用它。

我不会仅限于理论上的解释,我还将展示在 Linux 中创建和管理 LVM 的动手示例。

简而言之,我将为您提供在现实世界中开始使用 LVM 所需的所有必要信息。

Linux 中的 LVM 是什么?

LVM 代表逻辑卷管理。这是管理存储系统的另一种方法,而不是传统的基于分区的方法。在 LVM 中,您无需创建分区,而是创建逻辑卷,然后您可以像挂载磁盘分区一样轻松地将这些卷挂载到文件系统中。

LVM 的组件

LVM 包含三个主要组件:

物理卷卷组逻辑卷

尽管该列表由三个部分组成,但其中只有两个是分区系统的直接对应部分,下表记录了这一点。

代码语言:txt复制

磁盘分区系统      LVM  分区          逻辑卷  磁盘           卷组

物理卷没有任何直接对应物,但我很快就会谈到这一点。

为什么要使用 LVM?

LVM 的主要优点是调整卷或卷组的大小非常容易。它抽象出了所有丑陋的部分(分区、原始磁盘),并为我们留下了一个中央存储池可供使用。

如果您曾经经历过分区大小调整的恐惧,那么您会想要使用 LVM。

动手实验室准备

这篇文章不仅仅是理论。在此过程中,我将展示实际的命令示例,学习某些东西的最佳方法是亲身实践。为此,我建议您使用虚拟机。

为了帮助你,我已经准备了一个简单的 Vagrantfile,你可以用它来用 VirtualBox 启动一个非常轻量级的虚拟机。此虚拟机具有三个额外的磁盘,您和我可以将它们用于下面的命令示例。

在文件系统的某处创建一个目录,并将以下内容保存在该文件中,名为Vagrantfile.

代码语言:txt复制

Vagrant.configure "2" do |config|    config.vm.box = "ubuntu/focal64"    config.vm.hostname = "lvm"    3.times {|i| config.vm.disk :disk, size: "5GB", name: "drive-#{i}"}    config.vm.provider :virtualbox do |machine|        machine.memory = 1024        machine.cpus = 1        machine.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]    endend# vi: set ft=ruby

或者,如果您愿意,可以使用wget或curl从我的 gist 下载文件。

代码语言:txt复制

wget https://gist.githubusercontent.com/debdutdeb/98ed1b6aef36885d07ce8247188dfd5e/raw/524259da5dfa2d8750883d01c8159829729e224d/Vagrantfile

确保你安装了Vagrant和VirtualBox。

一旦 Vagrantfile 就位,将环境变量设置VAGRANT_EXPERIMENTAL为disks.

代码语言:txt复制

export VAGRANT_EXPERIMENTAL=disks

最后,使用以下命令启动虚拟机(确保您与 Vagrantfile 位于同一目录中):

代码语言:txt复制

vagrant up

机器运行后,您可以使用vagrant sshSSH 连接到它并运行本文中的示例命令。

完成后请记住vagrant destroy从与 Vagrantfile 相同的目录运行。

安装 LVM

在您可以使用任何命令之前,您需要安装该lvm2软件包。这应该预装在大多数现代发行版中,尤其是基于 Ubuntu 的发行版中。但是,在继续之前,我不得不提到这一点。要安装lvm2,请查阅您的发行版的文档。

LVM 实践

对于这个动手演练,我构建了一个具有 40G 根存储(不重要)和三个大小为 5G 的外部磁盘的虚拟机。这些磁盘的大小是任意的。

代码语言:txt复制

vagrant@lvm:~$ lsblk -o name,size,fstypeNAME    SIZE FSTYPEloop0  55.5M squashfsloop1  32.3M squashfsloop2  70.4M squashfssda      40G └─sda1   40G ext4sdb      10M iso9660sdc       5G sdd       5G sde       5G

如您所见,我将使用的设备sdc是sdd和sde。

还记得我告诉过你 LVM 包含三个主要组件吗?

物理卷卷组逻辑卷

是时候一一见他们了。

1. 物理卷

关于 LVM,您首先需要了解的是物理卷。物理卷是用于实现抽象即逻辑卷的原材料或构建块。简单来说,物理卷是 LVM 系统的逻辑单元。

物理卷可以是任何东西,原始磁盘或磁盘分区。创建和初始化物理卷是一回事。两者都意味着您只是在为进一步的操作准备构建块(即分区、磁盘)。这将在瞬间变得更加清晰。

实用程序:pv所有管理物理卷的实用程序都以P hysical Volume的字母开头。例如pvcreate, pvchange,pvs等pvdisplay。

创建物理卷

您可以使用原始未分区磁盘或分区本身来创建物理卷。

正如我之前提到的,我的虚拟机连接了三个外部驱动器,让我们从/dev/sdc.

我们使用pvcreate命令来创建物理卷。只需将设备名称传递给它即可。

代码语言:txt复制

sudo pvcreate /dev/sdc

你应该看到这样的东西:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvcreate /dev/sdc  Physical volume "/dev/sdc" successfully created.

接下来我将/dev/sdd分成相等的部分。使用任何工具cfdisk,,,等parted,fdisk有很多工具可以完成这项工作。

代码语言:txt复制

vagrant@lvm:~$ lsblk -o name,size,fstype | grep sddsdd       5G ├─sdd1  2.5G └─sdd2  2.5G

您现在可以在一个步骤中从这两个分区中快速创建另外两个物理卷,同时将这两个设备传递给pvcreate。

代码语言:txt复制

sudo pvcreate /dev/sdd1 /dev/sdd2

看一看:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvcreate /dev/sdd1 /dev/sdd2  Physical volume "/dev/sdd1" successfully created.  Physical volume "/dev/sdd2" successfully created.

列出可用的物理卷

您可以使用三个命令来获取可用物理卷的列表pvscan,pvs和pvdisplay。您通常不需要向这些命令传递任何内容。

pvscan:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvscan  PV /dev/sdc                       lvm2 [5.00 GiB]  PV /dev/sdd1                      lvm2 [2.50 GiB]  PV /dev/sdd2                      lvm2 [<2.50 GiB]  Total: 3 [<10.00 GiB] / in use: 0 [0   ] / in no VG: 3 [<10.00 GiB]

pvs:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvs  PV         VG Fmt  Attr PSize  PFree   /dev/sdc      lvm2 ---   5.00g  5.00g  /dev/sdd1     lvm2 ---   2.50g  2.50g  /dev/sdd2     lvm2 ---  <2.50g <2.50g

pvdisplay:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvdisplay  "/dev/sdc" is a new physical volume of "5.00 GiB"  --- NEW Physical volume ---  PV Name               /dev/sdc  VG Name                 PV Size               5.00 GiB  Allocatable           NO  PE Size               0     Total PE              0  Free PE               0  Allocated PE          0  PV UUID               SzSkdD-xKYa-4y7P-teyU-481p-uiQ8-qieMJJ     "/dev/sdd1" is a new physical volume of "2.50 GiB"  --- NEW Physical volume ---  PV Name               /dev/sdd1  VG Name                 PV Size               2.50 GiB  Allocatable           NO  PE Size               0     Total PE              0  Free PE               0  Allocated PE          0  PV UUID               553Iy4-JJ21-LfIw-udtO-j9Cd-7gFS-iXXFVS     "/dev/sdd2" is a new physical volume of "<2.50 GiB"  --- NEW Physical volume ---  PV Name               /dev/sdd2  VG Name                 PV Size               <2.50 GiB  Allocatable           NO  PE Size               0     Total PE              0  Free PE               0  Allocated PE          0  PV UUID               bf7ghn-QkPm-EUdp-GdyW-shMG-5sMn-VhNtYB

正如您所看到的,除了列出物理卷之外,这些命令还为您提供了大量有关这些卷的其他信息。

删除物理卷

pvremove您可以使用该命令删除物理卷。就像pvcreate,只需将设备(初始化为物理卷)传递给pvremove命令。

为了演示,我将从/dev/sdd2列表中删除。

代码语言:txt复制

sudo pvremove /dev/sdd2

输出应与此相同:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvremove /dev/sdd2  Labels on physical volume "/dev/sdd2" successfully wiped.

现在列出物理卷sudo pvs

代码语言:txt复制

vagrant@lvm:~$ sudo pvs  PV         VG Fmt  Attr PSize PFree  /dev/sdc      lvm2 ---  5.00g 5.00g  /dev/sdd1     lvm2 ---  2.50g 2.50g

/dev/sdd2不再在这里。

2. 卷组

卷组是物理卷的集合。它是 LVM 中的下一个抽象级别。卷组是结合了多个原始存储设备的存储容量的存储池。

实用程序:所有卷组实用程序名称都以 开头vg,代表卷组,例如、等。vgcreatevgsvgrename

创建卷组

卷组是使用该vgcreate命令创建的。的第一个参数vgcreate是您要为该卷组指定的名称,其余的是要支持存储池的物理卷的列表。

代码语言:txt复制

sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1

例子:-

代码语言:txt复制

vagrant@lvm:~$ sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1  Volume group "lvm_tutorial" successfully created

列出卷组

列出卷组类似于列出物理卷,您可以使用具有不同详细级别的不同命令vgdisplay、vgscan和vgs。

我个人更喜欢vgs命令,sudo vgs

沁言学术 沁言学术

你的论文写作AI助理,永久免费文献管理工具,认准沁言学术

沁言学术 30 查看详情 沁言学术 代码语言:txt复制

vagrant@lvm:~$ sudo vgs  VG           #PV #LV #SN Attr   VSize VFree  lvm_tutorial   2   0   0 wz--n- 7.49g 7.49gvgscan:-vagrant@lvm:~$ sudo vgscan  Found volume group "lvm_tutorial" using metadata type lvm2vgdisplay:-vagrant@lvm:~$ sudo vgdisplay   --- Volume group ---  VG Name               lvm_tutorial  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               7.49 GiB  PE Size               4.00 MiB  Total PE              1918  Alloc PE / Size       0 / 0     Free  PE / Size       1918 / 7.49 GiB  VG UUID               LYVE9P-vY0G-OAW6-an8q-yfBx-rrB1-YU61m1

列出附加到卷组的物理卷

您可以使用以下命令列出连接到特定卷组的所有物理卷:-

代码语言:txt复制

sudo pvdisplay -S vgname= -C -o pv_name

例子:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name  PV          /dev/sdc    /dev/sdd1

您还可以获得物理卷的计数。

代码语言:txt复制

sudo vgdisplay -S vgname= -C -o pv_count

例子:-

代码语言:txt复制

vagrant@lvm:~$ sudo vgdisplay -S vgname=lvm_tutorial -C -o pv_count  #PV    3

扩展卷组

扩展卷组意味着向卷组添加额外的物理卷。为此,vgextend使用该命令。语法很简单:-

代码语言:txt复制

vgextend    ....

让我们将lvm_tutorial音量扩大/dev/sdd2.

代码语言:txt复制

sudo vgextend lvm_tutorial /dev/sdd2

专注于输出:-

代码语言:txt复制

vagrant@lvm:~$ sudo vgextend lvm_tutorial /dev/sdd2  Physical volume "/dev/sdd2" successfully created.  Volume group "lvm_tutorial" successfully extended

在物理卷部分,我们最终将其/dev/sdd2作为物理卷删除,但必须将分区或原始磁盘初始化为物理卷,否则 LVM 将无法将其作为卷组的一部分进行管理。所以在将它添加到卷组之前vgextend做好准备。/dev/sdd2

现在列出附加到此卷组的物理卷,以确保安全。

代码语言:txt复制

sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name

输出:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name  PV          /dev/sdc    /dev/sdd1   /dev/sdd2

/dev/sdd2现在按预期在列表中。

减少卷组

就像扩展一个卷组意味着添加另一个物理卷一样,减少它意味着删除一个或多个物理卷。

我们使用vgreduce命令来执行此操作。一般语法如下:-

代码语言:txt复制

vgreduce    ....

让我们删除物理卷/dev/sdc和/dev/sdd1.

代码语言:txt复制

sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1

例子:-

代码语言:txt复制

vagrant@lvm:~$ sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1  Removed "/dev/sdc" from volume group "lvm_tutorial"  Removed "/dev/sdd1" from volume group "lvm_tutorial"

再次列出物理卷。

代码语言:txt复制

sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name

输出:-

代码语言:txt复制

vagrant@lvm:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name  PV          /dev/sdd2

那两个物理卷不见了。

现在,为了本文的其余部分,将这两个物理卷添加回来。

代码语言:txt复制

sudo vgextend lvm_tutorial /dev/sdc /dev/sdd1

删除卷组

vgremove您可以使用该命令删除逻辑卷。

代码语言:txt复制

sudo vgremove lvm_tutorial

现在不要运行此命令,否则您必须重新创建卷组。如果您想对其进行测试,请在本文的最后运行它。

3. 逻辑卷

这是您将主要使用的内容。逻辑卷就像一个分区,但它不是位于原始磁盘之上,而是位于卷组之上。你可以,

使用您想要的任何文件系统格式化逻辑卷。将其挂载到您想要的文件系统中的任何位置。

在本节中,您将学习,

如何创建逻辑卷。对逻辑卷的常用操作。调整逻辑卷的大小。删除逻辑卷。

实用程序:所有卷组实用程序名称都以 开头lv,代表逻辑卷。例如, ,等等, ,等等lvcreatelvslvreducevgcreatevgsvgrename

创建逻辑卷

lvcreate使用该命令创建逻辑卷。常用的语法如下所示,

代码语言:txt复制

sudo lvcreate -L  -n  

-L选项用于新逻辑卷的大小,您可以使用任何以“GB”、“MB”或“KB”结尾的整数。例如“1GB”。-n选项用于命名此逻辑卷。需要将这个逻辑卷所属的卷组的名称传递给它,因此,在为逻辑卷提供大小时,请确保卷组有可用空间。

在虚拟机上运行以下命令:

代码语言:txt复制

sudo lvcreate -L 5GB -n lv1 lvm_tutorial

示例输出:

代码语言:txt复制

vagrant@lvm:~$ sudo lvcreate -L 5GB -n lv1 lvm_tutorial  Logical volume "lv1" created.

对逻辑卷的常用操作

正如我之前所说,您可以将文件系统放在逻辑卷上,也可以将其挂载到文件系统的任何位置。

/dev//创建后,您可以在路径中找到逻辑卷。例如,在我们的例子中,音量将在/dev/lvm_tutorial/lv1.

代码语言:txt复制

vagrant@lvm:~$ ls -l /dev/lvm_tutorial/lv1 lrwxrwxrwx 1 root root 7 May 17 02:09 /dev/lvm_tutorial/lv1 -> ../dm-0

现在您可以像使用任何分区一样使用它。用ext4格式化,

代码语言:txt复制

sudo mkfs.ext4 /dev/lvm_tutorial/lv1

将它安装在当前目录结构中的某个位置,例如/mnt,

代码语言:txt复制

sudo mount -t ext4 /dev/lvm_tutorial/lv1 /mnt

调整逻辑卷的大小

您可以使用命令扩展逻辑卷lvextend并使用命令减小其大小lvreduce。或者,您可以使用单个命令lvresize来完成这两项任务。

首先让我们看看卷组中是否还有剩余空间。

代码语言:txt复制

sudo vgs -S vgname=lvm_tutorial -o vg_free

输出:-

代码语言:txt复制

vagrant@lvm:~$ sudo vgs -S vgname=lvm_tutorial -o vg_free  VFree   <4.99g

根据输出,我还有一些空间,所以让我们将卷大小增加 2GB。

请记住,逻辑卷仍安装在/mnt.

代码语言:txt复制

vagrant@lvm:~$ mount | grep '/mnt'/dev/mapper/lvm_tutorial-lv1 on /mnt type ext4 (rw,relatime)

使用以下命令调整卷大小:

代码语言:txt复制

sudo lvresize -L +2GB lvm_tutorial/lv1

一般语法是这样的:

代码语言:txt复制

lvresize -L [+|-][Size] /

后面的符号 + 或 –L取决于您是尝试增加音量还是分别减小音量。

卷大小增加后,文件系统也必须调整大小。对于 ext4,要使用的命令是resize2fs.

代码语言:txt复制

sudo resize2fs /dev/lvm_tutorial/lv1

输出:

代码语言:txt复制

vagrant@lvm:~$ sudo resize2fs /dev/lvm_tutorial/lv1resize2fs 1.45.5 (07-Jan-2020)Filesystem at /dev/lvm_tutorial/lv1 is mounted on /mnt; on-line resizing requiredold_desc_blocks = 1, new_desc_blocks = 1The filesystem on /dev/lvm_tutorial/lv1 is now 1835008 (4k) blocks long.

减少逻辑卷是一项稍微复杂的任务,我不会在本文中讨论这个问题。我将把这个卷的大小减少 1GB。

删除逻辑卷

lvremove您可以使用该命令删除逻辑卷。命令语法如下:-

代码语言:txt复制

lvremove /

在虚拟机上运行此命令:-

代码语言:txt复制

sudo lvremove lvm_tutorial/lv1

输出:-

代码语言:txt复制

vagrant@lvm:~$ sudo lvremove lvm_tutorial/lv1Do you really want to remove and DISCARD active logical volume lvm_tutorial/lv1? [y/n]: y  Logical volume "lv1" successfully removed

在逻辑卷、物理卷和卷组上还有许多其他操作可行,但不可能将所有这些都写到一篇文章中。

我/dev/sde在虚拟机中为您多留了一个磁盘,使用它,练习本文中的一些命令,创建一个新的卷组,扩展一个现有的卷组,只是练习。

我希望这篇文章对你有所帮助,如果你想在以后看到更多关于这方面的内容,请在下面的评论部分告诉我。

以上就是Linux 中的逻辑卷 LVM 管理完整初学者指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/470414.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
了解和防止 JavaScript 中的跨站请求伪造 (CSRF)
上一篇 2025年11月8日 07:19:53
lightroom怎么导入预设
下一篇 2025年11月8日 07:20:00

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    100
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 网站标题关键词更新后,搜索引擎为何仍显示旧标题?

    网站标题更新后,搜索引擎为何显示旧标题? 网站SEO优化中,站长常修改网站标题关键词,期望搜索结果显示自定义标题。然而,即使更新标签、meta keywords、meta description和结构化数据中的name属性后,搜索结果仍显示旧标题,这令人费解。本文将对此进行解释。 问题:站长修改了网…

    2026年5月10日
    100
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • python中zip函数详解 python多序列压缩zip函数应用场景

    zip函数的应用场景包括:1) 同时遍历多个序列,2) 合并多个列表的数据,3) 数据分析和科学计算中的元素运算,4) 处理csv文件,5) 性能优化。zip函数是一个强大的工具,能够简化代码并提高处理多个序列时的效率。 在Python中,zip函数是一个非常有用的工具,它能够将多个可迭代对象打包成…

    2026年5月10日
    000
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    100
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • Python中怎样使用pymongo?

    在python中使用pymongo可以轻松地与mongodb数据库进行交互。1)安装pymongo:pip install pymongo。2)连接到mongodb:from pymongo import mongoclient; client = mongoclient(‘mongod…

    2026年5月10日
    000
  • JavaScript函数中插入加载动画(Spinner)的正确方法

    本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。 在Web开发中,当执行耗时操作时,显示加载动画…

    2026年5月10日
    100
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2026年5月10日
    100
  • Golang空接口如何应用在项目中

    空接口可用于接收任意类型值,常见于日志函数、通用数据结构、JSON动态解析及配置驱动逻辑,提升代码灵活性,但需配合类型断言确保安全,避免滥用以降低维护成本。 空接口 interface{} 在 Go 语言中是一个非常灵活的类型,它可以存储任何类型的值。虽然它牺牲了一部分类型安全,但在实际项目中合理使…

    2026年5月10日
    100
  • Golang使用Protobuf定义接口与消息格式

    Protobuf通过字段编号实现兼容性,新增字段可忽略、删除字段可保留编号,确保新旧版本互操作,支持服务独立演进。 在Golang项目中,利用Protobuf定义接口和消息格式,本质上是为服务间通信构建了一套高效、类型安全且跨语言的契约。它让数据结构清晰可见,RPC调用标准化,极大地简化了分布式系统…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信