Skip to content Skip to main navigation Skip to footer

Linux

Linux:重走LFS之路:(三) 磁盘初始化与源码准备

当硬件部分都准备就绪,就可以开始动手来准备软件了。不过在开始编译之前需要先做一件事,就像Windows中说的要格式化分区。虽然我真心不喜欢用Linux和Windows比,因为那样着实像是在英语和汉语之间来回翻译,想想就知道印欧语系和汉藏语系两门语言跨语系表述是多别扭的事。

Linux:重走LFS之路:(三) 磁盘初始化与源码准备
Linux:重走LFS之路:(三) 磁盘初始化与源码准备

(题图来自: techradar.com)

在Linux中,我们把这个操作叫做建立文件系统。Linux使用的文件系统是ext系列和swap,其中swap只用作交换分区的格式,所谓交换分区可以理解为虚拟内存。

此时我们已经建立了三个分区/dev/sdb1 /dev/sdb2 /dev/sdb5,其中/dev/sdb1用作引导分区,我们将其文件系统建立为ext2,虽然实测ext4也没问题,但是可能是为了兼容一些老的东西吧,习惯上引导分区还是用ext2。作为swap分区的/dev/sdb2单独有分区格式,就叫做swap。剩下的/dev/sdb5使用ext4就好了。

sudo mkfs -v -t ext2 /dev/sdb1
sudo mkswap /dev/sdb2
sudo mkfs -v -t ext4 /dev/sdb5
Linux:重走LFS之路:(三) 磁盘初始化与源码准备
Linux:重走LFS之路:(三) 磁盘初始化与源码准备

建立文件系统后,就可以挂载,然后使用这块空间了。不过在此之前为了方便,我们来加个环境变量

export LFS=/mnt/lfs

从此以后,我们就以$LFS来作为lfs工程的存储根目录,只不过需要记得,每次宿主系统重启之后,都需要重新export和mount,如果嫌这样太麻烦,可以把环境变量定义和分区挂载写入用户配置文件~/.bashrc

建立$LFS,用到p和v两个选项,p是parents,如果父目录不存在就一路新建,v会创建成功后回显信息。

sudo mkdir -pv $LFS

此时回显了一条信息

mkdir: created directory `/mnt/lfs’

当看到这条回显信息时证明已经新建成功,接下来我们把lfs工程的主要存储分区/dev/sdb5挂载到这个目录上

sudo mount -v -t ext4 /dev/sdb5 $LFS

其中-v选项依然是操作成功后回显信息,而值得注意的是-t选项,由它来指定需要挂载的是什么文件系统的分区,在稍微老一点的linux中挂载NTFS时候可能需要用到这个选项,保险起见我们还是显式定义了这个参数。

/dev/sdb5 on /mnt/lfs type ext4 (rw)

当看到这条回显信息的时候,证明/dev/sdb5分区已经成功地以读写方式挂载到了/mnt/lfs目录,接下来我们就可以像操作一个目录一样地操作这个分区。如果不太放心自己的$LFS定义的是否正确,可以用echo打印出来看看

echo $LFS

至此我们就可以在$LFS上面来下载和编译我们所需的lfs组件了,不过在此之前为了方便,我们需要把$LFS目录的属主改为当前用户,否则每次不危险的操作都加sudo得多别扭。顺便把等下要用到的存储下载源码的路径$LFS/src一起新建出来

sudo chown -R purehow.purehow $LFS
mkdir $LFS/src
Linux:重走LFS之路:(三) 磁盘初始化与源码准备
Linux:重走LFS之路:(三) 磁盘初始化与源码准备

现在我们就可以进入$LFS/src来下载所需的组件,此时我们手动一个一个下载可就太痛苦了,好在wget有一个–input-file选项可以指定下载列表。官方提供了下载列表,我们此时需要下载两个文件,一个是文件下载列表wget-list,另一个是这个列表中每个文件的md5sum值,这样可以有效校验我们下载的源码文件是否完整正确。

cd $LFS/src
wget http://archive.linuxfromscratch.org/lfs-museum/stable/wget-list
wget http://archive.linuxfromscratch.org/lfs-museum/stable/md5sums

其中md5sum这个文件等下下载完成我们才能用到,现在先下载这些文件

wget –input-file=wget-list –continue –directory-prefix=$LFS/src
Linux:重走LFS之路:(三) 磁盘初始化与源码准备
Linux:重走LFS之路:(三) 磁盘初始化与源码准备

此时我们可以看到,文件已经在下载了。

关于wget的参数:

–input-file是下载列表文件,文件格式就是每行一个链接。

–continue是断点续传,预防某种网络错误导致的下载中断。

–directory-prefix下载存储目录

有些人总嫌直接下载慢,需要个快点的代理。现在的翻墙代理貌似还真的只有ssh还比较靠谱,但是ssh tunnel回来的是一个本地的socks5端口,不巧的是wget里面压根就没法直接用socks5代理。这时候需要个小工具privoxy。

sudo aptitude install privoxy
sudo vi /etc/privoxy/config

从里面能找到listen-address一行,它默认配的是localhost:8118,我是改成了127.0.0.1:8118,这行配置是指的转成的http代理用哪个端口。再找一行叫做forward-socks5,本来是注释的,我也没打开这个注释,直接新加一行forward-socks5 127.0.0.1:1080,1080就是ssh tunnel回来的socks5端口。

listen-address 127.0.0.1:8118
forward-socks5 127.0.0.1:1080

此时的wget就可以使用-e参数来指定http_proxy,于是刚才的下载命令就变成了酱紫

wget –input-file=wget-list –continue –directory-prefix=$LFS/src -e “http_proxy=http://127.0.0.1:8118″

好吧~本站提供这堆东西的打包下载

http://www.haopingrui.cn/lfs.tar.gz 124e1eb0e52f176ab84c38118b4975e3

只要你的网速没问题,北京联通实测能够稳定在300KBps左右,峰值曾经到1MBps以上。

下载完成后验证md5sum无误,就可以解压lfs.tar.gz了,如果不是从本站下载的可以忽略这一步

之后将源码包目录压入目录栈,并且使用刚才下载的md5sums文件来验证每个源码包和补丁是否下载正确,这一步非常重要。值得注意的是,pushd之后需要popd,否则会一直压着。另外pushd之后当前目录会改变为这个目录,所以需要../md5sum。

#md5sum lfs.tar.gz
124e1eb0e52f176ab84c38118b4975e3  lfs.tar.gz
#tar zxvf lfs.tar.gz > /dev/null
#pushd $LFS/src/lfs
/mnt/lfs/src/lfs /mnt/lfs/src
#md5sum -c ../md5sums
acl-2.2.52.src.tar.gz: OK
attr-2.4.47.src.tar.gz: OK
autoconf-2.69.tar.xz: OK
automake-1.15.tar.xz: OK
bash-4.3.30.tar.gz: OK
bc-1.06.95.tar.bz2: OK
binutils-2.25.tar.bz2: OK
bison-3.0.4.tar.xz: OK
bzip2-1.0.6.tar.gz: OK
check-0.9.14.tar.gz: OK
coreutils-8.23.tar.xz: OK
dejagnu-1.5.2.tar.gz: OK
diffutils-3.3.tar.xz: OK
eudev-2.1.1.tar.gz: OK
eudev-2.1.1-manpages.tar.bz2: OK
e2fsprogs-1.42.12.tar.gz: OK
expat-2.1.0.tar.gz: OK
expect5.45.tar.gz: OK
file-5.22.tar.gz: OK
findutils-4.4.2.tar.gz: OK
flex-2.5.39.tar.bz2: OK
gawk-4.1.1.tar.xz: OK
gcc-4.9.2.tar.bz2: OK
gdbm-1.11.tar.gz: OK
gettext-0.19.4.tar.xz: OK
glibc-2.21.tar.xz: OK
gmp-6.0.0a.tar.xz: OK
gperf-3.0.4.tar.gz: OK
grep-2.21.tar.xz: OK
groff-1.22.3.tar.gz: OK
grub-2.02~beta2.tar.xz: OK
gzip-1.6.tar.xz: OK
iana-etc-2.30.tar.bz2: OK
inetutils-1.9.2.tar.gz: OK
intltool-0.50.2.tar.gz: OK
iproute2-3.19.0.tar.xz: OK
kbd-2.0.2.tar.gz: OK
kmod-19.tar.xz: OK
less-458.tar.gz: OK
lfs-bootscripts-20150222.tar.bz2: OK
libcap-2.24.tar.xz: OK
libpipeline-1.4.0.tar.gz: OK
libtool-2.4.6.tar.xz: OK
linux-3.19.tar.xz: OK
m4-1.4.17.tar.xz: OK
make-4.1.tar.bz2: OK
man-db-2.7.1.tar.xz: OK
man-pages-3.79.tar.xz: OK
mpc-1.0.2.tar.gz: OK
mpfr-3.1.2.tar.xz: OK
ncurses-5.9.tar.gz: OK
patch-2.7.4.tar.xz: OK
perl-5.20.2.tar.bz2: OK
pkg-config-0.28.tar.gz: OK
procps-ng-3.3.10.tar.xz: OK
psmisc-22.21.tar.gz: OK
readline-6.3.tar.gz: OK
sed-4.2.2.tar.bz2: OK
shadow-4.2.1.tar.xz: OK
sysklogd-1.5.1.tar.gz: OK
sysvinit-2.88dsf.tar.bz2: OK
tar-1.28.tar.xz: OK
tcl8.6.3-src.tar.gz: OK
texinfo-5.2.tar.xz: OK
tzdata2015a.tar.gz: OK
udev-lfs-20140408.tar.bz2: OK
util-linux-2.26.tar.xz: OK
vim-7.4.tar.bz2: OK
XML-Parser-2.44.tar.gz: OK
xz-5.2.0.tar.xz: OK
zlib-1.2.8.tar.xz: OK
bash-4.3.30-upstream_fixes-1.patch: OK
bc-1.06.95-memory_leak-1.patch: OK
bzip2-1.0.6-install_docs-1.patch: OK
coreutils-8.23-i18n-1.patch: OK
glibc-2.21-fhs-1.patch: OK
kbd-2.0.2-backspace-1.patch: OK
mpfr-3.1.2-upstream_fixes-3.patch: OK
readline-6.3-upstream_fixes-3.patch: OK
sysvinit-2.88dsf-consolidated-1.patch: OK

Linux:重走LFS之路:(三) 磁盘初始化与源码准备
Linux:重走LFS之路:(三) 磁盘初始化与源码准备
Linux:重走LFS之路:(三) 磁盘初始化与源码准备
Linux:重走LFS之路:(三) 磁盘初始化与源码准备

检测无误,分区和源码准备完成。

来源:http://www.haopingrui.cn/?p=72

Linux:使用 Varnish 优化移动端站点

想象一下,你刚刚发布了一篇博文,并分享到了社交网络。然后,这篇文章恰巧被大V看中再次分享了出去,立即吸引了数百粉丝的目光,引导他们涌入了你的网站。看到这么多的访客量,以及它们的评论,你内心激动不已。突然之间,你的网站就挂掉了,满屏的数据连接错误……

或者假想另一种情境,你一直很努力地创业。突然有一天,一个大V在社交网络表达了对贵公司的喜爱之情,字里行间满满的赞叹。关注这个大V的粉丝心动了,又涌入了你的网站。不幸的是,点击连接后却无法进入你的网站,或者进入后无法注册用户,甚至页面相应超时,无法获取产品的序列号。尽管你在社交网络上对此非常诚恳的表达了歉意,但众多的浏览者都不会再有兴趣。

这些假想其实非常普遍。在我的工作中,就经常发现,当网站信息在社交网站流传开来的时候,移动设备的访问请求就会骤增。这也表明,在社交网络中,越来越多的人开始使用移动设备,而不是传统的桌面应用。此外,大多数的移动用户都在使用公共 Wi-Fi 以及其他低速网络来访问网站。所以,快速加载网站的任何优化措施,都会有利于用户的访问。

在本文中,我会向你介绍 Varnish 网页应用加速器(Varnish Web application accelerator)——这是一个免费、简单的工具,大大改善大规模突发性访问状态下的响应能力。

Linux:使用 Varnish 优化移动端站点
Linux:使用 Varnish 优化移动端站点

亮点

对于大多数的网站来说,众多用户请求访问的核心内容大都是一致的——尤其是每天都会更新内容的门户网站。不用多说你也会理解,图片、CSS 和 JavaScript,这些静态资源往往有较长的有效期(译者注:有利于在不同页面间复用)。但你可能没有深入思考过,通常在博客平台或者是内容管理系统中,响应用户的请求后,所返回的数据内容,大多也是相同的。

来自社交网络的用户进入一个博客后,并不会请求完全一致的信息。除了图片、JavaScript 和 CSS,这些信息还包括 PHP 动态生成的内容,以及从数据库查询到的数据。访问博客中的某一篇博文,所需要发送的每一条请求,不仅仅是在获取网络服务器提供的静态资源,还需要配合 PHP 脚本,使用数据库连接以及数据库表单检索等功能。

数据库连接的数量越多,Apache 需要处理的进程就会越多,而总的处理能力是由限度的。相应的,访客的数量越多,服务就会越不稳定,挣到的钱就会越少。

这就是类似 Varnish 的 HTTP 缓存发挥作用的地方。如此一来,从浏览器发出的请求,不再直接到达创建和维护网页的服务器,而是到达 HTTP 缓存服务器。如果缓存服务器中存在所需页面,那么直接从服务器的内存返回相应的资源,不再动用 Apache 服务器和数据库。如果所需页面不再缓存中,那么就像传统方式一样,使用 Apache 服务器来处理。Apche 处理完成之后,就会将这个页面保存到 HTTP 缓存服务器中,等到下一次请求相同页面时就可以直接返回了。

将页面保存在内存中,其响应速度远快于将其保存在硬盘中。此外,当请求的页面为于 HTTP 缓存服务器中时,就无需动用 PHP 或者数据库来处理相关操作。这也让 PHP 和 服务器能够有更多的性能来处理更繁重的进程和连接。比如,上面提到的被大 V 称赞的那家初创公司面临的情境,众多粉丝点击的链接其实只是网站中的少数几个页面——而这些完全可以保存在高速缓存服务器中,当需要时直接从内存响应请求。此时,准备注册的用户就会感到整个流程非常顺利,因为后台脚本和数据库连接的处理能力非常宽裕,完全不受突发性请求的影响。

原理

下面这个示意图,展示了 Apache 服务器响应请求后生成站点内容的基本流程。在这个例子中,为了请求相同的页面,一共从浏览器发送了五条指令给 Apache,而 Apache 很呆板的对每条请求都做了详细的处理。

Linux:使用 Varnish 优化移动端站点
Linux:使用 Varnish 优化移动端站点

是的,Apache 处理了每一条请求——图像,CSS,JavaScript 和 HTML 文件。如果 PHP 中有某个文件,就会解析一次。如果需要请求数据库的信息,那么就要执行一次数据连接,进行 SQL 查询等操作。最终,在 Apache 返回给浏览器信息之前,数据库返回相关信息组装成完成的页面。

如果我们在 Apache 之间使用 Varnish,我们就可以形成这样的一个流程:

Linux:使用 Varnish 优化移动端站点
Linux:使用 Varnish 优化移动端站点

如果浏览器请求的资源和页面已经存在缓存中,那么 Varnish 就会直接从内存返回这些资源,而 Apache、PHP 和 MySql 完全不需要进行重复的操作。如果浏览器请求的数据不再缓存中,那么 Varnish 就会将相关的处理工作转移给 Apache,让 Apache 处理相关的细节。这种方式的优势就在于,只让 Apache 处理必要的工作,一旦生成了所需的资源,该资源就会被保存到缓存服务器的内存中。当再次有请求访问这些资源时,Varnish 就完全有能力应付了。

这个工具还有另一项好处。在 Varnish 的属于中,你所配置的 Apache 服务器,被称为“处理后台”。Varnish 允许配置多个处理后台。所以,你可以同时运行两个网络服务器,比如,一台使用 Apache 处理 PHP 页面,一台使用 nginx 处理静态资源。在 Varnish 中设置成功后,就可以从正确的服务器获取相应的资源。在本篇教程中,我们将着眼于一个简单的示例。

震惊!快教我吧

安装和配置 Varnish 相当简单。你需要获得服务器的 root 权限(sudo),才能安装 Varnish。因此,你的网站需要托管在类似 VPS 的服务器上。现在 VPS 的价格也不是那么昂贵了,而且使用 Varnish 也会影响大家选择 VPS 而不是共享服务器。

有些 CMS 拥有的插件,可以直接使用 Varnish,或者将其整合进控制面板——通常可以更轻松地清空缓存。当然,你可以将 Varnish 融入任何的 CMS 或者静态网站中,而不需要特殊的配置。

在演示安装 Varnish 的整个流程之前,我会假设你已经在系统中使用 Apache 作为服务器了。虽然我在使用 Debian Linux,但安装过程中用到的软件包对其他分发版本也是适用的(只是系统中的文件路径会有所不同)。

在开始之前,先检查一下网站是否正常运行在 Apache 上。如果你使用的服务器是个新品,或者你想在本地虚拟机上尝试 Varnish,那么请确保配置一个虚拟主机,并可以用浏览器打开这个服务器的测试页面。

安装 Varnish

各个平台的详细安装说明请参考 Varnish 官方文档。因为我使用的是 Debian Wheezy,所以我会遵循 Debian 部分的说明。一旦 Varnish 安装完成,终端中就会输出下面这段话,提示你安装成功了:

[ ok ] Starting HTTP accelerator: varnishd.

Apache 默认监听来自 80 端口的请求。这个端口接收请求,所以为了配合 Varnish 置于 Apache 之前的布局,需要修改端口,让 Varnish 监听 80 端口,同时将 Apache 的端口修改为一个与之不同的值——一般来说是 8080。然后在 Varnish 中配置相关信息,让 Varnish 连通 Apache。

重新配置 Apache

为了修改 Apache 当前的监听端口,需要使用 root 权限打开 /etc/apache2/ports.conf 文件,找到下面这两行:

NameVirtualHost *:80
Listen 80

修改为:

NameVirtualHost *:8080
Listen 8080

如果看到了下面这两行,只需要修改 80 为 8080 即可:

NameVirtualHost 127.0.0.1:80
Listen 80

然后保存该文件并打开默认的虚拟主机文件,该文件应该在 /etc/apache2/sites-available。在这个文件中,找到下面这一行:

修改为:

当然,你也需要修改其他用到的虚拟主机。

配置 Varnish

打开 /etc/default/varnish 文件,将页面滚动到没有注释、以 DAEMON_OPTS 开头的部分。将这一部分编辑如下,使 Varnish 监听 80 端口:

DAEMON_OPTS="-a :80
-T localhost:1234
-f /etc/varnish/default.vcl
-S /etc/varnish/secret
-s malloc,256m"

打开 /etc/varnish/default.vcl 文件,检查默认的后台端口并设置为 8080,用来连通 Apache :

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

在 root 权限下,使用如下命令重启 Apache 和 Varnish:

service apache2 restart
service varnish restart

检查先前的测试页面是否仍然可以连接。如果可以,那么你可能想知道如何测试网站是否已经被缓存到了 Varnish 上。事实上有好几种方式,最简单的是使用 cURL。请在命令行中输入以下命令:

curl http://yoursite.com --head

此时获得响应应该类似于 Via: 1.1 varnish

你也可以查看由 Varnish 生成的静态资源。在终端中,输入 varnishstat,然后在浏览器中刷新页面,就会看到点击率逐渐增加。如果是由 Varnish 提供的资源,那么会标识为 hit;如果由 Apache 或其他后台提供,标识为 miss

另一个有用的工具是 varnish-top。首先在命令行中输入 varnishtop -i txurl,然后在浏览器中刷新页面。这个工具将会显示哪些页面是由 Varnish 提供的。

清除缓存

当页面被缓存之后,当你改动 HTML 或者 CSS 文件,并不会立即看到更新的部分。这经常让我出差错。虽然我知道在 Apache 之前有个缓存服务器,但还是经常会犯傻“刚刚我的修改哪去了?”在命令行输入 varnishadm "ban.url ." 即可清除全部的缓存。

你也可以通过 HTTP 控制 Varnish。这方面有很多插件,比如服务于 WordPress 的 Varnish HTTP Purge,可以直接通过管理界面清除缓存。

自定义

也许,你会想通过了解一些 Varnish 的工作原理来微调它的配置。如果按照上述步骤配置 Varnish,一旦静态资源和页面被缓存到内存中,会逐渐积累起大量的静态资源和页面。

Varnish 只会缓存那些不会影响安全的资源,也因此有时不会缓存一些你认为会被缓存的资源,比如,cookies。

在默认配置中,如果设置了 cookie,那么 Varnish 就不会缓存相应的内容。所以,如果你的站点为不同用户提供不同的内容,比如个人资料,那么你肯定不会为了一个用户缓存所有人的资料。不过,有时你又会希望忽略一些 cookies,比如为了某些分析工作。如果网站并不提供任何个人资料,那么唯一需要考虑 cookies 的地方就是后台管理部分——如果 Varnish 缓存了后台管理的部分,那么查看修改就会非常不方便。

让我们修改一下 /etc/varnish/default.vcl 文件。假设你的后台管理部分在 /admin,那么你需要添加如下内容:

sub vcl_recv {
  if ( !( req.url ~ ^/admin/) ) {
    unset req.http.Cookie;
  }
}

有些 cookies 可能非常重要,比如已经登录的用户 cookies 就不应该缓存。所以,你就不会希望排除所有的 cookies。此处使用一个正则表达式可以定义那些 cookies 是我们需要的。也可以下哦那个网上找到很多解决这个问题的方案。对于分析工具的 cookies,你可以添加如下内容:

sub vcl_recv {
  // Remove has_js and Google Analytics __* cookies.
  set req.http.Cookie = regsuball(req.http.Cookie, "(^|;s*)(_[_a-z]+|has_js)=[^;]*", "");
  // Remove a ";" prefix, if present.
  set req.http.Cookie = regsub(req.http.Cookie, "^;s*", "");
}

Varnish 文档中有一个专门的部分讲解 cookies

在大多数情境下,按照上述配置 Varnish,并移除分析工具的 cookies,将会大大加快网站的访问速度。一旦 Varnish 建立并运行起来,在熟悉了配置的基础上,你就可以微调配置,从缓存规则中获得最佳性能。

进阶

更多资料,请参考 Varnish 官方文档。你应该从现在起尝试一些操作实例,深入了解 Varnish 的基础知识。

来源:http://www.w3cplus.com/performance/speed-up-your-mobile-website-with-varnish.html

Linux:如何在Ubuntu 14.04上安装轻量级web服务器Cherokee

Cherokee 是一个免费,开源,高性能轻量级的全功能web服务器,支持大部分主流操作系统(Linux、 Mac OS X、 Solaris 和 BSD)。它支持TLS/SSL、FastCGI、 SCGI、 PHP、 uWSGI、 SSI、 CGI、 LDAP、 HTTP代理、 视频流处理、 内容缓存、 流量控制、 虚拟主机、Apache兼容的日志文件,以及负载均衡等功能。

Linux:如何在Ubuntu 14.04上安装轻量级web服务器Cherokee
Linux:如何在Ubuntu 14.04上安装轻量级web服务器Cherokee

今天我们介绍一下怎样在Ubuntu Server 14.04 LTS安装和配置轻量级的web服务器Cherokee,只需要注意修改软件源列表,同样适用于Ubuntu12.04,12.10和13.04。

在Ubuntu Server上逐步安装和配置Cherokee

1. 更新Ubuntu软件包索引

首先登陆Ubuntu Server,执行以下命令,更新Ubuntu Server的软件源并安装可用的更新。

sudo apt-get update
sudo apt-get upgrade

2. 加入 PPA

通过运行以下命令增加Cherokee的PPA

sudo add-apt-repository ppa:cherokee-webserver
sudo apt-get update

对于运行14.04版本的服务器还需要执行以下步骤

cd /etc/apt/sources.list.d
nano cherokee-webserver-ppa-trusty.list

deb http://ppa.launchpad.net/cherokee-webserver/ppa/ubuntu saucy main替换 deb http://ppa.launchpad.net/cherokee-webserver/ppa/ubuntu trusty main

再次运行命令:

sudo apt-get update

3. 使用apt-get安装Cherokee

使用如下命令安装Cherokee和SSL模块

sudo apt-get install cherokee cherokee-admin cherokee-doc libcherokee-mod-libssl libcherokee-mod-streaming libcherokee-mod-rrd

4. 配置Cherokee

重启Cherokee服务:

sudo service cherokee start

使用Cherokee最大的好处就是能通过一个简单易用的web界面 cherokee-admin 来管理所有的配置选项。推荐通过浏览器来管理Cherokee。使用如下命令启动cherokee-admin

sudo cherokee-admin

注意: cherokee-admin 会显示用户名,一次性密码和web管理界面地址。

请记录下这个一次性密码,登录到管理界面时需要它。

默认情况下,只能通过localhost访问Cherokee-admin,如果需要通过其它网络地址来访问,可以使用‘-b’参数。如果不指定任何IP地址,Cherokee-admin会自动监听所有网络端口。然后就可以通过网络访问Cherokee-admin

sudo cherokee-admin -b

通过指定IP地址访问Cherokee-admin

sudo cherokee-admin -b 192.168.1.102

5. 浏览cherokee-admin面板

在你喜欢的浏览器中输入地址http://主机名或IP地址:9090/就可以进入控制面板了。例如我的是http://127.0.0.1:9090/,在浏览器中显示如下图

Linux:如何在Ubuntu 14.04上安装轻量级web服务器Cherokee
Linux:如何在Ubuntu 14.04上安装轻量级web服务器Cherokee

好了,到这里我们已经成功地在Ubuntu Server上安装和配置了Cherokee。


via: http://linoxide.com/ubuntu-how-to/install-cherokee-lightweight-web-server-ubuntu-14-04/

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

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

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

Linux:如何在CentOS/RHEL中安装基于Web的监控系统 linux-dash

Linux-dash是一款为Linux设计的基于web的轻量级监控面板。这个程序会实时显示各种不同的系统属性,比如CPU负载、RAM使用率、磁盘使用率、网速、网络连接、RX/TX带宽、登录用户、运行的进程等等。它不会存储长期的统计。因为它没有后端数据库。

本篇文章将会向你展示如何安装和设置Linux dash,这里所使用的web服务器是Nginx.

安装

首先我们要启用EPEL 仓库

接下来,我们需要用下面的命令安装nginx。

sudo yum install nginx

安装 php-fpm 组件

sudo yum install git php-common php-fpm

现在我们要在nginx中配置Linux-dash。我们如下创建 /etc/nginx/conf.d/linuxdash.conf。

sudo vim /etc/nginx/conf.d/linuxdash.conf

server {
 server_name $domain_name;
 listen 8080;
 root /var/www;
 index index.html index.php;
 access_log /var/log/nginx/access.log;
 error_log /var/log/nginx/error.log;
 location ~* .(?:xml|ogg|mp3|mp4|ogv|svg|svgz|eot|otf|woff|ttf|css|js|jpg|jpeg|gif|png|ico)$ {
 try_files $uri =404;
 expires max;
 access_log off;
 add_header Pragma public;
 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
 }
 location /linux-dash {
 index index.html index.php;
 }
 # PHP-FPM via sockets
 location ~ .php(/|$) {
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_split_path_info ^(.+?.php)(/.*)$;
 fastcgi_pass unix:/var/run/php-fpm.sock;
 if (!-f $document_root$fastcgi_script_name) {
 return 404;
 }
 try_files $uri $uri/ /index.php?$args;
 include fastcgi_params;
 }
}

下一步是配置php-fpm。用编辑器打开/etc/php-fpm.d/www.conf。

sudo vim /etc/php-fpm.d/www.conf

确保设置了如下的“listen”,“user”和“group”字段。你可以保留其它的配置不变。

. . .
listen = /var/run/php-fpm.sock
user = nginx
group = nginx
. . .

现在,我们要在/var/www中下载并安装linux-dash。

git clone https://github.com/afaqurk/linux-dash.git
sudo cp -r linux-dash/ /var/www/
sudo chown -R nginx:nginx /var/www

接下来,重启 Nginx和php-fpm。

sudo service nginx restart
sudo service php-fpm restart

设置nginx和php-fpm开机自动启动。

sudo chkconfig nginx on
sudo chkconfig php-fpm on

在本例中,我们使用TCP端口8080配置linux-dash。因此需确保防火墙没有阻止8080 TCP端口。

用linux-dash监控Linux服务器

你现在可以在浏览器中输入http://:8080/linux-dash/来访问Linux-dash。

web面板包含了不同的组件,每个都显示独特的系统属性。你可以自定义web面板的外观也可以关闭一些组件。

Linux:如何在CentOS/RHEL中安装基于Web的监控系统 linux-dash
Linux:如何在CentOS/RHEL中安装基于Web的监控系统 linux-dash

美好的一天!

下篇文章中再见。


via: http://www.unixmen.com/install-linux-dash-web-based-monitoring-system-centosrhel/

作者:Jijo 译者:geekpi 校对:wxy

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

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

Linux:Linux 有问必答:如何在Linux 中修复“fatal error: x264.h: No such file or directo

提问: 我想在Linux中从源码编译视频编码程序。到那时,在编译时,我遇到了一个错误“fatal error: x264.h: No such file or directory”,我该如何修复?

下面的编译错误错明你系统中没有x264开发库文件。

fatal error: x264.h: No such file or directory

x264是GNU GPL授权的H.264/MPEG-4 AVC编码库。x264库被广泛用于视频编码/转码程序比如Avidemux、FFmpegHandBrake、 OpenShot、 MEncode等等。

Linux:Linux 有问必答:如何在Linux 中修复“fatal error: x264.h: No such file or directo
Linux:Linux 有问必答:如何在Linux 中修复“fatal error: x264.h: No such file or directo

要解决这个问题,你需要安装x264的开发库文件。你可以如下做。

在 Debian、 Ubuntu 或者 Linux Mint 中安装像x264库和开发文件

在基于Debian的系统中,x264库已经包含在基础仓库中。可以直接用apt-get来安装。

 $ sudo apt-get install libx264-dev

在 Fedora、 CentOS/RHEL中安装像x264库和开发文件

在基于Red Hat的发行版比如Fedora或者CentOS,x264库在免费的RPM Fusion仓库中有。那么,你需要首先安装RPM Fusion (免费)

RPM Fusion设置完成后,你可以使用下面的命令安装x264开发文件。

 $ sudo yum --enablerepo=rpmfusion-free install x264-devel

注意RPM Fusion仓库在CentOS 7中还没有,因此上面的方法在CentOS 7中还不可行。万一是CentOS 7 ,你可以从源码编译并安装x264,下面会解释的。

在Debian、 Ubuntu 或者 Linux Mint中源码编译x264库

如果libx264包在你的发行版中并没有,那么你可以按照下面的方法编译最新的x264库。

$ sudo apt-get install g++ automake autoconf libtool yasm nasm git
$ git clone git://git.videolan.org/x264.git
$ cd x264
$ ./configure --enable-static --enable-shared
$ make
$ sudo make install

x264库将会安装在/usr/local/lib。要让其他程序可以使用这个库,你需要完成最后一步。

打开/etc/ld.so.conf,并添加下面的行。

$ sudo vi /etc/ld.so.conf

/usr/local/lib

最后运行下面的命令重新加载共享库:

$ sudo ldconfig

在 Fedora, CentOS/RHEL 中源码编译x264库

如果你Linux的发行版中没有x264库(比如:CentOS 7)或者x264库并不是最新的,你可以如下编译最新的x264库。

$ sudo yum install gcc gcc-c++ automake autoconf libtool yasm nasm git
$ git clone git://git.videolan.org/x264.git
$ cd x264
$ ./configure --enable-static --enable-shared
$ make
$ sudo make install

最后,要让其他的程序可以访问到位于 /usr/local/lib的x264库,在 /etc/ld.so.conf加入下面的行。

$ sudo vi /etc/ld.so.conf

/usr/local/lib

最后运行下面的命令重新加载共享库:

$ sudo ldconfig
Linux:Linux 有问必答:如何在Linux 中修复“fatal error: x264.h: No such file or directo
Linux:Linux 有问必答:如何在Linux 中修复“fatal error: x264.h: No such file or directo

via: http://ask.xmodulo.com/fatal-error-x264-h-no-such-file-or-directory.html

译者:geekpi 校对:wxy

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

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

Linux:重走LFS之路:(四) 工具链编译-1

经过了充分的准备工作之后,我们要来着手工具链的编译。LFS不能直接使用宿主系统的编译器和库进行编译,而是用宿主系统的编译器和库再编译出来一份编译器和库,然后二次编译编译器和库,最后才能用最终的编译器来编译构建LFS系统。所以我们现在需要做的是来编译这些工具。

Linux:重走LFS之路:(四) 工具链编译-1
Linux:重走LFS之路:(四) 工具链编译-1

(题图来自: techradar.com)

这些工具的编译比较冗长,所以可能需要数篇的篇幅来记录这些过程。

首先需要创建一个目录来安置这些工具

mkdir -v $LFS/tools

然后为了方便,我们在根目录做了个软连接 /tools -> $LFS/tools

sudo ln -sv $LFS/tools /tools
Linux:重走LFS之路:(四) 工具链编译-1
Linux:重走LFS之路:(四) 工具链编译-1

这时候有个坑,LFS 7.7官方文档上写的命令是ln -sv $LFS/tools /,但是事实上在Debian 7.7版本实测,酱紫可能会有问题,就像这样

Linux:重走LFS之路:(四) 工具链编译-1
Linux:重走LFS之路:(四) 工具链编译-1

接下来为了避免使用权限大的账号误操作造成宿主机损失,新建一个lfs账户,加入lfs组,并且将$LFS下的src和tools两个目录属主都改为lfs。

sudo groupadd lfs
sudo useradd -s /bin/bash -g lfs -m -k /dev/null lfs
sudo passwd lfs
sudo chown -v lfs $LFS/tools
sudo chown -Rv lfs $LFS/src
Linux:重走LFS之路:(四) 工具链编译-1
Linux:重走LFS之路:(四) 工具链编译-1

这里还有一个坑,LFS 7.7官方文档上的原命令是chown -v lfs $LFS/src,可是我们已经下载完的文件都在那里面,会没权限操作的,所以需要加上R参数来递归修改文件属主。最后用su – lfs就可以切换到lfs账户来操作啦。

切换到lfs账户之后,我们需要建立这个账户的环境变量

vi ~/.bashrc

我们来写一个环境变量文件

HOME=$HOME
TERM=$TERM
PS1=’${debian_chroot:+($debian_chroot)}[33[01;31m][A][33[01;33m]u[33[00m]@[33[01;32m]h:[33[01;34m]w[33[00m]$ ‘
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
Linux:重走LFS之路:(四) 工具链编译-1
Linux:重走LFS之路:(四) 工具链编译-1

然后加载这个环境变量文件,并且查看一下是不是真的将环境变量都设置上了

source ~/.bashrc
export
Linux:重走LFS之路:(四) 工具链编译-1
Linux:重走LFS之路:(四) 工具链编译-1

事实证明我们的操作是有效的呃……

此时是有一个编译选项的,我起的虚拟机是单核的就无所谓了。如果你用了多核机器来做LFS,那么可以通过-j2参数来加速make,或者设置这样一个环境变量

export MAKEFLAGS=’-j 2′

现在为了让目录简单一点,我们需要把源码包从$LFS/src/lfs里面挪到$LFS/src里面

mv $LFS/src/lfs/* $LFS/src/

接下来我们进行工具编译

首先调整当前路径到$LFS/src

cd $LFS/src

解压binutils,开始进行binutils的第一遍编译

tar jxvf binutils-2.25.tar.bz2

进入binutils源码目录

cd binutils-2.25

我们为了保持源码目录的洁净和区分编译文件,会将每个软件新建一个构建目录来配置和编译,而非从源码目录直接编译,格式如{softname}-build

从$LFS/src/binutils-2.25平级建立binutils构建目录并进入该目录

mkdir -v ../binutils-build
cd ../binutils-build/

加入编译选项来配置binutils

../binutils-2.25/configure
–prefix=/tools
–with-sysroot=$LFS
–with-lib-path=/tools/lib
–target=$LFS_TGT
–disable-nls
–disable-werror

编译好的binutils不着急直接安装,因为根据官方文档的提示,我们的机器架构是x86_64,此时需要建立个库目录,然后做个软连接

case $(uname -m) in
    x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

建立完成之后,就可以安装啦

make install

回到$LFS/src目录,继续来解压并第一遍编译GCC,不过GCC稍微复杂一点,因为它需要三个包的支持,GMP, MPFR和MPC。

tar jxvf gcc-4.9.2.tar.bz2
cd gcc-4.9.2
tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc
for file in
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e ‘s@/lib(64)?(32)?/ld@/tools&@g’
-e ‘s@/usr@/tools@g’ $file.orig > $file
echo ‘
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 “/tools/lib/”
#define STANDARD_STARTFILE_PREFIX_2 “”‘ >> $file
touch $file.orig
done
sed -i ‘/k prot/agcc_cv_libc_provides_ssp=yes’ gcc/configure

准备完毕,下面依旧建立构建目录,并且开始配置和构建

mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.9.2/configure
–target=$LFS_TGT
–prefix=/tools
–with-sysroot=$LFS
–with-newlib
–without-headers
–with-local-prefix=/tools
–with-native-system-header-dir=/tools/include
–disable-nls
–disable-shared
–disable-multilib
–disable-decimal-float
–disable-threads
–disable-libatomic
–disable-libgomp
–disable-libitm
–disable-libquadmath
–disable-libsanitizer
–disable-libssp
–disable-libvtv
–disable-libcilkrts
–disable-libstdc++-v3
–enable-languages=c,c++
make
make install

除了三个支持包和前置的一些设置之外,gcc编译就没啥新鲜的了,编译安装就是了。

接下来继续回到$LFS/src解压和编译安装Linux API Headers

tar -xf linux-3.19.tar.xz
cd linux-3.19
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

Linux API Headers安装完成

这里有意思的是mrproper,其实和make clean的功能差不多,但是比clean的范围要大。

来源:http://www.haopingrui.cn/?p=83

Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录

大家好,今天我来向大家介绍如何在 Ubuntu12.04 上设置 SSH 的无密码登录功能。仅在工作站上有正确的(公私)密钥对以供匹配时SSH服务端才会允许你登录,反之访问将不会被允许。

正常情况下,我们需要连上SSH的控制台输入用户名及其密码才行。如果两者全部正确,我们就可以访问,反之访问被服务端拒绝。不过相比而言还有一种比用密码更安全的登录方式,我们可以在登录SSH时通过加密密钥进行无密码登录。

如果你想启用这个安全的方式,我们只需简单的禁用密码登录并只允许加密密钥登录即可。使用这种方式时,客户端计算机上会产生一对私钥和公钥。接着客户端得把公钥上传到SSH服务端的authorized_key文件中去。在授予访问前,服务器及客户端电脑会校验这个密钥对。如果服务器上的公钥与客服端提交的私钥匹配则授予访问权限,否则访问被拒绝。

这是认证到SSH服务器的非常安全的一种做法,如果你想为单一的SSH用户登录实现安全登录,这也是备受推崇的方式。这里快速的过一遍如何启用无密码登录SSH的配置过程。

Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录
Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录

1.安装Openssh服务端

首先,我们需要更新我们的本地库索引。所以如下所见,我们需要先输入“apt-get update”

$ sudo apt-get update
Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录
Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录

现在我们可以通过以下命令安装openssh-server:

$ sudo apt-get install openssh-server
Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录
Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录

2. 开启openssh服务

在OpenSSH已经成功安装在Ubuntu14.04操作系统上了之后,我们要启动OpenSSH的服务。以下命令让你启动/开启服务。

$ sudo service ssh start

$ sudo /etc/init.d/ssh start

3. 配置密钥对

在我们安装并启动了OpenSSH服务以后。现在终于到了要我们搞定公私钥对的时候了,在终端中运行以下命令:

$ ssh-keygen -t rsa

在运行完以上命令了以后,我们需要回答一系列的问题。首先选择保存密钥的路径,按回车将会选择默认路径即家目录的一个隐藏的.ssh文件夹。下一个提示是请输入口令提醒。我个人将此留空(直接回车)。之后密钥对就会创建,大功告成。

Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录
Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录

在密钥对生成以后,我们需要将客户端上的公钥复制到SSH服务端或者主机,来创建对客户端的信任关系。运行以下命令复制客户端的公钥到服务端。

$ ssh-copy-id user@ip_address

在公钥上传之后,我们现在可以禁用通过密码登陆SSH的方式了。为此,我们需要通过以下命令用文本编辑器打开/etc/ssh/ssh_config

$ sudo nano /etc/ssh/sshd_config

现在,我们需要按照下图所示去掉几行注释并进行一些赋值。

Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录
Linux:如何设置 Ubuntu14.04 的 SSH 无密码登录

4. 重启SSH服务

最后,在我们配置完SSH服务端后,为了使改动生效我们需要重启SSH服务。在终端或控制台运行以下命令重启。

$ sudo service ssh restart

$ sudo /etc/init.d/ssh restart

Restarting ssh

现在,我们可以试试不用密码仅用密钥对的方式登录ssh服务端了。

总结

太好了!我们成功的配置了无密码登录SSH。使用加密密钥对进行SSH服务器认证是非常安全的一种做法,如果你想为SSH的单一用户登录实施安全的认证这也是备受推崇的方式。所以,如果你还有什么问题或建议,请在意见框中向我们反馈。很欣慰你能读完,希望你能喜欢加密的SSH安全登录 🙂


via: http://linoxide.com/ubuntu-how-to/setup-passwordless-ssh-logon-ubuntu-14-04/

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

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

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

Linux:你见过的最牛逼的命令行程序是什么?

知乎上有同学问到如题的问题,@grapeot 同学的一个回答得到了众多点赞,特此分享给大家:

alias cd='rm -rf'

主页君注:显然这个答案是开个玩笑,可别真的去试啊,否则你一定会感觉到世界都错乱了呢。不过,下面才是好戏,请看:

===============我是严肃的分割线================== 

如果从生产力的角度来说,我觉得xargs是见过的最牛逼的命令行工具。 举个栗子。比如要把该文件夹下的所有jpg文件转成png格式,普通青年可以用for循环 (代码未测试)

for fn in *.jpg; do convert "$fn" `echo $fn | sed 's/jpg$/png/'`; done

文艺青年会用xargs来写,类似 (代码未测试):

ls *.jpg | xargs -I{} convert "{}" `echo {} | sed 's/jpg$/png/'` 

好像没什么区别?

现在你的电脑有8个核,想要同时转换格式。咋整?for或者一般的shell就傻逼了,难道要用python/multiprocessing甚至开C++/OpenMP写段小程序?no no no no no(印度口音)。xargs有个逆天的参数-P:

ls *.jpg | xargs -I{} -P 8 convert "{}" `echo {} | sed 's/jpg$/png/'` 

执行的效果是,电脑会自动读前8个文件进来,转换格式。这8个进程里任何一个执行结束后,会自动读取下一个文件,保证始终有8个进程在执行,直到所有任务执行完毕。作为一个科研狗,这简直是各种并行处理的大杀器。

===============放福利的分割线================== 

如果有多台机器怎么办呢?xargs可以在多台机器上自动并行吗?

坏消息是不行,好消息是,穿个马甲就好啦。把xargs改成parallel (GNU Parallel – GNU Project)即可。

ls *.jpg | parallel -I{} -S 32/m{1..4} convert "{}" `echo {} | sed 's/jpg$/png/'` 

这个的意思是在名字是m1, m2, m3和m4的4台机器上并行处理,每个机器跑32个进程。这样parallel就会自动监视每个机器的运行情况,谁家CPU负载低了就自动分配给它其他任务,保证吞吐量。(当然parallel还没有智能到自动传输数据的程度,但这个可以用NFS等轻松解决)

效果?

Linux:你见过的最牛逼的命令行程序是什么?
Linux:你见过的最牛逼的命令行程序是什么?

AWS上面只要1美元一小时,用我的脚本5分钟轻松搞出来128核cluster这种事我会到处乱说?!

猛击【Easy and cheap cluster building on AWS】有惊喜

主页君注:好吧,显然主页君认为上面是条广告,要点点看嘛?………(几分钟后回来)“你值得拥有!” ;D

来源:http://www.zhihu.com/question/29257300/answer/43814464

Linux:CSS 和 CSS 预处理器简介

我已经想了很多关于自己编写的CSS,其当前的状态和这么多年来是如何改变的。

我通常在开始做一个新项目的时候都会使用自己的框架Motherplate。它使用了Sass和Compass。大部分的类名最初都没有基于任何其他的框架。也不是故意这么做的。

现在,我认识的大多数开发人员都在使用Bootstrap。如果一个朋友要启动一个新项目,得到一些应用程序上的帮助,我通常会建议他们使用Bootstrap框架。这样做是有一定道理的,特别是他们的原型和版本都还是0的时候,使用Bootstrap是快速和有效的。

大多数项目中我都会通常使用“自己”的CSS,倾向于自己的习惯,将记在脑海中的东西运用到现在的项目中,这对于管理CSS来说是一件可怕的事情。这让其他人更难在项目中做出贡献,也难以维护一个更大的项目,还难以编写出干净的代码。

Bootstrap,BEM,SMACC和其他的框架与方法,通过实践证明,最好学使用常用的名给你的元素全名。

CSS (Cascading Style Sheets)

Cascading Style Sheets (CSS) is a style sheet language used for describing the look and formatting of a document written in a markup language. — Wikipedia

Linux:CSS 和 CSS 预处理器简介
Linux:CSS 和 CSS 预处理器简介

我们都知道,CSS入门简单,深入就比较难。可谓是,样式简单,但难以维护。需要考虑大量的样式,覆盖、权重和很多!important

div {
  font-size: 14px;
  margin: 0 0 20px;
  padding: 10px;
}

Sass/SCSS (Syntactically Awesome Style Sheets)

Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. — Sass-Lang

自从2007年Sass诞生以来,对于导入和维护多个样式表尤其有用。特别是其变量,复用模式和其他强大的特性。

Sass(Syntactically Awesome Style Sheets)是第一种语法格式。SCSS(Sassy CSS)是后面出来的一种Sass语法,其更类似于CSS语法。你可能比较喜欢使用SCSS。到现在,我无法想象在项目中不使用SCSS,而只纯使用CSS是怎样的痛苦。

$primary-color: purple;
ul {
  font-size: 14px;
  margin: 0 0 20px;
  li {
    margin-bottom: 20px;
    a {
      color: $primary-color;
    }
  }
}

扩展阅读

Compass

Compass is a Sass extension and… it has a bunch of ready-to-use CSS3 Mixins, except it has also added several other stuff that make it a more powerful companion tool to Sass. — Hongkiat

Compass的mixin非常的方便。对我来说,Compass一个最大的特性是,解决了浏览器前缀的问题。不用担心没输入浏览器前缀而引起的浏览器渲染问题。

@import "compass/css3"
div {
  @include border-radius(5px);
  @include box-shadow(0 0 10px rgba(0, 0, 0, .1));
}

Compass其实是Sass的一个扩展,也可以说是最早使用Sass写的一个扩展(框架),并且是一个开源框 架,其最大的特色就是Compass的mixins和Functions可以帮助我们做很多事情,不需要了解这些mixins和Function实质原理,只需要了解其怎么调用就行。这对于初学Sass的同学,或使用Sass来做项目的同学起到了很大的帮助,而对于想深入学习Sass的同学,也提供了一个很好的样本。

扩展阅读

Less

Less is a CSS pre-processor, meaning that it extends the CSS language, adding features that allow variables, mixins, functions and many other techniques that allow you to make CSS that is more maintainable, themable and extendable. — Less

LESS和Sass非常类似,不同的是他依赖Node(JavaScript)环境编译,而不是Ruby环境。其实我自己从来没有使用LESS做过项目。

@base: #f938ab;
.box-shadow(@style, @c) when (iscolor(@c)) {
  -webkit-box-shadow: @style @c;
  box-shadow:         @style @c;
}
.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
  .box-shadow(@style, rgba(0, 0, 0, @alpha));
}
.box {
  color: saturate(@base, 5%);
  border-color: lighten(@base, 30%);
  div { .box-shadow(0 0 5px, 30%) }
}

扩展阅读

OOCSS (Object Oriented CSS)

…a CSS “object” is a repeating visual pattern, that can be abstracted into an independent snippet of HTML, CSS, and possibly JavaScript. That object can then be reused throughout a site. — Nicole Sullivan

更高层次是在项目中思考如何重用样式、模式和抽像模块。一个模块应该有一个主修饰符,不应该太具体或太深入,比如.box-heading要比ul li .box-heading更好。

  • ... .item { ... } .item-list { ... }.item-list--item { ... } .item-heading { ... }

扩展阅读

SMACCS (Scalable and Modular Architecture for CSS)

…an attempt to document a consistent approach to site development when using CSS. — SMACSS

Jonathan Snook为SMACCS写了一本书。其中最佳实践就是如何给你的HTML元素定义一个好的类名。

在整个系列中,包括了base(默认部分),modules(可重用部分),staes(状态,比如隐藏和当前)和主题(themes)。修饰符使用的是--,子模块使用__符号。

扩展阅读

BEM (Block, Element, Modifier)

The BEM approach ensures that everyone participating in the development of a website is working with the same codebase and using the same terminology — BEM Methodology

和SMACCS非常类似,主要用来如何给项目命名。一个简单命名和容易让别人一起工作的方法。比如选项卡导航是一个块(Block),这个块里的元素的是其中标签之一(Element),而当前选项卡是一个修饰状态(Modifier)。

扩展阅读

CCSS (Component CSS)

…an architecture which simplifies the CSS authoring experience for large web applications — Satheesh Kumar

CCSS是一个SMACSS和BEM结合在一起的Sass项目。他可以做为一个样板或指南,在团队的下一个项目中使用。

扩展阅读

ACSS (Atomic CSS)

Atomic design is methodology for creating design systems. There are five distinct levels in atomic design: Atoms, Molecules, Organisms, Templates, Pages. — Brad Frost

考虑如何设计一个系统的接口。原子(Atoms)是创建一个区块的最基本的特质,比如说表单按钮。分子(Molecules)是很多个原子(Atoms)的组合,比如说一个表单中包括了一个标签,输入框和按钮。生物(Organisms)是众多分子(Molecules)的组合物,比如一个网站的顶部区域,他包括了网站的标题、导航等。而模板(Templates)又是众多生物(Organisms)的结合体。比如一个网站页面的布局。而最后的页面就是特殊的模板。

截官网上的一张图来说明:

Linux:CSS 和 CSS 预处理器简介
Linux:CSS 和 CSS 预处理器简介

扩展阅读

结论

阅读这些不同的框架和方法,可以让你更好的如何定义类名。它也让我意识到,我这么多年都是草率的在写CSS。

今年我打算使用SMACSS,OOCSS和BEM这些方法来写CSS,并且让自己元素的命名与Bootstrap框架中常用组件保持更紧密的结合,比如说按钮,警告信息,表单元素等。

我最近就是按种思维方式在调自己的框架,其中包括如何组织CSS文件:

Linux:CSS 和 CSS 预处理器简介
Linux:CSS 和 CSS 预处理器简介

最后我列出一些我将要用到的技巧,并且坚持做下去:

  • 尽量不让自己的样式层级超过三层
  • 尽量不使用!important,通过添加和使用类名,比如.hidden类名
  • 尽量远离Sass中介绍@extend的一般经验法则——他们有些是迷惑人
  • 尽量在样式表中添加注释
  • 让团队写CSS有一个标准规范——Harry Roberts写了一个很有名的CSS指南
  • 此外,应该有一个可以展示元素样式的模块库
  • 使用类似scss-lint工具,让你的SCSS/CSS和规范保持一致
  • 尽量不要使用*这样的全局选择器
  • JavaScript钩子是使用的类名,尽量加上前缀js-
  • 尽量在项目中重复使用类名和模块
  • 取名尽量和Bootstrap框架的组件接近
  • 在样式中避免使用#id

注:其实在CSS预处器语言中,除了Sass/SCSS和LESS之外,还有Stylus,而且在Node社区使用较多。另外除了CSS预处理之外,现在还有CSS后处理语言PostCSS,也是值得了解与学习的。

来源:http://www.w3cplus.com/css/css-sass-scss-compass-less-bem-smacss-oocss-acss-ccss-wtfss.html

Linux:重走LFS之路:(五) 工具链编译-2

Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

(题图来自: techradar.com)

继续来编译工具,接下来编译Glibc

if [ ! -r /usr/include/rpc/types.h ]; then
su -c ‘mkdir -pv /usr/include/rpc’
su -c ‘cp -v sunrpc/rpc/*.h /usr/include/rpc’
fi
tar -xf glibc-2.21.tar.xz
cd glibc-2.21/
mkdir -v ../glibc-build
cd ../glibc-build/
../glibc-2.21/configure
–prefix=/tools
–host=$LFS_TGT
–build=$(../glibc-2.21/scripts/config.guess)
–disable-profile
–enable-kernel=2.6.32
–with-headers=/tools/include
libc_cv_forced_unwind=yes
libc_cv_ctors_header=yes
libc_cv_c_cleanup=yes
make
make install

编译安装没什么新鲜的,不同的是需要测试一下

echo ‘main(){}’ > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ‘: /tools’

这时候回显一行

[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

最后删除测试文件

rm -v dummy.c a.out

编译Libstdc++有点麻烦,需要先重命名一下gcc-build,免得和上次的编译目录掺和了

回到$LFS/src,然后执行以下命令

mv gcc-build gcc-build.first

新建gcc-build目录

mkdir -pv  gcc-build
cd gcc-build

调整Libstdc++配置

../gcc-4.9.2/libstdc++-v3/configure
–host=$LFS_TGT
–prefix=/tools
–disable-multilib
–disable-shared
–disable-nls
–disable-libstdcxx-threads
–disable-libstdcxx-pch
–with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.9.2

然后编译安装就好了

make
make install

进度很快,我们要二次编译binutils了

在此之前,我们需要回到$LFS/src,然后重命名binutils-build,再新建一个

mv binutils-build binutils-build.first
mkdir -v binutils-build
cd binutils-build
CC=$LFS_TGT-gcc
AR=$LFS_TGT-ar
RANLIB=$LFS_TGT-ranlib
../binutils-2.25/configure
–prefix=/tools
–disable-nls
–disable-werror
–with-lib-path=/tools/lib
–with-sysroot

编译安装

make
make install

第二次编译安装binutils之后,需要调整一下连接器来进行主体编译

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

至此binutils二次编译安装调整完毕,接下来要进行gcc的二次编译

进入gcc源码目录

cd $LFS/src/gcc-4.9.2

我们需要先写一个限制文件

cat gcc/limitx.h gcc/glimits.h gcc/limity.h >
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

然后调整一下编译环境

for file in
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e ‘s@/lib(64)?(32)?/ld@/tools&@g’
-e ‘s@/usr@/tools@g’ $file.orig > $file
echo ‘
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 “/tools/lib/”
#define STANDARD_STARTFILE_PREFIX_2 “”‘ >> $file
touch $file.orig
done

加入mpfr,gmp,mpc三个包的支持

tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

重命名libc++编译的目录

mv ../gcc-build ../gcc-build.libc++

新建编译目录

mkdir -v ../gcc-build
cd ../gcc-build

配置编译选项

CC=$LFS_TGT-gcc
CXX=$LFS_TGT-g++
AR=$LFS_TGT-ar
RANLIB=$LFS_TGT-ranlib
../gcc-4.9.2/configure
–prefix=/tools
–with-local-prefix=/tools
–with-native-system-header-dir=/tools/include
–enable-languages=c,c++
–disable-libstdcxx-pch
–disable-multilib
–disable-bootstrap
–disable-libgomp

编译后安装

make
make install

在这之后我们需要做个软连接

ln -sv gcc /tools/bin/cc

接下来写个文件测试一下

echo ‘main(){}’ > dummy.c
cc dummy.c
readelf -l a.out | grep ‘: /tools’

回显应该还是这个

[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

最后清理一下测试文件

rm -v dummy.c a.out

两次编译binutils和gcc之后,进入tcl的编译安装

回到$LFS/src目录,解压tcl源码

tar zxvf tcl8.6.3-src.tar.gz
cd tcl8.6.3
cd unix

配置编译选项

./configure –prefix=/tools

编译并测试

make
TZ=UTC make test
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

这个此时结果里面有几个数,Total是一共做了多少项测试,Passed是这些测试中通过了多少项,Skipped是跳过了几项测试,Failed是这些测试中有多少失败了。

从这份结果中,我们可以看到tcl编译完全正常,一共116项测试,全部通过,这就意味着可以安装了

make install

下面给tcl库文件加上属主的写权限

chmod -v u+w /tools/lib/libtcl8.6.so

回显应该是这样

mode of `/tools/lib/libtcl8.6.so’ changed from 0555 (r-xr-xr-x) to 0755 (rwxr-xr-x)

安装tcl的头

make install-private-headers

回显应该是这样

Installing private header files to /tools/include/

做个软连接

ln -sv tclsh8.6 /tools/bin/tclsh

继续进行expect编译,解压并进入expect目录

tar zxvf expect5.45.tar.gz
cd expect5.45

首先得重写configure文件

cp -v configure{,.orig}
sed ‘s:/usr/local/bin:/bin:’ configure.orig > configure

配置编译选项

./configure –prefix=/tools
–with-tcl=/tools/lib
–with-tclinclude=/tools/include

编译和测试

make
make test
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

本次测试我们发现一共有26个用例,其中通过了15个,有11个失败了。不过在LFS 7.7的官方文档中有这么一句

Note that the Expect test suite is known to experience failures under certain host conditions that are not within ourcontrol. Therefore, test suite failures here are not surprising and are not considered critical.

这就说明测试用例失败不代表主要依据,所以我们继续往下安装,只要安装和使用不出问题,就没关系。

make SCRIPTS=”” install

安装没有报错,所以我们不必担心那近乎一半的测试用例失败。

继续我们回到$LFS/src并解压并配置编译DejaGNU

tar zxvf dejagnu-1.5.2.tar.gz
cd dejagnu-1.5.2
./configure –prefix=/tools

这个配置完编译选项之后可以直接安装并检查编译

make install
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

测试结果Summary显示有68个测试通过,没有失败信息

接下来是check的编译安装,check有点特殊的是,在配置编译选项的时候,需要将配置结果设置一个变量。回到$LFS/src,解压并进入源码目录

tar zxvf check-0.9.14.tar.gz
cd check-0.9.14

开始配置编译选项

PKG_CONFIG= ./configure –prefix=/tools

除了这个没什么新鲜的,就是configure的最后有个Summary of Check options

Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

再就是编译和编译检查

make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

检查结果显示,7个测试全部通过,安装即可

make install

安装成功后回到$LFS/src,继续解压ncurses并进入源码目录

cd $LFS/src
tar zxvf ncurses-5.9.tar.gz
cd ncurses-5.9

下面的倒是没新鲜的,配置编译选项并且编译安装就可以了

./configure –prefix=/tools
–with-shared
–without-debug
–without-ada
–enable-widec
–enable-overwrite
make
make install

回到$LFS/src,解压bash并进入源码目录

cd $LFS/src
tar zxvf bash-4.3.30.tar.gz
cd bash-4.3.30

配置编译选项并且编译

./configure –prefix=/tools –without-bash-malloc

进行编译测试并且安装

make tests
make install

再加个软连接就完成了

ln -sv bash /tools/bin/sh

解压编译安装bzip2

cd $LFS/src
tar zxvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
make PREFIX=/tools install

来进行编译coreutils,还是先回到$LFS/src,再解压并进入coreutils源码目录

cd $LFS/src
tar -xf coreutils-8.23.tar.xz
cd coreutils-8.23

配置coreutils的编译选项

./configure –prefix=/tools –enable-install-program=hostname

编译后测试,这次测试需要加个选项

make
make RUN_EXPENSIVE_TESTS=yes check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

测试结果显示,共306项测试,通过270项,跳过36项,没有失败和错误,继续安装就可以了

make install

接下来的diffutils没有新鲜的,配置安装路径后编译,检查安装就好了

cd $LFS/src
tar -xf diffutils-3.3.tar.xz
cd diffutils-3.3
./configure –prefix=/tools
make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

测试结果显示共140项,通过112项,跳过28项,可以正常安装

make install

接下来的file也如是一样

cd $LFS/src
tar zxvf file-5.22.tar.gz
cd file-5.22
./configure –prefix=/tools
make
make check
make install

下一个是findutils,同样的步骤

cd $LFS/src
tar zxvf findutils-4.4.2.tar.gz
cd findutils-4.4.2
./configure –prefix=/tools
make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

测试结果表明,28项测试全部通过,没有失败记录,可以安装

make install

继续下一个软件编译,gawk过程也没新鲜的,老规矩

cd $LFS/src
tar -xf gawk-4.1.1.tar.xz
cd gawk-4.1.1
./configure –prefix=/tools
make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

检查结果认为有6项测试失败,先不去理会,继续安装

make install

下一个软件是gettext,这个稍微有点复杂

首先依旧进入$LFS/src来解压并进入源码目录

cd $LFS/src
tar -xf gettext-0.19.4.tar.xz
cd gettext-0.19.4

先进入gettext-tools目录

cd gettext-tools

配置编译选项

EMACS=”no” ./configure –prefix=/tools –disable-shared

接下来需要分别编译

make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext

之后来手动安装到/tools/bin下面

cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

继续解压编译安装grep

tar -xf grep-2.21.tar.xz
cd grep-2.21
./configure –prefix=/tools
make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

测试结果显示共测试138项,通过120项,跳过18项,可以正常安装

make install

接下来的gzip也如是一样

cd $LFS/src
tar -xf gzip-1.6.tar.xz
cd gzip-1.6
./configure –prefix=/tools
make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

检测结果显示共15项测试,通过15项,可以正常安装

make install

继续下一个,M4的编译安装

cd $LFS/src
tar -xf m4-1.4.17.tar.xz
cd m4-1.4.17
./configure –prefix=/tools
make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

检查结果显示,共163项测试,通过142项,跳过21项,可以正常安装

make install

继续来编译make

cd $LFS/src
tar jxvf make-4.1.tar.bz2
./configure –prefix=/tools –without-guile
make
make check
Linux:重走LFS之路:(五) 工具链编译-2
Linux:重走LFS之路:(五) 工具链编译-2

检测结果显示,共544项测试,没有失败,可以正常安装

make install

大部分的工具软件都是指定一下prefix参数就可以编译安装了,只有个别的需要做一下其他的调整。随后,还会有一部分工具需要编译安装。

来源:http://www.haopingrui.cn/?p=95

Linux:tespeed – 测试网速的Python工具

许多电脑呆子知道可以用speedtest.net测试网速,但是这个不能在测试中给你足够的控制。Linux用户喜欢在终端中输入命令来完成任务,至少我就是这样的。

tespeed是一款有很多特性的python工具,可以在终端在测试网速。根据文档说明,它利用了speedtest.net的服务器,但是用户可以手动指定。

最初作者用php语言写了tespeed工具,并且证明了ISP提供的网络远低于它广告中所说的那样。但是事情并不是一直如他们想的那样,因此作者移植他的php脚本到python中,并且他的工具在github中已经有180个star了。

It means alot

如何在linux中测试tespeed

在你电脑上运行这个python程序前先确保系统已经满足了这个工具的依赖。tespeed依赖下面两个包:

  • lxml
  • SocksiPy

你可以用pip包管理系统来安装lxml,只要用下面的命令就行。

pip install lxml

现在我们需要输入下面的命令来下载安装SocksiPy。

wget http://sourceforge.net/projects/socksipy/files/socksipy/SocksiPy%201.00/SocksiPy.zip/

下载完成后 解压SocksiPy.zip并运行下面的命令来克隆tespeed仓库到你本地机器中。

git clone https://github.com/Janhouse/tespeed.git

接着把SocksiPy文件夹放到你克隆下来的tespeed项目中。现在我们要像截图那样在SocksiPy中的创建一个叫init.py的空文件。

Linux:tespeed - 测试网速的Python工具
Linux:tespeed – 测试网速的Python工具

现在我们已经解决了项目的依赖问题,我们可以用下面的命令运行了。

python tespeed.py

接下来就会发生一些神奇的事了。程序会测试你的下载和上传速度并且在你的终端中用漂亮的颜色显示出来。

Linux:tespeed - 测试网速的Python工具
Linux:tespeed – 测试网速的Python工具

在tespeed中有很多选项,如-ls来列出服务器,-p来指定代理服务器, -s来阻止调试(STDERR)输出, 还有很多我们会在本教程中探索。

如果你想要结果显示成MB,你可以在python tespeed.py 后面接上选项 -mib

python tespeed.py -mib

在你使用了-mib选项后你可以看到计量网速的单位改变了。

Linux:tespeed - 测试网速的Python工具
Linux:tespeed – 测试网速的Python工具

我非常喜欢用的一个选项是-w,它可以把标准输出转化成CSV格式。

python tespeed.py -w

使用下面的命令来列出服务器。

python tespeed -ls

运行上面的命令后,你会看到可以用于测试上传和下载速度的服务器列表。我的列表非常长,所以我不会在教程中共享了。

总结

tespeed的确是一款帮助用户在终端中测试上传和下载速度的高性能python脚本。它支持很多的选项并且你可以指定列表中你想使用的服务器。继续使用tespeed并在留言区写下你们的体验吧。


via: http://linoxide.com/tools/tespeed-python-tool-test-internet-speed/

作者:Oltjano Terpollari 译者:geekpi 校对:wxy

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

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

Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

Mumble是一个自由开源的VoIP应用,在新的 BSD 许可证下发布,主要面向的用户群体是游戏玩家。运行起来类似于TeamSpeak和Ventrilo,用户通过连接到同一个服务器来实现相互通讯。

Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

Mumble提供了如下的漂亮特性:

  • 低延迟,这点对游戏相当重要
  • 提供游戏中的可视插件,通过它你可以知道是谁正在和你通话并定位他们的位置
  • 交谈内容经过加密的,能够保护你的隐私和安全
  • 界面简单易于上手
  • 稳定高效的使用你的服务器资源

安装 Mumble

Mumble已经流行开来,进入了许多linux主流发行版的软件仓库,这使它安装起来更加的方便。若你使用的是Ubuntu那么使用apt-get就能安装,详细命令如下:

$ sudo apt-get install mumble-server
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

这条命令将会在你的服务器上安装服务端(亦称Murmur)。

配置 Mumble

运行以下命令启动Mumble:

$ sudo dpkg-reconfigure mumble-server

会弹出以下一些问题:

mumble q1

选择“是”让服务器开机时自动启动mumble,接着它会询问你是否运行高优先级模式以保持低延迟,为了让它保持最佳性能这是个不错的主意。

mumble q2

接着为你刚安装好的mumble服务端设管理员用户的密码,记住这个密码,它会在登录时用到。

Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

安装 Mumble 客户端

客户端可以安装到许多的主流操作系统中,例如windows,mac和linux。我们将教你在Ubuntu linux上安装和配置,你可以使用软件中心也可以用命令安装客户端:

$ sudo apt-get install mumble

第一次运行mumble时,配置向导将会帮助你配置音频的输入输出,使其能在客户端上保持最好的效果。第一次同样也会询问你要使用的是什么声音设备和麦克风:

Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

然后它将帮你校准设备:

Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

因为mumble会帮你加密所有的通讯内容所以它会要求你创建证书:

Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

完成配置向导后你就能添加第一个服务器,连接对话框如下图所示:

Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble
Linux:游戏玩家的福音:在 Ubuntu 上安装开源 VoIP 应用 Mumble

首先输入一个标签,名字任意因为那只不过是为了记住服务器的,然后输入服务器的地址和端口,最后使用“SuperUser”作为用户名,而密码则是你配置mumble服务器端时输入的密码。

现在你可以连接到服务器了,在联网玩游戏或与你好友、队友聊天开黑时享受这些功能给你带来的乐趣吧!


via: http://linoxide.com/ubuntu-how-to/install-mumble-ubuntu/

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

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

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

Linux:使用 backupninja 为 Debian 定制备份计划

backupninja是Debian系统(以及基于Debian的发行版)中一个强大的、高度可配置的备份软件。在前一篇文章中,我们探讨了如何安装backupninja以及如何设置两个备份操作并执行。然而,那些只是冰山一角。这一次,我们要讨论如何定制 Handler 和 Helper ,使用这些功能定制策略以完成任何备份需要。

Linux:使用 backupninja 为 Debian 定制备份计划
Linux:使用 backupninja 为 Debian 定制备份计划

回顾 backupninja

backupninja的一个独特的地方是它可以完全抛弃/etc/backup.d中的纯文本配置文件和操作文件,软件自己会搞定。另外,我们可以编写自定义脚本(又叫 “handler”)放在/usr/share/backupninja 目录下来完成不同类型的备份操作。此外,可以通过ninjahelper的基于ncurses的交互式菜单(又叫“helper”)来指导我们创建一些配置文件,使得人工错误降到最低。

创建定制的Handler与Helper

这一节的目标是创建一个脚本,将home目录以gzipbzip2压缩包的形式备份起来,不包括音乐与视频文件。我们将这个文件命名为home,将它放在/usr/backup/ninja目录下。

尽管你可以使用默认的tar handler(参考 /usr/share/backupninja/tar 与 /usr/share/backupninja/tar.helper)来达到这个效果,但是我们使用这种方法来展示如何创建实用的 handler 脚本与基于 ncurses 的 helper。你可以根据你的需求来决定如何运用这里的方法。

由于 handlers 来源于主脚本,所以无需以#!/bin/bash开始的释伴行(shebang line)。

我们编写的 handler (/usr/share/backupninja/home)如下所示。已经详细注释了。getconf 函数用来读取备份操作的配置文件。如果你指定了一个变量的值,那么它会覆盖配置文件中对应变量的值:

#/home 目录 handler 脚本
# 每个备份文件会通过 FQDN 来鉴别主机
getconf backupname
# 备份文件的保存目录
getconf backupdir
# 默认压缩
getconf compress
# 包含 /home 目录
getconf includes
#不包含 *.mp3 与 *.mp4 文件
getconf excludes
# 要打包备份文件的默认扩展名
getconf EXTENSION
# tar 程序的绝对路径
getconf TAR `which tar`
# date 程序的绝对路径
getconf DATE    `which date`
# 日期格式
DATEFORMAT="%Y-%m-%d"
# 如果备份目录不存在,以致命错误退出
if [ ! -d "$backupdir" ]
then
   mkdir -p "$backupdir" || fatal "Can not make directory $backupdir"
fi
# 如果备份目录不可写,同样以致命错误退出
if [ ! -w "$backupdir" ]
then
   fatal "Directory $backupdir is not writable"
fi
# 根据压缩格式选择对应的tar选项
case $compress in
   "gzip")
    compress_option="-z"
    EXTENSION="tar.gz"
    ;;
   "bzip")
    compress_option="-j"
    EXTENSION="tar.bz2"
    ;;
   "none")
    compress_option=""
    ;;
   *)
    warning "Unknown compress filter ($tar_compress)"
    compress_option=""
    EXTENSION="tar.gz"
    ;;
esac
# 不包含一些文件类型/目录
exclude_options=""
for i in $excludes
do
   exclude_options="$exclude_options --exclude $i"
done
# 调试信息,执行备份操作
debug "Running backup: " $TAR -c -p -v $compress_option $exclude_options
   -f "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`".$EXTENSION"
   $includes
# 将标准输出重定向到以.list为扩展的文件
# 将标准错误输出重定向到以.err为扩展的文件
$TAR -c -p -v $compress_option $exclude_options
   -f "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`".$EXTENSION"
   $includes
   > "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.list
   2> "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.err
[ $? -ne 0 ] && fatal "Tar backup failed"

接下来我们将要创建helper文件(/usr/share/backupninja/home.helper)。这样,hendlers将会以菜单的形式在ninjahelper中显示:

# 备份操作描述,以下划线分割单词
HELPERS="$HELPERS home:backup_of_home_directories"
home_wizard() {
   home_title="Home action wizard"
   backupname=`hostname --fqdn`
# 指定备份操作的时间
   inputBox "$home_title" "When to run this action?" "everyday at 01"
   [ $? = 1 ] && return
   home_when_run="when = $REPLY"
# 指定备份文件名
   inputBox "$home_title" ""Name" of backups" "$backupname"
   [ $? = 1 ] && return
   home_backupname="backupname = $REPLY"
   backupname="$REPLY"
# 指定保存备份文件的默认路径
   inputBox "$home_title" "Directory where to store the backups" "/var/backups/home"
   [ $? = 1 ] && return
   home_backupdir="backupdir = $REPLY"
# 指定复选框的默认值
   radioBox "$home_title" "Compression"
    "none"  "No compression" off
    "gzip"  "Compress with gzip" on
    "bzip"  "Compress with bzip" off
   [ $? = 1 ] && return;
   result="$REPLY"
   home_compress="compress = $REPLY "
   REPLY=
   while [ -z "$REPLY" ]; do
    formBegin "$home_title: Includes"
        formItem "Include:" /home/gacanepa
    formDisplay
    [ $? = 0 ] || return 1
    home_includes="includes = "
    for i in $REPLY; do
        [ -n "$i" ] && home_includes="$home_includes $i"
    done
   done
   REPLY=
   while [ -z "$REPLY" ]; do
    formBegin "$home_title: Excludes"
        formItem "Exclude:" *.mp3
        formItem "Exclude:" *.mp4
        # 按需增加多个“Exclude”文本框指定其他不须包含的内容
formItem "Exclude:"
        formItem "Exclude:"
    formDisplay
    [ $? = 0 ] || return 1
    home_excludes="excludes = "
    for i in $REPLY; do
        [ -n "$i" ] && home_excludes="$home_excludes $i"
    done
   done
# 保存配置
   get_next_filename $configdirectory/10.home
   cat > $next_filename <

运行 ninjahelper

当创建了名为home的handler脚本以及对应的home.helper后,运行ninjahelper命令创建一个新的备份操作。

#ninjahelper

选择 create a new backup action(创建一个新的备份操作)。

接下来将看到可选的操作类型,这里选择“backup of home directories"(备份home目录):

Linux:使用 backupninja 为 Debian 定制备份计划
Linux:使用 backupninja 为 Debian 定制备份计划

然后会显示在helper中设置的默认值(这里只显示了3个)。可以编辑文本框中的值。注意,关于“when”变量的语法,参考文档的日程安排章节。

当完成备份操作的创建后,它会显示在ninjahelper的初始化菜单中:

Linux:使用 backupninja 为 Debian 定制备份计划
Linux:使用 backupninja 为 Debian 定制备份计划

按回车键显示这个备份操作的选项。因为它非常简单,所以我们可以随便对它进行一些实验。

注意,“run this action now"(立即运行)选项会不顾日程表安排的时间而立即进行备份操作:

Linux:使用 backupninja 为 Debian 定制备份计划
Linux:使用 backupninja 为 Debian 定制备份计划

备份操作会发生一些错误,debug会提供一些有用的信息以帮助你定位错误并纠正。例如,当备份操作有错误并且没有被纠正,那么当它运行时将会打印出如下所示的错误信息。

上面的图片告诉我们,用于完成备份操作的连接没有建立,因为它所需要链接的远程主机似乎宕机了。另外,在helper文件中指定的目标目录不存在。当纠正这些问题后,重新开始备份操作。

需要牢记的事情:

  • 当你在/usr/share/backupninja 下新建了一个自定义脚本(如foobar)来处理特殊的备份操作时,那么你还需要编写与之对应的helper(foobar.helper)文件,ninjahelper 将通过它生成名为10.foobar(下一个操作为11,以此类推)的文件,保存在/etc/backup.d目录下,而这个文件才是备份操作的真正的配置文件。
  • 可以通过ninjahelper设定好备份操作的执行时间,或按照“when”变量中设置的频率来执行。

总结

在这篇文章中,我们探讨了如何从头创建我们自己的备份操作,以及如何向ninjahelper添加相关的菜单以生成对应的配置文件。通过上一篇与这一篇文章,我希望我已经给出了足够好的理由让你继续研究,或者至少应该尝试一下。


via: http://xmodulo.com/create-custom-backup-plan-debian.html

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

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

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

Linux:当流量尖峰到达时,在 Linux 内核中解决网络问题

Linux:当流量尖峰到达时,在 Linux 内核中解决网络问题
Linux:当流量尖峰到达时,在 Linux 内核中解决网络问题

几周前,我们开始注意位于华盛顿的追踪API的服务器网络流量有很大的变化。从一个相当稳定的日常模式下,我们开始看到300-400 Mbps尖峰流量,但我们的合法的流量(事件和人为更新)是不变的。

Linux:当流量尖峰到达时,在 Linux 内核中解决网络问题
Linux:当流量尖峰到达时,在 Linux 内核中解决网络问题

突然,我们的网络流量开始飙升像疯了似的。

找到虚假的流量来源是当务之急,因为这些尖峰流量正触发我们的上游路由器启动DDOS减灾模式来阻止流量。

有一些很好的内置的Linux工具帮助诊断网络问题。

  • ifconfig 会显示你的网络接口和多少数据包通过他们

  • ethtool -S 会显示你的数据包流的一些更详细的信息,象在网卡级丢弃的数据包的数量。

  • iptables -L -v -n 将显示你的各种防火墙规则处理数据包数。

  • netstat -s 会告诉由内核网络协议栈维护的一大堆的计数器值,例如ACK的数量,重发的数量等。

  • sysctl -a | grep net.ip 将显示你所有kernel中网络相关的设置。

  • tcpdump 将显示进出包的内容。

解决问题的线索是使用netstat -s命令的输出。 不幸的是,当你检查这个命令的输出的时候,还很难告诉这些数字意味着什么,应该是什么,以及它们是如何改变的。为了检查他们是如何变化的,我们创建了一个小程序来显示连续运行命令的输出,这让我们了解各种计数器变化的快慢。有一行输出看起来特别令人担忧。

此计数器的通常速率在未受影响的服务器上一般是 30-40 /秒,所以我们知道肯定是哪里出问题了。计数器表明我们正拒绝大量的包,因为这些包含有无效的 TCP 时间戳。临时的快速解决方案是用下面的命令关闭 TCP 时间戳:

sysctl -w net.ipv4.tcp_timestamps=0

这立即导致了包风暴停止。但是这不是一个永久性的解决方案,因为 TCP 时间戳是用于测量往返时间和分配数据包流中的延迟包到正确位置。在高速连接的时候这将成为一个问题,TCP 序列号可能在数秒间隔内缠绕。关于 TCP 的时间戳和性能的详细信息,请看 RFC 1323

在 Mixpanel,每当我们看到异常流量模式的时候,我们一般也运行 tcpdump,这样我们能够分析流量,然后试图确定根本原因。我们发现大量的 TCP ACK 数据包在我们的 API 服务器和一个特定的 IP 地址之间来回发送。结果我们的服务器陷入到向另一台服务器来来回回发送 TCP ACK 包的无限循环里面。一个主机持续地发出 TCP 时间戳,但是另一主机却不能识别这是有效的时间戳。

这时,我们意识到我们正在处理一个只能在 Linux 内核的 TCP 协议栈才能解决问题。所以我们的 CTO求助于 linux-netdev 看看是否能找到一个解决方案。值得庆幸的是我们发现这个问题已经遇到过的,并且有一个解决方案。原来,这种类型的包风暴可以由一些硬件故障或第三方改变 TCP SEQ,ACK,或连接中的主机认为对方发送过期的数据包所触发。避免让这种情况变成一个包风暴的方法是限制速度,设置 Linux 发送重复的 ACK 数据包速度为每秒一个或两个。这里有一个非常好的解释。

我们将接受这个补丁而且将之移植到当前正在使用的Ubuntu(Trusty)内核当中。感谢Ubuntu让这一切变得非常简单,重新编译修补过的内核仅仅只需要运行下面的命令,安装生成的.deb包并重启系统。

# 下载内核源代码并构建依赖
apt-get build-dep linux-image-3.13.0-45-generic
apt-get source linux-image-3.13.0-45-generic
# 应用补丁
cd linux-lts-trusty-3.13.0/
patch -p1 < Mitigate-TCP-ACK-Loops.patch
# 构建内核
fakeroot ./debian/rules clean
fakeroot ./debian/rules binary-headers binary-generic

来源:http://www.oschina.net/translate/diagnosing-networking-issues-in-the-linux-kernel

Linux:PHP 5.5 / PHP5.6 / PHP-NG 和 HHVM 哪个性能更好?

摘要:在一个基于Vagrant的本地环境中,可能是某个错误的原因,导致HHVM测试结果很差;在HHVM伙伴们协助下,该原因仍在研究中!然而,在DigitalOcean的一个4GB虚拟机中,HHVM甚至盖过了最新版的PHP-NG的风头!

Linux:PHP 5.5 / PHP5.6 / PHP-NG 和 HHVM 哪个性能更好?
Linux:PHP 5.5 / PHP5.6 / PHP-NG 和 HHVM 哪个性能更好?

结论:它们反映出HHVM的功效更佳(在JIT热启动后),虽然出于某些原因,我们不能在所有装备中获取这些结果。

如果你记得我们在几个月前写过一篇文章,那时WordPress 3.9表明是完全支持HHVM的,当时是那么令我们欢欣鼓舞。最初的基准测试结果显示,HHVM要比驱动着当前所有PHP构建的Zend引擎高级得多。后来,问题就出来了:

  • HHVM只能以单个用户运行,这意味着(在共享环境中)安全性差了
  • HHVM在崩溃后不会自动重启,而不幸的是,它至今仍然经常发生
  • HHVM在启动时使用大量内存,虽然,它和同规模的PHP-FPM比较,单个请求的内存使用量更低

很显然,你不得不根据你的(或者更确切地说是你的站点)的需求采取折中方案,然而这值得吗?切换到HHVM后,你期望获得多少性能改善呢?

在Kinsta,我们真的想要测试所有新技术,并通常会优化这一切来为我们的客户提供最佳的环境。今天,我最终花了点时间来配置测试环境并进行了一些测试来对比两个不同的构建,一个是全新出炉的WordPress安装,另外一个则添加了大量内容的WooCommerce!为了计量脚本的运行时间,我只是简单地添加了


这一行到footer.php的/body标记前。

这里是配置环境的详情:

  • DigitalOcean 4GB 雨滴容器 (2 CPU核心, 4GB RAM)
  • Ubuntu 14.04, MariaDB10
  • 测试站点: 已导入演示内容的Munditia主题,WooCommerce 2.1.12 & WordPress 3.9.1
  • PHP 5.5.9, PHP 5.5.15, PHP 5.6.0 RC2, PHP-NG (20140718-git-6cc487d)和HHVM 3.2.0 (版本是PHP 5.6.99-hhvm)

没有进一步大费周章,这些就是我的测试结果,数值越低越好,以秒为单位:

DigitalOcean 4GB 雨滴容器

单位是秒,运行10次,越低越好

Linux:PHP 5.5 / PHP5.6 / PHP-NG 和 HHVM 哪个性能更好?
Linux:PHP 5.5 / PHP5.6 / PHP-NG 和 HHVM 哪个性能更好?

看起来似乎PHP-NG在它首次运行后就获得了峰值性能!HHVM需要更多几次重载,但是它们的性能貌似差不多!我等不及PHP-NG合并到开发主干了!:)

一分钟命中数,越高越好。

Linux:PHP 5.5 / PHP5.6 / PHP-NG 和 HHVM 哪个性能更好?
Linux:PHP 5.5 / PHP5.6 / PHP-NG 和 HHVM 哪个性能更好?

PHP 5.5.15禁用OpCache

  • 执行: 236 hits
  • 可用性: 100.00 %
  • 消耗时间: 59.03 secs
  • 传输的数据: 2.40 MB
  • 回应时间: 2.47 secs
  • 执行率: 4.00 trans/sec
  • 吞吐量: 0.04 MB/sec
  • 并发数: 9.87
  • 成功的执行: 236
  • 失败的执行: 0
  • 最长执行: 4.44
  • 最短执行: 0.48

PHP 5.5.15启用OpCache

  • 执行: 441 hits
  • 可用性: 100.00 %
  • 消耗时间: 59.55 secs
  • 传输的数据: 4.48 MB
  • 回应时间: 1.34 secs
  • 执行率: 7.41 trans/sec
  • 吞吐量: 0.08 MB/sec
  • 并发数: 9.91
  • 成功的执行: 441
  • 失败的执行: 0
  • 最长执行: 2.19
  • 最短执行: 0.64

PHP 5.6 RC2禁用OpCache

  • 执行: 207 hits
  • 可用性: 100.00 %
  • 消耗时间: 59.87 secs
  • 传输的数据: 2.10 MB
  • 回应时间: 2.80 secs
  • 执行率: 3.46 trans/sec
  • 吞吐量: 0.04 MB/sec
  • 并发数: 9.68
  • 成功的执行: 207
  • 失败的执行: 0
  • 最长执行: 3.65
  • 最短执行: 0.54

PHP 5.6 RC2启用OpCache

  • 执行: 412 hits
  • 可用性: 100.00 %
  • 消耗时间: 59.03 secs
  • 传输的数据: 4.18 MB
  • 回应时间: 1.42 secs
  • 执行率: 6.98 trans/sec
  • 吞吐量: 0.07 MB/sec
  • 并发数: 9.88
  • 成功的执行: 412
  • 失败的执行: 0
  • 最长执行: 1.93
  • 最短执行: 0.34

HHVM 3.2.0(版本是PHP 5.6.99-hhvm)

  • 执行: 955 hits
  • 可用性: 100.00 %
  • 消耗时间: 59.69 secs
  • 传输的数据: 9.18 MB
  • 回应时间: 0.62 secs
  • 执行率: 16.00 trans/sec
  • 吞吐量: 0.15 MB/sec
  • 并发数: 9.94
  • 成功的执行: 955
  • 失败的执行: 0
  • 最长执行: 0.85
  • 最短执行: 0.23

PHP-NG启用OpCache(构建: Jul 29 2014)

  • 执行: 849 hits
  • 可用性: 100.00 %
  • 消耗时间: 59.88 secs
  • 传输的数据: 8.63 MB
  • 回应时间: 0.70 secs
  • 执行率: 14.18 trans/sec
  • 吞吐量: 0.14 MB/sec
  • 并发数: 9.94
  • 成功的执行: 849
  • 失败的执行: 0
  • 最长执行: 1.06
  • 最短执行: 0.13

注意:这里节略了前一次的测试结果(有误),如感兴趣请访问原文查看。


via: https://kinsta.com/blog/real-world-wordpress-benchmarks-with-php5-5-php5-6-php-ng-and-hhvm/

作者:Mark Gavalda 译者:GOLinux 校对:wxy

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

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

Linux:重走LFS之路:(六) 工具链编译-3

Linux:重走LFS之路:(六) 工具链编译-3
Linux:重走LFS之路:(六) 工具链编译-3

(题图来自: techradar.com)

工具编译进入了最后的阶段

依旧是进入$LFS/src,解压并进入patch源码目录

cd $LFS/src
tar -xf patch-2.7.4.tar.xz
cd patch-2.7.4

配置编译选项,编译并检查编译

./configure –prefix=/tools
make
make check
Linux:重走LFS之路:(六) 工具链编译-3
Linux:重走LFS之路:(六) 工具链编译-3

测试结果表明,共测试39项,其中38项通过,1项失败,继续安装

make install

回到$LFS/src,解压并进入perl源码目录

cd $LFS/src
tar jxvf perl-5.20.2.tar.bz2
cd perl-5.20.2

配置编译选项,这是手动执行配置脚本

sh Configure -des -Dprefix=/tools -Dlibs=-lm

正常编译后,需要手动来安装到指定目录

make
cp -v perl cpan/podlators/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.20.2
cp -Rv lib/* /tools/lib/perl5/5.20.2

回到$LFS/src目录,继续进行sed的安装,解压并进入源码目录

cd $LFS/src
tar jxvf sed-4.2.2.tar.bz2
cd sed-4.2.2

配置编译选项,编译,检查编译,安装就好了

./configure –prefix=/tools
make
make check
make install

继续同样的步骤来编译安装tar

cd $LFS/src
tar xf tar-1.28.tar.xz
cd tar-1.28
./configure –prefix=/tools
make
make check
make install

同样的步骤安装texinfo

cd $LFS/src
tar xf texinfo-5.2.tar.xz
cd texinfo-5.2
./configure –prefix=/tools
make
make check
make install

接下来安装linux系统工具,首先回到$LFS/src目录并解压进入源码包

cd $LFS/src
tar xf util-linux-2.26.tar.xz
cd util-linux-2.26

linux系统工具的编译配置会相对麻烦一点

./configure –prefix=/tools
–without-python
–disable-makeinstall-chown
–without-systemdsystemunitdir
PKG_CONFIG=””

配置之后编译安装即可,这个没有测试用例可以进行测试

make
make install

下面编译安装xz依然是老步骤

cd $LFS/src
tar xf xz-5.2.0.tar.xz
cd xz-5.2.0
./configure –prefix=/tools
make
make check
make install

工具已经全部成功安装了,下面来进行清理工作

strip –strip-debug /tools/lib/*
/usr/bin/strip –strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{,share}/{info,man,doc}

最后一步就是将$LFS/tools目录以及下面的所有目录与文件属主变为root,为后面编译系统主体做好准备。

chown -R root:root $LFS/tools

至此工具链编译完成,后面将会开始基础系统的编译安装。

来源:http://www.haopingrui.cn/?p=110

Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”

提问:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”错误?

今天,当我在升级Lubuntu 14.04的时候遇到了下面这个错误,但是很简单。

“Not Enough Free Disk Space On /boot”

这是因为我的 /boot 分区被不再需要的旧内核与包塞满了。

回答:

我听说Ubuntu Tweak中的Computer Janitor功能可以删除不想要的垃圾文件。使用Computer Janitor,你可以将你的系统清理成像新安装的那样。Janitor会删除:

  • 程序缓存(Firefox/Chrome 缓存、软件中心缓存);
  • 略缩图缓存;
  • apt缓存;
  • 旧内核;
  • 包的配置;
  • 不再需要的包。

如果你还没有安装这个工具,参考下面的链接

要删除不需要的垃圾文件,打开Ubuntu Tweak,点击 Janitor 选项。

Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”
Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”

选择你想要删除的文件的选框,并点击 Clean 按钮。

Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”
Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”

Janitor现在就开始清理你的系统了。

Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”
Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”

真酷!系统清理完成了。

Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”
Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”

我重启启动了软件更新。这个没再遇到问题了。

Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”
Linux:如何在Ubuntu上修复“Not Enough Free Disk Space On /boot”

就是这样。当然也有其他的方法可以清理系统。但是,这个方法很容易学。我们可以只点击几次鼠标就可以清理系统。

干杯!


via: http://www.unixmen.com/how-to-fix-not-enough-free-disk-space-on-boot-in-ubuntu/

作者:SK 译者:geekpi 校对:wxy

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

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

Linux:Linux有问必答:Perl中本地时间和UNIX时间戳间相互转换

问题: 在Perl语言中,我需要转换易读的日期和时间到对应的UNIX时间戳,反之亦然。你可以给我一些将日期及时间转换到UNIX时间戳的Perl代码例子吗?或者相反,转换UNIX时间戳到可读的日期和时间。

当你的Perl脚本需要解决时间信息,这里有两种方法来表示和处理日期和时间。一种方法是易读的时间表示(例,”Sat Mar 14 10:14:05 EDT 2015″),另外一种是使用UNIX时间戳(也叫“新纪元时间”),这是从1970年1月1日到今所经过的时间秒数。每一种方法都有它自己的优劣势,取决于你的需要,也许也就需要转换一种格式到另一种。

Linux:Linux有问必答:Perl中本地时间和UNIX时间戳间相互转换
Linux:Linux有问必答:Perl中本地时间和UNIX时间戳间相互转换

Perl中转换本地时间到UNIX时间戳

为了从日期字符串中获得UNIX时间,可以使用Date::Parse模块中str2time()函数。此函数可以处理多种格式,例如:

  • Sat Mar 14 10:14:05 EDT 2015
  • 3/14/2015 10:14:05 -0400
  • 14/Mar/15 10:14:05
  • 14 Mar 15 10:14:05
use Date::Parse;
my $local_time = "Sat Mar 14 10:14:05 EDT 2015";
# 1426342445 will be stored in $unix_time
my $unix_time = str2time($local_time);

Date:Parse 模块支持多种语言(英语,法语,德语和意大利语)和时区。例如:

use Date::Parse;
use Date::Language;
my $lang = Date::Language->new('French');
my $unix_time = $lang->str2time("12:14:05, Ago 16, 2014 (CEST)");

Perl中UNIX时间戳到易读的日期和时间

如果你想要转换UNIX时间戳到易读的格式,可以使用localtime()函数,此函数可以转换UNIX时间戳为一个9元素列表。然后你可以使用返回的list构造任何你需要的可读格式。这里有一个代码片段:

# $sec, $min, $hour: 秒,分,时
# $mday: 月中的某天 (0-31)
# $mon: 月份,范围 0 (一月) 至 11 (十二月)
# $year: 年份,与1900年的差值(2015年为2015-1900=115)
# $wday: 星期,范围 0 (星期天) 至 6 (星期六)
# $yday: 年中的某天,范围 0 至 364 (或 365 闰年)
# $isdst: 是否是夏令时
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp);
# necessary conversion of $mon and $year
$mon += 1;
$year += 1900;
print "Current time: $year-$mon-$mday $hour:$min:$secn";

via: http://ask.xmodulo.com/convert-local-time-unix-timestamp-perl.html

作者:Dan Nanni 译者:VicYu/Vic020 校对:wxy

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

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

Linux:PHP 实现四种基本排序算法

许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路。

Linux:PHP 实现四种基本排序算法
Linux:PHP 实现四种基本排序算法

(题图来自:robinhoodsplayground.com)

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 $arr(1,43,54,62,21,66,32,78,36,76,39); 

1. 冒泡排序

思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

代码实现:

$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //该层循环控制 需要冒泡的轮数
  for($i=1;$i<$len;$i++)
  { //该层循环用来控制每轮 冒出一个数 需要比较的次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}

2. 选择排序 

思路分析:在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

代码实现:

function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假设最小的值的位置
        $p = $i;
        
        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是当前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
} 

3.插入排序

思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

代码实现:

function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //内层循环控制,比较并插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    return $arr;
}

4.快速排序  

思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

代码实现:

function quickSort($arr) {
    //先判断是否需要继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选择第一个元素作为基准
    $base_num = $arr[0];
    //遍历除了标尺外的所有元素,按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();  //小于基准的
    $right_array = array();  //大于基准的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并
    return array_merge($left_array, array($base_num), $right_array);
}

来源:http://www.php100.com/html/dujia/2015/0210/8604.html

Linux:Nginx 重写规则指南

当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你,你再到生产环境下配置。对于重写规则说到底就是正则匹配,做运维的岂能对正则表达式不了解的?最起码最基本的正则表达式会写。套用一句阿里的话(某网友说是阿里说的,不清楚到底是不是出自阿里)“不懂程序的运维,不是好运维;不懂运维的开发,不是好开发。”。 正则表达式也是一门语言哈。当你学习一门语言时,必然会遇到该门语言的正则表达式这章节的。 在这里推荐一本非常好的正则表达式书,包含常用的语言的正则写法如sed、perl、bash、awk、php、c#、java、javascript、python、ruby等等,《Regular Expressions Cookbook, 2nd Edition》,也有中文版的,大家可以到网络上找找。

Linux:Nginx 重写规则指南
Linux:Nginx 重写规则指南

本文介绍nginx的重写模块,创建重写规则向导,便于快捷正确的创建新的重写规则,不求救于人。同时,如果想把apache转换成nginx,重写规则也是要改的咯。

一. rewrite模块介绍

nginx的重写模块是一个简单的正则表达式匹配与一个虚拟堆叠机结合。依赖于PCRE库,因此需要安装pcre。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。

二. rewrite模块指令

break

语法:break

默认值:none

使用字段:server, location, if

完成当前设置的重写规则,停止执行其他的重写规则。

if

语法:if (condition) { … }

默认值:none

使用字段:server, location

注意:尽量考虑使用try_files代替。判断的条件可以有以下值:

  1. 一个变量的名称:空字符传“”或者一些“0”开始的字符串为false。
  2. 字符串比较:使用=或!=运算符
  3. 正则表达式匹配:使用~(区分大小写)和~*(不区分大小写),取反运算!~和!~*。
  4. 文件是否存在:使用-f和!-f操作符
  5. 目录是否存在:使用-d和!-d操作符
  6. 文件、目录、符号链接是否存在:使用-e和!-e操作符
  7. 文件是否可执行:使用-x和!-x操作符

return

语法:return code

默认值:none

使用字段:server, location, if

停止处理并为客户端返回状态码。非标准的444状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416与500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。

rewrite

语法:rewrite regex replacement flag

默认值:none

使用字段:server, location, if

按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。

注意:如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。

尾部的标记(flag)可以是以下的值:

  • last – 停止处理重写模块指令,之后搜索location与更改后的URI匹配。
  • break – 完成重写指令。
  • redirect – 返回302临时重定向,如果替换字段用http://开头则被使用。
  • permanent – 返回301永久重定向。

rewrite_log

语法:rewrite_log on | off

默认值:rewrite_log off

使用字段:server, location, if

变量:无

启用时将在error log中记录notice级别的重写日志。

set

语法:set variable value

默认值:none

使用字段:server, location, if

为给定的变量设置一个特定值。

uninitialized_variable_warn

语法:uninitialized_variable_warn on|off

默认值:uninitialized_variable_warn on

使用字段:http, server, location, if

控制是否记录未初始化变量的警告信息。

三. 重写规则组成部分

3.1 任何重写规则的第一部分都是一个正则表达式

可以使用括号来捕获,后续可以根据位置来将其引用,位置变量值取决于捕获正则表达式中的顺序,$1引用第一个括号中的值,$2引用第二个括号中的值,以此类推。如:

^/images/([a-z]{2})/([a-z0-9]{5})/(.*).(png|jpg|gif)$

$1是两个小写字母组成的字符串,$2是由小写字母和0到9的数字组成的5个字符的字符串,$3将是个文件名,$4是png、jpg、gif中的其中一个。

3.2 重写规则的第二部分是URI

请求被改写。该URI可能包含正则表达式中的捕获的位置参数或这个级别下的nginx任何配置变量。如:

/data?file=$3.$4

如果这个URI不匹配nginx配置的任何location,那么将给客户端返回301(永久重定向)或302(临时重定向)的状态码来表示重定向类型。该状态码可以通过第三个参数来明确指定。

3.3 重写规则的第三部分

第三部分也就是尾部的标记(flag)。 last标记将导致重写后的URI搜索匹配nginx的其他location,最多可循环10次。如:

rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*).(png|jpg|gif)$' /data?file=$3.$4 last;

break指令可以当做自身指令。如:

if ($bwhog) {
    limit_rate 300k;
    break;
}

另一个停止重写模块处理指令是return, 来控制主HTTP模块处理请求。 这意味着,nginx直接返回信息给客户端,与error_page结合为客户端呈现格式化的HTML页面或激活不同的模块来完成请求。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。如:

location = /image404.html {
    return 404 "image not foundn";
}

四. 实例

http {
    # 定义image日志格式
    log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
    # 开启重写日志
    rewrite_log on;
    server {
        root /home/www;
        location / {
            # 重写规则信息
            error_log logs/rewrite.log notice;
            # 注意这里要用‘’单引号引起来,避免{}
            rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*).(png|jpg|gif)$' /data?file=$3.$4;
            # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
            set $image_file $3;
            set $image_type $4;
        }
        location /data {
            # 指定针对图片的日志格式,来分析图片类型和大小
            access_log logs/images.log main;
            root /data/images;
            # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
            try_files /$arg_file /image404.html;
        }
        location = /image404.html {
            # 图片不存在返回特定的信息
            return 404 "image not foundn";
        }
}

五. 创建新的重新规则

在接到要创建新的重写规则时,要弄清楚需求是什么样的,再决定怎么做。毕竟重写也是耗资源的有效率之分的。 下面的这些问题有些帮助的:

  1. 你的URL的模式是什么样的?
  2. 是否有一个以上的方法来实现?
  3. 是否需要捕获URL部分作为变量?
  4. 重定向到另一个web上可以看到我的规则?
  5. 是否要替换查询的字符串参数?

检查网站或应用程序布局,清楚URL模式。啰嗦一句:我一而再再而三的强调,运维不能与开发脱节,运维要参与到开发当中。如果有不止一种方法实现,创建一个永久重定向。同时,定义一个重写规范,来使网址清洁,还可以帮助网站更容易被找到。

实例1. 要将home目录重定向到主页面上,目录结构如下:

/
/home
/home/
/home/index
/home/index/
/index
/index.php
/index.php/

重写规则如下:

rewrite ^/(home(/index)?|index(.php)?)/?$ $scheme:
//$host/ permanent;

指定$scheme和$host变量,因为要做一个永久重定向并希望nginx使用相同的参数来构造URL。

实例2. 如果想分别记录各个部分的URL,可以使用正则表达式来捕获URI,然后,给变量分配指定位置变量,见上面的实例。

实例3. 当重写规则导致内部重定向或指示客户端调用该规则本身被定义的location时,必须采取特殊的动作来避免重写循环。如:在server配置段定义了一条规则带上last标志,在引用location时,必须使用break标志。

server {
    rewrite ^(/images)/(.*).(png|jpg|gif)$ $1/$3/$2.$3 last;
    location /images/ {
        rewrite ^(/images)/(.*).(png|jpg|gif)$ $1/$3/$2.$3 break;
    }
}

实例4. 作为重写规则的一部分,传递新的查询字符串参数是使用重写规则的目标之一。 如:

rewrite ^/images/(.*)_(d+)x(d+).(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

nginx重写规则说起来挺简单的,做起来就难,重点在于正则表达式,同时,还需要考虑到nginx执行顺序。  

来源:http://www.ttlsa.com/nginx/nginx-rewriting-rules-guide/

Linux:重走LFS之路:(七) 基础系统编译准备

Linux:重走LFS之路:(七) 基础系统编译准备
Linux:重走LFS之路:(七) 基础系统编译准备

(题图来自: techradar.com)

准备虚拟内核文件系统

建立系统挂载目录

mkdir -pv $LFS/{dev,proc,sys,run}

创建初始设备节点

sudo mknod -m 600 $LFS/dev/console c 5 1
sudo mknod -m 666 $LFS/dev/null c 1 3

挂载并填充设备目录

sudo mount -v –bind /dev $LFS/dev

挂载虚拟内核文件系统

mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

建立一个符号链接

if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi

这时候就可以chroot到lfs的工具环境里面来进行基础系统的编译,但是在这之前需要先在$LFS中建立root目录,然后再chroot进去编译。

进入chroot环境

sudo chroot “$LFS” /tools/bin/env -i
HOME=/root
TERM=”$TERM”
PS1=’${debian_chroot:+($debian_chroot)}[33[01;31m][A][33[01;33m]u[33[00m]@[33[01;32m]h:[33[01;34m]w[33[00m]$ ‘
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin
/tools/bin/bash –login +h

建立必要目录、符号链接与文件

mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}
case $(uname -m) in
x86_64) ln -sv lib /lib64
ln -sv lib /usr/lib64
ln -sv lib /usr/local/lib64 ;;
esac
mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

建立基本文件和符号链接

ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
sed ‘s/tools/usr/’ /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
ln -sv bash /bin/sh
ln -sv /proc/self/mounts /etc/mtab

创建用户存储文件passwd

cat > /etc/passwd << “EOF”
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF

创建用户组文件group

cat > /etc/group << “EOF”
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
nogroup:x:99:
users:x:999:
EOF

这时候可以把用户名位置那讨厌的“I have no name!”去掉了

exec /tools/bin/bash –login +h

用户名成功变身root

再建立一些必要的日志文件,就可以进行系统编译啦

touch /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664 /var/log/lastlog
chmod -v 600 /var/log/btmp

来源:http://www.haopingrui.cn/?p=113

Linux:全局唯一ID(GUID)生成方案对比

本文汇总了各大公司的全局唯一ID生成方案,并做了一个简单的优劣比较

背景:在实现大型分布式程序时,通常会有全局唯一ID(也成GUID)生成的需求,用来对每一个对象标识一个代号。本文就列举了博主收集的各种全局唯一ID生成的方案,做一个简单的类比和备忘。

GUID的基本需求

Linux:全局唯一ID(GUID)生成方案对比
Linux:全局唯一ID(GUID)生成方案对比

一般对于唯一ID生成的要求主要这么几点:

  • 毫秒级的快速响应
  • 可用性强
  • prefix有连续性方便DB顺序存储
  • 体积小,8字节为佳

业界成熟方案列举

目前看到过的唯一ID生成方法主要有以下几种:

各个方案优劣的对比

四种方案各有优劣,下面简要描述以下:

  • UUID:
    • 优:java自带,好用。
    • 劣:占用空间大
  • Snowflake: timestamp + work number + seq number
    • 优:可用性强,速度快
    • 劣:需要引入zookeeper 和独立的snowflake专用服务器
  • Flikr:基于int/bigint的自增
    • 优:开发成本低
    • 劣:如果需要高性能,需要专门一套MySQL集群只用于生成自增ID。可用性也不强
  • Instagram:41b ts + 13b shard id + 10b increment seq
    • 优: 开发成本低
    • 劣: 基于postgreSQL的存储过程,通用性差
  • UUID变种:timestamp + machine number + random (具体见:变种介绍
    • 优: 开发成本低
    • 劣: 基于MySQL的存储过程,性能较差

来源:http://cenalulu.github.io/mysql/guid-generate/

Linux:vim 环境写 markdown 的插件推荐

本文将介绍在vim环境写markdown文档或者博文的一些好用插件

markdown语法高亮及识别

博主使用vim-markdown做语法高亮。安装方法很简单,这里以pathogen为例:

cd ~/.vim/bundle
git clone https://github.com/plasticboy/vim-markdown.git

安装完以后plugin自动由pathogen生效,由于我们是用markdown写jekyll博客,这里需要额外对YAML语法做个配置。在~/.vimrc中加上以下配置

let g:vim_markdown_frontmatter=1

Linux:vim 环境写 markdown 的插件推荐
Linux:vim 环境写 markdown 的插件推荐

代码补全/代码模板(snippet)

博主使用的markdown代码补全工具是snipMate工具来源于github。具体安装方式可以见项目的文档,也可以参照下面的摘录的缩略版:

% cd ~/.vim/bundle
% git clone https://github.com/tomtom/tlib_vim.git
% git clone https://github.com/MarcWeber/vim-addon-mw-utils.git
% git clone https://github.com/garbas/vim-snipmate.git
% git clone https://github.com/honza/vim-snippets.git

这里比较蛋疼的一点是:vim-markdownvim-snipmate无法自动配合使用,目前看来是因为前者将filetype设置为mkd,而后者需要filetype为markdown才能够生效。由于博主不懂vim-script所以用比较粗暴的方式解决了这个问题。如果有哪位读者知道怎么用vimrc或者其他方法解决这个问题的话,欢迎在博文下面留言!

% cd ~/.vim/bundle/vim-snippets
% cp markdown.snippets mkd.snippets

关于SnipMate还是UltiSnaps

重复造轮是IT界一直在试图避免的事情,那为什么github上会同时存在两个star数量过千代码补全工具呢?关于这个问题vim-snippets的作者正面回答过。简单的总结就是UltiSnaps需要python的支持,这样的依赖显然是不精简的,因此作者写了一套pure vim的解决方案。具体可见以下的摘录:

Q: Should “snipMate be deprecated in favour of UltiSnips”?

A: No, because snipMate is VimL, and UltiSnips requires Python. Some people want to use snippets without having to install Vim with Python support. Yes – this sucks.

One solution would be: Use snippets if they are good enough, but allow overriding them in UltiSnips. This would avoid most duplication while still serving most users. AFAIK there is a nested-placeholder branch for snipMate too. snipMate is still improved by Adnan Zafar. So maybe time is not ready to make a final decision yet.

来源:http://cenalulu.github.io/jekyll/vim-plugin-for-markdown/

Linux:vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端

vnStat 简介

vnStat 是一款轻量级的网络流量监控工具,目前各大 Linux/BSD 系统都已内置支持。

vnStat 本身只支持命令行的交互方式,而 Web 前端则由第三方工具支持。这里汇总并对比下 vnStat 的几种 Web 前端并为大家推荐最佳的一款。

vnStat Web 前端对比

vnStat 首页推荐的四个前端有:

  • vnStat SVG frontend: 基于 CGI / SVG / AJAX 的轻量级 web 前端

    仅仅需要一个支持 CGI 的 HTTP 服务器,可以产生非常漂亮的基于 SVG 的图形报告。支持按月/日/时/秒等查看流量信息,还支持 top10 展示。

    因为不需要安装额外的 PHP 解析器,所以轻松支持 Apache, Nginx 以及 Busybox 内置的 httpd 服务器。

    更重要的是,vnStatSVG 不仅支持普通的 Linux 主机,还可以轻松支持服务器,集群抑或是一个小型的嵌入式系统。

    Linux:vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端
    Linux:vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端
  • jsvnstat – interactive network traffic analysis

    jsvnstat 是另外一款 Web 前端,基于 Javascript 可以实现简单的交互,不过它依赖 PHP 支持,而且不支持集群和嵌入式系统。

    Linux:vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端
    Linux:vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端
  • vnStat PHP frontend: 一款基于 PHP 的 Web 前端

    严重依赖 PHP 和 GD image libraries。同样不支持集群和嵌入式系统。

    Linux:vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端
    Linux:vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端
  • VnstatSystrayIcon (Windows): 基于 Windows 平台

vnStatSVG 表现最佳

综合上述比较,不难发现 vnStatSVG 是一款最佳的 vnStat 前端。

关于它的更多特性,可以从其官方主页找到:

  • 基于 CGI / SVG / AJAX 动态地生成流量的图形报告(Top10/每月/每天/每时/每秒/汇总)
  • 支持 Apache, Nginx 以及 Busybox httpd,甚至其他更轻量级的 Web 服务器
  • 仅需 CGI 支持,无须 PHP 和其他额外模块,所以占用空间非常小
  • 因为只需从服务器传输 XML 格式的流量数据,所以消耗的带宽非常小
  • 可同时监控单台主机的任意多个网络设备接口,例如 eth0, eth1…
  • 可在一个窗口中同时监控某个集群的任意多台主机
  • 左侧的设备节点信息可展开,也可收缩,即使同时监控几十台主机都方便查看
  • 支持集群间的多种通信协议:http, ftp, file and even ssh
  • 支持多种浏览器客户端:Chromium, Firefox 以及 Safari
  • 可灵活通过多种不同方式获取 XML 格式的流量数据

总之,vnStatSVG 不仅支持普通的 Linux 主机,服务器,集群,而且支持基于 Busybox 这样的小型嵌入式系统。

vnStatSVG 快速上手

vnStatSVG 首页详细介绍了其用法,不过用的是英文,咱们用中文简单介绍一下如何在 Ubuntu 主机上快速安装和使用它。

安装 vnStat 和 Apache

sudo apt-get install vnstat apache2

下载 vnStatSVG

git clonehttps://gitlab.com/tinylab/vnstatsvg.git

安装 vnStatSVG

假设 Apache 的根目录放在 /var/www/,可以在 /var/www/创建一个 vnstatsvg目录,然后把 Web 前端安装到下面。

sudo-scd vnstatsvg.gitmkdir/var/www/vnstatsvg./configure-dvnstatsvgmake&&make install

如果根目录不在 /var/www/,请用 ./configure w指定。

通过 Web 查看流量信息

默认就可以通过浏览器打开 http://localhost/vnstatsvg/查看流量信息了。

添加更多网络设备节点

可以通过编辑 /var/www/vnstatsvg/sidebar.xml修改各个设备节点的信息,也可以直接复制一个模板过去:

sudo cp src/admin/sidebar.xml-template-4-singlehost/var/www/vnstatsvg/sidebar.xml

配置大体如下:

    eth0    localhost    Local Host

更多模板请查看 src/admin/sidebar.xml-template*

之后,编辑 sidebar.xml配置各类网络设备节点的信息:

  • name: 网络设备节点名,默认为 eth0, eth1 …
  • host: 主机地址或者域名
  • protocol: XML 格式的流量数据获取协议,默认为 http
  • dump_tool: 默认为 shell 方式,即 /cgi-bin/vnstat.sh
  • description: 设备节点对应的服务信息描述

支持同时监控多台主机

如果要同时监控多个主机,最简单的方式莫过于在其他机器上用同样方式安装一份 vnstatvnStatSVG,这样就只需要配置 namehost和 description,其他保持默认。

例如,如果要监控 localhost和 泰晓科技(域名为 tinylab.org) 的数据,可以添加一份如下配置:

    eth0    localhost    Local Host    eth1    tinylab.org    TinyLab.org

如果不想在其他机器上安装一份额外的 vnStatSVG,那么可以只安装 vnstat,但是需要有一种方式从其他主机上把数据拷贝到本地,例如,拷贝到本地的 vnstat数据目录下 /var/lib/vnstat

例如,可以用 ssh 协议(可以通过配置公钥免密登录)。

# collect-data.shhosts="tinylab.org"ifaces="eth0 eth1"while:;do    for h in hosts    do                for i in $ifaces                do                    scp ${h}:/var/lib/vnstat/${i} /var/lib/vnstat/${h}-${i}                    scp ${h}:/proc/net/dev > /var/lib/vnstat/${h}-${i}-second                done    done    sleep 5 done

可以在后台一直执行该脚本或者启动另外一个 cron任务来执行该脚本。这样就可以用 file虚拟协议,如下的 sidebar.xml就可以实现同样的效果了。





    eth0
    localhost
    Local Host


    tinylab.org-eth0
    localhost
    TinyLab.org:eth0


    tinylab.org-eth1
    localhost
    TinyLab.org:eth1

小结

vnStatSVG 的确是一款非常小巧但是功能强大的 vnStat web 前端,非常推荐!

关于更多用法,比如说嵌入式系统支持,请参考其项目首页

另外,如果要给 Nginx 添加 CGI 支持,可以参考 Add CGI support for Nginx

来源:http://www.tinylab.org/compare-different-vnstat-frontend/

Linux:如何在Linux上安装Telegram Messenger应用

Telegram是和whatsapp类似的及时通讯应用。它有一个庞大的用户群,并且很多独特的特性。

Linux:如何在Linux上安装Telegram Messenger应用
Linux:如何在Linux上安装Telegram Messenger应用

Telegram Messenger for Linux

这篇文章让你了解Telegram应用,以及在Linux Box上的详细安装命令。

Telegram的特性

  • 支持移动设备
  • 有桌面版本
  • 第三方开发者可以访问Telegram的应用程序接口(API)。
  • 支持Android, iphone/ipad, Windows Phone, Web-Version, PC, Mac 和 Linux。
  • 以上应用支持高度加密和自销毁信息。
  • 可以让你从多种设备和平台查看你的信息。
  • 整体的处理和消息传送都非常快
  • 为了安全和效率,在全球有分布式服务器
  • 开放的API和自由协议
  • 没有广告,没有认购费用。-永久免费
  • 功能强大-没有媒体和聊天限制
  • 多种安全措施使其免受黑客侵害
  • 在群组中回复特定信息。使用@username提醒群组里的多个用户

为什么使用Telegram?

在像WhatsApp以及其他及时通讯应用都提供了几乎同样的功能的情况下,为什么要选择Telegram?

第三方开发者可以使用API这一点就足够了。更多PC的可用性意味着你不必再纠结在你的移动设备上打字,你可以使用你的PC,这样更具有可用性。

另外,支持连接远程地点,协作-多达200个成员的群组,在所有设备上同步,发送各种类型的文件,信息加密,自毁信息,在云上存储媒体,基于完全可用API构建自己的工具。

测试环境

我们使用Debian GNU/Linux, x86_64结构测试,所有的步骤都非常顺利。以下是我们的详细步骤。

在Linux上安装Telegram Messenger

首先去Telegram的官方网站,下载Linux系统版本的Telegram源码包(tsetup.0.7.23.tar.xz),你也可以使用下面的wget命令直接下载。

# wget https://updates.tdesktop.com/tlinux/tsetup.0.7.23.tar.xz

下载好安装包后,解压安装包,并从当前目录进入解压后的文件夹。

# tar -xf tsetup.0.7.23.tar.xz
# cd Telegram/

然后,如下所示,在命令行中执行二进制文件‘Telegram’.

# ./Telegram
      1. 第一个界面, 点击 “START MESSAGING”.
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
        开始安装
      2. 输入你的手机号码,点击”Next”。如果在这之前你没有注册过Telegram,使用和之前输入相同的号码你会看到警告说你还没有Telegram账户。点击“Register Here”。
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
        注册Telegram
      3. 提交你的手机号码之后,Telegram很快会给你发送一个验证码。你需要输入它。
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
        Telegram验证码
      4. 输入你的姓名,昵称并点击“SIGN UP”.
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
        输入账户详细信息
      5. 新建账户之后,我看到这个界面。一切准备就绪,尽管我对Telegram还不熟悉。这个界面真的很简洁。
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
        Telegram界面
      6. 点击新建联系人,输入他们的姓名和手机号码,完成后点击新建。
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
         新建Telegram联系人
      7. 如果Telegram中还没有你输入的联系人,你会收到一个提示信息,当这个联系人加入Telegram的时候Telegram会通知你。
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
        Telegram联系人提示
      8. 当联系人加入Telegram的时候,你会收到信息(类似弹出提示)显示[YOUR_CONTACT]加入了Telegram。
      9. 在Linux系统上正式的聊天窗口。很好的体验…
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
         联系人加入Telegram消息
      10. 同时,我试着在我的Android移动设备上发送信息,两者之间界面非常相似。
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
         移动版Telegram界面
      11. Telegram设置页面. 你有很多可以配置的选项.
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
         设置Telegram
      12. 关于Telegram.
        Linux:如何在Linux上安装Telegram Messenger应用
        Linux:如何在Linux上安装Telegram Messenger应用
         关于Telegram

有趣的几点

  • Telegram使用MTProto移动协议
  • 一开始在2013年(8月14号)发布iPhone版
  • 惊人项目背后的人物:Pavel and Nikolai Durov..

就是这些了。我还会为大家带来你们喜欢阅读的其它有趣文章。很高兴能代表Tecmint,感谢我们尊贵的读者以及使得我们通过不断的自我提升走到这里的批评者。保持联系!继续评论。如果你关注我们那就请分享吧。

官网:https://telegram.org/


via: http://www.tecmint.com/install-telegram-in-linux/

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

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

来源:http://www.tecmint.com/install-telegram-in-linux/

Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统

Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统

想打造 New Relic 那样漂亮的实时监控系统我们只需要 InfluxDB/collectd/Grafana 这三个工具,这三个工具的关系是这样的:

采集数据(collectd)-> 存储数据(InfluxDB) -> 显示数据(Grafana)。

  • InfluxDB 是 Go 语言开发的一个开源分布式时序数据库,非常适合存储指标、事件、分析等数据,看版本号(v0.8.8)就知道这个项目还很年轻;
  • collectd 就不用介绍了吧,C 语言写的一个系统性能采集工具;
  • Grafana 是纯 Javascript 开发的前端工具,用于访问 InfluxDB,自定义报表、显示图表等。

下面的安装和配置步骤在 Ubuntu 14.04 Server 64bit 版上完成。升级整个系统后重启:

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot

安装 InfluxDB

InfluxDB 是 Go 写的,不依赖任何其他包或库,很干净。安装很容易:

$ wget https://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
$ sudo dpkg -i influxdb_latest_amd64.deb

启动 InfluxDB:

$ sudo /etc/init.d/influxdb start
Setting ulimit -n 65536
Starting the process influxdb [ OK ]
influxdb process was started [ OK ]

启动后打开 web 管理界面 http://192.168.2.183:8083/ 默认用户名和密码是 root 和 root. InfluxDB 的 Web 管理界面端口是 8083,HTTP API 监听端口是 8086,如果需要更改这些默认设定,修改 InfluxDB 的配置文件 /opt/influxdb/current/config.toml 后重启 InfluxDB 就可以了。

Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统

在刚安装好的 InfluxDB 上创建一个名为 collectd 的数据库,可以用命令行创建,也可以用 Web 管理界面操作:

$ curl "http://192.168.2.183:8086/db?u=root&p=root" -d "{"name": "collectd"}"
Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统

安装 collectd

安装 collectd:

$ sudo apt-get install collectd

配置 collectd 为客户端,收集到数据后直接发给 InfluxDB:

$ sudo vi /etc/collectd/collectd.conf
...
LoadPlugin network
...

        Server "192.168.2.183" "25826"

...

重启 collectd:

$ sudo /etc/init.d/collectd restart

InfluxDB 现在自带一个 collectd 插件来获取 collectd 客户端发来的数据,以前可没这么方便哦,0.8.4 版本以前只能通过 influxdb-collectd-proxy 这样的第三方程序来连接 collectd 和 InfluxDB. 如果你检查一下服务器上打开的端口就会发现 influxdb 插件启动了一个 25826 端口,如果发现 InfluxDB 数据库里没有(收集到)数据,务必检查这个 25826 端口是否正常启动了:

$ sudo netstat -tupln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      622/sshd
tcp6       0      0 :::8086                 :::*                    LISTEN      668/influxdb
tcp6       0      0 :::22                   :::*                    LISTEN      622/sshd
tcp6       0      0 :::8090                 :::*                    LISTEN      668/influxdb
tcp6       0      0 :::8099                 :::*                    LISTEN      668/influxdb
tcp6       0      0 :::8083                 :::*                    LISTEN      668/influxdb
udp6       0      0 :::25826                :::*                                668/influxdb

InfluxDB 自带的 collectd 插件默认是关闭的,需要手动配置打开 enabled = true,并填上 database = “collectd” 这一行,这里的 “collectd” 就是我们上面创建的那个数据库,更改配置后记得重启 InfluxDB:

$ sudo vi /opt/influxdb/current/config.toml
$ sudo vi /opt/influxdb/shared/config.toml
...
  # Configure the collectd api
  [input_plugins.collectd]
  enabled = true
  # address = "0.0.0.0" # If not set, is actually set to bind-address.
  # port = 25826
  database = "collectd"
  # types.db can be found in a collectd installation or on github:
  # https://github.com/collectd/collectd/blob/master/src/types.db
  # typesdb = "/usr/share/collectd/types.db" # The path to the collectd types.db file
...
$ sudo /etc/init.d/influxdb restart
Setting ulimit -n 65536
Setting ulimit -n 65536
influxdb process was stopped [ OK ]
Setting ulimit -n 65536
Starting the process influxdb [ OK ]
influxdb process was started [ OK ]

现在 InfluxDB 已经准备好接受和处理 collectd 传来的数据了。用命令行或者 Web 管理界面验证一下数据库里是否有数据:

$ curl -G 'http://192.168.2.183:8086/db/collectd/series?u=root&p=root&q=list+series&pretty=true'
[
    {
        "name": "list_series_result",
        "columns": [
            "time",
            "name"
        ],
        "points": [
            [
                0,
                "192.168.2.183/cpu-0/cpu-idle"
            ],
...
        ]
    }
]
Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统

安装 Grafana

下载 grafana 后解压放到 web 服务器上就可用。这里省去配置 Nginx/Apache 之类的麻烦,直接用最简单的 Web 服务器 python -m SimpleHTTPServer 驱动:

$ wget http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz
$ tar xzvf grafana-1.9.1.tar.gz
$ cd grafana-1.9.1.tar.gz
$ cp config.sample.js config.js
$ vi config.js
...
      // InfluxDB example setup (the InfluxDB databases specified need to exist)
      datasources: {
        influxdb: {
          type: 'influxdb',
          url: "http://192.168.2.183:8086/db/collectd",
          username: 'root',
          password: 'root',
        },
        ...
      },
...
$ sudo python -m SimpleHTTPServer

用浏览器访问 Grafana,这里的默认端口是 8000:

Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
Linux:使用 Grafana、collectd 和 InfluxDB 打造现代监控系统

来源:http://www.vpsee.com/2015/03/a-modern-monitoring-system-built-with-grafana-collected-influxdb/

Linux:重走LFS之路:(八) 基础系统编译-1

Linux:重走LFS之路:(八) 基础系统编译-1
Linux:重走LFS之路:(八) 基础系统编译-1

(题图来自: techradar.com)

 

从现在开始,我们进入真正意义上的LFS系统的基础系统编译。

这个阶段比较漫长,中间还有可能出现各种各样的问题,我会尽量翔实地记录遇到的各种状况和解决方案,以供后来参考。

Linux-3.19 API Headers

cd /src/linux-3.19

执行编译清理

cd /src/linux-3.19

重新编译

make INSTALL_HDR_PATH=dest headers_install

删除非必要文件

find dest/include ( -name .install -o -name ..install.cmd ) -delete

手工安装

cp -rv dest/include/* /usr/include

Man-pages-3.79

cd /src

解压并进入源码目录

tar xf man-pages-3.79.tar.xz
cd man-pages-3.79

安装

make install

Glibc-2.21

cd /src/glibc-2.21

此时需要给glibc打个补丁

patch -Np1 -i ../glibc-2.21-fhs-1.patch

然后解决32位的兼容问题

sed -e ‘/ia32/s/^/1:/’
-e ‘/SSE2/s/^1://’
-i sysdeps/i386/i686/multiarch/mempcpy_chk.S

由于之前编译过glibc,存在glibc-build目录,所以需要重命名一下老的构建目录并重建一个空的构建目录进入

mv ../glibc-build ../glibc-build.tool
mkdir -v ../glibc-build
cd ../glibc-build

配置编译选项,其中开启了2.6内核支持

../glibc-2.21/configure
–prefix=/usr
–disable-profile
–enable-kernel=2.6.32
–enable-obsolete-rpc

配置完成后进行编译和编译测试

make
make check

在这里,LFS 7.7官方文档给出了一个警告

在这一节中,glibc的测试套件非常关键,任何情况下都请不要跳过。

Linux:重走LFS之路:(八) 基础系统编译-1
Linux:重走LFS之路:(八) 基础系统编译-1

在这份summary中,有2个错误,但是没关系,不用害怕,可以继续往下。

建立一个配置文件

touch /etc/ld.so.conf

正常安装

make install

在这里需要说的是,虽然官方文档说测试套件很重要,但是就实际经验来看,只要能够正常make过去,通常不会出现什么大问题,所以只要不是很严重的错误,check不过也可以先让它过去,真正出问题时候再说。

为nscd建立配置文件和运行时目录

cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

然后进行地方设置和安装

mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
make localedata/install-locales

继续配置glibc,写入nsswitch.conf文件

cat > /etc/nsswitch.conf << “EOF”
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF

安装时区数据

tar xf ../tzdata2015a.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica
asia australasia backward pacificnew systemv; do
zic -L /dev/null -d $ZONEINFO -y “sh yearistype.sh” ${tz}
zic -L /dev/null -d $ZONEINFO/posix -y “sh yearistype.sh” ${tz}
zic -L leapseconds -d $ZONEINFO/right -y “sh yearistype.sh” ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

其中America/New_York可以改成其他地区,官方文档上是按纽约时间走的。不过没关系,时区和语言设置可以在系统运行之后再调整。

现在也可以调整,使用tzselect

tzselect

然后按照提示选择:大洲->国家->时区->确认

或者直接将地区文件复制替换/etc/localtime,比如将时间调整为上海时间

cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

配置动态加载

cat > /etc/ld.so.conf << “EOF”
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
cat >> /etc/ld.so.conf << “EOF”
# Add an include directory
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d

调整工具链

接下来的编译与上面不同,需要对工具链来进行一些调整

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
gcc -dumpspecs | sed -e ‘s@/tools@@g’
-e ‘/*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}’
-e ‘/*cpp:/{n;s@$@ -isystem /usr/include@}’ >
`dirname $(gcc –print-libgcc-file-name)`/specs

测试调整后的工具链

echo ‘main(){}’ > dummy.c
cc dummy.c -v -Wl,–verbose &> dummy.log
readelf -l a.out | grep ‘: /lib’

如果正确,应有如下回显

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

查看成功日志

grep -o ‘/usr/lib.*/crt[1in].*succeeded’ dummy.log

应有如下回显

/usr/lib/../lib64/crt1.o succeeded
/usr/lib/../lib64/crti.o succeeded
/usr/lib/../lib64/crtn.o succeeded

查看头文件包含日志

grep -B1 ‘^ /usr/include’ dummy.log

应有如下回显

#include <…> search starts here:
/usr/include

查看lib日志

grep ‘SEARCH.*/usr/lib’ dummy.log |sed ‘s|; |n|g’

应有如下回显,比官方文档多第一条和最后一条

SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/lib64″)
SEARCH_DIR(“/usr/lib”)
SEARCH_DIR(“/lib”)
SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/lib”);

查看libc日志

grep “/lib.*/libc.so.6 ” dummy.log

应有如下回显

attempt to open /lib64/libc.so.6 succeeded

最后查看动态连接日志

grep found dummy.log

应有如下回显

found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2

清理测试文件

rm -v dummy.c a.out dummy.log

Zlib-1.2.8

cd /src
tar xf zlib-1.2.8.tar.xz
cd zlib-1.2.8
./configure –prefix=/usr
make
make check
make install

此时需要移动一些模块文件,建立一些符号链接

mv -v /usr/lib/libz.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

File-5.22

cd /src/file-5.22

由于以前编译过,所以需要先清理一下

make clean

然后可以进行正常配置和安装

./configure –prefix=/usr
make
make check
make install

Binutils-2.25

由于chroot进来,需要先进行一个环境测试

expect -c “spawn ls”

回显应为

spawn ls

由于之前编译过binutils,所以需要重命名构建目录,再新建一个空的构建目录并进入

mv ../binutils-build ../binutils-build.tool
mkdir -v ../binutils-build
cd ../binutils-build

配置编译选项

../binutils-2.25/configure –prefix=/usr
–enable-shared
–disable-werror

编译时需要加一个tooldir的参数,之后编译测试

make tooldir=/usr
make -k check

最后安装

make tooldir=/usr install

来源:http://www.haopingrui.cn/?p=115

Linux:Nginx/LVS/HAProxy 负载均衡软件的优缺点详解

Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下。

Linux:Nginx/LVS/HAProxy 负载均衡软件的优缺点详解
Linux:Nginx/LVS/HAProxy 负载均衡软件的优缺点详解

一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了;如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用LVS。

一种是通过硬件来进行进行,常见的硬件有比较昂贵的F5和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;另外一种就是类似于Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用非常低廉。

目前关于网站架构一般比较合理流行的架构方案:Web前端采用Nginx/HAProxy+Keepalived作负载均衡器;后端采用MySQL数据库一主多从和读写分离,采用LVS+Keepalived的架构。当然要根据项目具体需求制定方案。

下面说说各自的特点和适用场合。

Nginx

Nginx的优点是: 

  1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。
  2. Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会;
  3. Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
  4. 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。
  5. Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。
  6. Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。
  7. Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。
  8. Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有lighttpd了,不过lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
  9. Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。

Nginx的缺点是:

  1. Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
  2. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。

LVS

LVS 是使用Linux内核集群实现的一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS的优点是:

  1. 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
  2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
  3. 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived。
  4. 无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
  5. 应用范围比较广,因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室等等。

LVS的缺点是:

  1. 软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
  2. 如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。

HAProxy

HAProxy的特点是:

  1. HAProxy也是支持虚拟主机的。
  2. HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
  3. HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
  4. HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,大家可以用LVS+Keepalived对MySQL主从做负载均衡。
  5. HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种:
    • roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
    • static-rr,表示根据权重,建议关注;
    • leastconn,表示最少连接者先处理,建议关注;
    • source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
    • ri,表示根据请求的URI;
    • rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
    • hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
    • rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

Nginx和LVS对比的总结:

Nginx工作在网络的7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下LVS并不具备这样的功能,所以Nginx单凭这点可利用的场合就远多于LVS了;但Nginx有用的这些功能使其可调整度要高于LVS,所以经常要去触碰触碰,触碰多了,人为出问题的几率也就会大。

Nginx对网络稳定性的依赖较小,理论上只要ping得通,网页访问正常,Nginx就能连得通,这是Nginx的一大优势!Nginx同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;LVS就比较依赖于网络环境,目前来看服务器在同一网段内并且LVS使用direct方式分流,效果较能得到保证。另外注意,LVS需要向托管商至少申请多一个ip来做Visual IP,貌似是不能用本身的IP来做VIP的。要做好LVS管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个HTTP那么简单了。

Nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。LVS的安装和配置、测试就要花比较长的时间了;LVS对网络依赖比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。

Nginx也同样能承受很高负载且稳定,但负载度和稳定度差LVS还有几个等级:Nginx处理所有流量所以受限于机器IO和配置;本身的bug也还是难以避免的。

Nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前LVS中 ldirectd也能支持针对服务器内部的情况来监控,但LVS的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而恼火。

Nginx对请求的异步处理可以帮助节点服务器减轻负载,假如使用apache直接对外服务,那么出现很多的窄带链接时apache服务器将会占用大 量内存而不能释放,使用多一个Nginx做apache代理的话,这些窄带链接会被Nginx挡住,apache上就不会堆积过多的请求,这样就减少了相当多的资源占用。这点使用squid也有相同的作用,即使squid本身配置为不缓存,对apache还是有很大帮助的。

Nginx能支持http、https和email(email的功能比较少用),LVS所支持的应用在这点上会比Nginx更多。在使用上,一般最前端所采取的策略应是LVS,也就是DNS的指向应为LVS均衡器,LVS的优点令它非常适合做这个任务。重要的ip地址,最好交由LVS托管,比如数据库的 ip、webservice服务器的ip等等,这些ip地址随着时间推移,使用面会越来越大,如果更换ip则故障会接踵而至。所以将这些重要ip交给 LVS托管是最为稳妥的,这样做的唯一缺点是需要的VIP数量会比较多。

Nginx可作为LVS节点机器使用,一是可以利用Nginx的功能,二是可以利用Nginx的性能。当然这一层面也可以直接使用squid,squid的功能方面就比Nginx弱不少了,性能上也有所逊色于Nginx。Nginx也可作为中层代理使用,这一层面Nginx基本上无对手,唯一可以撼动Nginx的就只有lighttpd了,不过lighttpd目前还没有能做到 Nginx完全的功能,配置也不那么清晰易读。另外,中层代理的IP也是重要的,所以中层代理也拥有一个VIP和LVS是最完美的方案了。具体的应用还得具体分析,如果是比较小的网站(日PV小于1000万),用Nginx就完全可以了,如果机器也不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或者重要的服务,机器不发愁的时候,要多多考虑利用LVS。

现在对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:

第一阶段:利用Nginx或HAProxy进行单点的负载均衡,这一阶段服务器规模刚脱离开单服务器、单数据库的模式,需要一定的负载均衡,但是仍然规模较小没有专业的维护团队来进行维护,也没有需要进行大规模的网站部署。这样利用Nginx或HAproxy就是第一选择,此时这些东西上手快, 配置容易,在七层之上利用HTTP协议就可以。这时是第一选择。

第二阶段:随着网络服务进一步扩大,这时单点的Nginx已经不能满足,这时使用LVS或者商用Array就是首要选择,Nginx此时就作为LVS或者Array的节点来使用,具体LVS或Array的是选择是根据公司规模和预算来选择,Array的应用交付功能非常强大,本人在某项目中使用过,性价比也远高于F5,商用首选!但是一般来说这阶段相关人才跟不上业务的提升,所以购买商业负载均衡已经成为了必经之路。

第三阶段:这时网络服务已经成为主流产品,此时随着公司知名度也进一步扩展,相关人才的能力以及数量也随之提升,这时无论从开发适合自身产品的定制,以及降低成本来讲开源的LVS,已经成为首选,这时LVS会成为主流。

最终形成比较理想的基本架构为:Array/LVS — Nginx/Haproxy — Squid/Varnish — AppServer。

来源:http://www.ha97.com/5646.html

Linux:为Bash和VIM配置一个美观奢华的状态提示栏

本文将详细介绍在Mac环境下安装powerline的方式

什么是powerline

Linux:为Bash和VIM配置一个美观奢华的状态提示栏
Linux:为Bash和VIM配置一个美观奢华的状态提示栏

如果你不是通过搜索引擎搜到这篇文章的话,也许你还没有听说过powerline。而你又恰巧是个*UNIX党,或者VIM党的话,那么强烈建议你了解并使用powerline。powerline是一个stateless status line,即一个全局状态/提示栏。如果你成功为你的bash,Terminal,iTerm2,VIM配置上powerline的话,那么效果将会是这样的:

Bash的提示符将会是这样的:

Bash

VIM的状态栏将会是这样的:

vim

VIM的整体效果图:

Linux:为Bash和VIM配置一个美观奢华的状态提示栏
Linux:为Bash和VIM配置一个美观奢华的状态提示栏

相信看了以上几个截图后,powerline的功能也就不言而喻了。他提供了各个app各个环境下的状态提示,极大的提高了工作效率

开始Mac上安装powerline

首先我们需要下载安装powerline。在正式安装之前先啰嗦几句powerline的代码结构,github上的powerline项目下涵盖了用于适配各种APP(bash,vim等)的代码。因此,你完全可以在Mac任何一个地方下载该代码包,然后将不同的APP配置使用这个路径,以Plugin形式加载。为了方便读者选择性安装,本文对于不同的程序将分开给出安装路径和配置。

先确定本机环境有一套版本大于等于2.7Python的环境。如果没有合适环境的话,可以通过homebrew安装,这里不多做赘述。

shell> python -V
Python 2.7.9

然后通过pip安装powerline:

shell> pip install powerline-status

安装完成后通过pip show powerline-status查看powerline所处的具体路径。注意:这个路径很重要,会用在之后的配置环节:

shell> pip show powerline-status
Name: powerline-status
Version: 2.0
Location: /Library/Python/2.7/site-packages
Requires:

配置Bash使用powerline

配置方法很简单,只需要在Bash配置文件(例如:/etc/bashrc~/.bashrc~/.bash_profile)中增加一行调用安装路径下的bindings/bash/powerline.sh即可。这样每次调用生成新的Bash窗口时,都会自动执行powerline.sh文件中的内容。下面以~/.bash_profile为例:

shell> echo << EOF >> ~/.bash_profile
. /Library/Python/2.7/site-packages/powerline/bindings/bash/powerline.sh
EOF
shell> . /Library/Python/2.7/site-packages/powerline/bindings/bash/powerline.sh

注意:根据python安装方式的不同,你的powerline所在路径也可能不同。如果你是通过python官网或者apple store通过安装工具安装的python,那么你的powerline安装路径就是/Library/Python/2.7/site-packages/powerline/。如果你是通过brew install python的话,那么你的powerline路径可能会有不同。请根据实际情况修改上面的命令。

Teriminal字体配置

执行完上面两步后,不出意外powerline就已经开始工作了。但是你会发现Bash提示符会和下图一样是一些非常恶心的符号。

mojibake

出现这样情况的原因是powerline为了美观自己造了一些符号,而这些符号不在Unicode字库内(如果你不知道Unicode字库是什么的话可以看下博主以前的相关介绍)。所以想要powerline正常显示的话,需要安装特殊处理过的字体。好在有一位热心人的帮助,他把大部分的程序猿常用的等宽字体都打上了powerline patch使得我们的这部配置将异常简单。首先我们从github上下载并安装字体:

shell> git clone https://github.com/powerline/fonts.git
shell> cd fonts
shell> ./install.sh

安装完成后我们就可以在iTerm2或者Terminal的字体选项里看到并选择多个xxx for powerline的字体了。*注意:对于ASCII fontsnon-ASCII fonts都需要选择for powerline的字体。如下图:

Linux:为Bash和VIM配置一个美观奢华的状态提示栏
Linux:为Bash和VIM配置一个美观奢华的状态提示栏

VIM相关配置

这部分我们将介绍如何为VIM配置powerline。首先你需要确保你的vim编译时开启了python支持。如果通过python --version|grep +python没有结果的话,那么你需要通过brew install vim --with-python --with-ruby --with-perl重新编译安装vim,或者使用brew install macvim --env-std --override-system-vim安装macvim。

然后,你只需要在~/.vimrc中加上以下部分,VIM就能够正常加载powerline功能了:

注意:其中set rtp+=/Library/Python/2.7/site-packages/powerline/bindings/vim和上文一样需要按照自己的实际情况调整。

set rtp+=/Library/Python/2.7/site-packages/powerline/bindings/vim
" These lines setup the environment to show graphics and colors correctly.
set nocompatible
set t_Co=256
let g:minBufExplForceSyntaxEnable = 1
python from powerline.vim import setup as powerline_setup
python powerline_setup()
python del powerline_setup
if ! has('gui_running')
   set ttimeoutlen=10
   augroup FastEscape
      autocmd!
      au InsertEnter * set timeoutlen=0
      au InsertLeave * set timeoutlen=1000
   augroup END
endif
set laststatus=2 " Always display the statusline in all windows
set guifont=Inconsolata for Powerline:h14
set noshowmode " Hide the default mode text (e.g. -- INSERT -- below the statusline)

Reference:

来源:http://cenalulu.github.io/linux/mac-powerline/

Linux:CoreOS那些事之系统升级

前段时间在DockerOne回复了一个关于 CoreOS 升级的提问。仔细琢磨来,这个问题还有不少可深入之处,因此有了此文,供已经在国内使用 CoreOS 的玩家们参考。

Linux:CoreOS那些事之系统升级
Linux:CoreOS那些事之系统升级

具有CoreOS特色的系统升级

CoreOS的设计初衷之一就是“解决互联网上普遍存在的服务器系统及软件由于没有及时升级和应用补丁,造成已知漏洞被恶意利用导致的安全性问题”。因此,它的升级方式在各种Linux发型版中可以说是独树一帜的,特别是与主流的服务器端系统相比。

平滑升级

一方面来说,常用的服务器系统如RedHat、CentOS、Debian、Ubuntu甚至FreeBSD和Windows Server都存在明确的版本界限,要么不能支持直接在线升级至新的发行版本,要么(如Debian/Ubuntu和Windows 7以后的版本)虽能够跨版本升级却容易出现兼容性风险,一旦升级后出现故障往往面临进退两难的局面。

这个问题在一些新兴的Linux发行版,如Arch Linux已经有了较先进的解决方法:将过去累计许多补丁再发行一次大版本的做法变为以月或更短周期的快速迭代更新,并由系统本身提供平滑升级和回滚的支持。这样,用户可以在任何时候、从任何版本直接更新至修了最新安全补丁的系统。然而,这些以 Arch 为代表的平滑升级系统还是带来了一些更新系统后无法使用的事故,不妨在百度以“Arch 升级问题”关键字搜索会发现许多类似的抱怨。事实上,Arch的目标用户主要是喜爱尝鲜的Linux爱好者而不是服务器管理员或者服务端应用架构师。

那么平滑升级的思路是不是在服务器系统就走不通了呢。其实仔细分析平滑升级出现问题的原因,当中最关键的一个因素在于,系统设计时最多只能确保从一个干净的系统顺利升级的途径,如果用户对系统中的某些核心组件做了修改(比如将系统中的Python2升级成了Python3),它就不属于操作系统设计者控制范围内的工作了。这样相当于设定了一个售后服务霸王条款(只是个比喻,这些Linux系统其实都是免费的):自行改装,不予保修。

在过去,用户要使用服务器系统,他就必然需要在上面安装其他的提供对外服务软件和程序,因此对系统本身有意无意的修改几乎是无法避免的。这个问题直到近些年来应用容器(特别是Docker)的概念被大规模的推广以后才出现了新的解决思路。而CoreOS就是通过容器巧妙的避开了用户篡改系统的问题,提出了另一种解决思路:让系统分区只读,用户通过容器运行服务。不得不说,这简直就是以一个霸王条款替代了另一个霸王条款,然而这个新的“条款”带来的附加好处,使得它被对稳定性安全性都要求很高的服务器领域而言接受起来要心安理得的多。

“反正许多东西都要自动化的,套个容器又何妨。” 恩,就这么愉快的决定了。

自动更新

另一方面来说,除了系统的大版本升级,平时的系统和关键软件的小幅补丁更新也时常由于系统管理员的疏忽而没有得到及时运用,这同样是导致系统安全问题的一个重要因素(比如2014年BrowserStack中招的这个例子)。

这个解决思路就比较简单了:自动更新。这么简单的办法当然早就被人用过了。即便在操作系统层面还见得不多,在应用软件上早都是烂熟的套路。那么,为了不落俗套,怎样把自动更新做得创意一些呢。先来看看系统升级都会有哪些坑。

乍一看来,操作系统这个东东和普通应用在升级时候会遇到的问题还是有几分相似。比如软件正在使用的时候一般是不可以直接热修补的,系统也一样(Linux 4.0 内核已经在着手解决这个痛点了,因此它在未来可能会成为伪命题)。又比如软件运行会有依赖,而系统的核心组件之间也是有依赖的,因此一旦涉及升级就又涉及了版本匹配问题。除此之外,它们之间还是有些不一样的地方。比如许多应用软件其实可以直接免安装的,升级时候直接把新文件替换一下旧的就算完成了。操作系统要想免安装,则需要些特别的技巧。

下面依次来说说CoreOS是怎样应对这几个坑的。

既然系统不能热修补,就一定会牵扯到重启的情况,这在服务器系统是比较忌讳的,为了避免系统重启时对外服务中断,CoreOS设计了服务自动迁移的内置功能,由其核心组件Fleet提供。当然这个并不是一个完美的方案,相信未来还会有更具创意的办法替代它的。

版本匹配的问题在应用软件层面比较好的解决方法还是容器,即把所有依赖打包在一起部署,每次更新就更新整个容器的镜像。同样的思路用到操作系统上,CoreOS每次更新都是一次整体升级,下载完整的系统镜像,然后做MD5校验,最后重启一下系统,把内核与外围依赖整个儿换掉。这样带来的额外好处是,每次升级必然是全部成功或者全部失败,不会存在升级部分成功的尴尬情况。

要想免安装软件那样直接重启换系统会遇到什么问题呢?两个方面,其一是,应用软件是由操作系统托管和启动的,可以通过系统来替换他的文件。那么操作系统自己呢,是由引导区的几行启动代码带动的,想在这么一亩三分地上提取镜像、替换系统、还想搞快点别太花时间,额,那真是螺蛳壳里做道场——排不出场面(还记得Window或者Mac电脑每次升级系统时候的等待界面么)。其二是,系统升级出问题是要能回滚的啊,不然怎么在生产环境用?即便不考虑启动时替换文件所需要的时间,万一更新过后启动不起来,原来的系统又已经被覆盖了,我天,这简直是给自己埋了一个地雷。由此可见,想要实现快速安全的升级,在重启后安装更新的做法从启动时间和回滚难度的两个方面看都不是最佳的办法。

Linux:CoreOS那些事之系统升级
Linux:CoreOS那些事之系统升级

为此,CoreOS又有一招绝活。进过CoreOS的主页的读者应该都见过上面这个A/B双系统分区的设计图。正如图中所示,CoreOS安装时就会在硬盘上划出两块独立的系统分区(空间大致为每个1GB),并且每次只将其中一个在作为系统内核使用,而后台下载好的新系统镜像会在系统运行期间就部署到备用的那个分区上。重启的时候只需要设计个逻辑切换两个分区的主次分工即可,不到分分钟就完成了升级的过程,要是真出现启动失败的情况,CoreOS会自动检测到并切换回原来的能正常工作的分区。用事先部署好的分区直接替换启动的方法避免重启后临时安装更新,这种思路的转换,确实有点神来之笔的意思。

说个题外话。之前有一次我和其他的CoreOS爱好者在Meetup活动时聊到对于双系统分区的看法,当时大家得出较一致的结论是:既然还是必须重启,用不用两个分区用户都没有实际获益,相比之下,“平滑升级才是卖点,双分区只是噱头”。我在《CoreOS实践指南》系列里也曾表达过类似的观点。一直到后来自己仔细反思了这种设计的巧妙,才发觉原先想法的片面性,实在贻笑大方。

这些方法说起来蛮轻松,若要真的实施出来,就不是拍拍脑袋那么容易了。纵观Linux开源系统百家争鸣,真正实现了这样后台更新设计的系统也仅CoreOS一枝独秀。

升级参数配置

理解了CoreOS的自升级方式,继续来说说与升级相关的配置。CoreOS系统升级有关的选项通常会在首次启动服务器时通过 cloud-init 的 coreos.update 项指定,系统启动后也可以在/etc/coreos/update.conf 文件里修改。可配置的属性包括三个:升级通道升级策略升级服务器。这三个属性在DockerOne的回答中都已经提到,下面将在此基础上再略作深化。

初始化升级配置

这是最常用的配置升级参数的方式,系统首次启动时cloud-init将完成大多数节点和集群相关的初始化任务。与CoreOS升级有关的部分是coreos.update下面的三个键,其内容举例如下:

coreos:
  update:
    reboot-strategy: best-effort
    group: alpha
    server: https://example.update.core-os.net

其中只有group一项是必须的,它指定了系统的升级通道。升级策略 reboot-strategy的默认值是best-effort,而升级服务器server的默认值是CoreOS的官方升级服务器。

修改升级配置

对于已经启动的集群,可以在/etc/coreos/update.conf配置文件中对升级参数进行修改,其内容格式简单明了。举例如下:

GROUP=alpha
REBOOT_STRATEGY=best-effort
SERVER=https://example.update.core-os.net

同样,大多数情况下用户只会看到GROUP这一个值,因为只有它是必须的。其余的两行可以没有,此时会使用默认值代替。

需要注意的是:

  • 每次修改完成以后需要执行sudo systemctl restart update-engine命令使配置生效
  • 修改一个节点的配置并不会影响集群其他节点的升级配置,需要逐一单独修改
  • 最好让集群中的节点使用相同的升级通道,方便管理,虽然混用通道一般不会直接导致问题
  • 优先选择用cloud-init。在初始化时就将系统参数设计好,减少额外修改的工作量

升级通道

升级通道间接的定义了CoreOS每次升级的目标版本号。这个思路大概是从Chrome浏览器借鉴来的,官方提供三个升级通道:Alpha(内测版)、Beta(公测版 )和 Stable(正式发行版)。举个例子来说,如果用户配置的是Alpha通道,那么他的每次更新就会升级到当前最新的内测系统版本上。内存版本类似于Chrome浏览器的所谓“开发版”,会第一时间获得新的功能更新,稳定性一般还是蛮可以的,但不适合做为产品服务器,主要面向的对象是喜爱新鲜的开发者和玩家。公测版稳定性略高,也会比较快的获得新功能的推送,适合作为项目开发测试环境把玩。正式发行版中的组件往往都不是最新版本的,但其稳定性最高,适合作为产品服务器使用。CoreOS目前采用一个整数数字来表示版本号,数字越大则相对发布时间越新。

各通道发布更新的频率依次为(见官方博客声明):

  • Alpha:每周星期四发布
  • Beta:每两周发布一次
  • Stable:每个月发布一次

每个通道当前的系统版本号及内置组件版本号可以在这个网页上查看到。

除了三个公开的通道,订阅了CoreUpdate服务的用户还可以定制升级自己的通道,但这个服务是付费的。此外,使用了企业版托管CoreOS系统的用户也可以免费使用此功能,企业版的起步费用是10个节点以内 $100/月,见这个链接。还有另一个土豪企业版服务起步价是25个节点以内 $2100/月,差别就是提供额外的人工技术支持服务,果然技术人才是最贵的东东。

升级策略

升级策略主要与自动升级后的重启更新方式有关。它的值可以是 best-effort(默认值)、 etcd-lock、 reboot 和off。其作用依次解释如下:

  • best-effort:如果Etcd运行正常则相当于 etcd-lock,否则相当于reboot
  • etcd-lock:自动升级后自动重启,使用LockSmith 服务调度重启过程
  • reboot:自动升级后立即自动重启系统
  • off:自动升级后等待用户手工重启

默认的方式是best-effort,通常它相当于etcd-lock策略,重启过程会使用到CoreOS的LockSmith服务调度升级过程。主要是防止过多的节点同时重启导致对外服务中断和Etcd的Leader节点选举无法进行。它的工作原理本身很简单,通过在Etcd的coreos.com/updateengine/rebootlock/semaphore 路径可用看到它的全部配置:

$ etcdctl get coreos.com/updateengine/rebootlock/semaphore
{
    "semaphore": 0,
    "max": 1,
    "holders":
    [
        "010a2e41e747415ba51212fa995801dd"
    ]
}

通过设定固定数量的锁,只有获得锁的主机才能够进行重启升级,否则就继续监听锁的变化。重启升级后的节点会释放它占用的锁,从而通知其他节点开始下一轮获取升级锁的竞争。

除了直接修改Etcd的内容,CoreOS还提供了 locksmithctl 命令更直观的查看LockSmith服务的状态或设置升级锁的数量。

查看升级锁的状态信息:

$ locksmithctl status
Available: 0     <-- 剩余的锁数量
Max: 1           <-- 锁的总数
MACHINE ID
010a2e41e747415ba51212fa995801dd  <-- 获得锁的节点

其中获得锁的节点就是已经已经下载部署好新版本系统,等待或即将重启(与升级策略有关)的节点的Machine ID。用locksmithctl set-max 命令可用修改升级锁数量(即允许同时重启升级的节点数量):

$ locksmithctl set-max 3
Old: 1
New: 3

此时若再次用locksmithctl status查看状态就会看到 Max 的数量变成3了。

此外,locksmithctl unlock 命令可以将升级锁从获得锁的节点上释放,这个命令很少会用到,除非一个节点获得锁后由于特殊的原因无法重启(例如磁盘错误等硬件故障),因而始终占用这个锁。这种情况下才会需要手工释放。

升级服务器

许多希望在内网中使用CoreOS的用户都比较关心能否在内网搭建自己的升级服务器?答案是肯定的。

比较可惜的是,CoreOS 升级服务器是属于CoreUpdate服务的一部分,也就是说,它是需要付费使用的。不过考虑到通常会在自己内网搭建服务器集群的大都是企业级用户,收费也还算公道。

从文档资料来看,CoreOS所用升级服务器协议与Google的ChromeOS升级服务器是完全兼容的,甚至可以相互替代。比较有趣的是,两者都开源了各自的操作系统,但都没有开源其升级服务器实现,这个中意思仿佛是如果让用户去自己架设升级服务器,谁来保证这些升级服务器的镜像是最新的呢,那么自动升级提供的系统安全性的意义又何在了呢。

顺带说一句,在CoreOS的SDK中有一个 start_devserver工具 用于测试部署用户自己构建的CoreOS镜像(系统是开源的嘛),因此如果用户直接下载官方镜像提供给这个工具,应当是可以自己构建内网升级服务器的。但是官方文档对这方面的介绍比较模糊,我暂且抛砖引玉了,待高人给出具体方案。

来源:http://www.infoq.com/cn/articles/coreos-system-upgrade