Ubuntu 14.04中修复“update information is outdated”错误

Summary: 看到过Ubuntu 14.04的顶部面板上那个显示下面这个错误的红色三角形了吗？  更新信息过时。该错误可能是由网络问题，或者某个仓库不再可用而造成的。请通过从指示器菜单中选择显示更新来手动更新，然后查看是否存在有失败的仓库。  它看起来像这样：  这里的粉红色感叹号标记就是原来的红色三角形，因为我使用了最佳的Ubuntu图标主题之一，Numix。让我们回到该错误中，这是一个常见的更新问题，你也许时不时地会碰到它。现在，你或许想知道的是，到底是什么导致了这个更新错误的出现。 引起update information is outdated错误的原因 导致

![](/data/attachment/album/201508/29/183104gl6cjjicmupknscc.jpg)

看到过Ubuntu 14.04的顶部面板上那个显示下面这个错误的红色三角形了吗？

>
> 更新信息过时。该错误可能是由网络问题，或者某个仓库不再可用而造成的。请通过从指示器菜单中选择‘显示更新’来手动更新，然后查看是否存在有失败的仓库。
>
>
>

它看起来像这样：

![](/data/attachment/album/201508/29/183107brj1eeja28evzqta.jpg)

这里的粉红色感叹号标记就是原来的红色三角形，因为我使用了[最佳的Ubuntu图标主题](http://itsfoss.com/best-icon-themes-ubuntu-1404/)之一，Numix。让我们回到该错误中，这是一个常见的更新问题，你也许时不时地会碰到它。现在，你或许想知道的是，到底是什么导致了这个更新错误的出现。

### 引起‘update information is outdated’错误的原因

导致该错误的原因在其自身的错误描述中就讲得相当明白，它告诉你“这可能是由网络问题或者某个不再可用的仓库导致的”。所以，要么是你更新了系统和某些仓库，要么是PPA不再受到支持了，或者你正面对的类似问题。

虽然错误本身就讲得很明白，而它给出了的议操作“请通过从指示器菜单选择‘显示更新’来手动更新以查看失败的仓库”却并不能很好地解决问题。如果你点击显示更新，你所能看见的仅仅是系统已经更新。

![](/data/attachment/album/201508/29/183107cvy3o6vavz8oe7ze.png)

很奇怪，不是吗？我们怎样才能找出是什么出错了，哪里出错了，以及为什么出错呢？

### 修复‘update information is outdated’错误

这里讨论的‘解决方案’可能对Ubuntu的这些版本有用：Ubuntu 14.04,12.04。你所要做的仅仅是打开终端（Ctrl+Alt+T），然后使用下面的命令：

```
sudo apt-get update

```

等待命令结束，然后查看其结果。这里插个快速提示，你可以[在终端中添加通知](http://itsfoss.com/notification-terminal-command-completion-ubuntu/)，这样当一个耗时很长的命令结束执行时就会通知你。在该命令的最后几行中，可以看到你的系统正面临什么样的错误。是的，你肯定会看到一个错误。

在我这里，我看到了有名的[GPG error: The following could not be verified](http://itsfoss.com/solve-gpg-error-signatures-verified-ubuntu/)错误。很明显，[在Ubuntu 15.04中安装声破天](http://itsfoss.com/install-spotify-ubuntu-1504/)有点问题。

![](/data/attachment/album/201508/29/183120gbyy55j5mubvy21a.jpg)

很可能你看到的不是像我一样的GPG错误，那样的话，我建议你读一读我写的这篇文章[修复Ubuntu中的各种常见更新错误](/article-5603-1.html)。

我知道有不少人，尤其是初学者，很是讨厌命令行，但是如果你正在使用Linux，你就无可避免会使用到终端。此外，那东西并没你想象的那么可怕。试试吧，你会很快上手的。

我希望这个快速提示对于你修复Ubuntu中的“update information is outdated”错误有帮助。如果你有任何问题或建议，请不吝提出，我们将无任欢迎。

---

via: <http://itsfoss.com/fix-update-information-outdated-ubuntu/>

作者：[Abhishek](http://itsfoss.com/author/abhishek/) 译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 中使用日志来排错

Jason Skowronski, Amy Echeverri, Sadequl Hussain

Summary: 人们创建日志的主要原因是排错。通常你会诊断为什么问题发生在你的 Linux 系统或应用程序中。错误信息或一系列的事件可以给你提供找出根本原因的线索，说明问题是如何发生的，并指出如何解决它。这里有几个使用日志来解决的样例。  登录失败原因 如果你想检查你的系统是否安全，你可以在验证日志中检查登录失败的和登录成功但可疑的用户。当有人通过不正当或无效的凭据来登录时会出现认证失败，这通常发生在使用 SSH 进行远程登录或 su 到本地其他用户来进行访问权时。这些是由插入式验证模块（PAM）来记录的。在你的日志中会看到像 Faile

学习了！

又吃成长快乐了。

@有道云笔记

人们创建日志的主要原因是排错。通常你会诊断为什么问题发生在你的 Linux 系统或应用程序中。错误信息或一系列的事件可以给你提供找出根本原因的线索，说明问题是如何发生的，并指出如何解决它。这里有几个使用日志来解决的样例。

![](/data/attachment/album/201508/29/235039blkn9x6162xmcc10.jpg)

### 登录失败原因

如果你想检查你的系统是否安全，你可以在验证日志中检查登录失败的和登录成功但可疑的用户。当有人通过不正当或无效的凭据来登录时会出现认证失败，这通常发生在使用 SSH 进行远程登录或 su 到本地其他用户来进行访问权时。这些是由[插入式验证模块（PAM）](http://linux.die.net/man/8/pam.d)来记录的。在你的日志中会看到像 Failed password 和 user unknown 这样的字符串。而成功认证记录则会包括像 Accepted password 和 session opened 这样的字符串。

失败的例子:

```
pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.0.2.2
Failed password for invalid user hoover from 10.0.2.2 port 4791 ssh2
pam_unix(sshd:auth): check pass; user unknown
PAM service(sshd) ignoring max retries; 6 > 3

```

成功的例子：

```
Accepted password for hoover from 10.0.2.2 port 4792 ssh2
pam_unix(sshd:session): session opened for user hoover by (uid=0)
pam_unix(sshd:session): session closed for user hoover

```

你可以使用 grep 来查找哪些用户失败登录的次数最多。这些都是潜在的攻击者正在尝试和访问失败的账户。这是一个在 ubuntu 系统上的例子。

```
$ grep "invalid user" /var/log/auth.log | cut -d ' ' -f 10 | sort | uniq -c | sort -nr
23 oracle
18 postgres
17 nagios
10 zabbix
6 test

```

由于没有标准格式，所以你需要为每个应用程序的日志使用不同的命令。日志管理系统，可以自动分析日志，将它们有效的归类，帮助你提取关键字，如用户名。

日志管理系统可以使用自动解析功能从 Linux 日志中提取用户名。这使你可以看到用户的信息，并能通过点击过滤。在下面这个例子中，我们可以看到，root 用户登录了 2700 次之多，因为我们筛选的日志仅显示 root 用户的尝试登录记录。

![](/ultimate-guide/wp-content/uploads/2015/05/Screen-Shot-2015-03-12-at-11.05.36-AM.png)

日志管理系统也可以让你以时间为做坐标轴的图表来查看，使你更容易发现异常。如果有人在几分钟内登录失败一次或两次，它可能是一个真正的用户而忘记了密码。但是，如果有几百个失败的登录并且使用的都是不同的用户名，它更可能是在试图攻击系统。在这里，你可以看到在3月12日，有人试图登录 Nagios 几百次。这显然不是一个合法的系统用户。

![](/data/attachment/album/201508/29/235045qkvevpzvvezeeepv.png)

### 重启的原因

有时候，一台服务器由于系统崩溃或重启而宕机。你怎么知道它何时发生，是谁做的？

#### 关机命令

如果有人手动运行 shutdown 命令，你可以在验证日志文件中看到它。在这里，你可以看到，有人从 IP 50.0.134.125 上作为 ubuntu 的用户远程登录了，然后关闭了系统。

```
Mar 19 18:36:41 ip-172-31-11-231 sshd[23437]: Accepted publickey for ubuntu from 50.0.134.125 port 52538 ssh
Mar 19 18:36:41 ip-172-31-11-231 23437]:sshd[ pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
Mar 19 18:37:09 ip-172-31-11-231 sudo:   ubuntu : TTY=pts/1 ; PWD=/home/ubuntu ; USER=root ; COMMAND=/sbin/shutdown -r now

```

#### 内核初始化

如果你想看看服务器重新启动的所有原因（包括崩溃），你可以从内核初始化日志中寻找。你需要搜索内核类（kernel）和 cpu 初始化（Initializing）的信息。

```
Mar 19 18:39:30 ip-172-31-11-231 kernel: [    0.000000] Initializing cgroup subsys cpuset
Mar 19 18:39:30 ip-172-31-11-231 kernel: [    0.000000] Initializing cgroup subsys cpu
Mar 19 18:39:30 ip-172-31-11-231 kernel: [    0.000000] Linux version 3.8.0-44-generic (buildd@tipua) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #66~precise1-Ubuntu SMP Tue Jul 15 04:01:04 UTC 2014 (Ubuntu 3.8.0-44.66~precise1-generic 3.8.13.25)

```

### 检测内存问题

有很多原因可能导致服务器崩溃，但一个常见的原因是内存用尽。

当你系统的内存不足时，进程会被杀死，通常会杀死使用最多资源的进程。当系统使用了所有内存，而新的或现有的进程试图使用更多的内存时就会出现错误。在你的日志文件查找像 Out of Memory 这样的字符串或类似 kill 这样的内核警告信息。这些信息表明系统故意杀死进程或应用程序，而不是允许进程崩溃。

例如:

```
[33238.178288] Out of memory: Kill process 6230 (firefox) score 53 or sacrifice child
[29923450.995084] select 5230 (docker), adj 0, size 708, to kill

```

你可以使用像 grep 这样的工具找到这些日志。这个例子是在 ubuntu 中:

```
$ grep “Out of memory” /var/log/syslog
 [33238.178288] Out of memory: Kill process 6230 (firefox) score 53 or sacrifice child

```

请记住，grep 也要使用内存，所以只是运行 grep 也可能导致内存不足的错误。这是另一个你应该中央化存储日志的原因！

### 定时任务错误日志

cron 守护程序是一个调度器，可以在指定的日期和时间运行进程。如果进程运行失败或无法完成，那么 cron 的错误出现在你的日志文件中。具体取决于你的发行版，你可以在 /var/log/cron，/var/log/messages，和 /var/log/syslog 几个位置找到这个日志。cron 任务失败原因有很多。通常情况下，问题出在进程中而不是 cron 守护进程本身。

默认情况下，cron 任务的输出会通过 postfix 发送电子邮件。这是一个显示了该邮件已经发送的日志。不幸的是，你不能在这里看到邮件的内容。

```
Mar 13 16:35:01 PSQ110 postfix/pickup[15158]: C3EDC5800B4: uid=1001 from=<hoover>
Mar 13 16:35:01 PSQ110 postfix/cleanup[15727]: C3EDC5800B4: message-id=<20150310110501.C3EDC5800B4@PSQ110>
Mar 13 16:35:01 PSQ110 postfix/qmgr[15159]: C3EDC5800B4: from=<hoover@loggly.com>, size=607, nrcpt=1 (queue active)
Mar 13 16:35:05 PSQ110 postfix/smtp[15729]: C3EDC5800B4: to=<hoover@loggly.com>, relay=gmail-smtp-in.l.google.com[74.125.130.26]:25, delay=4.1, delays=0.26/0/2.2/1.7, dsn=2.0.0, status=sent (250 2.0.0 OK 1425985505 f16si501651pdj.5 - gsmtp)

```

你可以考虑将 cron 的标准输出记录到日志中，以帮助你定位问题。这是一个你怎样使用 logger 命令重定向 cron 标准输出到 syslog的例子。用你的脚本来代替 echo 命令，helloCron 可以设置为任何你想要的应用程序的名字。

```
*/5 * * * * echo ‘Hello World’ 2>&1 | /usr/bin/logger -t helloCron

```

它创建的日志条目：

```
Apr 28 22:20:01 ip-172-31-11-231 CRON[15296]: (ubuntu) CMD (echo 'Hello World!' 2>&1 | /usr/bin/logger -t helloCron)
Apr 28 22:20:01 ip-172-31-11-231 helloCron: Hello World!

```

每个 cron 任务将根据任务的具体类型以及如何输出数据来记录不同的日志。

希望在日志中有问题根源的线索，也可以根据需要添加额外的日志记录。

---

via: <http://www.loggly.com/ultimate-guide/logging/troubleshooting-with-linux-logs/>

作者：[Jason Skowronski](https://www.linkedin.com/in/jasonskowronski) 作者：[Amy Echeverri](https://www.linkedin.com/in/amyecheverri) 作者：[Sadequl Hussain](https://www.linkedin.com/pub/sadequl-hussain/14/711/1a7) 译者：[strugglingyouth](https://github.com/strugglingyouth) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


在 VirtualBox 中使用 Docker Machine 管理主机

大家好，今天我们学习在 VirtualBox 中使用 Docker Machine 来创建和管理 Docker 主机。Docker Machine 是一个可以帮助我们在电脑上、在云端、在数据中心内创建 Docker 主机的应用。它为根据用户的配置和需求创建服务器并在其上安装 Docker和客户端提供了一个轻松的解决方案。这个 API 可以用于在本地主机、或数据中心的虚拟机、或云端的实例提供 Docker 服务。Docker Machine 支持 Windows、OSX 和 Linux，并且是以一个独立的二进制文件包形式安装的。仍然使用（与现有 Docker 工具）相同的接口，我们就可以充分利用已经提供 Docker 基础框架的生态系统。只要一个命令，用户就能快速部署 Docker 容器。

![](/data/attachment/album/201508/30/002024zukxaaaha9m77119.png)

本文列出一些简单的步骤用 Docker Machine 来部署 docker 容器。

### 1. 安装 Docker Machine

Docker Machine 完美支持所有 Linux 操作系统。首先我们需要从 [github](https://github.com/docker/machine/releases) 下载最新版本的 Docker Machine，本文使用 curl 作为下载工具，Docker Machine 版本为 0.2.0。

**64 位操作系统**

```
# curl -L https://github.com/docker/machine/releases/download/v0.2.0/docker-machine_linux-amd64 > /usr/local/bin/docker-machine

```

**32 位操作系统**

```
# curl -L https://github.com/docker/machine/releases/download/v0.2.0/docker-machine_linux-i386 > /usr/local/bin/docker-machine

```

下载完成后，找到 **/usr/local/bin** 目录下的 **docker-machine** 文件，让其可以执行：

```
# chmod +x /usr/local/bin/docker-machine

```

确认是否成功安装了 docker-machine，可以运行下面的命令，它会打印 Docker Machine 的版本信息：

```
# docker-machine -v

```

![安装 Docker Machine](/data/attachment/album/201508/30/002039i60xy2xuh8xu6zut.png)

运行下面的命令，安装 Docker 客户端，以便于在我们自己的电脑止运行 Docker 命令：

```
# curl -L https://get.docker.com/builds/linux/x86_64/docker-latest > /usr/local/bin/docker
# chmod +x /usr/local/bin/docker

```

### 2. 创建 VirtualBox 虚拟机

在 Linux 系统上安装完 Docker Machine 后，接下来我们可以安装 VirtualBox 虚拟机，运行下面的就可以了。`--driver virtualbox` 选项表示我们要在 VirtualBox 的虚拟机里面部署 docker，最后的参数“linux” 是虚拟机的名称。这个命令会下载 [boot2docker](https://github.com/boot2docker/boot2docker) iso，它是个基于 Tiny Core Linux 的轻量级发行版，自带 Docker 程序，然后 `docker-machine` 命令会创建一个 VirtualBox 虚拟机（LCTT译注：当然，我们也可以选择其他的虚拟机软件）来运行这个 boot2docker 系统。

```
# docker-machine create --driver virtualbox linux

```

![创建 Docker Machine](/data/attachment/album/201508/30/002040hpxgd0wci59c3z4p.png)

测试下有没有成功运行 VirtualBox 和 Docker，运行命令：

```
# docker-machine ls

```

![Docker Machine List](/data/attachment/album/201508/30/002040z5o3y8ip7sh71cyp.png)

如果执行成功，我们可以看到在 ACTIVE 那列下面会出现一个星号“\*”。

### 3. 设置环境变量

现在我们需要让 docker 与 docker-machine 通信，运行 `docker-machine env <虚拟机名称>` 来实现这个目的。

```
# eval "$(docker-machine env linux)"
# docker ps

```

这个命令会设置 TLS 认证的环境变量，每次重启机器或者重新打开一个会话都需要执行一下这个命令，我们可以看到它的输出内容：

```
# docker-machine env linux

export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=/Users/<your username>/.docker/machine/machines/dev
export DOCKER_HOST=tcp://192.168.99.100:2376

```

### 4. 运行 Docker 容器

完成配置后我们就可以在 VirtualBox 上运行 docker 容器了。测试一下，我们可以运行虚拟机 `docker run busybox` ，并在里面里执行 `echo hello world` 命令，我们可以看到容器的输出信息。

```
# docker run busybox echo hello world

```

![运行 Docker 容器](/data/attachment/album/201508/30/002041lbeks9b3x953snzt.png)

### 5. 拿到 Docker 主机的 IP

我们可以执行下面的命令获取运行 Docker 的主机的 IP 地址。我们可以看到在 Docker 主机的 IP 地址上的任何暴露出来的端口。

```
# docker-machine ip

```

![Docker IP 地址](/data/attachment/album/201508/30/002041whn31p4jppj5s4hz.png)

### 6. 管理主机

现在我们可以随心所欲地使用上述的 docker-machine 命令来不断创建主机了。

当你使用完 docker 时，可以运行 **docker-machine stop** 来停止所有主机，如果想开启所有主机，运行 **docker-machine start**。

```
# docker-machine stop
# docker-machine start

```

你也可以只停止或开启一台主机：

```
$ docker-machine stop linux
$ docker-machine start linux

```

### 总结

最后，我们使用 Docker Machine 成功在 VirtualBox 上创建并管理一台 Docker 主机。Docker Machine 确实能让用户快速地在不同的平台上部署 Docker 主机，就像我们这里部署在 VirtualBox 上一样。这个 virtualbox 驱动可以在本地机器上使用，也可以在数据中心的虚拟机上使用。Docker Machine 驱动除了支持本地的 VirtualBox 之外，还支持远端的 Digital Ocean、AWS、Azure、VMware 以及其它基础设施。

如果你有任何疑问，或者建议，请在评论栏中写出来，我们会不断改进我们的内容。谢谢，祝愉快。

---

via: <http://linoxide.com/linux-how-to/host-virtualbox-docker-machine/>

作者：[Arun Pyasi](http://linoxide.com/author/arunp/) 译者：[bazz2](https://github.com/bazz2) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 中安装 Visual Studio Code

嗯，打算试试。

这 也叫安装啊,完全是编译好免安装的嘛, 别欺负我没用过

没看这篇文章前不知道有Umake这个东西

你安装 QQ 的时候是从源码开始编译安装么？编译本来就不是安装的一部分吧，安装就是复制一下可执行文件，注册一些系统变量而已，个人感觉，仅供参考

当然qq没有给你源码，但代码考虑到可移植性，会有一些不同平台地预编译指令，当然得在具体主机上编译。但windows例外，整个生态较好，下载下来用就好。

大家好，今天我们一起来学习如何在 Linux 发行版中安装 Visual Studio Code。Visual Studio Code 是基于 Electron 优化代码后的编辑器，后者是基于 Chromium 的一款软件，用于为桌面系统发布 io.js 应用。Visual Studio Code 是微软开发的支持包括 Linux 在内的全平台代码编辑器和文本编辑器。它是免费软件但不开源，在专有软件许可条款下发布。它是可以用于我们日常使用的超级强大和快速的代码编辑器。Visual Studio Code 有很多很酷的功能，例如导航、智能感知支持、语法高亮、括号匹配、自动补全、代码片段、支持自定义键盘绑定、并且支持多种语言，例如 Python、C++、Jade、PHP、XML、Batch、F#、DockerFile、Coffee Script、Java、HandleBars、 R、 Objective-C、 PowerShell、 Luna、 Visual Basic、 .Net、 Asp.Net、 C#、 JSON、 Node.js、 Javascript、 HTML、 CSS、 Less、 Sass 和 Markdown。Visual Studio Code 集成了包管理器、库、构建，以及其它通用任务，以加速日常的工作流。Visual Studio Code 中最受欢迎的是它的调试功能，它包括流式支持 Node.js 的预览调试。

注意：请注意 Visual Studio Code 只支持 64 位的 Linux 发行版。

下面是在所有 Linux 发行版中安装 Visual Studio Code 的几个简单步骤。

### 1. 下载 Visual Studio Code 软件包

首先，我们要从微软服务器中下载 64 位 Linux 操作系统的 Visual Studio Code 安装包，链接是 <http://go.microsoft.com/fwlink/?LinkID=534108>。这里我们使用 wget 下载并保存到 tmp/VSCODE 目录。

```
# mkdir /tmp/vscode; cd /tmp/vscode/
# wget https://az764295.vo.msecnd.net/public/0.3.0/VSCode-linux-x64.zip

--2015-06-24 06:02:54-- https://az764295.vo.msecnd.net/public/0.3.0/VSCode-linux-x64.zip
Resolving az764295.vo.msecnd.net (az764295.vo.msecnd.net)... 93.184.215.200, 2606:2800:11f:179a:1972:2405:35b:459
Connecting to az764295.vo.msecnd.net (az764295.vo.msecnd.net)|93.184.215.200|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 64992671 (62M) [application/octet-stream]
Saving to: ‘VSCode-linux-x64.zip’
100%[================================================>] 64,992,671 14.9MB/s in 4.1s
2015-06-24 06:02:58 (15.0 MB/s) - ‘VSCode-linux-x64.zip’ saved [64992671/64992671]

```

### 2. 提取软件包

现在，下载好 Visual Studio Code 的 zip 压缩包之后，我们打算使用 unzip 命令解压它。我们要在终端或者控制台中运行以下命令。

```
# unzip /tmp/vscode/VSCode-linux-x64.zip -d /opt/

```

注意：如果我们还没有安装 unzip，我们首先需要通过软件包管理器安装它。如果你运行的是 Ubuntu，使用 apt-get，如果运行的是 Fedora、CentOS、可以用 dnf 或 yum 安装它。

### 3. 运行 Visual Studio Code

展开软件包之后，我们可以直接运行一个名为 Code 的文件启动 Visual Studio Code。

```
# sudo chmod +x /opt/VSCode-linux-x64/Code
# sudo /opt/VSCode-linux-x64/Code

```

如果我们想通过终端在任何地方启动 Code，我们就需要创建 /opt/vscode/Code 的一个链接 /usr/local/bin/code。

```
# ln -s /opt/VSCode-linux-x64/Code /usr/local/bin/code

```

现在，我们就可以在终端中运行以下命令启动 Visual Studio Code 了。

```
# code .

```

### 4. 创建桌面启动

下一步，成功展开 Visual Studio Code 软件包之后，我们打算创建桌面启动程序，使得根据不同桌面环境能够从启动器、菜单、桌面启动它。首先我们要复制一个图标文件到 /usr/share/icons/ 目录。

```
# cp /opt/VSCode-linux-x64/resources/app/vso.png /usr/share/icons/

```

然后，我们创建一个桌面启动程序，文件扩展名为 .desktop。这里我们使用喜欢的文本编辑器在 /tmp/VSCODE/ 目录中创建名为 visualstudiocode.desktop 的文件。

```
# vi /tmp/vscode/visualstudiocode.desktop

```

然后，粘贴下面的行到那个文件中。

```
[Desktop Entry]
Name=Visual Studio Code
Comment=Multi-platform code editor for Linux
Exec=/opt/VSCode-linux-x64/Code
Icon=/usr/share/icons/vso.png
Type=Application
StartupNotify=true
Categories=TextEditor;Development;Utility;
MimeType=text/plain;

```

创建完桌面文件之后，我们会复制这个桌面文件到 /usr/share/applications/ 目录，这样启动器和菜单中就可以单击启动 Visual Studio Code 了。

```
# cp /tmp/vscode/visualstudiocode.desktop /usr/share/applications/

```

完成之后，我们可以在启动器或者菜单中启动它。

![Visual Studio Code](/data/attachment/album/201508/30/004020ztyrfejujx6uqd7u.png)

### 在 Ubuntu 中 Visual Studio Code

要在 Ubuntu 14.04/14.10/15.04 Linux 发行版中安装 Visual Studio Code，我们可以使用 Ubuntu Make 0.7。这是在 ubuntu 中安装 code 最简单的方法，因为我们只需要执行几个命令。首先，我们要在我们的 ubuntu linux 发行版中安装 Ubuntu Make 0.7。要安装它，首先要为它添加 PPA。可以通过运行下面命令完成。

```
# add-apt-repository ppa:ubuntu-desktop/ubuntu-make

This ppa proposes package backport of Ubuntu make for supported releases.
More info: https://launchpad.net/~ubuntu-desktop/+archive/ubuntu/ubuntu-make
Press [ENTER] to continue or ctrl-c to cancel adding it
gpg: keyring `/tmp/tmpv0vf24us/secring.gpg' created
gpg: keyring `/tmp/tmpv0vf24us/pubring.gpg' created
gpg: requesting key A1231595 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpv0vf24us/trustdb.gpg: trustdb created
gpg: key A1231595: public key "Launchpad PPA for Ubuntu Desktop" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
OK

```

然后，更新本地库索引并安装 ubuntu-make。

```
# apt-get update
# apt-get install ubuntu-make

```

在我们的 ubuntu 操作系统上安装完 Ubuntu Make 之后，我们可以在一个终端中运行以下命令来安装 Code。

```
# umake web visual-studio-code

```

![Umake Web Code](/data/attachment/album/201508/30/004021qhan1j1am2aqhaka.png)

运行完上面的命令之后，会要求我们输入想要的安装路径。然后，会请求我们允许在 ubuntu 系统中安装 Visual Studio Code。我们输入“a”（接受）。输入完后，它会在 ubuntu 机器上下载和安装 Code。最后，我们可以在启动器或者菜单中启动它。

### 总结

我们已经成功地在 Linux 发行版上安装了 Visual Studio Code。在所有 linux 发行版上安装 Visual Studio Code 都和上面介绍的相似，我们也可以使用 umake 在 Ubuntu 发行版中安装。Umake 是一个安装开发工具，IDEs 和语言的流行工具。我们可以用 Umake 轻松地安装 Android Studios、Eclipse 和很多其它流行 IDE。Visual Studio Code 是基于 Github 上一个叫 [Electron](https://github.com/atom/electron) 的项目，它是 [Atom.io](https://github.com/atom/atom) 编辑器的一部分。它有很多 Atom.io 编辑器没有的改进功能。当前 Visual Studio Code 只支持 64 位 linux 操作系统平台。

如果你有任何疑问、建议或者反馈，请在下面的评论框中留言以便我们改进和更新我们的内容。非常感谢！Enjoy :-)

---

via: <http://linoxide.com/linux-how-to/install-visual-studio-code-linux/>

作者：[Arun Pyasi](http://linoxide.com/author/arunp/) 译者：[ictlyh](https://github.com/ictlyh) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Ubuntu 15.04 系统中安装 Logwatch

Summary: 大家好，今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件，它也可以在各种 Linux 系统和类 Unix 系统上安装。Logwatch 是一款可定制的日志分析和日志监控报告生成系统，它可以根据一段时间的日志文件生成您所希望关注的详细报告。它具有易安装、易配置、可审查等特性，同时对其提供的数据的安全性上也有一些保障措施。Logwatch 会扫描重要的操作系统组件像 SSH、网站服务等的日志文件，然后生成用户所关心的有价值的条目汇总报告。  预安装设置 我们会使用 Ubuntu 15.04 版本的操作系统来部署 Logwatch，所以安装 Logwat

14.04lts服务器版默认不使用root登陆，安装上面的步骤安装是不能输出的，终端无显示结果

你可以 sudo su - 或者 sudo

用的su切入root，刚好比较忙，没有细致去看日志

大家好，今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件，它也可以在各种 Linux 系统和类 Unix 系统上安装。Logwatch 是一款可定制的日志分析和日志监控报告生成系统，它可以根据一段时间的日志文件生成您所希望关注的详细报告。它具有易安装、易配置、可审查等特性，同时对其提供的数据的安全性上也有一些保障措施。Logwatch 会扫描重要的操作系统组件像 SSH、网站服务等的日志文件，然后生成用户所关心的有价值的条目汇总报告。

![](/data/attachment/album/201508/30/220049aua9a6j8n110zkdz.jpg)

### 预安装设置

我们会使用 Ubuntu 15.04 版本的操作系统来部署 Logwatch，所以安装 Logwatch 之前，要确保系统上邮件服务设置是正常可用的。因为它会每天把生成的报告通过日报的形式发送邮件给管理员。您的系统的源库也应该设置可用，以便可以从通用源库来安装 Logwatch。

然后打开您 ubuntu 系统的终端，用 root 账号登陆，在进入 Logwatch 的安装操作前，先更新您的系统软件包。

```
root@ubuntu-15:~# apt-get update

```

### 安装 Logwatch

只要你的系统已经更新和已经满足前面说的先决条件，那么就可以在您的机器上输入如下命令来安装 Logwatch。

```
root@ubuntu-15:~# apt-get install logwatch

```

在安装过程中，一旦您按提示按下“Y”键同意对系统修改的话，Logwatch 将会开始安装一些额外的必须软件包。

在安装过程中会根据您机器上的邮件服务器设置情况弹出提示对 Postfix 设置的配置界面。在这篇教程中我们使用最容易的 “仅本地（Local only）” 选项。根据您的基础设施情况也可以选择其它的可选项，然后点击“确定”继续。

![Potfix Configurations](/data/attachment/album/201508/30/220111ue0j30d2yr3y7o37.png)

随后您得选择邮件服务器名，这邮件服务器名也会被其它程序使用，所以它应该是一个完全合格域名/全称域名（FQDN）。

![Postfix Setup](/data/attachment/album/201508/30/220113owntdpkwrupigriw.png)

一旦按下在 postfix 配置提示底端的 “OK”，安装进程就会用 Postfix 的默认配置来安装，并且完成 Logwatch 的整个安装。

![Logwatch Completion](/data/attachment/album/201508/30/220114epcplbirbb9br797.png)

您可以在终端下发出如下命令来检查 Logwatch 状态，正常情况下它应该是激活状态。

```
root@ubuntu-15:~# service postfix status

```

![Postfix Status](/data/attachment/album/201508/30/220116bpd60obldlbbc5h9.png)

要确认 Logwatch 在默认配置下的安装信息，可以如下示简单的发出“logwatch” 命令。

```
root@ubuntu-15:~# logwatch

```

上面执行命令的输出就是终端下编制出的报表展现格式。

![Logwatch Report](/data/attachment/album/201508/30/220117prmedmmrxgo1fdv6.png)

### 配置 Logwatch

在成功安装好 Logwatch 后，我们需要在它的配置文件中做一些修改，配置文件位于如下所示的路径。那么，就让我们用文本编辑器打开它，然后按需要做些变动。

```
root@ubuntu-15:~# vim /usr/share/logwatch/default.conf/logwatch.conf

```

**输出/格式化选项**

默认情况下 Logwatch 会以无编码的文本打印到标准输出方式。要改为以邮件为默认方式，需设置“Output = mail”，要改为保存成文件方式，需设置“Output = file”。所以您可以根据您的要求设置其默认配置。

```
Output = stdout

```

如果使用的是因特网电子邮件配置，要用 Html 格式为默认出格式，需要修改成如下行所示的样子。

```
Format = text

```

现在增加默认的邮件报告接收人地址，可以是本地账号也可以是完整的邮件地址，需要的都可以在这行上写上

```
MailTo = root
#MailTo = user@test.com

```

默认的邮件发送人可以是本地账号，也可以是您需要使用的其它名字。

```
# complete email address.
MailFrom = Logwatch

```

对这个配置文件保存修改，至于其它的参数就让它保持默认，无需改动。

**调度任务配置**

现在编辑在 “daily crons” 目录下的 “00logwatch” 文件来配置从 logwatch 生成的报告需要发送的邮件地址。

```
root@ubuntu-15:~# vim /etc/cron.daily/00logwatch

```

在这儿您需要作用“--mailto [user@test.com](mailto:user@test.com)”来替换掉“--output mail”,然后保存文件。

![Logwatch Cronjob](/data/attachment/album/201508/30/220117n44tt4gtrssxa4lj.png)

### 生成报告

现在我们在终端中执行“logwatch”命令来生成测试报告，生成的结果在终端中会以文本格式显示出来。

```
root@ubuntu-15:~#logwatch

```

生成的报告开始部分显示的是执行的时间和日期。它包含不同的部分，每个部分以开始标识开始而以结束标识结束，中间显示的是该部分的完整信息。

这儿显示的是开始的样子，它以显示系统上所有安装的软件包的部分开始，如下所示：

![dpkg status](/data/attachment/album/201508/30/220119vlell7x92w5lw6lu.png)

接下来的部分显示的日志信息是关于当前系统登录会话、rsyslogs 和当前及最近的 SSH 会话信息。

![logwatch report](/data/attachment/album/201508/30/220120ivwjdv7yyiijyc9c.png)

Logwatch 报告最后显示的是安全方面的 sudo 日志及根目录磁盘使用情况，如下示：

![Logwatch end report](/data/attachment/album/201508/30/220121czhyubunzqhi5u65.png)

您也可以打开如下的文件来查看生成的 logwatch 报告电子邮件。

```
root@ubuntu-15:~# vim /var/mail/root

```

您会看到发送给你配置的用户的所有已生成的邮件及其邮件递交状态。

### 更多详情

Logwatch 是一款很不错的工具，可以学习的很多很多，所以如果您对它的日志监控功能很感兴趣的话，也以通过如下所示的简短命令来获得更多帮助。

```
root@ubuntu-15:~# man logwatch

```

上面的命令包含所有关于 logwatch 的用户手册，所以仔细阅读，要退出手册的话可以简单的输入“q”。

关于 logwatch 命令的使用，您可以使用如下所示的帮助命令来获得更多的详细信息。

```
root@ubuntu-15:~# logwatch --help

```

### 结论

教程结束，您也学会了如何在 Ubuntu 15.04 上对 Logwatch 的安装、配置等全部设置指导。现在您就可以自定义监控您的系统日志，不管是监控所有服务的运行情况还是对特定的服务在指定的时间发送报告都可以。所以，开始使用这工具吧，无论何时有问题或想知道更多关于 logwatch 的使用的都可以给我们留言。

---

via: <http://linoxide.com/ubuntu-how-to/install-use-logwatch-ubuntu-15-04/>

作者：[Kashif Siddique](http://linoxide.com/author/kashifs/) 译者：[runningwater](https://github.com/runningwater) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


Bash 下如何逐行读取一个文件

Summary: 在 Linux 或类 UNIX 系统下如何使用 KSH 或 BASH shell 逐行读取一个文件？ 在 Linux、OSX、 *BSD 或者类 Unix 系统下你可以使用 while..do..done 的 bash 循环来逐行读取一个文件。 在 Bash Unix 或者 Linux shell 中逐行读取一个文件的语法 对于 bash、ksh、 zsh 和其他的 shells 语法如下 while read -r line; do COMMAND; done  input.file  通过 -r 选项传递给 read 命令以防止阻止解释其中的反斜杠转义符。 在 read 命令之前添加 IFS= 选项，来防止首尾的空白字符被去掉。 while IFS= read -r line; do COMMAND_on $line; done

在 Linux 或类 UNIX 系统下如何使用 KSH 或 BASH shell 逐行读取一个文件？

在 Linux、OSX、 \*BSD 或者类 Unix 系统下你可以使用 while..do..done 的 bash 循环来逐行读取一个文件。

### 在 Bash Unix 或者 Linux shell 中逐行读取一个文件的语法

对于 bash、ksh、 zsh 和其他的 shells 语法如下

```
while read -r line; do COMMAND; done < input.file

```

通过 -r 选项传递给 read 命令以防止阻止解释其中的反斜杠转义符。

在 read 命令之前添加 `IFS=` 选项，来防止首尾的空白字符被去掉。

```
while IFS= read -r line; do COMMAND_on $line; done < input.file

```

这是更适合人类阅读的语法:

```
#!/bin/bash
input="/path/to/txt/file"
while IFS= read -r var
do
  echo "$var"
done < "$input"

```

**示例**

下面是一些例子:

```
#!/bin/ksh
file="/home/vivek/data.txt"
while IFS= read line
do
    # display $line or do somthing with $line
    echo "$line"
done <"$file"

```

在 bash shell 中相同的例子:

```
#!/bin/bash
file="/home/vivek/data.txt"
while IFS= read -r line
do
    # display $line or do somthing with $line
    printf '%s\n' "$line"
done <"$file"

```

你还可以看看这个更好的:

```
#!/bin/bash
file="/etc/passwd"
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
    # display fields using f1, f2,..,f7
    printf 'Username: %s, Shell: %s, Home Dir: %s\n' "$f1" "$f7" "$f6"
done <"$file"

```

示例输出:

![Fig.01: Bash shell scripting- read file line by line demo outputs](/data/attachment/album/201508/31/100655ossrheluxqrrfhrr.jpg)

*图01：Bash 脚本：读取文件并逐行输出文件*

### Bash 脚本：逐行读取文本文件并创建为 pdf 文件

我的输入文件如下（faq.txt）:

```
4|http://www.cyberciti.biz/faq/mysql-user-creation/|Mysql User Creation: Setting Up a New MySQL User Account
4096|http://www.cyberciti.biz/faq/ksh-korn-shell/|What is UNIX / Linux Korn Shell?
4101|http://www.cyberciti.biz/faq/what-is-posix-shell/|What Is POSIX Shell?
17267|http://www.cyberciti.biz/faq/linux-check-battery-status/|Linux: Check Battery Status Command
17245|http://www.cyberciti.biz/faq/restarting-ntp-service-on-linux/|Linux Restart NTPD Service Command
17183|http://www.cyberciti.biz/faq/ubuntu-linux-determine-your-ip-address/|Ubuntu Linux: Determine Your IP Address
17172|http://www.cyberciti.biz/faq/determine-ip-address-of-linux-server/|HowTo: Determine an IP Address My Linux Server
16510|http://www.cyberciti.biz/faq/unix-linux-restart-php-service-command/|Linux / Unix: Restart PHP Service Command
8292|http://www.cyberciti.biz/faq/mounting-harddisks-in-freebsd-with-mount-command/|FreeBSD: Mount Hard Drive / Disk Command
8190|http://www.cyberciti.biz/faq/rebooting-solaris-unix-server/|Reboot a Solaris UNIX System

```

我的 bash 脚本:

```
#!/bin/bash
# Usage: Create pdf files from input (wrapper script)
# Author: Vivek Gite <Www.cyberciti.biz> under GPL v2.x+
#---------------------------------------------------------

#Input file
_db="/tmp/wordpress/faq.txt"

#Output location
o="/var/www/prviate/pdf/faq"

_writer="~/bin/py/pdfwriter.py"

# If file exists
if [[ -f "$_db" ]]
then
    # read it
    while IFS='|' read -r pdfid pdfurl pdftitle
    do
        local pdf="$o/$pdfid.pdf"
        echo "Creating $pdf file ..."
    #Genrate pdf file
        $_writer --quiet --footer-spacing 2 \
        --footer-left "nixCraft is GIT UL++++ W+++ C++++ M+ e+++ d-" \
        --footer-right "Page [page] of [toPage]" --footer-line \
        --footer-font-size 7 --print-media-type "$pdfurl" "$pdf"
    done <"$_db"
fi

```

### 技巧：从 bash 变量中读取

让我们看看如何在 Debian 或者 Ubuntu Linux 下列出所有安装过的 php 包，请输入：

```
# 我将输出内容赋值到一个变量名为 $list中 #

list=$(dpkg --list php\* | awk '/ii/{print $2}')
printf '%s\n' "$list"

```

示例输出:

```
php-pear
php5-cli
php5-common
php5-fpm
php5-gd
php5-json
php5-memcache
php5-mysql
php5-readline
php5-suhosin-extension

```

你现在可以从 $list 中看到它们，并安装这些包：

```
#!/bin/bash
# BASH can iterate over $list variable using a "here string" #
while IFS= read -r pkg
do
    printf 'Installing php package %s...\n' "$pkg"
    /usr/bin/apt-get -qq install $pkg
done <<< "$list"
printf '*** Do not forget to run php5enmod and restart the server (httpd or php5-fpm) ***\n'

```

示例输出:

```
Installing php package php-pear...
Installing php package php5-cli...
Installing php package php5-common...
Installing php package php5-fpm...
Installing php package php5-gd...
Installing php package php5-json...
Installing php package php5-memcache...
Installing php package php5-mysql...
Installing php package php5-readline...
Installing php package php5-suhosin-extension...

*** Do not forget to run php5enmod and restart the server (httpd or php5-fpm) ***

```

---

via: <http://www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/>

作者： VIVEK GIT 译者：[strugglingyouth](https://github.com/strugglingyouth) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


Alien 魔法：RPM 和 DEB 互转

Summary: 正如我确信，你们一定知道Linux下的多种软件安装方式：使用发行版所提供的包管理系统（aptitude，yum，或者zypper，还可以举很多例子），从源码编译（尽管现在很少用了，但在Linux发展早期却是唯一可用的方法），或者使用各自的低级工具dpkg用于.deb，以及rpm用于.rpm，预编译包，如此这般。  使用Alien将RPM转换成DEB以及将DEB转换成RPM 在本文中，我们将为你介绍alien，一个用于在各种不同的Linux包格式相互转换的工具，其最常见的用法是将.rpm转换成.deb（或者反过来）。 如果你需要某个特定类型的包，而你只能找到其它格式的包的时候

再貼一次我自己的方案針對 RPM 系系統安裝 deb 包

1. 安裝 dpkg

2. sudo mkdir /opt/ubu

3. sudo dpkg-deb --raw-extract debFIle /opt/ubu

4. 最後執行自制腳本 sudo ./install_deb /opt/ubu 來建立符號鏈接到系統目錄，比如 /usr/bin /usr/share

5. 如果用的是 ArchLinux 的包，直接用 tar 解壓.

後面的回覆是腳本 install_deb

#!/bin/bash

if [ -z "$1" -o ! -d "$1" ]; then

        echo "installation source path not found"

        exit 1

fi

find "$1" -type f -iname *.deb -print | xargs -I [] dpkg-deb --raw-extract "[]" /opt/ubu

# chown --recursive root:root /opt/ubu

if [ ! -f /DEBIAN ]; then

  touch /DEBIAN

fi

if [ ! -d /usr/lib/x86_64-linux-gnu ]; then

  ln -s /usr/lib64 /usr/lib/x86_64-linux-gnu

fi

IFS_backup=$IFS

IFS=$'\n'

for d in $(find /opt/ubu -type d -print | sed 's/^\/opt\/ubu//');

do

    if [ ! -d "$d" ]; then

      ln -s "/opt/ubu$d" "$d"

    fi;

done

IFS=$IFS_backup

find /opt/ubu -type f -print | sed 's/\/opt\/ubu//' | xargs -I [] ln -s "/opt/ubu[]" "[]"

find /opt/ubu -type l -print | sed 's/\/opt\/ubu//' | xargs -I [] ln -s "/opt/ubu[]" "[]"

find /opt/ubu -type b -print | sed 's/\/opt\/ubu//' | xargs -I [] ln -s "/opt/ubu[]" "[]"

find /opt/ubu -type c -print | sed 's/\/opt\/ubu

find /opt/ubu -type c -print | sed 's/\/opt\/ubu//' | xargs -I [] ln -s "/opt/ubu[]" "[]"

find /opt/ubu -type p -print | sed 's/\/opt\/ubu//' | xargs -I [] ln -s "/opt/ubu[]" "[]"

find /opt/ubu -type s -print | sed 's/\/opt\/ubu//' | xargs -I [] ln -s "/opt/ubu[]" "[]"

ldconfig

這種方法的弊端， 是依賴包要自己下，先要找已有系統倉庫有包不，如果有文件名是否符合要求，倉庫沒有而用其他系統的，後期更新是大麻煩。也可能存在某個文件依賴文件的版本同系統已有存在衝突。如果包安裝要執行腳本，這個方法也不行。

不如整理一份比较详尽的文章，投稿给我？

正如我确信，你们一定知道Linux下的多种软件安装方式：使用发行版所提供的包管理系统（[aptitude，yum，或者zypper](http://www.tecmint.com/linux-package-management/)，还可以举很多例子），从源码编译（尽管现在很少用了，但在Linux发展早期却是唯一可用的方法），或者使用各自的低级工具dpkg用于.deb，以及rpm用于.rpm，预编译包，如此这般。

![Convert RPM to DEB and DEB to RPM](/data/attachment/album/201508/31/104518y660t6ggg4g0g14n.png)

*使用Alien将RPM转换成DEB以及将DEB转换成RPM*

在本文中，我们将为你介绍alien，一个用于在各种不同的Linux包格式相互转换的工具，其最常见的用法是将.rpm转换成.deb（或者反过来）。

如果你需要某个特定类型的包，而你只能找到其它格式的包的时候，该工具迟早能派得上用场——即使是其作者不再维护，并且在其网站声明：alien将可能永远维持在实验状态。

例如，有一次，我正查找一个用于喷墨打印机的.deb驱动，但是却没有找到——生产厂家只提供.rpm包，这时候alien拯救了我。我安装了alien，将包进行转换，不久之后我就可以使用我的打印机了，没有任何问题。

即便如此，我们也必须澄清一下，这个工具不应当用来转换重要的系统文件和库，因为它们在不同的发行版中有不同的配置。只有在前面说的那种情况下所建议的安装方法根本不适合时，alien才能作为最后手段使用。

最后一项要点是，我们必须注意，虽然我们在本文中使用CentOS和Debian，除了前两个发行版及其各自的家族体系外，据我们所知，alien可以工作在Slackware中，甚至Solaris中。

### 步骤1：安装Alien及其依赖包

要安装alien到CentOS/RHEL 7中，你需要启用EPEL和Nux Dextop（是的，是Dextop——不是Desktop）仓库，顺序如下：

```
# yum install epel-release

```

启用Nux Dextop仓库的包的当前最新版本是0.5（2015年8月10日发布），在安装之前你可以查看<http://li.nux.ro/download/nux/dextop/el7/x86_64/>上是否有更新的版本。

```
# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

```

然后再做，

```
# yum update && yum install alien

```

在Fedora中，你只需要运行上面的命令即可。

在Debian及其衍生版中，只需要：

```
# aptitude install alien

```

### 步骤2：将.deb转换成.rpm包

对于本次测试，我们选择了date工具，它提供了一系列日期和时间工具用于处理大量金融数据。我们将下载.deb包到我们的CentOS 7机器中，将它转换成.rpm并安装：

![Check CentOS Version](/data/attachment/album/201508/31/104519xaor8xkaghsaypgk.png)

检查CentOS版本

```
# cat /etc/centos-release
# wget http://ftp.us.debian.org/debian/pool/main/d/dateutils/dateutils_0.3.1-1.1_amd64.deb
# alien --to-rpm --scripts dateutils_0.3.1-1.1_amd64.deb

```

![Convert .deb to .rpm package in Linux](/data/attachment/album/201508/31/104520pb6o22boocmdlolr.png)

*在Linux中将.deb转换成.rpm*

**重要**：（请注意alien是怎样来增加目标包的次版本号的。如果你想要无视该行为，请添加-keep-version标识）。

如果我们尝试马上安装该包，我们将碰到些许问题：

```
# rpm -Uvh dateutils-0.3.1-2.1.x86_64.rpm

```

![Install RPM Package](/data/attachment/album/201508/31/104521q72wccborsro7w73.png)

*安装RPM包*

要解决该问题，我们需要启用epel-testing仓库，然后安装rpmbuild工具来编辑该包的配置以重建包：

```
# yum --enablerepo=epel-testing install rpmrebuild

```

然后运行，

```
# rpmrebuild -pe dateutils-0.3.1-2.1.x86_64.rpm

```

它会打开你的默认文本编辑器。请转到`%files`章节并删除涉及到错误信息中提到的目录的行，然后保存文件并退出：

![Convert .deb to Alien Version](/data/attachment/album/201508/31/104521czr1o8i6888386zl.png)

*转换.deb到Alien版*

但你退出该文件后，将提示你继续去重构。如果你选择“Y”，该文件会重构到指定的目录（与当前工作目录不同）：

```
# rpmrebuild –pe dateutils-0.3.1-2.1.x86_64.rpm

```

![Build RPM Package](/data/attachment/album/201508/31/104522xba5dd2i9b5b29r9.png)

*构建RPM包*

现在你可以像以往一样继续来安装包并验证：

```
# rpm -Uvh /root/rpmbuild/RPMS/x86_64/dateutils-0.3.1-2.1.x86_64.rpm
# rpm -qa | grep dateutils

```

![Install Build RPM Package](/data/attachment/album/201508/31/104522y9bbsa17u7gj6bab.png)

*安装构建RPM包*

最后，你可以列出date工具包含的各个工具，也可以查看各自的手册页：

```
# ls -l /usr/bin | grep dateutils

```

![Verify Installed RPM Package](/data/attachment/album/201508/31/104523m66lcrfccfruvr00.png)

*验证安装的RPM包*

### 步骤3：将.rpm转换成.deb包

在本节中，我们将演示如何将.rpm转换成.deb。在一台32位的Debian Wheezy机器中，让我们从CentOS 6操作系统仓库中下载用于zsh shell的.rpm包。注意，该shell在Debian及其衍生版的默认安装中是不可用的。

```
# cat /etc/shells
# lsb_release -a | tail -n 4

```

![Check Shell and Debian OS Version](/data/attachment/album/201508/31/104525ph2lb8k8bkypk7hu.png)

*检查Shell和Debian操作系统版本*

```
# wget http://mirror.centos.org/centos/6/os/i386/Packages/zsh-4.3.11-4.el6.centos.i686.rpm
# alien --to-deb --scripts zsh-4.3.11-4.el6.centos.i686.rpm

```

你可以安全地无视关于签名丢失的信息：

![Convert .rpm to .deb Package](/data/attachment/album/201508/31/104527bxcbf7i5ywx5yihb.png)

*将.rpm转换成.deb包*

过了一会儿后，.deb包应该已经生成，并可以安装了：

```
# dpkg -i zsh_4.3.11-5_i386.deb

```

![Install RPM Converted Deb Package](/data/attachment/album/201508/31/104527jem8q1jrpxjiqptl.png)

*安装RPM转换来的Deb包*

安装完后，你看看可以zsh是否添加到了合法shell列表中：

```
# cat /etc/shells

```

![Confirm Installed Zsh Package](/data/attachment/album/201508/31/104527iiywm1ew8rjw09s1.png)

*确认安装的Zsh包*

### 小结

在本文中，我们已经解释了如何将.rpm转换成.deb及其反向转换，这可以作为这类程序不能从仓库中或者作为可分发源代码获得的最后安装手段。你一定想要将本文添加到书签中，因为我们都需要alien。

请自由分享你关于本文的想法，写到下面的表单中吧。

---

via: <http://www.tecmint.com/convert-from-rpm-to-deb-and-deb-to-rpm-package-using-alien/>

作者：[Gabriel Cánepa](http://www.tecmint.com/author/gacanepa/) 译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 下使用 RAID（五）：安装 RAID 6（条带化双分布式奇偶校验）

Summary: RAID 6 是 RAID 5 的升级版，它有两个分布式奇偶校验，即使两个磁盘发生故障后依然有容错能力。在两个磁盘同时发生故障时，系统的关键任务仍然能运行。它与 RAID 5 相似，但性能更健壮，因为它多用了一个磁盘来进行奇偶校验。 在之前的文章中，我们已经在 RAID 5 看了分布式奇偶校验，但在本文中，我们将看到的是 RAID 6 双分布式奇偶校验。不要期望比其他 RAID 有更好的性能，除非你也安装了一个专用的 RAID 控制器。在 RAID 6 中，即使我们失去了2个磁盘，我们仍可以通过更换磁盘，从校验中构建数据，然后取回数据。  在 Linux 中安装 R

哈哈～～我终于看到RAID 6了！！<br />
赞一个！

来自日本的 Internet Explorer 11.0|Windows 8.1 用户

RAID 6 是 RAID 5 的升级版，它有两个分布式奇偶校验，即使两个磁盘发生故障后依然有容错能力。在两个磁盘同时发生故障时，系统的关键任务仍然能运行。它与 RAID 5 相似，但性能更健壮，因为它多用了一个磁盘来进行奇偶校验。

在之前的文章中，我们已经在 RAID 5 看了分布式奇偶校验，但在本文中，我们将看到的是 RAID 6 双分布式奇偶校验。不要期望比其他 RAID 有更好的性能，除非你也安装了一个专用的 RAID 控制器。在 RAID 6 中，即使我们失去了2个磁盘，我们仍可以通过更换磁盘，从校验中构建数据，然后取回数据。

![Setup RAID 6 in CentOS](/data/attachment/album/201508/31/155102zhhhwnlh2u6lhlnl.jpg)

*在 Linux 中安装 RAID 6*

要建立一个 RAID 6，一组最少需要4个磁盘。RAID 6 甚至在有些组中会有更多磁盘，这样将多个硬盘捆在一起，当读取数据时，它会同时从所有磁盘读取，所以读取速度会更快，当写数据时，因为它要将数据写在条带化的多个磁盘上，所以性能会较差。

现在，很多人都在讨论为什么我们需要使用 RAID 6，它的性能和其他 RAID 相比并不太好。提出这个问题首先需要知道的是，如果需要高容错性就选择 RAID 6。在每一个用于数据库的高可用性要求较高的环境中，他们需要 RAID 6 因为数据库是最重要，无论花费多少都需要保护其安全，它在视频流环境中也是非常有用的。

#### RAID 6 的的优点和缺点

* 性能不错。
* RAID 6 比较昂贵，因为它要求两个独立的磁盘用于奇偶校验功能。
* 将失去两个磁盘的容量来保存奇偶校验信息（双奇偶校验）。
* 即使两个磁盘损坏，数据也不会丢失。我们可以在更换损坏的磁盘后从校验中重建数据。
* 读性能比 RAID 5 更好，因为它从多个磁盘读取，但对于没有专用的 RAID 控制器的设备写性能将非常差。

#### 要求

要创建一个 RAID 6 最少需要4个磁盘。你也可以添加更多的磁盘，但你必须有专用的 RAID 控制器。使用软件 RAID 我们在 RAID 6 中不会得到更好的性能，所以我们需要一个物理 RAID 控制器。

如果你新接触 RAID 设置，我们建议先看完以下 RAID 文章。

* [介绍 RAID 的级别和概念](/article-6085-1.html)
* [使用 mdadm 工具创建软件 RAID 0 （条带化）](/article-6087-1.html)
* [用两块磁盘创建 RAID 1（镜像）](/article-6093-1.html)
* [创建 RAID 5（条带化与分布式奇偶校验）](/article-6102-1.html)

#### 我的服务器设置

```
操作系统 :  CentOS 6.5 Final
IP 地址    :  192.168.0.228
主机名    :  rd6.tecmintlocal.com
磁盘 1 [20GB]  :  /dev/sdb
磁盘 2 [20GB]  :  /dev/sdc
磁盘 3 [20GB]  :  /dev/sdd
磁盘 4 [20GB]  :  /dev/sde

```

这是9篇系列教程的第5部分，在这里我们将看到如何在 Linux 系统或者服务器上使用四个 20GB 的磁盘（名为 /dev/sdb、 /dev/sdc、 /dev/sdd 和 /dev/sde）创建和设置软件 RAID 6 （条带化双分布式奇偶校验）。

### 第1步：安装 mdadm 工具，并检查磁盘

1、 如果你按照我们最进的两篇 RAID 文章（第2篇和第3篇），我们已经展示了如何安装`mdadm`工具。如果你直接看的这篇文章，我们先来解释下在 Linux 系统中如何使用`mdadm`工具来创建和管理 RAID，首先根据你的 Linux 发行版使用以下命令来安装。

```
# yum install mdadm     [在 RedHat 系统]
# apt-get install mdadm     [在 Debain 系统]

```

2、 安装该工具后，然后来验证所需的四个磁盘，我们将会使用下面的`fdisk`命令来检查用于创建 RAID 的磁盘。

```
# fdisk -l | grep sd

```

![Check Hard Disk in Linux](/data/attachment/album/201508/31/155104nggs3s38fbqufq6o.png)

*在 Linux 中检查磁盘*

3、 在创建 RAID 磁盘前，先检查下我们的磁盘是否创建过 RAID 分区。

```
# mdadm -E /dev/sd[b-e]
# mdadm --examine /dev/sdb /dev/sdc /dev/sdd /dev/sde # 或

```

![Check Raid on Disk](/data/attachment/album/201508/31/155109xail6i1omli2211b.png)

*在磁盘上检查 RAID 分区*

**注意**: 在上面的图片中，没有检测到任何 super-block 或者说在四个磁盘上没有 RAID 存在。现在我们开始创建 RAID 6。

### 第2步：为 RAID 6 创建磁盘分区

4、 现在在 `/dev/sdb`, `/dev/sdc`, `/dev/sdd` 和 `/dev/sde`上为 RAID 创建分区，使用下面的 fdisk 命令。在这里，我们将展示如何在 sdb 磁盘创建分区，同样的步骤也适用于其他分区。

**创建 /dev/sdb 分区**

```
# fdisk /dev/sdb

```

请按照说明进行操作，如下图所示创建分区。

* 按 `n`创建新的分区。
* 然后按 `P` 选择主分区。
* 接下来选择分区号为1。
* 只需按两次回车键选择默认值即可。
* 然后，按 `P` 来打印创建好的分区。
* 按 `L`，列出所有可用的类型。
* 按 `t` 去修改分区。
* 键入 `fd` 设置为 Linux 的 RAID 类型，然后按回车确认。
* 然后再次使用`p`查看我们所做的更改。
* 使用`w`保存更改。

![Create sdb Partition](/data/attachment/album/201508/31/155113dpzpm7seeevheu2m.png)

*创建 /dev/sdb 分区*

**创建 /dev/sdc 分区**

```
# fdisk /dev/sdc

```

![Create sdc Partition](/data/attachment/album/201508/31/155118a9p104t94tgdvq09.png)

*创建 /dev/sdc 分区*

**创建 /dev/sdd 分区**

```
# fdisk /dev/sdd

```

![Create sdd Partition](/data/attachment/album/201508/31/155121d0wawwy0xbw0jz45.png)

*创建 /dev/sdd 分区*

**创建 /dev/sde 分区**

```
# fdisk /dev/sde

```

![Create sde Partition](/data/attachment/album/201508/31/155125ne7ub73ycb233lij.png)

*创建 /dev/sde 分区*

5、 创建好分区后，检查磁盘的 super-blocks 是个好的习惯。如果 super-blocks 不存在我们可以按前面的创建一个新的 RAID。

```
# mdadm -E /dev/sd[b-e]1
# mdadm --examine /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 # 或

```

![Check Raid on New Partitions](/data/attachment/album/201508/31/155126mysvdaqmysdsqda1.png)

\*在新分区中检查 RAID \*

### 第3步：创建 md 设备（RAID）

6、 现在可以使用以下命令创建 RAID 设备`md0` （即 /dev/md0），并在所有新创建的分区中应用 RAID 级别，然后确认 RAID 设置。

```
# mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# cat /proc/mdstat

```

![Create Raid 6 Device](/data/attachment/album/201508/31/155128h94u4tx9vxywvtxh.png)

*创建 Raid 6 设备*

7、 你还可以使用 watch 命令来查看当前创建 RAID 的进程，如下图所示。

```
# watch -n1 cat /proc/mdstat

```

![Check Raid 6 Process](/data/attachment/album/201508/31/155128un714551q7nqquw4.png)

*检查 RAID 6 创建过程*

8、 使用以下命令验证 RAID 设备。

```
# mdadm -E /dev/sd[b-e]1

```

**注意**::上述命令将显示四个磁盘的信息，这是相当长的，所以没有截取其完整的输出。

9、 接下来，验证 RAID 阵列，以确认重新同步过程已经开始。

```
# mdadm --detail /dev/md0

```

![Check Raid 6 Array](/data/attachment/album/201508/31/155131pb51cm5bcrz25er5.png)

*检查 Raid 6 阵列*

### 第4步：在 RAID 设备上创建文件系统

10、 使用 ext4 为`/dev/md0`创建一个文件系统，并将它挂载在 /mnt/raid6 。这里我们使用的是 ext4，但你可以根据你的选择使用任意类型的文件系统。

```
# mkfs.ext4 /dev/md0

```

![Create File System on Raid](/data/attachment/album/201508/31/155134h5co65n656433cmn.png)

*在 RAID 6 上创建文件系统*

11、 将创建的文件系统挂载到 /mnt/raid6，并验证挂载点下的文件，我们可以看到 lost+found 目录。

```
# mkdir /mnt/raid6
# mount /dev/md0 /mnt/raid6/
# ls -l /mnt/raid6/

```

12、 在挂载点下创建一些文件，在任意文件中添加一些文字并验证其内容。

```
# touch /mnt/raid6/raid6_test.txt
# ls -l /mnt/raid6/
# echo "tecmint raid setups" > /mnt/raid6/raid6_test.txt
# cat /mnt/raid6/raid6_test.txt

```

![Verify Raid Content](/data/attachment/album/201508/31/155136m5019d20c0b5f9wh.png)

*验证 RAID 内容*

13、 在 /etc/fstab 中添加以下条目使系统启动时自动挂载设备，操作系统环境不同挂载点可能会有所不同。

```
# vim /etc/fstab

/dev/md0                /mnt/raid6              ext4    defaults        0 0

```

![Automount Raid 6 Device](/data/attachment/album/201508/31/155138wcfizczrk7f7pi2o.png)

*自动挂载 RAID 6 设备*

14、 接下来，执行`mount -a`命令来验证 fstab 中的条目是否有错误。

```
# mount -av

```

![Verify Raid Automount](/data/attachment/album/201508/31/155139s0y4virc9k0w6cwc.png)

*验证 RAID 是否自动挂载*

### 第5步：保存 RAID 6 的配置

15、 请注意，默认情况下 RAID 没有配置文件。我们需要使用以下命令手动保存它，然后检查设备`/dev/md0`的状态。

```
# mdadm --detail --scan --verbose >> /etc/mdadm.conf
# cat /etc/mdadm.conf
# mdadm --detail /dev/md0

```

![Save Raid 6 Configuration](/data/attachment/album/201508/31/155142fxwvu134f84ghv4f.png)

*保存 RAID 6 配置*

![Check Raid 6 Status](/data/attachment/album/201508/31/155142fxwvu134f84ghv4f.png)

*检查 RAID 6 状态*

### 第6步：添加备用磁盘

16、 现在，已经使用了4个磁盘，并且其中两个作为奇偶校验信息来使用。在某些情况下，如果任意一个磁盘出现故障，我们仍可以得到数据，因为在 RAID 6 使用双奇偶校验。

如果第二个磁盘也出现故障，在第三块磁盘损坏前我们可以添加一个新的。可以在创建 RAID 集时加入一个备用磁盘，但我在创建 RAID 集合前没有定义备用的磁盘。不过，我们可以在磁盘损坏后或者创建 RAID 集合时添加一块备用磁盘。现在，我们已经创建好了 RAID，下面让我演示如何添加备用磁盘。

为了达到演示的目的，我已经热插入了一个新的 HDD 磁盘（即 /dev/sdf），让我们来验证接入的磁盘。

```
# ls -l /dev/ | grep sd

```

![Check New Disk](/data/attachment/album/201508/31/155145aiwjm64fhs6sedkh.png)

*检查新磁盘*

17、 现在再次确认新连接的磁盘没有配置过 RAID ，使用 mdadm 来检查。

```
# mdadm --examine /dev/sdf

```

![Check Raid on New Disk](/data/attachment/album/201508/31/155146uasasfvig88v8za6.png)

*在新磁盘中检查 RAID*

**注意**: 像往常一样，我们早前已经为四个磁盘创建了分区，同样，我们使用 fdisk 命令为新插入的磁盘创建新分区。

```
# fdisk /dev/sdf

```

![Create sdf Partition](/data/attachment/album/201508/31/155151lr3zr33q0523u0x3.png)

*为 /dev/sdf 创建分区*

18、 在 /dev/sdf 创建新的分区后，在新分区上确认没有 RAID，然后将备用磁盘添加到 RAID 设备 /dev/md0 中，并验证添加的设备。

```
# mdadm --examine /dev/sdf
# mdadm --examine /dev/sdf1
# mdadm --add /dev/md0 /dev/sdf1
# mdadm --detail /dev/md0

```

![Verify Raid on sdf Partition](/data/attachment/album/201508/31/155152ukhd5zck5h1mubmc.png)

*在 sdf 分区上验证 Raid*

![Add sdf Partition to Raid](/data/attachment/album/201508/31/155153vzjnm6keptpljlee.png)

\*添加 sdf 分区到 RAID \*

![Verify sdf Partition Details](/data/attachment/album/201508/31/155155w14aezgsphje4hc9.png)

*验证 sdf 分区信息*

### 第7步：检查 RAID 6 容错

19、 现在，让我们检查备用驱动器是否能自动工作，当我们阵列中的任何一个磁盘出现故障时。为了测试，我将一个磁盘手工标记为故障设备。

在这里，我们标记 /dev/sdd1 为故障磁盘。

```
# mdadm --manage --fail /dev/md0 /dev/sdd1

```

![Check Raid 6 Fault Tolerance](/data/attachment/album/201508/31/155156ugt64vi3gaz3m98q.png)

*检查 RAID 6 容错*

20、 让我们查看 RAID 的详细信息，并检查备用磁盘是否开始同步。

```
# mdadm --detail /dev/md0

```

![Check Auto Raid Syncing](/data/attachment/album/201508/31/155202rh713mg01zrhhfhl.png)

*检查 RAID 自动同步*

**哇塞!** 这里，我们看到备用磁盘激活了，并开始重建进程。在底部，我们可以看到有故障的磁盘 /dev/sdd1 标记为 faulty。可以使用下面的命令查看进程重建。

```
# cat /proc/mdstat

```

![Raid 6 Auto Syncing](/data/attachment/album/201508/31/155204iikvi3req3aqpk2i.png)

*RAID 6 自动同步*

### 结论:

在这里，我们看到了如何使用四个磁盘设置 RAID 6。这种 RAID 级别是具有高冗余的昂贵设置之一。在接下来的文章中，我们将看到如何建立一个嵌套的 RAID 10 甚至更多。请继续关注。

---

via: <http://www.tecmint.com/create-raid-6-in-linux/>

作者：[Babin Lonston](http://www.tecmint.com/author/babinlonston/) 译者：[strugglingyouth](https://github.com/strugglingyouth) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 下使用 RAID（六）：设置 RAID 10 或 1 + 0（嵌套）

Summary: RAID 10 是组合 RAID 1 和 RAID 0 形成的。要设置 RAID 10，我们至少需要4个磁盘。在之前的文章中，我们已经看到了如何使用最少两个磁盘设置 RAID 1 和 RAID 0。 在这里，我们将使用最少4个磁盘组合 RAID 1 和 RAID 0 来设置 RAID 10。假设我们已经在用 RAID 10 创建的逻辑卷保存了一些数据。比如我们要保存数据 TECMINT，它将使用以下方法将其保存在4个磁盘中。  在 Linux 中创建 Raid 10（LCTT 译注：此图有误，请参照文字说明和本系列第一篇文章） RAID 10 是先做镜像，再做条带。因此，在 RAID 1 中，相同的数据将被写入到两个磁盘中

可以在一块80G的磁盘上，分4个20G的分区来高么？

可以的。

可一个头当四个头去读写数据，会伤硬盘么？

不可以吧，你一个硬盘的IO是有限制的，就算弄得出来，你也就是在一个硬盘去读写，性能会高吗

RAID 10 是组合 RAID 1 和 RAID 0 形成的。要设置 RAID 10，我们至少需要4个磁盘。在之前的文章中，我们已经看到了如何使用最少两个磁盘设置 RAID 1 和 RAID 0。

在这里，我们将使用最少4个磁盘组合 RAID 1 和 RAID 0 来设置 RAID 10。假设我们已经在用 RAID 10 创建的逻辑卷保存了一些数据。比如我们要保存数据 “TECMINT”，它将使用以下方法将其保存在4个磁盘中。

![](/data/attachment/album/201509/01/093619iqwblqd9od94goq3.jpg)

*在 Linux 中创建 Raid 10（LCTT 译注：原图有误，已修正）*

RAID 10 是先做镜像，再做条带。因此，在 RAID 1 中，相同的数据将被写入到两个磁盘中，“T”将同时被写入到第一和第二个磁盘中。接着的数据被条带化到另外两个磁盘，“E”将被同时写入到第三和第四个磁盘中。它将继续循环此过程，“C”将同时被写入到第一和第二个磁盘，以此类推。

（LCTT 译注：原文中此处描述混淆有误，已经根据实际情况进行修改。）

现在你已经了解 RAID 10 怎样组合 RAID 1 和 RAID 0 来工作的了。如果我们有4个20 GB 的磁盘，总共为 80 GB，但我们将只能得到40 GB 的容量，另一半的容量在构建 RAID 10 中丢失。

#### RAID 10 的优点和缺点

* 提供更好的性能。
* 在 RAID 10 中我们将失去一半的磁盘容量。
* 读与写的性能都很好，因为它会同时进行写入和读取。
* 它能解决数据库的高 I/O 磁盘写操作。

#### 要求

在 RAID 10 中，我们至少需要4个磁盘，前2个磁盘为 RAID 1，其他2个磁盘为 RAID 0，就像我之前说的，RAID 10 仅仅是组合了 RAID 0和1。如果我们需要扩展 RAID 组，最少需要添加4个磁盘。

**我的服务器设置**

```
操作系统 :  CentOS 6.5 Final
IP 地址       :   192.168.0.229
主机名       :   rd10.tecmintlocal.com
磁盘 1 [20GB]     :   /dev/sdd
磁盘 2 [20GB]     :   /dev/sdc
磁盘 3 [20GB]     :   /dev/sdd
磁盘 4 [20GB]     :   /dev/sde

```

有两种方法来设置 RAID 10，在这里两种方法我都会演示，但我更喜欢第一种方法，使用它来设置 RAID 10 更简单。

### 方法1：设置 RAID 10

1、 首先，使用以下命令确认所添加的4块磁盘没有被使用。

```
# ls -l /dev | grep sd

```

2、 四个磁盘被检测后，然后来检查磁盘是否存在 RAID 分区。

```
# mdadm -E /dev/sd[b-e]
# mdadm --examine /dev/sdb /dev/sdc /dev/sdd /dev/sde # 或

```

![Verify 4 Added Disks](/data/attachment/album/201508/31/215613nikikwi6spexzw5o.png)

*验证添加的4块磁盘*

**注意**: 在上面的输出中，如果没有检测到 super-block 意味着在4块磁盘中没有定义过 RAID。

#### 第1步：为 RAID 分区

3、 现在，使用`fdisk`，命令为4个磁盘(/dev/sdb, /dev/sdc, /dev/sdd 和 /dev/sde)创建新分区。

```
# fdisk /dev/sdb
# fdisk /dev/sdc
# fdisk /dev/sdd
# fdisk /dev/sde

```

##### 为 /dev/sdb 创建分区

我来告诉你如何使用 fdisk 为磁盘(/dev/sdb)进行分区，此步也适用于其他磁盘。

```
# fdisk /dev/sdb

```

请使用以下步骤为 /dev/sdb 创建一个新的分区。

* 按 `n` 创建新的分区。
* 然后按 `P` 选择主分区。
* 接下来选择分区号为1。
* 只需按两次回车键选择默认值即可。
* 然后，按 `P` 来打印创建好的分区。
* 按 `L`，列出所有可用的类型。
* 按 `t` 去修改分区。
* 键入 `fd` 设置为 Linux 的 RAID 类型，然后按 Enter 确认。
* 然后再次使用`p`查看我们所做的更改。
* 使用`w`保存更改。

![Disk sdb Partition](/data/attachment/album/201508/31/215615dt03b402t4n42c4h.png)

*为磁盘 sdb 分区*

**注意**: 请使用上面相同的指令对其他磁盘(sdc, sdd sdd sde)进行分区。

4、 创建好4个分区后，需要使用下面的命令来检查磁盘是否存在 raid。

```
# mdadm -E /dev/sd[b-e]
# mdadm --examine /dev/sdb /dev/sdc /dev/sdd /dev/sde # 或

# mdadm -E /dev/sd[b-e]1
# mdadm --examine /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 # 或

```

![Check All Disks for Raid](/data/attachment/album/201508/31/215616vp4p39dip8xkkuck.png)

*检查磁盘*

**注意**: 以上输出显示，新创建的四个分区中没有检测到 super-block，这意味着我们可以继续在这些磁盘上创建 RAID 10。

#### 第2步: 创建 RAID 设备 `md`

5、 现在该创建一个`md`（即 /dev/md0）设备了，使用“mdadm” raid 管理工具。在创建设备之前，必须确保系统已经安装了`mdadm`工具，如果没有请使用下面的命令来安装。

```
# yum install mdadm     [在 RedHat 系统]
# apt-get install mdadm     [在 Debain 系统]

```

`mdadm`工具安装完成后，可以使用下面的命令创建一个`md` raid 设备。

```
# mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[b-e]1

```

6、 接下来使用`cat`命令验证新创建的 raid 设备。

```
# cat /proc/mdstat

```

![Create md raid Device](/data/attachment/album/201508/31/215616anax4n70g6280iab.png)

*创建 md RAID 设备*

7、 接下来，使用下面的命令来检查4个磁盘。下面命令的输出会很长，因为它会显示4个磁盘的所有信息。

```
# mdadm --examine /dev/sd[b-e]1

```

8、 接下来，使用以下命令来查看 RAID 阵列的详细信息。

```
# mdadm --detail /dev/md0

```

![Check Raid Array Details](/data/attachment/album/201508/31/215618nk61ijk9yfa9z9oo.png)

*查看 RAID 阵列详细信息*

**注意**: 你在上面看到的结果，该 RAID 的状态是 active 和re-syncing。

#### 第3步：创建文件系统

9、 使用 ext4 作为`md0′的文件系统，并将它挂载到`/mnt/raid10`下。在这里，我用的是 ext4，你可以使用你想要的文件系统类型。

```
# mkfs.ext4 /dev/md0

```

![Create md Filesystem](/data/attachment/album/201508/31/215620liiziljkf9idbzje.png)

*创建 md 文件系统*

10、 在创建文件系统后，挂载文件系统到`/mnt/raid10`下，并使用`ls -l`命令列出挂载点下的内容。

```
# mkdir /mnt/raid10
# mount /dev/md0 /mnt/raid10/
# ls -l /mnt/raid10/

```

接下来，在挂载点下创建一些文件，并在文件中添加些内容，然后检查内容。

```
# touch /mnt/raid10/raid10_files.txt
# ls -l /mnt/raid10/
# echo "raid 10 setup with 4 disks" > /mnt/raid10/raid10_files.txt
# cat /mnt/raid10/raid10_files.txt

```

![Mount md Device](/data/attachment/album/201508/31/215620orf26qogf6q0s5vv.png)

*挂载 md 设备*

11、 要想自动挂载，打开`/etc/fstab`文件并添加下面的条目，挂载点根据你环境的不同来添加。使用 wq! 保存并退出。

```
# vim /etc/fstab

/dev/md0                /mnt/raid10              ext4    defaults        0 0

```

![AutoMount md Device](/data/attachment/album/201508/31/215621tr1yeq3qug6q74xn.png)

*挂载 md 设备*

12、 接下来，在重新启动系统前使用`mount -a`来确认`/etc/fstab`文件是否有错误。

```
# mount -av

```

![Check Errors in Fstab](/data/attachment/album/201508/31/215622c60crrzbg101lfj0.png)

*检查 Fstab 中的错误*

#### 第四步：保存 RAID 配置

13、 默认情况下 RAID 没有配置文件，所以我们需要在上述步骤完成后手动保存它。

```
# mdadm --detail --scan --verbose >> /etc/mdadm.conf

```

![Save Raid10 Configuration](/data/attachment/album/201508/31/215622dsp01cftzpef1977.png)

*保存 RAID10 的配置*

就这样，我们使用方法1创建完了 RAID 10，这种方法是比较容易的。现在，让我们使用方法2来设置 RAID 10。

### 方法2：创建 RAID 10

1、 在方法2中，我们必须定义2组 RAID 1，然后我们需要使用这些创建好的 RAID 1 的集合来定义一个 RAID 0。在这里，我们将要做的是先创建2个镜像（RAID1），然后创建 RAID0 （条带化）。

首先，列出所有的可用于创建 RAID 10 的磁盘。

```
# ls -l /dev | grep sd

```

![List 4 Devices](/data/attachment/album/201508/31/215623ul91kzh9kpp1kvww.png)

*列出了 4 个设备*

2、 将4个磁盘使用`fdisk`命令进行分区。对于如何分区，您可以按照上面的第1步。

```
# fdisk /dev/sdb
# fdisk /dev/sdc
# fdisk /dev/sdd
# fdisk /dev/sde

```

3、 在完成4个磁盘的分区后，现在检查磁盘是否存在 RAID块。

```
# mdadm --examine /dev/sd[b-e]
# mdadm --examine /dev/sd[b-e]1

```

![Examine 4 Disks](/data/attachment/album/201508/31/215624sf3cgo65cn2on2nv.png)

*检查 4 个磁盘*

#### 第1步：创建 RAID 1

4、 首先，使用4块磁盘创建2组 RAID 1，一组为`sdb1′和`sdc1′，另一组是`sdd1′ 和`sde1′。

```
# mdadm --create /dev/md1 --metadata=1.2 --level=1 --raid-devices=2 /dev/sd[b-c]1
# mdadm --create /dev/md2 --metadata=1.2 --level=1 --raid-devices=2 /dev/sd[d-e]1
# cat /proc/mdstat

```

![Creating Raid 1](/data/attachment/album/201508/31/215625yecy1bc1i6pv6818.png)

*创建 RAID 1*

![Check Details of Raid 1](/data/attachment/album/201508/31/215625yecy1bc1i6pv6818.png)

*查看 RAID 1 的详细信息*

#### 第2步：创建 RAID 0

5、 接下来，使用 md1 和 md2 来创建 RAID 0。

```
# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/md1 /dev/md2
# cat /proc/mdstat

```

![Creating Raid 0](/data/attachment/album/201508/31/215626epch71ryvqr7hj6c.png)

*创建 RAID 0*

#### 第3步：保存 RAID 配置

6、 我们需要将配置文件保存在`/etc/mdadm.conf`文件中，使其每次重新启动后都能加载所有的 RAID 设备。

```
# mdadm --detail --scan --verbose >> /etc/mdadm.conf

```

在此之后，我们需要按照方法1中的第3步来创建文件系统。

就是这样！我们采用的方法2创建完了 RAID 1+0。我们将会失去一半的磁盘空间，但相比其他 RAID ，它的性能将是非常好的。

### 结论

在这里，我们采用两种方法创建 RAID 10。RAID 10 具有良好的性能和冗余性。希望这篇文章可以帮助你了解 RAID 10 嵌套 RAID。在后面的文章中我们会看到如何扩展现有的 RAID 阵列以及更多精彩的内容。

---

via: <http://www.tecmint.com/create-raid-10-in-linux/>

作者：[Babin Lonston](http://www.tecmint.com/author/babinlonston/) 译者：[strugglingyouth](https://github.com/strugglingyouth) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 下使用 RAID（七）：在 RAID 中扩展现有的 RAID 阵列和删除故障的磁盘

这个系列的原文暂时中断了。如果恢复更新，我们会继续翻译出来。

您好，请问第8部分：在 RAID 中恢复（重建）损坏的驱动器和第9部分：在 Linux 中管理 RAID<br />
什么时候可以更新？很好的教程。

8 就快翻译完了，9的原文刚出来。换作者了，估计原作者太监了。。

恩，翻译好了请尽快发布，谢谢。

文章非常棒，受益匪浅！！

你好，请问下，“在这里，我们使用的是1GB的虚拟磁盘”这里的虚拟磁盘不是真正的硬盘吗？原来的硬盘应该也是真正的物理硬盘吧？然后假设其中一个坏掉了，再重新扩一个新的好硬盘替换掉坏的硬盘，不应该是用物理硬盘替换吗？为什么这里说是虚拟硬盘呢？

每个新手都会对阵列（array）这个词所代表的意思产生疑惑。阵列只是磁盘的一个集合。换句话说，我们可以称阵列为一个集合（set）或一组（group）。就像一组鸡蛋中包含6个一样。同样 RAID 阵列中包含着多个磁盘，可能是2，4，6，8，12，16等，希望你现在知道了什么是阵列。

在这里，我们将看到如何扩展现有的阵列或 RAID 组。例如，如果我们在阵列中使用2个磁盘形成一个 raid 1 集合，在某些情况，如果该组中需要更多的空间，就可以使用 mdadm -grow 命令来扩展阵列大小，只需要将一个磁盘加入到现有的阵列中即可。在说完扩展（添加磁盘到现有的阵列中）后，我们将看看如何从阵列中删除故障的磁盘。

![Grow Raid Array in Linux](/data/attachment/album/201508/31/222753ilrflallzk1khmrr.jpg)

*扩展 RAID 阵列和删除故障的磁盘*

假设磁盘中的一个有问题了需要删除该磁盘，但我们需要在删除磁盘前添加一个备用磁盘来扩展该镜像，因为我们需要保存我们的数据。当磁盘发生故障时我们需要从阵列中删除它，这是这个主题中我们将要学习到的。

#### 扩展 RAID 的特性

* 我们可以增加（扩展）任意 RAID 集合的大小。
* 我们可以在使用新磁盘扩展 RAID 阵列后删除故障的磁盘。
* 我们可以扩展 RAID 阵列而无需停机。

#### 要求

* 为了扩展一个RAID阵列，我们需要一个已有的 RAID 组（阵列）。
* 我们需要额外的磁盘来扩展阵列。
* 在这里，我们使用一块磁盘来扩展现有的阵列。

在我们了解扩展和恢复阵列前，我们必须了解有关 RAID 级别和设置的基本知识。点击下面的链接了解这些。

* [介绍 RAID 的级别和概念](/article-6085-1.html)
* [使用 mdadm 工具创建软件 RAID 0 （条带化）](/article-6087-1.html)

#### 我的服务器设置

```
操作系统    :   CentOS 6.5 Final
IP地址      :   192.168.0.230
主机名     :   grow.tecmintlocal.com
2 块现有磁盘   :   1 GB
1 块额外磁盘   :   1 GB

```

在这里，我们已有一个 RAID ，有2块磁盘，每个大小为1GB，我们现在再增加一个磁盘到我们现有的 RAID 阵列中，其大小为1GB。

### 扩展现有的 RAID 阵列

1、 在扩展阵列前，首先使用下面的命令列出现有的 RAID 阵列。

```
# mdadm --detail /dev/md0

```

![Check Existing Raid Array](/data/attachment/album/201508/31/222755j444r3ur5u6wee8f.png)

*检查现有的 RAID 阵列*

**注意**: 以上输出显示，已经有了两个磁盘在 RAID 阵列中，级别为 RAID 1。现在我们增加一个磁盘到现有的阵列里。

2、 现在让我们添加新的磁盘“sdd”，并使用`fdisk`命令来创建分区。

```
# fdisk /dev/sdd

```

请使用以下步骤为 /dev/sdd 创建一个新的分区。

* 按 `n` 创建新的分区。
* 然后按 `P` 选择主分区。
* 接下来选择分区号为1。
* 只需按两次回车键选择默认值即可。
* 然后，按 `P` 来打印创建好的分区。
* 按 `L`，列出所有可用的类型。
* 按 `t` 去修改分区。
* 键入 `fd` 设置为 Linux 的 RAID 类型，然后按回车确认。
* 然后再次使用`p`查看我们所做的更改。
* 使用`w`保存更改。

![Create New Partition in Linux](/data/attachment/album/201508/31/222757jdbq3aoxzeeodcad.png)

*为 sdd 创建新的分区*

3、 一旦新的 sdd 分区创建完成后，你可以使用下面的命令验证它。

```
# ls -l /dev/ | grep sd

```

![Confirm sdd Partition](/data/attachment/album/201508/31/222800j5qwydcv5qvpqkpv.png)

*确认 sdd 分区*

4、 接下来，在添加到阵列前先检查磁盘是否有 RAID 分区。

```
# mdadm --examine /dev/sdd1

```

![Check Raid on sdd Partition](/data/attachment/album/201508/31/222800t57ygvagdu1cnl1y.png)

*在 sdd 分区中检查 RAID*

**注意**:以上输出显示，该盘有没有发现 super-blocks，意味着我们可以将新的磁盘添加到现有阵列。

5、 要添加新的分区 /dev/sdd1 到现有的阵列 md0，请使用以下命令。

```
# mdadm --manage /dev/md0 --add /dev/sdd1

```

![Add Disk To Raid-Array](/data/attachment/album/201508/31/222801x2igbt646eijgzh2.png)

*添加磁盘到 RAID 阵列*

6、 一旦新的磁盘被添加后，在我们的阵列中检查新添加的磁盘。

```
# mdadm --detail /dev/md0

```

![Confirm Disk Added to Raid](/data/attachment/album/201508/31/222803kw7hhfc5r7g1833r.png)

*确认将新磁盘添加到 RAID 中*

**注意**: 在上面的输出，你可以看到磁盘已经被添加作为备用的。在这里，我们的阵列中已经有了2个磁盘，但我们期待阵列中有3个磁盘，因此我们需要扩展阵列。

7、 要扩展阵列，我们需要使用下面的命令。

```
# mdadm --grow --raid-devices=3 /dev/md0

```

![Grow Raid Array](/data/attachment/album/201508/31/222805p9z626ig912i211i.png)

*扩展 Raid 阵列*

现在我们可以看到第三块磁盘(sdd1)已被添加到阵列中，在第三块磁盘被添加后，它将从另外两块磁盘上同步数据。

```
# mdadm --detail /dev/md0

```

![Confirm Raid Array](/data/attachment/album/201508/31/222808e9er2ed2j2a39wa7.png)

*确认 Raid 阵列*

**注意**: 对于大容量磁盘会需要几个小时来同步数据。在这里，我们使用的是1GB的虚拟磁盘，所以它非常快在几秒钟内便会完成。

### 从阵列中删除磁盘

8、 在数据被从其他两个磁盘同步到新磁盘`sdd1`后，现在三个磁盘中的数据已经相同了（镜像）。

正如我前面所说的，假定一个磁盘出问题了需要被删除。所以，现在假设磁盘`sdc1`出问题了，需要从现有阵列中删除。

在删除磁盘前我们要将其标记为失效，然后我们才可以将其删除。

```
# mdadm --fail /dev/md0 /dev/sdc1
# mdadm --detail /dev/md0

```

![Disk Fail in Raid Array](/data/attachment/album/201508/31/222811wrs1rk84xkzt5r4k.png)

*在 RAID 阵列中模拟磁盘故障*

从上面的输出中，我们清楚地看到，磁盘在下面被标记为 faulty。即使它是 faulty 的，我们仍然可以看到 raid 设备有3个，1个损坏了，状态是 degraded。

现在我们要从阵列中删除 faulty 的磁盘，raid 设备将像之前一样继续有2个设备。

```
# mdadm --remove /dev/md0 /dev/sdc1

```

![Remove Disk in Raid Array](/data/attachment/album/201508/31/222812skwrbkvu1yvk9pyy.png)

*在 Raid 阵列中删除磁盘*

9、 一旦故障的磁盘被删除，然后我们只能使用2个磁盘来扩展 raid 阵列了。

```
# mdadm --grow --raid-devices=2 /dev/md0
# mdadm --detail /dev/md0

```

![Grow Disks in Raid Array](/data/attachment/album/201508/31/222814sxz2vrlxu1pwxusu.png)

*在 RAID 阵列扩展磁盘*

从上面的输出中可以看到，我们的阵列中仅有2台设备。如果你需要再次扩展阵列，按照如上所述的同样步骤进行。如果你需要添加一个磁盘作为备用，将其标记为 spare，因此，如果磁盘出现故障时，它会自动顶上去并重建数据。

### 结论

在这篇文章中，我们已经看到了如何扩展现有的 RAID 集合，以及如何在重新同步已有磁盘的数据后从一个阵列中删除故障磁盘。所有这些步骤都可以不用停机来完成。在数据同步期间，系统用户，文件和应用程序不会受到任何影响。

在接下来的文章我将告诉你如何管理 RAID，敬请关注更新，不要忘了写评论。

---

via: <http://www.tecmint.com/grow-raid-array-in-linux/>

作者：[Babin Lonston](http://www.tecmint.com/author/babinlonston/) 译者：[strugglingyouth](https://github.com/strugglingyouth) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 4.3 将移除 EXT3 文件系统驱动

Summary: 正在开发中的 Linux 4.3已经确定会移除EXT3 文件系统的驱动。 这个移除 EXT3 驱动的代码请求今天早上发给了内核主线。上个月的EXT3 文件系统驱动将从 Linux 内核中移除一文中有更多的细节。 长话短说，EXT4 驱动已经稳定有年，而且它向后兼容 EXT2/EXT3 文件系统。SUSE 的Jan Kara 从 Linux 4.3 中去除 EXT3 驱动将会让内核减少两万八千行代码。同时，内核的 VM 和块设备层的 EXT3 特定的修复也会被移除。 （LCTT 译注：所以不用担心，你的 ext3 文件系统的分区依旧可以使用，ext4 驱动会兼容它们的。）  这个代码请求现在可以在LKML上看

干得漂亮！

稳定有年

这个真好，可以更好的学习EXT4了，就是应该跟上时代的步伐嘛。

这就要 4.3 了, 太快了..........

正在开发中的 [Linux 4.3](http://www.phoronix.com/scan.php?page=search&q=Linux+4.3) 已经确定会移除 EXT3 文件系统的驱动。

这个移除 EXT3 驱动的代码请求今天早上发给了内核主线。上个月的 [EXT3 文件系统驱动将从 Linux 内核中移除](http://www.phoronix.com/scan.php?page=news_item&px=Linux-Kernel-Dropping-EXT3) 一文中有更多的细节。

长话短说，EXT4 驱动已经稳定有年，而且它向后兼容 EXT2/EXT3 文件系统。SUSE 的 Jan Kara 从 Linux 4.3 中去除 EXT3 驱动将会让内核减少两万八千行代码。同时，内核的 VM 和块设备层的 EXT3 特定的修复也会被移除。 （LCTT 译注：所以不用担心，你的 ext3 文件系统的分区依旧可以使用，ext4 驱动会兼容它们的。）

![](/data/attachment/album/201508/31/225042btkmk67b6kkn5bht.jpeg)

这个代码请求现在可以在 [LKML](https://lkml.org/lkml/2015/8/31/22) 上看到。上个月 Kara 准备移除 EXT3 驱动时，他就基本上得到大家的同意。


Ubuntu 上使用 LVM 轻松调整分区并制作快照

Summary: Ubuntu的安装器提供了一个轻松使用LVM的复选框。它的描述中说，启用逻辑卷管理可以让你制作快照，并更容易地调整硬盘分区大小这里将为大家讲述如何完成这些操作。 LVM是一种技术，某种程度上和RAID阵列或Windows上的存储空间类似。虽然该技术在服务器上更为有用，但是它也可以在桌面端PC上使用。 你应该在新安装Ubuntu时使用LVM吗？ 第一个问题是，你是否想要在安装Ubuntu时使用LVM？如果是，那么Ubuntu让这一切变得很简单，只需要轻点鼠标就可以完成，但是该选项默认是不启用的。正如安装器所说的，它允许你调整分区、创建快照、将多个磁

![](/data/attachment/album/201508/31/234513ykldvzvlrsftadk6.png)

Ubuntu的安装器提供了一个轻松“使用LVM”的复选框。它的描述中说，启用逻辑卷管理可以让你制作快照，并更容易地调整硬盘分区大小——这里将为大家讲述如何完成这些操作。

LVM是一种技术，某种程度上和[RAID阵列](http://www.howtogeek.com/162676/how-to-use-multiple-disks-intelligently-an-introduction-to-raid/)或[Windows上的“存储空间”](http://www.howtogeek.com/109380/how-to-use-windows-8s-storage-spaces-to-mirror-combine-drives/)类似。虽然该技术在服务器上更为有用，但是它也可以在桌面端PC上使用。

### 你应该在新安装Ubuntu时使用LVM吗？

第一个问题是，你是否想要在安装Ubuntu时使用LVM？如果是，那么Ubuntu让这一切变得很简单，只需要轻点鼠标就可以完成，但是该选项默认是不启用的。正如安装器所说的，它允许你调整分区、创建快照、将多个磁盘合并到一个逻辑卷等等——所有这一切都可以在系统运行时完成。不同于传统分区，你不需要关掉你的系统，从Live CD或USB驱动，然后[当这些分区不使用时才能调整](http://www.howtogeek.com/114503/how-to-resize-your-ubuntu-partitions/)。

完全坦率地说，普通Ubuntu桌面用户可能不会意识到他们是否正在使用LVM。但是，如果你想要在今后做一些更高深的事情，那么LVM就会有所帮助了。LVM可能更复杂，可能会在你今后恢复数据时会导致问题——尤其是在你经验不足时。这里不会有显著的性能损失——LVM是彻底地在Linux内核中实现的。

![](/data/attachment/album/201508/31/234514p44yra3goor1lrm4.png)

### 逻辑卷管理说明

前面，我们已经[说明了何谓LVM](http://www.howtogeek.com/howto/40702/how-to-manage-and-use-lvm-logical-volume-management-in-ubuntu/)。概括来讲，它在你的物理磁盘和呈现在你系统中的分区之间提供了一个抽象层。例如，你的计算机可能装有两个硬盘驱动器，它们的大小都是 1 TB。你必须得在这些磁盘上至少分两个区，每个区大小 1 TB。

LVM就在这些分区上提供了一个抽象层。用于取代磁盘上的传统分区，LVM将在你对这些磁盘初始化后，将它们当作独立的“物理卷”来对待。然后，你就可以基于这些物理卷创建“逻辑卷”。例如，你可以将这两个 1 TB 的磁盘组合成一个 2 TB 的分区，你的系统将只看到一个 2 TB 的卷，而LVM将会在后台处理这一切。一组物理卷以及一组逻辑卷被称之为“卷组”，一个典型的系统只会有一个卷组。

该抽象层使得调整分区、将多个磁盘组合成单个卷、甚至为一个运行着的分区的文件系统创建“快照”变得十分简单，而完成所有这一切都无需先卸载分区。

注意，如果你没有创建备份，那么将多个磁盘合并成一个卷将会是个糟糕的想法。它就像RAID 0——如果你将两个 1 TB 的卷组合成一个 2 TB 的卷，只要其中一个硬盘失败，你将丢失该卷上的重要数据。所以，如果你要走这条路，那么备份就及其重要。

### 管理LVM卷的图形化工具

通常，[LVM通过Linux终端命令来管理](http://www.howtogeek.com/howto/40702/how-to-manage-and-use-lvm-logical-volume-management-in-ubuntu/)。这在Ubuntu上也行得通，但是有个更简单的图形化方法可供大家采用。如果你是一个Linux用户，对GParted或者与其类似的分区管理器熟悉，算了，别瞎掰了——GParted根本不支持LVM磁盘。

然而，你可以使用Ubuntu附带的磁盘工具。该工具也被称之为GNOME磁盘工具，或者叫Palimpsest。点击dash中的图标来开启它吧，搜索“磁盘”然后敲击回车。不像GParted，该磁盘工具将会在“其它设备”下显示LVM分区，因此你可以根据需要格式化这些分区，也可以调整其它选项。该工具在Live CD或USB 驱动下也可以使用。

![](/data/attachment/album/201508/31/234514ybbhcrx7tylp77lp.png)

不幸的是，该磁盘工具不支持LVM的大多数强大的特性，没有管理卷组、扩展分区，或者创建快照等选项。对于这些操作，你可以通过终端来实现，但是没有那个必要。相反，你可以打开Ubuntu软件中心，搜索关键字LVM，然后安装逻辑卷管理工具，你可以在终端窗口中运行**sudo apt-get install system-config-lvm**命令来安装它。安装完之后，你就可以从dash上打开逻辑卷管理工具了。

这个图形化配置工具是由红帽公司开发的，虽然有点陈旧了，但却是唯一的图形化方式，你可以通过它来完成上述操作，将那些终端命令抛诸脑后了。

比如说，你想要添加一个新的物理卷到卷组中。你可以打开该工具，选择未初始化条目下的新磁盘，然后点击“初始化条目”按钮。然后，你就可以在未分配卷下找到新的物理卷了，你可以使用“添加到现存卷组”按钮来将它添加到“ubuntu-vg”卷组，这是Ubuntu在安装过程中创建的卷组。

![](/data/attachment/album/201508/31/234515x0o35f053ro1dr0o.png)

卷组视图会列出你所有的物理卷和逻辑卷的总览。这里，我们有两个横跨两个独立硬盘驱动器的物理分区，我们有一个交换分区和一个根分区，这是Ubuntu默认设置的分区图表。由于我们从另一个驱动器添加了第二个物理分区，现在那里有大量未使用空间。

![](/data/attachment/album/201508/31/234516cltmxtou08g6mr0m.png)

要扩展逻辑分区到物理空间，你可以在逻辑视图下选择它，点击编辑属性，然后修改大小来扩大分区。你也可以在这里缩小分区。

![](/data/attachment/album/201508/31/234516zlg6nd2wbg6163o1.png)

system-config-lvm的其它选项允许你设置快照和镜像。对于传统桌面而言，你或许不需要这些特性，但是在这里也可以通过图形化处理。记住，你也可以[使用终端命令完成这一切](http://www.howtogeek.com/howto/40702/how-to-manage-and-use-lvm-logical-volume-management-in-ubuntu/)。

---

via: <http://www.howtogeek.com/211937/how-to-use-lvm-on-ubuntu-for-easy-partition-resizing-and-snapshots/>

译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


fdupes：Linux 中查找并删除重复文件的命令行工具

Summary: 对于大多数计算机用户而言，查找并替换重复的文件是一个常见的需求。查找并移除重复文件真是一项令人不胜其烦的工作，它耗时又耗力。但如果你的机器上跑着GNU/Linux，那么查找重复文件会变得十分简单，这多亏了fdupes工具。  fdupes在Linux中查找并删除重复文件 fdupes是啥东东？ fdupes是Linux下的一个工具，它由Adrian Lopez用C编程语言编写并基于MIT许可证发行，该应用程序可以在指定的目录及子目录中查找重复的文件。fdupes通过对比文件的MD5签名，以及逐字节比较文件来识别重复内容，fdupes有各种选项，可以实现对文件的列出、删除、

赞?

对于大多数计算机用户而言，查找并替换重复的文件是一个常见的需求。查找并移除重复文件真是一项令人不胜其烦的工作，它耗时又耗力。但如果你的机器上跑着GNU/Linux，那么查找重复文件会变得十分简单，这多亏了`fdupes`工具。

![Find and Delete Duplicate Files in Linux](/data/attachment/album/201509/01/111653azfdd8pz0grep0vy.png)

*fdupes——在Linux中查找并删除重复文件*

### fdupes是啥东东？

**fdupes**是Linux下的一个工具，它由**Adrian Lopez**用C编程语言编写并基于MIT许可证发行，该应用程序可以在指定的目录及子目录中查找重复的文件。fdupes通过对比文件的MD5签名，以及逐字节比较文件来识别重复内容，fdupes有各种选项，可以实现对文件的列出、删除、替换为文件副本的硬链接等操作。

文件对比以下列顺序开始：

**大小对比 > 部分 MD5 签名对比 > 完整 MD5 签名对比 > 逐字节对比**

### 安装 fdupes 到 Linux

在基于**Debian**的系统上，如**Ubuntu**和**Linux Mint**，安装最新版fdupes，用下面的命令手到擒来。

```
$ sudo apt-get install fdupes

```

在基于CentOS/RHEL和Fedora的系统上，你需要开启[epel仓库](/article-2324-1.html)来安装fdupes包。

```
# yum install fdupes
# dnf install fdupes    [在 Fedora 22 及其以后]

```

**注意**：自Fedora 22之后，默认的包管理器yum被dnf取代了。

### fdupes命令如何使用

1、 作为演示的目的，让我们来在某个目录（比如 tecmint）下创建一些重复文件，命令如下：

```
$ mkdir /home/"$USER"/Desktop/tecmint && cd /home/"$USER"/Desktop/tecmint && for i in {1..15}; do echo "I Love Tecmint. Tecmint is a very nice community of Linux Users." > tecmint${i}.txt ; done

```

在执行以上命令后，让我们使用ls[命令](/article-5109-1.html)验证重复文件是否创建。

```
$ ls -l

total 60
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint10.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint11.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint12.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint13.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint14.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint15.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint1.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint2.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint3.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint4.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint5.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint6.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint7.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint8.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint9.txt

```

上面的脚本创建了**15**个文件，名称分别为tecmint1.txt，tecmint2.txt……tecmint15.txt，并且每个文件的数据相同，如

```
"I Love Tecmint. Tecmint is a very nice community of Linux Users."

```

2、 现在在**tecmint**文件夹内搜索重复的文件。

```
$ fdupes /home/$USER/Desktop/tecmint

/home/tecmint/Desktop/tecmint/tecmint13.txt
/home/tecmint/Desktop/tecmint/tecmint8.txt
/home/tecmint/Desktop/tecmint/tecmint11.txt
/home/tecmint/Desktop/tecmint/tecmint3.txt
/home/tecmint/Desktop/tecmint/tecmint4.txt
/home/tecmint/Desktop/tecmint/tecmint6.txt
/home/tecmint/Desktop/tecmint/tecmint7.txt
/home/tecmint/Desktop/tecmint/tecmint9.txt
/home/tecmint/Desktop/tecmint/tecmint10.txt
/home/tecmint/Desktop/tecmint/tecmint2.txt
/home/tecmint/Desktop/tecmint/tecmint5.txt
/home/tecmint/Desktop/tecmint/tecmint14.txt
/home/tecmint/Desktop/tecmint/tecmint1.txt
/home/tecmint/Desktop/tecmint/tecmint15.txt
/home/tecmint/Desktop/tecmint/tecmint12.txt

```

3、 使用**-r**选项在每个目录包括其子目录中递归搜索重复文件。

它会递归搜索所有文件和文件夹，花一点时间来扫描重复文件，时间的长短取决于文件和文件夹的数量。在此其间，终端中会显示全部过程，像下面这样。

```
$ fdupes -r /home

Progress [37780/54747] 69%

```

4、 使用**-S**选项来查看某个文件夹内找到的重复文件的大小。

```
$ fdupes -S /home/$USER/Desktop/tecmint

65 bytes each:
/home/tecmint/Desktop/tecmint/tecmint13.txt
/home/tecmint/Desktop/tecmint/tecmint8.txt
/home/tecmint/Desktop/tecmint/tecmint11.txt
/home/tecmint/Desktop/tecmint/tecmint3.txt
/home/tecmint/Desktop/tecmint/tecmint4.txt
/home/tecmint/Desktop/tecmint/tecmint6.txt
/home/tecmint/Desktop/tecmint/tecmint7.txt
/home/tecmint/Desktop/tecmint/tecmint9.txt
/home/tecmint/Desktop/tecmint/tecmint10.txt
/home/tecmint/Desktop/tecmint/tecmint2.txt
/home/tecmint/Desktop/tecmint/tecmint5.txt
/home/tecmint/Desktop/tecmint/tecmint14.txt
/home/tecmint/Desktop/tecmint/tecmint1.txt
/home/tecmint/Desktop/tecmint/tecmint15.txt
/home/tecmint/Desktop/tecmint/tecmint12.txt

```

5、 你可以同时使用**-S**和**-r**选项来查看所有涉及到的目录和子目录中的重复文件的大小，如下：

```
$ fdupes -Sr /home/avi/Desktop/

65 bytes each:
/home/tecmint/Desktop/tecmint/tecmint13.txt
/home/tecmint/Desktop/tecmint/tecmint8.txt
/home/tecmint/Desktop/tecmint/tecmint11.txt
/home/tecmint/Desktop/tecmint/tecmint3.txt
/home/tecmint/Desktop/tecmint/tecmint4.txt
/home/tecmint/Desktop/tecmint/tecmint6.txt
/home/tecmint/Desktop/tecmint/tecmint7.txt
/home/tecmint/Desktop/tecmint/tecmint9.txt
/home/tecmint/Desktop/tecmint/tecmint10.txt
/home/tecmint/Desktop/tecmint/tecmint2.txt
/home/tecmint/Desktop/tecmint/tecmint5.txt
/home/tecmint/Desktop/tecmint/tecmint14.txt
/home/tecmint/Desktop/tecmint/tecmint1.txt
/home/tecmint/Desktop/tecmint/tecmint15.txt
/home/tecmint/Desktop/tecmint/tecmint12.txt

107 bytes each:
/home/tecmint/Desktop/resume_files/r-csc.html
/home/tecmint/Desktop/resume_files/fc.html

```

6、 不同于在一个或所有文件夹内递归搜索，你可以选择按要求有选择性地在两个或三个文件夹内进行搜索。不必再提醒你了吧，如有需要，你可以使用**-S**和/或**-r**选项。

```
$ fdupes /home/avi/Desktop/ /home/avi/Templates/

```

7、 要删除重复文件，同时保留一个副本，你可以使用`-d`选项。使用该选项，你必须额外小心，否则最终结果可能会是文件/数据的丢失。郑重提醒，此操作不可恢复。

```
$ fdupes -d /home/$USER/Desktop/tecmint

[1] /home/tecmint/Desktop/tecmint/tecmint13.txt
[2] /home/tecmint/Desktop/tecmint/tecmint8.txt
[3] /home/tecmint/Desktop/tecmint/tecmint11.txt
[4] /home/tecmint/Desktop/tecmint/tecmint3.txt
[5] /home/tecmint/Desktop/tecmint/tecmint4.txt
[6] /home/tecmint/Desktop/tecmint/tecmint6.txt
[7] /home/tecmint/Desktop/tecmint/tecmint7.txt
[8] /home/tecmint/Desktop/tecmint/tecmint9.txt
[9] /home/tecmint/Desktop/tecmint/tecmint10.txt
[10] /home/tecmint/Desktop/tecmint/tecmint2.txt
[11] /home/tecmint/Desktop/tecmint/tecmint5.txt
[12] /home/tecmint/Desktop/tecmint/tecmint14.txt
[13] /home/tecmint/Desktop/tecmint/tecmint1.txt
[14] /home/tecmint/Desktop/tecmint/tecmint15.txt
[15] /home/tecmint/Desktop/tecmint/tecmint12.txt

Set 1 of 1, preserve files [1 - 15, all]:

```

你可能注意到了，所有重复的文件被列了出来，并给出删除提示，一个一个来，或者指定范围，或者一次性全部删除。你可以选择一个范围，就像下面这样，来删除指定范围内的文件。

```
Set 1 of 1, preserve files [1 - 15, all]: 2-15

   [-] /home/tecmint/Desktop/tecmint/tecmint13.txt
   [+] /home/tecmint/Desktop/tecmint/tecmint8.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint11.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint3.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint4.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint6.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint7.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint9.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint10.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint2.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint5.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint14.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint1.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint15.txt
   [-] /home/tecmint/Desktop/tecmint/tecmint12.txt

```

8、 从安全角度出发，你可能想要打印`fdupes`的输出结果到文件中，然后检查文本文件来决定要删除什么文件。这可以降低意外删除文件的风险。你可以这么做：

```
$ fdupes -Sr /home > /home/fdupes.txt

```

**注意**：你应该替换`/home`为你想要的文件夹。同时，如果你想要递归搜索并打印大小，可以使用`-r`和`-S`选项。

9、 你可以使用`-f`选项来忽略每个匹配集中的首个文件。

首先列出该目录中的文件。

```
$ ls -l /home/$USER/Desktop/tecmint

total 20
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint9 (3rd copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint9 (4th copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint9 (another copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint9 (copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug  8 11:22 tecmint9.txt

```

然后，忽略掉每个匹配集中的首个文件。

```
$ fdupes -f /home/$USER/Desktop/tecmint

/home/tecmint/Desktop/tecmint9 (copy).txt
/home/tecmint/Desktop/tecmint9 (3rd copy).txt
/home/tecmint/Desktop/tecmint9 (another copy).txt
/home/tecmint/Desktop/tecmint9 (4th copy).txt

```

10、 检查已安装的fdupes版本。

```
$ fdupes --version

fdupes 1.51

```

11、 如果你需要关于fdupes的帮助，可以使用`-h`开关。

```
$ fdupes -h

Usage: fdupes [options] DIRECTORY...

 -r --recurse       for every directory given follow subdirectories
                    encountered within
 -R --recurse:      for each directory given after this option follow
                    subdirectories encountered within (note the ':' at
                    the end of the option, manpage for more details)
 -s --symlinks      follow symlinks
 -H --hardlinks     normally, when two or more files point to the same
                    disk area they are treated as non-duplicates; this
                    option will change this behavior
 -n --noempty       exclude zero-length files from consideration
 -A --nohidden      exclude hidden files from consideration
 -f --omitfirst     omit the first file in each set of matches
 -1 --sameline      list each set of matches on a single line
 -S --size          show size of duplicate files
 -m --summarize     summarize dupe information
 -q --quiet         hide progress indicator
 -d --delete        prompt user for files to preserve and delete all
                    others; important: under particular circumstances,
                    data may be lost when using this option together
                    with -s or --symlinks, or when specifying a
                    particular directory more than once; refer to the
                    fdupes documentation for additional information
 -N --noprompt      together with --delete, preserve the first file in
                    each set of duplicates and delete the rest without
                    prompting the user
 -v --version       display fdupes version
 -h --help          display this help message

```

到此为止了。让我知道你以前怎么在Linux中查找并删除重复文件的吧？同时，也让我知道你关于这个工具的看法。在下面的评论部分中提供你有价值的反馈吧，别忘了为我们点赞并分享，帮助我们扩散哦。

我正在使用另外一个移除重复文件的工具，它叫**fslint**。很快就会把使用心得分享给大家哦，你们一定会喜欢看的。

---

via: <http://www.tecmint.com/fdupes-find-and-delete-duplicate-files-in-linux/>

作者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


看这些孩子在 Ubuntu 的 Linux 终端下玩耍

Summary: 我发现了一个孩子们在他们的计算机教室里玩得很开心的视频。我不知道他们在哪里，但我猜测是在印度尼西亚或者马来西亚。视频请自行搭梯子： https://youtu.be/z8taQPomp0Y 在Linux终端下面跑火车 这里没有魔术。只是一个叫做sl的命令行工具。我想它是在把ls打错的情况下为了好玩而开发的。如果你曾经在Linux的命令行下工作，你会知道ls是一个最常使用的一个命令，也许也是一个最经常打错的命令。 如果你想从这个终端下的火车获得一些乐趣，你可以使用下面的命令安装它。 sudo apt-get install sl  要运行终端火车，只需要在终端中输入sl。

我发现了一个孩子们在他们的计算机教室里玩得很开心的视频。我不知道他们在哪里，但我猜测是在印度尼西亚或者马来西亚。视频请自行搭梯子： <https://youtu.be/z8taQPomp0Y>

### 在Linux终端下面跑火车

这里没有魔术。只是一个叫做“sl”的命令行工具。我想它是在把ls打错的情况下为了好玩而开发的。如果你曾经在Linux的命令行下工作，你会知道ls是一个最常使用的一个命令，也许也是一个最经常打错的命令。

如果你想从这个终端下的火车获得一些乐趣，你可以使用下面的命令安装它。

```
sudo apt-get install sl

```

要运行终端火车，只需要在终端中输入**sl**。它有以下几个选项：

* -a : 意外模式。你会看见哭救的群众
* -l : 显示一个更小的火车但有更多的车厢
* -F : 一个飞行的火车
* -e : 允许通过Ctrl+C。使用其他模式你不能使用Ctrl+C中断火车。但是，它不能长时间运行。

正常情况下，你应该会听到汽笛声但是在大多数Linux系统下都不管用，Ubuntu是其中一个。这就是一个意外的终端火车。

![Linux Terminal Train](/data/attachment/album/201509/01/231251hssjsts752jo0zo3.jpg)

---

via: <http://itsfoss.com/ubuntu-terminal-train/>

作者：[Abhishek](http://itsfoss.com/author/abhishek/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Windows 上通过 Kitematic 使用 Docker

应该是支持的。

在“Starting Docker VM”环节，显示100%，但是没有任何动静，等待了很长时间，这个是什么原因呢？

在本篇文章中，我们会学习如何在 Windows 操作系统上安装 Kitematic 以及部署一个测试性的 Nginx Web 服务器。Kitematic 是一个具有现代化的界面设计的自由开源软件，它可以让我们在 Docker 中交互式执行任务。Kitematic 设计的非常漂亮、界面美观。使用它，我们可以简单快速地开箱搭建我们的容器而不需要输入命令，可以在图形用户界面中通过简单的点击从而在容器上部署我们的应用。Kitematic 集成了 Docker Hub，允许我们搜索、拉取任何需要的镜像，并在上面部署应用。它同时也能很好地切换到命令行用户接口模式。目前，它包括了自动映射端口、可视化更改环境变量、配置卷、流式日志以及其它功能。

![](/data/attachment/album/201509/01/233823y2vovco0iczhgv2x.png)

下面是在 Windows 上安装 Kitematic 并部署测试性 Nginx Web 服务器的 3 个简单步骤。

### 1. 下载 Kitematic

首先，我们需要从 github 仓库 <https://github.com/kitematic/kitematic/releases> 中下载 Windows 操作系统可用的最新的 Kitematic 发行版。我们用下载器或者 web 浏览器下载了它的可执行 EXE 文件。下载完成后，我们需要双击可执行应用文件。

![运行 Kitematic](/wp-content/uploads/2015/06/running-kitematic.png)

双击应用文件之后，会问我们一个安全问题，我们只需要点击 OK 按钮，如下图所示。

![安全警告](/data/attachment/album/201509/01/233829jupufiiyufxxjxiv.png)

### 2. 安装 Kitematic

下载好可执行安装程序之后，我们现在就可以在我们的 Windows 操作系统上安装 Kitematic了。安装程序现在会开始下载并安装运行 Kitematic 需要的依赖软件，包括 Virtual Box 和 Docker。如果已经在系统上安装了 Virtual Box，它会把它升级到最新版本。安装程序会在几分钟内完成，但取决于你网络和系统的速度。如果你还没有安装 Virtual Box，它会问你是否安装 Virtual Box 网络驱动。建议安装它，因为它用于 Virtual Box 的网络功能。

![安装 Kitematic](/data/attachment/album/201509/01/233831qxummli55tmnviz5.png)

所需的依赖 Docker 和 Virtual Box 安装完成并运行后，会让我们登录到 Docker Hub。如果我们还没有账户或者还不想登录，可以点击 **SKIP FOR NOW** 继续后面的步骤。

![登录 Docker Hub](/data/attachment/album/201509/01/233832pmub4if7i7ucqec4.jpg)

如果你还没有账户，你可以在应用程序上点击注册（Sign Up）链接并在 Docker Hub 上创建账户。

完成之后，就会出现 Kitematic 应用程序的第一个界面。正如下面看到的这样。我们可以搜索可用的 docker 镜像。

![启动 Kitematic](/data/attachment/album/201509/01/233834y0ytbbvnrbbrprn0.jpg)

### 3. 部署 Nginx Hello World 容器

现在，成功安装完 Kitematic 之后，我们打算部署容器。要运行一个容器，我们只需要在搜索区域中搜索镜像。然后点击 Create 按钮部署容器。在这篇教程中，我们会部署一个小的包含了 Hello World 主页的 Nginx Web 服务器。为此，我们在搜索区域中搜索 Hello World Nginx。看到了容器信息之后，我们点击 Create 来部署容器。

![运行 Hello World Nginx](/data/attachment/album/201509/01/233836nl1lzll1homiizfy.jpg)

镜像下载完成之后，它会自动部署。我们可以查看 Kitematic 部署容器的命令日志。我们也可以在 Kitematic 界面上预览 web 页面。现在，我们通过点击预览在 web 浏览器中查看我们的 Hello World 页面。

![浏览 Nginx Hello World](/data/attachment/album/201509/01/233837j1vlo59vvohxv1x6.jpg)

如果我们想切换到命令行接口并用它管理 docker，这里有个称为 Docker CLI 的按钮，它会打开一个 PowerShell，在里面我们可以执行 docker 命令。

![Docker CLI PowerShell](/data/attachment/album/201509/01/233838qpp1pcucp1b1cpv8.png)

现在，如果我们想配置我们的容器并执行类似更改容器名称、设置环境变量、指定端口、配置容器存储以及其它高级功能的任务，我们可以在容器设置页面做到这些。

![设置 Kitematic Container](/data/attachment/album/201509/01/233839wnz7k77ubgpnpq74.png)

### 总结

我们终于成功在 Windows 操作系统上安装了 Kitematic 并部署了一个 Hello World Ngnix 服务器。推荐下载安装 Kitematic 最新的发行版，因为会增加很多新的高级功能。由于 Docker 运行在 64 位平台，当前 Kitematic 也是为 64 位操作系统构建。它只能在 Windows 7 以及更高版本上运行。

在这篇教程中，我们部署了一个 Nginx Web 服务器，类似地我们可以在 Kitematic 中简单的点击就能通过镜像部署任何 docker 容器。Kitematic 已经有可用的 Mac OS X 和 Windows 版本，Linux 版本也在开发中很快就会发布。

如果你有任何疑问、建议或者反馈，请在下面的评论框中写下来以便我们更改地改进或更新我们的内容。非常感谢！Enjoy :-)

---

via: <http://linoxide.com/linux-how-to/interactively-docker-kitematic/>

作者：[Arun Pyasi](http://linoxide.com/author/arunp/) 译者：[ictlyh](https://github.com/ictlyh) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 文件系统结构介绍

Summary: Linux中的文件是什么？它的文件系统又是什么？那些配置文件又在哪里？我下载好的程序保存在哪里了？在 Linux 中文件系统是标准结构的吗？好了，上图简明地阐释了Linux的文件系统的层次关系。当你苦于寻找配置文件或者二进制文件的时候，这便显得十分有用了。我在下方添加了一些解释以及例子，不过篇幅较长，可以有空再看。 另外一种情况便是当你在系统中获取配置以及二进制文件时，出现了不一致性问题，如果你是在一个大型组织中，或者只是一个终端用户，这也有可能会破坏你的系统（比如，二进制文件运行在旧的库文件上了）。若然你在你的

good  有了系统而且简洁的介绍了

good

满园春色关不住 ，一枝红杏出墙来。梯子（goagent, shadowsocks ）没了~~~~

https://github.com/comeforu2012/truth/wiki   可以用的 秒开google

got it

https://linux.cn/blog-15563-5963.html   kernel-linux-4.1.6目录介绍

https://linux.cn/blog-15563-5964.html    Linux-Kernel八大知识点

需要进行包装，这样更有利于传播啊

很好！简单、明了，给初学者带来了很多便利

test

![](/data/attachment/album/201509/02/004850winnckdkn48yb7br.png)

Linux中的文件是什么？它的文件系统又是什么？那些配置文件又在哪里？我下载好的程序保存在哪里了？在 Linux 中文件系统是标准结构的吗？好了，上图简明地阐释了Linux的文件系统的层次关系。当你苦于寻找配置文件或者二进制文件的时候，这便显得十分有用了。我在下方添加了一些解释以及例子，不过“篇幅较长，可以有空再看”。

另外一种情况便是当你在系统中获取配置以及二进制文件时，出现了不一致性问题，如果你是在一个大型组织中，或者只是一个终端用户，这也有可能会破坏你的系统（比如，二进制文件运行在旧的库文件上了）。若然你在[你的Linux系统上做安全审计](http://www.blackmoreops.com/2015/02/15/in-light-of-recent-linux-exploits-linux-security-audit-is-a-must/)的话，你将会发现它很容易遭到各种攻击。所以，保持一个清洁的操作系统（无论是Windows还是Linux）都显得十分重要。

### Linux的文件是什么？

对于UNIX系统来说(同样适用于Linux)，以下便是对文件简单的描述：

>
> 在UNIX系统中，一切皆为文件；若非文件，则为进程
>
>
>

这种定义是比较正确的，因为有些特殊的文件不仅仅是普通文件（比如命名管道和套接字），不过为了让事情变的简单，“一切皆为文件”也是一个可以让人接受的说法。Linux系统也像UNIX系统一样，将文件和目录视如同物，因为目录只是一个包含了其他文件名的文件而已。程序、服务、文本、图片等等，都是文件。对于系统来说，输入和输出设备，基本上所有的设备，都被当做是文件。

题图版本历史：

* Version 2.0 – 17-06-2015
	+ – Improved: 添加标题以及版本历史
	+ – Improved: 添加/srv，/meida和/proc
	+ – Improved: 更新了反映当前的Linux文件系统的描述
	+ – Fixed: 多处的打印错误
	+ – Fixed: 外观和颜色
* Version 1.0 – 14-02-2015
	+ – Created: 基本的图表
	+ – Note: 摒弃更低的版本

### 下载链接

以下是大图的下载地址。如果你需要其他格式，请跟原作者联系，他会尝试制作并且上传到某个地方以供下载

* [大图 (PNG 格式) – 2480×1755 px – 184KB](https://img.linux.net.cn/data/attachment/album/201509/02/004850winnckdkn48yb7br.png)
* [最大图 (PDF 格式) – 9919x7019 px – 1686KB](http://www.blackmoreops.com/wp-content/uploads/2015/06/Linux-File-System-Hierarchy-blackMORE-Ops.pdf)

**注意**: PDF格式文件是打印的最好选择，因为它画质很高。

### Linux 文件系统描述

为了有序地管理那些文件，人们习惯把这些文件当做是硬盘上的有序的树状结构，正如我们熟悉的'MS-DOS'(磁盘操作系统)就是一个例子。大的分枝包括更多的分枝，分枝的末梢是树的叶子或者普通的文件。现在我们将会以这树形图为例，但晚点我们会发现为什么这不是一个完全准确的一幅图。

| 目录 | 描述 |
| --- | --- |
| `/` | *主层次* 的根，也是整个文件系统层次结构的根目录 |
| `/bin` | 存放在单用户模式可用的必要命令二进制文件，所有用户都可用，如 cat、ls、cp等等 |
| `/boot` | 存放引导加载程序文件，例如kernels、initrd等 |
| `/dev` | 存放必要的设备文件，例如`/dev/null` |
| `/etc` | 存放主机特定的系统级配置文件。其实这里有个关于它名字本身意义上的的争议。在贝尔实验室的UNIX实施文档的早期版本中，/etc表示是“其他（etcetera）目录”，因为从历史上看，这个目录是存放各种不属于其他目录的文件（然而，文件系统目录标准 FSH 限定 /etc 用于存放静态配置文件，这里不该存有二进制文件）。早期文档出版后，这个目录名又重新定义成不同的形式。近期的解释中包含着诸如“可编辑文本配置”或者“额外的工具箱”这样的重定义 |
| `/etc/opt` | 存储着新增包的配置文件 `/opt/`. |
| `/etc/sgml` | 存放配置文件，比如 catalogs，用于那些处理SGML(译者注：标准通用标记语言)的软件的配置文件 |
| `/etc/X11` | X Window 系统11版本的的配置文件 |
| `/etc/xml` | 配置文件，比如catalogs，用于那些处理XML(译者注：可扩展标记语言)的软件的配置文件 |
| `/home` | 用户的主目录，包括保存的文件，个人配置，等等 |
| `/lib` | `/bin/` 和 `/sbin/`中的二进制文件的必需的库文件 |
| `/lib<架构位数>` | 备用格式的必要的库文件。 这样的目录是可选的，但如果他们存在的话肯定是有需要用到它们的程序 |
| `/media` | 可移动的多媒体(如CD-ROMs)的挂载点。(出现于 FHS-2.3) |
| `/mnt` | 临时挂载的文件系统 |
| `/opt` | 可选的应用程序软件包 |
| `/proc` | 以文件形式提供进程以及内核信息的虚拟文件系统，在Linux中，对应进程文件系统（procfs ）的挂载点 |
| `/root` | 根用户的主目录 |
| `/sbin` | 必要的系统级二进制文件，比如， init, ip, mount |
| `/srv` | 系统提供的站点特定数据 |
| `/tmp` | 临时文件 (另见 `/var/tmp`). 通常在系统重启后删除 |
| `/usr` | *二级层级*存储用户的只读数据； 包含(多)用户主要的公共文件以及应用程序 |
| `/usr/bin` | 非必要的命令二进制文件 (在单用户模式中不需要用到的)；用于所有用户 |
| `/usr/include` | 标准的包含文件 |
| `/usr/lib` | 库文件，用于`/usr/bin/` 和 `/usr/sbin/`中的二进制文件 |
| `/usr/lib<架构位数>` | 备用格式库(可选的) |
| `/usr/local` | *三级层次* 用于本地数据，具体到该主机上的。通常会有下一个子目录, *比如*, `bin/`, `lib/`, `share/`. |
| `/usr/local/sbin` | 非必要系统的二进制文件，比如用于不同网络服务的守护进程 |
| `/usr/share` | 架构无关的 (共享) 数据. |
| `/usr/src` | 源代码，比如内核源文件以及与它相关的头文件 |
| `/usr/X11R6` | X Window系统，版本号:11，发行版本：6 |
| `/var` | 各式各样的（Variable）文件，一些随着系统常规操作而持续改变的文件就放在这里，比如日志文件，脱机文件，还有临时的电子邮件文件 |
| `/var/cache` | 应用程序缓存数据. 这些数据是由耗时的I/O(输入/输出)的或者是运算本地生成的结果。这些应用程序是可以重新生成或者恢复数据的。当没有数据丢失的时候，可以删除缓存文件 |
| `/var/lib` | 状态信息。这些信息随着程序的运行而不停地改变，比如，数据库，软件包系统的元数据等等 |
| `/var/lock` | 锁文件。这些文件用于跟踪正在使用的资源 |
| `/var/log` | 日志文件。包含各种日志。 |
| `/var/mail` | 内含用户邮箱的相关文件 |
| `/var/opt` | 来自附加包的各种数据都会存储在 `/var/opt/`. |
| `/var/run` | 存放当前系统上次启动以来的相关信息，例如当前登入的用户以及当前运行的[daemons(守护进程)](http://en.wikipedia.org/wiki/Daemon_%28computing%29). |
| `/var/spool` | 该spool主要用于存放将要被处理的任务，比如打印队列以及邮件外发队列 |
| `/var/mail` | 过时的位置，用于放置用户邮箱文件 |
| `/var/tmp` | 存放重启后保留的临时文件 |

### Linux的文件类型

大多数文件仅仅是普通文件，他们被称为`regular`文件；他们包含普通数据，比如，文本、可执行文件、或者程序、程序的输入或输出等等

虽然你可以认为“在Linux中，一切你看到的皆为文件”这个观点相当保险，但这里仍有着一些例外。

* `目录`:由其他文件组成的文件
* `特殊文件`:用于输入和输出的途径。大多数特殊文件都储存在`/dev`中，我们将会在后面讨论这个问题。
* `链接文件`:让文件或者目录出现在系统文件树结构上多个地方的机制。我们将详细地讨论这个链接文件。
* `(域)套接字`:特殊的文件类型，和TCP/IP协议中的套接字有点像，提供进程间网络通讯，并受文件系统的访问控制机制保护。
* `命名管道` : 或多或少有点像sockets(套接字)，提供一个进程间的通信机制，而不用网络套接字协议。

### 现实中的文件系统

对于大多数用户和常规系统管理任务而言，“文件和目录是一个有序的类树结构”是可以接受的。然而，对于电脑而言，它是不会理解什么是树，或者什么是树结构。

每个分区都有它自己的文件系统。想象一下，如果把那些文件系统想成一个整体，我们可以构思一个关于整个系统的树结构，不过这并没有这么简单。在文件系统中，一个文件代表着一个`inode`(索引节点)，这是一种包含着构建文件的实际数据信息的序列号：这些数据表示文件是属于谁的，还有它在硬盘中的位置。

每个分区都有一套属于他们自己的inode，在一个系统的不同分区中，可以存在有相同inode的文件。

每个inode都表示着一种在硬盘上的数据结构，保存着文件的属性，包括文件数据的物理地址。当硬盘被格式化并用来存储数据时(通常发生在初始系统安装过程，或者是在一个已经存在的系统中添加额外的硬盘)，每个分区都会创建固定数量的inode。这个值表示这个分区能够同时存储各类文件的最大数量。我们通常用一个inode去映射2-8k的数据块。当一个新的文件生成后，它就会获得一个空闲的inode。在这个inode里面存储着以下信息：

* 文件属主和组属主
* 文件类型(常规文件，目录文件......)
* 文件权限
* 创建、最近一次读文件和修改文件的时间
* inode里该信息被修改的时间
* 文件的链接数(详见下一章)
* 文件大小
* 文件数据的实际地址

唯一不在inode的信息是文件名和目录。它们存储在特殊的目录文件。通过比较文件名和inode的数目，系统能够构造出一个便于用户理解的树结构。用户可以通过ls -i查看inode的数目。在硬盘上，inodes有他们独立的空间。

---

via: <http://www.blackmoreops.com/2015/06/18/linux-file-system-hierarchy-v2-0/>

译者：[tnuoccalanosrep](https://github.com/tnuoccalanosrep) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


RHCSA 系列（一）: 回顾基础命令及系统文档

Summary: RHCSA (红帽认证系统工程师) 是由 RedHat 公司举行的认证考试，这家公司给商业公司提供开源操作系统和软件，除此之外，还为这些企业和机构提供支持、训练以及咨询服务等。  RHCSA 考试准备指南 RHCSA 考试(考试编号 EX200)通过后可以获取由 RedHat 公司颁发的证书. RHCSA 考试是 RHCT(红帽认证技师)的升级版，而且 RHCSA 必须在新的 Red Hat Enterprise Linux(红帽企业版)下完成。RHCT 和 RHCSA 的主要变化就是 RHCT 基于 RHEL5，而 RHCSA 基于 RHEL6 或者7，这两个认证的等级也有所不同。 红帽认证管理员最起码可以在红帽企业版的环境下

这个系列，目测很不错啊

继续关注这一系统。

十分感谢分享<br />
7版本如果推出大量免费内容 那么将持续关注。十分感谢

好多命令我都见识过。。。。。

十分感谢，一个优秀的运维必须有这扎实的功底。

来自广东深圳的 IE Mobile 11.0|Windows Phone 8.1 用户

很不错！ 一定要把所有的系列完整的看一遍！！！

总共15篇，我们会逐一发出来，让我们共同学习吧！

嗯嗯，谢谢分享，辛苦了！！！

感谢分享，很难看到这样一个完整的系列

yutou83 [Internet Explorer 11.0|Windows 7]

RHCSA (红帽认证系统工程师) 是由 RedHat 公司举行的认证考试，这家公司给商业公司提供开源操作系统和软件，除此之外，还为这些企业和机构提供支持、训练以及咨询服务等。

![RHCSA Exam Guide](/data/attachment/album/201509/02/124011a8v89dd3ex36mqgs.png)

*RHCSA 考试准备指南*

RHCSA 考试(考试编号 EX200)通过后可以获取由 RedHat 公司颁发的证书. RHCSA 考试是 RHCT(红帽认证技师)的升级版，而且 RHCSA 必须在新的 Red Hat Enterprise Linux(红帽企业版)下完成。RHCT 和 RHCSA 的主要变化就是 RHCT 基于 RHEL5，而 RHCSA 基于 RHEL6 或者7，这两个认证的等级也有所不同。

红帽认证管理员最起码可以在红帽企业版的环境下执行如下系统管理任务：

* 理解并会使用命令管理文件、目录、命令行以及系统/软件包的文档
* 在不同的启动等级操作运行中的系统，识别和控制进程，启动或停止虚拟机
* 使用分区和逻辑卷管理本地存储
* 创建并且配置本地文件系统和网络文件系统，设置他们的属性(权限、加密、访问控制表)
* 部署、配置、并且控制系统，包括安装、升级和卸载软件
* 管理系统用户和组，以及使用集中制的 LDAP 目录进行用户验证
* 确保系统安全，包括基础的防火墙规则和 SELinux 配置

关于你所在国家的考试注册和费用请参考 [RHCSA 认证页面](https://www.redhat.com/en/services/certification/rhcsa)。

在这个有15章的 RHCSA(红帽认证管理员)备考系列中，我们将覆盖以下的关于红帽企业 Linux 第七版的最新的信息：

* [RHCSA 系列（一）: 回顾基础命令及系统文档](/article-6133-1.html)
* [RHCSA 系列（二）: 如何进行文件和目录管理](/article-6155-1.html)
* [RHCSA 系列（三）: 如何管理 RHEL7 的用户和组](/article-6187-1.html)
* [RHCSA 系列（四）: 编辑文本文件及分析文本](/article-6229-1.html)
* [RHCSA 系列（五）: RHEL7 中的进程管理：开机，关机](/article-6249-1.html)
* [RHCSA 系列（六）: 使用 Parted 和 SSM 来配置和加密系统存储](/article-6257-1.html)
* [RHCSA 系列（七）: 使用 ACL（访问控制列表) 和挂载 Samba/NFS 共享](/article-6263-1.html)
* [RHCSA 系列（八）: 加固 SSH，设定主机名及启用网络服务](/article-6266-1.html)
* [RHCSA 系列（九）: 安装、配置及加固一个 Web 和 FTP 服务器](/article-6286-1.html)
* [RHCSA 系列（十）: Yum 包管理、Cron 自动任务计划和监控系统日志](/article-6300-1.html)志
* [RHCSA 系列（十一）: 使用 firewalld 和 iptables 来控制网络流量](/article-6315-1.html)
* [RHCSA 系列（十二）: 使用 Kickstart 完成 RHEL 7 的自动化安装](/article-6335-1.html)
* [RHCSA 系列（十三）：在 RHEL 7 中使用 SELinux 进行强制访问控制](/article-6339-1.html)
* [RHCSA 系列（十四）：在 RHEL 7 中设置基于 LDAP 的认证](/article-6348-1.html)
* [RHCSA 系列（十五）：虚拟化基础和使用 KVM 进行虚拟机管理](/article-6362-1.html)

在第一章，我们讲解如何在终端或者 Shell 窗口输入和运行正确的命令，并且讲解如何找到、查阅，以及使用系统文档。

![RHCSA: Reviewing Essential Linux Commands – Part 1](/data/attachment/album/201509/02/124014ftn7lvzn6f4n7l4m.png)

*RHCSA：回顾必会的 Linux 命令 - 第一部分*

#### 前提:

至少你要熟悉如下命令

* [cd 命令](http://linux.cn/article-2479-1.html) (改变目录)
* [ls 命令](/article-5109-1.html) (列举文件)
* [cp 命令](http://linux.cn/article-2687-1.html) (复制文件)
* [mv 命令](http://www.tecmint.com/rename-multiple-files-in-linux/) (移动或重命名文件)
* [touch 命令](http://linux.cn/article-2740-1.html) (创建一个新的文件或更新已存在文件的时间表)
* rm 命令 (删除文件)
* mkdir 命令 (创建目录)

在这篇文章中你将会找到更多的关于如何更好的使用他们的正确用法和特殊用法.

虽然没有严格的要求，但是作为讨论常用的 Linux 命令和在 Linux 中搜索信息方法，你应该安装 RHEL7 来尝试使用文章中提到的命令。这将会使你学习起来更省力。

* [红帽企业版 Linux(RHEL)7 安装指南](http://www.tecmint.com/redhat-enterprise-linux-7-installation/)

### 使用 Shell 进行交互

如果我们使用文本模式登录 Linux，我们就会直接进入到我们的默认 shell 中。另一方面，如果我们使用图形化界面登录，我们必须通过启动一个终端来开启 shell。无论那种方式，我们都会看到用户提示符，并且我们可以在这里输入并且执行命令(当按下回车时，命令就会被执行)。

命令是由两个部分组成的：

* 命令本身
* 参数

某些参数，称为选项（通常使用一个连字符开头），会改变命令的行为方式，而另外一些则指定了命令所操作的对象。

type 命令可以帮助我们识别某一个特定的命令是由 shell 内置的还是由一个单独的包提供的。这样的区别在于我们能够在哪里找到更多关于该命令的更多信息。对 shell 内置的命令，我们需要看 shell 的手册页；如果是其他的，我们需要看软件包自己的手册页。

![Check Shell built in Commands](/data/attachment/album/201509/02/124015gxidtswsqlzd3l3t.png)

*检查Shell的内置命令*

在上面的例子中， `cd` 和 `type` 是 shell 内置的命令，`top` 和 `less` 是由 shell 之外的其他的二进制文件提供的(在这种情况下，type将返回命令的位置)。

其他的内置命令：

* [echo 命令](/article-3948-1.html): 展示字符串
* [pwd 命令](/article-3422-1.html): 输出当前的工作目录

![More Built in Shell Commands](/data/attachment/album/201509/02/124015u7ng7p1k00nz71hn.png)

*其它内置命令*

#### **exec 命令**

它用来运行我们指定的外部程序。请注意在多数情况下，只需要输入我们想要运行的程序的名字就行，不过`exec` 命令有一个特殊的特性：不是在 shell 之外创建新的进程运行，而是这个新的进程会替代原来的 shell，可以通过下列命令来验证。

```
# ps -ef | grep [shell 进程的PID]

```

当新的进程终止时，Shell 也随之终止。运行 `exec top` ，然后按下 `q` 键来退出 top，你会注意到 shell 会话也同时终止，如下面的屏幕录像展示的那样:

#### **export 命令**

给之后执行的命令的输出环境变量。

#### **history 命令**

展示数行之前的历史命令。命令编号前面前缀上感叹号可以再次执行这个命令。如果我们需要编辑历史列表中的命令，我们可以按下 `Ctrl + r` 并输入与命令相关的第一个字符。我们可以看到的命令会自动补全，可以根据我们目前的需要来编辑它：

命令列表会保存在一个叫 `.bash_history` 的文件里。`history` 命令是一个非常有用的用于减少输入次数的工具，特别是进行命令行编辑的时候。默认情况下，bash 保留最后输入的500个命令，不过可以通过修改 HISTSIZE 环境变量来增加:

![Linux history Command](/data/attachment/album/201509/02/124016kzp0c1d44qpz2zkn.png)

*Linux history 命令*

但上述变化，在我们的下一次启动不会保留。为了保持 HISTSIZE 变量的变化，我们需要通过手工修改文件编辑：

```
# 要设置 history 长度，请看 bash(1)文档中的 HISTSIZE 和 HISTFILESIZE
HISTSIZE=1000

```

**重要**： 我们的更改不会立刻生效，除非我们重启了 shell 。

#### **alias 命令**

没有参数或使用 `-p` 选项时将会以“名称=值”的标准形式输出别名列表。当提供了参数时，就会按照给定的名字和值定义一个别名。

使用 `alias` ，我们可以创建我们自己的命令，或使用所需的参数修改现有的命令。举个例子，假设我们将 `ls` 定义别名为 `ls –color=auto` ，这样就可以使用不同颜色输出文件、目录、链接等等。

```
# alias ls='ls --color=auto'

```

![Linux alias Command](/data/attachment/album/201509/02/124016o4dwpw5526patq15.png)

*Linux 别名命令*

**注意**： 你可以给你的“新命令”起任何的名字，并且使用单引号包括很多命令，但是你要用分号区分开它们。如下：

```
# alias myNewCommand='cd /usr/bin; ls; cd; clear'

```

#### **exit 命令**

`exit` 和 `logout` 命令都可以退出 shell 。`exit` 命令可以退出所有的 shell，`logout` 命令只注销登录的 shell（即你用文本模式登录时自动启动的那个）。

#### **man 和 info 命令**

如果你对某个程序有疑问，可以参考它的手册页，可以使用 `man` 命令调出它。此外，还有一些关于重要文件(inittab、fstab、hosts 等等)、库函数、shell、设备及其他功能的手册页。

举例:

* man uname (输出系统信息，如内核名称、处理器、操作系统类型、架构等)
* man inittab (初始化守护进程的设置)

另外一个重要的信息的来源是由 `info` 命令提供的，`info` 命令常常被用来读取 info 文件。这些文件往往比手册页 提供了更多信息。可以通过 `info keyword` 调用某个命令的信息：

```
# info ls
# info cut

```

另外，在 `/usr/share/doc` 文件夹包含了大量的子目录，里面可以找到大量的文档。它们是文本文件或其他可读格式。

你要习惯于使用这三种方法去查找命令的信息。重点关注每个命令文档中介绍的详细的语法。

#### **使用 expand 命令把制表符转换为空格**

有时候文本文档包含了制表符，但是程序无法很好的处理。或者我们只是简单的希望将制表符转换成空格。这就是用到 `expand` 地方(由GNU核心组件包提供) 。

举个例子，我们有个文件 NumberList.txt，让我们使用 `expand` 处理它，将制表符转换为一个空格，并且显示在标准输出上。

```
# expand --tabs=1 NumbersList.txt

```

![Linux expand Command](/data/attachment/album/201509/02/124016b6kkf2uxzd55uw85.png)

*Linux expand 命令*

unexpand命令可以实现相反的功能(将空格转为制表符)

#### **使用 head 输出文件首行及使用 tail 输出文件尾行**

通常情况下，`head` 命令后跟着文件名时，将会输出该文件的前十行，我们可以通过 `-n` 参数来自定义具体的行数。

```
# head -n3 /etc/passwd
# tail -n3 /etc/passwd

```

![Linux head and tail Command](/data/attachment/album/201509/02/124017p6qzsoqygaxuhqsq.png)

*Linux 的 head 和 tail 命令*

`tail` 最有意思的一个特性就是能够显示增长的输入文件(`tail -f my.log`，my.log 是我们需要监视的文件。)这在我们监控一个持续增加的日志文件时非常有用。

* [使用 head 和 tail 命令有效地管理文件](http://www.tecmint.com/view-contents-of-file-in-linux/)

#### **使用 paste 按行合并文本文件**

`paste` 命令一行一行的合并文件，默认会以制表符来区分每个文件的行，或者你可以自定义的其它分隔符。(下面的例子就是输出中的字段使用等号分隔)。

```
# paste -d= file1 file2

```

![Merge Files in Linux](/data/attachment/album/201509/02/124017dn3h8rtb822nb134.png)

*Linux 中的 merge 命令*

#### **使用 split 命令将文件分块**

`split` 命令常常用于把一个文件切割成两个或多个由我们自定义的前缀命名的文件。可以根据大小、区块、行数等进行切割，生成的文件会有一个数字或字母的后缀。在下面的例子中，我们将切割 bash.pdf ，每个文件 50KB (-b 50KB)，使用数字后缀 (-d)：

```
# split -b 50KB -d bash.pdf bash_

```

![Split Files in Linux](/data/attachment/album/201509/02/124018obie3ip8p95zjjfl.png)

*在 Linux 下切割文件*

你可以使用如下命令来合并这些文件，生成原来的文件:

```
# cat bash_00 bash_01 bash_02 bash_03 bash_04 bash_05 > bash.pdf

```

#### **使用 tr 命令替换字符**

`tr` 命令多用于一对一的替换（改变）字符，或者使用字符范围。和之前一样，下面的实例我们将使用之前的同样文件file2，我们将做：

* 小写字母 o 变成大写
* 所有的小写字母都变成大写字母

```
cat file2 | tr o O
cat file2 | tr [a-z] [A-Z]
```

![Translate Characters in Linux](/data/attachment/album/201509/02/124018ve3xms3vknuebgfv.png)

*在 Linux 中替换字符*

#### **使用 uniq 和 sort 检查或删除重复的文字**

`uniq` 命令可以帮我们查出或删除文件中的重复的行，默认会输出到标准输出，我们应当注意，`uniq`只能查出相邻的相同行，所以，`uniq` 往往和 `sort` 一起使用(`sort` 一般用于对文本文件的内容进行排序)

默认情况下，`sort` 以第一个字段(使用空格分隔)为关键字段。想要指定不同关键字段，我们需要使用 -k 参数，请注意如何使用 `sort` 和 `uniq` 输出我们想要的字段，具体可以看下面的例子：

```
# cat file3
# sort file3 | uniq
# sort -k2 file3 | uniq
# sort -k3 file3 | uniq

```

![删除文件中重复的行](/data/attachment/album/201509/02/124019x1eeaaghoowga3l4.png)

*删除文件中重复的行*

#### **从文件中提取文本的命令**

`cut` 命令基于字节(-b)、字符(-c)、或者字段(-f)的数量，从输入文件（标准输入或文件）中提取到的部分将会以标准输出上。

当我们使用字段 `cut` 时，默认的分隔符是一个制表符，不过你可以通过 -d 参数来自定义分隔符。

```
# cut -d: -f1,3 /etc/passwd # 这个例子提取了第一和第三字段的文本
# cut -d: -f2-4 /etc/passwd # 这个例子提取了第二到第四字段的文本

```

![从文件中提取文本](/data/attachment/album/201509/02/124019qy6tzgtj8zqtziny.png)

*从文件中提取文本*

注意，简洁起见，上方的两个输出的结果是截断的。

#### **使用 fmt 命令重新格式化文件**

`fmt` 被用于去“清理”有大量内容或行的文件，或者有多级缩进的文件。新的段落格式每行不会超过75个字符宽，你能通过 -w (width 宽度)参数改变这个设定，它可以设置行宽为一个特定的数值。

举个例子，让我们看看当我们用 `fmt` 显示定宽为100个字符的时候的文件 /etc/passwd 时会发生什么。再次，输出截断了。

```
# fmt -w100 /etc/passwd

```

![File Reformatting in Linux](/data/attachment/album/201509/02/124020vowjt1ttomtjj2jz.png)

*Linux 文件重新格式化*

#### **使用 pr 命令格式化打印内容**

`pr` 分页并且在按列或多列的方式显示一个或多个文件。 换句话说，使用 `pr` 格式化一个文件使它打印出来时看起来更好。举个例子，下面这个命令：

```
# ls -a /etc | pr -n --columns=3 -h "Files in /etc"

```

以一个友好的排版方式(3列)输出/etc下的文件，自定义了页眉(通过 -h 选项实现)、行号(-n)。

![File Formatting in Linux](/data/attachment/album/201509/02/124021yerg1gq27e1egzo2.png)

*Linux的文件格式化*

### 总结

在这篇文章中，我们已经讨论了如何在 Shell 或终端以正确的语法输入和执行命令，并解释如何找到，查阅和使用系统文档。正如你看到的一样简单，这就是你成为 RHCSA 的第一大步。

如果你希望添加一些其他的你经常使用的能够有效帮你完成你的日常工作的基础命令，并愿意分享它们，请在下方留言。也欢迎提出问题。我们期待您的回复。

---

via: <http://www.tecmint.com/rhcsa-exam-reviewing-essential-commands-system-documentation/>

作者：[Gabriel Cánepa](http://www.tecmint.com/author/gacanepa/) 译者：[xiqingongzi](https://github.com/xiqingongzi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


Linux有问必答：如何启用Open vSwitch的日志功能以便调试和排障

Summary: 问题 我试着为我的Open vSwitch部署排障，鉴于此，我想要检查它的由内建日志机制生成的调试信息。我怎样才能启用Open vSwitch的日志功能，并且修改它的日志等级（如，修改成INFO/DEBUG级别）以便于检查更多详细的调试信息呢？  Open vSwitch（OVS)是Linux平台上最流行的开源的虚拟交换机。由于当今的数据中心日益依赖于软件定义网络（SDN）架构，OVS被作为数据中心的SDN部署中的事实标准上的网络元素而得到飞速应用。 Open vSwitch具有一个内建的日志机制，它称之为VLOG。VLOG工具允许你在各种网络交换组件中启用并自定义日志，由VLOG生成

谢谢分享，收藏一下，目前还没有自定义过日志格式。

>
> **问题** 我试着为我的Open vSwitch部署排障，鉴于此，我想要检查它的由内建日志机制生成的调试信息。我怎样才能启用Open vSwitch的日志功能，并且修改它的日志等级（如，修改成INFO/DEBUG级别）以便于检查更多详细的调试信息呢？
>
>
>

Open vSwitch（OVS)是Linux平台上最流行的开源的虚拟交换机。由于当今的数据中心日益依赖于软件定义网络（SDN）架构，OVS被作为数据中心的SDN部署中的事实标准上的网络元素而得到飞速应用。

Open vSwitch具有一个内建的日志机制，它称之为VLOG。VLOG工具允许你在各种网络交换组件中启用并自定义日志，由VLOG生成的日志信息可以被发送到一个控制台、syslog以及一个便于查看的单独日志文件。你可以通过一个名为`ovs-appctl`的命令行工具在运行时动态配置OVS日志。

![](/data/attachment/album/201509/02/144000pudylu9utuc7c7du.jpg)

这里为你演示如何使用`ovs-appctl`启用Open vSwitch中的日志功能，并进行自定义。

下面是`ovs-appctl`自定义VLOG的语法。

```
$ sudo ovs-appctl vlog/set module[:facility[:level]]

```

* **Module**：OVS中的任何合法组件的名称（如netdev，ofproto，dpif，vswitchd等等）
* **Facility**：日志信息的目的地（必须是：console，syslog，或者file）
* **Level**：日志的详细程度（必须是：emer，err，warn，info，或者dbg）

在OVS源代码中，模块名称在源文件中是以以下格式定义的：

```
VLOG_DEFINE_THIS_MODULE(<module-name>);

```

例如，在lib/netdev.c中，你可以看到：

```
VLOG_DEFINE_THIS_MODULE(netdev);

```

这个表明，lib/netdev.c是netdev模块的一部分，任何在lib/netdev.c中生成的日志信息将属于netdev模块。

在OVS源代码中，有多个严重度等级用于定义几个不同类型的日志信息：VLOG*INFO()用于报告，VLOG*WARN()用于警告，VLOG*ERR()用于错误提示，VLOG*DBG()用于调试信息，VLOG\_EMERG用于紧急情况。日志等级和工具确定哪个日志信息发送到哪里。

要查看可用模块、工具和各自日志级别的完整列表，请运行以下命令。该命令必须在你启动OVS后调用。

```
$ sudo ovs-appctl vlog/list

```

![](/data/attachment/album/201509/02/144003zp4l04u0et8ul4kw.jpg)

输出结果显示了用于三个场合（facility：console，syslog，file）的各个模块的调试级别。默认情况下，所有模块的日志等级都被设置为INFO。

指定任何一个OVS模块，你可以选择性地修改任何特定场合的调试级别。例如，如果你想要在控制台屏幕中查看dpif更为详细的调试信息，可以运行以下命令。

```
$ sudo ovs-appctl vlog/set dpif:console:dbg

```

你将看到dpif模块的console工具已经将其日志等级修改为DBG，而其它两个场合syslog和file的日志级别仍然没有改变。

![](/data/attachment/album/201509/02/144005vanbsjsexhtfn12a.jpg)

如果你想要修改所有模块的日志等级，你可以指定“ANY”作为模块名。例如，下面命令将修改每个模块的console的日志级别为DBG。

```
$ sudo ovs-appctl vlog/set ANY:console:dbg

```

![](/data/attachment/album/201509/02/144006ej9t86y6djxtjrry.jpg)

同时，如果你想要一次性修改所有三个场合的日志级别，你可以指定“ANY”作为场合名。例如，下面的命令将修改每个模块的所有场合的日志级别为DBG。

```
$ sudo ovs-appctl vlog/set ANY:ANY:dbg

```

---

via: <http://ask.xmodulo.com/enable-logging-open-vswitch.html>

作者：[Dan Nanni](http://ask.xmodulo.com/author/nanni) 译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


在 Ubuntu 15.04 中如何安装和使用 Snort

Summary: 对于网络安全而言入侵检测是一件非常重要的事。入侵检测系统（IDS）用于检测网络中非法与恶意的请求。Snort是一款知名的开源的入侵检测系统。其 Web界面（Snorby）可以用于更好地分析警告。Snort使用iptables/pf防火墙来作为入侵检测系统。本篇中，我们会安装并配置一个开源的入侵检测系统snort。  Snort 安装 要求 snort所使用的数据采集库（DAQ）用于一个调用包捕获库的抽象层。这个在snort上就有。下载过程如下截图所示。  解压并运行./configure、make、make install来安装DAQ。然而，DAQ要求其他的工具，因此，./configure脚本会生成

你好，我在redhat 6.5  32 位上搭建snort系统，

运行 snort -T -c /etc/snort/snort.conf　命令后，能出现

[ Number of patterns truncated to 20 bytes: 1428 ]

        --== Initialization Complete ==--

   ,,_     -*> Snort! <*-

  o"  )~   Version 2.9.8.3 GRE (Build 383)

   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team

           Copyright (C) 2014-2015 Cisco and/or its affiliates. All rights reserved.

           Copyright (C) 1998-2013 Sourcefire, Inc., et al.

           Using libpcap version 1.4.0

           Using PCRE version: 7.8 2008-09-05

           Using ZLIB version: 1.2.3

           Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 2.6  <Build 1>

           Preprocessor Object: SF_REPUTATION  Version 1.1  <Build 1>

           Preprocessor Object: SF_POP  Version 1.0  <Build 1>

           Preprocessor Object: SF_IMAP  Version 1.0  <Build 1>

           Preprocessor Object: SF_GTP  Version 1.1  <Build 1>

           Preprocessor Object: SF_SDF  Version 1.1  <Build 1>

           Preprocessor Object: SF_DNP3  Version 1.1  <Build 1>

           Preprocessor Object: SF_FTPTELNET  Version 1.2  <Build 13>

           Preprocessor Object: SF_DNS  Version 1.1  <Build 4>

           Preprocessor Object: SF_SIP  Version 1.1  <Build 1>

           Preprocessor Object: SF_MODBUS  Version 1.1  <Build 1>

           Preprocessor Object: SF_DCERPC2  Version 1.0  <Build 3>

           Preprocessor Object: SF_SSH  Version 1.1  <Build 3>

           Preprocessor Object: SF_SMTP  Version 1.1  <Build 9>

           Preprocessor Object: SF_SSLPP  Version 1.1  <Build 4>

Snort successfully validated the configuration!

Snort exiting

但是我在网页上http://localhost/acid/acid_db_setup.php　按照网上的资料，应该能出现各种网络流量图，结果出现如下的错误，能帮忙指点下看问题出在哪里了没？

Strict Standards: Declaration of MultipleElementCriteria::SanitizeElement() should be compatible with BaseCriteria::SanitizeElement() in /usr/local/apache/htdocs/acid/acid_state_citems.inc on line 283

Strict Standards: Declaration of MultipleElementCriteria::PrintForm() should be compatible with BaseCriteria::PrintForm() in /usr/local/apache/htdocs/acid/acid_state_citems.inc on line 283

Strict Standards: Declaration of MultipleElementCriteria::AddFormItem() should be compatible with BaseCriteria::AddFormItem() in /usr/local/apache/htdocs/acid/acid_state_citems.inc on line 283

Strict Standards: Declaration of MultipleElementCriteria::SetFormItemCnt() should be compatible with BaseCriteria::SetFormItemCnt() in /usr/local/apache/htdocs/acid/acid_state_citems.inc on line 283

Strict Standards: Declaration of ProtocolFieldCriteria::Description() should be compatible with BaseCriteria::Description() in /usr/local/apache/htdocs/acid/acid_state_citems.inc on line 311

Fatal error: Call-time pass-by-reference has been removed in /usr/local/apache/htdocs/acid/acid_state_citems.inc on line 325

补充说明下，php，mysql 等需要的环境都配置测试正常，

对于网络安全而言入侵检测是一件非常重要的事。入侵检测系统（IDS）用于检测网络中非法与恶意的请求。Snort是一款知名的开源的入侵检测系统。其 Web界面（Snorby）可以用于更好地分析警告。Snort使用iptables/pf防火墙来作为入侵检测系统。本篇中，我们会安装并配置一个开源的入侵检测系统snort。

![](/data/attachment/album/201509/02/151041uh7tc80xcqszccqe.jpg)

### Snort 安装

#### 要求

snort所使用的数据采集库（DAQ）用于一个调用包捕获库的抽象层。这个在snort上就有。下载过程如下截图所示。

![downloading_daq](/data/attachment/album/201509/02/151043oghfgthfzihuzkhz.png)

解压并运行./configure、make、make install来安装DAQ。然而，DAQ要求其他的工具，因此，./configure脚本会生成下面的错误。

flex和bison错误

![flexandbison_error](/data/attachment/album/201509/02/151044x378scchjc8hon00.png)

libpcap错误

![libpcap error](/data/attachment/album/201509/02/151044uvt4v4mmq4qwyjxz.png)

因此在安装DAQ之前先安装flex/bison和libcap。

![install_flex](/data/attachment/album/201509/02/151045woeaaebqdeoroeaw.png)

如下所示安装libpcap开发库

![libpcap-dev installation](/data/attachment/album/201509/02/151046u4rrvgjhhgr5rjr8.png)

安装完必要的工具后，再次运行./configure脚本，将会显示下面的输出。

![without_error_configure](/data/attachment/album/201509/02/151046kfy57iz59ziwwokz.png)

make和make install 命令的结果如下所示。

![make install](/data/attachment/album/201509/02/151047oc3jjsvmjxbia3ws.png)

![make](/data/attachment/album/201509/02/151047laa8ayvh3vawqiqo.png)

成功安装DAQ之后，我们现在安装snort。如下图使用wget下载它。

![downloading_snort](/data/attachment/album/201509/02/151048d01qeqxilz8xw8qq.png)

使用下面的命令解压安装包。

```
#tar -xvzf  snort-2.9.7.3.tar.gz

```

![snort_extraction](/data/attachment/album/201509/02/151049zag9kuyaeofvboia.png)

创建安装目录并在脚本中设置prefix参数。同样也建议启用包性能监控（PPM）的sourcefire标志。

```
#mkdir /usr/local/snort

#./configure --prefix=/usr/local/snort/ --enable-sourcefire

```

![snort_installation](/data/attachment/album/201509/02/151050x7juhpv7zqqrrjhh.png)

配置脚本会由于缺少libpcre-dev、libdumbnet-dev 和zlib开发库而报错。

配置脚本由于缺少libpcre库报错。

![pcre-error](/data/attachment/album/201509/02/151051zjb7sjqz3bjzmo27.png)

配置脚本由于缺少dnet（libdumbnet）库而报错。

![libdnt error](/data/attachment/album/201509/02/151051bkvkqdvkvkahkip0.png)

配置脚本由于缺少zlib库而报错

![zlib error](/data/attachment/album/201509/02/151052g3tztyn495sh6n4i.png)

如下所示，安装所有需要的开发库。

```
# aptitude install libpcre3-dev

```

![libpcre3-dev install](/data/attachment/album/201509/02/151052wmiu8i50dqtp7ezb.png)

```
# aptitude install libdumbnet-dev

```

![libdumnet-dev installation](/data/attachment/album/201509/02/151052l3zv9ojoo7zo31it.png)

```
# aptitude install zlib1g-dev

```

![zlibg-dev installation](/data/attachment/album/201509/02/151053hs1dgnnnk3fzbw3b.png)

安装完snort需要的库之后，再次运行配置脚本就不会报错了。

运行make和make install命令在/usr/local/snort目录下完成安装。

```
# make

```

![make snort](/data/attachment/album/201509/02/151054r3henrs708frnv6s.png)

```
# make install

```

![make install snort](/data/attachment/album/201509/02/151054oxbrar9w78watt7x.png)

最后，从/usr/local/snort/bin中运行snort。现在它对eth0的所有流量都处在promisc模式（包转储模式）。

![snort running](/data/attachment/album/201509/02/151055lnd7r6kdwk86wmy8.png)

如下图所示snort转储流量。

![traffic](/data/attachment/album/201509/02/151056mrl8olsjhnjtxgnh.png)

#### Snort的规则和配置

从源码安装的snort还需要设置规则和配置，因此我们需要复制规则和配置到/etc/snort下面。我们已经创建了单独的bash脚本来用于设置规则和配置。它会设置下面这些snort设置。

* 在linux中创建用于snort IDS服务的snort用户。
* 在/etc下面创建snort的配置文件和文件夹。
* 权限设置并从源代码的etc目录中复制数据。
* 从snort文件中移除规则中的#(注释符号)。

```
#!/bin/bash#
# snort源代码的路径
snort_src="/home/test/Downloads/snort-2.9.7.3"
echo "adding group and user for snort..."
groupadd snort &> /dev/null
useradd snort -r -s /sbin/nologin -d /var/log/snort -c snort_idps -g snort &> /dev/null#snort configuration
echo "Configuring snort..."mkdir -p /etc/snort
mkdir -p /etc/snort/rules
touch /etc/snort/rules/black_list.rules
touch /etc/snort/rules/white_list.rules
touch /etc/snort/rules/local.rules
mkdir /etc/snort/preproc_rules
mkdir /var/log/snort
mkdir -p /usr/local/lib/snort_dynamicrules
chmod -R 775 /etc/snort
chmod -R 775 /var/log/snort
chmod -R 775 /usr/local/lib/snort_dynamicrules
chown -R snort:snort /etc/snort
chown -R snort:snort /var/log/snort
chown -R snort:snort /usr/local/lib/snort_dynamicrules
###copy  configuration and rules from  etc directory under source code of snort
echo "copying from snort source to /etc/snort ....."
echo $snort_src
echo "-------------"
cp $snort_src/etc/*.conf* /etc/snort
cp $snort_src/etc/*.map /etc/snort##enable rules
sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf
echo "---DONE---"

```

改变脚本中的snort源目录路径并运行。下面是成功的输出。

![running script](/data/attachment/album/201509/02/151057vhvjntoiqko9osv4.png)

上面的脚本从snort源中复制下面的文件和文件夹到/etc/snort配置文件中

![files copied](/data/attachment/album/201509/02/151057ssbf8btsttutskdx.png)

snort的配置非常复杂，要让IDS能正常工作需要进行下面必要的修改。

```
ipvar HOME_NET 192.168.1.0/24  # LAN side

```

---

```
ipvar EXTERNAL_NET !$HOME_NET   # WAN side

```

![veriable set](/data/attachment/album/201509/02/151057x3853ll43z8l2532.png)

```
var RULE_PATH /etc/snort/rules     # snort signature path
var SO_RULE_PATH /etc/snort/so_rules        #rules in shared libraries
var PREPROC_RULE_PATH /etc/snort/preproc_rules  # Preproces path
var WHITE_LIST_PATH /etc/snort/rules        # dont scan
var BLACK_LIST_PATH /etc/snort/rules        #  Must scan

```

![main path](/data/attachment/album/201509/02/151058a3jlqdk4vk3elhi6.png)

```
include $RULE_PATH/local.rules   # file for custom rules

```

移除ftp.rules、exploit.rules前面的注释符号(#)。

![path rules](/data/attachment/album/201509/02/151059fepyx4z1e74jh81e.png)

现在[下载社区规则](https://www.snort.org/downloads/community/community-rules.tar.gz)并解压到/etc/snort/rules。启用snort.conf中的社区及紧急威胁规则。

![wget_rules](/data/attachment/album/201509/02/151059jlddq9adz2bz9u28.png)

![community rules](/data/attachment/album/201509/02/151059xx0k8nbyqb1feyjz.png)

进行了上面的更改后，运行下面的命令来检验配置文件。

```
# snort -T -c /etc/snort/snort.conf

```

![snort running](/data/attachment/album/201509/02/151100qrddrt6gg6kxxml4.png)

### 总结

本篇中，我们关注了开源IDPS系统snort在Ubuntu上的安装和配置。通常它用于监控事件，然而它可以被配置成用于网络保护的在线模式。snort规则可以在离线模式中可以使用pcap捕获文件进行测试和分析

---

via: <http://linoxide.com/security/install-snort-usage-ubuntu-15-04/>

作者：[nido](http://linoxide.com/author/naveeda/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出