博客

  • DRBD详细解说及配置过程记录

    一、DRBD介绍

    DRBD(Distributed ReplicatedBlock Device)是一种基于软件的,无共享,分布式块设备复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)

    进行镜像。也就是说当某一个应用程序完成写操作后,它提交的数据不仅仅会保存在本地块设备上,DRBD也会将这份数据复制一份,通过网络传输到另一个节点的块设

    备上,这样,两个节点上的块设备上的数据将会保存一致,这就是镜像功能。

    DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群,其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像,

    与心跳连接结合使用,可以把它看作是一种网络RAID,它允许用户在远程机器上建立一个本地块设备的实时镜像。

    DRBD工作在内核当中,类似于一种驱动模块。DRBD工作的位置在文件系统的buffer cache和磁盘调度器之间,通过tcp/ip发给另外一台主机到对方的tcp/ip最终发送

    给对方的drbd,再由对方的drbd存储在本地对应磁盘 上,类似于一个网络RAID-1功能。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。本地(主节点)

    与远程主机(备节点)的数据可以保 证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。

    二、DRDB的工作原理

    DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。类似于一个网络RAID-1的功能,
    其工作原理的架构图如下:

    DRBD底层设备支持

    DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在上面内创建文件系统。

    DRBD所支持的底层设备有以下这些类:

    1)一个磁盘,或者是磁盘的某一个分区;

    2)一个soft raid 设备;

    3)一个LVM的逻辑卷;

    4)一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;

    5)其他任何的块设备。

    DRBD工作原理

    DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地 文件系统时,数据还将会被发送到网络中另一台主机上.

    以相同的形式记录在一个文件系统中。 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会 保留有一份相

    同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用

    它上面的那份备份数据,就可以继续进行服务了。

    DRBD是如何工作的(工作机制)

    (DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary),另一个主机再将数据存到自己的磁盘中。

    目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。

    以后的版本将支持两个节点进行读写存取。

    DRBD协议说明

    1)数据一旦写入磁盘并发送到网络中就认为完成了写入操作。

    2)收到接收确认就认为完成了写入操作。

    3)收到写入确认就认为完成了写入操作。

    DRBD与HA的关系

    一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。

    在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,

    DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。

    因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错

    三、DRBD的特性(基本功能)

    分布式复制块设备(DRBD技术)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。

    DRBD镜像数据的特性:

    1)实时性:当某个应用程序完成对数据的修改时,复制功能立即发生

    2)透明性:应用程序的数据存储在镜像块设备上是独立透明的,他们的数据在两个节点上都保存一份,因此,无论哪一台服务器宕机,

      都不会影响应用程序读取数据的操作,所以说是透明的。

    3)同步镜像和异步镜像:同步镜像表示当应用程序提交本地的写操作后,数据后会同步写到两个节点上去;异步镜像表示当应用程序提交写操作后,

      只有当本地的节点上完成写操作后,另一个节点才可以完成写操作。

    四、DRBD的用户空间管理工具

    DRBD有2中模式,一种是DRBD的主从模式,另一种是DRBD的双主模式

    1)DRBD的主从模式

    这种模式下,其中一个节点作为主节点,另一个节点作为从节点。其中主节点可以执行读、写操作;从节点不可以挂载文件系统,因此,也不可以执行读写操作。

    在这种模式下,资源在任何时间只能存储在主节点上。这种模式可用在任何的文件系统上(EXT3、EXT4、XFS等等)。默认这种模式下,一旦主节点发生故障,从

    节点需要手工将资源进行转移,且主节点变成从节点和从节点变成主节点需要手动进行切换。不能自动进行转移,因此比较麻烦。

    为了解决手动将资源和节点进行转移,可以将DRBD做成高可用集群的资源代理(RA),这样一旦其中的一个节点宕机,资源会自动转移到另一个节点,从而保证服

    务的连续性。

    2)DRBD的双主模式

    这是DRBD8.0之后的新特性

    在双主模式下,任何资源在任何特定的时间都存在两个主节点。这种模式需要一个共享的集群文件系统,利用分布式的锁机制进行管理,如GFS和OCFS2。

    部署双主模式时,DRBD可以是负载均衡的集群,这就需要从两个并发的主节点中选取一个首选的访问数据。这种模式默认是禁用的,如果要是用的话必须在配置文

    件中进行声明

    DRBD的同步协议

    ---------全局配置项(global)----------

    基本上我们可以做的也就是配置usage-count是yes还是no了,usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http

    协议发送信息到linbit公司的服务器上面。

    ----------公共配置项(common)----------

    这里的common,指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等。

    ----------DRBD设备----------

    DRBD的虚拟块设备。它有一个主设备号为147的设备,默认的它的次要号码编从0开始。在一组主机上,drbd的设备的设备名称为/dev/drbdN,这个N通常和他的次设备号一致。

    资源配置项(resource)

    resource 项中配置的是drbd所管理的所有资源,包括节点的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。每一个 resource中都需要配置在每一个节点的信息,而不是单独本节点的信息。并且资源名只能使用纯ascii码而且不能使用空白字符用于表示资源名称。实 际上,在drbd的整个集群中,每一个节点上面的drbd.conf文件需要是完全一致的。

    另外,resource还有很多其他的内部配置项:

    1)net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等。

    2)startup:启动时候的相关设置,比如设置启动后谁作为primary(或者两者都是primary:become-primary-on both)

    3)syncer: 同步相关的设置。可以设置“重新”同步(re-synchronization)速度(rate)设置,也可以设置是否在线校验节点之间的数据一致性 (verify-alg 检测算法有md5,sha1以及crc32等)。数据校验可能是一个比较重要的事情,在打开在线校验功能后,我们可以通过相关命令(drbdadm verify resource_name)来启动在线校验。在校验过程中,drbd会记录下节点之间不一致的block,但是不会阻塞任何行为,即使是在该不一致的 block上面的io请求。当不一致的block发生后,drbd就需要有re-synchronization动作,而syncer里面设置的rate 项,主要就是用于re-synchronization的时候,因为如果有大量不一致的数据的时候,我们不可能将所有带宽都分配给drbd做re- synchronization,这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口,但是我们的磁盘 IO能力每秒只有50M,那么实际的处理能力就只有50M,一般来说,设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re- synchronization是比较合适的(官方说明)。另外,drbd还提供了一个临时的rate更改命令,可以临时性的更改syncer的rate 值:

    4)drbdsetup /dev/drbd0 syncer -r 100M

    这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后,需要通过 drbdadm adjust resource_name 来让drbd按照配置中的rate来工作。

    ----------角色----------

    在drbd构造的集群中,资源具有角色的概念,分别为primary和secondary。

    所有设为primary的资源将不受限制进行读写操作。可以创建文件系统,可以使用裸设备,甚至直接io。所有设为secondary的设备中不能挂载,不能读写。

    ----------数据同步协议----------

    drbd有三种数据同步模式:同步,异步,半同步

    1)异步:指的是当数据写到磁盘上,并且复制的数据已经被放到我们的tcp缓冲区并等待发送以后,就认为写入完成

    2)半同步:指的是数据已经写到磁盘上,并且这些数据已经发送到对方内存缓冲区,对方的tcp已经收到数据,并宣布写入

    3)同步:指的是主节点已写入,从节点磁盘也写入

    drbd 的复制模型是靠protocol关键字来定义的:

    protocol A表示异步;

    protocol B表示半同步;

    protocol C表示同步,

    默认为protocol C。在同步模式下只有主、从节点上两块磁盘同时损害才会导致数据丢失。在半同步模式下只有主节点宕机,同时从节点异常停电才会导致数据丢失。

    注意:drbd的主不会监控从的状态所以有可能会造成数据重传

    -----------------------------------metadata----------------------------------

    DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了

    1)DRBD设备的大小

    2)产生的标识

    3)活动日志

    4)快速同步的位图

    metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的

    内部meta data

    内部metadata存放在同一块硬盘或分区的最后的位置上

    优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来

    缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。

    外部meta data

    外部的metadata存放在和数据磁盘分开的独立的块设备上

    优点:对于一些写操作可以对一些潜在的行为提供一些改进

    缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了

    如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了。

    可以通过下面的命令来计算metadata需要占用的扇区数

    ---------------------------------------------split brain脑裂---------------------------------------------

    split brain实际上是指在某种情况下,造成drbd的两个节点断开连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备 发送信息的时候如果发现对方

    也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:

    "Split-Brain detected,dropping connection!"

    当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是

    WFConnection的状态。

    如果在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,可通过如下策略进行配置。

    1)Discarding modifications made on the “younger” primary。在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会丢弃最后切换到主节点上的主机所修改的数据。

    2)Discarding modifications made on the “older” primary. 在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD丢弃首先切换到主节点上的主机后所修改的数据。

    3)Discarding modifications on the primary with fewer changes.在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会比较两台主机之间修改的数据量,并丢弃修

    改数据量较少的主机上的所有数据。

    4)Graceful recovery from split brain if one host has had no intermediate changes.在这种模式下,如果其中一个主机在脑裂期间并没有数据修改,DRBD会自动重新进

    行数据同步,并宣布脑裂问题已解决。(这种情况几乎不可 能存在)

    特别注意:

    自动裂脑自动修复能不能被接受取决于个人应用。考虑 建立一个DRBD的例子库。在“丢弃修改比较少的主节点的修改”兴许对web应用好过数据库应用。与此相反,财务的数据库

    则是对于任何修改的丢失都是不能 容忍的,这就需要不管在什么情况下都需要手工修复裂脑问题。因此需要在启用裂脑自动修复前考虑你的应用情况。

    如果没有配置 split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受丢失

    split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,就可以通过以下操作来恢复了:

    1)首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:

    drbdadm secondary resource_name

    drbdadm — –discard-my-data connect resource_name

    2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)

    drbdadm connect resource_name

    当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始

    九、DRBD的配置文件说明

    DRBD的主配置文件为/etc/drbd.conf;为了管理的便捷性,

    目前通常会将配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件

    为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。

    在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中

    可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。

    common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定

    义为common段中的参数以降低配置文件的复杂度。

    resource段则用于定义DRBD资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符

    组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或DRBD的默认中进行继承而无须定义。

    DRBD配置文件

    [root@huanqiu ~]# cat /etc/drbd.d/global_common.conf

    global {

     usage-count yes;         //是否参加DRBD使用者统计,默认是参加

     # minor-count dialog-refresh disable-ip-verification  //这里是global可以使用的参数

     #minor-count:32         //从(设备)个数,取值范围1~255,默认值为32。该选项设定了允许定义的resource个数,当要定义的resource超过了此选项的设定时,需要重新载入DRBD内核模块。

     #disable-ip-verification:no   //是否禁用ip检查

    }

    common {

     protocol C;      //指定复制协议,复制协议共有三种,为协议A,B,C,默认协议为协议C

     handlers {       //该配置段用来定义一系列处理器,用来回应特定事件。

      # These are EXAMPLE handlers only.

      # They may have severe implications,

      # like hard resetting the node under certain circumstances.

      # Be careful when chosing your poison.

      # pri-on-incon-degr "/usr/lib/DRBD/notify-pri-on-incon-degr.sh; /usr/lib/DRBD/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

      # pri-lost-after-sb "/usr/lib/DRBD/notify-pri-lost-after-sb.sh; /usr/lib/DRBD/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

      # local-io-error "/usr/lib/DRBD/notify-io-error.sh; /usr/lib/DRBD/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

      # fence-peer "/usr/lib/DRBD/crm-fence-peer.sh";

      # split-brain "/usr/lib/DRBD/notify-split-brain.sh root";

      # out-of-sync "/usr/lib/DRBD/notify-out-of-sync.sh root";

      # before-resync-target "/usr/lib/DRBD/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";

      # after-resync-target /usr/lib/DRBD/unsnapshot-resync-target-lvm.sh;

     }

     startup {    //#DRBD同步时使用的验证方式和密码。该配置段用来更加精细地调节DRBD属性,它作用于配置节点在启动或重启时。常用选项有:

      # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb

      wfc-timeout:  //该选项设定一个时间值,单位是秒。在启用DRBD块时,初始化脚本DRBD会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待。

      degr-wfc-timeout:  //该选项也设定一个时间值,单位为秒。也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。

      outdated-wfc-timeout:  //同上,也是用来设定等待时间,单位为秒。它用于设定等待过期节点的时间

     }

     disk {

      # on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes   //这里是disk段内可以定义的参数

      # no-disk-drain no-md-flushes max-bio-bvecs                      //这里是disk段内可以定义的参数

      on-io-error: detach      //选项:此选项设定了一个策略,如果底层设备向上层设备报告发生I/O错误,将按照该策略进行处理。有效的策略包括:

        detach      //发生I/O错误的节点将放弃底层设备,以diskless mode继续工作。在diskless mode下,只要还有网络连接,DRBD将从secondary node读写数据,而不需要failover(故障转移)。该策略会导致一定的损失,但好处也很明显,DRBD服务不会中断。官方推荐和默认策略。

        pass_on       //把I/O错误报告给上层设备。如果错误发生在primary节点,把它报告给文件系统,由上层设备处理这些错误(例如,它会导致文件系统以只读方式重新挂载),它可能会导致DRBD停止提供服务;如果发生在secondary节点,则忽略该错误(因为secondary节点没有上层设备可以报告)。该策略曾经是默认策略,但现在已被detach所取代。

        call-local-io-error   //调用预定义的本地local-io-error脚本进行处理。该策略需要在resource(或common)配置段的handlers部分,预定义一个相应的local-io-error命令调用。该策略完全由管理员通过local-io-error命令(或脚本)调用来控制如何处理I/O错误。

      fencing:               //该选项设定一个策略来避免split brain的状况。有效的策略包括:

        dont-care:  //默认策略。不采取任何隔离措施。

        resource-only:   //在此策略下,如果一个节点处于split brain状态,它将尝试隔离对端节点的磁盘。这个操作通过调用fence-peer处理器来实现。fence-peer处理器将通过其它通信路径到达对等节点,并在这个对等节点上调用DRBDadm outdate res命令

        resource-and-stonith:   //在此策略下,如果一个节点处于split brain状态,它将停止I/O操作,并调用fence-peer处理器。处理器通过其它通信路径到达对等节点,并在这个对等节点上调用DRBDadm outdate res命令。如果无法到达对等节点,它将向对等端发送关机命令。一旦问题解决,I/O操作将重新进行。如果处理器失败,你可以使用resume-io命令来重新开始I/O操作。

     }

     net {        //该配置段用来精细地调节DRBD的属性,网络相关的属性。常用的选项有:

      # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers     //这里是net段内可以定义的参数

      # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret      //这里是net段内可以定义的参数

      # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork      //这里是net段内可以定义的参数

      sndbuf-size:     //该选项用来调节TCP send buffer的大小,DRBD 8.2.7以前的版本,默认值为0,意味着自动调节大小;新版本的DRBD的默认值为128KiB。高吞吐量的网络(例如专用的千兆网卡,或负载均衡中绑定的连接)中,增加到512K比较合适,或者可以更高,但是最好不要超过2M。

      timeout:        //该选项设定一个时间值,单位为0.1秒。如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡,因此将断开这次TCP/IP连接。默认值为60,即6秒。该选项的值必须小于connect-int和ping-int的值。

      connect-int:     //如果无法立即连接上远程DRBD设备,系统将断续尝试连接。该选项设定的就是两次尝试间隔时间。单位为秒,默认值为10秒。

      ping-timeout:    //该选项设定一个时间值,单位是0.1秒。如果对端节点没有在此时间内应答keep-alive包,它将被认为已经死亡。默认值是500ms。

      max-buffers:     //该选项设定一个由DRBD分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。

      max-epoch-size:    //该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好

      ko-count:     //该选项设定一个值,把该选项设定的值 乘以 timeout设定的值,得到一个数字N,如果secondary节点没有在此时间内完成单次写请求,它将从集群中被移除(即,primary node进入StandAlong模式)。取值范围0~200,默认值为0,即禁用该功能。

      allow-two-primaries:   //这个是DRBD8.0及以后版本才支持的新特性,允许一个集群中有两个primary node。该模式需要特定文件系统的支撑,目前只有OCFS2和GFS可以,传统的ext3、ext4、xfs等都不行!

      cram-hmac-alg:    //该选项可以用来指定HMAC算法来启用对端节点授权。DRBD强烈建议启用对端点授权机制。可以指定/proc/crypto文件中识别的任一算法。必须在此指定算法,以明确启用对端节点授权机制,实现数据加密传输。

      shared-secret:    //该选项用来设定在对端节点授权中使用的密码,最长64个字符。

      data-integrity-alg:   //该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。

     }

     syncer {       //该配置段用来更加精细地调节服务的同步进程。常用选项有

      # rate after al-extents use-rle cpu-mask verify-alg csums-alg

      rate:    //设置同步时的速率,默认为250KB。默认的单位是KB/sec,也允许使用K、M和G,如40M。注意:syncer中的速率是以bytes,而不是bits来设定的。配置文件中的这个选项设置的速率是永久性的,但可使用下列命令临时地改变rate的值:DRBDsetup /dev/DRBDN syncer -r 100M。如果想重新恢复成drbd.conf配置文件中设定的速率,执行如下命令: DRBDadm adjust resource

      verify-alg:    //该选项指定一个用于在线校验的算法,内核一般都会支持md5、sha1和crc32c校验算法。在线校验默认关闭,必须在此选项设定参数,以明确启用在线设备校验。DRBD支持在线设备校验,它以一种高效的方式对不同节点的数据进行一致性校验。在线校验会影响CPU负载和使用,但影响比较轻微。DRBD 8.2.5及以后版本支持此功能。一旦启用了该功能,你就可以使用下列命令进行一个在线校验: DRBDadm verify resource。该命令对指定的resource进行检验,如果检测到有数据块没有同步,它会标记这些块,并往内核日志中写入一条信息。这个过程不会影响正在使用该设备的程序。

                        如果检测到未同步的块,当检验结束后,你就可以如下命令重新同步它们:DRBDadm disconnect resource   or   DRBDadm connetc resource

     }

    }

    common段是用来定义共享的资源参数,以减少资源定义的重复性。common段是非必须的。resource段一般为DRBD上每一个节点来定义其资源参数的。

    资源配置文件详解 

    [root@huanqiu ~]# cat /etc/drbd.d/web.res

    resource web {       //web为资源名称

     on ha1.xsl.com {                       //on后面为节点的名称,有几个节点就有几个on段,这里是定义节点ha1.xsl.com上的资源

      device   /dev/DRBD0;       //定义DRBD虚拟块设备,这个设备事先不要格式化。

      disk /dev/sda6;        //定义存储磁盘为/dev/sda6,该分区创建完成之后就行了,不要进行格式化操作

      address 192.168.108.199:7789;      //定义DRBD监听的地址和端口,以便和对端进行通信

      meta-disk  internal;       //该参数有2个选项:internal和externally,其中internal表示将元数据和数据存储在同一个磁盘上;而externally表示将元数据和数据分开存储,元数据被放在另一个磁盘上。

     }

     on ha2.xsl.com {        //这里是定义节点ha2.xsl.com上的资源

      device /dev/DRBD0;

      disk /dev/sda6;

      address 192.168.108.201:7789;

      meta-disk internal;

     }

    }

    十、Centos下DRBD的安装记录(主从模式)

    DRBD(Distributed Replicated Block Device) 可以理解为它其实就是个网络RAID-1,两台服务器间就算某台因断电或者宕机也不会对数据有任何影响,
    而真正的热切换可以通过Keepalived或Heartbeat方案解决,不需要人工干预。废话不多说了,下面记录下在centos下安装DRBD的操作记录

    1)服务器信息(centos6.8)
    192.168.1.151   主服务器     主机名:Primary 
    192.168.1.152   备服务器     主机名:Secondary
    -------------------------------------------------------------------------------------------------------------------------
    2)两台机器的防火墙要相互允许访问。最好是关闭selinux和iptables防火墙(两台机器同样操作)
    [root@Primary ~]# setenforce 0             //临时性关闭;永久关闭的话,需要修改/etc/sysconfig/selinux的SELINUX为disabled
    [root@Primary ~]# /etc/init.d/iptables stop
    -------------------------------------------------------------------------------------------------------------------------
    3)设置hosts文件(两台机器同样操作)
    [root@Primary drbd-8.4.3]# vim /etc/hosts
    ......
    192.168.1.151 Primary
    192.168.1.152 Secondary
    -------------------------------------------------------------------------------------------------------------------------
    4)两台机器同步时间
    [root@Primary ~]# yum install -y netpdate
    [root@Primary ~]# ntpdate -u asia.pool.ntp.org
    -------------------------------------------------------------------------------------------------------------------------
    5)DRBD的安装配置(两台机器上同样操作)
    这里采用yum方式安装
        
    [root@Primary ~]# rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
    [root@Primary ~]# yum -y install drbd83-utils kmod-drbd83
       
    注意:上面是centos6的安装方式,如果是centos7,则安装方式如下:
    # rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
    # yum install -y drbd84-utils kmod-drbd84
       
    加载模块:
    [root@Primary ~]# modprobe drbd
    查看模块是否已加上
    [root@Primary ~]# lsmod |grep drbd
    drbd                  332493  0
    -------------------------------------------------------------------------------------------------------------------------
    6)DRBD配置(两台机器上同样操作)
    [root@Primary ~]# cat /etc/drbd.conf
    # You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
        
    include "drbd.d/global_common.conf";
    include "drbd.d/*.res";
        
    [root@Primary ~]# cp /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.bak
    [root@Primary ~]# vim /etc/drbd.d/global_common.conf
    global {
      usage-count yes;
      # minor-count dialog-refresh disable-ip-verification
    }
       
    common {
      protocol C;
       
      handlers {
        # These are EXAMPLE handlers only.
        # They may have severe implications,
        # like hard resetting the node under certain circumstances.
        # Be careful when chosing your poison.
       
        # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
        # pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
        # local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
        # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
        # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
        # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
        # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
        # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
      }
       
      startup {
            wfc-timeout          240;
            degr-wfc-timeout     240;
            outdated-wfc-timeout 240;
      }
       
      disk {
            on-io-error detach;
      }
       
      net {
            cram-hmac-alg md5;
            shared-secret "testdrbd";
      }
       
      syncer {
            rate 30M;
      }
    }
        
    [root@Primary ~]# vim /etc/drbd.d/r0.res
    resource r0 {
    on Primary {
      device     /dev/drbd0;           //这是Primary机器上的DRBD虚拟块设备,事先不要格式化
      disk       /dev/vdd1;
      address    192.168.1.151:7898;
      meta-disk  internal;
     }
    on Secondary {
      device     /dev/drbd0;          //这是Secondary机器上的DRBD虚拟块设备,事先不要格式化
      disk       /dev/vde1;
      address    192.168.1.152:7898;     //DRBD监听的地址和端口。端口可以自己定义
      meta-disk  internal;
     }
    }
    -------------------------------------------------------------------------------------------------------------------------
    7)在两台机器上添加DRBD磁盘
       
    在Primary机器上添加一块10G的硬盘作为DRBD,分区为/dev/vdd1,不做格式化,并在本地系统创建/data目录,不做挂载操作。
    [root@Primary ~]# fdisk -l
    ......
    [root@Primary ~]# fdisk /dev/vdd      
    依次输入"n->p->1->1->回车->w"                                    //分区创建后,再次使用"fdisk /dev/vdd",输入p,即可查看到创建的分区,比如/dev/vdd1
       
    在Secondary机器上添加一块10G的硬盘作为DRBD,分区为/dev/vde1,不做格式化,并在本地系统创建/data目录,不做挂载操作。
    [root@Secondary ~]# fdisk -l
    ......
    [root@Secondary ~]# fdisk /dev/vde      
    依次输入"n->p->1->1->回车->w"
    -------------------------------------------------------------------------------------------------------------------------
    8)在两台机器上分别创建DRBD设备并激活r0资源(下面操作在两台机器上都要执行)
       
    [root@Primary ~]# mknod /dev/drbd0 b 147 0
    mknod: `/dev/drbd0': File exists
       
    [root@Primary ~]# drbdadm create-md r0
    Writing meta data...
    initializing activity log
    NOT initialized bitmap
    New drbd meta data block successfully created.
       
    再次输入该命令进行激活r0资源
    [root@Primary ~]# drbdadm create-md r0
    You want me to create a v08 style flexible-size internal meta data block.
    There appears to be a v08 flexible-size internal meta data block
    already in place on /dev/vdd1 at byte offset 10737340416
    Do you really want to overwrite the existing v08 meta-data?
    [need to type 'yes' to confirm] yes                                  //这里输入"yes"
    Writing meta data...
    initializing activity log
    NOT initialized bitmap
    New drbd meta data block successfully created.
       
    启动drbd服务(注意:需要主从共同启动方能生效)
    [root@Primary ~]# /etc/init.d/drbd start
    Starting DRBD resources: [ d(r0) s(r0) n(r0) ]....
    [root@Primary ~]# ps -ef|grep drbd
    root      5174     2  0 02:25 ?        00:00:00 [drbd0_worker]
    root      5193     2  0 02:25 ?        00:00:00 [drbd0_receiver]
    root      5207     2  0 02:25 ?        00:00:00 [drbd0_asender]
    root      5211 18667  0 02:25 pts/0    00:00:00 grep --color drbd
       
    查看状态(两台机器上都执行查看)
    [root@Primary ~]# cat /proc/drbd
    version: 8.3.16 (api:88/proto:86-97)
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
     0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
        ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10485332
       
    或者
    [root@Primary ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.16 (api:88/proto:86-97)
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
    m:res  cs         ro                   ds                         p  mounted  fstype
    0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
       
    由上面两台主机的DRBD状态查看结果里的ro:Secondary/Secondary表示两台主机的状态都是备机状态,ds是磁盘状态,显示的状态内容为“不一致”,这是因为DRBD无法判断哪一方为主机,
    应以哪一方的磁盘数据作为标准。
       
    -------------------------------------------------------------------------------------------------------------------------
    9)接着将Primary主机配置为DRBD的主节点
    [root@Primary ~]# drbdsetup /dev/drbd0 primary --force
       
    分别查看主从DRBD状态:
    [root@Primary ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.16 (api:88/proto:86-97)
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
    m:res  cs          ro                 ds                     p  mounted  fstype
    ...    sync'ed:    1.5%               (10096/10236)M
    0:r0   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C
       
    [root@Secondary ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.16 (api:88/proto:86-97)
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
    m:res  cs          ro                 ds                     p  mounted  fstype
    ...    sync'ed:    12.5%              (8960/10236)M
    0:r0   SyncTarget  Secondary/Primary  Inconsistent/UpToDate  C
       
    ro在主从服务器上分别显示 Primary/Secondary和Secondary/Primary
    ds显示UpToDate/UpToDate 表示主从配置成功
    -------------------------------------------------------------------------------------------------------------------------
    10)挂载DRBD  (Primary主节点机器上操作)
    从上面Primary主节点的DRBD状态上看到mounted和fstype参数为空,所以这步开始挂载DRBD到系统目录
       
    先格式化/dev/drbd0
    [root@Primary ~]# mkfs.ext4 /dev/drbd0
       
    创建挂载目录,然后执行DRBD挂载
    [root@Primary ~]# mkdir /data
    [root@Primary ~]# mount /dev/drbd0 /data
    [root@Primary ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                          156G   36G  112G  25% /
    tmpfs                 2.9G     0  2.9G   0% /dev/shm
    /dev/vda1             190M   98M   83M  55% /boot
    /dev/drbd0            9.8G   23M  9.2G   1% /data
       
    特别注意:
    Secondary节点上不允许对DRBD设备进行任何操作,包括只读,所有的读写操作只能在Primary节点上进行。
    只有当Primary节点挂掉时,Secondary节点才能提升为Primary节点
    -------------------------------------------------------------------------------------------------------------------------
    11)DRBD主备故障切换测试
       
    模拟Primary节点发生故障,Secondary接管并提升为Primary
       
    下面是在Primary主节点上操作记录:
    [root@Primary ~]# cd /data
    [root@Primary data]# touch wangshibo wangshibo1 wangshibo2 wangshibo3
    [root@Primary data]# cd ../
    [root@Primary /]# umount /data
       
    [root@Primary /]# drbdsetup /dev/drbd0 secondary              //将Primary主机设置为DRBD的备节点。在实际生产环境中,直接在Secondary主机上提权(即设置为主节点)即可。
    [root@Primary /]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.16 (api:88/proto:86-97)
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
    m:res  cs         ro                   ds                 p  mounted  fstype
    0:r0   Connected  Secondary/Secondary  UpToDate/UpToDate  C
       
    注意:这里实际生产环境若Primary主节点宕机,在Secondary状态信息中ro的值会显示为Secondary/Unknown,只需要进行DRBD提权操作即可。
       
    下面是在Secondary 备份节点上操作记录:
    先进行提权操作,即将Secondary手动升级为DRBD的主节点
    [root@Secondary ~]# drbdsetup /dev/drbd0 primary
    [root@Secondary ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.16 (api:88/proto:86-97)
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C
       
    然后挂载DRBD
    [root@Secondary ~]# mkdir /data
    [root@Secondary ~]# mount /dev/drbd0 /data
    [root@Secondary ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                          156G   13G  135G   9% /
    tmpfs                 2.9G     0  2.9G   0% /dev/shm
    /dev/vda1             190M   89M   92M  50% /boot
    /dev/vdd              9.8G   23M  9.2G   1% /data2
    /dev/drbd0            9.8G   23M  9.2G   1% /data
       
    发现DRBD挂载目录下已经有了之前在远程Primary主机上写入的内容
    [root@Secondary ~]# cd /data
    [root@Secondary data]# ls
    wangshibo  wangshibo1  wangshibo2  wangshibo3
       
    [root@Secondary ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.16 (api:88/proto:86-97)
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext4
      
    在Secondary节点上继续写入数据
    [root@Secondary data]# touch huanqiu huanqiu1 huanqiu2 huanqiu3
      
    然后模拟Secondary节点故障,Primary节点再提权升级为DRBD主节点(操作同上,此处省略.......)
     
    最后,使用命令fdisk -l查看本机磁盘情况,可以发现DRBD的磁盘/dev/drbd0
    [root@Secondary ~]# fdisk -l
    .......
    .......
    Disk /dev/drbd0: 10.7 GB, 10736979968 bytes
    255 heads, 63 sectors/track, 1305 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000

    到此,DRBD的主从环境的部署工作已经完成。不过上面是记录的是主备手动切换,至于保证DRBD主从结构的智能切换,实现高可用,还需里用到Keepalived或Heartbeat来实现了(会在DRBD主端挂掉的情况下,自动切换从端为主端并自动挂载/data分区)

    ----------------------------------------------------------------------------------------------------------------------------------
    最后说一下"Split-Brain"(脑裂)的情况:
      
    假设把Primary主机的的eth0设备宕掉,然后直接在Secondary主机上进行提权升级为DRBD的主节点,并且mount挂载DRBD,这时会发现之前在Primary主机上写入的数据文件确实同步过来了。
    接着再把Primary主机的eth0设备恢复,看看有没有自动恢复 主从关系。经过查看,发现DRBD检测出了Split-Brain的状况,也就是两个节点都处于standalone状态,
    故障描述如下:Split-Brain detected,dropping connection! 这就是传说中的“脑裂”。
      
    DRBD官方推荐的手动恢复方案:
      
    1)Secondary主机上的操作
    # drbdadm secondary r0
    # drbdadm disconnect all
    # drbdadm --discard-my-data connect r0            //或者"drbdadm  --  --discard-my-data  connect r0"
      
    2)Primary主机上的操作
    # drbdadm disconnect all
    # drbdadm connect r0
    # drbdsetup /dev/drbd0 primary
    ----------------------------------------------------------------------------------------------------------------------------------
     
    另外,还可以使用下面的命令查看DRBD状态:
    [root@Primary ~]# drbd-overview
      0:r0  Connected Primary/Secondary UpToDate/UpToDate C r----- /data ext4 9.8G 23M 9.2G 1%
     
    [root@Secondary ~]# drbd-overview
      0:r0  Connected Secondary/Primary UpToDate/UpToDate C r-----
  • JUNOS操作命令

    how configuration vlans | display set 可视化看配置

    show arp | match 10.10.1. juniper查ARP表

    show arp | match irb.2

    show virtual-chassis vc-port juniper查看vc接口

    show configuration vlans | display set juniper查看vlan配置

    show configuration | display set | match ae29 juniper 根据接口查看配置

    show system information juniper查看设备型号,软件版本

    show system uptime 查看系统运行时间

    show chassis routing-engine 查看系统运行时间cpu负载
    set access address-assignment pool 10F-VLAN20 family inet excluded-address

    dhcp排除某个ip

    CR# show | compare 查看做过的命令config

    show interfaces diagnostics optics ge-1/0/7 juniper查看接口光衰

    show chassis hardware juniper查看序列号
    show lldp neighbors 查看LLDP邻居
    show chassis alarms 查看机箱告警
    show int terse 查看接口状态
    show eth table 查看端口及mac地址
    show eth table | mach mac 查看mac地址表匹配确定的mac地址

  • kvm 虚拟机开启安全引导

     一、核心条件准备

    1. 安装 OVMF 固件
      • 使用支持安全引导的 UEFI 固件(如 edk2-ovmf)。
      • 获取路径(以 Arch Linux 为例):bashpacman -Ql edk2-ovmf | grep OVMF_CODE.secboot.fd
      • # 安全引导固件 pacman -Ql edk2-ovmf | grep OVMF_VARS.fd
      • # 变量存储文件其他系统路径类似(如 Ubuntu:/usr/share/OVMF/OVMF_CODE.secboot.fd)。
    2. 生成 UEFI 密钥
      • 创建平台密钥(PK):bashopenssl req -newkey rsa:2048 -nodes -keyout PKpriv.key -x509 -days 365 -out PK.crt openssl x509 -in PK.crt -outform der -out PK.der
      • 下载微软密钥
    3. 创建密钥镜像文件bashdd if=/dev/zero of=keys.img bs=1M count=10
    4. # 创建 10MB 镜像 mkfs.vfat keys.img
    5. # 格式化为 FAT32 sudo mount -o loop keys.img /mnt
    6. # 挂载镜像 cp PK.der /mnt/PK.der
    7. # 复制 PK cp MicCorKEKCA2011_2011-06-24.crt /mnt/KEK.crt
    8. # 复制 KEK cp MicWinProPCA2011_2011-10-19.crt /mnt/DB.crt
    9. # 复制 DB sudo umount /mnt

    ⚙️ 二、配置 QEMU 虚拟机

    1. 启动参数示例
      在 QEMU 命令中添加以下参数:bashqemu-system-x86_64 \ -enable-kvm \ -cpu host \ -m 4G \ -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.secboot.fd \ -drive if=pflash,format=raw,file=/path/to/OVMF_VARS.fd \
    2. # 变量文件副本 -drive file=/path/to/keys.img,format=raw \
    3. # 密钥镜像 -drive file=/path/to/disk.qcow2,format=qcow2 \
    4. # 系统磁盘 -drive file=/path/to/windows.iso,media=cdrom \
    5. # 安装镜像 -boot order=dc
      • 关键项
        • OVMF_CODE.secboot.fd:启用安全引导的固件。
        • OVMF_VARS.fd:需为副本(否则原始文件会被覆盖)。
    6. 在 UEFI 界面注册密钥
      • 启动虚拟机,进入 UEFI 设置(按 Esc 或 F2)。
      • 导航至:textDevice Manager → Secure Boot Configuration → Secure Boot Mode → Custom Mode
      • 依次注册密钥:
        • PK:选择 PK.der
        • KEK:选择 KEK.crt
        • DB:选择 DB.crt
      • 保存后退出,安全引导状态将变为 Enabled

    ⚠️ 三、启用 TPM 2.0(可选,Windows 11 必需)

    使用 swtpm 模拟 TPM 芯片:

    bash

    swtpm socket --tpm2 --tpmstate dir=/path/to/tpm --ctrl type=unixio,path=/path/to/swtpm-sock &

    在 QEMU 命令中添加:

    bash

    -chardev socket,id=chrtpm,path=/path/to/swtpm-sock \
    -tpmdev emulator,id=tpm0,chardev=chrtpm \
    -device tpm-tis,tpmdev=tpm0

    🔍 四、验证与故障处理

    1. 确认安全引导状态
      • Windows:msinfo32 → 查看 “安全引导状态” 是否为 “开启”
      • Linux:dmesg | grep -i secureboot 或 mokutil --sb-state
    2. 常见问题
      • 启动失败:检查密钥是否完整注册,或尝试重置为 Setup Mode 后重新注册。
      • 驱动未签名:Linux 需移除不兼容模块(如 VMware 的 hgfs)37。
      • OVMF 路径错误:确保固件文件路径正确,且变量文件可写。

    💎 总结

    • 核心步骤:OVMF 固件 + 密钥注册 + QEMU 参数配置。
    • 兼容性:Windows 支持良好;Linux 需确保内核/驱动已签名(如 shim + grub)6。
    • 安全风险:启用后仅加载可信软件,但可能导致未签名驱动失效,需提前测试47。

    参考:QEMU ArchWiki 2,OVMF 文档。若需脚本自动化,可基于2中的示例修改。

  • 折腾openstack

    一. OpenStack部署

    1. 环境准备

    主机名IP磁盘CPUmemory
    controller网卡1:10.0.0.10,网卡2:不配置sda:100G2C6G
    compute01网卡1:10.0.0.11,网卡2:不配置sda:100G ,sdb:20G2C4G
    compute02网卡1:10.0.0.12,网卡2:不配置sda:100G ,sdb:20G2C4G
    操作系统虚拟化工具
    Ubuntu22.04VMware15

    2. 配置离线环境

     # 解压
     tar -zxvf openstackyoga.tar.gz -C /opt/
     ​
     # 备份文件
     cp /etc/apt/sources.list{,.bak}
     ​
     # 配置离线源
     cat > /etc/apt/sources.list << EOF
     deb [trusted=yes] file:// /opt/openstackyoga/debs/
     EOF
     ​
     # 清空缓存
     apt clean all
     ​
     # 加载源
     apt update

    3. 环境准备

    3.1 配置网络

    • controller节点
     cat > /etc/netplan/00-installer-config.yaml << EOF
     # This is the network config written by 'subiquity'
     network:
      ethernets:
        ens33:
          dhcp4: false
          addresses: [10.0.0.10/24]
          routes:
             - to: default
              via: 10.0.0.254
          nameservers:
            addresses: [114.114.114.114]
        ens38:
          dhcp4: false
      version: 2
     EOF
     ​
     ​
     # 生效网络
     netplan apply
    • compute01节点
     cat > /etc/netplan/00-installer-config.yaml << EOF
     # This is the network config written by 'subiquity'
     network:
      ethernets:
        ens33:
          dhcp4: false
          addresses: [10.0.0.11/24]
          routes:
             - to: default
              via: 10.0.0.254
          nameservers:
            addresses: [114.114.114.114]
        ens38:
          dhcp4: false
      version: 2
     EOF
     ​
     ​
     # 生效网络
     netplan apply
    • compute02节点
     cat > /etc/netplan/00-installer-config.yaml << EOF
     # This is the network config written by 'subiquity'
     network:
      ethernets:
        ens33:
          dhcp4: false
          addresses: [10.0.0.12/24]
          routes:
             - to: default
              via: 10.0.0.254
          nameservers:
            addresses: [114.114.114.114]
        ens38:
          dhcp4: false
      version: 2
     EOF
     ​
     ​
     # 生效网络
     netplan apply

    3.2 配置主机名并配置解析

    • controller节点更改主机名
     hostnamectl set-hostname controller.mxq001
     ​
     # 切换窗口
     bash
     ​
     };
     ​
     zone "controller.mxq001" {
        type master;
        file "/etc/bind/db.controller.mxq001";
     };
     ​
     zone "compute01.mxq001" {
        type master;
        file "/etc/bind/db.compute01.mxq001";
     };
     ​
     zone "compute02.mxq001" {
        type master;
        file "/etc/bind/db.compute02.mxq001";
     };
     ​
    • compute01节点更改主机名
     hostnamectl set-hostname compute01.mxq001
     ​
     # 切换窗口
     bash
    • compute02节点更改主机名
     hostnamectl set-hostname compute02.mxq001
     ​
     # 切换窗口
     bash
    • 所有节点配置hosts解析
     cat >> /etc/hosts << EOF
     10.0.0.10 controller
     10.0.0.11 compute01
     10.0.0.12 compute02
     EOF

    3.3 时间调整

    • 所有节点
     # 开启可配置服务
     timedatectl set-ntp true
     ​
     # 调整时区为上海
     timedatectl set-timezone Asia/Shanghai
     ​
     # 将系统时间同步到硬件时间
     hwclock --systohc
    • 控制节点
     # 安装服务
     apt install -y chrony
     ​
     # 配置文件
     vim /etc/chrony/chrony.conf
     20 server controller iburst maxsources 2
     61 allow all
     63 local stratum 10
     ​
     # 重启服务
     systemctl restart chronyd
    • 计算节点
     # 安装服务
     apt install -y chrony
     ​
     # 配置文件
     vim /etc/chrony/chrony.conf
     20 pool controller iburst maxsources 4
     ​
     # 重启服务
     systemctl restart chronyd

    3.4 安装openstack客户端

    • controller节点
     apt install -y python3-openstackclient

    3.5 安装部署MariaDB

    • controller节点
     apt install -y mariadb-server python3-pymysql
    • 配置mariadb配置文件
     cat > /etc/mysql/mariadb.conf.d/99-openstack.cnf << EOF
     [mysqld]
     bind-address = 0.0.0.0
     ​
     default-storage-engine = innodb
     innodb_file_per_table = on
     max_connections = 4096
     collation-server = utf8_general_ci
     character-set-server = utf8
     EOF
    • 重启根据配置文件启动
     service mysql restart
    • 初始化配置数据库
     mysql_secure_installation
     输入数据库密码:回车
     可以在没有适当授权的情况下登录到MariaDB root用户,当前已收到保护:n
     设置root用户密码:n
     删除匿名用户:y
     不允许远程root登录:n
     删除测试数据库:y
     重新加载数据库:y

    3.6 安装部署RabbitMQ

    • 控制节点操作
    • controller节点安装服务
     apt install -y rabbitmq-server
    • 创建openstack用户
      • 用户名为:openstack
      • 密码:1qaz@WSX3edc
     rabbitmqctl add_user openstack 1qaz@WSX3edc
    • 允许openstack用户进行配置、写入和读取访问
     rabbitmqctl set_permissions openstack ".*" ".*" ".*"

    3.7 安装部署Memcache(用来缓存tonke的)

    • 控制节点操作
    • controller节点安装服务
     apt install -y memcached python3-memcache
    • 配置监听地址
     vim /etc/memcached.conf
     35 -l 0.0.0.0
    • 重启服务
     service memcached restart

    4. 部署配置keystone

    • 控制节点操作
    • 创建数据库与用户给予keystone使用
     # 创建数据库
     CREATE DATABASE keystone;
     ​
     # 创建用户
     GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystoneang';
    • controller节点安装服务
     apt install -y keystone
    • 配置keystone文件
     # 备份配置文件
     cp /etc/keystone/keystone.conf{,.bak}
     ​
     # 过滤覆盖文件
     grep -Ev "^$|#" /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf
     ​
     vim /etc/keystone/keystone.conf
     [DEFAULT]
     log_dir = /var/log/keystone
     [application_credential]
     [assignment]
     [auth]
     [cache]
     [catalog]
     [cors]
     [credential]
     [database]
     connection = mysql+pymysql://keystone:keystoneang@www.controller.mxq001/keystone
     [domain_config]
     [endpoint_filter]
     [endpoint_policy]
     [eventlet_server]
     [extra_headers]
     Distribution = Ubuntu
     [federation]
     [fernet_receipts]
     [fernet_tokens]
     [healthcheck]
     [identity]
     [identity_mapping]
     [jwt_tokens]
     [ldap]
     [memcache]
     [oauth1]
     [oslo_messaging_amqp]
     [oslo_messaging_kafka]
     [oslo_messaging_notifications]
     [oslo_messaging_rabbit]
     [oslo_middleware]
     [oslo_policy]
     [policy]
     [profiler]
     [receipt]
     [resource]
     [revoke]
     [role]
     [saml]
     [security_compliance]
     [shadow_users]
     [token]
     provider = fernet
     [tokenless_auth]
     [totp]
     [trust]
     [unified_limit]
     [wsgi]
    • 填充数据库
     su -s /bin/sh -c "keystone-manage db_sync" keystone
    • 调用用户和组的密钥库
      • 这些选项是为了允许在另一个操作系统用户/组下运行密钥库
     # 用户
     keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
     ​
     # 组
     keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
    • 在Queens发布之前,keystone需要在两个单独的端口上运行,以容纳Identity v2 API,后者通常在端口35357上运行单独的仅限管理员的服务。随着v2 API的删除,keystones可以在所有接口的同一端口上运行5000
     keystone-manage bootstrap --bootstrap-password 1qaz@WSX3edc --bootstrap-admin-url http://www.controller.mxq001:5000/v3/ --bootstrap-internal-url http://www.controller.mxq001:5000/v3/ --bootstrap-public-url http://www.controller.mxq001:5000/v3/ --bootstrap-region-id RegionOne
    • 编辑/etc/apache2/apache2.conf文件并配置ServerName选项以引用控制器节点
     echo "ServerName www.controller.mxq001" >> /etc/apache2/apache2.conf 
    • 重新启动Apache服务生效配置
     service apache2 restart
    • 配置OpenStack认证环境变量
     cat > /etc/keystone/admin-openrc.sh << EOF
     export OS_PROJECT_DOMAIN_NAME=Default
     export OS_USER_DOMAIN_NAME=Default
     export OS_PROJECT_NAME=admin
     export OS_USERNAME=admin
     export OS_PASSWORD=1qaz@WSX3edc
     export OS_AUTH_URL=http:///www.controller.mxq001:5000/v3
     export OS_IDENTITY_API_VERSION=3
     export OS_IMAGE_API_VERSION=2
     EOF
    • 加载环境变量
     source /etc/keystone/admin-openrc.sh
    • 创建服务项目,后期组件将使用这个项目
     openstack project create --domain default --description "Service Project" service
    • 验证
     openstack token issue

    5. 部署配置glance镜像

    • 控制节点操作
    • 创建数据库与用户给予glance使用
     # 创建数据库
     CREATE DATABASE glance;
     ​
     # 创建用户
     GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glanceang';
    • 创建glance浏览用户
     openstack user create --domain default --password glance glance
    • 将管理员角色添加到浏览用户和服务项目
     openstack role add --project service --user glance admin
    • 创建浏览服务实体
     openstack service create --name glance --description "OpenStack Image" image
    • 创建镜像服务API端点
     openstack endpoint create --region RegionOne image public http://www.controller.mxq001:9292
     ​
     openstack endpoint create --region RegionOne image internal http://www.controller.mxq001:9292
     ​
     openstack endpoint create --region RegionOne image admin http://www.controller.mxq001:9292
    • 安装glance镜像服务
     apt install -y glance
    • 配置glance配置文件
     # 备份配置文件
     cp /etc/glance/glance-api.conf{,.bak}
     ​
     # 过滤覆盖配置文件
     grep -Ev "^$|#" /etc/glance/glance-api.conf.bak > /etc/glance/glance-api.conf
     ​
     # 配置项信息
     vim /etc/glance/glance-api.conf
     [DEFAULT]
     [barbican]
     [barbican_service_user]
     [cinder]
     [cors]
     [database]
     connection = mysql+pymysql://glance:glanceang@www.controller.mxq001/glance
     [file]
     [glance.store.http.store]
     [glance.store.rbd.store]
     [glance.store.s3.store]
     [glance.store.swift.store]
     [glance.store.vmware_datastore.store]
     [glance_store]
     stores = file,http
     default_store = file
     filesystem_store_datadir = /var/lib/glance/images/
     [healthcheck]
     [image_format]
     disk_formats = ami,ari,aki,vhd,vhdx,vmdk,raw,qcow2,vdi,iso,ploop.root-tar
     [key_manager]
     [keystone_authtoken]
     www_authenticate_uri = http://www.controller.mxq001:5000
     auth_url = http://www.controller.mxq001:5000
     memcached_servers = www.controller.mxq001:11211
     auth_type = password
     project_domain_name = Default
     user_domain_name = Default
     project_name = service
     username = glance
     password = glance
     [oslo_concurrency]
     [oslo_messaging_amqp]
     [oslo_messaging_kafka]
     [oslo_messaging_notifications]
     [oslo_messaging_rabbit]
     [oslo_middleware]
     [oslo_policy]
     [oslo_reports]
     [paste_deploy]
     flavor = keystone
     [profiler]
     [store_type_location_strategy]
     [task]
     [taskflow_executor]
     [vault]
     [wsgi]
    • 填充数据库
     su -s /bin/sh -c "glance-manage db_sync" glance
    • 重启glance服务生效配置
     service glance-api restart
    • 上传镜像验证
     # 下载镜像
     wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
     ​
     # 上传镜像命令
     glance image-create --name "cirros" --file cirros-0.4.0-x86_64-disk.img --disk-format qcow2 --container-format bare --visibility=public
     ​
     # 查看镜像运行状态
     root@controller:~# openstack image list
     +--------------------------------------+--------+--------+
     | ID                                   | Name   | Status |
     +--------------------------------------+--------+--------+
     | 12a404ea-5751-41c6-a319-8f63de543cd8 | cirros | active |
     +--------------------------------------+--------+--------+

    6. 部署配置placement元数据

    • 作用:placement服务跟踪每个供应商的库存和使用情况。例如,在一个计算节点创建一个实例的可消费资源如计算节点的资源提供者的CPU和内存,磁盘从外部共享存储池资源提供商和IP地址从外部IP资源提供者。
    • 创建数据库与用户给予placement使用
     # 创建数据库
     CREATE DATABASE placement;
     ​
     # 创建用户
     GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'placementang';
    • 创建服务用户
     openstack user create --domain default --password placement placement
    • 将Placement用户添加到具有管理员角色的服务项目中
     openstack role add --project service --user placement admin
    • 在服务目录中创建Placement API条目
     openstack service create --name placement --description "Placement API" placement
    • 创建Placement API服务端点
     openstack endpoint create --region RegionOne placement public http://www.controller.mxq001:8778
       
     openstack endpoint create --region RegionOne placement internal http://www.controller.mxq001:8778
       
     openstack endpoint create --region RegionOne placement admin http://www.controller.mxq001:8778
    • 安装placement服务
     apt install -y placement-api
    • 配置placement文件
     # 备份配置文件
     cp /etc/placement/placement.conf{,.bak}
     ​
     # 过滤覆盖文件
     grep -Ev "^$|#" /etc/placement/placement.conf.bak > /etc/placement/placement.conf
     ​
     # 配置文件
     vim /etc/placement/placement.conf
     [DEFAULT]
     [api]
     auth_strategy = keystone
     [cors]
     [keystone_authtoken]
     auth_url = http://www.controller.mxq001:5000/v3
     memcached_servers = www.controller.mxq001:11211
     auth_type = password
     project_domain_name = Default
     user_domain_name = Default
     project_name = service
     username = placement
     password = placement
     [oslo_middleware]
     [oslo_policy]
     [placement]
     [placement_database]
     connection = mysql+pymysql://placement:placementang@www.controller.mxq001/placement
     [profiler]
    • 填充数据库
    su -s /bin/sh -c "placement-manage db sync" placement
    • 重启apache加载placement配置
    service apache2 restart
    • 验证
    root@controller:~# placement-status upgrade check
    +-------------------------------------------+
    | Upgrade Check Results |
    +-------------------------------------------+
    | Check: Missing Root Provider IDs |
    | Result: Success |
    | Details: None |
    +-------------------------------------------+
    | Check: Incomplete Consumers |
    | Result: Success |
    | Details: None |
    +-------------------------------------------+
    | Check: Policy File JSON to YAML Migration |
    | Result: Success |
    | Details: None |
    +-------------------------------------------+

    7. 部署配置nova计算服务

    7.1 控制节点配置

    • 创建数据库与用户给予nova使用
    # 存放nova交互等数据
    CREATE DATABASE nova_api;

    # 存放nova资源等数据
    CREATE DATABASE nova;

    # 存放nova等元数据
    CREATE DATABASE nova_cell0;

    # 创建管理nova_api库的用户
    GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'novaang';

    # 创建管理nova库的用户
    GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'novaang';

    # 创建管理nova_cell0库的用户
    GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'novaang';
    • 创建nova用户
    openstack user create --domain default --password nova nova
    • 将管理员角色添加到nova用户
    openstack role add --project service --user nova admin
    • 创建nova服务实体
    openstack service create --name nova --description "OpenStack Compute" compute
    • 创建计算API服务端点
    openstack endpoint create --region RegionOne compute public http://www.controller.mxq001:8774/v2.1

    openstack endpoint create --region RegionOne compute internal http://www.controller.mxq001:8774/v2.1

    openstack endpoint create --region RegionOne compute admin http://www.controller.mxq001:8774/v2.1
    • 安装服务
    apt install -y nova-api nova-conductor nova-novncproxy nova-scheduler
    • 配置nova文件
    # 备份配置文件
    cp /etc/nova/nova.conf{,.bak}

    # 过滤提取文件
    grep -Ev "^$|#" /etc/nova/nova.conf.bak > /etc/nova/nova.conf

    # 配置结果
    vim /etc/nova/nova.conf
    [DEFAULT]
    log_dir = /var/log/nova
    lock_path = /var/lock/nova
    state_path = /var/lib/nova
    transport_url = rabbit://openstack:1qaz@WSX3edc@www.controller.mxq001:5672/
    my_ip = 10.0.0.10
    [api]
    auth_strategy = keystone
    [api_database]
    connection = mysql+pymysql://nova:novaang@www.controller.mxq001/nova_api
    [barbican]
    [barbican_service_user]
    [cache]
    [cinder]
    [compute]
    [conductor]
    [console]
    [consoleauth]
    [cors]
    [cyborg]
    [database]
    connection = mysql+pymysql://nova:novaang@www.controller.mxq001/nova
    [devices]
    [ephemeral_storage_encryption]
    [filter_scheduler]
    [glance]
    api_servers = http://www.controller.mxq001:9292
    [guestfs]
    [healthcheck]
    [hyperv]
    [image_cache]
    [ironic]
    [key_manager]
    [keystone]
    [keystone_authtoken]
    www_authenticate_uri = http://www.controller.mxq001:5000/
    auth_url = http://www.controller.mxq001:5000/
    memcached_servers = www.controller.mxq001:11211
    auth_type = password
    project_domain_name = Default
    user_domain_name = Default
    project_name = service
    username = nova
    password = nova
    [libvirt]
    [metrics]
    [mks]
    [neutron]
    [notifications]
    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp
    [oslo_messaging_amqp]
    [oslo_messaging_kafka]
    [oslo_messaging_notifications]
    [oslo_messaging_rabbit]
    [oslo_middleware]
    [oslo_policy]
    [oslo_reports]
    [pci]
    [placement]
    region_name = RegionOne
    project_domain_name = Default
    project_name = service
    auth_type = password
    user_domain_name = Default
    auth_url = http://www.controller.mxq001:5000/v3
    username = placement
    password = placement
    [powervm]
    [privsep]
    [profiler]
    [quota]
    [rdp]
    [remote_debug]
    [scheduler]
    [serial_console]
    [service_user]
    [spice]
    [upgrade_levels]
    [vault]
    [vendordata_dynamic_auth]
    [vmware]
    [vnc]
    enabled = true
    server_listen = $my_ip
    server_proxyclient_address = $my_ip
    [workarounds]
    [wsgi]
    [zvm]
    [cells]
    enable = False
    [os_region_name]
    openstack =
    • 填充nova_api数据库
    su -s /bin/sh -c "nova-manage api_db sync" nova
    • 注册cell0数据库
    su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
    • 创建cell1单元格
    su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
    • 填充nova数据库
    su -s /bin/sh -c "nova-manage db sync" nova
    • 验证nova、cell0和cell1是否正确注册
    su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
    • 重启相关nova服务加载配置文件
    # 处理api服务
    service nova-api restart
    # 处理资源调度服务
    service nova-scheduler restart
    # 处理数据库服务
    service nova-conductor restart
    # 处理vnc远程窗口服务
    service nova-novncproxy restart

    7.2 计算节点配置

    • compute01节点
    • 安装nova-compute服务
    apt install -y nova-compute
    • 配置nova文件
    # 备份配置文件
    cp /etc/nova/nova.conf{,.bak}

    # 过滤覆盖配置文件
    grep -Ev "^$|#" /etc/nova/nova.conf.bak > /etc/nova/nova.conf

    # 完整配置
    vim /etc/nova/nova.conf
    [DEFAULT]
    log_dir = /var/log/nova
    lock_path = /var/lock/nova
    state_path = /var/lib/nova
    transport_url = rabbit://openstack:1qaz@WSX3edc@www.controller.mxq001
    my_ip = 10.0.0.11
    [api]
    auth_strategy = keystone
    [api_database]
    [barbican]
    [barbican_service_user]
    [cache]
    [cinder]
    [compute]
    [conductor]
    [console]
    [consoleauth]
    [cors]
    [cyborg]
    [database]
    [devices]
    [ephemeral_storage_encryption]
    [filter_scheduler]
    [glance]
    api_servers = http://www.controller.mxq001:9292
    [guestfs]
    [healthcheck]
    [hyperv]
    [image_cache]
    [ironic]
    [key_manager]
    [keystone]
    [keystone_authtoken]
    www_authenticate_uri = http://www.controller.mxq001:5000/
    auth_url = http://www.controller.mxq001:5000/
    memcached_servers = www.controller.mxq001:11211
    auth_type = password
    project_domain_name = Default
    user_domain_name = Default
    project_name = service
    username = nova
    password = nova
    [libvirt]
    [metrics]
    [mks]
    [neutron]
    [notifications]
    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp
    [oslo_messaging_amqp]
    [oslo_messaging_kafka]
    [oslo_messaging_notifications]
    [oslo_messaging_rabbit]
    [oslo_middleware]
    [oslo_policy]
    [oslo_reports]
    [pci]
    [placement]
    region_name = RegionOne
    project_domain_name = Default
    project_name = service
    auth_type = password
    user_domain_name = Default
    auth_url = http://www.controller.mxq001:5000/v3
    username = placement
    password = placement
    [powervm]
    [privsep]
    [profiler]
    [quota]
    [rdp]
    [remote_debug]
    [scheduler]
    [serial_console]
    [service_user]
    [spice]
    [upgrade_levels]
    [vault]
    [vendordata_dynamic_auth]
    [vmware]
    [vnc]
    enabled = true
    server_listen = 0.0.0.0
    server_proxyclient_address = $my_ip
    novncproxy_base_url = http://10.0.0.10:6080/vnc_auto.html
    [workarounds]
    [wsgi]
    [zvm]
    [cells]
    enable = False
    [os_region_name]
    openstack =
    • 检测是否支持硬件加速
      • 如果结果返回0,需要配置如下
    # 确定计算节点是否支持虚拟机的硬件加速
    egrep -c '(vmx|svm)' /proc/cpuinfo

    # 如果结果返回 “0” ,那么需要配置如下
    vim /etc/nova/nova-compute.conf
    [libvirt]
    virt_type = qemu
    • 重启服务生效nova配置
    service nova-compute restart
    • compute02节点
    • 安装nova-compute服务
    apt install -y nova-compute
    • 配置nova文件
    # 备份配置文件
    cp /etc/nova/nova.conf{,.bak}

    # 过滤覆盖配置文件
    grep -Ev "^$|#" /etc/nova/nova.conf.bak > /etc/nova/nova.conf

    # 完整配置
    vim /etc/nova/nova.conf
    [DEFAULT]
    log_dir = /var/log/nova
    lock_path = /var/lock/nova
    state_path = /var/lib/nova
    transport_url = rabbit://openstack:1qaz@WSX3edc@controller
    my_ip = 10.0.0.12
    [api]
    auth_strategy = keystone
    [api_database]
    [barbican]
    [barbican_service_user]
    [cache]
    [cinder]
    [compute]
    [conductor]
    [console]
    [consoleauth]
    [cors]
    [cyborg]
    [database]
    [devices]
    [ephemeral_storage_encryption]
    [filter_scheduler]
    [glance]
    api_servers = http://controller:9292
    [guestfs]
    [healthcheck]
    [hyperv]
    [image_cache]
    [ironic]
    [key_manager]
    [keystone]
    [keystone_authtoken]
    www_authenticate_uri = http://controller:5000/
    auth_url = http://controller:5000/
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = Default
    user_domain_name = Default
    project_name = service
    username = nova
    password = nova
    [libvirt]
    [metrics]
    [mks]
    [neutron]
    [notifications]
    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp
    [oslo_messaging_amqp]
    [oslo_messaging_kafka]
    [oslo_messaging_notifications]
    [oslo_messaging_rabbit]
    [oslo_middleware]
    [oslo_policy]
    [oslo_reports]
    [pci]
    [placement]
    region_name = RegionOne
    project_domain_name = Default
    project_name = service
    auth_type = password
    user_domain_name = Default
    auth_url = http://controller:5000/v3
    username = placement
    password = placement
    [powervm]
    [privsep]
    [profiler]
    [quota]
    [rdp]
    [remote_debug]
    [scheduler]
    [serial_console]
    [service_user]
    [spice]
    [upgrade_levels]
    [vault]
    [vendordata_dynamic_auth]
    [vmware]
    [vnc]
    enabled = true
    server_listen = 0.0.0.0
    server_proxyclient_address = $my_ip
    novncproxy_base_url = http://10.0.0.10:6080/vnc_auto.html
    [workarounds]
    [wsgi]
    [zvm]
    [cells]
    enable = False
    [os_region_name]
    openstack =
    • 检测是否支持硬件加速
      • 如果结果返回0,需要配置如下
    # 确定计算节点是否支持虚拟机的硬件加速
    egrep -c '(vmx|svm)' /proc/cpuinfo

    # 如果结果返回 “0” ,那么需要配置如下
    vim /etc/nova/nova-compute.conf
    [libvirt]
    virt_type = qemu
    • 重启服务生效nova配置
    service nova-compute restart

    7.3 配置主机发现

    • 控制节点节点
    • 查看有那些可用的计算节点
    openstack compute service list --service nova-compute
    • 发现计算主机
    su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
    • 配置每5分钟主机发现一次
    vim /etc/nova/nova.conf
    '''
    [scheduler]
    discover_hosts_in_cells_interval = 300
    '''
    • 重启生效配置
    service nova-api restart
    • 校验nova服务
    root@controller:~# openstack compute service list
    +--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+
    | ID | Binary | Host | Zone | Status | State | Updated At |
    +--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+
    | 68178099-13c5-4464-9a55-71ea0dd30bf5 | nova-scheduler | controller | internal | enabled | up | 2022-09-29T05:45:49.1qaz@WSX3edc |
    | bd2a33be-1457-41c1-8ce8-3d4a8cb43551 | nova-conductor | controller | internal | enabled | up | 2022-09-29T05:45:49.1qaz@WSX3edc |
    | 98b4584d-f9bf-4c10-9fd8-331899ebf70b | nova-compute | compute01 | nova | enabled | up | 2022-09-29T05:45:53.1qaz@WSX3edc |
    | f809da57-8999-4ba4-8a32-5b60991f8838 | nova-compute | compute02 | nova | enabled | up | 2022-09-29T05:45:56.1qaz@WSX3edc |
    +--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+

    8. 配置基于OVS的Neutron网络服务

    8.1 控制节点配置

    • 创建数据库与用给予neutron使用
    # 创建数据库
    CREATE DATABASE neutron;

    # 创建用户
    GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutronang';
    • 创建neutron用户
    openstack user create --domain default --password neutron neutron
    • 向neutron用户添加管理员角色
    openstack role add --project service --user neutron admin
    • 创建neutron实体
    openstack service create --name neutron --description "OpenStack Networking" network
    • 创建neutron的api端点
    openstack endpoint create --region RegionOne network public http://www.controller.mxq001:9696

    openstack endpoint create --region RegionOne network internal http://www.controller.mxq001:9696

    openstack endpoint create --region RegionOne network admin http://www.controller.mxq001:9696
    • 配置内核转发
    cat >> /etc/sysctl.conf << EOF
    # 用于控制系统是否开启对数据包源地址的校验,关闭
    net.ipv4.conf.all.rp_filter=0
    net.ipv4.conf.default.rp_filter=0
    # 开启二层转发设备
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    EOF
    • 加载模块
      • 作用:桥接流量转发到iptables链
    modprobe br_netfilter
    • 生效内核配置
    sysctl -p
    • 安装ovs服务
    apt install -y neutron-server neutron-plugin-ml2  neutron-l3-agent neutron-dhcp-agent  neutron-metadata-agent neutron-openvswitch-agent
    • 配置neutron.conf文件
      • 用于提供neutron主体服务
    # 备份配置文件
    cp /etc/neutron/neutron.conf{,.bak}

    # 过滤提取配置文件
    grep -Ev "^$|#" /etc/neutron/neutron.conf.bak > /etc/neutron/neutron.conf


    # 完整配置
    vim /etc/neutron/neutron.conf
    [DEFAULT]
    core_plugin = ml2
    service_plugins = router
    allow_overlapping_ips = true
    auth_strategy = keystone
    state_path = /var/lib/neutron
    dhcp_agent_notification = true
    allow_overlapping_ips = true
    notify_nova_on_port_status_changes = true
    notify_nova_on_port_data_changes = true
    transport_url = rabbit://openstack:1qaz@WSX3edc@www.controller.mxq001
    [agent]
    root_helper = "sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"
    [cache]
    [cors]
    [database]
    connection = mysql+pymysql://neutron:neutronang@www.controller.mxq001/neutron
    [healthcheck]
    [ironic]
    [keystone_authtoken]
    www_authenticate_uri = http://www.controller.mxq001:5000
    auth_url = http://www.controller.mxq001:5000
    memcached_servers = www.controller.mxq001:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = neutron
    password = neutron
    [nova]
    auth_url = http://www.controller.mxq001:5000
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = nova
    password = nova
    [oslo_concurrency]
    lock_path = /var/lib/neutron/tmp
    [oslo_messaging_amqp]
    [oslo_messaging_kafka]
    [oslo_messaging_notifications]
    [oslo_messaging_rabbit]
    [oslo_middleware]
    [oslo_policy]
    [oslo_reports]
    [placement]
    [privsep]
    [quotas]
    [ssl]
    • 配置ml2_conf.ini文件
      • 用户提供二层网络插件服务
    # 备份配置文件
    cp /etc/neutron/plugins/ml2/ml2_conf.ini{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/neutron/plugins/ml2/ml2_conf.ini.bak > /etc/neutron/plugins/ml2/ml2_conf.ini

    # 完整配置
    vim /etc/neutron/plugins/ml2/ml2_conf.ini
    [DEFAULT]
    [ml2]
    type_drivers = flat,vlan,vxlan,gre
    tenant_network_types = vxlan
    mechanism_drivers = openvswitch,l2population
    extension_drivers = port_security
    [ml2_type_flat]
    flat_networks = physnet1
    [ml2_type_geneve]
    [ml2_type_gre]
    [ml2_type_vlan]
    [ml2_type_vxlan]
    vni_ranges = 1:1000
    [ovs_driver]
    [securitygroup]
    enable_ipset = true
    enable_security_group = true
    firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
    [sriov_driver]
    • 配置openvswitch_agent.ini文件
      • 提供ovs代理服务
    # 备份文件
    cp /etc/neutron/plugins/ml2/openvswitch_agent.ini{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/neutron/plugins/ml2/openvswitch_agent.ini.bak > /etc/neutron/plugins/ml2/openvswitch_agent.ini

    # 完整配置
    vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
    [DEFAULT]
    [agent]
    l2_population = True
    tunnel_types = vxlan
    prevent_arp_spoofing = True
    [dhcp]
    [network_log]
    [ovs]
    local_ip = 10.0.0.10
    bridge_mappings = physnet1:br-ens34
    [securitygroup]
    • 配置l3_agent.ini文件
      • 提供三层网络服务
    # 备份文件
    cp /etc/neutron/l3_agent.ini{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/neutron/l3_agent.ini.bak > /etc/neutron/l3_agent.ini

    # 完整配置
    vim /etc/neutron/l3_agent.ini
    [DEFAULT]
    interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
    external_network_bridge =
    [agent]
    [network_log]
    [ovs]
    • 配置dhcp_agent文件
      • 提供dhcp动态网络服务
    # 备份文件
    cp /etc/neutron/dhcp_agent.ini{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/neutron/dhcp_agent.ini.bak > /etc/neutron/dhcp_agent.ini

    # 完整配置
    vim /etc/neutron/dhcp_agent.ini
    [DEFAULT]
    interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
    dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
    enable_isolated_metadata = True
    [agent]
    [ovs]
    • 配置metadata_agent.ini文件
      • 提供元数据服务
      • 元数据什么?
        • 用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。
    # 备份文件
    cp /etc/neutron/metadata_agent.ini{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/neutron/metadata_agent.ini.bak > /etc/neutron/metadata_agent.ini

    # 完整配置
    vim /etc/neutron/metadata_agent.ini
    [DEFAULT]
    nova_metadata_host = www.controller.mxq001
    metadata_proxy_shared_secret = ws
    [agent]
    [cache]
    • 配置nova文件
      • 主要识别neutron配置,从而能调用网络
    vim /etc/nova/nova.conf
    '''
    [default]
    linuxnet_interface_driver = nova.network.linux_net.LinuxOVSlnterfaceDriver

    [neutron]
    auth_url = http://www.controller.mxq001:5000
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = neutron
    password = neutron
    service_metadata_proxy = true
    metadata_proxy_shared_secret = ws
    '''
    • 填充数据库
    su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
    • 重启nova-api服务生效neutron配置
    service nova-api restart
    • 新建一个外部网络桥接
    ovs-vsctl add-br br-ens34
    • 将外部网络桥接映射到网卡
      • 这里绑定第二张网卡,属于业务网卡
    ovs-vsctl add-port br-ens34 ens34
    • 重启neutron相关服务生效配置
    # 提供neutron服务
    service neutron-server restart
    # 提供ovs服务
    service neutron-openvswitch-agent restart
    # 提供地址动态服务
    service neutron-dhcp-agent restart
    # 提供元数据服务
    service neutron-metadata-agent restart
    # 提供三层网络服务
    service neutron-l3-agent restart

    8.2 计算节点配置

    • compute01节点
    • 配置内核转发
    cat >> /etc/sysctl.conf << EOF
    # 用于控制系统是否开启对数据包源地址的校验,关闭
    net.ipv4.conf.all.rp_filter=0
    net.ipv4.conf.default.rp_filter=0
    # 开启二层转发设备
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    EOF
    • 加载模块
      • 作用:桥接流量转发到iptables链
    modprobe br_netfilter
    • 生效内核配置
    sysctl -p
    • 安装neutron-ovs服务
    apt install -y neutron-openvswitch-agent
    • 配置neutron文件
      • 提供neutron主体服务
    # 备份文件
    cp /etc/neutron/neutron.conf{,.bak}

    # 过滤提取文件
    grep -Ev "^$|#" /etc/neutron/neutron.conf.bak > /etc/neutron/neutron.conf

    # 完整配置
    vim /etc/neutron/neutron.conf
    [DEFAULT]
    core_plugin = ml2
    service_plugins = router
    auth_strategy = keystone
    state_path = /var/lib/neutron
    allow_overlapping_ips = true
    transport_url = rabbit://openstack:1qaz@WSX3edc@www.controller.mxq001
    [agent]
    root_helper = "sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"
    [cache]
    [cors]
    [database]
    [healthcheck]
    [ironic]
    [keystone_authtoken]
    www_authenticate_uri = http://www.controller.mxq001:5000
    auth_url = http://www.controller.mxq001:5000
    memcached_servers = www.controller.mxq001:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = neutron
    password = neutron
    [nova]
    [oslo_concurrency]
    lock_path = /var/lib/neutron/tmp
    [oslo_messaging_amqp]
    [oslo_messaging_kafka]
    [oslo_messaging_notifications]
    [oslo_messaging_rabbit]
    [oslo_middleware]
    [oslo_policy]
    [oslo_reports]
    [placement]
    [privsep]
    [quotas]
    [ssl]
    • 配置openvswitch_agent.ini文件
      • 提供ovs网络服务
    # 备份文件
    cp /etc/neutron/plugins/ml2/openvswitch_agent.ini{,.bak}

    # 过滤提取文件
    grep -Ev "^$|#" /etc/neutron/plugins/ml2/openvswitch_agent.ini.bak > /etc/neutron/plugins/ml2/openvswitch_agent.ini

    # 完整配置
    vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
    [DEFAULT]
    [agent]
    l2_population = True
    tunnel_types = vxlan
    prevent_arp_spoofing = True
    [dhcp]
    [network_log]
    [ovs]
    local_ip = 10.0.0.11
    bridge_mappings = physnet1:br-ens34
    [securitygroup]
    enable_security_group = True
    firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
    • 配置nova文件识别neutron配置
    vim /etc/nova/nova.conf
    '''
    [DEFAULT]
    linuxnet_interface_driver = nova.network.linux_net.LinuxOVSlnterfaceDriver
    vif_plugging_is_fatal = true
    vif_pligging_timeout = 300

    [neutron]
    auth_url = http://www.controller.mxq001:5000
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = neutron
    password = neutron
    '''
    • 重启nova服务识别网络配置
    service nova-compute restart
    • 新建一个外部网络桥接
    ovs-vsctl add-br br-ens34
    • 将外部网络桥接映射到网卡
      • 这里绑定第二张网卡,属于业务网卡
    ovs-vsctl add-port br-ens34 ens34
    • 重启服务加载ovs配置
    service neutron-openvswitch-agent restart
    • compute02节点
    • 配置内核转发
    cat >> /etc/sysctl.conf << EOF
    # 用于控制系统是否开启对数据包源地址的校验,关闭
    net.ipv4.conf.all.rp_filter=0
    net.ipv4.conf.default.rp_filter=0
    # 开启二层转发设备
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    EOF
    • 加载模块
      • 作用:桥接流量转发到iptables链
    modprobe br_netfilter
    • 生效内核配置
    sysctl -p
    • 安装neutron-ovs服务
    apt install -y neutron-openvswitch-agent
    • 配置neutron文件
      • 提供neutron主体服务
    # 备份文件
    cp /etc/neutron/neutron.conf{,.bak}

    # 过滤提取文件
    grep -Ev "^$|#" /etc/neutron/neutron.conf.bak > /etc/neutron/neutron.conf

    # 完整配置
    vim /etc/neutron/neutron.conf
    [DEFAULT]
    core_plugin = ml2
    service_plugins = router
    auth_strategy = keystone
    state_path = /var/lib/neutron
    allow_overlapping_ips = true
    transport_url = rabbit://openstack:1qaz@WSX3edc@controller
    [agent]
    root_helper = "sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"
    [cache]
    [cors]
    [database]
    [healthcheck]
    [ironic]
    [keystone_authtoken]
    www_authenticate_uri = http://controller:5000
    auth_url = http://controller:5000
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = neutron
    password = neutron
    [nova]
    [oslo_concurrency]
    lock_path = /var/lib/neutron/tmp
    [oslo_messaging_amqp]
    [oslo_messaging_kafka]
    [oslo_messaging_notifications]
    [oslo_messaging_rabbit]
    [oslo_middleware]
    [oslo_policy]
    [oslo_reports]
    [placement]
    [privsep]
    [quotas]
    [ssl]
    • 配置openvswitch_agent.ini文件
      • 提供ovs网络服务
    # 备份文件
    cp /etc/neutron/plugins/ml2/openvswitch_agent.ini{,.bak}

    # 过滤提取文件
    grep -Ev "^$|#" /etc/neutron/plugins/ml2/openvswitch_agent.ini.bak > /etc/neutron/plugins/ml2/openvswitch_agent.ini

    # 完整配置
    vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
    [DEFAULT]
    [agent]
    l2_population = True
    tunnel_types = vxlan
    prevent_arp_spoofing = True
    [dhcp]
    [network_log]
    [ovs]
    local_ip = 10.0.0.12
    bridge_mappings = physnet1:br-ens34
    [securitygroup]
    enable_security_group = True
    firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
    • 配置nova文件识别neutron配置
    vim /etc/nova/nova.conf
    '''
    [DEFAULT]
    linuxnet_interface_driver = nova.network.linux_net.LinuxOVSlnterfaceDriver
    vif_plugging_is_fatal = true
    vif_pligging_timeout = 300

    [neutron]
    auth_url = http://controller:5000
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = neutron
    password = neutron
    '''
    • 重启nova服务识别网络配置
    service nova-compute restart
    • 新建一个外部网络桥接
    ovs-vsctl add-br br-ens38
    • 将外部网络桥接映射到网卡
      • 这里绑定第二张网卡,属于业务网卡
    ovs-vsctl add-port br-ens38 ens38
    • 重启服务加载ovs配置
    service neutron-openvswitch-agent restart

    8.3 校验neutron

    • 校验命令
    root@controller:~# openstack network agent list
    +--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
    | ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
    +--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
    | 5695085f-b03f-4ff2-b13f-a8e59036ca15 | Open vSwitch agent | controller | None | :-) | UP | neutron-openvswitch-agent |
    | 77f6b5e6-a761-49c6-8694-de4d3d52509f | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent |
    | 87139cbc-27ee-4885-807e-96800816adca | Open vSwitch agent | compute01 | None | :-) | UP | neutron-openvswitch-agent |
    | 891696fa-01af-4fd9-87f0-ad3d432f05d0 | L3 agent | controller | nova | :-) | UP | neutron-l3-agent |
    | 91959f9b-db89-4021-b55e-888f71edb0b3 | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent |
    | e5598aa0-e71c-4a74-a11f-b415a2e4fdbb | Open vSwitch agent | compute02 | None | :-) | UP | neutron-openvswitch-agent |
    +--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

    9. 配置dashboard仪表盘服务

    • 安装服务
    apt install -y openstack-dashboard
    • 配置local_settings.py文件
    vim /etc/openstack-dashboard/local_settings.py
    '''
    # 配置仪表板以在控制器节点上使用OpenStack服务
    OPENSTACK_HOST = "www.controller.mxq001"

    # 在Dashboard configuration部分中,允许主机访问Dashboard
    ALLOWED_HOSTS = ["*"]

    # 配置memcached会话存储服务
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

    CACHES = {
    'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': 'www.controller.mxq001:11211',
    }
    }

    # 启用Identity API版本3
    OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST

    # 启用对域的支持
    OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

    # 配置API版本
    OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 3,
    }

    # 将Default配置为通过仪表板创建的用户的默认域
    OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"

    # 将用户配置为通过仪表板创建的用户的默认角色
    OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"

    # 启用卷备份
    OPENSTACK_CINDER_FEATURES = {
    'enable_backup': True,
    }

    # 配置时区
    TIME_ZONE = "Asia/Shanghai"
    '''
    • 重新加载web服务器配置
    systemctl reload apache2

    10. 部署配置cinder卷存储

    10.1 控制节点配置

    • 创建数据库与用户给予cinder组件使用
    # 创建cinder数据库
    CREATE DATABASE cinder;

    # 创建cinder用户
    GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinderang';
    • 创建cinder用户
    openstack user create --domain default --password cinder cinder
    • 添加cinder用户到admin角色
    openstack role add --project service --user cinder admin
    • 创建cinder服务实体
    openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3
    • 创建cinder服务API端点
    openstack endpoint create --region RegionOne volumev3 public http://www.controller.mxq001:8776/v3/%\(project_id\)s

    openstack endpoint create --region RegionOne volumev3 internal http://www.controller.mxq001:8776/v3/%\(project_id\)s

    openstack endpoint create --region RegionOne volumev3 admin http://www.controller.mxq001:8776/v3/%\(project_id\)s
    • 安装cinder相关服务
    apt install -y cinder-api cinder-scheduler
    • 配置cinder.conf文件
    # 备份文件
    cp /etc/cinder/cinder.conf{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/cinder/cinder.conf.bak > /etc/cinder/cinder.conf

    # 完整配置
    vim /etc/cinder/cinder.conf
    [DEFAULT]
    transport_url = rabbit://openstack:1qaz@WSX3edc@www.controller.mxq001
    auth_strategy = keystone
    my_ip = 10.0.0.10
    [database]
    connection = mysql+pymysql://cinder:cinderang@www.controller.mxq001/cinder
    [keystone_authtoken]
    www_authenticate_uri = http://www.controller.mxq001:5000
    auth_url = http://www.controller.mxq001:5000
    memcached_servers = www.controller.mxq001:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = cinder
    password = cinder
    [oslo_concurrency]
    lock_path = /var/lib/cinder/tmp
    • 填充数据库
    su -s /bin/sh -c "cinder-manage db sync" cinder
    • 配置nova服务可调用cinder服务
    vim /etc/nova/nova.conf
    '''
    [cinder]
    os_region_name = RegionOne
    '''
    • 重启nova服务生效cinder服务
    service nova-api restart
    • 重新启动块存储服务
    service cinder-scheduler restart
    • 平滑重启apache服务识别cinder页面
    service apache2 reload

    10.2 计算节点配置

    • compute01节点
    • 安装支持的实用程序包
    apt install -y lvm2 thin-provisioning-tools
    • 创建LVM物理卷
      • 磁盘根据自己名称指定
    pvcreate /dev/sdb
    • 创建LVM卷组 cinder-volumes
    vgcreate cinder-volumes /dev/sdb
    • 修改lvm.conf文件
      • 作用:添加接受/dev/sdb设备并拒绝所有其他设备的筛选器
    vim /etc/lvm/lvm.conf
    devices {
    ...
    filter = [ "a/sdb/", "r/.*/"]
    • 安装cinder软件包
    apt install -y cinder-volume tgt
    • 配置cinder.conf配置文件
    # 备份配置文件
    cp /etc/cinder/cinder.conf{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/cinder/cinder.conf.bak > /etc/cinder/cinder.conf

    # 完整配置文件
    vim /etc/cinder/cinder.conf
    [DEFAULT]
    transport_url = rabbit://openstack:1qaz@WSX3edc@www.controller.mxq001
    auth_strategy = keystone
    my_ip = 10.0.0.11
    enabled_backends = lvm
    glance_api_servers = http://www.controller.mxq001:9292
    [database]
    connection = mysql+pymysql://cinder:cinderang@www.controller.mxq001/cinder
    [keystone_authtoken]
    www_authenticate_uri = http://www.controller.mxq001:5000
    auth_url = http://www.controller.mxq001:5000
    memcached_servers = www.controller.mxq001:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = cinder
    password = cinder
    [lvm]
    volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
    volume_group = cinder-volumes
    target_protocol = iscsi
    target_helper = tgtadm
    volume_backend_name = lvm
    [oslo_concurrency]
    lock_path = /var/lib/cinder/tmp
    • 指定卷路径
    vim /etc/tgt/conf.d/tgt.conf
    include /var/lib/cinder/volumes/*
    • 重新启动块存储卷服务,包括其依赖项
    service tgt restart

    service cinder-volume restart
    • compute02节点
    • 安装支持的实用程序包
    apt install -y lvm2 thin-provisioning-tools
    • 创建LVM物理卷
      • 磁盘根据自己名称指定
    pvcreate /dev/sdb
    • 创建LVM卷组 cinder-volumes
    vgcreate cinder-volumes /dev/sdb
    • 修改lvm.conf文件
      • 作用:添加接受/dev/sdb设备并拒绝所有其他设备的筛选器
    vim /etc/lvm/lvm.conf
    devices {
    ...
    filter = [ "a/sdb/", "r/.*/"]
    • 安装cinder软件包
    apt install -y cinder-volume tgt
    • 配置cinder.conf配置文件
    # 备份配置文件
    cp /etc/cinder/cinder.conf{,.bak}

    # 过滤覆盖文件
    grep -Ev "^$|#" /etc/cinder/cinder.conf.bak > /etc/cinder/cinder.conf

    # 完整配置文件
    vim /etc/cinder/cinder.conf
    [DEFAULT]
    transport_url = rabbit://openstack:1qaz@WSX3edc@controller
    auth_strategy = keystone
    my_ip = 10.0.0.12
    enabled_backends = lvm
    glance_api_servers = http://controller:9292
    [database]
    connection = mysql+pymysql://cinder:cinderang@controller/cinder
    [keystone_authtoken]
    www_authenticate_uri = http://controller:5000
    auth_url = http://controller:5000
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = cinder
    password = cinder
    [lvm]
    volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
    volume_group = cinder-volumes
    target_protocol = iscsi
    target_helper = tgtadm
    volume_backend_name = lvm
    [oslo_concurrency]
    lock_path = /var/lib/cinder/tmp
    • 指定卷路径
    vim /etc/tgt/conf.d/tgt.conf
    include /var/lib/cinder/volumes/*
    • 重新启动块存储卷服务,包括其依赖项
    service tgt restart

    service cinder-volume restart

    10.3 校验cinder

    • 校验命令
    root@controller:~# openstack volume service list
    +------------------+---------------+------+---------+-------+----------------------------+
    | Binary | Host | Zone | Status | State | Updated At |
    +------------------+---------------+------+---------+-------+----------------------------+
    | cinder-scheduler | controller | nova | enabled | up | 2022-09-29T07:58:33.1qaz@WSX3edc |
    | cinder-volume | compute01@lvm | nova | enabled | up | 2022-09-29T07:58:29.1qaz@WSX3edc |
    | cinder-volume | compute02@lvm | nova | enabled | up | 2022-09-29T07:58:34.1qaz@WSX3edc |

    11. 运维实战

    • 控制节点操作

    11.1 加载openstack环境变量

    source /etc/keystone/admin-openrc.sh

    11.2 创建路由器

    openstack router create Ext-Router

    11.3 创建Vxlan网络

    • 创建vxlan网络
    openstack network create --provider-network-type vxlan Intnal
    • 创建vxlan子网
    openstack subnet create Intsubnal --network Intnal --subnet-range 166.66.66.0/24 --gateway 166.66.66.1 --dns-nameserver 114.114.114.114

    11.4 将内部网络添加到路由器

    • 添加命令
    openstack router add subnet Ext-Router Intsubnal

    11.5 创建Flat网络

    • 创建flat网络
    openstack network create --provider-physical-network physnet1 --provider-network-type flat  --external Extnal
    • 创建flat子网
    openstack subnet create Extsubnal --network Extnal --subnet-range 192.168.3.0/24  --allocation-pool start=192.168.3.100,end=192.168.3.200 --gateway 192.168.3.1 --dns-nameserver 114.114.114.114 --no-dhcp

    11.6 设置路由器网关接口

    openstack router set Ext-Router --external-gateway Extnal

    11.7 开放安全组

    # 开放icmp协议
    openstack security group rule create --proto icmp default

    # 开放22端口
    openstack security group rule create --proto tcp --dst-port 22:22 default

    # 查看安全组规则
    openstack security group rule list

    11.8 上传镜像

    openstack image create cirros04 --disk-format qcow2  --file  cirros-0.4.0-x86_64-disk.img

    11.9 创建云主机

    • 创建ssh-key密钥
    ssh-keygen -N ""
    • 创建密钥
    openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
    • 创建云主机类型
    openstack flavor create --vcpus 1 --ram 512 --disk 1 C1-512MB-1G
    • 创建云主机
    openstack server create --flavor C1-512MB-1G --image cirros --security-group default --nic net-id=4a9567c0-f2bb-4b11-a9db-5a33eb7d3192 --key-name mykey vm01
    • 分配浮动地址
    openstack floating ip create Extnal
    • 将分配的浮动IP绑定云主机
    openstack server add floating ip vm01 192.168.3.118
    • VNC查看实例
    openstack console url show vm01

    11.10 创建卷类型

    openstack volume type create lvm

    11.11 卷类型添加元数据

    cinder --os-username admin --os-tenant-name admin type-key lvm set volume_backend_name=lvm

    11.12 查看卷类型

    openstack volume type list

    11.13 创建卷

    • 指定lvm卷类型创建卷
    openstack volume create lvm01 --type lvm --size 1

    11.14 卷绑定云主机

    • 将卷绑定云主机
    nova volume-attach vm01 2ebc30ed-7380-4ffa-a2fc-33beb32a8592

    二. Ceph集群部署

    1. 环境准备

    主机名IP磁盘CPUmemory
    node110.0.0.18sda:100G,sdb:50G,sdc:50G2C4G
    node210.0.0.19sda:100G ,sdb:50G,sdc:50G2C4G
    node310.0.0.20sda:100G ,sdb:50G,sdc:50G2C4G
    操作系统虚拟化工具
    Ubuntu22.04VMware15

    1.1 配置地址

    • node1节点
    cat > /etc/netplan/00-installer-config.yaml << EOF
    # This is the network config written by 'subiquity'
    network:
    ethernets:
    ens33:
    dhcp4: false
    addresses: [10.0.0.18/24]
    gateway4: 10.0.0.254
    version: 2
    EOF


    # 生效网络
    netplan apply
    • node2节点
    cat > /etc/netplan/00-installer-config.yaml << EOF
    # This is the network config written by 'subiquity'
    network:
    ethernets:
    ens33:
    dhcp4: false
    addresses: [10.0.0.19/24]
    gateway4: 10.0.0.254
    version: 2
    EOF


    # 生效网络
    netplan apply
    • node3节点
    cat > /etc/netplan/00-installer-config.yaml << EOF
    # This is the network config written by 'subiquity'
    network:
    ethernets:
    ens33:
    dhcp4: false
    addresses: [10.0.0.20/24]
    gateway4: 10.0.0.254
    version: 2
    EOF


    # 生效网络
    netplan apply

    1.2 更改主机名

    • node1节点
    hostnamectl set-hostname storage01.mxq001

    # 切换窗口
    bash
    • node2节点
    hostnamectl set-hostname storage02.mxq001

    # 切换窗口
    bash
    • node3节点
    hostnamectl set-hostname storage03.mxq001

    # 切换窗口
    bash

    2. 配置hosts解析(所有节点)

    cat >> /etc/hosts <<EOF
    10.0.0.13 storage01
    10.0.0.14 storage02
    10.0.0.15 storage03
    EOF

    3. 制作离线源(所有节点)

    • 解压离线包并配置本地仓库
    tar zxvf ceph_quincy.tar.gz -C /opt/

    cp /etc/apt/sources.list{,.bak}

    cat > /etc/apt/sources.list << EOF
    deb [trusted=yes] file:// /opt/ceph_quincy/debs/
    EOF

    apt-get clean all
    apt-get update

    4. 配置时间同步

    • 所有节点更改时区
    # 可配置开启
    timedatectl set-ntp true

    # 配置上海时区
    timedatectl set-timezone Asia/Shanghai

    # 系统时钟与硬件时钟同步
    hwclock --systohc
    • node1节点
    # 安装服务
    apt install -y chrony

    # 配置文件
    vim /etc/chrony/chrony.conf
    20 server controller iburst maxsources 2
    61 allow all
    63 local stratum 10

    # 重启服务
    systemctl restart chronyd
    • node2、node3节点
    # 安装服务
    apt install -y chrony

    # 配置文件
    vim /etc/chrony/chrony.conf
    20 pool controller iburst maxsources 4

    # 重启服务
    systemctl restart chronyd

    5. 安装docker(所有节点)

    apt -y install docker-ce

    6. 安装cephadm(node1)

    apt install -y cephadm

    7. 导入ceph镜像(所有节点)

    • 将准备好的离线镜像全部导入
    docker load -i cephadm_images_v17.tar

    7.1 搭建制作本地仓库(node1)

    • 启动仓库镜像
    # 导入镜像
    docker load -i registry.tar

    # 启动
    docker run -d --name registry -p 5000:5000 --restart always 3a0f7b0a13ef
    • 配置仓库地址
    cat >> /etc/docker/daemon.json << EOF
    {
    "insecure-registries":["www.storage01.mxq001:5000"]
    }
    EOF

    systemctl daemon-reload
    systemctl restart docker
    • 打地址标签
    docker tag 0912465dcea5 www.storage01.mxq001:5000/ceph:v17
    • 推入仓库
    docker push www.storage01.mxq001:5000/ceph:v17

    7.2 配置私有仓库

    • node2、node3节点配置私有仓库
    cat >> /etc/docker/daemon.json << EOF
    {
    "insecure-registries":["www.storage01.mxq001:5000"]
    }
    EOF

    systemctl daemon-reload
    systemctl restart docker

    8. 引导集群(node1)

    • 初始化mon节点
    mkdir -p /etc/ceph

    cephadm --image www.storage01.mxq001:5000/ceph:v17 bootstrap --mon-ip 10.0.0.13 --initial-dashboard-user admin --initial-dashboard-password 1qaz@WSX3edc --skip-pull



    ps:
    # 要部署其他监视器
    ceph orch apply mon "test01,test02,test03"


    # 删除集群
    cephadm rm-cluster --fsid d92b85c0-3ecd-11ed-a617-3f7cf3e2d6d8 --force

    9. 安装ceph-common工具(node1)

    • 安装服务
    apt install -y ceph-common

    10. 添加主机到集群(node1)

    • 传输ceph密钥
    ssh-copy-id -f -i /etc/ceph/ceph.pub storage02

    ssh-copy-id -f -i /etc/ceph/ceph.pub storage03
    • 集群机器发现
    ceph orch host add storage02

    ceph orch host add storage03

    11. 部署OSD

    • 存储数据
    • node1机器
    # 查看可用的磁盘设备
    ceph orch device ls

    # 添加到ceph集群中,在未使用的设备上自动创建osd
    ceph orch apply osd --all-available-devices

    PS:
    # 从特定主机上的特定设备创建OSD:
    ceph orch daemon add osd node1:/dev/sdb
    ceph orch daemon add osd node2:/dev/sdb
    ceph orch daemon add osd node3:/dev/sdb



    # 查看osd磁盘
    ceph -s

    ceph df

    12. 访问仪表盘查看状态

    三. OpenStack对接Ceph平台

    1. 创建后端需要的存储池

    • node1节点操作

    1.1 cinder卷的存储池

    ceph osd pool create volumes 32

    1.2 glance存储池

    ceph osd pool create images 16

    1.3 备份存储池

    ceph osd pool create backups 16

    1.4 创建实例存储池

    ceph osd pool create vms 16

    2. 创建后端用户

    2.1 创建密钥

    • node1节点操作
    • 切换到ceph目录
    cd /etc/ceph/
    • 在ceph上创建cinder、glance、cinder-backup、nova用户创建密钥,允许访问使用Ceph存储池

    2.1.1 创建用户client.cinder

    • 对volumes存储池有rwx权限,对vms存储池有rwx权限,对images池有rx权限
    ceph auth get-or-create client.cinder mon "allow r" osd "allow class-read object_prefix rbd_children,allow rwx pool=volumes,allow rwx pool=vms,allow rx pool=images"


    # class-read:x的子集,授予用户调用类读取方法的能力

    # object_prefix 通过对象名称前缀。下例将访问限制为任何池中名称仅以 rbd_children 为开头的对象。

    2.1.2 创建用户client.glance

    • 对images存储池有rwx权限
    ceph auth get-or-create client.glance mon "allow r" osd "allow class-read object_prefix rbd_children,allow rwx pool=images"

    2.1.3 创建用户client.cinder-backup

    • 对backups存储池有rwx权限
    ceph auth get-or-create client.cinder-backup mon "profile rbd" osd "profile rbd pool=backups"


    # 使用 rbd profile 为新的 cinder-backup 用户帐户定义访问权限。然后,客户端应用使用这一帐户基于块来访问利用了 RADOS 块设备的 Ceph 存储。

    2.2 创建存放目录

    • controller节点
    mkdir /etc/ceph/
    • compute01节点
    mkdir /etc/ceph/
    • compute02节点
    mkdir /etc/ceph/

    2.3 导出密钥

    • node1节点
    • 导出glance密钥
    ceph auth get client.glance -o ceph.client.glance.keyring
    • 导出cinder密钥
    ceph auth get client.cinder -o ceph.client.cinder.keyring
    • 导出cinder-backup密钥
    ceph auth get client.cinder-backup -o ceph.client.cinder-backup.keyring

    2.4 拷贝密钥

    • node1节点操作

    2.4.1 控制节点准备

    • 拷贝glance密钥
    scp ceph.client.glance.keyring root@www.controller.mxq001:/etc/ceph/
    • 拷贝cinder密钥
    scp ceph.client.cinder.keyring root@www.controller.mxq001:/etc/ceph/
    • 拷贝ceph集群认证配置文件
    scp ceph.conf root@www.controller.mxq001:/etc/ceph/

    2.4.2 计算节点准备

    • 拷贝cinder密钥
    scp ceph.client.cinder.keyring root@www.compute01.mxq001:/etc/ceph/

    scp ceph.client.cinder.keyring root@www.compute02.mxq001:/etc/ceph/
    • 拷贝cinder-backup密钥(backup服务节点)
    scp ceph.client.cinder-backup.keyring root@www.compute01.mxq001:/etc/ceph/

    scp ceph.client.cinder-backup.keyring root@www.compute02.mxq001:/etc/ceph/
    • 拷贝ceph集群认证配置文件
    scp ceph.conf root@www.compute01.mxq001:/etc/ceph/

    scp ceph.conf root@www.compute02.mxq001:/etc/ceph/

    3. 计算节点添加libvirt密钥

    3.1 compute01添加密钥

    • 生成密钥(PS:注意,如果有多个计算节点,它们的UUID必须一致)
    cd /etc/ceph/

    UUID=$(uuidgen)

    cat >> secret.xml << EOF
    <secret ephemeral='no' private='no'>
    <uuid>$UUID</uuid>
    <usage type='ceph'>
    <name>client.cinder secret</name>
    </usage>
    </secret>
    EOF
    • 执行命令写入secret
    [root@compute01 ~]# virsh secret-define --file secret.xml
    Secret bf168fa8-8d5b-4991-ba4c-12ae622a98b1 created
    • 加入key
    # 将key值复制出来
    [root@compute01 ~]# cat ceph.client.cinder.keyring
    AQALyS1jHz4dDRAAEmt+c8JlXWyzxmCx5vobZg==

    [root@compute01 ~]# virsh secret-set-value --secret ${UUID} --base64 $(cat ceph.client.cinder.keyring | grep key | awk -F ' ' '{print $3}')
    • 查看添加后端密钥
    virsh secret-list

    3.2 compute02添加密钥

    • 生成密钥(PS:注意,如果有多个计算节点,它们的UUID必须一致)
    cd /etc/ceph/

    UUID=bf168fa8-8d5b-4991-ba4c-12ae622a98b1

    cat >> secret.xml << EOF
    <secret ephemeral='no' private='no'>
    <uuid>$UUID</uuid>
    <usage type='ceph'>
    <name>client.cinder secret</name>
    </usage>
    </secret>
    EOF
    • 执行命令写入secret
    [root@compute02 ~]# virsh secret-define --file secret.xml
    Secret bf168fa8-8d5b-4991-ba4c-12ae622a98b1 created
    • 加入key
    # 将key值复制出来
    [root@compute02 ~]# cat ceph.client.cinder.keyring
    AQALyS1jHz4dDRAAEmt+c8JlXWyzxmCx5vobZg==

    [root@compute02 ~]# virsh secret-set-value --secret ${UUID} --base64 $(cat ceph.client.cinder.keyring | grep key | awk -F ' ' '{print $3}')


    # 忽略报错信息
    • 查看添加后端密钥
    virsh secret-list

    4. 安装ceph客户端

    • 主要作用是OpenStack可调用Ceph资源
    • controller节点
    apt install -y ceph-common
    • compute01节点
    apt install -y ceph-common
    • compute02节点
    apt install -y ceph-common

    5. 配置glance后端存储

    • controller节点
    • 更改glance密钥属性
    chown glance.glance /etc/ceph/ceph.client.glance.keyring
    • 修改配置文件
    vim /etc/glance/glance-api.conf
    [glance_store]
    #stores = file,http
    #default_store = file
    #filesystem_store_datadir = /var/lib/glance/images/
    stores = rbd,file,http
    default_store = rbd
    rbd_store_pool = images
    rbd_store_user = glance
    rbd_store_ceph_conf = /etc/ceph/ceph.conf
    rbd_store_chunk_size = 8
    • 安装缺失aws的模块
    apt install -y python3-boto3
    • 重启生效ceph配置
    service glance-api restart
    • 上传镜像
    openstack image create cirros04_v1 --disk-format qcow2 --file cirros-0.4.0-x86_64-disk.img
    • 到node1节点验证镜像
    rbd  ls images

    6. 配置cinder后端存储

    • 更改cinder密钥属性(controller、compute01、compute02节点)
    chown cinder.cinder /etc/ceph/ceph.client.cinder.keyring
    • 修改配置文件(controller节点)
    vim /etc/cinder/cinder.conf
    [DEFAULT]
    # 指定存储类型,否则在创建卷时,类型为 __DEFAULT__
    default_volume_type = ceph


    # 重启服务生效配置
    service cinder-scheduler restart
    • 修改配置文件(compute01、compute02存储节点)
    vim /etc/cinder/cinder.conf
    [DEFAULT]
    enabled_backends = ceph,lvm

    [ceph]
    volume_driver = cinder.volume.drivers.rbd.RBDDriver
    rbd_pool = volumes
    rbd_ceph_conf = /etc/ceph/ceph.conf
    rbd_flatten_volume_from_snapshot = false
    rbd_max_clone_depth = 5
    rbd_store_chunk_size = 4
    rados_connect_timeout = -1
    glance_api_version = 2
    rbd_user = cinder
    rbd_secret_uuid = e2a779f1-d257-440d-8ff1-b8795dd40957
    volume_backend_name = ceph


    # 重启服务生效配置
    service cinder-volume restart
    • 创建卷类型(controller节点)
    openstack volume type create ceph
    • 设置卷类型元数据(controller节点)
    cinder --os-username admin --os-tenant-name admin type-key ceph set volume_backend_name=ceph
    • 查看存储类型(controller节点)
    openstack volume type list
    • 创建卷测试(controller节点)
    openstack volume create ceph01 --type ceph --size 1
    • 查看volumes存储池是否存在卷
    rbd ls volumes

    7. 配置卷备份

    • compute01、compute02节点
    • 安装服务
    apt install cinder-backup -y
    • 更改密钥属性
    chown cinder.cinder /etc/ceph/ceph.client.cinder-backup.keyring
    • 修改配置文件
    vim /etc/cinder/cinder.conf
    [DEFAULT]
    backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
    backup_ceph_conf=/etc/ceph/ceph.conf
    backup_ceph_user = cinder-backup
    backup_ceph_chunk_size = 4194304
    backup_ceph_pool = backups
    backup_ceph_stripe_unit = 0
    backup_ceph_stripe_count = 0
    restore_discard_excess_bytes = true
    • 重启生效配置
    service cinder-backup restart
    • 创建卷备份(controller节点)
    openstack volume backup create --name ceph_backup ceph01 
    • 验证卷备份(node1节点)
    rbd ls backups

    8. 配置nova集成ceph

    • compute01、compute02节点
    • 修改配置文件
    vim /etc/nova/nova.conf
    [DEFAULT]
    live_migration_flag = "VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE"

    [libvirt]
    images_type = rbd
    images_rbd_pool = vms
    images_rbd_ceph_conf = /etc/ceph/ceph.conf
    rbd_user = cinder
    rbd_secret_uuid = e2a779f1-d257-440d-8ff1-b8795dd40957
    • 安装qemu支持rbd
    apt install -y qemu-block-extra
    • 重启nova服务生效配置
    service nova-compute restart
    • 创建实例测试(controller节点)
    openstack server create --flavor C1-512MB-1G --image cirros04_v1 --security-group default --nic net-id=$(vxlan网络id) --key-name mykey vm02
    openstack server create --flavor C1-512MB-1G --image cirros04_v1 --security-group default --nic net-id=4a9567c0-f2bb-4b11-a9db-5a33eb7d3192 --key-name mykey vm02
    # 安全组对应admin项目ID
    • 验证是否到ceph中的vms存储池
    rbd ls vms

    8.1 热迁移配置

    • compute01、compute02节点
    • 配置监听地址
    vim /etc/libvirt/libvirtd.conf
    listen_tls = 0
    listen_tcp = 1
    tcp_port = "16509"
    listen_addr = "10.0.0.12" # 注意自己的主机地址
    auth_tcp = "none"
    • 开启监听地址
    vim /etc/default/libvirtd
    LIBVIRTD_ARGS="--listen"
    • 屏蔽libvirtd服务
    systemctl mask libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket libvirtd-tls.socket libvirtd-tcp.socket
    • 重启libvirtd生效配置
    service libvirtd restart
    • 重启计算节点nova服务
    service nova-compute restart
    • 测试是否能互相通信连接
      • 互通测试再进行热迁移
    • compute01连接compute02
    virsh -c qemu+tcp://www.compute02.mxq001/system
    • compute02连接compute01
    virsh -c qemu+tcp://www.compute01.mxq001/system
    • 查看云主机
    openstack server list
    • 查看需要迁移的云主机详细信息
    openstack server show 1f6dd9b8-7700-43a7-bd1f-0695e0de4a04
    • 热迁移到另一个计算节点
    nova live-migration openstack server show 1f6dd9b8-7700-43a7-bd1f-0695e0de4a04 www.compute02.mxq001
  • Linux系统通过firewall限制或开放IP及端口

    一、查看防火墙状态
    1、首先查看防火墙是否开启,如未开启,需要先开启防火墙并作开机自启

    systemctl status firewalld


    开启防火墙并设置开机自启

    systemctl start firewalld
    systemctl enable firewalld
    一般需要重启一下机器,不然后面做的设置可能不会生效

    二、开放或限制端口
    1、开放端口
    (1)如我们需要开启XShell连接时需要使用的22端口

    firewall-cmd –zone=public –add-port=22/tcp –permanent


    其中–permanent的作用是使设置永久生效,不加的话机器重启之后失效

    (2)重新载入一下防火墙设置,使设置生效

    firewall-cmd –reload

    (3)可通过如下命令查看是否生效

    firewall-cmd –zone=public –query-port=22/tcp


    (4)如下命令可查看当前系统打开的所有端口

    firewall-cmd –zone=public –list-ports


    2、限制端口
    (1)比如我们现在需要关掉刚刚打开的22端口

    firewall-cmd –zone=public –remove-port=22/tcp –permanent


    (2)重新载入一下防火墙设置,使设置生效

    firewall-cmd –reload


    (3)再去查看系统所有开放的端口,已经看到没有22端口了

    firewall-cmd –zone=public –list-ports


    3、批量开放或限制端口
    (1)批量开放端口,如从100到500这之间的端口我们全部要打开

    firewall-cmd –zone=public –add-port=100-500/tcp –permanent


    (2)重新载入一下防火墙设置,使设置生效

    firewall-cmd –reload


    (3)查看系统所有开放的端口,可以看到从100到500的端口已被全部开放

    firewall-cmd –zone=public –list-ports

    (4)同理,批量限制端口为

    firewall-cmd –zone=public –remove-port=100-500/tcp –permanent
    firewall-cmd –reload
    三、开放或限制IP
    1、限制IP地址访问
    (1)比如限制IP为192.168.0.200的地址禁止访问80端口即禁止访问机器

    firewall-cmd –permanent –add-rich-rule=”rule family=”ipv4″ source address=”192.168.0.200″ port protocol=”tcp” port=”80″ reject”


    (2)重新载入一下防火墙设置,使设置生效

    firewall-cmd –reload
    (3)查看已经设置的规则

    firewall-cmd –zone=public –list-rich-rules


    2、解除IP地址限制
    (1)解除刚才被限制的192.168.0.200

    firewall-cmd –permanent –add-rich-rule=”rule family=”ipv4″ source address=”192.168.0.200″ port protocol=”tcp” port=”80″ accept”


    (2)重新载入一下防火墙设置,使设置生效

    firewall-cmd –reload
    (3)再查看规则设置发现已经没有192.168.0.200的限制了

    firewall-cmd –zone=public –list-rich-rules


    如设置未生效,可尝试直接编辑规则文件,删掉原来的设置规则,重新载入一下防火墙即可

    vi /etc/firewalld/zones/public.xml

    3、限制IP地址段
    (1)如我们需要限制10.0.0.0-10.0.0.255这一整个段的IP,禁止他们访问

    firewall-cmd –permanent –add-rich-rule=”rule family=”ipv4″ source address=”10.0.0.0/24″ port protocol=”tcp” port=”80″ reject”
    其中10.0.0.0/24表示为从10.0.0.0这个IP开始,24代表子网掩码为255.255.255.0,共包含256个地址,即从0-255共256个IP,即正好限制了这一整段的IP地址,具体的设置规则可参考下表

    (2)重新载入一下防火墙设置,使设置生效

    firewall-cmd –reload
    (3)查看规则,确认是否生效

    firewall-cmd –zone=public –list-rich-rules
    (4)同理,打开限制为

    firewall-cmd –permanent –add-rich-rule=”rule family=”ipv4″ source address=”10.0.0.0/24″ port protocol=”tcp” port=”80″ accept”
    firewall-cmd –reload

    原文:https://blog.csdn.net/ywd1992/article/details/80401630

  • openEuler服务器bond配置

    介绍:网卡 bond 就是通过把多个网卡绑定为一个逻辑网卡,实现网口冗余、负载均衡,增加服务器 的可靠性、稳定性,提高网络带宽。本文将详细介绍命令行下配置bond。

    环境准备

    1.openEuler20.03

    2.光纤连接好

    3.交换机聚合口配好

    功能介绍

    Bond有7中模式:(不做具体介绍本文使用mode=0 负载均衡模式,和交换机的端口聚合强制不协商的方式配合)

    配置方法

    1. 使用 nmcli 命令创建 bond0,自动生成配置文件:

    nmcli connection add type bond ifname bond0 mode 0

    在/etc/sysconfig/network-scripts会生成ifcfg-bond-bond0

    2.手动修改ifcfg-bond-bond0生成文件

    BOOTPROTO=none

    IPADDR=172.

    NETMASK=255.255.255.0

    GATEWAY=172.

    DNS1=202.

    (根据自己的实际情况进行填写)

    3.绑定ifcfg-enp130s0f0和ifcfg-enp130s0f1位bond网口

    nmcli connection add type bond-slave ifname enp130s0f0 master bond0

    nmcli connection add type bond-slave ifname enp130s0f1 master bond0

    均显示添加成功(successfully added)

    将网卡配置文件ifcfg-enp130s0f0和ifcfg-enp130s0f0备份

    mkdir bak  (在/etc/sysconfig/network-scripts下)

    mv ifcfg-enp130s0f0 bak

    mv ifcfg-enp130s0f1 bak

    4.使能bond并重启服务器

    systemctl restart NetworkManager

    nmcli con reload

    reboot

    此部至关重要,在操作过程中有使用重启网卡和重新加载bond,均未生效,来来回回找问题,最后reboot解决!

    5.验证

    ethtool bond0

    单张网卡speed为10000Mb/s,显示为20000Mb/s即聚合成功

    ping www.baidu.com 

    成功!

  • OpenEuler ⽹卡绑定及bond模式

    1.查看主机网络环境

    # ip a s

    明确需要做bond 的网卡名称。

    2.查看添加bind0⽹卡信息

    # nmcli connection show

    3.添加bonding接口

    # nmcli connection add type bond con-name bond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 10.0.0.100/24 ipv4.gateway 10.0.0.2 ipv4.dns 202.96.128.86,114.114.114.114 connection.autoconnect yes

    实际过程中可能会未提供IP及网关,可以先自定义一个,提供后,vi /etc/sysconfig/network-scripts/bond0 进行IP修改。

    4.添加从属接口

    nmcli connection add type bond-slave ifname eth0 con-name bond-slave-eth0 master bond0

    nmcli connection add type bond-slave ifname eth1 con-name bond-slave-eth1 master bond0


    5.启动⽹卡,顺序不能乱

    配置完成后,网卡默认启动。

    手动配置如下:

    #第⼀步: 要启动绑定,则必须⾸先启动从属接⼝,bond-slave-eth0、bond-slave-eth1

    nmcli con up bond-slave-eth0

    nmcli con up bond-slave-eth1

    #第⼆步:启动绑定⽹卡bind0

    nmcli con up bond0

    6.查看ip地址及⽹卡信息

    [ root@openeuler ~ ]# nmcli connection show

    [ root@openeuler ~ ]# ip a s

    [ root@openeuler~ ]# ifconfig

    [ root@openeuler~ ]# ethtool bond0

    [ root@openeuler~ ]# ethtool eth0

    [ root@openeuler~ ]# ethtool eth1

    7.测试

    直接相关服务器进行互ping即可。

    8.bond原理

            Linux⽹卡绑定mode共有七种(0~6) bond0、bond1、bond2、bond3、bond4、bond5、bond6

    常⽤的有三种

            mode=0:平衡负载模式,有⾃动备援,但需要”Switch”⽀援及设定。

            mode=1:⾃动备援模式,其中⼀条线若断线,其他线路将会⾃动备援。

            mode=6:平衡负载模式,有⾃动备援,不必”Switch”⽀援及设定。

            需要说明的是如果想做成mode 0的负载均衡,仅仅设置这⾥options bond0 miimon=100 mode=0是不够的,与⽹卡相连的交换机必须做特殊配置(这两个端⼝应该采取聚合⽅式),因为做bonding的这两块⽹卡是使⽤同⼀个MAC地址.从原理分析⼀下(bond运⾏在mode 0下):

            mode 0下bond所绑定的⽹卡的IP都被修改成相同的mac地址,如果这些⽹卡都被接在同⼀个交换机,那么交换机的arp表⾥这个mac地址对应的端⼝就有多 个,那么交换机接受到发往这个mac地址的包应该往哪个端⼝转发呢?正常情况下mac地址是全球唯⼀的,⼀个mac地址对应多个端⼝肯定使交换机迷惑了。所以 mode0下的bond如果连接到交换机,交换机这⼏个端⼝应该采取聚合⽅式(cisco称为 ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,聚合下的⼏个端⼝也被捆绑成⼀个mac地址.我们的解 决办法是,两个⽹卡接⼊不同的交换机即可。

            mode6模式下⽆需配置交换机,因为做bonding的这两块⽹卡是使⽤不同的MAC地址。

    七种bond模式说明

            第⼀种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略)

            特点:传输数据包顺序是依次传输(即:第1个包⾛eth0,下⼀个包就⾛eth1….⼀直循环下去,直到最后⼀个传输完毕),此模式提供负载平衡和容错能⼒;但是我们知道如果⼀个连接或者会话的数据包从不同的接⼝发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包⽆序到达的问题,⽽⽆序到达的数据包需要重新要求被发送,这样⽹络的吞吐量就会下降

            第⼆种模式:mod=1,即: (active-backup) Active-backup policy(主-备份策略)

            特点:只有⼀个设备处于活动状态,当⼀个宕掉另⼀个⻢上由备份转换为主设备。mac地址是外部可⻅得,从外⾯看来,bond的MAC地址是唯⼀的,以避免switch(交换机)发⽣混乱。此模式只提供了容错能⼒;由此可⻅此算法的优点是可以提供⾼⽹络连接的可⽤性,但是它的资源利⽤率较低,只有⼀个接⼝处于⼯作状态,在有 N 个⽹络接⼝的情况下,资源利⽤率为1/N。

            第三种模式:mod=2,即:(balance-xor) XOR policy(平衡策略)

            特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR ⽬标MAC地址) %slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能⼒。

            第四种模式:mod=3,即:broadcast(⼴播策略)

            特点:在每个slave接⼝上传输每个数据包,此模式提供了容错能⼒

            第五种模式:mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合)

            特点:创建⼀个聚合组,它们共享同样的速率和双⼯设定。根据802.3ad规范将多个slave⼯作在同⼀个激活的聚合体下。外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的 是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应 性。

            必要条件:

            条件1:ethtool⽀持获取每个slave的速率和双⼯设定

            条件2:switch(交换机)⽀持IEEE 802.3ad Dynamic link aggregation

            条件3:⼤多数switch(交换机)需要经过特定配置才能⽀持802.3ad模式

            第六种模式:mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡)

            特点:不需要任何特别的switch(交换机)⽀持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另⼀个slave接管失败的slave的MAC地址。该模式的必要条件:ethtool⽀持获取每个slave的速率.。

            第七种模式:mod=6,即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡)

            特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance,rlb),⽽且不需要任何switch(交换机)的⽀持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯⼀硬件地址,从⽽使得不同的对端使⽤不同的硬件地址进⾏通信。来⾃服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达 时,bonding驱动把它的硬件地址提取出来,并发起⼀个ARP应答给bond中的某个slave。使⽤ARP协商进⾏负载均衡的⼀个问题是:每次⼴播 ARP请求时都会使⽤bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。

            这个问题可以通过给所有的对端发送更新 (ARP应答)来解决,应答中包含他们独⼀⽆⼆的硬件地址,从⽽导致流量重新分布。当新的slave加⼊到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最⾼速的slave上当某个链路被重新接上,或者⼀个新的slave加⼊到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使⽤指定的MAC地址给每个 client发起ARP应答。下⾯介绍的updelay参数必须被设置为某个⼤于等于switch(交换机)转发延时的值,从⽽保证发往对端的ARP应答 不会被switch(交换机)阻截。

            必要条件:

            条件1:ethtool⽀持获取每个slave的速率;

            条件2:底层驱动⽀持设置某个设备的硬件地址,从⽽使得总是有个slave(curr_active_slave)使⽤bond的硬件地址,同时保证每个bond 中的slave都有⼀个唯⼀的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管其实mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;⽽mod=0的话,会发现2个⼝的流量都很稳定,基本⼀样的带宽。⽽mod=6,会发现第⼀个⼝流量很⾼,第2个⼝只占了⼩部分流量。

    作者:蒲公英的
    链接:https://www.jianshu.com/p/8bc7160a77c0
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。