リモートイメージの検索

$ lxc image list images: xenial

リモートイメージの取得

リモートのイメージをローカルにダウンロードする

$ lxc image copy images:ubuntu/xenial local: --alias xenial
$ lxc image copy images:ubuntu/bionic local: --alias bionic

コマンドの趣旨は"リポジトリ間でLXCイメージをコピー"するということ。docker pull相当。

特権コンテナでコンテナを起動

$ lxc launch xenial u1 -c security.privileged=true

あとから設定する場合

$ lxc config set u1 security.privileged true

security.privileged について

LXC/LXDは要は豪華版chrootみたいなものなのだが(コンテナのファイルシステムはホストの /var/lib/lxd/containers/<CONTAINER NAME>/rootfs に入っている)、コンテナ側に権限を持たせないためにコンテナのrootユーザーIDはホストから見ると10000に見えるようなことになっている。このIDをずらす機能はUser namespacingと呼ばれ、Linuxカーネルのサポートで実現されている。LXC/LXDと同じくCanonicalが開発元であるUbuntuはこれがデフォルトで有効になっているが、私の使うArch Linuxを始め多くのディストロではデフォルトで無効になっている(2016年10月22日において)。

よってUbuntu以外でコンテナを起動するためにはsecurity.privilegedfalseにするか、自前でカーネルをビルドしてUser namespacing有効にする必要がある。

共有ディレクトリの設定

$ lxc config device add <container> <share name> disk path=<host path> source=<container path>

長すぎる。特権コンテナじゃないとユーザーIDの関係で扱いにくいので注意。

デフォルトプロファイルを変更

$ lxc profile edit default

例えば下みたいに変更すれば

name: default
+ config:
+   security.privileged: "true"
- config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic

デフォルトで特権コンテナで起動してくれる。

コンテナ名をローカルでのみ有効なホスト名として使う

u1って名前のコンテナがあったら自動的にu1.lxdってホストを割り当てて$ ssh user@u1.lxdみたいにできるようにする。

別記事参照 → LXDのコンテナに、コンテナ名のホストでアクセスする

ロケールがPOSIXから変更できない

environment.LC_ALLでロケールを指定するとよい。/etc/locale.conf/etc/default/localeを変更しても効果がない場合に設定するとよい

$ lxc config set u1 environment.LC_ALL en_US.UTF-8

環境がLXCコンテナ内部のものか、そうでないか識別する

$container変数が使える。自分はこれを使ってzshのプロンプトを変更している。おなじzshrcでも

lxc_prompt.png (PNG Image, 212 × 97 pixels)

こんな感じにできる。

cf. dotfiles/zshrc at master · endaaman/dotfiles