App Grid:一个优秀的Ubuntu软件中心替代品

Summary: Ubuntu软件中心使得查找、安装、购买并管理应用程序更简单，这一点无可否认。 同样，也无可否认，它离最美的发行版默认自带软件的位置还远着呢。 App Grid：Ubuntu软件中心替代品 自从2011年的彻底改造后，Ubuntu的旗舰应用商店的界面就没怎么变过。这并不是说它在此期间被完全忽略了，在12.04的开发周期中可以看到已经做了一些减少打开耗时的工作。 撇开那个不算，Ubuntu软件中心还是一如既往，还有许多潜在功能还没被开发。 App Grid的目标是解决这些问题。从零开始，它要求更快的启动时间，更快的反应时间，而且不感觉混乱，不让人失望

@我的印象笔记

这个确实很不错。

我认为此篇文章应该叫《how to install App Grid on Ubuntu 14.04》

用不了 404错误

# App Grid:一个优秀的Ubuntu软件中心替代品

**Ubuntu软件中心使得查找、安装、购买并管理应用程序更简单，这一点无可否认。**

同样，也无可否认，它离最美的发行版默认自带软件的位置还远着呢。

### App Grid：Ubuntu软件中心替代品

自从2011年的彻底改造后，Ubuntu的旗舰应用商店的界面就没怎么变过。这并不是说它在此期间被完全忽略了，在12.04的开发周期中可以看到已经做了一些[减少打开耗时的工作](http://www.omgubuntu.co.uk/2011/10/plans-for-ubuntu-software-centre-plans-in-12-04-get-discussed)。

撇开那个不算，Ubuntu软件中心还是一如既往，还有许多潜在功能还没被开发。

App Grid的目标是解决这些问题。从零开始，它要求更快的启动时间，更快的反应时间，而且“不感觉混乱，不让人失望”。

在大部分这些方面，App Grid取得了成功。它几乎可以立即打开，而在界面上点击也确实反应迅速。“不感觉混乱”这一承诺，或许有一点小小的争议。该应用有时候要你横向滚动，而另外的时候，又要你纵向滚动。也有人禁不住会想，如果这个应用能把它的网格背景样式扔了，可能看起来会显得更专业一些。

作为在Ubuntu上筛选应用程序的一个方式，App Grid做出了极大的努力。它支持Ubuntu One上的订购、评级和评论，作为Ubuntu默认应用商店的替代品，它更好用。

如果非要说点什么缺点的话，那就是它不是一个开源的应用程序，第一次运行时会显示以下免责声明：

### 安装App Grid

App Grid可运行在Ubuntu 12.04 LTS，13.10以及14.04 LTS版本下。可以通过添加以下PPA软件源来安装：

```
sudo add-apt-repository -y ppa:appgrid/stable
sudo apt-get update && sudo apt-get install appgrid

```

或者，也可以[从项目网站](https://launchpad.net/appgrid)抓取一个.deb安装包来安装。

* [下载用于Ubuntu 14.04的App Grid安装包](http://ppa.launchpad.net/appgrid/stable/ubuntu/pool/main/a/appgrid/appgrid_0.1.102%7Etrusty_all.deb)

试试吧，试过后请发表一下你的看法吧……

---

via: <http://www.omgubuntu.co.uk/2014/05/appgrid-ubuntu-software-centre-alternative>

译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


黑客内核：编写属于你的第一个Linux内核模块

Summary: 曾经多少次想要在内核游荡？曾经多少次茫然不知方向？你不要再对着它迷惘，让我们指引你走向前方  内核编程常常看起来像是黑魔法，而在亚瑟 C 克拉克的眼中，它八成就是了。Linux内核和它的用户空间是大不相同的：抛开漫不经心，你必须小心翼翼，因为你编程中的一个bug就会影响到整个系统。浮点运算做起来可不容易，堆栈固定而狭小，而你写的代码总是异步的，因此你需要想想并发会导致什么。而除了所有这一切之外，Linux内核只是一个很大的、很复杂的C程序，它对每个人开放，任何人都去读它、学习它并改进它，而你也可以是其中之一。  学

[ok]

这篇真是累死人了，但是必须学习~因为正在的精华就是这类文章[good]

Repost

马克杯

对于译文最好加上原文链接http://www.linuxvoice.com/be-a-kernel-hacker/有时候英较好的的同学可以去查看原文以及弥补翻译的不足,<br />
还有就是文章里曼涉及到的重要链接不要丢失了,这是其中项目的github链接https://github.com/vsinitsyn/reverse

新装的ubuntu10.04, git上的源码编不通, 什么情况

root@leo-laptop:/home/root/code/git/reverse# make

make -C /lib/modules/2.6.32-53-generic/build M=/home/root/code/git/reverse modules

make[1]: Entering directory `/usr/src/linux-headers-2.6.32-53-generic'

  CC [M]  /home/root/code/git/reverse/reverse.o

/home/root/code/git/reverse/reverse.c:206: error: ‘noop_llseek’ undeclared here (not in a function)

make[2]: *** [/home/root/code/git/reverse/reverse.o] Error 1

make[1]: *** [_module_/home/root/code/git/reverse] Error 2

make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-53-generic'

make: *** [all] Error 2

有译文的原文链接的，只是文章较长，原文链接和翻译者等信息，都在最后一页。

文末的这种信息，在我们的CMS里面没有单独拎出来，所以很难每页都显示，我想想办法~<br />
另外，这个GIT链接，我查看了原文了，可能是翻译过程给漏了，我现在给补上，谢谢您。

不明学厉呀！我也就编辑过自己笔记本的驱动，还是就是升级了一个LINUX内核。

不明觉厉呀。我只会编译，还真不会编写

啊哈，我觉得照着这篇文章，可以写一个~

为什么kali linux make 出现make: ***/lib/modules/3.12-kali1-686-pae/build:没有那个文件或目录。停止。

我也遇到了这个问题,你搞明白了嘛???

没有安装内核源码

# 黑客内核：编写属于你的第一个Linux内核模块

>
> 曾经多少次想要在内核游荡？曾经多少次茫然不知方向？你不要再对着它迷惘，让我们指引你走向前方……
>
>
>

内核编程常常看起来像是黑魔法，而在亚瑟 C 克拉克的眼中，它八成就是了。Linux内核和它的用户空间是大不相同的：抛开漫不经心，你必须小心翼翼，因为你编程中的一个bug就会影响到整个系统。浮点运算做起来可不容易，堆栈固定而狭小，而你写的代码总是异步的，因此你需要想想并发会导致什么。而除了所有这一切之外，Linux内核只是一个很大的、很复杂的C程序，它对每个人开放，任何人都去读它、学习它并改进它，而你也可以是其中之一。

<img src="content_image/album_201406_24_012730cu0k0hhwcu5w5az0.jpg" alt="" title="">

学习内核编程的最简单的方式也许就是写个内核模块：一段可以动态加载进内核的代码。模块所能做的事是有限的——例如，他们不能在类似进程描述符这样的公共数据结构中增减字段（LCTT译注：可能会破坏整个内核及系统的功能）。但是，在其它方面，他们是成熟的内核级的代码，可以在需要时随时编译进内核（这样就可以摒弃所有的限制了）。完全可以在Linux源代码树以外来开发并编译一个模块（这并不奇怪，它称为树外开发），如果你只是想稍微玩玩，而并不想提交修改以包含到主线内核中去，这样的方式是很方便的。

在本教程中，我们将开发一个简单的内核模块用以创建一个**/dev/reverse**设备。写入该设备的字符串将以相反字序的方式读回（“Hello World”读成“World Hello”）。这是一个很受欢迎的程序员面试难题，当你利用自己的能力在内核级别实现这个功能时，可以使你得到一些加分。在开始前，有一句忠告：你的模块中的一个bug就会导致系统崩溃（虽然可能性不大，但还是有可能的）和数据丢失。在开始前，请确保你已经将重要数据备份，或者，采用一种更好的方式，在虚拟机中进行试验。

### 尽可能不要用root身份

>
> 默认情况下，**/dev/reverse**只有root可以使用，因此你只能使用**sudo**来运行你的测试程序。要解决该限制，可以创建一个包含以下内容的**/lib/udev/rules.d/99-reverse.rules**文件：
>
>
>
> ```
> SUBSYSTEM=="misc", KERNEL=="reverse", MODE="0666"
>
> ```
>
> 别忘了重新插入模块。让非root用户访问设备节点往往不是一个好主意，但是在开发其间却是十分有用的。这并不是说以root身份运行二进制测试文件也不是个好主意。
>
>
>

#### 模块的构造

由于大多数的Linux内核模块是用C写的（除了底层的特定于体系结构的部分），所以推荐你将你的模块以单一文件形式保存（例如，reverse.c）。我们已经把完整的源代码放在[GitHub上](https://github.com/vsinitsyn/reverse)——这里我们将看其中的一些片段。开始时，我们先要包含一些常见的文件头，并用预定义的宏来描述模块：

```
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Valentine Sinitsyn <valentine.sinitsyn@gmail.com>");
MODULE_DESCRIPTION("In-kernel phrase reverser");

```

这里一切都直接明了，除了**MODULE\_LICENSE()**：它不仅仅是一个标记。内核坚定地支持GPL兼容代码，因此如果你把许可证设置为其它非GPL兼容的（如，“Proprietary”[专利]），某些特定的内核功能将在你的模块中不可用。

### 什么时候不该写内核模块

>
> 内核编程很有趣，但是在现实项目中写（尤其是调试）内核代码要求特定的技巧。通常来讲，在没有其它方式可以解决你的问题时，你才应该在内核级别解决它。以下情形中，可能你在用户空间中解决它更好：
>
>
> * 你要开发一个USB驱动 —— 请查看[libusb](http://www.libusb.org/)。
> * 你要开发一个文件系统 —— 试试[FUSE](http://fuse.sf.net/)。
> * 你在扩展Netfilter —— 那么[libnetfilter\_queue](http://www.linuxvoice.com/be-a-kernel-hacker/www.netfilter.org/projects/libnetfilter_queue)对你有所帮助。
>
>
> 通常，内核里面代码的性能会更好，但是对于许多项目而言，这点性能丢失并不严重。
>
>
>

由于内核编程总是异步的，没有一个**main()**函数来让Linux顺序执行你的模块。取而代之的是，你要为各种事件提供回调函数，像这个：

```
static int __init reverse_init(void)
{
    printk(KERN_INFO "reverse device has been registered\n");
    return 0;
}

static void __exit reverse_exit(void)
{
    printk(KERN_INFO "reverse device has been unregistered\n");
}

module_init(reverse_init);
module_exit(reverse_exit);

```

这里，我们定义的函数被称为模块的插入和删除。只有第一个的插入函数是必要的。目前，它们只是打印消息到内核环缓冲区（可以在用户空间通过**dmesg**命令访问）；**KERN\_INFO**是日志级别（注意，没有逗号）。**\_\_init**和**\_\_exit**是属性 —— 联结到函数（或者变量）的元数据片。属性在用户空间的C代码中是很罕见的，但是内核中却很普遍。所有标记为**\_\_init**的，会在初始化后释放内存以供重用（还记得那条过去内核的那条“Freeing unused kernel memory…[释放未使用的内核内存……]”信息吗？）。**\_\_exit**表明，当代码被静态构建进内核时，该函数可以安全地优化了，不需要清理收尾。最后，**module\_init()**和**module\_exit()**这两个宏将**reverse\_init()**和**reverse\_exit()**函数设置成为我们模块的生命周期回调函数。实际的函数名称并不重要，你可以称它们为**init()**和**exit()**，或者**start()**和**stop()**，你想叫什么就叫什么吧。他们都是静态声明，你在外部模块是看不到的。事实上，内核中的任何函数都是不可见的，除非明确地被导出。然而，在内核程序员中，给你的函数加上模块名前缀是约定俗成的。

这些都是些基本概念 - 让我们来做更多有趣的事情吧。模块可以接收参数，就像这样：

```
# modprobe foo bar=1

```

**modinfo**命令显示了模块接受的所有参数，而这些也可以在**/sys/module//parameters**下作为文件使用。我们的模块需要一个缓冲区来存储参数 —— 让我们把这大小设置为用户可配置。在**MODULE\_DESCRIPTION()**下添加如下三行：

```
static unsigned long buffer_size = 8192;
module_param(buffer_size, ulong, (S_IRUSR | S_IRGRP | S_IROTH));
MODULE_PARM_DESC(buffer_size, "Internal buffer size");

```

这儿，我们定义了一个变量来存储该值，封装成一个参数，并通过sysfs来让所有人可读。这个参数的描述（最后一行）出现在modinfo的输出中。

由于用户可以直接设置**buffer\_size**，我们需要在**reverse\_init()**来清除无效取值。你总该检查来自内核之外的数据 —— 如果你不这么做，你就是将自己置身于内核异常或安全漏洞之中。

```
static int __init reverse_init()
{
    if (!buffer_size)
        return -1;
    printk(KERN_INFO
        "reverse device has been registered, buffer size is %lu bytes\n",
        buffer_size);
    return 0;
}

```

来自模块初始化函数的非0返回值意味着模块执行失败。

### 导航

>
> 但你开发模块时，Linux内核就是你所需一切的源头。然而，它相当大，你可能在查找你所要的内容时会有困难。幸运的是，在庞大的代码库面前，有许多工具使这个过程变得简单。首先，是Cscope —— 在终端中运行的一个比较经典的工具。你所要做的，就是在内核源代码的顶级目录中运行**make cscope && cscope**。Cscope和Vim以及Emacs整合得很好，因此你可以在你最喜爱的编辑器中使用它。
>
>
> 如果基于终端的工具不是你的最爱，那么就访问[http://lxr.free-electrons.com](http://lxr.free-electrons.com/)吧。它是一个基于web的内核导航工具，即使它的功能没有Cscope来得多（例如，你不能方便地找到函数的用法），但它仍然提供了足够多的快速查询功能。
>
>
>

现在是时候来编译模块了。你需要你正在运行的内核版本头文件（**linux-headers**，或者等同的软件包）和**build-essential**（或者类似的包）。接下来，该创建一个标准的Makefile模板：

```
obj-m += reverse.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

```

现在，调用**make**来构建你的第一个模块。如果你输入的都正确，在当前目录内会找到reverse.ko文件。使用**sudo insmod reverse.ko**插入内核模块，然后运行如下命令：

```
$ dmesg | tail -1
[ 5905.042081] reverse device has been registered, buffer size is 8192 bytes

```

恭喜了！然而，目前这一行还只是假象而已 —— 还没有设备节点呢。让我们来搞定它。

#### 混杂设备

在Linux中，有一种特殊的字符设备类型，叫做“混杂设备”（或者简称为“misc”）。它是专为单一接入点的小型设备驱动而设计的，而这正是我们所需要的。所有混杂设备共享同一个主设备号（10），因此一个驱动(**drivers/char/misc.c**）就可以查看它们所有设备了，而这些设备用次设备号来区分。从其他意义来说，它们只是普通字符设备。

要为该设备注册一个次设备号（以及一个接入点），你需要声明**struct misc\_device**，填上所有字段（注意语法），然后使用指向该结构的指针作为参数来调用**misc\_register()**。为此，你也需要包含**linux/miscdevice.h**头文件：

```
static struct miscdevice reverse_misc_device = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = "reverse",
    .fops = &reverse_fops
};
static int __init reverse_init()
{
    ...
    misc_register(&reverse_misc_device);
    printk(KERN_INFO ...
}

```

这儿，我们为名为“reverse”的设备请求一个第一个可用的（动态的）次设备号；省略号表明我们之前已经见过的省略的代码。别忘了在模块卸下后注销掉该设备。

```
static void __exit reverse_exit(void)
{
    misc_deregister(&reverse_misc_device);
    ...
}

```

‘fops’字段存储了一个指针，指向一个**file\_operations**结构（在Linux/fs.h中声明），而这正是我们模块的接入点。**reverse\_fops**定义如下：

```
static struct file_operations reverse_fops = {
    .owner = THIS_MODULE,
    .open = reverse_open,
    ...
    .llseek = noop_llseek
};

```

另外，**reverse\_fops**包含了一系列回调函数（也称之为方法），当用户空间代码打开一个设备，读写或者关闭文件描述符时，就会执行。如果你要忽略这些回调，可以指定一个明确的回调函数来替代。这就是为什么我们将**llseek**设置为**noop\_llseek()**，（顾名思义）它什么都不干。这个默认实现改变了一个文件指针，而且我们现在并不需要我们的设备可以寻址（这是今天留给你们的家庭作业）。

#### 关闭和打开

让我们来实现该方法。我们将给每个打开的文件描述符分配一个新的缓冲区，并在它关闭时释放。这实际上并不安全：如果一个用户空间应用程序泄漏了描述符（也许是故意的），它就会霸占RAM，并导致系统不可用。在现实世界中，你总得考虑到这些可能性。但在本教程中，这种方法不要紧。

我们需要一个结构函数来描述缓冲区。内核提供了许多常规的数据结构：链接列表（双联的），哈希表，树等等之类。不过，缓冲区常常从头设计。我们将调用我们的“struct buffer”：

```
struct buffer {
    char *data, *end, *read_ptr;
    unsigned long size;
};

```

**data**是该缓冲区存储的一个指向字符串的指针，而**end**指向字符串结尾后的第一个字节。**read\_ptr**是**read()**开始读取数据的地方。缓冲区的size是为了保证完整性而存储的 —— 目前，我们还没有使用该区域。你不能假设使用你结构体的用户会正确地初始化所有这些东西，所以最好在函数中封装缓冲区的分配和收回。它们通常命名为**buffer\_alloc()**和**buffer\_free()**。

static struct buffer *buffer\_alloc(unsigned long size) { struct buffer \*buf; buf = kzalloc(sizeof(*buf), GFP\_KERNEL); if (unlikely(!buf)) goto out; ... out: return buf; }

内核内存使用**kmalloc()**来分配，并使用**kfree()**来释放；**kzalloc()**的风格是将内存设置为全零。不同于标准的**malloc()**，它的内核对应部分收到的标志指定了第二个参数中请求的内存类型。这里，**GFP\_KERNEL**是说我们需要一个普通的内核内存（不是在DMA或高内存区中）以及如果需要的话函数可以睡眠（重新调度进程）。**sizeof(\*buf)**是一种常见的方式，它用来获取可通过指针访问的结构体的大小。

你应该随时检查**kmalloc()**的返回值：访问NULL指针将导致内核异常。同时也需要注意**unlikely()**宏的使用。它（及其相对宏**likely()**）被广泛用于内核中，用于表明条件几乎总是真的（或假的）。它不会影响到控制流程，但是能帮助现代处理器通过分支预测技术来提升性能。

最后，注意**goto**语句。它们常常为认为是邪恶的，但是，Linux内核（以及一些其它系统软件）采用它们来实施集中式的函数退出。这样的结果是减少嵌套深度，使代码更具可读性，而且非常像更高级语言中的**try-catch**区块。

有了**buffer\_alloc()**和**buffer\_free()**，**open**和**close**方法就变得很简单了。

```
static int reverse_open(struct inode *inode, struct file *file)
{
    int err = 0;
    file->private_data = buffer_alloc(buffer_size);
    ...
    return err;
}

```

**struct file**是一个标准的内核数据结构，用以存储打开的文件的信息，如当前文件位置（**file->f\_pos**)、标志(**file->f\_flags**），或者打开模式（**file->f\_mode**)等。另外一个字段**file->privatedata**用于关联文件到一些专有数据，它的类型是void \*，而且它在文件拥有者以外，对内核不透明。我们将一个缓冲区存储在那里。

如果缓冲区分配失败，我们通过返回否定值（**-ENOMEM**）来为调用的用户空间代码标明。一个C库中调用的**open(2)**系统调用(如 **glibc**)将会检测这个并适当地设置**errno** 。

#### 学习如何读和写

“read”和“write”方法是真正完成工作的地方。当数据写入到缓冲区时，我们放弃之前的内容和反向地存储该字段，不需要任何临时存储。**read**方法仅仅是从内核缓冲区复制数据到用户空间。但是如果缓冲区还没有数据，**revers\_eread()**会做什么呢？在用户空间中，**read()**调用会在有可用数据前阻塞它。在内核中，你就必须等待。幸运的是，有一项机制用于处理这种情况，就是‘wait queues’。

想法很简单。如果当前进程需要等待某个事件，它的描述符（**struct task\_struct**存储‘current’信息）被放进非可运行（睡眠中）状态，并添加到一个队列中。然后**schedule()**就被调用来选择另一个进程运行。生成事件的代码通过使用队列将等待进程放回**TASK\_RUNNING**状态来唤醒它们。调度程序将在以后在某个地方选择它们之一。Linux有多种非可运行状态，最值得注意的是**TASK\_INTERRUPTIBLE**（一个可以通过信号中断的睡眠）和**TASK\_KILLABLE**（一个可被杀死的睡眠中的进程）。所有这些都应该正确处理，并等待队列为你做这些事。

一个用以存储读取等待队列头的天然场所就是结构缓冲区，所以从为它添加**wait\_queue\_head*t read\*queue**字段开始。你也应该包含**linux/sched.h**头文件。可以使用DECLARE\_WAITQUEUE()宏来静态声明一个等待队列。在我们的情况下，需要动态初始化，因此添加下面这行到**buffer\_alloc()**：

```
init_waitqueue_head(&buf->read_queue);

```

我们等待可用数据；或者等待**read\_ptr != end**条件成立。我们也想要让等待操作可以被中断（如，通过Ctrl+C）。因此，“read”方法应该像这样开始：

```
static ssize_t reverse_read(struct file *file, char __user * out,
        size_t size, loff_t * off)
{
    struct buffer *buf = file->private_data;
    ssize_t result;
    while (buf->read_ptr == buf->end) {
        if (file->f_flags & O_NONBLOCK) {
            result = -EAGAIN;
            goto out;
        }
        if (wait_event_interruptible
        (buf->read_queue, buf->read_ptr != buf->end)) {
            result = -ERESTARTSYS;
            goto out;
        }
    }
...

```

我们让它循环，直到有可用数据，如果没有则使用**wait\_event\_interruptible()**（它是一个宏，不是函数，这就是为什么要通过值的方式给队列传递）来等待。好吧，如果**wait\_event\_interruptible()**被中断，它返回一个非0值，这个值代表**-ERESTARTSYS**。这段代码意味着系统调用应该重新启动。**file->f\_flags**检查以非阻塞模式打开的文件数：如果没有数据，返回**-EAGAIN**。

我们不能使用**if()**来替代**while()**，因为可能有许多进程正等待数据。当**write**方法唤醒它们时，调度程序以不可预知的方式选择一个来运行，因此，在这段代码有机会执行的时候，缓冲区可能再次空出。现在，我们需要将数据从**buf->data** 复制到用户空间。**copy\_to\_user()**内核函数就干了此事：

```
    size = min(size, (size_t) (buf->end - buf->read_ptr));
    if (copy_to_user(out, buf->read_ptr, size)) {
        result = -EFAULT;
        goto out;
    }

```

如果用户空间指针错误，那么调用可能会失败；如果发生了此事，我们就返回**-EFAULT**。记住，不要相信任何来自内核外的事物！

```
    buf->read_ptr += size;
    result = size;
out:
    return result;
}

```

为了使数据在任意块可读，需要进行简单运算。该方法返回读入的字节数，或者一个错误代码。

写方法更简短。首先，我们检查缓冲区是否有足够的空间，然后我们使用**copy\_from\_userspace()**函数来获取数据。再然后**read\_ptr**和结束指针会被重置，并且反转存储缓冲区内容：

```
    buf->end = buf->data + size;
    buf->read_ptr = buf->data;
    if (buf->end > buf->data)
        reverse_phrase(buf->data, buf->end - 1);

```

这里， **reverse\_phrase()**干了所有吃力的工作。它依赖于**reverse\_word()**函数，该函数相当简短并且标记为内联。这是另外一个常见的优化；但是，你不能过度使用。因为过多的内联会导致内核映像徒然增大。

最后，我们需要唤醒**read\_queue**中等待数据的进程，就跟先前讲过的那样。**wake\_up\_interruptible()**就是用来干此事的：

```
    wake_up_interruptible(&buf->read_queue);

```

耶！你现在已经有了一个内核模块，它至少已经编译成功了。现在，是时候来测试了。

### 调试内核代码

>
> 或许，内核中最常见的调试方法就是打印。如果你愿意，你可以使用普通的**printk()** （假定使用**KERN\_DEBUG**日志等级）。然而，那儿还有更好的办法。如果你正在写一个设备驱动，这个设备驱动有它自己的“struct device”，可以使用**pr\_debug()**或者**dev\_dbg()**：它们支持动态调试（**dyndbg**）特性，并可以根据需要启用或者禁用（请查阅**Documentation/dynamic-debug-howto.txt**）。对于单纯的开发消息，使用**pr\_devel()**，除非设置了DEBUG，否则什么都不会做。要为我们的模块启用DEBUG，请添加以下行到Makefile中：
>
>
>
> ```
> CFLAGS_reverse.o := -DDEBUG
>
> ```
>
> 完了之后，使用**dmesg**来查看**pr\_debug()**或**pr\_devel()**生成的调试信息。 或者，你可以直接发送调试信息到控制台。要想这么干，你可以设置**console\_loglevel**内核变量为8或者更大的值（**echo 8 /proc/sys/kernel/printk**），或者在高日志等级，如**KERN\_ERR**，来临时打印要查询的调试信息。很自然，在发布代码前，你应该移除这样的调试声明。
>
>
> 注意内核消息出现在控制台，不要在Xterm这样的终端模拟器窗口中去查看；这也是在内核开发时，建议你不在X环境下进行的原因。
>
>
>

### 惊喜，惊喜！

编译模块，然后加载进内核：

```
$ make
$ sudo insmod reverse.ko buffer_size=2048
$ lsmod
reverse 2419 0
$ ls -l /dev/reverse
crw-rw-rw- 1 root root 10, 58 Feb 22 15:53 /dev/reverse

```

一切似乎就位。现在，要测试模块是否正常工作，我们将写一段小程序来翻转它的第一个命令行参数。**main()**（再三检查错误）可能看上去像这样：

```
int fd = open("/dev/reverse", O_RDWR);
write(fd, argv[1], strlen(argv[1]));
read(fd, argv[1], strlen(argv[1]));
printf("Read: %s\n", argv[1]);

```

像这样运行：

```
$ ./test 'A quick brown fox jumped over the lazy dog'
Read: dog lazy the over jumped fox brown quick A

```

它工作正常！玩得更逗一点：试试传递单个单词或者单个字母的短语，空的字符串或者是非英语字符串（如果你有这样的键盘布局设置），以及其它任何东西。

现在，让我们让事情变得更好玩一点。我们将创建两个进程，它们共享一个文件描述符（及其内核缓冲区）。其中一个会持续写入字符串到设备，而另一个将读取这些字符串。在下例中，我们使用了**fork(2)**系统调用，而pthreads也很好用。我也省略打开和关闭设备的代码，并在此检查代码错误（又来了）：

```
char *phrase = "A quick brown fox jumped over the lazy dog";
if (fork())
    /* Parent is the writer */
    while (1)
        write(fd, phrase, len);
else
    /* child is the reader */
    while (1) {
        read(fd, buf, len);
        printf("Read: %s\n", buf);
}

```

你希望这个程序会输出什么呢？下面就是在我的笔记本上得到的东西：

```
Read: dog lazy the over jumped fox brown quick A
Read: A kcicq brown fox jumped over the lazy dog
Read: A kciuq nworb xor jumped fox brown quick A
Read: A kciuq nworb xor jumped fox brown quick A
...

```

这里发生了什么呢？就像举行了一场比赛。我们认为**read**和**write**是原子操作，或者从头到尾一次执行一个指令。然而，内核确实无序并发的，随便就重新调度了**reverse\_phrase()**函数内部某个地方运行着的写入操作的内核部分。如果在写入操作结束前就调度了**read()**操作呢？就会产生数据不完整的状态。这样的bug非常难以找到。但是，怎样来处理这个问题呢？

基本上，我们需要确保在写方法返回前没有**read**方法能被执行。如果你曾经编写过一个多线程的应用程序，你可能见过同步原语（锁），如互斥锁或者信号。Linux也有这些，但有些细微的差别。内核代码可以运行进程上下文（用户空间代码的“代表”工作，就像我们使用的方法）和终端上下文（例如，一个IRQ处理线程）。如果你已经在进程上下文中和并且你已经得到了所需的锁，你只需要简单地睡眠和重试直到成功为止。在中断上下文时你不能处于休眠状态，因此代码会在一个循环中运行直到锁可用。关联原语被称为自旋锁，但在我们的环境中，一个简单的互斥锁 —— 在特定时间内只有唯一一个进程能“占有”的对象 —— 就足够了。处于性能方面的考虑，现实的代码可能也会使用读-写信号。

锁总是保护某些数据（在我们的环境中，是一个“struct buffer”实例），而且也常常会把它们嵌入到它们所保护的结构体中。因此，我们添加一个互斥锁（‘struct mutex lock’）到“struct buffer”中。我们也必须用**mutex\_init()**来初始化互斥锁；**buffer\_alloc**是用来处理这件事的好地方。使用互斥锁的代码也必须包含**linux/mutex.h**。

互斥锁很像交通信号灯 —— 要是司机不看它和不听它的，它就没什么用。因此，在对缓冲区做操作并在操作完成时释放它之前，我们需要更新**reverse\_read()**和**reverse\_write()**来获取互斥锁。让我们来看看**read**方法 —— **write**的工作原理相同：

```
static ssize_t reverse_read(struct file *file, char __user * out,
        size_t size, loff_t * off)
{
    struct buffer *buf = file->private_data;
    ssize_t result;
    if (mutex_lock_interruptible(&buf->lock)) {
        result = -ERESTARTSYS;
        goto out;
}

```

我们在函数一开始就获取锁。**mutex\_lock\_interruptible()**要么得到互斥锁然后返回，要么让进程睡眠，直到有可用的互斥锁。就像前面一样，**\_interruptible**后缀意味着睡眠可以由信号来中断。

```
    while (buf->read_ptr == buf->end) {
        mutex_unlock(&buf->lock);
        /* ... wait_event_interruptible() here ... */
        if (mutex_lock_interruptible(&buf->lock)) {
            result = -ERESTARTSYS;
            goto out;
        }
    }

```

下面是我们的“等待数据”循环。当获取互斥锁时，或者发生称之为“死锁”的情境时，不应该让进程睡眠。因此，如果没有数据，我们释放互斥锁并调用**wait\_event\_interruptible()**。当它返回时，我们重新获取互斥锁并像往常一样继续：

```
    if (copy_to_user(out, buf->read_ptr, size)) {
        result = -EFAULT;
        goto out_unlock;
    }
    ...
out_unlock:
    mutex_unlock(&buf->lock);
out:
    return result;

```

最后，当函数结束，或者在互斥锁被获取过程中发生错误时，互斥锁被解锁。重新编译模块（别忘了重新加载），然后再次进行测试。现在你应该没发现毁坏的数据了。

### 接下来是什么？

现在你已经尝试了一次内核黑客。我们刚刚为你揭开了这个话题的外衣，里面还有更多东西供你探索。我们的第一个模块有意识地写得简单一点，在从中学到的概念在更复杂的环境中也一样。并发、方法表、注册回调函数、使进程睡眠以及唤醒进程，这些都是内核黑客们耳熟能详的东西，而现在你已经看过了它们的运作。或许某天，你的内核代码也将被加入到主线Linux源代码树中 —— 如果真这样，请联系我们！

---

via: <http://www.linuxvoice.com/be-a-kernel-hacker/>

译者：[GOLinux](https://github.com/GOLinux) [disylee](https://github.com/disylee) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Linux：使用bash删除目录中的特定文件

Summary: 我是一名Linux新用户。现在我需要清理一个下载目录中的文件，其实我就是想从～/Download/文件夹删去除了以下格式的文件外所以其它文件：  *.iso - 所有的iso格式的文件。 *.zip - 所有zip格式的文件。  我如何在一个基于Linux，OS X 或者 Unix-like 系统上的bash shell中删除特定的文件呢？ Bash shell 支持丰富的文件模式匹配符例如：  * － 匹配所有的文件。 ？ － 匹配文件名中的单个字母。  － 匹配封闭括号中的任何一个字母。  策略 #1: 见识一下扩展的模式匹配符 这里你需要用系统内置的shopt命令来开启shell中的extglob选项，然后

# Linux：使用bash删除目录中的特定文件

<img src="content_image/album_201406_24_151307gi7yvhtpoybdb6pk.jpg" alt="" title="">

我是一名Linux新用户。现在我需要清理一个下载目录中的文件，其实我就是想从～/Download/文件夹删去除了以下格式的文件外所以其它文件：

* \*.iso - 所有的iso格式的文件。
* \*.zip - 所有zip格式的文件。

我如何在一个基于Linux，OS X 或者 Unix-like 系统上的bash shell中删除特定的文件呢？

Bash shell 支持丰富的文件模式匹配符例如：

* \* － 匹配所有的文件。
* ？ － 匹配文件名中的单个字母。
* [...] － 匹配封闭括号中的任何一个字母。

### 策略 #1: 见识一下扩展的模式匹配符

这里你需要用系统内置的shopt命令来开启shell中的extglob选项，然后你就可以使用扩展的模式符了，这些模式匹配符如下：

1. ?(模式列表) － 匹配零次或一次给定的模式。
2. \*(模式列表) － 匹配零次或多次给定的模式。
3. +(模式列表) － 至少匹配一次给定的模式。
4. @(模式列表) － 匹配一次给定的模式。
5. !(模式列表) － 不匹配给定模式。

一个模式列表就是一个或多个用 | 分开的模式（文件名）。

首先要打开extgolb选项：

```
shopt -s extglob

```

#### 在Bash中删掉除*.zip和*.iso文件以外的所有文件

rm 命令的语法格式为：

```
## 仅保留 file1 文件 ##
rm  !(file1)

## 仅保留 file1 和 file2 文件##
rm  !(file1|file2)

## 仅保留 zip 文件 ##
rm  !(*.zip)

## 仅保留 zip 和 iso 文件 ##
rm  !(*.zip|*.iso)

## 你也可以使用完整的目录 ##
rm /Users/vivek/!(*.zip|*.iso|*.mp3)

## 也可以传递参数 ##
rm [选项]  !(*.zip|*.iso)
rm -v  !(*.zip|*.iso)
rm -f  !(*.zip|*.iso)
rm -v -i  !(*.php)

```

最后，关闭 extglob 选项方法如下：

```
shopt -u extglob

```

### 策略 #2: 使用bash的 GLOBIGNORE 变量删除指定文件以外的所有文件

摘自 [bash(1)](http://www.manpager.com/linux/man1/bash.1.html) 手册页:

>
> 这是一个用冒号分开的模式列表，通过路径展开方式定义了要忽略的文件集合。如果一个匹配到路径展开模式的文件也匹配GLOBIGNORE中的模式，那么它会从匹配列表中移除。
>
>
>

要删除所有文件只保留 zip 和 iso 文件，应如下设置 GLOBIGNORE：

```
## 只在 BASH 中可行 ##
cd ~/Downloads/
GLOBIGNORE=*.zip:*.iso
rm -v *
unset GLOBIGNORE

```

### 策略 #3: 用 find 命令删除所有其它文件仅保留 zip 和 iso 文件

如果你正在使用 tcsh/csh/sh/ksh 或者其它shell，你可以在Unix－like系统上试着用下面find命令的语法格式来删除文件：

```
find /dir/ -type f -not -name '匹配模式' -delete

```

或者

```
## 对于怪异的文件名可以使用 xargs ##
find /dir/ -type f -not -name '匹配模式' -print0 | xargs -0 -I {} rm {}
find /dir/ -type f -not -name '匹配模式' -print0 | xargs -0 -I {} rm [选项] {}

```

想要删除 ～/source 目录下除 php 以外的文件，键入：

```
find ~/sources/ -type f -not -name '*.php' -delete

```

或者

```
find ~/sources/ -type f -not -name '*.php' -print0 | xargs -0 -I {} rm -v {}

```

只保留 \*.zip 和 \*.iso 文件的语法如下：

```
find . -type f -not \( -name '*zip' -or -name '*iso' \) -delete

```

更多信息参见[bash command man page](http://www.manpager.com/linux/man1/bash.1.html)和[find command man page](http://www.manpager.com/linux/man1/find.1.html)。

---

via: <http://www.cyberciti.biz/faq/linux-bash-delete-all-files-in-directory-except-few/>

译者：[Linchenguang](https://github.com/Linchenguang) 校对：[Caroline](https://github.com/carolinewuyan)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


linux简单之美

Summary:
话说windows也有syscall，这是必须的。但是win的syscall可以直接call吗？可以是
可以但是破费周折，搞成SDT之类的复杂概念。下面看看linux是如何做的吧。

view plaincopyprint?

section.data
msgdb"hellohopy!",0x0a

section.text
global_start

_start:
moveax,4
movebx,1
movecx,msg
movedx,12
int0x80

moveax,1
movebx,0
int0x80

  关键是系统调用号要知道，开始找的是usr/include/asm-gen*/unistd.h，
可是都不对。后来找的是usr/include/x86_64_linux_gnu/asm/下的头文件，
有2个，分别对应x86和x64.、编译连接指令如下:
nasm

# linux简单之美

<img src="content_image/album_201406_24_155116x0fq14fe0f909bde.jpeg" alt="" title="">

### （一）

话说windows也有syscall，这是必须的。但是win的syscall可以直接call吗？可以是

可以但是破费周折，搞成SDT之类的复杂概念。下面看看linux是如何做的吧。

```
section .data
msg db "hello hopy!",0x0a

section .text
global _start

_start:
	mov eax,4
	mov ebx,1
	mov ecx,msg
	mov edx,12
	int 0x80

	mov eax,1
	mov ebx,0
	int 0x80

```

关键是系统调用号要知道，开始找的是usr/include/asm-gen\*/unistd.h，

可是都不对。后来找的是usr/include/x86\_64\_linux\_gnu/asm/下的头文件，

有2个，分别对应x86和x64.、编译连接指令如下:

```
nasm -f elf main.asm
ld main.o
```

运行，段转储错误鸟，查了一下，本猫用的是x64位的linux，所以要生成

x64位的程序，或者指明是x86的程序，我选择后者:

```
ld -m elf_i386 -o main main.o
```

哦鸟！

### （二）

我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用

C标准库中的函数快速做一些"复杂"的事:

```
section .data
	ft db "now is %d",10

section .text
extern puts
extern exit
extern sleep
extern printf
global main

main:
	mov edi,11
again:
	dec edi
	push edi
	push ft
	call printf

	push 1
	call sleep

	cmp edi,0
	jnz again

	push msg
	call puts

	push 0
	call exit

msg:
 db "happy xxx day!",0
```

以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中

调用了C标准库中的函数.编译和以前一样:

```
nasm -e elf main.asm
```

我们看看怎么连接:

```
gcc -m32 -o main main.o
```

好鸟!运行正常.

值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,如果开始用

```
ld -m elf_i386 -lc -o main main.o
```

的方式,首先会提示找不到c库,这可以进入/usr/lib,然后使用

```
sudo ln -sv /lib/i386-linux-gun/libc.so.6 libc.so
```

创建软连接解决.

但在运行时提示无法找到可执行文件!该文件明明在的!

遂用gcc来连接,但要将\_start改为main,还要装载32库

```
sudo apt-get install ia32-libs
```

还会提示找不到h文件,这时再装载库

```
sudo apt-get install g++-multilib
```

还有2族库,如有必要也可加载:

```
sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386
libstdc++5:i386 libstdc++6:i386
sudo apt-get install libc6-i386

```

最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,

这时改成如下即可:

```
gcc -D_GNU_SOURCE -std=c99 main.c
```

###  （三）

在（二）中我们尝试使用了C库的函数完成功能,那么能不能用syscall方式

来搞呢?显然可以!

```
section .data
	ft db "now is X",10

section .text
global _start

_start:
	mov edi,10
again:
	dec edi
	mov eax,edi
	add eax,0x30
	mov byte [ft+7],al

	mov eax,4
	mov ebx,1
	mov ecx,ft
	mov edx,9
	int 0x80

	mov eax,162
	push 0
	push 1
	mov ebx,esp
	mov ecx,0
	int 0x80

	cmp edi,0
	jnz again

	mov eax,4
	mov ebx,1
	mov ecx,msg
	mov edx,15
	int 0x80

	mov eax,1
	mov ebx,0
	int 0x80

msg:
 db "happy xxx day!",10
```

--

```
nasm -f elf main.asm
ld -m elf_i386 -o main main.o
```

在代码中延时使用的是nanosleep,其他和第一篇一致,只不过做了一个bin->ascii的小转换.

via： <http://blog.csdn.net/mydo/article/details/8224352> <http://blog.csdn.net/mydo/article/details/8452386> <http://blog.csdn.net/mydo/article/details/8452417>


实用的Linux SHELL面试问题及答案

Summary: 随着之前有关面试的系列文章，读者的反应比较强烈，所以我决定出一篇有关Linux Shell相关的面试文章，如果对本文有什么意见或意见的话，欢迎反馈到我的邮箱里。 如果想要阅读已发表在Tecmint.com的文章，可以点击链接，链接到访谈系列，在这里我们已经介绍很多题目即文章。，FTP，MySQL和Apache的，脚本，Linux命令等。   实用的shell脚本面试问题  这边提到的5个面试问题，延续之前的有关Linux面试问题和答案。如果你是Tecmint.com的读者，你的支持我非常感谢。 1. 写一个shell脚本来得到当前的日期，时间，用户名和当前工作目录。  答案

好

repost//@清风博主:转发微博

给出的脚本堪称编码规范，麻雀虽小，异常处理，友好提示，一应俱全，值得学习。

Ubuntu裡安裝電視卡，永使我頭痛。

赞

Repost

mark

# 实用的Linux SHELL面试问题及答案

随着之前有关面试的系列文章，读者的反应比较强烈，所以我决定出一篇有关Linux Shell相关的面试文章，如果对本文有什么意见或意见的话，欢迎反馈到我的邮箱里。

如果想要阅读已发表在Tecmint.com的文章，可以点击链接，链接到[访谈系列](http://www.tecmint.com/category/interview-questions/)，在这里我们已经介绍很多题目即文章。，FTP，MySQL和Apache的，脚本，Linux命令等。

<img src="content_image/album_201406_24_202807fr0n4rrn0b628u49.png" alt="Practical Interview Question on Shell Scripting" title="Practical Interview Question on Shell Scripting">

>
> 实用的shell脚本面试问题
>
>
>

这边提到的5个面试问题，延续之前的有关Linux面试问题和答案。如果你是Tecmint.com的读者，你的支持我非常感谢。

### 1. 写一个shell脚本来得到当前的日期，时间，用户名和当前工作目录。

>
> **答案** : 输出用户名，当前日期和时间，以及当前工作目录的命令就是logname，date，who i am和pwd。
>
>
>

现在，创建一个名为**userstats.sh**文件，将下面的代码添加到它。

```
#!/bin/bash
echo "Hello, $LOGNAME"
echo "Current date is `date`"
echo "User is `who i am`"
echo "Current directory `pwd`"

```

给它添加执行权限，并且执行他。

```
# chmod 755 userstats.sh
# ./userstats.sh

```

#### 样例输出

```
Hello, avi
Current date is Sat Jun  7 13:05:29 IST 2014
User is avi      pts/0        2014-06-07 11:59 (:0)
Current directory /home/avi/Desktop

```

### 2.写一个shell脚本，进行两个数字的相加，如果没有输入参数就输出错误信息和一行使用说明

>
> **答案** : 下面是简单的shell脚本以及描述，如果没有命令行参数，它会抛出错误与如何使用脚本的说明。
>
>
>

再创建一个名为**twonumbers.sh**文件和下面的内容添加到文件里。

```
#!/bin/bash
# The Shebang

if [ $# -ne 2 ]
# If two Inputs are not received from Standard Input

then
# then execute the below statements

    echo "Usage - $0   x    y"
    # print on standard output, how-to use the script (Usage - ./1.sh   x    y )

    echo "        Where x and y are two nos for which I will print sum"
    # print on standard output, “Where x and y are two nos for which I will print sum ”

    exit 1
    # Leave shell in Error Stage and before the task was successfully carried out.

fi
# End of the if Statement.

    echo "Sum of $1 and $2 is `expr $1 + $2`"
    # If the above condition was false and user Entered two numbers as a command Line Argument,
       it will show the sum of the entered numbers.

```

给他添加可执行权限，并且执行。

```
# chmod 755 two-numbers.sh

```

**情形一**: 未输入两个数字作为命令行参数运行脚本，你将得到下面的输出。

#### 样例输出

```
# ./two-numbers.sh

Usage - ./two-numbers.sh   x    y
        Where x and y are two nos for which I will print sum

```

**情形二**: 当数字存在时，你会得到如图所示的结果。

```
$ ./two-numbers.sh 4 5

Sum of 4 and 5 is 9

```

因此，上述shell脚本满足了问题的要求。

### 3.你需要打印一个给定的数字的反序，如输入10572，输出27501，如果没有输入数据，应该抛出错误和使用脚本说明。在此之前，告诉我你需要在这里使用的算法。

#### 算法

1. 输入的数字为n
2. 赋值 rev=0, sd=0 (反向和单个数字设置为0)
3. n % 10, 将得到最左边的数字
4. 反向数字可以用这个方法生成 rev \* 10 + sd
5. 对输入数字进行右位移操作（除以10）
6. 如果n > 0, 进入第三步，否则进行第七步
7. 输出rev

现在，创建一个名为**`numbers.sh**`文件，并添加以下代码。

```
#!/bin/bash
if [ $# -ne 1 ]
then
    echo "Usage: $0   number"
    echo "       I will find reverse of given number"
    echo "       For eg. $0 0123, I will print 3210"
    exit 1
fi

n=$1
rev=0
sd=0

while [ $n -gt 0 ]
do
    sd=`expr $n % 10`
    rev=`expr $rev \* 10  + $sd`
    n=`expr $n / 10`
done
    echo  "Reverse number is $rev"

```

授予对文件的执行权限，并运行如下所示的脚本。

```
# chmod 755 numbers.h

```

**情形一**: 当输入不包含命令行参数，你将得到下面的输出。

#### 样例输出

```
./numbers.sh

Usage: ./numbers.sh  number
       I will find reverse of given number
       For eg. ./2.sh 123, I will print 321

```

**情形二**: 正常输入

```
$ ./numbers.sh 10572

Reverse number is 27501

```

上面的脚本非常完美，输出正是我们需要的。

### 4. 你应该直接用终端，而不是依靠任何shell脚本来进行实数计算。你会怎么做（比如实数7.56+2.453）？

>
> **答案** : 我们需要用如下所述的特殊方式使用bc命令。将7.56+2.453作为输入通过管道进入bc中。
>
>
>

```
$ echo 7.56 + 2.453 | bc

10.013

```

### 5. 你需要给出圆周率的值，精度为小数点后100位，什么是最简单的方法。

>
> **答案** : 找圆周率的值最简单的方法，我们只是需要发出以下命令。
>
>
>

```
# pi 100

3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

```

很明显！安装我们必须有包**pi**。只用一个**apt**或**yum**命令，就能获得所需的软件包，同时用最简单方法来实现这个需求。

就是这样。我会很快在Tecmint.com发表另一个有趣的文章。至此敬请关注。别忘了向我们提供您在的评论和反馈。

---

via: <http://www.tecmint.com/practical-interview-questions-on-linux-shell-scripting/>

译者：[MikeCoder](https://github.com/MikeCoder) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


[小白技巧]如何在Linux中知道你的系统是否有USB 3.0 端口

Summary: 近来的大多数的新计算机都有了USB 3.0接口了。但是你怎么知道你的计算机有没有USB 3.0接口？这篇短文中，我们会告诉如何在Linux下知道你的系统上有USB 3还是USB3接口。 在Linux终端中检测是否有USB 3.0 端口 打开一个终端,并使用下面的命令: lsusb  这个命令会显示你系统下USB的总线信息。检查一下结果，如果你看到像3.0 root hub字样，这意味着你系统有USB 3.0。比如，在我的电脑上，它这样显示：  这个技巧在所有的Linux系统上，像Ubuntu，Linux Mint，Fedora等等都有效。现在当你知道你有USB 3.0 端口之后，**如何辨别哪个口是USB 3.0,

转发微博。

Thanks!

# [小白技巧]如何在Linux中知道你的系统是否有USB 3.0 端口

近来的大多数的新计算机都有了USB 3.0接口了。但是**你怎么知道你的计算机有没有USB 3.0接口**？这篇短文中，我们会告诉如何在Linux下知道你的系统上有USB 3还是USB3接口。

### 在Linux终端中检测是否有USB 3.0 端口

打开一个终端,并使用下面的命令:

```
lsusb

```

这个命令会显示你系统下USB的总线信息。检查一下结果，如果你看到像“3.0 root hub”字样，这意味着你系统有USB 3.0。比如，在我的电脑上，它这样显示：

这个技巧在所有的Linux系统上，像Ubuntu，Linux Mint，Fedora等等都有效。现在当你知道你有USB 3.0 端口之后，\*\*如何辨别哪个口是USB 3.0,哪个是USB 2.0。

### 辨别哪个口是USB 3.0

通常USB 3.0 口被标记为SS（“Super Speed”的缩写）。如果你的系统制造商没有标记SS或者USB 3,那么你可以检查端口的内部通常是蓝色的。

我希望这个快捷提示能够帮助你知道你系统是否有USB 3.0 并可以分辨出USB 3.0 口

---

via: <http://itsfoss.com/find-usb-3-port-linux/>

译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Linux 平台七大桌面环境通览

Summary: 通常的 Linux 发行版都使用 KDE 或者 GNOME 作为默认的桌面环境。它们都给用户提供了一个原始的并且有吸引力的桌面，并且内置了各式各样的多媒体软件、系统程序、游戏、实用程序、网页开发工具、编程工具等等。这两个桌面致力于提供给用户一个拥有类似于 Windows 操作系统体验的尖端计算环境，而不是如何更少的占用系统资源。 如果你正在使用 Ubuntu (或者其他Linux发行版) 并且厌倦了始终使用 Unity 桌面，那么你应该看看这些可以替代 Unity 的选择。我收集了 7 种桌面环境。它们都很棒。在你读完这篇文章之后，请试着使用它们吧。 Mate

嗯

在家要告别windows喽

[good] //@清风博主: 转发微博

Repost

Xfce就不能找张好看点的图，默认的太丑了。。。。。。。。。。。。

在某Linux系统的学习机上还装过Xfce玩呢ww//@Athlon65X8:[good] //@清风博主: 转发微博

回复@寄意寒星k:14.04的背景挺好看的～大赞xfce，最舒服的桌面

回复@袁飞-snowhawkyrf:就那个老鼠看着不爽。。。。。。。。

xfce默认确实……

喔耶~[太开心]//@HungChow故事:感受Linux系统的魅力@Rock_95 @刘巧菲 @超骉 @九骉传媒 @子明轩 @专收妖精-5毛钱一个

虚拟机中，i5分配两个核心,2G内存。xfce跑起来挺流畅，中文输入支持挺完善，因为太丑卸掉了。gnome3实在太卡，其次依次是unity，cinnamon，xfce虚拟机中的显卡驱动很不完善没办法。

Repost Weibo

一直喜欢用KDE，流畅，优雅，统一的界面风格！

个人喜欢GNOME 2，不喜欢最新的GNOME 3。

支持控制台

+10<br />
Gnome 3跟KDE一个德性。

+10<br />
Gnome 3跟KDE一个德性。

都不错 深度的桌面也不错

小編真會講笑話，什麼叫KDE和Gnome致力於爲用戶提供一個類似視窗的使用體驗，我都懷疑小編沒用過linux，KDE看似很像視窗，實際上使用體驗完全不一樣，再說都說Gnome像Mac OS，而不是視窗。

說得對，Gnome 2像Mac OS X，Gnome 3更像

# Linux 平台七大桌面环境通览

通常的 Linux 发行版都使用 KDE 或者 GNOME 作为默认的桌面环境。它们都给用户提供了一个原始的并且有吸引力的桌面，并且内置了各式各样的多媒体软件、系统程序、游戏、实用程序、网页开发工具、编程工具等等。这两个桌面致力于提供给用户一个拥有类似于 Windows 操作系统体验的尖端计算环境，而不是如何更少的占用系统资源。

如果你正在使用 Ubuntu (或者其他Linux发行版) 并且厌倦了始终使用 Unity 桌面，那么你应该看看这些可以替代 Unity 的选择。我收集了 7 种桌面环境。它们都很棒。在你读完这篇文章之后，请试着使用它们吧。

### [Mate](http://mate-desktop.org/)

MATE 是 GNOME2 的一个分支。它提供了一个自然且吸引人的桌面环境。它是 Linux 和其它类 Unix 工作环境中的传统工作框架的代表。MATE 在保留传统的桌面体验的同时正在不断进步使用新的技术。

在 Ubuntu 14.04 中，可以直接从 Ubuntu 软件中心获取 MATE 桌面。

### [KDE](http://kde.org/)

KDE 是另一个类似于 GNOME 一样的重量级桌面环境。它在本文章所提及的7种桌面环境中被认为是最华丽最重量级的一个。它同样是一个类似于 Windows 的桌面，在这一点上没有什么特殊的变化。不过 KDE 非常有特点，但是随之而来的是可以通过大量的设置来提升你的桌面体验。同样的，有很多关于 KDE 的话题，所以你可以很舒服的使用 KDE，并让它以你希望的方式工作。

### [Cinnamon](http://cinnamon.linuxmint.com/)

Cinnamon 是一个基于 Gtk+ 的环境。它最初作为 GNOME Shell 的一个用户界面分支，由 Linux Mint 为其创建的。 Cinnamon 的核心设计目标是让桌面终端和触屏设备都能完美操作。无论是使用鼠标，还是使用触摸屏都可以获得同样便捷的操作。不像 KDE Plasma 工作空间，只有一种图形用户体验。当前版本—— Cinnamon 2.0 于2013年10月10日发布。

### [Unity](https://unity.ubuntu.com/)

Unity 是 GNOME 桌面环境的一个界面，由 Canonical 公司创建，用于 Ubuntu 系统中。Unity 最初现身于 Ubuntu 10.10 的上网本版本中。它起初打算充分利用上网本的屏幕空间，例如一个竖直的应用启动器和一个节省空间的多功能顶部菜单栏。Unity 不像 GNOME、KDE、 Xfce 或者 LXDE 是许多软件的合集，它是为了可用性而开发的。

### [GNOME Shell](http://www.gnome.org/)

GNOME 提供了桌面核心接口例如交换窗口，启动应用程序以及显示提示。它利用先进的图形硬件来实现吸引人的、创新的界面思想，提供了愉悦简单的用户体验。GNOME Shell 定义了 GNOME 3 的客户体验。

作为 GNOME 的一个重要组成部分， GNOME Shell 的稳定版本首次发布于2011年3月3日。

### [Xfce](http://xfce.org/)

Xfce 是一个轻量级的桌面环境，围绕 GTK 框架实现。它看起来很像 Gnome 2 和 MATE，然而 Xfce 是它们的轻量级替代品。相较于 KDE 和 GNOME 3 而言，Xfce 非常轻量级，所以它对于运行轻量级的工具或者那些希望实现最大执行效率的框架使用者来说是理想的环境。它还不是可以获得的最轻量级的选择 - 请继续往下看 - 然而，Xfce 的确完成了执行效率和功能的平衡。

### [LXDE](http://lxde.org/)

LXDE 显然是桌面环境中最轻量级的选择，至少在传统的桌面标准中是这样。这个基于 GTK 的桌面环境使用了很多轻量级的选择替代了默认的应用（例如 Abiword, Gnumeric, 而不是 LibreOffice）。它没有提供炫目的视觉震撼 ，总体感觉也不是特别的棒，没有高级的设置。但是，LXDE 仍然提供了漂亮的桌面和完整的功能。当你需要快速简洁时，它就是你的选择。

---

via: <http://pulpybucket.com/top-7-desktop-environment-linux/>

译者：[wwhio](https://github.com/wwhio) 校对：[Caroline](https://github.com/carolinewuyan)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Linux Mint 18.3 (Sylvia)

Summary: 简介 Linux Mint是一种基于Ubuntu或Debian开发出的Linux操作系统。由Linux Mint Team团队于2006年开始发行。Linux Mint 的目标是为家庭用户和企业客户提供一个免费、高效、易用、高雅的桌面操作系统。 Linux Mint是目前Distrowatch排行榜上第一名的Linux发行版。 他继承了Ubuntu的众多优点，同时也在Ubuntu的基础上加入很多自己优秀的特性。Linux Mint致力于提供一种更开箱即刻可用的用户体验，免去用户要安装系统后还要自己安装一系列满足基本使用需求的软件。它包括提供浏览器插件、多媒体编解码器、对DVD播放的支持、Java和其他组件。

说实话，很好用，但离win7还有很远的距离。

用过，但总是觉得比起elementary少了点什么，装过之后立马换回elementary了，自带的手势操作有点少啊，

用过linuxmint17 cinnamon版本的，当时汉化的时候好麻烦，官方只有一个汉化包，其他的汉化文件都是自己装的，果断卸载。

不能下载  。。。。。

17.3发行版中文支持情况不乐观！

为何要模仿win7，mint有自己的路

很好

# Linux Mint 18.3 (Sylvia)

>
> 基于 Ubuntu 的发行版 Linux Mint 发布了 18.3 “Sylvia”，它是一个长期支持版，将一直支持到2021年。
>
>
>

<img src="content_image/album_201406_24_221429ru3lpnr3fwpyerr2.png" alt="" title="">

### 简介

Linux Mint 是一种基于 Ubuntu 或 Debian 开发出的 Linux 操作系统。由 Linux Mint Team 团队于 2006 年开始发行。Linux Mint 的目标是为家庭用户和企业客户提供一个免费、高效、易用、高雅的桌面操作系统。

Linux Mint 是目前 Distrowatch 排行榜上第一名的 Linux 发行版。

他继承了 Ubuntu 的众多优点，同时也在 Ubuntu 的基础上加入很多自己优秀的特性。Linux Mint 致力于提供一种更开箱即刻可用的用户体验，免去用户要安装系统后还要自己安装一系列满足基本使用需求的软件。它包括提供浏览器插件、多媒体编解码器、对 DVD 播放的支持、Java 和其他组件。它也增加了一套定制桌面及各种菜单，一些独特的配置工具，以及一份基于web的软件包安装界面。

官方网站： <http://www.linuxmint.com/>

### 下载

Cinnamon 桌面

* Intel & AMD，适用于 32-bit 位 PC [点此下载](http://mirrors.ustc.edu.cn/linuxmint-cd/stable/18.3/linuxmint-18.3-cinnamon-32bit.iso)
* Intel & AMD，适用于 64-bit 位 PC [点此下载](http://mirrors.ustc.edu.cn/linuxmint-cd/stable/18.3/linuxmint-18.3-cinnamon-64bit.iso)

MATE 桌面

* Intel & AMD，适用于 32-bit 位 PC [点此下载](http://mirrors.ustc.edu.cn/linuxmint-cd/stable/18.3/linuxmint-18.3-mate-32bit.iso)
* Intel & AMD，适用于 64-bit 位 PC [点此下载](http://mirrors.ustc.edu.cn/linuxmint-cd/stable/18.3/linuxmint-18.3-mate-64bit.iso)
（SHA256SUM: b41c5258c03bd8fe4ecab5f1db33f4484bd1992ec306ea4bdde25fc7d6ea2f40）

### 发行

为了追求易用性和良好的人机交互体验，Linux Mint 集成了可以开箱即用的大量多媒体等软件包。因此它的 Live ISO 体积超过了 ubuntu 的本地安装镜像，甚至大于 950MB。作为传统的刻盘安装方式，这样的体积对于一张 700MB 的CD来说肯定是太大了，只有使用 DVD光 盘刻录才可以。

因为基于 Ubuntu，Linux Mint 与 Ubuntu软件仓库完全兼容，采用a pt管理和.deb软件包。

从 5.0 开始，Mint 遵循每六个月发布一次新版本的制度，并且采用简化的版本计划。目前最新版本是 Linux Mint 18.3 “Sylvia”。

从18.0开始，Mint 基于 Ubuntu 长期支持版，并会在下一个长期支持版发布之前持续向后移植一些重要的应用程序，下一个长期支持版本发布后，则转为只有安全更新的模式直到支持退出。

此外有不基于 Ubuntu 而基于 Debian 的版本，称之为 LMDE （Linux Mint Debian Edition），其采用滚动更新，目前最新版本为 LMDE 2 201701（采用发布年月作为版本号）。

Linux Mint 提供 4 种官方桌面环境。

* Cinnamon：是 Unix-like 系统下的一个用户界面。是 GNOME Shell 的一个派生版本，最初是为 Linux Mint 所开发，其提供了如同 GNOME 2 般，易于使用的拟真接口。Cinnamon 使用 Muffin，一个 GNOME 3 的窗口管理器 Mutter 的派生版本，作为自 1.2 版起的默认窗口管理器。

* MATE：由已经停止官方维护的 GNOME 2 源代码派生而来。因为 GNOME 3 以 GNOME Shell 为基础所创建的用户界面取代传统的拟真接口。这导致了一些 Linux 社区的批评。许多用户拒绝使用新的 GNOME 接口，并要求其他开发者继续开发 GNOME 2。MATE 随 Linux Mint12 投入使用。

* KDE

* Xfce

### 当前版本

最新版本 Linux Mint 18.3 Cinnamon KDE “Sylvia” 基于 Ubuntu 16.04 开发，使用 Linux 4.4 内核、桌面环境为Cinnamon 3.2。该版本属于长期支持版本，支持服务到 2021 年。

* 更新管理器有巨大改进，看起来更漂亮，速度更快，显示更多信息，使用更方便。
* 驱动管理器现在不需要连接到互联网即可安装本地存储的驱动程序。
* 登录屏幕现在支持多显示器、高分屏，背景动画占用更少的CPU。
* 软件源的界面有一些易用性修改。
* 重新设计的欢迎屏幕使用更少资源，启动更快。

### 历史

| 版本 | 代号 | 平台 | Code 基于 | APT 基于 | 用户界面 | 发布日期 |
| --- | --- | --- | --- | --- | --- | --- |
| 1.0 | **Ada** | Main | Kubuntu 6.06 | Kubuntu 6.06 | KDE | 2006-08-27 |
| 2.0 | **Barbara** | Main | Ubuntu 6.10 | Ubuntu 6.10 | GNOME | 2006-11-13 |
| 2.1 | **Bea** | Main | Ubuntu 6.10 | Ubuntu 6.10 | GNOME | 2006-12-20 |
| 2.2 | **Bianca** | Main | Ubuntu 6.10 | Ubuntu 6.10 | GNOME | 2007-02-20 |
| Light | Ubuntu 6.10 | Ubuntu 6.10 | GNOME | 2007-03-29 |
| KDE CE | Kubuntu 6.10 | Kubuntu 6.10 | KDE | 2007-04-20 |
| 3.0 | **Cassandra** | Main | Bianca 2.2 | Ubuntu 7.04 | GNOME | 2007-05-30 |
| Light | Bianca 2.2 | Ubuntu 7.04 | GNOME | 2007-06-15 |
| KDE CE | Bianca 2.2 | Kubuntu 7.04 | KDE | 2007-08-14 |
| MiniKDE CE | Bianca 2.2 | Kubuntu 7.04 | KDE | 2007-08-14 |
| Xfce CE | Cassandra 3.0 | Xubuntu 7.04 | Xfce | 2007-08-07 |
| 3.1 | **Celena** | Main | Bianca 2.2 | Ubuntu 7.04 | GNOME | 2007-09-24 |
| Light | Bianca 2.2 | Ubuntu 7.04 | GNOME | 2007-10-01 |
| 4.0 | **Daryna** | Main | Celena 3.1 | Ubuntu 7.10 | GNOME | 2007-10-15 |
| Light | Celena 3.1 | Ubuntu 7.10 | GNOME | 2007-10-15 |
| KDE CE | Cassandra 3.0 | Kubuntu 7.10 | KDE | 2008-03-03 |
| 5 | **Elyssa** | Main | Daryna 4.0 | Ubuntu 8.04 | GNOME | 2008-06-08 |
| Light | Daryna 4.0 | Ubuntu 8.04 | GNOME | 2008-06-08 |
| x64 | Ubuntu 8.04 | Ubuntu 8.04 | GNOME | 2008-10-18 |
| KDE CE | Daryna 4.0 | Kubuntu 8.04 | KDE | 2008-09-15 |
| Xfce CE | Daryna 4.0 | Xubuntu 8.04 | Xfce | 2008-09-08 |
| Fluxbox CE | Ubuntu 8.04 | Ubuntu 8.04 | Fluxbox | 2008-10-21 |
| 6 | **Felicia** | Main | Ubuntu 8.10 | Ubuntu 8.10 | GNOME | 2008-12-15 |
| Universal (Light) | Ubuntu 8.10 | Ubuntu 8.10 | GNOME | 2008-12-15 |
| x64 | Ubuntu 8.10 | Ubuntu 8.10 | GNOME | 2009-02-06 |
| KDE CE | Elyssa 5 | Kubuntu 8.10 | KDE | 2009-04-08 |
| Xfce CE | Xubuntu 8.10 | Xubuntu 8.10 | Xfce | 2009-02-24 |
| Fluxbox CE | Xubuntu 8.10 | Ubuntu 8.10 | Fluxbox | 2009-04-07 |
| 7 | **Gloria** | Main | Ubuntu 9.04 | Ubuntu 9.04 | GNOME | 2009-05-26 |
| Universal (Light) | Ubuntu 9.04 | Ubuntu 9.04 | GNOME | 2009-05-26 |
| x64 | Ubuntu 9.04 | Ubuntu 9.04 | GNOME | 2009-06-24 |
| KDE CE | Kubuntu 9.04 | Kubuntu 9.04 | KDE | 2009-08-03 |
| Xfce CE | Xubuntu 9.04 | Xubuntu 9.04 | Xfce | 2009-09-13 |
| 8 | **Helena** | Main | Ubuntu 9.10 | Ubuntu 9.10 | GNOME | 2009-11-28 |
| Universal (Light) | Ubuntu 9.10 | Ubuntu 9.10 | GNOME | 2009-11-28 |
| x64 | Ubuntu 9.10 | Ubuntu 9.10 | GNOME | 2009-12-14 |
| KDE | Kubuntu 9.10 | Kubuntu 9.10 | KDE | 2010-02-06 |
| KDE x64 | Kubuntu 9.10 | Kubuntu 9.10 | KDE | 2010-02-12 |
| Fluxbox CE | Helena Main | Ubuntu 9.10 | Fluxbox | 2010-02-12 |
| Xfce CE RC1 | Xubuntu 9.10 | Xubuntu 9.10 | Xfce | 2010-03-07 |
| LXDE CE RC1 | Helena Main | Ubuntu 9.10 | LXDE | 2010-03-15 |
| 9 | **Isadora** | Main | Ubuntu 10.04 | Ubuntu 10.04 | GNOME | 2010-05-18 |
| KDE | Ubuntu 10.04 | Ubuntu 10.04 | KDE | 2010-05-18 |
| 10 | **Julia** | Main | Ubuntu 10.10 | Ubuntu 10.10 | GNOME | 2010-11-18 |
| KDE | Ubuntu 10.10 | Ubuntu 10.10 | KDE | 2010-11-18 |
| Xfce | Xubuntu 10.10 | Xubuntu 10.10 | Xfce |  |
| LXDE | Ubuntu 10.10 | Ubuntu 10.10 | LXDE | 2011-03-16 |
| 11 | **Katya** | Main | Ubuntu 11.04 | Ubuntu 11.04 | GNOME | 2011-05-26 |
| 12 | **Lisa** | Main | Ubuntu 11.10 | Ubuntu 11.10 | GNOME | 2011-11-26 |
| KDE | Ubuntu 11.10 | Ubuntu 11.10 | KDE | 2011-12-03 |
| LXDE | Lubuntu 11.10 | Lubuntu 11.10 | LXDE | 2012-03-09 |
| 13 | **Maya** | MATE 1.2 | GNOME 2 | GNOME 2 | GNOME | 2012-05-23 |
| Cinnamon 1.4 | GNOME 3 | GNOME 3 | GNOME | 2012-05-23 |
| MDM | GDM 2.20 | GDM 2.20 | GDM | 2012-05-23 |
| 14 | **Nadia** | MATE 1.4 | GNOME 2 | GNOME 2 | GNOME | 2012-11-20 |
| Cinnamon 1.6 | GNOME 3 | GNOME 3 | GNOME | 2012-11-20 |
| MDM | GDM 2.20 | GDM 2.20 | GDM | 2012-11-20 |
| 15 | **Olivia** | MATE 1.6 | GNOME 2 | GNOME 2 | GNOME | 2013-05-29 |
| Cinnamon 1.8 | GNOME 3 | GNOME 3 | GNOME | 2013-05-29 |
| MDM 1.2 | GDM 2.20 | GDM 2.20 | GDM | 2013-05-29 |
| 16 | **Petra** | MATE 1.6 | GNOME 2 | GNOME 2 | GNOME | 2013-11-30 |
| Cinnamon 2.0 | GNOME 3 | GNOME 3 | GNOME | 2013-11-30 |
| MDM 1.4 | GDM 2.20 | GDM 2.20 | GDM | 2013-11-30 |
| 17 | **Qiana** | MATE 1.8 | GNOME 2 |  ? |  ? | 2014-05-31 |
| Cinnamon 2.2 | GNOME 3 |  ? |  ? | 2014-05-31 |
| KDE |  ? |  ? |  ? | 2014-05-31 |
| xfce |  ? |  ? |  ? | 2014-05-31 |
| 17.1 | **Rebecca** | MATE 1.8 | GNOME 2 |  ? |  ? | 2014-11-29 |
| Cinnamon 2.4 | GNOME 3 |  ? |  ? | 2014-11-29 |
| KDE | Ubuntu 14.04 |  ? |  ? | 2015-01-08 |
| xfce | Ubuntu 14.04 |  ? |  ? | 2015-01-11 |
| 17.2 | **Rafaela** |  |  |  |  | 2015-08-04  |
| 17.3 | ****Rosa**** |  |  |  |  | 2016-01-06  |
| 18.0 | **Sarah** |  |  |  |  | 2016-09-07  |
| 18.1 | **Serena** |  |  |  |  | 2017-01-25  |
| 18.2 | **Sonya** |  |  |  |  | 2017-07-02 |
| 18.3 | **Sylvia** |  |  |  |  | 2017-11-27 |

注：部分资料来自维基百科。


戴文的Linux内核专题：26 配置内核 (22)

# 戴文的Linux内核专题：26 配置内核 (22)

<img src="content_image/album_201406_26_230940l4l4t10acs4cir4i.jpg" alt="" title="">

你好！本篇我们将继续配置"kernel hacks",接着我们会配置整个安全系统。

Alpha和s390处理器需要配置下一个特性(Force weak per-cpu definitions)。这个特性修复了一个在这类处理器中普遍存在的寻址问题。其他的处理器无需启用这个特性。

内核转储可以用这个特殊的调试工具测试(Linux Kernel Dump Test Tool Module)。这个软件会允许内核开发者触发一个假错误来导致内核转储。内核开发者可以保证转储成功执行。

内核提供了不同的错误注射模块来允许内核开发者测试通知(CPU notifier error injection module)、 (PM notifier error injection module) 和 (Memory hotplug notifier error injection module)。通知器提醒系统硬件还在，这对热插拔很重要。这些错误注射模块在这些通知系统中触发一个错误，那么开发者就可以测试通知系统的错误处理能力了。

"Fault-injection framework"驱动提供了不同的用于测试错误处理的工具。

"Latency measuring infrastructure"驱动提供了延迟检测工具LatencyTop，以找出用户空间中由于内核执行/任务而被阻碍/干扰的对象。

下面，我们有一个子菜单名为"Tracers"，它包含了不同追踪器的列表。追踪器是一段监视不同内核函数的代码。每次某个特定的函数启动，追踪器将被调用来检测函数。

下面的模块用来测试红黑树库的性能(Red-Black tree test)。红黑树是一个排序和搜索算法。

下面的特性是相同的除了用来测试区间树库(Interval tree test)。

在启动远程特定系统时，内核同样可以在其他系统上调试FireWire (Remote debugging over FireWire early on boot) 和 (Remote debugging over FireWire with firewire-ohci)。

printk()函数可以用来打印不同的调试信息，如果这个特性启用的话(Enable dynamic printk() support)。"printk()"是一个常被讨论的系统调用，所以记住这个打印内核相关消息。

这是一个直接内存访问(DMA)调试驱动(Enable debugging of DMA-API usage)。

Atomic64自我测试检查系统是否支持原子操作(Perform an atomic64\_t self-test at boot)。这是一个32位系统执行64位操作。

这个驱动提供了对于所有可能的RAID6恢复系统的自检(Self test for hardware accelerated raid6 recovery)。

注意：自检是底层测试并且在绝大多数系统硬件和软件开启和执行前侦查软件。自检搜索硬件，失败的设备等等。自检也可能被编成应用以测试它本身。

在"Kernel Hacking"菜单中(如果你是用的是像ncurses那样的菜单接口)，有一个名为"Sample kernel code"的子菜单。在以后的文章中，我们会讨论如何实现自定义/自制内核模块。只要记住这里是启用你自己的模块。

Kernel GNU DeBugger (KGDB)(内核调试器)有许多特性可以启用或者禁用(KGDB: kernel debugger)。这个调试器只工作在通过串行连接的两个Linux系统之间。

这个特性提供在启动时显示额外bzimage解压消息(Enable verbose x86 bootup info messages)。在内核配置的开始部分你设置了内核加密。

printk()打印不同的消息到dmsg的启动界面，但是在串行和控制台驱动加载后。启用这个驱动会使printk()更早打印信息(Early printk)。

下一个驱动和上面的一样，但是使用EHCI端口(Early printk via EHCI debug port)。

内核可以被设置来观察堆栈溢出，这样内核可以更好地管理错误(Check for stack overflows)。内核会执行的更慢，但是溢出不会造成如此大的损害。

通过启用这个，内核页面可用debugfs见到(Export kernel pagetable layout to userspace via debugfs)。然而，这个会使内核变慢。这个用于调试目的。

内核的写入错误可以被这个特性捕捉到(Write protect kernel read-only data structures)。这个选项会使内核的只读数据编程进入写保护模式。此调试工具会损害内核的速度。该调试工具还有一个用来调试其自身的工具(Testcase for the DEBUG\_RODATA feature)。

为了防止被修改过代码的模块执行(由于一个错误)，接着启用这个保护性特性 (Set loadable kernel module data as NX and text as RO)。这个调试工具由这个驱动提供(Testcase for the NX non-executable stack feature)。

使用这个选项，内核可以一次刷新一个TLB条目或者整张表 (Set upper limit of TLB entries to flush one-by-one)。

下一个特性是IOMMU调试特性(Enable IOMMU debugging)。这是另外一个调试测试，禁用一些IOMMU特性来用于测试稳定性(Enable IOMMU stress-test mode)。IOMMU代表"input/output memory management unit"(输入/输出内存管理单元)。

启用这个选项回事内核以30s的间隔在change*page*attr()系统调用上执行单端测试。这个系统调用会改变页的属性。

任何被标以"inline"的内核代码，如果没有被表明的也同样会被GCC操作(Allow gcc to uninline functions marked)。GCC编译器会增加使得代码更好的代码(GCC擅长这么做)。然而，一些代码不想被GCC操作。

下面的驱动提供了对"copy*from*user()"系统调用的基本测试（Strict copy size checks)。copy*fcrom*user()从用户空间拷贝数据块到内核空间中。

这里还有一个自检；它用于NMI(NMI Selftest)。

现在，我们会进入"Security Options"，如果你使用像ncurses的基于菜单的接口时。第一个选项允许访问内核中存储的键和验证令牌(Enable access key retention support)。这有很多原因用到，像访问加密文件系统。

下面的选项用于创建并密封/开启键((TRUSTED KEYS))。加密的键使用这个驱动加密/解密(ENCRYPTED KEYS)。

启用这个特性键可以在/proc中看到(Enable the /proc/keys file by which keys may be viewed)。

使用这个安全特性，额外的限制可以应用到syslog中(Restrict unprivileged access to the kernel syslog)。

如果启用这个选项，那么用户可以选择不同的安全模块(Enable different security models)。不然，将会使用默认。如果你不完全理解安全或者如果你对使用默认感到没问题，那么就禁用它。

这个驱动提供了securityfs文件系统(Enable the securityfs filesystem)。

当启用这个特性后，钩子将会被增加到网络和套接字安全中(Socket and Networking Security Hooks)。这些钩子是访问控制。

IPSec网络钩子(also called XFRM networking hooks)在这个选项启用后实现(XFRM (IPSec) Networking Security Hooks)。安全钩子同样可被文件使用(Security hooks for pathname based access control)。

下一个驱动提供了对Intel可信赖执行技术的支持(Enable Intel(R) Trusted Execution Technology (Intel(R) TXT))。

用户可以设置无法为用户空间保留的内存寻址范围(Low address space for LSM to protect from user allocation)。开始点是0。用户在此选项中输入结束点。对于大多数平台而言，65536是一个建议值。

SELinux(在内核安全的文章中提到)是一种流行的Linux安全模块(NSA SELinux Support)。SELinux存在很多选项和特性。启动参数决定了当内核执行(NSA SELinux boot parameter)时SELinux是否启动{1}或者不启动{0}。SELinux可以被配置成在root用户需要时临时禁止(NSA SELinux runtime disable)。用户可以启用这个特性开发并测试新的策略(NSA SELinux Development Support)。AVC统计被这个特性收集并被存储 (NSA SELinux AVC Statistics)。对于checkreqprot标志有一个默认设置；"1"意味着SElinux会检查应用请求的保护，"0"会默认使用内核对mmap和mprotect系统调用的保护(NSA SELinux checkreqprot default value)。存在很多的SElinux策略;用户可以设置他们不希望SELinux excede的最新版本(NSA SELinux maximum supported policy format version)。

另外一个Linux安全模块(LSM),SMACK,也被内核支持(Simplified Mandatory Access Control Kernel Support)。

TOMOYO是另外一个被支持的LSM(TOMOYO Linux Support)。在学习模式中允许被添加的最大条目数目在下面的特性中设置(Default maximal count for audit log)。接下来，这个选项允许/禁用TOMOYO在没有策略加载器下被激活(Activate without calling userspace policy loader)。策略加载器的位置在这里被配置((/sbin/tomoyo-init) Location of userspace policy loader)，触发执行的可执行文件在这里设置((/sbin/init) Trigger for calling userspace policy loader)。

再说一次，内核支持另外一个LSM - APPArmor(AppArmor support)。像SELinux一样，可以为AppArmor设置默认的启动参数(AppArmor boot parameter default value)。

Yama是另外一个LSM(Yama support)。如果启用这个特性Yama可以与另外一个LSM一起使用(Yama stacked with other LSMs)。

这个驱动让内核可以使用多个密钥链来验证进程(Digital signature verification using multiple keyrings)。

非对称键在这个特性中支持(Enable asymmetric keys support)。

内核可以保存并维护一个哈希和重要系统文件的列表(Integrity Measurement Architecture(IMA))。那么，如果恶意软件改变了一个重要的文件，内核会知道因为文件或者可执行文件被使用时内核会检测哈希值。强烈建议启用这个特性。

如果启用这个特性会加入额外的安全属性(EVM support)。可以用下面的选项设置版本(EVM HMAC version)。有两个选项分别是version 1和2。

记住所有的Linux安全模块的不同了么(LSMs)？好的，下面可以设置默认模块(Default security module (AppArmor))。

下一篇中，我们会配置"Cryptographic API"。我估计还会剩下两篇文章。在这之后，我们会讨论其他的内核主题。

先睹为快：本篇之后，关于配置还有一篇。接着，我们会完成编译并安装内核。

致我的粉丝：你随意给我致信或者给我电子邮件来建议你希望在以后的内核文章中想要看到的主题。我已经收到了一些来自这个系列读者的一些建议。请随意给我更多建议。

---

via: <http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-22.5017/>

译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Summary: Nuvola Player是一个开源的播放器，可以在其web界面中运行像Amazon云播放器，Bandcamp，Deezer，8tracks，Google Play音乐，Grooveshark，Hyper Machine以及Pandora等等云音乐服务，同时它也能整合到Linux桌面中。 该应用程序以插件的形式提供了大量的功能特性，像桌面通知、系统托盘、多媒体键、媒体播放器小程序、停靠栏菜单、歌词、last.fm等等。 2014年5月31日，Nuvola Player 2.4.0的一个新版本发布了  它带来了一些新的特性，包括两个新的服务Logitech Media Server和This is My Jam ，以及众多的bug修复。 这个发布中有什么新东西

好像用过以前的版本，最近很有冲动彻底换到linux去，主要因为最近也不玩游戏了

我感觉还是没有酷我的好用，kwplayer for linux

能不能让大家认可,主要得看平台,如果单单在linux下才能运行,也很难让人接受,至少在,WIN MAC IOS ANDROID下得有客户端吧,另外就是音乐库,音乐库里没有歌曲,或者歌曲音质不行,也难推广

# Linux下的在线云音乐播放器 —— Nuvola Player 2.4.0发布

**Nuvola Player**是一个开源的播放器，可以在其web界面中运行像Amazon云播放器，Bandcamp，Deezer，8tracks，Google Play音乐，Grooveshark，Hyper Machine以及Pandora等等云音乐服务，同时它也能整合到Linux桌面中。

该应用程序以插件的形式提供了大量的功能特性，像桌面通知、系统托盘、多媒体键、媒体播放器小程序、停靠栏菜单、歌词、last.fm等等。

**2014年5月31日**，**Nuvola Player 2.4.0**的一个新版本发布了 —— 它带来了一些新的特性，包括两个新的服务“Logitech Media Server”和“This is My Jam ”，以及众多的bug修复。

### 这个发布中有什么新东西

* 删除了破损的隐藏Google+按钮选项，因为Google修改代码过于频繁了。
* 加快了服务设置的启用速度，不需要再重新加载。
* 修复了暂停和播放/暂停动作开关。
* 为Chrome添加了兼容问题警告桌面通知。
* 提供了页面内导航按钮（现在用户可以在Google Play标识旁边的顶部栏中找到它）。
* 添加了“Logitech Media Server”和“This is My Jam ”服务。
* 包含了对鼠标后退/前进按钮的支持。
* 修复了对GNOME锁屏通知的支持。

要查看完整的特性列表，请访问官方发行[声明页面](http://nuvolaplayer.fenryxo.cz/releases/2.4.html)

在Debian, Ubuntu和Linux Mint中安装Nuvola Player
------------------------------------------

官方的Nuvola Player仓库中包含了**Ubuntu 14.04, 13.10, 12.10, 12.04**以及**Linux Mint 17, 16, 15, 14.**可用的二进制包，你可以通过添加Nuvola Player仓库到你的系统中来安装二进制包‘nuvolaplayer’。

### 在Ubuntu和Linux Mint上

打开终端并运行以下一系列命令：

```
$ sudo add-apt-repository ppa:nuvola-player-builders/stable
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install nuvolaplayer

```

**注**：请不要忽略系统更新命令‘sudo apt-get upgrade’，否则你的apt-get安装Flash插件可能会失败。

如果你不需要Nuvola Player支持Flash插件，你可以忽略系统升级命令，并使用以下命令来安装不带Flash支持得nuvolaplayer。

```
$ sudo apt-get --no-install-recommends install nuvolaplayer

```

### 在Debian上

对于**Debian Wheezy**和**Debian Sid**，可以从官方仓库中获取稳定的Nuvola Player二进制包。你可以使用下面这一堆命令来安装最新的稳定版。

首先，打开终端并导入公钥，然后添加仓库到‘**sources.list**‘文件，接着像下面这样进行一次系统更新来安装nuvolaplayer。

#### Debian Wheezy

```
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 706C220A
$ sudo sh -c 'echo "deb http://ppa.fenryxo.cz/nuvola-player/ wheezy main" >> /etc/apt/sources.list'
$ sudo sh -c 'echo "deb-src http://ppa.fenryxo.cz/nuvola-player/ wheezy main" >> /etc/apt/sources.list'
$ sudo apt-get update
$ sudo apt-get install nuvolaplayer

```

#### Debian Sid

```
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 706C220A
$ sudo sh -c 'echo "deb http://ppa.fenryxo.cz/nuvola-player/ sid main" >> /etc/apt/sources.list'
$ sudo sh -c 'echo "deb-src http://ppa.fenryxo.cz/nuvola-player/ sid main" >> /etc/apt/sources.list'
$ sudo apt-get update
$ sudo apt-get install nuvolaplayer

```

**注**：Nuvola Player依赖于打包的Flash插件，而该插件会因为存在库文件冲突（**GTK+ 2和**GTK+ 3\*\*）而默认不会安装。

要解决该问题，我们需要启用flash**PPA**组件来安装‘**nuvolaplayer-flashplugin**‘包，命令如下。

```
$ sudo sh -c 'echo "deb http://ppa.fenryxo.cz/nuvola-player/ sid main beta flash" >> /etc/apt/sources.list'
$ sudo sh -c 'echo "deb-src http://ppa.fenryxo.cz/nuvola-player/ sid main beta flash" >> /etc/apt/sources.list'
$ apt-get update
$ apt-get install nuvolaplayer-flashplugin

```

一旦完成安装，你可以在**菜单**中找到该应用并启动它。记住，想要听音乐，你必须连接到互联网。

### Nuvola Player美图欣赏

 选择音乐服务

 Grooveshark音乐服务

 Grooveshark播放音乐

 Nuvola Player首选项

 Google Play音乐

 Rdio音乐服务

 关于Nuvola Player

对于其它Linux发行版，你可以从 Nuvola Player[启动板下载](https://launchpad.net/nuvola-player/+download)页下载源码tarball。

---

via: <http://www.tecmint.com/install-nuvola-player-in-linux/>

译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


如何使用ffmpeg从视频中提取图片

Summary: 你曾想过从一个视频文件中提取图片吗？在Linux下就可以，在这个教程中我将使用ffmpeg来从视频中获取图片。  什么是ffmpeg？What is ffmpeg? ffmpeg是一个非常有用的命令行程序，它可以用来转码媒体文件。它是领先的多媒体框架FFmpeg的一部分，其有很多功能，比如解码、编码、转码、混流、分离、转化为流、过滤以及播放几乎所有的由人和机器创建的媒体文件。 在这个框架中包含有各种工具，每一个用于完成特定的功能。例如，ffserver能够将多媒体文件转化为用于实时广播的流，ffprobe用于分析多媒体流，ffplay可以当作一个简易的媒体播放器

@mywiz

Repost

我只是接触过

Mark

博主，如何利用ffmpeg分析手机上的视频，保留图片及视频的方向信息。手机上的时候都是横着的，因为文件信息

# 如何使用ffmpeg从视频中提取图片

你曾想过从一个视频文件中提取图片吗？在Linux下就可以，在这个教程中我将使用ffmpeg来从视频中获取图片。

<img src="content_image/album_201406_26_234008x5bi50xw4tceb05r.jpg" alt="" title="">

### 什么是ffmpeg？What is ffmpeg?

ffmpeg是一个非常有用的命令行程序，它可以用来转码媒体文件。它是领先的多媒体框架FFmpeg的一部分，其有很多功能，比如解码、编码、转码、混流、分离、转化为流、过滤以及播放几乎所有的由人和机器创建的媒体文件。

在这个框架中包含有各种工具，每一个用于完成特定的功能。例如，ffserver能够将多媒体文件转化为用于实时广播的流，ffprobe用于分析多媒体流，ffplay可以当作一个简易的媒体播放器，**ffmpeg**则能够转换多媒体文件格式。

如果你感兴趣，以下列出的是FFmpeg框架中包含的开发者库：

* libavutil是一个包含简化编程功能的库，其中包括随机数生成器，数据结构，数学代码，核心多媒体工具等更多东西。
* libavcodec是一个包含音频/视频解码器和编码器的库。
* libavformat是一个包含了多媒体格式的分离器和混流器的库。
* libavdevice是一个包含输入输出设备的库，用于捕捉和渲染很多来自常用的多媒体输入/输出软件框架的数据，包括Video4Linux，Video4Linux2，VfW和ALSA。
* libavfilter是一个包含媒体过滤器的库。
* libswscale是一个用于执行高度优化的图像缩放和颜色空间/像素格式转换操作的库。
* libswresample是一个用于执行高度优化的音频重采样，重新矩阵和取样格式转换操作的库。

**注意**：ffmpeg和FFmpeg不是同一个东西。FFmpeg是框架，而ffmpeg是一个其中的一个功能。

### 开始行动

如果你想跟着教程做，你需要在你的linux机中安装ffmpeg命令行功能。Ubuntu用户可以在终端运行以下命令轻松安装ffmpeg功能。

```
sudo apt-get install ffmpeg

```

Fedora用户可以从源中直接安装ffmpeg。

```
yum install ffmpeg

```

或者你可以编译源代码。在你使用源代码编译并安装它之前，你需要从官网上下载源代码，使用以下命令。

```
wget http://www.ffmpeg.org/releases/ffmpeg-2.2.3.tar.bz2

```

用下面命令解压文档。

```
tar -xvjf ffmpeg-2.2.3.tar.bz2

```

文档解压完成后进入解压后的目录运行以下命令。

```
./configure
make

```

编译完成后运行下面的命令安装ffmpeg。

```
su -c 'make install'

```

全部的事情并没有完成，而你将要做的所有事就是在终端键入一些命令而且将能够从任何视频文件中抓取图片。

在做之后的步骤前，确保你在想要提取图片的视频文件的目录下。使用cd命令切换到正确的目录。教程中我使用的视频在我的桌面上，我用以下命令将目录切换到我的桌面。

```
cd /home/oltjano/Desktop

```

之后我使用以下命令从视频中提取图片。

```
ffmpeg -i "你是我的小呀小苹果儿.mp4" -r 1 -q:v 2 -f image2 image-3%d.jpeg

```

**-i**选项用来获取输入文件，在这里是视频文件名**你是我的小呀小苹果儿.mp4**，-r选项设置每秒提取图片的帧数。我想要每秒提取一帧。

之后有一个重要的选项是-q:v，应该留意这个选项并且我很喜欢用它，它用来设置提取到的图片质量。我总是设置值为2来从视频中获取高质量图片。

---

via: <http://www.unixmen.com/extract-images-videos-using-ffmpeg/>

译者：[linuhap](https://github.com/linuhap) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


开源LDAP解决方案

mark

# 开源LDAP解决方案

LDAP（轻量级目录访问协议）是一个用于访问目录服务的应用协议，它运行在TCP/IP堆栈的上一层，采用简单的编码方法，并提供了便捷的方式来连接到互联网目录，特别是基于X.500的目录服务，并对它们进行搜索和修改。LDAP是一个开放的、中立的，并且具有工业标准的应用协议，它采用客户端-服务器模式。

该协议主要针对管理应用程序和提供对目录读/写操作的浏览器应用程序。

使用LDAP服务器的主要好处在于，整个组织的信息可以合并到一个中央仓库统一管理。LDAP支持安全套接协议层（SSL）和传输层安全协议（TLS），因而敏感信息可以受到保护。LDAP服务器用于多种任务，包括但不限于这些服务：用户认证、机器认证、用户/系统分组、资源追踪、组织演示以及应用配置存储。

为了提供对可用开源软件质量的深刻了解，我们列出了5个高品质的LDAP解决方案。

<img src="content_image/album_201406_26_234816j4d7q4552c7rprdy.jpg" alt="" title="">

现在，让我们浏览手头上的5个LDAP解决方案吧。每个标题，我们都提供了连接页面，里面有对其功能特性的深度分析，同时提供了相关资源和评论的链接。

### LDAP解决方案

* [389目录服务器](http://port389.org/) - 企业级开源LDAP服务器
* [OpenDJ](http://opendj.forgerock.org/) - API经济的云目录服务
* [OpenLDAP](http://www.openldap.org/) - 应用程序和开发工具的LDAP套件
* [freeIPA](http://www.freeipa.org/) - 身份/策略管理
* [ApacheDS](http://directory.apache.org/apacheds/) - 编写的LDAP和Kerberos服务器

---

via: <http://www.linuxlinks.com/article/20140607022012848/LDAPSolutions.html>

译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


《编写高质量代码：改善Python程序的91个建议》点评赠书

Summary:
从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化方面探讨编写高质量Python代码的技巧、禁忌和最佳实践。
关注@Linux中国 @互动出版网china-pub 转发本微博并添加有效评论，即有机会获赠本书。

丰富和强大的类库，而且还可以和其他语言轻松地结合在一起，大爱phthon

大爱phthon

从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化8方面深入探讨编写高质量Python代码的技巧、禁忌和最佳实践

向linux方向发展，必须掌握一本脚本语言。近段时间读过《学习Python》，看了《编写高质量代码：改善Python程序的91个建议》的目录和试读章节，觉得这是本进阶的书，帮助我们尽快提升python的水平，很期待！

现在都是使用python在写脚本，但是有时候就是觉得自己的代码好乱，效率也不是很好。而且身边人都很少使用Python写比较复杂的脚本，需要指导。。。。

看起来相当不错

用任何语言都可以写出极其糟糕的代码，包括优雅强大的 Python 语言。编写高质量代码的第一步是，重新考量个人或团队开发软件的整个过程。在失败或陷入麻烦的软件开发项目中，常常按违反原则的方式开发软件，开发人员关注的重点是解决问题，无论采用什么方式。在成功的软件项目中，开发人员不但要考虑如何解决手中的问题，还要考虑解决问题涉及到的过程。成功的软件开发人员会按照便于自动化的方式运行测试，这样就可以不断地证明软件工作正常。他们明白不必要的复杂性的危害。他们严格地遵守自己的方法，在每个阶段都进行认真的复查，寻找重构的机会。他们经常思考如何确保其软件是可测试、可读且可维护的。尽管 Python 语言的设计者和 Python 社区都非常重视编写干净、可维护的代码，但是仍然很容易出现相反的局面。而本书正是探讨这个问题，讨论如何用 Python 编写高质量的代码。

目前正在学习python！看了看，蛮不错的！

这本好

很好的一本书，处处可见作者心血的结晶，扎实的知识点，朴素的讲述，我收益匪浅。这本书可用作工作之余从另外一个角度提升自己技能水平的一本好书。O(∩_∩)O~

看链接的ch01.pdf以为是指书的第一章，一般就讲讲概况之类， 下载下来看了才发现是其中的章节， 并且仅仅几页也是干货满满的样子。

自己拿Python写过一些脚本， 一般都是临时用来解决一些问题，但是却感觉总是深入不了。 看了这本书的样章之后想起了《编程珠玑》这本书， 因为作者是一直使用Python工作在第一线，总结出来的东西都可谓是Python编程的best practice。这些经验， 一是体现在了样章前半部分的编程技巧和注意事项方面，Python可能过于灵活了，各种方法和函数对入门者来说又容易混淆，作者的总结无疑会让刚入门的人少走不少弯路； 二是体现在了对Python第三方库的掌握上，虽然Python能用各种方式解决一个问题，如果基于标准库去实现的话也许会非常繁琐， 但是能有优秀的第三方库支持则会轻松好多，作者建议的有几个库没听说过，有种眼前一亮的感觉。

这是我看了样章的感想，建议初学者先看了入门书后再用《编写高质量代码：改善Python程序的91个建议》来进一步深入了解Python语言，一定会事半功倍。

# 《编写高质量代码：改善Python程序的91个建议》点评赠书

从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化方面探讨编写高质量Python代码的技巧、禁忌和最佳实践。

关注[@Linux中国](http://weibo.com/linuxcn) [@互动出版网china-pub](http://weibo.com/chinapub2011) 转发本微博并添加有效评论，即有机会获赠本书。

<img src="content_image/album_201406_27_094025zb12pa20p0ywk1m2.jpg" alt="" title="">

**活动内容**
--------

活动时间：2014年6月27日-7月8日

活动要求：

**活动形式一** ：在新浪微博关注[@Linux中国](http://weibo.com/linuxcn) [@互动出版网china-pub](http://weibo.com/chinapub2011) 转发本微博并添加有效评论。
**活动形式二：**在Linux中国（[http://linux.cn](http://linux.cn/)）对本书进行评论，说说你喜爱它的理由。

活动奖品：活动结束后，我们会评选出2位积极参与评论的网友赠送《编写高质量代码：改善Python程序的91个建议》图书1本，3位获得@互动出版网china-pub 赠送的30元互动出版网购书卡1张

**特此注意：1、本站论坛评论方式参与的用户，评论前需登录您的Linux中国账号，匿名评论无效。**

 **2、微博用户参与活动，活动结束后注意查看[@LINUX中国](http://linux.cn/home.php?mod=space&uid=16101) 官方微博公布的中奖名单或留意您的微博私信，本站用户参与活动，注意查看您注册Linux中国时所填写的邮箱。 我们会通过微博私信以及电子邮件两种方式获取您的邮寄信息。**

### 基本信息

作者： 张颖 赖勇浩

出版社：机械工业出版社

上架时间：2014-6-13

出版日期：2014 年6月

开本：16开

页码：262

版次：1-1

**试读章节：**<http://images.china-pub.com/ebook3770001-3775000/3770256/ch01.pdf>

**购买链接：**<http://product.china-pub.com/3770256>

### 内容简介

 在通往“python技术殿堂”的路上，本书将为你编写健壮、优雅、高质量的python代码提供切实帮助！内容全部由python编码的最佳实践组成，从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化8个方面深入探讨了编写高质量python代码的技巧与禁忌，一共总结出91条宝贵的建议。每条建议对应python程序员可能会遇到的一个问题。本书不仅以建议的方式从正反两方面给出了被实践证明为十分优秀的解决方案或非常糟糕的解决方案，而且分析了问题产生的根源，会使人有一种醍醐灌顶的感觉，豁然开朗。
《编写高质量代码：改善python程序的91个建议》针对每个问题所选择的应用场景都非常典型，给出的建议也都与实践紧密结合。书中的每一条建议都可能在你的下一行代码、下一个应用或下一个项目中显露锋芒。建议你将本书搁置在手边，随时查阅，相信这么做一定能使你的学习和开发工作事半功倍。

### 作者简介

 张颖，资深软件开发工程师，精通Java、Python、Perl等技术，以及多种脚本语言，有多年开发经验。曾就职于阿尔卡特朗讯上海公司的LTE无线事业部，现就职于IBM CSTL，工作期间获得过多种奖励，并于2012年获得一项云计算相关的专利。

 赖勇浩，资深软件开发工程师，自2006年起以编写Python代码为生，现已创业。在Python领域有深厚的积累，CSDN博客专家，博客浏览量超过200万。也是珠三角技术沙龙创始人之一，从2009年起担任沙龙组委，长年活跃在社区第一线，在国内Python圈子里有较高的知名度和影响力。有超过7年的游戏开发经验，擅长Python、C++等网游相关的技术，曾就职于网易等网游研发厂商；现专注于中国彩票事业，开发互联网、电话和自助终端彩票销售平台，以促进行业信息化为己任。

### 精彩书摘

第1章
　　引论
　　“罗马不是一天建成的”，编写代码水平的提升也不可能一蹴而就，通过一点一滴的积累，才能达成从量变到质变的飞跃。这种积累可以从很多方面取得，如一些语言层面的使用技巧、常见的注意事项、编程风格等。本章主要探讨Python中常见的编程准则，从而帮助读者进一步理解Pythonic的本质。本章内容包括如何编写Pythonic代码、在实际应用中需要注意的一些事项和值得提倡的一些做法。希望读者通过对本章的学习，可以在实际应用Pythonic的过程中得到启发和帮助。
　　建议1：理解Pythonic概念
　　什么是Pythonic？这是很难定义的，这就是为什么大家无法通过搜索引擎找到准确答案的原因。但很难定义的概念绝非意味着其定义没有价值，尤其不能否定它对编写优美的Python代码的指导作用。
　　对于Pythonic的概念，众人各有自己的看法，但大家心目之中都认同一个更具体的指南，那就是Tim Peters的《The Zen of Python》（Python之禅）。在这一充满着禅意的诗篇中，有几点非常深入人心：
　　美胜丑，显胜隐，简胜杂，杂胜乱，平胜陡，疏胜密。
　　找到简单问题的一个方法，最好是唯一的方法（正确的解决之道）。
　　难以解释的实现，源自不好的主意；如有非常棒的主意，它的实现肯定易于解释。
　　不仅这几点，其实《Python之禅》中的每一句都可作为编程的信条。是的，不仅是作为编写Python代码的信条，以它为信条编写出的其他语言的代码也会非常漂亮。


10款专为嵌入式系统打造的Linux平台

Summary: Linux 有着广泛的用途。该平台用于很多家庭的简单使用，同时它也深受程序员和黑客们的青睐。此外，Linux 还广泛地应用在嵌入式系统中，有一系列专门适用于此类系统的发行版。我们将为大家推荐十个非常优秀的专为嵌入式系统发行的linux版本！  1.Ampro 嵌入式 Linux 这是一个自由和开放源代码的从Ubuntu精简来的轻量级操作系统。 2. BlueCat Linux from Lynx 这个基于 Linux 的发行版是Lynx套件的一部分，并为嵌入式系统打造。 3. CacheGuard OS CacheGuard OS 是一个从零开始建立的集成了安全解决方案的基于Linux的版本，专门为网络管理设

留存

会有用的。

get it

我大android呢

# 10款专为嵌入式系统打造的Linux平台

Linux 有着广泛的用途。该平台用于很多家庭的简单使用，同时它也深受程序员和黑客们的青睐。此外，Linux 还广泛地应用在嵌入式系统中，有一系列专门适用于此类系统的发行版。我们将为大家推荐十个非常优秀的专为嵌入式系统发行的linux版本！

<img src="content_image/album_201406_27_125017s1eyy2123hkah9ay.jpeg" alt="" title="">

### 1.[Ampro 嵌入式 Linux](http://www.ampro.com/company/News/04_08_08_Ampro_Reveals_Ubuntu_Embedded_Linux.htm)

这是一个自由和开放源代码的从Ubuntu精简来的轻量级操作系统。

### 2. [BlueCat Linux from Lynx](http://www.lynuxworks.com/embedded-linux/embedded-linux-virtualization.php)

这个基于 Linux 的发行版是Lynx套件的一部分，并为嵌入式系统打造。

### 3. [CacheGuard OS](http://www.cacheguard.com/cacheguard-os.html)

CacheGuard OS 是一个从零开始建立的集成了安全解决方案的基于Linux的版本，专门为网络管理设计的。

### 4. [Darma NAS OS](http://nas.darma.com/)

这个发行版有一个基于 SSL 的加密客户端的服务器和基于 Java 的图形用户界面。

### 5. [DIET-PC](http://www.dietpc.org/)

这是开源的瘦客户端软件 kitset，它允许用户建立网络应用。

### 6. [ELinOS](http://www.sysgo.com/products/elinos-embedded-linux/)

这个发行版为在嵌入式系统上工作的用户提供大量的技术。它是一个相当受欢迎的嵌入式 Linux 平台。

### 7. [eLux](http://www.myelux.com/index.htm?Unicon_Session=32bf53f198c94ba2ac2ce1ea45211754)

这个发行版有一个非常简单和容易使用的界面，适用于用户和管理员都不具有任何有关 Linux 的知识的特殊情况下。

### 8. [eLux NG](http://www.myelux.com/eluxng.htm)

这个发行版为支持 eLux 的处理器列表中添加了新的型号。

### 9. [Embedded Coyote Linux](http://www.myelux.com/eluxng.htm)

这种基于 Coyote Linux的防火墙和 VPN 服务器一直为很多人选择的平台。

### 10. [嵌入式 Debian 项目](http://www.emdebian.org/)

这个项目的目的是使 Debian GNU/Linux 成为嵌入式系统的第一选择。

---

via: <http://www.efytimes.com/e1/fullnews.asp?edid=137612>

译者：[owen-carter](https://github.com/owen-carter) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


戴文的Linux内核专题：16 配置内核 (12)

# 戴文的Linux内核专题：16 配置内核 (12)

<img src="content_image/album_201406_27_125303gilsxif9s88oroop.jpg" alt="" title="">

欢迎来享受Linux内核配置系列下一部分。如你所猜到的那样，内核支持大量不同的硬件、协议和特性。

下一组我们要讨论的特性是"EEPROM support"。电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory)是一种掉电或者意外关闭后不会擦除内容的存储器。

内核支持在I2C卡上的EEPROM芯片包括FRAMs、ROMs和SRAMs (I2C EEPROMs / RAMs / ROMs 来自多数供货商)。FRAM(同样也称作FeRAM是一种使用铁电原理而不是电介质存储数据的随机访问存储芯片)。ROM芯片是只读(Read Only Memory)芯片。SRAM是静态而不是动态存储器就像DRAM。DRAN必须被刷新以保留数据而SRAM不需要刷新。然而，两者都会在电源关闭或者丢失时失去数据。

内核支持SPI总线的EEPROM(SPI EEPROMs from most vendors)。串行外设接口总线(Serial Peripheral Interface Bus (SPI))是一个缺乏错误检测的全双工总线系统。

老式的I2C EEPROM芯片需要一个除了上面I2C驱动之外的驱动(Old I2C EEPROM reader)。I2C总线用于嵌入式系统和电话，由于它用的是低速总线协议。

这个特性用来防止Maxim的可编程EEPROM变成只读模式(Maxim MAX6874/5 power supply supervisor)。特别地，这驱动提供对这个芯片的更好的电源管理。

这里还有一个驱动"EEPROM 93CX6 support"，"Microwire EEPROM 93XX46 support"和"ENE CB710/720 Flash memory card reader support"。

和其他内核特性一样，这里有一个对于EEPROM的调试特性(Enable driver debugging)。再说一次，为了更好的性能，禁用调试特性。

下面，我们有一个TI特性(Shared transport core driver)。这个驱动提供对于BT/FM和GPS芯片的传输协议。

下面的驱动支持I2C LIS3LV02Dx加速度计(STMicroeletronics LIS3LV02Dx three-axis digital accelerometer (I2C))。设备提供的数据存储在/sys/devices/platform/lis3lv02d。

下一步， Linux提供了下载固件到Altera的FPGA的模块(Altera FPGA firmware download module)。FPGA就是现场可编辑逻辑门阵列(field-programmable gate array)。它们是可编程集成电路。

Intel Management Engine Interface提供Intel芯片的安全和其他服务。

"ME Enabled Intel Chipsets"可以支持MEI。MEI是"Management Engine Interface"(管理引擎接口)。这个驱动支持有MEI服务的芯片组。

"VMware VMCI Driver"是一种用于客户机和宿主机中继通信的高速虚拟设备。VMCI代表的是"Virtual Machine Communication Interface"(虚拟机通信接口)。

下面， "ATA/ATAPI/MFM/RLL support"可以启用/禁用。MFM (Modified Frequency Modulation)是一种特殊的编码软驱位的方法。然而，这并不工作在所有的软驱上。MFM使用RLL(Run-Length Limited)编码制式。RLL通过有带宽限制的系统通信转换数据。ATAPI是先前提过的"ATA Packet Interface"，同时ATA也在讨论接口标准的时候讨论过。

现在我们将讨论SCSI支持。小型计算机接口(Small Computer System Interface (SCSI))是另外一种SATA的接口标准。USB和火线设备使用SCSI协议。

第一个SCSI设定关于"RAID Transport Class"。这允许RAID使用SCSI标准。

为了使用SCSI目标，启用这个特性(SCSI target support)。

如果系统会运行旧的Linux应用，系统可能需要"legacy /proc/scsi/ support"。这会在/proc/scsi创建SCSI文件。

为了支持SCSI磁盘，启用下一个特性(SCSI disk support)。这是一个通用驱动。

为了支持SCSI磁带，启用这个特性(SCSI tape support)。这是一个通用驱动。SCSI磁带驱动器在像磁带的磁性条上记录数据。

OnStream SCSI磁带需要这个驱动而不是前面提到SCSI通用驱动SCSI OnStream SC-x0 tape support)。

"对于SCSI CDROM support"，一些CD-ROM使用SCSI协议。

下面， 用户可以启用"Enable vendor-specific extensions (for SCSI CDROM)"。

这是一个对于大量不同SCSI设备的通用驱动(SCSI generic support)。这主要用于SCSI扫描仪和其他不被上面提到的SCSI驱动支持的设备或者那些之后会讨论的设备。

一些SCSI点唱机需要这个SCSI驱动(SCSI media changer support)。

Linux内核提供"SCSI Enclosure Support"。SCSI附件是一种管理电源和制冷SCSI设备同时提供不关于数据的服务的设备。

Linux内核应该设置为每个SCSI设备搜索全部的逻辑单元号(Logical Unit Numbers (LUN))(Probe all LUNs on each SCSI device)。LUN是SCSI地址。

这有额外的对于SCSI的错误报告(Verbose SCSI error reporting (kernel size +=12K))。这会明显地增加内核的大小。

这里还有一个SCSI日志系统(SCSI logging facility)。

为了增强你的系统，启用这个特性会允许SCSI在系统启动时就被探测到而不是先启用再探测(Asynchronous SCSI scanning)。大多数系统可以一次执行这两个任务，因此为什么允许这项? 对于那些连接了很多SCSI设备的硬件，这个会明显加快启动速度。

下面，"Parallel SCSI (SPI) Transport Attributes"(传统的并行SCSI)允许每个SCSI设备发送传输信息给sysfs。一些系统需要这个特性。

下面的特性和上面提到的一样，但是发送光纤通道设备的传输信息(FiberChannel Transport Attributes)(光纤通道接口)。光线通道设备使用SCSI。

下面用户可以启用/禁用"SCSI target support for FiberChannel Transport Attributes"(为光纤通道添加"target"模式驱动)。

iSCSI设备和SAS设备的传输数据可以导出到sysfs(iSCSI Transport Attributes)和SAS Transport Attributes)。SAS代表的的是"Serial Attached SCSI"(串行链接SCSI)。

下面，ATA支持被加入libsas(ATA support for libsas (requires libata))。注意配置工具提示需要libata。为了满足这个需求，启用ATA支持。更多情况下，配置工具已经或者将会会你这么做，但是请无论再检查一下。libsas和libata是相应的支持SAS和ATA的库。

下面的特性允许SAS接口接收SMP帧(Support for SMP interpretation for SAS hosts)。这加入了一个SMP解释器到libsas中。然而，这不会增加内核的尺寸。SMP帧允许所有在多CPU系统上的处理器访问SAS设备。

SRP可以发送传输的数据给sysfs(SRP Transport Attributes)。SRP代表SCSI RDMA协议(SCSI RDMA Protocol)。RDMA代表远程直接内存访问(Remote Direct Memory Access)。这意味着SRP是一个用来访问连接到另外一台计算机的SCSI设备的数据的协议。

下一步，用户可以启用"SCSI target support for SRP Transport"。

可以启用底层SCSI驱动(SCSI low-level drivers)。这提供了很多基础驱动。

在这之后，用户可以启用/禁用"PCMCIA SCSI adapter support"。这个适配器允许SCSI设备连接到PC卡上。

这里有一些驱动用于特殊的适配器- (Future Domain PCMCIA support)、(Qlogic PCMCIA support) 、(Symbios 53c500 PCMCIA support)。

多路径安装的设备需要这个特性(SCSI Device Handlers)。这用在每个节点都需要一个到SCSI存储单元的直接路径的集群中。

下一步，"OSD-Initiator library"(OSD启动库)可以启用。这是一个提供了补丁、OSD协议、和针对SCSI设备的T10协议的SCSI驱动。 OSD代表的是基于对象的存储设备(Object-based Storage Device);下一段会讨论得更多。

这个特性生成一个SCSI上层用于测试和管理/dev/osdx设备(OSD Upper Level driver)。exofs使用这个驱动用于挂载基于OSD的文件系统。OSD设备不像其他存储单元一样使用块的存储设备。相反地，OSD设备存储数据在称之为对象的容器里。exofs曾经称作OSDFS。

如果启用了它，OSD特性提供了调试工具(Compile All OSD modules with lots of DEBUG prints)。

如今，我们可以讨论串行ATA和并行ATA特性和驱动了。首先启用/禁用用于调试的第一个特性(Verbose ATA error reporting)。

下一步，用户应该对于ATA设备启用高级配置及电源接口特性(ATA ACPI Support)。这允许内核在SATA设备上更有效地管理电源使用。

内核包含了对于"SATA Zero Power Optical Disc Drive (ZPODD) support"的驱动。这会在不使用时关闭SATA光盘驱动器(SATA optical disc drives (ODD))。这节约了能源以及减少损耗。

贴士：即使你在编译一个高性能的内核，尝试启用所有的电源管理特性。则减少了电源消耗、操作开销、热量产生(热量会降低性能)，以及老化。

SATA端口复用器需要这个驱动(SATA Port Multiplier support)。端口复用器是一个拥有许多端口但是自己仅需插入一个端口的设备。举例来说，如果一个硬件有一个SATA口，但是还需要更多的口，在这个口上插入端口复用器。现在设备可以有许多SATA口了。

下一个驱动用于AHCI SATA(AHCI SATA support)。高级主机控制器接口(Advanced Host Controller Interface (AHCI))是一种SATA总线适配器的操作标准。

对于要在Soc硬件上支持AHCI SATA设备，必须启用这个驱动(Platform AHCI SATA support)。Soc代表片上系统(System-on-a-Chip)。

下面是一些特殊设备的驱动

* Initio 162x SATA support
* ACard AHCI variant (ATP 8620)
* Silicon Image 3124/3132 SATA support

再说一次，等着下一篇精彩的文章。

---

via: <http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-12.4681/>

译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Numix图标主题张冠李戴，Fedora 20劲爆酷爽

Summary: Numix主题现在已经风行了有一段时间了，我想我们大多数人都知道它。在上一篇稿子中，我们已经讨论了在Manjaro Linux上安装Numix主题和其它社区分支。 今天，我们打算在Fedora 20上搞点相同的花样出来。 我们首先需要安装fedy，这个东西将帮助我们一起来干这事。如果你现在还没在你的Fedora系统上安上Fedy，那么追随我们前一教程的脚步来安装它。 安装Numix主题 打开终端，把下面的命令跑一遍吧（确定你已经安装了fedy了吧）。 sudo fedy -e numix_themes   安装Gnome优化工具 sudo yum install gnome-tweak-tool  启动Gnome优化工具：  现

看起来不错，可惜mac不能换主题

ubuntu 上也有这个包的.

可惜，我是KDE控

很伤感的，安装官网指导，还是没装上fedy

为什么呢？寻求下大家的帮助吧

提示：<br />
could not resolve host: satya164.github.io

换个图标哪用这么麻烦呢，直接把图标目录复制到 /usr/share/icons 目录下面，然后在 gnome-tweak-tool 中选

# Numix图标主题张冠李戴，Fedora 20劲爆酷爽

[Numix主题](http://numixproject.org/)现在已经风行了有一段时间了，我想我们大多数人都知道它。在上一篇稿子中，我们已经讨论了[在Manjaro Linux上安装Numix主题和其它社区分支](http://www.unixmen.com/install-numix-icon-theme-manjaro-linux/)。

今天，我们打算在Fedora 20上搞点相同的花样出来。

我们首先需要安装**fedy**，这个东西将帮助我们一起来干这事。如果你现在还没在你的Fedora系统上安上Fedy，那么[追随我们前一教程的脚步来安装它](http://www.unixmen.com/tweak-fedora-system-using-fedy/)。

### 安装Numix主题

打开终端，把下面的命令跑一遍吧（确定你已经安装了fedy了吧）。

```
sudo fedy -e numix_themes

```

### 安装Gnome优化工具

```
sudo yum install gnome-tweak-tool

```

启动Gnome优化工具：

现在修改外观设置下的所有设置，把他们全都指向Numix吧，就像下面的图表中那样。

你已经搞定了！

尽情爽吧！

---

via: <http://www.unixmen.com/install-numix-icon-theme-fedora-20/>

译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


怎样使用linux的iptables工具进行网络共享

Summary: 在本教程中，我将解释多个设备怎样在linux下共享一个网络连接。目前无线路由器已经成为主流的消费品，从而解决了本文这一问题。这里假设你家中并没有一台无线路由器，不过，你却有一台已经有"猫"和有线网卡的的linux主机。"猫"是以动态公有IP地址的模式连接到互联网，主机的网卡连接到你的交换机或者集线器。其他设备（如linux或者windows的PC或者笔记本）以网桥的形式连接，并且没有连接到互联网。为了共享linux主机的互联网，你必须把主机转换成网关，以便它能实现从其他设备中传送和接受信息。  术语字汇  私有IP地址（路由不可达地址

不用麻烦，买个无线路由也就100，省事~[呵呵]

Repost

转发微博。

Repost

mark ！

挺有意思的说。

我也觉得。那个路由靠谱。

不错

我总觉得这些功能好麻烦呀。平常用网络的时候，没有这样的呀。

# 怎样使用linux的iptables工具进行网络共享

在本教程中，我将解释多个设备怎样在linux下共享一个网络连接。目前无线路由器已经成为主流的消费品，从而解决了本文这一问题。这里假设你家中并没有一台无线路由器，不过，你却有一台已经有"猫"和有线网卡的的linux主机。"猫"是以动态公有IP地址的模式连接到互联网，主机的网卡连接到你的交换机或者集线器。其他设备（如linux或者windows的PC或者笔记本）以网桥的形式连接，并且没有连接到互联网。为了共享linux主机的互联网，你必须把主机转换成网关，以便它能实现从其他设备中传送和接受信息。

<img src="content_image/album_201406_27_164612j059995so0l900e9.png" alt="" title="">

### 术语字汇

* **私有IP地址**（路由不可达地址）是一个被用于本地局域网的IP地址（在互联网中不可见）。
* **公用IP地址**（路由可达地址）是一个在互联网中可见的IP地址。
* **IP伪装**是一项允许一系列机器通过MASQ网关连接互联网的功能。这些MASQ网关之外的机器在互联网中是不可见的。MASQ之后的机器中任何流入或流出的数据必须经过MASQ网关。
* **网络地址转换**（NAT）是一项通过IP伪装技术可以使私有IP地址访问互联网的功能。

### Hardware Requirements

硬件要求

* 一台有两个接口（一个公有IP地址和其他的私有IP地址）的linux主机，这个主机将被用作网关。
* 一台或者多台拥有私有IP地址的linux/windows系统的PC或者笔记本。
* 交换机/集线器（可选）。

### 教程步骤

接下来的过程需要在linux主机（用于共享的网关）上完成。

#### 1、激活IP转发

为了设置网络共享，你需要在linux主机上更改一个内核参数来使能IP转发功能。内核启动参数设定在/etc/sysctl.conf文件中。

打开这个文件，定位到含有"# net.ipv4.ip\_forward = 0"的这一行，移除#号（即取消注释），然后将其值设置为1，改好之后应该和下面的一致。

```
net.ipv4.ip_forward = 1

```

你还要使激活IP转发功能生效，通过执行下面的命令：

```
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo sysctl -p

```

#### 2、NAT配置

另一个网络共享的重要部分是NAT配置，这可以通过使用iptables的命令，iptables包含四个防火墙的规则表：

* FILTER (默认表格)
* NAT
* MANGLE
* RAW

这个教程中我们将仅使用两个表格：FILTER和NAT表格。

首先，刷新所有活跃的防火墙的规则。

```
$ sudo iptables -X
$ sudo iptables -F
$ sudo iptables -t nat -X
$ sudo iptables -t nat -F

```

在输入表格中，你需要设置转发链（FORWARD）成可接受的（ACCEPT）目的地，因此所有通过主机的数据包将会被正确的处理。

```
$ sudo iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

```

在NAT表中，你必须为你的WAN口启用IP伪装功能，我们假设WAN口协议是ppp0。为了在ppp0接口上使能IP伪造技术，我们使用以下的命令：

```
$ sudo iptables -t nat -I POSTROUTING -o ppp0 -j MASQUERADE

```

#### 3、配置私有IP地址

在linux主机上的所有配置完成后，你需要配置其他设备（linux/windows的PC或笔记本）的DNS服务器以及默认网关，让它们的数据流可以指向linux主机。注意你不需要在linux主机上设置一个DNS服务器，从其他设备发出的每一个DNS请求都会通过上游的ISP自动转发到linux主机上。

如果你的其他设备上用的系统是linux，你可以通过以下命令来更改他们的默认网关和DNS服务器。假设你的网段是192.168.1.0/24的私有IP地址网段，linux主机上绑定的IP地址是192.168.1.1。

```
$ sudo ip route del default
$ sudo ip route add default via 192.168.1.1
$ sudo sh -c "echo 'nameserver 192.168.1.1' > /etc/resolv.conf"

```

如果还有其他的linux设备，那么你可以重复以上命令。

如果你有windows设备，你可以通过控制面板的网络连接属性来更改默认网关和DNS服务器。

#### 4、完整的脚本

这是一个在linux主机上设置网络连接共享的一个完整的脚本。WAN口（ppp0协议）需要根据你具体的网络接口协议来替换。

```
$ sudo vi /usr/local/bin/ishare

```

---

```
#!/bin/bash

## Internet connection shating script

sysctl -w net.ipv4.ip_forward=1
sysctl -p
iptables -X
iptables -F
iptables -t nat -X
iptables -t nat -F
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD  -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -I POSTROUTING -o ppp0 -j MASQUERADE

```

保存以上的脚本为/usr/local/bin/ishare，然后添加可执行权限通过执行下面的命令。

```
$ sudo chmox +x /usr/local/bin/ishare

```

如果你需要这个脚本开机启动，你需要在/etc/rc.local文件中执行这个脚本，并在该文件中的"exit 0"之前添加下面一行。

```
/usr/local/bin/ishare

```

---

via: <http://xmodulo.com/2014/06/internet-connection-sharing-iptables-linux.html>

译者：[yujianxuechuan](https://github.com/yujianxuechuan) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Linux中国：关于文章转载的一些看法

Summary: （题图来源） 首先，我来说说，Linux中国的内容组成成分和发展 Linux中国真正开始花精力运营，大概是2010年开始。之初，网站并没有什么访客，作为个人站点，当然也没有什么兼职或专职的编辑，基本上所有的文章和新闻，都是转载自互联网。当时，基本上我们都会主动标示内容来源，如果有可能，会追溯到最初来源以标示。只是当时作为个人网站，连个标准的CMS也没有，所以，这方面没有要求特别严格，有的只是来源链接，有的会添加上更多的一些作译者信息，有的时候也会忘记。 在其后的两年中，我们陆续改版过几次，网站的功能和栏目也进一步完

我先占沙发

沙发已占,表示.文很好,实行很困难,

但是还是希望大家能来这儿回复,来这儿聊天,来这儿灌水,

然后,最后的最后,希望大家把好的技术文写在这儿.

为了一个井然有序的网络环境,大家都应该有一个默契,最大程度的尊重原创者.注明文章出处,同时也呼吁这种倡议得以实现.

支持

[good]@校长Ubuntu @cnBeta @IMCN开源资讯网 @Linuxeden开源社区

稍后好好读读。

以前自己建了一个博客翻译一些国外Linux消息，也曾经投稿发表在cnbeta等网站，但毕竟个人精力有限。我也发现大家的热情会随着时间的压榨、工作的繁忙而难以为继。非常希望大家可以通过一个公共的平台，共同参与翻译、转载工作，并保证质量。LCTT我觉得很不错，最近看到几篇实用的文章都是你们翻译的。希望你们能保持良性发展，不断有新鲜血液注入，毕竟会不断有人离去。我曾参与Ubuntu Circle的本地化，负责排版，但他们的工作就因为人员难继而几乎完全停滞了。

是的，志愿者工作和开源工作，不能指望人人都RMS那样全身心的投入。重要的建立一个机制，可以不断传承 下去，不断有人接过手中的旗帜。目前LCTT就是这样，很多早期的重要志愿者，有坚持的，也有淡出的，但是不断有新的血液进来，通过传帮带，维持了LCTT的良性运转。

支持！

//@Linux中国:文章较长，废话较多，一方面给我的朋友们聊聊我是如何看待转载的态度；另外一方面，倡议一个共享内容，共建社区的路子。@陈欧侃 这就是我上次隐约提到的想法。

支持一下

希望Linux真正成长起来。在三年时间发展成现在的程度着实不易

不能支持更多。//@Linux中国: 文章较长，废话较多，一方面给我的朋友们聊聊我是如何看待转载的态度；另外一方面，倡议一个共享内容，共建社区的路子。@陈欧侃 这就是我上次隐约提到的想法。

支持下。//@Linux中国: 文章较长，废话较多，一方面给我的朋友们聊聊我是如何看待转载的态度；另外一方面，倡议一个共享内容，共建社区的路子。@陈欧侃 这就是我上次隐约提到的想法。

虽然有时候不同意贵站的意见，但非常支持贵站的做法

回复@稻田里的守望者:谢谢支持[嘻嘻]

无话可说，唯有怒赞！！！加油。

想法很不错！！！！//@Linux中国: 文章较长，废话较多，一方面给我的朋友们聊聊我是如何看待转载的态度；另外一方面，倡议一个共享内容，共建社区的路子。@陈欧侃 这就是我上次隐约提到的想法。

谢谢!

谢谢您的支持~

谢谢支持！

作为开源爱好者，无条件融入，无条件分享~支持linux.cn

赞！！！

支持

扩//@Linux中国: 我发起了一个QQ群，有志于参与和推动这个机制的设计和运行的朋友们，可以加入： 190711482

没有技术，但很想支持//@Linux中国:我发起了一个QQ群，有志于参与和推动这个机制的设计和运行的朋友们，可以加入： 190711482

我发起了一个QQ群，有志于参与和推动这个机制的设计和运行的开源站长们，可以加入： 190711482，加入验证信息：你的网站URL。

给力啊，Linux就该这么搞

[羞嗒嗒]

支持一下吧，一直在邮箱订阅的说。虽然好多都看不明白，不过有需要的时候确实能找到知识[笑哈哈]

回复@会抓鱼的北极熊:谢谢！！

mark//@Linux中国: 没事，技术不是问题。目前阶段主要还是一个框架的讨论，所以也主要局限在各个开源站长范畴的讨论。 //@-路-易-:没有技术，但很想支持 //@Linux中国:我发起了一个QQ群，有志于参与和推动这个机制的设计和运行的朋友们，可以加入： 190711482

我觉得吧。不应该用qq。

我也是近两年才转战linux之前一直在windows服务器上打滚，现在还在不断学习中，但愿linux中国能继续持续发展下去，中国开源能够有一个更好的环境

现在在国内新手学习linux还是比较困难，社区活跃度普遍不高，有问题了找不到地方问，只有有点英语低子的跑去翻wiki,上国外论坛，又或者是我不入行找不到路，呵呵，有同志有活跃社区的可以@下我[嘻嘻]到处水下

ROSchina.cn站长申请加入。

回复@ROSchina:好啊，去加群吧：》

回复@Linux中国:收到请求没？

回复@ROSchina:没啊。。

回复@Linux中国:难道申请QQ群请求真有问题了啊。。。

回复@Linux中国:进了。多谢！

很想参与这么有意义的事，什么时候不是站长也能加入呢

这个大家都有嘛，沟通方便，不拘形式：》

目前还是小范围讨论，等过段时间会扩大

那。这个，必须得顶了。全力支持。作为五行组的，表示支持。其实，我是很想真正地干点事的。

嗯，一些事情吧，哪怕是小的，其实也会感觉挺好的。

必须得报名。支持。星火之光，汇聚多了，也能照亮一片天地。

这不就跟QQ空间的转载形式一样嘛

不完全是~不过我先做出一个样子来，才会有更多人加入~

# Linux中国：关于文章转载的一些看法

<img src="content_image/album_201406_27_214700xkgqaghszs3zguaq.png" alt="" title="">

（[题图来源](http://www.lucidipedia.com/)）

### 首先，我来说说，Linux中国的内容组成成分和发展

Linux中国真正开始花精力运营，大概是2010年开始。之初，网站并没有什么访客，作为个人站点，当然也没有什么兼职或专职的编辑，基本上所有的文章和新闻，都是转载自互联网。当时，基本上我们都会主动标示内容来源，如果有可能，会追溯到最初来源以标示。只是当时作为个人网站，连个标准的CMS也没有，所以，这方面没有要求特别严格，有的只是来源链接，有的会添加上更多的一些作译者信息，有的时候也会忘记。

在其后的两年中，我们陆续改版过几次，网站的功能和栏目也进一步完善了。说实话，这个时候的文章，原创和翻译的（包括站方和网友写的）依然很少。我们自己写的文章也会有一些站点转载，当然，我们转载别站的更多。基本上，对于文章的版权和来源标示，我们的做法是：如果源站明确标示不允许转载，那我们就放弃转载；如果有标明转载申明，就按申明，并调整符合我们的版式，即便没有找到明确的申明，最起码，我们也会保留一个源链接。

2013年9月，我准备在微信公众平台上提供查看Linux 上的MAN功能，期间发现中文的MAN内容基本上可以算是惨不忍睹。不是翻译的内容已经过时多达十多年；就是翻译不准确，甚至简译；甚或有只是翻译了标题的。鉴于此，我觉得应该通过社区来组织MAN的翻译，并形成一个接力的翻译群体，可以不断翻译和更新MAN的内容。

由是，我很快通过QQ群发起了一个翻译组，并将名称定为“Linux中国 翻译组”，简称 LCTT（http://lctt.github.io/）。并考虑到MAN翻译需要一定的基础及进行人员筛选，同时也为了将国外的一些好文章引入到国内来，我们先期启动了一个翻译项目（TP），通过选题、翻译、校对和发布等流程，积极翻译了很多国外的文章。这些文章，我们都按照固定的格式，标明了源站链接、译者等信息。

### 其次，我谈谈我对文章转载的看法

通过LCTT的运作，大量的志愿者参与进来，翻译和校对了很多文章。从此，Linux中国的原创翻译文章数量比之前得到了大幅提高，截止到现在，已经翻译发布了600多篇。我们也发现，我们翻译的文章，会被很多兄弟网站转载，也会被抓站的网站抓走，甚至进行二转、三转。而这些转载中，有的会保留完整的转载声明，有的会保留源站链接，有的甚至不保留或者标示错误。

对于这种情况，我们的看法是：如果愿意保留版权，固然好；不愿意保留，我们也不会说什么。因为，我们的初衷，是让我们的读者、粉丝看到更多有价值的内容，是将Linux中国发扬光大。作为一个支持和宣传开源的站点，我们愿意技术传播更广，如果能有PV固然好，没有也没什么——我们目前仍未投放任何广告，所以不用为了PV而着急。

我也能理解，在文章上署名、标示链接，其实目的应该是为了刺激原创，鼓励分享。我们的文章发布出去，我也愿意别人标示上源站链接，这样多少会有一点人回流过来。将心比心，我们在可能的情况下，都会去追溯源站，仔细排版，留下源站链接。

最初，我们的转载申明，是这样的“**转载**请务必注明原文链接”，你看，语气还是挺生硬的——虽然未必会有人理会；不过很快，我们认识到，我们并不应该冷漠拒绝转载，从某个意义上说，转载就是帮我们扩大文章的传播，因为我们的站点还很小。所以，我们觉得，这个口气应该更和谐些，于是，在我们现在就是这样“**欢迎转载，敬请**在正文中标注并保留原文/译文链接和作者/译者等信息。”。

我们不但建立了网站，还打通了微博、每天还要编发微信公众号、不定期的还自动推送QQ邮件订阅，目的是什么？从冠冕堂皇的角度看，我们希望推广开源，推广知识；从个人私心看，我希望将Linux中国建设成一个大的站点，能够找到一个开源站点的盈利之路，能够在不违背公心、遵守开源秩序的前提下，挣钱！所以，于公于私，我并不觉得弄点内容，就放在自己的小站，生怕被人窃去就是目的。转载站如果能回链，我会高兴有一些新的访客；转载如果不能回链，我也会高兴，我们的工作让更多人受益。

### 再次，关于开源站点的现状

说实话，国内的开源方面的站点，除了背后有公司支撑的网站，基本上都是靠站长和志愿者支撑起来的，不仅仅是站点的内容、维护，也包括硬件、托管等支出，差不多是无收益的。目前，只有部分可以依赖广告投入来勉强平衡，很多干脆处于亏损状态和净投入状态。当然，一批批的站点倒下去，也有一批批的新站冒出来。大家也在积极摸索和探索新的运营生存模式，从目前看到的情况，基本上都不是很乐观。

说说Linux中国的运营状况，很多网友也询问过。Linux中国，在今年之前一直是纯个人网站，就是两位站长个人在维护。今年我们得到了一个有一定关联的公司的支持，在技术、运营方面投入了3个以上的人力协助，Linux中国才较有改观。除了公司支持外，还非常有赖于志愿者和Linux中国的忠实粉丝们的支持，以及像七牛、CSDN这样的开源伙伴的帮助，所以Linux中国得到了长足的发展，访问量一路攀高。在目前，Linux中国还没有投放任何广告，也没有任何的资金收入。我们也在积极探索新的方向，开源站点不应该仅仅单方面的奉献投入，也应该有一种可以持之以恒的、可以自行造血的运营方式和商业模式。

开源站点本身的运营遇到的困难，其实非独一家。我认为，开源社区就应该有开源社区的模式，单打独斗不行，为什么不集合大家的力量一起来达到社区的繁荣和共赢？

在寻找可持续发展的方向上，大家各自有各自的理念和看法，但是，作为内容方面的建设，我认为，可以有一些更开放、更积极的方式来实践。

### 最后，关于开源站点的文章转载的倡议

在开源社区的内容方面，一直比较流行CC协议，很多站点也都遵循。但是我认为，除了一个法律方面的协议，还应该有更多实质上推动共创、繁荣的实操。

我认为，目前开源站点面临的内容建设的困境有：

1. 内容原创和原创翻译不易。投入很多精力，但是很难取得立竿见影的效果。
2. 转载后，读者的反馈散落各处，对文章本身的完善和对读者的反馈没有什么帮助。
3. 转载几次后，各种谬误就随之增多，不但不能解决问题，还给读者造成很不好的阅读体验。

可能还有其它的一些困境，但以上困境，我认为，可以考虑建立一个技术机制来联合各个开源站点，形成合力，并在一定程度上得到解决。

大致来说：

1. 建立公开的转载API规范，支持的站点可以通过规范的API对外提供内容，并通过API获取其它的支持站点的内容。
2. 通过API发布出的内容，会从源头上记录第一个源站，无论内容还是文章属性，都会无误的保留。转载方会得到最可靠的内容。无论是二转还是三转，都会可靠传递。
3. 源站对文章的更新，会通过API进行推送，确保文章处于可靠的维护状态。
4. 源站和转载站的读者，对文章的评论，会汇集到一起，并统一传播到所有传播链条上的站点，
5. 通过转载机制的控制，传播链上的网站对源站均进行链接，从而导致搜索引擎认可源站的URL优先级，从而提高了源站的搜索曝光率。

当然，这里还只是一个不成熟的构想，具体的实现还会有很多调整和优化。

补充：**我发起了一个QQ群，有志于参与和推动这个机制的设计和运行的朋友们，可以加入： 190711482**

>
> **我们希望这是一种促进推广的机制，而不是封锁传播的机制。**
>
>
> **只有以开放的心态来做事，才是开源得以致胜的关键。**
>
>
>

Linux中国 wxy

2014/06/27


戴文的Linux内核专题：27 配置内核 (23)

# 戴文的Linux内核专题：27 配置内核 (23)

欢迎来到内核配置的下一章！本篇中我们会配置密码API，虚拟化和运行库。密码学指的是在需要的计算机之间加密和安全通信的科学。用户可能加密数据以保证是收件人而不是黑客收到数据。

Linux内核需要在内核中启用"Cryptographic algorithm manager"(密码算法管理器)。这个特性提供了操作内核的加密特性所需的软件。

当启用这个它，用户空间提供了配置加密特性(Userspace cryptographic algorithm configuration)。注意:这个配置指的是内核运行时的加密设置，不是编译内核的工具。

为了加强性能，启用这个会在加密算法中停止自我检测的特性 (Disable run-time self tests)。

"GF(2 128) multiplication functions"是一种被一些密码使用特殊算法。GF代表的是" Galois field"(伽罗瓦域)，是一种有限数的集合。这写集合称之为域并且有不同的大小。

"Null algorithms"是用于IPSec的算法。NULL加密意味这没有加密，因此这个驱动允许IPSec不使用加密。

任意算法可以转换成并行算法(Parallel crypto engine)。这个特性提供了转换器。

任意算法同样可以转换成异步算法(Software async crypto daemon)。

IPsec需要"Authenc support"。"Authenc support"代表"Authenticated Encryption and offers multiple encryptions to IPsec"(认证加密并对IPSec提供多重加密)。

CCM代表的是"Counter with CBC MAC"(CBC MAC计数器)，IPSec需要它(CCM support)。

这个驱动提供了"GCM/GMAC support"。GCM意思是"Galois/Counter Mode"(伽罗瓦/计数器 模式)，GMAC是"Galois Message Authentication Code"(伽罗瓦消息验证码)。

注意：我不会明确地解释一些特性的使用和细节。密码学是计算机中的特定领域，解释加密学超出了这篇文章的范围。

"Sequence Number IV Generator"是一个被某些加密软件使用的特殊的号码生成器。

Linux内核提供了不同的密码算法(CBC support)、 (CTR support)、 (CTS support)、 (ECB support)、 (LRW support)、 (PCBC support)、 (XTS support)、 (HMAC support)、 (XCBC support) 和 (VMAC support)。

"CRC32c CRC algorithm" 明确被SPARC64处理器使用。

"CRC32c INTEL hardware acceleration"是另外一个特定处理器的算法。它工作于带SSE4.2的Intel处理器。

内核提供了很多摘要、密码和其他加密软件。通常上，默认允许它们除非你有特殊的理由来启用或禁用这些特性。

注意：摘要(像MD5)会基于一个文件生成一个哈希值(字符序列)。哈希值接着被用于检查文件。比如，如果你从Canonical网站上下载了Ubuntu ISO安装盘，你可能想要知道你硬盘上的文件就是服务器上的文件的复制品。用户这么做的原因是ISO可能在长时间下载中被损坏。哈希值被用来证明文件没有被改变。

注意：密码是一种加密/解密算法。加密是使文件对除了接受者/拥有者之外的人都不可读。解密是浏览加密文件的过程。

Linux内核同样支持用户被强烈建议启用的不同的压缩算法(Deflate compression algorithm)、 (Zlib compression algorithm) 和 (LZO compression algorithm)。

内核可以生成用于加密软件的随机数(Pseudo Random Number Generation for Cryptographic modules)、(User-space interface for hash algorithms) 和 (User-space interface for symmetric key cipher algorithms)。

"Hardware crypto devices"是一个子菜单，包含了基于硬件加密工具的驱动。这个硬件在固件中含有算法。

"Asymmetric (public-key cryptographic) key type" 菜单中存在着不同的非对称公开密钥。

下面，我们可以进入配置工具主菜单(基于菜单接口)的下一个入口。虚拟化是寄放一个操作系统的 能力。这意味这Linux(和其他的系统)可以运行其他的操作系统，仿佛客户机是一个应用一样。

"Kernel-based Virtual Machine (KVM) support"运行内核本身管理客户机。带Intel处理器的计算机需呀这个驱动(KVM for Intel processors support)，AMD的则需要(KVM for AMD processors support)。

用于内核虚拟机(KVM)的内存管理单元(MMU)可以有一个审计系统。

启用这个特性使客户机的网络变得更快(Host kernel accelerator for virtio net)。

在配置哇内核虚拟机特性后，配置工具主菜单下的最后菜单是内核配置的最后一部分。这个菜单用于"Library Routines"(库运行时)，同样也成为库函数。一部分内核可以被作为可以链接的库。比如，XZ过滤(压缩算法)可以被外部程序访问。下面列出了不同的库。

注意：CRC函数大多数都相同但有不同的特性和性能，通常来讲，最好启用这些特性。

CRC-CCITT functions - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC16 functions - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC calculation for the T10 Data Integrity Field - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC ITU-T V.41 functions - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC32/CRC32c functions - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC32 perform self test on init - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC32 implementation (Slice by 8 bytes) - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC7 functions - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC32c (Castagnoli, et al) Cyclic Redundancy-Check - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

CRC8 function - 循环冗余校验测试(Cyclic Redundancy Check)用于测试原始数据中的改变。

\* BCJ filter decoder - 为特定处理器设计的XZ解码器，这里的"\*"是处理器。内核列出了一些不同的架构。

XZ decompressor tester - 用于测试XZ解码器的调试函数。

Averaging functions - "uptime"在"uptime"中看到的平均负载。

CORDIC algorithm - 双曲线和三角函数。

JEDEC DDR data - JEDEC双倍数据速率SD-RAM规范

你猜怎么了？我们已经完成配置内核。在23篇之后，我敢肯定这是你的感觉 -

视频链接:<http://www.youtube.com/embed/barWV7RWkq0?wmode=opaque>

下面，我们可以编译并安装了

在遥远的地方，我仍然在听 -

视频链接:<http://www.youtube.com/embed/ELoUppY1esw?wmode=opaque>

---

via: <http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-23.5112/>

译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


戴文的Linux内核专题：28 编译与安装

Summary: 你好！在花费了大量的时间在配置你需要的内核后，你现在可以编译它了。源代码是纯文本形式的C代码。这对人来可读但是对机器可不是这样。编译会将代码转换成计算机可理解的一种称之为二进制码的形式(1是 ，0 是 )。编译同样会将所有内核代码文件变成一个内核的文件。 为了编译内核，在内核源代码相同目录下，在终端内输入"make"。这会花费一些时间。完成之后，必须通过"make modules"来编译模块。为了从一开始就简化编译过程，输入"make; make modules"。这会先编译接着是模块，而不用用户再回来输入"make modules"。  警告：在你安装一个

# 戴文的Linux内核专题：28 编译与安装

你好！在花费了大量的时间在配置你需要的内核后，你现在可以编译它了。源代码是纯文本形式的C代码。这对人来可读但是对机器可不是这样。编译会将代码转换成计算机可理解的一种称之为二进制码的形式(1是 [开]，0 是 [关])。编译同样会将所有内核代码文件变成一个内核的文件。

为了编译内核，在内核源代码相同目录下，在终端内输入"make"。这会花费一些时间。完成之后，必须通过"make modules"来编译模块。为了从一开始就简化编译过程，输入"make; make modules"。这会先编译接着是模块，而不用用户再回来输入"make modules"。

警告：在你安装一个内核时，备份所有的重要数据，确保有一份/boot目录备份在FAT32的存储卡上。这可以在如果安装失败后帮助修复系统。FAT32不会存储权限，因此它更容易被用作live盘来还原数据。记住设置原始文件权限和可执行位。

一旦编译已经成功完成，我们可以安装内核到本地系统中(我会马上解释如何在其他系统上安装内核[交叉编译])。在相同的终端下，在编译完成后，输入"make install"。这会在/boot目录下存放一些文件。"vmlinuz"(或者其他相似的名字)是内核自身。"initrd"是基于内存的文件系统，它被置于内存中且在启动中使用。"System-map"包含了一张内核符号列表。这些全局变量和函数用于内核代码。"config" 是内核的配置文件。grub.cfg会自动更新。然而，有些bootloder需要手动配置。内核安装器会自动配置Grub，LILO和SysLinux bootloder。像BURG这类bootloder需要手动配置。模块的安装同样需要输入"make modules install"。

注：内核和模块的安装可以写在一行-“make install && make modules\_install”。

一旦上面的过程完成了，用户可以通过重启系统并在开机后在终端内输入"uname -r"来确保内核已经安装。如果系统无法启动或者uname报告你预期外的版本号，这个问题可能众多问题之一引起。或者是bootloader没有正确设置，特性/配置冲突，编译失败，不正确的安装，或者其他原因。找出问题源头最好的方法是查看系统日志(如果系统已经启动到足以产生日志)。"dmsg"是一个在屏幕上打印内核日志的命令。查看错误、警告或者未预料的结果。如果系统没有启动或者没有足够启动完全来生成日志，使用live linux盘来执行诊断和修复。如果所有的都失败了，再次编译内核并确保你已经用root或者"sudo"安装了内核。

注：最好的修复系统的方式是使用live Linux发行版来移除新的/损坏的内核，接着手动修复Grub文件(或者复制一个备份)。

一些Linux用户也喜欢安装内核文档，但这并不是必要。对于那些想要安装文档的用户，输入这行，这里的version是你的内核版本号 "install -d /usr/share/doc/linux-VERSION && cp -r Documentation/\* /usr/share/doc/linux-VERSION"(VERSION 是内核版本号)。很明显，这需要root特权。

要是想编译一个如你目前内核一样特性的内核，输入这条命令"zcat /proc/config.gz > .config"。这个文件可能不存在，如果是这样，你可能需要询问你发行版/内核的开发者这个文件。"zcat"命令解压并写入数据到一个".config"文件中。记住把".config"放到合适的位置。这个文件应该放置在Linux内核目录下，并允许它替换当前的文件。接着，像往常一样编译安装你的内核即可。

交叉编译稍微有点不同。为目标系统配置内核。确保内核配置完后，它是以交叉编译配置的。当交叉编译时，需要熟悉两条术语。"Host"是执行编译的系统，"Target"是接收新内核的系统。确保Host主机系统有合适的编译器。比如，对于ARM系统的交叉编译，用户需要在主机系统上有gcc-arm-linux-gnueabi。通常来说，开发者可以在他们的包管理器上搜寻或者Google到合适/最好的适合他们需要的交叉编译器。比如用于ARM系统交叉编译的命令是"make ARCH=arm CROSS\_COMPILE=arm-linux-gnueabi-"。"ARCH=arm"指的是目标处理器的类型，"CROSS\_COMPILE"指明了交叉编译器。注意交叉编译器前面缺少了"gcc-"并以连字符结束。这是用户在使用交叉编译器作为参数使用时必须使用的格式。模块可以通过输入"make ARCH=arm CROSS\_COMPILE=arm-linux-gnueabi- modules"来交叉编译。为了在目标系统上安装内核，将内核文件夹复制到目标系统上。一旦文件已在目标系统上并在该目录下打开了终端，输入"make install && make modules\_install"。当然你必须是root或者使用"sudo"。

信息：Kernel.org放了一个支持的交叉编译器列表(<https://www.kernel.org/pub/tools/crosstool/>)。

### 安装编译总结:

#### 标准:

```
make && make modules && make install && make modules_install

```

#### 做一个更新的版本或者重整你的内核:

```
zcat /proc/config.gz > .config &&  make && make modules && make install && make modules_install

```

#### 交叉编译:

```
make ARCH={TARGET-ARCHITERCTURE} CROSS_COMPILE={COMPILER}; make ARCH={TARGET-ARCHITERCTURE} CROSS_COMPILE={COMPILER} modules && make install && make modules_install

```

下篇文章中，我们会讨论加入和激活模块。谢谢！

---

via: <http://www.linux.org/threads/the-linux-kernel-compiling-and-installing.5208/>

译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


如何在Debian中启用测试版/不稳定版的软件库

@我的印象笔记

普通用户使用unstable无疑是灾难般的体验

@我的印象笔记

哈哈，在这里 @我的印象笔记 会有什么效果么？

这篇文章过时了，Debian9用户应该这么写

Package: *

Pin: release stable

Pin-Priority: 990

Package: *

Pin: release testing

Pin-Priority: 500

Package: *

Pin: release unstable

Pin-Priority: 100

而且必须写在/etc/apt/preferences

# 如何在Debian中启用测试版/不稳定版的软件库

### 为何要启用测试版/不稳定版？

测试版/不稳定版的Debian给开发者提供了一个比当前稳定版更新的环境以及软件。你们注意到了么？其实这些稳定版啊不稳定版啊神马的都是别名，比方说稳定版其实就是Debian的稳定发行版，而测试版将会是下一个Debian的稳定发行版（当然那是测试后的事了）。截至发稿为止，当前Debian的稳定发行版是Wheezy 7.x，将会成为下一个稳定版的测试版则是Jessie。

当你需要一款应用的最新版本的时候，启用测试版/不稳定版将会是不二的选择。当初我因为工作需要，要安装个Apache的 2.4.x到我的Debian Wheezy。测试版需要的是2.4.x的，可是我的软件库里面只有2.2.x的。所以最好的解决方案当时是将测试版下下来啦。

通常来说当我们想尝试最新版本的应用时，都应该只在测试版软件库中搜索。

<img src="content_image/album_201406_28_231253cyknh99a611gff35.jpg" alt="" title="">

([题图来源](http://www.omgubuntu.co.uk/))

在这篇文章里我将教大家如何在不弄坏你系统的前提下设置好测试、不稳定版的Debain系统并在上面安装软件。

>
>
> ```
> Stable < Testing < Unstable （稳定 < 测试版 < 不稳定版）
> Wheezy < Jessie < Sid
>
> ```
>
>

### 1. 设置测试版/不稳定版的apt源

第一步是把测试版/不稳定版的源加到你的sources.list文件里。在Debian Wheezy系统上，/etc/apt/sources.list理应长得像这样：

```
$ cat /etc/apt/sources.list

```

---

```
...
deb http://security.debian.org/ wheezy/updates main
deb http://http.us.debian.org/debian/ wheezy main
deb-src http://security.debian.org/ wheezy/updates main
...

```

把你repo服务器的链接记下来，比如：<http://http.us.debian.org/debian/>

这个repo服务器将会是离你最近的一个服务器； 在不同的地理位置会有不同的url，这个将会用于下一步。

如果想加测试/不稳定源，则需要在sources.list文件加上这些东西：

```
# Testing repository - main, contrib and non-free branches
deb http://http.us.debian.org/debian testing main non-free contrib
deb-src http://http.us.debian.org/debian testing main non-free contrib

# Testing security updates repository
deb http://security.debian.org/ testing/updates main contrib non-free
deb-src http://security.debian.org/ testing/updates main contrib non-free

# Unstable repo main, contrib and non-free branches, no security updates here
deb http://http.us.debian.org/debian unstable main non-free contrib
deb-src http://http.us.debian.org/debian unstable main non-free contrib

```

格式将会是

```
deb <respository server/mirror> <repository name> <sub branches of the repo>
(deb <上一步弄的服务器或镜像url> <repo的名字> <repo底下的分支>)

```

当然啦，除了用testing或者unstable这么烂的词，也能使用他们的发行版代号，比如Jessie或者Sid

```
deb http://http.us.debian.org/debian jessie main non-free contrib
deb http://security.debian.org/ jessie/updates main contrib non-free
deb http://http.us.debian.org/debian sid main non-free contrib

```

### 2. 钉住 apt！这非常重要

>
> 在加了测试/不稳定的repo之后，当你更新系统的时候所有安装过并且可用的软件就会立马更新，而后你的系统就被你玩火自焚了。
>
>
>

所以需要设置一些规则，以便选定的软件包在正常的更新时不会被更新到一个不稳定的测试版本。

我们需要使用“钉住APT”的方式来告诉apt系统，除了我们希望使用测试版或不稳定版的特定软件包之外，其它的总是使用稳定版的软件包来更新。

可以通过如下两个文件之一来设置如何设置APT的优先级来“钉住”。

```
/etc/apt/preferences
或
/etc/apt/preferences.d/my_preferences

```

打开这两个文件之一（如果没有的话就创建一个），然后输入如下内容：

```
Package: *
Pin: release a=stable
Pin-Priority: 700

Package: *
Pin: release a=testing
Pin-Priority: 650

Package: *
Pin: release a=unstable
Pin-Priority: 600

```

前面我们提到过，稳定版指的是你当前的debian版本，测试版是下一个，而不稳定版则是更远的将来发行版。上面的设置中最主要的是优先级（Pin-Priority）。当前的稳定版应该有最高的优先级，这就是说，正常的apt-get操作只会从当前的稳定版的软件库（现在是wheezy）里面安装软件。

#### 更新包缓存

在增加了新的软件库和指定了优先规则后，需要更新一下包缓存。

```
$ sudo apt-get update

```

#### 确认APT规则

我们必须确认“钉住”的设置正确，优先级也没问题。使用 apt-cache 的 policy 参数来检查：

```
$ apt-cache policy apache2
apache2:
  Installed: (none)
  Candidate: 2.2.22-13
  Version table:
     2.4.7-1 0
        600 http://http.us.debian.org/debian/ unstable/main amd64 Packages
     2.4.6-3 0
        650 http://http.us.debian.org/debian/ testing/main amd64 Packages
     2.2.22-13 0
        700 http://http.us.debian.org/debian/ wheezy/main amd64 Packages

```

如上的输出，确认在wheezy 稳定版中， 2.2.22 版本的Apache是选定的版本，它有最高的优先级。

### 3. 从测试版/不稳定版软件库中安装软件

现在可以从测试版或不稳定版中选择一个特定的软件来安装它了。假如说我们要从测试版软件源中安装 apache2。

有两个不同的方法，并且其结果也有所不同。

#### 方式一

```
# apt-get install apache2/testing

```

上述命令会从测试版软件库中安装 apache2，并从稳定版软件库中安装其依赖包（稳定版通过apt规则确定）。这个命令在某些情况下会失败，比如安装的软件包（apache2）所需的依赖包在稳定版软件库中没有更新到可以支持该软件时。

#### 方式二

```
# apt-get -t testing install apache2

```

上述命令会从测试版软件库中安装apache2，并从测试版软件库中安装其依赖包。这要比上面的命令工作的更好。

所以，要安装较新的软件包，直接从测试版/不稳定版的软件库中安装就行了。注意，优先级号码不只是一个数字而已，还有其特定意义。可以查看 apt\_preferences的man页面了解更多：

```
$ man 5 apt_preferences

```

### 总结

使用“钉住”方式的测试版/不稳定版的软件库是一个获取较新版本软件包的一个好办法，不过其实并不推荐使用它们。如果弄错了，可能会从也许不兼容的分支上下载软件包，这会把你的系统搞乱。

一个更好的方式是，使用向后移植的软件库来安装更新的包。它从测试版和不稳定版的软件库中获取较新版本的软件包，但是为当前的稳定版软件库而编译。所以，对于 debian wheezy来说，你可以使用wheezy-backports 软件库。访问<http://backports.debian.org/> 了解更多。

### 资源

* [https://wiki.debian.org/AptPreferences](http://wiki.debian.org/AptPreferences)
* [https://wiki.debian.org/DebianTesting](http://wiki.debian.org/DebianTesting)
* [https://www.debian.org/security/](http://www.debian.org/security/)

---

via: <http://www.binarytides.com/enable-testing-repo-debian/>

译者：[213edu](https://github.com/213edu) [wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


14个可以提升Linux桌面体验的应用程序

Summary: 转战到Ubuntu，或者是别的流行的Linux发行版，不仅仅是操作系统的操作方式的改变，更多的是你还需要一些能支持你完成工作的好的应用。 在这篇文章中，我将分享一些我精选出来不可或缺的应用程序，并谈谈在我的日常工作中如何有效地使用它们。  日常使用的应用程序 一般当说到Linux桌面上的应用，我总是将这些应用划分为两大类，频繁使用的和一些别的应用。下边我为大家介绍的是一些自己日常使用的应用。 1） Firefox  有时我也会使用用其他的浏览器，但最近火狐浏览器已经成为我可以长期信赖的朋友。可靠的、 安全的、 跨平台的，火狐浏览

木有kde下的？kde，你值得拥有！

Mark

魔兽世界有没有？LOL有没有？什么都没有难道我用电脑来写编程啊？——程序猿飘过

用惯了unity

# 14个可以提升Linux桌面体验的应用程序

转战到Ubuntu，或者是别的流行的Linux发行版，不仅仅是操作系统的操作方式的改变，更多的是你还需要一些能支持你完成工作的好的应用。

在这篇文章中，我将分享一些我精选出来不可或缺的应用程序，并谈谈在我的日常工作中如何有效地使用它们。

<img src="content_image/album_201406_29_183814h8fnyy1d89a5fzyj.jpg" alt="" title="">

### 日常使用的应用程序

一般当说到Linux桌面上的应用，我总是将这些应用划分为两大类，频繁使用的和一些别的应用。下边我为大家介绍的是一些自己日常使用的应用。

1） **Firefox** — 有时我也会使用用其他的浏览器，但最近[火狐浏览器](http://www.mozilla.org/en-US/firefox/new/)已经成为我可以长期信赖的朋友。可靠的、 安全的、 跨平台的，火狐浏览器完全满足了我的日常冲浪需求。

除了访问书签和网页，我还依靠火狐浏览器来处理我的各种部署在局域网服务器上的工作，如 [Plex](https://plex.tv/), [Zoneminder](http://www.zoneminder.com/), 路由器/WEB应用防火墙, 及我的文件服务器。所有这些均可以使用火狐浏览器进行访问。

2） **Parcelite** — 如果没有一个像样的剪贴板管理器我简直没法开始工作，至少对我来说，你无法找到在GNOME 下的[Parcelite](http://parcellite.sourceforge.net/)有什么不足。使用简单，易于访问而且它提供了很多的有用的选项。Parcelite选项应有尽有，包括了从热键设置到空格处理方式。尽管已经有很多的剪贴板管理器，但它们却很难击败 Parcelite。

3） **Bittorrent Sync** — 我已经使用过了各种开源替代方案进行文件同步，但是他们在正式发布之前还需要进行进一步开发。应该说[Bittorrent Synchas](http://www.bittorrent.com/sync)从来没有让我失望过。它运行和安装都很简单和方便，这多亏了新的GUI的实现，而且 Bittorrent Sync 允许我快速地从一台机器到另外一台机器传输巨大的视频文件，而无需浪费时间去将大量的文件同步到“云端”。

我还发现它是与别人分享大型文件的最佳方法，在分享的同时能一直保持 IP 地址和目录的隐蔽。尽管有许多的替代品，我仍然坚定地成为了Bittorrent Sync的骨灰粉丝。

4） **System Monitor** — 因为TOP实在是滚动地太快了，所以我个人更喜欢一个具有选项卡式的 GUI，因为它能够让我的眼睛更轻松些。使用 GNOME 的系统监视器，我可以很快地发现一个失控的进程，并且轻松地kill掉它而不需吹灰之力。与[TOP](http://linux.about.com/od/commands/l/blcmdl1_top.htm)这样的终端程序不同的是，我可以实时的以图形化的方式去查看我的 CPU、 内存和磁盘的使用情况。作为一个拥有正常视觉的人，很难找到一个比用条形图来展示我还拥有多少的空间的更好方式。当然这也同样适用于其它的实时资源使用情况的监视。

5） **PulseAudioControl** — 每一天，我总是需要在多个声音设备之间来回穿梭。有时我需要将其中一个设为默认设备，然后却可能会从火狐浏览器音频完全切换到到另一个设备。因为我想控制我的尽可能多的音频，然后我就发现 [PulseAudioControl](http://freedesktop.org/software/pulseaudio/pavucontrol/)是一个无价的工具。

### 一些别的软件

在本节中，我将分享我使用，但可能并不一定是每天都使用的应用程序。许多这些应用程序都是开放源代码的，有一些不是，但是它们对我个人都非常具有价值。

6） **Skype** — 无论是拨入[Jupiter Broadcasting](http://en.wikipedia.org/wiki/Jupiter_Broadcasting) 收听每周共同主持的播客，或者只是简单联系一个业务，[Skype](http://www.skype.com/en/download-skype/skype-for-linux/) 见证了互联网视频会议的发展史。测试完成无数的替代品后，我总是会发现自己还是终回到了Skype。即使有真的很棒的开源选择像[Ekiga](http://ekiga.org/) 和 [Jitsi](https://jitsi.org/)，而在最后Skype总是与大家同在 —— 切换到Skype是一件很幸运的事。

7）**Kdenlive** — 我使用两个不同的视频编辑器，当我要处理一个需要大量编辑的视频剪辑项目的时候，[Kdenlive](http://www.kdenlive.org/)是我用于图片合成和编辑大型的复杂的视频的工具。我已经成功地在 Kdenlive 里边做过6个素材轨道的编辑，但同样的负载量早已经让别的视频剪辑软件崩溃了。

8）**OpenShot** — 大多数情况下，我会将[OpenShot](http://www.openshot.org/)作为视频剪辑任务的首选神兵利器。快速的编辑和两个素材轨道工作区让你可以流畅而操作简单。我还发现它提供了很棒的无与伦比的特效。调制标题效果和超赞的的视频转场效果使OpenShot在我自己的视频项目上成为一款超棒的视频制作软件。

9）**SpiderOak** — 在使用了无数云备份服务这么多年后， [SpiderOak](https://spideroak.com/) 已经成为了我的至爱。易于安装和使用，我超喜欢它所提供的增量选项而且使用起来是如此的简单。只需一次设置，不再操心，之后SpiderOak将会挑起你的文件搬运大任。

10） **Dropbox** — 许多年来，我已经与[Dropbox](https://www.dropbox.com/) 爱恨交织。尽管它的跨平台特性这意味着我可以从任何位置访问文件，我慢慢地发现我自己越来越少依赖这个基于云计算的备份解决方案。尽管如此，它允许我从任何 web 浏览器中访问文件，即使是从我不经常使用的计算机，这使得抛弃 Dropbox 更是难上加难。

11） **Writer** — 自从我第一次在Windows的OpenOffice里面使用过它之后，我一直都在使用[Writer](http://www.libreoffice.org/discover/writer/)。今天，我使用LibreOffice 所带的Writer来满足我的需求，它可以做一切一个文字处理器可以做的事情。现在，公正地说，一些专有的办公套件可能会提供附加功能在Writer中是没有的，但是99%的人需要的功能在Writer这里都有。就我个人而言，我会永远是一个LibreOffice Writer粉。

12）**SimpleScreenRecorder** — 多年来，我发现自己使用 [SimpleScreenRecorder](http://www.maartenbaert.be/simplescreenrecorder/)远超过其他同类软件，它能很好支持多监视器模式，再加上它甚至可以捕获基于 OpenGL 的应用程序的视频。易于使用和可靠的 SimpleScreenRecorder 让我的工作更加得心应手。我把它推荐给那些只是偶尔需要，懒得使用其它屏幕捕捉软件的同学们。

13）**SimpleScan** — 当我需要扫描文档的时候，我一点都不想将大把大把的时间花费在配置的臃肿的程序上。 [Simple Scan](https://launchpad.net/simple-scan) 可以在这方面做得很好。智能的SANE扫描数据库，Simple Scan将与市面上的任何扫描仪或多功能一体打印机/扫描仪很好的进行协作。此外还有一点好处就是它会设置成的最佳分辨率，当然你还可以很方便手动调整任何你需要的设置。

14）**Baobab**（磁盘使用分析器） — 我不断听到关于如何硬盘价格已回落。这或许没错，但现实却是我却囊中羞涩。这意味着我需要充分利用我能利用的所有硬盘空间，为了实现这个目的，我使用 [Baobab](http://www.marzocca.net/linux/baobab/baobab-getting-started.html) 来观察我在我的硬盘上的可用空间，而且还可以直观地看到到底是哪一个目录正在蚕食我宝贵的硬盘空间。

### 真正的具有生产力的软件

谈到我所依赖的这些软件，我们真正关心的是他们能为我们完成什么样的任务，而不是它们所拥有的光辉头衔和自身的许可证。linux不需要软件的传奇时代早已过去。多数的计算机上的工作，除了有限的几个例外，大都可以在linux桌面上轻松地如我所说的那样完成。

很明显有一些对于你来说是必不可少的软件，但是也许不是我必须用的。你所倚重的软件是什么？您可在下方进行评论并与我们的读者进行分享那些优秀的软件。

（[题图来源](http://www.citizen-e.fr/)）

---

via: <http://www.datamation.com/applications/14-apps-to-boost-ubuntu-1.html>

译者：[owen-carter](https://github.com/owen-carter) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


[小白技巧]如何在Linux中阻止其它用户访问你的家目录

Summary: 如果你和其他人共享Ubuntu机器，那么你可能要设置多个用户，希望其他用户登录到他们自己的帐号，并只能访问他们自己的家目录。但是，默认情况下，任何一个用户都可以访问任何一个家目录。 当你在Ubuntu中添加一个新用户时，adduser工具为新的帐号添加了一个新的家目录。默认情况下，该目录位于根下面的/home/目录下，并以该帐号的用户名命名。例如，/home/lori。Ubuntu中创建的用户家目录具有其它人可读/执行权限，这就给系统中所有其他用户可以读另外外一些用户的家目录中的内容的权利。具体请阅读我们的文件权限在Linux中是如何工作的一

[泪流满面]希捷500G硬盘被我4k对齐。。。然后安装windows或者ubuntu 系统登录界面特别卡。。。[泪]咋整啊

Repost

哈哈，其实就是chmod这么简单！赞一个

怎么对齐的？把 fdisk -l 的输出信息发出来看看吧。

用chmod修改用户目录文件权限吧

切切以为，UBUNTU还不如09年那阵子用着习惯和舒服了。新版本都觉得太别扭了。

虽然说，这功能挺好使的。但现在，基本上都是一人一电脑的。与人分享电脑的概率还是蛮低的。

主要是怕被人偷了硬盘~~

偷了硬盘，应该也能看得到的。

# [小白技巧]如何在Linux中阻止其它用户访问你的家目录

如果你和其他人共享Ubuntu机器，那么你可能要设置多个用户，希望其他用户登录到他们自己的帐号，并只能访问他们自己的家目录。但是，默认情况下，任何一个用户都可以访问任何一个家目录。

当你在Ubuntu中添加一个新用户时，adduser工具为新的帐号添加了一个新的家目录。默认情况下，该目录位于根下面的/home/目录下，并以该帐号的用户名命名。例如，/home/lori。Ubuntu中创建的用户家目录具有其它人可读/执行权限，这就给系统中所有其他用户可以读另外外一些用户的家目录中的内容的权利。具体请阅读我们的[文件权限在Linux中是如何工作的](http://www.howtogeek.com/67987/htg-explains-how-do-linux-file-permissions-work/)一文。

**注**：当我们在文中提到输入什么时，输入的文字内容是在引号中的，不要输入引号，除非我们另外指定。

你可以很容易地修改你的家目录的权限来保护你的私人文件。要检查你家目录的权限，输入Ctrl + Alt + T打开终端窗口，并在提示符后输入以下命令，然后按回车。使用你自己的用户名来替换下面的“用户名”。

```
ls -ld /home/lori

```

**注**：该命令仅包含小写的L，而不是数字1。（LCTT译注：这是给完全小白的提示，绝大部分人可以无视这个备注了）

在该行的开头，列出了该文件的权限。就像我们在[文章](http://www.howtogeek.com/67987/htg-explains-how-do-linux-file-permissions-work/)中关于Linux权限部分讲的那样。

>
> r表示“读”，w表示“写”，而x表示“执行”。目录权限以“d”开头，而不是“-”。你也会注意到权限值占了10个位置。你可以忽略第一个，后面是3个一组，分为3组。第一组是属主（owner）权限，第二组是属组（group）权限，最后一组是其它人（other或world）权限。
>
>
>

因此，下面列出的家目录的属主具有读、写和执行权限，而属组和其它人具有读和执行权限。

要修改这些权限，在提示符下输入以下行并回车

```
sudo chmod 0750 /home/lori

```

当提示你输入密码时，请输入并回车。

**注**：chmod命令使用八进制数作为一种指定权限的方式。我们讲Linux权限的[文章](http://www.howtogeek.com/67987/htg-explains-how-do-linux-file-permissions-work/)中使用了一种不同的方法，它需要几个步骤，但是可能更易于理解。使用八进制数来指定权限，是一种更快的方法。不管使用什么方法，只要你用着舒服就好。要学习使用八进制数设置权限，请阅读此[文章](http://www.linux.org/threads/file-permissions-chmod.4094/)。

按上箭头两次，再次调用“ls -ld /home/用户名”命令来检查权限。注意，其它人权限现在都是破折号（-），这就意味着其它人将无法读、写或执行你家目录中的任何东西了。

然而，和你同组的用户可以读和执行你家目录中的文件和文件夹。如果你不想除你之外的任何人访问你的家目录，可以在chmod命令中输入“0700”。

**注**：要获取关于Linux中用户和组管理的更多信息，请查看我们的[文章](http://www.howtogeek.com/howto/36845/the-beginners-guide-to-managing-users-and-groups-in-linux/)

要关闭终端窗口，在提示符下输入“exit”并回车。

现在，当其系统中的其他用户试着要访问你的家目录时，下面的对话框就会弹出来了。

甚至你也可以在创建新用户时让Ubuntu使用指定的权限。要完成此项任务，你需要编辑adduser配置文件。要编辑该文件，在提示符下输入以下命令并回车。

```
gksudo gedit /etc/adduser.conf

```

我们使用gedit来编辑该文件，你也可以使用你想要的其它文本编辑器。

注：gksudo命令看似和sudo命令一样，但是它是用来以root身份运行图形化程序的，而sudo命令用来以root身份运行命令行程序。

在弹出对话框中的密码编辑框内输入你的密码并按回车或点击确定（OK）。

在adduser.conf文件中向下滚动到DIR\_MODE命令处，这里的默认值是“0755”。修改该值来反映你想要授权给各种用户类型（属主，属组，其它人）的不同权限（r，w，x），如我们先前讨论过的“0750”或“0700”。点击保存（Save）。

从gedit的文件（File）菜单选择退出（Quit）来关闭gedit，你也可以点击窗口左上角的X按钮来关闭它。

点击窗口左上角的X来关闭终端窗口。

现在，你家目录中文件会保持私有。切记，如果有其他用户和你处于同一组中，你也许要为你的家目录权限剔除组和大众权限。

---

via: <http://www.howtogeek.com/190084/how-to-prevent-other-users-from-accessing-your-home-directory-in-ubuntu-14.04/>

译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Ubuntu的Orange Box首次亮相

Summary: Orange Box现已推出，它是一个便携的服务器集群，Canonical用它来演示和培训基于Ubuntu的OpenStack云。   Canonical刚刚发布的Orange Box是一个便携式服务器集群，该公司用来展示OpenStack，MAAS，Juju和其它的基于Ubuntu Linux的云服务。 下面是它的介绍。 对于刚刚接触到它的人来说，重要的是要了解Orange Box不是什么：它不是一台Canonical用来盈利的硬件产品。到目前为止，该公司并无表示计划大规模销售这些设备。如果你真的想买一款的话，大概价格为$12,900，这个价格来自其合同制造商TranquilPC Limited。 从大的方面来说，Orange B

@江苏中科梦兰电子科技有限公司

Repost

//@天空湖SKYLAKE:转发微博

这个够酷

这东西太帅了

Orange Box，真心太帅了

就是真贵啊~

@唐_亚光 @COSUG ，橙色！//@校长Ubuntu:转发微博

@马丁龙猪 买买买

颜色不是Canonical的风格 //@唐_亚光: //@老杨在闲浪:@唐_亚光 @COSUG ，橙色！//@校长Ubuntu:转发微博

就是不知道这玩意的实用性如何。

# Ubuntu的Orange Box首次亮相

>
> Orange Box现已推出，它是一个便携的服务器集群，Canonical用它来演示和培训基于Ubuntu的OpenStack云。
>
>
>

Canonical刚刚发布的Orange Box是一个便携式服务器集群，该公司用来展示[OpenStack](http://openstack.org/)，[MAAS](https://maas.ubuntu.com/)，[Juju](http://juju.ubuntu.com/)和其它的基于Ubuntu Linux的云服务。

下面是它的介绍。

对于刚刚接触到它的人来说，重要的是要了解Orange Box不是什么：它不是一台Canonical用来盈利的硬件产品。到目前为止，该公司并无表示计划大规模销售这些设备。如果你真的想[买一款](http://www.tranquilpcshop.co.uk/ubuntu-orange-box/)的话，大概价格为$12,900，这个价格来自其合同制造商[TranquilPC Limited](http://www.tranquilpcshop.co.uk/)。

从大的方面来说，Orange Box是一个说服企业在基于Ubuntu的云计算投入资金的工具。Canonical的创始人马克·沙特尔沃思[上个月宣布了](http://thevarguy.com/ubuntu/051614/shuttleworth-highlights-ubuntu-openstack-cloud-innovations)Ubuntu OpenStack的战略，这是该战略的一个关键组成部分，更是该公司提供的称作[Jumpstart](http://www.ubuntu.com/cloud/tools/jumpstart)的OpenStack的培训计划的一部分。

作为Jumpstart的一部分，Canonical会将Orange Box借给合作伙伴，以便他们的员工可以在Ubuntu集群上练习配置OpenStack和相关软件。Canonical的工作人员也将在培训期间提供咨询。

不过除开培训的目的不谈，Orange Box[看起来真的很酷](http://arstechnica.com/information-technology/2014/06/hands-on-with-canonicals-orange-box-and-a-peek-into-cloud-nirvana/)。它装有10个[英特尔NUC](http://www.intel.com/content/www/us/en/nuc/overview.html)，总计集成了160GB的RAM，1200GB的存储空间和10个酷睿i5处理器，这种设备在一个袖珍空间内提供了相当强大的计算能力。

更好的是，Orange Box通过预装软件为启动基于Ubuntu的云技术打下了良好基础。

不过，对于Canonical来说，真正的考验是确保企业能够从Orange Box中获益。借出它们不只是为了让合作伙伴们体验一下不错的硬件设备，而是为了通过一个真正令人信服的方式体验Ubuntu的云，以吸引IT决策者选择Ubuntu所建立的下一代云基础设施。

---

via: <http://thevarguy.com/ubuntu/062314/canonical-debuts-orange-box-ubuntu-openstack-cloud-demos>

译者：[乌龙茶](https://github.com/yechunxiao19) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出