Tips > 仮想化ツール >

目次

非特権コンテナと特権コンテナ

  1. LXC 1.0から非特権コンテナの作成がサポートされています。セキュリティを考慮した場合、非特権コンテナでの運用が強く推奨されます。
  2. 以下は pstree で表示させた3種類のコンテナの例です。最初のものが(従来の)root権限で起動させた特権コンテナ、2つ目のものがroot権限で起動させた非特権コンテナ、最後のものが一般ユーザ(alice)権限で起動させた非特権コンテナです。後の2つのコンテナではプロセスuidの遷移から、コンテナ内のプロセスのオーナーがホストのrootではない(分離されている)ことが分かります(もちろん、他のリソースもきちんと分離されています)。lightbulb.pngroot権限(あるいはlxdのようなヘッドレスアカウント権限)で起動させる非特権コンテナはプロダクションで、一般ユーザ権限で起動させる非特権コンテナは共有開発環境などでの運用に適しているでしょう。
    $ pstree -u
    systemd─┬─accounts-daemon─┬─{gdbus}
             │                   └─{gmain}
             ├─acpid
             ├─agetty
             ├─atd(daemon)
    ...
             ├─lxc-start───systemd─┬─9*[agetty]
             │                          ├─dhclient
             │                          └─systemd-journal
    ...
             ├─lxc-start───systemd(100000)─┬─agetty
             │                                  ├─dhclient
             │                                  └─systemd-journal
    ...
             ├─lxc-start(alice)───systemd(165536)─┬─agetty
             │                                         ├─dhclient
             │                                         └─systemd-journal
    ...
    • subuidとsubgidの設定は以下のようになっています。
      $ cat /etc/subuid
      root:100000:65536
      alice:165536:65536
      
      $ cat /etc/subgid
      root:100000:65536
      alice:165536:65536

インストール

cake.pnglxcs クックブックを利用する

  • lxcs Chefクックブックの lxcs::lxc レシピでLXDのセットアップを行うことができます。

クイックセットアップ

  • 最も簡単なセットアップは以下のように chef-solo を利用して行うことができます。設定のカスタマイズは lxc ロールの編集によって行います。
$ sudo apt-get install ca-certificates curl git
$ curl -L https://omnitruck.chef.io/install.sh | sudo bash
$ git clone git://git.osdn.net/gitroot/metasearch/grid-chef-repo.git
$ cd grid-chef-repo/
$ chef-solo -c solo.rb -j nodes/local-lxc.json

サンプルロール

  • roles/lxc.rb
    1. name 'lxc'
    2. description 'LXC role.'
    3.  
    4. run_list(
    5.   'recipe[lxcs::lxc]',
    6. )
    7.  
    8. override_attributes(
    9.   'lxcs' => {
    10.     'lxc' => {
    11.       'unprivileged_container' => {
    12.         'enabled' => true,
    13.         'users_allow' => [
    14.           'alice',
    15.           'bob',
    16.         ],
    17.       },
    18.       'lxc-usernet' => [
    19.         'alice veth lxcbr0 10',
    20.         'bob veth lxcbr0 10',
    21.       ],
    22.       'env' => {
    23.         'lxc' => {
    24.           'LXC_AUTO' => 'true',
    25.           'BOOTGROUPS' => 'onboot,',
    26.           'SHUTDOWNDELAY' => '5',
    27.           'OPTIONS' => '',
    28.           'STOPOPTS' => '-a -A -s',
    29.           'USE_LXC_BRIDGE' => 'false',
    30.         },
    31.         'lxc-net' => {
    32.           'USE_LXC_BRIDGE' => 'true',
    33.           'LXC_BRIDGE' => 'lxcbr0',
    34.           'LXC_ADDR' => '10.0.3.1',
    35.           'LXC_NETMASK' => '255.255.255.0',
    36.           'LXC_NETWORK' => '10.0.3.0/24',
    37.           'LXC_DHCP_RANGE' => '10.0.3.2,10.0.3.254',
    38.           'LXC_DHCP_MAX' => '253',
    39.         },
    40.       },
    41.       'default.conf' => [
    42.         'lxc.network.type = veth',
    43.         'lxc.network.link = lxcbr0',
    44.         'lxc.network.flags = up',
    45.         'lxc.network.hwaddr = 00:16:3e:xx:xx:xx',
    46.       ],
    47.       'extra-default.conf' => {
    48.         'default-br0.conf' => [
    49.           'lxc.network.type = veth',
    50.           'lxc.network.link = br0',
    51.           'lxc.network.flags = up',
    52.           'lxc.network.hwaddr = 00:16:3e:xx:xx:xx',
    53.         ],
    54.         'default-br0-unpriv.conf' => [
    55.           'lxc.network.type = veth',
    56.           'lxc.network.link = br0',
    57.           'lxc.network.flags = up',
    58.           'lxc.network.hwaddr = 00:16:3e:xx:xx:xx',
    59.           'lxc.id_map = u 0 100000 65536',
    60.           'lxc.id_map = g 0 100000 65536',
    61.         ],
    62.       },
    63.     },
    64.   },
    65. )

ubuntu.pngUbuntu 16.10, 16.04, 15.10, 15.04, 13.04, 12.10

  1. LXC(lxc-1.1.2、lxc-0.8.0~rc1)をパッケージインストールします。Ubuntuでは、依存関係により debootstrap、bridge-utils 等も一緒にインストールされます。cgroupも自動でマウントされ、ネットワーク 10.0.3.0/24 のブリッジインタフェイス(lxcbr0)が自動でセットアップされます(/etc/default/lxc)。
    $ sudo apt-get install lxc

非特権コンテナ(rootによる運用)

  1. rootユーザについて、subuidとsubgid(開始IDと使用するID数)を設定します。IDレンジが他のユーザと重なっていても問題ありません。
    $ cat /etc/subuid
    root:100000:65536
    alice:165536:65536
    
    $ cat /etc/subgid
    root:100000:65536
    alice:165536:65536
    • なお、これらは以下のようにusermodコマンドで設定するのが堅牢なのですが、設定値のフォーマットが「開始ID-最終ID」ですので紛らわしいきらいがあります。
      $ sudo usermod -v 100000-165535 -w 100000-165535 root 
  2. /etc/lxc/default-unpriv.conf: 上記と同じ設定をLXCの設定ファイルにも追加します。この例では設定ファイルを分けていますが、運用に支障がなければデフォルトの設定ファイルを編集しても構いません。
    1. ...
    2. lxc.id_map = u 0 100000 65536
    3. lxc.id_map = g 0 100000 65536
  3. 非特権コンテナの場合、従来のテンプレートでは正常に動作するコンテナが作成できませんので、特別に download テンプレートを指定して作成します。ウィザードでコンテナイメージがリストされ、選択することが可能です。
    $ sudo lxc-create -f /etc/lxc/default-unpriv.conf -t download -n jessie.unpriv
    Setting up the GPG keyring
    Downloading the image index
    
    ---
    DIST    RELEASE ARCH    VARIANT BUILD
    ---
    alpine  3.0     amd64   default 20160630_17:50
    alpine  3.0     i386    default 20160630_17:50
    alpine  3.1     amd64   default 20160722_17:50
    alpine  3.1     armhf   default 20160722_17:50
    alpine  3.1     i386    default 20160722_18:40
    
    ...
    
    Distribution: debian
    Release: jessie
    Architecture: amd64
    
    Downloading the image index
    Downloading the rootfs
    Downloading the metadata
    The image cache is now ready
    Unpacking the rootfs
    
    ---
    You just created a Debian container (release=jessie, arch=amd64, variant=default)
    
    To enable sshd, run: apt-get install openssh-server
    
    For security reason, container images ship without user accounts
    and without a root password.
    
    Use lxc-attach or chroot directly into the rootfs to set a root password
    or create user accounts.
  4. デフォルトのままでは、非特権ユーザでの /var/lib/lxc ディレクトリへのアクセス権がないため起動に失敗しますので、最小限のアクセス権を付与します。
    $ sudo lxc-start -n jessie.unpriv -F
    lxc-start: start.c: print_top_failing_dir: 112 Permission denied - could not access /var/lib/lxc.
      Please grant it 'x' access, or add an ACL for the container root.
    ...
    
    $ sudo ls -ld /var/lib/lxc
    drwx------ 11 root root 4096 Jun 30 16:28 /var/lib/lxc
    
    $ sudo chmod 711 /var/lib/lxc

非特権コンテナ(一般ユーザによる運用)

  1. cgmanager がインストールされていない場合にはインストールします。
    $ sudo apt-get install cgmanager
  2. /etc/lxc/lxc-usernet: ユーザに生成を許可する仮想ネットワークデバイスの数を設定します。
    1. # USERNAME TYPE BRIDGE COUNT
    2. alice veth lxcbr0 10
  3. 対象ユーザについて、subuidとsubgid(開始IDと使用するID数)を設定します。IDレンジが他のユーザと重なっていても問題ありません。
    $ cat /etc/subuid
    root:100000:65536
    alice:165536:65536
    
    $ cat /etc/subgid
    root:100000:65536
    alice:165536:65536
    • なお、これらは以下のようにusermodコマンドで設定するのが堅牢なのですが、設定値のフォーマットが「開始ID-最終ID」ですので紛らわしいきらいがあります。
      $ sudo usermod -v 165536-231071 -w 165536-231071 alice 
  4. 目的のユーザでログインし、そのホームディレクトリ以下に設定のためのディレクトリを用意します。
    $ mkdir -p ~/.config/lxc
  5. ~/.config/lxc/default.conf: 上記のsubuidおよびsubgidと同じ設定をLXCの設定ファイルにも追加します。
    1. ...
    2. lxc.id_map = u 0 165536 65536
    3. lxc.id_map = g 0 165536 65536
  6. 非特権コンテナの場合、従来のテンプレートでは正常に動作するコンテナが作成できませんので、特別に download テンプレートを指定して作成します。ウィザードでコンテナイメージがリストされ、選択することが可能です。
    $ lxc-create -t download -n jessie.unpriv
    ...
    $ lxc-start -n jessie.unpriv
    $ pstree -u
    systemd─┬─accounts-daemon─┬─{gdbus}
             │                   └─{gmain}
             ├─acpid
             ├─agetty
             ├─atd(daemon)
             ├─cgmanager
    ...
             ├─lxc-start(alice)───systemd(165536)─┬─agetty
             │                                         ├─dhclient
             │                                         └─systemd-journal
    ...
  7. 一般ユーザで運用する場合、~/.local/share/lxc 以下に関連ファイルが格納されます。
    $ ls ~/.local/share/lxc
    jessie.unpriv  lxc-monitord.log

ホストの属するネットワークに参加させる(ブリッジ)

  1. bridge-utils パッケージがインストールされていることをあらかじめ確認しておきます。
  2. /etc/network/interfaces: 以下の要領でブリッジインタフェイス(br*)を定義し、物理インタフェイス(eth*、p3p1等)にブリッジします。ifupコマンドやOSの再起動によりインタフェイスを有効にします。なお、最近のUbuntuでは、NetworkManager?が起動していても自動でこれらの静的設定を避け、干渉することはありません。
    1. auto lo
    2. iface lo inet loopback
    3.  
    4. auto br0
    5. iface br0 inet static
    6.         address 192.168.0.123
    7.         netmask 255.255.255.0
    8.         gateway 192.168.0.1
    9.         bridge_ports eth0
    10.         bridge_stp off
  3. このブリッジを利用するLXC設定ファイルを用意します。デフォルトの lxcbr0 をもう使用しない場合には上書きしても構いませんが、併用する場合には以下のようにデフォルト設定を残しておくとよいでしょう。
    $ sudo cp /etc/lxc/default{,-br0}.conf
    1. $ diff -u /etc/lxc/default{,-br0}.conf
    2. --- /etc/lxc/default.conf       2013-07-05 18:17:43.000000000 +0900
    3. +++ /etc/lxc/default-br0.conf   2013-09-18 19:06:25.299346038 +0900
    4. @@ -1,3 +1,3 @@
    5.  lxc.network.type = veth
    6. -lxc.network.link = lxcbr0
    7. +lxc.network.link = br0
    8.  lxc.network.flags = up
  4. コンテナ作成時には、この設定ファイルを指定します。
    $ sudo lxc-create -n mycontainer -f /etc/lxc/default-br0.conf -t debian

自動起動

  • 新しいバージョン(1.0以上?、info.pnglxc.container.conf.5
    1. /var/lib/lxc/mycontainer/config: 対象コンテナの設定ファイルに自動起動の設定を追加します。
      1. # Whether the container should be auto-started. Valid values are 0 (off) and 1 (on).
      2. lxc.start.auto = 1
      3. # How long to wait (in seconds) after the container is started before starting the next one.
      4. lxc.start.delay = 5
      5. # An integer used to sort the containers when auto-starting a series of containers at once.
      6. # lxc.start.order = 0
      7. # A multi-value key (can be used multiple times) to put the container in a container group.
      8. # Those groups can then be used (amongst other things) to start a series of related containers.
      9. #lxc.group
  • 古いバージョン
    1. /etc/lxc/auto ディレクトリに、自動起動させたいコンテナの設定ファイルへのシンボリックリンクを作成します。
      $ sudo ln -s /var/lib/lxc/mycontainer/config /etc/lxc/auto/mycontainer.conf

debian.pngDebian squeeze

  • 6.0(squeeze)では、LXC(lxc-0.7.2-1)がフルサポートされています。
  1. LXCをパッケージインストールします。
    $ sudo apt-get install lxc
  2. 必要に応じてオプションパッケージをインストールします。アプリケーションコンテナだけでなく、システムコンテナ(OSを走らせる)を利用する場合には、debootstrap はほぼ必須でしょう。
    $ sudo apt-get install debootstrap bridge-utils libvirt-bin
  3. もしすでに cgconfig サービス(cgroup-binパッケージ)が起動している場合には、残念ながらそれをLXCで利用することはできませんので停止させ無効にします。
    $ sudo service cgred stop
    $ sudo update-rc.d cgred remove
    $ sudo service cgconfig stop
    $ sudo update-rc.d cgconfig remove
    • そのような場合のエラーは以下の通りです。
      $ sudo lxc-start -n mycontainer
      lxc-start: cgroup is not mounted
      lxc-start: failed to spawn 'mycontainer'
      lxc-start: cgroup is not mounted
  4. /etc/fstab に以下のような内容を追加し、cgroupをマウントします。
    1. cgroup  /sys/fs/cgroup  cgroup  defaults  0   0
    $ sudo mount /sys/fs/cgroup

centos.pngCentOS 6

  • CentOS 6.xのカーネルはLXCが利用する機能(名前空間管理、cgroups)を提供していますが、ユーザスペース管理ツールであるLXCはまだRPMパッケージとして配布されていないため、ソースからインストールします。
  1. ビルドに必要な環境を整えます。
    $ sudo yum install make gcc libcap-devel
  2. ソースをダウンロードし、ビルドの上、インストールします。
    $ wget http://lxc.sourceforge.net/download/lxc/lxc-0.7.4.2.tar.gz
    $ tar -xvzf lxc-0.7.4.2.tar.gz
    $ cd lxc-0.7.4.2
    $ ./configure
    $ make
    $ sudo make install
    $ sudo mkdir -p /usr/local/var/lib/lxc
  3. もしすでに cgconfig サービス(libcgroupパッケージ)が起動している場合には、残念ながらそれをLXC(0.7.4.2)で利用することはできませんので停止させ無効にします。
    $ sudo service cgconfig stop
    $ sudo chkconfig cgconfig off
    • そのような場合のエラーは以下の通りです。
      $ sudo lxc-start -n mycontainer
      lxc-start: no ns_cgroup option specified
      lxc-start: failed to spawn 'mycontainer'
      lxc-start: No such file or directory - failed to remove cgroup '/cgroup/cpuset/mycontainer'
  4. /etc/fstab に以下のような内容を追加し、cgroupをマウントします。
    1. cgroup  /lxc/cgroup  cgroup  defaults  0   0
    $ sudo mkdir -p /lxc/cgroup
    $ sudo mount /lxc/cgroup

コンテナの作成(非特権コンテナ、star.png推奨)

  1. 上記を参考に、非特権コンテナに必要な設定をあらかじめ行っておきます。
  2. 非特権コンテナの場合、従来のテンプレートでは正常に動作するコンテナが作成できませんので、特別に download テンプレートを指定して作成します。ウィザードでコンテナイメージがリストされ、選択することが可能です。当然ながら、一般ユーザで運用する場合には sudo は不要です。
    $ sudo lxc-create -f /etc/lxc/default-unpriv.conf -t download -n jessie.unpriv
    Setting up the GPG keyring
    Downloading the image index
    
    ---
    DIST    RELEASE ARCH    VARIANT BUILD
    ---
    alpine  3.0     amd64   default 20160630_17:50
    alpine  3.0     i386    default 20160630_17:50
    alpine  3.1     amd64   default 20160722_17:50
    alpine  3.1     armhf   default 20160722_17:50
    alpine  3.1     i386    default 20160722_18:40
    
    ...
    
    Distribution: debian
    Release: jessie
    Architecture: amd64
    
    Downloading the image index
    Downloading the rootfs
    Downloading the metadata
    The image cache is now ready
    Unpacking the rootfs
    
    ---
    You just created a Debian container (release=jessie, arch=amd64, variant=default)
    
    To enable sshd, run: apt-get install openssh-server
    
    For security reason, container images ship without user accounts
    and without a root password.
    
    Use lxc-attach or chroot directly into the rootfs to set a root password
    or create user accounts.
  3. (rootで運用した場合)デフォルトのままでは、非特権ユーザでの /var/lib/lxc ディレクトリへのアクセス権がないため起動に失敗しますので、最小限のアクセス権を付与します。
    $ sudo lxc-start -n jessie.unpriv -F
    lxc-start: start.c: print_top_failing_dir: 112 Permission denied - could not access /var/lib/lxc.
      Please grant it 'x' access, or add an ACL for the container root.
    ...
    
    $ sudo ls -ld /var/lib/lxc
    drwx------ 11 root root 4096 Jun 30 16:28 /var/lib/lxc
    
    $ sudo chmod 711 /var/lib/lxc

コンテナの作成(従来の特権コンテナ)

@ubuntu.pngUbuntu 15.10

CentOS 6, 7

  1. 同梱のテンプレートでシステムコンテナを作成します。-R でリリースバージョン(7、6.x)を指定します。
    • 例えば、7を明示的に指定する場合には以下のようになります。
      $ sudo lxc-create -n mycentos7 -t centos -- -R 7

@ubuntu.pngUbuntu 15.04

Debian

  1. 同梱のテンプレートでシステムコンテナを作成します。-r でリリースバージョンを指定しない場合には、最新安定版のOSがセットアップされます。
    • 例えば、Debian 8(jessie)を明示的に指定する場合には以下のようになります。
      $ sudo lxc-create -n myjessie -t debian -- -r jessie

Ubuntu

  1. 同梱のテンプレートでシステムコンテナを作成します。-r でリリースバージョンを指定しない場合には、ホストと同じバージョンのUbuntu、または最新版のLTS OSがセットアップされます。初期ユーザは、ubuntuです。
    • 例えば、Trusty(14.04 LTS)を明示的に指定する場合には以下のようになります。
      $ sudo lxc-create -n mytrusty -t ubuntu -- -r trusty

CentOS 7

  1. こちらでCentOS 7用に改修したテンプレートが公開されていますので、ダウンロードの上、所定の場所にコピーし実行権限を付与します。
    $ sudo cp lxc-centos7.txt /usr/share/lxc/templates/lxc-centos7
    $ sudo chmod 755 /usr/share/lxc/templates/lxc-centos7
  2. このテンプレートを指定してシステムコンテナを作成します。
    $ sudo lxc-create -n mycentos7 -t centos7 -- -R 7
  3. まだ起動に長い時間を要するという問題がありますので、コンテナの設定ファイルを以下のように編集します。
    1. $ sudo diff -u /var/lib/lxc/mycentos7/config{.org,}
    2. --- /var/lib/lxc/mycentos7/config.org     2015-11-02 19:40:00.629163298 +0900
    3. +++ /var/lib/lxc/mycentos7/config 2015-11-02 19:40:26.961646892 +0900
    4. @@ -8,7 +8,7 @@
    5.  lxc.rootfs = /var/lib/lxc/centos7/rootfs
    6.  
    7.  # Include common configuration
    8. -lxc.include = /usr/share/lxc/config/centos.common.conf
    9. +lxc.include = /usr/share/lxc/config/fedora.common.conf
    10.  
    11.  lxc.arch = x86_64

CentOS 6, 5

  1. 同梱のテンプレートでシステムコンテナを作成します。-R でリリースバージョン(6.x、5.x)を指定します。CentOS 7には未対応のようです。
    • 例えば、6.7を明示的に指定する場合には以下のようになります。
      $ sudo lxc-create -n mycentos6 -t centos -- -R 6.7

@ubuntu.pngUbuntu 13.04, 12.10

Debian 8 jessie

  1. 同梱のテンプレートのために環境変数 SUITE を設定してシステムコンテナを作成しますが、コードネームの jessie はまだ有効ではないため、testing を設定します。
    $ sudo bash -c 'export SUITE=jessie;lxc-create -t debian -n myjessie'
    
    lxc-create: No config file specified, using the default config /etc/lxc/default.conf
    debootstrap is /usr/sbin/debootstrap
    Checking cache download in /var/cache/lxc/debian/rootfs-jessie-amd64 ... 
    Downloading debian minimal ...
    E: No such script: /usr/share/debootstrap/scripts/jessie
    Failed to download the rootfs, aborting.
    Failed to download 'debian base'
    failed to install debian
    lxc-create: failed to execute template 'debian'
    lxc-create: aborted
    
    $ sudo bash -c 'export SUITE=testing;lxc-create -t debian -n myjessie'

Debian 7 wheezy

  1. 同梱のテンプレートのために環境変数 SUITE に wheezy を設定してシステムコンテナを作成します。
    $ sudo bash -c 'export SUITE=wheezy;lxc-create -t debian -n mywheezy'

Debian 6 squeeze

  1. 同梱のテンプレートでシステムコンテナを作成します。
    $ sudo lxc-create -n mysqueeze -t debian

Ubuntu

  1. 同梱のテンプレートでシステムコンテナを作成します。-r でリリースバージョンを指定しない場合には、ホストと同じバージョンのOSがセットアップされます。初期ユーザは、ubuntuです。
    $ sudo lxc-create -n myraring -t ubuntu
    • 例えば、Precise(12.04 LTS)を明示的に指定する場合には以下のようになります。
      $ sudo lxc-create -n myprecise -t ubuntu -- -r precise

CentOS 6

  1. ルートファイルシステム作成に必要なパッケージをインストールしておきます。
    $ sudo apt-get install curl yum
  2. CentOS 6用のテンプレートは用意されていませんので、こちらから入手してコピーします。
    $ git clone git://gist.github.com/3514296.git
    $ sudo cp 3514296/lxc-centos /usr/share/lxc/templates/lxc-centos6
    $ sudo chmod 755 /usr/share/lxc/templates/lxc-centos6
  3. note.pngマイナーリリース直後やi386アーキテクチャ環境の場合にはテンプレートに問題がある可能性がありますので、上記の@Debian同様に修正します。
  4. このテンプレートを使ってシステムコンテナを作成します。
    $ sudo lxc-create -n mycentos6 -t centos6

@debian.pngDebian squeeze

Debian squeeze

  1. 既存のテンプレートをコピーし、squeeze用に編集します。
    $ sudo cp -a /usr/lib/lxc/templates/lxc-debian /usr/lib/lxc/templates/lxc-squeeze
    1. $ diff -u /usr/lib/lxc/templates/lxc-debian /usr/lib/lxc/templates/lxc-squeeze
    2. --- /usr/lib/lxc/templates/lxc-debian 2010-08-05 02:55:28.000000000 +0900
    3. +++ /usr/lib/lxc/templates/lxc-squeeze 2013-02-05 18:46:22.000000000 +0900
    4. @@ -90,7 +90,7 @@
    5.  locales,\
    6.  libui-dialog-perl,\
    7.  dialog,\
    8. -dhcp-client,\
    9. +isc-dhcp-client,\
    10.  netbase,\
    11.  net-tools,\
    12.  iproute,\
    13. @@ -110,7 +110,7 @@
    14.      echo "Downloading debian minimal ..."
    15.      debootstrap --verbose --variant=minbase --arch=$arch \
    16.   --include $packages \
    17. - lenny $cache/partial-$arch http://ftp.debian.org/debian
    18. + squeeze $cache/partial-$arch http://ftp.debian.org/debian
    19.      if [ $? -ne 0 ]; then
    20.   echo "Failed to download the rootfs, aborting."
    21.   return 1
  2. システムコンテナを作成します。
    $ sudo lxc-create -n mysqueeze -t squeeze
  3. 利用環境にあわせてネットワークインタフェイスの設定を行います。そのままではホストのインタフェイスを共有してしまいますので、大抵の環境で問題となるでしょう。

CentOS 6

  1. ルートファイルシステム作成に必要なパッケージをインストールしておきます。
    $ sudo apt-get install curl yum
  2. CentOS 6用のテンプレートは用意されていませんので、こちらから入手してコピーします。ソースがすでに入手済の場合には、git pull で最新にしてからコピーします。
    $ git clone git://gist.github.com/3514296.git
    $ sudo cp 3514296/lxc-centos /usr/lib/lxc/templates/lxc-centos6
    $ sudo chmod 755 /usr/lib/lxc/templates/lxc-centos6
    1. note.pngマイナーリリースされると、このテンプレートはすぐに陳腐化してしまいますので、そのような場合には以下の要領で編集します。
      1. $ diff -u 3514296/lxc-centos /usr/share/lxc/templates/lxc-centos6
      2. --- 3514296/lxc-centos  2013-12-13 23:19:35.775453141 +0900
      3. +++ /usr/share/lxc/templates/lxc-centos6        2013-12-13 23:49:11.212060875 +0900
      4. @@ -167,9 +167,9 @@
      5.              echo "Failed to get a mirror"
      6.              continue
      7.          fi
      8. -        RELEASE_URL="$MIRROR_URL/Packages/centos-release-$release-$releaseminor.el6.centos.10.$arch.rpm"
      9. +        RELEASE_URL="$MIRROR_URL/Packages/centos-release-$release-$releaseminor.el6.centos.11.1.$arch.rpm"
      10.          echo "Fetching from $RELEASE_URL"
      11. -        curl -f "$RELEASE_URL" > $INSTALL_ROOT/centos-release-$release-$releaseminor.centos.$arch.rpm
      12. +        curl -L -f "$RELEASE_URL" > $INSTALL_ROOT/centos-release-$release-$releaseminor.centos.$arch.rpm
      13.          if [ $? -ne 0 ]; then
      14.              echo "Failed to download centos release rpm"
      15.              continue
      16. @@ -403,7 +403,7 @@
      17.  fi
      18.  
      19.  if [ -z "$releaseminor" ]; then
      20. -  releaseminor=4
      21. +  releaseminor=5
      22.  fi
      23.  
      24.  if [ "$(id -u)" != "0" ]; then
    2. note.pngまた、i386アーキテクチャ環境ではテンプレートに少し問題がありますので修正します。
      1. $ diff -u 3514296/lxc-centos /usr/lib/lxc/templates/lxc-centos6
      2. --- 3514296/lxc-centos 2013-02-06 19:18:56.000000000 +0900
      3. +++ /usr/lib/lxc/templates/lxc-centos6 2013-02-06 19:20:24.000000000 +0900
      4. @@ -27,6 +27,7 @@
      5.  
      6.  #Configurations
      7.  arch=$(arch)
      8. +rpm_arch=$arch
      9.  cache_base=/var/cache/lxc/centos/$arch
      10.  default_path=/var/lib/lxc
      11.  root_password=password
      12. @@ -164,9 +165,9 @@
      13.              echo "Failed to get a mirror"
      14.              continue
      15.          fi
      16. -        RELEASE_URL="$MIRROR_URL/Packages/centos-release-$release-$releaseminor.el6.centos.9.$arch.rpm"
      17. +        RELEASE_URL="$MIRROR_URL/Packages/centos-release-$release-$releaseminor.el6.centos.9.$rpm_arch.rpm"
      18.          echo "Fetching from $RELEASE_URL"
      19. -        curl -f "$RELEASE_URL" > $INSTALL_ROOT/centos-release-$release-$releaseminor.centos.$arch.rpm
      20. +        curl -f "$RELEASE_URL" > $INSTALL_ROOT/centos-release-$release-$releaseminor.centos.$rpm_arch.rpm
      21.          if [ $? -ne 0 ]; then
      22.              echo "Failed to download centos release rpm"
      23.              continue
      24. @@ -181,7 +182,7 @@
      25.  
      26.      mkdir -p $INSTALL_ROOT/var/lib/rpm
      27.      rpm --root $INSTALL_ROOT  --initdb
      28. -    rpm --root $INSTALL_ROOT -ivh $INSTALL_ROOT/centos-release-$release-$releaseminor.centos.$arch.rpm
      29. +    rpm --root $INSTALL_ROOT -ivh $INSTALL_ROOT/centos-release-$release-$releaseminor.centos.$rpm_arch.rpm
      30.      $YUM install $PKG_LIST
      31.      chroot $INSTALL_ROOT rm -f /var/lib/rpm/__*
      32.      chroot $INSTALL_ROOT rpm --rebuilddb
  3. このテンプレートを使ってシステムコンテナを作成します。
    $ sudo lxc-create -n mycentos6 -t centos6
  4. fstab の設定がそのままではマウントに失敗しますので、以下の要領で修正します。
    1. $ sudo diff -u /var/lib/lxc/mycentos6/fstab.dist /var/lib/lxc/mycentos6/fstab
    2. --- /var/lib/lxc/mycentos6/fstab.dist 2013-02-07 18:42:16.000000000 +0900
    3. +++ /var/lib/lxc/mycentos6/fstab 2013-02-07 19:00:15.000000000 +0900
    4. @@ -1,2 +1,2 @@
    5. -proc            proc         proc    nodev,noexec,nosuid 0 0
    6. -sysfs           sys          sysfs defaults  0 0
    7. +proc            /var/lib/lxc/mycentos6/rootfs/proc         proc    nodev,noexec,nosuid 0 0
    8. +sysfs           /var/lib/lxc/mycentos6/rootfs/sys          sysfs defaults  0 0
  5. 利用環境にあわせてネットワークインタフェイスの設定を行います。そのままではホストのインタフェイスを共有してしまいますので、大抵の環境で問題となるでしょう。

@centos.pngCentOS 6

Debian squeeze

  1. ルートファイルシステム作成に必要な debootstrap をインストールします。debootstrap パッケージは、EPELリポジトリからインストールできます。
    $ sudo yum install debootstrap
  2. 既存のテンプレートをコピーして squeeze 用に少し編集します。元のままでも問題ないのですが、dhcp3-clientは移行パッケージですので、isc-dhcp-clientに変更しています。
    $ sudo cp -a /usr/local/lib/lxc/templates/lxc-debian /usr/local/lib/lxc/templates/lxc-squeeze
    1. $ diff -u /usr/local/lib/lxc/templates/lxc-debian /usr/local/lib/lxc/templates/lxc-squeeze
    2. --- /usr/local/lib/lxc/templates/lxc-debian 2013-02-05 19:48:02.636456658 +0900
    3. +++ /usr/local/lib/lxc/templates/lxc-squeeze 2013-02-07 19:20:04.139511362 +0900
    4. @@ -102,7 +102,7 @@
    5.  locales,\
    6.  libui-dialog-perl,\
    7.  dialog,\
    8. -dhcp3-client,\
    9. +isc-dhcp-client,\
    10.  netbase,\
    11.  net-tools,\
    12.  iproute,\
  3. このテンプレートを使ってシステムコンテナを作成します。
    $ sudo lxc-create -n mysqueeze -t squeeze
  4. 利用環境にあわせてネットワークインタフェイスの設定を行います。そのままではホストのインタフェイスを共有してしまいますので、大抵の環境で問題となるでしょう。

起動と停止

最新バージョン(1.x?)

  1. デフォルトでは、バックグラウンドで起動されます。lxc-consoleコマンドでコンソールにアタッチします。コンソールをデタッチする場合には、Ctrl+a、qをタイプします。
    $ lxc-start -n mycontainer
    $ sudo lxc-console -n mycontainer
  2. フォアグラウンドで起動させたい場合には、-F オプションを付加します。
    $ sudo lxc-start -n mycontainer -F
  3. 停止させます。
    $ sudo lxc-stop -n mycontainer

旧バージョン

  1. デフォルトでは、バックグラウンドで起動され、コンソールが表示されます。
    $ lxc-start -n mycontainer
  2. またはバックグランドで起動させ、コンソールにアタッチします。
    $ sudo lxc-start -n mycontainer -d
    $ sudo lxc-console -n mycontainer
  3. 停止させます。
    $ sudo lxc-stop -n mycontainer

Tips

*.common.conf ロードエラー

  • Ubuntu 18.04に更新すると *.common.conf ファイルのロードに失敗するようになります。
    $ sudo lxc-ls -f
    ...
    lxc-ls: parse.c: lxc_file_for_each_line_mmap: 102 Failed to parse config: lxc.include = /usr/share/lxc/config/ubuntu.common.conf
    Failed to load config for xenial
  • lxc-templates パッケージをインストールすれば解消します。
    $ sudo apt-get install lxc-templates
  • 参考: lxc-update-config misses old lxc.include common config

LXC 2.1 設定キーの変更

  • LXC 2.1(Ubuntu 17.10)では設定のキーが多数変更されています。以下のコマンドでそれらの更新されたキーを一括して変換することができます。
    $ sudo lxc-update-config -c /path/to/config
  • 参考: LXC 2.1 has been released

ケイパビリティ・ドロップによる Systemd 管理サービスの起動失敗の回避

  • ケイパビリティ(capabilities)がドロップされているコンテナ環境では、Systemd のいくつかの機能が正しく動作せずサービスの起動に失敗することがあります。それらの機能を無効化しサービスが起動できるようにします。
  1. Kerberos

データの共有

  1. ホストとコンテナとの間で簡単にデータを共有したい場合には、あらかじめその対象のディレクトリをbindマウントするとよいでしょう。
    $ sudo mount --bind /home/alice/chef-repo /var/lib/lxc/deb4chef/rootfs/home/alice/chef-repo
  2. またコンテナ起動時に動的にマウントしたい場合には、コンテナの設定に lxc.mount.entry を用いて設定します。
    1. lxc.mount.entry = /home/alice/chef-repo home/alice/chef-repo none bind 0 0

note.png非特権コンテナの場合

  • 非特権コンテナは、ホストとコンテナのリソースを完全に分離する目的で使用するものですので、ファイルシステムレベルでデータを共有することにはそもそも矛盾があります。
  • bindマウントすることは可能ですが、ホストと非特権コンテナではuid:gidのレンジが分離されていますので、マウントされたファイルシステムのオーナーは nobody:nogroup として見えることになります。おそらくこれは期待した動作ではないかもしれませんが、セキュリティ的には理に適ったものです。外部の永続化ストレージの利用を検討しましょう。

udevの停止

  1. 何らかの依存関係でゲストOSにudevがインストールされてしまい起動に失敗する場合には、もしudevの機能が不要であれば停止させてしまいます。
    $ cat /var/lib/lxc/centos6/rootfs/etc/rc.d/rc.sysinit | grep udev
    #/sbin/start_udev

OS初期設定方法

参考リソース

  1. lxc Linux Containers
  2. http://wiki.debian.org/LXC
  3. https://help.ubuntu.com/12.10/serverguide/lxc.html
  4. http://oss.fulltrust.co.jp/doc/ubuntu12.04/lxc.html
  5. RHEL6.0 で LXC (Linux コンテナ)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-23 (土) 10:01:32 (27d)