Plan9日記

2014-12-01

OSv雑感

次のスライドは@syuu1228さんの「OSvの概要と実装」。

  • ライブラリOSが流行っている感じもするので、そのうちまとめておきたい。USENIX ATCのOSvの発表を聞いて、タネンバウム教授がexokernelと何が違うみたいな質問をしてたそうな。
  • ユーザ空間がなくカーネル空間のみという割り切りはすごい。ハイパーバイザが最後の砦になるので、よいという判断。カーネルじゃなくてライブラリと考えればそんなものかとも思うが、カーネルアプリが同じメモリプールからmallocするとなると、ちょっとしたオーバランでカーネルをぶっ壊してしまいそう。
  • アプリからPF filterやnet channelにフックを仕込んでパケットを奪って処理することが可能。実装の雰囲気としてはカーネルモジュール
  • ttyないのでエディタを開発するのは難しい。REST APIを利用して外部からファイルを流し込むのがOSv流。
  • Dockerと狙いがかぶってそう。完全なisolationが一つの鍵か?
  • Virtual Appliance的な利用を想定しているようだ。
  • 元々ゲストOS上で動くことしか考えてなかったが、実はベアメタルで動きそうなぐらいレガシーデバイスがサポートされつつある。もう一息でベアメタルで動いてしまったり?
  • Huaweiがaarch64サポートを実装。

2014-10-14

CentOS 7でOSvを動かすまで

OSvを動かしてみるぞ〜。

git clone https://github.com/cloudius-systems/osv.git

して、README.mdを眺める。scripts/setup.pyで必要なパッケージをインストールするみたいだけど、CentOS用の記述がないので、Fedoraをベースにコードを追加。versionがexact matchなので、マイナーバージョンアップしたらダメだな、これ。まぁ、いいや。

diff --git a/scripts/setup.py b/scripts/setup.py
index 8487c2a..c73891b 100755
--- a/scripts/setup.py
+++ b/scripts/setup.py
@@ -51,6 +51,30 @@ class Fedora(object):
 
     versions = [Fedora_20, Fedora_21]
 
+class CentOS(object):
+    name = 'CentOS Linux'
+    install = 'yum -y install'
+    packages = ['gcc-c++', 'gcc-c++-aarch64-linux-gnu', 'git', 'gdb', 'qemu-img',
+                'qemu-system-x86', 'libvirt', 'maven', 'java-1.7.0-openjdk',
+                'ant', 'autoconf', 'automake', 'boost-static', 'genromfs', 'libtool',
+                'flex', 'bison', 'maven-shade-plugin', 'python-dpkt', 'tcpdump', 'gdb',
+                'gnutls-utils', 'openssl', 'python-requests', 'p11-kit', 'patch', 'wget',
+                'unzip', 'ncurses', 'ncurses-devel', 'libstdc++-static', 'openssl-libs',
+                'openssl-devel'
+                ]
+    ec2_packages = standard_ec2_packages
+    test_packages = ['openssl-devel']
+    ec2_post_install = standard_ec2_post_install
+
+    class CentOS_7(object):
+        packages = []
+        ec2_packages = []
+        test_packages = []
+        ec2_post_install = None
+        version = '7.0.1406'
+
+    versions = [CentOS_7]
+
 class Debian(object):
     name = 'debian'
     install = 'apt-get -y install'
@@ -105,6 +129,7 @@ class Ubuntu(object):
 distros = [
            Debian(),
            Fedora(),
+           CentOS(),
            Ubuntu()
            ]

あとは、README.mdに従うだけだけど、makeで止まった。なにやら途中でqemuを起動しているのだが、CentOSにはqemu-system-x86_64コマンドがない(代わりに/usr/libexec/qemu-kvmがある)のが問題のようだ。次のようにworkaround。

$ sudo ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-system-x86_64

scripts/run.pyを実行すると、驚くほどあっさりOSvが起動する。ちなみに-nオプションを付けると、ネットワークが有効になる。デフォルトでは192.168.122.0/24からDHCPIPアドレスが払い出される。-vオプションでvhostを使った高速化が有効になる。

$ sudo ./scripts/run.py -nv
OSv v0.13-53-ge31c3dd
DMI: error
eth0: 192.168.122.89
/# help
COMMAND DESCRIPTION
api     execute arbitrary OSv API operations as defined by the schema
cat     concatenate files and print on the standard output
cd      change the shell working directory
date    print the system date and time
df      report file system disk space usage
dmesg   print operating system boot log
echo    display a line of text
exit    close shell and exit
free    display amount of free and used memory in system
hello   a command example
help    list console available commands and show help
ls      list directory contents
mkdir   make directories
rm      remove files or directories
top     display OSv threads
/# 
/# hello
Hello, OSv!

/proc/self/mapsを見て、luaの共有ライブラリがリンクされているので気付いたのだけど、このシェルluaで実装されているのね。

/# cat /cli/commands/hello.lua
--[[
Commands are expected to be Lua modules.
This file is an example of such a module.
For more on Lua modules, see: http://lua-users.org/wiki/ModulesTutorial
]]--

local cmd = {}

cmd.desc = [[a command example]]
cmd.hello = [[Usage: hello

A command example.]]

--- Called when the command is executed
-- @param args List of arguments from the command line
cmd.main = function(args)
	print("Hello, OSv!")
end

return cmd

dmesgを見えるとどんなデバイスが登録されているかわかる。

/# dmesg
dmesg
4 CPUs detected
Firmware vendor: Seabios
bsd: initializing - done
VFS: mounting ramfs at /
VFS: mounting devfs at /dev
RAM disk at 0x0xffff800002796040 (4096K bytes)
net: initializing - done
vga: Add VGA device instance
eth0: ethernet address: 52:54:00:12:34:56
virtio-blk: Add blk device instances 0 as vblk0, devsize=10842275840
random: virtio-rng registered as a source.
random: intel drng, rdrand registered as a source.
random: <Software, Yarrow> initialized
VFS: unmounting /dev
VFS: mounting zfs at /zfs
zfs: mounting osv/zfs from device /dev/vblk0.1
VFS: mounting devfs at /dev
VFS: mounting procfs at /proc
random: device unblocked.
program zpool.so returned 1
BSD shrinker: event handler list found: 0xffffa0000199e500
	BSD shrinker found: 1
BSD shrinker: unlocked, running
[I/43 dhcp]: Waiting for IP...
[I/246 dhcp]: Server acknowledged IP for interface eth0
[I/246 dhcp]: Configuring eth0: ip 192.168.122.89 subnet mask 255.255.255.0 gateway 192.168.122.1 MTU 1500
Running from /init/30-auto-00: /libhttpserver.so &!

シェルだとできることは限られているのだけど、REST API経由でいろいろ弄れるのが今っぽい。ブラウザhttp://192.168.122.89:8000/を開く。あ、ブラウザ経由でリブートやシャットダウンもできちゃった。面白い。ちなみにコンソールからシャットダウンするときは、exit (or Ctrl-a x)でOK。

2014-09-19

CentOS 7設定メモ

サーバにCentOS 7をインストールしたので、メモを残しておく。

ネットワーク

あぁ、インタフェース名がenp6s0とかenp7s0になっているね。それぞれのPCI IDは06:00.0と07:00.0。

管理ツールはNetwork Administration Toolがなくなり、Network Managerに一本化されたそうな。今まではインストール後速攻に削除していたけど、使ってみるか。Network Managerではネットワーク設定をコネクションという概念で抽象化しているけど、一番単純なケースはインタフェース=コネクション。

設定ファイル自体は/etc/sysconfig/network-scripts/ifcfg-<コネクション名>なのは一緒。ターミナルから使えるコマンドは、nmtuiとnmcli。

$ nmcli c sh  # コネクション一覧表示
$ nmcli d sh enp6s0  # デバイスenp6s0の情報表示

SSH

sshd_configを編集して、サービスを有効にしておく。

$ sudo systemctl start sshd.service
$ sudo systemctl enable sshd.service

ファイアウォール

iptablesサービスの代わりにfirewalldが導入されている。内部的にはiptablesコマンドでnetfilterの設定を行っている。

ゾーンってのがあるね。デフォルトはpublic。/usr/lib/firewalld/zones以下にゾーン毎の設定が記述されたXMLファイルがある。これによるとsshとdhcpv6-clientだけ許可するようだ。

$ sudo firewall-cmd --get-default-zone
public
$ sudo firewall-cmd --get-active-zone
public
  interfaces: enp6s0

例えば、80番ポートを通すために、ゾーンにサービスを追加する場合は、こんな感じ(--permanentオプションを付けると再起動後も有効になる)。

$ sudo firewall-cmd --add-service=http --zone=public --permanent

クラスタを作るには、外部用をexternal、内部用をinternalにするとよいかな。externalにはデフォルトでmasqueradeの設定が入っている。

Rich rulesという感じで、iptablesの記法で指定することもできるとのこと。

NFS

/homeをクラスタ内で共有する。まずはNFSサーバ側の設定。

$ cat /etc/exports
/home 192.168.0.0/24(rw)

systemdの設定。nfs-server.serviceとnfs-lock.serviceを起動する。

$ sudo systemctl enable nfs-server.service nfs-lock.service
$ sudo systemctl start nfs-server.service nfs-lock.service

デフォルトではNFS関係のパケットはファイアウォールを通過できないので、ルールを変更する。

$ sudo firewall-cmd --add-service=nfs --permanent 
$ sudo firewall-cmd --add-service=mountd --permanent          
$ sudo firewall-cmd --add-service=rpc-bind --permanent        
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (default, active)
  interfaces: enp5s0 enp6s0 virbr0
  sources: 
  services: dhcpv6-client mdns mountd nfs rpc-bind ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

あとはクライアント側の/etc/fstabを修正する。

172.168.0.1:/home       /home   nfs     rw,hard,intr,rsize=32768,wsize=32768,async      0 0

このままではmountできない。SELinuxの設定が必要なようだ。ということで、/etc/selinux/configを編集して無効化。。。

QEMU/KVM

CentOS 7で採用されているバージョンは、QEMU/KVMが1.5.3、libvirtが1.1.1。

vagrantとか使っていると、面倒くさいなと感じてしまうが、ISOイメージをダウンロードして、virt-installでゲストOSインストールする。CLIで済ます。

$ sudo yum install qemu-kvm libvirt virt-install
$ sudo systemctl enable libvirtd.service
$ sudo systemctl start libvirtd.service
$ qemu-img create -f qcow2 /data/images/guest1-centos7.img 8G
$ sudo virt-install --name=guest1-centos7 --hvm --virt-type=kvm \
--disk path=/data/images/guest1-centos7.img,format=qcow2 --graphics none \
--vcpus=2 --ram=2048 --location=/data/iso/CentOS-7.0-1406-x86_64-Minimal.iso \
--network bridge=virbr0 --os-type=linux --os-variant=rhel7 \
--extra-args='console=tty0 console=ttyS0,115200n8'

久々にやったらパラメータ間違えて途中で止まって中途半端な状態に。その場合は、

$ sudo virsh undefine guest1-centos7

で消去してやり直す。

以下はオプショナルな設定。

Nested VMXを実行する場合は、次のファイルを用意して、kvm_intelモジュールをリロードする。

$ cat /etc/modprovbe.d/kvm-nested.conf
options kvm_intel nested=1

libvirtの方は、最低限VMXのfeature bitだけを立てればいいが、CPUモードをhost-passthroughにしてもOK。ただ、host-passthroughは安定している雰囲気ではないので、お勧めしない。

  <cpu mode='host-passthrough'/>

2013-02-03

計算「ノード」という呼び方について

計算機のことをノードとかホストと呼ぶことがある。ホストは計算をホスティングするという意味で問題ないけど、今回はノードという呼び方について考えてみる。特に計算機がネットワークに接続されたクラスタやデータセンタではノードと呼ぶことが多い。計算機屋のみと話しているときはこれで支障ないのだけど、ネットワーク屋と話していると話が食い違ってしまうことがある。特にデバイスに近い人だと、スイッチングモジュールなどのチップをスイッチ、システムとなった装置をノードと呼んでいたりする。ネットワークの視点で見ると、スイッチやルータがノード(節点)であるというのは正しい。

計算ノードと呼び始めたのは、HPC分野で単に計算ノードとスイッチノードの区別から始まったのかもしれない。けど、インターコネクト・トポロジがメッシュ・トーラスだった計算機が由来だったりしないかな。メッシュ・トーラスなら計算ノードでルーティングするし、リーフ(葉)ではなくなる。一方、Ethernetに代表されるツリー・トポロジだと計算機もリーフになる。まぁ、リーフもノードの一部だから、計算ノードと呼んでも間違いじゃないけどさ。

2012-12-31

[] システムソフトウェア研究の将来

本年最後のエントリはちょっと無理してシステムソフトウェア研究の将来に思いを馳せてみたい。(おぉ、まだ酒は入っていないw)

去る12月6〜7日にコンピュータシステムシンポジウム(ComSys)2012が開催された。加藤和彦(筑波大)教授による基調講演「仮想化とシステムソフトウェア研究」では、Multics、Unix、Mach、そして同教授が関わったDSR/Planet、遠隔RPC、BitVisorなどの研究を振り返り、システムソフトウェア研究が目指した理想と社会が求めた現実とのギャップ分析が示され、非常に面白かった。イノベーションの源泉がシステムソフトウェアよりも上位層に移っているのは確かではあるが、システムソフトウェア研究者としては、例えばセキュリティなど、自分の研究と社会との関係をどう位置付けるかが重要と改めて感じた。また、質疑応答では、日本は特にインフラが見えにくいという問題があり、若い人にシステムソフトウェア研究への興味を喚起するにはその使命感をアピールすることが重要ではという指摘もあった。

情報処理学会のOS研究会などの動向を見ると、この分野が萎縮しているように感じることがある。しかし、海外に目を転じると、システムソフトウェア系の会議の参加者は年々増加しているそうである。Google、Microsoftを始めとする巨大インフラを持つIT企業の存在感が大きいし、研究の出口が見えている感がある。研究としての深みがないとか批判はあるだろうが、人は集まるし、高い質も保てているのではないだろうか。一方、日本でも、カーネル/VM探検隊やインフラエンジニアの勉強会は非常に盛んなところを見ると、まだまだ捨てたモノじゃないなと感じる。このような草の根というかボトムアップの活動と学会活動をうまく結びつけられないかなと、個人的には思っているのだが。。。

確かにシステムソフトウェアは地味だし、成果が出るまで時間がかかる。でも、コンピュータシステムが成立する上で必要不可欠なのある。まさに、「誇り高き3K」仕事。

分野が違えばこの手の縁の下の力持ち系の仕事の啓蒙活動は「プロジェクトX」や「メタルカラーの時代」など、いろいろなメディアでまとめられている。今ちょうど「メタルカラーの時代」を読んでいるのだが、モノを作る、社会的基盤を築く、社会や自然のシステム、メカニズムを探り創造する人々のインタビューが満載である。この本が出たのは1993年で、IT系の話題は磁気デバイス、通信衛星や海底ケーブルなどが中心で、しかもインターネットはもう存在するが、本書には「イ」の時も出てこない。ソフトウェアの話はTRONだけ。奇しくも坂村健先生は「TRONは21世紀のインフラ作り」と言っている。さて、90年代と比較しても、ソフトウェアの社会インフラとしての重要性は比べものにならないほど増大している。巨大土木事業と同じように、子供の世代にこのインフラは我々が作ったんだ、支えているんだと胸を張って言えるようになりたいではないか。

ComSysの懇親会で、プログラミング言語ではかなりいろいろな可能性にトライして失敗するという歴史を経てきたが、OSにはまだその可能性を探究し切れていないのではないかという話が出た。私ぐらいの歳になると、「OSとはかくあるべし」という固定概念で思考が固まってしまう。若い人にはその既成概念を打ち破って欲しいな(というのは無茶ぶり?)。来年はOS研究の最高峰、ACM SOSPの開催年である。「What is good systems research?」を読みながら傾向対策でもしてみたら? まぁ、学会の傾向と対策からイノベーションは生まれないか。

「メタルカラー」の時代

「メタルカラー」の時代