2016年5月

头条消息

昨天我们报道过,Linux 4.6 内核发布之后,已经有一些发行版率先尝鲜了。而准备于 6 月 14 日发布的 Fedora 24 眼见小朋友们都用上了新内核,也不禁有些眼热,所以,现在他们内部在讨论是不是也换到 4.6 上。Fedora 24 之前一直是基于 Linux 4.5 内核做的开发,但是由于 Fedora 24 已经延迟了三次,所以最终冻结期被延迟到了五月,因此就在最终冻结期前赶上了 Linux 4.6 的发布。离计划的发布日期只有不到一个月了,这个时候改换内核,以 Fedora 一向的“良好”传统,延期看来是不可避免的了,所以老王倒是觉得没必要换 4.6 ——虽然 4.6 也有一些新特性,但是值得么?不如等 Fedora 25 ,反正等不了多久。

Linux 下最棒的 Google Drive 原生客户端 Insync 限免两天——到现在为止,还有28个小时。 它支持 Arch Linux、CentOS、 Debian、 Fedora、 Ubuntu 和 Red Hat Enterprise Linux 等 Linux 发行版,并有 Linux 下的各种文件管理器的插件支持,如:Caja、Dolphin、Konqueror、Nautilus、Nemo 和 Thunar。此外,Insync 也支持 Mac OS 、Windows 等系统。对了,最最重要的是,你得自备梯子。笑哭~,老王默默的关上了浏览器。

Google 正式宣布在 6 月 16 日之后放弃对 SSLv3 和 RC4 加密套件的支持,这会影响到 Gmail 的 SMTPS 服务器及其 Gmail 的 Web 服务器。这是应有之义,而且这个消息其中之前都已经早早发布过了。不过,虽然 Gmail 还能和国内通讯,但是其实国内很多很多邮件服务器都不使用 SMTPS (SMTP over SSL),所以没有什么意义。

版本更迭

  • ReactOS 0.4 发布了第一个维护版本 0.4.1,初步支持了 Btrfs 文件系统的读写。ReactOS 在经过了十年的休眠后,终于苏醒了,今年发布了 0.4 版本(2006 年发布的 0.3),维护者 Ziliang Guo (老王:似乎是个中国人?)承诺,会在接下来的几周和几个月内继续发布更新版本。

Docker 在 开放容器项目 Open Container Project,OCP 中的参与度达成圆满,最新构建的 Docker 采用了 Docker 贡献给 OCP 的组件。

新发布的 Docker 1.11 的最大新闻并不是它的功能,而是它使用了在 OCP 支持下的标准化的组件版本。

去年,Docker 贡献了它的 runC 核心给 OCP 作为构建构建容器工具的基础。同样还有 containerd,作为守护进程或者服务端用于控制 runC 的实例。Docker 1.11 现在使用的就是这个捐赠和公开的版本。

Docker 此举挑战了它的容器生态仍主要由 Docker 自身决定这个说法。它并不是为了作秀才将容器规范和运行时细节贡献给 OCP。它希望项目将来的开发越开放和广泛越好。

Docker 1.11 已经用贡献给 OCP 的 runC 和 containerd 进行了重构。runC 如果需要的话可以换成另外一个。

runC 的两位主要提交者来自 Docker,但是来自 Virtuozzo(Parallels fame)、OpenShift、Project Atomic、华为、GE Healthcare、Suse Linux 也都是提交人员里面的常客。

Docker 1.11 中一个更明显的变化是先前 Docker runtime 在 Docker 中是唯一可用的,并且评论家认为这个会限制用户的选择。runC runtime 现在是可替换的;虽然 Docker 在发布时将 runC 作为默认引擎,但是任何兼容的引擎都可以用来替换它。(Docker 同样希望它可以不用杀死并重启现在运行的容器,但是这个作为今后的改进规划。)

Docker 正在将基于 OCP 的开发流程作为内部创建其产品的更好方式。在它发布 1.11 的官方博客中称:“将 Docker 切分成独立的工具意味着更专注的维护者,最终会有更好的软件质量。”

除了修复长期以来存在的问题和确保 Docker 的 runC/containerd 跟上步伐,Docker 还在 Docker 1.11 中加入了一些改进。Docker Engine 现在支持 VLAN 和 IPv6 服务发现,并且会自动在多个相同别名容器间执行 DNS 轮询负载均衡。


via: http://www.infoworld.com/article/3055966/open-source-tools/docker-111-adopts-open-container-project-components.html

作者:Serdar Yegulalp 译者:geekpi 校对:wxy

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

基数树 Radix tree

Trie

正如你所知道的,Linux内核提供了许多不同的库和函数,它们实现了不同的数据结构和算法。在这部分,我们将研究其中一种数据结构—— 基数树 Radix tree 。在 Linux 内核中,有两个文件与基数树的实现和API相关:

让我们先说说什么是 基数树 吧。基数树是一种 压缩的字典树 compressed trie ,而字典树是实现了关联数组接口并允许以 键值对 方式存储值的一种数据结构。这里的键通常是字符串,但可以使用任意数据类型。字典树因为它的节点而与 n叉树 不同。字典树的节点不存储键,而是存储单个字符的标签。与一个给定节点关联的键可以通过从根遍历到该节点获得。举个例子:

               +-----------+
               |           |
               |    " "    |
               |           |
        +------+-----------+------+
        |                         |
        |                         |
   +----v------+            +-----v-----+
   |           |            |           |
   |    g      |            |     c     |
   |           |            |           |
   +-----------+            +-----------+
        |                         |
        |                         |
   +----v------+            +-----v-----+
   |           |            |           |
   |    o      |            |     a     |
   |           |            |           |
   +-----------+            +-----------+
                                  |
                                  |
                            +-----v-----+
                            |           |
                            |     t     |
                            |           |
                            +-----------+

因此在这个例子中,我们可以看到一个有着两个键 gocat字典树 。压缩的字典树也叫做 基数树 ,它和 字典树 的不同之处在于,所有只有一个子节点的中间节点都被删除。

Linux 内核中的基数树是把值映射到整形键的一种数据结构。include/linux/radix-tree.h文件中的以下结构体描述了基数树:

struct radix_tree_root {
         unsigned int            height;
         gfp_t                   gfp_mask;
         struct radix_tree_node  __rcu *rnode;
};

这个结构体描述了一个基数树的根,它包含了3个域成员:

  • height - 树的高度;
  • gfp_mask - 告知如何执行动态内存分配;
  • rnode - 孩子节点指针.

我们第一个要讨论的字段是 gfp_mask

底层内核的内存动态分配函数以一组标志作为 gfp_mask ,用于描述如何执行动态内存分配。这些控制分配进程的 GFP_ 标志拥有以下值:( GF_NOIO 标志)意味着睡眠以及等待内存,( __GFP_HIGHMEM 标志)意味着高端内存能够被使用,( GFP_ATOMIC 标志)意味着分配进程拥有高优先级并不能睡眠等等。

  • GFP_NOIO - 睡眠等待内存
  • __GFP_HIGHMEM - 高端内存能够被使用;
  • GFP_ATOMIC - 分配进程拥有高优先级并且不能睡眠;

等等。

下一个字段是rnode

struct radix_tree_node {
        unsigned int    path;
        unsigned int    count;
        union {
                struct {
                        struct radix_tree_node *parent;
                        void *private_data;
                };
                struct rcu_head rcu_head;
        };
        /* For tree user */
        struct list_head private_list;
        void __rcu      *slots[RADIX_TREE_MAP_SIZE];
        unsigned long   tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS];
};

这个结构体包含的信息有父节点中的偏移以及到底端(叶节点)的高度、子节点的个数以及用于访问和释放节点的字段成员。这些字段成员描述如下:

  • path - 父节点中的偏移和到底端(叶节点)的高度
  • count - 子节点的个数;
  • parent - 父节点指针;
  • private_data - 由树的用户使用;
  • rcu_head - 用于释放节点;
  • private_list - 由树的用户使用;

radix_tree_node 的最后两个成员—— tagsslots 非常重要且令人关注。Linux 内核基数树的每个节点都包含了一组 指针槽 slots ,槽里存储着指向数据的指针。在Linux内核基数树的实现中,空槽存储的是 NULL 。Linux内核中的基数树也支持 标签 tags ,它与 radix_tree_node 结构体的 tags 字段相关联。有了标签,我们就可以对基数树中存储的记录以单个 比特位 bit 进行设置。

既然我们了解了基数树的结构,那么该是时候看一下它的API了。

Linux内核基数树API

我们从结构体的初始化开始。有两种方法初始化一个新的基数树。第一种是使用 RADIX_TREE 宏:

RADIX_TREE(name, gfp_mask);

正如你所看到的,我们传递了 name 参数,所以通过 RADIX_TREE 宏,我们能够定义和初始化基数树为给定的名字。RADIX_TREE 的实现很简单:

#define RADIX_TREE(name, mask) \
         struct radix_tree_root name = RADIX_TREE_INIT(mask)

#define RADIX_TREE_INIT(mask)   { \
        .height = 0,              \
        .gfp_mask = (mask),       \
        .rnode = NULL,            \
}

RADIX_TREE 宏的开始,我们使用给定的名字定义 radix_tree_root 结构体实例,并使用给定的 mask 调用 RADIX_TREE_INIT 宏。 而 RADIX_TREE_INIT 宏则是使用默认值和给定的mask对 radix_tree_root 结构体进行了初始化。

第二种方法是手动定义radix_tree_root结构体,并且将它和mask传给 INIT_RADIX_TREE 宏:

struct radix_tree_root my_radix_tree;
INIT_RADIX_TREE(my_tree, gfp_mask_for_my_radix_tree);

INIT_RADIX_TREE 宏的定义如下:

#define INIT_RADIX_TREE(root, mask)  \
do {                                 \
        (root)->height = 0;          \
        (root)->gfp_mask = (mask);   \
        (root)->rnode = NULL;        \
} while (0)

RADIX_TREE_INIT宏所做的初始化工作一样,INIT_RADIX_TREE 宏使用默认值和给定的 mask 完成初始化工作。

接下来是用于向基数树插入和删除数据的两个函数:

  • radix_tree_insert;
  • radix_tree_delete;

第一个函数 radix_tree_insert 需要3个参数:

  • 基数树的根;
  • 索引键;
  • 插入的数据;

radix_tree_delete 函数需要和 radix_tree_insert 一样的一组参数,但是不需要传入要删除的数据。

基数树的搜索以两种方法实现:

  • radix_tree_lookup;
  • radix_tree_gang_lookup;
  • radix_tree_lookup_slot.

第一个函数radix_tree_lookup需要两个参数:

  • 基数树的根;
  • 索引键;

这个函数尝试在树中查找给定的键,并返回和该键相关联的记录。第二个函数 radix_tree_gang_lookup 有以下的函数签名:

unsigned int radix_tree_gang_lookup(struct radix_tree_root *root,
                                    void **results,
                                    unsigned long first_index,
                                    unsigned int max_items);

它返回的是记录的个数。 results 中的结果,按键排序,并从第一个索引开始。返回的记录个数将不会超过 max_items 的值。

最后一个函数radix_tree_lookup_slot将会返回包含数据的指针槽。

链接


via: https://github.com/0xAX/linux-insides/blob/master/DataStructures/radix-tree.md

作者:[0xAX] 译者:cposture 校对:Mr小眼儿

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

头条消息

有一款名为 ChaletOS 的发行版今天刚刚发布了 16.04 LTS ,它是一款基于 Ubuntu 16.04 LTS 的发行版。这个发行版的主要目标是为那些前 Windows 用户们提供一个进入开源世界的便捷之路。它提供了一个名为 起点 Start Point 的应用,设计用来帮助那些 Windows 用户们快速熟悉该系统,这个应用里面包括视频指引、教程和推荐应用等。

不过,对于有些 Windows 用户,可能希望看到熟悉的 Windows 界面,因此,ChaletOS 的开发者 Dejan Petrovic 还发布了一个快速教程,教给用户如何将他们的 ChaletOS 16.04 桌面转换为 Windows 10 外观。你只需要下载这个 Windows 10 图标包即可将它变得和 Windows 10 一样。

当然,就笔者的角度来看,就是不转换成 Windows 10 外观,看起来也挺不错的。

昨天 Linux 4.6 内核刚刚发布,不到一天,Arch Linux 和基于 Debian GNU/Linux 的 SparkyLinux 也分别宣布他们支持了 Linux 4.6 内核。这两个发行版应该是第一批支持 4.6 内核的发行版。当然,Gentoo 也可以,只是需要你自己去搞定。不过我们并不太建议马上就尝鲜 Linux 4.6 内核,应该等待它进入各个发行版的稳定仓库再更新。

版本更迭

  • Wine 1.9.10 发布,带来了 MAC OS 下的 Retina 高分辨率支持。

头条消息

今天的头条消息显然是开发了两月的 Linux 4.6 内核发布了正式的产品版,这个版本的开发非常顺利,以至于 Linus 曾考虑提前结束 RC 周期。4.6 内核中引入了 OrangeFS 和 USB 3.1 SSP 支持,此外还有各种你或许搞不明白的改进和新特性。Linus 说,他明天就开始 4.7 的开发——我觉得每个里程碑版本完成后都不歇一歇么?感觉看着都很累。

另外一件事是,Debian 前一段时间支持了 ZFS 文件系统,这个开发已经持续了一年了,终于见了分晓。虽然社区表示欢迎,但是也有一些人表示,ZFS 的许可协议不是和 Debian 的原则(Debian 自由软件指南)冲突么?这是怎么搞的?Debian 的人表示,“我们并没有将 ZFS 的二进制放到“main”仓库中,而是将源代码放到了“contrib”仓库了,需要的话你自己编译好了”——我们并没有许可证的冲突,用户自己编译就没有关系了,所以我们并没有违例——感觉许多自由软件纯化论者往往有些自欺欺人的倾向。

Geary 是一个非常时尚和易于使用的 GNOME 3 下的邮件客户端,但是去年其开发组织 Yorba 发布了退休公告后,该项目就没有动静了。不过,今天我们得到了一个令人振奋的好消息,Geary 复活归来。这次发布了新的 0.11.0 版本,修复了 0.10.0 的一些问题,也有一些新的特性改进,但是这一切都比不过 Geary 重生值得高兴。

版本更迭

  • KDE Frameworks 5.22.0 发布,这个版本没有什么重要的变化,主要是一些修复
  • 基于 Arch Linux 的发行版 LinHES R8.4 发布,这是一个类似 Mythbuntu 的发行版,主要用于多媒体体验,因此其中包含了 Kodi 16.1、MythTV 0.28 和 OpenPHT 等软件。

今天,美国时间 5 月 15 日, Linus Torvalds 宣布了 Linux 4.6 内核的正式发布。

经过了两个月的开发,历经了 7 个 RC 版本,Linux 4.6 内核终于发布了最终产品版本,带来了一些引人关注的新功能、更新的驱动程序以及一些安全改进。

“好在我不用中断 RC 周期,上周我们如预期的收到了几个修复,但是没有什么出乎意料的事情。所以, 4.6 就按照正常的计划发布了,这也意味着我明天就可以启动 4.7 的合并窗口啦。” Linus Torvalds 说。

Linux 4.6 内核的新功能

Linux 4.6 内核的最引人注目的新功能是 OrangeFS 分布式文件系统、支持 USB 3.1 SuperSpeed Plus (SSP) 协议、提供了高达 10Gbps 的传输速度、改进了 OOM 任务处理器 Out Of Memory task killer 的可靠性、并支持了 Intel 内存保护键。

此外,Linux 4.6 内核也带有 内核连接多路转接器 Kernel Connection Multiplexor 、一个用于加速应用层协议的新部件、802.1AE MAC 级加密支持(MACsec)、OCFS2 文件系统的在线 inode 检查器、支持 BARMAN V 协议、支持 pNFS SCSI 布局。

最后,Linux 4.6 内核也包括了对 cgroup 名字空间和 dma-buf 的支持、一个新打造的 ioctl 专门用于管理 CPU 和 GPU 之间的缓存关联性。当然,也更新了不少驱动程序、修复了许多问题。