Skip to content Skip to main navigation Skip to footer

Linux

Linux:在CentOS上配置基于主机的入侵检测系统(IDS)

所有系统管理员想要在他们生产服务器上首先要部署的安全手段之一,就是检测文件篡改的机制——不仅仅是文件内容,而且也包括它们的属性。

Linux:在CentOS上配置基于主机的入侵检测系统(IDS)
Linux:在CentOS上配置基于主机的入侵检测系统(IDS)

AIDE (“高级入侵检测环境”的简称)是一个开源的基于主机的入侵检测系统。AIDE通过检查大量文件属性的不一致性来检查系统二进制文件和基本配置文件的完整性,这些文件属性包括权限、文件类型、索引节点、链接数、链接名、用户、组、文件大小、块计数、修改时间、添加时间、创建时间、acl、SELinux安全上下文、xattrs,以及md5/sha校验值在内的各种特征。

AIDE通过扫描一台(未被篡改)的Linux服务器的文件系统来构建文件属性数据库,以后将服务器文件属性与数据库中的进行校对,然后在服务器运行时对被修改的索引了的文件发出警告。出于这个原因,AIDE必须在系统更新后或其配置文件进行合法修改后重新对受保护的文件做索引。

对于某些客户,他们可能会根据他们的安全策略在他们的服务器上强制安装某种入侵检测系统。但是,不管客户是否要求,系统管理员都应该部署一个入侵检测系统,这通常是一个很好的做法。

在 CentOS或RHEL 上安装AIDE

AIDE的初始安装(同时是首次运行)最好是在系统刚安装完后,并且没有任何服务暴露在互联网甚至局域网时。在这个早期阶段,我们可以将来自外部的一切闯入和破坏风险降到最低限度。事实上,这也是确保系统在AIDE构建其初始数据库时保持干净的唯一途径。(LCTT 译注:当然,如果你的安装源本身就存在安全隐患,则无法建立可信的数据记录)

出于上面的原因,在安装完系统后,我们可以执行下面的命令安装AIDE:

 # yum install aide

我们需要将我们的机器从网络断开,并实施下面所述的一些基本配置任务。

配置AIDE

默认配置文件是/etc/aide.conf,该文件介绍了几个示例保护规则(如FIPSR,NORMAL,DIR,DATAONLY),各个规则后面跟着一个等号以及要检查的文件属性列表,或者某些预定义的规则(由+分隔)。你也可以使用此种格式自定义规则。

FIPSR = p+i+n+u+g+s+m+c+acl+selinux+xattrs+sha256
NORMAL = FIPSR+sha512

例如,上面的例子说明,NORMAL规则将检查下列属性的不一致性:权限(p)、索引节点(i)、链接数(n)、用户(u)、组(g)、大小(s)、修改时间(m)、创建时间(c)、ACL(acl)、SELinux(selinux)、xattrs(xattr)、SHA256/SHA512校验和(sha256和sha512)。

定义的规则可灵活地用于不同的目录和文件(用正则表达式表示)。

Linux:在CentOS上配置基于主机的入侵检测系统(IDS)
Linux:在CentOS上配置基于主机的入侵检测系统(IDS)

条目之前的感叹号(!)告诉AIDE忽略子目录(或目录中的文件),对于这些可以另外定义规则。

在上面的例子中,PERMS是用于/etc机器子目录和文件的默认规则。然而,对于/etc中的备份文件(如/etc/.*~)则不应用任何规则,也没有规则用于/etc/mtab文件。对于/etc中的其它一些选定的子目录或文件,使用NORMAL规则替代默认规则PERMS。

定义并应用正确的规则到系统中正确的位置,是使用AIDE最难的一部分,但作一个好的判断是一个良好的开始。作为首要的一条规则,不要检查不必要的属性。例如,检查/var/log或/var/spool里头的文件的修改时间将导致大量误报,因为许多的应用程序和守护进程经常会写入内容到该位置,而这些内容都没有问题。此外,检查多个校验值可能会加强安全性,但随之而来的是AIDE的运行时间的增加。

可选的,如果你使用MAILTO变量指定电子邮件地址,就可以将检查结果发送到你的邮箱。将下面这一行放到/etc/aide.conf中的任何位置即可。

MAILTO=root@localhost

首次运行AIDE

运行以下命令来初始化AIDE数据库:

 # aide --init

根据/etc/aide.conf生成的/var/lib/aide/aide.db.new.gz文件需要被重命名为/var/lib/aide/aide.db.gz,以便AIDE能读取它:

 # mv /var/lib/aide/aide.db.new.gz /var/lib/aide.db.gz

现在,是时候来将我们的系统与数据库进行第一次校对了。任务很简单,只需运行:

 # aide

在没有选项时,AIDE假定使用了–check选项。

如果在数据库创建后没有对系统做过任何修改,AIDE将会以OK信息来结束本次校对。

生产环境中管理AIDE

在构建了一个初始AIDE数据库后,作为不断进行的系统管理活动,你常常需要因为某些合法的理由更新受保护的服务器。每次服务器更新后,你必须重新构建AIDE数据库,以更新数据库内容。要完成该任务,请执行以下命令:

 # aide --update

要使用AIDE保护生产系统,可能最好通过任务计划调用AIDE来周期性检查不一致性。例如,要让AIDE每天运行一次,并将结果发送到邮箱:

 # crontab -e

0 0 * * * /usr/sbin/aide --check | /usr/bin/mail -s "AIDE run for $HOSTNAME" your@email.com

测试AIDE检查文件篡改

下面的测试环境将演示AIDE是如何来检查文件的完整性的。

测试环境 1

让我们添加一个新文件(如/etc/fake)。

# cat /dev/null > /etc/fake
Linux:在CentOS上配置基于主机的入侵检测系统(IDS)
Linux:在CentOS上配置基于主机的入侵检测系统(IDS)

测试环境 2

让我们修改文件权限,然后看看它是否被检测到。

 # chmod 644 /etc/aide.conf

测试环境 3

最后,让我们修改文件内容(如,添加一个注释行到/etc/aide.conf)。

echo "#This is a comment" >> /etc/aide.conf
Linux:在CentOS上配置基于主机的入侵检测系统(IDS)
Linux:在CentOS上配置基于主机的入侵检测系统(IDS)

上面的截图中,第一栏显示了文件的属性,第二栏是AIDE数据库中的值,而第三栏是更新后的值。第三栏中空白部分表示该属性没有改动(如本例中的ACL)。

结尾

如果你曾经发现你自己有很好的理由确信系统被入侵了,但是第一眼又不能确定到底哪些东西被改动了,那么像AIDE这样一个基于主机的入侵检测系统就会很有帮助了,因为它可以帮助你很快识别出哪些东西被改动过,而不是通过猜测来浪费宝贵的时间。


via: http://xmodulo.com/host-intrusion-detection-system-centos.html

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

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

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

Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

问题:我在CentOS系统上运行一台网页或文件服务器,打算远程访问服务器。因此,我需要更改防火墙规则以允许访问系统上的某个TCP端口。那么,有什么好方法在CentOS或RHEL系统的防火墙上开启TCP/UDP端口?

如果希望在服务器上提供服务,诸如CentOS或RHEL的企业级Linux发行版包含内置的强大防火墙,它们默认的防火墙规则十分严格。因此,如果你安装了任何定制的服务(比如web服务器、NFS和Samba),那么它们的流量很有可能被防火墙规则阻塞。所以需要在防火墙上开启必要的端口以允许流量通过。

Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

在CentOS/RHEL 6或更早的版本上,iptables服务允许用户与netfilter内核模块交互来在用户空间中配置防火墙规则。然而,从CentOS/RHEL 7开始,一个叫做firewalld新用户空间接口被引入以取代iptables服务。

使用这个命令察看当前的防火墙规则:

$ sudo iptables -L
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

现在,让我们看看如何在CentOS/RHEL上修改防火墙来开启一个端口。

在CentOS/RHEL 7上开启端口

启动CentOS/RHEL 7后,防火墙规则设置由firewalld服务进程默认管理。一个叫做firewall-cmd的命令行客户端支持和这个守护进程通信以永久修改防火墙规则。

使用这些命令来永久打开一个新端口(如TCP/80)。

$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
$ sudo firewall-cmd --reload

如果不使用“–permanent”标记,把么防火墙规则在重启后会失效。

在CentOS/RHEL 6上开启端口

在CentOS/RHEL 6甚至更早版本系统上,iptables服务负责维护防火墙规则。

使用iptables的第一条命令可以通过防火墙开启一个新TCP/UDP端口。为了永久保存修改过的规则,还需要第二条命令。

$ sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$ sudo service iptables save

另一种方法是通过一个名为system-config-firewall-tui的命令行用户接口(TUI)的防火墙客户端。

$ sudo system-config-firewall-tui

选择位于中间的“Customize”按钮,按下ENTER键即可。

Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

如果想要为任何已知的服务(如web服务器)修改防火墙,只需勾选该服务,然后关闭工具。如果想要开启任意一个TCP/UDP端口,选择“Forward”按钮,然后进入下一个界面。

Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

选择“Add”按钮添加一条新规则。

Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

指定一个端口(如80)或者端口范围(如3000-3030)和协议(如tcp或udp)。

Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

最后,保存修改过的配置,关闭工具。这样,防火墙就永久保存了。

Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口
Linux:Linux有问必答:在CentOS或RHEL防火墙上开启端口

via: http://ask.xmodulo.com/open-port-firewall-centos-rhel.html

译者:KayGuoWhu 校对:wxy

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

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

Linux:小白技巧:如何从Ubuntu 14.04 LTS 升级到Ubuntu 14.10

Linux:小白技巧:如何从Ubuntu 14.04 LTS 升级到Ubuntu 14.10
Linux:小白技巧:如何从Ubuntu 14.04 LTS 升级到Ubuntu 14.10

想知道怎样从Ubuntu 14.04 LTS 升级到Ubuntu 14.10么? 这就是我们要讲的

Canonical不会强迫14.04的用户升级到14.10这个中间版本

但这并不意味着 不能将你的坚如磐石的Trusty Tahr升级到(有点让人印象深刻的)Utopic Unicorn。

要得到非LTS版本的Ubuntu发布通知,你需要在软件和更新工具中选择。这个很直接。

  • 打开 ‘软件和更新
  • 选择 ‘更新’ 选项
  • 进入‘有新版本Ubuntu时通知我’的选项
  • 在下拉菜单选项中将‘对于长期支持版本’改成‘对于任何版本

切换后你会想快点更新。

现在准备就绪!Canonical此刻会弹出“升级”提示给用户(相比较普通的ISO镜像而言经常延迟)可以通过软件更新工具更新到14.10了。


via: http://www.omgubuntu.co.uk/2014/10/upgrade-ubuntu-14-04-to-14-10

作者:Joey-Elijah Sneddon 译者:geekpi 校对:wxy

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

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

Linux:Linux有问必答-如何创建和挂载XFS文件系统

问题: 我听说一个牛X的文件系统XFS,打算在我的磁盘上试试XFS。那格式化和挂载XFS文件系统的Linux命令是什么呢?

XFS是高性能文件系统,SGI为他们的IRIX平台而设计。自从2001年移植到Linux内核上,由于它的高性能,XFS成为了许多企业级系统的首选,特别是有大量数据,需要结构化伸缩性和稳定性的。例如,RHEL/CentOS 7 和Oracle Linux将XFS作为默认文件系统,SUSE/openSUSE已经为XFS做了长期支持。

XFS有许多独特的性能提升功能使他从众多文件系统中脱颖而出,像可伸缩/并行 IO,元数据日志,热碎片整理,IO 暂停/恢复,延迟分配等。

如果你想要创建和挂载XFS文件系统到你的Linux平台,下面是相关的操作命令。

Linux:Linux有问必答-如何创建和挂载XFS文件系统
Linux:Linux有问必答-如何创建和挂载XFS文件系统

安装 XFS系统工具集

首先,你需要安装XFS系统工具集,这样允许你执行许多XFS相关的管理任务。(例如:格式化,扩展,修复,设置配额,改变参数等)

Debian, Ubuntu , Linux Mint系统:

$ sudo apt-get install xfsprogs

Fedora, CentOS, RHEL系统:

$ sudo yum install xfsprogs

其他版本Linux:

$ sudo pacman -S xfsprogs

创建 XFS格式分区

先准备一个分区来创建XFS。假设你的分区在/dev/sdb,如下:

$ sudo fdisk /dev/sdb
Linux:Linux有问必答-如何创建和挂载XFS文件系统
Linux:Linux有问必答-如何创建和挂载XFS文件系统

假设此创建的分区叫/dev/sdb1。

接下来,格式化分区为XFS,使用mkfs.xfs命令。如果已有其他文件系统创建在此分区,必须加上”-f”参数来覆盖它。

$ sudo mkfs.xfs -f /dev/sdb1
Linux:Linux有问必答-如何创建和挂载XFS文件系统
Linux:Linux有问必答-如何创建和挂载XFS文件系统

至此你已经准备好格式化后分区来挂载。假设/storage是XFS本地挂载点。使用下述命令挂载:

$ sudo mount -t xfs /dev/sdb1 /storage

验证XFS挂载是否成功:

$ df -Th /storage

如果你想要启动时自动挂载XFS分区在/storage上,加入下列行到/etc/fstab:

/dev/sdb1  /storage xfs  defaults  0  0

via: http://ask.xmodulo.com/create-mount-xfs-file-system-linux.html

译者:Vic___/VicYu 校对:wxy

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

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

Linux:极速蜗牛:apt-fast

如果你在Debian或Ubuntu系统上经常感觉到apt-getaptitude包安装速度过慢,那么这里就有几种改善这一情况的方法。你有没有考虑过改变正被使用的默认镜像站点?你有没有排除因特网连接的上游带宽成为瓶颈的可能?

如果不是这些原因,你可以尝试第三个选择:使用apt-fast工具。apt-fast实际上是一个围绕apt-get和aptitude所写的shell脚本容器,它能加速包的下载速度。apt-fast本质上采用aria2下载工具,这款工具能够以“块”的方式从多个镜像并行下载一个文件(就像BitTorrent下载)。

Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast

在Debian或Ubuntu上安装apt-fast

下面是在基于Debian的Linux上安装apt-fast的步骤

Debian

$ sudo apt-get install aria2
$ wget https://github.com/ilikenwf/apt-fast/archive/master.zip
$ unzip master.zip
$ cd apt-fast-master
$ sudo cp apt-fast /usr/bin
$ sudo cp apt-fast.conf /etc
$ sudo cp ./man/apt-fast.8 /usr/share/man/man8
$ sudo gzip /usr/share/man/man8/apt-fast.8
$ sudo cp ./man/apt-fast.conf.5 /usr/share/man/man5
$ sudo gzip /usr/share/man/man5/apt-fast.conf.5

Ubuntu 14.04 以及更高版本

$ sudo add-apt-repository ppa:saiarcot895/myppa
$ sudo apt-get update
$ sudo apt-get install apt-fast

Ubuntu 11.04 到 Ubuntu 13.10

$ sudo add-apt-repository ppa:apt-fast/stable
$ sudo apt-get update
$ sudo apt-get install apt-fast

在安装期间,你需要选择一个默认的软件包管理器 (e.g., apt-get. aptitude ),还需要设置其余选项。但是你可以随时通过编辑配置文件 /etc/apt-fast/conf 来更改设置。

Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast

配置 apt-get

安装完成后,你需要在/etc/apt-fast.conf里配置apt-fast使用的一系列镜像。

你可以在下面的URL中找到一系列Debian/Ubuntu镜像。

选择完那些地理上靠近你的镜像后,你需按照下面的格式将选择的镜像加入到/etc/apt-fast.conf。

$ sudo vi /etc/apt-fast.conf

Debian:

MIRRORS=('http://ftp.us.debian.org/debian/,http://carroll.aset.psu.edu/pub/linux/distributions/debian/,http://debian.gtisc.gatech.edu/debian/,http://debian.lcs.mit.edu/debian/,http://mirror.cc.columbia.edu/debian/')

Ubuntu/Mint:

MIRRORS=('http://us.archive.ubuntu.com/ubuntu,http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive/,http://mirror.cc.vt.edu/pub2/ubuntu/,http://mirror.umd.edu/ubuntu/,http://mirrors.mit.edu/ubuntu/')

如上面所示,对于一个特定档案的个别镜像,需要用逗号分割开来。你需要在/etc/apt/sources.list的MIRRORS字符串中包含默认的镜像指定站点。

使用apt-fast安装一个包

现在你就可以测试apt-fast的强大了。下面是使用apt-fast的示例:

apt-fast [apt-get options and arguments]
apt-fast [aptitude options and arguments]
apt-fast { { install | upgrade | dist-upgrade | build-dep | download  | source  } [ -y | --yes | --assume-yes | --assume-no ]   ... | clean }

使用apt-fast安装包:

 $ sudo apt-fast install texlive-full

在当前目录下载软件包,但不安装:

 $ sudo apt-fast download texlive-full
Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast

如前面所示,apt-fast的并行下载是通过aria2完成的。你可以看到如下图般从多个镜像并行下载。

$ sudo netstat -nap | grep aria2c
Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast

请注意,apt-fast并没有加速”apt-get update”。并行下载只在”install”, “upgrade”, “dist-upgrage”和”build-dep”操作中触发。其余的操作,apt-fast就会简单地回到默认的包管理器apt-get或aptitude。

apt-fast有多快?

为了比较apt-fast和apt-get,我尝试在两个相同的Ubuntu实例上使用两种方法安装几个软件包。下面的图表展示了所有软件包安装的时间(单位为秒)。

Linux:极速蜗牛:apt-fast
Linux:极速蜗牛:apt-fast

正如你所见到的,apt-fast确实比apt-get快(e.g. 快3–4秒),特别是安装庞大软件包的时候。

当然,安装性能的提高程度还依赖你上游因特网连通性。以我为例,我有富足的带宽来支持我的上游连接。这也是为什么我看到并行下载带来了成功的提高。


via: http://xmodulo.com/speed-slow-apt-get-install-debian-ubuntu.html

作者:Dan Nanni 译者:su-kaiyao 校对:wxy

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

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

Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置

提问: 我使用libvirt和virt-manager在我的Linux系统上创建虚拟机。我注意到虚拟机镜像位于/var/lib/libvirt/images目录。有没有办法改变虚拟机镜像的默认路径?

libvirt和它的GUI前端virt-manager可以使用不同的虚拟机管理程序创建和管理VM,例如LVM和Xen。默认上所有的虚拟机镜像通过libvirt创建到/var/lib/libvirt/images目录。然而,这有时并不是我们希望的。比如 /var/lib/libvirt/images 此处的磁盘分区大小有限。或者你想要存储所有的虚拟机镜像到一个特定的用于管理的仓库中。

Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置
Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置

实际上,你可以非常容易地改变libvirt镜像的默认目录,或者称之为“存储池”。

有两种方法可以改变默认存储池。

方法一: Virt-Manager GUI

如果你正在使用virt-manager GUI程序,改变默认存储池非常容易。

进入virt-manager的菜单GUI “编辑” -> “连接细节”。

Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置
Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置

你可以看到如下所是的默认存储池。在窗口的左下角,点击叉形按钮,将会停止默认的存储池。存储池一旦停止后,点击右边的垃圾桶,将会删除存储池。注意这个动作不会删除池中的镜像。

现在点击左边的加号增加一个新的存储池。

Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置
Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置

输入新的存储池的名字(比如:default),并且选择存储池的类型。本例中,因为我们只是改变存储池目录所以选择“文件系统目录”。

Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置
Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置

输入新的存储池路径(比如,/storage)。

Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置
Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置

这时,新的存储池应该启动了,并且自动在你创建一个新的虚拟机的时候使用。

Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置
Linux:Linux 有问必答:如何改变libvirt VM镜像的默认位置

方法二: Virsh 命令行

另外一个改变默认存储池目录的方法是使用来自libvirt包的virsh 命令行工具。

首先,运行下面的命令来导出默认存储池的XML定义。

 $ virsh pool-dumpxml default > pool.xml

用文本编辑器打开XML文件,并且改变节点中的/var/lib/libvirt/images改成新的地址。


  default
  0ec0e393-28a2-e975-feec-0c7356f38d08
  975762788352
  530052247552
  445710540800
  
  
  
    /var/lib/libvirt/images
    
      0711
      -1
      -1
    
  

移除现在的默认池。

$ virsh pool-destroy default

Pool default destroyed

现在创建一个基于更新后的XML文件的新存储池。

$ virsh pool-create pool.xml

Pool default created from pool.xml

这时,默认池已经改变到新的地址了,并且可以使用了。


via: http://ask.xmodulo.com/change-default-location-libvirt-vm-images.html

译者:geekpi 校对:wxy

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

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

Linux:如何在Ubuntu 14.04 LTS上安装MariaDB

MariaDB是一个开源数据库且100%与MySQL兼容,目标是替代MySQL数据库。

MariaDB的背景 :

2008年,MySQL被后来被Oracle在2010年收购的Sun Microsystems收购了。 最初被Sun公司的收购由于符合项目的需要而受到MySQL社区的欢呼,但是这种情绪并没有持续太久,接下来被Oracle的收购,不幸期望远远低于预期。许多MySql的开发者离开了Sun和Oracle公司开始新的项目。在他们中间就有MySQL的创建者以及项目长期技术带头人之一的Michael ‘Monty’ Widenius。Monty和他的团队创建了MySQL的一个fork版本并且命名它为MariaDB

本篇我们会讨论如何在Ubuntu上安装MariaDB。默认上MariaDB的包并没有在Ubuntu仓库中。要安装MariaDB,我们首先要设置MariaDB仓库。

设置 MariaDB 仓库

$ sudo apt-get install software-properties-common
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
$ sudo add-apt-repository 'deb http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu trusty main'

安装 MariaDB :

$ sudo apt-get update
$ sudo apt-get install mariadb-server

在安装中,你会被要求设置MariaDB的root密码。

Linux:如何在Ubuntu 14.04 LTS上安装MariaDB
Linux:如何在Ubuntu 14.04 LTS上安装MariaDB

从命令行连接到MariaDB :

linuxtechi@mail:~$ mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 40
Server version: 10.0.14-MariaDB-1~trusty-log mariadb.org binary distribution
Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
MariaDB [(none)]>

MariaDB 服务

$ sudo /etc/init.d/mysql stop
$ sudo /etc/init.d/mysql start

via: http://www.linuxtechi.com/install-mariadb-in-ubuntu/

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

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

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

Linux:Libvirt 虚拟化库介绍

Libvirt 库是一种实现 Linux 虚拟化功能的 Linux® API,它支持各种虚拟机监控程序,包括 Xen 和 KVM,以及 QEMU 和用于其他操作系统的一些虚拟产品。本文主要探讨 libvirt 及其用途和架构。

Linux:Libvirt 虚拟化库介绍
Linux:Libvirt 虚拟化库介绍

讲到向外扩展计算(比如云计算),libvirt 可能是您从未听说过的最重要的库之一。libvirt 提供一种虚拟机监控程序不可知的 API 来安全管理运行于主机上的来宾操作系统。libvirt 本身不是一种工具, 它是一种可以建立工具来管理来宾操作系统的 API。libvirt 本身构建于一种抽象的概念之上。它为受支持的虚拟机监控程序实现的常用功能提供通用的 API。libvirt 起初是专门为 Xen 设计的一种管理 API,后来被扩展为可支持多个虚拟机监控程序。

基本架构

首先让我们从用例模型视角来展开对 libvirt 的讨论,然后深入探究其架构和用途。libvirt 以一组 API 的形式存在,旨在供管理应用程序使用(见图 1 )。libvirt 通过一种特定于虚拟机监控程序的机制与每个有效虚拟机监控程序进行通信,以完成 API 请求。文章后面我将探讨如何通过 QEMU 来实现该功能。

图 1. libvirt 比较和用例模型
Linux:Libvirt 虚拟化库介绍
Linux:Libvirt 虚拟化库介绍

图中还显示了 libvirt 所用术语对照。这些术语很重要,因为在对 API 命名时会用到它们。两个根本区别在于,libvirt 将物理主机称作节点,将来宾操作系统称作。这里需要注意的是,libvirt(及其应用程序)在宿主 Linux 操作系统(域 0)中运行。

控制方式

使用 libvirt,我们有两种不同的控制方式。第一种如 图 1 所示,其中管理应用程序和域位于同一节点上。 在本例中,管理应用程序通过 libvirt 工作,以控制本地域。当管理应用程序和域位于不同节点上时,便产生了另一种控制方式。在本例中需要进行远程通信(参见 图 2)。该模式使用一种运行于远程节点上、名为 libvirtd 的特殊守护进程。当在新节点上安装 libvirt 时该程序会自动启动,且可自动确定本地虚拟机监控程序并为其安装驱动程序(稍后讨论)。该管理应用程序通过一种通用协议从本地 libvirt 连接到远程 libvirtd。对于 QEMU,协议在 QEMU 监视器处结束。QEMU 包含一个监测控制台,它允许检查运行中的来宾操作系统并控制虚拟机(VM)各部分。

图 2. 使用 libvirtd 控制远程虚拟机监控程序
Linux:Libvirt 虚拟化库介绍
Linux:Libvirt 虚拟化库介绍

虚拟机监控程序支持

为支持各种虚拟机监控程序的可扩展性,libvirt 实施一种基于驱动程序的架构,该架构允许一种通用的 API 以通用方式为大量潜在的虚拟机监控程序提供服务。这意味着,一些虚拟机监控程序的某些专业功能在 API 中不可见。另外,有些虚拟机监控程序可能不能实施所有 API 功能,因而在特定驱动程序内被定义为不受支持。图 3 展示了 libvirt API 与相关驱动程序的层次结构。这里也需要注意,libvirtd 提供从远程应用程序访问本地域的方式。

图 3. 基于驱动程序的 libvirt 架构
Linux:Libvirt 虚拟化库介绍
Linux:Libvirt 虚拟化库介绍

在撰写此文时,libvirt 为表 1 所列的虚拟机监控程序实现了驱动程序。随着新的虚拟机监控程序在开源社区出现,其他驱动程序无疑也将可用。

表 1. libvirt 支持的虚拟机监控程序
虚拟机监控程序 描述
Xen 面向 IA-32,IA-64 和 PowerPC 970 架构的虚拟机监控程序
QEMU 面向各种架构的平台仿真器
Kernel-based Virtual Machine (KVM) Linux 平台仿真器
Linux Containers(LXC) 用于操作系统虚拟化的 Linux(轻量级)容器
OpenVZ 基于 Linux 内核的操作系统级虚拟化
VirtualBox x86 虚拟化虚拟机监控程序
User Mode Linux 面向各种架构的 Linux 平台仿真器
Test 面向伪虚拟机监控程序的测试驱动器
Storage 存储池驱动器(本地磁盘,网络磁盘,iSCSI 卷)

libvirt 和虚拟 shell

上面已经介绍了 libvirt 的一些架构,接下来看一下如何使用 libvirt 虚拟化 API 的一些示例。首先介绍一种名为 virsh(虚拟 shell)的应用程序,它构建于 libvirt 之上。该 shell 允许以交互(基于 shell)方式使用多个 libvirt 功能。在本节中,我使用 virsh 演示了一些 VM 操作。

第一步是要定义域配置文件(如下面的 清单 1 所示)。该代码指定了定义域所需的所有选项 — 从虚拟机监控程序(仿真器)到域使用的资源以及外围配置(比如网络)。注意,这只是个简单的配置,libvirt 真正支持的属性更加多样化。例如,您可以指定 BIOS 和主机引导程序,域要使用的资源,以及要用到的设备 — 从软盘和 CD-ROM 到 USB 和 PCI 设备。

域配置文件定义该 QEMU 域要使用的一些基本元数据,包括域名、最大内存、初始可用内存(当前)以及该域可用的虚拟处理器数量。您不需要自己分配 Universally Unique Idenifier (UUID),而是让 libvirt 分配。您需要为该平台定义要仿真的机器类型 — 在本例中是被完全虚拟化(hvm)的 686 处理器。您需要为域定义仿真器的位置(以备需要支持多个同类型仿真器时使用)和虚拟磁盘。这里注意要指明 VM,它是以 Virtual Machine Disk(VMDK)格式存在的 ReactOS 操作系统。最后,要指定默认网络设置,并使用面向图形的 Virtual Network Computing (VNC)。

清单 1. 域配置文件


  ReactOS-on-QEMU
  
  131072
  131072
  1
  
    hvm
  
  
    usr/bin/qemu
    
      
      
    
    
      
    
    
  

完成了域配置文件之后,现在开始使用 virsh 工具启动域。virsh 工具为要执行的特定动作采用命令参数。在启动新域时,使用 create 命令和域配置文件:

清单 2. 启动新域
mtj@mtj-desktop:~/libvtest$ virsh create react-qemu.xml
Connecting to uri: qemu:///system
Domain ReactOS-on-QEMU created from react-qemu.xml
mtj@mtj-desktop:~/libvtest$

这里要注意用于连接到域(qemu:///system)的 Universal Resource Indicator (URI)。该本地 URI 连接到本地 QEMU 驱动程序的系统模式守护进程上。要通过主机 shinchan 上的 Secure Shell (SSH) 协议连接到远程 QEMU 虚拟机监控程序,可以使用 URL qemu+ssh://shinchan/。

下一步,您可以使用 virsh 内的 list 命令列出给定主机上的活动域。这样做可以列出活动域,域 ID,以及它们的状态,如下所示:

清单 3. 列出活动域
mtj@mtj-desktop:~/libvtest$ virsh list
Connecting to uri: qemu:///system
 Id Name                 State
----------------------------------
  1 ReactOS-on-QEMU      running
mtj@mtj-desktop:~/libvtest$

注意,这里定义的名称是在域配置文件元数据中定义过的名称。可以看到,该域的域名是 1 且正在运行中。

您也可以使用 suspend 命令中止域。该命令可停止处于调度中的域,不过该域仍存在于内存中,可快速恢复运行。下面的例子展示了如何中止域,执行列表查看状态,然后重新启动域:

清单 4. 中止域,检查状态,并重新启动
mtj@mtj-desktop:~/libvtest$ virsh suspend 1
Connecting to uri: qemu:///system
Domain 1 suspended
mtj@mtj-desktop:~/libvtest$ virsh list
Connecting to uri: qemu:///system
 Id Name                 State
----------------------------------
  1 ReactOS-on-QEMU      paused
mtj@mtj-desktop:~/libvtest$ virsh resume 1
Connecting to uri: qemu:///system
Domain 1 resumed
mtj@mtj-desktop:~/libvtest$

virsh 工具也支持许多其他命令,比如保存域的命令(save),恢复已存域的命令(restore),重新启动域的命令(reboot),以及其他命令。您还可以从运行中的域(dumpxml)创建域配置文件。

到目前为止,我们已经启动并操作了域,但是如何连接域来查看当前活动域呢?这可以通过 VNC 实现。要创建表示特定域图形桌面的窗口,可以使用 VNC:

清单 5. 连接到域
mtj@mtj-desktop:~/libvtest$ xvnc4viewer 127.0.0.1 0

libvirt 和 Python

上一个例子说明了如何使用命令行工具 virsh 实现对域的控制。现在我们看一个使用 Python 来控制域的例子。Python 是受 libvirt 支持的脚本语言,它向 libvirt API 提供完全面向对象的接口。

在本例中,我研究了一些基本操作,与之前用 virsh 工具(list、suspend、resume 等)展示的操作类似。Python 示例脚本见 清单 6。在本例中,我们从导入 libvirt 模块开始。然后连接到本地 QEMU 虚拟机监控程序。从这里开始,重复可用的域 ID;对每个 ID 创建一个域对象,然后中止,继续,最后删除该域。

清单 6. 用于控制域的示例 Python 脚本(libvtest.py)
import libvirt
conn = libvirt.open('qemu:///system')
for id in conn.listDomainsID():
	dom = conn.lookupByID(id)
	print "Dom %s  State %s" % ( dom.name(), dom.info()[0] )
	dom.suspend()
	print "Dom %s  State %s (after suspend)" % ( dom.name(), dom.info()[0] )
	dom.resume()
	print "Dom %s  State %s (after resume)" % ( dom.name(), dom.info()[0] )
	dom.destroy()

虽然这只是个简单示例,我们仍然可以看到 libvirt 通过 Python 提供的强大功能。通过一个简单的脚本就能够重复所有本地 QEMU 域,发行有关域的信息,然后控制域。该脚本的结果如 清单 7 所示。

清单 7. 清单 6 中的 Python 脚本输出的结果
mtj@mtj-desktop:~/libvtest$ python libvtest.py
Dom ReactOS-on-QEMU  State 1
Dom ReactOS-on-QEMU  State 3 (after suspend)
Dom ReactOS-on-QEMU  State 1 (after resume)
mtj@mtj-desktop:~/libvtest$

API 概述

高级 libvirt API 可划分为 5 个 API 部分:虚拟机监控程序连接 API、域 API、网络 API、存储卷 API 以及存储池 API。

为给定虚拟机监控程序创建连接后会产生所有 libvirt 通信(例如,清单 6 中所示的 open 调用)。该连接为所有其他要使用的 API 提供路径。在 C API 中,该行为通过 virConnectOpen 调用(以及其他进行认证的调用)提供。这些函数的返回值是一个 virConnectPtr 对象,它代表到虚拟机监控程序的一个连接。该对象作为所有其他管理功能的基础,是对给定虚拟机监控程序进行并发 API 调用所必需的语句。重要的并发调用是 virConnectGetCapabilities 和 virNodeGetInfo,前者返回虚拟机监控程序和驱动程序的功能,后者获取有关节点的信息。该信息以 XML 文档的形式返回,这样通过解析便可了解可能发生的行为。

进入虚拟机监控程序后,便可以使用一组 API 调用函数重复使用该虚拟机监控程序上的各种资源。virConnectListDomains API 调用函数返回一列域标识符,它们代表该虚拟机监控程序上的活动域。

API 实现大量针对域的函数。要探究或管理域,首先需要一个 virDomainPtr 对象。您可通过多种方式获得该句柄(使用 ID、UUID 或域名)。继续来看重复域的例子,您可以使用该函数返回的索引表并调用 virDomainLookupByID 来获取域句柄。有了该域句柄,就可以执行很多操作,从探究域(virDomainGetUUID、virDomainGetInfo、virDomainGetXMLDesc、virDomainMemoryPeek)到控制域(virDomainCreate、virDomainSuspend、virDomainResume、virDomainDestroy 和 virDomainMigrate)。

您还可使用 API 管理并检查虚拟网络和存储资源。建立了 API 模型之后,需要一个 virNetworkPtr 对象来管理并检查虚拟网络,且需要一个virStoragePoolPtr(存储池)或 virStorageVolPtr(卷)对象来管理这些资源。

API 还支持一种事件机制,您可使用该机制注册为在特定事件(比如域的启动、中止、恢复或停止)发生时获得通知。

语言绑定

libvirt 库用 C (支持 C++)实现,且包含对 Python 的直接支持。不过它还支持大量语言绑定。目前已经对 Ruby、Java™ 语言,Perl 和 OCaml 实施了绑定。在从 C# 调用 libvirt 方面我们已做了大量工作。libvirt 支持最流行的系统编程语言(C 和 C++)、多种脚本语言、甚至一种统一的函数型语言(Objective caml)。因此,不管您侧重何种语言,libvirt 都会提供一种路径来帮助您控制域。

使用 libvirt 的应用程序

仅从本文已经展示的一小部分功能上便可看出 libvirt 提供的强大功能。且如您所愿,有大量应用程序正成功构建于 libvirt 之上。其中一个有趣的应用程序就是 virsh(这里所示),它是一种虚拟 shell。还有一种名为 virt-install 的应用程序,它可用于从多个操作系统发行版供应新域。virt-clone 可用于从另一个 VM 复制 VM(既包括操作系统复制也包括磁盘复制)。一些高级应用程序包括多用途桌面管理工具 virt-manager 和安全连接到 VM 图形控制台的轻量级工具 virt-viewer。

构建于 libvirt 之上的一种最重要的工具名为 oVirt。oVirt VM 管理应用程序旨在管理单个节点上的单个 VM 或多个主机上的大量 VM。除了可以简化大量主机和 VM 的管理之外,它还可用于跨平台和架构自动化集群,负载平衡和工作。

深入探究

从这篇简短的文章可以看出,libvirt 是一种用来构建应用程序的强大库,能够跨系统的大型网络在不同的虚拟机监控程序环境中管理域。鉴于云计算的日渐流行,libvirt 无疑也会随之发展,不断获得新的应用程序和用户。撰写本文时,libvirt 也仅有四年的发展史,因此在大规模可伸缩计算领域中相对较新。libvirt 将来肯定会有很大发展。

参考资料

学习

  • 查阅 libvirt Web 站点,了解 libvirt 最新信息并下载最新版本。您还会找到完整版的 API 参考手册,它详细介绍了核心界面和错误处理界面。
  • libvirt 支持大量虚拟机监控程序,包括:
  • 在 “虚拟 Linux”(developerWorks,2006 年 12 月)中,了解关于各种类型的虚拟化的更多信息。云计算依靠虚拟化来最大限度地使用可用服务器的资源。通过虚拟化,服务器可寄宿多个操作系统和应用程序集。
  • 在 “LXC:Linux 容器工具”(developerWorks,2009 年 2 月)中,您可了解更多有关专门为 LXC 构建管理工具的信息。这里会发现与 libvirt 管理方法的一些对应之处。

来源:http://www.ibm.com/developerworks/cn/linux/l-libvirt/

Linux:pidstat – 监控并统计Linux进程的数据

pidstat命令用来监控被Linux内核管理的独立任务(进程)。它输出每个受内核管理的任务的相关信息。pidstat命令也可以用来监控特定进程的子进程。间隔参数用于指定每次报告间的时间间隔。它的值为0(或者没有参数)说明进程的统计数据的时间是从系统启动开始计算的。

Linux:pidstat - 监控并统计Linux进程的数据
Linux:pidstat – 监控并统计Linux进程的数据

如何安装pidstat

pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。

在Debian/Ubuntu系统中可以使用下面的命令来安装

# apt-get install sysstat

CentOS/Fedora/RHEL版本的linux中则使用下面的命令:

# yum install sysstat

使用pidstat

使用pidstat不加任何参数等价于加上-p参数,但是只有正在活动的任务会被显示出来。

# pidstat
Linux:pidstat - 监控并统计Linux进程的数据
Linux:pidstat – 监控并统计Linux进程的数据

在结果中你能看到如下内容:

  • PID – 被监控的任务的进程号
  • %usr – 当在用户层执行(应用程序)时这个任务的cpu使用率,和 nice 优先级无关。注意这个字段计算的cpu时间不包括在虚拟处理器中花去的时间。
  • %system – 这个任务在系统层使用时的cpu使用率。
  • %guest – 任务花费在虚拟机上的cpu使用率(运行在虚拟处理器)。
  • %CPU – 任务总的cpu使用率。在SMP环境(多处理器)中,如果在命令行中输入-I参数的话,cpu使用率会除以你的cpu数量。
  • CPU – 正在运行这个任务的处理器编号。
  • Command – 这个任务的命令名称。

I/O 统计数据

通过使用-d参数来得到I/O的统计数据。比如:

# pidstat -d -p 8472

pidstat io

IO 输出会显示一些内的条目:

  • kB_rd/s – 任务从硬盘上的读取速度(kb)
  • kB_wr/s – 任务向硬盘中的写入速度(kb)
  • kB_ccwr/s – 任务写入磁盘被取消的速率(kb)

页面失败和内存使用

使用-r标记你能够得到内存使用情况的数据。

pidstat pf mem

重要的条目:

  • minflt/s – 从内存中加载数据时每秒出现的小的错误的数目,这些不要求从磁盘载入内存页面。
  • majflt/s – 从内存中加载数据时每秒出现的较大错误的数目,这些要求从磁盘载入内存页面。
  • VSZ – 虚拟容量:整个进程的虚拟内存使用(kb)
  • RSS – 长期内存使用:任务的不可交换物理内存的使用量(kb)

举例

1. 你可以通过使用下面的命令来监测内存使用

# pidstat -r 2 5

这会给你5份关于page faults的统计数据结果,间隔2秒。这将会更容易的定位出现问题的进程。

2. 显示所有mysql服务器的子进程

# pidstat -T CHILD -C mysql

3. 将所有的统计数据结合到一个便于阅读的单一报告中:

# pidstat -urd -h

via: http://linoxide.com/linux-command/linux-pidstat-monitor-statistics-procesess/

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

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

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

Linux:小白技巧:openSUSE设置服务服务通过防火墙

Linux:小白技巧:openSUSE设置服务服务通过防火墙
Linux:小白技巧:openSUSE设置服务服务通过防火墙

正如你所知道的,在openSUSE/SUSE系统上,不是所有的服务是激活并且默认允许的。例如,ssh服务是默认不允许通过防火墙的。当然,这是一个安全措施,但是有时我们必须需要ssh服务从远程地点来连接服务器。

这个小教程将会展示如何允许服务,不单是ssh,也包括所有其他的服务,如http,ftp等,通过服务器。我们可以使用YaST命令允许服务通过防火墙,YaST命令是openSUSE和其企业版,默认安装配置工具。

首先,在菜单中打开YaST控制中心。选择Security and Users(安全和用户) -> Firewall(防火墙)

Linux:小白技巧:openSUSE设置服务服务通过防火墙
Linux:小白技巧:openSUSE设置服务服务通过防火墙

接下来,打开Allowed Services(已允许服务)选项卡;从Service to Allow(选择需要允许的服务)下拉框中选择Secure Shell Service(ssh服务),然后 Add(增加)Next(下一步),最后Finish(完成),搞定。

Linux:小白技巧:openSUSE设置服务服务通过防火墙
Linux:小白技巧:openSUSE设置服务服务通过防火墙

就是如此简单!ssh服务已经允许通过防火墙,这样你就可以在远程系统连接这个系统了。就像这样,我们可以同样设置其他服务。

鼓掌!!


via: http://www.unixmen.com/quick-tip-allow-services-firewall-opensuse/

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

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

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

Linux:如何在 systemd 下管理Linux系统的时间和日期

timedatectl是用来查询和修改系统时间和配置的Linux应用程序。它是systemd 系统服务管理的一部分,并且允许你检查和修改系统时钟的配置。

在这篇文章中,我们将涉及该小巧但十分重要应用程序的所有方面。

Linux:如何在 systemd 下管理Linux系统的时间和日期
Linux:如何在 systemd 下管理Linux系统的时间和日期

系统当前的时间状态

想要查看系统当前日期/时间,以及可使用不带任何参数的命令查看当前系统时间配置,可以这样:

# timedatectl

输入的结果就像这样:

Linux:如何在 systemd 下管理Linux系统的时间和日期
Linux:如何在 systemd 下管理Linux系统的时间和日期

修改日期

想要修改系统日期,你可以简单地使用timedatectl设置时间命令,紧随命令的是YYYY-MM-DD格式的日期,YYYY代表年,MM代表2位数字的月份,DD代表2位数字的天。举个例子,如果你想把日期改为2015年2月4号,你应该使用下面的命令:

# timedatectl 2015-02-04

修改时间

想要修改时间,你可以以相同的方式使用该工具,但是使用的格式为HH:MM:SS,HH代表24小时制的时钟,MM代表分钟,SS代表秒钟。想将当前时间设为22:04:43,使用下面的命令:

# timedatectl 22:04:43

修改时区

设置正确的时区是保持时间同步的关键,特别是在你使用NTP协议同步的时候。首先,你应该使用list-timezones选项列出你所在区域的可用时区,你也可以使用grep和more来让格式方便阅读:

# timedatectl list-timezones | grep America | more

这将显示一个简单的滚动列表格式。

之后,你就会知道你想设置的时区是如何命名的,然后使用下面的命令修改它:

# timedatectl set-timezone America/Los_Angeles

设置本地时钟

实时时钟(RTC),通常被称为硬件时钟,完全独立于操作系统当前状态,甚至可以在计算机关闭的时候工作。你可以配置系统使用国际时间(UTC)或当地时间来校正RTC。注意,使用当地时区校正RTC并没有完美支持,而且还有可能因为时区变化和夏令时调整引起许多问题。如果有可能,在UTC模式下校正RTC。这一做法的唯一问题是,其他操作系统可能不完全支持它(如果你在同一台机器上运行2个操作系统的话)。

使用UTC模式校正RTC,使用下面的命令:

# timedatectl set-local-rtc 0

使用当地时间校正,使用:

# timedatectl set-local-rtc 1

设置NTP同步

网络时间协议(NTP)是在分组交换、可变数据延迟的计算机系统间进行时钟同步的网络协议。NTP被设计使用几毫秒的协调通用时间(UTC)来同步所有参与的计算机。如果你希望设置NTP同步,你可以使用set-ntp选项设置。使用“no”关闭NTP同步,使用“yes”开启。

# timedatectl set-ntp yes

via: http://linoxide.com/linux-command/timedatectl-change-time-date-systemd/

作者:Adrian Dinu 译者:su-kaiyao 校对:wxy

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

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

Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像

如果你喜欢尝试最新版甚至是 beta 版的 Linux 发行版来满足你的好奇心,并始终保持是最新版,那么你就会时常遇到下载较大的 ISO 镜像的烦恼。提供 ISO 的人通常会使用 ISO 镜像的 .torrent 文件来减少服务器的带宽消耗。P2P 下载对于使用者来说好处也是很明显的(就下载速度而言),特别是当流行的 Linux 发行版有新版本发布并上传供下载,每个人同时在下载做种的时候。

Ubuntu 14.10 (utopic Unicorn) 这刚刚发布不久,因此现在在 BitTorrent 网络上应该有很多种子可以下载该版本。虽然有很多基于图形界面的 BitTorrent 客户端,不过我将展示如何通过基于简单的命令行界面的 BitTorrent 客户端下载 ISO 镜像,如果是在远程无图形界面的服务器上的话这会很方便。在另外一篇教程里面,我还会演示如何验证已下载的 ISO 镜像的完整性

我今天要使用的基于命令行的 BitTorrent 客户端是 transmission-cli。正如你可能知道的那样,Transmission 是最流行的基于图形界面的 BitTorrent 客户端之一。transmission-cli 是它的简装的命令行版本。

Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像
Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像

在 Linux 上安装 Transmission-cli

要安装 transmission-cli,你不必安装完整的基于图形界面的 Transmission,这是听起来不错。

在 Debian、Ubuntu 或者是基于它们的发行版上:

$ sudo apt-get install transmission-cli

在 Fedora 上:

$ sudo yum install transmission-cli

在 CentOS 或者 RHEL 上(在安装了 EPEL 仓库之后):

$ sudo yum install transmission-cli

通过 transmission-cli 快速地下载 ISO 镜像

transmission-cli的使用非常简单。如果你懒于学习它的命令行选项,所有你要做的事情就是下载 .torrent 文件并运行命令。这会自动寻找可用的种子并从那里下载 ISO 文件。

$ wget http://releases.ubuntu.com/14.10/ubuntu-14.10-desktop-amd64.iso.torrent
$ transmission-cli ubuntu-14.10-desktop-amd64.iso.torrent
Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像
Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像

一旦 ISO 镜像下载完成,它默认存储在 ~/Downloads 文件夹中。下载 1GB 的 Ubuntu ISO 镜像只用了我 5 分钟的时间。

Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像
Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像

程序下载 ISO 镜像完成后,你会在终端中看到“状态由未完成变为完成”的提示。要注意的是 transmission-cli 会继续运行并做种以便于其他下载者下载。可以按 Ctrl+C 来退出。

为重复使用定制下载选项

如果你经常使用 transmission-cli ,那么值得花时间来熟悉一下它的命令行选项。

  • “-w /path/to/download-directory” 选项指定下载文件保存的文件夹。

  • “-f /path/to/finish-script” 选项设置当前下载完成后要运行的脚本。注意 transmission-cli 默认在文件下载完成后继续运行。如果你想在成功下载完成后自动关闭 transmission-cli,你可以使用这个选项。下面这个简单的脚本可以完成这个功能。

    #!/bin/sh
    sleep 10
    killall transmission-cli
    
  • 如果你想为 transmission-cli 分配上传/下载带宽限制,你可以使用 “-d ” 和 “-u ” 选项。如果你不想限制带宽使用,仅仅指定 “D” 或 “-U” 选项即可。

这有一个更高级的 transmission-cli 使用范例。在这个例子中,命令行客户端在成功下载后自动退出。下载速度不限而上传速度限制为 50KB/s。

$ transmission-cli -w ~/iso -D -u 50 -f ~/finish.sh ubuntu-14.10-desktop-amd64.iso.torrent
Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像
Linux:如何在命令行下使用 BitTorrent 下载 ISO 镜像

via: http://xmodulo.com/download-iso-image-bittorrent-command-line.html

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

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

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

Linux:如何使用 SHA256 校验下载的文件

当你下载了一个 ISO 镜像,特别是从 BitTorrent 网络上很多未知的种子处下载的,通常建议要验证下载镜像的完整性。

Linux:如何使用 SHA256 校验下载的文件
Linux:如何使用 SHA256 校验下载的文件

对于 Ubuntu 发行版的情况, Canonical 提供了几个供验证使用的验校文件(如 MD5SUM, SHA1SUMS 和 SHA256SUMS)。在这个例子中我们使用 SHA256SUMS。

Linux:如何使用 SHA256 校验下载的文件
Linux:如何使用 SHA256 校验下载的文件

首先,下载下面两个文件。

$ wget http://releases.ubuntu.com/14.10/SHA256SUMS
$ wget http://releases.ubuntu.com/14.10/SHA256SUMS.gpg

第一个文件是 ISO 镜像的 SHA256 验校文件,而第二个文件(*.gpg)是验校文件的签名。第二个文件的目的是验证验校文件本身的有效性。

我们通过运行下面的命令来验证 SHA256SUMS 文件的有效性。

$ gpg --verify SHA256SUMS.gpg SHA256SUMS

gpg: Signature made Thu 23 Oct 2014 09:36:00 AM EDT using DSA key ID FBB75451
gpg: Can't check signature: public key not found

如果你得到上面的错误信息,是因为你还没有导入生成这个签名的公共密钥。因此我们现在导入需要的公共密钥。

这样做之前,你需要知道公共密钥的 “key ID”,而这在上面的 gpg 命令的输出中有显示。在这个例子中,密钥 ID 时 “FBB75451”。运行下面的命令来从官方 Ubuntu 密钥服务器导入公共密钥。

$ gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys FBB75451

既然公共密钥已经被导入,我们可以继续并重新运行之前的命令来验证签名。

gpg --verify SHA256SUMS.gpg SHA256SUMS

这次你没有看到 “public key not found” 的错误信息。如果 SHA256SUMS 文件时有效的,你会看到 “Good signature from ” 的信息。注意到你还看到一个 “This key is not certified with a trusted signature” 的警告信息。基本上这个警告信息是告诉你对导入的公共密钥没有明确信任。要避免这个警告,你可以选择指定完全信任导入的公共密钥,但你应该只有在通过其他方式审查了这个密钥之后才这样做。否则的话,你可以暂时忽略这个警告。

在验证了 SHA256SUMS 文件的完整性后,最后一个步骤是比较已下载 ISO 文件的 SHA256 验校和和 SHA256SUMS 文件中对应的验校值。你可以使用 sha256sum 命令行工具来完成这个步骤。

为方便起见,下面一行命令比较 SHA256 验校和并报告结果。

 $ sha256sum -c <(grep ubuntu-14.10-desktop-amd64.iso SHA256SUMS)

ubuntu-14.10-desktop-amd64.iso: OK

如果你看到了上面的输出信息,这表明两个验校值相匹配。这样已下载 ISO 镜像的完整性就被成功的验证了。


via: http://xmodulo.com/download-iso-image-bittorrent-command-line.html

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

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

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

Linux:Kubernetes – Google分布式容器技术初体验

Kubernetes是Google开源的容器集群管理系统。前几天写的 分布式服务框架的4项特性 中提到一个良好的分布式服务框架需要实现

服务的配置管理。包括服务发现、负载均衡及服务依赖管理。服务之间的调度及生命周期管理。

由于Kubernetes包含了上述部分特性,加上最近Google新推出的Container Engine也是基于Kubernetes基础上实现,因此最近对Kubernetes进行了一些尝试与体验。

运行环境

Kubernetes目前处于一个快速迭代的阶段,同时它的相关生态圈(比如docker,etcd)也在快速发展,这也意味没有适合新手使用非常顺畅的版本,网上的各种文档(也包括官方文档)和当前最新的发布版会有不同程度滞后或不适用的情况,因此在使用时可能会碰到各种细节的障碍,而且这些新版本碰到的问题,很有可能在网上也搜索不到解决方案。

Kubernetes设计上并未绑定Google Cloud平台,但由于以上原因,为了减少不必要的障碍,初次尝试建议使用GCE作为运行环境(尽管GCE是一个需要收费的环境)。默认的cluster启动脚本会创建5个GCE instance,测试完需要自己及时主动删除。为了避免浪费,可以将minions减少,同时instance类型选择f1-micro。费用方面一个f1-micro instance运行1个月大约50元人民币,因此用GCE来测试Kubernetes,如果仅是测试时候开启的话,并不会产生太多费用。

Pods及Replication Controller

Kubernetes的基本单元是pods,用来定义一组相关的container。Kubernetes的优点是可以通过定义一个replicationController来将同一个模块部署到任意多个容器中,并且由Kubernetes自动管理。比如定义了一个apache pod,通过replicationController设置启动100个replicas,系统就会在pod创建后自动在所有可用的minions中启动100个apache container。并且轻松的是,当container或者是所在的服务器不可用时,Kubernetes会自动通过启动新的container来保持100个总数不变,这样管理一个大型系统变得轻松和简单。

Linux:Kubernetes – Google分布式容器技术初体验
Linux:Kubernetes – Google分布式容器技术初体验

Service 微服务

在解决部署问题之后,分布式服务中存在的一大难题是服务发现(或者叫寻址),用户访问的前端模块需要访问系统内部的后端资源或者其他各种内部的服务,当一个内部服务通过replicationController动态部署到不同的节点后,而且还存在前文提到的动态切换的功能,前端应用如何来发现并访问这些服务?Kubernetes的另外一个亮点功能就是service,service是一个pod服务池的代理抽象,目前的实现方法是通过一个固定的虚拟IP及端口来定义,并且通过分布在所有节点上的proxy来实现内部服务对service的访问。

Kubernetes自身的配置是保存在一个etcd(类似ZooKeeper)的分布式配置服务中。服务发现为什么不通过etcd来实现?Tim的判断更多的是为了Kubernetes上的系统和具体的配置服务解耦。由于服务发现属于各个系统内部的业务逻辑,因此如果使用etcd将会出现业务代码的逻辑中耦合了etcd,这样可能会让很多架构师望而却步。

尽管没有耦合etcd,部署在Kubernetes中的服务需要通过container中的环境变量来获得service的地址。环境变量虽然简单,但它也存在很多弊端,如存在不方便动态更改等问题。另外service目前的实现是将虚拟IP通过iptables重定向到最终的pod上,作者也提到iptables定向的局限性,不适合作为大型服务的实现。

Linux:Kubernetes – Google分布式容器技术初体验
Linux:Kubernetes – Google分布式容器技术初体验

小结

总的看来Kubernetes提供的能力非常令人激动,pod、replicationController以及service的设计非常简单实用。但如果立即将服务迁移到Kubernetes,还需要面对易变的环境。另外一方面尽管Kubernetes提供health check的机制,但service生产环境所需的苛刻的可用性还未得到充分的验证。

安装说明

Kubernetes cluster简单安装说明如下,需要尝试的朋友可参考。

前提准备

一个64bit linux环境,最好在墙外的,避免访问google cloud出现超时或reset等问题;另外创建Google Cloud帐号,确保创建instances以及Cloud Storage功能可用;

安装步骤

1. 安装go语言环境(可选,如果需要编译代码则需要)

2. 安装Google cloud sdk

$ curl https://sdk.cloud.google.com | bash
$ gcloud auth login

按提示完成授权及登录

3. 安装 etcd 二进制版本(V0.4.6), 解压后将其目录加入PATH

4. 安装 kubernetes最新的relase binary版本(V0.5.1)

修改 cluster/gce/config-default.sh,主要是修改以下字段以便节约资源。

MASTER_SIZE=f1-micro
MINION_SIZE=f1-micro
NUM_MINIONS=3

在kubernetes目录运行

$ cluster/kube-up.sh

执行成功后会显示 done

5. 测试pod

以上脚本启动了examples/monitoring 下面定义的service,如果尝试启动其它自己的pods,比如启动一个tomcat集群

{
  "id": "tomcatController",
  "kind": "ReplicationController",
  "apiVersion": "v1beta1",
  "desiredState": {
    "replicas": 2,
    "replicaSelector":{"name": "tomcatCluster"},
    "podTemplate":{
  "desiredState": {
    "manifest": {
      "version": "v1beta1",
      "id": "tomcat",
      "containers": [{
        "name": "tomcat",
        "image": "tutum/tomcat",
     "ports": [
     {"containerPort":8080,"hostPort":80}
     ]
     }]
    }
  },
  "labels": {"name": "tomcatCluster"}}
  },
  "labels": {
    "name": "tomcatCluster",
  }
}

其中pod的tomcat image可以通过Docker Hub Registry https://registry.hub.docker.com/ 搜索及获取

$ cluster/kubectl.sh create -f tomcat-pod.json

创建成功后通过 cluster/kubectl.sh get pods 来查看它所在minion及ip,可以通过curl或浏览器来访问(请开启GCE防火墙端口设置)。

再定义一个 service

{
  "id": "tomcat",
  "kind": "Service",
  "apiVersion": "v1beta1",
  "port": 8080,
  "containerPort": 8080,
  "labels": {
    "name": "tomcatCluster"
  },
  "selector": {
    "name": "tomcatCluster"
  }
}

保存为 tomcat-service.json

$ cluster/kubectl.sh create -f tomcat-service.json

检查service启动后的ip及端口,由于service是内部ip,可以在GCE上通过curl来测试及验证。

$ cluster/kubectl.sh get services

6. 关闭cluster

cluster/kube-down.sh

 

来源:http://timyang.net/container/kubernetes-evaluation/

Linux:CoreOS 实战:CoreOS 及管理工具介绍

【编者按】CoreOS是一个基于Docker的轻量级容器化Linux发行版,专为大型数据中心而设计,旨在通过轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度。CoreOS作为Docker生态圈中的重要一员,日益得到各大云服务商的重视,目前已经完成了A轮融资,发展风头正劲。InfoQ希望《CoreOS实战》系列文章能够帮助读者了解CoreOS以及相关的使用方法。如果说Docker是下一代的虚拟机,那CoreOS就应该是下一代的服务器Linux,InfoQ愿和您一起探索这个新生事物。另外,欢迎加入InfoQ Docker技术交流群,QQ群号:365601355。

Linux:CoreOS 实战:CoreOS 及管理工具介绍
Linux:CoreOS 实战:CoreOS 及管理工具介绍

1. 概述

随着 Docker 的走红,CoreOS 作为一个基于 Docker 的轻量级容器化 Linux 发行版日益得到大家的重视,目前所有的主流云服务商都提供了对 CoreOS 的支持。CoreOS 是新时代下的Linux 发行版,它有哪些独特的魅力了?本篇作为《CoreOS实战》的第一部分,将向大家简要介绍 CoreOS 以及CoreOS 相关的管理工具,试图向您揭开CoreOS背后神秘的面纱。

2. CoreOS之禅

云计算新星 Docker 正在以火箭般的速度发展,与它相关的生态圈也渐入佳境,CoreOS 就是其中之一。CoreOS 是一个全新的、面向数据中心设计的 Linux 操作系统,在2014年7月发布了首个稳定版本,目前已经完成了800万美元的A轮融资。 CoreOS 专门针对大型数据中心而设计,旨在以轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度。现在CoreOS 已经推出了付费产品。通过付费,用户可以使用可视化工具管理自己的 CoreOS 集群。

与其他历史悠久、使用广泛的 Linux 操作系统相比,CoreOS 拥有下面几个优点。

Linux:CoreOS 实战:CoreOS 及管理工具介绍
Linux:CoreOS 实战:CoreOS 及管理工具介绍

首先,CoreOS 没有提供包管理工具,而是通过容器化 (containerized) 的运算环境向应用程序提供运算资源。应用程序之间共享系统内核和资源,但是彼此之间又互不可见。这样就意味着应用程序将不会再被直接安装到操作系统中,而是通过 Docker 运行在容器中。这种方式使得操作系统、应用程序及运行环境之间的耦合度大大降低。相对于传统的部署方式而言,在 CoreOS 集群中部署应用程序更加灵活便捷,应用程序运行环境之间的干扰更少,而且操作系统自身的维护也更加容易。

其次, CoreOS 采用双系统分区 (dual root partition) 设计。两个分区分别被设置成主动模式和被动模式并在系统运行期间各司其职。主动分区负责系统运行,被动分区负责系统升级。一旦新版本的操作系统被发布,一个完整的系统文件将被下载至被动分区,并在系统下一次重启时从新版本分区启动,原来的被动分区将切换为主动分区,而之前的主动分区则被切换为被动分区,两个分区扮演的角色将相互对调。同时在系统运行期间系统分区被设置成只读状态,这样也确保了 CoreOS 的安全性。CoreOS 的升级过程在默认条件下将自动完成,并且通过 cgroup 对升级过程中使用到的网络和磁盘资源进行限制,将系统升级所带来的影响降至最低。

另外,CoreOS 使用 Systemd 取代 SysV 作为系统和服务的管理工具。与 SysV 相比,Systemd 不但可以更好的追踪系统进程,而且也具备优秀的并行化处理能力,加之按需启动等特点,并结合 Docker 的快速启动能力,在 CoreOS 集群中大规模部署 Docker Containers 与使用其他操作系统相比在性能上的优势将更加明显。Systemd 的另一个特点是引入了 “target” 的概念,每个 target 应用于一个特定的服务,并且可以通过继承一个已有的 target 扩展额外的功能,这样使得操作系统对系统上运行的服务拥有更好的控制力。

通过对系统结构的重新设计,CoreOS 剔除了任何不必要的软件和服务。在一定程度上减轻了维护一个服务器集群的复杂度,帮助用户从繁琐的系统及软件维护工作中解脱出来。虽然CoreOS 最初源自于Google ChromeOS,但是从一开始就决定了 CoreOS 更加适合应用于一个集群环境而不是一个传统的服务器操作系统。

3. CoreOS相关工具

除了操作系统之外,CoreOS 团队和其他团队还提供了若干工具帮助用户管理 CoreOS 集群以及部署 Docker containers。

3.1. etcd

Linux:CoreOS 实战:CoreOS 及管理工具介绍
Linux:CoreOS 实战:CoreOS 及管理工具介绍

在CoreOS 集群中处于骨架地位的是 etcd。 etcd 是一个分布式 key/value 存储服务,CoreOS 集群中的程序和服务可以通过 etcd 共享信息或做服务发现 。etcd 基于非常著名的 raft 一致性算法:通过选举形式在服务器之中选举 Lead 来同步数据,并以此确保集群之内信息始终一致和可用。etcd 以默认的形式安装于每个 CoreOS 系统之中。在默认的配置下,etcd 使用系统中的两个端口:4001和7001,其中4001提供给外部应用程序以HTTP+Json的形式读写数据,而7001则用作在每个 etcd 之间进行数据同步。用户更可以通过配置 CA Cert让 etcd 以 HTTPS 的方式读写及同步数据,进一步确保数据信息的安全性。

3.2. fleet

fleet 是一个通过 Systemd对CoreOS 集群中进行控制和管理的工具。fleet 与 Systemd 之间通过 D-Bus API 进行交互,每个 fleet agent 之间通过 etcd 服务来注册和同步数据。fleet 提供的功能非常丰富,包括查看集群中服务器的状态、启动或终止 Docker container、读取日志内容等。更为重要的是 fleet 可以确保集群中的服务一直处于可用状态。当出现某个通过 fleet 创建的服务在集群中不可用时,如由于某台主机因为硬件或网络故障从集群中脱离时,原本运行在这台服务器中的一系列服务将通过fleet 被重新分配到其他可用服务器中。虽然当前 fleet 还处于非常早期的状态,但是其管理 CoreOS 集群的能力是非常有效的,并且仍然有很大的扩展空间,目前已提供简单的 API 接口供用户集成。

3.3. Kubernetes

Kuberenetes 是由 Google 开源的一个适用于集群的 Docker containers 管理工具。用户可以将一组 containers 以 “POD” 形式通过 Kubernetes 部署到集群之中。与 fleet 更加侧重 CoreOS 集群的管理不同,Kubernetes 生来就是一个 Containers 的管理工具。Kubernetes 以 “POD” 为单位管理一系列彼此联系的 Containers,这些 Containers 被部署在同一台物理主机中、拥有同样地网络地址并共享存储配额。

3.4. flannel (rudder)

flannel (rudder) 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络 (overlay network) 工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。Kubernetes 会为每一个 POD 分配一个独立的 IP 地址,这样便于同一个 POD 中的 Containers 彼此连接,而之前的 CoreOS 并不具备这种能力。为了解决这一问题,flannel 通过在集群中创建一个覆盖网格网络 (overlay mesh network) 为主机设定一个子网。

4. 下篇介绍

在下一篇中,笔者将为大家展示如何建立一个 CoreOS 集群并通过 Kubernetes 管理其中的 Docker Containers。

来源:http://www.infoq.com/cn/articles/what-is-coreos

Linux:CoreOS 实战:剖析 etcd

1. 概述

Linux:CoreOS 实战:剖析 etcd
Linux:CoreOS 实战:剖析 etcd

etcd 是一个应用在分布式环境下的 key/value 存储服务。利用 etcd 的特性,应用程序可以在集群中共享信息、配置或作服务发现,etcd 会在集群的各个节点中复制这些数据并保证这些数据始终正确。etcd 无论是在 CoreOS 还是 Kubernetes 体系中都是不可或缺的一环。笔者由于项目的原因对 etcd 进行了一些了解,也已经使用了一段时间。同时在与同行的交流中常被问到 etcd 是什么、与 ZooKeeper 有什么不同。那么借着 etcd 0.5.0 即将发布的机会,向感兴趣的读者介绍一下 etcd,希望可以帮助读者了解 etcd 的工作原理以及具体实现,同时也作为 CoreOS 实战的第二部分内容为后面相关的部分进行铺垫。

随着 etcd 0.5.0 alpha (本文完稿时为 etcd 0.5.0 alpha.3)版发布,etcd 将在未来几周内迎来一次重要的更新。在 0.5.0 版里除了修复现有稳定版中的一系列 Bug 之外,一些新的特性和变更也将随之发布。这些变化将提升 etcd 服务安全性、可靠性和可维护性。

新的特性包括

  • 规范词汇表;
  • 新的 raft 算法实现;
  • 新增 etcd node 身份标记;
  • WAL (Write-ahead logging) 增加 CRC 校验;
  • API 中新增 member {list, add, remove} 接口,原来的 list machines 接口将被移除,未来 etcd 集群中将不存在 machine 的称呼;
  • 两个主要端口变更为 2379 (for client) 与 2380 (for peer/raft) 并成为 IANA 的注册端口。

重要的变更包括

  • 运行时重构 (runtime reconfiguration)。用户不需要重启 etcd 服务即可实现对 etcd 集群结构进行变更。
  • 摒弃通过配置文件配置 etcd 属性的方式,转而以 CLI (command-line interface) flags 或环境变量的方式实现 etcd 节点的配置。
  • 每个节点可监听多个广播地址。监听的地址由原来的一个扩展到多个,用户可以根据需求实现更加复杂的集群环境,如搭建一个混合了私有云与公有云服务的 etcd 集群。
  • 新增 proxy mode。

2. 规范词汇表

etcd 0.5.0 版首次对 etcd 代码、文档及 CLI 中使用的术语进行了定义。

2.1. node

node 指一个 raft 状态机实例。每个 node 都具有唯一的标识,并在处于 leader 状态时记录其它节点的步进数。

2.2. member

member 指一个 etcd 实例。member 运行在每个 node 上,并向这一 node 上的其它应用程序提供服务。

2.3. Cluster

Cluster 由多个 member 组成。每个 member 中的 node 遵循 raft 共识协议来复制日志。Cluster 接收来自 member 的提案消息,将其提交并存储于本地磁盘。

2.4. Peer

同一 Cluster 中的其它 member。

2.5. Client

Client 指调用 Cluster API 的对象。

3. Raft 共识算法

etcd 集群的工作原理基于 raft 共识算法 (The Raft Consensus Algorithm)。etcd 在 0.5.0 版本中重新实现了 raft 算法,而非像之前那样依赖于第三方库 go-raft 。raft 共识算法的优点在于可以在高效的解决分布式系统中各个节点日志内容一致性问题的同时,也使得集群具备一定的容错能力。即使集群中出现部分节点故障、网络故障等问题,仍可保证其余大多数节点正确的步进。甚至当更多的节点(一般来说超过集群节点总数的一半)出现故障而导致集群不可用时,依然可以保证节点中的数据不会出现错误的结果。

3.1. 集群建立与状态机

raft 集群中的每个节点都可以根据集群运行的情况在三种状态间切换:follower, candidate 与 leader。leader 向 follower 同步日志,follower 只从 leader 处获取日志。在节点初始启动时,节点的 raft 状态机将处于 follower 状态并被设定一个 election timeout,如果在这一时间周期内没有收到来自 leader 的 heartbeat,节点将发起选举:节点在将自己的状态切换为 candidate 之后,向集群中其它 follower 节点发送请求,询问其是否选举自己成为 leader。当收到来自集群中过半数节点的接受投票后,节点即成为 leader,开始接收保存 client 的数据并向其它的 follower 节点同步日志。leader 节点依靠定时向 follower 发送 heartbeat 来保持其地位。任何时候如果其它 follower 在 election timeout 期间都没有收到来自 leader 的 heartbeat,同样会将自己的状态切换为 candidate 并发起选举。每成功选举一次,新 leader 的步进数都会比之前 leader 的步进数大1。

图 3-1 raft 状态切换示意图

3.2. 选举

3.2.1. 一个 candidate 成为 leader 需要具备三个要素:

  • 获得集群多数节点的同意;
  • 集群中不存在比自己步进数更高的 candidate;
  • 集群中不存在其他 leader。

3.2.2. 下面为一个 etcd 集群选举过程的简单描述:

➢ 初始状态下集群中的所有节点都处于 follower 状态。

Linux:CoreOS 实战:剖析 etcd
Linux:CoreOS 实战:剖析 etcd

➢ 某一时刻,其中的一个 follower 由于没有收到 leader 的 heartbeat 率先发生 election timeout 进而发起选举。

Linux:CoreOS 实战:剖析 etcd
Linux:CoreOS 实战:剖析 etcd

➢ 只要集群中超过半数的节点接受投票,candidate 节点将成为即切换 leader 状态。

Linux:CoreOS 实战:剖析 etcd
Linux:CoreOS 实战:剖析 etcd

➢ 成为 leader 节点之后,leader 将定时向 follower 节点同步日志并发送 heartbeat。

Linux:CoreOS 实战:剖析 etcd
Linux:CoreOS 实战:剖析 etcd

来源:http://www.infoq.com/cn/articles/coreos-analyse-etcd

Linux:编程中的“末行效应”

我研究过数百个因“拷贝-粘贴”导致的错误。可以肯定的是,程序员常常会在一大段代码的最后一段里犯错。好像还没有任何编程书讨论过这种现象,因此我决定自己写点什么。我称之为“末行效应”。

Linux:编程中的“末行效应”
Linux:编程中的“末行效应”

我叫Andrey Karpov,我的工作有点不寻常:我借助静态分析工具研究各种应用程序代码,并描述从中找到的错误或者缺陷。我这么做既有实际效益也因为工作需要。使用的方法正是基于我们公司所推广的PVS-Studio和CppCat工具的原理。套路很简单:找bug,然后写文章分析bug,文章吸引到潜在用户的注意,接着就是收益。但今天这篇文章不是介绍这些工具的。

在分析各种软件项目的过程中,我把找到的bug以及相关代码存入一个特殊的数据库。顺便说一下,有兴趣的话各位可以看一看这个数据库。我们把它转换成网页格式并上传到了公司网站的“Detected errors”栏下。

这个数据库独一无二!目前它收录了1500块问题代码片,正等着程序员们去研究,从中总结出特定规律。为将来的研究,手册和文章奠定一个基础。

我还没认真地分析过目前搜集到的材料。但是过程中我发现有一个明显的模式反复出现,决定深入研究一下。你大概看到了,文中我反复使用短语“注意最后一行”。在我看来,这一定有某种规律。

末行效应

编程的时候,程序员常常需要写一系列相似的结构。逐行敲键盘输入无聊且低效。这就是为什么他们会使用奥义-“拷贝-粘贴”大法:一段代码被拷贝粘贴几次,然后修改。谁都知道这样做的坏处:你很容易在粘贴后忘记修改某些内容最后滋生出问题。不幸的是,常常找不到比这更好的方法。

那么我发现了什么规律呢?我发现错误常常发生在最后的一块粘贴代码里。

下面是一个简短的例子:

inline Vector3int32& operator+=(const Vector3int32& other) {
  x += other.x;
  y += other.y;
  z += other.y;
  return *this;
}

注意这一行:”z += other.y;”。程序员忘记把‘y’替换成‘z’了。

也许你以为这是个假设的例子,然后它其实来自一个真实的应用程序。接下来,我会让你相信这是高频常见的一种错误。程序员们经常在一连串相似操作的结尾犯这种错误。

我听说攀岩者常常在最后的几十米中滑落下来。并不是因为他们累了,而正是由于他们对即将到达的终点过于兴奋,他们想象着成功后的喜悦,变得疏忽大意,最后失足。我猜想程序员们也是这样的。

接下来看一组数据。

研究了数据库后,我分离出了84个代码段由“拷贝-粘贴”大法生成。其中41段中错误发生在中间的某些粘贴块。比如:

strncmp(argv[argidx], "CAT=", 4) &&
strncmp(argv[argidx], "DECOY=", 6) &&
strncmp(argv[argidx], "THREADS=", 6) &&
strncmp(argv[argidx], "MINPROB=", 8)) {

“THREADS=”字符串的长度是8个字符,而非6。

另外的43段代码中,错误发生在最后的粘贴块。

当然,43比41大不了多少。但是请注意,一段程序中,可能有很多类似的代码块,因此错误可能发生在第一,第二,第五甚至第十块中。因此在其他代码块中我们有一个相对均匀的分布,而最后一块却存在一个峰值。

平均而言,相似代码块总数为5。

于是前面4个代码块中均匀分布了41处错误,平均每块代码有10个错误。

然而最后一块代码中有43个错误!

下面的分布概图凸显出这个现象:

Linux:编程中的“末行效应”
Linux:编程中的“末行效应”

 

图1. 五块类似代码段中的错误分布概图

因此我们可以总结出一个规律:

在最末的粘贴代码块中出错的概率是其他代码块的4倍。

这个规律可能并没有普适性。它只是个有趣的发现,其实际效用在于:提醒在你写最后一块的时候保持警觉。

实例:

下面我要证明这并不是我的胡思乱想而是有真实的趋势的。请看下面的实例。

当然,我不会列出所有例子,仅列举简单而有代表性的。

Source Engine SDK

inline void Init( float ix=0, float iy=0,
                  float iz=0, float iw = 0 )
{
  SetX( ix );
  SetY( iy );
  SetZ( iz );
  SetZ( iw );
}

最后一行应该是SetW()。

Chromium

if (access & FILE_WRITE_ATTRIBUTES)
  output.append(ASCIIToUTF16("tFILE_WRITE_ATTRIBUTESn"));
if (access & FILE_WRITE_DATA)
  output.append(ASCIIToUTF16("tFILE_WRITE_DATAn"));
if (access & FILE_WRITE_EA)
  output.append(ASCIIToUTF16("tFILE_WRITE_EAn"));
if (access & FILE_WRITE_EA)
  output.append(ASCIIToUTF16("tFILE_WRITE_EAn"));
break;

最后两行相同。

ReactOS

if (*ScanString == L'"' ||
    *ScanString == L'^' ||
    *ScanString == L'"')

Multi Theft Auto

class CWaterPolySAInterface
{
public:
    WORD m_wVertexIDs[3];
};
CWaterPoly* CWaterManagerSA::CreateQuad (....)
{
  ....
  pInterface->m_wVertexIDs [ 0 ] = pV1->GetID ();
  pInterface->m_wVertexIDs [ 1 ] = pV2->GetID ();
  pInterface->m_wVertexIDs [ 2 ] = pV3->GetID ();
  pInterface->m_wVertexIDs [ 3 ] = pV4->GetID ();
  ....
}

最后一行冗余代码来自于惯性粘贴。数组的大小是3。

Source Engine SDK

intens.x=OrSIMD(AndSIMD(BackgroundColor.x,no_hit_mask),
                AndNotSIMD(no_hit_mask,intens.x));
intens.y=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask),
                AndNotSIMD(no_hit_mask,intens.y));
intens.z=OrSIMD(AndSIMD(BackgroundColor.y,no_hit_mask),
                AndNotSIMD(no_hit_mask,intens.z));

程序员忘记把最后一行的中的“BackgroundColor.y”改成“BackgroundColor.z”。

Trans-Proteomic Pipeline

void setPepMaxProb(....)
{
  ....
  double max4 = 0.0;
  double max5 = 0.0;
  double max6 = 0.0;
  double max7 = 0.0;
  ....
  if ( pep3 ) { ... if ( use_joint_probs && prob > max3 ) ... }
  ....
  if ( pep4 ) { ... if ( use_joint_probs && prob > max4 ) ... }
  ....
  if ( pep5 ) { ... if ( use_joint_probs && prob > max5 ) ... }
  ....
  if ( pep6 ) { ... if ( use_joint_probs && prob > max6 ) ... }
  ....
  if ( pep7 ) { ... if ( use_joint_probs && prob > max6 ) ... }
  ....
}

程序员忘记把最后一个判断中的“prob > max6”改为“prob > max7”。

SeqAn

inline typename Value::Type const & operator*() {
  tmp.i1 = *in.in1;
  tmp.i2 = *in.in2;
  tmp.i3 = *in.in2;
  return tmp;
}

SlimDX

for( int i = 0; i < 2; i++ )
{
  sliders[i] = joystate.rglSlider[i];
  asliders[i] = joystate.rglASlider[i];
  vsliders[i] = joystate.rglVSlider[i];
  fsliders[i] = joystate.rglVSlider[i];
}

最后一行应该用rglFSlider。

Qt

if (repetition == QStringLiteral("repeat") ||
    repetition.isEmpty()) {
  pattern->patternRepeatX = true;
  pattern->patternRepeatY = true;
} else if (repetition == QStringLiteral("repeat-x")) {
  pattern->patternRepeatX = true;
} else if (repetition == QStringLiteral("repeat-y")) {
  pattern->patternRepeatY = true;
} else if (repetition == QStringLiteral("no-repeat")) {
  pattern->patternRepeatY = false;
  pattern->patternRepeatY = false;
} else {
  //TODO: exception: SYNTAX_ERR
}

最后一块少了‘patternRepeatX’。正确的代码应该是:

pattern->patternRepeatX = false;
pattern->patternRepeatY = false;

ReactOS

const int istride = sizeof(tmp[0]) / sizeof(tmp[0][0][0]);
const int jstride = sizeof(tmp[0][0]) / sizeof(tmp[0][0][0]);
const int mistride = sizeof(mag[0]) / sizeof(mag[0][0]);
const int mjstride = sizeof(mag[0][0]) / sizeof(mag[0][0]);

‘mjstride’永远等于1。最后一行应该是:

const int mjstride = sizeof(mag[0][0]) / sizeof(mag[0][0][0]);

Mozilla Firefox

if (protocol.EqualsIgnoreCase("http") ||
    protocol.EqualsIgnoreCase("https") ||
    protocol.EqualsIgnoreCase("news") ||
    protocol.EqualsIgnoreCase("ftp") ||          <<<---
    protocol.EqualsIgnoreCase("file") ||
    protocol.EqualsIgnoreCase("javascript") ||
    protocol.EqualsIgnoreCase("ftp")) {          <<<---

最后的“ftp”很可疑,它之前已经被比较过了。

Quake-III-Arena

if (fabs(dir[0]) > test->radius ||
    fabs(dir[1]) > test->radius ||
    fabs(dir[1]) > test->radius)

dir[2]的值忘记检查了。

Clang

return (ContainerBegLine <= ContaineeBegLine &&
        ContainerEndLine <= ContaineeEndLine &&
        (ContainerBegLine != ContaineeBegLine ||
         SM.getExpansionColumnNumber(ContainerRBeg) <=
         SM.getExpansionColumnNumber(ContaineeRBeg)) &&
        (ContainerEndLine != ContaineeEndLine ||
         SM.getExpansionColumnNumber(ContainerREnd) >=
         SM.getExpansionColumnNumber(ContainerREnd)));

最后一块,“SM.getExpansionColumnNumber(ContainerREnd)”表达式在跟自己比较大小。

MongoDB

bool operator==(const MemberCfg& r) const {
  ....
  return _id==r._id && votes == r.votes &&
         h == r.h && priority == r.priority &&
         arbiterOnly == r.arbiterOnly &&
         slaveDelay == r.slaveDelay &&
         hidden == r.hidden &&
         buildIndexes == buildIndexes;
}

程序员把最后一行的“r”忘记了。

Unreal Engine 4

static bool PositionIsInside(....)
{
  return
    Position.X >= Control.Center.X - BoxSize.X * 0.5f &&
    Position.X <= Control.Center.X + BoxSize.X * 0.5f &&
    Position.Y >= Control.Center.Y - BoxSize.Y * 0.5f &&
    Position.Y >= Control.Center.Y - BoxSize.Y * 0.5f;
}

最后一行中,程序员忘记了两个地方。首先,“>=”应改为“<=”,其次,减号应改为加号。

Qt

qreal x = ctx->callData->args[0].toNumber();
qreal y = ctx->callData->args[1].toNumber();
qreal w = ctx->callData->args[2].toNumber();
qreal h = ctx->callData->args[3].toNumber();
if (!qIsFinite(x) || !qIsFinite(y) ||
    !qIsFinite(w) || !qIsFinite(w))

最后一个qlsFinite中,传入参数应该是‘h’。

OpenSSL

if (!strncmp(vstart, "ASCII", 5))
  arg->format = ASN1_GEN_FORMAT_ASCII;
else if (!strncmp(vstart, "UTF8", 4))
  arg->format = ASN1_GEN_FORMAT_UTF8;
else if (!strncmp(vstart, "HEX", 3))
  arg->format = ASN1_GEN_FORMAT_HEX;
else if (!strncmp(vstart, "BITLIST", 3))
  arg->format = ASN1_GEN_FORMAT_BITLIST;

字符串“BITLIST”长度为7,而非3。

就此打住吧。我举的例子已经够说明问题了吧?

结论

本文告诉你“拷贝-粘贴”大法在最后一个粘贴代码块中出错的概率很可能是其他块的4倍。

这跟人类的心理学有关,与技术水平无关。文中说明了即便是像Clang或者Qt项目中的编程高手也会犯这种错误。

我希望这个现象的发现对于程序员们有所帮助,也许可以促使他们去研究我们的bug数据库。相信如此有助于在这些错误中发现新的规律并总结出新的编程建议。

来源:http://www.vaikan.com/the-last-line-effect/

Linux:动画讲解Eclipse常用快捷键

Linux:动画讲解Eclipse常用快捷键
Linux:动画讲解Eclipse常用快捷键

Eclipse有强大的编辑功能, 工欲善其事,必先利其器, 掌握Eclipse快捷键,可以大大提高工作效率。小坦克我花了一整天时间, 精选了一些常用的快捷键操作,并且精心录制了动画, 让你一看就会。

注释 Ctrl+/

能为光标”所在行”或者”选中行”添加注释或者取消注释。 也可以对多行添加或取消注释

Linux:动画讲解Eclipse常用快捷键
Linux:动画讲解Eclipse常用快捷键

快速修复 Ctrl + 1

Linux:动画讲解Eclipse常用快捷键
Linux:动画讲解Eclipse常用快捷键

删除当前行 Ctrl+d

光标位于行的任何地方, 按Ctrl+D 删除当前行, 当然也可以删除空行, 不用为了删除行,而按很多删除键了

Linux:动画讲解Eclipse常用快捷键
Linux:动画讲解Eclipse常用快捷键

来源:http://www.cnblogs.com/TankXiao/p/4018219.html

Linux:在LVM中设置精简资源调配卷(第四部分)

Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

逻辑卷管理有许多特性,比如像快照和精简资源调配。在先前(第三部分中),我们已经介绍了如何为逻辑卷创建快照。在本文中,我们将了解如何在LVM中设置精简资源调配。

Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

在LVM中设置精简资源调配

精简资源调配是什么?

精简资源调配用于LVM以在精简池中创建虚拟磁盘。我们假定我服务器上有15GB的存储容量,而我已经有2个客户各自占去了5GB存储空间。你是第三个客户,你也请求5GB的存储空间。在以前,我们会提供整个5GB的空间(富卷)。然而,你可能只使用5GB中的2GB,其它3GB以后再去填满它。

而在精简资源调配中我们所做的是,在其中一个大卷组中定义一个精简池,再在精简池中定义一个精简卷。这样,不管你写入什么文件,它都会保存进去,而你的存储空间看上去就是5GB。然而,这所有5GB空间不会全部铺满整个硬盘。对其它客户也进行同样的操作,就像我说的,那儿已经有两个客户,你是第三个客户。

那么,让我们想想,我到底为客户分配了总计多少GB的空间呢?所有15GB的空间已经全部分配完了,如果现在有某个人来问我是否能提供5GB空间,我还可以分配给他么?答案是“可以”。在精简资源调配中,我可以为第四位客户分配5GB空间,即使我已经把那15GB的空间分配完了。

警告:从那15GB空间中,如果我们对资源调配超过15GB了,那就是过度资源调配了。

它是怎么工作的?我们又是怎样为客户提供存储空间的?

我已经提供给你5GB空间,但是你可能只用了2GB,而其它3GB还空闲着。在富资源调配中,我们不能这么做,因为它一开始就分配了整个空间。

在精简资源调配中,如果我为你定义了5GB空间,它就不会在定义卷时就将整个磁盘空间全部分配,它会根据你的数据写入而增长,希望你看懂了!跟你一样,其它客户也不会使用全部卷,所以还是有机会为一个新客户分配5GB空间的,这称之为过度资源调配。

但是,必须对各个卷的增长情况进行监控,否则结局会是个灾难。在过度资源调配完成后,如果所有4个客户都尽量写入数据到磁盘,你将碰到问题了。因为这个动作会填满15GB的存储空间,甚至溢出,从而导致这些卷下线。

前置阅读

我的服务器设置

操作系统 — 安装有LVM的CentOS 6.5
服务器IP — 192.168.0.200

步骤1: 设置精简池和卷

理论讲太多了,让我们还是来点实际的吧,我们一起来设置精简池和精简卷。首先,我们需要一个大尺寸的卷组。这里,我创建了一个15GB的卷组用于演示。现在,用下面的命令来列出卷组。

# vgcreate -s 32M vg_thin /dev/sdb1

Listing Volume Group

列出卷组

接下来,在创建精简池和精简卷之前,检查逻辑卷有多少空间可用。

# vgs
# lvs
Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

检查逻辑卷

我们可以在上面的lvs命令输出中看到,只显示了一些默认逻辑用于文件系统和交换分区。

创建精简池

使用以下命令在卷组(vg_thin)中创建一个15GB的精简池。

# lvcreate -L 15G --thinpool tp_tecmint_pool vg_thin
  • -L – 卷组大小
  • –thinpool – 创建精简池
  • tp_tecmint_poolThin – 精简池名称
  • vg_thin – 我们需要创建精简池的卷组名称
Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

创建精简池

使用‘lvdisplay’命令来查看详细信息。

# lvdisplay vg_thin/tp_tecmint_pool
Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

逻辑卷信息

这里,我们还没有在该精简池中创建虚拟精简卷。在图片中,我们可以看到分配的精简池数据为0.00%

创建精简卷

现在,我们可以在带有-V(Virtual)选项的‘lvcreate’命令的帮助下,在精简池中定义精简卷了。

# lvcreate -V 5G --thin -n thin_vol_client1 vg_thin/tp_tecmint_pool

我已经在我的vg_thin卷组中的tp_tecmint_pool内创建了一个精简虚拟卷,取名为thin_vol_client1。现在,使用下面的命令来列出逻辑卷。

# lvs
Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

列出逻辑卷

刚才,我们已经在上面创建了精简卷,这就是为什么没有数据,显示为0.00%M

好吧,让我为其它2个客户再创建2个精简卷。这里,你可以看到在精简池(tp_tecmint_pool)下有3个精简卷了。所以,从这一点上看,我们开始明白,我已经使用所有15GB的精简池。

Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

创建文件系统

现在,使用下面的命令为这3个精简卷创建挂载点并挂载,然后拷贝一些文件进去。

# mkdir -p /mnt/client1 /mnt/client2 /mnt/client3

列出创建的目录。

# ls -l /mnt/

Creating Mount Points

创建挂载点

使用‘mkfs’命令为这些创建的精简卷创建文件系统。

# mkfs.ext4 /dev/vg_thin/thin_vol_client1 && mkfs.ext4 /dev/vg_thin/thin_vol_client2 && mkfs.ext4 /dev/vg_thin/thin_vol_client3
Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

创建文件系统

使用‘mount’命令来挂载所有3个客户卷到创建的挂载点。

# mount /dev/vg_thin/thin_vol_client1 /mnt/client1/ && mount /dev/vg_thin/thin_vol_client2 /mnt/client2/ && mount /dev/vg_thin/thin_vol_client3 /mnt/client3/

使用‘df’命令来列出挂载点。

# df -h
Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

显示挂载点

这里,我们可以看到所有3个客户卷已经挂载了,而每个客户卷只使用了3%的数据空间。那么,让我们从桌面添加一些文件到这3个挂载点,以填充一些空间。

Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

添加文件到卷

现在列出挂载点,并查看每个精简卷使用的空间,然后列出精简池来查看池中已使用的大小。

# df -h
# lvdisplay vg_thin/tp_tecmint_pool
Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

检查挂载点大小

Linux:在LVM中设置精简资源调配卷(第四部分)
Linux:在LVM中设置精简资源调配卷(第四部分)

检查精简池大小

上面的命令显示了3个挂载点及其使用大小百分比。

13% of datas used out of 5GB for client1
29% of datas used out of 5GB for client2
49% of datas used out of 5GB for client3

在查看精简池时,我们看到总共只有30%的数据被写入,这是上面3个客户虚拟卷的总使用量。

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

Linux:如何在Debian上安装配置ownCloud

据其官方网站,ownCloud可以让你通过一个Web界面或者WebDAV访问你的文件。它还提供了一个平台,可以轻松地查看、编辑和同步您所有设备的通讯录、日历和书签。尽管ownCloud与广泛使用Dropbox非常相似,但主要区别在于ownCloud是免费的,开源的,从而可以自己的服务器上建立与Dropbox类似的云存储服务。使用ownCloud你可以完整地访问和控制您的私人数据,而对存储空间(除了硬盘容量)或客户端的连接数量没有限制。

ownCloud提供了社区版(免费)和企业版(面向企业的有偿支持)。预编译的ownCloud社区版可以提供了CentOS、Debian、Fedora、openSUSE、,SLE和Ubuntu版本。本教程将演示如何在Debian Wheezy上安装和在配置ownCloud社区版。

Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

在Debian上安装 ownCloud

进入官方网站:http://owncloud.org,并点击‘Install’按钮(右上角)。

为当前的版本选择“Packages for auto updates”(下面的图是v7)。这可以让你轻松的让你使用的ownCloud与Debian的包管理系统保持一致,包是由ownCloud社区维护的。

Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

在下一屏中点击继续:

Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

在可用的操作系统列表中选择Debian 7 [Wheezy]:

Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

加入ownCloud的官方Debian仓库:

 # echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_7.0/ /' >> /etc/apt/sources.list.d/owncloud.list

加入仓库密钥到apt中:

# wget http://download.opensuse.org/repositories/isv:ownCloud:community/Debian_7.0/Release.key
# apt-key add - < Release.key

继续安装ownCLoud:

# aptitude update
# aptitude install owncloud

打开你的浏览器并定位到你的ownCloud实例中,地址是 http://服务器 IP/owncloud:

Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

注意ownCloud可能会包一个Apache配置错误的警告。使用下面的步骤来解决这个错误来解决这些错误信息。

a) 编辑 the /etc/apache2/apache2.conf (设置 AllowOverride 为 All):


    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all

b) 编辑 the /etc/apache2/conf.d/owncloud.conf


    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all

c) 重启web服务器:

# service apache2 restart

d) 刷新浏览器,确认安全警告已经消失

Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

设置数据库

这时可以为ownCloud设置数据库了。

首先登录本地的MySQL/MariaDB数据库:

$ mysql -u root -h localhost -p

为ownCloud创建数据库和用户账户。

mysql> CREATE DATABASE owncloud_DB;
mysql> CREATE USER ‘owncloud-web’@'localhost' IDENTIFIED BY ‘whateverpasswordyouchoose’;
mysql> GRANT ALL PRIVILEGES ON owncloud_DB.* TO ‘owncloud-web’@'localhost';
mysql> FLUSH PRIVILEGES;

通过http://服务器 IP/owncloud 进入ownCloud页面,并选择‘Storage & database’ 选项。输入所需的信息(MySQL/MariaDB用户名,密码,数据库和主机名),并点击完成按钮。

Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

为ownCloud配置SSL连接

在你开始使用ownCloud之前,强烈建议你在ownCloud中启用SSL支持。使用SSL可以提供重要的安全好处,比如加密ownCloud流量并提供适当的验证。在本教程中,将会为SSL使用一个自签名的证书。

创建一个储存服务器密钥和证书的目录:

# mkdir /etc/apache2/ssl

创建一个证书(并有一个密钥来保护它),它有一年的有效期。

 # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
Linux:如何在Debian上安装配置ownCloud
Linux:如何在Debian上安装配置ownCloud

编辑/etc/apache2/conf.d/owncloud.conf 启用HTTPS。对于重写规则中的NC、R和L的意义,你可以参考Apache 文档:

Alias /owncloud /var/www/owncloud

    RewriteEngine on
    ReWriteCond %{SERVER_PORT} !^443$
    RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]


    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.crt
    SSLCertificateKeyFile /etc/apache2/ssl/apache.key
    DocumentRoot /var/www/owncloud/

    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all


启用重写模块并重启Apache:

# a2enmod rewrite
# service apache2 restart

打开你的ownCloud实例。注意一下,即使你尝试使用HTTP,你也会自动被重定向到HTTPS。

注意,即使你已经按照上述步骤做了,在你启动ownCloud你仍将看到一条错误消息,指出该证书尚未被受信的机构颁发(那是因为我们创建了一个自签名证书)。您可以放心地忽略此消息,但如果你考虑在生产服务器上部署ownCloud,你可以从一个值得信赖的公司购买证书。

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

Linux:在Github和Git上fork之简单指南

以我的经验来看,刚接触Git和GitHub时,最困扰的一件事情就是尝试解决下面的问题:在Git和GitHub上,我能做什么?

Git教程往往不会解决这个问题,因为它集中篇幅来教你Git命令和概念,并且不认为你会使用GitHub。GitHub帮助教程一定程度上弥补了这一缺陷,但是它每篇文章的关注点都较为狭隘,而且没有提供关于”Git vs GitHub”问题的概念性概述。

如果你是习惯于先理解概念,再着手代码的学习者,而且你也是Git和GitHub的初学者,我建议你先理解清楚什么是fork。为什么呢 ?

  1. Fork是在GitHub起步最普遍的方式。
  2. Fork只需要很少的Git命令,但是起得作用却非常大。
  3. Fork提供了对Git和GitHub最基础的了解,有益于你之后的工作。
Linux:在Github和Git上fork之简单指南
Linux:在Github和Git上fork之简单指南

本篇指南使用两张简单的图表,来教会你fork的两种主要工作流程。我并不打算涉及任何代码,但是在结论中,我会把你需要使用的代码的链接给你。

fork并且更新一个仓库

现在有这样一种情形:有一个叫做Joe的程序猿写了一个游戏程序,而你可能要去改进它。并且Joe将他的代码放在了GitHub仓库上。下面是你要做的事情:

Linux:在Github和Git上fork之简单指南
Linux:在Github和Git上fork之简单指南

fork并且更新GitHub仓库的图表演示

  1. Fork他的仓库:这是GitHub操作,这个操作会复制Joe的仓库(包括文件,提交历史,issues,和其余一些东西)。复制后的仓库在你自己的GitHub帐号下。目前,你本地计算机对这个仓库没有任何操作。

  2. Clone你的仓库:这是Git操作。使用该操作让你发送”请给我发一份我仓库的复制文件”的命令给GitHub。现在这个仓库就会存储在你本地计算机上。

  3. 更新某些文件:现在,你可以在任何程序或者环境下更新仓库里的文件。

  4. 提交你的更改:这是Git操作。使用该操作让你发送”记录我的更改”的命令至GitHub。此操作只在你的本地计算机上完成。

  5. 将你的更改push到你的GitHub仓库:这是Git操作。使用该操作让你发送”这是我的修改”的信息给GitHub。Push操作不会自动完成,所以直到你做了push操作,GitHub才知道你的提交。

  6. 给Joe发送一个pull request:如果你认为Joe会接受你的修改,你就可以给他发送一个pull request。这是GitHub操作,使用此操作可以帮助你和Joe交流你的修改,并且询问Joe是否愿意接受你的”pull request”,当然,接不接受完全取决于他自己。

如果Joe接受了你的pull request,他将把那些修改拉到自己的仓库。胜利!

同步一个fork

Joe和其余贡献者已经对这个项目做了一些修改,而你将在他们的修改的基础上,还要再做一些修改。在你开始之前,你最好”同步你的fork”,以确保在最新的复制版本里工作。下面是你要做的:

Linux:在Github和Git上fork之简单指南
Linux:在Github和Git上fork之简单指南

同步GitHub fork的图表示意图

  1. 从Joe的仓库中取出那些变化的文件:这是Git操作,使用该命令让你可以从Joe的仓库获取最新的文件。

  2. 将这些修改合并到你自己的仓库:这是Git操作,使用该命令使得那些修改更新到你的本地计算机(那些修改暂时存放在一个”分支”中)。记住:步骤1和2经常结合为一个命令使用,合并后的Git命令叫做”pull”。

  3. 将那些修改更新推送到你的GitHub仓库(可选):记住,你本地计算机不会自动更新你的GitHub仓库。所以,唯一更新GitHub仓库的办法就是将那些修改推送上去。你可以在步骤2完成后立即执行push,也可以等到你做了自己的一些修改,并已经本地提交后再执行推送操作。

比较一下fork和同步工作流程的区别:当你最初fork一个仓库的时候,信息的流向是从Joe的仓库到你的仓库,然后再到你本地计算机。但是最初的过程之后,信息的流向是从Joe的仓库到你的本地计算机,之后再到你的仓库。

结论

我希望这是一篇关于GitHub和Git 的 fork有用概述。现在,你已经理解了那些概念,你将会更容易地在实际中执行你的代码。GitHub关于fork和同步的文章将会给你大部分你需要的代码。

如果你是Git的初学者,而且你很喜欢这种学习方式,那么我极力推荐书籍Pro Git的前两个章节,网上是可以免费查阅的。

如果你喜欢视频学习,我创建了一个11部分的视频系列(总共36分钟),来向初学者介绍Git和GitHub。


via: http://www.dataschool.io/simple-guide-to-forks-in-github-and-git/

作者:Kevin Markham 译者:su-kaiyao 校对:wxy

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

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

Linux:快速架设OpenStack云基础平台

通常在linux下手工安装openstack比较麻烦,StackOps是一个可以快速安装的Openstack解决方案。

首先我们下载StackOps的iso文件:stackops-0.5-b1312-d20120510.iso(基于Ubuntu10.04,下载:http://pan.baidu.com/s/1jGJxjee), 然后就可以在vmware里安装了,经过注册和配置就可以立即享用OpenStack云基础架构。

安装过程就相当于一个浓缩了的Ubuntu,只需要选择键盘布局、分区设置IP地址等信息,但root密码是设定好的,默认是stackops。

 

Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台

上图为初始安装画面

经过几分钟安装,我们就可以到客户端上连接服务器了,打开 http://ip地址:8888 ,将立刻跳转到http://installer.stackops.org,这时需要注册一个用户,用刚刚注册的用户登录,就能看到如下画面。

Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台

这里我们就选择SingleNode架构,点击Startdeployment,如下图所示:

Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台

 

Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台

 

Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台
Linux:快速架设OpenStack云基础平台

根据自己情况选择默认就可以,值得注意的是“Floating IP range”划分子网时要注意,不要冲突。在点击”Start deployment”按钮后,配置就完成,稍后你需要等待一些时间才能最后完成配置。这时经过几个简单配置一个OpenStack环境就建立好了。

以下是一段配置视频供参考:

 

来源:http://chenguang.blog.51cto.com/350944/968169

Linux:程序员如何做出“不难看”的设计

经常看到程序员展示自己做的东西,有一些是创业项目,有一些是 Weekend Project, 不客气地说,大部分都挺难看的。在 10 年前,只要你做出一个功能齐全的东西,哪怕非常难看也会有很多人叫好,而现在网站和其它互联网产品多如牛毛,没有人再愿意忍受难看的东西了。

我觉得“不难看”是对一个产品最起码的要求,难看的产品往往都很难用。程序员在写代码的时候往往只注重功能的实现和性能的提升,忽视了外观和易用性,其实很多时候只要注意一些基本的规则,就可以大幅度提高产品的观感。作为一个外行,我也算是苦苦自学了好长时间的设计,这里打算分享一些我认为比较实用的技巧,希望可以帮助到同样在摸索的人。

Linux:程序员如何做出“不难看”的设计
Linux:程序员如何做出“不难看”的设计

需要声明的是,这里的目标是做出“不难看”的设计,注意,只是“不难看”而已,怎么做得好看我也在学习。另外,我的水平也很低,只是比较能体会外行的痛苦,如果有什么错误的地方,欢迎批评指正。

下面我会从四个方面来入手:对齐,字体排印,配色和装饰元素。

1. 对齐

之所以把“对齐”单独列出来并且放在开头说,是因为它是一个看上去简单但非常容易被忽视的规则。如果你真的把所有该对齐的东西都对齐了,就会发现只是简单遵循这一个规则就会有如此大的效果。

人的眼睛是喜欢秩序的,对齐就会让人觉得愉悦。不过有一点例外:尽量别用居中对齐,除非你有充足的理由。居中对齐会让人觉得很业余,你自己可以试一下好几段文字都居中是什么效果。

当然,也有靠不规则来出彩的设计,但那是高级玩法,我们还是乖乖对齐比较好。关于对齐有一个很好的网站可以观摩,那就是 IA (http://informationarchitects.net/)。它的上一个版本其实更容易看到对齐的效果,可以通过这里查看,顶部和底部的导航看上去没什么联系,如果你对比一下会发现它们对齐得都非常好。

2. 字体排印(Typography)

字体排印,英文名词叫做 Typography, 它包涵的东西很多,不只是字体的选择,还包括行距、行宽以及字体间距等元素的设定,这些东西都左右着我们的阅读体验。我们每天都阅读大量东西,每天都会接触到“文字”,由这一点就可以看出字体排印的重要性。关于字体排印的具体知识我就不多说了,有很多这方面的书和资料,这里只说几点容易被忽视的元素。

首先是行宽的设定,也就是每行显示的文字个数。一般来说,我们的阅读顺序都是从左到右,然后换行。如果每行显示的文字个数太多,那么我们在换行的时候视线移动距离就比较长,就容易感觉到疲劳,所以千万不要搞成只有一栏然后对屏幕自适应宽度,那样的阅读体验非常差。如果非要做流动布局,建议设置一下 max-width 属性。

其次是行距,也就是两行文字之间的距离。经常看到有些人调整了字体大小却忘记了调整行距,结果上下两行几乎挤在了一起,看起来非常累。如果你要调整字体大小,记得把行距也设置一下,就是 CSS 中的 line-height 属性。

第三是字间距。有些时候因为需要,我们会把一些文字设置得非常大,有些文字设置得非常小,这个时候每个字之间的间距可能就会变得过大或者过小,这个时候就需要调整一下,字体设计师们在设计一款字体的时候也会考虑这个因素。在 CSS 里面,有个属性叫 letter-spacing ,可以调整字间距。

最后想说一下的是标点。我们平时用到的很多标点符号都是错误的,比如说,英文的省略号不是三个点:… 而是 … (MacOS X 的快捷键是 Option + ;),英文引号也不是 ” 而是 “ (MacOS X 的快捷键是 Option + [),注意,这个和全角引号也不一样。平时写文章聊天无所谓,但如果做设计的话,还是把标点用对比较好。另外,名词拼写最好也严谨一些,App Store 不是 appstore, Xcode 不是 xcode, iPad 不是 ipad…

上面提到的除了标点之外,其余都是关于“空白”的问题。很多程序员可能会关注字体的选择,也知道 Helvetica 和 Arial 的区别,但是对字体之间的“空白”不太在意。而事实上,字体排印更多是对“空白”的设计,把“空白”的部分做好眼睛才能呼吸顺畅。

3. 配色

配色一直以来都是个让我头疼的问题,它看上去很难掌握,事实上也非常难以掌握。有一阵子我甚至怀疑我自己在色彩方面有生理缺陷,不然我他妈那么用功好歹应该有点儿效果啊。后来做了一些色彩识别能力测试,才慢慢打消了破罐子破摔的念头。

关于色彩基础知识的书和资料我看了不少,三原色、互补色、色环和光谱等知识知道了很多,但这些东西对我的帮助微乎其微。并不是这些知识没用,而是它们都需要辅助以大量的练习,可能还需要一个好的老师亲手指导,而我现在已经没时间和精力再从基础开始慢慢学画画了。不过,大量的阅读和无用尝试还是帮助我找到了一些比较实用并有迹可循的东西,下面就说一些窍门。

程序员一般都是用十六进制或者 RGB 来表示色彩,比如说 #FF0000 或者 rgb(100, 210, 241, 0.5) 之类。这种认识色彩的方式非常不好,它们对你来说只是一堆随机数字,只是“碰巧”会出现那种色彩。而且即使你知道 #FF0000 是红色,你也很难通过调整这些数字来找出你想要的色彩。现在我们不要再用十六进制或者 RGB 来考虑色彩了,我们要用 HSB 模式: H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度。

使用 HSB 来考虑色彩最大的好处是比较直观,当你调整色相(H),饱和度(S) 或亮度(B)中的某一项时,基本可以大概知道色彩会发生什么变化,这样我们就可以选出比较可控的又“不难看”的色彩搭配。比如说,我们可能选择了某一种色彩作为链接的色彩,那么就可以保持该色彩的色相(H), 饱和度(S) 值不变,只调整亮度(B) 的值,这样就顺利得到了一种比较深的色彩,可以用来做 :hover 色彩,如图:

这样用户在鼠标移动到链接上的时候,得到的反馈就比较自然,这里是个简单的 demo: http://zhuoqun.github.com/demo/link.html

如果把色彩比作杠铃的话,那么程序员的“色彩肌肉”可能只能举起 5 磅的重量,所以开始的时候我们不能太勉强,不要试图去掌控跨度很大的色彩,选中一个色彩之后,任何时候都只调整 H, S, B 中的一项即可。控制住变量,事情就不会变得太糟。

因为我们的力量有限,所以要尽可能少的使用色彩,也就是说要尽量重复使用色彩。比如说,有一种色彩我们用作链接的 :hover 色彩,同时一些高亮的文字的背景色也可以使用它,这样不但减少了色彩种类,还会给人一种视觉上的一致性,有个很好的例子就是 http://www.subtraction.com/ ,这个网站的主人以前是纽约时报的设计总监,网站除了黑白之外这个网站只有一种橘黄色。

相信很多程序员都听说过 Twitter Bootstrap. Twitter Bootstrap 是一个很酷的东西,极大地减少了设计工作,非常适合不懂设计的人快速搭建网站。但现在使用 Twitter Bootstrap 的人越来越多,很多网站看上去千篇一律,让人非常厌烦。其实完全可以根据提到的规则来定制自己的 Twitter Bootstrap, 这里我就以顶部的导航条为例简单做一个 demo. 首先我们看到导航条的背景样式是这样的:

background: #2C2C2C;
background-image: -webkit-linear-gradient(top, #333, #222);

现在我们把 #333 输入到 PhotoShop 里面,可以看到它的 HSB 的值为 0,0,20. 现在我们保持亮度(B) 不变,通过调整 H 和 S 找到一种舒服的颜色,比如 160,90,20. 但是这个颜色亮度太低了,所以我们增加 30 的亮度,颜色就变成了 160,90,50. 十六进制为:#.0D8059.

然后我们对其它颜色做同样的转换。#222 的 HSB 为 0,0,13, 然后把它的 H 和 S 的值设置为和 #333 一样,就变成了 160,90,13, 再增加 30 的亮度,就变成了 160,90,43. 十六进制为:#0B6E4D.

同理, #2C2C2C 会转换成 160,90,47. 十六进制为:#0C7854.

然后把原来样式里面的三个相应的颜色都替换掉就行了。背景换了之后,你会发现菜单选中后的背景颜色还没有改,原来的颜色是 #222, 现在要改成 #0B6E4D. 此外连接上的文字显得有些暗,原来的颜色是 #999, 现在改成 #DDD. 下面是完成后的 demo (只测试了 Chrome 浏览器): http://zhuoqun.github.com/demo/navbar.html

4. 装饰元素

装饰元素都是锦上添花的东西,上面提到的几点如果做不好的话,装饰元素再好看也没用。最常用的装饰元素是纹理和阴影。有时候我们想要给整个网页一个背景,如果是纯色会显得比较呆滞,用纹理平铺会比较好一些,在网上搜 texture 会找到很多相应图片,我比较喜欢纯色然后加一些 noise 的背景,这里有一个生成器可以帮你做到:http://www.noisetexturegenerator.com/

至于阴影,有 text-shadow 和 box-shadow 等。我以前在一些网站浏览的时候,总觉得上面的文字比较特别,选中一看才发现都加了 text-shadow . text-shadow 如果用得好会产生一些很好的文字效果,而且不会影响阅读体验。而如果想要一些立体效果,可以考虑 box-shadow, 但使用的时候要考虑到一致性和假想中的“光源”,相邻的元素最好不要做出相反的阴影。

一般比较专业的网站在细节上都处理得非常好,从装饰元素就可以看出来。因为很喜欢的 Twitter 的设计,有一阵子我就把它的首页自己实现了一遍(可以在这里查看,请用 Chrome 浏览器,因为偷懒没用考虑浏览器差异)。在抄袭的过程中,我发现即使在一些常人不会注意到的细节上它都努力做到尽善尽美。比如说输入框上面的 placeholder 其实是用 span 浮动在上面,因为原生的 placeholder 没那么丰富的效果。还有弹出窗口的那个小三角,乍看之下没什么,但如果你查看代码结构,会发现有两层:

这个让我很好奇:应该一个 div 就可以实现才对啊。当把 caret-inner 隐藏掉之后,发现原来 caret-outer 是一个半透明的层,而且宽高都比 caret-inner 多了 1px,只是用来模拟阴影效果:

Linux:程序员如何做出“不难看”的设计
Linux:程序员如何做出“不难看”的设计

仔细看就能看到那个半透明的小三角

抄到这里的时候我感到非常震惊,然后十分肯定这样的代码是设计师自己写的,不然不可能把设计意图实现得那么完美。这才是 real web designer 啊!知名设计师 Zeldman 也曾经在 Twitter 上说过:”Real web designers write code. Always have, always will.” Twitter 的设计师肯定都是自己写 HTML 和 CSS 代码。

从 Twitter 的例子可以看出,好的装饰元素可以提升品质感。但是也要注意一点,装饰元素只是用来装饰的,千万不要搞得太惹眼以至于喧宾夺主。

以上说的这几点中,修改容易并且见效最快的就是对齐和字体排印,把这两点做好设计会直接上一个台阶。颜色用不好可以先不用,都用灰度也行,比如背景颜色 #EEE , 字体颜色 #333, 分割线颜色 #CCC …… 虽然简陋,但是“不难看”。


 

下面推荐一些资源,其中有书,也有在线的教程,大部分我都看过而且觉得不错。1.《写给大家看的设计书》这本书简单易懂,介绍的也都是可以遵循的规则,很适合业余爱好者阅读,非常推荐。

2. Type is Beautiful 很好的字体博客,里面的基础文章非常值得一看。

3. Thinking with type 关于字体设计的好书,可以在线阅读。

4. 《色彩设计的原理》最近出的书,浅显易懂。

5. 《版面设计的原理》和 《色彩设计的原理》 是同一个系列,能学到很多关于布局的知识。

6. Designing for the web 包含了字体排印、配色和版式设计等多方面内容,值得一看。可以在线阅读。

7. Twitter & Twitter Bootstrap. 如果你可以把 Twitter 整个网站自己写一遍,一定会受益匪浅。

学习写程序虽然有时候也比较痛苦,但总体来说还是比较开心的,因为你能很快看到解决问题的成果。比如说,有时候程序因为少了一个分号而报错,当你通过调试改正了错误,程序立刻就会运行正常,得到你想要的结果。但是学习设计是完全不同的经验,你很难遇到“只要做了XX就会有XX效果”的情况。它的变量太多了,要完全控制这些变量需要丰富的经验和很好的感性,所以请多一些耐心,不要期望短期有大的进步。而这种耐心也是值得的:一旦你在这方面有所进步,它对你的影响就是全方位的,你不止可以做出好东西,也会在其它方面更有品味。

另外,技术和设计都是为了让自己做的东西更好用,它们都是为产品服务的,而不是要凸显自己的功能和地位。如果你通过努力终于掌握了一些设计知识和技巧以后,仅仅为了让别人知道你也懂设计就故意在自己做的东西里加一些完全不必要的“炫耀”,那真是一件值得羞耻的事情。

来源:http://www.douban.com/note/245966736/

Linux:盘点互联网巨头奉献的十大开源安全工具

Linux:盘点互联网巨头奉献的十大开源安全工具
Linux:盘点互联网巨头奉献的十大开源安全工具

Facebook等大型互联网公司推动的服务器与数据中心、大数据工具的开源化项目类似,当大型互联网公司们在超大规模基础设施运营方面面临的挑战超出技术厂商的能力时,这些巨头就选择反客为主,成为创新技术的推动者和提供者。同样的情况也在信息安全领域中发生着。不少大型互联网公司经常会将自己开发的顶级安全工具开源,推动整个互联网的安全发展。

本月早些时候安全牛曾介绍过Google开源的web安全测试工具Firing Range、Nogofail以及Facebook开源的Osquery等。

事实上不仅Google、Facebook,包括Netflix甚至Etsy.com这样的电商网站也都贡献过精品开源安全工具。

以下安全牛为大家汇总整理十大互联网巨头的开源安全工具,供大家收藏参考:

一、安全猴 Security Monkey

securitymonkeyHead

“安全猴”是Netflix三年前开发的一个安全工具,能够对亚马逊云服务的配置进行监控和安全分析,组件功能包括监控各种AWS账号组件,机遇规则的开发和执行活动,在审计规则被触发时通知用户,并存储配置历史信息用作电子取证和审计目的。

二、OSquery

OSquery是Facebook刚刚发布的一个安全工具,为安全专业人士提供了一个可调用底层操作系统功能的系统,例如启动进程、加载内核模块、在SQL数据库表中打开网络连接进行查询和监控等。

三、Skyline

Skyline是电商网站Etsy技术团队开发的一个类似Nagios的实时异常侦测系统,主要目的是为安全团队提供一个可扩展的被动监控指标体系——可以同时跟踪成百上千的指标。

四、MIDAS

MIDAS是Etsy与Facebook安全团队合作为Mac电脑开发的一个轻量级可扩展的入侵侦测系统。开发团队希望从MIDAS开始,企业开始留意OSX系统端点的常见攻击模式。

五、Secureheaders

Secureheaders是Twitter送给web开发者的一份大礼,作为一款web安全开发工具,Secureheaders能够自动实施安全相关的header规则,包括内容安全政策(CSP),防止XSS、HSTS等攻击,防止火绵羊(Firesheep)攻击以及XFO点击劫持等。

六、Google Rapid Response

GRR(Google Rapid Response)是Google开发的一个时间响应框架,支持进行远程实时取证。Google将GRR以开源工具的方式与安全界分享,可以作为FireEye/Mandiant 的MIR事件响应平台的替代产品。

七、Scumblr和Sketchy

Scumblr和Sketchy是Netflix今年夏天同时发布的两款web应用,可以帮助安全团队监控和记录社交媒体和网络聊天中的安全威胁和攻击。

八、Conceal

Conceal是面向Android平台的一组简单的Java API,能够对SD卡等公共存储设备中的大文件进行快速加密和认证。Conceal由Facebook设计,开发者可利用Conceal开发出能适用于老版本Android的内存和处理器开销较低的加密算法。

九、Rappor

RAPPOR(Randomized Aggregatable Privacy-Preserving Ordinal Response )是Google上月才发布的隐私工具,能够从终端用户软件采集众包统计数据,同时又不侵犯用户隐私。

十、Moloch

Moloch由AOL的技术团队开发,是一个网络流量分析取证工具,能够大规模抓取IPv4数据包,进行索引并存储,可通过一个简单的web界面浏览、搜索和输出所有PCAP数据。

来源:http://www.aqniu.com/tools/security-tools/5732.html

Linux:Open vSwitch(OvS)源代码之Linux RCU锁机制分析

Linux:Open vSwitch(OvS)源代码之Linux RCU锁机制分析
Linux:Open vSwitch(OvS)源代码之Linux RCU锁机制分析

前言

本来想继续顺着数据包的处理流程分析upcall调用的,但是发现在分析upcall调用时必须先了解linux中内核和用户空间通信接口Netlink机制,所以就一直耽搁了对upcall的分析。如果对Open vSwitch有些了解的话,你会发现其实Open vSwitch是在linux系统上运行的,因为Open vSwitch中有很多的机制,模块等都是直接调用linux内核的。比如:现在要分析的RCU锁机制、upcall调用、以及一些结构体的定义都是直接从linux内核中获取的。所以如果你在查看源代码的一些结构(或者模块,机制性代码)时,发现在Open vSwitch中没有定义(我用的是Source Insight来查看和分析源码,可以很好的查看是否定义过),那么很可能就是Open vSwitch包含了linux头文件引用了linux内核的一些定义。

RCU是linux的新型锁机制(RCU是在linux 2.6内核版本中开始正式使用的),本来一直纠结要不要用篇blog来说下这个锁机制。因为在Open vSwitch中有很多的地方用到了RCU锁,我开始分析的时候都是用一种锁机制一笔带过(可以看下Open vSwitch(OvS)源代码分析之数据结构》里面有很多地方都用到了RCU锁机制)。后来发现有很多地方还用到了该锁机制的链表插入和删除操作,而且后面分析的代码中也有RCU的出现,所以就稍微的说下这个锁机制的一些特性和操作。

RCU运行原理

我们先来回忆下读写锁(rwlock)运行机制,这样可以分析RCU的时候可以对照着分析。读写锁分为读锁(也称共享锁),写锁(也称排他锁,或者独占锁)。分情况来分析下读写锁: 第一、要操作的数据区被上了读锁;1、若请求是读数据时,上读锁,多个读锁不排斥(即,在访问数据的读者上线未达到时,可以对该数据区再上读锁);2、若请求是写数据,则不能马上上写锁,而是要等到数据区的所有锁(包括读锁和写锁)都释放掉后才能开始上写访问。

第二、要操作的数据区上了写锁;则不管是什么请求都必须等待数据区的写锁释放掉后才能上锁访问。

同理来分析下RCU锁机制:RCU是read copy udate的缩写,按照单词意思就知道这是一种针对数据的读、复制、修改的保护锁机制。锁机制原理:

第一、写数据的时候,不需要像读写锁那样等待所有锁的释放。而是会拷贝一份数据区的副本,然后在副本中修改,等待修改完后。用这个副本替换原来的数据区, 替换的时候就要像读写锁中上写锁那样,等到原数据区上所有访问者都退出后,才进行数据的替换;根据这种特性可以推断出,用RCU锁可以有多个写者,拷贝了 多份数据区数据,修改后各个写着陆续的替换掉原数据区内容。

第二、读数据的时候,不需要上任何锁,也几乎不需要什么等待(读写锁中如果数据区有写锁则要等待)就可以直接访问数据。为什么说几乎不需要等待呢?因为写数据中替换原数据时,只要修改个指针就可以,消耗的时间可以说几乎不算,所以说读数据不需要其他额外开销。

总结下RCU锁机制特性,允许多个读者和多个写者同时访问共享数据区的内容。而且这种锁对多读少写的数据来说是非常高效的,可以让CPU减少些额外的开 销。如果写得操作多了的话,这种机制就没读写锁那么好了。因为RCU写数据开销还是很大的,要拷贝数据,然后还要修改,最后还要等待替换。其实这个机制就 好比我们在一台共享服务器上放了个文件,有很多个人一起使用。如果你只是看看这个文件内容,那么直接在服务器上cat查看就可以。但如果你要修改该文件, 那么你不能直接在服务器上修改,因为你这样操作会影响到将要看这个文件或者写这个文件的人。所以你只能先拷贝到自己本机上修改,当最后确认保证正确时,然 后就替换掉服务器上的原数据。

RCU写者工作图示

下面看下RCU机制下修改数据(以链表为例)。

Linux:Open vSwitch(OvS)源代码之Linux RCU锁机制分析
Linux:Open vSwitch(OvS)源代码之Linux RCU锁机制分析

根据上面的图会发现其实替换的时候只要修改下指针就可以,原数据区内容在被替换后,默认会被垃圾回收机制回收掉。

Linux内核RCU机制API

了解了RCU的这些机制原理,下面来看下linux内核中常使用的一些和RCU锁有关的操作。注意,本blog并不会过多的去深究RCU最底层的实现机制,因为分享RCU工作机制的目的只是为了更好的了解Open vSwitch中使用到的那部分代码的理解,而不是为了分析linux内核源代码,不要本末倒置。如果遇到个知识点就拼命的深挖,那么你看一份源代码估计得几个月。

  • rcu_read_lock();

看到这里有人可能会觉得和上面有矛盾,不是说好的读者不需要锁吗?其实这不是和上读写锁的那种上锁,这仅仅只是标识了临界区的开始位置。表明在临界区内不能阻塞和休眠,也不能让写者进行数据的替换(其实这功能远不止这些)。rcu _read_unlock()则是和上面rcu_read_lock()对应的,用来界定一个临界区(就是要用锁保护起来的数据区)。

  • synchronize_rcu();

当该函数被一个CPU调用时(一般是有写者替换数据时调用),而其他的CPU都在RCU保护的临界区读数据,那么synchronize_rcu()将会 保证阻塞写者,直到所有其它读数据的CPU都退出临界区时,才中止阻塞,让写着开始替换数据。该函数作用就是保证在替换数据前,所有读数据的CPU能够安 全的退出临界区。同样,还有个call_rcu()函数功能也是类似的。如果call_rcu()被一个CPU调用,而其他的CPU都在RCU保护的临界 区内读数据,相应的RCU回调的调用将被推迟到其他读临界区数据的CPU全部安全退出后才执行(可以看linux内核源文件的注释,在 Rcupdate.h文件中rcu_read_look()函数前面的注释)。

  • rcu_dereference();

获取在一个RCU保护的指针,指向RCU读端临界区。他的指针以后可能会被安全地解除引用。说到底就是一个RCU保护指针。

  • list_add_rcu();

往RCU保护的数据结构中添加一个数据节点进去。这个和一般的往链表中增加一个节点操作是类似的,唯一不同的是多了这条代 码:rcu_assign_pointer(prev->next, new); 代码大概含义:分配指向一个新初始化的结构指针,将由RCU读端临界区被解除引用,返回指定的值。(说实话我也不太懂这个注释是什么意思)大概的解释下: 就是让插入点的前一个节点的next指向新增加的new节点,为什么要单独用一条这个语句来实现,而不是用 prev->next = new;直接实现呢?这是因为prev->next本来是指向其他值得,有可能有CPU通过prev->next去访问其他RCU保护的数据 了,所以如果你要插入一个RCU保护的数据结构中必要要调用这个语句,它里面会帮你处理好一些细节(比如有其他CPU使用后面的数据,直接使用 prev->next可能会使读数据的CPU断开,产生问题),并且让刚加入的新节点也受到RCU的保护。这类的插入有很多,比如从头部插入,从尾 部插入等,实现都差不多,这里不一一细讲。

  • list_for_each_entry_rcu();

这是个遍历RCU链表的操作,和一般的链表遍历差不多。不同点就是必须要进入RCU保护的CPU(即:调用了rcu_read_lock()函数的 CPU)才能调用这个操作,可以和其他CPU共同遍历这个RCU链表。以此相同的还有其他变相的遍历及哈希链表的遍历,不细讲。

如果在Open vSwitch源代码分析中发现了有关RCU的分析和这里的矛盾,可以以这里为准,当然我也会校对下。

来源:http://blog.sina.com.cn/s/blog_138c6e98e0102v8o9.html

Linux:如何用Puppet和Augeas管理Linux配置

虽然Puppet是一个真正独特的有用工具,但在有些情况下你可以使用一点不同的方法来用它。比如,你要修改几个服务器上已有的配置文件,而且它们彼此稍有不同。Puppet实验室的人也意识到了这一点,他们在 Puppet 中集成了一个叫做Augeas的伟大的工具,它是专为这种使用情况而设计的。

Augeas可被认为填补了Puppet能力的空白,比如在其中一个指定对象的资源类型(例如用于维护/etc/hosts中的条目的主机资源)还不可用时。在这个文档中,您将学习如何使用Augeas来减轻你管理配置文件的负担。

Augeas是什么?

Augeas基本上就是一个配置编辑工具。它以他们原生的格式解析配置文件并且将它们转换成树。配置的更改可以通过操作树来完成,并可以以原生配置文件格式保存配置。

这篇教程要达成什么目的?

我们会针对我们之前构建的Puppet服务器安装并配置Augeas。我们会使用这个工具创建并测试几个不同的配置文件,并学习如何适当地使用它来管理我们的系统配置。

前置阅读

我们需要一台工作的Puppet服务器和客户端。如果你还没有,请先按照我先前的教程来。

Augeas安装包可以在标准CentOS/RHEL仓库中找到。不幸的是,Puppet用到的Augeas的ruby封装只在puppetlabs仓库中(或者EPEL)中才有。如果你系统中还没有这个仓库,请使用下面的命令:

在CentOS/RHEL 6.5上:

 # rpm -­ivh https://yum.puppetlabs.com/el/6.5/products/x86_64/puppetlabs­release­6­10.noarch.rpm

在CentOS/RHEL 7上:

 # rpm -­ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs­release­7­10.noarch.rpm

在你成功地安装了这个仓库后,在你的系统中安装Ruby­Augeas:

 # yum install ruby­augeas

或者如果你是从我的上一篇教程中继续的,使用puppet的方法安装这个包。在/etc/puppet/manifests/site.pp中修改你的custom_utils类,在packages这行中加入“ruby­augeas”。

class custom_utils {
        package { ["nmap","telnet","vim­enhanced","traceroute","ruby­augeas"]:
                ensure => latest,
                allow_virtual => false,
        }
}

不带Puppet的Augeas

如我先前所说,最初Augeas并不是来自Puppet实验室,这意味着即使没有Puppet本身我们仍然可以使用它。这种方法可在你将它们部署到Puppet环境之前,验证你的修改和想法是否是正确的。要做到这一点,你需要在你的系统中安装一个额外的软件包。请执行以下命令:

# yum install augeas

Puppet Augeas 示例

用于演示,这里有几个Augeas使用案例。

管理 /etc/sudoers 文件

  1. 给wheel组加上sudo权限。

这个例子会向你展示如何在你的GNU/Linux系统中为%wheel组加上sudo权限。

# 安装sudo包
package { 'sudo':
    ensure => installed, # 确保sudo包已安装
}
# 允许用户属于wheel组来使用sudo
augeas { 'sudo_wheel':
    context => '/files/etc/sudoers', # 目标文件是 /etc/sudoers
    changes => [
        # 允许wheel用户使用sudo
        'set spec[user = "%wheel"]/user %wheel',
        'set spec[user = "%wheel"]/host_group/host ALL',
        'set spec[user = "%wheel"]/host_group/command ALL',
        'set spec[user = "%wheel"]/host_group/command/runas_user ALL',
    ]
}

现在来解释这些代码做了什么:spec定义了/etc/sudoers中的用户段,[user]定义了数组中给定的用户,所有的定义放在该用户的斜杠( / ) 后那部分。因此在典型的配置中这个可以这么表达:

user host_group/host host_group/command host_group/command/runas_user

这个将被转换成/etc/sudoers下的这一行:

%wheel ALL = (ALL) ALL
  1. 添加命令别称

下面这部分会向你展示如何定义命令别名,它可以在你的sudoer文件中使用。

# 创建新的SERVICE别名,包含了一些基本的特权命令。
augeas { 'sudo_cmdalias':
    context => '/files/etc/sudoers', # 目标文件是 /etc/sudoers
    changes => [
      "set Cmnd_Alias[alias/name = 'SERVICES']/alias/name SERVICES",
      "set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[1] /sbin/service",
      "set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[2] /sbin/chkconfig",
      "set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[3] /bin/hostname",
      "set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[4] /sbin/shutdown",
    ]
}

sudo命令别名的语法很简单:Cmnd_Alias定义了命令别名字段,[alias/name]绑定所有给定的别名,/alias/name SERVICES 定义真实的别名,alias/command 是属于该别名的所有命令的数组。以上将被转换如下:

Cmnd_Alias SERVICES = /sbin/service , /sbin/chkconfig , /bin/hostname , /sbin/shutdown

关于/etc/sudoers的更多信息,请访问官方文档

向一个组中加入用户

要使用Augeas向组中添加用户,你也许要添加一个新用户,不管是排在 gid 字段还是最后的用户 uid 之后。我们在这个例子中使用SVN组。这可以通过下面的命令达成:

在Puppet中:

augeas { 'augeas_mod_group:
    context => '/files/etc/group', #目标文件是 /etc/group
    changes => [
        "ins user after svn/*[self::gid or self::user][last()]",
        "set svn/user[last()] john",
    ]
}

使用 augtool:

 augtool> ins user after /files/etc/group/svn/*[self::gid or self::user][last()] augtool> set /files/etc/group/svn/user[last()] john

总结

目前为止,你应该对如何在Puppet项目中使用Augeas有点明白了。随意地试一下,你肯定需要浏览官方的Augeas文档。这会帮助你了解如何在你的个人项目中正确地使用Augeas,并且它会让你知道可以用它节省多少时间。

如有任何问题,欢迎在下面的评论中发布,我会尽力解答和向你建议。

有用的链接


via: http://xmodulo.com/2014/09/manage-configurations-linux-puppet-augeas.html

作者:Jaroslav Štěpánek 译者:geekpi 校对:wxy

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

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

Linux:使用GDB命令行调试器调试C/C++程序

没有调试器的情况下编写程序时最糟糕的状况是什么?编译时跪着祈祷不要出错?用血祭召唤恶魔帮你运行程序?或者在每一行代码间添加printf(“test”)语句来定位错误点?如你所知,编写程序时不使用调试器的话是不方便的。幸好,linux下调试还是很方便的。大多数人使用的IDE都集成了调试器,但 linux 最著名的调试器是命令行形式的C/C++调试器GDB。然而,与其他命令行工具一致,DGB需要一定的练习才能完全掌握。这里,我会告诉你GDB的基本情况及使用方法。

Linux:使用GDB命令行调试器调试C/C++程序
Linux:使用GDB命令行调试器调试C/C++程序

安装GDB

大多数的发行版仓库中都有GDB

Debian 或 Ubuntu

$ sudo apt-get install gdb

Arch Linux

$ sudo pacman -S gdb

Fedora,CentOS 或 RHEL:

$sudo yum install gdb

如果在仓库中找不到的话,可以从官网中下载

示例代码

当学习GDB时,最好有一份代码,动手试验。下列代码是我编写的简单例子,它可以很好的体现GDB的特性。将它拷贝下来并且进行实验——这是最好的方法。

#include 
#include 
int main(int argc, char **argv)
{
    int i;
    int a=0, b=0, c=0;
    double d;
    for (i=0; i<100; i++)
    {
        a++;
        if (i>97)
            d = i / 2.0;
        b++;
    }
    return 0;
}

GDB的使用

首先最重要的,你需要使用编译器的 “-g“选项来编译程序,这样可执行程序才能通过GDB来运行。通过下列语句开始调试:

$ gdb -tui [可执行程序名]

使用”-tui“选项可以将代码显示在一个漂亮的交互式窗口内(所以被称为“文本用户界面 TUI”),在这个窗口内可以使用光标来操控,同时在下面的GDB shell中输入命令。

Linux:使用GDB命令行调试器调试C/C++程序
Linux:使用GDB命令行调试器调试C/C++程序

现在我们可以在程序的任何地方设置断点。你可以通过下列命令来为当前源文件的某一行设置断点。

break [行号]

或者为一个特定的函数设置断点:

break [函数名]

甚至可以设置条件断点

break [行号] if [条件]

例如,在我们的示例代码中,可以设置如下:

break 11 if i > 97
Linux:使用GDB命令行调试器调试C/C++程序
Linux:使用GDB命令行调试器调试C/C++程序

这样,程序循环97次之后停留在“a++”语句上。这样是非常方便的,避免了我们需要手动循环97次。

最后但也是很重要的是,我们可以设置一个“观察断点”,当这个被观察的变量发生变化时,程序会被停止。

watch [变量]

这里我们可以设置如下:

watch d

当d的值发生变化时程序会停止运行(例如,当i>97为真时)。

当设置断点后,使用”run”命令开始运行程序,或按如下所示:

r [程序的输入参数(如果有的话)]

gdb中,大多数的命令单词都可以简写为一个字母。

不出意外,程序会停留在11行。这里,我们可以做些有趣的事情。下列命令:

bt

回溯功能(backtrace)可以让我们知道程序如何到达这条语句的。

info locals

这条语句会显示所有的局部变量以及它们的值(你可以看到,我没有为d设置初始值,所以它现在的值是任意值)。

当然:

Linux:使用GDB命令行调试器调试C/C++程序
Linux:使用GDB命令行调试器调试C/C++程序
p [变量]

这个命令可以显示特定变量的值,而更进一步:

ptype [变量]

可以显示变量的类型。所以这里可以确定d是double型。

既然已经到这一步了,我么不妨这么做:

set var [变量] = [新的值]

这样会覆盖变量的值。不过需要注意,你不能创建一个新的变量或改变变量的类型。我们可以这样做:

set var a = 0

如其他优秀的调试器一样,我们可以单步调试:

step

使用如上命令,运行到下一条语句,有可能进入到一个函数里面。或者使用:

next

这可以直接运行下一条语句,而不进入子函数内部。

Linux:使用GDB命令行调试器调试C/C++程序
Linux:使用GDB命令行调试器调试C/C++程序

结束测试后,删除断点:

delete [行号]

从当前断点继续运行程序:

continue

退出GDB:

quit

总之,有了GDB,编译时不用祈祷上帝了,运行时不用血祭了,再也不用printf(“test“)了。当然,这里所讲的并不完整,而且GDB的功能远远不止于此。所以我强烈建议你自己更加深入的学习它。我现在感兴趣的是将GDB整合到Vim中。同时,这里有一个备忘录记录了GDB所有的命令行,以供查阅。

你对GDB有什么看法?你会将它与图形调试器对比吗,它有什么优势呢?对于将GDB集成到Vim有什么看法呢?将你的想法写到评论里。


via: http://xmodulo.com/gdb-command-line-debugger.html

作者:Adrien Brochard 译者:SPccman 校对:wxy

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

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

vim: Emacsist文摘第三期: 最好的编辑器不是Emacs也不是Vim

点这里 查看更多Emacs 相关推荐文章 或最新 Emacs 圈的动态. 欢迎关注微信公众账号: Emacsist

Hick叽喳:

    最好的编辑器不是Emacs也不是Vim ,是Emacs和Vim: Spacemacs

欢迎通过 http://emacsist.com/weixin 中的各种渠道推荐不错的文章, 我会根据情况整理并署名转荐大家 🙂

长按下面二维码关注 Emacs 公众账号分享交流 Emacs 的使用:

原文出处:hick

原文地址: http://emacsist.com/10265

原文时间: 2015-06-10 04:19

本文由 Hick整理,转载请保留以上信息;

The articles on this site come from Internet, thanks to all the original authors.

If anything about COPYRIGHT, or LEFT, please contact Emacsist at gmail dot com .

原文:http://emacsist.com/10265

shell:BASH 的目录切换

By WEN Pingbo ofTinyLab.org

2015/06/02

在 BASH 中你用的最多的命令是什么?这绝对非 cd 莫属(ls 也是个潜力股,暂时做老二吧)。所以在这篇文章中,我们聊聊如何高效的在 BASH 中切换目录。

往后切换目录

回退目录,正规的做法是 cd ..。但网上的小伙伴很有才,发明了更简洁实用的命令。这里把它搬过来,其实我自己也一直这么用的:

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

甚至可以定义5点的别名,但感觉用到的几率不大。有了这些别名,就可以愉快的用 N 个点来回退 N 级目录。

其实在进行目录切换时,BASH 默认会把上一个目录记录在 OLDPWD。可以用 cd –,或者 cd $OLDPWD来在两个目录之间来回切换。这在两个不同的目录树下,很有作用。

往前切换目录

进入指定的目录,这个没什么特别的技巧了。老老实实用 cd /path/to/dir来做吧。虽然目的地咱不能省,还是可以偷点懒的。

CDPATH

我们可以利用 CDPATH 定义 cd命令的 base 目录,然后就可以直达目的地,而不用在前面加一堆父目录。比如:

vim: BASH 的目录切换
vim: BASH 的目录切换

不过这个方法不是很灵活,且有副作用。前段时间,我机器上编译 Android,死活过不去,最后发现是这货搞的鬼。所以,玩玩可以,在生产环境慎用!

CDSPELL

在 BASH 中打开 cdspell( shopt -s cdspell),可以在你目标目录写错的时候,BASH 能自动帮你矫正,省了重新敲一遍。效果如下:

vim: BASH 的目录切换
vim: BASH 的目录切换

这个还是很有用的,建议打开。

目录堆栈

前面讲的大多数是两个目录之间的切换,我们可以简单的用一个变量 OLDPWD 来记录。如果涉及到多个目录,为了记录之前目录切换的历史记录,就得另起一套机制了。而 BASH 就为我们提供了这样一套机制 – “目录堆栈(dirs/pushd/popd)”。其运行机制就是一个堆栈,先进先出。我们可以用 pushd dir来 push 对应的目录路径,用 popd来弹出栈顶的目录,用 dirs可以查看当前堆栈的内容。这个堆栈,在各个 BASH 实例之间是不通用的。也就是说在当前 BASH 中 push 的目录,不会影响其他 BASH。每开一个 BASH,都会初始化一个这样的堆栈。

有的时候,在脚本中需要临时保存当前工作路径,以便回溯。这个时候就可以利用这个目录堆栈了。

模拟 Windows Explorer (icd)

之前,我一直纠结在为什么 BASH 只能记录两层目录。当你的工作目录层数比较多的时候,你经常需要多次 cd ..来把工作目录回退 A 目录,然后又要进入 B 目录,再进入 C 目录,最后还要回到 A 目录。尽管前面已经偷了很多懒,还是显得很繁琐。而我的想法是把 Windows 的文件浏览器中前进和后退功能添加到 BASH 中,就像 nautilus 和 各大浏览器做的那样。

为了实现这种效果,首先得记录每次进入的目录路径。这个 BASH 自带的目录堆栈可以做,但是 BASH 在 popd 之后,就把栈顶的路径删除了。这样就导致后退后,无法再前进了。所以得额外定义一套机制来保存目录记录。这里我用一个文件来存放,文件的第一行是记录的路径总数,第二行是当前所在的目录位置,而之后的的每一行就代表一条目录记录。比如:

3
2
/home
/home/wenpingbo
/var/log

这样,后退可以到 /home,前进可以到 /var/log。另外,为了保证各个 BASH 之间互不干扰,还得引入 session 这个概念。还是直接为每一个 BASH 创建这样一个文件,放在 /tmp下,文件名就以 BASHPID 为后缀,避免重名。

逻辑上,得实现 3 个函数 icd_mainicd_backwardicd_forward,用于进入新目录、后退、前进。然后定义快捷键绑定到这 3 个函数,来实现相应的功能。我自己是这样绑定的:

alias cd=icd_main
alias h=icd_backward
alias l=icd_forward
# Ctrl + right
bind '"e[1;5D>":"hn>"'
# Ctrl + left
bind '"e[1;5C>":"ln>"' 

这样,就可以用 h/ Ctrl-right来回退, l/ Ctrl-left来前进, cd来做正常的目录改变。一起来看一下效果:

vim: BASH 的目录切换
vim: BASH 的目录切换

对应的源码,可以在这找到 icd src

~原创有您,更持久!期待您的支持~

vim: BASH 的目录切换
vim: BASH 的目录切换

0 0

原文:http://www.tinylab.org/bash-directory-change/

Linux:如何将 Ubuntu14.04 Server 安全的升级到14.10

你可能已经知道如何将你的 Ubuntu 桌面升级到最新版本了,不过如果你用的 Ubuntu Server,而且也正好又希望升级一下的话(前提是,不会影响你的应用。一般来说,对于服务器操作系统,应该采用保守态度。如果不是必须升级才能解决的安全问题,最好不要升级,而是采用各种外部手段来解决。)

Linux:如何将 Ubuntu14.04 Server 安全的升级到14.10
Linux:如何将 Ubuntu14.04 Server 安全的升级到14.10

如果想从Ubuntu14.04/13.10/13.04/12.10/12.04或者更老的版本升级到14.10,只要遵循下面给出的步骤。注意,你不能直接从13.10升级到14.10。你应该先将13.10升级到14.04在从14.04升级到14.10。下面是详细步骤。

下面的步骤不仅能用于14.10,也兼容于一些像Lubuntu14.10,Kubuntu14.10和Xubuntu14.10等的Ubuntu衍生版本

重要:在升级之前,保险起见,不要忘了将你的数据在U盘或外部硬盘上保存一下。

服务器升级

从ubuntu14.04的服务器升级到14.10的服务器,采用下面的步骤。

安装update-manager-core 这个包如果之前没唷安装的话:

sudo apt-get install update-manager-core

编辑 /etc/update-manager/release-upgrades这个文件。

sudo nano /etc/update-manager/release-upgrades

像下面那样设置Prompt=normal或者Prompt=lts

# Default behavior for the release upgrader.
[DEFAULT]
# Default prompting behavior, valid options:
#
#  never  - Never check for a new release.
#  normal - Check to see if a new release is available.  If more than one new
#           release is found, the release upgrader will attempt to upgrade to
#           the release that immediately succeeds the currently-running
#           release.
#  lts    - Check to see if a new LTS release is available.  The upgrader
#           will attempt to upgrade to the first LTS release available after
#           the currently-running one.  Note that this option should not be
#           used if the currently-running release is not itself an LTS
#           release, since in that case the upgrader won't be able to
#           determine if a newer release is available.
Prompt=normal

现在可以通过下面的命令来更新你的服务系统了。

sudo do-release-upgrade -d

直到屏幕提示你已完成。


via: http://www.unixmen.com/upgrade-ubuntu-14-04-trusty-ubuntu-14-10-utopic/

作者:SK 译者:johnhoow 校对:wxy

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

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