分类 技术 下的文章

 title=")

管理磁盘空间对系统管理员来说是一件重要的日常工作。一旦磁盘空间耗尽就需要进行一系列耗时而又复杂的任务,以提升磁盘分区中可用的磁盘空间。它也需要系统离线才能处理。通常这种任务会涉及到安装一个新的硬盘、引导至恢复模式或者单用户模式、在新硬盘上创建一个分区和一个文件系统、挂载到临时挂载点去从一个太小的文件系统中移动数据到较大的新位置、修改 /etc/fstab 文件的内容来反映出新分区的正确设备名、以及重新引导来重新挂载新的文件系统到正确的挂载点。

我想告诉你的是,当 LVM (逻辑卷管理)首次出现在 Fedora Linux 中时,我是非常抗拒它的。我最初的反应是,我并不需要在我和我的设备之间有这种额外的抽象层。结果是我错了,逻辑卷管理是非常有用的。

LVM 让磁盘空间管理非常灵活。它提供的功能诸如在文件系统已挂载和活动时,很可靠地增加磁盘空间到一个逻辑卷和它的文件系统中,并且,它也允许你将多个物理磁盘和分区融合进一个可以分割成逻辑卷(LV)的单个卷组(VG)中。

卷管理也允许你去减少分配给一个逻辑卷的磁盘空间数量,但是,这里有两个要求,第一,卷必须是未挂载的。第二,在卷空间调整之前,文件系统本身的空间大小必须先被减少。

有一个重要的提示是,文件系统本身必须允许重新调整大小的操作。当重新提升文件系统大小的时候,EXT2、3 和 4 文件系统都允许离线(未挂载状态)或者在线(挂载状态)重新调整大小。你应该去认真了解你打算去调整的文件系统的详细情况,去验证它们是否可以完全调整大小,尤其是否可以在线调整大小。

即时扩展一个文件系统

在我安装一个新的发行版到我的生产用机器中之前,我总是喜欢在一个 VirtualBox 虚拟机中运行这个新的发行版一段时间,以确保它没有任何的致命的问题存在。在几年前的一个早晨,我在我的主要使用的工作站上的虚拟机中安装了一个新发行的 Fedora 版本。我认为我有足够的磁盘空间分配给安装虚拟机的主文件系统。但是,我错了,大约在安装到三分之一时,我耗尽了我的文件系统的空间。幸运的是,VirtualBox 检测到了磁盘空间不足的状态,并且暂停了虚拟机,然后显示了一个明确指出问题所在的错误信息。

请注意,这个问题并不是虚拟机磁盘太小造成的,而是由于宿主机上空间不足,导致虚拟机上的虚拟磁盘在宿主机上的逻辑卷中没有足够的空间去扩展。

因为许多现在的发行版都缺省使用了逻辑卷管理,并且在我的卷组中有一些可用的空余空间,我可以分配额外的磁盘空间到适当的逻辑卷,然后即时扩展宿主机的文件系统。这意味着我不需要去重新格式化整个硬盘,以及重新安装操作系统或者甚至是重启机器。我不过是分配了一些可用空间到适当的逻辑卷中,并且重新调整了文件系统的大小 —— 所有的这些操作都在文件系统在线并且运行着程序的状态下进行的,虚拟机也一直使用着宿主机文件系统。在调整完逻辑卷和文件系统的大小之后,我恢复了虚拟机的运行,并且继续进行安装过程,就像什么问题都没有发生过一样。

虽然这种问题你可能从来也没有遇到过,但是,许多人都遇到过重要程序在运行过程中发生磁盘空间不足的问题。而且,虽然许多程序,尤其是 Windows 程序,并不像 VirtualBox 一样写的很好,且富有弹性,Linux 逻辑卷管理可以使它在不丢失数据的情况下去恢复,也不需要去进行耗时的安装过程。

LVM 结构

逻辑卷管理的磁盘环境结构如下面的图 1 所示。逻辑卷管理允许多个单独的硬盘和/或磁盘分区组合成一个单个的卷组(VG)。卷组然后可以再划分为逻辑卷(LV)或者被用于分配成一个大的单一的卷。普通的文件系统,如 EXT3 或者 EXT4,可以创建在一个逻辑卷上。

在图 1 中,两个完整的物理硬盘和一个第三块硬盘的一个分区组合成一个单个的卷组。在这个卷组中创建了两个逻辑卷和文件系统,比如,可以在每个逻辑卷上创建一个 EXT3 或者 EXT4 的文件系统。

lvm.png

图 1: LVM 允许组合分区和整个硬盘到卷组中

在一个主机上增加磁盘空间是非常简单的,在我的经历中,这种事情是很少的。下面列出了基本的步骤。你也可以创建一个完整的新卷组或者增加新的空间到一个已存在的逻辑卷中,或者创建一个新的逻辑卷。

增加一个新的逻辑卷

有时候需要在主机上增加一个新的逻辑卷。例如,在被提示包含我的 VirtualBox 虚拟机的虚拟磁盘的 /home 文件系统被填满时,我决定去创建一个新的逻辑卷,以存储包含虚拟磁盘在内的虚拟机数据。这将在我的 /home 文件系统中释放大量的空间,并且也允许我去独立地管理虚拟机的磁盘空间。

增加一个新的逻辑卷的基本步骤如下:

  1. 如有需要,安装一个新硬盘。
  2. 可选: 在硬盘上创建一个分区。
  3. 在硬盘上创建一个完整的物理卷(PV)或者一个分区。
  4. 分配新的物理卷到一个已存在的卷组(VG)中,或者创建一个新的卷组。
  5. 从卷空间中创建一个新的逻辑卷(LV)。
  6. 在新的逻辑卷中创建一个文件系统。
  7. /etc/fstab 中增加适当的条目以挂载文件系统。
  8. 挂载文件系统。

为了更详细的介绍,接下来将使用一个示例作为一个实验去教授关于 Linux 文件系统的知识。

示例

这个示例展示了怎么用命令行去扩展一个已存在的卷组,并给它增加更多的空间,在那个空间上创建一个新的逻辑卷,然后在逻辑卷上创建一个文件系统。这个过程一直在运行着和已挂载的文件系统上执行。

警告:仅 EXT3 和 EXT4 文件系统可以在运行和挂载状态下调整大小。许多其它的文件系统,包括 BTRFS 和 ZFS 是不能这样做的。

安装硬盘

如果在系统中现有硬盘上的卷组中没有足够的空间可以增加,那么可能需要去增加一块新的硬盘,然后创建空间增加到逻辑卷中。首先,安装物理硬盘,然后,接着执行后面的步骤。

从硬盘上创建物理卷

首先需要去创建一个新的物理卷(PV)。使用下面的命令,它假设新硬盘已经分配为 /dev/hdd

pvcreate /dev/hdd

在新硬盘上创建一个任意分区并不是必需的。创建的物理卷将被逻辑卷管理器识别为一个新安装的未处理的磁盘或者一个类型为 83 的 Linux 分区。如果你想去使用整个硬盘,创建一个分区并没有什么特别的好处,而且元数据所用的磁盘空间也能用做 PV 的一部分使用。

扩展已存在的卷组

在这个示例中,我将扩展一个已存在的卷组,而不是创建一个新的;你可以选择其它的方式。在物理磁盘已经创建之后,扩展已存在的卷组(VG)去包含新 PV 的空间。在这个示例中,已存在的卷组命名为:MyVG01。

vgextend /dev/MyVG01 /dev/hdd
创建一个逻辑卷

首先,在卷组中从已存在的空余空间中创建逻辑卷。下面的命令创建了一个 50 GB 大小的 LV。这个卷组的名字为 MyVG01,然后,逻辑卷的名字为 Stuff。

lvcreate -L +50G --name Stuff MyVG01
创建文件系统

创建逻辑卷并不会创建文件系统。这个任务必须被单独执行。下面的命令在新创建的逻辑卷中创建了一个 EXT4 文件系统。

mkfs -t ext4 /dev/MyVG01/Stuff
增加一个文件系统卷标

增加一个文件系统卷标,更易于在文件系统以后出现问题时识别它。

e2label /dev/MyVG01/Stuff Stuff
挂载文件系统

在这个时候,你可以创建一个挂载点,并在 /etc/fstab 文件系统中添加合适的条目,以挂载文件系统。

你也可以去检查并校验创建的卷是否正确。你可以使用 dflvsvgs 命令去做这些工作。

在 LVM 文件系统中调整逻辑卷大小

从 Unix 的第一个版本开始,对文件系统的扩展需求就一直伴随,Linux 也不例外。随着有了逻辑卷管理(LVM),现在更加容易了。

  1. 如有需要,安装一个新硬盘。
  2. 可选: 在硬盘上创建一个分区。
  3. 在硬盘上创建一个完整的物理卷(PV)或者一个分区。
  4. 分配新的物理卷到一个已存在的卷组(VG)中,或者创建一个新的卷组。
  5. 从卷空间中创建一个新的逻辑卷(LV),或者用卷组中部分或全部空间扩展已有的逻辑卷。
  6. 如果创建了新的逻辑卷,那么在上面创建一个文件系统。如果对已有的逻辑卷增加空间,使用 resize2fs 命令来增大文件系统来填满逻辑卷。
  7. /etc/fstab 中增加适当的条目以挂载文件系统。
  8. 挂载文件系统。

示例

这个示例展示了怎么用命令行去扩展一个已存在的卷组。它会给 /Staff 文件系统增加大约 50GB 的空间。这将生成一个可用于挂载的文件系统,在 Linux 2.6 内核(及更高)上可即时使用 EXT3 和 EXT4 文件系统。我不推荐你用于任何关键系统,但是这是可行的,我已经成功了好多次;即使是在根(/)文件系统上。是否使用自己把握风险。

警告:仅 EXT3 和 EXT4 文件系统可以在运行和挂载状态下调整大小。许多其它的文件系统,包括 BTRFS 和 ZFS 是不能这样做的。

安装硬盘

如果在系统中现有硬盘上的卷组中没有足够的空间可以增加,那么可能需要去增加一块新的硬盘,然后创建空间增加到逻辑卷中。首先,安装物理硬盘,然后,接着执行后面的步骤。

从硬盘上创建物理卷

首先需要去创建一个新的物理卷(PV)。使用下面的命令,它假设新硬盘已经分配为 /dev/hdd

pvcreate /dev/hdd

在新硬盘上创建一个任意分区并不是必需的。创建的物理卷将被逻辑卷管理器识别为一个新安装的未处理的磁盘或者一个类型为 83 的 Linux 分区。如果你想去使用整个硬盘,创建一个分区并没有什么特别的好处,而且元数据所用的磁盘空间也能用做 PV 的一部分使用。

增加物理卷到已存在的卷组

在这个示例中,我将使用一个新的物理卷来扩展一个已存在的卷组。在物理卷已经创建之后,扩展已存在的卷组(VG)去包含新 PV 的空间。在这个示例中,已存在的卷组命名为:MyVG01。

vgextend /dev/MyVG01 /dev/hdd
扩展逻辑卷

首先,在卷组中从已存在的空余空间中创建逻辑卷。下面的命令创建了一个 50 GB 大小的 LV。这个卷组的名字为 MyVG01,然后,逻辑卷的名字为 Stuff。

lvcreate -L +50G --name Stuff MyVG01
扩展文件系统

如果你使用了 -r 选项,扩展逻辑卷也将扩展器文件系统。如果你不使用 -r 选项,该操作不行单独执行。下面的命令在新调整大小的逻辑卷中调整了文件系统大小。

resize2fs /dev/MyVG01/Stuff

你也可以去检查并校验调整大小的卷是否正确。你可以使用 dflvsvgs 命令去做这些工作。

提示

过去几年来,我学习了怎么去做让逻辑卷管理更加容易的一些知识,希望这些提示对你有价值。

  • 除非你有一个明确的原因去使用其它的文件系统外,推荐使用可扩展的文件系统。除了 EXT2、3、和 4 外,并不是所有的文件系统都支持调整大小。EXT 文件系统不但速度快,而且它很高效。在任何情况下,如果默认的参数不能满足你的需要,它们(指的是文件系统参数)可以通过一位知识丰富的系统管理员来调优它。
  • 使用有意义的卷和卷组名字。
  • 使用 EXT 文件系统标签

我知道,像我一样,大多数的系统管理员都抗拒逻辑卷管理。我希望这篇文章能够鼓励你至少去尝试一个 LVM。如果你能那样做,我很高兴;因为,自从我使用它之后,我的硬盘管理任务变得如此的简单。

关于作者

David Both 是一位 Linux 和开源软件的倡导者,住在 Raleigh, North Carolina。他在 IT 行业工作了 40 多年,在 IBM 工作了 20 多年。在 IBM 期间,他在 1981 年为最初的 IBM PC 编写了第一个培训课程。他曾教授红帽的 RHCE 课程,并在 MCI Worldcom、Cisco和 North Carolina 工作。他已经使用 Linux 和开源软件工作了将近 20 年。


via: https://opensource.com/business/16/9/linux-users-guide-lvm

作者:David Both 译者:qhwdw 校对:wxy

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

不久前,我们发布了一篇简短的指引描述了如何轻易地回忆起忘记的 Linux 命令 。那篇指引对于无法记住命令的人来说真的非常有用。今天,我们就来学习一下如何高效而又迅速地从 man 页中获取你所需要的信息。如你所知,一个标准的 man 页分成很多个部分,每部分都有一个独立的标题。当你想查看特定的标志/选项时,可能需要向下滚动很长时间才能找到。这是个效率低下而且很耗时间的过程。这也是为什么学会高效使用 man 页来精确定位你想要的内容。

在本文中,我会分享一些常用的跟 man 页相关的重要技巧。

学习高效地使用 Man 页

基础用法

我们都知道,我们可以使用类似下面的命令来打开关于某个命令(比如 mkdir)的 man 页:

man mkdir

可以使用 空格db 以及上下箭头等来浏览 man 页。要跳转道 man 页的末尾,可以按 End 键而想跳转到 man 页的头部则可以按 Home 键。在当前打开的 man 页中按下 h 键会显示所有有用的键盘快捷键和一般用法。(LCTT 译注:这些快捷键其实是 man 所使用的 less 分页器的快捷键)

q 可以退出 man 页。

回忆起忘记的命令

对于那些不知道想要哪个命令的家伙,可以去查看一下我第一段中提到的那个链接。使用 man 页我们也能做到这一点。假设说,你想要创建一个目录,而你忘记了使用哪个命令来创建目录。

为了回忆起那个忘记的命令,可以将 man 和 grep 命令联用:

man -k directory | grep create

输出结果为:

CURLOPT_NEW_DIRECTORY_PERMS (3) - permissions for remotely created directories
libssh2_sftp_mkdir_ex (3) - create a directory on the remote file system
mkdir (2) - create a directory
mkdirat (2) - create a directory
mkdtemp (3) - create a unique temporary directory
mkdtemp (3p) - create a unique directory or file
mkfontdir (1) - create an index of X font files in a directory
mklost+found (8) - create a lost+found directory on a mounted Linux second extended file。。。
mkstemp (3p) - create a unique directory
mktemp (1) - create a temporary file or directory
pam_mkhomedir (8) - PAM module to create users home directory

你只需要阅读一下每个命令的描述然后挑选出合适的命令就行了。啊,现在你记起来了。mkdir 正式你想要的,对吧?就是那么简单。

在 man 页中搜索

若你在 man 页中想要查找特定字符串。只需要输入 / (前斜线)再加上你想要搜索的字符串,像这样:

/<search_string> 或 <pattern>

假设你正在查看 mount 命令的 man 页,想要寻找关于 -bind 选项的相关信息。可以输入:

/bind

当前 man 页中任何匹配搜索字符串的内容都会被高亮显示。

按下 nSHIFT+n 来查看下一个/上一个匹配的地方。

/ 模式(或者说字符串)会向前搜索匹配行。你也可以使用 ? 模式进行向后搜索。这当你在 man 页的末尾或中间位置时非常有用。

?bind

若想只显示匹配行,输入:

&bind

使用这种方法,你无需使用 nSHIFT+n 来滚动到下一个/上一个匹配的位置。& 模式只会显示那些包含搜索内容的行,其他的内容全都被省略掉。

不打开 man 页而进行搜索

也可以在不打开 man 页的前提下搜索指定选项的信息。

比如,你想了解 mkdir 命令中的 -m 选项的相关信息。可以运行:

man mkdir | grep -e '-m'

或者,

man mkdir | grep -- '-m'

这个命令会显示出 mkdir 命令 man 页中第一次出现 -m 时的内容。从上面命令中我们可以看到 -m 表示的是 “MODE”(chmod)。

如果你想阅读 mkdir 命令的完整 man 页,但是要跳过第一次出现 -m 之前的内容,可以使用下面命令:

man mkdir | less +/-m

这是另一个例子:

man mount | less +/--bind

按下 nSHIFT+n 可以浏览下一个/上一个匹配的位置。

参考阅读:每个 Linux 用户都应该知道的 3 个 man 页替代品

将完整的 man 页导出到文本文件中

我们可以将指定命令的完整 man 页导出成文本文件。方法是运行下面命令:

man mount > mount.txt

该命令会将 mount 命令的 man 页导出到当前目录的 mount.txt 文件中。

也可以获取一个简化版的 man 页,没有退格和下划线,方法是使用下面命令。

man mount | col -b > mount.txt

要了解更多关于 man 页的详细信息,运行:

man man

该命令会显示出关于 man 的 man 页。这些技巧都很基础但很实用。它们会节省你很多的时间而且能免去很多的滚动操作。

今天的内容就到这了。希望对你有帮助。更多好文即将到来。准备好哦!

Cheers!

(题图:Pixabay, CC0)


via: https://www.ostechnix.com/learn-use-man-pages-efficiently/

作者:SK 译者:lujun9972 校对:wxy

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

bash 命令通常单线程运行。这意味着所有的处理工作只在单个 CPU 上执行。随着 CPU 规模的扩大以及核心数目的增加,这意味着只有一小部分的 CPU 资源用于处理你的工作。

当我们的工作受制于 CPU 处理数据的速度时,这些未使用的 CPU 资源能产生很大的效用。这种情况在进行多媒体转换(比如图片和视频转换)以及数据压缩中经常遇到。

本文中,我们将会使用 parallel 程序。parallel 会接受一个列表作为输入,然后在所有 CPU 核上并行地执行命令来处理该列表。Parallel 甚至会按顺序将结果输出到标准输出中,因此它可以用在管道中作为其他命令的标准输入。

如何使用 parallel

parallel 在标准输入中读取一个列表作为输入,然后创建多个指定命令的进程来处理这个列表,其格式为:

list | parallel command

这里的 list 可以由任何常见的 bash 命令创建,例如:catgrepfind。这些命令的结果通过管道从它们的标准输出传递到 parallel 的标准输入,像这样:

find . -type f -name "*.log" | parallel

find 中使用 -exec 类似,parallel 使用 {} 来表示输入列表中的每个元素。下面这个例子中,parallel 会使用 gzip 压缩所有 find 命令输出的文件:

find . -type f -name "*.log" | parallel gzip {}

下面这些实际的使用 parallel 的例子可能会更容易理解一些。

使用 parallel 来进行 JPEG 压缩

在这个例子中,我收集了一些比较大的 .jpg 文件(大约 10MB 大小),要用 Mozilla 出品的 JPEG 图像压缩工具 MozJPEG 来进行处理。该工具会在尝试保持图像质量的同时减少 JPEG 图像文件的大小。这对降低网页加载时间很重要。

下面是一个普通的 find 命令,用来找出当前目录中的所有 .jpg 文件,然后通过 MozJPEG 包中提供的图像压缩工具 (cjpeg) 对其进行处理:

find . -type f -name "*.jpg" -exec cjpeg -outfile LoRes/{} {} ';'

总共耗时 0m44.114s。该命令运行时的 top 看起来是这样的:

你可以看到,虽然有 8 个核可用,但实际只有单个线程在用单个核。

下面用 parallel 来运行相同的命令:

find . -type f -name "*.jpg" | parallel cjpeg -outfile LoRes/{} {}

这次压缩所有图像的时间缩减到了 0m10.814s。从 top 显示中可以很清楚地看出不同:

所有 CPU 核都满负荷运行,有 8 个线程对应使用 8 个 CPU 核。

parallel 与 gzip 连用

如果你需要压缩多个文件而不是一个大文件,那么 parallel 就能用来提高处理速度。如果你需要压缩单个文件而同时又想要利用所有的 CPU 核的话,那么你应该 gzip 的多线程替代品 pigz

首先,我用随机数据创建了 100 个大约 1GB 的文件:

for i in {1..100}; do dd if=/dev/urandom of=file-$i bs=1MB count=10; done

然而我用 find -exec 命令来进行压缩:

find . -type f -name "file*" -exec gzip {} ';'

总共耗时 0m28.028s,而且也是只利用了单核。

换成 parallel 版本:

find . -type f -name "file*" | parallel gzip {}

耗时减少到了 0m5.774s

parallel 是一款非常好用的工具,应该加入到你的系统管理工具包中,在合适的场合它能帮你节省大量的时间。


via: https://bash-prompt.net/guides/parallell-bash/

作者:Elliot Cooper 译者:lujun9972 校对:wxy

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

2016 年末开始的 LinchPin,现在已经拥有一个 Python API 和一个成长中的社区。

去年,我的团队公布了 LinchPin,这是一个使用 Ansible 的混合云 编配 orchestration 工具。 配给 provision 云资源从来没有这么容易便捷过。借助 Ansible 强力支持,LinchPin 专注于简化,使云资源让用户可以触手可及。在这篇文章中,我将介绍 LinchPin,并且去看看过去的 10 个月该项目是如何逐渐成熟。

(LCTT 译注:关于 orchestration 应该翻译成惯例的“编排”还是“编配”,有个 @wffger 提出的建议 ,欢迎大家参与讨论。)

LinchPin 刚出现的时候,使用 ansible-playbook 命令去运行 LinchPin ,虽然可以完成,但是还是很复杂的,LinchPin 现在有一个前端命令行用户界面(CLI),它是用 Click 写的,而且它使 LinchPin 比以前更简化。

没有止步于 CLI,LinchPin 现在还有一个 Python API,它可以用于管理资源,比如,Amazon EC2 和 OpenStack 实例、网络、存储、安全组等等。这个 API 文档 可以在你想去尝试 LinchPin 的 Python API 时帮助你。

Playbook 是一个库

因为 LinchPin 的核心是 Ansible playbook,其角色、模块、过滤器,以及任何被称为 Ansible 模块的东西都被移进 LinchPin 库中,这意味着我们虽然可以直接调用 playbook,但它不是资源管理的首选机制。linchpin 可执行文件事实上已经成为该命令行的前端。

深入了解命令行

让我们深入了解 linchpin 命令行:

$ linchpin
Usage: linchpin [OPTIONS] COMMAND [ARGS]...

  linchpin: hybrid cloud orchestration

Options:
  -c, --config PATH       Path to config file
  -w, --workspace PATH    Use the specified workspace if the familiar Jenkins
                          $WORKSPACE environment variable is not set
  -v, --verbose           Enable verbose output
  --version               Prints the version and exits
  --creds-path PATH       Use the specified credentials path if WORKSPACE
                          environment variable is not set
  -h, --help              Show this message and exit.

Commands:
  init     Initializes a linchpin project.
  up       Provisions nodes from the given target(s) in...
  destroy  Destroys nodes from the given target(s) in...

你可以立即看到一个简单的描述,以及命令的选项和参数。这个帮助的最下面的三个命令是本文的重点内容。

配置文件

之前有个名为 linchpin_config.yml 的文件。但现在这个文件没有了,替换它的是一个 ini 形式的配置文件,称为 linchpin.conf。虽然这个文件可以被修改或放到别的地方,它可以放置在配置文件容易找到的库路径中。在多数情况下,linchpin.conf 文件是不需要去修改的。

工作空间

工作空间 workspace 是一个定义好的文件系统路径,它是一个逻辑上的资源组。一个工作空间可以认为是一个特定环境、服务组、或其它逻辑组的一个单点。它也可以是一个所有可管理资源的大的存储容器。

工作空间可以在命令行上使用 --workspace-w) 选项去指定,随后是工作空间路径。它也可以使用环境变量指定(比如,bash 中的 $WORKSPACE)。默认工作空间是当前目录。

初始化 (linchpin init)

运行 linchpin init 将生成一个需要的目录结构,以及一个 PinFiletopology、和 layout 文件的示例:

$ export WORKSPACE=/tmp/workspace
$ linchpin init
PinFile and file structure created at /tmp/workspace
$ cd /tmp/workspace/
$ tree
.
├── credentials
├── hooks
├── inventories
├── layouts
│   └── example-layout.yml
├── PinFile
├── resources
└── topologies
    └── example-topology.yml

在这个时候,可以执行 linchpin up ,然后提供一个 libvirt 虚拟机,和一个名为 linchpin-centos71 的网络。会生成一个 库存 inventory ,并放在 inventories/libvirt.inventory 目录中。它可以通过读取 topologies/example-topology.ymltopology_name 的值了解它。

配给 provisioning (linchpin up)

一旦有了一个 PinFile、拓扑、和一个可选的布局,就可以 配给 provisioning 了。

我们使用 dummy (模拟)工具,因为用它来配给非常简单;它不需要任何额外的东西(认证、网络、等等)。dummy 配给程序会创建一个临时文件,它表示所配给的主机。如果临时文件没有任何数据,说明主机没有被配给,或者它已经被销毁了。

dummy 配给程序的目录树大致如下:

$ tree
.
├── hooks
├── inventories
├── layouts
│   └── dummy-layout.yml
├── PinFile
├── resources
└── topologies
    └── dummy-cluster.yml

PinFile 也很简单;它指定了它的拓扑,并且为 dummy1 目标提供一个可选的布局:

---
dummy1:
  topology: dummy-cluster.yml
  layout: dummy-layout.yml

dummy-cluster.yml 拓扑文件是一个引用,指向到配给的三个 dummy_node 类型的资源:

---
topology_name: "dummy_cluster" # topology name
resource_groups:
  -
    resource_group_name: "dummy"
    resource_group_type: "dummy"
    resource_definitions:
      -
        name: "web"
        type: "dummy_node"
        count: 3

执行命令 linchpin up 将基于上面的 topology_name(在这个案例中是 dummy_cluster)生成 resourcesinventory 文件。

$ linchpin up
target: dummy1, action: up

$ ls {resources,inventories}/dummy*
inventories/dummy_cluster.inventory  resources/dummy_cluster.output

要验证 dummy 集群的资源,可以检查 /tmp/dummy.hosts

$ cat /tmp/dummy.hosts
web-0.example.net
web-1.example.net
web-2.example.net

Dummy 模块为假定的(或模拟的)配给提供了一个基本工具。关于在 OpenStack、AWS EC2、Google Cloud 上和 LinchPin 的更多详细情况,可以去看示例

库存 inventory 生成

作为上面提到的 PinFile 的一部分,可以指定一个 layout。如果这个文件被指定,并且放在一个正确的位置上,就会为配给的资源自动生成一个用于 Ansible 的静态 库存 inventory 文件:

---
inventory_layout:
  vars:
    hostname: __IP__
  hosts:
    example-node:
      count: 3
      host_groups:
        - example

linchpin up 运行完成,资源文件将提供一个很有用的详细信息。特别是,插入到静态库存的 IP 地址或主机名:

[example]
web-2.example.net hostname=web-2.example.net
web-1.example.net hostname=web-1.example.net
web-0.example.net hostname=web-0.example.net

[all]
web-2.example.net hostname=web-2.example.net
web-1.example.net hostname=web-1.example.net
web-0.example.net hostname=web-0.example.net

卸载 (linchpin destroy

LinchPin 也可以执行资源卸载。卸载动作一般认为该资源是已经配给好的;然而,因为 Ansible 是 幂等的 idempotent linchpin destroy 将仅检查确认该资源是启用的。如果这个资源已经是启用的,它将去卸载它。

命令 linchpin destroy 也将使用资源和/或拓扑文件去决定合适的卸载过程。

Ansible dummy 角色不使用资源,卸载期间仅有拓扑:

$ linchpin destroy
target: dummy1, action: destroy

$ cat /tmp/dummy.hosts
-- EMPTY FILE --

针对暂时的资源,卸载功能有一些限制,像网络、存储、等等。网络资源可以被用于多个云实例。在这种情况下,执行一个 linchpin destroy 某些资源就不能卸载。这取决于每个供应商的实现。查看每个供应商的具体实现。

LinchPin 的 Python API

linchpin 命令行中实现的功能大多数都是用 Python API 写的。这个 API,虽然不完整,但它已经成为 LinchPin 工具的至关重要的组件。

这个 API 由下面的三个包组成:

  • linchpin
  • linchpin.cli
  • linchpin.api

该命令行工具是基于 linchpin 包来管理的。它导入了 linchpin.cli 模块和类,该类是 linchpin.api 的子类。这样做的目的是为了允许使用 linchpin.api 来做其它的 LinchPin 实现,比如像计划中的 RESTful API。

更多信息,去查看 Python API library documentation on Read the Docs

Hook

LinchPin 1.0 的其中一个大的变化是转向 hook。hook 的目标是在 linchpin 运行期间的特定状态下,允许配置使用更多外部资源。目前的状态有:

  • preup: 在配给拓扑资源之前运行
  • postup: 在配给拓扑资源之后运行,并且生成可选的 库存 inventory
  • predestroy: 卸载拓扑资源之前运行
  • postdestroy: 卸载拓扑资源之后运行

在每种状态下,这些 hooks 允许运行外部脚本。存在几种类型的 hook,包括一个定制的叫做 Action Managers。这是一个内置的 Action Manager 的列表:

  • shell: 允许任何的 内联 inline 的 shell 命令,或者一个可运行的 shell 脚本
  • python: 运行一个 Python 脚本
  • ansible: 运行一个 Ansible playbook,允许传递一个 vars_fileextra_vars 作为 Python 字典
  • nodejs: 运行一个 Node.js 脚本
  • ruby: 运行一个 Ruby 脚本

hook 被绑定到一个特定的目标,并且每个目标使用时必须重新声明。将来,hook 将可能是全局的,然后它们在每个目标的 hooks 节下命名会更简单。

使用 hook

hook 描述起来非常简单,但理解它们强大的功能却并不简单。这个特性的存在是为了给用户灵活提供那些 LinchPin 开发者所没有考虑到的功能。这个概念可能会带来 ping 一套系统的简单方式,举个实例,比如在运行另一个 hook 之前。

更仔细地去研究 工作空间 ,你可能会注意到 hooks 目录,让我们看一下这个目录的结构:

$ tree hooks/
hooks/
├── ansible
│   ├── ping
│   │   └── dummy_ping.yaml
└── shell
    └── database
        ├── init_db.sh
        └── setup_db.sh

在任何情况下,hook 都可以用在 PinFile 中,展示如下:

---
dummy1:
  topology: dummy-cluster.yml
  layout: dummy-layout.yml
  hooks:
    postup:
      - name: ping
        type: ansible
        actions:
          - dummy_ping.yaml
      - name: database
        type: shell
        actions:
          - setup_db.sh
          - init_db.sh

基本概念是有三个 postup 动作要完成。Hook 是从上到下运行的,因此,Ansible ping 任务将首先运行,紧接着是两个 shell 任务, setup_db.shinit_db.sh。假设 hook 运行成功。将发生一个系统的 ping,然后,一个数据库被安装和初始化。

认证的驱动程序

在 LinchPin 的最初设计中,开发者决定在 Ansible playbooks 中管理认证;然而,逐渐有更多的 API 和命令行驱动的工具后,意味着认证将被置于 playbooks 库之外,并且还可以根据需要去传递认证值。

配置

让用户使用驱动程序提供的认证方法去完成这个任务。举个实例,如果对于 OpenStack 调用的拓扑,标准方法是使用一个 yaml 文件,或者类似于 OS_ 前缀的环境变量。clouds.yaml 文件是一个 profile 文件的组成部分,它有一个 auth 节:

clouds:
  default:
    auth:
      auth_url: http://stack.example.com:5000/v2.0/
      project_name: factory2
      username: factory-user
      password: password-is-not-a-good-password

更多详细信息在 OpenStack documentation

这个 clouds.yaml 或者任何其它认证文件位于 default_credentials_path (比如,~/.config/linchpin)中,并在拓扑中引用:

---
topology_name: openstack-test
resource_groups:
  -
    resource_group_name: linchpin
    resource_group_type: openstack
    resource_definitions:
      - name: resource
        type: os_server
        flavor: m1.small
        image: rhel-7.2-server-x86_64-released
        count: 1
        keypair: test-key
        networks:
          - test-net2
        fip_pool: 10.0.72.0/24
    credentials:
      filename: clouds.yaml
      profile: default

default_credentials_path 可以通过修改 linchpin.conf 改变。

拓扑在底部包含一个新的 credentials 节。使用 openstackec2、和 gcloud 模块,也可以去指定类似的凭据。认证驱动程序将查看给定的名为 clouds.yaml 的文件,并搜索名为 default配置

假设认证被找到并被加载,配给将正常继续。

简化

虽然 LinchPin 可以完成复杂的拓扑、库存布局、hooks、和认证管理,但是,终极目标是简化。通过使用一个命令行界面的简化,除了提升已经完成的 1.0 版的开发者体验外,LinchPin 将持续去展示复杂的配置可以很简单地去管理。

社区的成长

在过去的一年中,LinchPin 的社区现在已经有了 邮件列表和一个 IRC 频道(#linchpin on chat.freenode.net,而且在 GitHub 中我们很努力地管理它。

在过去的一年里,社区成员已经从 2 位核心开发者增加到大约 10 位贡献者。更多的人持续参与到项目中。如果你对 LinchPin 感兴趣,可以给我们写信、在 GitHub 上提问,加入 IRC,或者给我们发邮件。

这篇文章是基于 Clint Savage 在 OpenWest 上的演讲 Introducing LinchPin: Hybrid cloud provisioning using Ansible 整理的。OpenWest 将在 2017 年 7 月 12-15 日在盐城湖市举行。


作者简介:

Clint Savage - 工作于 Red Hat 是一位负责原子项目(Project Atomic)的高级软件工程师。他的工作是为 Fedora、CentOS、和 Red Hat Enterprise Linux(RHEL)提供自动原子服务器构建。


via: https://opensource.com/article/17/6/linchpin

作者:Clint Savage 译者:qhwdw 校对:wxy

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

由于 Ubuntu 在 17.10 发行版本中转移到了 GNOME Shell,许多用户可能对那些实用的快捷键以及创建自己的快捷键感兴趣。这篇文章就是介绍这两方面的。

已有的便捷的 GNOME Shell 快捷键

如果你希望 GNOME 有成百上千种快捷键,你会失望地发现,情况并非如此。快捷键的列表不会太长,而且并不是全部都对你有用,但仍然会有许多快捷键可以用得上的。

 title=

可以通过菜单“设置 -> 设备 -> 键盘”访问快捷方式列表。以下是一些不太流行但实用的快捷方式。

  • Ctrl + Alt + T - 这是一个用来启动终端的快捷键组合,你可以在 GNOME 的任何地方使用它。

我个人经常使用的两个快捷键是:

  • Alt + F4 - 关闭最顶层端口
  • Alt + F8 - 调整窗口大小

大多数人都知道如何用 Alt + Tab 在打开的应用程序窗口之间,但是你可能不知道可以使用 Alt + Shift + Tab 在应用程序窗口之间进行反方向切换。

在切换窗口界面时,另一个有用的组合键是 Alt + ~tab 键上面的一个键)。

要是你想显示活动概览,你可以用快捷键 Alt + F1

有很多跟工作台有关的快捷键。如果你像我那样不经常使用多个工作台的话,这些快捷键对来说是没用的。尽管如此,以下几个快捷键还是值得留意的:

  • Super + PageUp (或者 PageDown )移动到上方或下方的工作台
  • Ctrl + Alt + Left (或 Right )移动到左侧或右侧的工作台

如果在这些快捷键中加上 Shift ,例如 Shift + Ctrl + Alt + Left,则可以把当前窗口移动到其他工作区。

另一个我最喜欢是辅助功能中的调整文字大小的快捷键。你可以用 Ctrl + + (或 Ctrl + - )快速缩放字体大小。在某些情况下,这个快捷键可能默认是禁用的,所以在尝试之前请先检查一下。

上述是一些鲜为人知但是十分实用的键盘快捷键。如果你想知道更多实用的快捷键,可以查看官方 GNOME Shell 快捷键列表

如何创建自己的 GNOME Shell 快捷键

如果默认的快捷键不符合您的喜好,可以更改它们或创建新的快捷键。你同样可以通过菜单“设置 -> 设备 -> 键盘“完成这些操作。当你选择想更改的快捷键条目时,下面的对话框就会弹出。

 title=

输入你想要的键盘快捷键组合。

 title=

如果这个快捷键已经被使用,你会得到一个消息。如果没有,只需点击设置,就完成了。

如果要添加新快捷键而不是更改现有快捷键,请向下滚动,直到看到 “+” 标志,单击它,在出现的对话框中输入新键盘快捷键的名称和快捷键组合。

 title=

GNOME 默认情况下并没有提供大量的 shell 快捷键,上面列出的是一些比较实用的快捷键。如果这些快捷键对你来说不够,你可以随时创建自己的快捷键。


via: https://www.maketecheasier.com/gnome-shell-keyboard-shortcuts/

作者:Ada Ivanova 译者:imquanquan 校对:wxy

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

目标:在 Linux 中运行魔兽世界

发行版:适用于几乎所有的 Linux 发行版。

要求:具有 root 权限的 Linux 系统,搭配上比较现代化的显卡并安装了最新的图形驱动程序。

难度:简单

约定:

  • # - 要求以 root 权限执行命令,可以直接用 root 用户来执行也可以使用 sudo 命令
  • $ - 使用普通非特权用户执行

简介

魔兽世界已经出现差不多有 13 年了,但它依然是最流行的 MMORPG。 不幸的是, 一直以来暴雪从未发布过官方的 Linux 客户端。 不过还好,我们有 Wine。

安装 Wine

你可以试着用一下普通的 Wine,但它在游戏性能方面改进不大。 Wine Staging 以及带 Gallium Nine 补丁的 Wine 几乎在各方面都要更好一点。 如果你使用了闭源的驱动程序, 那么 Wine Staging 是最好的选择。 若使用了 Mesa 驱动程序, 则还需要打上 Gallium Nine 补丁。

根据你使用的发行版,参考 Wine 安装指南 来安装。

Winecfg

打开 winecfg。确保第一个标签页中的 Windows 版本已经设置成了 Windows 7。 暴雪不再对之前的版本提供支持。 然后进入 “Staging” 标签页。 这里根据你用的是 staging 版本的 Wine 还是打了 Gallium 补丁的 Wine 来进行选择。

Winecfg Staging Settings

不管是哪个版本的 Wine,都需要启用 VAAPI 以及 EAX。 至于是否隐藏 Wine 的版本则由你自己决定。

如果你用的是 Staging 补丁,则启用 CSMT。 如果你用的是 Gallium Nine,则启用 Gallium Nine。 但是你不能两个同时启用。

Winetricks

下一步轮到 Winetricks 了。如果你对它不了解,那我告诉你, Winetricks 一个用来为 Wine 安装各种 Windows 库以及组件以便程序正常运行的脚本。 更多信息可以阅读我们的这篇文章 Winetricks 指南

Winetricks Corefonts Installed

要让 WoW 以及 战网启动程序 Battle.net launcher 工作需要安装一些东西。首先,在 “Fonts” 部分中安装 corefonts。 然后下面这一步是可选的, 如果你希望来自互联网上的所有数据都显示在战网启动程序中的话,就还需要安装 DLL 部分中的 ie8。

Battle.net

现在你配置好了 Wine 了,可以安装 Battle.net 应用了。 Battle.net 应用用来安装和升级 WoW 以及其他暴雪游戏。 它经常在升级后会出现问题。 因此若它突然出现问题,请查看 WineHQ 页面

毫无疑问,你可以从 Blizzard 的官网上 下载 Battle.net 应用。

下载完毕后,使用 Wine 打开 .exe 文件, 然后按照安装指引一步步走下去,就跟在 Windows 上一样。

Battle.net Launcher With WoW Installed

应用安装完成后,登录/新建帐号就会进入启动器界面。 你在那可以安装和管理游戏。 然后开始安装 WoW。 这可得好一会儿。

运行游戏

WoW Advanced Settings

在 Battle.net 应用中点击 “Play” 按钮就能启动 WoW 了。你需要等一会儿才能出现登录界面, 这个性能简直堪称垃圾。 之所以这么慢是因为 WoW 默认使用 DX11 来加速。 进入设置窗口中的 “Advanced” 标签页, 设置图像 API 为 DX9。 保存然后退出游戏。 退出成功后再重新打开游戏。

现在游戏应该可以玩了。请注意,游戏的性能严重依赖于你的硬件水平。 WoW 是一个很消耗 CPU 的游戏, 而 Wine 更加加剧了 CPU 的负担。 如果你的 CPU 不够强劲, 你的体验会很差。 不过 WoW 支持低特效,因此你可以调低画质让游戏更流畅。

性能调优

WoW Graphics Settings

很难说什么样的设置最适合你。WoW 在基本设置中有一个很简单的滑动比例条。 它的配置应该要比在 Windows 上低几个等级,毕竟这里的性能不像 Windows 上那么好。

先调低最可能的罪魁祸首。像 抗锯齿 anti-aliasing 粒子 particles 就常常会导致低性能。 另外,试试对比一下窗口模式和全屏模式。 有时候这两者之间的差距还是蛮大的。

WoW 对 “Raid and Battleground” 有专门的配置项。这可以在 “Raid and Battleground” 实例中的内容创建更精细的画面。 有时间 WoW 在开放地图中表现不错, 但当很多玩家出现在屏幕中时就变得很垃圾了。

实验然后看看哪些配置最适合你的系统。这完全取决于你的硬件和你的系统配置。

最后结语

虽然从未发布过 Linux 版的魔兽世界,但它在 Wine 上已经运行很多年了。 事实上, 它几乎一直都工作的很好。 甚至有传言说暴雪的开发人员会在 Wine 上测试以保证它是有效的。

虽然有这个说法,但后续的更新和补丁还是会影响到这个古老的游戏, 所以请随时做好出问题的准备。 不管怎样, 就算出问题了,也总是早已有了解决方案, 你只需要找到它而已。


via: https://linuxconfig.org/how-to-play-world-of-warcraft-on-linux-with-wine

作者:Nick Congleton 译者:lujun9972 校对:wxy

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