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
...
ここでは、以下をしています。
- 最新パッケージへの更新で、システム環境整備
- パッケージ追加で、シェル操作環境整備 (好みに合わせ
vim
はemacs
でも可) - パッケージ追加で、Debianパッケージ作成環境整備
ホストシステムの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コンテナ環境の基本操作
lxc-stop
: コンテナ環境の停止 (lxc-start
の逆)lxc-freeze
: コンテナ環境の凍結lxc-unfreeze
: コンテナ環境の凍結解除lxc-destroy
: コンテナ環境の消去 (lxc-create
の逆)lxc-copy
: コンテナ環境の複製と起動 (使い捨てLXCコンテナ環境用)lxc-monitor
: コンテナ環境の監視lxc-wait
: 特定コンテナ環境状態の監視待機
Previous Post | Top | Next Post |