はじめに
LXCのコンテナイメージは、デフォルトでもたくさん用意されているので、普通に使用する場合は困らないと思います。
ただ、古いOSがどうしても必要な場合もあります。(例えばリプレースできないで放置されたサーバとか・・・)
そういうときは、コンテナイメージがないときがあります。
例えばDebianはであれば、標準であるコンテナイメージはDebian6.0までですし、Ubuntuは14.04までです。
これより古いOSのコンテナが必要な場合は、自分で作らないといけません。
ただ、Debian系のOSの場合は、以外に簡単にカスタムコンテナを作成することができます。
用意するもの
用意するものは、この2つです。
- UbuntuなどのDebian系Linux (できれば最新)
- 作りたいコンテナのインストールディクスのisoイメージ
あくまでもUbuntu上でコンテナイメージを作成するので、古いOSの環境は必要あありません。必要なのはインストール用のisoイメージです。
作り方
作業用のUbuntuでdebootstrapをインストールします。
$ sudo apt install debootstrap
次に、作りたいOSのisoイメージを/mediaにマウントします。(マウント先はどこでもいいです)
そして、次のコマンドを実行します。(ここではDebian 5.0 lennyの64bit版のインストールディスクを使用しています)
# ubuntu でdebian5のisoイメージを/mediaにマウント後
$ sudo debootstrap --arch amd64 lenny /mnt/debinst file:/media/
$ sudo tar -cvzf rootfs.tar.gz -C /mnt/debinst .
$ nano metadata.yaml
architecture: "x86_64"
creation_date: 1458040200 # To get current date in Unix time, use `date +%s` command
properties:
architecture: "x86_64"
description: "Debian lenny"
os: "debian"
release: "lenny"
$ tar -cvzf metadata.tar.gz metadata.yaml
$ lxc image import metadata.tar.gz rootfs.tar.gz --alias debian-lenny
$ lxc launch debian-lenny debian-lenny
$ lxc list
+---------------+---------+------+---------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------------+---------+------+---------------------------------------------+-----------+-----------+
| debian-lenny | RUNNING | | fd42:a84:4e0b:d83:216:3eff:fe16:22b0 (eth0) | CONTAINER | 0 |
+---------------+---------+------+---------------------------------------------+-----------+-----------+
古いコンテナのイメージを作成することができました。
少し説明しますね。
lxcでインポートするために2つのtar.gzを作成する必要があります。一つはisoから作ったtar.gz、もう一つはmetadata.yamlの入ったtar.gzです。
最初にisoからイメージの入ったtar.gzを作成します。
ここではrootfs.tar.gz
という名前にしています。
$ sudo debootstrap --arch amd64 lenny /mnt/debinst file:/media/
$ sudo tar -cvzf rootfs.tar.gz -C /mnt/debinst .
次に、metadata.yamlの入ったtar.gzを作成しますが、metadata.yamlには、OSやアーキテクチャなどを記載します。
architecture: "x86_64"
creation_date: 1458040200 # To get current date in Unix time, use `date +%s` command
properties:
architecture: "x86_64"
description: "Debian lenny"
os: "debian"
release: "lenny"
creation_dateの項目は結構適当でも大丈夫です。
これをmetadata.tar.gz
にします。
$ tar -cvzf metadata.tar.gz metadata.yaml
最後にlxcへインポートします。
$ lxc image import metadata.tar.gz rootfs.tar.gz --alias debian-lenny
これで、古いOSもコンテナ化できます。今回はDebian 5.0でした。
コンテナ内のaptについて
さて、古いOSをコンテナ化できたんですが、実は問題があってDebianの古いOSのaptはすでにできなくなっています。aptのリポジトリを変更しても、リポジトリのキーの有効期限が切れています的なエラーが出て、何もインストールできないのです・・・
対策としては、Hostのサーバの時間を一時的に古くして、コンテナ内の時間をキーが切れるより前にすると、aptを動かす事ができました。
# Hostのサーバの時間をごまかす
$ systemctl stop systemd-timesyncd
$ sudo date -s "01/30 13:00 2015"
#Geustに入る
$ lxc exec debian-lenny /bin/bash
# リポジトリを書き換える
$ nano /etc/apt/sources.list
# 下記を追加
deb http://archive.debian.org/debian/ lenny main contrib non-free
deb-src http://archive.debian.org/debian/ lenny main contrib non-free
# apt
$ apt update
まとめ
古いOSがDebian系だったらコンテナ化することができるかもしれないので、試してみてください。もちろんそんな古いOSは使わないことに越したことがないわけですが・・・
コメント