LXCで古いOSのイメージを作成する方法

技術情報

はじめに

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は使わないことに越したことがないわけですが・・・

コメント

タイトルとURLをコピーしました