「LXD」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) |
|||
332行目: | 332行目: | ||
== トラブルシューティング == |
== トラブルシューティング == |
||
− | === lxd-agent |
+ | === 仮想マシン内の lxd-agent === |
+ | 一部の仮想マシンイメージ内では、{{ic|lxd-agent}} はデフォルトでは有効になっていません。<br> |
||
− | Inside some virtual machine images the {{ic|lxd-agent}} is not enabled by default. <br> |
||
+ | この場合、たとえば {{ic|9p}} ネットワーク共有をマウントするなどして、手動で有効にする必要があります。これには、有効なユーザーによるコンソールアクセスが必要です。 |
||
− | In this case you have to enable it manually, for example by mounting a {{ic|9p}} network share. This requires console access with a valid user. |
||
− | 1. |
+ | 1.{{ic|lxc console}}でログインします: <br> |
− | + | {{ic|virtualmachine-name}} を適宜置き換えてください。 |
|
$ lxc console virtualmachine-name |
$ lxc console virtualmachine-name |
||
+ | root としてログインします: |
||
− | Login as root: |
||
− | {{Note | |
+ | {{Note | 一部のシステムでは、root としてログインできるようにするには、最初に root パスワードを設定する必要があります。 <br> これには、[https://linuxcontainers.org/lxd/advanced-guide/#cloud-init cloud-init] を使用できます。}} |
$ su root |
$ su root |
||
+ | ネットワーク共有をマウントします。 |
||
− | Mount the network share: |
||
$ mount -t 9p config /mnt/ |
$ mount -t 9p config /mnt/ |
||
+ | フォルダーに移動し、インストールスクリプトを実行します (これにより、VM 内の lxd-agent が有効になります): |
||
− | Go into the folder and run the install script (this will enable the lxd-agent inside the VM): |
||
$ cd /mnt/ |
$ cd /mnt/ |
||
$ ./install.sh |
$ ./install.sh |
||
+ | インストールが成功したら、次のようにして再起動します: |
||
− | After sucessful install, reboot with: |
||
$ reboot |
$ reboot |
||
− | + | その後、{{ic|lxd-agent}} が利用可能になり、{{ic|lxc exec}} が動作するはずです。 |
|
=== カーネルコンフィグの確認 === |
=== カーネルコンフィグの確認 === |
2023年11月6日 (月) 02:11時点における版
関連記事
LXD はコンテナ(LXC経由)および仮想マシン(QEMU経由)のマネージャー/ハイパーバイザーです。
必要なソフトウェア
lxd パッケージをインストールします。
あるいは、インスタンスを自動起動する場合など、lxd.service
を直接、有効にすることもできます。
セットアップ
一般ユーザー用のコンテナ設定
一般ユーザー用のコンテナ(unprivileged containers)を使用することが推奨されます(違いについては Linux_Containers#Privileged_containers_or_unprivileged_containers を参照してください)。
このために、/etc/subuid
と /etc/subgid
の両方を変更します(これらのファイルが存在しない場合は、作成してください)。コンテナで使用する uid / gid のマッピングを各ユーザーに設定する必要があります。以下の例は単に root ユーザー(および systemd システムユニット)のためのものです:
usermod
コマンドを以下のように使用することもできます:
usermod -v 1000000-1000999999 -w 1000000-1000999999 root
または、上記のファイルを直接以下のように変更することもできます:
/etc/subuid
root:1000000:1000000000
/etc/subgid
root:1000000:1000000000
これで、すべてのコンテナはデフォルトで unprivileged
として起動されます。
代替方法については、特権コンテナの設定方法 を参照してください。
LXD の設定
LXD を使うにはストレージプールと (インターネットを使いたい場合) ネットワークを設定する必要があります。以下のコマンドを root で実行してください:
# lxd init
非特権ユーザーとして LXD にアクセス
デフォルトでは LXD デーモンは lxd
グループのユーザーからのアクセスを許可するので、ユーザーをグループに追加してください:
# usermod -a -G lxd <user>
使用方法
LXD consists of two parts:
- the daemon (the lxd binary)
- the client (the lxc binary)
The client is used to control one or multiple daemon(s).
The client can also be used to control remote LXD servers.
Overview of commands
You can get an overview of all available commands by typing:
$ lxc
Create a container
You can create a container with lxc launch
, for example:
$ lxc launch ubuntu:20.04
Container are based on images, that are downloaded from image servers or remote LXD servers.
You can see the list of already added servers with:
$ lxc remote list
You can list all images on a server with lxc image list
, for example:
$ lxc image list images:
This will show you all images on one of the default servers: images.linuxcontainers.org
You can also search for images by adding terms like the distribution name:
$ lxc image list images:debian
Launch a container with an image from a specific server with:
$ lxc launch servername:imagename
For example:
$ lxc launch images:centos/8/amd64 centos
To create an amd64 Arch container:
$ lxc launch images:archlinux/current/amd64 arch
Create a virtual machine
Just add the flag --vm
to lxc launch
:
$ lxc launch ubuntu:20.04 --vm
Use and manage a container or VM
See Instance managament in the official Getting Started Guide of LXD.
Container/VM configuration (optional)
You can add various options to instances (containers and VMs).
See Configuration of instances in the official Advanced Guide of LXD for details.
Tips and tricks
ホスト上でコンテナーに名前でアクセスする
これは、デフォルトのブリッジである lxdbr0
を使用していて、systemd-resolved を使用している場合を前提としています。
# systemd-resolve --interface lxdbr0 --set-domain '~lxd' --set-dns $(lxc network get lxdbr0 ipv4.address | cut -d / -f 1)
これで、名前でコンテナーにアクセスできるようになります:
$ ping containername.lxd
その他の解決策
一定時間が経過すると、systemd-resolve の解決策は機能しなくなるようです。
別の解決策としては、以下の lxd.network
を用いて systemd-networkd を使用する方法があります(x
と y
をあなたのブリッジ IP に合わせて置き換えてください):
/etc/systemd/network/lxd.network
[Match] Name=lxdbr0 [Network] DNS=10.x.y.1 Domains=~lxd IgnoreCarrierLoss=yes [Address] Address=10.x.y.1/24 Gateway=10.x.y.1
Wayland と Xorg アプリケーションの使用
コンテナ内で GUI アプリケーションを使用するための複数の方法があります。公式 LXD フォーラム で概要が見れます。
以下の方法は、コンテナに Wayland(+Xwayland)または Xorg のホストのソケットへのアクセスを許可します。
コンテナのプロファイルに以下のデバイスを追加
LXD のデバイスに関するドキュメントも参照してください。
GPU 用の一般的なデバイス:
mygpu: type: gpu
Wayland ソケット用のデバイス:
Waylandsocket: bind: container connect: unix:/run/user/1000/wayland-0 listen: unix:/mnt/wayland1/wayland-0 uid: "1000" gid: "1000" security.gid: "1000" security.uid: "1000" mode: "0777" type: proxy
Xorg(または Xwayland)ソケット用のデバイス:
Xsocket: bind: container connect: unix:/tmp/.X11-unix/X0 listen: unix:/mnt/xorg1/X0 uid: "1000" gid: "1000" security.gid: "1000" security.uid: "1000" mode: "0777" type: proxy
コンテナ内でソケットを適切な場所にリンク
Wayland ソケットをリンクするシェルスクリプト:
#!/bin/sh mkdir /run/user/1000 ln -s /mnt/wayland1/wayland-0 /run/user/1000/wayland-0
Xorg(または Xwayland)ソケットをリンク:
#!/bin/sh ln -s /mnt/xorg1/X0 /tmp/.X11-unix/X0
コンテナ内のユーザー設定に環境変数を追加
Wayland 用:
$ echo "export XDG_RUNTIME_DIR=/run/user/1000" >> ~/.profile $ echo "export WAYLAND_DISPLAY=wayland-0" >> ~/.profile $ echo "export QT_QPA_PLATFORM=wayland" >> ~/.profile
Xorg(または Xwayland)用:
$ echo "export DISPLAY=:0" >> ~/.profile
~/.profile
をリロード:
$ source ~/.profile
コンテナ内で必要なソフトウェアをインストール
必要なソフトウェアを追加する必要があります。今のところ、例として GUI アプリケーションをインストールできます。これによって、必要なパッケージもすべてインストールされるでしょう。
GUI アプリケーションを起動
これで、コンテナ内で GUI アプリケーションを起動することができます(例えば、ターミナル経由で)そして、それらをホストのディスプレイ上にウィンドウとして表示させることができます。
例として glxgears を試してみてください。
特権コンテナ
特権コンテナを設定したい場合、設定キーとして security.privileged=true
を提供する必要があります。
コンテナ作成中に:
$ lxc launch ubuntu:20.04 ubuntu -c security.privileged=true
既存のコンテナで設定を編集する場合:
$ lxc config edit ubuntu
name: ubuntu profiles: - default config: ... security.privileged: "true" ...
ディスクデバイスを追加
読み取り専用
ホストからコンテナにディスクデバイスを共有したいだけなら、コンテナに disk
デバイスを追加するだけです。仮想の disk
デバイスは名前(LXC 設定ファイル内でのみ使用)、ホストのファイルシステム上で指すべきディスクへのパス、そしてコンテナのファイルシステム上でのマウントポイントが必要です。
$ lxc config device add containername virtualdiskname disk source=/path/to/host/disk/ path=/path/to/mountpoint/on/container
読み書き可能(特権でないコンテナ)
読み書きアクセスの推奨される方法は、LXD に含まれる "shift" メソッドを使用することです。
shift は Linux カーネルの機能に基づいており、二つの異なるバージョンで利用可能です:
- 最新のバージョンは "idmapped mounts" と呼ばれ、すべての upstream カーネル >5.12 にデフォルトで含まれています。したがって、通常の Arch Linux カーネル(linux)にも含まれています。
- 古いバージョンは "shiftfs" と呼ばれ、ほとんどのカーネルに手動で追加する必要があります。これはレガシーバージョンとして、古いカーネルをサポートするためにあります。この GitHub リポジトリは Ubuntu カーネルからの shiftfs カーネルモジュールを使用しています:https://github.com/toby63/shiftfs-dkms
shift は、通常の Arch Linux カーネル(linux)と lxd パッケージによって、デフォルトで利用可能であり、有効になっているはずです。
1. システムで shift が利用可能かどうかを確認するには, lxc info
を実行します。
出力の最初の部分で表示されるのは:
kernel_features: idmapped_mounts: "true" shiftfs: "false"
idmapped_mounts または shiftfs のいずれかが true の場合、そのカーネルはすでにそれを含んでおり、shift を使用できます。 true でない場合、カーネルバージョンを確認し、上記で述べた "shiftfs" レガシーバージョンを試すことができます。
出力の第二部では、次のいずれかが表示されます:
lxc_features: idmapped_mounts_v2: "true"
または:
lxc_features: shiftfs: "true"
idmapped_mounts または shiftfs のいずれかが true の場合、LXD は既にそれを有効にしています。 有効にされていない場合、最初にそれを有効にする必要があります。
2. 使い方
ディスクデバイスのオプションで "shift" 設定キーを "true" に設定するだけです。 参照:LXD のディスクデバイスに関する文書
また、LXD フォーラムのチュートリアル も参照してください。
Bash 補完が動作しない
このワークアラウンドで問題が解決するかもしれません:
# ln -s /usr/share/bash-completion/completions/lxd /usr/share/bash-completion/completions/lxc
トラブルシューティング
仮想マシン内の lxd-agent
一部の仮想マシンイメージ内では、lxd-agent
はデフォルトでは有効になっていません。
この場合、たとえば 9p
ネットワーク共有をマウントするなどして、手動で有効にする必要があります。これには、有効なユーザーによるコンソールアクセスが必要です。
1.lxc console
でログインします:
virtualmachine-name
を適宜置き換えてください。
$ lxc console virtualmachine-name
root としてログインします:
$ su root
ネットワーク共有をマウントします。
$ mount -t 9p config /mnt/
フォルダーに移動し、インストールスクリプトを実行します (これにより、VM 内の lxd-agent が有効になります):
$ cd /mnt/ $ ./install.sh
インストールが成功したら、次のようにして再起動します:
$ reboot
その後、lxd-agent
が利用可能になり、lxc exec
が動作するはずです。
カーネルコンフィグの確認
デフォルトで Arch Linux のカーネルは Linux Containers とフロントエンドの LXD が動くようにコンパイルされています。カスタムカーネルを使っている場合やカーネルオプションを変更している場合、LXD が動かない場合があります。コンテナを実行できるようにカーネルが設定されているか確認してください:
$ lxc-checkconfig
Resource limits are not applied when viewed from inside a container
Install lxcfs and start lxcfs.service
.
lxd will need to be restarted. Enable lxcfs.service
for the service to be started at boot time.
Starting a virtual machine fails
If you see the error: Error: Required EFI firmware settings file missing: /usr/share/ovmf/x64/OVMF_VARS.ms.fd
Arch Linux does not distribute secure boot signed ovmf firmware, to boot virtual machines you need to disable secure boot for the time being.
$ lxc launch ubuntu:18.04 test-vm --vm -c security.secureboot=false
This can also be added to the default profile by doing:
$ lxc profile set default security.secureboot=false
No IPv4 with systemd-networkd
Starting with version version 244.1, systemd detects if /sys
is writable by containers. If it is, udev is automatically started and breaks IPv4 in unprivileged containers. See commit bf331d8 and discussion on linuxcontainers.
On containers created past 2020, there should already be a systemd.networkd.service
override to work around this issue, create it if it is not:
/etc/systemd/system/systemd-networkd.service.d/lxc.conf
[Service] BindReadOnlyPaths=/sys
You could also work around this issue by setting raw.lxc: lxc.mount.auto = proc:rw sys:ro
in the profile of the container to ensure /sys
is read-only for the entire container, although this may be problematic, as per the linked discussion above.
アンインストール
Stop and disable lxd.service
and lxd.socket
. Then uninstall the lxd package.
If you uninstalled the package without disabling the service, you might have a lingering broken symlink at /etc/systemd/system/multi-user.wants/lxd.service
.
If you want to remove all data:
# rm -r /var/lib/lxd
If you used any of the example networking configuration, you should remove those as well.