标签 LXD 下的文章

1 继收回 LXD 控制后,Canonical 将其更改为 AGPLv3 许可

继 Canonical 收回对 LXD 的 控制权,并将 维护权 仅限于 Canonical 员工之后,在前两天 LXD 5.20 发布时,他们也将其许可证从 Apache 2 许可证默认更改为 AGPLv3,以与他们的“服务器端代码标准许可保持一致”。这一变更并不妨碍用户使用、修改或提供基于 LXD 的软件解决方案,前提是他们遵循 AGPLv3 在修改并向他人提供服务时也要提供源代码。但这将影响 LXD 的分叉项目 Incus,如果 Incus 采用了来自 LXD 中的变更,就会导致该项目变成混合两种许可证的项目。Incus 是在 Canonical 接管 LXD 之后,社区开发者创建的 分支

(插图:DA/5b8ebb04-5116-4e50-8757-39c3855e2dfb)

消息来源:Phoronix
老王点评:我敢说 Canonical 肯定不希望 Incus “蹭”它的代码。那么之后呢,LXD 和 Incus 的差异越来越大?

2 Threads 开始测试 ActivityPub 整合

扎克伯格宣布,该公司已开始测试在 Mastodon 和其他 ActivityPub 服务上显示 Threads 上的帖子。ActivityPub 是一个开放去中心化社交网络协议,被 Mastodon、PeerTube 等应用使用,支持 ActivityPub 协议的平台之间可以实现互操作。Threads 在上线之初就宣布将支持 ActivityPub。扎克伯格说:“不同服务之间的互操作性越强,内容流动越多,所有服务就会越好。”虽然怀疑论者一直认为 Threads 永远不会真正实现联邦化。

(插图:DA/f4698284-43ec-46fa-9e36-e177f0b380f6)

消息来源:The Verge
老王点评:要是能完全支持 ActivityPub,那无异于联邦宇宙的一大胜利。

3 恶意软件组织使用内存安全语言编写恶意软件

DLang 是过去几年来西方安全机构认可的新型内存安全语言之一,也是网络犯罪分子正在转向的语言类型。至少有三种基于 DLang 的新型恶意软件已被用于攻击。在过去几年中,恶意软件编码和更广泛的编程领域都在加速向更新的语言和框架转变。除了 DLang,Rust 也被用来编写恶意软件。去年,AlphV/BlackCat 使用 Rust 重新编写了有效载荷,为其附属机构提供了一个更可靠的工具。

(插图:DA/20a63f31-1f6b-4b53-a1b8-5bbbd251a4de)

消息来源:The Register
老王点评:看起来这些恶意软件组织对程序质量还是蛮在意的,至少比绝大多数企业要在意。

回音

GNOME 开始正式放弃 X11 会话支持

随着 Fedora 40 希望禁用 GNOME 的 X11 会话支持,上游的 GNOME 开始评估禁用和移除其 X11 会话支持的前景。GNOME 开启了一组合并请求,开始放弃对 GNOME 桌面的 X11 会话支持,一旦这些代码被移除,GNOME 将成为仅支持 Wayland 的桌面环境。在这第一步中仅移除了 systemd 启动目标,但 X11 功能仍然存在。随后的其它合并请求将真正删除大约 3.6 千行的 X11 会话代码。GNOME 称,“X11 接受的测试越来越少。自 2016 年以来,我们一直默认使用 Wayland 会话,现在是时候彻底放弃 x11 会话了。”此外,Fedora 40 也将只支持 KDE Plasma 6 的 Wayland 会话。

消息来源:Phoronix
老王点评:随着 Fedora 的推动,在 GNOME 和 KDE 的支持下,X11 将被扫到历史的垃圾堆中。

“Admin123” 是最大的网络安全错误配置漏洞

根据从红蓝队演习中获得的数据,美国网络安全和基础设施安全局(CISA)和美国国家安全局(NSA)将在软件、系统和应用程序中坚持使用默认凭据列为 十大网络安全错误配置 之首。排名第二的是用户和管理员权限分离不当,第三是网络监控不足。采用安全设计和默认安全的方法,是美国政府近年来最明确、宣传最多的目标之一。他们鼓励技术制造商停止生产存在已知可利用漏洞的产品,并制定法案禁止购买存在任何已知漏洞的软件,虽然一些专家批评该法案限制过多。

消息来源:The Register
老王点评:网络安全已经不是增强功能,而是必备的基础功能了。

LXC 发布 LXD 的社区分支 Incus 0.1

八月份,在 Canonical 决定 接管 LXD 之后,LXC 社区将 LXD 项目分叉为 Incus。上周末,Incus 软件发布了第一个正式版本 0.1。Incus 0.1 大致相当于 LXD 5.18 版本,在此基础上做了各种改动,删除了一些未使用或有问题的功能。有一个值得注意的变化是,用 /dev/incus 代替 /dev/lxd 设备。

消息来源:Phoronix
老王点评:脱开企业的束缚,就是新生的开始。而且,两个同源的竞争品也有助于更好的发展。

Vivaldi 反对谷歌的 WEI 规范提议

在 Mozilla 之后,另一家浏览器开发商 Vivaldi 对谷歌的 网络环境完整性 Web Environment Integrity (WEI)规范提议表达了反对。Vivaldi 认为谷歌的提议相当于给网站提供了一种 DRM。谷歌提议 WEI 被认为是明显针对广告屏蔽插件。WEI 将可以允许网站以浏览器安装广告插件或屏蔽了跟踪程序的完整性理由拒绝提供服务。它甚至可以让网站有理由拒绝不支持 WEI 的浏览器。鉴于基于 Chromium 的浏览器事实上垄断了市场,那么市场占有率较小的浏览器如 Firefox 将可能成为区别对待的受害者,其它浏览器都面临生存威胁,Linux 平台也存在类似的情况。但谷歌已经开始在 Chromium 中加入 WEI 相关代码

消息来源:Vivaldi
老王点评:这一切的行为,都是在“谷歌是一家广告公司”的前提下发生的。

LXD 的维护只限于 Canonical 员工

本月初,Canonical 公司将 LXD 项目从 LXC 项目中剥离出来,转移 到了 Canonical 名下。之前 LXD 的主要维护工作都是 Ubuntu 的母公司 Canonical 的员工参与,但当员工离开 Canonical 之后仍然可以继续开发 LXD/LXC,并拥有该项目的维护权。任何运作良好的开放源码软件项目都应该如此。但现在,看起来 Canonical 的前员工已经被取消了对 LXD 项目的维护权,两位曾经担任过维护者的前员工反馈了这一变化。或许稍具安慰或讽刺的是,他们目前还接受外面贡献。

消息来源:Phoronix
老王点评:呵,我想用不了多久,就会出现一个 LXD 的复刻分支。

安卓手机现在可以发现你身边的 AirTag 跟踪器

现在,安卓用户很快就会收到这些 “未知追踪器警报”。这种警报目前只适用于 AirTag,但谷歌表示将与标签制造商合作扩大其覆盖范围。如果你不拥有的 AirTag “与主人分离并被确定与你同行”,通知会告诉你“该追踪器的主人可以看到它的位置”。你还可以追溯第一次看到它与你同行的地点,并让追踪器播放声音,以及提供追踪器的一些主人信息。

消息来源:Ars Technica
老王点评:这对于防止追踪是有好处,但是如果你用 AirTag 保护你的遗失物品,可能就不是很妙了。所以,这是矛盾的两面么?

当你正在创建 LXD 容器的时候,你希望它们能被预先配置好。例如在容器一启动就自动执行 apt update来安装一些软件包,或者运行一些命令。

这篇文章将讲述如何用 cloud-init 来对 LXD 容器进行进行早期初始化

接下来,我们将创建一个包含cloud-init指令的LXD profile,然后启动一个新的容器来使用这个profile。

如何创建一个新的 LXD profile

查看已经存在的 profile:

$ lxc profile list
+---------|---------+
| NAME    | USED BY |
+---------|---------+
| default | 11      |
+---------|---------+

我们把名叫 default 的 profile 复制一份,然后在其内添加新的指令:

$ lxc profile copy default devprofile

$ lxc profile list
+------------|---------+
| NAME       | USED BY |
+------------|---------+
| default    | 11      |
+------------|---------+
| devprofile | 0       |
+------------|---------+

我们就得到了一个新的 profile: devprofile。下面是它的详情:

$ lxc profile show devprofile
config:
 environment.TZ: ""
description: Default LXD profile
devices:
 eth0:
 nictype: bridged
 parent: lxdbr0
 type: nic
 root:
 path: /
 pool: default
 type: disk
name: devprofile
used_by: []

注意这几个部分: config:description:devices:name:used_by:,当你修改这些内容的时候注意不要搞错缩进。(LCTT 译注:因为这些内容是 YAML 格式的,缩进是语法的一部分)

如何把 cloud-init 添加到 LXD profile 里

cloud-init 可以添加到 LXD profile 的 config 里。当这些指令将被传递给容器后,会在容器第一次启动的时候执行。

下面是用在示例中的指令:

 package_upgrade: true
 packages:
 - build-essential
 locale: es_ES.UTF-8
 timezone: Europe/Madrid
 runcmd:
 - [touch, /tmp/simos_was_here]

package_upgrade: true 是指当容器第一次被启动时,我们想要 cloud-init 运行 sudo apt upgradepackages: 列出了我们想要自动安装的软件。然后我们设置了 localetimezone。在 Ubuntu 容器的镜像里,root 用户默认的 localeC.UTF-8,而 ubuntu 用户则是 en_US.UTF-8。此外,我们把时区设置为 Etc/UTC。最后,我们展示了如何使用 runcmd 来运行一个 Unix 命令

我们需要关注如何将 cloud-init 指令插入 LXD profile。

我首选的方法是:

$ lxc profile edit devprofile

它会打开一个文本编辑器,以便你将指令粘贴进去。结果应该是这样的

$ lxc profile show devprofile
config:
  environment.TZ: ""
  user.user-data: |
    #cloud-config
    package_upgrade: true
    packages:
      - build-essential
    locale: es_ES.UTF-8
    timezone: Europe/Madrid
    runcmd:
      - [touch, /tmp/simos_was_here]
description: Default LXD profile
devices:
  eth0:
    nictype: bridged
    parent: lxdbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: devprofile
used_by: []

如何使用 LXD profile 启动一个容器

使用 profile devprofile 来启动一个新容器:

$ lxc launch --profile devprofile ubuntu:x mydev

然后访问该容器来查看我们的指令是否生效:

$ lxc exec mydev bash
root@mydev:~# ps ax
 PID TTY STAT TIME COMMAND
 1 ? Ss 0:00 /sbin/init
 ...
 427 ? Ss 0:00 /usr/bin/python3 /usr/bin/cloud-init modules --mode=f
 430 ? S 0:00 /bin/sh -c tee -a /var/log/cloud-init-output.log
 431 ? S 0:00 tee -a /var/log/cloud-init-output.log
 432 ? S 0:00 /usr/bin/apt-get --option=Dpkg::Options::=--force-con
 437 ? S 0:00 /usr/lib/apt/methods/http
 438 ? S 0:00 /usr/lib/apt/methods/http
 440 ? S 0:00 /usr/lib/apt/methods/gpgv
 570 ? Ss 0:00 bash
 624 ? S 0:00 /usr/lib/apt/methods/store
 625 ? R+ 0:00 ps ax
root@mydev:~#

如果我们连接得够快,通过 ps ax 将能够看到系统正在更新软件。我们可以从 /var/log/cloud-init-output.log 看到完整的日志:

Generating locales (this might take a while)...
 es_ES.UTF-8... done
Generation complete.

以上可以看出 locale 已经被更改了。root 用户还是保持默认的 C.UTF-8,只有非 root 用户 ubuntu 使用了新的locale 设置。

Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Get:3 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]

以上是安装软件包之前执行的 apt update

The following packages will be upgraded:
 libdrm2 libseccomp2 squashfs-tools unattended-upgrades
4 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 211 kB of archives.

以上是在执行 package_upgrade: true 和安装软件包。

The following NEW packages will be installed:
 binutils build-essential cpp cpp-5 dpkg-dev fakeroot g++ g++-5 gcc gcc-5
 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl

以上是我们安装 build-essential 软件包的指令。

runcmd 执行的结果如何?

root@mydev:~# ls -l /tmp/
total 1
-rw-r--r-- 1 root root 0 Jan 3 15:23 simos_was_here
root@mydev:~#

可见它已经生效了!

结论

当我们启动 LXD 容器的时候,我们常常需要默认启用一些配置,并且希望能够避免重复工作。通常解决这个问题的方法是创建 LXD profile,然后把需要的配置添加进去。最后,当我们启动新的容器时,只需要应用该 LXD profile 即可。


via: https://blog.simos.info/how-to-preconfigure-lxd-containers-with-cloud-init/

作者:Simos Xenitellis 译者:kaneg 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文的主角是容器,一种类似虚拟机但更轻量级的构造。你可以轻易地在你的 Ubuntu 桌面系统中创建一堆容器!

虚拟机会虚拟出整个电脑让你来安装客户机操作系统。相比之下,容器复用了主机的 Linux 内核,只是简单地 包容 了我们选择的根文件系统(也就是运行时环境)。Linux 内核有很多功能可以将运行的 Linux 容器与我们的主机分割开(也就是我们的 Ubuntu 桌面)。

Linux 本身需要一些手工操作来直接管理他们。好在,有 LXD(读音为 Lex-deeh),这是一款为我们管理 Linux 容器的服务。

我们将会看到如何:

  1. 在我们的 Ubuntu 桌面上配置容器,
  2. 创建容器,
  3. 安装一台 web 服务器,
  4. 测试一下这台 web 服务器,以及
  5. 清理所有的东西。

设置 Ubuntu 容器

如果你安装的是 Ubuntu 16.04,那么你什么都不用做。只要安装下面所列出的一些额外的包就行了。若你安装的是 Ubuntu 14.04.x 或 Ubuntu 15.10,那么按照 LXD 2.0 系列(二):安装与配置 来进行一些操作,然后再回来。

确保已经更新了包列表:

sudo apt update
sudo apt upgrade

安装 lxd 包:

sudo apt install lxd

若你安装的是 Ubuntu 16.04,那么还可以让你的容器文件以 ZFS 文件系统的格式进行存储。Ubuntu 16.04 的 Linux kernel 包含了支持 ZFS 必要的内核模块。若要让 LXD 使用 ZFS 进行存储,我们只需要安装 ZFS 工具包。没有 ZFS,容器会在主机文件系统中以单独的文件形式进行存储。通过 ZFS,我们就有了写入时拷贝等功能,可以让任务完成更快一些。

安装 zfsutils-linux 包(若你安装的是 Ubuntu 16.04.x):

sudo apt install zfsutils-linux

安装好 LXD 后,包安装脚本应该会将你加入 lxd 组。该组成员可以使你无需通过 sudo 就能直接使用 LXD 管理容器。根据 Linux 的习惯,你需要先登出桌面会话然后再登录 才能应用 lxd 的组成员关系。(若你是高手,也可以通过在当前 shell 中执行 newgrp lxd 命令,就不用重登录了)。

在开始使用前,LXD 需要初始化存储和网络参数。

运行下面命令:

$ sudo lxd init
Name of the storage backend to use (dir or zfs): zfs
Create a new ZFS pool (yes/no)? yes
Name of the new ZFS pool: lxd-pool
Would you like to use an existing block device (yes/no)? no
Size in GB of the new loop device (1GB minimum): 30
Would you like LXD to be available over the network (yes/no)? no
Do you want to configure the LXD bridge (yes/no)? yes 
> You will be asked about the network bridge configuration. Accept all defaults and continue.
Warning: Stopping lxd.service, but it can still be activated by:
 lxd.socket
 LXD has been successfully configured.
$ _

我们在一个(单独)的文件而不是块设备(即分区)中构建了一个文件系统来作为 ZFS 池,因此我们无需进行额外的分区操作。在本例中我指定了 30GB 大小,这个空间取之于根(/) 文件系统中。这个文件就是 /var/lib/lxd/zfs.img

行了!最初的配置完成了。若有问题,或者想了解其他信息,请阅读 https://www.stgraber.org/2016/03/15/lxd-2-0-installing-and-configuring-lxd-212/

创建第一个容器

所有 LXD 的管理操作都可以通过 lxc 命令来进行。我们通过给 lxc 不同参数来管理容器。

lxc list

可以列出所有已经安装的容器。很明显,这个列表现在是空的,但这表示我们的安装是没问题的。

lxc image list

列出可以用来启动容器的(已经缓存的)镜像列表。很明显这个列表也是空的,但这也说明我们的安装是没问题的。

lxc image list ubuntu:

列出可以下载并启动容器的远程镜像。而且指定了显示 Ubuntu 镜像。

lxc image list images:

列出可以用来启动容器的(已经缓存的)各种发行版的镜像列表。这会列出各种发行版的镜像比如 Alpine、Debian、Gentoo、Opensuse 以及 Fedora。

让我们启动一个 Ubuntu 16.04 容器,并称之为 c1

$ lxc launch ubuntu:x c1
Creating c1
Starting c1
$ 

我们使用 launch 动作,然后选择镜像 ubuntu:xx 表示 Xenial/16.04 镜像),最后我们使用名字 c1 作为容器的名称。

让我们来看看安装好的首个容器,

$ lxc list

+---------|---------|----------------------|------|------------|-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------|---------|----------------------|------|------------|-----------+
| c1 | RUNNING | 10.173.82.158 (eth0) | | PERSISTENT | 0 |
+---------|---------|----------------------|------|------------|-----------+

我们的首个容器 c1 已经运行起来了,它还有自己的 IP 地址(可以本地访问)。我们可以开始用它了!

安装 web 服务器

我们可以在容器中运行命令。运行命令的动作为 exec

$ lxc exec c1 -- uptime
 11:47:25 up 2 min,0 users,load average:0.07,0.05,0.04
$ _

exec 后面,我们指定容器、最后输入要在容器中运行的命令。该容器的运行时间只有 2 分钟,这是个新出炉的容器:-)。

命令行中的 -- 跟我们 shell 的参数处理过程有关。若我们的命令没有任何参数,则完全可以省略 -

$ lxc exec c1 -- df -h

这是一个必须要 - 的例子,由于我们的命令使用了参数 -h。若省略了 -,会报错。

然后我们运行容器中的 shell 来更新包列表。

$ lxc exec c1 bash
root@c1:~# apt update
Ign http://archive.ubuntu.com trusty InRelease
Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Get:2 http://security.ubuntu.com trusty-security InRelease [65.9 kB]
...
Hit http://archive.ubuntu.com trusty/universe Translation-en 
Fetched 11.2 MB in 9s (1228 kB/s) 
Reading package lists... Done
root@c1:~# apt upgrade
Reading package lists... Done
Building dependency tree 
...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up dpkg (1.17.5ubuntu5.7) ...
root@c1:~# _

我们使用 nginx 来做 web 服务器。nginx 在某些方面要比 Apache web 服务器更酷一些。

root@c1:~# apt install nginx
Reading package lists... Done
Building dependency tree
...
Setting up nginx-core (1.4.6-1ubuntu3.5) ...
Setting up nginx (1.4.6-1ubuntu3.5) ...
Processing triggers for libc-bin (2.19-0ubuntu6.9) ...
root@c1:~# _

让我们用浏览器访问一下这个 web 服务器。记住 IP 地址为 10.173.82.158,因此你需要在浏览器中输入这个 IP。

lxd-nginx

让我们对页面文字做一些小改动。回到容器中,进入默认 HTML 页面的目录中。

root@c1:~# cd /var/www/html/
root@c1:/var/www/html# ls -l
total 2
-rw-r--r-- 1 root root 612 Jun 25 12:15 index.nginx-debian.html
root@c1:/var/www/html#

使用 nano 编辑文件,然后保存:

lxd-nginx-nano

之后,再刷一下页面看看,

lxd-nginx-modified

清理

让我们清理一下这个容器,也就是删掉它。当需要的时候我们可以很方便地创建一个新容器出来。

$ lxc list
+---------+---------+----------------------+------+------------+-----------+
| NAME | STATE   | IPV4                 | IPV6 | TYPE       | SNAPSHOTS    |
+---------+---------+----------------------+------+------------+-----------+
| c1   | RUNNING | 10.173.82.169 (eth0) |      | PERSISTENT | 0            |
+---------+---------+----------------------+------+------------+-----------+
$ lxc stop c1
$ lxc delete c1
$ lxc list
+---------+---------+----------------------+------+------------+-----------+
| NAME | STATE   | IPV4                 | IPV6 | TYPE       | SNAPSHOTS    |
+---------+---------+----------------------+------+------------+-----------+
+---------+---------+----------------------+------+------------+-----------+

我们停止(关闭)这个容器,然后删掉它了。

本文至此就结束了。关于容器有很多玩法。而这只是配置 Ubuntu 并尝试使用容器的第一步而已。


via: https://blog.simos.info/trying-out-lxd-containers-on-our-ubuntu/

作者:Simos Xenitellis 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Q:我正在使用基于 LXD(“Linux 容器”)的虚拟机。如何在 Linux 系统中启动时自动启动 LXD 容器?

当 LXD 在启动时运行,你就可以随时启动容器。你需要将 boot.autostart 设置为 true。你可以使用 boot.autostart.priority(默认值为 0)选项来定义启动容器的顺序(从最高开始)。你也可以使用 boot.autostart.delay(默认值 0)选项定义在启动一个容器后等待几秒后启动另一个容器。

语法

上面讨论的关键字可以使用 lxc 工具用下面的语法来设置:

$ lxc config set {vm-name} {key} {value}
$ lxc config set {vm-name} boot.autostart {true|false}
$ lxc config set {vm-name} boot.autostart.priority integer
$ lxc config set {vm-name} boot.autostart.delay integer

如何在 Ubuntu Linux 16.10 中让 LXD 容器在启动时启动?

输入以下命令:

$ lxc config set {vm-name} boot.autostart true

设置一个 LXD 容器名称 “nginx-vm” 以在启动时启动

$ lxc config set nginx-vm boot.autostart true

你可以使用以下语法验证设置:

$ lxc config get {vm-name} boot.autostart
$ lxc config get nginx-vm boot.autostart

示例输出:

true

你可以使用下面的语法在启动容器后等待 10 秒钟后启动另一个容器:

$ lxc config set nginx-vm boot.autostart.delay 10

最后,通过设置最高值来定义启动容器的顺序。确保 dbvm 容器首先启动,然后再启动 nginxvm。

$ lxc config set db_vm boot.autostart.priority 100
$ lxc config set nginx_vm boot.autostart.priority 99

使用下面的 bash 循环在 Linux 上查看所有配置值:

#!/bin/bash
echo 'The current values of each vm boot parameters:'
for c in db_vm nginx_vm memcache_vm
do
    echo "*** VM: $c ***"
    for v in boot.autostart boot.autostart.priority boot.autostart.delay
    do
        echo "Key: $v => $(lxc config get $c $v) "
    done
    echo ""
done

示例输出:

Fig.01: Get autostarting LXD containers values using a bash shell script


via: https://www.cyberciti.biz/faq/how-to-auto-start-lxd-containers-at-boot-time-in-linux/

作者:Vivek Gite 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出