Skip to content Skip to main navigation Skip to footer

Linux

Linux:Linux有问必答:如何在Linux Mint Cinnamon启用桌面共享

问题:我试着在Linux Mint 17 Cinnamon桌面上通过Vino VNC服务器(vino-server)启用桌面共享。但是,我发现用来配置vino-server(如,共享选项,安全,通知开/关)的vino首选项工具已经不复存在了。同时,我也的Cinnamon桌面上也找不到共享菜单。我怎样才能在最新的Linux Mint 17 Cinnamon桌面上通过vino-server配置桌面共享?

最新的Linux Mint 17 Cinnamon桌面附带了预安装用于VNC桌面共享的vino-server,但是它报告说桌面共享菜单丢失了。

一个配置vino-server并启用桌面共享的可选方式,是使用dconf-editor的图形界面。

首先安装dconf-editor:

$ sudo apt-get install dconf-editor

启动dconf-editor。

$ dconf-editor

在dconf-editor的左边面板中导航到“org->gnome->desktop->remote-access”,然后你将会看到各种各样的桌面共享选项。

Linux:Linux有问必答:如何在Linux Mint Cinnamon启用桌面共享
Linux:Linux有问必答:如何在Linux Mint Cinnamon启用桌面共享

最重要的是,点击“enabled”来激活桌面远程访问。除此之外,你还可以自定义其它选项。

例如,你可以通过修改以下字段来启用VNC密码验证:

  • authentication-methods: 设置为 [‘vnc’]
  • vnc-password: 将你喜欢的密码修改为Base64编码的字符串。

在本例中,我们选择“password”为VNC密码,它的Base64编码字符串为“cGFzc3dvcmQ=”。

你也可以选择启用其它选项:

  • notify-on-connect: 当vino-server接收到连接请求时显示桌面通知。
  • prompt-enabled: 远程用户不允许通过VNC工具访问桌面,除非VNC请求被该桌面的拥有者许可。

排障

  1. 当启动vino-server时,我碰到了下面的错误。

    ** (vino-server:4280): WARNING **: The desktop sharing service is not enabled, so it should not be run.

要启用桌面共享服务,请使用上面讲过的dconf-editor。 也可以选择运行以下命令:

 # gsettings set org.gnome.Vino enabled true

via: http://ask.xmodulo.com/enable-configure-desktop-sharing-linux-mint-cinnamon-desktop.html

译者:GOLinux 校对:wxy

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

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

Linux:教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性

我们都知道,在基于红帽的Linux系统中,一个RPM包,需要把先将它依赖的其他包安装好才能正常的工作。对于终端用户,RPM的安装、更新、删除中存在的依赖关系已经被工具透明化了(如 yum或 DNF等)。但如果你是系统管理员或者RPM包的管理员,你需要谙熟RPM包的依赖关系,以便及时更新、删除适当的包来保证系统的正常运行。

在本教程中,我将教大家如何检查RPM包的依赖关系。无论这个包是否已经安装进操作系统中,我们都有一些办法来检查它们的依赖性。

方法一

使用RPM命令可以列出目标包所依赖的所有包,如下: $ rpm -qR

Linux:教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性
Linux:教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性

注意,这种方法只适用于已安装的包。如果你需要检查一个未安装包的依赖关系,你首先需要把这个包先下载到本地来(不需要安装)。

要下载一个 RPM 包而不安装,可以使用叫做’yumdownloader’的工具,下面我们先安装yumdownloader:

$ sudo yum install yum-utils

现在我们来检查一个未安装的RPM包的依赖关系(本例使用 tcpdump)。首先,我们使用yumdownloader把tcpdump的RPM包下载下来

$ yumdownloader --destdir=. tcpdump

然后再使用 “-qpR”参数显示该包的依赖关系。

# rpm -qpR tcpdump-4.4.0-2.fc19.i686.rpm

方法二

你可以使用repoquery工具来罗列包的依赖关系,它与包是否安装无关,这个工具包含在yum-utils中。

$ sudo yum install yum-utils

显示目标包所依赖的包:

$ repoquery --requires --resolve 

为让repoquery正常的工作,需要保持网络的畅通,应为repoquery需要在Yum库中查找信息。

方法三

第三个方法是使用rpmreaper工具。这个工具本来是用作清理系统中无用以及它们所依赖的包,rpmreaper有很直观的ncurses界面来展示已安装的包和它们依赖关系的树形图。

安装rpmrepater,在CentOS中,你需要先设置好EPEL库

$ sudo yum install rpmreaper

只需运行rpmreaper就可以看到RPM包的依赖关系:

$ rpmreaper
Linux:教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性
Linux:教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性

rpmrepater会向用户显示已安装包的列表,你可以使用上/下箭头来滚动屏幕。

你可以在指定包上使用”r”键来显示其依赖关系,循环在指定包上按下”r”键可以展示出余下的信息。

“L”标志的意思是说这个包是一片“孤叶”,意思说说没有任何包依赖它。

“o”标志是说这个包是整个依赖链的中间部分。

按下”b”键会显示其他依赖于该包的其他包。

方法四

还有一个办法是使用rpmdep工具,rpmdep是一个命令行工具,可以显示已安装包的完整包依赖关系图。该工具会分析RPM包的依赖性,从完整的排完序的拓扑图中摘取部分包的信息,形成列表展示给用户。该工具的输出结果可以直接使用到Dotty(可视化展示工具)中去。

在Fedora中安装rpmdep和dotty:

$ sudo yum install rpmorphan graphviz

在CentOs中安装: $ wget http://downloads.sourceforge.net/project/rpmorphan/rpmorphan/1.14/rpmorphan-1.14-1.noarch.rpm $ sudo rpm -ivh rpmorphan-1.14-1.noarch.rpm $ sudo yum install graphviz

生成包依赖的拓扑关系图(例如 gzip):

$ rpmdep.pl -dot gzip.dot gzip
$ dot -Tpng -o output.png gzip.dot
Linux:教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性
Linux:教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性

教程到这个地方,我们用到了几种办法来检查包的依赖关系。如果您想知道如何在居于Debian的系统中检查.deb的包依赖关系,请阅读另外一篇文档


 

via: http://xmodulo.com/2014/07/check-rpm-package-dependencies-fedora-centos-rhel.html

译者:nd0104 校对:wxy

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

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

Linux:编译Nginx支持Tcp_wrappers

Tcp wrappers : Transmission Control Protocol (TCP) Wrappers 为由 inetd 生成的服务提供了增强的安全性。Tcp wrappers是一种对使用 /etc/inetd.sec 的替换方法。TCP Wrappers 提供防止主机名和主机地址欺骗的保护。欺骗是一种伪装成有效用户或主机以获得对系统进行未经授权的访问的方法。

Linux:编译Nginx支持Tcp_wrappers
Linux:编译Nginx支持Tcp_wrappers

1、重新编译Nginx

[root@ipython nginx-1.6.1]# tar zxf ../ngx_tcpwrappers.tar.gz -C ./
[root@ipython nginx-1.6.1]# ./configure --prefix=/software/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-google_perftools_module --with-debug --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre=/root/pcre-8.35 --with-openssl=/root/openssl-1.0.1i --with-zlib=/root/zlib-1.2.8 --add-module=./ngx_tcpwrappers
[root@ipython nginx-1.6.1]# sed -i s'#CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror#CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g#' objs/Makefile
####不要make install 哦,编译好即可####
[root@ipython nginx-1.6.1]# make

 

2、完成升级,以及模块的使用,Nginx还是很奇特的哦~~

####备份可执行文件,复制新的文件####
[root@ipython nginx-1.6.1]# mv /software/nginx/sbin/nginx /software/nginx/conf/@nginx
[root@ipython nginx-1.6.1]# cp objs/nginx /software/nginx/sbin/
####测试新版本的Nginx####
[root@ipython nginx-1.6.1]# /software/nginx/sbin/nginx -t
nginx: the configuration file /software/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /software/nginx/conf/nginx.conf test is successful
###此时没有加入Tcp_wrappers的配置 测试下访问###
[root@ipython openssl-1.0.1i]# curl -I http://www.ipython.me
HTTP/1.1 200 OK
Server: nginx/1.6.1
Date: Mon, 11 Aug 2014 23:08:08 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 11 Aug 2014 22:45:25 GMT
Connection: keep-alive
ETag: "53e94785-264"
Accept-Ranges: bytes
###平滑升级###
[root@ipython nginx-1.6.1]# make upgrade
##测试模块,拒绝1.1.1.30的Nginx请求##	##在http块里加入如下配置##
    tcpwrappers on;
    tcpwrappers_daemon nginx;
    tcpwrappers_thorough off;
##hosts.deny如下##
[root@ipython nginx-1.6.1]# awk '!/^#/' /etc/hosts.deny
nginx:1.1.1.30
##重新读取Nginx配置文件##
[root@ipython nginx-1.6.1]# /software/nginx/sbin/nginx -s reload
###此时访问 就是403了###
[root@itchenyi ~]# curl -I http://www.ipython.me
HTTP/1.1 403 Forbidden
Server: nginx/1.6.1
Date: Mon, 11 Aug 2014 23:12:47 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

 

3、Tcp_warppers 模块指令

###ngx_Tcp_wrappers 配置指令###
1、tcpwrappers
	语法	: tcpwrappers [on|off]
	默认值	: tcpwrappers off
	作用域	: http, server, location, limit_except
	描述	: 模块的开关,开启则使用TCP Wrappers 进行访问控制,关闭以避免浪费性能
2、tcpwrappers_daemon
	语法	: tcpwrappers_daemon name
	默认值	: tcpwrappers_daemon nginx
	作用域	: http, server, location, limit_except
	描述	: 该名字的定义用于在/etc/hosts.[allow|deny]识别
3、tcpwrappers_thorough
	语法	: tcpwrappers_thorough [on|off]
	默认值	: tcpwrappers_thorough off
	作用域	: http, server, location, limit_except
	描述	: 基于hosts.ctl以检查使用IP地址、用户名、反向DNS解析,模块的开发者也未提供详细的使用说明

 

来源:http://www.ipython.me/centos/rebuild-nginx-support-tcp_wrappers.html

Linux:Linux 内核测试与调试(2)

编译安装稳定版内核

如果你用 git 下载源码,就执行以下命令:

cd linux-stable
git checkout linux-3.x.y

如果是直接下载压缩文件,用以下命令进入源码目录:

cd linux-3.x.y

如果你想把内核安装到自己的系统上,最安全的方法是使用你安装好的发行版拥有的配置文件。你可以在 /boot 目录找到当前发行版的内核配置文件:

cp /boot/config-3.x.y-z-generic .config

运行下面的命令,可以在当前内核配置的基础上修改一些小地方,然后产生新的内核配置文件。比如说新的内核比你的 Ubuntu 发行版自带的内核多了些新功能,而你正好需要用到它们,这个时候你就要修改配置了。

make oldconfig

完成配置后,就可以编译了:

make all

完成编译后,安装这个新的内核:

sudo "make modules_install install"

上面的命令安装新内核,并把新内核作为启动项添加到 grub 文件(LCTT:就是你下次开机时会多出一个开机选项)。好了你可以重启电脑,然后选择新的内核启动系统。等等!先别冲动,在重启电脑之前,我们保存下编译内核产生的日志,用于比较和查找错误(如果有错误发生的话):

dmesg -t > dmesg_current
dmesg -t -k > dmesg_kernel
dmesg -t -l emerg > dmesg_current_emerg
dmesg -t -l alert > dmesg_current_alert
dmesg -t -l crit > dmesg_current_alert
dmesg -t -l err > dmesg_current_err
dmesg -t -l warn > dmesg_current_warn

正常的话,dmesg 不会输出 emerg, alert, crit 和 err 级别的信息。如果你不幸看到这些输出了,说明内核或者你的硬件环境有问题。

再介绍一些重启前的需要执行的操作。谁也不能保证新内核能够正常启动,所以请不要潇洒地把老内核删除,至少保留一个稳定可用的内核在系统上。修改一下 /etc/default/grub 文件:

使用 earlyprink=vga 作为内核启动选项,把系统早期启动的信息打印到显示屏上:

GRUB_CMDLINE_LINUX="earlyprink=vga"

将 GRUB_TIMEOUT 的值设置成10秒到15秒之间的值,保证在开机启动的时候你有足够的时间来选择启动哪个内核:

取消对 GRUB_TIMEOUT 的注释,并把它设置为10:GRUB_TIMEOUT=10

注释掉 GRUB_HIDDEN_TIMEOUT 和 GRUB_HIDDEN_TIMEOUT_QUIET

运行 update-grub 命令,更新 /boot 目录下的 grub 配置文件:

sudo update-grub

现在可以重启系统了。新内核起来后,比较新老内核的 dmesg 信息,看看新的内核有没有编译错误。如果新内核启动失败,你需要通过老内核启动系统,然后分析下为什么失败。

跟上节奏,永不落后(编译最新版内核)

Linux:Linux 内核测试与调试(2)
Linux:Linux 内核测试与调试(2)

如果你想开上内核快车道,追求与时俱进,那就去下载 mainline 状态的内核或 linux-next 状态的内核(LCTT:读者可进入 kernel.org 获取代码,linux 代码被分为4种状态:mainline, stable, longterm, linux-next)。安装测试 mainline 状态或 linux-next 状态的内核,你就可以在正式发布之前帮助内核找到并修复里面的 bug。

mainline 状态的内核源码:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

linux-next 状态的内核源码:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

编译安装这两种内核的步骤与编译安装稳定版内核一样。按之前讲过的步骤来就行了。

打补丁

Linux 内核的补丁是一个文本文件,包含新源码与老源码之间的差异。每个补丁只包含自己所依赖的源码的改动,除非它被特意包含进一系列补丁之中。打补丁方法如下:

patch -p1 < file.patch
git apply --index file.patch

两种方法都可以打补丁。但是,如果你要打的补丁包含一个新文件,git 命令不能识别这个新增的文件,也就是说这个新文件在 git 里面属于 untracked 文件(LCTT:玩 git 的人对这个会比较熟悉,就是文件处于未被跟踪的状态,你需要使用 git add 命令将文件放入暂存区)。git diff 命令不会将这个文件的增量显示出来,并且 git status 命令会显示这个文件处于 untracked 状态。

大多数情况下,有个没被跟踪的文件,对于编译安装内核来说没什么问题,但是 git 操作就会出现一些问题了: git reset --hard 命令不会删除这个新加的文件,并且接下来的 git pull 操作也会失败。你有多种选择来避免上面所说的状况:

选项1,不跟踪这个新文件:

如果打补丁后新添加了文件,在 git reset --hard 前使用 git clean 命令来删除没有被跟踪的文件。举个例子,git clean -dfx 命令会强制删除未被跟踪的目录和文件,忽略在 .gitigniore 文件内规定的文件。如果你不在乎哪些文件会被删除,你可以使用 -q 选项让 git clean 命令进入安静模式,不输出任何处理过程。

选项2,跟踪新文件:

你可以在使用 git apply --index file.patch 命令后让 git 跟踪打完补丁后新产生的文件(LCTT:使用 git add 命令),就是让 git 把文件放入 index 区域。做完这个后,git diff 命令会将新文件的增量打印出来,git status 也会显示者这是一个正常的新增文件。


via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,1

译者:bazz2 校对:wxy

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

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

Linux:CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示

Linux:CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
Linux:CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示

就像我们所知道的,“ifconfig”命令用于配置GNU/Linux系统的网络接口。它显示网络接口卡的详细信息,包括IP地址,MAC地址,以及网络接口卡状态之类。但是,该命令已经过时了,而且在最小化版本的RHEL 7以及它的克隆版本CentOS 7,Oracle Linux 7和Scientific Linux 7中也找不到该命令。

在CentOS最小化服务器版本中如何查找网卡IP和其它详细信息?

CentOS 7最小化系统,使用“ip addr”和“ip link”命令来查找网卡详情。要知道统计数据,可以使用“ip -s link”。

要查看网卡细节,输入以下命令:

ip addr

输出样例:

1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: venet0:  mtu 1500 qdisc noqueue state UNKNOWN
    link/void
    inet 127.0.0.1/32 scope host venet0
    inet 192.168.1.101/32 brd 192.168.1.101 scope global venet0:0

要查看网络接口统计数据,输入命令:

ip link

输出样例:

1: lo:  mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: venet0:  mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
    link/void

或者

ip -s link

输出样例:

1: lo:  mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast
    0          0        0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0
2: venet0:  mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
    link/void
    RX: bytes  packets  errors  dropped overrun mcast
    8515667    6667     0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    300403     4249     0       0       0       0

在CentOS 7最小化服务器版本中如何启用并使用“ifconfig”命令?

如果你不知道在哪里可以找到ifconfig命令,请按照以下简单的步骤来找到它。首先,让我们找出哪个包提供了ifconfig命令。要完成这项任务,输入以下命令:

yum provides ifconfig

输出样例:

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.aol.in
 * extras: centos.aol.in
 * updates: centos.aol.in
net-tools-2.0-0.17.20131004git.el7.x86_64 : Basic networking tools
Repo        : @base
Matched from:
Filename    : /usr/sbin/ifconfig

或者你也可以使用以下命令。

yum whatprovides ifconfig

这里,“provides”或者“whatprovides”开关用于找出某个包提供了某些功能或文件。

就像你在上面的输出中所看到的,net-tools包提供了ifconfig命令。因此,让我们安装net-tools包来使用ifconfig命令。

yum install net-tools

现在,你就可以像以往一样使用ifconfig命令了。

ifconfig -a

输出样例:

lo: flags=73  mtu 16436
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
venet0: flags=211  mtu 1500
        inet 127.0.0.1  netmask 255.255.255.255  broadcast 0.0.0.0  destination 127.0.0.1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 0  (UNSPEC)
        RX packets 7073  bytes 8549159 (8.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4611  bytes 359201 (350.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
venet0:0: flags=211  mtu 1500
        inet 192.168.1.101  netmask 255.255.255.255  broadcast 192.168.1.101  destination 192.168.1.101
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 0  (UNSPEC)

尽情享受吧!


via: http://www.unixmen.com/ifconfig-command-found-centos-7-minimal-installation-quick-tip-fix/

作者:Senthilkumar 译者:GOLinux 校对:Caroline

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

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

Linux:python实现运维堡垒机(跳板机)系统

相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了上述功能。

架构:

Linux:python实现运维堡垒机(跳板机)系统
Linux:python实现运维堡垒机(跳板机)系统

后端主要技术是LDAP,配置了LDAP集中认证服务器, 所有服务器的认证都是由ldap完成的,我的做法是每个用户一个密码,把密码加密放到了数据库中,当用户输入ip从跳板机登陆服务器的时候,跳板机系统取 出密码,并解密,通过pexpect模块将密码发送过去,来完成登录的。

登录界面和方法

用户登录跳板机,用的是秘钥认证,登录跳板机后会自动执行跳板机的系统

Linux:python实现运维堡垒机(跳板机)系统
Linux:python实现运维堡垒机(跳板机)系统

输入完整IP或者部分IP可以完成登录,如果输入的部分ip匹配的ip不是唯一,会有提示,没有权限的会提示没有权限

输入P/p可以查看自己拥有权限的服务器ip

输入E/E可以在几台服务器上执行同样的命令,IP直接以逗号分隔

Linux:python实现运维堡垒机(跳板机)系统
Linux:python实现运维堡垒机(跳板机)系统

日志记录

日志记录用的是pexpect自带的日志记录,记录的日志既保存了命令又保存了命令的输出,也不小心讲发送的密码记录(不满意),pexpect模块处理 有些难做,我的想法是将日志每天再处理一遍,将密码等去掉,日志保存在logs目录下面,文件名是 ip_日期_用户名 ps:用的chinaren登录的,提示窗口却是baidutest,这是由于我个人原因导致的。

 

访问控制和授权

访问控制和授权是由一套web来实现的

管理员界面

主页:

查看用户:

添加用户:

Linux:python实现运维堡垒机(跳板机)系统
Linux:python实现运维堡垒机(跳板机)系统

主机列表:

添加主机:

权限列表:

添加权限:

Linux:python实现运维堡垒机(跳板机)系统
Linux:python实现运维堡垒机(跳板机)系统

后面的pptp和openvpn添加是我根据需要添加的,可以去掉

用户登录界面:

Linux:python实现运维堡垒机(跳板机)系统
Linux:python实现运维堡垒机(跳板机)系统

更改登录密码:

修改key密码:

来源:http://www.tiejiang.org/1889.html

Linux:Linux 内核测试与调试(3)

基本测试

安装好内核后,试试能不能启动它。能启动的话,检查 dmesg 看看有没有隐藏的错误。试试下面的功能:

  • 网络(Wifi 或者网线)是否可用?
  • ssh 是否可用?
  • 使用 ssh 远程传输文件。
  • 使用 git clone 和 git pull 命令。
  • 用用网络浏览器。
  • 查看 email。
  • 使用 ftp, wget 等软件下载文件。
  • 播放音频视频文件。
  • 连上 USB 鼠标等设备。
Linux:Linux 内核测试与调试(3)
Linux:Linux 内核测试与调试(3)

检查内核日志

使用 dmesg 查看隐藏的问题,对于定位新代码带来的 bug 是一个好方法。一般来说,dmesg 不会输出新的 crit, alert, emerg 级别的错误信息,也不应该出现新的 err 级别的信息。你要注意的是那些 warn 级别的日志信息。请注意 warn 这个级别的信息并不是坏消息,新代码带来新的警告信息,不会给内核带去严重的影响。

  • dmesg -t -l emerg
  • dmesg -t -l crit
  • dmesg -t -l alert
  • dmesg -t -l err
  • dmesg -t -l warn
  • dmesg -t -k
  • dmesg -t

下面的脚本运行了上面的命令,并且将输出保存起来,以便与老的内核的 dmesg 输出作比较(LCTT:老内核的 dmesg 输出在本系列的第二篇文章中有介绍)。然后运行 diff 命令,查看新老内核 dmesg 日志之间的不同。这个脚本需要输入老内核版本号,如果不输入参数,它只会生成新内核的 dmesg 日志文件后直接退出,不再作比较(LCTT:话是这么说没错,但点开脚本一看,没输参数的话,这货会直接退出,连新内核的 dmesg 日志也不会保存的)。如果 dmesg 日志有新的警告信息,表示新发布的内核有漏网之“虫”,这些 bug 逃过了自测和系统测试。你要看看,那些警告信息后面有没有栈跟踪信息?也许这里有很多问题需要你进一步调查分析。

压力测试

执行压力测试的一个好办法是同时跑三四个内核编译任务。下载各种版本的内核,同时编译它们,并记录时间。比较新内核跑压力测试和老内核跑压力测试所花的时间,然后可以定位新内核的性能。如果新内核跑压力测试的时间比老内核的更长,说明新内核的部分模块性能退步了。性能问题很难调试出来。第一步是找出哪里导致的性能退步。同时跑多个内核编译任务对检测内核整体性能来说是个好方法,但是这种方法涵盖了多个内核模块,比如内存管理、文件系统、DMA、驱动等(LCTT:也就是说,这种压力测试没办法定位到是哪个模块造成了性能的下降)。

time make all

内核测试工具

我们可以在 Linux 内核本身找到多种测试方法。下面介绍一个很好用的功能测试工具集: ktest 套件

ktest 是一个自动测试套件,它可以提供编译安装启动内核一条龙测试服务,也可以跑交叉编译测试,前提是你的系统有安装交叉编译所需要的软件。ktest 依赖于 flex 和 bison。详细信息请参考放在 tools/testing/ktest 目录下的文档,你可以自学成材。另外还有一些参考资料教你怎么使用 ktest:

tools/testing/selftests 套件

我们来玩玩自测吧。内核源码的多个子系统都有自己的自测工具,到目前为止,断点、cpu热插拔、efivarfs、IPC、KCMP、内存热插拔、mqueue、网络、powerpc、ptrace、rcutorture、定时器和虚拟机子系统都有自测工具。另外,用户态内存的自测工具可以利用 testusercopy 模块来测试用户态内存到内核态的拷贝过程。下面的命令演示了如何使用这些测试工具:

编译测试:

make -C tools/testing/selftests

测试全部:(有些测试需要 root 权限,你需要以 root 用户登入系统然后运行命令)

make -C tools/testing/selftests run_tests

只测试单个子系统:

make -C tools/testing/selftests TARGETS=vm run_tests

tools/testing/fault-injection 套件

在 tools/testing 目录下的另一个测试套件是 fault-injection。failcmd.sh 脚本用于检测 slab 和内存页分配器的错误。这些工具可以测试内核能否很好地从错误状态中恢复回来。这些测试需要用到 root 权限。下面简单介绍了一些当前能提供的错误检测方法。随着错误检测方法的增加,这份名单也会不断增长。最新的名单请参考 Documentation/fault-injection/fault-injection.txt 文档。

failslab (默认选项)

产生 slab 分配错误。作用于 kmalloc(), kmemcachealloc() 等函数(LCTT:产生的结果是调用这些函数就会返回失败,可以模拟程序分不到内存时是否还能稳定运行下去)。

fail_page_alloc

产生内存页分配的错误。作用于 allocpages(), getfree_pages() 等函数(LCTT:同上,调用这些函数,返回错误)。

fail_make_request

对满足条件(可以设置 /sys/block//make-it-fail 或 /sys/block///make-it-fail 文件)的磁盘产生 IO 错误,作用于 generic_make_request() 函数(LCTT:所有针对这块磁盘的读或写请求都会出错)。

fail_mmc_request

对满足条件(可以设置 /sys/kernel/debug/mmc0/fail_mmc_request 这个 debugfs 属性)的磁盘产生 MMC 数据错误。

你可以自己配置 fault-injection 套件的功能。fault-inject-debugfs 内核模块在系统运行时会在 debugfs 文件系统下面提供一些属性文件。你可以指定出错的概率,指定两个错误之间的时间间隔,当然本套件还能提供更多其他功能,具体请查看 Documentation/fault-injection/fault-injection.txt。 Boot 选项可以让你的系统在 debugfs 文件系统起来之前就可以产生错误,下面列出几个 boot 选项:

  • failslab=
  • fail_page_alloc=
  • fail_make_request=
  • mmc_core.fail_request=[interval],[probability],[space],[times]

fault-injection 套件提供接口,以便增加新的功能。下面简单介绍下增加新功能的步骤,详细信息请参考上面提到过的文档:

使用 DECLARE_FAULT_INJECTION(name) 定义默认属性;

详细信息可查看 fault-inject.h 中定义的 struct fault_attr 结构体。

配置 fault 属性,新建一个 boot 选项;

这步可以使用 setup_fault_attr(attr, str) 函数完成,为了能在系统启动的早期产生错误,添加一个 boot 选项这一步是必须要有的。

添加 debugfs 属性;

使用 fault_create_debugfs_attr(name, parent, attr) 函数,为新功能添加新的 debugfs 属性。

为模块设置参数;

为模块添加一些参数,对于配置错误属性来说是一个好主意,特别是当新功能的应用范围受限于单个内核模块的时候(LCTT:不同内核,你的新功能可能需要不同的测试参数,通过设置参数,你的功能可以不必为了迎合不同内核而每次都重新编译一遍)。

添加一个钩子函数到错误测试的代码中。

should_fail(attr, size) —— 当这个钩子函数返回 true 时,用户的代码就应该产生一个错误。

应用程序使用这个 fault-injection 套件可以指定某个具体的内核模块产生 slab 和内存页分配的错误,这样就可以缩小性能测试的范围。


via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2

译者:bazz2 校对:wxy

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

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

Linux:10个调整让Ubuntu宾至如归

不久前我提供给大家12个调整Ubuntu的小建议。 然而,已经是一段时间以前的事情了,现在我们又提出了另外10个建议,能够使你的Ubuntu宾至如归。

这10个建议执行起来十分简单方便,那就让我们开始吧!

1. 安装 TLP

我们不久前涉及到了TLP, 这是一款优化电源设置的软件,可以让你享受更长的电池寿命。之前我们深入的探讨过TLP, 并且我们也在列表中提到这软件真不错。要安装它,在终端运行以下命令:

sudo add-apt-repository -y ppa:linrunner/tlp && sudo apt-get update && sudo apt-get install -y tlp tlp-rdw tp-smapi-dkms acpi-call-tools && sudo tlp start

上面的命令将添加必要的仓库,更新包的列表以便它能包含被新仓库提供的包,安装TLP并且开启这个服务。

2. 系统负载指示器

给你的Ubuntu桌面添加一个系统负载指示器能让你快速了解到你的系统资源占用率。 如果你不想在桌面上添加这个技术图表,那么可以不要添加, 但是对于那些对它感兴趣的人来说,这个扩展真是很好。 你可以运行这个命令去安装它:

sudo apt-get install indicator-multiload

然后在Dash里面找到它并且打开。

3. 天气指示器

Ubuntu过去提供内置的天气指示器,但是自从它切换到Gnome 3以后,就不再默认提供了。你需要安装一个独立的指示器来代替。 你可以通过以下命令安装它:

sudo add-apt-repository -y ppa:atareao/atareao && sudo apt-get update && sudo apt-get install -y my-weather-indicator

这将添加另外一个仓库,更新包的列表,并且安装这个指示器。然后在Dash里面找到并开启它。

4. 安装 Dropbox 或其他云存储解决方案

我在我所有的Linux系统里面都安装过的一个软件,那就是Dropbox。没有它,真的就找不到家的感觉,主要是因为我所有经常使用的文件都储存在Dropbox中。安装Dropbox非常直截了当,但是要花点时间执行一个简单的命令。 在开始之前,为了你能在系统托盘里看到Dropbox的图标,你需要运行这个命令:

sudo apt-get install libappindicator1

然后你需要去Dropbox的下载页面,接着安装你已下载的.deb文件。现在你的Dropbox应该已经运行了。

如果你有点讨厌Dropbox, 你也可以尝试使用Copy 或者OneDrive。两者提供更多免费存储空间,这是考虑使用它们的很大一个原因。比起OneDrive我更推荐使用Copy,因为Copy能工作在所有的Linux发行版上。

5. 安装Pidgin和Skype

和朋友们保持联系特别好,并且如果你使用即时通讯,那么你很幸运。 Pidgin和Skype在Linux都十分出色,它们都能连接所有主要网络。安装Pidgin就像运行这个命令一样简单:

sudo apt-get install pidgin

安装Skype也很简单 — 你仅仅需要去Skype的下载页面并且下载你Ubuntu12.04对应架构的.deb文件就可以了。

6. 移除键盘指示器

在桌面上显示键盘指示器可能让一些人很苦恼。对于讲英语的人来说,它仅仅显示一个“EN”,这可能是恼人的,因为很多人不需要改变键盘布局或者被提醒他们正在使用英语。要移除这个指示器,选择系统设置,然后文本输入,接着去掉“在菜单栏显示当前输入源”的勾。 (译注:国人可能并不适合这个建议。)

7. 回归传统菜单

在Ubuntu切换到Unity之前,它使用Gnome 2 作为默认的桌面环境。 这包含一个简单的菜单去访问已安装的应用,菜单包含的很多分类,比如: 游戏,办公, 互联网,等等。 你可以用另外一个简单的包找回这个“传统菜单” 。要安装它,运行这个命令:

sudo add-apt-repository -y ppa:diesch/testing && sudo apt-get update && sudo apt-get install -y classicmenu-indicator

8. 安装Flash和Java

在之前的文章中我提到了安装解码器和Silverlight,我应该也提到了Flash和Java是它们所需要的主要插件,虽然有时可能它们可能被遗忘。要安装它们只需运行这个命令:

sudo add-apt-repository -y ppa:webupd8team/java && sudo apt-get update && sudo apt-get install oracle-java7-installer flashplugin-installer

安装Java需要新增仓库,因为Ubuntu不再包含它的专利版本(大多数人为了最好的性能推荐使用这个版本),而是使用开源的OpenJDK。

9. 安装VLC

默认的媒体播放器Totem十分优秀但是它依赖很多独立安装的解码器才能很好的工作。我个人推荐你安装VLC媒体播放器, 因为它包含所有解码器并且实际上它支持世界上每一种媒体格式。要安装它,仅仅需要运行如下命令:

sudo apt-get install vlc

10. 安装PuTTY (或者不)

最近,如果你出于SSH的需要而使用PuTTY,你有两个选择:为Linux安装PuTTY,或者直接使用终端。如果你想使用终端安装PuTTY,需要用到这个命令:

sudo apt-get install putty

然而,并不需要直接安装它,因为你可以使用这个命令来连接任何远程主机。

ssh username@this.domain.here

用你想要连接的用户名来替换掉“username”,然后用主机的直接域名或者IP地址替换掉“this.domain.here” 都可以。

你推荐如何调整?

补充了这10个调整,你应该感觉你的Ubuntu真的有家的感觉,这很容易建立起或击溃你的Linux体验。有许多不同的方式去定制你自己的体验去让它更适合你的需要;你只需自己寻找来发现你想要的东西。

您有什么其它的调整和建议想和读者分享?在评论中告诉我们吧!

图片致谢: Home doormat Via Shutterstock


via: http://www.makeuseof.com/tag/10-tweaks-make-ubuntu-feel-like-home/

作者:Danny Stieben 译者:guodongxiaren 校对:Caroline

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

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

Linux:命令行星期二——第八部分

唷,唷,极客们!我们回来了,来完成最后一章的CLT。今天,我们将讨论一下任务控制。在这个里头,我们也将学习怎样来控制运行在我们计算机上的进程!

一个例子

正如我们所学的,我们可以直接在CLI中输入程序名称来运行该程序。例如,dolphin。如果我们输入:

dolphin

……dolphin,这个文件管理器,就打开了。如果在这个进程打开时你查看终端,你会发现不能访问命令提示符了,而且你也不能在同一个窗口中写一个新命令进去了。如果你终止dolphin,提示符又会出现了,而你又能输入一个新命令到shell中去了。那么,我们怎么能在CLI运行一个程序时,同时又能获得提示符以便进一步发命令。

dolphin &

……现在你让dolphin文件管理器在后台运行了,终端就可以空出来输入你需要的另外一个命令了。

现在,假设你忘了在dolphin后面输入‘&’字符,你只需要输入‘ctrl+z’,它会停止你的进程并把它放到空闲列表中去。要继续停止的进程,输入:

bg

……它会从后台重启进程。

jobs, ps

由于我们在后台运行着进程,你可以使用jobs或者使用ps来列出它们。试试吧,只要输入jobs或者输入ps就行了。下面是我得到的结果:

nenad@linux-zr04:~> ps
PID TTY          TIME CMD
8356 pts/1    00:00:00 bash
8401 pts/1    00:00:00 dolphin
8406 pts/1    00:00:00 kbuildsycoca4
8456 pts/1    00:00:00 ps

杀死进程

如果有个进程无响应了,怎么来处理掉它呢?可以使用kill命令。让我们在先前提到的dolphin进程上试试。首先,我们必须使用ps来鉴别该进程的PID。在我上述情况中,dolphin的PID是8401。那么让我们来杀死它,我只要输入:

kill 8401

……那么,它就把dolphin给杀死了。

kill的更多细节

kill的存在,不仅仅是为了终止进程,它最初是设计用来发送信号给进程。当然,有许多kill信号可以使用,根据你使用的应用程序不同而不同。请看下面的表:

Linux:命令行星期二——第八部分
Linux:命令行星期二——第八部分

务必试试这些信号。

结尾

我们以本节课来结束我们的CLT系列和周二必达,我希望其他像我这样的新手们能设法在他们的思想中摆脱控制台的神秘而学习掌握一些基本技能。现在对你们而言,所有剩下来要做的事,就是尽情摆弄它吧(只是别把“/”目录搞得太乱七八糟,因而你也不会诋毁什么东西了 :D)。

我们将在不久的将来看到其它更多的东西,因为有更多的系列文章来自这些文章的出处。别走开,同时……

……尽情享受!


via: https://news.opensuse.org/2014/08/12/command-line-tuesdays-part-eight/

作者:Nenad Latinović 译者:GOLinux 校对:wxy

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

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

Linux:Linux有问必答:如何在Apache网站服务器上关闭服务器签名

问题:每当Apache2网站服务器返回错误页时(如,404 页面无法找到,403 禁止访问页面),它会在页面底部显示网站服务器签名(如,Apache版本号和操作系统信息)。同时,当Apache2网站服务器为PHP页面服务时,它也会显示PHP的版本信息。我如何在Apache2网站服务器上关闭这些网站服务器签名呢?

透露网站服务器带有服务器/PHP版本信息的签名会带来安全隐患,因为你基本上将你系统上的已知漏洞告诉给了攻击者。因此,作为服务器加固的一个部分,强烈推荐你禁用所有网站服务器签名。

禁用Apache网站服务器签名

禁用Apache网站服务器签名可以通过编辑Apache配置文件来实现。

在Debian,Ubunt或者Linux Mint上:

$ sudo vi /etc/apache2/apache2.conf

在CentOS,Fedora,RHEL或者Arch Linux上:

$ sudo vi /etc/httpd/conf/httpd.conf

将下面两行添加到Apache配置文件底部。

ServerSignature Off

ServerTokens Prod

然后重启网站服务器以使修改生效:

$ sudo service apache2 restart (Debian, Ubuntu or Linux Mint)
$ sudo service httpd restart (CentOS/RHEL 6)
$ sudo systemctl restart httpd.service (Fedora, CentOS/RHEL 7, Arch Linux)

第一行‘ServerSignature Off’使得Apache2网站服务器在所有错误页面上隐藏Apache版本信息。

然而,若没有第二行的‘ServerTokens Prod’,Apache服务器将仍然在HTTP回应头部包含详细的服务器标记,这会泄漏Apache的版本号。

第二行‘ServerTokens Prod’所要做的是在HTTP响应头中将服务器标记压缩到最小。

因此,同时放置两行时,Apache将不会在页面中或者HTTP响应头中泄漏版本信息。

隐藏PHP版本

另外一个潜在的安全威胁是HTTP响应头中的PHP版本信息泄漏。默认情况下,Apache网站服务器通过HTTP响应头中的“X-Powered-By”字段包含有PHP版本信息。如果你想要在HTTP头部中隐藏PHP版本,请使用文本编辑器打开php.ini文件,找到“expose_php = On”这一行,将它改为“expose_php = Off”即可。

在Debian,Ubunt或者Linux Mint上:

$ sudo vi /etc/php5/apache2/php.ini

在CentOS,Fedora,RHEL或者Arch Linux上:

$ sudo vi /etc/php.ini

expose_php = Off

最后,重启Apache2网站服务器来重新加载已更新的PHP配置文件。

现在,你不会再看到带有“X-Powered-By”字段的HTTP响应头了。


via: http://ask.xmodulo.com/turn-off-server-signature-apache-web-server.html

译者:GOLinux 校对:Caroline

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

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

Linux:如何安装树莓派摄像头模块

树莓派摄像头模块(Pi Cam)发售于2013年5月。其第一个发布版本配备了500万像素的传感器,通过排线链接树莓派上的CSI接口。而Pi Cam的第二个发布版本——也被叫做Pi NoIR中,配备了相同的传感器,但没有红外线过滤装置。因此第二版的摄像头模块就像安全监控摄像机一样,可以观测到近红外线的波长(700 – 1000 nm),不过当然同时也就牺牲了一定的显色性。

本文将会展示如何在树莓派上安装摄像头模块。 我们将使用第一版摄像头模块来演示。在安装完摄像头模块之后,你将会使用三个应用程序来访问这个模块:raspistill, raspiyuv 和raspivid。其中前两个应用用来捕捉图像,第三个应用来捕捉视频。raspistill 工具生成标准的图片文件,例如 .jpg 图像,而 raspiyuv 可以通过摄像头生成未处理的 raw 图像文件。

安装树莓派摄像头模块

按照以下步骤来将树莓派摄像头模块连接搭配树莓派:

  1. 找到 CSI 接口(CSI接口在以太网接口旁边),掀起深色胶带。

  2. 拉起 CSI 接口挡板。

  3. 拿起你的摄像头模块,将贴在镜头上的塑料保护膜撕掉。确保黄色部分的PCB(有字的一面)是安装完美的(可以轻轻按一下黄色的部分来保证安装完美)。

  4. 将排线插入CSI接口。记住,有蓝色胶带的一面应该面向以太网接口方向。同样,这时也确认一下排线安装好了之后,将挡板拉下。

Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块

好了,现在你的 Pi Cam 已经准备就绪,可以拍摄照片或视频了。

在树莓派上启用摄像头模块

在安装完摄像头模块之后,首先要确认你已经升级了树莓派系统并应用了最新的固件。可以输入以下命令来操作:

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

运行树莓派配置工具来激活摄像头模块:

$ sudo raspi-config

移动光标至菜单中的 “Enable Camera(启用摄像头)”,将其设为Enable(启用状态)。完成之后重启树莓派。

Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块

安装完摄像头模块后的完成照:

Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块

通过摄像头模块拍照

在重启完树莓派后,我们就可以使用Pi Cam了。要用它来拍摄照片的话,可以从命令行运行raspistill:

$ raspistill -o keychain.jpg -t 2000

这句命令将在 2000ms 后拍摄一张照片,然后保存为 keychain.jpg。下面就是一张由 Pi Cam 拍摄的我的小熊公仔钥匙链。

Linux:如何安装树莓派摄像头模块
Linux:如何安装树莓派摄像头模块

raspiyuv 工具用法差不多,只不过拍摄得到的是一张未处理过的raw图像。

通过摄像头模块拍视频

想要用摄像头模块拍一段视频的话,可以从命令行运行 raspivid 工具。下面这句命令会按照默认配置(长度5秒,分辨率1920×1080,比特率 17Mbps)拍摄一段视频。

$ raspivid -o mykeychain.h264

如果你想改变拍摄时长,只要通过 “-t” 选项来设置你想要的长度就行了(单位是毫秒)。

$ raspivid -o mykeychain.h264 -t 10000

使用 “-w” 和 “-h” 选项将分辨率降为 1280×720…

$ raspivid -o mykeychain.h264 -t 10000 -w 1280 -h 720

raspivid 的输出是一段未压缩的 H.264 视频流,而且这段视频不含声音。为了能被通常的视频播放器所播放,这个 raw 的 H.264 视频还需要转换。可以使用 gpac 包中所带有的 MP4Box 应用。

在 Raspbian 上安装 gpac,输入命令:

$ sudo apt-get install -y gpac

然后将这段 raw 的 H.264 格式的视频流转换为每秒30帧的 .mp4 格式视频:

$ MP4Box -fps 30 -add keychain.h264 keychain.mp4

视频长度为10秒,使用默认分辨率以及比特率。下面是一段通过 Pi Camera 拍摄的一段实例视频。

注:youtube视频地址

http://www.youtube.com/embed/3uyR2AVVwAU?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent

如果想要获取 raspistill, raspiyuv 和 raspivid 的完整命令行选项,不加任何选项直接运行以上命令即可。


Kristophorus Hadiono

Kristophorus Hadiono是一名 Linux 爱好者,并且是印度尼西亚一所民办高等学府的教师。他在日常生活中使用 Linux,也在给学生们教学的时候使用。他现在仍靠着政府的奖学金,在泰国曼谷的一所民办大学继续着学业。


via: http://xmodulo.com/2014/07/install-raspberry-pi-camera-board.html

译者:ThomazL 校对:reinoir

本文由 lctt 原创翻译,linux中国 荣誉推出

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

Linux:怎样设置Samba文件服务器以使用Windows客户端

根据Samba项目网站所述,Samba是一个开源/自由软件套件,提供了到SMB/CIFS客户端的无缝文件和打印服务。不同于其它SMB/CIFS网络协议部署(如HP-UX的LM服务器,OS/2的LAN服务器,或者VisionFS),Samba(及其源代码)是可以自由获取的(终端用户无需付费),允许在Linux/Unixt服务器和Windows/Unix/Linux客户端之间互操作。

Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

出于这些理由,Samba在不同操作系统(除了Linux)共存的网络中首选的文件服务器解决方案——最常见的结构是多个微软Windows客户端访问安装有Samba的Linux服务器,该情形也是本文将要解决的问题。

请注意,另外一方面,如果我们的网络仅仅是由基于Unix的客户端(如Linux,AIX,或者Solaris,等等)组成,我们可以考虑使用NFS(尽管在此种情况下Samba仍然是可选方案),它可以提供更快的速度。

在Debian和CentOS中安装Samba

在我们开始安装之前,我们可以使用操作系统中的包管理系统查询Samba的信息:

在Debian上:

# aptitude show samba

在CentOS上:

# yum info samba

在下面的屏幕截图中,我们可以看到‘aptitude show samba’的输出(‘yum info samba’会产生类似的结果):

Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

现在让我们来安装Samba吧(下面的截图来自Debian 7[Wheezy]服务器上的安装):

在Debian上:

# aptitude install samba

在CentOS上:

# yum install samba

添加用户到Samba

对于4.x之前的版本,需要建立一个本地Unix帐号以便将其添加到Samba:

# adduser 
Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

接下来,我们需要添加用户到Samba,使用带有‘-a’选项的smbpasswd命令来完成,该命令指出后面的用户名将被添加到本地smbpasswd文件中。我们将被提示输入密码(该密码无需和本地Unix帐号的密码相同):

# smbpassword -a 

最后,我们将赋予用户xmodulo到我们系统上某个目录的访问权限,该目录将被用于作为此用户的Samba共享(如有需要,也可以共享给其它用户)。要完成该工作,请使用文本编辑器(如Vim)打开/etc/samba/smb.conf文件,导航到文件末,然后创建一个带有描述名称的区块(使用方括号将其括起来),如[xmodulo]:

# SAMBA SHARE
[xmodulo]
path = /home/xmodulo
available = yes
valid users = xmodulo
read only = no
browseable = yes
public = yes
writeable = yes

我们现在必须重启Samba—以防万一—使用testparm命令来检查smb.conf文件的语法错误:

# service samba restart
# testparm

如果有错误,在testparm结束后会报告。

在Windows 7计算机上将Samba共享映射为一个网络驱动器

在计算机上右击,然后选择“映射网络驱动器”:

Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

输入安装了Samba的机器的IP地址,后跟共享名(就是smb.conf文件中方括号括起来的那个名称),然后确保选中了“使用不同的凭据连接”:

Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

输入先前用‘smbpasswd -a’设置的用户名和密码:

Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

进入计算机,然后检查网络驱动器是否被正确添加:

作为测试,让我们从Samba的手册页创建一个pdf文件,然后保存到/home/xmodulo目录:

接下来,我们可以验证该文件是否可以从Windows读取:

然后检查我们是否能够用默认的pdf阅读器打开它:

Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

最后,让我们看看我们是否能在Windows中刚刚映射的驱动器上保存文件。我们将打开change.log文件,该文件列出了Notepad++的功能:

然后试着将它作为普通文本文件(.txt扩展名)保存到Z:;然后让我们看看该文件是否能在Linux中看到:

启用磁盘配额

作为第一步,我们需要验证当前内核是否已经编译为支持配额:

# cat /boot/config-$(uname -r) | grep

每个文件系统最多有5种类型,能够强制使用的配额限制:用户软限制,用户硬限制,组软限制,组硬限制,以及宽限期限。

我们现在将为/home文件系统启用磁盘配额,在/etc/fstab文件对应的/home文件系统行现存的默认选项后添加usrquota和grpquto挂载选项,然后重新挂载文件系统以令修改生效:

接下来,我们需要在/home目录创建两个文件以用于作为用户和组配额的数据库文件:aquota.useraquota.group。然后,我们将生成启用配额后每个文件系统的当前磁盘使用表:

# quotacheck -cug /home
# quotacheck -avugm

尽管已经为/home文件系统启用磁盘配额,我们还没有给任何用户或组设置权限。检查现有用户/组的配额信息:

# quota -u 
# quota -g 

在这最后几步中,使用quotatool命令来为每个用户和/或组来分配磁盘配额(注意,该任务也可以使用edquota来完成,但是quotatool更为直接,更不易犯错)。

要为用户xmodulo设置软限制为4MB,硬限制为5MB,xmodulo组为10MB/15MB:

# quotatool -u xmodulo -bq 4M -l '5 Mb' /home
# quotatool -g xmodulo -bq 10M -l '15 Mb' /home
Linux:怎样设置Samba文件服务器以使用Windows客户端
Linux:怎样设置Samba文件服务器以使用Windows客户端

我们可以在Windows 7中看到结果(4.00MB中有3.98MB空闲):


via: http://xmodulo.com/2014/08/samba-file-server-windows-clients.html

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

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

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

Linux:在 Ubuntu 14.04 和 Linux Mint 17 上安装 Atom 文本编辑器

Linux:在 Ubuntu 14.04 和 Linux Mint 17 上安装 Atom 文本编辑器
Linux:在 Ubuntu 14.04 和 Linux Mint 17 上安装 Atom 文本编辑器

AtomGithub上时髦的,功能丰富的开源文本编辑器。目前,它正处于测试阶段,但如果你对它很好奇,那我们就来看看如何在 Ubuntu 14.04 和 Linux Mint 17 上安装 Atom。

Linux:在 Ubuntu 14.04 和 Linux Mint 17 上安装 Atom 文本编辑器
Linux:在 Ubuntu 14.04 和 Linux Mint 17 上安装 Atom 文本编辑器

无论是在外观,还是在功能上,Atom 都有很多与Sublime Text editor相似之处。Sublime Text editor是一个功能强大,并深受程序员喜爱的跨平台文本编辑器,可惜它是闭源的。事实上,在Sublime Text的灵感下,Atom 并不是唯一即将到来的文本编辑器。Lime Text是 Sublime Text 的开源克隆,目前正处于开发中。

废话不多说,让我们来看看如何在 Ubuntu 14.04 和 Linux Mint 17 下安装 Atom 编辑器。

通过PPA源,在Ubuntu和Linux Mint下安装Atom

因为 Atom 正处于测试阶段,截止到我写这篇文章前,还没有 Linux 下的二进制文件。但是不用担心,你不需要亲自去编译这些代码(当然如果你乐意的话,你也可以这么做)。感谢Webupd8 team’s的努力,我们拥有了一个可以很容易将 Atom 安装在32位和64位系统上的PPA。

打开终端,然后使用下面的命令行:

sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom

就这么简单,你可以通过 Ubuntu 下的 Unity Dash 和 Linux Mint 里的应用程序菜单启动 Atom 编辑器。

从Ubuntu和Linux Mint卸载Atom

可能,你想要从系统中卸载 Atom 的原因有很多种。不稳定可能是主要原因之一。好吧,不管什么原因,我来说下怎么卸载Atom:

sudo apt-get remove atom
sudo add-apt-repository --remove ppa:webupd8team/atom

这些命令会移除 Atom 和 PPA 仓库,运行 auto remove 也是个好方法:

sudo apt-get autoremove

你有哪些使用 Atom 的体验? 

如果你尝试了Atom,请和我们分享你的体验。你觉的它会成为你最喜欢的文本编辑器吗?


via: http://itsfoss.com/install-atom-text-editor-ubuntu-1404-linux-mint-17/

作者:Abhishek 译者:su-kaiyao 校对:Caroline

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

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

Linux:释伴:Linux 上的 Shebang 符号(#!)

使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?

本文将给你简单介绍一下Shebang(”#!”)这个符号。

这个符号(#!)的名称,叫做”Shebang”或者”Sha-bang”。长期以来,shebang都没有正式的中文名称。Linux中国翻译组的 GOLinux 将其翻译为:释伴,即解释伴随行的简称,同时又是shebang的音译。

词源与历史

Shebang的名字来自于SHArp和bang,或haSH bang的缩写,指代Shebang中#!两个符号的典型Unix名称。 Unix术语中,井号通常称为sharphashmesh;而叹号则常常称为bang。也有看法认为,shebang名字中的sh来自于默认shell Bourne shell的名称,sh,因为常常使用shebang调用之。

在2010年版的Advanced bash scripting guide(revision 6.2)中,shebang被称为”sha-bang”,同时提到”也写作she-bang或sh-bang”,但该文件中没有提到”shebang”这一形式。

丹尼斯·里奇在被问及他会如何称呼这一特性时,他答道:

发信人:”Ritchie, Dennis M (Dennis)** CTR **”

收信人:<[redacted]@talisman.org>

日期:Thu, 19 Nov 2009 18:37:37 -0600

主题:RE: What do -you- call your #! line?

我不记得我们曾经给它取过一个适当的名字。导入这一特性已经是相当晚了–我觉得我是从关于伯克利Unix的UCB会议上的某人那里得到的这一灵感;我可能是首先实现它的人之一,但这个创意是来自于别人的。

至于它的名字:可能是类似于”hash-bang”的英国风描述性文字,但我没有在任何场合使用类似宠物的名字来描述它。

此致,

Dennis

用途

Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指明了执行这个脚本文件的解释程序。

1. 如果脚本文件中没有#!这一行,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)。

2. 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。

3. 如果#!指定的解释程序没有可执行权限,则会报错“bad interpreter: Permission denied”。如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。

4. 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动到$PATH中寻找解释器的。

5. 当然,如果你使用”bash test.sh”这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显式指定的bash。

 

来源:http://smilejay.com/2012/03/linux_shebang/

Linux:检查linux中硬盘损坏的扇区和区块

badblocks是linux及其类似的操作系统中,扫描检查硬盘和外部设备损坏扇区的命令工具。损坏的扇区或者损坏的区块是硬盘中因为永久损坏或者是操作系统不能读取的空间。

Linux:检查linux中硬盘损坏的扇区和区块
Linux:检查linux中硬盘损坏的扇区和区块

Badblocks命令可以探测硬盘中所有损坏的扇区或者区块并将结果保存在一个文本文档中,这样,我们就可以使用e2fsck命令来配置操作系统不在这些损坏的扇区中存储数据。

步骤:1 使用fdisk命令识别硬盘信息 

# sudo fdisk -l

步骤:2 扫描硬盘的损坏扇区或区块

# sudo badblocks -v /dev/sdb > /tmp/bad-blocks.txt

只需将“/dev/sdb”替换为自己机器的硬盘/分区。执行完成上述命令后,一个名为“bad-blocks”文本文档将会在/tmp下创建,它将包含所有的损坏区块。

例如:

步骤:3 提示 操作系统不要使用损坏区块存储

扫描完成后,如果损坏区块被发现了,然后通过e2fsck命令使用“bad-blocks.txt”,强迫操作系统不使用这些损坏的区块存储数据。

# sudo e2fsck -l /tmp/bad-blocks.txt  /dev/sdb

注意:在运行e2fsck命令前,请保证设备没有被挂载。

关于badblocks和e2fsck命令的更多帮助,请参考下列man页面

# man badblocks
# man e2fsck

via: http://www.linuxtechi.com/check-hard-drive-for-bad-sector-linux/

作者:Pradeep Kumar 译者:Vic___ 校对:Caroline

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

 

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

Linux:有关云架构建设和选型的思考

最近在负责公司内部私有云的建设,一直在思考怎么搞云计算,怎么才能够把云架构设计得好一些。本文尽量全面的列出了云架构建设和选型的考量因素。

我们主要从五个层面逐步评估云架构的建设和选型,分别是:

  1. 行业生态
  2. 企业需求
  3. 云计算的能力
  4. 潜在的挑战
  5. 如何建设

一、行业生态

计算机云经过多年的发展,由一开始的概念,慢慢发展成熟并能够推向市场,提供多种多样的服务,市场空间非常之大。

在云的发展过程中,亚马逊经过多年的深耕积累,发展成为了云行业的标杆企业,甚至可以说是建立了云解决方案的标准。之后,Google、IBM、思 科、Oracle、HP、Intel、华为等IT巨头先后参与进来,在软件和硬件方面提供专门的面向企业的解决方案,纷纷打着云计算、大数据、智能等概念 来吸引客户,拓展市场。

另外一方面,基于大数据、存储、云服务等,市场上也先后出现一些创新企业,如Dropbox、Rackspace,国内的七牛、青云、UnitedStack等。

当前的IT世界有一个常见的现象,就是只要某一个领域有一套成熟的商业软件,就同时也会有一套开源的解决方案,如Windows之于 Linux,Google的MapReduce、GFS、大表之于Hadoop等。在云领域也存在相应的开源解决方案,目前最为著名的有 Openstack和Cloudstack。开源行业的领导者RedHat此前

在企业操作系统的市场已经做的很好,RHEL的各个版本在企业级系统市场有相当高的市场份额。现在的RedHat特别重视云的发展,并将云操作系统作为未来10年的发展战略重点,在最近两年先后收购了Gluster以及Ceph等存储企业,以壮大自己在云领域的影响力。

随着云领域的发展,市场上也逐渐形成了面向企业提供硬件和软件产品的提供商、面向企业提供服务的提供商、面向市场初创企业提供基础服务的提供商、面向个人提供业务服务的提供商等一系列行业生态。

Linux:有关云架构建设和选型的思考
Linux:有关云架构建设和选型的思考

二、企业需求

需求是什么,也就是what people need这个问题。我们所说的people,即人或者公司实体,该对象的划分并不单纯,可粗浅的从三个角度来进行分类:

从企业角度看:

1)小型企业

小型企业的技术储备不多,人员缺乏,没有独立的IT部门,但是在构建自己的IT系统过程中需要购置各种产品和服务,包括服务器、网络、CDN等等,而要完成这样的工作,需要投入大量的人力和财力。通过购买云服务可以更加方便快捷,简单的完成系统的搭建。

2)中型企业

中型企业有一定的规模,需要在信息化、管理方面有所注重,一般内部都设立IT部门,但是和小型企业一样,IT部门大多数都是为了解决自身需求,很难能够有一个完整的解决方案。这样在服务器、网络、CDN、企业管理软件等等的需求还是比较大的。

3)大型企业

大型企业人数规模在万人以上,特别是高新企业,都有一个实力不错的IT支撑部门,通过部门就可以完善对企业内部信息化建设。

从企业性质范围来看:

1)传统行业企业

传统行业大多数是以服务业、制造业、生产性企业为主,在IT信息化方面相对比较落后,属于重资产行业。

2)互联网企业

互联网行业是基于IT作为解决方案的

3)IT服务企业

以销售软件、硬件、以及技术咨询服务为主的企业。

针对市场中存在的企业、个体等的需求特点,市场上一般对软件服务进行如下分类:

  1. 提供软件的服务,解决企业内部信息化问题,如ERP系统、进销存管理系统、人力资源管理系统、行政系统、财务系统等等。(SaaS)
  2. 提供平台服务,解决行业共性问题,将SaaS迁移到云端,提供平台类的服务。如淘宝的开放平台、Facebook的开放平台、基于Salesforce的销售系统、云笔记、云盘等。(PaaS)
  3. 提供基础设施服务。基础设施包括软件和硬件方面的,包括存储、虚拟机、网络、防火墙、缓存、负载均衡、数据库等等。(IaaS)

从企业内部人员角色来看:

企业内部,尤其是互联网企业内部,一般将角色分为如下几类:

  1. 开发
  2. 测试
  3. 运维
  4. DBA
  5. 产品
  6. 项目管理人员
  7. 客服
  8. 业务人员(销售、市场、BD、人力资源、行政等等)

不同的角色对于软件服务的需求也是不同的,下图大致描绘了互联网行业各个角色对云平台的需求:

Linux:有关云架构建设和选型的思考
Linux:有关云架构建设和选型的思考

三、云计算的能力

云计算能够解决什么,也就是what cloud offer这个问题。目前的云计算在应用中主要提供了以下八个能力:

  1. 封装:将计算能力和软件放在云端,可以减少重复建设,将通用的服务封装起来,达到重用,减少资源的浪费,提高生产效率,并提供成熟的解决方案。 在云端,云提供商可以建立软件的标准,提供发布包的方式,用户可以通过软件包的方式进行购买使用,譬如目前开源领域的Docker。
  2. 安全:云计算将数据和存储,软件逻辑都集中于云端,更能方便的统一构建安全体系,通过Iptables实现网络过滤,并在服务端做安全组件实现安全策略,并能够通过海量集群应对DDOS攻击等。
  3. 灵活:云计算提供灵活的软件和服务端架构,用户不再需要自己构建应用运行环境,对资源的使用能够按需购买,并能够升级,并自由组合。举例来说:用户可以选用不同的存储方式(mysql、oracle,文件系统,kv等等)
  4. 性能:通过集群的能力和云端的集成能够提高集群的性能处理,通过专业的云解决提供商,在云端的性能扩展更加方便,技术上更加专业。譬如服务端可以在用户毫不察觉的情况下完成添加机器、存储扩容等操作。
  5. 伸缩能力:在存储和计算能力方面提供弹性的资源管理,能够按需使用,在使用过程中,可以通过动态的添加和减少物理资源,来提高响应能力或节约成本。
  6. 运维:云计算在IaaS角度来看,重要的是运维,能够将运维更加集中化管理,并完全智能化,大大降低人力成本
  7. 充分利用物理资源:通过云建设,能够将物理资源进行虚拟化处理,屏蔽物理硬件底层,并能够完成物理资源软化进行逻辑管理和分配调度
  8. 大数据:大数据保存于云端,能够提供数据分析和智能处理

当然,云计算还有很多很多好处,给我们带来很多想像空间和IT技术的革命。

公有云与私有云

行业内将云分为“公有云”和“私有云”。在我们之前的需求分析过程中,大致了解了云的需求,“公有云”和“私有云”的差别最大的是需求的差异,因为需求的差异,导致了技术方案和产品决策的差异。

公有云需求上由于用户多种多样,导致需求存在不一样,特别需要更多的定制化,譬如:

  1. 存储个性化

    云存储方面大概分为块存储和对象存储,块存储适合于vm运行环境,对象存储提供了KV的访问方式提供了海量扩展存储文件的能力,用户可以根据自己 的需求选择不同的存储方式,选用不同的容量。在存储物理介质方面来说,因为存在不同的物理介质,对性能和安全的要求,可以采用传统的SATA硬盘,或者 SSD存储等。

  2. 内存使用

    内存方面,需要提供动态扩展内存的方式,用户能够自由扩展

  3. 网络的定制化

    公有云用户需要能够构建自己的内部网络,并能够自动组网

  4. 数据库使用

    公有云的用户分属不同的公司团体,各自的技术差异存在,因而有不同的数据库类型,譬如mysql,sqlserver,oracle等等。并能够定义存储大小,内存运行大小等等。并提供数据备份、恢复、高可用服务等

  5. 缓存使用

    公有云的用户可以选择不同的缓存方式,譬如增加CDN,采用不同的KV缓存方式并选择容量。

  6. 安全问题

    公有云对于云的安全和私有云差别较大,私有云大多数在安全问题上不需要公有云那么严格,大多数是内部系统之间的交互

以上仅限于IaaS层面的考虑,当然对于公有云来说还有很多细化的个性化需求,例如:数据分析,业务对接服务等等。

四、潜在的挑战

计算机自从诞生以来,一直按照冯.诺伊曼的体系发展在硬件的基础上的操作系统,也分为网络协议体系的实现、内存管理、文件管理体系等等。大致的抽象图如下:

Linux:有关云架构建设和选型的思考
Linux:有关云架构建设和选型的思考

要建设云,有几个重要的问题需要解决:

  1. 管理问题

    云计算的实施首先要解决运维的问题,在云环境下后端是大规模数量的物理节点的集群,对于同时维护数以千计算的计算节点,以及部署结构的复杂,需求 的变化,光靠增加人力也难以解决复杂的问题。从而需要构建高效的计算资源管理系统,能够灵活简单的管理运系统,并能够及时的发现问题。

  2. 计费问题(公有云)

    对于公有云而言,因为是面向公众的,必然产生费用的问题,常用的收费方式多种多样,也因为产品的不同而计费方式不同,譬如:网络、存储、cpu、数据库容量等等

  3. 资源隔离问题

    云计算运行在云端,是通过虚拟化体系建立的,虚拟化是建立在硬件之上,多个虚拟化资源同时运行于同一节点(host)中,存在着资源的共享争用问题,

    这样就存在着资源使用的公平性问题,导致同一Host上的资源使用相互影响。为了使得彼此资源使用相互独立,我们要建立相应的隔离机制。资源的隔离包括:存储、内存、cpu、数据库、网络等,其中网络是最难控制的。

  4. 安全问题

    在云端的应用和基于客户端的安全,面临的环境不一样,客户端方面大多数是病毒问题引起的,而在云端,也存在一些服务器攻击的问题,以及数据相互独立相互影响的问题,以及一些服务端编程的安全问题等。

  5. 性能问题

    对于云来说,需要保证云端的性能问题,包括CPU处理性能,IO处理能力,资源的就近访问,资源数据同步的速度,还需要解决系统底层的性能问题,包括文件处理Cache,存储介质的优化,采用SSD等,或者采用SATA+SSD的混合方式节约资源和降低成本。

  6. 存储问题

    对于云来说,由于云端是将客户端的数据和运算转移到云端,必须要有足够的存储能力以及足够稳定的存储系统,保证用户数据的安全,对于存储来说,有 提供VM虚拟机运行环境的block device(块存储),以及提供KV方式的对象访问存储,这些都需要保证数据复制、数据读写访问的性能和数据永久可用的能力

  7. 网络问题

    对于公有云以及私有云的一些应用场景,需要能够提供网络的逻辑隔离(SDN)或物理隔离,以及对网络的访问灵活问题。构建虚拟化网络,由于物理条 件的限制,我们不得不从L2-L4层进行处理,我们常用的方式 是:bridge,vlan,gre,sdn(openflow,opendaylight),以及一些厂家的产品等等。

  8. 高可用问题

    高可用问题是在分布式系统中必须要处理的问题,正因为集群的问题,我们必须要从多方面考虑解决的问题,包括保证云管理系统的高可用性,存储介质的高可用性,网络的高可用性,虚拟机高可用问题等等。

  9. 提高资源利用率问题

    对于物理资源的虚拟化,我们有很多种解决方法,KVM、Vmware、xen、Hyperv、LXC等等,在HVM的方式下,对于VM本身的启动 需要占用大量的内存、cpu和存储资源,导致系统内存和cpu使用有一定的浪费,基于LXC的解决方案因为是机基于Host OS进程,通过namespace的方式进行隔离的,是一种轻量级的实现,能够在资源初始化,资源利用率方面能够最大化,对于各个应用场景来说,我们可以 选用合适的解决方案。

五、如何建设

58同城经过多年的发展,探索了一条适合自身发展的技术架构体系。随着业务和技术的发展,团队规模不断壮大,在技术和管理上面临越来越多的挑战。在 项目需求管理,开发效率、代码管理和质量建设,测试,线上发布,运维管理等方面需要有一套完整的解决方案,来提升公司的协作能力和整体能效。

58同城目前所有的应用在线上都是跑在物理机器上,采用物理机的方式,一方面会导致服务器资源得不到充分和合理的使用,譬如:有些物理机器cpu使 用长期在10%以下,有些内存使用剩余很多;另外一方面,由于互联网的特点,存在着时段内的访问高峰问题,需要解决资源使用的伸缩问题;基于以上问题,架 构部对现有的技术体系进行梳理和分析,采用资源虚拟化的方式进行私有云的建设,并在这基础上,完善公司整体技术体系,包括:开发、测试、上线、运维等一系 列自动化和智能化方面的建设。

私有云的目标

  1. 提高物理资源的利用率
  2. 一套云管理系统,降低运维的复杂度,提高运维工作效率
  3. 构建灵活的开发、测试集成环境
  4. 提供海量的存储体系
  5. 建立完善的监控体系
  6. 建立基础应用环境、方便测试
  7. 统一架构
  8. 智能资源调度

实施方案:OpenStack

对于云计算来说,也存在着多种解决方案,如CloudStack和OpenStack等。在两种方案的比较之后,我们最终选择了OpenStack的解决方案。主要是出于以下几点原因:

  1. OpenStack的社区成熟度:OpenStack经过几年的发展,社区已经越来越成熟,很多大公司都参与进来帮助完善,红帽公司未来十年也将OpenStack作为发展的战略重点。
  2. 架构设计的选择:OpenStack采用了Python语言编写,并且设计上采用组件化的方式,各个组件独立发展,并相互解耦
  3. OpenStack提供了更加完整成熟的方案,能够满足多样的需求,同时已经有不少公司采用,已经经过生产上的验证
  4. 文档问题:OpenStack文档化做的不错,网上能够找到多种多样的问题处理办法
  5. 人员招聘问题,经过多年的发展和市场的培育,了解OpenStack的人越来越多,对于开发维护的人才建设和招聘相对成熟一些。
  6. 发展比较迅速

下图是我们大致的架构规划

Linux:有关云架构建设和选型的思考
Linux:有关云架构建设和选型的思考

文章观点仅一家之言,欢迎大家一起交流探讨。我计划在下一篇文章《58同城私有云建设实践》中详细介绍我们私有云建设的思路和过程,中间遇到的问题,希望跟大家一起探讨。

来源:http://www.infoq.com/cn/articles/cloud-structure-thinking

Linux:DNS多点部署IP Anycast+BGP实战分析

DNS领域的多点部署大多采用IP Anycast+BGP方式,采用这种方式不需要额外采购设备,部署灵活多样。但像其他所有技术一样,IP Anycast+BGP技术只有在适当的领域和范围内才能发挥它的最大优势。

Internet不断发展,上网人群数量增加,多数网站或DNS等服务在使用单节点提供服务的情况下,无论服务器性能还是接入带宽都不足以承载大量的用户服务请求; 而在国内运营商网络之间访问缓慢的问题一直存在; 此外,服务的高可用性也逐渐被重视。考虑到这些因素,企业在部署服务的时候首先会想到在多个物理位置、多个运营商网络中部署相同的服务,以解决上述问题。用户在下载的时候,大都看到过下载项中有“电信下载”、“网通下载”等多个下载链接,就是这种多点部署的一种应用。可不可以不用用户选择,而自动将请求连接到最快的服务呢?答案是某些应用服务可以实现。

某些设备厂商针对这一需求生产了一些硬件产品,如F5公司的GTM。而在DNS领域,多点部署更多的是使用了IP Anycast+BGP方式。IP Anycast+BGP是一种网络技术,采用这种方式不需要额外采购设备,且部署灵活多样。但在考虑部署IP Anycast+BGP的时候,要认真考虑IP Anycast+BGP的特性,像其他所有技术一样,IP Anycast+BGP技术只有在适当的领域和范围内才能发挥它的最大优势。

Linux:DNS多点部署IP Anycast+BGP实战分析
Linux:DNS多点部署IP Anycast+BGP实战分析

Anycast技术优势

Anycasting最初是在RFC1546中提出并定义的,根据RFC1546的说明,IPv4的任播地址不同于IPv4的单播地址,它建议从IPv4的地址空间分配出一块独立的地址空间作为任播地址空间。RFC1546定义的这种任播没有在IPv4网络中得到广泛使用,但是它的最初语义在IPv4得到广泛使用: 在IP网络上,通过一个Anycast地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机(比如DNS或者镜像服务),访问该地址的报文可以被IP网络路由到这一组目标中的任何一台主机上,它提供的是一种无状态的、尽力而为的服务。

在实际应用中,Anycast采用将一个单播地址分配到处于Internet中多个不同物理位置的主机上,发送到这个主机的报文被网络路由到路由协议度量的“最近”的目标主机上。

Anycast技术具有以下优势:

一、不同客户端将访问不同目的主机,此过程对客户端透明,从而实现了目的主机的负载均衡;

二、当任意目的主机接入的网络出现故障,导致该目的主机不可达时,客户端请求可以在无人为干预的情况下自动被路由到目前可达的最近目的主机,在一定程度上为目标主机提供了冗余性;

三、当目的主机受到DoS攻击而无法到达时,由于网络不可到达,客户端请求也将路由到其他目的主机上,而在DDoS攻击时,由于Anycast的负载均衡效应,避免了单台目的主机承受所有攻击流量,因此在一定程度上为目的主机提高了安全性;

四、因为Anycast利用路由度量到“最近”的目的主机,提高了客户端响应速度。

但是,Anycast技术也存在一定的局限性:

使用Anycast中的共享单播地址不能作为客户端发起请求,因为请求的响应不一定能返回到发起的Anycast单播地址。因此,目前Anycast仅适合一些特定的上层协议,从目前的实际应用来看, Anycast最广泛的应用是DNS的部署。

Anycast应用方式

Anycast实质上是一种网络技术,它借助于网络中动态路由协议实现服务的负载均衡和冗余,从实现类型上分,可以分为subnet Anycast和Global Anycas: Subnet Anycast是指所有目的主机都位于同一网段,此方式仅提供负载均衡和冗余,对安全度提升没有实质效果; Global Anycast是指目的主机处于不同网段,可能处于不同城市,甚至分布在全球各地,在实际应用中Global Anycast中目标主机的部署除地理位置的考虑外,多接入不同自治域的网络中。

当使用Anycast的目标主机接入到不同自治域时,因为难以使用某一自治域的IP地址,所以通常使用Anycast的共享单播地址拥有独立的自治域号,并通过BGP协议与不同自治域网络交换路由,即IP Anycast+BGP。

IP Anycast+BGP部署

IP Anycast+BGP的部署必须使用能够运行BGP的设备与其他自治域进行路由交换,通常使用的设备是路由器或三层交换机。然后将目标主机直接接入路由器或通过负载均衡设备将多台主机接入路由器,当然此时也可以采用subnet Anycast接入目标主机。而路由器向上联自治域广播目标主机共享的单播地址; 路由器可以从上联自治域接收全路由表,也可以将默认路由的下一跳指向上联自治域的路由器接口。

这种路由器加目标主机的组合形成了单一节点,将单一节点进行复制,分别上联到不同地理位置的不同自治域中,且路由器广播地址相同,就形成了Anycast。当然,每个单一节点内部结构可以不同,只要BGP广播地址相同,目标主机提供相同服务即可。各单一节点可以使用相同的自治域号,也可以使用不同自治域号。

IP Anycast+BGP的部署可以解决分布服务的负载均衡、冗余度问题,也在一定程度上提高了分布服务的安全性,但是也存在一些问题:

首先,目标主机接入路由时,如目标主机down机,或网卡故障等原因导致路由器在IGP中无法查找到目标主机路由,BGP将自动停止对上联自治域的地址广播,客户端请求将被重新路由到其他目标主机。但是如果目标主机网络可达而服务不可用,BGP无法探测,并将持续向上联自治域广播共享单播地址。被路由到该目标主机的客户端请求无法获得服务,且不能被自动路由到其他目标主机,鉴于上述原因,网络管理员必须时时监控各目标主机的服务,一旦出现异常,可以手工停止路由器的BGP广播,使客户端请求被路由到其他目标主机。

其次,因为用于Anycast的单播地址不能作为客户端发起请求,所以网络管理员所使用的监控网络不能使用Anycast的共享单播地址,此外Anycast要求各节点提供的服务保持一致,对客户端透明,因此,服务同步的源IP也与监控网络一样,不能使用Anycast的共享单播地址。由于二者性质相似,以下统称为监控网络。

第三,网络管理员对Anycast中各节点进行监控时,无法确认监控的是哪一个节点,也无法控制监控所到达的节点。为了实现网络管理员对网络及服务的实时监控,各Anycast节点除了使用共享单播地址外,必须配置非共享单播地址用于网络管理及监控。非单播地址的获得主要有两种方式: 第一种方式是上联自治域分配,上联自治域将这段地址通过静态路由指向Anycast节点的路由器; 第二种方式是作为独立网段在各个Anycast节点路由器上进行广播,因为通常自治域只接收掩码长度小于24的网段广播,如果采用第二种方式将造成IP地址的极大浪费,所以,在条件允许的情况下,尽可能采用第一种方式获得节点非共享单播地址。非共享单播地址同时也用于目标主机的服务同步。地址的分配必须在节点建设的规划期慎重考虑。

第四,在采用第二种方式获取非共享单播地址用于管理时,如果网络管理员监控主机和Anycast节点使用相同自治域号,监控主机将无法管理监控该Anycast节点,因为BGP协议中为避免路由循环,不接收来自相同自治域号的路由广播。因此,在条件允许的情况下,监控网段和Anycast节点尽可能使用不同的自治域号,或者使用第二种方式获得非共享单播地址的Anycast节点应与其他节点和监控网段使用不同的自治域号。但是,也应该避免监控网段和每个Anycast节点都使用独立自治域号,一是避免自治域号的浪费,二是APNIC等自治域号分配机构要求拥有独立自治域号的自治系统需要与两个以上其他自治系统联接,而通常一个Anycast节点只会联接一个自治系统。

如果无法申请到一个以上的自治域号,则会造成监控网络和采用第二种方式获得非共享单播地址的节点使用相同的自治域号,但也有变通方式: 在监控网络边界路由器上,将该节点非共享单播地址的路由通过静态路由指向上联自治域的边界路由器接口,同时该节点路由器也需要将监控网络地址的路由通过静态路由指向上联自治域的边界路由器接口。

第五,Anycast节点上联其他自治系统时,除联接单一自治系统,也可能接入到一些互联网交换中心。通常互联网交换中心使用路由服务器进行路由交换,但路由服务器不承担数据包转发工作,因此,路由服务器不提供默认路由,而Anycast节点也不能将默认路由指向哪个具体地址,就需要Anycast节点路由器接收全路由表。如果是这种情况,还要考虑节点路由器的选型,保证能够接收所需路由条目,这可能导致节点投资增加。在Anycast单一节点上联时,类似问题不胜枚举,此类问题多属于接入问题,与非Anycast接入相同。在单一节点建设时对此应认真对待,实施前详细了解情况,做好充足准备。

小贴士

IP Anycast+BGP在DNS系统部署中得到了广泛应用,但由于Anycast节点上联自治系统不同,接入方式多种多样,很难形成统一、规范的节点部署方案。因此,在IP Anycast+BGP整体部署之前应多方面考虑各种因素,着重考虑自治域号申请、IP地址规划等问题。在某一节点实施时,需要引起足够重视,应主要针对网络接入详细了解情况,做好充足准备,切忌认为已形成统一模式而轻视单一节点建设。

Linux:[快速技巧]如何设定你的 Ubuntu 14.04 自动关机

当你系统还在运行某些程序的时候,无法关闭计算机,但是你又不能让计算机跑一整夜!可能你会发现你曾面临相似的处境:你需要在Ubuntu或者其它Linux系统下设定计算机自动关机。

在这篇文章中,我们就来看看如何使用GUI或者在CLI下设定你的Ubuntu关机.

使用EasyShutdown设定你的Ubuntu关机

EasyShutdown是一个轻量级的应用程序,它提供给你简洁的GUI,你可以很容易就能设定你的Ubuntu关机。你可以在EasyShutdown的launchpad页面下载.deb文件。只要双击它,就可以安装了。默认情况下,它会打开Ubuntu Software Center

安装完成,从Unity Dash启动它。界面非常简单,你只需要提供你想关机的时间就可以了。举个例子:如果你想在03:30 AM关机,像下图那样操作:

请注意:EasyShutdown并没有后台程序或者系统托盘,所以,你必须让它一直运行,否则将不能正常工作。但EasyShutdown的优点是:它会在你安排关机时间的前一分钟通知你,那样你就可以选择停止它。

使用命令行设定Ubuntu关机

使用命令行选项来安排Ubuntu关机同样很简单。你要做的就是使用“shutdown”命令。举个例子:想在03:30 AM关机,你可以使用下面的命令:

 sudo shutdown -h 03:30

注意,你必须一直运行这个命令。所以要么保持这个终端,要么在后台运行。

我希望这些快速技巧可以帮助您学会如何设定Ubuntu或者其它Linux系统自动关机,比如Linux Mint。如有问题或者建议欢迎您随时提出。


via: http://itsfoss.com/schedule-shutdown-ubuntu/

作者:Abhishek 译者:su-kaiyao 校对:Caroline

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

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

Linux:Nginx 502错误触发条件与解决办法汇总

一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现。有些站长是在刚刚转移到Nginx之后就出现了这个问题,所以经常会怀疑这是不是Nginx的问题,但事实上这是个误区。

以下是从张宴和Ayou的博客搜集整理的一些Nginx 502错误的排查方法,供大家参考:

Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的。这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句502 Bad Gateway,另外还不忘附上自己的大名。

Nginx 502的触发条件

502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。我一般是全写上的:

proxy_next_upstream error timeout invalid_header http_500 http_503;

不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆stacktrace的错误信息,现在被502取代了。但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理了……

503错误就可以保留,因为后端通常是apache resin,如果apache死机就是error,但resin死机,仅仅是503,所以还是有必要保留的。

解决办法

遇到502问题,可以优先考虑按照以下两个步骤去解决。

1、查看当前的PHP FastCGI进程数是否够用

netstat -anpo | grep "php-cgi" | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间

可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

......
http
{
......
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
......

php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了。

如果这样修改了还解决不了问题,可以参考下面这些方案:

3、max-children和max-requests

一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右

最近经常会出现这样的情况: php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了

检查php-fpm的日志文件发现了一些线索:

Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200
Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″
Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll
Sep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587

在这几句的前面,是1000多行的关闭children和开启children的日志

原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭。

在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

解决问题很简单,增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

打开 /usr/local/php/etc/php-fpm.conf

调大以下两个参数(根据服务器实际情况,过大也不行)

5120
600

然后重启php-fpm。

5、增加缓冲区容量大小

将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

6、request_terminate_timeout

如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)

发现,问题解决了,执行很长时间也不会出错了。

优化fastcgi中,还可以改改这个值5s 看看效果。

php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

 

来源:http://os.51cto.com/art/201011/233698.htm

Linux:Linux 内核测试和调试(4)

自动测试工具

这里列出一些能满足不同需求的测试工具供你选择。本小节只是简单介绍个大概,并不提供详细操作指南。

AuToTest

AuToTest 是一个全自动测试框架,存在的主要目的就是测试 Linux 内核,当然也可以用来测试其他东西,比如测试一块新硬件是否能稳定工作。AuToTest 是开源软件,以 GPL 方式授权,运行于 server-client 架构(即 C/S 架构)。你可以通过配置 server 端来对运行了 client 端的系统执行初始化、运行与监测工作,也可以自己在目标系统上让 client 运行起来。另外你可以为这个测试框架添加测试用例,详情请参考AuToTest 白皮书

Linaro Automated Validation Architecture

LAVA 自动测试框架用于自动安装于运行测试。举个例子:你在 LAVA 里面只需运行几个命令就可以跑 LTP(LCTT:Linux Test Project,中文是 Linux 测试计划,SGI发起并由IBM负责维护,目的是为开源社区提供测试套件来验证Linux的可靠性、健壮性和稳定性)。通过 LAVA 命令可以自动为你安装 LTP 所需要的所有依赖包,下载源码、编译编码、将 LTP 安装到某个独立的地方,方便卸载 LTP 时能移除所有二进制文件。安装好 LTP 后,运行 LAVA 命令时添加 ‘ltp’ 选项就可以运行 LTP 测试任务了,它会将测试结果以文件方式保存下来,文件名包含测试名称、时间戳。这些测试结果可以留着供以后参考。这是个发现软件退化(如果软件退化了的话)的好方法。下面列出 LAVA 配合 LTP 使用的一些命令:

显示 LAVA 支持的测试列表:

lava-test list-tests

安装测试套件:

lava-test install ltp

运行测试:

lava-test run ltp

查看结果:

lava-test results show ltp-timestamp.0

卸载测试套件:

lava-test uninstall ltp

内核调试功能

Linux 内核本身包含很多调试功能,比如 kmemcheck 和 kmemleak。

Linux:Linux 内核测试和调试(4)
Linux:Linux 内核测试和调试(4)

kmemcheck

kmemcheck 是一个动态检查工具,可以检测出一些未被初始化的内存(LCTT:内核态使用这些内存可能会造成系统崩溃)并发出警告。它的功能与 Valgrind 类似,只是 Valgrind 运行在用户态,而 kmemchecke 运行在内核态。编译内核时加上 CONFIG_KMEMCHECK 选项打开 kmemcheck 调试功能。你可以阅读 Documentation/kmemcheck.txt 来学习如何配置使用这个功能,以及如何看懂调试结果。

kmemleak

kmemleak 通过类似于垃圾收集器的功能来检测内核是否有内存泄漏问题。而 kmemleak 与垃圾收集器的不同之处在于前者不会释放孤儿目标(LCTT:不会再被使用的、应该被释放而没被释放的内存区域),而是将它们打印到 /sys/kernel/debug/kmemleak 文件中。用户态的 Valgrind 也有一个类似的功能,使用 –leak-check 选项可以检测并报错内存泄漏问题,但并不释放这个孤儿内存。编译内核时使用 CONFIG_DEBUG_KMEMLEAK 选项打开 kmemcleak 调试功能。阅读 Documentation/kmemleak.txt 来学习怎么使用这个工具并读懂调试结果。

内核调试接口

Linux 内核通过配置选项、调试用的 API、接口和框架来支持动态或静态的调试。我们现在就好好学习学习这些牛逼的功能,从静态编译选项开始讲。

调试配置选项:静态编译

大部分 Linux 内核以及内核模块都包含调试选项,你只要在编译内核或内核模块的时候添加这个静态调试选项,程序运行时后就会产生调试信息,并记录在 dmesg 缓存中。

调试的 API

调试 API 的一个很好的例子是 DMA-debug,用来调试驱动是否错误使用了 DMA 提供的 API。它会跟踪每个设备的映射关系,检测程序有没有试图为一些根本不存在的映射执行“取消映射”操作,检测代码建立 DMA 映射后可能产生的“映射丢失”的错误。内核配置选项 CONFIG_HAVE_DMA_APT_DEBUG 和 CONFIG_DMA_API_DEBUG 可以为内核提供这个功能。其中,CONFIG_DMA_API_DEBUG 选项启用后,内核调用 DMA 的 API 的同时也会调用 Debug-dma 接口。举例来说,当一个驱动调用 dma_map_page() 函数来映射一个 DMA 缓存时,dma_map_page() 会调用debug_dma_map_page() 函数来跟踪这个缓存,直到驱动调用 dma_unmap_page() 来取消映射。详细内容请参考使用 DMA 调试 API 检测潜在的数据污染和内存泄漏问题

动态调试

动态调试功能就是你可以决定在程序运行过程中是否要 pr_debug(), dev_dbg(), print_hex_dump_debug(), print_hex_dump_bytes() 这些函数正常运行起来。什么意思?当程序运行过程中出现错误时,你可以指定程序打印有针对性的、详细的调试信息。这功能牛逼极了,我们不再需要为了添加调试代码定位一个问题,而重新编译安装内核。你可以指定 CONDIF_DYNAMIC_DEBUG 选项打开动态调试功能,然后通过 /sys/kernel/debug/dynamic_debug/control 接口指定要打印哪些调试日志。下面分别列出代码级别和模块级别打印日志的操作方法:

让 kernel/power/suspend.c 源码第340行的 pr_debug() 函数打印日志:

echo 'file suspend.c line 340 +p' > /sys/kernel/debug/dynamic_debug/control

让内核模块在加载过程中打开动态调试功能:

使用 modprobe 命令加在模块时加上 dyndbg=’plmft’ 选项。

让内核模块的动态调试功能在重启后依然有效:

编辑 /etc/modprobe.d/modname.conf 文件(没有这个文件就创建一个),添加 dyndbg=’plmft’ 选项。然而对于哪些通过 initramfs 加载的驱动来说,这个配置基本无效(LCTT:免费奉送点比较高级的知识哈。系统启动时,需要先让 initramfs 挂载一个虚拟的文件系统,然后再挂载启动盘上的真实文件系统。这个虚拟文件系统里面的文件是 initramfs 自己提供的,也就是说你在真实的文件系统下面配置了 /etc/modprobe.d/modname.conf 这个文件,initramfs 是压根不去理会的。站在内核驱动的角度看:如果内核驱动在 initramfs 过程中被加载到内核,这个驱动读取到的 /etc/modprobe.d/modname.conf 是 initramfs 提供的,而不是你编辑的那个。所以会有上述“写了配置文件后重启依然无效”的结论)。对于这种刁民,呃,刁驱动,我们需要修改 grub 配置文件,在 kernel 那一行添加 module.dyndbg=’plmft’ 参数,这样你的驱动就可以开机启动动态调试功能了。

想打印更详细的调试信息,可以使用 dynamic_debug.verbose=1 选项。参考 Documentation/dynamic-debug-howto.txt 文件获取更多信息。

设置追踪点

到目前为止,我们介绍了多种动态和静态调试方法。静态调试选项和静态调试钩子函数(比如 DMA Debug API)需要的编译过程打开或关闭,导致了一个难过的事实:需要重新编译安装内核。而动态编译功能省去了“重新编译”这件麻烦事,但是也有不足的地方,就是调试代码引入了条件变量,用于判断是否打印调试信息。这种方法可以让你在程序运行时决定是否打印日志,但需要执行额外的判断过程。“追踪点”代码只会在程序运行过程中使用“追踪点”功能才会被触发。也就是说,“追踪点”代码与上述说的两种方法都不一样。当用不到它时,它不会运行(LCTT:动态调试的话,代码每次都需要查看下变量,然后判断是否需要打印日志;而“追踪点”貌似利用某种触发机制,不需要每次都去查看变量)。当你需要用到它时,程序的代码会把“追踪点”代码包含进去。它不会添加任何条件变量来增加系统的运行负担。

详细信息请参考布置追踪代码的小技巧

“追踪点”的原理

追踪点使用“跳跃标签”,这是一种使用分支跳转的编码修正(code modification)技术。

当关闭追踪点的时候,其伪代码看起来时这样的:

[ code1 ]
nop
back:
[ code2 ]
return;
tracepoint:
[ tracepoint code ]
jmp back;

当打开追踪点的时候,其伪代码看起来时这样的:(注意追踪点代码出现的位置)

[ code1 ]
jmp tracepoint
back:
[ code2 ]
return;
tracepoint:
[ tracepoint code ]
jmp back;

(LCTT:咳咳,解释解释上面两段伪代码吧,能看懂的大神请忽略这段注释。不使用追踪点时,代码运行过程是:code1->code2->return结束;使用追踪点时,代码运行过程是:code1->跳到tracepoint code执行调试代码->跳回code2->return结束。两段代码的唯一区别就是第二行,前者为 nop(不做任何操作),后者为 jmp tracepoint (跳到调试代码)。)

Linux 电源管理子系统的测试

使用静态调试、动态调试和追踪调试技术,我们来跑一下磁盘的电源管理测试。当系统被挂起时,内核会为磁盘创建一个休眠镜像,使磁盘进入休眠模式,当系统重新被唤醒时,内核又利用这个休眠镜像重新唤醒磁盘。

设置挂起设备与唤醒设备需要的时间:

echo 1 > /sys/power/pm_print_times

以 reboot 模式挂起磁盘:

echo reboot > /sys/power/disk
echo disk > /sys/power/state

以 shutdown 模式挂起磁盘 —— 与 reboot 模式一样,只是重新唤醒磁盘的话还需要电源提供。

echo shutdown > /sys/power/disk
echo disk > /sys/power/state

以 platform 模式挂起磁盘 —— 能测试更多内容,比如 BIOS 挂起和唤醒,会涉及到 ACPI 功能。我们推荐你使用这种方式,把 BIOS 也拉下水陪你玩挂起和唤醒游戏。

echo platform > /sys/power/disk
echo disk > /sys/power/state

via:http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,3

译者:bazz2 校对:校对者ID

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

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

Linux:超级树莓派兄弟

我已经不象以前那样玩那么多游戏了。虽然之前我当然花费了生命里的无数时间在任天堂,SNES,或是之后在我电脑上的第一人称射击游戏(只在Linux下,谢谢),如今,我更愿意把空余时间花在我累积起来的许多其他非游戏爱好上。

但是最近,我发现自己又抹掉了Wii手柄上的灰尘,这样就可以玩一玩我重新购买的NES和SNES游戏了。不过问题是,这些游戏需要用到一些特别的控制器,而且我已经有一个修改过的SNES控制器可以通过USB连接。这已经有足够的理由让我去寻找一个更合适的方案。

当然,我也可以简单地接上三个甚至四个手柄,然后在客厅里面堆满游戏。但是我已经习惯于把我的CD和DVD都提取成文件,然后在中心媒体服务器上挑选着听或是看。所以如果每次我想换游戏的时候,不用起身去翻游戏卡带,那就完美了。

当然,这意味着得使用模拟器。尽管之前我在一个改动过的Xbox上成功过,不过可惜它已经不在我手上了。然后我觉得一定有什么人已经在树莓派上实现过这种平台,结果是肯定的,在简单地搜索和一些命令之后,我在一个剩下的树莓派上搭起来一个完美的怀旧游戏中心。

树莓派项目的一个优点是,有大量的用户在使用相同的硬件。对我来说,这意味着我不用完整地参考别人的指引再根据自己的需求做出必要的改动,而只需要简单地完全按照别人的指导做就行了。在我这件事情上,我找到了RetroPie项目,它把你安装时需要用到的所有命令都包到了一个单一的大脚本中。在执行完后,你就完整地安装并配置好了RetroArch,它集成了所有的主流模拟器以及一个统一的配置方式,再加上一个在树莓派上开机启动的EmulationStation图形界面,通过它可以只用手柄就能方便地定位到你想玩的游戏。

安装RetroPie

Linux:超级树莓派兄弟
Linux:超级树莓派兄弟

在安装RetroPie之前,你可能需要确认一下你的Raspbian版本(树莓派默认的Linux发行版,这也是这个项目假设你在用的)是不是最新的,包括有没有新的固件。这只需要几个通用的apt命令。虽然,在这一步里你可以接个键盘到树莓派上,不过我觉得用ssh登录到树莓派上更方便。之后直接复制和粘贴下面的命令:

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

现在树莓派已经更新到最新了,再确认一下是否安装了git和dialog,然后可以通过git来下载RetroPie:

$ sudo apt-get -y install git dialog
$ cd
$ git clone --depth=0 git://github.com/petrockblog/RetroPie-Setup.git

执行完上边的命令后会创建一个RetroPie-Setup目录,里面有主要的安装脚本。之后你只需要进去这个目录,并运行安装脚本:

$ cd RetroPie-Setup
$ chmod +x retropie_setup.sh
$ sudo ./retropie_setup.sh

这个脚本会在终端里显示一个菜单(图1),在里面你可以选择二进制安装或是源码安装,配置RetroPie,或是更新RetroPie安装脚本和执行文件。之后选择二进制安装或是源码安装,任选一个。二进制安装会快一些,不过有些软件版本可能不是最新的。源码安装需要编译软件,所以用的时间会比较长,但是完成之后,所有的一切都是最新版的。我个人会选择二进制安装,因为我知道在碰到任何问题之后,随时都可以重新执行这个脚本再选择源码安装。

图1. RetroPie安装菜单

在vanilla Raspbian固件版本中,这一步会需要很长时间,因为有大量不同的包需要下载和安装。在安装完成之后,返回在RetroPie安装主界面中,在主菜单里选择SETUP,在之后的二级菜单里,你可以调整设置,例如是否开机启动EmulationStation(推荐打开)以及是否允许欢迎界面。在我这里,我两个都允许了,因为我希望这个设备是一个独立的模拟游戏机。不过你需要了解的是,即便你打开了EmulationStation开机自动启动,你仍然可以ssh登录到机器上然后执行原始的RetroPie安装配置脚本来改变这个设置。

添加ROM

你也可以在RetroPie设置界面添加ROM。如果你在菜单里选择了Samba方式,就可以在网络上找一个Samba共享目录,然后从里面拷贝ROM。如果通过U盘的方式,RetroPie会在插到树莓派的U盘上创建一个目录结构,分别对应不同的模拟器。在这之后,你就可以把U盘插到其他电脑上,然后把ROM拷贝到合适的目录里,当再插回树莓派的时候,它会自动同步文件。最后(我就是这么做的),你还可以使用scp或者rsync来拷贝ROM到~/RetroPie/roms/的合适目录下。举个例子,NES游戏需要拷贝到~/RetroPie/roms/nes/目录里。

当你完成了配置并退出了RetroPie的设置脚本后,应该会想重启并进入EmulationStation,但是在那之前,你应该重新配置树莓派的内存空间,设为192或者128,运行命令:

$ sudo raspi-config

然后选择高级设置,调整内存空间设定。之后就可以安全地重启了。

EmulationStation

重启完之后,你会很高兴地看到EmulationStation界面,之后它会提示你设定控制杆,游戏手柄,或键盘按键,这样就可以控制EmulationStation菜单了。不过注意一下,这并不会影响手柄在游戏里的按键定义,只是用于控制EmulationStation菜单的。在设定完手柄后,你应该可以按下向右或向左方向键来切换不同的模拟器菜单了。在我这里,我将会在游戏里用到手柄上的所有按钮,所以我特别将另一个键盘上的键映射到菜单功能,这样在我玩完一个游戏后,不用重启树莓派就可以退出来。

EmulationStation只会显示已经侦测到ROM的模拟器,所以,如果你还没有拷贝ROM的话,得先做这件事情,然后可能还得重启一下才会有效果。而且,默认情况下,你的手柄没有为任何游戏做配置,但是,如果你在EmulationStation里一直按向右键足够多次以后,会弹出输入设定界面,你可以在里面映射手柄按键。有一个亮点是,当你设定好按键后,它会相应地应用到其他模拟器中。

就是这些了。在这之后,你可以浏览你收藏的各种游戏,然后按下绑定到“确定”的那个按键开始游戏。一开始我还担心树莓派可能不够强劲来玩我的游戏,但是直到现在,我试过地所有游戏都可以完美地运行。

资源

RetroPie项目主页:http://blog.petrockblock.com/retropie

RetroPie安装文档:https://github.com/petrockblog/RetroPie-Setup


via: http://www.linuxjournal.com/content/super-pi-brothers

译者:zpl1025 校对:wxy

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

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

Linux:OpenStack 部署运维实战

OpenStack 简介

OpenStack 是一个开源的 IaaS 实现,它由一些相互关联的子项目组成,主要包括计算、存储、网络。由于以 Apache 协议发布,自 2010 年项目成立以来,超过 200 个公司加入了 OpenStack 项目,其中包括 AT&T、AMD、Cisco、Dell、IBM、Intel、Red Hat 等。目前参与 OpenStack 项目的开发人员有 17,000+,来自 139 个国家,这一数字还在不断增长中。

OpenStack 兼容一部分 AWS 接口,同时为了提供更强大的功能,也提供 OpenStack 风格的接口(RESTFul API)。和其他开源 IaaS 相比,架构上松耦合、高可扩展、分布式、纯 Python 实现,以及友好活跃的社区使其大受欢迎,每半年一次的开发峰会也吸引了来自全世界的开发者、供应商和客户。

OpenStack 的主要子项目有:

  • Compute(Nova)提供计算虚拟化服务,是 OpenStack 的核心,负责管理和创建虚拟机。它被设计成方便扩展,支持多种虚拟化技术,并且可以部署在标准硬件上。
  • Object Storage(Swift)提供对象存储服务,是一个分布式,可扩展,多副本的存储系统。
  • Block Storage(Cinder),提供块存储服务,为 OpenStack 的虚拟机提供持久的块级存储设备。支持多种存储后端,包括 Ceph,EMC 等。
  • Networking(Neutron)提供网络虚拟化服务,是一个可拔插,可扩展,API 驱动的服务。
  • Dashboard 提供了一个图形控制台服务,让用户方便地访问,使用和维护 OpenStack 中的资源。
  • Image(glance)提供镜像服务,它旨在发现,注册和交付虚拟机磁盘和镜像。支持多种后端。
  • Telemetry(Ceilometer)提供用量统计服务,通过它可以方便地实现 OpenStack 计费功能。
  • Orchestration(Heat)整合了 OpenStack 中的众多组件,类似 AWS 的 CloudFormation,让用户能够通过模板来管理资源。
  • Database(Trove)基于 OpenStack 构建的 database-as-a-service。

网易私有云使用了 Nova、Glance、Keystone、Neutron 这 4 个组件。

网易私有云平台概况

图 1.网易私有云架构
Linux:OpenStack 部署运维实战
Linux:OpenStack 部署运维实战

网易私有云平台由网易杭州研究院负责研发,主要提供基础设施资源、数据存储处理、应用开发部署、运维管理等功能以满足公司产品测试/上线的需求。

图 1 展示了网易私有云平台的整体架构。整个私有云平台可分为三大类服务:核心基础设施服务(IaaS)、基础平台服务(PaaS)以及运维管理支撑服务,目前 一共包括了:云主机(虚拟机)、云网络、云硬盘、对象存储、对象缓存、关系型数据库、分布式数据库、全文检索、消息队列、视频转码、负载均衡、容器引擎、 云计费、云监控、管理平台等 15 个服务。网易私有云平台充分利用云计算开源的最新成果,我们基于 OpenStack 社区的 keystone、glance、nova、neutron 组件研发部署了云主机和云网络服务。

为了与网易私有云平台其他服务(云硬盘、 云监控、云计费等)深度整合以及满足公司产品使用和运维管理的特定需求,我们团队在社区 OpenStack 版本的基础上独立研发了包括:云主机资源质量保障(计算、存储、网络 QoS)、镜像分块存储、云主机心跳上报、flat-dhcp 模式下租户内网隔离等 20 多个新功能。同时,我们团队在日常运维 OpenStack 以及升级社区新版本中,也总结了一些部署、运维规范以及升级经验。两年多来,网易私有云平台 OpenStack 团队的研发秉承开源、开放的理念,始终遵循”来源社区,回馈社区”的原则。在免费享受 OpenStack 社区不断研发新功能以及修复 bug 的同时,我们团队也积极向社区做自己的贡献,从而帮助 OpenStack 社区的发展壮大。两年来,我们团队一共向社区提交新功能开发/bug 修复的 commits 近 100 个,修复社区 bug 50 多个,这些社区贡献涉及 OpenStack 的 Essex、Folsom、Havana、Icehouse、Juno 等版本。

得益于 OpenStack 的日益稳定成熟,私有云平台目前已经稳定运行了 2 年多时间,为网易公司多达 30 个互联网和游戏产品提供服务。从应用的效果来看,基于 OpenStack 研发的网易私有云平台已经达到了以下目标:

  1. 提高了公司基础设施资源利用率,从而降低了硬件成本。以物理服务器 CPU 利用率为例,私有云平台将 CPU 平均利用率从不到 10% 提升到 50%。
  2. 提高了基础设施资源管理与运维自动化水平,从而降低了运维成本。借助于 Web 自助式的资源申请和分配方式以及云平台自动部署服务,系统运维人员减少了 50%。
  3. 提高了基础设施资源使用弹性,从而增强了产品业务波动的适应能力。利用虚拟化技术将物理基础设施做成虚拟资源池,通过有效的容量规划以及按需使用,私有云平台可以很好适应产品突发业务。

网易 OpenStack 部署参考方案介绍

在具体的生产环境中,我们为了兼顾性能和可靠性,keystone 后端使用 Mysql 存储用户信息,使用 memcache 存放 token。为了减少对 keystone 的访问压力,所有服务(nova,glance,neutron)的 keystoneclient 均配置使用 memcache 作为 token 的缓存。

由于网易私有云需要部署在多个机房之中,每个机房之间在地理位置上自然隔离,这对上层的应用来说是天然的容灾方法。另外,为了满足私有云的功能和运维需 求,网易私有云需要同时支持两种网络模式:nova-network 和 neutron。针对这些需求,我们提出了一个面向企业级的多区域部署方案,如图 2 所示。从整体上看,多个区域之间的部署相对独立,但可通过内网实现互通,每个区域中包括了一个完整的 OpenStack 部署,所以可以使用独立的镜像服务和独立的网络模式,例如区域 A 使用 nova-network,区域 B 使用 neutron,互不影响,另外为了实现用户的单点登录,区域之间共享了 keystone,区域的划分依据主要是网络模式和地理位置。

图 2.多区域部署方法
Linux:OpenStack 部署运维实战
Linux:OpenStack 部署运维实战

和典型 OpenStack 部署将硬件划分为计算节点和控制节点不同的是,为了充分利用硬件资源,我们努力把部署设计成对称的,即任意一个节点下线对整体服务不会照成影响。因此我们 将硬件分为两类:计算节点,控制计算节点。计算节点部署 nova-network,nova-compute,nova-api-metadata,nova-api-os-compute。控制计算节点除了 计算节点的服务外还部署了 nova-scheduler,nova-novncproxy,nova-consoleauth,glance-api,glance- registry 和 keystone,如图 3 所示。

对外提供 API 的服务有 nova-api-os-compute,nova-novncproxy ,glance-api,keystone。这类服务的特点是无状态,可以方便地横向扩展,故此类服务均部署在负载均衡 HAProxy 之后,并且使用 Keepalived 做高可用。为了保证服务质量和便于维护,我们没有使用 nova-api,而是分为 nova-api-os-compute 和 nova-api-metadata 分别管理。外部依赖方面,网易私有云部署了高可用 RabbitMQ 集群和主备 MySQL,以及 memcache 集群。

图 3.计算节点,控制计算节点
Linux:OpenStack 部署运维实战
Linux:OpenStack 部署运维实战

网络规划方面,网易私有云主要使用 nova-network 的 FlatDHCPManager+multi-host 网络模式,并划分了多个 Vlan,分别用于虚拟机 fixed-ip 网络、内网浮动 IP 网络、外网网络。

运维上使用网易自主研发的运维平台做监控和报警,功能类似 Nagios,但是更加强大。其中较重要的监控报警包括日志监控和进程监控。日志监控保证服务发生异常时第一时间发现,进程监控保证服务正常运行。另外网易私有云使用 Puppet 做自动部署,以及使用 StackTach 帮助定位 bug。

OpenStack 各组件配置

OpenStack Havana 的配置项成百上千,大部分配置项都是可以使用默认值的,否则光是理解这么多的配置项的含义就足以让运维人员崩溃,尤其是对那些并不熟悉源码的运维人员来说 更是如此。下文将列举若干网易私有云中较关键的配置项,并解释它们如何影响到服务的功能,安全性,以及性能等问题。

Nova 关键配置

my_ip = 内网地址

此项是用来生成宿主机上的 nova metadata api 请求转发 iptables 规则,如果配置不当,会导致虚拟机内部无法通过 169.254.169.254 这个 IP 获取 ec2/OpenStack metadata 信息;生成的 iptable 规则形如:

-A nova-network-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j DNAT
--to-destination ${my_ip}:8775

 它另外的用途是虚拟机在 resize、cold migrate 等操作时,与目的端宿主机进行数据通信。该项的默认值为宿主机的外网 IP 地址,建议改为内网地址以避免潜在的安全风险。

metadata_listen = 内网地址

此项是 nova-api-metadata 服务监听的 IP 地址,可以从上面的 iptables 规则里面看出它与 my_ip 的配置项有一定的关联,保持一致是最明智的选择。

novncproxy_base_url = vncserver_proxyclient_address = ${private_ip_of_compute_host}
vncserver_listen = ${private_ip_of_compute_host}
novncproxy_host = ${private_ip_of_host}

 我们仅在部分节点上部署 novncproxy 进程,并把这些进程加入到 HAProxy 服务中实现 novnc 代理进程的高可用,多个 HAProxy 进程使用 Keepalived 实施 HAProxy 的高可用,对外只需要暴露 Keepalived 管理的虚拟 IP 地址即可:

这种部署方式好处是:

1)实现 novnc 代理服务的高可用

2)不会暴露云平台相关节点的外网地址

3)易于 novnc 代理服务的扩容

但也有不足:

1)虚拟机都监听在其所在的计算节点的内网 IP 地址,一旦虚拟机与宿主机的网络隔离出现问题,会导致所有虚拟机的 VNC 地址接口暴露出去

2)在线迁移时会遇到问题,因为 VNC 监听的内网 IP 在目的端计算节点是不存在的,不过这个问题 nova 社区已经在解决了,相信很快就会合入 J 版本。

resume_guests_state_on_host_boot = true

在 nova-compute 进程启动时,启动应该处于运行状态的虚拟机,应该处于运行状态的意思是 nova 数据库中的虚拟机记录是运行状态,但在 Hypervisor 上该虚拟机没有运行,在计算节点重启时,该配置项具有很大的用处,它可以让节点上所有虚拟机都自动运行起来,节省运维人员手工处理的时间。

api_rate_limit = false

不限制 API 访问频率,打开之后 API 的并发访问数量会受到限制,可以根据云平台的访问量及 API 进程的数量和承受能力来判断是否需要打开,如果关闭该选项,则大并发情况下 API 请求处理时间会比较久。

osapi_max_limit = 5000

nova-api-os-compute api 的最大返回数据长度限制,如果设置过短,会导致部分响应数据被截断。

scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, ComputeFilter, ImagePropertiesFilter, JsonFilter, EcuFilter, CoreFilter

nova-scheduler 可用的过滤器,Retry 是用来跳过已经尝试创建但是失败的计算节点,防止重调度死循环;AvailabilityZone 是过滤那些用户指定的 AZ 的,防止用户的虚拟机创建到未指定的 AZ 里面;Ram 是过滤掉内存不足的计算节点;Core 是过滤掉 VCPU 数量不足的计算节点;Ecu 是我们自己开发的过滤器,配合我们的 CPU QoS 功能开发的,用来过滤掉 ecu 数量不足的计算节点;ImageProperties 是过滤掉不符合镜像要求的计算节点,比如 QEMU 虚拟机所用的镜像不能在 LXC 计算节点上使用;Json 是匹配自定义的节点选择规则,比如不可以创建到某些 AZ,要与那些虚拟机创建到相同 AZ 等。其他还有一些过滤器可以根据需求进行选择。

running_deleted_instance_action = reap

nova-compute 定时任务发现在数据库中已经删除,但计算节点的 Hypervisor 中还存在的虚拟机(也即野虚拟机审计操作方式)后的处理动作,建议是选择 log 或者 reap。log 方式需要运维人员根据日志记录找到那些野虚拟机并手工执行后续的动作,这种方式比较保险,防止由于 nova 服务出现未知异常或者 bug 时导致用户虚拟机被清理掉等问题,而 reap 方式则可以节省运维人员的人工介入时间。

until_refresh = 5

用户配额与 instances 表中实际使用量的同步阈值,也即用户的配额被修改多少次后强制同步一次使用量到配额量记录

max_age = 86400

用户配额与实际使用量的同步时间间隔,也即距上次配额记录更新多少秒后,再次更新时会自动与实际使用量同步。

众所周知,开源的 nova 项目目前仍然有很多配额方面的 bug 没有解决,上面两个配置项可以在很大程度上解决用户配额使用情况与实际使用量不匹配的问题,但也会带来一定的数据库性能开销,需要根据实际部署情况进行合理设置。

### 计算节点资源预留 ###

vcpu_pin_set = 4-$

虚拟机 vCPU 的绑定范围,可以防止虚拟机争抢宿主机进程的 CPU 资源,建议值是预留前几个物理 CPU,把后面的所有 CPU 分配给虚拟机使用,可以配合 cgroup 或者内核启动参数来实现宿主机进程不占用虚拟机使用的那些 CPU 资源。

cpu_allocation_ratio = 4.0

物理 CPU 超售比例,默认是 16 倍,超线程也算作一个物理 CPU,需要根据具体负载和物理 CPU 能力进行综合判断后确定具体的配置。

ram_allocation_ratio = 1.0

内存分配超售比例,默认是 1.5 倍,生产环境不建议开启超售。

reserved_host_memory_mb = 4096

内存预留量,这部分内存不能被虚拟机使用

reserved_host_disk_mb = 10240

磁盘预留空间,这部分空间不能被虚拟机使用

service_down_time = 120

服务下线时间阈值,如果一个节点上的 nova 服务超过这个时间没有上报心跳到数据库,api 服务会认为该服务已经下线,如果配置过短或过长,都会导致误判。

rpc_response_timeout = 300

RPC 调用超时时间,由于 Python 的单进程不能真正的并发,所以 RPC 请求可能不能及时响应,尤其是目标节点在执行耗时较长的定时任务时,所以需要综合考虑超时时间和等待容忍时间。

multi_host = True

是否开启 nova-network 的多节点模式,如果需要多节点部署,则该项需要设置为 True。

Keystone

配置项较少,主要是要权衡配置什么样的后端驱动,来存储 token,一般是 SQL 数据库,也可以是 memcache。sql 可以持久化存储,而 memcache 则速度更快,尤其是当用户要更新密码的时候,需要删除所有过期的 token,这种情况下 SQL 的速度与 memcache 相差很大很大。

glance

包括两个部分,glance-api 和 glance-registry,:

workers = 2

glance-api 处理请求的子进程数量,如果配置成 0,则只有一个主进程,相应的配置成 2,则有一个主进程加 2 个子进程来并发处理请求。建议根据进程所在的物理节点计算能力和云平台请求量来综合确定。

api_limit_max = 1000

与 nova 中的配置 osapi_max_limit 意义相同

limit_param_default = 1000

一个响应中最大返回项数,可以在请求参数中指定,默认是 25,如果设置过短,可能导致响应数据被截断。

OpenStack 底层依赖软件版本、配置以及性能调优

虚拟化技术选型

在私有云平台的体系架构中, OpenStack 依赖一些底层软件,如虚拟化软件,虚拟化管理软件和 Linux 内核。这些软件的稳定性以及性能关系着整个云平台的稳定性和性能。因此,这些软件的版本选择和配置调优也是网易私有云开发中的一个重要因素。

在网易私有云平台中,我们选用的是 Linux 内核兼容最好的 KVM 虚拟化技术。相对于 Xen 虚拟化技术,KVM 虚拟化技术与 Linux 内核联系更为紧密,更容易维护。选择 KVM 虚拟化技术后,虚拟化管理驱动采用了 OpenStack 社区为 KVM 配置的计算驱动 libvirt,这也是一套使用非常广泛,社区活跃度很高的一套开源虚拟化管理软件,支持 KVM 在内的各种虚拟化管理。

另一方面,网易采用开源的 Debian 作为自己的宿主机内核,源使用的是 Debian 的 wheezy 稳定分支,KVM 和 libvirt 采用的也是 Debian 社区 wheezy 源里面的包版本:

qemu-kvm  1.1.2+dfsg-6+deb7u3
libvirt-bin  0.9.12

内核选型

在内核的选型方面,我们主要考虑如下两方面的因素:

  • 稳定性:在开发私有云平台的一开始,稳定性就是网易私有云开发的一大基本原则。我们采用 Debian Linux 版本,相对来说,Debian 的原生内核无疑更为稳定。这也是我们最开始的一个选择。
  • 功能需求:在网易的定制开发中,为了保证虚拟机的服务性能,我们开发了 CPU QoS 技术和磁盘 QoS,它依赖底层的 CPU 和 blkio cgroup 支持。因此,我们需要打开内核中的 cgroup 配置选项。另一方面,网易私有云综合各方面考虑,将支持 LXC 这种容器级别的虚拟化,除了 cgroup 外,LXC 还依赖 Linux 内核中的 namespace 特性。

综合上述因素的考虑,我们选择了 Debian 社区的 Linux 3.10.40 内核源代码,并且打开了 CPU/mem/blkio 等 cgroup 配置选项以及 user namespace 等 namespace 选项,自己编译了一个适配网易私有云的 Linux 内核。从使用情况来看,选择上述版本的 OpenStack 底层依赖软件后,网易私有云运行还比较稳定,我们后续还会适时的对这些软件进行更新。

配置优化

在网易私有云的稳定性得到了保障之后,我们开始了性能方面的调优工作。这一方面,我们参考了 IBM 公司的一些优秀实践,在 CPU、内存、I/O 等方面做了一些配置方面的优化。整体而言,网易私有云在注重稳定性的基础上,也会积极借鉴业界优秀实践来优化私有云平台的整体性能。

CPU 配置优化

为了保障云主机的计算能力,网易私有云开发了 CPU QoS 技术,具体来说就是采用 cfs 的时间片均匀调度,外加 process pinning 的绑定技术。

参考 IBM 的分析,我们了解到了 process pinning 技术的优缺点,并且经过测试也验证了不同绑定方式的云主机间的性能存在较大的差异。比如,2 个 VCPU 分别绑定到不同 numa 节点的非超线程核上和分配到一对相邻的超线程核上的性能相差有 30%~40%(通过 SPEC CPU2006 工具测试)。另一方面,CPU0 由于处理中断请求,本身负荷就较重,不宜再用于云主机。因此,综合上面的因素考虑以及多轮的测试验证,我们最终决定将 0-3 号 CPU 预留出来,然后让云主机在剩余的 CPU 资源中由宿主机内核去调度。最终的 CPU 配置如下所示(libvirt xml 配置):

1

    1024
    100000
    57499

内存配置优化

内存配置方面,网易私有云的实践是关闭 KVM 内存共享,打开透明大页:

echo 0 > /sys/kernel/mm/ksm/pages_shared
echo 0 > /sys/kernel/mm/ksm/pages_sharing
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag

经过 SPEC CPU2006 测试,这些配置对云主机 CPU 性能大概有 7%左右的提升。

I/O 配置优化

1)磁盘 I/O 的配置优化主要包含如下方面:

KVM 的 disk cache 方式:借鉴 IBM 的分析,网易私有云采用 none 这种 cache 方式。

disk io scheduler:目前网易私有云的宿主机磁盘调度策略选用的是 cfq。在实际使用过程中,我们发现 cfq 的调度策略,对那些地低配置磁盘很容易出现 I/O 调度队列过长,utils 100% 的问题。后续网易私有云也会借鉴 IBM 的实践,对 cfq 进行参数调优,以及测试 deadline 调度策略。

磁盘 I/O QoS:面对日渐突出的磁盘 I/O 资源紧缺问题,网易私有云开发了磁盘 I/O QoS,主要是基于 blkio cgroup 来设置其 throttle 参数来实现。由于 libvirt-0.9.12 版本是在 QEMU 中限制磁盘 I/O,并且存在波动问题,所以我们的实现是通过 Nova 执行命令方式写入到 cgroup 中。同时我们也开发并向 libvirt 社区提交了 blkiotune 的 throttle 接口设置 patch(已在 libvirt-1.2.2 版本中合入)来彻底解决这个问题。

2)网络 I/O 的配置优化

我们主要是开启了 vhost_net 模式,来减少网络延时和增加吞吐量。

运维经验

使用经验

  • 开 源软件 bug 在所难免,但是新版本比旧版本会好用很多,尤其是对于 OpenStack 这种正在迅速成长壮大的开源软件来说更是如此,这一点在我们使用过 Essex、Folsom 和 Havana 版本后深有体会,所以建议各种 OpenStack 用户能及时的跟进社区版本,与社区保持同步。
  • 不要轻易的对社区版本进行各类所谓的功能性能方面的”优化”,尤其是 在没有与社区专家交换意见之前,千万不要轻易下手,否则此类”优化”极有可能演变成故障点或者性能瓶颈点,最终可能导致无法与社区同步,毕竟一个公司或团 队(尤其是小公司、小团队)的能力和知识储备,是很难与社区成百上千的各类专家相提并论的。
  • 多参考各类大型公司分享的部署架构方案,尽量不要自己闭门造车,尤其是对于开源软件来说,各类公司、团队的使用场景千差万别,各种周边组件也是应有尽有,多参考业界实践是最好的方式。
  • 一些细节实现可能有很多途径,但每种方式都有优缺点,需要经过充分的论证、分析、测试验证后,才能考虑部署到生产环境使用。
  • 所有的部署方案、功能设计都要考虑到平滑升级问题,即使你得到的信息是升级时可以停服,仍然要尽量避免这种情况,因为停服的影响范围很难界定。

运维准则

OpenStack 也是一个后端系统服务,所有系统运维相关的基本准则都适用,这里简单的提几点实际运维过程中根据遇到的问题总结的一些经验:

  • 配置项默认值与实际环境不匹配可能导致各种问题,尤其是网络相关配置与硬件有很强的关联性,生产环境和开发环境硬件异构,导致部分默认值在生产环境不适用。应对准则:每个版本都必须在与线上硬件相同的环境测试过才能上线。
  • 做好容量规划,已分配的配额量要小于云平台总容量,否则会出现各种问题,导致运维开发耗费很多不必要的精力去定位分析问题。
  • 配置项过多容易出错,需要与开发人员一起仔细核对,上线时首先要通过 puppet 的 noop 功能验证改动是否正确后,才能真正上线。
  • 网络规划要提前做好,如固定 IP、浮动 IP、VLAN 数量等,网络扩容难度和风险都比较大,所以提前规划好是最保险的,一个原则是大比小好,多比少好。
  • 网络隔离要做好,否则用户网络安全没办法保证。
  • 信息安全问题要重视,这个是老生常谈的问题了,每个平台都有相同问题,但还是要重视再重视,一旦出现安全漏洞,所有虚拟机都面临严重威胁。

来源:http://www.ibm.com/developerworks/cn/cloud/library/1408_zhangxl_openstack/

Linux:Linux有问必答:如何修复"fatal error: jsoncpp/json/json.h: No such file…"

问题:我试着编译一个C++程序,但是我碰到了以下错误:

“fatal error: jsoncpp/json/json.h: No such file or directory”

我怎样修复这个问题呢?

Linux:Linux有问必答:如何修复"fatal error: jsoncpp/json/json.h: No such file..."
Linux:Linux有问必答:如何修复"fatal error: jsoncpp/json/json.h: No such file…"

该错误指出你缺少JsonCpp开发文件(例如,JsonCpp库和头文件)。JsonCpp是一个用于JSON格式数据复制的C++库。下面给出了在不同Linux发行版上安装JsonCpp开发文件的方法。

在Debian, Ubuntu或者Linux Mint上:

$ sudo apt-get install libjsoncpp-dev

在Fedora上:

$ sudo yum install jsoncpp-devel

在CentOS上,没有JsonCpp的预编译包。因此你可以通过以下源码构建一个JsonCpp包并安装。

$ sudo yum install cmake
$ git clone https://github.com/open-source-parsers/jsoncpp.git
$ cd jsoncpp
$ mkdir -p build/debug
$ cd build/debug
$ cmake -DCMAKE_BUILD_TYPE=debug -DJSONCPP_LIB_BUILD_SHARED=OFF -G "Unix Makefiles" ../../
$ make
$ sudo make install

via: http://ask.xmodulo.com/fix-fatal-error-jsoncpp.html

译者:GOLinux 校对:Caroline

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

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

Linux:在 Linux 中为非 SSH 用户配置 SFTP 环境

某些环境中,系统管理员想要允许极少数用户在可以传输文件到Linux机器中,但是不允许使用 SSH。要实现这一目的,我们可以使用SFTP,并为其构建chroot环境。

Linux:在 Linux 中为非 SSH 用户配置 SFTP 环境
Linux:在 Linux 中为非 SSH 用户配置 SFTP 环境

SFTP & chroot背景:

SFTP是指SSH文件传输协议(SSH File Transfer protocol)或安全文件传输协议(Secure File Transfer Protocol),它提供了可信数据流下的文件访问、文件传输以及文件管理功能。当我们为SFTP配置chroot环境后,只有被许可的用户可以访问,并被限制到他们的家目录中,换言之:被许可的用户将处于牢笼环境中,在此环境中它们甚至不能切换它们的目录。

在本文中,我们将配置RHEL 6.XCentOS 6.X中的SFTP Chroot环境。我们开启一个用户帐号‘Jack’,该用户将被允许在Linux机器上传输文件,但没有ssh访问权限。

步骤:1 创建组

[root@localhost ~]# groupadd  sftp_users

步骤:2 分配附属组(sftp_users)给用户

如果用户在系统上不存在,使用以下命令创建( LCTT 译注:这里给用户指定了一个不能登录的 shell,以防止通过 ssh 登录):

[root@localhost ~]# useradd  -G sftp_users  -s /sbin/nologin  jack
[root@localhost ~]# passwd jack

对于已经存在的用户,使用以下usermod命令进行修改:

[root@localhost ~]# usermod –G sftp_users  -s /sbin/nologin  jack

注意:如果你想要修改用户的默认家目录,那么可以在useradd和usermod命令中使用‘-d’选项,并设置合适的权限

步骤:3 现在编辑配置文件 “/etc/ssh/sshd_config”

# vi /etc/ssh/sshd_config
#comment out the below line and add a line like below
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
# add Below lines  at the end of file
  Match Group sftp_users
  X11Forwarding no
  AllowTcpForwarding no
  ChrootDirectory %h
  ForceCommand internal-sftp

此处:

  • Match Group sftp_users – 该参数指定以下的行将仅仅匹配sftp_users组中的用户
  • ChrootDirectory %h – 该参数指定用户验证后用于chroot环境的路径(默认的用户家目录)。对于用户 Jack,该路径就是/home/jack。
  • ForceCommand internal-sftp – 该参数强制执行内部sftp,并忽略任何~/.ssh/rc文件中的命令。

重启ssh服务

# service sshd restart

步骤:4 设置权限:

[root@localhost ~]# chmod 755 /home/jack
[root@localhost ~]# chown root /home/jack
[root@localhost ~]# chgrp -R sftp_users /home/jack

如果你想要允许jack用户上传文件,那么创建一个上传文件夹,设置权限如下:

[root@localhost jack]# mkdir /home/jack/upload
[root@localhost jack]# chown jack. /home/jack upload/

步骤:5 现在尝试访问系统并进行测试

尝试通过ssh访问系统

正如下图所示,用户jack通过SFTP登录,而且因为chroot环境不能切换目录。

现在进行上传和下载测试,如下图:

Linux:在 Linux 中为非 SSH 用户配置 SFTP 环境
Linux:在 Linux 中为非 SSH 用户配置 SFTP 环境

正如上图所示,jack用户的上传下载功能都工作得很好。


via: http://www.linuxtechi.com/configure-chroot-sftp-in-linux/

原文作者:Pradeep Kumar

译者:GOLinux 校对:wxy

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

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

Linux:前置逗号之争!

Linux:前置逗号之争!
Linux:前置逗号之争!

个人认为Airbnb的javascript代码规范是写的比较好的, 不过其中有一章关于逗号Commas的使用是这样写的:前置逗号(Leading commas):不要使用

// bad
var once
  , upon
  , aTime;
// good
var once,
    upon,
    aTime;
// bad
var hero = {
    firstName: 'Bob'
  , lastName: 'Parr'
  , heroName: 'Mr. Incredible'
  , superPower: 'strength'
};
// good
var hero = {
  firstName: 'Bob',
  lastName: 'Parr',
  heroName: 'Mr. Incredible',
  superPower: 'strength'
};

其实在很多开源软件中前置逗号是经常使用的,它是Haskell语言默认的代码风格。

Node.JS的前负责人isaacs(现npmjs.org负责人,参见:下一阶段的NodeJS) 写过一篇文章,讨论将逗号写在前面的优缺点。讨论中尽管很多人无法适应comma-first。但其中有一条优点无法回避,逗号前移可以很容易发现语法错误。

下段代码的d变量名后面少了一个逗号,这是我们经常犯的一个错误,在一般代码风格中,这个错误是非常不容易被发现的:

// error in standard style
var a = "ape",
    b = "bat",
    c = "cat",
    d = "dog"
    e = "elf",
    f = "fly",
    g = "gnu",
    h = "hat",
    i = "ibu";

但在前置代码规范中,一眼就可以看得出来: 

// error in comma-first style
var a = "ape"
  , b = "bat"
  , c = "cat"
  , d = "dog"
  e = "elf"
  , f = "fly"
  , g = "gnu"
  , h = "hat"
  , i = "ibu"
  ;

前置逗号与”.”的连续型写法或者叫做链式写法(可能还有”+”)是保持一致的,如:

jQuery
  .ajax('//home/url')
  .done(function() {
  })
  .error(function() {
  })
  .always(function() {
  })

前置逗号在最后新增删除变量时只需要影响一行。而无需删除或添加原来最后一个变量的结束符号。并且前置写法,2个空格的tab即可将变量对齐,2个space可使代码更紧凑。传统写法,需要4个空格的tab才能使变量对齐。

var a = "ape"
  , b = "bat"
  , c = "cat"
  , d = "dog"
  , e = "add new line"  //只影响的一行(添加或删除)
  ;
var a = "ape",
    b = "bat",
    c = "cat",
    d = "dog",
    e = "add new line"; //删除此行时需要将前一行d的最后一个逗号同时删除,此时会影响两行;新加时同时删除原有的分号,并换成逗号。此时即易发生输入错误。

另外在Twitter的bootstrap框架中,每个变量都使用var来声明,不用连续声明的方式。而且默认不用分号结束的:

这种格式的代码看上去也比较优美,同时避免了关于逗号的争论:

var a = "ape"
var b = "bat"
var c = "cat"

其实省略分号也是可以借鉴的,所以本文认为比较好的逗号格式应该是这样的:

var one
  , two
  , three
var prop = {
    a: 'a'
  , b: 'b'
  , c: 'c'
  , d: 'd'
}

负作用

其实省略分号也有负用,在与闭包结合时会有一些问题,如下段代码:

var a = 1
(function() {
  console.log(a)
})()
// TypeError: number is not a function

 一个错误抛出了,在JS解释执行时,很可能将之合成了1行。

var a = 1 (function() { console.log(a) })()

错误就产生了,所以很多开源框架都会在闭包前置或后置分号,以避免前人无意或故意遗漏分号从而造成错误,正确的写法应该是:

var a = 1
;(function() {
  console.log(a)
})()

不使用分号的bootstrap框架也是这么干的,不过bootstrap框架使用了看上去更加高级的+号分隔闭包并后置分号,不过这一套不适合代码与闭包混合使用的场景,还是不要学比较好。

var a = 1
+ function() {
  console.log(a)
} ();
//a 的值会变成 NaN

 

来源:http://ourjs.com/detail/53f7ffabc1afbc6e3000000a

Linux:Linux有问必答:如何检查PDF中使用了哪种字体

问题:我想要知道PDF文件中使用了什么字体,或者嵌入了什么字体。Linux中有工具可以检查PDF文档中使用了哪种字体吗?

要检查PDF文件中包含了,或者使用了什么字体,你可以使用命令行工具:pdffonts,它是一个PDF字体分析工具。pdffonts是Poppler PDF工具集包中的一个部分。

Linux:Linux有问必答:如何检查PDF中使用了哪种字体
Linux:Linux有问必答:如何检查PDF中使用了哪种字体

安装PDF工具集到Linux

要安装Poppler到Debian,Ubuntu或Linux Mint:

$ sudo apt-get install poppler-utils

要安装PDF工具集到Fedora,CentOS或RHEL:

$ sudo yum install poppler-utils

检查PDF字体

pdffonts可以列出PDF文档中使用的所有字体。pdffonts的基本用法如下。

$ pdffonts doc.pdf

pdffonts工具显示了各个已使用的字体的各种信息,如字体名称/类型,或者字体是否内嵌等等。

如果一个PDF文档有多页,你可以使用“-f”(首页)和“-l”(末页)选项来限制字体扫描页面范围。例如,如果你想要找出某个文档中的5-10页中使用了哪种字体,运行该命令:

$ pdffonts -f 5 -l 10 doc.pdf

via: http://ask.xmodulo.com/check-which-fonts-are-used-pdf-document.html

译者:GOLinux 校对:wxy

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

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

Linux:Linux 内核测试和调试(5)

仿真环境下进行 Linux 电源管理子系统测试

Linux 电源管理子系统在仿真环境下提供5种测试方式。这些方式仅仅在内核各层之间运行休眠的代码而不是真正的让系统进入休眠状态。有些平台不能挂起系统,比如说我们需要模拟飞机的飞行环境,这时候使用这种仿真环境就非常有用处了。

Linux:Linux 内核测试和调试(5)
Linux:Linux 内核测试和调试(5)

freezer – 测试停掉处理器:

echo freezer > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

devices – 测试停掉处理器以及挂起设备:

echo devices > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

platform – 测试停掉处理器、挂起设备以及平台全局控制方法(*)

echo platform > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

processors – 测试停掉处理器、挂起设备和平台全局控制方法(*),以及关闭未启动的 CPU。

echo processors > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

core – 测试停掉处理器、挂起设备和平台全局控制方法(*),关闭未启动的 CPU,以及挂起平台或系统的设备。注意:这个测试模式运行在 ACPI 系统。

echo core > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

Linux 电源管理子系统追踪事件

电源管理子系统在运行过程中支持多种追踪点和追踪事件。我将对如何使用这些追踪时间以及如何找到追踪信息作一个简单的介绍:

在运行时开启电源管理事件:

cd /sys/kernel/debug/tracing/events/power
echo 1 > cpu_frequency/enable
cat /sys/kernel/debug/tracing/set_event
less /sys/kernel/debug/tracing/trace

为内核启动的命令添加一个参数:

trace_event=cpu_frequency

更多信息查看 Documentation/power/basic-pm-debugging.txt 以及同目录下其他的文档。

git bisect 命令

git bisect 是一个非常有用非常强大的工具,用于将 git 上的一个 commit 分离出来。我简单过一遍它的用法。

下面是 git bisect 的用法:

git bisect start
git bisect bad   # 当前版本是坏的
git bisect good v3.14-rc6   # 上个版本是好的

一旦指定好好的版本和坏的版本,git bisect 就会开始把好坏两个版本之间的所有 commit 对半分,并将其中的一半提交 pull 下来。然后重新编译安装测试内核,并标记这个内核是好是坏。重复这个过程,知道某个你选好的 commit 被标记被好或者坏。我们可能需要测试多个内核版本,测到最后一个版本时,git bisect 会将一个 commit 标记为坏。下面的命令可以在 git bisect 分析过程中起到帮助作用:

查看 bisect 操作的过程:

git bisect log

重置 git bisect,标记错误时可以用到,保存 git log 的输出,重新操作上一次 bisect 的步骤:

git bisect reset

重放 git bisect 操作过程:

git bisect replay git_log_output

如果一个问题很清楚是在某个区域内,git bisect 命令可以定位到一个具体的内核源码树枝干上。举个例子,在调试一个镭龙显卡驱动的问题时,为 git bisect 指定 drivers/drm/radeon 参数,可以让 git bisect 只检索对 drivers/drm/radeon 里面的文件有修改的 commit。

让 git bisect 只检索内核树的某个枝干:

git bisect start drivers/drm/radeon

via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,4

译者:bazz2 校对:wxy

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

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

Linux:Linux系统中使用 DD 命令测试 USB 和 SSD 硬盘的读写速度

Linux:Linux系统中使用 DD 命令测试 USB 和 SSD 硬盘的读写速度
Linux:Linux系统中使用 DD 命令测试 USB 和 SSD 硬盘的读写速度

磁盘驱动器速度

磁盘驱动器的速度是以一个单位时间内读写数据量的多少来衡量的。DD 命令是一个简单的命令行工具,它可用对磁盘进行任意数据块的读取和写入,同时可以度量读取写入的速度。

在这篇文章中,我们将会使用 DD 命令来测试 USB 和 SSD 磁盘的读取和写入速度。

数据传输速度不但取决于驱动盘本身,而且还与连接的接口有关。比如, USB 2.0 端口的最大传输速度是 35 兆字节/秒,所以如果您把一个支持高速传输的 USB 3.0 驱动盘插入 USB 2.0 端口的话,它实际的传输速度将是 2.0 端口的下限。

这对于 SSD 也是一样的。 SSD 连接的 SATA 端口有不同的类型。平均是 375 兆字节/秒的 SATA 2.0 端口理论上最大传输速度是 3 Gbit/秒,而 SATA 3.0 是这个速度的两倍。

测试方法

挂载上驱动盘,从终端进入此盘目录下。然后使用 DD 命令,首先写入固定大小块的一个文件,接着读取这个文件。

DD 命令通用语法格式如下:

dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks

当写入到驱动盘的时候,我们简单的从无穷无用字节的源 /dev/zero 读取,当从驱动盘读取的时候,我们读取的是刚才的文件,并把输出结果发送到无用的 /dev/null。在整个操作过程中, DD 命令会跟踪数据传输的速度并且报告出结果。

固态硬盘

我们使用的是一块“三星 Evo 120G” 的固态硬盘。它性价比很高,很适合刚开始用固态硬盘的用户,也是我的第一块固态硬盘,并且也是市场上效果最好的固态硬盘之一。

这次实验中,我们把硬盘接在 SATA 2.0 端口上。

写入速度 ####

首先让我们写入固态硬盘

$ dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s

的大小实际上是相当大的。你可以尝试用更小的尺寸如 64K 甚至是 4K 的。

读取速度

现在读回这个文件。但是,得首先清除内存的缓存,以确保这个文件确实是从驱动盘读取的。

运行下面的命令来清除内存缓存

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

现在读取此文件

$ dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s

在 Arch Linux 的维基页上有一整页的关于不同的厂商,如英特尔、三星、Sandisk 等提供的各类固态硬盘 读/写速度的信息。点击如下的 url 可以查看相关信息。

https://wiki.archlinux.org/index.php/SSD_Benchmarking

USB

此次实验我们会测量普通的 USB/随身笔的读写速度。驱动盘都是接入标准的 USB 2.0 端口的。首先用的是一个 4GB 大小的 sony USB 驱动盘,随后用的是一个 16GB 大小的 strontium 驱动盘。

首先把驱动盘插入端口,并挂载上,使其可读。然后从命令行下面进入挂载的文件目录下。

Sony 4GB – 写入

这个实验中,用 DD 命令向驱动盘写入一个有 10000 块,每块 8K 字节的文件。

# dd if=/dev/zero of=./largefile bs=8k count=10000
10000+0 records in
10000+0 records out
81920000 bytes (82 MB) copied, 11.0626 s, 7.4 MB/s

因此,写入速度约为7.5兆字节/秒。这是一个很低的数字。

Sony 4GB – 读取

把相同的文件读取回来,测试速度。首先运行如下命令清除内存缓存。

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

现在就可以使用 DD 命令来读取文件了。

# dd if=./largefile of=/dev/null bs=8k
8000+0 records in
8000+0 records out
65536000 bytes (66 MB) copied, 2.65218 s, 24.7 MB/s

读取速度出来大约是25兆字节/秒,这大致跟廉价 USB 驱动盘的标准相匹配吧。

USB2.0 理论上最大信号传输速率为480兆比特/秒,最小为60兆字节/秒。然而,由于各种限制实际传输速率大约280兆比特/秒和35兆字节/秒之间。除了这个,实际的速度还取决于驱动盘本身的质量好坏以及其他的因素。

上面实验中, USB 驱动盘插入USB 2.0 端口,读取的速度达到了 24.7兆字节/秒,这是很不错的读速度。但写入速度就不敢恭维了。

下面让我们用 16GB 的 Strontium 驱动盘来做相同的实验。虽然 Strontium 的 USB 驱动盘很稳定,但它也是一款很便宜的品牌。

Strontium 16gb 盘写入速度

# dd if=/dev/zero of=./largefile bs=64k count=1000
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 8.3834 s, 7.8 MB/s

Strontium 16gb 盘读取速度

# sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
# dd if=./largefile of=/dev/null bs=8k
8000+0 records in
8000+0 records out
65536000 bytes (66 MB) copied, 2.90366 s, 22.6 MB/s

它的读取速度就要比 Sony 的低了。

参考资料


关于 Silver Moon

Php 开发者, 博主 和 Linux 爱好者. 通过 m00n.silv3r@gmail.com 或者 Google+ 可联系到他。

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

Linux:如何让你的JavaScript代码更加语义化

语义化这个词在 HTML 中用的比较多,即根据内容的结构化选择合适的标签。其作用不容小觑:

  • 赋予标签含义,让代码结构更加清晰,虽然我们可以在标签上添加 class 来标识,但这种通过属性来表示本体的形式会显得不够直接,而且在一定程度上也有冗余。
  • 优化搜索引擎(SEO),结构良好的网页对搜索引擎的亲和力是很高的,百度和 google 也给出了很多网页结构化的建议(规范),方便他们抓取网页。
  • 利于设备解析,如盲人阅读器对页面的分析,目前淘宝很多网页都是支持盲人阅读的,这种体验上的优化得利于网页的良好结构和语义化表达。
  • 便于开发者维护,在参加工作之前,很多程序员都是单人开发模式,单人开发无所谓代码结构,自己看得懂就差不多了,一旦走向工作岗位,会发现,以前的鄙习有点让自己捉襟见肘了。

W3C Group 工作组在 web 规范上持续贡献,他们的目标也是期望整个互联网的发展态势稳定统一起来。不扯远了,回到本文需要阐述的重点:如何语义化 JavaScript 代码?

Linux:如何让你的JavaScript代码更加语义化
Linux:如何让你的JavaScript代码更加语义化

一、先看看那些不易读懂的 JavaScript 代码

1. 判断

// 数据类型判断
if(Object.prototype.toString.call(str) === “[object String]”){
    // doSomething();
};
// 文件类型判断
if(/.*.css(?=?|$)/.test(“/path/to/main.css”)){
    // doSomething();
}

2. 清空一个队列

var Queue = ["test1", "test2", "test3"];
// 常见方式
Queue.length = 0;
Queue = []; 

3. 注册一个变量

// 注册
var repos = {};
repos[“a”] = {
   name: “a”,
   content: {}
};
repos[“b”] = {
   name: “b”,
   content: {}
};

上面几个例子倒不至于看不懂,程序都特别简单,第一个例子中,我们通过 Object 原型链上的 toString 方法来判断一个变量是否为 string 类型,以及使用正则来判断一个文件是不是 css 文件。代码写起来比较轻松,倘若我们同时需要判断多个对象是否为多个类型中的一种呢?再比如我们需要在一串代码中提取 require 依赖关系呢,是否应该思考下如何组织自己的代码?

在第二个例子中,将数组的长度设置为 0,或者使用空数组来重置这个变量,都是十分常见的方式,但目前的场景是清空一个队列,我们是否可以使用更加语义化的形式来呈现?比如我们只需要清空该队列的前五个和后三个 item 呢?

第三个例子中,变量的注册,把一堆注册放在一起,上面的形式确实也是一目了然,如果 a b c d 等都是分隔穿插在几百行代码之间呢?突然来个 repos[“x”] 这样是否显得有些不太直观。

为了说明本文所倡导的思想,上面的几个解释都有些含糊和牵强,请往下看。

二、提高代码语义性

针对上述三个案例,用更加语义化的方式来呈现代码:

1. 语义化变量

// 类型判断
function isType(type){
    return function(o){
        return Object.prototype.toString.call(o) === '[object ' + type + ']';
    }
}
var isString = isType(“String”);
var isObject = isType("Object");
var isArray = isType("Array");
isString("I'm Barret Lee.");
isArray([1,2,3]);
isObject({});

我觉得不需要太多的解释,对比

if(Object.prototype.toString.call(str) === “[object String]”){
    // code here...
}

显得清新多了吧。

// 提取常量
var isCss = /.*.css(?=?|$)/;
isCss.test(“/path/to/main.css”);

不管 isCss 这个正则代码有多长,当我们看到 isCss 这个单词就可以顾名思义。很多人写正则都不会将正则单独提取出来使用某个有意义的变量去存储,加注释还好,要是不加注释,后续开发者就只能硬着头皮看懂正则去理解代码的含义。

这样的处理,实际上是增加了代码量,不过从工程角度去审视,有助于提高开发效率以及代码的组织性。

2. 语义化行为

var Queue = ["test1", "test2", "test3"];
Queue.splice(0, Queue.length);

上面代码具有很强的语义性,从索引为 0 的地方开始,直到队列最后,删除 Queue 中所有的 item。这种写法的扩展性也更好:

Queue.splice(2, 4); // 删除从索引为 2,往后的 4 个元素

这只是个小例子,有些行为是需要很多代码组合处理的,如果没有很好的组合同一行为的代码,整个结构就显得十分涣散,不利于阅读。

// 注册
var repos = [];
function register(o){
   repos[o.name] = o;
}
register({
  name: “a”,
  content: {}
});

对比我们之前

repos[“a”] = {
   name: “a”,
   content: {}
};

语义化程度是不是有所提高~

三、小结

代码的优化,需要考虑的维度很多。但是代码的优化并不是减少代码量,有的时候我们需要增加代码来提高代码的可阅读性。

  • 正确标记变量
  • 封装某个动作
  • 注意函数的写法
  • 不容易理解的东西,加注释

本文为抛砖引玉,希望可以触发你对代码优化的敏感度的思考,写出一手别人竖拇指的代码~

来源:http://www.cnblogs.com/hustskyking/p/javascript-semantization.html

Linux:怎样在ubuntu 14.04上安装轻量级的Budgie桌面

如果你在推特上关注了我们,你可能看见了我们最近分享的一张截图,和这张截图一起的还有对它所展示的桌面进行命名的邀请。

你猜对了吗? 答案就是Budgie —— 一种为基于openSUSE 的linux发行版Evolve OS所设计、但不仅仅只能用于 Evolve OS的简易桌面环境。

Linux:怎样在ubuntu 14.04上安装轻量级的Budgie桌面
Linux:怎样在ubuntu 14.04上安装轻量级的Budgie桌面

我们第一次提到Budgie是在三月份,当时我们被它的整洁、小巧的美感、灵活的架构,还有再次使用在当今大多数发行版中所使用的GNOME 3.10 成熟技术中的公共部分和标堆栈的决定所折服。

我对此项目的领导者Ikey Doherty所作出的开发选择非常佩服。无可否认另起炉灶有它的优点,但决定从上游的项目获取帮助将可以整个项目进展得更快,无论是在发展方面(更轻的技术负担)还是在用户可使用方面(更容易在其它发行版上运行)。

除了政治因素选择以外,这款桌面干净、小巧,向谷歌Chrome OS的Ash桌面致敬。如果你不介意有些许粗糙的边缘,那它值得你玩玩。那么怎样在Ubuntu安装Budgie呢?

非官方的PPA是不正式的

开源意味着如果你有一点终端使用知识的话,你就可以在获得Budgie桌面的源代码后进行编译,然后运行。

但如果你很懒,想不费周折就在Ubuntu 14.04 LTS(或者一个基于它的发行版)运行Budgie,那么你可以通过比较容易的途径来实现。

只要添加一个非官方的PPA,刷新你的软件源然后进行安装。几分钟后在这个家庭中你将有一位名叫Bob的新叔叔,并且有一个新的桌面可以玩耍。

添加Budgie PPA

将以下命令复制进一个打开的终端窗口,在提示过后输入你的密码(如果需要的话):

sudo add-apt-repository ppa:sukso96100/budgie-desktop
sudo apt-get update && sudo apt-get install budgie-desktop

登入Budgie会话

安装完成后你就可以在Unity欢迎界面的会话选择器中选择“Budgie”了。(别忘了以后要把选择项改回到稳定的桌面环境)

注意

budgie是不稳定、不完善的,并且它在Ubuntu上也没有被正式支持。它正在积极开发中,功能还仍然有些缺失,包括但不仅限于:不支持网络管理,没有音量控制小程序(键盘按键工作良好),没有通知系统,无法将应用程序“固定”在任务栏。

它对UBUNTU的叠加滚动条、一些GTK主题的支持也不是很好,而且在使用upstart的发行版(例如ubuntu,即使它正在改变之中)中会话管理器(例如,注销,重启等等)将无法工作。

一个应变方法是:禁用叠加滚动条,设置一个默认主题,通过在终端中使用以下命名来退出会话:

gnome-session-quit

脑海中有了上述这些警告后,我得建议那些自己的理智倾向于使用稳定、可靠的系统的人现在暂时不要使用它。

而剩下那些狂热的业余爱好者们呢?好吧,请在下面留言告诉我们你觉得它如何。我给Bob让路。


via: http://www.omgubuntu.co.uk/2014/07/install-budgie-evolve-os-desktop-ubuntu-14-04

译者:Love-xuan 校对:reinoir

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

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