xiaobailong
发表于 2005-9-5 10:56
18。设备
虚拟区内包含一些“安全”的伪设备(pseudo devices) ,这些设备都存在于/dev 目录下。事实上,/dev目录在虚拟区内是可见的,而 /devices不可见。一些设备,例如/dev/random, /dev/console被认为是安全的,而另外一些例如/dev/ip被认为不安全。物理设备文件,例如raw盘,也可以被放在虚拟区内使用,但是通常没必要这么做。
通常使用zonecfg里的add device命令往虚拟区内增加设备。
虚拟区可以修改设备文件的参数,但是不可以mknod(2)。也就是说,所有的设备都必须在大区内可见,然后才可以增加到虚拟区内。
xiaobailong
发表于 2005-9-5 12:15
19。动态跟踪(DTrace)
动态跟踪也是Solaris 10的一个很有吸引力的新功能,对debug非常有用。不过到目前为止,动态跟踪只能够在大区内使用。但是可以使用zonename变量动态跟踪一些内容。
例如,计算虚拟区的系统调用(system calls)的数量,可以在大区内执行如下命令来完成:
global# dtrace -n 'syscall:::/zonename=="red"/ {@=count()}'
另外也可以用curpsinfo->pr_zoneid来获取虚拟区内的进程列表。
DTrace和虚拟区共同使用的话,在跟踪调试多层(multi-tier)应用程序的时候,特别有用。
xiaobailong
发表于 2005-9-5 12:46
20。微处理器(CPU)和虚拟区
缺省情况下,所有的虚拟区共享所有的微处理器。
当设置了资源池(resource pool, 前面讲过的)之后,就能对虚拟区所能看到和使用的为处理进行一定的限制。一个虚拟区只能见到自己绑定的那个资源池所包含的微处理器集(process set,包含一个或多个选定的微处理器)。那些用来获取CPU使用信息的命令,例如iostat(1M), mpstat(1M), prstat(1M), psrinfo(1M), sar(1M)等等,也都被虚拟化,而只提供这个资源池里包含的微处理器集的使用情况。在虚拟区使用sysconf(3C)和getloadavg可以得到微处理器集所含的CPU的数量。大量的kstat(3KSTAT)关于cpu, cpu_info和cpu_stat的统计数值也都被虚拟化了,从而只包含虚拟区的内容。
通过这些虚拟化措施,使软件的使用费可以限制在虚拟区的范围内。
xiaobailong
发表于 2005-9-5 13:05
21。什么程序可以在虚拟区内运行
那么要想软件可以在虚拟区内运行,需要满足哪些条件呢?
首先,凡是可以不需要root权限就可以运行的程序,都可以直接在虚拟区内运行,不需要任何改动。
其次,那些需要root权限对网络和文件系统进行操作的应用程序,如果不需要其它的I/O操作,也可以直接在虚拟区内运行,不需要任何改动。
第三,需要root权限区对一些设备进行直接操作的应用程序,例如磁盘分区,只有在对虚拟区进行相应的设置之后,才可以直接运行。这些程序也不需要改动。但是这样做有可能会产生安全隐患,应事先考虑周全,尽量避免。(这一点前面 zat 也问到了。)
而不可以在虚拟区内运行的也有一些,例如,那些需要对/dev/kmem设备进行直接操作的应用。
xiaobailong
发表于 2005-9-5 13:45
22。开发员要知道的
需要反复强掉的是,虚拟区没有改变现有的Solaris的应用程序接口,包括二进制接口(ABI)和编程接口(API)。因此,那些不需要root权限就能运行的程序,可以不做任何修改就直接在虚拟区内运行。
需要特殊权限的应用程序,绝大多数情况下也没有问题,当然也有一些限制。首先,某些特殊权限(privileges)在虚拟区内是不被允许拥有的,所以有些系统调用(system calls)会由于权限不足而失败。值得一提的是,使用truss(1)命令可以掌握这些失败的系统调用的情况;而使用ppriv(1)命令可以修改特权设置。其次,某些特定的命名空间也受到一些限制。第三,不是所有设备都可以在虚拟区内使用,这一点前面关于设备的一段也说到了。
xiaobailong
发表于 2005-9-5 13:51
23。受限制的特权
有一个表格,列出了受限制的特权(privileges)。在Solaris的48个privileges中,有19个在虚拟区受到了限制,它们是: cpc_cpu, dtrace_kernel, dtrace_proc, dtrace_user, gart_access, gart_map, net_rawaccess, proc_clock_highres, proc_lock_memory, proc_priocntl, proc_zone, sys_config, sys_devices, sys_ipc_config, sys_linkdir, sys_net_config, sys_res_config, sys_suser_compat, sys_time。
xiaobailong
发表于 2005-9-5 13:52
24。其它限制
就像前面回答zat网友问题的时候已经说过的一样,一些软件需要在/usr目录内进行写操作,这个时候可以用lofs(7FS)方式mount文件系统到虚拟区内,而且不会有安全问题产生。
如果想要更多了解Solaris文件系统的结构,可以参看Solaris中filesystem(5)的man page.
xiaobailong
发表于 2005-9-5 14:09
25。虚拟区的状态模型
创建一个虚拟区,可以使用命令行方式,也可以使用图形用户界面,还可以使用配置文件来创建。常用的命令有zonecfg, zoneadm, zlogin。图形用户界面是Solaris Container Manager程序。配置文件则是xml格式的。
虚拟区主要有设置(Configured), 安装(Installed),准备(Ready)和运行(running)几个状态。
xiaobailong
发表于 2005-9-5 16:01
26。文件类型和虚拟区安装
缺省情况下,所有在大区里打包的文件都会被安装到虚拟区。打包过的文件会被直接从大区的根目录复制到虚拟区,例外的情况是那些可修改文件 (editable,例如 configuration file)和变化文件(volatile, 例如log file或lock file), 详细信息可以在Solaris中查看pkgmap(4)的man page。
可修改文件和变化文件是从稀疏档案(sparse package archive)"stash"里复制过来的,因为"stash"里专门存放了这类文件的原始备份。
一个“节省类型的虚拟区”(sparse root zone)大约用掉70MB的空间,并且随着安装包的增多而增大。
xiaobailong
发表于 2005-9-5 16:01
27。虚拟区其它安装细节
在设置虚拟区的时候,可以自己确定,哪些目录将会以只读方式mount到虚拟区,使用的参数是inherit-pkg-dir,像是从小区从大区继承了这些包一样。对于这些目录里的文件,只有他们的包的元数据(package metadata)被复制,程序文本(scripts)被执行。
安装虚拟区所需的时间和空间,取决于大区中包的数量,以及哪些包被“继承(inherited)”。
如果一个虚拟区没有从大区“继承”任何包,这种虚拟区被定义为"whole root zone",而那些继承了至少一个子目录的虚拟区被称为"sparse root zone"。
一个whole root zone的应用例子是:在虚拟区里安装和运行JES(Java Enterprise System)的话,需要whole root zone。