mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
Merge remote-tracking branch 'LCTT/master'
This commit is contained in:
commit
e5ffa69c26
@ -1,7 +1,11 @@
|
||||
机器人学影响 CIO 角色的 3 种方式
|
||||
======
|
||||
|
||||
> 机器人流程自动化如何影响 CIO ?考虑这些可能。
|
||||
|
||||
![配图](https://enterprisersproject.com/sites/default/files/styles/620x350/public/cio_ai.png?itok=toMIgELj)
|
||||
随着 2017 即将结束,许多 CIO 们的 2018 年目标也将确定。或许你们将参与到机器人流程自动化(RPA)中。多年以来,RPA 对许多公司来说只是一个可望不可及的概念。但是随着组织被迫变得越来越敏捷高效,RPA 所具有的潜在优势开始受到重视。
|
||||
|
||||
随着 2017 的结束,许多 CIO 们的 2018 年目标也将确定。或许你们将参与到机器人流程自动化(RPA)中。多年以来,RPA 对许多公司来说只是一个可望不可及的概念。但是随着组织被迫变得越来越敏捷高效,RPA 所具有的潜在优势开始受到重视。
|
||||
|
||||
根据 Redwood Sofeware 和 Sapio Research 的最新 [研究报告][1],IT 决策者们相信,未来 5 年有 59% 的业务可以被自动化处理,从而产生新的速度和效率,并且消减相应的重复性的人工工作量的岗位。但是,目前在相应岗位上没有实施 RPA 的公司中,有 20% 的公司员工超过 1000 人。
|
||||
|
||||
@ -43,7 +47,7 @@ via: https://enterprisersproject.com/article/2017/11/3-ways-robotics-affects-cio
|
||||
|
||||
作者:[Dennis Walsh][a]
|
||||
译者:[qhwdw](https://github.com/qhwdw)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,163 @@
|
||||
如何装载/卸载 Linux 内核模块
|
||||
===============
|
||||
|
||||
> 找到并装载内核模块以解决外设问题。
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_development_programming.png?itok=4OM29-82)
|
||||
|
||||
本文来自 Manning 出版的 [Linux in Action][1] 的第 15 章。
|
||||
|
||||
Linux 使用内核模块管理硬件外设。 我们来看看它是如何工作的。
|
||||
|
||||
运行中的 Linux 内核是您不希望被破坏的东西之一。毕竟,内核是驱动计算机所做的一切工作的软件。考虑到在一个运行的系统上必须同时管理诸多细节,最好能让内核尽可能的减少分心,专心的完成它的工作。但是,如果对计算环境进行任何微小的更改都需要重启整个系统,那么插入一个新的网络摄像头或打印机就可能会严重影响您的工作流程。每次添加设备时都必须重新启动,以使系统识别它,这效率很低。
|
||||
|
||||
为了在稳定性和可用性之间达成有效的平衡,Linux 将内核隔离,但是允许您通过可加载内核模块 (LKM) 实时添加特定的功能。如下图所示,您可以将模块视为软件的一部分,它告诉内核在哪里找到一个设备以及如何使用它。反过来,内核使设备对用户和进程可用,并监视其操作。
|
||||
|
||||
![Kernel modules][3]
|
||||
|
||||
*内核模块充当设备和 Linux 内核之间的转换器。*
|
||||
|
||||
虽然你可以自己编写模块来完全按照你喜欢的方式来支持一个设备,但是为什么要这样做呢?Linux 模块库已经非常强大,通常不需要自己去实现一个模块。 而绝大多数时候,Linux 会自动加载新设备的模块,而您甚至不知道它。
|
||||
|
||||
不过,有时候,出于某种原因,它本身并不会自动进行。(你肯定不想让那个招聘经理不耐烦地一直等待你的笑脸加入视频面试。)为了帮助你解决问题,你需要更多地了解内核模块,特别是,如何找到运行你的外设的实际模块,然后如何手动激活它。
|
||||
|
||||
### 查找内核模块
|
||||
|
||||
按照公认的约定,内核模块是位于 `/lib/modules/` 目录下的具有 .ko(内核对象)扩展名的文件。 然而,在你找到这些文件之前,你还需要选择一下。因为在引导时你需要从版本列表中选择其一加载,所以支持您选择的特定软件(包括内核模块)必须存在某处。 那么,`/lib/modules/` 就是其中之一。 你会发现目录里充满了每个可用的 Linux 内核版本的模块; 例如:
|
||||
|
||||
```
|
||||
$ ls /lib/modules
|
||||
4.4.0-101-generic
|
||||
4.4.0-103-generic
|
||||
4.4.0-104-generic
|
||||
```
|
||||
|
||||
在我的电脑上,运行的内核是版本号最高的版本(4.4.0-104-generic),但不能保证这对你来说是一样的(内核经常更新)。 如果您将要在一个运行的系统上使用模块完成一些工作的话,你需要确保您找到正确的目录树。
|
||||
|
||||
好消息:有一个可靠的窍门。相对于通过名称来识别目录,并希望能够找到正确的目录,你可以使用始终指向使用的内核名称的系统变量。 您可以使用 `uname -r`( `-r` 从系统信息中指定通常显示的内核版本号)来调用该变量:
|
||||
|
||||
|
||||
```
|
||||
$ uname -r
|
||||
4.4.0-104-generic
|
||||
```
|
||||
|
||||
通过这些信息,您可以使用称为命令替换的过程将 `uname` 并入您的文件系统引用中。 例如,要导航到正确的目录,您需要将其添加到 `/lib/modules` 。 要告诉 Linux “uname” 不是一个文件系统中的位置,请将 `uname` 部分用反引号括起来,如下所示:
|
||||
|
||||
```
|
||||
$ ls /lib/modules/`uname -r`
|
||||
build modules.alias modules.dep modules.softdep
|
||||
initrd modules.alias.bin modules.dep.bin modules.symbols
|
||||
kernel modules.builtin modules.devname modules.symbols.bin
|
||||
misc modules.builtin.bin modules.order vdso
|
||||
|
||||
```
|
||||
|
||||
你可以在 `kernel/` 目录下的子目录中找到大部分模块。 花几分钟时间浏览这些目录,了解事物的排列方式和可用内容。 这些文件名通常会让你知道它们是什么。
|
||||
|
||||
```
|
||||
$ ls /lib/modules/`uname -r`/kernel
|
||||
arch crypto drivers fs kernel lib mm
|
||||
net sound ubuntu virt zfs
|
||||
```
|
||||
|
||||
这是查找内核模块的一种方法;实际上,这是一种快速的方式。 但这不是唯一的方法。 如果你想获得完整的集合,你可以使用 `lsmod` 列出所有当前加载的模块以及一些基本信息。 这个截断输出的第一列(在这里列出的太多了)是模块名称,后面是文件大小和数量,然后是每个模块的名称:
|
||||
|
||||
```
|
||||
$ lsmod
|
||||
[...]
|
||||
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
|
||||
rt2x00usb 24576 1 rt2800usb
|
||||
rt2800lib 94208 1 rt2800usb
|
||||
[...]
|
||||
```
|
||||
|
||||
到底有多少?好吧,我们再运行一次 `lsmod ` ,但是这一次将输出管道输送到 `wc -l` 看一下一共多少行:
|
||||
|
||||
```
|
||||
$ lsmod | wc -l
|
||||
113
|
||||
```
|
||||
|
||||
这是已加载的模块。 总共有多少个? 运行 `modprobe -c` 并计算这些行将给我们这个数字:
|
||||
|
||||
```
|
||||
$ modprobe -c | wc -l
|
||||
33350
|
||||
```
|
||||
|
||||
有 33,350 个可用模块!? 看起来好像有人多年来一直在努力为我们提供软件来驱动我们的物理设备。
|
||||
|
||||
注意:在某些系统中,您可能会遇到自定义的模块,这些模块要么在 `/etc/modules` 文件中使用独特的条目进行引用,要么在 `/etc/modules-load.d/` 下的配置文件中。这些模块很可能是本地开发项目的产物,可能涉及前沿实验。不管怎样,知道你看到的是什么总是好的。
|
||||
|
||||
这就是如何找到模块的方法。 如果出于某种原因,它不会自行加载,您的下一个工作就是弄清楚如何手动加载未激活的模块。
|
||||
|
||||
### 手动加载内核模块
|
||||
|
||||
在加载内核模块之前,逻辑上您必须确认它存在。在这之前,你需要知道它叫什么。要做到这一点,有时需要兼有魔法和运气以及在线文档作者的辛勤工作的帮助。
|
||||
|
||||
我将通过描述一段时间前遇到的问题来说明这个过程。在一个晴朗的日子里,出于某种原因,笔记本电脑上的 WiFi 接口停止工作了。就这样。也许是软件升级把它搞砸了。谁知道呢?我运行了 `lshw -c network` ,得到了这个非常奇怪的信息:
|
||||
|
||||
```
|
||||
network UNCLAIMED
|
||||
AR9485 Wireless Network Adapter
|
||||
```
|
||||
|
||||
Linux 识别到了接口(Atheros AR9485),但将其列为未声明。 那么,正如他们所说的那样,“当情况变得严峻时,就会在互联网上进行艰难的搜索。” 我搜索了一下 atheros ar9 linux 模块,在浏览了一页又一页五年前甚至是十年前的页面后,它们建议我自己写个模块或者放弃吧,然后我终于发现(最起码 Ubuntu 16.04)有一个可以工作的模块。 它的名字是 ath9k 。
|
||||
|
||||
是的! 这场战斗胜券在握!向内核添加模块比听起来容易得多。 要仔细检查它是否可用,可以针对模块的目录树运行 `find`,指定 `-type f` 来告诉 Linux 您正在查找文件,然后将字符串 `ath9k` 和星号一起添加以包含所有以你的字符串打头的文件:
|
||||
|
||||
```
|
||||
$ find /lib/modules/$(uname -r) -type f -name ath9k*
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
|
||||
```
|
||||
|
||||
再一步,加载模块:
|
||||
|
||||
```
|
||||
# modprobe ath9k
|
||||
```
|
||||
|
||||
就是这样。无启动,没烦恼。
|
||||
|
||||
这里还有一个示例,向您展示如何使用已经崩溃的运行模块。曾经有一段时间,我使用罗技网络摄像头和一个特定的软件会使摄像头在下次系统启动前无法被任何其他程序访问。有时我需要在不同的应用程序中打开相机,但没有时间关机重新启动。(我运行了很多应用程序,在引导之后将它们全部准备好需要一些时间。)
|
||||
|
||||
由于这个模块可能是运行的,所以使用 `lsmod` 来搜索 video 这个词应该给我一个关于相关模块名称的提示。 实际上,它比提示更好:用 video 这个词描述的唯一模块是 uvcvideo(如下所示):
|
||||
|
||||
```
|
||||
$ lsmod | grep video
|
||||
uvcvideo 90112 0
|
||||
videobuf2_vmalloc 16384 1 uvcvideo
|
||||
videobuf2_v4l2 28672 1 uvcvideo
|
||||
videobuf2_core 36864 2 uvcvideo,videobuf2_v4l2
|
||||
videodev 176128 4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
|
||||
media 24576 2 uvcvideo,videodev
|
||||
```
|
||||
|
||||
有可能是我自己的操作导致了崩溃,我想我可以挖掘更深一点,看看我能否以正确的方式解决问题。但结果你知道的;有时你不关心理论,只想让设备工作。 所以我用 `rmmod` 杀死了 `uvcvideo` 模块,然后用 `modprobe` 重新启动它,一切都好:
|
||||
|
||||
```
|
||||
# rmmod uvcvideo
|
||||
# modprobe uvcvideo
|
||||
```
|
||||
|
||||
再一次:不重新启动。没有其他的后续影响。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/5/how-load-or-unload-linux-kernel-module
|
||||
|
||||
作者:[David Clinton][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[amwps290](https://github.com/amwps290)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/dbclinton
|
||||
[1]:https://www.manning.com/books/linux-in-action?a_aid=bootstrap-it&a_bid=4ca15fc9&chan=opensource
|
||||
[2]:/file/397906
|
||||
[3]:https://opensource.com/sites/default/files/uploads/kernels.png "Kernel modules"
|
116
published/20180601 Vim-plug - A Minimalist Vim Plugin Manager.md
Normal file
116
published/20180601 Vim-plug - A Minimalist Vim Plugin Manager.md
Normal file
@ -0,0 +1,116 @@
|
||||
Vim-plug:极简 Vim 插件管理器
|
||||
======
|
||||
|
||||
![](https://www.ostechnix.com/wp-content/uploads/2018/06/vim-plug-720x340.png)
|
||||
|
||||
当没有插件管理器时,Vim 用户必须手动下载 tarball 包形式的插件,并将它们解压到 `~/.vim` 目录中。在少量插件的时候可以。但当他们安装更多的插件时,就会变得一团糟。所有插件文件分散在单个目录中,用户无法找到哪个文件属于哪个插件。此外,他们无法找到他们应该删除哪个文件来卸载插件。这时 Vim 插件管理器就可以派上用场。插件管理器将安装插件的文件保存在单独的目录中,因此管理所有插件变得非常容易。我们几个月前已经写了关于 [Vundle][1] 的文章。今天,我们将看到又一个名为 “Vim-plug” 的 Vim 插件管理器。
|
||||
|
||||
Vim-plug 是一个自由、开源、速度非常快的、极简的 vim 插件管理器。它可以并行地安装或更新插件。你还可以回滚更新。它创建<ruby>浅层克隆<rt>shallow clone</rt></ruby>最小化磁盘空间使用和下载时间。它支持按需加载插件以加快启动时间。其他值得注意的特性是支持分支/标签/提交、post-update 钩子、支持外部管理的插件等。
|
||||
|
||||
### 安装
|
||||
|
||||
安装和使用起来非常容易。你只需打开终端并运行以下命令:
|
||||
|
||||
```
|
||||
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
|
||||
```
|
||||
|
||||
Neovim 用户可以使用以下命令安装 Vim-plug:
|
||||
|
||||
```
|
||||
$ curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
|
||||
```
|
||||
|
||||
### 用法
|
||||
|
||||
#### 安装插件
|
||||
|
||||
要安装插件,你必须如下所示首先在 Vim 配置文件中声明它们。一般 Vim 的配置文件是 `~/.vimrc`,Neovim 的配置文件是 `~/.config/nvim/init.vim`。请记住,当你在配置文件中声明插件时,列表应该以 `call plug#begin(PLUGIN_DIRECTORY)` 开始,并以 `plug#end()` 结束。
|
||||
|
||||
例如,我们安装 “lightline.vim” 插件。为此,请在 `~/.vimrc` 的顶部添加以下行。
|
||||
|
||||
```
|
||||
call plug#begin('~/.vim/plugged')
|
||||
Plug 'itchyny/lightline.vim'
|
||||
call plug#end()
|
||||
|
||||
```
|
||||
|
||||
在 vim 配置文件中添加上面的行后,通过输入以下命令重新加载:
|
||||
|
||||
```
|
||||
:source ~/.vimrc
|
||||
```
|
||||
|
||||
或者,只需重新加载 Vim 编辑器。
|
||||
|
||||
现在,打开 vim 编辑器:
|
||||
|
||||
```
|
||||
$ vim
|
||||
```
|
||||
|
||||
使用以下命令检查状态:
|
||||
|
||||
```
|
||||
:PlugStatus
|
||||
|
||||
```
|
||||
|
||||
然后输入下面的命令,然后按回车键安装之前在配置文件中声明的插件。
|
||||
|
||||
```
|
||||
:PlugInstall
|
||||
```
|
||||
|
||||
#### 更新插件
|
||||
|
||||
要更新插件,请运行:
|
||||
|
||||
```
|
||||
:PlugUpdate
|
||||
```
|
||||
|
||||
更新插件后,按下 `d` 查看更改。或者,你可以之后输入 `:PlugDiff`。
|
||||
|
||||
#### 审查插件
|
||||
|
||||
有时,更新的插件可能有新的 bug 或无法正常工作。要解决这个问题,你可以简单地回滚有问题的插件。输入 `:PlugDiff` 命令,然后按回车键查看上次 `:PlugUpdate`的更改,并在每个段落上按 `X` 将每个插件回滚到更新前的前一个状态。
|
||||
|
||||
#### 删除插件
|
||||
|
||||
删除一个插件删除或注释掉你以前在你的 vim 配置文件中添加的 `plug` 命令。然后,运行 `:source ~/.vimrc` 或重启 Vim 编辑器。最后,运行以下命令卸载插件:
|
||||
|
||||
```
|
||||
:PlugClean
|
||||
```
|
||||
|
||||
该命令将删除 vim 配置文件中所有未声明的插件。
|
||||
|
||||
#### 升级 Vim-plug
|
||||
|
||||
要升级vim-plug本身,请输入:
|
||||
|
||||
```
|
||||
:PlugUpgrade
|
||||
```
|
||||
|
||||
如你所见,使用 Vim-plug 管理插件并不难。它简化了插件管理。现在去找出你最喜欢的插件并使用 Vim-plug 来安装它们。
|
||||
|
||||
就是这些了。我将很快在这里发布另一个有趣的话题。在此之前,请继续关注我们。
|
||||
|
||||
干杯!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/vim-plug-a-minimalist-vim-plugin-manager/
|
||||
|
||||
作者:[SK][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.ostechnix.com/author/sk/
|
||||
[1]:https://linux.cn/article-9416-1.html
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
Operating a Kubernetes network
|
||||
============================================================
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
Learn Blockchains by Building One
|
||||
======
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
How to improve ROI on automation: 4 tips
|
||||
======
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
Token ERC Comparison for Fungible Tokens – Blockchainers
|
||||
======
|
||||
“The good thing about standards is that there are so many to choose from.” [_Andrew S. Tanenbaum_][1]
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
The Cost of Cloud Computing
|
||||
============================================================
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
Simple Load Balancing with DNS on Linux
|
||||
======
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
Passwordless Auth: Client
|
||||
======
|
||||
Time to continue with the [passwordless auth][1] posts. Previously, we wrote an HTTP service in Go that provided with a passwordless authentication API. Now, we are gonna code a JavaScript client for it.
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
How insecure is your router?
|
||||
======
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/locks_keys_bridge_paris.png?itok=Bp0dsEc9)
|
||||
|
@ -1,3 +1,4 @@
|
||||
translating by amwps290
|
||||
How to clean up your data in the command line
|
||||
======
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_520x292_opendata_0613mm.png?itok=UIjD_jhK)
|
||||
|
@ -1,3 +1,4 @@
|
||||
Translating by qhwdw
|
||||
Turn Your Raspberry Pi into a Tor Relay Node
|
||||
======
|
||||
|
||||
|
@ -1,201 +0,0 @@
|
||||
# 装载/卸载 Linux 内核模块
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_development_programming.png?itok=4OM29-82)
|
||||
|
||||
本文来自 Manning 出版的 [Linux in Action][1] 的第 15 章。
|
||||
|
||||
Linux 使用内核模块管理硬件外设。 我们来看看它是如何工作的。
|
||||
|
||||
运行中的 Linux 内核是您不希望破坏的东西之一。毕竟,内核是驱动计算机所做的一切的软件。考虑到在一个运行的系统上必须同时管理诸多细节,最好能让内核尽可能的减少分心,专心的完成它的工作。但是,如果在不重新启动整个系统的情况下,对计算环境进行任何微小的更改都是不可能的,那么插入一个新的网络摄像头或打印机可能会对您的工作流程造成严重的破坏。每次添加设备时都必须重新启动,以使系统识别它,这效率很低。
|
||||
|
||||
为了在稳定性和可用性之间建立一个有效的平衡,Linux 将内核隔离,但是允许您通过可加载内核模块 (LKMs) 实时添加特定的功能。如下图所示,您可以将模块视为软件的一部分,它告诉内核在哪里找到一个设备以及如何使用它。反过来,内核使设备对用户和进程可用,并监视其操作。
|
||||
|
||||
![Kernel modules][3]
|
||||
|
||||
内核模块充当设备和 Linux 内核之间的转换器。
|
||||
|
||||
没有什么能够阻止你编写你自己的模块来完全按照你喜欢的方式来支持一个设备,但是为什么呢? Linux 模块库已经非常强大,通常不需要自己去实现一个模块。 而绝大多数时候,Linux 会自动加载新设备的模块,而您甚至不知道它。
|
||||
|
||||
不过,有时候,出于某种原因,它本身并不会运行。 (你不想让那个招聘经理不耐烦地等待你的笑脸加入视频会议面试时间太长。)为了帮助你解决问题,你需要更多地了解内核模块,特别是 ,如何找到运行你的外设的实际模块,然后如何手动激活它。
|
||||
|
||||
### 查找内核模块
|
||||
|
||||
按照公认的约定,模块是位于 `/lib/modules/` 目录下的具有 .ko(内核对象)扩展名的文件。 然而,在你一直导航到这些文件之前,你可能不得不做出选择。 因为在引导时你需要从加载发行版列表中选择一个选项,所以支持您选择的特定软件(包括内核模块)必须存在某处。 那么,`/lib/modules/` 就是其中之一。 你会发现目录里充满了每个可用的 Linux 内核版本的模块; 例如:
|
||||
|
||||
```
|
||||
$ ls /lib/modules
|
||||
|
||||
4.4.0-101-generic
|
||||
|
||||
4.4.0-103-generic
|
||||
|
||||
4.4.0-104-generic
|
||||
|
||||
```
|
||||
|
||||
在我的电脑上,运行的内核是版本号最高的版本(4.4.0-104-generic),但不能保证这对你来说是一样的(内核经常更新)。 如果您将要在一个运行的系统上对你想要使用的模块做一些工作的话,则需要确保您拥有正确的目录树。
|
||||
|
||||
`uname -r`( `-r` 指定了系统信息中的内核版本号):
|
||||
|
||||
```
|
||||
$ uname -r
|
||||
|
||||
4.4.0-104-generic
|
||||
|
||||
```
|
||||
|
||||
好消息:有一个可靠的窍门。 不通过名称来识别目录,并希望能够找到正确的目录,而是使用始终指向使用的内核名称的系统变量。 您可以使用(从系统信息中指定通常显示的内核版本号)来调用该变量:
|
||||
|
||||
通过这些信息,您可以使用称为命令替换的过程将 `uname` 并入您的文件系统引用中。 例如,要导航到正确的目录,您需要将其添加到 `/lib/modules` 。 要告诉 Linux “uname” 不是文件系统的位置,请将 `uname` 部分用反引号括起来,如下所示:
|
||||
|
||||
```
|
||||
$ ls /lib/modules/`uname -r`
|
||||
|
||||
build modules.alias modules.dep modules.softdep
|
||||
|
||||
initrd modules.alias.bin modules.dep.bin modules.symbols
|
||||
|
||||
kernel modules.builtin modules.devname modules.symbols.bin
|
||||
|
||||
misc modules.builtin.bin modules.order vdso
|
||||
|
||||
```
|
||||
|
||||
你可以在 `kernel/` 目录下的子目录中找到大部分模块。 花几分钟时间浏览这些目录,了解事物的排列方式和可用内容。 这些文件名通常会让你知道你在看什么。
|
||||
|
||||
```
|
||||
$ ls /lib/modules/`uname -r`/kernel
|
||||
|
||||
arch crypto drivers fs kernel lib mm
|
||||
|
||||
net sound ubuntu virt zfs
|
||||
|
||||
```
|
||||
|
||||
这是查找内核模块的一种方法; 实际上,这是一种快速的方式。 但这不是唯一的方法。 如果你想获得完整的集合,你可以使用 `lsmod` 列出所有当前加载的模块以及一些基本信息。 这个截断输出的第一列(在这里列出的太多了)是模块名称,后面是文件大小和数量,然后是每个模块的名称:
|
||||
|
||||
```
|
||||
$ lsmod
|
||||
|
||||
[...]
|
||||
|
||||
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
|
||||
|
||||
rt2x00usb 24576 1 rt2800usb
|
||||
|
||||
rt2800lib 94208 1 rt2800usb
|
||||
|
||||
[...]
|
||||
|
||||
```
|
||||
|
||||
到底有多少?好吧,我们再运行一次 `lsmod ` ,但是这一次将输出管道输送到 `wc -l` 看一下一共多少行:
|
||||
|
||||
```
|
||||
$ lsmod | wc -l
|
||||
|
||||
113
|
||||
|
||||
```
|
||||
|
||||
那些是加载的模块。 总共有多少个? 运行 `modprobe -c` 并计算这些行将给我们这个数字:
|
||||
|
||||
```
|
||||
$ modprobe -c | wc -l
|
||||
|
||||
33350
|
||||
|
||||
```
|
||||
|
||||
有33,350个可用模块!?! 看起来好像有人多年来一直在努力为我们提供软件来驱动我们的物理设备。
|
||||
|
||||
注意:在某些系统中,您可能会遇到自定义的模块,这些模块在 `/etc/modules` 文件中使用其唯一条目进行引用,也可以作为保存到 `/etc/modules-load.d/` 的配置文件。这些模块很可能是本地开发项目的产物,可能涉及前沿实验。不管怎样,知道你在看什么是好事。
|
||||
|
||||
这就是你如何找到模块。 如果出于某种原因,它不会自行运行,您的下一个工作就是弄清楚如何手动加载非活动模块。
|
||||
|
||||
### 手动加载内核模块
|
||||
|
||||
在加载内核模块之前,逻辑上您必须确认它的存在。在这之前,你需要知道它叫什么。要做到这一点,有时需要同样的魔法和运气以及在线文档作者的辛勤工作的帮助。
|
||||
|
||||
我将通过描述一段时间前遇到的问题来说明这个过程。在一个晴朗的日子里,出于某种原因,笔记本电脑上的 WiFi 接口停止工作了。就这样。也许是软件升级把它搞砸了。谁知道呢?我运行了 `lshw -c network` ,得到了这个非常奇怪的信息:
|
||||
|
||||
```
|
||||
network UNCLAIMED
|
||||
|
||||
AR9485 Wireless Network Adapter
|
||||
|
||||
```
|
||||
|
||||
Linux 识别到了接口(Atheros AR9485),但将其列为未声明。 那么,正如他们所说的那样,“当情况变得严峻时,就会在互联网上进行艰难的搜索。” 我搜索了一下 atheros ar9 linux 模块,在浏览了 5 页甚至是 10 年前的页面后,它们建议自己写模块或者放弃,然后我终于发现(使用 Ubuntu 16.04, 至少)存在一个工作模块。 它的名字是 ath9k 。
|
||||
|
||||
是的! 这场战斗胜券在握! 向内核添加模块比听起来容易得多。 要仔细检查它是否可用,可以针对模块的目录树运行 `find`,指定 `-type f` 来告诉 Linux 您正在查找文件,然后将字符串 `ath9k` 和星号一起添加以包含所有以你的字符串打头的文件:
|
||||
|
||||
```
|
||||
$ find /lib/modules/$(uname -r) -type f -name ath9k*
|
||||
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
|
||||
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
|
||||
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
|
||||
|
||||
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
|
||||
|
||||
```
|
||||
|
||||
再一步,加载模块:
|
||||
|
||||
```
|
||||
# modprobe ath9k
|
||||
|
||||
```
|
||||
|
||||
就是这样。没有重新启动。没有大惊小怪。
|
||||
|
||||
这里还有一个示例,向您展示如何使用已经崩溃的运行模块。曾经有一段时间,我使用罗技网络摄像头和一个特定的软件会使摄像头在下次系统启动前无法被任何其他程序访问。有时我需要在不同的应用程序中打开相机,但没有时间关机重新启动。(我运行了很多应用程序,在引导之后将它们全部准备好需要一些时间。)
|
||||
|
||||
由于这个模块可能是运行的,所以使用 `lsmod` 来搜索视频这个词应该给我一个关于相关模块名称的提示。 实际上,它比提示更好:用 video 这个词描述的唯一模块是 uvcvideo(如下所示):
|
||||
|
||||
```
|
||||
$ lsmod | grep video
|
||||
|
||||
uvcvideo 90112 0
|
||||
|
||||
videobuf2_vmalloc 16384 1 uvcvideo
|
||||
|
||||
videobuf2_v4l2 28672 1 uvcvideo
|
||||
|
||||
videobuf2_core 36864 2 uvcvideo,videobuf2_v4l2
|
||||
|
||||
videodev 176128 4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
|
||||
|
||||
media 24576 2 uvcvideo,videodev
|
||||
|
||||
```
|
||||
|
||||
有可能是我自己的操作导致了崩溃,我想我可以挖掘更深一点,看看我能否以正确的方式解决问题。 但你知道它是如何的; 有时你不关心理论,只想让设备工作。 所以我用 `rmmod` 杀死了 `uvcvideo` 模块,然后用 `modprobe` 重新启动它,一切都好:
|
||||
|
||||
```
|
||||
# rmmod uvcvideo
|
||||
|
||||
# modprobe uvcvideo
|
||||
|
||||
```
|
||||
|
||||
再一次:不重新启动。没有其他的后续影响。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/5/how-load-or-unload-linux-kernel-module
|
||||
|
||||
作者:[David Clinto][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[amwps290](https://github.com/amwps290)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/dbclinton
|
||||
[1]:https://www.manning.com/books/linux-in-action?a_aid=bootstrap-it&a_bid=4ca15fc9&chan=opensource
|
||||
[2]:/file/397906
|
||||
[3]:https://opensource.com/sites/default/files/uploads/kernels.png "Kernel modules"
|
@ -1,120 +0,0 @@
|
||||
Vim-plug:极简 Vim 插件管理器
|
||||
======
|
||||
|
||||
![](https://www.ostechnix.com/wp-content/uploads/2018/06/vim-plug-720x340.png)
|
||||
|
||||
当没有插件管理器时,Vim 用户必须手动下载 tarball 包的插件并将它们解压到 **~/.vim** 目录中。在少量插件的时候可以。当他们安装更多的插件时,就会变得一团糟。所有插件文件分散在单个目录中,用户无法找到哪个文件属于哪个插件。此外,他们无法找到他们应该删除哪个文件来卸载插件。这时 Vim 插件管理器就可以派上用场。插件管理器将安装插件的文件保存在单独的目录中,因此管理所有插件变得非常容易。我们几个月前已经写了关于 [**Vundle**][1] 的文章。今天,我们将看到又一个名为 **“Vim-plug”** 的 Vim 插件管理器。
|
||||
|
||||
Vim-plug 是一个免费、开源、速度非常快的、极简的 vim 插件管理器。它可以并行安装或更新插件。你还可以回滚更新。它创建浅层克隆以最小化磁盘空间使用和下载时间。它支持按需加载插件以加快启动时间。其他值得注意的特性是分支/标签/提交支持、post-update hook、支持外部管理的插件等。
|
||||
|
||||
### Vim-plug:一个极简的 Vim 插件管理器
|
||||
|
||||
#### **安装**
|
||||
|
||||
安装和使用起来非常容易。你只需打开终端并运行以下命令:
|
||||
```
|
||||
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
|
||||
|
||||
```
|
||||
|
||||
Neovim 用户可以使用以下命令安装 Vim-plug:
|
||||
```
|
||||
$ curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
|
||||
|
||||
```
|
||||
|
||||
#### 用法
|
||||
|
||||
**安装插件**
|
||||
|
||||
要安装插件,你必须如下所示首先在 Vim 配置文件中声明它们。一般 Vim 的配置文件是 **~/.vimrc**,Neovim 的配置文件是 **~/.config/nvim/init.vim**。请记住,当你在配置文件中声明插件时,列表应该以 **call plug#begin(PLUGIN_DIRECTORY)** 开始,并以 **plug#end()** 结束。
|
||||
|
||||
例如,我们安装 “lightline.vim” 插件。为此,请在 **~/.vimrc** 的顶部添加以下行。
|
||||
```
|
||||
call plug#begin('~/.vim/plugged')
|
||||
Plug 'itchyny/lightline.vim'
|
||||
call plug#end()
|
||||
|
||||
```
|
||||
|
||||
在 vim 配置文件中添加上面的行后,通过输入以下命令重新加载:
|
||||
```
|
||||
:source ~/.vimrc
|
||||
|
||||
```
|
||||
|
||||
或者,只需重新加载 Vim 编辑器。
|
||||
|
||||
现在,打开 vim 编辑器:
|
||||
```
|
||||
$ vim
|
||||
|
||||
```
|
||||
|
||||
使用以下命令检查状态:
|
||||
```
|
||||
:PlugStatus
|
||||
|
||||
```
|
||||
|
||||
然后输入下面的命令,然后按 ENTER 键安装之前在配置文件中声明的插件。
|
||||
```
|
||||
:PlugInstall
|
||||
|
||||
```
|
||||
|
||||
**更新插件**
|
||||
|
||||
要更新插件,请运行:
|
||||
```
|
||||
:PlugUpdate
|
||||
|
||||
```
|
||||
|
||||
更新插件后,按下 **d** 查看更改。或者,你可以之后输入 **:PlugDiff**。
|
||||
|
||||
**审查插件**
|
||||
|
||||
有时,更新的插件可能有新的 bug 或无法正常工作。要解决这个问题,你可以简单地回滚有问题的插件。输入 **:PlugDiff** 命令,然后按 ENTER 键查看上次 **:PlugUpdate**的更改,并在每个段落上按 **X** 将每个插件回滚到更新前的前一个状态。
|
||||
|
||||
**删除插件**
|
||||
|
||||
删除一个插件删除或注释掉你以前在你的 vim 配置文件中添加的 **plug** 命令。然后,运行 **:source ~/.vimrc** 或重启 Vim 编辑器。最后,运行以下命令卸载插件:
|
||||
```
|
||||
:PlugClean
|
||||
|
||||
```
|
||||
|
||||
该命令将删除 vim 配置文件中所有未声明的插件。
|
||||
|
||||
**升级 Vim-plug**
|
||||
|
||||
要升级vim-plug本身,请输入:
|
||||
```
|
||||
:PlugUpgrade
|
||||
|
||||
```
|
||||
|
||||
如你所见,使用 Vim-plug 管理插件并不难。它简化了插件管理。现在去找出你最喜欢的插件并使用 Vim-plug 来安装它们。
|
||||
|
||||
**建议阅读:**
|
||||
|
||||
就是这些了。我将很快在这里发布另一个有趣的话题。在此之前,请继续关注 OSTechNix。
|
||||
|
||||
干杯!
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/vim-plug-a-minimalist-vim-plugin-manager/
|
||||
|
||||
作者:[SK][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.ostechnix.com/author/sk/
|
||||
[1]:https://www.ostechnix.com/manage-vim-plugins-using-vundle-linux/
|
Loading…
Reference in New Issue
Block a user