Skip to content

Instantly share code, notes, and snippets.

@fcicq
Last active December 11, 2015 06:48
Show Gist options
  • Save fcicq/4561739 to your computer and use it in GitHub Desktop.
Save fcicq/4561739 to your computer and use it in GitHub Desktop.
SmartMachine 生存指南 by fcicq

SmartMachine 生存指南

by fcicq, CC-BY

SmartMachine 是 Joyent 家的虚拟化方案.
SmartOS 主要的卖点是 ZFS + DTrace + Zones (SmartMachine) + KVM (运行 Linux, Windows 等).
实际上 SmartOS 是 Joyent 以 Solaris 为基础 (因为 OpenSolaris 项目被中止而改名 illumos) 打包的操作系统.

SmartOS 作为 HOST 时, 虽然支持 KVM 虚拟化, 但不支持突发的 vCPU.
而 SmartMachine 是基于 Zones 的 (存储则是 ZFS), 比较类似 Linux 平台下 OpenVZ 或者 LXC 的方案.
资源用量由调度器决定, 只需要修改配额 (ZFS 也支持在线扩展) 就可以伸缩, 所以伸缩不需要重启.

提供 SmartMachine 的平台目前主要有:

  • joyent.com (美国)
  • fengqi.asia (香港)
  • z-cloud.jp (日本)
  • micloud.tw (台湾)

包管理: pkgsrc

pkgsrc (http://www.pkgsrc.org/) 实际上来自 NetBSD 系统,
而 Solaris 自有的包管理系统不向 Zone 内的用户开放. 这里不讨论 Solaris 自有包管理系统.

pkgin 的操作和 apt-get 基本相同 (install, update, upgrade, autoremove, remove 等),
搜索是 pkgin search (对应 apt-cache search), 现有包列表是 pkg_info 或者 pkgin list (dpkg -l).
全局更新是 pkgin full-upgrade (不是 dist-upgrade).
查看包内所含文件 pkg_info -L (dpkg -L)

包源的配置文件有两个, /opt/local/etc/pkgin/repositories.conf 和 /opt/local/etc/pkg_install.conf
前者就是一行一个, 后者的格式就是 PKG_PATH=URI, 然后用 pkgin update 刷新数据库.

Tips:

  • 默认安装的 pkgin 可能有下载时不显示进度的 bug, 升级之后可以解决.
  • 有些包可能有多个版本, 比如你可能需要指定 nginx-1.2.5 才能装上你指定的版本.
  • 如果部署的是 SmartMachine Plus, 你可能会考虑使用 pkgin autoremove 来清理清理.

注意一个不明原因的问题, 如果 pkgin list 提示 "Requested list is empty.", 或者 pkgin install 罢工了,
你可能要用 rm -fr /var/db/pkgin/pkgin.db 来删除数据库, 之后再用 pkgin update 刷新.

可以安装其他源的包 (需要是 SmartOS 的源) 而不添加到配置文件.
自 2012Q3 开始可以用 http://pkgsrc.smartos.org/packages/illumos/2012Q4/ 源, 方法基本相同.
(*: 请慎用本方法)

pkg_add http://pkgsrc.smartos.org/packages/SmartOS/2012Q2/All/PACKAGE_NAME

SmartOS 下, 一般软件包安装在 /opt/local, 也有装在 /opt/pkg 的. 运行这个可以让它们统一.
(*: 出问题概不负责)

mkdir -p /etc/opt /var/opt
ln -s /opt/local/etc /etc/opt/pkg
ln -s /var /var/opt/pkg
ln -s /opt/local /opt/pkg
ln -s /opt/local /opt/pbulk

服务管理: SMF (Service Management Facility)

启动服务 svcadm enable (会同时设置默认启动), 停止则是 disable (会同时取消默认启动),
重启 restart, 重新载入配置 refresh (相当于 reload)
用 svcadm enable -t 则不会改变默认启动/非启动的状态, disable 同理.
查看服务的状态 svcs -x, 列举所有服务 svcs -a

有时同一个服务可能有两个以上的配置文件, 这时候你需要指定用哪一个, 此时会有类似这样的提示:

svcadm: Pattern 'nginx' matches multiple instances:
        svc:/pkgsrc/nginx:default
        svc:/network/nginx:default

服务的配置由特定规格的 xml 文件定义.
默认服务存在 /lib/svc/manifest, 自己定义的服务要放在 /var/svc/manifest/site 或者 /lib/svc/manifest/site 下.
可以使用 svccfg 修改服务的部分参数, 如 memcached 的内存大小等.

svccfg -s svc:/network/memcached setprop config/memory=128
svcadm refresh svc:/network/memcached # reload config
svcprop svc:/network/memcached # check the new config is applied
svcadm restart svc:/network/memcached # restart to apply, if the service requires restart

一般可以使用 svcprop -p config SERVICE 来查看究竟有些什么选项,
但如果还是看不明白的话可以用 svccfg export svc:/network/memcached 来慢慢研究 xml 配置文件.

用 svccfg import PATH/TO/XML/FILE 来导入自己的配置文件,
然后用 svccfg enable SERVICE 来启用新的配置文件 (有些象 supervisord).


可选步骤: 新机器换包源

(SmartMachine / SmartMachine Plus 差不多, Plus 里面预装了一些奇怪的东西...)
官方的包源在 http://pkgsrc.joyent.com/sdc6/2012Q2/x86_64/ , 这里使用了一个稍微快一些的镜像.
此外有一个欧洲的镜像 http://pkgsrc-eu-ams.joyent.com/

echo http://mirror.easyspeedy.com/smartos-pkgsrc/2012Q2/x86_64/All | tee /opt/local/etc/pkgin/repositories.conf 
echo PKG_PATH=http://mirror.easyspeedy.com/smartos-pkgsrc/2012Q2/x86_64/All | tee /opt/local/etc/pkg_install.conf
rm -fr /var/db/pkgin/pkgin.db
pkgin -y update

然后 pkgin upgrade (或者 full-upgrade) 什么的.
注意: 由于 bmake-20110606 依赖 bootstrap-extra-files-20070702, 所以提示没法升级 bootstrap-extra-files 是正常现象.


解决 Solaris 的各种毛病

各种工具内置的基本都是 UNIX 的版本, 而不是 GNU 的.
GNU 工具就需要手工在前面加个 g: gmake, gtar, gsed, gawk, ggrep, gfind ...
UNIX 工具们, 参数放后面不行, 还有一些参数完全不支持什么的, 很烦.
在 SmartOS 下, 把 /opt/local/gnu/bin 放在 PATH 的前面是最简单的解决方案.
(或者 ls /opt/local/gnu/bin 然后生成 alias 命令的列表也行, 除了 coreutils 之外还有其它一些包)

对非 root 用户来说, 默认的 PATH 可能是错的, 默认的提示符是烂的, 默认的 locale 有问题, 默认的 TERM 有问题...

export PATH="/opt/local/gnu/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/usr/sbin"
export PS1="\u@\h:\w\\$ "
export LANG="en_US.UTF-8"
export TERM=xterm

如果你习惯了 Linux 的命令, 在上面那个 PATH 之外, 这些可以再帮点忙.
其中安装 htop 可以找回 linux 下用 top 的感觉.
顺便再推荐下偶的 dstat solaris port: https://github.com/fcicq/dstat

alias strace="truss"
alias pstree="ptree"
alias whereis="which"
alias ping="ping -A inet -I 1"
alias ping6="ping -A inet6 -I 1"
alias top="htop"

其他一些问题就躲不过了...
添加用户不会自动建立目录: useradd -m -d /home/xxx xxx
ifconfig 不好用: ifconfig -a
route 变成了 netstat -rn

工具链: pkgin install gcc47 gmake automake autoconf binutils
此外 git 叫做 scmgit-base


有用的工具

sysstat (sar) 什么的因为 /proc 不开放权限是看不到的.
有兴趣的同学可以研究一下 kstat, 很多系统信息都必须从这里得到.
truss 相当于 strace, dtrace 怎么用自己看着办.

netstat -i 看流量 (实际只能看数据包数), netstat -i 1 滚动显示
prstat 相当于 top (但个人更推荐 htop), 有几个参数可以看一下, -Z, -a 等等
iostat 看 IO, vmstat 看系统状态.

Joyent 的工具(smtools), 以 sm- 开头.
比如 sm-summary, sm-cpuinfo, sm-meminfo, sm-lsof 等 (其他的基本没用)


PHP, Python, Perl, Ruby 用户注意

你要的包可能带了前缀, 用 pkgin search 慢慢找吧.

Python 用户没有 pip 是不行的

pkgin install py27-setuptools
easy_install-2.7 install pip

HE IPv6 Tunnel

其中 X:X:X 是自己的 /64 段, X:X:Y 是 Tunnel 的 endpoint.

ifconfig ip.tun0 inet6 plumb
ifconfig ip.tun0 inet6 tsrc LOCALIPv4 tdst REMOTEIPv4 addif 2001:X:X:X::1/64 2001:X:X:Y::1 nud preferred up
ifconfig ip.tun0 inet6 up
route add -inet6 default 2001:X:X:Y::1 -ifp ip.tun0
# ifconfig ip.tun0 inet6 down unplumb # to destory

ps: 大概只能帮到这么多忙了...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment