当前位置: 首页 > news >正文

Linux NameSpace 虚拟化 资源隔离

NameSpace

NameSpace介绍

在操作系统中命名空间命名空间提供的是系统资源的隔离,其中系统资源包括了:进程、网络、文件系统等等

  • 实际上linux系统实现命名空间主要目的之一就是为了实现轻量级虚拟化服务,也就是我们说的容器,在同一个命名空间下的进程可以感知彼此的变化,而对其他命名空间的进程一无所知,这样就可以让容器中的进程产生一个错觉,仿佛它自己置身于一个独立的系统环境当中,以此达到独立和隔离的目的。

Linux的namespace(名字空间)的作用就是“隔离内核资源”。

在Linux的世界里,

文件系统挂载点、

主机名、

POSIX进程间通信消息队列、

进程PID数字空间、

IP地址、

user ID数字空间等全局系统资源被namespace分割,装到一个个抽象的独立空间里。

而隔离上述系统资源的namespace分别是Mount namespace、UTS namespace、IPC namespace、PID namespace、network namespace和user namespace。

对进程来说,要想使用namespace里面的资源,首先要“进入”(具体操作方法,下文会介绍)到这个namespace,而且还无法跨namespace访问资源。

Linux的namespace给里面的进程造成了两个错觉:

(1)它是系统里唯一的进程。

(2)它独享系统的所有资源。

默认情况下,Linux进程处在和宿主机相同的namespace,即初始的根namespace里,默认享有全局系统资源

namespace分类

namespace针对不同资源有不同的隔离方案和实现.

资源描述实现思路
进程隔离进程IDLinux通过命名空间管理进程号,同一个进程,在不同的命名空间进程号不同. 进程命名空间是一个父子结构,子空间对于父空间可见
网络隔离网络设备、协议栈、端口等通过网络命名空间,实现网络隔离 docker采用虚拟网络设备,将不同命名空间的网络设备连接到一起
IPC隔离进程间通信进程间交互方法 PID命名空间和IPC命名空间可以组合起来用, 同一个IPC名字空间内的进程可以彼此看见,允许进行交互,不同空间进程无法交互
磁盘隔离挂载点隔离文件目录 进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高
UTS隔离Hostname和NIS域名让容器拥有独立的主机名和域名,从而让容器看起来像个独立的主机 目的是独立出主机名和网络信息服务(NIS)
用户隔离用户和group ID每个容器内上的用户跟宿主主机上不在一个命名空间 同进程 ID 一样,用户 ID 和组 ID 在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的 ID

NameSpace隔离原理

NameSpace怎么实现隔离的?

它是Linux内核级别支持的.

Linux内核自2.4.19版本接纳第一个namespace:Mount namespace(用于隔离文件系统挂载点)起,到3.8版本的user namespace(用于隔离用户权限),总共实现了上文提到的6种不同类型的namespace。

尽管Linux的namespace隔离技术很早便存在于内核中,而且它就是为Linux的容器技术而设计的,但它一直鲜为人知。直到Docker引领的容器技术革命爆发,它才进入普罗大众的视线——Docker 容器作为一项轻量级的虚拟化技术,它的隔离能力来自Linux内核的namespace技术

Network Namespace

它在Linux内核2.6版本引入,作用是隔离Linux系统的设备,以及IP地址、端口、协议栈/路由表、防火墙规则等网络资源。因此,每个网络namespace里都有自己的网络设备(如IP地址、路由表、端口范围、/proc/net目录等)。从网络的角度看,network namespace使得容器非常有用,一个直观的例子就是:由于每个容器都有自己的(虚拟)网络设备,并且容器里的进程可以放心地绑定在端口上而不必担心冲突,这就使得在一个主机上同时运行多个监听80端口的Web服务器变为可能

以下是网络命名空间如何实现这些隔离的简单概述:

  1. 网络设备隔离:每个网络命名空间都可以有自己的网络设备(网卡)。同一网络设备不能同时出现在多个命名空间中,但可以通过veth(Virtual Ethernet)设备对或者macvlan等技术,在不同的网络命名空间之间建立网络连接。当网络设备移动到另一网络命名空间时,对于原命名空间,该设备就像是被移除了一样。

  2. 协议栈隔离:网络协议栈是操作系统实现网络协议(如TCP/IP)的一部分,它处理如何发送和接收数据包。Linux的每个网络命名空间都有自己的网络协议栈,它们是彼此独立的。这意味着,网络配置(如IP地址、路由规则、防火墙规则等)在一个命名空间中的改变不会影响其他命名空间。

  3. 端口隔离:在网络命名空间中,端口是隔离的。每个网络命名空间都有自己的端口范围和端口分配。例如,不同的网络命名空间都可以使用相同的端口号(如80),而不会发生冲突,因为它们在不同的命名空间中。

这样,网络命名空间使得我们可以创建多个隔离的网络环境,每个网络环境都可以有自己的网络设备、IP地址、路由规则和其他网络配置。这在创建容器等隔离环境时非常有用。

  • 在 Linux 中,网络命名空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络命名空间经常用来隔离网络设备和服务,只有拥有同样网络命名空间的设备,才能看到彼此。几乎所有物理存在的都可以进行虚拟虚拟局域网,虚拟MAC地址,虚拟交换机,虚拟网络层,虚拟链路层等等各个维度的,具体支持的类型可以在 ip netns的bash shell中查看 man ip-link

    • 网络设备: 如网卡

    • 路由转发表

    • iptables

    • 邻接表

    • netfilter表

    • 网络套接字

    • 网络procfs条目

    • 网络sysfs条目

    • 其他网络资源

  • 从逻辑上说,网络命名空间是网络栈的副本,拥有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。

  • 从系统实现角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。

  • 从用户交互API角度来看,我们只需使用工具ip(package is iproute2)来创建一个新的持久网络命名空间。

 

网络命名空间管理

创建

ip netns add netns01

这个命令ip netns add netns01用于在Linux系统中添加一个新的网络命名空间,具体解释如下:

  1. ip: 这是Linux系统的一个常用命令,用于显示或操作路由、设备、策略路由和隧道。

  2. netns: 是ip命令的子命令,用于管理网络命名空间。网络命名空间(Network Namespace)是Linux内核的一个功能,用于隔离网络环境,例如隔离网络设备、IP地址、路由表等。

  3. add: 是netns的子命令,用于添加一个新的网络命名空间。

  4. netns01: 这是新建网络命名空间的名称。

创建的网络命名空间在文件系统中以文件的形式存在,位于/var/run/netns/目录下。

# ll /var/run/netns/
total 0
-r--r--r--. 1 root root 0 Jul 28 23:33 netns01

使用说明和注意事项:

  • 在运行ip netns add命令之前,你需要确保ip命令有足够的权限(需要root权限)来创建新的网络命名空间。

  • 网络命名空间创建后,可以使用ip netns exec netns01 command命令在新的网络命名空间中执行命令。例如,ip netns exec netns01 ip link set lo up可以在新的网络命名空间中启用lo(loopback)设备。

  • 当不再需要网络命名空间时,可以使用ip netns del netns01命令来删除它。

  • 注意,创建的网络命名空间是隔离的,新的网络命名空间并不会自动拥有任何网络设备,包括lo(loopback)设备,这些设备需要在新的网络命名空间中手动创建和启用。

  • 在操作网络命名空间时需要小心,不正确的操作可能会导致网络问题,例如错误地删除或修改网络设备、IP地址或路由规则等。在生产环境下操作时,应遵循最佳实践,并在可能的情况下进行充分的测试。

查看

网络命名空间

ip netns ls

ip netns identifyip netns ls

ip netns identifyip netns ls 这两个命令在功能和用途上有很大的不同。

  1. ip netns identify:此命令用于查找并打印与给定进程相关联的所有网络命名空间的名称。例如,ip netns identify 1234 将列出与进程ID为1234相关的所有网络命名空间的名称。

  2. ip netns ls:此命令列出系统上存在的所有网络命名空间的名称。这并不涉及任何特定的进程,而是给出了系统当前的所有网络命名空间。

删除

ip netns del

ip netns del netns01
ip netns ls

上面这条命令实际上并没有删除netns1这个network namespace,它只是移除了这个network namespace对应的挂载点。只要里面还有进程运行着,network namespace便会一直存在。

进入

进入空间及执行命令

ip netns add netns01
ip netns exec netns01 bash

ip netns exec netns01 bash命令是在创建的网络命名空间netns01内执行bash shell的命令。在这个命令中:

  • 执行完bash之后其实就是启动了一个bash shell,后续的操作都是在这个shell空间中进行了,但是注意没有提示,你需要先退出才能退回到os的shell

  • ip netns exec是命令的前缀,用于在指定的网络命名空间执行后面的命令。

  • netns01是网络命名空间的名称。

  • bash是要执行的命令。它启动了一个bash shell,该shell会在netns01命名空间中运行。这意味着在这个bash shell中执行的所有命令,都会在netns01命名空间中运行。

除了bash,ip netns exec后面可以接任何命令,例如:

  • ip netns exec netns01 ip addr:在netns01网络命名空间中查看网络接口的IP地址。

  • ip netns exec netns01 ping 8.8.8.8:在netns01网络命名空间中ping一个IP地址。

注意事项:

  • 在使用ip netns exec命令时,你需要root权限。

  • ip netns exec会改变命令的网络命名空间上下文,但不会改变其他的命名空间上下文,例如PID命名空间、用户命名空间等。如果你需要在完全隔离的环境中运行命令,你可能需要使用其他工具,例如unshare或docker。

  • 你需要确保你在正确的网络命名空间中运行命令。在错误的网络命名空间中运行命令可能会导致网络问题或者数据丢失。如果你不确定,你可以使用ip netns identify命令来查看当前的网络命名空间。

  • ip netns exec命令在运行命令时会更改网络命名空间。如果你在一个脚本中使用ip netns exec,你需要确保这个脚本不会在改变命名空间后的命令失败时继续执行,否则后续的命令可能会在错误的网络命名空间中运行。

空间内指令

在进入命名空间的bash shell上下文后,你就有一个空间内的shell环境了

查看网卡

# 在网络命名空间中查看网络命名空间中的网卡信息
ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# 可以看到目前处于DOWN状态# 在Linux主机系统中查看
ip netns exec netns01 ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

当你执行 ip netns exec netns01 bash 并进入到网络命名空间的 bash shell 之后,你可以执行的操作就和在任何 Linux shell 中一样广泛。然而,因为你现在在一个特定的网络命名空间内,所以所有的网络相关的操作都将局限于这个网络命名空间。以下是一些可能的操作:

  1. 网络配置:使用 ipifconfigroutenetstat 等命令查看和更改网络配置。例如,你可以使用 ip addr 来查看网络接口的 IP 配置。注意事项:因为你在特定的网络命名空间中,所以你看到的将仅仅是在这个命名空间内的网络配置。

  2. 网络通信:使用 pingtraceroutenctelnetssh 等命令来测试网络连接或者进行网络通信。注意事项:你只能够连接到在同一命名空间内,或者是可以路由到的网络实体。

  3. 网络服务:你可以启动或停止在特定网络命名空间内运行的网络服务,如 HTTP 服务器、FTP 服务器等。注意事项:这些服务只能在此网络命名空间内访问,除非进行了特殊配置。

  4. 系统命令:你可以执行像 lscatvitop 这样的系统命令,它们和网络无关。注意事项:这些命令的执行不受网络命名空间的影响。

退出空间

# 退出已进入的网络命名空间
exit

配置虚拟网卡

如果没有网卡那是无法通信的,所以容器也需要配置网卡,虚拟网卡.

对容器来说需要创建一对网卡.因为一个网卡是容器的一个是物理机的,容器需要连接到物理机的网卡才能对外通信

创建
ip link add veth01 type veth peer name veth10
ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
10: veth10@veth01: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000link/ether 06:6e:31:5e:f3:19 brd ff:ff:ff:ff:ff:ff
11: veth01@veth10: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000link/ether 9a:77:14:b4:99:dd brd ff:ff:ff:ff:ff:ff
​
# 可以直接指定空间
netns <netns>:这个选项允许你直接将新创建的veth对的一端移动到指定的网络命名空间。例如,
ip link add veth0 type veth peer name veth1 netns mynetns
将会创建一个veth对veth0和veth1,其中veth1会被放入到名为mynetns的网络命名空间。
迁移

ip link set veth01 netns netns01从空间1移动到空2# 进入源(netns01)网络命名空间执行
ip link set veth10 netns netns02
​
# 宿主机执行 netns01移动到netns02
ip netns exec netns01 ip link set veth10 netns netns02# 创建到目标空间
ip link add veth01 type veth peer name veth10 netns netns01
# 查看本地
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000link/ether 00:0c:29:c6:03:83 brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT qlen 1000link/ether 52:54:00:04:70:ac brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT qlen 1000link/ether 52:54:00:04:70:ac brd ff:ff:ff:ff:ff:ff
5: veth01@if12: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000link/ether f2:53:c0:3b:ef:f2 brd ff:ff:ff:ff:ff:ff link-netnsid 0# 查看目标空间
ip netns exec netns01 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
12: veth10@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000link/ether 5a:50:9d:01:dc:cc brd ff:ff:ff:ff:ff:ff link-netnsid 0
移出
# 在netns01命名空间执行删除
ip link delete veth01
或者执行
ip link delete veth10
# 都是成对删除, 删除任何一个,另一个也会被删除
​
# 或者宿主机bash执行
ip netns exec netns01 ip link delete veth10
​
# 查看
ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
删除
ip link delete veth10
# 自动成对删除

配置地址

配置地址

ip addr add 172.16.193.233/24 dev veth10

查看地址

ip addr show

此时状态是DOWN,需要up启动状态

启动

ip link set veth10 up
ip addr show

启动lo回环网卡

ip link set lo up

此时还是不通的,为什么?

因为这个成对的网卡,另外一个还没有地址

宿主机执行

6: veth01@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether e6:1e:9b:28:c5:6a brd ff:ff:ff:ff:ff:ff link-netnsid 1

配置成对地址

宿主机分配IP

ip addr add 172.16.193.234/24 dev veth01
# 宿主机不需要执行up,当你执行其中一个虚拟网卡up的时候 另一个网卡也是up的 
# 执行up之后直接退出了, 且重启之后netns都消失了
client_loop: send disconnect: Broken pipe

ping验证

宿主机ping网络空间虚拟网卡

ping 172.16.193.233

配置路由条目

ip netns exec netns01 ip route add default via 172.16.193.233

网络空间虚拟网卡ping宿主机

ip netns exec netns01 ping -c 4 172.16.193.133
配置路由

通过查看虚拟网卡的路由表

ip netns exec netns01 route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.50.0    0.0.0.0         255.255.255.0   U     0      0        0 veth1

我们看到它智能到达50网段的出口,没有外网出口,即它无法访问外网

ip netns exec netns01 ping -c 1 www.baidu.com

通过ping可以看到是不通.

那我们就要思考怎么才能联通外网呢,只能利用成对的虚拟网卡,因为那个网卡是在宿主机上,是可以出外网的

所以我们可以在命名空间的虚拟网卡配置下路由,让他联通成对虚拟网卡

ip netns exec netns01 ip route add default via 192.168.50.3
ip netns exec netns01 route -n
---
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.50.3    0.0.0.0         UG    0      0        0 veth1
192.168.50.0    0.0.0.0         255.255.255.0   U     0      0        0 veth1
[root@centos133 ~]#

配置了这个路由还不行,还是没法转发出去

配置脚本

ip netns add netns01
ip link add veth0 type veth peer name veth1
ip link set veth1 netns netns01
ip netns exec netns01 ip addr add 192.168.30.2/24 dev veth1
ip netns exec netns01 ip link set veth1 up
ip netns exec netns01 ip link set lo up
ip addr add 192.168.30.3/24 dev veth0
ip link set veth0 up
ip netns exec netns01 ip route add default via 192.168.30.3
# ping 虚拟机
ping -c 1 172.16.193.133
# ping 虚拟机 veth0
ping -c 1 192.168.30.3
# 在宿主机上ping netns01 中的veth1
ping -c 1 192.168.50.76
# 增加ipv4转发,主要是能访问外网主机
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

相关文章:

Linux NameSpace 虚拟化 资源隔离

NameSpace NameSpace介绍 在操作系统中命名空间命名空间提供的是系统资源的隔离&#xff0c;其中系统资源包括了&#xff1a;进程、网络、文件系统等等 实际上linux系统实现命名空间主要目的之一就是为了实现轻量级虚拟化服务&#xff0c;也就是我们说的容器&#xff0c;在同…...

【Android Framework系列】第9章 AMS之Hook实现登录页跳转

1 前言 前面章节我们学习了【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcher启动流程&#xff0c;大概了解了AMS的原理及启动流程&#xff0c;这一章节我们通过反射和动态代理对不同Android版本下的AMS进行Hook&#xff0c;实现…...

哪些行业需要连接云专线?

在诸多行业之中&#xff0c;有一些行业对数据安全性要求高、业务需要实时性、业务需求复杂&#xff0c;往往需要建立起私密、高速、安全的传输通道&#xff0c;云专线是他们经常采用的方案。具体来讲&#xff0c;都有哪些行业需要连接云专线呢&#xff1f;请见下方。 1、金融行…...

【Mysql】group语句删除重复数据只保留一条

【Mysql】group语句删除重复数据只保留一条 【一】案例分析 假如在数据初始化的时候&#xff0c;insert脚本执行了两次&#xff0c;导致表里的数据都是重复的&#xff08;没有设置唯一键&#xff09;。这个时候再加上mybatis-plus的selectOne方法&#xff0c;就会出现报错。因…...

Git详解和命令大全

目录 一、Git 的基本概念二、Git 的安装和使用三、Git 的版本分支管理四、Git 的命令大全1. 常用命令2. 命令大全 五、版本分支管理的最佳实践六、Git 实践七、高级特性八、Git 的未来发展 Git 是一款开源的分布式版本控制系统&#xff0c;可以有效地处理从小到非常大的项目版本…...

北漂Java程序员入职五个月的收获总结

&#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;Java程序员的成长 &#x1f468;‍&#x1f4bb;上一篇文章&#xff1a;告别过去&#xff0c;拥抱未来&#xff1a;一个Java开发者的成长之路 &#x1f468;‍&a…...

Android系统的进程管理(创建->优先级->回收)

一、进程的创建 1、概述 Android系统以Linux内核为基础&#xff0c;所以对于进程的管理自然离不开Linux本身提供的机制。例如&#xff1a; 通过fork来创建进行通过信号量来管理进程通过proc文件系统来查询和调整进程状态 等 对于Android来说&#xff0c;进程管理的主要内容…...

C#界面美化小技巧

1.窗体设置为无边框 FormBorderStyle的属性设置为none 2.窗体无边框&#xff0c;可以拖拽 private Point mPoint new Point(); private void Download_MouseDown(object sender, MouseEventArgs e) { mPoint.X e.X; mPoint.Y e.Y; …...

‘vite‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

1.切换到工程目录下 2.执行npm install(最关键的一步了&#xff01;&#xff01;) 3. 最后直接运行&#xff1a;npm run dev 4.浏览器直接打开就行了&#xff01;...

Linux下查阅帮助文档必学命令 man

Linux操作系统的使用中,我们经常会遇到很多问题,这个时候查询文档的能力至关重要,黄老师来推荐大家使用man,这时我们必须掌握的查阅能力: 最常用的命令: man 名称 man 数字(1~9) 名称 这里的数字分别代表:...

uniapp scroll-view显示滚动条

在style中添加样式&#xff1a; ::v-deep ::-webkit-scrollbar {/* 滚动条整体样式 */display: block;width: 10rpx !important;height: 10rpx !important;-webkit-appearance: auto !important;background: transparent;overflow: auto !important;}::v-deep ::-webkit-scroll…...

15、PHP神奇的数组索引替代

1、有数字索引指定的数组元素时&#xff0c;以数字索引的为准。 <?php $aarray(a,b,1>c,5>"d","e"); print_r($a); ?> 输出结果&#xff1a;b的位置直接被c替代了&#xff0c;e 的值为最大的整数索引1。 PHP不这么搞&#xff0c;怎么可能成…...

同为科技(TOWE)带热插拔功能机柜PDU插座的应用

所谓热插拔&#xff08;hot-plugging或Hot Swap&#xff09;&#xff0c;即带电插拔&#xff0c;指的是在不关闭系统电源的情况下&#xff0c;将模块、板卡插入或拔出系统而不影响系统的正常工作&#xff0c;从而提高了系统的可靠性、快速维修性、冗余性和对灾难的及时恢复能力…...

GR5526 128BIT UUID改16BIT UUID

以下两个宏定义是我添加的。其中USING_128BIT_UUID的条件编译部分是SDK原生部分&#xff0c;USING_16BIT_UUID条件编译部分则是由我修改&#xff0c;通过这样的修改&#xff0c;128BIT UUID就变更为16BIT UUID了。如果你的广播、扫描响应有涉及UUID&#xff0c;不要忘记更改它。…...

【Android】使用 CameraX 实现基础拍照功能

目录 目录 1. 基础开发环境 2. 添加相关依赖 3. APP 布局 4. 主流程逻辑 5. 调试或安装 APK 1. 基础开发环境 JDK&#xff1a;JDK17 Android Studio&#xff1a;Android Studio Giraffe | 2022.3.1 Android SDK&#xff1a;Android API 34 Gradle: gradle-7.2-bin.zip Ca…...

刷题笔记 day2

力扣 1089 复写零 思路&#xff1a;双指针 第一步&#xff1a;利用指针 cur 去记录最后一位要复写的数 &#xff0c; 利用指针 dest 指向最后一位数所要复写的位置&#xff1b; 实现过程&#xff1a;最开始 cur 指向0&#xff0c;dest 指向 -1 &#xff0c; 当arr[cur] ! …...

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-LS…...

使用UltraISO制作麒麟v10系统盘

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录 1 背景2 准备工作2.1 镜像准备2.2 制作工具2.3 启动U盘 3 制作步骤3.1 找到ISO文件&#xff0c;右…...

【RabbitMQ】之消息的可靠性方案

目录 一、数据丢失场景二、数据可靠性方案 1、生产者丢失消息解决方案2、MQ 队列丢失消息解决方案3、消费者丢失消息解决方案 一、数据丢失场景 MQ 消息数据完整的链路为&#xff1a;从 Producer 发送消息到 RabbitMQ 服务器中&#xff0c;再由 Broker 服务的 Exchange 根据…...

性能测试/负载测试/压力测试之间的区别

做测试一年多来&#xff0c;虽然平时的工作都能很好的完成&#xff0c;但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺&#xff0c;所以&#xff0c;在工作之余也做了一些测试方面的知识的补充。不足之处&#xff0c;还请大家多多交流&#xff0c;互相学习。 …...

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下&#xff1a; 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例&#xff0c;穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…...

sonarqube PHP编码规范检查

一、PSR规范整理 PHP 已有的编码规范如下 https://blog.csdn.net/qq_40876291/article/details/103848172 1.1 基本编码规范&#xff1a;PSR1 官网规范链接 https://www.php-fig.org/psr/psr-1/ 文件只能使用<?php和<?标记。文件必须仅使用UTF-8&#xff0c;而不使…...

Kylin 麒麟 Qt软件 QtCreator 中文输入法问题

Kylin 麒麟 Qt软件 QtCreator 中文输入法问题 背景&#xff1a; QtCreator 和程序在麒麟系统下没法进行输入&#xff0c;或没法进行输入法的切换。 包括麒麟自带默认搜狗输入法的切换也不行。 使用下面的命令进行安装后&#xff0c;可以正常在QtCreator和程序中使用输入法。 …...

租赁固定资产管理

智能租赁资产管理系统可以为企业单位提供RFID资产管理系统。移动APP资产管理&#xff0c;准确总结易损耗品和固定资金&#xff0c;从入库到仓库库存实时跟踪&#xff0c;控制出库和入库的全过程。同时&#xff0c;备件和耗材与所属资产设备有关&#xff0c;便于备件的申请和管理…...

【Kubernetes】Kubernetes的概念

Kubernetes 一、Kubernetes 概述1.Kubernetes 是什么?2. Kubernetes 的作用3. 为什么要用 Kubernetes?4. Kubernetes 的概念5. Kubernetes 的主要功能6. Kubernetes 集群架构与组件二、Kubernetes 的组件1. Master 组件1.1 Kube-apiserver1.2 Kube-controller-manager1.3 Kub…...

抖音短视频seo源码矩阵系统开发

一、前言&#xff1a; 抖音SEO源码矩阵系统开发是一项专为抖音平台设计的SEO优化系统&#xff0c;能够帮助用户提升抖音视频的搜索排名和曝光度。为了确保系统运行正常&#xff0c;需要安装FFmpeg和FFprobe工具。FFmpeg是一个用于处理多媒体数据的开源工具集&#xff0c;而FFpr…...

npm install pnpm -g报错解决!

目录 报错信息&#xff1a;&#xff08;反正就是各种err&#xff09; 报错分析&#xff1a; 错误处理&#xff1a; 其它pnpm报错传送门&#xff1a; 报错信息&#xff1a;&#xff08;反正就是各种err&#xff09; npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! pa…...

vue2、vue3生命周期详解以及对比

文章目录 对比vue2-vue3vue3生命周期生命周期的主要阶段详情 vue2 生命周期生命周期钩子函数 总共11个 常用的8个按照这四个阶段我们对应有八个生命周期钩子函数vue生命周期使用场景 对比vue2-vue3 如果熟悉vue2的话&#xff0c;vue3信手拈来&#xff0c;看图 vue3生命周期 on…...

JSON动态生成表格

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>var fromjava"{\"total\":3,\"students\":[{\"name\":\"张三\",\&q…...

C# Winform中使用SendMessage方法(发送消息与接收消息)

C# Winform窗口间消息通知&#xff0c;使用Windows API SendMessage方法跨进程实现消息发送&#xff0c;重写WndProc方法接收消息并消息处理 主要使用到如下三个方法函数&#xff1a; WndProc&#xff1a;主要用在拦截并处理系统消息和自定义消息 可以重写WndProc函数&#xf…...