LXCの非特権コンテナの移行

ゴール

  • 旧サーバにあるRedmineコンテナとMySQLコンテナを新サーバに移行

前提

参考リンク

kurochan-note.hatenablog.jp

旧サーバでやること

コンテナの停止

$ lxc-stop -n mysql
$ lxc-stop -n redmine

コンテナをtarで固める

$ cd /home/container/.local/share/lxc
$ sudo tar zcvf $HOME/mysql.tar.gz mysql
$ sudo tar zcvf $HOME/redmine.tar.gz redmine

↑sudoつけておく。使用するソフトウェアによっては自動的に独自のユーザを作ることもあり、所有者がバラバラでも正常に固めるため。

tarの転送

$ scp mysql.tar.gz redmine.tar.gz container@{移行先ホストのIP}:

コンテナ用DHCPファイルも移行

$ scp /etc/lxc/dnsmasq.conf container@{移行先ホストのIP}:

新サーバでやること

tarの展開

$ mkdir -p /home/container/.local/share/lxc
$ sudo tar --numeric-owner -xpzf /home/container/mysql.tar.gz -C /home/container/.local/share/lxc
$ sudo tar --numeric-owner -xpzf /home/container/redmine.tar.gz -C /home/container/.local/share/lxc

↑sudoつけること!忘れると所有者情報が更新されてしまう。

パーミッションの設定

$ sudo chown :container /home/container/.local/share/lxc/{mysql,mysql/config}
$ sudo chown :container /home/container/.local/share/lxc/{redmine,redmine/config}

.local/share/lxc/{mysql,redmine}になるように配置できていればOK。いなければ適宜配置。

lxcインストール

非特権で動かせるように。DHCPの設定をしてる場合はそれもする。

コンテナで使用しているsub uid/gidを確認

# cat /home/container/.local/share/lxc/mysql/config | grep lxc.id_map
lxc.id_map = u 0 165536 65536
lxc.id_map = g 0 165536 65536

sub uid/gidの追加

# sudo usermod -v 165536-231071 -w 165536-231071 container
↑確認したsub uid/gidから65535足した数値の範囲

おわり

移行完了。念のため一度再起動しておく。 確認として、移行先で

$ lxc-ls --fancy
NAME          STATE    IPV4        IPV6  AUTOSTART
--------------------------------------------------
mysql         STOPPED  -           -     NO
redmine       STOPPED  -           -     NO
$ ls -l /home/container/.local/share/lxc/mysql
total 16
drwxrwx---  3    165536 container 4096 May 13 01:18 ./
drwxr-xr-x  9 container container 4096 May 18 21:51 ../
-rw-rw-r--  1 container container  701 May 13 01:18 config
drwxr-xr-x 21    165536    165536 4096 May 18 19:56 rootfs/

となっていればOK。ほかのユーザとsub uid/gidが被ることがあるが大丈夫なのかなあ…

Redmine を LXC on Ubuntu 14.04で動かす

ゴール

使用した環境

  • OS: Ubuntu 14.04.2 Server
  • ユーザー名: ubuntu
    • あとでcontainerというユーザーを作成する

簡単な流れ

  • 非特権コンテナの準備
  • コンテナ作業
  • ホスト側でNginxの設定

作業ログ

コンテナ準備

パッケージの更新

$ sudo apt-get update && sudo apt-get -y dist-upgrade

タイムゾーンの設定

$ cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime 

/etc/timezoneの中身をAsia/Tokyoに変更

パスワード生成&アカウント作成

$ cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8 && echo
$ sudo adduser container

LXCインストール

sudo apt-get install -y lxc systemd-services

↑systemd-servicesがないと非特権で動作しなかった

このときのsubuid/subgid

$ cat /etc/subuid /etc/subgid
ubuntu:100000:65536
container:165536:65536
ubuntu:100000:65536
container:165536:65536

lxc-usernetの設定

$ vim /etc/lxc/lxc-usernet
$ cat /etc/lxc/lxc-usernet
# USERNAME TYPE BRIDGE COUNT
container veth lxcbr0 20

containerユーザに切り替え

ubuntu@pkmine:~$ sudo -i -u container
container@pkmine:~$

一般ユーザでコンテナを扱えるようにする設定

container@pkmine:~$ mkdir -p .config/lxc
container@pkmine:~$ cp /etc/lxc/default.conf .config/lxc/
container@pkmine:~$ vim .config/lxc/default.conf
container@pkmine:~$ cat .config/lxc/default.conf
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx

lxc.id_map = u 0 165536 65536
lxc.id_map = g 0 165536 65536
container@pkmine:~$

★最後の2行を追記。/etc/subuid, subgidの設定と合うように書く。

dnsmasqでコンテナに固定IPを降る設定

(containerユーザからログアウトしておく) 1.dnsmasq.confを読み込むようにする

ubuntu@pkmine:~$ sudo cp /etc/default/lxc-net{,.bak}
ubuntu@pkmine:~$ vim /etc/default/lxc-net
ubuntu@pkmine:~$ diff /etc/default/lxc-net{,.bak}
24c24
< LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
---
> #LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
ubuntu@pkmine:~$

2.DHCP情報を書く

ubuntu@pkmine:~$ vim /etc/lxc/dnsmasq.conf
ubuntu@pkmine:~$ cat /etc/lxc/dnsmasq.conf
dhcp-host=redmine,10.0.3.10
dhcp-host=mysql,10.0.3.11

コンテナ作成

containerユーザーで行う。ここではMySQLRedmineを動かすためのコンテナを用意する。ディストリはホスト同様Ubuntu14.04を使用する。

$ lxc-create -n mysql -t download -- --dist ubuntu --release trusty --arch amd64
$ lxc-create -n redmine -t download -- --dist ubuntu --release trusty --arch amd64

コンテナ起動

sudo -i -u containerでユーザー切り替えを行うとコンテナが起動しなかったため、ssh container@localhostとしてログインし直すことで可能となった。

$ lxc-start -n mysql -d
$ lxc-start -n redmine -d
  • -dを付けることでデーモンとして起動してくれる。これを忘れるとフォアグラウンドで立ち上がってしまいログインプロンプトが出てくる。デーモンとして起動した場合は自動的にrootでログインされる。

Redminemysql構築

コンテナに入る

$ lxc-attach -n mysql
root@mysql#

MySQLのインストールと初期設定

# apt-get update
# apt-get install mysql-server mysql-client
  • rootパスワードは空欄にした
# mysql_secure_installation
 - Enter current password for root (enter for none): [Enter]
Set root password? [Y/n] Y
 -> password

Remove anonymous users? [Y/n]
 ->[Enter]
Disallow root login remotely? [Y/n]
 ->[Enter]
Remove test database and access to it? [Y/n]
 ->[Enter]
Reload privilege tables now? [Y/n]
 ->[Enter]

Redmine用DB作成と資格情報の設定

  • 作成するDB名: db_redmine
  • 作成するユーザー名: redmine
  • パスワード: password
# mysql -uroot -p
Enter password:
mysql> create database db_redmine default character set utf8;
mysql> grant all on db_redmine.* to redmine@localhost identified by 'password';
mysql> grant all on db_redmine.* to 'redmine'@'%' identified by 'password'; 
mysql> exit

my.cnf設定

# vim /etc/mysql/my.cnf

[mysqld]セクション内に character-set-server=utf8 を追記。 また、

bind-address: 127.0.0.1#bind-address: 127.0.0.1

とする。

[mysql]セクション内に

default-character-set=utf8

を追記。

MySQLの再起動

# service mysql restart

コンテナ起動時に自動で実行されるようにする

# update-rc.d  mysql defaults

確認

# mysql -uroot -p
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

Redmine 3.0.3 インストール

mysqlコンテナから抜け(シェルから抜ければOK)redmineコンテナに移る(lxc-attach -n redmine)。

必要となるパッケージのインストール

# apt-get update
# apt-get install -y wget build-essential libffi-dev libyaml-dev zlib1g-dev openssl libssl-dev mysql-client libmysqlclient-dev libcurl4-openssl-dev curl

Rubyコンパイル&インストール

# cd /opt
# wget ftp://ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.0.tar.gz
# tar zxf ruby-2.2.0.tar.gz
# cd ruby-2.2.0 && ./configure && make && make install

使用するgemのインストール

# gem install bundle passenger --no-ri --no-rdoc

Redmineダウンロード&展開

# cd /opt
# wget http://www.redmine.org/releases/redmine-3.0.3.tar.gz
# tar zxf redmine-3.0.3.tar.gz

DB接続設定

# cd redmine-3.0.3/config
# cp database.yml{.example,}
# vim database.yml

↓のように変更

production:
  adapter: mysql2
  database: db_redmine
  host: 10.0.3.11
  username: redmine
  password: "password"
  encoding: utf8

Redmineに必要なライブラリのインストール

# cd /opt/redmine-3.0.3/
# bundle install --without development test --path vendor/bundle

もしrmagickが必要と怒られた場合

# apt-get install imagemagick libmagickcore-dev libmagickwand-dev
# bundle install --without development test --path vendor/bundle

IPAフォントのインストール

# apt-get install fonts-ipafont

Redmine設定

# cp configuration.yml{.example,}
# vim configuration.yml

↓追記部分(行頭の数字は行数を表す)

82   autologin_cookie_name: redmine_autologin
83   autologin_cookie_path: /redmine/
84   autologin_cookie_secure: true
197   rmagick_font_path: /usr/share/fonts/truetype/fonts-japanese-gothic.ttf

Redmine初期設定

# bundle exec rake generate_secret_token
# RAILS_ENV=production bundle exec rake db:migrate
# bundle exec rake redmine:load_default_data RAILS_ENV="production"

↑3番目はデフォルトデータの読み込み。言語を聞かれるので"ja"を入力する。

Passengerのインストール

# gem install passenger --no-rdoc --no-ri
# passenger-install-nginx-module

nginxをコンパイルしてもらう。/opt/nginxに展開してもらう。基本的にはずっとEnter。

Nginxの設定

# cd /opt/nginx/conf
# vim nginx.conf

以下の通りに設定した。

server {
        ...
        location /redmine {
            index  index.html index.htm;
            root /opt/redmine-3.0.3/;
            passenger_enabled on;
            passenger_base_uri /redmine;
            passenger_app_root /opt/redmine-3.0.3/;
        }
        ...
}

nginxのinitスクリプトはどこかから落とす。 このあたりとか。 * https://gist.github.com/hisea/1548664

SSL通信の有効化

オレオレ証明書から始めてみる。

コンテナから抜け、ホスト上で操作する

nginxインストール

$ sudo apt-get install nginx

オレオレ証明書自己署名証明書)の作成

$ sudo mkdir /etc/nginx/ssl
$ sudo openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key
$ sudo chmod 700 /etc/nginx/ssl

Nginxコンフィグ

$ sudo vim /etc/nginx/sites-available/default-ssl
server {
        listen 443;
        server_name localhost;

        root html;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/nginx.pem;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        ssl_session_timeout 5m;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
        ssl_prefer_server_ciphers on;

        location / {
                try_files $uri $uri/ =404;
        }

        include /etc/nginx/sites-available/default-location-ssl/*;
}

↑default-sslはsites-enableにシンボリックリンクを張る

$ sudo vim /etc/nginx/sites-available/default
server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.html index.htm;

        server_name localhost;

        location / {
                try_files $uri $uri/ =404;
        }
        include /etc/nginx/sites-available/default-location/*;
}

不要なコメントアウトは見づらいので消しておく。

include対象のディレクトリを作成

# mkdir /etc/nginx/sites-available/default-location
# mkdir /etc/nginx/sites-available/default-location-ssl

まずはsslの設定から

$ sudo vim /etc/nginx/sites-available/default-location-ssl/redmine

新規作成。

location /redmine {
  index index.html index.htm;
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_pass http://10.0.3.10;
  proxy_redirect off;
}

↑proxy_passの部分にはコンテナのIPアドレスを入れる。

httpアクセス時の設定

$ sudo vim /etc/nginx/sites-available/default-location/redmine
location /redmine {
  rewrite ^ https://$http_host$request_uri? permanent;
}

SSL v3の無効化

$ sudo vim /etc/nginx/nginx.conf
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
↓
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
(Poodle対策)

nginxの再起動

# service nginx restart

エラーが起きた場合は/var/log/nginx/以下参照。

おしまい

http://<サーバアドレス>/redmineにアクセスしてみるとhttpsに切り替わり、アクセスできるようになっている。

VMware ESXiにオンボードNIC I218-Vを認識させる

オンボードNICのドライバを読み込ませる

VMware KB: ホストのネットワーク カードが検出されない より

NICが認識されているかチェックする

~ # lspci -v | grep Ethernet
0000:00:19.0 Ethernet controller Network controller: Intel Corporation Ethernet Connection (2) I218-V
0000:05:00.0 Ethernet controller Network controller: Intel Corporation 82574L Gigabit Network Connection [vmnic0]

このとき"00:19"がPCIスロットとバス番号である。

NICのベンダーIDとデバイスIDを確認する

~ # lspci -n | grep 00:19
0000:00:19.0 Class 0200: 8086:15a1

ベンダーID…8086 デバイスID…15a1

VMware 互換性ガイドを確認する

VMware Compatibility Guide: System Search

なかった…けど

今回のI218-Vはサポートされていないようなので検索してみると、IntelのドライバをESXi用にビルドしたものを配布している方がいらっしゃいました。

ESXi5.1のドライバを作成してみる(intel I217/I218/82579LM/82574L編) | 環境さんぷる

ドライバのインストール

上のページではUSBメモリにコピーしているが、増設したNICは使えていたのでvSphere Clientを用いてデータストアにコピーした。 あとは上の記事の通りに行うと完了です。

自作PCにVMware ESXiをインストールした

お正月にちょっと奮発して自身初となる自作PCを手に入れた。そこにVMware ESXi5.5を導入した時にいくつかハマった部分があったのでメモ。

マシン構成(買ったもの)

  • M/B: ASUS H97-PRO
  • CPU: Intel Corei5 4590
  • RAM: Elixir DDR3 1600Mhz 8GBx2
  • HDD: WesternDigital Red 1TB
  • 電源: 玄人志向 KRPW-PT500W/92+
  • ケース: ZALMAN Z12-PLUS
  • NIC: Intel 82574L(余りもの)

これで保証込で73k円くらいでした。

やったこと

  1. ESXiをUSBメモリにインストール
  2. HDDを認識させた

インストール

ESXiインストールイメージのダウンロード

  1. http://www.vmware.com/jp/products/vsphere-hypervisor
  2. 上のリンクから辿ってダウンロードする。要登録。

USBメモリにインストール

  1. インストーラを起動
  2. インストール先にUSBメモリを指定する

ESXiはHDDにインストールするような手軽さでUSBメモリにインストールできる。

UEFIでは注意

isoイメージを落としてUSBメモリに書き込んでブートさせる…という流れでうまくいくとおもったが、isoイメージをUSBメモリに書き込んだところでFATパーティション作られてないことに気付いた。最近のマザーボードはデフォルトでUEFIが使われるため、ブートするにはFATパーティションEFI用のブートファイルを置く必要がある。

このマシン用に光学ドライブは購入していないし外付けドライブも持ってなかったので、別のMBRブートできるマシンを使ってブートさせ、USBメモリにインストールした。VirtualBoxとかでもUSBメモリの認識さえさせればインストールできるんじゃないだろうか(未確認)。

私の場合は、たまたま手元にHPのMicroServerがあってたまたまリモート管理カードを挿していたので、管理カード経由でisoイメージよりブートしてUSBメモリにインストールした。これ何気に便利。仮想KVMもあるしね。

HDDを認識させる

BIOSにて、SATA ModeをRAID Modeに変更する

ESXi 5.5 を MSI H97 GAMING 3 にインストール - いがぴょんの日記@はてな より

AHCI ModeからRAID Modeに変えるだけでESXiにストレージコントローラが認識されるようになる。ESXiは相性がかなりあるみたい。

データストアの作成

vSphere Clientから作るのが簡単っぽい。 以下のページが分かりやすかった。

ESXi サーバーに内蔵ハードディスクドライブをデータストアとして追加する / ESXi 4.0: “HP ML115 G5”と自作機で、できたこと

おわり

これでインスタンスは作成できるようになった。 無事に導入できたふうに書いたが、実はオンボードNICは認識されておらず増設したIntelNICしか認識されていない状態だった。 これを認識させる方法は後でまとめる予定。

今はこんな感じで動いている。

f:id:jackson58:20150109002310p:plain

OpenStackのdiskimage-buiderにdib-run-partsが含まれなくなった

OpenStack Ironicで使用するディスクイメージを作成するためにdiskimage-builderを使ったところ、dib-run-partsが見つからないと怒られた。そのときにしたことをメモ。

まず

https://review.openstack.org/#/c/100004/ コミットメッセージより

Use dib-run-parts from dib-utils


Now that dib-run-parts has been moved to the dib-utils project, we
need to update diskimage-builder to use it instead of the version
directly in diskimage-builder.

This change removes the old copy of the dib-run-parts script in
the element, adds dib-utils as a dependency of diskimage-builder,
and updates the uses of dib-run-parts to correctly handle the fact
that it is now external to the project.

dib-utils

今までdiskimage-builderリポジトリにあったdib-run-partsは新しくdib-utilsというリポジトリに移ったらしい。

というわけでdib-utilsをcloneしてインストールしてみた。

$ git clone https://github.com/openstack/dib-utils.git
$ cd dib-utils && ./setup.py build && sudo ./setup.py install

これでシステムにdib-run-partsがインストールされ無事にdiskimage-builderも使えるようになった。

おわり

検索していてこのリンクを見つけたときに投稿日時が2014-09-17というちょうどきょうから1週間前の報告で少し驚いた。開発も活発に行われ、10月には最新バージョンのJunoもリリースされる。色々と遊んでみたい。

DevCloud2でお試しCloudStack環境構築

DevCloud2という仮想アプライアンスを使ってCloudStackのセットアップをしているときにいくつか詰まった点があったのでメモ。

お世話になったサイト

構築

次のページの通りに構築しました。 http://www.slideshare.net/samemoon/20131019-osc-tokyoss

  1. VirtualBoxのインストール

  2. DevCloud2 仮想アプライアンスをダウンロード

  3. ログイン

  4. sudoのインストール

    root@devcloud:~# apt-get update && apt-get install sudo
    
  5. gitでCloudStackのソースを取得

    # git clone https://git-wip-us.apache.org/repos/asf/cloudstack.git
    

    今回は上のスライド通りに構築を行ったのでバージョンは4.2.0を使う。

    # cd cloudstack && git checkout -b 4.2.0 refs/tags/4.2.0
    
    • 他のバージョンを使う場合は# git tag -lとすることで一覧を見ることができる
  6. 管理サーバーのビルド

    ~/cloudstack# mvn -P developer,systemvm clean install
    
    • 時間かかる
  7. データベースのデプロイ

    ~/cloudstack# mvn -P developer -pl developer,tools/devcloud -Ddeploydb
    
  8. 管理サーバーを起動

    ~/cloudstack# mvn -pl :cloud-client-ui jetty:run
    

    以上のコマンドを打てば起動するのだがコンソールにエラーが吐かれた。
    java.lang.OutOfMemoryError :PermGen Space

  9. 管理画面にログイン
    http://192.168.56.10:8080/client

    • admin/password
    • 管理サーバーを起動処理に時間がかかるのですぐには開けないかも
    • 初期設定ウィザードはスキップ
  10. ゾーン作成

    • パッケージ導入
      ~/cloudstack# pip install mysql-connector-python
      ~/cloudstack# pip install requests
      
    • ゾーン作成
      ~/cloudstack# mvn -P developer -pl tools/devcloud -Ddeploysvr
      
  11. グローバル設定の変更
     再び管理画面にログインしインフラストラクチャを見てみると数値が変化しているのがわかる。
     これで完成!だと思ってたのにコンソールにはNo running ssvm is foundというエラー。TinyLinuxというテンプレートもいつまでたっても利用可能にならない。

おわり

 メモリ不足とストレージサーバーにつながらない問題に時間を取られてしまったが、これで一通り構築が終わった。いろいろと触って遊んでいきたい。