ラベル lxc の投稿を表示しています。 すべての投稿を表示
ラベル lxc の投稿を表示しています。 すべての投稿を表示

2016/03/17

USBカメラをlxcインスタンスから使ってみる

最初 普通にカメラモジュールを買って遊んでみようと思ったが、調べているうちにチューブカメラ(スネークカメラ)の方が遊びがいがありそうだったので、買ってみた。

チューブカメラ(スネークカメラ)
kamura 7mm 6LED カメラ USB接続エンドスコープ(内視鏡) 防水 内視鏡スコープ
1300円は安いんじゃないかな。自分は2mを買ったけど何故か5mの方が100円安い設定・・・
レビューも詳しい商品説明もなかったけど、2~3千円台のやつと大差ないだろうとエイヤ!購入。

チューブカメラをUbuntuサーバーに付けて

認識してるかな?

$ lsusb
Bus 001 Device 006: ID 1908:2311 GEMBIRD

$ dmesg |grep CAMERA
[    2.535026] usb 1-1: Product: USB2.0 PC CAMERA
[   10.129511] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2311)
[   10.131662] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/input/input5
[ 8834.645489] usb 1-1: Product: USB2.0 PC CAMERA
[ 8834.646070] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2311)
[ 8834.646467] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/input/input11

$ ls -l /dev/video*
crw-rw---- 1 root video 81, 0  ~~~~ /dev/video0

どんなデバイスかな?

$ sudo apt-get install v4l-utils
video4linux2 utilitiesを入れて

$ v4l2-ctl -d /dev/video0 --info
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : USB2.0 PC CAMERA
        Bus info      : usb-0000:00:14.0-1
        Driver version: 4.2.8
        Capabilities  : 0x84200001
                Video Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps   : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format

最大640x480 30fpsの標準的なUVC Camera。USBコネクタ側に先端のLED調光ダイヤルが付いていて4段階くらいの制御が出来ている。


lxcインスタンス側から使えるようにする

/var/lib/lxc/(instance)/config に
”lxc.cgroup.devices.allow = c 81:* rwm”

lxc.hook.autodevスクリプトに
”mknod -m 660 ${LXC_ROOTFS_MOUNT}/dev/video0 c 81 0”
"chgrp video ${LXC_ROOTFS_MOUNT}/dev/video0"

を加え、lxcインスタンスを起動。これでホストと同等にアクセスできるようになった。
後々めんどくさいので
”mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/video0 c 81 0”
だけにして、誰でもOKに。

キャプチャツールでテスト

Ubuntu Webcam で紹介されているものを幾つか試してみる

streamer
$ sudo apt-get install streamer
$ streamer -o test.jpeg -s 640x480

シンプルでコンパクトなコマンドツール。自分はこれで満足です。

cheese
$ sudo apt-get install cheese
$ cheese
** Message: cheese-application.vala:211: Error during camera setup: No device found

ほえ?自動的にデバイスを認識するって話ですが? "-d /dev/video0" してもだめでした。
lxcインスタンスからとか、tightvnc上での起動とかが絡んでるかもしれないけど、もういいっす。

VLC
$ sudo apt-get install vlc
$ vlc

難なくtightvnc上にGUI出てきました。/dev/video0を選んで 再生も問題なし。
$ vlc v4l2:///dev/video0 とすればすぐさま再生。

ただ、起動するとエラーではないけれど

pulse audio output error: PulseAudio server connection failure
Qt: XKEYBOARD extension not present on the X server.
Failed to open VDPAU backend libvdpau_nvidia.so

のメッセージが出るのが気になる。

$ cvlc v4l2:///dev/video0

でコマンドツールで起動するとXKEYBOARDのメッセージだけは消せる。
けど他は消せないなぁ。

iPadやAndroidとかではどうかな?
iPadにCamera Connector Kit経由で繋いでみたら消費電力が高すぎるから使えないと言われた。それじゃあと、外部電源付きのUSBハブをさらに経由したら、サポートしていないカメラだと言われた。。。
 AmazonFireHDXに繋いでみたが認識しなかった。外部USBカメラアプリをいくつか試してみたが、やっぱり認識しないようだ。USB変換ケーブルが原因の可能性もあるかな。今の所残念な状態。


2015/10/16

snappy on kvm on lxc

RaspberryPi2でUbuntu Core Snappyは普通に動いた。が、アプリ作らないと面白く無さそうだし、ラズパイはまだまだRaspbianで遊びたいので、Snappy環境を別に作ろうと思った。
SnappyのKVMイメージが提供されているので、それで出来そうだ。

KVM on LXC

すでにLXCコンテナで環境構築しているので、その上にKVM仮想環境を動かせばいいかと。
作って動かしてみることにした。
ホストでLXCと平行してKVMも動かすのも可能だろうけど、その方が複雑な気がする。

KVMを動かすためのコンテナ作成
$ sudo lxc-clone master -n kvm
分かりにくいかもしれんけど、'kvm'という名前のlxcコンテナにした。
新規作成は面倒なので、いつもmasterコンテナをクローンする方法で作る。

kvmコンテナ設定
色々試行錯誤した結果、kvmをlxc内で動かすには以下のデバイスが必要。

/dev/net/tun
ブリッジネットワーク構築時に/dev/net/tunにアクセスするらしく、mknodで作ったのではダメで、ホストの/dev/netをマウントする必要があった。

/dev/kvm
は、kvmが稼働するときにアクセスするものだそうで、これはmknodで作ればよいらしい。

それを作ってアクセスできるように、コンテナのconfファイルに以下を追記
# device
lxc.cgroup.devices.allow = c 10:232 rwm
lxc.cgroup.devices.allow = c 10:200 rwm
lxc.mount.entry=/dev/net dev/net none bind,optional,create=dir
lxc.hook.autodev = /var/lib/lxc/kvm/mount-hook.sh
 /var/lib/lxc/kvm/mount-hook.shの中身
#!/bin/sh
mknod -m 600 ${LXC_ROOTFS_MOUNT}/dev/kvm c 10 232
コンテナ起動
$ sudo lxc-start -n kvm
で、/dev/kvm、/dev/net/tunがちゃんとできていることを確認する。

あとは、sshなりconsoleなりからコンテナにログインしての作業

kvmインストール

$ sudo apt-get install kvm virt-manager libvirt-bin bridge-utils
$ sudo apt-get install lxde tightvncserver fonts-ipafont
$ mkdir .vnc
$ ln -s /etc/X11/Xsession .vnc/xstartup

まとめて書いちゃいましたが、lxde以降はVNCデスクトップ構築のためです。kvmのvirt-managerや本題のSnappyアプリがディスプレイを必要とする場面があるため。

この時点で、libvirtdやlxcと同じようにdnsmasqが動いていればOK。
ifconfigしたときには、virbr0ブリッジインターフェースが出来ているはず。最初、これが作られなくて悩んだ。
自分はデフォルトのままでいいので、kvmネットワークは 192.168.122.0 である。lxcが10.0.3.0なので、10.0.2.0とかにした方が綺麗かもしれないけど。

UbuntuCore Snappy 取得と起動

https://developer.ubuntu.com/en/snappy/start/
をそのまんま実行しても動くには動くが・・

$ kvm -m 512 -redir :8090::80 -redir :8022::22 ubuntu-15.04-snappy-amd64-generic.img -curses
で起動はできけど、kvmのネットワークと繋がらない。kvmコマンドがよくわからないし面倒なので、libvirtへインストール方法で。

Snappyゲスト作成

https://help.ubuntu.com/community/KVM/CreateGuests
は参考にはなるが具体的なところがよくわからなくて結構悩んだ。

img => qcow2 変換 (必須じゃないけど、qcow2の方がサイズを小さくできるんで)

$ qemu-img convert -f raw -O qcow2 ubuntu-15.04-snappy-amd64-generic.img ubuntu-15.04-snappy-amd64-generic.qcow2

インストール

$ virt-install --name snappy --import --memory 512 --disk ubuntu-15.04-snappy-amd64-generic.qcow2

インストール後、勝手にコンソールが出てきて起動しちゃう。しかもキー入力が効かない。抜ける・・
でも、これでインストールは完了だ。

コンソール
$ virsh console snappy

Snappyは最初からsshd動いているんで、sshで入っても同じ。
ifconfigすると、ちゃんとKVMのゾーンのIPアドレスになっている。
外へpingしても、ちゃんと名前解決もできているし、外へも出られているようだ。

consoleから抜けるには、"Ctrl+5"とか"Ctrl+]"で抜けられる。

VNCから使ってみる

Snappyインスタンス内では、webdm/snappydが稼働しているので、見てみたい。
けれど、kvmコンテナ以外からのアクセスは出来ない。
そこで、KVMコンテナで、tightvncserverを動かして、そこに外からVNC接続して
そこからブラウザで
http://snappy-ip-address:4200
にアクセスすると、snappyアプリのダウンロードマネージャを操作できる。

仮想の仮想になっているんで、NATを2重にやれば外からのアクセスもできるはず。


左上に出ているのがSnappyゲストで疎いているwebdm画面で、SnappyStoreを覗いているところ。その横がSnappyのコンソール。左下がKVMのvirt-manager、で右下には愛用のEmacs上でbashを使っている状態。

Snappyを動かす環境として完全な状態か?といえば、そうじゃないと思う。
その都度、kvmやlxcの設定をやることになるんだろうなと思っている。それがまた楽し。

2015/09/30

lxcコンテナへのNAT設定もsystemdで

昨夜久しぶりにホストをリブートした。そしたらlxcコンテナへのNAT設定が消滅した。永続化してなかったので、当然です。そうかと軽く考えて

iptable設定永続化パッケージインストール
$ sudo apt-get install iptables-persistent

で、コンテナへのNAT設定を保存し、ホスト再起動してみたら、あらあら、
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24
lxcbr0の設定がダブってしまうじゃありませんか。なるほど。lxcのネットワーク設定とiptables-persistentの設定の両方が効いてしまうからでしょうか。

Enable LXC neworking in Debian Jessie, Fedora 21 and others
には、/usr/lib/x86_64-linux-gnu/lxc/lxc-net ファイルに追加設定する方法があったり

Tips for LXC: Creation, Autostart, OpenVPN and Port Forwarding to Containersには、iptables-persistentでいいが、起動に問題があるのでちょっとゴニョゴニョするとか

それぞれのアプローチ方法は参考にはなるが、ちょっと好きになれない感じ。
自分なりの解決方法としては、iptables-persistentをやめて、前記事と同じsystemdを使って設定することにした。

ただ、今回はホストでの設定だし、ユーザモードで実行するものでもないので、普通のsystemdサービスユニット。それと追加変更がし易い形にはしようと思う。

サービスユニットファイル
~/.config/systemd/system/lxc-nat.service として作成。どこでもいいと思うが、ユーザモードの場合 ~/.config/systemd/user以下に置く流れに沿ってみた。内容は以下のとおり
[Unit]
Description=LXC NAT network setup
After=lxc-net.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/home/ubuntu/bin/lxc-nat start
ExecStop=/home/ubuntu/bin/lxc-nat stop

[Install]
WantedBy=multi-user.target
登録 (/etc/systemd/systemへシンボリックリンク作成)
$ sudo systemctl enable ~/.config/systemd/system/lxc-nat.service

自分でインストール先へ直接ln -sしてもいいかもしれないけど、systemctlにやってもらいます。

確認
$ sudo systemctl list-unit-files | grep lxc
lxc-nat.service                        enabled
lxc-net.service                        enabled
lxc.service                            enabled
lxcfs.service                          enabled

/home/ubuntu/bin/lxc-nat の中身の例
#!/bin/sh -

nat()
{
    iptables -t nat $1 PREROUTING -p tcp -d 192.168.1.10/32 --dport 80 -j DNAT --to 10.0.3.10:80
    iptables -t nat $1 PREROUTING -p tcp --dport 8000 -j DNAT --to 10.0.3.11:80
}

case "$1" in
    start)
        nat -A
    ;;
    stop)
        nat -D
    ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 2
esac
exit $?
nat()関数で-A/-D切り替えできるように(start/stop両方に書かないで済むように)。
後は、nat()内のiptables記述を増やすなり編集するなりするだけ。

例の場合の、10.0.3.10 のコンテナも自動起動するようにコンテナ設定ファイルに
lxc.start.auto = 1
としておくと尚良し。

2015/09/26

lxcコンテナに録画システムを移設する

今年リニューアル構築した録画システムをlxcコンテナ上で動くようにしたいわけです。
なぜなら、面白そうだから。ですが、独立したクリーンな環境で動かせることが一番の魅力です。
色々実験していると環境がぐちゃぐちゃになっていきます。
いつ何を入れたのか、どこに何を設定したのか、次第にあやふやになってくる。etckeeperだけじゃキープできない。
「ちょっと試したい時にコンテナをクローンして試して失敗したら消す!」をしたい。

録画システム用コンテナ作成後に、以下ゴニョゴニョする

ビルド環境

$ sudo apt-get install build-essential
(for recfsusb2n)
$ sudo apt-get install libboost-filesystem-dev libboost-thread-dev -y
(for epgdump)
$ sudo apt-get install cmake -y
(for FFmpeg)
$ sudo apt-get install yasm libx264-dev libfaac-dev
$ sudo apt-get install pkg-config

ビルドしてインストール

epgdump、ffmpeg は、
$ make install
recfsusb2n は Makefileにinstall記述がないので直接
$ sudo cp ./recfsusb2n /usr/local/bin

もうここは専用環境なのでバンバン/usr/localとか自由に使う。

udevdが動いてないので

どうやらコンテナではudevdが動かないらしい。前回は'video'グループ権限でアクセスできるような
ルール設定ファイルを /dev/udev/rules.d に置いたりしたけど、udevdが動いてないので意味が無い。
っていうか、後で気づいたことだけど、ホスト側で設定しておくべきことだった。
ホストに/etc/udev/rules.d/89-tuner.rulesを作成。内容は以下な感じ。
# FSUSB2N
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0029", MODE="0664", GROUP="video"
これでブート時にチューナデバイスのグループが'video'になる。

USBデバイス スルー

コンテナ上の録画プログラム(recfsusb2n)がチューナーデバイスを扱えるように、
ホストに接続されているUSBデバイスをlxcコンテナからアクセスできるようにする必要がある。
# usb device
lxc.cgroup.devices.allow = c 189:* rwm
# mount
lxc.mount.entry=/dev/bus/usb/001 dev/bus/usb/001 none bind,optional,create=dir
上の記述を、コンテナのコンフィグファイルに追記して、コンテナ再起動する。
ホスト側と同じ状態でUSBデバイスをシェアした状態になる
コンテナから ls -l /dev/bus/usb/001/* すると
crw-rw-r-- 1 root root  189, 0  9月 23 20:13 /dev/bus/usb/001/001
crw-rw-r-- 1 root root  189, 1  9月 23 20:13 /dev/bus/usb/001/002
crw-rw-r-- 1 root root  189, 2  9月 23 20:13 /dev/bus/usb/001/003
crw-rw-r-- 1 root root  189, 3  9月 23 20:13 /dev/bus/usb/001/004
crw-rw-r-- 1 root video 189, 4  9月 25 17:50 /dev/bus/usb/001/005
crw-rw-r-- 1 root root  189, 5  9月 23 20:13 /dev/bus/usb/001/006

rvm入れなくても大丈夫かな
ubuntu14.04の時は、パッケージインストールされるrubyが1.9.3だったり、独立したruby環境にしたかったのでrvmを入れていたけど、ubuntu15.04のrubyは2.1.2で新し目だし、コンテナ自体が独立しているので、rvmではなく、普通にパッケージインストールしたものを使う。

gemインストール
録画システムはrailsで構築しているので、システムパッケージをまるっと持ってきて
(gitで退避しておいたので、git cloneして復活)そこで

$ bundle

で必要なgemパッケージをインストール
おっと、bundleも入ってなかったか。bundleが成功するまで、色々足りていないものを入れる。

(引っかかった順)
$ sudo gem install bundler
$ sudo apt-get install ruby-dev
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install mysql-server libmysqlclient-dev

bundleでgemインストールが完了したら
$ sudo mysql_secure_installation&アクセス用のmysqlユーザを作って権限設定とかして、、

DB作成とマイグレーション

$ RAILS_ENV=production bundle exec rake db:create
$ RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=development bundle exec rake db:create
$ RAILS_ENV=development bundle exec rake db:migrate

NATで外と接続(ホストで)
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to <コンテナIP>:3000

したら、コンテナ側のrailsアプリ上で
$ rails s -b 0.0.0.0

http://ホスト:3000 へアクセスして、コンテナ上のwebrickサーバーが反応すればテストOK。

recmanとしてちゃんと稼動させる
テストは良好だったので、サーバーのデーモン駆動周りを整える
$ sudo apt-get install redis-server nginx -y

unicornとsidekiqを稼動させて、nginxからunicornへproxyするように。

最後にwheneverでcrontab更新
$ bundle exec whenever --update-crontab

NAT設定して、外からアクセスできるように
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to <コンテナIP>:80


思っていたよりすんなり移設できたが、気になる点としては、Ubuntu15.04からinitデーモンが、upstartではなく、systemdになったらしいこと。upstartも使えるけど、systemd対応の方が今風なのだと。unicornとsidekiqの自動起動をsystemd対応にしてみたい。

2015/09/25

lxc上でlxdを動かしたり・・・

シングルマシン1台でopenstackやらdevstackやらnovaのlxd版やら、色々試してみたものの動いたり動かなかったり、動いてもすごいリソース食いだったり(当たり前か)を一通り体感したので、原点に立ち戻った。

方針
* ホストはUbuntu15.04をクリーンインストールしたところに、openssh-serverと lxc だけ入れる
* lxdはlxcコンテナの中で動かす(仮想の仮想)
* 構築した録画システムは、lxcコンテナ上で稼働させる


インストール関係は過去の記事で書いたので、ここでは上のプランを実施する上で行ったことを書く。

lxcコンテナ作成と日本語化
ぼやぼやしているうちに、lxcもバージョンアップしたのか15.04だからか不明だけれど、テンプレートがスクリプトになったため、テンプレートからコンテナ作成するとものすごく遅くなった。日本語化も同時にやってくれるので面倒な無いけど、余計なものも入ってしまう。
ということでイメージダウンロードでコンテナ作成する。

$ sudo lxc-create -n test -t download -d ubuntu -r vivid -a amd64
前はこんな感じで出来た気がするのだけれど、-dが理解してくれない。仕方ないので

$ sudo lxc-create -t download  -n
で、対話式でやった。

このクラウドイメージは素の状態なので、日本語化とか、いくつか手を加える
#!/bin/bash
lxc-start -n $1
lxc-attach -n $1 -- adduser ubuntu
lxc-attach -n $1 -- passwd ubuntu
lxc-attach -n $1 -- apt-get install language-pack-ja -y
lxc-attach -n $1 -- apt-get install emacs -y
lxc-attach -n $1 -- update-locale LANG=ja_JP.UTF-8
lxc-attach -n $1 -- dpkg-reconfigure tzdata
lxc-stop -n $1
こんなスクリプトを書いてそのコンテナに対して実行すると、デフォルトのubuntuユーザと日本語化を一気にやる。といってもubuntuパスワード設定と最後のタイムゾーン設定は対話になる。

毎回 lxc-create するのは面倒なので、lxc-createしたものをマスターにして、実際使うコンテナはlxc-cloneして使うようにする。それから、マスターにはopenssh-serverは入れないようにする。
入れちゃうとクローンしてもちゃんと動かない。MACアドレスが変わるので認証コードも変える必要があるが、作りなおさせるのも面倒なので、最初から入れない。

sshサーバーはクローンして入れる
#!/bin/bash
lxc-clone $1 $2
lxc-start -n $2
lxc-attach -n $2 -- apt-get update
lxc-attach -n $2 -- apt-get install openssh-server -y
何度もやるのは面倒なので、クローンしてsshを入れるところまでのスクリプトを書いておく。

lxdを動かすlxcコンテナのNesting設定
lxcコンテナのコンフィグファイルに以下の設定を追記する
# Nesting
lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting
これで、lxcコンテナにlxdをインストールして普通にlxdコンテナを稼働させることができるようになる。
自分の理解では、lxcならば仮想の仮想になってもCPUコストはほとんど変わらない。ただしネットワークがブリッジのブリッジになるのでその分通信パフォーマンスは落ちるか。
この辺は仮想ネットワーク構成を工夫すれば改善できるんじゃないかな。

何でこんなことするかというと、ホストに直接lxdを入れても動くが、いざlxcを使おうと思ってもlxd用のlxcになっているらしく思うように使えなかったため。dnsmasqも変。なので一番思い通りに動くlxcを親にした。いずれ lxdの方が一般的になってくるだろうから、その時に再考する。

コンテナ上でdevstack動くかな?
性懲りもなくやってみたが、当然というべきなのか動かなかった。
/lib/modulesがなかったり、ebtablesでエラーになったり。。コンテナ自体がカーネルを持っていないからだろうね。独立したカーネル上で動くKVMベースだったら動かせるのかなあ。

録画環境のコンテナ移設は次回。

2015/08/15

lxcのlxdeをvncする

前回はlxcで仮想ubuntuを立ち上げてみるところまでやってみた。IPアドレスもdnsmasqで名前解決できるようになった。
そこで思い立ったのが、ホストの環境を汚さずに、デスクトップ環境のためのコンテナを作って、そこへ外部からVNC接続してみようかなと。飽きたらポイっとまるごと捨てればいいし。

lxcクローン
$ lxc-clone master ubu01

なにか構築したいなって時にすぐ始められるように、予め必要最低限のことを終わらせてあるubuntuコンテナをmasterとして作っておいて、lxc-cloneする。

起動
$ lxc-start -n ubu01 -d

sshログイン
$ ssh ubuntu@ubu01

lxdeインストール
$ sudo apt-get install lxde

ubuntu-desktopじゃなくてlxde。メモリもディスクも少ないShuttleではlxdeの方が小さくてよい。
それでも500MB位は消費してしまうが。

vncserver インストール
$ sudo apt-get install vnc4server

他にも色々VNCサーバーはあるようだけれど、扱いが簡単なvnc4server。

~/.vnc/xstartup作成 (っていうか、デフォルトをリンクしておくだけ)
$ mkdir ~/.vnc
$ ln -s /etc/X11/Xsession ~/.vnc/xstartup

vncserver起動(vncserverでもvnc4serverでもいっしょ)
$ vncserver :0

最初の起動時には、xauthのパスワード設定を要求してきます。適当に設定。
vncが 5900 で待ち受け状態になりました。


ホストの5900ポートを ubu01:5900 へルーティングする
(ホスト側で)
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 5900 -j DNAT --to ubu01:5900

ホストとコンテナ間でのプライベートネットワークへ外部からアクセスできるようにするのに
一番お手軽な方法。

そしたら、外からホストの5900へVNC接続するとubu01:5900へルーティングされて、
めでたくlxdeのデスクトップへ到達します。

日本語化!

忘れてました。いつも端末ばっかりだったので、GUIには日本語化ってのがありました。
そもそも lxc で作った ubuntuコンテナってロケールがen_US.UTF-8だし・・・そこからか。

日本語フォント インストール(IPA入れとけばいいっしょ)
$ sudo apt-get install fonts-ipafont

とりあえずフォントさえ入れれば、lxdeで日本語が表示されます。

日本語パッケージインストール
$ sudo apt-get install language-pack-ja

ロケール設定
$ sudo update-locale LANG=ja_JP.UTF-8

/etc/default/localeに書き込まれる。が、今のシェルの環境変数はen_US.UTF-8のままです。

インプットメソッド
$ sudo apt-get install ibus-anthy

mozcの方が評判いいらしいが、自分にはぴんとこなかった。
ibusじゃなくてfcitxか?とも思って入れてみたけど、??な感じ。ibus-anthyで十分っす。

タイムゾーン変更(日本語化というより日本時間でってだけだけど)
$ sudo dpkg-reconfigure tzdata

CUIメニュー操作でAsiaからTokyo選ぶ

ここまでやったら、一度コンテナを再起動したほうが良い。環境変数とか変わるんで。
(ホストでリブート)
$ lxc-stop -n ubu01 -r

そしたら改めてコンテナ上で vncserver を起動して、そとからVNC接続すると lxdeデスクトップ自体も日本語表示になって、IMもibusで動いている状態に。


後処理
$ sudo iptables -t nat -D PREROUTING 1

遊び終わったら、DNAT設定を消しておこう。
コンテナも終わらせるか、vncserverを $ vncserver -kill :0 しておこう。
油断していると外から潜り込まれちゃうのでね。


2015/08/14

lxcのdnsmasqでコンテナのIPアドレス管理

lxc楽しくて、調子に乗って何個も作るとコンテナのIPアドレスでアクセスするのが面倒になってくる。
コンテナ側で固定IP設定するのもいいけど、lxc-cloneして使う場合、外側で管理しないと辛い。

ということで、コンテナ内はデフォルトのDHCP設定のままで、ホスト側で制御したい。

一番本家っぽいところを読む・・・
https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-network

やっぱり、ありますね。方法が。

/etc/default/lxc-net ファイルの以下の記述があるんで、コメント外す
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
LXC_DOMAIN="lxc" ←必要かなぁ。dnsmasqが使うかな。

/etc/lxc/dnsmasq.conf を作成して以下のように記述
dhcp-host=ubu01,10.0.3.11
dhcp-host=ubu02,10.0.3.12
dhcp-host=ubu03,10.0.3.13
もしくは
dhcp-hostsfile=/etc/lxc/dnsmasq-hosts.conf
と書いて、別ファイルにまとめることも出来るそうな。

$ sudo service lxc-net stop
$ sudo service lxc-net start
とかじゃなくてホスト再起動のほうがいいかも。

その後、コンテナを起動すると、指定アドレスになった。DHCP側で管理できるってことだね。
楽ちん。

ホスト側から名前でアクセスしたい

IP管理するんだったら全部 hosts ファイルに書くっていう手もあるが、それすら面倒くさい。
本家のドキュメントを読むと
server=/lxc/10.0.3.1 を /etc/dnsmasq.conf に書き加えろとか書いてあるんだけど、効果なし。
あちこちの記事でも書き加える場所とか説明がまちまちで、よくわからん。

DNS in Ubuntu + LXC が参考になりました。

/etc/resolvconf/resolv.conf.d/head とか /etc/network/interface当たりに
nameserver 10.0.3.1を加えればいいだけだった。

$ sudo resolveconf -u
更新して

$ ping ubu01
$ ping ubu01.lxc

が出来るようになった。これで、dhcp-hostでIP指定してなくても名前解決が出来るんで
更に楽ちん。


https://github.com/jeremiahsnapp/dev-lxc
これも面白そう。高度すぎ?

2015/08/13

lxcを入れてVM構築

LinuxContainers.org Infrastructure for container projects というLinuxカーネルのコンテナ技術を使って軽量VM環境を構築できるらしいものを最近知りました。

VMWare、Xen、KVM、もっと大きなのでは AWS とかが、VMの世界だと思っておりましたが、それら全部が openstack (cloud softwre) ファミリーだったのね。

ということで、軽量でメモリもディスクもあまり使わなそうな lxc でVMっぽいものをやってみた。
lxcの先には Docker とかいうものが控えているようだけれど、まずは基礎から。

lxcの勉強には LXCで学ぶコンテナ入門 を参考にさせてもらいました。

lxcインストール

$ sudo apt-get install lxc

すると
 /etc/lxc/ 設定
 /usr/share/lxc/ ディストーション設定やテンプレート
 /var/lib/lxc/ ルート権限のコンテナ格納場所
 /etc/init/lxc-**.conf 自動起動やらネットワーク設定やら
が作られて
 upstart-file-bridge
 upstart-socket-bridge
 upstart-udev-bridge
 cgmanager
 dnsmasq
がデーモンで動き始めました。

ifconfig すると、lxcbr0 っていうコンテナのネットワークをブリッジするインターフェースが追加されているのを確認。

root権限でコンテナ作って動かしてみる
$ sudo lxc-create -t ubuntu -n uc01

/var/lib/lxc/uc01にuc01という名前のubuntuが作られた。

起動!
$ sudo lxc-start -n uc01

動いた~。デフォルトのubuntuユーザでログインしてみた。ふむふむ。sshが出来る状態なのね。
えーと、コンソールから抜けるのは??? Ctrol+a qだそうな。やってみたけど抜けられぬ。。

停止(ホスト側で)
$ sudo lxc-stop -n uc01

コンソールから抜けられなかったので、外から殺しました。

デーモン起動して
$ sudo lxc-start -n uc01 -d

コンソール起動
$ sudo lxc-console -n uc01

おぉ? 今度は Ctrl+a q で抜けられた!まあいいか。次へ進む。
どうやらlxc-startをフォアグラウンドで起動した時のコンソールではダメで、lxc-consoleで起動したコンソールならば抜けられるようだ。

ネットワークタイプをmacvlanへ変更
デフォルトだと、仮想ネットワークが構築されて、それがホストに作られたブリッジインターフェース経由で外に出られるようになっていて、ホストから ssh 接続ができる状態。
これだと、外から uc01 へsshしたりは出来ない。

/var/lib/lxc/uc01/configを以下のように変更
 lxc.network.type = veth
 lxc.network.link = lxcbr0
 ↓
 lxc.network.type = macvlan
 lxc.network.link = em1 ← 普通はeth0とかになるところ。自分のShuttleではem1なのだ。

ホストの物理インターフェースに接続される。dhcpもいつものルータが担う。
ホストと同じように固定IP設定も普通にできる。

再起動
$ sudo lxc-stop -r -n uc01

確認
$ sudo lxc-ls -f
ふむ。IPアドレスが 192.168.1.31 とかになった。
コンテナから外に出れる。外部から コンテナ(uc01)へssh出来る。
ただし! ホストからはsshもpingも出来ない。
macvlanモード設定でコンテナ同士でのアクセスは出来るようになる。が、ホストはダメです。

コンテナ削除
$ sudo lxc-destroy -n uc01

なくなりました。
ここまでは全然何の問題もないっすね。あっけない。けど、裏ではものすごい技術の集合体です。

----

ユーザ権限でコンテナ作成

いくつかホスト側で設定が必要らしいが、ubuntu 14.04 だとそのほとんどは済んでいて、簡単な設定ファイルを用意するだけでよいようだ。

ユーザホームディレクトリ
$ mkdir .config/lxc
$ cp /etc/lxc/default.conf .config/lxc
$ echo "lxc.id_map = u 0 100000 65536" >> .conifig/lxc/default.conf
$ echo "lxc.id_map = g 0 100000 65536" >> .conifig/lxc/default.conf

lxc.id_mapへは、/etc/subuid と /etc/subgid に書かれているユーザのサブIDを設定する。
このsubuidとかはubuntuでは普通にユーザを作成すると作られている情報。

/etc/lxc/lxc-usernet ファイルに追記
$ sudo echo "user veth lxcbr0 10" >> /etc/lxc/lxc-usernet

"user"にvethでlxcbr0を使うコンテナを10個作れる。という特権を与える設定。
vethしかダメらしい。

作成(ユーザコンテナの場合、テンプレートには download しか選べない)
$ lxc-create -n ubu01 -t download

すると、どのディストリビューション入れる?って対話で聞いてくるので、それにそって入れても良いし、分かっているなら以下のようにオプション指定してもいい。

$ lxc-create -n ubu01 -t download -d ubuntu -r trusty -a amd64
ってな感じ。
ダウンロードイメージは毎日ビルドされているものをwgetで取得してくるようだ。

起動
$ lxc-start -n ubu01 -d

$ ps aux でプロセスを見てみると、UIDが100000位上のプロセスが10数個立つ。これがユーザコンテナのプロセスだろう。lxcはホストのカーネルプロセスの一部として動くので混ざるわけだ。

実はこの時ちゃんと起動しなくて、cgmanagerがエラーを出してクラッシュした。
何か設定が悪いのか?と調べてみたところ、lxcかcgmanagerのちょっとしたバグ?なのだろうか
ホストを再起動したら、直った。

起動してもログイン出来ないよ
ルート用テンプレートとは違い、sshdも入らないし、ubuntuユーザに初期パスワード設定されていないので、起動してもログイン出来ないのだ。これはセキュリティのための対処らしい。

ubuntuユーザにパスワード設定
$ lxc-attach -n ubu01 -- sudo passwd ubuntu

lxc-attachはコンテナにデフォルトユーザでログインしたつもりで外からコマンドを実行出来る。
親切にもダウンロードコンテナ作成するとその辺のガイドとかが表示される。

書いておきながら何だけど、デフォのubuntuユーザは触らずに、新たに作ったほうがいいと思う。

$ lxc-attach -n ubu01 -- sudo adduser user1
$ lxc-attach -n ubu01 -- sudo adduser user1 sudo

な感じで。

因みに、ユーザ起動コンテナのネットワークタイプはデフォルトの veth じゃないとだめらしい。
外に出れる。ホストからアクセスできる。が、外からはアクセス出来ないってこと。
セキュリティ的には良いが、外からアクセス出来ないとちょっとつまらないので、何とかしよう。