Skip to content Skip to main navigation Skip to footer

Linux

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

在Ubuntu 13.04 Raring Ringtail安装完成之后,我们还有三十项调整需要进行。

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

1、Ubuntu 13.04 Raring Ringtail安装完毕后,我又进行了一系列工作

大家想知道Ubutnu最新版本带来哪些新内容吗?我认为其中引发讨论最多的话题在于,与前代版本相比(即12.10’Quantal Quetzal’)新系统的性能表现并不理想。它不仅延迟明显,而且存在严重的稳定性问题。Raring Ringtail也并不在黄油计划的适用范围之内。但无论如何,Ubuntu 13.04带来了大量改进是毋庸置疑的。

性能优势(至少对我来说)正是Linux系统最重要的特性。不过我们完全可以通过一系列措施进一步改善Ubuntu的全局性能表现。另外一些调整则是我们必须要做的,这些基础操作对日常使用而言意义重大。下面我们书归正传。我希望能在这篇文章中尽量囊括所有细节,以保证即使是刚刚入门的新手也能在它的帮助下实现系统调整。这三十项调整在系统安装结束后将为Ubutnu 13.04 Raring Ringtail带来新一轮显著提升。

2、重中之重:在安装过程中安装Ubuntu受限附加工具

从Ubuntu 11.04版本开始,我们就可以在Ubuntu操作系统本身的安装过程中同时安装受限解码包(其中包括Adobe Flash、MP3解码器等)。

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

大家需要注意上方对话框截图中箭头指向的位置。如果大家在Ubuntu安装过程中将两者全部勾选上(请在勾选之前确保设备已经与互联网正确连接),受限附加包将会自动进行安装,我们也就可以在系统安装完成后随时播放MP3、MP4等格式的媒体文件并观看flash视频(例如YouTube视频)。

但这个环节也可能出现问题。如果大家当前互联网连接响应缓慢(当然这种情况目前比较罕见),在以上截图所示界面中勾选可能会令安装过程变得极为漫长。我个人更偏向在Ubuntu安装完成之后再安装附加组件。如果大家跟我一样,那么请关注下面两项内容。

3、更新资料库

在完成了Ubuntu 13.04的全新安装流程之后,大家首先要做的就是更新资料库以确保自己安装了所有最新更新。

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

在Unity Dash中搜索软件更新工具并启用该应用程序。它会自动检查所有可用更新并完成安装工作。

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

或者大家也可以利用命令行实现这一点。打开终端(在Ubuntu 13.04中,对应快捷键为Ctrl + Alt + T),并将以下内容粘贴到终端界面当中。

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

在系统提示中输入密码,一切就大功告成了。我们的全新Ubuntu 13.04已经成功搞定更新与升级工作。

4、安装Ubuntu受限附加组件

安装”ubuntu-restricted-extras”软件包。这将使我们的Ubuntu获得播放mp3、avi、flash视频等流行文件格式的能力。点击此处(直接从Ubuntu软件中心处安装)或者将以下命令行内容粘贴到终端界面内实现软件包安装(如果我们在之前的系统安装过程中进行过勾选,这部分内容则可以忽略)。

sudo apt-get install ubuntu-restricted-extras 

完成。

5、在Ubuntu 13.04中启用完整的DVD播放功能

尽管安装受限附加软件包能很好地解决问题,但大家可能仍然无法在Ubuntu中播放双层DVD光盘。大多数商用DVD光盘受到CSS(即内容加扰系统)的加密保护,旨在通过限制手段阻碍用户利用软件播放DVD。

为了解决这个问题,我们需要从ubuntu媒体库中找出libdvdcss2软件包并进行安装。将下列内容粘贴到终端界面即可

sudo wget --output-document=/etc/apt/sources.list.d/medibuntu.list http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list && sudo apt-get --quiet update && sudo apt-get --yes --quiet --allow-unauthenticated install medibuntu-keyring && sudo apt-get --quiet update
sudo apt-get install libdvdcss2 

整个过程需要一段时间才能完成,请耐心等待。

6、检查专有硬件驱动程序的可用性 

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

自”Quantal Quetzal”开始,Additional Drivers不再是Ubuntu系统中的独立应用程序。在Ubuntu 13.04中,Additional Drivers功能成为软件与更新(原先被称为软件源)中的新标签。

根据我的个人实例,包括图形、音频以及无线驱动程序在内的硬件驱动都会自动启用。不过大家的实际使用情况可能会有所不同。

如果大家碰巧比较倒霉,请打开Unity Dash(Ubuntu 13.04的快捷键为Super键,对应Windows系统的Win键)并搜索”Software & Updates(软件与更新)”应用。

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

检查所有可用的额外驱动程序,并激活需要的项目。在大多数情况下,这样处理都能保证设备正常运行。如果我们暂时找不到硬件所需要的驱动程序,不妨到ubuntuforums以及askubuntu等论坛上寻找答案,相信能顺利解决问题。

7、Unity Tweak Tool:Ubuntu系统中一款令人赞叹的调整工具

在调整Unity方面,恐怕没有比它更好的选择了。即使是默认的Ubuntu Settings应用也无法与Unity Tweak Tool相媲美。

在Ubuntu 13.04中,Unity Tweak Tool已经默认包含在资源库当中。在Ubuntu 13.04 “Raring Ringtail”中安装Unity Tweak Tool,Unity Tweak Tool中提供多种细节调整选项,我们将在后文中进一步加以讨论。

8、在顶部面板中显示当前日期

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

这部分内容似乎无关紧要,但多年来我一直会在安装了新Ubuntu系统后进行调整。

在默认情况下,屏幕上方只会显示当前时间。打开时间与日期设定,我们可以通过修改将当前日期与星期显示在时间旁边。

9、在Unity Dash中禁用在线搜索结果

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

Unity Dash中的在线搜索结果虽然听起来是个好主意,但实际使用起来却完全不是那么回事。它会将Dash搜索过程变得非常缓慢(至少我个人感觉是这样)。

大家可以打开系统设定应用找到隐私项,把在线搜索结果禁用掉。

10、在Unity Dash中禁用记录活动选项

Linux:三十项调整助力 Ubuntu 13.04 更上一层楼
Linux:三十项调整助力 Ubuntu 13.04 更上一层楼

在默认情况下,Ubuntu会记录下用户的各项操作,用于对Unity等机制进行搜索优化。我们可以通过访问系统设定应用中的隐私项将其完全禁用。

如果不想彻底禁用记录功能,我们还可以选择禁用针对特定文件的操作记录,例如图片、文本及视频等等(我个人比较倾向这种做法)。

Linux:Linux和Windows上流行的脚本语言

具备脚本知识的系统管理员与其他系统管理员有着明显的区别。

脚本是一门“系统管理员”创造的艺术。这门艺术需要了解系统本身的相关知识,系统管理命令的语法,编程和算法知识以及至少一门脚本编程语言。对系统管理员来说编写脚本有很多选择,每种脚本语言都有着自己独特的语法和优点。脚本语言之间几乎没有相似之处,但也不会像外星语那样难以读懂。脚本语言既可用来管理系统,也可以用做web开发。有基于服务端,也有基于客户端的脚本语言。客户端脚本语言大多数用来在浏览器里显示内容以及与用户进行交互。服务器端脚本语言通常用来管理系统或web服务。

本文中,我们只会关注那些用作系统管理的脚本语言。让我们开始吧!

关于脚本应该知道的事情:

• 脚本应该可以作为独立的命令执行,或者可以在终端命令行接口下使用脚本语言的二进制文件调用。

• 如果是可执行脚本,应该在开头写出下面这行特殊的代码:

#!/path/of/the/cli

例如bash

#!/bin/bash

或者perl

#!/usr/bin/perl

‘#!’这个符号代表了执行该脚本需要调用的程序。

Bash

在Linux和UNIX世界里,bash脚本的数量最多。正如我们在很多文章中提到的那样,bash也是最受到大家喜爱的。

基本上,bash是一个具有解释功能的命令行shell。它能够用作编程并且满足大多数的基本编程需求。在使用变量之前无需声明,也不需要知道变量的类型。它的缺点在于,使用bash没有其他的库可以利用。你可以使用的只有/bin/bash (或 /bin/sh)。当你声明一个变量时,你无需在前面使用$符号,但是在使用时你需要在前面加上$表明它是一个“变量”。

bash非常容易编写,Linux、UNIX以及安装了cgywin程序的Windows都带有bash。如果你身为一名系统管理员但是不会bash脚本编程,你最好马上开始学习。《10本适合于系统管理员的最佳书籍》这篇文章里列举了很多好的参考书。下面是一段简单的bash脚本。

#!/bin/bash
USER=$1
echo "Adding User $USER in group users..."
/usr/sbin/useradd -g users $USER
if [ $? == 0 ]; then
        /usr/bin/passwd $USER
else
        echo "Sorry, User addition failed"
fi

Perl

基本上,perl可以看做UNIX和Windows系统上的(图灵)完备编程语言。perl的含义是实用报表提取语言(Practical Extraction and Report Language)。Perl是一种通用编程语言,起初开发perl是用于文字处理,现在的使用范围非常广泛,包括系统管理、web开发、网络编程、甚至GUI开发等许多场合。

它的优点是易于使用且同时支持面向过程和面向对象编程。perl是模块化的,易于调用第三方模块。尽管设计的目标是图灵完备的编程语言,但是自1993年面世开始perl一直被用作编写系统管理脚本。perl既支持编译也可以解释执行,因此perl比bash脚本更安全。当错误发生时,bash脚本并不知道;然而,如果在执行之前编译过程中有任何错误发生perl会拒绝启动执行。

一段小的perl脚本会让你体会perl语言的风格。#之后的内容是注释。这段脚本会创建一个包含1000个随机数的数组,每个随机数包含16个数字:

#!/usr/bin/perl
my @numbers;
srand (time);
for ($i=0; $i<1000; $i++)
{
$a=int 10000000000*rand();
$b=int 10000000000*rand();
$c = $a . $b;
push @numbers,substr($c,0,16)."n";
}
print @numbers;

PHP

大家都知道PHP“通常”被用作web网站开发,但是它也可以像perl一样执行系统管理任务。这就是为什么很多系统管理员使用PHP完成cron任务和其他脚本工作。虽然与perl功能相似,但是PHP的目标是生成HTML标准输出。通常它会被嵌入在web服务器程序中运行。命令行版本的PHP支持脚本编程。

类似上面perl示例,同样功能的PHP脚本如下:

#!/usr/bin/php
function make_seed()
{
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
srand (make_seed());
for ($i=0; $i<1000; $i++)
{
$a=rand(1000000000,9999999999);
$b=rand(1000000000,9999999999);
$c = $a . $b;
$numbers[]=substr($c,0,16);
}
for ($i=0; $i<1000;$i++)
echo "$numbers[$i]n";

Python

很明显,我们是在讨论脚本语言而不是亚马逊丛林里的某种动物。python是通用高级编程语言,它强调代码的可读性。python的语法非常简洁且富有表现力。与perl类似,python也有很多的扩展库。尽管python具备函数式编程的能力,但是大多数时候它被看作一门面向对象语言。web开发方面,python被用来开发Apache项目的mod_wsgi模块。如今,大多数Linux和UNIX发行版本都包含了python,作为脚本语言的一种很多系统工具采用python进行开发。python也支持为GUI环境编写代码。

下面是一段简单的python代码:

health = 10
trolls = 0
damage = 3
while health >0:        #!= 0:
  trolls += 1
  health = health - damage
  print " " ,"but takes", damage, "damage points.n"
  print " ", trolls, "trolls."

sed

sed是一个Unix文本解析工具,它提供一种编程语言可用来对文本解析和转换。sed是流编辑器(Stream Editor)的缩写,基本上是一个运行飞快的文本编辑器。sed不提供任何交互环境进行文件编辑。它逐行读取内容,对读取的内容执行命令行指定的操作即sed脚本,然后输出执行结果。你可以对文件用sed快速执行文本操作。最近perl被用来处理同样的工作,但是仍然有一些情形需要由专家级系统管理员使用sed快速解决任务。下面是一个简单的示例:

$ sed -e 's/foo/bar/g' myfile.txt

这个命令会查找myfile.txt文件中所有的foo并替换成bar然后把结果输出到屏幕上。sed的主要命令是 ‘s/foo/bar/g’,该命令在vi或vim在交互式编辑模式下同样支持。

除了本文介绍的这些之外,还有像Ruby、VBScript、Java Script、JScript、Tcl、AppleScript和Falcon等等很多其他的脚本语言。本文旨在介绍那些在系统管理中常用的脚本语言,希望你能够熟悉它们并提升你的工作效率。

 

英文原文 iSystemAdmin  编译:伯乐在线 – 唐尤华

Linux:修改Linux内核启动图片

本文讲的是修改Linux内核启动的图片,而不是uboot,这两者是不一样的哦.

uboot的启动图片难度比较大,往往是修改lcd驱动代码中加入对图像的数据处理的,而Linux kernel的话,只是修改下驱动里面的图片即可.

内核里启动图片的路径在这个目录下面,可以自己找下:linuxsrc/drivers/video/logo

假如要修改这个图片的话,方法如下:

1:首先要装netpdm,它是一个图形处理工具,可以在几种图形格式之间转换。

这个具体怎么安装,可以百度谷歌,Ubuntu下往往都是:

#sudo apt-get install netpdm

Fedora下往往都是:

#yum -y install netpdm

2:准备一个png的图片,如果没有的话,可以用GIMP转换一下格式,我们需要的是png的格式;

3:图片准备好之后,比如名字是:utulinux_logo.png,那么我们顺序执行如下几个命令便可以完成背景图片的制作:

首先将png图片转成pnm

# pngtopnm utulinux_logo.png > utulinux_logo.pnm

然后将pnm图片的颜色数限制在224

# pnmquant 224 utulinux_logo.pnm > utulinux_logo_224.pnm

最后将pnm图片转换成我们需要的ppm

# pnmtoplainpnm utulinux_logo_224.pnm > utulinux_logo_224.ppm

4:把得到的utulinux_logo_224.ppm替换linuxsrc/drivers/video/logo中对应的图像就OK了.

具体LOGO的名字可能不一样,大家可以尝试打开源码目录看看(/drivers/video/logo)

5:最后在内核有编译里加上:

logo全屏

在配置的时候 在Console drivers —>Frame-buffer support —>把Select compiled-in fonts 去掉.

这样把编好的img烧到开发板或者对应的电脑,启动便可以看到自定义的图片显示了.

via http://www.linuxde.net/2013/06/13936.html 

Linux:DDNS 的工作原理及其在 Linux 上的实现

简介: DDNS (Dynamic DNS) 扩展了 DNS 将客户端 IP 与其域名进行静态映射的功能,它可以将同一域名实时地解析为不同的动态 IP,而不需要额外的人工干预。这在客户端 IP 地址不断发生变化的情况下,尤其是在无线网络和 DHCP 环境中,都有着极其重要的意义。本文通过分析 DDNS 的工作原理,简单演示了其在 Linux 网络协议栈的内核空间及用户空间创建 netlink 套接字、进行数据交换、并最终通过 nsupate 工具将更新消息发送给 DNS 服务器的过程。

DDNS 工作原理的分析

DDNS 的实现最根本的一点是当主机的 IP 地址发生变化的时候,实现 DNS 映射信息的及时更新,应用程序需要及时地获得这一信息,主要的方法可分为两大类:

  • 一类是轮询机制,即:应用程序每隔一定的时间,去从查询主机当前的 IP 地址,并与之前的进行比较,从而判断网络地址是否发生了变化。显然,这种方法不仅效率低下,而且对每次查询 IP 地址的时间间隔很难得到一个折中的数值。
  • 第二类方法是异步实现方式,即:每当主机的 IP 地址发生变化的时候,应用程序能够被及时地通知到。这的确是一个简单而又高效的方法,但与此同时,另一个问题又产生了,那就是:通知源又应该由谁来担当 呢?显然,这是处于用户空间的应用程序无法胜任的。于是,我们想到了让内核来充当这一消息源。这样,在内核空间和用户空间之间就需要通过消息来进行通信 了。

在 Linux 下用户空间与内核空间的信息交互方式有许多种,比如:软中断、系统调用、netlink 等等。关于这些通信方式的介绍以及其各自的优缺点并不在本文的讨论范围内,您可以自行查看参考资源。

在这许多种通信方式中,netlink 凭借其标准的 socket API、模块化实现、异步通信机制、多播机制等等多种优势,成为了内核与越来越多应用程序之间交互的主要方式。在 Linux 的内核中,已经为我们封装了使用 netlink 对特定网络状态变化进行消息通知的功能,这就是著名的 rtnetlink。有关 netlink 在内核空间实现的详细代码以及其 API 参数的介绍,您可以自行查看参考资源,本文在此不作过多的赘述。

本文讨论的重点是针对 DDNS 这一特定的应用,演示 rtnetlink 检测到 IP 地址发生了变化、并将消息告知用户空间的应用程序的整个过程,以及应用程序利用 netlink 套接字接收消息、并告知 DNS 服务器的实现方法。

结合上述对 DDNS 工作原理的分析,我们可以将 DDNS 的工作流程简单地用图 1 来表示:

图 1. DDNS 的工作流程图

Linux:DDNS 的工作原理及其在 Linux 上的实现
Linux:DDNS 的工作原理及其在 Linux 上的实现

从图 1 中可以看到,DDNS 的工作流程主要有三个部分:

  1. 应用程序实时感知到 IP 地址发生了变化,如上介绍,利用基于 netlink 的异步通知机制可以让应用程序及时得到内核空间对这些事件的“通知”,具体可以分为如下 5 个步骤:
    • 1、内核空间初始化 rtnetlink 模块,创建 NETLINK_ROUTE 协议簇类型的 netlink 套接字;
    • 2、用户空间创建 NETLINK_ROUTE 协议簇类型的 netlink 套接字,并且绑定到 RTMGRP_IPV4_IFADDR 组播 group 中;
    • 3、用户空间接收从内核空间发来的消息,如果没有消息,则阻塞自身;
    • 4、当主机被分配了新的 IPV4 地址,内核空间通过 netlink_broadcast,将 RTM_NEWADDR 消息发送到 RTNLGRP_IPV4_IFADDR 组播 group 中 ;
    • 5、用户空间接收消息,进行验证、处理;
  2. 应用程序接收到“通知”后,把 DNS update 信息发送给 DNS 服务器,目的是将更新后的 IP 地址及时地通知 DNS 服务器,以便网络上的主机仍然能够通过原来的域名访问到自己,通用的做法是利用开源软件 nsupdate 发送 DNS update 信息给 DNS 服务器以实现 DNS 信息的动态更新。
  3. 最后,对应于第一部分 netlink 套接字的创建,用户空间和内核空间关闭所创建的 netlink 套接字。

下文将详细阐述其中的每一环节及其实现。

在我们开始利用 netlink 套接字、实现与内核通信的应用程序之前,先来分析一下内核空间的 rtnetlink 模块是如何工作的。

内核空间 rtnetlink 的初始化

清单 1. rtnetlink 的初始化

 /*
以下代码摘自 Linux kernel 2.6.18, net/core/rtnetlink.c 文件,
并只选择了与本主题相关的最重要的部分,其他的都用省略号略过,之后的各清单也一样。
 */
 void __init rtnetlink_init(void)
 {
    ......
 rtnl = netlink_kernel_create(NETLINK_ROUTE, RTNLGRP_MAX, rtnetlink_rcv, THIS_MODULE);
 if (rtnl == NULL)
	 panic("rtnetlink_init: cannot initialize rtnetlinkn");
 ......
 }

 

从清单 1 中可以看到:

在 rtnetlink 进行初始化的时候,首先会调用 netlink_kernel_create 来创建一个 NETLINK_ROUTE 类型的 netlink 套接字,并指定接收函数为 rtnetlink_rcv,有关 rtnetlink_rcv 的实现细节可以查阅内核 net/core/rtnetlink.c 文件。这里需要指出的是,netlink 提供了包括 NETLINK_ROUTE、NETLINK_FIREWALL、NETLINK_INET_DIAG 等在内的多种协议簇(详细列表及各协议簇的含义可以自行查看参考资源),其中 NETLINK_ROUTE 类型提供了网络地址发生变化的消息,这正是 DDNS 需要用到的。

内核空间 IP 地址变化事件的通知过程

引起主机 IP 地址变化的原因有很多种,如:DHCP 分配的 IP 过期、用户手动修改了 IP 等等。无论何种原因,最终都会触发内核空间对相应事件的通知机制,这里以最常用的修改 IPV4 地址的工具 ifconfig 为例。

ifconfig 先是创建一个 AF_INET 的 socket,然后通过系统调用 ioctl 来完成配置的,ioctl 在内核中对应的函数是 sys_ioctl,对于 IP 地址、子网掩码、默认网关等配置的修改,其最终会调用 devinet_ioctl。devinet_ioctl 函数处理包括 get、set 在内的多种命令,与 DDNS 应用有关的是 set 类命令,图 2 给出了 SIOCSIFADDR 命令(设置网络地址)的 ifconfig 调用树:

图 2. SIOCSIFADDR 命令的 ifconfig 调用树

Linux:DDNS 的工作原理及其在 Linux 上的实现
Linux:DDNS 的工作原理及其在 Linux 上的实现

从图 2 中可以看到,当用户使用 ifconfig 对主机的 IP 地址作了修改,内核在进行了新地址的设置之后,会调用 rtmsg_ifa,传递的事件为 RTM_NEWADDR。

清单 2. rtmsg_ifa 发送 IP 地址变化消息

 /*
以下代码摘自 Linux kernel 2.6.18, net/ipv4/devinet.c 文件
 */
 static void rtmsg_ifa(int event, struct in_ifaddr* ifa)
 {
	 int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + 128);
	 struct sk_buff *skb = alloc_skb(size, GFP_KERNEL);
	 if (!skb)
		 netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, ENOBUFS);
 else if (inet_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) {
		 kfree_skb(skb);
		 netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, EINVAL);
	 } else {
		 netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV4_IFADDR, GFP_KERNEL);
	 }
 }

 

从清单 2 中可以看到,rtmsg_ifa 的实现主要包括:

  1. 首先分配了一块类型为 struct sk_buff 的空间用于存放需要发送的消息内容。
  2. 随后,调用 inet_fill_ifaddr 将消息填充至上述缓存(有关消息的格式,您可以自行查看参考资源)。值得注意的是,RTM_NEWADDR 被作为 nlmsg_type 封装到了内核发送给应用程序的 netlink 消息头 nlmsghdr 中,这样用户空间的应用程序在接收后就能够根据 type 来分别处理不同类型的消息了。
  3. rtmsg_ifa 的最后是调用了 netlink_broadcast 将上述封装完毕的 sk_buff 结构广播到 RTNLGRP_IPV4_IFADDR 这个 group,以下是内核空间组播 group 与用户空间组播 group 的对应关系:

清单 3. 内核空间组播 group 与用户空间组播 group 的对应关系

 /*
以下代码摘自 Linux kernel 2.6.18, include/linux/rtnetlink.h 文件
 */
 /* RTnetlink multicast groups */
 enum rtnetlink_groups {
	 RTNLGRP_NONE,
 #define RTNLGRP_NONE 		 RTNLGRP_NONE
 RTNLGRP_LINK,
 #define RTNLGRP_LINK 		 RTNLGRP_LINK
 .....
	 RTNLGRP_IPV4_IFADDR,
 #define RTNLGRP_IPV4_IFADDR 	 RTNLGRP_IPV4_IFADDR
 ......
 };
 #ifndef __KERNEL__
 /* RTnetlink multicast groups - backwards compatibility for userspace */
 #define RTMGRP_LINK 		 1
 #define RTMGRP_NOTIFY 		 2
 ......
 #define RTMGRP_IPV4_IFADDR 	 0x10
 ......
 #endif

 

综上所述,当主机的 IP 地址发生变化时,内核会向所有 RTNLGRP_IPV4_IFADDR 组播成员发送 RTM_NEWADDR 消息。因此,在用户空间创建 netlink 套接字时,只需要加入到 RTMGRP_IPV4_IFADDR 这个组播 group 中,就可以实现当本机 IP 地址有更新的时候,DDNS 应用程序能够异步地收到内核空间发来的通知消息了。###NextPage###

用户空间创建 netlink 套接字

用户空间的 netlink socket 相关操作与标准 socket API 完全一致,因此可以像使用标准 socket 来进行两台主机间的 IP 协议通信一样地来使用它,这也是 netlink 之所以能够得到越来越广泛应用的一个重要原因。

清单 4. 用户空间创建 netlink socket

 #include
 #include
 #include
 #include
 ......
 int main(void)
 {
    ......
    if((nl_socket = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE))==-1)
         // 指定通信域、通信方式以及通信协议
    exit(1);
 ......
 }

 

在创建 netlink 套接字时:

我们指定了通信域为 PF_NETLINK,表明这是一个 netlink 套接字。其定义可以在如下所示的内核 include/linux/socket.h 文件中找到。从中我们也可以看到自己非常熟悉的 AF_INET:

清单 5. 清单 4 中使用到的宏定义

 /* 以下代码摘自 include/linux/socket.h 文件 */
 /* Supported address families. */
 #define AF_UNSPEC 	         0
 #define AF_UNIX 		 1 	 /* Unix domain sockets 	 */
 #define AF_LOCAL 		 1 	 /* POSIX name for AF_UNIX 	 */
 #define AF_INET 		 2 	 /* Internet IP Protocol 	 */
 ......
 #define AF_NETLINK 		 16
 ......
 /* Protocol families, same as address families. */
 #define PF_NETLINK 	 AF_NETLINK
 ......

 

对于通信方式,我们选择了 SOCK_DGRAM。事实上对于 netlink 这种基于无连接的 socket,使用 SOCK_DGRAM 或者 SOCK_RAW 都是可以的。

对于通信协议,我们使用了 NETLINK_ROUTE。这是因为在清单 1 中,内核空间创建 netlink 套接字、用于发送 IP 地址发生变化的消息时使用的是它,所以这里需要保持一致以进行双方间的通信。

Linux:通过Backtrack Linux 来加强你的安全防御

即使你的电脑已经采取了不错的安全措施,也要在你的家庭网络上有足够的重视,因为一旦其中某个人被攻破了,灾难将接踵而至。所以,想知道你的措施能否保证网络足够安全,你需要一些合适的工具。

关于Backtrack Linux

Backtrack Linux

Backtrack Linux 是一个专注于网络渗透的linux发行版。它基于Ubuntu,但却包含了很多很出色的测试工具和一些很有用的补丁,比如修订过的无线驱动。

Backtrack Linux主要在LiveDVD的环境下使用,但你也可以把它安装到电脑的硬盘上。如果你只使用这个系统来做网络渗透的话我们推荐你使用后面那种方式,因为这样你就可以为其中的软件安装更新了。

我们开始吧

你的电脑应该从CD启动,然后你需要通过简单的几步来进入Backtrack的桌面环境。高手如果不喜欢的话可以不需要进入桌面环境,但对于那些刚刚接触Backtrack甚至刚刚接触Linux的人来说,你们还是按部就班吧。

getting started如果你在一开始看到了 boot: 提示,你只需要敲一下回车,然后它就会继续启动了。

然后它就会来到启动菜单,在这里你会看到好几个不同的选项。如果你需要尽管选择其中一个然后进入,否则的话就跟我一起选择第一个吧。

然后Backtrack会来到一个命令行提示框。高级用户可以在这里输入命令来操作那些已经安装在DVD中的软件。然而如果你不喜欢命令行而需要一个图形界面,你只需要输入startx 然后回车,桌面环境就开始启动了。

工具

Backtrack 之所以成为一个众人喜爱而信赖的网络渗透测试工具,一个原因就是它基本上包含了每一个你可能会用到的工具。浏览下各个菜单吧,你会看到那些工具软件都已经根据它们的功能高度定制过了。

如果你看下应用菜单中的分类,你就能看到所有已安装的程序列表了——毫无疑问,相当得多!在网上你可以找到很多关于如何使用这些软件的教程。

如何获取

Backtrack Linux 可以在它的官方页面下载到。在那里你有几种选择,比如不同的电脑架构类型,或者不同的桌面环境。你还可以选择通过浏览器直接下载或者通过一个种子客户端来下。

ISO镜像文件下载好了之后,你需要把它刻录到DVD或者USB上。然后设置你电脑的BIOS,让它从DVD或者USB启动,之后Backtrack Linux就会开始载入了。

总结

我为Backtrack Linux的存在而感到高兴,因为人工地去搭建相同的环境,包括安装所有的程序和软件包将会花掉你相当多的时间和精力。而现在你只需要简单地从磁盘启动Backtrack ,然后一分钟内就可以开干了。当然了,要学会使用里面所有的软件(或者只是那些你需要用到的)也会用上一些时间,但这显然值得的。

如果你还没有试着用Backtrack Linux 来测试你的家庭网络,这里有一个为什么它进入了《Linux发行版大全》的理由。请记住你只能在你拥有明确权限的网络和系统上进行渗透测试,否则在大多数地区都会被视为违法的。

 

原文链接: Danny Stieben 翻译: 极客范 – 钟益强译文链接: http://www.geekfan.net/1512/

Linux:如何定制Linux Mint 15 Cinnamon?

Linux Mint 15 Cinnamon随带最新版本的Cinnamon桌面环境。与其他任何发行版一样,有些用户喜欢Cinnamon,另一些用户则认为其界面过时了。我要说,你喜欢啥,就用啥。毕竟,这是自由软件和自由软件社区倡导的理念之一。

目前我在自己的主计算机上使用KDE,但是最新版的GNOME 3(GNOME 3.8)问世后,我打算改用GNOME外壳桌面,使用几个插件来进行定制。自由万岁!

这就引出了这篇文章的主题:如何定制Linux Mint 15 Cinnamon。要定制的方面不是太多,但如果我要在主计算机上使用Cinnamon桌面,这些变更却又是我需要进行的变更,以便桌面适合我使用计算机的方式。

1. 禁用热区(Hot Corner):我在KDE和GNOME 3上遇到的最烦人的功能特性之一就是热区(Hot Corner)了。我要是将鼠标移来移去,桌面看起来就完全不一样。怎么回事?原来鼠标光标移到了热区。

在Linux Mint 15 Cinnamon中,热区位于桌面的左上角。要是你与我一样,无法忍受热区,下面是如何禁用它的办法。

从Cinnamon的Settings(设置)管理器,点击Hot Corner(热区)。在默认情况下,热区在桌面的左上角被启用。而默认效果是Expo(展示)模式。想禁用热区,只要从下拉式菜单中选择Disabled(禁用)。这样就可以搞定热区。

2. 将Expo(展示)和Scale(缩放)等小应用程序添加到面板:虽然我觉得热区很烦人,但是它触发的效果实际上很有用。这种效果即Expo模式可以缩小,显示系统上的所有工作区或虚拟桌面。默认情况下,有两个工作区。另一个模式是Scale(缩放),它可以缩小,显示目前工作区中打开的所有窗口。想进一步控制展示和缩放模式何时被激活,我觉得更好的办法是,将Expo和Scale这两个小应用程序添加到面板。那样一来,我只要点击某个小应用程序,就可以触发相应效果。

想将小应用程序添加到Cinnamon面板,鼠标右击面板,然后选择Add applets to the panel(将小应用程序添加到面板)。

Applets(小应用程序)窗口应该会打开。寻找Expo(展示)小应用程序。选择它,点击Add to panel(添加到面板)按钮。针对Scale(缩放)小应用程序,重复步骤即可。

想从面板移除某个小应用程序,别忍不住点击Restore to default(恢复至默认值)按钮。这会清除你之前对面板进行的任何更改。想清除某个小应用程序,鼠标右击它,然后选择Remove from panel(从面板删除)。

这是Expo(展示)模式被触发后呈现的样子。

Scale(缩放)模式被触发后,呈现一样的桌面。

3. 将Workspace(工作区)切换器小应用程序添加到面板:Expo和Scale模式的视觉效果很眩。比如说,Scale模式为你提供了你已经可以从任务管理器能够访问的效果。Expo模式复制了Workspace(工作区)切换器的一项特性,不过它增添了一项功能。如果将Workspace切换器小应用程序添加到面板,那么只要点击一下鼠标,就可以在虚拟桌面之间自如切换。想将该小应用程序添加到面板,重复刚才添加Expo和Scale小应用程序的同一步骤即可。

在我的那台测试计算机上,我在面板上有这三个小应用程序。完全为我提供了许多的选项。除了本文中给出的自定义设置外,你还可以运用更多的设置,以便让这个桌面符合你平时使用桌面的方式。Cinnamon的Settings(设置)管理器有许多模块可以帮助你,花点时间好好探究这些模块吧。

原文链接:

http://www.linuxbsdos.com/2013/06/05/how-to-customize-linux-mint-15-cinnamon/ 

via http://os.51cto.com/art/201306/397735.htm 

Linux:在MAC下使用ISO制作Linux的安装USB盘

在Mac环境下,将Linux的ISO镜像生成一个Linux的安装盘,和Linux下差不多,只是Mac下有一些自己的工具。

步骤如下:

1、在终端下,将ISO镜像转换为DMG格式:

$ hdiutil convert -format UDRW -o ~/linux.dmg /tmp/linux.iso
正在读取Master Boot Record(MBR:0)…
正在读取Linux                       (Apple_ISO:1)…
正在读取(Windows_NTFS_Hidden:2)…
.......................................................................................................................
经过时间:14.829s
速度:145.1M 字节/秒
节省:0.0%
created: /tmp/linux.dmg

也可以使用“磁盘工具”来转换为可读写的DMG镜像。

2、插入USB盘,然后在终端下,查找该盘的设备名:

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            120.5 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.8 GB    disk1
   1:               Windows_NTFS wxy-u3                  15.8 GB    disk1s1

以上显示该盘的设备名是: /dev/disk1

也可以通过“磁盘工具”里面选择磁盘(不是分区),来查看其信息,获得设备名。

3、卸载USB盘(插入时已经自动挂载了),但是不要推出。在终端下:

$ diskutil umountDisk /dev/disk1
Unmount of all volumes on disk1 was successful

也可以通过“磁盘工具”进行卸载。

4、镜像上面生成的DMG内容到USB盘,在终端下:

$ sudo dd if=linux.dmg of=/dev/rdisk1 bs=1m
Password:
2151+1 records in
2151+1 records out
2256076800 bytes transferred in 90.277905 secs (24990354 bytes/sec)

此处要千万注意,指定的of别写错了,否则悔之晚矣。另外,of参数指定的设备名,可以用上面找到的/dev/disk1,也可以用/dev/rdisk1,此处的“r”据说会写入较快。

另外,如果报错:“dd: Invalid number `1m’”,可能是使用的不同版本的dd,可以换为bs=1M试试。

如果报错:“dd: /dev/diskN: Resource busy”,可能是上面的步骤中没有完成卸载USB盘。

5、推出USB盘。在上面复制之后,系统可能会报错,“此电脑不能读取能插入的磁盘”,不必理会,直接推出即可。也可以在终端下推出:

$ diskutil eject /dev/disk1

或者在“磁盘工具”里面推出。

 

使用该USB盘引导启动即可进行Linux的安装。

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

Linux:ping 的 mdev 值

在运行 ping 命令的时候,里面有一项输出叫 mdev,如下所示:

 

~% ping www.google.pt
PING www.l.google.com (72.14.203.103) 56(84) bytes of data.
64 bytes from tx-in-f103.1e100.net (72.14.203.103): icmp_req=1 ttl=50 time=84.1 ms
64 bytes from tx-in-f103.1e100.net (72.14.203.103): icmp_req=2 ttl=50 time=83.0 ms
64 bytes from tx-in-f103.1e100.net (72.14.203.103): icmp_req=3 ttl=50 time=85.5 ms
^C
— www.l.google.com ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 83.019/84.227/85.506/1.016 ms

 

它是什么意思呢? ping 的手册中并没有提到。我们不妨看一下 ping 的源代码,见 ping_common.c:

tsum += triptime;tsum2 += (long long)triptime * (long long)triptime

以及

tsum /= nreceived + nrepeats;tsum2 /= nreceived + nrepeats;tmdev = llsqrt(tsum2 – tsum * tsum);

所以我们可以得出:

mdev = SQRT(SUM(RTT*RTT) / N – (SUM(RTT)/N)^2)

也就是这个平均偏差的公式:

所以 mdev 就是 Mean Deviation 的缩写,它表示这些 ICMP 包的 RTT 偏离平均值的程度,这个值越大说明你的网速越不稳定。

via http://wangcong.org/blog/archives/1801  

注:不同的操作系统,可能名称不同,比如mac下叫做stddev。哦对了,windows下没这行统计数据。

 

Linux:ubuntu 13.04 安装 GRUB customizer

GRUB customizer是一款GRUB2/BURG 图形界面的配置定制工具软件。

最新版本特点:

  • 移动,删除或重命名的菜单项;
  • 编辑菜单项的内容或创建新菜单项;
  • 支持GRUB2和Burg;
  • 重新引导到MBR;
  • 默认操作系统,内核PARAMS,背景图像和文字颜色等设置;
  • 改变已安装的操作系统上运行的Live CD。

通过PPA安装,打开终端,输入命令:

sudo add-apt-repository ppa:danielrichter2007/grub-customizersudo apt-get updatesudo apt-get install grub-customizer

GRUB customizer01

GRUB customizer02

GRUB customizer03

GRUB customizer05  

 

via http://imcn.me/html/y2013/14587.html 

 

Linux:使用 Ubuntu builder 来构建自己的 Ubuntu发行版

Ubuntu Builder 已经更新到 2.4.0,不再支持 Lucid Lynx 和 Oneiric Ocelot,修复了一些 bug 。

打开终端,输入以下命令来安装:

sudo add-apt-repository ppa:f-muriana/ubuntu-buildersudo apt-get updatesudo apt-get install ubuntu-builder

 

安装后可以使用该程序来定制你自己的发行版啦!

Linux:使用 Ubuntu builder 来构建自己的 Ubuntu发行版
Linux:使用 Ubuntu builder 来构建自己的 Ubuntu发行版
 
 

Linux:你的WEP网络很安全?分分钟破解给你看

我总是提醒人们对无线网络使用WEP (Wired Equivalent Privacy)加密技术其实是自欺欺人,但人们还是在使用它。今天我就来真正告诉你WEP是多么不安全,看我是怎么在五分钟之内破解一个WEP加密的无线网络的。

featured-wep-networks

免责声明:这篇文章仅用于学习目的,它告诉你为什么你该升级一下路由器或者采取其他方式加强一下无线网络安全。破解不属于你的无线网络是一种刑事犯罪,而如果你蓄意这么做,我们将不负任何法律责任。

准备条件

  • 一张Backtrack5可启动DVD,它是一个专注于网络安全且预装了所有实用工具的linux发行版。
  • 能设置成监控模式的无线网卡或芯片组。想知道你的是否兼容只管试一下就好了,Linux系统一直自带了驱动,而且如今已经有很多无线网卡满足条件了。如果要保证好的兼容性我会推荐“Alfa AWUS036H”,很好很强大,而且外部有天线连接。
  • 处于活跃状态的WEP网络,也就是说得有其它设备连接着这个网络。也有不需要满足这个条件的方法,但我现在只讨论前一种。

下载并启动Backtrack

一旦你刻录好Backtrack后就启动它吧,你应该会看到类似如下的画面:

Backtrack 

按下回车可以看到启动菜单,然后选择第一个选项。

最终,你会进入到Linux的命令行界面,此时可以输入

startx

现在就可以进入桌面环境了。(这一步不是必需的,但图形界面会让许多人觉得舒服一些)

进入桌面环境后,打开终端,就是桌面顶部那个 >_ 的图标。

没错,我们要使用命令行来破解,但别担心整个过程我会手把手带着你的 :D

检查你的无线网卡

从终端输入

iwconfig

开始,它会列出电脑上所有的网络接口,我们要找的是 wlan0 或者 ath0 或者 wifi0,出现这些意味着找到了无线网卡。

然后,我们要把找到的网卡设置到监控模式。就是说我们不准备让它连上哪个网络,而是让它记录我们让它记录的一切——逐一抓取它能获取的所有东西。输入:

airmon-ng start wlan0

如果一切顺利,你应该会看到类似这样的提示:monitor mode enabled on mon0 。也就是说你的无线网卡已经成功调整到了监控模式。

现在让我们扫描一下周围wifi 的情况,输入:

airodump-ng mon0

这个命令将把每个无线网络以及连接到它的设备都输出到你的屏幕上。

在列表上找到你的目标wifi ,把它在“BSSID”列的长长的十六进制数据复制下来(这实际上是路由器的物理MAC地址)。

我要找的网络是 wep-network ,可以看到它的加密方式是WEP。下一步就是让网卡专心监控和这个网络有关的数据包,还要让它锁定一个正确的通道(可以在CH列中看到)。默认情况下,它会扫描每个通道,那样子就只能获取你想要的一小部分信息了。

我们可以先复制BSSID列,然后按CTRL-C 结束当前命令,再输入:

airodump-ng -c -w –bssid mon0

比如,对于BSSID为22:22:22:22:22:22 、通道号为11的网络,要保存到文件”crakckme”中,就输入:

airodump-ng -c 11 -w crackme –bssid 22:22:22:22:22:22 mon0

完成以后,屏幕上有跟刚刚相似的输出。不过这次它实际上把数据包都保存到了文件中,而且它只监测你的目标网络(因此你就不会看到无关的东西了)。

这里要注意两点:第一是屏幕下半部分显示的已连接设备,一个前提就是要保证至少有一个设备连接到了那个网络。第二就是上半部分的 #Data 列,它代表了我们迄今一共抓取到的有用的数据包数量。运气好的话它应该是在一直增长的,即使可能很慢。

老实说我们需要大概5000-25000个才能破解密码。不过即使它真的增长相当缓慢也不用担心,下一个命令将会强制注入一串数据包,直到它达到我们的要求。

输入SHIFT-CTRL-T 在终端中打开新的标签页,然后输入下面的命令,注意把适当的地方替换成具体数据。其中的 client station 在前一个标签的下半部分的 STATION中。把它复制后替换到下面命令的具体位置:

aireplay-ng –arpreplay -b -h mon0

例如:

aireplay-ng –arpreplay -b 22:22:22:22:22:22 -h 33:33:33:33:33:33 mon0

大概一分钟以后,你应该能看到刚刚的数据包数量开始显著增长了,这取决于你的网络状况。

当收集的数据包数量达到5000后,我们就可以开始破解这些包了。打开一个新终端,输入:

aircrack-ng -z -b *.cap

其中的output filename 就是刚刚保存数据包的文件名。比如我刚刚的文件名称为”crackme”。别忘记在文件名最后加上 “*.cap”。比如,最终我的命令为:

aircrack-ng -z -b 22:22:22:22:22:22 crackme*.cap

如果你的数据包数量足够,屏幕上会在几秒内显示出密码 。如果没有,它会一直等直到又收集了5000个包,再试着给出这个key,这种情况下你可以去泡杯咖啡先了。就我而言,它在35000个包的情况下马上给出了密码——整个过程大概花了三分钟。

 

如果它给你的密码是十六进制的,比如34:f2:a3:d4:e4, 那你只需要去掉标点符号,只保留字母和数字。比如我的是34f2a3d4e4 。

就是这样——破解一个WEP加密的无线网络就是这么简单。

结论

我希望你同意我的看法,好朋友之间应该提醒对方不再使用WEP!现如今已经没有理由再使用WEP了,如果你的路由器真的不支持其它方式的加密模式,那就买一个新的或者联系你的互联网服务供应商让他们赶快免费给你换掉。Aibek 实际上早在2008年就告诉你怎么加强你的无线安全了。不幸的是,任天堂的设备都只能在WEP网络下工作,所以或许到了把你的便携游戏机换成iPhone的时候了。 

via http://www.geekfan.net/1713/ 

Linux:切换到 Git 的 8 个理由

  提到版本控制,最近大家都在谈Git。当然,四处议论纷纷还不足以证明切换到Git上有多么正确。这里有一些能证明Git非常出色的有力事实。

1. 节省时间

  想象一下,每次动鼠标前你都要等待5分钟。这非常讨厌是不是?有了版本控制也是一样——我们每个命令消耗几秒,但是工作一天也累积起来了。但是Git快如闪电。把你的时间用在其他更重要的事情上,而不是等待版本控制工具的响应。

null

2. 离线工作

  你出差的时候要工作怎么办?用诸如Subversion或者CVS的集中式版本控制系统,如果你不能连上中央版本库你就不能工作。有了Git,在你 的本地机器上几乎能做任何事:提交、查看项目完整历史记录、合并(merge)或者新建分支……Git让你来决定何时何地开始工作。

3. 回退错误

  有时候我会犯错(我也不敢相信!)。我喜欢Git的是它的一个小小的回退命令就能用于几乎任何场景。修正最后一次提交,因为你忘记包含一个小改动。撤销整个 提交,因为那个特性已经不再需要。而且当处境变得困难时,你甚至可以用Reflog来恢复“已删除”的提交——因为在幕后Git极少会真正删除什么。这样 心定气闲。

4. 睡得香

  你曾经粉碎过Subversion的版本库吗?我就做过(我说这个的时候记忆的伤痛犹在)。有了Git,我可以信心十足,因为团队里每个人在自己电脑上的克隆就是一份可用的备份。另外Git里的几乎每个操作都是增加数据(很少有删除的)。想搞砸都很难。这种感觉很好。

5. 产生有用的提交

  把牛奶、冰淇淋和番茄投到搅拌机里会有(至少)两个问题。首先,启动搅拌机后,看着这一团东西,没人能说出你实际上放入的是什么。另外,你没办法把番茄再 “回滚”。你做的一批不相关的提交(一点点A特性,再带一点B特性,还有一个小小的补丁……)也是一样的。对你的队友来说,很难理解发生了什么。当出现问 题时,他们也不能简单地回滚特性A。Git能帮你避免这种混乱和创建粒状提交。其独一无二的“缓存区”概念能让你决定在下一个提交里到底包含哪些改动,甚 至小到哪些行。这是版本控制的用处所在。

6. 按自己的方式工作

  当用Git工作时,你可以有你自己的工作流程。那个你觉得好的流程。使用Git你不需要成为编程高手。当然你可以连接多个远程的版本库,用变基 (rebase)代替合并,需要时工作在子模块上。但是你也可以只是简单地工作在一个中央远程版本库上,如同在用Subversion一样。不管你的工作 流程怎样,所有其他的优点都还在。

7. 不会把东西搞混了

  分开关注是追踪事情的最高原则。当你工作在特性A上时,任何事(人)都不会被你未完成的代码所影响。如果这个特性不再需要了呢?或者如果在10个提交之后, 你发现你做的完全不对呢?分支是这些问题的答案。其他的版本控制系统也有分支,但是Git是第一个让它做好它该做的:快速简单。

8. 潮流

  只有死鱼才随波逐流。有时候聪明的开发者也这样。Git被越来越多的知名公司和开源项目所使用:Ruby On Rails,jQuery,Perl,Debian,Linux内核,还有很多。大型的社区通常自身就是一个优点,因为一个生态圈会围绕着该系统演进。大 量的学习指南,工具,还有服务,会让Git变得更加吸引人。

英文原文:git-tower,编译:伯乐在线 – @奇风余谷

译文链接:http://blog.jobbole.com/41527/

 已同步至 linux的微博

Linux:在CentOS 6.4中支持exfat格式的U盘

CentOS系列一直没有默认支持使用exfat格式的大容量U盘。

可以通过添加fuse-exfat模块来支持。根据网上资料,整理如下:

1、下载fuse-exfat支持软件:

exfat支持是通过fuse模块的方式支持的,其项目地址是: https://code.google.com/p/exfat/  ,当前版本是:1.0.1。

目前exfat的支持已经是全功能支持,支持读写。

可以下载源代码包,并自行使用scons和gcc编译,也可以在rpmfusion下载源代码RPM,然后通过构建RPM来安装。这里采用构建RPM的方式(这样安装卸载都很方便)。

下载地址:http://download1.rpmfusion.org/free/el/updates/6/SRPMS/repoview/index.html

分别下载:fuse-exfat-1.0.1-1-el6.src.rpm 和 exfat-utils-1.0.1-1.el6.src.rpm

2、编译安装:

编译前,请先检查系统,如果系统中没有scons和gcc,请通过yum安装:

$ sudo yum install scons gcc

这个软件是fuse模块,编译需要fuse-devel包支持:

$ sudo yum install fuse-devel

下载后,安装源代码RPM:

$ rpm -ivh fuse-exfat-1.0.1-1-el6.src.rpm exfat-utils-1.0.1-1.el6.src.rpm

在主目录下,会出现rpmbuild目录:

$ cd ~/rpmbuild/SPECS

$ rpmbuild -ba fuse-exfat.spec

$ rpmbuild -ba exfat-utils.spec

构建完成后,即可在 ~/rpmbuild/RPMS里面找到生成的RPM(根据系统架构,分别在x86_64或i386目录下,其中名字中带有debuginfo的包不必安装):

$ cd ~/rpmbuild/RPMS/x86_64

$ sudo rpm -ivh fuse-exfat-1.0.1-1.el6.x86_64.rpm exfat-utils-1.0.1-1.el6.x86_64.rpm

这样就安装完成了。

3、挂载:

可以通过以下命令来挂载exfat的U盘了:

$ sudo mount.exfat /dev/sdXn /mnt

其中sdXn中的X代表你的U盘设备名,n代表分区号,比如:/dev/sdb1这样。

此外,为了方便,你可以将以上安装在/usr/sbin下的命令在/sbin下做个符号链接:

$ sudo ln -s /usr/sbin/mount.exfat /sbin/mount.exfat

便于直接使用mount来安装:

$ sudo mount -t exfat /dev/sdXn /mnt

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

Linux:如何设置一个永远无法删除的Cookie

在网站统计中,我们最常用的是用 Cookie标识身份,由于浏览器自带的 Cookie容易被用户删除。于是很多人使用 Flash Cookie来跟踪用户的信息。但是在目前360等软件帮助下,删除Flash Cookie也变得非常的简单。

如何存储Cookie?

那么有没有什么方法让Cookie无法删除呢?答案是有的!做开发的基本上都理解灾备机制。即一台服务器如果出现了故障,则可由另一台恢复回去。比如Cookie一旦删除后,可通过Flash Cookies进行恢复。另外,除了Cookie和Flash Cookie外,到底还有哪些方式可以用来进行“用户识别”。

1、标准的 Http Cookie

HTTP Cookie是最常的用于“用户识别”的方式,以下为服务器与Cookie之间的交互流程:

  1. 当我们用浏览器访问一个网站的时候,就会想服务器发起一个请求。
  2. 根据请求的url和cookie本身的属性,筛选出需要发送给服务器的cookie(当然也有可能没有cookie)。
  3. 如果有多个cookie的话,还会决定发送的顺序。
  4. 把这些需要发送的cookie包含在HTTP的包头里发送给服务器。
  5. 然后到了应答阶段,服务器会发回一个应答包头,包头里包含了cookie信息。
  6. 浏览器解析这个cookie,包括名称,值,路径等元素。
  7. 最后,把cookie保存在本地。

至于哪些cookie会被发送到服务器端,是有一套规则的,例如域名选择、路径选择和Max-Age选择,这些都可以在RFC2109里找到。

每次的http请求,cookie都会包含在包头里发送给服务器,这也是被开发者广为诟病的一个cookie缺点,因为这意味这每个请求都无形中增加了流量,特别是像请求图片这些资源的时候,附带的cookie信息是完全没有必要的。所以现在很多网站图片等静态资源都会用独立的域名运作,这样就可以单独对这些域名进行cookie设置。 除此以外,cookie还有以下影响比较大的缺点:

  • 安全性问题。cookie在http请求中是明文传递的,除非使用SSL通道,不然是不宜在cookie里放置重要信息。
  • 大小问题。每个cookie的大小不能超过4K。每个Domain下cookie个数根据浏览器不同也不同。

关于Cookies的一些限制问题,可以参考下Nicholas的一篇文章: 浏览器允许的每个域名下的Cookie数:

  • IE7跟IE8限制为50个。
  • Firefox限制为50个。
  • Opera限制30个
  • Safari/WebKit没有限制,但是如果header的大小超过服务器能处理的情况下,则会出现错误。

那如果Cookie数设置超过限制的时候,各浏览器又是如何处理呢:

  • Safari由于没有Cookie数的限制,所以不作讨论。
  • 在IE和Opera下,将会采用LRU(The Least Recently Used)方法,自动踢掉最老的cookie以腾出空间给新的cookie。IE和Opera使用这个方法。
  • Firefox就比较独特:它貌似会随机决定哪些cookie将会保留,尽管最后设置的cookie会被保留。所以在Firefox里不要超过cookie数的限制。

cookie的总大小在各浏览器中也是不同的:

  • Firefox和Safari允许cookie多达4097个字节,其中4096个字节是名字和值,1个字节是=号。
  • Opera允许cookie多达4096个字节,这些字节包含名字、值和=号。
  • IE允许4095个字节,这些字节包含名字、值和=号。

注意这里用的字节,也就是,如果是多字节字符,自然就会占用两个字节。在所有浏览器里,如果设置的cookie大小超过限制,那么它就会被忽略或者不被设置。

从上面,我们可以看到,Cookie确实存在一些不足,但是它的一些缺点也正是它的优点,例如每个请求都会被放到包头里发送给服务器,正是这个特性我们才能很方便的传输sessionid。Cookie的出现可谓大大推动了网页的发展,而且在未来很长的一段时间里,Cookie还会继续发挥它的作用。但是也正是由于Cookie存在种种的不足,才会有新的本地存储技术出现的需求。

2、Local Shared Objects (Flash Cookies)

Local Shared Objects 即本地共享对象,长被称为Flash Cookie。Flash Cookies是由Adobe公司开发的一个技术,该技术允许Flash对象在每个域名上存储100KB的数据。LSO解决了Cookie的一些问题,例如大小,安全等。跟Cookie不同,LSO被保存为二进制文件(不过变量名具有可读性)。LSO具有了不少优点,但是缺点也是明显,就是它需要安装Flash这个插件。虽然现在Flash的普及率很高,但是这种依赖插件的技术始终不能解决问题的根源,而且为了使用这个方案不得不引入额外的swf和js文件。另外IE8开始和Chrome在删除历史记录的时候会将Flash Cookie删除掉。

3、Silverlight Isolated Storage

独立存储(Isolated Storage)是Silverlight 2中提供的一个客户端安全的存储,它是一个与Cookie机制类似的局部信任机制。独立存储机制的APIs 提供了一个虚拟的文件系统和可以访问这个虚拟文件系统的数据流对象。Silverlight中的独立存储是基于 .NET Framework中的独立存储来建立的,所以它仅仅是.NET Framework中独立存储的一个子集。

Silverlight中的独立存储有以下一些特征:

  1. 每个基于Silverlight的应用程序都被分配了属于它自己的一部分存储空间, 但是应用程序中的程序集却是在存储空间中共享的。一个应用程序被服务器赋给了一个唯一的固定的标识值。基于Silverlight的应用程序的虚拟文件系统现在就以一个标识值的方式来访问了。这个标识值必须是一个常量,这样每次应用程序运行时才可以找到这个共享的位置。
  2. 独立存储的APIs 其实和其它的文件操作APIs类似,比如 File 和 Directory 这些用来访问和维护文件或文件夹的类。 它们都是基于FileStream APIs 来维护文件的内容的。
  3. 独立存储严格的限制了应用程序可以存储的数据的大小,目前的上限是每个应用程序为1 MB。

4、IE浏览器 userData 存储   (从IE9开始, 不再支持 userData)

userData是微软在第一次浏览器大战中的产物,属于DHTML中的一种技术。相比起Cookie,userData在每个域名下可存储达的数据提升了不少,但是具体的大小视domain的安全域而定。userData的数据会一直存在,直到被删除或者到过期时间。并且基于安全的考虑,一个 userData 存储区只能用于同一目录和对同一协议进行存储。userData在数据的本地储存来说,比cookie进步了不少,但是它有个致命的缺点:仅支持IE。仅凭这一点,就注定了userData并不会有太大的作为,只能用作配合其他本地存储技术兼容低版本的IE。

5、利用 HTTP ETags 存储Cookie

Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。

HTTP协议规格说明定义ETag为“被请求变量的实体值” 。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。

6、在浏览器历史记录中存储cookie

大家都知道,用户访问过一次页面,就会存储在浏览器浏览历史里面,这个方法就是利用浏览器的这个特性。通过新建一个iframe去访问这个页面。如默认的url是http://www.example.com/test/。

那他发送的路径会是加上了name跟value的。这里的name跟value分别是id跟123456,如

http://www.example.com/test/id/123456

发送方法为每个字母递增发送,并在最后加个”-“的结束符号

http://www.example.com/test/i

http://www.example.com/test/id

http://www.example.com/test/id/123456

http://www.example.com/test/id/123456-

那要相应的name value他是这样获取的。

默认url加上 ”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=-“。其中一个字符,看看是否存在历史记录里面。不存在则循环查找下一个。如果这里查到i是访问过的 ,则继续循环,在i的后面循环检查。继而又查到d是访问过的。一直循环知道出现’-‘符号为止。继而解析获取到的字符串,那name value自然也就解析出来。

但这样做的弊端很大。首先,必须要连续发送n个url,用户体验不好。获取的时候要遍历,也影响了浏览器的性能。所以不推荐。

7、使用PNG像素图片保存Cookie

以自动生成、强制缓存的PNG像素图片的RGB值形式保存cookie,使用HTML5 Canvas标签读取像素图片(cookie)。

服务器创建一个宽100像素高1像素的黑色空白PNG(每个像素的RGB 颜色可存储3个字节,可存储600字节信息),然后将值拆分并按顺序每3个字母生成一个RGB颜色值并且按顺序设置到图片的像素点中,然后给这个图片设置一个expires非常长的时间(Expire 头,用于客户端缓存,不同于cookie的expire属性)读取的时候取出并且解析还原出来。要求浏览器必须支持html5才能用上此方法。ie8,ie9,ff,chrome,safari都是 ok的。

8、使用window.name储存Cookie

window.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等)而发明的(详细见原文:《Session variables without cookies》),后来 Kris Zyp 在此方法的基础上强化了 window.name 传输 ,并引入到了 Dojodojox.io.windowName),用来解决跨域数据传输问题。

window.name 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

name 在浏览器环境中是一个全局/window对象的属性,且当在 frame 中加载新页面时,name 的属性值依旧保持不变。通过在 iframe 中加载一个资源,该目标页面将设置 frame 的 name 属性。此 name 属性值可被获取到,以访问 Web 服务发送的信息。但 name 属性仅对相同域名的 frame 可访问。这意味着为了访问 name 属性,当远程 Web 服务页面被加载后,必须导航 frame 回到原始域。同源策略依旧防止其他 frame 访问 name 属性。一旦 name 属性获得,销毁 frame 。

在最顶层,name 属性是不安全的,对于所有后续页面,设置在 name 属性中的任何信息都是可获得的。然而 windowName 模块总是在一个 iframe 中加载资源,并且一旦获取到数据,或者当你在最顶层浏览了一个新页面,这个 iframe 将被销毁,所以其他页面永远访问不到 window.name 属性。

window.name 传输技术相比其他的跨域传输的一些优势:

  1. 它是安全的。也就是说,它和其他的基于安全传输的 frame 一样安全,例如 Fragment Identifier messaging (FIM)和 Subspace。(I)Frames 也有他们自己的安全问题,由于 frame 可以改变其他 frame 的 location,但是这个是非常不同的安全溢出,通常不太严重。
  2. 它比 FIM 更快,因为它不用处理小数据包大小的 Fragment Identifier ,并且它不会有更多的 IE 上的“机关枪”声音效果。它也比 Subspace 快,Subspace 需要加载两个 Iframe 和两个本地的 HTML 文件来处理一个请求。window.name 仅需要一个 Iframe 和一个本地文件。
  3. 它比 FIM 和 Subspace 更简单和安全。FIM 稍微复杂,而 Subspace 非常复杂。Subspace 也有一些额外的限制和安装要求,如预先声明所有的目标主机和拥有针对若干不同特殊主机的 DNS 入口。window.name 非常简单和容易使用。
  4. 它不需要任何插件(比如 Flash)或者替代技术(例如 Java)。

9、使用HTML5客户端储存数据方法。

HTML5 提供了四种在客户端存储数据的新方法,即

  • HTML5 Session Storage
  • HTML5 Local Storage
  • HTML5 Global Storage
  • HTML5 Database Storage via SQLite

HTML5 Session Storage顾名思义它就如同Session。 针对一个 session 的数据存储,任何一个页面存储的信息在窗口中同一网站的任何页面都可以访问它存储的数据。每个窗口的值都是独立的,它的数据会因窗口的关闭而丢失,不同窗口间的sessionStorage是不可以共享的。

HTML5 Local Storage 没有时间限制的数据存储,第二天、第二周或下一年之后,数据依然可用。也就是说,localStorage是永远不会过期的,除非主动删除数据。数据可跨越多个窗口,无视当前会话,被共同访问、使用。

HTML5 Global Storage 同HTML5 Session Storage一样,区别在于其在浏览器关闭后,可以将存储的信息仍能够保留下来。目前只有FireFox支持,且只支持当前域下的存储。

HTML5 Database Storage via SQLite (目前只谷歌浏览器支持):可以理解成一个Html5环境下可以用Js执行CRUD的Web数据库。对于简单的数据,使用sessionStorage和localStorage能够很好地完成存取,但是对于处理复杂的关系型数据,它就力不从心了。这也是 HTML 5 的“Web SQL Database”API 接口的应用所在。

如何存储无法删除的Cookie?

Linux:如何设置一个永远无法删除的Cookie
Linux:如何设置一个永远无法删除的Cookie

一些常见的用来标注用户身份的方法已经介绍过了,接下来要讲解的是如何使用。

Evercookie是一个JavaScript API,通过它可以在浏览器中生成极其持久的cookie。它的目标就是在用户删除了传统cookie、Flash cookie(LSO)和其他缓存数据后,仍然可以识别客户端。Evercookie是通过利用浏览器不同的存储机制,把cookie数据保存在多个不同的地方实现的。此外,如果发现用户删除了其中一些cookie,Evercookie会利用这些机制重新创建它们。

虽然Evercookie非常的强大,但是个人觉得大部分功能都比较花俏。如evercookie_png,evercookie_etag,evercookie_history,实际上这些操作均会对用户体验有一定影响。不过也体现了evercookie的宗旨:为了记录用户信息,无所不用其极。但针对于国内用户大部分为ie用户,而且很多网站是ie only,完全可把evercookie_userdata纳入考虑范围。同时一般情况下,装有silverlight插件的浏览器,几乎必然也装着flash插件。所以首选flash方案。

Evercookie被认为是一项很邪恶的技术,事实上作者Kamkar的座右铭是“think bad, do good”。Kamkar说,他写evercookie是为了向用户展示公司可以跟踪他们的方法。

“我希望evercookie只是向人们演示跟踪他们的是何种方法,由他们决定他们是否应该阻止这些方法,我作为一个安全业余爱好者,写evercookie也才用了不到一天的时间,因此我很容易想像那些受雇的开发者可以做出什么来。”

有证据表明,Hulu、AOL和Spotify等网站已经开始在自己的网站上使用EverCookies。

参考链接:

http://en.wikipedia.org/wiki/HTTP_cookie

http://en.wikipedia.org/wiki/Zombie_cookie

http://samy.pl/evercookie/

https://github.com/samyk/evercookie 

via http://www.biaodianfu.com/zombie-cookie.html 

Linux:如何选择Linux服务器操作系统

Linux的发行版有上百种,如何选择也是一种难题。以下为收集的资料,仅供参考。

一、Ubuntu Desktop 和 Ubuntu Server

这个是最方便,也是最快捷的方式。如果刚开始使用Ubuntu,且不太熟悉命令行的可以选用Ubuntu Desktop来学习。继而转为Ubuntu Server。对于初学者,Ubuntu可以更好地上手,并且提供了很好提供了apt软件管理方式(这个是目前最好的软件管理方式),使用起来非常方便,同事Ubuntu的社区也非常的活跃,使用的人数也较多。遇到问题也可以很方便的找到答案。

Ubuntu的更新周期比较稳定,每六个月会发布新版本,分别在每年的4月和10月,而Ubuntu Desktop的生命周期为1.5年,Ubuntu Server的生命周期为5年。同时Ubuntu还有一个LTS版本,即长期支持( Long Term Support ) ,他的生命周期为3年。

下载地址:http://www.ubuntu.com/

二、Debian GNU/Linux

Debian非常适合追求性能和稳定的个人用户使用,同样的他是基于apt的软件管理模式可以让你非常方便的管理软件。虽然ubuntu是基于Debian进行的二次开发,但是并不代表Ubuntu会比Debian好。Debian更多追求的是稳定,可能Debian的相比相比要比Ubuntu低一些,但是服务器最重要的不就是稳定吗?如果是生成环境,个人建议Debian还是会比Ubuntu好一些。Debian主要分三个版本:稳定版本(stable)、测试版本(testing)、不稳定版本(unstable)。

Debian大概每两年发布一个新的版本,而每个版本的生命周期大概为3年,即新版本发布后还会对老版本维护一年。

下载地址:http://www.debian.org/

三、CentOS和Rad Hat(RHEL)

RedHat 在发行的时候,有两种方式:二进制的发行方式以及源代码的发行方式。无论是哪一种发行方式,你都可以免费获得,并再次发布。但如果你使用了他们的在线升级(包括补丁)或咨询服务,就必须要付费。

RedHat 一直都提供源代码的发行方式,CentOS 社区将 Redhat 的网站上的所有源代码下载下来,进行重新编译,形成一个可使用的二进制CentOS版本 。由于 LINUX 的源代码是 GNU ,所以从获得 RedHat 的源代码到编译成新的二进制,都是合法。只是RedHat 是商标,所以必须在新的发行版里将 RedHat 的商标去掉。

RedHat 对这种发行版的态度是:“我们其实并不反对这种发行版,真正向我们付费的用户,他们重视的并不是系统本身,而是我们所提供的商业服务。”所以, CentOS 可以得到 RedHat 的所有功能,甚至是更好的软件。但CentOS 并不向用户提供商业支持,当然也不负上任何商业责任。

Redhat 有两大 Linux 产品系列:

1、免费的 Fedora Core 系列,主要用于桌面版本,提供了较多新特性的支持。更新频繁、不适合做服务器系统。

注:Fedora 主要是Red Hat作为新技术的测试平台,被认为可用的技术最终会加到Red Hat Enterprise Linux中,Fedora大约每六月发布一个新版本,而每3个Fedora版本后会有一个Red Hat版本的出现。

2、收费的 Enterprise 系列

CentOS 是基于Red Hat Enterprise Linux 的源代码进行编译的。

选用 CentOS 还是 RedHat ,取决于你所在公司是否拥有相应的技术力量及公司的资金水平。

CentOS和RHEL一样生命周期均为10年,即一个版本会被维护10年,另外相同版本的CentOS一般会比RHEL晚推出1~2月,补丁会晚推出1~2周。

四、Gentoo & Arch Linux

Gentoo可以说是目前定制性最强的Linux系统了,主要原因是从内核开始都需要你自己去编译,Gentoo使用源码来做包管理,其实不仅仅是USE所控制又不只是装多少包,你还能控制编译选项,使得所获得的程序更加是你所期望的。此操作系统特别适合Geek使用,但是更多的人不太喜欢自己去做编译这档子事。Geetoo针对超级发烧友用户,Level不达标的不要随便折腾。

Arch Linux也是很高定制性的linux发行版,它与Gentoo不同的是,它是基于二进制包的发行版,Arch 采用 滚动升级策略,这就允许一次安装持续升级,完全不需要重新安装或者解决系统版本升级带来的种种复杂问题。通过输入一行命令,Arch 系统就可以保持最新。Arch 刚安装后只提供了一个最基本的系统,可以让用户按照自己的喜好,通过仅仅安装自己需要的软件来配置自己的理想的环境。官方没有提供图形界面配置工具,大多数系统配置需要通过从命令行编辑简单的文本文件来配置。

五、FreeBSD&OpenBSD&NetBSD

除了Linux外,也可以选择BSD系列作为服务器的操作系统。

在免费的BSD中,FreeBSD是名声最大的。不得不说的是,苹果公司的Mac OS X 和iOS也是基于FreeBSD创建的。FreeBSD的中文参考资料也是最多的。三者的区别为FreeBSD注重性能、OpenBSD注重安全。NetBSD注重可移植性。

OpenBSD被称为世界上最安全的操作系统。OpenBSD的主页(www. openbsd.org)报告说OpenBSD“在默认安装情况下在过去的所有日子里只有两个安全漏洞”,它的意思是说(其实任何人都知道)在过去的四年内发布的OpenBSD版本没有一个被来自Internet的袭击攻破。

NetBSD也是免费BSD的一种,它是基于BSD的最轻便的操作系统。目前能够在46种之多的不同硬件构架上运行。   这种便携性使得NetBSD成为嵌入式系统(在其它设备中运行的,看不见的计算机)的最佳选择。

via http://www.biaodianfu.com/choose-linux-server.html 

Linux:五款应用让Linux桌面变成工作好帮手

以前把Linux应用到办公上,确实是一种挑战。因为大多数公司都是依赖专门的软件,而且这些软件几乎只能在Windows上运行。但是,时代在改变,现在很多业务都是通过web浏览器来吹来。而且,Linux平台的发展也已经成熟,如果能利用开源环境办公,那你将获得很多好处。

Linux:五款应用让Linux桌面变成工作好帮手
Linux:五款应用让Linux桌面变成工作好帮手

如果你也认为不可能用Linux办公。那我可以告诉你现在情况不同了。有了下面的五个应用,你就可以享受Linux的节能,稳定,可靠,灵活和安全等各项优点。对这几款常见的工具,你会刮目相看。

1. Chrome

现在很多业务是通过Web浏览器来处理。为什么不使用市场上最快的浏览器之一呢?Chrome不仅速度快,还提供了大量插件可扩展Chrome的性能。唯一的遗憾是没有用于Linux的ActiveX。缺少ActiveX,不能怪Chrome。不过可用IEs4Linux来解决。使用Wine,就可以使用IEs4Linux了,稍微动一动手,就能当ActiveX用来额。除了ActiveX的遗憾以外,Chrome确实是能帮助Linux成为工作好帮手的浏览器。 

Linux:五款应用让Linux桌面变成工作好帮手
Linux:五款应用让Linux桌面变成工作好帮手

2. Thunderbird

很多人会说没有什么可以取代Outlook。在发现Exquilla和Lightning Exchange Provider之前,我也会赞成这种说法。加入了上述两种插件后,你就可以连接Exchange服务器了。安装完扩展后,就可以弃用Outlook了。

Linux:五款应用让Linux桌面变成工作好帮手
Linux:五款应用让Linux桌面变成工作好帮手

3. Scribus

如果你需要创建专业的PDF文档,就非Scribus莫属了。先确保自己用LibreOffice创建了一个文档,然后将其输出到PDF, 但是,因为是使用Scribus,所以你是在和一款专业级别的布局工具打交道。图层,透明度,框架,CMYK支持,ICC配置文件支持,PDF,EPS,SVG输入以及更多能帮你创建专业宣传册,互动PDF,培训手册甚至是书籍的功能。

Linux:五款应用让Linux桌面变成工作好帮手
Linux:五款应用让Linux桌面变成工作好帮手

4. LibreOffice

缺少Office套件的办公桌面是不完整的。考虑到我们是使用Linux,所以可以有两种选择:LibreOffice和金山Office。尽管我个人更喜欢金山Office的Word处理器,但是它缺少一个必需的业务工具–数据库。而LibreOffice里有你需要的一切:Word处理器,电子数据表,演示,画图,公式和数据库。而且借助LibreOffice的插件系统,你可以对Office套件的默认功能进行扩展。

Linux:五款应用让Linux桌面变成工作好帮手
Linux:五款应用让Linux桌面变成工作好帮手

5. VirtualBox

你肯定经常遇到一些只能在Windows环境运行的专用软件。当出现这种情况时,你可以在VirtualBox中加载一个虚拟机,然后就可以在任何你选择的OS中运行软件了。Mac用户一直都是用Parallel实现这一操作,所以有什么能阻止Linux用户享受多平台环境呢?而使用VirtualBox虚拟机,就不再担心不能随心所欲使用软件了。不过,也有负面影响:你得有充足的资源作保障(尤其是RAM),而且还需要用于微软OS的有效许可证。

Linux:五款应用让Linux桌面变成工作好帮手
Linux:五款应用让Linux桌面变成工作好帮手

结语

办公方式已经改变。现在的桌面不再受限于平台,而是关乎连接性。借助浏览器和一些便利的工具,你就可以在办公电脑上运行Linux。当然,并非每种业务需求都能得到同等满足。在某些特定平台上,一些需求确实无法得到满足。所以,VirtualBox这样的工具就有了用武之地。

原文链接:http://www.techrepublic.com/blog/five-apps/five-apps-to-make-the-linux-desktop-business-ready/1896 

via http://os.51cto.com/art/201306/399658.htm 

 

 

Linux:入门:查看Linux系统的平均负载

1.平均负载的概念

有时候我们会觉得系统响应很慢,但是又找不到原因,这时就要查平均负载了,看它是否有大量的进程在排队等待。特定的时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度,所以我们通常会在自己的网站或系统变慢时第一时间查系统的负载,即CPU的平均负载。

Linux:入门:查看Linux系统的平均负载
Linux:入门:查看Linux系统的平均负载

2.查看平均负载

究竟应该如何查看平均负载呢?最简单的命令是uptime,如下所示:

[root@localhost ~]# uptime  11:31:11 up 11 days, 19:01,2 users,load average: 0.02, 0.01, 0.00 

目前的主流服务器都是双4核,有相当强悍的CPU,做一般的应用服务的话,Linux系统的负载这块倒不用我们担心。

还可以用w命令来查看,顺便可以查看一下系统当前有哪些用户,他们占用了哪些终端,如下所示:

[root@localhost ~]# w  

命令显示结果如下所示:

11:33:00 up 11 days, 19:03,2 users,load average: 0.00, 0.00, 0.00 USER TTYFROMLOGIN@ IDLE JCPU PCPU WHAT  root pts/1113.57.224.3 09:032:11m0.04s0.04s -bash  root pts/2113.57.224.3 11:310.00s0.02s0.00s w  

另外,还有动态命令top,这个命令也可以反映系统负载情况,在下面的命令提示中,我们只关心加粗字体部分。

[root@localhost ~]# top  

系统会动态地显示内容,结果如下所示:

top – 15:01:25 up 12 days,3:46,2 users,load average: 1.76, 2.14, 2.20 Tasks: 116 total, 1 running, 115 sleeping, 0 stopped, 0 zombie Cpu(s): 47.5% us, 14.6% sy,0.0% ni, 37.6% id,0.3% wa,0.1% hi,0.0% si Mem: 8180164k total,7673268k used, 506896k free,74592k buffers Swap:0k total,0k used,0k free,4613728k cached  

第一行内容正是系统目前的负载情况,再通过uptime查看一下。

[root@ud50053 ~]# uptime  

结果如下所示:

15:02:50 up 12 days,3:48,2 users,load average: 1.75, 2.07, 2.17 

原来它所表示的是过去的1分钟、5分钟和15分钟内进程队列中的平均进程数量。

这里需要注意的是load average这个输出值,这三个值的大小一般不能大于系统逻辑CPU的个数,例如,本输出中系统有4个逻辑CPU,如果load average的三个值长期大于4时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于4时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲,比如本例中的输出,CPU是比较空闲的。

这时候可以结合vmstat命令来判断我们的系统是否过于繁忙,如果确定很繁忙的话,就要考虑是否更换服务器或增加CPU的个数了。总结如下:

如果r经常大于系统的逻辑CPU个数,且id经常少于50,则表示CPU的负荷很重。 

via http://book.51cto.com/art/201208/354177.htm 

Linux:用WINE在Linux/Mac上运行Windows程序

Linux平台有着数以千计的应用软件,正在开发的更是数不胜数。虽然我很喜欢Linux和开源软件并且将他们作为自己的日常环境,但当你有时候遇到一款非常喜爱的Windows软件,还是会想知道它能不能运行在Linux上。比如以前我打开Windows玩CS的时候我就思考过这个问题,类似的还有一些人希望在Linux上运行Photoshop,因为毕竟想要适应GIMP不是那么容易。

游戏是一个重要的因素。必须承认的是,虽然Linux游戏正在努力追赶(比如更多的应用3D等技术),但在Windows上有多得多的好游戏让我们无法舍弃。

如果你和我有一样的愿望,现在这个愿望可以实现了。它就是WINE,一款针对所有这些情况开发的软件,它发布已经有段时间了。要是你使用Linux可能你听说过它。WINE名字来源于WINE Is Not an Emulator(WINE不是一个模拟器)的递归缩写(使用递归名字让人觉得惊奇,GNU和PHP是其他的使用递归名字的例子)。

WINE是什么?我能喝了它吗?

算了吧,你不会喜欢喝这样名字的东西!官方的说法,WINE是在X、OpenGL和Unix上对Windows API的开源实现。可以将Wine认为是运行Windows程序的一个适配层。

通俗的讲,这意味着你可以在Linux、FreeBSD、Solaris和Mac OS X上运行Windows程序!事实上,WINE最被广泛使用的是在Linux上运行Windows上的游戏。

太棒了!但是我还需要Windows吗?

完全不必要,WINE是Windows API的免费替代品,不包含任何的微软代码。

怎样才能运行Windows程序?

这是有趣的部分!当然第一步你需要安装WINE。从这里获取。如果你和我一样使用的是Ubuntu,打开终端直接敲入:

sudo apt-get install wine

它会替你设置好WINE。差不多就是这样,接下来按照下面的步骤,你就能安装好Windows里的软件或者游戏啦。没错,就是这么简单。我以Photoshop 8为例为你展示一下安装的步骤,看完你就知道我说的没错了:

第一步:安装

Linux:用WINE在Linux/Mac上运行Windows程序
Linux:用WINE在Linux/Mac上运行Windows程序

第二步:运行

Linux:用WINE在Linux/Mac上运行Windows程序
Linux:用WINE在Linux/Mac上运行Windows程序

第三步:打开一个帅哥的图片,开始工作吧!!

Linux:用WINE在Linux/Mac上运行Windows程序
Linux:用WINE在Linux/Mac上运行Windows程序

我能运行所有的Windows程序吗?

并不是这样,有上万的程序(最近的数字是10349)能稳定的运行在WINE上,这些数据可以在WINE应用数据库中查到。它将软件分类为白金、黄金、白银、青铜还有垃圾级别,白金级别意味着最优、没有问题,同样的垃圾级别意味着。。。好吧。。。就是垃圾!(当然这里是指和WINE的兼容性,并不是软件本身)

不过你也不需要为此感到伤心,很多热门软件都位列于白金、黄金和白银级别。再往后的级别最好就不要去尝试了。也有可能你需要的程序不在这个数据库中,当然你可以尝试一下,发布出来,让世界知道这个程序的兼容性如何!

这里是一些最常用的软件,它们都能在WINE上运行得丝滑顺畅:

  • Photoshop CS2, other versions too but not CS3 – Platinum and Gold
  • Half Life 2 – Platinum Counter Strike
  • ACDSee – Platinum
  • Command and Conquer – Gold
  • Microsoft Office 2003 – Silver
  • Call of Duty – Gold
  • ….. 更多

性能如何?

WINE并不会拖慢你的电脑,程序的性能和在Windows上运行是一样的(不多不少)。事实上,这比在虚拟机上运行要快,因为运行两个操作系统不可避免的需要更多的资源。针对这个问题可以参考“Debunking WINE myths” 。

总之如果你不想放弃Windows程序,亦或你想在Linux上玩Windows游戏,试试WINE吧。你,值得拥有!

via http://www.geekfan.net/1742/ 

Linux:用virtualbox搭建私有云计算平台

virtualBox是一个非常好用的虚拟机软件,而且还跨平台,以前用过的都是桌面版,现在有一台ubuntu server,没有安装图形界面,google了一下,果然可以。效果和ec2或者linode vps差不多。再加上一个控制面板,估计就差不多了。

安装

ubuntu server 下安装的话,可以下载最新版 https://www.virtualbox.org/wiki/Linux_Downloads。然后安装就可以了。出现问题及时google。现在各种教程太多了。

然后安装扩展Oracle VM VirtualBox Extension Pack

vboxmanage install extpack xxx.vbox-extpack

下面开始从ubuntu-13.04-server-amd64.iso镜像创建一个虚拟机

#创建一个虚拟机vboxmanage createvm –name ubuntu1304 –ostype Ubuntu_64 –register

#编辑一下基本配置vboxmanage modifyvm ubuntu1304 –memory 512 –cpus 1 –acpi on –bioslogoimagepath /home/zenith/logo.bmp –boot1 dvd

#创建一个虚拟硬盘vboxmanage createhd –filename /home/zenith/ubuntu1304.vdi –size 20000

#创建一个storagectl,来挂载硬盘和光盘vboxmanage storagectl ubuntu1304 –name “IDE Controller” –add ide –bootable on

#挂载硬盘vboxmanage storageattach ubuntu1304 –storagectl “IDE Controller” –port 0 –device 0 –type hdd –medium /home/zenith/ubuntu1304.vdi

#挂载光盘vboxmanage storageattach ubuntu1304 –storagectl “IDE Controller” –port 0 –device 1 –type dvddrive –medium /home/zenith/ubuntu-13.04-server-amd64.iso

#开启虚拟机。通过远程桌面连接安装系统VBoxHeadless -s ubuntu1 -e TCP/Ports=9001

#安装完成以后。删除光驱vboxmanage storageattach ubuntu1304 –storagectl “IDE Controller” –port 0 –device 1 –type dvddrive –medium none

#端口映射vboxmanage modifyvm ubuntu1304 –natpf1 guestssh,tcp,,2000,,22

#删除端口映射vboxmanage modifyvm ubuntu1304 –natpf1 delete guestssh

#克隆vboxmanage clonevm ubuntu1304 –name ubuntu1 –register

这样就可以了。对于克隆的linux虚拟机,启动的时候,连不上网。需要更改/etc/udev/rules.d/70-persistent-net.rules文件。把eth0那一行删了。然后把eth1改成eth0.重启即可。可能是因为虚拟机clone,mac地址换了,所以ubuntu linux识别出一个新网卡的原因。

vboxmanage命令比较强大。当然,可以直接编辑.vbox文件,但是正如看到的,vbox头部已经说明了:

** DO NOT EDIT THIS FILE.** If you make changes to this file while any VirtualBox related application** is running, your changes will be overwritten later, without taking effect.** Use VBoxManage or the VirtualBox Manager GUI to make changes.

一开始觉得vboxmange命令太麻烦了,走一遍就熟悉了。当然,官方文档是最好的参考:http://www.virtualbox.org/manual/ch08.html。不知道这个文档是否有中文版,有时间的话,可以抽空翻译一个。

在google code上发现一个用php写的virtualBox GUI的东西:https://code.google.com/p/phpvirtualbox/。还没试用,看着不错。不错既然有ssh控制宿主机了。gui也无所谓了。

现在运行的是安装好一个系统,然后保存着,需要的话,直接vmclone出来一个新的,使用。很方便,跟ec2或者linode vps效果差不多。

FAQ

安装完系统,如何移除虚拟机光驱?

vboxmanage showvminfo xp1

找到光驱的位置,比如IDE Controller (0, 1):

vboxmanage storageattach “windows xp” –storagectl “IDE Controller” –port 1 –device 0 –medium none

vboxheadless -s 启动以后,用远程桌面链接,感觉鼠标不同步,怎么解决?

没有安装扩展包。先去官网下载对应操作系统的扩展包,比如 VBoxGuestAdditions_4.2.12.iso,然后挂载,进入客户机,安装,重启。

如何更改客户机BIOS启动logo?

vboxmange确实提供了这个设置。搜索bioslogoimagepath。

远程桌面连接,黏贴板不同步

vmboxmange设置:

[–clipboard disabled|hosttoguest|guesttohost|bidirectional]

 

via http://gfzj.us/545.html 

Linux:为 Ubuntu 安装漂亮的 Screenlets 小工具

Screenlets 桌面小工具,可能很多童鞋都用过,Screenlets 是迷你小工具插件 (widgets) 可以很方便的从桌面中添加和删除这些小工具。这些小工具既能美化你的桌面又能让你很方便的读取一些数据。

Linux:为 Ubuntu 安装漂亮的 Screenlets 小工具
Linux:为 Ubuntu 安装漂亮的 Screenlets 小工具
screenlets

最新版本为Screenlets 0.1.4 相对以前的版本更加美观而且还带来了更多小工具,安装后慢慢挑选吧!

Ubuntu用户你可以在软件中心搜索安装,也可以使用下面的PPA源,使用最先版本。

打开终端输入下面的命令:

sudo add-apt-repository ppa:screenlets/ppasudo apt-get updatesudo apt-get install screenlets

 

Linux:RHEL/CentOS系统的社区维护资源整合

Linux各个发行版的技术上虽然有差别,但一般不至于有很大鸿沟,实际上更复杂的其实是各个发行版的维护社区的工作方式和交流文化的差别,如果不了解去利用相应的社区资源,就会觉得维护这个发行版异常吃力,从而产生“XXX发行版不好用”的错觉。

因为工作原因最近我接触维护的系统多为CentOS,之前对CentOS的印象都是“又古老又难维护”,不过几个月的积累下来,发现RH系的社区资源并不比Debian/Ubuntu的少,只不过是国内的维护文化和他们的相去甚远,几乎无法兼容,以致很多人都缺乏了解,所以觉得需要撰文列举下这些资源。

以下很多第三方仓库都在Centos Wiki有介绍

仓库列表

维护仓库的通常是一群维护者,有个论坛、邮件列表等,有什么需求,或者有什么BUG,可以直接去和维护者沟通。下面都是列出了主页的一些仓库,留意主页的链接可以找到交流方法了。

官方仓库

默认安装的CentOS的yum,/etc/yum.repos.d/CentOS-Base.repo是基本的源仓库;里面各个仓库名下mirrorlist是官方列表,yum的fastestmirror插件会从其中选择一个来更新;而如果注释了mirrorlist写baseurl,就只从这一个仓库更新了。可以参考163源的CentOS5-Base-163.repo

这些是CentOS/RedHat官方维护的,就是那些“老旧过时”而且“几乎什么都没”,只要不是出现严重漏洞都不会更新那些。

FedoraProject for EPEL

Fedora和Redhat的关系就不详述了,就是FedoraProject里有个“EPEL Special Interest Group”,为EPEL系维护的一个社区仓库,基本上加上这个仓库后就能丰富了整个EPEL生态了,在Debian系里面“理所当然源里就有”的那些软件就会有了,比如openvpn,htop,ipcalc,git … 虽然版本不会很新,但起码能用了。

用法:安装这些链接页面里面的.rpm。

RPM Fusion

这个仓库说提供的是FedoraProject跟RedHat都不想提供的程序,提供的分类就知道怎么回事了,基本都是Sound and Video,Games and Entertainment,Hardware Support等等。首先是Linux平台下多媒体支持方面的版权问题非常复杂,ffmpeg/x264等通常都有一些争议行的授权,当然也有nvidia/ati等硬件的闭源驱动、Oracle的闭源版Virtualbox等,把他们独立出来避免争端。

另外这个仓库基本提供的更新都是for Fedora,EPEL5/6的几乎没更新。可以说RPMFusion是个“桌面仓库”,而且国内163源提供了RPMFusion的镜像

用法: 见Configuration

RepoForge

原叫RPMForge,和CentOS社区较紧密,提供的包也比较海量的,很难评价分什么方向,CentOS Wiki专门有页面提供安装指导,因为包的数量太海量了很难和“FedoraProject for EPEL”做比较。

用法: 见Usage

Remi

这个仓库依赖EPEL。

提供了php54 / mysql55 / firefox 等等的更新,选的软件比较符合Web开发者工作的需要,当然服务器最好也是维护相同版本。这个仓库使用了github来管理软件包的spec,可以直接看他提供了什么包。更新非常紧贴各个软件的官方发布。

用法: 安装主页相应的remi-release-XX.rpm

KBS-Extras

CentOS本来的维护团队,有趣的一点是这仓库基本全在-testing里面提供软件包。

FedoraHosted – SoftwareCollections

这是重点推荐的。这不是一个仓库,是很多个。里面的软件包和上述那些仓库不大一样,都是在/opt下建立一套专用的目录,避免在/usr里面打架的软件包;这里提供了php/python/ruby/perl/mysql/postgre/apache等常用“服务器生态”。

用法:各个Collection的repo链接。

FedoraHosted

上述的只是FedoraHosted内一个子仓库,FedoraHosted是类似Ubuntu的PPA社区的环境,维护者可以通过建立自己的帐号然后建立一些自选软件的仓库。里面应该还有很多有用的东西待发掘。

Fedora People Repositories

一样是类似Ubuntu的PPA,不过这里就多数偏向Fedora的更新,也有些有EPEL6。

Pramberger, pp

这个仓库主要提供EPEL 3/4/5等旧版本的一些包的更新,有php,python的第三方模块、qt、squid等的更新,大概还是偏向更新服务器环境的吧。

用法:保存http://devel.pramberger.at/getrepo?release=到/etc/yum.repos.d,注意替换release参数(3|4|5)。

ELRepo

偏内核的新硬件支持模块。

IUS Community Repo

提供PHP, Python, MySQL更新,不过感觉更新不够Remi紧密。

PS.维护技巧

yum的仓库选择

/etc/yum.repos.d/下的文件记录着各个仓库的信息,上述很多仓库在安装之后会在这里生成一个.repo,但里面的仓库不一定被启用了,里面可能写了enabled=0。

一般来说,为了避免系统升级时候和第三方的包出现冲突,第三方的仓库都应该enabled=0,在需要使用、查找其中软件时候,使用yum的参数:

yum –enablerepo=remi install firefox-langpack-fr

下载SRPM

一定需要定制编译特定软件时候,这些仓库都提供SRPM仓库的,但是默认可能没开启。(yumdownloader需要安装yum-utils)

yumdownloader –enablerepo=epel-source –source php

Yum/Rpm常用命令

Rpm/dpkg、yum/apt-get对照

http://www.pixelbeat.org/docs/packaging.html 

via http://os.51cto.com/art/201306/400424.htm 

Linux:谁贪占了我的系统资源 php-fpm

编者按:本文的分析思路值得参考。

测试人员向我们反映:在Facebook平台的游戏比其它平台的游戏明显更慢。我询问,是不是因为翻墙网络原因。他们说:不是,其它游戏也比较流畅。

使用httpwatch查看了http请求,发现api.php请求花了6秒,且大部分时间是红色(httpwatch红色表示服务器运算时间)。平常2秒,现在6秒,服务器处理时间在不同的服务器相差这么多。

直觉告诉:服务器资源。

服务器概况

  • 操作系统:CentOS5.3-64-2.6.18-164.el5
  • 应用服务Nginx0.6、PHP-Fpm、MySQL5.1、PHP5.2、Memcached
  • Memcached仅cached游戏系统设置与模板参数据

故障检测

1.别的先不管,先top看一下cpu、ram、swap哪个比较紧张。

Linux:谁贪占了我的系统资源 php-fpm
Linux:谁贪占了我的系统资源 php-fpm

由上图分析,可以看出共有602个进程,其中有601个进程休眠了。这好像有点不对劲,内核进程也就80个左右,加上memcached, nginx, mysqld,也不会超出90个。除了这些,剩下的只有php-fpm管理的php-cgi,难道是…?

CPU显示,CPU压力并不大,可以说没有压力。我们再看内存使用概要,发现4G的内存,消耗得所剩余无几(free+buffers), 95%以上的内存都已分配。交互空间使用情况,我们暂时不去关心。指令top还列出了占用资源最多的进程,运行时间最久(Time+)的mysqld(约2小时)占用资源并不是最多。另外,再看php-cgi,单个php-cgi占用的内存也不算多。所以,可以大胆地猜想:服务器内存资源比较紧张,并没有被某个进程占用大量内存,有可能被某些挂起的进程占着内存没有释放。通过free进一步监控内存使用情况,验证我们的想法。

2.指令free,了解RAM资源使用情况。当然,你也可以查看文件/proc/meminfo

我们先来看Mem统计信息,total表示物理内存总量,约4G。used,表示已分配内存,分配了并不表示使用了,包括(buffer&cached)。free指未分配的内存,buffers与cached表示分配了但还没有被使用的内存。第二行(buffers/cache)的,used表示真正被使用了内存,由第一行的(used-buffer-cached)得到,free则表示还没有被使用的内存,由第一行的(free+buffer+cached)得到。Swap行则表示内存交换使用情况,少量的(不频繁地)swpd,是不会影响服务器性能的,因为系统需要将V类型的内存页面交换出去或者调整了buffer与cached的大小。但是频繁地swpd,则有可能意味着服务器物理内存不足,小于指定的swap额定值,需要换出内存页。

查看free结果的时候,我们主要查看第二行。一眼就能看出4G的内存,其中有3898M内存被用了,还有49M内存没有,都快用完了。这也证实了我们第一步的猜想,内存被用完。这里,我们进一步猜想,内存空间严重不足的情况下,进程会被blocked,系统会不断地将不用的数据换出so,将要用的数据读入si。我们能通过vmstat进一步验证,我们的这个猜想。

3.指令vmstat监控内存使用情况

作为对内存监控,我们比较关心swpd、free、si、so。一般系统不繁忙的状态下,我们看到swpd,so的值不会持续很高,经常为0。这里,我们看到swpd值为1.5G,以及free值很小,再一次表明物理内存不足。其中si报告了每秒从swap区移入到物理内存的内存总量,so报告了每秒从物理内存移出到swap区的内存总量。当然,si有时较大,并不要过份的焦虑,经常碰到一个程序需要较大内存来读写媒体文件时,si值就会变大。反倒是so,它通常是一个内存紧缺的一个信号,如果长时间这个值一直保持较大的话,则很有可能内存不够,小额波动,可以不用理会。接下来,可以通过ps找出消耗内存的元凶。

4.指令ps找出消耗内存的元凶

Linux:谁贪占了我的系统资源 php-fpm
Linux:谁贪占了我的系统资源 php-fpm

指令ps比较常用,也比较简单。上面报告结果,我们一眼就可以命中php-cgi这个进程。虽然单个php-cgi占用内存并不算太大,但是503个php-cgi进程,就有点恐怖了。几乎占尽了全部内存(503*0.3%)。我们可以猜想,php-cgi由php-fpm管理,是不是可以php-fpm的某个参数配置不当,导致打开过多的php-cgi进程。

5. 设置php-fpm进程数量管理

通过重新将php-conf.conf的max_children值设置为150,系统内存又恢复到正常使用情况。free、si、so、b均表示内存系统资源正常,没有压力。

php-cgi进程释放的内存并不会被系统立即回收,一个php-cgi大概占用20MB内存(取决于你加载的php extensions)。所以,有必要限制你启动的php-cgi进程数量。那么,这个数量多少合适呢,你可以在服务器高峰期通过top统计出php-cgi数量。也可以像php-fpm建议的那样,通过netstat -np | grep 127.0.0.1:9000来收集数据,通过设置max_children使等待的数量尽量小

6.一个php-cgi占用多少内存

一个php-cgi进程,大概占用多少内存呢,大概是20MB(具体的要看你的php加载了多少模块)。可以通过pmap指令查看哪些地方占用了内存。所以,尽量不要加载不必要的php扩展模块,可以减少不必要的内存浪费。

Linux:谁贪占了我的系统资源 php-fpm
Linux:谁贪占了我的系统资源 php-fpm

via http://www.perfgeeks.com/?p=599 

Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据

  数据的重要性就不必多说了,如果你曾经有过丢失数据的经历,那么你就会明白。不要相信你的服务器,不要相信你的计算机,不要相信任何一个数据存储设备。只有不断的做多个备份,才能让我们安心一点。

  Deja Dup 是一个可以帮助你备份数据的程序,并且加密他们,它也很容易使用。还具有定时备份功能等等。

Deja Dup 的一些特性功能:

  • 支持本地备份和远程备份,包括备份到 Amazon S3 云服务器
  • 加密和压缩数据
  • 增量备份,可以让你从任何数据量上来回复
  • 定时备份

  如果您正在使用 Ubuntu 11.10 以上版本,Deja Dup 就已经包含在了您的系统中,您可以在 system settings 中找到它。

Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据

  运行 Deja Dup 的时候,您可以看到 Deja Dup 的界面上有两个大大的按钮,它们是“恢复以前备份的数据”和“设置备份参数”。

Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据

  您可以从设置中看到,默认是备份 Home 文件夹,不过其中不包括回收站和下载文件夹,您可以通过点击界面上的 + 和 – 按钮来更改它们和设置您所需要备份的文件夹。

Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据

  选择好文件夹后,您可以设置备份的文件所处的位置,是备份到本地还是远程。

  然后您就可以点击 “Back Up Now” 来立即生成第一个备份了。

Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据

  您还可以给您的备份创建一个密码,以防数据被盗后给您造成其他损失。

Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据
Linux:不要迷恋TAR了,使用 Deja Dup 在 Ubuntu 下备份你的数据

  备份完成后,Deja Dup 会告诉您备份已经完成。

 已同步至 linux的微博

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

Linux:在CentOS/RHEL 6.4上安装Chromium

是的,之前Google就说了,由于CentOS/RHEL 6已经是过期的系统,所以不再会有Chrome了。虽然后来由于引起了社区的抗议,从而改口,不再提CentOS/RHEL 6是过期系统了;但是,目前在CentOS/RHEL 6上已经没有Chrome可以下载使用了。

其实,根本的原因不是CentOS/RHEL 6有多老,连Windows XP和停止更新的Ubuntu 10.04都能继续使用Chrome呢。实际的原因是,Chrome由于种种考虑,使用了CentOS/RHEL 6中所不支持的C++ 11,所以才不能继续更新CentOS/RHEL 6上的Chrome。

那么,如果希望在CentOS/RHEL 7出来之前继续使用Chrome怎么办?使用Chrome的开源版本:Chromium。

1、切换到root:

su – 或者 sudo -i

2、下载新的软件源定义:

cd /etc/yum.repos.d

wget http://people.centos.org/hughesjr/chromium/6/chromium-el6.repo 

3、安装Chromium:

yum install chromium

这样就安装完成了。

可以通过菜单来启动浏览器:

Linux:在CentOS/RHEL 6.4上安装Chromium
Linux:在CentOS/RHEL 6.4上安装Chromium

 

启动后:

Linux:在CentOS/RHEL 6.4上安装Chromium
Linux:在CentOS/RHEL 6.4上安装Chromium

如果需要查看Flash和PDF,可以继续下面两步来安装插件。

4、安装Pepper Flash插件:

4.1、下载 hughesjr 辅助安装脚本:

cd /tmp

wget https://raw.github.com/hughesjr/chromium_el_builder/master/chrome_pepperflash_copy.sh

4.2、设置 chrome_pepperflash_copy.sh 为可执行:

chmod +x chrome_pepperflash_copy.sh

4.3、 执行脚本进行安装(你可以查看一下脚本内容来了解发生了什么):

./chrome_pepperflash_copy.sh

安装后,如果需要通过命令行方式启动(带有Flash支持),可以输入以下命令:

/opt/chromium/chrome-wrapper %U –ppapi-flash-path=/opt/chromium/PepperFlash/libpepflashplayer.so –ppapi-flash-version=$(grep ‘”version”:’ /opt/chromium/PepperFlash/manifest.json | grep -Po ‘(?<=version": ")(?:d|.)*')

也可以修改系统菜单中的对应命令。

Linux:在CentOS/RHEL 6.4上安装Chromium
Linux:在CentOS/RHEL 6.4上安装Chromium
 

5、安装Google Chrome PDF Viewer插件:

5.1、下载 hughesjr 辅助安装脚本:

cd /tmp

wget https://raw.github.com/hughesjr/chromium_el_builder/master/chrome_libpdf_copy.sh

5.2、设置 chrome_libpdf_copy.sh 为可执行:

chmod +x chrome_libpdf_copy.sh

5.3、执行脚本进行安装(你可以查看一下脚本内容来了解发生了什么):

./chrome_libpdf_copy.sh

Linux:在CentOS/RHEL 6.4上安装Chromium
Linux:在CentOS/RHEL 6.4上安装Chromium

 

 

参考资料:http://www.if-not-true-then-false.com/2013/install-chromium-on-centos-red-hat-rhel/  

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

Linux:5 个获取 Linux 主机信息的命令

  Linux 系统管理员在接手一台新的服务器的时候,如果没有好的交接文档,我们可以得到的主机信息就要靠我们自己了。很多信息是可以直接通过命令从主机上获得的,下面就和大家分享 5 个获取 Linux 主机信息的命令。(注:我使用的是 Ubuntu 13.04)

1. 查看或改变 Linux 主机名的命令

$ hostnamemylinuxbook-Inspiron-1525

  从命令结果上您可以看到我的 Ubuntu 主机名是 mylinuxbook-Inspiron-1525。您可能会注意到,主机名通常也出现在命令提示符下,所以很多时候我们将主机名改短一些可能会更方便使用。

  通过如下命令来改变它:

$ sudo hostname mylinuxbook

  注意,改变主机名需要 root 权限,所以我在上面使用了 sudo 命令来提升权限。如果您执行了上面的命令,那么您可以立即打开一个新的终端,在终端中您就能查看到您新的主机名,同时您会看到新的名称的命令提示符。

  不过通过这个命令修改的主机名是一个临时功能,一旦您重启您的服务器,这个名称将不会存在。如果您需要永久的修改主机名,那么您需要修改 /etc/hostname 文件。

2. host 命令

  这个命令可以让您来查看主机的 IP 信息,

$ host google.comgoogle.com has address 74.125.236.72google.com has address 74.125.236.78google.com has address 74.125.236.73google.com has address 74.125.236.71google.com has address 74.125.236.65google.com has address 74.125.236.69google.com has address 74.125.236.66google.com has address 74.125.236.64google.com has address 74.125.236.67google.com has address 74.125.236.68google.com has address 74.125.236.70google.com has IPv6 address 2404:6800:4007:801::1004google.com mail is handled by 10 aspmx.l.google.com.google.com mail is handled by 20 alt1.aspmx.l.google.com.google.com mail is handled by 30 alt2.aspmx.l.google.com.google.com mail is handled by 40 alt3.aspmx.l.google.com.google.com mail is handled by 50 alt4.aspmx.l.google.com.

  从命令的运行结果我们可以看到主机的 IP (IPV4 和 IPV6)以及邮件服务器相关的信息。

  如果您还想查看 DNS 记录,可以使用 -a 参数

$ host -a google.comTrying “google.com”;; ->>HEADER<;; flags: qr rd ra; QUERY: 1, ANSWER: 21, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;google.com.            IN    ANY;; ANSWER SECTION:google.com.        211    IN    AAAA    2404:6800:4007:800::1009google.com.        299    IN    MX    10 aspmx.l.google.com.google.com.        299    IN    MX    50 alt4.aspmx.l.google.com.google.com.        299    IN    MX    20 alt1.aspmx.l.google.com.google.com.        299    IN    MX    30 alt2.aspmx.l.google.com.google.com.        299    IN    MX    40 alt3.aspmx.l.google.com.google.com.        267    IN    A    74.125.236.168google.com.        267    IN    A    74.125.236.165google.com.        267    IN    A    74.125.236.166google.com.        267    IN    A    74.125.236.167google.com.        267    IN    A    74.125.236.164google.com.        267    IN    A    74.125.236.174google.com.        267    IN    A    74.125.236.163google.com.        267    IN    A    74.125.236.169google.com.        267    IN    A    74.125.236.162google.com.        267    IN    A    74.125.236.161google.com.        267    IN    A    74.125.236.160google.com.        136467    IN    NS    ns3.google.com.google.com.        136467    IN    NS    ns1.google.com.google.com.        136467    IN    NS    ns4.google.com.google.com.        136467    IN    NS    ns2.google.com.Received 412 bytes from 127.0.1.1#53 in 30 ms

  如果您需要查看域名服务器或者 SOA 信息,可以使用 -C 参数

$ host -C google.comNameserver 216.239.38.10:    google.com has SOA record ns1.google.com. dns-admin.google.com. 2013061800 7200 1800 1209600 300Nameserver 216.239.34.10:    google.com has SOA record ns1.google.com. dns-admin.google.com. 2013061800 7200 1800 1209600 300Nameserver 216.239.36.10:    google.com has SOA record ns1.google.com. dns-admin.google.com. 2013061800 7200 1800 1209600 300Nameserver 216.239.32.10:    google.com has SOA record ns1.google.com. dns-admin.google.com. 2013061800 7200 1800 1209600 300

  或者您可以使用 -d 或者 -v 参数来输出详细信息

$ host -v google.comTrying “google.com”;; ->>HEADER<;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;google.com.            IN    A;; ANSWER SECTION:google.com.        77    IN    A    74.125.236.40google.com.        77    IN    A    74.125.236.38google.com.        77    IN    A    74.125.236.34google.com.        77    IN    A    74.125.236.37google.com.        77    IN    A    74.125.236.36google.com.        77    IN    A    74.125.236.41google.com.        77    IN    A    74.125.236.35google.com.        77    IN    A    74.125.236.33google.com.        77    IN    A    74.125.236.46google.com.        77    IN    A    74.125.236.32google.com.        77    IN    A    74.125.236.39Received 204 bytes from 127.0.1.1#53 in 33 msTrying "google.com";; ->>HEADER<;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;google.com.            IN    AAAA;; ANSWER SECTION:google.com.        28    IN    AAAA    2404:6800:4007:800::1002Received 56 bytes from 127.0.1.1#53 in 28 msTrying "google.com";; ->>HEADER<;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;google.com.            IN    MX;; ANSWER SECTION:google.com.        13    IN    MX    40 alt3.aspmx.l.google.com.google.com.        13    IN    MX    50 alt4.aspmx.l.google.com.google.com.        13    IN    MX    10 aspmx.l.google.com.google.com.        13    IN    MX    20 alt1.aspmx.l.google.com.google.com.        13    IN    MX    30 alt2.aspmx.l.google.com.Received 136 bytes from 127.0.1.1#53 in 29 ms

  这个命令可以让您获得大量的主机信息。

3.  arch 命令

  这个命令可以让您得到系统的处理器系统构架信息。

$ archx86_64

  从命令执行结果来看,我的主机是 64 位的 x86 系列处理器。

4. uname 命令

  上面的 arch 只能得到系统的简单信息,如果想得到更多的信息,我们就需要使用 uname 命令了,uname 命令可以获取到操作系统名称、内核名称、内核版本、主机名、网络节点等信息。

  使用 -o 参数来查看操作系统名称

$ uname -oGNU/Linux

  使用 -s 参数来查看内核名称

$ uname -sLinux

  使用 -m 参数来查看系统构架信息,这个参数的得到的结果和上面的 arch 是一样的

$ uname -mx86_64

  还有如下命令您可以试一试:

$ uname -n linuxuser-laptop

 

$ uname -r 2.6.32-21-generic

 

$ uname -v #33-Ubuntu SMP Fri Apr 18 08:09:38 UTC 2011

 

5. dig 命令

  dig 命令是 DNS 查看工具,使用此命令可以查看域名服务器的主机地址

$ dig google.com; <<>> DiG 9.9.2-P1 <<>> google.com;; global options: +cmd;; Got answer:;; ->>HEADER<;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;google.com.            IN    A;; ANSWER SECTION:google.com.        227    IN    A    74.125.236.33google.com.        227    IN    A    74.125.236.38google.com.        227    IN    A    74.125.236.46google.com.        227    IN    A    74.125.236.40google.com.        227    IN    A    74.125.236.32google.com.        227    IN    A    74.125.236.37google.com.        227    IN    A    74.125.236.34google.com.        227    IN    A    74.125.236.35google.com.        227    IN    A    74.125.236.41google.com.        227    IN    A    74.125.236.39google.com.        227    IN    A    74.125.236.36;; Query time: 30 msec;; SERVER: 127.0.1.1#53(127.0.1.1);; WHEN: Sat Jun 22 15:38:58 2013;; MSG SIZE  rcvd: 215

 已同步至 linux的微博

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

Linux:如何在 Linux 下格式化 USB 设备

  很多时候,您的 USB 设备会出现一些错误。大多数时候这些错误可以通过重新格式化设备来消除。出现这种问题的时候,我会使用一个叫 GParted 的软件来重新格式化我的 USB 设备。如果您用 Ubuntu 的 Unity 管理界面,您需要安装一下 Gparted 工具。

安装命令如下:

sudo apt-get install gparted

Linux:如何在 Linux 下格式化 USB 设备
Linux:如何在 Linux 下格式化 USB 设备

  在得到询问您是否继续的时候,键入 “Y” 来让安装继续。

Linux:如何在 Linux 下格式化 USB 设备
Linux:如何在 Linux 下格式化 USB 设备

  然后等待它下载安装完成。

  安装完成后,您可以通过如下命令来使用它:

sudo gparted

Linux:如何在 Linux 下格式化 USB 设备
Linux:如何在 Linux 下格式化 USB 设备

  工具启动后,您可以在菜单中找到您的 USB 设备,点击您需要格式化的设备。

Linux:如何在 Linux 下格式化 USB 设备
Linux:如何在 Linux 下格式化 USB 设备

  您可以用鼠标右键来点击您的设备,并选择 unmount 来卸载设备。然后再去格式化它。您可以选择以 “FAT32” 格式来格式化它。

Linux:如何在 Linux 下格式化 USB 设备
Linux:如何在 Linux 下格式化 USB 设备

  当然了,格式化设备会导致您的数据丢失,所以在您备份好您的数据的情况下,确认这个操作。

 已同步至 linux的微博

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

Linux:sublime text 3 的管理插件:package control

sublime text 2不同的是,sublime text 3无法使用命令直接来安装package control,一直不明白,这么一个很好的工具,为什么不直接集成在软件里呢,还要这么麻烦的安装呢?相比sublime text 2来说,sublime text 3的安装过程相对要麻烦很多。

在搜索引擎中搜索后,有很多的安装方法,权衡各种方法,这里描述的方法应该是最简单的了。

1、安装package control主文件

网址:https://github.com/wbond/sublime_package_control

sublime text 3 插件:package control

点击zip下载,解压之后,把文件夹名称修改为“package control”。

2、安装package control 的 python3文件

网址:https://github.com/wbond/sublime_package_control/tree/python3

点击zip下载,解压之后,把里面的所有文件覆盖到刚才的“package control”文件夹里面。

3、安装到sublime text 3的程序包里

A、点击菜单->首选项->浏览程序包sublime text 3 插件:package control

B、复制刚才的“package control”文件到该目录下面。

sublime text 3 插件:package control

 

C、重新打开sublime text 3编辑器,在菜单->preferences->Package Settings和package control选项,就说明安装package control成功了。

sublime text 3 插件:package control

via http://qianduanblog.com/1900.html 

Linux:江南白衣的“关于Redis的常识”

转载按:本文说是常识,实在非常深入,对于Redis的使用者来说是不可多得的佳文。

版本:V3.0 2013-6-29 (江南白衣版权所有,转载请保留出处)

1. Overview

1.1 资料

1.2 优缺点

非常非常的快,有测评说比Memcached还快(当大家都是单CPU的时候),而且是无短板的快,读写都一般的快,所有API都差不多快,也没有MySQL Cluster、MongoDB那样更新同一条记录如Counter时慢下去的毛病。

丰富的数据结构,超越了一般的Key-Value数据库而被认为是一个数据结构服务器。组合各种结构,限制Redis用途的是你自己的想象力。

因为是个人作品,Redis目前只有2.3万行代码,Keep it simple的死硬做法,使得普通公司而不需淘宝那个级别的文艺公司也可以吃透它。Redis宣言就是作者的自白,我最喜欢其中的“代码像首诗”,”设计是一场与复杂性的战斗“,“Coding是一件艰苦的事情,唯一的办法是享受它。如果它已不能带来快乐就停止它。为了防止这一天的出现,我们要尽量避免把Redis往乏味的路上带。”

让人又爱又恨的单线程架构,使得代码不用处理平时最让人头痛的并发而大幅简化,但也带来CPU的瓶颈,而且单线程被慢操作所阻塞时,其他请求的延时变得不确定。

那Redis不是什么?

  • Redis 不是Big Data,数据都在内存中,无法以T为单位。
  • 在Redis-Cluster发布并被稳定使用之前,Redis没有真正的平滑水平扩展能力。
  • Redis 不支持Ad-Hoc Query,提供的只是数据结构的API,没有SQL一样的查询能力。

1.3 Feature速览

  • 所有数据都在内存中。
  • 五种数据结构:String / Hash / List / Set / Ordered Set。
  • 数据过期时间支持。
  • 不完全的事务支持。
  • 服务端脚本:使用Lua Script编写,类似存储过程的作用。
  • PubSub:捞过界的消息一对多发布订阅功能,起码Redis-Sentinel使用了它。
  • 持久化:支持定期导出内存的Snapshot 与 记录写操作日志的Append Only File两种模式。
  • Replication:Master-Slave模式,Master可连接多个只读Slave,暂无专门的Geographic Replication支持。
  • Fail-Over:Redis-Sentinel节点负责监控Master节点,在master失效时提升slave,独立的仲裁节点模式有效防止脑裂。
  • Sharding:开发中的Redis-Cluser。
  • 动态配置:所有参数可用命令行动态配置不需重启,并重新写回配置文件中,对云上的大规模部署非常合适。

1.4 八卦

  • 作者是意大利的Salvatore Sanfilippo(antirez),又是VMWare大善人聘请了他专心写Redis。
  • antirez和我一样不喜欢搞什么咨询服务,不过最近VMWare旗下的Pivotal公司开始招聘Redis Commericial Engineer。
  • 默认端口6379,是手机按键上MERZ对应的号码,意大利歌女Alessia Merz是antirez和朋友们认为愚蠢的代名词。

2. 数据结构

2.1 Key

  • Key 不能太长,比如1024字节,但antirez也不喜欢太短如”u:1000:pwd”,要表达清楚意思才好。他私人建议用”:”分隔域,用”.”作为单词间的连接,如”comment:1234:reply.to”。
  • Keys,返回匹配的key,支持通配符如 “keys a*” 、 “keys a?c”,但不建议在生产环境大数据量下使用。
  • Sort,对集合按数字或字母顺序排序后返回或另存为list,还可以关联到外部key等。因为复杂度是最高的O(N+M*log(M))(N是集合大小,M 为返回元素的数量),有时会安排到slave上执行。
  • Expire/ExpireAt/Persist/TTL,关于Key超时的操作。默认以秒为单位,也有p字头的以毫秒为单位的版本, Redis的内部实现见2.9 过期数据清除。

2.2 String

最普通的key-value类型,说是String,其实是任意的byte[],比如图片,最大512M。 所有常用命令的复杂度都是O(1),普通的Get/Set方法,可以用来做Cache,存Session。

Incr/IncrBy/IncrByFloat/Decr/DecrBy,可以用来做计数器,做自增序列。key不存在时会创建并贴心的设原值为0。IncrByFloat专门针对float,没有对应的decrByFloat版本?用负数啊。

SetNx, 仅当key不存在时才Set。可以用来选举Master或做分布式锁:所有Client不断尝试使用SetNx master myName抢注Master,成功的那位不断使用Expire刷新它的过期时间。如果Master倒掉了key就会失效,剩下的节点又会发生新一轮抢夺。

其他Set指令:

  • SetEx, Set + Expire 的简便写法,p字头版本以毫秒为单位。
  • GetSet, 设置新值,返回旧值。比如一个按小时计算的计数器,可以用GetSet获取计数并重置为0。这种指令在服务端做起来是举手之劳,客户端便方便很多。
  • MGet/MSet/MSetNx, 一次get/set多个key。
  • 2.6.12版开始,Set命令已融合了Set/SetNx/SetEx三者,SetNx与SetEx可能会被废弃。

GetBit/SetBit/BitOp,与或非/BitCount, BitMap的玩法,比如统计今天的独立访问用户数时,每个注册用户都有一个offset,他今天进来的话就把他那个位设为1,用BitCount就可以得出今天的总人数。

Append/SetRange/GetRange/StrLen,对文本进行扩展、替换、截取和求长度,只对特定数据格式如字段定长的有用,json就没什么用。

2.3 Hash

Key-HashMap结构,相比String类型将这整个对象持久化成JSON格式,Hash将对象的各个属性存入Map里,可以只读取/更新对象的某些属性。这样有些属性超长就让它一边呆着不动,另外不同的模块可以只更新自己关心的属性而不会互相并发覆盖冲突。

另一个用法是土法建索引。比如User对象,除了id有时还要按name来查询。可以有如下的数据记录:

  • (String) user:101 -> {“id”:101,”name”:”calvin”…}
  • (String) user:102 -> {“id”:102,”name”:”kevin”…}
  • (Hash) user:index-> “calvin”->101, “kevin” -> 102

底层实现是hash table,一般操作复杂度是O(1),要同时操作多个field时就是O(N),N是field的数量。

2.4 List

List是一个双向链表,支持双向的Pop/Push,江湖规矩一般从左端Push,右端Pop——LPush/RPop,而且还有Blocking的版本BLPop/BRPop,客户端可以阻塞在那直到有消息到来,所有操作都是O(1)的好孩子,可以当Message Queue来用。当多个Client并发阻塞等待,有消息入列时谁先被阻塞谁先被服务。

还有RPopLPushBRPopLPush,弹出来返回给client的同时,把自己又推入另一个list,LLen获取列表的长度。

还有按值进行的操作:LRem(按值删除元素)、LInsert(插在某个值的元素的前后),复杂度是O(N),N是List长度,因为List的值不唯一,所以要遍历全部元素,而Set只要O(log(N))。

按下标进行的操作:下标从0开始,队列从左到右算,下标为负数时则从右到左。

  • LSet ,按下标设置元素值。
  • LIndex,按下标返回元素。
  • LRange,不同于POP直接弹走元素,只是返回列表内一段下标的元素,是分页的最爱。
  • LTrim,限制List的大小,比如只保留最新的20条消息。

复杂度也是O(N),其中LSet的N是List长度,LIndex的N是下标的值,LRange的N是start的值+列出元素的个数,因为是链表而不是数组,所以按下标访问其实要遍历链表,除非下标正好是队头和队尾。LTrim的N是移除元素的个数。

在消息队列中,并没有JMS的ack机制,如果消费者把job给Pop走了又没处理完就死机了怎么办?

  • 解决方法之一是加多一个sorted set,分发的时候同时发到list与sorted set,以分发时间为score,用户把job做完了之后要用ZREM消掉sorted set里的job,并且定时从sorted set中取出超时没有完成的任务,重新放回list。
  • 另一个做法是为每个worker多加一个的list,弹出任务时改用RPushLPop,将job同时放到worker自己的list中,完成时用LREM消掉。如果集群管理(如zookeeper)发现worker已经挂掉,就将worker的list内容重新放回主list。

2.5 Set

Set就是集合,以将可能重复的元素随便放入而Set会自动去重,底层实现也是hash table

2.6 Sorted Set

有序集,元素放入集合时还要提供该元素的分数。

Sorted Set的实现是hash table(element->score, 用于实现ZScore及判断element是否在集合内),和skip list(score->element,按score排序)的混合体。 skip list有点像平衡二叉树那样,不同范围的score被分成一层一层,每层是一个按score排序的链表。

ZAdd/ZRem是O(log(N)),ZRangeByScore/ZRemRangeByScore是O(log(N)+M),N是Set大小,M是结果/操作元素的个数。可见,原本可能很大的N被很关键的Log了一下,1000万大小的Set,复杂度也只是几十不到。当然,如果一次命中很多元素M很大那谁也没办法了。

2.7 事务

Multi(Start Transaction)、Exec(Commit)、Discard(Rollback)实现。 在事务提交前,不会执行任何指令,只会把它们存到一个队列里,不影响其他客户端的操作。在事务提交时,批量执行所有指令。《Redis设计与实现》中的详述

注意,Redis里的事务,与我们平时的事务概念很不一样:

  • 它仅仅是保证事务里的操作会被连续独占的执行。因为是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的。
  • 它没有隔离级别的概念,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。
  • 它不保证原子性——所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力。在redis里失败分两种,一种是明显的指令错误,比如指令名拼错,指令参数个数不对,在2.6版中全部指令都不会执行。另一种是隐含的,比如在事务里,第一句是SET foo bar, 第二句是LLEN foo,对第一句产生的String类型的key执行LLEN会失败,但这种错误只有在指令运行后才能发现,这时候第一句成功,第二句失败。还有,如果事务执行到一半redis被KILL,已经执行的指令同样也不会被回滚。

Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。

2.8 Lua Script

Redis2.6内置的Lua Script支持,可以在Redis的Server端一次过运行大量逻辑,就像存储过程一样,避免了海量中间数据在网路上的传输。

  • Lua自称是在Script语言里关于快的标准,Redis选择了它而不是流行的JavaScript。
  • 因为Redis的单线程架构,整个Script默认是在一个事务里的。
  • Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key。(but why?)
  • Eval每次传输一整段Script比较费带宽,可以先用Script Load载入script,返回哈希值。然后用EvalHash执行。因为就是SHA-1,所以任何时候执行返回的哈希值都是一样的。
  • 内置的Lua库里还很贴心的带了CJSON,可以处理json字符串。
  • 一段用Redis做Timer的示例代码,下面的script被定期调用,从以触发时间为score的sorted set中取出已到期的Job,放到list中给Client们blocking popup。
    -- KEYS: [1]job:sleeping, [2]job:ready
    -- ARGS: [1]currentTime
    -- Comments: result is the  job id
    local jobs=redis.call('zrangebyscore', KEYS[1], '-inf', ARGV[1])
    local count = table.maxn(jobs)
    if count>0  then
      -- Comments: remove from Sleeping Job sorted set
      redis.call('zremrangebyscore', KEYS[1], '-inf', ARGV[1])
      -- Comments: add to the Ready Job list
      -- Comments: can optimize to use lpush id1,id2,... for better performance
      for i=1,count do
        redis.call('lpush', KEYS[2], jobs[i])
      end
    end
    

2.9 过期数据清除

官方文档 与 《Redis设计与实现》中的详述,过期数据的清除从来不容易,为每一条key设置一个timer,到点立刻删除的消耗太大,每秒遍历所有数据消耗也大,Redis使用了一种相对务实的做法:

当client主动访问key会先对key进行超时判断,过时的key会立刻删除。

如果clien永远都不再get那条key呢? 它会在Master的后台,每秒10次的执行如下操作: 随机选取100个key校验是否过期,如果有25个以上的key过期了,立刻额外随机选取下100个key(不计算在10次之内)。可见,如果过期的key不多,它最多每秒回收200条左右,如果有超过25%的key过期了,它就会做得更多,但只要key不被主动get,它占用的内存什么时候最终被清理掉只有天知道。

Linux:在CentOS/RHEL/Scientific Linux 6下安装 LAMP

LAMP 是服务器系统中开源软件的一个完美组合。它是 Linux 、Apache HTTP 服务器、MySQL 数据库、PHP(或者 Perl、Python)的第一个字母的缩写代码。对于很多系统管理员来说安装 LAMP 除了是必备的技能外,都已经具有驾轻就熟的操作他们的能力了。不过新手们通常希望有没完没了的这方面的教程来告诉自己怎么做,下面我就和大家说说我的方法步骤。

LAMP 是服务器系统中开源软件的一个完美组合。它是 Linux 、Apache HTTP 服务器、MySQL 数据库、PHP(或者 Perl、Python)的第一个字母的缩写代码。对于很多系统管理员来说安装 LAMP 除了是必备的技能外,都已经具有驾轻就熟的操作他们的能力了。不过新手们通常希望有没完没了的这方面的教程来告诉自己怎么做,下面我就和大家说说我的方法步骤。

现在,很多时候我们需要用 MariaDB 来代替 MySQL 了。在这里我会告诉大家 MariaDB 的安装过程。

我的测试主机名为:server.linux.cn,测试 IP 地址为:192.168.1.200/24

安装 ApacheApache 是​​一个开源的跨平台的 Web 服务器。它提供了一个全方位的 Web 服务器功能,包括CGI,SSL 和virtual domains (虚拟域)。安装命令非常简单,只需要打开一个终端,在终端中输入如下命令:

[root@server ~]# yum install httpd -y

安装完毕后,需要设置让 Apache 服务启动,并且在每次服务器重启的时候都自动启动,输入如下命令来完成:

[root@server ~]# /etc/init.d/httpd start[root@server ~]# chkconfig httpd on

如果您想通过您的防火墙活路由器来远程连接,那么需要允许 Apache 服务接管服务器的 80 端口:

[root@server ~]# vi /etc/sysconfig/iptables[…]-A INPUT -p udp -m state –state NEW –dport 80 -j ACCEPT-A INPUT -p tcp -m state –state NEW –dport 80 -j ACCEPT[…]

重新启动 iptables :

[root@server ~]# /etc/init.d/iptables restart

打开您的浏览器访问 http://localhost/ 或者 http://server-ip-address/ 测试 Apache 安装是否成功。

Linux:在CentOS/RHEL/Scientific Linux 6下安装 LAMP
Linux:在CentOS/RHEL/Scientific Linux 6下安装 LAMP

安装 MariaDB

MariaDB 是一个替换 MySQL 的产品。功能强大而可靠。安装前,如果您的服务器中安装有 MySQL ,那么您需要删除它。删除命令:

[root@server ~]# yum remove mysql* mysql-server mysql-devel mysql-libs

为了让 MariaDB 同时兼容 MySQL,我们需要安装 REMI 库来解决兼容性和安装 MariaDB 时软件包依赖性问题。安装命令:

[root@server ~]# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

安装兼容 mysql55 包命令: 

[root@server ~]# yum –enablerepo=remi-test –disablerepo=remi install compat-mysql55

为 MariaDB 创建一个 repository 文件,并在其中输入如下代码:

32 位系统:

[root@server ~]# vi /etc/yum.repos.d/mariadb.repo# MariaDB 5.5 CentOS repository list – created 2013-06-06 07:42 UTC# http://mariadb.org/mariadb/repositories/[mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/5.5/centos6-x86gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=1

64 位系统: 

[root@server ~]# vi /etc/yum.repos.d/mariadb.repo# MariaDB 5.5 CentOS repository list – created 2013-06-06 07:53 UTC# http://mariadb.org/mariadb/repositories/[mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/5.5/centos6-amd64gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=1

保存并退出该文件,并运行 yum update 命令:

[root@server ~]# yum update

现在开始安装 MariaDB :

[root@server ~]# yum install MariaDB-devel MariaDB-client MariaDB-server -y

安装完毕后,启动 MariaDB 服务,并让它在每次重启服务器后自动启动。

[root@server ~]# /etc/init.d/mysql startStarting MySQL… SUCCESS![root@server ~]# chkconfig mysql on

为 MySQL 的 root 设置密码,默认情况下,MySWL root 密码是空的。为了防止未经授权的用户访问 MySQL 我们需要设置 root 用户密码:

[root@server ~]# /usr/bin/mysql_secure_installation/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not foundNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it, we’ll need the currentpassword for the root user.  If you’ve just installed MariaDB, andyou haven’t set the root password yet, the password will be blank,so you should just press enter here.Enter current password for root (enter for none): OK, successfully used password, moving on…Setting the root password ensures that nobody can log into the MariaDBroot user without the proper authorisation.You already have a root password set, so you can safely answer ‘n’.Change the root password? [Y/n] yNew password: Re-enter new password: Password updated successfully!Reloading privilege tables.. … Success!By default, a MariaDB installation has an anonymous user, allowing anyoneto log into MariaDB without having to have a user account created forthem.  This is intended only for testing, and to make the installationgo a bit smoother.  You should remove them before moving into aproduction environment.Remove anonymous users? [Y/n]  … Success!Normally, root should only be allowed to connect from ‘localhost’.  Thisensures that someone cannot guess at the root password from the network.Disallow root login remotely? [Y/n]  … Success!By default, MariaDB comes with a database named ‘test’ that anyone canaccess.  This is also intended only for testing, and should be removedbefore moving into a production environment.Remove test database and access to it? [Y/n]  – Dropping test database…ERROR 1008 (HY000) at line 1: Can’t drop database ‘test’; database doesn’t exist … Failed!  Not critical, keep moving… – Removing privileges on test database… … Success!Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.Reload privilege tables now? [Y/n]  … Success!Cleaning up…All done!  If you’ve completed all of the above steps, your MariaDBinstallation should now be secure.Thanks for using MariaDB!

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

Linux:为 Vim 添加 Sublime Text 的多重选取特性

相信用过 Sublime Text 编辑器的朋友一定对它的“多重选取”功能印象深刻吧。 这项功能能够达到“一处编辑,多处更改”的神奇效果。如果你是一个 Vim 控, 那么不必羡慕 Sublime Text 用户,因为现在有了Multiple Cursors 这款 Vim 插件。

Linux:为 Vim 添加 Sublime Text 的多重选取特性
Linux:为 Vim 添加 Sublime Text 的多重选取特性

在装好 Multiple Cursors 之后,通过按 Ctrl + n 来多重选取。一旦 选取完成,便可配合 Vim 既有的命令对其进行编辑处理。最后,按 Esc 可以 退出多重选取状态。

此外,你也可以使用 MultipleCursorsFind 命令通过正则表达式来进行 多重选取和编辑。

via http://linuxtoy.org/archives/vim-multiple-cursors.html