SmartOS的系统服务体系

SmartOS以及类illumos的OS,其服务体系采用的SMF机制,是一个具有依赖关系的服务网络。理解这些后台服务,需要从它们之间的依赖关系开始着手,通过查看Manifest定义文件,理解它们,以及试图尝试解决它们的问题。

前言

为什么要理解一个服务器OS的系统服务体系?

因为作为一个服务器OS,实际上与管理员与用户有关系的,能感受到的,主要就是这些跑在后台的服务。

打个比方,手机OS不刷不死心人,整天关心的就是后台都跑了多少服务,应该怎么杀。那么对比服务器OS折腾星人,不了解后台到底都是跑的些啥,显然不专业。(当然就不要想着杀了,会杀出问题来。)

所以,想要显摆自己有多精通一个服务器OS,不入门到精通这些后台服务是不行的。

SMF框架

SmartOS继承了illumos的衣钵,系统服务组织上,采用了一种叫做SMF的先进框架。因此我们要先理解什么是SMF?

从维基百科上可以找到SMF的页面,摘录并翻译如下

Service Management Facility (SMF)是Solaris操作系统引入的一项功能,它能创建可维护的,统一的服务与服务管理模型,它取代了init.d。

看到这里我相信大家都有一个呼声:

能不能说人话?

好吧说人话。

直白的说就是Solaris的那帮开发者(现在是illumos的开发者)看unix/linux的init.d十分不爽,就另行开发了一个系统取代之。这个系统称之为SMF,这个系统将解决一些在*nix系统服务里面积累多年的问题。

*nix系统服务到底有啥问题?

老实说,这不是一个很容易让人意识到其重要性的问题。因为大部分用户一辈子,需要处理这东西几率不高。

但是做为一个系统管理员是不可以不理会它的。

Unix系统,以及大部分的linux系统,使用的系统服务框架为init。简单的总结,init是*nix系统在内核启动之后,所启动的第一个应用程序,由它再来负责启动之后的所有的应用程序与服务。所以init做为一个程序,它的运作模式就定义了系统服务框架的机制。

形象的说,*nix系统的启动是这样的

  • 当按下机箱上电源键之后,机器会傻傻的直接执行储存在主板上的应用程序(即BIOS);
  • BIOS一根筋的检测完硬件之后,去启动主硬盘的引导区的那个引导程序。现在应用的最广泛的引导程序叫做grub(除开MacOS和Windows外);
  • grub会做一些初始化文件系统的脏活儿,读取一个配置文件,去启动真正想要的内核;
  • 内核在这个时候被载入内存启动了。跟前面步骤的那些应用程序执行完了就把自己杀掉不同,内核不会杀掉自己。它会把你的机器硬件弄成可以共享的形式,欢迎后面的应用程序来共享使用;
  • 然后内核就不直接过问具体的凡间事物(或者说user land),它会启动一个新的应用程序,来负责启动其他的应用程序。

最后那个应用程序就是init。

作为所有后面应用程序的入口,大家应该都意识到了,这是流量的入口啊,怎么管理好这个入口有大学问。比如怎么雁过拔毛,收收买路钱,甚至强迫别人内置几个广告的事情,这事情大家应该都心里有数,我明白的。

但是init是70年代就诞生的,那时候人心还挺淳朴,所以init也特别的头脑简单。

init定下了如下的规则

所有需要让我启动的程序,排成不同运行等级(run level)的队伍,按照队伍级别高低和名字顺序,一个一个来

有入口的地方就有江湖,谁先谁后怎么插队一直是人民群众特别关心的问题。在init的简单规则下,想插队,只能调高自己的等级,或者改个能排在前面的名字。

显然这一套能运作30多年就是个奇迹。

想一想,这一套至少会有这些问题

  • 等级划分太简单。*nix一般就6个运行等级,其中level 0和6有特殊含义,level 4被保留了。能用就1,3和5。特权阶级和非特权阶级通通挤在一起,有啥事儿不能听领导的再行动(即依赖关系)。
  • 一个一个来,那万一有人耍赖怎么办?比如网络方面的服务只要排在tcp/ip相关的服务后面即可以,但是文件系统排在更前面,它要是出点问题还要影响网络这边的事儿。
  • 都是用root来执行的。这个对一些关键服务还可以说,但是什么打印机啊之类的有必要么?人家黑了你打印机服务就顺带端掉了整个系统。
  • init启动过一次就不管了,之后这些服务就自生自灭,这可不好,至少得有个自动重启什么的增值服务吧。

回到SMF

SMF的发明者将*nix的问题总结了一下,创造了SMF这个init的替代者,它有如下特点:

  • 引入依赖关系。一个服务可以依赖另几个服务,满足不了条件就不起动或者暂停。
  • 引入权限控制。打印机服务这种让linus都抓狂的服务,就让它在低权限跑去吧。
  • 引入守护机制。死了帮你重启,重启不成就帮你暂停,以及暂停其他所有依赖这个服务。
  • 用基于xml的配置文件,取代了简单的使用init.rc*文件夹以及文件名来组织各个服务。这个不用解释,因为init的那一套只能说是太原始了。

扯这么多概念,整点实用的行不行?

行。

先来三板斧

查看系统当前运行的服务

输入svcs.


$ svcs
STATE          STIME    FMRI
...
online         Sep_22   svc:/system/svc/restarter:default
online         Sep_22   svc:/system/filesystem/autofs:default
online         Sep_22   svc:/system/system-log:default
online         Sep_22   svc:/network/smtp:sendmail
online         Sep_22   svc:/system/filesystem/local:default
online         Sep_22   svc:/network/ssh:default
online         Sep_22   svc:/system/dumpadm:default
online         Sep_22   svc:/network/loopback:default

类似这样的结果,主要也就是看个状态,online/offline/maintenance三种,看字面也知道除了online,多半都是不太好的结果,需要果断进行处理。

常用的处理的方式有

  • svcadm disable 禁用
  • svcadm enable 启用

查看有问题服务的日志文件

具体某个服务的日志文件,一般是位于/var/svc/log/.log里面。

例如svc:/system/filesystem/autofs:default的日志文件就在/var/svc/log/svc:/system/filesystem/autofs:default.log

出现什么问题的服务,多看看日志文件,才能定位问题。

查看服务的依赖与被依赖关系

既然存在依赖关系,那么查询出来总会对定位解决问题有好处,这方面的命令常用的有

  • svcs -d 查询服务依赖的所有服务
  • svcs -D 查询依赖服务的所有服务

举个例子


$ svcs -d milestone/multi-user
STATE          STIME    FMRI
disabled       Sep_22   svc:/network/smtp:sendmail
online         Sep_22   svc:/milestone/name-services:default
online         Sep_22   svc:/milestone/single-user:default
online         Sep_22   svc:/system/filesystem/local:default
online         Sep_22   svc:/network/rpc/bind:default
online         Sep_22   svc:/milestone/sysconfig:default
online         Sep_22   svc:/system/utmp:default
online         Sep_22   svc:/network/inetd:default
online         Sep_22   svc:/network/nfs/client:default
online         Sep_22   svc:/system/system-log:default

顺藤摸瓜去查找服务以及所有依赖的服务的问题,就是系统管理员通常要做的事情。

理解SmartOS的服务体系

明白了SmartOS所用的服务系统的机制,接下来就是具体的看看这个服务体系到底是怎样的。

实际上,在SMF的支撑下,SmartOS的服务体系发展的异常的强大。支持系统的,不再是一些独立的互不相干的服务,而是一张服务的网。

SmartOS的服务体系

上图即展现了这张网。实际上,它是截图自这个工具。它是一个互动的工具,可以用来形象的展现DogeOS的系统服务网络。

例如要查询一下svc:/milestone/single-user:default这个服务所依赖的全部服务,只需要在左边的下拉框里面找到这个FMRI就可以了。一目了然,我们就可以知道要保证其成功,需要一些什么样的服务作为先导。

实际上,所有带有milestone关键字的服务,是一种特殊的服务。它们实际上模拟了init系统里面的level的概念。在这个对应关系里,svc:/milestone/single-user:default就相当于init的level 1,是单用户模式,而svc:/milestone/multi-user:default就相当于init的level 3,是多用户模式。

还有一个问题

一个服务具体是如何定义的呢?

它实际上是由一个叫做SMF manifest的XML文件来定义的。这些文件主要位于/etc/svc/manifest目录中。这个目录中又按照不同的类别分成了若干个子目录。例如svc:/milestone/single-user:default实际上就位于milestone子目录中。透过名字上的联系,相信也很容易猜测到组织这些文件的一些习惯。

找到了定义服务的XML文件,再来解读它,就变得容易了。关于Manifest的具体怎么写,如何读懂它,可以参考这个规范。

Manifest通常会定义一些start/stop/restart的命令,其内容又通常会指向一个shell脚本,顺着这条线,我们就不难搞清楚这个服务到底做了一些什么事情。

总结

SmartOS以及类illumos的OS,其服务体系采用的SMF机制,是一个具有依赖关系的服务网络。理解这些后台服务,需要从它们之间的依赖关系开始着手,通过查看Manifest定义文件,理解它们,以及试图尝试解决它们的问题。

转自DogeOS/SmartOS的系统服务体系

SmartOS Diskless Booting与SMF

SmartOS 的diskless booting的架构是它的重要的特性之一,也是我们了解一个操作系统很好的切入点,我这里我们就通过介绍SmartOS的这个特性,以及SmartOS的启动过程来看它是如何实现的?以及SMF在这个启动过程中扮演了什么角色?

前言

SmartOS 的diskless booting的架构是它的重要的特性之一,也是我们了解一个操作系统很好的切入点,我这里我们就通过介绍SmartOS的这个特性,以及SmartOS的启动过程来看它是如何实现的?以及SMF在这个启动过程中扮演了什么角色?下面我们来一一介绍。

SmartOS Diskless Booting

SmartOS Diskless Booting实际上是将它的操作系统,安装在了ramdisk上(也就是内存中), 然后直接通过USB/CD/PXE来启动它,那这么做的好处是什么?

  • 系统更新简单: 每次重启即可。
  • 增加了磁盘的空间: 操作系统本身不占用磁盘空间, 某中程度上也增加了磁盘的性能。
  • 增加了安全性:大部分的系统文件是只读的,/root/etc目录每次重启都重置,/usr目录也是只读, 无法添加用户。对SMF服务的修改也是每次都重置。
  • 系统稳定性提高: 不会出现操作系统在磁盘,而磁盘坏掉导致整个OS无法启动。

那么SmartOS的global zone上哪些目录是可写的?


Filesystem             Size   Used  Available Capacity  Mounted on
zones                  2.0T   143M   1.8T     1%    /zones
zones/var              2.0T   4.0G   1.8T     1%    /var
zones/opt              2.0T    55K   1.8T     1%    /opt
zones/usbkey           2.0T   154K   1.8T     1%    /usbkey
/usbkey/shadow         1.8T   154K   1.8T     1%    /etc/shadow
/usbkey/ssh            1.8T   154K   1.8T     1%    /etc/ssh

这里列出的目录为可写, zones是使用了所有磁盘的一个大zpool, SmartOS会在启动的时候创建一些文件系统挂载上去。

SmartOS 启动过程

我们从按下机箱电源按钮说起, 看下图会比较清楚:

smartos 启动过程

  • 当按下机箱上电源键之后,机器会直接执行储存在主板上的BIOS应用程序;
  • BIOS检测完硬件之后,去启动主硬盘的引导区的那个引导程序。现在应用的最广泛的引导程序叫做GRUB;
  • GRUB会做一些初始化文件系统的活儿,读取一个配置文件(menu.lst),去启动真正想要的内核(platform/i86pc/kernel/amd64/unix)boot archive(platform/i86pc/amd64/boot_archive文件);
  • 内核在这个时候被载入内存启动了。跟前面步骤的那些应用程序执行完了就把自己杀掉不同,内核不会杀掉自己。它会把你的机器硬件弄成可以共享的形式,后面的应用程序来共享使用;
  • 然后内核会启动一个新的应用程序(/sbin/init, pid=1),来负责启动其他的应用程序。

接着看下图:

smartos smf 服务管理

  • init服务会启动svc.startd这个进程,用来启动和停止所有的SMF服务。

到这里Kernerl和boot_archive都已经加载, startd服务启动,我们看下systemfile的挂载情况:


Filesystem             Size   Used  Available Capacity  Mounted on
ctfs                     0K     0K         0K     0%    /system/contract
proc                     0K     0K         0K     0%    /proc
mnttab                   0K     0K         0K     0%    /etc/mnttab
swap                    43G   984K        43G     1%    /etc/svc/volatile
objfs                    0K     0K         0K     0%    /system/object
bootfs                   0K     0K         0K     0%    /system/boot
sharefs                  0K     0K         0K     0%    /etc/dfs/sharetab

以上这些文件系统的挂载由kernel完成。根据细节服务要看illumos源码,比如restarter/boot-config/svc.configd服务等。

到了这里我们必须要说一下SmartOS的运行级别。

SmartOS Run level

SmartOS提供了8个run level,如下:


0         - system running PROM monitor (ok> prompt)
s or S    - single user mode with critical file-systems mounted.(single user can access the OS)
1         - single user administrative mode with access to all file-systems.(single user can access the OS)
2         - multi-user mode. Multiple users can access the system. NFS and some other network related daemons does not run
3         - multi-user-server mode. Multi user mode with NFS and all other network resources available.
4         - not implemented.
5         - transitional run level. Os is shutdown and system is powered off.
6         - transitional run level. Os is shutdown and system is rebooted to the default run level.

正常情况下启动SmartOS运行的runlevel是3, 即多用户共享模式。我们可以通过who命令来查看当前的runlevel:


$ who -r
.       run-level 3  Jun 10 09:14     3      0  S 

当然你还可以通过init命令来切换当前的runlevel,比如你想切换到单用户模式: init s 即可。

对于传统的init服务的启动是按照不同的runlevel去执行对应的/etc/rc?.d/K* and /etc/rc?.d/S* 脚本, ?为运行级别, 这种方式在SmartOS中还是支持的,但主要为了兼容legacy的系统,并不推荐,目前使用的基于SMF的方式。那么是SMF是如何支持runlevel的?

实际上是通过category是milestone的smf来定义runlevel:


/etc/rcS.d => milestone/single-user:default #对应单用户模式
/etc/rc2.d => milestone/multi-user:default  #对应多用户
/etc/rc3.d => milestone/multi-user-server:default #对应多用户共享

在了解完SMF服务和runlevel的关系之后我们继续来看SmartOS的启动过程。从前面知道SmartOS默认启动在run level 3上,所以它会先运行完run level s和2的服务。下面我们先来分析run level s模式下smf服务的情况。

SmartOS 启动之: Run Level s

通过如下命令切换到run level s下面:


$ init s
$ svcs |grep milestone  #在run level s下面,启动了2个milestone服务
online          9:12:44 svc:/milestone/devices:default
online          9:14:17 svc:/milestone/single-user:default

这里提下/lib/svc/manifest/目录,这个目录中又按照不同的类别分成了若干个子目录, 定义主要的系统依赖的SMF服务。系统启动的时候startd服务会自动的根据依赖去加载这个目录中的SMF服务。

从这里我们看到milestone/devices服务是最先启动的,看看它依赖了什么服务。


svc:/milestone/devices
  svc:/system/device/local
    svc:/network/datalink-management #网络相关先放一边
  svc:/system/filesystem/usr
    svc:/system/boot-archive
        svc:/system/filesystem/root
            svc:/system/device/mpxio-upgrade #这个IO multipath的依赖是optional的
    svc:/system/scheduler
        svc:/system/filesystem/root 

这里通过svcs -d命令整理出来了依赖关系,我们看到了它最终依赖于filesystem/root这个服务, 那这个服务在启动的时候干了什么事情?通过/lib/svc/manifest/system/filesystem/root-fs.xml文件的定义找到/lib/svc/method/fs-root运行脚本,关键代码:


/sbin/mount -F ufs -o remount,rw,nologging /devices/ramdisk:a /
/usr/sbin/lofiadm -X -a /usr.lgz
/sbin/mount -F ufs -o ro /devices/pseudo/lofi\@0:1 /usr
#
# Update kernel driver.conf cache with any additional driver.conf
# files found on /usr, and device permissions from /etc/minor_perm.
#
/usr/sbin/devfsadm -I -P
libc_mount

实际上是将ramdisk上的文件系统mount到/, 通过lofiadm将usr.lgz文件(可执行文件和lib)做成块设备mount到/usr目录(read-only),最好将libc的标准库mount上来, 结果如下:


Filesystem             Size   Used  Available Capacity  Mounted on
/devices/ramdisk:a     262M   240M        22M    92%    /
/devices/pseudo/lofi@0:1
                       432M   377M        56M    88%    /usr
/usr/lib/libc/libc_hwcap1.so.1
                       432M   377M        56M    88%    /lib/libc.so.1
ctfs                     0K     0K         0K     0%    /system/contract
proc                     0K     0K         0K     0%    /proc
mnttab                   0K     0K         0K     0%    /etc/mnttab
swap                    43G   984K        43G     1%    /etc/svc/volatile
objfs                    0K     0K         0K     0%    /system/object
bootfs                   0K     0K         0K     0%    /system/boot
sharefs                  0K     0K         0K     0%    /etc/dfs/sharetab

接着我们往上追踪,找到_system/boot-archive_服务,/lib/svc/manifest/system/boot-archive.xml对应脚本/lib/svc/method/boot-archive看关键代码:


/sbin/bootadm update-archive -vnC 2> /dev/null 

这里只是更新了一下boot_archive, 我们接着看_filesystem/usr_服务/lib/svc/manifest/system/filesystem/usr-fs.xml 脚本/lib/svc/method/fs-usr, 关键代码:


mount /dev/fd
if smf_is_globalzone; then
    # svc.startd makes a backup of the repo on boot.  Since this is a
    # live-image, the backup takes up an unnecessary 4MB in memory, so remove
    # it now.
    rm -f /etc/svc/repository-*
fi

文件系统fd挂载到/dev/fd, 并在内存删除不必要的备份。 到这里_milestone/devices_服务启动完成, 看看系统中mount了什么:


Filesystem             Size   Used  Available Capacity  Mounted on
/devices/ramdisk:a     262M   240M        22M    92%    /
/devices/pseudo/lofi@0:1
                       432M   377M        56M    88%    /usr
/usr/lib/libc/libc_hwcap1.so.1
                       432M   377M        56M    88%    /lib/libc.so.1
fd                       0K     0K         0K     0%    /dev/fd # *** 新增加 ***
ctfs                     0K     0K         0K     0%    /system/contract
proc                     0K     0K         0K     0%    /proc
mnttab                   0K     0K         0K     0%    /etc/mnttab
swap                    43G   984K        43G     1%    /etc/svc/volatile
objfs                    0K     0K         0K     0%    /system/object
bootfs                   0K     0K         0K     0%    /system/boot
sharefs                  0K     0K         0K     0%    /etc/dfs/sharetab

接着看_milestone/single-user_服务,同样先整理下它的依赖关系:


$ svcs -d milestone/single-user:default #查看single-user服务的依赖, 实际上single-user也依赖devices服务
    online         Jun_10   svc:/system/cryptosvc:default
    online         Jun_10   svc:/network/loopback:default
    online         Jun_10   svc:/milestone/devices:default
    online         Jun_10   svc:/system/keymap:default
    online         Jun_10   svc:/system/filesystem/minimal:default
    online         Jun_10   svc:/system/sysevent:default
    online         Jun_10   svc:/system/manifest-import:default
    online         Jun_10   svc:/system/identity:node
    online         Jun_10   svc:/milestone/network:default

这里single-user服务的依赖非常深,这里就只看system相关的文件系统的服务,这样看的会清楚些,先看filesystem/minimal的依赖:


svc:/system/filesystem/minimal
  svc:/system/device/local       # 服务以启动完成
    svc:/network/datalink-management
  svc:/system/filesystem/usr     # 服务以启动完成
    svc:/system/boot-archive
    svc:/system/scheduler
  svc:/system/filesystem/smartdc  # 未完成
    svc:/system/filesystem/usr
      svc:/system/boot-archive
      svc:/system/scheduler 

从依赖来看,先分析_filesystem/smartdc_服务/lib/svc/manifest/system/filesystem/joyent-fs.xml找到脚本/lib/svc/method/fs-joyent,这里代码很多就不具体贴出来了,主要做了如下事情:

1、通过/usr/sbin/devfsadm -c disk命令创建/devices目录下所有磁盘设备文件并链接到/dev目录, 到这一步看看文件系统的挂载情况, 发现所有的磁盘设备都找到并挂载好了。


 Filesystem             Size   Used  Available Capacity  Mounted on
/devices/ramdisk:a     262M   240M        22M    92%    /
/devices/pseudo/lofi@0:1
                       432M   377M        56M    88%    /usr
/usr/lib/libc/libc_hwcap1.so.1
                       432M   377M        56M    88%    /lib/libc.so.1
fd                       0K     0K         0K     0%    /dev/fd
/devices                 0K     0K         0K     0%    /devices
/dev                     0K     0K         0K     0%    /dev

2、根据启动参数noimport看是否需要挂载zones pool的文件系统,如果需要则挂载如下设备:


Filesystem             Size   Used  Available Capacity  Mounted on
zones                  5.2T   524K       4.3T     1%    /zones
zones/cores/global      10G    19K        10G     1%    /zones/global/cores
zones/var              5.2T   5.9G       4.3T     1%    /var
zones/config           5.2T    66K       4.3T     1%    /etc/zones
zones/opt              5.2T    19G       4.3T     1%    /opt
zones/usbkey           5.2T   120K       4.3T     1%    /usbkey
/usbkey/shadow         4.3T   120K       4.3T     1%    /etc/shadow
/usbkey/ssh            4.3T   120K       4.3T     1%    /etc/ssh
swap                    44G    12K        44G     1%    /tmp
swap                    44G    12K        44G     1%    /var/run

下面我们分析_filesystem/minimal_服务,通过/lib/svc/manifest/system/filesystem/minimal-fs.mxl我们看到,这个服务什么都没做只是定义了依赖。到这里run level s就启动完成所有服务启动,看看目前文件系统状态:

SmartOS 启动之: Run Level 2

从上面run level 1来看,基本的OS服务已经都启动了,在run level 2上启动的主要服务如下:


$ init 2
$ svcs |grep milestone
online          9:12:44 svc:/milestone/devices:default
online          9:14:17 svc:/milestone/single-user:default
online          9:12:43 svc:/milestone/name-services:default # 新增
online          9:12:43 svc:/milestone/name-services:default # 新增
online          9:14:38 svc:/milestone/multi-user:default # 新增

这里我们照葫芦画瓢同样通过svcs -d 来查看服务依赖然后去看对应脚本就可以。

SmartOS 启动之: Run Level 3

最后到run level 3的服务如下:


$ init 3
$ svcs |grep milestone
online          9:12:44 svc:/milestone/devices:default
online          9:14:17 svc:/milestone/single-user:default
online          9:12:43 svc:/milestone/name-services:default
online          9:12:43 svc:/milestone/name-services:default
online          9:14:38 svc:/milestone/multi-user:default 
online          9:14:38 svc:/milestone/multi-user-server:default # 新增

这里就简单写下了,实在太长了,因为我没办法写短 🙂

SMF在SmartOS中扮演的重要角色

从上面对SmartOS的启动分析中我们可以看到,smf在其中的重要作用, 总结下SMF的提供的特性:

  • 引入依赖关系。一个服务可以依赖另几个服务,满足不了条件就不起动或者暂停。
  • 引入权限控制。打印机服务这种让linus都抓狂的服务,就让它在低权限跑去吧。
  • 引入守护机制。死了帮你重启,重启不成就帮你暂停,以及暂停其他所有依赖这个服务。
  • 用基于xml的配置文件,取代了简单的使用init.rc*文件夹以及文件名来组织各个服务。这个不用解释,因为init的那一套只能说是太原始了。

以上4点总结引用自李宇的blog, 他总结的非常好!最后想象下有了SMF这个东西,我们要定制一个基于Illumos内核的OS就不再像看起来那么的遥不可及,定义好run level和自己的服务依赖,专注在服务实现,把整个kernerl打包进去,build出ISO/USB/PXE的镜像。

转自SmartOS Diskless Booting与SMF

smartos教程四:安装SmartOS

Smartos是一个开源的Unix系列操作系统,从Solaris10分支出来,由Joyent公司开发。Smartos拥有非常强大而简便的虚拟化功能,非常适合用来做云计算。这篇文章我们就介绍一下怎么安装SmartOS。

前言

Smartos是一个开源的Unix系列操作系统,从Solaris10分支出来,由Joyent公司开发。Smartos拥有非常强大而简便的虚拟化功能,非常适合用来做云计算。这篇文章我们就介绍一下怎么安装SmartOS。

制作启动盘

因为SmartsOS启动的时候会将整个操作系统读取到内存,启动完毕后不在从启动盘读取文件,因此我们可以使用U盘、SD卡等移动存储设备制作启动盘。

现在我以Linux下将SmartOS安装到U盘为例进行讲解,其他操作系统可以参考官方文档:https://wiki.smartos.org/display/DOC/Creating+a+SmartOS+Bootable+USB+Key

首先去官网下载想要安装的版本。

下载地址:https://wiki.smartos.org/display/DOC/Download+SmartOS

下载完毕后解压

cd /tmp
wget https://us-east.manta.joyent.com/Joyent_Dev/public/SmartOS/smartos-latest-USB.img.bz2
tar xvjpf smartos-latest-USB.img.bz2

将U盘插入,查找U盘的设备路径,我的U盘路径为/dev/sdb

$ sudo fdisk -l
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7ecb51e2

Device Boot Start End Blocks Id System
/dev/sda1 * 1 52 409600 27 Unknown
Partition 1 does not end on cylinder boundary.
/dev/sda2 52 18959 151870464 7 HPFS/NTFS
/dev/sda3 18959 30432 92158977 f W95 Ext'd (LBA)
/dev/sda4 30432 60802 243944472 7 HPFS/NTFS
/dev/sda5 18959 30432 92158976 83 Linux

Disk /dev/sdb: 7958 MB, 7958691840 bytes
255 heads, 63 sectors/track, 967 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/sdb1 1 243 1951866 c W95 FAT32 (LBA)

将镜像刷到U盘中

cd /tmp
sudo dd if=smartos-latest-USB.img of=/dev/sdb bs=1024

设置分区激活状态

$ sudo fdisk /dev/sdb

Command (m for help): p

255 heads, 63 sectors/track, 967 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/sdb1 1 243 1951866 c W95 FAT32 (LBA)

Command (m for help): a
Partition number (1-4): 1

Command (m for help): p

255 heads, 63 sectors/track, 967 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/sdb1 * 1 243 1951866 c W95 FAT32 (LBA)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

安装与启动系统

将制作好的U盘插入物理机,并且让物理机通过U盘启动,从默认的GRUB选项就能进入安装界面了。

安装界面是命令行交互的界面,根据提示依次配置好主网卡、IP、网关、磁盘冗余级别、时间服务器、密码即可,没有什么复杂的配置。

配置完后需要重新启动,现在只能通过U盘来启动,依然从默认的GRUB选项进入,这时候操作系统会去检查写入磁盘的文件,发现已经安装了系统,就不会再次安装了,而是读取文件进行配置,然后进入系统。

smartos教程三:smartos虚拟化技术

SmarOS 是基于 Illumos 核心,之后大牛们还将KVM移植了进去。严格来说,SmartOS 并非Solaris,但也保留了一些Solaris的特性。Illumos 提供了一个通用内核和一些基础的系统工具。基于 illumos 的发行版软件都有一些很赞的体验.

前言

严格来说,SmartOS 并非Solaris,但也保留了一些Solaris的特性。所以说 SmartOS 和 Linux 是有一定区别的,这个学习需要一点时间,但是值得你去付出,因为 SmartOS 中很多杀手级特性都是 Linux 不具备的。

SmarOS 是基于 Illumos 核心(注:第一个字母是i,后面两个才是l),之后大牛们还将KVM移植了进去。而 Illumos 基于 OpenSolaris 项目的(已不复存在)。实际上,Oracle 收购 Sun 后,对 OpenSolaris 态度很冷淡,毫无兴趣,并关闭源码。大多数Sun最优秀的工程师转投入 Illumos 旗下。现在他们大多数都在 Joyent 和 Nexenta。具体的故事我就不详述了,有兴趣的可以看看这两篇文章:

Illumos

illumos

Illumos 提供了一个通用内核和一些基础的系统工具。基于 illumos 的发行版软件都有一些很赞的体验,这里提几个让人印象深刻,最具创新的distributions(参考链接):

  • OpenIndiana 那些有 Solaris 或 OpenSolarisis 背景的人可能比较熟悉这个东东。OpenIndiana 项目的目标是继续开发和发行 OpenSolaris。该项目隶属于 Illumos 基金会。由于 Oracle 宣布不再发行 OpenSolaris ,该项目被建立以为 OpenSolaris 继续其更新。
  • Nexenta CP 即Nexenta Community Platform,现在成为 Illumos 旗下的一款产品,改名叫 illumian 了,何去何从可以参考此链接。现在只能看到 NexentaStor 了,它是Nexenta 公司推出的基于 OpenSolaris OS 和 ZFS 等技术的一个 NAS 软件解决方案。如果你熟悉 Linux,尤其是 Debian 或 Ubuntu,那就会很快上手。ZFS文件系统(Zettabyte File System)是 NexentaStor 的亮点,它是一种基于 Solaris 的128位的文件系统,强健可靠、可伸缩、易于管理,突出了对数据完整性的保护。我之后还会专门写文章介绍 ZFS,不过网上也已经有很多类似的文章了。
  • SmartOS 是由 Joyent 提供的 community distro,可以认为是 SmartDataCenter 商业化产品的一部分。这次就要专门谈谈它及其独特的虚拟化技术。

其实illumos还出了一些很好的书,这些书现在网上都有电子版,链接是:http://illumos.org/books/ 。

SmartOS云平台

Joyent SmartOS与SmartMachine、SmartDataCenter以及物理机紧密集成,在各个层面保证云平台的安全性。与其他的云平台不同,SmartOS云平台的虚拟资源驻留在SmartOS中,而不是在虚拟机本身。这种包容性的虚拟化架构避免了Web应用层和操作系统之间接口的潜在漏洞。在网络层,Joyent的SmartDataCenter支持动态的虚拟局域网(vLAN),使客户在任何时候都可以有效隔离云平台上的不同用户。Joyent的安全保障架构图如下所示:

smartos安全保证

SmartOS简单可以解释为:“illumos-derived OS that is the foundation of both Joyentʼs public cloud and SmartDataCenter product”。 既然作为是illumos的衍生产品,那么它具备以下几个关键特性:

  • ZFS —— 企业级的写时复制(copy-on-write)文件系统,可提供诸如constant time snapshots,writable clones,built-in compression,checksumming,volume management 等众多功能。
  • DTrace: 用来在生产和试验性生产系统上找出系统瓶颈的工具,可以以对核心(kernel)和应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险。支持原位(in situ)的数据聚合,用户级评估测量等。
  • 基于操作系统的虚拟化(Zones):完整的安全的虚拟操作系统实例,提供给多租户硬件级的性能。网络虚拟化(Crossbow):虚拟NIC架构,方便对网络带宽管理和资源控制。这里有论文链接。
  • KVM:Joyent技术专家已经将KVM移植到SmartOS中,支持硬件虚拟化,并加强了以上四项特性,具体可以参见此链接

 

smartos教程二:与 Linux 不同点总结

在SmartOS用户中最常见的问题之一就是,既然说SmartOS和Linux类似,那除了那些看不见的技术细节,在使用时到底有什么不同呢?如果已经熟练操作Linux,那SmartOS能快速上手么?答案是当然能,其实常用的不同之处并不多。这篇文章将回答Linux与SmartOS在操作上的不同之处。

在SmartOS用户中最常见的问题之一就是,既然说SmartOS和Linux类似,那除了那些看不见的技术细节,在使用时到底有什么不同呢?如果已经熟练操作Linux,那SmartOS能快速上手么?答案是当然能,其实常用的不同之处并不多。这篇文章将回答Linux与SmartOS在操作上的不同之处。

SmartMachine和其他类Unix系统不同之处主要在于两类:

  • 命令类似,但在SmartOS中用不同的名字
  • 完成类似的任务,但在SmartOS中有不同的实现过程

这里列出一个命令列表,用来帮助Linux用户找到在SmartOS中与Linux对等的命令。

  • Linux 和 SmartOS 命令对比列表
  • 不同使用语境(Use Context)的例子
    • 检查进程和内存
    • 启动和停止服务

Linux and SmartOS 命令对比列表

任务 / 操作系统LinuxSmartOSSmartOS Virtual Instance (zone)
表中缩写代表的含义
table key
(rh) = Red Hat, Mandrake, SUSE,...
(deb) = Debian, Libranet,...
(fed) = Fedora
(gen) = Gentoo
(md) = Mandrake/Mandriva
(SUSE) = SUSE
Joyent SmartOS

开源版本可访问以下链接http://smartos.org
Joyent SmartOS zone
管理用户
managing users
useradd
usermod
userdel
adduser
chage
getent
useradd
userdel
usermod
getent
logins
groupadd
useradd
userdel
usermod
getent
logins
groupadd
列举硬件配置信息
list hardware configuration
arch
uname
dmesg (if you're lucky)
cat /var/log/dmesg
/proc/*
lshw
dmidecode
lspci
lspnp
lsscsi
lsusb
lsmod
(SUSE) hwinfo
/sys/devices/*
arch
prtconf [-v]
prtpicl [-v]
uname
psrinfo [-v]
isainfo [-v]
dmesg
iostat -En
cfgadm -l
/etc/path_to_inst
arch
uname
psrinfo [-v]
isainfo [-v]
dmesg
iostat -En
读取磁盘命名
read a disk label
fdisk -lfdisk
prtvtoc
命名磁盘
label a disk
cfdisk
fdisk
e2label
format
prtvtoc
fdisk
磁盘分区
partition a disk
parted (if you have it)
cfdisk
fdisk
pdisk (on a Mac)
(deb) mac-fdisk (on a Mac)_
(md) _diskdrake
format
fmthard
rmformat
内核文件
kernel
/boot/vmlinuz*
/boot/bootlx
(see /etc/lilo.conf or /boot/grub/menu.lst)
/kernel/genunix
/platform/`uname -m`/
kernel/unix
kernel modules are in /kernel, /usr/kernel, and /platform/`uname -m`/kernel
Kernel module files not visible within a zone
显示/配置内核参数
show/set kernel parameters
/proc/*
/proc/sys/*
sysctl
/etc/sysctl.conf
sysdef
getconf
cat /etc/system
ndd
mdb -k[w]
sysdef
getconf
ndd
显示已加载的内核模块
loaded kernel modules
lsmodmodinfomodinfo
加载内核模块
load module
modprobe
insmod
modload
add_drv
devfsadm
卸载内核模块
unload module
rmmod
modprobe -r
modunload
启动脚本
startup scripts
/etc/rc* (but may vary)
/etc/init.d/
SMF(5)
/etc/rc*
/etc/init.d/
svcadm
svcs
SMF(5)
/etc/rc*
/etc/init.d
svcadm
svcs
启动/停止/配置服务
start/ stop/ config services
(rh) _service
(rh) _chkconfig
(deb) _sysv-rc-conf
svcs
svcadm
svccfg
svcs
svcadm
svccfg
关机
shutdown (& power off if possible)
shutdown -Ph now
shutdown -y -g0 -i0
halt
poweroff
shutdown -y -g0 -i5
halt
shutdown -y -g0 -i5
halt
run levels
*=normal states
更多细节参考
www.phildev.net/runlevels.html
(set in /etc/inittab)
0: halt
s,S,1: vendor-dependent
1: single-user
2-5*: multiuser
6: reboot
0: firmware monitor
s,S: single-user
1: sys admin
2: multiuser
3*: share NFS
4*: user-defined
5: power-down if possible
6: reboot
s,S: single-user
1: sys admin
2: multiuser
3*: share NFS
4*: user-defined
5: power-down if possible
6: reboot
show runlevel/sbin/runlevelwho -rwho -r
时区信息
time zone info
/usr/share/zoneinfo/
/etc/localtime
/usr/share/lib/zoneinfo//usr/share/lib/zoneinfo
检查交换分区
check swap space
swapon -s
cat /proc/meminfo
cat /proc/swaps
free
swap -s[h]
swap -l[h]
Note: in a zone, swap is virtual
memory size
swap -s[h]
swap -l[h]
bind process to CPUtaskset (sched-utils)pbind
psrset
pbind
psrset
终止进程
killing processes
kill
killall
kill
pkill
killall <- tries to kill everything, DO NOT USE THIS
kill
pkill
killall <- tries to kill everything, DO NOT USE THIS
显示CPU信息
show CPU info
cat /proc/cpuinfo
lscpu
psrinfo -pvpsrinfo -pv
内存信息
memory
freememprtconf | head
zonememstat
prtconf | head
zonememstat
默认文件系统
"normal" filesystem
ext2
ext3
ReiserFS
zfszfs
开机自动挂载分区配置
file system
description
/etc/fstab/etc/vfstab/etc/vfstab
创建文件系统
create filesystem
mke2fs
mkreiserfs
mkdosfs
mkfs
zfs
zpool
zfs (if zone has delegated dataset)
文件系统调试和恢复
file system debugging and recovery
fsck
debugfs
e2undel
zdb
创建非空文件
create non-0-length empty file
dd if=/dev/zero of=filename
bs=1024k count=desired
mkfilemkfile
创建/挂载ISO镜像
create/mount ISO image
mkisofs
mount -o loop pathToIso
mountPoint
mkisofs;DEVICE=`lofiadm -a /absolute_pathname/image.iso` ; mount -F hsfs -o ro
$DEVICE
ACL配置
ACL management
getfacl
setfacl
getfacl
setfacl
getfacl
setfacl
NFS share definitions/etc/exports/etc/dfs/dfstab
dfshares
NFS share command/etc/init.d/nfs-server reload_(rh)__ _exportfs -ashare
shareall
NFS informationcat /proc/mountsshowmount
nfsstat
nfsstat
name resolution order/etc/nsswitch.conf
/etc/resolv.conf
/etc/nsswitch.conf
getent
/etc/nsswitch.conf
getent
显示网络接口信息
show network interface info
ifconfig
ethtool
dladm
ndd
ifconfig -a
netstat -in
dladm
ndd
ifconfig -a
netstat -in
更改IP地址
change IP
Joyent Public Cloud IP addresses are set in the Cloud Management Portal.
ifconfig
ping one packetping -c 1 hostnameping hostname packetsize 1ping hostname packetsize 1
监听网络
sniff network
etherfind
tcpdump
wireshark (formerly _ethereal)
etherape
snoopsnoop
tcpdump available from pkgin
route definitionsroute
(rh) /etc/sysconfig/network
(rh) /etc/sysconfig/static-routes
(deb) /etc/init.d/network
(deb) /etc/network
/etc/defaultrouter
/etc/notrouter
/etc/gateways
in.routed
netstat -r
route add
/etc/defaultrouter
/etc/notrouter
/etc/gateways
in.routed
netstat -r
route add
telnetd, ftpd banner/etc/issue.net (telnet)
(ftp varies; can use tcp wrappers)
Use nc insteadUse nc instead
配置日期/时间
set date/time
(from net: ntp or other)
ntpdate
rdate
netdate
ntpdate
rdate
ntpdate
rdate
auditingauditd
/var/log/faillog
audit
auditd
auditreduce
praudit
audit
auditd
auditreduce
praudit
用户密码保存位置
encrypted passwords in
/etc/shadow (may vary)/etc/shadow/etc/shadow
最小密码长度
min password length
/etc/pam.d/system-auth/etc/default/passwd/etc/default/passwd
允许/禁止root登陆
allow/deny root
logins
/etc/securetty/etc/default/login/etc/default/login
防火墙配置
firewall config
iptables
ipchains
ipfwadm
(rh) redhat-config-
securitylevel
/etc/ipf/ipf.conf/etc/ipf/ipf.conf
显示已安装的软件
show installed software
(rh) _rpm -a -i
(rh) _rpm -qa
(rh) yum list installed
(deb) dselect
(deb) aptitude
(deb) dpkg -l
(gen) _ls /var/db/pkg/*
(gen) _eix -I
pkgin list
pkgin avail <- list available installable software
安装软件
add software
(rh) _rpm -hiv
(rh) yum install pkg
(deb) dselect
(deb) _apt-get install _pkg
(deb) dpkg -i
pkgin install
precompiled binaries* of GPLware and freeware*www.linux.org
linux.tucows.com
sourceforge.net
rpmfind.net
(deb) ftp.debian.org
(deb) packages.debian.org
(gen) packages.gentoo.org
(gen) gentoo-portage.com;
(md) easyurpmi.zarb.org
www.sunfreeware.com
www.blastwave.org
http://pkgsrc.joyent.com/
pkgin
C编译器
C compiler
cc
gcc
gcc
[https://download.joyent.com/pub/build/SunStudio.tar.bz2]
gcc (may need to be installed via pkgin)
https://download.joyent.com/pub/build/SunStudio.tar.bz2
configure/show
runtime linking
ldconfig
ldd
readelf
lsmod
crle
ldd
elfdump
dump
pldd
modinfo
LD_PRELOAD
crle
ldd
elfdump
dump
readelf
pldd
modinfo
LD_PRELOAD
链接库路径
link library path
$LD_LIBRARY_PATH
/etc/ld.so.conf
$LD_LIBRARY_PATH$LD_LIBRARY_PATH
跟踪工具
tracing utility
strace
ltrace
dtrace
truss
sotruss
dtrace
truss
sotruss
define user defaults/etc/profile
/etc/security/
/etc/skel/
/etc/profile.d/*
/etc/default/login
/etc/profile
/etc/security/
/etc/default/login
/etc/profile
/etc/security/
csh global .login/etc/csh.login/etc/.login/etc/.login
default syslog and messages/var/log/syslog
/var/log/messages
/usr/adm/messages
/var/log/maillog
/var/adm/messages
/var/log/syslog
softpanorama.org/Logs/solaris_logs.shtml
/var/adm/messages
/var/log/syslog
系统错误报告工具
system error reporting tool
dmesg_(deb)_ reportbugfmadm
fmdump
prtdiag
fmadm
fmdump
性能检测
performance monitoring
vmstat
procinfo -D
top
htop
pstree
dtrace
prstat
sar
ostat
kstat
mpstat
netstat
nfsstat
vmstat
lockstat
plockstat
ptree
vfsstat
intrstat
dtrace
prstat
sar
ostat
kstat
mpstat
netstat
nfsstat
vmstat
plockstat
ptree
vfsstat
查看进程占用的文件和端口match process to file or portlsof
netstat -atup
fuser
pfiles
pfiles
fuser
lsof
zones/containerszoneadm
zonecfg
zlogin
zoneadm
zonename
虚拟工具
Virtualization
kvm/qemukvm/qemu (each instance in a kvm branded zone)
vmadm
imgadm
WikipediaLinuxSmartOS
Illumos
SmartOS
Illumos

smartos 和linux相同命令不同作用的例子

下面的例子是一些常用的命令,他们在linux与smartos中的作用不同

CommandWhat's different on a Smart Machine
dfOn most SmartOS image this is set up to use the GNU version. Use /usr/bin/df for the native version.
lsofSmartMachines use a different collection of tools to examine processes. See [Examining processes and memory|#procmem||||||||||||\||] later in this topic.
pingReturns whether a host responds or not.
Use ping -s to get a continuous response.
toptop is available in /opt/local/bin, but prstat -Z provides more zone aware (and more accurate) information than top.

Rosetta Stone for Unix 是一个有用的资源,可以帮你看看你经常使用的UNIX版本和其他的UNIX版本(包括Mac)有何不同,并如何对应。

检查进程和内存

在旧的SmartOS镜像中,这些命令提供了端口和相关资源的信息,使用root或sudo可运行它们。新的镜像使用的是 SmartMachine 工具包(Tools Package)

CommandDescriptionExample
pcpDisplays the ports used by a process, or the processes that use a port./root/bin/pcp -p 80 displays all the processes that use port 80.
/root/bin/pcp -P 28068 displays all the ports that process 28068 uses.
/root/bin/pcp -a displays port and process information for all ports.
jinfDisplays information about how your SmartMachine is using its resources./root/bin/jinf -c displays CPU usage information.
/root/bin/jinf -m displays memory usage information.
/root/bin/jinf -s displays swap usage information.

SmartOS 提供了一个工具套件来检查进程,可以在 proc 的 man page 中学习到更多内容。

ToolDescription
prstatThis tool displays the active processes like top does on Linux systems.
prstat -Z will provide you with a summary of your SmartMachine's status.
pgrepReturns a list of process IDs (PIDs) of processes that match a pattern or meet certain conditions.
pkillKills the processes that match a pattern or meet certain conditions.
pfilesReturns a list of all the open files that belong to a process.
pstackDisplays a stack trace of the specified process
ptreeDisplays a process tree for all processes or a given process
ls /procLists the process IDs of all running processes.

你可以将 pgrep 的结果和其他 proc 工具合并显示。比如,显示与 http 进程相关的所有文件,可以使用如下命令来替代 lsof:

$ sudo pfiles $(pgrep http)

若要限制 prstat 显示 http 进程,可以使用命令:

$ prstat $(pgrep -d , http)

注意:如果 prstat 显示改变了你的终端设置,可以使用 reset 命令返回到正常状态

对于 vmstat, mpstat 和 psrinfo 命令,主要显示物理机中处理器和内存的统计信息。这些输出一般来说对于SmartMachine的管理员才有用。

启动和停止服务

在其他系统中,你也许习惯使用命令在 /etc/init.d 来启动或停止服务。
SmartMachines 使用 Service Management Facility 来做到这些。

命令 svcs 和 svcadm 是你经常会使用到的。有些命令把 service identifier 叫做FMRI(Fault Management Resource Identifier)。
你可以使用 svcs 命令列举一个服务所有的 identifier 。

CommandDescription
svcsLists all the enabled services
svcs -aLists all of the services, even those that are disabled or off line
svcadm enable apacheEnable all of the processes with an apache FMRI
svcadm disable apacheDisable all of the processes with an apache FMRI
svcadm restart apacheRestart all of the processes with an apache FMRI

例如,如果你想更改 /etc/ssh/sshd_config 后重启SSH,可以这样做:

$ sudo svcadm restart ssh

向了解更多关于SMF的信息,可以打开这个网页

smartos教程一:smartos入门

SmartOS是一个开源的Unix系列操作系统,从Solaris10分支出来,由Joyent公司开发。SmartOS拥有非常强大而简便的虚拟化功能,非常适合用来做云计算。

概述

Smartos是一个开源的Unix系列操作系统,从Solaris10分支出来,由Joyent公司开发。Smartos拥有非常强大而简便的虚拟化功能,非常适合用来做云计算。

Smartos详细资料请参考:https://wiki.smartos.org/display/DOC/Home

SmartOS入门

为了方便理解接下来的安装配置过程,先介绍一些Smartos相关的入门知识。

SmartOS是驻内存的操作系统,它本身不在磁盘上保存任何操作系统运行相关的文件,只将配置、虚拟机等信息持久化到磁盘上。所以每次启动时,整个系统都会被全部加载到内存中运行。而根据加载源的不同,就有两种加载方式:

  1. USB启动。将操作系统写入到U盘中,并让服务器从本地U盘启动。
  2. PXE启动。将操作系统放到某个服务器中并提供PXE启动服务,其他的服务器就可以通过网络启动了。

因此,操作系统更新时,也从来不用打任何补丁,直接从最新版的系统重新启动即可。

zfs文件系统

SmartOS使用zfs作为本地的文件系统,而zfs本身并不是SmartOS独有的,其他Linux发行版也可以使用。zfs和其他的文件系统相比有诸多好处,这里就不一一陈述了,但是简单的介绍下zfs的结构。

存储池

zfs首先从物理磁盘开始构建存储池,叫做zpool,服务器的存储空间可以由一个或者多个zpool组成,每个zpool都是独立的存储空间。

zpool

disk:操作系统可以直接检测到物理磁盘,也可以检测到硬件raid虚拟化出来的磁盘,但是为了充分利用zfs的性能,应该将硬件raid设置成直连(HBA)模式,直接暴露所有物理磁盘。

array:将物理磁盘进行任意组合,可以生成一个或多个软件阵列,可以是mirrorraid等模式。一旦阵列生成,组成阵列的磁盘数量将不允许变更,只能对成员磁盘进行脱离、更换等工作。

zpool:将阵列进行任意的组合,可以生成一个或者多个zpoolzpool可以添加或者删除子阵列,zpool的存储空间就是所有阵列存储空间的叠加。

文件系统

有了zpool存储空间后,就可以构建文件系统了。

zpool

zfs文件系统以zpool为根,以树形结构进行层级划分和管理,但是文件系统的属性(比如预留空间、权限、配额)可以有继承和依赖关系。zfs文件系统和虚拟机里面的文件系统很像似,但是不一样,zfs文件系统的节点是一个设备,需要挂载到虚拟机文件系统的一个目录树节点上,而虚拟机文件系统中的节点就是目录或者文件。最简洁的判别方法就是zfs文件系统不以/开头。

SmartOS网络层次

Smartos作为虚拟化操作系统,必然要实现网络硬件的虚拟化,虚拟化的技术叫做Crossbow,这里只简单的介绍一下。smartos网络层次

physical nic:一台物理机上可以插多张物理网卡,每个网卡上可以有多个物理网口,每个物理网口都有一个全宇宙唯一的mac地址。

aggregation:聚合网口由多个物理网口聚合而成,一个物理网口只能加入一个聚合网口或者不聚合,聚合网口通过一个名称来进行标识,物理网口直接用mac进行标识。

virtual switch:虚拟交换机的名称在Smartos里叫做nic tag,每个虚拟交换机能且只能配置一个聚合网口或者物理网口,一个聚合网口或者物理网口可以属于任意多个虚拟交换机。

global zonevm:global zone就是物理机的根操作系统,但是应该理解成一个特殊的虚拟机。虚拟机通过给每个虚拟网卡指定nic tag来接入虚拟交换机,每台虚拟机都必须指定一个主要网卡作为默认路由。

硬件需求

Smartos对硬件有些需求,并不适用任意硬件,不过也没有太多苛刻的地方,这里简单概括下:

1.64-bit x86架构,推荐Intel的CPU,开启VT-x功能支持kvm虚拟化。

2.能够USB启动以及能够PXE启动,第一台机器只可能USB启动,之后的机器可以PXE启动。

3.只支持本地存储,尽量避免使用硬件RAID,将RAID控制器设置成HBA直连模式。因为要使用zfs文件系统。

4.推荐Intel的网卡,至少两块网卡。