Skip to content Skip to main navigation Skip to footer

Linux

如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器

你在家里运行着一台 Linux 服务器,它放在一个 NAT 路由器或者限制性防火墙后面。现在你想在外出时用 SSH 登录到这台服务器。你如何才能做到呢?SSH 端口转发当然是一种选择。但是,如果你需要处理多级嵌套的 NAT 环境,端口转发可能会变得非常棘手。另外,在多种 ISP 特定条件下可能会受到干扰,例如阻塞转发端口的限制性 ISP 防火墙、或者在用户间共享 IPv4 地址的运营商级 NAT。

什么是反向 SSH 隧道?

SSH 端口转发的一种替代方案是 反向 SSH 隧道。反向 SSH 隧道的概念非常简单。使用这种方案,在你的受限的家庭网络之外你需要另一台主机(所谓的“中继主机”),你能从当前所在地通过 SSH 登录到它。你可以用有公网 IP 地址的 VPS 实例 配置一个中继主机。然后要做的就是从你的家庭网络服务器中建立一个到公网中继主机的永久 SSH 隧道。有了这个隧道,你就可以从中继主机中连接“回”家庭服务器(这就是为什么称之为 “反向” 隧道)。不管你在哪里、你的家庭网络中的 NAT 或 防火墙限制多么严格,只要你可以访问中继主机,你就可以连接到家庭服务器。

如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器
如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器

在 Linux 上设置反向 SSH 隧道

让我们来看看怎样创建和使用反向 SSH 隧道。我们做如下假设:我们会设置一个从家庭服务器(homeserver)到中继服务器(relayserver)的反向 SSH 隧道,然后我们可以通过中继服务器从客户端计算机(clientcomputer) SSH 登录到家庭服务器。本例中的中继服务器 的公网 IP 地址是 1.1.1.1。

在家庭服务器上,按照以下方式打开一个到中继服务器的 SSH 连接。

homeserver~$ ssh -fN -R 10022:localhost:22 relayserver_user@1.1.1.1

这里端口 10022 是任何你可以使用的端口数字。只需要确保中继服务器上不会有其它程序使用这个端口。

“-R 10022:localhost:22” 选项定义了一个反向隧道。它转发中继服务器 10022 端口的流量到家庭服务器的 22 号端口。

用 “-fN” 选项,当你成功通过 SSH 服务器验证时 SSH 会进入后台运行。当你不想在远程 SSH 服务器执行任何命令,就像我们的例子中只想转发端口的时候非常有用。

运行上面的命令之后,你就会回到家庭主机的命令行提示框中。

登录到中继服务器,确认其 127.0.0.1:10022 绑定到了 sshd。如果是的话就表示已经正确设置了反向隧道。

relayserver~$ sudo netstat -nap | grep 10022

tcp      0    0 127.0.0.1:10022          0.0.0.0:*               LISTEN      8493/sshd

现在就可以从任何其它计算机(客户端计算机)登录到中继服务器,然后按照下面的方法访问家庭服务器。

relayserver~$ ssh -p 10022 homeserver_user@localhost

需要注意的一点是你在上面为localhost输入的 SSH 登录/密码应该是家庭服务器的,而不是中继服务器的,因为你是通过隧道的本地端点登录到家庭服务器,因此不要错误输入中继服务器的登录/密码。成功登录后,你就在家庭服务器上了。

通过反向 SSH 隧道直接连接到网络地址变换后的服务器

上面的方法允许你访问 NAT 后面的 家庭服务器,但你需要登录两次:首先登录到 中继服务器,然后再登录到家庭服务器。这是因为中继服务器上 SSH 隧道的端点绑定到了回环地址(127.0.0.1)。

事实上,有一种方法可以只需要登录到中继服务器就能直接访问NAT之后的家庭服务器。要做到这点,你需要让中继服务器上的 sshd 不仅转发回环地址上的端口,还要转发外部主机的端口。这通过指定中继服务器上运行的 sshd 的 GatewayPorts 实现。

打开中继服务器的 /etc/ssh/sshd_conf 并添加下面的行。

relayserver~$ vi /etc/ssh/sshd_conf

GatewayPorts clientspecified

重启 sshd。

基于 Debian 的系统:

relayserver~$ sudo /etc/init.d/ssh restart

基于红帽的系统:

relayserver~$ sudo systemctl restart sshd

现在在家庭服务器中按照下面方式初始化一个反向 SSH 隧道。

homeserver~$ ssh -fN -R 1.1.1.1:10022:localhost:22 relayserver_user@1.1.1.1

登录到中继服务器然后用 netstat 命令确认成功建立的一个反向 SSH 隧道。

relayserver~$ sudo netstat -nap | grep 10022

tcp      0      0 1.1.1.1:10022     0.0.0.0:*           LISTEN      1538/sshd: dev

不像之前的情况,现在隧道的端点是 1.1.1.1:10022(中继服务器的公网 IP 地址),而不是 127.0.0.1:10022。这就意味着从外部主机可以访问隧道的另一端。

现在在任何其它计算机(客户端计算机),输入以下命令访问网络地址变换之后的家庭服务器。

clientcomputer~$ ssh -p 10022 homeserver_user@1.1.1.1

在上面的命令中,1.1.1.1 是中继服务器的公共 IP 地址,homeserver_user必须是家庭服务器上的用户账户。这是因为你真正登录到的主机是家庭服务器,而不是中继服务器。后者只是中继你的 SSH 流量到家庭服务器。

在 Linux 上设置一个永久反向 SSH 隧道

现在你已经明白了怎样创建一个反向 SSH 隧道,然后把隧道设置为 “永久”,这样隧道启动后就会一直运行(不管临时的网络拥塞、SSH 超时、中继主机重启,等等)。毕竟,如果隧道不是一直有效,你就不能可靠的登录到你的家庭服务器。

对于永久隧道,我打算使用一个叫 autossh 的工具。正如名字暗示的,这个程序可以让你的 SSH 会话无论因为什么原因中断都会自动重连。因此对于保持一个反向 SSH 隧道非常有用。

第一步,我们要设置从家庭服务器到中继服务器的无密码 SSH 登录。这样的话,autossh 可以不需要用户干预就能重启一个损坏的反向 SSH 隧道。

下一步,在建立隧道的家庭服务器上安装 autossh

在家庭服务器上,用下面的参数运行 autossh 来创建一个连接到中继服务器的永久 SSH 隧道。

homeserver~$ autossh -M 10900 -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 1.1.1.1:10022:localhost:22 relayserver_user@1.1.1.1

“-M 10900” 选项指定中继服务器上的监视端口,用于交换监视 SSH 会话的测试数据。中继服务器上的其它程序不能使用这个端口。

“-fN” 选项传递给 ssh 命令,让 SSH 隧道在后台运行。

“-o XXXX” 选项让 ssh:

  • 使用密钥验证,而不是密码验证。
  • 自动接受(未知)SSH 主机密钥。
  • 每 60 秒交换 keep-alive 消息。
  • 没有收到任何响应时最多发送 3 条 keep-alive 消息。

其余 SSH 隧道相关的选项和之前介绍的一样。

如果你想系统启动时自动运行 SSH 隧道,你可以将上面的 autossh 命令添加到 /etc/rc.local。

总结

在这篇博文中,我介绍了你如何能从外部通过反向 SSH 隧道访问限制性防火墙或 NAT 网关之后的 Linux 服务器。这里我介绍了家庭网络中的一个使用事例,但在企业网络中使用时你尤其要小心。这样的一个隧道可能被视为违反公司政策,因为它绕过了企业的防火墙并把企业网络暴露给外部攻击。这很可能被误用或者滥用。因此在使用之前一定要记住它的作用。


via: http://xmodulo.com/access-linux-server-behind-nat-reverse-ssh-tunnel.html

作者:Dan Nanni 译者:ictlyh 校对:wxy

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

来源:https://linux.cn/article-5975-1.html

轻松使用“Explain Shell”脚本来理解 Shell 命令

我们在Linux上工作时,每个人都会遇到需要查找shell命令的帮助信息的时候。 尽管内置的帮助像man pages、whatis命令有所助益, 但man pages的输出非常冗长, 除非是个有linux经验的人,不然从大量的man pages中获取帮助信息是非常困难的,而whatis命令的输出很少超过一行, 这对初学者来说是不够的。

轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

在Linux Shell中解释Shell命令

有一些第三方应用程序, 像我们在Linux 用户的命令行速查表提及过的’cheat’命令。cheat是个优秀的应用程序,即使计算机没有联网也能提供shell命令的帮助, 但是它仅限于预先定义好的命令。

Jackson写了一小段代码,它能非常有效地在bash shell里面解释shell命令,可能最美之处就是你不需要安装第三方包了。他把包含这段代码的的文件命名为“explain.sh”。

explain.sh工具的特性

  • 易嵌入代码。
  • 不需要安装第三方工具。
  • 在解释过程中输出恰到好处的信息。
  • 需要网络连接才能工作。
  • 纯命令行工具。
  • 可以解释bash shell里面的大部分shell命令。
  • 无需使用root账户。

先决条件

唯一的条件就是’curl’包了。 在如今大多数Linux发行版里面已经预安装了curl包, 如果没有你可以按照下面的命令来安装。

# apt-get install curl  [On Debian systems]
# yum install curl      [On CentOS systems]

在Linux上安装explain.sh工具

我们要将下面这段代码插入’~/.bashrc’文件(LCTT译注: 若没有该文件可以自己新建一个)中。我们要为每个用户以及对应的’.bashrc’文件插入这段代码,但是建议你不要加在root用户下。

我们注意到.bashrc文件的第一行代码以(#)开始, 这个是可选的并且只是为了区分余下的代码。

#explain.sh 标记代码的开始, 我们将代码插入.bashrc文件的底部。

# explain.sh begins
explain () {
  if [ "$#" -eq 0 ]; then
    while read  -p "Command: " cmd; do
      curl -Gs "https://www.mankier.com/api/explain/?cols="$(tput cols) --data-urlencode "q=$cmd"
    done
    echo "Bye!"
  elif [ "$#" -eq 1 ]; then
    curl -Gs "https://www.mankier.com/api/explain/?cols="$(tput cols) --data-urlencode "q=$1"
  else
    echo "Usage"
    echo "explain                  interactive mode."
    echo "explain 'cmd -o | ...'   one quoted command to explain it."
  fi
}

explain.sh工具的使用

在插入代码并保存之后,你必须退出当前的会话然后重新登录来使改变生效(LCTT译注:你也可以直接使用命令source~/.bashrc 来让改变生效)。每件事情都是交由‘curl’命令处理, 它负责将需要解释的命令以及命令选项传送给mankier服务,然后将必要的信息打印到Linux命令行。不必说的就是使用这个工具你总是需要连接网络。

让我们用explain.sh脚本测试几个笔者不懂的命令例子。

1.我忘了‘du -h’是干嘛用的, 我只需要这样做:

$ explain 'du -h'
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

获得du命令的帮助

2.如果你忘了’tar -zxvf’的作用,你可以简单地如此做:

$ explain 'tar -zxvf'
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

Tar命令帮助

3.我的一个朋友经常对’whatis’以及’whereis’命令的使用感到困惑,所以我建议他:

在终端简单的地敲下explain命令进入交互模式。

$ explain

然后一个接着一个地输入命令,就能在一个窗口看到他们各自的作用:

Command: whatis
Command: whereis
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

Whatis/Whereis命令的帮助

你只需要使用“Ctrl+c”就能退出交互模式。

4. 你可以通过管道来请求解释更多的命令。

$ explain 'ls -l | grep -i Desktop'
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

获取多条命令的帮助

同样地,你可以请求你的shell来解释任何shell命令。 前提是你需要一个可用的网络。输出的信息是基于需要解释的命令,从服务器中生成的,因此输出的结果是不可定制的。

对于我来说这个工具真的很有用,并且它已经荣幸地添加在我的.bashrc文件中。你对这个项目有什么想法?它对你有用么?它的解释令你满意吗?请让我知道吧!

请在下面评论为我们提供宝贵意见,喜欢并分享我们以及帮助我们得到传播。


via: http://www.tecmint.com/explain-shell-commands-in-the-linux-shell/

作者:Avishek Kumar 译者:dingdongnigetou 校对:wxy

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

来源:https://linux.cn/article-5979-1.html

10 个免费的服务器监控工具

监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。

有许多非常好的服务器监控解决方案,而为了省去你寻找方案的麻烦,这里我为你列出了我能找到的最好的服务器监控工具。 

1. Performance Co-Pilot

Performance Co-Pilot,简称 PCP,是一个系统性能和分析框架。它从多个主机整理数据并实时的分析,帮你识别不正常的表现模式。它也提供 API 让你设计自己的监控和报告解决方案。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

2. Anturis

Anturis 是一个监控你的服务器、网站、IT基础设置的基于云计算的SaaS平台。它有一个全面的监控解决方案列表,非常值得一看。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

3. SeaLion

SeaLion 是一个基于云计算的Linux服务器监控工具。它可以用一个面板简单的监控所有的服务器并且诊断问题。它只需要几分钟就可以安装好,具有及时提醒功能,当发生问题时你可以及时的收到提醒,还具有日常数据汇总等功能。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

4. Icinga

Icinga 是一个免费开源的服务器监控工具,可以检测服务器资源的可用性。它可以记录服务器问题并且通知你。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

5. Munin

Munin 是一个网路和系统监控工具,可以帮你分析服务器资源趋势。它是一个即插即用的解决方案。默认的安装方式提供了很多的报告。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

6. Monit

Monit 是一个监控和管理UNIX系统的开源工具。它可以自动维护和修理。它可以执行各种TCP / IP网络检查和协议的检查。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

7. Nagios

Nagios是一个功能强大的开源服务器/网络监控解决方案,为服务器、交换机、应用程序和服务提供完整的监控和报警机制。它有一个插件API,所以你可以扩展它的开箱即用的功能。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

8. brainypdm

brainypdm是一个基于网络的数据管理和监控工具,从Nagios收集性能数据。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

9. SysUsage

sysusage使用SAR(SYSSTAT)和其他系统的命令监控您的系统活动。它有一个阈值的通知系统,当你的服务器的能力将被刷爆了时会提醒你。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

10. Zabbix

Zabbix是一个开源的性能监控解决方案。可以监控服务器、WEB应用程序、数据库、网络设备等的性能。

10 个免费的服务器监控工具
10 个免费的服务器监控工具

 

来源:http://info.9iphp.com/free-server-monitoring-tools/

如何在 Linux 上运行命令前临时清空 Bash 环境变量

我是个 bash shell 用户。我想临时清空 bash shell 环境变量。但我不想删除或者 unset 一个输出的环境变量。我怎样才能在 bash 或 ksh shell 的临时环境中运行程序呢?

你可以在 Linux 或类 Unix 系统中使用 env 命令设置并打印环境。env 命令可以按命令行指定的变量来修改环境,之后再执行程序。

如何在 Linux 上运行命令前临时清空 Bash 环境变量
如何在 Linux 上运行命令前临时清空 Bash 环境变量

如何显示当前环境?

打开终端应用程序并输入下面的其中一个命令:

printenv

env

输出样例:

如何在 Linux 上运行命令前临时清空 Bash 环境变量
如何在 Linux 上运行命令前临时清空 Bash 环境变量

Fig.01: Unix/Linux: 列出所有环境变量

统计环境变量数目

输入下面的命令:

env | wc -l
printenv | wc -l    # 或者

输出样例:

20

在干净的 bash/ksh/zsh 环境中运行程序

语法如下所示:

env -i your-program-name-here arg1 arg2 ...

例如,要在不使用 http_proxy 和/或任何其它环境变量的情况下运行 wget 程序。临时清除所有 bash/ksh/zsh 环境变量并运行 wget 程序:

env -i /usr/local/bin/wget www.cyberciti.biz
env -i wget www.cyberciti.biz     # 或者

这当你想忽视任何已经设置的环境变量来运行命令时非常有用。我每天都会多次使用这个命令,以便忽视 http_proxy 和其它我设置的环境变量。

例子:使用 http_proxy

$ wget www.cyberciti.biz
--2015-08-03 23:20:23--  http://www.cyberciti.biz/
Connecting to 10.12.249.194:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified 
Saving to: 'index.html'
index.html                 [  <=>                         ]  36.17K  87.0KB/s   in 0.4s
2015-08-03 23:20:24 (87.0 KB/s) - 'index.html' saved [37041]

例子:忽视 http_proxy

$ env -i /usr/local/bin/wget www.cyberciti.biz
--2015-08-03 23:25:17--  http://www.cyberciti.biz/
Resolving www.cyberciti.biz... 74.86.144.194
Connecting to www.cyberciti.biz|74.86.144.194|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified 
Saving to: 'index.html.1'
index.html.1               [  <=>                         ]  36.17K   115KB/s   in 0.3s
2015-08-03 23:25:18 (115 KB/s) - 'index.html.1' saved [37041]

-i 选项使 env 命令完全忽视它继承的环境。但是,它并不会阻止你的命令(例如 wget 或 curl)设置新的变量。同时,也要注意运行 bash/ksh shell 的副作用:

env -i env | wc -l ## 空的 ##
# 现在运行 bash ##
env -i bash
## bash 设置了新的环境变量 ##
env | wc -l

例子:设置一个环境变量

语法如下:

env var=value /path/to/command arg1 arg2 ...
## 或 ##
var=value  /path/to/command arg1 arg2 ...

例如设置 http_proxy:

env http_proxy="http://USER:PASSWORD@server1.cyberciti.biz:3128/" /usr/local/bin/wget www.cyberciti.biz

via: http://www.cyberciti.biz/faq/linux-unix-temporarily-clearing-environment-variables-command/

作者:Vivek Gite 译者:ictlyh 校对:wxy

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

来源:https://linux.cn/article-5980-1.html

新手应知应会的Linux命令

新手应知应会的Linux命令
新手应知应会的Linux命令

在Fedora上通过命令行使用dnf来管理系统更新

基于Linux的系统最美妙的一点,就是你可以在终端中使用命令行来管理整个系统。使用命令行的优势在于,你可以使用相同的知识和技能来管理随便哪个Linux发行版。

对于各个发行版以及桌面环境(DE)而言,要一致地使用图形化用户界面(GUI)却几乎是不可能的,因为它们都提供了各自的用户界面。要明确的是,有些情况下在不同的发行版上需要使用不同的命令来执行某些特定的任务,但是,基本来说它们的思路和目的是一致的。

在本文中,我们打算讨论Linux用户应当掌握的一些基本命令。我将给大家演示怎样使用命令行来更新系统、管理软件、操作文件以及切换到root,这些操作将在三个主要发行版上进行:Ubuntu(也包括其定制版和衍生版,还有Debian),openSUSE,以及Fedora。

让我们开始吧!

保持系统安全和最新

Linux是基于安全设计的,但事实上是,任何软件都有缺陷,会导致安全漏洞。所以,保持你的系统更新到最新是十分重要的。这么想吧:运行过时的操作系统,就像是你坐在全副武装的坦克里头,而门却没有锁。武器会保护你吗?任何人都可以进入开放的大门,对你造成伤害。同样,在你的系统中也有没有打补丁的漏洞,这些漏洞会危害到你的系统。开源社区,不像专利世界,在漏洞补丁方面反应是相当快的,所以,如果你保持系统最新,你也获得了安全保证。

留意新闻站点,了解安全漏洞。如果发现了一个漏洞,了解它,然后在补丁出来的第一时间更新。不管怎样,在生产环境上,你每星期必须至少运行一次更新命令。如果你运行着一台复杂的服务器,那么就要额外当心了。仔细阅读变更日志,以确保更新不会搞坏你的自定义服务。

Ubuntu:牢记一点:你在升级系统或安装不管什么软件之前,都必须要刷新仓库(也就是repos)。在Ubuntu上,你可以使用下面的命令来更新系统,第一个命令用于刷新仓库:

sudo apt-get update

仓库更新后,现在你可以运行系统更新命令了:

sudo apt-get upgrade

然而,这个命令不会更新内核和其它一些包,所以你也必须要运行下面这个命令:

sudo apt-get dist-upgrade

openSUSE:如果你是在openSUSE上,你可以使用以下命令来更新系统(照例,第一个命令的意思是更新仓库):

sudo zypper refresh
sudo zypper up

Fedora:如果你是在Fedora上,你可以使用’dnf’命令,它是zypper和apt-get的’同类’:

sudo dnf update
sudo dnf upgrade

软件安装与移除

你只可以安装那些你系统上启用的仓库中可用的包,各个发行版默认都附带有并启用了一些官方或者第三方仓库。

Ubuntu:要在Ubuntu上安装包,首先更新仓库,然后使用下面的语句:

sudo apt-get install [package_name]

样例:

sudo apt-get install gimp

openSUSE:命令是这样的:

sudo zypper install [package_name]

Fedora:Fedora已经废弃了’yum’,现在换成了’dnf’,所以命令是这样的:

sudo dnf install [package_name]

移除软件的过程也一样,只要把’install’改成’remove’。

Ubuntu

sudo apt-get remove [package_name]

openSUSE

sudo zypper remove [package_name]

Fedora

sudo dnf remove [package_name]

如何管理第三方软件?

在一个庞大的开发者社区中,这些开发者们为用户提供了许多的软件。不同的发行版有不同的机制来将这些第三方软件提供给用户。当然,同时也取决于开发者怎样将这些软件提供给用户,有些开发者会提供二进制包,而另外一些开发者则将软件发布到仓库中。

Ubuntu很多地方都用到PPA(个人包归档),但是,不幸的是,它却没有提供一个内建工具来帮助用于搜索这些PPA仓库。在安装软件前,你将需要通过Google搜索PPA,然后手工添加该仓库。下面就是添加PPA到系统的方法:

sudo add-apt-repository ppa:

样例:比如说,我想要添加LibreOffice PPA到我的系统中。我应该Google该PPA,然后从Launchpad获得该仓库的名称,在本例中它是”libreoffice/ppa”。然后,使用下面的命令来添加该PPA:

sudo add-apt-repository ppa:libreoffice/ppa

它会要你按下回车键来导入密钥。完成后,使用’update’命令来刷新仓库,然后安装该包。

openSUSE拥有一个针对第三方应用的优雅的解决方案。你可以访问software.opensuse.org,一键点击搜索并安装相应包,它会自动将对应的仓库添加到你的系统中。如果你想要手工添加仓库,可以使用该命令:

sudo zypper ar -f url_of_the_repo name_of_repo
sudo zypper ar -f http://download.opensuse.org/repositories/LibreOffice:Factory/openSUSE_13.2/LibreOffice:Factory.repo LOF

然后,刷新仓库并安装软件:

sudo zypper refresh
sudo zypper install libreoffice

Fedora用户只需要添加RPMFusion(包括自由软件和非自由软件仓库),该仓库包含了大量的应用。如果你需要添加该仓库,命令如下:

dnf config-manager --add-repo http://www.example.com/example.repo

一些基本命令

我已经写了一些关于使用CLI来管理你系统上的文件的文章,下面介绍一些基本命令,这些命令在所有发行版上都经常会用到。

拷贝文件或目录到一个新的位置:

cp path_of_file_1 path_of_the_directory_where_you_want_to_copy/

将某个目录中的所有文件拷贝到一个新的位置(注意斜线和星号,它指的是该目录下的所有文件):

cp path_of_files/* path_of_the_directory_where_you_want_to_copy/

将一个文件从某个位置移动到另一个位置(尾斜杠是说放在该目录中):

mv path_of_file_1 path_of_the_directory_where_you_want_to_move/

将所有文件从一个位置移动到另一个位置:

mv path_of_directory_where_files_are/* path_of_the_directory_where_you_want_to_move/

删除一个文件:

rm path_of_file

删除一个目录:

rm -r path_of_directory

移除目录中所有内容,完整保留目录文件夹:

rm -r path_of_directory/*

创建新目录

要创建一个新目录,首先进入到你要创建该目录的位置。比如说,你想要在你的Documents目录中创建一个名为’foundation’的文件夹。让我们使用 cd (即change directory,改变目录)命令来改变目录:

cd /home/swapnil/Documents

(替换’swapnil’为你系统中的用户名)

然后,使用 mkdir 命令来创建该目录:

mkdir foundation

你也可以从任何地方创建一个目录,通过指定该目录的路径即可。例如:

mdkir /home/swapnil/Documents/foundation

如果你想要连父目录一起创建,那么可以使用 -p 选项。它会在指定路径中创建所有目录:

mdkir -p /home/swapnil/Documents/linux/foundation

成为root

你或许需要成为root,或者具有sudo权力的用户,来实施一些管理任务,如管理软件包或者对根目录或其下的文件进行一些修改。其中一个例子就是编辑’fstab’文件,该文件记录了挂载的硬盘驱动器。它在’etc’目录中,而该目录又在根目录中,你只能作为超级用户来修改该文件。在大多数的发行版中,你可以通过’su’来成为root。比如说,在openSUSE上,我想要成为root,因为我要在根目录中工作,你可以使用下面的命令之一:

sudo su -

su -

该命令会要求输入密码,然后你就具有root特权了。记住一点:千万不要以root用户来运行系统,除非你知道你正在做什么。另外重要的一点需要注意的是,你以root什么对目录或文件进行修改后,会将它们的拥有关系从该用户或特定的服务改变为root。你必须恢复这些文件的拥有关系,否则该服务或用户就不能访问或写入到那些文件。要改变用户,命令如下:

sudo chown -R 用户:组 文件或目录名

当你将其它发行版上的分区挂载到系统中时,你可能经常需要该操作。当你试着访问这些分区上的文件时,你可能会碰到权限拒绝错误,你只需要改变这些分区的拥有关系就可以访问它们了。需要额外当心的是,不要改变根目录的权限或者拥有关系。

这些就是Linux新手们需要的基本命令。如果你有任何问题,或者如果你想要我们涵盖一个特定的话题,请在下面的评论中告诉我们吧。


via: http://www.linux.com/learn/tutorials/842251-must-know-linux-commands-for-new-users

作者:Swapnil Bhartiya 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-5982-1.html

发布 JavaScript 开源项目指南

你刚刚完成自己第一个JavaScript库的开发,同时你认为它可以帮助到其他人。你已经听到人们讨论“开源运动”或“GitHub简历”,但你在共享软件这方面上仍然是个新手。

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

也许你还在学校,你想开始创建一个在线简历。或者你已经开始在公司工作,比如 Conductor,这个公司鼓励开发人员为开源社区做贡献(见  Hoard 和 Kangaroo)。这篇文章将讲述一些工具和技术,你可以用来发布一个值得信赖的开源JavaScript库。

让你电脑上的源代码能够得到别人的信任,并且在他们自己的项目中使用你的库,你需要完成几个重要的步骤。这篇文章就是围绕这一过程来组织。

对于这次操练,你会看到 backbone.freeze,这是我写的一个简单的库,它用于支持Backbone.js的不可变的集合。我假设你有一个库的本地版本,并且代码在一个准备发布的地方。

库文件的原来的样子

托管(或将“源代码”放到“开放源码项目”)

让人们使用你的代码的第一步是,让你的代码在网上可用!当今托管代码流行的地方是GitHub,本指南将使用它,但是你也可以使用任何你熟悉的托管网站。

代码在线(或者分享)

如果你还没有一个GitHub账号,把这篇文章先放放,去创建一个。如果有一个?很好!现在来创建一个新的仓库。

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

我们的新仓库

现在上传你的代码到GitHub。这篇文章假定你熟悉 git(或另一个版本控制系统)。如果你不知道如何做到这一点,看看 这个指南 。

这时,您应该有一个不错的仓库,里面都是你写的代码。拍拍自己的后背,庆祝一下你的第一个开源项目。做到这一步,现在请丰富你的README.md文件。这样人们可以知道项目用途。

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

初始化状态的仓库

许可(或允许人们使用你的代码)

当你决定将你的代码发布在网上,你需要回答的一个问题是,“如何允许别人使用它?“,在这篇文章中,您将为项目添加一个许可证。毕竟,现在是思考这个问题的时候了。有关许可证的更多信息,请查看 这个网站。我为 backbone.freeze 选择了MIT 许可证。因为它非常宽松,同时在GitHub上托管的JavaScript项目上它非常流行,这意味着其他JavaScript开发人员,在知道我的代码能做什么和不能做什么的理解上没有问题。

遵循社区标准(或者做一个他人确实会使用的项目)

想象你是无辜的 JavaScript 程序员先生或女士。你偶然发现这个仓库。你认为,”嘿,这填补了我的一个需求!“作为一个JavaScript开源社区的成员,你需要知道有一些开放源码项目的质量标准。除非它符合这些标准,不然你不可能使用这些代码。

让你的代码符合这些标准!

与JavaScript社区特别相关的两个标准是依赖管理和测试。

依赖管理

当你的项目依赖于外部库或模块,你需要一个简单的方法来管理这些依赖关系。当然,你可能只是简单地复制并粘贴另一个库的源码到你的项目源码,但这很难处理版本变更和确保你的依赖关系的准确性。这就是为什么依赖管理器可以使你变得更轻松。它允许用户调用’install[library]‘,来获取所有依赖项库的最新版本或他们的代码所依赖的任何其他库。

在JavaScript领域,有一个流行的依赖管理器 npm。这篇文章将使用npm作为依赖管理,但是你可以使用其他任何你觉得合适的工具。

如果你没有npm,花一些时间来安装它。 (说明在这里)

首先,你需要使用命令“npm init”来建立一个新的npm项目。最好猜猜这些配置选项,你可能会改变其中的一些。

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

如果你看看backbone.freeze的配置选项,您将看到两个重要的事情。第一个是许可证,回忆我让你在上面思考的有关许可证的事项?这就是填写许可证的地方。

同时,你会发现有一个测试命令。您现在可以忽略,或者写上“gulp test”——我将马上解释它的含义。

现在您已经准备好去测试。

测试

测试是让用户看到你的库是实际如何工作的一种简单方法,同时能让用户信任你的代码能做到你所声称能做的事情,即使是边界情况。所以让我们为你的插件编写一些测试!

安装包

首先,你需要设置将用来编写测试的工具。本教程将使用以下:

npm install--save-dev mocha chai

现在你有npm,你准备安装它们。

npm install--save-dev mocha chai

(Mocha是一个JavaScript测试框架。Chai是一个JavaScript预测库,对测试很有用)。

配置

在你的目录变得混乱之前(新的package.json和node_modules目录之间,你可能感觉有点拥挤),是时候遵循标准的约定并移动你的源代码到“src”目录了。

此外,您将使用另一个额外的组织方式,创建一个名为“spec”的目录,在这里面你将放置所有的测试。

确保你所有的测试都可以使用Chai,你需要在spec目录中创建一个“setup.js”文件。在该文件中,您需要设置Chai

'use strict';
var chai = require('chai');
global.expect = chai.expect;

你可通过输入“mocha spec/ *.js”来检验以上是否成功,可以看到测试运行成功(包含0个测试)。

编写所有测试! ! !

花一些时间来编写测试。它们都应该放在spec目录中。

如果你从来没有编写过测试,看看 backbone.freeze的测试。在你编写这些测试时,我去拿一杯咖啡…

…都做完了吗?好。现在,当你再次运行“npm test”命令,你应该看到,所有的测试用例都在运行,且通过。(如果它们没有通过,修复之后再继续!)

既然你已经做完了,把新代码上传到GitHub。

自动化

大多数JavaScript开发人员使用某种自动化工作流,使编写和运行测试的过程更容易一些。有几种常用的工具,但是这篇文章将使用 gulp。你在本教程中会用它来干几件事,现在它将帮助启动测试。首先,安装 gulp 和 gulp mocha 插件。

npm install--save-dev gulp gulp-mocha

你需要在父目录中添加一个gulpfile.js,它包含以下行:

'use strict';
require('./gulp');

该文件表示,它将监视一个名为“gulp”的目录,所以你需要创建它。在这个目录中,创建一个index.js文件,它是被gulp执行所有JavaScript文件的入口点。然后创建一个名为“task”的文件夹——index.js将引用该目录下的所有文件,以便gulp知道它们。

'use strict';var fs = require('fs');
var tasks = fs.readdirSync('./gulp/tasks');
var gulp = require('gulp');tasks.forEach(function(task) {
  require('./tasks/' + task);
});

现在进行最后一点复制-粘贴。在你的task目录,创建一个测试任务,它将启动所有测试:

'use strict';
var gulp = require('gulp');
var mocha = require('gulp-mocha');gulp.task('test', function () {
  return gulp.src(['./spec/setup.js', './spec/**/*.spec.js'], { read: false })
    .pipe(mocha({ reporter: 'spec' }));
});

您会注意到test.js这个gulp task引用了spec目录,并加载了setup.js文件。

在这之后,你的目录应该像这样:

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

是否记得我在文章中提到的npm初始化步骤“gulp test”?这里是它存在的地方。使用你喜欢的文本编辑器打开package.json,并确保它有这样一段脚本:

"scripts": {
  "test": "gulp test"
},

package.json 中的这一行,告诉 npm 如何执行你的测试。

这是一个很好的测试,以确保你在正确地做所有事:在你的项目目录,运行“npm test”,并确保你看到相同的测试输出。

持续集成 (或者,确保每个人都知道你的最新更新没有破坏任何东西)

既然您已经有一个全面的测试套件,那您需要一种方法来向用户保证,你发布的新版本不会破坏任何功能。这就是持续集成。“持续集成”意味着将不断测试代码。(或表示代码不断更新,在每一次提交。)

这里有很多工具可以使用。这篇文章将使用一个非常棒工具,名为Travis CI,它为任何公共的GitHub项目提供免费的持续集成。

你需要做的第一件事是添加一个travis-ci配置文件到你的仓库。这个文件会告诉Travis你的项目语言。在那里,Travis可以判断需要执行的命令,并运行你的测试。

language: node_js

将 travis-ci.org与GitHub账户连接。然后导航到仓库页面,点击右上角你名字的位置。您应该在GitHub账户列表看到一个公共仓库。移动滑块 ldibrary 到 on。可能需要一些时间,但最终,Travis将运行你的测试,并让你知道构建正在进行。

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

你可能会想在GitHub页面嵌入构建信息,这样一个感兴趣的用户一眼就可以看到,你的代码是稳定且可信赖的。如果你点击仓库名称旁边的图片(在顶部,显示为“buid|passing”)应该会看到一个弹出框。选择“Markdown”并复制文本框的内容。你可以粘贴到你的README.md文件,并更新到GitHub。如果你做对了,GitHub页面现在看起来应该像这样:

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

注意,你是如何一眼就可以看出这是通过所有的测试

兼容性(确保每个人都能使用你的库)

现在您已经发布一个JavaScript项目,它提供可靠的测试和持续集成,你要确保每个人都可以使用它。在JavaScript中,一些人使用AMD(RequireJS)加载库或模块,一些人使用CommonJS(Node.js),而有些人通过script标签明确引用每一个文件。这样很难保证马上就能兼容所有这些导入策略。

幸运的是,有一个叫做webpack库,使所有这些变的简单!确保你的库是打包的,这样它对每个人都可用,无论他们使用什么模块系统(或不使用,视情况而定)。你需要一个名为“del”的工具来删除文件。

npm install--save-dev gulp-webpack del

这里说说打包过程是如何工作的:你需要创建一个名为“dist”的目录(发布的简称),这是“兼容”版本库的存放位置。你需要一个gulp任务来创建它,以及一个gulp任务来清理目录。让我们先从清理任务开始。

'use strict';var gulp = require('gulp');
var del = require('del');gulp.task('clean', function (cb) {
  del([
    'dist'
  ], cb);
});

这不是那么糟糕!您只需创建一个任务,删除dist文件夹。现在看看dist。

'use strict';
var gulp = require('gulp');
var webpack = require('gulp-webpack');
gulp.task('dist', function () {
    return gulp.src('src/[LIBRARY ENTRY POINT (i.e. backbone.freeze.js)]')
        .pipe(webpack({
        output: {
            filename: '[NAME OF FINAL FILE (i.e. backbone.freeze.js)]',
            libraryTarget: 'umd'
        },
        externals: {
            backbone: {
                amd: 'backbone',
                commonjs: 'backbone',
                commonjs2: 'backbone',
                root: 'Backbone'
            },
            underscore: {
                amd: 'underscore',
                commonjs: 'underscore',
                commonjs2: 'underscore',
                root: '_'
            },
            devtool: 'source-map'`
        }
    }))
        .pipe(gulp.dest('dist'));
});

在括号部分内,分别填写库入口点的文件名和输出文件的最终名。你可以通过在命令行运行“gulp dist”和“gulp clean”来确保一切正常运行,并检查文件夹和文件是否都创建或者移除。

发布 JavaScript 开源项目指南
发布 JavaScript 开源项目指南

注意:dist文件夹在dist任务后出现,clean任务后消失。

现在你的库马上可以广泛使用了!剩下要做的唯一一件事是…

发布(确保每个人都能得到你的代码)

有两种流行的方式获得一个JavaScript库,技术上有三个,但你可以忽视直接从GitHub页面下载 .js 文件,因为这里已经准备好:Bower 和 npm。

想想前面的步骤,您通过依赖管理设置您的项目?不久后的某一天,某天真的JavaScript程序员先生或女士,能够在她喜欢的依赖管理工具下输入 ‘install [你的库]’,它就工作了!

在以下步骤,你会将代码被纳入公共仓库,并使用这两种常用的依赖管理工具,使其可用于所有其他开发人员。

配置

Bower和npm都依赖于配置文件。(npm的package.json。)因为你没有一个Bower配置文件,您需要做的第一件事是写一个gulp任务来为你生成一个。你可能会问“为什么?“。因为你不想维护两个不同的配置文件。一旦你准备好发布,您可以通过运行“gulp dist”来为所有部件的发布做准备。

你需要为此安装两个库。

npm install--save-dev gulp-rename gulp-json-editor

现在你需要准备:

"use strict";
var gulp = require('gulp');
var rename = require('gulp-rename');
var jeditor = require('gulp-json-editor');
var _ = require('underscore');
gulp.task('bower', function () {
    return gulp.src('./package.json')
        .pipe(rename('bower.json'))
        .pipe(jeditor(function (json) {
        return _.pick(json, [
            'name',
            'version',
            'description',
            'main',
            'keywords',
            'author',
            'license',
            'dependencies'
        ]);
    }))
        .pipe(gulp.dest('.'));
});

修改gulp/tasks/dist.js中gulp.task处,包含以下代码([‘bower’]):

gulp.task('dist', ['bower'], function () {

这确保了dist运行时,Bower任务参与了。

现在您需要发布代码到这两个仓库。首先,你需要为您的库选择一个还没有使用的名称。搜索npm registry和 Bower registry ,以确保一个你想要的名字没被使用。(如果被用了,你需要改变package.json。)

在你发布你的代码之前,更新您的文档让用户知道如何获取代码。添加这些到README.md(填入库名):

#Installing
Freeze is available on npm and Bower as "backbone.freeze"
```
bower install backbone.freeze
OR
npm install backbone.freeze
```

注意,发布到npm和Bower上包有一些约定。根据你发布的代码,您可能不希望发布到两个仓库。选择正确的依赖管理系统的更多信息,看看这篇文章 StackOverflow

npm

npm发布很简单——只是设置 npm 作者信息:

npm set init.author.name "Your Name"
npm set init.author.email "you@example.com"
npm set init.author.url "http://yourblog.com"
npm adduser

输入 ‘npm publish. /’.

好了!你已经正式发布在npm !

Bower

发布一个包到Bower有点复杂。

首先,在你项目的git仓库中创建一个标签。

'git tag -a [VERSION] -m "released [VERSION]"'

…”([VERSION])”是package.json中的当前版本号。

接下来,将该标记上传GitHub。

'git push origin [VERSION]'

然后用Bower注册您的项目。

'bower register [PACKAGE NAME] [GIT ENDPOINT]'

…”[PACKAGE NAME]”是库的名称(对我来说,它是“backbone.freeze”),“[GIT ENDPOINT]”是github上的.git文件的url(对我来说,它是“git://github.com/benmanbs/freeze.git”)。

现在库已经注册,当你把新的标签更新到GitHub,它会在Bower自动更新。

最后的话

我编写的一些脚本,你可能用得上。

把这两个文件放在你的库的父文件夹中: publish.shupdate_version.rb

脚本需要版本类型(大版本号,小版本号或补丁号),在package.json中添加你的版本号,生成一个bower.json和dist,并同时发布到npm和Bower。

现在您已经没有从头学习这一切的麻烦,这是我创建的一个 骨架项目,包括了我在上面描述的标准框架。

如果你在这个过程中有任何麻烦,随时给我发 电子邮件

如果你发现自己需要Backbone的不变集合,可以看看 backbone.freeze!

来源:http://web.jobbole.com/82966/

Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

对于那些主要通过控制台或终端使用 Linux 命令行来工作的 Linux 用户来说,他们真切地感受到了 Linux 的强大。 然而在 Linux 的分层文件系统中进行导航有时或许是一件头疼的事,尤其是对于那些新手来说。

现在,有一个用 Python 写的名为 autojump 的 Linux 命令行实用程序,它是 Linux ‘cd’命令的高级版本。

Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

Autojump – Linux 文件系统导航的最快方式

这个应用原本由 Joël Schaerer 编写,现在由 +William Ting 维护。

Autojump 应用可以从用户那里学习并帮助用户在 Linux 命令行中进行更轻松的目录导航。与传统的 cd 命令相比,autojump 能够更加快速地导航至目的目录。

autojump 的特色

  • 自由开源的应用,在 GPL V3 协议下发布。
  • 自主学习的应用,从用户的导航习惯中学习。
  • 更快速地导航。不必包含子目录的名称。
  • 对于大多数的标准 Linux 发行版本,能够在软件仓库中下载得到,它们包括 Debian (testing/unstable), Ubuntu, Mint, Arch, Gentoo, Slackware, CentOS, RedHat 和 Fedora。
  • 也能在其他平台中使用,例如 OS X(使用 Homebrew) 和 Windows (通过 Clink 来实现)
  • 使用 autojump 你可以跳至任何特定的目录或一个子目录。你还可以用文件管理器打开某个目录,并查看你在某个目录中所待时间的统计数据。

前提

  • 版本号不低于 2.6 的 Python

第 1 步: 做一次完整的系统升级

1、 以 root 用户的身份,做一次系统更新或升级,以此保证你安装有最新版本的 Python。

# apt-get update && apt-get upgrade && apt-get dist-upgrade [基于 APT 的系统]
# yum update && yum upgrade [基于 YUM 的系统]
# dnf update && dnf upgrade [基于 DNF 的系统]

: 这里特别提醒,在基于 YUM 或 DNF 的系统中,更新和升级执行相同的行动,大多数时间里它们是通用的,这点与基于 APT 的系统不同。

第 2 步: 下载和安装 Autojump

2、 正如前面所言,在大多数的 Linux 发行版本的软件仓库中, autojump 都可获取到。通过包管理器你就可以安装它。但若你想从源代码开始来安装它,你需要克隆源代码并执行 python 脚本,如下面所示:

从源代码安装

若没有安装 git,请安装它。我们需要使用它来克隆 git 仓库。

# apt-get install git   [基于 APT 的系统]
# yum install git       [基于 YUM 的系统]
# dnf install git       [基于 DNF 的系统]

一旦安装完 git,以普通用户身份登录,然后像下面那样来克隆 autojump:

$ git clone git://github.com/joelthelion/autojump.git

接着,使用 cd 命令切换到下载目录。

$ cd autojump

下载,赋予安装脚本文件可执行权限,并以 root 用户身份来运行安装脚本。

# chmod 755 install.py
# ./install.py

从软件仓库中安装

3、 假如你不想麻烦,你可以以 root 用户身份从软件仓库中直接安装它:

在 Debian, Ubuntu, Mint 及类似系统中安装 autojump :

# apt-get install autojump

为了在 Fedora, CentOS, RedHat 及类似系统中安装 autojump, 你需要启用 EPEL 软件仓库

# yum install epel-release
# yum install autojump
或
# dnf install autojump

第 3 步: 安装后的配置

4、 在 Debian 及其衍生系统 (Ubuntu, Mint,…) 中, 激活 autojump 应用是非常重要的。

为了暂时激活 autojump 应用,即直到你关闭当前会话或打开一个新的会话之前让 autojump 均有效,你需要以常规用户身份运行下面的命令:

$ source /usr/share/autojump/autojump.sh on startup

为了使得 autojump 在 BASH shell 中永久有效,你需要运行下面的命令。

$ echo '. /usr/share/autojump/autojump.sh' >> ~/.bashrc

第 4 步: Autojump 的预测试和使用

5、 如先前所言, autojump 将只跳到先前 cd 命令到过的目录。所以在我们开始测试之前,我们要使用 cd 切换到一些目录中去,并创建一些目录。下面是我所执行的命令。

$ cd
$ cd
$ cd Desktop/
$ cd
$ cd Documents/
$ cd
$ cd Downloads/
$ cd
$ cd Music/
$ cd
$ cd Pictures/
$ cd
$ cd Public/
$ cd
$ cd Templates
$ cd
$ cd /var/www/
$ cd
$ mkdir autojump-test/
$ cd
$ mkdir autojump-test/a/ && cd autojump-test/a/
$ cd
$ mkdir autojump-test/b/ && cd autojump-test/b/
$ cd
$ mkdir autojump-test/c/ && cd autojump-test/c/
$ cd

现在,我们已经切换到过上面所列的目录,并为了测试创建了一些目录,一切准备就绪,让我们开始吧。

需要记住的一点 : j 是 autojump 的一个封装,你可以使用 j 来代替 autojump, 相反亦可。

6、 使用 -v 选项查看安装的 autojump 的版本。

$ j -v
或
$ autojump -v

查看 Autojump 的版本

查看 Autojump 的版本

7、 跳到先前到过的目录 ‘/var/www‘。

$ j www

跳到目录

跳到目录

8、 跳到先前到过的子目录‘/home/avi/autojump-test/b‘ 而不键入子目录的全名。

$ jc b

跳到子目录

跳到子目录

9、 使用下面的命令,你就可以从命令行打开一个文件管理器,例如 GNOME Nautilus ,而不是跳到一个目录。

$ jo www

打开目录

打开目录

Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

在文件管理器中打开目录

你也可以在一个文件管理器中打开一个子目录。

$ jco c

打开子目录

打开子目录

Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

在文件管理器中打开子目录

10、 查看每个文件夹的权重和全部文件夹计算得出的总权重的统计数据。文件夹的权重代表在这个文件夹中所花的总时间。 文件夹权重是该列表中目录的数字。(LCTT 译注: 在这一句中,我觉得原文中的 if 应该为 is)

$ j --stat
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

查看文件夹统计数据

提醒 : autojump 存储其运行日志和错误日志的地方是文件夹 ~/.local/share/autojump/。千万不要重写这些文件,否则你将失去你所有的统计状态结果。

$ ls -l ~/.local/share/autojump/

Autojump 的日志

Autojump 的日志

11、 假如需要,你只需运行下面的命令就可以查看帮助 :

$ j --help
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令

Autojump 的帮助和选项

功能需求和已知的冲突

  • autojump 只能让你跳到那些你已经用 cd 到过的目录。一旦你用 cd 切换到一个特定的目录,这个行为就会被记录到 autojump 的数据库中,这样 autojump 才能工作。不管怎样,在你设定了 autojump 后,你不能跳到那些你没有用 cd 到过的目录。
  • 你不能跳到名称以破折号 (-) 开头的目录。或许你可以考虑阅读我的有关操作文件或目录 的文章,尤其是有关操作那些以‘-‘ 或其他特殊字符开头的文件和目录的内容。
  • 在 BASH shell 中,autojump 通过修改 $PROMPT_COMMAND 环境变量来跟踪目录的行为,所以强烈建议不要去重写 $PROMPT_COMMAND 这个环境变量。若你需要添加其他的命令到现存的 $PROMPT_COMMAND 环境变量中,请添加到$PROMPT_COMMAND 环境变量的最后。

结论:

假如你是一个命令行用户, autojump 是你必备的实用程序。它可以简化许多事情。它是一个在命令行中导航 Linux 目录的绝佳的程序。请自行尝试它,并在下面的评论框中让我知晓你宝贵的反馈。保持联系,保持分享。喜爱并分享,帮助我们更好地传播。


via: http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/

作者:Avishek Kumar 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-5983-1.html

如何在 Ubuntu 上安装配置管理系统 Chef (大厨)

Chef是面对IT专业人员的一款配置管理和自动化工具,它可以配置和管理你的基础设施(设备),无论它在本地还是在云上。它可以用于加速应用部署并协调多个系统管理员和开发人员的工作,这包括可支持大量的客户群的成百上千的服务器和程序。chef最有用的是让基础设施变成代码。一旦你掌握了Chef,你可以获得自动化管理你的云端基础设施或者终端用户的一流的网络IT支持。

下面是我们将要在本篇中要设置和配置Chef的主要组件。

如何在 Ubuntu 上安装配置管理系统 Chef (大厨)
如何在 Ubuntu 上安装配置管理系统 Chef (大厨)

安装Chef的要求和版本

我们将在下面的基础环境下设置Chef配置管理系统。

管理和配置工具:Chef  
基础操作系统 Ubuntu 14.04.1 LTS (x86_64)
Chef Server Version 12.1.0
Chef Manage Version 1.17.0
Chef Development Kit Version 0.6.2
内存和CPU 4 GB  , 2.0+2.0 GHz

Chef服务端的安装和配置

Chef服务端是核心组件,它存储配置以及其他和工作站交互的配置数据。让我们在他们的官网https://www.chef.io下载最新的安装文件。

我使用下面的命令来下载和安装它。

1) 下载Chef服务端

root@ubuntu-14-chef:/tmp# wget https://web-dl.packagecloud.io/chef/stable/packages/ubuntu/trusty/chef-server-core_12.1.0-1_amd64.deb

2) 安装Chef服务端

root@ubuntu-14-chef:/tmp# dpkg -i chef-server-core_12.1.0-1_amd64.deb

3) 重新配置Chef服务端

现在运行下面的命令来启动所有的chef服务端服务,这一步也许会花费一些时间,因为它需要由许多不同一起工作的服务组成一个可正常运作的系统。

root@ubuntu-14-chef:/tmp# chef-server-ctl reconfigure

chef服务端启动命令’chef-server-ctl reconfigure’需要运行两次,这样就会在安装后看到这样的输出。

Chef Client finished, 342/350 resources updated in 113.71139964 seconds
opscode Reconfigured!

4) 重启系统

安装完成后重启系统使系统能最好的工作,不然我们或许会在创建用户的时候看到下面的SSL连接错误。

ERROR: Errno::ECONNRESET: Connection reset by peer - SSL_connect

5) 创建新的管理员

运行下面的命令来创建一个新的管理员账户及其配置。创建过程中,用户的RSA私钥会自动生成,它需要保存到一个安全的地方。–file选项会保存RSA私钥到指定的路径下。

root@ubuntu-14-chef:/tmp# chef-server-ctl user-create kashi kashi kashi kashif.fareedi@gmail.com kashi123 --filename /root/kashi.pem

Chef服务端的管理设置

Chef Manage是一个针对企业级Chef用户的管理控制台,它提供了可视化的web用户界面,可以管理节点、数据包、规则、环境、Cookbook 和基于角色的访问控制(RBAC)。

1) 下载Chef Manage

从官网复制链接并下载chef manage的安装包。

root@ubuntu-14-chef:~# wget https://web-dl.packagecloud.io/chef/stable/packages/ubuntu/trusty/opscode-manage_1.17.0-1_amd64.deb

2) 安装Chef Manage

使用下面的命令在root的家目录下安装它。

root@ubuntu-14-chef:~# chef-server-ctl install opscode-manage --path /root

3) 重启Chef Manage和服务端

安装完成后我们需要运行下面的命令来重启chef manage和服务端。

root@ubuntu-14-chef:~# opscode-manage-ctl reconfigure
root@ubuntu-14-chef:~# chef-server-ctl reconfigure

Chef Manage网页控制台

我们可以使用localhost或它的域名来访问网页控制台,并用已经创建的管理员登录

如何在 Ubuntu 上安装配置管理系统 Chef (大厨)
如何在 Ubuntu 上安装配置管理系统 Chef (大厨)

1) Chef Manage创建新的组织

你或许被要求创建新的组织,或者也可以接受其他组织的邀请。如下所示,使用缩写和全名来创建一个新的组织。

如何在 Ubuntu 上安装配置管理系统 Chef (大厨)
如何在 Ubuntu 上安装配置管理系统 Chef (大厨)

2) 用命令行创建新的组织

我们同样也可以运行下面的命令来创建新的组织。

root@ubuntu-14-chef:~# chef-server-ctl org-create linux Linoxide Linux Org. --association_user kashi --filename linux.pem

设置工作站

我们已经完成安装chef服务端,现在我们可以开始创建任何recipes(基础配置元素)、cookbooks(基础配置集)、attributes(节点属性),以及做一些其他修改。

1) 在Chef服务端上创建新的用户和组织

为了设置工作站,我们需要用命令行创建一个新的用户和组织。

root@ubuntu-14-chef:~# chef-server-ctl user-create bloger Bloger Kashif bloger.kashif@gmail.com bloger123 --filename bloger.pem
root@ubuntu-14-chef:~# chef-server-ctl org-create blogs Linoxide Blogs Inc. --association_user bloger --filename blogs.pem

2) 下载工作站入门套件

在工作站的网页控制台中下载并保存入门套件,它用于与服务端协同工作

如何在 Ubuntu 上安装配置管理系统 Chef (大厨)
如何在 Ubuntu 上安装配置管理系统 Chef (大厨)

3) 下载套件后,点击”Proceed”

starter kit

用于工作站的Chef开发套件设置

Chef开发套件是一款包含开发chef所需的所有工具的软件包。它捆绑了由Chef开发的带Chef客户端的工具。

1) 下载 Chef  DK

我们可以从它的官网链接中下载开发包,并选择操作系统来下载chef开发包。

如何在 Ubuntu 上安装配置管理系统 Chef (大厨)
如何在 Ubuntu 上安装配置管理系统 Chef (大厨)

复制链接并用wget下载

root@ubuntu-15-WKS:~# wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.6.2-1_amd64.deb

2) Chef开发套件安装

使用dpkg命令安装开发套件

root@ubuntu-15-WKS:~# dpkg -i chefdk_0.6.2-1_amd64.deb

3) Chef DK 验证

使用下面的命令验证客户端是否已经正确安装。

root@ubuntu-15-WKS:~# chef verify

Running verification for component 'berkshelf'
Running verification for component 'test-kitchen'
Running verification for component 'chef-client'
Running verification for component 'chef-dk'
Running verification for component 'chefspec'
Running verification for component 'rubocop'
Running verification for component 'fauxhai'
Running verification for component 'knife-spork'
Running verification for component 'kitchen-vagrant'
Running verification for component 'package installation'
Running verification for component 'openssl'
..............
---------------------------------------------
Verification of component 'rubocop' succeeded.
Verification of component 'knife-spork' succeeded.
Verification of component 'openssl' succeeded.
Verification of component 'berkshelf' succeeded.
Verification of component 'chef-dk' succeeded.
Verification of component 'fauxhai' succeeded.
Verification of component 'test-kitchen' succeeded.
Verification of component 'kitchen-vagrant' succeeded.
Verification of component 'chef-client' succeeded.
Verification of component 'chefspec' succeeded.
Verification of component 'package installation' succeeded.

4) 连接Chef服务端

我们将创建 ~/.chef目录,并从chef服务端复制两个用户和组织的pem文件到该目录下。

root@ubuntu-14-chef:~# scp bloger.pem blogs.pem kashi.pem linux.pem root@172.25.10.172:/.chef/

root@172.25.10.172's password:
bloger.pem 100% 1674 1.6KB/s 00:00
blogs.pem 100% 1674 1.6KB/s 00:00
kashi.pem 100% 1678 1.6KB/s 00:00
linux.pem 100% 1678 1.6KB/s 00:00

5) 编辑配置来管理chef环境 **

现在使用下面的内容创建”~/.chef/knife.rb”。

root@ubuntu-15-WKS:/.chef# vim knife.rb
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name "kashi"
client_key "#{current_dir}/kashi.pem"
validation_client_name "kashi-linux"
validation_key "#{current_dir}/linux.pem"
chef_server_url "https://172.25.10.173/organizations/linux"
cache_type 'BasicFile'
cache_options( :path => "#{ENV['HOME']}/.chef/checksums" )
cookbook_path ["#{current_dir}/../cookbooks"]

创建knife.rb中指定的“~/cookbooks”文件夹。

root@ubuntu-15-WKS:/# mkdir cookbooks

6) 测试Knife配置

运行“knife user list”和“knife client list”来验证knife是否工作。

root@ubuntu-15-WKS:/.chef# knife user list

第一次运行的时候可能会看到下面的错误,这是因为工作站上还没有chef服务端的SSL证书。

ERROR: SSL Validation failure connecting to host: 172.25.10.173 - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
ERROR: Could not establish a secure connection to the server.
Use `knife ssl check` to troubleshoot your SSL configuration.
If your Chef Server uses a self-signed certificate, you can use
`knife ssl fetch` to make knife trust the server's certificates.

要解决上面的命令的错误,运行下面的命令来获取ssl证书,并重新运行knife user和client list,这时候应该就可以了。

root@ubuntu-15-WKS:/.chef# knife ssl fetch
WARNING: Certificates from 172.25.10.173 will be fetched and placed in your trusted_cert
directory (/.chef/trusted_certs).

knife没有办法验证这些是否是有效的证书。你应该在下载时验证这些证书的真实性。

在/.chef/trusted_certs/ubuntu-14-chef_test_com.crt下面添加ubuntu-14-chef.test.com的证书。

在上面的命令取得ssl证书后,接着运行下面的命令。

root@ubuntu-15-WKS:/.chef#knife client list
kashi-linux

配置与chef服务端交互的新节点

节点是执行所有基础设施自动化的chef客户端。因此,在配置完chef-server和knife工作站后,通过配置与chef-server交互的新节点,来将新的服务端添加到我们的chef环境下。

我们使用下面的命令来添加与chef服务端协同工作的新节点。

root@ubuntu-15-WKS:~# knife bootstrap 172.25.10.170 --ssh-user root --ssh-password kashi123 --node-name mydns

Doing old-style registration with the validation key at /.chef/linux.pem...
Delete your validation key in order to use your user credentials instead
Connecting to 172.25.10.170
172.25.10.170 Installing Chef Client...
172.25.10.170 --2015-07-04 22:21:16-- https://www.opscode.com/chef/install.sh
172.25.10.170 Resolving www.opscode.com (www.opscode.com)... 184.106.28.91
172.25.10.170 Connecting to www.opscode.com (www.opscode.com)|184.106.28.91|:443... connected.
172.25.10.170 HTTP request sent, awaiting response... 200 OK
172.25.10.170 Length: 18736 (18K) [application/x-sh]
172.25.10.170 Saving to: ‘STDOUT’
172.25.10.170
100%[======================================>] 18,736 --.-K/s in 0s
172.25.10.170
172.25.10.170 2015-07-04 22:21:17 (200 MB/s) - written to stdout [18736/18736]
172.25.10.170
172.25.10.170 Downloading Chef 12 for ubuntu...
172.25.10.170 downloading https://www.opscode.com/chef/metadata?v=12&prerelease=false&nightlies=false&p=ubuntu&pv=14.04&m=x86_64
172.25.10.170 to file /tmp/install.sh.26024/metadata.txt
172.25.10.170 trying wget...

之后我们可以在knife节点列表下看到创建的新节点,它也会在新节点下创建新的客户端。

root@ubuntu-15-WKS:~# knife node list
mydns

类似地我们只要通过给上面的knife命令提供ssh证书,就可以在chef设施上创建多个节点。

总结

本篇我们学习了chef管理工具,并通过安装和配置设置基本了解了它的组件。我希望你在学习安装和配置Chef服务端以及它的工作站和客户端节点中获得乐趣。


via: http://linoxide.com/ubuntu-how-to/install-configure-chef-ubuntu-14-04-15-04/

作者:Kashif Siddique 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5984-1.html

如何收集 NGINX 指标(第二篇)

如何收集 NGINX 指标(第二篇)
如何收集 NGINX 指标(第二篇)

如何获取你所需要的 NGINX 指标

如何获取需要的指标取决于你正在使用的 NGINX 版本以及你希望看到哪些指标。(参见 如何监控 NGINX(第一篇) 来深入了解NGINX指标。)自由开源的 NGINX 和商业版的 NGINX Plus 都有可以报告指标度量的状态模块,NGINX 也可以在其日志中配置输出特定指标:

指标可用性

指标 NGINX (开源) NGINX Plus NGINX 日志
accepts(接受) / accepted(已接受) x x  
handled(已处理) x x  
dropped(已丢弃) x x  
active(活跃) x x  
requests (请求数)/ total(全部请求数) x x  
4xx 代码   x x
5xx 代码   x x
request time(请求处理时间)     x

指标收集:NGINX(开源版)

开源版的 NGINX 会在一个简单的状态页面上显示几个与服务器状态有关的基本指标,它们由你启用的 HTTP stub status module 所提供。要检查该模块是否已启用,运行以下命令:

nginx -V 2>&1 | grep -o with-http_stub_status_module

如果你看到终端输出了 httpstubstatus_module,说明该状态模块已启用。

如果该命令没有输出,你需要启用该状态模块。你可以在从源代码构建 NGINX 时使用 –with-http_stub_status_module 配置参数:

./configure
…
--with-http_stub_status_module
make
sudo make install

在验证该模块已经启用或你自己启用它后,你还需要修改 NGINX 配置文件,来给状态页面设置一个本地可访问的 URL(例如: /nginx_status):

server {
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

注:nginx 配置中的 server 块通常并不放在主配置文件中(例如:/etc/nginx/nginx.conf),而是放在主配置会加载的辅助配置文件中。要找到主配置文件,首先运行以下命令:

nginx -t

打开列出的主配置文件,在以 http 块结尾的附近查找以 include 开头的行,如:

include /etc/nginx/conf.d/*.conf;

在其中一个包含的配置文件中,你应该会找到主 server 块,你可以如上所示配置 NGINX 的指标输出。更改任何配置后,通过执行以下命令重新加载配置文件:

nginx -s reload

现在,你可以浏览状态页看到你的指标:

Active connections: 24
server accepts handled requests
1156958 1156958 4491319
Reading: 0 Writing: 18 Waiting : 6

请注意,如果你希望从远程计算机访问该状态页面,则需要将远程计算机的 IP 地址添加到你的状态配置文件的白名单中,在上面的配置文件中的白名单仅有 127.0.0.1。

NGINX 的状态页面是一种快速查看指标状况的简单方法,但当连续监测时,你需要按照标准间隔自动记录该数据。监控工具箱 Nagios 或者 Datadog,以及收集统计信息的服务 collectD 已经可以解析 NGINX 的状态信息了。

指标收集: NGINX Plus

商业版的 NGINX Plus 通过它的 ngxhttpstatus_module 提供了比开源版 NGINX 更多的指标。NGINX Plus 以字节流的方式提供这些额外的指标,提供了关于上游系统和高速缓存的信息。NGINX Plus 也会报告所有的 HTTP 状态码类型(1XX,2XX,3XX,4XX,5XX)的计数。一个 NGINX Plus 状态报告例子可在此查看

如何收集 NGINX 指标(第二篇)
如何收集 NGINX 指标(第二篇)

注:NGINX Plus 在状态仪表盘中的“Active”连接的定义和开源 NGINX 通过 stubstatusmodule 收集的“Active”连接指标略有不同。在 NGINX Plus 指标中,“Active”连接不包括Waiting状态的连接(即“Idle”连接)。

NGINX Plus 也可以输出 JSON 格式的指标,可以用于集成到其他监控系统。在 NGINX Plus 中,你可以看到 给定的上游服务器组的指标和健康状况,或者简单地从上游服务器的单个服务器得到响应代码的计数:

{"1xx":0,"2xx":3483032,"3xx":0,"4xx":23,"5xx":0,"total":3483055}

要启动 NGINX Plus 指标仪表盘,你可以在 NGINX 配置文件的 http 块内添加状态 server 块。 (参见上一节,为收集开源版 NGINX 指标而如何查找相关的配置文件的说明。)例如,要设置一个状态仪表盘 (http://your.ip.address:8080/status.html)和一个 JSON 接口(http://your.ip.address:8080/status),可以添加以下 server 块来设定:

server {
    listen 8080;
    root /usr/share/nginx/html;
    location /status {
        status;
    }
    location = /status.html {
    }
}

当你重新加载 NGINX 配置后,状态页就可以用了:

nginx -s reload

关于如何配置扩展状态模块,官方 NGINX Plus 文档有 详细介绍

指标收集:NGINX 日志

NGINX 的 日志模块 会把可自定义的访问日志写到你配置的指定位置。你可以通过添加或移除变量来自定义日志的格式和包含的数据。要存储详细的日志,最简单的方法是添加下面一行在你配置文件的 server 块中(参见上上节,为收集开源版 NGINX 指标而如何查找相关的配置文件的说明。):

access_log logs/host.access.log combined;

更改 NGINX 配置文件后,执行如下命令重新加载配置文件:

nginx -s reload

默认包含的 “combined” 的日志格式,会包括一系列关键的数据,如实际的 HTTP 请求和相应的响应代码。在下面的示例日志中,NGINX 记录了请求 /index.html 时的 200(成功)状态码和访问不存在的请求文件 /fail 的 404(未找到)错误。

127.0.0.1 - - [19/Feb/2015:12:10:46 -0500] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari 537.36"
127.0.0.1 - - [19/Feb/2015:12:11:05 -0500] "GET /fail HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36"

你可以通过在 NGINX 配置文件中的 http 块添加一个新的日志格式来记录请求处理时间:

log_format nginx '$remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent $request_time '
                 '"$http_referer" "$http_user_agent"';

并修改配置文件中 server 块的 access_log 行:

access_log logs/host.access.log nginx;

重新加载配置文件后(运行 nginx -s reload),你的访问日志将包括响应时间,如下所示。单位为秒,精度到毫秒。在这个例子中,服务器接收到一个对 /big.pdf 的请求时,发送 33973115 字节后返回 206(成功)状态码。处理请求用时 0.202 秒(202毫秒):

127.0.0.1 - - [19/Feb/2015:15:50:36 -0500] "GET /big.pdf HTTP/1.1" 206 33973115 0.202 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36"

你可以使用各种工具和服务来解析和分析 NGINX 日志。例如,rsyslog 可以监视你的日志,并将其传递给多个日志分析服务;你也可以使用自由开源工具,比如 logstash 来收集和分析日志;或者你可以使用一个统一日志记录层,如 Fluentd 来收集和解析你的 NGINX 日志。

结论

监视 NGINX 的哪一项指标将取决于你可用的工具,以及监控指标所提供的信息是否满足你们的需要。举例来说,错误率的收集是否足够重要到需要你们购买 NGINX Plus ,还是架设一个可以捕获和分析日志的系统就够了?

在 Datadog 中,我们已经集成了 NGINX 和 NGINX Plus,这样你就可以以最小的设置来收集和监控所有 Web 服务器的指标。在本文中了解如何用 NGINX Datadog 来监控 ,并开始 Datadog 的免费试用吧。


via: https://www.datadoghq.com/blog/how-to-collect-nginx-metrics/

作者:K Young 译者:strugglingyouth 校对:wxy

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

来源:https://linux.cn/article-5985-1.html

10个对开发者非常有用的设计原则

10个对开发者非常有用的设计原则
10个对开发者非常有用的设计原则

要点:我会尽力解释Jakob Nielsen的10设计启发式算法。我会用例子告诉你,作为一名开发人员,如何使你的产品以及你产品背后的代码更加有用。

为什么我要在乎这些?

开发者也是设计师,他们只是使用不同的媒介。因此,你知道如何设计系统也是你的最终产品的一部分。

关注于把底层设计的更加有用将会帮助确定以下事情:

  • 对新加入的开发人员更容易上手
  • 系统的可维护性及更改时的简易性
  • 作为这个系统的一名开发者,你是多么的有效率

当我与开发者一起工作的时候发现,这些观念已经在程序员之中存在了–只是他们还没有把这个表达给设计师。还有很多需要去做,但是基础已经存在了,这难道不是好消息吗?

在我的例子中并没有任何实际的代码,因为我觉得人们对于编写任何软件的正确方式都太敏感了。

像设计师一样,程序员喜欢运用他们的创造力来解决复杂的问题。而我宁愿你考虑一下下面关于设计系统的规则,而不是按照一组严格的规定来说“这是解决XX问题最好的方法”。

设计启发式是什么?

启发式只是通过你的经验中学习。它是用于查找在用户界面的易用性问题,使得它们可以参加到作为迭代设计过程的一部分的方法。

我们得到3-5个启发式设计的专家来使用我们的产品,并判断它是否符合最基本的可用性规则,即“10设计启发式”合规,这是启发式的简化。

下面让我们开始吧。

1. 系统状态的可视性

曾经上传图像到一个网站?比如说一个社交网络的头像?

主要的原则是要使你始终可以了解上传的状态。上面的例子只是告诉你上传的状态。而看到它的进步使用户更加舒服,你不觉得吗?

10-design-heuristics-1

2. 系统和现实世界之间的匹配

当写文档或命名一个组成部分,始终尝试使用熟悉的术语。了解目标用户是谁,然后使用他们熟悉的单词、短语和概念。

3. 用户控制和自由

10个对开发者非常有用的设计原则
10个对开发者非常有用的设计原则

系统应该允许你自由去探索其内容,但是以一种更加负责的方式,应该让你可以从你可能犯的错误中进行恢复。比如说支持“撤销”与“重做”。

4. 一致性和标准

苹果和微软都对“确定”和“取消”按钮的顺序有不同的意见。哪个更好?

10个对开发者非常有用的设计原则
10个对开发者非常有用的设计原则
10个对开发者非常有用的设计原则
10个对开发者非常有用的设计原则
都不好或者都好?当然,这并不重要,重要的是你要确保所有用户交互系统的一致性。

要做到这一点,你就不应该让你的用户困惑,为什么不一样的单词、不一样的环境或者操作确得到相同的结果。

5. 错误的预防

在错误可能发生的第一个位置阻止错误是非常重要的。

当我们一开始的时候,就有QA人员来寻找产品中的缺陷以保证产品质量。然后把他们放到生产线上,让他们指出如何在第一道工序开始就做出没有缺陷的产品。你会惊讶于这样的效率是多么的高,当你做的东西中的缺陷在第一时间被发现而不是到最后才被发现。

— Mary Poppendieck

6. 可识别性

显示出提升用户可用性的标识,这是另一个有帮助的内容。

CLI(命令行接口) 是一个完全无视这一原则的最好的例子,通过这样,它演示了优雅(它用灵活性与效率来弥补了它所缺少的)。

7. 灵活性和使用效率

在你的系统上提供一个潜在的、隐藏的层,来帮助有经验的用户通过“噪声”,变得更加有效率。

Cli 就是这样一个“隐藏”界面的功能是可以多么强大的例子(我们甚至可以选择扩展)。

8. 简洁

最初被列为“审美和简约设计”。这一原理是关于提高信噪比的。

你提供给用户的所有数据都要有一定的约束–是否有臃肿的HTTP请求的占用带宽、充满缺陷的API、以及需要太多请求的交互界面。

尽量用最小的输入,获得最大的产出。

9. 帮助用户识别、诊断和从错误中恢复

错误消息应该用平实的语言表达(没有代码),精确显示问题,建设性地提出一个解决方案。对用户是有用的。并且提供一个解决方案。

就像 这样

10. 帮助和文档

在设计原则的列表中看到这一项,我和你一样感到惊讶。

即便没有文档也可以使用的系统,最好也还是要提供帮助和文档。任何此类信息都应该易于搜索,关注用户的任务,列出具体的进行步骤,并切不应该太大。

总结

我希望这对你是有帮助的。如果你有任何问题或看法,请留言。

来源:http://info.9iphp.com/the-10-design-principles-for-developers/

Linux有问必答:如何在Linux上安装Git

问题: 我尝试从一个Git公共仓库克隆项目,但出现了这样的错误提示:“git: command not found”。 请问我该如何在某某发行版上安装Git?

Git是一个流行的开源版本控制系统(VCS),最初是为Linux环境开发的。跟CVS或者SVN这些版本控制系统不同的是,Git的版本控制被认为是“分布式的”,某种意义上,git的本地工作目录可以作为一个功能完善的仓库来使用,它具备完整的历史记录和版本追踪能力。在这种工作模型之下,各个协作者将内容提交到他们的本地仓库中(与之相对的会总是提交到核心仓库),如果有必要,再有选择性地推送到核心仓库。这就为Git这个版本管理系统带来了大型协作系统所必须的可扩展能力和冗余能力。

Linux有问必答:如何在Linux上安装Git
Linux有问必答:如何在Linux上安装Git

使用包管理器安装Git

Git已经被所有的主流Linux发行版所支持。所以安装它最简单的方法就是使用各个Linux发行版的包管理器。

Debian, Ubuntu, 或 Linux Mint

$ sudo apt-get install git

Fedora, CentOS 或 RHEL

$ sudo yum install git
或
$ sudo dnf install git

Arch Linux

$ sudo pacman -S git

OpenSUSE

$ sudo zypper install git

Gentoo

$ emerge --ask --verbose dev-vcs/git

从源码安装Git

如果由于某些原因,你希望从源码安装Git,按照如下介绍操作。

安装依赖包

在构建Git之前,先安装它的依赖包。

Debian, Ubuntu 或 Linux Mint

$ sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev asciidoc xmlto docbook2x

Fedora, CentOS 或 RHEL

$ sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc xmlto docbook2x

从源码编译Git

https://github.com/git/git/releases 下载最新版本的Git。然后在/usr下构建和安装。

注意,如果你打算安装到其他目录下(例如:/opt),那就把”–prefix=/usr”这个配置命令使用其他路径替换掉。

$ cd git-x.x.x
$ make configure
$ ./configure --prefix=/usr
$ make all doc info
$ sudo make install install-doc install-html install-info

via: http://ask.xmodulo.com/install-git-linux.html

作者:Dan Nanni 译者:mr-ping 校对:wxy

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

来源:https://linux.cn/article-5992-1.html

如何运维网站能让其稳定高效——稳定篇

作为一名运维工程师,工作中最大的希望就是自己运维的网站能够稳定高效运行,但理想很丰满现实很骨感,实际情况是总会有各种各样状况导致网络、服务器或者应用环境发生故障。面对这种情况,我觉得还是要能从故障中总结出经验规律,让发生的几率不断的降低。要完成稳定和高效两者中的任何一个都是一个极具挑战的事情,这里我以维护自己的blog为例来阐述一下我对稳定这个词的诠释和理解。

       我的Blog架设在wordpress环境上的,记录了工作中的一些经验总结和随笔文章,虽然是个人网站,但麻雀虽小,五脏俱全,有一定的代表性。

如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇

一. 稳定之硬件稳定

       硬件是基础设施,必须打好硬件稳定的基础。传统的硬件选型一般都是购买HP,DELL的机架式服务器,根据自己的需求选择CPU,内存,硬盘等,这种方式有一个弊端就是不能很方便的对硬件进行后期扩容,买了后一般情况下就定型了,而且还要托管,购买带宽,后期的硬件维护也是需要自己来做。面对这些问题,我觉得选择当下比较炙手可热的云服务器是个不错的选择。它解决了:

1)硬件型号不再重要,自然也就不会成为网站发展的瓶颈,CPU,内存,硬盘等硬件的大小都是弹性的,根据自己使用的情况随时可以增大和减小

2)云服务器提供商提供托管场地和网络带宽设施

3)因为云服务器提供商一般都有大量的服务器,所以会专门有一个机房工程师每天做硬件,网络的巡检工作,及时发现问题并将基础问题处理在萌芽阶段

4)对磁盘IO要求比较高的,可以选择购买本地磁盘和SSD磁盘来解决问题

总的来说,选择云服务器比较省心,而且国内的云服务器也逐渐的成熟起来,我个人使用云服务器这种方式7个月了,截止目前,硬件,网络都没有出现过问题,还是比较稳定的。当然大型云服务器提供商是比较好的选择,阿里云、腾讯云、Ucloud都不错。具体选择哪家,可以根据自己的实际情况来酌情选择。

如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇

二. 稳定之软件稳定

       软件是具体提供服务的应用组件,要做好这个稳定我觉得比硬件难一些了,方方面面都要考虑清楚,这里从下往上来逐个分析吧:

1)Wordpress是一个PHP环境的程序,那么Linux作为系统环境就是一个很好的选择,其实稳定的另一个特征就是当出现了故障时能够很快的排除故障,在成百上千的Linux发布系统中很多人最终选择Redhat,CentOS肯定是有其原因的,CentOS是基于企业级linux系统发布Redhat编译而来,兼容性好而且免费使用,网络中有大量的技术文章可以借阅参考,64位也会逐渐的取代32位系统,我最后选择的是CentOS6 64位系统环境。这里不是说让大家全部选择此发行版,而是一个建议,在实际选择过程中最好根据自己的业务类型,选择一个能用上3到5年的系统,不折腾。

2)nginx、mysql、php的搭档组合有逐步取代AMP组合的趋势,V1.0以上的nginx,V5.1以上的mysql,V5.4以上的PHP,这个版本选择是目前比较实用的组合,能够支撑一段时间不需要在更新了。

3)组件选择好后,比较关键的就是配置好这些组件了,配置这个过程没有一个统一的标准,需要不同参数也就不同,但不管环境怎样,还是有几个比较通用的法则:

A. 一个PHP和nginx进程大约占用内存20M,最大允许的进程数是要根据自己的实际内存大小来动态调整,否则可能导致内存耗尽而系统崩溃

B.调整参数的原则就是让自己的硬件资源能够充分利用,最大使用率根据28原则

C.配置的过程是一个循序渐进的过程,很多时候也是在处理问题时逐步总结出来最优配置

三. 稳定之实时监控

       网站对外发布后,剩下的任务就是要保证网站不出故障,持久稳定运行了。要做到这一点,就要对网站和硬件的运行情况有一个全面的了解才可以。掌握的数据越多,就对自己的网站运行情况越有利。

可用性监控:

网站当下是否能够正常访问,这是一个最基本的要求。但我们不可能实时去盯着,这里需要有个实时监控的服务去不断的探测,提供这样服务的工具有很多,例如nagios,zabbix等开源产品就是专门做这个事情的,周期性的探测网站的可用性,不过这种产品有一个很大的局限性,就是nagios和zabbix是部署在和自己网站同样的网络环境中,常常会出现nagios探测是好的,但外部访问却不行的状况。

这里我选择了一个第三方公司的产品——云智慧的监控宝,来做我的blog的可用性监控,其实现原理是使用它在全世界托管的监测服务器来周期性的访问我的blog,这种监控比较接近于实际用户访问,比较有说服力,如果发现了问题,会有一个告警信息发送到手机、邮件上。

如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇

四. 稳定之压力测试

       压力测试的目的是为了能够对自己网站的最大负载能力有一个预估值,原则是测试一个有复杂业务逻辑的动态页面为好,通过压力测试得出自己网站的最大并发值和承载能力。得出这个值之后,剩下的在配置参数的时候就有依据了。压力测试的方法有很多种,比较常见的有ab,loadrunnner等工具。

五.稳定之硬件资源使用监控和并发数监控

       压力测试的目的就是为了能够在这一环节有的放矢,网站上线后通过可用性监控得知网站是否能正常访问。在通过硬件资源使用情况和web服务的并发数监控,在监控中将告警阀值设置为压力测试过程中的80%为准。通过这样的实时监控,就对自己的服务器的运行情况有一个立体式的掌控,让其能够运行在正常的区间中。

如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇
如何运维网站能让其稳定高效——稳定篇

总结:

保证服务的稳定是一个持续的过程,通过时间的积累对自己维护的业务运行情况越来越熟悉,对架构的掌握也越来越透彻,将网站架构中的薄弱环节加固,再通过后期的实时监控,对网站的整体运行情况有一个清晰的认识,由此来让自己运维的网站稳定运行。以上五点算是抛砖引玉吧,如果你有好的方法,随时沟通交流:wxd5981@163.com

Linux:NGINX缓存使用官方指南

我们都知道,应用程序和网站一样,其性能关乎生存。但如何使你的应用程序或者网站性能更好,并没有一个明确的答案。代码质量和架构是其中的一个原因,但是在很多例子中我们看到,你可以通过关注一些十分基础的应用内容分发技术,来提高终端用户的体验。其中一个例子就是实现和调整应用栈(application stack)的缓存。这篇文章,通过几个例子来讲述如何使用NGINX缓存,此外,结尾处还列举了一些常见问题及解答。

Linux:NGINX缓存使用官方指南
Linux:NGINX缓存使用官方指南

基础

一个web缓存坐落于客户端和“原始服务器(origin server)”中间,它保留了所有可见内容的拷贝。如果一个客户端请求的内容在缓存中存储,则可以直接在缓存中获得该内容而不需要与服务器通信。这样一来,由于web缓存距离客户端“更近”,就可以提高响应性能,并更有效率的使用应用服务器,因为服务器不用每次请求都进行页面生成工作。
在浏览器和应用服务器之间,存在多种“潜在”缓存,如:客户端浏览器缓存、中间缓存、内容分发网络(CDN)和服务器上的负载平衡和反向代理。缓存,仅在反向代理和负载均衡的层面,就对性能提高有很大的帮助。
举个例子说明,去年,我接手了一项任务,这项任务的内容是对一个加载缓慢的网站进行性能优化。首先引起我注意的事情是,这个网站差不多花费了超过1秒钟才生成了主页。经过一系列调试,我发现加载缓慢的原因在于页面被标记为不可缓存,即为了响应每一个请求,页面都是动态生成的。由于页面本身并不需要经常性的变更,并且不涉及个性化,那么这样做其实并没有必要。为了验证一下我的结论,我将页面标记为每5秒缓存一次,仅仅做了这一个调整,就能明显的感受到性能的提升。第一个字节到达的时间降低到几毫秒,同时页面的加载明显要更快。
并不是只有大规模的内容分发网络(CDN)可以在使用缓存中受益——缓存还可以提高负载平衡器、反向代理和应用服务器前端web服务的性能。通过上面的例子,我们看到,缓存内容结果,可以更高效的使用应用服务器,因为不需要每次都去做重复的页面生成工作。此外,Web缓存还可以用来提高网站可靠性。当服务器宕机或者繁忙时,比起返回错误信息给用户,不如通过配置NGINX将已经缓存下来的内容发送给用户。这意味着,网站在应用服务器或者数据库故障的情况下,可以保持部分甚至全部的功能运转。
下一部分讨论如何安装和配置NGINX的基础缓存(Basic Caching)。

如何安装和配置基础缓存

我们只需要两个命令就可以启用基础缓存: proxy_cache_pathproxy_cache。proxy_cache_path用来设置缓存的路径和配置,proxy_cache用来启用缓存。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
                 use_temp_path=off;
server {
...
    location / {
        proxy_cache my_cache;
        proxy_pass http://my_upstream;
    }
}

proxy_cache_path命令中的参数及对应配置说明如下:
1.用于缓存的本地磁盘目录是/path/to/cache/
2.levels/path/to/cache/设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,我们推荐使用两级目录层次结构。如果levels参数没有配置,则NGINX会将所有的文件放到同一个目录中。
3.keys_zone设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使NGINX在不检索磁盘的情况下快速决定一个请求是`HIT`还是`MISS`,这样大大提高了检索速度。一个1MB的内存空间可以存储大约8000个key,那么上面配置的10MB内存空间可以存储差不多80000个key。
4.max_size设置了缓存的上限(在上面的例子中是10G)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有可用的磁盘空间。当缓存达到这个上线,处理器便调用cache manager来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。
5.inactive指定了项目在不被访问的情况下能够在内存中保持的时间。在上面的例子中,如果一个文件在60分钟之内没有被请求,则缓存管理将会自动将其在内存中删除,不管该文件是否过期。该参数默认值为10分钟(10m)。注意,非活动内容有别于过期内容。NGINX不会自动删除由缓存控制头部指定的过期内容(本例中Cache-Control:max-age=120)。过期内容只有在inactive指定时间内没有被访问的情况下才会被删除。如果过期内容被访问了,那么NGINX就会将其从原服务器上刷新,并更新对应的inactive计时器。
6.NGINX最初会将注定写入缓存的文件先放入一个临时存储区域, use_temp_path=off命令指示NGINX将在缓存这些文件时将它们写入同一个目录下。我们强烈建议你将参数设置为off来避免在文件系统中不必要的数据拷贝。use_temp_path在NGINX1.7版本和NGINX Plus R6中有所介绍。
最终, proxy_cache命令启动缓存那些URL与location部分匹配的内容(本例中,为`/`)。你同样可以将proxy_cache命令添加到server部分,这将会将缓存应用到所有的那些location中未指定自己的proxy_cache命令的服务中。

陈旧总比没有强

NGINX内容缓存的一个非常强大的特性是:当无法从原始服务器获取最新的内容时,NGINX可以分发缓存中的陈旧(stale,编者注:即过期内容)内容。这种情况一般发生在关联缓存内容的原始服务器宕机或者繁忙时。比起对客户端传达错误信息,NGINX可发送在其内存中的陈旧的文件。NGINX的这种代理方式,为服务器提供额外级别的容错能力,并确保了在服务器故障或流量峰值的情况下的正常运行。为了开启该功能,只需要添加proxy_cache_use_stale命令即可:

location / {
    ...
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}

按照上面例子中的配置,当NGINX收到服务器返回的error,timeout或者其他指定的5xx错误,并且在其缓存中有请求文件的陈旧版本,则会将这些陈旧版本的文件而不是错误信息发送给客户端。

缓存微调

NGINX提供了丰富的可选项配置用于缓存性能的微调。下面是使用了几个配置的例子:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
                 use_temp_path=off;
server {
    ...
    location / {
        proxy_cache my_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 3;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        proxy_pass http://my_upstream;
    }
}

这些命令配置了下列的行为:
1.proxy_cache_revalidate指示NGINX在刷新来自服务器的内容时使用GET请求。如果客户端的请求项已经被缓存过了,但是在缓存控制头部中定义为过期,那么NGINX就会在GET请求中包含If-Modified-Since字段,发送至服务器端。这项配置可以节约带宽,因为对于NGINX已经缓存过的文件,服务器只会在该文件请求头中Last-Modified记录的时间内被修改时才将全部文件一起发送。
2.proxy_cache_min_uses设置了在NGINX缓存前,客户端请求一个条目的最短时间。当缓存不断被填满时,这项设置便十分有用,因为这确保了只有那些被经常访问的内容才会被添加到缓存中。该项默认值为1。
3.proxy_cache_use_stale中的updating参数告知NGINX在客户端请求的项目的更新正在原服务器中下载时发送旧内容,而不是向服务器转发重复的请求。第一个请求陈旧文件的用户不得不等待文件在原服务器中更新完毕。陈旧的文件会返回给随后的请求直到更新后的文件被全部下载。
4.当proxy_cache_lock被启用时,当多个客户端请求一个缓存中不存在的文件(或称之为一个MISS),只有这些请求中的第一个被允许发送至服务器。其他请求在第一个请求得到满意结果之后在缓存中得到文件。如果不启用proxy_cache_lock,则所有在缓存中找不到文件的请求都会直接与服务器通信。

跨多硬盘分割缓存

使用NGINX,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,NGINX可以用来在多个硬盘之间分割缓存。下面是一个基于请求URI跨越两个硬盘之间均分缓存的例子:

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g
                 inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g
                 inactive=60m use_temp_path=off;
split_clients $request_uri $my_cache {
              50%          “my_cache_hdd1”;
              50%          “my_cache_hdd2”;
}
server {
    ...
    location / {
        proxy_cache $my_cache;
        proxy_pass http://my_upstream;
    }
}

上例中的两个proxy_cache_path定义了两个缓存(my_cache_hdd1my_cache_hd22)分属两个不同的硬盘。split_clients配置部分指定了请求结果的一半在my_cache_hdd1中缓存,另一半在my_cache_hdd2中缓存。基于$request_uri(请求URI)变量的哈希值决定了每一个请求使用哪一个缓存,对于指定URI的请求结果通常会被缓存在同一个缓存中。

常见问题解答

这部分内容回答了一些关于NGINX内容缓存的常见问题。

可以检测NGINX缓存状态吗?

可以,使用add_header指令:

add_header X-Cache-Status $upstream_cache_status;

上面的例子中,在对客户端的响应中添加了一个`X-Cache-Status`HTTP响应头,下面是$upstream_cache_status的可能值:

  1. MISS——响应在缓存中找不到,所以需要在服务器中取得。这个响应之后可能会被缓存起来。
  2. BYPASS——响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass(见下面我可以在缓存中打个洞吗?)。这个响应之后可能会被缓存起来。
  3. EXPIRED——缓存中的某一项过期了,来自原始服务器的响应包含最新的内容。
  4. STALE——内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale
  5. UPDATING——内容过期了,因为相对于之前的请求,响应的入口(entry)已经更新,并且proxy_cache_use_staleupdating已被设置
  6. REVALIDATED——proxy_cache_revalidate命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)。
  7. HIT——响应包含来自缓存的最新有效的内容。

NGINX 如何决定是否缓存?

默认情况下,NGINX需要考虑从原始服务器得到的Cache-Control标头。当在响应头部中Cache-Control被配置为PrivateNo-CacheNo-Store或者Set-Cookie,NGINX不进行缓存。NGINX仅仅缓存GET和HEAD客户端请求。你也可以参照下面的解答覆盖这些默认值。

Cache-Control头部可否被忽略?

可以,使用proxy_ignore_headers命令。如下列配置:

location /images/ {
    proxy_cache my_cache;
    proxy_ignore_headers Cache-Control;
    proxy_cache_valid any 30m;
    ...
}

NGINX会忽略所有/images/下的Cache-Control头。proxy_cache_valid命令强制规定缓存数据的过期时间,如果忽略Cache-Control头,则该命令是十分必要的。NGINX不会缓存没有过期时间的文件。

当在头部设置了Set-Cookie之后NGINX还能缓存内容吗?

可以,使用proxy_ignore_headers命令,参见之前的解答。

NGINX能否缓存POST 请求?

可以,使用proxy_cache_methods命令:

proxy_cache_methods GET HEAD POST;

这个例子中可以缓存POST请求。其他附加的方法可以依次列出来的,如PUT。

NGINX 可以缓存动态内容吗?

可以,提供的Cache-Control头部可以做到。缓存动态内容,甚至短时间内的内容可以减少在原始数据库和服务器中加载,可以提高第一个字节的到达时间,因为页面不需要对每个请求都生成一次。

我可以再缓存中打个洞(Punch a Hole)吗?

可以,使用proxy_cache_bypass命令:

location / {
    proxy_cache_bypass $cookie_nocache $arg_nocache;
    ...
}

这个命令定义了哪种类型的请求需要向服务器请求而不是尝试首先在缓存中查找。有些时候又被称作在内存中“打个洞”。在上面的例子中,NGINX会针对nocache cookie或者参数进行直接请求服务器,如: http://www.example.com/?nocache=true。NGINX依然可以为将那些没有避开缓存的请求缓存响应结果。

NGINX 使用哪些缓存键?

NGINX生成的键的默认格式是类似于下面的NGINX变量的MD5哈希值: $scheme$proxy_host$request_uri,实际的算法有些复杂。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
                 use_temp_path=off;
server {
    ...
    location / {
        proxy_cache $my_cache;
        proxy_pass http://my_upstream;
    }
}

按照上面的配置, http://www.example.org/my_image.jpg的缓存键被计算为md5(“http://my_upstream:80/my_image.jpg”)。
注意,$proxy_host变量用于哈希之后的值而不是实际的主机名(www.example.com)。$proxy_host被定义为proxy_pass中指定的代理服务器的主机名和端口号。
为了改变变量(或其他项)作为基础键,可以使用proxy_cache_key命令(下面的问题会讲到)。

可以使用Cookie作为缓存键的一部分吗?

可以,缓存键可以配置为任意值,如:

proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

NGINX使用Etag头部吗?

在NGINX 1.7.3和NGINX Plus R5及之后的版本,配合使用If-None-Match, Etag是完全支持的。

NGINX 如何处理字节范围请求?

如果缓存中的文件是最新的,NGINX会对客户端提出的字节范围请求传递指定的字节。如果文件并没有被提前缓存,或者是陈旧的,那么NGINX会从服务器上下载完整文件。如果请求了单字节范围,NGINX会尽快的将该字节发送给客户端,如果在下载的数据流中刚好有这个字节。如果请求指定了同一个文件中的多个字节范围,NGINX则会在文件下载完毕时将整个文件发送给客户端。
一旦文件下载完毕,NGINX将整个数据移动到缓存中,这样一来,无论将来的字节范围请求是单字节还是多字节范围,NGINX都可以在缓存中找到指定的内容立即响应。

NGINX 支持缓存清洗吗?

NGINX Plus支持有选择性的清洗缓存。当原始服务器上文件已经被更新,但是NGINX Plus缓存中文件依然有效(Cache-Control:max-age依然有效,proxy_cache_path命令中inactive参数设置的超时时间没有过期),这个功能便十分有用。使用NGINX Plus的缓存清洗特性,这个文件可以被轻易的删除。详细信息,参见Purging Content from the Cache

NGINX如何处理Pragma 头部?

当客户端添加了Pragma:no-cache头部,则请求会绕过缓存直接访问服务器请求内容。NGINX默认不考虑Pragma头部,不过你可以使用下面的proxy_cache_bypass的命令来配置该特性:

location /images/ {
    proxy_cache my_cache;
    proxy_cache_bypass $http_pragma;
    ...
}

NGINX支持Vary 头部吗?

是的,在NGINX Plus R5、NGINX1.7.7和之后的版本中是支持的。看看这篇不错的文章: good overview of the Vary header

延伸阅读

有非常多的方式对NGINX进行个性化定制和调优。要了解更多关于NGINX缓存,请看下面的资源:

  • NGINX文档中的ngx_http_proxy_module部分包含所有内容缓存的可选项。
  • NGINX内容缓存研讨会全程可以根据自己的需要查看。这篇博客包含了研讨会的部分内容。
  • NGINX Plus管理员指南中的Content Caching部分有更多关于调优NGINX缓存的配置案例和信息内容。
  • Content Caching with NGINX Plus产品页包含如何配置NGINX Plus进行缓存清洗的概述,并提供了其他缓存个性化配置的例子。

来源:http://www.jointforce.com/jfperiodical/article/949

Linux:关于Linux防火墙'iptables'的面试问答

Nishita Agarwal是Tecmint的用户,她将分享关于她刚刚经历的一家公司(印度的一家私人公司Pune)的面试经验。在面试中她被问及许多不同的问题,但她是iptables方面的专家,因此她想分享这些关于iptables的问题和相应的答案给那些以后可能会进行相关面试的人。

Linux:关于Linux防火墙'iptables'的面试问答
Linux:关于Linux防火墙’iptables’的面试问答
所有的问题和相应的答案都基于Nishita Agarwal的记忆并经过了重写。

“嗨,朋友!我叫Nishita Agarwal。我已经取得了理学学士学位,我的专业集中在UNIX和它的变种(BSD,Linux)。它们一直深深的吸引着我。我在存储方面有1年多的经验。我正在寻求职业上的变化,并将供职于印度的Pune公司。”

下面是我在面试中被问到的问题的集合。我已经把我记忆中有关iptables的问题和它们的答案记录了下来。希望这会对您未来的面试有所帮助。

1. 你听说过Linux下面的iptables和Firewalld么?知不知道它们是什么,是用来干什么的?

答案 : iptables和Firewalld我都知道,并且我已经使用iptables好一段时间了。iptables主要由C语言写成,并且以GNU GPL许可证发布。它是从系统管理员的角度写的,最新的稳定版是iptables 1.4.21。iptables通常被用作类UNIX系统中的防火墙,更准确的说,可以称为iptables/netfilter。管理员通过终端/GUI工具与iptables打交道,来添加和定义防火墙规则到预定义的表中。Netfilter是内核中的一个模块,它执行包过滤的任务。
Firewalld是RHEL/CentOS 7(也许还有其他发行版,但我不太清楚)中最新的过滤规则的实现。它已经取代了iptables接口,并与netfilter相连接。

2. 你用过一些iptables的GUI或命令行工具么?

答案 : 虽然我既用过GUI工具,比如与Webmin结合的Shorewall;以及直接通过终端访问iptables,但我必须承认通过Linux终端直接访问iptables能给予用户更高级的灵活性、以及对其背后工作更好的理解的能力。GUI适合初级管理员,而终端适合有经验的管理员。

3. 那么iptables和firewalld的基本区别是什么呢?

答案 : iptables和firewalld都有着同样的目的(包过滤),但它们使用不同的方式。iptables与firewalld不同,在每次发生更改时都刷新整个规则集。通常iptables配置文件位于‘/etc/sysconfig/iptables‘,而firewalld的配置文件位于‘/etc/firewalld/‘。firewalld的配置文件是一组XML文件。以XML为基础进行配置的firewalld比iptables的配置更加容易,但是两者都可以完成同样的任务。例如,firewalld可以在自己的命令行界面以及基于XML的配置文件下使用iptables。

4. 如果有机会的话,你会在你所有的服务器上用firewalld替换iptables么?

答案 : 我对iptables很熟悉,它也工作的很好。如果没有任何需求需要firewalld的动态特性,那么没有理由把所有的配置都从iptables移动到firewalld。通常情况下,目前为止,我还没有看到iptables造成什么麻烦。IT技术的通用准则也说道“为什么要修一件没有坏的东西呢?”。上面是我自己的想法,但如果组织愿意用firewalld替换iptables的话,我不介意。

5. 你看上去对iptables很有信心,巧的是,我们的服务器也在使用iptables。

iptables使用的表有哪些?请简要的描述iptables使用的表以及它们所支持的链。
答案 : 谢谢您的赞赏。至于您问的问题,iptables使用的表有四个,它们是:

  • Nat 表
  • Mangle 表
  • Filter 表
  • Raw 表

Nat表 : Nat表主要用于网络地址转换。根据表中的每一条规则修改网络包的IP地址。流中的包仅遍历一遍Nat表。例如,如果一个通过某个接口的包被修饰(修改了IP地址),该流中其余的包将不再遍历这个表。通常不建议在这个表中进行过滤,由NAT表支持的链称为PREROUTING 链,POSTROUTING 链和OUTPUT 链。
Mangle表 : 正如它的名字一样,这个表用于校正网络包。它用来对特殊的包进行修改。它能够修改不同包的头部和内容。Mangle表不能用于地址伪装。支持的链包括PREROUTING 链,OUTPUT 链,Forward 链,Input 链和POSTROUTING 链。
Filter表 : Filter表是iptables中使用的默认表,它用来过滤网络包。如果没有定义任何规则,Filter表则被当作默认的表,并且基于它来过滤。支持的链有INPUT 链,OUTPUT 链,FORWARD 链。
Raw表 : Raw表在我们想要配置之前被豁免的包时被使用。它支持PREROUTING 链和OUTPUT 链。

6. 简要谈谈什么是iptables中的目标值(能被指定为目标),他们有什么用

答案 : 下面是在iptables中可以指定为目标的值:

  • ACCEPT : 接受包
  • QUEUE : 将包传递到用户空间 (应用程序和驱动所在的地方)
  • DROP : 丢弃包
  • RETURN : 将控制权交回调用的链并且为当前链中的包停止执行下一调用规则

7. 让我们来谈谈iptables技术方面的东西,我的意思是说实际使用方面

你怎么检测在CentOS中安装iptables时需要的iptables的rpm?
答案 : iptables已经被默认安装在CentOS中,我们不需要单独安装它。但可以这样检测rpm:

# rpm -qa iptables
iptables-1.4.21-13.el7.x86_64

如果您需要安装它,您可以用yum来安装。

# yum install iptables-services

8. 怎样检测并且确保iptables服务正在运行?

答案 : 您可以在终端中运行下面的命令来检测iptables的状态。

# service status iptables           [On CentOS 6/5]
# systemctl status iptables         [On CentOS 7]

如果iptables没有在运行,可以使用下面的语句

---------------- 在CentOS 6/5下 ----------------
# chkconfig --level 35 iptables on
# service iptables start
---------------- 在CentOS 7下 ----------------
# systemctl enable iptables
# systemctl start iptables

我们还可以检测iptables的模块是否被加载:

# lsmod | grep ip_tables

9. 你怎么检查iptables中当前定义的规则呢?

答案 : 当前的规则可以简单的用下面的命令查看:

# iptables -L

示例输出

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

10. 你怎样刷新所有的iptables规则或者特定的链呢?

答案 : 您可以使用下面的命令来刷新一个特定的链。

# iptables --flush OUTPUT

要刷新所有的规则,可以用:

# iptables --flush

11. 请在iptables中添加一条规则,接受所有从一个信任的IP地址(例如,192.168.0.7)过来的包。

答案 : 上面的场景可以通过运行下面的命令来完成。

# iptables -A INPUT -s 192.168.0.7 -j ACCEPT

我们还可以在源IP中使用标准的斜线和子网掩码:

# iptables -A INPUT -s 192.168.0.7/24 -j ACCEPT
# iptables -A INPUT -s 192.168.0.7/255.255.255.0 -j ACCEPT

12. 怎样在iptables中添加规则以ACCEPT,REJECT,DENY和DROP ssh的服务?

答案 : 但愿ssh运行在22端口,那也是ssh的默认端口,我们可以在iptables中添加规则来ACCEPT ssh的tcp包(在22号端口上)。

# iptables -A INPUT -s -p tcp --dport 22 -j ACCEPT

REJECT ssh服务(22号端口)的tcp包。

# iptables -A INPUT -s -p tcp --dport 22 -j REJECT

DENY ssh服务(22号端口)的tcp包。

# iptables -A INPUT -s -p tcp --dport 22 -j DENY

DROP ssh服务(22号端口)的tcp包。

# iptables -A INPUT -s -p tcp --dport 22 -j DROP

13. 让我给你另一个场景,假如有一台电脑的本地IP地址是192.168.0.6。你需要封锁在21、22、23和80号端口上的连接,你会怎么做?

答案 : 这时,我所需要的就是在iptables中使用‘multiport‘选项,并将要封锁的端口号跟在它后面。上面的场景可以用下面的一条语句搞定:

# iptables -A INPUT -s 192.168.0.6 -p tcp -m multiport --dport 22,23,80,8080 -j DROP

可以用下面的语句查看写入的规则。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
DROP       tcp  --  192.168.0.6          anywhere             multiport dports ssh,telnet,http,webcache
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

面试官 : 好了,我问的就是这些。你是一个很有价值的雇员,我们不会错过你的。我将会向HR推荐你的名字。如果你有什么问题,请问我。
作为一个候选人我不愿不断的问将来要做的项目的事以及公司里其他的事,这样会打断愉快的对话。更不用说HR轮会不会比较难,总之,我获得了机会。
同时我要感谢Avishek和Ravi(我的朋友)花时间帮我整理我的面试。
朋友!如果您有过类似的面试,并且愿意与数百万Tecmint读者一起分享您的面试经历,请将您的问题和答案发送到admin@tecmint.com
谢谢!保持联系。如果我能更好的回答我上面的问题的话,请记得告诉我。


via: http://www.tecmint.com/linux-firewall-iptables-interview-questions-and-answers/
作者:Avishek Kumar 译者:wwy-hust 校对:wxy
本文由 LCTT 原创翻译,Linux中国 荣誉推出
来源:https://linux.cn/article-5948-1.html

Linux:如何在 Fedora 22 上配置 Proftpd 服务器

在本文中,我们将了解如何在运行 Fedora 22 的电脑或服务器上使用 Proftpd 架设 FTP 服务器。ProFTPD 是一款基于 GPL 授权的自由开源 FTP 服务器软件,是 Linux 上的主流 FTP 服务器。它的主要设计目标是提供许多高级功能以及给用户提供丰富的配置选项以轻松实现定制。它具备许多在其他一些 FTP 服务器软件里仍然没有的配置选项。最初它是被开发作为 wu-ftpd 服务器的一个更安全更容易配置的替代。

FTP 服务器是这样一个软件,用户可以通过 FTP 客户端从安装了它的远端服务器上传或下载文件和目录。下面是一些 ProFTPD 服务器的主要功能,更详细的资料可以访问 http://www.proftpd.org/features.html

  • 每个目录都可以包含 “.ftpaccess” 文件用于访问控制,类似 Apache 的 “.htaccess”
  • 支持多个虚拟 FTP 服务器以及多用户登录和匿名 FTP 服务。
  • 可以作为独立进程启动服务或者通过 inetd/xinetd 启动
  • 它的文件/目录属性、属主和权限是基于 UNIX 方式的。
  • 它可以独立运行,保护系统避免 root 访问可能带来的损坏。
  • 模块化的设计让它可以轻松扩展其他模块,比如 LDAP 服务器,SSL/TLS 加密,RADIUS 支持,等等。
  • ProFTPD 服务器还支持 IPv6.

下面是如何在运行 Fedora 22 操作系统的计算机上使用 ProFTPD 架设 FTP 服务器的一些简单步骤。

1. 安装 ProFTPD

首先,我们将在运行 Fedora 22 的机器上安装 Proftpd 软件。因为 yum 包管理器已经被抛弃了,我们将使用最新最好的包管理器 dnf。DNF 很容易使用,是 Fedora 22 上采用的非常人性化的包管理器。我们将用它来安装 proftpd 软件。这需要在终端或控制台里用 sudo 模式运行下面的命令。

$ sudo dnf -y install proftpd proftpd-utils

2. 配置 ProFTPD

现在,我们将修改软件的一些配置。要配置它,我们需要用文本编辑器编辑 /etc/proftpd.conf 文件。/etc/proftpd.conf 文件是 ProFTPD 软件的主要配置文件,所以,这个文件的任何改动都会影响到 FTP 服务器。在这里,是我们在初始步骤里做出的改动。

$ sudo vi /etc/proftpd.conf

之后,在用文本编辑器打开这个文件后,我们会想改下 ServerName 以及 ServerAdmin,分别填入自己的域名和 email 地址。下面是我们改的。

ServerName       "ftp.linoxide.com"
ServerAdmin      arun@linoxide.com

在这之后,我们将把下面的设定加到配置文件里,这样可以让服务器将访问和授权记录到相应的日志文件里。

ExtendedLog /var/log/proftpd/access.log WRITE,READ default
ExtendedLog /var/log/proftpd/auth.log AUTH auth

调整 ProFTPD 设置

3. 添加 FTP 用户

在设定好了基本的配置文件后,我们很自然地希望添加一个以特定目录为根目录的 FTP 用户。目前登录的用户自动就可以使用 FTP 服务,可以用来登录到 FTP 服务器。但是,在这篇教程里,我们将创建一个以 ftp 服务器上指定目录为主目录的新用户。

下面,我们将建立一个名字是 ftpgroup 的新用户组。

$ sudo groupadd ftpgroup

然后,我们将以目录 /ftp-dir/ 作为主目录增加一个新用户 arunftp 并加入这个组中。

$ sudo useradd -G ftpgroup arunftp -s /sbin/nologin -d /ftp-dir/

在创建好用户并加入用户组后,我们将为用户 arunftp 设置一个密码。

$ sudo passwd arunftp
Changing password for user arunftp.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

现在,我们将通过下面命令为这个 ftp 用户设定主目录的读写权限(LCTT 译注:这是SELinux 相关设置,如果未启用 SELinux,可以不用)。

$ sudo setsebool -P allow_ftpd_full_access=1
$ sudo setsebool -P ftp_home_dir=1

然后,我们会设定不允许其他用户移动或重命名这个目录以及里面的内容。

$ sudo chmod -R 1777 /ftp-dir/

4. 打开 TLS 支持

目前 FTP 所用的加密手段并不安全,任何人都可以通过监听网卡来读取 FTP 传输的数据。所以,我们将为自己的服务器打开 TLS 加密支持。这样的话,需要编辑 /etc/proftpd.conf 配置文件。在这之前,我们先备份一下当前的配置文件,可以保证在改出问题后还可以恢复。

$ sudo cp /etc/proftpd.conf /etc/proftpd.conf.bak

然后,我们可以用自己喜欢的文本编辑器修改配置文件。

$ sudo vi /etc/proftpd.conf

然后,把下面几行附加到我们在第 2 步中所增加内容的后面。

TLSEngine on
TLSRequired on
TLSProtocol SSLv23
TLSLog /var/log/proftpd/tls.log
TLSRSACertificateFile /etc/pki/tls/certs/proftpd.pem
TLSRSACertificateKeyFile /etc/pki/tls/certs/proftpd.pem

打开 TLS 配置

完成上面的设定后,保存退出。

然后,我们需要生成 SSL 凭证 proftpd.pem 并放到 /etc/pki/tls/certs/ 目录里。这样的话,首先需要在 Fedora 22 上安装 openssl。

$ sudo dnf install openssl

然后,可以通过执行下面的命令生成 SSL 凭证。

$ sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/certs/proftpd.pem -out /etc/pki/tls/certs/proftpd.pem

系统会询问一些将写入凭证里的基本信息。在填完资料后,就会生成一个 2048 位的 RSA 私钥。

Generating a 2048 bit RSA private key
...................+++
...................+++
writing new private key to '/etc/pki/tls/certs/proftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:NP
State or Province Name (full name) []:Narayani
Locality Name (eg, city) [Default City]:Bharatpur
Organization Name (eg, company) [Default Company Ltd]:Linoxide
Organizational Unit Name (eg, section) []:Linux Freedom
Common Name (eg, your name or your server's hostname) []:ftp.linoxide.com
Email Address []:arun@linoxide.com

在这之后,我们要改变所生成凭证文件的权限以增加安全性。

$ sudo chmod 600 /etc/pki/tls/certs/proftpd.pem

5. 允许 FTP 通过 Firewall

现在,需要允许 ftp 端口,一般默认被防火墙阻止了。就是说,需要允许 ftp 端口能通过防火墙访问。

如果 打开了 TLS/SSL 加密,执行下面的命令。

$ sudo firewall-cmd --add-port=1024-65534/tcp
$ sudo firewall-cmd --add-port=1024-65534/tcp --permanent

如果 没有打开 TLS/SSL 加密,执行下面的命令。

$ sudo firewall-cmd --permanent --zone=public --add-service=ftp
success

然后,重新加载防火墙设定。

$ sudo firewall-cmd --reload
success

6. 启动并激活 ProFTPD

全部设定好后,最后就是启动 ProFTPD 并试一下。可以运行下面的命令来启动 proftpd ftp 守护程序。

$ sudo systemctl start proftpd.service

然后,我们可以设定开机启动。

$ sudo systemctl enable proftpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/proftpd.service to /usr/lib/systemd/system/proftpd.service.

7. 登录到 FTP 服务器

现在,如果都是按照本教程设置好的,我们一定可以连接到 ftp 服务器并使用以上设置的信息登录上去。在这里,我们将配置一下 FTP 客户端 filezilla,使用 服务器的 IP 或名称 *作为主机名,协议选择 *FTP,用户名填入 arunftp,密码是在上面第 3 步中设定的密码。如果你按照第 4 步中的方式打开了 TLS 支持,还需要在加密类型中选择 要求显式的基于 TLS 的 FTP,如果没有打开,也不想使用 TLS 加密,那么加密类型选择 简单 FTP

FTP 登录细节

要做上述设定,需要打开菜单里的文件,点击站点管理器,然后点击新建站点,再按上面的方式设置。

FTP SSL 凭证

随后系统会要求允许 SSL 凭证,点确定。之后,就可以从我们的 FTP 服务器上传下载文件和文件夹了。

总结

最后,我们成功地在 Fedora 22 机器上安装并配置好了 Proftpd FTP 服务器。Proftpd 是一个超级强大,能高度定制和扩展的 FTP 守护软件。上面的教程展示了如何配置一个采用 TLS 加密的安全 FTP 服务器。强烈建议设置 FTP 服务器支持 TLS 加密,因为它允许使用 SSL 凭证加密数据传输和登录。本文中,我们也没有配置 FTP 的匿名访问,因为一般受保护的 FTP 系统不建议这样做。 FTP 访问让人们的上传和下载变得非常简单也更高效。我们还可以改变用户端口增加安全性。好吧,如果你有任何疑问,建议,反馈,请在下面评论区留言,这样我们就能够改善并更新文章内容。谢谢!玩的开心 🙂


via: http://linoxide.com/linux-how-to/configure-ftp-proftpd-fedora-22/

作者:Arun Pyasi 译者:zpl1025 校对:wxy

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

来源:https://linux.cn/article-5947-1.html

如何管理 Vim 插件

Vim是Linux上一个轻量级的通用文本编辑器。虽然它开始时的学习曲线对于一般的Linux用户来说可能很困难,但比起它的好处,这些付出完全是值得的。vim 可以通过完全可定制的插件来增加越来越多的功能。但是,由于它的功能配置比较难,你需要花一些时间去了解它的插件系统,然后才能够有效地去个性化定置Vim。幸运的是,我们已经有一些工具能够使我们在使用Vim插件时更加轻松。而我日常所使用的就是Vundle。

如何管理 Vim 插件
如何管理 Vim 插件

什么是Vundle

Vundle意即Vim Bundle,是一个vim插件管理器。Vundle能让你很简单地实现插件的安装、升级、搜索或者清除。它还能管理你的运行环境并且在标签方面提供帮助。在本教程中我们将展示如何安装和使用Vundle。

安装Vundle

首先,如果你的Linux系统上没有Git的话,先安装Git

接着,创建一个目录,Vim的插件将会被下载并且安装在这个目录上。默认情况下,这个目录为~/.vim/bundle。

$ mkdir -p ~/.vim/bundle

现在,使用如下指令安装Vundle。注意Vundle本身也是一个vim插件。因此我们同样把vundle安装到之前创建的目录~/.vim/bundle下。

$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

配置Vundle 

现在配置你的.vimrc文件如下:

set nocompatible              " 必需。
filetype off                  " 必须。
" 在这里设置你的运行时环境的路径。
set rtp+=~/.vim/bundle/Vundle.vim
" 初始化vundle
call vundle#begin()
" 这一行应该永远放在开头。
Plugin 'gmarik/Vundle.vim'
" 这个示范来自https://github.com/gmarik/Vundle.vim README
Plugin 'tpope/vim-fugitive'
" 取自http://vim-scripts.org/vim/scripts.html的插件
Plugin 'L9'
" 该Git插件没有放在GitHub上。
Plugin 'git://git.wincent.com/command-t.git'
"本地计算机上的Git仓库路径 (例如,当你在开发你自己的插件时)
Plugin 'file:///home/gmarik/path/to/plugin'
" vim脚本sparkup存放在这个名叫vim的仓库下的一个子目录中。
" 将这个路径正确地设置为runtimepath。
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" 避免与L9发生名字上的冲突
Plugin 'user/L9', {'name': 'newL9'}
"所有的插件都应该在这一行之前。
call vundle#end()            " 必需。

容我简单解释一下上面的设置:默认情况下,Vundle将从github.com或者vim-scripts.org下载和安装vim插件。你也可以改变这个默认行为。

要从github安装插件:

Plugin 'user/plugin'

要从 http://vim-scripts.org/vim/scripts.html 处安装:

Plugin 'plugin_name'

要从另外一个git仓库中安装:

Plugin 'git://git.another_repo.com/plugin'

从本地文件中安装:

Plugin 'file:///home/user/path/to/plugin'

你同样可以定制其它东西,例如你的插件的运行时路径,当你自己在编写一个插件时,或者你只是想从其它目录——而不是~/.vim——中加载插件时,这样做就非常有用。

Plugin 'rstacruz/sparkup', {'rtp': 'another_vim_path/'}

如果你有同名的插件,你可以重命名你的插件,这样它们就不会发生冲突了。

Plugin 'user/plugin', {'name': 'newPlugin'}

使用Vum命令

一旦你用vundle设置好你的插件,你就可以通过几个vundle命令来安装、升级、搜索插件,或者清除没有用的插件。

安装一个新的插件

PluginInstall命令将会安装所有列在你的.vimrc文件中的插件。你也可以通过传递一个插件名给它,来安装某个的特定插件。

:PluginInstall
:PluginInstall <插件名>
如何管理 Vim 插件
如何管理 Vim 插件

清除没有用的插件

如果你有任何没有用到的插件,你可以通过PluginClean命令来删除它。

:PluginClean
如何管理 Vim 插件
如何管理 Vim 插件

查找一个插件

如果你想从提供的插件清单中安装一个插件,搜索功能会很有用。

:PluginSearch <文本>
如何管理 Vim 插件
如何管理 Vim 插件

在搜索的时候,你可以在交互式分割窗口中安装、清除、重新搜索或者重新加载插件清单。安装后的插件不会自动加载生效,要使其加载生效,可以将它们添加进你的.vimrc文件中。

总结

Vim是一个妙不可言的工具。它不单单是一个能够使你的工作更加顺畅高效的默认文本编辑器,同时它还能够摇身一变,成为现存的几乎任何一门编程语言的IDE。

注意,有一些网站能帮你找到适合的vim插件。猛击 http://www.vim-scripts.org, Github或者 http://www.vimawesome.com 获取新的脚本或插件。同时记得使用为你的插件提供的帮助。

和你最爱的编辑器一起嗨起来吧!


via: http://xmodulo.com/manage-vim-plugins.html

作者:Christopher Valerio 译者:XLCYun(袖里藏云) 校对:wxy

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

来源:https://linux.cn/article-5880-1.html

使用这些去重加密工具来备份你的数据

无论是体积还是价值,数据都在不断增长。快速而可靠地备份和恢复数据正变得越来越重要。社会已经适应了技术的广泛使用,并懂得了如何依靠电脑和移动设备,但很少有人能够面对丢失重要数据的现实。在遭受数据损失的公司中,30% 的公司将在一年内损失一半市值,70% 的公司将在五年内停止交易。这更加凸显了数据的价值。

随着数据在体积上的增长,提高存储利用率尤为重要。从计算机的角度说,数据去重是一种特别的数据压缩技术,因为它可以消除重复数据的拷贝,所以这个技术可以提高存储利用率。

数据并不仅仅只有其创造者感兴趣。政府、竞争者、犯罪分子、偷窥者可能都热衷于获取你的数据。他们或许想偷取你的数据,从你那里进行敲诈,或看你正在做什么。因此,对于保护你的数据,加密是非常必要的。

所以,解决方法是我们需要一个可以去重的加密备份软件。

对于所有的用户而言,做文件备份是一件非常必要的事,至今为止许多用户还没有采取足够的措施来保护他们的数据。一台电脑不论是工作在一个合作的环境中,还是供私人使用,机器的硬盘可能在没有任何警告的情况下挂掉。另外,有些数据丢失可能是人为的错误所引发的。如果没有做经常性的备份,数据也可能不可避免地丢失,即使请了专业的数据恢复公司来帮忙。

使用这些去重加密工具来备份你的数据
使用这些去重加密工具来备份你的数据

这篇文章将对 6 个去重加密备份工具进行简要的介绍。

Attic

Attic 是一个可用于去重、加密,验证完整性的压缩备份程序,它是用 Python 写的。Attic 的主要目标是提供一个高效且安全的方式来备份数据。Attic 使用的数据去重技术使得它适用于每日备份,因为只需存储改变的数据。

其特点有:

  • 易用
  • 可高效利用存储空间,通过检查冗余的数据,对可变块大小的去重可以减少存储所用的空间
  • 可选的数据加密,使用 256 位的 AES 加密算法。数据的完整性和可靠性使用 HMAC-SHA256 来校验
  • 使用 SDSH 来进行离线备份
  • 备份可作为文件系统来挂载

网站: attic-backup.org

Borg

Borg 是 Attic 的一个分支。它是一个安全的开源备份程序,被设计用来高效地存储那些新的或修改过的数据。

Borg 的主要目标是提供一个高效、安全的方式来存储数据。Borg 使用的数据去重技术使得它适用于每日备份,因为只需存储改变的数据。认证加密使得它适用于存储在不完全可信的位置。

Borg 由 Python 写成。Borg 于 2015 年 5 月被创造出来,是为了解决让新的代码或重大的改变带入 Attic 的困难。

其特点包括:

  • 易用
  • 可高效利用存储空间,通过检查冗余的数据,对可变块大小的去重被用来减少存储所用的空间
  • 可选的数据加密,使用 256 位的 AES 加密算法。数据的完整性和可靠性使用 HMAC-SHA256 来校验
  • 使用 SDSH 来进行离线备份
  • 备份可作为文件系统来挂载

Borg 与 Attic 不兼容。

网站: borgbackup.github.io/borgbackup

Obnam

Obnam (OBligatory NAMe) 是一个易用、安全的基于 Python 的备份程序。备份可被存储在本地硬盘或通过 SSH SFTP 协议存储到网上。若使用了备份服务器,它并不需要任何特殊的软件,只需要使用 SSH 即可。

Obnam 通过将数据分成数据块,并单独存储它们来达到去重的目的,每次通过增量备份来生成备份,每次备份的生成就像是一次新的快照,但事实上是真正的增量备份。Obnam 由 Lars Wirzenius 开发。

其特点有:

  • 易用
  • 快照备份
  • 数据去重,跨文件,然后生成备份
  • 可使用 GnuPG 来加密备份
  • 向一个单独的仓库中备份多个客户端的数据
  • 备份检查点 (创建一个保存点,以每 100MB 或其他容量)
  • 包含多个选项来调整性能,包括调整 lru-size 或 upload-queue-size
  • 支持 MD5 校验算法来识别重复的数据块
  • 通过 SFTP 将备份存储到一个服务器上
  • 同时支持 push(即在客户端上运行) 和 pull(即在服务器上运行)

网站: obnam.org

Duplicity

Duplicity 以 tar 文件格式增量备份文件和目录,并使用 GnuPG 来进行加密,同时将它们上传到远程(或本地)的文件服务器上。它可以使用 ssh/scp、本地文件获取、rsync、 ftp 和 Amazon S3 等来传递数据。

因为 duplicity 使用了 librsync, 增量存档可以高效地利用存储空间,且只记录自从上次备份依赖改变的那部分文件。由于该软件使用 GnuPG 来加密或对这些归档文件进行进行签名,这使得它们免于服务器的监视或修改。

当前 duplicity 支持备份删除的文件,全部的 unix 权限,目录,符号链接, fifo 等。

duplicity 软件包还包含有 rdiffdir 工具。 Rdiffdir 是 librsync 的 rdiff 针对目录的扩展。它可以用来生成对目录的签名和差异,对普通文件也有效。

其特点有:

  • 使用简单
  • 对归档进行加密和签名(使用 GnuPG)
  • 高效使用带宽和存储空间,使用 rsync 的算法
  • 标准的文件格式
  • 可选择多种远程协议
    • 本地存储
    • scp/ssh
    • ftp
    • rsync
    • HSI
    • WebDAV
    • Amazon S3

网站: duplicity.nongnu.org

ZBackup

ZBackup 是一个通用的全局去重备份工具。

其特点包括:

  • 对存储数据并行进行 LZMA 或 LZO 压缩,在一个仓库中,你还可以混合使用 LZMA 和 LZO
  • 内置对存储数据的 AES 加密
  • 能够删除旧的备份数据
  • 可以使用 64 位的滚动哈希算法,使得文件冲突的数量几乎为零
  • 仓库中存储的文件是不可修改的,已备份的文件不会被修改。
  • 用 C++ 写成,只需少量的库文件依赖
  • 在生成环境中可以安全使用
  • 可以在不同仓库中进行数据交换而不必再进行压缩
  • 使用 64 位改进型 Rabin-Karp 滚动哈希算法

网站: zbackup.org

bup

bup 是一个用 Python 写的备份程序,其名称是 “backup” 的缩写。基于 git packfile 文件格式, bup 提供了一个高效的方式来备份一个系统,提供快速的增量备份和全局去重(在文件中或文件里,甚至包括虚拟机镜像)。

bup 在 LGPL 版本 2 协议下发行。

其特点包括:

  • 全局去重 (在文件之间或文件内部,甚至包括虚拟机镜像)
  • 使用一个滚动的校验和算法(类似于 rsync) 来将大文件分为多个数据块
  • 使用来自 git 的 packfile 文件格式
  • 直接写入 packfile 文件,以此提供快速的增量备份
  • 可以使用 “par2” 冗余来恢复冲突的备份
  • 可以作为一个 FUSE 文件系统来挂载你的 bup 仓库

网站: bup.github.io


via: http://www.linuxlinks.com/article/20150628060000607/BackupTools.html

译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-5887-1.html

Arch Linux 下的 QQ 解决方案

Linux 上面玩 QQ 一直都是一个问题。Wine 算是一个解决方案,但是也有不少人失败了。由于 QQ 的特殊性,采取了一系列的保护措施,导致 QQ 这个 Windows 程序非常复杂,因此 Wine 在运行 QQ 时表现差强人意。本文将要安装的是 QQ6.3 ,更高的版本除非对 QQ 做出修改,否则很难安装成功,即使成功了,问题也挺多的(笔者已试验过 QQ7.4 安装)。写这个的目的主要是方便有人遇到问题截图提问,毕竟 Linux 的普及工作还得靠大家,对于日常聊天还是建议使用手机QQ 。

本文环境

  • Arch Linux (其他发行版仅供参考)
  • KDE4 & LXDE & GNOME (其它请自测)

准备工具

  • Wine
  • winetricks

简介

  • Wine 是一个在类 Unix 系统中运行 Microsoft Windows 程序的软件, Wine 的全称是 Wine Is Not Emulator 意为 Wine 不是一个模拟器,它通过 API 转换技术做出 Linux 上对应于 Windows 的函数,从而调用 DLL 运行 Windows 程序。
  • winetricks 是一个 script ,可以用来下载和安装各种在 Wine 运行时需要的部分 DLL 和框架。如 .NET , Visual C++ runtime library 或微软和其他公司的闭源程序,使用 winetricks 你可以快速安装某些常用的Windows程序。
Arch Linux 下的 QQ 解决方案
Arch Linux 下的 QQ 解决方案

步骤

1.安装 Wine

$ sudo pacman -S wine

注意:64 位需启用 multilib 仓库才可安装 Wine ,去掉 [multilib] 及其 Include的 “#”即可

$ sudo nano /etc/pacman.conf

2.安装 winetricks

$ sudo pacman -S winetricks

3.获取 winetricks-zh 的 verb 文件,更多详情请到: winetricks-zh

$ mkdir workforwine
$ cd workforwine
$ wget https://github.com/hillwoodroc/winetricks-zh/raw/master/verb/qq.verb

4.安装 QQ

$ WINEARCH=win32 winetricks qq

接下来是漫长的安装过程,会下载一系列需要的组件,将缓存在 ~/.cache/winetricks ,请耐心等待。或许你还可以试试 winetricks-zh , winetricks-zh 是 winetricks 的本地化版本,添加了更多国人可能用到的软件。

$ wget https://github.com/hillwoodroc/winetricks-zh/raw/master/winetricks-zh
$ chmod +x winetricks-zh
$ ./winetricks-zh

注意:若你觉得 安装QQ 这一步安装 mono 、gecko 太慢,如下图:

installmono

installingmono

installgecko

根据配图我们可以知道 mono 是 .NET 需要的包,而 gecko 则是 HTML 需要的包,并且 wine 也更建议我们使用我们发行版中的 mono, gecko 包,这有两个好处,一是更加符合自己的发行版,二是不用为每个 PREFIEX 单独安装,因此可以尝试以下操作,其他发行版仅供参考:

$ rm -rf ~/.wine
$ sudo pacman -S wine-mono
$ sudo pacman -S wine_gecko
$ WINEARCH=win32 winetricks qq

需要注意的几点

  • 请确保你安装有文泉驿字体 sudo pacman -S wqy-microhei 。
  • 用 winetricks 和 winetricks-zh 安装的区别仅在于安装目录不同, winetricks 未指定位置时默认 ~/.wine ,而winetricks-zh 则安装QQ至 ~/.local/share/wineprefixes/qq 。
  • 有任何问题都可以直接删除上面提到的两个文件夹重来。
  • wine 的不稳定性,导致用 winetricks 安装字体有时可以解决,有时不可以,笔者试验了很多次以失败告终,希望有谁解决了可以告诉笔者。

其他解决方案

参考资料

来源:https://linux.cn/article-5883-1.html

MYSQL 调优和使用必读

MYSQL 应该是最流行了 WEB 后端数据库。WEB 开发语言最近发展很快,PHP, Ruby, Python, Java 各有特点,虽然 NOSQL 最近越來越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来做数据存储。

MYSQL 如此方便和稳定,以至于我们在开发 WEB 程序的时候很少想到它。即使想到优化也是程序级别的,比如,不要写过于消耗资源的 SQL 语句。但是除此之外,在整个系统上仍然有很多可以优化的地方。

MYSQL 调优和使用必读
MYSQL 调优和使用必读

1. 选择合适的存储引擎: InnoDB

除非你的数据表使用来做只读或者全文检索 (相信现在提到全文检索,没人会用 MYSQL 了),你应该默认选择 InnoDB 。

你自己在测试的时候可能会发现 MyISAM 比 InnoDB 速度快,这是因为: MyISAM 只缓存索引,而 InnoDB 缓存数据和索引,MyISAM 不支持事务。但是 如果你使用 innodb_flush_log_at_trx_commit = 2 可以获得接近的读取性能 (相差百倍) 。

1.1 如何将现有的 MyISAM 数据库转换为 InnoDB:

mysql -u [USER_NAME] -p -e "SHOW TABLES IN [DATABASE_NAME];" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=InnoDB;" > alter_table.sql
perl -p -i -e 's/(search_[a-z_]+ ENGINE=)InnoDB/1MyISAM/g' alter_table.sql
mysql -u [USER_NAME] -p [DATABASE_NAME] < alter_table.sql

1.2 为每个表分别创建 InnoDB FILE:

innodb_file_per_table=1

这样可以保证 ibdata1 文件不会过大,失去控制。尤其是在执行 mysqlcheck -o –all-databases 的时候。

2. 保证从内存中读取数据,讲数据保存在内存中

2.1 足够大的 innodb_buffer_pool_size

推荐将数据完全保存在 innodb_buffer_pool_size ,即按存储量规划 innodb_buffer_pool_size 的容量。这样你可以完全从内存中读取数据,最大限度减少磁盘操作。

2.1.1 如何确定 innodb_buffer_pool_size 足够大,数据是从内存读取而不是硬盘?

方法 1

mysql> SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';
+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| Innodb_buffer_pool_pages_data    | 129037 |
| Innodb_buffer_pool_pages_dirty   | 362    |
| Innodb_buffer_pool_pages_flushed | 9998   |
| Innodb_buffer_pool_pages_free    | 0      |  !!!!!!!!
| Innodb_buffer_pool_pages_misc    | 2035   |
| Innodb_buffer_pool_pages_total   | 131072 |
+----------------------------------+--------+
6 rows in set (0.00 sec)

发现 Innodb_buffer_pool_pages_free 为 0,则说明 buffer pool 已经被用光,需要增大 innodb_buffer_pool_size

InnoDB 的其他几个参数:

innodb_additional_mem_pool_size = 1/200 of buffer_pool
innodb_max_dirty_pages_pct 80%

方法 2

或者用iostat -d -x -k 1 命令,查看硬盘的操作。

2.1.2 服务器上是否有足够内存用来规划

执行 echo 1 > /proc/sys/vm/drop_caches 清除操作系统的文件缓存,可以看到真正的内存使用量。

2.2 数据预热

默认情况,只有某条数据被读取一次,才会缓存在 innodb_buffer_pool。所以,数据库刚刚启动,需要进行数据预热,将磁盘上的所有数据缓存到内存中。数据预热可以提高读取速度。

对于 InnoDB 数据库,可以用以下方法,进行数据预热:

1. 将以下脚本保存为 MakeSelectQueriesToLoad.sql

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb,
    ' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
    FROM
    (
        SELECT
            engine,table_schema db,table_name tb,
            index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
        FROM
        (
            SELECT
                B.engine,A.table_schema,A.table_name,
                A.index_name,A.column_name,A.seq_in_index
            FROM
                information_schema.statistics A INNER JOIN
                (
                    SELECT engine,table_schema,table_name
                    FROM information_schema.tables WHERE
                    engine='InnoDB'
                ) B USING (table_schema,table_name)
            WHERE B.table_schema NOT IN ('information_schema','mysql')
            ORDER BY table_schema,table_name,index_name,seq_in_index
        ) A
        GROUP BY table_schema,table_name,index_name
    ) AA
ORDER BY db,tb
;

2. 执行

mysql -uroot -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql

3. 每次重启数据库,或者整库备份前需要预热的时候执行:

mysql -uroot < /root/SelectQueriesToLoad.sql > /dev/null 2>&1

2.3 不要让数据存到 SWAP 中

如果是专用 MYSQL 服务器,可以禁用 SWAP,如果是共享服务器,确定 innodb_buffer_pool_size 足够大。或者使用固定的内存空间做缓存,使用 memlock 指令。

3. 定期优化重建数据库

mysqlcheck -o –all-databases 会让 ibdata1 不断增大,真正的优化只有重建数据表结构:

CREATE TABLE mydb.mytablenew LIKE mydb.mytable;
INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytablenew RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;

4. 减少磁盘写入操作

4.1 使用足够大的写入缓存 innodb_log_file_size

但是需要注意如果用 1G 的 innodb_log_file_size ,假如服务器当机,需要 10 分钟来恢复。

推荐 innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size

4.2 innodb_flush_log_at_trx_commit

这个选项和写磁盘操作密切相关:

innodb_flush_log_at_trx_commit = 1 则每次修改写入磁盘innodb_flush_log_at_trx_commit = 0/2 每秒写入磁盘

如果你的应用不涉及很高的安全性 (金融系统),或者基础架构足够安全,或者 事务都很小,都可以用 0 或者 2 来降低磁盘操作。

4.3 避免双写入缓冲

innodb_flush_method=O_DIRECT

5. 提高磁盘读写速度

RAID0 尤其是在使用 EC2 这种虚拟磁盘 (EBS) 的时候,使用软 RAID0 非常重要。

6. 充分使用索引

6.1 查看现有表结构和索引

SHOW CREATE TABLE db1.tb1G

6.2 添加必要的索引

索引是提高查询速度的唯一方法,比如搜索引擎用的倒排索引是一样的原理。

索引的添加需要根据查询来确定,比如通过慢查询日志或者查询日志,或者通过 EXPLAIN 命令分析查询。

ADD UNIQUE INDEX
ADD INDEX
6.2.1 比如,优化用户验证表:

添加索引

ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);

每次重启服务器进行数据预热

echo “select username,password from users;” > /var/lib/mysql/upcache.sql

添加启动脚本到 my.cnf

[mysqld]
init-file=/var/lib/mysql/upcache.sql
6.2.2 使用自动加索引的框架或者自动拆分表结构的框架

比如,Rails 这样的框架,会自动添加索引,Drupal 这样的框架会自动拆分表结构。会在你开发的初期指明正确的方向。所以,经验不太丰富的人一开始就追求从 0 开始构建,实际是不好的做法。

7. 分析查询日志和慢查询日志

记录所有查询,这在用 ORM 系统或者生成查询语句的系统很有用。

log=/var/log/mysql.log

注意不要在生产环境用,否则会占满你的磁盘空间。

记录执行时间超过 1 秒的查询:

long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log

8. 激进的方法,使用内存磁盘

现在基础设施的可靠性已经非常高了,比如 EC2 几乎不用担心服务器硬件当机。而且内存实在是便宜,很容易买到几十G内存的服务器,可以用内存磁盘,定期备份到磁盘。

将 MYSQL 目录迁移到 4G 的内存磁盘

mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=4000M tmpfs /mnt/ramdisk/
mv /var/lib/mysql /mnt/ramdisk/mysql
ln -s /tmp/ramdisk/mysql /var/lib/mysql
chown mysql:mysql mysql

9. 用 NOSQL 的方式使用 MYSQL

B-TREE 仍然是最高效的索引之一,所有 MYSQL 仍然不会过时。

用 HandlerSocket 跳过 MYSQL 的 SQL 解析层,MYSQL 就真正变成了 NOSQL。

10. 其他

  • 单条查询最后增加 LIMIT 1,停止全表扫描。
  • 将非”索引”数据分离,比如将大篇文章分离存储,不影响其他自动查询。
  • 不用 MYSQL 内置的函数,因为内置函数不会建立查询缓存。
  • PHP 的建立连接速度非常快,所有可以不用连接池,否则可能会造成超过连接数。当然不用连接池 PHP 程序也可能将
  • 连接数占满比如用了 @ignore_user_abort(TRUE);
  • 使用 IP 而不是域名做数据库路径,避免 DNS 解析问题

11. 结束

你会发现优化后,数据库的性能提高几倍到几百倍。所以 MYSQL 基本还是可以适用大部分场景的应用的。优化现有系统的成本比系统重构或者迁移到 NOSQL 低很多。

来源:http://blog.eood.cn/mysql

秒杀SSD,ubuntu极速开发环境搭建

ubuntu打开的正确方式(笑)

在这个快节奏的时代。能够使用最快速度最低代价完成任务具有非常重要的意义,对于现代开发者来说,Linux是生活中必不可少且不可替代的工具,如果我们在开发少或学习中少一些遇到环境的坑,会节省很多时间,潜伏在各种Linux群中数年,发现大家都有手贱(操作失误,笑),因此在本文中给出终极解决方案: 直接使用Ubuntu Live CD 来完成系统的启动。

那么最快的Linux安装办法又是什么呢?其实经过严谨的思考之后我个人觉得是不安装。我们可以准备从grub启动ubuntu操作系统把系统放到内存中,再预制出各种情况的环境包,也就是环境模块化,因为系统是在整个内存中所以速度非常非常快,需要模块化的内容并不多,比如说ssh vim tmux 为一组工具,开机后一个命令就可以激活工具包,不到几秒钟的时间即可完成,其他的如Chrome浏览器一类的都可以快速完成在内存上的安装。通过这种方式让环境更加灵活更加快速准备好开发环境。

这是一个思路上的变化,从我需要什么就安装什么一起都准备好给你用->变成了只启动基础的系统然后我需要什么我就后加载什么。

最后的准备在于容器,Docker 以及RKT与RunC的准备,在团队内可以秒级推送运行的环境。

秒杀SSD,ubuntu极速开发环境搭建
秒杀SSD,ubuntu极速开发环境搭建

本文依然有它的缺点: 主要体现在两个方面

  1. 如果默认驱动不好使会造成很多麻烦。
  2. 对于内存小的开发机器还是做快照比较好。最少4G内存,我们推荐内存在8G以上最好是16G或者32G内存的机器上采用此方案。

因为本方案整个操作系统都是加载到内存中的,硬盘速度即为内存的速度,我这里实测可以达到4.5Gb/s,所以你准备好屌丝逆袭(买不起SSD)秒杀高富帅了吗?

ubuntu

对于它的简单介绍可以参考这里。当然对于我本人而言选择Ubuntu主要原因仅仅是对他比较熟悉。并不限制使用什么发行版本。如果您要是选本方案搭建环境,并且选择其他发行版本请选择LiveCD尽量小一点的,如果能自己裁剪LiveCD就更好了,另外尽量选择64位架构。当然自己越熟悉越好。

虽然Ubuntu有一点不自由,但是我个人觉得包的质量管理还是非常好的,的确适合开发者使用。

Docker

官方:https://www.docker.com/

它对于我来说,几乎就像是水,如果没有他就没有今天的丰富多彩的运行方式,它可以让程序连同环境一起打包运行,使得部署备份等等非常方便,对于本次环境构建而言我们可以在个人的registry上备份自己的环境,只需要一小段时间就可以克隆回来。再加上现在各种永久免费的国内加速服务这种环境部署就是程序员天堂。更多细节请关注这里

在本文中我们使用单文件版本的Docker文件,方便可控。无任何累赘。本人不喜脚本安装。

RunC && RKT

这两种产品是libcontainer的代表。相对于Docker来说,它是一个容器只需要一个进程,对于Docker来说,他需要一个守护进程。在本文中(本博主)不评价任何产品的好坏,只说什么时候适合用什么。当然在我们这里利用了它启动方便,挂载方便的特性让我们的工作更方便更方便更方便!

由于现在RunC还没有发布1.0版本文档几乎没有,因此我这里会给出我的详细研究结果。至于RKT还是大家自己摸索,文档已经很全了。

CoreOS

作为专门运行容器的操作系统,稳定性可不属性都是前所未有,当然我们的容器可以跑在这个上面本文中会提及两个系统的兼容性方案。

  1. Ubuntu适合程序开发的情况。启动速度可能在1分钟左右(有点慢)。但是有图形界面,有定制基础环境的方案。
  2. CoreOS适合跑程序,启动速度在10秒以下适合释放更多内存来跑临时业务,做测试的时候实用此方案。

从Grub开始

什么是Grub

它可以装在硬盘上帮助你启动操作系统,几乎所有操作系统都可以,当然也包含本次的方案内容。安装方式有很多种。而且必须得根据自己的情况来安装。因为每个人电脑上的操作系统情况都不一样,有的已经有系统了。有的不想给自己装引导。可能先放到u盘上引导都有可能。因此这里不做安装方法上的更多描述可以自己根据情况到搜索引擎上搜索。

Grub 的安装

我之前是安装了windows,所以我直接安装了EasyBCD然后安装NeoGRUB来实现的。具体操作步骤如下:

  1. 下载安装EasyBCD
  2. 如图所示
    秒杀SSD,ubuntu极速开发环境搭建
    秒杀SSD,ubuntu极速开发环境搭建
  3. 安装重启电脑之后选择Grub启动项可以进入一个类似输入命令的界面即可确定完成安装。

Ubuntu 启动配置

启动准备

如果想要准备启动Ubuntu那么有三个关键要素,

  1. ubuntu-14.04.2-desktop-amd64.iso
  2. image中casper/vmlinuz.efi
  3. image中casper/initrd.lz

这三个文件作为启动的必要文件请放到分区中容易找到的地方。推荐做法:给自己的硬盘上开个EXT4 分区,然后把三个文件丢到里面去。

启动参数调试

工作中我们讲求流程,当然我们也需要一定的路程,我们不可能一次调整就成功把ISO启动起来。因此我们先加一个调试流程。

root (hd0,1)
kernel (hd0,1)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.2-desktop-amd64.iso ro quiet splash locate=en_US.UTF-8
initrd (hd0,1)/casper/initrd.lz
  1. 你需要看清楚把文件放到了第几块硬盘上,第几块分区上。组成参数为(hd0,1)(我的是0号硬盘第二个分区)。如果你实在分不清可以参考这里
  2. root (hd0,1) 设置GRUB的root设备
  3. kernel 命令套格式,变化参数 vmlinuz.efi 和 ubuntu-14.04.2-desktop-amd64.iso 要与你放到硬盘上的位置对应,可以使用Tab自动补全非常实用。
  4. initrd 依然是套格式找到对应硬盘傻姑娘的initrd.lz的位置。
  5. 如果出现错误了按会出现刚才的命令,多加修改直到成功启动。

启动参数放到硬盘中

如果是NeoGrub配置文件路径C:NSTmenu.lst,其他的请参考说明文档,一般都会有的。

配置文件写法:

timeout 3
default 0
title Ubuntu
root (hd0,1)
kernel (hd0,1)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.2-desktop-amd64.iso ro quiet splash locate=en_US.UTF-8
initrd (hd0,1)/casper/initrd.lz

3秒等待自动选择第一项,名称ubuntu 别的剩下的就是刚才调试内容的命令了。

完成刚需配置

刚醒需求配置是指在容器之外的刚醒需求配置,比如说编辑器,SSH等等工具箱。配置方法: APT

  1. 修改安装源:sed -i ‘s/archive.ubuntu.com/mirrors.aliyun.com/g’ /etc/apt/sources.list && apt-get update
  2. 安装你需要的软件包:apt-get install -y vim screen tmux ssh-server等等
  3. 调试你的环境看看是否好使,然后复制文件夹/var/cache/apt/archives中所有deb文件即为您刚才所有的安装包。复制到一个可以持久化的文件夹中等待使用。
  4. 回调环境: 每当您重新启动之后这些安装包即消失,想恢复,进入到上一步中复制到的文件夹中执行如下命令dpkg -i *即可安装预先准备好的软件
  5. 灵活使用,此步骤为发挥组合拳威力的一步。当您反复定制凝练您的安装包之后,会根据个人情况选择不同的目录来初始化您的环境,其结果是,又小又轻,非常可靠。再也不怕手贱导致环境崩坏,再加上外部的git服务保证工作内容的安全性基本上可以肯定的说:我们的环境与硬件与工作耦合度降低不少.
  6. 对于APT无法安装的内容,比如说JDK 与定制版本的Eclipse您可以通过下载完之后持久化保存到硬盘中,写一个脚本解压后放到硬盘中至于环境直接写入到profile中即可。
  7. 使用此方法之后假如您使用IDE真的会有一个非常非常大的速度提升,我打开Eclipse C/C++ 5秒钟即可。

容器安装配置

一般情况下我们安装Docker都是通过网上下载脚本安装,但是这种情况下我们推荐使用直接下载单文件版本的来完成安装安装脚本如下:

curl -sSL -O https://get.daocloud.io/docker/builds/Linux/x86_64/docker-latest
chmod +x docker-latest
mv docker-latest /usr/bin/docker
docker -d & 

在第三行中复制docker程序到任何Path下的文件夹内备用。在配置上,还是要吧/var/lib/docker放到可持久化的软连接下面。比如说按照下面的操作:

rm -rf /var/lib/docker
ln -s /isodevice/docker /var/lib/docekr 

按照这种方法操作可以让docker image 持久化保存在硬盘中。重启也能找回来。这里注意,如果您之前就实践了CoreOS 171.3 版本上的Docker它使用的是1.6版本他的存储文件格式与1.7的不同因此不通用。我就踩到这个坑了。接下来的操作就与Docker一样了。

注意:这个安装包: cgroup-lite_1.9_all.deb 一定要装,默认的光盘中就差这一个依赖,在下面的安装包中有要不就apt安装保存下来都可以。

材料准备

我在百度云盘中准备了三个文件,第一个是docker 1.7.1 第二个准别了vim screen ssh-server tmux CGroup的安装包。最后一个把我常用的Docker images 打包放出来了。其实在准备这个方案花最多时间就是在于精简依赖,最后发现只需要一个CGroup安装包。

总结

在本段文档中,我们给出了一个全新的使用Linux操作系统的思路不安装。并且做了一定的前期准备工作。启动了Linux操作系统做到本步骤如果您是新手就可以开始Linux的学习旅程了,如果您是需要此方案工作已经可以展开一般性质的工作了。最后我真的拆掉我的三爽垃圾ssd(越用越慢)直接上内存。

方案合理要素:

  1. root权限过大。有时导致无法挽回的误操作。
  2. 现在的电脑内存不是很贵。大部分Linux电脑内存都在闲置。
  3. Linux操作系统如果每次执行的任务如果比较单一(一台物理机只给一个人用)真的不会很大。
  4. 给重新启动计算机赋予了新的意义。
  5. 真正超过SSD的速度,成本更低。(实测启动Eclipse C/C++ 仅需要5s)

来源:https://linux.cn/article-5885-1.html

新手指南: 手把手教你安装 Ubuntu 和 Fedora

Linux 由于开源,所以具备可定制性,因此衍生了许多发行版。Ubuntu 和 Fedora 算是其中对新手比较友好的两个发行版,主要是其安装较为简单,用户群多,有问题搜索出相关的信息或者找前辈解决。此文为 Linux 新手准备,通过展示整个安装过程来使 Linxu 新手完成安装 Ubuntu 或 Fedora ,也恳请各位前辈指出不足之处。

阅读建议

  • 本文将包含 Ubuntu 和 Fedora 两个发行版的安装,请先通篇浏览全文,再决定安装哪个发行版,并且配图有相应的文字说明,请不要忽视。
  • 如果你是一位新手,强烈建议使用虚拟机操作;如果你相信自己可以解决问题,也可使用 ultraiso 、USBWriter 和 dd命令写入 U 盘,进行实体机安装,此处不详述。
  • 有任何问题都可以加入 Linux中国-新手村 QQ 群提问,QQ 群号 198889109 ,验证信息 LINUX.CN 。

Ubuntu 简介

Ubuntu 是一个基于 Debian 的 GNU/Linux 操作系统,支持 X86 、64以及 PPC 架构。Ubuntu 每隔六个月发布一个版本,即每年的四月和十月,本文使用的是 15.04 64-bit 版本。Ubuntu 对于新手应该是比较友好的一个 Linux 发行版,中文本地化也做的不错,有开箱即用的感觉。因为 Ubuntu 近几年用户群的增加,多了很多对于新手有用的资料,因此不用担心遇到问题无法解决,善用搜索和提问,将使你更快速地成长。

Fedora 简介

Fedora 是一个由 Fedora 社区开发的 Linux 发行版,由 Red Hat 公司赞助。可以将 Fedora 看成是 Red Hat Linux 个人使用的代替,由于有 Red Hat 公司的支持,Fedora 的功能非常完善,还分为 WORKSTATION 、SERVER 和 CLOUD 版本。本文使用的是 Fedora 22 WORKSTATION (工作站),Fedora 22 已经将包管理器从 YUM 改为 DNF ,因此建议学习者直接学习 DNF 。

本文环境

Ubuntu 安装

1.新建与加载盘片

当你安装完 VirtualBox 后,打开你应该会看到下面这样的界面

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

点击新建后会出来如下图所示的界面,一般如图填写即可,内存可酌情填写

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

下一步将创建虚拟硬盘,如图所示,默认位置为 C 盘,如果你不想在 C 盘创建,请确保你选择的盘格式为NTFS

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

创建完成后,请点 设置 如图加载 ISO 文件

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

2.安装 Ubuntu

点击启动 ,会开机,进入如下界面

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

这里请注意,如果你与笔者一样使用虚拟机,强烈建议选择 清除整个磁盘并安装 Ubuntu ,但如果你要装到实体机与 Windows 形成双系统时,请选择 其他选项 ,但这要求你对 Linxu 有一定的了解且具备一定的基础进行分区操作,注意不要覆盖 Windows 的 C 盘,此处由于篇幅原因,不再详述。

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

如图,进行用户设定,计算机名 是主机名,用户名 是登录时用的账户名称,密码 则是你所设 用户名 的登录密码,请务必记牢。

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

这一步之后会选择时区,直接点下一步即可,键盘选择如下图

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

配置选择已完成,接下来请耐心等待安装过程,如图,请不要点击 SKIP

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

耐心等待安装完成,然后会重启进入系统,用你上面配置的用户名和密码登录,请注意最好不要登录 root ,你可以用 sudo 命令来获取相应的权限,下图是展示成果:

新手指南: 手把手教你安装 Ubuntu 和 Fedora
新手指南: 手把手教你安装 Ubuntu 和 Fedora

来源:https://linux.cn/article-5893-1.html

如何修复 ubuntu 中检测到系统程序错误的问题

如何修复 ubuntu 中检测到系统程序错误的问题
如何修复 ubuntu 中检测到系统程序错误的问题

在过去的几个星期,(几乎)每次都有消息 Ubuntu 15.04在启动时检测到系统程序错误 跑出来“欢迎”我。那时我是直接忽略掉它的,但是这种情况到了某个时刻,它就让人觉得非常烦人了!

检测到系统程序错误(System program problem detected)

你想立即报告这个问题吗?

我肯定地知道如果你是一个Ubuntu用户,你可能曾经也遇到过这个恼人的弹窗。在本文中,我们将探讨在Ubuntu 14.04和15.04中遇到”检测到系统程序错误(system program problem detected)”时 应该怎么办。

怎么解决Ubuntu中”检测到系统程序错误”的错误

那么这个通知到底是关于什么的?

大体上讲,它是在告知你,你的系统的一部分崩溃了。可别因为“崩溃”这个词而恐慌。这不是一个严重的问题,你的系统还是完完全全可用的。只是在之前的某个时刻某个程序崩溃了,而Ubuntu想让你决定要不要把这个问题报告给开发者,这样他们就能够修复这个问题。

那么,我们点了“报告错误”的按钮后,它以后就不再显示了?

不,不是的!即使你点了“报告错误”按钮,最后你还是会被一个如下的弹窗再次“欢迎”一下:

对不起,Ubuntu发生了一个内部错误是个Apport(LCTT 译注:Apport是Ubuntu中错误信息的收集报告系统,详见Ubuntu Wiki中的Apport篇),它将会进一步的打开网页浏览器,然后你可以通过登录或创建Launchpad帐户来填写一份漏洞(Bug)报告文件。你看,这是一个复杂的过程,它要花整整四步来完成。

但是我想帮助开发者,让他们知道这个漏洞啊 !

你这样想的确非常地周到体贴,而且这样做也是正确的。但是这样做的话,存在两个问题。第一,存在非常高的概率,这个漏洞已经被报告过了;第二,即使你报告了个这次崩溃,也无法保证你不会再看到它。

那么,你的意思就是说别报告这次崩溃了?

对,也不对。如果你想的话,在你第一次看到它的时候报告它。你可以在上面图片显示的“显示细节(Show Details)”中,查看崩溃的程序。但是如果你总是看到它,或者你不想报告漏洞(Bug),那么我建议你还是一次性摆脱这个问题吧。

修复Ubuntu中“检测到系统程序错误”的错误

这些错误报告被存放在Ubuntu中目录/var/crash中。如果你翻看这个目录的话,应该可以看到有一些以crash结尾的文件。

我的建议是删除这些错误报告。打开一个终端,执行下面的命令:

sudo rm /var/crash/*

这个操作会删除所有在/var/crash目录下的所有内容。这样你就不会再被这些报告以前程序错误的弹窗所扰。但是如果又有一个程序崩溃了,你就会再次看到“检测到系统程序错误”的错误。你可以再次删除这些报告文件,或者你可以禁用Apport来彻底地摆脱这个错误弹窗。

彻底地摆脱Ubuntu中的系统错误弹窗

如果你这样做,系统中任何程序崩溃时,系统都不会再通知你。如果你想问问我的看法的话,我会说,这不是一件坏事,除非你愿意填写错误报告。如果你不想填写错误报告,那么这些错误通知存不存在都不会有什么区别。

要禁止Apport,并且彻底地摆脱Ubuntu系统中的程序崩溃报告,打开一个终端,输入以下命令:

gksu gedit /etc/default/apport

这个文件的内容是:

# 设置0表示禁用Apportw,或者1开启它。
# 你可以用下面的命令暂时关闭它:
# sudo service apport start force_start=1
enabled=1

enabled=1改为enabled=0。保存并关闭文件。完成之后你就再也不会看到弹窗报告错误了。很显然,如果我们想重新开启错误报告功能,只要再打开这个文件,把enabled设置为1就可以了。

你的有效吗?

我希望这篇教程能够帮助你修复Ubuntu 14.04和Ubuntu 15.04中检测到系统程序错误的问题。如果这个小窍门帮你摆脱了这个烦人的问题,请让我知道。


via: http://itsfoss.com/how-to-fix-system-program-problem-detected-ubuntu/

作者:Abhishek 译者:XLCYun 校对:wxy

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

来源:https://linux.cn/article-5904-1.html

监控 Linux 系统的 7 个命令行工具

这里有一些基本的命令行工具,让你能更简单地探索和操作Linux。

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

深入

关于Linux最棒的一件事之一是你能深入操作系统,来探索它是如何工作的,并寻找机会来微调性能或诊断问题。这里有一些基本的命令行工具,让你能更简单地探索和操作Linux。大多数的这些命令是在你的Linux系统中已经内建的,但假如它们没有的话,就用谷歌搜索命令名和你的发行版名吧,你会找到哪些包需要安装(注意,一些命令是和其它命令捆绑起来打成一个包的,你所找的包可能写的是其它的名字)。如果你知道一些你所使用的其它工具,欢迎评论。

我们怎么开始

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

须知: 本文中的截图取自一台Debian Linux 8.1 (“Jessie”),其运行在OS X 10.10.3 (“Yosemite”)操作系统下的Oracle VirtualBox 4.3.28中的一台虚拟机里。想要建立你的Debian虚拟机,可以看看我的这篇教程——“如何在 VirtualBox VM 下安装 Debian”。

Top

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

作为Linux系统监控工具中比较易用的一个,top命令能带我们一览Linux中的几乎每一处。以下这张图是它的默认界面,但是按“z”键可以切换不同的显示颜色。其它热键和命令则有其它的功能,例如显示概要信息和内存信息(第四行第二个),根据各种不一样的条件排序、终止进程任务等等(你可以在这里找到完整的列表)。

htop

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

相比top,它的替代品Htop则更为精致。维基百科是这样描述的:“用户经常会部署htop以免Unix top不能提供关于系统进程的足够信息,比如说当你在尝试发现应用程序里的一个小的内存泄露问题,Htop一般也能作为一个系统监听器来使用。相比top,它提供了一个更方便的光标控制界面来向进程发送信号。” (想了解更多细节猛戳这里)

Vmstat

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

Vmstat是一款监控Linux系统性能数据的简易工具,这让它更合适使用在shell脚本中。使出你的正则表达式绝招,用vmstat和cron作业来做一些激动人心的事情吧。“后面的报告给出的是上一次系统重启之后的均值,另外一份报告给出的则是从前一个报告起间隔周期中的信息。其它的进程和内存报告是那个瞬态的情况”(猛戳这里获取更多信息)。

ps

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

ps命令展现的是正在运行中的进程列表。在这种情况下,我们用“-e”选项来显示每个进程,也就是所有正在运行的进程了(我把列表滚动到了前面,否则列名就看不到了)。这个命令有很多选项允许你去按需格式化输出。只要使用上述一点点的正则表达式技巧,你就能得到一个强大的工具了。猛戳这里获取更多信息。

Pstree

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

Pstree“以树状图显示正在运行中的进程。这个进程树是以某个 pid 为根节点的,如果pid被省略的话那树是以init为根节点的。如果指定用户名,那所有进程树都会以该用户所属的进程为父进程进行显示。”以树状图来帮你将进程之间的所属关系进行分类,这的确是个很有效的工具(戳这里)。

pmap

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

在调试过程中,理解一个应用程序如何使用内存是至关重要的,而pmap的作用就是当给出一个进程ID时显示出相关信息。上面的截图展示的是使用“-x”选项所产生的部分输出,你也可以用pmap的“-X”选项来获取更多的细节信息,但是前提是你要有个更宽的终端窗口。

iostat

监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具

Linux系统的一个至关重要的性能指标是处理器和存储的使用率,它也是iostat命令所报告的内容。如同ps命令一样,iostat有很多选项允许你选择你需要的输出格式,除此之外还可以在某一段时间范围内的重复采样几次。详情请戳这里


via: http://www.networkworld.com/article/2937219/linux/7-command-line-tools-for-monitoring-your-linux-system.html

作者:Mark Gibbs 译者:ZTinoZ 校对:wxy

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

来源:https://linux.cn/article-5898-1.html

LINUX 101: 让你的 SHELL 更强大

在我们的关于 shell 基础的指导下, 得到一个更灵活,功能更强大且多彩的命令行界面

为何要这样做?

  • 使得在 shell 提示符下过得更轻松,高效
  • 在失去连接后恢复先前的会话
  • Stop pushing around that fiddly rodent!
LINUX 101: 让你的 SHELL 更强大
LINUX 101: 让你的 SHELL 更强大

这是我的命令行提示符的设置。对于这个小的终端窗口来说,这或许有些长。但你可以根据你的喜好来调整它。

作为一个 Linux 用户, 你可能熟悉 shell (又名为命令行)。 或许你需要时不时的打开终端来完成那些不能在 GUI 下处理的必要任务,抑或是因为你处在一个将窗口铺满桌面的环境中,而 shell 是你与你的 linux 机器交互的主要方式。

在上面那些情况下,你可能正在使用你所使用的发行版本自带的 Bash 配置。 尽管对于大多数的任务而言,它足够好了,但它可以更加强大。 在本教程中,我们将向你展示如何使得你的 shell 提供更多有用信息、更加实用且更适合工作。 我们将对提示符进行自定义,让它比默认情况下提供更好的反馈,并向你展示如何使用炫酷的 tmux 工具来管理会话并同时运行多个程序。 并且,为了让眼睛舒服一点,我们还将关注配色方案。那么,进击吧,少女!

让提示符更美妙

大多数的发行版本配置有一个非常简单的提示符,它们大多向你展示了一些基本信息, 但提示符可以为你提供更多的内容。例如,在 Debian 7 下,默认的提示符是这样的:

mike@somebox:~$

上面的提示符展示出了用户、主机名、当前目录和账户类型符号(假如你切换到 root 账户, $ 会变为 #)。 那这些信息是在哪里存储的呢? 答案是:在 PS1 环境变量中。 假如你键入 echo $PS1, 你将会在这个命令的输出字符串的最后有如下的字符:

u@h:w$

这看起来有一些丑陋,并在瞥见它的第一眼时,你可能会开始尖叫,认为它是令人恐惧的正则表达式,但我们不打算用这些复杂的字符来煎熬我们的大脑。这不是正则表达式,这里的斜杠是转义序列,它告诉提示符进行一些特别的处理。 例如,上面的 u 部分,告诉提示符展示用户名, 而 w 则展示工作路径.

下面是一些你可以在提示符中用到的字符的列表:

  • d 当前的日期
  • h 主机名
  • n 代表换行的字符
  • A 当前的时间 (HH:MM)
  • u 当前的用户
  • w (小写) 整个工作路径的全称
  • W (大写) 工作路径的简短名称
  • $ 一个提示符号,对于 root 用户为 # 号
  • ! 当前命令在 shell 历史记录中的序号

下面解释 wW 选项的区别: 对于前者,你将看到你所在的工作路径的完整地址,(例如 /usr/local/bin),而对于后者, 它则只显示 bin 这一部分。

现在,我们该怎样改变提示符呢? 你需要更改 PS1 环境变量的内容,试试下面这个:

export PS1="I am u and it is A $"

现在,你的提示符将会像下面这样:

I am mike and it is 11:26 $

从这个例子出发,你就可以按照你的想法来试验一下上面列出的其他转义序列。 但等等 – 当你登出后,你的这些努力都将消失,因为在你每次打开终端时,PS1 环境变量的值都会被重置。解决这个问题的最简单方式是打开 .bashrc 配置文件(在你的家目录下) 并在这个文件的最下方添加上完整的 export 命令。在每次你启动一个新的 shell 会话时,这个 .bashrc 会被 Bash 读取, 所以你的加强的提示符就可以一直出现。你还可以使用额外的颜色来装扮提示符。刚开始,这将有点棘手,因为你必须使用一些相当奇怪的转义序列,但结果是非常漂亮的。 将下面的字符添加到你的 PS1字符串中的某个位置,最终这将把文本变为红色:

[e[31m]

你可以将这里的 31 更改为其他的数字来获得不同的颜色:

  • 30 黑色
  • 32 绿色
  • 33 黄色
  • 34 蓝色
  • 35 洋红色
  • 36 青色
  • 37 白色

所以,让我们使用先前看到的转义序列和颜色来创造一个提示符,以此来结束这一小节的内容。深吸一口气,弯曲你的手指,然后键入下面这只“野兽”:

export PS1="(!) [e[31m] [A] [e[32m]u@h [e[34m]w [e[30m]$"

上面的命令提供了一个 Bash 命令历史序号、当前的时间、彩色的用户或主机名组合、以及工作路径。假如你“野心勃勃”,利用一些惊人的组合,你还可以更改提示符的背景色和前景色。非常有用的 Arch wiki 有一个关于颜色代码的完整列表:http://tinyurl.com/3gvz4ec

Shell 精要

假如你是一个彻底的 Linux 新手并第一次阅读这份杂志,或许你会发觉阅读这些教程有些吃力。 所以这里有一些基础知识来让你熟悉一些 shell。 通常在你的菜单中, shell 指的是 Terminal、 XTerm 或 Konsole, 当你启动它后, 最为实用的命令有这些:

ls (列出文件名); cp one.txt two.txt (复制文件); rm file.txt (移除文件); mv old.txt new.txt (移动或重命名文件);

cd /some/directory (改变目录); cd .. (回到上级目录); ./program (在当前目录下运行一个程序); ls > list.txt (重定向输出到一个文件)。

几乎每个命令都有一个手册页用来解释其选项(例如 man ls – 按 Q 来退出)。在那里,你可以知晓命令的选项,这样你就知道 ls -la 展示一个详细的列表,其中也列出了隐藏文件, 并且在键入一个文件或目录的名字的一部分后, 可以使用 Tab 键来自动补全。

Tmux: 针对 shell 的窗口管理器

在文本模式的环境中使用一个窗口管理器 – 这听起来有点不可思议, 是吧? 然而,你应该记得当 Web 浏览器第一次实现分页浏览的时候吧? 在当时, 这是在可用性上的一个重大进步,它减少了桌面任务栏的杂乱无章和繁多的窗口列表。 对于你的浏览器来说,你只需要一个按钮便可以在浏览器中切换到你打开的每个单独网站, 而不是针对每个网站都有一个任务栏或导航图标。 这个功能非常有意义。

若有时你同时运行着几个虚拟终端,你便会遇到相似的情况; 在这些终端之间跳转,或每次在任务栏或窗口列表中找到你所需要的那一个终端,都可能会让你觉得麻烦。 拥有一个文本模式的窗口管理器不仅可以让你像在同一个终端窗口中运行多个 shell 会话,而且你甚至还可以将这些窗口排列在一起。

另外,这样还有另一个好处:可以将这些窗口进行分离和重新连接。想要看看这是如何运行的最好方式是自己尝试一下。在一个终端窗口中,输入 screen (在大多数发行版本中,它已经默认安装了或者可以在软件包仓库中找到)。 某些欢迎的文字将会出现 – 只需敲击 Enter 键这些文字就会消失。 现在运行一个交互式的文本模式的程序,例如 nano, 并关闭这个终端窗口。

在一个正常的 shell 对话中, 关闭窗口将会终止所有在该终端中运行的进程 – 所以刚才的 Nano 编辑对话也就被终止了, 但对于 screen 来说,并不是这样的。打开一个新的终端并输入如下命令:

screen -r

瞧,你刚开打开的 Nano 会话又回来了!

当刚才你运行 screen 时, 它会创建了一个新的独立的 shell 会话, 它不与某个特定的终端窗口绑定在一起,所以可以在后面被分离并重新连接(即 -r 选项)。

当你正使用 SSH 去连接另一台机器并做着某些工作时, 但并不想因为一个脆弱的连接而影响你的进度,这个方法尤其有用。假如你在一个 screen 会话中做着某些工作,并且你的连接突然中断了(或者你的笔记本没电了,又或者你的电脑报废了——不是这么悲催吧),你只需重新连接或给电脑充电或重新买一台电脑,接着运行 screen -r 来重新连接到远程的电脑,并在刚才掉线的地方接着开始。

现在,我们都一直在讨论 GNU 的 screen,但这个小节的标题提到的是 tmux。 实质上, tmux (terminal multiplexer) 就像是 screen 的一个进阶版本,带有许多有用的额外功能,所以现在我们开始关注 tmux。 某些发行版本默认包含了 tmux; 在其他的发行版本上,通常只需要一个 apt-get、 yum installpacman -S 命令便可以安装它。

一旦你安装了它过后,键入 tmux 来启动它。接着你将注意到,在终端窗口的底部有一条绿色的信息栏,它非常像传统的窗口管理器中的任务栏: 上面显示着一个运行着的程序的列表、机器的主机名、当前时间和日期。 现在运行一个程序,同样以 Nano 为例, 敲击 Ctrl+B 后接着按 C 键, 这将在 tmux 会话中创建一个新的窗口,你便可以在终端的底部的任务栏中看到如下的信息:

0:nano- 1:bash*

每一个窗口都有一个数字,当前呈现的程序被一个星号所标记。 Ctrl+B 是与 tmux 交互的标准方式, 所以若你敲击这个按键组合并带上一个窗口序号, 那么就会切换到对应的那个窗口。你也可以使用 Ctrl+B 再加上 N 或 P 来分别切换到下一个或上一个窗口 – 或者使用 Ctrl+B 加上 L 来在最近使用的两个窗口之间来进行切换(有点类似于桌面中的经典的 Alt+Tab 组合键的效果)。 若需要知道窗口列表,使用 Ctrl+B 再加上 W。

目前为止,一切都还好:现在你可以在一个单独的终端窗口中运行多个程序,避免混乱(尤其是当你经常与同一个远程主机保持多个 SSH 连接时)。 当想同时看两个程序又该怎么办呢?

针对这种情况, 可以使用 tmux 中的窗格。 敲击 Ctrl+B 再加上 % , 则当前窗口将分为两个部分:一个在左一个在右。你可以使用 Ctrl+B 再加上 O 来在这两个部分之间切换。 这尤其在你想同时看两个东西时非常实用, – 例如一个窗格看指导手册,另一个窗格里用编辑器看一个配置文件。

有时,你想对一个单独的窗格进行缩放,而这需要一定的技巧。 首先你需要敲击 Ctrl+B 再加上一个 :(冒号),这将使得位于底部的 tmux 栏变为深橙色。 现在,你进入了命令模式,在这里你可以输入命令来操作 tmux。 输入 resize-pane -R 来使当前窗格向右移动一个字符的间距, 或使用 -L 来向左移动。 对于一个简单的操作,这些命令似乎有些长,但请注意,在 tmux 的命令模式(前面提到的一个分号开始的模式)下,可以使用 Tab 键来补全命令。 另外需要提及的是, tmux 同样也有一个命令历史记录,所以若你想重复刚才的缩放操作,可以先敲击 Ctrl+B 再跟上一个分号,并使用向上的箭头来取回刚才输入的命令。

最后,让我们看一下分离和重新连接 – 即我们刚才介绍的 screen 的特色功能。 在 tmux 中,敲击 Ctrl+B 再加上 D 来从当前的终端窗口中分离当前的 tmux 会话。这使得这个会话的一切工作都在后台中运行、使用 tmux a 可以再重新连接到刚才的会话。但若你同时有多个 tmux 会话在运行时,又该怎么办呢? 我们可以使用下面的命令来列出它们:

tmux ls

这个命令将为每个会话分配一个序号; 假如你想重新连接到会话 1, 可以使用 tmux a -t 1. tmux 是可以高度定制的,你可以自定义按键绑定并更改配色方案, 所以一旦你适应了它的主要功能,请钻研指导手册以了解更多的内容。

LINUX 101: 让你的 SHELL 更强大
LINUX 101: 让你的 SHELL 更强大

上图中, tmux 开启了两个窗格: 左边是 Vim 正在编辑一个配置文件,而右边则展示着指导手册页。

Zsh: 另一个 shell

选择是好的,但标准同样重要。 你要知道几乎每个主流的 Linux 发行版本都默认使用 Bash shell – 尽管还存在其他的 shell。 Bash 为你提供了一个 shell 能够给你提供的几乎任何功能,包括命令历史记录,文件名补全和许多脚本编程的能力。它成熟、可靠并文档丰富 – 但它不是你唯一的选择。

许多高级用户热衷于 Zsh, 即 Z shell。 这是 Bash 的一个替代品并提供了 Bash 的几乎所有功能,另外还提供了一些额外的功能。 例如, 在 Zsh 中,你输入 ls ,并敲击 Tab 键可以得到 ls 可用的各种不同选项的一个大致描述。 而不需要再打开 man page 了!

Zsh 还支持其他强大的自动补全功能: 例如,输入 cd /u/lo/bi 再敲击 Tab 键, 则完整的路径名 /usr/local/bin 就会出现(这里假设没有其他的路径包含 u, lobi 等字符)。 或者只输入 cd 再跟上 Tab 键,则你将看到着色后的路径名的列表 – 这比 Bash 给出的简单的结果好看得多。

Zsh 在大多数的主要发行版本上都可以得到了; 安装它后并输入 zsh 便可启动它。 要将你的默认 shell 从 Bash 改为 Zsh, 可以使用 chsh 命令。 若需了解更多的信息,请访问 www.zsh.org

“未来”的终端

你或许会好奇为什么包含你的命令行提示符的应用被叫做终端。 这需要追溯到 Unix 的早期, 那时人们一般工作在一个多用户的机器上,这个巨大的电脑主机将占据一座建筑中的一个房间, 人们通过某些线路,使用屏幕和键盘来连接到这个主机, 这些终端机通常被称为“哑终端”, 因为它们不能靠自己做任何重要的执行任务 – 它们只展示通过线路从主机传来的信息,并输送回从键盘的敲击中得到的输入信息。

今天,我们在自己的机器上执行几乎所有的实际操作,所以我们的电脑不是传统意义下的终端,这就是为什么诸如 XTerm、 Gnome Terminal、 Konsole 等程序被称为“终端模拟器” 的原因 – 他们提供了同昔日的物理终端一样的功能。事实上,在许多方面它们并没有改变多少。诚然,现在我们有了反锯齿字体,更好的颜色和点击网址的能力,但总的来说,几十年来我们一直以同样的方式在工作。

所以某些程序员正尝试改变这个状况。 Terminology (http://tinyurl.com/osopjv9), 它来自于超级时髦的 Enlightenment 窗口管理器背后的团队,旨在让终端步入到 21 世纪,例如带有在线媒体显示功能。你可以在一个充满图片的目录里输入 ls 命令,便可以看到它们的缩略图,或甚至可以直接在你的终端里播放视频。 这使得一个终端有点类似于一个文件管理器,意味着你可以快速地检查媒体文件的内容而不必用另一个应用来打开它们。

接着还有 Xiki (www.xiki.org),它自身的描述为“命令的革新”。它就像是一个传统的 shell、一个 GUI 和一个 wiki 之间的过渡;你可以在任何地方输入命令,并在后面将它们的输出存储为笔记以作为参考,并可以创建非常强大的自定义命令。用几句话是很能描述它的,所以作者们已经创作了一个视频来展示它的潜力是多么的巨大(请看 Xiki 网站的截屏视频部分)。

并且 Xiki 绝不是那种在几个月之内就消亡的昙花一现的项目,作者们成功地进行了一次 Kickstarter 众筹,在七月底已募集到超过 $84,000。 是的,你没有看错 – $84K 来支持一个终端模拟器。这可能是最不寻常的集资活动了,因为某些疯狂的家伙已经决定开始创办它们自己的 Linux 杂志 ……

下一代终端

许多命令行和基于文本的程序在功能上与它们的 GUI 程序是相同的,并且常常更加快速和高效。我们的推荐有: Irssi (IRC 客户端); Mutt (mail 客户端); rTorrent (BitTorrent); Ranger (文件管理器); htop (进程监视器)。 若给定在终端的限制下来进行 Web 浏览, Elinks 确实做的很好,并且对于阅读那些以文字为主的网站例如 Wikipedia 来说。它非常实用。

微调配色方案

在《Linux Voice》杂志社中,我们并不迷恋那些养眼的东西,但当你每天花费几个小时盯着屏幕看东西时,我们确实认识到美学的重要性。我们中的许多人都喜欢调整我们的桌面和窗口管理器来达到完美的效果,调整阴影效果、摆弄不同的配色方案,直到我们 100% 的满意(然后出于习惯,摆弄更多的东西)。

但我们倾向于忽视终端窗口,它理应也获得我们的喜爱,并且在 http://ciembor.github.io/4bit 你将看到一个极其棒的配色方案设计器,对于所有受欢迎的终端模拟器(XTerm, Gnome Terminal, Konsole 和 Xfce4 Terminal 等都是支持的应用。),它可以输出其设定。移动滑块直到你看到配色方案最佳, 然后点击位于该页面右上角的 得到方案 按钮。

相似的,假如你在一个文本编辑器,如 Vim 或 Emacs 上花费了很多的时间,使用一个精心设计的调色板也是非常值得的。 Solarized http://ethanschoonover.com/solarized 是一个卓越的方案,它不仅漂亮,而且因追求最大的可用性而设计,在其背后有着大量的研究和测试。


via: http://www.linuxvoice.com/linux-101-power-up-your-shell-8/

作者:Ben Everard 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-5910-1.html

Linux:Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签

: 我以前可以在我的 Ubuntu 台式机中的 gnome-terminal 中开启多个标签。但升到 Ubuntu 15.04 后,我就无法再在 gnome-terminal 窗口中打开新标签了。要怎样做才能在 Ubuntu 15.04 的 gnome-terminal 中打开标签呢?

在 Ubuntu 14.10 或之前的版本中,gnome-terminal 允许你在终端窗口中开启一个新标签或一个终端窗口。但从 Ubuntu 15.04开始,gnome-terminal 移除了“新标签”选项。这实际上并不是一个 bug,而是一个合并新标签和新窗口的举措。GNOME 3.12 引入了单独的“开启终端”选项。开启新终端标签的功能从终端菜单移动到了首选项中。

Linux:Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签
Linux:Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签

偏好设置中的开启新标签

要在 Ubuntu 15.04 的 gnome-terminal中开启新标签,选择“编辑” -> “首选项”,并把“开启新终端:窗口”改为“开启新终端:标签”。

Linux:Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签
Linux:Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签

如果现在你通过菜单开启新终端,就会显示在当前终端中的一个新标签页中。

Linux:Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签
Linux:Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签

通过键盘快捷键开启标签

如果你不想更改首选项,你可以按住 临时改变设置。比如,在默认情况下,在点击“新终端”的同时按住 ,终端就会在新标签中打开而不是开启新的终端。

另外,你还可以使用键盘快捷键 在终端中开启新标签。

在我看来,gnome-terminal 此番在 UI 上的改变并非一个进步。比如,你无法自定义终端中各个标签的标题了。当你在一个终端中打开了多个标签时,这个功能会很有用。而如果终端名称保持默认标题(并不断变长)时,你就不能在有限的标题空间里看见终端的标题了。希望能被尽早加入这个功能。


via: http://ask.xmodulo.com/open-multiple-tabs-gnome-terminal-ubuntu.html

作者:Dan Nanni 译者:KevSJ 校对:wxy

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

来源:https://linux.cn/article-5830-1.html

Linux:如何让 Linux 下非 root 用户程序使用小于 1024 端口

在 Linux 下,默认情况下1024 以下的端口是要在 root 下才能使用的,在其他用户下,如果尝试使用将会报错。在有的时候,我们可能考虑程序运行在 root 帐户下,但这可能会给 Linux 系统带来安全风险。那如何能够让非 root 用户运行的程序能够对外启用小于 1024 的端口呢?

本文尝试给出一些方法: 

Linux:如何让 Linux 下非 root 用户程序使用小于 1024 端口
Linux:如何让 Linux 下非 root 用户程序使用小于 1024 端口

(题图来自: wordpress.com)

第一种方法:SetUID

给用户的应用程序在执行位设置用户 ID 能够使程序可以以 root 权限来运行,这个方法让程序能够像在 root 下运行一样,不过需要非常小心,这种方法同样会带来安全风险,特别是当要执行的程序本身存在安全风险时。

使用的方法是:

chown root.root /path/to/application
#使用SetUID
chmod u+s /path/to/application

我们可以看到在系统下,/usr/bin/passwd这种文件,就使用了SetUID,使得每个系统能的用户都能用passwd来修改密码——这是要修改/etc/passwd的文件(而这个只有root有权限)。

既然要使用非root用户运行程序,目的就是要降低程序本身给系统带来的安全风险,因此,本方法使用的时候需要特别谨慎。

第二种方法:CAP_NET_BIND_SERVICE

从 2.1 版本开始,Linux 内核有了能力的概念,这使得普通用户也能够做只有超级用户才能完成的工作,这包括使用端口

获取CAP_NET_BIND_SERVICE能力,即使服务程序运行在非root帐户下,也能够banding到低端口。使用的方法:

# 设置CAP_NET_BIND_SERVICE
setcap cap_net_bind_service =+ep /path/to/application

Note:

1. 这个方法并不是所有Linux系统通适,内核在2.1之前的并没有提供,因此你需要检查要使用此方法所在系统是否支持;

2. 另外需要注意的是,如果要运行的程序文件是一个脚本,这个方法是没有办法正常工作的。

第三种方法:Port Forwarding

如果要运行的程序有权限监听其他端口,那么这个方法是可以使用的,首先让程序运行在非root帐户下,并绑定高于1024的端口,在确保能正常工作的时候,将低端口通过端口转发,将低端口转到高端口,从而实现非root运行的程序绑定低端口。要使用此方法可以使用下面的方式:

# Enable the IP FORWARD kernel parameter.
sysctl -w net.ipv4.ip_forward=1
# Use iptables rules to redirect packets
iptables -F -t nat
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to:8088

第一步使用sysctl确保启用IP FORWARD功能(此功能在Red Hat/CentOS默认是被禁用的),注意,代码中使用的sysctl设置是临时性设置,重启之后将会被重置,如果要长久保存,需要在/etc/sysctl.conf文件内修改:

# Default value is 0, need change to 1.
# net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

然后从文件中加载新的配置

# load new sysctl.conf
sysctl -p /etc/sysctl.conf
# or sysctl -p
# default filename is /etc/sysctl.conf

第二步就是使用iptables的规则来实现端口转发到程序所在的端口,示例中我们要将80端口转发到8088。

此种方法能够比较好的达到我们的目的,我们的程序可以通过非root用户来运行,并能够对外提供低端口号的服务。 

第四种方式:RINETD

这种方法使用的也是端口转发,此工具可以将本地端口映射到远程端口,但此功能对于我们当前的功能来说,有点鸡肋,毕竟我们新增了一个额外的程序,这将可能会增加我们系统的风险性。在此不做推荐。

(原文转载,有细节修改)

来源:http://blog.useasp.net/archive/2015/07/09/non-root-user-application-bind-to-ports-less-than-1024-without-root-access.aspx

Linux:画图解释 SQL join 语句

我认为 Ligaya Turmelle 的关于SQL联合(join)语句的帖子对于新手开发者来说是份很好的材料。SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看是很自然而然的。不过正如在她的帖子的回复中所说的,在测试中我发现韦恩图并不是十分的匹配SQL联合语法。

不过我还是喜欢这个观点,所以我们来看看能不能用上韦恩图。假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。

内联合(inner join)

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)

Linux:画图解释 SQL join 语句
Linux:画图解释 SQL join 语句

全外联合(full outer join)

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)

Linux:画图解释 SQL join 语句
Linux:画图解释 SQL join 语句

左外联合(left outer join)

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)

Linux:画图解释 SQL join 语句
Linux:画图解释 SQL join 语句

左外联合,然后用where语句排除一边我们不想要的记录

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
id  name       id     name
--  ----       --     ----
2   Monkey     null   null
4   Spaghetti  null   null

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)

Linux:画图解释 SQL join 语句
Linux:画图解释 SQL join 语句

全外联合,然后用where语句排除两边都不想要的记录

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
id    name       id    name
--    ----       --    ----
2     Monkey     null  null
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)

 

Linux:画图解释 SQL join 语句
Linux:画图解释 SQL join 语句

交叉联合(cross join)

还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:

SELECT * FROM TableA
CROSS JOIN TableB

这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。 

总结图

下图由 Moffatt 在 2008 年制作(点击可查看大图)。PS:Jeff Atwood 的文章写于 2007 年。

Linux:画图解释 SQL join 语句
Linux:画图解释 SQL join 语句

来源:http://blog.jobbole.com/40443/

Linux:CoreOS 在 PC 上快速安装上手

意义

能够以最快的速度安装部署Linux操作系统。安装快速简单,几乎不花时间就可以开始运行Docker。运行速度非常快。使用内存硬盘。

我的情况

win8 笔记本偶尔玩游戏,但是装Linux双系统可能需要我一天的时间来完成。我的所有业务都只需要在Docker中跑就可以了。而且我笔记本电脑内存够大16g (感谢HUST 姜老师)。

准备

  1. CoreOS image 下载地址
  2. EasyBCD 下载地址

开工

  1. 安装EasyBCD添加ISO引导项文件直接使用CoreOS的livecd image详细步骤带截图:http://jingyan.baidu.com/article/466506586ed309f549e5f81c.html
  2. 启动CoreOS完成CoreOS安装

更新

只需要给启动用的ISO文件更新即可。

缺点

  1. 不能持久化(带来的优点,玩坏了,直接重启即可)
  2. 整个操作系统都在硬盘中生成的文件直接占用硬盘空间(带来的优点,硬盘速度提升非常高)
  3. 每次开机手动挂载硬盘空间,手动运行整个系统的初始化脚本。

结合优缺点这里建议这套配置给有确定业务的工作来做还可以,如果业务比较多,可能需要优化的点比较多。

配置

  1. 在硬盘上开一个100g大小的空间,并格式化,参考命令:mkfs.ext4 /dev/sda2 ,然后挂载。如果您不明白如何分区格式化并且挂载,请看考这里。这篇文章可以说是我见过关于初级磁盘管理最好的一篇文章了。
  2. 挂载之后复制文件夹/var/lib/docker/ 到挂载的位置,再软连接回去。(然后docker images就可以持久化放到硬盘里面了重启不会丢失)。参考操作如下:
    cp -rf /var/lib/docker /mnt/
    rm -rf /var/lib/docker
    ln -s /mnt/docker /var/lib/docker

我的初始化文件参考

mkdir /root/.ssh
echo "ssh-rsa xxx..(省略)....xx Li-jianying@lijianyings-MacBook-Pro.local" > /root/.ssh/authorized_keys
rm -rf /var/lib/docker
ln -s /mnt/docker /var/lib/docker
#echo 'DOCKER_OPTS="--registry-mirror=http://XXXXX.m.daocloud.io"' >> /run/flannel_docker_opts.env
#systemctl daemon-reload
systemctl restart docker
# using disk

先导入rsakey,然后软连接到docker位置。

添加daocloud 加速(官方虽然没写CoreOS怎么加速,但是有大神给出了方法),因为我不加速比加速快,所以这里就先注释掉。作为备选方案。

systemd遇到的坑

如果docker中返回错误-1容器就会挂掉。但是systemd中还存在scope。

当启动问题容器会提示

Error response from daemon: Cannot start container test: [8] System error: Unit docker-e10eb86807cd9971fc03a8eee732771193d506ed2ba678fdf4292916a9fb072c.scope already exists.

那么

systemctl stop docker-e10eb86807cd9971fc03a8eee732771193d506ed2ba678fdf4292916a9fb072c.scope

就可以搞定。

CoreOS.iso 遇到的坑2

不断确认KnowHosts。

参考解决 https://github.com/lijianying10/FixLinux/blob/master/note/取消sshPublicKeyKnowHost认证.md

总结

用这种方法在PC中部署Linux实在是太方便了。熟悉Docker一套的这种想法可能20分钟就可以根据自己的情况搞定。我找到了这个思路之后经过各种权衡。

  1. 为了快速解决引导问题 用EasyBCD 直接引导内存ISO启动 换 折腾UEFI Grub的问题
  2. 为了减少配置环境带来的时间成本从普通安装到硬盘里面的发型版本 换 CoreOS
  3. 为了避免错误操作Or版本升级给系统带来的不稳定因素 换 Docker
  4. 在未来也许 换 RKT,RunC(希望大婶们快点填坑,RunC说这个月Release不知道会不会跳票)
  5. 注意本方案是不惜一切代价用最简洁的环境配置来换开发时间。完美主义喜欢折腾的小伙伴可能要绕行了。

来源:http://www.philo.top/2015/07/16/pc-docker/

Linux:Linux有问必答:如何为在Linux中安装兄弟牌打印机

提问: 我有一台兄弟牌HL-2270DW激光打印机,我想从我的Linux机器上打印文档。我该如何在我的电脑上安装合适的驱动并使用它?

兄弟牌以买得起的紧凑型激光打印机而闻名。你可以用低于200美元的价格得到高质量的WiFi/双工激光打印机,而且价格还在下降。最棒的是,它们还提供良好的Linux支持,因此你可以在Linux中下载并安装它们的打印机驱动。我在一年前买了台HL-2270DW,我对它的性能和可靠性都很满意。

下面是如何在Linux中安装和配置兄弟打印机驱动。本篇教程中,我会演示安装HL-2270DW激光打印机的USB驱动。

首先通过USB线连接你的打印机到Linux上。

准备

在准备阶段,进入兄弟官方支持网站,输入你的型号(比如:HL-2270DW)搜索你的兄弟打印机型号。

进入下面页面后,选择你的Linux平台。对于Debian、Ubuntu或者其他衍生版,选择“Linux (deb)”。对于Fedora、CentOS或者RHEL选择“Linux (rpm)”。

下一页,你会找到你打印机的LPR驱动和CUPS包装器驱动。前者是命令行驱动,后者允许你通过网页管理和配置你的打印机。尤其是基于CUPS的图形界面对(本地、远程)打印机维护非常有用。建议你安装这两个驱动。点击“Driver Install Tool”下载安装文件。

运行安装文件之前,你需要在64位的Linux系统上做另外一件事情。

因为兄弟打印机驱动是为32位的Linux系统开发的,因此你需要按照下面的方法安装32位的库。

在早期的Debian(6.0或者更早期)或者Ubuntu(11.04或者更早期),安装下面的包。

$ sudo apt-get install ia32-libs

对于已经引入多架构的新的Debian或者Ubuntu而言,你可以安装下面的包:

$ sudo apt-get install lib32z1 lib32ncurses5

上面的包代替了ia32-libs包。或者你只需要安装:

$ sudo apt-get install lib32stdc++6

如果你使用的是基于Red Hat的Linux,你可以安装:

$ sudo yum install glibc.i686

驱动安装

现在解压下载的驱动文件。

$ gunzip linux-brprinter-installer-2.0.0-1.gz

接下来像下面这样运行安装文件。

$ sudo sh ./linux-brprinter-installer-2.0.0-1

你会被要求输入打印机的型号。输入你打印机的型号,比如“HL-2270DW”。

同意GPL协议之后,接受接下来的任何默认问题。

现在LPR/CUPS打印机驱动已经安装好了。接下来要配置你的打印机了。

打印机配置

我接下来就要通过基于CUPS的网页管理和配置兄弟打印机了。

首先验证CUPS守护进程已经启动。

$ sudo netstat -nap | grep 631

打开一个浏览器输入 http://localhost:631 。你会看到下面的打印机管理界面。

进入“Administration”选项卡,点击打印机选项下的“Manage Printers”。

你一定在下面的页面中看到了你的打印机(HL-2270DW)。点击打印机名。

在下拉菜单“Administration”中,选择“Set As Server Default”。这会设置你的打印机位系统默认打印机。

当被要求验证时,输入你的Linux登录信息。

现在基础配置已经基本完成了。为了测试打印,打开任何文档浏览程序(比如:PDF浏览器)并打印。你会看到“HL-2270DW”被列出并被作为默认的打印机设置。

打印机应该可以工作了。你可以通过CUPS的网页看到打印机状态和管理打印机任务。


via: http://ask.xmodulo.com/install-brother-printer-linux.html

作者:Dan Nanni 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5844-1.html

Linux:如何在 Fedora 22 上面配置 Apache 的 Docker 容器

在这篇文章中,我们将会学习关于Docker的一些知识,如何使用Docker部署Apache httpd服务,并且共享到Docker Hub上面去。首先,我们学习怎样拉取和使用Docker Hub里面的镜像,然后在一个Fedora 22的镜像上交互式地安装Apache,之后我们将会学习如何用一个Dockerfile文件来以一种更快,更优雅的方式制作一个镜像。最后,我们将我们创建的镜像发布到Docker Hub上,这样以后任何人都可以下载并使用它。

安装并初体验Docker

要求

运行Docker,你至少需要满足这些:

  • 你需要一个64位的内核,版本3.10或者更高
  • Iptables 1.4 – Docker会用它来做网络配置,如网络地址转换(NAT)
  • Git 1.7 – Docker会使用Git来与仓库交流,如Docker Hub
  • ps – 在大多数环境中这个工具都存在,在procps包里有提供
  • root – 尽管一般用户可以通过TCP或者其他方式来运行Docker,但是为了简化,我们会假定你就是root

使用dnf安装docker

以下的命令会安装Docker

dnf update && dnf install docker

注意:在Fedora 22里,你仍然可以使用Yum命令,但是它被DNF取代了,而且在纯净安装时不可用了。

检查安装

我们将要使用的第一个命令是docker info,这会输出很多信息给你:

docker info

也可以试着用docker version

docker version

以守护进程方式启动Dcoker

你应该启动一个docker实例,然后她会处理我们的请求。

docker -d

现在我们设置 docker 随系统启动,以便我们不需要每次重启都需要运行上述命令。

chkconfig docker on

让我们用Busybox来打印hello world:

dockr run -t busybox /bin/echo "hello world"

这个命令里,我们告诉Docker在Busybox镜像的一个实例/容器里执行 /bin/echo “hello world”。Busybox是一个小型的POSIX环境,将许多小工具都结合到了一个单独的可执行程序里。

如果Docker不能在你的系统里找到本地的Busybox镜像,她就会自动从Docker Hub里拉取镜像,正如你可以看下如下的快照:

Hello world with Busybox

Hello world with Busybox

再次尝试相同的命令,这次由于Docker已经有了本地的Busybox镜像,你将会看到的全部就是echo的输出:

docker run -t busybox /bin/echo "hello world"

也可以尝试以下的命令进入到容器环境里去:

docker run -it busybox /bin/sh

使用exit命令可以离开容器并停止它

交互式地Docker化Apache

拉取/下载 Fedora 镜像:

docker pull fedora:22

启动一个容器在后台运行:

docker run -d -t fedora:22 /bin/bash

列出正在运行地容器及其名字标识,如下

docker ps

listing with docker ps and attaching with docker attach

使用docker ps列出,并使用docker attach进入一个容器里

angry_noble是docker分配给我们容器的名字,所以我们来连接上去:

docker attach angry_noble

注意:每次你启动一个容器,就会被给与一个新的名字,如果你的容器需要一个固定的名字,你应该在 docker run 命令里使用 -name 参数。

安装Apache

下面的命令会更新DNF的数据库,下载安装Apache(httpd包)并清理dnf缓存使镜像尽量小

dnf -y update && dnf -y install httpd && dnf -y clean all

配置Apache

我们需要修改httpd.conf的唯一地方就是ServerName,这会使Apache停止抱怨

sed -i.orig 's/#ServerName/ServerName/' /etc/httpd/conf/httpd.conf

设定环境

为了使Apache运行为独立模式,你必须以环境变量的格式提供一些信息,并且你也需要创建这些变量里的目录,所以我们将会用一个小的shell脚本干这个工作,当然也会启动Apache

vi /etc/httpd/run_apache_foreground

#!/bin/bash
#设置环境变量
APACHE_LOG_DI=R"/var/log/httpd"
APACHE_LOCK_DIR="/var/lock/httpd"
APACHE_RUN_USER="apache"
APACHE_RUN_GROUP="apache"
APACHE_PID_FILE="/var/run/httpd/httpd.pid"
APACHE_RUN_DIR="/var/run/httpd"
#如果需要的话,创建目录
if ! [ -d /var/run/httpd ]; then mkdir /var/run/httpd;fi
if ! [ -d /var/log/httpd ]; then mkdir /var/log/httpd;fi
if ! [ -d /var/lock/httpd ]; then mkdir /var/lock/httpd;fi
#运行 Apache
httpd -D FOREGROUND

另外地,你可以粘贴这个片段代码到容器shell里并运行:

dnf -y install git && git clone https://github.com/gaiada/run-apache-foreground.git && cd run-apach* && ./install && dnf erase git

上面的内嵌脚本会安装Git,克隆这个仓库,到文件里去运行脚本,并询问你是否卸载Git。

保存你的容器状态

你的容器现在准备好运行Apache,是时候保存容器当前的状态为一个镜像,以备你需要的时候使用。

为了离开容器环境,你必须顺序按下 Ctrl+qCtrl+p,如果你仅仅在shell执行exit,你同时也会停止容器,失去目前为止你做过的所有工作。

回到Docker主机,使用 docker commit 及容器名和你想要的仓库名字/标签:

docker commit angry_noble gaiada/apache

现在,你保存了容器的状态到一个镜像里,可以使用 docker stop 停止容器了:

docker stop angry_noble

运行并测试你的镜像

最后,从你的新镜像启动一个容器,并且重定向80端口到该容器:

docker run -p 80:80 -d -t gaiada/apache /etc/httpd/run_apache_foreground

到目前,你正在你的容器里运行Apache,打开你的浏览器访问该服务,在http://localhost,你将会看到如下Apache默认的页面

Apache default page running from Docker container

在容器里运行的Apache默认页面

使用Dockerfile Docker化Apache

现在,我们将要去创建一个新的Apache镜像,这次所有步骤会写在一个Dockerfile文件里,文件将会被用于生成该镜像。

首先,新建一个目录,在里面放Dockerfile文件,并进入该目录:

mkdir apachedf; cd apachedf

然后创建一个名为Dockerfile的文件,添加以下内容:

FROM fedora:22
MAINTAINER Carlos Alberto
LABEL version="0.1"
RUN dnf -y update && dnf -y install httpd && dnf -y clean all
RUN [ -d /var/log/httpd ] || mkdir /var/log/httpd
RUN [ -d /var/run/httpd ] || mkdir /var/run/httpd
RUN [ -d /var/lock/httpd ] || mkdir /var/lock/httpd
RUN sed -i.orig 's/#ServerName/ServerName/' /etc/httpd/conf/httpd.conf
ENV APACHE_RUN_USER apache
ENV APACHE_RUN_GROUP apache
ENV APACHE_LOG_DIR /var/log/httpd
ENV APACHE_LOCK_DIR /var/lock/httpd
ENV APACHE_RUN_DIR /var/run/httpd
ENV APACHE_PID_FILE /var/run/httpd/httpd.pid
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

我们一起来看看Dockerfile里面有什么:

  • FROM – 这告诉docker,我们将要使用Fedora 22作为基础镜像
  • MAINTAINERLABLE – 这些命令对镜像没有直接作用,属于标记信息
  • RUN – 自动完成我们之前交互式做的工作,安装Apache,新建目录并编辑httpd.conf
  • ENV – 设置环境变量,现在我们再不需要runapacheforeground脚本
  • EXPOSE – 暴露80端口给外网
  • CMD – 设置默认的命令启动httpd服务,这样我们就不需要每次起一个新的容器都重复这个工作

建立该镜像

现在,我们将要建立这个镜像,并为其添加tag gaiada/apachedf

docker build -t gaiada/apachedf:0.1 .

docker build complete

docker完成创建

使用 docker images 列出本地镜像,查看是否存在你新建的镜像:

docker images

然后运行新的镜像:

docker run -t -p 80:80 gaiada/apachedf

这就是Dockerfile的工作,使用这项功能会使得事情更加容易,快速并且可重复生成。

发布你的镜像

直到现在,你仅仅是从Docker Hub拉取了镜像,但是你也可以推送你的镜像,以后需要也可以再次拉取他们。实际上,其他人也可以下载你的镜像,在他们的系统中使用它而不需要改变任何东西。现在我们将要学习如何使我们的镜像对世界上的其他人可用。

创建帐号

为了能够在Docker Hub上推送你的镜像,你需要创建一个帐号。访问 https://hub.docker.com/account/signup/,填写下面的表格:

Docker Hub signup page

Docker Hub 注册页面

登录

输入下面的命令,接着输入你注册时提供的用户名,密码和邮箱

docker login

第一次登录过后,你的帐号信息会被记录在 ~/.dockercfg

推送

推送镜像,使用 docker push [registry/]yourlogin/repositoryname[:tag]

docker push docker.io/gaiada/apachedf

你可能会看见像这样的输出,在你的控制台上:

Docker push Apache image complete

Docker推送Apache镜像完成

结论

现在,你知道如何Docker化Apache,试一试包含其他一些组件,Perl,PHP,proxy,HTTPS,或者任何你需要的东西。我希望你们这些家伙喜欢她,并推送你们自己的镜像到Docker Hub。


via: http://linoxide.com/linux-how-to/configure-apache-containers-docker-fedora-22/

作者:Carlos Alberto 译者:wi-cuckoo 校对:wxy

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

来源:https://linux.cn/article-5845-1.html