2 Linuxコンテナの管理
警告:
Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。
できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。
この章では、組織のニーズとプリファレンスに応じてLinuxコンテナを構成およびカスタマイズする様々な方法について説明します。
ノート:
このドキュメント全体を通して、特に指定されていないかぎり、ホストシステムで提供されているすべてのコマンドを実行する必要があります。
オペレーティング・システム・コンテナの構成
次以降の項では、Oracle Linux yumサーバーのパッケージからインストールされたルート・ファイル・システムのコピーを含むLinuxコンテナを設定する方法について説明します。
ソフトウェアのインストールおよび構成
-
btrfs-progs
パッケージをインストールします。sudo yum install btrfs-progs
-
lxc
およびwget
パッケージをインストールします。sudo yum install lxc wget
このコマンドは、必要なパッケージをすべてインストールします。LXCテンプレート・スクリプトは、
/usr/share/lxc/templates
にインストールされます。LXCは、wgetを使用して、パッケージをOracle Linux yumサーバーからダウンロードします。 -
LXCネットワーク管理サービス
lxc-net
を起動し、ブート時にサービスが開始するように構成します。sudo systemctl start lxc-net.service sudo systemctl enable lxc-net.service
LXCには、コンテナのネットワーク・ブリッジングをサポートする独自のネットワーク管理サービスが含まれています。
-
LXCヘッダー・ファイルおよびライブラリを必要とするアプリケーションをコンパイルする場合は、
lxc-devel
パッケージをインストールします。sudo yum install lxc-devel
コンテナのファイル・システムの設定
ノート:
LXCテンプレート・スクリプトでは、コンテナが/container
に作成されると仮定します。システムの構成がこの仮定と異なる場合、スクリプトを編集する必要があります。
-
/dev/sdb
など、適切にサイズ調整されたデバイス上でbtrfsファイル・システムを作成します。sudo mkfs.btrfs /dev/sdb
-
/container
ファイル・システムをマウントします。/container
ディレクトリは、LXCのインストール時に自動的に作成されます。sudo mount /dev/sdb /container
-
/etc/fstab
ファイルに/container
のエントリを追加します。/dev/sdb /container btrfs defaults 0 0
詳細は、Oracle Linux 7: ファイル・システムの管理のBtrfsファイル・システムについてを参照してください。
コンテナの作成および起動
ノート:
この項の手順では、/usr/share/lxc/templates
にある、Oracle Linux(lxc-oracle
)用のLXCテンプレート・スクリプトを使用します。
Oracle Linuxコンテナは、最低でも400MBのディスク容量を必要とします。
-
lxc-oracle
テンプレート・スクリプトを使用してol6ctr1
というOracle Linux 6コンテナを作成します。sudo lxc-create -n ol6ctr1 -B btrfs -t oracle -- --release=6.latest
Host is OracleEverything 7.0 Create configuration file /container/ol6ctr1/config Yum installing release 6.latest for x86_64 . . . yum-metadata-parser.x86_64 0:1.1.2-16.el6 zlib.x86_64 0:1.2.3-29.el6 Complete! Rebuilding rpm database Patching container rootfs /container/ol6ctr1/rootfs for Oracle Linux 6.5 Configuring container for Oracle Linux 6.5 Added container user:oracle password:oracle Added container user:root password:root Container : /container/ol6ctr1/rootfs Config : /container/ol6ctr1/config Network : eth0 (veth) on lxcbr0
ノート:
LXCバージョン1.0以上で、btrfsのスナップショット機能を使用する場合は、-B btrfsオプションを指定する必要があります。詳細は、
lxc-create(1)
マニュアル・ページを参照してください。lxc-createコマンドによって、テンプレート・スクリプト
lxc-oracle
が実行され、ルート・ファイル・システムとしてbtrfsサブボリューム/container/ol6ctr1/rootfs
を持つ/container/ol6ctr1
にコンテナが作成されます。コマンドは、次にyumを使用して、Oracle Linux yumサーバーからOracle Linux 6の使用可能な最新の更新をインストールします。また、コンテナの構成設定を/container/ol6ctr1/config
ファイルに、そのfstab
ファイルを/container/ol6ctr1/fstab
に書き込みます。コンテナのデフォルト・ログ・ファイルは/container/ol6ctr1/ol6ctr1.log
です。lxc-createには、--オプションの後に、次のテンプレート・オプションを指定できます。
- -a | --arch=i386|x86_64
-
アーキテクチャを指定します。デフォルト値は、ホストのアーキテクチャです。
- --baseurl=pkg_repo
-
パッケージ・リポジトリのファイルURIを指定します。また、次のように--archオプションと--releaseオプションを使用して、アーキテクチャとリリースも指定する必要があります。
mount -o loop OracleLinux-R7-GA-Everything-x86_64-dvd.iso /mnt lxc-create -n ol70beta -B btrfs -t oracle -- -R 7.0 -a x86_64 --baseurl=file:///mnt/Server
- -P | --patch=path
-
指定したパスの
rootfs
にパッチを適用します。 - --privileged[=rt]
-
/proc
階層下の特定のカーネル・パラメータの値を調整できます。コンテナは、権限ファイルを使用して、いくつかの例外を除き、
/proc
読取り専用をマウントします。Oracle Linuxコンテナのカーネル・パラメータ設定の構成を参照してください。このオプションにより
CAP_SYS_NICE
機能も有効になり、ネガティブなnice
値(スケジューリングに適しています)を設定することで、コンテナ内から処理ができます。=rt (リアルタイム)修飾子を指定すると、コンテナの構成ファイル内またはコンテナの起動時に、
lxc.cgroup.cpu.rt_runtime_us
設定を構成できます。この設定は、cpu.rt_period_us
のシステム全体の値によって設定された基本期間からコンテナがCPUリソースにアクセスできる最大継続期間(マイクロ秒)を指定します。それ以外の場合、コンテナはcpu.rt_runtime_us
のシステム全体の値を使用し、消費するCPUリソースが多くなりすぎる可能性があります。また、この修飾子は、コンテナの再起動によって、すべてのプロセスの終了、およびクリーンな状態への起動が確実に行われるようにします。 - -R | --release=major.minor
-
インストールするOracleリリースのメジャー・リリース番号とマイナー更新番号を指定します。majorの値は、4、5、6または7に設定できます。minorに
latest
を指定すると、利用できる最新のメジャー・リリースのリリース・パッケージがインストールされます。ホストがOracle Linuxを実行している場合、デフォルト・リリースはホストにインストールされているリリースと同じです。それ以外の場合、デフォルト・リリースは、Oracle Linux 6の最新の更新です。 - -r | --rpms=rpm_name
-
指定したRPMをコンテナにインストールします。
- -t | --templatefs=rootfs
-
既存のシステム、コンテナまたはコピーしたいOracle VMテンプレートのルート・ファイル・システムへのパスを指定します。このオプションは、他のテンプレート・オプションとともに指定しないでください。追加コンテナの作成を参照してください。
- -u | --url=repo_URL
-
Oracle Public Yum以外のYumリポジトリを指定します。たとえば、ローカルYumサーバーからインストールを実行する場合があります。リポジトリ・ファイルは、コンテナのルート・ファイル・システムの、
/etc/yum.repos.d
に構成されます。デフォルトのURLはhttps://yum.oracle.com
です。
-
コンテナの追加のコピーを初期状態で作成したい場合、コンテナのルート・ファイル・システムのスナップショットを作成します。たとえば:
sudo btrfs subvolume snapshot /container/ol6ctr1/rootfs /container/ol6ctr1/rootfs_snap
Oracle®Linux 7: ファイル・システムの管理のBtrfsファイル・システムについておよび追加コンテナの作成を参照してください。
-
デフォルト・ログ・ファイル以外のログ・ファイルに診断出力を書き込むデーモンとしてコンテナ
ol6ctr1
を起動します。sudo lxc-start -n ol6ctr1 -d -o /container/ol6ctr1_debug.log -l DEBUG
ノート:
-dオプションを省略すると、コンテナのコンソールは現在のシェル内で開きます。
使用できるロギング・レベルは、
FATAL
、CRIT
、WARN
、ERROR
、NOTICE
、INFO
、およびDEBUG
です。すべてのlxc-*コマンドにロギング・レベルを設定できます。ホスト・システム上でps -ef --forestコマンドを実行し、
lxc-start
プロセス以下のプロセス・ツリーに、/usr/sbin/sshd
および/sbin/mingetty
プロセスがコンテナで起動したことが示されたら、ホストからコンテナにログインできます。コンテナへのログインを参照してください。
lxc-oracleテンプレート・スクリプトについて
ノート:
テンプレート・スクリプトを修正すると、それ以降そのスクリプトから作成するすべてのコンテナの構成ファイルが変更されます。コンテナのconfig
ファイルを修正すると、そのコンテナに加えて、それ以降にクローニングを行うすべてのコンテナの構成が変更されます。
lxc-oracle
テンプレート・スクリプトでは、実行中のコンテナに割り当てられる次のようなシステム設定とリソースが定義されます。
-
oracle
ユーザーとroot
ユーザーのデフォルト・パスワードで、それぞれoracle
およびroot
に設定されています -
ホスト名(
lxc.utsname
)で、コンテナの名前に設定されています -
使用可能なターミナルの数(
lxc.tty
)で、4に設定されています -
ホスト上のコンテナのルート・ファイル・システムの場所(
lxc.rootfs
) -
fstab
マウント構成ファイルの場所(lxc.mount
) -
コンテナで使用できないすべてのシステム機能(
lxc.cap.drop
) -
ローカル・ネットワーク・インタフェース構成(
lxc.network
) -
許可されるすべてのcgroupデバイス(
lxc.cgroup.devices.allow
)
テンプレート・スクリプトは、仮想ネットワーク・タイプ(lxc.network.type
)とブリッジ(lxc.network.link
)を、veth
とlxcbr0
に設定します。外部システムがネットワークを介してコンテナにアクセスできるようにするmacvlanブリッジまたは仮想イーサネット・ポート・アグリゲータを使用する場合、コンテナの構成ファイルを変更する必要があります。vethとmacvlanについておよびmacvlanを使用するためのコンテナの変更を参照してください。
セキュリティを強化するには、lxc.cap.drop
機能を非コメント化して、コンテナでroot
が特定のアクションを実行しないようにします。たとえば、sys_admin
機能を削除すると、root
がコンテナのfstab
エントリを書込み可能として再マウントすることを防げます。ただし、sys_admin
を削除すると、コンテナですべてのファイル・システムをマウントできず、hostnameコマンドが無効になります。デフォルトで、テンプレート・スクリプトでは、次の機能が削除されます: mac_admin
、mac_override
、setfcap
、setpcap
、sys_module
、sys_nice
、sys_pacct
、sys_rawio
およびsys_time
。
詳細は、capabilities(7)
およびlxc.conf(5)
の各マニュアル・ページを参照してください。
コンテナを作成すると、テンプレート・スクリプトにより、コンテナの構成設定とマウント構成が/container/name/config
および/container/name/fstab
に書き込まれ、コンテナのルート・ファイル・システムが/container/name/rootfs
配下に設定されます。
クローンに既存のルート・ファイル・システムを指定しないかぎり、テンプレート・スクリプトにより、rootfs
に次のパッケージが(デフォルトでは、https://yum.oracle.com
のOracle Linux Yum Serverから)インストールされます。
-
chkconfig
:/etc/rc*.d
階層を維持するためのchkconfigユーティリティ。 -
dhclient
: DHCPクライアント・デーモン(dhclient
)とdhclient-script
。 -
initscripts
:/etc/inittab
ファイルと/etc/init.d
スクリプト。 -
openssh-server
: オープン・ソースのSSHサーバー・デーモン(/usr/sbin/sshd
)。 -
oraclelinux-release
: Oracle Linuxのリリースと情報ファイル。 -
passwd
: PAMを使用してパスワードを設定または変更するためのpasswdユーティリティ。 -
policycoreutils
: SELinuxポリシー・コア・ユーティリティ。 -
rootfiles
:root
ユーザーが必要とする基本ファイル。 -
rsyslog
: 強化されたシステム・ロギング・デーモンおよびカーネル・メッセージ・トラップ・デーモン。 -
vim-minimal
: VIMエディタの最小バージョン。 -
yum
: RPMパッケージをインストール、更新および管理するためのyumユーティリティ。
テンプレート・スクリプトは、コンテナのネットワークを設定し、ボリューム管理(LVM)、デバイス管理(udev
)、ハードウェア・クロック、readahead
およびPlymouthブート・システムなどの不必要なサービスを無効にするための、rootfs
配下のシステム構成ファイルを編集します。
vethとmacvlanについて
デフォルトでは、lxc-oracle
テンプレート・スクリプトは、vethブリッジを設定することによってネットワークを設定します。このモードでは、コンテナは、lxc-net
サービスがコンテナとホストの間のプライベート仮想ブリッジ・ネットワーク(lxcbr0
)上で実行しているdnsmasq
サーバーからIPアドレスを取得します。このホストでは、コンテナはiptables
のNATルールを使用してネットワークの残りの部分に接続できますが、これらのルールではコンテナへの着信接続はできません。vethブリッジ上のホストと他のコンテナは、どちらもブリッジを介してコンテナに対してネットワーク・アクセスします。
図2-1に、vethブリッジlxcbr0
を介して接続されている2つのコンテナを持つホスト・システムを示します。
図2-1 vethブリッジを使用しているコンテナのネットワーク構成

ネットワーク接続がホスト外部からコンテナ経由で接続できるようにしたい場合、コンテナはホストと同じネットワーク上のIPアドレスを持つ必要があります。この構成を実現する方法の1つは、macvlanブリッジを使用して、コンテナのための独立した論理ネットワークを作成することです。このネットワークは、実質的には、ホストのネットワーク・インタフェースに接続されたローカル・ネットワークの拡張です。外部システムは、まるでネットワーク上の独立したシステムであるかのようにコンテナにアクセスでき、コンテナは、ブリッジ上に構成された他のコンテナや外部のシステムへのネットワーク・アクセスを持っています。コンテナは、ローカル・ネットワーク上の外部DHCPサーバーからIPアドレスを取得することもできます。ただし、vethブリッジとは異なり、ホスト・システムは、コンテナへのネットワーク・アクセスを持っていません。
図2-2に、macvlanブリッジを介して接続されている2つのコンテナを持つホスト・システムを示します。
図2-2 macvlanブリッジを使用しているコンテナのネットワーク構成

コンテナがネットワーク上で互いを認識できないようにするには、macvlanの仮想イーサネット・ポート・アグリゲータ(VEPA)モードを構成します。図2-3に、macvlan VEPAにより別々にネットワークに接続されている2つのコンテナを持つホスト・システムを示します。各コンテナは実質的にネットワークに直接接続されますが、どちらのコンテナもネットワーク経由で他のコンテナやホストにアクセスできません。
図2-3 macvlan VEPAを使用しているコンテナのネットワーク構成

macvlanの構成の詳細は、macvlanを使用するためのコンテナの変更と、lxc.conf(5)
のマニュアル・ページを参照してください。
macvlanを使用するためのコンテナの変更
ブリッジまたはmacvlanのVEPAモードを使用するようにコンテナを変更するには、/container/name/config
を編集して、次の行を上書きします。
lxc.network.type = veth lxc.network.link = lxcbr0 lxc.network.flags = up
ブリッジ・モードの場合は次のように上書きします:
lxc.network.type = macvlan lxc.network.macvlan.mode = bridge lxc.network.flags = up lxc.network.link = eth0
VEPAモードの場合は次のように上書きします:
lxc.network.type = macvlan lxc.network.macvlan.mode = vepa lxc.network.flags = up lxc.network.link = eth0
これらのサンプル構成で、lxc.network.link
の設定では、コンテナのネットワーク・インタフェースが、ホストのeth0
インタフェース経由でアクセスできるネットワーク上で認識できるようにすることを想定しています。
静的IPアドレスを使用するためのコンテナの変更
デフォルトでは、macvlanによって接続されているコンテナは、ローカル・ネットワーク上のDHCPサーバーからIPアドレスを取得します。コンテナにサーバーの動作をさせる場合、通常は静的IPアドレスを構成します。コンテナに静的IPアドレスを提供するようにDHCPを構成することも、コンテナのconfig
ファイル内でアドレスを定義することもできます。
DHCPを使用してコンテナが取得しない静的IPアドレスを構成するには:
-
/container/name/rootfs/etc/sysconfig/network-scripts/ifcfg-iface
(ifaceはネットワーク・インタフェースの名前)を編集し、次の行を変更します。BOOTPROTO=dhcp
変更後:
BOOTPROTO=none
-
/container/name/config
ファイルに次の行を追加します。lxc.network.ipv4 = xxx.xxx.xxx.xxx/prefix_length
前の例では、
xxx.xxx.xxx.xxx/prefix_length
は、コンテナのIPアドレス(CIDR形式)です。例:192.168.56.100/24
。ノート:
アドレスは、ネットワーク上で使用中であったり、DHCPサーバーによって別のシステムに割り当てられる候補であったりしてはなりません。
コンテナによって提供されるネットワーク・サービスへのアクセスを許可するようにホスト上のファイアウォールを構成することが必要になる場合もあります。
コンテナへのログイン
sudo lxc-console -n name [-t tty_number]
tty番号を指定しない場合は、最初に利用できるターミナルにログインします。
ol6ctr1
上のターミナルにログインするには、次のように入力します。
sudo lxc-console -n ol6ctr1
lxc-consoleセッションを終了するには、[Ctrl]+[A]
、[Q]
の順に入力します。
また、lxc-0.9.0-2.0.5
パッケージ(またはこのパッケージの以降のバージョン)をインストールする場合は、sshを使用してコンテナにログインできます。
ノート:
lxc-consoleを使用したログインを可能にするには、コンテナでターミナルの/sbin/mingetty
プロセスを実行している必要があります。同様に、sshを使用する場合、コンテナでSSHデーモン(/usr/sbin/sshd
)を実行している必要があります。
追加コンテナの作成
既存のコンテナをクローニングするには、この例に示すように、lxc-cloneコマンド\を使用します。
sudo lxc-clone -o ol6ctr1 -n ol6ctr2
sudo lxc-create -n ol6ctr3 -B btrfs -t oracle -- --templatefs=/container/ol6ctr1/rootfs_snap
この例は、新しいコンテナのrootfs
を、コンテナol6ctr1
に属するrootfs
のスナップショットからコピーします。追加のコンテナは/container/ol6ctr3
に作成され、新しいrootfs
スナップショットが/container/ol6ctr3/rootfs
に作成されます。
ノート:
LXCバージョン1.0以上で、btrfsのスナップショット機能を使用する場合は、-B btrfsオプションを指定する必要があります。詳細は、lxc-create(1)
マニュアル・ページを参照してください。
コンテナのホスト名を変更するには、/container/name/rootfs/etc/sysconfig/network
および/container/name/rootfs/etc/sysconfig/network-scripts/ifcfg-iface
のHOSTNAME
設定を編集します。ここでifaceはネットワーク・インタフェースの名前です(eth0
など)。
コンテナの監視および停止
構成されているコンテナを表示するには、lxc-lsコマンドを使用します。
sudo lxc-ls
ol6ctr1 ol6ctr2
ホスト・システム上で動作しているコンテナを表示するには、--activeオプションを指定します。
sudo lxc-ls --active
ol6ctr1
sudo lxc-info -n ol6ctr1
Name: ol6ctr1 State: RUNNING PID: 5662 IP: 192.168.122.188 CPU use: 1.63 seconds BlkIO use: 18.95 MiB Memory use: 11.53 MiB KMem use: 0 bytes Link: vethJHU5OA TX bytes: 1.42 KiB RX bytes: 6.29 KiB Total bytes: 7.71 KiB
コンテナの状態は、ABORTING
、RUNNING
、STARTING
、STOPPED
またはSTOPPING
のいずれかです。lxc-infoによってコンテナがRUNNING
状態であると表示されても、/usr/sbin/sshd
または/sbin/mingetty
プロセスがコンテナで起動していなければ、ログインすることはできません。コンテナでinit
またはsystemd
プロセスが最初にネットワーキングおよび構成済の他の様々なサービスを開始する時間を考慮しておく必要があります。
ホストからコンテナのプロセスの状態を表示するには、ps -ef --forestを実行してlxc-start
プロセス以下のプロセス・ツリーを確認するか、lxc-attachコマンドを使用してコンテナ内でpsコマンドを実行します。
sudo ps -ef --forest
UID PID PPID C STIME TTY TIME CMD ... root 3171 1 0 09:57 ? 00:00:00 lxc-start -n ol6ctr1 -d root 3182 3171 0 09:57 ? 00:00:00 \_ /sbin/init root 3441 3182 0 09:57 ? 00:00:00 \_ /sbin/dhclient -H ol6ctr1 ... root 3464 3182 0 09:57 ? 00:00:00 \_ /sbin/rsyslogd ... root 3493 3182 0 09:57 ? 00:00:00 \_ /usr/sbin/sshd root 3500 3182 0 09:57 pts/5 00:00:00 \_ /sbin/mingetty ... /dev/console root 3504 3182 0 09:57 pts/1 00:00:00 \_ /sbin/mingetty ... /dev/tty1 root 3506 3182 0 09:57 pts/2 00:00:00 \_ /sbin/mingetty ... /dev/tty2 root 3508 3182 0 09:57 pts/3 00:00:00 \_ /sbin/mingetty ... /dev/tty3 root 3510 3182 0 09:57 pts/4 00:00:00 \_ /sbin/mingetty ... /dev/tty4 ...
sudo lxc-attach -n ol6ctr1 -- /bin/ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 19284 1516 ? Ss 04:57 0:00 /sbin/init root 202 0.0 0.0 9172 588 ? Ss 04:57 0:00 /sbin/dhclient root 225 0.0 0.1 245096 1332 ? Ssl 04:57 0:00 /sbin/rsyslogd root 252 0.0 0.1 66660 1192 ? Ss 04:57 0:00 /usr/sbin/sshd root 259 0.0 0.0 4116 568 lxc/console Ss+ 04:57 0:00 /sbin/mingett root 263 0.0 0.0 4116 572 lxc/tty1 Ss+ 04:57 0:00 /sbin/mingetty root 265 0.0 0.0 4116 568 lxc/tty2 Ss+ 04:57 0:00 /sbin/mingetty root 267 0.0 0.0 4116 572 lxc/tty3 Ss+ 04:57 0:00 /sbin/mingetty root 269 0.0 0.0 4116 568 lxc/tty4 Ss+ 04:57 0:00 /sbin/mingetty root 283 0.0 0.1 110240 1144 ? R+ 04:59 0:00 /bin/ps aux
ヒント:
コンテナが正しく起動しているように見えない場合、ホストからそのプロセス・ツリーを調査すると、通常、問題の所在がわかります。
ol6ctrl
などのコンテナにログインしている場合、ps -efコマンドによる出力は次の例のようになります。sudo ps -ef
UID PID PPID C STIME TTY TIME CMD root 1 0 0 11:54 ? 00:00:00 /sbin/init root 193 1 0 11:54 ? 00:00:00 /sbin/dhclient -H ol6ctr1 ... root 216 1 0 11:54 ? 00:00:00 /sbin/rsyslogd -i ... root 258 1 0 11:54 ? 00:00:00 /usr/sbin/sshd root 265 1 0 11:54 lxc/console 00:00:00 /sbin/mingetty ... /dev/console root 271 1 0 11:54 lxc/tty2 00:00:00 /sbin/mingetty ... /dev/tty2 root 273 1 0 11:54 lxc/tty3 00:00:00 /sbin/mingetty ... /dev/tty3 root 275 1 0 11:54 lxc/tty4 00:00:00 /sbin/mingetty ... /dev/tty4 root 297 1 0 11:57 ? 00:00:00 login -- root root 301 297 0 12:08 lxc/tty1 00:00:00 -bash root 312 301 0 12:08 lxc/tty1 00:00:00 ps -efプロセス番号がホストの同じプロセスの番号とは異なっており、それらはすべてコンテナのプロセス1 (
/sbin/init
)の下位にあることに注意してください。
sudo lxc-freeze -n ol6ctr1 sudo lxc-unfreeze -n ol6ctr1
ホストからは、--nokillオプションを指定してlxc-stopコマンドを使用することで、コンテナを正しい手順でシャットダウンできます。
sudo lxc-stop --nokill -n ol6ctr1
ol6ctrl
コンテナへのログイン中に、haltなどのコマンドを実行できます。
sudo halt
Broadcast message from root@ol6ctr1 (/dev/tty2) at 22:52 ... The system is going down for halt NOW! lxc-console: Input/output error - failed to read
例に示すとおり、ホストのシェル・プロンプトに戻ります。
sudo lxc-stop -k -n ol6ctr1
コンテナの動作をデバッグする場合、通常はコンテナを破棄してテンプレート・スクリプトの変更後に新しいバージョンを作成するため、これが最も簡単な方法です。
sudo lxc-monitor -n ol6ctr1
'ol6ctr1' changed state to [STARTING] 'ol6ctr1' changed state to [RUNNING] 'ol6ctr1' changed state to [STOPPING] 'ol6ctr1' changed state to [STOPPED]
sudo lxc-wait -n $CTR -s ABORTING && lxc-wait -n $CTR -s STOPPED && echo "Container $CTR terminated with an error."
実行中のコンテナ内でのコマンドの開始
ノート:
lxc-attachコマンドは、lxc-0.9.0-2.0.4
パッケージ以降のUEK R3でサポートされています。
ホスト・システムからは、lxc- attachを使用することで、次のように、すでに実行されているコンテナ内で任意のコマンドを実行できます。
sudo lxc-attach -n ol6ctr1 -- /bin/ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 19284 1516 ? Ss 04:57 0:00 /sbin/init root 202 0.0 0.0 9172 588 ? Ss 04:57 0:00 /sbin/dhclient root 225 0.0 0.1 245096 1332 ? Ssl 04:57 0:00 /sbin/rsyslogd root 252 0.0 0.1 66660 1192 ? Ss 04:57 0:00 /usr/sbin/sshd root 259 0.0 0.0 4116 568 lxc/console Ss+ 04:57 0:00 /sbin/mingett root 263 0.0 0.0 4116 572 lxc/tty1 Ss+ 04:57 0:00 /sbin/mingetty root 265 0.0 0.0 4116 568 lxc/tty2 Ss+ 04:57 0:00 /sbin/mingetty root 267 0.0 0.0 4116 572 lxc/tty3 Ss+ 04:57 0:00 /sbin/mingetty root 269 0.0 0.0 4116 568 lxc/tty4 Ss+ 04:57 0:00 /sbin/mingetty root 283 0.0 0.1 110240 1144 ? R+ 04:59 0:00 /bin/ps aux
詳細は、lxc-attach(1)
マニュアル・ページを参照してください。
コンテナ・リソースの制御
ノート:
このセクションのコマンドはホスト・システムから実行します。
sudo lxc-cgroup -n ol6ctr1 cpuset.cpus
0-7
sudo lxc-cgroup -n ol6ctr1 cpuset.cpus 0,1
sudo lxc-cgroup -n ol6ctr2 cpu.shares 256 sudo lxc-cgroup -n ol6ctr2 blkio.weight 500
システムでメモリー競合または低メモリーが検出された場合はコンテナを256MBのメモリーに制限し、それ以外の場合は強い制限を512MBに設定します。
sudo lxc-cgroup -n ol6ctr2 memory.soft_limit_in_bytes 268435456 sudo lxc-cgroup -n ol6ctr2 memory.limit_in_bytes 53687091
/container/name/config
に設定を追加します。
# Permanently tweaked resource settings lxc.cgroup.cpu.shares=256 lxc.cgroup.blkio.weight=500
制御できるリソースの詳細は、https://www.kernel.org/doc/html/latest/にあるLinuxカーネルのドキュメントを参照してください。
Oracle Linuxコンテナのulimit設定の構成
コンテナのulimit
設定は、そのコンテナのバージョンの/etc/security/limits.conf/
で指定されているmemlock
やnofile
などのulimit
設定の値を適用します(これらの値がホスト・システム上の値以下である場合)。
memlock
およびnofile
の値は、ユーザー・プロセスによってメモリーにロックできるアドレス空間の最大量(KB単位)およびユーザー・プロセスによって同時に開くことができる最大ファイル・ディスクリプタ数を決定します。
コンテナに対してより大きなulimit
値が必要な場合は、次のようにホスト上の/etc/security/limits.conf
の設定の値を大きくします。
#<domain> <type> <item> <value> * soft memlock 1048576 * hard memlock 2097152 * soft nofile 5120 * hard nofile 10240
プロセスは、シェルの組込みコマンドulimitまたはsetrlimit()
システム・コールを使用して、シェルの現在の制限をソフト制限より上に上げることができます。ただし、新しい値は、プロセスがroot
によって所有されている場合を除き、ハード制限を超えることはできません。
ulimitを使用して、ホスト上またはコンテナ内から現在のソフト値およびハード値を設定または表示できます。
echo "host: nofile = $(ulimit -n)"
host: nofile = 1024
echo "host: nofile = $(ulimit -H -n)"
host: nofile = 4096
sudo ulimit -n 2048 echo "host: nofile = $(ulimit -n)"
host: nofile = 2048
sudo lxc-attach -n ol6ctr1 -- echo "container: nofile = $(ulimit -n)"
container: nofile = 1024
ノート:
ログアウトしてから再度ログインし、可能ならば、ulimit
の新しいソフト値およびハード値を使用するシェルでコンテナを起動する前にホストを再起動します。
Oracle Linuxコンテナのカーネル・パラメータ設定の構成
--privilegedオプションをlxc-oracle
テンプレート・スクリプトに指定すると、/proc
階層化にあるコンテナの特定のカーネル・パラメータの値を調整できます。
コンテナは、/proc
読取り専用をマウントしますが、書き込み可能な次のパラメータは例外です。
-
/proc/sys/kernel/msgmax
-
/proc/sys/kernel/msgmnb
-
/proc/sys/kernel/msgmni
-
/proc/sys/kernel/sem
-
/proc/sys/kernel/shmall
-
/proc/sys/kernel/shmmax
-
/proc/sys/kernelshmmni
-
/proc/sys/net/ipv4/conf/default/accept_source_route
-
/proc/sys/net/ipv4/conf/default/rp_filter
-
/proc/sys/net/ipv4/ip_forward
これらの各パラメータには、ホスト・システム用に構成した値やホスト・システム上で実行中の他のコンテナとは異なる値を設定できます。デフォルト値は、コンテナ作成時にテンプレートから導出されます。アプリケーションでデフォルト値以外の値が必要になった場合にのみ、設定を変更することをお薦めします。
ノート:
UEK R3 QU6より以前では、次のホスト専用パラメータは、カーネル制限のためコンテナ内に表示されませんでした。
-
/proc/sys/net/core/rmem_default
-
/proc/sys/net/core/rmem_max
-
/proc/sys/net/core/wmem_default
-
/proc/sys/net/core/wmem_max
-
/proc/sys/net/ipv4ip_local_port_range
-
/proc/sys/net/ipv4/tcp_syncookies
UEK R3 QU6以降では、これらのパラメータはコンテナ内の読取り専用で、Oracle Databaseおよびその他のアプリケーションをインストールできます。これらのパラメータの値は、ホスト側からのみ変更できます。ホスト専用パラメータに対する変更は、ホスト上のすべてのコンテナに適用されます。
コンテナの削除
sudo lxc-destroy -n ol6ctr2
Delete subvolume '/container/ol6ctr2/rootfs'
このコマンドは、rootfs
サブボリュームも削除します。
アプリケーション・コンテナの実行
lxc-executeコマンドを使用して、システムの他の部分から効果的に分離された一時アプリケーション・コンテナを作成し、そこでコマンドを実行できます。たとえば次のコマンドでは、sleepを100秒間実行するguest
という名前のアプリケーション・コンテナが作成されます。
sudo lxc-execute -n guest -- sleep 100
コンテナがアクティブな間は、別のウィンドウからlxc-ls --activeおよびlxc-info -n guestなどのコマンドを実行して監視できます。
sudo lxc-ls --active
sudo lxc-ls --active
guest
sudo lxc-info -n guest
Name: guest State: RUNNING PID: 11220 CPU use: 0.02 seconds BlkIO use: 0 bytes Memory use: 544.00 KiB KMem use: 0 bytes
アプリケーション・コンテナをカスタマイズする必要がある場合は、構成ファイルを使用できます。たとえば、コンテナのネットワーク構成またはマウントされるシステム・ディレクトリを変更できます。
init.lxc
と特定のライブラリ・パスおよびバイナリ・ディレクトリ・パスを使用可能にするマウント・エントリの場合を除き、rootfs
がほとんど共有されていないサンプルの構成ファイルからの設定を示しています。 lxc.utsname = guest lxc.tty = 1 lxc.pts = 1 lxc.rootfs = /tmp/guest/rootfs lxc.mount.entry=/usr/lib usr/lib none ro,bind 0 0 lxc.mount.entry=/usr/lib64 usr/lib64 none ro,bind 0 0 lxc.mount.entry=/usr/bin usr/bin none ro,bind 0 0 lxc.mount.entry=/usr/sbin usr/sbin none ro,bind 0 0 lxc.cgroup.cpuset.cpus=1
コンテナがホスト・システム上の/usr/sbin/init.lxc
にアクセスするには、/usr/sbin
のマウント・エントリが必要です。
実際には、アプリケーション・コンテナでマウントするホスト・システム・ディレクトリを、コンテナがアプリケーションを実行するために必要なディレクトリのみに制限する必要があります。
ノート:
システム・コンテナとの競合の可能性を避けるために、/container
ディレクトリをアプリケーション・コンテナに使用しないでください。
必要なディレクトリとシンボリック・リンクをrootfs
ディレクトリの下に構成することも必要です。
sudo TMPDIR=/tmp/guest/rootfs sudo mkdir -p $TMPDIR/usr/lib $TMPDIR/usr/lib64 $TMPDIR/usr/bin $TMPDIR/usr/sbin \$TMPDIR/dev/pts $TMPDIR/dev/shm $TMPDIR/proc sudo ln -s $TMPDIR/usr/lib $TMPDIR/lib sudo ln -s $TMPDIR/usr/lib64 $TMPDIR/lib64 sudo ln -s $TMPDIR/usr/bin $TMPDIR/bin sudo ln -s $TMPDIR/usr/sbin $TMPDIR/sbin
この例では、構成ファイルに定義されたマウント・ポイント・エントリに加えて/dev/pts
、/dev/shm
および/proc
もディレクトリに含まれています。
次に、-fオプションを使用してlxc-executeに構成ファイル(config
)を指定できます。
sudo lxc-execute -n guest -f config /usr/bin/bash
bashプロンプトで、次の一連のコマンドを入力します。
ps -ef
UID PID PPID C STIME TTY TIME CMD 0 1 0 0 14:17 ? 00:00:00 /usr/sbin/init.lxc -- /usr/bin/bash 0 4 1 0 14:17 ? 00:00:00 /usr/bin/bash 0 5 4 0 14:17 ? 00:00:00 ps -ef
mount
/dev/sda3 on / type btrfs (rw,relatime,seclabel,space_cache) /dev/sda3 on /usr/lib type btrfs (ro,relatime,seclabel,space_cache) /dev/sda3 on /usr/lib64 type btrfs (ro,relatime,seclabel,space_cache) /dev/sda3 on /usr/bin type btrfs (ro,relatime,seclabel,space_cache) /dev/sda3 on /usr/sbin type btrfs (ro,relatime,seclabel,space_cache) devpts on /dev/pts type devpts (rw,relatime,seclabel,gid=5,mode=620,ptmxmode=666) proc on /proc type proc (rw,relatime) shmfs on /dev/shm type tmpfs (rw,relatime,seclabel) mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
ls -l /
total 16 lrwxrwxrwx. 1 0 0 7 May 21 14:03 bin -> usr/bin drwxr-xr-x. 1 0 0 52 May 21 14:27 dev lrwxrwxrwx. 1 0 0 7 May 21 14:03 lib -> usr/lib lrwxrwxrwx. 1 0 0 9 May 21 14:27 lib64 -> usr/lib64 dr-xr-xr-x. 230 0 0 0 May 21 14:27 proc lrwxrwxrwx. 1 0 0 8 May 21 14:03 sbin -> usr/sbin drwxr-xr-x. 1 0 0 30 May 21 12:58 usr
touch /bin/foo
touch: cannot touch '/bin/foo': Read-only file system
echo $?
1
この例では、psコマンドを実行すると、bashがinit.lxc
の子として実行されることがわかります。mountはコンテナが/usr/lib
など読取り専用でマウントする個々のディレクトリを表示し、ls -l /はrootfs
で設定したシンボリック・リンクを表示します。
読取り専用/bin
ファイル・システムに書き込もうとするとエラーが発生します。同じlxc-executeコマンドを構成ファイルを指定せずに実行すると、コンテナでホストのルート・ファイル・システム全体を読取り/書込みモードで使用できます。
システム・コンテナに関しては、cgroup
エントリを構成ファイルに設定し、lxc-cgroupコマンドを使用して、アプリケーション・コンテナがアクセスできるシステム・リソースを制御できます。
ノート:
lxc-executeは、ホストのrootファイル・システムを共有するアプリケーション・コンテナを実行するためのもので、lxc-createを使用して作成するシステム・コンテナを実行するためのものではありません。システム・コンテナを実行するにはlxc-startを使用します。
詳細は、lxc-execute(1)
およびlxc.conf(5)
の各マニュアル・ページを参照してください。