chroot

2012年11月01日

このエントリーをはてなブックマークに追加

複数ディストリビューション対応へ向けて

ギーク達はfedora対応を希望

前回のエントリに反応してくれたギーク達は、CentOSよりもfedora対応を希望していた。『fedora対応…!』と思ったけども、fedoraを使ってないので良くわかってない。それよりは、複数ディストリビューション対応への準備体操として、CentOS 5対応に着手してみた。

検証環境

インストール
$ git clone git://github.com/hansode/vmbuilder.git
実行方法
$ cd vmbuilder/kvm/rhel/6/
$ sudo ./vmbuilder.sh --distro-name=**centos** --distro-ver=**5**

実行してから約10分程度で実行したディレクトリ直下に仮想マシンイメージが作成される。

2012/11/01現在の対応ディストリビューション

distro-name と distro-ver に指定可能な組み合わせは下記の通り。

  • centos 5 (5.x)
  • centos 6 (6.x)
  • sl 6 (6.x)

新規追加されるタイミングは、今の所、自分が欲しいと思う時か、聞こえて来る周りからの声。

問題点

rhel6環境でrhel5を構築すると、仮想マシンイメージを作成可能ではあるが、rhel5環境としては不完全だ。

  • 今のvmbuilder.shの仕様では、ホスト環境のyumコマンドでゲスト環境を構築する
  • ゲスト環境におけるrpmdbのフォーマットは、ホスト環境に依存する

個人的に困ってないので、しばらくの間は保留扱い。

改善案

検証すべき項目

  • ホスト環境とゲスト環境を一致させる
    • 例) rhel5用仮想マシンイメージを構築する場合は、rhel5環境で行う
  1. post installフェーズで、rpmdbを変換するなどの対応をする
  2. yumコマンドかyum.confにrpmdbのバージョン指定する方法があれば、指定してみる

上記のうち、 1 が良さそうなので、対応手段は、構築フェーズを分ける事だろうか。

  1. ゴールとなる仮想マシンをビルドする為のビルド環境(1次chroot環境) を構築
  2. 構築されたビルド環境(1次chroot環境)にて、ゲスト環境(2次chroot環境)を構築
  3. ホスト環境にてマシンイメージ化

これで対応出来そうな気がするので、あとは検証・実装するだけの事。この辺をしっかり実装しておかないと、fedora対応も大変そう。

あとがき

環境差異が発生するとは面白い事。

フィードバックなど

希望するネタ等、フィードバック、大歓迎です。

続きを読む


編集
@hansode at 13:30|PermalinkComments(0)TrackBack(0)

2011年03月30日

このエントリーをはてなブックマークに追加

PostgreSQLのインストールに失敗?

chrootを利用してVMイメージを作成している時、PostgreSQの環境が不十分である事に気付いた。 その内容は、コマンドの配置までは上手く行くが、設定ファイルとDBデータが構築されないと言う物。その為、postmasterが起動しない。どうにか問題を解決すべく、インストールスクリプトを追いかける旅が始まった。

原因調査の旅

▼検証環境

  • Ubuntu 10.04.2 Server LTS
  • postgresql 8.4.7-0ubuntu0.10.04

今回の問題は、/etc/postgresql/8.4/は/var/lib/postgresql/8.4/ が生成されていない事。そこで、/var/lib/postgresql/8.4/ を生成しているのはどこかを調査して行く。Debian系では/var/lib/dpkg/info/*.*inst を見れば検討が付く。

▼/var/lib/dpkg/info/postgresql-8.4.postinst

...省略...
    19      . /usr/share/postgresql-common/maintscripts-functions
    20
    21      configure_version $VERSION "$2"

/usr/share/postgresql-common/maintscripts-functionsを読み込んでいる事が分かる。

▼/usr/share/postgresql-common/maintscripts-functions

    17  # arguments:  
    18  configure_version() {
    19      VERSION="$1"
    20
    21      # Create a main cluster for given version ($1) if no cluster already exists
    22      # for that version and we are installing from scratch.
    23      [ "$VERSION" ] || { echo "Error: configure_version: need version parameter" >&2; exit 1; }
    24      if [ ! -d "/etc/postgresql/$VERSION" ] || [ -z "$(ls /etc/postgresql/$VERSION)" ] || \
    25         [ -z "$(ls /etc/postgresql/$VERSION/*/postgresql.conf 2>/dev/null)" ]; then
    26          [ "$2" ] || /usr/bin/pg_createcluster -u postgres $VERSION main || {
    27          echo "Error: could not create default cluster. Please create it manually with
    28
    29    pg_createcluster $VERSION main --start
    30
    31  or a similar command (see 'man pg_createcluster')." >&2
    32          }
    33      fi
    34
    35      _link_manpages "$VERSION" "postgresql-$VERSION" postmaster.1.gz
    36  }

29行目の「/usr/bin/pg_createcluster -u postgres $VERSION main」が該当するようだ。コマンドを実行してみる。

# /usr/bin/pg_createcluster -u postgres 8.4 main
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Error: The locale requested by the environment is invalid.
# echo $?
1

ロケールを要求しているようだ。ロケールを指定して再度実行してみる。

# export LC_ALL=C
# /usr/bin/pg_createcluster -u postgres 8.4 main
Creating new cluster (configuration: /etc/postgresql/8.4/main, data: /var/lib/postgresql/8.4/main)...
Moving configuration file /var/lib/postgresql/8.4/main/postgresql.conf to /etc/postgresql/8.4/main...
Moving configuration file /var/lib/postgresql/8.4/main/pg_hba.conf to /etc/postgresql/8.4/main...
Moving configuration file /var/lib/postgresql/8.4/main/pg_ident.conf to /etc/postgresql/8.4/main...
Configuring postgresql.conf to use port 5432...
# echo $?
0

成功した。環境変数「LC_ALL」が良い影響を与えたのが分かる。

あらかじめ環境変数「LC_ALL」を設定しておけば、apt-get時でも/var/lib/postgresql/8.4/を生成してくれる事を確認した。

# export LC_ALL=C
# apt-get install postgresql-8.4

あと書き

これ以降、自分のルールとして、chroot環境で作業をする際は「export LC_ALL=C」を実行するようにした。




編集
@hansode at 17:00|PermalinkComments(0)TrackBack(0)

2011年01月06日

このエントリーをはてなブックマークに追加

Bazzar用リポジトリを作る

▼要件定義

  • Bazzrをsftpで使用
    • ログインシェルは不要
  • 共通UNIXアカウント「bzr」を使用
  • 利用者は公開鍵を「bzr」に登録

▼検証環境

  • Ubuntu 10.04.1 LTS
  • OpenSSH 5.3p1-3ubuntu4
  • Bazzr 2.1.1-1

作業内容

リポジトリサーバ編

▼共通UNIXアカウント「bzr」を作成


$ sudo groupadd bzr
$ sudo useradd -g bzr -d /home/bzr -s /bin/false -m bzr

UNIXアカウント、UNIXグループ共に「bzr」とする。

▼chrooted sftp(chrooted ssh)環境設定


$ cd /etc/ssh
$ sudo cp -pi sshd_config sshd_config.0
$ sudo vi sshd_config

$ diff sshd_config.0 sshd_config
75c75,76
< Subsystem sftp /usr/lib/openssh/sftp-server
---
> #Subsystem sftp /usr/lib/openssh/sftp-server
> Subsystem sftp internal-sftp
77a79,82
>
> Match user bzr
> ChrootDirectory /home/chroot/bzr
> ForceCommand internal-sftp

$ sudo initctl restart ssh

▼chrooted sftp用ディレクトリを作成


$ sudo mkdir /home/chroot
$ sudo mkdir /home/chroot/bzr

▼bzrユーザーに公開鍵を登録


$ sudo su -m bzr
bzr$ cd /home/bzr
bar$ mkdir .ssh
bar$ chmod 700 .ssh
bar$ cd .ssh
bar$ cat <<EOS >> authorized_keys
...
(bzrユーザーの公開鍵をペースト)
...
EOS
bar$ chmod 600 authorized_keys

bar$ exit

▼bzrリポジトリを作成


$ cd /home/chroot/bzr
$ sudo mdkir repos
$ sudo chown bzr:bzr repos
$ sudo su -m bzr

bzr$ cd /home/chroot/bzr/repos
bzr$ bzr checkout lp:nova
[28075] 2011-01-06 07:23:58.313 INFO: Branched 521 revision(s).
Branched 521 revision(s).

bzr$ exit

ここではサンプルとして「nova」のブランチを作成している。

作業用サーバ編

▼必要に応じてsshクライアント設定


$ cd
$ vi .ssh/config
Host host
        Hostname bzr-host.example.com
        IdentityFile ~/.ssh/bzr.pem

ssh用設定はbzrコマンドで指定出来ないので.ssh/configで設定しておく。

▼sftp接続確認


$ sftp bzr@host
Connecting to host...
sftp> pwd
Remote working directory: /

sftp> ls -la
drwxr-xr-x    3 0        1002         4096 Jan  6 03:17 .
drwxr-xr-x    3 0        1002         4096 Jan  6 03:17 ..
drwxrwsr-x    3 1002     1002         4096 Jan  6 07:10 repos

sftp> ls -la repos/
drwxrwsr-x    3 1002     1002         4096 Jan  6 06:10 .
drwxr-xr-x    3 0        1002         4096 Jan  6 03:17 ..
drwxrwsr-x   13 1002     1002         4096 Jan  6 07:24 nova

sftp> quit

ログイン後、リモートワーキングディレクトリが「/」となっている。
「repos」ディレクトリ、及び「repos/nova/」を確認出来れば問題ない。

▼チェックアウト確認


$ bzr checkout sftp://bzr@host/repos/nova

作業環境にチェックアウト出来れば確認完了。


参考ページ




編集
@hansode at 16:35|PermalinkComments(0)TrackBack(0)