# /dev/kvm lxc.cgroup2.devices.allow = c 10:232 rwm lxc.mount.entry = /dev/kvm dev/kvm none bind,optional,create=file
LXCコンテナの中からKVMを使用する設定
ホストOSの/var/lib/lxc/[CONTAINER NAME]/configに以下を追加して再起動。(ホストOSがcgroup v1を使っている場合、cgroup2をcgroupに変更する)
LXCコンテナにログインできない、または、時間がかかる時の対処
ホストOSのログに次のメッセージがある場合、AppArmorによってコンテナ内の動作 (この場合mount) がブロックされている。
このログは、ホストOSがUbuntu 20.04、コンテナがDebian 12のケース。
kernel: audit: type=1400 audit(1705193372.029:49): apparmor="DENIED" operation="mount" info="failed perms check" error=-13 profile="lxc-sakura_</var/lib/lxc>" name="/run/systemd/unit-root/" pid=4456 comm="(d-logind)" srcname="/" flags="rw, rbind"ホストOSの/var/lib/lxc/[Container名]/configに次の2行を加えて、LXCコンテナを起動
lxc.apparmor.profile = generated lxc.apparmor.allow_nesting = 1
参考
LXCコンテナの中でDockerを使用するための設定Ubuntu上で新しいバージョンのDebianのLXCコンテナを作る方法
例えば、Ubuntu 20.04上でDebian12のLXCコンテナを作成すると、'signed by unknown key'(知らない鍵で署名されている)と表示されエラーとなる。
# lxc-create -t debian -n deb12 -- -r bookworm debootstrap is /usr/sbin/debootstrap Checking cache download in /var/cache/lxc/debian/rootfs-bookworm-amd64 ... gpg: key 7638D0442B90D010: 4 signatures not checked due to missing keys gpg: key 7638D0442B90D010: "Debian Archive Automatic Signing Key (8/jessie)次のように鍵をダウンロードして、ホストOSに登録してから、再度lxc-createを実行すればよい。" not changed gpg: Total number processed: 1 gpg: unchanged: 1 Downloading debian minimal ... I: Retrieving InRelease I: Checking Release signature E: Release signed by unknown key (key id F8D2585B8783D481) The specified keyring /var/cache/lxc/debian/archive-key.gpg may be incorrect or out of date. You can find the latest Debian release key at https://ftp-master.debian.org/keys.html Failed to download the rootfs, aborting. Failed to download 'debian base' failed to install debian lxc-create: deb12: lxccontainer.c: create_run_template: 1627 Failed to create container from template lxc-create: deb12: tools/lxc_create.c: main: 317 Failed to create container deb12
wget https://ftp-master.debian.org/keys/archive-key-12.asc -O - --quiet \
| gpg --import --no-default-keyring --keyring=/usr/share/keyrings/debian-archive-keyring.gpg
青字の部分は使用するDebianのバージョンに適宜変更する。鍵の一覧は以下のサイトにある。
https://ftp-master.debian.org/keys.html
LXCコンテナの中でDockerを使用するための設定
/var/lib/lxc/[container名]/configに以下の設定を追加し、コンテナを(再)起動する。
なるべく安全な方法
lxc.apparmor.profile = generated lxc.apparmor.allow_nesting = 1
とにかく権限を与える方法
上記で駄目な場合、以下ならほとんどのケースで起動可能。上記にlxc.cap.drop =を加えて、Dockerを起動できる場合もあり。lxc.apparmor.profile = unconfined lxc.cgroup.devices.allow = a lxc.cap.drop =
lxc-createでバージョンを指定してDebianコンテナを作成する
例:Debian 12 (bookworm)をインストール
# lxc-create -n name -t debian -- -r bookworm
他のバージョンをインストールする場合、上記の青字の部分を下のcode nameに置換する。
| version | code name |
|---|---|
| 10 | buster |
| 11 | bullseye |
| 12 | bookworm |
[付録] 初期状態のでプロセス
Debain 10
UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:53 ? 00:00:00 /sbin/init root 39 1 0 18:53 ? 00:00:00 /lib/systemd/systemd-journald root 63 1 0 18:53 ? 00:00:00 /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0 root 85 1 0 18:54 ? 00:00:00 /usr/sbin/sshd -D root 86 1 0 18:54 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
Debian 11
UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:55 ? 00:00:00 /sbin/init root 38 1 0 18:55 ? 00:00:00 /lib/systemd/systemd-journald root 63 1 0 18:55 ? 00:00:00 /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0 root 89 1 0 18:55 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220 root 90 1 0 18:55 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
Debian 12
UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:59 ? 00:00:00 /sbin/init root 38 1 0 18:59 ? 00:00:00 /lib/systemd/systemd-journald root 70 1 0 18:59 ? 00:00:00 dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.le root 97 1 0 18:59 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud - 115200,38400,9600 vt220 root 98 1 0 18:59 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
参考
LXCの記事一覧小規模な利用ならLXDよりLXCが使い勝手がよい
LXDは、大雑把に言えば、LXCに管理機能を強化し大規模な運用にも利用しやすくしたもの。
個人で簡易的な仮想マシンとして使う場合、LXDの機能がやや冗長に感じることがある。
そのため私はLXDでなくLXCを主に使っている。以下にその理由を述べる。
ストレージ(コンテナ内のファイルの格納場所)
LXC
ホストOS上の特定のディレクトリ/var/lib/lxc/[コンテナ名]/rootfsの下に、そのコンテナのファイルシステムがそのまま格納されている。 ホスト側から見ると、デフォルトでファイル共有されているようなもの。LXD
デフォルトでは、ホストOS上にストレージプール用のループバックマウント用のファイルを作成する。作成時点でそのサイズを決める(例えば100GiB)。
このストレージプール用のファイルは、シンプロビジョニングされるので、最初のサイズは0。使った分だけ増えていく。ただし、コンテナを削除したり、コンテナ内のファイルを削除しても、ストレージプールの容量は減少しない。これがパーソナルユースでは、ストレスになる。ストレージプール用のファイルを拡張できるものの、最初に最大サイズをいくらにするかを決めるのは、なかなか悩みどころである。
ストレージプールのループバックファイル上btrfsなどのパーティションを作れば、スナップショットやコンテナのコピーを高速に取得できるなどのメリットもある。しかし、私の使い方では、動作中にスナップショットをとるような用途もほとんどない。コンテナそのものは、それほど肥大化しないので、コピーすることがあっても、少し待てば終わる。そのため、これらのメリットをほぼ享受できない。
また、LXCでも同様のことは可能である。自前でループバックマウント用ファイルを作ってbtrfsでフォーマットし、rootfsをその上に設定すればよい。
設定
LXC
/var/lib/lxc/[コンテナ名]/configに設定が集約されている。構成を変えたいときは、このテキストファイルを編集すればよい。構成の保存もこのファイルをバックアップすればよい。LXD
lxc configなどのコマンドで設定する。設定をまとめて保存したり、設定するのがやや面倒。インストール方法
LXC
DebianでもUbuntuでもaptでインストールできる。LXD
snapで提供される。snap自体それほどメジャーでもないし、パッケージ管理システムが増えるのは、システムが複雑になりあまり嬉しくない。CentOS7で全てのLXCインスタンスの稼働状態を表示する
CentOS7のlxc-infoコマンドは、Ubuntu 15.10のような-fオプションがない。なので、すべてのコンテナの稼働状態を一度に表示できない。
次のようにlxc-infoと組み合わせることで似たようなことは可能になる。
次のようにlxc-infoと組み合わせることで似たようなことは可能になる。
# lxc-ls | awk '{ print "lxc-info -n " $1 }' FS=" " | sh
Name: lotus
State: STOPPED
Name: renkon
State: STOPPED
Name: sa
State: STOPPED
sedを使ったバージョン
# lxc-ls | sed -e "s/ /\n/g" -e "s/^/lxc-info -n /" | sh
LXCコンテナをUbuntu 15.04にアップグレードした際のトラブル対応
ホストマシンUbuntu 14.04、コンテナUbuntu 14.04の環境で、コンテナのOSを15.04にアップグレードしたら、起動中、以下のエラーで停止した。
以下の例ではホストマシンで以下のmachine_nameという名前のコンテナの設定をする。
起動時(lxc-start実行時)に次のエラーメッセージが出る場合
systemd-journalのCPU負荷が100%になる。
/etc/mtab is not a symlink or not pointing to /proc/self/mounts.対応方法は、メッセージの通り。mtabをリンクにする。
以下の例ではホストマシンで以下のmachine_nameという名前のコンテナの設定をする。
# cd /var/lib/lxc/machine_name/rootfs/etc # rm mtab # ln -s /proc/self/mounts mtab
起動時(lxc-start実行時)に次のエラーメッセージが出る場合
Failed to mount cgroup at /sys/fs/cgroup/systemd: Permission denied/var/lib/lxc/machine_name/configに次の行を加える。
lxc.aa_profile = unconfined
systemd-journalのCPU負荷が100%になる。
- コンテナを停止
- lxc.kmsg = 0をconfigに追加
- コンテナに/dev/kmsgがある場合、削除
lxcのインスタンスにカーネルログを記録させない
ゲストOSでrsyslogが動作している場合、次のように設定ファイルにkern.noneを/var/log/syslogの行に追加する。
また、kern.log行そのものをコメントアウトします。
*.*;auth,authpriv.none,kern.none -/var/log/syslog #kern.* -/var/log/kern.logUbuntu 14.04の場合、/etc/rsyslog.d/50-default.confが設定ファイルです。
lxc-createでバージョンを指定してubuntuコンテナを作成する
例:22.04 LTS (jammy)をインストール
# lxc-create -n name -t ubuntu -- -r jammy
他のバージョンをインストールする場合、上記の青字の部分を下のcode nameに置換する。
| version | code name |
|---|---|
| 18.04 LTS | xenial |
| 20.04 LTS | focal |
| 22.04 LTS | jammy |
| 22.10 | kinetic |
[付録] 初期状態でのプロセス
20.04 LTS
UID PID PPID C STIME TTY TIME CMD root 1 0 0 09:42 ? 00:00:00 /sbin/init root 37 1 0 09:42 ? 00:00:00 /lib/systemd/systemd-journald systemd+ 63 1 0 09:42 ? 00:00:00 /lib/systemd/systemd-networkd root 69 1 0 09:42 ? 00:00:00 /usr/sbin/cron -f message+ 70 1 0 09:42 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only root 72 1 0 09:42 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers syslog 73 1 0 09:42 ? 00:00:00 /usr/sbin/rsyslogd -n -iNONE root 74 1 0 09:42 ? 00:00:00 /lib/systemd/systemd-logind systemd+ 79 1 0 09:42 ? 00:00:00 /lib/systemd/systemd-resolved root 82 1 0 09:42 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220 root 83 1 0 09:42 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
22.04 LTS
UID PID PPID C STIME TTY TIME CMD root 1 0 0 09:48 ? 00:00:00 /sbin/init root 37 1 0 09:48 ? 00:00:00 /lib/systemd/systemd-journald systemd+ 65 1 0 09:48 ? 00:00:00 /lib/systemd/systemd-networkd root 70 1 0 09:48 ? 00:00:00 /usr/sbin/cron -f -P message+ 71 1 0 09:48 ? 00:00:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only root 73 1 0 09:48 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers syslog 74 1 0 09:48 ? 00:00:00 /usr/sbin/rsyslogd -n -iNONE root 75 1 0 09:48 ? 00:00:00 /lib/systemd/systemd-logind systemd+ 80 1 0 09:48 ? 00:00:00 /lib/systemd/systemd-resolved root 83 1 0 09:48 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220 root 84 1 0 09:48 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
22.10
UID PID PPID C STIME TTY TIME CMD root 90 0 0 09:57 pts/5 00:00:00 ps -efH root 1 0 0 09:57 ? 00:00:00 /sbin/init root 37 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-journald systemd+ 63 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-networkd systemd+ 67 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-resolved root 70 1 0 09:57 ? 00:00:00 /usr/sbin/cron -f -P message+ 71 1 0 09:57 ? 00:00:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only syslog 73 1 0 09:57 ? 00:00:00 /usr/sbin/rsyslogd -n -iNONE root 74 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-logind root 79 1 0 09:57 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud - 115200,38400,9600 vt220
参考
LXCの記事一覧CentOS7でUbuntuのLXCコンテナを作成する
debootstrapをインストール
# yum install debootstrapqemu-debootstrapというコマンドが必要だが、以下のようにして作成。
# cp /usr/sbin/debootstrap /usr/local/sbin/qemu-debootstrapqemu-debootstrapのDEF_HTTPS_MIRROR行を次のように変更
DEF_HTTPS_MIRROR="https://mirrors.kernel.org/ubuntu"あとは、lxc-createコマンドを実行すればOK
# lxc-create -t ubuntu -n name
LXCのCentOS7でhttpdがインストールできない問題の対処
httpdをyumでインストールしようとしたところ、以下のエラーが表示され、失敗した。
error: unpacking of archive failed on file /usr/sbin/suexec: cpio: cap_set_fileホストマシンの/usr/share/lxc/config/centos.common.confでsetfcapをドロップから除外したところ、解決された。
#lxc.cap.drop = mac_admin mac_override setfcap lxc.cap.drop = mac_admin mac_override参考 CentOS 7.0のlxcでゲストにCentOSを使う時の問題を改善する。
LXCでホストのディレクトリをコンテナがマウント(共有)する
コンテナの停止中に/var/lib/lxc/[コンテナ名]/configに以下のような行を記載し、コンテナを起動します。イコールの右側は、基本的に/etc/fstabの書式です。
lxc.mount.entry = /home mnt/host.home none bind,create=dir 0 0上記のcreate=dirは、コンテナ上にマウント先のディレクトリがない場合、それを作成するためのオプションです。
参考
LXCの記事一覧CentOS 7.0のlxcでゲストにCentOSを使う時の問題を改善する。
デフォルトだと起動がすごく遅い。
こののサイトを参考に以下のファイルから、setpcapを削除するとうまくいった。- /usr/share/lxc/config/centos.common.conf
- lxc.cap.drop =行
systemd-journalのCPU負荷が100%になる。
ここを参考に以下のように改善。なお、この現象はsystemdを使用するUbuntu15.04でも発生する。-
/var/lib/lxc/{container}/configに以下を追加 lxc.autodev = 1- lxc.kmsg = 0
/var/lib/lxc/{container}/rootfs/lib/systemd/system/getty@.serviceの次の行をコメントアウトConditionPathExists=/dev/tty0
LXCのコンテナに2つ目のNICを追加
以下のように/var/lib/lxc/[コンテナ名]/configに、単純にlxc.network.typeなどを再度記述する。
# Network configuration (最初からエントリ) lxc.network.type = veth lxc.network.flags = up lxc.network.link = lxcbr0 lxc.network.type = veth lxc.network.flags = up lxc.network.link = mybr0なお、これらNICのための新たなBridgeをホストに作成する方法は以下を参照。
参考
LXCの記事一覧Ubuntu 13.10, 14.04のLXCでDHCPの範囲を変更する。
デフォルトでは、サブネットのほぼ全てがDHCPに割り当てられる。静的なIPを割り当てるため、その範囲を変更するには、
/etc/default/lxc-netを編集すればよい。以下の例は、割り当てアドレスの先頭を10.0.3.100にする。
なお、/etc/init/lxc-net.confを読むと、lxcbr0を一旦削除しないと再度、dnsmasqを起動されない模様。 少々面倒だが、次の様にすれば、リセットせずに反映できる。lxcの再起動
LXC_DHCP_RANGE="10.0.3.100,10.0.3.254"その後、システムをリセットする。
なお、/etc/init/lxc-net.confを読むと、lxcbr0を一旦削除しないと再度、dnsmasqを起動されない模様。 少々面倒だが、次の様にすれば、リセットせずに反映できる。
- すべてのコンテナを終了する
- 次のコマンドでlxcbr0を削除
# ifconfig lxcbr0 down # brctl delbr lxcbr0
# initctl stop lxc # initctl start lxcdnsmaqのオプションをが指定したとおりになっていれば成功。
# ps ax | grep lxc-dnsmasq 6097 ? S 0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.3.1 --dhcp-range 10.0.3.100,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative
LXCのNICをOpen vSwitchに追加
ホストでOpen vSwitchのブリッジが作成されていることを前提に説明する。
ブリッジをovsbr0、LXCのコンテナが作るvethデバイスをveth-lxcとすると以下のように組み込めばよい。
# ovs-vsctl add-port ovsbr0 veth-lxc特別なことは、ほとんどないが、以下の点に注意が必要。
- LXCコンテナのvethでバイス名が固定していないと若干面倒
- LXCコンテナを起動するときに、Linuxのbridgeに組み込む設定(lxc.network.link)があると、 lxc-startでエラーになる
LXCの基本的な使い方
以下のコマンドで-nオプションは省略できる場合が多い。
コンテナの作成
テンプレートをubuntu、コンテナ名をcontainer-nameとして作成する例。# lxc-create -t ubuntu -n container-name-tに使用するテンプレートは、/usr/share/lxc/templatesの下にある。
コンテナを起動
# lxc-start -n container-name
トラブルシュート
No croup mounted on the systemと表示される場合、/etc/fstabに次の記述をして、none /cgroup cgroup defaults 0 0/cgroupsを以下のようにマウントする。
# mkdir /cgroup # mount /cgroup
コンテナのコンソールを表示
# lxc-console -n container-name
コンテナのコンソールを終了
- Ctrl-a + q
コンテナの終了
# lxc-shutdown -n container-name
コンテナへのアタッチ
アタッチは、ログインを省略して、rootでコンテナの直接シェルを起動する。# lxc-attach -n container-name
設定ファイル
設定ファイルは以下のひとつで、シンプル。- /var/lib/lxc/[container-name]/config
BridgeへのInterfaceの自動追加
以下の行の右辺にbridge名を設定。 なお、Bridgeの作り方については、こちらも参照。lxc.network.link = lxcbr0
ホスト側のvethインターフェイス名
通常は適当な名前が付けられるので設定不要だが、明示することもできる。lxc.network.veth.pair = veth-mycontainer
登録:
投稿 (Atom)