Skip to content Skip to main navigation Skip to footer

Linux

Linux:Linux 有问必答:如何修复“hda-duplex not supported in this QEMU binary”

提问: 当我尝试在虚拟机中安装一个新的Linux时,虚拟机不能启动且报了下面这个错误:”unsupported configuration: hda-duplex not supported in this QEMU binary.”(“不支持的配置:hda-duplex在此QEMU文件中不支持。”) 我该如何修复?

Linux:Linux 有问必答:如何修复“hda-duplex not supported in this QEMU binary”
Linux:Linux 有问必答:如何修复“hda-duplex not supported in this QEMU binary”

这个错误可能来自一个当默认声卡型号不能被识别时的一个qemu bug。

Linux:Linux 有问必答:如何修复“hda-duplex not supported in this QEMU binary”
Linux:Linux 有问必答:如何修复“hda-duplex not supported in this QEMU binary”
无法完成安装:‘不支持的配置:hda-duplex在此QEMU文件中不支持’

要解决这个问题,按照下面的做。

方案一: virt-manager

virt-manager中,打开虚拟机的虚拟硬件详细菜单,进入声卡选项,改变默认的设备型号为ac97。

Linux:Linux 有问必答:如何修复“hda-duplex not supported in this QEMU binary”
Linux:Linux 有问必答:如何修复“hda-duplex not supported in this QEMU binary”

点击“应用”按钮并保存设置。看一下虚拟机现在是否可以启动了。

方案二: Virsh

如果你使用的是virsh 而不是virt-manager, 你可以编辑VM相应的配置文件。在节点中查找sound节点,并按照下面的默认声卡型号改成ac97


  . . .
  
    
. . .

via: http://ask.xmodulo.com/hda-duplex-not-supported-in-this-qemu-binary.html

译者:geekpi 校对:wxy

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

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

Linux:当前最火的web开发技术

Linux:当前最火的web开发技术
Linux:当前最火的web开发技术

HTML5

2014年10月29日,万维网联盟泪流满面地宣布,经过几乎8年的艰辛努力,HTML5标准规范终于最终制定完成了,并已公开发布。

HTML5提供了一些新的元素和属性,例如nav(网站导航块)和footer。这种标签将有利于搜索引擎的索引整理,同时更好的帮助小屏幕装置和视障人士使用,除此之外,还为其他浏览要素提供了新的功能,如audio和video标记。

HTML5还有望成为梦想中的”开放Web平台”(Open Web Platform)的基石,如能实现可进一步推动更深入的跨平台Web应用。

Angular

我解释一下为什么Angular能够这么火,它主要解决的是哪个层面的问题呢?它解决的是快速开发的问题。我们知道,有很多b/s化的产品,其本质 还是像c/s,只是把这个c做到浏览器里来了,这样的一些系统,它免不了要在浏览器中写大量js,然后使用某种ui框架,它的协同开发人员数量会相对较 大,代码量也会很多,在这类系统的开发过程中,从成本的角度要解决两个问题:

  • 怎样让开发过程尽量快?
  • 怎样让变更成本尽量小?

解决这两个问题的办法是组件化。所谓组件化,在传统软件领域可能会有一些成熟方案,但是拿到Web,尤其Web前端这个层面,基本没有一种通用方 案。组件化并不仅仅要解决“控件”这个层面的问题,还需要把业务数据和逻辑也做规约,理清他们之间的关系,而Angular“碰巧”在这个方面很有帮助, 它把UI和业务逻辑隔离得干干净净,模块之间使用依赖注入来维系关系,易测试,可复用,作为架构师,也可以比较容易地对整个项目有所把控。

我们看到很多人跟风学Angular,有很大一部分并未抓住其实质,而是被一些边角优势所吸引,因此用的过程中各种痛苦,如果能够先认识到它的本质优点所在,并且认识到它确实适合自己的项目,一定能得心应手,左右逢源。

React

为什么很多人被React吸引呢,因为他从另外一个层面解决组件化的问题,而这种方式可能对前端来说更友好,而且还能够在服务端解析模板。喜欢 React的人常常用它的虚拟DOM、精确更新来打击其他框架,诚然,它在这方面做得非常好,但并未高到影响全局的程度。这是什么意思呢,它是一个主要针 对DOM组件的库,如果用于完整的大型产品解决方案,还是有所欠缺的,它的优势集中在上层,但其实从宏观角度看,这一层的效率并没有那么重要,比如说你是 一架很精巧的挖掘机,自带各种分拣功能,但很多时候,大家是很粗暴地去挖东西,就像挖煤那样,你在细节上有多么高效并不重要,只有在一些需要精确控制的场 景下,优势才能发挥出来。况且,当Web Components出来之后,虚拟DOM是有很多没法处理的问题的,而其他框架改进数据绑定的效率之后,也能够把这方面的差距缩小很多。

Instagram的网站和FB网页上的Messenger就是用React写的。虽然我说的都是缺点,但它的实现方式确实别致,值得一看。

Yeoman

Yeoman是Google的团队和外部贡献者团队合作开发的,他的目标是通过Grunt(一个用于开发任务自动化的命令行工具)和Bower(一个HTML、CSS、Javascript和图片等前端资源的包管理器)的包装为开发者创建一个易用的工作流。

Yeoman的目的不仅是要为新项目建立工作流,同时还是为了解决前端开发所面临的诸多严重问题,例如零散的依赖关系。 

Yeoman主要有三部分组成:yo(脚手架工具)、grunt(构建工具)、bower(包管理器)。这三个工具是分别独立开发的,但是需要配合使用,来实现我们高效的工作流模式。 

同形的JavaScript

Linux:当前最火的web开发技术
Linux:当前最火的web开发技术

顾名思义,会有一部分 JavaScript 是前后端公用的,从 路由(Route),模版(Template),到数据验证(Validation),甚至是 交互状态( 比如 一个 modal )。

在这个世界里, 你的应用和视图层逻辑都可以在前后端运行, 这样就依次解决上述所有问题 — 性能优化, 好的维护性, 可以被SEO,更有状态的Web应用。

通过Node.js,一个快速的, 稳定的运行在服务器端的JavaScript, 现在我们可以梦想成真. 通过创建适当的抽象, 我们就可以在服务器端和客户端运行我们的逻辑代码 — 这就是“isomorphic JavaScript“的定义。

webGL

最新版chrome和firefox已经支持,可以做3d动画了。

Flux

这是由Facebook推出的前端架构理念:Flux | Application Architecture for Building User Interfaces

据称是因为Facebook觉得一般的前端MVC框架只能处理小型Web App,无法处理大型的,于是自己搞了一套架构理念。

从个人现在浅薄的认识来看,就是将Model和View之间纷杂的数据交互规整到一个dispatcher中,使得数据只能单向流动,你甚至可以在单向流动的数据中每次都传递一个完整的新数据,忽略掉增删改三种类型,这样可以进一步简化代码。

这样的处理可能有人觉得那DOM每次都生成新的,再整体替换,可能在元素很大量的情况下效率太低。但是配合Facebook自家的React(React自己维护了一套虚拟DOM,每次都会根据新老DOM对比的结果自动的做增删改DOM的操作。。。)感觉瞬间就高大上了。

来源:http://www.evget.com/article/2014/11/24/21849.html

Linux:Linux 有问必答:如何在wget中禁用HTTP转发

提问: 当我用wget获取一个重定向到URL Y的URL X的时候,wget默认会自动获取URL Y。然而我想要强制获取不带重定向的URL X。我该如何禁用wget重定向URL的功能。

在HTTP标准中,重定向响应(带3XX的HTTP响应)说明请求的URL被移到了新的位置。重定向相应接着包含了目标重定向的URL。

Linux:Linux 有问必答:如何在wget中禁用HTTP转发
Linux:Linux 有问必答:如何在wget中禁用HTTP转发

像常规的HTTP客户端,wget支持URL重定向(也叫URL转发),意味着当你尝试下载一个重定向的URL时,wget会自动跟随URL重定向获取重定向后的资源。如果你由于一些原因想要禁用URL重定向,并停止3XX的状态码,你可以使用wget的“–max-redirect=number”选项。这个选项用来指定最大(递归)重定向的数字,默认是20。

如果你想要禁用wget中的HTTP重定向,使用“–max-redirect=0”

$ wget --max-redirect=0 http://www.aaa.com/a.html

--2014-10-31 23:08:58--  http://www.aaa.com/a.html
Resolving aaa.com (aaa.com)... 1.2.3.4
Connecting to aaa.com (aaa.com)|1.2.3.4|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://www.bbb.com/b.html [following]
0 redirections exceeded.

如你所见,当wget遇到HTTP重定向响应时,它不会跟着重定向,并以“0 redirections exceeded”(超出0次重定向)的错误信息停止。它同样会显示一个HTTP的状态码(比如301)。

注意一下curl,另外一个类似的HTTP客户端,行为正好相反。默认上,curl并不会跟随URL重定向。要强制使cutl重定向到一个URL,你要使用“-L”选项。


via: http://ask.xmodulo.com/disable-http-redirect-wget.html

译者:geekpi 校对:wxy

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

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

Linux:教你在 Ubuntu 上使用 LXC 容器

使用“容器”来保证主机环境的安全性,这个概念早在十年前就已经存在(例如 FreeBSD 的 jail 虚拟化技术),但是直到最近,随着部署云架构需求越来越多,像 LXC 和 Docker 这种 Linux 下的容器才成为被关注的焦点。当然,由于主流厂商(云服务商如亚马逊主推 AWS,微软主推 Azure;发行版如红帽、Ubuntu等)组成的强大靠山,Docker 已经被放在媒体的聚光灯下面,其实,Docker 里面所谓的“容器”技术是由 LXC 提供的。

你只是一个普通的 Linux 用户,那 Docker/LXC 能为你带来什么好处呢?容器可以将你的应用在不同的 Linux 发行版之间迁移。想像一下这个场景:你正在用的发行版是 Debian,你喜欢它的稳定性,同时你又想玩一款最新的 Ubuntu 游戏,你不需要在电脑上装双系统然后重启进入 Ubuntu,也不需要在 Debian 上跑一个耗资源的 Ubuntu 虚拟机,你只需要简单地生成一个 Ubuntu 容器就够了。

Linux:教你在 Ubuntu 上使用 LXC 容器
Linux:教你在 Ubuntu 上使用 LXC 容器

抛开 Docker 的好处不谈,让我们聊一下 LXC 容器的好处:我可以使用 libvirt 提供的接口来管理 LXC,这些接口和 Docker 没有任何关系。如果你有使用基于 libvirt 库的管理工具(例如 virt-manager 和 virsh),你就可以使用它们来管理 LXC 容器。

在这篇教程中,我只介绍标准 LXC 容器管理工具的命令行操作,来教你如何在 Ubuntu 下创建和管理 LXC 容器

Ubuntu 下安装 LXC

使用下面的命令安装 LXC 在用户态的工具:

$ sudo apt-get install lxc

然后检查当前内核是否支持 LXC。如果所有结果都是“enable”,说明内核支持:

$ lxc-checkconfig
Linux:教你在 Ubuntu 上使用 LXC 容器
Linux:教你在 Ubuntu 上使用 LXC 容器

安装完 LXC 工具后,就能看到 LXC 自动创建了一块桥接网卡(lxcbr0,可以在 /etc/lxc/default.conf 中设置)。

Linux:教你在 Ubuntu 上使用 LXC 容器
Linux:教你在 Ubuntu 上使用 LXC 容器

当你创建了 LXC 容器后,它的网口会自动链接到这个桥接网卡上,然后这个容器就能和外部世界通信了。

创建 LXC 容器

为了在指定环境下(比如 Debian Wheezy 64位)创建 LXC 容器,你需要一个相应的 LXC 模板。幸运的是 LXC 提供的工具集成了一整套现成的 LXC 模板,你可以在 /usr/share/lxc/templates 目录下找到它们。

 $ ls /usr/share/lxc/templates

一个 LXC 模板实质上就是一个脚本,用于创建指定环境下的容器。当你创建 LXC 容器时,你需要用到它们。

比如你要新建 Ubuntu 容器,使用下面的命令即可:

$ sudo lxc-create -n  -t ubuntu
Linux:教你在 Ubuntu 上使用 LXC 容器
Linux:教你在 Ubuntu 上使用 LXC 容器

默认情况下,这个命令会创建一个最小的 Ubuntu 环境,版本号与你的宿主机一致,我这边是“活泼的蝾螈”(版本号是13.10),64位。

当然你也可以创建任何你喜欢的版本,只要在命令里面加一个版本参数即可。举个例子,创建 Ubuntu 14.10 的容器:

$ sudo lxc-create -n  -t ubuntu -- --release utopic

这个命令就会下载安装指定环境下的软件包,创建新容器。整个过程需要几分钟时间,与容器的类型有关,所以,你可能需要耐心等待。

Linux:教你在 Ubuntu 上使用 LXC 容器
Linux:教你在 Ubuntu 上使用 LXC 容器

下载安装完所有软件包后,LXC 容器镜像就创建完成了,你可以看到默认的登录界面。容器被放到 /var/lib/lxc/<容器名> 这个目录下,容器的根文件系统放在 /var/lib/lxc/<容器名>/rootfs 目录下。

创建过程中下载的软件包保存在 /var/cache/lxc 目录下面,当你想另外建一个一样的容器时,可以省去很多下载时间。

用下面的命令看看主机上所有的 LXC 容器:

$ sudo lxc-ls --fancy

NAME  STATE    IPV4  IPV6  AUTOSTART
------------------------------------
test-lxc   STOPPED  -     -     NO

使用下面的命令启动容器。参数“-d”将容器作为后台进程打开。如果没有指定这个参数,你可以在控制台界面上直接把容器的运行程序关闭(LCTT译注:Ctrl+C组合键)。

$ sudo lxc-start -n  -d

打开容器后,看看状态:

$ sudo lxc-ls --fancy

NAME  STATE    IPV4       IPV6  AUTOSTART
-----------------------------------------
lxc   RUNNING  10.0.3.55  -     NO

容器状态是“运行中”,容器 IP 是10.0.3.55。

你也可以看到容器的网络接口(比如我这里是 vethJ06SFL)自动与 LXC 内部网桥(lxcbr0)连上了:

$ brctl show lxcbr0

管理 LXC 容器

我们已经学习了怎么创建和启动 LXC 容器,现在来看看怎么玩一个正在运行着的容器。

第一步:打开容器控制台:

$ sudo lxc-console -n 
Linux:教你在 Ubuntu 上使用 LXC 容器
Linux:教你在 Ubuntu 上使用 LXC 容器

使用“Crtl+a q”组合键退出控制台。

停止、删除容器:

$ sudo lxc-stop -n 
$ sudo lxc-destroy -n 

复制容器,用下面的命令:

$ sudo lxc-stop -n 
$ sudo lxc-clone -o  -n 

常见问题

这个小节主要介绍你们在使用 LXC 过程中碰到过的问题。

  1. 创建 LXC 容器时遇到下面的错误:

    $ sudo lxc-create -n test-lxc -t ubuntu


lxc-create: symbol lookup error: /usr/lib/x86_64-linux-gnu/liblxc.so.1: undefined symbol: cgmanager_get_pid_cgroup_abs_sync

错误的原因是你运行了最新的 LXC,但是它所依赖的 libcgmanager 版本较老,两者不兼容。升级下 libcmanager 即可解决问题:

$ sudo apt-get install libcgmanager0

via: http://xmodulo.com/lxc-containers-ubuntu.html

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

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

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

Linux:CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)

LEMP 组合包是一款日益流行的网站服务组合软件包,在许多生产环境中的核心网站服务上起着强有力的作用。正如其名称所暗示的, LEMP 包是由 Linux、nginx、MariaDB/MySQL 和 PHP 组成的。在传统的 LAMP 包中使用的 Apache HTTP 协议服务器性能低下而且难于大规模集群,相比来说 nginx 的高性能及轻量级等特性,正是其的替代方案。 MariaDB 是一款社区支持驱动的 MySQL 数据库的分支,其功能更多性能更佳。PHP,服务端编程语言,具体是由 PHP FastCGI 的增强版 PHP-FPM 组件来处理,生成网页动态内容。

(LCTT 译注:为何采用 LEMP 而不是 LNMP 的缩写?据 https://lemp.io/ 的解释:Nginx 的发音是 Engine-X,重要的发音而不是首字母,而且 LEMP 实际上是可读的,而 LNMP 看起来只是字母表。)

这篇文章里,我们示范如何在 CentOS 操作平台上安装 LEMP 包。我们安装的目标是 CentOS 6 和 CentOS 7 两个操作平台,如有必要会指出它们的不同。

Linux:CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)
Linux:CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)

第一步: Nginx

让我们在 CentOS 上安装 nginx 作为第一步,然后对它作些基本的配置,比如使其能引导时启动和对防火墙做个性化设置

安装 Nginx

让我们从它的官方的 RPM 源来安装一个预构建的稳定版本的 nginx 包。

在 CentOS 7 系统上:

$ sudo rpm --import http://nginx.org/keys/nginx_signing.key
$ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ sudo yum install nginx

在 CentOS 6 系统上:

$ sudo rpm --import http://nginx.org/keys/nginx_signing.key
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo yum install nginx

注意在安装 nginx RPM 包之前,如果您没有导入 nginx 的官方 GPG 密钥的话,会出一如下所示的警告:

warning: /var/tmp/rpm-tmp.KttVHD: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY

启动 Nginx

安装完成后,nginx 是不会自动启动的。现在让我们来启动它吧,还要做些配置让其可以随着操作系统启动而启动。我们也需要在防火墙里打开 TCP/80 端口,以使得可以远程访问 nginx 的 web 服务。所有这些操作、设置都只需要输入如下命令就可实现。

在 CentOS 7 系统上:

$ sudo systemctl start nginx
$ sudo systemctl enable nginx
$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
$ sudo firewall-cmd --reload

在 CentOS 6 系统上:

$ sudo service nginx start
$ sudo chkconfig nginx on
$ sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$ sudo service iptables save

测试 Nginx

nginx 的默认文档要目录是 /usr/share/nginx/html。默认的 index.html 文件一定已经在这目录下了。让我们检测下是否可以访问到这个测试 web 页,输入 http://nginx的ip地址/ 访问。

Linux:CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)
Linux:CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)

如果您看到的是如上所示的页面的话,说明 nginx 已经正常启动。继续往下。

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

Linux:小技巧:如何修复Lubuntu中的Docky混合错误

总所周知,Docky是Unix/Linux类系统中的轻量级应用启动器。我是 Lubuntu 和 Docky 的忠实粉丝,因为它们不需要占用我的所有系统资源,这样就可以同时运行更多应用。我在笔记本上使用Docky应用启动器,系统为Lubuntu 14.04.

但是,如果你使用LXDE发行版,你也许肯定遇到过使用Docky时报混合的错误。看下面的截图。

如果不开启混合功能,就不能使用Docky一些特别功能,如3D背景、自动隐藏。如果你想开启这些Docky的功能,那么你需要在你的LXDE系统中开启混合功能。

就像这样,首先安装 xcompmgr包:

sudo apt-get install xcompmgr

然后,选择菜单(Menu) -> 偏好(Preferences) -> LXSession默认程序(Default applications for LXSession)。选择自动开始(Autostart)选项卡。 在(+增加)+Add框中输入“@xcompmgr -n”不带引号。最后点击增加按钮。

Linux:小技巧:如何修复Lubuntu中的Docky混合错误
Linux:小技巧:如何修复Lubuntu中的Docky混合错误

这样就搞定了。关掉LXSession配置窗口,注销或重启系统。之后,你就可以看见混合功能已经打开。

Linux:小技巧:如何修复Lubuntu中的Docky混合错误
Linux:小技巧:如何修复Lubuntu中的Docky混合错误

这时,你就可以使用3D背景和隐藏功能,如自动隐藏(Auto-hide),Intellihide和窗口闪烁(Window dodge)等。

Linux:小技巧:如何修复Lubuntu中的Docky混合错误
Linux:小技巧:如何修复Lubuntu中的Docky混合错误

搞定!干杯!


via: http://www.unixmen.com/quick-tip-fix-docky-compositing-error-lubuntu/

作者:SK 译者:Vic020/VicYu 校对:wxy

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

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

Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频

Libav是一款跨平台的工具库,能够用来处理多媒体文件、流和协议。它最初是源自ffmpeg。Libav带有一些工具,比如:

  • Avplay: 一款视频音频播放器。
  • Avconv: 能够记录多个设备输入源的一个多媒体转换器和视频音频录制器。
  • Avprobe: 一个连接多媒体文件流并且返回关于这个文件流的统计信息的工具。
  • Libavfilter: 一个Libav工具的过滤器(filtering)API。

在这篇文章里面,我们就要展示如何通过’Avconv’程序在Debian/Ubuntu/Linux Mint发行版上录制Linux桌面视频音频。

Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频
Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频

第一步:下载 Avconv 工具

1. avconv是 “libav-tools” 的一部分, 可以通过官方的基于debian的仓库下载,比如Mint、Ubuntu。输入下面命令即可:

$ sudo apt-get update
$ sudo apt-get install libav-tools
Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频
Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频

下载Avconv工具

注意: 如果从默认仓库下载的话, ‘avconv’ 的版本可能比较老。 因此我们推荐你拉取最新的git官方版本。

$ sudo apt-get install yasm
$ git clone git://git.libav.org/libav.git
$ cd libav
$ ./configure
$ make
$ sudo make install

注意: 你应该运行 ‘./configure –help’ 来列出所有的可选配置选项并且安装相应的解码器和库,你还需要做很多工作来解决依赖问题。

也要注意,如果你是从源代码编译的,就需要使用sudo avconv而不是avconv来运行这个工具。

第二步:开始录制桌面视频

2.一切就绪,现在可以通过运行下面的命令录制你的视频了:

$ avconv -f x11grab -r 25 -s 1920x1080 -i :0.0 -vcodec libx264 -threads 4 $HOME/output.avi

简单解释一下这个命令:

  • avconv -f x11grab 默认从X服务捕捉画面。
  • -r 25 这是你需要的视频帧率,可以自行设置。
  • -s 1920×1080 是你的系统的桌面分辨率,要设置成你当前桌面的分辨率,这一点非常重要。
  • -i :0.0 我们要记录的位置(X 服务输出端口),设置成这样就可以了。
  • -vcodec libx264 我们用来录制视频的编码器。
  • -threads 4 线程数,可以根据情况更改。
  • $HOME/output 输出的目标文件路径。
  • .avi 使用的视频格式,可以换成 “flv”、“mp4″、 “wmv”、 “mov”、 “mkv”等。

3.在运行命令之后,就会在terminal上自动运行一个进程进行记录,按”Ctrl+C”键来终止记录。

Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频
Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频

录制桌面视频

4. 现在,你可以使用VLC或者其他的播放器,或者使用来自Libav包里的播放器”avplay”来播放你录制的视频。

$ avplay $HOME/output.avi

注意: 别忘了替换输出文件的路径为你自己的,录制效果还是很好的。

Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频
Linux:在 Linux 中使用"avconv"工具录制计算机桌面视频和音频

播放录制的文件

这有一段我用 “avconv” 录制的视频 (墙外)。

第三步: 开始录制桌面的音频和视频

5. 如果也想同时录制音频,先运行这个命令,列出所有的音频输入源:

$ arecord -l

结果类似这样:

Check Audio Input

检查音频输入源

在我这里,我只有一个音频输入源,所以数量是1,这就是我使用如下命令来捕捉我的视频以及麦克风的音频的原因。

$ avconv -f alsa -i hw:1 -f x11grab -r 25 -s 1920x1080 -i :0.0 -vcodec libx264 -threads 4 output-file2.avi

我修改了部分地方,下面做个简短的解释:

  • -f alsa 一个从alsa设备捕捉声音的选项。
  • -i hw:1 是一个从 “hw:1” 设备捕捉音频的选项,这个设备是我电脑上仅有的一个音频输入设备。

注意: 如果你想用arecord -l显示的1之外的设备的话,别忘了替换 “1”。

结束录制,再来一次“Ctrl + C” 就可以。

第四步: 开始录制桌面音频

6. 如果只想录制音频的话,使用下面的命令。

$ avconv -f alsa -i hw:1 out.wav

7. 替换成 .mp3 等Libav支持的格式都可以,播放 out.wav就能听到你自己的声音了。

Record Desktop Audio

录制桌面音频

最后

avconv” 工具可以用来做很多其他事情,不仅仅是录制桌面视频,更多的教程和文档请移步到官网。

你对”avconv”的体验如何,你使用过其他工具录制桌面视频么?在评论里面和我们分享吧。


via: http://www.tecmint.com/record-ubuntu-desktop-screen-using-avconv/

作者:Hanny Helal 译者:ggaaooppeenngg 校对:wxy

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

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

Linux:iproute2 对决 net-tools

如今很多系统管理员依然通过组合使用诸如ifconfig、route、arp和netstat等命令行工具(统称为net-tools)来配置网络功能,解决网络故障。net-tools起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持iproute2。

作为网络配置工具的一份子,iproute2的出现旨在从功能上取代net-tools。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。抛开性能而言,iproute2的用户接口比net-tools显得更加直观。比如,各种网络资源(如link、IP地址、路由和隧道等)均使用合适的对象抽象去定义,使得用户可使用一致的语法去管理不同的对象。更重要的是,到目前为止,iproute2仍处在持续开发中。

如果你仍在使用net-tools,而且尤其需要跟上新版Linux内核中的最新最重要的网络特性的话,那么是时候转到iproute2的阵营了。原因就在于使用iproute2可以做很多net-tools无法做到的事情。

对于那些想要转到使用iproute2的用户,有必要了解下面有关net-tools和iproute2的众多对比。

Linux:iproute2 对决 net-tools
Linux:iproute2 对决 net-tools

显示所有已连接的网络接口

下面的命令显示出所有可用网络接口的列表(无论接口是否激活)。

使用net-tools

$ ifconfig -a

使用iproute2

$ ip link show

激活或停用网络接口

使用这些命令来激活或停用某个指定的网络接口。

使用net-tools

$ sudo ifconfig eth1 up
$ sudo ifconfig eth1 down

使用iproute2

$ sudo ip link set down eth1
$ sudo ip link set up eth1

为网络接口分配IPv4地址

使用这些命令配置网络接口的IPv4地址。

使用net-tools

$ sudo ifconfig eth1 10.0.0.1/24

使用iproute2

$ sudo ip addr add 10.0.0.1/24 dev eth1

值得注意的是,可以使用iproute2给同一个接口分配多个IP地址,ifconfig则无法这么做。使用ifconfig的变通方案是使用IP别名

$ sudo ip addr add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1
$ sudo ip addr add 10.0.0.2/24 broadcast 10.0.0.255 dev eth1
$ sudo ip addr add 10.0.0.3/24 broadcast 10.0.0.255 dev eth1

移除网络接口的IPv4地址

就IP地址的移除而言,除了给接口分配全0地址外,net-tools没有提供任何合适的方法来移除网络接口的IPv4地址。相反,iproute2则能很好地完全。

使用net-tools

$ sudo ifconfig eth1 0

使用iproute2

$ sudo ip addr del 10.0.0.1/24 dev eth1

显示网络接口的IPv4地址

按照如下操作可查看某个指定网络接口的IPv4地址。

使用net-tools

$ ifconfig eth1

使用iproute2

$ ip addr show dev eth1

同样,如果接口分配了多个IP地址,iproute2会显示出所有地址,而net-tools只能显示一个IP地址。

为网络接口分配IPv6地址

使用这些命令为网络接口添加IPv6地址。net-tools和iproute2都允许用户为一个接口添加多个IPv6地址。

使用net-tools

$ sudo ifconfig eth1 inet6 add 2002:0db5:0:f102::1/64
$ sudo ifconfig eth1 inet6 add 2003:0db5:0:f102::1/64

使用iproute2

$ sudo ip -6 addr add 2002:0db5:0:f102::1/64 dev eth1
$ sudo ip -6 addr add 2003:0db5:0:f102::1/64 dev eth1

显示网络接口的IPv6地址

按照如下操作可显示某个指定网络接口的IPv6地址。net-tools和iproute2都可以显示出所有已分配的IPv6地址。

使用net-tools

$ ifconfig eth1

使用iproute2

$ ip -6 addr show dev eth1
Linux:iproute2 对决 net-tools
Linux:iproute2 对决 net-tools

移除网络设备的IPv6地址

使用这些命令可移除接口中不必要的IPv6地址。

使用net-tools

$ sudo ifconfig eth1 inet6 del 2002:0db5:0:f102::1/64

使用iproute2

$ sudo ip -6 addr del 2002:0db5:0:f102::1/64 dev eth1

改变网络接口的MAC地址

使用下面的命令可篡改网络接口的MAC地址,请注意在更改MAC地址前,需要停用接口。

使用net-tools

$ sudo ifconfig eth1 hw ether 08:00:27:75:2a:66

使用iproute2

$ sudo ip link set dev eth1 address 08:00:27:75:2a:67

查看IP路由表

net-tools中有两个选择来显示内核的IP路由表:route和netstat。在iproute2中,使用命令ip route。

使用net-tools

$ route -n

$ netstat -rn

使用iproute2

$ ip route show
Linux:iproute2 对决 net-tools
Linux:iproute2 对决 net-tools

添加和修改默认路由

这里的命令用来添加或修改内核IP路由表中的默认路由规则。请注意在net-tools中可通过添加新的默认路由、删除旧的默认路由来实现修改默认路由。在iproute2使用ip route命令来代替。

使用net-tools

$ sudo route add default gw 192.168.1.2 eth0
$ sudo route del default gw 192.168.1.1 eth0

使用iproute2:

$ sudo ip route add default via 192.168.1.2 dev eth0
$ sudo ip route replace default via 192.168.1.2 dev eth0

添加和移除静态路由

使用下面命令添加或移除一个静态路由。

使用net-tools

$ sudo route add -net 172.16.32.0/24 gw 192.168.1.1 dev eth0
$ sudo route del -net 172.16.32.0/24

使用iproute2

$ sudo ip route add 172.16.32.0/24 via 192.168.1.1 dev eth0
$ sudo ip route del 172.16.32.0/24

查看套接字统计信息

这里的命令用来查看套接字统计信息(比如活跃或监听状态的TCP/UDP套接字)。

使用net-tools

$ netstat
$ netstat -l

使用iproute2

$ ss
$ ss -l
Linux:iproute2 对决 net-tools
Linux:iproute2 对决 net-tools

查看ARP表

使用这些命令显示内核的ARP表。

使用net-tools:

$ arp -an

使用iproute2:

$ ip neigh
Linux:iproute2 对决 net-tools
Linux:iproute2 对决 net-tools

添加或删除静态ARP项

按照如下操作在本地ARP表中添加或删除一个静态ARP项

使用net-tools

$ sudo arp -s 192.168.1.100 00:0c:29:c0:5a:ef
$ sudo arp -d 192.168.1.100

使用iproute2

$ sudo ip neigh add 192.168.1.100 lladdr 00:0c:29:c0:5a:ef dev eth0
$ sudo ip neigh del 192.168.1.100 dev eth0

添加、删除或查看多播地址

使用下面的命令配置或查看网络接口上的多播地址。

使用net-tools:

$ sudo ipmaddr add 33:44:00:00:00:01 dev eth0
$ sudo ipmaddr del 33:44:00:00:00:01 dev eth0
$ ipmaddr show dev eth0
$ netstat -g

使用iproute2

$ sudo ip maddr add 33:44:00:00:00:01 dev eth0
$ sudo ip maddr del 33:44:00:00:00:01 dev eth0
$ ip maddr list dev eth0

via: http://xmodulo.com/2014/09/linux-tcpip-networking-net-tools-iproute2.html

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

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

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

Linux:Linux有问必答:如何检查Linux上的glibc版本

问题:我需要找出我的Linux系统上的GNU C库(glibc)的版本,我怎样才能检查Linux上的glibc版本呢?

GNU C库(glibc)是标准C库的GNU实现。glibc是GNU工具链的关键组件,用于和二进制工具和编译器一起使用,为目标架构生成用户空间应用程序。

当从源码进行构建时,一些Linux程序可能需要链接到某个特定版本的glibc。在这种情况下,你可能想要检查已安装的glibc信息以查看是否满足依赖关系。

这里介绍几种简单的方法,方便你检查Linux上的glibc版本。

Linux:Linux有问必答:如何检查Linux上的glibc版本
Linux:Linux有问必答:如何检查Linux上的glibc版本

方法一

下面给出了命令行下检查GNU C库的简单命令。

$ ldd --version

在本例中,glibc版本是2.19

方法二

另一个方法是在命令行“输入”glibc 库的名称(如,libc.so.6),就像命令一样执行。

输出结果会显示更多关于glibc库的详细信息,包括glibc的版本以及使用的GNU编译器,也提供了glibc扩展的信息。glibc变量的位置取决于Linux版本和处理器架构。

在基于Debian的64位系统上:

$ /lib/x86_64-linux-gnu/libc.so.6

在基于Debian的32位系统上:

$ /lib/i386-linux-gnu/libc.so.6

在基于Red Hat的64位系统上:

$ /lib64/libc.so.6

在基于Red Hat的32位系统上:

$ /lib/libc.so.6

下图中是输入glibc库后的输出结果样例。

Linux:Linux有问必答:如何检查Linux上的glibc版本
Linux:Linux有问必答:如何检查Linux上的glibc版本

via: http://ask.xmodulo.com/check-glibc-version-linux.html

译者:GOLinux 校对:wxy

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

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

Linux:从JAVA开发者的视角解释JAVASCRIPT

我们无法在一篇博文里解释JavaScript的所有细节。如果你正或多或少地涉及了web应用程序开发,那么,我们的Java工具和技术范围报告揭示了,大多数(71%)Java开发者被归到了这一类,只是你对JavaScript遇到了阻碍。

毫无疑问,你已经知道了Java和JavaScript,不管它们有着多么类似的命名,彼此没有共享太多共通之处。Java的静态类型、符合直接规律的简单语法和冗长,与JavaScript的动态、缺乏一致性原则和怪异,有着巨大的不同。

Linux:从JAVA开发者的视角解释JAVASCRIPT
Linux:从JAVA开发者的视角解释JAVASCRIPT

然而,JavaScript是web的编程语言,最近由于Node.js和JVM自己的Nashorn JavaScript引擎的发展,在服务器端获得了相当的注意。

本文,我不想只是漫谈JavaScript的好与不好,或重复任何人都能免费找到的、不计其数的JavaScript教程。我想列出一些有助于理解JavaScript做为一种语言的技术点,并从接近horse的角度来理解。

我们将在本文包含下列语言级别的技术点:

  • JavaScript的通用性
  • JavaScript的函数编程问题
  • 不同于Java的继承

另外,你会找到一些工具方面的推荐,没有这些工具,你是不想着手JavaScript项目的,包含了构建系统的代码质量分析和测试框架方面的工具。

优点

编写一次,差不多处处运行!

毋庸置疑JavaScript是web编程语言,是很多其它语言的编译目标,也是用来证明有时候人们只是想拥有更多自由时间的终极方式。尽管如此,这不是一件坏事。每一台能够浏览现代网站的电脑都装备了具有性能和可用的JavaScript引擎。最重要的是,JavaScript代码可以在后端运行。

内置到我们喜爱的JVM的、轻量级高性能JavaScript运行时Nashorn,完全能够解释JavaScript脚本,还能够解释项目中带有Java代码的JavaScript脚本。

鉴于每台电脑运行时都可获得的自由,JavaScript成为Java体验的完美延续。

函数式编程:一等公民是函数,而不是递归

JavaScript中的函数是第一类公民,它们是值,可被存储在变量里、传递给其它函数、在适当的时候再执行。

这打开了函数式编程世界的大门,这是结构化JavaScript编程的完美方式。

注意,JavaScript里的对象是任何东西的映射,对象的每个特性(attribute)都在同一个映射里:函数、属性(property)、构造器;易变性带来了更大的隐患,而对于Java,你至少能够确保方法和字段结构在某种程度上是稳定的。

反过来,这使得函数式编程更加有利:涉及到小的、可理解函数和不变的数据结构是在JavaScript里运行的方式。

这不是没有依据的,下面是在JavaScript里定义一个reduce函数的例子,来自于《Eloquent JavaScript》一书。

function forEach(array, action) {
  for (var i = 0; i < array.length; i++) {
    action(array[i]); //apply action to every element of the arra.
  }
}
function reduce(combine, base, array) {
  forEach(array, function (element) {
    base = combine(base, element); // and here we apply function passed as ‘combine’ parameter to ‘base’ and ‘element’
  });
  return base;
}
function add(a, b) { // btw, this is how you define a function in JavaScript
  return a + b;
}
function sum(numbers) {
  return reduce(add, 0, numbers);
}

注意:我们没有在这里使用reduce的递归版本。JavaScript没有以尾调用【注1】为特色,这意味着每个函数的递归版本都将用到栈的深度,和Java一样,如果你递归太深,程序就崩溃。

继承:就像真实的世界

JavaScript的继承是基于原型的。即,你没有扩展了其它类型的类型,而实际上,你拥有的实例从其它实例继承了功能。

想象一下,对象A就像一个映射,我们刚才稍微提到了一些、但是用了不同的视角,然后另一个类似映射的对象B从A继承了一切。

这说明B可以访问A所有部分:A的方法、字段等等。

在实践中,我从来没有看到有人实际使用简单的基于原型的继承。通常当某人需要继承时,他只是构造类,因此你可以用到所有广泛的技能,和基于类的继承的工作模式。——Rene Saarsoo,XRebel前端工程师

我不太确定Java开发者应该从中吸取什么,但是要当心继承方式的不同,对于父级对象要格外留意、而不要意外地改变整个程序的行为。

任何时候要避免的

列出不可靠的JavaScript设计上的决定比想象中要容易。在JavaScript程序中要避免的最明显的地方就是全局变量的声明

注意,在JavaScript里,无论什么时候,不使用var关键词定义变量,那么定义的变量被推到了它们被定义的作用域顶端。这意味着,每个用这种方式定义的变量将跑到全局范围顶部,这会引发冲突以及你和同事不可预期的头痛。

可以开启strict模式。只需在脚本文件顶部写上“use strict”,那么不经意编写的全局变量声明将显示错误。

JavaScript与Java另一个重要的不同点在于,前者是动态类型语言,其真谛是所有东西都可以是任何类型。这很明显了,实在不能再强调了:不要针对不同类型的值,去复用相同的变量

跟踪刚开始是个string类型的变量,但是现在它成了浮点数、或者函数了,相信我!

还有,我不想太深入类型和布尔值的讨论,但是要警惕JavaScript引擎扔给你的隐式类型转换。

搞定工作的小提示

正如我上面提到的,在编程上要更加注意这种语言的语法和怪癖,而不仅仅是知道。项目很少由于语言的不足而失败,更多的失败是与总体项目框架不足有关。下面是有助于你交付项目的一些工具。

静态代码分析

大部分项目是不同的,其复杂度和需求导致了大量的细节,你该如何着手代码库呢。尽管如此,在所有地方都有一致性的目标,那就是代码质量

是的,代码质量,对于任何开发者来说,最重要的工作就是交付。但是不要在质量上妥协,不要对你提交的代码感到不自信就不情愿与同事分享。

幸运的是,JavaScript有一套得体的解决方案——JSHint。JSHint是为JavaScript量身打造的静态分析工具,与应用于Java代码的FindBug类似。JSHint可以在你的代码库运行,并高亮出可疑的或有问题的地方,即使你不会马上产生bug,但这些地方将来变得难以维护。在项目中支持它相当简单。帮自己一个忙——如果你在写JavaScript代码,就用JSHint让它更安全、少一些尴尬。

REPL

REPL代表“读取-求值-输出”循环(Read-Eval-Print Loop)【注2】,是很多动态语言的强大工具。如果你看过Scala或Groovy,你一定能够理解这个概念。

激活JavaScript REPL的一种途径是打开浏览器的控制台,它产生了对JavaScript代码求值的界面。

浏览器控制台调试JavaScript

另一个比较方便的工具是jjs,它捆绑在JDK1.8。

jjs的演示

它是命令行工具,允许你访问JDK中的Nashorn JavaScript 引擎,完全有能力执行那些甚至最为严格的JavaScript脚本。

测试

对于任何一个项目,你都想运行一些测试。测试对于动态类型的语言尤为重要,最好选择一种测试框架。我推荐Jasmine,它是用于测试JavaScript的行为驱动开发框架。

Linux:从JAVA开发者的视角解释JAVASCRIPT
Linux:从JAVA开发者的视角解释JAVASCRIPT

在Jasmine,你用describe描述测试套件,它阻止了你想测试的代码访问。在测试中的代码完成后,你expect一些结果。

很明显这里不是要给出教程,但是我想让你一瞥JavaScript代码看起来是多么地优雅。Jasmine是JavaScript项目最好的实践之一,我们私下在产品开发中应用到了ZeroTurnaround项目,尤其是对于富含JavaScript的不间断运行的交互分析器XRebel

构建工具

最后,你的项目将需要的、比较重要的是构建工具。如果你在Java项目中使用JavaScript,请确保你可以避开Java构建工具,这就差不多足够了。但是,对于独立的JavaScript项目,没有必要引入庞然大物—Maven【注3】。

可以考虑的JavaScript项目用到的构建工具是GulpJS【注4】。它是基于插件的构建系统,你可以为其指定任务。任务可以是“拷贝src目录下的.js文件到dest”、或“压缩我的JavaScript代码用于生产环境”。让人受到震动的是,GulpJS把任务相关的文件流加入过滤器,因此你可以把上面的两个任务加入一次有效的清扫中。

还有大量的可用插件,借助适当的构建系统,你将发现项目中的协作会轻松很多。

结论

我们只是看到了JavaScript的冰山一角,并尽量介绍一些Java开发者在解决JavaScript时应该知道的概念和工具。自然地,这里没有提供要学习的完整的技术清单,但是如果你正准备义无反顾地深入JavaScript项目,这会帮助你起步,拥抱JavaScript的怪癖将有助于你不会频繁地沮丧。

你了解让JS开发者走向快乐的秘密或最佳实践吗?毫无疑问应该去分享!在下面评论或在Twitter:@shelajev上与我交谈。我乐于听到你的想法!

  • 注1:在计算机科学里,尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下称该调用位置为尾位置。若这个函数在尾位置调用本身(或是一个尾调用本身的其他函数等等),则称这种情况为尾递归,是递归的一种特殊情形。尾调用不一定是递归调用,但是尾递归特别有用,也比较容易实现。http://zh.wikipedia.org/wiki/尾调用
  • 注2:REPL是一个简单的,交互式的编程环境。这个词常常用于指代一个Lisp的交互式开发环境,但也能指代命令行的模式和例如 APL, BASIC, Clojure, F#, Haskell, J, Julia, Perl, PHP, Prolog, Python, R, Ruby, Scala, Smalltalk, Standard ML, Tcl, Javascript 这样的编程语言所拥有的类似的编程环境。这也被称做交互式顶层构件(interactive toplevel)。http://zh.wikipedia.org/wiki/%E8%AF%BB%E5%8F%96%EF%B9%A3%E6%B1%82%E5%80%BC%EF%B9%A3%E8%BE%93%E5%87%BA%E5%BE%AA%E7%8E%AF
  • 注3:Maven 除了以程序构建能力为特色之外,还提供 Ant 所缺少的高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目,而使用 Ant 则需要十几行。事实上,由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目现在使用 Maven,而且公司项目采用 Maven 的比例在持续增长。http://www.oschina.net/p/maven
  • 注4:从头编写HTMLCSSJavascript是上个世纪的事情了,如今的JavaScript都是通过CoffeeScript这样的支持句法缩写的编辑器写成的。如果你希望写完JavaScript能够一个工具完成代码清理优化工作,Gulp 就是你的不二之选,GulpJS类似Ant或Maven之于Java。http://www.oschina.net/p/gulp

来源:http://www.labazhou.net/2014/11/javascript-explain-it-like-im-a-java-developer/

Linux:如何在 CentOS 7 上安装 Docker

Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单。容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止。Docker 帮助系统管理员和程序员在容器中开发应用程序,并且可以扩展到成千上万的节点。

容器和 VM(虚拟机)的主要区别是,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。容器使用宿主操作系统的内核,而虚拟机使用独立的内核。

Docker 的局限性之一是,它只能用在 64 位的操作系统上。

Linux:如何在 CentOS 7 上安装 Docker
Linux:如何在 CentOS 7 上安装 Docker

在这篇文章中我们将讨论如何在 CentOS 7.x 中安装 docker。

CentOS 7 中 Docker 的安装

Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:

[root@localhost ~]# yum install docker

启动 Docker 服务

安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:

[root@localhost ~]# service docker start
[root@localhost ~]# chkconfig docker on

(LCTT 译注:此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:

[root@localhost ~]# systemctl  start docker.service
[root@localhost ~]# systemctl  enable docker.service

下载官方的 CentOS 镜像到本地 (LCTT 译注:由于 Docker 被 :-< ,所以请使用 http://docker.cn  的镜像,感谢 @马全一 的镜像。 )

[root@localhost ~]# docker pull centos
Pulling repository centos
192178b11d36: Download complete
70441cac1ed5: Download complete
ae0c2d0bdc10: Download complete
511136ea3c5a: Download complete
5b12ef8fd570: Download complete

确认 CentOS 镜像已经被获取:

[root@localhost ~]# docker images centos
REPOSITORY    TAG          IMAGE ID      CREATED       VIRTUAL SIZE
centos        centos5      192178b11d36  2 weeks ago   466.9 MB
centos        centos6      70441cac1ed5  2 weeks ago   215.8 MB
centos        centos7      ae0c2d0bdc10  2 weeks ago   224 MB
centos        latest       ae0c2d0bdc10  2 weeks ago   224 MB

运行一个 Docker 容器:

[root@localhost ~]# docker run -i -t centos /bin/bash
[root@dbf66395436d /]#

我们可以看到,CentOS 容器已经被启动,并且我们得到了 bash 提示符。在 docker 命令中我们使用了 “-i 捕获标准输入输出”和 “-t 分配一个终端或控制台”选项。若要断开与容器的连接,输入 exit。

[root@cd05639b3f5c /]# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
[root@cd05639b3f5c /]# exit
exit
[root@localhost ~]#

我们还可以搜索基于 Fedora 和 Ubuntu 操作系统的容器。

[root@localhost ~]# docker search ubuntu
[root@localhost ~]# docker search fedora

显示当前正在运行容器的列表


via: http://www.linuxtechi.com/install-docker-on-centos-7/

作者:Pradeep Kumar 译者:felixonmars 校对:wxy

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

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

Linux:系统之锹sysdig:Linux服务器监控和排障利器

当你需要追踪某个进程产生和接收的系统调用时,首先浮现在你脑海中的是什么?你可能会想到strace,那么你是对的。你会使用什么样的命令行工具来监控原始网络通信呢?如果你想到了tcpdump,你又作出了一个极佳的选择。而如果你碰到必须追踪打开的文件(在Unix意义上:一切皆文件)的需求,可能你会使用lsof。

strace、tcpdump以及lsof,确实是些伟大的工具,它们应该成为每个系统管理员工具集之中的一部分,而这也正是你为什么应该爱上sysdig的原因。它是一个强大的开源工具,用于系统级别的勘察和排障,它的创建者在介绍它时称之为“strace+tcpdump+lsof+上面点缀着lua樱桃的绝妙酱汁”。抛开幽默不说,sysdig的最棒特性之一在于,它不仅能分析Linux系统的“现场”状态,也能将该状态保存为转储文件以供离线检查。更重要的是,你可以自定义sysdig的行为,或者甚至通过内建的(你也可以自己编写)名为凿子(chisel)的小脚本增强其功能。单独的凿子可以以脚本指定的各种风格分析sysdig捕获的事件流。

Linux:系统之锹sysdig:Linux服务器监控和排障利器
Linux:系统之锹sysdig:Linux服务器监控和排障利器

在本教程中,我们将探索sysdig的安装及其基本用法,在Linux上实施系统监控和排障。

安装Sysdig

对于本教程,由于为了简便、缩短安装流程以及版本的不可知,我们将选择使用官方网站提供的自动化安装过程。在自动化过程中,安装脚本会自动检测操作系统并安装必需的依赖包。

以root身份运行以下命令来从官方apt/yum仓库安装sysdig:

# curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash

安装完成后,我们可以通过以下方法调用sysdig来感受一下它:

# sysdig

我们的屏幕将马上被系统上发生的所有事件填满,对于这些信息,不便于我们做更多操作。要进一步处理,我们可以运行:

# sysdig -cl | less

来查看可用的凿子列表。

Linux:系统之锹sysdig:Linux服务器监控和排障利器
Linux:系统之锹sysdig:Linux服务器监控和排障利器

默认有以下类目可用,各个类目中分布有多个内建的凿子。

  • CPU Usage:CPU使用量
  • Errors:错误
  • I/O
  • Logs:日志
  • Misc:混杂
  • Net:网络
  • Performance:性能
  • Security:安全
  • System State:系统状态

要显示指定凿子上的信息(包括详细的命令行用法),运行以下命令:

# sysdig -cl [凿子名称]

例如,我们可以检查“网络”类目下关于spy_port凿子的信息:

# sysdig -i spy_port
Linux:系统之锹sysdig:Linux服务器监控和排障利器
Linux:系统之锹sysdig:Linux服务器监控和排障利器

凿子可以通过过滤器(可同时应用于实时数据和记录文件)组合,以获取更多有用的输出。

过滤器遵从“类.字段”结构。例如:

  • fd.cip:客户端IP地址。
  • evt.dir:事件方向,可以是‘>’用于进入事件,或‘<’用于退出事件。

完整的过滤器列表可以通过以下命令显示:

# sysdig -l

在本教程剩余部分,我将演示几个sysdig的使用案例。

Sysdig实例: 服务器性能排障

假定你的服务器发生了性能问题(如,没有回应,或者重大的回应延迟)。你可以使用瓶颈凿子来显示当前10个最慢系统调用的列表。

使用以下命令在存活服务器上进行实时检查。“-c”标识,后跟凿子名称告诉sysdig运行指定的凿子。

# sysdig -c bottlenecks

或者,你可以离线对服务器实施性能分析。在此种情况下,你可以保存完整的sysdig记录到文件,然后像下面这样针对记录运行瓶颈凿子。

首先,保存sysdige记录(使用Ctrl+c来停止收集):

# sysdig -w trace.scap

收集完记录后,你可以运行以下命令来检查捕获间隔中最慢的系统调用:

# sysdig -r trace.scap -c bottlenecks

你需要关注栏#2,#3和#4,这些分别表示执行时间、进程名和PID。

Sysdig实例: 监控交互用户活动

假定你作为系统管理员想要监控系统中交互的用户活动(如,用户在命令行输入了什么命令,以及用户去了什么目录),这时spy_user凿子就派上用场了。

让我们首先通过一些额外选项来收集一个sysdig记录。

# sysdig -s 4096 -z -w /mnt/sysdig/$(hostname).scap.gz
  • “-s 4096”告诉sysdig每个事件捕获4096字节。
  • “-z” (与“-w”一起使用)为记录文件启用压缩。
  • “-w ”保存sysdig记录到指定的文件。

在上面的例子中,我们自定义了基于每个主机的压缩的记录文件的名称。记住,你可以在任何时候按下Ctrl+c来打断sysdig的执行。

在我们收集到了合理数量的数据后,我们可以通过运行以下命令来查看每个用户的交互活动:

# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users

上面输出的第一栏表示与指定用户的活动相关进程的PID。

如果你想要定位一个指定的用户,以及只监控该用户的活动又怎么样呢?你可以通过用户名对spy_users凿子的结果进行过滤:

# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users "user.name=xmodulo"

Sysdig实例: 监控文件I/O

我们可以使用“-p”标识来自定义sysdig记录的输出格式,并指定双引号括起来的想要的字段(如用户名、进程名,以及文件或套接口名称)。在本例中,我们将创建一个记录文件,该文件将只包含在家目录中的写入事件(我们今后可以使用“sysdig -r writetrace.scap.gz”来检测该文件)。

# sysdig -p "%user.name %proc.name %fd.name" "evt.type=write and fd.name contains /home/" -z -w writetrace.scap.gz
Linux:系统之锹sysdig:Linux服务器监控和排障利器
Linux:系统之锹sysdig:Linux服务器监控和排障利器

Sysdig实例: 监控网络I/O

作为服务器排障的一部分,你可能想要监听网络通信,此工作通常由tcpdump做。对于sysdig,可以很容易进行通信嗅探,其风格更为对用户友好。

例如,你可以检查由特定IP地址,特定进程(如apache2)提供的数据(ASCII编码格式):

# sysdig -s 4096 -A -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2

如果你想要监控原生数据传输(二进制格式),请把“-A”替换为“-X”:

# sysdig -s 4096 -X -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2

要获取更多信息、实例以及案例分析,你可以查阅项目网站。相信我,会有着无限可能,但请不要仅仅局限于我所写的这些。安装sysdig,请从今天开始深入挖掘吧!


via: http://xmodulo.com/monitor-troubleshoot-linux-server-sysdig.html

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

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

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

Linux:20个关于Postfix的面试题

Linux:20个关于Postfix的面试题
Linux:20个关于Postfix的面试题

问题1:什么是 Postfix,它的默认端口是多少?

答:Postfix 是一个开源的 MTA(邮件传送代理,英文名:Mail Transfer Agent),用于转发 email。相信很多人知道 Sendmail,而 Postfix 是它的替代品。默认端口是25。

问题2:Postfix 和 Sendmail 有什么区别?

答:Postfix 使用模块化设计,由多个独立的可执行程序组成;而 Sendmail 被设计成有一个强大的后台进程提供所有服务。

问题3:什么是 MTA,它在邮件系统中扮演什么角色?

答:MTA 是 Mail Transfer Agent (邮件传输代理)的缩写。MTA 负责接收和发送邮件、确定发送路径和地址重写(LCTT译注:address rewriting,就是完善发送地址,比如将“username”这个地址重写为“username@example.com”)。本地转发就是将邮件发送给 MDA。Qmail、Postix、Sendmail 都是 MTA。

问题4:什么是 MDA?

答:MDA 是 Mail Delivery Agent (邮件投递代理)的缩写。MDA 这个程序用于从 MTA 获取邮件并投递至本地收件人的邮箱。MDA 通常可以过滤邮件或为邮件分类。一个 MDA 也能决定一封邮件是否需要转发到另一个邮箱地址。Procmail 就是一个 MDA。

问题5:什么是 MUA?

答:MUA 是 Mail User Agent (邮件用户代理)的缩写。MUA 是一个邮件客户端软件,可以用来写邮件、发送邮件、接收邮件。发送邮件时使用的是 MTA;接收邮件时可以从邮件存储区直接收取,也可以通过 POP/IMAP 服务器间接收取。Outlook、Thunkerbird、Evolution 都是 MUA。

问题6:邮件服务器里 postmaster 的作用是什么?

答:邮件管理者一般就是 postmaster。一个 postmaster 的责任就是保证邮件系统正常工作、更新系统配置、添加/删除邮箱帐号,以及其他工作。每个域中必须存在一个 postmaster 的别名(LCTT译注:postmaster 别名用于接受一些其它服务器/用户对该邮件系统的沟通邮件,如关于垃圾邮件拒收的投诉等,通常都会直接被邮件服务器的管理员所接受。一些系统错误和提示的邮件,也往往以postmaster 作为发件人),用于将邮件发往正确的用户。

问题7:Postfix 都有些什么重要的进程?

答:以下是 Postfix 邮件系统里最重要的后台进程列表:

  • master:这条进程是 Postfix 邮件系统的大脑,它产生所有其他进程。
  • smtpd:作为服务器端程序处理所有外部连进来的请求。
  • smtp:作为客户端程序处理所有对外发起连接的请求。
  • qmgr:它是 Postfix 邮件系统的心脏,处理和控制邮件队列里面的所有消息。
  • local:这是 Postfix 自有的本地投递代理MDA,就是它负责把邮件保存到邮箱里。

问题8:Postfix 服务器的配置文件是什么?

答:有两个主要配置文件:

  • /etc/postfix/main.cf:这个文件保存全局配置信息,所有进程都会用到,除非这些配置在 master.cf 文件中被重新设置了。
  • /etc/postfix/master.cf:这个文件保存了额外的进程运行时环境参数,在 main.cf 文件中定义的配置可能会被本文件的配置覆盖掉。

问题9:如何将 Postfix 重启以及设为开机启动?

答:使用这个命令重启:service postfix restart;使用这个命令设为开机启动:chkconfig postfix on

问题10:怎么查看 Postfix 的邮件队列?

答:Postfix 维护两个队列:未决邮件队列(pending mails queue)和等待邮件队列(deferred mail queue)。等待队列包含了暂时发送失败、需要重新发送的邮件,Postfix 会定期重发(默认5分钟,可自定义设置)。(LCTT译注:其实 Postfix 维护5个队列:输入队列,邮件进入 Postfix 系统的第一站;活动队列,qmgr 将输入队列的邮件移到活动队列;等待队列,保存暂时不能发送出去的邮件;故障队列,保存受损或无法解读的邮件;保留队列,将邮件无限期留在 Postfix 队列系统中。)

列出邮件队列里面所有邮件:

# postqueue -p

保存邮件队列名单:

# postqueue -p > /mnt/queue-backup.txt

让 Postfix 马上处理队列:

# postqueue -f

问题11:如何删除邮件队列里面的邮件?

答:以下命令删除所有邮件:

# postsuper -d ALL

以下命令只删除等待队列中的邮件:

# postsuper -d ALL deferred

问题12:如何通过命令来检查 Postfix 配置信息?

答:使用postconf -n命令可以查看,它会过滤掉配置文件里面被注释掉的配置信息。

问题13:实时查看邮件日志要用什么命令?

答:

tail -f /var/log/maillog 或 tailf /var/log/maillog

问题14:如何通过命令行发送测试邮件?

答:参考下面的命令:

# echo "Test mail from postfix" | mail -s "Plz ignore" info@something.com

问题15:什么是“开放邮件转发(Open Relay)”?

答:开放邮件转发是 SMTP 服务器的一项设定,允许因特网上任意的其他用户能通过该服务器转发邮件,而不是直接发送到某个帐号的服务器或只允许授权用户通过它来发送邮件。过去,这项功能在许多邮件服务器中都是默认开启的,但是现在已经不再流行了,因为邮件转发会导致大量垃圾邮件和病毒邮件在网络上肆虐。

问题16:什么是 Postfix 上的邮件转发主机?

答:转发主机是 SMTP 的地址,如果在配置文件中有配置,那么所有输入邮件都将被 SMTP 服务器转发。

问题17:什么是灰名单?

答:灰名单(LCTT译注:介于白名单和黑名单之间)是一种用于拦截垃圾邮件的技术。一个 MTA 使用灰名单时就会“暂时拒绝”未被识别的发送者发来的所有邮件。如果邮件是正当合理的,发起者会在一段时间后重新发送,然后这份邮件就能被接收。(LCTT译注:灰名单基于这样一个事实,就是大多数的垃圾邮件服务器和僵尸网络的邮件只发送一次,而会忽略要求它们在一定的时间间隔后再次发送的请求。)

问题18:邮件系统中 SPF 记录有什么重要作用?

答:SPF 是 Sender Policy Framework 的缩写,用于帮助邮件域的拥有者确认发送方是否来自他们的域,目的是其他邮件系统能够保证发送方在发送邮件时来自经过授权的来源 —— 这种方法可以减小遇到邮件地址欺骗、网络钓鱼和垃圾邮件的风险。

问题19:邮件系统中 DKIM 有什么用处?

答:域名密匙是一套电子邮件身份认证系统,用于验证邮件发送方的 DNS 域和邮件的完整性。域名密匙规范采用互联网电子邮件认证技术,建立了一套加强版协议:域名密匙识别邮件(就是 DKIM)。

问题20:邮件系统中 ASSP 的规则是什么?

答:ASSP(Anti-Spam SMTP Proxy,反垃圾代理) 是一个网关服务器,安装在你的 MTA 前面,通过自建白名单、自动学习贝叶斯算法、灰名单、DNS 黑名单(DNSBL)、DNS 白名单(DNSWL)、URI黑名单(URIBL)、SPF、SRS、Backscatter、病毒扫描功能、附件阻拦功能、基于发送方等多种方法来反垃圾邮件。


via: http://www.linuxtechi.com/postfix-interview-questions-answers/

作者:Pradeep Kumar 译者:bazz2 校对:wxy

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

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

Linux:Linux系统管理员的命令行工具箱目录

系统管理员(sysadmins)负责日常维护生产系统和服务。其中一个关键任务就是保证功能性服务能24小时工作。为了这个,他们得很小心地计划备份方式,灾难管理策略,定时维护,安全审查,等等。和任意其他管理一样,系统管理员也有他们的必备工具。在正确的时间正确的情况下使用合适的工具,可以帮助维护操作系统的健壮,达到最小的服务中断时间和最大的运行时间。

Linux:Linux系统管理员的命令行工具箱目录
Linux:Linux系统管理员的命令行工具箱目录

这篇文章会介绍一些系统管理员日常活动中最常用和有效的命令行工具。如果你想推荐其他没在这里列出来的好用的工具,别忘了在评论区里分享一下。

网络工具

  1. ping:通过ICMP回应/回复报文来检查远端主机的端到端连接性(RTT延时,抖动,丢包)。用来检查系统状态和可连接性很不错。

  2. hping:网络扫描和检测工具,可以产生ICMP/TCP/UDP ping数据包。常常用于高级端口扫描,防火墙测试,手动MTU路径发现和碎片测试。

  3. traceroute:通过TTL限定的ICMP/UDP/TCP侦测包来发现从本地主机到远端目标主机之间的第三层转发路径。用来调试网络连接性和路由问题。

  4. mtr:traceroute的一个变种,能根据运行时统计数据整理出每一跳的包丢失/抖动。用来评估路由路径延时很不错。

  5. netcat/socat:TCP/IP网络里的瑞士军刀,可以读/写 TCP/UDP 协议字节流。用来调试防火墙策略和服务可用性很不错。

  6. dig:DNS调试工具,可以生成正向查询,反向查询,搜索域名服务器,检查CNAME,MX和其他DNS记录。可以在侦错的时候查询特定的DNS服务器。

  7. nslookup:另外一个DNS检查/调试工具。支持所有DNS查询和记录。可以查询特定DNS服务器。

  8. dnsyo:一个DNS测试工具,通过对全世界1500个不同网络中的大量开放解析器执行DNS查询来测试DNS传输。

  9. lsof:显示进程打开的文件信息(例如,普通文件,管道或套接字)。用来监视网络连接很不错。

  10. iftop:一个基于ncurses的命令行界面应用,可以实时监视各个网络物理接口上的网络连接和带宽占用。用来记录霸占带宽的应用、用户、目的地和端口等很不错。

  11. netstat:一个网络统计工具,可以显示状态以及统计信息,当前网络连接(TCP/UDP端口,IP地址)、路由表、TX/RX traffic以及网络协议。用来做网络相关诊断和性能调试很不错。

  12. tcpdump:一个常用的基于libpcap抓包库的包侦测工具。可以按伯克利包过滤器格式定义抓包条件。

  13. tshark:另一个命令行抓包工具,和它的GUI版本Wireshark完全兼容。支持1000种协议而且这个列表还在增加。用来调试、分析和保存实时网络封包信息很不错。

  14. ip:一个多功能的命令行网络工具,是iproute2包的一部分。可以检查和修改路由表、网络设备状态以及IP隧道设置。用来查看路由表、增加/删除静态路由、配置网络接口、以及调试路由问题很有用。

  15. ifup/ifdown:用来激活和关闭特定的网络接口。经常用于重启整个网络服务。

  16. autossh:一个能建立SSH连接并在断线后自动重新连接的程序。用来创建长时间保持的穿越严格企业网络的SSH隧道很有用。

  17. iperf:一个网络测试工具,通过在发送自定义TCP/UDP数据流来衡量主机间双向最大吞吐量。

  18. elinks/lynx:为基于命令行的服务器环境下使用的基于文字的网页浏览器。

安全工具

  1. iptables:一个用户空间下的命令行工具,用于配置Linux内核防火墙。可以创建和修改Linux内核空间的网络包接收、转发和发送规则。

  2. nmap:一个常用的为了安全审查目的的端口扫描和网络发现工具。用来在本地网络中找出哪些主机开机并运行起来了以及某台特定主机打开了哪些端口很有用。

  3. TCP Wrappers:一个主机端的网络访问控制列表工具,可以过滤进入/出去的网络请求/回复。经常配合iptables一起使用,作为额外一层安全保护。

  4. getfacl/setfacl:查看和定制文件和目录的访问控制列表,作为传统文件权限的扩展。

  5. cryptsetup:用于创建和管理LUKS加密磁盘分区。

  6. lynis:一个命令行的漏洞扫描工具。可以扫描整个Linux系统,并汇报潜在的漏洞以及相关可能解决方案。

  7. maldet:一个恶意软件扫描命令行工具,可以检测和隔离潜在的感染文件。可以在后台运行长期监视。

  8. rkhunter/chkrootkit:一个命令行工具,可以扫描本地系统里的潜在木马、隐藏后门和可疑利用,并禁用它们。

存储工具

  1. fdisk:一个磁盘分区编辑工具。用于查看、创建和修改本地磁盘或可移动磁盘的分区。

  2. sfdisk:fdisk的一个变种,能用一种非交互的方式访问或更新磁盘分区表。用来自动化备份和恢复过程中的磁盘分区很有用。

  3. parted:另一个磁盘分区编辑器,支持超过2TB的磁盘的GPT(GUID分区表)格式。gparted是parted的一个前端GTK+图形界面。

  4. df:用来查看不同分区或文件路径的已用/可用存储空间和挂载点。还有一个更易用的变种dfc。

  5. du:用来查看不同文件和目录的当前磁盘占用情况(例如,du -sh *)。

  6. mkfs:一个磁盘格式化命令,用来在独立磁盘分区上建立文件系统。有多个文件系统相关的版本:ext2、ext3、ext4、bfs、ntfs、vfat/fat。

  7. fsck:一个命令行工具,用来检查文件系统错误并尝试可能的修复。通常在启动时自动运行,但是在卸载一个分区后也可以根据需要手动运行。

  8. mount:用来映射一个物理磁盘分区、网络共享或远程存储到一个本地挂载点。任何对挂载点里的读/写操作都是对应实际存储的实际数据读/写。

  9. mdadm:一个命令行工具,用来管理物理块设备上的软件RAID设备。可以创建、构造、增长或监视RAID阵列。

  10. lvm:一套命令行工具集,用来管理卷分组和物理/逻辑卷,可以用最小的停机时间在多个物理磁盘上创建、调整大小、拆分和合并卷。

日志访问工具

  1. tail:用来查看一个(增长中的)日志文件的尾部。有几个变种,包括multitail(多窗口查看)和ztail(支持inotify和正则表达式过滤以及颜色)。

  2. logrotate:一个命令行工具,可以在根据设定的时间段拆分、压缩并通过邮件发送旧的/大的日志文件。用来管理可能产生大量日志文件的繁忙主机很有用。

  3. grep/egrep:可以通过特定的模式或正则表达式过滤日志内容。变种包括用户更友好的ack和速度更快的ag。

  4. awk:一个多功能的文本扫描和处理工具。常用于从文本/日志文件中找出特定的列或内容,并输出给其他工具。

  5. sed:一个文本流编辑工具,可以过滤和改变(例如,删除行/空格、替换/转换单词、增加计数)文本流并通过管道连接到stdout/stderr或者其他工具。

备份工具

  1. rsync:一个快速的单向增量备份和镜像工具(LCTT 译注:rsync 应是双向的)。常用于复制一个数据仓库到线下存储,可以选择通过SSH或stunnel的加密连接。

  2. rdiff-backup:另一个有效利用带宽的增量备份工具。管理两个连续快照之间的差分。

  3. duplicity:一个加密的增量备份工具。使用GnuPG加密备份,并通过SSH上传到远程服务器。

性能监视工具

  1. top:一个命令行的进程查看程序。可以监视系统负载、进程状态、CPU和内存占用。有一个更易用的变种htop。

  2. ps:显示系统所有运行中进程的一个快照。输出可以定制成显示PID、PPID、用户、负载、内存、积累的用户/系统时间、启动时间、以及更多。有一个变种pstree可以用树结构显示进程。

  3. nethogs:一个带宽监视工具,按进程来分组显示活动网络连接,实时汇报每个进程占用的(上传/下载)带宽。

  4. ngxtop:一个网页服务器访问日志解析和监视工具,界面受到了top命令启发。它可以实时汇报整理过的页面请求列表,包括频率、大小、HTTP返回值、IP地址,等等。

  5. vmstat:一个简单的命令行工具,可以显示多个实时系统特征,例如进程数、剩余内存、分页状态、CPU占用、块设备I/O活动、中断/上下文切换统计、等等。

  6. iotop:一个基于ncurses的I/O监视工具,可以实时排序显示所有运行中进程的磁盘I/O活动。

  7. iostat:一个命令行工具,可以汇报当前CPU使用情况,以及设备I/O使用情况,这里的I/O使用情况(例如,块传输速度、字节读/写速度)是按设备或分区来汇报的。

效率工具

  1. screen:用来把一个单一的终端拆分成多个持久的虚拟终端,也支持远程用户访问,类似teamviewer的屏幕分享功能。

  2. tmux:另一个终端复用工具,可以支持多个长期会话,还可以横向/纵向拆分终端。

  3. cheat:一个简单的命令行工具,可以让你查看多个常用Linux命令的备忘录,就在手边非常方便。内建的备忘录也可以完全定制。

  4. apropos:用来在帮助手册里查找描述或关键字很有用。

包管理工具

  1. apt:基于Debian系统的事实上的包管理工具,例如Debian、Ubuntu或Backtrack。一个救生圈。

  2. apt-fast:apt-get的一个支撑应用,可以通过多个并行连接明显提高apt-get的下载速度。

  3. apt-file:用来查看某个特定文件属于哪个.deb包,或者显示一个特定.deb包里的所有文件。已安装和未安装的包都能支持。

  4. dpkg:一个用来手动安装.deb包的命令行工具。强烈建议尽可能的使用apt。

  5. yum:用于基于红帽的系统的自动包管理工具,比如RHEL、CentOS或Fedora。这是另一个救生圈!

  6. rpm:通常我都是使用 rpm 来配合 yum 使用。有很多有用的参数,比如-q、-f、-l可以分别用来查询、指定文件和路径。

硬件工具

  1. lspci:一个命令行工具,可以显示已安装的PCI设备的各种信息,比如型号名称、设备驱动、设备功能、内存地址、PCI总线地址。

  2. lshw:一个命令行工具,可以查询和显示不同分类下的硬件配置的详细信息(例如,处理器、内存、主板、网络、存储)。支持多重输出格式:html、xml、json、text。

  3. inxi:一个综合硬件查看工具,可以提供不同硬件模块的总览,例如CPU,显卡,声卡,网卡,温度/风扇传感器,等等。

如果你希望推荐没有列在这里的好用的工具,不要客气,在评论区里分享一下。


via: http://xmodulo.com/2014/08/useful-cli-tools-linux-system-admins.html

作者:Sarmed Rahman 译者:zpl1025 校对:wxy

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

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

Linux:解决八种Linux硬盘问题的技巧

不能在Linux或者类UNIX系统的硬盘上写入数据?想解决服务器上磁盘损坏的问题吗?想知道你为什么总是在屏幕上看到“磁盘已满”的字眼吗?想学习处理这些问题的办法吗?试试一下这8个解决Linux及UNIX服务器硬盘问题的小贴士吧。

Linux:解决八种Linux硬盘问题的技巧
Linux:解决八种Linux硬盘问题的技巧

#1 – 错误: 设备上无剩余空间

当你的类UNIX系统磁盘写满了时你会在屏幕上看到这样的信息。本例中,我运行fallocate命令然后我的系统就会提示磁盘空间已经耗尽:

$ fallocate -l 1G test4.img
fallocate: test4.img: fallocate failed: No space left on device

第一步是运行df命令来查看一个有分区的文件系统的总磁盘空间和可用空间的信息:

$ df

或者试试可读性比较强的输出格式:

$ df -h

部分输出内容:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda6       117G   54G   57G  49% /
udev            993M  4.0K  993M   1% /dev
tmpfs           201M  264K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1002M     0 1002M   0% /run/shm
/dev/sda1       1.8G  115M  1.6G   7% /boot
/dev/sda7       4.7G  145M  4.4G   4% /tmp
/dev/sda9       9.4G  628M  8.3G   7% /var
/dev/sda8        94G  579M   89G   1% /ftpusers
/dev/sda10      4.0G  4.0G     0 100% /ftpusers/tmp

使用df命令输出可以清楚地发现,在 /dev/sda10 分区下总共4.0Gb的空间被全部写满了。

修复磁盘写满的问题

1.用gzip,bzip2或tar命令压缩未压缩的日志和其它文件

gzip /ftpusers/tmp/*.log
bzip2 /ftpusers/tmp/large.file.name

2.在类UNIX系统中用rm命令删除不想要的文件

rm -rf /ftpusers/tmp/*.bmp

3.用rsync命令移动文件至其它系统或外置硬盘:

rsync --remove-source-files -azv /ftpusers/tmp/*.mov /mnt/usbdisk/
rsync --remove-source-files -azv /ftpusers/tmp/*.mov server2:/path/to/dest/dir/

4.在类UNIX系统中找出最占磁盘空间的目录或文件

du -a /ftpusers/tmp | sort -n -r | head -n 10
du -cks * | sort -rn | head

5.清空指定文件。这招对日志文件很有效:

truncate -s 0 /ftpusers/ftp.upload.log
### bash/sh等 ##
>/ftpusers/ftp.upload.log
## perl ##
perl -e'truncate "filename", LENGTH'

6.在Linux和UNIX中找出并删除显示着但已经被删除的大文件:

## 基于Linux/Unix/OSX/BSD等系统 ##
lsof -nP | grep '(deleted)'
## 只基于Linux ##
find /proc/*/fd -ls | grep  '(deleted)'

清空它:

 ## 基于Linux/Unix/OSX/BSD等所有系统 ##
> "/path/to/the/deleted/file.name"
## 只基于Linux ##
> "/proc/PID-HERE/fd/FD-HERE"

#2 – 文件系统是只读模式吗?

当你尝试新建或保存一个文件时,你可能最终得到诸如以下的错误:

$ cat > file
-bash: file: Read-only file system

运行mount命令来查看被挂载的文件系统是否处于只读状态:

$ mount
$ mount | grep '/ftpusers'

在基于Linux的系统中要修复这个问题,只需将这个处于只读状态的文件系统重新挂载即可:

# mount -o remount,rw /ftpusers/tmp

(LCTT 译注:如果硬盘由于硬件故障而 fallback 到只读模式,建议不要强制变回读写模式,而是赶快替换硬盘)

另外,我是这样用rw模式重新挂载FreeBSD 9.x服务器的根目录的:

# mount -o rw /dev/ad0s1a /

#3 – Am I running out of inodes?

有时候,df命令能显示出磁盘有空余的空间但是系统却声称文件系统已经写满了。此时你需要用以下命令来检查能在文件系统中识别文件及其属性的索引节点

$ df -i
$ df -i /ftpusers/

部分输出内容:

Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/sda8      6250496 11568 6238928    1% /ftpusers

如上 /ftpusers 下有总计62,50,496KB大小的索引节点但是只有11,568KB被使用。你可以在 /ftpusers 位置下另外创建62,38,928KB大小的文件。如果你的索引节点100%被使用了,试试看以下的选项:

  • 找出不想要的文件并删除它,或者把它移动到其它服务器上。
  • 找出不想要的大文件并删除它,或者把它移动到其它服务器上。

(LCTT 译注:如果一个分区存储了太多的小文件,会出现 inode 用完而存储扇区还有空闲的情况,这种情况下要么清除小文件或在不需要独立访问的情况下将它们打包成一个大文件;要么将数据保存好之后重新分区,并设置分区的 -t news 属性,增加 inode 分配)

#4 – 我的硬盘驱动器宕了吗?

日志文件中的输入/输出错误(例如 /var/log/messages)说明硬盘出了一些问题并且可能已经失效,你可以用smartctl命令来查看硬盘的错误,这是一个在类UNIX系统下控制和监控硬盘状态的一个命令。语法如下:

smartctl -a /dev/DEVICE
# 在Linux服务器下检查 /dev/sda
smartctl -a /dev/sda

你也可以用”Disk Utility”这个软件来获得同样的信息。

Linux:解决八种Linux硬盘问题的技巧
Linux:解决八种Linux硬盘问题的技巧

图 01: Gnome磁盘工具(Applications > System Tools > Disk Utility)

注意: 不要对S.M.A.R.T.工具期望太高,它在某些状况下无法工作,我们要定期做备份。

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

Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

提问: 我有一台运行在VirtualBox上的使用NAT的虚拟机,因此虚拟机会被VirtualBox分配一个私有IP地址(10.x.x.x)。如果我想要从主机SSH到虚拟机中,我该怎么做?

VirtualBox对虚拟机支持几种不同的网络方式,其中一种是NAT网络。当虚拟机启用NAT后,VirtualBox会自动在虚拟机和主机之间进行网络翻译,因此你不必在虚拟机和主机之间配置任何东西。这也意味着NAT中的虚拟机对于外部网络以及主机本身是不可见的。这会在你想要从主机访问虚拟机时会产生问题(比如SSH)。

如果你想从VirtualBox的NAT环境的虚拟机,你可以在GUI或者命令行下启用VirtualBox NAT的端口转发。本篇教程将会演示如何通过启用22端口转发而从主机SSH连接到NAT环境的客户机。如果你先想要从HTTP访问NAT的客户机,用80端口代替22端口即可。

通过GUI配置VirtualBox端口转发

在VirtualBox中选择你想要访问的虚拟机,打开虚拟机的“设置”。点击左侧的“网络”菜单,点击网络适配选项的“高级”。

Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机
Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

点击“端口转发”按钮

Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机
Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

你会看到一个配置端口转发规则的窗口。点击右上角的“添加”图标。

Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机
Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

就会看到像下面那样的转发规则。

  • Name: SSH (可以是任意唯一名)
  • Protocol: TCP
  • Host IP: 127.0.0.1
  • Host Port: 2222 (任何大于1024未使用的端口)
  • Guest IP: 虚拟机IP
  • Guest Port: 22 (SSH 端口)
Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机
Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

端口转发的规则会自动在你启动虚拟机的时候启用。为了验证。可以在你启用虚拟机后检查端口2222是否被VirtualBox开启了。

$ sudo netstat -nap | grep 2222

现在端口转发可以使用了,你可以用下面的命令SSH到虚拟机。

 $ ssh -p 2222 @127.0.0.1

发送到127.0.0.1:2222的登录请求会自动被VirtualBox翻译成10.0.2.15:22,这可以让你SSH到虚拟机中。

通过命令行配置VirtualBox端口转发

VirtualBox有一个称为VBoxManage的命令行管理工具。使用命令行工具,你也可以为你的虚拟机设置端口转发。

下面的命令会为IP地址为10.0.2.15的虚拟机设置一个名字为”centos7″的端口转发规则,SSH的端口号为22,映射到本地主机的端口为2222。规则的名字(本例中是SSH)必须是唯一的。

$ VBoxManage modifyvm "centos7" --natpf1 "SSH,tcp,127.0.0.1,2222,10.0.2.15,22"

规则创建之后,你可以用下面的命令来验证。

 $ VBoxManage showvminfo "centos7" | grep NIC
Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机
Linux:Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

via: http://ask.xmodulo.com/access-nat-guest-from-host-virtualbox.html

译者:geekpi 校对:wxy

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

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

Linux:10个最佳的PHP图像操作库

Thomas Boutell 以及众多的开发者创造了以众所周知的一个图形软件库:GD 图形库,可以用于动态的处理图形图像。GD提供了对于诸如C, Perl, Python, PHP, OCaml等等诸多编程语言的支持。除了生成HTML输出之外,你还可以使用PHP以 PNG、JPEG、GIF、WBMP,以及 XPM等图形文件格式来创建和计算图形文件;并且,使用 PHP 还能让你可以直接向一个浏览器输出图像的数据流。为了这些功能,你需要编译PHP 时加入 GD 支持。

在这篇文章中,你将会了解到10个最佳的php图形操作库,它们可以帮助你简化工作。这些图形计算库将会在你的与图形相关的工作中帮助到你。下面介绍一些最好的用于开发的PHP图形操作库:

1. Imagine

Linux:10个最佳的PHP图像操作库
Linux:10个最佳的PHP图像操作库

该图像处理库是用PHP 5.3建立的面向对象的PHP库。通过使用这个库,你可以很容易地对图像进行例如裁剪、调整大小和放置过滤器等工作。为了产生指定的RGB码值和对象透明度百分比,这个库的颜色类在其构造函数中支持两个参数。

2. Php Graphic Works

Linux:10个最佳的PHP图像操作库
Linux:10个最佳的PHP图像操作库

这个库被创建用来在服务器端进行图像处理。使用这个图像库允许你用一个简单的方法进行复杂的图像处理。可对图像进行的操作,包括旋转,裁剪,缩放,拉伸和翻转。而您只需要通过一些代码就可以完成这些。

3. Zebra Image

Linux:10个最佳的PHP图像操作库
Linux:10个最佳的PHP图像操作库

这款轻巧和面向对象的图像处理库是用PHP构建的。它支持的图像格式包括JPG,GIF 和 PNG。它有一个独特的能力,就是在每一个动作之后都可以把一种格式转换为另一种格式。

4. Php5 Image Manipulation

Linux:10个最佳的PHP图像操作库
Linux:10个最佳的PHP图像操作库

这个完全面向对象的图像处理库可用于PHP和GD2 。它被认为是 PHP-image 项目的一种扩展形式。这个面向对象的图像处理库提供各种ICO图像文件类型,如PNG,GIF ,PSD ,JPEG和ICO 。此外,它还能输出由GD2支持的各种图像文件类型。

来源:http://www.oschina.net/translate/10-best-php-image-manipulation-libraries-which-developers-must-use-in-2014

Linux:HBase 系统架构

HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问。HBase的目标是存储并处理大型的数据。HBase是一个开源的,分布式的,多版本的,面向列的存储模型。它存储的是松散型数据。

HBase特性:

1 高可靠性

2 高效性

3 面向列

4 可伸缩

5 可在廉价PC Server搭建大规模结构化存储集群

HBase是Google BigTable的开源实现,其相互对应如下:

  Google HBase
文件存储系统 GFS HDFS
海量数据处理 MapReduce Hadoop MapReduce
协同服务管理 Chubby Zookeeper

HBase关系图:

Linux:HBase 系统架构
Linux:HBase 系统架构

HBase位于结构化存储层,围绕HBase,各部件对HBase的支持情况:

Hadoop部件 作用
HDFS 高可靠的底层存储支持
MapReduce 高性能的计算能力
Zookeeper  稳定服务和failover机制
Pig&Hive 高层语言支持,便于数据统计
Sqoop 提供RDBMS数据导入,便于传统数据库向HBase迁移

访问HBase的接口

方式 特点 场合
Native Java API 最常规和高效 Hadoop MapReduce Job并行处理HBase表数据
HBase Shell 最简单接口 HBase管理使用
Thrift Gateway 利用Thrift序列化支持多种语言 异构系统在线访问HBase表数据
Rest Gateway 解除语言限制 Rest风格Http API访问
Pig Pig Latin六十编程语言处理数据 数据统计
Hive 简单 SqlLike

HBase 数据模型

Linux:HBase 系统架构
Linux:HBase 系统架构

组成部件说明:

Row Key:     Table主键 行键 Table中记录按照Row Key排序 Timestamp:     每次对数据操作对应的时间戳,也即数据的version number Column Family:  列簇,一个table在水平方向有一个或者多个列簇,列簇可由任意多个Column组成,列簇支持动态扩展,无须预定义数量及类型,二进制存储,用户需自行进行类型转换

Table&Region

Linux:HBase 系统架构
Linux:HBase 系统架构

1. Table随着记录增多不断变大,会自动分裂成多份Splits,成为Regions

2. 一个region由[startkey,endkey)表示

3. 不同region会被Master分配给相应的RegionServer进行管理

两张特殊表:-ROOT- & .META.

Linux:HBase 系统架构
Linux:HBase 系统架构

.META.   记录用户表的Region信息,同时,.META.也可以有多个region

-ROOT-    记录.META.表的Region信息,但是,-ROOT-只有一个region

Zookeeper中记录了-ROOT-表的location

客户端访问数据的流程:

Client -> Zookeeper -> -ROOT- -> .META. -> 用户数据表

多次网络操作,不过client端有cache缓存

HBase 系统架构图

Linux:HBase 系统架构
Linux:HBase 系统架构

组成部件说明

Client:

使用HBase RPC机制与HMaster和HRegionServer进行通信;Client与HMaster进行通信进行管理类操作;Client与HRegionServer进行数据读写类操作。

Zookeeper:

Zookeeper Quorum存储-ROOT-表地址、HMaster地址;HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况;Zookeeper避免HMaster单点问题。

HMaster:

HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行。主要负责Table和Region的管理工作:

1 管理用户对表的增删改查操作

2 管理HRegionServer的负载均衡,调整Region分布

3 Region Split后,负责新Region的分布

4 在HRegionServer停机后,负责失效HRegionServer上Region迁移

HRegionServer:

HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。

Linux:HBase 系统架构
Linux:HBase 系统架构

HRegionServer管理一些列HRegion对象;每个HRegion对应Table中一个Region,HRegion由多个HStore组成;

每个HStore对应Table中一个Column Family的存储;Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效

HStore: HBase存储的核心。由MemStore和StoreFile组成。MemStore是Sorted Memory Buffer。用户写入数据的流程:

Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发。

Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上。

由此过程可知,HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。

HLog

引入HLog原因:

在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer以外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。

工作机制:

每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到 StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的 HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的 HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

HBase存储格式

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:

1 HFile HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile

2 HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File

HFile

图片解释:

HFile文件不定长,长度固定的块只有两个:Trailer和FileInfo。Trailer中指针指向其他数据块的起始点;File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。

Data Index和Meta Index块记录了每个Data块和Meta块的起始点。Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制;每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。

HFile里面的每个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构。

KeyLength和ValueLength:两个固定的长度,分别代表Key和Value的长度。

Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey。Column Family Length是固定长度的数值,表示Family的长度。

接着就是Column Family,再接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分没有这么复杂的结构,就是纯粹的二进制数据。

HLog File

Linux:HBase 系统架构
Linux:HBase 系统架构
HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。

HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。

来源:http://blog.chedushi.com/archives/9723

Linux:JSON编码格式提交表单数据详解

以JSON编码格式提交表单数据是HTML5对WEB发展进化的又一大贡献,以前我们的HTML表单数据是通过key-value方式传输的服务器端,这种形式的传输对数据组织缺乏管理,形式十分原始。而新出现的JSON格式提交表单数据方法,将表单里的所有数据转化的具有一定规范的JSON格式,然后传输的服务器端。服务器端接收到的数据是直接可以使用的合格JSON代码。

Linux:JSON编码格式提交表单数据详解
Linux:JSON编码格式提交表单数据详解

如何声明以JSON格式提交表单

大家应该对如何用表单上传一个文件的写法很熟悉,它需要在HTML中form标记上添加 enctype=”multipart/form-data” 声明,就是告诉浏览器要按上传文件模式发送表单数据。而JSON格式提交表单的声明与此类似,它的写法是: enctype=’application/json’。

对老式浏览器的兼容

以JSON格式提交表单是HTML5中一种很新的规范,只有实现了这些规范的现代浏览器才能识别 enctype=’application/json’的语义,才能正确的将表单数据打包成JSON格式。而对于一些老式浏览器,以及还未实现这些标准的浏览器,它们无法识别 enctype=’application/json’代表什么,于是表单的enctype会自动退化成application/x-www-form-urlencoded缺省编码格式。服务器端代码可以根据enctype的值来判断如何接收数据。

JSON编码格式提交表单的格式范例

例1 基本用法

// 生成的Json数据是 { "name": "Bender" , "hind": "Bitable" , "shiny": true }

例2 当表单存在多个重名的表单域时,按JSON数组编码

// 生成的Json数据是 { "bottle-on-wall": [1, 2, 3] }

例3 表单域名称以数组形成出现的复杂结构

// 生成的Json数据是 { "pet": { "species": "Dahut" , "name": "Hypatia" } , "kids": ["Ashley", "Thelma"] }

例4 在上面的例子中,缺失的数组序号值将以null替代

// 生成的Json数据是 { "hearbeat": ["thunk", null, "thunk"] }

例5 多重数组嵌套格式,嵌套层数无限制

// 生成的Json数据是 { "pet": [ { "species": "Dahut" , "name": "Hypatia" } , { "species": "Felis Stultus" , "name": "Billie" } ] }

例6 真的,没有数组维度限制!

// 生成的Json数据是 { "wow": { "such": { "deep": [ null , null , null , { "much": { "power": { "!": "Amaze" } } } ] } } }

例7 文件上传

// 假设你上传了2个文件, 生成的Json数据是: { "file": [ { "type": "text/plain", "name": "dahut.txt", "body": "REFBQUFBQUFIVVVVVVVVVVVVVCEhIQo=" }, { "type": "text/plain", "name": "litany.txt", "body": "SSBtdXN0IG5vdCBmZWFyLlxuRmVhciBpcyB0aGUgbWluZC1raWxsZXIuCg==" } ] }

来源:http://www.webhek.com/html-json-form-submission

Linux:菜鸟教程:全面学习 pwd 命令

对于那些使用Linux命令行的人来说,‘pwd‘命令是非常有用的,它告诉你你现在在那个目录,从根目录(/)如何到达。特别是对于或许会在目录的切换间容易糊涂的Linux新手而言,‘pwd‘ 可以拯救他们。

Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

 

什么是pwd?

pwd‘ 代表的是‘Print Working Directory’(打印当前目录)。如它的名字那样,‘pwd’会打印出当前工作目录,或简单的来说就是当前用户所位于的目录。它会打印出以根目录 (/)为起点的完整目录名(绝对目录)。这条命令是一条shell内建命令,并且在大多数shell中都可以使用,如bash、Bourne shell,ksh、zsh等等。

pwd的基本语法:

# pwd [OPTION]

pwd的选项

 选项  描述
 -L (即逻辑路径logical )  使用环境中的路径,即使包含了符号链接
 -P (即物理路径physical)  避免所有的符号链接
 –help  显示帮助并退出
 –version  输出版本信息并退出

如果同时使用了‘-L‘和‘-P‘,‘-L‘会有更高的优先级。如果没有指定参数,pwd会避开所有的软链接,也就是说会使用‘-P‘参数。

pwd的退出状态:

0 成功
非零值 失败

本篇的目的是采用例子让你对‘pwd‘有更深入的领悟。

1. 打印当前工作目录.

avi@tecmint:~$ /bin/pwd
/home/avi
Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

打印工作目录

2. 为文件夹创建一个符号链接(比如说在home目录下创建一个htm链接指向/var/www/html)。进入新创建的目录并打印出含有以及不含符号链接的目录。

在home目录下创建一个htm链接指向/var/www/html,并进入。

avi@tecmint:~$ ln -s /var/www/html/ htm
avi@tecmint:~$ cd htm
Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

创建符号链接

3. 从当前环境中打印目录即使它含有符号链接。

avi@tecmint:~$ /bin/pwd -L
/home/avi/htm
Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

打印工作目录

4. 解析符号链接并打印出物理目录。

avi@tecmint:~$ /bin/pwd -P
/var/www/html
Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

打印物理工作目录

5. 查看一下“pwd”和“pwd -P”的输出是否一致,也就是说,如果没有跟上选项,“pwd”时候会自动采用-P选项。

avi@tecmint:~$ /bin/pwd
/var/www/html
Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

检查pwd输出

结论: 上面例子4和5的输出很明显(结果相同),当你“pwd”后面不带参数时,pwd会使用“-P”选项。

6. 打印pwd命令的版本。

avi@tecmint:~$ /bin/pwd --version
pwd (GNU coreutils) 8.23
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Jim Meyering.
Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

检查pwd命令版本

注意: ‘pwd’ 通常不带选项运行,且没有任何参数

重要: 你可能注意到我们刚才运行的都是 “/bin/pwd” 而不是 “pwd”。

这有什么区别呢?直接使用“pwd”意味着使用shell内置的pwd。你的shell可能有不同版本的pwd。具体请参考手册。当你使用的是/bin/pwd时,我们调用的是二进制版本的命令。虽然二进制的版本有更多的选项,但是它们两者都能打印当前的目录。

7. 打印所有含有可执行pwd的路径

avi@tecmint:~$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
Linux:菜鸟教程:全面学习 pwd 命令
Linux:菜鸟教程:全面学习 pwd 命令

打印可执行文件路径

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

Linux:如何在 Linux 系统中创建一个云端加密文件系统

Amazon S3Google Cloud Storage 之类的商业云存储服务以能承受的价格提供了高可用性、可扩展、无限容量的对象存储服务。为了加速这些云产品的广泛采用,这些提供商为他们的产品通过明确的 API 和 SDK 培养了一个良好的开发者生态系统。而基于云的文件系统便是这些活跃的开发者社区中的典型产品,已经有了好几个开源的实现。

S3QL 便是最流行的开源云端文件系统之一。它是一个基于 FUSE 的文件系统,提供了好几个商业或开源的云存储后端,比如 Amazon S3、Google Cloud Storage、Rackspace CloudFiles,还有 OpenStack。作为一个功能完整的文件系统,S3QL 拥有不少强大的功能:最大 2T 的文件大小、压缩、UNIX 属性、加密、基于写入时复制的快照、不可变树、重复数据删除,以及软、硬链接支持等等。写入 S3QL 文件系统任何数据都将首先被本地压缩、加密,之后才会传输到云后端。当你试图从 S3QL 文件系统中取出内容的时候,如果它们不在本地缓存中,相应的对象会从云端下载回来,然后再即时地解密、解压缩。

Linux:如何在 Linux 系统中创建一个云端加密文件系统
Linux:如何在 Linux 系统中创建一个云端加密文件系统

需要明确的是,S3QL 的确也有它的限制。比如,你不能把同一个 S3FS 文件系统在几个不同的电脑上同时挂载,只能有一台电脑同时访问它。另外,ACL(访问控制列表)也并没有被支持。

在这篇教程中,我将会描述“如何基于 Amazon S3 用 S3QL 配置一个加密文件系统”。作为一个使用范例,我还会说明如何在挂载的 S3QL 文件系统上运行 rsync 备份工具。

准备工作

本教程首先需要你创建一个 Amazon AWS 帐号(注册是免费的,但是需要一张有效的信用卡)。

然后 创建一个 AWS access key(access key ID 和 secret access key),S3QL 使用这些信息来访问你的 AWS 帐号。

之后通过 AWS 管理面板访问 AWS S3,并为 S3QL 创建一个新的空 bucket。

Linux:如何在 Linux 系统中创建一个云端加密文件系统
Linux:如何在 Linux 系统中创建一个云端加密文件系统

为最佳性能考虑,请选择一个地理上距离你最近的区域。

Linux:如何在 Linux 系统中创建一个云端加密文件系统
Linux:如何在 Linux 系统中创建一个云端加密文件系统

在 Linux 上安装 S3QL

在大多数 Linux 发行版中都有预先编译好的 S3QL 软件包。

对于 Debian、Ubuntu 或 Linux Mint:

$ sudo apt-get install s3ql

对于 Fedora:

$ sudo yum install s3ql

对于 Arch Linux,使用 AUR

首次配置 S3QL

在 ~/.s3ql 目录中创建 autoinfo2 文件,它是 S3QL 的一个默认的配置文件。这个文件里的信息包括必须的 AWS access key,S3 bucket 名,以及加密口令。这个加密口令将被用来加密一个随机生成的主密钥,而主密钥将被用来实际地加密 S3QL 文件系统数据。

$ mkdir ~/.s3ql
$ vi ~/.s3ql/authinfo2

[s3]
storage-url: s3://[bucket-name]
backend-login: [your-access-key-id]
backend-password: [your-secret-access-key]
fs-passphrase: [your-encryption-passphrase]

指定的 AWS S3 bucket 需要预先通过 AWS 管理面板来创建。

为了安全起见,让 authinfo2 文件仅对你可访问。

$ chmod 600 ~/.s3ql/authinfo2

创建 S3QL 文件系统

现在你已经准备好可以在 AWS S3 上创建一个 S3QL 文件系统了。

使用 mkfs.s3ql 工具来创建一个新的 S3QL 文件系统。这个命令中的 bucket 名应该与 authinfo2 文件中所指定的相符。使用“–ssl”参数将强制使用 SSL 连接到后端存储服务器。默认情况下,mkfs.s3ql 命令会在 S3QL 文件系统中启用压缩和加密。

$ mkfs.s3ql s3://[bucket-name] --ssl

你会被要求输入一个加密口令。请输入你在 ~/.s3ql/autoinfo2 中通过“fs-passphrase”指定的那个口令。

如果一个新文件系统被成功创建,你将会看到这样的输出:

Linux:如何在 Linux 系统中创建一个云端加密文件系统
Linux:如何在 Linux 系统中创建一个云端加密文件系统

挂载 S3QL 文件系统

当你创建了一个 S3QL 文件系统之后,下一步便是要挂载它。

首先创建一个本地的挂载点,然后使用 mount.s3ql 命令来挂载 S3QL 文件系统。

$ mkdir ~/mnt_s3ql
$ mount.s3ql s3://[bucket-name] ~/mnt_s3ql

挂载一个 S3QL 文件系统不需要特权用户,只要确定你对该挂载点有写权限即可。

视情况,你可以使用“–compress”参数来指定一个压缩算法(如 lzma、bzip2、zlib)。在不指定的情况下,lzma 将被默认使用。注意如果你指定了一个自定义的压缩算法,它将只会应用到新创建的数据对象上,并不会影响已经存在的数据对象。

$ mount.s3ql --compress bzip2 s3://[bucket-name] ~/mnt_s3ql

因为性能原因,S3QL 文件系统维护了一份本地文件缓存,里面包括了最近访问的(部分或全部的)文件。你可以通过“–cachesize”和“–max-cache-entries”选项来自定义文件缓存的大小。

如果想要除你以外的用户访问一个已挂载的 S3QL 文件系统,请使用“–allow-other”选项。

如果你想通过 NFS 导出已挂载的 S3QL 文件系统到其他机器,请使用“–nfs”选项。

运行 mount.s3ql 之后,检查 S3QL 文件系统是否被成功挂载了:

$ df ~/mnt_s3ql
$ mount | grep s3ql
Linux:如何在 Linux 系统中创建一个云端加密文件系统
Linux:如何在 Linux 系统中创建一个云端加密文件系统

卸载 S3QL 文件系统

想要安全地卸载一个(可能含有未提交数据的)S3QL 文件系统,请使用 umount.s3ql 命令。它将会等待所有数据(包括本地文件系统缓存中的部分)成功传输到后端服务器。取决于等待写的数据的多少,这个过程可能需要一些时间。

$ umount.s3ql ~/mnt_s3ql

查看 S3QL 文件系统统计信息及修复 S3QL 文件系统

若要查看 S3QL 文件系统统计信息,你可以使用 s3qlstat 命令,它将会显示诸如总的数据、元数据大小、重复文件删除率和压缩率等信息。

$ s3qlstat ~/mnt_s3ql

你可以使用 fsck.s3ql 命令来检查和修复 S3QL 文件系统。与 fsck 命令类似,待检查的文件系统必须首先被卸载。

$ fsck.s3ql s3://[bucket-name]

S3QL 使用案例:Rsync 备份

让我用一个流行的使用案例来结束这篇教程:本地文件系统备份。为此,我推荐使用 rsync 增量备份工具,特别是因为 S3QL 提供了一个 rsync 的封装脚本(/usr/lib/s3ql/pcp.py)。这个脚本允许你使用多个 rsync 进程递归地复制目录树到 S3QL 目标。

$ /usr/lib/s3ql/pcp.py -h
Linux:如何在 Linux 系统中创建一个云端加密文件系统
Linux:如何在 Linux 系统中创建一个云端加密文件系统

下面这个命令将会使用 4 个并发的 rsync 连接来备份 ~/Documents 里的所有内容到一个 S3QL 文件系统。

 $ /usr/lib/s3ql/pcp.py -a --quiet --processes=4 ~/Documents ~/mnt_s3ql

这些文件将首先被复制到本地文件缓存中,然后在后台再逐步地同步到后端服务器。

若想了解与 S3QL 有关的更多信息,如自动挂载、快照、不可变树,我强烈推荐阅读 官方用户指南。欢迎告诉我你对 S3QL 怎么看,以及你对任何其他工具的使用经验。


via: http://xmodulo.com/2014/09/create-cloud-based-encrypted-file-system-linux.html

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

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

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

Linux:怎么样称得上是Linux下优秀的命令行计算器

每个现代的Linux桌面发行版都预装着一个带有图形界面的计算器程序。不过如果你的工作区中全是命令行窗口,那么你一定会在其中的一个命令行窗口中处理一些数字相关的问题。或许你在寻找一款基于命令行的计算器程序。如果是这样的话,GNU bc(“basic calculator”的缩写)会是你不二的选择。当然Linux下有很多基于命令行的计算器应用,我认为GNU bc是功能最强大和最有用的。

在GNU时代之前,bc实际上是一个著名的精密计算语言。它的诞生要追溯到70年代的Unix时期了。最初bc作为一个语法和C语言相似的编程语言而著名。随着时间的改变,最开始的bc演化成POSIX bc,最后变成了今天的GNU bc。

Linux:怎么样称得上是Linux下优秀的命令行计算器
Linux:怎么样称得上是Linux下优秀的命令行计算器

GNU bc的特性

现在的GNU bc是早期bc经过若干次改进和功能增强的结果。目前它被所有的主流GNU/Linux发行版所收纳。GNU bc支持高精度数字和多种数值类型(例如二进制、十进制、十六进制)的输入输出。

如果你对C语言很熟悉的话,你会发现bc使用了和C语言一样或相似的算术操作符。所支持的操作符包括算术运算符(+, -, *, /, %, ++, –)、比较运算符(<, >, ==, !=, <=, >=)、逻辑运算符(!, &&, ||)、位运算符(&, |, , ~, <<, >>)和复合赋值运算符(+=, -=, *=, /=, %=, &=, |=, =, &&=, ||=, <<=, >>=)。bc内置了很多有用的函数,像是平方根、正弦、余弦、反正弦、自然对数、指数等。

如何使用GNU bc

作为一个基于命令行的计算器,GNU bc的使用没有限制。在本文中,我会向大家介绍bc命令的几个常用的特性。如果你想要更加详细的指导,你可以查阅官方指南

如果你没有一个预先写好的bc脚本,那么你可以在交互模式下运行bc。在这种模式下,你输入的以回车结束的任何声明或者表达式会被立刻计算出结果。你需要输入以下命令来进入bc的交互界面。如果想退出bc,你可以输入’quit’并且按回车。

$ bc

本文下面展示的例子请在bc交互界面中输入。

输入表达式

如果想要计算一个算术表达式,我们可以在闪烁的光标处输入该表达式,然后按回车确认。你也可以将该结果存储到一个变量中,然后在其他表达式中使用该变量。

在一个bc的交互界面中,保存着没有个数限制的命令历史记录。使用上方向键来查看之前输入的命令。如果你想限制历史记录保存的命令数量,你可以将一个名为history的特殊变量设置成你希望的数值。该变量默认为-1,也就是“历史记录数量没有限制”。

输入输出进制切换

经常会发生的是,你输入一个表达式并且想使用二进制或者十六进制来显示结果。bc允许你在输入输出数字的进制间转换。输入和输出的数系基分别存储在ibase和obase变量中,默认值为10,有效的数值是2到16(或者环境变量BCBASEMAX的值)。你只需要更改ibase和obase的值就可以在不同进制之间转换了。下面是一个求两个十六进制/二进制数和的例子:

Linux:怎么样称得上是Linux下优秀的命令行计算器
Linux:怎么样称得上是Linux下优秀的命令行计算器

需要注意的是,我有意地将obase=16放到了ibase=16前面,反过来则是不可以的。这个是因为如果我先输入ibase=16,那么随后输入的obase=16中的16会被认为是16进制的数字,也就是十进制的22。当然这个不是我们所期望的。

调整精度

在bc中,数字的精度存储在一个名为scale的特殊变量中。该变量表示小数点后数字的个数。scale默认为0,意味着所有的数字和结果以整数形式储存。你可以通过改变scale这个特殊变量的值,来调整数值的精度。

scale=4

使用内置函数

除了简单的算术操作符,GNU bc还通过外部的数学函数库来提供许多高级的数学函数。你可以在命令行界面使用“-l”选项来打开bc。

这里描述了一些内置的函数。

N的二次方根:

 sqrt(N)

X的正弦(X是弧度):

s(X)

X的余弦(X是弧度):

c(X)

X的反正弦(返回值是弧度):

a(X)

X的自然对数:

l(X)

X的指数对数:

e(X)

当做语言来用

作为一个计算语言,GNU bc支持简单的声明(变量赋值、中断、返回等)、复合语句(if、while、for loop等)和自定义函数。在这里我不会涉及到这些特性的细节,不过你可以通过官方指南来学习如何使用这些特性。下面是一个简单的函数示例:

define dummy(x){
return(x * x);
}
dummy(9)
81
dummy(4)
16

在非交互界面下使用GNU bc

到目前为止,我们一直在交互界面下使用bc。不过更加流行的使用bc的方法是在没有交互界面的脚本中运行bc。这种情况下,你可以使用echo命令并且借助管道来向bc发送输入内容。例如:

$ echo "40*5" | bc
$ echo "scale=4; 10/3" | bc
$ echo "obase=16; ibase=2; 11101101101100010" | bc
Linux:怎么样称得上是Linux下优秀的命令行计算器
Linux:怎么样称得上是Linux下优秀的命令行计算器

总结一下,GNU bc是一款强大并且通用的基于命令行的计算器应用,它绝对不会让你失望。它预装在所有的现代Linux发行版中,bc可以让你不用离开命令行就可以进行高效的数学计算。所以,GNU bc一定会是你的最爱。


via: http://xmodulo.com/command-line-calculator-linux.html

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

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

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

Linux:在Linux中的使用 ss 命令检查套接字/网络连接

ss是iproute2包的一部分(控制TCP/IP网络和流量的工具)。iproute2的目标是替代先前用于配置网络接口、路由表和管理ARP表的标准Unix网络工具套装(通常称之为“net-tools”)。ss工具用于导出套接字统计,它可以显示与netstat类似的信息,且可以显示更多的TCP和状态信息。因为它直接从内核空间获取信息,所以会更快。ss的操作和netstat很像,所以这让它可以很容易就可以取代netstat。

Linux:在Linux中的使用 ss 命令检查套接字/网络连接
Linux:在Linux中的使用 ss 命令检查套接字/网络连接

使用和常见选项

ss和netstat很像,默认它会显示已经建立连接的开放的非监听TCP套接字列表。并且你可以用下面的选项过滤输出:

  • -n – 不要尝试解析服务名。
  • -r – 尝试解析数字的地址/端口。
  • -a – 显示所有套接字。
  • -l – 显示监听套接字。
  • -p – 显示使用该套接字的进程。
  • -s – 打印统计数据
  • -t – 只显示TCP套接字。
  • -u – 只显示UDP套接字。
  • -d – 只显示DCCP套接字
  • -w – 只显示RAW套接字。
  • -x – 只显示Unix域套接字
  • -f FAMILY – 显示FAMILY套接字的类型。目前支持下面这些族:unix、inet、inet6、link、netlink。
  • -A QUERY – 指定要列出的套接字列表,通过逗号分隔。可以识别下面的标识符:all、inet、tcp、udp、raw、unix、packet、netlink、unixdgram、unixstream、packetraw、packetdgram。
  • -o STATUS – 列出指定状态的套接字

ss 命令示例

1. 显示所有的的TCP端口和使用它们的进程:

# ss -tnap
Linux:在Linux中的使用 ss 命令检查套接字/网络连接
Linux:在Linux中的使用 ss 命令检查套接字/网络连接

2. 你可以使用-4 标志来显示IPv4链接,-6标志来显示IPv6链接,比如:

# ss -tnap6

ss tnap6

3. 跟上面的行为一样,你只需用u代替t就会显示所有开放的UDP端口。

# ss -unap
Linux:在Linux中的使用 ss 命令检查套接字/网络连接
Linux:在Linux中的使用 ss 命令检查套接字/网络连接

4. 你可以使用-s标志来打印各种有用的统计数据:

# ss -s
Linux:在Linux中的使用 ss 命令检查套接字/网络连接
Linux:在Linux中的使用 ss 命令检查套接字/网络连接

5. 你可以使用-o标志来检查所有不同状态下的链接,比如显示所有已经建立的连接。

# ss -tn -o state established -p
Linux:在Linux中的使用 ss 命令检查套接字/网络连接
Linux:在Linux中的使用 ss 命令检查套接字/网络连接

via: http://linoxide.com/linux-command/ss-sockets-network-connection/

作者:Adrian Dinu 译者:geekpi 校对:wxy

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

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

Linux:Linux 有问必答:在Linux上如何将文本文件转换成PDF格式

提问: 我想要将一个纯文本文件转换成PDF文档。在Linux命令行下是否有一个简单的方法将文本文件转换成PDF文件?

Linux:Linux 有问必答:在Linux上如何将文本文件转换成PDF格式
Linux:Linux 有问必答:在Linux上如何将文本文件转换成PDF格式

当你有一大堆文本文件要维护的时候,把它们转换成PDF文档会好一些。比如,PDF更适合打印,因为PDF文档有预定义布局。除此之外,还可以减少文档被意外修改的风险。

要将文本文件转换成PDF格式,你要按照下面的两步。

准备工作

首先你要安装两个需要的包。

在 Debian、Ubuntu 或者 Linux Mint上:

$ sudo apt-get install enscript ghostscript

在 Fedora、CentOS/RHEL上:

$ sudo yum install enscript ghostscript

在 Arch Linux上:

$ sudo pacman -S enscript ghostscript

将文本文件转换成PDF格式

准备工作完成之后,按照下面的两步从文本文件生成一个PDF文件

首先,使用enscript命令行工具将文本文件转换成postscript格式。

$ enscript -p output.ps input.txt

最后将postscript格式文件转换成PDF文件。

$ ps2pdf output.ps output.pdf

via: http://ask.xmodulo.com/convert-text-to-pdf-linux.html

译者:geekpi 校对:Caroline

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

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

Linux:如何让树莓派默认启动进入图形界面

我买树莓派已经有一段时间了,但是实话说我几乎还没有用它做过什么事情。自从我的Dell超级本送到Dell服务中心后(已经有数星期了),我再次开始使用树莓派作为替代。

我之前已经写过一篇在Ubuntu中如何在SD卡上安装Raspbian系统。我也重装了一次树莓派。第一次启动的时候我漏掉了一件事情就是设置图形界面。这样当我再次启动树莓派的时候,我直接进入了命令行。我该接下来如何运行Respbian图形界面呢?

设置Raspbian图形启动

当你第一次安装Raspbian系统时,确实有一些选项需要你来配置,由于匆忙,我没有注意到这些,只是快速完成屏幕上的选项。如果你遇到了和我一样的情况,最终只是进入到了Raspbian操作系统的命令行界面,不要失望,因为设置树莓派以图形界面启动很容易。让我们看看该如何操作。

第一步:

当你在命令行时,以默认的用户名和密码登录(如果你没有修改过)。Raspbian的默认用户是pi,默认密码应该是raspberry。

第二步:

当你登录后,运行下面的命令:

sudo raspi-config

这条命令会打开树莓派的配置,就像我们第一次启动看到的那样。

第三步:

在这个配置界面下, 寻找Enable Boot to Desktop/Scratch这个选项。用箭头、tab和/或者回车键的组合来选中它(我忘记使用的是哪些了)。

第四步:

下一屏中,选择 Desktop Login as user ‘Pi’ at the graphical desktop. 

第五步:

接下来你会被要求重启。

下次启动后,你会登录到LXDE桌面环境。接下来你就可以享受树莓派的图形界面了。

我希望这个教程能够帮助设置你的树莓派默认启动进入图形界面。欢迎在评论区留下你的问题和建议。


via: http://itsfoss.com/raspberry-pi-gui-boot/

作者:Abhishek 译者:geekpi 校对:Caroline

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

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

Linux:如何创建和使用Python CGI脚本

你是否想使用Python语言创建一个网页,或者处理用户从web表单输入的数据?这些任务可以通过Python CGI(公用网关接口)脚本以及一个Apache web服务器实现。当用户请求一个指定URL或者和网页交互(比如点击””提交”按钮)的时候,CGI脚本就会被web服务器启用。CGI脚本调用执行完毕后,它的输出结果就会被web服务器用来创建显示给用户的网页。

Linux:如何创建和使用Python CGI脚本
Linux:如何创建和使用Python CGI脚本

配置Apache web服务器,让其能运行CGI脚本

在这个教程里,我们假设Apache web服务器已经安装好,并已运行。这篇教程使用的Apache web服务器(版本2.2.15,用于CentOS发行版6.5)运行在本地主机(127.0.0.1),并且监听80端口,如下面的Apache指令指定一样:

ServerName 127.0.0.1:80
Listen 80

下面举例中的HTML文件存放在web服务器上的/var/www/html目录下,并通过DocumentRoot指令指定(指定网页文件所在目录):

DocumentRoot "/var/www/html"

现在尝试请求URL:http://localhost/page1.html

这将返回web服务器中下面文件的内容:

/var/www/html/page1.html

为了启用CGI脚本,我们必须指定CGI脚本在web服务器上的位置,需要用到ScriptAlias指令:

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

以上指令表明CGI脚本保存在web服务器的/var/www/cgi-bin目录,请求URL里包含/cgi-bin/的将会搜索这个目录下的CGI脚本。

我们必须还要明确CGI脚本在/var/www/cgi-bin目录下有执行权限,还要指定CGI脚本的文件扩展名。使用下面的指令:


    Options +ExecCGI
    AddHandler cgi-script .py

下面访问URL:http://localhost/cgi-bin/myscript-1.py

这将会调用web服务器中下面所示脚本:

/var/www/cgi-bin/myscript-1.py

创建一个CGI脚本

在创建一个Python CGI脚本之前,你需要确认你已经安装了Python(这通常是默认安装的,但是安装版本可能会有所不同)。本篇教程使用的脚本是使用Python版本2.6.6编写的。你可以通过下面任意一命令(-V和–version参数将显示所安装Python的版本号)检查Python的版本。

$ python -V
$ python --version

如果你的Python CGI脚本要用来处理用户输入的数据(从一个web输入表单),那么你将需要导入Python cgi模块。这个模块可以处理用户通过web输入表单输入的数据。你可以在你的脚本中通过下面的语句导入该脚本:

import cgi

你也必须修改Python CGI脚本的执行权限,以防止web服务器不能调用。可以通过下面的命令增加执行权限:

# chmod o+x myscript-1.py

Python CGI例子

涉及到Python CGI脚本的两个方案将会在下面讲述:

  • 使用Python脚本创建一个网页
  • 读取并显示用户输入的数据,并且在网页上显示结果

注意:Python cgi模块在方案2中是必需的,因为这涉及到用户从web表单输入数据。

例子1 :使用Python脚本创建一个网页

对于这个方案,我们将通过创建包含一个单一提交按钮的网页/var/www/html/page1.html开始。

Test Page 1

当”提交”按钮被点击,/var/www/cgi-bin/myscript-1.py脚本将被调用(通过action参数指定)。通过设置方法参数为”get”来指定一个”GET”请求,服务器将会返回指定的网页。/var/www/html/page1.html在浏览器中的显示情况如下:

Linux:如何创建和使用Python CGI脚本
Linux:如何创建和使用Python CGI脚本

/var/www/cgi-bin/myscript-1.py的内容如下:

#!/usr/bin/python
print "Content-Type: text/html"
print ""
print ""
print "

CGI Script Output

" print "

This page was generated by a Python CGI script.

" print ""

第一行声明表示这是使用 /usr/bin/python命令运行的Python脚本。”Content-Type: text/html”打印语句是必需的,这是为了让web服务器知道接受自CGI脚本的输出类型。其余的语句用来输出HTML格式的其余网页内容。

当”Submit”按钮点击,下面的网页将返回:

Linux:如何创建和使用Python CGI脚本
Linux:如何创建和使用Python CGI脚本

这个例子的要点是你可以决定哪些信息可以被CGI脚本返回。这可能包括日志文件的内容,当前登陆用户的列表,或者今天的日期。在你处理时拥有所有python库的可能性是无穷无尽的。

例子2:读取并显示用户输入的数据,并将结果显示在网页上

对于这个方案,我们将通过创建一个含有三个输入域和一个提交按钮的网页/var/www/html/page2.html开始。

Test Page 2

First Name:
Last Name:
Position:

当”Submit”按钮点击,/var/www/cgi-bin/myscript-2.py脚本将被执行(通过action参数指定)。/var/www//html/page2.html显示在web浏览器中的图片如下所示(注意,三个输入域已经被填写好了):

Linux:如何创建和使用Python CGI脚本
Linux:如何创建和使用Python CGI脚本

/var/www/cgi-bin/myscript-2.py的内容如下:

#!/usr/bin/python
import cgi
form = cgi.FieldStorage()
print "Content-Type: text/html"
print ""
print ""
print "

CGI Script Output

" print "

" print "The user entered data are:
" print "First Name: " + form["firstName"].value + "
" print "Last Name: " + form["lastName"].value + "
" print "Position: " + form["position"].value + "
" print "

" print ""

正如前面提到,import cgi语句用来确保能够处理用户通过web输入表单输入的数据。web输入表单被封装在一个表单对象中,叫做cgi.FieldStorage对象。一旦开始输出,”Content-Type: text/html”是必需的,因为web服务器需要知道接受自CGI脚本的输出格式。用户输入的数据在包含form[“firstName”].value,form[“lastName”].value,和 form[“position”].value的语句中可以得到。那些中括号中的名称和/var/www/html/page2.html文本输入域中定义的名称参数一致。

当网页上的”Submit”按钮被点击,下面的网页将被返回。

Linux:如何创建和使用Python CGI脚本
Linux:如何创建和使用Python CGI脚本

这个例子的要点就是你可以很容易地读取并显示用户在web表单上输入的数据。除了以字符串的方式处理数据,你也可以用Python将用户输入的数据转化为可用于数值计算的数字。

结论

本教程演示了如何使用Python CGI脚本创建网页并处理用户在网页表单输入的数据。查阅更多关于Apache CGI脚本的信息,点击这里。查阅更多关于Python cgi模块的信息,点击这里


via: http://xmodulo.com/create-use-python-cgi-scripts.html

作者:Joshua Reed 译者:su-kaiyao 校对:wxy

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

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

Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性

当你从网上下载一个文件后(比如:安装程序、ISO镜像或者一个压缩包),文件可能在不同的情况下发生了损坏,比如:由于线路传输错误、中断的下载、存储硬件错误、文件系统错误等等。除了这些错误,文件还可能在下载前或者下载中的攻击而被有意地篡改了。比如,一个攻破证书颁发机构的攻击者可以实施一个MITM攻击(中间人攻击),欺骗你从HTTPS网站上下载隐藏恶意软件的文件。

要保护你自己免受这些问题的困扰,建议你去验证从网上下载的文件的可靠性和完整性。特别是你下载了一个非常敏感的文件的时候)(比如:操作系统镜像、二进制应用程序、可执行安装包等等),盲目地相信下载的文件不是一个好习惯。

Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性

一个快速和简单地验证下载文件的完整性的方法是使用不同的校验工具(比如:md5sum、sha356sum、cksum)来计算和比较校验码(比如:MD5、SHA、CRC)。然而,然而校验容易受到碰撞攻击,而且同样不能用于验证文件的可靠性(比如:拥有者)。

如果你想要同时验证下载文件的可靠性(拥有者)和完整性(内容),你需要依赖于加密签名。本教程中,我会描述如何使用GnuPG(GNU Privacy Guard)来检查文件的可靠性和完整性。

本例中我会验证一个从 https://onionshare.org 上下载的磁盘镜像。这个网站中,发行商会提供他们的公钥,还有它用于密钥验证的指纹。

至于下载的文件,发行商也会提供它相关的PGP签名。

安装 GnuPG 并且生成一个键对

让我们首先在你的Linux系统上安装GnuPG。

在Debian、Ubuntu和其他Debian衍生版上:

$ sudo apt-get install gnupg

在Fedora、CentOS或者RHEL上:

$ sudo yum install gnupg

完成安装后,生成一个本篇中会使用到的键对。

$ gpg --gen-key
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性

在生成键对期间,你会被要求提供你的姓名和email,还有保护你私钥的密码。你同样也可以选择键对何时过期(默认不会过期)。依赖于你选择的key的大小(在1024和4096位之间),key生成会花上几分钟或者更多,同时它要求收集来自你桌面活动的大量的随机数据。(比如键盘输入、鼠标移动、磁盘访问等等,所以这个时候随便动动鼠标键盘什么的)。

一旦key生成完毕后,公钥和私钥会存储在~/.gnupg目录。

与某个文件和拥有者建立信任

验证下载文件的第一步是与任何提供文件下载的人建立信任。出于此,我们下载了这个文件的公钥,并且验证公钥的拥有者是否是他或者她自称的。

在下载完文件拥有者的公钥后:

$ wget https://onionshare.org/signing-key.asc

使用gpg命令导入公钥到你的keyring中

$ gpg --import signing-key.asc

一旦拥有者的公钥导入后,他会像下面那样打印出一个key ID(比如:”EBA34B1C”)。记住这个key ID。

现在,运行下面的命令检查导入的公钥的指纹:

$ gpg --fingerprint EBA34B1C

你会看到key的指纹字符串。把这个和网站上显示的指纹做对比。如果匹配,你可以选择信任这个文件拥有者的公钥。

一旦你决定相信这个公钥,你可以通过编辑key来设置信任级别:

$ gpg --edit-key EBA34B1C

这个命令会显示GPG提示符:

Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性

在GPG提示符中输入“trust”,它会让你从1-5之间选择这个key的信任等级。

Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性

本例中,我决定分配给它“4”,在这之后,输入“sign”用你自己的私钥签名,接着输入在GPG提示符中输入“save”来完成操作。

Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性

要注意的是不需要这样明确地给一个公钥指派信任,通过key的导入隐式地信任往往就够了。

给一个key隐式地分配给“完全”的信任就是任何其他由这个完全信任签名的key X都会被认为是对你有效的。通常上,key验证依赖于一个称之为“信任网”的复杂机制。

回到教程,现在让我们检查导入的key列表。

 $ gpg --list-keys
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
Linux:使用 GnuPG 加密签名来验证下载文件的可靠性和完整性

你至少会看到两个key:一个带 depth 0和终极信任(”1u”),这就是你自己的key,另外一个带depth 1和完全信任(“1f”),这是你之前签名的key。

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

Linux:HTTPS的“S”的代价

卡内基梅隆大学、西班牙电信和都灵理工大学的研究人员在ACM CoNEXT上发表了一篇论文(PDF),量化了网站从HTTP切换到HTTPS所付出的代价

Linux:HTTPS的“S”的代价
Linux:HTTPS的“S”的代价

今天越来越多的网站和服务开始启动加密,HTTPS加密Web流量占到总流量的一半,其中YouTube这样的流媒体网站首次有50%的流量是经过HTTPS,这一切证明了Web的完整加密是可行的。

但启用HTTPS是有代价的。研究人员分析了启用加密对延迟、消耗数据和客户端电池寿命的影响。他们发现,HTTPS的“S”会使得页面加载时间增加了50%,增加10%到20%的耗电。此外,HTTPS还会影响缓存增加数据开销和功耗,以及父母控制和病毒扫描等也会受到影响。

来源:http://www.solidot.org/story?sid=42160

Linux:Docker Machine介绍

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。Docker官方是这样介绍Machine的初衷的:

之前,Docker的安装流程非常复杂,用户需要登录到相应的主机上,根据官方的安装和配置指南来安装Docker,并且不同的操作系统的安装步骤也是不一样的。而有了Machine后,不管是在笔记本、虚拟机还是公有云实例上,用户仅仅需要一个命令….当然那你需要先安装Machine。

Linux:Docker Machine介绍
Linux:Docker Machine介绍

Machine的命令也非常简单:

% machine create -d [infrastructure provider] [provider options] [machine name]

看着有点懵,infrastructure provider是啥?machine name是啥?我使劲想了半天也没想到好的中文翻译,但是你看例子就明白它们的意思了。

$ machine create -d virtualbox dev
[info] Downloading boot2docker...
[info] Creating SSH key...
[info] Creating VirtualBox VM...
[info] Starting VirtualBox VM...
[info] Waiting for VM to start...
[info] "dev" has been created and is now the active host. Docker commands will now run against that host.
$ machine ls
NAME    ACTIVE   DRIVER         STATE   URL
dev     *       virtualbox  Running   tcp://192.168.99.100:2375
$ export DOCKER_HOST=`machine url` DOCKER_AUTH=identity
$ docker run busybox echo hello world
Unable to find image 'busybox' locally
Pulling repository busybox
e72ac664f4f0: Download complete
511136ea3c5a: Download complete
df7546f9f060: Download complete
e433a6c5b276: Download complete
hello world
$ machine create -d digitalocean --digitalocean-access-token=... staging
[info] Creating SSH key...
[info] Creating Digital Ocean droplet...
[info] Waiting for SSH...
[info] "staging" has been created and is now the active host. Docker commands will now run against that host.
$ machine ls
NAME      ACTIVE   DRIVER         STATE     URL
dev                virtualbox     Running   tcp://192.168.99.108:2376
staging   *        digitalocean   Running   tcp://104.236.37.134:2376

Machine做事也很聪明,很符合Docker公司的做事风格,他们号称自己架构很好,方便第三方集成。所以Machine现在只支持有限的几个平台(VirtualBox、 Digital Ocean、Microsoft Azure),其它平台的兼容留给那些爱Docker的第三方厂商以及开发者去做吧。所以接下来一定会有很多的厂商跟进,比如国内阿里云之类的,他们根据官方的接口开发个Driver即可加入Machine的能力。

需要注意的是Machine是完全独立于Docker项目的,目前的主要维护者是也是一位叫Ben的人,当然还是使用Go语言。

来源:http://dockerone.com/article/27

Linux:Docker Swarm介绍

Docker Swarm是一个Dockerized化的分布式应用程序的本地集群,它是在Machine所提供的功能的基础上优化主机资源的利用率和容错服务。具体来说,Docker Swarm支持用户创建可运行Docker Daemon的主机资源池,然后在资源池中运行Docker容器。Docker Swarm可以管理工作负载并维护集群状态。

Linux:Docker Swarm介绍
Linux:Docker Swarm介绍
Docker默认调度器会根据Docker容器的工作负载以及集群中主机的可用资源,使用bin pack自动优化工作负载。 例如,调度一个需要1G内存的Redis容器:

% docker run -d -P -m 1g redis

为了支持特定的需求和基于策略的调度,Docker Swarm还提供了标准和自定义约束。比如为了保证好的IO性能,用户可能想在SSD上运行MySQL容器,这个时候可以定义如下约束:

% docker run -d -P -e constraint:storage=ssd mysql

Linux:Docker Swarm介绍
Linux:Docker Swarm介绍
除了资源优化,Docker Swarm可以保证应用的高可用性和容错性。Docker Swarm会不断的检查Docker Daemon所在主机的健康状态。当某个主机不可用时,Swarm就会将容器迁移到新的主机上。

Docker Swarm的亮点之一是它可以在应用的生命周期内扩展,也就是说当应用从一个主机扩展到2个、20个或者200个的时候,用户可以保证接口的一致性。

同样,和Machine一样,Swarm的架构是可插拔的,系统已经包含一个默认的调度器。其它的厂商可以实现自己的调度器。

可能上面的解释不太好理解,读者可以看完例子后再回来看上面那段话。或者可以看看作者(Andrea Luzzardi)在DockerCon上的演讲稿

来源:http://dockerone.com/article/28