Quantcast
Channel: Linux 中国◆开源社区
Viewing all 9060 articles
Browse latest View live

七牛架构师实践日—新时代下的高效运维之道

$
0
0

云计算普及、Docker 兴起,新一代信息技术不断发展,业务扩张导致用户体量愈发庞大,系统管理难度指数直线上升……

 这带给运维的是前所未有的挑战,而高效运维从来不是一件易事,在技术革命快速发展的今天,运维该如何转身极具现实意义?

此次七牛云将携手 OneAPM,共同为大家带来一场绝不能错过的技术盛宴!

线上线下同步进行

时间:2017 年 5 月 13 日 13:30 - 17:00

线下:北京  中关村大街 11 号 E 世界财富中心 A 座 B2 层  P2 联合创业办公社

报名链接:http://www.huodongxing.com/event/5384593355500?qd=qiniu

线上:请先报名网络直播票,截图报名信息后,加工作人员微信: qiniuyun,需备注:5月13日实践日,

审核后拉你入群。活动开始后,会有直播链接发出。(已经在七牛架构师实践日任意群里的朋友,无需报名) 

 

嘉宾介绍

Topic 1《To B 企业运维的机遇和挑战》

高磊 [七牛云高级运维总监]

个人介绍:

七牛云运维总监。曾任职于百度、五八同城、豌豆荚 和 A 站。经历过大中小型 To C 领域企业,也曾创业,目前正在探索 To B 领域企业的工作方式与优化之路。    

内容简介:

从常见的互联网公司到最新的面向企业的各类公有云、专有云提供商,运维的工作内容和模式一直在转变。曾经流行的 Devops 是否依然适用?如何在云公司做运维?本次分享将带给大家一些新的视角与观点。    

 

Topic 2《百万并发云压测平台的关键技术》

高海强 [OneAPM 研发总监]

个人简介:

高海强 OneAPM 研发总监,曾就职于埃森诺历任研发工程师、技术总监、架构师、CTO 等技术及管理岗位。在性能管理相关行业 10 年以上经验,有多年的高并发、高可用、高可扩展大中型系统架构设计经验。15 年起带领团队致力于打造中国自主知识产权的百万级并发压力测试平台。

内容简介:

随着互联网业务的快速发展,用户数急速增长,同时各类市场活动频繁,我们的业务系统是否能够经受的住高并发用户访问,有什么测试手段和方法可以做到提前验证,准确评估我们的系统在流量高峰时可以经得住考验。大容量云压测平台在此背景下推出,本次将和大家分享实现压测平台的关键技术与细节。    

 

Topic 3《敏捷性的传承》

李玉峰 [唱吧高级运维总监]

个人简介:

李玉峰,曾任职大型互联网安全公司、国航、某国际互联网电商公司、历任安全架构师、项目总监、高级运维总监等。现就职唱吧,负责后台技术团队的管理、技术保障等工作,擅长架构设计优化、性能优化、数据库设计、PHP/PYTHON/H5 、网络安全 WEB 安全等。

内容简介:

公司日益壮大,如何继续保障开发效率、运维效率、人工效率,展现更好的敏捷性,是对一个创业公司的考验,也是对一个中小型公司的挑战,来,我亲自带你解读。 

 

Topic 4《看着难,做着更难 —— IP 库背后的故事》

高春辉[北京天特信科技有限公司创始人]

个人简介:

从事互联网行业接近 20 年,从 To C 到 To B,积累了丰富的经验和人脉,目前在做国内最专业的 IP 数据库。我们目前专注于与 IP 相关的数据的整理与发行,致力于将基础数据变得更准确、更精确,我们的主力产品 IP 地理位置数据库主要基于 BGP/ASN 数据以及遍布全球的网络监测点进行城市级 IP 地域数据标注,准确度远高于国内国外同类产品。

内容简介:

基于三年多的 IP 数据库维护经验,给各位讲讲我们这个领域里的一些知识,也有一些可以分享的内容,可以让大家更好的理解和应用 IP 数据库。

 

注意事项

本次活动仅限架构师、研发、产品等从业人员参与


完美阅读及发表评论,请猛击:https://linux.cn/article-8495-1.html?utm_source=rss&utm_medium=rss


bd:快速返回某级父目录而不用冗余地输入 “cd ../../..”

$
0
0

在 Linux 系统上通过命令行切换文件夹时,为了回到父目录(长路径),我们通常会重复输入 cd 命令cd ../../..),直到进入感兴趣的目录。

对于经验丰富的 Linux 用户或需要进行各种不同任务的系统管理员而言,这可能非常乏味,因此希望在操作系统时有一个快捷方式来简化工作。

建议阅读: Autojump - 一个快速浏览 Linux 文件系统的高级 “cd” 命令

在本文中,我们将在 bd 工具的帮助下,用这个简单而有用的工具快速回到 Linux 中的父目录。

bd 是用于切换文件夹的便利工具,它可以使你快速返回到父目录,而不必重复键入 cd ../../.. 。 你可以可靠地将其与其他 Linux 命令组合以执行几个日常操作。

如何在 Linux 中安装 bd

运行下面的命令,使用 wget 命令下载并安装 bd 到 /usr/bin/ 中,添加执行权限,并在 ~/.bashrc 中创建需要的别名:

$ wget --no-check-certificate -O /usr/bin/bd https://raw.github.com/vigneshwaranr/bd/master/bd
$ chmod +rx /usr/bin/bd
$ echo 'alias bd=". bd -si" >> ~/.bashrc
$ source ~/.bashrc

注意:如果要启用大小写敏感的目录名匹配,请在上面创建的别名中,设置  -s 标志而不是 -si 标志。

要启用自动补全支持,运行这些命令:

$ sudo wget -O /etc/bash_completion.d/bd https://raw.github.com/vigneshwaranr/bd/master/bash_completion.d/bd
$ sudo source /etc/bash_completion.d/bd

如何在 Linux 中使用 bd

假设你目前在这个路径的顶层目录:

/media/aaronkilik/Data/Computer Science/Documents/Books/LEARN/Linux/Books/server $

你想要快速进入 “Documents” 目录,只要输入:

$ bd Documents

接着直接进入到 Data 目录,你可以输入:

$ bd Data

Switch Between Directories Quickly

目录间快速切换

实际上,bd 让它变得更加直接,你要做的是输入 “bd <开头几个字母>”,比如:

$ bd Doc
$ bd Da

Quickly Switch Directories

快速切换目录

重要:如果层次结构中有不止一个具有相同名称的目录,bd 将会移动到最接近的目录,而不考虑最近的父目录,如下面的例子那样。

例如,在上面的路径中,有两个名称相同的目录 Books,如果你想移动到:

/media/aaronkilik/Data/ComputerScience/Documents/Books/LEARN/Linux/Books

输入 bd Books 会进入:

/media/aaronkilik/Data/ComputerScience/Documents/Books

Move to 'Books' Directory Quickly

快速进入 ‘Books’ 目录

另外,在反引号``中使用 bd 如 `bd <开头几个字母>` 会打印出路径而不更改当前目录,所以你可以与其他常见的 Linux 命令,如 lsecho 等一起使用 `bd <开头几个字母>`

在下面的例子中,当前在 /var/www/html/internship/assets/filetree 目录中,要打印出绝对路径、详细列出内容、统计目录 html 中所有文件的大小,你不必进入它,只需要键入:

$ echo `bd ht`
$ ls -l `bd ht`
$ du -cs `bd ht`

Switch Directory with Listing

列出切换的目录

要在 Github 上了解更多关于 bd 的信息:https://github.com/vigneshwaranr/bd

就是这样了!在本文中,我们展示了使用 bd 程序在 Linux 中快速切换文件夹的便捷方法。

通过下面的反馈栏单发表你的看法。此外,你还知道其他类似的工具么,在评论中让我们知道。


作者简介:

Aaron Kili是一名 Linux 和 F.O.S.S 的爱好者,未来的 Linux 系统管理员、网站开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并乐于分享知识。


via: http://www.tecmint.com/bd-quickly-go-back-to-a-linux-parent-directory/

作者:Aaron Kili 译者:geekpi 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8491-1.html?utm_source=rss&utm_medium=rss

rdiff-backup:一个 Linux 中的远程增量备份工具

$
0
0

rdiff-backup 是一个用于本地/远程增量备份的强大而易用的 Python 脚本,它适用于任何 POSIX 操作系统,如Linux、Mac OS X 或 Cygwin。它集合了镜像和增量备份的显著特性。

值得注意的是,它保留了子目录、dev 文件、硬链接,以及关键的文件属性,如权限、uid/gid 所有权、修改时间、扩展属性、acl 以及 resource fork。它可以通过管道以高效带宽的模式工作,这与流行的 rsync 备份工具类似。

rdiff-backup 通过使用 SSH 将单个目录备份到另一个目录,这意味着数据传输被加密并且是安全的。目标目录(在远程系统上)最终会得到源目录的完整副本,但是此外的反向差异会存储在目标目录的特殊子目录中,从而可以恢复前一段时间丢失的文件。

依赖

要在 Linux 中使用 rdiff-backup,你需要在系统上安装以下软件包:

  • Python v2.2 或更高版本
  • librsync v0.9.7 或更高版本
  • pylibacl 和 pyxattr Python 模块是可选的,但它们分别是 POSIX 访问控制列表(ACL)和扩展属性支持必需的。
  • rdiff-backup-statistics 需要 Python v2.4 或更高版本。

如何在 Linux 中安装 rdiff-backup

重要:如果你通过网络运行它,则必须在两个系统中都安装 rdiff-backup,两者最好是相同版本。

该脚本已经存在于主流 Linux 发行版的官方仓库中,只需运行以下命令来安装 rdiff-backup 及其依赖关系:

在 Debian/Ubuntu 中

$ sudo apt-get update
$ sudo apt-get install librsync-dev rdiff-backup

在 CentOS/RHEL 7 中

# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
# rpm -ivh epel-release-7-9.noarch.rpm
# yum install librsync rdiff-backup

在 CentOS/RHEL 6 中

# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install librsync rdiff-backup

在 Fedora 中

# yum install librsync rdiff-backup
# dnf install librsync rdiff-backup [Fedora 22+]

如何在 Linux 中使用 rdiff-backup

如前所述,rdiff-backup 使用 SSH 连接到网络上的远程计算机,SSH 的默认身份验证方式是用户名/密码,这通常需要人工交互。

但是,要自动执行诸如脚本等自动备份之类的任务,那么你需要配置使用 SSH 密钥无密码登录 SSH,因为 SSH 密钥增加了两台 Linux服务器之间的信任来简化文件同步或传输

在你设置了 SSH 无密码登录后,你可以使用下面的例子开始使用该脚本。

备份文件到不同分区

下面的例子会备份 /etc 文件夹到另外一个分区的 Backup 文件夹内:

$ sudo rdiff-backup /etc /media/aaronkilik/Data/Backup/mint_etc.backup

Backup Files to Different Partition

备份文件到不同分区

要排除一个特定文件夹和它的子目录,你可以如下使用 --exclude 选项:

$ sudo rdiff-backup --exclude /etc/cockpit --exclude /etc/bluetooth /media/aaronkilik/Data/Backup/mint_etc.backup

我们可以如下使用 --include-special-files 包含所有的设备文件、fifo 文件、socket 文件和链接文件:

$ sudo rdiff-backup --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup

还有另外两个重要标志来用于选择文件,--max-file-size 用来排除大于给定字节大小的文件,--min-file-size 用于排除小于给定字节大小的文件:

$ sudo rdiff-backup --max-file-size 5M --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup

在本地 Linux 服务器上备份远程文件

要这么做,我们使用:

Remote Server (tecmint)         : 192.168.56.102
Local Backup Server (backup)    : 192.168.56.10

如前所述,你必须在两台机器上安装相同版本的 rdiff-backup,如下所示,请尝试在两台机器上检查版本:

$ rdiff-backup -V

Check rdiff Version on Servers

检查服务器中 rdiff 版本

在备份服务器中,像这样创建一个存储备份文件的目录:

# mkdir -p /backups

现在在备份服务器中,运行下面的命令来将远程 Linux 服务器 192.168.56.102 中的 /var/log//root 备份到 /backups 中:

# rdiff-backup root@192.168.56.102::/var/log/ /backups/192.168.56.102_logs.backup
# rdiff-backup root@192.168.56.102::/root/ /backups/192.168.56.102_rootfiles.backup

下面的截图展示了远程服务器 192.168.56.102 中的 root 文件夹以及 192.168.56.10 备份服务器中的已备份文件:

Backup Remote Directory on Local Server

在本地服务器备份远程目录

注意截图中 “backup” 目录中创建的 rdiff-backup-data 文件夹,它包含了备份过程和增量文件的重要数据。

rdiff-backup - Backup Process Files

rdiff-backup – 备份过程文件

现在,在 192.168.56.102 服务器中,如下所示 root 目录已经添加了额外的文件:

Verify Backup Directory

验证备份目录

让我们再次运行备份命令以获取更改的数据,我们可以使用 -v[0-9](其中数字指定详细程度级别,默认值为 3,这是静默模式)选项设置详细功能:

# rdiff-backup -v4 root@192.168.56.102::/root/ /backups/192.168.56.102_rootfiles.backup

Incremental Backup with Summary

带有摘要的增量备份

要列出 /backups/192.168.56.102_rootfiles.backup 目录中包含的部分增量备份的数量和日期,我们可以运行:

# rdiff-backup -l /backups/192.168.56.102_rootfiles.backup/

使用 cron 自动进行 rdiff-back 备份

使用 --print-statistics 成功备份后,我们可以打印摘要统计信息。但是,如果我们不设置此选项,我们可以仍从会话统计中获得。在手册页的 “STATISTICS” 部分中阅读有关此选项的更多信息。

-remote-schema 选项使我们能够指定使用替代方法连接到远程计算机。

现在,我们开始在备份服务器 192.168.56.10 上创建一个 backup.sh 脚本,如下所示:

# cd ~/bin
# vi backup.sh

添加下面的行到脚本中。

#!/bin/bash
#This is a rdiff-backup utility backup script
#Backup command
rdiff-backup --print-statistics --remote-schema 'ssh -C %s "sudo /usr/bin/rdiff-backup --server --restrict-read-only  /"'  root@192.168.56.102::/var/logs  /backups/192.168.56.102_logs.back
#Checking rdiff-backup command success/error
status=$?
if [ $status != 0 ]; then
#append error message in ~/backup.log file
echo "rdiff-backup exit Code: $status - Command Unsuccessful" >>~/backup.log;
exit 1;
fi
#Remove incremental backup files older than one month
rdiff-backup --force --remove-older-than 1M /backups/192.168.56.102_logs.back

保存文件并退出,接着运行下面的命令在服务器 192.168.56.10 上的 crontab 中添加此脚本:

# crontab -e

添加此行在每天午夜运行你的备份脚本:

0   0  *  *  * /root/bin/backup.sh > /dev/null 2>&1

保存 crontab 并退出,现在我们已经成功自动化了备份过程。确保一切如希望那样工作。

阅读 rdiff-backup 的手册页获取更多信息、详尽的使用选项以及示例:

# man rdiff-backup

rdiff-backup 主页: http://www.nongnu.org/rdiff-backup/

就是这样了!在本教程中,我们向你展示了如何安装并基础地使用 rdiff-backup 这个易于使用的 Python 脚本,用于 Linux 中的本地/远程增量备份。 请通过下面的反馈栏与我们分享你的想法。

(题图:Pixabay,CC0)


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin 和 web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/rdiff-backup-remote-incremental-backup-for-linux/

作者:Aaron Kili 译者:geekpi 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8496-1.html?utm_source=rss&utm_medium=rss

Remmina:一个 Linux 下功能丰富的远程桌面共享工具

$
0
0

Remmina 是一款在 Linux 和其他类 Unix 系统下的自由开源、功能丰富、强大的远程桌面客户端,它用 GTK+ 3 编写而成。它适用于那些需要远程访问及使用许多计算机的系统管理员和在外出行人员。

它以简单、统一、同质、易用的用户界面支持多种网络协议。

Remmina 功能

  • 支持 RDP、VNC、NX、XDMCP 和 SSH。
  • 用户能够以组的形式维护一份连接配置列表。
  • 支持用户直接输入服务器地址的快速连接。
  •   具有更高分辨率的远程桌面,可以在窗口和全屏模式下滚动/缩放。
  • 支持窗口全屏模式;当鼠标移动到屏幕边缘时,远程桌面会自动滚动。
  • 还支持全屏模式的浮动工具栏;使你能够在不同模式间切换、触发键盘获取、最小化等。
  • 提供选项卡式界面,可以按组管理。
  • 还提供托盘图标,允许你快速访问已配置的连接文件。

在本文中,我们将向你展示如何在 Linux 中安装 Remmina,以及使用它通过支持的不同协议实现桌面共享。

先决条件

  • 在远程机器上允许桌面共享(让远程机器允许远程连接)。
  • 在远程机器上设置 SSH 服务。

如何在 Linux 中安装 Remmina 远程共享工具

Remmina 及其插件包已经在所有主流的 Linux 发行版的大多数官方仓库中提供。运行下面的命令以安装它和所有支持的插件:

------------ 在 Debian/Ubuntu 中 ------------
$ sudo apt-get install remmina remmina-plugin-*
------------ 在 CentOS/RHEL 中 ------------
# yum install remmina remmina-plugin-*
------------ 在 Fedora 22+ 中 ------------
$ sudo dnf copr enable hubbitus/remmina-next
$ sudo dnf upgrade --refresh 'remmina*' 'freerdp*'

一旦安装完成后,在 Ubuntu 或 Linux Mint 菜单中搜索 remmina,接着运行它:

Remmina Desktop Sharing Client

Remmina 桌面共享客户端

你可以通过图形界面或者编辑 $HOME/.remmina 或者 $HOME/.config/remmina 下的文件来进行配置。

要设置到一个新的远程服务器的连接,按下 Ctrl+N 并点击 Connection -> New,如下截图中配置远程连接。这是基本的设置界面。

Remmina Basic Desktop Preferences

Remmina 基础桌面配置

点击界面上的 “Advanced”,配置高级连接设置。

Remmina Advance Desktop Settings

Remmina 高级桌面设置

要配置 SSH,点击界面中的 SSH。

Remmina SSH Settings

Remmina SSH 设置

在完成所有的必要配置后,点击 “Save” 保存设置,在主界面中你会如下看到所有已配置远程连接。

Remmina Configured Servers

Remmina 配置的服务器

使用 sFTP 连接到远程机器

选择连接配置并编辑设置,在 “Protocols” 下拉菜单中选择 sFTP - Secure File Transfer。接着设置启动路径(可选),并指定 SSH 验证细节。最后点击连接

Remmina sftp Connection

Remmina sftp 连接

这里输入你的 SSH 用户密码。

Enter SSH Password

输入 SSH 密码

如果你看到下面的界面,那么代表 sFTP 连接成功了,你现在可以在两台机器键传输文件了

Remmina Remote sFTP Filesystem

Remmina 远程 sFTP 文件系统

使用 SSH 连接到远程机器

选择连接配置并编辑设置,在 “Protocols” 下拉菜单中选择 SSH - Secure Shell,并可选设置启动程序以及 SSH 验证细节。最后点击连接并输入 SSH 密码。

Remmina SSH Connection

Remmina SSH 连接

当你看到下面的界面,这意味着你的连接成功了,你现在可以使用 SSH 控制远程机器了。

Remmina Remote SSH Connection

Remmina 远程 SSH 连接

使用 VNC 连接到远程机器

选择连接配置并编辑设置,在 “Protocols” 下拉菜单中选择 VNC - Virtual Network Computing。为该连接配置基础、高级以及 ssh 设置,点击连接,接着输入用户 SSH 密码。

Remmina VNC Connection

Remmina VNC 连接

一旦你看到下面的界面时,这意味着你已经成功使用 VNC 协议连接到远程机器上了。

如下截图所示,在桌面登录界面输入用户登录密码。

Remmina Remote Desktop Login

Remmina 远程桌面登录

Remmina Remote Desktop Sharing

Remmina 远程桌面共享

使用上面的步骤可以很简单地使用其他的协议访问远程机器。

Remmina 主页: https://www.remmina.org/wp/

就是这样了!在本文中,我们向你展示了如何在 Linux 中安装与使用 Remmina 远程连接客户端中的几种支持的协议。你可以在下面的评论栏中分享你的任何想法。

(题图:Pixabay,CC0)


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux 系统管理员和网络开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/remmina-remote-desktop-sharing-and-ssh-client/

作者:Aaron Kili 译者:geekpi 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8493-1.html?utm_source=rss&utm_medium=rss

Mark Shuttleworth:桌面对我们来说仍然重要

$
0
0

在波士顿刚刚召开的 OpenStack Summit 2017 大会上, Ubuntu 的母公司 Canonical 的 CEO Mark Shuttleworth 谈及了 Ubuntu 在桌面、云计算和物联网等方面将来的计划。

在 Mark Shuttleworth 前一段日子宣布了停止开发 Unity 桌面环境之后,震动了整个开源界,就大家非常关注的 Ubuntu Linux 的将来发展,这位 Canonical 及 Ubuntu 的创始人接受了 theCUBE 的采访。

Mark Shuttleworth 说他的梦想从来就是让 Ubuntu 成为桌面、云和物联网的主流,从未变过,但是事情的发展并不总是如预期的一样。据其所称,Ubuntu 看起来已经成为了云计算和数据中心的事实标准了。

在本次访谈中,Mark Shuttleworth 认为 Ubuntu 桌面对于 Canonical 公司在支持自由和开源软件、IT 创新等方面仍将保持重要地位,但是在商业上,Canonical 将更多的关注在云和物联网方面。

下面是本次访谈的视频:


完美阅读及发表评论,请猛击:https://linux.cn/article-8497-1.html?utm_source=rss&utm_medium=rss

向 Linus Torvalds 学习让编出的代码具有 “good taste”

$
0
0

最近关于 Linus Torvalds 的一个采访中,这位 Linux 的创始人,在采访过程中大约 14:20 的时候,提及了关于代码的 “good taste”。good taste?采访者请他展示更多的细节,于是,Linus Torvalds 展示了一张提前准备好的插图。

他展示的是一个代码片段。但这段代码并没有 “good taste”。这是一个具有 “poor taste” 的代码片段,把它作为例子,以提供一些初步的比较。

Poor Taste Code Example

这是一个用 C 写的函数,作用是删除链表中的一个对象,它包含有 10 行代码。

他把注意力集中在底部的 if 语句。正是这个 if 语句受到他的批判。

我暂停了这段视频,开始研究幻灯片。我发现我最近有写过和这很像的代码。Linus 不就是在说我的代码品味很差吗?我放下自傲,继续观看视频。

随后, Linus 向观众解释,正如我们所知道的,当从链表中删除一个对象时,需要考虑两种可能的情况。当所需删除的对象位于链表的表头时,删除过程和位于链表中间的情况不同。这就是这个 if 语句具有 “poor taste” 的原因。

但既然他承认考虑这两种不同的情况是必要的,那为什么像上面那样写如此糟糕呢?

接下来,他又向观众展示了第二张幻灯片。这个幻灯片展示的是实现同样功能的一个函数,但这段代码具有 “goog taste” 。

Good Taste Code Example

原先的 10 行代码现在减少为 4 行。

但代码的行数并不重要,关键是 if 语句,它不见了,因为不再需要了。代码已经被重构,所以,不用管对象在列表中的位置,都可以运用同样的操作把它删除。

Linus 解释了一下新的代码,它消除了边缘情况,就是这样。然后采访转入了下一个话题。

我琢磨了一会这段代码。 Linus 是对的,的确,第二个函数更好。如果这是一个确定代码具有 “good taste” 还是 “bad taste” 的测试,那么很遗憾,我失败了。我从未想到过有可能能够去除条件语句。我写过不止一次这样的 if 语句,因为我经常使用链表。

这个例子的意义,不仅仅是教给了我们一个从链表中删除对象的更好方法,而是启发了我们去思考自己写的代码。你通过程序实现的一个简单算法,可能还有改进的空间,只是你从来没有考虑过。

以这种方式,我回去审查最近正在做的项目的代码。也许是一个巧合,刚好也是用 C 写的。

我尽最大的能力去审查代码,“good taste” 的一个基本要求是关于边缘情况的消除方法,通常我们会使用条件语句来消除边缘情况。你的测试使用的条件语句越少,你的代码就会有更好的 “taste” 。

下面,我将分享一个通过审查代码进行了改进的一个特殊例子。

这是一个关于初始化网格边缘的算法。

下面所写的是一个用来初始化网格边缘的算法,网格 grid 以一个二维数组表示:grid[行][列] 。

再次说明,这段代码的目的只是用来初始化位于 grid 边缘的点的值,所以,只需要给最上方一行、最下方一行、最左边一列以及最右边一列赋值即可。

为了完成这件事,我通过循环遍历 grid 中的每一个点,然后使用条件语句来测试该点是否位于边缘。代码看起来就是下面这样:

for (r = 0; r < GRID_SIZE; ++r) {
    for (c = 0; c < GRID_SIZE; ++c) {
        // Top Edge
        if (r == 0)
            grid[r][c] = 0;
        // Left Edge
        if (c == 0)
            grid[r][c] = 0;
        // Right Edge
        if (c == GRID_SIZE - 1)
            grid[r][c] = 0;
        // Bottom Edge
        if (r == GRID_SIZE - 1)
            grid[r][c] = 0;
    }
}

虽然这样做是对的,但回过头来看,这个结构存在一些问题。

  1. 复杂性 — 在双层循环里面使用 4 个条件语句似乎过于复杂。
  2. 高效性 — 假设 GRID_SIZE 的值为 64,那么这个循环需要执行 4096 次,但需要进行赋值的只有位于边缘的 256 个点。

用 Linus 的眼光来看,将会认为这段代码没有 “good taste” 。

所以,我对上面的问题进行了一下思考。经过一番思考,我把复杂度减少为包含四个条件语句的单层 for 循环。虽然只是稍微改进了一下复杂性,但在性能上也有了极大的提高,因为它只是沿着边缘的点进行了 256 次循环。

for (i = 0; i < GRID_SIZE * 4; ++i) {
    // Top Edge
    if (i < GRID_SIZE)
        grid[0] = 0;
    // Right Edge
    else if (i < GRID_SIZE * 2)
        grid[i - GRID_SIZE][GRID_SIZE - 1] = 0;
    // Left Edge
    else if (i < GRID_SIZE * 3)
        grid[i - (GRID_SIZE * 2)][0] = 0;
    // Bottom Edge
    else
        grid[GRID_SIZE - 1][i - (GRID_SIZE * 3)] = 0;
}

的确是一个很大的提高。但是它看起来很丑,并不是易于阅读理解的代码。基于这一点,我并不满意。

我继续思考,是否可以进一步改进呢?事实上,答案是 YES!最后,我想出了一个非常简单且优雅的算法,老实说,我不敢相信我会花了那么长时间才发现这个算法。

下面是这段代码的最后版本。它只有一层 for 循环并且没有条件语句。另外。循环只执行了 64 次迭代,极大的改善了复杂性和高效性。

for (i = 0; i < GRID_SIZE; ++i) {
    // Top Edge
    grid[0] = 0;

    // Bottom Edge
    grid[GRID_SIZE - 1] = 0;
    // Left Edge
    grid[0] = 0;
    // Right Edge
    grid[GRID_SIZE - 1] = 0;
}

这段代码通过每次循环迭代来初始化四条边缘上的点。它并不复杂,而且非常高效,易于阅读。和原始的版本,甚至是第二个版本相比,都有天壤之别。

至此,我已经非常满意了。

那么,我是一个有 “good taste” 的开发者么?

我觉得我是,但是这并不是因为我上面提供的这个例子,也不是因为我在这篇文章中没有提到的其它代码……而是因为具有 “good taste” 的编码工作远非一段代码所能代表。Linus 自己也说他所提供的这段代码不足以表达他的观点。

我明白 Linus 的意思,也明白那些具有 “good taste” 的程序员虽各有不同,但是他们都是会将他们之前开发的代码花费时间重构的人。他们明确界定了所开发的组件的边界,以及是如何与其它组件之间的交互。他们试着确保每一样工作都完美、优雅。

其结果就是类似于 Linus 的 “good taste” 的例子,或者像我的例子一样,不过是千千万万个 “good taste”。

你会让你的下个项目也具有这种 “good taste” 吗?


via: https://medium.com/@bartobri/applying-the-linus-tarvolds-good-taste-coding-requirement-99749f37684a

作者:Brian Barto 译者:ucasFL 校对:wxy

本文由 LCTT 组织编译,Linux中国 荣誉推出


完美阅读及发表评论,请猛击:https://linux.cn/article-8498-1.html?utm_source=rss&utm_medium=rss

如何在树莓派上部署 Kubernetes

$
0
0

只用几步,使用 Weave Net 在树莓派上设置 Kubernetes。

当我开始对 ARM设备,特别是 Raspberry Pi 感兴趣时,我的第一个项目是一个 OpenVPN 服务器。

通过将 Raspberry Pi 作为家庭网络的安全网关,我可以使用我的手机来控制我的桌面,远程播放 Spotify,打开文档以及一些其他有趣的东西。我在第一个项目中使用了一个现有的教程,因为我害怕自己在命令行中拼砌。

几个月后,这种恐惧消失了。我扩展了我的原始项目,并使用 Samba 服务器从文件服务器分离出了 OpenVPN 服务器。这是我第一个没有完全按照教程来的项目。不幸的是,在我的 Samba 项目结束后,我意识到我没有记录任何东西,所以我无法复制它。为了重新创建它,我不得不重新参考我曾经用过的那些单独的教程,将项目拼回到一起。

我学到了关于开发人员工作流程的宝贵经验 - 跟踪你所有的更改。我在本地做了一个小的 git 仓库,并记录了我输入的所有命令。

发现 Kubernetes

2015 年 5 月,我发现了 Linux 容器和 Kubernetes。我觉得 Kubernetes 很有魅力,我可以使用仍然处于技术发展的概念 - 并且我实际上可以用它。平台本身及其所呈现的可能性令人兴奋。在此之前,我才刚刚在一块 Raspberry Pi 上运行了一个程序。而有了 Kubernetes,我可以做出比以前更先进的配置。

那时候,Docker(v1.6 版本,如果我记得正确的话)在 ARM 上有一个 bug,这意味着在 Raspberry Pi 上运行 Kubernetes 实际上是不可能的。在早期的 0.x 版本中,Kubernetes 的变化很快。每次我在 AMD64 上找到一篇关于如何设置 Kubernetes 的指南时,它针对的还都是一个旧版本,与我当时使用的完全不兼容。

不管怎样,我用自己的方法在 Raspberry Pi 上创建了一个 Kubernetes 节点,而在 Kubernetes v1.0.1 中,我使用 Docker v1.7.1 让它工作了。这是第一个将 Kubernetes 全功能部署到 ARM 的方法。

在 Raspberry Pi 上运行 Kubernetes 的优势在于,由于 ARM 设备非常小巧,因此不会产生大量的功耗。如果程序以正确的方式构建而成,那么就可以在 AMD64 上用同样的方法运行同一个程序。这样的一块小型 IoT 板为教育创造了巨大的机会。用它来做演示也很有用,比如你要出差参加一个会议。携带 Raspberry Pi (通常)比拖着大型英特尔机器要容易得多。

现在按照我建议的 ARM(32 位和 64 位)的支持已被合并到 Kubernetes 核心中。ARM 的二进制文件会自动与 Kubernetes 一起发布。虽然我们还没有为 ARM 提供自动化的 CI(持续集成)系统,不过在 PR 合并之前会自动确定它可在 ARM 上工作,现在它运转得不错。

Raspberry Pi 上的分布式网络

我通过 kubeadm 发现了 Weave Net。Weave Mesh 是一个有趣的分布式网络解决方案,因此我开始了解更多关于它的内容。在 2016 年 12 月,我在 Weaveworks 收到了第一份合同工作,我成为了 Weave Net 中 ARM 支持团队的一员。

我很高兴可以在 Raspberry Pi 上运行 Weave Net 的工业案例,比如那些需要设备更加移动化的工厂。目前,将 Weave Scope 或 Weave Cloud 部署到 Raspberry Pi 可能不太现实(尽管可以考虑使用其他 ARM 设备),因为我猜这个软件需要更多的内存才能运行良好。理想情况下,随着 Raspberry Pi 升级到 2GB 内存,我想我可以在它上面运行 Weave Cloud 了。

在 Weave Net 1.9 中,Weave Net 支持了 ARM。Kubeadm(通常是 Kubernetes)在多个平台上工作。你可以使用 Weave 将 Kubernetes 部署到 ARM,就像在任何 AMD64 设备上一样安装 Docker、kubeadm、kubectl 和 kubelet。然后初始化控制面板组件运行的主机:

kubeadm init

接下来,用下面的命令安装你的 pod 网络:

kubectl apply -f https://git.io/weave-kube

在此之前在 ARM 上,你只能用 Flannel 安装 pod 网络,但是在 Weave Net 1.9 中已经改变了,它官方支持了 ARM。

最后,加入你的节点:

kubeadm join --token <token> <master-ip>

就是这样了!Kubernetes 已经部署到了 Raspberry Pi 上了。相比在 Intel/AMD64 上运行,你不用做什么特别的事情;Weave Net 在 ARM 上就能工作的很好。

Raspberry Pi 社区

我希望 Raspberry Pi 社区成长起来,他们的思想传播到世界其他地方。他们在英国和其他国家已经取得了成功,但在芬兰并不是很成功。我希望生态系统能够继续扩展,以让更多的人学习如何部署 Kubernetes 或 Weave 到 ARM 设备上。毕竟,这些是我学到的。通过在 Raspberry Pi 设备上自学,我更好地了解了 ARM 及其上面部署的软件。

最后的思考

我通过加入用户社区、提出问题和不同程度的测试,在线学习了关于 Raspberry Pi 和 Kubernetes 的一切。

我是居住在芬兰的说瑞典语的高中生,到目前为止,我还从来没有参加过编程或计算机课程。但我仍然能够加入开源社区,因为它对年龄或教育没有限制:你的工作是根据其价值来评判的。

对于那些第一次要在开源项目中做出贡献感到紧张的人,我想说:深入进去,因为这是完全值得的。你做什么没有任何限制,你将永远不知道开源世界将为你提供哪些机会。这会很有趣,我保证!


作者简介:

Lucas Käldström - 谢谢你发现我!我是一名来自芬兰的说瑞典语的高中生。


via: https://opensource.com/article/17/3/kubernetes-raspberry-pi

作者:Lucas Käldström 译者:geekpi 校对:jasminepeng

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8499-1.html?utm_source=rss&utm_medium=rss

从损坏的 Linux EFI 安装中恢复

$
0
0

在过去的十多年里,Linux 发行版在安装前、安装过程中、以及安装后偶尔会失败,但我总是有办法恢复系统并继续正常工作。然而,Solus 损坏了我的笔记本。

GRUB 恢复。不行,重装。还不行!Ubuntu 拒绝安装,目标设备的报错一会这样,一会那样。哇。我之前还没有遇到过像这样的事情。我的测试机已变成无用的砖块。难道我该绝望吗?不,绝对不。让我来告诉你怎样你可以修复它吧。

问题详情

所有事情都从 Solus 尝试安装它自己的启动引导器 - goofiboot 开始。不知道什么原因、它没有成功完成安装,留给我的就是一个无法启动的系统。经过 BIOS 引导之后,我进入一个 GRUB 恢复终端。

安装失败

我尝试在终端中手动修复,使用类似和我在我详实的 GRUB2 指南中介绍的各种命令。但还是不行。然后我尝试按照我在 GRUB2 和 EFI 指南中的建议从 Live CD 中恢复(LCTT 译注:Live CD 是一个完整的计算机可引导安装媒介,它包括在计算机内存中运行的操作系统,而不是从硬盘驱动器加载;CD 本身是只读的。 它允许用户为任何目的运行操作系统,而无需安装它或对计算机的配置进行任何更改)。我用 efibootmgr 工具创建了一个引导入口,确保标记它为有效。正如我们之前在指南中做的那样,之前这些是能正常工作的。哎,现在这个方法也不起作用。

我尝试做一个完整的 Ubuntu 安装,把它安装到 Solus 所在的分区,希望安装程序能给我一些有用的信息。但是 Ubuntu 无法完成安装。它报错:failed to install into /target。又回到开始的地方了。怎么办?

手动清除 EFI 分区

显然,我们的 EFI 分区出现了严重问题。简单回顾以下,如果你使用的是 UEFI,那么你需要一个单独的 FAT-32 格式化的分区。该分区用于存储 EFI 引导镜像。例如,当你安装 Fedora 时,Fedora 引导镜像会被拷贝到 EFI 子目录。每个操作系统都会被存储到一个它自己的目录,一般是 /boot/efi/EFI/<操作系统版本>/

EFI 分区内容

在我的 G50 机器上,这里有很多各种发行版测试条目,包括:centos、debian、fedora、mx-15、suse、Ubuntu、zorin 以及其它。这里也有一个 goofiboot 目录。但是,efibootmgr 并没有在它的菜单中显示 goofiboot 条目。显然这里出现了一些问题。

sudo efibootmgr&nbsp;-d /dev/sda
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,0005,2003,0000,2001,2002
Boot0000* Lenovo Recovery System
Boot0001* ubuntu
Boot0003* EFI Network 0 for IPv4 (68-F7-28-4D-D1-A1)
Boot0004* EFI Network 0 for IPv6 (68-F7-28-4D-D1-A1)
Boot0005* Windows Boot Manager
Boot0006* fedora
Boot0007* suse
Boot0008* debian
Boot0009* mx-15
Boot2001* EFI USB Device
Boot2002* EFI DVD/CDROM
Boot2003* EFI Network
...

P.S. 上面的输出是在 LIVE 会话中运行命令生成的!

我决定清除所有非默认的以及非微软的条目然后重新开始。显然,有些东西被损坏了,妨碍了新的发行版设置它们自己的启动引导程序。因此我删除了 /boot/efi/EFI 分区下面除了 Boot 和 Windows 以外的所有目录。同时,我也通过删除所有额外的条目更新了启动管理器。

efibootmgr -b <hex> -B <hex>

最后,我重新安装了 Ubuntu,并仔细监控 GRUB 安装和配置的过程。这次,成功完成啦。正如预期的那样,几个无效条目出现了一些错误,但整个安装过程完成就好了。

安装的错误消息

安装的成功消息

额外阅读

如果你不喜欢这种手动修复,你可以阅读:

  • Boot-Info 手册,里面有帮助你恢复系统的自动化工具
  • Boot-repair-cd 自动恢复工具下载页面

总结

如果你遇到由于 EFI 分区破坏而导致系统严重瘫痪的情况,那么你可能需要遵循本指南中的建议。 删除所有非默认条目。 如果你使用 Windows 进行多重引导,请确保不要修改任何和 Microsoft 相关的东西。 然后相应地更新引导菜单,以便删除损坏的条目。 重新运行所需发行版的安装设置,或者尝试用之前介绍的比较不严谨的修复方法。

我希望这篇小文章能帮你节省一些时间。Solus 对我系统的更改使我很懊恼。这些事情本不应该发生,恢复过程也应该更简单。不管怎样,虽然事情似乎很可怕,修复并不是很难。你只需要删除损害的文件然后重新开始。你的数据应该不会受到影响,你也应该能够顺利进入到运行中的系统并继续工作。开始吧。

加油。


作者简介:

我叫 Igor Ljubuncic。38 岁,已婚,但还没有小孩。我现在是一个云技术公司的首席工程师,前端新手。在 2015 年年初之前,我在世界上最大的 IT 公司之一的工程计算团队担任操作系统架构师,开发新的基于 Linux 的解决方案、优化内核、在 Linux 上实现一些好的想法。在这之前,我是一个为高性能计算环境设计创新解决方案团队的技术主管。其它一些头衔包括系统专家、系统开发员或者类似的。所有这些都是我的爱好,但从 2008 年开始,就是有报酬的工作。还有什么比这更令人满意的呢?

从 2004 到 2008 年,我通过在医疗图像行业担任物理专家养活自己。我的工作主要关注解决问题和开发算法。为此,我广泛使用 Matlab,主要用于信号和图像处理。另外,我已通过几个主要工程方法的认证,包括 MEDIC Six Sigma Green Belt、实验设计以及统计工程。

(题图:Pixabay,CC0)


via: http://www.dedoimedo.com/computers/grub2-efi-corrupt-part-recovery.html

作者:Igor Ljubuncic 译者:ictlyh 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8500-1.html?utm_source=rss&utm_medium=rss


如何通过 OpenELEC 创建你自己的媒体中心

$
0
0

你是否曾经想要创建你自己的家庭影院系统?如果是的话,这里有一个为你准备的指南!在本篇文章中,我们将会介绍如何设置一个由 OpenELEC 以及 Kodi 驱动的家庭娱乐系统。我们将会介绍如何制作安装介质,哪些设备可以运行该软件,如何安装它,以及其他一切需要知道的事情等等。

选择一个设备

在开始设定媒体中心的软件前,你需要选择一个设备。OpenELEC 支持一系列设备。从一般的桌面设备到树莓派 2/3 等等。选择好设备以后,考虑一下你怎么访问 OpenELEC 系统中的媒体并让其就绪。

*注意: *OpenELEC 基于 Kodi,有许多方式加载一个可播放的媒体(比如 Samba 网络分享,外设,等等)。

制作安装磁盘

OpenELEC 安装磁盘需要一个 USB 存储器,且其至少有 1GB 的容量。这是安装该软件的唯一方式,因为开发者没有发布 ISO 文件。取而代之的是需要创建一个 IMG 原始文件。选择与你设备相关的链接并且下载原始磁盘镜像。当磁盘镜像下载完毕,打开一个终端,并且使用命令将数据从压缩包中解压出来。

在Linux/macOS上

cd ~/Downloads
gunzip -d OpenELEC*.img.gz

在Windows上

下载 7zip,安装它,然后解压压缩文件。

当原始的 .IMG 文件被解压后,下载 Etcher USB creation tool,并且依据在界面上的指示来安装它并创建 USB 磁盘。

注意: 对于树莓派用户,Etcher 也支持将文件写入到 SD 卡中。

安装 OpenELEC

OpenELEC 安装进程可能是安装流程最简单的操作系统之一了。将 USB 设备加入,然后配置设备使其以 USB 方式启动。同样,这个过程也可以通过按 DEL 或者 F2 来替代。然而并不是所有的 BIOS 都是一样的,所以最好的方式就是看看手册什么的。

一旦进入 BIOS,修改设置使其从 USB 磁盘中直接加载。这将会允许电脑从 USB 磁盘中启动,这将会使你进入到 Syslinux 引导屏幕。在提示符中,键入 installer,然后按下回车键。

默认情况下,快速安装选项已经是选中的。按回车键来开始安装。这将会使安装器跳转到磁盘选择界面。选择 OpenELEC 要被安装到的地方,然后按下回车键来开始安装过程。

一旦完成安装,重启系统并加载 OpenELEC。

配置 OpenELEC

在第一次启动时,用户必须配置一些东西。如果你的媒体中心拥有一个无线网卡,OpenELEC 将会提示用户将其连接到一个热点上。选择一个列表中的网络并且输入密码。

在下一步“欢迎来到 OpenELECWelcome to OpenELEC”屏上,用户必须配置不同的分享设置(SSH 以及 Samba)。建议你把这些设置开启,因为可以用命令行访问,这将会使得远程传输媒体文件变得很简单。

增加媒体

在 OpenELEC(Kodi)中增加媒体,首先选择你希望添加的媒体到的部分。以同样的流程,为照片、音乐等添加媒体。在这个指南中,我们将着重讲解添加视频。

点击在主页的“视频Video”选项来进入视频页面。选择“文件Files”选项,在下一个页面点击“添加视频...Add videos…”,这将会使得用户进入Kodi 的添加媒体页面。在这个页面,你可以随意的添加媒体源了(包括内部和外部的)。

OpenELEC 会自动挂载外部的设备(像是 USB,DVD 碟片,等等),并且它可以通过浏览文件挂载点来挂载。一般情况下,这些设备都会被放在“/run”下,或者,返回你点击“添加视频...Add videos…”的页面,在那里选择设备。任何外部设备,包括 DVD/CD,将会直接展示在那里,并可以直接访问。这是一个很好的选择——对于那些不懂如何找到挂载点的用户。

现在这个设备在 Kodi 中被选中了,界面将会询问用户去浏览设备上私人文件夹,里面有私人文件——这一切都是在媒体中心文件浏览器工具下执行的。一旦找到了放置文件的文件夹,添加它,给予文件夹一个名字,然后按下 OK 按钮来保存它。

当一个用户浏览“视频Videos”,他们将会看到可以点击的文件夹,这个文件夹中带有从外部设备添加的媒体。这些文件夹可以很容易地在系统上播放。

使用 OpenELec

当用户登录他们将会看见一个“主界面”,这个主界面有许多部分,用户可以点击它们并且进入,包括:图片,视频,音乐,程序等等。当悬停在这些部分的时候,子部分就会出现。例如,当悬停在“图片”上时,子部分”文件“以及”插件”就会出现。

如果一个用户点击了一个部分中的子部分,例如“插件”,Kodi 插件选择就会出现。这个安装器将会允许用户浏览新的插件内容,来安装到这个子部分(像是图片关联插件,等等)或者启动一个已经存在的图片关联插件,当然,这个插件应该已经安装到系统上了。

此外,点击任何部分的文件子部分(例如视频)将会直接给显示用户该部分可用的文件。

系统设置

Kodi 有丰富的设置区域。为了找到这些设置,使鼠标在右方悬停,目录选择器将会滚动右方并且显示”系统System“。点击来打开全局系统设定区。

用户可以修改任何设置,从安装 Kodi 仓库的插件,到激活各种服务,到改变主题,甚至天气。如果想要退出设定区域并且返回主页面,点击右下方角落中的“home”图标。

结论

通过 OpenELEC 的安装和配置,你现在可以随意体验使用你自己的 Linux 支持的家庭影院系统。在所有的家庭影院系统 Linux 发行版中,这个是最用户友好的。请记住,尽管这个系统是以“OpenELEC”为名,但它运行着的是 Kodi ,并兼容任何 Kodi 的插件,工具以及程序。


via: https://www.maketecheasier.com/build-media-center-with-openelec/

作者:Derrik Diener 译者:svtter 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8501-1.html?utm_source=rss&utm_medium=rss

5 个需要知道的开源的软件定义网络(SDN)项目

$
0
0

SDN 开始重新定义企业网络。这里有五个应该知道的开源项目。

纵观整个 2016 年,软件定义网络(SDN)持续快速发展并变得成熟。我们现在已经超出了开源网络的概念阶段,两年前评估这些项目潜力的公司已经开始了企业部署。如几年来所预测的,SDN 正在开始重新定义企业网络。

这与市场研究人员的观点基本上是一致的。IDC 在今年早些时候公布了 SDN 市场的一份研究,它预计从 2014 年到 2020 年 SDN 的年均复合增长率为 53.9%,届时市场价值将达到 125 亿美元。此外,“2016 技术趋势Technology Trends 2016” 报告中将 SDN 列为 2016 年最佳技术投资。

IDC 网络基础设施副总裁,Rohit Mehra 说:“云计算和第三方平台推动了 SDN 的需求,这预示着 2020 年的一个价值超过 125 亿美元的市场。毫无疑问的是 SDN 的价值将越来越多地渗透到网络虚拟化软件和 SDN 应用中,包括虚拟化网络和安全服务。大型企业现在正在数据中心体现 SDN 的价值,但它们最终会认识到其在分支机构和校园网络中的广泛应用。“

Linux 基金会最近发布了其 2016 年度报告“开放云指南:当前趋势和开源项目”。其中第三份年度报告全面介绍了开放云计算的状态,并包含关于 unikernel 的部分。你现在可以下载报告了,首先要注意的是汇总和分析研究,说明了容器、unikernel 等的趋势是如何重塑云计算的。该报告提供了对当今开放云环境中心的分类项目的描述和链接。

在本系列中,我们会研究各种类别,并提供关于这些领域如何发展的更多见解。下面,你会看到几个重要的 SDN 项目及其所带来的影响,以及 GitHub 仓库的链接,这些都是从“开放云指南”中收集的:

软件定义网络

ONOS

开放网络操作系统Open Network Operating System(ONOS)是一个 Linux 基金会项目,它是一个面向服务提供商的软件定义网络操作系统,它具有可扩展性、高可用性、高性能和抽象功能来创建应用程序和服务。

ONOS 的 GitHub 地址

OpenContrail

OpenContrail 是 Juniper Networks 的云开源网络虚拟化平台。它提供网络虚拟化的所有必要组件:SDN 控制器、虚拟路由器、分析引擎和已发布的上层 API。其 REST API 配置并收集来自系统的操作和分析数据。

OpenContrail 的 GitHub 地址

OpenDaylight

OpenDaylight 是 Linux 基金会旗下的 OpenDaylight 基金会项目,它是一个可编程的、提供给服务提供商和企业的软件定义网络平台。它基于微服务架构,可以在多供应商环境中的一系列硬件上实现网络服务。

OpenDaylight 的 GitHub 地址

Open vSwitch

Open vSwitch 是一个 Linux 基金会项目,是具有生产级品质的多层虚拟交换机。它通过程序化扩展设计用于大规模网络自动化,同时还支持标准管理接口和协议,包括 NetFlow、sFlow、IPFIX、RSPAN、CLI、LACP 和 802.1ag。它支持类似 VMware 的分布式 vNetwork 或者 Cisco Nexus 1000V 那样跨越多个物理服务器分发。

OVS 在 GitHub 的地址

OPNFV

网络功能虚拟化开放平台Open Platform for Network Functions Virtualization(OPNFV)是 Linux 基金会项目,它用于企业和服务提供商网络的 NFV 平台。它汇集了计算、存储和网络虚拟化方面的上游组件以创建 NFV 程序的端到端平台。

OPNFV 在 Bitergia 上的地址

要了解更多关于开源云计算趋势和查看顶级开源云计算项目完整列表,请下载 Linux 基金会的 “开放云指南”


via: https://www.linux.com/news/open-cloud-report/2016/5-open-source-software-defined-networking-projects-know

作者:SAM DEAN 译者:geekpi 校对:jasminepeng

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8502-1.html?utm_source=rss&utm_medium=rss

GitLab 工作流概览

$
0
0

GitLab 是一个基于 git 的仓库管理程序,也是一个方便软件开发的强大完整应用。

GitLab 拥有一个“用户新人友好”的界面,通过图形界面和命令行界面,使你的工作更加具有效率。GitLab 不仅仅对开发者是一个有用的工具,它甚至可以被集成到你的整个团队中,使得每一个人获得一个独自唯一的平台。

GitLab 工作流逻辑符合使用者思维,使得整个平台变得更加易用。相信我,使用一次,你就离不开它了!

GitLab 工作流

GitLab 工作流 是在软件开发过程中,在使用 GitLab 作为代码托管平台时,可以采取的动作的一个逻辑序列。

GitLab 工作流遵循了 GitLab Flow 策略,这是由一系列由基于 Git 的方法和策略组成的,这些方法为版本的管理,例如分支策略Git最佳实践等等提供了保障。

通过 GitLab 工作流,可以很方便的提升团队的工作效率以及凝聚力。这种提升,从引入一个新的项目开始,一直到发布这个项目,成为一个产品都有所体现。这就是我们所说的“如何通过最快的速度把一个点子在 10 步之内变成一个产品”。

FROM IDEA TO PRODUCTION IN 10 STEPS

软件开发阶段

一般情况下,软件开发经过 10 个主要阶段;GitLab 为这 10 个阶段依次提供了解决方案:

  1. IDEA: 每一个从点子开始的项目,通常来源于一次闲聊。在这个阶段,GitLab 集成了 Mattermost
  2. ISSUE: 最有效的讨论一个点子的方法,就是为这个点子建立一个工单讨论。你的团队和你的合作伙伴可以在 工单追踪器issue tracker 中帮助你去提升这个点子
  3. PLAN: 一旦讨论得到一致的同意,就是开始编码的时候了。但是等等!首先,我们需要优先考虑组织我们的工作流。对于此,我们可以使用 工单看板Issue Board
  4. CODE: 现在,当一切准备就绪,我们可以开始写代码了。
  5. COMMIT: 当我们为我们的初步成果欢呼的时候,我们就可以在版本控制下,提交代码到功能分支了。
  6. TEST: 通过 GitLab CI,我们可以运行脚本来构建和测试我们的应用。
  7. REVIEW: 一旦脚本成功运行,我们测试和构建成功,我们就可以进行 代码复审code review 以及批准。
  8. STAGING:: 现在是时候将我们的代码部署到演示环境来检查一下,看看是否一切就像我们预估的那样顺畅——或者我们可能仍然需要修改。
  9. PRODUCTION: 当一切都如预期,就是部署到生产环境的时候了!
  10. FEEDBACK: 现在是时候返回去看我们项目中需要提升的部分了。我们使用周期分析 Cycle Analytics来对当前项目中关键的部分进行的反馈。

简单浏览这些步骤,我们可以发现,提供强大的工具来支持这些步骤是十分重要的。在接下来的部分,我们为 GitLab 的可用工具提供一个简单的概览。

GitLab 工单追踪器

GitLab 有一个强大的工单追溯系统,在使用过程中,允许你和你的团队,以及你的合作者分享和讨论建议。

issue tracker - view list

工单是 GitLab 工作流的第一个重要重要特性。以工单的讨论为开始; 跟踪新点子的改变是一个最好的方式。

这十分有利于:

  • 讨论点子
  • 提交功能建议
  • 提问题
  • 提交错误和故障
  • 获取支持
  • 精细化新代码的引入

每一个在 GitLab 上部署的项目都有一个工单追踪器。找到你的项目中的 Issues > New issue 来创建一个新的工单。建立一个标题来总结要被讨论的主题,并且使用 Markdown 来形容它。看看下面的“专业技巧”来加强你的工单描述。

GitLab 工单追踪器提供了一个额外的实用功能,使得步骤变得更佳易于管理和考虑。下面的部分仔细描述了它。

new issue - additional settings

秘密工单

无论何时,如果你仅仅想要在团队中讨论这个工单,你可以使该工单成为秘密的。即使你的项目是公开的,你的工单也会被保密起来。当一个不是本项目成员的人,就算是 [报告人级别][01],想要访问工单的地址时,浏览器也会返回一个 404 错误。

截止日期

每一个工单允许你填写一个截止日期。有些团队工作时间表安排紧凑,以某种方式去设置一个截止日期来解决问题,是有必要的。这些都可以通过截止日期这一功能实现。

当你对一个多任务项目有截止日期的时候——比如说,一个新的发布活动、项目的启动,或者按阶段追踪任务——你可以使用里程碑

受托者

要让某人处理某个工单,可以将其分配给他。你可以任意修改被分配者,直到满足你的需求。这个功能的想法是,一个受托者本身对这个工单负责,直到其将这个工单重新赋予其他人。

这也可以用于按受托者筛选工单。

标签

GitLab 标签也是 GitLab 流的一个重要组成部分。你可以使用它们来分类你的工单,在工作流中定位,以及通过优先级标签来安装优先级组织它们。

标签使得你与GitLab 工单看板协同工作,加快工程进度以及组织你的工作流。

新功能: 你可以创建组标签。它可以使得在每一个项目组中使用相同的标签。

工单权重

你可以添加个工单权重使得一个工单重要性表现的更为清晰。01 - 03 表示工单不是特别重要,07 - 09 表示十分重要,04 - 06 表示程度适中。此外,你可以与你的团队自行定义工单重要性的指标。

注:该功能仅可用于 GitLab 企业版和 GitLab.com 上。

GitLab 工单看板

在项目中,GitLab 工单看板是一个用于计划以及组织你的工单,使之符合你的项目工作流的工具。

看板包含了与其相关的相应标签,每一个列表包含了相关的被标记的工单,并且以卡片的形式展示出来。

这些卡片可以在列表之间移动,被移动的卡片,其标签将会依据你移动的位置相应更新到列表上。

GitLab Issue Board

新功能: 你也可以通过点击列表上方的“+”按钮在看板右边创建工单。当你这么做的时候,这个工单将会自动添加与列表相关的标签。

新功能: 我们最近推出了 每一个 GitLab 项目拥有多个工单看板的功能(仅存在于 GitLab 企业版);这是为不同的工作流组织你的工单的好方法。

Multiple Issue Boards


完美阅读及发表评论,请猛击:https://linux.cn/article-8503-1.html?utm_source=rss&utm_medium=rss

如何在 CentOS 7 中使用 SSL/TLS 加固 FTP 服务器进行安全文件传输

$
0
0

在一开始的设计中,FTP(文件传输协议)就是不安全的,意味着它不会加密两台机器之间传输的数据以及用户的凭据。这使得数据和服务器安全面临很大威胁。

在这篇文章中,我们会介绍在 CentOS/RHEL 7 以及 Fedora 中如何在 FTP 服务器中手动启用数据加密服务;我们会介绍使用 SSL/TLS 证书保护 VSFTPD(Very Secure FTP Daemon)服务的各个步骤。

前提条件:

在我们开始之前,要注意本文中所有命令都以 root 用户运行,否则,如果现在你不是使用 root 用户控制服务器,你可以使用 sudo 命令 去获取 root 权限。

第一步:生成 SSL/TLS 证书和密钥

1、 我们首先要在 /etc/ssl 目录下创建用于保存 SSL/TLS 证书和密钥文件的子目录:

# mkdir /etc/ssl/private

2、 然后运行下面的命令为 vsftpd 创建证书和密钥并保存到一个文件中,下面会解析使用的每个选项。

  1. req - 是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。
  2. x509 - X.509 证书数据管理。
  3. days - 定义证书的有效日期。
  4. newkey - 指定证书密钥处理器。
  5. rsa:2048 - RSA 密钥处理器,会生成一个 2048 位的密钥。
  6. keyout - 设置密钥存储文件。
  7. out - 设置证书存储文件,注意证书和密钥都保存在一个相同的文件:/etc/ssl/private/vsftpd.pem。
# openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 365 -newkey rsa:2048

上面的命令会让你回答以下的问题,记住使用你自己情况的值。

Country Name (2 letter code) [XX]:IN
State or Province Name (full name) []ower Parel
Locality Name (eg, city) [Default City]:Mumbai
Organization Name (eg, company) [Default Company Ltd]:TecMint.com
Organizational Unit Name (eg, section) []inux and Open Source
Common Name (eg, your name or your server's hostname) []:tecmint
Email Address []:admin@tecmint.com

第二步:配置 VSFTPD 使用 SSL/TLS

3、 在我们进行任何 VSFTPD 配置之前,首先开放 990 和 40000-50000 端口,以便在 VSFTPD 配置文件中分别定义 TLS 连接的端口和被动端口的端口范围:

# firewall-cmd --zone=public --permanent --add-port=990/tcp
# firewall-cmd --zone=public --permanent --add-port=40000-50000/tcp
# firewall-cmd --reload

4、 现在,打开 VSFTPD 配置文件并在文件中指定 SSL 的详细信息:

# vi /etc/vsftpd/vsftpd.conf

找到 ssl_enable 选项把它的值设置为 YES 激活使用 SSL,另外,由于 TSL 比 SSL 更安全,我们会使用 ssl_tlsv1_2 选项让 VSFTPD 使用更严格的 TLS:

ssl_enable=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO

5、 然后,添加下面的行来定义 SSL 证书和密钥文件的位置:

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

6、 下面,我们要阻止匿名用户使用 SSL,然后强制所有非匿名用户登录使用安全的 SSL 连接进行数据传输和登录过程中的密码发送:

allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES

7、 另外,我们还可以添加下面的选项增强 FTP 服务器的安全性。当选项 require_ssl_reuse 被设置为 YES 时,要求所有 SSL 数据连接都会重用 SSL 会话;这样它们会知道控制通道的主密码。

因此,我们需要把它关闭。

require_ssl_reuse=NO

另外,我们还要用 ssl_ciphers 选项选择 VSFTPD 允许用于加密 SSL 连接的 SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者:

ssl_ciphers=HIGH

8、 现在,设置被动端口的端口范围(最小和最大端口)。

pasv_min_port=40000
pasv_max_port=50000

9、 选择性启用 debug_ssl 选项以允许 SSL 调试,这意味着 OpenSSL 连接诊断会被记录到 VSFTPD 日志文件:

debug_ssl=YES

保存所有更改并关闭文件。然后让我们重启 VSFTPD 服务:

# systemctl restart vsftpd

第三步:用 SSL/TLS 连接测试 FTP 服务器

10、 完成上面的所有配置之后,像下面这样通过在命令行中尝试使用 FTP 测试 VSFTPD 是否使用 SSL/TLS 连接:

# ftp 192.168.56.10
Connected to 192.168.56.10  (192.168.56.10).
220 Welcome to TecMint.com FTP service.
Name (192.168.56.10:root) : ravi
530 Non-anonymous sessions must use encryption.
Login failed.
421 Service not available, remote server has closed connection
ftp>

验证 FTP SSL 安全连接

验证 FTP SSL 安全连接

从上面的截图中,我们可以看到这里有个错误提示我们 VSFTPD 只允许用户从支持加密服务的客户端登录。

命令行并不会提供加密服务因此产生了这个错误。因此,为了安全地连接到服务器,我们需要一个支持 SSL/TLS 连接的 FTP 客户端,例如 FileZilla。

第四步:安装 FileZilla 以便安全地连接到 FTP 服务器

11、 FileZilla 是一个现代化、流行且重要的跨平台的 FTP 客户端,它默认支持 SSL/TLS 连接。

要在 Linux 上安装 FileZilla,可以运行下面的命令:

--------- On CentOS/RHEL/Fedora ---------
# yum install epel-release filezilla
--------- On Debian/Ubuntu ---------
$ sudo apt-get install  filezilla

12、 当安装完成后(或者你已经安装了该软件),打开它,选择 File => Sites Manager 或者按 Ctrl + S 打开 Site Manager 界面。

点击 New Site 按钮添加一个新的站点/主机连接详细信息。

在 FileZilla 中添加新 FTP 站点

在 FileZilla 中添加新 FTP 站点

  1. 下一步,像下面这样设置主机/站点名称、添加 IP 地址、定义使用的协议、加密和登录类型(使用你自己情况的值):
Host:  192.168.56.10
Protocol:  FTP – File Transfer Protocol
Encryption:  Require explicit FTP over   #recommended
Logon Type: Ask for password            #recommended
User: username

在 Filezilla 中添加 FTP 服务器详细信息

在 Filezilla 中添加 FTP 服务器详细信息

14、 然后点击 Connect,再次输入密码,然后验证用于 SSL/TLS 连接的证书,再一次点击 OK 连接到 FTP 服务器:

验证 FTP SSL 证书

验证 FTP SSL 证书

到了这里,我们应该使用 TLS 连接成功地登录到了 FTP 服务器,在下面的界面中检查连接状态部分获取更多信息。

通过 TLS/SSL 连接到 FTP 服务器

通过 TLS/SSL 连接到 FTP 服务器

15、 最后,在文件目录尝试 从本地传输文件到 FTP 服务器,看 FileZilla 界面后面的部分查看文件传输相关的报告。

使用 FTP 安全地传输文件

使用 FTP 安全地传输文件

就是这些。记住 FTP 默认是不安全的,除非我们像上面介绍的那样配置它使用 SSL/TLS 连接。在下面的评论框中和我们分享你关于这篇文章/主题的想法吧。


作者简介:

Aaron Kili 是一个 Linux 和 F.O.S.S 的爱好者,Linux 系统管理员,网络开发员,目前也是 TecMint 的内容创作者,他喜欢和电脑一起工作,并且坚信共享知识。


via: http://www.tecmint.com/secure-vsftpd-using-ssl-tls-on-centos/

作者:Aaron Kili 译者:ictlyh 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8504-1.html?utm_source=rss&utm_medium=rss

极客漫画:Java 垃圾回收说明

$
0
0

这篇漫画生动的解释了 Java 的垃圾回收机制:什么是垃圾回收(GC)、什么是并行垃圾回收以及什么是垃圾回收的标记清除算法。

如果你想更深入的了解,不妨看一下垃圾回收并行标记清除算法


via: https://turnoff.us/geek/java-gc-explained/

作者:Daniel Stori 译者&点评:bestony 校对&合成:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8505-1.html?utm_source=rss&utm_medium=rss

买个 DDoS 服务干掉你的对手

$
0
0

随着物联网设备的普及,网络犯罪分子通过利用密码的缺陷而提供拒绝服务攻击。

随着物联网设备飞速发展,分布式拒绝服务(DDoS)攻击正在成为一种危险的趋势。就如 DNS 服务商 Dyn 上年秋季之遭遇 一样,黑客似乎瞄上了每个人,使用未保护的物联网设备来轰炸网络的做法正在抬头。

可雇佣的 DDoS 攻击的出现意味着即使是最不精通技术的人都能精准报复某些网站。就像在柜台前面买个东西一样方便,然后就可以彻底搞定一个公司。

根据 Neustar 的报告,四分之三的国际品牌、机构和公司都是 DDoS 攻击的受害者。每天至少会发生 3700 起 DDoS 攻击

睿科网络公司(A10 Networks)网络运营总监 Chase Cunningham 说:“想要找个可用的物联网设备,你只需要在地下网站四处打听一下 Mirai 扫描器代码,一旦你找到了,你将能够利用在线的每一台设备来进行攻击”。

“或者你可以去一些类似 Shodan 的网站,然后简单的搜一下设备特定的请求。当你得到这些信息之后,你就可以将你所雇佣的 DDoS 工具配置正确的流量模拟器类型、指向正确的目标并发动攻击。”

“几乎所有东西都是可买卖的。”他补充道,“你可以购买一个 ‘stresser’,这就是个随便哪个会点按钮的人都会使用的 DDoS 僵尸网络。”

网络安全提供商 Imperva 说,用户只需要出几十美金,就可以快速发动攻击。有些公司在它们的网站上说它们的工具包含肉鸡负载和 CnC(命令与控制)文件。使用这些工具,那些有点想法的肉鸡大师(或者被称为 herders)就可以开始传播恶意软件,通过垃圾邮件、漏洞扫描程序、暴力攻击等来感染设备。

大部分 stresser 和 booter 都会有一个常见的、基于订阅服务的 SaaS(软件即服务)业务模式。来自 Incapsula 公司的 Q2 2015 DDoS 报告 显示,在 DDoS 上的月均每小时花费是 38 美元(规模较低的是 19.99 美元)。

雇佣ddos服务

“stresser 和 booter 只是新世界的一个副产品,这些可以扳倒企业和机构的服务只能运作在灰色领域”,Imperva 写道。

虽然成本不同,但是企业受到的各种攻击,每次损失在 1.4 万美元到 235 万美元之间。而且企业受到一次攻击后,有 82% 的可能性会再次受到攻击

物联网洪水攻击DDoS of Things(DoT)使用物联网设备建立的僵尸网络可造成非常大规模的 DDoS 攻击。物联网洪水攻击会利用成百上千的物联网设备攻击,无论是大型服务提供商还是企业,均无幸免。

“大部分讲究声誉的 DDoS 卖家都会将他们的工具配置为可修改的,这样你就可以轻松地设置攻击的类型。虽然我还没怎么看到有哪些可以‘付费的’物联网流量模拟器的选项,但我敢肯定就要有了。如果是我来搞这个服务,我是绝对会加入这个选项的。”Cunningham 如是说。

由 IDG 新闻服务的消息可知,要建造一个 DDoS 服务也是很简单的。通常黑客会租用 6 到 12 个左右的服务器,然后使用它们随意的攻击任何目标。去年十月下旬,HackForums.net 关闭了他们的“服务器压力测试”版块,这个做法就是考虑到黑客可能通过使用他们每月十美元的服务建造可雇佣的 DDoS 服务。

同样地在十二月时,美国和欧洲的执法机构 逮捕 34个参与可雇佣的 DDoS 服务的嫌犯。

但是如果这很简单,怎么还没有经常发生攻击?

Cunningham 说这其实每时每刻都在发生,实际上每天每秒都在发生。他说:”你不知道它们的原因是因为大部分都是扰乱攻击,而不是大规模的、想要搞倒公司的攻击。“

他说,大部分的攻击平台只出售那些会让系统宕机一个小时或稍长一点的攻击。通常宕机一小时的攻击大概需要花费 15 到 50 美元。当然这得看平台,有些可能一小时就要花上百美元。

减少这些攻击的解决方案是让用户把所有联网设备的出厂预置的密码改掉,然后还要禁用那些你不需要的功能。

(题图:Victor


 

via: http://www.csoonline.com/article/3180246/data-protection/hire-a-ddos-service-to-take-down-your-enemies.html

作者:Ryan Francis 译者:kenxx 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8507-1.html?utm_source=rss&utm_medium=rss

如何用树莓派搭建个人 web 服务器

$
0
0

How to set up a personal web server with a Raspberry Pi

个人 Web 服务器即 “云”,只不过是你拥有和控制它,而不是一个大型公司。

拥有一个自己的云有很多好处,包括可定制、免费存储、免费的互联网服务、通往开源软件之路、高安全性、完全控制您的内容、快速更改的能力、实验代码的地方等等。 这些好处大部分是无法估量的,但在财务上,这些好处可以为您每个月节省超过 100 美元。

Building your own web server with Raspberry Pi

我本可以选择 AWS ,但我更喜欢完全自由且安全性可控,并且我可以学一下这些东西是如何搭建的。

  • 私有 Web 托管:而非 BlueHost 或 DreamHost
  • 云存储:而非 Dropbox、Box、Google Drive、Microsoft Azure、iCloud 或是 AWS
  • 自主部署安全
  • HTTPS:Let’s Encrypt
  • 分析: Google
  • OpenVPN:不需要专有互联网连接(预计每个月花费 $7)

我所使用的物品清单:

  • 树莓派 3 代 Model B
  •   MicroSD 卡(推荐使用 32 GB, 兼容树莓派的 SD 卡
  •   USB microSD 卡读卡器
  • 以太网络线
  • 连接上 Wi-Fi 的路由器
  • 树莓派盒子
  • 亚马逊倍思的 MicroUSB 数据线
  • 苹果的充电器
  • USB 鼠标
  • USB 键盘
  • HDMI 线材
  • 显示器 (支持接入 HDMI)
  • MacBook Pro

步骤 1: 启动树莓派

下载最新发布的 Raspbian (树莓派的操作系统)。 Raspbian Jessie 的 ZIP 包就可以用 [脚注 1]。解压缩或提取下载的文件然后把它拷贝到 SD 卡里。使用 Pi Filler 可以让这些过程变得更简单。下载 Pi Filer 1.3 或最新的版本。解压或提取下载文件之后打开它,你应该会看到这样的提示:

Pi Filler prompt

确保 USB 读卡器这时还没有插上。如果已经插上了那就先弹出。点 “Continue” 继续下一步。你会看到一个让你选择文件的界面,选择你之前解压缩后的树莓派系统文件。然后你会看到另一个提示,如图所示:

USB card reader prompt

把 MicroSD 卡(推荐 32 GB ,至少 16GB)插入到 USB MicroSD 卡读卡器里。然后把 USB 读卡器接入到你的电脑里。你可以把你的 SD 卡重命名为 “Raspberry” 以区别其他设备。然后点击 “Continue”。请先确保你的 SD 卡是空的,因为 Pi Filler 会在运行时 擦除 所有事先存在 SD 卡里的内容。如果你要备份卡里的内容,那你最好就马上备份。当你点 “Continue” 的时候,Raspbian OS 就会被写入到 SD 卡里。这个过程大概会花费一到三分钟左右。当写入完成后,推出 USB 读卡器,把 SD 卡拔出来插入到树莓派的 SD 卡槽里。把电源线接上,给树莓派供电。这时树莓派就会自己启动。树莓派的默认登录账户信息是:

  • 用户名: pi
  • 密码:raspberry

当树莓派首次启动完成时,会跳出一个标题为 “设置选项Setup Options” 的配置界面,就像下面的图片一样 [脚注 2]:

Raspberry Pi software configuration setup

选择 “扩展文件系统Expand Filesystem” 这一选项并回车 [脚注 3]。 同时,我还推荐选择第二个选项 “修改密码Change User Password”。这对保证安全性来说尤为重要。它还能个性化你的树莓派。

在选项列表中选择第三项 “启用引导到桌面Enable Boot To Desktop/Scratch” 并回车。这时会跳到另一个标题为 “选择引导选项Choose boot option” 的界面,就像下面这张图这样:

Choose boot option

在这个界面选择第二个选项 “以用户‘pi’登录图形化桌面Desktop log in as user 'pi' at the graphical desktop” 并回车 [脚注 4]。完成这个操作之后会回到之前的 “设置选项Setup Options” 界面。如果没有回到之前的界面的话就选择当前界面底部的 “OK” 按钮并回车。

当这些操作都完成之后,选择当前界面底部的 “Finish” 按钮并回车,这时它就会自动重启。如果没有自动重启的话,就在终端里使用如下命令来重启。

$ sudo reboot

接上一步的重启,如果所有步骤都顺利进行的话,你会进入到类似下面这样桌面环境中。

Raspberry Pi desktop

当你进入了桌面之后,在终端中执行如下命令来更新树莓派的固件。

$ sudo apt-get update
$ sudo apt-get upgrade-y
$ sudo apt-get dist-upgrade -y
$ sudo rpi-update

这些操作可能会花费几分钟时间。完成之后,现在运行着的树莓派就是最新的了。

步骤 2: 配置树莓派

SSH 指的是 Secure Shell,是一种加密网络协议,可让你在计算机和树莓派之间安全地传输数据。 你可以从 Mac 的命令行控制你的树莓派,而无需显示器或键盘。

要使用 SSH,首先需要你的树莓派的 IP 地址。 打开终端并输入:

$ sudo ifconfig

如果你在使用以太网,看 eth0 部分。如果你在使用 Wi-Fi, 看 wlan0 部分。

查找 inet addr,后跟一个 IP 地址,如 192.168.1.115,这是本篇文章中使用的默认 IP。

有了这个地址,在终端中输入 :

$ ssh pi@192.168.1.115

对于 PC 上的 SSH,请参见 [脚注 5]。

出现提示时输入默认密码 raspberry,除非你之前更改过密码。

现在你已经通过 SSH 登录成功。

远程桌面

使用 GUI(图形用户界面)有时比命令行更容易。 在树莓派的命令行(使用 SSH)上键入:

$ sudo apt-get install xrdp

xrdp 支持 Mac 和 PC 的 Microsoft Remote Desktop 客户端。

在 Mac 上,在 App store 中搜索 “Microsoft Remote Desktop”。 下载它。 (对于 PC,请参见 [脚注 6]。)

安装完成之后,在你的 Mac 中搜索一个叫 “Microsoft Remote Desktop” 的应用并打开它,你会看到 :

Microsoft Remote Desktop

点击 “New” 新建一个远程连接,在空白处填写如下配置。

Setting up a remote connection

关闭 “New” 窗口就会自动保存。

你现在应该看到 “My Desktop” 下列出的远程连接。 双击它。

简单加载后,你应该在屏幕上的窗口中看到你的树莓派桌面,如下所示:

Raspberry Pi desktop

好了,现在你不需要额外的鼠标、键盘或显示器就能控制你的树莓派。这是一个更为轻量级的配置。

静态化本地 IP 地址

有时候你的本地 IP 地址 192.168.1.115 会发生改变。我们需要让这个 IP 地址静态化。输入:

$ sudo ifconfig

eth0 部分或 wlan0 部分,记下 inet addr(树莓派当前 IP),bcast(广播 IP 范围)和 mask(子网掩码地址)。 然后输入:

$ netstat -nr

记下 destinationgateway/network

Setting up a local IP address

大概应该是这样子的:

net address 192.168.1.115
bcast 192.168.1.255
mask 255.255.255.0
gateway 192.168.1.1
network 192.168.1.1
destination 192.168.1.0

有了这些信息,你可以很简单地设置一个静态 IP。输入:

$ sudo nano /etc/dhcpcd.conf

不要去动 /etc/network/interfaces

剩下要做的就是把这些内容追加到这个文件的底部,把 IP 换成你想要的 IP 地址。

interface eth0
static ip_address=192.168.1.115
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

一旦你设置了静态内部 IP 地址,这时需要通过如下命令重启你的树莓派 :

$ sudo reboot

重启完成之后,在终端中输入 :

$ sudo ifconfig

这时你就可以看到你的树莓派上的新的静态配置了。

静态化全局 IP 地址

如果您的 ISP(互联网服务提供商)已经给您一个静态外部 IP 地址,您可以跳到端口转发部分。 如果没有,请继续阅读。

你已经设置了 SSH、远程桌面和静态内部 IP 地址,因此现在本地网络中的计算机将会知道在哪里可以找到你的树莓派。 但是你仍然无法在本地 Wi-Fi 网络外部访问你的树莓派。 你需要树莓派可以从互联网上的任何地方公开访问。这需要静态的外部 IP 地址 [脚注 7]。

联系您的 ISP 并请求静态的外部(有时称为静态全局)IP 地址可能会是一个非常敏感的过程。 ISP 拥有决策权,所以我会非常小心处理。 他们可能拒绝你的的静态外部 IP 地址请求。 如果他们拒绝了你的请求,你不要怪罪于他们,因为这种类型的请求有法律和操作风险。 他们特别不希望客户运行中型或大型互联网服务。 他们可能会明确地询问为什么需要一个静态的外部 IP 地址。 最好说实话,告诉他们你打算主办一个低流量的个人网站或类似的小型非营利互联网服务。 如果一切顺利,他们应该会建立一个工单,并在一两个星期内给你打电话。

端口转发

这个新获得的 ISP 分配的静态全局 IP 地址是用于访问路由器。 树莓派现在仍然无法访问。 你需要设置端口转发才能访问树莓派。

端口是信息在互联网上传播的虚拟途径。 你有时需要转发端口,以使计算机像树莓派一样可以访问 Internet,因为它位于网络路由器后面。 VollmilchTV 专栏在 YouTube 上的一个视频,名字是什么是 TCP/IP,端口,路由,Intranet,防火墙,互联网,可以帮助你更好地了解端口。

端口转发可用于像 树莓派 Web 服务器或 VoIP 或点对点下载的应用程序。 有 65000个以上的端口可供选择,因此你可以为你构建的每个 Internet 应用程序分配一个不同的端口。

设置端口转发的方式取决于你的路由器。 如果你有 Linksys 的话,Gabriel Ramirez 在 YouTbue 上有一个标题叫 如何让你的 Apache Ubuntu 服务器连到互联网 的视频解释了如何设置。 如果您没有 Linksys,请阅读路由器附带的文档,以便自定义和定义要转发的端口。

你需要转发 SSH 以及远程桌面端口。

如果你认为你已经过配置端口转发了,输入下面的命令以查看它是否正在通过 SSH 工作:

$ ssh pi@your_global_ip_address

它应该会提示你输入密码。

检查端口转发是否也适用于远程桌面。 打开 Microsoft Remote Desktop。 你之前的的远程连接设置应该已经保存了,但需要使用静态的外部 IP 地址(例如 195.198.227.116)来更新 &ldquoC 名称” 字段,而不是静态的内部地址(例如 192.168.1.115)。

现在,尝试通过远程桌面连接。 它应该简单地加载并显示树莓派的桌面。

Raspberry Pi desktop

好了, 树莓派现在可以从互联网上访问了,并且已经准备好进行高级项目了。

作为一个奖励选项,您可以保持到您的 Pi 的两个远程连接。 一个通过互联网,另一个通过 LAN(局域网)。很容易设置。在 Microsoft Remote Desktop 中,保留一个称为 &ldquoi Internet” 的远程连接,另一个称为 &ldquoi Local”。 将 Pi Internet 的 &ldquoC 名称” 配置为静态外部 IP 地址,例如 195.198.227.116。 将 Pi Local 的 &ldquoC 名称” 配置为静态内部 IP 地址,例如 192.168.1.115。 现在,您可以选择在全局或本地连接。

如果你还没有看过由 Gabriel Ramirez 发布的 如何让你的 Apache Ubuntu 服务器连到互联网,那么你可以去看一下,作为过渡到第二个项目的教程。 它将向您展示项目背后的技术架构。 在我们的例子中,你使用的是树莓派而不是 Ubuntu 服务器。 动态 DNS 位于域名公司和您的路由器之间,这是 Ramirez 省略的部分。 除了这个微妙之处外,视频是在整体上解释系统的工作原理。 您可能会注意到本教程涵盖了树莓派设置和端口转发,这是服务器端或后端。 查看原始来源,涵盖域名,动态 DNS,Jekyll(静态 HTML 生成器)和 Apache(网络托管)的更高级项目,这是客户端或前端。

脚注

[1] 我不建议从 NOOBS 操作系统开始。 我更喜欢从功能齐全的 Raspbian Jessie 操作系统开始。

[2] 如果没有弹出 “Setup Options”,可以通过打开终端并执行该命令来始终找到它:

$ sudo-rasps-config

[3] 我们这样做是为了将 SD 卡上存在的所有空间用作一个完整的分区。 所有这一切都是扩大操作系统以适应 SD 卡上的整个空间,然后可以将其用作树莓派的存储内存。

[4] 我们这样做是因为我们想启动进入熟悉的桌面环境。 如果我们不做这个步骤,树莓派每次会进入到终端而不是 GUI 中。

[5]

PuTTY configuration

下载并运行 PuTTY 或 Windows 的其它 SSH 客户端。 在该字段中输入你的 IP 地址,如上图所示。 将默认端口保留为 22。 回车,PuTTY 将打开一个终端窗口,提示你输入用户名和密码。 填写然后开始在树莓派上进行你的远程工作。

[6] 如果尚未安装,请下载 Microsoft Remote Desktop。 搜索您的计算机上的的 Microsoft Remote Desktop。 运行。 提示时输入 IP 地址。 接下来,会弹出一个 xrdp 窗口,提示你输入用户名和密码。

[7] 路由器具有动态分配的外部 IP 地址,所以在理论上,它可以从互联网上暂时访问,但是您需要 ISP 的帮助才能使其永久访问。 如果不是这样,你需要在每次使用时重新配置远程连接。

原文出自 Mitchell McLaughlin's Full-Stack Computer Projects


作者简介:

Mitchell McLaughlin - 我是一名开放网络的贡献者和开发者。我感兴趣的领域很广泛,但我特别喜欢开源软件/硬件,比特币和编程。 我住在旧金山,我有过一些简短的 GoPro 和 Oracle 工作经验。


via: https://opensource.com/article/17/3/building-personal-web-server-raspberry-pi-3

作者:Mitchell McLaughlin 译者:chenxinlong 校对:jasminepeng

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8508-1.html?utm_source=rss&utm_medium=rss


极客漫画:精通正则表达式

$
0
0

一个人希望掌握所有的正则表达式,却耗费了大量的时间,不知室外世事变迁,早已换了一个时代。

这个漫画讽刺了一些初学者,希望掌握一些比较复杂的东西的所有内容后再去做事,却不知道,这些东西过于复杂,你花费的时间可能很快就一文不值,因为它们可能已经过时了。

开发并不要求你掌握所有的内容,更多的时候,你只要能够掌握一些常用的,在真正需要用到的时候,再去查询一些比较详细的、不常用的内容即可。毕竟,没有人要求你马上做完所有事情。


via: https://turnoff.us/geek/mastering-regexp/

作者:Daniel Stori 译者&点评:Bestony 校对&合成:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8506-1.html?utm_source=rss&utm_medium=rss

CentOS 上最佳的第三方仓库

$
0
0

从 Software Collections、EPEL 和 Remi 获得可靠的 CentOS 新版软件。

在 Red Hat 企业 Linux(RHEL) 上,提供那些早已老掉牙的软件已经是企业级软件厂商的传统了。这倒不是因为他们懒,而确实是用户需要。很多公司像看待家具一样看待软件:我买一张桌子,能用一辈子,软件不应该也这样吗?

CentOS 作为 RHEL 的复制品有着同样的遭遇。虽然 Red Hat 还在为这些被厂商抛弃的过时软件提供支持、修补安全漏洞等,但如果你的应用依赖新版软件,你就得想办法了。 我在这个问题上不止一次碰壁。 LAMP 组合里任一个组件都需要其它所有组件能与其兼容,这有时就显得很麻烦。 比如说去年我就被 RHEL/CentOS 折腾得够呛。REHL/CentOS 第 6 版最高支持 PHP 5.3 ,第 7 版支持到 PHP 5.4 。而 PHP 5.3 早在 2014 年 8 月就到达 EOL(End Of Life) ,不再被厂商支持了, PHP 5.4 的 EOL 在 2015 年 9 月, 5.5 则是 2016 年 7 月。 有太多古老的软件版本,包括 MySQL、Python 等,它们应该像木乃伊一样被展示在博物馆里,但它们却活在你的系统上。

那么,可怜的管理员们该怎么办呢?如果你跑着 RHEL/CentOS ,那应该先试试 Software Collections,因为这是 Red Hat 唯一支持的新软件包源。 Software Collections 为 CentOS 设立了专门的仓库,安装和管理都和其它第三方仓库一样。但如果你用的是 RHEL 的,情况就有点不同了,具体请参考 RHEL 的解决方法Software Collections 同样支持 Fedora 和 Scientific Linux 。

安装 Software Collections

在 CentOS 6/7 上安装 Software Collections 的命令如下:

$ sudo yum install centos-release-scl

centos-release-scl-rh 可能作为依赖包被同时安装。

然后就可以像平常一样搜索、安装软件包了:

$ yum search php7
 [...]
 rh-php70.x86_64 : Package that installs PHP 7.0
 [...]
$ sudo yum install rh-php70

最后一件事就是启用你的新软件包:

$ scl enable rh-php70 bash
$ php -v
PHP 7.0.10

此命令会开启一个新的 bash 并配置好环境变量以便运行新软件包。 如果需要的话,你还得安装对应的扩展包,比如对于 Python 、PHP、MySQL 等软件包,有些配置文件也需要修改以指向新版软件(比如 Apache )。

这些 SCL 软件包在重启后不会激活。SCL 的设计初衷就是在不影响原有配置的前提下,让新旧软件能一起运行。不过你可以通过 ~/.bashrc 加载 SCL 提供的 enable 脚本来实现自动启用。 SCL 的所有软件包都安装在 /opt 下, 以我们的 PHP 7 为例,在 ~/.bashrc 里加入一行:

source /opt/rh/rh-php70/enable

以后相应的软件包就能在重启后自动启用了。有新软件保驾护航,你终于可以专注于自己的业务了。

列出可用软件包

那么,到底 Software Collections 里都是些什么呢? centos-release-scl 里有一些由社区维护的额外的软件包。除了在 CentOS Wiki 查看软件包列表外,你还可以使用 Yum 。我们先来看看安装了哪些仓库:

$ yum repolist
[...]
repo id                  repo name
base/7/x86_64            CentOS-7 - Base
centos-sclo-rh/x86_64    CentOS-7 - SCLo rh
centos-sclo-sclo/x86_64  CentOS-7 - SCLo sclo
extras/7/x86_64          CentOS-7 - Extras
updates/7/x86_64         CentOS-7 - Updates

Yum 没有专门用来打印某一个仓库中所有软件包的命令,所以你得这样来: (LCTT 译注:实际上有,yum repo-pkgs REPO list,需要 root 权限,dnf 同)

$ yum --disablerepo "*" --enablerepo centos-sclo-rh \
 list available | less

--disablerepo 与 --enablerepo 选项的用法没有详细的文档,这里简单说下。 实际上在这个命令里你并没有禁用或启用什么东西,而只是将你的搜索范围限制在某一个仓库内。 此命令会打印出一个很长的列表,所以我们用管道传递给 less 输出。

EPEL

强大的 Fedora 社区为 Feora 及所有 RHEL 系的发行版维护着 EPEL:Extra Packages for Enterprise Linux 。 里面包含一些最新软件包以及一些未被发行版收纳的软件包。安装 EPEL 里的软件就不用麻烦 enable 脚本了,直接像平常一样用。你还可以用 --disablerepo 和 --enablerepo 选项指定从 EPEL 里安装软件包:

$ sudo yum --disablerepo "*" --enablerepo epel install [package]

Remi Collet

Remi Collet 在 Remi 的 RPM 仓库 里维护着大量更新的和额外的软件包。需要先安装 EPEL ,因为 Remi 仓库依赖它。

CentOS wiki 上有较完整的仓库列表:更多的第三方仓库 ,用哪些,不用哪些,里面都有建议。


via: https://www.linux.com/learn/intro-to-linux/2017/2/best-third-party-repositories-centos

作者:CARLA SCHRODER 译者:Dotcra 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8509-1.html?utm_source=rss&utm_medium=rss

如何在 Vim 中使用模式行进行文件特定的设置

$
0
0

虽然插件毫无疑问是 Vim 最大的优势,然而,还有其它一些功能,使得它成为当今 Linux 用户中最强大、功能最丰富的文本编辑器/IDE 之一。其中一个功能就是可以根据文件做特定的设置。我们可以使用该编辑器的模式行Modeline特性来实现该功能。

在这篇文章中,我将讨论如何使用 Vim 的模式行Modeline特性来简单的理解一些例子。

在开始之前,值得提醒一下,这篇教程中提及的所有例子、命令和指令都已经在 Ubuntu 16.04 中使用 Vim 7.4 版本测试过。

VIM 模式行

用法

正如上面已经提到的, Vim 的模式行特性让你能够进行特定于文件的更改。比如,假设你想把项目中的一个特定文件中的所有制表符用空格替换,并且确保这个更改不会影响到其它所有文件。这是模式行帮助你完成你想做的事情的一个理想情况。

因此,你可以考虑将下面这一行加入文件的开头或结尾来完成这件事。

# vim: set expandtab:

(LCTT 译注:模式行就是一行以注释符,如 #///* 开头,间隔一个空格,以 vim: 关键字触发的设置命令。可参看:http://vim.wikia.com/wiki/Modeline_magic

如果你是在 Linux 系统上尝试上面的练习来测试用例,很有可能它将不会像你所期望的那样工作。如果是这样,也不必担心,因为某些情况下,模式行特性需要先激活才能起作用(出于安全原因,在一些系统比如 Debian、Ubuntu、GGentoo 和 OSX 上默认情况下禁用)。

为了启用该特性,打开 .vimrc 文件(位于 home 目录),然后加入下面一行内容:

set modeline

现在,无论何时你在该文件输入一个制表符然后保存时(文件中已输入 expandtab 模式行命令的前提下),都会被自动转换为空格。

让我们考虑另一个用例。假设在 Vim 中, 制表符默认设置为 4 个空格,但对于某个特殊的文件,你想把它增加到 8 个。对于这种情况,你需要在文件的开头或末尾加上下面这行内容:

// vim: noai:ts=8:

现在,输入一个制表符,你会看到,空格的数量为 8 个。

你可能已经注意到我刚才说的,这些模式行命令需要加在靠近文件的顶部或底部。如果你好奇为什么是这样,那么理由是该特性以这种方式设计的。下面这一行(来自 Vim 官方文件)将会解释清楚:

“模式行不能随意放在文件中的任何位置:它需要放在文件中的前几行或最后几行。modelines 变量控制 Vim 检查模式行在文件中的确切位置。请查看 :help modelines 。默认情况下,设置为 5 行。”

下面是 :help modelines 命令(上面提到的)输出的内容:

如果 modeline 已启用并且 modelines 给出了行数,那么便在相应位置查找 set 命令。如果 modeline 禁用或 modelines 设置的行数为 0 则不查找。

尝试把模式行命令置于超出 5 行的范围(距离文件底部和顶部的距离均超过 5 行),你会发现, 制表符将会恢复为 Vim 默认数目的空格 — 在我的情况里是 4 个空格。

然而,你可以按照自己的意愿改变默认行数,只需在你的 .vimrc 文件中加入下面一行命令

set modelines=[新值]

比如,我把值从 5 增加到了 10 。

set modelines=10

这意味着,现在我可以把模式行命令置于文件前 10 行或最后 10 行的任意位置。

继续,无论何时,当你在编辑一个文件的时候,你可以输入下面的命令(在 Vim 编辑器的命令模式下输入)来查看当前与命令行相关的设置以及它们最新的设置。

:verbose set modeline? modelines?

比如,在我的例子中,上面的命令产生了如下所示的输出:

 modeline
      Last set from ~/.vimrc
 modelines=10
      Last set from ~/.vimrc

关于 Vim 的模式行特性,你还需要知道一些重要的点:

  • 默认情况下,当 Vim 以非兼容(nocompatible)模式运行时该特性是启用的,但需要注意的是,在一些发行版中,出于安全考虑,系统的 vimrc 文件禁用了该选项。
  • 默认情况下,当以 root 权限编辑文件时,该特性被禁用(如果你是使用 sudo 方式打开该文件,那么该特性依旧能够正常工作)。
  • 通过 set 来设置模式行,其结束于第一个冒号,而非反斜杠。不使用 set,则后面的文本都是选项。比如,/* vim: noai:ts=4:sw=4 */ 是一个无效的模式行。

(LCTT 译注:关于模式行中的 set,上述描述指的是:如果用 set 来设置,那么当发现第一个 : 时,表明选项结束,后面的 */ 之类的为了闭合注释而出现的文本均无关;而如果不用 set 来设置,那么以 vim: 起头的该行所有内容均视作选项。 )

安全考虑

令人沮丧的是, Vim 的模式行特性可能会造成安全性问题。事实上,在过去,已经报道过多个和模式行相关的问题,包括 shell 命令注入任意命令执行无授权访问等。我知道,这些问题发生在很早的一些时候,现在应该已经修复好了,但是,这提醒了我们,模式行特性有可能会被黑客滥用。

结论

模式行可能是 Vim 编辑器的一个高级命令,但是它并不难理解。毫无疑问,它的学习曲线会有一些复杂,但是不需多问也知道,该特性是多么的有用。当然,出于安全考虑,在启用并使用该选项前,你需要对自己的选择进行权衡。

你有使用过模式行特性吗?你的体验是什么样的?记得在下面的评论中分享给我们。


via: https://www.howtoforge.com/tutorial/vim-modeline-settings/

作者:Ansh 译者:ucasFL 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8510-1.html?utm_source=rss&utm_medium=rss

我是如何意外阻止了勒索病毒的全球攻击的?

$
0
0

5 月 12 日,英国、意大利、俄罗斯等多个国家爆发勒索病毒攻击,中国国内校园网也出现大面积感染。

WannaCrypt 勒索病毒开始肆虐后 ,英国的网络安全人员 MalwareTech 博主分析发现,该病毒都会访问一个域名 www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com,如果连接成功,就停止攻击感染其他机器。于是他注册了这个域名,偶然阻止了勒索病毒的全球攻击。

(MalwareTech 的推特截图。后一条是说他也没想到注册域名后会中断扩散传播。前一条则是他的嘚瑟内容,23333)

MalwareTech 博主在事后写了一篇总结文章,以下是摘编:

我现在终于有时间写写周五发生的事情了,这两天各种电话和 Skype 都快把我催爆了,这件事情也花掉了我整个周末的时间(实际上前后一共花了四天时间,连我的工作时间都占了,就是如此)。也许你已经从各种媒体上听说了 WannaCrypt 病毒的事情了,但是我觉得你最好听听我的版本。

我那天早上 10 点钟起床,然后就到“英国电子威胁信息共享平台”上去查看信息,因为我一直在跟踪一个叫 Emotet banking 木马的传播情况,这种木马病毒直至今日还很有威胁。然后我发现,有几个很普通的贴子提到说,有几个公司或者组织被“勒索木马”攻击了,不过这也并不是什么“大新闻”….至少当时还不是。接着我就关了电脑出去和朋友吃午饭了,就是在这个时候,WannaCrypt 勒索木马开始肆虐。

当我下午两点半回到家的时候,我发现信息共享平台上已经到处都是 NHS(英国国家医疗体系)被攻击的消息了,据说全国有好几个NHS 下属机构的系统被木马攻击了,这也让我感觉到很可能要有“大新闻”产生了。尽管勒索型病毒攻击某些公共系统的情况并不新鲜,但是全国范围内的系统同时中招的情况可就不那么寻常了(而且现在 NHS 的雇员也挺聪明了,不会轻易点开带病毒的钓鱼邮件,所以这次能有这么大的传播范围,肯定是有什么其他的病毒传播方式。)在我的一个好朋友(他是信息安全研究员)和 Kafeine 软件的帮助下,我用最快的速度拿到了一个木马的样本。我在分析环境里运行了这个样本,发现木马会去访问一个未注册的域名( iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com ),然后我就很快把这个域名注册了。

使用 Cisco Umbrella,我们就能看到木马对特定域名的访问流量情况(当然是在我注册之前),这也能看出来,这次大波的木马攻击是在当地时间早晨 8 点开始的。

在域名传播的同时,我在我的虚拟环境里又运行了一次样本,然后就看到了 WannaCrypt 勒索页面;但是更有意思的是,木马感染了我放在那里的测试文件以后,还尝试在 445 端口(SMB协议使用的就是这个端口)随机连接不同的 IP 地址。这种大量的访问尝试马上让我联想到了漏洞扫描,事实上这种对 SMB 端口的扫描行为也让我回忆起了最近报道过的,NSA 的 ShadowBroker 泄露事件,那个里面就有 SMB 漏洞扫描。当然,我当时没有证据能证明这次攻击就是 SMB 漏洞扫描,或者就是用 NSA 泄露出来的漏洞扫描工具来做的,所以我只能在 Twitter 上贴出我发现的东西,然后追踪木马感染的域名。

“我发现木马样本在安装 WannaCrypt 后会扫描 SMB。其他人找到的情况是不是也是这样?注意到木马是采用 P2P 方式传播。” — MalwareTech (@MalwareTechBlog) May 12, 2017

从反馈来看,我得到了相互矛盾的答案,我很满心焦虑地重新装载了之前的分析环境,然后把木马样本又运行了一遍……结果什么事情也没发生。然后我又修改了 host 文件,这样可以让木马对域名的连接失败,然后我又运行了一遍,结果……木马感染成功了。

我估计你没法想象一个成年人高兴得上蹿下跳的画面吧,而且这个人高兴的理由居然是自己的电脑被勒索木马感染了,但是这个人就是我。

勒索木马第一次运行失败了,但是第二次成功感染了。这说明,只要木马能向特定的域名注册成功,那么就能阻止木马的传播,也能阻止木马感染新的电脑。(一开始我并没有公布这个发现,而是通过逆向工程反复验证,不过现在应该已经有其他人在网上公布了这个方法了。)

所以,这么简单的一个伎俩,怎么就能让全球肆虐的木马病毒停止传播呢?

Talos 写了一篇非常不错的文章来解释这个原理,我在这里直接使用 Darien 的截图来说明:

上面代码做的事情,就是尝试连接我们注册的域名。如果连接失败的话,那么就感染系统,如果连接成功的话,木马就会退出执行(一开始我看这个代码并不是很明白,因为我不知道代码的上下文,也不知道这个函数执行的结果返回上一级会干什么。)

我们一开始认为,这个域名是一个“死亡开关”(Kill Switch),如果出了大问题就可以用它来关闭攻击。不过现在我觉得,这是木马用来切断进一步运行的机制,当然这是一个糟糕的设计。

在沙箱环境里,木马的所有的网络请求都会被拦截,然后沙箱会返回一个虚拟的 IP 地址给木马程序,而不是木马要访问的真正的 IP 地址。这种工作原理的副作用就是,如果木马要求访问一个未注册的域名,沙箱则会告诉木马说访问成功(真实情况下是不可能成功的)。

我觉得勒索木马的作者在程序里故意要访问一个未经注册的域名,这种域名在虚拟机的沙箱环境里会被当做“已注册”来处理,一旦程序发现这些“不应该返回结果”的域名居然返回了结果,那么就知道这是在虚拟机环境里运行的,接着木马程序就会自动退出,阻止进一步的入侵分析行为。这种技术并不是首创,Necurs 木马之前就用过这种伎俩(Necurs 会去访问 5 个随机生成的域名,如果这 5 个域名都返回同一个 IP 地址的话,木马程序就会自动退出)。

然而,因为 WannaCrypt 却是在程序里写死了这个用来验证的假域名,而因为我真的注册了这个域名,所以现在不论是在虚拟机里,还是在真实的计算机上,这个域名都会真的返回响应信息,所以木马无论在任何条件下都会相信自己是在虚拟机里运行,从而自动退出……所以说,我们这不经意的注册行为无意中阻止了木马在传播和进一步的勒索行为。我们会继续持有这个域名,以阻止这个病毒样本的进一步感染。

(补注:原作者感谢了在整个分析过程中帮助过他们的组织和机构,我们这里就省略了。)

现在,我想我终于该睡会儿了。


完美阅读及发表评论,请猛击:https://linux.cn/article-8511-1.html?utm_source=rss&utm_medium=rss

在 Ubuntu 16.04 中安装支持 CPU 和 GPU 的 Google TensorFlow 神经网络软件

$
0
0

TensorFlow 是用于机器学习任务的开源软件。它的创建者 Google 希望提供一个强大的工具以帮助开发者探索和建立基于机器学习的应用,所以他们在去年作为开源项目发布了它。TensorFlow 是一个非常强大的工具,专注于一种称为深层神经网络deep neural network(DNN)的神经网络。

深层神经网络被用来执行复杂的机器学习任务,例如图像识别、手写识别、自然语言处理、聊天机器人等等。这些神经网络被训练学习其所要执行的任务。由于训练所需的计算是非常巨大的,在大多数情况下需要 GPU 支持,这时 TensorFlow 就派上用场了。启用了 GPU 并安装了支持 GPU 的软件,那么训练所需的时间就可以大大减少。

本教程可以帮助你安装只支持 CPU 的和同时支持 GPU 的 TensorFlow。要使用带有 GPU 支持的 TensorFLow,你必须要有一块支持 CUDA 的 Nvidia GPU。CUDA 和 CuDNN(Nvidia 的计算库)的安装有点棘手,本指南会提供在实际安装 TensorFlow 之前一步步安装它们的方法。

Nvidia CUDA 是一个 GPU 加速库,它已经为标准神经网络中用到的标准例程调优过。CuDNN 是一个用于 GPU 的调优库,它负责 GPU 性能的自动调整。TensorFlow 同时依赖这两者用于训练并运行深层神经网络,因此它们必须在 TensorFlow 之前安装。

需要指出的是,那些不希望安装支持 GPU 的 TensorFlow 的人,你可以跳过以下所有的步骤并直接跳到:“步骤 5:安装只支持 CPU 的 TensorFlow”。

关于 TensorFlow 的介绍可以在这里找到。

1、 安装 CUDA

首先,在这里下载用于 Ubuntu 16.04 的 CUDA 库。此文件非常大(2GB),因此也许会花费一些时间下载。

下载的文件是 “.deb” 包。要安装它,运行下面的命令:

sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb

Install CUDA

下面的的命令会安装所有的依赖,并最后安装 cuda 工具包:

sudo apt install -f
sudo apt update
sudo apt install cuda

如果成功安装,你会看到一条消息说:“successfully installed”。如果已经安装了,接着你可以看到类似下面的输出:

Install CUDA with apt

2、安装 CuDNN 库

CuDNN 下载需要花费一些功夫。Nvidia 没有直接提供下载文件(虽然它是免费的)。通过下面的步骤获取 CuDNN。

  1. 点击此处进入 Nvidia 的注册页面并创建一个帐户。第一页要求你输入你的个人资料,第二页会要求你回答几个调查问题。如果你不知道所有答案也没问题,你可以随便选择一个选项。
  2. 通过前面的步骤,Nvidia 会向你的邮箱发送一个激活链接。在你激活之后,直接进入这里的 CuDNN 下载链接。
  3. 登录之后,你需要填写另外一份类似的调查。随机勾选复选框,然后点击调查底部的 “proceed to Download”,在下一页我们点击同意使用条款。
  4. 最后,在下拉中点击 “Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0”,最后,你需要下载这两个文件:

注意:即使上面说的是用于 Ubuntu 14.04 的库。它也适用于 16.04。

现在你已经同时有 CuDNN 的两个文件了,是时候安装它们了!在包含这些文件的文件夹内运行下面的命令:

sudo dpkg -i libcudnn5_5.1.5-1+cuda8.0_amd64.deb
sudo dpkg -i libcudnn5-dev_5.1.5-1+cuda8.0_amd64.deb

下面的图片展示了这些命令的输出:

Install the CuDNN library

3、 在 bashrc 中添加安装位置

安装位置应该被添加到 bashrc 文件中,以便系统下一次知道如何找到这些用于 CUDA 的文件。使用下面的命令打开 bashrc 文件:

sudo gedit ~/.bashrc

文件打开后,添加下面两行到文件的末尾:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
export CUDA_HOME=/usr/local/cuda

4、 安装带有 GPU 支持的 TensorFlow

这步我们将安装带有 GPU 支持的 TensorFlow。如果你使用的是 Python 2.7,运行下面的命令:

pip install TensorFlow-gpu

如果安装了 Python 3.x,使用下面的命令:

pip3 install TensorFlow-gpu

安装完后,你会看到一条 “successfully installed” 的消息。现在,剩下要测试的是是否已经正确安装。打开终端并输入下面的命令测试:

python
import TensorFlow as tf

你应该会看到类似下面图片的输出。在图片中你可以观察到 CUDA 库已经成功打开了。如果有任何错误,消息会提示说无法打开 CUDA 甚至无法找到模块。为防你或许遗漏了上面的某步,仔细重做教程的每一步就行了。

Install TensorFlow with GPU support

5、 安装只支持 CPU 的 TensorFlow

注意:这步是对那些没有 GPU 或者没有 Nvidia GPU 的人而言的。其他人请忽略这步!!

安装只支持 CPU 的 TensorFlow 非常简单。使用下面两个命令:

pip install TensorFlow

如果你有 python 3.x,使用下面的命令:

pip3 install TensorFlow

是的,就是这么简单!

安装指南至此结束,你现在可以开始构建深度学习应用了。如果你刚刚起步,你可以在这里看下适合初学者的官方教程。如果你正在寻找更多的高级教程,你可以在这里学习了解如何设置可以高精度识别上千个物体的图片识别系统/工具。

(题图:Pixabay,CC0)


via: https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/

作者:Akshay Pai 译者:geekpi 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8512-1.html?utm_source=rss&utm_medium=rss

Viewing all 9060 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>