可愛的LXD系統容器
- 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 容器配置可劃分為兩部分:
- key/value 配置,使用
lxc config
或lxc profile
管理。 - 對標虛擬機器概念,裝置管理,使用
lxc config device
或lxc 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 映象呢?
-
LXD 映象格式非常簡單,rootfs + 元資訊 + 模板檔案(可選) 即可,純手工製作 LXD 映象也並非難事。
虛擬機器映象 rootfs 即可直接作為 LXD 映象的 rootfs,非常方便複用虛擬機器映象。
參考:https://lxd.readthedocs.io/en/latest/image-handling/ 。
- 可以直接將容器或容器快照發布為映象。 只需要在模板容器上完成操作即可。
將容器釋出為映象:
$ 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 |
+-----------+------------------------------------------------------------------+-------------+---------+
友好排版請 閱讀原文 。
相關文章
- lxd容器
- Linux 提權-LXD 容器Linux
- 在Linux中,如何在Linux中使用LXD進行容器管理?Linux
- Docker容器執行時許可權和Linux系統功能DockerLinux
- 可愛的remREM
- 愛客CRM系統排名?愛客CRM辦公系統怎麼選?什麼是使用者口碑最好的愛客CRM系統?
- 2.1.1. CDB Root容器和系統容器
- BP 愛未央戀愛婚姻開源系統
- mongodb 的許可權系統MongoDB
- 面向系統管理員的容器手冊
- 埠衝突,可愛的8080
- Docker 容器監控系統初探Docker
- 2.1.1 CDB root 和系統容器
- 使用sysdig檢視容器裡的系統呼叫
- 愛可生TensorDB®助力國內某頭部券商實現推薦系統升級
- 分享兩個超可愛的屏保
- 最小許可權的容器編排
- Windows Server 2016系統的Docker容器初體驗WindowsServerDocker
- 在kubernetes裡使用seccomp限制容器的系統呼叫
- 容器化部署GVM掃漏系統
- 打造自己的系統許可權控制
- 【系統】打造自己最喜愛的 Windows10 —— 純命令安裝系統篇Windows
- [系統] 打造自己最喜愛的 Windows10 —— 純命令安裝系統篇Windows
- 作業系統和併發的愛恨糾葛作業系統
- 容器編排系統之Kubectl工具的基礎使用
- jenkins 容器內的許可權問題Jenkins
- MemQ:可替代Kafka的高效、可擴充套件的雲原生PubSub系統MQKafka套件
- 基於RBAC的許可權管理系統
- 作業系統已死?容器勝出!作業系統
- 有贊許可權系統
- 如何開發一個可愛的CLI(二)
- 【系統】打造自己最喜愛的 Windows10 —— 系統與軟體配置優化篇Windows優化
- 前端許可權控制系統的實現思路前端
- 可完全免費使用的OA辦公系統
- kubernetes (k8s)容器編排系統K8S
- Arch搭建Nas系統(5)之五:Docker容器Docker
- 企業許可權管理系統
- Winner許可權管理系統3.0