Multipath实现LUN设备名称的持久化

2024-04-04 03:48

本文主要是介绍Multipath实现LUN设备名称的持久化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

 

之前用openfiler 搭建了一个虚拟的存储。 并且用udev 动态管理实现了设备的持久化。 这块的知识参考我的blog

openfiler 搭建虚拟存储 配置服务端

       http://www.cndba.cn/Dave/article/726

 

实现设备名称的持久化有两种工具:Udev Multipath.  Udev的东西,昨天的实验已经做了说明。 今天主要讲用Multipath 来实现设备的持久化和多路径访问的问题。

 

 

一. 补充知识

 

根据传输协议的不同的,网卡可分为三种,一是以太网卡,二是FC网卡,三是iSCSI网卡。

 

1)以太网卡:学名Ethernet Adapter,传输协议为IP协议,一般通过光纤线缆或双绞线与以太网交换机连接。接口类型分为光口和电口。光口一般都是通过光纤线缆来进行数据传输,接口模块一般为SFP(传输率2Gb/s)和GBIC1Gb/s,对应的接口为SCSTLC。电口目前常用接口类型为RJ45,用来与双绞线连接,也有与同轴电缆连接的接口,不过现在已经用的比较少了。

2FC网卡:一般也叫光纤网卡,学名Fibre Channel HBA(Hose Bus Adapter: 主机总线适配器)。传输协议为光纤通道协议,一般通过光纤线缆与光纤通道交换机连接。接口类型分为光口和电口。光口一般都是通过光纤线缆来进行数据传输,接口模块一般为SFP(传输率2Gb/s)和GBIC1Gb/s,对应的接口为SCLC。电口的接口类型一般为DB9针或HSSDC

光纤网卡一般是指FC HBA卡,插在服务器上,外接存储用的光纤交换机;而光口的以太网卡一般都叫做光纤以太网卡,也是插在服务器上,不过它外接的是带光口的以太网交换机。

 

3ISCSI网卡Internet Small Computer System Interface, 学名ISCSI HBA,传输ISCSI协议,接口类型与以太网卡相同。 iSCSI(internet SCSI)是一套定义在TCP/IP网络上传输SCSI协议的命令。他将SCSI定义的发起方(initiator)和目标方(target)由原来的 SCSI总线连接扩展到internet上,打破了SCSI定义中的存储距离的限制。

 

 

FC SANIP SAN是目前两种流行的SAN存储方案:

1 SAN设备在连入系统后,表示为一个或多个target ID,它的逻辑分配单元即为LUN-Logical Unit Number(逻辑单元号)。

2IP SAN也称之为ISCSIinternet Small Computer System Interface)。

 

ISCSI技术的核心是在TCP/IP网络上传输SCSI协议,是指用TCP/IP报文、和ISCSI报文封装SCSI报文,使得SCSI命令和数据可以在普通以太网络上进行传输

 

 

了解上面的知识,现在来看一下Multipath Multipath除了上面提到的,实现LUN设备的持久化,它还有另一个功能,支持多路径轮询(提高 I/O负载能力)。 即可以通过多个网卡去访问Target 设备。 这样就提高了I/O的能力。 在生产环境中较多使用multipath实现LUN的持久化和多路径访问。

 

       注意, 这里有个问题,当我们配置了多session访问存储的target后,那么每个网卡都会生成一个/dev/sd*的设备。 这个在昨天的实验里已经有说明。昨天说的lun设备随即映射到可用的/dev/sd* 设备上,在这里一个lun 映射还可以到多个/dev/sd* 设备的问题。所以对LUN 设备的持久化是非常重要的。

但是每个target ID 是唯一的,在多session访问的条件下,不管一个lun映射到几个设备, 在配置Multipath的时候,我用的是target ID 这样就保证了target 的唯一性。

 

 

二. 安装配置

 

2.1 安装Multipath

查看相关包:

[root@rac1 ~]# rpm -qa|grep device-mapper

device-mapper-multipath-0.4.7-30.el5

device-mapper-event-1.02.32-1.el5

device-mapper-1.02.32-1.el5

 

如果没有安装,从系统的安装文件里找到这集个包:

device-mapper-1.02.32-1.el5.i386.rpm

device-mapper-event-1.02.32-1.el5.i386.rpm

device-mapper-multipath-0.4.7-30.el5.i386.rpm

 

安装很简单:

Rpm –Uvh device-mapper-*.rpm

 

说明:

1device-mapper-multipath

提供multipathdmultipath等工具和multipath.conf等配置文件。这些工具通过device mapperioctr的接口创建和配置multipath设备(调用device-mapper的用户空间库。创建的多路径设备会在/dev/mapper中)

 

2device-mapper

device-mapper包括两大部分:内核部分和用户部分。

内核部分device-mapper核心(multipath.ko)和一些target driverdm-multipath.ko)构成。dm-mod.ko是实现multipath的基础,dm-multipath其实是dm的一个target驱动。核心完成设备的映射,而target根据映射关系和自身特点具体处理从mappered device 下来的i/o。同时,在核心部分,提供了一个接口,用户通过ioctr可和内核部分通信,以指导内核驱动的行为,比如如何创建mappered device,这些device的属性等。

 

用户空间部分包括device-mapper这个包。其中包括dmsetup工具和一些帮助创建和配置mappered device的库。这些库主要抽象,封装了与ioctr通信的接口,以便方便创建和配置mappered devicedevice-mapper-multipath的程序中就需要调用这些库。

 

 

2.2 配置ISCSIsession访问

 

1iSCSI Initiator透过多个Session连入同1iSCSI Target设备,以便利用多网卡或iSCSI HBA启用负载平衡与故障失效切换机制,也可称作Multiple Sessions per Initiator

 

2.2.1 断开ISCSI登录状态

       [root@rac1 ~]# iscsiadm -m node -T iqn.2006-01.com.san -p 192.168.6.1 -u

Logging out of session [sid: 1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]

Logout of [sid: 1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful

 

-u 表示logout-l 表示login 具体可以用man iscsiadm 查看。

 

 

2.2.2新建访问接口文件

 

[root@rac1 ~]# iscsiadm -m iface -I iface0 --op=new

New interface iface0 added

[root@rac1 ~]# iscsiadm -m iface -I iface1 --op=new

New interface iface1 added

 

接口文件保存在/var/lib/iscsi/ifaces目录中

 

[root@rac1 ifaces]# cd /var/lib/iscsi/ifaces/

[root@rac1 ifaces]# ls

iface0  iface1

[root@rac1 ifaces]# cat iface0

# BEGIN RECORD 2.0-871

iface.iscsi_ifacename = iface0

iface.transport_name = tcp

# END RECORD

[root@rac1 ifaces]# cat iface1

# BEGIN RECORD 2.0-871

iface.iscsi_ifacename = iface1

iface.transport_name = tcp

# END RECORD

[root@rac1 ifaces]#

 

2.2.3 配置iface

 

[root@rac1 ifaces]# iscsiadm -m iface -I iface0 --op=update -n iface.net_ifacename -v eth0

iface0 updated.

[root@rac1 ifaces]# iscsiadm -m iface -I iface1 --op=update -n iface.net_ifacename -v eth1

iface1 updated.

 

 

2.2.4 确认iface配置

 

[root@rac1 ifaces]# iscsiadm -m iface

default tcp,<empty>,<empty>,<empty>,<empty>

iser iser,<empty>,<empty>,<empty>,<empty>

iface1 tcp,<empty>,<empty>,eth1,<empty>

iface0 tcp,<empty>,<empty>,eth0,<empty>

 

 

2.2.5 搜索ISCSI Target

 

[root@rac1 ifaces]# iscsiadm -m discovery -t st -p 192.168.6.1  -I iface0 -I iface1

192.168.6.1:3260,1 iqn.2006-01.com.san

192.168.6.1:3260,1 iqn.2006-01.com.san

 

 

2.2.6 建立与Target的连接

[root@rac1 ifaces]# iscsiadm -m node -l

Logging in to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]

Logging in to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]

Login to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful

Login to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful

 

注意事项:

删除失效的iscsi 连接:如果因为错误配置等原因创建了iscsi 对应,系统不会自动删除,需手动删除。

 

如:

[root@rac3 mapper]# iscsiadm -m node

192.168.6.1:3260,1 iqn.2006-01.com.san

192.168.6.1:3260,1 iqn.2006-01.com.san

 

我们看到上面有二个iscsi对应,加入这个对应已经失效,系统不会自动删除。

 

删除命名:

iscsiadm -m node -o delete -T iqn.2006-01.com.san -p 192.168.6.1:3260

 

 

2.2.7 查看连接状态

 

[root@rac1 ifaces]# netstat -anp |grep 3260

tcp        0      0 192.168.6.5:63327      192.168.6.1:3260     ESTABLISHED 2370/iscsid        

tcp        0      0 192.168.6.6:32380      192.168.6.1:3260     ESTABLISHED 2370/iscsid        

 

 

 

2.3 multipath的默认配置

 

Multipath的配置文件是:/etc/multipath.conf。该文件中大部分配置是注释掉的,可以将他保存为备用,然后新建一个multipath.conf 文件,编辑新的配置文件。

 

[root@rac1 etc]# cp multipath.conf multipath.conf.back

 

 

2.3.1 黑名单过滤

multipath会把所有设备都加入到黑名单(devnode "*"),也就是禁止使用。所以,我们首先需要取消该设置,把配置文件修改为类似下面的内容:

 

devnode_blacklist {
        #devnode "*"
        devnode "hda"
        wwid 3600508e000000000dc7200032e08af0b
}

 

这里禁止使用hda,也就是光驱。另外,还使用wwid限制使用本地的sda设备。

 

可通过下面的命令获得wwid

[root@rac1 ~]# /sbin/scsi_id -g -u -s /block/sdf

14f504e46494c450034594d6462472d534745442d6a714841

 

这里有redhat的一个bug,具体参考:

scsi_id does not return WWID for /dev/sda with aacraid driver

https://bugzilla.redhat.com/show_bug.cgi?id=445696

 

 

这里要有一点要注意的,就是要获取某个设备的wwid时,必须先确保用fdisk –l等看到这个设备。 如果没有看到,是获取不到的。 这时候可以尝试把iscsi initiator 重启一下,网卡禁用启用,最后在与target 连接:iscsiadm -m node –l

 

fdsk –l能看到设备了,我们可以正常获取设备的wwid了。

 

[root@rac1 ~]#  iscsiadm -m node -l

Logging in to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]

Logging in to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]

Login to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful

Login to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful

[root@rac1 ~]# fdisk –l

Disk /dev/sdf: 39.7 GB, 39795556352 bytes

64 heads, 32 sectors/track, 37952 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

 

Disk /dev/sdf doesn't contain a valid partition table

 

Disk /dev/sdg: 39.7 GB, 39795556352 bytes

64 heads, 32 sectors/track, 37952 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

 

[root@rac1 ~]# /sbin/scsi_id -g -u -s /block/sdf

14f504e46494c450034594d6462472d534745442d6a714841

[root@rac1 ~]# /sbin/scsi_id -g -u -s /block/sdg

14f504e46494c450034594d6462472d534745442d6a714841

 

 

关于:scsi_id

其包含在udev程序包中,可以在multipath.conf中配置该程序来获取scsi设备的序号。通过序号,便可以判断多个路径对应了同一设备。这个是多路径实现的关键。scsi_id是通过sg驱动,向设备发送EVPD page80page83 inquery命令来查询scsi设备的标识。但一些设备并不支持EVPD inquery命令,所以他们无法被用来生成multipath设备。但可以改写scsi_id,为不能提供scsi设备标识的设备虚拟一个标识符,并输出到标准输出。

 

multipath程序在创建multipath设备时,会调用scsi_id,从其标准输出中获得该设备的scsi id。在改写时,需要修改scsi_id程序的返回值为0。因为在multipath程序中,会检查该直来确定scsi id是否已经成功得到。

 

 

2.3.2 编辑默认规则

不同的device-mapper-multipath或操作系统发行版,其默认的规则都有点不同,以红旗 DC Server 5.0 SP2 for x86_64为例,其path_grouping_policy默认为failover,也就是主备的方式。HDS支持多路径负载均衡,EMC CX300等只支持Failover默认允许friendly_name,否则使用设备的wwid作为持久化名称. 我们修改默认的规则:

 

defaults {
       udev_dir                /dev
       path_grouping_policy    multibus
       failback                immediate
       no_path_retry           fail
       user_friendly_name      yes
}

 

 

2.3.3 配置multipath.conf 文件

 

我们通过多session来访问target 这样有2个设备/dev/sdf /dev/sdg 其实他们都对应一个target 通过上面的查询知道,他们的wwid是一样的。 我们就用这个wwid,把他们配置到一起,当成一个设备。在该文件最后添加如下内容。

 

[root@rac1 ~]#cat /etc/multipath.conf|more

multipaths {

        multipath {

wwid    14f504e46494c450034594d6462472d534745442d6a714841

alias                   rac-share

          path_grouping_policy    multibus

          path_checker            readsector0

          path_selector           "round-robin 0"

          failback                manual

          rr_weight               priorities

          no_path_retry           5

                  }

         }

 

一个target 对应一个multipath. 如果有多个target 就写多个multipath 选项。

 

 

2.3.4 重启multipathd 服务,验证配置

 

[root@rac1 dev]# service multipathd restart

Device /dev/sda1 not found

Command failed

Stopping multipathd daemon: [  OK  ]

Starting multipathd daemon: [  OK  ]

 

 

进入/dev/mapper 目录进行验证:

root@rac3 mapper]# ls -lrt /dev/mapper/*

crw------- 1 root root  10, 62 Nov  1 05:51 /dev/mapper/control

brw-rw---- 1 root disk 253,  0 Nov  1 06:20 /dev/mapper/rac-share

 

 

multipath ll 命令查看到两条活跃路径,他们之间互为A/A 关系。断掉其中一根线路,那么系统自动切换到另外一条。

[root@rac3 mapper]# multipath -ll

rac-share (14f504e46494c450034594d6462472d534745442d6a714841) dm-0 OPNFILER,VIRTUAL-DISK

[size=37G][features=1 queue_if_no_path][hwhandler=0][rw]

/_ round-robin 0 [prio=2][active]

 /_ 2:0:0:0 sdf 8:80  [active][ready]

 /_ 3:0:0:0 sdg 8:96  [active][ready]

 

 

2.3.5 multipathd服务设置成开机自启动

[root@rac3 mapper]# chkconfig multipathd on

 

 

2.3.6 分区或者创建PV

看到了我们刚才配置的多路径的目录。 但是这里有一个问题。 因为这个是设备创建的,还不能挂载。我们需要对个这个设备进行分区或者创建为PV.

 

注意,用fdisk分区并保存后,必须刷新multipath的映射表,以便其创建分区对应的设备符.

 

(1)分区

 

[root@rac3 mapper]# fdisk /dev/mapper/rac-share

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel. Changes will remain in memory only,

until you decide to write them. After that, of course, the previous

content won't be recoverable.

 

The number of cylinders for this disk is set to 4838.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

   (e.g., DOS FDISK, OS/2 FDISK)

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

 

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-4838, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-4838, default 4838):

Using default value 4838

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

 

WARNING: Re-reading the partition table failed with error 22: Invalid argument.

The kernel still uses the old table.

The new table will be used at the next reboot.

Syncing disks.

 

[root@rac3 mapper]# multipath -F   --清除多路径设备缓存

[root@rac3 mapper]# multipath –v3  --重新加载

[root@rac3 mapper]# fdisk -l

……

Disk /dev/sdf: 39.7 GB, 39795556352 bytes

255 heads, 63 sectors/track, 4838 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdf1               1        4838    38861203+  83  Linux

 

Disk /dev/sdg: 39.7 GB, 39795556352 bytes

255 heads, 63 sectors/track, 4838 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdg1               1        4838    38861203+  83  Linux

 

Disk /dev/dm-0: 39.7 GB, 39795556352 bytes

255 heads, 63 sectors/track, 4838 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

     Device Boot      Start         End      Blocks   Id  System

/dev/dm-0p1               1        4838    38861203+  83  Linux

 

分区之后使用fdisk –l 命令查看磁盘会看到磁盘下面已经有分区的信息了。 这时磁盘就可以mount挂载及使用了。

 

 

2 创建PV

 

要配置LVM,可以按以下步骤进行:

1.   创建和初始化物理卷(Physical Volume),通过pvcreate建立pv,即pv阶段;

2.   添加物理卷到卷组(Volume Group),使用vgcreate加入多个pv成为vg,即vg阶段;

3.  在卷组上创建逻辑卷(logical volume),使用lvcreate划分vg,成为一个或多个lv,lv阶段;

 

常用命令:

# pvcreate /dev/md0      #创建PV

# pvscan

# vgcreate LVM1 /dev/md0  #创建VG

# vgdisplay  LVM1  

# lvcreate -L 1.5TB -n data1 LVM1     #创建LV

# lvcreate -L 325GB -n data2 LVM1   #创建LV

# lvscan                   #查看LV信息

# pvscan                  #再次查看PV信息

# vgdisplay LVM1       #再次查看VG信息

 

 

挂载命令:

#mount /dev/LVM1/data1 /data1

#mount /dev/LVM1/data2 /data2

 

设置开机自动挂载:

编辑/etc/fstab

/dev/LVM1/data1         /data1                  ext3    defaults        2 2

/dev/LVM1/data2         /data2                  ext3    defaults        2 2

 

 

示例:

 

[root@rac3 mapper]# pvcreate /dev/mapper/rac-share

  Physical volume "/dev/mapper/rac-share" successfully created

[root@rac3 mapper]# vgcreate vg0 /dev/mapper/rac-share

  Volume group "vg0" successfully created

[root@rac3 mapper]# lvcreate -L 10M -n lv1 vg0

  Rounding up size to full physical extent 12.00 MB

  Logical volume "lv1" created

[root@rac3 mapper]# lvdisplay

  --- Logical volume ---

  LV Name                /dev/vg0/lv1

  VG Name                vg0

  LV UUID                XkbDyS-btpZ-fIFA-MvBH-d4kl-hibU-RhuKu1

  LV Write Access        read/write

  LV Status              available

  # open                 0

  LV Size                12.00 MB

  Current LE             3

  Segments               1

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           253:1

[root@rac3 mapper]# mkfs.ext3 /dev/mapper/vg0-lv1   -- 格式化

mke2fs 1.39 (29-May-2006)

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

3072 inodes, 12288 blocks

614 blocks (5.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=12582912

2 block groups

8192 blocks per group, 8192 fragments per group

1536 inodes per group

Superblock backups stored on blocks:

        8193

 

Writing inode tables: done                           

Creating journal (1024 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 28 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

 

 

注意:

有部分multipath版本存在与lvm兼容的问题。当使用device-mapper设备创建lvm完成,重启后,虽然lvm仍存在,但/dev/mapper下的设备丢失。可以参考:

https://bugs.launchpad.net/ubuntu/+source/multipath-tools/+bug/230006

 

解决方法:

/etc/lvm/lvm.conf文件中加入:

types=["device-mapper", 1]

 

 

 

整理自网络

------------------------------------------------------------------------------

QQ: 492913789
Email:ahdba@qq.com
Blog:http://www.cndba.cn/dave

网上资源: http://tianlesoftware.download.csdn.net

相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1 群:62697716(); DBA2 群:62697977()

DBA3 群:62697850   DBA 超级群:63306533;    

聊天 群:40132017

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

这篇关于Multipath实现LUN设备名称的持久化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874728

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机