栏目介绍:"OurBMC大咖说" 是由 OurBMC 社区精心策划的线上讲座栏目,邀请 BMC 相关领域大咖共同探讨 BMC 全栈技术的发展趋势、挑战和机遇。无论你是初学者还是资深从业者,"OurBMC大咖说" 都将为你提供一个宝贵的学习和交流的平台。
欢迎各位关注 "OurBMC大咖说",聆听大咖们的智慧之声,共同推动 BMC 全栈技术的进步和发展!
本文分为上下两期,从技术创新、生态系统、市场格局、技术发展趋势与挑战、市场发展前景几个方面深入探讨OpenBMC相较于传统BMC的优势与挑战。为读者提供一个全面、深入的视角,以理解和评估OpenBMC与传统BMC在当前及未来市场中的位置与潜力。
本期人物介绍:吴平,昵称老狼,百敖软件副总&CTO。带领团队致力于国产BIOS和BMC开发,帮助国产芯片打通技术瓶颈,将不同架构CPU融合到一套固件BIOS框架(ByoCore 2.0)中,解决下游整机厂商芯片迁移难、成本高等难题,助力国产芯片产业化应用。BMC产品则基于开源的OpenBMC,融合百敖多年技术经验和特色功能,支持国内外多款BMC芯片。老狼在工作之余热衷于在知乎等网站撰写文章,科普CPU、硬件、芯片研发制造和UEFI/BIOS知识,提升公众对国产芯片技术的认知与信心,为中国芯片产业的蓬勃发展贡献力量。其深入浅出的笔触与前瞻性的见解,赢得了广大网友的广泛认可,积累了庞大的粉丝群体。
在当今数字化时代,随着云计算、大数据和人工智能的蓬勃发展,数据中心的规模不断扩大,服务器管理的重要性日益凸显。在现代数据中心和服务器管理中,BMC(Baseboard Management Controller)是一个不可或缺的组件。它通常作为服务器硬件的管理控制器,负责系统的健康监测、远程管理和故障诊断等功能。传统的BMC通常依赖于厂商提供的闭源固件,这在某些方面限制了其灵活性和可定制性。而OpenBMC作为一种开源BMC解决方案,正在逐渐取代传统BMC,成为越来越多厂商和开发者的选择。OpenBMC的横空出世,为传统BMC带来了全新的发展思路和机遇,甚至可以说,BMC固件正处在“手机的 iPhone时刻",也类似“BIOS 的 UEFI 时刻”。今天,让我们深入探讨OpenBMC相较于传统BMC的优势与挑战,以及未来的发展趋势。
技术创新:建构方式和编程语言
从技术架构来看,OpenBMC和大多数传统BMC固件,都采用Linux系统作为基础,加上一些典型设备驱动和各种应用,本质上都是典型的嵌入式Linux系统。OpenBMC在技术上有了诸多提升,在我看来,最大的部分在于两个方面:模块化设计和编程语言不同。
- 模块化建构
OpenBMC的模块化设计是其核心优势之一。它采用了现代软件工程中的微服务架构思想,将整个系统划分为多个独立的功能模块。这些模块包括传感器管理、电源管理、系统日志、固件更新、网络管理等核心服务,每个模块都作为独立的守护进程(daemon)运行。模块之间通过D-Bus消息总线进行通信,这种松耦合的设计带来了多方面的优势。
首先,从系统稳定性角度来看,模块化设计大大提升了系统的健壮性。 每个模块都运行在独立的进程空间中,某个模块的故障不会直接影响其他模块的运行。例如,即使传感器监控模块出现问题,电源管理模块仍然可以正常工作,保证了系统的基本功能。这种隔离性在传统BMC中是难以实现的,因为传统BMC往往采用单一模块(IPMI模块),各个功能紧密耦合,一个模块的故障可能导致整个系统崩溃。
其次,模块化架构为功能扩展提供了便利。 新功能可以以新模块的形式添加到系统中,而无需修改现有代码。这种可扩展性使得OpenBMC能够快速适应新的需求和技术变化。开发者可以根据具体需求,选择性地启用或禁用某些模块,实现系统的定制化配置。
最后,在建构方式上,OpenBMC使用Yocto构建来提升灵活性。 每个硬件平台通常会有自己特定的 meta 层,每个meta包含了该平台的配置、驱动程序、补丁、特定的硬件初始化代码等,来抽象平台的差异。这些特点使得 OpenBMC 可以在不同硬件平台之间迁移,提高代码的重用性和可维护性,使得整个系统的灵活性和可扩展性得到提升,从而也实现了跨平台和跨架构的兼容性。
- C++编程语言
在编程语言选择上,OpenBMC主要使用C++,而传统BMC多采用C语言。这种差异不仅反映了技术栈的演进,也带来了不同的优势和挑战。
采用C++有很多优势。首先是面向对象特性的支持。C++的类和继承机制使得代码结构更加清晰,更容易实现复杂的业务逻辑。例如,在传感器管理中,可以定义一个基础传感器类,然后通过继承机制实现不同类型的传感器,这种设计使得代码更易于理解和维护。而在C语言中,实现类似的功能需要更多的手动封装和管理工作;其次是更强的类型安全。C++的类型系统更加严格,能在编译时捕获更多的潜在错误。模板机制也允许开发者编写更通用的代码,提高代码复用率。例如,可以使用模板实现通用的数据处理函数,适用于不同类型的传感器数据;再次是标准库的支持。C++标准库提供了丰富的容器和算法,大大提高了开发效率。例如,应用最多最广泛的是C++的两个特性:variant(安全联合体)和lambda(匿名函数)。C++17标准库中的std::variant可以同时存储多种不同类型的值,但在任意时间只能有一种类型的值被存储。这使得std::variant成为一种灵活的数据类型,适用于需要处理多种可能类型的情况。相比传统的联合体(union),std::variant不需要手动管理数据成员,也提供了更加友好和安全的访问方法。它在处理多样化数据类型、泛型编程以及处理变化的数据结构时非常有用。通过std::variant可以更加方便地处理多类型值的存储和访问,增强代码的灵活性和安全性;lambda函数,可以用来快速的构建一个闭包(closure),来实现一些高阶函数,比如快速的构建一个谓词函数对象。通过创建lambda对象,可以快速的构建比如谓词函数这种的短小并且局部使用的函数。这样可以使这部分代码局部化,不污染全局命名空间。通过lambda对象还可以快速的创建一个可调用对象。和传统的可调用对象的创建方式相比,省略了编写类的构造函数以及调用操作符的重载等的相关代码的编写,非常简洁和方便。
然而,C++也带来了一些挑战。首先是系统资源占用。C++的运行时开销相对较大,对内存和处理器资源的要求更高。这在资源受限的嵌入式环境中可能成为一个考虑因素。特别是在使用异常处理、RTTI等特性时,需要权衡功能和资源消耗;其次是复杂性管理。C++的功能强大也意味着更高的复杂性,开发者需要更多的训练才能掌握语言特性的正确使用。例如,内存管理、多重继承、模板元编程等特性如果使用不当,可能导致难以调试的问题。
在实际应用中,OpenBMC的C++代码通常会采取一些措施来平衡这些优劣:如谨慎使用高级特性,避免过度抽象和采用现代C++的智能指针等特性降低内存管理风险等。这种平衡使得OpenBMC能够既利用C++带来的开发效率提升,又保持较好的运行时性能。随着硬件性能的提升和编译器技术的进步,C++在嵌入式领域的应用也越来越广泛,这也是OpenBMC选择C++的一个重要原因。
这里要特别说明,现在有很多传统BMC工程师正在向OpenBMC转型,从C语言模块向C++模块迁移的过程中,写出来了不少表面C++,实则C的模块,造成不少问题。这可能是成长的代价,需要时间和更多的培训来弥合。
更多精彩内容,敬请关注《OurBMC大咖说|第8期:OpenBMC vs 传统BMC:技术革新引领服务器管理新未来(下)》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。