最近把小主机升级到了ESXI6.5,debian 9也已经出来了。所以就配了个虚拟机装了最新的debian 9,安装一切无话。安装好以后配了nginx等相关服务。系统装好后测试一切正常,就放着不动了。

等第二天,发现博客首页上不去了,去ping debian 9的IP地址也ping不通了,去ESXI管理界面界面上一看,vCPU占用100%,感觉情况不妙。打开系统终端控制台,发现无论输入什么都没有反映,系统已经挂了的感觉,按crtl+alt+ins也没反应。最后只能强制重启了,当时以为是意外。遂没有管它。当再过了一天,又出现同样的情况了,就说明不是意外。查看了系统的相关日志,看不出有什么异常的地方,想起来装过vmware tools ,当即把它卸载了再观察。可是再过了一天,情况还是老样子,又死了。所以,应该和vmware tools没什么关系。

没有头绪,只能放狗去搜,找到一篇老外的讨论:
VM becomes unresponsive, some vCPUs are 100% utilized

里面有讲到应该和网卡类型和 vmxnet3 有关

All of the VMs use the vmxnet3 vNIC. On one occasion, after resetting the VM, I looked at the kernel log and it displayed some vmxnet3 messages which led me to believe the problem may be caused by http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2005717. I moved some VMs to the host running ESXi v5.0 and the problem still occurred, so that theory was debunked. Also, this problem has happened quite a few times but those vmxnet3 kernel messages only showed up on one occasion.

然后,我就把网卡类型改成了:e1000e,就没有再出过这个问题了,在这里记录一下备查。使用vmxnet3时,在系统里看到的网卡速率是10000M,使用e1000e类型就只有1000M。ESXI 6.5用debian 9 时,网卡已经没有e1000的类型选择了。

centos5/redhat5 自带的GCC已经很低了,一般是4.1左右,但如果安装一些软件需求高版本的gcc就比较麻烦了。

除了下源码编译安装外,这里介绍通过YUM源来直接安装

wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++
ln -s /opt/rh/devtoolset-2/root/usr/bin/* /usr/local/bin/

hash -r
gcc --version

大功告成!

The Software Collections ( SCL ) Repository
参考:https://wiki.centos.org/AdditionalResources/Repositories/SCL

devtoolset-3 版本默认安装的是4.9.2,devtoolset-4 版本默认安装的是5.3版本,还可以往上类推。

CentOS 6/7 official support this. You don't need third party repository. And gcc version is 4.9.2 in CentOS's repo.

yum install centos-release-scl-rh
yum install devtoolset-3-gcc devtoolset-3-gcc-c++

To use the updated tools, start a new shell using the scl command:

scl enable devtoolset-3 bash

You may also need to reset your PATH environment variable, which might be set in ~/.bashrc or other profile file. If you need to change it, it should point to /opt/rh/devtoolset-3/root/usr/bin/:$PATH

version `GLIBC_2.14' not found 解决方法.
一般出现类似次问题是当前运行系统Glibc版本低于编译环境Glibc版本造成Glibc版本兼容性造成的.
通常可以使用-static链接成静态程序即可解决.
不过经过google大神发现还有另外一种方法可以在使用动态库的环境下规避此类问题.

首先查看APP Glibc 兼容性.看当前app使用了哪些Glibc版本.

# objdump -p app  
...  
Version References:  
  required from libc.so.6:  
    0x06969194 0x00 05 GLIBC_2.14  
    0x0d696913 0x00 04 GLIBC_2.3  
    0x0d696914 0x00 03 GLIBC_2.4  
    0x09691a75 0x00 02 GLIBC_2.2.5  

然后查看当前app引用了GLIBC_2.14中哪些函数

# nm app |grep GLIBC_2.14  
...  
U memcpy@@GLIBC_2.14  
...  

也可以使用 objdump 查看app动态引用符号表.

# objdump -T app |grep GLIBC_2.14  
...  
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.14  memcpy  
...  

上例显示app引用 2.14 版本中的memcpy函数.
下面将用到 gcc 的一个特性实际上是ld的特性.可以将引用符号绑定到一个特定版本.只需在.c文件中写入类似代码.
__asm__(".symver original_foo,foo@VERS_1.1");
即可.

查找当前系统glibc版本中memcpy的各个版本.

获取libc.so实际路径.

# gcc --print-file-name=libc.so  
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so  
# file /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so  
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so: ASCII text  
-bash-4.1# cat /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so  
/* GNU ld script  
   Use the shared library, but some functions are only in  
   the static library, so try that secondarily.  */  
OUTPUT_FORMAT(elf64-x86-64)  
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a  AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )  
-bash-4.1# file /lib64/libc.so.6  
/lib64/libc.so.6: symbolic link to `libc-2.16.so'  

获取memcpy版本信息.

-bash-4.1# nm /lib64/libc-2.16.so |grep memcpy  
...  
000000000008a6d0 i memcpy@@GLIBC_2.14  
0000000000084ab0 i memcpy@GLIBC_2.2.5  
...  

可以看出memcpy最低版本是("@GLIBC_2.2.5")2.2.5,而默认使用版本是2.14("@@GLIBC_2.14") 这里我们只要将 glibc 2.14 版本memcpy降到glibc 2.2.5. 在源代码写入以下代码
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
重新编译.
再次查看app信息.

#objdump -p app  
...  
  
  
Version References:  
  required from libc.so.6:  
    0x0d696913 0x00 04 GLIBC_2.3  
    0x0d696914 0x00 03 GLIBC_2.4  
    0x09691a75 0x00 02 GLIBC_2.2.5  

发现当前版本需求已不再需要glibc 2.14支持.

# objdump -T app |grep memcpy  
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 memcpy  

memcpy已完全修改为Glibc 2.2.5支持.

至此完美解决. 再次运行app一切完美. :)

转载自:http://blog.csdn.net/force_eagle/article/details/8684669

在过去的十年间,大多数新型开源操作系统已从移动市场转向物联网市场。本文介绍了面向物联网的许多新型开源操作系统。我们之前的文章介绍了开源物联网框架,以及面向物联网和消费者智能家居设备的Linux和开源开发硬件。

除了介绍面向物联网的新型嵌入式Linux发行版外,我还介绍了OpenWrt等几款比较老的轻量级发行版,它们在这个领域迎来了新生。虽然Linux发行版主要针对网关和集线器,但是面向物联网的非Linux开源操作系统取得了同样迅猛的发展,它们可以在微控制器单元(MCU)上运行,通常面向物联网边缘设备。

请记住一点:如今几乎所有的操作系统都声称有一些物联网连接功能,所以本文这份名单有点随意。本文介绍的开源操作系统大多数符合下列属性:占用内存少、电源效率高、模块化可配置通信堆栈,对特定的无线和传感器技术提供强有力的支持。一些项目注重物联网安全,许多非Linux操作项目专注于实时确定性(real-time determinism),这有时是工业物联网的一个要求。

我通常远离这类Linux发行版:被列入“轻量级”这一类,但是仍然主要针对桌面使用或便携式U盘实施, 而不是针对无外设设备。不过,像LXLE或Linux Lite这些轻量级Linux发行版可能是适合物联网的选择。

非Linux开源平台方面的选择来得比较困难。毕竟,大多数轻量级实时操作系统可用于物联网。我侧重于主要平台,或者是似乎为物联网带来最大希望的平台。其他潜在的候选对象可以在这个开源实时操作系统网站(http://www.osrtos.com)上找到
本文未提到Windows 10 for IoT Core,它对创客来说是免费的,支持AllJoyn和IoTivity,但是并非完全开源。还有许多商用实时操作系统是物联网领域的大玩家,比如Micrium的μC/OS。

九大基于Linux的开源物联网发行版

1.Brillo ――在谷歌发布Brillo后的一年里,这款基于安卓的轻量级发行版日益受到嵌入式板卡的追捧,比如英特尔Edison和Dragonboard 410c,甚至得到一些模块上计算机的追捧。Brillo的未来与谷歌的Weave通信协议密切相关,它需要这种协议。Weave为Brillo带来了发现、配置和验证等功能,Brillo可以在只有32MB内存和128MB闪存的设备上运行。

相关链接:https://developers.google.com/brillo/

2.华为LiteOS――别将华为的LiteOS与开源Unix变种混为一谈,据说它基于Linux,但确实是一种非常精简的实施方法。一年多前宣布的LiteOS声称可以作为只有10KB大小的内核来部署。LiteOS应用广泛,从基于MCU的设备,到与安卓兼容的应用程序处理系统,不一而足。这款可定制的操作系统拥有诸多功能,比如零配置、自动发现、自动联网、快速启动和实时操作,它提供广泛的无线支持,包括LTE和网状网络。LiteOS随华为的敏捷物联网解决方案交付,它驱动窄带物联网(NB-IoT)解决方案。

相关链接:http://www.huawei.com/minisite/iot/en/liteos.html

3.OpenWrt/LEDE/Linino/DD-Wrt――由于物联网热潮,久负盛名、专注网络的OpenWrt嵌入式Linux卷土重来。轻量级OpenWrt经常出现在路由器和基于MIPS的WiFi板卡上。早期的衍生版(比如DD-Wrt和面向Arduino的Linino)最近更是出现了分支版本。Linux嵌入式开发环境(LEDE)项目承诺治理会更透明、发布周期会更稳定。

相关链接:https://openwrt.org

4.Ostro Linux――今年8月,英特尔选择用于英特尔Joule模块(运行在最新的四核凌动T5700片上系统上)后,这款基于Yocto Project的发行版一举成名。Ostro Linux符合IoTivity,支持众多的无线技术,还提供一种传感器框架。它非常注重物联网安全,提供操作系统、设备、应用程序和数据等层面的保护,包括加密和MAC。该发行版包含在无外设版本和媒体(XT)版本中。

相关链接:https://ostroproject.org

5.Raspbian――还有另外一些面向Raspberry Pi的发行版,它们更专门面向物联网,不过迅速成熟的Raspbian仍是佼佼者。由于它是面向在最广泛使用的物联网平台上的DIY项目的最流行的发行版,开发人员可以向众多项目和教程寻求帮助。由于Raspbian支持面向Node-JS的可视化设计工具Node-RED,我们觉得没有太充分的理由选择专门针对RPi、面向物联网的Thingbox。

相关链接:https://www.raspbian.org

6.Snappy Ubuntu Core――Ubuntu Core的这个嵌入式版本又叫带Snaps的Ubuntu Core,它利用了Snap软件包机制――Canonical将其作为一种通用Linux软件包格式分拆出来,让单一的二进制软件包能够在“任何Linux桌面、服务器、云或设备上”运行。Snaps让Snappy Ubuntu Core能够提供事务回滚、安全更新、云支持和应用程序商店平台。Snappy只需要600MHz处理器和128MB内存,但还需要4GB闪存。它可以在Pi及其他的嵌入式板卡上运行,出现在众多设备上,包括Erle-Copter无人机、戴尔Edge网关、Nextcloud Box和LimeSDR。

相关链接:https://developer.ubuntu.com/en/snappy/

7.Tizen――Linux基金会托管的这个嵌入式Linux堆栈主要得到了三星的支持,它在移动市场很少引起注意。它广泛用于三星的电视和智能手表中,包括新的Gear S3,它也零星地实施在三星的相机和消费级设备中。Tizen 甚至可以在Raspberry Pi上运行。三星已开始将Tizen与其SmartThings智能家居系统集成起来,以便能够通过三星电视来控制SmartThings。我们还可以预计它会与三星的Artik模块和Artik Cloud加强集成。Artik随带Fedora,但是Tizen 3.0最近连同Ubuntu Core一并移植。

相关链接:https://www.tizen.org/ko?langredirect=1

8.uClinux――久负盛名的精简版uClinux是唯一可以在MCU上运行的Linux,可以在特定的Cortex-M3、M4和M7等型号上运行。uClinux需要MCU内置存储器控制器,可以使用外部DRAM芯片来满足内存要求。现在uClinux已被并入到主线Linux内核中,得益于Linux中广泛的无线支持。然而,Mbed等更新颖的面向MCU的操作系统在迅速填补无线方面的空白,配置起来更容易。EmCraft是MCU上uClinux的最大支持者之一,提供众多基于Cortex-M的模块。

相关链接:http://www.uclinux.org

9.Yocto Project――Linux基金会的Yocto Project不是一款Linux发行版,而是一个开源协作项目,为开发人员提供构建自定义嵌入式堆栈的模块、工具和方法。由于你可以用极小的开销来定制堆栈,它常常用于物联网。Yocto Project构成了大多数商用嵌入式Linux发行版的基础,也是Ostro Linux和Qt for Device Creation等项目的一部分。Qt正在为Qt 5.8准备一种Qt Lite技术,将为更小巧的物联网目标设备优化Device Creation。

相关链接:https://www.yoctoproject.org

九大非Linux开源物联网操作系统

1.Apache Mynewt――开源、支持无线的Apache Mynewt面向32位MCU,由Runtime开发,由Apache软件基金会托管。模块化的Apache Mynewt拥有无线支持、并发连接的准确可配置性、调试功能和细粒度的电源控制。5月份,Runtime和Arduino Srl宣布,将提供Apache Mynewt,面向Arduino Srl的Primo和STAR Otoo SBC。这款操作系统还支持Arduino LLC板卡,比如Arduino Zero。(最近,Arduino Srl和Arduino LLC达成了诉讼调解,宣布计划在Arduino控股公司和Arduino基金会下重新联手)。

相关链接:http://mynewt.apache.org

2.ARM Mbed――ARM面向物联网的操作系统针对小巧、电池供电的物联网端点,这些端点在Cortex-M MCU上运行,可能只有8KB内存,已出现在BBC Micro:bit SBC上。虽然最初是半专有、只有单线程,缺少确定性功能,但现在它是开源,采用Apache 2.0许可证,提供了多线程和实时操作系统支持。不像许多轻量级实时操作系统,Mbed在设计当初心系无线通信,最近它增添了线程支持。该操作系统支持可通过Mbed Device Connector来安全地提取数据的云服务。今年早些时候,该项目发布了可穿戴式设备参考设计。

相关链接:https://www.mbed.com/en/

3.Contiki――由于只需要10KB内存和30KB闪存,开源Contiki无法像Tiny OS或RIOT OS那么小巧,也无法像RIOT及其他一些操作系统提供实时确定性。然而,广泛使用的Contiki提供了广泛的无线网络支持,IPv6堆栈由思科贡献。该操作系统提供了一系列广泛的开发工具,包括可装入Cooja Network Simulator的动态模块,以便调试无线网络。Contiki声称可以高效地分配内存。

相关链接:http://www.contiki-os.org

4.FreeRTOS――FreeRTOS很快就能在嵌入式开发平台中与Linux相匹敌,它特别适用于开发物联网终端设备。FreeRTOS缺少Linux功能,比如设备驱动程序、用户帐户以及高级的网络和内存管理。然而,它占用的资源比Linux少得多,更不用说与VxWorks这样的主流实时操作系统相比了,它还提供开源GPL许可证。FreeRTOS可以在内存不到0.5KB、ROM为5-10KB的设备上运行,不过与TCP/IP架构结合使用更为常见,它更像是24KB内存和60KB闪存。

相关链接:http://www.freertos.org

5.Fuchsia――谷歌的这款最新开源操作系统在8月份部分透露,留下的问题多过答案。Fuchsia与Linux毫无关系,但是基于旨在与面向MCU的操作系统(比如FreeRTOS)兼容的LK发行版,这让许多人猜测它是一款物联网操作系统。不过,Fuchsia还支持移动设备和笔记本电脑,所以谷歌对这个处于早期阶段的项目方面抱有极大的野心。

相关链接:https://github.com/fuchsia-mirror

6.NuttX――非限制性的、采用BSD许可证的NuttX主要以此出名:它是面向开源无人机的最常见的实时操作系统,在APM/ArduPilot和PX4 UAV平台上运行,它们都是Dronecode平台的一部分。NuttX还广泛用于其他资源受限制的嵌入式系统中。虽然它支持x86、 Cortex-A5及-A8平台,但这款基于POSIX和ANSI的操作系统主要针对Cortex-M MCU。 NuttX完全抢占式,有固定的优先级、轮询和偶发调度。该操作系统号称是“小巧的Linux通用型操作系统,但大大精简了功能特性。”

相关链接:http://nuttx.org

7.RIOT OS――已有8年历史的RIOT OS以高效的电源使用和广泛的无线支持而出名。RIOS的硬件要求是1.5KB内存和5KB闪存,要求几乎与Tiny OS一样低。不过,它也提供了诸多功能,比如多线程、动态内存管理、硬件抽象、部分的POSIX兼容和C++支持,这些是在Linux中而不是在轻量级实时操作系统中更常见的功能。其他功能包括低中断延迟(约40个时钟周期)和基于优先级的调度。你可以在Linux或OS X下进行开发,使用原生移植版,部署到嵌入式设备。

相关链接:https://www.riot-os.org

8.TinyOS――这款成熟的开源操作系统采用BSD许可证,非常小巧,支持低功耗,MCU目标设备可以“只有几KB内存和数十KB代码空间”。事件驱动的TinyOS由nesC这种C语言来编写,它经常被研究低功耗无线网络(包括多跳网络)的研究人员使用。据项目组自己承认,“计算密集型的应用程序可能很难编写。”项目致力于提供Cortex-M3支持,不过眼下它仍是为低端MCU和无线电芯片设计的。

相关链接:http://webs.cs.berkeley.edu/tos/

9.Zephyr――Linux基金会这款轻量级、提供安全功能的Zephyr RTOS可在只有2-8KB内存的设备上运行。Zephyr可在x86、ARM和ARC系统上运行,主要专注于基于MCU,使用蓝牙/BLE和802.15.4无线电(比如6LoWPAN)的设备。Zephyr基于Wind River的Rocket OS,它基于Viper,而Viper是精简版的VxWorks。最初的目标设备包括Arduino Due和英特尔的Arduino 101及其他设备。Zephyr最近出现在了SeeedStudio的96Boards IoT Edition BLE Carbon SBC,它得到一个新的Linaro LITE工作组的支持。

相关链接:https://www.zephyrproject.org

原文标题: Open Source Operating Systems for IoT,作者: Eric Brown

转载自:http://os.51cto.com/art/201611/521377.htm