仮想環境(2)

Date: 2021/01/08 (initial publish), 2021/07/13 (last update)

Source: jp/note-00027.md

Previous Post Top Next Post

TOC

chrootを使ってのデバグ用のsid仮想環境作成をpbuilder/cowbuilderでと言うのは 少々強引です。とはいえ直接chrootやmountコマンドで仮想環境作成というのも 面倒です。

そこで、chrootの強化版のような環境設定インフラが整ったLXCを使ってのパッケージ 作成やデバグ用や古い環境下での動作確認等に使え、システムの立ち上げや動作が 軽快な仮想環境作成を試みます。(KVMは悪くは無いですが、重いことは否めません)

ちなみに、DebianではLXDはまだパッケージされていないので、ここでは裸の LXC 4.0 のインフラを使います。

WEB上のLXCの情報は古い1.0や2.0の情報とか、新規のUIを提供するLXDの情報が多い ので、bulleseyeベースの現行testing環境で基本操作を行って詳細の確認しています。

Debianの最新のLXC環境を確認するには、まず/usr/share/doc/lxc/README.Debianを しっかり読む必要があります。ここに書かれたユーザー権限で実行されるコンテナ (unprivileged containers) 関連の手動設定は重要です。

まずは、簡単なROOT権限で実行されるコンテナ中心に始めます。

LXC仮想環境作成

LXCを使ってのパッケージ作成やデバグ用等に使うsid環境の仮想環境作成を試みます。

 $ sudo lxc-create -n sid -t debian -- -r sid

もし、ミラーが不調なら、安定そうなUSミラーを使います。

 $ sudo lxc-create -n sid -t debian -- -r sid --mirror=http://ftp.us.debian.org

意外と簡単です。これで、/var/lib/lxc/sid/が作成されます。この中に、sidコンテナ 環境のファイルシステムがrootfsディレクトリー以下に、またそのコンテナ環境の設定 ファイルconfig が作成されています。

コンテナ環境のファイルシステム:

 # root@goofy:/var/lib/lxc/sid# tree -L 2 -F
.
├── config
└── rootfs/
    ├── bin -> usr/bin/
    ├── boot/
    ├── dev/
    ├── etc/
    ├── home/
    ├── lib -> usr/lib/
    ├── lib32 -> usr/lib32/
    ├── lib64 -> usr/lib64/
    ├── libx32 -> usr/libx32/
    ├── media/
    ├── mnt/
    ├── opt/
    ├── proc/
    ├── root/
    ├── run/
    ├── sbin -> usr/sbin/
    ├── selinux/
    ├── srv/
    ├── sys/
    ├── tmp/
    ├── usr/
    └── var/

コンテナ環境の設定ファイルconfig:

root@goofy:/var/lib/lxc/sid# cat config
# Template used to create this container: /usr/share/lxc/templates/lxc-debian
# Parameters passed to the template: -r sid --mirror=http://ftp.us.debian.org/debian
# For additional config options, please look at lxc.container.conf(5)

# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)

lxc.net.0.type = veth
lxc.net.0.hwaddr = 00:16:3e:c6:d4:c8
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1
lxc.rootfs.path = dir:/var/lib/lxc/sid/rootfs

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# Container specific configuration
lxc.tty.max = 4
lxc.uts.name = sid
lxc.arch = amd64
lxc.pty.max = 1024

この各設定パラメーターの意味はlxc.conf(5)やlxc.container.conf(5)や lxc.system.conf(5)で確認しましょう。

上記のlxc-createの実行の際に、sidと指定したところで、他のbuster等 を指定すると対応するリリースのコンテナ環境が作成できます。

LXC仮想環境をシステムとして起動

このsid仮想コンテナ環境をシステムとして起動します。

$ sudo lxc-start -n sid

上記でlxc-startを実行をすると、起動された仮想環境コンテナのプロセスは daemon化してバックグラウンドで実行されつづけています。

起動された仮想環境コンテナのプロセスの状態は以下で確認できます。

$ sudo lxc-info -n sid
Name:           sid
State:          RUNNING
PID:            149576
IP:             10.0.3.212
Link:           vethpRy1Bk
 TX bytes:      1.18 KiB
 RX bytes:      3.20 KiB
 Total bytes:   4.39 KiB

LXC仮想環境にシェルアクセス

よくlxc-consoleを使いLXC仮想環境システムに入るHOWTOをWEB上に見かけますが、 現在のテンプレートファイルで作成されるDebianのLXC仮想環境では無理です。それは、 rootを含めた全アカウントがデフォルトではログインできないように/etc/passwdが 設定されているからです。

この起動された仮想環境コンテナ内にroot権限のシェルアクセスは以下でします。

$ LC_ALL=en_US.UTF-8 sudo lxc-attach -n sid
root@sid:/#

このshellプロンプトから好きなコマンドが純粋の英語のsid環境下で実行できます。

LXC仮想環境のカスタマイズ例

さすがにデフォールトインストールのLXCコンテナーのままでは使いにくいので いくつかのパッケージをインストールしてみます。

root@sid:/# apt update; apt full-upgrade
 ...
root@sid:/# apt install aptitude mc vim nano-
 ...
root@sid:/# apt install build-essential devscripts debhelper
 ...

ここでは、以下をしています。

ホストシステムのuid=1000のアカウントとの連携を考え同名のアカウント (ここでは、fish)を作成します。

root@sid:/# adduser fish
Adding user `fish' ...
Adding new group `fish' (1000) ...
Adding new user `fish' (1000) with group `fish' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for fish
Enter the new value, or press ENTER for the default
	Full Name []: Fish Eater
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n] y
root@sid:/#

これで開発用に使いやすそうな環境が準備できました。

ここで、rootのパスワードを設定するか、sudoパッケージを導入しユーザー アカウントからrootへ移行できるように設定しておくのも一案です。

この仮想環境コンテナ内のshellプロセスを終了し、親システムのshellプロンプトに 戻るのは、普通にここでCTRL-Dとプロンプトに入力します。

LXC仮想環境にlxc-console経由でシェルアクセス

上記でパスワードがあるユーザーアカウントができたのでLOGINが出きるようにな っています。

$ sudo lxc-console -n sid -t 0

Connected to tty 0
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself
fish
Password:
Linux sid 5.10.0-1-amd64 #1 SMP Debian 5.10.4-1 (2020-12-31) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
fish@sid:~$

ここでsid login:と言ったプロンプトが見えませんが、アカウント名fishを入力すると ちゃんとログインできています。

この仮想環境コンテナ内のshellプロセスを終了し、親システムのshellプロンプトに 戻るのは、ここでCTRL-Aの後qと2つのキーをプロンプトに入力します。

ここで上記コマンド実行時は-t 0を忘れずにつけ/dev/consoleを利用するようにします。 ここは気付かないと意外と悩みます。

仮想環境のリストや状況の確認

システム上に作成されたアクセス可能なコンテナ環境のリストと、その情報の確認は、 親システムから例えば以下とすると可能です。

$ sudo lxc-ls
buster sid
$ for l in `sudo lxc-ls` ; do sudo lxc-info info -n $l ; echo "----"; done
Name:           buster
State:          STOPPED
----
Name:           sid
State:          RUNNING
PID:            786174
IP:             10.0.3.219
Link:           vethE48S2c
 TX bytes:      3.08 MiB
 RX bytes:      216.65 MiB
 Total bytes:   219.73 MiB

この例では、2つのアクセス可能なコンテナ環境があり、その内1つが実行中(RUNNING)で 他の1つが停止中(STOPPED)です。

実は、アクセス可能なコンテナ環境の俯瞰的リストを得るだけなら、もう少し簡単に できます。

$ sudo lxc-ls -f
NAME   STATE   AUTOSTART GROUPS IPV4       IPV6 UNPRIVILEGED
buster STOPPED 0         -      -          -    false
sid    RUNNING 0         -      10.0.3.219 -    false

ちなみに、コンテナ環境の特定の設定パラメーターの個別確認もできます。

$ sudo lxc-info -n sid -c lxc.uts.name -c lxc.rootfs.path -c lxc.rootfs.mount -c lxc.net.0.link
lxc.uts.name = sid
lxc.rootfs.path = /var/lib/lxc/sid/rootfs
lxc.rootfs.mount = /usr/lib/x86_64-linux-gnu/lxc/rootfs
lxc.net.0.link = lxcbr0

他のLXCコンテナ環境の基本操作

Previous Post Top Next Post