2016年11月

微软发布了它的下一个版本的 SQL Server 数据库的公众预览版,同时支持 Linux 和 Windows。

在今年 3 月,微软发布过 SQL Server for Linux 的一个内部预览版。同时,微软官方说 SQL Server for Linux 是 SQL Server for Windows 版本的一个子集,将可以运行在 Ubuntu 上或作为 Docker 镜像运行(后来补充说内部预览也支持 Red Hat 的 RHEL)。该公司官方称用户购买的 SQL Server 将可以用在 Windows 服务器或 Linux 上,此后不久还说该版本的 SQL Server for Linux 和 for Windows 实际上是同一个。

不过,就在今天(美国时间 11 月 16 日),微软将 SQL Server Next 定位为既可以运行在 Linux ,也可以运行在 Windows 上的一个产品。

微软官方称,运行在 Linux 上和运行在 Windows 上的 SQL Server Next 基于同一份代码基,“有些功能存在平台差异,比如说 Linux 上的文件路径不同于 Windows”,但是这不是两个完全不同的产品。运行在 Linux 上的 SQL Server Next 拥有“关系型数据库引擎的所有主要功能”,这包括堆内在线事务处理(OLTP)、堆内列存储、透明数据加密、全程加密、行级安全等等。

SQL Server for Linux 的公众预览版支持 Ubuntu、Red Hat 的 RHEL、SUSE 的 SLES,也将很快出现在 Azure 虚拟机中和 Docker Hub 上。不过,微软依旧说,支持 Linux 和 Windows 的 SQL Server 的正式版仍然会要到明年中期才能发布。

Linux 下的 SQL Server 公众预览版可以从微软的 SQL Server on Linux 网站上下载到。

众所周知,使用开源软件的公司不会将其自由而强大的 MariaDB 或 MySQL 数据库方案用 SQL Server 来替代,但是微软的 SQL Server 承诺支持 Docker 容器,并允许选择数据类型和开发语言,对于某些场景来说,使用 SQL Server 可以节省成本,提升性能,并增强灵活性。在今年 3 月份发布内部预览版之后,微软宣布有超过 8000 家公司已经在第一周内注册尝试了 SQL Server for Linux,其中位列财富 500 强里的公司超过一半都参与了试用。

是的,你没看错,这不是洋葱新闻,也不是愚人节笑话。

微软自从其新 CEO 萨提亚·纳德拉上台后,逐渐增加了对 Linux 和开源的投入,而现在,更是以白金会员的身份加入到了 Linux 基金会。

Linux 基金会官员表示欢迎微软的加入。“成为 Linux 基金会白金成员后,微软可以更好的与开源社区合作,为更多人提供变革性的移动及云的体验,”Linux 基金会执行董事 Jim Zemlin 说。“微软是很多项目的关键贡献者,而且我们看到该公司在开放开发方面一直在加强其投入和深化承诺。”

你应该记得,十几年前,微软前 CEO 巴尔默将开源称之为“癌症”,而且,微软到现在还要求 Android 厂商向其缴纳专利费,以及,微软一直想夺回慕尼黑的桌面市场,但是,那又怎么样呢?

现在,微软逐渐加大了对开源和 Linux 方面的关注和投入,诸如 PowerShellVisual Studio Code 以及 Edge JavaScript 引擎这样的项目,已经逐个开源化,将微软推近这个它曾经憎恨过的开源世界。而且,通过 Windows 10,微软开始走进 Linux,因为该操作系统内置了 Ubuntu。 在收购了 Xamarin 之后,还开源了其软件开发工具包。以及,和 Red HatSUSE 合作在它的 Azure 云上推出了 Linux 镜像。而今年初,微软还发布了 Linux 上的 SQL Server,甚至得到了巴尔默的赞誉

这并不是微软加入的第一个行业领袖级的 Linux 团体,微软已经参与贡献了几个 Linux 基金会项目,包括 Node.js 基金会、 OpenDaylight、 开放容器促进联盟 Open Container Initiative R 社团 R Consortium 开放 API 促进联盟 Open API Initiative

为什么微软会这样呢?因为,Linux 赢了。

微软只在桌面端继续保持着优势,Windows 已经不是最流行的终端用户操作系统了,你知道的,那是 Android。而其它的,比如云、超算,以及服务器,那也都是 Linux 的天下。微软只有两条路,要么死战到底,要么转身拥抱——显然,微软选择了后者。

说来你可能不信,比如说 Azure 云上,有 1/3 的服务器运行着 Linux,而且越来越多。

另外,还有一条与之相呼应的消息也相当的令人意外。

同样是今天,Google 在 Connect()’ 开发者大会上宣布它将加入 .NET 基金会的领导团队。

“周三,Google 加入到 .NET 基金会的技术领导团队,加强了 .NET 开发者社区的生机, 以及 Google 对支持 .NET 业务和开发者的开放平台的责任,” Microsoft 总结到。

是不是感觉这个世界变得快呢?

更新(2016/10/30):我写完这篇文章之后,我在这个基准测试中发了一个错误,会导致 Rollup 比它预期的看起来要好一些。不过,整体结果并没有明显的不同(Rollup 仍然击败了 Browserify 和 Webpack,虽然它并没有像 Closure 十分好),所以我只是更新了图表。该基准测试包括了 RequireJS 和 RequireJS Almond 打包器,所以文章中现在也包括了它们。要看原始帖子,可以查看历史版本

大约一年之前,我在将一个大型 JavaScript 代码库重构为更小的模块时发现了 Browserify 和 Webpack 中一个令人沮丧的事实:

“代码越模块化,代码体积就越大。:< ”

  • Nolan Lawson

过了一段时间,Sam Saccone 发布了一些关于 TumblrImgur 页面加载性能的出色的研究。其中指出:

“超过 400 ms 的时间单纯的花费在了遍历 Browserify 树上。”

  • Sam Saccone

在本篇文章中,我将演示小模块可能会根据你选择的 打包器 bundler 模块系统 module system 而出现高得惊人的性能开销。此外,我还将解释为什么这种方法不但影响你自己代码的模块,也会影响依赖项中的模块,这也正是第三方代码在性能开销上很少提及的方面。

网页性能

一个页面中包含的 JavaScript 脚本越多,页面加载也将越慢。庞大的 JavaScript 包会导致浏览器花费更多的时间去下载、解析和执行,这些都将加长载入时间。

即使当你使用如 Webpack code splitting、Browserify factor bundles 等工具将代码分解为多个包,该开销也仅仅是被延迟到页面生命周期的晚些时候。JavaScript 迟早都将有一笔开销。

此外,由于 JavaScript 是一门动态语言,同时流行的 CommonJS 模块也是动态的,所以这就使得在最终分发给用户的代码中剔除无用的代码变得异常困难。譬如你可能只使用到 jQuery 中的 $.ajax,但是通过载入 jQuery 包,你将付出整个包的代价。

JavaScript 社区对这个问题提出的解决办法是提倡 小模块 的使用。小模块不仅有许多 美好且实用的好处 如易于维护,易于理解,易于集成等,而且还可以通过鼓励包含小巧的功能而不是庞大的库来解决之前提到的 jQuery 的问题。

所以在小模块下,你将不需要这样:

var _ = require('lodash')
_.uniq([1,2,2,3])

而是可以如此:

var uniq = require('lodash.uniq')
uniq([1,2,2,3])

包与模块

需要强调的是这里我提到的“模块”并不同于 npm 中的“包”的概念。当你从 npm 安装一个包时,它会将该模块通过公用 API 展现出来,但是在这之下其实是一个许多模块的聚合物。

例如,我们来看一个包 is-array,它没有别的依赖,并且只包含 一个 JavaScript 文件,所以它只有一个模块。这算是足够简单的。

现在来看一个稍微复杂一点的包,如 once。它有一个依赖的包 wrappy 包都各自包含一个模块,所以总模块数为 2。至此,也还算好。

现在来一起看一个更为令人迷惑的例子:qs。因为它没有依赖的包,所以你可能就认为它只有一个模块,然而事实上,它有四个模块!

你可以用一个我写的工具 browserify-count-modules 来统计一个 Browserify 包的总模块数:

$ npm install qs
$ browserify node_modules/qs | browserify-count-modules
4

这说明了一个包可以包含一个或者多个模块。这些模块也可以依赖于其他的包,而这些包又将附带其自己所依赖的包与模块。由此可以确定的事就是任何一个包将包含至少一个模块。

模块膨胀

一个典型的网页应用中会包含多少个模块呢?我在一些流行的使用 Browserify 的网站上运行 browserify-count-moduleson 并且得到了以下结果:

顺带一提,我写过的最大的开源站点 Pokedex.org 包含了 4 个包,共 311 个模块。

让我们先暂时忽略这些 JavaScript 包的实际大小,我认为去探索一下一定数量的模块本身开销会是一件有意思的事。虽然 Sam Saccone 的文章 “2016 年 ES2015 转译的开销” 已经广为流传,但是我认为他的结论还未到达足够深度,所以让我们挖掘的稍微再深一点吧。

测试环节!

我构造了一个能导入 100、1000 和 5000 个其他小模块的测试模块,其中每个小模块仅仅导出一个数字。而父模块则将这些数字求和并记录结果:

// index.js
var total = 0
total += require('./module_0')
total += require('./module_1')
total += require('./module_2')
// etc.
console.log(total)


// module_1.js
module.exports = 1

我测试了五种打包方法:Browserify、带 bundle-collapser 插件的 Browserify、Webpack、Rollup 和 Closure Compiler。对于 Rollup 和 Closure Compiler 我使用了 ES6 模块,而对于 Browserify 和 Webpack 则用的是 CommonJS,目的是为了不涉及其各自缺点而导致测试的不公平(由于它们可能需要做一些转译工作,如 Babel 一样,而这些工作将会增加其自身的运行时间)。

为了更好地模拟一个生产环境,我对所有的包采用带 -mangle-compress 参数的 Uglify ,并且使用 gzip 压缩后通过 GitHub Pages 用 HTTPS 协议进行传输。对于每个包,我一共下载并执行 15 次,然后取其平均值,并使用 performance.now() 函数来记录载入时间(未使用缓存)与执行时间。

包大小

在我们查看测试结果之前,我们有必要先来看一眼我们要测试的包文件。以下是每个包最小处理后但并未使用 gzip 压缩时的体积大小(单位:Byte):

100 个模块1000 个模块5000 个模块
browserify798279987419985
browserify-collapsed578657991309982
webpack395439055203052
rollup671697138968
closure758795843955
100 个模块1000 个模块5000 个模块
browserify16491380064513
browserify-collapsed14641190356335
webpack693502726363
rollup300214511510
closure302214011789

Browserify 和 Webpack 的工作方式是隔离各个模块到各自的函数空间,然后声明一个全局载入器,并在每次 require() 函数调用时定位到正确的模块处。下面是我们的 Browserify 包的样子:

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o

而 Rollup 和 Closure 包看上去则更像你亲手写的一个大模块。这是 Rollup 打包的包:

(function () {
        'use strict';
        var total = 0
        total += 0
        total += 1
        total += 2
// etc.

如果你清楚在 JavaScript 中使用嵌套函数与在关联数组查找一个值的固有开销, 那么你将很容易理解出现以下测试的结果的原因。

测试结果

我选择在搭载 Android 5.1.1 与 Chrome 52 的 Nexus 5(代表中低端设备)和运行 iOS 9 的第 6 代 iPod Touch(代表高端设备)上进行测试。

这是 Nexus 5 下的测试结果(查看表格):

Nexus 5 结果

这是 iPod Touch 下的测试结果(查看表格):

iPod Touch 结果

在 100 个模块时,各包的差异是微不足道的,但是一旦模块数量达到 1000 个甚至 5000 个时,差异将会变得非常巨大。iPod Touch 在不同包上的差异并不明显,而对于具有一定年代的 Nexus 5 来说,Browserify 和 Webpack 明显耗时更多。

与此同时,我发现有意思的是 Rollup 和 Closure 的运行开销对于 iPod 而言几乎可以忽略,并且与模块的数量关系也不大。而对于 Nexus 5 来说,运行的开销并非完全可以忽略,但 Rollup/Closure 仍比 Browserify/Webpack 低很多。后者若未在几百毫秒内完成加载则将会占用主线程的好几帧的时间,这就意味着用户界面将冻结并且等待直到模块载入完成。

值得注意的是前面这些测试都是在千兆网速下进行的,所以在网络情况来看,这只是一个最理想的状况。借助 Chrome 开发者工具,我们可以认为地将 Nexus 5 的网速限制到 3G 水平,然后来看一眼这对测试产生的影响(查看表格):

Nexus 5 3G 结果

一旦我们将网速考虑进来,Browserify/Webpack 和 Rollup/Closure 的差异将变得更为显著。在 1000 个模块规模(接近于 Reddit 1050 个模块的规模)时,Browserify 花费的时间比 Rollup 长大约 400 毫秒。然而 400 毫秒已经不是一个小数目了,正如 Google 和 Bing 指出的,亚秒级的延迟都会 对用户的参与产生明显的影响

还有一件事需要指出,那就是这个测试并非测量 100 个、1000 个或者 5000 个模块的每个模块的精确运行时间。因为这还与你对 require() 函数的使用有关。在这些包中,我采用的是对每个模块调用一次 require() 函数。但如果你每个模块调用了多次 require() 函数(这在代码库中非常常见)或者你多次动态调用 require() 函数(例如在子函数中调用 require() 函数),那么你将发现明显的性能退化。

Reddit 的移动站点就是一个很好的例子。虽然该站点有 1050 个模块,但是我测量了它们使用 Browserify 的实际执行时间后发现比“1000 个模块”的测试结果差好多。当使用那台运行 Chrome 的 Nexus 5 时,我测出 Reddit 的 Browserify require() 函数耗时 2.14 秒。而那个“1000 个模块”脚本中的等效函数只需要 197 毫秒(在搭载 i7 处理器的 Surface Book 上的桌面版 Chrome,我测出的结果分别为 559 毫秒与 37 毫秒,虽然给出桌面平台的结果有些令人惊讶)。

这结果提示我们有必要对每个模块使用多个 require() 函数的情况再进行一次测试。不过,我并不认为这对 Browserify 和 Webpack 会是一个公平的测试,因为 Rollup 和 Closure 都会将重复的 ES6 库导入处理为一个的顶级变量声明,同时也阻止了顶层空间以外的其他区域的导入。所以根本上来说,Rollup 和 Closure 中一个导入和多个导入的开销是相同的,而对于 Browserify 和 Webpack,运行开销随 require() 函数的数量线性增长。

为了我们这个分析的目的,我认为最好假设模块的数量是性能的短板。而事实上,“5000 个模块”也是一个比“5000 个 require() 函数调用”更好的度量标准。

结论

首先,bundle-collapser 对 Browserify 来说是一个非常有用的插件。如果你在产品中还没使用它,那么你的包将相对来说会略大且运行略慢(虽然我得承认这之间的差异非常小)。另一方面,你还可以转换到 Webpack 以获得更快的包而不需要额外的配置(其实我非常不愿意这么说,因为我是个顽固的 Browserify 粉)。

不管怎样,这些结果都明确地指出 Webpack 和 Browserify 相较 Rollup 和 Closure Compiler 而言表现都稍差,并且性能差异随着模块大小的增大而增大。不幸的是,我并不确定 Webpack 2 是否能解决这些问题,因为尽管他们将 从 Rollup 中借鉴一些想法,但是看起来他们的关注点更多在于 tree-shaking 方面 而不是在于 scope-hoisting 方面。(更新:一个更好的名字称为 内联 inlining ,并且 Webpack 团队 正在做这方面的工作。)

给出这些结果之后,我对 Closure Compiler 和 Rollup 在 JavaScript 社区并没有得到过多关注而感到惊讶。我猜测或许是因为(前者)需要依赖 Java,而(后者)仍然相当不成熟并且未能做到开箱即用(详见 Calvin’s Metcalf 的评论 中作的不错的总结)。

即使没有足够数量的 JavaScript 开发者加入到 Rollup 或 Closure 的队伍中,我认为 npm 包作者们也已准备好了去帮助解决这些问题。如果你使用 npm 安装 lodash,你将会发其现主要的导入是一个巨大的 JavaScript 模块,而不是你期望的 Lodash 的 超模块 hyper-modular 特性(require('lodash/uniq')require('lodash.uniq') 等等)。对于 PouchDB,我们做了一个类似的声明以 使用 Rollup 作为预发布步骤,这将产生对于用户而言尽可能小的包。

同时,我创建了 rollupify 来尝试将这过程变得更为简单一些,只需拖动到已存在的 Browserify 工程中即可。其基本思想是在你自己的项目中使用 导入 import 导出 export (可以使用 cjs-to-es6 来帮助迁移),然后使用 require() 函数来载入第三方包。这样一来,你依旧可以在你自己的代码库中享受所有模块化的优点,同时能导出一个适当大小的大模块来发布给你的用户。不幸的是,你依旧得为第三方库付出一些代价,但是我发现这是对于当前 npm 生态系统的一个很好的折中方案。

所以结论如下:一个大的 JavaScript 包比一百个小 JavaScript 模块要快。尽管这是事实,我依旧希望我们社区能最终发现我们所处的困境————提倡小模块的原则对开发者有利,但是对用户不利。同时希望能优化我们的工具,使得我们可以对两方面都有利。

福利时间!三款桌面浏览器

通常来说我喜欢在移动设备上运行性能测试,因为在这里我们能更清楚的看到差异。但是出于好奇,我也分别在一台搭载 i7 的 Surface Book 上的 Chrome 52、Edge 14 和 Firefox 48 上运行了测试。这分别是它们的测试结果:

Chrome 52 (查看表格)

Chrome 结果

Edge 14 (查看表格)

Edge 结果

Firefox 48 (查看表格)

Firefox 结果

我在这些结果中发现的有趣的地方如下:

  1. bundle-collapser 总是与 slam-dunk 完全不同。
  2. Rollup 和 Closure 的下载时间与运行时间之比总是非常高,它们的运行时间基本上微不足道。ChakraCore 和 SpiderMonkey 运行最快,V8 紧随其后。

如果你的 JavaScript 非常大并且是延迟加载,那么第二点将非常重要。因为如果你可以接受等待网络下载的时间,那么使用 Rollup 和 Closure 将会有避免界面线程冻结的优点。也就是说,它们将比 Browserify 和 Webpack 更少出现界面阻塞。

更新:在这篇文章的回应中,JDD 已经 给 Webpack 提交了一个 issue。还有 一个是给 Browserify 的

更新 2:Ryan Fitzer 慷慨地增加了 RequireJS 和包含 Almond 的 RequireJS 的测试结果,两者都是使用 AMD 而不是 CommonJS 或者 ES6。

测试结果表明 RequireJS 具有 最大的包大小 但是令人惊讶的是它的运行开销 与 Rollup 和 Closure 非常接近。这是在运行 Chrome 52 的 Nexus 5 下限制网速为 3G 的测试结果:

Nexus 5 (3G) RequireJS 结果

更新 3: 我写了一个 optimize-js ,它会减少一些函数内的函数的解析成本。


via: https://nolanlawson.com/2016/08/15/the-cost-of-small-modules/

作者:Nolan 译者:Yinr 校对:wxy

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

对文件进行压缩,可以通过使用较少的字节对文件中的数据进行编码来显著地减小文件的大小,并且在跨网络的文件的备份和传送时很有用。 另一方面,解压文件意味着将文件中的数据恢复到初始状态。

Linux 中有几个文件压缩和解压缩工具,比如gzip、7-zip、Lrzip、PeaZip 等等。

本篇教程中,我们将介绍如何在 Linux 中使用 bzip2 工具压缩及解压缩.bz2文件。

bzip2 是一个非常有名的压缩工具,并且在大多数主流 Linux 发行版上都有,你可以在你的发行版上用合适的命令来安装它。

$ sudo apt install bzip2     [On Debian/Ubuntu] 
$ sudo yum install  bzip2    [On CentOS/RHEL]
$ sudo dnf install bzip2     [On Fedora 22+]

使用 bzip2 的常规语法是:

$ bzip2 option(s) filenames 

如何在 Linux 中使用“bzip2”压缩文件

你可以如下压缩一个文件,使用-z标志启用压缩:

$ bzip2 filename
或者
$ bzip2 -z filename

要压缩一个.tar文件,使用的命令为:

$ bzip2 -z backup.tar

重要:bzip2 默认会在压缩及解压缩文件时删除输入文件(原文件),要保留输入文件,使用-k或者--keep选项。

此外,-f或者--force标志会强制让 bzip2 覆盖已有的输出文件。

------ 要保留输入文件  ------
$ bzip2 -zk filename
$ bzip2 -zk backup.tar

你也可以设置块的大小,从 100k 到 900k,分别使用-1或者--fast-9或者--best

$ bzip2 -k1  Etcher-linux-x64.AppImage
$ ls -lh  Etcher-linux-x64.AppImage.bz2 
$ bzip2 -k9  Etcher-linux-x64.AppImage 
$ bzip2 -kf9  Etcher-linux-x64.AppImage 
$ ls -lh Etcher-linux-x64.AppImage.bz2 

下面的截屏展示了如何使用选项来保留输入文件,强制 bzip2 覆盖输出文件,并且在压缩中设置块的大小。

Compress Files Using bzip2 in Linux

在 Linux 中使用 bzip2 压缩文件

如何在 Linux 中使用“bzip2”解压缩文件

要解压缩.bz2文件,确保使用-d或者--decompress选项:

$ bzip2 -d filename.bz2

注意:这个文件必须是.bz2的扩展名,上面的命令才能使用。

$ bzip2 -vd Etcher-linux-x64.AppImage.bz2 
$ bzip2 -vfd Etcher-linux-x64.AppImage.bz2 
$ ls -l Etcher-linux-x64.AppImage 

Decompress bzip2 File in Linux

在 Linux 中解压 bzip2 文件

要浏览 bzip2 的帮助及 man 页面,输入下面的命令:

$ bzip2  -h
$ man bzip2

最后,通过上面简单的阐述,我相信你现在已经可以在 Linux 中压缩及解压缩bz2文件了。然而,有任何的问题和反馈,可以在评论区中留言。

重要的是,你可能想在 Linux 中查看一些重要的 tar 命令示例,以便学习使用 tar 命令来创建压缩归档文件


via: http://www.tecmint.com/linux-compress-decompress-bz2-files-using-bzip2

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

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

让我们从坏道和坏块的定义开始说起,它们是一块磁盘或闪存上不再能够被读写的部分,一般是由于磁盘表面特定的物理损坏或闪存晶体管失效导致的。

随着坏道的继续积累,它们会对你的磁盘或闪存容量产生令人不快或破坏性的影响,甚至可能会导致硬件失效。

同时还需要注意的是坏块的存在警示你应该开始考虑买块新磁盘了,或者简单地将坏块标记为不可用。

因此,在这篇文章中,我们通过几个必要的步骤,使用特定的磁盘扫描工具让你能够判断 Linux 磁盘或闪存是否存在坏道。

以下就是步骤:

在 Linux 上使用坏块工具检查坏道

坏块工具可以让用户扫描设备检查坏道或坏块。设备可以是一个磁盘或外置磁盘,由一个如 /dev/sdc 这样的文件代表。

首先,通过超级用户权限执行 fdisk 命令来显示你的所有磁盘或闪存的信息以及它们的分区信息:

$ sudo fdisk -l<br>

列出 Linux 文件系统分区

列出 Linux 文件系统分区

然后用如下命令检查你的 Linux 硬盘上的坏道/坏块:

$ sudo badblocks -v /dev/sda10 > badsectors.txt

在 Linux 上扫描硬盘坏道

在 Linux 上扫描硬盘坏道

上面的命令中,badblocks 扫描设备 /dev/sda10(记得指定你的实际设备),-v 选项让它显示操作的详情。另外,这里使用了输出重定向将操作结果重定向到了文件 badsectors.txt

如果你在你的磁盘上发现任何坏道,卸载磁盘并像下面这样让系统不要将数据写入回报的扇区中。

你需要执行 e2fsck(针对 ext2/ext3/ext4 文件系统)或 fsck 命令,命令中还需要用到 badsectors.txt 文件和设备文件。

-l 选项告诉命令将在指定的文件 badsectors.txt 中列出的扇区号码加入坏块列表。

------------ 针对 for ext2/ext3/ext4 文件系统 ------------
$ sudo e2fsck -l badsectors.txt /dev/sda10

或

------------ 针对其它文件系统 ------------
$ sudo fsck -l badsectors.txt /dev/sda10

在 Linux 上使用 Smartmontools 工具扫描坏道

这个方法对带有 S.M.A.R.T( 自我监控分析报告技术 Self-Monitoring, Analysis and Reporting Technology )系统的现代磁盘(ATA/SATA 和 SCSI/SAS 硬盘以及固态硬盘)更加的可靠和高效。S.M.A.R.T 系统能够帮助检测,报告,以及可能记录它们的健康状况,这样你就可以找出任何可能出现的硬件失效。

你可以使用以下命令安装 smartmontools

------------ 在基于 Debian/Ubuntu 的系统上 ------------
$ sudo apt-get install smartmontools

------------ 在基于 RHEL/CentOS 的系统上 ------------
$ sudo yum install smartmontools

安装完成之后,使用 smartctl 控制磁盘集成的 S.M.A.R.T 系统。你可以这样查看它的手册或帮助:

$ man smartctl
$ smartctl -h

然后执行 smartctrl 命令并在命令中指定你的设备作为参数,以下命令包含了参数 -H--health 以显示 SMART 整体健康自我评估测试结果。

$ sudo smartctl -H /dev/sda10

检查 Linux 硬盘健康

检查 Linux 硬盘健康

上面的结果指出你的硬盘很健康,近期内不大可能发生硬件失效。

要获取磁盘信息总览,使用 -a--all 选项来显示关于磁盘所有的 SMART 信息,-x--xall 来显示所有关于磁盘的 SMART 信息以及非 SMART 信息。

在这个教程中,我们涉及了有关磁盘健康诊断的重要话题,你可以下面的反馈区来分享你的想法或提问,并且记得多回来看看。


via: http://www.tecmint.com/check-linux-hard-disk-bad-sectors-bad-blocks/

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

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

在这第二篇 Kali Linux 文章中, 将讨论称为 ‘nmap‘ 的网络工具。虽然 nmap 不是 Kali 下唯一的一个工具,但它是最有用的网络映射工具之一。

Nmap, 是 Network Mapper 的缩写,由 Gordon Lyon 维护(更多关于 Mr. Lyon 的信息在这里: http://insecure.org/fyodor/) ,并被世界各地许多的安全专业人员使用。

这个工具在 Linux 和 Windows 下都能使用,并且是用命令行驱动的。相对于那些令人害怕的命令行,对于 nmap,在这里有一个美妙的图形化前端叫做 zenmap。

强烈建议个人去学习 nmap 的命令行版本,因为与图形化版本 zenmap 相比,它提供了更多的灵活性。

对服务器进行 nmap 扫描的目的是什么?很好的问题。Nmap 允许管理员快速彻底地了解网络上的系统,因此,它的名字叫 Network MAPper 或者 nmap。

Nmap 能够快速找到活动的主机和与该主机相关联的服务。Nmap 的功能还可以通过结合 Nmap 脚本引擎(通常缩写为 NSE)进一步被扩展。

这个脚本引擎允许管理员快速创建可用于确定其网络上是否存在新发现的漏洞的脚本。已经有许多脚本被开发出来并且包含在大多数的 nmap 安装中。

提醒一句 - 使用 nmap 的人既可能是善意的,也可能是恶意的。应该非常小心,确保你不要使用 nmap 对没有明确得到书面许可的系统进行扫描。请在使用 nmap 工具的时候注意!

系统要求

  1. Kali Linux (nmap 可以用于其他操作系统,并且功能也和这个指南里面讲的类似)。
  2. 另一台计算机,并且装有 nmap 的计算机有权限扫描它 - 这通常很容易通过软件来实现,例如通过 VirtualBox 创建虚拟机。

    1. 想要有一个好的机器来练习一下,可以了解一下 Metasploitable 2。
    2. 下载 MS2 :Metasploitable2
  3. 一个可以工作的网络连接,或者是使用虚拟机就可以为这两台计算机建立有效的内部网络连接。

Kali Linux – 使用 Nmap

使用 nmap 的第一步是登录 Kali Linux,如果需要,就启动一个图形会话(本系列的第一篇文章安装了 Kali Linux 的 Enlightenment 桌面环境)。

在安装过程中,安装程序将提示用户输入用来登录的“root”用户和密码。 一旦登录到 Kali Linux 机器,使用命令startx就可以启动 Enlightenment 桌面环境 - 值得注意的是 nmap 不需要运行桌面环境。

# startx

Start Desktop Environment in Kali Linux

在 Kali Linux 中启动桌面环境

一旦登录到 Enlightenment,将需要打开终端窗口。通过点击桌面背景,将会出现一个菜单。导航到终端可以进行如下操作:应用程序 -> 系统 -> 'Xterm' 或 'UXterm' 或 '根终端'。

作者是名为 'Terminator' 的 shell 程序的粉丝,但是这可能不会显示在 Kali Linux 的默认安装中。这里列出的所有 shell 程序都可用于使用 nmap 。

Launch Terminal in Kali Linux

在 Kali Linux 下启动终端

一旦终端启动,nmap 的乐趣就开始了。 对于这个特定的教程,将会创建一个 Kali 机器和 Metasploitable机器之间的私有网络。

这会使事情变得更容易和更安全,因为私有的网络范围将确保扫描保持在安全的机器上,防止易受攻击的 Metasploitable 机器被其他人攻击。

怎样在我的网络上找到活动主机

在此示例中,这两台计算机都位于专用的 192.168.56.0/24 网络上。 Kali 机器的 IP 地址为 192.168.56.101,要扫描的 Metasploitable 机器的 IP 地址为 192.168.56.102。

假如我们不知道 IP 地址信息,但是可以通过快速 nmap 扫描来帮助确定在特定网络上哪些是活动主机。这种扫描称为 “简单列表” 扫描,将 -sL参数传递给 nmap 命令。

# nmap -sL 192.168.56.0/24

Nmap - Scan Network for Live Hosts

Nmap – 扫描网络上的活动主机

悲伤的是,这个初始扫描没有返回任何活动主机。 有时,这是某些操作系统处理端口扫描网络流量的一个方法。

在我的网络中找到并 ping 所有活动主机

不用担心,在这里有一些技巧可以使 nmap 尝试找到这些机器。 下一个技巧会告诉 nmap 尝试去 ping 192.168.56.0/24 网络中的所有地址。

# nmap -sn 192.168.56.0/24

Nmap - Ping All Connected Live Network Hosts

Nmap – Ping 所有已连接的活动网络主机

这次 nmap 会返回一些潜在的主机来进行扫描! 在此命令中,-sn 禁用 nmap 的尝试对主机端口扫描的默认行为,只是让 nmap 尝试 ping 主机。

找到主机上的开放端口

让我们尝试让 nmap 端口扫描这些特定的主机,看看会出现什么。

# nmap 192.168.56.1,100-102

Nmap - Network Ports Scan on Host

Nmap – 在主机上扫描网络端口

哇! 这一次 nmap 挖到了一个金矿。 这个特定的主机有相当多的开放网络端口

这些端口全都代表着在此特定机器上的某种监听服务。 我们前面说过,192.168.56.102 的 IP 地址会分配给一台易受攻击的机器,这就是为什么在这个主机上会有这么多开放端口

在大多数机器上打开这么多端口是非常不正常的,所以赶快调查这台机器是个明智的想法。管理员可以检查下网络上的物理机器,并在本地查看这些机器,但这不会很有趣,特别是当 nmap 可以为我们更快地做到时!

找到主机上监听端口的服务

下一个扫描是服务扫描,通常用于尝试确定机器上什么服务监听在特定的端口

Nmap 将探测所有打开的端口,并尝试从每个端口上运行的服务中获取信息。

# nmap -sV 192.168.56.102

Nmap - Scan Network Services Listening of Ports

Nmap – 扫描网络服务监听端口

请注意这次 nmap 提供了一些关于 nmap 在特定端口运行的建议(在白框中突出显示),而且 nmap 也试图确认运行在这台机器上的这个操作系统的信息和它的主机名(也非常成功!)。

查看这个输出,应该引起网络管理员相当多的关注。 第一行声称 VSftpd 版本 2.3.4 正在这台机器上运行! 这是一个真正的旧版本的 VSftpd。

通过查找 ExploitDB,对于这个版本早在 2001 年就发现了一个非常严重的漏洞(ExploitDB ID – 17491)。

发现主机上上匿名 ftp 登录

让我们使用 nmap 更加清楚的查看这个端口,并且看看可以确认什么。

# nmap -sC 192.168.56.102 -p 21

Nmap - Scan Particular Post on Machine

Nmap – 扫描机器上的特定端口

使用此命令,让 nmap 在主机上的 FTP 端口(-p 21)上运行其默认脚本(-sC)。 虽然它可能是、也可能不是一个问题,但是 nmap 确实发现在这个特定的服务器是允许匿名 FTP 登录的

检查主机上的漏洞

这与我们早先知道 VSftd 有旧漏洞的知识相匹配,应该引起一些关注。 让我们看看 nmap有没有脚本来尝试检查 VSftpd 漏洞。

# locate .nse | grep ftp

Nmap - Scan VSftpd Vulnerability

Nmap – 扫描 VSftpd 漏洞

注意 nmap 已有一个 NSE 脚本已经用来处理 VSftpd 后门问题!让我们尝试对这个主机运行这个脚本,看看会发生什么,但首先知道如何使用脚本可能是很重要的。

# nmap --script-help=ftp-vsftd-backdoor.nse

Learn Nmap NSE Script Usage

了解 Nmap NSE 脚本使用

通过这个描述,很明显,这个脚本可以用来试图查看这个特定的机器是否容易受到先前识别的 ExploitDB 问题的影响。

让我们运行这个脚本,看看会发生什么。

# nmap --script=ftp-vsftpd-backdoor.nse 192.168.56.102 -p 21

Nmap - Scan Host for Vulnerable

Nmap – 扫描易受攻击的主机

耶!Nmap 的脚本返回了一些危险的消息。 这台机器可能面临风险,之后可以进行更加详细的调查。虽然这并不意味着机器缺乏对风险的抵抗力和可以被用于做一些可怕/糟糕的事情,但它应该给网络/安全团队带来一些关注。

Nmap 具有极高的选择性,非常平稳。 到目前为止已经做的大多数扫描, nmap 的网络流量都保持适度平稳,然而以这种方式扫描对个人拥有的网络可能是非常耗时的。

Nmap 有能力做一个更积极的扫描,往往一个命令就会产生之前几个命令一样的信息。 让我们来看看积极的扫描的输出(注意 - 积极的扫描会触发入侵检测/预防系统!)。

# nmap -A 192.168.56.102

Nmap - Complete Network Scan on Host

Nmap – 在主机上完成网络扫描

注意这一次,使用一个命令,nmap 返回了很多关于在这台特定机器上运行的开放端口、服务和配置的信息。 这些信息中的大部分可用于帮助确定如何保护本机以及评估网络上可能运行的软件。

这只是 nmap 可用于在主机或网段上找到的许多有用信息的很短的一个列表。强烈敦促个人在个人拥有的网络上继续以nmap 进行实验。(不要通过扫描其他主机来练习!)。

有一个关于 Nmap 网络扫描的官方指南,作者 Gordon Lyon,可从亚马逊上获得。

方便的话可以留下你的评论和问题(或者使用 nmap 扫描器的技巧)。


via: http://www.tecmint.com/nmap-network-security-scanner-in-kali-linux/

作者:Rob Turner 译者:DockerChen 校对:wxy

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