wenmo8 发布的文章

前言


在 Android 系统上, Camera 输出的图像一般为 NV21(YUV420SP 系列) 格式, 当我们想进行录像处理时, 会面临两个问题


问题 1

图像的旋转问题

  • 后置镜头: 需要旋转 90°

  • 前置镜头: 需要旋转 270° 然后再进行镜像处理

问题 2

处理好镜头的旋转后, 当我们尝试使用 MediaCodec 进行 H.264 的硬编时, 便会发现偏色的问题


这是因为 MediaCodec 的 COLOR_FormatYUV420SemiPlanar 格式为 NV12, 并非是 NV21, 虽然都是 YUV420SP 系列, 但他们的排列不同, 都是先存储 Y 的数据, NV21 是 vu 交替存储, NV12 是 uv 交替存储

-NV21: yyyy yyyy vu vu
-NV12: yyyy yyyy uv uv

为了解决这个问题, 对于这个问题网上有很多的解决思路, 我们可以在 Java 层使用进行数据操作, 不过经过测试之后发现, 在 Samsung S7 Edge 上, 录制 1080p。


  • 旋转与镜像: 20ms

  • NV21 转 NV12: 16ms


消耗时长约为 40ms, 这也仅仅是勉强能够进行 25 帧的录制, 在使用 opencv 进行人脸识别或滤镜处理时, 能够感觉到明显的卡顿感。


libyuv 便是 google 为了解决移动端 NV21 数据处理不便所提供的开源库, 它提供了旋转, 裁剪, 镜像, 缩放等功能。


接下来看看 libyuv 的编译与使用。

一. 环境

操作系统

MacOS Mojave version 10.14.5


Libyuv

https://chromium.googlesource.com/libyuv/libyuv/

git clone https://chromium.googlesource.com/libyuv/libyuv

图片libyuv 源码

NDK 版本

NDK16


cmake 版本

➜  ~ cmake -version
cmake version 3.14.5

二. 编译脚本

从 libyuv 的源码中, 可以看到 libyuv 已经提供了 CMakeLists.txt, 因此我们可以直接通过 cmake 生成 Makefile, 然后通过 make 对 Makefile 进行编译

ARCH=arm
ANDROID_ARCH_ABI=armeabi-v7a
NDK_PATH=/Users/sharrychoo/Library/Android/ndk/android-ndk-r16b
PREFIX=`pwd`/android/${ARCH}/${CPU}

# cmake 传参
cmake -G"Unix Makefiles" \
-DANDROID_NDK=${NDK_PATH} \
   -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
   -DANDROID_ABI=${ANDROID_ARCH_ABI} \
   -DANDROID_NATIVE_API_LEVE=16 \
   -DCMAKE_INSTALL_PREFIX=${PREFIX} \
-DANDROID_ARM_NEON=TRUE \
   ..
   
# 生成动态库
make
make install

图片编译结果

输出的 so 库

图片so 库

三. 代码编写

我们将 so 库和头文件拷贝到 AS 中, 便可以进行代码的编写了, 这里编写一个 Libyuv 的工具类, 方便后续使用


一) Java 代码


这里以 NV21 转 I420 为例

/**
* 处理 YUV 的工具类
*
* @author Sharry <a href="sharrychoochn@gmail.com">Contact me.</a>
* @version 1.0
* @since 2019-07-23
*/

public class LibyuvUtil {

   static {
       System.loadLibrary("smedia-camera");
   }

   /**
    * 将 NV21 转 I420
    */

   public static native void convertNV21ToI420(byte[] src, byte[] dst, int width, int height);
   
   ......
}

二) native 实现

这里以将 NV21 转 I420 为例

namespace libyuv_util {

   void convertI420ToNV12(JNIEnv *env, jclass, jbyteArray i420_src, jbyteArray nv12_dst, int width,
                          int height)
{
       jbyte *src = env->GetByteArrayElements(i420_src, NULL);
       jbyte *dst = env->GetByteArrayElements(nv12_dst, NULL);
       // 执行转换 I420 -> NV12 的转换
       LibyuvUtil::I420ToNV12(src, dst, width, height);
       // 释放资源
       env->ReleaseByteArrayElements(i420_src, src, 0);
       env->ReleaseByteArrayElements(nv12_dst, dst, 0);
   }
   
}

void LibyuvUtil::NV21ToI420(jbyte *src, jbyte *dst, int width, int height){
   // NV21 参数
   jint src_y_size = width * height;
   jbyte *src_y = src;
   jbyte *src_vu = src + src_y_size;
   // I420 参数
   jint dst_y_size = width * height;
   jint dst_u_size = dst_y_size >> 2;
   jbyte *dst_y = dst;
   jbyte *dst_u = dst + dst_y_size;
   jbyte *dst_v = dst + dst_y_size + dst_u_size;
   /**
   * <pre>
   * int NV21ToI420(const uint8_t* src_y,
   *          int src_stride_y,
   *          const uint8_t* src_vu,
   *          int src_stride_vu,
   *          uint8_t* dst_y,
   *          int dst_stride_y,
   *          uint8_t* dst_u,
   *          int dst_stride_u,
   *          uint8_t* dst_v,
   *          int dst_stride_v,
   *          int width,
   *          int height);
   * </pre>
   * <p>
   * stride 为颜色分量的跨距: 它描述一行像素中, 该颜色分量所占的 byte 数目, YUV 每个通道均为 1byte(8bit)
   * <p>
   * stride_y: Y 是最全的, 一行中有 width 个像素, 也就有 width 个 Y
   * stride_u: YUV420 的采样为 Y:U:V = 4:1:1, 从整体的存储来看, 一个 Y 分量的数目为 U/V 的四倍
   * 但从一行上来看, width 个 Y, 它会用到 width/2 个 U
   * stride_v: 同 stride_u 的分析方式
   */

   libyuv::NV21ToI420(
           (uint8_t *) src_y, width,
           (uint8_t *) src_vu, width,
           (uint8_t *) dst_y, width,
           (uint8_t *) dst_u, width >> 1,
           (uint8_t *) dst_v, width >> 1,
           width, height
   );
}

可以看到方法的调用也非常的简单, 只需要传入相关参数即可, 其中有个非常重要的参数, stride 跨距, 它描述一行像素中, 该颜色分量所占的 byte 数目

  • YUV420 系列

    • Y: 跨距为 width

    • U: 跨距为 width/2

    • V: 跨距为 width/2

    • Y: 跨距为 width

    • VU: 跨距为 width

    • NV21

    • I420P(YU12):

  • ABGR: 跨距为 4 *width

总结

通过 libyuv 进行旋转镜像转码等操作, 其时长如下


  • 旋转镜像: 5~8ms

  • NV21 转 NV12: 0~3ms

可以看到比起 java 代码, 几乎快了 3 倍, 这已经能够满足流畅录制的需求了


笔者将常用的 YUV 操作整理成了demo 点击查看, 如有需要可以将代码直接拷走使用:

https://github.com/SharryChoo/LibyuvSample





不知道你有没有这样的困惑:

在人际交往中,每次需要别人帮忙的时候,都要纠结很长时间;

怕麻烦别人,也害怕提要求会被拒绝;

甚至,每当接受别人的帮助时,都会觉得愧疚。

但就如武志红老师所说:“很多人怕麻烦别人,但是,不麻烦彼此,关系也就无从建立。


不想麻烦别人
来自于你内在无价值的感受


生活当中,我们总是免不了跟人接触、交往。

和亲戚、爱人、朋友,在共同分担的时候感受到支持和滋养,在互相帮助中成长,也在彼此“麻烦”中建立更深的关系。

你付出,我接受,然后有一天,你接受,我付出,一种动态中平衡,令关系向前。

而不是你害怕付出,我也不敢接受,或者我不付出,你也不接受。在这样静止而隔离的关系状态里,无论是我们自身还是关系,都没有办法继续成长。

这让我想起了自己刚开始成为一名讲师和咨询师的时光。

大概是在十八年前,当时因为职业生涯刚刚起步,只要有相关的工作机会,我都非常珍惜。

有一次,我到广州的一家幼儿园给家长们做一个两小时的分享,我做了很多准备,分享的效果也相当不错,分享结束之后,主办方送了一束花给我。

面对这束送到我眼前的花,我诚惶诚恐,有一种不好意思接过来的感觉,内心简直比讲课还要紧张。

后来我尝试去自我觉察,为什么我在别人送给我花的时候,会这么慌张呢?

我发现,一方面,我想要谦逊,不想过多地麻烦别人,另外一方面,我也发现,在表面的这一份谦逊底下,和害怕麻烦别人的低下,我内在有一部分无价值感、低自尊感的感受。

当时的我潜意识中有种声音和想法是这样的:

我所付出的时间,所讲的内容,似乎都不重要,别人愿意来听,比我讲什么更重要,居然还要送一束花给我,给我的实在是太多了。

所以,当我接受别人的馈赠,或者帮助时,我的第一反应就是受之有愧和手足无措,内心充斥着这样的想法:

我会不会麻烦别人了呢?

我值得拥有这些帮助和肯定吗?



失衡的情感天平


我们提出要求的信心,和我们有多坦然接受别人的帮助,是成正比的。

为什么这么说呢?

因为我们每一个人的内在都有着一个情感天平。

当我决定接受你的帮助之后,事实上,我的内心已经准备好,我有信心、有能力同样地付出给你。

这时候,我们内在情感的天平是趋向平衡的,在接受和付出之间,相对平衡,内心没有任何的愧疚感。

但是,假如当我接受了你的帮助,觉得自己没有能力、没有信心,可以在某个时候,同样去付出和回报时,內在的情感天平就失衡了。

我感觉到愧疚,没有价值感。

内在情感天平的失衡,让我们不敢去麻烦别人,因为我不知道如何面对内心愧疚的感觉,也就不敢去接受别人的付出和帮助。

渐渐地,这会让我们的自我界限不断收紧,心也渐渐关闭,紧紧地锁上内在脆弱、无价值的部分。然后我们也不会付出,也不会接受了。

接受和付出,是一个动态的平衡;

求助和接受帮助,同样是一种动态的平衡。

当我们可以去提出和请求他人的帮助,我们的内心,如果已经准备好有一天,也去付出和回馈对方帮助的时候,我们就可以有勇气和力量去开口求助了。

所以,当你总是害怕麻烦别人,而无法大方地去提出要求或是求助的时候,去觉察一下——

内在的情感天平是否因为低价值感和低资格感而失衡了,导致你无法接受他人的帮助,也无法为他人付出。



练习在接受和付出之间平衡


接下来,我会带领一个催眠对话的练习,邀请你去想象在你生命中最难为情,不敢开口求助的一个人。

也许是你的父母,也许是你的朋友,也许是你的爱人,也许是同事,想象TA就站在你眼前;

然后通过正向催眠的对话,去转化隐藏在我们内心的低自尊感、负疚感等情绪,让内在的情感天平处在一个平衡而有力量的状态。

好,现在你可以找到一个安静的地方,让自己安顿下来,做一两个深呼吸,慢慢地回到内在。

现在,我邀请你去感受,在你生命中最难为情,最不敢开口求助的人是谁呢?

是父母,或者某个朋友,或者是你的伴侣,公司里的某个同事……

无论是谁,想象TA站在你的前面,TA距离你多远呢?在什么样的位置呢?

当你面对TA,你会讲出什么样的要求呢?

当你去思考要怎么说,或者应不应该说,或者是想象对方会怎样回应你,答不答应你的请求时,做一个呼吸,去觉察,你这个时候的内在感受是怎样的呢?

也许是负疚感吗,也许是软弱感,也许是害怕被拒绝……

无论那是什么,做一个呼吸,给这些情绪、感受一个位置,对TA们说,欢迎,欢迎,欢迎……

Ta们的到来是有意义的,欢迎,欢迎,给负疚感、软弱感,或者是害怕被拒绝的感受一个位置。

然后,做一个呼吸,继续看着面前这个人,看着TA的眼睛,说:

“我今天对你的请求,我知道你不是必须要这么做,但无论你答不答应我,我都已经很感谢。

在我生命中有一段关系,在我需要帮助的时候,我想起了你,所以我很感恩,在我的身边,有这样的朋友/家人/伙伴······”

做一个呼吸,带着这种感恩,在我的生命中,当我需要帮助,我还可以有求助的人,我不是独自一人,孤立无援······

从这个感觉里,继续看着这个人,对TA说:

“如果你愿意帮助我,这对我来说,真的是生命中一份很重要的礼物,不是关于你帮助我的事情价值有多大,而是你这份帮助我的心,远远超越任何物质的价值,或是这件事情本身······

所以,我已经准备好,当有一天,你需要帮助的时候,我也可以像你帮助我一样,去帮助你,回馈给你······”

做一个呼吸,感受一下,当你在内在和对面的这个人,这样去互动,去回应,会有怎样的感觉?

假如有一天,去到一个现实的情景,你真的需要求助,带着这样一份完整感、勇气和力量,去说出你的请求的时候,那会有什么不同呢?

你是不是更加有求助的能力了呢?

去欣赏这一个学习的过程,在未来看到改变。

做一个呼吸,向你有智慧的潜意识说谢谢,谢谢这一次的觉察,谢谢这一次的感悟。

当你准备好,为你内在做一个整理,然后可以慢慢回到当下。

内在资格感和自尊水平低下的时候,我们不敢接受,也不相信自己有能力付出。

所以,我们需要不断练习,把平衡带回给自己,把完整带回给自己。

从内心的无价值感到重建内在的力量和自尊感;

从心的关闭,到心的打开、感恩和流动;

从绷紧,到落落大方地进入这个世界。

在接受和付出之间平衡,当你能够去接受,你就能够去付出。


图片

▲ Unity 选择 Azure 作为其云计算服务商和合作伙伴;两家公司将携手合作,使开发者在 Xbox 和 PC 上触达更多用户

Microsoft 坚定地致力于为创作者赋能。纵观 Windows 的历史,我们一直在培养开发者并促进他们的创造性创新。我们在 Xbox 平台上也是如此,为全球 90 多个国家的大大小小的开发者提供支持。我们的 Azure 云服务向开发者保证,他们可以释放他们的想象力,在 Azure 上构建各类安全且可扩展的应用。这是我们与长期合作伙伴 Unity—实时 3D 技术的全球领导者共有的对创作者的承诺。我们还致力于扩大 3D 内容的创建和分发,将相关工具和技术提供给更广泛的开发者,使得把游戏带给玩家变得比以往更容易。

这就是为什么今天 Unity 选择 Azure 作为其云服务商和合作伙伴,用于构建和运行 Unity 引擎的实时 3D(RT3D)体验。此外,我们很高兴能携手合作,让世界各地的游戏创作者更轻松地将游戏发布到 Xbox 游戏机和 PC 上,从而触达到这些游戏社区。

游戏中诞生的 3D 交互体验的魔力正在迅速转移到非游戏世界。Unity 正在构建一个平台中立的云原生解决方案,以满足从企业开发者到个人开发者的广泛需求。通过让创作者轻松访问 RT3D 模拟工具以及创建真实世界地点和对象的数字孪生的能力,Unity 为创作者提供了一条制作 RT3D 资产的便捷途径,无论是用于游戏还是非游戏世界。为了支持这种演变,创作者需要一个像他们一样动态和创新的技术基础设施。Azure 就是这样的解决方案。以安全全球高扩展性为核心,Azure 已经支持了一些世界上最大的游戏,并将这些久经考验的成果为所有行业的 RT3D 体验提供支持。随着实时模拟的需求成为每个行业的核心,从电子商务到能源,从制造到医疗等等,Unity 和Microsoft 正在建立创造者专属的云,使 3D 艺术家能够在 Azure 上建立和运行这些体验。

我们在全球和各行业实现游戏和类似游戏体验的民主化开发的雄心依赖于强大的合作伙伴关系,尤其是与 Unity 等游戏引擎的合作。Microsoft 与 Unity 之间的合作伙伴关系还将使 Made with Unity 的游戏创作者能够更轻松地通过 Windows 和 Xbox 设备触达他们的玩家,并开启新的成功机会。通过定制化改进的开发人员工具、利用从芯片到云的最新平台创新以及简化游戏发布体验,Unity 创作者将能够实现他们的梦想,将他们的游戏带给全世界更多的玩家。

随着 3D 交互体验在游戏和非游戏世界中的不断发展,Microsoft 和 Unity 正在赋能一波新的创作者来定义未来的数字世界。他们的才能、创造力和同理心,不仅会改变世界,而且会让世界变得更好。


Part1需求说明

图片

  • 配置PC1和PC2的IP地址

  • 设置防火墙GE1/0/0和GE1/0/1的IP地址

  • 将接口加入防火墙安全区域

  • 配置域间包过滤策略

  • 配置NAT地址池,公网地址范围2.2.2.2-2.2.2.5

  • 配置NAT policy

  • 验证结果,从PC1 ping PC2地址,使用display firewall session table命令查看NAT转换情况。

Part2配置过程

1配置PC1和PC2的IP地址

根据拓扑图,PC1配置如下IP地址、掩码、网关,配置完后记得点击应用:

图片根据拓扑图,PC2配置如下IP地址、掩码、网关,配置完后记得点击应用:

图片

2设置防火墙GE1/0/0和GE1/0/1的IP地址

首次登陆,防火墙默认账号为admin,密码为Admin@123

图片

进行设置防火墙的接口IP地址:

[USG6000V1]int g1/0/0

[USG6000V1-GigabitEthernet1/0/0]ip add 192.168.1.1 24

[USG6000V1-GigabitEthernet1/0/0]ip binding vpn-instance default

[USG6000V1-GigabitEthernet1/0/0]qu

[USG6000V1]

[USG6000V1]int g0/0/0

[USG6000V1-GigabitEthernet0/0/0]ip add 2.2.2.1 24

[USG6000V1-GigabitEthernet0/0/0]qu

[USG6000V1]

3将接口加入防火墙安全区域

[USG6000V1]firewall zone trust  

[USG6000V1-zone-trust]add interface GigabitEthernet 1/0/0

[USG6000V1-zone-trust]add interface GigabitEthernet 0/0/0

[USG6000V1-zone-trust]

4配置域间包过滤策略

配置策略如下:

[USG6000V1]security-policy 

[USG6000V1-policy-security]rule name policy-permit01

[USG6000V1-policy-security-rule-policy-permit01]source-address 192.168.1.0 24

[USG6000V1-policy-security-rule-policy-permit01]destination-address 2.2.2.0 24

[USG6000V1-policy-security-rule-policy-permit01]action permit

[USG6000V1-policy-security-rule-policy-permit01]quit

[USG6000V1-policy-security]quit

[USG6000V1]

5配置NAT地址池,公网地址范围2.2.2.2-2.2.2.5

[USG6000V1]nat address-group add-group01

[USG6000V1-address-group-add-group01]section 0 2.2.2.2 2.2.2.5

[USG6000V1-address-group-add-group01]mode pat

[USG6000V1-address-group-add-group01]qu

[USG6000V1]

6配置NAT policy

[USG6000V1]nat-policy 

[USG6000V1-policy-nat]rule name nat-policy01

[USG6000V1-policy-nat-rule-nat-policy01]source-address 192.168.1.0 24

[USG6000V1-policy-nat-rule-nat-policy01]destination-address 2.2.2.0 24

[USG6000V1-policy-nat-rule-nat-policy01]action source-nat  address-group add-group01

[USG6000V1-policy-nat-rule-nat-policy01]quit

[USG6000V1-policy-nat]quit

[USG6000V1]

7验证结果

从PC1 ping PC2地址,使用display firewall session table命令查看NAT转换情况。

图片图片

上图,我们可以看到192.168.1.10这个源IP地址被替换成2.2.2.4这个IP了。

接下来,我们也可以在PC1和PC2接口上抓包,观察他们的源IP地址是否有变化:

图片图片图片图片图片

通过上图,小白们应该能对NAT源地址转换有个更清晰的认识了吧!


Part1组网需求

在一个新建的数据中心网络中,要求核心层具有较高的可靠性,并且希望网络结构简单,易于配置和管理。

如图1所示,根据用户需求,核心层SwitchA和SwitchB两台交换机采取堆叠组网。配置堆叠组网图图片

Part2配置思路

采用如下的思路配置:
1、提前规划好堆叠方案。

2、按照前期的规划,连接好SwitchA和SwitchB之间的堆叠线缆。

3、在SwitchA和SwitchB上进行堆叠软件配置,包括堆叠成员ID、堆叠优先级、堆叠域编号、堆叠端口等。

4、保存SwitchA和SwitchB的配置,并使能堆叠功能。

5、检查堆叠组建是否成功。

Part3操作步骤

1提前规划堆叠方案。

  • 规划SwitchA的堆叠成员ID为1,SwitchB的成员ID为2。
  • 规划SwitchA作为主交换机,其堆叠优先级最高,为150。SwitchB的堆叠优先级为100。
  • 规划堆叠域编号(Domain ID)为10,不与网络中其他堆叠系统的域编号冲突。
  • SwitchA和SwitchB各使用两块业务板进行堆叠转发链路的连接,用于连接的端口为10GE1/0/1~10GE1/0/2、10GE2/0/1~10GE2/0/2。

2连接堆叠线缆。

如图2所示,按照前期规划连接SwitchA和SwitchB之间的堆叠线缆。连接的端口包括主控板上的SIP口和业务板上的堆叠物理成员端口。图2 堆叠连接示意图

图片

3配置堆叠属性。

配置SwitchA的堆叠成员ID为1,优先级为150,Domain ID为10。

<HUAWEI> system-view
[~HUAWEI] sysname SwitchA
[*HUAWEI] commit
[~SwitchA] stack
[~SwitchA-stack] stack member 1
[~SwitchA-stack] stack priority 150
Info: The operation will take effect after reboot.
[*SwitchA-stack] stack domain 10
Info: The operation takes effect only after the save command is executed. The device with a lower priority then will be reset in the stack merging scenario. 
[*SwitchA-stack] quit
[*SwitchA] commit

配置SwitchB的堆叠成员ID为2,优先级为100,Domain ID为10。

<HUAWEI> system-view
[~HUAWEI] sysname SwitchB
[*HUAWEI] commit
[~SwitchB] stack
[~SwitchB-stack] stack member 2
Warning: The device will use the configuration of member ID 2 after the device resets. Continue? [Y/N]: y
[*SwitchB-stack] stack priority 100
[*SwitchB-stack] stack domain 10
Info: The operation takes effect only after the save command is executed. The device with a lower priority then will be reset in the stack merging scenario. 
[*SwitchB-stack] quit
[*SwitchB] commit

4配置堆叠端口。

在SwitchA上创建堆叠端口,并将端口10GE1/0/1~10GE1/0/2、10GE2/0/1~10GE2/0/2加入堆叠端口。在SwitchB上创建堆叠端口,并将端口10GE1/0/1~10GE1/0/2、10GE2/0/1~10GE2/0/2加入堆叠端口。SwitchB的配置与SwitchA类似,配置过程略。

[~SwitchA] port-group group1
[*SwitchA-port-group-group1] group-member 10ge 1/0/1 to 10ge 1/0/2
[*SwitchA-port-group-group1] group-member 10ge 2/0/1 to 10ge 2/0/2
[*SwitchA-port-group-group1] shutdown
[*SwitchA-port-group-group1] quit
[*SwitchA] commit
[~SwitchA] interface stack-port 1
[*SwitchA-Stack-Port1] port member-group interface 10ge 1/0/1 to 1/0/2
Warning: After the configuration is complete,
1.The interface(s) (10GE1/0/1-1/0/2) will be converted to stack mode and be configured with the port crc-statistics trigger error-down command if the configuration does not exist.
2.The interface(s) may go Error-Down (crc-statistics) because there is no shutdown configuration on the interfaces.Continue? [Y/N]: y
[*SwitchA-Stack-Port1] port member-group interface 10ge 2/0/1 to 2/0/2
Warning: After the configuration is complete,
1.The interface(s) (10GE2/0/1-2/0/2) will be converted to stack mode and be configured with the port crc-statistics trigger error-down command if the configuration does not exist.
2.The interface(s) may go Error-Down (crc-statistics) because there is no shutdown configuration on the interfaces.Continue? [Y/N]: y
[*SwitchA-Stack-Port1] quit
[*SwitchA] commit

被配置为堆叠物理成员端口后,端口下会自动配置port crc-statistics trigger error-down

待SwitchA和SwitchB上的物理端口都加入堆叠端口后,再将之前被关闭的端口打开。SwitchB的配置与SwitchA类似,配置过程略。

[~SwitchA] port-group group1
[~SwitchA-port-group-group1] undo shutdown
[*SwitchA-port-group-group1] quit
[*SwitchA] commit
[~SwitchA] quit

端口先关闭然后再打开,这样是为了避免端口因产生CRC错包而导致Error-Down。在端口Up的情况下,如果链路一端被配置为堆叠物理成员端口,另一端为普通业务口,此时端口可能会产生CRC错包。

5检查堆叠配置信息。

上述配置完成后,执行命令display stack configuration查看配置是否与规划的一致,如果不一致,需要修改配置。以查看SwitchA为例。

<SwitchA> display stack configuration
Oper          : Operation
Conf          : Configuration
MB            : MainBoard
*             : Offline configuration
Isolated Port : The port is in stack mode, but does not belong to any Stack-Port

Attribute Configuration:
---------------------------------------------------------------
 MemberID      Domain         Priority       Mode     Enable
Oper(Conf)   Oper(Conf)      Oper(Conf)   Oper(Conf)   Oper
---------------------------------------------------------------
1(1)         --(10)          100(150)     MB(MB)       Disable
---------------------------------------------------------------

Stack-Port Configuration:
--------------------------------------------------------------------------------
Stack-Port      Member Ports
--------------------------------------------------------------------------------
Stack-Port1     10GE1/0/1           10GE1/0/2           10GE2/0/1
                10GE2/0/2
--------------------------------------------------------------------------------

6保存配置并使能设备堆叠功能。

保存SwitchA的配置并使能堆叠功能。建议先使能规划为主交换机的SwitchA的堆叠功能。这样SwitchA可以先完成重启,从而优先成为主交换机。

<SwitchA> save
Warning: The current configuration will be written to the device. Continue? [Y/N]: y
<SwitchA> system-view
[~SwitchA] stack
[~SwitchA-stack] stack enable
Warning: Make sure that one or more dual-active detection methods are configured once the conversion is complete and the device enters the stack mode. Switches working in different forward modes cannot set up a CSS.
Current configuration will be converted to the next startup saved-configuration file of stack mode.
System will reboot. Continue? [Y/N]: y

使能堆叠功能后,设备会自动重启。

保存SwitchB的配置并使能堆叠功能。

<SwitchB> save
Warning: The current configuration will be written to the device. Continue? [Y/N]: y
<SwitchB> system-view
[~SwitchB] stack
[~SwitchB-stack] stack enable
Warning: Make sure that one or more dual-active detection methods are configured once the conversion is complete and the device enters the stack mode. Switches working in different forward modes cannot set up a CSS.
Current configuration will be converted to the next startup saved-configuration file of stack mode.
System will reboot. Continue? [Y/N]: y

7检查堆叠是否组建成功。

通过Console口或管理网口登录堆叠系统,使用命令display stack查看堆叠是否组建成功。当通过管理网口登录时,需要使用主交换机的IP地址。

<SwitchA> display stack
--------------------------------------------------------------------------------
MemberID Role     MAC              Priority   DeviceType         Description
--------------------------------------------------------------------------------
1        Master   006d-8835-2b00   150        CE16804
2        Standby  006d-8835-2c00   100        CE16804
--------------------------------------------------------------------------------

如上所示,显示两台交换机的信息,表示堆叠建立成功,且主交换机为成员ID为1的设备,即SwitchA。

8保存堆叠系统配置。

在检查堆叠已成功建立后,建议用户立即使用save命令保存堆叠系统配置。

<SwitchA> save
Warning: The current configuration will be written to the device. Continue? [Y/N]: y