xiaobailong 发表于 2005-9-2 13:20

10。Solaris虚拟区的结构
刚刚安装好的Solaris事实上只有一个全局区域(global zone),我把它简称为大区,另外在这个大区的基础上,可以划分局部区域(local zone),我把它们称为小区,就是通常所说的虚拟区。在一个Solaris实例中,大区只能有一个,小区的数量可以自由确定,最多可以达到8000个。每一个小区本身大概占用70-几百兆的硬盘空间,另外建议留给它40M的内存空间。

虽然每一个虚拟区看起来就像是一个独立的操作系统,但是事实上这些区全部是在一个Solaris实例中的。从图中可以看到,只有一个内核,其中也包括了虚拟区的管理模块。在内核上有一个虚拟层,实现各个小区的虚拟化,虚拟区就在这层虚拟层上。虚拟区可以安装不同的应用程序,或相同应用程序的不同版本,例如三个虚拟区,一个装了Apache1.3,一个装数据库,第三个装Apache2.0。

xiaobailong 发表于 2005-9-2 13:46

11。安全性
每一个虚拟区都有一个安全边界。

虚拟区中对特权(Privileges)进行了一定的限制。也就是说哪怕是虚拟区中的root,也不是具有所有Solaris中的48个特权的,例如改变系统时间。而且虚拟区不能扩大它自己的特权。

虚拟区有它自己的独立的命名空间(name space),例如自己的root用户和普通用户。

一个区里运行的进程不能影响其它区的活动。

Solaris的日志系统也考虑到了虚拟区。大区的管理员可以指定,是整个系统一起有共同的日志,还是每个虚拟区有各自的日志。如果是每个虚拟区有各自的日志,小区的管理员可以独立设置自己的参数。

xiaobailong 发表于 2005-9-2 14:01

12。虚拟区中的进程
每一个进程属于一个区,可以是大区,也可以是小区,但是不能更换自己所属的区。

在虚拟区中不允许进行某些特定的系统访问(system call),或是访问范围受到限制。

属于同一个区的进程之间的互动和平常一样。

一个虚拟区里只能看到并影响同一个区里的进程,而看不到区外的进程。为了实现这些,proc指令被虚拟化了。

从大区里能看到所有的进程,但是需要一定的特权 。Solaris 10一共定义了48个特权,可以赋予不同的用户和进程。想要从大区里控制所有的进程,需要proc_zone特权,一般只有大区的root用户才有。

xiaobailong 发表于 2005-9-2 14:18

13。虚拟区的文件系统
每一个虚拟区都有自己的根目录(/),这个根目录在大区有自己的绝对路径,是应该在设立虚拟区的时候指定的。

不象chroot(2)命令,虚拟区里的进程不能够操作超出虚拟区的范围。

虚拟区的文件系统有三种方式存在,可以是只读方式从大区mount上去的,也可以是安装的时候从大区复制过去的,还可以是读写方式mount上去的。缺省情况下,/usr, /lib, /sbin, 和 /platform 四个文件系统是采用只读方式的,这样一来节省了空间,二来安装公用程序比较方便,三来打补丁的时候比较快捷,只要打在大区,各个虚拟区也就都有了。 /etc和/opt两个文件系统是被复制到各个虚拟区的。大区的其它文件系统可以用读写方式mount到虚拟区去。NFS客户端程序可以在虚拟区运行,但是NFS服务器到目前为止仍然不可以。另外,automounter 也可以在虚拟区运行。

xiaobailong 发表于 2005-9-2 15:47

14。虚拟区的网络
每一个虚拟区除了有一个区名(zonename) 之外,都有自己的IP地址,可以是IPv4或IPv6的,甚至可以有多个IP地址。另外还有自己的主机名(hostname),端口范围(port space),和命名服务(naming service)。

在设置安装一个虚拟区的时候,可以用zonecfg指令中的add net选项来指定网络接口和IP地址。 在一个虚拟区运行当中,也可以用ifconfig指令来分配另外的IP地址给这个虚拟区。

虚拟区之间的相互通讯,虽然是通过网络通讯协议来实现,但是事实上是在Solaris内部完成的,而不是真正通过网络,所以虚拟区之间通讯是高带宽,低延迟,不会给网络造成负担。

同时,一个虚拟区能看到自己的网络使用情况,但是不能看到其他虚拟区的网络使用情况。应用程序可以绑定到INADDR_ANY(*.*.*.*)地址上去,也就是所有的地址,但是只能看到在自己的虚拟区里的通讯流量。

xiaobailong 发表于 2005-9-2 16:40

15。身份
每一个虚拟区都有自己的节点名(node name),域名(RPC domain name),时区,语言设定和命名服务(例如LDAP,NIS)。在第一次启动进入虚拟区的时候,系统会自动调用sysidtool(1M)命令来帮助设置这些内容。

虚拟区有自己单独的/etc/passwd文件,这意味着虚拟区可以拥有自己的root用户,虽然权限受到一定的限制。

不同虚拟区所拥有的用户名也可以是不同的,还可以有不同的命名服务(name service)。

xiaobailong 发表于 2005-9-2 16:53

16。服务管理
虚拟区也可以和服务管理设施(Service Management Facility, smf(5))结合使用。每一个虚拟区有自己的储藏室(repository),并在虚拟区内运行自己的svc.configd(1M)和 svc.startd(1M)实例。每一个虚拟区有自己的contract(4)文件系统。需要注意的是,虚拟区本身(尚)不能作为一种服务来实现。

虚拟区事实上一个学习SMF,并测试服务转变的很好的工具。

到目前为止,虚拟区支持标准多用户运行模式和单用户运行模式(用boot -s启动),而不支持其它的模式。

zat 发表于 2005-9-5 08:52

原帖由 xiaobailong 于 2005-9-2 15:18 发表
13。虚拟区的文件系统
每一个虚拟区都有自己的根目录(/),这个根目录在大区有自己的绝对路径,是应该在设立虚拟区的时候指定的。

不象chroot(2)命令,虚拟区里的进程不能够操作超出虚拟区的范围。

虚拟区的文件系统有三种方式存在,可以是只读方式从大区mount上去的,也可以是安装的时候从大区复制过去的,还可以是读写方式mount上去的。缺省情况下,/usr, /lib, /sbin, 和 /platform 四个文件系统是采用只读方式的,这样一来节省了空间,二来安装公用程序比较方便,三来打补丁的时候比较快捷,只要打在大区,各个虚拟区也就都有了。 /etc和/opt两个文件系统是被复制到各个虚拟区的。大区的其它文件系统可以用读写方式mount到虚拟区去。NFS客户端程序可以在虚拟区运行,但是NFS服务器到目前为止仍然不可以。另外,automounter 也可以在虚拟区运行

我想问一下
1。如果是只读方的话,那是不是就不能实现在不同的虚拟区上安装不同的软件了?
2。如果是读写方式Mount的,会不会对大区的安全性有影响?

xiaobailong 发表于 2005-9-5 10:44

原帖由 zat 于 2005-9-5 09:52 发表

我想问一下
1。如果是只读方的话,那是不是就不能实现在不同的虚拟区上安装不同的软件了?
2。如果是读写方式Mount的,会不会对大区的安全性有影响?


以缺省方式创建的虚拟区,根目录/是虚拟化了的一个文件系统;/usr, /lib, /sbin, /platform四个文件系统是只读方式;/etc, /opt两个文件系统是从大区复制到虚拟区的。

通常安装在/opt或其它子目录例如/mysoftware的软件,在每个虚拟区内都是不同的。如果软件需要安装到上述四个只读方式的目录下的时候,就用到读写方式mount.

举例来说, oracle需要安装到/oracle目录下,这个目录在虚拟区里本身就是可读可写可以创建的。

另一个例子,sap软件一般需要安装到/usr/sap子目录下。这个时候可以先用缺省方式创建一个虚拟区,/usr目录是只读方式的。然后用zonecfg里的add fs指令,把大区里创建好的一个文件系统以lofs方式mount到虚拟区里的/usr/sap上去,实现可读可写。

以这种lofs读写方式mount的文件系统,在大区里是不能够进行读写操作的,连大区的root也不行,所以不会对大区有安全性的影响。

除了lofs mount之外,另有几种其它的mount方式,其中有一些,例如直接mount raw disks,就可能会有安全隐患,在mount之前需要事先规划清楚才能杜绝这些隐患。

xiaobailong 发表于 2005-9-5 10:55

17。进程间的通信
IPC机制例如System V IPC, STREAMS, sockets, libdoor(3LIB) 以及loopback传输在虚拟区之内都工作良好。

重要的IPC命名空间在虚拟区内都被虚拟化了。(例如?何为虚拟化?)

虚拟区之间的通讯通过网络协议和软件回送(loopback)来进行。

Global zone can setup rendezvous too, although this is not commonly needed.
页: 1 [2] 3 4
查看完整版本: 再说 Solaris Containers