5
年前我写过一篇文章:你用对awk了吗?,介绍了基于illumos
的发行版OmniOS
默认使用的awk
是非常旧的oawk
,很多功能都不支持。今天,illumos
终于更新了默认awk
,使其变成了nawk
(oawk
依然保留)。详情可查看这里:FLAG DAY: awk(1) is now nawk(1), oawk(1) is just oawk(1)。
标签:Solaris
pkgsrc与IPS
pkgsrc是一个用来安装第三方软件的的框架,它集成了编译,安装,删除应用等功能。pkgsrc
发源于NetBSD
,但现在已经移植到多个操作系统,比如OpenBSD
。通常来讲,使用pkgsrc
安装软件有两种方式:直接安装已经编译好的二进制包,即pkg
;或者是下载源码自己编译安装,即src
。在使用pkgsrc
框架的系统上,pkg_add(1)
命令用来安装软件;pkg_delete(1)
用来移除软件。
pkgin项目是用来管理pkgsrc
的二进制包的工具,其类似于Linux
系统上的apt/yum
。”pkgin install
“用来安装软件;”pkgin remove
“用来移除软件。如果你使用pkgsrc
框架,你既可以选择使用pkgsrc
自带的pkg_*
命令来管理安装软件,也可以安装pkgin
,然后通过pkgin
来管理。
除了pkgsrc
,Sun/Oracle
也有一个类似的框架:IPS(Image Packaging System)
,其主要应用于Solaris
及其衍生的操作系统。IPS
使用pkg(5)
命令来管理软件包:”pkg install
“用来安装软件;”pkg uninstall
“用来卸载软件。注意同pkgsrc
的pkg_*
命令相区分。有趣的是,基于OpenSolaris/illumos
的发行版中,OmniOS
和OpenIndiana
使用IPS
,而SmartOS
则使用pkgsrc
。
References:
pkgsrc;
The pkgsrc guide;
pkgin;
Image Packaging System.
Unix之殇
前几天网上出现了Solaris
项目将会被Oracle
停掉的谣言。尽管消息一直未被证实,但是以Solaris
为代表的传统Unix
操作系统的没落却是不争的事实。在上个月,top500发布的目前世界上运行最快的500
台超级计算机中,有498
台运行的是Linux
:
由此可见,Linux
与Unix
目前的境遇可谓是天壤之别。
我不知道究竟是什么原因造成了目前Linux
一统天下的局面,但是可以确定的是一定不是技术领域方面的原因。我没有为IBM
公司工作过,也从未接触过AIX
操作系统,所以对AIX
没有发言权。而对于BSD
系列操作系统(FreeBSD
,OpenBSD
,NetBSD
等等),仅仅限于安装和使用过,并没有什么太深的体会。我为HP/HPE
公司效力过,虽然并没有使用过HP-UX
,但是周围有很多同事以前是做HP-UX
相关工作的:开发新功能,做Unix
认证等等。听他们讲,HP-UX
非常稳定,很多电信,银行等对稳定性要求特别高的环境仍然在使用着HP-UX
,也许这些企业慢慢地会转向Linux
?我不知道。。。至于Solaris
,我曾经在上面做过4
年多的全职开发。Solaris
上面有很多很cool
的工具供用户使用,比如mdb
,比如DTrace
,这些工具为我工作提供了巨大的帮助,极大地满足了一个底层软件工程师的好奇心。此外Solaris
也是以运行稳定而著称,比如这台已经连续运行了10
年的装有Solaris
的机器(图片出处:https://pbs.twimg.com/media/CjtxiOmWYAA5lHB.jpg):
再来看看Linux
,其实一直以来,Linux
系统上并没有可以匹敌DTrace
的系统tracing
工具,直至最近BPF
功能的成熟,可以说在tracing
领域落后了Solaris
整整12
年(可以参考这篇文章:Linux in 2016 catches up to Solaris from 2004);再比如目前Ubuntu
发行版中引入的ZFS
文件系统,也是出自Solaris
。所以,其实如果单单从技术领域来看,Linux
不仅不见得做的比Unix
好,某些方面甚至还是处于下风的。
在上面提到的几种Unix
中,除了BSD
系列,其余3
种可以说都是某个传统硬件服务器厂商的私有操作系统。虽然曾经有OpenSolaris
这个开源产品,但是也仅仅是昙花一现(个人觉得OpenSolaris
最大的意义在于由其衍生出了illumos内核,以及基于illumos
内核的类Solaris
系统。比如smartos。)。所以说,是不是由于最近这些年互联网的日渐强势,硬件厂商的效益江河日下,而“城门失火,殃及池鱼”,随之而来的就是这些Unix
也会受到不小的冲击呢?个人觉得应该有一定关系吧。但如果仅仅把Linux
成功的原因归结于“开源”,似乎也有失偏颇,BSD
系列操作系统也是开源的,且其在license
上更为宽松(参考这里:Comparing BSD and Linux)。所以说对于Linux
目前具有如此统治力的原因,真的是很难说清。
相信目前很多的中小公司都完全转向Linux
了。最直白的原因:人好招。你见过多少招聘信息要求熟悉FreeBSD
?肯定没有要求Linux
的多。至于要求熟悉NetBSD
的?也许有,但是我是没见过。所以对目前Unix
人才的需要还是主要在大公司,也只有大公司有意愿和实力做这些“日渐小众”的Unix
的相关工作。例如,Brendan Gregg
在其社交账号中为对Solaris
工程师提到Netflix
目前使用FreeBSD
:
我很怀念十几年前各大操作系统“百花齐放”的时代,这样想并不是因为我对Linux
有任何成见,只是当你的服务器都运行着清一色的Linux
操作系统时,实在是觉得有些单调和乏味,就像现在人类使用的手机也基本可以分为两大阵营:iOS
和Android
(又是Linux
)。世界本应该就是多样化的,丰富多彩的,所以希望其它的Unix
有朝一日可以“复兴”吧。。。
SmartOS上使用pkgin安装软件
我使用的SmartOS
是安装在Vmware
上的虚拟机,网络模式是NAT
。装好的SmartOS
缺少很多常用软件,需要自行安装:
(1)由于我的网络使用了proxy
,所以需要配置一下:
export http_proxy="http://web-proxy.xxxxxx.com:8080/"
export https_proxy="https://web-proxy.xxxxxx.com:8080/"
(2)安装pkgin
,我使用的是root
用户:
# cd /
# curl -k http://pkgsrc.joyent.com/packages/SmartOS/bootstrap/bootstrap-2015Q4-x86_64.tar.gz | gzcat | tar -xf -
# pkg_admin rebuild
# pkgin -y up
(3)接下来就可以安装软件了,以gcc
为例。首先查找gcc package
:
# pkgin se gcc
......
gcc49-4.9.3 The GNU Compiler Collection (GCC) - 4.9 Release Series
......
安装gcc
:
# pkgin in gcc49-4.9.3
安装好后就可以使用了:
# gcc
gcc: fatal error: no input files
compilation terminated.
你用对awk了吗?
今天折腾OmniOS
上的awk
,结果发现很简单的一个程序居然执行出错:
root@localhost:/root# awk 'function print_name_and_age(name, age) { print name" is "age" old" } {print_name_and_age($1, $2)}'
awk: syntax error near line 1
awk: bailing out near line 1
而相同的程序在gawk
下运行的好好的。求助stackoverflow,得到结论如下:
(1)OmniOS
上有nawk
,/usr/bin/awk
(默认的awk
)和/usr/xpg4/bin/awk
。建议使用nawk
。/usr/bin/awk
是老版本的awk
,很多feature
都不支持(基于illumos
内核的操作系统,包括Solaris
可能都需要注意这个问题)。
(2)“bailing out
”是老版本awk
的输出日志。所以一旦有这样的日志输出,需要考虑一下是不是使用的awk
版本有问题。
在VirtualBox上安装Solaris 11
在64位Solaris上编译32位openSSL动态链接库
在64
位Solaris
系统上,openSSL
默认编译出来的是64
位静态链接库,如果想编译成32
位动态链接库,可在配置时使用如下命令:
./Configure solaris-x86-gcc --shared
也可参考stackoverflow
上的帖子:How do I compile openSSL in 32 bit mode on a 64bit system?。
在Solaris上使用LD_OPTIONS环境变量诊断编译链接问题
最近在Solaris
上编译一款开源软件,在最后链接阶段出了问题,导致ld
程序core dump
。由于没有ld
程序源代码,导致完全没思路,没办法,只好在stackoverflow
上求教:http://stackoverflow.com/questions/26009192/why-the-ld-crash-in-building-libgd。从回复中我才知道可以通过设置LD_OPTIONS
环境变量,来了解整个链接过程。举个例子:
LD_OPTIONS=-Dfiles,detail
指定files
会输出ld
当前处理的文件,detail
会提供更多的信息。
可以用“ld -Dhelp
”命令打印每个选项的详细帮助信息。
如果想详细了解Solaris
下程序的链接过程,可以参考这篇文档:Linker and Libraries Guide。
tcpreplay(3.4版本)程序显示统计结果的一个问题
最近,我在Solaris
系统上用tcpreplay
程序(sunfreeware
网站提供的3.4.4版本的安装包,目前sunfreeware
已经不再提供免费的Solaris
系统安装包下载了,但还是可以通过其它ftp
下载到)辅助测试。发现tcpreplay
输出是这样的:
Actual: 400000 packets (78200000 bytes) sent in 18.03 seconds. Rated: 4337216.0 bps, 33.09 Mbps, 22185.25 pps
如果Rated
显示的bps
和Mbps
里的b
都指的是byte
的话,那么它们应该相差(1000*1000)倍才对,但是很明显4337216.0
和33.09
没有相差那么多。
去github
上找了一下tcpreplay
3.4版本的源代码,发现了这个patch(https://github.com/appneta/tcpreplay/commit/42722b8945209dcbb850eef39e0dbbd582eccc3d)。可以看到第一个bps
里的b
指的是byte
,而第二个Mbps
里的b
指的是bit
。这个tcpreplay
安装包很显然没有包含这个patch,所以会让人产生误解。
P.S.打完patch后的tcpreplay
输出是这样的:
Actual: 2 packets (1532 bytes) sent in 0.015702 seconds.
Rated: 97567.1 Bps, 0.780 Mbps, 127.37 pps
看着很清晰。
为什么gcc在64位Solaris上编译出来的程序默认是32位的?
最近发现一个问题,gcc在64位Solaris上编译出来的程序默认是32位的,而在64位Linux上编译出来的程序默认就是64位的,觉得有点奇怪,就在stackoverflow上问了一下(http://stackoverflow.com/questions/25560539/how-does-gcc-determine-if-to-generate-a-32-bit-or-64-bit-executable-file-by-defa)。其中一个回答给出了一个链接(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58833),原来这是Solaris有意而为之。总结一下,有以下几点:
(1)64位的gcc或程序不一定比32位运行快;
(2)Studio程序默认是32位的,gcc最好和它行为保持一致;
(3)从用户体验出发,以前都是默认生成32位程序,现在一下变成64位,用户可能需要改很多配置;
(4)64位Solaris位的gcc可以既编译32位,又编译64位,看用户自己的选择了。