CentOS環境を debootstrap的な方法で作成する

Linux

CentOS 6.5が出たので、全世界の準仮想マシン愛好家のためインストーラを使わずにセットアップする方法を記す

ホスト環境で yumと rpmを利用可能にする

CentOSをdebootstrap的にセットアップするにはホストOS上にyumとrpmが必要となるのでインストールする。yumやrpmRedHat系のパッケージ管理ツールだが他の Linuxディストリビューションでも多くの場合利用可能だ。

Gentoo Linuxの場合、python と lua の USEフラグを付けて rpmをインストールする必要がある。

USE="python lua" emerge yum rpm

centos-releaseパッケージRPMのURLを特定する

CentOSのパッケージ配布ディレクトリから、centos-releaseパッケージのRPMを探し出してそのURLを控える。

CentOS 6.5 32bitのパッケージ配布元例

http://ftp.kddilabs.jp/pub/Linux/distributions/CentOS/6.5/os/i386/Packages/

CentOS 6.5 64bitのパッケージ配布元例

http://ftp.kddilabs.jp/pub/Linux/distributions/CentOS/6.5/os/x86_64/Packages/

例えば、32bit版CentOS 6.5の centos-releaseパッケージは下記のようなURLで参照できる。

http://ftp.kddilabs.jp/pub/Linux/distributions/CentOS/6.5/os/i386/Packages/centos-release-6-5.el6.centos.11.1.i686.rpm

アーキテクチャ合わせ

64bit環境をセットアップする場合この手順は必要ない

64bitのホスト環境上で32bitのCentOSをセットアップする場合、そのままだとyumがホスト環境と同じ64bitのパッケージをインストールしようとしてしまい失敗するので、作業の前に /usr/bin/i386 コマンドで 32bit環境をシミュレートする状態へ移行しておく必要がある。そのためには単にコマンドラインから

i386

と入力するだけで良い(uname -aで i686 という文字列が表示されるので32bit環境だとわかる)。作業終了後、32bitシミュレーション環境から抜けるには exit する。

作業ディレクトリの作成とcentos-releaseパッケージのインストール

CentOS環境を作成するためのディレクトリを作成し、そこ(--rootオプションで指定)にパッケージマネージャのためのデータベースを作成する。

mkdir -p /tmp/centos/var/lib/rpm
rpm --root /tmp/centos --initdb

次に、先刻URLを特定した centos-releaseパッケージを rpmコマンドでインストールする。

rpm -ivh --nodeps --root /tmp/centos http://ftp.kddilabs.jp/pub/Linux/distributions/CentOS/6.5/os/i386/Packages/centos-release-6-5.el6.centos.11.1.i686.rpm

yumのインストール

centos-releaseパッケージがインストールされたら、続いて(ホスト環境の)yumを使って(ターゲット環境に)yumをインストールする。rpmコマンドでは --root だったオプションが yumコマンドでは --installroot になることに注意。

yum --nogpgcheck --installroot /tmp/centos install -y yum

yumをインストールすることにより、CentOSの動作に最低限必要なパッケージのほとんどが依存関係により芋づる式にインストールされるので chrootコマンドで CentOS内 に移行できる。

chroot /tmp/centos

rpmデータベースの再構築

以降は chrootされた状態での作業となる

ここまでの構築作業はホスト環境の yumや rpmを使用して行ったため、パッケージデータベースのフォーマットがターゲット環境のバージョンと合わないことがある。コマンドラインから yumを起動してみるとエラーになるのですぐにわかる。

# yum --version
rpmdb: /var/lib/rpm/Name: unexpected file type or format
error: cannot open Name index using db3 - Invalid argument (22)
  :

仕方が無いのでパッケージデータベースを削除・初期化して centos-releaseパッケージおよび yum(と、依存パッケージ全て)を(今回構築している CentOS内のrpmやyumを使って)もう一度インストールしなおすことにする。二度手間ではあるがこれが一番手っ取り早い。

データベースを削除して再作成

rm /var/lib/rpm/*
rm -rf /var/cache/yum
rpm --initdb

インターネット経由でパッケージをダウンロードできるように適当なネームサーバを設定 (8.8.8.8は Google社が一般公開しているDNSサーバ)

echo "nameserver 8.8.8.8" > /etc/resolv.conf

centos-releaseおよび yumの再インストール

rpm -ivh http://ftp.kddilabs.jp/pub/Linux/distributions/CentOS/6.5/os/i386/Packages/centos-release-6-5.el6.centos.11.1.i686.rpm
yum install -y yum

その他最低限必要なもののインストール

yumとその依存パッケージだけでOSの機能の大部分は揃うが、いくつか足りないものがあるので追加でインストールする(特にinitscripts、これがないとシステムを起動できない)。

yum install -y vim-minimal less initscripts passwd

後の作業のため、passwdコマンドで rootのパスワードを設定する(又は /etc/shadowを編集してrootのパスワードを削除する)

XenのPVドメインとして動作させるための追加作業

  • /etc/sysconfig/init ファイルの ACTIVE_CONSOLES=行を ACTIVE_CONSOLES=/dev/hvc0 に書き換える
  • /etc/init/serial.conf ファイルを削除する
  • ネットワーク設定ファイル /etc/sysconfig/network/etc/sysconfig/network-scripts/ifcfg-eth0 を作成する
  • BOOTPROTO=dhcp を利用する場合は dhclient パッケージをインストールする
  • /etc/securettyhvc0 を追加
  • 64bit PVカーネルで32bitの CentOS domUを起動する場合、/etc/rpm/platformファイルに i686-centos-linuxと書き入れることで yumが 64bitではなく32bitのパッケージを検索するようにする
  • 適当な /etc/fstab ファイルを作成する
  • PVドメインのファイルシステム内にカーネルを配置する場合はカーネルをインストールし、pvgrub用の menu.lstを作成 (CentOSの標準カーネルがPVドメイン用のカーネルとして使用できるかどうかは未検証)

キャッシュなどのクリーンナップ

yumで自動ダウンロードされたパッケージはキャッシュに保存される。これは容量の無駄なので削除する。

yum clean -y all

オチ

RedHat Enterprise Linux(RHEL) 6.5の Sambaで force userオプションが効かないというひどいバグが CentOS 6.5でも忠実に再現することが判明し、当社では CentOS 6.5の採用を見送りとしました。

参考記事

Thomas (Tom) Baumann - tiri » virtualization: debootstrap+rhel+chroot+centos

同じカテゴリの記事

glibcのgethostbyname関数に存在するCVE-2015-0235(GHOST)脆弱性について 2015年1月28日
DFSがどうこうと言われて Sambaの共有にアクセスできなくなった時の対処 2015年1月21日
Linuxをクラッシュさせられるバグが権限昇格のバグに進化した件 2014年12月18日
Linux 3.18リリース 2014年12月8日
BASHの脆弱性でCGIスクリプトにアレさせてみました 2014年9月25日

お勧めカテゴリ

英語でアニメ観ようず
なじみ深い日本製アニメの英語版DVDで、字幕と音声から英語を学びましょうという趣旨のシリーズ記事です。
ScalaのようでJavaだけど少しScalaなJSON API
Scalaと Spring Frameworkを使って REST的なJSON APIを実装してみましょう。
ドクジリアン柔術少女 すから☆ぱいそん
代表 嶋田大貴のブログです。写真は神仏に見せ金をはたらく罰当たりの図