mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
Merge branch 'master' into yx/translation-request
This commit is contained in:
commit
7707988c22
@ -1,39 +0,0 @@
|
||||
translating---geekpi
|
||||
|
||||
A block layer introduction part 1: the bio layer
|
||||
============================================================
|
||||
|
||||
### A block layer introduction part 1: the bio layer
|
||||
|
||||
In reply to: [A block layer introduction part 1: the bio layer][1] by amarao
|
||||
Parent article: [A block layer introduction part 1: the bio layer][2]Hi,
|
||||
the problem you describe here is not directly related to the block layer. It is probably a driver bug, possible a SCSI-layer bug, but definitely not a block-layer problem.
|
||||
Reporting bugs against Linux is, unfortunately, a bit of a hit-and-miss affair. Some developers refused to touch bugzilla, some love it, and some (like me) only use it begrudgingly.
|
||||
The alternative is to send email. For that you need to choose the right list and maybe the right developer, and you need to catch them when they are in a good mood or aren't too busy or not on holidays. Some people will make an effort to respond to everything, others are completely unpredictable - and that is for me who usually sends a patch with any bug report. If you just have a bug that you barely understand yourself, your expected response rate is probably lower. Sad, but true.
|
||||
|
||||
Lots of bugs do get responded to and dealt with, but lots do not.
|
||||
|
||||
I don't think it is fair to say that nobody cares, but it probably is true that nobody sees it as being as important as you do. If you want a solution, then you need to drive it. One way to drive it is to spend money on a consultant or with a support contract from a distributor. I suspect that isn't possible in your situation. Another way is to learn how the code works and find a solution yourself. Lots of people do that, but again it might not be an option for you. Another way is to keep raising the issue on different relevant forums until you get a response. Persistence can bear fruit. You would need to be prepared to perform whatever testing is asked of you, possibly including building a new kernel to test.
|
||||
|
||||
If you are able to reproduce this problem on a recent kernel (4.12 or later) I suggest that you email a report to
|
||||
linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, and me (neilb@suse.com) (note that you do not need to subscribe to these lists to send mail, just send it). Describe the hardware and how to trigger the problem.
|
||||
Include the stack trace of any process in "D" state. You can get this with
|
||||
cat /proc/$PID/stack
|
||||
where "$PID" is the pid of the process.
|
||||
|
||||
Be sure to avoid complaining or saying how this has been broken for years and how it is grossly inadequate. Nobody cares about that. We do care about bugs and generally want to fix them. So just report the relevant facts.
|
||||
Try to include all facts in the mail rather than via links to somewhere else. Sometimes links are necessary, but in the case of your script, it is 8 lines long so just include it in the email (and avoid descriptions like "fuckup"; just call it "broken" or similar). Also make sure your email isn't sent as HTML. We like just plain text. HTML is rejected by all @vger.kernel.org mailing lists. You might need to configure your email program to not send HTML.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://lwn.net/Articles/737655/
|
||||
|
||||
作者:[ neilbrown][a]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://lwn.net/Articles/737655/
|
||||
[1]:https://lwn.net/Articles/737588/
|
||||
[2]:https://lwn.net/Articles/736534/
|
@ -1,3 +1,6 @@
|
||||
translating---geekpi
|
||||
|
||||
|
||||
# LibreOffice Is Now Available on Flathub, the Flatpak App Store
|
||||
|
||||
![LibreOffice on Flathub](http://www.omgubuntu.co.uk/wp-content/uploads/2017/11/libroffice-on-flathub-750x250.jpeg)
|
||||
|
103
sources/tech/20171130 Search DuckDuckGo from the Command Line.md
Normal file
103
sources/tech/20171130 Search DuckDuckGo from the Command Line.md
Normal file
@ -0,0 +1,103 @@
|
||||
translating---geekpi
|
||||
|
||||
# Search DuckDuckGo from the Command Line
|
||||
|
||||
![](http://www.omgubuntu.co.uk/wp-content/uploads/2017/11/duckduckgo.png)
|
||||
When we showed you how to [search Google from the command line][3] a lot of you to say you use [Duck Duck Go][4], the awesome privacy-focused search engine.
|
||||
|
||||
Well, now there’s a tool to search DuckDuckGo from the command line. It’s called [ddgr][6] (pronounced, in my head, as _dodger_ ) and it’s pretty neat.
|
||||
|
||||
Like [Googler][7], ddgr is totally open-source and totally unofficial. Yup, the app is unaffiliated with DuckDuckGo in any way. So, should it start returning unsavoury search results for innocent terms, make sure you quack in this dev’s direction, and not the search engine’s!
|
||||
|
||||
### DuckDuckGo Terminal App
|
||||
|
||||
![](http://www.omgubuntu.co.uk/wp-content/uploads/2017/11/ddgr-gif.gif)
|
||||
|
||||
[DuckDuckGo Bangs][8] makes finding stuff on DuckDuckGo super easy (there’s even a bang for _this_ site) and, dutifully, ddgr supports them.
|
||||
|
||||
Unlike the web interface, you can specify the number of search results you would like to see per page. It’s more convenient than skimming through 30-odd search results per page. The default interface is carefully designed to use minimum space without sacrificing readability.
|
||||
|
||||
`ddgr` has a number of features, including:
|
||||
|
||||
* Choose number of search results to fetch
|
||||
|
||||
* Support for Bash autocomplete
|
||||
|
||||
* Use !bangs
|
||||
|
||||
* Open URLs in a browser
|
||||
|
||||
* “I’m feeling lucky” option
|
||||
|
||||
* Filter by time, region, file type, etc
|
||||
|
||||
* Minimal dependencies
|
||||
|
||||
You can download `ddgr` for various systems direct from the Github project page:
|
||||
|
||||
[Download ‘ddgr’ from Github][9]
|
||||
|
||||
You can also install ddgr on Ubuntu 16.04 LTS and up from a PPA. This repo is maintained by the developer of ddgr and is recommended should you want to stay up-to-date with new releases as and when they appear.
|
||||
|
||||
Do note that at the time of writing the latest version of ddgr is _not_ in the PPA, but an older version (lacking –num support) is:
|
||||
|
||||
```
|
||||
sudo add-apt-repository ppa:twodopeshaggy/jarun
|
||||
```
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
```
|
||||
|
||||
### How To Use ddgr to Search DuckDuckGo from the Comand Line
|
||||
|
||||
To use ddgr once you installed all you need to do is pop open your terminal emulator of choice and run:
|
||||
|
||||
```
|
||||
ddgr
|
||||
```
|
||||
|
||||
Next enter a search term:
|
||||
|
||||
```
|
||||
search-term
|
||||
```
|
||||
|
||||
To limit the number of results returned run:
|
||||
|
||||
```
|
||||
ddgr --num 5 search-term
|
||||
```
|
||||
|
||||
To instantly open the first matching result for a search term in your browser run:
|
||||
|
||||
```
|
||||
ddgr -j search-term
|
||||
```
|
||||
|
||||
You can pass arguments and flags to narrow down your search. To see a comprehensive list inside the terminal run:
|
||||
|
||||
```
|
||||
ddgr -h
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.omgubuntu.co.uk/2017/11/duck-duck-go-terminal-app
|
||||
|
||||
作者:[JOEY SNEDDON ][a]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://plus.google.com/117485690627814051450/?rel=author
|
||||
[1]:https://plus.google.com/117485690627814051450/?rel=author
|
||||
[2]:http://www.omgubuntu.co.uk/category/download
|
||||
[3]:http://www.omgubuntu.co.uk/2017/08/search-google-from-the-command-line
|
||||
[4]:http://duckduckgo.com/
|
||||
[5]:http://www.omgubuntu.co.uk/2017/11/duck-duck-go-terminal-app
|
||||
[6]:https://github.com/jarun/ddgr
|
||||
[7]:https://github.com/jarun/googler
|
||||
[8]:https://duckduckgo.com/bang
|
||||
[9]:https://github.com/jarun/ddgr/releases/tag/v1.1
|
@ -1,86 +1,82 @@
|
||||
# Kprobes Event Tracing on ARMv8
|
||||
ARMv8 上的 kprobes 事件跟踪
|
||||
==============
|
||||
|
||||
![core-dump](http://www.linaro.org/wp-content/uploads/2016/02/core-dump.png)
|
||||
|
||||
### 介绍
|
||||
|
||||
Kprobes 是一种内核功能,它允许通过在执行(或模拟)断点指令之前和之后,设置调用开发者提供例程的任意断点来检测内核。可参见 kprobes 文档[[1]][2] 获取更多信息。基本的 kprobes 功能可使用 CONFIG_KPROBEES 来选择。在 arm64 的 v4.8 发行版中, kprobes 支持被添加到主线。
|
||||
kprobes 是一种内核功能,它允许通过在执行(或模拟)断点指令之前和之后,设置调用开发者提供例程的任意断点来检测内核。可参见 kprobes 文档^注1 获取更多信息。基本的 kprobes 功能可使用 `CONFIG_KPROBEES` 来选择。在 arm64 的 v4.8 内核发行版中, kprobes 支持被添加到主线。
|
||||
|
||||
在这篇文章中,我们将介绍 kprobes 在 arm64 上的使用,通过在命令行中使用 debugfs 事件追踪接口来收集动态追踪事件。这个功能在一些架构(包括 arm32)上可用已经有段时间,现在在 arm64 上也能使用了。这个功能允许使用 kprobes 而无需编写任何代码。
|
||||
在这篇文章中,我们将介绍 kprobes 在 arm64 上的使用,通过在命令行中使用 debugfs 事件追踪接口来收集动态追踪事件。这个功能在一些架构(包括 arm32)上可用已经有段时间,现在在 arm64 上也能使用了。这个功能可以无需编写任何代码就能使用 kprobes。
|
||||
|
||||
### 探针类型
|
||||
|
||||
Kprbes 子系统提供了三种不同类型的动态探针,如下所述。
|
||||
kprobes 子系统提供了三种不同类型的动态探针,如下所述。
|
||||
|
||||
### Kprobes
|
||||
#### kprobes
|
||||
|
||||
基本探针是 kprobes 插入的一个软件断点,用以替代你正在探测的指令,当探测点被击中时,它为最终的单步执行(或模拟)保存下原始指令。
|
||||
基本探针是 kprobes 插入的一个软件断点,用以替代你正在探测的指令,当探测点被命中时,它为最终的单步执行(或模拟)保存下原始指令。
|
||||
|
||||
### Kretprobes
|
||||
#### kretprobes
|
||||
|
||||
Kretprobes 是 kprobes 的一部分,它允许拦截返回函数,而不必在返回点设置一个探针(或者可能有多个)。对于支持的架构(包括 ARMv8),只要选择 kprobes,就可以选择此功能。
|
||||
kretprobes 是 kprobes 的一部分,它允许拦截返回函数,而不必在返回点设置一个探针(或者可能有多个探针)。对于支持的架构(包括 ARMv8),只要选择 kprobes,就可以选择此功能。
|
||||
|
||||
### Jprobes
|
||||
#### jprobes
|
||||
|
||||
Jprobes 允许通过提供一个具有相同调用签名(call signature)的中间函数来拦截对一个函数的调用,这里中间函数将被首先调用。Jprobes 只是一个编程接口,它不能通过 debugfs 事件追踪子系统来使用。因此,我们将不会在这里进一步讨论 jprobes。如果你想使用 jprobes,请参考 kprobes 文档。
|
||||
jprobes 允许通过提供一个具有相同<ruby>调用签名<rt>call signature</rt></ruby>的中间函数来拦截对一个函数的调用,这里中间函数将被首先调用。jprobes 只是一个编程接口,它不能通过 debugfs 事件追踪子系统来使用。因此,我们将不会在这里进一步讨论 jprobes。如果你想使用 jprobes,请参考 kprobes 文档。
|
||||
|
||||
### 调用 Kprobes
|
||||
### 调用 kprobes
|
||||
|
||||
Kprobes 提供一系列能从内核代码中调用的 API 来设置探测点和当探测点被击中时调用的注册函数。在不往内核中添加代码的情况下,Kprobes 也是可用的,这是通过写入特定事件追踪的 debugfs 文件来实现的,需要在文件中设置探针地址和信息,以便在探针被击中时记录到追踪日志中。后者是本文将要讨论的重点。最后 Kprobes 可以通过 perl 命令来使用。
|
||||
kprobes 提供一系列能从内核代码中调用的 API 来设置探测点和当探测点被命中时调用的注册函数。在不往内核中添加代码的情况下,kprobes 也是可用的,这是通过写入特定事件追踪的 debugfs 文件来实现的,需要在文件中设置探针地址和信息,以便在探针被命中时记录到追踪日志中。后者是本文将要讨论的重点。最后 kprobes 可以通过 perl 命令来使用。
|
||||
|
||||
### Kprobes API
|
||||
### kprobes API
|
||||
|
||||
内核开发人员可以在内核中编写函数(通常在专用的调试模块中完成)来设置探测点,并且在探测指令执行前和执行后立即执行任何所需操作。这在 kprobes.txt 中有很好的解释。
|
||||
|
||||
### 事件追踪
|
||||
|
||||
事件追踪子系统有自己的自己的文档[[2]][3],对于了解一般追踪事件的背景可能值得一读。事件追踪子系统是追踪点(tracepoints)和 kprobes 事件追踪的基础。事件追踪文档重点关注追踪点,所以请在查阅文档时记住这一点。Kprobes 与追踪点不同的是没有预定义的追踪点列表,而是采用动态创建的用于触发追踪事件信息收集的任意探测点。事件追踪子系统通过一系列 debugfs 文件来控制和监视。事件追踪(CONFIG_EVENT_TRACING)将在被如 kprobe 事件追踪子系统等需要时自动选择。
|
||||
事件追踪子系统有自己的自己的文档^注2 ,对于了解一般追踪事件的背景可能值得一读。事件追踪子系统是<ruby>追踪点<rt>tracepoints</rt></ruby>和 kprobes 事件追踪的基础。事件追踪文档重点关注追踪点,所以请在查阅文档时记住这一点。kprobes 与追踪点不同的是没有预定义的追踪点列表,而是采用动态创建的用于触发追踪事件信息收集的任意探测点。事件追踪子系统通过一系列 debugfs 文件来控制和监视。事件追踪(`CONFIG_EVENT_TRACING`)将在被如 kprobe 事件追踪子系统等需要时自动选择。
|
||||
|
||||
#### Kprobes 事件
|
||||
#### kprobes 事件
|
||||
|
||||
使用 kprobes 事件追踪子系统,用户可以在内核任意断点处指定要报告的信息,只需要指定任意现有可探测指令的地址以及格式化信息即可确定。在执行过程中遇到断点时,kprobes 将所请求的信息传递给事件追踪子系统的公共部分,这些部分将数据格式化并追加到追踪日志中,就像追踪点的工作方式一样。Kprobes 使用一个类似的但是大部分是独立的 debugfs 文件来控制和显示追踪事件信息。该功能可使用 CONFIG_KPROBE_EVENT 来选择。Kprobetrace文档[[3]][4] 提供了如何使用 kprobes 事件追踪的基本信息,并且应当被参考用以了解以下介绍示例的详细信息。
|
||||
使用 kprobes 事件追踪子系统,用户可以在内核任意断点处指定要报告的信息,只需要指定任意现有可探测指令的地址以及格式化信息即可确定。在执行过程中遇到断点时,kprobes 将所请求的信息传递给事件追踪子系统的公共部分,这些部分将数据格式化并追加到追踪日志中,就像追踪点的工作方式一样。kprobes 使用一个类似的但是大部分是独立的 debugfs 文件来控制和显示追踪事件信息。该功能可使用 `CONFIG_KPROBE_EVENT` 来选择。Kprobetrace 文档^ 注3 提供了如何使用 kprobes 事件追踪的基本信息,并且应当被参考用以了解以下介绍示例的详细信息。
|
||||
|
||||
### Kprobes 和 Perf
|
||||
### kprobes 和 perf
|
||||
|
||||
Perf 工具为 Kprobes 提供了另一个命令行接口。特别地,“perf probe” 允许探测点除了由函数名加偏移量和地址指定外,还可由源文件和行号指定。Perf 接口实际上是使用 kprobes 的 debugfs 接口的封装器。
|
||||
perf 工具为 kprobes 提供了另一个命令行接口。特别地,`perf probe` 允许探测点除了由函数名加偏移量和地址指定外,还可由源文件和行号指定。perf 接口实际上是使用 kprobes 的 debugfs 接口的封装器。
|
||||
|
||||
### Arm64 Kprobes
|
||||
### Arm64 kprobes
|
||||
|
||||
上述所有 kprobes 的方面现在都在 arm64 上得到实现,然而实际上与其它架构上的有一些不同:
|
||||
|
||||
* 注册名称参数当然是依架构而特定的,并且可以在 ARM ARM 中找到。
|
||||
|
||||
* 目前不是所有的指令类型都可被探测。当前不可探测的指令包括 mrs/msr(除了 DAIF 读),异常生成指令,eret 和 hint(除了 nop 变体)。在这些情况下,只探测一个附近的指令来代替是最简单的。这些指令在探测的黑名单里是因为在 kprobes 单步执行或者指令模拟时它们对处理器状态造成的改变是不安全的,这是由于 kprobes 构造的单步执行上下文和指令所需要的不一致,或者是由于指令不能容忍在 kprobes 中额外的处理时间和异常处理(ldx/stx)。
|
||||
|
||||
* 目前不是所有的指令类型都可被探测。当前不可探测的指令包括 mrs/msr(除了 DAIF 读取)、异常生成指令、eret 和 hint(除了 nop 变体)。在这些情况下,只探测一个附近的指令来代替是最简单的。这些指令在探测的黑名单里是因为在 kprobes 单步执行或者指令模拟时它们对处理器状态造成的改变是不安全的,这是由于 kprobes 构造的单步执行上下文和指令所需要的不一致,或者是由于指令不能容忍在 kprobes 中额外的处理时间和异常处理(ldx/stx)。
|
||||
* 试图识别在 ldx/stx 序列中的指令并且防止探测,但是理论上这种检查可能会失败,导致允许探测到的原子序列永远不会成功。当探测原子代码序列附近时应该小心。
|
||||
|
||||
* 注意由于 linux ARM64 调用约定的具体信息,为探测函数可靠地复制栈帧是不可能的,基于此不要试图用 jprobes 这样做,这一点与支持 jprobes 的大多数其它架构不同。这样的原因是被调用者没有足够的信息来确定需要的栈数量。
|
||||
|
||||
* 注意当探针被击中时,一个探针记录的栈指针信息将反映出使用中的特定栈指针,它是内核栈指针或者中断栈指针。
|
||||
|
||||
* 注意当探针被命中时,一个探针记录的栈指针信息将反映出使用中的特定栈指针,它是内核栈指针或者中断栈指针。
|
||||
* 有一组内核函数是不能被探测的,通常因为它们作为 kprobes 处理的一部分被调用。这组函数的一部分是依架构特定的,并且也包含如异常入口代码等。
|
||||
|
||||
### 使用 Kprobes 事件追踪
|
||||
### 使用 kprobes 事件追踪
|
||||
|
||||
Kprobes 一个常用的例子是检测函数入口和/或出口。因为只需要使用函数名来作为探针地址,它安装探针特别简单。Kprobes 事件追踪将查看符号名称并且确定地址。ARMv8 调用标准定义了函数参数和返回值的位置,并且这些可以作为 kprobes 事件处理的一部分被打印出来。
|
||||
kprobes 的一个常用例子是检测函数入口和/或出口。因为只需要使用函数名来作为探针地址,它安装探针特别简单。kprobes 事件追踪将查看符号名称并且确定地址。ARMv8 调用标准定义了函数参数和返回值的位置,并且这些可以作为 kprobes 事件处理的一部分被打印出来。
|
||||
|
||||
### 例子: 函数入口探测
|
||||
|
||||
检测 USB 以太网驱动程序复位功能:
|
||||
|
||||
```
|
||||
_$ pwd
|
||||
$ pwd
|
||||
/sys/kernel/debug/tracing
|
||||
$ cat > kprobe_events <<EOF
|
||||
p ax88772_reset %x0
|
||||
EOF
|
||||
$ echo 1 > events/kprobes/enable_
|
||||
$ echo 1 > events/kprobes/enable
|
||||
```
|
||||
|
||||
此时每次驱动器的 *ax8872_reset()* 函数被调用,追踪事件都将会被记录。这个事件将显示指向通过 作为此函数的唯一参数的 X0(按照 ARMv8 调用标准)传入的 _usbnet_ 结构的指针。插入需要以太网驱动程序的USB加密狗后,我们看见以下追踪信息:
|
||||
此时每次该驱动的 `ax8872_reset()` 函数被调用,追踪事件都将会被记录。这个事件将显示指向通过作为此函数的唯一参数的 `X0`(按照 ARMv8 调用标准)传入的 `usbnet` 结构的指针。插入需要以太网驱动程序的 USB 加密狗后,我们看见以下追踪信息:
|
||||
|
||||
```
|
||||
_$ cat trace
|
||||
$ cat trace
|
||||
# tracer: nop
|
||||
#
|
||||
# entries-in-buffer/entries-written: 1/1 #P:8
|
||||
@ -93,27 +89,27 @@ _$ cat trace
|
||||
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
|
||||
# | | | |||| | |
|
||||
kworker/0:0-4 [000] d… 10972.102939: p_ax88772_reset_0:
|
||||
(ax88772_reset+0x0/0x230) arg1=0xffff800064824c80_
|
||||
(ax88772_reset+0x0/0x230) arg1=0xffff800064824c80
|
||||
```
|
||||
|
||||
这里我们可以看见传入到我们的探测函数的指针参数的值。由于我们没有使用 kprobes 事件追踪的可选标签功能,我们需要的信息自动被标注为 _arg1_。注意这个指向我们需要 kprobes 记录这个探针的一组值的第一个,而不是函数参数的实际位置。在这个例子中它也只是碰巧是我们探测函数的第一个参数。
|
||||
这里我们可以看见传入到我们的探测函数的指针参数的值。由于我们没有使用 kprobes 事件追踪的可选标签功能,我们需要的信息自动被标注为 `arg1`。注意这指向我们需要 kprobes 记录这个探针的一组值的第一个,而不是函数参数的实际位置。在这个例子中它也只是碰巧是我们探测函数的第一个参数。
|
||||
|
||||
### 例子: 函数入口和返回探测
|
||||
|
||||
Kretprobe 功能专门用于探测函数返回。在函数入口 kprobes 子系统将会被调用并且建立钩子以便在函数返回时调用,钩子将记录需求事件信息。对最常见情况,返回信息通常在 X0 寄存器中,这是非常有用的。在 %x0 中返回值也可以被称为 _$retval_。以下例子也演示了如何提供一个可读的标签来展示有趣的信息。
|
||||
kretprobe 功能专门用于探测函数返回。在函数入口 kprobes 子系统将会被调用并且建立钩子以便在函数返回时调用,钩子将记录需求事件信息。对最常见情况,返回信息通常在 `X0` 寄存器中,这是非常有用的。在 `%x0` 中返回值也可以被称为 `$retval`。以下例子也演示了如何提供一个可读的标签来展示有趣的信息。
|
||||
|
||||
使用 kprobes 和 kretprobe 检测内核 *_do_fork()* 函数来记录参数和结果的例子:
|
||||
使用 kprobes 和 kretprobe 检测内核 `do_fork()` 函数来记录参数和结果的例子:
|
||||
|
||||
```
|
||||
_$ cd /sys/kernel/debug/tracing
|
||||
$ cd /sys/kernel/debug/tracing
|
||||
$ cat > kprobe_events <<EOF
|
||||
p _do_fork %x0 %x1 %x2 %x3 %x4 %x5
|
||||
r _do_fork pid=%x0
|
||||
EOF
|
||||
$ echo 1 > events/kprobes/enable_
|
||||
$ echo 1 > events/kprobes/enable
|
||||
```
|
||||
|
||||
此时每次对 _do_fork() 的调用都会产生两个记录到 “_trace_” 文件的 kprobe 事件,一个报告调用参数值,另一个报告返回值。返回值在 trace 文件中将被标记为“_pid_”。这里是三次 fork 系统调用执行后的 trace 文件的内容:
|
||||
此时每次对 `_do_fork()` 的调用都会产生两个记录到 trace 文件的 kprobe 事件,一个报告调用参数值,另一个报告返回值。返回值在 trace 文件中将被标记为 `pid`。这里是三次 fork 系统调用执行后的 trace 文件的内容:
|
||||
|
||||
```
|
||||
_$ cat trace
|
||||
@ -143,23 +139,23 @@ _$ cat trace
|
||||
检测 `_do_wait()` 函数:
|
||||
|
||||
```
|
||||
_$ cat > kprobe_events <<EOF
|
||||
$ cat > kprobe_events <<EOF
|
||||
p:wait_p do_wait wo_type=+0(%x0):u32 wo_flags=+4(%x0):u32
|
||||
r:wait_r do_wait $retval
|
||||
EOF
|
||||
$ echo 1 > events/kprobes/enable_
|
||||
$ echo 1 > events/kprobes/enable
|
||||
```
|
||||
|
||||
注意在第一个探针中使用的参数标签是可选的,并且可用于更清晰地识别记录在追踪日志中的信息。带符号的偏移量和括号表明了寄存器参数是指向记录在追踪日志中的内存内容的指针。“_:u32_”表明了内存位置包含一个无符号的4字节宽的数据(在这个例子中指局部定义的结构中的一个 emum 和一个 int)
|
||||
注意在第一个探针中使用的参数标签是可选的,并且可用于更清晰地识别记录在追踪日志中的信息。带符号的偏移量和括号表明了寄存器参数是指向记录在追踪日志中的内存内容的指针。`:u32` 表明了内存位置包含一个无符号的 4 字节宽的数据(在这个例子中指局部定义的结构中的一个 emum 和一个 int)。
|
||||
|
||||
探针标签(冒号后)是可选的,并且将用来识别日志中的探针。对每个探针来说标签必须是独一无二的。如果没有指定,将从附近的符号名称自动生成一个有用的标签,如前面的例子所示。
|
||||
|
||||
也要注意“_$retval_”参数可以只是指定为“_%x0_”。
|
||||
也要注意 `$retval` 参数可以只是指定为 `%x0`。
|
||||
|
||||
这里是两次 fork 系统调用执行后的 “_trace_” 文件的内容:
|
||||
这里是两次 fork 系统调用执行后的 trace 文件的内容:
|
||||
|
||||
```
|
||||
_$ cat trace
|
||||
$ cat trace
|
||||
# tracer: nop
|
||||
#
|
||||
# entries-in-buffer/entries-written: 4/4 #P:8
|
||||
@ -174,23 +170,23 @@ _$ cat trace
|
||||
bash-1702 [001] d… 175.342074: wait_p: (do_wait+0x0/0x260) wo_type=0x3 wo_flags=0xe
|
||||
bash-1702 [002] d..1 175.347236: wait_r: (SyS_wait4+0x74/0xe4 <- do_wait) arg1=0x757
|
||||
bash-1702 [002] d… 175.347337: wait_p: (do_wait+0x0/0x260) wo_type=0x3 wo_flags=0xf
|
||||
bash-1702 [002] d..1 175.347349: wait_r: (SyS_wait4+0x74/0xe4 <- do_wait) arg1=0xfffffffffffffff6_
|
||||
bash-1702 [002] d..1 175.347349: wait_r: (SyS_wait4+0x74/0xe4 <- do_wait) arg1=0xfffffffffffffff6
|
||||
```
|
||||
|
||||
### 例子: 探测任意指令地址
|
||||
|
||||
在前面的例子中,我们已经为函数的入口和出口插入探针,然而探测一个任意指令(除少数例外)是可能的。如果我们正在 C 函数中放置一个探针,第一步是查看代码的汇编版本以确定我们要放置探针的位置。一种方法是在 vmlinux 文件上使用 gdb,并在要放置探针的函数中展示指令。下面是一个在 arch/arm64/kernel/modules.c 中 _module_alloc_ 函数执行此操作的示例。在这种情况下,因为 gdb 似乎更喜欢使用弱符号定义,并且它是与这个函数关联的存根代码,所以我们从 System.map 中来获取符号值:
|
||||
在前面的例子中,我们已经为函数的入口和出口插入探针,然而探测一个任意指令(除少数例外)是可能的。如果我们正在 C 函数中放置一个探针,第一步是查看代码的汇编版本以确定我们要放置探针的位置。一种方法是在 vmlinux 文件上使用 gdb,并在要放置探针的函数中展示指令。下面是一个在 `arch/arm64/kernel/modules.c` 中 `module_alloc` 函数执行此操作的示例。在这种情况下,因为 gdb 似乎更喜欢使用弱符号定义,并且它是与这个函数关联的存根代码,所以我们从 System.map 中来获取符号值:
|
||||
|
||||
```
|
||||
_$ grep module_alloc System.map
|
||||
$ grep module_alloc System.map
|
||||
ffff2000080951c4 T module_alloc
|
||||
ffff200008297770 T kasan_module_alloc_
|
||||
ffff200008297770 T kasan_module_alloc
|
||||
```
|
||||
|
||||
在这个例子中我们使用了交叉开发工具,并且在我们的主机系统上调用 gdb 来检查指令包含我们感兴趣函数。
|
||||
|
||||
```
|
||||
_$ ${CROSS_COMPILE}gdb vmlinux
|
||||
$ ${CROSS_COMPILE}gdb vmlinux
|
||||
(gdb) x/30i 0xffff2000080951c4
|
||||
0xffff2000080951c4 <module_alloc>: sub sp, sp, #0x30
|
||||
0xffff2000080951c8 <module_alloc+4>: adrp x3, 0xffff200008d70000
|
||||
@ -218,37 +214,37 @@ _$ ${CROSS_COMPILE}gdb vmlinux
|
||||
0xffff200008095228 <module_alloc+100>: ldp x19, x20, [sp,#16] 0xffff20000809522c <module_alloc+104>: ldp x29, x30, [sp],#32
|
||||
0xffff200008095230 <module_alloc+108>: ret
|
||||
0xffff200008095234 <module_alloc+112>: mov sp, x29
|
||||
0xffff200008095238 <module_alloc+116>: mov x19, #0x0 // #0_
|
||||
0xffff200008095238 <module_alloc+116>: mov x19, #0x0 // #0
|
||||
```
|
||||
|
||||
在这种情况下,我们将在此函数中显示以下源代码行的结果:
|
||||
|
||||
```
|
||||
_p = __vmalloc_node_range(size, MODULE_ALIGN, VMALLOC_START,
|
||||
p = __vmalloc_node_range(size, MODULE_ALIGN, VMALLOC_START,
|
||||
VMALLOC_END, GFP_KERNEL, PAGE_KERNEL_EXEC, 0,
|
||||
NUMA_NO_NODE, __builtin_return_address(0));_
|
||||
NUMA_NO_NODE, __builtin_return_address(0));
|
||||
```
|
||||
|
||||
…以及在此代码行的函数调用的返回值:
|
||||
……以及在此代码行的函数调用的返回值:
|
||||
|
||||
```
|
||||
_if (p && (kasan_module_alloc(p, size) < 0)) {_
|
||||
if (p && (kasan_module_alloc(p, size) < 0)) {
|
||||
```
|
||||
|
||||
我们可以在从调用外部函数的汇编代码中识别这些。为了展示这些值,我们将在目标系统上的0xffff20000809520c 和 0xffff20000809521c 处放置探针。
|
||||
我们可以在从调用外部函数的汇编代码中识别这些。为了展示这些值,我们将在目标系统上的 `0xffff20000809520c` 和 `0xffff20000809521c` 处放置探针。
|
||||
|
||||
```
|
||||
_$ cat > kprobe_events <<EOF
|
||||
$ cat > kprobe_events <<EOF
|
||||
p 0xffff20000809520c %x0
|
||||
p 0xffff20000809521c %x0
|
||||
EOF
|
||||
$ echo 1 > events/kprobes/enable_
|
||||
$ echo 1 > events/kprobes/enable
|
||||
```
|
||||
|
||||
现在将一个以太网适配器加密狗插入到 USB 端口后,我们看到以下写入追踪日志的内容:
|
||||
|
||||
```
|
||||
_$ cat trace
|
||||
$ cat trace
|
||||
# tracer: nop
|
||||
#
|
||||
# entries-in-buffer/entries-written: 12/12 #P:8
|
||||
@ -271,47 +267,45 @@ _$ cat trace
|
||||
modprobe-2097 [002] d… 78.030643: p_0xffff20000809520c: (module_alloc+0x48/0x98) arg1=0xffff2000011b8000
|
||||
modprobe-2097 [002] d… 78.030761: p_0xffff20000809521c: (module_alloc+0x58/0x98) arg1=0x0
|
||||
modprobe-2097 [002] d… 78.031132: p_0xffff20000809520c: (module_alloc+0x48/0x98) arg1=0xffff200001270000
|
||||
modprobe-2097 [002] d… 78.031187: p_0xffff20000809521c: (module_alloc+0x58/0x98) arg1=0x0_
|
||||
modprobe-2097 [002] d… 78.031187: p_0xffff20000809521c: (module_alloc+0x58/0x98) arg1=0x0
|
||||
```
|
||||
|
||||
Kprobes 事件系统的另一个功能是记录统计信息,这可在 inkprobe_profile 中找到。在以上追踪后,该文件的内容为:
|
||||
kprobes 事件系统的另一个功能是记录统计信息,这可在 `inkprobe_profile` 中找到。在以上追踪后,该文件的内容为:
|
||||
|
||||
```
|
||||
_$ cat kprobe_profile
|
||||
$ cat kprobe_profile
|
||||
p_0xffff20000809520c 6 0
|
||||
p_0xffff20000809521c 6 0_
|
||||
p_0xffff20000809521c 6 0
|
||||
```
|
||||
|
||||
这表明我们设置的两处断点每个共发生了 8 次击中,这当然与追踪日志数据是一致的。在 kprobetrace 文档中有更多 kprobe_profile 的功能描述。
|
||||
这表明我们设置的两处断点每个共发生了 8 次命中,这当然与追踪日志数据是一致的。在 kprobetrace 文档中有更多 kprobe_profile 的功能描述。
|
||||
|
||||
也可以进一步过滤 kprobes 事件。用来控制这点的 debugfs 文件在 kprobetrace 文档中被列出,然而他们内容的详细信息大多在 trace events 文档中被描述。
|
||||
也可以进一步过滤 kprobes 事件。用来控制这点的 debugfs 文件在 kprobetrace 文档中被列出,然而它们内容的详细信息大多在 trace events 文档中被描述。
|
||||
|
||||
### 总结
|
||||
|
||||
现在,Linux ARMv8 对支持 kprobes 功能也和其它架构相当。有人正在做添加 uprobes 和 systemtap 支持的工作。这些功能/工具和其他已经完成的功能(如: perf, coresight)允许 Linux ARMv8 用户像在其它更老的架构上一样调试和测试性能。
|
||||
现在,Linux ARMv8 对支持 kprobes 功能也和其它架构相当。有人正在做添加 uprobes 和 systemtap 支持的工作。这些功能/工具和其他已经完成的功能(如: perf、 coresight)允许 Linux ARMv8 用户像在其它更老的架构上一样调试和测试性能。
|
||||
|
||||
* * *
|
||||
|
||||
参考文献
|
||||
|
||||
[[1]][5] Jim Keniston, Prasanna S. Panchamukhi, Masami Hiramatsu. “Kernel Probes (Kprobes).” _GitHub_. GitHub, Inc., 15 Aug. 2016\. Web. 13 Dec. 2016.
|
||||
|
||||
[[2]][6] Ts’o, Theodore, Li Zefan, and Tom Zanussi. “Event Tracing.” _GitHub_. GitHub, Inc., 3 Mar. 2016\. Web. 13 Dec. 2016.
|
||||
|
||||
[[3]][7] Hiramatsu, Masami. “Kprobe-based Event Tracing.” _GitHub_. GitHub, Inc., 18 Aug. 2016\. Web. 13 Dec. 2016.
|
||||
- 注1: Jim Keniston, Prasanna S. Panchamukhi, Masami Hiramatsu. “Kernel Probes (kprobes).” _GitHub_. GitHub, Inc., 15 Aug. 2016\. Web. 13 Dec. 2016.
|
||||
- 注2: Ts’o, Theodore, Li Zefan, and Tom Zanussi. “Event Tracing.” _GitHub_. GitHub, Inc., 3 Mar. 2016\. Web. 13 Dec. 2016.
|
||||
- 注3: Hiramatsu, Masami. “Kprobe-based Event Tracing.” _GitHub_. GitHub, Inc., 18 Aug. 2016\. Web. 13 Dec. 2016.
|
||||
|
||||
|
||||
----------------
|
||||
|
||||
作者简介 : [David Long][8] David在 Linaro Kernel - Core Development 团队中担任工程师。 在加入 Linaro 之前,他在商业和国防行业工作了数年,既做嵌入式实时工作又为Unix提供软件开发工具。之后,在 Digital(又名 Compaq)公司工作了十几年,负责 Unix 标准,C 编译器和运行时库的工作。之后 David 又去了一系列初创公司做嵌入式 Linux 和安卓系统,嵌入式定制操作系统和 Xen 虚拟化。他拥有 MIPS,Alpha 和 ARM 平台的经验(等等)。他使用过从 1979 年贝尔实验室 V6 开始的大部分Unix操作系统,并且长期以来一直是 Linux 用户和倡导者。他偶尔也因使用烙铁和数字示波器调试设备驱动而知名。
|
||||
作者简介 : [David Long][8] 在 Linaro Kernel - Core Development 团队中担任工程师。 在加入 Linaro 之前,他在商业和国防行业工作了数年,既做嵌入式实时工作又为Unix提供软件开发工具。之后,在 Digital(又名 Compaq)公司工作了十几年,负责 Unix 标准,C 编译器和运行时库的工作。之后 David 又去了一系列初创公司做嵌入式 Linux 和安卓系统,嵌入式定制操作系统和 Xen 虚拟化。他拥有 MIPS,Alpha 和 ARM 平台的经验(等等)。他使用过从 1979 年贝尔实验室 V6 开始的大部分Unix操作系统,并且长期以来一直是 Linux 用户和倡导者。他偶尔也因使用烙铁和数字示波器调试设备驱动而知名。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linaro.org/blog/kprobes-event-tracing-armv8/
|
||||
|
||||
作者:[ David Long][a]
|
||||
作者:[David Long][a]
|
||||
译者:[kimii](https://github.com/kimii)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
|
@ -1,21 +1,20 @@
|
||||
检查 Linux 系统上的网络连接
|
||||
============================================================
|
||||
|
||||
### Linux 系统提供了许多有用的命令来检查网络配置和连接。下面来看几个,包括 ifquery、ifup、ifdown 和 ifconfig。
|
||||
|
||||
> Linux 系统提供了许多有用的命令来检查网络配置和连接。下面来看几个,包括 `ifquery`、`ifup`、`ifdown` 和 `ifconfig`。
|
||||
|
||||
Linux 上有许多可用于查看网络设置和连接的命令。在今天的文章中,我们将会通过一些非常方便的命令来看看它们是如何工作的。
|
||||
|
||||
### ifquery 命令
|
||||
|
||||
一个非常有用的命令是 **ifquery**。这个命令应该会显示一个网络接口列表。但是,你可能只会看到类似这样的内容 - 仅显示回环接口:
|
||||
一个非常有用的命令是 `ifquery`。这个命令应该会显示一个网络接口列表。但是,你可能只会看到类似这样的内容 - 仅显示回环接口:
|
||||
|
||||
```
|
||||
$ ifquery --list
|
||||
lo
|
||||
```
|
||||
|
||||
如果是这种情况,那么你的 **/etc/network/interfaces** 不包括除了回环接口之外的网络接口信息。在下面的例子中,假设你使用 DHCP 来分配地址,且如果你希望它更有用的话,你可以添加例子最后的两行。
|
||||
如果是这种情况,那说明你的 `/etc/network/interfaces` 不包括除了回环接口之外的网络接口信息。在下面的例子中,假设你使用 DHCP 来分配地址,且如果你希望它更有用的话,你可以添加例子最后的两行。
|
||||
|
||||
```
|
||||
# interfaces(5) file used by ifup(8) and ifdown(8)
|
||||
@ -27,14 +26,11 @@ iface eth0 inet dhcp
|
||||
|
||||
### ifup 和 ifdown 命令
|
||||
|
||||
可以使用相关的 **ifup** 和 **ifdown** 命令来打开网络连接并根据需要将其关闭,只要该文件具有所需的描述性数据即可。请记住,“if” 在这里意思是“接口” (interface),这与 **ifconfig** 命令中的一样,而不是“如果我只有一个大脑” (if I only had a brain) 中的 “if”。
|
||||
|
||||
|
||||
<aside class="nativo-promo smartphone" id="" style="overflow: hidden; margin-bottom: 16px; max-width: 620px;"></aside>
|
||||
可以使用相关的 `ifup` 和 `ifdown` 命令来打开网络连接并根据需要将其关闭,只要该文件具有所需的描述性数据即可。请记住,“if” 在这里意思是<ruby>接口<rt>interface</rt></ruby>,这与 `ifconfig` 命令中的一样,而不是<ruby>如果我只有一个大脑<rt>if I only had a brain</rt></ruby> 中的 “if”。
|
||||
|
||||
### ifconfig 命令
|
||||
|
||||
另外,**ifconfig** 命令完全不读取 /etc/network/interfaces,但是在网络接口上仍然提供了相当多的有用信息 - 配置数据以及数据包计数可以告诉你每个接口有多忙。ifconfig 命令也可用于关闭和重新启动网络接口(例如:ifconfig eth0 down)。
|
||||
另外,`ifconfig` 命令完全不读取 `/etc/network/interfaces`,但是仍然提供了网络接口相当多的有用信息 —— 配置数据以及可以告诉你每个接口有多忙的数据包计数。`ifconfig` 命令也可用于关闭和重新启动网络接口(例如:`ifconfig eth0 down`)。
|
||||
|
||||
```
|
||||
$ ifconfig eth0
|
||||
@ -49,15 +45,13 @@ eth0 Link encap:Ethernet HWaddr 00:1e:4f:c8:43:fc
|
||||
Interrupt:21 Memory:fe9e0000-fea00000
|
||||
```
|
||||
|
||||
输出中的 RX 和 TX 数据包计数很低。此外,没有报告错误或数据包冲突。**uptime** 命令可能会确认此系统最近才重新启动。
|
||||
输出中的 RX 和 TX 数据包计数很低。此外,没有报告错误或数据包冲突。或许可以用 `uptime` 命令确认此系统最近才重新启动。
|
||||
|
||||
上面显示的广播 (Bcast) 和网络掩码 (Mask) 地址表明系统运行在 C 类等效网络(默认)上,所以本地地址范围从 192.168.0.1 到 192.168.0.254。
|
||||
上面显示的广播 (Bcast) 和网络掩码 (Mask) 地址表明系统运行在 C 类等效网络(默认)上,所以本地地址范围从 `192.168.0.1` 到 `192.168.0.254`。
|
||||
|
||||
### netstat 命令
|
||||
|
||||
**netstat** 命令提供有关路由和网络连接的信息。**netstat -rn** 命令显示系统的路由表。
|
||||
|
||||
<aside class="nativo-promo tablet desktop" id="" style="overflow: hidden; margin-bottom: 16px; max-width: 620px;"></aside>
|
||||
`netstat` 命令提供有关路由和网络连接的信息。`netstat -rn` 命令显示系统的路由表。192.168.0.1 是本地网关 (Flags=UG)。
|
||||
|
||||
```
|
||||
$ netstat -rn
|
||||
@ -68,7 +62,7 @@ Destination Gateway Genmask Flags MSS Window irtt Iface
|
||||
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
|
||||
```
|
||||
|
||||
上面输出中的 **169.254.0.0** 条目仅在你正在使用或计划使用本地链路通信时才有必要。如果不是这样的话,你可以在 **/etc/network/if-up.d/avahi-autoipd** 中注释掉相关的行:
|
||||
上面输出中的 `169.254.0.0` 条目仅在你正在使用或计划使用本地链路通信时才有必要。如果不是这样的话,你可以在 `/etc/network/if-up.d/avahi-autoipd` 中注释掉相关的行:
|
||||
|
||||
```
|
||||
$ tail -12 /etc/network/if-up.d/avahi-autoipd
|
||||
@ -87,7 +81,7 @@ $ tail -12 /etc/network/if-up.d/avahi-autoipd
|
||||
|
||||
### netstat -a 命令
|
||||
|
||||
**netstat -a** 命令将显示 **_所有_** 网络连接。为了将其限制为正在监听和已建立的连接(通常更有用),请改用 **netstat -at** 命令。
|
||||
`netstat -a` 命令将显示“所有”网络连接。为了将其限制为显示正在监听和已建立的连接(通常更有用),请改用 `netstat -at` 命令。
|
||||
|
||||
```
|
||||
$ netstat -at
|
||||
@ -103,21 +97,9 @@ tcp6 0 0 ip6-localhost:ipp [::]:* LISTEN
|
||||
tcp6 0 0 ip6-localhost:smtp [::]:* LISTEN
|
||||
```
|
||||
|
||||
### netstat -rn 命令
|
||||
|
||||
**netstat -rn** 展示系统的路由表。192.168.0.1 是本地网关 (Flags=UG)。
|
||||
|
||||
```
|
||||
$ netstat -rn
|
||||
Kernel IP routing table
|
||||
Destination Gateway Genmask Flags MSS Window irtt Iface
|
||||
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
|
||||
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
|
||||
```
|
||||
|
||||
### host 命令
|
||||
|
||||
**host** 命令就像 **nslookup** 一样,用来查询远程系统的 IP 地址,但是还提供系统的邮箱处理地址。
|
||||
`host` 命令就像 `nslookup` 一样,用来查询远程系统的 IP 地址,但是还提供系统的邮箱处理地址。
|
||||
|
||||
```
|
||||
$ host world.std.com
|
||||
@ -127,7 +109,7 @@ world.std.com mail is handled by 10 smtp.theworld.com.
|
||||
|
||||
### nslookup 命令
|
||||
|
||||
**nslookup** 还提供系统中(本例中是本地系统)提供 DNS 查询服务的信息。
|
||||
`nslookup` 还提供系统中(本例中是本地系统)提供 DNS 查询服务的信息。
|
||||
|
||||
```
|
||||
$ nslookup world.std.com
|
||||
@ -141,7 +123,7 @@ Address: 192.74.137.5
|
||||
|
||||
### dig 命令
|
||||
|
||||
**dig** 命令提供了很多有关连接到远程系统的信息 - 包括与我们通信的名称服务器以及查询需要多长时间进行响应,并经常用于故障排除。
|
||||
`dig` 命令提供了很多有关连接到远程系统的信息 - 包括与我们通信的名称服务器以及查询需要多长时间进行响应,并经常用于故障排除。
|
||||
|
||||
```
|
||||
$ dig world.std.com
|
||||
@ -168,7 +150,7 @@ world.std.com. 78146 IN A 192.74.137.5
|
||||
|
||||
### nmap 命令
|
||||
|
||||
**nmap** 经常用于探查远程系统,但是同样也用于报告本地系统提供的服务。在下面的输出中,我们可以看到登录可以使用 ssh、smtp 用于电子邮箱、web 站点也是启用的,并且 ipp 打印服务正在运行。
|
||||
`nmap` 经常用于探查远程系统,但是同样也用于报告本地系统提供的服务。在下面的输出中,我们可以看到登录可以使用 ssh、smtp 用于电子邮箱、web 站点也是启用的,并且 ipp 打印服务正在运行。
|
||||
|
||||
```
|
||||
$ nmap localhost
|
||||
@ -186,7 +168,7 @@ PORT STATE SERVICE
|
||||
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
|
||||
```
|
||||
|
||||
Linux 系统提供了很多有用的命令用于查看网络配置和连接。如果你都探索完了,请记住 **apropos network** 或许会让你了解更多。
|
||||
Linux 系统提供了很多有用的命令用于查看网络配置和连接。如果你都探索完了,请记住 `apropos network` 或许会让你了解更多。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -194,7 +176,7 @@ via: https://www.networkworld.com/article/3230519/linux/examining-network-connec
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
|
@ -0,0 +1,36 @@
|
||||
块层介绍第一部分:块 I/O 层
|
||||
============================================================
|
||||
|
||||
### 块层介绍第一部分:块 I/O 层
|
||||
|
||||
回复:amarao 在[块层介绍第一部分:块 I/O 层][1] 中提的问题
|
||||
先前的文章:[块层介绍第一部分:块 I/O 层][2]
|
||||
|
||||
嗨,
|
||||
你在这里描述的问题与块层不直接相关。这可能是一个驱动错误、可能是一个 SCSI 层错误,但绝对不是一个块层的问题。
|
||||
不幸的是,报告针对 Linux 的错误是一件难事。有些开发者拒绝去看 bugzilla,有些开发者喜欢它,有些(像我这样)只能勉强地使用它。
|
||||
另一种方法是发送电子邮件。为此,你需要选择正确的邮件列表,还有也许是正确的开发人员,当他们心情愉快,或者不是太忙或者不是假期时找到它们。有些人会努力回复所有,有些是完全不可预知的 - 这对我来说通常会发送一个补丁,包含一些错误报告。如果你只是有一个你自己几乎都不了解的 bug,那么你的预期响应率可能会更低。很遗憾,但这是是真的。
|
||||
|
||||
许多 bug 都会得到回应和处理,但很多 bug 都没有。
|
||||
|
||||
我不认为说没有人关心是公平的,但是没有人认为它如你想的那样重要是有可能的。如果你想要一个解决方案,那么你需要驱动它。一个驱动它的方法是花钱请顾问或者与经销商签订支持合同。我怀疑你的情况没有上面的可能。另一种方法是了解代码如何工作,并自己找到解决方案。很多人都这么做,但是这对你来说可能不是一种选择。另一种方法是在不同的相关论坛上不断提出问题,直到得到回复。坚持可以见效。你需要做好准备去执行任何你所要求的测试,可能包括建立一个新的内核来测试。
|
||||
|
||||
如果你能在最近的内核(4.12 或者更新)上复现这个 bug,我建议你邮件报告给 linux-kernel@vger.kernel.org、linux-scsi@vger.kernel.org 和我(neilb@suse.com)(注意你不必订阅这些列表来发送邮件,只需要发送就行)。描述你的硬件以及如何触发问题的。
|
||||
包含所有进程状态是 “D” 的栈追踪。你可以用 “cat /proc/$PID/stack” 来得到它,这里的 “$PID” 是进程的 pid。
|
||||
|
||||
确保避免抱怨或者说这个已经坏了好几年了以及这是多么严重不足。没有人关心这个。我们关心的是 bug 以及如何修复它。因此只要报告相关的事实就行。
|
||||
尝试在邮件中而不是链接到其他地方的链接中包含所有事实。有时链接是需要的,但是对于你的脚本,它只有 8 行,所以把它包含在邮件中就行(并避免像 “fuckup” 之类的描述。只需称它为“坏的”(broken)或者类似的)。同样确保你的邮件发送的不是 HTML 格式。我们喜欢纯文本。HTML 被所有的 @vger.kernel.org 邮件列表拒绝。你或许需要配置你的邮箱程序不发送 HTML。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://lwn.net/Articles/737655/
|
||||
|
||||
作者:[ neilbrown][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://lwn.net/Articles/737655/
|
||||
[1]:https://lwn.net/Articles/737588/
|
||||
[2]:https://lwn.net/Articles/736534/
|
Loading…
Reference in New Issue
Block a user