打印

【Solaris10 专题】动态跟踪和区域技术

本帖已经被作者加入个人空间

【Solaris10 专题】动态跟踪和区域技术

目录:   
Part-1 Solaris 10动态跟踪技术
# 1 动态跟踪(DTrace)原理
# 2 使用DTrace工具

Part -2  Solaris 10区域技术
# 1 Solaris 10区域介绍
# 2 zonecfg命令
# 3 创建和删除非全局区域
# 4 登录和退出非全局区域
# 5 安装和删除程序
# 6 升级和删除补丁包
# 7 Solaris 10区域管理


1.  Solaris 10动态跟踪技术

如果你想了解系统的行为,DTrace是很好的工具。DTrace是管理员和开发者用来全面测试应用软件系统的行为的动态跟踪工具。DTrace使你浏览你的系统,并理解它是如何工作的。正像你看到的那样,DTrace可以使你使用D语言创造自己的工具来要求系统回答你的问题。

DTrace,即动态跟踪Dynamic Tracing,是Solaris 10或Solaris 10的一个新功能。通过此功能用户能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节,发现先前隐蔽的系统问题,并且修复过去无法解决的性能问题。借助DTrace,你可以:

 检查用户程序及Solaris操作系统的行为,快速找出造成系统和应用程序瓶颈的根本起因。

 突出系统调节的趋势和模式,以获得最佳性能。

 捕捉到软件不同层级之间的性能问题。

 找出异常行为的起因。

 为普通或复杂的例行程序编写可重复使用的脚本。

 指定DTrace收集的数据、采取的操作,以及在哪些条件下采取这些操作。

[ 本帖最后由 云杉上的蝴蝶 于 2008-4-12 05:34 编辑 ]
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP

动态跟踪(DTrace)原理

本节主要介绍动态跟踪技术(DTrace)的原理。
动态跟踪(DTrace)的概念

在理解软件系统时记录下来的特定的数据点的位置,叫做指针,也叫探测器(probe)。在探测器上,DTrace可能需要执行一些任务,被称为actions,比如记录一些痕迹、期次、功能等。探测器像可以编程的传感器,分散到系统中的所有部位。如果你对那些部位感兴趣,可以编程去采集这些部位的传感器的数据。要是你没有专门的任务给这些探测器,那么它们将只负责记录信息。

Solaris中有30 000多个位置分散着指针探测器,DTrace可激活成千上万的探测器,记录所关注的位置指定的数据,如命中,即可从该地址显示用户进程或系统内核的数据,从而了解系统,具体信息包括:

 任何函数的参数;

 内核的任何全局变量;

 函数调用的时间(NS,十亿分之一秒,无任何其他PC/UNIX在ns一级精度);

 跟踪堆栈,包括指明函数调用的代码;

 函数调用时运行的进程;

 产生函数调用的线程。

每个探测器都有两个名字:惟一的数字ID和人们比较容易理解的字符名。先学一个简单的探测器,“BEGIN”,它是我们每次开始新的跟踪之前必须使用的。使用DTrace(1M)命令和-s选项可以应用这个探测器:

# DTrace -n BEGIN

运行之后稍微等待一会,你将看到下面的输出,按CtrlC键能返回你原来的shell:

# DTrace -n BEGIN

DTrace: description ’BEGIN’ matched 1 probe

CPU ID FUNCTION:NAME

0 1 :BEGIN

^C

#

输出的内容说明了探测器的名字叫“BEGIN”,数字ID是“1”。CPU栏目中显示“0”是指CPU的ID,说明CPU 0运行了这个探测器。

你可以使用DTrace命令来构建任何ID号码的探测器和动作(actions)。比如使用两个探测器“BEGIN”和“END”。“END”探测器是最后完毕时执行的:

# DTrace -n BEGIN -n END

DTrace: description ’BEGIN’ matched 1 probe

DTrace: description ’END’ matched 1 probe

CPU ID FUNCTION:NAME

0 1 :BEGIN

^C

0 2 :END

#

可以看到,当使用CtrlC退出DTrace时,触发了END探测器。

在理解了上述内容之后,就可以试着写第一个D程序了:“Hello,World”。创建一个文件hello.d。

 例18-1 创建文件hello.d。

BEGIN

{

trace("hello, world");

exit(0);

}

保存好这个文件,然后使用-s选项运行这个文件:

# DTrace -s hello.d

DTrace: script ’hello.d’ matched 1 probe

CPU ID FUNCTION:NAME

0 1 :BEGIN hello, world

#

每个D程序由一系列的语句组成,每个语句描述一个或多个探测器或探测器的动作。这些动作列在大括号{}内。每个声明的结尾由分号(;)结束。本例中trace("hello, world")是指当运行BEGIN探测器后,将变量“hello,world”打印出来。exit()是指DTrace将要退出跟踪结束DTrace命令。

从这里可以看出,D语言和C语言非常相似。它是C语言的子集,如果你以前写过C 语言,你就能很快学会写D语言。

提供者(Providers)和探测器

在前面的例子中,我们学会了两个简单的探测器BEGIN和END。那么这些探测器是从哪里来的呢?这些探测器来自于叫做providers的内核模块集,它也是探测器的分类。当你使用DTrace时,提供者给你一个发布他能提供给DTrace框架的探测器的机会,也可以对这个探测器绑定任何可以的动作。在系统中列出所有可用探测器:

# DTrace -l

ID PROVIDER MODULE FUNCTION NAME

1 DTrace BEGIN

2 DTrace END

3 DTrace ERROR

4 lockstat genunix mutex_enter adaptive-acquire

5 lockstat genunix mutex_enter adaptive-block

6 lockstat genunix mutex_enter adaptive-spin

7 lockstat genunix mutex_exit adaptive-release



#

这次输出要经过一段时间才能完成。如果要计算探测器的总数,则可以使用下列命令:

# DTrace -l | wc -l

30122

在不同的系统之中,探测器的总数因系统平台和安装软件的变化而变化。但是,正如你所见的那样,在你的系统中有大量的探测器。

我们再来观察DTrace –l的输出,注意到每个探测器都输出了两个名字,即数字ID和有实际意义的名字。这个易读的名字由四部分组成,具体意义如下表所示。

探测器名字的意义:
Provider--发布这个探测器的提供者的名字。这个名字代表了执行探测器的内核模块的名字
Module--如果这个探测器反映了专门程序的区域,此栏目就是探测器位于模块的名字。这个名字既可以是内核模块的名字,也可以是用户库(library)的名字
Function--如果这个探测器反映了专门程序的区域,则此栏目就是这个程序的功能名
Name--探测器的名字

Name
       

探测器的名字

探测器的完整名字:

provider:module:function:name

需要注意的是,有些探测器没有module和function,如BEGIN和END探测器。有些探测器有两个空白的栏目,因为这些探测器不能反映专门程序的功能和区域。比如前面我们介绍过的BEGIN探测器的名字就是DTrace:::BEGIN,它指这个探测器的提供者就是DTrace自己,并且没有module和function。探测器名字中的Provider类型如下表所示。

提供者名字--描 述
DTrace--提供者提供了几个关联到DTrace自己的探测器,有BEGING、END和ERRORD等
lockstat--提供者提供有关lock的信息和行为的探测器
profile--提供以专门的时间间隔为基础的探测器
FBT--提供内核功能分界方面的探测器
syscall--提供系统调用的入口和出口的探测器
sdt--提供对软件程序的指定位置的探测器
sysinfo--提供对内核的统计分类信息的探测器
vminfo--提供vm内核的统计信息的探测器
proc--提供有关进程、LWP的创建和终止,运行新的程序映像,以及发送和接受信号的探测器
sched--提供关于CPU调度方面的探测器
io--提供关于磁盘的输入和输出的探测器
mib--提供关于Solaris管理数据库的探测器
fpuinfo--提供在SPARC计算机上浮点运算方面的探测器
pid--提供用户进程的入口和返回方面的探测器
plockstat--提供观察用户级的行为的探测器

通过上表可以看出,使用DTrace可以很全面地观察系统。另外,将三万多探测器分类后,也可以方便我们来使用它们。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP

D语言的简单介绍

举个例子来介绍D语言。我们使用profile提供者来执行一个以时间为基础的记数。这个新的探测器的名字就叫profile:::tick-nsec,n只正整数,就是profile提供者每隔n秒钟来创建一个DTrace执行。我们将这个程序保存在名为counter.d的文件中:

 例18-2

/*

* Count off and report the number of seconds elapsed

*/

DTrace:::BEGIN

{

i = 0;

}

profile:::tick-1sec

{

i = i + 1;

trace(i);

}

DTrace:::END

{

trace(i);

}

运行这个程序:

# DTrace -s counter.d

DTrace: script ’counter.d’ matched 3 probes

CPU ID FUNCTION:NAME

0 25499 :tick-1sec 1

0 25499 :tick-1sec 2

0 25499 :tick-1sec 3

0 25499 :tick-1sec 4

0 25499 :tick-1sec 5

0 25499 :tick-1sec 6

^C

0 2 :END 6

#

熟悉C语言编程的读者可能很容易理解这个脚本程序。D语言和C语言非常类似。不熟悉C语言的读者也不用担心,因为随着D语言的流行,可以在因特网上找到很多现成的D语言工具,可以免费使用。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP

DTrace命令介绍

DTrace(1M)命令执行简单的端口调用D语言的编译器,能从DTrace内核工具中找回缓存中数据的踪迹并打印出来。

DTrace命令参数:

# DTrace

Usage: DTrace [-32|-64] [-aACeEFGHlqSvVwZ] [-b bufsz] [-c cmd] [-D name[=def]]

[-I path] [-o output] [-p pid] [-s script] [-U name]

[-x opt[=val]] [-X a|c|s|t]


[-P provider [[ predicate ] action ]]

[-m [ provider: ] module [[ predicate ] action ]]

[-f [[ provider: ] module: ] func [[ predicate ] action ]]

[-n [[[ provider: ] module: ] func: ] name [[ predicate ] action ]]

[-i probe-id [[ predicate ] action ]] [ args ... ]


predicate -> '/' D-expression '/'

action -> '{' D-statements '}'

-32产生32位D程序和ELF32文件。

-64产生64位D程序和ELF64文件。

-a宣布进入匿名跟踪状态。

-A对匿名跟踪产生dirver.conf(4)的指示。

-b设置跟踪的缓存的人小。

-c当命令执行完后,运行专门的命令退出。

-C在脚本文件中运行cpp(1)预处理程序。

-D当调用预处理程序时,定义一个符号。

-e在启动探针之前,完成一定要求后退出。

-E在跟踪数据之前,启动探针后退出。

-f列出匹配特定函数名的探针的名称。

-F按属性进行联合输出。

-G产生包含D语言的EFL文什。

-H当调用预处理程序时,将所包含的文件打印出来。

-i将匹配的专门ID的探针打印出来。

-I增加包含预处理程序的目录。

-1列出匹配专门标准的探针。

-m列出匹配专门模块的探针名。

-n列出匹配专门的名称的探针。

-o设置输出文件。

-p捕捉专门的进程ID和符号表的缓存。

-P列出所匹配提供者名的探针。

-q设置一个平静的模式,只明确输出跟踪的数据。

-s依据专门的D语言脚本列出探针。

-S打印出D语言的编译代码。

-U当调用预处理程序时不定义符号。

-v置详细的模式来报告程序的稳定的属性。

-V报告DTrace的API版本。

-w允许的破坏行为的选项。

-x使用或修改编译器和跟踪属性。

-X使用ISO C来设定预处理程序。

-Z允许匹配“0”探针的描述。

 例18-3 比较DTrace与Solaris系统的ps命令的区别。

如用ps命令查看mozilla进程:

# ps -e |grep mozilla

2386 pts/11 0:00 mozilla

2436 pts/11 10:12 mozilla-

用DTrace的探测器查看此进程,则是:

# DTrace -n 'syscall::exece:return { trace(execname);}'

DTrace: description 'syscall::exece:return ' matched 1 probe

CPU ID FUNCTION:NAME

0 11082 exece:return uname

0 11082 exece:return uname

0 11082 exece:return basename

……

0 11082 exece:return sed

0 11082 exece:return mozilla-bin

1 11082 exece:return csh

1 11082 exece:return mozilla

……

 例18-4 体验date命令和DTrace命令的区别。

如用date命令显示系统时间,很快就结束了,无法跟踪:

% date

2005年05月24日 星期二 20时39分03秒 CST

体验DTrace跟踪效果:

# DTrace -n 'syscall::exece: {trace(timestamp)}'

dDTrace: description 'syscall::exece: ' matched 2 probes

CPU ID FUNCTION:NAME

0 11081 exece:entry 102890531281542

0 11082 exece:return 102890532181875

可以看到,跟踪其在第102890531281542纳秒开始读取,第102890532181875纳秒返回结果。

 例18-5 体验vmstat命令和DTrace命令输出的区别。

如看机器忙闲状态,常用vmstat命令:

bash-3.00# vmstat 1

kthr memory page disk faults cpu

r b w swap free re mf pi po fr de sr cd f0 s0 -- in sy cs us sy id

0 0 0 599168 9736 3 15 5 1 1 0 3 1 0 0 0 276 185 100 1 17 82

0 0 0 611088 21720 0 23 36 0 0 0 0 4 0 0 0 279 146 114 7 38 55

0 0 0 611088 21720 0 0 0 0 0 0 0 4 0 0 0 335 179 134 2 3 95

0 0 0 611088 21720 0 0 0 0 0 0 0 4 0 0 0 330 158 115 2 4 94

0 0 0 611088 21720 0 0 0 0 0 0 0 4 0 0 0 391 303 145 6 4 90

0 0 0 611088 21720 0 0 0 0 0 0 0 4 0 0 0 346 216 117 3 3 94

^C

我们可以看出,系统调用(sy)产生216多个问题,但vmstat没有显示是哪些进程所产生的问题,现在试用DTrace来查看:

# DTrace -n 'syscall::read:entry {@NUM[execname] = count();}'

dDTrace: description 'syscall::read:entry ' matched 1 probe

^C

运行一会,按下^C。出现下面的结果:

automountd 1

nscd 5

ttymon 6

sac 6

dtterm 12

init 12

utmpd 18

dtwm 262

sdtperfmeter 1823

Xorg _ 11166

显然发现Xorg和sdtperfmeter是产生大量系统调用的程序。

详细查看一下:

# DTrace -n 'syscall::write:entry {@NUM[execname] = quantize(arg2);}'

sdtperfmeter

value ------------- Distribution ------------- count

2 | 0

4 | @@@@@@@@@@@@@@@ 3970

8 | 0

可观察到sdtperfmeter产生的I/O都是4个字节。

显然,使用DTrace组合命令要比vmstat命令输出的信息详细得多。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP

使用DTrace工具

无论对于系统管理员还是程序开发人员来说,DTrace都能带来莫大的方便,它使我们直接观察系统的运行情况。本节将要举一些使用DTrace的实例,使读者直观地感受DTrace的魅力。

Solaris 10系统自带的常用DTrace举例

首先需要说明的是,DTrace只有在Solaris 10系统或更高版本的Solaris中才能应用。并且在这些系统中,也自带一些D语言的脚本程序,它们位于/usr/demo/DTrace目录中。初学者可以先看看这些例子,运行一下,对理解DTrace的使用和D语言的编写会有好处。

进入/usr/demo/DTrace目录后,发现此目录中有下列程序,我们可以直接使用它们,也可以稍加修改再使用。

# cd /usr/demo/dtrace

# ls

applicat.d intr.d qtime.d whatfor.d

badopen.d iocpu.d renormalize.d whatlock.d

begin.d iosnoop.d restest.d where.d

callout.d iothrough.d ring.d whererun.d

clause.d iotime.d rtime.d whoexec.d

clear.d iprb.d rwinfo.d whofor.d

countdown.d kstat.d rwtime.d whoio.d

counter.d ksyms.d sig.d whopreempt.d

dateprof.d libc.d soffice.d whoqueue.d

delay.d lquantize.d spec.d whosteal.d

denorm.d lwptime.d specopen.d whowrite.d

end.d normalize.d ssd.d writes.d

error.d nscd.d sunlogo.gif writesbycmd.d

errorpath.d pri.d syscall.d writeabycmdfd.d

find.d printa.d tick.d writetime.d

firebird.d pritime.d ticktime.d writetimeq.d

hello.d prof.d time.d xioctl.d

howlong.d profpri.d tracewrite.d xterm.d

index.html progtime.d trunc.d xwork.d

interp.d putnext.d trussrw.d

interval.d qlen.d userfunc.d

#

对于这些D语言程序,在使用时候应该选择-s的选项。

 例18-6 检测系统命令的读写时间。

对于某个终端在运行系统命令时,可以用rwtime.d程序来监测读写时间。

首先要弄清楚用户的终端Shell进程号码。方法是打开一个新的终端控制台,在提示符下运行:

#echo $$

623

然后,我们来了解rwtime.d程序:

syscall::read:entry,

syscall::write:entry

/pid == $1/

{

ts[probefunc] = timestamp;

}

syscall::read:return,

syscall::write:return

/pid == $1 && ts[probefunc] != 0/

{

printf("%d nsecs", timestamp - ts[probefunc]);

}

可见启动了syscall探测器,并且需要输入$1变量值。

运行DTrace命令后,可以看到这个程序匹配四个探测器。在id为623的终端控制台上输入任何命令,rwtime.d就会反馈出这个命令运行了多少纳秒。

# dtrace –s rwtime.d 623

dtrace: script ’rwtime.d’ matched 4 probes

CPU ID FUNCTION:NAME

0 14 write:return 4089025 nsecs

0 12 read:return 23530445493 nsecs

0 14 write:return 155161 nsecs

0 14 write:return 78225 nsecs

0 12 read:return 523171473332 nsecs

 例18-7 获得读写操作的统计。

# DTrace -q -s rwinfo.d ‘pgrep -n ksh‘

^C

pgrep -n ksh将输出ksh进程的ID,将此ID输入程序中,程序将反馈出此ksh中的读写统计。

过几分钟后,键入^C。得出下面的结果:

calls max bytes elapsed nsecs

------ ----- --------- -------------

read 36 1024 3588283144

write 35 59 14945541

#

以纳秒的形式显示了读和写操作的时间统计。

使用第三方编写的DTrace工具

如果你没有时间来写D程序或者没有时间来学习写这些程序,也不用担心,在下面链接的网站可以下载一个打包的DTrace工具包:

http://users.tpg.com.au/adsln4yb/DTrace.html#DTraceToolkit

http://www.openSolaris.org/os/community/DTrace/DTracetoolkit

http://www.brendangregg.com/DTrace.html#DTraceToolkit

目前的最新版本是DTraceToolkit-0.84.tar.gz。这个工具包大约有80个脚本程序。

下载后,首先需要使用gunzip和“tar xvf”命令解压缩包。然后,运行./install程序,将这些文件解压缩后放到可以执行的目录。

下面我们详细介绍DTraceToolkit工具包中的程序的用法。

 例18-8 dexplorer程序。

dexplorer程序是一个对系统进行全面检测的工具。在默认情况下,这个程序每5秒钟对系统的某个方面采集一次数据。

下面就是数据的采集过程:

# dexplorer

Output dir will be the current dir (/export/home/root/DTrace/Dexplorer).

Hit enter for yes, or type path:

Starting dexplorer ver 0.70.

Sample interval is 5 seconds. Total run is > 100 seconds.

0% Interrupts by CPU...

5% Interrupt counts...

10% Dispatcher queue length by CPU...

15% Sdt counts...

20% Pages paged in by process name...

25% Files opened count...

30% Disk I/O size distribution by process name...

35% Minor faults by process name...

40% Vminfo data by process name...

45% Mib data by mib statistic...

50% TCP write bytes by process...

55% Sample process @ 1000 Hz...

60% Syscall count by process name...

65% Syscall count by syscall...

70% Read bytes by process name...

75% Write bytes by process name...

80% Sysinfo counts by process name...

85% New process counts with arguments...

90% Signal counts...

95% Syscall error counts...

100% Done.

File is de_duanf_200510271803.tar.gz

从开始的信息我们知道,这个运行的dexplorer版本现在是0.70。

在输出的最后,我们发现所采集的数据被存放到一个以tar.gz结尾的压缩文件中。

下面让我们来解开这个压缩文件:

# gunzip de_duanf_200510271803.tar.gz

# tar xf de_duanf_200510271803.tar

de_duanf_200510271803

de_duanf_200510271803/Cpu

de_duanf_200510271803/Cpu/interrupt_by_cpu

de_duanf_200510271803/Cpu/interrupt_time

de_duanf_200510271803/Cpu/dispqlen_by_cpu

de_duanf_200510271803/Cpu/sdt_count

de_duanf_200510271803/Disk

de_duanf_200510271803/Disk/pgpgin_by_processname

de_duanf_200510271803/Disk/fileopen_count

de_duanf_200510271803/Disk/sizedist_by_processname

de_duanf_200510271803/Mem

de_duanf_200510271803/Mem/minf_by_processname

de_duanf_200510271803/Mem/vminfo_by_processname

de_duanf_200510271803/Net

de_duanf_200510271803/Net/mib_data

de_duanf_200510271803/Net/tcpw_by_process

de_duanf_200510271803/Proc

de_duanf_200510271803/Proc/sample_process

de_duanf_200510271803/Proc/syscall_by_processname

de_duanf_200510271803/Proc/syscall_count

de_duanf_200510271803/Proc/readb_by_processname

de_duanf_200510271803/Proc/writeb_by_processname

de_duanf_200510271803/Proc/sysinfo_by_processname

de_duanf_200510271803/Proc/newprocess_count

de_duanf_200510271803/Proc/signal_count

de_duanf_200510271803/Proc/syscall_errors

de_duanf_200510271803/Info

de_duanf_200510271803/Info/uname-a

de_duanf_200510271803/Info/psrinfo-v

de_duanf_200510271803/Info/prtconf

de_duanf_200510271803/Info/df-k

de_duanf_200510271803/Info/ifconfig-a

de_duanf_200510271803/Info/ps-o

de_duanf_200510271803/Info/uptime

de_duanf_200510271803/log

这样,我们就会得到存储系统数据的文件。通过此文件可以好好分析系统的负载运行情况了。

如果不需要看采集数据的过程,可以将它们直接存放某个目录下,如/var/tmp:

# dexplorer -qy -d /var/tmp

#

其中,

 -qy:是不在屏幕上显示。

 -d:存放的路径。

dexplorer只是采集了系统概括信息,如果要仔细查看系统某一方面的信息,还可以用工具包中的其他程序。

 例18-9 使用isnoop来检测系统I/O情况。

# iosnoop

UID PID D BLOCK SIZE COMM PATHNAME

100 15795 R 3808 8192 tar /usr/bin/eject

100 15795 R 35904 6144 tar /usr/bin/eject

100 15795 R 39828 6144 tar /usr/bin/env

100 15795 R 3872 8192 tar /usr/bin/expr

100 15795 R 21120 7168 tar /usr/bin/expr

100 15795 R 43680 6144 tar /usr/bin/false

100 15795 R 44176 6144 tar /usr/bin/fdetach

100 15795 R 3920 8192 tar /usr/bin/fdformat

100 15795 R 3936 8192 tar /usr/bin/fdformat

100 15795 R 4080 8192 tar /usr/bin/fdformat

100 15795 R 9680 3072 tar /usr/bin/fdformat

输出的内容可比iostat命令的输出要详细多了。

还可以使用tcpnoop来查看新建立的tcp连接情况。

 例18-10 查看新建立的tcp连接情况。

# tcptop -C 10

Sampling... Please wait.

2005 Jul 5 04:55:25, load: 1.11, TCPin: 2 Kb, TCPout: 110 Kb



UID PID LADDR LPORT FADDR FPORT SIZE NAME

100 20876 192.168.1.5 36396 192.168.1.1 79 1160 finger

100 20875 192.168.1.5 36395 192.168.1.1 79 1160 finger

100 20878 192.168.1.5 36397 192.168.1.1 23 1303 telnet

100 20877 192.168.1.5 859 192.168.1.1 514 115712 rcp



2005 Jul 5 04:55:35, load: 1.10, TCPin: 0 Kb, TCPout: 0 Kb



UID PID LADDR LPORT FADDR FPORT SIZE NAME

0 242 192.168.1.5 79 192.168.1.1 54220 272 inetd

0 20879 192.168.1.5 79 192.168.1.1 54220 714 in.fingerd


[...]

上面的输出说明,系统每隔10秒种采集一次数据。如果不使用^C结束的话,屏幕将一直显示下去。从目前的输出可以看到,进程20877的输出流量最大为110KB。

如果只想简单地查看有哪些计算机连接到自己,使用connections程序就可以了。

 例18-11 查看连接自己的计算机。

# connections

UID PID CMD TYPE PORT IP_SOURCE

0 242 inetd tcp 79 192.168.1.1

0 359 sshd tcp 22 192.168.1.1

100 1532 Xorg tcp 6000 192.168.1.1

^C

 例18-12 使用prustat脚本显示进程的%CPU, %Mem, $Disk and %Net。

# prustat -t10 5

PID %CPU %Mem %Disk %Net COMM

22301 54.30 3.15 0.00 0.00 setiathome

440 2.24 45.36 0.00 0.00 Xsun

22272 30.26 0.31 0.00 0.00 perl

2618 0.26 14.34 0.00 0.00 mozilla-bin

582 1.27 2.16 0.00 0.00 gnome-terminal

576 0.02 2.80 0.00 0.00 nautilus

2299 0.21 1.99 0.00 0.00 acroread

578 0.35 1.46 0.00 0.00 gnome-panel

574 0.37 1.31 0.00 0.00 metacity

6504 0.00 1.23 0.00 0.00 nautilus-throbb

PID %CPU %Mem %Disk %Net COMM

22301 57.02 3.15 0.00 0.00 setiathome

440 2.35 45.36 0.00 0.00 Xsun

22272 26.99 0.31 0.00 0.00 perl

2618 0.26 14.34 0.00 0.00 mozilla-bin

22321 3.48 1.46 0.00 0.00 DTrace

582 1.29 2.16 0.00 0.00 gnome-terminal

576 0.02 2.80 0.00 0.00 nautilus

2299 0.21 1.99 0.00 0.00 acroread

578 0.36 1.46 0.00 0.00 gnome-panel

574 0.39 1.31 0.00 0.00 metacity

^C

从输出我们可以看出,系统有两个进程在争夺CPU资源,它们分别是setiathome和perl。由于输出数据的显示是分类的,Xsun在%Mem项比perl在%CPU项的数值大,所以Xsun被排到了第二位。“-t10”属性的意思是显示最大的10行,而“5”是每5秒钟来采集一次数据。

DTraceToolkit中有许多有用的工具,对于了解系统运行状况非常好用,有兴趣的读者不妨自己下载后运行一下,体验一下DTrace带来的方便和快捷。

对于某些读者来说,如果使用现成的脚本程序还不能满足自己的需求,那么,根据需要自己动手编写DTrace程序,写一个D程序也不是什么难事,事实上D语言也非常简单。由于介绍如何写D语言已经超出了本书的范围,所以推荐读者到Sun公司网站上看看,它有一个pdf文档可以帮助我们如何学习写D语言。在此只给出链接http://docs.sun.com/db/doc/817-6223,有需要的读者可以自行下载。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP

2 Solaris 10区域技术

Solaris 10版本支持将一个主机用软件分成多个区域(zone),每个区域都是一个独立的系统,可以运行不同的软件或同样软件的不同版本。本章主要介绍区域(zone)技术。

Solaris 10区域介绍

本节主要介绍区域的基本概念、特性,以及区域是如何工作的等。

概述

区域为运行中的应用程序提供一个隔离的安全环境。利用区域,你可以在一个Solaris实例中创建多个虚拟的操作系统环境。区域可使一个或多个进程与系统中其他进程分开独立运行。例如,某个区域中运行的进程只能将信号发送给同一区域中的其他进程,而不考虑其用户ID和其他证书信息。一旦发生错误,只会影响到运行在这一区域中的进程。

Solaris容器技术提供了一种创新的服务器虚拟化方案。由于操作系统的每个实例能够支持多个软件分区,因此Solaris容器使整合变得十分简单而安全。Solaris容器能够根据业务目标在容器内或跨容器动态地调整资源,从而提供更好的计算资源利用率。由于系统开销极小(不到1%),所以它能用于在每个系统或动态系统域中创建超过8 000个容器。同时,应用程序不仅实现了相互隔离,而且与系统故障隔离,因此一个应用程序出现问题不会影响其他应用程序。

通过使用Instant Restart,每个Solaris容器只需几秒钟即可重新启动,从而更大限度地减少应用停机时间。

由于Solaris容器完全由软件支持,与平台无关,因此可以在SPARC或基于x86的64位平台上使用,包括大规模的服务器及刀片服务器。Solaris容器还利用了Solaris的资源管理功能,允许在容器之间动态转移资源,可确保更高的利用率。
1.全局区域概括介绍

与先前的Solaris OS发行版一样,每个Solaris 10系统都包含一个通用全局环境,称为全局区域。全局区域具有以下两种功能:它是系统的默认区域,可用于整个系统的管理控制。如果全局管理员没有创建非全局区域(可简称为区域),则所有进程将运行在全局区域中。

只能从全局区域配置、安装、管理或卸载非全局区域。只有全局区域才可从系统硬件进行引导。只有在全局区域中才具有管理功能,例如物理设备、路由选定或动态重新配置(DR)。运行在全局区域中的具有适当特权的进程能够访问与其他区域相关联的对象。

对于非全局区域中具有特权的进程或用户来说是不允许的操作,全局区域中的非特权进程或用户也许可以执行。例如全局区域中的用户可以查看关于系统中每个进程的信息。在维护整体系统安全时,管理员可以为区域赋予一部分管理功能。
2.非全局区域概括介绍

非全局区域不需要专用CPU、物理设备或物理内存。在单个域或系统中运行的多个区域可以共享这些资源。某些区域的引导和重新引导不会影响到系统中的其他区域。每个区域都可提供一组自定义的服务。为增强基本进程隔离,一个进程只能“看见”或发信号给处于同一区域中的其他进程。区域之间的基础通信是通过赋予每个区域至少一个逻辑网络接口来实现的。即使不同数据包流通过同一个物理接口传送,运行在一个区域中的应用程序也无法看到另一区域中的网络流量。

需要网络连接的每个区域都配置了一个或多个专用IP地址。

区域是如何工作的

对于合并许多应用程序到一个服务器上来说,区域是一个很好的工具。以前,一般需要很多台服务器的事情现在一台就解决了,减少了很多管理成本。

图19-1中一个服务器上有四个区域,每个区域都有自己的应用程序、用户。它们互不干扰地工作在各自的区域,并且有一个共同的硬件环境。从图例中还可以看出,不同版本的应用软件也可以工作在不同的区域。区域也可以为每个服务定制不同的软件环境。

图示最下面的部分是描述物理硬件部分,这里有网卡和存储磁盘等。再往上一层就是系统核心服务部分、远程管理和硬件管理部分。这两层构成了所有区域都共同拥有的基础平台。再往上的第三层的zone management就是全局区域所独有的、管理区域的工具了。第四层是被称为虚拟平台的部分。在全局的文件系统上,又建立起三个虚拟的文件系统,它们有相同的目录结构。在非全局区域看来,虚拟文件系统就是本区域的文件系统。其实,不同区域的目录有些是共用的。第五层就是应用程序层了。这里有不同的应用程序,它们在一个物理计算机上互不干扰地运行着。最上边的一层就是全局区域,其实,我们可以将全局区域看做是其他三个非全局区域的容器。

总结一下,区域是如何工作的:

 不同版本的软件可以装在不同的区域。

 每个区有自己的网络连接和IP地址。

 同区的进程间可以通信,不同区的只能通过网络通信。

 每个系统的容器是global zone,global zone有双重的属性,默认的区和管理控制区。

 全局区可以安装、设置、管理、卸载分全局区。但只有全局区管理系统的硬件和路由,并且特权进程可以联系到分全局区。

图9多区域结构示意图

 全局区的用户可以查看整个系统的进程信息。

 每个区都有自己的名字,包括全局区,全局区的名字就叫global,每个区都有id号,全局区的id号是0。
1.全局区和非全局区域对比

全局区域和非全局区域对比如下所示。

3.非全局区域的状态

 Configured

设置状态。

 Incomplete

当在安装或卸载的时候,zoneadm设置目标区的状态为incomplete。

 Installed

分区正处在安装状态,zoneadm校验系统软件包的设置。

 Ready

分区的虚拟平台已经建立,内核创建了zsched进程,网络端口启用,文件系统已经mount,设备已经被设置好,惟一的区别是ID号已经被系统分发。但是,与分区相关的进程还没有开始。

 Running

用户的进程和区的应用环境都运行着。

 Shutting down and Down

Shutting down表明关机器电源;Down表明关闭非全局区。

非全局区域的特性总结

 Security

一个放置在分区的进程不同于全局区,这个进程只能有本分区改变。网络服务也可以放在分区中,分区可以隔绝服务的故障所带来的损害。入侵者进入分区后,就被限制在这个区内。不影响其他区。区的权限是系统全局权限的子集。

 Isolation

允许在一台计算机上有多个应用程序,这些应用程序共享资源。比如,一个应用可以在不同的分区,而使用网络端口是相同的,这样可以配不同的IP地址,防止这个应用软件在一个区内的干扰。

 Virtualization

分区隐藏了系统的硬件设备、系统主要的IP地址和主机名。这些环境维持着多个分区。活动分区的管理者不能重新启动。

 Granularity

分区不需要专门的硬件设备;

分区能定制服务;

分区是整个系统文件的一部分;

分区的naming services是不同的。

 Environment

分区不能更改硬件环境。

[ 本帖最后由 云杉上的蝴蝶 于 2008-4-12 05:05 编辑 ]
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP

zonecfg命令

在Solaris区域技术中,zonecfg命令是用来设置区域的命令,它的作用是非常重要的。本节主要讲述如何使用这个命令。
zonecfg命令
1.命令功能

zonecfg是用来设置区域的命令。下面就是zonecfg命令的功能:

 能创建或删除区域的设置。

 增加资源到特殊的设置。

 设置资源属性到区域。

 从特殊的设置中删除资源属性。

 查询和修改设置。

 恢复以前的设置。

 从zonecfg会话退出。

zonecfg提示符如下面的形式:

zonecfg:zonename>

当你设置了专门的资源类型,比如文件系统,这个资源类型也能包含在这个提示符中:

zonecfg:zonename:fs>
2.交互式zonecfg命令

在交互模式中,下面子命令可以被支持。详细的子命令信息可以查看zonecfg(1M)帮助页。

 Help:打印一般的帮助,或者显示关于给定资源的帮助

zonecfg:my-zone:inherit-pkg-dir> help

 create:为了下列目的之一,开始在内存中开始新的区域。

 应用默认设置到新的设置,这个方法是默认的。

 当用-t template选项时,创建和模板一样的设置。但要更改区域名。

 当用-F选项,强行推出设置。

 当用-b选项,创建空白设置。

 export:打印设置的标准输出,或到专门的输出文件。

 Add:在全局模式,增加专门的资源类型设置;在资源模式,增加资源属性和值。

 Set:给属性设定相应的值,这个命令可以应用在全局模式或资源模式。

 Select:只能应用在全局模式,选择资源类型。

 Remove:只能应用在全局模式,删除专门的资源类型。

 End:只能应用在资源模式,结束这个模式。

 Cancel:只能应用在资源模式,取消资源模式的设置,并返回到全局模式。

 Delete:删除设置。

 Info:显示当前的设置信息。

 Verify:检查当前设置是否正确。

 Commit:将当前的设置从内存中提交到稳定的存储。

 Revert:恢复设置到最后一次提交之前。

 Exit:退出zonecfg命令。

3.影响区域状态的命令

影响区域状态的命令分类如下表所示
当前区域状态 && 应用命令
configured  
zonecfg -z zonename verify
zonecfg -z zonename commit
zonecfg -z zonename delete
zoneadm -z zonename verify
zoneadm -z zonename install

incomplete
zoneadm -z zonename uninstall

installed
zoneadm -z zonename ready(可选的)
zoneadm -z zonename boot
zoneadm -z zonename uninstall卸载区域设置
zonecfg -z zonename用来增加和删除文件系统、设备、网络设置,但不能改变zonepath和inherit-pkg-dir资源

ready
zoneadm -z zonename boot
zonecfg -z zonename用来增加和删除文件系统、设备、网络设置,但不能改变zonepath和inherit-pkg-dir资源

running
zoneadm -z zonename reboot
zoneadm -z zonename halt
zonecfg -z zonename用来增加和删除文件系统、设备、网络设置,但不能改变zonepath和inherit-pkg-dir资源


资源管理类型设置举例

在使用zonecfg命令设置区域时,需要设置一些很重要的资源。下面我们重点介绍分区时的资源类型设置。
1.文件系统

 例19-1 分区的文件系统相关设置。

zonecfg:my-zone> add fs //增加文件系统设置

zonecfg:my-zone:fs> set dir=/mnt //设定新增文件系统目录

zonecfg:my-zone:fs> set special=/dev/dsk/c0t0d0s2 //设置块设备

zonecfg:my-zone:fs> set raw=/dev/rdsk/c0t0d0s2 //设置裸设备

zonecfg:my-zone:fs> set type=ufs

zonecfg:my-zone:fs> add options [nodevices,logging]

zonecfg:my-zone:fs> end

在全局区域的/dev/dsk/c0t0d0s2被my-zone区mount到/mnt目录;文件系统的类型是UFS;节点设备和日志记录属性被增加进文件系统。
2.inherit-pkg-dir方式

 例19-2 以inherit-pkg-dir方式mount文件系统。

zonecfg:my-zone> add inherit-pkg-dir

zonecfg:my-zone:inherit-pkg-dir> set dir=/opt/sfw

zonecfg:my-zone:inherit-pkg-dir> end

inherit-pkg-dir方式就是从全局区域继承过来的,只读的文件系统。
3.网络设置

 例19-3 在分区网络端口上增加一个IP地址。

zonecfg:my-zone> add net

zonecfg:my-zone:net> set physical=hme0

zonecfg:my-zone:net> set address=192.168.0.1

zonecfg:my-zone:net> end
4.增加设备

 例19-4 在分区中增加一个设备。

zonecfg:my-zone> add device

zonecfg:my-zone:device> set match=/dev/pts*

zonecfg:my-zone:device> end
5.资源控制

 例19-5 在公平共享调度类中设置CPU资源共享。

zonecfg:my-zone> add rctl

zonecfg:my-zone:rctl> set name=zone.cpu-shares

zonecfg:my-zone:rctl> add value (priv=privileged,limit=10,action=none)

zonecfg:my-zone:rctl> end

 例19-6 设定分区中最大的LWP数量。

zonecfg:my-zone> add rctl

zonecfg:my-zone:rctl> set name=zone.max-lwps

zonecfg:my-zone:rctl> add value (priv=privileged,limit=100,action=deny)

zonecfg:my-zone:rctl> end
6.增添注释

 例19-7 增加分区的注释。

zonecfg:my-zone> add attr

zonecfg:my-zone:attr> set name=comment

zonecfg:my-zone:attr> set type=string

zonecfg:my-zone:attr> set value="Production zone"

zonecfg:my-zone:attr> end

[ 本帖最后由 云杉上的蝴蝶 于 2008-4-12 05:13 编辑 ]
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP

创建和删除非全局区域

本节主要介绍如何创建和删除非全局区域。

在创建之前如何进行区域的设置

(1)首先创建一个目录,用来存放新的分区文件。

root@b1000:/# mkdir -p /zone/zone1

注意目录的权限

root@b1000:/# ls –l /zone /zone/zone1

drwxr-xr-x 2 root other 512 Dec 4 14:42 /zone/

drwx------ 4 root root 512 6月 8日 14:45 zone1

(2)创建一个名为zone1的分区设置:

root@b1000:/# zonecfg -z zone1

zone1: No such zone configured

Use 'create' to begin configuring a new zone.

zonecfg:zone1> create //开始创建分区

zonecfg:zone1> set zonepath=/zone/zone1

zonecfg:zone1> set autoboot=true

zonecfg:zone1> add net //开始网络设置状态

zonecfg:zone1:net> set address=192.168.0.101

zonecfg:zone1:net> set physical=eri0

zonecfg:zone1:net> end //退出网络设置状态

(3)查看刚才设置的分区信息

zonecfg:zone1> info

zonepath: /zone/zone1

autoboot: true

pool:

inherit-pkg-dir:

dir: /lib

inherit-pkg-dir:

dir: /platform

inherit-pkg-dir:

dir: /sbin

inherit-pkg-dir:

dir: /usr

net:

address: 192.168.0.101

physical: eri0

zonecfg:zone1> verify

zonecfg:zone1> commit //提交设置信息

zonecfg:zone1> ^D

root@b1000:/#

(4)分区配置完成,查看刚才保存好的zone1的设置信息:

root@b1000:/# zonecfg -z zone1 info

zonepath: /zone/zone1

autoboot: true

pool:

inherit-pkg-dir:

dir: /lib

inherit-pkg-dir:

dir: /platform

inherit-pkg-dir:

dir: /sbin

inherit-pkg-dir:

dir: /usr

net:

address: 192.168.0.101

physical: eri0

至此zone1分区的设置完成。

查看分区列表,zone1分区还在设置状态:

root@b1000:/# zoneadm list -vc

ID NAME STATUS PATH

0 global running /

- zone1 configured /zone/zone1

创建非全局区域

必须在全局区域创建非全局区域,其步骤如下:

(1)成为超级用户或授权角色用户。

(2)安装zone1需要使用zoneadm命令和参数-z:

global# zoneadm –z zone1 install

(3)如果出现错误信息,需要查看zone1区的状态:

global# zoneadm –z zone1 list -v

(4)正确的安装状态如下:

ID NAME STATE PATH

0 global running /

- zone1 installed /zone/zone1

如何启动非全局区域

必须在全局区域启动非全局区域,其步骤如下:

(1)成为超级用户或授权角色用户。

(2)使用zoneadm命令和参数-z来启动非全局区域。

# zoneadm -z zone1 boot

zoneadm: zone 'zone1': WARNING: hme0:1: no matching subnet

found in netmasks(4) for 192.168.0.1; using default of

255.255.255.0.

(3)查看启动结果:

global# zoneadm list -v

ID NAME STATE PATH

0 global running /

1 zone1 running /zone/zone1

(4)用单用户模式启动非全局区域

global# zoneadm -z zone1 boot -s

如何关闭非全局区域

关闭非全局区域步骤如下:

(1)成为超级用户或授权角色用户。

(2)查看非全局区域是否在启动状态。

global# zoneadm list -v

ID NAME STATE PATH

0 global running /

1 zone1 running /zone/zone1

(3)使用下列命令关闭非全局区域:

global# zoneadm -z zone1 halt

(4)查看非全局区域状态:

global# zoneadm list -v

ID NAME STATE PATH

0 global running /

- zone1 installed /zone/zone1

如何重启非全局区域

重新启动非全局区域的步骤如下:

(1)成为超级用户或授权角色用户。

(2)看非全局区域是否在启动状态:

global# zoneadm list -v

ID NAME STATE PATH

0 global running /

1 zone1 running /zone/zone1

(3)使用下列命令重启非全局区域:

global# zoneadm -z zone1 reboot

(4)查看非全局区域的状态:

global# zoneadm list -v

ID NAME STATE PATH

0 global running /

2 zone1 running /zone/zone1

注意:zone1的ID变成了2,说明对非全局区域而言,ID不是固定的。

卸载非全局区域

卸载非全局区域的步骤如下:

(1)成为超级用户或授权角色用户。

(2)确认非全局区域必须在非启动状态:

global# zoneadm list -v

ID NAME STATE PATH

0 global running /

- zone1 installed /zone/zone1

(3)使用下列命令卸载非全局区域:

global# zoneadm -z my-zone uninstall -F

(4)查看区域状态:

global# zoneadm list -v

ID NAME STATE PATH

0 global running /

彻底删除非全局区域

彻底删除非全局区域的步骤如下:

(1)成为超级用户或授权角色用户。

(2)关闭非全局区域。

global# zlogin zone1 shutdown

(3)卸载非全局区域。

global# zoneadm -z zone1 uninstall -F

(4)删除非全局区域。

global# zonecfg -z zone1 delete -F

(5)检查结果:

global# zoneadm list -v

ID NAME STATE PATH

0 global running /
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

TOP