可愛的LXD系統容器

hyerty發表於2018-04-09
  • tag: lxc lxd container linux
  • date: 2018-04

本文基於 ubuntu 16.04 操作。

LXD 是什麼

很多人可能不知道 LXD,但可能聽說過老牌容器 LXC(遠早於 docker)。

[LXC][] 由 [Canonical Ltd][] 和 [Ubuntu][] 開發維護,其靈感可能來自 [OpenVZ][] 等輕量級虛擬機器(容器)。
原有的 LXC 工具比較難用(需要使用者瞭解一些底層知識),同時開發團隊想要修改(優化)一些預設配置和特性(如安全增強,預設建立非特權容器)。
為了保持相容性,不宜在舊的已有 LXC 工具(如 lxc-create, lxc-start 等)上動刀,於是新設計封裝了一套上層運維操作工具,即 [LXD][]。
LXC 使用 C 開發,LXD 使用 golang 開發。早期版本的 docker 其實也是基於 LXC 封裝,LXD 可能也借鑑了 docker 的一些思想。
LXD 拆分為 daemon(命令為 lxd)和客戶端(命令為 lxc)兩部分。

LXD 的定位很清晰:系統容器,直接對標虛擬機器 ,甚至可以直接執行虛擬機器映象(但是不啟動核心)。
系統容器執行整套作業系統(再說一次,除了核心),應用容器(如 docker)執行應用,兩者不衝突。
可以在 LXD 容器裡安裝和使用 docker,跟在物理機和虛擬機器上沒什麼兩樣。
LXD 還支援與 OpenStack 整合(nova-lxd 專案,可替代 OpenStack 上的虛擬機器?)。

[LXD][] 遠沒有 docker 流行,網上資料不多。
通過 LXD 官方文件 和命令列幫助,已經足夠輕鬆瞭解和使用 LXD,讀來感覺非常可愛。

安裝 LXD

從軟體倉庫安裝 LXD

ubuntu 下可直接從軟體倉庫安裝 LXD:

sudo aptitude install lxd lxd-client -y
  • 前面提到,lxd 拆分為 daemon 和客戶端。lxd-client 是客戶端軟體包,安裝後得到 lxc 命令。

去掉預設網橋 lxdbr0

當前版本 lxd 預設會拉起 lxdbr0 網橋,可修改 lxd.service 不要依賴 lxd-bridge.service,避免拉起這個預設網橋:

sudo systemctl stop lxd-bridge.service
sudo rsync -ai /{lib,etc}/systemd/system/lxd.service
sudo sed -r -e `/^(After|Requires)=/ s#lxd-bridge.services*##g` /etc/systemd/system/lxd.service -i
sudo systemctl daemon-reload

另外 /etc/default/lxd-bridge 檔案包含 lxd 網橋相關配置,可配置 lxd 軟體包修改此配置檔案。

echo `lxd lxd/setup-bridge boolean false` | sudo debconf-set-selections
echo `lxd lxd/use-existing-bridge boolean true` | sudo debconf-set-selections
echo `lxd lxd/bridge-name string br0` | sudo debconf-set-selections
sudo dpkg-reconfigure -f noninteractive lxd

從原始碼編譯安裝新版本 LXD

為了使用新版 LXD 功能和特性,可從原始碼編譯安裝新版本 LXD。

安裝開發依賴。建議手動下載安裝 golang 最新版本,其他依賴可直接從軟體倉庫安裝:

sudo aptitude install acl dnsmasq-base git liblxc1 lxc-dev libacl1-dev make pkg-config rsync squashfs-tools tar xz-utils -y

從原始碼編譯最新 release 版本:

mkdir lxd.gopath
cd lxd.gopath/
cat > .envrc <<< $`export GOPATH="${PWD}"
GOROOT="$(readlink -f /opt/go1.10)"
PATH="${GOROOT}/bin:${GOPATH}/bin:$PATH"`
direnv allow .
git clone git@github.com:lxc/lxd.git src/github.com/lxc/lxd
( cd src/github.com/lxc/lxd/ && git tag --sort=version:refname | tail )
( cd src/github.com/lxc/lxd/ && git reset --hard lxd-3.0.0 )
make -C src/github.com/lxc/lxd/

安裝到 local 目錄:

$ sudo install bin/lxd bin/lxc -t /usr/local/bin/ -v
`bin/lxd` -> `/usr/local/bin/lxd`
`bin/lxc` -> `/usr/local/bin/lxc`

轉移軟體包 lxd 可執行檔案,使用本地新版本替代:

sudo systemctl stop lxd
sudo dpkg-divert --rename --add /usr/bin/lxc
sudo dpkg-divert --rename --add /usr/bin/lxd
sudo ln -sfT /usr/{local/,}bin/lxc
sudo ln -sfT /usr/{local/,}bin/lxd

其他辦法:修改 lxd.service 使用新版本 lxd 可執行檔案。

sudo systemctl stop lxd
sudo sed -r -e `s#(/usr/)(bin/lxd)b#1local/2#g` /etc/systemd/system/lxd.service -i
sudo systemctl daemon-reload


如果 `lxc` 命令被 hash 到系統路徑,則需要解除 hash 以使用 local 下的新版 lxc 命令。

hash -d lxc

初始化 LXD daemon

LXD daemon, 有時也稱作伺服器(server)。
LXD 相關操作通常通過客戶端 lxc 命令執行,但 lxd 命令也包含一些特殊操作。
一個使用者可能會用到的操作是 lxd init,初始化 lxd daemon。

$ lxd init --help
Description:
  Configure the LXD daemon

Usage:
  lxd init [flags]

Examples:
  init --preseed
  init --auto [--network-address=IP] [--network-port=8443] [--storage-backend=dir]
              [--storage-create-device=DEVICE] [--storage-create-loop=SIZE]
              [--storage-pool=POOL] [--trust-password=PASSWORD]


Flags:
      --auto                    Automatic (non-interactive) mode
      --network-address         Address to bind LXD to (default: none)
      --network-port            Port to bind LXD to (default: 8443) (default -1)
      --preseed                 Pre-seed mode, expects YAML config from stdin
      --storage-backend         Storage backend to use (btrfs, dir, lvm or zfs, default: dir)
      --storage-create-device   Setup device based storage using DEVICE
      --storage-create-loop     Setup loop based storage with SIZE in GB (default -1)
      --storage-pool            Storage pool to use or create
      --trust-password          Password required to add new clients

Global Flags:
# ... ...

lxd init 也是與 daemon 通訊完成操作,相當於一個特殊的 lxc 命令。其主要有兩個操作,配置網路和儲存。

配置網路

lxd 與 git 類似,採用分散式的架構,任意兩個節點都可以相互通訊。配置網路地址將其暴露到網路上,其他節點可使用密碼連線。

lxd init --auto --network-address=0.0.0.0 --trust-password=1234

也可以直接使用 lxc 命令修改和檢視網路地址(及其他 server 配置):

$ lxc config set core.https_address 0.0.0.0:8443

$ lxc config show 
config:
  core.https_address: 0.0.0.0:8443
  core.trust_password: true
  • 注意:修改配置後立即生效(類似自動 reload?),而不只是修改配置資料,操作非常方便。

配置儲存

提供一個簡便的命令,建立一個名為 default 的(”預設”)儲存,並配置(名為 default 的)預設 profile 使用此儲存建立容器。
建立一個名為 lxd 的 lvm vg,使用此 vg 建立 “預設” 儲存。

lxd init --auto --storage-backend=lvm --storage-pool=lxd

當然也可以直接使用 lxc 命令檢視和執行相關操作:

$ lxc storage list
+---------+-------------+--------+--------+---------+
|  NAME   | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------+---------+
| default |             | lvm    | lxd    | 1       |
+---------+-------------+--------+--------+---------+

$ lxc profile show default
config: {}
description: Default LXD profile
devices:
  root:
    path: /
    pool: default
    type: disk
name: default
used_by: []

LXD 儲存

參考:https://lxd.readthedocs.io/en/latest/storage/

與 docker 不同,LXD 不區分容器和資料卷。
換句話說,容器根檔案系統(容器卷)和資料卷在 LXD 使用完全相同的儲存方案,統稱為儲存卷(storage volume),
唯一區別是容器卷會使用映象進行初始化。
這有個好處,如設計一套儲存計算分離的儲存方案,則天然同時適用於容器卷和資料卷。
LXD 內建支援多種儲存後端,如 dir, btrfs, lvm, zfs, ceph 等,推薦使用 zfs 和 btrfs。

為了方便我們可以使用熟悉的 lvm (thinpool)。前面已經介紹過建立和檢視儲存,在此不再敖述。

LXD remote

LXD 採用類似 git 分散式架構管理和分發映象(和容器?),
任意兩個節點都可以互相通訊,並且許多操作天然支援訪問和操作 remote 節點。

$ lxc remote list
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
|      NAME       |                   URL                    |   PROTOCOL    | AUTH TYPE | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| images          | https://images.linuxcontainers.org       | simplestreams |           | YES    | NO     |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| local (default) | unix://                                  | lxd           | tls       | NO     | YES    |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | simplestreams |           | YES    | YES    |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | simplestreams |           | YES    | YES    |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
  • lxd 預設新增了 ubuntu 等 remote 節點。本地節點被當作一個名為 local 的特殊節點,同時也是預設節點。

新增遠端節點:

lxc remote add han2017 https://han2017:8443/ --accept-certificate --password=1234

LXD 映象管理

可以直接使用遠端映象建立容器,LXD 會自動拷貝映象到本地 cache(私有映象),並自動管理(自動更新,過期清理)。

也可以顯式手動從遠端節點拷貝映象到本地:

lxc image copy ubuntu:16.04 local: --alias ubuntu/16.04 --public
lxc image copy han2017:ubuntu/16.04 local: --copy-aliases --public
$ lxc image list
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
|    ALIAS     | FINGERPRINT  | PUBLIC |                 DESCRIPTION                 |  ARCH  |   SIZE   |         UPLOAD DATE         |
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
| ubuntu/16.04 | be7cec7c9489 | yes    | ubuntu 16.04 LTS amd64 (release) (20180405) | x86_64 | 156.27MB | Apr 7, 2018 at 8:17am (UTC) |
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+

$ sudo tree -L 3 -a /var/lib/lxd/images/
/var/lib/lxd/images/
├── be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a
└── be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a.rootfs
  • 無法指定映象儲存(?),預設以檔案形式保持在 /var/lib/lxd/images/ 目錄下。
  • 映象使用 id 標識,可以新增簡單可讀的別名。拷貝時可以指定目標別名,或者拷貝複用源節點上的別名。

LXD 容器配置

參考:https://lxd.readthedocs.io/en/latest/containers/

LXD 容器配置可劃分為兩部分:

  1. key/value 配置,使用 lxc configlxc profile 管理。
  2. 對標虛擬機器概念,裝置管理,使用 lxc config devicelxc profile device 管理。如磁碟裝置,網路裝置等。
    注意,容器內磁碟裝置通常是使用檔案系統,而不是塊裝置。

為了方便管理容器配置,LXD 支援使用 profile 預設管理容器配置模板。
lxc config 管理已建立容器例項配置,lxc profile 管理容器 profile 配置。
建立容器時可指定多個 profile,多個 profile 與容器自身配置疊加覆蓋得到最終有效配置。

建立 LXD 容器

使用 lxc init 命令建立容器:

$ lxc init --help
Description:
  Create containers from images

Usage:
  lxc init [<remote>:]<image> [<remote>:][<name>] [flags]

Examples:
  lxc init ubuntu:16.04 u1

Flags:
  -c, --config      Config key/value to apply to the new container
  -e, --ephemeral   Ephemeral container
  -n, --network     Network name
  -p, --profile     Profile to apply to the new container
  -s, --storage     Storage pool name
      --target      Node name
  -t, --type        Instance type

$ lxc network list
+--------+----------+---------+-------------+---------+
|  NAME  |   TYPE   | MANAGED | DESCRIPTION | USED BY |
+--------+----------+---------+-------------+---------+
| br0    | bridge   | NO      |             | 0       |
+--------+----------+---------+-------------+---------+
| enp5s0 | physical | NO      |             | 0       |
+--------+----------+---------+-------------+---------+
  • -p 指定 profile, 可重複多次以指定多個 profile 疊加覆蓋。不指定時預設使用 default
  • -c 指定容器 key/value 配置。
  • -s 使用指定儲存池建立容器卷。容器卷未指定大小時預設與映象大小相同。
  • -n 建立網路卡裝置連線到指定網路。可指定外部(手動管理的)網橋(或網路卡等網路裝置?)名。

可簡化起見,可設定建立特權容器。
一個原因是,LXD 非特權容器預設開啟了使用者 idmap,雖然 LXD 對 idmap 做了很好的支援,
但 idmap 解決的問題比帶來的問題更多,如與宿主機共享檔案系統問題等。

修改預設 profile:

lxc profile set default security.privileged true

建立容器:

$ lxc list
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

$ lxc storage volume list default
+------+------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+------+------+-------------+---------+

$ sudo lvs lxd

$ lxc init ubuntu/16.04 test -s default -n br0
Creating test

$ lxc list
+------+---------+------+------+------------+-----------+
| NAME |  STATE  | IPV4 | IPV6 |    TYPE    | SNAPSHOTS |
+------+---------+------+------+------------+-----------+
| test | STOPPED |      |      | PERSISTENT | 0         |
+------+---------+------+------+------------+-----------+

$ lxc config show test
architecture: x86_64
# ... ...
devices:
  br0:
    nictype: bridged
    parent: br0
    type: nic
  root:
    path: /
    pool: default
    type: disk
ephemeral: false
profiles:
- default
stateful: false
description: ""

$ lxc storage volume list default
+-----------+------------------------------------------------------------------+-------------+---------+
|   TYPE    |                               NAME                               | DESCRIPTION | USED BY |
+-----------+------------------------------------------------------------------+-------------+---------+
| container | test                                                             |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+
| image     | be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+

$ sudo lvs lxd
  LV                                                                      VG   Attr       LSize  Pool        Origin                                                                  Data%  Meta%  Move Log Cpy%Sync Convert
  LXDThinpool                                                             lxd  twi-aotz-- 98.00g                                                                                     0.91   0.09                            
  containers_test                                                         lxd  Vwi-a-tz-- 10.00g LXDThinpool images_be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a 8.90                                   
  images_be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a lxd  Vwi-a-tz-- 10.00g LXDThinpool                                                                         8.90                                   
  • 第一次在 lvm 儲存上建立儲存卷時,LXD 自動在指定 vg 上初始化 thinpool。
  • 第一次在 lvm 儲存上建立容器時,LXD 自動使用映象建立 lv 作為映象卷。因此使用映象第一次建立容器時,會有建立映象卷的額外開銷。
  • 建立容器時即完成建立容器卷(作為容器裝置)(網路卡等容器裝置則是啟動容器時才建立)。

    • 在 lvm thinpool 上建立容器時,容器卷即為映象卷的快照,因此容器卷大小預設與映象卷大小相同,可以快速完成建立。
    • 如果開啟了 idmap(非特權容器),則 idmap 還會每次產生額外的開銷(?),因此簡單測試不開啟 idmap 是正確的選擇。
    • 如果設定容器卷大小,則還會產生 resize 的開銷,注意 ext4 支援縮小和擴大,xfs 則只支援擴大,不支援縮小,儲存檔案系統選擇 ext4 可能更通用。

啟動 LXD 容器

啟動容器:

$ brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.0227625084a8    yes        enp5s0
                            tap0

$ lxc start test

$ brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.0227625084a8    yes        enp5s0
                            tap0
                            vethKFYJSY

$ ip link show dev vethKFYJSY
6: vethKFYJSY@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP mode DEFAULT group default qlen 1000
    link/ether fe:69:14:43:db:75 brd ff:ff:ff:ff:ff:ff link-netnsid 0

$ lxc exec -t test /bin/bash

root@test:~# ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link-netnsid 0
    inet 192.168.100.77/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever
  • 啟動容器時自動建立網路裝置連線到指定網橋。
  • LXD 映象通常預設使用 DHCP 配置網路,容器啟動後自動使用 DHCP 配置好網路。

另外發現 lxc exec 的程式報 “not a tty”:

root@test:~# tty
not a tty

root@test:~# ll /proc/$$/fd/0
lrwx------ 1 root root 64 Apr  7 09:24 /proc/445/fd/0 -> /dev/pts/2

root@test:~# findmnt /dev/
TARGET SOURCE FSTYPE OPTIONS
/dev   none   tmpfs  rw,relatime,size=492k,mode=755

root@test:~# findmnt /dev/pts/
TARGET   SOURCE FSTYPE OPTIONS
/dev/pts devpts devpts rw,relatime,gid=5,mode=620,ptmxmode=666

root@test:~# ls /dev/pts/
ptmx
  • lxc exec 程式使用的應該是從宿主機上繼承的偽終端(上例即 /dev/pts/2)。
  • 容器內 devpts 與宿主機是隔離的(使用 lxcfs?),看不到該偽終端(但可以正常使用),因此報 “not a tty”。

宿主機上可看到相關程式資訊如下:

$ pschain -C bash -fww f
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
# ... ...
root     24225     1  0 4月06 ?       Ssl   11:43 /usr/bin/lxd --group lxd --logfile=/var/log/lxd/lxd.log
root     30251 24225  0 17:23 ?        Sl     0:00  \_ /usr/local/bin/lxd forkexec test /var/lib/lxd/containers /var/log/lxd/test/lxc.conf -- env TERM=xterm PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin HOME=/root USER=root LANG=C.UTF-8 -- cmd /bin/bash
root     30259 30251  0 17:23 pts/2    Ss+    0:00      \_ /bin/bash

$ sudo ls -l /proc/30259/fd/0 --color
lrwx------ 1 root root 64 4月   7 17:30 /proc/30259/fd/0 -> /dev/pts/2

如果要執行的命令強依賴正確設定 tty,一個簡單的解決辦法是 在容器內重新分配偽終端,如使用 script 命令包裝要執行的命令。

$ lxc exec -t test /bin/bash

root@test:~# tty
not a tty

root@test:~# script -c /bin/bash /dev/null
Script started, file is /dev/null

root@test:~# tty
/dev/pts/0

可以在 lxc exec 時直接執行 script 命令:

$ lxc exec -t test -- script -c /bin/bash /dev/null
Script started, file is /dev/null

root@test:~# tty
/dev/pts/0

LXD 容器訪問宿主機檔案系統

容器新增磁碟(檔案系統)裝置,設定 source 為宿主機檔案系統路徑,即使用路徑繫結,即可輕鬆訪問宿主機檔案系統。
LXD 支援動態新增路徑繫結,操作立即生效,非常方便。

新建 profile 方便管理相關配置:

lxc profile create share-host
lxc profile set share-host security.privileged true
lxc profile device add share-host /etc/apt/ disk {source,path}=/etc/apt/
$ lxc profile show share-host 
config:
  security.privileged: "true"
description: ""
devices:
  /etc/apt/:
    path: /etc/apt/
    source: /etc/apt/
    type: disk
name: share-host
used_by: []
  • 為避免 idmap 問題,建立特權容器,設定 security.privileged=true

容器新增 profile:

$ lxc exec -t test findmnt /etc/apt/

$ lxc profile add test share-host
Profile share-host added to test

$ lxc config show test
# ... ...
profiles:
- default
- share-host
stateful: false
description: ""

$ lxc exec -t test findmnt /etc/apt/
TARGET   SOURCE                           FSTYPE OPTIONS
/etc/apt /dev/mapper/vg-ubu1604[/etc/apt] ext4   rw,relatime,errors=remount-ro,data=ordered
  • 可看到,容器可以動態新增 profile 配置,路徑繫結(磁碟裝置)立即生效。
$ lxc profile device add share-host /var/cache/apt/ disk {source,path}=/var/cache/apt/
Device /var/cache/apt/ added to share-host

$ lxc exec -t test findmnt /var/cache/apt/
TARGET         SOURCE                                FSTYPE OPTIONS
/var/cache/apt /dev/mapper/vg-ubu1604var[/cache/apt] ext4   rw,relatime,data=ordered
  • profile 可以動態新增路徑繫結,使用了 profile 的容器立即自動更新生效。

製作 LXD 映象

LXD 不支援分層映象,映象製作工具也沒有 docker 完善。如何製作 LXD 映象呢?

  1. LXD 映象格式非常簡單,rootfs + 元資訊 + 模板檔案(可選) 即可,純手工製作 LXD 映象也並非難事。
    虛擬機器映象 rootfs 即可直接作為 LXD 映象的 rootfs,非常方便複用虛擬機器映象

參考:https://lxd.readthedocs.io/en/latest/image-handling/

  1. 可以直接將容器或容器快照發布為映象。 只需要在模板容器上完成操作即可。

將容器釋出為映象:

$ lxc image list
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
|    ALIAS     | FINGERPRINT  | PUBLIC |                 DESCRIPTION                 |  ARCH  |   SIZE   |         UPLOAD DATE         |
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
| ubuntu/16.04 | be7cec7c9489 | yes    | ubuntu 16.04 LTS amd64 (release) (20180405) | x86_64 | 156.27MB | Apr 7, 2018 at 8:17am (UTC) |
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+

$ sudo tree -L 3 -a /var/lib/lxd/images/
/var/lib/lxd/images/
├── be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a
└── be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a.rootfs

$ lxc publish test --alias test --public
Container published with fingerprint: cd1d4f8ce11dc9b6ff2b0a2c45e3cf1bc1370bbb45724b245880b757636537d3

$ lxc image list
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
|    ALIAS     | FINGERPRINT  | PUBLIC |                 DESCRIPTION                 |  ARCH  |   SIZE   |         UPLOAD DATE         |
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
| test         | cd1d4f8ce11d | yes    |                                             | x86_64 | 243.98MB | Apr 7, 2018 at 4:40pm (UTC) |
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
| ubuntu/16.04 | be7cec7c9489 | yes    | ubuntu 16.04 LTS amd64 (release) (20180405) | x86_64 | 156.27MB | Apr 7, 2018 at 8:17am (UTC) |
+--------------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+

$ sudo tree -L 3 -a /var/lib/lxd/images/
/var/lib/lxd/images/
├── be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a
├── be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a.rootfs
└── cd1d4f8ce11dc9b6ff2b0a2c45e3cf1bc1370bbb45724b245880b757636537d3

0 directories, 3 files

$ lxc storage volume list default
+-----------+------------------------------------------------------------------+-------------+---------+
|   TYPE    |                               NAME                               | DESCRIPTION | USED BY |
+-----------+------------------------------------------------------------------+-------------+---------+
| container | test                                                             |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+
| image     | be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+
  • 新映象以檔案形式儲存在 “/var/lib/lxd/images/”, 將容器釋出為映象時預設不會建立映象卷(第一次建立容器時建立映象卷)。

使用新映象建立容器:

$ lxc init test test2 -p share-host -p default -s default -n br0
Creating test2

$ lxc list
+-------+---------+------+------+------------+-----------+
| NAME  |  STATE  | IPV4 | IPV6 |    TYPE    | SNAPSHOTS |
+-------+---------+------+------+------------+-----------+
| test  | STOPPED |      |      | PERSISTENT | 0         |
+-------+---------+------+------+------------+-----------+
| test2 | STOPPED |      |      | PERSISTENT | 0         |
+-------+---------+------+------+------------+-----------+

$ lxc storage volume list default
+-----------+------------------------------------------------------------------+-------------+---------+
|   TYPE    |                               NAME                               | DESCRIPTION | USED BY |
+-----------+------------------------------------------------------------------+-------------+---------+
| container | test                                                             |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+
| container | test2                                                            |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+
| image     | be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+
| image     | cd1d4f8ce11dc9b6ff2b0a2c45e3cf1bc1370bbb45724b245880b757636537d3 |             | 1       |
+-----------+------------------------------------------------------------------+-------------+---------+

友好排版請 閱讀原文


相關文章