「Linux コンテナ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
8行目: 8行目:
 
{{Related|Docker}}
 
{{Related|Docker}}
 
{{Related|OpenVPN}}
 
{{Related|OpenVPN}}
  +
{{Related|Linux Containers で OpenVPN}}
{{Related4|OpenVPN in Linux containers}}
 
 
{{Related|PeerGuardian Linux}}
 
{{Related|PeerGuardian Linux}}
 
{{Related|systemd-nspawn}}
 
{{Related|systemd-nspawn}}
83行目: 83行目:
 
{{Tip|{{Pkg|haveged}} をインストールして {{ic|haveged.service}} を[[起動]]することで、セットアップ中にシステムエントロピーが作成されるまでシステムが停止するのを回避することができます。haveged を使用しない場合、GPG 鍵を作成するのにしばらく時間がかかるかもしれません。}}
 
{{Tip|{{Pkg|haveged}} をインストールして {{ic|haveged.service}} を[[起動]]することで、セットアップ中にシステムエントロピーが作成されるまでシステムが停止するのを回避することができます。haveged を使用しない場合、GPG 鍵を作成するのにしばらく時間がかかるかもしれません。}}
   
{{Tip|[[Btrfs]] を使っている場合 {{ic|-B btrfs}} を追加することでコンテナ化した rootfs を保存するための Btrfs サブボリュームを作成することができます。{{ic|lxc-clone}} コマンドを使ってコンテナを複製するときに便利です。}}
+
{{Tip|[[Btrfs]] を使っている場合 {{ic|-B btrfs}} を追加することでコンテナ化した rootfs を保存するための Btrfs サブボリュームを作成することができます。{{ic|lxc-clone}} コマンドを使ってコンテナを複製するときに便利です。[[ZFS]] ユーザーは {{ic|-B zfs}} が使えます。}}
   
 
{{Tip|2015年7月現在、{{ic|-t none}} を使って空のコンテナを作成することはできません。[https://bugs.launchpad.net/bugs/1466458 バグレポート] を参照してください。代わりに {{ic|-t /bin/true}} を使って下さい。}}
 
{{Tip|2015年7月現在、{{ic|-t none}} を使って空のコンテナを作成することはできません。[https://bugs.launchpad.net/bugs/1466458 バグレポート] を参照してください。代わりに {{ic|-t /bin/true}} を使って下さい。}}
177行目: 177行目:
 
==== OpenVPN の設定 ====
 
==== OpenVPN の設定 ====
   
コンテナで [[OpenVPN]] を実行したい場合は [[en2:OpenVPN in Linux containers|OpenVPN in Linux containers]] の記事を読んで下さい。
+
コンテナで [[OpenVPN]] を実行したい場合は [[Linux Containers OpenVPN]] の記事を読んで下さい。
   
 
== コンテナの管理 ==
 
== コンテナの管理 ==
191行目: 191行目:
 
コンテナを停止:
 
コンテナを停止:
 
# lxc-stop -n CONTAINER_NAME
 
# lxc-stop -n CONTAINER_NAME
  +
  +
コンテナにログインするには:
  +
# lxc-console -n CONTAINER_NAME
  +
  +
ログインしたら、他の linux システムと同じようにコンテナを扱って、root パスワードを設定し、ユーザーを作成、パッケージのインストールなどを行って下さい。
   
 
コンテナにアタッチ:
 
コンテナにアタッチ:
 
# lxc-attach -n CONTAINER_NAME
 
# lxc-attach -n CONTAINER_NAME
   
  +
lxc-console とほぼ同じですが、自動的にログインを通り越してコンテナの中の root プロンプトにアクセスします。
アタッチしたら、他の linux システム用にコンテナを扱って、root パスワードを設定し、ユーザーを作成、パッケージのインストールなどを行って下さい。
 
   
 
== Xorg プログラムの実行 ==
 
== Xorg プログラムの実行 ==
205行目: 210行目:
 
もしくは、直接コンテナにアタッチしたり接続する代わりに、以下のコマンドを使って自動的にホストにディスプレイを設定することもできます:
 
もしくは、直接コンテナにアタッチしたり接続する代わりに、以下のコマンドを使って自動的にホストにディスプレイを設定することもできます:
 
# lxc-attach -n playtime --clear-env -- sudo -u YOURUSER env DISPLAY=0.0 firefox
 
# lxc-attach -n playtime --clear-env -- sudo -u YOURUSER env DISPLAY=0.0 firefox
  +
  +
== トラブルシューティング ==
  +
  +
=== root ログインが失敗する ===
  +
  +
lxc-console を使ってログインしようとすると以下のエラーが表示される場合:
  +
  +
login: root
  +
Login incorrect
  +
  +
そしてコンテナの {{ic|journalctl}} で以下のように表示される場合:
  +
  +
pam_securetty(login:auth): access denied: tty 'pts/0' is not secure !
  +
  +
コンテナのファイルシステムにある {{ic|/etc/securetty}} のターミナル名のリストに {{ic|pts/0}} を追加してください。[http://unix.stackexchange.com/questions/41840/effect-of-entries-in-etc-securetty/41939#41939] を参照。コンテナの {{ic|/etc/securetty}} を削除することで常時 root ログインを許可することもできます。[https://github.com/systemd/systemd/issues/852] を参照。
  +
  +
もしくは、lxc-attach に新しいユーザーを作成してシステムにログインするときに使うようにして、それから root に切り替えて下さい。
  +
  +
# lxc-attach -n playtime
  +
[root@playtime]# useradd -m -Gwheel newuser
  +
[root@playtime]# passwd newuser
  +
[root@playtime]# passwd root
  +
[root@playtime]# exit
  +
# lxc-console -n playtime
  +
[newuser@playtime]$ su
   
 
== 参照 ==
 
== 参照 ==

2015年11月29日 (日) 19:05時点における版

関連記事

LinuX Containers (LXC) はオペレーティングシステムレベルの仮想化手法であり、一つのコントロールホスト (LXC ホスト) で独立した Linux システム (コンテナ) を複数動作させることができます。仮想マシンではありませんが、CPU やメモリ、ブロック I/O、ネットワークなどが個別に用意された仮想環境として使えます。LXC は LXC ホストの Linux カーネルによる cgroups 機能によって賄われています。chroot に似ていますが、より強力な分離を実現します。

セットアップ

必要なソフトウェア

公式リポジトリから lxcarch-install-scripts をインストールしてください。

使用中のカーネルがコンテナを実行できるように正しく設定されているか確認:

$ lxc-checkconfig

セキュリティに配慮して、デフォルトの Arch カーネルでは、非特権ユーザーではコンテナを実行できないようになっています。そのため、上記のコマンドを実行すると "User namespaces" の状態が missing になっているのが確認できます。詳しくは FS#36969 を見て下さい。

ホストネットワークの設定

LXC は様々なタイプの仮想化ネットワークをサポートしています。仮想ネットワークではほとんどの場合、ホスト側にブリッジデバイスが必要になります。以下で示しているブリッジの作成例に限られることはありません。例証として見て下さい。他のプログラムを使って同じようにネットワークを構築することも可能です。以下では有線と無線の例を示していますが、他のセットアップも可能です。他の方法についてはネットワークブリッジの記事を参照してください。

有線ネットワークの例

netctl公式リポジトリからインストールすることができます。ブリッジのテンプレートは /etc/netctl/examples に存在します。ホストネットワークのハードウェアの仕様やホストネットワークの IP の範囲にあわせて編集するようにしてください。以下2つのブリッジの設定例を記載していますが、片方は dhcp を使っており、もう片方は固定 IP で設定しています。

/etc/netctl/lxcbridge
Description="LXC bridge"
Interface=br0
Connection=bridge
BindsToInterfaces=('eno1')
IP=dhcp
SkipForwardingDelay=yes
/etc/netctl/lxcbridge
Description="LXC bridge"
Interface=br0
Connection=bridge
BindsToInterfaces=('eno1')
IP=static
Address=192.168.0.2/24
Gateway='192.168.0.1'
DNS=('192.168.0.1')

ブリッジを開始する前に、ホスト側の既存のネットワークインターフェイスを無効化してブリッジで置き換えるようにしてください。無効化するサービスはどうやってネットワークを設定していたかによって変わってきます。基本的なネットワーク設定についてはビギナーズガイド#ネットワークの設定に例があります。

netctl を使ってアダプタを管理していた場合は、switch-to で切り替えて下さい:

# netctl switch-to lxcbridge
# netctl enable lxcbridge

次に進む前にホストからネットワークにちゃんと接続されているか確認してください。ping を実行することで確認できます:

$ ping -c 1 www.google.com

無線ネットワークの例

無線ネットワークを直接ブリッジすることはできません。他の方法を使う必要があります。最初に、先の例と同じようにブリッジを作成しますが、インターフェイスは何も定義しないようにしておきます (コンテナ自身の仮想インターフェイスは自動的に定義されます)。ブリッジに固定 IP アドレスを割り当てますがゲートウェイは割り当てないようにしてください。

iptables を使って NAT を行うようにホストを設定:

# iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE

wlp3s0 は無線インターフェイスの名前に置き換えて下さい。パケット転送はデフォルトでは無効化されているので、カーネルパラメータを変更して有効にします:

# echo 1 > /proc/sys/net/ipv4/ip_forward

再起動するとパラメータがリセットされてしまうので /etc/sysctl.d に conf ファイルを追加するようにしてください (インターネット共有#パケット転送の有効化の警告を見て下さい)。

残りの作業はほとんど同じですが、コンテナ側では、ゲートウェイはホストの IP アドレスを設定するようにしてください (上記の例では、192.168.0.2 になります)。/var/lib/lxc/container_name/config で指定することができます (下のセクションを見て下さい)。

コンテナの作成

/usr/share/lxc/templates からコンテナ化するディストロに合わせてテンプレートを選択してください。Arch 以外のディストロをコンテナに入れたい場合、ディストロによってホストにパッケージを追加でインストールする必要があります:

lxc-create を実行してコンテナを作成します。デフォルトでは LXC の root ファイルシステムは /var/lib/lxc/CONTAINER_NAME/rootfs にインストールされます。例えば "playtime" という名前の Arch Linux LXC を作成:

# lxc-create -n playtime -t /usr/share/lxc/templates/lxc-archlinux
ヒント: haveged をインストールして haveged.service起動することで、セットアップ中にシステムエントロピーが作成されるまでシステムが停止するのを回避することができます。haveged を使用しない場合、GPG 鍵を作成するのにしばらく時間がかかるかもしれません。
ヒント: Btrfs を使っている場合 -B btrfs を追加することでコンテナ化した rootfs を保存するための Btrfs サブボリュームを作成することができます。lxc-clone コマンドを使ってコンテナを複製するときに便利です。ZFS ユーザーは -B zfs が使えます。
ヒント: 2015年7月現在、-t none を使って空のコンテナを作成することはできません。バグレポート を参照してください。代わりに -t /bin/true を使って下さい。

コンテナの設定

ネットワークの基本設定

プロセスが /var/lib/lxc/CONTAINER_NAME/config に定義されたコンテナを使う場合、システムリソースは仮想化され分離されます。デフォルトでは、作成プロセスはネットワークサポートを省いた最小限のセットアップを作成します。以下はネットワークを設定する例です:

/var/lib/lxc/playtime/config
# Template used to create this container: /usr/share/lxc/templates/lxc-archlinux
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)

## default values
lxc.rootfs = /var/lib/lxc/playtime/rootfs
lxc.utsname = playtime
lxc.arch = x86_64
lxc.include = /usr/share/lxc/config/archlinux.common.conf

## network
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
lxc.network.ipv4 = 192.168.0.3/24
lxc.network.ipv4.gateway = 192.168.0.1
lxc.network.name = eth0

## mounts
## specify shared filesystem paths in the format below
## make sure that the mount point exists on the lxc
#lxc.mount.entry = /mnt/data/share mnt/data none bind 0 0
#
# if running the same Arch linux on the same architecture it may be
# adventitious to share the package cache directory
#lxc.mount.entry = /var/cache/pacman/pkg var/cache/pacman/pkg none bind 0 0

Systemd の設定 (必須)

以下のセクションでは対処する必要がある問題を説明しています。小さな bash スクリプトを作成する必要があります:

/var/lib/lxc/playtime/autodev
#!/bin/bash
cd ${LXC_ROOTFS_MOUNT}/dev
mkdir net
mknod net/tun c 10 200
chmod 0666 net/tun

スクリプトに実行可能属性を付与:

# chmod +x /var/lib/lxc/playtime/autodev

次に、/var/lib/lxc/playtime/config を編集して以下のセクションを記述してください:

## systemd within the lxc
lxc.autodev = 1
lxc.pts = 1024
lxc.kmsg = 0
lxc.hook.autodev=/var/lib/lxc/playtime/autodev
Systemd が /dev ツリーで衝突する

systemd と lxc が /dev ツリーで衝突しないように、autodev モードを有効にすることが強く推奨されています。このモードを有効にすると LXC はデバイスツリーを別個に作成するようになります。また、/dev が LXC によってマウントされるようになるので、コンテナの rootfs の /dev ツリー内にデバイスノードを手動で作成する伝統的な方法は使えなくなります。

警告: Any device nodes required that are not created by LXC by default must be created by the autodev hook script!

コンテナ内でサポートされないサービスは無効化するようにしてください。使用する LXC にアタッチするか、コンテナの rootfs に chroot して、以下のサービスをマスクしてください:

# ln -s /dev/null /etc/systemd/system/systemd-udevd.service
# ln -s /dev/null /etc/systemd/system/systemd-udevd-control.socket
# ln -s /dev/null /etc/systemd/system/systemd-udevd-kernel.socket
# ln -s /dev/null /etc/systemd/system/proc-sys-fs-binfmt_misc.automount

上記のコマンドで udev と /proc/sys/fs/binfmt_misc のマウントが無効になります。

devpts の一貫性の保持

さらに LXC コンテナでは pty を宣言するようにしてください。LXC が新しいインスタンスとして devpts をマウントするようになります。これがないと、コンテナはホストの devpts を使うため、問題が発生します。

lxc.pts = 1024
ノート: There is no need to explicitly mount system devices (either via the container config or via its own /etc/fstab), and this should not be done because systemd (or LXC in the case of /dev...) takes care of it.
journald の活動の抑制

デフォルトで、lxc は /dev/kmsg から /dev/console にシンボリックリンクを作成します。このシンボリックリンクがあると journald の CPU 消費量が 100% で張り付いてしまいます。シンボリックリンクを作成しないようにするには、次を使って下さい:

lxc.kmsg = 0

Xorg プログラムの設定 (任意)

ホストのディスプレイでプログラムを動かしたい場合、コンテナ化されたプログラムがホストのリソースにアクセスできるようにバインドマウントを定義する必要があります。/var/lib/lxc/playtime/config に以下のセクションを追加してください:

## for xorg
## fix overmounting see: https://github.com/lxc/lxc/issues/434
lxc.mount.entry = tmpfs tmp tmpfs defaults
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir
lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file

OpenVPN の設定

コンテナで OpenVPN を実行したい場合は Linux Containers で OpenVPN の記事を読んで下さい。

コンテナの管理

インストール済みの LXC コンテナを確認するには:

# lxc-ls -f

Systemd で lxc@CONTAINER_NAME.service を使うことで LXC を起動したり停止することができます。lxc@CONTAINER_NAME.service有効化するとホストシステムの起動時に LXC が立ち上がるようになります。

systemd を使わずに LXC を起動・停止することも可能です。コンテナを起動:

# lxc-start -n CONTAINER_NAME

コンテナを停止:

# lxc-stop -n CONTAINER_NAME

コンテナにログインするには:

# lxc-console -n CONTAINER_NAME

ログインしたら、他の linux システムと同じようにコンテナを扱って、root パスワードを設定し、ユーザーを作成、パッケージのインストールなどを行って下さい。

コンテナにアタッチ:

# lxc-attach -n CONTAINER_NAME

lxc-console とほぼ同じですが、自動的にログインを通り越してコンテナの中の root プロンプトにアクセスします。

Xorg プログラムの実行

対象のコンテナにアタッチまたは SSH でログインしてホストの X セッションの DISPLAY ID をプログラムを呼び出すときに指定します。ほとんどの場合、ディスプレイは常時 0 です。

ホストのディスプレイでコンテナから Firefox を起動する例:

$ DISPLAY=:0 firefox

もしくは、直接コンテナにアタッチしたり接続する代わりに、以下のコマンドを使って自動的にホストにディスプレイを設定することもできます:

# lxc-attach -n playtime --clear-env -- sudo -u YOURUSER env DISPLAY=0.0 firefox

トラブルシューティング

root ログインが失敗する

lxc-console を使ってログインしようとすると以下のエラーが表示される場合:

login: root
Login incorrect

そしてコンテナの journalctl で以下のように表示される場合:

pam_securetty(login:auth): access denied: tty 'pts/0' is not secure !

コンテナのファイルシステムにある /etc/securetty のターミナル名のリストに pts/0 を追加してください。[1] を参照。コンテナの /etc/securetty を削除することで常時 root ログインを許可することもできます。[2] を参照。

もしくは、lxc-attach に新しいユーザーを作成してシステムにログインするときに使うようにして、それから root に切り替えて下さい。

# lxc-attach -n playtime
[root@playtime]# useradd -m -Gwheel newuser
[root@playtime]# passwd newuser
[root@playtime]# passwd root
[root@playtime]# exit
# lxc-console -n playtime
[newuser@playtime]$ su

参照