KVM虚拟化技术
一、KVM虚拟化技术基础
1.1 KVM虚拟化技术简介
KVM,即基于内核的虚拟机(Kernel - based Virtual Machine),是一种基于Linux内核实现的开源虚拟化技术,从Linux 2.6.20版本开始被合入kernel主分支维护。它将Linux内核转变为一个虚拟机监控程序(Hypervisor),使得主机计算机能够运行多个隔离的虚拟环境,即虚拟机(VM) 。在这种架构下,KVM本身主要负责虚拟CPU和内存的管理,而设备模拟等功能则由用户态的QEMU(Quick Emulator)来实现。二者通过/dev/kvm接口进行交互,共同完成完整的虚拟化功能。
KVM虚拟化技术允许在一台物理主机上创建多个虚拟机,每个虚拟机都可以独立运行不同的操作系统,并且这些虚拟机之间相互隔离,如同运行在独立的物理机上一样。例如,在一台安装了支持虚拟化技术CPU的物理服务器上,通过KVM可以同时运行Windows Server、Linux等多种操作系统的虚拟机,满足不同应用场景的需求。这种基于Linux内核的虚拟化方式,充分利用了Linux内核在进程管理、内存管理、设备驱动等方面的成熟机制,具有较高的性能和稳定性 。
1.2 KVM虚拟化技术架构
1.2.1 KVM内核模块
KVM内核模块作为KVM虚拟化技术的核心组件,在整个虚拟化架构中扮演着举足轻重的角色。它是标准Linux内核的一部分,专门为虚拟化功能而设计 。该模块主要负责CPU和内存的虚拟化,为虚拟机的运行提供了最基础的支持。
在CPU虚拟化方面,KVM内核模块能够创建并管理虚拟CPU(vCPU)。它通过与物理CPU的交互,实现了vCPU的调度和执行。具体来说,当虚拟机需要执行指令时,KVM内核模块会将vCPU映射到物理CPU的核心上,使得虚拟机能够高效地利用物理CPU的计算资源。例如,在一个具有多个物理CPU核心的服务器上,KVM可以根据虚拟机的负载情况,动态地将vCPU分配到不同的物理核心上,从而提高整体的计算性能。同时,KVM内核模块还支持多种CPU架构,如x86、ARM等,这使得它能够适应不同硬件平台的虚拟化需求。
内存虚拟化也是KVM内核模块的重要职责。它负责为虚拟机分配和管理内存,确保每个虚拟机都能获得足够的内存资源,并且各个虚拟机之间的内存相互隔离,不会出现数据泄露或干扰的情况。KVM内核模块通过页表机制,将虚拟机的虚拟内存地址映射到物理内存地址,实现了内存的高效管理。例如,当虚拟机需要访问内存时,KVM内核模块会根据页表信息,将虚拟地址转换为物理地址,从而让虚拟机能够正确地读取和写入数据。此外,KVM内核模块还支持内存的动态调整,在虚拟机运行过程中,根据实际需求增加或减少分配给虚拟机的内存大小,进一步提高了内存资源的利用率。
KVM内核模块还包括与虚拟化相关的其他功能,如中断处理、设备管理等。在中断处理方面,它能够有效地处理虚拟机内外的中断请求,确保虚拟机的正常运行。当外部设备产生中断信号时,KVM内核模块会将中断信号传递给相应的虚拟机,让虚拟机能够及时响应外部事件。在设备管理方面,KVM内核模块为虚拟机提供了基本的设备抽象,使得虚拟机能够像访问物理设备一样访问虚拟设备。虽然设备模拟的具体功能主要由用户空间工具QEMU来实现,但KVM内核模块为其提供了必要的支持和接口。
1.2.2 用户空间工具(QEMU、Libvirt等)
用户空间工具在KVM虚拟化技术中起着不可或缺的作用,它们与KVM内核模块相互协作,共同实现了完整的虚拟化功能。在众多用户空间工具中,QEMU和Libvirt是最为重要的两个工具。
QEMU,即快速模拟器(Quick Emulator),是一个开源的虚拟机软件,它在KVM虚拟化架构中主要负责设备模拟的功能。QEMU可以模拟多种不同的硬件平台,包括x86、ARM、MIPS等,支持多种操作系统的运行,如Linux、Windows、Mac OS X、FreeBSD等。在KVM环境下,QEMU通过与KVM内核模块的配合,为虚拟机提供了完整的硬件环境模拟。例如,它可以模拟硬盘、网卡、串口、显示器等设备的行为,使得虚拟机可以像使用真实硬件设备一样使用这些设备。具体来说,当虚拟机需要访问硬盘时,QEMU会模拟硬盘的读写操作,将数据从主机的存储设备中读取出来,并传递给虚拟机;当虚拟机需要通过网卡发送网络数据包时,QEMU会将数据包转发到主机的网络接口上,实现虚拟机与外部网络的通信。QEMU还支持多种设备模拟方式,如全虚拟化和半虚拟化。在全虚拟化模式下,QEMU会将虚拟机中的指令翻译成物理机器指令,再由物理机器执行,这种方式可以实现真正的隔离,但由于需要进行指令翻译,因此性能相对较差;在半虚拟化模式下,QEMU会将一些敏感指令,如读写I/O端口、访问内存页表等,通过调用宿主机器上的虚拟化接口来完成,而不是直接在虚拟机中执行,这种方式可以获得更好的性能,但需要对虚拟机中的操作系统进行修改。
Libvirt则是一个用于管理虚拟机和其他虚拟化功能的软件集合,它提供了一套通用的API,使得用户可以方便地管理多种不同的虚拟化技术,包括KVM、Xen、VMware等。Libvirt的主要功能包括虚拟机管理、存储管理、网络管理等多个方面。在虚拟机管理方面,Libvirt提供了丰富的工具和接口,用于创建、启动、停止、暂停、恢复和迁移虚拟机。例如,使用Libvirt的命令行工具virsh,用户可以轻松地创建一个新的虚拟机,并为其分配内存、CPU、磁盘等资源;通过virsh命令,还可以对虚拟机进行各种操作,如启动虚拟机、停止虚拟机、查看虚拟机状态等。Libvirt还支持虚拟机的热插拔操作,在虚拟机运行过程中,动态地添加或移除磁盘、网卡、内存和CPU等设备,提高了虚拟机的灵活性和可管理性。在存储管理方面,Libvirt可以管理不同类型的存储设备,创建和管理虚拟机的磁盘镜像文件,挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷等。例如,用户可以使用Libvirt创建一个qcow2格式的磁盘镜像文件,并将其作为虚拟机的硬盘;还可以通过Libvirt将NFS共享目录挂载到虚拟机中,为虚拟机提供额外的存储资源。在网络管理方面,Libvirt可以管理物理和逻辑的网络接口,创建和管理虚拟网络。它支持多种网络模式,如桥接网络、NAT网络等,使得虚拟机可以方便地与外部网络进行通信。例如,在桥接网络模式下,虚拟机可以直接连接到主机的物理网络接口上,与外部网络中的其他设备处于同一网络中,实现了虚拟机与外部网络的直接通信;在NAT网络模式下,虚拟机通过主机的网络地址转换功能访问外部网络,这种方式可以隐藏虚拟机的真实IP地址,提高了网络的安全性。
QEMU和Libvirt之间也存在着紧密的协作关系。QEMU负责为虚拟机提供具体的设备模拟功能,而Libvirt则负责对虚拟机进行整体的管理和控制。通过Libvirt的API,用户可以方便地调用QEMU的功能,实现对虚拟机的各种操作。例如,当用户使用Libvirt创建一个新的虚拟机时,Libvirt会通过调用QEMU的相关接口,为虚拟机创建相应的硬件环境,并启动虚拟机;当用户需要对虚拟机进行迁移时,Libvirt会协调QEMU和其他相关组件,将虚拟机从一个物理主机迁移到另一个物理主机上,确保迁移过程的顺利进行。
二、KVM虚拟化技术原理
2.1 硬件辅助虚拟化
在KVM虚拟化技术的底层支持中,Intel VT - x和AMD - V技术扮演着举足轻重的角色。这两项技术是硬件辅助虚拟化的关键体现,它们从硬件层面为KVM虚拟化提供了必要的支持,极大地提升了虚拟化的性能和效率。
Intel VT - x 技术是 Intel 针对 x86 架构处理器推出的虚拟化增强技术。它新增根模式和非根模式,在 KVM 环境下,VMM 运行于根模式掌控硬件资源,客户操作系统于非根模式受限访问,借由这种分层设计保障了虚拟化的安全稳定,如内存访问时需经 VMM 转换地址。
同时,该技术引入 VMXON、VMEXIT 等指令实现模式切换与通信。虚拟机执行特权指令时经 VMEXIT 交权给 VMM,VMM 处理后再经 VMENTRY 返还控制权,有效管控特权指令执行,防止系统因之不稳定,像设备驱动安装等操作均按此流程执行,有力支撑了虚拟化系统的有序运转。
AMD - V 技术是 AMD 公司推出的硬件虚拟化技术,类似 Intel VT - x。它通过新硬件特性支持虚拟化,有主机模式和客户模式对应 Intel 的根模式和非根模式,在 KVM 虚拟化中实现 VMM 与客户操作系统的分离协作,主机模式下 VMM 管理资源,客户模式下客户操作系统正常运行任务。此外,AMD - V 技术提供了如 VMCR 等特殊寄存器和 VMRUN 等指令,可控制虚拟机运行状态、实现启动暂停恢复等操作,提升了虚拟化性能与可扩展性。
Intel VT - x和AMD - V技术为KVM虚拟化技术提供了坚实的硬件基础。它们通过引入新的处理器运行模式、指令集和寄存器等硬件特性,使得处理器能够更好地支持虚拟化,提高了虚拟化的性能、安全性和稳定性。这两项技术的出现,为KVM虚拟化技术的广泛应用和发展奠定了重要的基础。
2.2 VMCS结构与工作机制
VMCS(Virtual - Machine Control Structure)结构,即虚拟机控制结构,在KVM虚拟化中起着核心的作用,它是实现虚拟机与物理CPU高效协作的关键组件。VMCS结构主要用于保存虚拟CPU(vCPU)的相关信息,包括寄存器状态、运行环境等,同时负责管理虚拟机在物理CPU上的执行过程,实现虚拟机与物理CPU之间的紧密绑定和有效控制。
每个vCPU都对应一个VMCS结构,这个结构就像是vCPU的“个人档案”,记录了vCPU在运行过程中的各种状态信息。VMCS结构中包含了多个字段,这些字段可以大致分为以下几类:控制数据(Control Data)、客户机状态(Guest State)和主机状态(Host State)。控制数据字段主要用于保存触发虚拟机模式切换的事件及原因,例如当虚拟机执行到敏感指令或者发生外部中断时,相关的信息会被记录在控制数据字段中,以便VMM能够及时响应并进行相应的处理。客户机状态字段则保存了虚拟机在运行过程中的各种状态信息,包括通用寄存器、段寄存器、指令指针等,这些信息在虚拟机暂停和恢复时起到关键作用,确保虚拟机能够在恢复运行时保持正确的状态。主机状态字段主要保存了VMM在管理虚拟机过程中的相关状态信息,如VMM的运行上下文、对虚拟机的控制权限等。
在KVM虚拟化中,VMCS结构与物理CPU的工作机制紧密相连。当虚拟机开始运行时,VMM会将与该虚拟机对应的vCPU的初始状态信息加载到VMCS结构中,然后通过特定的指令(如Intel VT - x技术中的VMXON指令)将物理CPU切换到虚拟机运行模式,此时物理CPU开始执行虚拟机中的指令。在虚拟机运行过程中,如果发生了需要VMM干预的事件,如虚拟机执行到特权指令、访问敏感资源或者发生外部中断等,物理CPU会根据VMCS结构中的控制数据,触发VMEXIT事件,将控制权从虚拟机转移到VMM。在VMEXIT事件发生时,物理CPU会将当前vCPU的状态信息保存到VMCS结构的客户机状态字段中,同时更新控制数据字段中的相关信息,记录事件发生的原因和上下文。
VMM在接收到VMEXIT事件后,会根据VMCS结构中的信息,对事件进行处理。VMM可能会检查虚拟机的指令执行情况,判断是否存在安全风险;或者根据虚拟机的资源请求,为其分配相应的物理资源。处理完成后,VMM会通过特定的指令(如Intel VT - x技术中的VMENTRY指令)将控制权返回给虚拟机。在返回控制权之前,VMM会根据VMCS结构中的客户机状态字段,恢复vCPU的状态信息,使得虚拟机能够从上次暂停的位置继续执行。例如,当虚拟机需要访问物理内存时,由于虚拟机运行在非根模式下,不能直接访问物理内存,而是通过VMEXIT事件通知VMM。VMM根据VMCS结构中的内存映射信息,将虚拟机的虚拟地址转换为物理地址,然后从物理内存中读取数据,并通过VMENTRY事件将数据返回给虚拟机,同时恢复虚拟机的运行状态,让虚拟机继续执行后续的指令。
VMCS结构在KVM虚拟化中实现了虚拟机与物理CPU之间的高效协作。它通过保存vCPU的状态信息和控制虚拟机的执行流程,确保了虚拟机在物理CPU上的稳定运行,为KVM虚拟化技术的高性能和可靠性提供了有力保障。
三、KVM虚拟化技术面临的挑战与应对策略
3.1 性能优化挑战
3.1.1 CPU性能瓶颈与优化方法
在KVM虚拟化环境中,当面临高负载的工作任务时,CPU性能瓶颈问题逐渐凸显。在大规模数据处理任务中,如同时运行多个大数据分析任务的虚拟机,每个任务都需要大量的CPU计算资源来进行数据的排序、聚合和分析操作。随着任务数量的增加,物理CPU的资源被快速耗尽,导致虚拟机的运行速度明显下降,数据处理的时间大幅延长。这是因为在高负载情况下,多个虚拟机的虚拟CPU(vCPU)竞争物理CPU资源,频繁的上下文切换使得CPU的时间被大量消耗在任务的调度和切换上,而真正用于执行任务的时间减少。
为了有效应对这一挑战,优化CPU调度成为关键措施。KVM支持多种CPU调度算法,如完全公平调度算法(CFS),它能够根据每个虚拟机的负载情况,动态地分配CPU时间片,确保每个虚拟机都能得到公平的CPU资源分配。在一个包含多个不同负载虚拟机的环境中,CFS算法会自动识别出负载较高的虚拟机,并为其分配相对较多的CPU时间片,以保证其任务的顺利执行;而对于负载较低的虚拟机,则适当减少其CPU时间片的分配,将资源腾出来给更需要的虚拟机。
CPU亲和性设置也是一种有效的优化方法。通过将特定的vCPU绑定到指定的物理CPU核心上,可以显著减少CPU上下文切换的开销。在实时视频处理的虚拟机场景中,将该虚拟机的vCPU绑定到性能较强且稳定的物理CPU核心上,能够确保视频处理任务在执行过程中不会因为频繁的CPU上下文切换而出现卡顿或延迟现象,从而提高视频处理的质量和效率。
3.1.2 I/O性能优化策略
在KVM虚拟化环境中,虚拟机的I/O性能优化对于提升整体系统性能至关重要。传统的I/O虚拟化方式在面对高并发、大数据量的I/O操作时,往往会成为性能瓶颈。在大规模数据存储和读取场景中,如虚拟机运行数据库应用,需要频繁地进行数据的读写操作。当同时有多个数据库查询请求时,传统的I/O虚拟化方式由于涉及多次的软件层转换和模拟,导致I/O响应延迟增加,数据库的查询效率大幅降低。
为了提升I/O性能,缓存优化是重要策略之一。KVM支持多种磁盘缓存模式,如writeback模式,在数据更新时,数据首先写入缓存,只有当缓存中的数据被替换出缓存时,才会被写入后端存储。这种模式大大提高了数据写入的速度,因为减少了直接写入存储设备的次数,降低了I/O操作的等待时间。在一个需要频繁写入数据的日志记录应用场景中,使用writeback模式可以快速将日志数据写入缓存,而不需要等待数据完全写入磁盘,从而提高了应用的响应速度。然而,writeback模式也存在一定风险,如在系统掉电时,缓存中未写入存储的数据可能会丢失。因此,在实际应用中,需要根据具体需求和数据的重要性来选择合适的缓存模式。
队列优化也是提升I/O性能的关键。通过调整I/O队列的深度和调度算法,可以更好地管理I/O请求。增大I/O队列深度,可以使系统能够同时处理更多的I/O请求,减少请求的等待时间。在网络I/O方面,采用多队列技术,为每个网络接口创建多个队列,每个队列可以独立处理网络数据包,从而提高网络I/O的并行处理能力。在一个需要处理大量网络流量的Web服务器虚拟机中,多队列技术可以将不同的网络请求分配到不同的队列中进行处理,避免了单个队列的拥塞,提高了网络数据的传输效率。
3.2 安全挑战
3.2.1 虚拟机逃逸风险防范
在KVM虚拟化环境中,虚拟机逃逸漏洞犹如隐藏在暗处的定时炸弹,一旦被攻击者利用,将对宿主机和其他虚拟机的安全构成严重威胁。2019年,腾讯安全平台部Tencent Blade Team发现并报告了QEMU - KVM虚拟机内核逃逸漏洞(CNVD - C - 2019 - 135439,对应CVE - 2019 - 14835)。该漏洞源于VHOST/VHOST_NET缺少对内核缓冲区的严格访问边界校验,攻击者可通过在虚拟机中更改VIRTIO network前端驱动,在虚拟机被热迁移时,触发内核缓冲区溢出,从而实现虚拟机逃逸,获得在宿主机内核中任意执行代码的权限,甚至还能触发宿主机内核崩溃,导致拒绝服务攻击 。
为了有效防范此类风险,安装安全补丁成为首要且关键的措施。一旦漏洞被发现,Linux内核主线及各大Linux发行版厂商会迅速发布相应的补丁。在上述漏洞被发现后,Linux内核主线于2019年9月15日发布补丁,用户可参照补丁代码进行修复。Red Hat、Ubuntu、Debian、SUSE等发行版厂商也纷纷发布公告,指导用户进行漏洞修复。及时安装这些安全补丁,能够修复已知的漏洞,从根本上降低虚拟机逃逸的风险。
除了安装补丁,还可以通过禁用热迁移功能来规避漏洞利用。因为在某些情况下,如上述2019年发现的漏洞,只有在虚拟机热迁移过程中才会被触发。通过禁用热迁移功能,虽然可能会在一定程度上影响系统的灵活性,但却能有效切断攻击者利用该漏洞实现虚拟机逃逸的途径,保障系统的安全性。在一些对热迁移功能需求不高的场景中,这是一种简单有效的防范措施。
定期进行安全扫描和漏洞检测也是必不可少的。使用专业的安全扫描工具,如OpenVAS、Nessus等,能够对KVM虚拟化环境进行全面的安全扫描,及时发现潜在的安全漏洞。这些工具可以扫描系统中的各种组件,包括操作系统、应用程序、虚拟机监控器等,检测是否存在已知的漏洞以及可能导致虚拟机逃逸的安全隐患。根据扫描结果,管理员可以及时采取相应的措施,如安装补丁、调整配置等,以确保系统的安全性。
3.2.2 数据安全与隔离机制
在KVM虚拟化环境中,确保虚拟机间的数据安全和隔离是保障整个系统安全稳定运行的重要基石。为了实现这一目标,KVM采用了多种机制,包括加密技术和访问控制机制。
加密技术在数据保护中起着至关重要的作用。在数据存储方面,KVM支持对虚拟机磁盘镜像进行加密。使用dm - crypt等加密工具,在创建虚拟机磁盘镜像时,就可以对磁盘中的数据进行加密处理。这样,即使磁盘镜像文件被非法获取,没有正确的密钥,攻击者也无法读取其中的数据,从而保护了数据的机密性。在数据传输过程中,TLS(Transport Layer Security)协议被广泛应用于加密虚拟机之间以及虚拟机与宿主机之间的数据传输。在虚拟机通过网络传输敏感数据,如用户登录信息、财务数据等时,TLS协议会对数据进行加密,确保数据在传输过程中不被窃取或篡改。
访问控制机制是保障数据安全和隔离的另一道重要防线。KVM通过SELinux(Security - Enhanced Linux)等安全模块,实现了对虚拟机资源访问的细粒度控制。SELinux基于强制访问控制(MAC)模型,为每个虚拟机和进程分配了相应的安全上下文,规定了它们对资源的访问权限。一个虚拟机只能按照其被赋予的权限访问特定的文件、目录和设备,无法越权访问其他虚拟机的资源。例如,在一个多租户的云计算环境中,不同租户的虚拟机运行着各自的应用程序,通过SELinux的访问控制机制,可以确保每个租户的虚拟机只能访问属于自己的数据和资源,防止租户之间的数据泄露和恶意攻击。
KVM还支持基于角色的访问控制(RBAC)。管理员可以根据不同的用户角色,如系统管理员、普通用户、租户管理员等,为其分配不同的权限。系统管理员拥有最高权限,可以对所有虚拟机进行管理和配置;普通用户只能访问和操作自己被授权的虚拟机;租户管理员则可以管理属于自己租户的虚拟机资源。通过这种方式,进一步细化了访问控制,提高了系统的安全性和管理效率。
3.3 管理复杂性挑战
3.3.1 多虚拟机管理的难题
在大规模的KVM虚拟化环境中,多虚拟机管理面临着诸多复杂难题,其中资源监控与配置管理问题尤为突出。当企业构建了包含成百上千台虚拟机的大型虚拟化集群时,要实时准确地监控每台虚拟机的资源使用情况,如CPU使用率、内存消耗、磁盘I/O读写速率以及网络流量等,成为了一项极具挑战性的任务。传统的手动监控方式不仅效率低下,而且容易出现疏漏,无法及时发现潜在的资源瓶颈或异常情况。例如,在一个拥有500台虚拟机的云计算数据中心,管理员若采用手动方式每隔一小时查看一次虚拟机的资源使用情况,那么在两次查看的间隔期间,一旦某台虚拟机出现CPU使用率飙升的情况,可能无法及时被发现,进而影响该虚拟机上运行的业务应用的正常运行。
在配置管理方面,随着虚拟机数量的增加,配置的复杂性呈指数级增长。每台虚拟机都有其独特的配置需求,包括操作系统版本、软件安装、网络设置、存储分配等。确保所有虚拟机的配置符合企业的安全策略和业务要求,并且在后续的维护过程中能够及时更新配置,是一项艰巨的任务。在一个金融企业的虚拟化环境中,为了满足监管要求,所有虚拟机的操作系统必须及时更新安全补丁,并且网络设置要符合严格的访问控制策略。然而,由于虚拟机数量众多,配置情况复杂,在实际操作中,可能会出现部分虚拟机的安全补丁未能及时更新,或者网络配置不符合策略的情况,从而给企业带来安全风险。
3.3.2 自动化管理工具的应用
为有效应对多虚拟机管理的复杂难题,Ansible、SaltStack等自动化工具应运而生,在KVM管理中发挥着关键作用。
Ansible作为一款强大的自动化配置管理工具,以其简洁的语法和丰富的模块,为KVM虚拟机管理带来了极大的便利。通过Ansible的playbook功能,管理员可以将一系列针对KVM虚拟机的管理任务编写成可重复执行的剧本。在创建和配置新的虚拟机时,管理员可以编写一个包含安装操作系统、配置网络、安装特定软件包等任务的playbook。当需要创建多个相同配置的虚拟机时,只需运行该playbook,Ansible就会自动按照剧本中的步骤,在指定的物理主机上创建并配置好虚拟机,大大节省了时间和精力。Ansible还可以用于批量更新虚拟机的配置。在企业需要统一更新所有虚拟机的安全补丁时,管理员可以编写一个包含补丁更新任务的playbook,然后通过Ansible将该任务批量推送到所有需要更新的虚拟机上,确保所有虚拟机都能及时得到安全更新,提高了系统的安全性和稳定性。
SaltStack同样是一款功能卓越的自动化工具,它采用了基于事件驱动的架构,能够实现对KVM虚拟机的实时监控和快速响应。SaltStack通过在每个虚拟机上安装minion代理,与运行在管理节点上的master进行通信。当某个虚拟机的资源使用情况发生异常时,minion会立即将相关信息发送给master,master可以根据预设的规则,自动触发相应的操作,如调整资源分配、发送警报通知管理员等。在一个实时数据分析的场景中,若某个虚拟机负责处理大量的数据计算任务,当它的CPU使用率持续超过80%时,SaltStack可以自动检测到这一情况,并根据预设的策略,为该虚拟机动态增加CPU核心数,以满足计算需求,确保数据分析任务的顺利进行。同时,SaltStack还支持对虚拟机的配置进行版本控制,管理员可以轻松地回滚到之前的配置版本,在对虚拟机进行配置调整时,降低因配置错误而导致系统故障的风险。