分类 技术 下的文章

inix 是一个用于获取 Linux 系统信息的终端命令。能够获取软件和硬件的详细信息,比如计算机型号、内核版本、发行版号以及桌面环境等信息,甚至可以读取主存模块占用主板的哪块 RAM 卡槽等详细信息。

inxi 还可以用于监控系统中正在消耗 CPU 或者内存资源的进程。

在本文中,我将展示使用 inxi 命令获取系统信息的常用操作。

首先,我将展示下如何安装 inxi 命令。

在 Linux 上安装 inxi

inxi 是一个非常流行的工具,所以在大多数 Linux 发行版仓库中都可以轻松获取到该工具。不过还没有流行到各大 Linux 发行版默认就安装了该软件,所以需要我们自己安装一下。

在 Ubuntu/Debian 发行版系统中,安装命令:

sudo apt install inxi

在 Fedora/RHEL8-based 等发行版中,安装命令:

sudo dnf install -y epel-release
sudo dnf install -y inxi

Arch Linux 以及它的派生分支版本中,安装命令:

sudo pacman -S inxi

使用 inxi 获取系统信息

你可以在终端运行 inxi 命令来总体浏览下系统信息。

inxi

如下图所示,运行 inxi 命令可以简要浏览 CPU、时钟频率(speed/min/max)、内核(Kernel)、内存(Mem)、磁盘存储空间(Storage)、运行进程数量(Procs)以及 Shell 等信息。

The default output of inxi command

使用 -b 参数可以获取更为详细的系统信息。-b 参数会读取更多有关 CPU、驱动器、当前运行进程、主板 UEFI 版本、GPU、显示分辨率以及网络设备等详细信息。

inxi -b

Detailed hardware and software information about machine as reported by inxi

类似 -b 参数使用方法,inxi 还有许多其他的参数可供使用。你可以综合使用这些参数来获取你关心的信息。

让我们看几个实例。

获取音频设备信息

使用 -A 参数可以获取有关音频(输出)设备信息,包括物理音频(输出)设备、声音服务器以及音频驱动等详细信息。

inxi -A

Output of inxi command when “-A” flag is used

获取电池信息

使用 -B 参数,可以获取有关电池的信息(如果安装了电池)。你将读取到例如以 Wh(瓦特小时)为单位的当前电池电量和状况。

因为我使用的是台式机,所以这里仅仅作为一个示例,让我们看看使用 inxi -B 会输出什么。

Battery:   ID-1: BAT0 charge: 50.0 Wh (100.0%) condition: 50.0/50.0

获取 CPU 信息

-C 参数用于获取有关 CPU 的详细信息。比如包括 CPU 缓存大小、频率(单位 MHz,如果有多核,会显示每个核心的频率)、核心数、CPU 型号以及 CPU 是 32 位还是 64 位。

inxi -C

Detailed CPU information displayed by inxi

注意,如果是在虚拟机中使用 inix -Cinxi 读取到的 CPU 的最大和最小频率可能异常。下面是一个在四核 Debian 11 虚拟机中使用 -C 参数的示例输出。

An example output of using the “-C” flag in a Virtual Machine

获取更多的系统信息

使用 -F 参数可以获取更详细的系统信息(类似 -b 参数,但会更为详细)。几乎囊括了所有层次的系统信息。

inxi -F

获取图形显示相关信息

-G 参数可以获取和图形相关的信息。

它会显示所有的图形设备(GPU)、正在使用的 GPU 驱动(有助于检查是否使用 Nvidia 驱动还是 nouveau 驱动)、显示输出分辨率和驱动程序版本。

inxi -G

获取运行进程信息

-I 参数(大写字母 i)显示正在运行的进程、当前 shell 、内存(内存使用情况)以及 inxi 版本号等信息。

inxi get running process info

获取内存信息

可能你已经猜到了,-m 参数可以获取与内存相关的信息。

它读取了如总可用内存、最大内存容量(硬件或 CPU 支持的)、主板物理内存插槽数、是否存在 ECC、插入的内存插槽,以及枚举每个插槽中运行的内存模块的大小和运行速度等信息。

inxi -m

要使用 -m 参数获取更详细的信息,例如最大容量、每个插槽的内存模块信息等,需要超级用户权限。

sudo inxi -m

如果只是希望简短的输出内存信息,可以使用 -memory-short 参数。

使用 -memroy-short 参数将会只显示总内存以及当前已使用的内存量。

查看正在使用的包存储库

当使用 -r 参数时,会列举当前正在使用的包管理仓库或者更新本地仓库缓存中的所有存储库列表。

List of repositories in use

获取 RAID 设备信息

-R 参数用于获取所有 RAID 设备相关信息。

令人惊喜的是,它甚至显示了有关 ZFS RAID(默认情况下,多数 Linux 系统不包含该文件系统)的信息。它显示了 RAID 设备上文件系统的详细信息、状态(包含离线状态、总大小和可用大小等)。

inxi -R

在 Linux 终端中查询天气(对,这是可以的)

利用 -W 参数,你可以查询地球上任何地方的天气情况。

-W 参数后面,需要携带以下中的任一一个体现位置的信息

  • 邮政编码
  • 纬度
  • 城市(及州)、国家(不能含有空格,使用 “+” 替换空格)
inxi -W Baroda,India

Use of the “-W” flag with inxi followed by the city,country location descriptor

监控系统资源使用情况

inxi 除了提供有关已安装的硬件和驱动的信息外,还可以用于资源监控。

使用 -t 参数可以显示进程信息。你还可以可选项 -c (用于 CPU)和 -m(用于内存)。这些选项结合使用可以按指定数量列出进程信息。

下面是一些使用 -t 参数监控资源信息的示例。

inxi -t

命令 inxi -t 默认效果等同于 inxi -t cm5 的效果。

No difference in output of “inti -t” and “inxi -t cm5”

inxi -t cm10

偶尔需要监控资源使用情况时,该工具挺管用。如果需要更多的资源监控功能,则推荐使用 专用系统资源监控工具

总结

对于需要诊断计算机问题以及获取那些并不熟悉的软硬件信息的人来说,inxi 工具是十分便利且有用的。它能识别那些消耗 CPU、内存的进程;可以检查是否安装了合适的图形驱动程序、主板 UEFI/BIOS 是否需要更新等等。

事实上,在 inxi 开源社区论坛上,我们要求那些寻求帮助的成员提供 inxi 命令输出内容以便判断他们当前正在使用什么样的系统环境。

我知道也有其他的工具可以读取 Linux 上的硬件信息,不过 inxi 同时能读取硬件和软件信息,这也是我喜欢它的地方所在。

你使用 inxi 或者其他工具么?欢迎在评论区留言分享交流。


via: https://itsfoss.com/inxi-system-info-linux/

作者:Pratham Patel 选题:lujun9972 译者:jrglinux 校对:wxy

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

如果你拍摄的照片值得处理,那么你可以看看 Darktable 为你提供了什么。

 title=

很难说好照片是如何产生的。你必须在正确的时间出现在正确的地点。你必须准备好相机和构图的观察力。而这只是发生在相机里的部分。好的摄影还有另一个阶段,许多人都没有想到这一点。它曾经需要在 暗房 中的灯光和化学品,但在今天的数字工具中,后期制作发生在暗房软件中。最好的照片处理器之一是 Darktable,我在 2016 年写了一篇 介绍 Darktable 的文章。那篇文章已经过去五年了,所以我想我应该重新审视一下这个应用,写一写它的一个高级功能:蒙版。

自从我最初写下这篇文章以来,Darktable 并没有什么变化,在我看来,这是一个真正好的应用的标志之一。一个稳定的界面和持续的优秀性能是人们对软件的所有要求,而 Darktable 依旧熟悉而强大。如果你是 Darktable 的新手,请阅读我的 介绍性文章,了解基础知识。

什么是蒙版?

在照片处理中,蒙版被用来限制你对图像的调整,使其只限于图像的一个区域。

直观地说, 蒙版 mask 是视觉艺术中的一种技术,用一种材料来遮挡另一种材料。如果你曾经在你的公寓或房子里画过一面墙,你可能使用过 遮蔽胶带(也叫油漆工胶带)来保护相邻的墙壁或造型不受杂乱笔触的影响。完成后,你剥去遮蔽胶带,你就有了漂亮的油漆直线。

模板 stencil 也是遮蔽的一种形式。

 title=

(Seth Kenlon, CC BY-SA 4.0

这是一种在摄影中使用了一个世纪的技术,因此,数字摄影工具有一个类似的技术也是合理的。

在 Darktable 中使用蒙版

在这个例子中,我使用了 Flickr 用户 bcnewdemocrats 的创作共用照片。这是一张很好的照片,因为它有迷人的主题(两个孩子在他们非常耐心的父亲脸上涂抹 Holi 粉)。因为它是关于印度的五彩节,所以它在整个过程中都有色彩飞溅。

 title=

(bcnewdemocrats, CC BY-SA 4.0

这是一张不需要改进的照片,但并不是所有的调整都需要剧烈变化才能产生显著效果。

色彩校正滤镜提供了一个特别明显的调整。在彩色摄影中,尤其是人物摄影中,一个常见的修正是添加 琥珀色(一种偏红的橙色)。人类肤色受益于琥珀色,因为我们把这种颜色与温暖和生命联系起来。

点击 “ 开启 On ” 按钮,激活 Darktable 窗口右侧的色彩校正调整面板。将中心点向上和向右拖动,给照片增加琥珀色。

 title=

(Seth Kenlon, CC BY-SA 4.0

这样做之后,整张照片就会浸透在琥珀色里。

 title=

(Seth Kenlon, CC BY-SA 4.0

在色彩校正面板的底部,点击 “ drawn & parametric mask 绘制和参数化蒙版 ” 按钮。

 title=

(Seth Kenlon, CC BY-SA 4.0

在显示出来的工具栏中,你有几种蒙版形状可以选择。有圆、椭圆、路径、画笔、梯度,还有一个编辑现有蒙版的选项。为了简单起见,选择圆形,然后点击你的对象的脸。

 title=

(Seth Kenlon, CC BY-SA 4.0

你的色彩校正滤镜立即被限制在你的圆形蒙版的区域内,给你的主要对象一个令人愉快的琥珀色调,同时避开背景。

 title=

(Seth Kenlon, CC BY-SA 4.0

你可以通过切换色彩校正滤镜的关闭和开启来看到区别。

复用蒙版

如果你想只对被摄者的脸部应用另一个滤镜,你不必为那个新的滤镜再创建一个蒙版。当你创建一个蒙版时,它会被添加到位于 Darktable 界面左边的 “ 蒙版管理器 mask manager ” 面板上。默认的名字是非常通用的,但你可以双击每个蒙版的名字来重命名它。

 title=

(Seth Kenlon, CC BY-SA 4.0

当你应用一个新的滤镜时,不是选择一个新的蒙版形状来创建,而是点击 “ 不使用蒙版 no mask used ” 下拉菜单来查看现有的蒙版列表,以及之前在同一个滤镜上一起使用过的自动分组的蒙版。选择你想用于新滤镜的蒙版或蒙版组。

 title=

(Seth Kenlon, CC BY-SA 4.0

更多蒙版

在 Darktable 中还有很多其他类型的蒙版和蒙版功能可以探索。你可以用路径和画笔工具创建复杂的形状。你也可以完全放弃使用形状,并根据色度和亮度值将过滤器限制在图像的某个区域。你可以调整蒙版的模糊度和扩散度等。在 Darktable 中进行的所有调整中,最好的一点是它们都是动态的、非破坏性的。如果你改变主意,你可以随时关闭它们,而且你实际上从未影响过图像数据本身。这并不奇怪,因为 Darktable 确实是一个强大的摄影工具,如果你拍摄的照片值得处理,你就应该看看 Darktable 为你提供了什么。


via: https://opensource.com/article/21/12/open-source-photo-processing-darktable

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

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

Python 中的 Beautiful Soup 库可以很方便的从网页中提取 HTML 内容。

 title=

今天我们将讨论如何使用 Beautiful Soup 库从 HTML 页面中提取内容,之后,我们将使用它将其转换为 Python 列表或字典。

什么是 Web 刮取,为什么我需要它?

答案很简单:并非每个网站都有获取内容的 API。你可能想从你最喜欢的烹饪网站上获取食谱,或者从旅游博客上获取照片。如果没有 API,提取 HTML(或者说 刮取 scraping 可能是获取内容的唯一方法。我将向你展示如何使用 Python 来获取。

并非所以网站都喜欢被刮取,有些网站可能会明确禁止。请于网站所有者确认是否同意刮取。

Python 如何刮取网站?

使用 Python 进行刮取,我们将执行三个基本步骤:

  1. 使用 requests 库获取 HTML 内容
  2. 分析 HTML 结构并识别包含我们需要内容的标签
  3. 使用 Beautiful Soup 提取标签并将数据放入 Python 列表中

安装库

首先安装我们需要的库。requests 库从网站获取 HTML 内容,Beautiful Soup 解析 HTML 并将其转换为 Python 对象。在 Python3 中安装它们,运行:

pip3 install requests beautifulsoup4

提取 HTML

在本例中,我将选择刮取网站的 Techhology 部分。如果你跳转到此页面,你会看到带有标题、摘录和发布日期的文章列表。我们的目标是创建一个包含这些信息的文章列表。

网站页面的完整 URL 是:

https://notes.ayushsharma.in/technology

我们可以使用 requests 从这个页面获取 HTML 内容:

#!/usr/bin/python3
import requests

url = 'https://notes.ayushsharma.in/technology'

data = requests.get(url)

print(data.text)

变量 data 将包含页面的 HTML 源代码。

从 HTML 中提取内容

为了从 data 中提取数据,我们需要确定哪些标签具有我们需要的内容。

如果你浏览 HTML,你会发现靠近顶部的这一段:

<div class="col">
  <a href="/2021/08/using-variables-in-jekyll-to-define-custom-content" class="post-card">
    <div class="card">
      <div class="card-body">
        <h5 class="card-title">Using variables in Jekyll to define custom content</h5>
        <small class="card-text text-muted">I recently discovered that Jekyll's config.yml can be used to define custom
          variables for reusing content. I feel like I've been living under a rock all this time. But to err over and
          over again is human.</small>
      </div>
      <div class="card-footer text-end">
        <small class="text-muted">Aug 2021</small>
      </div>
    </div>
  </a>
</div>

这是每篇文章在整个页面中重复的部分。我们可以看到 .card-title 包含文章标题,.card-text 包含摘录,.card-footer > small 包含发布日期。

让我们使用 Beautiful Soup 提取这些内容。

#!/usr/bin/python3
import requests
from bs4 import BeautifulSoup
from pprint import pprint

url = 'https://notes.ayushsharma.in/technology'
data = requests.get(url)

my_data = []

html = BeautifulSoup(data.text, 'html.parser')
articles = html.select('a.post-card')

for article in articles:

    title = article.select('.card-title')[0].get_text()
    excerpt = article.select('.card-text')[0].get_text()
    pub_date = article.select('.card-footer small')[0].get_text()

    my_data.append({"title": title, "excerpt": excerpt, "pub_date": pub_date})

pprint(my_data)

以上代码提取文章信息并将它们放入 my_data 变量中。我使用了 pprint 来美化输出,但你可以在代码中忽略它。将上面的代码保存在一个名为 fetch.py 的文件中,然后运行它:

python3 fetch.py

如果一切顺利,你应该会看到:

[{'excerpt': "I recently discovered that Jekyll's config.yml can be used to"
"define custom variables for reusing content. I feel like I've"
'been living under a rock all this time. But to err over and over'
'again is human.',
'pub_date': 'Aug 2021',
'title': 'Using variables in Jekyll to define custom content'},
{'excerpt': "In this article, I'll highlight some ideas for Jekyll"
'collections, blog category pages, responsive web-design, and'
'netlify.toml to make static website maintenance a breeze.',
'pub_date': 'Jul 2021',
'title': 'The evolution of ayushsharma.in: Jekyll, Bootstrap, Netlify,'
'static websites, and responsive design.'},
{'excerpt': "These are the top 5 lessons I've learned after 5 years of"
'Terraform-ing.',
'pub_date': 'Jul 2021',
'title': '5 key best practices for sane and usable Terraform setups'},

... (truncated)

以上是全部内容!在这 22 行代码中,我们用 Python 构建了一个网络刮取器,你可以在 我的示例仓库中找到源代码

总结

对于 Python 列表中的网站内容,我们现在可以用它做一些很酷的事情。我们可以将它作为 JSON 返回给另一个应用程序,或者使用自定义样式将其转换为 HTML。随意复制粘贴以上代码并在你最喜欢的网站上进行试验。

玩的开心,继续编码吧。

本文最初发表在作者个人博客上,经授权改编。


via: https://opensource.com/article/21/9/web-scraping-python-beautiful-soup

作者:Ayush Sharma 选题:lujun9972 译者:MjSeven 校对:wxy

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

在本期的《Linux 黑话解释》系列文章中,你将了解到 Linux 中的 定时任务 cron job 功能。你将通过学习编辑 crontab 文件来创建定时任务。

何为定时任务

cron 是一个用于按计划运行短小且快速的命令的实用命令行工具。该工具是一个方便、经典的系统管理工具,通过和其他工具结合使用可以自动运行各式各样的任务。比如,有些人通过把 rsynccron 结合使用,在特定的时间自动创建每日备份和每周备份。也有些人使用 cron 来分析服务器日志,并且结合邮件系统功能,在日志检测到错误时自动发送告警邮件。

cron 就如同“瑞士军刀”一样,可以多场景多样化使用。尽可能发挥你的想象,去挖掘它的功能。

其实 cron 的使用很容易上手,只需要几秒钟。不过在我们开始上手之前,先来讨论下几个经常容易混淆的概念。

cron、定时任务、crontab

有三个术语比较容易混淆:cron、定时任务和 crontab,让我们来看看它们的含义:

术语含义
cron这是安装在系统上的实际执行定时任务的 守护进程
定时任务“任务”是指一段启动并运行的程序。cron 可以按照约定的时间计划运行各种任务,这样的任务通常叫做“定时任务”。
crontab这是一个文件,用于定义定时任务。一个 crontab 文件可以通过表格形式(每一行就是一个定时任务)定义多个定时任务。

来看一个简单例子:创建一个定时任务,每小时向 crontabl_log.txt 文件打印 Linux is cool!

0 * * * *  echo "Linux is Cool!" >> ~/crontab_log.txt

是不是这么个简单定时任务的例子都让你感到惊恐,这是因为你需要懂得如何去读懂一个定时任务的属性。

我将在后文中讲述这个基础理论知识。

上手 cron

我们通过另一个例子来看看 cron 如何工作。

为了创建定时任务(或者说 cron 将要执行的命令任务),你只需要运行:

crontab -e

这将会打开一个文件,用于编辑定时任务:

Crontab default view

其中,所有以 # 开头的行都是注释,用于指导你如何使用 cron,如果觉得没用可以删除它们。

我们将创建如下任务,作为我们的第一个定时任务:

* * * * * touch ~/crontab_test

让我快速看看该任务将会做什么:

定时任务都是以 “分钟 小时 天 月 周 命令” 形式呈现:

  • 分钟:指该任务在哪一分钟会被执行。所以,该值为 0 则代表在每个小时开始时运行,5 则代表在每个小时的第 5 分钟会运行。
  • 小时:指该任务在一天中的哪个小时会被执行,取值范围为 0-23。没有 24 的原因是 23 时的末尾是半夜 11:59,然后就是每天的开始 0 时。分钟的取值范围定义逻辑与之类似。
  • 天:指一个月中的哪一天执行该任务,取值范围是 1-31(不同于前面的分钟和小时从 0 开始取值)。
  • 月:指该任务在哪个月被执行,取值范围是 1-12
  • 周:指该任务在星期几被执行,从周日开始算起,取值范围是 0-6(分别对应周日、周一到周六)。
  • 命令:是你想要运行的命令任务。

如果想对 “分钟 小时 天 月 周” 部分有更详细的理解,可以参考 Crontab guru 网站,该网站可以帮助你理解正在执行什么。

接着之前的例子 * * * * * touch ~/crontab_test,表示每分钟创建一次 ~/crontab_test 文件。

让我们将该任务编辑进 crontab 然后看看执行结果:

等到下一分钟,你就会发现你的家目录下多了文件 crontab_test:

这便是 cron 的基础应用示例。

一个实用的定时任务示例

假设你想创建一个脚本,用于拷贝多个目录内容到一个路径并打包作为备份,该如何实现?

通过 cron 定时任务就可以很容易实现该功能。

请看如下脚本:

#!/usr/bin/bash
echo "Backing up..."
mkdir -p ~/.local/tmp/
tar -Pc ~/Documents/ -f ~/.local/tmp/backup.gz

该脚本做了如下事情:

  1. 确保备份路径目录 ~/.local/tmp/ 存在。
  2. 将目录 ~/Documents/ 下的所有内容打包至文件 ~/.local/tmp/backup.gz

我们先来手动运行该脚本,看看它到底如何工作。

首先,我们在家目录(~)下创建该脚本,命令为 backup_script,如下图所示:

然后编辑 backup_script 脚本,写入上面那个脚本代码。

接着,赋予 backup_script 可执行权限:

最后运行脚本 ~/backup_script,进行功能验证:

你可以通过运行命令 tar -xf ~/.local/tmp/backup.gz -C <output_dir> 来进行备份恢复,这里 <output_dir> 是指文件要恢复到的路径目录。

接下来,就可以用 cron 工具来进行定时任务运行该脚本了。

举个例子,假设需要每天的凌晨 3 点运行该备份脚本,你可以在 crontab 中输入如下命令:

* 3 * * * ~/backup_script

这样你就可以每天自动进行备份操作了。

后记

本文简单介绍了定时任务功能。尽管我不确定 Linux 桌面用户使用该功能多不多,但我知道定时任务功能被许多系统管理员广泛应用。如果你有什么想法,欢迎在评论区留言。


via: https://itsfoss.com/cron-job/

作者:Hunter Wittenborn 选题:lujun9972 译者:jrglinux 校对:wxy

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

GnuPG,俗称 GPG,是一个非常通用的工具,被广泛用作电子邮件、信息、文件或任何你需要安全地发送给别人的东西的加密行业标准。

学习使用 GPG 很容易,你可以在几分钟内就学会使用它。

在本教程中,我将告诉你如何用 GPG 加密和解密文件。这是一个简单的教程,你可以在你的 Linux 系统上尝试所有的练习。这将帮助你练习 GPG 命令,并在你完全陌生的情况下理解它。

请先阅读整个教程,然后开始自己做。

GPG 是如何进行加密的?

GPG 加密

要使用 GPG,你首先需要有一个 GPG 密钥。

GPG 密钥是你在后面的教程中用来加密(或解密)文件的东西。它也是用来识别你的身份的,你的名字和电子邮件也会与密钥绑定。

GPG 密钥的工作原理是使用两个文件,一个私钥和一个公钥。这两个密钥是相互联系的,并且 GPG 的所有功能都需要使用它们,特别是对文件加密和解密。

当你用 GPG 加密一个文件时,它使用的是私钥。然后,这个新的加密文件只能用配对的公钥进行解密。

私钥,顾名思义,是以私下的、不给任何人看的方式来存储的密钥。

另一方面,公钥是用来给其他人的,或者你希望能够解密你的文件的任何人。

这就是 GPG 的加密方法的主要作用。它允许你对文件进行本地加密,然后允许其他人确保他们收到的文件实际上是由你发送的。因为他们能够解密文件的唯一方法是使用你的公钥,而这只有在文件首先使用你的私钥加密的情况下才有效。

反之,其他人可以用你的公钥对文件进行加密,而唯一能够解密的方法是用你的私钥。因此,允许其他人公开发布文件,而不用担心除了你以外的人能够阅读它们。(LCTT 译注:另外一个常见的用例是你用你的私钥对公开发布的文件进行签名,别人使用你的公钥通过验证你的签名而确信文件是你发布的、并没有被篡改。但本文没有涉及这个用例。)

换句话说,如果一个文件是用私钥加密的,它只能用相应的公钥解密。而如果一个文件是用公钥加密的,它只能用相应的私钥解密。

你已经在使用 GPG 而没有意识到

一个最常见的使用 GPG 的例子是在 Linux 软件包管理器中,特别是 外部仓库。你把开发者的公钥添加到你系统的可信密钥中。开发者用他/她的私钥签署软件包(生成签名)。由于你的 Linux 系统拥有该公钥文件,它就能理解该软件包实际上是来自受信任的开发者。

许多加密服务在你没有意识到的情况下使用了某种 GPG 的实现。但现在最好不要去研究这些细节。

现在你对这个概念有点熟悉了,让我们看看如何使用 GPG 来加密一个文件,然后用它来解密。

用 GPG 对文件进行加密和解密

这是一个非常简单的场景。我假定你只有一个系统,你想看看 GPG 是如何工作的。你并没有把文件发送到其他系统。你对文件进行加密,然后在同一个系统上解密。

当然,这不是一个实际的用例,但这也不是本教程的目的。我的目的是让你熟悉 GPG 命令和功能。之后,你可以在现实世界中使用这些知识(如果需要的话)。为此,我将告诉你如何与他人分享你的公钥。

第一步:安装 GPG

GPG 可以在大多数发行版的软件库中找到,开箱即用。

在基于 Debian 和 Ubuntu 的系统中,安装 gpg 包:

sudo apt install gpg

如果你使用 基于 Arch 的发行版,用 pacman 命令 安装 gnupg 软件包:

sudo pacman -S gnupg

第二步:生成一个 GPG 密钥

在你的系统上生成一个 GPG 密钥只需要一条简单的命令。

只要运行下面的命令,就会生成你的密钥(你可以对大多数问题使用默认值,如下面的下划线部分所示)。

gpg --full-generate-key

生成 GPG 密钥

检查 GPG 密钥

然后你可以通过使用 --list-secret-keys--list-public-keys 参数,分别看到私钥和公钥都是通过 pub 下显示的那个 ID 相互绑定的。

列出 GPG 密钥

第三步:用 GPG 加密一个文件

现在你已经设置了 GPG 密钥,你可以开始对我们的文件进行加密了。

使用下面的命令来加密文件:

gpg --encrypt --output file.gpg --recipient [email protected] file

让我们快速浏览一下该命令的内容:

首先,你指定了 —encrypt 选项。这告诉 GPG,我们将对一个文件进行加密。

接下来,你指定了 --output file.gpg。这可以是任何名字,不过惯例是给你要加密的文件的名称加上 .gpg 扩展名(所以 message.txt 会变成 message.txt.gpg)。

接下来,你输入 —recipient [email protected]。这指定了一个相应的 GPG 密钥的电子邮件,这个密钥实际上在这个系统上还不存在。

有点迷惑?

工作原理是,你在这里指定的电子邮件必须与你本地系统中的公钥相联系。

通常情况下,这将是来自另外一个人的 GPG 公钥,你要用它来加密你的文件。之后,该文件将只能用该用户的私钥进行解密。

在这个例子中,我将使用我以前的与 [email protected] 关联的 GPG 密钥。因此,其逻辑是,我用 [email protected]公钥 对文件进行加密,然后只能用 [email protected]私钥 进行解密。

如果你是为别人加密文件,你只有该公钥,但由于你是为自己加密文件,你的系统上有这两个密钥。

最后,你只需指定你要加密的文件。在这个例子中,让我们使用一个名为 message.txt 的文件,内容如下:

We're encrypting with GPG!

文本文件样本

同样地,如果电子邮件是 [email protected],新的 GPG 命令将如下所示:

gpg --encrypt --output message.txt.gpg --recipient [email protected] message.txt

用 GPG 加密文件

如果你尝试阅读该文件,你会看到它看起来像乱码。这是预料之中的,因为该文件现在已经被加密了。

读取加密文件会产生乱码

现在让我们删除未加密的 message.txt 文件,这样你就可以看到 message.txt.gpg 文件实际上在没有原始文件的情况下也能正常解密。

第四步:用 GPG 解密加密的文件

最后,让我们来实际解密加密的信息。你可以用下面的命令来做。

gpg --decrypt --output file file.gpg

通过这里的参数,我们首先指定 —decrypt,它告诉 GPG 你将会解密一个文件。

接下来,你输入 —output 文件,这只是告诉 GPG,在你解密后,你将把我们文件的解密形式保存到哪个文件。

最后,你输入 file.gpg,这是你的加密文件的路径。

按照这个例子,我使用的命令是这样的。

gpg --decrypt --output message.txt message.txt.gpg

用GPG解密文件

然后就完成了!当你想用 GPG 加密和解密文件时,这就是全部内容了。

剩下你可能想知道的是如何与他人分享你的公钥,以便他们在将文件发送给你之前对其进行加密。

发送和接收 GPG 密钥

要给别人发送一个 GPG 密钥,你首先需要从你的钥匙链中导出它,它包含了你所有的公钥和私钥。

要导出一个密钥,只需在你的钥匙链中找到密钥的 ID,然后运行以下命令,用密钥的 ID 替换 id,用你想保存的文件名替换 key.gpg

gpg --output key.gpg --export id

导出 GPG 公钥

要导入一个密钥,只需把输出文件(来自前面的命令)给其他用户,然后让他们运行下面的命令。

gpg --import key.gpg

但要正常使用该密钥,你需要验证该密钥,以便 GPG 正确地信任它。

这可以通过在其他用户的系统上使用 --edit-key 参数来完成,然后对密钥进行签名。

首先运行 gpg --edit-key id

GPG 编辑密钥

接下来,使用 —fpr 参数,它将显示密钥的指纹。这个命令的输出应该与你自己机器上的输出进行验证,这可以通过在你的系统上运行同样的 --edit-key 参数来找到。

GPG 密钥的指纹

如果一切吻合,只需使用 —sign 参数,一切就可以开始了。

签署 GPG 密钥

就是这样!其他用户现在可以开始用你的公钥加密文件了,就像你之前做的那样,这可以确保它们只有在你用你的私钥解密时才能被你读取。

这就是使用 GPG 的所有基础知识!

总结

现在你已经了解了开始使用 GPG 所需要的一切,包括为自己和他人加密文件。正如我前面提到的,这只是为了了解 GPG 的加密和解密过程是如何工作的。你刚刚获得的基本 GPG 知识在应用于真实世界的场景中时可以更上一层楼。

还需要一些帮助来弄清楚一些东西,或者有一些不工作的东西?欢迎在下面的评论中留下任何内容。


via: https://itsfoss.com/gpg-encrypt-files-basic/

作者:Hunter Wittenborn 选题:lujun9972 译者:wxy 校对:wxy

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

LVM 为你配置存储的方式提供了极大的灵活性。

 title=

逻辑卷管理器 Logical Volume Manager (LVM)允许在操作系统和硬件之间建立一个抽象层。通常,你的操作系统会查找磁盘(/dev/sda/dev/sdb 等)和这些磁盘中的分区(/dev/sda1/dev/sdb1 等)。

LVM 在操作系统和磁盘之间创建了一个虚拟层。LVM 不是一个驱动器持有一定数量的分区,而是创建一个统一的存储池(称为 卷组 Volume Group ),跨越任意数量的物理驱动器(称为 物理卷 Physical Volume )。使用卷组中可用的存储,LVM 可以为你的操作系统提供类似磁盘和分区的功能。

操作系统完全没有意识到它被“欺骗”了。

 title=

由于 LVM 虚拟地创建卷组和逻辑卷,因此即使在系统运行时,也可以轻松调整它们的大小或移动它们,或者创建新卷。此外,LVM 提供了其它情况下不存在的特性,比如创建逻辑卷的活动快照时无需首先卸载磁盘。

LVM 中的卷组是一个命名的虚拟容器,将底层物理磁盘组合在一起。它充当一个池,可以从中创建不同大小的 逻辑卷 Logical Volume 。逻辑卷包含实际的文件系统并且可以跨越多个磁盘,并且不需要物理上连续。

特性

  • 分区名称通常具有系统名称,例如 /dev/sda1。LVM 具有便于人们理解的名称,例如 home 或者 media
  • 分区的总大小受底层物理磁盘大小的限制。在 LVM 中,卷可以跨越多个磁盘,并且仅受 LVM 中所有物理磁盘总大小的限制。
  • 分区通常只有在磁盘未使用且已卸载时才能调整大小、移动或删除。LVM 卷可以在系统运行时进行操作。
  • 只能通过分配与分区相邻的可用空间来扩展分区。LVM 卷可以从任何地方占用可用空间。
  • 扩展分区涉及移动数据以腾出可用空间,这非常耗时,并且可能会在断电期间导致数据丢失。LVM 卷可以从卷组中的任何地方占用可用空间,甚至可以在另一块磁盘上。
  • 因为在 LVM 中创建卷非常容易,所以它鼓励创建不同的卷,例如创建单独的卷来测试功能或尝试不同的操作系统。对于分区,此过程将非常耗时并且容易出错。
  • 快照只能在 LVM 中创建。它允许你创建当前逻辑卷的时间点镜像,即使在系统运行时也可以。这非常适合备份。

测试设置

作为演示,假设你的系统具有以下驱动器配置:

NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
`-xvda1 202:1    0   8G  0 part /
xvdb    202:16   0   1G  0 disk
xvdc    202:32   0   1G  0 disk
xvdd    202:48   0   2G  0 disk
xvde    202:64   0   5G  0 disk
xvdf    202:80   0   8G  0 disk

步骤 1. 初始化磁盘以用于 LVM

运行 pvcreate /dev/xvdb /dev/xvdc /dev/xvdd /dev/xvde /dev/xvdf。输出应如下:

Physical volume "/dev/xvdb" successfully created
Physical volume "/dev/xvdc" successfully created
Physical volume "/dev/xvdd" successfully created
Physical volume "/dev/xvde" successfully created
Physical volume "/dev/xvdf" successfully created

使用 pvs 或者 pvdisplay 查看结果:

"/dev/xvde" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/xvde
VG Name
PV Size               5.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               728JtI-ffZD-h2dZ-JKnV-8IOf-YKdS-8srJtn

"/dev/xvdb" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/xvdb
VG Name
PV Size               1.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               zk1phS-7uXc-PjBP-5Pv9-dtAV-zKe6-8OCRkZ

"/dev/xvdd" is a new physical volume of "2.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/xvdd
VG Name
PV Size               2.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               R0I139-Ipca-KFra-2IZX-o9xJ-IW49-T22fPc

"/dev/xvdc" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/xvdc
VG Name
PV Size               1.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               FDzcVS-sq22-2b13-cYRj-dXHf-QLjS-22Meae

"/dev/xvdf" is a new physical volume of "8.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/xvdf
VG Name
PV Size               8.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               TRVSH9-Bo5D-JHHb-g0NX-8IoS-GG6T-YV4d0p

步骤 2. 创建卷组

运行 vgcreate myvg /dev/xvdb /dev/xvdc /dev/xvdd /dev/xvde /dev/xvdf。通过 vgs 或者 vgdisplay 查看结果:

--- Volume group ---
VG Name               myvg
System ID
Format                lvm2
Metadata Areas        5
Metadata Sequence No  1
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                0
Open LV               0
Max PV                0
Cur PV                5
Act PV                5
VG Size               16.98 GiB
PE Size               4.00 MiB
Total PE              4347
Alloc PE / Size       0 / 0
Free  PE / Size       4347 / 16.98 GiB
VG UUID               ewrrWp-Tonj-LeFa-4Ogi-BIJJ-vztN-yrepkh

步骤 3: 创建逻辑卷

运行以下命令:

lvcreate myvg --name media --size 4G
lvcreate myvg --name home --size 4G

使用 lvs 或者 lvdisplay 验证结果:

--- Logical volume ---
LV Path                /dev/myvg/media
LV Name                media
VG Name                myvg
LV UUID                LOBga3-pUNX-ZnxM-GliZ-mABH-xsdF-3VBXFT
LV Write Access        read/write
LV Creation host, time ip-10-0-5-236, 2017-02-03 05:29:15 +0000
LV Status              available
# open                 0
LV Size                4.00 GiB
Current LE             1024
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           252:0

--- Logical volume ---
LV Path                /dev/myvg/home
LV Name                home
VG Name                myvg
LV UUID                Hc06sl-vtss-DuS0-jfqj-oNce-qKf6-e5qHhK
LV Write Access        read/write
LV Creation host, time ip-10-0-5-236, 2017-02-03 05:29:40 +0000
LV Status              available
# open                 0
LV Size                4.00 GiB
Current LE             1024
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           252:1

步骤 4: 创建文件系统

使用以下命令创建文件系统:

vgcreate myvg /dev/xvdb /dev/xvdc /dev/xvdd /dev/xvde /dev/xvdf
mkfs.ext3 /dev/myvg/media
mkfs.ext3 /dev/myvg/home

挂载它:

mount /dev/myvg/media /media
mount /dev/myvg/home /home

使用 lsblk 命令查看完整配置:

NAME         MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda         202:0    0   8G  0 disk
`-xvda1      202:1    0   8G  0 part /
xvdb         202:16   0   1G  0 disk
xvdc         202:32   0   1G  0 disk
xvdd         202:48   0   2G  0 disk
xvde         202:64   0   5G  0 disk
`-myvg-media 252:0    0   4G  0 lvm  /media
xvdf         202:80   0   8G  0 disk
`-myvg-home  252:1    0   4G  0 lvm  /home

步骤 5: 扩展 LVM

添加一块新的 /dev/xvdg 磁盘。要扩展 home 卷,运行以下命令:

pvcreate /dev/xvdg
vgextend myvg /dev/xvdg
lvextend -l 100%FREE /dev/myvg/home
resize2fs /dev/myvg/home

运行 df -h,你应该可以看到新的磁盘大小。

就是这样!

LVM 为你配置存储的方式提供了极大的灵活性。尝试一下,并享受 LVM 的乐趣!

本文首发于 作者个人博客,经授权改编。


via: https://opensource.com/article/21/9/add-storage-lvm

作者:Ayush Sharma 选题:lujun9972 译者:perfiffer 校对:wxy

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