Skip to content Skip to main navigation Skip to footer

Linux

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

12. 安装 Apache Tomcat

Tomcat 是由 Apache 设计的用来运行 Java HTTP web 服务器的 servlet 容器。按照下面的方法安装 tomcat,但需要指出的是安装 tomcat 之前必须先安装 Java。

# yum install tomcat
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

安装 Apache Tomcat

安装完 tomcat 之后,启动 tomcat 服务。

# systemctl start tomcat

查看 tomcat 版本。

# /usr/sbin/tomcat version
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

查看 tomcat 版本

允许 tomcat 服务和默认端口(8080) 通过防火墙并重新加载设置。

# firewall-cmd –zone=public –add-port=8080/tcp --permanent
# firewall-cmd –reload

现在该保护 tomcat 服务器了,添加一个用于访问和管理的用户和密码。我们需要编辑文件 ‘/etc/tomcat/tomcat-users.xml’。查看类似下面的部分:


....

 
 
 
 
 
 
 

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

保护 Tomcat

我们在这里添加用户 “tecmint” 到 tomcat 的管理员/管理组中,使用 “tecmint” 作为密码。先停止再启动 tomcat 服务以使更改生效,并添加 tomcat 服务到随系统启动。

# systemctl stop tomcat
# systemctl start tomcat
# systemctl enable tomcat.service

请阅读: 在 RHEL/CentOS 7.0/6.x 中安装和配置 Apache Tomcat 8.0.9

13. 安装 Nmap 监视开放端口

Nmap 网络映射器用来分析网络,通过运行它可以发现网络的映射关系。nmap 并没有默认安装,你需要从库中安装它。

# yum install nmap
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

安装 Nmap 监视工具

列出主机中所有的开放端口以及对应使用它们的服务。

# namp 127.0.01

!监视开放端口](http://www.tecmint.com/wp-content/uploads/2015/04/Monitor-Open-Ports.jpeg)

监视开放端口

你也可以使用 firewall-cmd 列出所有端口,但我发现 nmap 更有用。

# firewall-cmd –list-ports
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

在防火墙中检查开放端口

请阅读: Nmap 监视开放端口的 29 个有用命令

14. 配置 FirewallD

firewalld 是动态管理服务器的防火墙服务。在 CentOS 7 中 Firewalld 移除了 iptables 服务。在红帽企业版 Linux 和它的衍生版中默认安装了 Firewalld。如果有 iptables 的话为了使每个更改生效需要清空所有旧的规则然后创建新规则。

然而用firewalld,不需要清空并重新创建新规则就可以实现更改生效。

检查 Firewalld 是否运行。

# systemctl status firewalld
或
# firewall-cmd –state
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

检查 Firewalld 状态

获取所有的区域列表。

# firewall-cmd --get-zones
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

检查 Firewalld 区域

在切换之前先获取区域的详细信息。

# firewall-cmd --zone=work --list-all
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

检查区域详情

获取默认区域。

# firewall-cmd --get-default-zone
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

Firewalld 默认区域

切换到另一个区域,比如 ‘work’。

# firewall-cmd --set-default-zone=work
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

切换 Firewalld 区域

列出区域中的所有服务。

# firewall-cmd --list-services
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

列出 Firewalld 区域的服务

添加临时服务,比如 http,然后重载 firewalld。

# firewall-cmd  --add-service=http
# firewall-cmd –reload
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

添加临时 http 服务

添加永久服务,比如 http,然后重载 firewalld。

# firewall-cmd --add-service=http --permanent
# firewall-cmd --reload

 

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

添加永久 http 服务

删除临时服务,比如 http。

# firewall-cmd  --remove-service=http
# firewall-cmd --reload
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

删除临时 Firewalld 服务

删除永久服务,比如 http

# firewall-cmd --zone=work --remove-service=http --permanent
# firewall-cmd --reload
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

删除永久服务

允许一个临时端口(比如 331)。

# firewall-cmd --add-port=331/tcp
# firewall-cmd --reload
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

打开临时端口

允许一个永久端口(比如 331)。

# firewall-cmd --add-port=331/tcp --permanent
# firewall-cmd --reload
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

打开永久端口

阻塞/移除临时端口(比如 331)。

# firewall-cmd --remove-port=331/tcp
# firewall-cmd --reload
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

移除临时端口

阻塞/移除永久端口(比如 331)。

# firewall-cmd --remove-port=331/tcp --permanent
# firewall-cmd --reload
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

移除永久端口

停用 firewalld。

# systemctl stop firewalld
# systemctl disable firewalld
# firewall-cmd --state
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

停用 Firewalld 服务

启用 firewalld。

# systemctl enable firewalld
# systemctl start firewalld
# firewall-cmd --state
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

启用 Firewalld

15. 安装 Wget

Wget 是从 web 服务器获取(下载)内容的命令行工具。它是你使用 wget 命令获取 web 内容或下载任何文件必须要有的重要工具。

# yum install wget
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

安装 Wget 工具

关于在终端中如何使用 wget 命令下载文件的方法和实际例子,请阅读10 个 Wget 命令例子

16. 安装 Telnet 客户端

Telnet 是通过 TCP/IP 允许用户登录到相同网络上的另一台计算机的网络协议。和远程计算机的连接建立后,它就成为了一个允许你在自己的计算机上用所有提供给你的权限和远程主机交互的虚拟终端。(LCTT 译注:除非你真的需要,不要安装 telnet 服务,也不要用 telnet 客户端连接另外一个 telnet 服务,因为 telnet 是明文传输的。不过如下用 telnet 客户端检测另外一个服务的端口是否工作是常用的操作。)

Telnet 对于检查远程计算机或主机的监听端口也非常有用。

# yum install telnet
# telnet google.com 80
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)

Telnet 端口检查


via: http://www.tecmint.com/things-to-do-after-minimal-rhel-centos-7-installation/3/

作者:Avishek Kumar 译者:ictlyh 校对:校对者ID

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

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

Linux:10 个‘ls’命令面试的问题(二)

这是关于文件列表命令的第二篇文章,继续探讨‘ls’命令的其他方面。该系列的第一篇文章受到了社区的高度关注,如果你错过了该系列的第一部分,可以访问以下地址:

这篇文章通过样例来很好地展现‘ls’命令的深入应用,我们加倍小心地来写这篇文章来保持其简洁可理解性,同时又能提供最全面的服务。

Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

10 ‘ls’ 命令面试的问题

16. 假如你想要以长列表的形式列出目录中的内容,但是不打印文件创建者名称以及文件所属组。看看输出有何不同之处。

a. ls 命令在与‘-l’选项一起使用时会将文件以长列表格式输出。

# ls -l
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

以长格式列出文件

b. ls 命令在与‘-l’和‘–author’一起使用时,会将文件以长列表格式输出并带有文件创建者的名称信息。

# ls -l --author
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

列出文件的创建者

c. ls 命令在与‘-g’选项 一起将会列出文件名但是不带属主名称。

# ls -g
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

列出文件但不列出属主

d. ls 命令在与’-G’和‘-l’选项一起将会使用长列表格式列出文件名称但是不带文件所属组名称。

# ls -Gl
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

列出文件但是不列出所属组

17. 使用易读格式打印出当前目录中的文件以及文件夹的大小,你会如何做?

这里我们需要使用’-h’选项(人类可阅读的、易读的)同‘-l’或‘-s’选项与ls命令一起使用来得到想要的输出。

# ls -hl
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

以易读格式的长列表列出文件

# ls -hs
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

以易读格式的短列表列出文件

注意: ‘-h’选项使用1024(计算机中的标准)的幂,文件或文件夹的大小分别以K,M和G作为输出单位。

18. 既然‘-h’选项是使用1024的幂作为标准来输出大小,那么ls命令是否还支持其他的幂值呢?

存在一个选项 ‘–si’与选项‘-h’相似,不同之处在于前者以使用1000的幂,后者使用1024的幂。

# ls --si

所以’–si’也可以与‘-l’选项一起使用来按照1000的幂来输出文件夹的大小,并且以长列表格式显示。

# ls --si -l

(LCTT 译注:此处原文参数有误,附图也不对,因此删除之。–si 参数是双连线参数,而且有的版本的 ls 并不支持该参数)

19. 假如要你使用逗号‘,’作为分隔符来打印一个目录中的内容,可以吗? 对于长列表形式也可行吗?

当然!linux的ls命令当与其选项‘-m’一起使用时可以在打印目录内容时以逗号‘,’分割。由于逗号分割的内容是水平填充的,ls命令不能在垂直列出内容时使用逗号来分割内容。

# ls -m
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

以逗号分隔显示内容

当使用长列表格式时,‘-m’选项就没有什么效果了。

# ls -ml
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

长列表不能使用逗号分隔列表

20. 有办法将目录的内容逆序打印出来吗?

可以!上面的情形可以轻松地通过’-r’选项搞定,该选项将输出顺序倒置。这个选项也可以与‘-l’选项一起使用。

# ls -r
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

逆序列出

# ls -rl
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

逆序长列表

21. 如果你被分配一个任务,来递归地打印各个子目录,你会如何应付?注意,只针对子目录而不是文件哦。

小意思!使用“-R”选项就可以轻轻松松拿下,它也可以更进一步地与其他选项如‘-l’和‘-m’选项等组合使用。

# ls -R
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

递归列出子目录

22. 如何按照文件大小对其进行排序?

linux命令行选项’-S’赋予了ls命令这个超能力。按照文件大小从大到小的顺序排序:

# ls -S

Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)
按文件大小排序

按照文件大小从小到大的顺序排序。

# ls -Sr
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

从小到大的排序

23. 按照一行一个文件列出目录中的内容,并且不带额外信息的方式

选项‘-1’在此可以解决这个问题,使用‘-1’选项来使用ls命令可以将目录中的内容按照一行一个文件并且不带额外信息的方式进行输出。

# ls -1
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

不带其他信息,一行一个列出文件

24. 现在委派给你一个任务,你必须将目录中的内容输出到终端而且需要使用双引号引起来,你会如何做?

有一个选项‘-Q’会将ls命令的输出内容用双引号引起来。

# ls -Q
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

输出的文件名用引号引起来

25. 想象一下你正在与一个包含有很多文件和文件夹的目录打交道,你需要使目录名显示在文件名之前,你如何做?

# ls --group-directories-first
Linux:10 个‘ls’命令面试的问题(二)
Linux:10 个‘ls’命令面试的问题(二)

目录优先显示

先点到为止,我们会马上提供该系列文章的下一部分。别换频道,关注我们。 另外别忘了在下面的评论中提出你们宝贵的反馈信息,喜欢就分享,帮助我们得到更好的传播吧!


via: http://www.tecmint.com/ls-interview-questions/

作者:Ravi Saive 译者:theo-l 校对:wxy

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

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

Linux:在 Linux 中以交互方式实时查看Apache web访问统计

无论你是在网站托管业务,还是在自己的VPS上运行几个网站,你总会有需要显示访客统计信息,例如前几的访客、访问请求的文件(无论动态或者静态)、所用的带宽、客户端的浏览器,和访问的来源网站,等等。

GoAccess 是一款用于Apache或者Nginx的命令行日志分析器和交互式查看器。使用这款工具,你不仅可以浏览到之前提及的相关数据,还可以通过分析网站服务器日志来进一步挖掘数据 – 而且这一切都是在一个终端窗口实时输出的。由于今天的大多数web服务器都使用Debian的衍生版或者基于RedHat的发行版来作为底层操作系统,所以本文中我告诉你如何在Debian和CentOS中安装和使用GoAccess。

Linux:在 Linux 中以交互方式实时查看Apache web访问统计
Linux:在 Linux 中以交互方式实时查看Apache web访问统计

在Linux系统安装GoAccess

在Debian,Ubuntu及其衍生版本,运行以下命令来安装GoAccess:

# aptitude install goaccess

在CentOS中,你将需要使你的EPEL 仓库可用然后执行以下命令:

# yum install goaccess

在Fedora,同样使用yum命令:

# yum install goaccess

如果你想从源码安装GoAccess来使用更多功能(例如 GeoIP 定位功能),需要在你的操作系统安装必需的依赖包,然后按以下步骤进行:

# wget http://tar.goaccess.io/goaccess-0.8.5.tar.gz
# tar -xzvf goaccess-0.8.5.tar.gz
# cd goaccess-0.8.5/
# ./configure --enable-geoip
# make
# make install

以上安装的版本是 0.8.5,但是你也可以在该软件的网站下载页确认是否是最新版本。

由于GoAccess不需要后续的配置,一旦安装你就可以马上使用。

运行 GoAccess

开始使用GoAccess,只需要对它指定你的Apache访问日志。

对于Debian及其衍生版本:

# goaccess -f /var/log/apache2/access.log

基于红帽的发行版:

# goaccess -f /var/log/httpd/access_log

当你第一次启动GoAccess,你将会看到如下的屏幕中选择日期和日志格式。正如前面所述,你可以按空格键进行选择,并按F10确认。至于日期和日志格式,你可能需要参考Apache 文档来刷新你的记忆。

在这个例子中,选择常见日志格式(Common Log Format(CLF)):

Linux:在 Linux 中以交互方式实时查看Apache web访问统计
Linux:在 Linux 中以交互方式实时查看Apache web访问统计

然后按F10 确认。你将会从屏幕上看到统计数据。为了简洁起见,这里只显示了首部,也就是日志文件的摘要,如下图所示:

通过 GoAccess来浏览网站服务器统计数据

你可以按向下的箭头滚动页面,你会发现以下区域,它们是按请求排序的。这里提及的目录顺序可能会根据你的发行版或者你所选的安装方式(从源和库)不同而不同:

  1. 每天唯一访客(来自同样IP、同一日期和同一浏览器的请求被认为是是唯一访问)

  2. 请求的文件(网页URL)

  3. 请求的静态文件(例如,.png文件,.js文件等等)

  4. 来源的URLs(每一个URL请求的出处)

  5. HTTP 404 未找到的响应代码

    Linux:在 Linux 中以交互方式实时查看Apache web访问统计
    Linux:在 Linux 中以交互方式实时查看Apache web访问统计
  6. 操作系统

  7. 浏览器

  8. 主机地址(客户端IP地址)

  9. HTTP 状态代码

  10. 前几位的来源站点

  11. 来自谷歌搜索引擎的前几位的关键字

如果你想要检查已经存档的日志,你可以通过管道将它们发送给GoAccess,如下:

在Debian及其衍生版本:

# zcat -f /var/log/apache2/access.log* | goaccess

在基于红帽的发行版:

# cat /var/log/httpd/access* | goaccess

如果你需要上述部分的详细报告(1至11项),直接按下其序号再按O(大写o),就可以显示出你需要的详细视图。下面的图像显示5-O的输出(先按5,再按O)

Linux:在 Linux 中以交互方式实时查看Apache web访问统计
Linux:在 Linux 中以交互方式实时查看Apache web访问统计

如果要显示GeoIP位置信息,打开主机部分的详细视图,如前面所述,你将会看到正在请求你的服务器的客户端IP地址所在的位置。

Linux:在 Linux 中以交互方式实时查看Apache web访问统计
Linux:在 Linux 中以交互方式实时查看Apache web访问统计

如果你的系统还不是很忙碌,以上提及的章节将不会显示大量的信息,但是这种情形可以通过在你网站服务器越来越多的请求发生改变。

保存用于离线分析的报告

有时候你不想每次都实时去检查你的系统状态,可以保存一份在线的分析文件或打印出来。要生成一个HTML报告,只需要通过之前提到GoAccess命令,将输出来重定向到一个HTML文件即可。然后,用web浏览器来将这份报告打开即可。

# zcat -f /var/log/apache2/access.log* | goaccess > /var/www/webserverstats.html

一旦报告生成,你将需要点击展开的链接来显示每个类别详细的视图信息:

Linux:在 Linux 中以交互方式实时查看Apache web访问统计
Linux:在 Linux 中以交互方式实时查看Apache web访问统计

可以查看youtube视频:https://youtu.be/UVbLuaOpYdg

正如我们通过这篇文章讨论,GoAccess是一个非常有价值的工具,它能给系统管理员实时提供可视的HTTP 统计分析。虽然GoAccess的默认输出是标准输出,但是你也可以将他们保存到JSON,HTML或者CSV文件。这种转换可以让 GoAccess在监控和显示网站服务器的统计数据时更有用。


via: http://xmodulo.com/interactive-apache-web-server-log-analyzer-linux.html

作者:Gabriel Cánepa 译者:disylee 校对:wxy

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

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

Linux:微博“异地多活”部署经验谈

异地多活的好处阿里巴巴的同学已经充分阐述,微博的初始出发点包括异地灾备、提升南方电信用户访问速度、提升海外用户访问速度、降低部署成本(北京机房机架费太贵了)等。通过实践,我们发现优势还包括异地容灾、动态加速、流量均衡、在线压测等,而挑战包括增加研发复杂度、增加存储成本等。

Linux:微博“异地多活”部署经验谈
Linux:微博“异地多活”部署经验谈

(题图来自:jimijones.com)

微博外部历程

先说说微博外部的历程,整个过程可谓是一波多折。微博的主要机房都集中在北京,只有很小一部分业务在广州部署,2010年10月,因微博高速发展,所以准备扩大广州机房服务器规模,并对微博做异地双活部署。

第一版跨机房消息同步方案采取的是基于自研的MytriggerQ(借助MySQL从库的触发器将INSERT、UPDATE、DELETE等事件转为消息)的方案,这个方案的好处是,跨机房的消息同步是通过MySQL的主从完成的,方案成熟度高。而缺点则是,微博同一个业务会有好几张表,而每张表的信息又不全,这样每发一条微博会有多条消息先后到达,这样导致有较多时序问题,缓存容易花。

第一套方案未能成功,但也让我们认识到跨机房消息同步的核心问题,并促使我们全面下线MytriggerQ的消息同步方案,而改用基于业务写消息到MCQ(MemcacheQ,新浪自研的一套消息队列,类MC协议)的解决方案。

Linux:微博“异地多活”部署经验谈
Linux:微博“异地多活”部署经验谈

2011年底在微博平台化完成后,开始启用基于MCQ的跨机房消息同步方案,并开发出跨机房消息同步组件WMB(Weibo Message Broker)。经过与微博PC端等部门同学的共同努力,终于在2012年5月完成Weibo.com在广州机房的上线,实现了“异地双活”。

由于广州机房总体的机器规模较小,为了提升微博核心系统容灾能力,2013年年中我们又将北京的机房进行拆分,至此微博平台实现了异地三节点的部署模式。依托于此模式,微博具备了在线容量评估、分级上线、快速流量均衡等能力,应对极端峰值能力和应对故障能力大大提升,之后历次元旦、春晚峰值均顺利应对,日常上线导致的故障也大大减少。上线后,根据微博运营情况及成本的需要,也曾数次调整各个机房的服务器规模,但是整套技术上已经基本成熟。

异地多活面临的挑战

根据微博的实践,一般做异地多活都会遇到如下的问题:

  • 机房之间的延时:微博北京的两个核心机房间延时在1ms左右,但北京机房到广州机房则有近40ms的延时。对比一下,微博核心Feed接口的总平均耗时也就在120ms左右。微博Feed会依赖几十个服务上百个资源,如果都跨机房请求,性能将会惨不忍睹;
  • 专线问题:为了做广州机房外部,微博租了两条北京到广州的专线,成本巨大。同时单条专线的稳定性也很难保障,基本上每个月都会有或大或小的问题;
  • 数据同步问题:MySQL如何做数据同步?HBase如何做数据同步?还有各种自研的组件,这些统统要做多机房数据同步。几十毫秒的延时,加上路途遥远导致的较弱网络质量(我们的专线每个月都会有或大或小的问题),数据同步是非常大的挑战;
  • 依赖服务部署问题:如同阿里巴巴目前只做了交易单元的“异地双活”,微博部署时也面临核心服务过多依赖小服务的问题。将小服务全部部署,改造成本、维护成本过大,不部署则会遇到之前提到的机房之间延时导致整体性能无法接受的问题;
  • 配套体系问题:只是服务部署没有流量引入就不能称为“双活”,而要引入流量就要求配套的服务和流程都能支持异地部署,包括预览、发布、测试、监控、降级等都要进行相应改造。

微博异地多活解决方案

由于几十毫秒的延时,跨机房服务调用性能很差,异地多活部署的主体服务必须要做数据的冗余存储,并辅以缓存等构成一套独立而相对完整的服务。数据同步有很多层面,包括消息层面、缓存层面、数据库层面,每一个层面都可以做数据同步。由于基于MytriggerQ的方案的失败,微博后来采取的是基于MCQ的WMB消息同步方案,并通过消息对缓存更新,加上微博缓存高可用架构,可以做到即便数据库同步有问题,从用户体验看服务还是正常的。

这套方案中,每个机房的缓存是完全独立的,由每个机房的Processor(专门负责消息处理的程序,类Storm)根据收到的消息进行缓存更新。由于消息不会重复分发,而且信息完备,所以MytriggerQ方案存在的缓存更新脏数据问题就解决了。而当缓存不存在时,会穿透到MySQL从库,然后进行回种。可能出现的问题是,缓存穿透,但是MySQL从库如果此时出现延迟,这样就会把脏数据种到缓存中。我们的解决方案是做一个延时10分钟的消息队列,然后由一个处理程序来根据这个消息做数据的重新载入。一般从库延时时间不超过10分钟,而10分钟内的脏数据在微博的业务场景下也是可以接受的。

微博的异地多活方案如下图(三个节点类似,消息同步都是通过WMB):

Linux:微博“异地多活”部署经验谈
Linux:微博“异地多活”部署经验谈

跟阿里巴巴遇到的问题类似,我们也遇到了数据库同步的问题。由于微博对数据库不是强依赖,加上数据库双写的维护成本过大,我们选择的方案是数据库通过主从同步的方式进行。这套方案可能的缺点是如果主从同步慢,并且缓存穿透,这时可能会出现脏数据。这种同步方式已运行了三年,整体上非常稳定,没有发生因为数据同步而导致的服务故障。从2013年开始,微博启用HBase做在线业务的存储解决方案,由于HBase本身不支持多机房部署,加上早期HBase的业务比较小,且有单独接口可以回调北京机房,所以没有做异地部署。到今年由于HBase支撑的对象库服务已经成为微博非常核心的基础服务,我们也在规划HBase的异地部署方案,主要的思路跟MySQL的方案类似,同步也在考虑基于MCQ同步的双机房HBase独立部署方案。

阿里巴巴选择了单元化的解决方案,这套方案的优势是将用户分区,然后所有这个用户相关的数据都在一个单元里。通过这套方案,可以较好的控制成本。但缺点是除了主维度(阿里巴巴是买家维度),其他所有的数据还是要做跨机房同步,整体的复杂度基本没降低。另外就是数据分离后由于拆成了至少两份数据,数据查询、扩展、问题处理等成本均会增加较多。总的来讲,个人认为这套方案更适用于WhatsApp、Instagram等国外业务相对简单的应用,而不适用于国内功能繁杂、依赖众多的应用。

数据同步问题解决之后,紧接着就要解决依赖服务部署的问题。由于微博平台对外提供的都是Restful风格的API接口,所以独立业务的接口可以直接通过专线引流回北京机房。但是对于微博Feed接口的依赖服务,直接引流回北京机房会将平均处理时间从百毫秒的量级直接升至几秒的量级,这对服务是无法接受的。所以,在2012年我们对微博Feed依赖的主要服务也做了异地多活部署,整体的处理时间终于降了下来。当然这不是最优的解决方案,但在当时微博业务体系还相对简单的情况下,很好地解决了问题,确保了2012年5月的广州机房部署任务的达成。

而配套体系的问题,技术上不是很复杂,但是操作时却很容易出问题。比如,微博刚开始做异地多活部署时,测试同学没有在上线时对广州机房做预览测试,曾经导致过一些线上问题。配套体系需要覆盖整个业务研发周期,包括方案设计阶段的是否要做多机房部署、部署阶段的数据同步、发布预览、发布工具支持、监控覆盖支持、降级工具支持、流量迁移工具支持等方方面面,并需开发、测试、运维都参与进来,将关键点纳入到流程当中。

关于为应对故障而进行数据冗余的问题,阿里巴巴的同学也做了充分的阐述,在此也补充一下我们的一些经验。微博核心池容量冗余分两个层面来做,前端Web层冗余同用户规模成正比,并预留日常峰值50%左右的冗余度,而后端缓存等资源由于相对成本较低,每个机房均按照整体两倍的规模进行冗余。这样如果某一个机房不可用,首先我们后端的资源是足够的。接着我们首先会只将核心接口进行迁移,这个操作分钟级即可完成,同时由于冗余是按照整体的50%,所以即使所有的核心接口流量全部迁移过来也能支撑住。接下来,我们会把其他服务池的前端机也改为部署核心池前端机,这样在一小时内即可实现整体流量的承接。同时,如果故障机房是负责数据落地的机房,DBA会将从库升为主库,运维调整队列机开关配置,承接数据落地功能。而在整个过程中,由于我们核心缓存可以脱离数据库支撑一个小时左右,所以服务整体会保持平稳。

异地多活最好的姿势

以上介绍了一下微博在异地多活方面的实践和心得,也对比了一下阿里巴巴的解决方案。就像没有完美的通用架构一样,异地多活的最佳方案也要因业务情形而定。如果业务请求量比较小,则根本没有必要做异地多活,数据库冷备足够了。不管哪种方案,异地多活的资源成本、开发成本相比与单机房部署模式,都会大大增加。

以下是方案选型时需要考虑的一些维度:

  • 能否整业务迁移:如果机器资源不足,建议优先将一些体系独立的服务整体迁移,这样可以为核心服务节省出大量的机架资源。如果这样之后,机架资源仍然不足,再做异地多活部署。
  • 服务关联是否复杂:如果服务关联比较简单,则单元化、基于跨机房消息同步的解决方案都可以采用。不管哪种方式,关联的服务也都要做异地多活部署,以确保各个机房对关联业务的请求都落在本机房内。
  • 是否方便对用户分区:比如很多游戏类、邮箱类服务,由于用户可以很方便地分区,就非常适合单元化,而SNS类的产品因为关系公用等问题不太适合单元化。
  • 谨慎挑选第二机房:尽量挑选离主机房较近(网络延时在10ms以内)且专线质量好的机房做第二中心。这样大多数的小服务依赖问题都可以简化掉,可以集中精力处理核心业务的异地多活问题。同时,专线的成本占比也比较小。以北京为例,做异地多活建议选择天津、内蒙古、山西等地的机房。
  • 控制部署规模:在数据层自身支持跨机房服务之前,不建议部署超过两个的机房。因为异地两个机房,异地容灾的目的已经达成,且服务器规模足够大,各种配套的设施也会比较健全,运维成本也相对可控。当扩展到三个点之后,新机房基础设施磨合、运维决策的成本等都会大幅增加。
  • 消息同步服务化:建议扩展各自的消息服务,从中间件或者服务层面直接支持跨机房消息同步,将消息体大小控制在10k以下,跨机房消息同步的性能和成本都比较可控。机房间的数据一致性只通过消息同步服务解决,机房内部解决缓存等与消息的一致性问题。跨机房消息同步的核心点在于消息不能丢,微博由于使用的是MCQ,通过本地写远程读的方式,可以很方便的实现高效稳定的跨机房消息同步。

异地多活的新方向

时间到了2015年,新技术层出不穷,之前很多成本很高的事情目前都有了很好的解决方案。接下来我们将在近五年异地多活部署探索的基础上,继续将微博的异地多活部署体系化。

升级跨机房消息同步组件为跨机房消息同步服务。面向业务隔离跨机房消息同步的复杂性,业务只需要对消息进行处理即可,消息的跨机房分发、一致性等由跨机房同步服务保障。且可以作为所有业务跨机房消息同步的专用通道,各个业务均可以复用,类似于快递公司的角色。

推进Web层的异地部署。由于远距离专线成本巨大且稳定性很难保障,我们已暂时放弃远程异地部署,而改为业务逻辑近距离隔离部署,将Web层进行远程异地部署。同时,计划不再依赖昂贵且不稳定的专线,而借助于通过算法寻找较优路径的方法通过公网进行数据传输。这样我们就可以将Web层部署到离用户更近的机房,提升用户的访问性能。依据我们去年做微博Feed全链路的经验,中间链路占掉了90%以上的用户访问时间,将Web层部署的离用户更近,将能大大提升用户访问性能和体验。

借助微服务解决中小服务依赖问题。将对资源等的操作包装为微服务,并将中小业务迁移到微服务架构。这样只需要对几个微服务进行异地多活部署改造,众多的中小业务就不再需要关心异地部署问题,从而可以低成本完成众多中小服务的异地多活部署改造。

利用Docker提升前端快速扩容能力。借助Docker的动态扩容能力,当流量过大时分钟级从其他服务池摘下一批机器,并完成本服务池的扩容。之后可以将各种资源也纳入到Docker动态部署的范围,进一步扩大动态调度的机器源范围。

以上是对微博异地多活部署的一些总结和思考,希望能够对大家有所启发,也希望看到更多的同学分享一下各自公司的异地多活架构方案。

来源:http://www.infoq.com/cn/articles/weibo-multi-datacenter-deployments

Linux:数据中心两种常用流量模型运用mininet的实现

编者按:在网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,还好可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。本文就以数据中心网络为目标场景,来在mininet仿真环境中尽可能地还原数据中心内部的真实流量情况。目前有两种常用的流量模型:

  • 随机模型:主机向在网络中的另一任意主机以等概率发送数据包
  • 概率模型:在网络中,编号为m的主机分别以概率Pt 、Pa 、Pc 、向主机编号为(m+i)、(m+j)、(m+k)的主机发送数据包
Linux:数据中心两种常用流量模型运用mininet的实现
Linux:数据中心两种常用流量模型运用mininet的实现

我们使用mininet中的iperf工具在网络中生成UDP流量,iperf客户端传送数据流到iperf的服务端,由服务端接收并记录相关信 息。mininet自带控制台可供使用的命令虽然已经比较丰富,但却并未给出较为明确的API接口来支持用户自定义命令。在诸如数据中心这样复杂、网络节 点较多的仿真环境中做一些批处理的工作就需要非常大的,比如通过iperf在所有主机之间发生流量。所以我们需要将自定义命令添加到mininet中,在 mininet中完成新命令的拓展。

一、 mininet功能拓展

在mininet中进行功能拓展主要分为3步: 1. 修改mininet/net.py: net模块实现Mininet类,是仿真平台mininet的主体类,该类完成节点添加配置、网络基本功能和一些选项功能的实现。我们需要将我们自定义的函数定义在该类中。

class Mininet(object):    def function(self,**kwargs):        #function code

2. 修改mininet/cli.py: cli模块定义了CLI类,为米你呢他提供命令行接口,用于解析用户输入的命令,之前定义的自定义命令需要在CLI类中通过注册函数注册这条自定义命令。

class CLI(Cmd):    def do_function(self,line):        #do_function code

完成命令注册与绑定。

3. 修改bin/mn: 在完成命令注册与绑定后,需要在mininet执行解释器中注册命令与对应执行函数的映射关系。

ALTSPELLING = {'pingall':'pingAll',            'pingpair':'pingPair',            'iperfudp':'iperfUdp',            'function':'function'}

net.py和cli.py均在mininet/mininet目录,mn文件在在mininet/bin目录中。在代码修改完成后需要重新编译安装一遍mininet,即运行:

$~/mininet/util/install.sh -n

二、 两种流量模型在mininet中的实现

2.1 随机模型

任意一台主机以等概率随机地向另外一台主机发起一条UDP数据流。

修改mininet/net.py

首先,先在两个主机之间进行iperf测试,并且在server端记录,实现iperf_single函数:

def iperf_single( self,hosts=None, udpBw='10M', period=60, port=5001):        """Run iperf between two hosts using UDP.           hosts: list of hosts; if None, uses opposite hosts           returns: results two-element array of server and client speeds"""        if not hosts:            return        else:            assert len( hosts ) == 2        client, server = hosts        filename = client.name[1:] + '.out'        output( '*** Iperf: testing bandwidth between ' )        output( "%s and %sn" % ( client.name, server.name ) )        iperfArgs = 'iperf -u '        bwArgs = '-b ' + udpBw + ' '        print "***start server***"        server.cmd( iperfArgs + '-s -i 1' + ' > /home/zg/log/' + filename + '&')        print "***start client***"        client.cmd(            iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs            +' > /home/zg/log/' + 'client' + filename +'&')

着为mininet添加自定义命令iperfmulti,依次为每一台主机随机选择另一台主机作为iperf的服务器端,通过调用 iperf_single,自身以客户端身份按照指定参数发送UDP流,服务器生成的报告以重定向的方式输出到文件中,使用iperfmulti命令,主 机随机地向另一台主机发起一条恒定带宽的UDP数据流。

def iperfMulti(self, bw, period=60):    base_port = 5001    server_list = []    client_list = [h for h in self.hosts]    host_list = []    host_list = [h for h in self.hosts]     cli_outs = []    ser_outs = []     _len = len(host_list)    for i in xrange(0, _len):        client = host_list[i]        server = client        while( server == client ):            server = random.choice(host_list)        server_list.append(server)        self.iperf_single(hosts = [client, server], udpBw=bw, period= period, port=base_port)        sleep(.05)        base_port += 1     sleep(period)    print "test has done"

修改mininet/cli.py

def do_iperfmulti( self, line ):    """Multi iperf UDP test between nodes"""    args = line.split()    if len(args) == 1:        udpBw = args[ 0 ]        self.mn.iperfMulti(udpBw)    elif len(args) == 2:        udpBw = args[ 0 ]        period = args[ 1 ]        err = False        self.mn.iperfMulti(udpBw, float(period))    else:        error('invalid number of args: iperfmulti udpBw periodn' +               'udpBw examples: 1M 120n')

修改bin/mn

在mininet/bin目录下修改mn文件,将iperfpb加入到对应的列表中。

ALTSPELLING = { 'pingall': 'pingAll',            'pingpair': 'pingPair',            'iperfudp': 'iperfUdp',            'iperfUDP': 'iperfUdp',            'iperfpb':'iperfPb' }

最后,进入mininet/util目录,重新编译安装mininet

$~/mininet/util/install.sh -n

重启mininet,输入iperf,可用table补全iperfpb,从而可使用iperfpb进行流量随机模型的测试。

2.2 概率模型

为mininet添加自定义命令iperfpb,依次为每一台主机(编号为m)分别以概率Pt 、Pa 、Pc 向主机编号为(m+i)、(m+j)、(m+k)的主机发送数据包,通过调用iperf_single,自身以客户端身份按照指定参数发送UDP流,服务 器生成的报告以重定向的方式输出到文件中,使用iperfpb命令,主机按概率向其他被选择的主机发起一条恒定带宽的UDP数据流。

概率选择函数

为完成以一定概率选择主机,我们需要实现一个概率选择函数randompick,这个函数可用于以不同的概率从一个列表中随机地选择一些元素。下面为randompick的实现过程:

def random_pick( self, _list, probabilities):      x = random.uniform(0,1)      p = None    cumulative_probability = 0.0      for item, item_probability in zip(_list, probabilities):          cumulative_probability += item_probability        p = item        if x < cumulative_probability:break    return p

修改mininet/net.py

    base_port = 5001
    server_list = []
    client_list = []
    client_list = [h for h in self.hosts]
    cli_outs = []
    ser_outs = []
    host_list = []
    host_list = [h for h in self.hosts]
    pc = 1 - pt - pa
    p_list = [pt,pa,pc]
    _len = len(self.hosts)
    for key in xrange(_len):
        client = host_list[key]
        access_host = [host_list[(key+i)%_len],host_list[(key+j)%_len],host_list[(key+k)%_len]]
        server = self.random_pick(access_host,p_list)
        server_list.append(server)
        self.iperf_single(hosts = [client, server], udpBw=bw, port=base_port)
        sleep(.05)
    sleep(period)
    print "test has done"

修改mininet/cli.py

def do_iperfpb(self, line):    """Multi iperf UDP test with probablity"""
    args = line.split()
    if len(args) == 1:
        udpBw = args[ 0 ]
        self.mn.iperfMulti(udpBw)
    elif len(args) == 2:
        udpBw = args[ 0 ]
        period = args[ 1 ]
        err = False
        self.mn.iperfPb(udpBw, float(period))
    else:
        error('invalid number of args: iperfmulti udpBw periodn' +
               'udpBw examples: 1M 120n')

修改bin/mn

在mininet/bin目录下修改mn文件,将iperfpb加入到对应的列表中。

ALTSPELLING = { 'pingall': 'pingAll',
            'pingpair': 'pingPair',
            'iperfudp': 'iperfUdp',
            'iperfUDP': 'iperfUdp',

最后,进入mininet/util目录,重新编译安装mininet:

$~/mininet/util/install.sh -n

重启mininet,输入iperf,可用table补全iperfpb,从而可使用iperfpb进行流量的概率模型的测试。

作者简介: 张歌,2014/09-至今,北京邮电大学网络技术研究院 网络与交换技术国家重点实验室攻读硕士研究生

来源:http://www.sdnlab.com/11079.html

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

17. 安装 Webmin

Webmin 是基于 Web 的 Linux 配置工具。它像一个中央系统,用于配置各种系统设置,比如用户、磁盘分配、服务以及 HTTP 服务器、Apache、MySQL 等的配置。

# wget http://prdownloads.sourceforge.net/webadmin/webmin-1.740-1.noarch.rpm
# rpm -ivh webmin-*.rpm
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装 Webmin

安装完 webmin 后,你会在终端上得到一个消息,提示你用 root 密码在端口 10000 登录你的主机 (http://ip-address:10000)。 如果运行的是无用户界面服务器你可以转发端口然后从有用户界面的机器上访问它。(LCTT 译注:无用户界面[headless]服务器指没有监视器和鼠标键盘等外设的服务器,在此次场景,你可以用其他有显示器和键盘鼠标的机器上访问它。)

18. 启用第三方库

添加不受信任的库并不是一个好主意,尤其是在生产环境中,这可能导致致命的问题。但仅作为例子在这里我们会添加一些社区证实可信任的库,以安装第三方工具和软件包。

为企业版 Linux(EPEL)库添加额外的软件包。

# yum install epel-release

添加社区企业版 Linux (Community Enterprise Linux)库:

# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装 Epel 库

注意! 添加第三方库的时候尤其需要注意。

19. 安装 7-zip 工具

在最小化安装 CentOS 时你并没有获得类似 unzip 或者 untar 的工具。我们可以选择根据需要来安装每个工具,或一个能处理所有格式的工具。7-zip 就是一个能压缩和解压所有已知类型文件的工具。

# yum install p7zip
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装 7zip 工具

注意: 该软件包从 Fedora EPEL 7 的库中下载和安装。

20. 安装 NTFS-3G 驱动

NTFS-3G,一个很小但非常有用的 NTFS 驱动,在大部分类 UNIX 发行版上都可用。它对于挂载和访问 Windows NTFS 文件系统很有用。尽管也有其它可用的替代品,比如 Tuxera,但 NTFS-3G 是使用最广泛的。

# yum install ntfs-3g
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装 NTFS-3G 用于挂载 Windows 分区

ntfs-3g 安装完成之后,你可以使用以下命令挂载 Windows NTFS 分区(我的 Windows 分区是 /dev/sda5)。

# mount -ro ntfs-3g /dev/sda5 /mnt
# cd /mnt
# ls -l

21. 安装 Vsftpd FTP 服务器

VSFTPD 表示 Very Secure File Transfer Protocol Daemon,是用于类 UNIX 系统的 FTP 服务器。它是现今最高效和安全的 FTP 服务器之一。

# yum install vsftpd
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装 Vsftpd FTP

编辑配置文件 ‘/etc/vsftpd/vsftpd.conf’ 用于保护 vsftpd。

# vi /etc/vsftpd/vsftpd.conf

编辑一些值并使其它行保留原样,除非你知道自己在做什么。

anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES

你也可以更改端口号,记得让 vsftpd 端口通过防火墙。

# firewall-cmd --add-port=21/tcp
# firewall-cmd --reload

下一步重启 vsftpd 并启用开机自动启动。

# systemctl restart vsftpd
# systemctl enable vsftpd

22. 安装和配置 sudo

sudo 通常被称为 super do 或者 suitable user do,是一个类 UNIX 操作系统中用其它用户的安全权限执行程序的软件。让我们来看看怎样配置 sudo。

# visudo

这会打开 /etc/sudoers 并进行编辑

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

sudoers 文件

  1. 给一个已经创建好的用户(比如 tecmint)赋予所有权限(等同于 root)。

    tecmint   ALL=(ALL)    ALL
    
  2. 如果给一个已经创建好的用户(比如 tecmint)赋予除了重启和关闭服务器以外的所有权限(等同于 root)。

    首先,再一次打开文件并编辑如下内容:

    cmnd_Alias nopermit = /sbin/shutdown, /sbin/reboot
    

    然后,用逻辑操作符(!)添加该别名。

    tecmint   ALL=(ALL)    ALL,!nopermit
    
  3. 如果准许一个组(比如 debian)运行一些 root 权限命令,比如(增加或删除用户)。

    cmnd_Alias permit = /usr/sbin/useradd, /usr/sbin/userdel
    

    然后,给组 debian 增加权限。

    debian ALL=(ALL) permit
    

23. 安装并启用 SELinux

SELinux 表示 Security-Enhanced Linux,是内核级别的安全模块。

# yum install selinux-policy
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装 SElinux 策略

查看 SELinux 当前模式。

# getenforce
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

查看 SELinux 模式

输出是 Enforcing,意味着 SELinux 策略已经生效。

如果需要调试,可以临时设置 selinux 模式为允许。不需要重启。

# setenforce 0

调试完了之后再次设置 selinux 为强制模式,无需重启。

# setenforce 1

(LCTT 译注:在生产环境中,SELinux 固然会提升安全,但是也确实会给应用部署和运行带来不少麻烦。具体是否部署,需要根据情况而定。)

24. 安装 Rootkit Hunter

Rootkit Hunter,简写为 RKhunter,是在 Linux 系统中扫描 rootkits 和其它可能有害攻击的程序。

# yum install rkhunter
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装 Rootkit Hunter

在 Linux 中,从脚本文件以计划作业的形式运行 rkhunter 或者手动扫描有害攻击。

# rkhunter --check
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

扫描 rootkits

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

RootKit 扫描结果


via: http://www.tecmint.com/things-to-do-after-minimal-rhel-centos-7-installation/4/

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

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

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

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

25. 安装 Linux Malware Detect (LMD)

Linux Malware Detect (LMD) 是 GNU GPLv2 协议下发布的开源 Linux 恶意程序扫描器,它是特别为面临威胁的主机环境所设计的。LMD 完整的安装、配置以及使用方法可以查看:

26. 用 Speedtest-cli 测试服务器带宽

speedtest-cli 是用 python 写的用于测试网络下载和上传带宽的工具。关于 speedtest-cli 工具的完整安装和使用请阅读我们的文章用命令行查看 Linux 服务器带宽

27. 配置 Cron 任务

这是最广泛使用的软件工具之一。它是一个任务调度器,比如,现在安排一个以后可以自动运行的作业。它用于未处理记录的日志和维护,以及其它日常工作,比如常规备份。所有的调度都写在文件 /etc/crontab 中。

crontab 文件包含下面的 6 个域:

    分          时                日期                      月份                  星期                  命令
(0-59)           (0-23)       (1-31)                (1/jan-12/dec)       (0-6/sun-sat)          Command/script
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

Crontab 域

要在每天 04:30 运行一个 cron 任务(比如运行 /home/$USER/script.sh)。

分             时         日期              月份      星期                  命令
30              4             *              *       *            speedtest-cli

就把下面的条目增加到 crontab 文件 ‘/etc/crontab/’。

30  4  *  *  *  /home/$user/script.sh

把上面一行增加到 crontab 之后,它会在每天的 04:30 am 自动运行,输出取决于脚本文件的内容。另外脚本也可以用命令代替。关于更多 cron 任务的例子,可以阅读Linux 上的 11 个 Cron 任务例子

28. 安装 Owncloud

Owncloud 是一个基于 HTTP 的数据同步、文件共享和远程文件存储应用。更多关于安装 owncloud 的内容,你可以阅读这篇文章:在 Linux 上创建个人/私有云存储

29. 启用 Virtualbox 虚拟化

虚拟化是创建虚拟操作系统、硬件和网络的过程,是当今最热门的技术之一。我们会详细地讨论如何安装和配置虚拟化。

我们的最小化 CentOS 服务器是一个无用户界面服务器(LCTT 译注:无用户界面[headless]服务器指没有监视器和鼠标键盘等外设的服务器)。我们通过安装下面的软件包,让它可以托管虚拟机,虚拟机可通过 HTTP 访问。

# yum groupinstall 'Development Tools' SDL kernel-devel kernel-headers dkms
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

安装开发工具

更改工作目录到 ‘/etc/yum.repos.d/’ 并下载 VirtualBox 库。

# wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc

安装刚下载的密钥。

# rpm --import oracle_vbox.asc

升级并安装 VirtualBox。

# yum update && yum install virtualbox-4.3

下一步,下载和安装 VirtualBox 扩展包。

# wget http://download.virtualbox.org/virtualbox/4.3.12/Oracle_VM_VirtualBox_Extension_Pack-4.3.12-93733.vbox-extpack
# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.3.12-93733.vbox-extpack
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

安装 VirtualBox 扩展包

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

正在安装 VirtualBox 扩展包

添加用户 ‘vbox’ 用于管理 VirtualBox 并把它添加到组 vboxusers 中。

# adduser vbox
# passwd vobx
# usermod -G vboxusers vbox

安装 HTTPD 服务器。

# yum install httpd

安装 PHP (支持 soap 扩展)。

# yum install php php-devel php-common php-soap php-gd

下载 phpVirtualBox(一个 PHP 写的开源的 VirtualBox 用户界面)。

# wget http://sourceforge.net/projects/phpvirtualbox/files/phpvirtualbox-4.3-1.zip

解压 zip 文件并把解压后的文件夹复制到 HTTP 工作目录。

# unzip phpvirtualbox-4.*.zip
# cp phpvirtualbox-4.3-1 -R /var/www/html

下一步,重命名文件 /var/www/html/phpvirtualbox/config.php-example 为 var/www/html/phpvirtualbox/config.php。

# mv config.php.example config.php

打开配置文件并添加我们上一步创建的 ‘username ’ 和 ‘password’。

# vi config.php

最后,重启 VirtualBox 和 HTTP 服务器。

# service vbox-service restart
# service httpd restart

转发端口并从一个有用户界面的服务器上访问它。

http://192.168.0.15/phpvirtualbox-4.3-1/
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

登录 PHP Virtualbox

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

PHP Virtualbox 面板


via: http://www.tecmint.com/things-to-do-after-minimal-rhel-centos-7-installation/5/

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

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

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

Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

Sort是用于对单个或多个文本文件内容进行排序的Linux程序。Sort命令以空格作为字段分隔符,将一行分割为多个关键字对文件进行排序。需要注意的是除非你将输出重定向到文件中,否则Sort命令并不对文件内容进行实际的排序(即文件内容没有修改),只是将文件内容按有序输出。

本文的目标是通过14个实际的范例让你更深刻的理解如何在Linux中使用sort命令。

Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

1、 首先我们将会创建一个用于执行‘sort’命令的文本文件(tecmint.txt)。工作路径是‘/home/$USER/Desktop/tecmint’。

下面命令中的‘-e’选项将启用‘’转义,将‘n’解析成换行

$ echo -e "computernmousenLAPTOPndatanRedHatnlaptopndebiannlaptop" > tecmint.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

2、 在开始学习‘sort’命令前,我们先看看文件的内容及其显示方式。

$ cat tecmint.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

3、 现在,使用如下命令对文件内容进行排序。

$ sort tecmint.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

注意:上面的命令并不对文件内容进行实际的排序,仅仅是将其内容按有序方式输出。

4、 对文件‘tecmint.txt’文件内容排序,并将排序后的内容输出到名为sorted.txt的文件中,然后使用cat命令查看验证sorted.txt文件的内容。

$ sort tecmint.txt > sorted.txt
$ cat sorted.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

5、 现在使用‘-r’参数对‘tecmint.txt’文件内容进行逆序排序,并将输出内容重定向到‘reversesorted.txt’文件中,并使用cat命令查看文件的内容。

$ sort -r tecmint.txt > reversesorted.txt
$ cat reversesorted.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

6、 创建一个新文件(lsl.txt),文件内容为在home目录下执行‘ls -l’命令的输出。

$ ls -l /home/$USER > /home/$USER/Desktop/tecmint/lsl.txt
$ cat lsl.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

我们将会看到对其他字段进行排序的例子,而不是对默认的开始字符进行排序。

7、 基于第二列(符号连接的数量)对文件‘lsl.txt’进行排序。

$ sort -nk2 lsl.txt

注意:上面例子中的‘-n’参数表示对数值内容进行排序。当想基于文件中的数值列对文件进行排序时,必须要使用‘-n’参数。

Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

8、 基于第9列(文件和目录的名称,非数值)对文件‘lsl.txt’进行排序。

$ sort -k9 lsl.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

9、 sort命令并非仅能对文件进行排序,我们还可以通过管道将命令的输出内容重定向到sort命令中。

$ ls -l /home/$USER | sort -nk5
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

10、 对文件tecmint.txt进行排序,并删除重复的行。然后检查重复的行是否已经删除了。

$ cat tecmint.txt
$ sort -u tecmint.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

目前我们发现的排序规则:

除非指定了‘-r’参数,否则排序的优先级按下面规则排序

  • 以数字开头的行优先级最高
  • 以小写字母开头的行优先级次之
  • 待排序内容按字典序进行排序
  • 默认情况下,‘sort’命令将带排序内容的每行关键字当作一个字符串进行字典序排序(数字优先级最高,参看规则 1)

11、 在当前位置创建第三个文件‘lsla.txt’,其内容用‘ls -lA’命令的输出内容填充。

$ ls -lA /home/$USER > /home/$USER/Desktop/tecmint/lsla.txt
$ cat lsla.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

了解ls命令的读者都知道‘ls -lA’ 等于 ‘ls -l’ + 隐藏文件,所以这两个文件的大部分内容都是相同的。

12、 对上面两个文件内容进行排序输出。

$ sort lsl.txt lsla.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

注意文件和目录的重复

13、 现在我们看看怎样对两个文件进行排序、合并,并且删除重复行。

$ sort -u lsl.txt lsla.txt
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

此时,我们注意到重复的行已经被删除了,我们可以将输出内容重定向到文件中。

14、 我们同样可以基于多列对文件内容进行排序。基于第2,5(数值)和9(非数值)列对‘ls -l’命令的输出进行排序。

$ ls -l /home/$USER | sort -t "," -nk2,5 -k9
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)
Linux:Linux 的 ‘sort’命令的14个有用的范例(一)

先到此为止了,在接下来的文章中我们将会学习到‘sort’命令更多的详细例子。届时敬请关注我们。保持分享精神。若喜欢本文,敬请将本文分享给你的朋友。


via: http://www.tecmint.com/sort-command-linux/

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

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

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

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

30. 用密码保护 GRUB

用密码保护你的 boot 引导程序这样你就可以在启动时获得额外的安全保障。同时你也可以在实物层面获得保护。通过在引导时给 GRUB 加锁防止任何无授权访问来保护你的服务器。

首先备份两个文件,这样如果有任何错误出现,你可以有回滚的选择。备份 ‘/etc/grub2/grub.cfg’ 为 ‘/etc/grub2/grub.cfg.old’。

# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.old

同样,备份 ‘/etc/grub.d/10_linux’ 为 ‘/etc/grub.d/10_linux.old’。

# cp /etc/grub.d/10_linux /etc/grub.d/10_linux.old

打开文件 ‘/etc/grub.d/10_linux’ 并在文件末尾添加下列行。

cat <
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

密码保护 Grub

注意在上面的文件中,用你自己的用户名和密码代替 “tecmint” 和 “avi@123”。

现在通过运行下面的命令生成新的 grub.cfg 文件。

# grub2-mkconfig --output=/boot/grub2/grub.cfg
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

生成 Grub 文件

创建 grub.cfg 文件之后,重启机器并敲击 ‘e’ 进入编辑。你会发现它会要求你输入 “有效验证” 来编辑 boot 菜单。

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

有密码保护的 Boot 菜单

输入登录验证之后,你就可以编辑 grub boot 菜单。

Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

Grub 菜单文件

你也可以用加密的密码代替上一步的明文密码。首先按照下面推荐的生成加密密码。

# grub2-mkpasswd-pbkdf2
[两次输入密码]
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

生成加密的 Grub 密码

打开 ‘/etc/grub.d/10_linux’ 文件并在文件末尾添加下列行。

cat <
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)
Linux:安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(六)

加密 Grub 密码

用你系统上生成的密码代替原来的密码,别忘了交叉检查密码。

同样注意在这种情况下你也需要像上面那样生成 grub.cfg。重启并敲击 ‘e’ 进入编辑,会提示你输入用户名和密码。

我们已经介绍了大部分工业标准发行版 RHEL 7 和 CentOS 7 安装后必要的操作。如果你发现我们缺少了一些点或者你有新的东西可以扩充这篇文章,你可以和我们一起分享,我们会通过扩充在这篇文章中包括你的分享。


via: http://www.tecmint.com/things-to-do-after-minimal-rhel-centos-7-installation/6/

作者:vishek Kumar 译者:ictlyh 校对:wxy

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

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

Linux:Linux 的 'sort'命令的七个有趣实例(二)

上一篇文章里,我们已经探讨了关于sort命令的多个例子,如果你错过了这篇文章,可以点击下面的链接进行阅读。今天的这篇文章作为上一篇文章的继续,将讨论关于sort命令的剩余用法,与上一篇一起作为Linux ‘sort’命令的完整指南。

Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

在我们继续深入之前,先创建一个文本文档‘month.txt’,并且将上一次给出的数据填进去。

$ echo -e "marndecnoctnsepnfebnaug" > month.txt
$ cat month.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

15、 通过使用’M‘选项,对’month.txt‘文件按照月份顺序进行排序。

$ sort -M month.txt

注意:‘sort’命令需要至少3个字符来确认月份名称。

Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

16、 把数据整理成方便人们阅读的形式,比如1K、2M、3G、2T,这里面的K、G、M、T代表千、兆、吉、梯。 (LCTT 译注:此处命令有误,ls 命令应该增加 -h 参数,径改之)

$ ls -lh /home/$USER | sort -h -k5
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

17、 在上一篇文章中,我们在例子4中创建了一个名为‘sorted.txt’的文件,在例子6中创建了一个‘lsl.txt’。‘sorted.txt’已经排好序了而’lsl.txt‘还没有。让我们使用sort命令来检查两个文件是否已经排好序。

$ sort -c sorted.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

如果它返回0,则表示文件已经排好序。

$ sort -c lsl.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

报告无序。存在矛盾……

18、 如果文字之间的分隔符是空格,sort命令自动地将空格后的东西当做一个新文字单元,如果分隔符不是空格呢?

考虑这样一个文本文件,里面的内容可以由除了空格之外的任何符号分隔,比如‘|’,‘’,‘+’,‘.’等……

创建一个分隔符为+的文本文件。使用‘cat‘命令查看文件内容。

$ echo -e "21+linux+server+productionn11+debian+RedHat+CentOSn131+Apache+Mysql+PHPn7+Shell Scripting+python+perln111+postfix+exim+sendmail" > delimiter.txt

$ cat delimiter.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

现在基于由数字组成的第一个域来进行排序。

$ sort -t '+' -nk1 delimiter.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

然后再基于非数字的第四个域排序。

Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

如果分隔符是制表符,你需要在’+‘的位置上用$’t’代替,如上例所示。

19、 对主用户目录下使用‘ls -l’命令得到的结果基于第五列(‘文件大小’)进行一个乱序排列。

$ ls -l /home/avi/ | sort -k5 -R
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

每一次你运行上面的脚本,你得到结果可能都不一样,因为结果是随机生成的。

正如我在上一篇文章中提到的规则2所说——sort命令会将以小写字母开始的行排在大写字母开始的行前面。看一下上一篇文章的例3,字符串‘laptop’在‘LAPTOP’前出现。

20、 如何覆盖默认的排序优先权?在这之前我们需要先将环境变量LC_ALL的值设置为C。在命令行提示栏中运行下面的代码。

$ export LC_ALL=C

然后以非默认优先权的方式对‘tecmint.txt’文件重新排序。

$ sort tecmint.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

覆盖排序优先权

不要忘记与example 3中得到的输出结果做比较,并且你可以使用‘-f’,又叫‘-ignore-case’(忽略大小写)的选项来获取更有序的输出。

$ sort -f tecmint.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

21、 给两个输入文件进行‘sort‘,然后把它们连接成一行!

我们创建两个文本文档’file1.txt‘以及’file2.txt‘,并用数据填充,如下所示,并用’cat‘命令查看文件的内容。

$ echo -e “5 Reliablen2 Fastn3 Securen1 open-sourcen4 customizable” > file1.txt
$ cat file1.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

用如下数据填充’file2.txt‘。

$ echo -e “3 RedHatn1 Debiann5 Ubuntun2 Kalin4 Fedora” > file2.txt
$ cat file2.txt
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 ‘sort’命令的七个有趣实例(二)

现在我们对两个文件进行排序并连接。

$ join <(sort -n file1.txt) <(sort file2.txt)
Linux:Linux 的 'sort'命令的七个有趣实例(二)
Linux:Linux 的 'sort'命令的七个有趣实例(二)

我所要讲的全部内容就在这里了,希望与各位保持联系,也希望各位经常来逛逛。有反馈就在下面评论吧。


via: http://www.tecmint.com/linux-sort-command-examples/

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

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

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

Linux:增强 nginx 的 SSL 安全性

Linux:增强 nginx 的 SSL 安全性
Linux:增强 nginx 的 SSL 安全性

本文向你介绍如何在 nginx 服务器上设置健壮的 SSL 安全机制。我们通过禁用 SSL 压缩来降低 CRIME 攻击威胁;禁用协议上存在安全缺陷的 SSLv3 及更低版本,并设置更健壮的加密套件(cipher suite)来尽可能启用前向安全性(Forward Secrecy);此外,我们还启用了 HSTS 和 HPKP。这样我们就拥有了一个健壮而可经受考验的 SSL 配置,并可以在 Qually Labs 的 SSL 测试中得到 A 级评分。

如果不求甚解的话,可以从 https://cipherli.st 上找到 nginx 、Apache 和 Lighttpd 的安全设置,复制粘帖即可。

本教程在 Digital Ocean 的 VPS 上测试通过。如果你喜欢这篇教程,想要支持作者的站点的话,购买 Digital Ocean 的 VPS 时请使用如下链接:https://www.digitalocean.com/?refcode=7435ae6b8212

本教程可以通过发布于 2014/1/21 的 SSL 实验室测试的严格要求(我之前就通过了测试,如果你按照本文操作就可以得到一个 A+ 评分)。

你可以从下列链接中找到这方面的进一步内容:

我们需要编辑 nginx 的配置,在 Ubuntu/Debian 上是 /etc/nginx/sited-enabled/yoursite.com,在 RHEL/CentOS 上是 /etc/nginx/conf.d/nginx.conf

本文中,我们需要编辑443端口(SSL)的 server配置中的部分。在文末你可以看到完整的配置例子。

在编辑之前切记备份一下配置文件!

野兽攻击(BEAST)和 RC4

简单的说,野兽攻击(BEAST)就是通过篡改一个加密算法的 CBC(密码块链)的模式,从而可以对部分编码流量悄悄解码。更多信息参照上面的链接。

针对野兽攻击(BEAST),较新的浏览器已经启用了客户端缓解方案。推荐方案是禁用 TLS 1.0 的所有加密算法,仅允许 RC4 算法。然而,针对 RC4 算法的攻击也越来越多 ,很多已经从理论上逐步发展为实际可行的攻击方式。此外,有理由相信 NSA 已经实现了他们所谓的“大突破”——攻破 RC4 。

禁用 RC4 会有几个后果。其一,当用户使用老旧的浏览器时,比如 Windows XP 上的 IE 会用 3DES 来替代 RC4。3DES 要比 RC4 更安全,但是它的计算成本更高,你的服务器就需要为这些用户付出更多的处理成本。其二,RC4 算法能减轻 野兽攻击(BEAST)的危害,如果禁用 RC4 会导致 TLS 1.0 用户会换到更容易受攻击的 AES-CBC 算法上(通常服务器端的对野兽攻击(BEAST)的“修复方法”是让 RC4 优先于其它算法)。我认为 RC4 的风险要高于野兽攻击(BEAST)的风险。事实上,有了客户端缓解方案(Chrome 和 Firefox 提供了缓解方案),野兽攻击(BEAST)就不是什么大问题了。而 RC4 的风险却在增长:随着时间推移,对加密算法的破解会越来越多。

怪物攻击(FREAK)

怪物攻击(FREAK)是一种中间人攻击,它是由来自 INRIA、微软研究院和 IMDEA 的密码学家们所发现的。怪物攻击(FREAK)的缩写来自“Factoring RSA-EXPORT Keys(RSA 出口密钥因子分解)”

这个漏洞可上溯到上世纪九十年代,当时美国政府禁止出口加密软件,除非其使用编码密钥长度不超过512位的出口加密套件。

这造成了一些现在的 TLS 客户端存在一个缺陷,这些客户端包括: 苹果的 SecureTransport 、OpenSSL。这个缺陷会导致它们会接受出口降级 RSA 密钥,即便客户端并没有要求使用出口降级 RSA 密钥。这个缺陷带来的影响很讨厌:在客户端存在缺陷,且服务器支持出口降级 RSA 密钥时,会发生中间人攻击,从而导致连接的强度降低。

攻击分为两个组成部分:首先是服务器必须接受“出口降级 RSA 密钥”。

中间人攻击可以按如下流程:

  • 在客户端的 Hello 消息中,要求标准的 RSA 加密套件。
  • 中间人攻击者修改该消息为‘export RSA’(输出级 RSA 密钥)。
  • 服务器回应一个512位的输出级 RSA 密钥,并以其长期密钥签名。
  • 由于 OpenSSL/SecureTransport 的缺陷,客户端会接受这个弱密钥。
  • 攻击者根据 RSA 模数分解因子来恢复相应的 RSA 解密密钥。
  • 当客户端编码‘pre-master secret’(预主密码)给服务器时,攻击者现在就可以解码它并恢复 TLS 的‘master secret’(主密码)。
  • 从这里开始,攻击者就能看到了传输的明文并注入任何东西了。

本文所提供的加密套件不启用输出降级加密,请确认你的 OpenSSL 是最新的,也强烈建议你将客户端也升级到新的版本。

心血漏洞(Heartbleed)

心血漏洞(Heartbleed) 是一个于2014年4月公布的 OpenSSL 加密库的漏洞,它是一个被广泛使用的传输层安全(TLS)协议的实现。无论是服务器端还是客户端在 TLS 中使用了有缺陷的 OpenSSL,都可以被利用该缺陷。由于它是因 DTLS 心跳扩展(RFC 6520)中的输入验证不正确(缺少了边界检查)而导致的,所以该漏洞根据“心跳”而命名。这个漏洞是一种缓存区超读漏洞,它可以读取到本不应该读取的数据。

哪个版本的 OpenSSL 受到心血漏洞(Heartbleed)的影响?

各版本情况如下:

  • OpenSSL 1.0.1 直到 1.0.1f (包括)存在该缺陷
  • OpenSSL 1.0.1g 没有该缺陷
  • OpenSSL 1.0.0 分支没有该缺陷
  • OpenSSL 0.9.8 分支没有该缺陷

这个缺陷是2011年12月引入到 OpenSSL 中的,并随着 2012年3月14日 OpenSSL 发布的 1.0.1 而泛滥。2014年4月7日发布的 OpenSSL 1.0.1g 修复了该漏洞。

升级你的 OpenSSL 就可以避免该缺陷。

SSL 压缩(罪恶攻击 CRIME)

罪恶攻击(CRIME)使用 SSL 压缩来完成它的魔法,SSL 压缩在下述版本是默认关闭的: nginx 1.1.6及更高/1.0.9及更高(如果使用了 OpenSSL 1.0.0及更高), nginx 1.3.2及更高/1.2.2及更高(如果使用较旧版本的 OpenSSL)。

如果你使用一个早期版本的 nginx 或 OpenSSL,而且你的发行版没有向后移植该选项,那么你需要重新编译没有一个 ZLIB 支持的 OpenSSL。这会禁止 OpenSSL 使用 DEFLATE 压缩方式。如果你禁用了这个,你仍然可以使用常规的 HTML DEFLATE 压缩。

SSLv2 和 SSLv3

SSLv2 是不安全的,所以我们需要禁用它。我们也禁用 SSLv3,因为 TLS 1.0 在遭受到降级攻击时,会允许攻击者强制连接使用 SSLv3,从而禁用了前向安全性(forward secrecy)。

如下编辑配置文件:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

卷毛狗攻击(POODLE)和 TLS-FALLBACK-SCSV

SSLv3 会受到卷毛狗漏洞(POODLE)的攻击。这是禁用 SSLv3 的主要原因之一。

Google 提出了一个名为 TLSFALLBACKSCSV 的SSL/TLS 扩展,它用于防止强制 SSL 降级。如果你升级 到下述的 OpenSSL 版本会自动启用它。

  • OpenSSL 1.0.1 带有 TLS_FALLBACK_SCSV 1.0.1j 及更高。
  • OpenSSL 1.0.0 带有 TLS_FALLBACK_SCSV 1.0.0o 及更高。
  • OpenSSL 0.9.8 带有 TLS_FALLBACK_SCSV 0.9.8zc 及更高。

更多信息请参照 NGINX 文档

加密套件(cipher suite)

前向安全性(Forward Secrecy)用于在长期密钥被破解时确保会话密钥的完整性。PFS(完备的前向安全性)是指强制在每个/每次会话中推导新的密钥。

这就是说,泄露的私钥并不能用来解密(之前)记录下来的 SSL 通讯。

提供PFS(完备的前向安全性)功能的是那些使用了一种 Diffie-Hellman 密钥交换的短暂形式的加密套件。它们的缺点是系统开销较大,不过可以使用椭圆曲线的变体来改进。

以下两个加密套件是我推荐的,之后Mozilla 基金会也推荐了。

推荐的加密套件:

ssl_ciphers 'AES128+EECDH:AES128+EDH';

向后兼容的推荐的加密套件(IE6/WinXP):

ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

如果你的 OpenSSL 版本比较旧,不可用的加密算法会自动丢弃。应该一直使用上述的完整套件,让 OpenSSL 选择一个它所支持的。

加密套件的顺序是非常重要的,因为其决定了优先选择哪个算法。上述优先推荐的算法中提供了PFS(完备的前向安全性)。

较旧版本的 OpenSSL 也许不能支持这个算法的完整列表,AES-GCM 和一些 ECDHE 算法是相当新的,在 Ubuntu 和 RHEL 中所带的绝大多数 OpenSSL 版本中不支持。

优先顺序的逻辑

  • ECDHE+AESGCM 加密是首选的。它们是 TLS 1.2 加密算法,现在还没有广泛支持。当前还没有对它们的已知攻击。
  • PFS 加密套件好一些,首选 ECDHE,然后是 DHE。
  • AES 128 要好于 AES 256。有一个关于 AES256 带来的安全提升程度是否值回成本的讨论,结果是显而易见的。目前,AES128 要更值一些,因为它提供了不错的安全水准,确实很快,而且看起来对时序攻击更有抵抗力。
  • 在向后兼容的加密套件里面,AES 要优于 3DES。在 TLS 1.1及其以上,减轻了针对 AES 的野兽攻击(BEAST)的威胁,而在 TLS 1.0上则难以实现该攻击。在非向后兼容的加密套件里面,不支持 3DES。
  • RC4 整个不支持了。3DES 用于向后兼容。参看 #RC4_weaknesses 中的讨论。

强制丢弃的算法

  • aNULL 包含了非验证的 Diffie-Hellman 密钥交换,这会受到中间人(MITM)攻击
  • eNULL 包含了无加密的算法(明文)
  • EXPORT 是老旧的弱加密算法,是被美国法律标示为可出口的
  • RC4 包含的加密算法使用了已弃用的 ARCFOUR 算法
  • DES 包含的加密算法使用了弃用的数据加密标准(DES)
  • SSLv2 包含了定义在旧版本 SSL 标准中的所有算法,现已弃用
  • MD5 包含了使用已弃用的 MD5 作为哈希算法的所有算法

更多设置

确保你也添加了如下行:

ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

在一个 SSLv3 或 TLSv1 握手过程中选择一个加密算法时,一般使用客户端的首选算法。如果设置了上述配置,则会替代地使用服务器端的首选算法。

前向安全性和 Diffie Hellman Ephemeral (DHE)参数

前向安全性(Forward Secrecy)的概念很简单:客户端和服务器协商一个永不重用的密钥,并在会话结束时销毁它。服务器上的 RSA 私钥用于客户端和服务器之间的 Diffie-Hellman 密钥交换签名。从 Diffie-Hellman 握手中获取的预主密钥会用于之后的编码。因为预主密钥是特定于客户端和服务器之间建立的某个连接,并且只用在一个限定的时间内,所以称作短暂模式(Ephemeral)。

使用了前向安全性,如果一个攻击者取得了一个服务器的私钥,他是不能解码之前的通讯信息的。这个私钥仅用于 Diffie Hellman 握手签名,并不会泄露预主密钥。Diffie Hellman 算法会确保预主密钥绝不会离开客户端和服务器,而且不能被中间人攻击所拦截。

所有版本的 nginx(如1.4.4)都依赖于 OpenSSL 给 Diffie-Hellman (DH)的输入参数。不幸的是,这意味着 Diffie-Hellman Ephemeral(DHE)将使用 OpenSSL 的默认设置,包括一个用于密钥交换的1024位密钥。因为我们正在使用2048位证书,DHE 客户端就会使用一个要比非 DHE 客户端更弱的密钥交换。

我们需要生成一个更强壮的 DHE 参数:

cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096

然后告诉 nginx 将其用作 DHE 密钥交换:

ssl_dhparam /etc/ssl/certs/dhparam.pem;

OCSP 装订(Stapling)

当连接到一个服务器时,客户端应该使用证书吊销列表(CRL)或在线证书状态协议(OCSP)记录来校验服务器证书的有效性。CRL 的问题是它已经增长的太大了,永远也下载不完了。

OCSP 更轻量级一些,因为我们每次只请求一条记录。但是副作用是当连接到一个服务器时必须对第三方 OCSP 响应器发起 OCSP 请求,这就增加了延迟和带来了潜在隐患。事实上,CA 所运营的 OCSP 响应器非常不可靠,浏览器如果不能及时收到答复,就会静默失败。攻击者通过 DoS 攻击一个 OCSP 响应器可以禁用其校验功能,这样就降低了安全性。

解决方法是允许服务器在 TLS 握手中发送缓存的 OCSP 记录,以绕开 OCSP 响应器。这个机制节省了客户端和 OCSP 响应器之间的通讯,称作 OCSP 装订。

客户端会在它的 CLIENT HELLO 中告知其支持 status_request TLS 扩展,服务器仅在客户端请求它的时候才发送缓存的 OCSP 响应。

大多数服务器最多会缓存 OCSP 响应48小时。服务器会按照常规的间隔连接到 CA 的 OCSP 响应器来获取刷新的 OCSP 记录。OCSP 响应器的位置可以从签名的证书中的授权信息访问(Authority Information Access)字段中获得。

HTTP 严格传输安全(HSTS)

如有可能,你应该启用 HTTP 严格传输安全(HSTS),它会引导浏览器和你的站点之间的通讯仅通过 HTTPS。

HTTP 公钥固定扩展(HPKP)

你也应该启用 HTTP 公钥固定扩展(HPKP)

公钥固定的意思是一个证书链必须包括一个白名单中的公钥。它确保仅有白名单中的 CA 才能够为某个域名签署证书,而不是你的浏览器中存储的任何 CA。

我已经写了一篇关于 HPKP 的背景理论及在 Apache、Lighttpd 和 NGINX 中配置例子的文章

配置范例

server {
  listen [::]:443 default_server;
  ssl on;
  ssl_certificate_key /etc/ssl/cert/raymii_org.pem;
  ssl_certificate /etc/ssl/cert/ca-bundle.pem;
  ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_session_cache shared:SSL:10m;
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.4.4 8.8.8.8 valid=300s;
  resolver_timeout 10s;
  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  add_header Strict-Transport-Security max-age=63072000;
  add_header X-Frame-Options DENY;
  add_header X-Content-Type-Options nosniff;
  root /var/www/;
  index index.html index.htm;
  server_name raymii.org;
}

结尾

如果你使用了上述配置,你需要重启 nginx:

# 首先检查配置文件是否正确
/etc/init.d/nginx configtest
# 然后重启
/etc/init.d/nginx restart

现在使用 SSL Labs 测试来看看你是否能得到一个漂亮的“A”。当然了,你也得到了一个安全的、强壮的、经得起考验的 SSL 配置!


via: https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

作者:Remy van Elst 译者:wxy 校对:wxy

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

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

Linux:搭建一个私有的Docker registry

Linux:搭建一个私有的Docker registry
Linux:搭建一个私有的Docker registry

[TL;DR] 这是系列的第二篇文章,这系列讲述了我的公司如何把基础服务从PaaS迁移到Docker上

  • 第一篇文章: 我谈到了接触Docker之前的经历;
  • 第三篇文章: 我展示如何使创建镜像的过程自动化以及如何用Docker部署一个Rails应用。

为什么需要搭建一个私有的registry呢?嗯,对于新手来说,Docker Hub(一个Docker公共仓库)只允许你拥有一个免费的私有版本库(repo)。其他的公司也开始提供类似服务,但是价格可不便宜。另外,如果你需要用Docker部署一个用于生产环境的应用,恐怕你不希望将这些镜像放在公开的Docker Hub上吧!

这篇文章提供了一个非常务实的方法来处理搭建私有Docker registry时出现的各种错综复杂的情况。我们将会使用一个运行于DigitalOcean(之后简称为DO)的非常小巧的512MB VPS 实例。并且我会假定你已经了解了Docker的基本概念,因为我必须集中精力在复杂的事情上!

本地搭建

首先你需要安装boot2docker以及docker CLI。如果你已经搭建好了基本的Docker环境,你可以直接跳过这一步。

从终端运行以下命令(我假设你使用OS X,使用 HomeBrew 来安装相关软件,你可以根据你的环境使用不同的包管理软件来安装):

brew install boot2docker docker

如果一切顺利(想要了解搭建docker环境的完整指南,请参阅 http://boot2docker.io/) ,你现在就能够通过如下命令启动一个 Docker 运行于其中的虚拟机:

boot2docker up

按照屏幕显示的说明,复制粘贴book2docker在终端输出的命令。如果你现在运行docker ps命令,终端将有以下显示。

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

好了,Docker已经准备就绪,这就够了,我们回过头去搭建registry。

创建服务器

登录进你的DO账号,选择一个预安装了Docker的镜像文件,创建一个新的Drople。(本文写成时选择的是 Image > Applications > Docker 1.4.1 on 14.04)

Linux:搭建一个私有的Docker registry
Linux:搭建一个私有的Docker registry

你将会以邮件的方式收到一个根用户凭证。登录进去,然后运行docker ps命令来查看系统状态。

搭建AWS S3

我们现在将使用Amazo Simple Storage Service(S3)作为我们registry/repository的存储层。我们将需要创建一个桶(bucket)以及用户凭证(user credentials)来允许我们的docker容器访问它。

登录到我们的AWS账号(如果没有,就申请一个http://aws.amazon.com/),在控制台选择S3(Simpole Storage Service)。

Linux:搭建一个私有的Docker registry
Linux:搭建一个私有的Docker registry

点击 Create Bucket,为你的桶输入一个名字(把它记下来,我们一会需要用到它),然后点击Create

Linux:搭建一个私有的Docker registry
Linux:搭建一个私有的Docker registry

OK!我们已经搭建好存储部分了。

设置AWS访问凭证

我们现在将要创建一个新的用户。退回到AWS控制台然后选择IAM(Identity & Access Management)。

Linux:搭建一个私有的Docker registry
Linux:搭建一个私有的Docker registry

在dashboard的左边,点击Users。然后选择 Create New Users

如图所示:

Linux:搭建一个私有的Docker registry
Linux:搭建一个私有的Docker registry

输入一个用户名(例如 docker-registry)然后点击Create。写下(或者下载csv文件)你的Access Key以及Secret Access Key。回到你的用户列表然后选择你刚刚创建的用户。

在Permission section下面,点击Attach User Policy。之后在下一屏,选择Custom Policy。

Linux:搭建一个私有的Docker registry
Linux:搭建一个私有的Docker registry

custom policy的内容如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SomeStatement",
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::docker-registry-bucket-name/*",
        "arn:aws:s3:::docker-registry-bucket-name"
      ]
    }
  ]
}

这个配置将允许用户(也就是regitstry)来对桶上的内容进行操作(读/写)(确保使用你之前创建AWS S3时使用的桶名)。总结一下:当你想把你的Docker镜像从你的本机推送到仓库中时,服务器就会将他们上传到S3。

安装registry

现在回过头来看我们的DO服务器,SSH登录其上。我们将要使用一个官方Docker registry镜像

输入如下命令,开启registry。

docker run
         -e SETTINGS_FLAVOR=s3
         -e AWS_BUCKET=bucket-name
         -e STORAGE_PATH=/registry
         -e AWS_KEY=your_aws_key
         -e AWS_SECRET=your_aws_secret
         -e SEARCH_BACKEND=sqlalchemy
         -p 5000:5000
         --name registry
         -d
         registry

Docker将会从Docker Hub上拉取所需的文件系统分层(fs layers)并启动守护容器(daemonised container)。

测试registry

如果上述操作奏效,你可以通过ping命令,或者查找它的内容来测试registry(虽然这个时候容器还是空的)。

我们的registry非常基础,而且没有提供任何“验明正身”的方式。因为添加身份验证可不是一件轻松事(至少我认为没有一种部署方法是简单的,像是为了证明你努力过似的),我觉得“查询/拉取/推送”仓库内容的最简单方法就是通过SSH通道的未加密连接(通过HTTP)。

打开SSH通道的操作非常简单:

ssh -N -L 5000:localhost:5000 root@your_registry.com

这条命令建立了一条从registry服务器(前面执行docker run命令的时候我们见过它)的5000号端口到本机的5000号端口之间的 SSH 管道连接。

如果你现在用浏览器访问 http://localhost:5000/v1/_ping,将会看到下面这个非常简短的回复。

{}

这个意味着registry工作正常。你还可以通过登录 http://localhost:5000/v1/search 来查看registry内容,内容相似:

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "username/first-repo"
    },
    {
      "description": "",
      "name": "username/second-repo"
    }
  ]
}

创建一个镜像

我们现在创建一个非常简单的Docker镜像,来检验我们新弄好的registry。在我们的本机上,用如下内容创建一个Dockerfile(这里只有一点代码,在下一篇文章里我将会展示给你如何将一个Rails应用绑定进Docker容器中。):

#  ruby 2.2.0 的基础镜像
FROM ruby:2.2.0
MAINTAINER Michelangelo Chasseur 

并创建它:

docker build -t localhost:5000/username/repo-name .

localhost:5000这个部分非常重要:Docker镜像名的最前面一个部分将告知docker push命令我们将要把我们的镜像推送到哪里。在我们这个例子当中,因为我们要通过SSH管道连接远程的私有registry,localhost:5000精确地指向了我们的registry。

如果一切顺利,当命令执行完成返回后,你可以输入docker images命令来列出新近创建的镜像。执行它看看会出现什么现象?

推送到仓库

接下来是更好玩的部分。实现我所描述的东西着实花了我一点时间,所以如果你第一次读的话就耐心一点吧,跟着我一起操作。我知道接下来的东西会非常复杂(如果你不自动化这个过程就一定会这样),但是我保证到最后你一定都能明白。在下一篇文章里我将会使用到一大波shell脚本和Rake任务,通过它们实现自动化并且用简单的命令实现部署Rails应用。

你在终端上运行的docker命令实际上都是使用boot2docker虚拟机来运行容器及各种东西。所以当你执行像docker push some_repo这样的命令时,是boot2docker虚拟机在与registry交互,而不是我们自己的机器。

接下来是一个非常重要的点:为了将Docker镜像推送到远端的私有仓库,SSH管道需要在boot2docker虚拟机上配置好,而不是在你的本地机器上配置。

有许多种方法实现它。我给你展示最简短的一种(可能不是最容易理解的,但是能够帮助你实现自动化)

在这之前,我们需要对 SSH 做最后一点工作。

设置 SSH

让我们把boot2docker 的 SSH key添加到远端服务器的“已知主机”里面。我们可以使用ssh-copy-id工具完成,通过下面的命令就可以安装上它了:

brew install ssh-copy-id

然后运行:

ssh-copy-id -i /Users/username/.ssh/id_boot2docker root@your-registry.com

用你ssh key的真实路径代替/Users/username/.ssh/id_boot2docker

这样做能够让我们免密码登录SSH。

现在我们来测试以下:

boot2docker ssh "ssh -o 'StrictHostKeyChecking no' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 root@registry.touchwa.re &" &

分开阐述:

  • boot2docker ssh允许你以参数的形式传递给boot2docker虚拟机一条执行的命令;
  • 最后面那个&表明这条命令将在后台执行;
  • ssh -o 'StrictHostKeyChecking no' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 root@registry.touchwa.re &是boot2docker虚拟机实际运行的命令;
    • -o 'StrictHostKeyChecking no'——不提示安全问题;
    • -i /Users/michelangelo/.ssh/id_boot2docker指出虚拟机使用哪个SSH key来进行身份验证。(注意这里的key应该是你前面添加到远程仓库的那个)
    • 最后我们将打开一条端口5000映射到localhost:5000的SSH通道。

从其他服务器上拉取

你现在将可以通过下面的简单命令将你的镜像推送到远端仓库:

docker push localhost:5000/username/repo_name

在下一篇文章中,我们将会了解到如何自动化处理这些事务,并且真正地容器化一个Rails应用。请继续收听!

如有错误,请不吝指出。祝你Docker之路顺利!


via: http://cocoahunter.com/2015/01/23/docker-2/

作者:Michelangelo Chasseur 译者:DongShuaike 校对:wxy

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

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

Linux:开放网络操作系统 ONOS Blackbird性能评估

目标

ONOS是一个网络控制器。applications通过intent APIs与ONOS进行交互。ONOS通过其南向适配层控制数据网络的转发(例如,openflow网络)。ONOS控制层与数据转发层之间是ONOS流 子系统,ONOS流子系统是将application intens转换为openflow流规则的重要组成部分。ONOS也是一个分布式系统,至关重要的是ONOS分布式架构使其性能随着集群数量增加而提 高。这份评估报告将ONOS看作一个整体的集群系统,计划从应用和操作环境两个角度去评估ONOS性能。

我们设计了一系列的实验,测试在各种应用和网络环境下ONOS的延迟和吞吐量。并通过分析结果,我们希望提供给网络运营商和应用开发商第一手资料去了解ONOS的性能。此外,实验的结果将有助于开发人员发现性能瓶颈并优化。 下图把ONOS分布式系统作为一个整体,介绍了关键的测试点。

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

图中包括如下性能测试点:

延迟:

  • A -交换机 连接/断开;
  • B -link启用/断开;
  • C -intent的批量安装/删除/路径切换;

吞吐量:

  • D -intent操作;
  • E -link事件(测试暂缓);
  • F –迸发流规则安装。

通用实验设置

集群规模性能测试: ONOS最突出的特点是其分布式架构。因此,ONOS性能测试的一个关键方面是比较和分析不同集群大小下ONOS的性能。所有的测试用例将以ONOS集群节点数量为1,3,5,7展开。

测试工具

为了展示ONOS的本质特征,使测试不受测试仪器的瓶颈限制,我们采用了一些比较实用的工具进行实验。所有实验,除了与Openflow协议交互的 交换机和端口及其它相关的,我们在ONOS的适配层部署了一套Null Providers与ONOS core进行交互。Null Providers担任着生成device,link,host以及大量的流规则的角色。通过使用Null Providers,我们可以避免并消除Openflow适配和使用真实设备或者模拟的Openflow设备所存在的潜在的性能瓶颈。

同时,我们也部署了一些负载生成器,这样可以使应用或者网络接口生成高强度的负载去触及ONOS的性能极限。 这些生成器包括: 1.Intent performance 生成器“onos-app-intent-perf”,它与intent API交互,生成intent安装/删除操作,并根据ONOS可承受的最高速度自我调节生成的Intent操作的负载。 2.流规则安装Python脚本工具与ONOS flow subsystem交互去安装和删除subsystem中的流规则。 3.Null LinkProvider中的link 事件(闪烁)生成器,可以迅速提升发送速度到ONOS所能承受的极限并依此速率发送link up/down信息给ONOS core。 4.此外,我们在”topology-events-metrics” 和”intents-events-metrics” 应用中利用计数器去获取关键事件的时间戳与处理速率来方便那些时间及速度相关的测试。

我们将在后续的每个不同的测试过程中详细介绍这些生成器的配置。

测试环境配置

A 7台 集群实验所需要的裸服务器。每个服务器的规格如下:

  • 双Intel Xeon E5-2670v2处理器为2.5GHz – 10核心/20超线程内核
  • 32GB1600MHz的DDR3 DRAM
  • 1Gbps的网络接口卡
  • Ubuntu的14.04 OS
  • 集群之间使用ptpd同步

ONOS软件环境

  • Java HotSpot(TM) (TM)64-Bit server VM; version 1.8.0_31
  • JAVA_OPTS=“${JAVA_OPTS: – Xms8G-Xmx8G}”
  • onos-1.1.0 snapshot:
  • a31e13471ee626abce2bc43c413fab17586f4fc3
  • 其他的具体与用例相关的ONOS参数将在具体的用例中进行说明

下面将具体介绍每个用例的细节配置,测试结果讨论及分析。

实验A&B – 拓扑(Switch,Link)发现时延测试

目标

本实验是测试ONOS控制器在不同规模的集群环境中是如何响应拓扑事件的,测试拓扑事件的类型包括:

1)交换机连接或断开ONOS节点

2)在现有拓扑中链路的up和down

ONOS作为一个分布式的系统架构,多节点集群相比于独立节点可能会发生额外的同步拓扑事件的延迟。除了限制独立模式下的延迟时间,也要减少由于onos集群间由于EW-wise通信事件产生额外延时。

配置和方法—交换机连接/断开的延迟

下面的图表说明了测试设置。一个交换机连接事件,是在一个“floating”(即没有交换机端口和链路)的OVS(OF1.3)上通过“set- controller”命令设置OVS桥连接到onos1控制器。我们在OF控制层面网络上使用tshark工具捕捉交换机上线的时间戳,ONOS Device和Graph使用“topology-event-metrics”应用记录时间戳。通过整理核对这些时间戳,我们得出从最初的事件触发到 ONOS在其拓扑中记录此事件的“端到端”的时序曲线。

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

所需得到的几个关键时间戳如下: 1.设备启动连接时间点t0,tcp syn/ ack;

2.OpenFlow协议的交换:

  • t0 -> ONOS Features Reply;
  • OVS Features Reply -> ONOS Role Request; (ONOS 在这里处理选择主备控制器);
  • ONOS Role Request -> OVS Role Reply –OF协议的初始交换完成。

3.ONOS core处理事件的过程:

  • OF协议交换完成后触发Device Event;
  • 本地节点的Device Event触发Topology (Graph) Event。

同样的,测试交换机断开事件,我们使用ovs命令“del-controller”断开交换机与它连接的ONOS节点,捕获的时间戳如下:

1.OVS tcp syn/fin (t0); 2.OVS tcp fin; 3.ONOS Device Event; 4.ONOS Graph Event (t1).

交换机断开端到端的延迟为(T1 – T0)

当我们增大ONOS集群的大小,我们只连接和断开ONOS1上的交换机,并记录所有节点上的事件时间戳。集群的整体延迟是Graph Event报告中最迟的节点的延时时间。在我们的测试脚本中,我们一次测试运行多个迭代(例如,20次迭代)来收集统计结果。

设置和方法—链路up/down的延迟

测试一条链接up / down事件的延迟,除了我们用两个OVS交换机创建链路(我们使用mininet创建一个简单的两个交换机的线性拓扑结构)外,我们使用了与交换机连接 测试的类似方法。这两个交换机的主控权属于ONOS1。参照下面的图表。初步建立交换机-控制器连接后,设置一个交换机的接口up或down,我们通过端 口up或down事件来触发此测试。 一些关键的时间戳记录,如下所述: 1. 交换机端口up/down, t0; 2. OVS向ONOS1发送OF PortStatus Update消息; 2a.在端口up的情况下,ONOS通过给每个OVS交换机发送链路发现消息来产生链路发现事件,同时ONOS收到其他交换机发送的Openflow PacketIn消息。

3.ONOS core处理事件过程: 由OF port status消息引起的Device事件; (ONOS处理) 链路down时,Link Event由Device Event触发在本地节点产生,链路up时,Link Event是在链路发现PacketIn/out完成后产生的;(主要时间都是在OFP消息和ONOS处理上) 本地节点生成Graph Event。(ONOS处理)

类似于交换机的连接测试,我们认为在Graph Event中登记的集群中最迟的节点的延时时间为集群的延迟。

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

结果

Switch-add Event:

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

Link Up/Down Event:

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

分析和总结

Switch Connect/Disconnect Event:

当一个交换机连接到ONOS时,明显的时延划分为以下几个部分: 1.链路发现的中时延最长的部分,是从最初的tcp连接到ONOS收到Openflow features-replay消息。进一步分析数据包(在结果图中未示出),我们可以看到大部分时间是花在初始化控制器与交换机的OpenFlow握手 阶段,ONOS等待OVS交换机响应它的features_request。而这个时延很大程度上不是由ONOS的处理引起的。

2.其次是在”OFP feature reply -> OFP role request”部分,这部分时延也会随着ONOS集群规模增加而增加,其主要花费在ONOS给新上线的交换机选择主控权上,这是由于单节点的ONOS只 需在本地处理,而多节点的集群环境中,集群节点之间的通信将会带来这个额外的延时

3.接着便是从OpenFlow握手完成(OFP role reply)到ONOS登记一个Device Event的过程中消耗的时延。这部分的时延也受多节点ONOS配置影响,因为此事件需要ONOS将其写入Device Store。 4.最后一个延时比较长的是ONOS在本地处理来着Device store的Device event到向Graph中注册拓扑信息事件的部分。

断开交换机时,随着ONOS集群规模的增大ONOS触发Device事件的时延将略有增加。

总之,在OpenFlow消息交换期间,OVS对feature-request的响应时延占据了交换机建立连接事件中,整体时延的绝大部分。接 着,ONOS花费约9毫秒处理主控权选。最后,ONOS在多节点集群环境下,由于各节点之间需要通信选举主节点,交换机上/下线时延将都会增加。

Link Up/Down Events:

此次测试,我们首先观察到的是,链路up事件比链路down事件花费更长的时间。通过时延分析,我们可以看到OVS的端口up事件触发了ONOS特 殊的行为链路发现,因此,绝大多数时延主要由处理链路发现事件引起。与单节点的ONOS相比这部分时延受集群节点的影响也比较大。另外,大多数ONOS core花费在向Graph登记拓扑事件上的时延在个位数的ms级别。

在大部分的网络操作情况下,虽然整体拓扑事件的低延迟是可以被容忍的,但是交换机/链路断开事件却至关重要,因为它们被更多的看作是 applications的adverse events。当ONOS能更快速的检测到link down/up事件时,pplications也就能更快速的响应此adverse events,我们测试的此版本的ONOS具有在个位数ms级发现switch/link down事件的能力。

实验C :intent install/remove/re-route延迟测试

目的

这组测试旨在得到ONOS当一个application安装,退出多种批大小的intents时的延迟特性(即响应时间)。

同时也得到ONOS路径切换事件的延时特性,即最短路径不可用,已安装的intent由于路径改变而需要重路由时所花费的时延。这是一个ONOS的 全方位系统测试,从ONOS的 NB API 经过intent 和flow subsystem 到ONOS的 SB API;采用Null Provider代替Openflow Adaptor进行测试。

这组测试结果将向网络运营商和应用开发者提供当operating intents时applications所期望的响应时间以及intents批的大小和集群数量的大小对时延的影响的第一手资料。

配置和方法—batch intent安装与退出

参考下图,我们用ONOS内置的app“push-test-intent”从ONOS1并通过ONOS1的intent API推进一个批的点对点intents。“push-test-intent”工具构造一系列的基于终点的,批大小和application id的intents。然后通过intent API 发送这些intents请求。当成功安装所有的intents时,返回延迟(响应时间)。随后退出这些intents并返回一个退出响应时间。当 intents请求被发送时,ONOS内部转换intents到流规则并写入相应的分布式存储来分发intents和流表。

参考下图,特别是我们的实验中,intents被构建在一个端到端的7个线性配置的交换机上,也就是说所有intents的入口是从S1的一个端口 和它们的出口是S7的一个端口。(我们使用在拓扑中额外的交换机S8进行intent re-route测试,这个测试后续描述)。我们通过Null Providers来构建交换机(Null Devices),拓扑(Null Links)和流量(Null Flows)。

当增大集群节点数量时,我们重新平均分配switch的主控权到各个集群节点。

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

在这个实验中,我们将使用如下指标来衡量ONOS性能:

  • 所有安装的intents是6hops点到点intents;
  • Intent批的大小:1,10,100,1000,5000 intents;
  • 测试次数:每个用例重复测试20次(4次预测试之后统计);
  • 集群规模大小从1到3,5,7个节点。

配置和方法–intent Re-route

同样参照上图,intent re-route延迟是一个测试ONOS在最短路径不可用的情况下,重新安装所有intents到新路径的速度。

测试顺序如下:

1.我们通过“push-test-intents -i”选项预安装不会自动退出的intents在线性最短路径上。然后我们通过修改Null Provider 链路定义文件模拟最短路径的故障。当新拓扑被ONOS发现时,我们通过检查ONOS 日志获取触发事件的初始时间戳t0;

2.由于 6-hop最短路径已不可用。ONOS切换到通过S8的7-hop备份路径。Intent和流系统响应该事件,退出旧intents并删除旧流表(因为ONOS当前实现,所有intents和流已不可重新使用)。

3.接下来,ONOS重新编译intents和流,并安装。在验证所有intents确实被成功安装后,我们从“Intents-events-metrics”捕获最后的intent安装时间戳(t1)。

4.我们把(t1-t0)作为ONOS 重路由intent(s)的延迟。

5.测试脚本迭代的几个参数: a. Intent初始安装的批大小:1,10,100,1000和5000 intents; b.每个测试结果统计的是运行20次的结果平均值(4个预测试之后开始统计); c. ONOS集群规模从1,到3,5,7节点。

结果

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

分析和总结

我们从这个实验中得出结论:

1.正如预期,与单节点的ONOS相比,多个节点的ONOS集群由于EW-wise通信的需要延迟比较大 2.小批intents(1-100),不计批大小时,其主要的延时是一个固定的处理时延,因此当批大小增大,每一个intent安装时间减少,这就是时延大批的优点。 3.批大小非常大的情况下(如5000),随着集群大小增加(从3到7),延迟减少,其主要是由于每个节点处理较小数量的intents; 4.Re-routeing延时比初始化安装和退出的延迟都小。

实验D:Intents Operation吞吐量

目标

本项测试的目的是衡量ONOS处理intents operations 请求的能力。SDN控制器其中一个重要用例就是允许agile applications通过intents和流规则频繁更改网络配置。作为一款SDN控制器,ONOS应该具有高水平的intents安装和撤销处理能 力。ONOS使用的分布式架构, 随着集群规模的增加,理应能够维持较高的intent operation吞吐量。

设置和方法

下图描述了测试方法:

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

本测试使用工具”intent-perf”来产生大量的Intents operation请求。这个intent-perf工具可以在ONOS集群环境中的任何一个节点激活并使用。这个工具在使用过程中有个三个参数需要配置:

  • numKeys – 唯一的intents数量, 默认 40,000;
  • cyclePeriod – intents安装和撤销的周期(时间间隔),默认 1000ms;
  • numNeighbors –程序运行时,发送到各个集群节点的方式。0表示本节点;-1表示所有的集群节点

当intent-perf在ONOS节点运行时,以恒定的速率产生大量的、ONOS系统可以支持的intents安装撤销请求。在ONOS 日志中或 cli request中,会周期性的给出总体的intents处理吞吐量。持续运行一段时间后,我们可以观察到在集群的某个或某些节点总体吞吐量达到了饱和状 态。总体吞吐量需要包含intents安装撤销操作。统计所有运行intent-perf这个工具的ONOS节点上的吞吐量并求和,从而得到ONOS集群 的总体吞吐量。

intent-perf只产生”1-hop” 的intents,即这些intents被编译而成的流表的出口和入口都是在同一个交换机上,所以Null providers模块不需要生成一个健全的拓扑结构。

特别是本实验中,我们使用两个相邻的场景。首先,设置numNeighbors = 0,这种场景下,intent-perf只需要为本地的ONOS节点产生的intents安装和撤销请求,从而把intents的东西向接口通信降至最 低;其次,设置numNeighbors 为-1后,intent-perf生成器产生的intents安装和撤销请求需要分发到所有的ONOS集群节点,这样会把东西向接口的通信量最大化。本次 测试持续进行了300秒的负载测试,统计集群的总体吞吐量。其他的参数使用默认值。

结果

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

分析和结论

通过本次实验得出结论如下: 1.我们看到在ONOS的intents operations测试中一个明显趋势:总体吞吐量随着集群节点的增加而增加; 2.在流表子系统测试中集群的场景对吞吐量的影响微乎其微。

实验F:Flow子系统迸发吞吐量测试

目的

如前面所提到的,流子系统是onos的一个组成部分,其作用是将Intents转换成可以安装到openflow交换机上的流规则。另外,应用程序 可以直接调用其北向api来注入流规则。使用北向api和intent框架是此次性能评估的关键。另外,此次实验不但给我们暴漏了端到端Intent performance的性能缺陷,而且展示了当直接与流规则子系统交互时对应用的要求。

配置及方法

为了产生一批将被onos安装删除的流规则,我们使用脚本“flow-tester.py”。实际上这些脚本是onos工具执行的一部分。具体位置 在($ONOS_ROOT/tools/test/bin)目录下。执行这个脚本将触发onos安装一套流规则到所控制的交换机设备,当所有流规则安装成 功之后将会返回一个时延时间。这个脚本也会根据接收的一系列的参数去决定这个测试怎么运行。这些参数如下:

  • 每个交换机所安装的流规则的数量
  • 邻居的数量-由于交换机的连接的控制器并非本地的onos节点,需要onos本地节点同步流规则到(除了运行脚本的onos本地节点之外的)onos节点
  • 服务的数量-运行onos脚本的节点数量,即产生流规则的onos节点数量

下图简要的描述了测试的配置:

从下图可以看出,onos1,onos2是运行onos脚本产生流规则的两个服务器;当两个流生成服务器生成流给两个邻居,也就是所生成的流规则被传递到两个与之相邻的节点安装。(因为这个流规则属于被邻居节点控制器的交换机)。

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

我们使用了Null Provider作为流规则的消费者,绕过了使用Openflow适配器和真实的或者模拟的交换机存在的潜在的性能限制。

具体实验参数设置

  • Null Devices的数量保持常量35不变,然后被平均的分配到集群中的所有节点,例如,当运行的集群中有5个节点,每个节点将控制7个Null Devices;
  • 集群一共安装122500条流规则-选择这个值其一是因为它足够大,其二,它很容易平均分配到测试中所使用的集群节点。这也是工具“flow-tester.py”计算每个交换机所安装的流规则数量的一个依据。
  • 我们测试了2个关联场景:1)邻居数量为0,即所有的流规则都安装在产生流的服务器上场景;2)邻居数量为-1,即每个节点给自己以及集群中的其它节点产生流规则
  • 测试集群规模1,3,5,7
  • 响应时间为4次预测试之后20次的的测试时间统计整合得出

备注:版本发布的时候,ONOS核心仍然采用Hazelcast作为存储协议来备份流规则。

实验表明,使用Hazelcast协议作为备份,可能导致流规则安装速率频繁迸发增长。

在这一系列实验中,我们通过修改发布版本如下路径的代码关闭了流规则备份。($ONOS_ROOT/core/store/dist/src /main/java/org/onosproject/store/flow/impl /DistributedFlowRuleStore.java)

Linux:开放网络操作系统 ONOS Blackbird性能评估
Linux:开放网络操作系统 ONOS Blackbird性能评估

分析与结论

通过测试,可以得出如下系统性能测试结论:

1.根据测试数据显示,当配置N=0时,与配置N=“all”相比,系统有更高的吞吐量。也就是说当生成的流规则只安装给本地ONOS节点控制器的 设备时,流子系统的性能比安装给所有ONOS节点控制的设备时高。因为,ONOS节点之间的EW-wise通信存在开销/瓶颈。即,当配置N=“all” 时,性能低,符合预期值。

2.总的来说,这两种情况下通过增大集群节点数量测试,吞吐量随着集群数量的增加有明显的提高。但是这种提高是非线性的。例如,N=“all”与N=“0”相比,当节点间需要通信同步时,平稳增加的性能趋于平缓。

3.设置N=“all”与N=“0”获得的类似的性能数据说明,EW-wise通信没有成为ONOS intent operation性能的瓶颈。

来源:http://www.sdnlab.com/11236.html

Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)

Budgie是为Linux发行版定制的旗舰桌面,也是一个定制工程。为思想前卫的用户设计,致力于简单和简洁。它的一个巨大优势是它不是别的项目的fork版本,是从都到尾都独立的。

Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)

Budgie桌面与GNOME栈紧密结合,使用先进的技术从而提供一个可选择的桌面体验。出于开源理念,这个桌面之后也能在别的Linux发行版中看到。

现在Budgie能够通过面板的设置达到和GNOME2桌面相似的使用体验。

0.8版的特点

  • 任务栏:支持应用锁定到任务栏
  • 任务栏:使用.desktop文件来配置quicklists菜单
  • 任务栏:使用.desktop文件来配置图标分辨率
  • 任务栏:支持有通知时蓝色闪烁
  • 面板:支持默认深色主体
  • 添加菜单条的小组件
  • 面板:自动隐藏菜单条和工具条(这配置为手动)
  • 面板:支持屏幕边缘处阴影
  • 面板:动态支持gnome面板主题
  • 运行对话框:虚拟刷新
  • Budgie菜单: 增加紧凑模式,并默认采用
  • Budgie菜单: 按照使用顺序排列菜单项
  • Budgie菜单: 移除旧的电源选项
  • 编辑器: 在UI中增加所有的菜单选项
  • 支持从GNOME 3.10 升级到3.16
  • wm: 关闭工作区的动画(v8之后)
  • wm: 改变壁纸时更好的动画

重要信息

  • Budgie 0.8版发行版目前只是beta
  • 无本地网络管理;可以通过使用ubuntu的小组件解决
  • Budgie 是为Evolve OS设计的,因此这个PPA可能会有bug
  • GNOME 主题比Ubuntu本地的主题效果更好
  • Ubuntu的滚动栏将不在工作
  • 如果你想了解的更多可以访问Evolve OS网站

安装

现在,我们将在Ubuntu14.04 LTS中安装我们自己的轻量级Budgie桌面。首先,我们要把PPA源添加到我们的Ubuntu中。执行以下命令:

$ sudo add-apt-repository ppa:evolve-os/ppa
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)

添加完ppa之后,运行下面的命令更新本地软件仓库。

$ sudo apt-get update

然后只要执行下面的命令安装

$ sudo apt-get install budgie-desktop
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)

注意

这是一个活跃的开发版本,一些主要的功能可能还不是特别的完善,如:没有网络管理器,没有音量控制组件(可以使用键盘控制),无通知系统并且无法将app锁定到任务栏。

有一个临时解决方案可以禁用叠加滚动栏:设置另外一个默认主题,然后从终端退出当前会话:

$ gnome-session-quit
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)

登录Budgie会话

安装完成之后,我们能在登录时选择进入budgie桌面。

Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)
Linux:如何在ubuntu14.04上安装轻量级的Budgie桌面(v8)

注销当前用户

$ budgie-sessioon --logout

结论

嗨,现在我们已经成功的在 Ubuntu 14.04 LTS 上安装了轻量级 Budgie 桌面环境。Budgie桌面当前正在开发过程中,因此有目前有很多功能的缺失。虽然它是基于Gnome 的 GTK3,但不是完全的复制。Budgie是完全从零开始实现,它的设计是优雅的并且正在不断的完善。如果你有任何问题、评论,请在下面的评论框发表。愿你喜欢 Budgie 桌面 0.8 。


via: http://linoxide.com/ubuntu-how-to/install-lightweight-budgie-v8-desktop-ubuntu/

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

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

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

Linux:在 Linux 中用 nmcli 命令绑定多块网卡

今天,我们来学习一下在 CentOS 7.x 中如何用 nmcli(Network Manager Command Line Interface:网络管理命令行接口)进行网卡绑定。

网卡(接口)绑定是将多块 网卡 逻辑地连接到一起从而允许故障转移或者提高吞吐率的方法。提高服务器网络可用性的一个方式是使用多个网卡。Linux 绑定驱动程序提供了一种将多个网卡聚合到一个逻辑的绑定接口的方法。这是个新的实现绑定的方法,并不影响 linux 内核中旧绑定驱动。

Linux:在 Linux 中用 nmcli 命令绑定多块网卡
Linux:在 Linux 中用 nmcli 命令绑定多块网卡

网卡绑定为我们提供了两个主要的好处:

  1. 高带宽
  2. 冗余/弹性

现在让我们在 CentOS 7 上配置网卡绑定吧。我们需要决定选取哪些接口配置成一个组接口(Team interface)。

运行 ip link 命令查看系统中可用的接口。

 $ ip link

ip link

这里我们使用 eno16777736eno33554960 网卡在 “主动备份” 模式下创建一个组接口。(译者注:关于不同模式可以参考:多网卡的7种bond模式原理)

按照下面的语法,用 nmcli 命令为网络组接口创建一个连接。

# nmcli con add type team con-name CNAME ifname INAME [config JSON]

CNAME 指代连接的名称,INAME 是接口名称,JSON (JavaScript Object Notation) 指定所使用的处理器(runner)。JSON 语法格式如下:

'{"runner":{"name":"METHOD"}}'

METHOD 是以下的其中一个:broadcast、activebackup、roundrobin、loadbalance 或者 lacp

1. 创建组接口

现在让我们来创建组接口。这是我们创建组接口所使用的命令。

 # nmcli con add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'

nmcli con create

运行 # nmcli con show 命令验证组接口配置。

# nmcli con show

显示组接口

2. 添加从设备

现在让我们添加从设备到主设备 team0。这是添加从设备的语法:

# nmcli con add type team-slave con-name CNAME ifname INAME master TEAM

在这里我们添加 eno16777736eno33554960 作为 team0 接口的从设备。

# nmcli con add type team-slave con-name team0-port1 ifname eno16777736 master team0
# nmcli con add type team-slave con-name team0-port2 ifname eno33554960 master team0

添加从设备到 team

再次用命令 #nmcli con show 验证连接配置。现在我们可以看到从设备配置信息。

#nmcli con show

显示从设备配置

3. 分配 IP 地址

上面的命令会在 /etc/sysconfig/network-scripts/ 目录下创建需要的配置文件。

现在让我们为 team0 接口分配一个 IP 地址并启用这个连接。这是进行 IP 分配的命令。

# nmcli con mod team0 ipv4.addresses "192.168.1.24/24 192.168.1.1"
# nmcli con mod team0 ipv4.method manual
# nmcli con up team0

分配 ip

4. 验证绑定

#ip add show team0 命令验证 IP 地址信息。

#ip add show team0

验证 ip 地址

现在用 teamdctl 命令检查 主动备份 配置功能。

# teamdctl team0 state
Linux:在 Linux 中用 nmcli 命令绑定多块网卡
Linux:在 Linux 中用 nmcli 命令绑定多块网卡

现在让我们把激活的端口断开连接并再次检查状态来确认主动备份配置是否像希望的那样工作。

# nmcli dev dis eno33554960

断开激活端口连接

断开激活端口后再次用命令 #teamdctl team0 state 检查状态。

# teamdctl team0 state
Linux:在 Linux 中用 nmcli 命令绑定多块网卡
Linux:在 Linux 中用 nmcli 命令绑定多块网卡

是的,它运行良好!!我们会使用下面的命令连接回到 team0 的断开的连接。

#nmcli dev con eno33554960

nmcli dev 连接断开的连接

我们还有一个 teamnl 命令可以显示 teamnl 命令的一些选项。

用下面的命令检查在 team0 运行的端口。

# teamnl team0 ports

teamnl 检查端口

显示 team0 当前活动的端口。

# teamnl team0 getoption activeport

显示 team0 活动端口

好了,我们已经成功地配置了网卡绑定 🙂 ,如果有任何反馈,请告诉我们。


via: http://linoxide.com/linux-command/interface-nics-bonding-linux/

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

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

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

Linux:在 FreeBSD 10.1中安装 Mate 桌面

Linux:在 FreeBSD 10.1中安装 Mate 桌面
Linux:在 FreeBSD 10.1中安装 Mate 桌面

FreeBSD是全文本模式的系统,然而有些新用户想要使用GUI桌面环境。这个教程就是帮助你在Freebsd 10.1中安装Mate桌面。

下面是我的系统细节:

root@Freebsd-unixmen:~ # uname -a
FreeBSD Freebsd-unixmen 10.1-RELEASE FreeBSD 10.1-RELEASE #0 r274401: Tue Nov 11 21:02:49 UTC 2014     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
root@Freebsd-unixmen:~

要在FreeBSD 10.1 中开始安装Mate桌面,按照下面的步骤。

pkg install xf86-video-fbdev mate-desktop mate xorg

在 /etc/rc.conf 中加入下面的行

moused_enable="YES"
dbus_enable="YES"
hald_enable="YES"

测试安装

xinit mate-session
Linux:在 FreeBSD 10.1中安装 Mate 桌面
Linux:在 FreeBSD 10.1中安装 Mate 桌面

Mate本身没有显示管理器。因此我们会使用其他的显示管理器如XDM、GDM、slim等等来作为登录管理器。这里让我们看看如何在Mate桌面中配置Slim DM

安装 Slim

pkg install slim

/etc/rc.conf中加入下面的行:

slim_enable="YES"

在用户的家目录下的.xinitrc文件加入下面的行。

exec mate-session

重启电脑。现在在你登录Mate时就会进入Slim登录界面了。

Linux:在 FreeBSD 10.1中安装 Mate 桌面
Linux:在 FreeBSD 10.1中安装 Mate 桌面
Linux:在 FreeBSD 10.1中安装 Mate 桌面
Linux:在 FreeBSD 10.1中安装 Mate 桌面

就是这样。干杯!


via: http://www.unixmen.com/install-mate-desktop-freebsd-10-1/

作者:M.el Khamlichi 译者:geekpi 校对:wxy

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

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

Linux:大型网站的 HTTPS 实践(一): HTTPS 协议和原理

1 前言

百度已经于近日上线了全站 HTTPS 的安全搜索,默认会将 HTTP 请求跳转成 HTTPS。本文重点介绍 HTTPS 协议, 并简单介绍部署全站 HTTPS 的意义。

Linux:大型网站的 HTTPS 实践(一): HTTPS 协议和原理
Linux:大型网站的 HTTPS 实践(一): HTTPS 协议和原理

2 HTTPS 协议概述

HTTPS 可以认为是 HTTP + TLS。HTTP 协议大家耳熟能详了,目前大部分 WEB 应用和网站都是使用 HTTP 协议传输的。

TLS 是传输层加密协议,它的前身是 SSL 协议,最早由 netscape 公司于 1995 年发布,1999 年经过 IETF 讨论和规范后,改名为 TLS。如果没有特别说明,SSL 和 TLS 说的都是同一个协议。

HTTP 和 TLS 在协议层的位置以及 TLS 协议的组成如下图:

Linux:大型网站的 HTTPS 实践(一): HTTPS 协议和原理
Linux:大型网站的 HTTPS 实践(一): HTTPS 协议和原理

图 1 TLS 协议格式

TLS 协议主要有五部分:应用数据层协议,握手协议,报警协议,加密消息确认协议,心跳协议。

TLS 协议本身又是由 record 协议传输的,record 协议的格式如上图最右所示。

目前常用的 HTTP 协议是 HTTP1.1,常用的 TLS 协议版本有如下几个:TLS1.2, TLS1.1, TLS1.0 和 SSL3.0。其中 SSL3.0 由于 POODLE 攻击已经被证明不安全,但统计发现依然有不到 1% 的浏览器使用 SSL3.0。TLS1.0 也存在部分安全漏洞,比如 RC4 和 BEAST 攻击。

TLS1.2 和 TLS1.1 暂时没有已知的安全漏洞,比较安全,同时有大量扩展提升速度和性能,推荐大家使用。

需要关注一点的就是 TLS1.3 将会是 TLS 协议一个非常重大的改革。不管是安全性还是用户访问速度都会有质的提升。不过目前没有明确的发布时间。

同时 HTTP2 也已经正式定稿,这个由 SPDY 协议演化而来的协议相比 HTTP1.1 又是一个非常重大的变动,能够明显提升应用层数据的传输效率。

3 HTTPS 功能介绍

百度使用 HTTPS 协议主要是为了保护用户隐私,防止流量劫持。

HTTP 本身是明文传输的,没有经过任何安全处理。例如用户在百度搜索了一个关键字,比如“苹果手机”,中间者完全能够查看到这个信息,并且有可能打电话过来骚扰用户。也有一些用户投诉使用百度时,发现首页或者结果页面浮了一个很长很大的广告,这也肯定是中间者往页面插的广告内容。如果劫持技术比较低劣的话,用户甚至无法访问百度。

这里提到的中间者主要指一些网络节点,是用户数据在浏览器和百度服务器中间传输必须要经过的节点。比如 WIFI 热点,路由器,防火墙,反向代理,缓存服务器等。

在 HTTP 协议下,中间者可以随意嗅探用户搜索内容,窃取隐私甚至篡改网页。不过 HTTPS 是这些劫持行为的克星,能够完全有效地防御。

总体来说,HTTPS 协议提供了三个强大的功能来对抗上述的劫持行为:

1,  内容加密。浏览器到百度服务器的内容都是以加密形式传输,中间者无法直接查看原始内容。

2,  身份认证。保证用户访问的是百度服务,即使被 DNS 劫持到了第三方站点,也会提醒用户没有访问百度服务,有可能被劫持

3,  数据完整性。防止内容被第三方冒充或者篡改。

那 HTTPS 是如何做到上述三点的呢?下面从原理角度介绍一下。 

来源:http://op.baidu.com/2015/04/https-s01a01/

Linux:百度全站 https FAQ

你注意到了吗?百度已经全站实现 https 了! 

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

百度从 14 年开始对外开放了 https 的访问,并于 3 月初正式对全网用户进行了 https 跳转。

你也许会问,切换就切换呗,和我有啥关系?我平常用百度还不是照常顺顺当当的,没感觉到什么切换。

话说,平常我们呼吸空气也顺顺溜溜的,没有什么感觉,但要是没有了空气,那就没法愉快的生活了。https 对于互联网安全的重要性,正如空气对于我们人类的重要性一样。百度全站切换到 https 之后,我们才可以愉快的搜索,愉快的上网。

https 究竟是如何实现让我们更加安全呢,让百度技术宅来个深度揭秘:

问题 1:https 是什么?我有没有用到 https?

https 是 http over ssl(Secure Socket Layer),简单讲就是 http 的安全版本,在 http 的基础上通过传输加密和身份认证保证了传输过程中的安全性。你通常访问的网站大部分都是 http 的,最简单的方法可以看看网址是以 http:// 开头还是https://  开头。

以下几个截图就是 chrome,firefox,IE10 在使用 https 时的效果。

PIC1

注意图中绿色的部分, 我们后面详细说说。

想进一步了解 HTTPS,可以阅读《大型网站的 HTTPS 实践(一)– HTTPS 协议和原理》

问题 2:https 为什么比 http 安全?https 加密是不是需要我在电脑上安装证书 / 保存密码?

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

不带“s”的 http 不安全,主要是因为它传输的是明文内容, 也不对传输双方进行身份验证。只要在数据传输路径的任何一个环节上,都能看到传输的内容,甚至对其进行修改。例如一篇文章”攻下隔壁女生路由器后, 我都做了些什么”中,很多攻击的环节,都是通过分析 http 的内容来进行。而在现实生活中呢,你很有可能泄露你的论坛高级会员账号 / 密码,游戏 vip 账号 / 密码,隐私的聊天内容,邮件,在线购物信息,等等。实在是太可怕的有木有!

https 之所以安全,是因为他利用 ssl/tls 协议传输。举个简单的例子,电影风语者中,美军发现密码经常被日本窃听和破解,就征召了 29 名印第安纳瓦霍族人作为译电员,因为这语言只有他们族人懂。即使日本人窃听了电文,但是看不懂内容也没用;想伪造命令也无从下手,修改一些内容的话,印第安人看了,肯定会说看(shen)不(me)懂(gui)。看到这里,你肯定发现了,这是基于两边都有懂这个语言(加密解密规则)的人才行啊,那么我的电脑上需要安装什么密钥或者证书吗?一般情况作为普通用户是不用考虑这些的,我们有操作系统,浏览器,数学家,安全和网络工程师等等, 帮你都做好了, 放心的打开浏览器用就好啦。

如果你实在好奇,想知道双方不用相同的密钥如何进行加密的,可以搜索下”公钥加密”(非对称加密),”RSA”,” DH 密钥交换”, “ssl 原理” “数字证书”等关键词。

有朋友会想了,不就是加密吗,我 wifi 密码都能破,找个工具分分钟就破解了。这个想法可不对, 虽然没有绝对的安全,但是可以极大增加破解所需要的成本,https 目前使用的加密方式是需要巨大的计算量(按照目前计算机的计算能力)才可能破解的,你会用世界上最强的超级计算机花费 100 年(只是一个比喻)去解密,看看 100 年前隔壁老王在百度上搜什么吗。 

问题 3:百度为什么要上 https?

我们每天会处理用户投诉,比如说:

页面出现白页 / 出现某些奇怪的东西

返回了 403 的页面

搜索不了东西

搜索 url 带了小尾巴, 页面总要闪几次

页面弹窗广告

搜索个汽车就有人给我打电话推销 4s 店和保险什么的

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

各种千奇百怪的情况碰到过的请举手。

查来查去,很大一部分原因是有些坏人在数据的传输过程中修改百度的页面内容,窃听用户的搜索内容。悄悄告诉你,https 就是能解决这样问题的技术哦, 赶紧把浏览器首页改成https://www.baidu.com吧。

从方向上来说,HTTPS 也是未来的趋势,目前大家使用的 HTTP 还是 1.1/1.0 版本的,新的 HTTP2.0 版本的标准已经发布了。标准中涉及了加密的规范,虽然标准中没有强制使用,但是已经有很多浏览器实现声称他们只会支持基于加密连接的 HTTP2.0(https://http2.github.io/faq/#does-http2-require-encryption)。

问题 4:https 不就是在 http 后面加个 s,很难么?

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

 

难,又不难。

它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer 传递等等等等。反正我指头肯定不够数。

对于一个超小型个人站点来说,技术宅 1 天就能搞定从申请证书到改造完成。如果是从零开始建设,会更容易。但是对于百度搜索这种大胖纸来说,可就难了。

  1. 它一开始并不是为 https 设计的
  2. 内容丰富(内容本身的表现形式很多:图片,视频,flash,form 等等),种类丰富 (页面上除了自然结果,有视频,图片,地图,贴吧,百科 , 第三方的内容, app 等等)。
  3. 数据来源复杂,有几十个内部产品线的内容,几百个域名,成千上万个开发者的内容
  4. 百度在全国,甚至世界范围都有很多 idc 和 cdn 节点,都得覆盖到。
  5. 还不能因此拖慢了百度的速度 (国内使用 https 的银行, 在线交易的站点,有没有觉得很慢?)
  6. 上 https 本来就是为了更好的体验,可不能导致大家使用不稳定。

想了解更详细的内容,可以阅读《大型网站的 HTTPS 实践(四)– 协议层以外的实践 [1]》

Google 部署 https 花费了 1-2 年,13 年将证书从 1024 位升级到 2048 位花了 3 个月。百度也是去年就开放了入口和小流量,但是今年 3 月才进行全量上线,可以想像整体的复杂性。 

问题 5:如何看待百度搜索支持全站 https?

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

国外的几个大型站点都 https 化了,这是未来互联网的趋势 (有兴趣的同学可以搜索下’http/2’ )。

对百度自身来说,https 能够保护用户体验,减少劫持 / 隐私泄露对用户的伤害。

很多人会有疑惑,我没有被劫持,百度上 https 有什么作用,反而让我变慢了一些。从我们的第一手数据可以看到,劫持的影响正越来越大,在法制不健全的环境下,它被当成一个产业,很多公司以它为生,不少以此创业的团队还拿到了风投。等它真正伤害到你的时候,你可能又会问我们为什么不做些什么。所以,我们宁愿早一些去面对它。

https 在国内的大型站点目前还只用在部分账户的登陆和支付等环节。百度也是国内第一个全站 https 的大型站点,它的用户非常多,流量也很大。百度能够上线 https 会打消大家的疑虑,对其他国内的站点是很好的示范,这个带头作用会显著加速国内互联网 https 的进程,有助于中国互联网的网络安全建设。百度作为搜索引擎,是流量的入口和分发的渠道,后续如果对 https 的站点内容的抓取,标记,权值倾斜,那么更能引导互联网的网站向 https 进行迁移。 

问题 6:https 慢不慢?

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

繁重的计算和多次交互天然的影响了 https 的访问速度。。如果什么优化都不做,https 会明显慢很多。在百度已经进行过很多速度优化的条件下,如果站点本身已经做过常规优化,但是不针对 https 做优化,这种情况下我们实测的结果是 0.2-0.4 秒耗时的增加。如果是没有优化过的站点,慢 1 秒都不是梦。至于现在慢不慢呢,大家已经体验了这么多天了,有感觉吗?

答案:A 慢死了,你们在做啥?  B 有些慢啊  C 还行, 基本无感  D 啥, 我已经用了 https 了?

是不是选的 C 或者 D?喂喂,选 A 的那位 你打开别的网站慢么, 以前没有上 HTTPS 的时候慢么。。。隔壁老王在蹭你网呢。

所以,不是慢,是没有优化。

问题 7:https 耗性能吗?

PIC7

答案是,握手的时候耗,建好连接之后就不太耗了。按照目前加密强度的计算开销,服务器支撑握手性能会下降 6-8 倍,但是如果建立好连接之后,服务器就几乎可能撑住打满网卡的 https 流量了。所以连接复用率的提升和计算性能的优化都是重点。可以阅读《大型网站的 HTTPS 实践(三)– 基于协议和配置的优化》

问题 8:劫持有些什么样的途经?

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

你的电脑,你设置的 dns,你的浏览器,你用的网络,都有可能被劫持。

简单和大家介绍下运营商的内容劫持是如何进行的,运营商会分析你的网络请求,它可以先于网站回包,也能修改数据包的内容。所以它可以让你跳转一次,在网址上加上小尾巴,也能在你访问的页面弹出小广告。

感兴趣的话,还可以通过这篇文章看看你的电脑如何被 lsp 劫持的《暗云木马》 

问题 9:https 解决了所有劫持问题吗?

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

俗话说有终有始,我们来说一说文章开始说的浏览器上的绿色标记。它标志着这个安全连接可信赖的级别。绿色通常是好的,黄色则是说明有些不安全,例如在 https 的页面中加载了 http 的资源,这样 http 的资源还是有被劫持的风险。

其实客户端,局域网的风险也很大,恶意插件,木马可以做很多事情,你使用的路由器,DNS 也比较脆弱。如果某个大型网站被标记为了红色,那你就更要小心了 (当然也可能是某个猴子忘记了续费替换证书,导致证书过期了),你有可能遭受了 ssl 劫持 (中间人攻击的一种),特别是遇到如下图提示的时候(访问一些自己签名的站点也会有类似的提示)。中间人攻击还有其他种类的,比如代理你的通信让你退化 http, 还可以利用注入根证书,可以让你浏览器还是绿色的标记,就问你怕不怕?

Linux:百度全站 https FAQ
Linux:百度全站 https FAQ
Linux:百度全站 https FAQ
Linux:百度全站 https FAQ

还是那句话,没有绝对的安全,但是我们可以尽量降低风险。

https 能够在绝大部分情况下保证互联网访问数据传输的安全,这是目前我们力所能及的工作。

问题 10:我应该如何更爽更快切换到 https?

如此强悍有用的 https,我也想体验,在安全的互联网世界中翱翔,那么我该怎么做呢?

实际上你不需要动手,百度的攻城狮已经体贴的帮你做到了。现在访问百度试试,我们已经自动切换到 https 了,再也不用担心隐私泄露的问题,赶紧来体验吧!

另外以下一些技巧能有让 https 有更好的性能哦:

1 使用更高端大气上档次的浏览器(最好是非 IE 系列的,比如 chrome,firefox,safari 浏览器,或者百度等双核浏览器的极速模式。

2 把浏览器首页或者收藏夹的百度 url 也换为 https://www.baidu.com ,可以让你有更快更好的体验。

3 如何将百度设置成首页? 这里有详细的教程哦 http://www.baidu.com/cache/sethelp/help.html 

来源:http://op.baidu.com/2015/04/https-faq/

Linux:文本三巨头:zsh、tmux 和 vim

罗马三巨头

公元前62年,凯撒 组建了一个包含了他自己, 政治家克拉苏,以及军事领袖庞培三人的政治联盟。 这三个人一起组成了一个秘密政治小组,称为 Triumvirate(三巨头),来统治罗马共和国。 而文本三巨头则是 zshvim 和 tmux。 这三个令人尊敬的工具本身已经非常强大,然而它们的组合却更加所向披靡,把其他文本编辑组合甩开了 N 条街。本文旨在向刚接触各类工具的新手们简述如何建立一个既强大又容易配置的文本三巨头。我想把主要的篇幅放在如何将 zsh、vim 和 tmux 整合起来,并主要讲述了我如何解决两个常见的问题——复制/粘贴功能和颜色配置。

Linux:文本三巨头:zsh、tmux 和 vim
Linux:文本三巨头:zsh、tmux 和 vim

(题图来自:deviantart.net)

我的愚见

Rands一样,我对工具非常痴狂。我认为文本三巨头是最强大的文本编辑的工具链。如果你不使用这个工具链,那么我会建议你先干了这杯酒,然后尝试使用文本三巨头。如果你每天花费大量的时间在文本中纠缠,那么你更应该接受我的建议。一开始换工具或许会有些不习惯,但是你的努力会得到回报的。使用 zsh、vim 和 tmux 的好处就在于免费使用,速度快,可任意定制,在任何操作系统上都能使用,可在远程环境中使用,还在于可以实现远程结对编程,以及互相之间,和与 Unix 之间深度的整合。最终纯文本编辑的效率和组织性将会得到很大提升。该工具链可以完全由 git 管理,并且可以再几秒钟的时间内克隆到一台远程服务器或是一台新的机器上。总的来说,它们的这些优点让使我在写作和编程上变得更快,更有效率。

文本三巨头的一个巨大的优势在于对用于管理工作环境的分屏模型的普遍使用。分屏模型管理允许tmux像粘合剂一样组织工作流。通常在一天的结尾,我会发现我留下了一些shell窗口和一大堆的临时文件,数据文件,源代码文件,文档文件,还有打开的数据库。把这些窗口一个个关掉然后第二天再把它们打开是非常痛苦的一件事。tmux和vim支持对一个特定的项目打开大量的窗格和窗口,如果你希望转换到另一个完全不同的项目,你可以从这些窗口分离出来转向另外一个项目,然后再按原样返回这些窗口。在一时间段内,我通常同时在多个工作和个人的项目上进行工作。在多个工作环境中来回切换的能力对我来说非常重要。(Thoughtbot blog 中有对 tmux 中窗口和窗格的使用的讲解)

下面是——包装在tmux中的zsh和vim:

Linux:文本三巨头:zsh、tmux 和 vim
Linux:文本三巨头:zsh、tmux 和 vim

该tmux会话中有三个分别命名为demo、docs和scatch的窗口,然而在截图中只有最上面的窗口是可见的。在这个窗口中有四个分区。左上角的分区是一个zsh窗口,左下角的分区是一个交互的python会话,右上角的窗格是用vim打开的python代码,然后右下角是包含markdown文档的窗格。

外观设置

我建议给文本三巨头设置两种颜色主题——一个主题给工作上的项目而另外一个给个人项目。我是情景依赖记忆的重度使用者,因此使用两个主题在认识和区分工作项目和个人项目上给予我很大的帮助。如图,下面是我的个人主题(左),以及工作主题(右)。两个主题都是Ethan Schoonover 的solarized 项目中的版本。我在玩的时候使用暗调主题,是因为我通常在清晨或傍晚天空还处在黑暗中时搞自己的项目。暗调主题可以在这些时候让我的眼睛得到舒缓。关于字体,我用的是 14 point 的 Inconsolata

Linux:文本三巨头:zsh、tmux 和 vim
Linux:文本三巨头:zsh、tmux 和 vim

安装

首先要做的事将大写锁定键(Caps Lock)重映射到Control 键上。大写锁定键是个历史遗留问题,这个在键盘上的黄金位置的键需要被更好的利用。在tmux中对Control键的使用非常频繁,因此将Control键重映射到一个符合人体工程学的位置对我们很有帮助。

想要给三巨头创建一个强大的工作环境,我们可以下载 iTerm2 终端模拟器。iTerm2 比普通的终端应用具有更强的性能,更多的特性和更灵活的定制化。当你开始使用iTerm2时,请回头阅读全部文档看看它能为你做什么。其中一个特性是Command-?,显示出一个视窗帮助你快速地找到你当前的光标位置。大部分iTerm2非常酷炫的功能本文都没有提及。请确保你了解了iTerm2的即时回放,正则查询,点击打开URL,以及标记跳转的功能。

当iTerm2安装完成,即可添加亮调和暗调主题。solarized 库中含有iTerm2调色板和 配置iTerm2主题的说明,所以它的安装简洁明了。另一项对使用iTerm2有用的配置是启用系统级别的绑定键,通过该键可以让iTerm2转为最前面的窗口。我发觉设置一个具体的绑定比使用应用切换器(Command-Tab)要快的多。该设置在Preferences > Keys中,而我使用的绑定键是Option-t。关于自定义,我还有一个建议,那就是在 Profiles > Terminal > Notifications中撤销选中iTerm2 的响铃声。

由于文本三巨头的操作高度集中在键盘上,因此,在你配置和形成自己的肌肉记忆之前,将iTerm, zsh, vim, tmux,和其他任何你之前使用的工具之间的快捷键冲突消除是非常明智的选择。做窗口移动时,我使用Option 键。Option-t将iTerm2移到屏幕前,而Option-i将Twitter移到屏幕前,等等。我还使用Moom 作为我在OS X上的平铺式窗口管理器,并将所有的快捷键配置为使用Option 键将窗口移至屏幕上特定的展示窗口或位置上。

接下来,安装Homebrew 然后使用它去安装git,MacVim,tmux和reattach-to-user-namespace(返回用户命名空间)。安装MacVim有两个原因。第一,默认的OS X自带的vim似乎对很多人来说很慢。我发现使用MacVim中的vim比OS X版本的vim要快很多。另外一个安装MacVim的好处是你的系统将得到一个更新版本的vim。第二个原因则是复制/粘贴的使用在OS X版本的vim中并没有得到优化。

安装完git,就可以新建一个存储库来放置文本三巨头的设置文件。我的存储库命名为dotfiles 并存储了我的所有zsh, vim, and tmux配置文件。如果你不知道怎么为你的文件设置版本控制,请阅读Pro Git 或者 Git Immersion

ZSH

已经有很多文章写到了如何使用zsh以及为什么zsh比bash强大。基本上,bash有的功能zsh都有,而且zsh的一些特性bash是没有的。我使用zsh而不是bash是因为它有扩展的globbing(通配符),更好用的tab补全,内建的拼写纠正,一个更好的计算器(zcalc),以及一个内建的批重命名文件工具(zmv)。zsh的另外一个杀手级特色是oh-my-zsh——一个zsh的社区驱动的框架。oh-my-zsh预先打包好了很不错的主题,插件,以及让zsh极度强大的配置。如果你想学习本文的话,请安装iTerm2并将zsh作为你的默认shell。

我将我的 .zshrc、 .vimrc 和 .tmux.conf 配置文件保存在 dotfiles 目录中,并用 symlink 在 home 目录下创建链接。这样我就能只在一个目录里做zsh、vim 和tmux的配置的版本控制了。文本三巨头使用了vim,那么我们应该让zsh和tmux也使用vim以及它的绑定键并将vim设置为默认编辑器。将下面的文本加到.zshrc文件中,让zsh支持vim:

export EDITOR="vim"
bindkey -v
# vi style incremental search
bindkey '^R' history-incremental-search-backward
bindkey '^S' history-incremental-search-forward
bindkey '^P' history-search-backward
bindkey '^N' history-search-forward

zsh不仅支持大多数bash命令,还支持更多的智能命令。比如,如果你想在bash中移动到一个目录里,你可能会输入cd foo。而在zsh中如果你将下面一行加入到.zshrc中,你只需要输入foo即可。

setopt AUTO_CD

为了设置一个好的命令行提示,我参考了Steve Losh’s excellent prompt然后做了一些小改动。只需要简单地在oh-my-zsh/themes/中创建一个新的主题文件并在你的zshrc文件中添加一行对应你的主题文件的文本(ZSH_THEME=bunsen)。这是我的修改后的Steve的命令行提示:

function virtualenv_info {
    [ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') '
}
function box_name {
    [ -f ~/.box-name ] && cat ~/.box-name || hostname -s
}
PROMPT='
%{$fg[magenta]%}%n%{$reset_color%} at %{$fg[yellow]%}$(box_name)%{$reset_color%} in %{$
fg_bold[green]%}${PWD/#$HOME/~}%{$reset_color%}$(git_prompt_info)
$(virtualenv_info)%(?,,%{${fg_bold[blue]}%}[%?]%{$reset_color%} )$ '
ZSH_THEME_GIT_PROMPT_PREFIX=" on %{$fg[magenta]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[green]%}!"
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[green]%}?"
ZSH_THEME_GIT_PROMPT_CLEAN=""
local return_status="%{$fg[red]%}%(?..⤬)%{$reset_color%}"
RPROMPT='${return_status}%{$reset_color%}'

VIM

下面我会将注意力放在vim与文本三巨头的整合而不是vim本身。为了将solarized整合到vim中,你需要安装vim solarized plugin然后将下面的内容放到你的vimrc里:

syntax enable
let g:solarized_termtrans = 1
colorscheme solarized
togglebg#map("")

终端中的颜色管理会比较复杂。在我的系统中,为了在终端的vim中得到合适的颜色渲染,我特地加了let g:solarized_termtrans = 1。Solarized 提供了内建后台函数,让你可以使用在亮调和暗调主题之间切换,因此如果你需要这个功能就需要加上上面的内容的最后一行。你还可以在vim里运行:set background=dark 或者 :set background=light去实现同样的功能。

vim对复制/粘贴的处理跟基于GUI的文本编辑器有些不同。vim有许多复制寄存器和一些粘贴模式,而不是一个单一的复制/粘贴机制。我向我的vimrc里添加了下列内容,使复制/粘贴机制更加直观。

" Yank text to the OS X clipboard" 将文本复制到OS X剪贴板中
noremap y "*y
noremap yy "*Y
" Preserve indentation while pasting text from the OS X clipboard 在粘贴OS X剪贴板中的文本时保留缩进
noremap p :set paste:put *:set nopaste

上面的映射大幅提升了OS X系统剪贴板的可用性。前两个命令分别复制选中的文本或一行内容到系统剪贴板中。最后一行则使粘贴的文本的格式维持不变。在实践中我发现我并不需要进行很多对vim里外文本的粘贴。如果我需要分享代码,我通常会使用vim gist plugin,这比复制/粘贴要快多了。 

TMUX

tmux像胶水一样将文本三巨头紧密联系在一起。我在上个月才开始使用tmux,但我惊讶地发现它现在对我的工作流来说是如此的不可或缺。下面是维基百科对tmux的描述:

tmux是一个用于终端复用的软件,它允许一个用户在一个终端窗口或远程终端会话中使用多个不同的终端会话。在同一个命令行接口处理多个程序,以及将程序从已经开始运行另外的程序的Unix shell中分离出来,是非常有用的。

从本质上来说,tmux允许你创建会话,只要你愿意,你可以随时离开或返回该会话。tmux非常的宝贵,因为你可以根据上下文去安排你的工作。

就像vim一样,设置和使用tmux最难的部分就是颜色管理和用到系统剪贴板的复制/粘贴功能。通过确保tmux知道你使用的256色来创建合适的solarized颜色是非常简单直白的。将下面的内容添加到你的tmux.conf文件中:

set -g default-terminal "screen-256color"

关于复制/粘贴,tmux有一个特别的复制模式。tmux的复制模式命令以一个前缀键开头。默认的前缀键是Control-b。大多数人,包括我自己,都会重映射前缀键为Control-a,因为这样容易使用多了,而且这还是GNU screen的默认绑定键。当你看到我在下面提到prefix,我指的都是Control-a。因此

c的意思就是:点击Control-a再点击c

tmux里的复制/粘贴在OS X中完全不起作用。幸运的是,Chris Johnsen创建了一个好用的,很容易通过 Homebrew 安装的补丁,名为 reattach-to-user-namespace(返回到用户命名空间)。Thoughtbot 里的人们有一些很实用的博文解释了如何使用tmux和如何使复制/粘贴功能运行起来(看)。然而读完这些教程,我开始还是没搞懂如何在OS X剪切板中使用tmux,因此下面就是你安装完 reattach-to-user-namespace 后,你需要向你的tmux.conf文件中添加的内容:

set -g default-command "reattach-to-user-namespace -l zsh"
set -g mode-mouse on
setw -g mouse-select-window on
setw -g mouse-select-pane on
# Copy mode
setw -g mode-keys vi
bind ` copy-mode
unbind [
unbind p
bind p paste-buffer
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
bind -t vi-copy Escape cancel
bind y run "tmux save-buffer - | reattach-to-user-namespace pbcopy"

第一行设置令tmux使用 wrapper 程序给每个新打开的tmux窗口去启动zsh。接下来的三行是我个人对tmux里鼠标操作的设置。你可以保留或删掉这三行,这取决于你自己的需求。真正的干货在接下来的十行,它们用于处理复制模式。

除了vim和OS X的复制/粘贴缓存外,tmux有它自己的复制/粘贴缓存。为了高效地使用tmux缓存,可以点击 ` 键来进入复制模式。我已经将默认的复制绑定重映射为跟vi类似的绑定。为了将文本放入tmux的复制/粘贴缓存中,可以点击v去做出文本的选定然后点击y复制选中项。此时,所选的文本就被放在tmux复制/粘贴缓存中。输入

p可以粘贴该文本。不过,如果你想将文本放入OS X的复制/粘贴缓存里,你需要输入 y

插件

要是我没提及一些非常棒的特别与文本三巨头融合的很好的开源项目,就是我的不对了。我就不深入地一个一个说这些工具了,下面是一些我最喜欢的项目的链接以及简介:

  • Ack—比grep要好
  • Autojump—目录导航
  • Command-t—用于模糊查询的vim插件;(点击链接了解如何在tmux中设置)
  • Pandoc—格式转换
  • Poweline-vim—定制vim状态栏
  • Pianobar—终端Pandora 音乐播放器
  • pdfgrep—PDF文件的grep
  • shelr—shell中的屏幕录制工具
  • vimux—用vim与tmux交互
  • virtualenv—Python虚拟环境创建工具
  • wemux—多用户终端共享器
  • yadr—一套zsh,MacVim,和git 的配置文件

更新

一些朋友问我如何像上面的截屏里一样在tmux中设置漂亮的状态栏。我是从wemux project中学到的。如果你已经安装了vim-powerline 并且正在使用补充的字体,你只需要向你的tmux.conf中加入下面的内容去得到我的状态栏样式。感谢Matt Furden

set -g status-left-length 52
set -g status-right-length 451
set -g status-fg white
set -g status-bg colour234
set -g window-status-activity-attr bold
set -g pane-border-fg colour245
set -g pane-active-border-fg colour39
set -g message-fg colour16
set -g message-bg colour221
set -g message-attr bold
set -g status-left '#[fg=colour235,bg=colour252,bold] ❐ #S
#[fg=colour252,bg=colour238,nobold]⮀#[fg=colour245,bg=colour238,bold] #(whoami)
#[fg=colour238,bg=colour234,nobold]⮀'
set -g window-status-format "#[fg=white,bg=colour234] #I #W "
set -g window-status-current-format
"#[fg=colour234,bg=colour39]⮀#[fg=colour25,bg=colour39,noreverse,bold] #I ⮁ #W
#[fg=colour39,bg=colour234,nobold]⮀"

 

来源:http://blog.jobbole.com/86571/

Linux:使用 Referer Meta 标签控制 referer

Linux:使用 Referer Meta 标签控制 referer
Linux:使用 Referer Meta 标签控制 referer

本文描述了一个关于 http 协议中 referer 的 metadata 参数的提议,使用这个 metadata 参数,html 文档可以控制 http 请求中的 referer ,比如是否发送 referer、只发送 hostname 还是发送完整的 referer 等。虽然有一些方法可以控制 referer ,比如 flash,以及一些 js 的 tricks,但是本文中描述的是另外一番景象。

使用场景

在某些情况下,出于一些原因,网站想要控制页面发送给 server 的 referer 信息的情况下,可以使用这一 referer metadata 参数。

隐私

社交网站一般都会有用户个人页面,这些页面中用户都有可能添加一些外网的链接,而社交网站有可能不希望在用户点击了这些链接的时候,泄露用户页面的 URL ,因为这些 URL 中可能包含一些敏感信息。当然,有些社交网站可能只想在 referer 中提供一个 hostname,而不是完整的 URL 信息。

安全

有些使用了 https 的网站,可能在 URL 中使用一个参数(sid 等)来作为用户身份凭证,而又需要引入其他 https 网站的资源,这种情况下,网站肯定不希望泄露用户的身份凭证信息。

Object-Capability Discipline

有些网站遵循Object-Capability Discipline,而 referer 刚好与这一策略相悖,所以,网站能够控制 refeer 将对 Object-Capability Discipline 很有利。

技术细节

referer 的 metedata 参数可以设置为以下几种类型的值:

  • never
  • always
  • origin
  • default

如果在文档中插入 meta 标签,并且 name 属性的值为 referer,浏览器客户端将按照如下步骤处理这个标签:

  1. 如果 meta 标签中没有 content 属性,则终止下面所有操作
  2. 将 content 的值复制给 referrer-policy ,并转换为小写
  3. 检查 content 的值是否为上面 list 中的一个,如果不是,则将值置为 default

上述步骤之后,浏览器后续发起 http 请求的时候,会按照 content 的值,做出如下反应(下面 referer-policy 的值即 meta 标签中 content 的值):

  1. 如果 referer-policy 的值为never:删除 http head 中的 referer;
  2. 如果 referer-policy 的值为default:如果当前页面使用的是 https 协议,而正要加载的资源使用的是普通的 http 协议,则将 http header 中的 referer 置为空;
  3. 如果 referer-policy 的值为 origin:只发送 origin 部分;
  4. 如果 referer-policy 的值为 always:不改变http header 中的 referer 的值,注意:这种情况下,如果当前页面使用了 https 协议,而要加载的资源使用的是 http 协议,加载资源的请求头中也会携带 referer。

例子

如果页面中包含了如下 meta 标签,所有从当前页面中发起的请求将不会携带 referer:

如果页面中包含了如下 meta 标签,则从当前页面中发起的 http请求将只携带 origin 部分(注:根据原文中的语境,我理解这里的 origin 是包含了 schema 和 hostname 的部分 url,不包含 path 等后面的其他 url 部分),而不是完整的 URL :

注意:在使用本文中所述的 meta 标签的时候,浏览器原有的 referer 策略将被打破,比如从 http 协议的页面跳转到 https 的页面的时候,如果设置了适当的值,也会携带 referer。

其他问题

这与 rel=noreferer 有什么关系呢?可能 rel=noreferer 会覆盖掉本文中的 meta 标签所设置的值。也就是功能覆盖。origin 信息不是一个完整的 url,所以浏览器客户端估计会在 origin 后面加一个 / 来作为 path 部分。如果 origin 是唯一的,会发生什么情况呢?估计 referer 会被忽略。

译者注

这篇文章最初写于2012年,目前在原始页面已经是废弃状态,并且已经提供了w3c 的referer-policy 页面,但是,译者注意到,目前很多网站在防御 CSRF 的时候,都采用校验 referer 的方法,有时候允许 referer 为空,并且某些 BAT 厂商的重要业务在防御 JSON 劫持的时候,也采用校验 referer 的方法并允许 referer 为空,也许你会觉得本文中描述的只是一种提议,但是,FireFox 在21日的一篇文章中已经声明,从 Firefox 36 Beta 开始,将会支持 referer-policy,这无疑会让一些厂商的业务面临威胁。

来源:http://www.freebuf.com/news/57497.html

Linux:8 个你可能不知道的 Docker 知识

自从上世纪 90 年代硬件虚拟化被主流的技术广泛普及之后,对数据中心而言,发生的最大的变革莫过于容器和容器管理工具,例如:Docker。在过去的一年内,Docker 技术已经逐渐走向成熟,并且推动了大型初创公司例如 Twitter 和 Airbnb 的发展,甚至在银行、连锁超市、甚至 NASA 的数据中心都赢得了一席之地。当我几年前第一次直到 Docker 的时候,我还对 Docker 的未来持怀疑的态度,我认为他们是把以前的 Linux 容器的概念拿出来包装了一番推向市场。但是使用 Docker 成功进行了几个项目 例如 Spantree 之后,我改变了我的看法:Docker 帮助我们节省了大量的时间和经历,并且已经成为我们技术团队中不可或缺的工具。

GitHub 上面每天都会催生出各式各样的工具、形态各异的语言和千奇百怪的概念。如果你和我一样,没有时间去把他们全部都测试一遍,甚至没有时间去亲自测试 Docker,那么你可以看一下我的这篇文章:我将会用我们在 Docker 中总结的经验来告诉你什么是 Docker、为什么 Docker 会这么火。

Linux:8 个你可能不知道的 Docker 知识
Linux:8 个你可能不知道的 Docker 知识

Docker 是容器管理工具

Docker 是一个轻量级、便携式、与外界隔离的容器,也是一个可以在容器中很方便地构建、传输、运行应用的引擎。和传统的虚拟化技术不同的是,Docker 引擎并不虚拟出一台虚拟机,而是直接使用宿主机的内核和硬件,直接在宿主机上运行容器内应用。也正是得益于此,Docker 容器内运行的应用和宿主机上运行的应用性能差距几乎可以忽略不计。

但是 Docker 本身并不是一个容器系统,而是一个基于原有的容器化工具 LXC 用来创建虚拟环境的工具。类似 LXC 的工具已经在生产环境中使用多年,Docker 则基于此提供了更加友好的镜像管理工具和部署工具。

Docker 不是虚拟化引擎

Docker 第一次发布的时候,很多人都拿 Docker 和虚拟机 VMware、KVM 和 VirtualBox 比较。尽管从功能上看,Docker 和虚拟化技术致力于解决的问题都差不多,但是 Docker 却是采取了另一种非常不同的方式。虚拟机是虚拟出一套硬件,虚拟机的系统进行的磁盘操作,其实都是在对虚拟出来的磁盘进行操作。当运行 CPU 密集型的任务时,是虚拟机把虚拟系统里的 CPU 指令“翻译”成宿主机的CPU指令并进行执行。两个磁盘层,两个处理器调度器,两个操作系统消耗的内存,所有虚拟出的这些都会带来相当多的性能损失,一台虚拟机所消耗的硬件资源和对应的硬件相当,一台主机上跑太多的虚拟机之后就会过载。而 Docker 就没有这种顾虑。Docker 运行应用采取的是“容器”的解决方案:使用 namespace 和 CGroup 进行资源限制,和宿主机共享内核,不虚拟磁盘,所有的容器磁盘操作其实都是对 /var/lib/docker/ 的操作。简言之,Docker 其实只是在宿主机中运行了一个受到限制的应用程序。

从上面不难看出,容器和虚拟机的概念并不相同,容器也并不能取代虚拟机。在容器力所不能及的地方,虚拟机可以大显身手。例如:宿主机是 Linux,只能通过虚拟机运行 Windows,Docker 便无法做到。再例如,宿主机是 Windows,Windows 并不能直接运行 Docker,Windows上的 Docker 其实是运行在 VirtualBox 虚拟机里的。

Docker 使用层级的文件系统

前面提到过,Docker 和现有容器技术 LXC 等相比,优势之一就是 Docker 提供了镜像管理。对于 Docker 而言,镜像是一个静态的、只读的容器文件系统的快照。然而不仅如此,Docker 中所有的磁盘操作都是对特定的Copy-On-Write文件系统进行的。下面通过一个例子解释一下这个问题。

例如我们要建立一个容器运行 JAVA Web 应用,那么我们应该使用一个已经安装了 JAVA 的镜像。在 Dockerfile(一个用于生成镜像的指令文件)中,应该指明“基于 JAVA 镜像”,这样 Docker 就会去 Docker Hub Registry 上下载提前构建好的 JAVA 镜像。然后再 Dockerfile 中指明下载并解压 Apache Tomcat 软件到 /opt/tomcat 文件夹中。这条命令并不会对原有的 JAVA 镜像产生任何影响,而仅仅是在原有镜像上面添加了一个改动层。当一个容器启动时,容器内的所有改动层都会启动,容器会从第一层中运行 /usr/bin/java 命令,并且调用另外一层中的 /opt/tomcat/bin 命令。实际上,Dockerfile 中每一条指令都会产生一个新的改动层,即便只有一个文件被改动。如果用过 Git 就能更清楚地认识这一点,每条指令就像是每次 commit,都会留下记录。但是对于 Docker 来说,这种文件系统提供了更大的灵活性,也可以更方便地管理应用程序。

我们Spantree的团队有一个自己维护的含有 Tomcat 的镜像。发布新版本也非常简单:使用 Dockerfile 将新版本拷贝进镜像从而创建一个新镜像,然后给新镜像贴上版本的标签。不同版本的镜像的不同之处仅仅是一个 90 MB 大小的 WAR 文件,他们所基于的主镜像都是相同的。如果使用虚拟机去维护这些不同的版本的话,还要消耗掉很多不同的磁盘去存储相同的系统,而使用 Docker 就只需要很小的磁盘空间。即便我们同时运行这个镜像的很多实例,我们也只需要一个基础的 JAVA / TOMCAT 镜像。

Docker 可以节约时间

很多年前我在为一个连锁餐厅开发软件时,仅仅是为了描述如何搭建环境都需要写一个 12 页的 Word 文档。例如本地 Oracle 数据库,特定版本的 JAVA,以及其他七七八八的系统工具和共享库、软件包。整个搭建过程浪费掉了我们团队每个人几乎一天的时间,如果用金钱衡量的话,花掉了我们上万美金的时间成本。虽然客户已经对这种事情习以为常,甚至认为这是引入新成员、让成员适应环境、让自己的员工适应我们的软件所必须的成本,但是相比较起来,我们宁愿把更多的时间花在为客户构建可以增进业务的功能上面。

如果当时有 Docker,那么构建环境就会像使用自动化搭建工具 Puppet / Chef / Salt / Ansible 一样简单,我们也可以把整个搭建时间周期从一天缩短为几分钟。但是和这些工具不同的地方在于,Docker 可以不仅仅可以搭建整个环境,还可以将整个环境保存成磁盘文件,然后复制到别的地方。需要从源码编译 Node.js 吗?Docker 做得到。Docker 不仅仅可以构建一个 Node.js 环境,还可以将整个环境做成镜像,然后保存到任何地方。当然,由于 Docker 是一个容器,所以不用担心容器内执行的东西会对宿主机产生任何的影响。

现在新加入我们团队的人只需要运行 docker-compose up 命令,便可以喝杯咖啡,然后开始工作了。

Docker 可以节省开销

当然,时间就是金钱。除了时间外,Docker 还可以节省在基础设施硬件上的开销。高德纳和麦肯锡的研究表明,数据中心的利用率在 6% – 12% 左右。不仅如此,如果采用虚拟机的话,你还需要被动地监控和设置每台虚拟机的 CPU 硬盘和内存的使用率,因为采用了静态分区(static partitioning)所以资源并不能完全被利用。。而容器可以解决这个问题:容器可以在实例之间进行内存和磁盘共享。你可以在同一台主机上运行多个服务、可以不用去限制容器所消耗的资源、可以去限制资源、可以在不需要的时候停止容器,也不用担心启动已经停止的程序时会带来过多的资源消耗。凌晨三点的时候只有很少的人会去访问你的网站,同时你需要比较多的资源执行夜间的批处理任务,那么可以很简单的便实现资源的交换。

虚拟机所消耗的内存、硬盘、CPU 都是固定的,一般动态调整都需要重启虚拟机。而用 Docker 的话,你可以进行资源限制,得益于 CGroup,可以很方便动态调整资源限制,让然也可以不进行资源限制。Docker 容器内的应用对宿主机而言只是两个隔离的应用程序,并不是两个虚拟机,所以宿主机也可以自行去分配资源。

Docker 有一个健壮的镜像托管系统

前面提到过,这个托管系统就叫做 Docker Hub Registry。截止到 2015年4月29日,互联网上大约有 14000 个公共的 Docker,而大部分都被托管在 Docker Hub 上面。和 Github 已经很大程度上成为开源项目的代表一样,Docker 官方的 Docker Hub 则已经是公共 Docker 镜像的代表。这些镜像可以作为你应用和数据服务的基础。

也正是得益于此,你可以随意尝试最新的技术:说不定有些人就把图形化数据库的实例打包成了 Docker 镜像托管在上面。再例如 Gitlab,手工搭建 Gitlab 非常困难,译者不建议普通用户去手工搭建,而如果使用 Docker Gitlab,这个镜像则会五秒内便搭建完成。再例如特定 Ruby 版本的 Rails 应用,再例如 Linux 上的 .NET 应用,这些都可以使用简单的一条 Docker 命令搭建完成。

Docker 官方镜像都有 official 标签,安全性可以保证。但是第三方镜像的安全性无法保证,所以请谨慎下载第三方镜像。生产环境下可以只使用第三方提供的 Dockerfile 构建镜像。

Docker Github 介绍:5 秒内搞定一个 Gitlab

关于 Linux 上的 .NET 应用和 Rails 应用,将会在以后的文章中做详细介绍。

Docker 可以避免产生 Bug

Spantree 一直是“固定基础设置”(immutable infrastructure)的狂热爱好者。换句话说,除非有心脏出血这种漏洞,我们尽量不对系统做升级,也尽量不去改变系统的设置。当添加新服务器的时候,我们也会从头构建服务器的系统,然后直接将镜像导入,将服务器放入负载均衡的集群里,然后对要退休的服务器进行健康检查,检查完毕后移除集群。得益于 Docker 镜像可以很轻松的导入导出,我们可以最大程度地减少因为环境和版本问题导致的不兼容,即便有不兼容了也可以很轻松地回滚。当然,有了 Docker,我们在生产、测试和开发中的运行环境得到统一。以前在协同开发时,会因为每个人开发的电脑配置不同而导致“在我的电脑上是能运行的,你的怎么不行”的情况,而如今 Docker 已经帮我们解决了这个问题。

Docker 目前只能运行在 Linux 上

前面也提到过,Docker 使用的是经过长时间生产环境检验的技术,虽然这些技术已经都出现很长时间了,但是大部分技术都还是 Linux 独有的,例如 LXC 和 Cgroup。也就是说,截止到现在,Docker 容器内只能在 Linux 上运行 Linux 上的服务和应用。Microsoft 正在和 Docker 紧密合作,并且已经宣布了下一个版本的 Windows Server 将会支持 Docker 容器,并且命名为 Windows Docker,估计采用的技术应该是Hyper-V Container,我们有望在未来的几年内看到这个版本。

除此之外,类似 boot2docker 和 Docker Machine 这种工具已经可以让我们在 Mac 和 Windows 下通过虚拟机运行 Docker 了。

来源:http://segmentfault.com/a/1190000002734062

Linux:在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络

Red Hat Enterprise Linux 7CentOS 7 中默认的网络服务由 NetworkManager 提供,这是动态控制及配置网络的守护进程,它用于保持当前网络设备及连接处于工作状态,同时也支持传统的 ifcfg 类型的配置文件。

NetworkManager 可以用于以下类型的连接:Ethernet,VLANS,Bridges,Bonds,Teams,Wi-Fi,mobile boradband(如移动3G)以及 IP-over-InfiniBand。针对与这些网络类型,NetworkManager 可以配置他们的网络别名,IP 地址,静态路由,DNS,VPN连接以及很多其它的特殊参数。

可以用命令行工具 nmcli 来控制 NetworkManager。

Linux:在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络
Linux:在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络

nmcli 用法

# nmcli [ OPTIONS ] OBJECT { COMMAND | help }

我们可以通过 TAB 键补全命令,当你忘记这个命令的语法时只需要按下 TAB 就可以看到选项列表。

nmcli tab

使用 nmcli 的一些例子:

# nmcli general status

这条命令将 NetworkManager 的所有状态都打印出来。

# nmcli connection show

显示所有连接。

# nmcli connection show -a

仅显示当前活动的连接。

# nmcli device status

列出 NetworkManager 识别出的设备列表及他们的状态。

Linux:在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络
Linux:在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络

启动/停止 网络接口

使用 nmcli 工具启动或停止网络接口,与 ifconfig 的 up/down 是一样的。

使用下列命令停止某个接口:

# nmcli device disconnect eno16777736

下列命令用来启动接口:

# nmcli device connect eno16777736

添加静态IP的以太网连接

以下命令可以添加一个静态IP地址的以太网连接:

# nmcli connection add type ethernet con-name NAME_OF_CONNECTION ifname interface-name ip4 IP_ADDRESS gw4 GW_ADDRESS

根据你需要的配置更改 NAME_OF_CONNECTION,IP_ADDRESS, GW_ADDRESS 参数(如果不需要网关的话可以省略最后一部分)。

# nmcli connection add type ethernet con-name NEW ifname eno16777736 ip4 192.168.1.141 gw4 192.168.1.1

使用下列命令设置DNS服务器:

# nmcli connection modify NEW ipv4.dns "8.8.8.8 8.8.4.4"

下列命令启动新的 Ethernet 连接:

# nmcli connection up NEW ifname eno16777736

查看新连接的配置信息:

# nmcli -p connection show NEW
Linux:在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络
Linux:在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络

增加一个使用 DHCP 的新连接

增加新的连接,使用DHCP自动分配IP地址,网关,DNS等,你要做的就是将命令行后 ip/gw 地址部分去掉就行了,DHCP会自动分配这些参数。

例,在 eno 16777736 设备上配置一个 名为 NEW_DHCP 的 DHCP 连接

# nmcli connection add type ethernet con-name NEW_DHCP ifname eno16777736

via: http://linoxide.com/linux-command/nmcli-tool-red-hat-centos-7/

作者:Adrian Dinu 译者:SPccman 校对:wxy

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

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

Linux:大型网站的 HTTPS 实践(四):协议层以外的实践

1 前言

网上介绍 https 的文章并不多,更鲜有分享在大型互联网站点部署 https 的实践经验,我们在考虑部署 https 时也有重重的疑惑。

本文为大家介绍百度 HTTPS 的实践和一些权衡, 希望以此抛砖引玉。

Linux:大型网站的 HTTPS 实践(四):协议层以外的实践
Linux:大型网站的 HTTPS 实践(四):协议层以外的实践

2 协议层以外的实践工作

2.1 全站覆盖 https 的理由

很多刚接触 https 的会思考,我是不是只要站点的主域名换了 https 就可以?答案是不行。

https 的目的就是保证传输过程的安全,如果只有主域名上了 https,但是主域名加载的资源,比如 js,css,图片没有上 https,会怎么样?

从效果上来说,没有达到保证网站传输过程安全的目的,因为你的 js,css,图片仍然有被劫持的可能性,如果这些内容被篡改 / 嗅探了,那么 https 的意义就失去了。

浏览器在设计上早就考虑的这样的情况,会有相应的提示。具体的实现依赖浏览器,例如地址栏锁形标记从绿色变为黄色, 阻止这次请求,或者直接弹出非常影响用户体验的提示 (主要是 IE),用户会感觉厌烦,疑惑和担忧安全性。

PIC1

很多用户看见这个链接会习惯性的点”是”,这样非 https 的资源就被禁止加载了。非 ie 的浏览器很多也会阻止加载一些危害程度较高的非 https 资源(例如 js)。我们发现移动端浏览器的限制目前会略松一些。

所以这里要是没做好,很多情况连网站的基本功能都没法正常使用。

2.2 站点的区别

很多人刚接触 https 的时候,觉得不就是部署证书,让 webserver 支持 https 就行了吗。

实际上对于不同的站点来说,https 的部署方式和难度有很大的区别。对于一个大型站点来说,让 webserver 支持 https,以及对 webserver 在 https 协议特性上做一些优化,在迁移的工作比重上,可能只占到 20%-40%。

我们考虑下以下几种情况下,部署 https 的方案。

2.2.1 简单的个人站点

简单的定义:资源只从本站的主域或者主域的子域名加载。

比如 axyz 的个人 blog,域名是 axyzblog.com。加载主域名下的 js 和图片。

Linux:大型网站的 HTTPS 实践(四):协议层以外的实践
Linux:大型网站的 HTTPS 实践(四):协议层以外的实践

这样的站部署 https,在已有证书且 webserver 支持的情况下,只需要把主域名替换为 https 接入,然后把资源连接修改为 https:// 或者 //。

2.2.2 复杂的个人站点

复杂的定义:资源需要从外部域名加载。

Linux:大型网站的 HTTPS 实践(四):协议层以外的实践
Linux:大型网站的 HTTPS 实践(四):协议层以外的实践

这样就比较麻烦了,主域资源容易适配 https,在 cdn 上加载的资源还需要 cdn 服务商支持 https。目前各大 cdn 的服务商正在逐渐提供 https 的支持,需要迁移的朋友可以看看自己使用的 cdn 是否提供了这项能力。一些 cdn 会对 https 流量额外收费。

PIC4

Cdn 使用 https 常见的方案有:

  1. 网站主提供私钥给 cdn,回源使用 http。
  2. cdn 使用公共域名,公共的证书,这样资源的域名就不能自定义了。回源使用 http。
  3. 仅提供动态加速,cdn 进行 tcp 代理,不缓存内容。
  4. CloudFlare 提供了Keyless SSL的服务,能够支持不愿意提供私钥, 不想使用公共的域名和证书却又需要使用 cdn 的站点了。

2.2.3 简单的大型站点

简单的定义: 资源只从本站的主域, 主域的子域,或者自建 / 可控的 cdn 域名加载,几乎没有第三方资源。如果网站本身的特性就如此,或愿意改造为这样的类型,部署 https 就相对容易。Google Twitter 都是非常好的范例。优点:已经改成这样的站点,替换 https 就比较容易。缺点:如果需要改造,那么要很大的决心,毕竟几乎不能使用多样化的第三方资源了。

2.2.4 复杂,访问速度重要性稍低的大型站点

复杂的定义:从本站的非主域,或者第三方站点的域名有大量的第三方资源需要加载,多出现在一些平台类,或者有复杂内容展现的的网站。

访问速度要求:用户停留时间长或者强需求,用户对访问速度的耐受程度较高。比如门户,视频,在线交易类(比如火车票 机票 商城)网站。

这样的站点,可以努力推动所有相关域名升级为支持 https。我们用下图举例说明下这样修改会导致一个网站的链接发生怎样的改变。

PIC5

负责流量接入的团队将可控的接入环境改造为 http 和 https 都支持,这样前端工程的工作相对就少一些。大部分时候将链接从 http:// 替换为 // 即可. 在主域名是 https 的情况下,其它资源就能自动从 https 协议下加载。一些第三方资源怎么办?一般来说只有两种选择,一迁移到自己的 cdn 或者 idc 吧,二强制要求第三方自己能支持 https。

以全站 https 接入的 facebook 举例。第三方厂商想在 facebook 上线一个游戏。facebook:请提供 https 接入吧。第三方想:能赚钱啊,还是提供下 https 接入吧。所以,足够强势,有吸引力,合作方也有提供 https 的能力的话,这是完全可行的。如果你的平台接入的都是一些个人开发者,而且还赚不到多少钱的情况下,这样就行不通了。

优点:前端改动相对简单,不容易出现 https 下还有 http 的资源问题。

缺点:通常这样的实现下,用户的访问速度会变慢,比如从 2.5 秒变为 3 秒,如上述的理由,用户还是能接受的。对第三方要求高。

2.2.5 复杂,访问速度有严格要求的大型站点

复杂的定义:同上。

访问速度要求:停留时间不长,用户对访问速度的心理预期较高。

但是如果用户把网站当作工具使用,需要你很快给出响应的时候,这样的实现就不好了。后续几个部分我们介绍下这些优化的抉择。

2.3 域名的选择

域名对访问速度的影响具有两面性:域名多,域名解析和建立连接的时间就多;域名少,下载并发度又不够。

https 下重建连接的时间成本比 http 更高,对于上面提到的简单的大型站点, 可以用少量域名就能满足需求,对于百度这样富展现样式较多的搜索引擎来说,页面可能展示的资源种类太多。而不同类型的资源又是由不同的域名 (不同的产品 或者第三方产品) 提供的服务,换一个词搜索就可能需要重新建立一些资源的 ssl 链接,会让用户感受到卡顿。

Linux:大型网站的 HTTPS 实践(四):协议层以外的实践
Linux:大型网站的 HTTPS 实践(四):协议层以外的实践

如果将域名限制在有限的范围,维持和这些域名的连接,合并一些数据,加上有 spdy,http2.0 来保证并发,是可以满足我们的需求的。

2.4 连接复用

连接复用率可以分为 tcp 和 ssl 等不同的层面,需要分开进行分析和统计。

2.4.1 连接复用的意义

HTTP 协议 (RFC2616) 规定一个域名最多不能建立超过 2 个的 TCP 连接。但是随着互联网的发展,一张网页的元素越来越多,传输内容越来越大,一个域名 2 个连接的限制已经远远不能满足现在网页加载速度的需求。

目前已经没有浏览器遵守这个规定,各浏览器针对单域名建立的 TCP 连接数如下:

浏览器

连接数

Firefox 2

2
Firefox 3+

6

Chrome

6

Ie10

8
IE8

6

Safari 5

6
Opera 12

6

表格 1 浏览器单域名建立的最大并发连接数

从上表看出,单个域名的连接数基本上是 6 个。所以只能通过增加域名的方式来增加并发连接数。在 HTTP 场景下,这样的方式没有什么问题。但是在 HTTPS 连接下,由于 TLS 连接建立的成本比较高,增加并发连接数本身就会带来较大的延迟,所以对域名数需要一个谨慎的控制。

特别是 HTTP2 即将大规模应用,而 HTTP2 的最大特性就是多路复用,使用多个域名和多个连接无法有效发挥多路复用和压缩的特性。

那 HTTPS 协议下,一张网页到底该有多少域名呢?这个其实没有定论,取决于网页需要加载元素个数。

2.4.2 预建连接

既然从协议角度无法减少握手对速度的影响,那能不能提前建立连接,减少用户可以感知的握手延迟呢?当然是可以的。思路就是预判当前用户的下一个访问 URL,提前建立连接,当用户发起真实请求时,TCP 及 TLS 握手都已经完成,只需要在连接上发送应用层数据即可。

最简单有效的方式就是在主域下对连接进行预建,可以通过请求一些静态资源的方式。但是这样还是不容易做到极致,因为使用哪个连接,并发多少还是浏览器控制的。例如你对 a 域名请求一个图片,浏览器建立了两个连接,再请求一张图片的时候,浏览器很大概率能够复用连接,但是当 a 域名需要加载 10 个图片的时候,浏览器很可能就会新建连接了。

2.4.3 Spdy 的影响

Spdy 对于连接复用率的提升非常有效,因为它能支持连接上的并发请求,所以浏览器会尽量在这个链接上保持复用。

2.4.4 其它

也可以尝试一些其他发方法,让浏览器在访问你的网站之前就建立过 https 连接,这样 session 能够复用。HSTS 也能有效的减少跳转时间,可惜对于复杂的网站来说,开启需要考虑清楚很多问题。

2.5 优化的效果

从百度的优化经验来看看,如果不开启 HSTS,用户在浏览器直接访问主域名,再通过 302 跳转到 HTTPS。增加的时间平均会有 400ms+,其中 302 跳转和 ssl 握手的因素各占一半。但是对于后续的请求,我们做到了对绝大部分用户几乎无感知。

这 400ms+ 还有很多可以优化的空间,我们会持续优化用户的体验。

3 HTTPS 迁移遇到的一些常见问题。

3.1 传递 Referrer

我们可以把自己的网站替换为 https,但是一般的站点都有外链,要让外链都 https 目前还不太现实。很多网站需要从 referrer 中判断流量来源,因此对于搜索引擎这样的网站来说,referer 的传递还是比较重要的。如果不做任何设置,你会发现在 https 站点中点击外链并没有将 referrer 带入到 http 请求的头部中(http://tools.ietf.org/html/rfc7231#section-5.5.2)。现代的浏览器可以用 meta 标签来传递 refer。(http://w3c.github.io/webappsec/specs/referrer-policy)

传递完整的 url

只传递站点,不包含路径和参数等。 

对于不支持 meta 传递 referrer 的浏览器,例如 IE8, 我们怎么办呢?

可以采用再次跳转的方法,既然 HTTPS 下不能给 HTTP 传递 referer,我们可以先从 HTTPS 访问一个可控的 http 站点,把需要传递的内容放到这个 http 站点的 url 中,然后再跳转到目标地址。

Linux:大型网站的 HTTPS 实践(四):协议层以外的实践
Linux:大型网站的 HTTPS 实践(四):协议层以外的实践

3.2 form 提交

有时需要将 form 提交到第三方站点,而第三方站点又是 http 的地址,浏览器会有不安全的警告。可以和 referrer 的跳转传递采取相似的逻辑。

但是这样对 referer 和 form 等内容的方案,并不是完美的解决方法,因为这样还是增加了不安全的因素(劫持,隐私泄露等 )。理想情况需要用户升级符合最新规范的浏览器,以及推进更多的站点迁移至 https。

3.3 视频播放

简单来说,如果你使用 http 的协议来播放视频,那么浏览器仍然会有不安全的提示。所以你有两种选择,1 让视频源提供 https。2 使用非 http 的协议,如 rtmp 协议。

3.4 用户异常

在 https 迁移的过程中,也会有不少热心的用户向我们反馈遇到的各种问题。

常见的有以下的一些情况:

  1. 用户的系统时间设置错误,导致提示证书过期。
  2. 用户使用 fiddler 等代理进行调试,但是没有添加这些软件的根证书,导致提示证书非法。
  3. 用户使用的 Dns 为公共 dns 或者跨网设置 dns,一些请求被运营商作为跨网流量拦截。
  4. 连通性有问题,我们发现一个小运营商的 https 失败率奇高,又没法联系到他们,只能不对他们进行 https 的转换。
  5. 慢。有时由于网络环境的因素,用户打开其他网站也慢,ping 哪个网站都要 500-2000ms。这时 https 自然也会很慢。

4 结束语

对于复杂的大型网站来说,HTTPS 的部署有很多工作要完成。

面对困难和挑战,有充足的动力支持着我们前进:https 上线后,劫持等原因导致的用户功能异常,隐私泄露的反馈大幅减少。

热心的用户经常会向我们反馈遇到的各种问题。在以前,有时即使我们确定了是劫持的问题,能够解决问题的方法也非常有限。每当这种时候,自己总会产生一些无力感。

HTTPS 的全站部署,给我们提供了能解决大部分问题的选项。能让一个做技术的人看到自己的努力解决了用户的问题,这就是最棒的收获。

HTTPS 没有想像中难用和可怕,只是没有经过优化。与大家共勉。

来源:http://op.baidu.com/2015/04/https-s01a04/

Linux:Linux有问必答:如何在Linux下禁用IPv6

问题:我发现我的一个应用程序在尝试通过IPv6建立连接,但是由于我们本地网络不允许分配IPv6的流量,IPv6连接会超时,应用程序的连接会回退到IPv4,这样就会造成不必要的延迟。由于我目前对IPv6没有任何需求,所以我想在我的Linux主机上禁用IPv6。有什么比较合适的方法呢?

IPv6被认为是IPv4——互联网上的传统32位地址空间——的替代产品,它用来解决现有IPv4地址空间即将耗尽的问题。然而,由于已经有大量主机、设备用IPv4连接到了互联网上,所以想在一夜之间将它们全部切换到IPv6几乎是不可能的。许多IPv4到IPv6的转换机制(例如:双协议栈、网络隧道、代理) 已经被提出来用来促进IPv6能被采用,并且很多应用也正在进行重写,如我们所提倡的,来增加对IPv6的支持。有一件事情可以确定,就是在可预见的未来里IPv4和IPv6势必将共存。

Linux:Linux有问必答:如何在Linux下禁用IPv6
Linux:Linux有问必答:如何在Linux下禁用IPv6

理想情况下,向IPv6过渡的进程不应该被最终的用户所看见,但是IPv4/IPv6混合环境有时会让你碰到各种源于IPv4和IPv6之间不经意间的相互碰撞的问题。举个例子,你会碰到应用程序超时的问题,比如apt-get或ssh尝试通过IPv6连接失败、DNS服务器意外清空了IPv6的AAAA记录、或者你支持IPv6的设备不兼容你的互联网服务提供商遗留下的IPv4网络,等等等等。

当然这不意味着你应该盲目地在你的Linux机器上禁用IPv6。鉴于IPv6许诺的种种好处,作为社会的一份子我们最终还是要充分拥抱它的,但是作为给最终用户进行故障排除过程的一部分,如果IPv6确实是罪魁祸首,那你可以尝试去关闭它。

这里有一些让你在Linux中部分(例如:对于某个特定的网络接口)或全部禁用IPv6的小技巧。这些小贴士应该适用于所有主流的Linux发行版包括Ubuntu、Debian、Linux Mint、CentOS、Fedora、RHEL以及Arch Linux。

查看IPv6在Linux中是否被启用

所有现代Linux发行版默认都自动启用IPv6。为了能看到IPv6在你的Linux中是否被激活,可以使用ifconfig或ip命令。如果你在输入这些命令之后看到”inet6″字样的输出,那就意味着你的Linux系统启用了IPv6。

$ ifconfig
Linux:Linux有问必答:如何在Linux下禁用IPv6
Linux:Linux有问必答:如何在Linux下禁用IPv6
$ ip addr
Linux:Linux有问必答:如何在Linux下禁用IPv6
Linux:Linux有问必答:如何在Linux下禁用IPv6

临时禁用IPv6

如果你想要在你的Linux系统上临时关闭IPv6,你可以用 /proc 文件系统。”临时”的意思是我们所做的禁用IPv6的更改在系统重启后将不被保存。IPv6会在你的Linux机器重启后再次被启用。

要将一个特定的网络接口禁用IPv6,使用以下命令:

$ sudo sh -c 'echo 1 > /proc/sys/net/ipv6/conf//disable_ipv6'

举个例子,将eth0接口禁用IPv6:

$ sudo sh -c 'echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6'
Linux:Linux有问必答:如何在Linux下禁用IPv6
Linux:Linux有问必答:如何在Linux下禁用IPv6

重新启用eth0接口的IPv6:

$ sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6'

如果你想要将整个系统所有接口包括回环接口禁用IPv6,使用以下命令:

$ sudo sh -c 'echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6'

永久禁用IPv6

以上方法是不能永久禁用IPv6的,你一旦重启系统IPv6还是会被启用。如果你想要永久关闭它,有几个方法你可以试试。

方法一

第一种方法是通过 /etc/sysctl.conf 文件对 /proc 进行永久修改。

换句话说,就是用文本编辑器打开 /etc/sysctl.conf 然后添加以下内容:

# 禁用整个系统所有接口的IPv6
net.ipv6.conf.all.disable_ipv6 = 1
# 禁用某一个指定接口的IPv6(例如:eth0, lo)
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1

在 /etc/sysctl.conf 使这些更改生效,运行以下命令:

$ sudo sysctl -p /etc/sysctl.conf

或者直接重启。

方法二

另一个永久禁用IPv6的方法是在开机的时候传递一个必要的内核参数。

用文本编辑器打开 /etc/default/grub 并给GRUBCMDLINELINUX变量添加”ipv6.disable=1″。

$ sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX="xxxxx ipv6.disable=1"

上面的”xxxxx”代表任何已有的内核参数,在它后面添加”ipv6.disable=1″。

Linux:Linux有问必答:如何在Linux下禁用IPv6
Linux:Linux有问必答:如何在Linux下禁用IPv6

最后,不要忘记用以下方法保存对GRUB/GRUB2的修改:

Debian、Ubuntu或Linux Mint系统:

$ sudo update-grub

Fedora、CentOS/RHEL系统:

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

现在只要你重启你的Linux系统,IPv6就会完全被禁用。

禁用IPv6之后的其它可选步骤

这里有一些在你禁用IPv6后需要考虑的可选步骤,这是因为当你在内核里禁用IPv6后,其它程序也许仍然会尝试使用IPv6。在大多数情况下,应用程序的这种行为不太会影响到什么,但是出于效率或安全方面的原因,你可以为他们禁用IPv6。

/etc/hosts

根据你的设置, /etc/hosts 会包含一条或多条IPv6的hosts和它们的地址。用文本编辑器打开 /etc/hosts 并注释掉包含IPv6 hosts的脚本行。

$ sudo vi /etc/hosts

# comment these IPv6 hosts
# ::1     ip6-localhost ip6-loopback
# fe00::0 ip6-localnet
# ff00::0 ip6-mcastprefix
# ff02::1 ip6-allnodes
# ff02::2 ip6-allrouters

Network Manager

如果你在用NetworkManager来管理你的网络设置,你可以在NetworkManager里禁用IPv6。在NetworkManager打开wired connection,点击”IPv6 Settings”选项并在”Method”一栏选择”Ignore”,保存退出。

Linux:Linux有问必答:如何在Linux下禁用IPv6
Linux:Linux有问必答:如何在Linux下禁用IPv6

SSH服务

默认情况下,OpenSSH服务(sshd)会去尝试捆绑IPv4和IPv6的地址。

要强制sshd只捆绑IPv4地址,用文本编辑器打开 /etc/ssh/sshd_config 并添加以下行。inet只适用于IPv4,而inet6是适用于IPv6的。

$ sudo vi /etc/ssh/sshd_config

AddressFamily inet

然后重启sshd服务。


via: http://ask.xmodulo.com/disable-ipv6-linux.html

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

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

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

Linux:如何修复 Ubuntu 上“…script returned error exit status 1”的错误

今天,我在更新VirtualBox新版本的时候遇到了一个问题。

E: /var/cache/apt/archives/ subprocess new pre-removal script returned error exit status 1

Linux:如何修复 Ubuntu 上“...script returned error exit status 1”的错误
Linux:如何修复 Ubuntu 上“…script returned error exit status 1”的错误

解决:

我google了一下并找到了方法。下面是我解决的方法。

sudo apt-get clean
sudo apt-get update && sudo apt-get upgrade

这样几乎可以修复这个问题了。

如果你仍然有问题,那就试试下面的命令:

sudo dpkg --configure -a
sudo apt-get -f install

或者你可以按照下面的方法从Oracle VirtualBox官网下载最新版本并安装。

sudo apt-get update
sudo dpkg -i virtualbox-4.3_4.3.24-98716~Ubuntu~raring_amd64.deb
sudo apt-get -f install
sudo apt-get autoclean && sudo apt-get autoremove

干杯!


via: http://www.unixmen.com/linux-basics-how-to-fix-e-varcacheaptarchives-subprocess-new-pre-removal-script-returned-error-exit-status-1-in-ubuntu/

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

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

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

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

Prey是一款跨平台的开源工具,可以帮助你找回被盗的笔记本,台式机,平板和智能手机。它已经获得了广泛的流行,声称帮助找回了成百上千台丢失的笔记本和智能手机。Prey的使用特别简单,首先安装在你的笔记本或者手机上,当你的设备不见了,用你的账号登入Prey网站,并且标记你的设备为“丢失”。只要小偷将设备接入网络,Prey就会马上发送设备的地理位置给你。如果你的笔记本有摄像头,它还会拍下该死的贼。

Prey占用很小的系统资源;你不会对你的设备运行有任何影响。你也可以配合其他你已经在设备上安装的防盗软件使用。Prey在你的设备与Prey服务器之间采用安全加密的通道进行数据传输。

在Ubuntu上安装并配置Prey

让我们来看看如何在Ubuntu上安装和配置Prey,需要提醒的是,在配置过程中,我们必须到Prey官网进行账号注册。一旦完成上述工作,Prey将会开始监视你的设备了。免费的账号最多可以监视三个设备,如果你需要添加更多的设备,你就需要购买合适的的套餐了。

可以想象Prey多么流行与被广泛使用,它现在已经被添加到了官方的软件库中了。这意味着你不要往软件包管理器添加任何PPA。很简单,登录你的终端,运行以下的命令来安装它:

sudo apt-get install prey

Install Prey

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

Prey是十分轻巧的软件,只使用了系统几兆的空间,安装完成后,从Application >> Prey启动,之后它会询问你进行相关配置。

选择“New User”,如果你是第一次使用的话。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

第二步实际上就是官网注册的流程。请提供你的用户名,邮箱地址和密码,来申清一个免费的账号。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

点击“Apply”完成,所有工作搞定,现在你的计算机被Prey保护了。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

登录你最新建立的Prey 账号,你就应该可以在“Devices”菜单下看见你的设备信息了。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

只要你的笔记本或者任何其他设备丢失了,就登录你的Prey网站账号,然后点击“Set Device to Missing”选项修改设备状态为“missing”。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

从这里选择定时报告,并点击“Yes,my device is missing”。定时报告选项是指一段时间间隔后,软件会更新并发送给你设备的地理位置。它还会从网页界面那发邮件给你,只要设备的状态改变了。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

而一旦被盗的设备接入了互联网,Prey就会马上发送报告给你,包括设备的地理位置和IP地址。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

点击报告链接,你应该会看到设备的地理位置和IP地址。

Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话
Linux:使用 Prey 定位被盗的 Ubuntu 笔记本与智能电话

Prey有一个明显的不足。它需要你的设备接入互联网才会发送地理位置给你,如果小偷比较聪明,在接入网络前将你的设备磁盘格式化了,那么你就永远不会收到设备被发现的报告了。但是这里仍然是有一个方法克服这个不足,确保添加一个BIOS密码,并且禁用从可移除的设备里启动系统。

结论

这是一款小巧,非常有用的安全保护应用,可以让你在一个地方追踪你所有的设备,尽管不完美,但是仍然提供了找回被盗设备的机会。它在Linux,Windows和Mac平台上无缝运行。以上就是Prey完整使用的所有细节。


via: http://linoxide.com/ubuntu-how-to/anti-theft-application-prey-ubuntu/

作者:Aun Raza 译者:wi-cuckoo 校对:wxy

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

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

Linux:25个 Git 进阶技巧

我已经使用git差不多18个月了,觉得自己对它应该已经非常了解。然后来自GitHub的Scott Chacon过来给LVS做培训(LVS是一个赌博软件供应商和开发商,从2013年开始的合同),而我在第一天里就学到了很多。

作为一个对git感觉良好的人,我觉得分享从社区里掌握的一些有价值的信息,也许能帮某人解决问题而不用做太深入研究。

Linux:25个 Git 进阶技巧
Linux:25个 Git 进阶技巧

基本技巧

1. 安装后的第一步

在安装好git后,你第一件该做的事是设置你的名字和电子邮箱,因为每次提交都要用到这些信息:

$ git config --global user.name "Some One"
$ git config --global user.email "someone@gmail.com"

2. Git是基于指针的

保存在git里的一切都是文件。当你创建一个提交的时候,会建立一个包含你的提交信息和相关数据(名字,邮件地址,日期/时间,前一个提交,等等)的文件,并把它链接到一个树文件中。这个树文件中包含了对象或其他树的列表。这里的提到的对象(或二进制大对象)是和本次提交相关的实际内容(它也是一个文件,另外,尽管文件名并没有包含在对象里,但是存储在树中)。所有这些文件都使用对象的SHA-1哈希值作为文件名。

用这种方式,分支和标签就是简单的文件(基本上是这样),包含指向该提交的SHA-1哈希值。使用这些索引会带来优秀的灵活性和速度,比如创建一个新分支就是简单地用分支名字和所分出的那个提交的SHA-1索引来创建一个文件。当然,你不需要自己做这些,而只要使用Git命令行工具(或者GUI),但是实际上就是这么简单。

你也许听说过叫HEAD的索引。这只是简单的一个文件,包含了你当前指向的那个提交的SHA-1索引值。如果你正在解决一次合并冲突然后看到了HEAD,这并不是一个特别的分支或分支上的一个必需的特殊位置,只是标明你当前所在位置。

所有的分支指针都保存在.git/refs/heads里,HEAD在.git/HEAD里,而标签保存在.git/refs/tags里 – 自己可以随便进去看看。

3. 两个爸爸(父节点) – 你没看错!

在历史中查看一个合并提交的信息时,你将看到有两个父节点(不同于工作副本上的常规提交的情况)。第一个父节点是你所在的分支,第二个是你合并过来的分支。

4. 合并冲突

目前我相信你碰到过合并冲突并且解决过。通常是编辑一下文件,去掉<<<<,====,>>>>标志,保留需要留下的代码。有时能够看到这两个修改之前的代码会很不错,比如,在这两个现在冲突的分支之前的改动。下面是一种方式:

$ git diff --merge
diff --cc dummy.rb
index 5175dde,0c65895..4a00477
--- a/dummy.rb
+++ b/dummy.rb
@@@ -1,5 -1,5 +1,5 @@@
  class MyFoo
    def say
-     puts "Bonjour"
 -    puts "Hello world"
++    puts "Annyong Haseyo"
    end
  end

如果是二进制文件,比较差异就没那么简单了…通常你要做的就是测试这个二进制文件的两个版本来决定保留哪个(或者在二进制文件编辑器里手工复制冲突部分)。从一个特定分支获取文件拷贝(比如说你在合并master和feature123两个分支):

$ git checkout master flash/foo.fla # 或者...
$ git checkout feature132 flash/foo.fla
$ # 然后...
$ git add flash/foo.fla

另一种方式是通过git输出文件 – 你可以输出到另外的文件名,然后当你决定了要用哪个后,再将选定的正确文件复制为正常的文件名:

$ git show master:flash/foo.fla > master-foo.fla
$ git show feature132:flash/foo.fla > feature132-foo.fla
$ # 检出master-foo.fla和feature132-foo.fla
$ # 假如说我们决定来自feature132的文件是正确的
$ rm flash/foo.fla
$ mv feature132-foo.fla flash/foo.fla
$ rm master-foo.fla
$ git add flash/foo.fla

更新:感谢Carl在原博客文章上评论里的提醒,你实际上可以用“git checkout —ours flash/foo.fla”和“git checkout —theirs flash/foo.fla”来检出特定版本的文件,而不用记住你在合并的分支名字。就我个人来说喜欢更精确一点,但这也是一种方式…

记着在解决完冲突后要将文件加入提交(像我上面做的那样)。

服务器,分支和标签

5. 远端服务器

git的一个超强大的功能就是可以有不止一个远端服务器(实际上你一直都在一个本地仓库上工作)。你并不是一定都要有这些服务器的写权限,你可以有多个可以读取的服务器(用来合并他们的工作)然后写入到另外一个仓库。添加一个新的远端服务器很简单:

$ git remote add john git@github.com:johnsomeone/someproject.git

如果你想查看远端服务器的信息可以这样做:

# 显示每个远端服务器的URL
$ git remote -v
# 提供更多详细信息
$ git remote show name

你随时都可以查看本地分支和远端分支的差异:

$ git diff master..john/master

你也可以查看没有在远端分支上的HEAD的改动:

$ git log remote/branch..
# 注意:..后面没有结束的特定引用

6. 标签

在git里有两种类型的标签 – 轻量级标签和带注释标签。记住技巧2里说过git是基于指针的,这两者之间的差异也很简单。轻量级标签只是一个简单的指向一次提交的带名字指针。你随时都可以将它指向另一个提交。带注释标签是一个指向标签对象的带名字指针,带有自己的信息和历史。因为有自己的信息,它可以根据需要用GPG签名。

建立这两种类型的标签都很简单(只有一个命令行开关的差异)

$ git tag to-be-tested
$ git tag -a v1.1.0 # 会提示输入标签的信息

7. 建立分支

在git里建立分支非常简单(而且像闪电一样快,因为它只需要创建一个小于100字节的文件)。用普通方式建立新分支并切换过去:

$ git branch feature132
$ git checkout feature132

当然,如果你确定自己直接切换到新建的分支,可以用一个命令实现:

$ git checkout -b feature132

如果你想重命名一个本地分支也很简单(可以显示发生了什么的较长的方式):

$ git checkout -b twitter-experiment feature132
$ git branch -d feature132

更新:你也可以(像Brian Palmer在原博客文章的评论里提出的)只用“git branch”的-m开关在一个命令里实现(像Mike提出的,如果你只指定了一个分支参数,就会重命名当前分支):

$ git branch -m twitter-experiment
$ git branch -m feature132 twitter-experiment

8. 合并分支

也许在将来的某个时候,你希望将改动合并。有两种方式:

$ git checkout master
$ git merge feature83 # 或者...
$ git rebase feature83

merge和rebase之间的差别是merge会尝试处理改动并建立一个新的混合了两者的提交。rebase会尝试把你从一个分支最后一次分离后的所有改动,一个个加到该分支的HEAD上。不过,在已经将分支推到远端服务器后不要再rebase了 – 这会引起冲突/问题。

如果你不确定在哪些分支上还有独有的工作 – 所以你也不知道哪些分支需要合并而哪些可以删除,git branch有两个开关可以帮你:

# 显示已经全部合并到当前分支的分支
$ git branch --merged
# 显示没有合并到当前分支的分支
$ git branch --no-merged

9. 远端分支

如果你在本地有一个分支希望推到远端服务器上,你可以用一行命令推送上去:

$ git push origin twitter-experiment:refs/heads/twitter-experiment
# origin是我们服务器的名字,而twitter-experiment是分支名字

更新:感谢Erlend在原博客文章上的评论 – 这个实际上和git push origin twitter-experiment效果一样,不过使用完整的语法,你可以在两者之间使用不同的分支名(这样本地分支可以是add-ssl-support而远端是issue-1723)。

如果你想在远端服务器上删除一个分支(注意分支名前面的冒号):

$ git push origin :twitter-experiment

如果你想查看所有远端分支的状态可以这样做:

$ git remote show origin

这个命令可能会列出服务器上一些以前有过但现在已经不在了的分支。如果碰到这种情况你可以用下面的命令从你本地分支里清理掉:

$ git remote prune

最后,如果你想在本地跟踪一个远端分支,普通的方式是:

$ git branch --track myfeature origin/myfeature
$ git checkout myfeature

不过,新版的git在使用-b标记检出分支时会自动设定跟踪:

$ git checkout -b myfeature origin/myfeature

在储藏点,索引和文件系统中保存内容

10. 储藏

在git里你可以把当前工作状态放进一个储藏堆栈中,然后可以再取出来。最简单的情形是下面这样:

$ git stash
# 做点其他事情...
$ git stash pop

许多人建议使用git stash apply来代替pop,不过如果这样做的话最后会遗留一个很长的储藏列表。而“pop”会在全部加载后自动从堆栈中移除。如果使用过git stash apply,你也可以使用下面的命令从堆栈上移除最后一项:

$ git stash drop

git会基于当前的提交信息自动创建评论。如果你更希望有自定义信息的话(因为它可能和前一个提交没有任何联系):

$ git stash save "My stash message"

如果你希望从列表中取出一个特定的储藏点(不一定非得是最后一个)可以先列出它们然后用下面的方式取出:

$ git stash list
  stash@{0}: On master: Changed to German
  stash@{1}: On master: Language is now Italian
$ git stash apply stash@{1}

11. 交互式添加

在subversion的世界里你只能修改文件然后提交所有改动。而在git里你有强大得多的方式来提交部分文件或者甚至是部分补丁。提交部分文件或文件中的部分改动你需要进入交互式模式:

$ git add -i
           staged     unstaged path
*** Commands ***
  1: status      2: update   3: revert   4: add untracked
  5: patch      6: diff     7: quit     8: help
What now>

这会让你进入一个基于菜单的交互式提示。你可以使用命令中的数字或高亮的字母(如果你在终端里打开了高亮的话)来进入相应的模式。然后就只是输入你希望操作的文件的数字了(你可以使用这样的格式,1或者1-4或2,4,7)。

如果你想进入补丁模式(交互式模式下按‘p’或‘5’),你也可以直接进入:

$ git add -p
diff --git a/dummy.rb b/dummy.rb
index 4a00477..f856fb0 100644
--- a/dummy.rb
+++ b/dummy.rb
@@ -1,5 +1,5 @@
 class MyFoo
   def say
-    puts "Annyong Haseyo"
+    puts "Guten Tag"
   end
 end
Stage this hunk [y,n,q,a,d,/,e,?]?

你可以看到下方会有一些选项供选择用来添加该文件的这个改动、该文件的所有改动,等等。使用‘?’命令可以详细解释这些选项。

12. 从文件系统里保存/取回改动

有些项目(比如Git项目本身)在git文件系统中直接保存额外文件而并没有将它们加入到版本控制中。

让我们从在git中存储一个随机文件开始:

$ echo "Foo" | git hash-object -w --stdin
51fc03a9bb365fae74fd2bf66517b30bf48020cb

这样这个目标文件就已经保存到数据库中了,但是如果你没有设定一个指向它的指针的话它会被当做垃圾回收。最简单的方式是设定一个标签:

$ git tag myfile 51fc03a9bb365fae74fd2bf66517b30bf48020cb

注意这里我们使用了标签myfile。当我们需要使用这个文件的时候可以这样做:

$ git cat-file blob myfile

这个对于一些工具文件很有用,开发者可能会用到(密码,GPG密钥,等等)但是又不希望每次都检出到硬盘(尤其是在实际工作中)。

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

Linux:在Ubuntu中安装Visual Studio Code

Linux:在Ubuntu中安装Visual Studio Code
Linux:在Ubuntu中安装Visual Studio Code

微软令人意外地发布了Visual Studio Code,并支持主要的桌面平台,当然包括linux。如果你是一名需要在ubuntu工作的web开发人员,你可以非常轻松的安装Visual Studio Code

我将要使用Ubuntu Make来安装Visual Studio Code。Ubuntu Make,就是以前的Ubuntu开发者工具中心,是一个命令行工具,帮助用户快速安装各种开发工具、语言和IDE。也可以使用Ubuntu Make轻松安装Android Studio 和其他IDE,如Eclipse。本文将展示如何在Ubuntu中使用Ubuntu Make安装Visual Studio Code。(译注:也可以直接去微软官网下载安装包)

安装微软Visual Studio Code

开始之前,首先需要安装Ubuntu Make。虽然Ubuntu Make存在Ubuntu15.04官方库中,但是需要Ubuntu Make 0.7以上版本才能安装Visual Studio。所以,需要通过官方PPA更新到最新的Ubuntu Make。此PPA支持Ubuntu 14.04, 14.10 和 15.04。

注意,仅支持64位版本

打开终端,使用下列命令,通过官方PPA来安装Ubuntu Make:

sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt-get update
sudo apt-get install ubuntu-make

安装Ubuntu Make完后,接着使用下列命令安装Visual Studio Code:

umake web visual-studio-code

安装过程中,将会询问安装路径,如下图:

Linux:在Ubuntu中安装Visual Studio Code
Linux:在Ubuntu中安装Visual Studio Code

在抛出一堆要求和条件后,它会询问你是否确认安装Visual Studio Code。输入‘a’来确定:

Linux:在Ubuntu中安装Visual Studio Code
Linux:在Ubuntu中安装Visual Studio Code

确定之后,安装程序会开始下载并安装。安装完成后,你可以发现Visual Studio Code 图标已经出现在了Unity启动器上。点击图标开始运行!下图是Ubuntu 15.04 Unity的截图:

Linux:在Ubuntu中安装Visual Studio Code
Linux:在Ubuntu中安装Visual Studio Code

卸载Visual Studio Code

卸载Visual Studio Code,同样使用Ubuntu Make命令。如下:

umake web visual-studio-code --remove

如果你不打算使用Ubuntu Make,也可以通过微软官方下载安装文件。

怎样!是不是超级简单就可以安装Visual Studio Code,这都归功于Ubuntu Make。我希望这篇文章能帮助到你。如果您有任何问题或建议,欢迎给我留言。


via: http://itsfoss.com/install-visual-studio-code-ubuntu/

作者:Abhishek 译者:Vic020/VicYu 校对:wxy

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

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

Linux:如何使用Vault安全的存储密码和API密钥

Vault是用来安全的获取秘密信息的工具,它可以保存密码、API密钥、证书等信息。Vault提供了一个统一的接口来访问秘密信息,其具有健壮的访问控制机制和丰富的事件日志。

对关键信息的授权访问是一个困难的问题,尤其是当有许多用户角色,并且用户请求不同的关键信息时,例如用不同权限登录数据库的登录配置,用于外部服务的API密钥,SOA通信的证书等。当保密信息由不同的平台进行管理,并使用一些自定义的配置时,情况变得更糟,因此,安全的存储、管理审计日志几乎是不可能的。但Vault为这种复杂情况提供了一个解决方案。

突出特点

数据加密:Vault能够在不存储数据的情况下对数据进行加密、解密。开发者们便可以存储加密后的数据而无需开发自己的加密技术,Vault还允许安全团队自定义安全参数。

安全密码存储:Vault在将秘密信息(API密钥、密码、证书)存储到持久化存储之前对数据进行加密。因此,如果有人偶尔拿到了存储的数据,这也没有任何意义,除非加密后的信息能被解密。

动态密码:Vault可以随时为AWS、SQL数据库等类似的系统产生密码。比如,如果应用需要访问AWS S3 桶,它向Vault请求AWS密钥对,Vault将给出带有租期的所需秘密信息。一旦租用期过期,这个秘密信息就不再存储。

租赁和更新:Vault给出的秘密信息带有租期,一旦租用期过期,它便立刻收回秘密信息,如果应用仍需要该秘密信息,则可以通过API更新租用期。

撤销:在租用期到期之前,Vault可以撤销一个秘密信息或者一个秘密信息树。

安装Vault

有两种方式来安装使用Vault。

1. 预编译的Vault二进制 能用于所有的Linux发行版,下载地址如下,下载之后,解压并将它放在系统PATH路径下,以方便调用。

wget binary

下载相应的预编译的Vault二进制版本。

vault

解压下载到本地的二进制版本。

祝贺你!您现在可以使用Vault了。

Linux:如何使用Vault安全的存储密码和API密钥
Linux:如何使用Vault安全的存储密码和API密钥

2. 从源代码编译是另一种在系统中安装Vault的方式。在安装Vault之前需要安装GO和GIT。

Redhat系统中安装GO 使用下面的指令:

sudo yum install go

Debin系统中安装GO 使用下面的指令:

sudo apt-get install golang

或者

sudo add-apt-repository ppa:gophers/go
sudo apt-get update
sudo apt-get install golang-stable

Redhat系统中安装GIT 使用下面的命令:

sudo yum install git

Debian系统中安装GIT 使用下面的命令:

sudo apt-get install git

一旦GO和GIT都已被安装好,我们便可以开始从源码编译安装Vault。

将下列的Vault仓库拷贝至GOPATH

https://github.com/hashicorp/vault

测试下面的文件是否存在,如果它不存在,那么Vault没有被克隆到合适的路径。

$GOPATH/src/github.com/hashicorp/vault/main.go

执行下面的指令来编译Vault,并将二进制文件放到系统bin目录下。

make dev

path

一份Vault入门教程

我们已经编制了一份Vault的官方交互式教程,并带有它在SSH上的输出信息。

概述

这份教程包括下列步骤:

  • 初始化并启封您的Vault
  • 在Vault中对您的请求授权
  • 读写秘密信息
  • 密封您的Vault

初始化您的Vault

首先,我们需要为您初始化一个Vault的工作实例。在初始化过程中,您可以配置Vault的密封行为。简单起见,现在使用一个启封密钥来初始化Vault,命令如下:

vault init -key-shares=1 -key-threshold=1

您会注意到Vault在这里输出了几个密钥。不要清除您的终端,这些密钥在后面的步骤中会使用到。

Linux:如何使用Vault安全的存储密码和API密钥
Linux:如何使用Vault安全的存储密码和API密钥

启封您的Vault

当一个Vault服务器启动时,它是密封的状态。在这种状态下,Vault被配置为知道物理存储在哪里及如何存取它,但不知道如何对其进行解密。Vault使用加密密钥来加密数据。这个密钥由”主密钥”加密,主密钥不保存。解密主密钥需要入口密钥。在这个例子中,我们使用了一个入口密钥来解密这个主密钥。

vault unseal 

Unsealing SSH

为您的请求授权

在执行任何操作之前,连接的客户端必须是被授权的。授权的过程是检验一个人或者机器是否如其所申明的那样具有正确的身份。这个身份用在向Vault发送请求时。为简单起见,我们将使用在步骤2中生成的root令牌,这个信息可以回滚终端屏幕看到。使用一个客户端令牌进行授权:

vault auth 

Authorize SSH

读写保密信息

现在Vault已经被设置妥当,我们可以开始读写默认挂载的秘密后端里面的秘密信息了。写在Vault中的秘密信息首先被加密,然后被写入后端存储中。后端存储机制绝不会看到未加密的信息,并且也没有在Vault之外解密的需要。

vault write secret/hello value=world

当然,您接下来便可以读这个保密信息了:

vault read secret/hello

RW_SSH

密封您的Vault

还有一个用I来密封Vault的API。它将丢掉现在的加密密钥并需要另一个启封过程来恢复它。密封仅需要一个拥有root权限的操作者。这是一种罕见的”打破玻璃过程”的典型部分。

这种方式中,如果检测到一个入侵,Vault数据将会立刻被锁住,以便最小化损失。如果不能访问到主密钥碎片的话,就不能再次获取数据。

vault seal

Seal Vault SSH

这便是入门教程的结尾。

总结

Vault是一个非常有用的应用,它提供了一个可靠且安全的存储关键信息的方式。另外,它在存储前加密关键信息、审计日志维护、以租期的方式获取秘密信息,且一旦租用期过期它将立刻收回秘密信息。Vault是平台无关的,并且可以免费下载和安装。要发掘Vault的更多信息,请访问其官方网站


via: http://linoxide.com/how-tos/secure-secret-store-vault/

作者:Aun Raza 译者:wwy-hust 校对:wxy

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

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

Linux:两种方式创建你自己的 Docker 基本映像

欢迎大家,今天我们学习一下 docker 基本映像以及如何构建我们自己的 docker 基本映像。Docker 是一个开源项目,提供了一个可以打包、装载和运行任何应用的轻量级容器的开放平台。它没有语言支持、框架和打包系统的限制,从小型的家用电脑到高端服务器,在何时何地都可以运行。这使它们可以不依赖于特定软件栈和供应商,像一块块积木一样部署和扩展网络应用、数据库和后端服务。

Docker 映像是不可更改的只读层。Docker 使用 Union File System 在只读文件系统上增加可读写的文件系统,但所有更改都发生在最顶层的可写层,而其下的只读映像上的原始文件仍然不会改变。由于映像不会改变,也就没有状态。基本映像是没有父类的那些映像。Docker 基本映像主要的好处是它允许我们有一个独立运行的 Linux 操作系统。

Linux:两种方式创建你自己的 Docker 基本映像
Linux:两种方式创建你自己的 Docker 基本映像

下面是我们如何可以创建自定义的基本映像的方式。

1. 使用 Tar 创建 Docker 基本映像

我们可以使用 tar 构建我们自己的基本映像,我们从一个运行中的 Linux 发行版开始,将其打包为基本映像。这过程可能会有些不同,它取决于我们打算构建的发行版。在 Debian 发行版中,已经预带了 debootstrap。在开始下面的步骤之前,我们需要安装 debootstrap。debootstrap 用来获取构建基本系统需要的包。这里,我们构建基于 Ubuntu 14.04 “Trusty” 的映像。要完成这些,我们需要在终端或者 shell 中运行以下命令。

$ sudo debootstrap trusty trusty > /dev/null
$ sudo tar -C trusty -c . | sudo docker import - trusty

使用debootstrap构建docker基本映像

上面的命令为当前文件夹创建了一个 tar 文件并输出到标准输出中,”docker import – trusty” 通过管道从标准输入中获取这个 tar 文件并根据它创建一个名为 trusty 的基本映像。然后,如下所示,我们将运行映像内部的一条测试命令。

$  docker run trusty cat /etc/lsb-release

Docker GitHub Repo 中有一些允许我们快速构建基本映像的事例脚本.

2. 使用Scratch构建基本映像

在 Docker registry 中,有一个被称为 Scratch 的使用空 tar 文件构建的特殊库:

$ tar cv --files-from /dev/null | docker import - scratch

使用scratch构建docker基本映像

我们可以使用这个映像构建新的小容器:

FROM scratch
ADD script.sh /usr/local/bin/run.sh
CMD ["/usr/local/bin/run.sh"]

上面的 Dockerfile 文件来自一个很小的映像。这里,它首先从一个完全空的文件系统开始,然后它复制新建的 /usr/local/bin/run.sh 为 script.sh ,然后运行脚本 /usr/local/bin/run.sh。

结尾

这这个教程中,我们学习了如何构建一个开箱即用的自定义 Docker 基本映像。构建一个 docker 基本映像是一个很简单的任务,因为这里有很多已经可用的包和脚本。如果我们想要在里面安装想要的东西,构建 docker 基本映像非常有用。如果有任何疑问,建议或者反馈,请在下面的评论框中写下来。非常感谢!享受吧 🙂


via: http://linoxide.com/linux-how-to/2-ways-create-docker-base-image/

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

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

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