2018年5月

使用两个简单的硬件设备和几行代码构建一个空气质量探测器。

我们在东南亚的学校定期测定空气中的颗粒物。这里的测定值非常高,尤其是在二到五月之间,干燥炎热、土地干旱等各种因素都对空气质量产生了不利的影响。我将会在这篇文章中展示如何使用树莓派来测定颗粒物。

什么是颗粒物?

颗粒物就是粉尘或者空气中的微小颗粒。其中 PM10 和 PM2.5 之间的差别就是 PM10 指的是粒径小于 10 微米的颗粒,而 PM2.5 指的是粒径小于 2.5 微米的颗粒。在粒径小于 2.5 微米的的情况下,由于它们能被吸入肺泡中并且对呼吸系统造成影响,因此颗粒越小,对人的健康危害越大。

世界卫生组织的建议颗粒物浓度是:

  • 年均 PM10 不高于 20 µg/m³
  • 年均 PM2.5 不高于 10 µg/m³
  • 不允许超标时,日均 PM10 不高于 50 µg/m³
  • 不允许超标时,日均 PM2.5 不高于 25 µg/m³

以上数值实际上是低于大多数国家的标准的,例如欧盟对于 PM10 所允许的年均值是不高于 40 µg/m³。

什么是 空气质量指数 Air Quality Index (AQI)?

空气质量指数是按照颗粒物的测定值来评价空气质量的好坏,然而由于各国之间的计算方式有所不同,这个指数并没有统一的标准。维基百科上关于空气质量指数的词条对此给出了一个概述。我们学校则以 美国环境保护协会 Environment Protection Agency (EPA)建立的分类法来作为依据。

 title=

空气质量指数

测定颗粒物需要哪些准备?

测定颗粒物只需要以下两种器材:

  • 树莓派(款式不限,最好带有 WiFi)
  • SDS011 颗粒物传感器

 title=

颗粒物传感器

如果是只带有 Micro USB 的树莓派 Zero W,那还需要一根连接到标准 USB 端口的适配线,只需要 20 美元,而传感器则自带适配串行接口的 USB 适配器。

安装过程

对于树莓派,只需要下载对应的 Raspbian Lite 镜像并且写入到 Micro SD 卡上就可以了(网上很多教程都有介绍如何设置 WLAN 连接,我就不细说了)。

如果要使用 SSH,那还需要在启动分区建立一个名为 ssh 的空文件。树莓派的 IP 通过路由器或者 DHCP 服务器获取,随后就可以通过 SSH 登录到树莓派了(默认密码是 raspberry):

$ ssh [email protected]

首先我们需要在树莓派上安装一下这些包:

$ sudo apt install git-core python-serial python-enum lighttpd

在开始之前,我们可以用 dmesg 来获取 USB 适配器连接的串行接口:

$ dmesg
[ 5.559802] usbcore: registered new interface driver usbserial
[ 5.559930] usbcore: registered new interface driver usbserial_generic
[ 5.560049] usbserial: USB Serial support registered for generic
[ 5.569938] usbcore: registered new interface driver ch341
[ 5.570079] usbserial: USB Serial support registered for ch341-uart
[ 5.570217] ch341 1–1.4:1.0: ch341-uart converter detected
[ 5.575686] usb 1–1.4: ch341-uart converter now attached to ttyUSB0

在最后一行,可以看到接口 ttyUSB0。然后我们需要写一个 Python 脚本来读取传感器的数据并以 JSON 格式存储,在通过一个 HTML 页面就可以把数据展示出来了。

在树莓派上读取数据

首先创建一个传感器实例,每 5 分钟读取一次传感器的数据,持续 30 秒,这些数值后续都可以调整。在每两次测定的间隔,我们把传感器调到睡眠模式以延长它的使用寿命(厂商认为元件的寿命大约 8000 小时)。

我们可以使用以下命令来下载 Python 脚本:

$ wget -O /home/pi/aqi.py https://raw.githubusercontent.com/zefanja/aqi/master/python/aqi.py

另外还需要执行以下两条命令来保证脚本正常运行:

$ sudo chown pi:pi /var/www/html/
$ echo '[]' > /var/www/html/aqi.json

下面就可以执行脚本了:

$ chmod +x aqi.p
$ ./aqi.py
PM2.5:55.3, PM10:47.5
PM2.5:55.5, PM10:47.7
PM2.5:55.7, PM10:47.8
PM2.5:53.9, PM10:47.6
PM2.5:53.6, PM10:47.4
PM2.5:54.2, PM10:47.3
…

自动化执行脚本

只需要使用诸如 crontab 的服务,我们就不需要每次都手动启动脚本了。按照以下命令打开 crontab 文件:

$ crontab -e

在文件末尾添加这一行:

@reboot cd /home/pi/ && ./aqi.py

现在我们的脚本就会在树莓派每次重启后自动执行了。

展示颗粒物测定值和空气质量指数的 HTML 页面

我们在前面已经安装了一个轻量级的 web 服务器 lighttpd,所以我们需要把 HTML、JavaScript、CSS 文件放置在 /var/www/html 目录中,这样就能通过电脑和智能手机访问到相关数据了。执行下面的三条命令,可以下载到对应的文件:

$ wget -O /var/www/html/index.html https://raw.githubusercontent.com/zefanja/aqi/master/html/index.html
$ wget -O /var/www/html/aqi.js https://raw.githubusercontent.com/zefanja/aqi/master/html/aqi.js
$ wget -O /var/www/html/style.css https://raw.githubusercontent.com/zefanja/aqi/master/html/style.css

在 JavaScript 文件中,实现了打开 JSON 文件、提取数据、计算空气质量指数的过程,随后页面的背景颜色将会根据 EPA 的划分标准而变化。

你只需要用浏览器访问树莓派的地址,就可以看到当前颗粒物浓度值等数据了: http://192.168.1.5:

这个页面比较简单而且可扩展,比如可以添加一个展示过去数小时历史数据的表格等等。

这是Github上的完整源代码

总结

在资金相对紧张的情况下,树莓派是一种选择。除此以外,还有很多可以用来测定颗粒物的应用,包括室外固定装置、移动测定设备等等。我们学校则同时采用了这两种:固定装置在室外测定全天颗粒物浓度,而移动测定设备在室内检测空调过滤器的效果。

Luftdaten.info 提供了一个如何设计类似的传感器的介绍,其中的软件效果出众,而且因为它没有使用树莓派,所以硬件更是小巧。

对于学生来说,设计一个颗粒物传感器确实算得上是一个优秀的课外项目。

你又打算如何使用你的树莓派呢?


via: https://opensource.com/article/18/3/how-measure-particulate-matter-raspberry-pi

作者:Stephan Tetzel 译者:HankChow 校对:wxy

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

从理论上来说,可以。Zed Shaw 说过一句著名的话,如果不行,那么 Python 3 一定不是图灵完备的。但在实践中,这是不现实的,我将通过给你们举几个例子来说明原因。

对于字典(dict)来说,这意味着什么?

让我们来想象一台拥有 Python 6 的虚拟机,它可以读取 Python 3.6 编写的 module3.py。但是在这个模块中,它可以导入 Python 2.7 编写的 module2.py,并成功使用它,没有问题。这显然是实验代码,但假设 module2.py 包含以下的功能:

def update_config_from_dict(config_dict):
    items = config_dict.items()
    while items:
        k, v = items.pop()
        memcache.set(k, v)

def config_to_dict():
    result = {}
    for k, v in memcache.getall():
        result[k] = v
    return result

def update_in_place(config_dict):
    for k, v in config_dict.items():
        new_value = memcache.get(k)
        if new_value is None:
            del config_dict[k]
        elif new_value != v:
            config_dict[k] = v

现在,当我们想从 module3 中调用这些函数时,我们遇到了一个问题:Python 3.6 中的字典类型与 Python 2.7 中的字典类型不同。在 Python 2 中,字典是无序的,它们的 .keys(), .values(), .items() 方法返回了正确的序列,这意味着调用 .items() 会在字典中创建状态的副本。在 Python 3 中,这些方法返回字典当前状态的动态视图。

这意味着如果 module3 调用 module2.update_config_from_dict(some_dictionary),它将无法运行,因为 Python 3 中 dict.items() 返回的值不是一个列表,并且没有 .pop() 方法。反过来也是如此。如果 module3 调用 module2.config_to_dict(),它可能会返回一个 Python 2 的字典。现在调用 .items() 突然返回一个列表,所以这段代码无法正常工作(这对 Python 3 字典来说工作正常):

def main(cmdline_options):
    d = module2.config_to_dict()
    items = d.items()
    for k, v in items:
        print(f'Config from memcache: {k}={v}')
    for k, v in cmdline_options:
        d[k] = v
    for k, v in items:
        print(f'Config with cmdline overrides: {k}={v}')

最后,使用 module2.update_in_place() 会失败,因为 Python 3 中 .items() 的值现在不允许在迭代过程中改变。

对于字典来说,还有很多问题。Python 2 的字典在 Python 3 上使用 isinstance(d, dict) 应该返回 True 吗?如果是的话,这将是一个谎言。如果没有,代码将无法继续。

Python 应该神奇地知道类型并会自动转换!

为什么我们的 Python 6 的虚拟机无法识别 Python 3 的代码,在 Python 2 中调用 some_dict.keys() 时,我们还有别的意思吗?好吧,Python 不知道代码的作者在编写代码时,她所认为的 some_dict 应该是什么。代码中没有任何内容表明它是否是一个字典。在 Python 2 中没有类型注释,因为它们是可选的,即使在 Python 3 中,大多数代码也不会使用它们。

在运行时,当你调用 some_dict.keys() 的时候,Python 只是简单地在对象上查找一个属性,该属性恰好隐藏在 some_dict 名下,并试图在该属性上运行 __call__()。这里有一些关于方法绑定,描述符,slots 等技术问题,但这是它的核心。我们称这种行为为“鸭子类型”。

由于鸭子类型,Python 6 的虚拟机将无法做出编译时决定,以正确转换调用和属性查找。

好的,让我们在运行时做出这个决定

Python 6 的虚拟机可以标记每个属性,通过查找“来自 py2 的调用”或“来自 py3 的调用”的信息来实现这一点,并使对象发送正确的属性。这会让它变得很慢,并且使用更多的内存。这将要求我们在内存中保留两种版本的代码,并通过代理来使用它们。我们需要加倍付出努力,在用户背后同步这些对象的状态。毕竟,新字典的内存表示与 Python 2 不同。

如果你已经被字典问题绕晕了,那么再想想 Python 3 中的 Unicode 字符串和 Python 2 中的字节(byte)字符串的各种问题吧。

没有办法了吗?Python 3 根本就不能运行旧代码吗?

不会。每天都会有项目移植到 Python 3。将 Python 2 代码移植到两个版本的 Python 上推荐方法是在你的代码上运行 Python-Modernize。它会捕获那些在 Python 3 上不起作用的代码,并使用 six 库将其替换,以便它在 Python 2 和 Python 3 上运行。这是 2to3 的一个改编版本,用于生成仅针对 Python 3 代码。Modernize 是首选,因为它提供了更多的增量迁移路线。所有的这些在 Python 文档中的 Porting Python 2 Code to Python 3文档中都有很好的概述。

但是,等一等,你不是说 Python 6 的虚拟机不能自动执行此操作吗?对。Modernize 查看你的代码,并试图猜测哪些是安全的。它会做出一些不必要的改变,还会错过其他必要的改变。但是,它不会帮助你处理字符串。如果你的代码没有在“来自外部的二进制数据”和“流程中的文本数据”之间保持界限,那么这种转换就不会那么轻易。

因此,大项目的迁移不能自动完成,并且需要人类进行测试,发现问题并修复它们。它工作吗?是的,我曾帮助将一百万行代码迁移到 Python 3,并且这种切换没有造成事故。这一举措让我们重新获得了 1/3 的服务器内存,并使代码运行速度提高了 12%。那是在 Python 3.5 上,但是 Python 3.6 的速度要快得多,根据你的工作量,你甚至可以达到 4 倍加速

亲爱的 Zed

hi,伙计,我关注你已经超过 10 年了。我一直在观察,当你感到沮丧的时候,你对 Mongrel 没有任何信任,尽管 Rails 生态系统几乎全部都在上面运行。当你重新设计它并开始 Mongrel 2 项目时,我一直在观察。我一直在关注你使用 Fossil 这一令人惊讶的举动。随着你发布 “Rails 是一个贫民窟”的帖子,我看到你突然离开了 Ruby 社区。当你开始编写《笨方法学 Python》并且开始推荐它时,我感到非常兴奋。2013 年我在 DjangoCon Europe 见过你,我们谈了很多关于绘画,唱歌和倦怠的内容。你的这张照片是我在 Instagram 上的第一个帖子。

你几乎把另一个“贫民区”的行动与 “反对 Python 3” 案例 文章拉到一起。我认为你本意是好的,但是这篇文章引起了很多混淆,包括许多人觉得你认为 Python 3 不是图灵完整的。我花了好几个小时让人们相信,你是在开玩笑。但是,鉴于你对《笨方法学 Python》的重大贡献,我认为这是值得的。特别是你为 Python 3 更新了你的书。感谢你做这件事。如果我们社区中真的有人因你的帖子为由要求将你和你的书列入黑名单,而请他们出去。这是一个双输的局面,这是错误的。

说实话,没有一个核心 Python 开发人员认为 Python 2 到 Python 3 的转换过程会顺利而且计划得当,包括 Guido van Rossum。真的,可以看那个视频,这有点事后诸葛亮的意思了。从这个意义上说,我们实际上是积极地相互认同的。如果我们再做一次,它会看起来不一样。但在这一点上,在 2020 年 1 月 1 日,Python 2 将会到达终结。大多数第三方库已经支持 Python 3,甚至开始发布只支持 Python 3 的版本(参见 Django科学项目关于 Python 3 的声明)。

我们也积极地就另一件事达成一致。就像你于 Mongrel 一样,Python 核心开发人员是志愿者,他们的工作没有得到报酬。我们大多数人在这个项目上投入了大量的时间和精力,因此我们自然而然敏感于那些对他们的贡献不屑一顾和激烈的评论。特别是如果这个信息既攻击目前的事态,又要求更多的自由贡献。

我希望到 2018 年会让你忘记 2016 发布的帖子,有一堆好的反驳。我特别喜欢 eevee(LCTT 译注:eevee 是一个为 Blender 设计的渲染器)。它特别针对“一起运行 Python 2 和 Python 3 ”的场景,这是不现实的,就像在同一个虚拟机中运行 Ruby 1.8 和 Ruby 2.x 一样,或者像 Lua 5.3 和 Lua 5.1 同时运行一样。你甚至不能用 libc.so.6 运行针对 libc.so.5 编译的 C 二进制文件。然而,我发现最令人惊讶的是,你声称 Python 核心开发者是“有目的地”创造诸如 2to3 之类的破坏工具,这些由 Guido 创建,其最大利益就是让每个人尽可能顺利,快速地迁移。我很高兴你在之后的帖子中放弃了这个说法,但是你必须意识到你会激怒那些阅读了原始版本的人。对蓄意伤害的指控最好有强有力的证据支持。

但看起来你仍然会这样做。就在今天你说 Python 核心开发者“忽略”尝试解决 API 的问题,特别是 six。正如我上面写的那样,Python 文档中的官方移植指南涵盖了 six。更重要的是,six 是由 Python 2.7 的发布管理者 Benjamin Peterson 编写。很多人学会了编程,这要归功于你,而且由于你在网上有大量的粉丝,人们会阅读这样的推文,他们会相信它的价值,这是有害的。

我有一个建议,让我们把 “Python 3 管理不善”的争议搁置起来。Python 2 正在死亡,这个过程会很慢,并且它是丑陋而血腥的,但它是一条单行道。争论那些没有用。相反,让我们专注于我们现在可以做什么来使 Python 3.8 比其他任何 Python 版本更好。也许你更喜欢看外面的角色,但作为这个社区的成员,你会更有影响力。请说“我们”而不是“他们”。


via: http://lukasz.langa.pl/13/could-we-run-python-2-and-python-3-code-same-vm/

作者:Łukasz Langa 选题:lujun9972 译者:MjSeven 校对:wxy

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

COPR 是一个个人软件仓库集合,它包含 Fedora 所没有提供的软件。这些软件或不符合易于打包的标准,或者它可能不符合其他 Fedora 标准,尽管它是自由且开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件并没有得到 Fedora 基础设施支持,也没有由该项目背书。但是,它可能是尝试新软件或实验软件的一种很好的方式。

这是 COPR 中一些新的和有趣的项目。

Anki

Anki 是一个程序,它使用间隔重复帮助你学习和记忆事物。你可以创建卡片并将其组织成卡组,或下载现有卡组。卡片的一面有问题,另一面有答案。它可能还包括图像、视频或音频。你对每张卡的回答好坏决定了你将来看到特定卡的频率。

虽然 Anki 已经在 Fedora 中,但这个仓库提供了一个更新的版本。

安装说明

仓库目前为 Fedora 27、28 和 Rawhide 提供 Anki。要安装 Anki,请使用以下命令:

sudo dnf copr enable thomasfedb/anki
sudo dnf install anki

Fd

Fd 是一个命令行工具,它是简单而稍快的替代 find 的方法。它可以并行地查找项目。fd 也使用彩色输出,并默认忽略隐藏文件和 .gitignore 中指定模式的文件。

安装说明

仓库目前为 Fedora 26、27、28 和 Rawhide 提供 fd。要安装 fd,请使用以下命令:

sudo dnf copr enable keefle/fd
sudo dnf install fd

KeePass

KeePass 是一个密码管理器。它将所有密码保存在一个由主密钥或密钥文件锁定的端对端加密数据库中。密码可以组织成组并由程序的内置生成器生成。其他功能包括自动输入,它可以为选定的表单输入用户名和密码。

虽然 KeePass 已经在 Fedora 中,但这个仓库提供了最新版本。

安装说明

仓库目前为 Fedora 26 和 27 提供 KeePass。要安装 KeePass,请使用以下命令:

sudo dnf copr enable mavit/keepass
sudo dnf install keepass

jo

Jo 是一个将输入转换为 JSON 字符串或数组的命令行工具。它有一个简单的语法并识别布尔值、字符串和数字。另外,jo 支持嵌套并且可以嵌套自己的输出。

安装说明

目前,仓库为 Fedora 26、27 和 Rawhide 以及 EPEL 6 和 7 提供 jo。要安装 jo,请使用以下命令:

sudo dnf copr enable ganto/jo
sudo dnf install jo

via: https://fedoramagazine.org/4-try-copr-april-2018/

作者:Dominik Turecek 选题:lujun9972 译者:geekpi 校对:wxy

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

一个学生在搜寻强劲而节能的工作站的历程中怎样对开源系统的热情与日俱增的。

最近我被问起为什么在博客和推特里经常提到 ARMPowerPC。我有两个答案:一个是个人原因,另一个是技术上的。

个人原因

从前,我是学环境保护的。在我读博的时候,我准备买个新电脑。作为一个环保人士,我需要一台强劲且节能的电脑。这就是我开始对 PowerPC 感兴趣的原因,我找到了 Pegasos,这是一台 Genesi 公司制造的 PowerPC 工作站。

我还用过 RS/6000 (PowerPC)、 SGI (MIPS)、 HP-UX (PA-RISC)和 VMS (Alpha)的服务器和工作站,由于我的 PC 使用 Linux 而非 Windows,所以使用不同的 CPU 架构对我来说并没有什么区别。 Pegasos 是我第一台工作站,它小型而节能而且对家用来说性能足够。

很快我就开始为 Genesi 工作,为 Pegasos 移植 openSUSE、 Ubuntu 和其他 Linux 发行版,并提供质量保证和社区支持。继 Pegasos 之后是 EFIKA,这是另一款基于 PowerPC 的开发板。在用过工作站之后,刚开始使用嵌入式系统会感觉有点奇怪。但是作为第一代普及价位的开发板,这是一场革命的开端。

我工作于一个大规模的服务器项目时,我收到 Genesi 的另一块有趣的开发板:基于 ARM 的 SmarttopSmartbook。我最喜欢的 Linux 发行版——openSUSE,也收到了一打这种机器。这在当时 ARM 电脑非常稀缺的情况下,极大地促进了 ARM 版 openSUSE 项目的开发。

尽管最近我很忙,我尽量保持对 ARM 和 PowerPC 新闻的关注。这有助于我支持非 x86 平台上的 syslog-ng 用户。只要有半个小时的空,我就会去捣鼓一下 ARM 机器。我在树莓派2上做了很多 syslog-ng 的测试,结果令人振奋。我最近在树莓派上做了个音乐播放器,用了一块 USB 声卡和音乐播放守护进程,我经常使用它。

技术方面

美好的多样性:它创造了竞争,而竞争创造了更好的产品。虽然 x86 是一款强劲的通用处理器,但 ARM 和 PowerPC (以及许多其他)这样的芯片在多种特定场景下显得更适合。

如果你有一部运行安卓的移动设备或者苹果的 iPhone 或 iPad,极有可能它使用的就是基于ARM 的 SoC (片上系统)。网络存储服务器也一样。原因很简单:省电。你不会希望手机一直在充电,也不想为你的路由器付更多的电费。

ARM 亦在使用 64 位 ARMv8 芯片征战企业级服务器市场。很多任务只需要极少的计算能力,另一方面省电和快速 IO 才是关键,想想存储、静态网页服务器、电子邮件和其他网络/存储相关的功能。一个最好的例子就是 Ceph,一个分布式的面向对象文件系统。SoftIron 就是一个基于 ARMv8 开发版,使用 CentOS 作为基准软件,运行在 Ceph 上的完整存储应用。

众所周知 PowerPC 是旧版苹果 Mac 电脑上的 CPU。虽然它不再作为通用桌面电脑的 CPU ,它依然在路由器和电信设备里发挥作用。而且 IBM 仍在为高端服务器制造芯片。几年前,随着 Power8 的引入, IBM 在 OpenPower 基金会 的支持下开放了架构。 Power8 对于关心内存带宽的设备,比如 HPC 、大数据、数据挖掘来说,是非常理想的平台。目前,Power9 也正呼之欲出。

这些都是服务器应用,但也有计划用于终端用户。猛禽工程团队正在开发一款基于 Power9 的工作站,也有一个基于飞思卡尔/恩智浦 QORIQ E6500 芯片制造笔记本的倡议。当然,这些电脑并不适合所有人,你不能在它们上面安装 Windows 游戏或者商业应用。但它们对于 PowerPC 开发人员和爱好者,或者任何想要完全开放系统的人来说是理想的选择,因为从硬件到固件到应用程序都是开放的。

梦想

我的梦想是完全没有 x86 的环境,不是因为我讨厌 x86 ,而是因为我喜欢多样化而且总是希望使用最适合工作的工具。如果你看看猛禽工程网页上的,根据不同的使用情景, ARM 和 POWER 完全可以代替 x86 。现在,我在笔记本的 x86 虚拟机上编译、打包和测试 syslog-ng。如果能用上足够强劲的 ARMv8 或者 PowerPC 电脑,无论工作站还是服务器,我就能避免在 x86 上做这些事。

现在我正在等待下一代菠萝本的到来,就像我在二月份 FOSDEM 上说的,下一代有望提供更高的性能。和 Chrome 本不同的是,这个 ARM 笔记本设计用于运行 Linux 而非仅是个客户端(LCTT 译注:Chrome 笔记本只提供基于网页的应用)。作为桌面系统,我在寻找 ARMv8 工作站级别的硬件。有些已经接近完成——就像 Avantek 公司的 雷神 X 台式机——不过他们还没有装备最新最快最重要也最节能的 ARMv8 CPU。当这些都实现了,我将用我的 Pixel C 笔记本运行安卓。它不像 Linux 那样简单灵活,但它以强大的 ARM SoC 和 Linux 内核为基础。


via: https://opensource.com/article/18/4/why-i-love-arm-and-powerpc

作者:Peter Czanik 译者:kennethXia 校对:wxy

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

在虚拟化平台上进行系统管理工作时,经常需要在开始重大操作比如部署补丁和代码前先设置一个虚拟机 快照 snapshot

虚拟机快照是特定时间点的虚拟机磁盘的副本。换句话说,快照保存了给定的时间点虚拟机的状态和数据。

我们可以在哪里使用虚拟机快照?

如果你在使用基于 KVM 虚拟机管理程序 hypervisor ,那么可以使用 virsh 命令获取虚拟机或域快照。快照在一种情况下变得非常有用,当你已经在虚拟机上安装或应用了最新的补丁,但是由于某些原因,虚拟机上的程序变得不稳定,开发团队想要还原所有的更改和补丁。如果你在应用补丁之前设置了虚拟机的快照,那么可以使用快照将虚拟机恢复到之前的状态。

注意:我们只能对磁盘格式为 Qcow2 的虚拟机的进行快照,并且 kvm 的 virsh 命令不支持 raw 磁盘格式,请使用以下命令将原始磁盘格式转换为 qcow2。

# qemu-img convert -f raw -O qcow2 image-name.img image-name.qcow2

创建 KVM 虚拟机(域)快照

我假设 KVM 管理程序已经在 CentOS 7 / RHEL 7 机器上配置好了,并且有虚拟机正在运行。我们可以使用下面的 virsh 命令列出虚拟机管理程序中的所有虚拟机,

[root@kvm-hypervisor ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 94    centos7.0                      running
 101   overcloud-controller           running
 102   overcloud-compute2             running
 103   overcloud-compute1             running
 114   webserver                      running
 115   Test-MTN                       running

假设我们想创建 webserver 虚拟机的快照,运行下面的命令,

语法:

# virsh snapshot-create-as –domain {vm_name} –name {snapshot_name} –description “enter description here”
[root@kvm-hypervisor ~]# virsh snapshot-create-as --domain webserver --name webserver_snap --description "snap before patch on 4Feb2018"
Domain snapshot webserver_snap created

创建快照后,我们可以使用下面的命令列出与虚拟机相关的快照:

[root@kvm-hypervisor ~]# virsh snapshot-list webserver
 Name                 Creation Time             State
------------------------------------------------------------
 webserver_snap       2018-02-04 15:05:05 +0530 running
[root@kvm-hypervisor ~]#

要列出虚拟机快照的详细信息,请运行下面的 virsh 命令:

[root@kvm-hypervisor ~]# virsh snapshot-info --domain webserver --snapshotname webserver_snap
Name:           webserver_snap
Domain:         webserver
Current:        yes
State:          running
Location:       internal
Parent:         -
Children:       0
Descendants:    0
Metadata:       yes

我们可以使用下面的 qemu-img 命令查看快照的大小:

[root@kvm-hypervisor ~]# qemu-img info /var/lib/libvirt/images/snaptestvm.img

qemu-img-command-output-kvm

还原 KVM 虚拟机快照

假设我们想要将 webserver 虚拟机还原到我们在上述步骤中创建的快照。使用下面的 virsh 命令将 Webserver 虚拟机恢复到其快照 webserver\_snap 时。

语法:

# virsh snapshot-revert {vm_name} {snapshot_name}
[root@kvm-hypervisor ~]# virsh snapshot-revert webserver webserver_snap

删除 KVM 虚拟机快照

要删除 KVM 虚拟机快照,首先使用 virsh snapshot-list 命令获取虚拟机的快照详细信息,然后使用 virsh snapshot-delete 命令删除快照。如下示例所示:

[root@kvm-hypervisor ~]# virsh snapshot-list --domain webserver
 Name                 Creation Time             State
------------------------------------------------------------
 webserver_snap       2018-02-04 15:05:05 +0530 running
[root@kvm-hypervisor ~]# virsh snapshot-delete --domain webserver --snapshotname webserver_snap
Domain snapshot webserver_snap deleted

这就是本文的全部内容,我希望你们能够了解如何使用 virsh 命令来管理 KVM 虚拟机快照。请分享你的反馈,并不要犹豫地分享给你的技术朋友

Docker 是一种所谓容器化的操作系统级的虚拟化软件。

基于 Linux 内核的 cgroup 和 namespace 等资源隔离特性,Docker 可以在单个 Linux 实例中运行多个独立的容器。

通过将应用依赖和相关库打包进容器,Docker 使得应用可以在容器中安全隔离地运行。

Dry 是什么

Dry 是一个管理并监控 Docker 容器和镜像的命令行工具。

Dry 可以给出容器相关的信息,包括对应镜像、容器名称、网络、容器中运行的命令及容器状态;如果运行在 Docker Swarm 中,工具还会给出 Swarm 集群的各种状态信息。

Dry 可以连接至本地或远程的 Docker 守护进程。如果连接本地 Docker,Docker 主机显示为 unix:///var/run/docker.sock

如果连接远程 Docker,Docker 主机显示为 tcp://IP Address:Port Numbertcp://Host Name:Port Number

Dry 可以提供类似 docker ps 的指标输出,但输出比 docker ps 内容详实、富有色彩。

相比 Docker,Dry 还可以手动添加一个额外的名称列,用于降低记忆难度。

推荐阅读:

如何在 Linux 中安装 Dry

在 Linux 中,可以通过一个简单的 shell 脚本安装最新版本的 Dry 工具。Dry 不依赖外部库。对于绝大多数的 Docker 命令,Dry 提供类似样式的命令。

$ curl -sSf https://moncho.github.io/dry/dryup.sh | sudo sh
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 10 100 10 0 0 35 0 --:--:-- --:--:-- --:--:-- 35
dryup: downloading dry binary
######################################################################## 100.0%
dryup: Moving dry binary to its destination
dryup: dry binary was copied to /usr/local/bin, now you should 'sudo chmod 755 /usr/local/bin/dry'

使用如下命令将文件权限变更为 755

$ sudo chmod 755 /usr/local/bin/dry

对于使用 Arch Linux 的用户,可以使用 PackerYaourt 包管理器,从 AUR 源安装该工具。

$ yaourt -S dry-bin
或者
$ packer -S dry-bin

如果希望在 Docker 容器中运行 dry,可以运行如下命令。前提条件是已确认在操作系统中安装了 Docker。

推荐阅读:

$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock moncho/dry

如何启动并运行 Dry

在控制台运行 dry 命令即可启动该工具,其默认输出如下:

$ dry

如何使用 Dry 监控 Docker

你可以在 dry 的界面中按下 m 键打开监控模式。

如何使用 Dry 管理容器

在选中的容器上单击回车键,即可管理容器。Dry 提供如下操作:查看日志,查看、杀死、删除容器,停止、启动、重启容器,查看容器状态及镜像历史记录等。

如何监控容器资源利用率

用户可以使用 Stats+Top 选项查看指定容器的资源利用率。

该操作需要在容器管理界面完成(在上一步的基础上,点击 Stats+Top 选项)。另外,也可以按下 s 打开容器资源利用率界面。

如何查看容器、镜像及本地卷的磁盘使用情况

可以使用 F8 键查看容器、镜像及本地卷的磁盘使用情况。

该界面明确地给出容器、镜像和卷的总数,哪些处于使用状态,以及整体磁盘使用情况、可回收空间大小的详细信息。

如何查看已下载的镜像

按下 2 键即可列出全部的已下载镜像。

如何查看网络列表

按下 3 键即可查看全部网络及网关。

如何查看全部 Docker 容器

按下 F2 键即可列出列出全部容器,包括运行中和已关闭的容器。

Dry 快捷键

查看帮助页面或 dry GitHub 即可查看全部快捷键。


via: https://www.2daygeek.com/dry-an-interactive-cli-manager-for-docker-containers/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:pinewall 校对:wxy

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