ラベル LXC の投稿を表示しています。 すべての投稿を表示
ラベル LXC の投稿を表示しています。 すべての投稿を表示

LXCコンテナの中からKVMを使用する設定

ホストOSの/var/lib/lxc/[CONTAINER NAME]/configに以下を追加して再起動。(ホストOSがcgroup v1を使っている場合、cgroup2をcgroupに変更する)
# /dev/kvm
lxc.cgroup2.devices.allow = c 10:232 rwm
lxc.mount.entry = /dev/kvm dev/kvm none bind,optional,create=file

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) " 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
次のように鍵をダウンロードして、ホストOSに登録してから、再度lxc-createを実行すればよい。
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に置換する。
versioncode name
10buster
11bullseye
12bookworm

[付録] 初期状態のでプロセス

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-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にアップグレードしたら、起動中、以下のエラーで停止した。
/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がある場合、削除
参考: CentOS 7.0のlxcでゲストにCentOSを使う時の問題を改善する。

lxcのインスタンスにカーネルログを記録させない

ゲストOSでrsyslogが動作している場合、次のように設定ファイルにkern.noneを/var/log/syslogの行に追加する。 また、kern.log行そのものをコメントアウトします。
*.*;auth,authpriv.none,kern.none -/var/log/syslog
#kern.*                          -/var/log/kern.log
Ubuntu 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に置換する。
versioncode name
18.04 LTSxenial
20.04 LTSfocal
22.04 LTSjammy
22.10kinetic

[付録] 初期状態でのプロセス

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 debootstrap
qemu-debootstrapというコマンドが必要だが、以下のようにして作成。
# cp /usr/sbin/debootstrap /usr/local/sbin/qemu-debootstrap
qemu-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にする。
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
    
  • lxcの再起動
  • # initctl stop lxc
    # initctl start lxc
    
dnsmaqのオプションをが指定したとおりになっていれば成功。
# 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の基本的な使い方 の「設定ファイル」項目を参照して、適宜設定のこと。

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
(Ctrl-a + Ctrl-qでないことに注意。qを入力する時は、Ctrlは押下されていない。)

コンテナの終了

# 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