Merge pull request #67 from LCTT/master

update 2017-07-15
This commit is contained in:
cinlen_0x05 2017-07-15 11:29:32 +08:00 committed by GitHub
commit 6e667f2d35
122 changed files with 4900 additions and 3097 deletions

View File

@ -0,0 +1,165 @@
为树莓派 3 构建 64 位内核
============================================================
> 编辑:在写完这个这篇文章之后,我在树莓派 3 上基于 Debian 开始打造 64 位的系统。你可以[在这里找到][3]。
**树莓派 3** 配有 Broadcom BCM2837 64 位 ARMv8 四核 Cortex A53 处理器,它是一个 **64 位 CPU**。如果你有一块,运行以下命令可能会让你感到惊讶:
```
uname -a
Linux raspberrypi 4.4.34-v7+ #930 SMP Wed Nov 23 15:20:41 GMT 2016 armv7l GNU/Linux
```
是的,这是一个 **32 位内核**。这是因为树莓派基金会还没有为官方的树莓派系统 Raspbian 提供 64 位版本。然而你可以构建一个,多亏了 [Electron752][9] 提供的许多补丁。
### 构建内核
树莓派基金会维护着[它们自己的 Linux 内核分支][10],它为它们的设备特别裁剪过,同时定期地从上游合并。
我们将会遵照[这个页面][11]的指导来**构建一个 64 位内核**。
我们不能使用“本地构建”的方法,因为它需要一块 64 位的树莓派,这个我们明显还没有。因此我们需要**交叉编译**它,**Ubuntu** 是推荐的系统。我个人没有 Ubuntu因此我在一个有 2 个 CPU 的 Ubuntu 16.04 Digital Ocean 实例上构建,这应该花费我 $0.03。如果你也想这么做,你可以通过[这个链接][12]得到 $10 的免费额度。或者你可以通过使用 Virtualbox 中的 Ubuntu VM 作为实例。
首先,我们需要一些**构建工具**以及** aarch64 交叉编译器**
```
apt-get update
apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip
```
接着我们可以下载 **Linux 内核源码**
```
git clone depth=1 -b rpi-4.8.y https://github.com/raspberrypi/linux.git
```
进入到创建的 git 目录。另外你可以为你的内核添加额外的版本标签,可以通过编辑 `Makefile` 的开始几行完成:
```
VERSION = 4
PATCHLEVEL = 8
SUBLEVEL = 13
EXTRAVERSION = +bilal
```
为了**构建它**,运行下面的命令:
```
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
make -j 3 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
```
第一个应该很快。第二个则会完全不同,我没有精确计时,但是对我来说大概要半个小时。根据你的 CPU 数nproc * 1.5)调整 `-j` 标志。
### 选择一个 Linux 发行版
在内核编译的时候,我们可以开始准备它的 Linux 发行版了。在本教程中为了简单我使用 **Raspbian**,即使这是一个只有 32 位的发行版。
> 如果你想要一直用 64 位系统,你应该选一个有 aarch64 支持的发行版Debian 有一个健壮的 [ARM64 移植版][4]。得到它基本有三种方式:
> - 下载一个预构建的根文件系统,这很可能会如页面中提到的那样给你一个过期的版本。
> - 如果你熟悉 debootstrap用它构建你自己的这回比较棘手因为它需要一些手工调整它最初的目的是在已经运行的主机上进行 chroot而不是为其他机器构建根文件系统
> - 我建议使用 multistrap这里有一个很好的教程http://free-electrons.com/blog/embdebian-with-multistrap/
回到 Raspbian我们现在可以下载官方系统并开始准备了。
打开一个新的 shell 会话并运行下面的命令:
```
wget -O raspbian.zip https://downloads.raspberrypi.org/raspbian_lite_latest
unzip raspbian.zip
```
我们用下面的命令审查:
```
fdisk -l 2016-11-25-raspbian-jessie-lite.img
Disk 2016-11-25-raspbian-jessie-lite.img: 1.3 GiB, 1390411776 bytes, 2715648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x244b8248
Device Boot Start End Sectors Size Id Type
2016-11-25-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
2016-11-25-raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G 83 Linux
```
我们可以看到它有**两个分区**。第一个是**启动分区**,它主要包含了 bootloader、Linux 内核以及少量配置文件。第二个是**根分区**。
我们可以在我们的文件系统上**挂载这些分区**,从**根分区**开始:
```
mount -o loop,offset=70254592 2016-11-25-raspbian-jessie-lite.img /mnt
```
`offset` 取决于扇区大小51270254592 = 512 * 137216
接着是**启动分区**
```
mount -o loop,offset=4194304,sizelimit=66060288 2016-11-25-raspbian-jessie-lite.img /mnt/boot
```
`offset` 4194304 = 512 * 8192`sizelimit`66060288 = 512 * 129024 。
树莓派系统现在应该可以在 `/mnt` 中看到了。我们基本要完成了。
### 打包内核
内核编译完成后,最后一步包括**复制 Linux 内核**以及**设备树**到启动分区中:
```
cp arch/arm64/boot/Image /mnt/boot/kernel8.img
cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/
```
调整 `config.txt` :
```
echo “kernel=kernel8.img” >> /mnt/boot/config.txt
```
安装**内核模块** :
```
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu INSTALL_MOD_PATH=/mnt modules_install
umount /mnt/boot
umount /mnt
```
就是这样了,用于树莓派 3 的** ARM64 Linux 内核**诞生了!
现在你可以压缩镜像,通过 scp 下载下来,并按照标准的步骤放到你的 SD 卡中。
最后你会得到:
```
uname -a
Linux raspberrypi 4.8.13+bilal-v8+ #1 SMP Wed Dec 14 14:09:38 UTC 2016 aarch64 GNU/Linux
```
--------------------------------------------------------------------------------
via: https://devsidestory.com/build-a-64-bit-kernel-for-your-raspberry-pi-3/
作者:[Bilal Amarni][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://devsidestory.com/about-me
[1]:https://devsidestory.com/author/bamarni/
[2]:https://devsidestory.com/build-a-64-bit-kernel-for-your-raspberry-pi-3/
[3]:https://github.com/bamarni/pi64
[4]:https://wiki.debian.org/Arm64Port
[5]:https://devsidestory.com/#twitter
[6]:https://devsidestory.com/#linkedin
[7]:https://devsidestory.com/#google_plus
[8]:https://www.addtoany.com/share#url=https%3A%2F%2Fdevsidestory.com%2Fbuild-a-64-bit-kernel-for-your-raspberry-pi-3%2F&title=Build%20a%2064-bit%20Kernel%20for%20your%20Raspberry%20Pi%203
[9]:https://github.com/Electron752
[10]:https://github.com/raspberrypi/linux
[11]:https://www.raspberrypi.org/documentation/linux/kernel/building.md
[12]:https://m.do.co/c/8ef9c5832a9c

View File

@ -0,0 +1,63 @@
幼犬式免费:免费软件中的无形消费
============================================================
![幼犬式免费:免费软件中的无形消费](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_whitehurst_money.png?itok=Xqow4bzq "幼犬式免费: 免费软件中的无形消费")
Image by : opensource.com
我们习惯于软件被描述为“<ruby>自由式免费<rt>free as in freedom</rt></ruby>”和“<ruby>啤酒式免费<rt>free as in beer</rt></ruby>”。但还有另一种不常被提起的“免费”——“<ruby>幼犬式免费<rt>free as in puppy</rt></ruby>”。这个概念来自于当别人送你一只免费的小狗,但那只小狗不是真的免费。日常照顾它需要花费大量精力与金钱。商业术语是“总体拥有成本”,即 TCO ,这适用于所有场景,不仅仅是开源软件和小狗。
既然免费小狗问题适用于所有事,那么它是如何对于开源软件特别重要的呢?有一些解释。首先,如果你已经购买了软件,就会因为消费对它设定期望值。软件起初免费后来需要花钱似乎是很无理的要求。其次,如果这发生在一个组织首次采用开源项目的时候,就会阻碍该组织下一次采用开源项目。最终且违反直觉的是,看起来开源软件需要花钱可能使得它更轻易“卖出”,如果它真的免费,未免也太好了一点。
接下来的部分是软件消费渐显的共同之处。这绝不是一个详尽的列表。
### 起始消费
开始使用软件之前,你必须首先拥有这个软件。
* **软件:** 因为它是开源的不一定意味着它是_免费的_。
* **硬件:** 考虑到软件的需求。如果你没有使用软件所需的硬件(可能是服务器硬件或者客户端硬件),你得买。
* **培训:** 很少有软件完全直白如话的。在于你是选择培训还是自己去弄清楚。
* **实战:** 把所有零部件放在一起只是开始,现在,是时候把所有东西拼在一起了。
* **安装和配置:** 至少这将花费一些员工的工作时间。如果这是一个大项目,你可能需要花钱请一个系统整合服务商或者其他供应商来做这件事。
* **数据导入:** 如果要取代现成的系统,存在数据搬家的问题。皆大欢喜的是所有都是相同标准编译的,这样就没什么问题。然而在很多情况,需要写一些脚本来提取和重载数据。
* **其他系统的接口:** 说到写脚本,这个软件能和你使用的其他软件(例如,目录服务或者工资软件)很好联系起来吗?
* **定制:** 如果原本的软件不能满足你所有的需求,那它可能需要定制。你可以做到,但是仍需要努力或者是一些原材料。
* **商业变化:** 当你的组织希望有所提升时,新软件也可能会变化。然而这种转换不是免费的。例如,生产效率刚开始可能会下降因为员工还在适应新软件。
### 经营成本
安装软件是简单部分,现在你得使用它。
* **更多培训:** 什么,你认为我们已经做好了? 过段时间,你的组织会加入新人,他们需要学习如何使用这个软件,或者说是添加了额外功能的新版本软件发布了。
* **维护:**
* **订阅费:** 有些软件通过收取订阅费来提供更新。
* **补丁:**取决于软件的自身,打补丁需要费很多功夫。包括测试和部署。
* **开发:**你自己做所有定制吗?现在你必须维护下去了。
* **支持:** 当它坏了得有人来修,无论是供应商还是自己的团队,确实需要一笔花费。
* **良好的做法:** 这个不是必需品,但如果你在使用开源软件,无论如何给一些回馈是非常好的。比如代码贡献、在邮件列表提供支持、赞助年度会议等等。
* **商业利益:** 好吧,这不是一个付费项,而且它抵消了一些费用。使用软件对你的组织意味着什么呢?如果它使得量产产品减少了 25% 的浪费,这就是价值。再换个例子,它可能帮助你减少 30% 不盈利部分。
这样例子数不胜数,确实需要一定想象力来想出所有的花费。算出正确的价值需要一些实验和大量的的优质客户,但是这样分析一遍的话会使得它更加清晰。就好像一只小狗狗,如果预先知道自己会付出多少,这可能会是一个有价值的实验。
--------------------------------------------------------------------------------
作者简介:
Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco)
--------------------------------------------------------------------------------
via: https://opensource.com/article/17/2/hidden-costs-free-software
作者:[Ben Cotton][a]
译者:[XYenChi](https://github.com/XYenChi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/bcotton
[1]:https://opensource.com/article/17/2/hidden-costs-free-software?rate=gXfsYPWiIQNslwJ3zOAje71pTMRhp25Eo0HTdLWOKv4
[2]:https://opensource.com/user/30131/feed
[3]:https://opensource.com/article/17/2/hidden-costs-free-software#comments
[4]:https://opensource.com/users/bcotton

View File

@ -0,0 +1,66 @@
在物联网中使用脚本语言面临的挑战与对策
============================================================
![Scripting IoT](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/scripting-languages-iot.jpg?itok=d6uog0Ss "Scripting IoT")
> 在即将到来的嵌入式 Linux 会议 + OpenIoT 峰会中Paul Sokolovsky 将会讨论在嵌入式开发中使用脚本语言的一些挑战。
脚本语言(又称作<ruby>超高级语言<rt>Very High-Level Languages</rt></ruby>或 VHLLs ),例如 Python、 PHP 以及 JavaScript 常用在桌面、服务器和网页开发中。它们强大的内置功能能够让你花费少量的时间和精力来开发小型却有用的应用Paul SokolovskyLinaro 公司物联网工程师如是说。然而,目前在物联网中使用超高级语言深度开发嵌入式应用相对来说有些别扭。
在即将到来的[嵌入式 Linux 会议][6] + [OpenIoT 峰会][7]中Sokolovsky 会讨论在嵌入式开发中使用 VHLLs 的挑战并且基于 MicroPython 的例子与 JerryScript + Zephyr.js 项目比较不同的对策。 我们与Sokolovsky 进行了一番交谈来获得更多信息。
**Linux.com您可以给我们的读者一些 VHLLs 的背景知识吗?**
Paul Sokolovsky: 超高级语言成为计算机科学和信息技术风景中的一部分已经几十年了。也许第一个流行的脚本语言是 Unix shellsh尽管由于较小的特征集它很少被认为是一种超高级语言而是一种特定领域语言。所以第一个真正破纪录的 VHLLs 是 Perl1987和 Tcl1988很快紧跟着出现了 Python1991Ruby1995PHP1995JavaScript1995以及许多其它语言。
不同 VHLLs 之间的区别特性包括:它们的解析本能(从使用者的角度来看,也许是因为其中复杂的编译器作祟),内置可用的强大的数据类型如任意大小的列表和映射,可观的标准库,以及允许用户访问甚至更大的第三方库的外部模块系统。所有的这些特性都与相对容易使用的感觉(更少的输入,不需要构建等)和简单的学习曲线相耦合。
**Linux.com: 使用这些语言做开发有哪些优势?**
Sokolovsky: 优势的根源来自于以上描述的这些特性。一个新手可以非常轻松的开始使用脚本语言并且快速的学习它。很多 VHLLs 提供了一个强大的交互模式,所以你不需要去读那些厚厚的使用手册来开始使用脚本语言,而是直接去探索和体验它们。强大的内置功能允许你去开发小而有用的应用(脚本),而仅仅使用很少的时间和精力(这就是“脚本语言”名字的来源)。如果要转向开发大型应用,广泛的第三方库和可以轻而易举使用的模块系统使得开发变得流畅和高产。
**Linux.com: 在嵌入式平台上使用脚本开发和在其他平台开发有什么区别?**
Sokolovsky: 鉴于之前我们讨论过的 VHLLs 振奋人心的能力,有一个创意——为什么我们不能享受使用 VHLLs 为嵌入式设备做开发而具有所有(或者至少一部分)优势呢?这里我提到的“嵌入式设备”不仅仅是拥有 8-32 MB RAM 的小型 Linux 系统还有运行在微控制器MCU上有几千字节内存的深度嵌入式系统。少量有些时候几乎没有的相关资源肯定使这个创意的实现变得更加复杂。 另一个问题是设备访问和交互。嵌入式设备通常没有显示屏和键盘,但是幸运的是解决这个问题的答案已经存在几十年了,这里要感谢 Unix它提供了使用串口UART来搭建一个终端连接的方法。当然在主机端有些用户喜欢使用图形集成开发环境IDE来隐藏串口通信细节。
所以,由于嵌入式设备所有的这些不同特性,这个创意就是提供一个尽可能熟悉的工作环境。但熟悉只是其中一方面,另一方面,为了适应甚至最小的设备,工作环境需要尽可能的缩小。要想解决这些矛盾需要嵌入式 VHLLs 的操作可以高度配置,来适应不同的项目和硬件的需求。
**Linux.com只有在物联网中使用这些语言才会遇到的挑战有哪些比如说你如何处理内存限制**
Sokolovsky: 当然,解释程序本身几乎不怎么消耗硬件资源。但是在当今世界,最珍贵的资源是人类的时间。不管你是一个研发工程师、一个仅仅有几个小时的周末创客、一个被 bug 和安全问题淹没的支持工程师,或者一个计划开发新产品的产品经理——你手头上大概都没有什么多余时间。因此需要将 VHLLs 的生产力提供到嵌入式工程师手上。
当前的工艺水平使得这些需求变得可行。公正的来讲甚至于微处理器单元MCU平均 都有 16-32 KB RAM 128-256 KB ROM。这仅仅足够搭载一个核心解释程序一个标准库类型的规范子集一些硬件驱动以及一个很小但是依旧有用的应用程序。假如你的硬件配置稍微越过了中间线其能力得到了快速的增长——这实际上是由于一个从 1970 年代就闻名的技巧使用自定义的字节码和精码pcode相比原始机器代码能够让你获得更大的代码/特性密度。
在这条道路上有很多挑战RAM 不够用是主要的一个。我是在一个 16 GB RAM 的笔记本上写下的这些话(但不断切换的话依然会很卡),而刚才提到的 16KB 比它小一百万倍!不过,通过小心的选择算法和编程技巧,在这样小的 RAM 下仍有可能通过脚本语言来执行简单程序,而相当复杂的程序可能需要 128-256K。
有很多的技术挑战需要解决(它们已经被成功的解决了),这里没有足够的篇幅来涵盖它们。不过,我在 OpenIoT 峰会上的演讲会涵盖使用两种嵌入式脚本语言的经验和成就MicroPythonPython3 的子集)和 Zephyr.jsJavaScript/Node.js 的子集),都运行在 Linux 基金会的 Zephyr 实时操作系统上,它被寄希望于在 IoT 工业界取得和 Linux 在移动互联网和服务器方面一样的成就。(相关 PPT 会为无法参加 OpenIoT 会议的朋友在会议后放出。)
**Linux.com: 你能给我们一些 VHLLs 最适用的应用的例子吗?以及一些它们不适用的例子?**
Sokolovsky以上是很多关于 VHLLs 的光明前景,公正的来说:在嵌入式开发中,这里有很多一厢情愿的幻想(或者说希望其是能够自我实现的预言)。在嵌入式开发中 VHLLs 现在可以提供的是:快速成型,以及教育/创客市场上所必须的易学性和易用性。有一些先行者在其它领域使用 VHLLs但是就目前来看它需要在基础构造和工具开发上投入更多。重要的是这样的投入应遵循开源原则并分享否则会逐渐损害到 VHLLs 能够节省使用者时间和精力的优势。
谨记这些,嵌入式 VHLLs 是发育完全(“逐渐变的完整”)的语言,能够适应各种类型的应用,但是要受制于硬件。例如,假如一个微处理器的规格低于之前提到的阈值,如一个老旧的 8-bit 微处理器,那么只有同样古老而优秀的 C 语言能够为你所用。另外一个限制是当你真的想要充分利用硬件时—— C 语言或者汇编程序才是正确的选择。但是,这里有一个惊喜——嵌入式 VHLLs 的开发者也想到了这一点,例如 MicroPython 允许你将 Python 和汇编程序在同一个应用中结合起来。
嵌入式 VHLLs 的优势是其可配置性和可(重复)编程性,外加灵活的连接性支持。这恰恰是 IoT 和智能设备最需要的,很多 IoT 应用使用起来也不需要太复杂。考虑一下,例如,一个可以贴在任何地方用来完成各种任务的智能按钮。但是,如果你需要调整双击的时间时怎么办?使用脚本语言,你可以做到。也许你完全不会考虑三连击,但是现在在某些情况下四连击都可能是有用的。使用脚本语言,你可以轻易修改它。
(题图:来自 Pixabay基于 CC0 协议)
--------------------------------------------------------------------------------
via: https://www.linux.com/news/event/elcna/2017/2/using-scripting-languages-iot-challenges-and-approaches
作者:[AMBER ANKERHOLZ][a]
译者:[xiaow6](https://github.com/xiaow6)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.com/users/aankerholz
[1]:https://www.linux.com/licenses/category/used-permission
[2]:https://www.linux.com/licenses/category/creative-commons-zero
[3]:https://www.linux.com/files/images/paul-sokolovsky-2014-09-21jpg
[4]:https://www.linux.com/files/images/scripting-languages-iotjpg
[5]:http://events.linuxfoundation.org/events/embedded-linux-conference/program/schedule?utm_source=linux&amp;utm_campaign=elc17&amp;utm_medium=blog&amp;utm_content=video-blog
[6]:http://events.linuxfoundation.org/events/embedded-linux-conference
[7]:https://events.linuxfoundation.org/events/openiot-summit/program/schedule

View File

@ -0,0 +1,80 @@
GitHub 对软件开发业造成的冲击
============================================================
![The impact GitHub is having on your software career](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/github-universe.jpg?itok=HCU81VX8 "The impact GitHub is having on your software career")
在未来的 12 到 24 个月内(也就是说,在 2018 年,或者是 2019 年),人们雇佣软件开发者的方式将会发生彻底的改变。
2004 至 2014 期间,我曾经就职于红帽,这是世界上最大的开源软件公司。还记得 2004 年七月的一天,我第一次来到这家公司,我的老板 Marty Messer 就跟我说,“所有你在这里所做的工作都会被开源,在未来,你将不需要任何的简历,因为所有的人都可以 Google 到你。”
供职于红帽的一个独特的好处是,在这种开源的工作期间,我们有机会建立自己的个人品牌和树立自己的声誉。我们可以通过邮件列表和 bug 追踪器与其它的软件工程师进行沟通,而且提交到 mercurial、subversion 和 CVS 仓库的源代码都会被开源,并且可以通过 google 找到。
(写本文时)马上就到 2017 年了,我们将生活在一个处处充满开源的世界。
以下两点会让你对这个新时代有一个真正意义上的了解:
1. 微软在过去的一段很长的时间里都在坚持闭源,甚至是排斥开源。但是现在也从心底里开始拥抱开源了。它们成立了 .NET 基金会(红帽也是其中的一个成员),并且也加入了 Linux 基金会。 .NET 项目现在是以一个开源项目的形式在开发着。
2. Github 已经成为了一个独特的社交网络,并将问题追踪器和分布式源码版本控制融入其中。
对于那些从闭源走过来的软件开发者来说,他们可能还不知道发生了什么。对于他们来说 ,开源就意味着“将业余时间的所有工作成果都免费开放”。
对于我们这些在过去十年创造了一家十亿美元的开源软件公司的人来说参与开源以后就没有什么空闲的时间可言了。当然为开源事业献身的好处也是很明显的所得到的名誉是你自己的并不隶属于某个公司。GitHub 是一个社交网络,在这个地方,你可以创建你的提交、你可以在你所专长的领域为一些全球性的组织做出贡献,你临时做的一些工作并不附属于所任职的公司。
聪明的人会利用这种工作环境。他们会贡献他们的补丁、工单issue、评论给他们平时在工作中使用的语言和框架比如 TypeScript、 .NET 和 Redux 。
他们也拥抱开源,并会尽可能多的开源他们的创新成果。甚至会提交他们的贡献给私有仓库。
GitHub 对平等居功至伟。比如说,你也许很难在澳大利亚得到一份来自印度的工作,但是,在 GitHub 上,却没有什么可以阻止你在印度跟澳大利亚的工作伙伴一起工作。
在过去十年里,想从红帽获得一个工作机会的方式很简单。你只需要在一些某些小的方面,与红帽的软件工程师在开源的项目上协作,然后当他们觉得你在某些方面做出了很多有价值的贡献,而且成为一个很好的工作伙伴时,那么你就可以申请一个红帽的工作机会了,或许他们会邀请你。
现在,在不同的技术领域,开源给了我们所有人同样的机会,随着开源在世界的各处都流行开来,这样的事情将会在不同的地方盛行开来。
在[最近一个访谈][3]中Linux 和 git 的发明者 Linux Torvalds在 GitHub 上有 49K 粉丝0 关注),这么说,
> “你提交了很多小补丁,而在某个时候项目的维护者开始信任你,在那一刻,你跟一般人不同的是,你不仅仅是提交了一些补丁,而是真正成为了这个组织里被信任的一部分。”
实际上你的名声存在于那个你被信任的网络。我们都知道,当你离开一家公司以后,你的人脉和名声可能会削弱,有的甚至会丢失。就好像,你在一个小村庄里生活了很长的一段时间,这里所有的人都会知道你。然而,当你离开这个村庄,来到一个新的地方,这个地方可能没人听说过你,更糟糕的是,没有人认识任何知道你的人。
你已经失去了一度和二度连接关系甚至有可能会失去这三度连接关系LCTT 译注:指六度连接理论)。除非你通过在会议或其他大型活动中演讲来建立自己的品牌,否则你通过在公司内部提交代码建立起来的信任早晚都会过去的,但是,如果你在 GitHub 上完成你的工作,这些东西依然全部都在,对这个信任网络的连接仍然可见。
首先会发生的事情就是,一些弱势群体可能会利用这个。包括像学生、新毕业生、移民者--他们可能会利用这个“去往”澳大利亚。
这将会改变目前的现状。以前的一些开发人员可能会有过人际网络突然中断的情况,开源的一个原则是精英——最好的创意、最多的提交、最多的测试,和最快的落实执行,等等。
它并不完美,当然也没有什么事情是完美的,不能和伙伴一起工作,在人们对你的印象方面也会大打折扣。红帽公司会开除那些不能和团队和谐相处的人,而在 GitHub 工作的这些员工,他们主要是和其它的贡献者之间的交流。
GitHub 不仅仅是一个代码仓库或是一个原始提交成员的列表,因为有些人总是用稻草人论点描述它。它是一个社交网络。我会这样说:
> GitHub 有多少代码并不重要,重要的是有多少关于你代码的讨论。
GitHub 可以说是伴你而走的名声,并且在以后的 12 到 24 个月中,很多开发者使用它,而另外的一些依然并不使用,这将会形成一个很明显的差异。就像有电子邮件和没有电子邮件的区别(现在每个人都有电子邮件了),或者是有移动电话和没有移动电话的区别(现在每个人都有移动电话了),最终,绝大多数的人都会为开源工作,这将会是与别人的竞争中的一个差异化的优势。
但是现在,开发者的职业生涯已经被 GitHub 打乱了。
(题图: GitHub
--------------------------------------------------------------------------------
作者简介:
Josh Wulf - 我是 Just Digital People 的传奇招聘者前红帽员工CoderDojo 导师, Magikcraft.io 创始人之一The JDP Internship 出品人——这是世界第一的软件开发真人秀,世界上最好的科技播客主持人,也是一位父亲。一直致力于昆士兰州的“硅经济”。
-----------------------
via: https://medium.com/@sitapati/the-impact-github-is-having-on-your-software-career-right-now-6ce536ec0b50
作者:[Josh Wulf][a]
译者:[SysTick](https://github.com/SysTick)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/sitapati
[1]:https://medium.com/@sitapati/the-impact-github-is-having-on-your-software-career-right-now-6ce536ec0b50#.dl79wpyww
[2]:https://opensource.com/article/17/3/impact-github-software-career?rate=2gi7BrUHIADt4TWXO2noerSjzw18mLVZx56jwnExHqk
[3]:http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/
[4]:https://opensource.com/user/118851/feed
[5]:https://opensource.com/article/17/3/impact-github-software-career#comments
[6]:https://opensource.com/users/sitapati

View File

@ -1,39 +1,26 @@
开发 Linux 调试器(三):寄存器和内存
开发一个 Linux 调试器(三):寄存器和内存
============================================================
上一篇博文中我们给调试器添加了一个简单的地址断点。这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器、观察状态和改变程序的行为。
* * *
### 系列文章索引
随着后面文章的发布,这些链接会逐渐生效。
1.  [准备环境][3]
1. [准备环境][3]
2. [断点][4]
3. [寄存器和内存][5]
4. [Elves 和 dwarves][6]
5. [源码和信号][7]
6. [源码级逐步执行][8]
7. 源码级断点
8. 调用栈展开
9. 读取变量
10. 下一步
* * *
### 注册我们的寄存器
在我们真正读取任何寄存器之前,我们需要告诉调试器一些关于我们的目标,也就是 x86_64 的信息。除了多组通用和专用目的寄存器x86_64 还提供浮点和向量寄存器。为了简化我将跳过后两种寄存器但是你如果喜欢的话也可以选择支持它们。x86_64 也允许你像访问 32、16 或者 8 位寄存器那样访问一些 64 位寄存器,但我只会介绍 64 位寄存器。由于这些简化,对于每个寄存器我们只需要它的名称它的 DWARF 寄存器编号以及 `ptrace` 返回结构体中的存储地址。我使用范围枚举引用这些寄存器,然后我列出了一个全局寄存器描述符数组,其中元素顺序和 `ptrace` 中寄存器结构体相同。
在我们真正读取任何寄存器之前,我们需要告诉调试器一些关于我们的目标平台的信息,这里是 x86_64 平台。除了多组通用和专用目的寄存器x86_64 还提供浮点和向量寄存器。为了简化我将跳过后两种寄存器但是你如果喜欢的话也可以选择支持它们。x86_64 也允许你像访问 32、16 或者 8 位寄存器那样访问一些 64 位寄存器,但我只会介绍 64 位寄存器。由于这些简化,对于每个寄存器我们只需要它的名称它的 DWARF 寄存器编号以及 `ptrace` 返回结构体中的存储地址。我使用范围枚举引用这些寄存器,然后我列出了一个全局寄存器描述符数组,其中元素顺序和 `ptrace` 中寄存器结构体相同。
```
enum class reg {
@ -88,7 +75,7 @@ const std::array<reg_descriptor, n_registers> g_register_descriptors {{
如果你想自己看看的话,你通常可以在 `/usr/include/sys/user.h` 找到寄存器数据结构,另外 DWARF 寄存器编号取自 [System V x86_64 ABI][11]。
现在我们可以编写一堆函数来和寄存器交互。我们想要读取寄存器、写入数据、根据 DWARF 寄存器编号获取值,以及通过名称查找寄存器,反之类似。让我们先从实现 `get_register_value` 开始:
现在我们可以编写一堆函数来和寄存器交互。我们希望可以读取寄存器、写入数据、根据 DWARF 寄存器编号获取值,以及通过名称查找寄存器,反之类似。让我们先从实现 `get_register_value` 开始:
```
uint64_t get_register_value(pid_t pid, reg r) {
@ -100,7 +87,7 @@ uint64_t get_register_value(pid_t pid, reg r) {
`ptrace` 使得我们可以轻易获得我们想要的数据。我们只需要构造一个 `user_regs_struct` 实例并把它和 `PTRACE_GETREGS` 请求传递给 `ptrace`
现在取决于被请求的寄存器,我们想要读取 `regs`。我们可以写一个很大的 switch 语句,但由于我们 `g_register_descriptors` 表的布局顺序和 `user_regs_struct` 相同,我们只需要搜索寄存器描述符的索引,然后作为 `uint64_t` 数组访问 `user_regs_struct`。[1][9]
现在根据要请求的寄存器,我们要读取 `regs`。我们可以写一个很大的 switch 语句,但由于我们 `g_register_descriptors` 表的布局顺序和 `user_regs_struct` 相同,我们只需要搜索寄存器描述符的索引,然后作为 `uint64_t` 数组访问 `user_regs_struct` 就行。(你也可以重新排序 `reg` 枚举变量,然后使用索引把它们转换为底层类型,但第一次我就使用这种方式编写,它能正常工作,我也就懒得改它了。)
```
auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
@ -109,9 +96,9 @@ uint64_t get_register_value(pid_t pid, reg r) {
return *(reinterpret_cast<uint64_t*>(&regs) + (it - begin(g_register_descriptors)));
```
`uint64_t` 的转换是安全的,因为 `user_regs_struct` 是一个标准布局类型,但我认为指针算术技术上是未定义的行为undefined behavior。当前没有编译器会对此产生警告,我也懒得修改,但是如果你想保持最严格的正确性,那就写一个大的 switch 语句。
`uint64_t` 的转换是安全的,因为 `user_regs_struct` 是一个标准布局类型,但我认为指针算术技术上是<ruby>未定义的行为<rt>undefined behavior</rt></ruby>。当前没有编译器会对此产生警告,我也懒得修改,但是如果你想保持最严格的正确性,那就写一个大的 switch 语句。
`set_register_value` 非常类似,我们只是写入到地址并在最后写回寄存器:
`set_register_value` 非常类似,我们只是写入该位置并在最后写回寄存器:
```
void set_register_value(pid_t pid, reg r, uint64_t value) {
@ -166,12 +153,10 @@ void debugger::dump_registers() {
}
```
正如你看到的iostreams 有非常精确的接口用于美观地输出十六进制数据[2][10]。如果你喜欢你也可以通过 I/O 操纵器来摆脱这种混乱。
正如你看到的iostreams 有非常精确的接口用于美观地输出十六进制数据(啊哈哈哈哈哈哈)。如果你喜欢你也可以通过 I/O 操纵器来摆脱这种混乱。
这些已经足够支持我们在调试器接下来的部分轻松地处理寄存器,所以我们现在可以把这些添加到我们的用户界面。
* * *
### 显示我们的寄存器
这里我们要做的就是给 `handle_command` 函数添加一个命令。通过下面的代码,用户可以输入 `register read rax``register write rax 0x42` 以及类似的语句。
@ -191,7 +176,6 @@ void debugger::dump_registers() {
}
```
* * *
### 接下来做什么?
@ -225,13 +209,11 @@ void debugger::write_memory(uint64_t address, uint64_t value) {
}
```
* * *
### 给  `continue_execution` 打补丁
在我们测试我们的更改之前,我们现在可以实现一个更健全的 `continue_execution` 版本。由于我们可以获取程序计数器,我们可以检查我们的断点映射来判断我们是否处于一个断点。如果是的话,我们可以停用断点并在继续之前跳过它。
为了清晰和简洁,首先我们要添加一些帮助函数:
为了清晰和简洁起见,首先我们要添加一些帮助函数:
```
uint64_t debugger::get_pc() {
@ -288,11 +270,9 @@ void debugger::continue_execution() {
}
```
* * *
### 测试效果
现在我们可以读取和修改寄存器了,我们可以对我们的 hello world 程序做一些有意思的更改。类似第一次测试,再次尝试在 call 指令处设置断点然后从那里继续执行。你可以看到输出了 `Hello world`。现在是有趣的部分,在输出调用后设一个断点、继续、将 call 参数设置代码的地址写入程序计数器(`rip`) 并继续。由于程序计数器操纵,你应该再次看到输出了 `Hello world`。为了以防你不确定在哪里设置断点,下面是我上一篇博文中的 `objdump` 输出:
现在我们可以读取和修改寄存器了,我们可以对我们的 hello world 程序做一些有意思的更改。类似第一次测试,再次尝试在 `call` 指令处设置断点然后从那里继续执行。你可以看到输出了 `Hello world`。现在是有趣的部分,在输出调用后设一个断点、继续、将 `call` 参数设置代码的地址写入程序计数器(`rip`并继续。由于程序计数器操纵,你应该再次看到输出了 `Hello world`。为了以防你不确定在哪里设置断点,下面是我上一篇博文中的 `objdump` 输出:
```
@ -313,18 +293,12 @@ void debugger::continue_execution() {
在下一篇博客中,我们会第一次接触到 DWARF 信息并给我们的调试器添加一系列逐步调试的功能。之后,我们会有一个功能工具,它能逐步执行代码、在想要的地方设置断点、修改数据以及其它。一如以往,如果你有任何问题请留下你的评论!
你可以在[这里][13]找到这篇博文的代码。
* * *
1. 你也可以重新排序 `reg` 枚举变量,然后使用索引把它们转换为底层类型,但第一次我就使用这种方式编写,它能正常工作,我也就懒得改它了。 [↩][1]
2. Ahahahahahahahahahahahahahahahaha [↩][2]
--------------------------------------------------------------------------------
via: https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/
作者:[ TartanLlama ][a]
作者:[Simon Brand][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[jasminepeng](https://github.com/jasminepeng)

View File

@ -0,0 +1,57 @@
为什么可以在任何地方工作的开发者们要聚集到世界上最昂贵的城市?
============================================================
![](https://tctechcrunch2011.files.wordpress.com/2017/04/img_20170401_1835042.jpg?w=977)
政治家和经济学家都在[哀嚎][10]某几个阿尔法地区——旧金山、洛杉矶、纽约、波士顿、多伦多、伦敦、巴黎——在吸引了所有最好的工作的同时变得令人却步的昂贵,降低了经济流动性而增大了贫富差异。为什么那些最好的工作不能搬到其它地区呢?
当然,很多工作都不能搬走。工作在纽约或者伦敦(当然,在英国脱欧毁灭伦敦的银行体系之前)普通的金融从业人员如果告诉他们的老板他们想要以后在清迈工作,将会在办公室里受到嘲笑而且不再受欢迎。
但是这对(大部分)软件领域不适用。大部分 web/app 开发者如果这样要求的话可能会被拒绝;但是它们至少不会被嘲笑或者被炒。优秀开发者往往供不应求,而且我们处在 Skype 和 Slack 的时代,软件开发完全可以不依赖物质世界的交互。
(这一切对作家来说更加正确,真的;事实上我是在波纳佩发表的这篇文章。但是作家并不像软件开发者一样具有足够的影响力。)
有些人会告诉你远程协助的团队天生比本地团队效率和生产力低下一些,或者那些“不经意的灵感碰撞”是如此重要以致于每一位员工每天都必须强制到一个地方来人为的制造这样的碰撞。这些人错了,有这种问题的团队只是讨论次数不够多——数量级不过几次、十几次或者几十次,而不是成百上千——也不够专注。
我知道:在 [HappyFunCorp][11] 时,我们广泛的与远程团队工作,而且长期雇佣远程开发者,而结果难以置信的好。我在我旧金山的家中与斯德哥尔摩、圣保罗、上海、布鲁克林、新德里的开发者交流和合作的一天,完全没有任何不寻常。
在这一点上,不管它是不是个好主意,但我有点跑题了。供求关系指出那些拥有足够技能的开发者可以成为被称为“数字流浪者”的人,如果他们愿意的话。但是许多可以做到的人却不愿意。最近,我在雷克雅维克的一栋通过 Airbnb 共享的房子和一伙不断变化的临时远程工作团队度过了一段时间,我按照东海岸的时间来跟上他们的工作,也把早上和周末的时光都花费在探索冰岛了——但是最后几乎所有人都回到了湾区生活。
从经济层面来说,当然,这太疯狂了。搬到东南亚工作光在房租一项上每月就会为我们省下几千美金。 为什么那些可以在哥斯达黎加挣着旧金山的工资,或者在柏林赚着纽约水平薪资的人们,选择不这样做?为什么那些据说冷静固执的工程师在财政方面如此荒谬?
当然这里有社交和文化原因。清迈很不错,但没有大都会博物馆或者蒸汽朋克化装舞会,也没有 15 分钟脚程可以到的 50 家美食餐厅。柏林也很可爱,但没法提供风筝冲浪或者山脉远足和加州气候。当然也无法保证拥有无数和你一样分享同样价值观和母语的人们。
但是我觉得原因除了这些还有很多。我相信相比贫富之间的差异还有一个更基础的经济分水岭存在。我认为我们在目睹世界上可以实现超凡成就的“极端斯坦Extremistan”城市和无法成就伟大但可以工作和赚钱的“平均斯坦Mediocristan”城市之间正在生成巨大的裂缝。这些名词是从伟大的纳西姆·塔勒布那里偷来的
LCTT 译者注:[平均斯坦与极端斯坦的概念是美国学者纳西姆·塔勒布首先提出来的。他发现在我们所处的世界上,有些事物表现出相当的平均性,大部分个体都靠近均值,离均值越远则个体数量越稀少,与均值的偏离达到一定程度的个体数量将趋近于零。有些事物则表现出相当的极端性,均值这个概念在这个领域没有太多的意义,剧烈偏离均值的个体大量存在,而且偏离程度大得惊人。他把前者称为平均斯坦,把后者称为极端斯坦。][15]
艺术行业有着悠久历史的“极端斯坦”城市。这也解释了为什么有抱负的作家纷纷搬到纽约城,而那些已经在国际上大获成功的导演和演员仍然在不断被吸引到洛杉矶,如同飞蛾扑火。现在,这对技术行业同样适用。即使你不曾想试着(帮助)构造一些非凡的事物 —— 如今创业神话如此恢弘,很难想象有工程师完全没有梦想过它 —— _伟大事物发生的地方_正在以美好的前景如梦如幻的吸引着人们。
但是关于这一切有趣的是,理论上讲,它会改变;因为 —— 直到最近 —— 分布式的、分散管理的团队实际上可以获得超凡的成就。 情况对这些团队很不利因为风投的目光趋于短浅。但是没有任何法律指出独角兽公司只能诞生在加州和某些屈指可数的次级地域上而且似乎不管结果好坏极端斯坦正在扩散。如果这样的扩散最终可以矛盾地导致米申地区的房租变_便宜_那就太棒了
--------------------------------------------------------------------------------
via: https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
作者:[Jon Evans][a]
译者:[xiaow6](https://github.com/xiaow6)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://techcrunch.com/author/jon-evans/
[1]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/#comments
[2]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/#
[3]:http://twitter.com/share?via=techcrunch&amp;url=http://tcrn.ch/2owXJ0C&amp;text=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&amp;hashtags=
[4]:https://www.linkedin.com/shareArticle?mini=true&amp;url=https%3A%2F%2Ftechcrunch.com%2F2017%2F04%2F02%2Fwhy-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities%2F&amp;title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F
[5]:https://plus.google.com/share?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[6]:http://www.reddit.com/submit?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/&amp;title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F
[7]:http://www.stumbleupon.com/badge/?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[8]:mailto:?subject=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities?&amp;body=Article:%20https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[9]:https://share.flipboard.com/bookmarklet/popout?v=2&amp;title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&amp;url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[10]:https://mobile.twitter.com/Noahpinion/status/846054187288866
[11]:http://happyfuncorp.com/
[12]:https://twitter.com/rezendi
[13]:https://techcrunch.com/author/jon-evans/
[14]:https://techcrunch.com/2017/04/01/discussing-the-limits-of-artificial-intelligence/
[15]:http://blog.sina.com.cn/s/blog_5ba3d8610100q3b1.html

View File

@ -0,0 +1,118 @@
如何开始学习编程?
======================================================
> 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。
![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself")
最近有很多关于学习编程的争论。不仅仅是因为与软件开发公司公开的待应聘的职位数量相比较[符合招聘要求的人远远无法满足缺口][21],编程也是[工资最高][22]和[工作满足感最强][23]的众多职业之一。也难怪越来越多的人都想进入这个行业。
但是你要怎么做才能正确地入行呢?“**我应该怎么学习编程?**”是初学者常见的一个问题。尽管我没有这些问题的全部答案,但是我希望这篇文章能够给你提供相关指导来帮助你找到最适合你的需求和自身情况发展的解决办法。
### 你的学习方式是什么?
在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24]gnothi seauton意思是“认识你自己”。投入到一个大型的编程学习过程中难度不小。足够的自我认识是非常有必要的这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题
* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。
* **你的需要和要求是什么?**你为什么想学习如何编程是因为你只是想换一份工作吗如果是这样的话你需要多次时间才能完成呢你要牢记这些是_需要的_ 不是_想要的_ 。你可能_想要_下周就换份新工作但是_需要_在接下来的一年里供养你正在成长的家庭。当你在人生的道路上面临方向的抉择时时间的安排特别重要。
* **你能获取的参考资料有哪些?**当然,重返大学并获得一份计算机科学专业的学位证书可能也不错,但是你必须对你自己实事求是面对现实。你的生活必须和你学习相适应。你能承受花费几个月的时间和不菲的费用去参加集训吗?你是否生活在一个可以提供学习机会的地方,比如提供技术性的聚会或者大学课程?你能获取到的参考资料会对你的学习过程产生巨大的影响。在打算学编程换工作前先调查好这些。
### 选择一门编程语言
当你打算开始你的编程学习之路和考虑你的选择的时候请记住不管其他人说什么选择哪门编程语言来开始你的编程学习_关系不大_。是的是有些编程语言比其他的更流行。比如根据一份调查研究目前 JavaScriptJavaPHP 和 Python 处于 [最受欢迎最流行的编程][25] 中的前排。但是现在正流行的编程语言有可能过几年就过时了,所以不用太纠结编程语言的选择。像那些方法,类,函数,条件,控制流程和其他的编程的概念思想等等,不管你选的哪门编程语言,它们的底层原理基本是一致的。只有语法和社区的最佳实践会变。因此你能够用 [Perl][26] 学习编程,也可以用 [Swift][27] 或者 [Rust][28]。作为一个程序员,你会在你的职业生涯里用很多不同的编程语言来工作。不要认为你被困在了编程语言的选择上。
### 试水
除非你已经涉足过这个行业或者确信你愿意花费你生命的剩余时光来编程,我建议你最好还是下水之前先用脚趾头来试试水温之类的来判断这水适不适合。这种工作不是每个人都能做的。在把全部希望都压在学习编程之前,你可以先尝试花费少量时间金钱来学习一小部分知识点来了解自己是否会享受这种每周起码花费 40 个小时来编码工作的生活。如果你不喜欢这种工作,你不太可能完成编程项目的学习。即便你完成结束了编程的学习阶段,你也会在你以后的编程工作中感到无比痛苦。人生苦短就不要花费你人生三分之一的时间来做你不喜欢的事了。 
谢天谢地,软件开发不仅仅需要编程。熟悉编程概念和理解软件是怎么和他们结合在一起的是非常有用的,但是你不需要成为一个程序员也能在软件开发行业中找到一份报酬不菲的工作。在软件开发过程中,另外的重要角色有技术文档撰写人、项目经理、产品经理、测试人员、设计人员、用户体验设计者、运维/系统管理员和数据科学家等。软件成功的启动需要很多角色之间相互配合。不要觉得学习了编程就要求你成为一个程序员。你需要探索你的选择并确定哪个选择才是最适合你的。
### 参考的学习资料
你对学习参考资料的选择是什么?可能正如你已经发现的那样,可供选择的参考资料非常多,尽管在你的那片区域不是所有的资料都能够获得。
* **训练营**:最近这几年像 [App Academy][5] 和 [Bloc][6] 这样的训练营越来越流行。训练营通常收费 $10K 或者更多,他们宣称在几周内就能够把一个学生培训成一个称职的程序员。在参加编程集训营前,你需要研究下你将要学习的项目能确保正如它所承诺的那样,在学生学完毕业后能够找到一个高薪的长期供职的职位。一方面花费了数目不小的钱财,而且时间也花费了不少——通常这些都是典型的全日制课程并且要求学生在接下来的连续几周里把其它的事先放在一边专心课程学习。然而时间金钱这两项不菲的消耗通常会使很多未来的程序员无法参加训练营。
* **社区学院/职业培训中心**:社区学院常常被那些调研自己学习编程的方式的人所忽视,不得不说这些人该为自己对社区学院的忽视感到羞愧。你在社区学院或者职业培训中心能够接受到的教育是和你选择其他方式学习编程的学习效果一样有效,而且费用也不高。
* **国家/地方的培训项目**:许多地区都认识到在他们的地区增加技术投资的经济效益,并且已经制定了培训计划来培养受过良好教育和准备好的劳动力。培训项目的案例包括了 [Code Oregon][7] 和 [Minneapolis TechHire][8]。检查下你的州、省或自治区是否提供这样的项目。
* **在线训练**:许多公司和组织都提供在线技术培训项目。比如,[Linux 基金会][9]致力于通过开源技术使人们获得成功。其他的像 [O'Reilly Media][10]、[Lynda.com][11] 和 [Coursera][12] 在软件开发涉及的许多方面提供培训。[Codecademy][13] 提供对编程概念的在线介绍。每个项目的成本会有所不同,但大多数项目会允许你在你的日程安排中学习。
* **MOOC**:在过去的几年里,大规模开放在线课程的发展势头已经很好了。像 [哈佛][14]、[斯坦福][15]、[MIT][16] 和其他的一些世界一流大学他们一直在记录他们的课程,并免费提供在线课程。课程的自我指导性质可能并不适合所有人,但可利用的材料使这成为一个有价值的学习选择。
* **专业书籍**:许多人喜欢用书自学。这是相当经济的,在初步学习阶段后提供了现成的参考资料。尽管你可以通过像 [Safari][17] 和 [Amazon][18] 这样的在线服务订购和访问图书,但是也不要忘了检查你本地的公共图书馆。
### 网络支持
无论你选择哪一种学习资源,有网络支持都将获得更大的成功。与他人分享你的经历和挑战可以帮助你保持动力,同时为你提供一个放心的地方去问那些你可能还没有足够自信到其他地方去问的问题。许多城镇都有当地的用户群聚在一起讨论和学习软件技术。通常你可以在 [Meetup.com][29] 这里找到。专门的兴趣小组,比如 [Women Who Code][30] 和 [Code2040][31],在大多数城市地区经常举行会议和黑客马拉松活动,这是在你学习的时候结识并建立一个支持网络的很好的方式。一些软件会议举办“黑客日”,在那里你可以遇到有经验的软件开发人员,他们能够帮助你解决你所困扰的一些问题。例如,每年的 [PyCon][32] 会议都会提供几天的时间来让人们聚集在一起工作、研讨。一些项目,比如 [BeeWare][33],使用这些短暂的时间来帮助新程序员学习和对这些项目做贡献。
你的网络支持不需要来自正式的聚会。一个小的学习小组可以有效地保持你的学习积极性,并且可以像在你最喜欢的社交网络上发布邀请一样容易形成。如果你生活在一个没有大量软件开发人员社区所支持的聚会和用户组的地区,那么这一点特别有用。
### 开始学习编程的几个步骤
简单的来说,既然你决定学习编程,可以参考这几个方法给自己一个尽可能成功的机会:
1. 将你的需要/需求和参考学习资料列出清单并进行收集
2. 搜寻在你的当地那里能够可用的选择
3. 放弃不能符合你的需求和参考学习资料的选择
4. 选择最符合你需求的和最适合你的学习参考资源
5. 找到一个能够得到支持的网络
务必牢记:你的学习过程永远不会结束。高速发展的软件产业,会导致新技术和新进展几乎每天都会出现。一旦你学会了编程,你就必须花时间去学习适应这些新的进步。你不能依靠你的工作来为你提供这种培训。只有你自己负责自己的职业发展,所以如果你想保持最新的技术和工作能力,你必须紧跟行业最新的技术。
祝你好运!
(题图 : Opensource.com 修改自 [维基共享][20]里的某不知名艺术家的作品
--------------------------------------------------------------------------------
作者简介:
VM (Vicky) Brasseur - VM (aka Vicky) 是一个技术人员,也是项目、工作进程、产品和企业的经理。在她的长达 18 年的科技行业里,她曾是一名分析师、程序员、产品经理、软件工程经理和软件工程总监。目前,她是惠普企业上游开源开发团队的高级工程经理。她的博客是 anonymoushash.vmbrasseur.com推特是 @vmbrasseur。 
--------
via: https://opensource.com/article/17/4/how-get-started-learning-program
作者:[VM (Vicky) Brasseur][a]
译者:[WangYueScream](https://github.com/WangYueScream)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/vmbrasseur
[1]:https://opensource.com/tags/python?src=programming_resource_menu
[2]:https://opensource.com/tags/javascript?src=programming_resource_menu
[3]:https://opensource.com/tags/perl?src=programming_resource_menu
[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu
[5]:https://www.appacademy.io/
[6]:https://www.bloc.io/
[7]:http://codeoregon.org/
[8]:http://www.minneapolismn.gov/cped/metp/TechHire#start
[9]:https://training.linuxfoundation.org/
[10]:http://shop.oreilly.com/category/learning-path.do
[11]:https://www.lynda.com/
[12]:https://www.coursera.org/
[13]:https://www.codecademy.com/
[14]:https://www.edx.org/school/harvardx
[15]:http://online.stanford.edu/courses
[16]:https://ocw.mit.edu/index.htm
[17]:https://www.safaribooksonline.com/
[18]:https://amazon.com/
[19]:https://opensource.com/article/17/4/how-get-started-learning-program?rate=txl_aE6F2oOUSgQDveWFtrPWIbA1ULFwfOp017zV35M
[20]:https://commons.wikimedia.org/wiki/File:Roman-mosaic-know-thyself.jpg
[21]:http://www.techrepublic.com/article/report-40-of-employers-worldwide-face-talent-shortages-driven-by-it/
[22]:http://web.archive.org/web/20170328065655/http://www.businessinsider.com/highest-paying-jobs-in-america-2017-3/#-25
[23]:https://stackoverflow.com/insights/survey/2017/#career-satisfaction
[24]:https://en.wikipedia.org/wiki/Know_thyself
[25]:https://stackoverflow.com/insights/survey/2017/#most-popular-technologies
[26]:https://learn.perl.org/tutorials/
[27]:http://shop.oreilly.com/product/0636920045946.do
[28]:https://doc.rust-lang.org/book/
[29]:https://www.meetup.com/
[30]:https://www.womenwhocode.com/
[31]:http://www.code2040.org/
[32]:https://us.pycon.org/
[33]:http://pybee.org/
[34]:https://opensource.com/user/10683/feed
[35]:https://opensource.com/article/17/4/how-get-started-learning-program#comments
[36]:https://opensource.com/users/vmbrasseur

View File

@ -1,39 +1,39 @@
如何配置并集成 iRedMail 服务到 Samba4 AD DC 中 - 第 11 部分
============================================================
Samba 系列(十一):如何配置并集成 iRedMail 服务到 Samba4 AD DC 中
=========================================================
在本教程中,将学习如何修改提供邮件服务的 iRedMail 主要守护进程,相应地,[Postfix 用于邮件传输Dovecot 将邮件传送到帐户邮箱][4],以便将它们集成到 [Samba4 AD 域控制器][5]中。
在本教程中,将学习如何修改 iRedMail 的主要守护进程,相应地,[Postfix 用于邮件传输Dovecot][4] 将邮件传送到帐户邮箱,以便将它们集成到[ Samba4 AD 域控制器][5]中
将 iRedMail 集成到 Samba4 AD DC 中,你将得到以下好处:通过 Samba AD DC 得到用户身份验证、管理和状态,在 AD 组和 Roundcube 中的全局 LDAP 地址簿的帮助下创建邮件列表
将 iRedMail 集成到 Samba4 AD DC 中,你将得到以下好处:用户身份验证、管理和通过 Samba AD DC 的状态、在 Roundcube 中的 AD 组和全局 LDAP 地址簿的帮助下创建邮件列表。
#### 要求
### 要求
1. [在 CentOS 7 中为 Samba4 AD 集成安装 iRedMail][1]
### 第一步:准备 iRedMail 系统用于 Samba4 AD 集成
1. 在第一步中,你需要[为你的机器分配一个静态的 IP 地址][6]以防你使用的是由 DHCP 服务器提供的动态 IP 地址。
1 在第一步中,你需要[为你的机器分配一个静态的 IP 地址][6]以防你使用的是由 DHCP 服务器提供的动态 IP 地址。
运行[ ifconfig 命令][7]列出你的机器网络接口名,并对正确的网卡发出 [nmtui-edit][8] 命令,使用自定义 IP 设置编辑正确的网络接口。
运行 [ifconfig 命令][7]列出你的机器网络接口名,并对正确的网卡发出 [nmtui-edit][8] 命令,使用自定义 IP 设置编辑正确的网络接口。
root 权限运行 nmtui-edit 命令。
root 权限运行 nmtui-edit 命令。
```
# ifconfig
# nmtui-edit eno16777736
```
[![Find Network Interface Name](https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png)][9]
找出网络接口名
[![Find Network Interface Name](https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png)][9]
2. 在打开要编辑的网络接口后,添加正确的静态 IP 设置,确保添加了 Samba4 AD DC 的 DNS 服务器 IP 地址以及你的域的名字,以便从机器查询 realm。使用以下截图作为指导。
*找出网络接口名*
2、 在打开要编辑的网络接口后,添加正确的静态 IP 设置,确保添加了 Samba4 AD DC 的 DNS 服务器 IP 地址以及你的域的名字,以便从机器查询 realm。使用以下截图作为指导。
[![Configure Network Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png)][10]
配置网络设置
*配置网络设置*
3. 在你完成配置网络接口后,重启网络进程使更改生效,并对域名以及 samba 4 域控制器的 FQDN 使用 ping 命令测试。
3 在你完成配置网络接口后,重启网络进程使更改生效,并对域名以及 samba 4 域控制器的 FQDN 使用 ping 命令测试。
```
# systemctl restart network.service
@ -44,31 +44,33 @@
```
[![Verify Network DNS Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png)][11]
验证网络 DNS 配置
*验证网络 DNS 配置*
4. 接下来,用下面的命令安装 ntpdate 包,与域控制器同步时间,并请求 samba4 机器的 NTP 服务器:
4、 接下来,用下面的命令安装 `ntpdate` 包,与域控制器同步时间,并请求 samba4 机器的 NTP 服务器:
```
# yum install ntpdate
# ntpdate -qu tecmint.lan # querry domain NTP servers
# ntpdate tecmint.lan # Sync time with the domain
```
[![Sync Time with Samba NTP Server](https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png)][12]
与 Samba NTP 服务器同步时间
[![Sync Time with Samba NTP Server](https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png)][12]
5. 你或许想要本地时间自动与 samba AD 时间服务器同步。为了实现这个设置,通过运行 [crontab -e 命令][13]并追加下面的行添加一条计划任务。
*与 Samba NTP 服务器同步时间*
5、 你或许想要本地时间自动与 samba AD 时间服务器同步。为了实现这个设置,通过运行 [crontab -e 命令][13]并追加下面的行添加一条计划任务。
```
0 */1 * * * /usr/sbin/ntpdate tecmint.lan > /var/log/ntpdate.lan 2>&1
```
[![Auto Sync Time with Samba NTP](https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png)][14]
自动与 Samba NTP 同步时间
[![Auto Sync Time with Samba NTP](https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png)][14]
*自动与 Samba NTP 同步时间*
### 第二步:为 iRedMail 集成准备 Samba4 AD DC
6. 现在,如[这篇][16]教程所述进入一台[安装了 RSAT 工具的 Windows 机器][15]管理 Samba4 AD。
6 现在,如[这篇][16]教程所述进入一台[安装了 RSAT 工具的 Windows 机器][15]管理 Samba4 AD。
打开 DNS 管理器,转到你的域转发查找区并添加新的 A 记录、MX记录还有 PTR 记录指向你的 iRedMail 系统的 IP 地址。使用以下截图作为指导。
@ -76,23 +78,21 @@
[![Create DNS A Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png)][17]
为 iRedMail 创建 DNS A 记录
*为 iRedMail 创建 DNS A 记录*
添加 MX 记录(将子域留空,优先级为 10
[![Create DNS MX Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png)][18]
为 iRedMail 创建 DNS MX 记录
*为 iRedMail 创建 DNS MX 记录*
在反向查找区域(相应地替换 iRedMail 服务器的 IP 地址)添加 PTR 记录。如果你尚未为域控制器配置反向区域,请阅读以下教程:
1. [从 Windows 管理 Samba4 DNS 组策略][2]
在反向查找区域(相应地替换 iRedMail 服务器的 IP 地址)添加 PTR 记录。如果你尚未为域控制器配置反向区域,请阅读以下教程:[从 Windows 管理 Samba4 DNS 组策略][2]
[![Create DNS PTR Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png)][19]
为 iRedMail 创建 DNS PTR 记录
*为 iRedMail 创建 DNS PTR 记录*
7.添加了使邮件服务器正常运行的基本 DNS 记录后,请进入 iRedMail 机器,安装 bind-utils 软件包,并按如下建议查询新添加的邮件记录。
7添加了使邮件服务器正常运行的基本 DNS 记录后,请进入 iRedMail 机器,安装 bind-utils 软件包,并按如下建议查询新添加的邮件记录。
Samba4 AD DC DNS 应该会响应之前添加的 DNS 记录。
@ -102,49 +102,48 @@ Samba4 AD DC DNS 应该会响应之前添加的 DNS 记录。
# host mail.tecmint.lan
# host 192.168.1.245
```
[![Install Bind and Query Mail Records](https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png)][20]
安装 Bind 并查询邮件记录
[![Install Bind and Query Mail Records](https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png)][20]
在一台 Windows 机器上,打开命令行窗口并使用[ nslookup 命令][21]查询上面的邮件服务器记录。
*安装 Bind 并查询邮件记录*
8. 作为最后一个先决要求,在 Samba4 AD DC 中创建一个具有最小权限的新用户帐户,并使用名称 vmail, 为此用户选择一个强密码, 并确保该用户的密码永不过期。
在一台 Windows 机器上,打开命令行窗口并使用 [nslookup 命令][21]查询上面的邮件服务器记录。
8、 作为最后一个先决要求,在 Samba4 AD DC 中创建一个具有最小权限的新用户帐户,并使用名称 vmail, 为此用户选择一个强密码, 并确保该用户的密码永不过期。
vmail 帐户将被 iRedMail 服务用来查询 Samba4 AD DC LDAP 数据库并拉取电子邮件帐户。
要创建 vmail 账户,如截图所示,使用加入了已安装 RSAT 工具域的 Windows 机器上的 ADUC 图形化工具,或者按照先前主题中那样用 samba-tool 命令行直接在域控制器中运行。
1. [在 Linux 命令行中管理 Samba4 AD][3]
要创建 vmail 账户,如截图所示,使用加入了已安装 RSAT 工具域的 Windows 机器上的 ADUC 图形化工具,或者按照先前主题中那样用 [samba-tool 命令行][3]直接在域控制器中运行。
在本指导中,我们会使用上面提到的第一种方法。
[![Active Directory Users and Computers](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-Users-and-Computers.png)][22]
AD 用户和计算机
*AD 用户和计算机*
[![Create New User for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-New-User-for-iRedMail.png)][23]
为 iRedMail 创建新的用户
*为 iRedMail 创建新的用户*
[![Set Strong Password for User](https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Password-for-User.png)][24]
为用户设置强密码
*为用户设置强密码*
9. 在 iRedMail 系统中,用下面的命令测试 vmail 用户能够查询 Samba4 AD DC LDAP 数据库。返回的结果应该是你的域的对象总数, 如下截图所示。
9 在 iRedMail 系统中,用下面的命令测试 vmail 用户能够查询 Samba4 AD DC LDAP 数据库。返回的结果应该是你的域的对象总数, 如下截图所示。
```
# ldapsearch -x -h tecmint.lan -D 'vmail@tecmint.lan' -W -b 'cn=users,dc=tecmint,dc=lan'
```
注意:相应地替换域名以及 Samba4 AD 的 LDAP dn cn=users,dc=tecmint,dc=lan)。
注意:相应地替换域名以及 Samba4 AD 的 LDAP dn `cn=users,dc=tecmint,dc=lan`)。
[![Query Samba4 AD DC LDAP](https://www.tecmint.com/wp-content/uploads/2017/05/Query-Samba4-AD-DC-LDAP.png)][25]
查询 Samba4 AD DC LDAP
*查询 Samba4 AD DC LDAP*
### 第三步:将 iRedMail 服务集成到 Samba4 AD DC 中
10. 现在是时候修改 iRedMail 服务Postfix、Dovecot 和 Roundcube以便为邮箱帐户查询 Samba4 域控制器。
10 现在是时候修改 iRedMail 服务Postfix、Dovecot 和 Roundcube以便为邮箱帐户查询 Samba4 域控制器。
第一个要修改的服务是 MTA 代理Postfix。执行以下命令禁用一系列的 MTA 设置,添加你的域名到 Postfix 本地域以及邮箱域中,并使用 Dovecot 代理发送已接收的邮件到用户邮箱中。
@ -167,7 +166,7 @@ AD 用户和计算机
# postmap hash:/etc/postfix/transport
```
11. 接下来,用你最喜欢的文本编辑器创建 Postfix `/etc/postfix/ad_sender_login_maps.cf` 配置文件,并添加下面的配置。
11 接下来,用你最喜欢的文本编辑器创建 Postfix `/etc/postfix/ad_sender_login_maps.cf` 配置文件,并添加下面的配置。
```
server_host = tecmint.lan
@ -184,7 +183,7 @@ result_attribute= userPrincipalName
debuglevel = 0
```
12. 使用下面的配置创建 `/etc/postfix/ad_virtual_mailbox_maps.cf`
12 使用下面的配置创建 `/etc/postfix/ad_virtual_mailbox_maps.cf`
```
server_host = tecmint.lan
@ -202,7 +201,7 @@ result_format = %d/%u/Maildir/
debuglevel = 0
```
13. 使用下面的配置创建 `/etc/postfix/ad_virtual_group_maps.cf`
13 使用下面的配置创建 `/etc/postfix/ad_virtual_group_maps.cf`
```
server_host = tecmint.lan
@ -221,9 +220,9 @@ result_attribute= userPrincipalName
debuglevel = 0
```
替换上面三个配置文件中的 server_host、bind_dn、bind_pw  search_base 以反应你自己域的设置。
替换上面三个配置文件中的 `server_host``bind_dn``bind_pw` 和 `search_base` 以反应你自己域的设置。
14. 接下来,打开 Postfix 主配置文件,通过在下面的行前添加 `#`,搜索并禁用 iRedAPD 的 check_policy_service 和 smtpd_end_of_data_restrictions。
14 接下来,打开 Postfix 主配置文件,通过在下面的行前添加 `#` 注释,搜索并禁用 iRedAPD 的 `check_policy_service``smtpd_end_of_data_restrictions`
```
# nano /etc/postfix/main.cf
@ -236,7 +235,7 @@ debuglevel = 0
#smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:7777
```
15. 现在,通过执行一系列查询,验证 Postfix 是否使用现有的域用户和域组绑定到 Samba AD如以下示例所示。
15 现在,通过执行一系列查询,验证 Postfix 是否使用现有的域用户和域组绑定到 Samba AD如以下示例所示。
结果应与下面的截图类似。
@ -245,13 +244,14 @@ debuglevel = 0
# postmap -q tecmint_user@tecmint.lan ldap:/etc/postfix/ad_sender_login_maps.cf
# postmap -q linux_users@tecmint.lan ldap:/etc/postfix/ad_virtual_group_maps.cf
```
[![Verify Postfix Binding to Samba AD](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png)][26]
验证 Postfix 绑定到了 Samba AD
[![Verify Postfix Binding to Samba AD](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png)][26]
*验证 Postfix 绑定到了 Samba AD*
相应替换 AD 用户及组帐户。同样,确保你使用的 AD 组已被分配了一些成员。
16. 在下一步中修改 Dovecot 配置文件以查询 Samba4 AD DC。打开 `/etc/dovecot/dovecot-ldap.conf` 文件并添加下面的行。
16 在下一步中修改 Dovecot 配置文件以查询 Samba4 AD DC。打开 `/etc/dovecot/dovecot-ldap.conf` 文件并添加下面的行。
```
hosts = tecmint.lan:389
@ -269,28 +269,28 @@ default_pass_scheme = CRYPT
user_attrs = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/
```
Samba4 AD 帐户的邮箱将会存储在 /var/vmail/vmail1/your_domain.tld/your_domain_user/Maildir/ 中。
Samba4 AD 帐户的邮箱将会存储在 `/var/vmail/vmail1/your_domain.tld/your_domain_user/Maildir/` 中。
17. 确保 dovecot 的主配置文件中启用了 pop3 和 imap 协议。打开 `/etc/dovecot/dovecot.conf` 验证是否启用了 quota 和 acl 邮件插件,并检查这些值是否存在。
17 确保 dovecot 的主配置文件中启用了 pop3 和 imap 协议。打开 `/etc/dovecot/dovecot.conf` 验证是否启用了 `quota``acl` 邮件插件,并检查这些值是否存在。
[![Enable Pop3 and Imap in Dovecot](https://www.tecmint.com/wp-content/uploads/2017/05/Enable-Pop3-Imap-in-Dovecot.png)][27]
在 Dovecot 中启用 POP3 和 IMAP
*在 Dovecot 中启用 POP3 和 IMAP*
18. 可选地,如果要将全局硬配额设置为每个域用户的最大不超过 500 MB 存储,请在 /etc/dovecot/dovecot.conf 文件中添加以下行。
18 可选地,如果要将全局硬配额设置为每个域用户的最大不超过 500 MB 存储,请在 `/etc/dovecot/dovecot.conf` 文件中添加以下行。
```
quota_rule = *:storage=500M
```
19. 最后,为了使目前这些更改生效,用 root 权限执行下面的命令重启并验证 Postfix 和 Dovecot 守护进程的状态。
19 最后,为了使目前这些更改生效,用 root 权限执行下面的命令重启并验证 Postfix 和 Dovecot 守护进程的状态。
```
# systemctl restart postfix dovecot
# systemctl status postfix dovecot
```
20. 为了使用 IMAP 协议从命令行测试邮件服务器配置,请使用 telnet 或[ netcat 命令][28],如下所示。
20 为了使用 IMAP 协议从命令行测试邮件服务器配置,请使用 telnet 或 [netcat 命令][28],如下所示。
```
# nc localhost 143
@ -298,9 +298,10 @@ a1 LOGIN ad_user@your_domain.tld ad_user_password
a2 LIST “” “*”
a3 LOGOUT
```
[![Test iRedMail Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png)][29]
测试 iRedMail 配置
[![Test iRedMail Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png)][29]
*测试 iRedMail 配置*
如果你可以使用 Samba4 用户帐户从命令行执行 IMAP 登录,那么 iRedMail 服务器似乎已经准备好发送和接收 AD 帐户的邮件。
@ -312,34 +313,33 @@ a3 LOGOUT
我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。
-----
via: https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/
作者:[ Matei Cezar][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
作者:[Matei Cezar][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/cezarmatei/
[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/
[2]:https://www.tecmint.com/manage-samba4-dns-group-policy-from-windows/
[3]:https://www.tecmint.com/manage-samba4-active-directory-linux-command-line/
[1]:https://linux.cn/article-8567-1.html
[2]:https://linux.cn/article-8258-1.html
[3]:https://linux.cn/article-8070-1.html
[4]:https://www.tecmint.com/setup-postfix-mail-server-and-dovecot-with-mariadb-in-centos/
[5]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/
[6]:https://www.tecmint.com/set-add-static-ip-address-in-linux/
[5]:https://linux.cn/article-8065-1.html
[6]:https://linux.cn/article-3977-1.html
[7]:https://www.tecmint.com/ifconfig-command-examples/
[8]:https://www.tecmint.com/configure-network-connections-using-nmcli-tool-in-linux/
[8]:https://linux.cn/article-5410-1.html
[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png
[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png
[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png
[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png
[13]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/
[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png
[15]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/
[16]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/
[15]:https://linux.cn/article-8097-1.html
[16]:https://linux.cn/article-8097-1.html
[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png
[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png
[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png

View File

@ -1,30 +1,24 @@
如何在 Samba4 AD 中集成 iRedMail Roundcube - 第 12 部分
Samba 系列(十二):如何在 Samba4 AD 中集成 iRedMail Roundcube
============================================================
by [Matei Cezar][15] | 发布日期: 2017-05-13 | 更新日期: 2017-05-14
 Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17]
现在下载你的免费电子书 - [10 本给管理员的免费电子书][16] | [4 本免费的 shell 脚本电子书][17]
[Roundcube][3] 是 Linux 中最常用的 Webmail 用户代理之一,它为终端用户提供了一个现代化的 Web 界面它可以与所有邮件服务进行交互以便阅读、撰写和发送电子邮件。Roundcube 支持各种邮件协议包括安全的邮件协议如IMAPSPOP3S 或者 submission。
[Roundcube][3] 是 Linux 中最常用的 Webmail 用户代理之一,它为终端用户提供了一个现代化的 Web 界面它可以与所有邮件服务进行交互以便阅读、撰写和发送电子邮件。Roundcube 支持各种邮件协议包括安全的邮件协议如IMAPS、POP3S 或者 submission。
在本文中,我们将讨论如何在 iRedMail 中使用 IMAPS 以及 submission 安全端口配置 Roundcube以检索和发送 Samba4 AD 帐户的电子邮件、如何从浏览器访问 iRedMail Roundcube Web 界面,并添加网址别名、如何启用 Samba4 AD 集成全局 LDAP 地址簿以及如何禁用某些不需要的 iRedMail 服务。
#### 要求
### 要求
1. [如何在 CentOS 7 上安装 iRedMail用于Samba4 AD集成][1]
2. [在 CentOS 7 上配置 iRedMail用于 Samba4 AD 集成][2]
### 第一步:在 Samba4 AD DC 中声明域帐户的电子邮件地址
1. 为了发送和接收 Samba4 AD DC 域账户的邮件,您需要编辑每个用户帐户,如下所示,通过从[安装了 RSAT 工具的 Windows 机器][4]并且已经加入 Samba4 AD 中打开 ADUC 工具显式地在邮箱字段填写正确的地址。
1 为了发送和接收 Samba4 AD DC 域账户的邮件,您需要编辑每个用户帐户,如下所示,通过从[安装了 RSAT 工具的 Windows 机器][4]并且已经加入 Samba4 AD 中打开 ADUC 工具显式地在邮箱字段填写正确的地址。
[![Add Email Account to Join Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg)][5]
添加邮箱帐户来加入 Samba4 AD DC
*添加邮箱帐户来加入 Samba4 AD DC*
2. 相似地,要使用邮件列表,你需要在 ADUC 中创建组,为每个组添加相应的电子邮件地址,并分配合适的用户帐户作为每个组的成员。
2 相似地,要使用邮件列表,你需要在 ADUC 中创建组,为每个组添加相应的电子邮件地址,并分配合适的用户帐户作为每个组的成员。
这步创建了一个邮件列表,所有 Samba4 AD 组成员的邮箱都会收到给这个 AD 组邮箱地址的邮件。使用下面的截图作为指导为 Samba4 组声明电子邮件字段,并为组添加域成员。
@ -32,15 +26,15 @@ by [Matei Cezar][15] | 发布日期: 2017-05-13 | 更新日期: 2017-05-14
[![Create Group Admin for Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png)][6]
为 Samba4 AD DC 创建组管理员
*为 Samba4 AD DC 创建组管理员*
[![Add Users to Group](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png)][7]
将用户添加到组
*将用户添加到组*
在本例中,发送给 admins@tecmint.lan 的所有邮件地址将被该组的每个成员邮箱接收,它是 “Domain Admins” 组声明的电子邮件地址。
3. 你可以声明 Samba4 AD 帐户的电子邮件地址的另一种方法是直接从其中一个 AD DC 控制台使用 samba-tool 命令行创建一个用户或组,并使用 `--mail-address` 标志指定邮件地址。
3 你可以声明 Samba4 AD 帐户的电子邮件地址的另一种方法是直接从其中一个 AD DC 控制台使用 samba-tool 命令行创建一个用户或组,并使用 `--mail-address` 标志指定邮件地址。
使用下面其中一个命令创建一个指定邮件地址的用户:
@ -69,14 +63,13 @@ by [Matei Cezar][15] | 发布日期: 2017-05-13 | 更新日期: 2017-05-14
### 第二步:安全 Roundcube Webmail
4. 开始修改 Roundcube 配置文件之前,首先使用[ netstat 命令][8]管道输出给 egrep 过滤器来列出[ Dovecot 和 Postfix ][9]监听的套接字并确保安全端口IMAPS 是 993submission 是 587 )是活跃的并且已启用。
4 开始修改 Roundcube 配置文件之前,首先使用 [netstat 命令][8]管道输出给 egrep 过滤器来列出 [Dovecot 和 Postfix][9] 监听的套接字并确保安全端口IMAPS 是 993submission 是 587 )是活跃的并且已启用。
```
# netstat -tulpn| egrep 'dovecot|master'
```
5. 要强制邮件的接收和发送在使用安全的 IMAP 和 SMTP 端口的 Roundcube 以及 iRedMail 服务之间,打开位于 /var/www/roundcubemail/config/config.inc.php 的 Roundcube 配置文件并确保你修改过了下面的行,本例中是 localhost如下片段所示
5、 要强制邮件的接收和发送在使用安全的 IMAP 和 SMTP 端口的 Roundcube 以及 iRedMail 服务之间,打开位于 `/var/www/roundcubemail/config/config.inc.php` 的 Roundcube 配置文件并确保你修改过了下面的行,本例中是 `localhost`,如下片段所示:
```
// For IMAPS
@ -93,7 +86,7 @@ $config['smtp_auth_type'] = 'LOGIN';
这步强烈建议在远程主机中安装 Roudcube而不是提供了邮件服务的主机中IMAP、POP3 或者 SMTP 守护进程)。
6. 接下来,不要关闭配置文件,搜索并做如下小的修改以便 Roundcube 能够通过 HTTPS 协议访问、隐藏版本号以及自动为登录 Web 界面的帐户追加域名。
6 接下来,不要关闭配置文件,搜索并做如下小的修改以便 Roundcube 能够通过 HTTPS 协议访问、隐藏版本号以及自动为登录 Web 界面的帐户追加域名。
```
$config['force_https'] = true;
@ -101,7 +94,7 @@ $config['useragent'] = 'Your Webmail'; // Hide version number
$config['username_domain'] = 'domain.tld'
```
7. 同样禁用下面的插件managesieve 和 password通过在以 $config[plugins] 开头的行前添加注释 `(//)`。
7 同样禁用下面的插件managesieve 和 password通过在以 `$config[plugins]` 开头的行前添加注释 `//`。
一旦登录并验证了域,用户将从连接到 Samba4 AD DC 的 Windows 或 Linux 机器上更改密码。系统管理员将全局管理域帐户的所有筛选规则。
@ -109,7 +102,7 @@ $config['username_domain'] = 'domain.tld'
// $config['plugins'] = array('managesieve', 'password');
```
8. 最后,保存并关闭配置文件,并打开浏览器访问 Roundcube Webmail通过 HTTPS 协议进入 iRedMail IP 地址或者 FQDN/mail 位置。
8 最后,保存并关闭配置文件,并打开浏览器访问 Roundcube Webmail通过 HTTPS 协议进入 iRedMail IP 地址或者 FQDN/mail 位置。
由于浏览器使用的是自签名证书,所以你首次访问 Roundcube 会在浏览器上看到一个警告。接受证书并用 Samba AD 帐户凭证登录。
@ -118,13 +111,13 @@ https://iredmail-FQDN/mail
```
[![Roundcube Webmail Login](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png)][10]
Roundcube Webmail 登录
*Roundcube Webmail 登录*
### 第三步:在 Roundcube 中启用 Samba AD 联系人
9. 要配置 Samba AD 全局 LDAP 地址簿以在 Roundcube 联系人中显示,再次打开 Roundcube 配置文件,并做如下修改:
9 要配置 Samba AD 全局 LDAP 地址簿以在 Roundcube 联系人中显示,再次打开 Roundcube 配置文件,并做如下修改:
到达文件的底部,并辨认以 “# Global LDAP Address Book with AD” 开头的部分,删除到文件底部的所有内容,并替换成如下代码段:
到达文件的底部,并辨认以 `# Global LDAP Address Book with AD` 开头的部分,删除到文件底部的所有内容,并替换成如下代码段:
```
# Global LDAP Address Book with AD.
@ -164,29 +157,29 @@ $config['ldap_public']["global_ldap_abook"] = array(
);
```
在这段代码中替换相应的 name、hosts、base_dn、bind_dn  bind_pass 的值。
在这段代码中替换相应的 `name``hosts``base_dn``bind_dn` 和 `bind_pass` 的值。
10. 做了所需修改后,保存并关闭文件,登录 Roundcube webmail 界面,并进入地址簿菜单。
10 做了所需修改后,保存并关闭文件,登录 Roundcube webmail 界面,并进入地址簿菜单。
所有域名帐户(用户和组)与其指定的电子邮件地址的联系人列表都将被显示在全局地址簿上。
[![Roundcube User Contact List](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png)][11]
Roundcube 用户联系人列表
*Roundcube 用户联系人列表*
### 第四步:为 Roundcube Webmail 界面添加一个别名
11. 要从 https//webmail.domain.tld 访问 Roundcube 而不是从 iRedMail 默认提供的旧地址,你需要进行以下更改。
11、 要从 https://webmail.domain.tld 访问 Roundcube 而不是从 iRedMail 默认提供的旧地址,你需要进行以下更改。
在已安装 RSAT 工具的已加入的 Windows 机器上打开 DNS 管理器,并如下所示,添加一条 iRedMail FQDN、named webmail 的 CNAME 记录。
[![DNS Webmail Properties](https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg)][12]
DNS Webmail 属性
*DNS Webmail 属性*
12. 接下来,在 iRedMail 机器中,打开位于 /etc/httpd/conf.d/ssl.conf 的 Apache Web 服务器的 SSL 配置文件,将 DocumentRoot 指向 /var/www/roundcubemail/。
12 接下来,在 iRedMail 机器中,打开位于 `/etc/httpd/conf.d/ssl.conf` 的 Apache Web 服务器的 SSL 配置文件,将 `DocumentRoot` 指向 `/var/www/roundcubemail/`
修改 /etc/httpd/conf.d/ssl.conf 片段
修改 `/etc/httpd/conf.d/ssl.conf` 片段:
```
@ -199,7 +192,7 @@ DocumentRoot “/var/www/roundcubemail/”
# systemctl restart httpd
```
13. 现在打开下面的地址Roundcube 界面应该会显示出来。接受自签名证书错误以进入登录页面。用你自己的域名替换例子中的 domain.tld。
13 现在打开下面的地址Roundcube 界面应该会显示出来。接受自签名证书错误以进入登录页面。用你自己的域名替换例子中的 domain.tld。
```
https://webmail.domain.tld
@ -207,42 +200,41 @@ https://webmail.domain.tld
### 第五步:禁用 iRedMail 未使用的服务
14. 由于 iRedMail 守护进程配置为查询 Samba4 AD DC LDAP 服务器的帐户信息和其他资源,因此可以通过使用以下命令来安全地停止和禁用 iRedMail 机器上的某些本地服务,例如 LDAP 数据库服务器和 iredpad 服务。
14、 由于 iRedMail 守护进程配置为查询 Samba4 AD DC LDAP 服务器的帐户信息和其他资源,因此可以通过使用以下命令来安全地停止和禁用 iRedMail 机器上的某些本地服务,例如 LDAP 数据库服务器和 iredpad 服务。
```
# systemctl stop slapd iredpad
# systemctl disable slapd iredpad
```
15. 另外,如下图所示,通过在 crontab 文件中的每行之前添加注释(#),禁用 iRedMail 执行的某些计划任务,例如 LDAP 数据库备份和 iRedPad 跟踪记录。
15、 另外,如下图所示,通过在 crontab 文件中的每行之前添加注释 `#`,禁用 iRedMail 执行的某些计划任务,例如 LDAP 数据库备份和 iRedPad 跟踪记录。
```
# crontab -e
```
[![Disable iRedMail Tasks](https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png)][13]
禁用 iRedMail 任务
*禁用 iRedMail 任务*
### 第六步:在 Postfix 中使用邮件别名
16. 要将所有本地生成的邮件(发往 postmaster 并随后重定向到 root 帐户)重定向到特定的 Samba4 AD 帐户,请打开位于 /etc/postfix/aliases 中的 Postfix 别名配置文件并修改root行如下所示
16 要将所有本地生成的邮件(发往 postmaster 并随后重定向到 root 帐户)重定向到特定的 Samba4 AD 帐户,请打开位于 `/etc/postfix/aliases` 中的 Postfix 别名配置文件,并修改 `root` 行,如下所示:
```
root: your_AD_email_account@domain.tld
```
17. 应用别名配置文件,以便 Postfix 可以通过执行 newaliases 命令以其自己的格式读取它,并测试邮件是否通过发出以下命令发送到正确的域电子邮件帐户。
17 应用别名配置文件,以便 Postfix 可以通过执行 `newaliases` 命令以其自己的格式读取它,并测试邮件是否通过发出以下命令发送到正确的域电子邮件帐户。
```
# echo “Test mail” | mail -s “This is roots email” root
```
18. 邮件发送完毕后,请使用你为邮件重定向设置的域帐户登录 Roundcube webmail并验证先前发送的邮件应该在你的帐户收件箱中。
18 邮件发送完毕后,请使用你为邮件重定向设置的域帐户登录 Roundcube webmail并验证先前发送的邮件应该在你的帐户收件箱中。
[![Verify User Mail](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png)][14]
验证用户邮件
*验证用户邮件*
就是这样了!现在你已经有了一个完全工作的与 Samba4 AD 集成的邮件服务器了。域帐户可以用它们的内部或者其他外部域发送和接收邮件了。
@ -259,17 +251,17 @@ root: your_AD_email_account@domain.tld
via: https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/
作者:[ ][a]
作者:[Matei Cezar][a]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/cezarmatei/
[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/
[2]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/
[1]:https://linux.cn/article-8567-1.html
[2]:https://linux.cn/article-8673-1.html
[3]:https://www.tecmint.com/install-and-configure-roundcube-webmail-for-postfix-mail-server/
[4]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/
[4]:https://linux.cn/article-8097-1.html
[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg
[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png
[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png

View File

@ -0,0 +1,290 @@
Linux 的 EXT4 文件系统的历史、特性以及最佳实践
============================================================
> 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的几代 EXT 文件系统有何不同。
在之前关于 Linux 文件系统的文章里,我写过一篇 [Linux 文件系统介绍][12] 和一些更高级的概念例如 [一切都是文件][13]。现在我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有特点:
1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个结构化的容器来存储和获取数据。
2. **命名空间:** 命名空间是一个提供了用于命名与组织数据的命名规则和数据结构的方法学。
3. **安全模型:** 一个用于定义访问权限的策略。
4. **API** 操作这个系统的对象的系统功能调用,这些对象诸如目录和文件。
5. **实现:** 能够实现以上几点的软件。
本文内容的讨论主要集中于上述几点中的第一项,并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。
### EXT 文件系统历史
虽然 EXT 文件系统是为 Linux 编写的,但其真正起源于 Minix 操作系统和 Minix 文件系统,而 Minix 最早发布于 1987早于 Linux 5 年。如果我们从 EXT 文件系统大家族的 Minix 起源来观察其历史与技术发展那么理解 EXT4 文件系统就会简单得多。
### Minix
当 Linux Torvalds 在写最初的 Linux 内核的时候,他需要一个文件系统但是他又不想自己写一个。于是他简单地把 [Minix 文件系统][14] 加了进去,这个 Minix 文件系统是由 [Andrew S. Tanenbaum][15] 写的同时它也是 Tanenbaum 的 Minix 操作系统的一部分。[Minix][16] 是一个类 Unix 风格的操作系统最初编写它的原因是用于教育用途。Minix 的代码是自由可用的并有适当的许可协议,所以 Torvalds 可以把它用 Linux 的最初版本里。
Minix 有以下这些结构,其中的大部分位于生成文件系统的分区中:
* [**引导扇区**][6] 是硬盘安装后的第一个扇区。这个引导块包含了一个非常小的引导记录和一个分区表。
* 每一个分区的第一个块都是一个包含了元数据的**超级块superblock** ,这些元数据定义了其他的文件系统结构并将其定位于物理硬盘的具体分区上。
* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。
* **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息,包括其所处的数据块的位置,也就是该文件所处的区域。
* 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。
* 一个 **数据区**, 这里是数据存储的地方。
对上述了两种位图类型来说一个位bit表示一个指定的数据区或者一个指定的 inode。 如果这个位是 0 则表示这个数据区或者这个 inode 是未使用的,如果是 1 则表示正在使用中。
那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户 ID、文件模式即访问权限以及三个时间戳用于指定该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。
同时,这个 inode 还包含了位置数据,指向了其所对应的文件数据在硬盘中的位置。在 Minix 和 EXT 1-3 文件系统中这是一个数据区和块的列表。Minix 文件系统的 inode 支持 9 个数据块,包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统结构][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速了解。
### EXT
原生的 [EXT 文件系统][20] (意即扩展的extended) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 UFS其也被称为伯克利快速文件系统FFS。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被确证的,显然这是因为其存在着严重的问题,并且它很快地被 EXT2 文件系统取代了。
### EXT2
[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 5.0 时接触的第一个文件系统。实际上EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多供将来使用的磁盘空间。
和 Minix 类似EXT2 也有一个[引导扇区][23] ,它是硬盘安装后的第一个扇区。它包含了非常小的引导记录和一个分区表。接着引导扇区之后是一些保留的空间,它填充了引导记录和硬盘驱动器上的第一个分区(通常位于下一个柱面)之间的空间。[GRUB2][24] - 也可能是 GRUB1 - 将此空间用于其部分引导代码。
每个 EXT2 分区中的空间被分为柱面组cylinder group它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为 8MB。 下面的图 1 显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为 4K。
![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png)
*图 1 EXT 文件系统中的柱面组的结构*
柱面组中的第一个块是一个超级块superblock它包含了元数据定义了其它文件系统的结构并将其定位于物理硬盘的具体分区上。分区中有一些柱面组还会有备用超级块但并不是所有的柱面组都有。我们可以使用例如 `dd` 等磁盘工具来拷贝备用超级块的内容到主超级块上,以达到修复损坏的超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 `dumpe2fs` 命令来备份了我的系统上的分区描述符信息。
以下是 `dumpe2fs` 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。
```
# dumpe2fs /dev/sda1
Filesystem volume name: boot
Last mounted on: /boot
Filesystem UUID: 79fc5ed8-5bbc-4dfe-8359-b7b36be6eed3
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 122160
Block count: 488192
Reserved block count: 24409
Free blocks: 376512
Free inodes: 121690
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 238
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8144
Inode blocks per group: 509
Flex block group size: 16
Filesystem created: Tue Feb 7 09:33:34 2017
Last mount time: Sat Apr 29 21:42:01 2017
Last write time: Sat Apr 29 21:42:01 2017
Mount count: 25
Maximum mount count: -1
Last checked: Tue Feb 7 09:33:34 2017
Check interval: 0 (<none>)
Lifetime writes: 594 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 32
Desired extra isize: 32
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: c780bac9-d4bf-4f35-b695-0fe35e8d2d60
Journal backup: inode blocks
Journal features: journal_64bit
Journal size: 32M
Journal length: 8192
Journal sequence: 0x00000213
Journal start: 0
Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-239
Block bitmap at 240 (+240)
Inode bitmap at 255 (+255)
Inode table at 270-778 (+270)
24839 free blocks, 7676 free inodes, 16 directories
Free blocks: 7929-32767
Free inodes: 440, 470-8144
Group 1: (Blocks 32768-65535)
Backup superblock at 32768, Group descriptors at 32769-32769
Reserved GDT blocks at 32770-33007
Block bitmap at 241 (bg #0 + 241)
Inode bitmap at 256 (bg #0 + 256)
Inode table at 779-1287 (bg #0 + 779)
8668 free blocks, 8142 free inodes, 2 directories
Free blocks: 33008-33283, 33332-33791, 33974-33975, 34023-34092, 34094-34104, 34526-34687, 34706-34723, 34817-35374, 35421-35844, 35935-36355, 36357-36863, 38912-39935, 39940-40570, 42620-42623, 42655, 42674-42687, 42721-42751, 42798-42815, 42847, 42875-42879, 42918-42943, 42975, 43000-43007, 43519, 43559-44031, 44042-44543, 44545-45055, 45116-45567, 45601-45631, 45658-45663, 45689-45695, 45736-45759, 45802-45823, 45857-45887, 45919, 45950-45951, 45972-45983, 46014-46015, 46057-46079, 46112-46591, 46921-47103, 49152-49395, 50027-50355, 52237-52255, 52285-52287, 52323-52351, 52383, 52450-52479, 52518-52543, 52584-52607, 52652-52671, 52734-52735, 52743-53247
Free inodes: 8147-16288
Group 2: (Blocks 65536-98303)
Block bitmap at 242 (bg #0 + 242)
Inode bitmap at 257 (bg #0 + 257)
Inode table at 1288-1796 (bg #0 + 1288)
6326 free blocks, 8144 free inodes, 0 directories
Free blocks: 67042-67583, 72201-72994, 80185-80349, 81191-81919, 90112-94207
Free inodes: 16289-24432
Group 3: (Blocks 98304-131071)
<截断>
```
每一个柱面组都有自己的 inode 位图,用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了一个文件的相关信息,包括属于该文件的数据块的位置。而块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,柱面组的数据可以多达数百页的长度。柱面组的元数据包括组中所有空闲数据块的列表。
EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。
我所遇见的关于 EXT2 文件系统最大的问题是 `fsck` (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有的不一致性从而导致在系统崩溃crash后其会花费了数个小时来修复。有一次我的其中一台电脑在崩溃后重新启动时共花费了 28 个小时恢复磁盘,而且并且是在磁盘被检测量只有几百兆字节大小的情况下。
### EXT3
[EXT3 文件系统][25]是应一个目标而生的,就是克服 `fsck` 程序需要完全恢复在文件更新操作期间发生的不正确关机而损坏的磁盘结构所需的大量时间。它对 EXT 文件系统的唯一新增功能就是 [日志][26],它将提前记录将对文件系统执行的更改。 EXT3 的磁盘结构的其余部分与 EXT2 中的相同。
除了同先前的版本一样直接写入数据到磁盘的数据区域外EXT3 上的日志会将文件数据随同元数据写入到磁盘上的一个指定数据区域。一旦这些(日志)数据安全地到达硬盘,它就可以几乎零丢失率地被合并或被追加到目标文件上。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在日志中的所有数据提交之前,系统发生故障时文件系统将保持一致状态。在下次启动时,将检查文件系统的不一致性,然后将仍保留在日志中的数据提交到磁盘的数据区,以完成对目标文件的更新。
日志功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性、安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。
日志功能将失败后检查硬盘驱动器所需的时间从几小时(甚至几天)减少到了几分钟。 多年来,我遇到了很多导致我的系统崩溃的问题。要详细说的话恐怕还得再写一篇文章,但这里需要说明的是大多数是我自己造成的,就比如不小心踢掉电源插头。 幸运的是EXT 日志文件系统将启动恢复时间缩短到两三分钟。此外,自从我开始使用带日志记录的 EXT3我从来没有遇到丢失数据的问题。
EXT3 的日志功能可以关闭,然后其功能就等同于 EXT2 文件系统了。 该日志本身仍然是存在的,只是状态为空且未使用。 只需在 `mount` 命令中使用文件系统类型参数来重新挂载即可指定为 EXT2。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,不过你也可以更改 `/etc/fstab` 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3 文件系统挂载为 EXT2 ,因为这会有丢失数据和增加恢复时间的潜在可能性。
EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。
```
tune2fs -j /dev/sda1
```
`/dev/sda1` 表示驱动器和分区的标识符。同时要注意修改 `/etc/fstab` 中的文件系统类型标识符并重新挂载分区,或者重启系统以确保修改生效。
### EXT4
[EXT4 文件系统][27]主要提高了性能、可靠性和容量。为了提高可靠性,它新增了元数据和日志校验和。同时为了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳,并在时间戳字段中添加了两个高位来延缓时间戳的 [2038 年问题][28] ,这样 EXT4 文件系统至少可用到 2446 年。
在 EXT4 中数据分配从固定块改为扩展盘区extent方式扩展盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理上连续的文件,这可以显著减少描述大文件中所有数据的位置所需的指针数。其它在 EXT4 中已经实施的分配策略可以进一步减少碎片化。
EXT4 通过将新创建的文件散布在磁盘上,使其不会像早期的 PC 文件系统一样全部聚集在磁盘起始位置,从而减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地散布文件,并且当文件(由于太大)需要分段存储时,使不连续的文件扩展盘区尽可能靠近同一文件中的其他部分,以尽可能减少磁头寻道和电机旋转等待时间。当创建新文件或扩展现有文件时,使用其它策略来预先分配额外的磁盘空间。这有助于确保扩展文件时不会自动导致其分段。新文件不会紧挨这现有文件立即分配空间,这也可以防止现有文件的碎片化。
除了磁盘上数据的实际位置外EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集到所有正在写入磁盘的数据,这可以提高数据空间连续的可能性。
较旧的 EXT 文件系统(如 EXT2 和 EXT3可以作为 EXT4 进行 `mount` ,以使其性能获得较小的提升。但不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。
自 Fedora 14 以来EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [流程][29] 将 EXT3 文件系统升级到 EXT4但是由于仍然存留的之前的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 `mkfs` 命令将空 EXT4 文件系统写入分区,然后从备份中恢复所有数据。
### Inode
之前介绍过的 inode 是 EXT 文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode在这种情况下可能会产生高度碎片化。 EXT 文件系统可以主动地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘区的文件。 实际上你在下面将会看到EXT 文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,而不使用间接指针。
![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png)
*图 2 inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。*
inode 不包含文件的名称。通过目录项访问文件,目录项本身就是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其它文件系统(甚至是相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对 [硬链接][30] 存在影响,但是这个讨论超出了本文的范围。
inode 包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空位用于描述柱面组数据部分中数据块或扩展盘区的位置和长度。12 个指针提供对数据扩展盘区的直接访问应该足以满足大多数文件的需求。然而对于具有明显分段的文件需要以间接节点node的形式提供一些额外的容量——从技术上讲这些不是真正的“inode”所以为了方便起见我在这里使用这个术语“节点node”。
间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如4K 的块大小可以支持 512 个 4 字节的间接节点,允许单个文件有 **12直接+ 512间接= 524** 个扩展盘区。还支持双重和三重间接节点,但我们大多数人不太可能遇到需要那么多扩展盘区的文件。
### 数据碎片
对于许多较旧的 PC 文件系统,如 FAT及其所有变体和 NTFS碎片一直是导致磁盘性能下降的重大问题。 碎片整理本身就成为一个行业,有各种品牌的整理软件,其效果范围从非常有效到仅仅是微乎其微。
Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 `fsck` 命令检查整个文件系统的碎片。 以下示例检查我的主工作站的家目录,只有 1.5 的碎片。 确保使用 `-n` 参数,因为它会防止 `fsck` 对扫描的文件系统采取任何操作。
```
fsck -fn /dev/mapper/vg_01-home
```
我曾经进行过一些理论计算,以确定磁盘碎片整理是否会产生任何明显的性能提升。 我做了一些假设条件,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的轨到轨寻道时间。 此示例中的文件数是我在计算的当天的文件系统中存在的实际数。 我假设每天有相当大量的碎片化文件(约 20会被用到。
| **全部文件** | **271,794** |
|---|---|
| 碎片率 % | 5.00% |
| 不连续数 | 13,590 |
|   |   |
| % 每天用到的碎片化文件 | 20% (假设) |
| 额外寻道次数 | 2,718 |
| 平均寻道时间 | 10.90 ms |
| 每天全部的额外寻道时间 | 29.63 sec |
|   | 0.49 min |
|   |   |
| 轨到轨寻道时间 | 2.00 ms |
| 每天全部的额外寻道时间 | 5.44 sec |
|   | 0.091 min |
*表 1: 碎片对磁盘性能的理论影响*
我对每天的全部的额外寻道时间进行了两次计算,一次是轨到轨寻道时间,这是由于 EXT 文件分配策略而导致大多数文件最可能的情况,一个是平均寻道时间,我假设这是一个合理的最坏情况。
从表 1 可以看出,对绝大多数应用程序而言,碎片化甚至对性能适中的硬盘驱动器上的现代 EXT 文件系统的影响是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些对碎片化及其对系统的理论影响的洞察。
我的大部分分区的碎片率都在 1.5 左右或 1.6%,我有一个分区有 3.3 的碎片,但是这是一个大约 128GB 文件系统,具有不到 100 个非常大的 ISO 映像文件;多年来,我扩展过该分区几次,因为它已经太满了。
这并不是说一些应用的环境并不需要更少的碎片的环境。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以针对特定的工作负载类型调整参数。这个工作可以在文件系统创建的时候或稍后使用 `tune2fs` 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上混用文件系统类型以匹配每个文件系统上的不同负载是常见的。
由于大多数 EXT 文件系统的碎片数量较少因此无需进行碎片整理。目前EXT 文件系统没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片程度或文件系统中剩余可用空间的碎片程度。有一个工具,`e4defrag`,它可以对允许使用的剩余可用空间、目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。
如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件移动从而进行碎片整理,并在确保安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全去碎片化。
### 总结
EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和性能。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统同时我发现了它们适用于任何主流负载。毫无疑问EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显需要使用其它文件系统的理由。
--------------------------------------------------------------------------------
作者简介:
David Both - David Both 是一名 Linux 于开源的贡献者,目前居住在北卡罗莱纳州的罗利。他从事 IT 行业有 40 余年并在 IBM 中从事 OS/2 培训约 20 余年。在 IBM 就职期间,他在 1981 年为最早的 IBM PC 写了一个培训课程。他已经为红帽教授了 RHCE 课程,曾在 MCI Worldcom思科和北卡罗来纳州工作。 他使用 Linux 和开源软件工作了近 20 年。
-------------------
via: https://opensource.com/article/17/5/introduction-ext4-filesystem
作者:[David Both][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/dboth
[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu
[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu
[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ
[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ
[5]:https://opensource.com/tags/linux?src=linux_resource_menu
[6]:https://en.wikipedia.org/wiki/Boot_sector
[7]:https://opensource.com/article/17/5/introduction-ext4-filesystem?rate=B4QU3W_JYmEKsIKZf5yqMpztt7CRF6uzC0wfNBidEbs
[8]:https://www.flickr.com/photos/wwarby/11644168395
[9]:https://www.flickr.com/photos/wwarby/11644168395
[10]:https://opensource.com/users/jason-baker
[11]:https://creativecommons.org/licenses/by/2.0/
[12]:https://opensource.com/life/16/10/introduction-linux-filesystems
[13]:https://opensource.com/life/15/9/everything-is-a-file
[14]:https://en.wikipedia.org/wiki/MINIX_file_system
[15]:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum
[16]:https://en.wikipedia.org/wiki/MINIX
[17]:https://en.wikipedia.org/wiki/Inode
[18]:http://ohm.hgesser.de/sp-ss2012/Intro-MinixFS.pdf
[19]:https://en.wikipedia.org/wiki/Inode_pointer_structure
[20]:https://en.wikipedia.org/wiki/Extended_file_system
[21]:https://en.wikipedia.org/wiki/R%C3%A9my_Card
[22]:https://en.wikipedia.org/wiki/Ext2
[23]:https://en.wikipedia.org/wiki/Boot_sector
[24]:https://opensource.com/article/17/2/linux-boot-and-startup
[25]:https://en.wikipedia.org/wiki/Ext3
[26]:https://en.wikipedia.org/wiki/Journaling_file_system
[27]:https://en.wikipedia.org/wiki/Ext4
[28]:https://en.wikipedia.org/wiki/Year_2038_problem
[29]:https://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ext4converting.html
[30]:https://en.wikipedia.org/wiki/Hard_link
[31]:https://opensource.com/user/14106/feed
[32]:https://opensource.com/article/17/5/introduction-ext4-filesystem#comments
[33]:https://opensource.com/users/dboth

View File

@ -0,0 +1,175 @@
用 NMAP 探测操作系统
============================
有时能够知道一个网络里的机器的操作系统OS是有一定好处的。当你知道一台机器的操作系统后因为你可以在网上搜索专门针对该系统的安全漏洞所以入侵系统也会更加容易。当然安全漏洞通常都会很快被修补但安全漏洞存在时你需要知道。
对你自己的网络进行扫描以便发现操作系统类型可以帮助你了解黑客将如何侵入你的网络。
### 操作系统探测数据库
NAMP 带有一个数据库,它在你安装 NAMP 的时候就会被安装。这个数据库用于操作系统的探测,但是它不会自动更新。
这个数据库位于 `/usr/share/nmap/nmap-os-db`。进行更新的最简单方式是首先找到数据库的版本号,用文本编辑器打开这个文件,版本号通常位于第二行。我的数据库的第二行是 `# $Id: nmap-os-db 35407 2015-11-10 04:26:26Z dmiller $`,即这个文件的数据库版本是 35407。
要在网上查找一个可更新版本,可以浏览 https://svn.nmap.org/nmap如图 1 所示:
![Figure 01.jpg](https://www.linux.org/attachments/figure-01-jpg.699/)
*图 1*
你可以从图中看到版本号为 36736与我的系统上的版本号相比这个版本号似乎是一个更新的版本。为了对更新的操作系统进行准确的操作系统探测当然需要对这个数据库进行更新。
保留较旧的数据库版本也是一个不错的主意。我当前和版本是 35407我将在终端执行下面的命令
```
sudo mv /usr/share/nmap/nmap-os-db /usr/share/nmap/nmap-os-db-35407
```
这个数据库被以包含版本号的方式重命名了,下一步就是从网站上下载新版本的数据库,在终端执行下面命令:
```
cd /usr/share/nmap
sudo su
wget  https://svn.nmap.org/nmap/nmap-os-db
```
新的数据库即将开始被下载,但是你应该加上版本号,就像你在图 1 中看到的版本号 36736。使用文本编辑器打开这个数据库然后在第二行加上版本号。当版本号变化后你可以更新你的数据库然后在其中加入版本号以便在再次检查更新时做好准备。
### 系统探测过程
在我们开始使用实际的命令并执行系统探测之前,我们应该详细介绍扫描过程中将会发生的事情。
会执行五种不同的测试,每种测试由一个或者多个数据包组成,目标系统对每个数据包作出的响应有助于确定操作系统的类型。
五种不同的测试是:
1. 序列生成Sequence Generation
2. ICMP 回显
3. TCP 显式拥塞通知Explicit Congestion Notification
4. TCP
5. UDP
现在让我们分别看看他们各自在做什么。
**序列生成**
序列生成测试由六个数据包组成,这六个包是每隔 100 毫秒分开发送的,且都是 TCP SYN 包。
每个 TCP SYN 包的结果将有助于 NMAP 确定操作系统的类型。
**ICMP 回显**
两个有着不同设置的 ICMP 请求包被送到目标系统,由此产生的反应将有助于实现验证操作系统类型。
**TCP 显式拥塞通知Explicit Congestion Notification**
当生成许多包通过路由器时会导致其负载变大,这称之为拥塞。其结果就是系统会变慢以降低拥堵,以便路由器不会发生丢包。
这个包仅为了得到目标系统的响应而发送。因为不同的操作系统以不同的方式处理这个包,所以返回的特定值可以用来判断操作系统。
**TCP**
在这个测试中会发送六个数据包。
一些带有特定的包设置的包被发送用来到打开的或关闭的端口。结果也将会因为操作系统的不同而不同。
所有 TCP 包都是以如下不同的标志被发送:
1. 无标志
2. SYN、FIN、URG 和 PSH
3. ACK
4. SYN
5. ACK
6. FIN、PSH 和 URG
**UDP**
这个测试由一个被发送给一个关闭的端口的数据包组成。
如果目标系统上的这个端口是关闭的,而且返回一条 ICMP 端口不可达的信息,那么就说明没有防火墙。
### NMAP 操作系统检测命令
现在我们开始实际动手进行系统探测。如果你已经读过一些我写的关于 NMAP 的文章,那么最好不要执行 PING 操作。为了跳过 PING我们使用参数 `Pn`。为了看到详细的信息,你应该使用 `-v` 参数用于动态显示。为了获取系统的信息,需要使用 `-O` 参数。
为了使命令顺利运行和执行 TCP SYN 扫描,你需要以管理员的身份来执行这个命令。在我的例子中,我将只在一个系统上而不是整个网络上进行扫描,使用的命令是:
```
sudo nmap -v -Pn -O 192.168.0.63
```
扫描的结果如图2所示扫描显示七个开放的端口。
![Figure 02.jpg](https://www.linux.org/attachments/figure-02-jpg.700/)
*图 2*
开放的端口是:
1. 21/tcp ftp
2. 22/tcp ssh
3. 111/tcp rpcbind
4. 139/tcp netbios-ssn
5. 445/tcp microsoft-ds
6. 2049/tcp nfs
7. 54045/tcp unknown
系统的 MAC 地址为为:`00:1E:4F:9F:DF:7F`。
后面部分显示系统类型为:
```
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.6
Uptime guess: 0.324 days (since Sun Apr 23 08:43:32 2017)
```
系统当前运行的是 Ubuntu Server 16.04Linux 内核为 4.8,运行时间猜的较准确。
我在另一个系统了又进行了一次测试结果如图3所示
![Figure 03.jpg](https://www.linux.org/attachments/figure-03-jpg.701/)
*图 3*
这次扫描中开放的端口与上次不同。所猜的系统为 Microsoft Windows 2000|XP实际上是 Windows XP sp3。
### 端口嗅探结果
让我们来看看图 2 所示的第一次扫描中在后台发生了什么。
首先 NMAP 执行一次 TCP 隐秘扫描,在本次系统探测实例中以一个如图 4 所示的数据包 2032 开始。
![Figure 04.jpg](https://www.linux.org/attachments/figure-04-jpg.702/)
*图 4*
序列生成Sequence Generation开始于数据包 2032/2033第六个数据包是 2047/2048。注意每个都被发送两次且每隔 100ms 发送下一个数据包。
发送的 ICMP 数据包是 2050 - 20532 个数据包重复一遍,实际上是 4 个数据包。
2056-2057 是 TCP 显式拥塞通知数据包。
对 TCP 的 6 个测试是 2059、2060、2061、2063、2065、2067。
最后的 UDP 测试是 2073。
这些就是用于确定目标系统上操作系统的类型的测试。
我希望这将有助于你理解如何更新 NMAP 系统探测数据库和执行对系统的扫描。请注意,你可以和你不在同一个网络中的系统进行扫描,所以可以对互联网上的任何系统进行扫描。
--------------------------------------------------------------------------------
via: https://www.linux.org/threads/nmap-os-detection.4564/
作者:[Jarret B][a]
译者:[zhousiyu325](https://github.com/zhousiyu325)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.org/members/jarret-b.29858/
[1]:https://svn.nmap.org/nmap
[2]:https://svn.nmap.org/nmap/nmap-os-db

View File

@ -0,0 +1,165 @@
游戏版 Linux Ubuntu GamePack
===============
很多 Linux 爱好者喜欢用他们的 Linux 系统玩游戏看起来似乎并不需要一个可以玩游戏的操作系统。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白,并把这个基于 Ubuntu 16.04 的操作系统OS命名为 Ubuntu GamePack .
### 内容
Linux 上的)游戏现在已经相当丰富,而游戏公司宣称可以访问超过 22,381 款游戏。
这个 GamePack 包括 Lutris 和 Steam 两部分,允许您访问发行版厂商提供的特定游戏服务。
对于基于 Windows 的游戏,可以用 PlayOnLinuxWINE 和 CrossOver 转换到 Linux 上运行。
对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器
也安装了 Sparky APTus Gamer ,可以访问众多主机游戏模拟器。 模拟器包括:
*  AdvanceMENU - AdvanceMAME、 AdvanceMESS、 MAME、 MESS、 xmame、 Raine 以及其他的模拟器的前端
*  Atari800 - Atari 8 位系统、XE 游戏系统和 Atari 5200 超级系统的模拟器
*   DeSmuME - 任天堂 DS 模拟器
*   Desura - 支持 Windows、Linux 和 X 系统的数字化分发平台 - 在线安装器
* DOSBox - 支持 BeOS、Linux、Mac X、OS2 和 Windows 的 DOS 模拟器
* DOSEMU - 支持 Linux 的 DOS 模拟器
* ePSXe - 增强的 PSX 模拟器
* FCEUX - 任天堂娱乐系统NES、红白机Famicom和红白机磁盘系统FDS模拟器仿真器
* FS-UAE - 跨平台的 Amiga 模拟器
* GNOME Video Arcade - 简化的 MAME 前端
* Hatari - 支持 Linux 和其他系统的 Atari ST、STE、TT 和 Falcon 模拟器(仿真器)
* Higan - 任天堂 SNES、NES、Gameboy、Gameboy Color 和 Gameboy Advance 的模拟器
* Kega_Fusion - 世嘉 SG/SC/SF主系统、Master System、 Game Gear、 Genesis/Megadrive、 SVP、 Pico、 SegaCD/MegaCD 模拟器
* MAME - 忠实重现了许多街机效果的硬件模拟器
* Mednafen - Atari Lynx、GameBoy、NES、SNES、PC-FX、世嘉索尼游戏站等系统
* MESS - 各种主机和计算机游戏的模拟器
* Nestopia - 任天堂娱乐系统/红白机模拟器
*   PCSX - 索尼游戏站模拟器
*   PlayOnLinux - Wine 前端
* PPSSPP - PPSSPP 是支持 Windows、MacOS、Linux 和 Android 的开源 PSP 仿真器
* Steam - Steam 软件分发服务的启动器 - 在线安装程序
* Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器
* VisualBoyAdvance - 全功能 Game Boy Advance 的模拟器
* Virtual Jaguar - 用于 Atari 的 infamous Jaguar 主机游戏的跨平台模拟器
*   Wine - Windows 二进制在 Linux 中运行
*   Winetricks - 一个用于 WINE 的 POSIX shell 脚本的软件包管理器,能够很容易安装一些 Windows软件
*   Yabause - 世嘉土星32位游戏机模拟器
* ZSNES - 超级任天堂娱乐系统模拟器
GamePack 还包括被一些游戏所必须的 Oracle java 和 Adobe Flash。
如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。
### 下载
下载此操作系统镜像的主要地方是 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。由于此链接来自国外所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果你没有种子下载程序你可以下载“Transmission”。有了种子下载程序后你可以通过 [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]下载。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。
下载的文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB。
 
如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 GamePack ,或者你可以使用 “USB Image Writer”把 ISO 写入到优盘,并利用此优盘安装系统。
 
硬件需求和 Ubuntu 16.04 保持一致:
 
*   2 GHz 双核处理器或者更高
*   2 GB 系统内存
*   25 GB 的磁盘空间
*   用于安装介质的 DVD 驱动器或者 USB 端口
*   在线游戏系统(如 Steam需要互联网接入。
不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款显存大一点的正统显卡。
您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。
 
###安装过程
当你用安装介质的 ISO 镜像文件启动了系统,您就可以准备进行下一步了。
从 Ubuntu Gamepack 介质启动,你会看到一个类似图 1 的屏幕。
![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/)
*图 1*
一旦加载完毕,安装程序就可以继续安装了。图 2 显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意你可以点击 “Try Ubuntu” 在不改变硬盘内容的情况下把它加载到内存中来试试它。
![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/)
*图 2*
接下来继续选择 Install Ubuntu 进行安装了。
下一个屏幕,如图 3 所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件图形、WiFi、Flash、 MP3 和其他更新。
 
当定制好你的系统后就可以点击“Continue” 
 
![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/)
*图 3*
接下来,您必须指定驱动器将如何配置使用,如图 4 所示。如果您计划使用整个驱动器那么可以更容易地设置选择此驱动器即可然后单击“Install Now”。
![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/)
*图 4*
接下来在图 5 中可以根据提示确认所选择硬件配置。如果同意以上的更改请单击“Continue”。 
 
![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/)
*图 5*
接下来,如图 6 所示你将按照提示选择时区选择完毕后点击“Continue”。
![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/)
*图 6*
接下来,如图 7 所示一个窗口需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。
![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/)
*图 7*
最后一个配置屏幕是为您设置一个用户帐户,如图 8 所示。键入您的姓名、计算机名、用户名、密码并选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。
![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/)
*图 8*
安装将按指定来设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图 9 所示。所有内容复制到硬盘并设置好,您将被提示移除引导介质并允许重新启动系统。
![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/)
*图 9*
重新启动后,您需要选择要求用户登录,会得到类似于图 10 的屏幕。输入指定的用户密码登录到 Ubuntu Gamepack。
![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/)
*图 10*
当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的软件升级。打开一个终端并输入以下两个命令:
```
sudo apt-get update && sudo apt-get upgrade
```
Any updates which are not installed should be installed to bring the GamePack system up-to-date.
任何没有安装的更新都应该安装,以便 GamePack 系统保持更新。
现在,只要看看菜单,找到你想玩的游戏就行了,打开模拟器或其它像 Steam 的游戏服务 。
希望你喜欢 Gamepack 并且玩得高兴!
--------------------------------------------------------------------------------
via: https://www.linux.org/threads/ubuntu-gamepack.4559/
作者:[Jarret B][a]
译者:[stevenzdg988](https://github.com/stevenzdg988)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.org/members/jarret-b.29858/
[1]:https://ualinux.com/en/download/category/25-ubuntu-gamepack
[2]:https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-%D1%8F%D0%BD%D0%B2%D0%B0%D1%80%D1%8C-2017-pc-vkn99.html

View File

@ -1,54 +1,53 @@
Powerline - Vim 和 Bash 中的一个强大状态栏插件
PowerlineVim 和 Bash 中的一个强大状态栏插件
============================================================
[Powerline][2] 是 vim、zsh、bash、tmux、IPython、Awesome、bar、fish、lemonbar、pdb、rc、shell、tcsh、wm、i3 和 Qtil 中的一个状态栏插件。它给程序提供状态栏,并使程序更好看。它用 Python 写成。
[Powerline][2] 是 vim、zsh、bash、tmux、IPython、Awesome、bar、fish、lemonbar、pdb、rc、shell、tcsh、wm、i3 和 Qtil 中的一个状态栏插件。它给程序提供了状态栏,并使程序更好看。它用 Python 写成。
它是可扩展的并且功能丰富,它用 Python 写成,非常轻便不需要任何第三方的依赖,只需要一个 Python 解释器。
稳定以及可测试代码库经过完整的测试,并且在 Python 2.6+ 和 Python 3 中工作良好。
它的稳定以及可测试代码库经过完整的测试,并且在 Python 2.6+ 和 Python 3 中工作良好。
最初状态栏只在 vim 中可用,随后项目进化为许多 Linux 程序如 zsh、bash、tmux、IPython、Awesome、i3 和 Qtil 提供状态栏。
最初状态栏只在 vim 中可用,随后项目进化为许多 Linux 程序如 zsh、bash、tmux、IPython、Awesome、i3 和 Qtil 提供状态栏。
配置以及配色方案用 JSON 写成。它是一种标准简易的文件格式,允许用户配置 Powerline 支持的程序。
配置以及配色方案用 JSON 写成。它是一种标准简易的文件格式,可以让用户配置 Powerline 支持的程序。
快速并且轻量级,支持守护进程为了更好的性能。
快速并且轻量级,支持守护进程可以提供更好的性能。
#### 安装预先要求
### 安装预先要求
确保你的系统有下面预先要求的包。如果没有,在安装 powerline 之前先安装它们。
对于 Debian 用户,使用[ APT 包管理器][3]或者[ Apt-Get 包管理器][4]安装需要的包。
对于 Debian 用户,使用 [APT 包管理器][3]或者[Apt-Get 包管理器][4]安装需要的包。
```
$ sudo apt-get install python-pip git
```
对于 openSUSE 用户,使用 [ Zypper 包管理器][5]安装需要的包。
对于 openSUSE 用户,使用 [Zypper 包管理器][5]安装需要的包。
```
$ sudo zypper install python-pip git
```
对于 Fedora 用户,使用[ dnf 包管理器][6]安装需要的包。
对于 Fedora 用户,使用 [dnf 包管理器][6]安装需要的包。
```
$ sudo dnf install python-pip git
```
对于 Arch Linux 用户,使用[ pacman 包管理器][7]安装需要的包。
对于 Arch Linux 用户,使用 [pacman 包管理器][7]安装需要的包。
```
$ sudo pacman -S python-pip git
```
对于 CentOS/RHEL 用户,使用[ yum 包管理器][8]安装需要的包。
对于 CentOS/RHEL 用户,使用 [yum 包管理器][8]安装需要的包。
```
$ sudo yum install python-pip git
```
#### 如何在 Linux 中安装 Powerline
### 如何在 Linux 中安装 Powerline
在本篇中,我们将向你展示如何安装 Powerline。以及如何在基于 Debian 以及 RHEL 的系统中在 Bash、tumx 和 Vim 中使用。
@ -71,7 +70,7 @@ Location: /usr/lib/python2.7/site-packages
Requires:
```
#### 在 Bash Shell 中添加/启用 Powerline
### 在 Bash Shell 中添加/启用 Powerline
添加下面的行到 `.bashrc` 中,它会默认在基础 shell 中启用 powerline。
@ -90,9 +89,9 @@ fi
$ source ~/.bashrc
```
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-1.png)][9]
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-1.png)][9]
#### 在 tmux 中添加/启用 Powerline
### 在 tmux 中添加/启用 Powerline
tmux 是最好的终端仿真程序之一,它提供多窗口以及状态栏,但是相比 powerline 的状态栏看上去不那么好。添加下面的的行到 `.tmux.conf` 中,它会默认在 tmux 中启用 powerline。如果你没有找到 `.tmux.conf` 文件,那么创建一个新的。
@ -102,9 +101,9 @@ tmux 是最好的终端仿真程序之一,它提供多窗口以及状态栏,
source "/usr/local/lib/python2.7/site-packages/powerline/bindings/tmux/powerline.conf"
```
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-2.png)][10]
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-2.png)][10]
#### 在 Vim 中添加/启用 Powerline
### 在 Vim 中添加/启用 Powerline
vim 是管理员最爱的文本编辑器之一。添加下面的行到 `.vmrc` 中,启用 powerline 使 vim 更加强大。注意,在 vim 7.x 中,你可能不会在系统中发现 .vimrc 文件,因此不必担心,创建一个新的文件,并添加下面行。
@ -116,17 +115,17 @@ set laststatus=2
set t_Co=256
```
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-3.png)][11]
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-3.png)][11]
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-4.png)][12]
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-4.png)][12]
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/powerline-adds-powerful-statusline-to-vim-bash-tumx-in-ubuntu-fedora-debian-arch-linux-mint/
作者:[ 2DAYGEEK · ][a]
作者:[2DAYGEEK][a]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,18 +1,17 @@
在 Linux 中使用 shell 脚本自动创建/移除并挂载交换文件
============================================================ 
======
几天前我们写了一篇关于在 Linux 中 3 种创建交换文件的方法,它们是常见的方法,但是需要人工操作。
今天我发现了一个小的 [Gary Stafford][3] 写的 shell 脚本(两个 shell 脚本,一个用于创建交换文件,另外一个用于移除交换文件),它帮助我们在 Linux 中创建/移除并且自动挂载交换文件。
今天我发现了一个 [Gary Stafford][3] 写的 shell 脚本(两个 shell 脚本,一个用于创建交换文件,另外一个用于移除交换文件),它可以帮助我们在 Linux 中创建/移除并且自动挂载交换文件。
默认这个脚本创建并挂载 `512MB` 的交换文件。如果你想要更多的交换空间和不同的文件名,你需要相应地修改脚本。修改脚本不是一件困难的事,因为这是一个非常上手而且小的脚本,设置我已经为你想要修改的脚本行加上了颜色
默认这个脚本创建并挂载 512MB 的交换文件。如果你想要更多的交换空间和不同的文件名,你需要相应地修改脚本。修改脚本不是一件困难的事,因为这是一个容易上手而且很小的脚本
**推荐阅读:** [Linux 中 3 中简易的创建或扩展交换空间的方法][4]
**推荐阅读:** [Linux 中 3 种简易创建或扩展交换空间的方法][4]
#### 如何检查当前交换文件大小
### 如何检查当前交换文件大小
使用 **[free][1]** 和 `swapon` 命令检查已经存在交换空间。
使用 [free][1] 和 `swapon` 命令检查已经存在交换空间。
```
$ free -h
@ -27,9 +26,9 @@ NAME TYPE SIZE USED PRIO
上面的输出显示我当前的交换空间是 `2GB`
#### 创建交换文件
### 创建交换文件
创建 `create_swap.sh` 文件并添加下面的脚本来自动化交换空间的创建和挂载。
创建 `create_swap.sh` 文件并添加下面的内容来自动化交换空间的创建和挂载。
```
$ nano create_swap.sh
@ -81,11 +80,11 @@ NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
```
你可以看到新的 `1024M swapfile`。重启系统以使用新的交换文件。
你可以看到新的 1024M `swapfile`。重启系统以使用新的交换文件。
#### 移除交换文件
### 移除交换文件
如果不再需要交换文件,接着创建 `remove_swap.sh` 文件并添加下面的脚本移除交换文件以及它的 /etc/fstab 挂载点。
如果不再需要交换文件,接着创建 `remove_swap.sh` 文件并添加下面的内容来移除交换文件以及它的 `/etc/fstab` 挂载点。
```
$ nano remove_swap.sh
@ -131,15 +130,14 @@ NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 951.8M -1
```
<nav class="pagination group" style="display: block; margin: 0px 0px 15px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; zoom: 1;"></nav>
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/shell-script-create-add-extend-swap-space-linux/
作者:[2DAYGEEK ][a]
作者:[2DAYGEEK][a]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,56 +1,55 @@
Pass 一款 Linux 的简单命令行密码管理工具
pass一款简单的基于 Linux 命令行的密码管理工具
============================================================
现如今要记住类似 email、银行、社交媒体、在线支付、ftp 等等这么多的密码相信对每一个人来说都是一个巨大的挑战。
由于需求和使用,密码管理器现如今变得非常的流行。在 Linux 中我们可以有很多选择,包括基于 GUI 和基于 CLI 两种。今天我们要讲的是一款基于 CLI 的密码管理器叫做 pass 。
[pass][2] 是 Linux 上的一个简单的命令行密码管理器,它将密码存储在一个 `gpg` 加密后的文件里。这些加密后的文件会被按照良好的目录结构组织存放。
[pass][2] 是 Linux 上的一个简单的命令行密码管理器,它将密码存储在一个 `gpg` 加密后的文件里。这些加密后的文件很好地组织按目录结构存放。
所有密码都存在于 `〜/ .password-store` 中,它提供了添加、编辑、生成和检索密码等简单命令。
所有密码都存在于 `~/.password-store` 中,它提供了添加、编辑、生成和检索密码等简单命令。
建议阅读:[KeePass - 存储/安全密码的最佳密码管理工具][3]
- 建议阅读:[KeePass - 存储/安全密码的最佳密码管理工具][3]
它是一个非常简短和简单的 shell 脚本。 它能够临时将密码放在剪贴板上,并使用 git 跟踪密码的修改。
它是一个非常简短和简单的 shell 脚本。 它能够临时将密码放在剪贴板上,并使用 `git` 跟踪密码的修改。
这是一个很小的 shell 脚本,它还使用了少量的默认工具比如 gnupg、tree 和 git同时还有活跃的社区为它提供 GUI 和扩展。
这是一个很小的 shell 脚本,它还使用了少量的默认工具比如 `gnupg``tree``git`,同时还有活跃的社区为它提供 GUI 和扩展。
#### 如何在 Linux 中安装 Pass
### 如何在 Linux 中安装 Pass
Pass 可从大多数 Linux 的主要发行版的仓库中获得。 所以,你可以使用你的分布式包管理器来安装它。
对于基于 Debian 的系统,你可以使用 [apt-get][4] 或 [apt package manager][5] 命令来安装 pass。
对于基于 Debian 的系统,你可以使用 [apt-get][4] 或 [apt][5] 包管理器命令来安装 pass。
```
$ sudo apt-get install pass
```
对于基于 RHEL/CentOS 的操作系统, 使用 [yum package manager][6] 命令来安装它。
对于基于 RHEL/CentOS 的操作系统, 使用 [yum][6] 包管理器命令来安装它。
```
$ sudo yum install pass
```
Fedora 系统可用 [dnf package manager][7] 命令来安装。
Fedora 系统可用 [dnf][7] 包管理器命令来安装。
```
$ sudo dnf install pass
```
openSUSE 系统可以用 [zypper package manager][8] 命令来安装。
openSUSE 系统可以用 [zypper][8] 包管理器命令来安装。
```
$ sudo zypper in password-store
```
对于基于 Arch Linux 的操作系统用 [pacman package manager][9] 来安装它。
对于基于 Arch Linux 的操作系统用 [pacman][9] 包管理器来安装它。
```
$ pacman -S pass
```
#### 如何生成 GPG 密钥对
### 如何生成 GPG 密钥对
确保你拥有你个人的 GPG 密钥对。如果没有的话,你可以通过在终端中输入以下的命令并安装指导来创建你的 GPG 密钥对。
@ -58,12 +57,12 @@ $ pacman -S pass
$ gpg --gen-key
```
运行以上的命令以生成 GPG 密钥对时会有一系列的问题询问,谨慎输入问题的答案,其中有一些只要使用默认值即可。
运行以上的命令以生成 GPG 密钥对时会有一系列的问题询问,谨慎输入问题的答案,其中有一些只要使用默认值即可。
#### 初始化密码存储
### 初始化密码存储
如果你已经有了 GPG 密钥对,请通过运行以下命令初始化本地密码存储,你可以 pass `email-id``gpg-id`
如果你已经有了 GPG 密钥对,请通过运行以下命令初始化本地密码存储,你可以使用 email-id 或 gpg-id 初始化
```
$ pass init 2daygeek@gmail.com
@ -71,9 +70,9 @@ mkdir: created directory '/home/magi/.password-store/'
Password store initialized for 2daygeek@gmail.com
```
上述命令将在 `〜/ .password-store` 目录下创建一个密码存储区。
上述命令将在 `~/.password-store` 目录下创建一个密码存储区。
pass 命令提供了简单的语法来管理密码。 我们一个个来看,如何添加、编辑、生成和检索密码。
`pass` 命令提供了简单的语法来管理密码。 我们一个个来看,如何添加、编辑、生成和检索密码。
通过下面的命令检查目录结构树。
@ -88,9 +87,9 @@ Password Store
我没有看到任何树型结构,所以我们将根据我们的需求来创建一个。
#### 插入一个新的密码信息
### 插入一个新的密码信息
我们将通过运行以下命令来保存 gmail id 及其密码。
我们将通过运行以下命令来保存 gmail id 及其密码。
```
$ pass insert eMail/2daygeek@gmail.com
@ -98,7 +97,8 @@ mkdir: created directory '/home/magi/.password-store/eMail'
Enter password for eMail/2daygeek@gmail.com:
Retype password for eMail/2daygeek@gmail.com:
```
执行重复操作,直到所有的密码插入完成。 必入保存 Facebook 密码。
执行重复操作,直到所有的密码插入完成。 比如保存 Facebook 密码。
```
$ pass insert Social/Facebook_2daygeek
@ -106,6 +106,7 @@ mkdir: created directory '/home/magi/.password-store/Social'
Enter password for Social/Facebook_2daygeek:
Retype password for Social/Facebook_2daygeek:
```
我们可以列出存储中的所有现有的密码。
```
@ -125,18 +126,18 @@ Password Store
└── sudha21.magesh@gmail.com
```
#### 显示已有密码
### 显示已有密码
运行以下命令从密码存储中检索密码信息,它会询问你输入密码以解锁。
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/pass-command-line-package-manager-for-linux-1.png)][10]
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/pass-command-line-package-manager-for-linux-1.png)][10]
```
$ pass eMail/2daygeek@gmail.com
*******
```
#### 在剪贴板中复制密码
### 在剪贴板中复制密码
要直接将密码直接复制到剪贴板上,而不是在终端上输入,请使用以下更安全的命令,它会在 45 秒后自动清除密码。
@ -145,9 +146,9 @@ $ pass -c eMail/magesh.maruthamuthu@gmail.com
Copied eMail/magesh.maruthamuthu@gmail.com to clipboard. Will clear in 45 seconds.
```
#### 生成一个新密码
### 生成一个新密码
如果你想生成一些比较难以猜测的密码用于代替原有的奇怪的密码,可以通过其内部的 pwgen 程序来实现。
如果你想生成一些比较难以猜测的密码用于代替原有的奇怪密码,可以通过其内部的 `pwgen` 功能来实现。
```
$ pass generate eMail/2daygeek@gmail.com 15
@ -165,9 +166,9 @@ The generated password for eMail/2daygeek@gmail.com is:
TP9ACLyzUZUwBwO
```
#### 编辑现有的密码
### 编辑现有的密码
使用编辑器插入新密码或编辑现有密码。 当你运行下面的命令时,将会在包含密码的文本编辑器中打开文件`/ dev / shm / pass.wUyGth1Hv0rnh / 6kOBG-eMail-2daygeek @ gmail.com.txt`。 只需在其中添加新密码,然后保存并退出即可。
使用编辑器插入新密码或编辑现有密码。 当你运行下面的命令时,将会在包含密码的文本编辑器中打开文件 `/dev/shm/pass.wUyGth1Hv0rnh/6kOBG-eMail-2daygeek@gmail.com.txt`。 只需在其中添加新密码,然后保存并退出即可。
```
$ pass edit eMail/2daygeek@gmail.com
@ -176,9 +177,9 @@ File: /dev/shm/pass.wUyGth1Hv0rnh/6kOBG-eMail-2daygeek@gmail.com.txt
TP9ACLyzUZUwBwO
```
#### 移除密码
### 移除密码
删除现有密码。 它将从 `〜/ .password-store` 中删除包含 `.gpg` 的条目
删除现有密码。 它将从 `~/.password-store` 中删除包含 `.gpg` 的条目
```
$ pass rm eMail/2daygeek@gmail.com
@ -186,7 +187,7 @@ Are you sure you would like to delete eMail/2daygeek@gmail.com? [y/N] y
removed '/home/magi/.password-store/eMail/2daygeek@gmail.com.gpg'
```
#### 多选项功能
### 多选项功能
要保存详细信息,如 URL、用户名、密码、引脚等信息可以使用以下格式。 首先确保你要将第一项设置为密码,因为它用于在使用剪贴板选项时将第一行复制为密码,以及后续行中的附加信息。
@ -205,9 +206,9 @@ Ftp User : 2g
via: http://www.2daygeek.com/pass-command-line-password-manager-linux/
作者:[2DAYGEEK ][a]
作者:[2DAYGEEK][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,40 +1,29 @@
translating---geekpi
uCareSystem All-In-One System Update And Maintenance Tool For Ubuntu/LinuxMint
uCareSystemUbuntu/Linux Mint 的一体化系统更新和维护工具
============================================================
[uCareSystem Core][2] 是一种能够自动执行基本的系统维护活动的轻型实用程序,另一方面它可以通过多种方式减少系统管理员的任务,节省大量时间。它没有任何 GUI并提供纯粹的命令行界面来执行活动。
[uCareSystem Core][2] is a thin utility that automates the basic system maintenance activity, in other hand it will reduce system administrator task in many ways and save some good amount of time. It doesnt have any GUI and offers purely command line interface to perform the activity.
Ubuntu 中有几种实用程序来执行系统维护活动。每种工具有它们相应的独特功能和设计。你可以添加一个 cron 任务来自动化这些任务。
There are several utilities available in Ubuntu to perform system maintenance activity. Each tool has their own unique features and designed accordingly. You can automate this task by adding a cron-job.
uCareSystem Core 会自动刷新发行版仓库、更新可用包列表、卸载包(过期包、孤儿包和旧的 Linux 内核)以及清理取回的包来节省系统磁盘空间。
uCareSystem Core will automatically refresh distribution repository, Updates the list of available packages, uninstall packages (obsolete, orphaned & old Linux Kernels) & Clears the retrieved packages to save some disk space on system.
- 建议阅读:[Stacer - Linux 系统优化器及监控工具][3]
- 建议阅读:[BleachBit 快速及最佳的方式清理你的 Linux 系统][4]
- 建议阅读:[用 Ubuntu Cleaner 在 Ubuntu/LinuxMint 中释放一些空间][5]
Suggested Read : [Stacer Linux System Optimizer and Monitoring Tool][3]
### uCareSystem Core 功能
Suggested Read : [BleachBit A Quick And Best Way to Clean Up Your System In Linux][4]
* 更新包列表(它将刷新包索引)
* 下载及安装更新
* 更新包及系统库到最新版本
* 移除不需要的、过期的和孤儿包。
* 移除旧内核(它为了安全保留当前和之前一个内核)
* 移除不需要的配置文件
* 清理已下载的临时包
Suggested Read : [Free Up Some Space in Ubuntu/LinuxMint With Ubuntu Cleaner (Fork of Janitor Module)][5]
### 在 Ubuntu/LinuxMint 中安装 uCareSystem Core
#### uCareSystem Core Features
* Update package lists (It will refresh package index)
* Downloads and install updates
* Update packages and system libraries to latest available version
* Remove unneeded, obsolete & orphaned packages
* Remove old kernels (It keeps the current and previous one for safety purpose)
* Remove unused config files
* Clean downloaded temporary packages
#### Install uCareSystem Core In Ubuntu/LinuxMint
We can easily install uCareSystem Core in Ubuntu/LinuxMint through PPA since developer offering the own PPA.
因为开发者提供了自己的 PPA因此我们可以轻易地通过 PPA 在 Ubuntu/LinuxMint 中安装 uCareSystem Core。
```
$ sudo add-apt-repository ppa:utappia/stable
@ -42,7 +31,7 @@ $ sudo apt update
$ sudo apt install ucaresystem-core
```
We have successfully installed `uCareSystem Core` package and going to check current disk space utilization with help of `df -h`command before executing uCareSystem Core command to know whether it will save some disk space or not?
我们已经成功安装了 `uCareSystem Core` 包,并且在执行 CareSystem Core 命令之前要了解它是否会节省磁盘空间,使用 `df -h` 命令检查当前磁盘利用率。
```
$ df -h
@ -56,7 +45,7 @@ tmpfs 999M 0 999M 0% /sys/fs/cgroup
tmpfs 200M 112K 200M 1% /run/user/1000
```
Just run an `ucaresystem-core` command in terminal and sitback reset it will take care automatically and no human interaction requires till the end.
只需在终端中运行 `ucaresystem-core` 命令,在结束之前它会自动执行而不需要人类交互。
```
$ sudo ucaresystem-core
@ -117,7 +106,7 @@ Del terminix 1.5.6-1~webupd8~yakkety1 [13.7 kB]
#########################
```
I could see that, it does the job as expected. Also found it saved almost `2GB` in `/ partition`.
我可以看见它如预期那样工作。同样也可以发现大概在`/` 分区节省了 `2GB`
```
$ df -h
@ -135,9 +124,9 @@ tmpfs 200M 112K 200M 1% /run/user/1000
via: http://www.2daygeek.com/ucaresystem-system-update-and-maintenance-tool-for-ubuntu-linuxmint/
作者:[2DAYGEEK ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
作者:[2DAYGEEK][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
@ -146,4 +135,4 @@ via: http://www.2daygeek.com/ucaresystem-system-update-and-maintenance-tool-for-
[2]:https://github.com/cerebrux/uCareSystem
[3]:http://www.2daygeek.com/stacer-linux-system-optimizer-and-monitoring-tool/
[4]:http://www.2daygeek.com/bleachbit-system-cleaner-on-ubuntu-debian-fedora-opensuse-arch-linux-mint/
[5]:http://www.2daygeek.com/ubuntu-cleaner-system-cleaner-ubuntu-tweak-alternative-janitor/
[5]:https://linux.cn/article-8642-1.html

View File

@ -0,0 +1,81 @@
Linux 上如何安装并切换最新版本的 Python 3.6
============================================================
![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/1496865727_python-logo.png)
**Python** 是 [Linux][3] 中一种最流行的编程语言。它被写成了各种工具和库。除此之外Python 在开发者之间很流行因为它非常简单,并且实际很容易掌握。如果你安装了 [Linux mint][4] 系统,正在学习 **Python** 并想要使用最新的版本的话,那么这篇文章就是为你而写的。现在我已经安装好了 [Linux Mint 18][5]。默认安装的版本是 2.7 和 3.5。你可以用这个命令检查:
```
$ python -V
$ python2 -V
$ python3 -V
```
**安装最新的 Python 3.6 到 Linux 中**
```
$ sudo add-apt-repository ppa:jonathonf/python-3.6
$ sudo apt update
$ sudo apt install python3.6
```
检查已安装的 Python 3.6 版本
```
$ python3.6 -V
```
**请注意**旧版本仍然还在,它仍然可以通过 `python3` 可用,新的版本可以通过命令 `python3.6`。如果你想要默认使用这个版本而不是 3.5 运行所有的程序,这有个工具叫 `update-alternatives`。但是如果你尝试获取可能的列表,我们会得到错误:
[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871711_linux_mint_001.png)][6]
这是正常的,你首先需要为那个问题设置文件,因为维护者没有设置这个:
```
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
```
现在再次查看:
```
$ update-alternatives --list python3
```
[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871720_linux_mint_002.png)][7]
现在我们选择需要的版本并按需切换。对于设置使用配置命令:
```
$ sudo update-alternatives --config python3
```
[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871722_linux_mint_003.png)][8]
在提示符中,你需要指定默认使用的编号。
> 选择版本时要小心,不要去动 pythonpython2只使用我说的 python3Python 2.7 编写了各种系统工具,如果你尝试用错误的解释器版本运行它们,可能就不会工作。
愿原力与你同在,好运!!!
--------------------------------------------------------------------------------
via: https://mintguide.org/other/794-python-3-6-install-latest-version-into-linux-mint.html
作者:[Shekin][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://mintguide.org/user/Shekin/
[1]:http://www.codeweavers.com/?ad=708
[2]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D
[3]:https://mintguide.org/
[4]:https://mintguide.org/
[5]:https://mintguide.org/
[6]:https://mintguide.org/uploads/posts/2017-06/1496871711_linux_mint_001.png
[7]:https://mintguide.org/uploads/posts/2017-06/1496871720_linux_mint_002.png
[8]:https://mintguide.org/uploads/posts/2017-06/1496871722_linux_mint_003.png
[9]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D
[10]:https://mintguide.org/other/

View File

@ -0,0 +1,81 @@
在 MacBook Air 上安装 Fedora 26
======================
(写本文时)距离 Fedora 26 测试版发布已有几天,我认为是时候把它安装在我的 13 寸 MacBook Air 上了。
我这个 MacBook Air 的型号为 A1466 EMC 2925拥有 8gb 内存2.2GHz i7 处理器512gb SSD以及与 2015 款相似的外观。
首先我下载了 beta 版镜像,你能够从 [GetFedora][1] 网站获取。一旦你下载完成,就可将它安装在 USB 闪存驱动器上。在 Linux 上,你可以用 `dd` 命令方便的完成这个操作。
将 USB 驱动器插入到你的电脑上,并使用 `tail` 命令读取 `/var/log/syslog``/var/log/messages` 文件的最后几行。你也可以使用 `df -h` 命令查看存储设备从而找到正确的 /dev/sdX。
在下面的例子中,我们假设 USB 闪存驱动器为 `/dev/sdc`
```
dd if=/home/rob/Downloads/Fedora-Workstation-Live-x86_64-26_Beta-1.4.iso of=/dev/sdc bs=8M status=progress oflag=direct
```
这将花费一点点时间……让我们耐心等待。
接下来,我关掉 MacBook等待 5 秒后将它重新启动。在按下电源键后,我按住 “option” 键来呼出启动选项。我的选择如下图:
![macbook-air-fedora.jpg](https://www.linux.org/attachments/macbook-air-fedora-jpg.2763/)
点击 “fedora” 下面的箭头进入安装过程。
在进入安装过程后我注意到我没有 wifi 网络。幸运的是我有个雷电口转以太网的转接器,因为这个笔记本实际上没有以太网接口。我寄希望于谷歌搜索,并于 [此处][2] 找到了一些很棒的指导。
设置 wifi 前先更新内核:
```
sudo dnf update kernel
```
(然后重启)
安装 rpmfusion 仓库:
```
su -c 'dnf install -y http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm'
```
安装 akmods 和 kernel-devel 包:
```
sudo dnf install -y akmods "kernel-devel-uname-r == $(uname -r)"
```
从 rpmfusion 仓库安装 broadcom-wl 包:
```
sudo dnf install -y broadcom-wl
```
重构内核扩展:
```
sudo akmods
```
然后重启连接你的 wifi
到目前为止我们已经解决,这使我印象非常深刻!所有我关心的功能键都能够正常工作,如屏幕亮度、键盘背光、音量。
接下来,等 7 月份发布非测试版时,我将马上使用 dnf 升级LCTT 译注Fedora 26 正式版已经发布)
感谢你Fedora
--------------------------------------------------------------------------------
via: https://www.linux.org/threads/installing-fedora-26-beta-on-a-macbook-air.12464/
作者:[Rob][a]
译者:[cycoe](https://github.com/cycoe)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.org/members/rob.1/
[1]:https://getfedora.org/en/workstation/prerelease/
[2]:https://gist.github.com/jamespamplin/7a803fd5be61d4f93e0c5dcdea3f99ee

View File

@ -0,0 +1,83 @@
arm64 服务器中的 Debian armhf 虚拟机
=============
在 Collabora 公司,我们所做的许多工作之一就是为客户构建包括 32 位和 64 位 ARM 系统在内的各种架构的 [Debian][1] 衍生版。就像 Debian 做的那样,我们的 [OBS][2] 系统建立在原生系统而不是仿真器上。
幸运的是随着几年前 ARM 服务器系统的出现,为这些系统原生构建不再像以前那么痛苦了。对于 32 位的 ARM我们一直依赖 [Calxeda][3] 刀片服务器,然而不幸的是 Calxeda 在不久前淘汰,硬件开始显露其年龄(尽管幸运的是 Debian Stretch 还支持它,因此至少软件还是新的)。
在 64 位 ARM 方面,我们运行在基于 Gigabyte MP30-AR1 的服务器上,该服务器可以运行 32 位的 ARM 代码(与之相反,比如基于 ThunderX 的服务器只能运行 64 位代码)。像这样在它们之上运行 armhf 虚拟机作为从构建服务器build slaves似乎是一个很好的选择但是设置起来可能会需要更多东西的介入。
第一个陷阱是 Debian 中没有标准的 bootloader 或者 boot 固件来启动 qemu 仿真的 “virt” 设备(我不想使用真实机器的仿真)。这也意味着在启动时客户机内没有任何东西会加载内核,也不会从客户机网络引导,这意味着需要直接的内核引导。
第二个陷阱是当前的 Debian Stretch 的 armhf 内核并不支持 qemu 虚拟机所提供的通用 PCI 主机控制器,这意味着客户机中不会出现存储器和网络。希望这会被尽快解决([Debian bug 864726][4]),并出现在 Stretch 更新中,那在之前需要使用 bug 报告中附带的补丁的自定义内核,但在这篇文章中我不想进一步说。
高兴的假设我们有一个可用的内核,剩下的挑战是很好地管理直接内核加载。或者更具体地说,如何确保主机启动客户机通过标准 apt 工具安装的内核,而不必在客户机/主机之间复制内核,这本质上归结于客户机将 `/boot` 暴露给主机。我们选择的方案是使用 qemu 的 9pfs 支持来从主机共享一个文件夹,并将其用作客户机的 `/boot`。对于 9p 文件夹,似乎需要 “mapped” 安全模式,因为 “none” 模式对 dpkg 有问题([Debian bug 864718] [5])。
由于我们使用 libvirt 作为我们的虚拟机管理器,剩下的事情就是如何将它们组合到一起。
第一步是安装系统,基本和平常一样。可以直接引导进入由普通的 Stretch armhf netboot 安装程序提供的 `vmlinuz``initrd.gz`(下载到如 `/tmp` 中)。 设置整体来说很直接,会有一些小的调整:
* `/srv/armhf-vm-boot` 设置为 9p 共享文件夹(这个应该存在,并且由 libvirt-qemu 拥有),这之后会被用于共享 `/boot`
* 内核参数中在 `root=` 后面加上 VM 中的 root 分区,根据你的情况调整。
* 镜像文件使用 virtio 总线,这似乎不是默认的。
除了这些调整,最后的示例命令与 virt-install 手册页中的相似。
```
virt-install --name armhf-vm --arch armv7l --memory 512 \
--disk /srv/armhf-vm.img,bus=virtio
--filesystem /srv/armhf-vm-boot,virtio-boot,mode=mapped \
--boot=kernel=/tmp/vmlinuz,initrd=/tmp/initrd.gz,kernel_args="console=ttyAMA0,root=/dev/vda1"
```
按照通常的方式运行安装。到最后安装程序可能会提示它不知道如何安装引导程序,这个没什么问题。只要在结束安装和重启之前,切换到 shell 并以某种方式将目标系统中的 `/boot/vmlinuz``/boot/initrd.img` 复制到主机中(比如 chroot 进入 `/target` 并在已安装的系统中使用 scp。 这是必需的,因为安装程序不支持 9p但是要启动系统需要 initramfs 以及能够挂载根文件系统的模块,这由已安装的 initramfs 提供。这些完成后,安装就可以完成了。
接下来,引导已安装的系统。调整 libvirt 配置(比如使用 virsh 编辑并调整 xml来使用从安装程序复制过来的内核以及 initramfs而不只是使用它提供的。再次启动虚拟机它应该就能愉快地进入安装的 Debian 系统中了。
要在客户机这一侧完成,`/boot` 应该移动到共享的 9pfs 中,`/boot` 的新 fstab 条目看上去应该这样:
```
virtio-boot /boot 9p trans=virtio,version=9p2000.L,x-systemd.automount 0 0
```
有了这一步,这只是将 `/boot` 中的文件混到新的文件系统里面,并且客户机完事了(确保 `vmlinuz`/`initrd.img` 保持符号链接)。内核可以如常升级,并对主机可见。
这时对于主机端,有另外一个问题需要跨过,由于客户机使用 9p 映射安全模式,客户机的符号链接对主机而言将是普通的包含链接目标的文件。为了解决这个问题,我们在客户机启动前使用 libvirt qemu 的 hook 支持来设置合适的符号链接。作为一个例子,下面是我们最终使用的脚本(`/etc/libvirt/hooks/qemu`
```
vm=$1
action=$2
bootdir=/srv/${vm}-boot
if [ ${action} != "prepare" ] ; then
exit 0
fi
if [ ! -d ${bootdir} ] ; then
exit 0
fi
ln -sf $(basename $(cat ${bootdir}/vmlinuz)) ${bootdir}/virtio-vmlinuz
ln -sf $(basename $(cat ${bootdir}/initrd.img)) ${bootdir}/virtio-initrd.img
```
有了这个,我们可以简单地定义 libvirt 使用 `/srv/${vm}-boot/virtio-{vmlinuz,initrd.img}` 作为机器的内核 / `initramfs`,并且当 VM 启动时,它会自动获取客户机安装的最新内核 / `initramfs`
只有最后一个边缘情况了,当从 VM libvirt 重启会让 qemu 处理它而不是重启 qemu。如果这不幸发生的话意味着重启不会加载新内核。所以现在我们通过配置 libvirt 来解决这个问题,从而在重启时停止虚拟机。由于我们通常只在升级内核(安装)时重启 VM虽然这有点乏味但这避免了重启加载的是旧内核 / `initramfs` 而不是预期的。
--------------------------------------------------------------------------------
via: https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/
作者:[Sjoerd Simons][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/
[1]:https://debian.org/
[2]:http://openbuildservice.org/
[3]:https://en.wikipedia.org/wiki/Calxeda
[4]:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864726
[5]:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864718

View File

@ -1,101 +1,84 @@
How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 [ 19/June/2017 ]
如何修补和保护 Linux 内核堆栈冲突漏洞 CVE-2017-1000364
============================================================
[![](https://www.cyberciti.biz/media/new/category/old/linux-logo.png)][12] Avery serious security problem has been found in the Linux kernel called “The Stack Clash.” It can be exploited by attackers to corrupt memory and execute arbitrary code. An attacker could leverage this with another vulnerability to execute arbitrary code and gain administrative/root account privileges. How do I fix this problem on Linux?
在 Linux 内核中发现了一个名为 “Stack Clash” 的严重安全问题攻击者能够利用它来破坏内存数据并执行任意代码。攻击者可以利用这个及另一个漏洞来执行任意代码并获得管理帐户root权限。
在 Linux 中该如何解决这个问题?
[![the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris](https://www.cyberciti.biz/media/new/faq/2017/06/the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris.jpeg)][22]
The Qualys Research Labs discovered various problems in the dynamic linker of the GNU C Library (CVE-2017-1000366) which allow local privilege escalation by clashing the stack including Linux kernel. This bug affects Linux, OpenBSD, NetBSD, FreeBSD and Solaris, on i386 and amd64\. It can be exploited by attackers to corrupt memory and execute arbitrary code.
### What is CVE-2017-1000364 bug?
Qualys 研究实验室在 GNU C LibraryCVE-2017-1000366的动态链接器中发现了许多问题它们通过与 Linux 内核内的堆栈冲突来允许本地特权升级。这个 bug 影响到了 i386 和 amd64 上的 Linux、OpenBSD、NetBSD、FreeBSD 和 Solaris。攻击者可以利用它来破坏内存数据并执行任意代码。
[From RHN][13]:
### 什么是 CVE-2017-1000364 bug
> A flaw was found in the way memory was being allocated on the stack for user space binaries. If heap (or different memory region) and stack memory regions were adjacent to each other, an attacker could use this flaw to jump over the stack guard gap, cause controlled memory corruption on process stack or the adjacent memory region, and thus increase their privileges on the system. This is a kernel-side mitigation which increases the stack guard gap size from one page to 1 MiB to make successful exploitation of this issue more difficult.
[来自 RHN][13]
[As per the original research post][14]:
> 在用户空间二进制文件的堆栈中分配内存的方式发现了一个缺陷。如果堆(或不同的内存区域)和堆栈内存区域彼此相邻,则攻击者可以使用此缺陷跳过堆栈保护区域,从而导致进程堆栈或相邻内存区域的受控内存损坏,从而增加其系统权限。有一个在内核中减轻这个漏洞的方法,将堆栈保护区域大小从一页增加到 1 MiB从而使成功利用这个功能变得困难。
> Each program running on a computer uses a special memory region called the stack. This memory region is special because it grows automatically when the program needs more stack memory. But if it grows too much and gets too close to another memory region, the program may confuse the stack with the other memory region. An attacker can exploit this confusion to overwrite the stack with the other memory region, or the other way around.
[据原研究文章][14]
### A list of affected Linux distros
> 计算机上运行的每个程序都使用一个称为堆栈的特殊内存区域。这个内存区域是特别的,因为当程序需要更多的堆栈内存时,它会自动增长。但是,如果它增长太多,并且与另一个内存区域太接近,程序可能会将堆栈与其他内存区域混淆。攻击者可以利用这种混乱来覆盖其他内存区域的堆栈,或者反过来。
### 受到影响的 Linux 发行版
1. Red Hat Enterprise Linux Server 5.x
2. Red Hat Enterprise Linux Server 6.x
3. Red Hat Enterprise Linux Server 7.x
4. CentOS Linux Server 5.x
5. CentOS Linux Server 6.x
6. CentOS Linux Server 7.x
7. Oracle Enterprise Linux Server 5.x
8. Oracle Enterprise Linux Server 6.x
9. Oracle Enterprise Linux Server 7.x
10. Ubuntu 17.10
11. Ubuntu 17.04
12. Ubuntu 16.10
13. Ubuntu 16.04 LTS
14. Ubuntu 12.04 ESM (Precise Pangolin)
15. Debian 9 stretch
16. Debian 8 jessie
17. Debian 7 wheezy
18. Debian unstable
19. SUSE Linux Enterprise Desktop 12 SP2
20. SUSE Linux Enterprise High Availability 12 SP2
21. SUSE Linux Enterprise Live Patching 12
22. SUSE Linux Enterprise Module for Public Cloud 12
23. SUSE Linux Enterprise Build System Kit 12 SP2
24. SUSE Openstack Cloud Magnum Orchestration 7
25. SUSE Linux Enterprise Server 11 SP3-LTSS
26. SUSE Linux Enterprise Server 11 SP4
27. SUSE Linux Enterprise Server 12 SP1-LTSS
28. SUSE Linux Enterprise Server 12 SP2
29. SUSE Linux Enterprise Server for Raspberry Pi 12 SP2
### Do I need to reboot my box?
### 我需要重启我的电脑么?
Yes, as most services depends upon the dynamic linker of the GNU C Library and kernel itself needs to be reloaded in memory.
是的,由于大多数服务依赖于 GNU C Library 的动态连接器,并且内核自身需要在内存中重新加载。
### How do I fix CVE-2017-1000364 on Linux?
### 我该如何在 Linux 中修复 CVE-2017-1000364
Type the commands as per your Linux distro. You need to reboot the box. Before you apply patch, note down your current kernel version:
`$ uname -a
$ uname -mrs`
Sample outputs:
根据你的 Linux 发行版来输入命令。你需要重启电脑。在应用补丁之前,记下你当前内核的版本:
```
$ uname -a
$ uname -mrs
```
示例输出:
```
Linux 4.4.0-78-generic x86_64
```
### Debian or Ubuntu Linux
### Debian 或者 Ubuntu Linux
Type the following [apt command][15]/[apt-get command][16] to apply updates:
`$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade`
Sample outputs:
输入下面的 [apt 命令][15] / [apt-get 命令][16]来应用更新:
```
$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
```
示例输出:
```
Reading package lists... Done
@ -182,85 +165,109 @@ Setting up linux-headers-4.9.0-3-amd64 (4.9.30-2+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u1) ...
```
Reboot your server/desktop using [reboot command][17]:
`$ sudo reboot`
使用 [reboot 命令][17]重启桌面/服务器:
```
$ sudo reboot
```
### Oracle/RHEL/CentOS/Scientific Linux
Type the following [yum command][18]:
`$ sudo yum update
$ sudo reboot`
输入下面的 [yum 命令][18]
```
$ sudo yum update
$ sudo reboot
```
### Fedora Linux
Type the following dnf command:
`$ sudo dnf update
$ sudo reboot`
输入下面的 dnf 命令:
### Suse Enterprise Linux or Opensuse Linux
```
$ sudo dnf update
$ sudo reboot
```
Type the following zypper command:
`$ sudo zypper patch
$ sudo reboot`
### Suse Enterprise Linux 或者 Opensuse Linux
输入下面的 zypper 命令:
```
$ sudo zypper patch
$ sudo reboot
```
### SUSE OpenStack Cloud 6
`$ sudo zypper in -t patch SUSE-OpenStack-Cloud-6-2017-996=1
$ sudo reboot`
```
$ sudo zypper in -t patch SUSE-OpenStack-Cloud-6-2017-996=1
$ sudo reboot
```
### SUSE Linux Enterprise Server for SAP 12-SP1
`$ sudo zypper in -t patch SUSE-SLE-SAP-12-SP1-2017-996=1
$ sudo reboot`
```
$ sudo zypper in -t patch SUSE-SLE-SAP-12-SP1-2017-996=1
$ sudo reboot
```
### SUSE Linux Enterprise Server 12-SP1-LTSS
`$ sudo zypper in -t patch SUSE-SLE-SERVER-12-SP1-2017-996=1
$ sudo reboot`
```
$ sudo zypper in -t patch SUSE-SLE-SERVER-12-SP1-2017-996=1
$ sudo reboot
```
### SUSE Linux Enterprise Module for Public Cloud 12
`$ sudo zypper in -t patch SUSE-SLE-Module-Public-Cloud-12-2017-996=1
$ sudo reboot`
```
$ sudo zypper in -t patch SUSE-SLE-Module-Public-Cloud-12-2017-996=1
$ sudo reboot
```
### Verification
### 验证
You need to make sure your version number changed after issuing [reboot command][19]
`$ uname -a
你需要确认你的版本号在 [reboot 命令][19]之后改变了。
```
$ uname -a
$ uname -r
$ uname -mrs`
Sample outputs:
$ uname -mrs
```
示例输出:
```
Linux 4.4.0-81-generic x86_64
```
### A note about OpenBSD users
### 给 OpenBSD 用户的注意事项
See [this page][20] for more info.
见[此页][20]获取更多信息。
### A note about Oracle Solaris
### 给 Oracle Solaris 的注意事项
[See this page][21] for more info.
[见此页][20]获取更多信息。
### References:
### 参考
* [The Stack Clash][4]
* [堆栈冲突][4]
--------------------------------------------------------------------------------
作者简介:
Vivek Gite
The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on [Twitter][1], [Facebook][2], [Google+][3].
作者是 nixCraft 的创始人,对于 Linux 操作系统/Unix shell脚本有经验丰富的系统管理员和培训师。他曾与全球客户及各行各业包括 IT、教育、国防和空间研究以及非营利部门合作。在 [Twitter][1]、[Facebook] [2]、[Google +] [3] 上关注他。
--------------------------------------------------------------------------------
via: https://www.cyberciti.biz/faq/howto-patch-linux-kernel-stack-clash-vulnerability-cve-2017-1000364/
作者:[Vivek Gite ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
作者:[Vivek Gite][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,52 +1,78 @@
# [启动修复工具 - 修复与启动相关的大部分问题][15]
Boot Repair Tool 可以修复与启动相关的大部分问题
=========
[![boot repair tool repair the most boot related problems ](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/boot-repair-tool-repair-the-most-boot-related-problems_orig.jpg)][1]
​我们都碰到过启动相关的问题并且大部分时候都是简单的 **GRUB** 上的问题。 有时候很多人会觉得、输入一段很长的命令或在论坛中搜索来找到解决方法太麻烦了。今天我要告诉你如何使用一个简单而的软件来解决大部分的启动相关的问题。这个工具就是著名的 **Boot Repair Tool** 。好了,话不多说,让我们开始吧。
[![boot repair tool repair the most boot related problems ](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/boot-repair-tool-repair-the-most-boot-related-problems_orig.jpg)][1]
​我们都碰到过启动相关的问题并且大部分时候都是简单的 **GRUB** 上的问题。 有时候很多人会觉得、输入一段很长的命令或在论坛中搜索来找到解决方法太麻烦了。今天我要告诉你如何使用一个简单而轻巧的软件来解决大部分的启动相关的问题。这个工具就是著名的 **Boot Repair Tool** 。好了,话不多说,让我们开始吧。
### 如何在 Linux 中安装和使用启动修复工具
你需要一个安装的操作系统的可启动的 pendrive 或 DVD这是安装这个应用并使用它的前提条件。 引导到 [操作系统][17] 并打开终端并输入以下命令
你需要一个你所安装的操作系统的现场版的 USB 棒或 DVD这是安装这个应用并使用它的前提条件。 引导到操作系统[17] 并打开终端并输入以下命令
```
sudo add-apt-repository -y ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair
```
[![install boot repair tool in linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-boot-repair-tool-in-linux.jpg?1498051049)][2]
在安装结束以后你可以从应用菜单或或其它你在系统上启动应用的地方启动你的修复工具。
[![run boot-repair from apps menu](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/run-boot-repair-from-apps-menu.jpg?1498051112)][3]
你可以在菜单栏中看到 Boot Repair。
[![Picture](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/scan-boot-issues-with-boot-repair.jpg?1498051197)][4]
​启动它,它就会开始进行一些扫描操作,我们只要等它自己结束就好了。
[![boot repair app menu to repair system](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/boot-repair-app-menu-to-repair-system.jpg?1498051265)][5]
现在你会看到这个界面,这是基于之前扫描的建议修复。 在底部还可以有一个高级选项,你可以在高级选项里进行各方面的设置。 我建议没有经验的用户使用推荐维修,因为它很简单,在大多数情况下我们都可以这样做。
[![apply recommended fixes to fix grub issues](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/apply-recommended-fixes-to-fix-grub-issues.jpg?1498051332)][6]
选择推荐的更新后,它将开始修复。 等待进一步的处理。
[![fix the grub menu using boot repair](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/fix-the-grub-menu-using-boot-repair.jpg?1498051422)][7]
你现在会看到一个指令界面。 现在是轮到我们操作的时候了。打开终端,逐个复制并粘贴其中高亮的命令到终端中。
[![download and install grub using the given commands](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/confirm-grub-packages-installation.jpg?1498051588)][8]
命令完成后,你会看到一个上面提及的要求确认的界面。 使用箭头键或Tab键选择是然后按回车键选择。 现在在 **启动修复工具** 界面中回车。
[![install grub menu and kernel to fix boot menu](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-grub-menu-and-kernel-to-fix-boot-menu.jpg?1498055715)][9]
现在你会看到这个界面。 复制在那里提到的命令,并将其粘贴到终端中,然后按回车并让其执行此操作。 需要一段时间所以请耐心等待它将下载GRUB、[kernel][18] 或任何修复您的引导所需的内容。
[![install grub](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-grub.jpg?1498055780)][10]
现在你可能会看到一些选项用于配置安装 GRUB 的位置。 选择是,然后按 Enter你会看到上面的界面。 使用空格键选择选项和TAB 以浏览选项。 选择并安装 GRUB 后,可以关闭终端。 现在在启动修复工具屏幕中选择 forward 选项。
[![scan for the boot issues](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/scan-for-the-boot-issues.jpg?1498055908)][11]
现在它会做一些扫描操作。,并且会询问你一些需要确认的一些选项。 每个选项都选择是即可。
[![fixed boot issues with boot rescue](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/fixed-boot-issues-with-boot-rescue.jpg?1498056040)][12]
它会显示一个成功的确认消息。 如果没有,并且显示失败的消息,则将生成链接。 转到该链接获取更多帮助。
成功后,重启你的电脑。 当你重新启动时,你会看到 GRUB。 现在已成功维修您的电脑。 玩的开心。
[![install boot repair tool in linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-boot-repair-tool-in-linux.jpg?1498051049)][2]
在安装结束以后,你可以从应用菜单或或其它你在系统上启动应用的地方启动你的修复工具。
[![run boot-repair from apps menu](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/run-boot-repair-from-apps-menu.jpg?1498051112)][3]
你可以在菜单栏中看到 Boot Repair。
[![Picture](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/scan-boot-issues-with-boot-repair.jpg?1498051197)][4]
​启动它,它就会开始进行一些扫描操作,我们只要等它自己结束就好了。
[![boot repair app menu to repair system](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/boot-repair-app-menu-to-repair-system.jpg?1498051265)][5]
现在你会看到这个界面,这是基于之前扫描的建议修复。 在底部还可以有一个高级选项,你可以在高级选项里进行各方面的设置。 我建议没有经验的用户使用推荐维修,因为它很简单,在大多数情况下我们都可以这样做。
[![apply recommended fixes to fix grub issues](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/apply-recommended-fixes-to-fix-grub-issues.jpg?1498051332)][6]
选择推荐的更新后,它将开始修复。 等待进一步的处理。
[![fix the grub menu using boot repair](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/fix-the-grub-menu-using-boot-repair.jpg?1498051422)][7]
你现在会看到一个指令界面。 现在是轮到我们操作的时候了。打开终端,逐个复制并粘贴其中高亮的命令到终端中。
[![download and install grub using the given commands](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/confirm-grub-packages-installation.jpg?1498051588)][8]
命令完成后,你会看到一个上面提及的要求确认的界面。 使用箭头键或 Tab 键选择“Yes”然后按回车键。 现在在 **启动修复工具** 界面中点击 “forward”。
[![install grub menu and kernel to fix boot menu](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-grub-menu-and-kernel-to-fix-boot-menu.jpg?1498055715)][9]
现在你会看到这个界面。 复制在那里提到的命令,并将其粘贴到终端中,然后按回车并让其执行此操作。 需要一段时间所以请耐心等待它将下载GRUB、内核或任何修复您的引导所需的内容。
[![install grub](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-grub.jpg?1498055780)][10]
现在你可能会看到一些选项用于配置安装 GRUB 的位置。 选择“yes”然后按回车你会看到上面的界面。使用空格键选择选项和按 TAB 以浏览选项。 选择并安装 GRUB 后,可以关闭终端。 现在在启动修复工具屏幕中选择 “forward” 选项。
[![scan for the boot issues](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/scan-for-the-boot-issues.jpg?1498055908)][11]
现在它会做一些扫描操作,并且会询问你一些需要确认的一些选项。 每个选项都选择是即可。
[![fixed boot issues with boot rescue](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/fixed-boot-issues-with-boot-rescue.jpg?1498056040)][12]
它会显示一个成功的确认消息。 如果没有,并且显示失败的消息,则将生成链接。 转到该链接获取更多帮助。
成功后,重启你的电脑。 当你重新启动时,你会看到 GRUB。 现在已成功维修您的电脑。 一切顺利。
### 引导修复的高级技巧
当我的电脑出现双引导启动画面时,我发现在修复时,它无法识别 [Windows 7安装在另一个分区上][19]。 这是一个简单的提示来帮你解决这个问题。
当我的电脑出现双引导启动画面时,我发现在修复时,它无法识别 [安装在另一个分区上的 Windows 7][19]。 这里有一个简单的提示来帮你解决这个问题。
打开终端并安装 os-prober。 它很简单,可以在软件中心或通过终端找到。
os-prober 可以帮助您识别安装在 PC 上的其他操作系统。
[![install os-prober](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-os-prober_orig.jpg)][13] After os-prober 已安装完成,通过输入 os-prober 在终端运行它。 如果失败了那么试着用 root 账号运行它。 之后运行update-grub 命令。 这些是所有你可以用于从 GRUB 中启动 Windows 的选项。
[![install os-prober](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-os-prober_orig.jpg)][13]
os-prober 安装完成后,通过输入 `os-prober` 在终端运行它。 如果失败了那么试着用 root 账号运行它。 之后运行`update-grub` 命令。 这就是你可以用于从 GRUB 中启动 Windows 的所需要做的全部。
[![upgrade-grub in linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/upgrade-grub-in-linux.jpg?1498056179)][14]
### 总结
@ -57,9 +83,9 @@ os-prober 可以帮助您识别安装在 PC 上的其他操作系统。
via: http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
作者:[www.linuxandubuntu.com ][a]
作者:[linuxandubuntu][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,119 @@
如何关闭一个不活动的或者空闲的 SSH 会话
============================================================
让我们来假设一下,当你通过 ssh 在服务器上工作时,由于网络、电源或者是本地 PC 重启等原因会导致你的会话连接断开。
你可能会再次登录服务器继续工作也可能不会,但是你始终会留下之前没有关闭的 ssh 会话。
如何关闭一个不活动的 ssh 会话?首先使用 `w` 命令来识别出不活动或者是空闲的 ssh 会话,接着使用 `pstree` 命令来获取空闲会话的 PID最后就是使用 `kill` 命令来关闭会话了。
建议阅读:[MoshMobile Shell- 最好的SSH 远程连接替代选项][3]
### 如何识别不活动的或者是空闲的 SSH 会话
登录系统通过 `w` 命令来查看当前有多少用户登录着。如果你识别出了自己的会话连接就可以记下其它不活动或者是空闲的 ssh 会话去关闭。
在我当前的例子中,能看见两个用户登录着,其中一个是我当前在执行 `w` 命令的 ssh 会话另一个就是之前的空闲会话了。
```
# w
10:36:39 up 26 days, 20:29, 2 users, load average: 0.00, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 219.91.219.14 10:34 28.00s 0.00s 0.00s -bash
root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w
```
### 如何获取 SSH 会话的 PID
为了关闭空闲的 ssh 会话,我们需要空闲会话进程的父进程的 PID。我们可以执行 `pstree` 命令来查看包括了所有进程的树状图,以便获取父进程的 pid。
你会获得与下方示例中相似的输出。`pstree` 命令的输出会比这个多得多,为了更好的理解我删去了许多不相关的内容。
```
# pstree -p
init(1)-+-abrtd(2131)
|-acpid(1958)
|-httpd(32413)-+-httpd(32442)
|
|-mingetty(2198)
|-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378)
|
|-php(32456)-+-php(32457)
|
|-sshd(2023)-+-sshd(10132)---bash(10136)
| `-sshd(10199)---bash(10208)---pstree(10226)
|-udevd(774)-+-udevd(2191)
`-udevd(27282)
```
从上方的输出中,你可以看到 `sshd` 进程与分支的树形图。`sshd` 的主进程是 `sshd2023`,另两个分支分别为 `sshd10132``sshd10199`
跟我在文章开始讲的相同,其中一个是我新的会话连接 `sshd10199` 它展示了我正在执行的 `pstree` 命令,因此空闲会话是另一个进程为 `sshd10132`
- 建议阅读:[如何通过标准的网页浏览器来接入 Secure Shell (SSH) 服务器][4]
- 建议阅读:[PSSH - 在多台 Linux 服务器上并行的执行命令][5]
### 如何关闭空闲 SSH 会话
我们已经获得了有关空闲会话的所有信息。那么,就让我们来使用 `kill` 命令来关闭空闲会话。请确认你将下方的 PID 替换成了你服务器上的空闲会话 PID。
```
# kill -9 10132
```
LCTT 译注:这里介绍另一个工具 `pkill`,使用 `pkill -t pts/0 -kill` 就可以关闭会话, debian 8 下可用,有些版本似乎需要更改 `-kill` 的位置)
### 再次查看空闲会话是否已经被关闭
再次使用 `w` 命令来查看空闲会话是否已经被关闭。没错,只有那个我自己的当前会话还在,因此那个空闲会话已经被关闭了。
```
# w
10:40:18 up 26 days, 20:33, 1 user, load average: 0.11, 0.04, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w
```
- 建议阅读:[rtop - 一个好用的通过 SSH 来监控远程服务器的工具][6]
- 建议阅读:[DSH - 同时在多台 Linux 服务器上执行命令][7]
### 再次使用 pstree 命令检查
再次使用 `pstree` 命令确认。是的,只有那个我自己的 ssh 会话还在。
```
# pstree -p
init(1)-+-abrtd(2131)
|-acpid(1958)
|
|-httpd(32413)-+-httpd(32442)
|
|-mingetty(2198)
|-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378)
|
|-php(32456)-+-php(32457)
|
|-sshd(2023)---sshd(10199)---bash(10208)---pstree(10431)
|-udevd(774)-+-udevd(2191)
`-udevd(27282)
```
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/kill-inactive-idle-ssh-sessions/
作者:[Magesh Maruthamuthu][a]
译者:[wcnnbdk1](https://github.com/wcnnbdk1)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/magesh/
[1]:http://www.2daygeek.com/author/magesh/
[2]:http://www.2daygeek.com/category/ssh-tutorials/
[3]:https://linux.cn/article-6262-1.html
[4]:http://www.2daygeek.com/shellinabox-web-based-ssh-terminal-to-access-remote-linux-servers/
[5]:http://www.2daygeek.com/pssh-parallel-ssh-run-execute-commands-on-multiple-linux-servers/
[6]:https://linux.cn/article-8199-1.html
[7]:http://www.2daygeek.com/dsh-run-execute-shell-commands-on-multiple-linux-servers-at-once/

View File

@ -0,0 +1,92 @@
8 种在你没有时间的时候为开源做贡献的方式
============================================================
> 在忙碌的生活中抽出时间回馈给你关心的项目。
![8 ways to contribute to open source when you have no time](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=zLMswcrw "8 ways to contribute to open source when you have no time")
人们不给开源做贡献(或不能做更多贡献)的[最常见的原因][3]之一是缺乏时间。人艰不拆,有这么多的优先的事情争夺你有限的注意力。那么,如何才能在忙碌的生活中为你关心的开源项目抽出时间呢?
为了充分披露,我需要提醒你,我延误了把这篇文章给编辑的时间,因为我抽不出时间写它,所以是否接受我的建议,请自行承担风险。
### 找出你所关心的
贡献的第一步是弄清楚你正在做些什么。你有一个你自己的为之努力的项目吗有没有一个你想要帮助的具体项目或者你只是想做_某个事情_弄清楚你正在做的事情将帮助你决定你的生活中的优先事项。
### 找出其他的方法贡献
编写新功能可能需要数小时的设计、编码和测试。这对于那种只有几分钟时间就得离开,然后再从原来的地方重新开始的情况下并不容易。如果你没有办法进行长于 30 分钟的无中断工作,当你试着完成一个大的任务时,你或许会感到沮丧。
但还有或许可以满足你的需求的其它贡献方式,可以让你利用起来空闲的时间。其中一些可以通过智能手机快速完成,这意味着人们可以避免在通勤上浪费时间,并将其用于开源贡献。以下是可以在小块时间中完成的一些事情列表:
* **Bug 分类:** 所有的 bug 报告都有必要的信息来诊断和解决它们么?它们是否妥善提交(给出正确的范围,正确的严重程度等)了么?
* **邮件列表支持:** 用户或其他贡献者在邮件列表中提出了问题?也许你可以帮忙。
* **文档修补:** 文档经常(但不总是)可以比代码用更小块的时间来处理。也许有几个地方你可以补充一下,或者也许是时候浏览一下文档并确保它们仍然准确了。
* **营销:** 在社交媒体上谈论你的项目或者社区。写一篇快速入门博文。在新闻聚合里投票和评论。
### 与你的老板交谈
你可能会认为在上班时间里你不能在开源项目上工作但是你有_问过么_ 特别是如果这个项目以某种方式与你的日常工作相关,那你或许可以和你的老板谈谈,让你可在工作时做出贡献。请注意,这可能存在一些知识产权问题(例如,谁拥有你在工作时间内提供的代码的权利),因此首先做一下研究并以书面形式获得授权。
### 设置最后期限
我所学到的最佳时间管理建议可以归纳为两个规则:
1. 如果要完成,它必须有一个截止日期
2. 可以更改最后期限
这篇文章有一个最后期限。它没有特别的时间敏感性,但最后期限意味着我定义了什么时候想完成它,并给编辑一个什么时候可以提交的感觉。是的,如上所述,我错过了最后期限。但你知道发生了什么事么?我设定了一个新的期限(二手才最棒!)。
如果有些事_是_时间敏感的在你需要返工一两次时设置最后期限也可以给你一些空间。
### 将它放到你的日程上
如果你使用日历安排你的生活,那用它安排一些时间来开展你的开源项目,可能是完成此项工作的唯一方法。你计划多少时间取决于你自己,但即使你每周只用一小时作为开源时间,这仍会给你每周一小时的开源时间。
这有一个秘密:有时候,如果你需要时间去做别的事情,或者什么都不想做,那么可以自己取消它。
### 开拓未使用的时间
你在通勤中感到无聊吗?你晚上睡觉困难么?也许你可以利用这个时间来贡献。现在我认为“每周完全投入工作 169 个小时”的生活方式是一件非常可怕的事情。也就是说,有些夜晚你不能入睡。也许你已经意识到了可以做贡献,而不是躺在床上看看你的 Twitter 上的朋友在世界的另一边做了什么(如我做的)。但是不要养成放弃睡眠的习惯。
### 停止
有时,贡献最好的方式是一点不贡献。你是一个忙碌的人,不管你是多么的棒,你不能避开你的生理和心理的需要,它们会找上你。花点时间来休息,这也许可以提高你的生产力,使你的工作更快,突然间你就有时间去做那些你一直想做的开源贡献了。
### 说“不”
我不擅长这个,所以我做的并不好。但是没有人能做到任何想做的事情。有时候,你可以做的最好的事情是停止贡献,就像以前一样,或者没有贡献(参见上文)。
几年前,我领导了 Fedora 文档团队。团队的传统是,在每次发布结束时, 领导会主动提出下台。我已经做了一两次,没有人想要替代我,所以我继续保持着这个角色。但是在我的第二或第三次发布之后,我明确表示,我不会继续担任团队领导了。我还是很喜欢这份工作,但我有一份全职的工作,而且在研究生读到一半时,我的妻子怀了我们的第一个孩子。我没有办法做到始终如一的努力,所以我退出领导了。我继续做出贡献,但是在要求较低的能力的位置中。
如果你正在努力抽出时间来满足你的义务(自我强加的或者不是),那么也许现在是重新考虑你的角色了。这对于你自己创建的或者已经大量投资的项目来说很困难,但有时你不得不这么做——为了你自己好以及项目本身。
### 其他还有什么?
你如何找到时间作出贡献? 让我们在评论中知道。
题图 opensource.com
--------------------------------------------------------------------------------
作者简介:
Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco)
----------
via: https://opensource.com/article/17/6/find-time-contribute
作者:[Ben Cotton][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/bcotton
[1]:https://opensource.com/article/17/6/find-time-contribute?rate=qWRgPXlhEZchh_vXEplj6jLXd7P0QCwzxZFWYkqawCc
[2]:https://opensource.com/user/30131/feed
[3]:http://naramore.net/blog/why-people-don-t-contribute-to-os-projects-and-what-we-can-do-about-it
[4]:https://opensource.com/users/bcotton
[5]:https://opensource.com/article/17/6/find-time-contribute#comments

View File

@ -0,0 +1,79 @@
Ring :一个专注隐私,开源的 Skype 替代品
============================================================
![](https://mintguide.org/uploads/posts/2017-06/thumbs/1498158697_screenshot-at-2017-06-22-12-08-39.png)
**如果你对 Linux 上的 Skype 进度不满意,或者对即将[换代的、旧的但是优秀的Qt Skype 客户端][3]感到不快,这有一个 GNU 替代品叫 Ring。**
GNU Ring 是一个跨平台、关注隐私的交流程序,它很快得到了 FOSS 以及安全圈的注意。
就像一个 **Skype 的开源替代品**,不用背负微软 VoIP 客户端的那些东西Ring 不仅能够做大多数 Skype 能够做的,还能以安全、让人放心的私密方式做到:
* 语音电话
* 电话会议
* 视频电话
* 即时通信
所有这些功能也可以跨设备运行。你同伴使用的是使用 Windows 版 Ring 或者 Android 版 Ring 都不重要。只要他们在 Ring 上,你就能联系他们!
Ring 通过分布式对等网络工作。这意味着它不用依赖于一个大型集中式服务器以存储你所有详细信息、通话记录和帐户信息。相反,该服务使用分布式哈希表建立通信。
[Ring 网站][9]使用端到端加密的认证sic、使用 X.509 证书管理身份、并且基于 RSA/AES/DTLS/SRTP 技术。
### 下载 Linux 版 Ring
你可以从项目网站或者按照下面的安装指导在 Ubuntu 上添加 Ring 的官方仓库来[下载 Linux 版 Ring][11]。这里有两个版本的客户端KDE 版本和 GNOME 版本。
如果你运行的 Ubuntu 带有 Unity 或者 GNOME Shell就选择 GNOME 版本。
如果你对安装感到疑惑,项目网站上有一个一个[手把手的教程][12]。
官方网站上还有直接的 Windows、macOS 和 Android 版链接。
#### 在 Ubuntu 上设置 Ring
当你安装完 Linux 版客户端后,你就能够使用了:在开始打电话前,你只需注册一个 Ring ID。
Ring 的注册不同于 Skype、Telegram 和 WhatsApp 那样。你**不必**绑定一个手机号或者邮箱。
取而代之的是 Ring 会要求你输入一个用户名(你可以任意输入),接着会分配你一个冗长的身份号码。你需要给其他 Ring 用户发送这个身份号码,那么他们可以给你打电话。
要**在 Ring 中打第一通电话**,你需要主程序的搜索栏输入联系人的 Ring ID接着点击电话按钮拨打电话。
其他事情应该相对直接。你可以在其他设备上安装 Ring 并用你的帐户验证,这样你就不会错过任何一个电话(如果你在 Android 设备上安装,你可以扫描二维码来快速设置)。
Ring 的细节以及配置存储你家目录下的配置文件夹内的 `dring.yml` 中。
### Ring 怎么样?
这篇文章“垃圾”的部分是告诉你 Ring 怎么样:我不知道因为我不认识任何使用 Ring 的人。因此我没有机会真正使用它。
我尝试 Google 来查找 Ring 的评测,但是这是一个噩梦,因为程序的名字太普遍了(虽然我现在非常了解 Ring 视频门铃)。
_**如果你已经使用 Ring 或者你能够劝说至少一个你认识的人使用,那么记得回来分享一下关于连接质量和性能。**_
--------------------------------------------------------------------------------
via: https://mintguide.org/internet/795-ring-is-a-privacy-focused-open-source-skype-alternative.html
作者:[fabiomorales9999][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://mintguide.org/user/fabiomorales9999/
[1]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D
[2]:https://mintguide.org/
[3]:https://linux.cn/article-7606-1.html
[4]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4
[5]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D
[6]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE
[7]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html
[8]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html
[9]:https://ring.cx/
[10]:https://mintguide.org/
[11]:https://ring.cx/en/download/gnu-linux
[12]:https://ring.cx/en/tutorials/gnu-linux#RingID
[13]:https://mintguide.org/uploads/posts/2017-06/1498158697_screenshot-at-2017-06-22-12-08-39.png
[14]:https://mintguide.org/internet/

View File

@ -0,0 +1,89 @@
Chromebook 如何双启动Ubuntu 17.04 GNOME 和 Chrome OS
============================================================
> 本教程使用著名的 Crouton 安装器
![Ubuntu 17.04 with GNOME 3.24 running on Acer Chromebook 11 (C740)](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg)
在去年我拿到我的 Acer Chromebook 11 (C740) 时,我写了一篇教程教你们如何[如何移除 Google Chrome OS 并根据你的选择安装一个 GNU/Linux 发行版][1],但是很快我觉得没意思了。
因此几个月之后,我使用了 Google 在网站上提供的恢复镜像重新安装了 Chrome OS我写入了 USB 并从 Chromebook 启动。最近,我又感到无聊了,因此我决定使用 Crouton 在我的 Acer Chromebook 11 (C740) 上安装 Ubuntu。
为什么?因为在一次会议中来的一位朋友带了他的笔记本,一台 Dell Chromebook 13在上面他运行了 Ubuntu Linux 还有 Chrome OS。看他用快捷键在两个操作系统之间切换很酷这让我也想这么做。
现在有很多教程解释如何安装不同的发行版 Ubuntu、Debian 或者 Kali Linux这些是当前 Crouton 安装器支持的 GNU/Linux 发行版),但是我想要运行最新的 Ubuntu当前是 Ubuntu 17.04 (Zesty Zapus),它有 GNOME 3.24 桌面环境。
### 如何启用开发者模式并下载 Crouton
当我询问我的朋友他在他的 Chromebook 上运行的是什么 Ubuntu 时,回答是 Ubuntu 14.04 LTS (Trusty Tahr),我不得不承认这让我有点失望。我回家后立刻拿出我的 Chromebook 并尝试看看我是否能运行带有桌面环境的 Ubuntu 17.04。
我做的第一件事情是将我的 Chromebook 变成开发者模式。为此,你需要关闭你的 Chromebook 但不关闭翻盖,接着同时按住 `ESC`、`Refresh` 和 `Power` 键几秒直到进入恢复模式,这会擦除 Chromebook 上的所有数据。
进入开发者模式会花费你几分钟,所以耐心点。当准备完成后,你需要登录你的 Google 账户,并设置各种东西,比如壁纸或者头像之类。现在你进入开发者模式了,在你的 Chromebook 中访问这篇教程并[下载 Crouton][2],它会保存在下载文件夹中。
### 如何使用 Crouton 安装带有 GNOME 3.24 的 Ubuntu 17.04
现在打开 Google Chrome 并按下 `CTRL+ALT+T` 打开 Chrome OS 的终端模拟器,它叫做 crosh。在命令提示符中输入 `shell` 命令,按下回车进入 Linux shell。让我们看看 Crouton 能为我们做什么。
这有两个命令(下面列出的),你可以运行它们查看 Crouton 支持的 GNU/Linux 发行版和桌面环境,并且我可以告诉你这可以安装 Debian 7 “Wheezy”、Debian 8 “Jessie”、Debian 9 “Stretch” 和 Debian Sid、Kali Linux 滚动版还有 Ubuntu 12.04 LTS、Ubuntu 14.04 LTS 和 Ubuntu 16.04 LTS 等等。
```
sh -e /Downloads/crouton -r list -  ### 会列出支持的发行版
sh -e /Downloads/crouton -t list -  ### 会列出支持的桌面
```
Crouton 也会列出一系列 Debian、Kali 和 Ubuntu 的旧发行版,但它们在上游被中止支持了(这些的名字后面都被标记了感叹号),并且因为安全风险你不应该安装它们,还有两个尚未支持的 Ubuntu 版本Ubuntu 16.10 和 Ubuntu 17.04。
Crouton 开发者说这些“不支持”的 Ubuntu 版本用一些方法可能也可以使用,但是我试了一下并使用下面的命令安装了带有 GNOME 3.24 桌面环境(没有额外的应用)的 Ubuntu 17.04 (Zesty Zapus)。我使用 `-e` 参数来加密安装。
```
sh -e /Downloads/crouton -e -r zesty -t gnome
```
将所有的都下载下来并安装在 Crouton 在你的 Chromebook 中创建的 chroot 环境中会花费一些时间,因此再说一次,请耐心。当一切完成后,你会知道,并且你能通过在 shell 中运行下面的命令启动 Ubuntu 17.04。
```
sudo startgnome
```
瞧!我在我的旧 Acer Chromebook 11 (C740) 上运行着带有 GNOME 3.24 桌面环境的 Ubuntu 17.04 (Zesty Zapus),这笔记本 Google 还尚未支持 Android 程序。最棒的部分是我能够使用 `CTRL+ALT+Shift`+`Back`/`Forward` 键盘快捷键快速在 Chrome OS 和 Ubuntu 17.04 之间切换。
![GNOME 3.24 desktop - System menu](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg)
作为这篇笔记的结尾,我想提醒你注意,由于 Chromebook 现在始终处于开发人员模式,所以当电池电量耗尽、打开或关闭设备时,你会一直看到一个警告,显示 “OS verification is OFF - Press SPACE to re-enable”当你看到它时请按 `CTRL+D`。玩得开心!
![GNOME 3.24 desktop - Calendar applet](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg)
![GNOME 3.24 desktop - Overview mode](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg)
--------------------------------------------------------------------------------
via: http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml
作者:[Marius Nestor][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://news.softpedia.com/editors/browse/marius-nestor
[1]:http://news.softpedia.com/news/here-s-how-to-install-any-linux-operating-system-on-your-chromebook-506212.shtml
[2]:https://goo.gl/fd3zc
[3]:http://news.softpedia.com/editors/browse/marius-nestor
[4]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml#
[5]:https://share.flipboard.com/bookmarklet/popout?v=2&title=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml&t=1498358928&utm_campaign=widgets&utm_medium=web&utm_source=flipit&utm_content=news.softpedia.com
[6]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml#
[7]:http://twitter.com/intent/tweet?related=softpedia&via=mariusnestor&text=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml
[8]:https://plus.google.com/share?url=http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml
[9]:http://news.softpedia.com/newsTag/Ubuntu%2017.04
[10]:http://news.softpedia.com/newsTag/GNOME%203.24
[11]:http://news.softpedia.com/newsTag/Chromebook
[12]:http://news.softpedia.com/newsTag/Acer%20Chrombook%2011
[13]:http://news.softpedia.com/newsTag/Linux
[14]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg
[15]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg
[16]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg
[17]:https://twitter.com/intent/follow?screen_name=mariusnestor
[18]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg

View File

@ -0,0 +1,96 @@
如何将树莓派变成电子书服务器
============================================================
> Calibre 电子书管理软件可以轻松地在树莓派 3 上设置电子书服务器,即使在连接较慢区域也是如此。
![How to turn a Raspberry Pi into an eBook server](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/idea_innovation_mobile_phone.png?itok=Ep49JfKU "How to turn a Raspberry Pi into an eBook server")
最近 [Calibre 3.0 发布了][12],它让用户能够在浏览器中阅读电子书!注意 Raspbian 的仓库还没有更新它(截至写作时)。
电子书是教师、图书馆员和其他人与学生共享书籍、课堂资料或其他文件的好方法,只需要你有可靠的带宽接入即可。但是,即使你的连接速度较慢或无法连接,还有一个简单的解决方案:使用在树莓派 3 上运行的开源 Calibre 电子书管理软件创建电子书服务器。这是我所做的,你也可以。
首先我下载了最新的 [Raspbian Pixel 镜像][13],并安装在一个新的 8GB microSD 卡上。然后我插入 microSD连接了键盘、鼠标并用一根 HDMI 线连接到一台旧的 LCD 电视,然后启动了 Pi。在我的显示器上[调整了 Pixel 环境分辨率][14]并连接到本地网络之后,我准备开始了。我打开一个终端,并输入 `sudo apt-get update` 以获取操作系统的最新更新。
![Updating Raspbian Pixel](https://opensource.com/sites/default/files/u128651/1updateos.png "Updating Raspbian Pixel")
接下来,我在终端中输入 `sudo apt-get install calibre` 来安装 [Calibre][15]。
![Installing Calibre](https://opensource.com/sites/default/files/u128651/2install_calibre.png "Installing Calibre")
我从命令行启动了 Calibre注意它也可以从 GUI 启动。Calibre 的界面非常直观。第一次启动时,你会看到 **Welcome to Calibre** 的向导。我将默认 “Calibre Library” 更改为 “CalibreLibrary”一个词因为这启动内容服务器时更容易。
在选择完我的 Calibre 内容位置后,我准备好开始下载书了。
![Calibre's interface](https://opensource.com/sites/default/files/u128651/3calibre-interface.png "Calibre's interface")
我从菜单中选择了 **Get Books** 选项,在这很容易输入我的搜索字词,并选择我感兴趣的电子书提供者。我正在寻找[非 DRM][16] 的材料,所以我选择 [Project Gutenberg][17] 作为我的源。Caliber 的免责声明指出,电子书交易是在你和个人内容提供商之间。)我在作者字段中输入 “Mark Twain”并得到10个结果。
![Searching for e-books](https://opensource.com/sites/default/files/u128651/4books.png "Searching for e-books")
我选择了 _Adventures of Huckleberry Finn_ 这本书。在下一页面上,我可以选择 **MOBI****EPUB** 这两种电子书格式。我选择了 EPUB这本书下载得很快。
![Choosing the e-book format](https://opensource.com/sites/default/files/u128651/5ebook-formats.png "Choosing the e-book format")
你也可以从其他内容提供商向库中添加图书,而不是在 Calibre 的列表中添加图书。例如,老师可以通过该内容服务器与学生分享电子书格式的开放教育资源。要加载内容,请使用界面最左侧的 “Add Books” 选项。
根据你图书库的大小,你也许需要增加 microSD 卡的大小。
![start_the_server.png](https://opensource.com/sites/default/files/images/life-uploads/start_the_server.png)
将内容添加到电子书服务器后,即可与网络中的其他人共享内容。通过在终端中输入 `ifconfig` 获取你的树莓派 IP 地址。我正在使用无线网络,所以我在下面的例子中使用了 **wlan0** 中的结果。点击界面的最右侧并展开菜单。然后点击 “Connect and Share” 并启动服务器。
![Identifying the IP address with ipconfig](https://opensource.com/sites/default/files/u128651/6ipconfig.png "Identifying the IP address with ipconfig")
我下一步是通过我的电脑客户端连接到树莓派访问我添加的电子书。我在客户端上打开一个浏览器并输入树莓的地址,后面加上 **:8080** 端口。在我这里是 **http://192.168.1.10:8080** (根据你 Pi 的地址来适配)。
你会在浏览器中看到主页:
![Calibre's client homepage](https://opensource.com/sites/default/files/u128651/7calibre-home.png "Calibre's client homepage")
我已经测试,并能用 iPhone、Linux、MacOS 计算机轻易连接到服务器。
你可以在这个主页总探索选项,或者点击 **All Books** 显示服务器上的所有内容。
![Browsing e-books](https://opensource.com/sites/default/files/u128651/8browsing-books.png "Browsing e-books")
从这里,你可以下载书到你的设备并离线阅读了。
你还没有设置一台电子书服务器么?或者你考虑自己设置一台么?在评论中分享你的建议或者问题。
--------------------------------------------------------------------------------
作者简介:
Don Watkins - 教育家、教育技术专家、企业家、开源倡导者。教育心理学硕士、教育领导硕士、Linux 系统管理员、CCNA、使用 Virtual Box 虚拟化。关注我 @Don_Watkins
-----------------
via: https://opensource.com/article/17/6/raspberrypi-ebook-server
作者:[Don Watkins][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/don-watkins
[1]:https://opensource.com/file/356446
[2]:https://opensource.com/file/356451
[3]:https://opensource.com/file/356456
[4]:https://opensource.com/file/356461
[5]:https://opensource.com/file/356466
[6]:https://opensource.com/file/356471
[7]:https://opensource.com/file/356476
[8]:https://opensource.com/file/356481
[9]:https://opensource.com/article/17/6/raspberrypi-ebook-server?rate=60Tv_hObNU1MQs2f3G6kNoT4qLyxJ03S1q75p2UEOYg
[10]:http://192.168.1.10:8080/
[11]:https://opensource.com/user/15542/feed
[12]:https://the-digital-reader.com/2017/06/19/calibre-3-0-released/
[13]:https://www.raspberrypi.org/downloads/raspbian/
[14]:https://www.raspberrypi.org/forums/viewtopic.php?t=5851
[15]:https://calibre-ebook.com/
[16]:https://en.wikipedia.org/wiki/Digital_rights_management
[17]:https://www.gutenberg.org/
[18]:https://opensource.com/users/don-watkins
[19]:https://opensource.com/article/17/6/raspberrypi-ebook-server#comments

View File

@ -0,0 +1,70 @@
FreeDOS 已经积极开发了 23 年的 DOS
============================================================
> 23 年后FreeDOS 仍在积极开发,并将 MS-DOS 的生命延长了几年
![4 cool facts you should know about FreeDOS ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/wings_freedos_game.jpg?itok=3O_GB-7o "4 cool facts you should know about FreeDOS ")
在 90 年代早期,我是一位 DOS 的 “资深用户”。我用 DOS 做任何事,甚至写我自己的工具来扩展 DOS 命令行。当然,我们有 Microsoft Windows但是如果你还记得当时的计算机Windows 3.1 并不是那么好,我更喜欢在 DOS 中工作。
你可能会理解,在 1994 年,当微软(在科技杂志的采访中)宣布下一个版本的 Windows 将会取消 MS-DOS 时,我感到有些困惑和不安。我想:“如果 Windows 3.2 或 4.0 看起来像 Windows 3.1 一样,我不想用它了。” 我四处选择,并决定如果 DOS 要继续下去的话,那么需要有人创建一个 DOS在 MS-DOS 消失的时候,让每个人都可以使用它。
因此在 1994 年 6 月 29 日,我在 Usenet 讨论组写了一个信息,宣布了新的 “free DOS” 项目:
> 几个月前,我发表了一篇关于启动公共领域版本的 DOS 的文章。当时对此的普遍支持是很强烈的,并且很多人同意这个声明,“开始编写!”
>
> 所以,我要……
>
> 宣布首次尝试制作 PD-DOS。我写了一份描述这样一个项目的目标和工作纲要的“清单”以及一份“任务清单”展示了需要编写些什么。我会在这里发贴让我们进行讨论。
今天,已经是 23 年之后了,[FreeDOS][3] 仍在变得更强大!
我们继续发布有新功能和特性的版本。我们的 FreeDOS 1.2 发布于 2016 年 12 月 25 日,这证明很多人喜欢使用和在 FreeDOS 上工作。当我回顾我们的历史,有一个你应该知道的关于 FreeDOS 的很酷的事实列表:
### 可以立即开始的软件开发
在原始的 DOS 中很难做任何编程。DOS 提供了一个简单的 BASIC 解释器,一些用户可以用 DEBUG 做些精巧的事情,但是你不能在 DOS 中做真正编程的事情。在 FreeDOS 中,有许多不同的工具做软件开发:编译器、汇编器、调试器、解释器和编写脚本。在你安装 FreeDOS 之后,你可以立即用 C、汇编、Pascal、Perl 和几种其他语言编写代码。
### 浏览 web
DOS 是一个老式系统,并且原本不支持开箱即用的网络。通常,你必须安装硬件的设备驱动程序才能连接到网络,一般是像 IPX 这样的简单网络。只有很少的系统会支持 TCP/IP。
在 FreeDOS 中,我们不仅包含了 TCP/IP 网络栈,我们还包含了让你浏览 web 的工具和程序。使用 Dillo 作为图形 web 浏览体验,或则使用 Lynx 以纯文本形式浏览 web。如果你只想要抓取 HTML 代码并自己操作,使用 Wget 或者 Curl。
### 玩很棒的 DOS 游戏
我们知道很多的人安装 FreeDOS 来玩经典的 DOS 游戏,运行古老的商业程序或者做嵌入式开发。使用 FreeDOS 的许多人只是拿来玩游戏那对我们来说是件很酷的事因为一个游戏很老并不意味着它很无趣。DOS 有许多很棒的游戏!安装你最喜欢的经典游戏,你会玩得很开心。
因为有如此多的人使用 FreeDOS 来玩游戏,我们现在包含了不同的 DOS 游戏。FreeDOS 1.2 包含了第一人称射击游戏像 FreeDOOM、街机射击像 Kiloblaster、飞行模拟器像 Vertigo 等等。我们目标是为每人提供一些东西。
### FreeDOS 现在已经比 MS-DOS 活的更久了
微软在 1981 年 8 月发布了 MS-DOS 1.0。13 年之后,微软在 1995 年 8 月发布 Windows 95 后抛弃了 MS-DOS虽然 MS-DOS 直到 2000 年 9 月之前一直存在。总的来说MS-DOS 是一件已经存在了 19 年的东西。
我们在 1994 年 6 月宣布了 FreeDOS并且在同年的 9 月发布了第一个 Alpha 版本。因此 FreeDOS 已经大约有 23 年了,比微软的 MS-DOS 还多了几年。确实我们在 FreeDOS 上努力的时间已经比 MS-DOS 更长了。而 FreeDOS 还将继续保持强大。
FreeDOS 与其他 DOS 另外一个重要的不同是_它仍在开发中_。我们有一个积极的开发者社区并一直在寻找新人来帮助。请加入社区并帮助构造新的 FreeDOS 版本吧。
题图 FreeDOS
--------------------------------------------------------------------------------
作者简介:
Jim Hall - 我是 FreeDOS 项目的创始人和协调者。我还担任 GNOME 基金董事会董事。在工作中,我是明尼苏达州拉姆齐县的首席信息官。在业余时间,我致力于开源软件的可用性,并通过 Outreachy之前针对妇女的 GNOME Outreach 项目)指导 GNOME 中的可用性测试。
--------
via: https://opensource.com/article/17/6/freedos-still-cool-today
作者:[Jim Hall][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/jim-hall
[1]:https://opensource.com/article/17/6/freedos-still-cool-today?rate=_5nJLfJhQp2bzfmjkORKyU-H0g8T3mzl7gPCymnb_y0
[2]:https://opensource.com/user/126046/feed
[3]:https://opensource.com/article/17/6/www.freedos.org
[4]:https://opensource.com/users/jim-hall

View File

@ -1,36 +1,23 @@
安卓编年史
安卓编年史26Android Wear
================================================================================
>让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。
### Android Wear
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/g-watch-150x150.png)
][1]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Untitled-150x150.jpg)
][2]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/home-screen33-640x261-150x150.png)
][3]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/feature-640x212-150x150.png)
][4]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/superlayout2000-150x150.png)
][5]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/darker-150x150.png)
][6]
![The LG G Watch. One of the first Android Wear devices.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/g-watch.png)
2014 年 6 月安卓装备上了新元素:智能手表。谷歌在 2014 的 Google I/O 上发布了“[Android Wear][10]”,意图在你的手腕上装备一台小电脑。为[一块 1.6 英寸的屏幕][11]进行设计意味着需要从头构思整个界面,所以谷歌精简了安卓 4.4 KitKat并创建出了一个小巧的智能手表操作系统。Android Wear 设备不是独立的计算机。它们依赖于运行着配套 Android Wear 应用的安卓智能手机进行连接,认证,以及应用数据获取。
![ The typical Android Wear home screen.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/home-screen33-640x261.png)
Android Wear 智能手表主要是一个通知机器。有了安卓 4.3 及以上版本内建的新 API任何手机收到的通知都能同时显示在手表上——无需任何应用支持。通知操作按钮也带到了手表上让用户可以从手表上与通知进行交互。在手表上清除一条通知会同时在手机上将其清除用户无需拿出另一台设备就可以管理通知消息。每个手表还带有一个语音命令系统和一个麦克风让用户可以抬腕唤醒手表说“OK Google”并发出一条命令。你还可以通过语音回复信息。手表上甚至还有一个装有原生手表应用的应用抽屉。
![Three Android Wear screens, showing music on the home screen, the voice command system, and a Google Now traffic card.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/feature-640x212.png)
主屏幕上显示的自然是时间了,它还允许用户切换无数不同的表盘风格。通知界面采用了卡片风格设计。一个垂直滚动的通知列表会在手表上堆积,包括一些显示天气或交通信息的 Google Now 卡片。向左滑动能够清除一条通知,向右滑动会一次打开一个操作按钮。在主屏幕点击会打开语音命令系统,在哪里你可以激活设置或应用抽屉。除了这些以外最初的 Android Wear 的主屏幕没有多少内容。
2014 年 Android Wear 设备仅仅发售了 720000 部,从那之后我们就没有从软件或硬件上看到多少发展。时至今日,智能手机的销售[一年不如一年][12],甚至在 [Apple Watch][13] 发布后,没人能够真正确定他们想要让小腕上计算机做什么。明显这种情况会持续到 2017 年 Android Wear 2.0 发布。从 Moto 360 给市场带来圆形设备以来,我们还没从硬件厂商那边看到一些新玩意。
![The layout of the OS.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/superlayout2000-980x821.png)
2014 年 Android Wear 设备仅仅发售了 720000 部,从那之后我们就没有从软件或硬件上看到多少发展。时至今日,智能手表的销售[一年不如一年][12],甚至在 [Apple Watch][13] 发布后,没人能够真正确定他们想要让小腕上计算机做什么。明显这种情况会持续到 2017 年 Android Wear 2.0 发布。从 Moto 360 给市场带来圆形设备以来,我们还没从硬件厂商那边看到一些新玩意。
### Android 5.0 Lollipop——有史以来最重要的安卓版本
@ -38,27 +25,21 @@ Android Wear 智能手表主要是一个通知机器。有了安卓 4.3 及以
2014 年 11 月,谷歌发布了 [安卓 5.0 棒棒糖][14]。很多系统更新都被称作“有史以来最大的”,但那些陈词滥调在安卓 5.0 棒棒糖的身上成真了。首先,它改变了安卓发布的方式。谷歌与这个版本的安卓一同开始了“开发者预览”计划,可以以 beta 的形式提前几个月看到新版本。由于版本代号和版本号现在被用作市场营销工具,最终的名称在 beta 期间始终保密,仅以字母指代。在 2014 年的 Google I/O 大会谷歌宣布了“Android L 开发者预览”。
### 延伸阅读
给开发者(以及全世界)四个月的时间接触学习这个版本肯定是有必要的。安卓 L 包含了大范围的变动,它们在系统中都是首次亮相,直到今天还能感受到这些变动。棒棒糖引入了 Material Design 设计理念作为修改安卓每个界面的指南。一个新的运行时环境“ART”它代表着驱动安卓应用引擎的完全革新。谷歌的“OK Google”语音命令系统升级到能在任意界面生效在一些设备上它甚至可以在设备锁定的时候工作。多用户系统从平板来到了手机上。棒棒糖还铺设了 Android for Work 的基础,这是一个关注企业与个人双重应用的特性。
[安卓 5.0 棒棒糖,完全评测][7]
#### Material Design 给了安卓以及谷歌的所有产品一个统一形象
给开发者(以及全世界)四个月的时间接触学习这个版本肯定是有必要的。安卓 L 包含大范围的变动,它们在系统中都是首次亮相,直到今天还能感受到这些变动。棒棒糖引入了 Material Design 设计理念作为修改安卓每个界面的指南。一个新的运行时环境“ART”它代表着驱动安卓应用引擎的完全革新。谷歌的“OK Google”语音命令系统升级到能在任意界面生效在一些设备上它甚至可以在设备锁定的时候工作。多用户系统从平板来到了手机上。棒棒糖还铺设了 Android for Work 的基础,这是一个关注企业与个人双重应用的特性
当 Matias Duarte 踏上 I/O 大会的舞台并宣布 Material Design 时它公布的不仅仅是一个安卓的统一设计蓝图还是谷歌的所有产品以及第三方应用生态的统一设计蓝图。这个想法是安卓、iOS、Chrome OS以及 Web 版的谷歌产品都应该有一致的界面风格、字体以及行为。它们在不需要在不同尺寸的屏幕上有相同的布局Material Design 提供了有一致行为的构建元素,它们能够基于屏幕尺寸自适应布局
#### Material Design 给了安卓以及谷歌的所有产品一个统一
当 Matias Duarte 踏上 I/O 大会的舞台并宣布 Material Design 时他公布的不仅仅是一个安卓的统一设计蓝图还是谷歌的所有产品以及第三方应用生态的统一设计蓝图。这个想法是安卓iOSChrome OS以及 Web 版的谷歌产品都应该有一致的界面风格字体以及行为。它们在不需要在不同尺寸的屏幕上有相同的布局Material Design 提供了有一致行为的构建元素,它们能够基于屏幕尺寸自适应布局。
Duarte 和他的团队在蜂巢中尝试了“电子”风格审美,以及在果冻豆中的“卡片”主题风格,但 Material Design 最终代表了被选中的设计系统应用到谷歌的所有产品线。Material Design 已经超出了一个用户界面设计指南的概念,成为了谷歌作为一个公司的一致性代表。
Duarte 和他的团队在蜂巢中尝试了“电子”风格审美,以及在果冻豆中的“卡片”主题风格,但 Material Design 最终成了被选中的设计系统应用到谷歌的所有产品线。Material Design 已经超出了一个用户界面设计指南的概念,成为了谷歌作为一个公司的一致性代表。
Material Design 主要的比喻是“纸和墨”。所有的用户界面是“纸”的片层,漂浮于最底端平面之上。阴影用来提供界面的层次结构——用户界面的每个层在 Z 轴上拥有一个位置,并在其之下的元素上投射一个阴影。这是在安卓 4.1 的 Google Now 中使用的“卡片”风格更清晰的进化版本。“墨”是用来指代谷歌推荐开发者在界面的重要项目上使用的泼色。这个概念也引用了真实世界的物体概念,与 Windows 8 和 iOS 7 带来的反拟物化“不惜一切代价扁平化”的趋势相违。
动画也是一个重点,思想是任何东西都不应该“弹出”到屏幕上。组件应该滑进,缩小,或放大。“纸”表面和真实世界中的纸还有点不同,们可以缩小,扩展,合并以及增大。为了让动画系统协同图像资源工作,阴影不像之前版本中那样整合进用户界面组件——实际上谷歌创造了一个实时的 3D 阴影系统,这样阴影就能够在这些动画和转换中正确渲染。
动画也是一个重点,思想是任何东西都不应该“弹出”到屏幕上。组件应该滑进,缩小,或放大。“纸”表面和真实世界中的纸还有点不同,它们可以缩小,扩展,合并以及增大。为了让动画系统协同图像资源工作,阴影不像之前版本中那样整合进用户界面组件——实际上谷歌创造了一个实时的 3D 阴影系统,这样阴影就能够在这些动画和转换中正确渲染。
![棒棒糖的层状界面和阴影的夸张侧视图。](https://cdn.arstechnica.net/wp-content/uploads/2014/07/2014-07-10_21-56-05.jpg)
<figcaption class="caption" style="box-sizing: inherit; position: relative; margin-top: -6px;">棒棒糖的层状界面和阴影的夸张侧视图。[Google I/O 2014 - Material design principles][8]</figcaption>
为了将 Material Design 带到谷歌的其它地方以及应用生态系统,谷歌创建并持续维护着[一个统一的设计指南][15],描述了一切设计的规范。那里有应该与不应该做的,基线,基线网格,色板,库存图解,字体,库,布局建议以及更多内容。谷歌甚至开始定期举办[针对设计的会议][16],来听取设计者的声音以及给他们教学,还成立了[Material Design 奖项][17]。在发布 Material Design 后不久Duarte 离开了安卓团队并成为了谷歌的 Material Design 总监,创建了一个完全专注于设计的部门。
为了将 Material Design 带到谷歌的其它地方以及应用生态系统,谷歌创建并持续维护着[一个统一的设计指南][15],描述了一切设计的规范。那里有应该与不应该做的,基线、基线网格、色板、堆叠图解、字体、库、布局建议以及更多内容。谷歌甚至开始定期举办[针对设计的会议][16],来听取设计者的声音以及给他们教学,还成立了 [Material Design 奖项][17]。在发布 Material Design 后不久Duarte 离开了安卓团队并成为了谷歌的 Material Design 总监,创建了一个完全专注于设计的部门。
--------------------------------------------------------------------------------
@ -66,7 +47,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor
作者:[RON AMADEO][a]
译者:[alim0x](https://github.com/alim0x)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,11 +1,9 @@
安卓编年史
安卓编年史28Android 5.0 Lollipop——有史以来最重要的安卓版本2
================================================================================
>让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。
#### ART——为未来提供了一个平台的安卓运行时
安卓里没有多少组件的血统能追溯到 1.0 时代,但在 2014 年 Dalvik 这个驱动安卓应用的运行时是它们中的一员。Dalvik 最初是为单核低端性能设备设计的,而且存储和内存占用的优先级要高于性能表现。在过去的几年里,谷歌给 Dalvik 扩充了越来越多的更新,比如 JIT 支持并发垃圾回收,以及多进程支持。但是随着多核手机的出现,它们比 T-Mobile G1 快上很多倍,而这些功能升级扩充只能帮安卓到这里了。
安卓里没有多少组件的血统能追溯到 1.0 时代,但在 2014 年 Dalvik 这个驱动安卓应用的运行时是它们中的一员。Dalvik 最初是为单核低端性能设备设计的,而且存储和内存占用的优先级要高于性能表现。在过去的几年里,谷歌给 Dalvik 扩充了越来越多的更新,比如 JIT 支持并发垃圾回收,以及多进程支持。但是随着多核手机的出现,它们比 T-Mobile G1 快上很多倍,而这些功能升级扩充只能帮安卓到这里了。
解决方案就是用 ART 这个安卓运行时替换 Dalvik这是一个完全为现代智能手机硬件重写的应用引擎。ART 更强调性能表现和用户界面流畅度。ART 带来了一个从 JITJust-in-time即时编译到 AOTAhead-of-time提前编译的转变。JIT 会在每次应用运行的时候即时编译,节省存储空间,因为编译后的代码从不写入存储,但它消耗更多的 CPU 和内存资源。AOT 会将编译后的代码保存到存储让应用启动的时候更快并减少内存使用。ART 会在设备上将编译代码作为安装的一部分进行而不分发预编译的代码这样编译器可以进行一些针对特定设备的优化。ART 还带来了 64 位支持,扩大了内存寻址范围,由 64 位指令集带来更佳的性能表现(特别是在媒体和加密应用上)。
@ -14,74 +12,52 @@
#### 一个系统层级的界面刷新
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/systemui150-1-150x150.jpg)
][1]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/lock-1-150x150.jpg)
][2]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent-apps-150x150.jpg)
][3]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent2-150x150.jpg)
][4]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/notification-1-150x150.jpg)
][5]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/headsup-1-150x150.jpg)
][6]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/panels-150x150.jpg)
][7]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/noticontrols-150x150.jpg)
][8]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/systemui150-1-150x150.jpg)
Material Design 带来了一个几乎对安卓所有界面的完全翻新。首先,整个核心系统界面改变了。安卓得到了一个全新的按钮集合,看起来有点像是 PlayStation 的手柄:三角形,圆形以及正方形按钮,分别代表后退,主屏幕,和最近应用。得益于全新的图标集,状态栏也是焕然一新。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/lock-1-150x150.jpg)
最近应用获得了大翻新。从一个小略缩图纵向列表变成了一个巨大的几乎全屏的略缩图串联列表。它还获得了一个新名字也没那么守旧“概览Overview”。这明显是受到了前面版本的 Chrome 标签页切换器效果的启发。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent-apps-150x150.jpg)
顺带一说,在这个安卓版本里 Chrome 的标签页切换器效果消失了。作为一种将 Web 应用与本地应用同等对待的尝试Chrome 标签合并到了概览列表。是的:最近“应用”列表现在显示的是最近打开的应用,加上最近打开的网站。在棒棒糖中,最近应用列表还采取了一种“以文档为中心”的方法,意味着应用可以在最近应用列表中显示多个项目。比如你在 Google Docs 中打开了两个文档,它们都会显示在最近应用中,让你可以在它们之间轻松切换,而不用到应用的文件列表去来回切换。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent2-150x150.jpg)
通知面板是全新的。谷歌给通知面板带来了“卡片”主题,将每个项目归整到它自己的矩形中。单个通知条目从黑色背景变成了白色背景,有了更佳的排版和圆形图标。这些新通知来到了锁屏上,将它从一个最没用的中间屏变成了很有用的屏幕,用于展示“这里是你不在的时候发生的事情”。
全屏的通知,比如来电以及闹钟,都被抛弃了,取而代之的是在屏幕顶部弹出一个“抬头”通知。抬头通知也对“高优先级”应用可用,最初这是为即时消息设计的。但是否是高优先级的通知这取决于开发者的决定,在开发者意识到这可以让他们的通知更显眼之后,所有人都开始使用它。之后版本的安卓通过给用户提供“高优先级”的设置解决了这个问题。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/notification-1-150x150.jpg)
全屏的通知比如来电以及闹钟都被抛弃了取而代之的是在屏幕顶部弹出一个“抬头HUD”通知。抬头通知也对“高优先级”应用可用最初这是为即时消息设计的。但是否是高优先级的通知这取决于开发者的决定在开发者意识到这可以让他们的通知更显眼之后所有人都开始使用它。之后版本的安卓通过给用户提供“高优先级”的设置解决了这个问题。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/headsup-1-150x150.jpg)
谷歌还给棒棒糖添加了一个单独的,但很相似的“优先”通知系统。“优先”通知是一个介于完全静音和“提醒一切消息”之间的模式,允许用户将特定的联系人和应用标记为重要。优先模式只会为这些重要的人发出提醒。在界面上来看,它采用了音量控制附加通知优先级控制以及设置中心添加一项优先通知新设置的形式。当你处在优先模式的时候,状态栏会有一颗星形标识。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/panels-150x150.jpg)
快速设置获得了一系列的大改善。控制项现在是一块在通知_上面_的面板所以它可以通过“两次下拉”手势来打开它。第一次下拉会打开通知面板第二次下拉手势会缩小通知面板并打开快速设置。快速设置的布局变了抛弃了平铺排列转为一个单独面板上的一系列浮动按钮。顶部是十分方便的亮度调节条之后是连接自动旋转手电筒GPS以及 Chromecast 的按钮。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/noticontrols-150x150.jpg)
快速设置现在还有了实际的内嵌面板。它可以在主界面显示无线网络接入点,蓝牙设备,以及移动数据使用量。
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/4-150x150.jpg)
][9]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/gmail2-150x150.jpg)
][10]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/fit-150x150.jpg)
][11]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/messages-1-150x150.jpg)
][12]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/googl1-150x150.jpg)
][13]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-150x150.jpg)
][14]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/reminers-150x150.png)
][15]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/4-150x150.jpg)
Material Design 革新给了几乎每个应用一个新图标并带来了一个更明亮白色背景的应用抽屉。默认应用阵容也有了很大的变化。和这些新应用问声好吧通讯录谷歌文档Fit信息照片Play 报亭以及谷歌幻灯片。和这些死去的应用说再见吧相册G+ 照片PeoplePlay 杂志,电子邮件,以及 Quickoffice。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/gmail2-150x150.jpg)
这些新应用中很多来自 Google Drive从一个单独的大应用分割成每个产品一个应用。现在我们有了云端硬盘文档表格以及幻灯片都来自于云端硬盘团队。云端硬盘同时也要对 Quickoffice 的死亡负责云端硬盘团队令它元气大伤。在“谷歌从来没法做好决定”分类下通讯录从“People”改回了“Contacts”短信应用在运营商的要求下叫回了“Messenger”。那些运营商_不_喜欢谷歌环聊插手短信的职能。我们有项真正的新服务谷歌健身一个健康追踪应用可以在安卓手机和安卓手表上工作。Play 杂志也有了新的设计添加了网站内容所以它改名叫“Play 报亭”。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/fit-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/messages-1-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/googl1-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/reminers-150x150.png)
还有更多的谷歌专有应用接管 AOSP 的例子。
* “G+ 照片”变成了“谷歌照片”,并取代了 AOSP 的相册成为默认照片应用,而相册也就随之消亡了。改名成“谷歌照片”是为照片应用[退出 Google+][16]并成为独立服务做准备。谷歌照片的发布在棒棒糖发布之后六个月——暂时应用只像是 Google+ 应用换了个图标和界面设计。
@ -94,7 +70,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor
作者:[RON AMADEO][a]
译者:[alim0x](https://github.com/alim0x)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,3 +1,4 @@
translating by XYenChi
A 5-step plan to encourage your team to make changes on your project
============================================================

View File

@ -1,64 +0,0 @@
Free as in puppy: The hidden costs of free software
============================================================
![Free as in puppy: The hidden costs of free software](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_whitehurst_money.png?itok=Xqow4bzq "Free as in puppy: The hidden costs of free software")
Image by : opensource.com
We're used to hearing of software being described as "free as in freedom" and "free as in beer." But there's another kind of "free" that doesn't get talked about as much: "free as in puppy." This concept is based around the idea that when someone gives you a free puppy, that puppy isn't really free. There's a lot of work and expenses that go into its daily care. The business term is "total cost of ownership," or TCO, and it applies to anything, not just open source software and puppies.
So if the free puppy problem applies to everything, how is it important to open source software specifically? There are a few ways. First, if you're already paying for software, then you've set the expectation that it has costs. Software that's free up front but costs money later seems like a major imposition. Secondly, if it happens on an organization's first open source adoption project, it can put the organization off of adopting open source software in the future. Lastly and counterintuitively, showing that open source software has a cost may make it an easier "sell." If it's truly no cost, it seems too good to be true.
The following sections represent common areas for software costs to sneak in. This is by no means a comprehensive list.
### Setup costs
To begin using software, you must first have the software.
* **Software:** Just because it's open source doesn't necessarily mean it's _gratis_.
* **Hardware:** Consider the requirements of the software. If you don't have the hardware that (this could be server hardware or client hardware) you need to use the software, you'll need to buy it.
* **Training:** Software is rarely completely intuitive. The choice is to get training or figure it out on your own.
* **Implementation** Getting all of the pieces in the same room is only the start. Now, it's time to put the puzzle together.
* **Installation and configuration:** At a minimum this will take some staff time. If it's a big project, you may need to pay a systems integrator or some other vendor to do this.
* **Data import:** If you're replacing an existing system, there is data to move into a new home. In a happy world where everything complies with the same standard, this is not a problem. In many cases, though, it may be necessary to write some scripts to extract and reload data.
* **Interfaces with other systems:** Speaking of writing scripts, does this software tie in nicely with other software you use (for example, your directory service or your payroll software)?
* **Customization:** If the software doesn't meet all of your needs out of the box, it may need to be customized. You can do that, but it still requires effort and maybe some materials.
* **Business changes:** This new software will probably change how your organization does something—hopefully for the better. However, the shift isn't free. For example, productivity may dip initially as staff get used to the new software.
### Operational costs
Getting the software installed is the easy part. Now you have to use it.
* **More training:** What, did you think we were done with this? Over time, new people will probably join your organization and they will also need to learn how to use the software, or a new release will come out that adds additional functionality.
* **Maintenance:**
* **Subscription:** Some software provides updates via a paid subscription.
* **Patches:** Depending on the nature of the software, there may be some effort in applying patches. This includes both testing and deployment.
* **Development:** Did you make any customizations yourself? Now you have to maintain those forever.
* **Support:** Someone has to fix it when it goes wrong, and whether that's a vendor or your own team, there's a real cost.
* **Good citizenship:** This one isn't a requirement, but if you're using open source software, it would be nice if you gave back somehow. This might be code contributions, providing support on the mailing list, sponsoring the annual conference, etc.
* **Business benefits:** Okay, so this isn't a cost, but it can offset some of the costs. What does using this software mean for your organization? If it enables you to manufacture widgets with 25% less waste, then that's valuable. To provide another example, maybe it helps you increase repeat contributions to your nonprofit by 30%.
Even with a list like this, it takes a lot of imagination to come up with all of the costs. Getting the values right requires some experience and a lot of good guessing, but just going through the process helps make it more clear. Much like with a puppy, if you know what you're getting yourself into up front, it can be a rewarding experience.
--------------------------------------------------------------------------------
作者简介:
Ben Cotton - Ben Cotton is a meteorologist by training and a high-performance computing engineer by trade. Ben works as a technical evangelist at Cycle Computing. He is a Fedora user and contributor, co-founded a local open source meetup group, and is a member of the Open Source Initiative and a supporter of Software Freedom Conservancy. Find him on Twitter (@FunnelFiasco)
--------------------------------------------------------------------------------
via: https://opensource.com/article/17/2/hidden-costs-free-software
作者:[Ben Cotton ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/bcotton
[1]:https://opensource.com/article/17/2/hidden-costs-free-software?rate=gXfsYPWiIQNslwJ3zOAje71pTMRhp25Eo0HTdLWOKv4
[2]:https://opensource.com/user/30131/feed
[3]:https://opensource.com/article/17/2/hidden-costs-free-software#comments
[4]:https://opensource.com/users/bcotton

View File

@ -1,3 +1,5 @@
translating----geekpi
Talk of tech innovation is bullsh*t. Shut up and get the work done says Linus Torvalds
============================================================

View File

@ -1,3 +1,5 @@
Translating by windcode
# Why DevOps is the end of security as we know it
![](https://techbeacon.com/sites/default/files/styles/article_hero_image/public/field/image/rugged-devops-end-of-security.jpg?itok=Gp1xxSMK)

View File

@ -1,133 +0,0 @@
=====================================
翻译中 WangYueScream
======================================
How to get started learning to program
============================================================
### Ever wondered, "How can I learn to program?" We provide guidance to help you find the approach that best suits your needs and situation.
![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself")
>Image by : Artist unknown. Public domain, [via Wikimedia Commons][20]. Modified by Opensource.com.
There's a lot of buzz lately about learning to program. Not only is there a [shortage of people][21] compared with the open and pending positions in software development, programming is also a career with one of the [highest salaries][22] and [highest job satisfaction rates][23]. No wonder so many people are looking to break into the industry!
But how, exactly, do you do that? "**How can I learn to program?**" is a common question. Although I don't have all the answers, hopefully this article will provide guidance to help you find the approach that best suits your needs and situation.
### What's your learning style?
Before you start your learning process, consider not only your options, but also yourself. The ancient Greeks had a saying, [γνῶθι σεαυτόν][24] (gnothi seauton), meaning "know thyself". Undertaking a large learning program is difficult. Self awareness is necessary to make sure you are making the choices that will lead to the highest chance of success. Be honest with yourself when you answer the following questions:
* **What is your preferred learning style?** How do you learn best? Is it by reading? Hearing a lecture? Mostly hands-on experimentation? Choose the style that is most effective for you. Don't choose a style because it's popular or because someone else said it worked for them.
* **What are your needs and requirements?** Why are you looking into learning how to program? Is it because you wish to change jobs? If so, how quickly do you need to do that? Keep in mind, these are  _needs_ , not  _wants_ . You may  _want_  a new job next week, but  _need_  one within a year to help support your growing family. This sort of timing will matter when selecting a path.
* **What are your available resources?** Sure, going back to college and earning a computer science degree might be nice, but you must be realistic with yourself. Your life must accommodate your learning. Can you afford—both in time and money—to set aside several months to participate in a bootcamp? Do you even live in an area that provides learning opportunities, such as meetups or college courses? The resources available to you will have a large impact on how you proceed in your learning. Research these before diving in.
### Picking a language
As you start your path and consider your options, remember that despite what many will say, the choice of which programming language you use to start learning simply does  _not_  matter. Yes, some languages are more popular than others. For instance, right now JavaScript, Java, PHP, and Python are among the [most popular languages][25] according to one study. But what is popular today may be passé next year, so don't get too hung up on choice of language. The underlying principles of methods, classes, functions, conditionals, control flow, and other programming concepts will remain more or less the same regardless of the language you use. Only the grammar and community best practices will change. Therefore you can learn to program just as well in [Perl][26] as you can in [Swift][27] or [Rust][28]. As a programmer, you will work with and in many different languages over the course of your career. Don't feel you're "stuck" with the first one you learn.
### Test the waters
Unless you already have dabbled a bit and know for sure that programming is something you'd like to spend the rest of your life doing, I advise you to dip a toe into the waters before diving in headfirst. This work is not for everyone. Before going all-in on a learning program, take a little time to try out one of the smaller, cheaper options to get a sense of whether you'll enjoy the work enough to spend 40 hours a week doing it. If you don't enjoy this work, it's unlikely you'll even finish the program. If you do finish your learning program despite that, you may be miserable in your subsequent job. Life is too short to spend a third of it doing something you don't enjoy.
Thankfully, there is a lot more to software development than simply programming. It's incredibly helpful to be familiar with programming concepts and to understand how software comes together, but you don't need to be a programmer to get a well-paying job in software development. Additional vital roles in the process are technical writer, project manager, product manager, quality assurance, designer, user experience, ops/sysadmin, and data scientist, among others. Many different roles and people are required to launch software successfully. Don't feel that learning to program requires you to become a programmer. Explore your options and choose what's best for you.
### Learning resources
What are your options for learning resources? As you've probably already discovered, those options are many and varied, although not all of them may be available in your area.
* **Bootcamps**: Bootcamps such as [App Academy][5] and [Bloc][6] have become popular in recent years. Often charging a fee of $10K USD or more, bootcamps advertise that they can train a student to become an employable programmer in a matter of weeks. Before enrolling in a coding bootcamp, research the program to make sure it delivers on its promises and is able to place its students in well-paying, long-term positions after graduation. The money is one cost, whereas the time is another—these typically are full-time programs that require the student to set aside any other obligations for several weeks in a row. These two costs often put bootcamps outside the budget of many prospective programmers.
* **Community college/vocational training center**: Community colleges often are overlooked by people investigating their options for learning to program, and that's a shame. The education you can receive at a community college or vocational training center can be as effective as other options, at a fraction of the cost.
* **State/local training programs**: Many regions recognize the economic benefits of boosting technology investments in their area and have developed training programs to create well-educated and -prepared workforces. Training program examples include [Code Oregon][7] and [Minneapolis TechHire][8]. Check to see whether your state, province, or municipality offers such a program.
* **Online training**: Many companies and organizations offer online technology training programs. Some, such as [Linux Foundation][9], are dedicated to training people to be successful with open source technologies. Others, like [O'Reilly Media][10], [Lynda.com][11], and [Coursera][12] provide training in many aspects of software development. [Codecademy][13] provides an online introduction to programming concepts. The costs of each program will vary, but most of them will allow you to learn on your schedule.
* **MOOCs**: MOOCs—Massive Open Online Courses—have really picked up steam in the past few years. World-class universities, such as [Harvard][14], [Stanford][15], [MIT][16], and others have been recording their courses and making them available online for free. The self-directed nature of the courses may not be a good fit for everyone, but the material available makes this a valuable learning option.
* **Books**: Many people love self-directed learning using books. It's quite economical and provides ready reference material after the initial learning phase. Although you can order and access books through online services like [Safari][17] and [Amazon][18], don't forget to check your local public library as well.
### Support network
Whichever learning resources you choose, the process will be more successful with a support network. Sharing your experiences and challenges with others can help keep you motivated, while providing a safe place to ask questions that you might not feel confident enough to ask elsewhere yet. Many towns have local user groups that gather to discuss and learn about software technologies. Often you can find these listed at [Meetup.com][29]. Special interest groups, such as [Women Who Code][30] and [Code2040][31], frequently hold meetings and hackathons in most urban areas and are a great way to meet and build a support network while you're learning. Some software conferences host "hack days" where you can meet experienced software developers and get help with concepts on which you're stuck. For instance, every year [PyCon][32] features several days of the conference for people to gather and work together. Some projects, such as [BeeWare][33], use these sprint days to assist new programmers to learn and contribute to the project.
Your support network doesn't have to come from a formal meetup. A small study group can be as effective at keeping you motivated to stay with your learning program and can be as easy to form as posting an invitation on your favorite social network. This is particularly useful if you live in an area that doesn't currently have a large community of software developers to support several meetups and user groups.
### Steps for getting started
In summary, to give yourself the best chance of success should you decide to learn to program, follow these steps:
1. Gather your list of requirements/needs and resources
2. Research the options available to you in your area
3. Discard the options that do not meet your requirements and resources
4. Select the option(s) that best suit your requirements, resources, and learning style
5. Find a support network
Remember, though: Your learning process will never be complete. The software industry moves quickly, with new technologies and advances popping up nearly every day. Once you learn to program, you must commit to spending time to learn about these new advances. You cannot rely on your job to provide you this training. Only you are responsible for your own career development, so if you wish to stay up-to-date and employable, you must stay abreast of the latest technologies in the industry.
Good luck!
--------------------------------------------------------------------------------
作者简介:
VM (Vicky) Brasseur - VM (aka Vicky) is a manager of technical people, projects, processes, products and p^Hbusinesses. In her more than 18 years in the tech industry she has been an analyst, programmer, product manager, software engineering manager, and director of software engineering. Currently she is a Senior Engineering Manager in service of an upstream open source development team at Hewlett Packard Enterprise. VM blogs at anonymoushash.vmbrasseur.com and tweets at @vmbrasseur.
--------
via: https://opensource.com/article/17/4/how-get-started-learning-program
作者:[VM (Vicky) Brasseur ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/vmbrasseur
[1]:https://opensource.com/tags/python?src=programming_resource_menu
[2]:https://opensource.com/tags/javascript?src=programming_resource_menu
[3]:https://opensource.com/tags/perl?src=programming_resource_menu
[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu
[5]:https://www.appacademy.io/
[6]:https://www.bloc.io/
[7]:http://codeoregon.org/
[8]:http://www.minneapolismn.gov/cped/metp/TechHire#start
[9]:https://training.linuxfoundation.org/
[10]:http://shop.oreilly.com/category/learning-path.do
[11]:https://www.lynda.com/
[12]:https://www.coursera.org/
[13]:https://www.codecademy.com/
[14]:https://www.edx.org/school/harvardx
[15]:http://online.stanford.edu/courses
[16]:https://ocw.mit.edu/index.htm
[17]:https://www.safaribooksonline.com/
[18]:https://amazon.com/
[19]:https://opensource.com/article/17/4/how-get-started-learning-program?rate=txl_aE6F2oOUSgQDveWFtrPWIbA1ULFwfOp017zV35M
[20]:https://commons.wikimedia.org/wiki/File:Roman-mosaic-know-thyself.jpg
[21]:http://www.techrepublic.com/article/report-40-of-employers-worldwide-face-talent-shortages-driven-by-it/
[22]:http://web.archive.org/web/20170328065655/http://www.businessinsider.com/highest-paying-jobs-in-america-2017-3/#-25
[23]:https://stackoverflow.com/insights/survey/2017/#career-satisfaction
[24]:https://en.wikipedia.org/wiki/Know_thyself
[25]:https://stackoverflow.com/insights/survey/2017/#most-popular-technologies
[26]:https://learn.perl.org/tutorials/
[27]:http://shop.oreilly.com/product/0636920045946.do
[28]:https://doc.rust-lang.org/book/
[29]:https://www.meetup.com/
[30]:https://www.womenwhocode.com/
[31]:http://www.code2040.org/
[32]:https://us.pycon.org/
[33]:http://pybee.org/
[34]:https://opensource.com/user/10683/feed
[35]:https://opensource.com/article/17/4/how-get-started-learning-program#comments
[36]:https://opensource.com/users/vmbrasseur

View File

@ -1,37 +0,0 @@
# Do you have what it takes to be a software developer?
![](https://www.linuxcareer.com/images/software_developer_skills.jpg)
The application space is the place to be. A lot of work has been done in the low-level Linux arena, and it continues, but the growth over the last few years has been in the application space. With that being the case, which language are developers utilizing to build these apps? In short, it depends, which I know does not come as a huge surprise. But, with the data that we have, we are able to determine which languages are leading the way. 
The language that finds itself on the top of the mountain is Java. Being around open source software for over 15 years, this was not always the case. Early on, we did not see a lot of interest in Java developers, but boy has that changed. It is the definitive leader in the application space currently. While the numbers have not grown in the last six quarters, the sheer overall number is impressive. On average, companies are asking for Java skills in over 1 in 3 job postings focused on FLOSS. Quite a feat for a language that did not register on the radar years ago. And, based on its heavy use with Android, it would not be a surprise to see this number increase in the future. 
Another language that is used prominently in the application space is C++. While its numbers can't quite compete with that of Java, it still commands a large marketshare in this arena. Whereas Java is asked for in 1 of 3 postings, C++ is required in 1 of 4\. Much like that of Java, its numbers have remained relatively stable over the last six quarters. C++ has always been heavily utilized, and even though Java has superseded it, it remains a highly relevant language.
Moving toward the web application space, there has been a changing of the guard over the years. Early on, the clear choice was to develop most web applications utilizing PHP. As was discussed in the previous article on scripting, this has changed over the years. There appears to have been some deterioration in the usage of PHP in the last couple of years. In the last year and a half alone, there has been a precipitous decline of over 30%. That is an alarming number, and only time will tell if the trend continues. 
Claiming some of PHP's thunder initially was that of Ruby on Rails. For a number of years, I watched companies and developers make that transition. Ruby on Rails went through a period of time where it was “the” language of choice in this space. However, from the numbers we have gathered, it appears that its luster has lost a little of its edge. While it is not experiencing any kind of decline like that of PHP, its numbers have been remained relatively flat, so the growth that it once experienced appears to have stagnated.
The king of the hill, at the moment, in the web application space appears to be Javascript. It garners the largest overall numbers. While its numbers have remained flat, much like Ruby on Rails, it has amassed a larger audience. On average over the last six quarters, companies are requiring Javascript skills in 1,500 of the 10,000 job listings analyzed. That is nearly 70% more than either PHP or Ruby on Rails. 
With PHP in decline and Ruby on Rails and Javascript stagnate, is anyone in the web application space growing? The outlier in this group seems to be Golang. Created by a couple of developers inside Google in 2007, it appears that this language is starting to gain a wider audience. While the overall numbers pale in comparison to the other three discussed, it has seen a 50% increase in the last year and a half. It will be very interesting to watch if this trend continues. In my opinion, I expect that we will continue to see gains in Golang at the expense of the other three.
As always, we will monitor each of these languages moving forward to watch trends in the marketplace. And, a keen eye will be kept on any new entrants that enter the radar. It is an exciting and dynamic area of development; one that will provide results that are ever-changing over time.
--------------------------------------------------------------------------------
via: https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer
作者:[Brent Marinaccio ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer
[1]:https://www.linuxcareer.com/skills-watch
[2]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer#

View File

@ -1,3 +1,5 @@
Translating by sanfusu
Network automation with Ansible
================

View File

@ -1,203 +0,0 @@
translating by xiaow6
# Go Serverless with Apex and Compose's MongoDB
_Apex is tooling that wraps the development and deployment experience for AWS Lambda functions. It provides a local command line tool which can create security contexts, deploy functions, and even tail cloud logs. While AWS's Lambda service treats each function as an independent unit, Apex provides a framework which treats a set of functions as a project. Plus, it even extends the service to languages beyond just Java, Javascript, and Python such as Go._
Two years ago the creator of Express, the almost de facto web framework for NodeJS, said [goodbye][12] to the Node community and turned his attention to Go, the backend services language from Google, and Lambdas, the Functions as a Service offering from AWS. While one developer's actions don't make a trend, it is interesting to look at the project he has been working on named [Apex][13] because it may portend some changes in how a good portion of the web will be delivered in the future.
##### What is a Lambda?
Currently, if one doesn't run their own hardware they pay to run some kind of virtual server in the cloud. On it they deploy a complete stack such as Node, Express, and a custom application. Or if they have gone further with something like a Heroku or Bluemix, then they deploy their full application to some preconfigured container that already has Node setup and they just deploy the application's code.
The next step up the abstraction ladder is to deploy just the functions themselves to the cloud without even a full application. These functions can then be triggered by a variety of external events. For example, AWS's API Gateway service can proxy HTTP requests as events to these functions and the Function as a Service provider will execute the mapped function on demand.
###### Getting Started with Apex
Apex is a command line tool which wraps the AWS CLI (Command Line Interface). So, the first step to getting started with Apex is to ensure that you have the command line tools from AWS installed and configured (see [AWS CLI Getting Started][14] or [Apex documentation][15]).
Next install Apex:
`curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh`
Then create a directory for your new project and run:
`apex init`
![apexInit](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620758/nzjk1pi1rce1yarbp6xl.png)
This sets up some of the necessary security policies and even appends the project name to the functions since the Lambda namespace is flat. It also creates some config and the functions directory with a default "Hello World" style function in Javascript.
![tree](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620765/bbsb8h6nkc9nx2qs0foa.png)
One of the nice things about Apex/Lambdas is that creating a function is really straightforward. Create a new directory with the name of your function and then in that create the program. To use Go, you could create a directory named `simpleGo` then in that create a small `main` program:
![tree2](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620769/lthziblpv8iod2muyqwn.png)
```
// serverless/functions/simpleGo/main.go
package main
import (
"encoding/json"
"github.com/apex/go-apex"
"log"
)
type helloEvent struct {
Hello string `json:"hello"`
}
func main() {
apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
var h helloEvent
if err := json.Unmarshal(event, &h); err != nil {
return nil, err
}
log.Print("event.hello:", h.Hello)
return h, nil
})
}
```
Apex uses a NodeJS shim, since Node is a supported runtime of Lambda, to call the binary which is created from the above program. It passes the `event` into the binary's STDIN and takes the `value` returned from the binary's STDOUT. It logs via STDERR. The `apex.HandleFunc` manages all of the piping for you. Really it is a very simple solution in the Unix tradition. You can even test it from the command line locally with a `go run main.go`:
![goRun](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620784/ddb0vkcef50pnjgfdqn7.png)
Deploying to the cloud is trivial with Apex:
![apexDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620790/x6l8qg2vticpxhzi7kl3.png)
Notice that it namespaced your function, managed versioning, and even had a place for some `env` things which we could have used for multiple development environments like `staging` and `production`.
Executing on the cloud is trivial too with `apex invoke`:
![apexInvoke](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620796/jccxskukvy5utgegy2hr.png)
And we can even tail some logs:
![apexLog](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620802/ym3z6w8ojmrq7pucr5bp.png)
Those are results from AWS CloudWatch. They are available in the AWS UI but when developing it is much faster to follow them like this in another terminal.
##### What's Inside?
It is instructive to see inside the artifact that is actually deployed. Apex packages up the shim and everything needed for the function to run. Plus, it goes ahead and configures things like the entry point and security roles:
![lambdaConfig](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620812/zz6qwocvuhhl4lq6bf4p.png)
The Lambda service actually accepts a zip archive with all of the dependencies which it deploys to the servers that execute the function. We can use `apex build <functionName>` to create an archive locally which we can then unzip to explore:
![apexBuild](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620818/ybidaj2i2ijurjbcqrx2.png)
The `_apex_index.js handle` function is the original entry point. It sets up some environment variables and then calls into `index.js`. 
The `index.js` spawns a child process of the `main` Go binary and wires everything together.
##### Go Further with `mgo`
The Golang driver for MongoDB is called `mgo`. Using Apex to create a function that connects to Compose's MongoDB is almost as straightforward as the `simpleGo`function which we have been reviewing. Here we'll create a new function by adding a directory called `mgoGo` and creating another `main.go`:
```
// serverless/functions/mgoGo/main.go
package main
import (
"crypto/tls"
"encoding/json"
"github.com/apex/go-apex"
"gopkg.in/mgo.v2"
"log"
"net"
)
type person struct {
Name string `json:"name"`
Email string `json:"email"`
}
func main() {
apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
tlsConfig := &tls.Config{}
tlsConfig.InsecureSkipVerify = true
//connect URL:
// "mongodb://<username>:<password>@<hostname>:<port>,<hostname>:<port>/<db-name>
dialInfo, err := mgo.ParseURL("mongodb://apex:mountain@aws-us-west-2-portal.0.dblayer.com:15188, aws-us-west-2-portal.1.dblayer.com:15188/signups")
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
return conn, err
}
session, err := mgo.DialWithInfo(dialInfo)
if err != nil {
log.Fatal("uh oh. bad Dial.")
panic(err)
}
defer session.Close()
log.Print("Connected!")
var p person
if err := json.Unmarshal(event, &p); err != nil {
log.Fatal(err)
}
c := session.DB("signups").C("people")
err = c.Insert(&p)
if err != nil {
log.Fatal(err)
}
log.Print("Created: ", p.Name," - ", p.Email)
return p, nil
})
}
```
Post deploy. We can invoke with the correct kind of event to mimic calling an API:
![apexMgo](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620829/jeprb3r6qrgjkzblkhho.png)
The net result is to `insert` into [MongoDB on Compose][16]:
![composeDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620833/vdy8hjiwxpe02evgqwcm.png)
##### So Much More...
While we have covered a lot of ground so far with Apex there are many more things to explore. There is integration with [Terraform][17]. You could deliver a polyglot language project with Javascript, Java, Python and Go if you so desired. You could configure multiple environments for things like development, staging, and production. You could tweak the runtime resources by sizing memory and timeouts which effects pricing. And you could hook functions up to the API Gateway to deliver an HTTP API or use something like SNS (Simple Notification Service) to build pipelines of functions in the cloud.
Like most things, Apex and Lambdas aren't perfect for every scenario. Functions with high IO waits defeat the purpose of paying for compute time. But, adding a tool to your toolbox that requires no infrastructure management on your part at all makes good sense.
--------------------------------------------------------------------------------
作者简介:
Hays Hutton writes code and then writes about it. Love this article? Head over to [Hays Huttons author page][a] and keep reading.
--------------------------------------------------------------------------------
via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/
作者:[Hays Hutton][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.compose.com/articles/author/hays-hutton/
[1]:https://twitter.com/share?text=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB&amp;url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&amp;via=composeio
[2]:https://www.facebook.com/sharer/sharer.php?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/
[3]:https://plus.google.com/share?url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/
[4]:http://news.ycombinator.com/submitlink?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&amp;t=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB
[5]:https://www.compose.com/articles/rss/
[6]:https://unsplash.com/@esaiastann
[7]:https://www.compose.com/articles
[8]:https://www.compose.com/articles/tag/go/
[9]:https://www.compose.com/articles/tag/mgo/
[10]:https://www.compose.com/articles/tag/mongodb/
[11]:https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/#search
[12]:https://medium.com/@tjholowaychuk/farewell-node-js-4ba9e7f3e52b#.dc9vkeybx
[13]:http://apex.run/
[14]:http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
[15]:http://apex.run/
[16]:https://www.compose.com/articles/composes-new-primetime-mongodb/
[17]:https://www.terraform.io/

View File

@ -1,141 +0,0 @@
BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3
============================================================
> EDIT : After writing this blog post Ive started a 64-bit OS for the Raspberry Pi 3, based on Debian. You can [find it here][3].
The **Raspberry Pi 3** ships with a Broadcom BCM2837 64bit ARMv8 quad core Cortex A53 processor, which is a **64-bit CPU**. If you own one of these, running the following command might surprise you :
> > uname -a
> Linux raspberrypi 4.4.34-v7+ #930 SMP Wed Nov 23 15:20:41 GMT 2016 armv7l GNU/Linux
Yes, this is a **32-bit kernel**. The reason for this is that the Raspberry Pi foundation doesnt yet provides a 64-bit version of Raspbian, the official OS for Raspberry Pi. It is however possible to build one, thanks to the various patches sent by [Electron752][9].
# Build the Kernel
The Raspberry Pi foundation maintains [their own fork ][10]of the Linux Kernel which is especially tailored for their devices, while upstream gets merged regularly.
Were going to adapt instructions from [that page][11] to **build a 64-bit Kernel**.
We cannot use the “Local building” method as itd require a 64-bit Raspberry Pi, which we obviously dont have yet. So we have to **cross-compile** it, **Ubuntu**is the recommended OS for this. I personally dont have Ubuntu so Ill make my build on a 2 CPUs Ubuntu 16.04 Digital Ocean droplet, which should cost me $0.03\. If you also want to proceed like this, you can get $10 free credits through [this link][12]. Alternatively, you could use a Ubuntu VM through Virtualbox for instance.
First, wed need a few **build tools** and the **aarch64 cross-compiler** :
> > apt-get update
> > apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip
Then we can download the **Linux Kernel sources** :
> > git clone depth=1 -b rpi-4.8.y https://github.com/raspberrypi/linux.git
Enter now inside the created git directory. Optionally, you can add an extra version tag for your kernel. This is done by editing the beginning of the Makefile :
> VERSION = 4
> PATCHLEVEL = 8
> SUBLEVEL = 13
> EXTRAVERSION = +bilal
In order to **build it**, run the following commands :
> > make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
> > make -j 3 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
The first one should be pretty fast. For the second one its a whole different story, I havent timed it exactly but it was around 30 minutes for me. Make sure to adapt the -j flag depending on your number of CPUs (nproc * 1.5).
# Choose a Linux distribution
While the Kernel is being built, we can start preparing a Linux distribution for it. Ill be using **Raspbian** for simplicity in this tutorial, even though this is a 32-bit only distribution.
_If you want to go 64-bit all the way you should pick up a distribution available in aarch64, Debian has a robust [ARM64Port][4]. To grab it there are basically 3 options :_
_ download a pre-built root filesystem, this would most likely give you an outdated one as mentioned in that page_
_ build your own with debootstrap if youre familiar with it (otherwise it can be tricky as it requires some manual tweaks, the original purpose of it is to chroot from an already running host, not build a root filesystem for another machine)._
_ the one Id recommend, using multistrap, there seems to be a nice tutorial on this page : http://free-electrons.com/blog/embdebian-with-multistrap/_
Back to Raspbian, we can now download the official OS and start preparing it.
Open a new shell session and run the following commands :
> > wget -O raspbian.zip https://downloads.raspberrypi.org/raspbian_lite_latest
> > unzip raspbian.zip
We can inspect it with the following command :
> > fdisk -l 2016-11-25-raspbian-jessie-lite.img
> Disk 2016-11-25-raspbian-jessie-lite.img: 1.3 GiB, 1390411776 bytes, 2715648 sectors
> Units: sectors of 1 * 512 = 512 bytes
> Sector size (logical/physical): 512 bytes / 512 bytes
> I/O size (minimum/optimal): 512 bytes / 512 bytes
> Disklabel type: dos
> Disk identifier: 0x244b8248
>
> Device Boot Start End Sectors Size Id Type
> 2016-11-25-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
> 2016-11-25-raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G 83 Linux
We can see it has **two partitions**. The first one is the **boot partition**, it mainly contains the bootloader, the Linux Kernel and a few config files. The second one is the** root partition**.
We can **mount those partitions** on our filesystem, starting with the **root partition** :
> > mount -o loop,offset=70254592 2016-11-25-raspbian-jessie-lite.img /mnt
The offset depends on the sector size, which is 512 : 70254592 = 512 * 137216
Then the **boot partition** :
> > mount -o loop,offset=4194304,sizelimit=66060288 2016-11-25-raspbian-jessie-lite.img /mnt/boot
_(offset : 4194304 = 512 * 8192, sizelimit: _ _66060288 = 512 * 129024)_
The Raspbian OS can now be seen under /mnt. Were almost there.
# Wrapping it up
Once the Kernel build is finished, the last steps involve **copying the Linux Kernel** and the **device tree** to the boot partition :
> > cp arch/arm64/boot/Image /mnt/boot/kernel8.img
> > cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/
Tweaking **config.txt** :
> > echo “kernel=kernel8.img” >> /mnt/boot/config.txt
Installing **Kernel modules** :
> > make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu INSTALL_MOD_PATH=/mnt modules_install
> > umount /mnt/boot
> > umount /mnt
And… thats it, a freshly baked **ARM64 Linux Kernel** for our Raspberry Pi 3!
You can now compress the image, download it through scp for instance and follow the standard instructions to put it on your SD card.
Eventually youll get :
> > uname -a
> Linux raspberrypi 4.8.13+bilal-v8+ #1 SMP Wed Dec 14 14:09:38 UTC 2016 aarch64 GNU/Linux
[Twitter][5][LinkedIn][6][Google+][7][Share][8]
--------------------------------------------------------------------------------
via: https://devsidestory.com/build-a-64-bit-kernel-for-your-raspberry-pi-3/
作者:[Bilal Amarni][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://devsidestory.com/about-me
[1]:https://devsidestory.com/author/bamarni/
[2]:https://devsidestory.com/build-a-64-bit-kernel-for-your-raspberry-pi-3/
[3]:https://github.com/bamarni/pi64
[4]:https://wiki.debian.org/Arm64Port
[5]:https://devsidestory.com/#twitter
[6]:https://devsidestory.com/#linkedin
[7]:https://devsidestory.com/#google_plus
[8]:https://www.addtoany.com/share#url=https%3A%2F%2Fdevsidestory.com%2Fbuild-a-64-bit-kernel-for-your-raspberry-pi-3%2F&title=Build%20a%2064-bit%20Kernel%20for%20your%20Raspberry%20Pi%203
[9]:https://github.com/Electron752
[10]:https://github.com/raspberrypi/linux
[11]:https://www.raspberrypi.org/documentation/linux/kernel/building.md
[12]:https://m.do.co/c/8ef9c5832a9c

View File

@ -1,536 +0,0 @@
++++翻译中++++++
How to set up a Continuous Integration server for Android development (Ubuntu + Jenkins + SonarQube)
============================================================
I have recently acquired a new MacBook Pro as my main Android development machine and instead of selling or giving away my old Mac BookPro (13", late 2011, 16GB RAM, 500G SSD, Core i5 2,4GHz, 64Bit) I have wiped it out and turned it into a Continuous Integration Server with dual boot MacOS-Ubuntu.
The goal of this article is to summarize the installation steps for me as future reference and for any developer that may be interested in setting up its own CI server, I will explain how to:
* Configure a fresh Ubuntu installation to be able to run the Android SDK.
* Install Jenkins CI as a service to pull, compile, and run tests of an Android multi-module project hosted in GitHub.
* Install Docker to run a MySQL server and SonarQube in their own containers, to perform static code analysis triggered by Jenkins
* Android App configuration requirements.
### Step 1Ubuntu Installation:
Im going to use Ubuntu as the SO of the CI because it has a strong community that will provide you support for any issue you may encounter and my personal recommendation is always to use the last LTS version, currently 16.04 LTS. There are plenty of tutorials about how to install it on virtually any hardware so Im just providing the link to download it.
[Install Ubuntu Desktop 16.04 LTS][1]
You may wonder why Im using the Desktop version instead of the pure server version, this is just a matter of personal preference, Im not worried of losing a bit of performance and available RAM due to be running the desktop interface because I think that the usability that provides de GUI pays off enough in increased productivity.
### Step 2Remote access management:
#### SSH-Server:
Ubuntu desktop is not shipped with the ssh server installed by default, so to be able to manage your server remotely through the command line just install it:
```
$ sudo apt-get install openssh-server
```
#### NoMachine Remote Desktop:
Probably your CI is not going to be next to you but closer to your router, other room or even miles away from your current location. I have been dealing with different remote desktop solutions and I have to say that IMHO NoMachine performs the best, it is platform agnostic and works just out of the box just using your ssh credentials. (Obviously you have to install it both in your CI and your machine)
[NoMachine - Free Remote Access For Everybody
Free remote access and desktop sharing software. Access your computer to work on files and transfer documents, watch…www.nomachine.com][2][][3]</section>
### Step 3Environment configuration
Here Im going to install JAVA8, Git and the Android SDK that are required by Jenkins to pull, compile and run android projects.
#### SDKMAN!:
This marvelous command line tool allows you install many popular SDK (eg. Gradle, Groovy, Grails, Kotlin, Scala…), list candidates and switch among different versions in parallel in a really easy and handy way.
[SDKMAN! the Software Development Kit Manager
SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It…sdkman.io][4][][5]
They have added recently support for JAVA8 so I preferred to install Java using it instead of using the popular webupd8 repository, so it is up to you to choose whether to install SDKMAN! or not but Im pretty sure it is a tool that you will use in the near future.
Installation of SDKMAN! is as easy as executing the following line:
```
$ curl -s "https://get.sdkman.io" | bash
```
#### Oracle JAVA8:
As we have previously installed SDKMAN! now installing JAVA8 is as easy as:
```
$ sdk install java
```
Or using the webupd8 repository:
[Install Oracle Java 8 In Ubuntu Or Linux Mint Via PPA Repository [JDK8]
Oracle Java 8 is now stable. Below you'll find instructions on how to install it in Ubuntu or Debian via a PPA…www.webupd8.org][6][][7]
#### Git:
Installing git is straight forward, no more comments needed:
```
$ sudo apt install git
```
#### Android SDK:
At the bottom of this page:
[Download Android Studio and SDK Tools | Android Studio
Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and…developer.android.com][8][][9]
you can find “_Get just the command line tools_”, copy the link e.g:
```
https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
```
Then download and unzip it at /opt/android-sdk-linux
```
$ cd /opt
```
```
$ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
```
```
$ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux
```
As we have used root user to create de directory we need to fix folder permissions to make it readable and writable by our main user:
```
$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/
```
Lets set the SDK environmental variables editing the /.bashrc file:
```
$ cd
$ nano .bashrc
```
Then add at the bottom (but before SDKMAN! config line) these lines:
```
export ANDROID_HOME="/opt/android-sdk-linux"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"
```
Close the terminal and open a new one to verify that variables have been properly exported:
```
$ echo $ANDROID_HOME
/opt/android-sdk-linux
```
```
$ android
```
![](https://cdn-images-1.medium.com/max/1000/1*Q4o_LpfC5A3evFUwd62MOQ.png)
Running Android SDK Manager GUI
### Step 4Jenkins server:
Here Im going to describe how to install the server, configure it, create a Jenkins Job to pull, build and test an Android project and how to get to the console output.
#### Jenkins installation:
Jenkins server is available at:
[Jenkins
Jenkins is an open source automation serverjenkins.io][12][][13]
There are many ways to run Jenkins, executing a .war file, as a linux service, as a Docker container, etc….
My first thought was to run it using a Docker container but then I realized that it was a nightmare to properly configure code folders, android-sdk folder visibility and USB visibility of physical devices plug to run Android Tests.
For ease of use I finally decided to use it as service adding the Stable repository key to install and get updates with apt
```
$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
```
Edit the sources.list file and add:
```
$ sudo nano /etc/apt/sources.list
```
```
#Jenkin Stable
deb https://pkg.jenkins.io/debian-stable binary/
```
Then install it:
```
sudo apt-get update
sudo apt-get install jenkins
```
Add user _jenkins_ to your username group to allow it to read and write the Android SDK folder
```
$ sudo usermod -a -G YOUR_USERNAME jenkins
```
Jenkins service will always start at boot time and will be available at [http://localhost:8080][15]
Just after installation due to security reasons this screen is shown, just follow the instructions to finally get your Jenkins instance up and running.
![](https://cdn-images-1.medium.com/max/1000/1*gN6-ncU7mRdQWL3wmlS_5g.png)
Unlocking a successfully installed Jenkins server
#### Jenkins Configuration:
After unlocking Jenkins installation you are prompted to install plugins, click “Select plugins to Install” browse and select the following ones to be installed in addition to suggested plugins:
* JUnit
[JUnit Plugin - Jenkins - Jenkins Wiki
The JUnit plugin provides a publisher that consumes XML test reports generated during the builds and provides some…wiki.jenkins-ci.org][16][][17]
* JaCoCo
[JaCoCo Plugin - Jenkins - Jenkins Wiki
In order to get the coverage data published to Jenkins, you need to add a JaCoCo publisher and configure it so it will…wiki.jenkins-ci.org][18][][19]
* EnvInject
[EnvInject Plugin - Jenkins - Jenkins Wiki
Only previous environment variables are available for polling Some plugins provide polling mechanisms (such as SCM…wiki.jenkins-ci.org][20][][21]
* GitHub plugins
[GitHub Plugin - Jenkins - Jenkins Wiki
This plugin requires that you have an HTTP URL reachable from GitHub, which means it's reachable from the whole…wiki.jenkins-ci.org][22][][23]
![](https://cdn-images-1.medium.com/max/1000/1*xvG06qRSCvfw5OQgQleG0A.png)
Installing Jenkins plugins
Create the admin user and complete installation.
To finish configuration we have to configure ANDROID_HOME and JAVA_HOME environmental variables:
Go to Manage Jenkins > Configure System
Scroll down and at Global properties section check the Environment variables box and add _ANDROID_HOME_ and _JAVA_HOME_
![](https://cdn-images-1.medium.com/max/1000/1*rpgkUsqWhkHk4xOKCGPcvw.png)
Adding global environmental variables common to all Jenkins jobs
#### Creating a “Jenkins Job”
A Jenkins Job describes a series of steps that are executed consecutively. I have prepared a “Hello Jenkins” Android project in GitHub that you can use to test your Jenkins configuration as you follow this tutorial. It is just a hello world multi-module app with Unit tests, Android tests and includes JaCoCo and SonarQube plugins.
[pamartineza/helloJenkins
helloJenkins - Hello Jenkins project for CI configuration testgithub.com][24][][25]
First create a new _Freestyle project Job _and give it a name eg. “_Hello_Android_” (Dont use spaces in Jenkins Job names to avoid future compatibility problems with SonarQube)
![](https://cdn-images-1.medium.com/max/1000/1*ITE7xIrbsrChWv45PSlPPw.png)
Creating a Freestyle Jenkins Job
Then lets configure it, Im going to add screenshots of every section:
General:
This section is not very interesting for our goals, here you can change the name of the Job, add a description and if using a GitHub project add the project URL, (without *.git, the url of the web not the repo)
![](https://cdn-images-1.medium.com/max/1000/1*7QF2pfgM73FVIWTfQhcbEA.png)
Project Url Configuration
Source Code Management:
Here is where we have to chose our CVS as Git and add the repository url (this time include *.git) and select the branch to pull. As this is a public GitHub repository you dont need to add credentials but otherwise you will have to add your user and password.
I recommend you that instead of using your actual GitHub user with full permissions create a new GitHub user with read-only privileges of your private repos to be used exclusively by your Jenkins Jobs.
In addition if you have enabled Two-Factor authentication Jenkins wont be able to pull code and again having this exclusively created for Jenkins user will be the solution to pull code from private repos.
![](https://cdn-images-1.medium.com/max/1000/1*wkzdL70XrCzIpXDsHPA2Pg.png)
Repository configuration
Build Triggers:
Builds can be triggered manually, remotely, periodically, after another Job build, when changes are detected, etc…
Ideally the optimal situation is to just trigger a build when a change has been pushed to the repository, GitHub provides a system called Webhooks
[Webhooks | GitHub Developer Guide
Webhooks allow you to build or set up integrations which subscribe to certain events on GitHub.com. When one of those…developer.github.com][26][][27]
that we can configure to send events to the CI server and then trigger the build, but this obviously requires our CI sever to be online and reachable by GitHub servers.
Your CI is going to be probably isolated in a private network for security reasons then the only solution is to poll GitHub periodically. In my personal case I just turn on the CI when Im working, in the following screenshot I have configured it to poll Github every 15 minutes. Polling times are defined with CRON syntax, if you are not familiar with it, press the help button on the right to get an extensive documentation with examples.
![](https://cdn-images-1.medium.com/max/1000/1*eONz8DAwJ9PW7uc8VQw7wQ.png)
Repository polling configuration
Build Environment:
Here I recommend to configure the build _stuck_ timeout to avoid Jenkins blocking memory and CPU if any unexpected error happens. Here also you can Inject environmental variables, passwords, etc…
![](https://cdn-images-1.medium.com/max/1000/1*Y6FgbIQq8pMk6D72Sr9KdQ.png)
Build stuck time out
Build:
Here is where the magic happens! Add a _Build Step _that _Invokes Gradle Script _select the Gradle Wrapper (Android projects are shipped with a Gradle Wrapper by default, dont forget to check it into Git) and lets define which tasks are going to be executed:
1. clean: Deletes all build outputs of previous builds, this ensures nothing is cached and the freshness of this build.
2. assembleDebug: Generates the debug .apk
3. test: executes JUnit tests in all modules
4. connectedDebugAndroidTest: executes Android Tests on actual android devices connected to the CI. (It is also possible to run Android Test against an Android Emulator installing the Android Emulator Jenkins plugin, but it doesnt support all emulator versions and its configuration is not trivial at all)
![](https://cdn-images-1.medium.com/max/1000/1*D0HDPOUYCWzsWKiLv4LrBA.png)
Gradle tasks definition
Post-build Actions:
Here we are going to add _Publish JUnit test result report _this step is provided by the JUnit plugin and collects the .XML reports generated with the outcome of the JUnit tests that will generate a fancy chart with the evolution of tests results in time.
The path for debug flavor tests results in our app module is:
app/build/test-results/debug/*.xml
In multi-module projects the path for test results in other “pure” java modules is:
*/build/test-results/*.xml
![](https://cdn-images-1.medium.com/max/1000/1*ZQtamiQ_8PzAFBd-pMfvdg.png)
Also add _Record JaCoCo coverage report _that will create a chart to show the evolution of the code coverage
![](https://cdn-images-1.medium.com/max/1000/1*wKaFykDl0qg-c79QwRTR2w.png)
#### Executing a Jenkins Job
Our Job will execute every 15 minutes if new changes have been pushed to the repository but it can also be triggered manually if you dont want to wait until next polling or you just want to verify any change in the configuration straight forward. Click _Build Now_ and then current build will be shown in the _Build History _, click on it to see the details.
![](https://cdn-images-1.medium.com/max/1000/1*vKi-BGQ2blimaoTl7PTXtQ.png)
Manual Job execution
The most interesting part here is the console output, you can see how Jenkins pulls the code and starts executing the Gradle tasks we have previously defined e.g _clean._
![](https://cdn-images-1.medium.com/max/1000/1*dbtmlSr2owrj_CQfGXjdsw.png)
Beginning of console output
If everything is OK console output will finish as follows (any repository connectivity problem, failing JUnit or Android test failure would make the build to fail)
![](https://cdn-images-1.medium.com/max/1000/1*WpOH-aHuuNRDYmY710ecLQ.png)
Yeehaa! build Sucsessful and test results with coverage collected
### Step 5SonarQube
In this section I will describe how to install and configure SonarQube and its companion MySQL database using Docker containers.
[Continuous Code Quality | SonarQube
The leading open source platform for continuous code qualitywww.sonarqube.org][28][][29]
SonarQube is a code static analysis tool that helps developers to write cleaner code, detect bugs, learn good practices and it also keeps track of code coverage, tests results, technical debt, etc… all SonarQube detected issues can be imported easily to be fixed into Android Studio/IntelliJ with a plugin:
[JetBrains Plugin Repository :: SonarQube Community Plugin
Edit descriptionplugins.jetbrains.com][30][][31]</section>
#### Installing Docker:
Installation of Docker is pretty straightforward following official Docker documentation:
[Install Docker on Ubuntu
Instructions for installing Docker on Ubuntudocs.docker.com][32][][33]
#### Creating Containers:
MySQL:
Lets create a MySQL 5.7.17 server container called _mysqlserver, _that will allways start at boot time, with a local volume in your user folder, a password and exposed at localhost:3306 _(replace YOUR_USER and YOUR_MYSQL_PASSWORD with your values)_
```
$ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17
```
phpMyAdmin:
To manage the MySQL server Im used to phpMyAdmin then nothing more easy than creating another container called _phpmyadmin _linked to our _mysqlserver _container, that also starts at boot time, exposed at localhost:9090 and using the last version available.
```
$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin
```
Using the phpMyAdmin interface at localhost:9090 login as _root and YOUR_MYSQL_PASSWORD _andcreate a database called _sonar_ with _utf8_general_ci _collation. Also create a new user _sonar_ with password _YOUR_SONAR_PASSWORD _and give it all privileges on the _sonar_ database.
SonarQube:
Now we are ready to create our SonarQube container called _sonarqube _that starts at boot time, linked to our db, exposed at localhost:9000 and using the 5.6.4 (LTS) version.
```
$ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4
```
#### SonarQube Configuration:
If everything is OK browsing to localhost:9000 will lead you to this page:
![](https://cdn-images-1.medium.com/max/1000/1*tcgww8PENXdyrLS3K95ZEw.png)
Now lets configure necessary plugins and Quality Profiles:
1. Login at the top right corner (Default administrator login is admin/admin)
2. Go to Administration > System > Update Center > Updates Only
* Update Java plugin if necessary
3\. Now switch to Available and install the following plugins:
* Android (provides Android lint rules)
* Checkstyle
* Findbugs
* XML
4\. Scroll back to the top and press restart button to complete the installation
#### SonarQube Profiles:
The plugins that we have installed define profiles that are sets of rules used to evaluate the code quality of a project.
Only 1 profile can be applied to a project at a time but we can make profiles have a parent and therefore inherit rules, so to be able to have all rules evaluated against our project we can create a new custom profile and chain all profiles.
Lets do it, go to Quality Profiles > Create and give it a name e.g. CustomAndroidProfile
Add Android Lint as parent, then switch to the Android Lint profile and add FindBugs Security Minimal as parent, continue this chain until you get this inheritance schema and set the CustomAndroidProfile as the default one:
![](https://cdn-images-1.medium.com/max/1000/1*w2CvH8uAOUcvajzjsOoCgQ.png)
#### Executing the SonarQube Analysis:
Now that our SonarQube is properly configured we just have to add a new Gradle task, _sonarqube_, to our Jenkins job, that will be executed in last place:
![](https://cdn-images-1.medium.com/max/1000/1*EDAjalNzmdU-ptjhWzuCcQ.png)
Execute again the Jenkins job and once it has finished lets see our sonarQube dashboard at localhost:9000 :
![](https://cdn-images-1.medium.com/max/1000/1*n7dKdPXyUPj1AZe6ujL3vw.png)
Dashboard with Analysis result
If we press the project name we can navigate different dashboards, with tons of info, the most important one is probably _Issues. 
_In the next screenshot Im showing the detail of a _major _issue that flags an empty constructor method. Here personally what gives me the most important value of using Sonarqube is the explanation shown at the screen bottom when you click on the period  , this is an invaluable way of learning tips and tricks of programming.
![](https://cdn-images-1.medium.com/max/1000/1*KKM9T2qHzanraAetghYCqg.png)
Getting the explanation of the issue
### Step 6Extra: configuring other Android apps
Configuring an Android app to get coverage and sonarqube results is just having the JaCoCo and SonarQube plugins applied. Again you can find more details at my demo app HelloJenkins:
[pamartineza/helloJenkins
helloJenkins - Hello Jenkins project for CI configuration testgithub.com][34][][35]
### The end!
Yes, you have finally reached the end of this long article! I hope you found it useful. If you find any error or you have any doubt please dont hesitate to make any comment, Ill do my best to try to help and if you liked it please share it!
--------------------------------------------------------------------------------
作者简介:
![](https://cdn-images-1.medium.com/fit/c/60/60/0*DQl4jAoi2wXr6S3p.jpg)
Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · Android, OpenSource and OpenData promoter · Runner · Traveller
--------------------------------------------------------------------------------
via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98
作者:[Pablo A. Martínez][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://medium.com/@pamartineza
[1]:https://www.ubuntu.com/download/desktop
[2]:https://www.nomachine.com/download
[3]:https://www.nomachine.com/download
[4]:http://sdkman.io/
[5]:http://sdkman.io/
[6]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html
[7]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html
[8]:https://developer.android.com/studio/index.html
[9]:https://developer.android.com/studio/index.html
[10]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
[11]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
[12]:https://jenkins.io/
[13]:https://jenkins.io/
[14]:https://pkg.jenkins.io/debian-stable/jenkins.io.key
[15]:http://localhost:8080/
[16]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin
[17]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin
[18]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin
[19]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin
[20]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin
[21]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin
[22]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin
[23]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin
[24]:https://github.com/pamartineza/helloJenkins
[25]:https://github.com/pamartineza/helloJenkins
[26]:https://developer.github.com/webhooks/
[27]:https://developer.github.com/webhooks/
[28]:https://www.sonarqube.org/
[29]:https://www.sonarqube.org/
[30]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin
[31]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin
[32]:https://docs.docker.com/engine/installation/linux/ubuntulinux/
[33]:https://docs.docker.com/engine/installation/linux/ubuntulinux/
[34]:https://github.com/pamartineza/helloJenkins
[35]:https://github.com/pamartineza/helloJenkins

View File

@ -1,3 +1,5 @@
翻译中 by  WangYueScream
===========================================================
3 open source music players: Aqualung, Lollypop, and GogglesMM
============================================================
![3 open source music players: Aqualung, Lollypop, and GogglesMM](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/music-birds-recording-520.png?itok=wvh1g4Lw "3 open source music players: Aqualung, Lollypop, and GogglesMM")

View File

@ -1,77 +0,0 @@
Inside Real-Time Linux
============================================================
![Jan Altenberg](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/jan-altenberg-elc.png?itok=mgQeKpEK "Jan Altenberg")
Real-time Linux has come a long way in the past decade. Jan Altenberg of Linutronix provides an overview of the topic and offers new RTL performance benchmarks in this video from ELC Europe.[The Linux Foundation][1]
Real-time Linux (RTL), a form of mainline Linux enabled with PREEMPT_RT, has come a long way in the past decade. Some 80 percent of the deterministic [PREEMPT_RT][3] patch is now available in the mainline kernel itself. Yet, backers of the strongest alternative to the single-kernel RTL on Linux -- the dual-kernel Xenomai -- continue to claim a vast superiority in reduced latency. In an [Embedded Linux Conference Europe][4] presentation in October, Jan Altenberg rebutted these claims while offering an overview of the real-time topic.
Altenberg, of German embedded development firm [Linutronix][5], does not deny that dual-kernel approaches such as Xenomai and RTAI offer lower latency. However, he reveals new Linutronix benchmarks that purport to show that the differences are not as great as claimed, especially in real-world scenarios. Less controversially, he argues that RTL is much easier to develop for and maintain.
Before we delve into the eternal Xenomai vs. RTL debate, note that in October 2015, the [Open Source Automation Development Lab][6] (OSADL) [handed control][7] of the RTL project over to The Linux Foundation, which hosts Linux.com. In addition, Linutronix is a key contributor to the RTL project and hosts its x86 maintainer.
The advance of RTL is one of several reasons Linux has [stolen market share][8] from real-time operating systems (RTOSes) over the past decade. RTOSes appear more frequently on microcontrollers than applications processors, and it's easier to do real-time on single-purpose devices that lack advanced userland OSes such as Linux.
Altenberg began his presentation by clearing up some common misconceptions about real-time (or realtime) deterministic kernel schemes. “Real-time is not about fast execution or performance,” Altenberg told his ELCE audience. “Its basically about determinism and timing guarantees. Real-time gives you a guarantee that something will execute within a given time frame. You dont want to be as fast as possible, but as fast as specified.”
Developers tend to use real-time when a tardy response to a given execution time leads to a serious error condition, especially when it could lead to people getting hurt. Thats why real-time is still largely driven by the factory automation industry and is increasingly showing up in cars, trains, and planes. Its not always a life-and-death situation, however -- financial services companies use RTL for high-frequency trading.
Requirements for real-time include deterministic timing behavior, preemption, priority inheritance, and priority ceiling, said Altenberg. “The most important requirement is that a high-priority task always needs to be able to preempt a low-priority task.”
Altenberg strongly recommended against using the term “soft real-time” to describe lightweight real-time solutions. “You can be deterministic or not, but theres nothing in between.”
### Dual-kernel Real-time
Dual-kernel schemes like Xenomai and RTAI deploy a microkernel running in parallel with a separate Linux kernel, while single kernel schemes like RTL make Linux itself capable of real-time. “With dual-kernel, Linux can get some runtime when priority real-time applications arent running on the microkernel,” said Altenberg. “The problem is that someone needs to maintain the microkernel and support it on new hardware. This is a huge effort, and the development communities are not very big. Also, because Linux is not running directly on the hardware, you need a hardware abstraction layer (HAL). With two things to maintain, youre usually a step behind mainline Linux development.”
The challenge with RTL, and the reason it has taken so long to emerge, is that “to make Linux real-time you have to basically touch every file in the kernel,” said Altenberg. Yet, most of that work is already done and baked into mainline, and developers dont need to maintain a microkernel or HAL.
Altenberg went on to explain the differences between the RTAI and Xenomai. “With RTAI, you write a kernel module that is scheduled by a microkernel. Its like kernel development -- really hard to get into it and hard to debug.”
RTAI development can be further complicated because industrial customers often want to include closed source code along with GPL kernel code. “You have to decide which parts you can put into userland and which you put into the kernel with real-time approaches,” said Altenberg.
RTAI also supports fewer hardware platforms than RTL, especially beyond x86\. The dual-kernel Xenomai, which has eclipsed RTAI as the dominant dual-kernel approach, has wider OS support than RTAI. More importantly, it offers “a proper solution for doing real-time in userspace,” said Altenberg. “To do this, they implemented the concept of skins -- an emulation layer for the APIs of different RTOSes, such as POSIX. This lets you reuse a subset of existing code from some RTOSes.”
With Xenomai, however, you still need to maintain a separate microkernel and HAL. Limited development tools are another problem. “As with RTAI, you cant use the standard C library,” said Altenberg. “You need special tools and libraries. Even for POSIX, you must link to the POSIX skin, which is much more complicated.” With either platform, he added, its hard to scale the microkernels beyond 8 to 16 CPUs to the big server clusters used in financial services.
### Sleeping Spinlocks
The dominant single-kernel solution is RTL, based on PREEMPT.RT, which was primarily developed by Thomas Gleixner and Ingo Molnár more than a decade ago. PREEMPT.RT reworks the kernels “spinlock” locking primitives to maximize the preemptible sections inside the Linux kernel. (PREEMPT.RT was originally called the Sleeping Spinlocks Patch.)
Instead of running interrupt handlers in hard interrupt context, PREEMPT.RT runs them in kernel threads. “When an interrupt arrives, you dont run the interrupt handler code,” said Altenberg. “You just wake up the corresponding kernel thread, which runs the handler. This has two advantages: The kernel thread becomes interruptible, and it shows up in the process list with a PID. So you can put a low priority on non-important interrupts and a higher priority on important userland tasks.”
Because about 80 percent of PREEMPT.RT is already in mainline, any Linux developer can take advantage of PREEMPT.RT-originated kernel components such as timers, interrupt handlers, tracing infrastructure, and priority inheritance. “When they made Linux real-time, everything became preemptible, so we found a lot of race conditions and locking problems,” said Altenberg. “We fixed these and pushed them back into mainline to improve the stability of Linux in general.”
Because RTL is primarily mainline Linux, “PREEMPT.RT is widely accepted and has a huge community,” said Altenberg. “If you write a real-time application, you dont need to know much about PREEMPT.RT. You dont need any special libraries or APIs, just a standard C library, a Linux driver, and POSIX app.”
You still need to run a patch to use PREEMPT.RT, which is updated in every second Linux version. However, within two years, the remaining 20 percent of PREEMPT.RT should make it into Linux, so you “wont need a patch.”
Finally, Altenberg revealed the results of his Xenomai vs. RTL latency tests. “There are a lot of papers that claim that Xenomai and RTAI are way faster on latency than PREEMPT.RT,” said Altenberg. “But I figured out that most of the time PREEMPT.RT was poorly configured. So we brought in both a Xenomai expert and a PREEMPT.RT expert, and let them configure their own platforms.”
While Xenomai performed better on most tests, and offered far less jitter, the differences were not as great as the 300 to 400 percent latency superiority claimed by some Xenomai boosters, said Altenberg. When tests were performed on userspace tasks -- which Altenberg says is the most real-world, and therefore the most important, test -- the worst-case reaction was about 90 to 95 microseconds for both Xenomai and RTL/PREEMPT.RT, he claimed.
When they isolated a single CPU in the dual Cortex-A9 system for handling the interrupt in question, which Altenberg says is fairly common, PREEMPT.RT performed slightly better, coming in around 80 microseconds. (For more details, check out the video about 33 minutes in.)
Altenberg acknowledges that his 12-hour test is the bare minimum, compared to OSADLs two- to three-year tests, and that it is “not a mathematical proof.” In any case, he suggests that RTL deserves a handicap considering its easier development process. “In my opinion, its not fair to compare a full-featured Linux system with a microkernel,” he concluded.
--------------------------------------------------------------------------------
via: https://www.linux.com/news/event/open-source-summit-na/2017/2/inside-real-time-linux
作者:[ERIC BROWN][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.com/users/ericstephenbrown
[1]:https://www.linux.com/licenses/category/linux-foundation
[2]:https://www.linux.com/files/images/jan-altenberg-elcpng
[3]:https://www.linux.com/blog/intro-real-time-linux-embedded-developers
[4]:http://events.linuxfoundation.org/events/archive/2016/embedded-linux-conference-europe
[5]:https://linutronix.de/
[6]:http://archive.linuxgizmos.com/celebrating-the-open-source-automation-development-labs-first-birthday/
[7]:http://linuxgizmos.com/real-time-linux-shacks-up-with-the-linux-foundation/
[8]:https://www.linux.com/news/embedded-linux-keeps-growing-amid-iot-disruption-says-study

View File

@ -0,0 +1,107 @@
# How to work around video and subtitle embed errors
This is going to be a slightly weird tutorial. The background story is as follows. Recently, I created a bunch of [sweet][1] [parody][2] [clips][3] of the [Risitas y las paelleras][4] sketch, famous for its insane laughter by the protagonist, Risitas. As always, I had them uploaded to Youtube, but from the moment I decided on what subtitles to use to the moment when the videos finally became available online, there was a long and twisty journey.
In this guide, I would like to present several typical issues that you may encounter when creating your own media, mostly with subtitles and the subsequent upload to media sharing portals, specifically Youtube, and how you can work around those. After me.
### The background story
My software of choice for video editing is Kdenlive, which I started using when I created the most silly [Frankenstein][5] clip, and it's been my loyal companion ever since. Normally, I render files to WebM container, with VP8 video codec and Vorbis audio codec, because that's what Google likes. Indeed, I had no issues with the roughly 40 different clips I uploaded in the last seven odd years.
![Kdenlive, create project](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-kdenlive-create-project.jpg)
![Kdenlive, render](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-kdenlive-render.png)
However, after I completed my Risitas & Linux project, I was in a bit of a predicament. The video file and the subtitle file were still two separate entities, and I needed somehow to put them together. My original article for subtitles work mentions Avidemux and Handbrake, and both these are valid options.
However, I was not too happy with the output generated by either one of these, and for a variety of reasons, something was ever so slightly off. Avidemux did not handle the video codecs well, whereas Handbrake omitted a couple of lines of subtitle text from the final product, and the font was ugly. Solvable, but not the topic for today.
Therefore, I decided to use VideoLAN (VLC) to embed subtitles onto the video. There are several ways to do this. You can use the Media > Convert/Save option, but this one does not have everything we need. Instead, you should use Media > Stream, which comes with a more fully fledged wizard, and it also offers an editable summary of the transcoding options, which we DO need - see my [tutorial][6] on subtitles for this please.
### Errors!
The process of embedding subtitles is not trivial. You will most likely encounter several problems along the way. This guide should help you work around these so you can focus on your work and not waste time debugging weird software errors. Anyhow, here's a small but probable collection of issues you will face while working with subtitles in VLC. Trial & error, but also nerdy design.
### No playable streams
You have probably chosen weird output settings. You might want to double check you have selected the right video and audio codecs. Also, remember that some media players may not have all the codecs. Also, make sure you test on the system you want these clips to play.
![No playable streams](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-no-playable-streams.png)
### Subtitles overlaid twice
This can happen if you check the box that reads Use a subtitle file in the first step of the streaming media wizard. Just select the file you need and click Stream. Leave the box unchecked.
![Select file](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-select.png)
### No subtitle output is generated
This can happen for two main reasons. One, you have selected the wrong encapsulation format. Do make sure the subtitles are marked correctly on the profile page when you edit it before proceeding. If the format does not support subtitles, it might not work.
![Encapsulation](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-encap.png)
Two, you may have left the subtitle codec render enabled in the final output. You do not need this. You only need to overlay the subtitles onto the video clip. Please check the generated stream output string and delete an option that reads scodec=<something> before you click the Stream button.
![Remove text from output string](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-remove-text.png)
### Missing codecs + workaround
This is a common [bug][7] due to how experimental codecs are implemented, and you will most likely see it if you choose the following profile: Video - H.264 + AAC (MP4). The file will be rendered, and if you selected subtitles, they will be overlaid, too, but without any audio. However, we can fix this with a hack.
![AAC codec](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-aac-codec.png)
![MP4A error](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-mp4a.png)
One possible hack is to start VLC from command line with the --sout-ffmpeg-strict=-2 option (might work). The other and more sureway workaround is to take the audio-less video but with the subtitles overlayed and re-render it through Kdenlive with the original project video render without subtitles as an audio source. Sounds complicated, so in detail:
* Move existing clips (containing audio) from video to audio. Delete the rest.
* Alternatively, use rendered WebM file as your audio source.
* Add new clip - the one we created with embedded subtitles AND no audio.
* Place the clip as new video.
* Render as WebM again.
![Repeat render](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-kdenlive-repeat-render.jpg)
Using other types of audio codecs will most likely work (e.g. MP3), and you will have a complete project with video, audio and subtitles. If you're happy that nothing is missing, you can now upload to Youtube. But then ...
### Youtube video manager & unknown format
If you're trying to upload a non-WebM clip (say MP4), you might get an unspecified error that your clip does not meet the media format requirements. I was not sure why VLC generated a non-Youtube-compliant file. However, again, the fix is easy. Use Kdenlive to recreate the video, and this should result in a file that has all the right meta fields and whatnot that Youtube likes. Back to my original story and the 40-odd clips created through Kdenlive this way.
P.S. If your clip has valid audio, then just re-run it through Kdenlive. If it does not, do the video/audio trick from before. Mute clips as necessary. In the end, this is just like overlay, except you're using the video source from one clip and audio from another for the final render. Job done.
### More reading
I do not wish to repeat myself or spam unnecessarily with links. I have loads of clips on VLC in the Software & Security section, so you might want to consult those. The earlier mentioned article on VLC & Subtitles has links to about half a dozen related tutorials, covering additional topics like streaming, logging, video rotation, remote file access, and more. I'm sure you can work the search engine like pros.
### Conclusion
I hope you find this guide helpful. It covers a lot, and I tried to make it linear and simple and address as many pitfalls entrepreneuring streamers and subtitle lovers may face when working with VLC. It's all about containers and codecs, but also the fact there are virtually no standards in the media world, and when you go from one format to another, sometimes you may encounter corner cases.
If you do hit an error or three, the tips and tricks here should help you solve at least some of them, including unplayable streams, missing or duplicate subtitles, missing codecs and the wicked Kdenlive workaround, Youtube upload errors, hidden VLC command line options, and a few other extras. Quite a lot for a single piece of text, right. Luckily, all good stuff. Take care, children of the Internet. And if you have any other requests as to what next my future VLC articles should cover, do feel liberated enough to send an email.
Cheers.
--------------------------------------------------------------------------------
via: http://www.dedoimedo.com/computers/vlc-subtitles-errors.html
作者:[Dedoimedo ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.dedoimedo.com/faq.html
[1]:https://www.youtube.com/watch?v=MpDdGOKZ3dg
[2]:https://www.youtube.com/watch?v=KHG6fXEba0A
[3]:https://www.youtube.com/watch?v=TXw5lRi97YY
[4]:https://www.youtube.com/watch?v=cDphUib5iG4
[5]:http://www.dedoimedo.com/computers/frankenstein-media.html
[6]:http://www.dedoimedo.com/computers/vlc-subtitles.html
[7]:https://trac.videolan.org/vlc/ticket/6184

View File

@ -1,3 +1,4 @@
【toutoudnf 翻译中】
A public cloud migration in 22 days
============================================================

View File

@ -1,3 +1,5 @@
ucasFL translating
STUDY RUBY PROGRAMMING WITH OPEN-SOURCE BOOKS
============================================================

View File

@ -1,3 +1,5 @@
GHLandy Translating
LFCS sed Command
=====================

View File

@ -1,194 +0,0 @@
Ubuntu GamePack
===============
A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04.
**Contents**
The list of games would be quite extensive but the company claims there is access to over 22,381 games.
The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides.
For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux.
For DOS games you can run the games in DosBox which is a DOS emulator for Linux.
Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include:
* AdvanceMENU front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators
* Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem
* DeSmuME - Nintendo DS emulator
* Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer
* DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows
* DOSEMU - DOS Emulator for Linux
* ePSXe - enhanced PSX emulator
* FCEUX - Nintendo Entertainment System (NES), Famicom and Famicom Disk System (FDS) emulator
* FS-UAE - Cross-platform Amiga emulator
* GNOME Video Arcade - Simple MAME frontend
* Hatari - Atari ST, STE, TT and Falcon emulator for Linux and other systems
* Higan - Emulator for Nintendos SNES, NES, Gameboy, Gameboy Color and Gameboy Advance
* Kega_Fusion - Sega SG/SC/SF, Master System, Game Gear, Genesis/Megadrive, SVP, Pico, SegaCD/MegaCD emulator
* MAME - Hardware emulator which faithfully reproduces the behavior of many arcade machines
* Mednafen - Atari Lynx, GameBoy, NES, SNES, PC-FX, Sega, Sony PlayStation and other systems
* MESS - Emulator for various consoles and computing systems
* Nestopia - Nintendo Entertainment System/Famicom emulator
* PCSX - Sony PlayStation emulator
* PlayOnLinux - Front-end for Wine
* PPSSPP - PPSSPP is an open source PSP emulator available for Windows, MacOS, Linux and Android
* Steam - launcher for the Steam software distribution service - OnLine installer
* Stella - Atari 2600 Emulator for SDL and the X Window System
* VisualBoyAdvance - Full featured Game Boy Advance emulator
* Virtual Jaguar - Cross-platform emulator for Atari's infamous Jaguar console
* Wine - Windows implementation
* Winetricks - a POSIX shell script 'package manager' for WINE to install some Windows software easily
* Yabause - Sega Saturn emulator
* ZSNES - Emulator for the Super Nintendo Entertainment System
The GamePack also includes Oracle Java and Adobe Flash which is needed by quite a few games.
If this seems to be an OS you are interested in then read on to find out how to download it.
**Download**
The main place to download the OS is from UALinux. The link from UALinux is [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]. Since the link is from a foreign country it is a slow download. Another option is to download the OS from a Torrent file. If you do not have a Torrent program you may want to download Transmission. Once you have a Torrent program go to [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]. The Torrent will allow you to download both the 64-bit and 32-bit ISO files.
The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB.
Once downloaded you can use the ISO file to create a bootable DVD to install the GamePack or you can use a program like USB Image Writer to place the ISO on a USB stick to install it.
The requirements are the same as Ubuntu 16.04:
* 2 GHz dual core processor or better
* 2 GB system memory
* 25 GB of free hard drive space
* Either a DVD drive or a USB port for the installer media
* Internet access is required for online gaming systems such as Steam
It goes without saying that for gaming you definitely want to have a system with more than these minimum requirements. More memory would be a definite plus as well as a decent video card with a fair amount of Video RAM.
Once you have a system and the specific ISO file for the system, 32- or 64-bit OS, then you are ready to install the Operating System.
**Installation**
Once you have the ISO file on a media from which you can boot your system you are ready to continue.
Boot from the Ubuntu GamePack media and you should see a screen similar to Figure 1.
![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/)
**FIGURE 1**
Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click Try Ubuntu to simply load it into memory and try it out without making changes to your drive.
![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/)
**FIGURE 2**
Once you are ready to continue select Install Ubuntu.
The next screen, Figure 3, allows you to specify whether to download any updates for Ubuntu while installing it. You can also choose to install Third Party software for Graphics, WiFi, Flash, MP3 and other updates.
Once you have made your selections, press Continue.
![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/)
**FIGURE 3**
Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click Install Now.
![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/)
**FIGURE 4**
As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click Continue.
![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/)
**FIGURE 5**
Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click Continue once you have set your Time Zone.
![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/)
**FIGURE 6**
A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press Continue.
![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/)
**FIGURE 7**
The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User.
![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/)
**FIGURE 8**
The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart.
![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/)
**FIGURE 9**
After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack.
![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/)
**FIGURE 10**
After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands:
_sudo apt-get update
sudo apt-get upgrade_
Any updates which are not installed should be installed to bring the GamePack system up-to-date.
Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam.
Hope you enjoy the GamePack and have fun!
--------------------------------------------------------------------------------
via: https://www.linux.org/threads/ubuntu-gamepack.4559/
作者:[Jarret B ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.org/members/jarret-b.29858/
[1]:https://ualinux.com/en/download/category/25-ubuntu-gamepack
[2]:https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-%D1%8F%D0%BD%D0%B2%D0%B0%D1%80%D1%8C-2017-pc-vkn99.html

Some files were not shown because too many files have changed in this diff Show More