2016年8月

CanonicalUbuntu 创始人 Mark Shuttleworth 在一次采访中说他不准备宣布 Ubuntu 的新 Snap 程序包格式。但是就在几个月之后,很多 Linux 发行版的开发者和公司都宣布他们会把 Snap 作为通用 Linux 程序包格式。

Linux 供应商,独立软件开发商和公司门全都采用 Ubuntu Snap 作为多种 Linux 系统的配置和更新程序包。

为什么呢?因为 Snap 能使一个单一的二进制程序包可以完美、安全地运行在任何 Linux 台式机、服务器、云或物联网设备上。据 Canonical 的 Ubuntu 客户端产品和版本负责人 Olli Ries 说:

Snap 程序包的安全机制让我们在更快的跨发行版应用更新中打开了新的局面,因为 Snap 应用是与系统的其它部分想隔离的。用户可以安装一个 Snap 而不用担心是否会影响其他的应用程序和操作系统。

当然了,如 Linux 内核的早期开发者和 CoreOS 安全维护者 Matthew Garrett 指出的那样:如果你将 Snap 用在不安全的程序中,比如 X11 窗口系统,实际上您并不会获得安全性。(LCTT 译注:X11 也叫做 X Window 系统,X Window 系统 ( X11 或 X )是一种位图显示的视窗系统 。它是在 Unix 和类 Unix 操作系统 ,以及 OpenVMS 上建立图形用户界面的标准工具包和协议,并可用于几乎所有已有的现代操作系统。)

Shuttleworth 同意 Garrett 的观点,但是他也说你可以控制 Snap 应用是如何与系统的其它部分如何交互的。比如,一个 web 浏览器可以包含在一个安全的 Snap 程序包中,这个 Snap 使用 Ubuntu 打包的 openssl TLS 和 SSL 库。除此之外,即使有些东西影响到了浏览器实例内部,也不能进入到底层的操作系统。

很多公司也这样认为。戴尔、三星、Mozilla、krita(LCTT 译注:Krita 是一个位图形编辑软件,KOffice 套装的一部份。包含一个绘画程式和照片编辑器,Krita 是自由软件,并根据GNU通用公共许可证发布)、Mycroft(LCTT 译注:Mycroft 是一个开源AI智能家居平台,配置 Raspberry Pi 2 和 Arduino 控制器),以及 Horizon Computing(LCTT 译注:为客户提供优质的硬件架构为其运行云平台)都将使用 Snap。Arch Linux、Debain、Gentoo 和 OpenWrt 开发团队也已经拥抱了 Snap,也会把 Snap 加入到他们各自的发行版中。

Snap 包又叫做“Snaps”,现在已经可以原生的运行在 Arch、Debian、Fedora、Kubuntu、Lubuntu、Ubuntu GNOME、Ubuntu Kylin、Ubuntu MATE、Ubuntu Unity 和 Xubuntu 之上。 Snap 也在 CentOS、Elementary、Gentoo、Mint、OpenSUSE 和 Red Hat Enterprise Linux (RHEL) 上取得了验证,并且也很容易运行在其他 Linux 发行版上。

这些发行版正在使用 Snaps,Shuttleworth 声称:“Snaps 为每个 Linux 台式机、服务器、设备和云机器带来了很多应用程序,在让用户使用最好的应用的同时也给了用户选择发行版的自由。”

这些发行版共同代表了 Linux 桌面、服务器和云系统发行版的主流。为什么它们从现有的软件包管理系统换了过来呢? Arch Linux 的贡献者 Tim Jester-Pfadt 解释说,“Snaps 最棒的一点是它支持先锐和测试通道,这可以让用户选择使用预发布的开发者版本或跟着最新的稳定版本。”

除过这些 Linux 分支,独立软件开发商也将会因为 Snap 很好的简化了第三方 Linux 应用程序分发和安全维护问题而拥抱 Snap。例如,文档基金会也将会让流行的开源办公套件 LibreOffice 支持 Snap 程序包。

文档基金会的联合创始人 Thorsten Behrens 这样说:

我们的目标是尽可能的使 LibreOffice 能被大多数人更容易使用。Snap 使我们的用户能够在不同的桌面系统和发行版上更快捷、更容易、持续地获取最新的 LibreOffice 版本。更好的是,它也会帮助我们的发布工程师最终从周而复始的、自产的、陈旧的 Linux 开发解决方案中解放出来,很多东西都可以一同维护了。

Mozilla 的 Firefix 副总裁 Nick Nguyen 在该声明中提到:

我们力求为用户提供良好的使用体验,并且使火狐浏览器能够在更多平台、设备和操作系统上运行。随着引入 Snaps ,对火狐浏览器的持续优化成为可能,使它可以为 Linux 用户提供最新的特性。

Krita 基金会 (基于 KDE 的图形程序)项目领导 Boudewijn Rempt 说:

在一个私有仓库中维护 DEB 包是复杂而耗时的。Snaps 更容易维护、打包和分发。把 Snap 放进软件商店也特别容易,这是我发布软件用过的最舒服的软件商店了。Krita 3.0 刚刚作为一个 snap 程序包发行,新版本出现时它会自动更新。

不仅 Linux 桌面系统程序为 Snap 而激动。物联网(IoT)和嵌入式开发者也以双手拥抱了 Snap。

由于 Snaps 彼此隔离,带来了数据安全性,它们还可以自动更新或回滚,这对于硬件设备是极好的。多个厂商都发布了运行着 snappy 的设备(LCTT 译注:Snap 基于 snappy 进行构建),这带来了一种新的带有物联网应用商店的“智能新锐”设备。Snappy 设备能够自动接收系统更新,并且连同安装在设备上的应用程序也会得到更新。

据 Shuttleworth 说,戴尔公司是最早一批认识到 Snap 的巨大潜力的物联网供应商之一,也决定在他们的设备上使用 Snap 了。

戴尔公司的物联网战略和合作伙伴主管 Jason Shepherd 说:“我们认为,Snaps 能解决在单一物联网网关上部署和运行多个第三方应用程序所带来的安全风险和可管理性挑战。这种可信赖的通用的应用程序格式才是戴尔真正需要的,我们的物联网解决方案合作伙伴和商业客户都对构建一个可扩展的、IT 级的、充满活力的物联网应用生态系统有极大的兴趣。”

OpenWrt 的开发者 Matteo Croce 说:“这很简单, Snaps 可以在保持核心系统不变的情况下递送新的应用... Snaps 是为 OpenWrt AP 和路由器提供大量软件的最快方式。”

Shuttleworth 并不认为 Snaps 会取代已经存在的 Linux 程序包比如 RPMDEB。相反,他认为它们将会相辅相成。Snaps 将会与现有软件包共存。每个发行版都有其自己提供和更新核心系统及其更新的机制。Snap 为桌面系统带来的是通用的应用程序,这些应用程序不会影响到操作系统的基础。

每个 Snap 都通过使用大量的内核隔离和安全机制而限制,以满足 Snap 应用的需求。谨慎的审核过程可以确保 Snap 仅仅得到其完成请求操作的权限。用户在安装 Snap 的时候也不必考虑复杂的安全问题。

Snap 本质上是一个自包容的 zip 文件,能够快速地在包内执行。流行的优麒麟团队的负责人 Jack Yu 称:“Snaps 比传统的 Linux 包更容易构建,允许我们独立于操作系统解决依赖性,所以我们很容易地跨发行版为所有用户提供最好、最新的中国 Linux 应用。”

由 Canonical 设计的 Snap 程序包格式由 snapd 所处理。它的开发工作放在 GitHub 上。将其移植到更多的 Linux 发行版已经被证明是很简单的,社区还在不断增长,吸引了大量具有 Linux 经验的贡献者。

Snap 程序包使用 snapcraft 工具来构建。项目官网是 snapcraft.io,其上有构建 Snap 的指导和逐步指南,以及给项目开发者和使用者的文档。Snap 能够基于现有的发行版程序包构建,但通常使用源代码来构建,以获得优化和减小软件包大小。

如果你不是 Ubuntu 的忠实粉丝或者一个专业的 Linux 开发者,你可能还不知道 Snap。未来,在任何平台上需要用 Linux 完成工作的任何人都会知道这个软件。它会成为主流,尤其是在 Linux 应用程序的安装和更新机制方面。


via: http://www.zdnet.com/article/ubuntu-snap-takes-charge-of-linux-desktop-and-iot-software-distribution/

作者:Steven J. Vaughan-Nichols 译者:vim-kakali 校对:wxy

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

今日关注

Ubuntu 16.04 LTS 软件仓库中的快照打包工具 Snapcraft 更新到了 2.15 版本。这一版本中新增了对 Go 插件构建标签的支持,可以更细粒度的控制每一部分的平行构建;设置了对 Python2 插件的限制,允许 .yaml 文件指向外部资源。另外,Snapcraft 现在可以对包进行缓存。还有一些新的功能,可以使用下面的命令安装体验:

sudo apt update
sudo apt install snapcraft

可以使用下面的命令安装示例来对 snapcraft 进行学习:

sudo apt install snapcraft-examples
snapcraft --help

图文摘要

Linux 内核 3.2.82 LTS 发布,这一版本对 x86 的硬件体系结构以及 Btrfs 文件系统进行了改进。

Sylvia Ritter 为 Ubuntu Linux 绘制了25张超炫的壁纸。每一个新的 Ubuntu 版本都有一个代号,都是基于 真实的动物命名的,除了 Utuntu14.10(Utopic Unicorn)和 Ubuntu15.10(Wily Werewolf)这两个版本是基于虚构的角色命名。想要壁纸的可以去下载了。

Fedora 25 Linux 预计2016年11月5号发布,默认搭载 Wayland 。

Tux

  • 这个仓库收集了对任何用户/开发者都超赞的 Linux 应用软件。
  • 请随意 contribute / star / fork / pull request。欢迎一切推荐和建议。

更新:原英文库已经在 Gitbook 上发布,中文版阅读地址戳这里。你可以将这个链接分享给新用户,因为在上面阅读相比于在 github 上阅读会更加友好。可以在这里下载英文 pdf 版本。

应用

音频

  • Airtime - Airtime 是一款用于调度和远程站点管理的开放广播软件
  • Ardour - 在 Linux 上录音,编辑,和混音
  • Audacious - 开源音频播放器,按你想要的方式播放你的音乐,不占用你其它任务的电脑资源。
  • Audacity - 免费,开源,跨平台的声音录制、编辑软件。
  • Audio Recorder - 简单的声音录制软件,就在 ubuntu ppa。
  • Clementine - 播放无数的有损和无损音频格式。
  • Google Play Music - 非官方但很漂亮的跨平台 Google Play Music 桌面客户端。
  • Hydrogen - GNU/Linux 上的高级电子鼓。
  • K3b - K3b - Linux 上的 CD/DVD 创建工具 - 为 KDE 特别优化。
  • Kid3Qt - 编辑多媒体文件的标签,如一个专辑所有 mp3 文件的艺术家,专辑,年代,流派。
  • KxStudio - KXStudio 是专业声音创作应用和插件的集合。
  • Let's make music - 在你的 PC 上制作音乐,创造旋律和节拍,合成,混音,编曲小样以及更多内容。
  • Lollypop - Lollypop 是一款新的 GNOME 音乐播放应用。
  • Mixxx - 免费的 DJ 软件,给你一切现场混音所需要的,名副其实的 Traktor 替代品。
  • OSD Lyrics - 与你最爱的媒体播放器显示歌词。
  • Rhythmbox - 来自 GNOME 的音乐播放器。
  • SoundJuicer - CD 抓取工具,for GNOME
  • Tomahawk - 一种新的音乐播放器,集合你所有的流媒体,下载,音乐云存储,播放列表,电台等。

聊天客户端

  • GhettoSkype - Skype 的开源 web 封装。
  • HexChat - HexChat 是一款基于 XChat 的 IRC 客户端,但和 XChat 不一样的是它对 Windows 和 Unix-like 系统都是完全自由的。
  • Jitsi - Jitsi 是一款免费,开源的多平台语音,视频会议以及即时通讯应用,在 Windows, Linux, Mac OS X 和 Android 上可用。
  • Messenger for Desktop - Facebook messenger 应用。
  • Pidgin - 一款通用聊天客户端。
  • qTox - 一款简单的分布式,安全的通讯软件,支持音频和视频聊天。
  • ScudCloud - 一款 Linux 下的 Slack 客户端。
  • Skype - Skype 让世界保持沟通,免费的。
  • Telegram - 一款专注于速度和安全的消息应用,它非常快,简单而且免费。
  • Viber - Viber for Linux 让你在任何设备,网络和国家给其他 Viber 用户免费发送消息和通话。
  • Weechat - WeeChat 是一款快速,轻量级,可扩展的聊天客户端。
  • Whatsie - Whatsapp ubuntu/linux 非官方客户端。

数据备份与恢复

  • Borg Backup - 一款不错的的备份工具。
  • Photorec - PhotoRec 一款数据恢复应用,为恢复硬盘,CD-ROM 上包括视频,文档以及归档等文件而设计,以及数码相机存储中丢失的相片(Photorec 的由来)。
  • Qt4-fsarchiver - qt4-fsarchiver 是 fsarchiver 的图形化界面,能够保存/恢复分区,文件夹和 MBR/GPT 分区。这个程序是基于 Debian 的系统,Suse 以及 Fedora 适用的。
  • System Rescue CD - SystemRescueCd 是一款 Linux 系统急救盘,提供可启动的 CD-ROM 或 U 盘,用于管理系统在崩溃后修复系统和数据。
  • Test Disk - TestDisk 是一款强大的免费数据恢复软件!它主要设计用于帮助回去丢失的分区和/或修复由软件错误导致的硬盘无法启动引导。
  • Timeshift - TimeShift 是一款系统还原工具,它用 rsync 和硬链接创建系统的增量快照。快照可以在一段时间后用于恢复,撤销快照生成以来所做的所有更改。快照可以手动生成或用定时任务自动生成。

桌面个性化

  • Adapta Theme - 一款自适应的 Gtk+ 主题,遵循 Material 设计指南。
  • Arc Icon Theme - 一款可以和 Moka 图标主题一同使用的现代图标主题。
  • Arc Theme - 带有透明元素的扁平化主题
  • Compiz Config settings manager - OpenCompositing 项目带来的提高 X Window 系统可用性和生产力的 3D 桌面视觉特效。
  • Conky - Conky 是 X 下一款免费,轻量的系统监视器,可以在你桌面显示任何类型的信息。
  • Flatabulous - 一款扁平化主题,适用于 Ubuntu 以及其它基于 Gnome 的 Linux 系统。
  • Flatabulous Arc Theme - 我最爱的 ubuntu 主题。
  • Gnome Extensions - Gnome 桌面环境扩展插件。
  • Gnome Look - 大量社区创建的图标,shell 主题,字体,以及其他更多的可用来个性化你的 Gnome 桌面环境的资源,都在这一个站点。 Freeware
  • Irradiance Theme - 一款受 OSX Yosemite 启发的 Unity 主题,基于 Radiance。
  • Numix Icon Theme - Ubuntu 最好的图标主题之一。
  • Numix Theme - 一款很流行的主题。
  • Paper Icon Theme - Paper 是一款现代 freedesktop 图标主题,它的图表设计注重强烈的色彩和简单的几何形状。
  • Papirus Icon Theme - Ubuntu 最好的图标主题之一。
  • Unity Tweak Tool - Ubuntu unity 个性化必备应用。
  • Yosembiance theme - 一款受 OSX Yosemite 启发的 Ambiance 改款主题。

开发

  • Android studio - Android 的官方 IDE:Android Studio 提供在各种类型的安卓设备上构建应用最快的工具。
  • Aptana - Aptana Studio 利用了 Eclipse 的灵活性并且专注于让它成为强大的 web 开发引擎。
  • Arduino IDE - 开源的 Arduino 软件(IDE)让编写代码和上传代码到开发板变得简单。
  • BlueJ - 一款为新手设计的免费 Java 开发环境,世界范围内数百万人使用。
  • Clion - 一款强大的跨平台 C 以及 C++ IDE。
  • Code::Blocks - Code::Blocks 是一款为满足大部分用户需求构建的免费的 C,C++ 以及 Fortran IDE。它可扩展并且可配置性强。
  • Codelite - 一款免费,开源,跨平台的 C,C++,PHP,以及 Node.js IDE。
  • Eclipse - Eclipse 以 Java 集成开发环境而闻名,但它的 C/C++ IDE 和 PHP IDE 同样出色。
  • Fritzing - Fritzing 是一个开源硬件项目,它让电子部件变成人人都能接触到的创造性材料。
  • Geany - Geany 是一款基于 GTK+ 的文本编辑器,带有基本的集成开发环境特性。它的开发是为了提供一个小型并且快速的 IDE,对其它包只有很少的的依赖。
  • Genymotion - Genymotion 是一款可以用来替代默认安卓模拟器的第三方模拟器。
  • Git - Git 是一款免费和开源的分布式版本管理系统,被设计用来快速和高效地处理从小项目到大项目的一切内容。
  • IntelliJ IDEA - 强大的 Java IDE。
  • Ipython - 强大的 Python shell。
  • Jupyter Notebook - 开源,交互式数据科学和科学计算,支持超过 40 种编程语言。
  • KDevelop - 免费,开源 IDE,全功能,支持插件扩展的 C/C++ 以及其它编程语言 IDE。
  • Komodo Edit - 免费,开源的多语言开发环境。
  • MariaDB - 最流行的数据库服务器之一。由原 MySQL 开发者打造。
  • MonoDevelop - 跨平台的 C#,F# 以及更多语言的 IDE。
  • Nemiver - Nemiver 项目编写集成到 GNOME 桌面环境的独立图形调试器。
  • Netbeans - NetBeans IDE 让你快速而且容易地开发 Java 桌面,移动以及 web 应用,还有基于 HTML,JavaScript 以及 CSS 的 HTML5 应用。
  • NodeJS - Node.js® 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境。
  • Oh-my-zsh - 一个由社区驱动,优雅的 zsh 配置管理框架。
  • Postgresql - PostgreSQL 是一款强大,开源的对象-关系型数据库系统。
  • Postman - Postman,帮助我们快速测试 API。
  • PyCharm - 强大的 Python IDE。
  • QT Creator - 全功能跨平台集成开发环境,轻松创建互联设备,用户界面以及应用程序。
  • Rabbit VCS - RabbitVCS 是一个图形工具的集合,提供一个与你使用的版本控制系统简单而直接的访问方式。
  • Sqlite Browser - 可视化创建,管理,以及查看 sqlite 数据库文件。
  • Swift - Swift 是一个通用编程语言,基于更现代的安全,性能,和软件设计模式为目标设计。
  • Ubuntu-SDK - Ubuntu 官方 SDK。
  • Zsh - 一款强大的命令行 shell。

电子书工具

  • Calibre - 难以置信的丑但很强大的电子书管理和转换软件。
  • Evince - Evince 是一款支持多种格式的文档查看器。Evince 的目标是用一个简单的应用取代已经存在于 GNOME 桌面的多种文档查看器。
  • FBReader - 最流行的电子阅读应用之一。
  • Foxit - Foxit Reader 8.0——获得殊荣的 PDF 阅读器。
  • Lucidor - Lucidor 是一个阅读和处理电子书的电脑软件。Lucidor 支持 EPUB 格式的电子书和 OPDS 格式的目录。
  • MasterPDF editor - Master PDF Editor 一款方便而智能的 Linux PDF 编辑器。
  • MuPDF - 一款轻量级的 PDF 和 XPS 查看器。
  • Okular - Okular 由 KDE 原始开发的通用文档查看器。Okular 可以在多个平台上工作,包括但不限于 Linux,Windows,Mac OS X,*BSD 等等。
  • qpdf - qpdfview 是一款标签页式文档查看器。
  • Sigil - Sigil 是一款多平台 EPUB 电子书编辑器。

编辑器

  • Atom - 21 世纪的可 hack 文本编辑器。
  • Bluefish - Bluefish 是一款面向程序员和 web 开发者的强大编辑器,带有很多编写网站,脚本和代码的选项。
  • Brackets - 懂 web 设计的现代文本编辑器。
  • Emacs - 可扩展,可个性化,免费/自由的文本编辑器——还有更多。
  • Geany - Geany 是一款使用了 GTK+ 工具集的文本编辑器,带有基本的集成开发环境功能。它的开发是为了成为一个小型又快速的 IDE,对其它包仅有不多的依赖。
  • Gedit - gedit 是 GNOME 文本编辑器。尽管以简单易用为目标,gedit 仍然是个强大的多功能编辑器。
  • Kate - Kate 是一个多文档编辑器,从 KDE 2.2 开始就是 KDE 的一部分了。
  • Lighttable - 下一代代码编辑器!支持实时编码。
  • Sublime - 有史以来最好的编辑器之一。
  • Vim -Vim 是一个高级文本编辑器,寻求以更完整的功能集提供事实上的 Unix 编辑器“Vi”的强大功能。无论你已经在使用 vi 或其它编辑器,它都十分有用。
  • VSCode - Visual Studio Code 是一款轻量但强大的代码编辑器,提供 Windows,OS X 以及 Linux 版本。它内置了 JavaScript,TypeScript 以及 Node.js 支持,并且对其它语言(C++,C#,Python,PHP)还有丰富的插件系统和运行环境。

教育

  • BibleTime - BibleTime 是一款基于 Sword 库和 Qt 工具集的圣经学习应用。
  • Celestia - 免费的空间模拟器,让你在三维空间中探索我们的宇宙。
  • Chemtool - Chemtool 是一款在 Linux 上绘制化学结构的小程序。
  • Epoptes - 一款开源的计算机实验室管理和监视工具。
  • Gcompris - GCompris 是一款高质量教育软件,由无数适合 2 到 10 岁儿童的活动组成。
  • Geogebra - 图形计算器,支持函数,几何,代数,微积分,统计以及 3D 数学。
  • GNU Typist - 基于 ncurses 的免费打字教学软件
  • GNUKhata - 开源会计软件。
  • Google Earth - Google Earth 是一款虚拟地球,地图以及地理信息程序。
  • GPeriodic - GPeriodic 是一个 Linux 上的元素周期表应用。
  • ITalc - iTALC 是一款为老师准备的实用并且强大的教学工具。它让你有多种方式查看和控制你网络中的其它计算机。
  • KDE Edu Suite - 基于 KDE 技术的免费教育软件。
  • MAPLE - Maple 是一款数学软件,它结合了世界上最强大的数学引擎以及一个让它十分易于分析,探索,可视化以及解决数学问题的界面。
  • MATLAB - MATLAB 平台专为剞劂工程和科学问题优化。MATLAB 让你的想法不仅仅停留在桌面。你可以在巨大的数据集上进行你的分析并按比例增加你的集群和云。
  • Maxima - Maxima 是一个处理符号和数值表达式的系统,包括微分,积分,泰勒级数,拉普拉斯变换,常微分方程,线性方程组....
  • Moodle - Course management system for online learning.
  • OpenEuclid - OpenEuclide 是一款 2D 几何软件:数据由描述形式化的几何约束动态定义。
  • OpenSIS - 学校管理软件。
  • Scipy - SciPy 是一个基于 Python 的开源软件生态系统,面向数学,科学,以及工程学。
  • Scratch - 有了 Scratch,你可以编程你自己的互动故事,游戏,以及动画——并且在在线社区和其他人分享你的创造。
  • Stellarium - Stellarium 是一个为你电脑准备的免费开源天文馆。
  • Tux4Kids - Tux4Kids 为孩子们开发高质量软件,目标是将乐趣和学习结合到一起。
  • UGENE - UGENE 是一款免费开源,跨平台,基于图形界面的生物信息学软件。

电子邮件

  • Evolution - Evolution 是一款个人信息管理应用,集成了邮件,日历以及地址簿功能。
  • Geary - Geary 是一款为 GNOME 3 构建的电子邮件应用。它让你可以在一个简单,现代的界面上阅读和发送邮件。
  • Mailnag - Mailnag 是一个向 POP3 和 IMAP 服务器检查新邮件的守护程序。
  • N1 - 在现代 web 上构建的可扩展桌面邮件应用。
  • Sylpheed - 轻量化,用户友好的电子邮件客户端。
  • Thunderbird - Thunderbird 是一款免费的电子邮件客户端,设置以及个性化简单方便,功能强大。
  • Wmail - Gmail & Google Inbox 的非官方 Linux 桌面客户端。

文件管理器

  • 7Zip - 解压任何压缩文件
  • AngrySearch - Linux 文件搜索,结果输入即得。
  • Double Commander - Double Commander 是一款跨平台的开源双栏文件管理器。它受 Total Commander 启发并有自己的新想法。
  • Marlin - 文件管理器界最性感的成员,Marlin 为速度,简单和易用精心设计。
  • Nautilus - Nautilus(Files)鹦鹉螺是为适配 Gnome 桌面设计和行为所设计的文件管理器,给用户一个简单的方式导航和管理文件。
  • Nemo - Nemo 是一款 Cinnamon 桌面环境下的文件管理器。
  • QDirStat - 基于 Qt 的文件夹统计——不用 KDE 的 KDirStat,来自原 KDirStat 开发者的作品。
  • Ranger - Ranger 是一款使用 VI 快捷键的终端文件管理器。
  • Synapse - Linux 上最好的应用启动器。
  • Thunar - Thunar 被设计成为 Xfce 4.6 的默认文件管理器,为快速和易用设计。

游戏

  • 0 A.D - 类帝国时代的开源即时战略游戏。
  • Civilization5 - 席德梅尔的文明®被认为是有史以来最伟大的策略经营类游戏之一。
  • Cockatrice - Cockatrice 是一个开源的多平台网络桌面卡牌游戏支持程序。
  • Desura - Desura 是一个社区驱动的游戏玩家数字分发服务,将来自开发者的最好的游戏,模组,以及可下载内容放在玩家的指尖,随时可以购买和游玩。
  • GBrainy - Gbrainy 是一个脑筋急转弯游戏,获得乐趣并且锻炼你的大脑。
  • Minecraft - Minecraft 是一个关于放置方块和冒险的游戏。探索随机生成的世界,建造惊奇的事物,从最简单的家到最伟大的城堡。
  • Minetest - 开源的 Minecraft 实现,由 C++ 写就(占用更少的资源),还包含模组扩展 API。
  • PlayOnLinux - 在 Linux 玩 Windows 游戏。
  • Simutrans - Simutrans 是一个免费而且开源的运输模拟器。
  • Steam - 超赞的游戏平台,打开众多游戏的大门。
  • SuperTuxCar - SuperTuxKart 是一款 3D 开源的赛车竞技游戏,有不同的人物,赛道以及模式。
  • The Battle for Wesnoth - 免费,回合制策略游戏,幻想世界主题,有单人以及在线多人对战模式。
  • Warzone2100 - 开源即时策略/即时战术游戏。
  • Wine - Wine(“Wine Is Not an Emulator”的首字母缩写)是一个兼容层,可以在若干 POSIX 兼容的系统上运行 Windows 程序,比如 Linux,Mac OS X,以及 BSD
  • Xonotic - 受 Unreal Tournament 以及 Quake 启发的竞技场射击游戏。

图形

  • Aftershot - 一个强大的 Adobe Photoshop 替代品!
  • Agave - Agave 是 GNOME 桌面下一个很简单的程序,让你可以从一个颜色开始生成各种不同的配色方案
  • Blender - 面向艺术家和小团队的免费开源的完整 3D 创作流水线。
  • Cinepaint - 开源绘画软件
  • Darktable - darktable 是一个开源的摄影处理软件,支持 RAW 文件处理
  • Digikam - digiKam 是一个高级的 Linux 数字相片管理应用
  • Feh - 轻量且快速的图片查看器。
  • Fotoxx - Fotoxx 是一个免费开源的图像编辑和收藏管理程序。
  • GIMP - GIMP 是一个自由分发的程序,可以进行照片修版,图像合成,图像编辑等操作
  • gThumb - gThumb 是一款图片查看和浏览器(它还包含一个导入工具,用于从相机导入照片)。
  • Hugin - 基于 Panorama Tools 的一款易用的跨平台全景图像工具链。
  • Inkscape - 不管你是插画家,设计师,web 设计师还是仅仅是需要创建一些矢量图像,它都是一款强大,免费的设计工具
  • Krita - 面向概念艺术家,数字画家以及插画艺术家的开源软件。
  • Lightworks - 专业的非线性视频编辑程序,有免费版本可用
  • Luminance HDR - Luminance HDR 是一款开源的图形化用户界面应用,它的目标是提供一整套的 HDR 图像工作流程。
  • Mypaint - Mypaint 是一款配合画板使用的绘画程序。
  • Ojo - 一款快速且漂亮的图像查看器。
  • OpenShot - OpenShot 是一款免费,易用,功能丰富的 Linxu 视频编辑器。
  • Photonic - Phototonic 是一款图片查看和组织工具。
  • Pinta - Pinta 是一款免费,开源的绘画及图片编辑程序。
  • Pitivi - 一款带有漂亮直观的用户界面的免费视频编辑器,有干净的代码库和出色的社区。
  • Radiance - Radiance - 一款经过验证的光照模拟工具
  • RawTherapee - 一款漂亮的但不那么著名的照片编辑应用。
  • Shotwell - Shotwell 是 GNOME 3 的图片管理器。
  • StopMotion - Linux Stopmotion 是一款免费,开源的定格动画创作应用。它可以帮你捕捉和编辑你动画的帧,并导出为一个单独的文件。
  • Xara Extreme - Xara Xtreme for Linux 是一款强大,通用,适用于 Unix 平台(包括 Linux, FreeBSD)的图形处理程序。

互联网

  • Anatine - 带有众多个性化的 twitter 桌面客户端。
  • Brave - Brave 是 macOS,Windows,Linux 平台上一款快速,优秀的桌面浏览器。
  • Chrome - 一款流行的浏览器,有着无数插件和应用。
  • Chromium - Chromium 是一个开源浏览器项目,专注于为所有用户带来更安全、快速和稳定的 web 体验。
  • Corebird - corebird 是一款原生 gtk+ twitter 桌面客户端。
  • Firefox - 一款流行的浏览器,有着无数插件和应用。
  • Midori - 一款轻量级的免费浏览器,在低端机器上可以完美运行。 .
  • Opera - Opera 浏览器是你畅游网络所需的一切。
  • Tor - Tor 是免费软件和一个开放网络,帮助你对抗流量分析(一种网络检测的方式,威胁个人自由与隐私)。
  • Vivaldi - 一款新兴的浏览器,有着许多的个性化配置。
  • Yandex - 快速方便的浏览器。

办公

  • Gummi gtk2|gtk3 - 带有模板,拼写检查以及向导的简单 latex 编辑器。
  • Caligra Office - 提供满足办公,图形以及管理需要的综合应用套件。
  • GnuCash - GnuCash 是一款自由的会计程序,实现了复式记账系统。它最初的目标是开发出与 Intuit, Inc. 的 Quicken 类似的功能,但它还有针对小企业会计的功能。
  • KMyMoney - KMyMoney 是 KDE 的一款个人金融管理器。它的操作类似 Microsoft Money 以及 Quicken。
  • LibreOffice - Linux 上的最佳办公套件。
  • LyX - 成熟的 LaTeX 渲染文档编辑器。
  • WPS office - Linux 上的最佳办公套件之一。

生产力

  • Alarm Clock - Alarm Clock 是一款全功能的 GNOME 或其它面板的闹钟。
  • Ambient Noise - 在 Linux 上安装环境噪声提高专注。
  • Autokey - 一款 Linux 桌面自动化工具,让你可以管理你的脚本和短语集合,并给它们分配缩写或者快捷键。
  • Basket Note Pads - 这个多用途的笔记应用帮助你记下所有类型的笔记。
  • Brightness - Ubuntu 下的一个亮度指示器。
  • Cairo-Dock - Cairo-Dock 是一个可自定义 dock,插件,面板等的桌面界面。
  • California - Calendar 应用的完整替代方案,可使用自然语言创建事件。
  • CopyQ -CopyQ 是一款高级剪贴板管理器,带有编辑和脚本功能。
  • Docky -Docky 是一款成熟的 dock 应用,让打开常用应用和管理窗口变得更加简单和快速。
  • f.lux - 根据光线自动调节你的电脑屏屏幕显示。
  • Gnome-dictionary - GNOME 下的一款强大的字典。
  • Go For It - Go For It! 是一款简单又时尚的生产力工具,主打待办清单,结合定时器让你专注于当前的任务。
  • Gpick - Gpick 让你可以从桌面任何地方取色,并且它还提供一些其它的高级特性!
  • My Todo - Mytodo 是一款开源的待办事项程序,让你能够掌控一切。
  • My Weather Indicator - Ubuntu 下的天气指示器和插件。
  • Notepadqq - Notepadqq 是 Linux 下一款类 Notepad++ 的编辑器。
  • Notes - 一款干净又简单的 Linux 笔记应用。
  • Papyrus - Papyrus 是一款不一样的笔记管理器,它专注于安全和更佳的用户界面。Papyrus 尝试给用户提供一个易用和智能的用户界面。
  • Plank - Plank 注定要成为这个星球上最简洁的应用 dock。
  • Pomodone App - PomoDoneApp 使用番茄钟技术®,是在你当前任务管理服务上追踪你的工作流最简单的方法。
  • Recent Noti - 一款显示最近通知消息的指示器。
  • Redshift - Redshift 根据你的周边调整你屏幕的色温。当你夜晚在屏幕前工作时,它也许能帮助你减少对眼睛的伤害。
  • Shutter - Shutter 基于 Linux 的系统上(比如 Ubuntu)的一款功能丰富的截屏软件。
  • Simplenote - 跨平台笔记软件。Evernote 的竞争者。
  • SpeedCrunch - 一个漂亮,开源,高精度的科学计算器。
  • Springseed - 面向日常用户简单又漂亮的一款笔记软件。
  • Stickynote - Linux 桌面的便利贴。
  • TaskWarrior - Taskwarrior 是一款免费,开源的的软件,它可以从命令行管理你的待办事项列表。
  • Todo.txt - todo.txt-专注的编辑器,用最少的组合键和点击帮助你管理你的任务。
  • Todoist - Todoist 的非官方客户端。Todoist 是带有移动客户端的跨平台待办事项管理器,有着优秀的用户界面以及一些可选的高级特性。
  • Tomboy - Tomboy 是一款简单易用的桌面笔记应用。
  • Undistract me - 在长时间执行的终端命令结束的时候提醒你。
  • WizNote - 一个跨平台云笔记客户端。
  • Xmind - 脑图工具。
  • Zim - 一款图形化的文本编辑器,用来维护一系列的维基页面,对笔记和文档而言也很棒。资料以纯文本的形式保存,更便于版本管理。

安全

  • ClamAV - Clam 防病毒
  • Fail2ban - Fail2ban 扫描日志文件(例如 /var/log/apache/error\_log)并将有恶意气息的 IP 封禁——过多的错误密码尝试,寻找可利用漏洞等行为。
  • GnuPG - Gnu 隐私守卫
  • GuFW - Linux 世界中最简单的防火墙之一。
  • OpenSSH - OpenSSH 安全 Shell 服务器以及客户端。
  • Seahorse - GnuPG 的 Gnome 前端。
  • Tcpdump - TCP 调试/抓包工具。

文件共享

  • aria2 - aria2 是一个轻量级的多协议以及多来源命令行下载工具。
  • CrossFTP - CrossFTP 让 FTP 相关的任务管理变得无比简单。
  • D-lan - 一个免费的局域网文件分享软件。
  • Deluge - Deluge 是一款轻量级,免费的跨平台 BT 客户端。
  • Dropbox - Dropbox 是一个免费的云存储服务,让你可以将照片,文档和视频带到任何地方并轻松分享。
  • Filezilla - 免费的 FTP 解决方案
  • Flareget - 全功能,多线程下载管理器以及加速器。
  • Meiga - 一个让你可以通过 web 共享你选定的本地文件夹的工具。
  • ownCloud - ownCloud 的目标是不论在哪都能让你访问到你的文件。
  • PushBullet - Pushbullet 将你的设备连接,让它们感觉像是一体的。
  • qBittorent - qBittorrent 计划的目标是提提供一个 µTorrent 的自由软件替代方案。
  • Quazaa - 一款跨平台的多重网络点对点(P2P)文件分享客户端。
  • SpiderOak - 关注隐私的团队及商业实时协作。
  • Syncthing - Syncthing 用开放,值得信赖,去中心化的方案取代专有的同步和云服务。
  • Teamviewer - PC 远程控制/远程访问软件,对个人使用免费。
  • Transmission - 简单,轻量级,多平台的 torrent 客户端。
  • uGet - Linux 下最好的下载管理器。
  • uTorrent - 优雅,高效的 torrent 下载。
  • Vuze - Bittorrent 点对点下载客户端,满足你的所有 torrent 下载需要。

终端

  • GnomeTerminal - Linux 世界广泛预装的终端模拟器。
  • Guake - Guake 是 Gnome 下的一款顶部下拉式的终端。
  • Konsole - KDE 桌面环境的最佳终端。
  • RXVT-Unicode - rxvt-unicode 是著名的终端模拟器的一个分支。
  • RXVT - 一款 X11 终端模拟器,流行的‘xterm’替代品。
  • Sakura - 简单但是强大,基于 libvte 的终端模拟器,支持 utf-8 并且通过 gtk+ 和 pango 库提供输入法。
  • Terminator - 很明显 Linux 上最强大的终端模拟器是功能丰富的 Terminator(终结者)。
  • Termit - 基于 vte 库的简单终端模拟器,可通过 Lua 扩展。
  • Xterm - Xterm 是一个 X 窗口系统的终端模拟器。它给不直接使用窗口系统的程序提供了 DEC VT102 和 Tektronix 4014 兼容终端。
  • Yakuake - 一款基于 KDE Konsole 技术的 Quake 风格的终端模拟器。

实用工具

  • Actionaz - Ubuntu/Linux 下的任务自动化工具。
  • Bleach bit - BleachBit 快速释放磁盘空间并不知疲倦地守卫你的隐私。释放缓存,删除 cookie,清除互联网浏览历史,清理临时文件,删除日志,以及更多功能...
  • Brasero - CD/DVD 烧录软件。
  • Caffeine - 防止 ubuntu 自动睡眠。
  • Clonezilla - Clonezilla 是一款分区以及磁盘镜像/克隆程序,类似 True Image® 或 Norton Ghost®。
  • Convertall - 全能单位换算。
  • EasyStroke - Easystroke 是一个 X11 手势识别应用。
  • Enpass - Enpass 安全地管理你的密码和重要信息,让你的生活更轻松。
  • GD map - 可视化磁盘使用量的工具。
  • Gloobus-Preview - 它能给你提供文件的快速预览,类似 Sushi
  • Gnormalize - 音频转换工具。
  • GParted - Ubuntu/Linux 磁盘分区工具。
  • GRadio - Ubuntu linux 无线电广播软件。
  • Handbrake - 视频转换工具。
  • ImageMagik - ImageMagick 是一套图片修改和处理的命令行工具。
  • Indicator-SysMonitor - 一款可显示 cpu 温度,内存,网速,cpu 使用率,公网 IP 地址以及联网状态的应用指示器。
  • KeePassX - 跨平台密码管理器。KeePass 的移植成果。
  • KeePass - 专注于 Windows 的密码管理器,通过 Mono 提供一些跨平台支持。
  • LastPass - 跨平台密码管理器。
  • Peazip - 解压任何文件的工具。
  • Powertop - 能源消耗诊断工具。
  • Psensor - Linux 图形化硬件温度监视器。
  • Pulse Audio - 通过个性化的配置改善 Linux 的音频。
  • Remarkable - Ubuntu/Linux 上最佳的 Markdown 编辑器。
  • Remmina - 一款功能丰富的远程桌面应用,支持 Linux 以及其它 Unix。
  • Sushi - Sushi 是 GNOME 桌面文件管理器鹦鹉螺(Nautilus)的快速预览工具。
  • Synaptic - Synaptic 是一款图形化的 apt 包管理程序。
  • Systemload - 在状态栏显示系统负载。
  • TLP - 优化 Linux 下的电池表现。
  • Variety - Variety 是一款开源的 Linux 壁纸更换软件,拥有众多功能,轻巧又易用。
  • Virtualbox - VirtualBox 是一款通用的 x86 硬件虚拟机软件,面向服务器,桌面以及嵌入式。
  • WallpaperChange - 自动更换你的壁纸。
  • Workrave - 一款帮助恢复以及防止重复性劳损的程序(RSI)。
  • Xtreme Download Manager - 一款有着新鲜用户界面的下载管理器。

视频

  • Bomi Player - 一款强大易用的多媒体播放器。
  • Cheese - Cheese 用你的摄像头拍照和录像,还能加上神奇的特效,让你能够和别人分享快乐。
  • Kodi - 一款获得殊荣的免费开源(GPL)软件,支持视频,音乐,图片,游戏以及更多内容的媒体中心。
  • Miro - 免费,开放的视频,音乐以及互联网电视应用;它从成千上万的资源中带来视频频道,并且还有比其它平台更丰富的免费高清资源。
  • MPlayer - MPlayer 是一款支持多种系统和各种视频的视频播放器。
  • MPV - 一款免费,开源,跨平台的媒体播放器。
  • SMPlayer - 内置解码器的免费媒体播放器。可播放所有的音频和视频格式。
  • SVP - SVP 让你可以使用帧插值在你的桌面电脑上观看任何视频,就像高端电视和投影仪支持的那样。
  • VLC - VLC 是一个免费且开源的跨平台媒体播放器以及框架,可以播放大多数格式的多媒体文件以及 DVS,音频 CD,VCD,以及各种流媒体协议。

其它

  • GrubCustomizer - Grub Customizer 是一个让你可以配置 GRUB2/BURG 设置和启动项的图形化界面。
  • Mycroft - 给所有人的 A.I.

命令行工具

  • Bastet - 在命令行玩俄罗斯方块。
  • Daily Reddit Wallpaper - 开机时将壁纸更换为 /r/wallpapers 或其它子版块的今日最高票壁纸。
  • Fishfry - 将 fish 的历史记录替换成为渗透测试人员量身定制的高效版本以及方便新手学习。
  • htop - 带有改进的特性和用户体验的 top。
  • Pacman4console - 在控制台玩吃豆人。
  • Tmux - 它让你在一个终端中在多个程序间方便地切换,分离他们(保持在后台运行)并另一个终端中重新连接上去。以及还有好多事情可以做。
  • 十佳命令行工具
  • wicd-curses - 命令行 WiFi 连接管理器。

桌面环境

  • Budgie - Budgie 是一个面向现代用户思想设计的桌面环境,专注于简洁与优雅。
  • Cinammon - Cinnamon 努力提供一种传统的用户体验。Cinnamon 是一个 GNOME 3 的 fork。
  • GNOME Flashback - GNOME Flashback 是 GNOME 3 的一个 shell,最初叫 GNOME fallback 模式。桌面的布局和底层技术都与 GNOME 2 相似。
  • Gnome - GNOME 桌面环境是一个有吸引力且直观的的桌面,同时有现代(GNOME)和经典(GNOME Classic)会话模式。
  • KDE Plasma - KDE Plasma 桌面环境是一个熟悉的工作环境。Plasma Desktop 提供现代桌面环境体验所需的所有工具,所以你可以从开始就充满生产力。
  • LXDE - Lightweight X11 Desktop Environment (轻量化 X11 桌面环境)是一个快速且节能的桌面环境。
  • LXQt - LXQt 是 LXDE 的 Qt 移植和即将到来的版本,轻量化的桌面环境。
  • Mate - Mate 用传统隐喻给 Linux 用户提供一个直观又有吸引力的桌面。MATE 是 GNOME 2 的一个 fork。
  • Pantheon - Pantheon 是最初为发行版 elementary OS 创建的桌面环境,同时也是它的默认桌面环境。
  • Unity - Unity 是 GNOME 的一个 shell,由 Canonical 为 Ubuntu 设计。
  • Xfce - Xfce 体现了模块化和可重用的传统 UNIX 哲学。

显示管理

控制台

  • CDM - 超简化,又功能丰富,用 bash 写就的登陆管理器。
  • Console TDM - 纯 bash 写就的 xinit 扩展。
  • nodm - 简约的自动登陆显示管理器。

图形界面

  • Entrance - 基于 EFL 的显示管理器,高度实验性质。
  • GDM - GNOME 显示管理器。
  • KDM - KDE4 显示管理器(不再继续开发)。
  • LightDM - 跨桌面显示管理器,可以使用任何工具集写就的各种前端。
  • LXDM - LXDE 显示管理器,可以独立于 LXDE 桌面环境使用。
  • MDM - MDM 显示管理器,在 Linux Mint 中使用, GDM 2 的一个 fork。
  • SDDM - 基于 QML 的显示管理器,KDE 4 的 kdm 的继任者;Plasma 5 以及 LXQt 推荐。
  • SLiM - 轻量且优雅的图形化登录解决方案(不再继续开发)。
  • XDM - 带有 XDMCP,主机选择支持的 X 显示管理器。

窗口管理

合成器

  • Compton - Compton 是一款独立的合成管理器,适合同没有原生提供合成功能的窗口管理器一同使用。
  • Xcompmgr - Xcompmgr 是一个简单的合成管理器,能够渲染下拉阴影,使用 transset 工具的话,还可以实现简单的窗口透明。

叠加式窗口管理器

  • 2bwm - 快速的浮动窗口管理,有两个特殊边界,基于 XCB 库,由 mcwm 衍生。
  • Blackbox - 快速,轻量化的 X 窗口系统窗口管理器,没有那些烦人的库依赖。
  • Fluxbox - 基于 Blackbox 0.61.1 代码的 X 窗口管理器。
  • Openbox - 高度可配置,带有可扩展标准支持的下一代窗口管理器。

平铺式窗口管理器

  • Bspwm - bspwm 是一个平铺式窗口管理器,将窗口以二叉树的叶结点的方式展现。
  • Herbstluftwm - 使用 Xlib 和 Glib 的手工平铺式窗口管理器。

动态窗口管理器

  • awesome - 高度可配置,下一代 X 框架窗口管理器。
  • dwm - X 动态窗口管理器。它以平铺,单片镜以及浮动布局的方式管理窗口。
  • i3 - 完全重写的平铺式窗口管理器。
  • spectrwm - X11 小型动态窗口管理器,很大程度上受了 xmonad 和 dwm 的启发。
  • xmonad - 动态平铺式 X11 窗口管理器,用 Haskell 写就和配置。

设置

Ubuntu

Arch Linux

其它发行版

待添加

论坛

Ubuntu

Arch Linux

IRC 频道

Linux 新闻,应用,以及更多...

Reddit

学习 Linux

Linux Hacking/开发

贡献者

贡献者列表 :

  1. LuongVo
  2. anewuser
  3. nathanmusoke
  4. bpearson
  5. orestisf1993
  6. lasseborly
  7. sebasspf
  8. buivnhai
  9. ankurk91
  10. mAzurkovic
  11. bocklund
  12. grebenschikov
  13. fareez-ahamed
  14. MichaelAquilina
  15. Wamadahama
  16. Alasin
  17. LYF610400210
  18. willmtemple 纠正库名称
  19. jakub-olczyk
  20. shakib609
  21. talisk
  22. smdrz
  23. bishoyh
  24. Voicu
  25. ryandaniels
  26. mame98
  27. Kastmeski
  28. johnjago
  29. shuliandre
  30. stelariusinfinitek
  31. tnga
  32. hg8
  33. ChrisLeeGit
  34. 在 @ reddit.com/r/linux & reddit.com/r/ubuntu & vozforums.com 上每个提出建议和赞赏的人 ...
    (以上列表更新于 15th August 2016)

贡献指南

将应用的名称放入列表。 链接到它的主页或安装指南。 再给应用写一小段简短的介绍 + 添加图标。 确保应用放在了合适的主题下。 如果应用不在以上任何一个已有的主题内,为它新建一个主题。 确保所有项都是按字母表顺序排序的。

标有 的是开源软件并且链接到源代码。标有 的意为免费(就如免费的啤酒)。

原作者注:最近我收到了一些关于列表中一些应用软件的质量的反馈。我自己测试了其中的大部分应用(但不是全部)。如果你对应用有任何问题:-> 去往开发页面(如果有的话)-> 给开发提个 issue -> 在这里提个 issue 以便我考虑是否将应用移出列表。记住:所有东西都有它自己的质量,所以这里永远不会有“最佳应用”或“选择性的列表”,谢谢。

许可证

该作品签署于 Creative Commons Attribution 4.0 International License

Ben Firshman 最近在 Dockercon 做了一个关于使用 Docker 构建无服务应用的演讲,你可以在这里查看详情(还有视频)。之后,我写了一篇关于如何使用 AWS Lambda 构建微服务系统的文章

今天,我想展示给你的就是如何使用 Docker Swarm 部署一个简单的 Python Falcon REST 应用。这里我不会使用dockerrun 或者是其他无服务特性,你可能会惊讶,使用 Docker Swarm 部署(复制)一个 Python(Java、Go 都一样)应用是如此的简单。

注意:这展示的部分步骤是截取自 Swarm Tutorial,我已经修改了部分内容,并且增加了一个 Vagrant Helper 的仓库来启动一个可以让 Docker Swarm 工作起来的本地测试环境。请确保你使用的是 1.12 或以上版本的 Docker Engine。我写这篇文章的时候,使用的是 1.12RC2 版本。注意的是,这只是一个测试版本,可能还会有修改。

你要做的第一件事,就是如果你想本地运行的话,你要保证 Vagrant 已经正确的安装和运行了。你也可以按如下步骤使用你最喜欢的云服务提供商部署 Docker Swarm 虚拟机系统。

我们将会使用这三台 VM:一个简单的 Docker Swarm 管理平台和两台 worker。

安全注意事项:Vagrantfile 代码中包含了部分位于 Docker 测试服务器上的 shell 脚本。这是一个潜在的安全问题,它会运行你不能控制的脚本,所以请确保你会在运行代码之前审查过这部分的脚本

$ git clone https://github.com/chadlung/vagrant-docker-swarm
$ cd vagrant-docker-swarm
$ vagrant plugin install vagrant-vbguest
$ vagrant up

Vagrant up 命令需要一些时间才能完成。

SSH 登录进入 manager1 虚拟机:

$ vagrant ssh manager1

在 manager1 的 ssh 终端会话中执行如下命令:

$ sudo docker swarm init --listen-addr 192.168.99.100:2377

现在还没有 worker 注册上来:

$ sudo docker node ls

让我们注册两个新的 worker,请打开两个新的终端会话(保持 manager1 会话继续运行):

$ vagrant ssh worker1

在 worker1 的 ssh 终端会话上执行如下命令:

$ sudo docker swarm join 192.168.99.100:2377

在 worker2 的 ssh 终端会话上重复这些命令。

在 manager1 终端上执行如下命令:

$ docker node ls

你将会看到:

在 manager1 的终端里部署一个简单的服务。

sudo docker service create --replicas 1 --name pinger alpine ping google.com

这个命令将会部署一个服务,它会从 worker 之一 ping google.com。(或者 manager,manager 也可以运行服务,不过如果你只是想 worker 运行容器的话,也可以禁用这一点)。可以使用如下命令,查看哪些节点正在执行服务:

$ sudo docker service tasks pinger

结果会和这个比较类似:

所以,我们知道了服务正跑在 worker1 上。我们可以回到 worker1 的会话里,然后进入正在运行的容器:

$ sudo docker ps

你可以看到容器的 id 是: ae56769b9d4d,在我的例子中,我运行如下的代码:

$ sudo docker attach ae56769b9d4d

你可以按下 CTRL-C 来停止服务。

回到 manager1,然后移除这个 pinger 服务。

$ sudo docker service rm pinger

现在,我们将会部署可复制的 Python 应用。注意,为了保持文章的简洁,而且容易复制,所以部署的是一个简单的应用。

你需要做的第一件事就是将镜像放到 Docker Hub上,或者使用我已经上传的一个。这是一个简单的 Python 3 Falcon REST 应用。它有一个简单的入口: /hello 带一个 value 参数。

放在 chadlung/hello-app 上的 Python 代码看起来像这样:

import json
from wsgiref import simple_server

import falcon


class HelloResource(object):
    def on_get(self, req, resp):
        try:
            value = req.get_param('value')

            resp.content_type = 'application/json'
            resp.status = falcon.HTTP_200
            resp.body = json.dumps({'message': str(value)})
        except Exception as ex:
            resp.status = falcon.HTTP_500
            resp.body = str(ex)


if __name__ == '__main__':
    app = falcon.API()
    hello_resource = HelloResource()
    app.add_route('/hello', hello_resource)
    httpd = simple_server.make_server('0.0.0.0', 8080, app)
    httpd.serve_forever()

Dockerfile 很简单:

FROM python:3.4.4

RUN pip install -U pip
RUN pip install -U falcon

EXPOSE 8080

COPY . /hello-app
WORKDIR /hello-app

CMD ["python", "app.py"]

上面表示的意思很简单,如果你想,你可以在本地运行该进行来访问这个入口: http://127.0.0.1:8080/hello?value=Fred

这将返回如下结果:

{"message": "Fred"}

在 Docker Hub 上构建和部署这个 hello-app(修改成你自己的 Docker Hub 仓库或者使用这个):

$ sudo docker build . -t chadlung/hello-app:2
$ sudo docker push chadlung/hello-app:2

现在,我们可以将应用部署到之前的 Docker Swarm 了。登录 manager1 的 ssh 终端会话,并且执行:

$ sudo docker service create -p 8080:8080 --replicas 2 --name hello-app chadlung/hello-app:2
$ sudo docker service inspect --pretty hello-app
$ sudo docker service tasks hello-app

现在,我们已经可以测试了。使用任何一个 Swarm 节点的 IP 来访问 /hello 入口。在本例中,我在 manager1 的终端里使用 curl 命令:

注意,Swarm 中的所有的 IP 都可以,不管这个服务是运行在一台还是更多的节点上。

$ curl -v -X GET "http://192.168.99.100:8080/hello?value=Chad"
$ curl -v -X GET "http://192.168.99.101:8080/hello?value=Test"
$ curl -v -X GET "http://192.168.99.102:8080/hello?value=Docker"

结果:

* Hostname was NOT found in DNS cache
*   Trying 192.168.99.101...
* Connected to 192.168.99.101 (192.168.99.101) port 8080 (#0)
> GET /hello?value=Chad HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 192.168.99.101:8080
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Tue, 28 Jun 2016 23:52:55 GMT
< Server: WSGIServer/0.2 CPython/3.4.4
< content-type: application/json
< content-length: 19
< 
{"message": "Chad"}

从浏览器中访问其他节点:

如果你想看运行的所有服务,你可以在 manager1 节点上运行如下代码:

$ sudo docker service ls

如果你想添加可视化控制平台,你可以安装 Docker Swarm Visualizer(这对于展示非常方便)。在 manager1 的终端中执行如下代码:

$ sudo docker run -it -d -p 5000:5000 -e HOST=192.168.99.100 -e PORT=5000 -v /var/run/docker.sock:/var/run/docker.sock manomarks/visualizer

打开你的浏览器,并且访问: http://192.168.99.100:5000/

结果如下(假设已经运行了两个 Docker Swarm 服务):

要停止运行 hello-app(已经在两个节点上运行了),可以在 manager1 上执行这个代码:

$ sudo docker service rm hello-app

如果想停止 Visualizer, 那么在 manager1 的终端中执行:

$ sudo docker ps

获得容器的 ID,这里是: f71fec0d3ce1,从 manager1 的终端会话中执行这个代码:

$ sudo docker stop f71fec0d3ce1

祝你成功使用 Docker Swarm。这篇文章主要是以 1.12 版本来进行描述的。


via: http://www.giantflyingsaucer.com/blog/?p=5923

作者:Chad Lung 译者:MikeCoder 校对:wxy

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

Fedora 开发团队正在非常努力的开发下一代版本 Fedora 25,这将带来最新的技术改进。

Wayland 就是一个新的技术,这个下一代显示服务器的设计目标即是替代老旧的 X.Org 服务器(即 X11)。X11 被几乎所有的 GNU/Linux 操作系统用作默认的显示服务器,但是 X11 本身有很多安全隐患,却由于种种原因而不能修复。所以,多年以来一直有呼声要求设计新的显示服务器以取代已经用了几十年的 X11 服务器,而 Wayland 就是被寄予期望的一个替代品。

Wayland 的取代过程虽然很慢,但是一直在继续。许多开源软件,比如说 GNOME 和 KDE 家族的那些软件都在积极支持新的 Wayland 显示服务器,除此之外, Enlightenment 家族和其它那些虽然不属于桌面环境家族,但也活跃开发的软件也对 Wayland 表示了支持。另外,Canonical 公司开发了一个他们自己的显示服务器,叫 Mir,也是用来替代 X11 的,不过目前只在 Ubuntu 家族取得了一定进展。

Fedora 作为 Linux 发行版界的技术先锋,总是积极地在他们的发行版中采用各种新的技术,比如 Systemd,也比如 Wayland。虽然因此带来一些负面结果——比如发布延期、稳定性和兼容性有时候不太好,但是作为一个为 RHEL 和 CentOS 趟路的发行版,似乎也无可厚非——Just for fun,新技术总是好玩的,不是么?

从 Fedora 24 开始,他们就想着在 Fedora 里面默认采用 Wayland 显示服务器,但是直到发布时,也没完全搞好,只能将这个重任放到下一个版本,即 Fedora 25 中。而在上周,Fedora Wiki 网站上发布了一篇新功能建议草案,提议 Fedora 25 的 Workstation 版本采用 Wayland 做 GNOME 桌面环境的默认显示服务器。

在该草案中说“我们将在 GNOME 中让 GDM 默认使用 Wayland。如果 Wayland 不可用(比如使用 nvidia 显卡时),代码会自动切换到 Xorg。用户可以在 /etc/gdm/custom.conf 中设置 WaylandEnable=false 来禁用 Wayland,但是不再为 GNOME 分别设置 X11 和 Wayland 两个入口菜单了。”

用户不会注意到采用不同的显示服务器的明显不同,事实上,采用 Wayland 会让应用彼此之间以及和底层系统隔离的更好。换句话说, Wayland 比 X11 更安全。

Fedora 25 目前计划将在今年的 11 月 15 日到来,当然,按照 Fedora 的“传统”,延期是一定的,现在已经延期一次了。但是,不要紧,等着等着就习惯了。在 Fedora 25 发布之前,你还可以在 Fedora 24 中使用 Wayland 显示服务器,并将你发现的问题反馈给社区,让他们可以更好的改善 Wayland 显示服务器的表现。总之,希望 Fedora 25 能给我们带来惊喜,将 Wayland 作为默认显示服务器显然会带来引导作用,必然会引领一些发行版跟进。

参考:softpedia

Linux 内核中的位数组和位操作

除了不同的基于链式的数据结构以外,Linux 内核也为位数组(或称为 位图 bitmap )提供了 API。位数组在 Linux 内核里被广泛使用,并且在以下的源代码文件中包含了与这样的结构搭配使用的通用 API

除了这两个文件之外,还有体系结构特定的头文件,它们为特定的体系结构提供优化的位操作。我们将探讨 x86\_64 体系结构,因此在我们的例子里,它会是

头文件。正如我上面所写的,位图在 Linux 内核中被广泛地使用。例如,位数组常常用于保存一组在线/离线处理器,以便系统支持热插拔的 CPU(你可以在 cpumasks 部分阅读更多相关知识 ),一个 位数组 bit array 可以在 Linux 内核初始化等期间保存一组已分配的中断处理

因此,本部分的主要目的是了解 位数组 bit array 是如何在 Linux 内核中实现的。让我们现在开始吧。

位数组声明

在我们开始查看位图操作的 API 之前,我们必须知道如何在 Linux 内核中声明它。有两种声明位数组的通用方法。第一种简单的声明一个位数组的方法是,定义一个 unsigned long 的数组,例如:

unsigned long my_bitmap[8]

第二种方法,是使用 DECLARE_BITMAP 宏,它定义于 include/linux/types.h 头文件:

#define DECLARE_BITMAP(name,bits) \
    unsigned long name[BITS_TO_LONGS(bits)]

我们可以看到 DECLARE_BITMAP 宏使用两个参数:

  • name - 位图名称;
  • bits - 位图中位数;

并且只是使用 BITS_TO_LONGS(bits) 元素展开 unsigned long 数组的定义。 BITS_TO_LONGS 宏将一个给定的位数转换为 long 的个数,换言之,就是计算 bits 中有多少个 8 字节元素:

#define BITS_PER_BYTE           8
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
#define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))

因此,例如 DECLARE_BITMAP(my_bitmap, 64) 将产生:

>>> (((64) + (64) - 1) / (64))
1

与:

unsigned long my_bitmap[1];

在能够声明一个位数组之后,我们便可以使用它了。

体系结构特定的位操作

我们已经看了上面提及的一对源文件和头文件,它们提供了位数组操作的 API。其中重要且广泛使用的位数组 API 是体系结构特定的且位于已提及的头文件中 arch/x86/include/asm/bitops.h

首先让我们查看两个最重要的函数:

  • set_bit;
  • clear_bit.

我认为没有必要解释这些函数的作用。从它们的名字来看,这已经很清楚了。让我们直接查看它们的实现。如果你浏览 arch/x86/include/asm/bitops.h 头文件,你将会注意到这些函数中的每一个都有原子性和非原子性两种变体。在我们开始深入这些函数的实现之前,首先,我们必须了解一些有关 原子 atomic 操作的知识。

简而言之,原子操作保证两个或以上的操作不会并发地执行同一数据。x86 体系结构提供了一系列原子指令,例如, xchgcmpxchg 等指令。除了原子指令,一些非原子指令可以在 lock 指令的帮助下具有原子性。现在你已经对原子操作有了足够的了解,我们可以接着探讨 set_bitclear_bit 函数的实现。

我们先考虑函数的 非原子性 non-atomic 变体。非原子性的 set_bitclear_bit 的名字以双下划线开始。正如我们所知道的,所有这些函数都定义于 arch/x86/include/asm/bitops.h 头文件,并且第一个函数就是 __set_bit:

static inline void __set_bit(long nr, volatile unsigned long *addr)
{
    asm volatile("bts %1,%0" : ADDR : "Ir" (nr) : "memory");
}

正如我们所看到的,它使用了两个参数:

  • nr - 位数组中的位号(LCTT 译注:从 0 开始)
  • addr - 我们需要置位的位数组地址

注意,addr 参数使用 volatile 关键字定义,以告诉编译器给定地址指向的变量可能会被修改。 __set_bit 的实现相当简单。正如我们所看到的,它仅包含一行内联汇编代码。在我们的例子中,我们使用 bts 指令,从位数组中选出一个第一操作数(我们的例子中的 nr)所指定的位,存储选出的位的值到 CF 标志寄存器并设置该位(LCTT 译注:即 nr 指定的位置为 1)。

注意,我们了解了 nr 的用法,但这里还有一个参数 addr 呢!你或许已经猜到秘密就在 ADDRADDR 是一个定义在同一个头文件中的宏,它展开为一个包含给定地址和 +m 约束的字符串:

#define ADDR                BITOP_ADDR(addr)
#define BITOP_ADDR(x) "+m" (*(volatile long *) (x))

除了 +m 之外,在 __set_bit 函数中我们可以看到其他约束。让我们查看并试着理解它们所表示的意义:

  • +m - 表示内存操作数,这里的 + 表明给定的操作数为输入输出操作数;
  • I - 表示整型常量;
  • r - 表示寄存器操作数

除了这些约束之外,我们也能看到 memory 关键字,其告诉编译器这段代码会修改内存中的变量。到此为止,现在我们看看相同的 原子性 atomic 变体函数。它看起来比 非原子性 non-atomic 变体更加复杂:

static __always_inline void
set_bit(long nr, volatile unsigned long *addr)
{
    if (IS_IMMEDIATE(nr)) {
        asm volatile(LOCK_PREFIX "orb %1,%0"
            : CONST_MASK_ADDR(nr, addr)
            : "iq" ((u8)CONST_MASK(nr))
            : "memory");
    } else {
        asm volatile(LOCK_PREFIX "bts %1,%0"
            : BITOP_ADDR(addr) : "Ir" (nr) : "memory");
    }
}

(LCTT 译注:BITOP\_ADDR 的定义为:#define BITOP_ADDR(x) "=m" (*(volatile long *) (x)),ORB 为字节按位或。)

首先注意,这个函数使用了与 __set_bit 相同的参数集合,但额外地使用了 __always_inline 属性标记。 __always_inline 是一个定义于 include/linux/compiler-gcc.h 的宏,并且只是展开为 always_inline 属性:

#define __always_inline inline __attribute__((always_inline))

其意味着这个函数总是内联的,以减少 Linux 内核映像的大小。现在让我们试着了解下 set_bit 函数的实现。首先我们在 set_bit 函数的开头检查给定的位的数量。IS_IMMEDIATE 宏定义于相同的头文件,并展开为 gcc 内置函数的调用:

#define IS_IMMEDIATE(nr)        (__builtin_constant_p(nr))

如果给定的参数是编译期已知的常量,__builtin_constant_p 内置函数则返回 1,其他情况返回 0。假若给定的位数是编译期已知的常量,我们便无须使用效率低下的 bts 指令去设置位。我们可以只需在给定地址指向的字节上执行 按位或 操作,其字节包含给定的位,掩码位数表示高位为 1,其他位为 0 的掩码。在其他情况下,如果给定的位号不是编译期已知常量,我们便做和 __set_bit 函数一样的事。CONST_MASK_ADDR 宏:

#define CONST_MASK_ADDR(nr, addr)   BITOP_ADDR((void *)(addr) + ((nr)>>3))

展开为带有到包含给定位的字节偏移的给定地址,例如,我们拥有地址 0x1000 和位号 0x9。因为 0x9 代表 一个字节 + 一位,所以我们的地址是 addr + 1:

>>> hex(0x1000 + (0x9 >> 3))
'0x1001'

CONST_MASK 宏将我们给定的位号表示为字节,位号对应位为高位 1,其他位为 0

#define CONST_MASK(nr)          (1 << ((nr) & 7))
>>> bin(1 << (0x9 & 7))
'0b10'

最后,我们应用 按位或 运算到这些变量上面,因此,假如我们的地址是 0x4097 ,并且我们需要置位号为 9 的位为 1:

>>> bin(0x4097)
'0b100000010010111'
>>> bin((0x4097 >> 0x9) | (1 << (0x9 & 7)))
'0b100010'

第 9 位 将会被置位。(LCTT 译注:这里的 9 是从 0 开始计数的,比如0010,按照作者的意思,其中的 1 是第 1 位)

注意,所有这些操作使用 LOCK_PREFIX 标记,其展开为 lock 指令,保证该操作的原子性。

正如我们所知,除了 set_bit__set_bit 操作之外,Linux 内核还提供了两个功能相反的函数,在原子性和非原子性的上下文中清位。它们是 clear_bit__clear_bit。这两个函数都定义于同一个头文件 并且使用相同的参数集合。不仅参数相似,一般而言,这些函数与 set_bit__set_bit 也非常相似。让我们查看非原子性 __clear_bit 的实现吧:

static inline void __clear_bit(long nr, volatile unsigned long *addr)
{
    asm volatile("btr %1,%0" : ADDR : "Ir" (nr));
}

没错,正如我们所见,__clear_bit 使用相同的参数集合,并包含极其相似的内联汇编代码块。它只是使用 btr 指令替换了 bts。正如我们从函数名所理解的一样,通过给定地址,它清除了给定的位。btr 指令表现得像 bts(LCTT 译注:原文这里为 btr,可能为笔误,修正为 bts)。该指令选出第一操作数所指定的位,存储它的值到 CF 标志寄存器,并且清除第二操作数指定的位数组中的对应位。

__clear_bit 的原子性变体为 clear_bit

static __always_inline void
clear_bit(long nr, volatile unsigned long *addr)
{
    if (IS_IMMEDIATE(nr)) {
        asm volatile(LOCK_PREFIX "andb %1,%0"
            : CONST_MASK_ADDR(nr, addr)
            : "iq" ((u8)~CONST_MASK(nr)));
    } else {
        asm volatile(LOCK_PREFIX "btr %1,%0"
            : BITOP_ADDR(addr)
            : "Ir" (nr));
    }
}

并且正如我们所看到的,它与 set_bit 非常相似,只有两处不同。第一处差异为 clear_bit 使用 btr 指令来清位,而 set_bit 使用 bts 指令来置位。第二处差异为 clear_bit 使用否定的位掩码和 按位与 在给定的字节上置位,而 set_bit 使用 按位或 指令。

到此为止,我们可以在任意位数组置位和清位了,我们将看看位掩码上的其他操作。

在 Linux 内核中对位数组最广泛使用的操作是设置和清除位,但是除了这两个操作外,位数组上其他操作也是非常有用的。Linux 内核里另一种广泛使用的操作是知晓位数组中一个给定的位是否被置位。我们能够通过 test_bit 宏的帮助实现这一功能。这个宏定义于 arch/x86/include/asm/bitops.h 头文件,并根据位号分别展开为 constant_test_bitvariable_test_bit 调用。

#define test_bit(nr, addr)          \
    (__builtin_constant_p((nr))                 \
     ? constant_test_bit((nr), (addr))          \
     : variable_test_bit((nr), (addr)))

因此,如果 nr 是编译期已知常量,test_bit 将展开为 constant_test_bit 函数的调用,而其他情况则为 variable_test_bit。现在让我们看看这些函数的实现,让我们从 variable_test_bit 开始看起:

static inline int variable_test_bit(long nr, volatile const unsigned long *addr)
{
    int oldbit;

    asm volatile("bt %2,%1\n\t"
             "sbb %0,%0"
             : "=r" (oldbit)
             : "m" (*(unsigned long *)addr), "Ir" (nr));

    return oldbit;
}

variable_test_bit 函数使用了与 set_bit 及其他函数使用的相似的参数集合。我们也可以看到执行 btsbb 指令的内联汇编代码。bt (或称 bit test)指令从第二操作数指定的位数组选出第一操作数指定的一个指定位,并且将该位的值存进标志寄存器的 CF 位。第二个指令 sbb 从第二操作数中减去第一操作数,再减去 CF 的值。因此,这里将一个从给定位数组中的给定位号的值写进标志寄存器的 CF 位,并且执行 sbb 指令计算: 00000000 - CF,并将结果写进 oldbit 变量。

constant_test_bit 函数做了和我们在 set_bit 所看到的一样的事:

static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr)
{
    return ((1UL << (nr & (BITS_PER_LONG-1))) &
        (addr[nr >> _BITOPS_LONG_SHIFT])) != 0;
}

它生成了一个位号对应位为高位 1,而其他位为 0 的字节(正如我们在 CONST_MASK 所看到的),并将 按位与 应用于包含给定位号的字节。

下一个被广泛使用的位数组相关操作是改变一个位数组中的位。为此,Linux 内核提供了两个辅助函数:

  • __change_bit;
  • change_bit.

你可能已经猜测到,就拿 set_bit__set_bit 例子说,这两个变体分别是原子和非原子版本。首先,让我们看看 __change_bit 函数的实现:

static inline void __change_bit(long nr, volatile unsigned long *addr)
{
    asm volatile("btc %1,%0" : ADDR : "Ir" (nr));
}

相当简单,不是吗? __change_bit 的实现和 __set_bit 一样,只是我们使用 btc 替换 bts 指令而已。 该指令从一个给定位数组中选出一个给定位,将该为位的值存进 CF 并使用求反操作改变它的值,因此值为 1 的位将变为 0,反之亦然:

>>> int(not 1)
0
>>> int(not 0)
1

__change_bit 的原子版本为 change_bit 函数:

static inline void change_bit(long nr, volatile unsigned long *addr)
{
    if (IS_IMMEDIATE(nr)) {
        asm volatile(LOCK_PREFIX "xorb %1,%0"
            : CONST_MASK_ADDR(nr, addr)
            : "iq" ((u8)CONST_MASK(nr)));
    } else {
        asm volatile(LOCK_PREFIX "btc %1,%0"
            : BITOP_ADDR(addr)
            : "Ir" (nr));
    }
}

它和 set_bit 函数很相似,但也存在两点不同。第一处差异为 xor 操作而不是 or。第二处差异为 btc( LCTT 译注:原文为 bts,为作者笔误) 而不是 bts

目前,我们了解了最重要的体系特定的位数组操作,是时候看看一般的位图 API 了。

通用位操作

除了 arch/x86/include/asm/bitops.h 中体系特定的 API 外,Linux 内核提供了操作位数组的通用 API。正如我们本部分开头所了解的一样,我们可以在 include/linux/bitmap.h 头文件和 lib/bitmap.c 源文件中找到它。但在查看这些源文件之前,我们先看看 include/linux/bitops.h 头文件,其提供了一系列有用的宏,让我们看看它们当中一部分。

首先我们看看以下 4 个 宏:

  • for_each_set_bit
  • for_each_set_bit_from
  • for_each_clear_bit
  • for_each_clear_bit_from

所有这些宏都提供了遍历位数组中某些位集合的迭代器。第一个宏迭代那些被置位的位。第二个宏也是一样,但它是从某一个确定的位开始。最后两个宏做的一样,但是迭代那些被清位的位。让我们看看 for_each_set_bit 宏:

#define for_each_set_bit(bit, addr, size) \
    for ((bit) = find_first_bit((addr), (size));        \
         (bit) < (size);                    \
         (bit) = find_next_bit((addr), (size), (bit) + 1))

正如我们所看到的,它使用了三个参数,并展开为一个循环,该循环从作为 find_first_bit 函数返回结果的第一个置位开始,到小于给定大小的最后一个置位为止。

除了这四个宏, arch/x86/include/asm/bitops.h 也提供了 64-bit32-bit 变量循环的 API 等等。

下一个 头文件 提供了操作位数组的 API。例如,它提供了以下两个函数:

  • bitmap_zero;
  • bitmap_fill.

它们分别可以清除一个位数组和用 1 填充位数组。让我们看看 bitmap_zero 函数的实现:

static inline void bitmap_zero(unsigned long *dst, unsigned int nbits)
{
    if (small_const_nbits(nbits))
        *dst = 0UL;
    else {
        unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
        memset(dst, 0, len);
    }
}

首先我们可以看到对 nbits 的检查。 small_const_nbits 是一个定义在同一个头文件 的宏:

#define small_const_nbits(nbits) \
    (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)

正如我们可以看到的,它检查 nbits 是否为编译期已知常量,并且其值不超过 BITS_PER_LONG64。如果位数目没有超过一个 long 变量的位数,我们可以仅仅设置为 0。在其他情况,我们需要计算有多少个需要填充位数组的 long 变量并且使用 memset 进行填充。

bitmap_fill 函数的实现和 biramp_zero 函数很相似,除了我们需要在给定的位数组中填写 0xff0b11111111

static inline void bitmap_fill(unsigned long *dst, unsigned int nbits)
{
    unsigned int nlongs = BITS_TO_LONGS(nbits);
    if (!small_const_nbits(nbits)) {
        unsigned int len = (nlongs - 1) * sizeof(unsigned long);
        memset(dst, 0xff,  len);
    }
    dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);
}

除了 bitmap_fillbitmap_zeroinclude/linux/bitmap.h 头文件也提供了和 bitmap_zero 很相似的 bitmap_copy,只是仅仅使用 memcpy 而不是 memset 这点差异而已。它也提供了位数组的按位操作,像 bitmap_and, bitmap_or, bitamp_xor等等。我们不会探讨这些函数的实现了,因为如果你理解了本部分的所有内容,这些函数的实现是很容易理解的。无论如何,如果你对这些函数是如何实现的感兴趣,你可以打开并研究 include/linux/bitmap.h 头文件。

本部分到此为止。

链接


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

作者:0xAX 译者:cposture 校对:wxy

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