mirror of
https://github.com/LCTT/TranslateProject.git
synced 2026-08-23 04:03:29 +08:00
归档 201707
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
使用 Apex 和 Compose MongoDB 开发 serverless
|
||||
============
|
||||
|
||||
Apex 是一个将开发和部署 AWS Lambda 函数的过程打包了的工具。它提供了一个本地命令行工具来创建安全上下文、部署函数,甚至追踪云端日志。由于 AWS Lambda 服务将函数看成独立的单元,Apex 提供了一个框架层将一系列函数作为一个项目。另外,它将服务拓展到不仅仅是 Java,Javascript 和 Ptyhon 语言,甚至包括 Go 语言。
|
||||
|
||||
两年前 Express (基本上是 NodeJS 事实标准上的网络框架层)的作者,[离开][12]了 Node 社区,而将其注意力转向 Go (谷歌创造的后端服务语言),以及 Lambda(由 AWS 提供的函数即服务)。尽管一个开发者的行为无法引领一股潮流,但是来看看他正在做的名叫 [Apex][13] 项目会很有趣,因为它可能预示着未来很大一部分网络开发的改变。
|
||||
|
||||
### 什么是 Lambda?
|
||||
|
||||
如今,人们如果不能使用自己的硬件,他们会选择付费使用一些云端的虚拟服务器。在云上,他们会部署一个完整的协议栈如 Node、Express,和一个自定义应用。或者如果他们更进一步使用了诸如 Heroku 或者 Bluemix 之类的新玩意,也可能在某些已经预配置好 Node 的容器中仅仅通过部署应用代码来部署他们完整的应用。
|
||||
|
||||
在这个抽象的阶梯上的下一步是单独部署函数到云端而不是一个完整的应用。这些函数之后可以被一大堆外部事件触发。例如,AWS 的 API 网关服务可以将代理 HTTP 请求作为触发函数的事件,而函数即服务(FaaS)的供应方根据要求执行匹配的函数。
|
||||
|
||||
### Apex 起步
|
||||
|
||||
Apex 是一个将 AWS 命令行接口封装起来的命令行工具。因此,开始使用 Apex 的第一步就是确保你已经安装和配置了从 AWS 获取的命令行工具(详情请查看 [AWS CLI Getting Started][14] 或者 [Apex documentation][15])。
|
||||
|
||||
接下来,安装 Apex:
|
||||
|
||||
```
|
||||
curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh
|
||||
```
|
||||
|
||||
然后为你的新项目创建一个目录并运行:
|
||||
|
||||
```
|
||||
apex init
|
||||
```
|
||||
|
||||

|
||||
|
||||
这步会配置好一些必须的安全策略,并且将项目名字附在函数名后,因为 Lambda 使用扁平化的命名空间。同时它也会创建一些配置文件和默认的 “Hello World" 风格的 Javascript 函数的 functions 目录。
|
||||
|
||||

|
||||
|
||||
Apex/Lambda 一个非常友好的特性是创建函数非常直观。创建一个以你函数名为名的新目录,然后在其中创建项目。如果想要使用 Go 语言,你可以创建一个叫 `simpleGo` 的目录然后在其中创建一个小型的 `main` 函数:
|
||||
|
||||
```
|
||||
// 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
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
Node 是 Lambda 所支持的运行环境,Apex 使用 NodeJS shim 来调用由上述程序产生的二进制文件。它将 `event` 传入二进制文件的 STDIN,将从二进制返回的 STDOUT 作为 `value`。通过 STDERR 来显示日志。`apex.HandleFunc` 用来为你管理所有的管道。事实上在 Unix 惯例里这是一个非常简单的解决方案。你甚至可以通过在本地命令行执行 `go run main.go` 来测试它。
|
||||
|
||||

|
||||
|
||||
|
||||
通过 Apex 向云端部署稍显琐碎:
|
||||
|
||||

|
||||
|
||||
|
||||
注意,这将会对你的函数指定命名空间,控制版本,甚至为其他多开发环境如 `staging` 和 `production`配置`env`。
|
||||
|
||||
通过 `apex invoke` 在云端执行也比较琐碎:
|
||||
|
||||

|
||||
|
||||
当然我们也可以追踪一些日志:
|
||||
|
||||

|
||||
|
||||
这些是从 AWS CloudWatch 返回的结果。它们都在 AWS 的 UI 中可见,但是当在另一个终端参照此结果来署它会更快。
|
||||
|
||||
### 窥探内部的秘密
|
||||
|
||||
来看看它内部到底部署了什么很具有指导性。Apex 将 shim 和所有需要用来运行函数的东西打包起来。另外,它会提前做好配置如入口与安全条例:
|
||||
|
||||

|
||||
|
||||
Lambda 服务实际上接受一个包含所有依赖的 zip 压缩包,它会被部署到服务器来执行指定的函数。我们可以使用 `apex build <functionName>` 在本地创建一个压缩包用来在以后解压以探索。
|
||||
|
||||

|
||||
|
||||
这里的 `_apex_index.js handle` 函数是原始的入口。它会配置好一些环境变量然后进入 `index.js`。
|
||||
|
||||
而 `index.js` 孕育一个 `main` Go 的二进制文件的子进程并且将所有关联联结在一起。
|
||||
|
||||
### 使用 `mgo` 继续深入
|
||||
|
||||
`mgo` 是 Go 语言的 MongoDB 驱动。使用 Apex 来创建一个函数来连接到 Compose 的 MongoDB 就如同我们已经学习过的 `simpleGo` 函数一样直观。这里我们会通过增加一个 `mgoGo` 目录和另一个 `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
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
发布部署,我们可以通过使用正确类型的事件来模拟调用了一个 API:
|
||||
|
||||

|
||||
|
||||
最终结果是 `insert` 到在 [Compose 之上 的 MongoDB][16] 中。
|
||||
|
||||

|
||||
|
||||
### 还有更多……
|
||||
|
||||
尽管目前我们已经涉及了 Apex 的方方面面,但是仍然有很多值得我们去探索的东西。它还和 [Terraform][17] 进行了整合。如果你真的希望,你可以发布一个多语言项目包括 Javascript、Java、Python 以及 Go。你也可以为开发、演示以及产品环境配置多种环境。你可以调整运行资源如调整存储大小和运行时间来调整成本。而且你可以把函数勾连到 API 网关上来传输一个 HTTP API 或者使用一些类似 SNS (简单通知服务)来为云端的函数创建管道。
|
||||
|
||||
和大多数事物一样,Apex 和 Lambda 并不是在所有场景下都完美。 但是,在你的工具箱中增加一个完全不需要你来管理底层建设的工具完全没有坏处。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Hays Hutton 喜欢写代码并写一些与其相关的东西。喜欢这篇文章?请前往[Hays Hutton’s author page][a] 继续阅读其他文章。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/
|
||||
|
||||
作者:[Hays Hutton][a]
|
||||
译者:[xiaow6](https://github.com/xiaow6)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [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&url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&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/&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/
|
||||
@@ -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` 取决于扇区大小(512):70254592 = 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
|
||||
@@ -0,0 +1,477 @@
|
||||
如何为安卓开发搭建一个持续集成(CI)服务器
|
||||
============================================================
|
||||
|
||||
我最近买了新 MacBook Pro 作为我的主要的安卓开发机,我的老式的 MacBookPro(13 寸,2011 年后期发布,16GB 内存, 500G 的固态硬盘,内核是 i5,主频 2.4GHz,64 位),我也没卖,我清理了它,并把他变成了一个 MacOS 和Ubuntu 双引导的持续集成(CI)服务器。
|
||||
|
||||
写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣。好了,现在开始:
|
||||
|
||||
1. 配置一个新的 Ubuntu ,以便运行 Android SDK。
|
||||
2. 安装 Jenkins CI 服务来拉取、编译、运行测试托管在 Github 的多模块 Android 项目。
|
||||
3. 安装 Docker 并在容器中运行 MySQL 服务器和 SonarQube。来运行由 Jenkins 触发的静态代码分析。
|
||||
4. Android app 配置需求。
|
||||
|
||||
### 第一步-安装 Ubuntu:
|
||||
|
||||
我将使用 Ubuntu 作为持续集成的 SO,因为 Ubuntu 有一个强大的社区,它可以解决你遇到的任何问题,而且我个人推荐总是使用 LTS 版本,当前是 16.04 LTS。已经有很多教程教大家在各种硬件上怎么安装了,我就不废话了,贴个下载链接就行了。
|
||||
|
||||
- [下载 Ubuntu Desktop 16.04 LTS][1]
|
||||
|
||||
有人可能很奇怪:用什么桌面版,服务器版多好。额,这个嘛,萝卜青菜,各有所爱。我倒不在乎 UI 占用的那点运算资源。相反,用那一点资源换来生产力的提升我觉得挺值的。
|
||||
|
||||
### 第二步-远程管理:
|
||||
|
||||
#### SSH 服务器
|
||||
|
||||
Ubuntu 桌面版默认安装并没有 ssh 服务器,所以你想远程通过命令行管理的话就只好自己安装。
|
||||
|
||||
```
|
||||
$ sudo apt-get install openssh-server
|
||||
```
|
||||
|
||||
#### NoMachine 远程桌面
|
||||
|
||||
可能你的持续集成服务器没有挨着你,而是在你的路由器后面,或者其它屋子,甚至还可能远离你数里。我试过各种远程桌面方案,不得不说,IMHO NoMachine 在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中)。
|
||||
|
||||
- [NoMachine - 任何人都能用的免费的远程访问工具][3]
|
||||
|
||||
### 第三步-配置环境:
|
||||
|
||||
这里我打算安装 Java8,Git,和 Android SDK,Jenkins 需要它们来拉取、编译和运行 android 项目。
|
||||
|
||||
#### SDKMAN!
|
||||
|
||||
这个超级厉害的命令行工具让你可以安装各种流行的 SDK(比如说,Gradle、Groovy、Grails、Kotlin、 Scala……),并可以以容易方便的方式列出它们和在各个并行版本中切换。
|
||||
|
||||
- [SDKMAN! - SDK 管理器][5]
|
||||
|
||||
它们最近又增加了对 JAVA8 的支持,所以我使用它来安装 Java,而是用流行的 webupd8 仓库。所以在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到。
|
||||
|
||||
安装 SDKMAN! 很容易,执行以下命令即可:
|
||||
|
||||
```
|
||||
$ curl -s "https://get.sdkman.io" | bash
|
||||
```
|
||||
|
||||
#### Oracle JAVA8
|
||||
|
||||
因为我们已经安装了 SDKMAN! ,所以安装 JAVA8 就相当简单了:
|
||||
|
||||
```
|
||||
$ sdk install java
|
||||
```
|
||||
|
||||
或者使用 webupd8 这个仓库:
|
||||
|
||||
- [在 Ubuntu 或 Linux Mint 上通过 PPA 仓库安装 Oracle Java 8 [JDK8]][6]
|
||||
|
||||
#### Git:
|
||||
|
||||
安装git的命令也非常直观,就不废话了。
|
||||
|
||||
```
|
||||
$ sudo apt install git
|
||||
```
|
||||
|
||||
#### Android SDK
|
||||
|
||||
这下面这篇文章的底部
|
||||
|
||||
- [下载 Android Studio 和 SDK Tools | Android Studio][8]
|
||||
|
||||
你可以找到 “Get just the command line tools” 等字样,复制这个链接。比如:
|
||||
|
||||
```
|
||||
https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
|
||||
```
|
||||
|
||||
下载,然后解压到 `/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
|
||||
```
|
||||
|
||||
我们使用 root 用户创建了该目录,所以我们需要重新授权来使我们的主要用户对它可读可写。
|
||||
|
||||
```
|
||||
$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/
|
||||
```
|
||||
|
||||
然后,在 `~/.bashrc` 文件下设置 SDK 的环境变量
|
||||
|
||||
```
|
||||
$ cd
|
||||
$ nano .bashrc
|
||||
```
|
||||
|
||||
在文件底部写入这些行(注意,但要在 SDKMAN! 配置文件前):
|
||||
|
||||
```
|
||||
export ANDROID_HOME="/opt/android-sdk-linux"
|
||||
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"
|
||||
```
|
||||
|
||||
关闭此终端,再打开一个新的终端看看环境变量是否正确生效:
|
||||
|
||||
```
|
||||
$ echo $ANDROID_HOME
|
||||
/opt/android-sdk-linux
|
||||
```
|
||||
|
||||
然后我们启动图形界面的 Android SDK 管理器,并安装你所需的平台和依赖:
|
||||
```
|
||||
$ android
|
||||
```
|
||||
|
||||

|
||||
|
||||
*运行 Android SDK Manager 的图形交互界面*
|
||||
|
||||
|
||||
### 第四步-Jenkins 服务器
|
||||
|
||||
这里,我要讲讲怎么安装、配置该服务器,并创建 Jenkin 任务来拉取、构建和测试 Android 项目,并怎样获取控制台输出。
|
||||
|
||||
#### 安装 Jenkins
|
||||
|
||||
你可以在下面的链接找到 Jenkins 服务器相关信息:
|
||||
|
||||
- [Jenkins][12]
|
||||
|
||||
我们有许多办法运行 Jenkins,比如说运行 .war 文件,作为 Linux 服务,作为 Docker 容器等等。
|
||||
|
||||
我起初是想把它当做 Docker 容器运行,但是后来我意识到正确地配置代码文件夹、android-sdk 文件夹的可见性,和插到运行的 Android 测试机上的物理设备的 USB 可见性简直是一场噩梦。
|
||||
|
||||
少操点心,我最终决定以服务的方式,增加 Stable 仓库的 key 来通过 apt 安装和更新。
|
||||
|
||||
```
|
||||
$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
|
||||
```
|
||||
|
||||
编辑 `source.list`,写入这一行:
|
||||
|
||||
```
|
||||
$ sudo nano /etc/apt/sources.list
|
||||
```
|
||||
|
||||
```
|
||||
#Jenkin Stable
|
||||
deb https://pkg.jenkins.io/debian-stable binary/
|
||||
```
|
||||
|
||||
然后安装:
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get install jenkins
|
||||
```
|
||||
|
||||
在你的用户组里面增加 `jenkins` ,允许其读写 Android SDK 文件夹。
|
||||
|
||||
```
|
||||
$ sudo usermod -a -G 你的用户组 jenkins
|
||||
```
|
||||
|
||||
Jenkins 服务在开机引导时就会被启动,并可通过 http://localhost:8080 访问:
|
||||
|
||||
安装完毕会有一些安全预警信息,跟着引导程序走,你的 Jenkins 就会运行了。
|
||||
|
||||

|
||||
|
||||
*启用安装成功的 Jenkins 服务器。*
|
||||
|
||||
#### Jenkins 配置
|
||||
|
||||
启用成功后,会有提示程序提示你安装插件,单击 “Select plugins to Install” 就可以开始浏览所有插件,然后选择你要安装的插件就 OK 了 。
|
||||
|
||||
* [JUnit 插件][16]
|
||||
* [JaCoCo 插件][18]
|
||||
* [EnvInject 插件][20]
|
||||
* [GitHub 插件][22]
|
||||
|
||||

|
||||
|
||||
*安装 Jenkins 插件*
|
||||
|
||||
创建管理员用户,并完成安装。
|
||||
|
||||
要完成安全需要配置环境变量 `ANDROID_HOME`,`JAVA_HOME`。
|
||||
|
||||
点击 Manage Jenkins,接着 Configure System。
|
||||
|
||||
滚动文件至底部,在全局属性模块中找到环境变量,并增加 `ANDROID_HOMOE`,和 `JAVA_HOME` 变量。
|
||||
|
||||
|
||||

|
||||
|
||||
*给所有 Jenkins 任务增加全局变量*
|
||||
|
||||
#### 创建 Jenkins 任务
|
||||
|
||||
一个 Jenkins 任务定义了一系列不间断的操作。如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手。它只是一个多模块的 app,带有单元测试、Android 测试,包括 JaCoCo、SonarQube 插件。
|
||||
|
||||
- [pamartineza/helloJenkins][24]
|
||||
|
||||
首先创建一个新的 Freestyle 任务项目,取名为 `Hello_Android`。不要在名字中使用空格,这样可以避免与 SonarQube 不兼容的问题。
|
||||
|
||||

|
||||
|
||||
*创建一个 Freestyle Jenkins 任务*
|
||||
|
||||
接下来就是配置了,我给每一部分都做了截屏。
|
||||
|
||||
**概况**
|
||||
|
||||
这部分比较繁琐,你可以在这里变更任务的名字、增加简介。如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,这是 url 的部分,不是仓库的)。
|
||||
|
||||

|
||||
|
||||
*项目 Url 配置*
|
||||
|
||||
**源代码管理**
|
||||
|
||||
这时候我们就要选择我们的 CVS 作为 Git,并且增加仓库的 url(这次就要包括 *.git)然后选择分支拉取。因为这是一个公开的 GitHub 仓库,我们就不需要提交证书了,否则的话就要设置账号和密码。
|
||||
|
||||
相比于使用你的带有完全权限的公开仓库,我更倾向于为你的私有库创建一个新的只读用户来专门配给 Jenkins 任务使用。
|
||||
|
||||
另外,如果你已经使用了双因子认证,Jenkins 就无法拉取代码,所以为 Jenkins 专门创建一个用户可以直接从私有库中拉取代码。
|
||||
|
||||

|
||||
|
||||
*配置仓库*
|
||||
|
||||
**构建触发器**
|
||||
|
||||
你可以手动开始构建,也可以远程地、周期性地、或者在另一个任务构建完成之后开始构建,只要这些改变可以被检测到。
|
||||
|
||||
最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github 为此提供了一个名叫 webhooks 的系统。
|
||||
|
||||
- [Webhooks | GitHub 开发者指南][26]
|
||||
|
||||
这样,我们就可以配置来发送这些事件到 CI 服务器,然后触发构建。显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信。
|
||||
|
||||
你的 CI 服务器也许为了安全只限于内网使用,那么解决办法就只有集中周期性的提交。我就是只有工作时才打开 CI,我把它设置为每十五分钟轮询一次。轮询时间可以通过 CRON 语法设置,如果你不熟悉,请点击右侧的帮助按钮获取带有例子的丰富文档。
|
||||
|
||||

|
||||
|
||||
*仓库轮询配置*
|
||||
|
||||
**构建环境**
|
||||
|
||||
这里我推荐设置构建超时来避免 Jenkings 占用内存和 CPU ,毕竟有时候有意外发生。当然,你还可以插入环境变量和密码等等。
|
||||
|
||||

|
||||
|
||||
*构建超时*
|
||||
|
||||
**构建**
|
||||
|
||||
现在是见证魔法的时刻了,增加一个 Build 步骤,引入 Gradle 脚本,选择 Gradle Wrapper (默认情况下,Android 项目带有 Gradle Wrapper,不要忘记把它检入到 Git ),然后定义你要执行哪些任务:
|
||||
|
||||
1. clean:清除之前构建的所有历史输出,这样可以确保没有东西缓存,从头构建。
|
||||
2. asseembleDebug: 生成调试 .apk 文件。
|
||||
3. test:在所有模块上执行 JUnit 测试。
|
||||
4. connectedDebugAndroidTest:在连接到 CI 的实体机上执行安卓测试单元(也可以使用安装了安卓模拟器的 Jenkins 插件,但是它不支持所有型号,而且相当麻烦)。
|
||||
|
||||

|
||||
|
||||
*配置 Gradle*
|
||||
|
||||
**构建后操作**
|
||||
|
||||
我们将要增加“发布 JUnit 测试报告”,这一步由 JUnit 插件提供,其搜集由 JUnit 测试结果生成的 XML 文件,它会生成漂亮的图表来按时间展示测试结果。
|
||||
|
||||
我们 app 模块中,测试运行结果的路径是: `app/build/test-results/debug/*.xml`。
|
||||
|
||||
在多模块项目中,其它的“纯” Java 模块中测试结果在这里:`*/build/test-results/*.xml`。
|
||||
|
||||

|
||||
|
||||
还要增加“记录 JaCoCo 覆盖率报告”,它要创建一张显示代码覆盖率的图表。
|
||||
|
||||

|
||||
|
||||
#### 运行 Jenkins 任务
|
||||
|
||||
只要有任何改变提交到仓库,我们的测试任务将每十五分钟执行一次,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行。单击“现在构建”按钮,当前的构建将出现在构建历史中,点击它可以查看细节。
|
||||
|
||||

|
||||
|
||||
*手动执行任务*
|
||||
|
||||
最有趣的部分是控制台输出,你可以看到 Jenkins 是如何拉取代码并执行我们之前定义的 Gradle 项目,例如 clean。
|
||||
|
||||

|
||||
|
||||
*控制台输出的开始部分*
|
||||
|
||||
如果一切都正常的话,控制台将会有如下输出 (任何仓库连接问题,单元测试或 Android 测试的失败都将导致构建失败)。
|
||||
|
||||

|
||||
|
||||
*哈哈哈哈,构建成功,测试结果符合预期*
|
||||
|
||||
### 第五步-SonarQube
|
||||
|
||||
这部分我会讲讲如何安装、配置 SonarQube ,并配以使用 Docker 作为容器的 MySQL 数据库。
|
||||
|
||||
- [Continuous Code Quality | SonarQube][28]
|
||||
|
||||
SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净的代码、检测错误和学习最佳体验。它还可以跟踪代码覆盖、测试结果、功能需求等等。SonarQube 检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去。
|
||||
|
||||
- [JetBrains Plugin Repository :: SonarQube Community Plugin][30]
|
||||
|
||||
#### 安装 Docker
|
||||
|
||||
安装 Docker 十分容易,按照下面的教程即可:
|
||||
|
||||
- [在 Ubuntu 上安装 Docker][32]
|
||||
|
||||
#### 生成容器
|
||||
|
||||
**MySQL**
|
||||
|
||||
我们先搭建一个 MySQL5.7.17 服务器容器,命名为 `mysqlserver`,它将在开机引导时启动,带有一个在你的家目录下的本地卷,带有密码,服务暴露在 localhost:3306 上(把命令中的 `YOUR_USER` 和 `YOUR_MYSQL_PASSWORD` 替换为你自己账号密码)。
|
||||
|
||||
```
|
||||
$ 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**
|
||||
|
||||
想要优雅简单地管理 MySQL服务器,我强烈推荐 phpMyAdmin。你只要建立个容器,命名为 `phpmyadmin`,然后链接到我们的 `mysqlserver` 容器,它会在开机引导时启动,它暴露在 localhost:9090。使用最新的版本。
|
||||
|
||||
```
|
||||
$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin
|
||||
```
|
||||
|
||||
你可以用你的 mysql 密码 `YOUR_MYSQL_PASSWORD` ,以 root 身份登录 localhost:9090 的 phpMyAdmin 界面,并创建一个数据库 sonar,使用`uft8_general_ci` 字符集。此外,也创建一个 sonar 的新用户,密码 `YOUR_SONAR_PASSWORD`,并给它 sonar 数据库的权限。
|
||||
|
||||
**SonarQube**
|
||||
|
||||
现在我们已经创建好了我们的 SonarQube 容器,就叫 `sonarqube`,它会在机器引导时启动,自动链接搭配我们的数据库,服务暴露在 localhost:9090,使用 5.6.4 版本。
|
||||
|
||||
```
|
||||
$ 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
|
||||
|
||||
如果一起都正常,你将在 localhost:9000 看到如下页面:
|
||||
|
||||

|
||||
|
||||
好了,让我们来配置必要的插件和基本的配置文件:
|
||||
|
||||
1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin)。
|
||||
2. 进入到 Administration,然后点击 System,接下来是 Updata Center,最后是 Updates Only。
|
||||
* 如果需要的话,更新 Java 插件。
|
||||
3. 现在启用,并安装以下插件
|
||||
* Android (提供 Android lint 规则)
|
||||
* Checkstyle
|
||||
* Findbugs
|
||||
* XML
|
||||
4. 返回顶部,点击重启按钮完成整个安装。
|
||||
|
||||
#### SonarQube 配置文件
|
||||
|
||||
我们刚刚安装的插件可以定义配置文件,可以用一套规则去衡量项目的代码质量。
|
||||
|
||||
同一时间一个项目只能使用一个配置文件。但是我们可以定义父配置文件并继承规则,所以要对我们的项目执行所有的规则,我们可以创建定制的配置文件并链状串联所有配置文件。
|
||||
|
||||
就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile。
|
||||
|
||||
将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,继续此步骤,直到你完成父级继承方案,并且设置 CustomAndroidProfile 作为默认。
|
||||
|
||||

|
||||
|
||||
*继承链*
|
||||
|
||||
#### 运行 Sonarqube 分析器
|
||||
|
||||
现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务 `sonarqube` 到我们的 Jenkins 任务。我们在最后执行。
|
||||
|
||||

|
||||
|
||||
再次运行 Jenkins 任务,一旦运行完毕,我们可以在 localhost:9090 中看到我们的 sonarQube 控制面板。
|
||||
|
||||

|
||||
|
||||
*分析结果的显示*
|
||||
|
||||
点击项目名称我们可以进入到不同的显示界面,最重要的可能就是问题界面了。
|
||||
|
||||
在下一屏,我将展示一个主要问题,它是一个空构造器方法。就我个人而言,使用 SonarQube 最大的好处就是当我点击“...”时可以在屏幕底部显示解释。这是一个学习编程十分有用的技能。
|
||||
|
||||

|
||||
|
||||
### 第六步 附加:配置其他 Android 应用
|
||||
|
||||
想要配置 Android 应用得到覆盖率和 sonarqube 的结果,只要安装 JaCoCo 和 Sonarqube 插件就可以了。你也可以在我的示例中得到更多信息
|
||||
|
||||
- [pamartineza/helloJenkins][34]
|
||||
|
||||
你也可以看看我在云上测试的文章:
|
||||
|
||||
- [使用 Jenkins CI 服务器在云设备上运行 Android 测试][36]
|
||||
|
||||
### 最后
|
||||
|
||||
啊,你终于走到头了,希望你觉得本文有点用处。你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论。我拼了老命也要帮你。哦,忘了提醒,好东西要和朋友分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||

|
||||
|
||||
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]
|
||||
译者:[Taylor1024](https://github.com/Taylor1024)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [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
|
||||
[36]:https://pamartinezandres.com/running-android-tests-on-cloud-devices-using-a-jenkins-ci-server-firebase-test-lab-amazon-device-b67cb4b16c40
|
||||
@@ -0,0 +1,109 @@
|
||||
使用统一阻止列表和白名单来更新主机文件
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
网上有许多持续维护的含有不同垃圾域的有用列表。将这些列表复制到你的主机文件中可以轻松阻止大量的域,你的系统将根本不用去连接它们。此方法可以在不安装浏览器插件的情况下工作,并且将为系统上任何浏览器(和任何其他程序)提供阻止操作。
|
||||
|
||||
在本教程中,我将向你展示如何在 Linux 中启动并运行 Steven Black 的[统一主机脚本][1]。该脚本将使用来自多个来源的最新已知的广告服务器、网络钓鱼网站和其他网络垃圾的地址来更新你的计算机主机文件,同时提供一个漂亮、干净的方式来管理你自己的黑名单/白名单,其分别来自于该脚本管理的各个列表。
|
||||
|
||||
在将 30,000 个域放入主机文件之前,需要注意两点。首先,这些巨大的列表包含可能需要解除封锁的服务器,以便进行在线购买或其他一些临时情况。如果你弄乱了你的主机文件,你要知道网上的某些东西可能会出现问题。为了解决这个问题,我将向你展示如何使用方便的打开/关闭开关,以便你可以快速禁用你的阻止列表来购买喜马拉雅盐雾灯(它是等离子灯)。我仍然认为这些列表的目的之一是将所有的一切都封锁(有点烦人,直到我想到了做一个关闭开关)。如果你经常遇到你需要的服务器被阻止的问题,只需将其添加到白名单文件中即可。
|
||||
|
||||
第二个问题是性能受到了轻微的影响, 因为每次调用一个域时, 系统都必须检查整个列表。只是有一点点影响, 而没有大到让我因此而放弃黑名单,让每一个连接都通过。你具体要怎么选择自己看着办。
|
||||
|
||||
主机文件通过将请求定向到 127.0.0.1 或 0.0.0.0(换句话说定向到空地址)来阻止请求。有人说使用 0.0.0.0 是更快,问题更少的方法。你可以将脚本配置为使用 `-ip nnn.nnn.nnn.nnn` 这样的 ip 选项来作为阻止 ip,但默认值是 0.0.0.0,这是我使用的值。
|
||||
|
||||
我曾经将 Steven Black 的脚本做的事每隔一段时间就手动做一遍,进到每一个站点,将他们的列表拷贝/粘贴到我的主机文件中,做一个查找替换将其中的 127 变成 0 等等。我知道整件事情可以自动化,这样做有点傻,但我从来没有花时间解决这个问题。直到我找到这个脚本,现在这事已经是一个被遗忘的杂务。
|
||||
|
||||
让我们先下载一份最新的 Steven Black 的代码拷贝(大约 150MB),以便我们可以进行下一步。你需要安装 git,因此如果还没安装,进入到终端输入:
|
||||
|
||||
```
|
||||
sudo apt-get install git
|
||||
```
|
||||
|
||||
安装完之后,输入:
|
||||
|
||||
```
|
||||
mkdir unifiedhosts
|
||||
cd unifiedhosts
|
||||
git clone https://github.com/StevenBlack/hosts.git
|
||||
cd hosts
|
||||
```
|
||||
|
||||
当你打开了 Steven 的脚本时,让我们来看看有什么选项。该脚本有几个选项和扩展,但扩展我不会在这里提交,但如果你到了这一步并且你有兴趣,[readme.md][3] 可以告诉你所有你需要知道的。
|
||||
|
||||
你需要安装 python 来运行此脚本,并且与版本有关。要找到你安装的 Python 版本,请输入:
|
||||
|
||||
```
|
||||
python --version
|
||||
```
|
||||
|
||||
如果你还没安装 Python:
|
||||
|
||||
```
|
||||
sudo apt-get install python
|
||||
```
|
||||
|
||||
对于 Python 2.7,如下所示,输入 `python` 来执行脚本。对于 Python 3,在命令中的 `python` 替换成 `python3`。执行后,该脚本会确保它具有每个列表的最新版本,如果没有,它会抓取一个新的副本。然后,它会写入一个新的主机文件,包括了你的黑名单/白名单中的任何内容。让我们尝试使用 `-r` 选项来替换我们的当前的主机文件,而 `-a` 选项可以脚本不会问我们任何问题。回到终端:
|
||||
|
||||
```
|
||||
python updateHostsFile.py -r -a
|
||||
```
|
||||
|
||||
该命令将询问你的 root 密码,以便能够写入 `/etc/`。为了使新更新的列表处于激活状态,某些系统需要清除 DNS 缓存。在同一个硬件设备上,我观察到不同的操作系统表现出非常不同的行为,在没有刷新缓存的情况下不同的服务器变为可访问/不可访问所需的时间长度都不同。我已经看到了从即时更新(Slackware)到重启更新(Windows)的各种情况。有一些命令可以刷新 DNS 缓存,但是它们在每个操作系统甚至每个发行版上都不同,所以如果没有生效,只需要重新启动就行了。
|
||||
|
||||
现在,只要将你的个人例外添加到黑名单/白名单中,并且只要你想要更新主机文件,运行该脚本就好。该脚本将根据你的要求调整生成的主机文件,每次运行文件时会自动追加你额外的列表。
|
||||
|
||||
最后,我们来创建一个打开/关闭开关,对于打开和关闭功能每个都创建一个脚本,所以回到终端输入下面的内容创建关闭开关(用你自己的文本编辑器替换 leafpad):
|
||||
|
||||
```
|
||||
leafpad hosts-off.sh
|
||||
```
|
||||
|
||||
在新文件中输入下面的内容:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
sudo mv /etc/hosts /etc/hostsDISABLED
|
||||
```
|
||||
|
||||
接着让它可执行:
|
||||
|
||||
```
|
||||
chmod +x hosts-off.sh
|
||||
```
|
||||
|
||||
相似地,对于打开开关:
|
||||
|
||||
```
|
||||
leafpad hosts-on.sh
|
||||
```
|
||||
在新文件中输入下面的内容:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
sudo mv /etc/hostsDISABLED /etc/hosts
|
||||
```
|
||||
|
||||
最后让它可执行:
|
||||
|
||||
```
|
||||
chmod +x hosts-on.sh
|
||||
```
|
||||
|
||||
你所需要做的是为每个脚本创建一个快捷方式,标记为 HOSTS-ON 和 HOSTS-OFF,放在你能找到它们的地方。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.darrentoback.com/this-script-updates-hosts-files-using-a-multi-source-unified-block-list-with-whitelisting
|
||||
|
||||
作者:[dmt][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.darrentoback.com/about-me
|
||||
[1]:https://github.com/StevenBlack/hosts
|
||||
[2]:https://github.com/StevenBlack/hosts.git
|
||||
[3]:https://github.com/StevenBlack/hosts/blob/master/readme.md
|
||||
@@ -0,0 +1,54 @@
|
||||
那些乌央乌央的、普普通通的 Ubuntu 用户们
|
||||
============
|
||||
|
||||
> “更好的捕鼠器“ 并不是一个合格生物学家的专用谚语。就像 Ubuntu,它只需要好好工作,而不会让我惊着。
|
||||
|
||||
(LCTT 译注,“做个更好的捕鼠器”是个国外的谚语,意指不断有人发明更好的捕鼠器,然而其实没什么大的意义。)
|
||||
|
||||
### Roblimo 的藏身处
|
||||
|
||||
我从来就不是一个计算机极客。事实上,我在网上第一次小有名气是为 Time/Life 写一个每周专栏的时候,这个专栏的名字是“这台老电脑”。它介绍的是一台古老的设备能够做什么——通常是在上面安装 Linux——在那之后,我又在Andover.net 上开设了一个相同的专栏,名字叫做“廉价计算”,是关于如何在这个世界省钱的——而其它那些大部分在线计算机专栏都是在让你花钱花到你没饭吃(LCTT 译者注:作者的意思是“我算是一股清流了”)。
|
||||
|
||||
据我所知的那些大部分的 Linux 的早期使用者,都痴迷于他们的电脑,还有那些让他们电脑有用的软件。他们乐于仔细研读源代码并且做出一点小小的修改。最关键的是,他们大多是学计算机的,或者是从事 IT 行业的。他们的计算机和计算机网络迷住了他们,就像他们本该那样似的。
|
||||
|
||||
我过去是(现在也是)一个作者,不是一个搞计算机的。于我而言,计算机一直都只是一个工具而已。我希望它们能够老老实实的听话,我让它们做啥就做啥,最多可以出一点点小毛病。我喜欢图形化界面,因为我记不住那么长的命令行来管理我的电脑和网络。当然,我能找到它们,也能输入它们,但是我可不想费劲。
|
||||
|
||||
在 Linux 这个圈子里,有那么一段时间用户很少。“你什么意思?你只是想要你的电脑去写点文章,或者最多添加点 HTML 么?”开发者和管理员这样询问道,好像所有除了编写代码之外的奉献者们都不如他们所贡献的。
|
||||
|
||||
但是尽管面临这些讥笑和嘲讽,我在一次又一次的宣讲和谈话中提出一个像这样的主题:“不要光挠自己的痒痒,也帮你女朋友解决一下啊!还有你的同事,以及那些你最喜欢的饭店的厨子们,还有你的医生。难道你不希望你的医生专注于医治病人,而是在 `apt get` 以及 `grep` 里心烦意乱?“
|
||||
|
||||
所以,是的,因为我希望能够更简单的使用 Linux,我是一个[早期的曼德拉草用户][1],而现在,我是一个快乐的 Ubuntu 使用者。
|
||||
|
||||
为什么是 Ubuntu?你一定是在逗我?为什么不是呢?它是 Linux 发行版中的丰田凯美瑞(或者本田思域)!平凡而卓越。它是如此的流行,你可以在 IRC、LinuxQuestion 社区、 Ubuntu 自己的论坛,以及许许多多的地方得到帮助。
|
||||
|
||||
当然,使用 Debian 或者 Fedora 也是很酷的,还有 Mint 也是开箱即用又华丽万分。但是我依然感兴趣于写一些文章和添加一点点 HTML,以及在浏览器中随时看点什么、在 Google Docs 为一两个公司客气写点什么,随时接收我的邮件,用一张过去或者现在的图片做这做那……基本上我就在电脑上干点这些。
|
||||
|
||||
当这一切都正常的时候,我的桌面是什么样子就没有意义了。我又看不见它!它整个被应用窗口覆盖了!然后我使用了两个显示器,不仅仅是一个。我有……让我数数,17 个标签页打开在两个 Chrome 窗口中。并且 GIMP 在运行中,[Bluefish][2],这个我刚才在使用的东西,用来书写这篇文章。
|
||||
|
||||
所以对我而言,Ubuntu 是我的阻力最小的道路。Mint 或许比较可爱,但是当你使用它的时候去掉它的那些边边角角的修饰,它不就是 Ubuntu 吗?所以如果我是用一个个相同的程序,并且不能看见桌面环境,所以谁还在意它长什么样子?
|
||||
|
||||
有些研究表明 Mint 正在变得更加流行,而有些人说 Debian 更甚。但是在他们的研究中,Ubuntu 永远都是居于最上位的,尽管这一年又一年过去了。
|
||||
|
||||
所以称我为大多数人吧!说我乏味吧!称我为乌央乌央的、普普通通的 Ubuntu 用户吧——至少从现在开始……
|
||||
|
||||
------
|
||||
|
||||
作者简介:
|
||||
|
||||

|
||||
|
||||
Robin "Roblimo" Miller 是一个自由职业作者,并且是开源技术集团的前主编,该公司旗下有 SourceForge、 freshmeat、Linux.com、NewForge、ThinkGeek 以及 Slashdot,并且他直到最近依然在 Slashdot 担任视频编辑。虽然他现在基本上退休了,但他仍然兼任 Grid Dynamics 的社论顾问,而且(显然)在为 FOSS Force 在写文章。
|
||||
|
||||
------
|
||||
|
||||
via: http://fossforce.com/2017/01/many-humble-ubuntu-users/
|
||||
|
||||
作者:[Robin "Roblimo" Miller][a]
|
||||
译者:[svtter](https://github.com/svtter)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: http://www.roblimo.com/
|
||||
[1]: https://linux.slashdot.org/story/00/11/02/2324224/mandrake-72-in-wal-mart-a-good-idea
|
||||
[2]: http://bluefish.openoffice.nl/index.html
|
||||
77
published/201707/20170209 Inside Real-Time Linux.md
Normal file
77
published/201707/20170209 Inside Real-Time Linux.md
Normal file
@@ -0,0 +1,77 @@
|
||||
深入实时 Linux
|
||||
============================================================
|
||||
|
||||
|
||||

|
||||
|
||||
> 实时 Linux 在过去十年中已经走了很长的路。Linutronix 的 Jan Altenberg 提供了对该主题做了概述,并在 ELC Europe 的视频中提供了新的 RTL 性能基准。
|
||||
|
||||
实时 Linux(RTL)是一种启用 PREEMPT_RT 的主线 Linux,在过去十年中已经走了很长的路。大约 80% 的确定性的 [PREEMPT_RT][3] 补丁现在可用于主线内核本身。然而,Linux 上单内核 RTL 的最强大的替代品——双内核 Xenomai——继续声称在减少延迟上有巨大的优势。在去年 10 月的 [欧洲嵌入式 Linux 会议][4]的演讲中,Jan Altenberg 反驳了这些声明,同时对实时主题做了论述。
|
||||
|
||||
德国嵌入式开发公司 [Linutronix][5] 的 Altenberg 并不否认 Xenomai 和 RTAI 等双核方法提供较低的延迟。然而,他揭示了新的 Linutronix 基准,旨在表明差异不如所声称的那样大,特别是在实际使用中。争议较少的是,他认为 RTL 更易于开发和维护。
|
||||
|
||||
在我们深入永恒的 Xenomai 与 RTL 的辩论之前,请注意,2015 年 10 月,[开源自动化开发实验室][6](OSADL)将 RTL 项目的[控制权][7]转移给了管理 Linux.com 的 Linux 基金会。此外,Linutronix 是 RTL 项目的主要贡献者,并承担了 x86 的维护者。
|
||||
|
||||
RTL 的进步是过去十年中 Linux 从实时操作系统(RTOS)中[获得市场占有率][8]的几个原因之一。实时操作系统在微控制器上比应用处理器上更频繁出现,并且在缺乏高级用户级操作系统(如 Linux)的单用途设备上实现实时很简单。
|
||||
|
||||
Altenberg 通过清除关于实时确定性的内核方案的一些常见的误解开始他的演讲。Altenberg 告诉他的 ELCE 观众:“实时不是快速执行,这基本上是决定论和定时保证。实时为你提供保证某些内容将在给定的时间内执行。你不想要尽可能快,但是要尽快指定。”
|
||||
|
||||
在给定的执行时间内的迟缓的反应会导致严重后果,特别是当它可能导致人们受到伤害时,开发人员往往会使用实时的方式。这就是为什么实时性仍然在很大程度上受到工厂自动化行业的推动,并且越来越多地出现在汽车、火车和飞机上。然而,并不总是生死攸关的情况 - 金融服务公司使用 RTL 进行高频交易。
|
||||
|
||||
Altenberg 说:“实时需求包括确定性的定时行为、抢占、优先级继承和优先级上限。最重要的要求是高优先级任务总是需要能够抢占低优先级的任务。”
|
||||
|
||||
Altenberg 强烈建议不要使用术语“软实时”来描述轻量级实时解决方案。“你可以是确定性的或者不是,但两者之间什么也没有。”
|
||||
|
||||
### 双内核实时
|
||||
|
||||
像 Xenomai 和 RTAI 这样的双内核方案部署了一个与单独的 Linux 内核并行运行的微内核,而像 RTL 这样的单内核方案使得 Linux 本身能够实时运行。Altenberg 说:“使用双内核,当优先级实时程序不在微内核上运行时,Linux 可以获得一些运行时间。 “问题是人们需要维护微内核并在新的硬件上支持它。这需要巨大的努力,并且它的开发社区不是很大。另外,由于 Linux 不直接在硬件上运行,所以你需要一个硬件抽象层(HAL)。有两件事要维护,你通常会落后主流内核一步。”
|
||||
|
||||
Altenberg说:“RTL 的挑战以及花了这么久才出现的原因是,要使 Linux 实时,你基本要修改每个内核文件。” 然而,大部分工作已经完成并合并到主线,开发人员并不需要维护一个微内核或 HAL。
|
||||
|
||||
Altenberg 继续解释了 RTAI 和 Xenomai 之间的差异。“使用 RTAI,你将编写一个由微内核调度的内核模块。这就像内核开发 - 真的很难深入,很难调试。”
|
||||
|
||||
RTAI 的开发可能会更加复杂,因为工业用户通常希望包括封闭的源代码以及 GPL 内核代码。 Altenberg 说:“你必须决定哪些部分可以进入用户态,哪些部分可以通过实时的方式进入内核。”
|
||||
|
||||
RTAI 与 RTL 想必支持更少的硬件平台,特别是 x86 之外。双内核 Xenomai 将 RTAI 作为主要的双内核方式,比 RTAI 具有更大的操作系统支持。更重要的是,Altenberg 说:“它提供了“在用户空间中进行实时的合适解决方案。要做到这一点,他们实现了皮肤的概念 - 一个用于不同 RTOS 的 API 的仿真层,比如 POSIX。这使你可以重用一些 RTOS 中的现有代码的子集。”
|
||||
|
||||
然而,使用 Xenomai,你仍然需要维护一个单独的微内核和 HAL。有限的开发工具是另一个问题。Altenberg说:“与 RTAI 一样,你不能使用标准的 C 库。你需要专门的工具和库。即使对于 POSIX 来说,你也必须链接到 POSIX 层,这更复杂。” 他补充说,任何一个平台,很难将超过 8 到 16 个 CPU 的微内核扩展到金融服务中使用的大型服务器集群。
|
||||
|
||||
### 睡眠自旋锁
|
||||
|
||||
主要的单内核解决方案是基于 PREEMPT.RT 的 RTL,它主要由 Thomas Gleixner 和 IngoMolnár 在十多年前开发。PREEMPT.RT 重新生成内核的 “spinlock” 锁定原语,以最大化 Linux 内核中的可抢占部分。(PREEMPT.RT 最初称为睡眠自旋锁补丁)
|
||||
|
||||
PREEMPT.RT 不是在硬中断环境中运行中断处理程序,而是在内核线程中运行它们。Altenberg 说:“当一个中断到达时,你不会运行中断处理程序代码。你只是唤醒相应的内核线程,它运行处理程序。这有两个优点:内核线程可以中断,并且它会显示在进程列表中,有自己的 PID。所以你可以把低优先级的放在不重要的中断上,高优先级的放在重要的用户态任务上。”
|
||||
|
||||
由于大约 80% 的 PREEMPT.RT 已经在主线上,任何 Linux 开发人员都可以使用面向 PREEMPT.RT 的内核组件,如定时器、中断处理程序、跟踪基础架构和优先级继承。Altenberg说:“当他们制作实时 Linux 时,一切都变得可以抢占,所以我们发现了很多竞争条件和锁定问题。我们修复了这些,并把它们推送到主线,以提高 Linux 的稳定性。”
|
||||
|
||||
因为 RTL 主要在 Linux 主线上,Altenberg 说:“PREEMPT.RT 被广泛接受,拥有庞大的社区。如果你编写一个实时应用程序,你不需要知道很多关于 PREEMPT.RT 的知识。你不需要任何特殊的库或 API,只需要标准的 C 库、Linux 驱动程序和 POSIX 程序。”
|
||||
|
||||
你仍然需要运行一个补丁来使用 PREEMPT.RT,它每隔两个 Linux 版本更新一次。然而,在两年内,剩下的 20% 的 PREEMPT.RT 应该会进入 Linux,所以你就“不再需要补丁”了。
|
||||
|
||||
最后,Altenberg 透露了他的 Xenomai 对 RTL 延迟测试的结果。Altenberg说:“有很多论文声称 Xenomai 和 RTAI 的延迟比 PREEMPT.RT 更小。但是我认为大部分时候是 PREEMPT.RT 配置不好的问题。所以我们带来了一个 Xenomai 专家和一个 PREEMPT.RT 专家,让他们配置自己的平台。”
|
||||
|
||||
Altenberg 称,虽然 Xenomai 在大多数测试中表现更好,并且有更少的性能抖动,但是差异不如一些 Xenomai 拥护者声称的高达 300% 至 400% 的延迟优势。当用户空间任务执行测试时,Altenberg 说这是最现实的、最重要的是测试,最糟糕的情况下 Xenomai和 RTL/PREEMPT.RT 都是 90 到 95 微秒的反应时间。
|
||||
|
||||
当他们在双 Cortex-A9 系统中隔离单个 CPU 来处理中断时,Altenberg 表示这相当普遍,PREEMPT.RT 执行得更好,大约80微秒。(有关详细信息,请查看大约第 33 分钟的视频。)
|
||||
|
||||
Altenberg 承认与 OSADL 的两到三年测试相比,他的 12 小时测试是最低标准,而且它不是一个“数学证明”。无论如何,考虑到 RTL 更简单的开发流程,它都值得一试。他总结说:“在我看来,将完整功能的 Linux 系统与微内核进行比较是不公平的。”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/news/event/open-source-summit-na/2017/2/inside-real-time-linux
|
||||
|
||||
作者:[ERIC BROWN][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [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
|
||||
@@ -0,0 +1,75 @@
|
||||
开放组织公开追踪问题的好处
|
||||
============================================================
|
||||
|
||||
> 在开放组织中,在线追踪问题可以将客户转变成伙伴。
|
||||
|
||||

|
||||
|
||||
一个公开的问题追踪器是开放组织的重要沟通工具,和在公开渠道中开展工作相比,没有比这种方式更[透明和包容][6]的方式了。因此,让我们来探讨一下在开放组织中使用问题跟踪器的一些最佳实践。
|
||||
|
||||
在开始之前,我们先来定义“<ruby>问题追踪器<rt>issue tracker</rt></ruby>”的含义。简单地说,问题跟踪器是**一个共享的待办事项列表**。想象一下一张胡乱写的待办事项列表:购买面包、邮件打包、归还图书馆书籍。当你在城里开车时,把列表上的每一项划掉的感觉很好。现在,将它扩展到你需要在组织中完成的工作,并增加合适的软件协作能力。这样你就有一个问题追踪器了!
|
||||
|
||||
无论你使用的是 GitHub 还是其他的,如 Bitbucket、GitLab 或 Trello,问题跟踪器都是与你的伙伴进行协调的正确工具。这对将外部人员_变成_伙伴是至关重要的,这是开放组织的特征之一。那么这是如何工作的?我很高兴你问了这个问题。
|
||||
|
||||
### 使用问题追踪器的最佳实践
|
||||
|
||||
使用公共问题跟踪器将外部人员转换为伙伴的最佳实践是基于过去五年来我们在 [Gratipay][7] 的经验。我们帮助公司和其他组织为开源买单,我们喜欢使用我们的问题跟踪器与我们的社区合作。这就是我们所学到的。
|
||||
|
||||
**0、 隐私优先。** 在这篇文章中谈论公共问题追踪器的隐私看上去是一个奇怪的开始。但是我们必须记住,[开放本身并不是目的][8],任何真诚和真正的开放是建立在安全和认可的坚实基础之上的。不要公开发布客户或其他第三方私下给你的信息,除非你明确提出了要求并且得到了他们的明确同意。采纳一个隐私政策并培训你的人员。[这篇 Gratipay 的政策][9]可供参考。好的!现在这部分清楚之后,让我们继续。
|
||||
|
||||
**1、 默认采用公开决策。** 如果你私下做决策,你就会失去运行一个开放组织的好处,比如表达多样化的想法、招募有活力的人才、实现更大的责任感。即使你的全职员工是最初使用你的公共问题跟踪器的唯一员工,那也要这么做。 避免将你的公共问题追踪器视为二等公民。如果你在办公室进行对话,请在公共问题跟踪器上发布摘要,并在最终决策之前给你的社区留出时间来响应。这是使用问题跟踪器解锁你组织开放权力的第一步:如果它不在问题追踪器中,那就没用!
|
||||
|
||||
**2、 关联其他工具。** 我们许多人都喜欢 IRC 和 Slack,这并不是什么秘密。或者你的组织已经使用 Trello,但是你也想开始使用 GitHub。这没问题!在 GitHub issue 中放入 Trello 卡片的链接很容易,反之亦然。交叉关联保证了被一个或另一个问题困住的外部人员能够发现帮助它们充分理解这个问题的更多相关信息。对于聊天服务,你可能需要配置公共日志记录才能维护关联(隐私注意事项:当你这么做时,请务必在你的频道描述中宣传该事实)。也就是说,你应该在私人 Slack 或其他私人渠道中对话,就像在办公室里面对面的对话一样。换句话说,一定要总结公众问题跟踪器上的对话。看看上面说的:无论离线或在线,如果不在问题跟踪器中,那就没用!
|
||||
|
||||
**3、 将谈话导向追踪器中。** 社交媒体很快就能获得很多反馈,尤其是发现问题,但这不是解决问题的地方。问题跟踪器为深入的对话和分析根本原因留出了空间。更重要的是,它们是为了完成任务而优化的,而不是无限拖延。当问题解决后点击“关闭”按钮的感觉真的很好!现在将公共问题跟踪器作为你的主要工作场所,你可以开始邀请在社交媒体上与你接触的外部人员在追踪器中进一步地讨论。简单的如,“感谢您的反馈!听起来像是(某个公共问题的链接)?” ,这可以在很大程度上向外界传达你的组织没有隐藏的内容,并欢迎他们的参与。
|
||||
|
||||
**4、 设置一个“元”追踪器。** 在一开始,你的问题追踪器很自然聚焦在_具体产品_上。当你准备好开放到一个新的水平时,考虑设置一个关于你的_组织_本身的问题跟踪。在 Gratipay,我们有一个称之为 “Inside Gratipay”的公共问题追踪器,我们愿意在其中讨论我们组织的任何方面,从[我们的预算][10]到[我们的法律结构][11]到[我们的名字][12]。 是的,这有时有点混乱 —— 重命名组织是一个特别激烈的[争议话题][13]!但对我们来说,在社区参与方面的好处是值得的。
|
||||
|
||||
**5、 将你的元追踪器用于加入过程。** 一旦你有一个元问题追踪器,就有了一个新的加入过程:邀请潜在的伙伴创建自己的入场券。如果他们以前从未使用过你的特定的问题追踪器,那么这将是他们学习的极好机会。注册帐号并提交问题应该很简单(如果不是,请考虑切换工具!)。这将让你的新伙伴尽早跨过门槛,开始分享参与感,并在组织内部拥有一席之地。当然,没有问题是愚蠢的,尤其是在某个人的入场券中更是如此。这是你的新伙伴熟悉组织工作方式时询问任何问题的地方。你需要确保快速回复他们的问题,让他们参与并帮助他们融入你的组织。这也是一个很好的方法来记录你最终授予这个人的各种系统的访问权限。至关重要的是,这可以[在雇佣他们之前][14]开始。
|
||||
|
||||
**6、 雷达项目。** 大多数问题跟踪器包括一些组织和排序任务的方法。例如,GitHub 有[里程碑][15]和[项目][16]。这些通常旨在使组织成员的工作重点相一致。在 Gratipay,我们发现使用这些工具可以帮助协作者拥有并排序各自的工作重点。与其它的问题跟踪器通常提供的将问题分配给特定个人的做法不同,我们发现这一点提供了不同的价值。 我可能会关心别人正在积极工作的问题,或者我可能有兴趣开始某些事情,但别人先提出来我也很高兴。拥有自己的项目空间来组织我对该组织的工作的看法是与我的伙伴们沟通“我的雷达上有什么”的强大方式。
|
||||
|
||||
**7、 使用机器人自动化任务。** 最终,你可能会发现某些任务会一再出现。这表明自动化可以简化你的工作流程。在 Gratipay,我们[构建][17]了一个[机器人][18]帮助我们完成一些重复的任务。诚然,这是一个有点高级的用法。如果你达到了这一点,你能完全使用公共问题追踪器来开放你的组织!
|
||||
|
||||
如 Jim Whitehurst 所说 “吸引社区内外参与” ,这些是我们在 Gratipay 内使用我们的问题跟踪器的一些最有用的做法。也就是说,我们一直在学习。如果你有自己的经验分享,请发表评论!
|
||||
|
||||
(题图:opensource.com)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
作者简介:
|
||||
|
||||
Chad Whitacre - 我是 Gratipay 的创始人,Gratipay 是一个开放组织,致力于培育一个感恩、慷慨和爱的经济。我们帮助公司和其它组织为开源买单,以及赞助我们的平台。在线下,我居住在美国宾夕法尼亚州匹兹堡,在线上,我活跃在 GitHub。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/open-organization/17/2/tracking-issues-publicly
|
||||
|
||||
作者:[Chad Whitacre][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/whit537
|
||||
[1]:https://opensource.com/open-organization/resources/leaders-manual?src=too_resource_menu
|
||||
[2]:https://opensource.com/open-organization/resources/field-guide?src=too_resource_menu
|
||||
[3]:https://opensource.com/open-organization/resources/open-org-definition?src=too_resource_menu
|
||||
[4]:https://opensource.com/open-organization/resources/open-decision-framework?src=too_resource_menu
|
||||
[5]:https://opensource.com/open-organization/17/2/tracking-issues-publicly?rate=S5mrFkcwQzkErQQMkHYyaaMxF5j5xtZBHW91EPluD1A
|
||||
[6]:https://opensource.com/open-organization/resources/open-org-definition
|
||||
[7]:https://gratipay.com/
|
||||
[8]:https://opensource.com/open-organization/16/9/openness-means-to-what-end
|
||||
[9]:http://inside.gratipay.com/howto/seek-consent
|
||||
[10]:https://github.com/gratipay/inside.gratipay.com/issues/928
|
||||
[11]:https://github.com/gratipay/inside.gratipay.com/issues/72
|
||||
[12]:https://github.com/gratipay/inside.gratipay.com/issues/73
|
||||
[13]:http://bikeshed.com/
|
||||
[14]:https://opensource.com/open-organization/16/5/employees-let-them-hire-themselves
|
||||
[15]:https://help.github.com/articles/creating-and-editing-milestones-for-issues-and-pull-requests/
|
||||
[16]:https://help.github.com/articles/about-projects/
|
||||
[17]:https://github.com/gratipay/bot
|
||||
[18]:https://github.com/gratipay-bot
|
||||
[19]:https://opensource.com/user/73891/feed
|
||||
[20]:https://opensource.com/users/whit537
|
||||
@@ -0,0 +1,63 @@
|
||||
幼犬式免费:免费软件中的无形消费
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
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
|
||||
93
published/201707/20170213 The decline of GPL.md
Normal file
93
published/201707/20170213 The decline of GPL.md
Normal file
@@ -0,0 +1,93 @@
|
||||
GPL 没落了吗?
|
||||
===================================
|
||||
|
||||

|
||||
Image by : opensource.com
|
||||
|
||||
不久之前我看到了 RedMonk 的 Stephen O'Grady 发了一个[关于开源协议][2]的有趣的推特,那个推特里面有这张图。
|
||||
|
||||

|
||||
|
||||
这张图片显示了从 2010 到 2017 年间各种开源协议之间的使用率的变化。在这张图片里,显然 GPL 2.0 —— 最纯净的 copyleft 协议之一 —— 的使用率降低了一多半。该图表表明,开源项目中 [MIT][3] 协议和 [Apache][4] 协议开始受欢迎。[GPL 3.0][5] 的使用率也有所上涨。
|
||||
|
||||
这些意味着什么?
|
||||
|
||||
为什么 GPL 2.0 的使用率跌的这么多但是 GPL 3.0 仅仅是涨了一丁点?为什么 MIT 协议和 Apache 协议的使用率涨了那么多?
|
||||
|
||||
当然,有很多原因可以解释这件事情,但是我想这是因为商业开源项目的增多,以及商业社会对于 GPL 协议的担心导致的,我们细细掰扯。
|
||||
|
||||
### GPL 协议与商业社会
|
||||
|
||||
我知道我要说的可能会激怒一些 GPL 粉,所以在你们开始喷之前,我想说明的是:我支持 GPL,我也是 GPL 粉丝。
|
||||
|
||||
我写过的所有软件都使用的是 GPL 协议,我也是一直是积极出资支持 [自由软件基金会][6] 以及 [软件自由保护组织][7] 以及他们的工作的,我支持使用 GPL 协议。我在这说的无关 GPL 的合法性或者 GPL 的巨大价值 —— 毫无疑问这是一个好协议 —— 我在这要说的是业内对于这个协议的看法。
|
||||
|
||||
大概四年之前,我参加了一个叫做<ruby>开源智库<rt>Open Source Think Tank</rt></ruby>的峰会。这个峰会是一个私人小型峰会,每年都会把各大开源企业的管理人员请到加利福尼亚的酒庄。这个峰会聚焦于建立关系、构建联盟,找到并解决行业问题。
|
||||
|
||||
在这个峰会上,有一个分组研究,在其中,与会者被分成小组,被要求给一个真实存在的核心的开源技术推荐一个开源协议。每个小组都给出了回应。不到十分之一的小组推荐了宽容许可证,没有人推荐 GPL 许可证。
|
||||
|
||||
我看到了开源行业对于 Apache 协议以及 MIT 协议的逐步认可,但是他们却对花时间理解、接受和熟悉 GPL 这件事高高挂起。
|
||||
|
||||
在这几年里,这种趋势仍在蔓延。除了 Black Duck 的调查之外, 2015 年 [GitHub 上的开源协议调查][8] 也显示 MIT 是人们的首选。我还能看到,在我工作的 XPRIZE (我们为我们的 [Global Learning XPRIZE][9] 选择了开源协议),在我作为[社区领导顾问][10]的工作方面,我也能感觉到那种倾向,因为越来越多的客户觉得把他们的代码用 GPL 发布不舒服。
|
||||
|
||||
随着 [大约 65% 的公司对开源事业做贡献][11] ,自从 2010 年以后显然开源行业已经引来了不少商业兴趣和投资。我相信,我之前说的那些趋势,已经表明这行业不认为 GPL 适合搞开源生意。
|
||||
|
||||
### 连接社区和公司
|
||||
|
||||
说真的,GPL 的没落不太让人吃惊,因为有如下原因。
|
||||
|
||||
首先,开源行业已经转型升级,它要在社区发展以及……你懂的……真正能赚钱的商业模型中做出均衡,这是它们要做的最重要的决策。在开源思想发展之初,人们有种误解说,“如果你搞出来了,他们就会用”,他们确实会来使用你的软件,但是在很多情况下,都是“如果你搞出来了,他们不是一定要给你钱。”
|
||||
|
||||
随着历史的进程,我们看到了许多公司,比如 Red Hat、Automattic、Docker、Canonical、Digital Ocean 等等等等,探索着在开源领域中赚钱的法子。他们探索过分发模式、服务模式,核心开源模式等等。现在可以确定的是,传统的商业软件赚钱的方式已经不再适用开源软件;因此,你得选择一个能够支持你的公司的经营方式的开源协议。在赚钱和免费提供你的技术之间找到平衡在很多情况下是很困难的一件事。
|
||||
|
||||
这就是我们看到那些变化的原因。尽管 GPL 是一个开源协议,但是它根本上是个自由软件协议,作为自由软件协议,它的管理以及支持是由自由软件基金会提供的。
|
||||
|
||||
我喜欢自由软件基金会的作品,但是他们已经把观点局限于软件必须 100% 绝对自由。对于自由软件基金会没有多少可以妥协的余地,甚至很多出名的开源项目(比如很多 Linux 发行版)仅仅是因为一丁点二进制固件就被认为是 “非自由” 软件。
|
||||
|
||||
对于商业来说,最复杂的是它不是非黑即白的,更多的时候是两者混合的灰色,很少有公司有自由软件基金会(或者类似的组织,比如软件自由保护组织)的那种纯粹的理念,因此我想那些公司也不喜欢选择和那些理念相关的协议。
|
||||
|
||||
我需要说明,我不是在这是说自由软件基金会以及类似的组织(比如软件自由保护组织)的错。他们有着打造完全自由的软件的目标,对于他们来说,走它们选择的路十分合理。自由软件基金会以及软件自由保护组织做了_了不起_的工作,我将继续支持这些组织以及为他们工作的人们。我只是觉得这种对纯粹性的高要求的一个后果就是让那些公司认为自己难以达到要求,因此,他们使用了非 GPL 的其他协议。
|
||||
|
||||
我怀疑 GPL 的使用是随着开源软件增长而变化的。在以前,启动(开源)项目的根本原因之一是对开放性和软件自由的伦理因素的严格关注。GPL 无疑是项目的自然选择,Debian、Ubuntu、Fedora 和 Linux 内核以及很多都是例子。
|
||||
|
||||
近年来,尽管我们已经看到了不再那么挑剔的一代开发者的出现,但是如果我说的过激一些,他们缺少对于自由的关注。对于他们来说开源软件是构建软件的务实、实用的一部分,而无关伦理。我想,这就是为什么我们发现 MIT 和 Apache 协议的流行的原因。
|
||||
|
||||
### 未来 ?
|
||||
|
||||
这对于 GPL 意味着什么?
|
||||
|
||||
我的猜想是 GPL 依然将是一个主要选项,但是开发者将将之视为纯粹的自由软件协议。我想对于软件的纯粹性有高要求的项目会优先选择 GPL 协议。但是对于商业软件,为了保持我们之前讨论过的那种平衡,他们不会那么做。我猜测, MIT 以及 Apache 依然会继续流行下去。
|
||||
|
||||
不管怎样,好消息是开源/自由软件行业确实在增长。无论使用的协议会发生怎样的变化,技术确实变得更加开放,可以接触,人人都能使用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Jono Bacon - Jono Bacon 是一位领袖级的社区管理者、演讲者、作者和播客主。他是 Jono Bacon 咨询公司的创始人,提供社区战略和执行、开发者流程和其它的服务。他之前任职于 GitHub、Canonical 和 XPRIZE、OpenAdvantage 的社区总监,并为大量的组织提供咨询和顾问服务。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/2/decline-gpl
|
||||
|
||||
作者:[Jono Bacon][a]
|
||||
译者:[name1e5s](https://github.com/name1e5s)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/jonobacon
|
||||
[1]:https://opensource.com/article/17/2/decline-gpl?rate=WfBHpUyo5BSde1SNTJjuzZTJbjkZTES77tcHwpfTMdU
|
||||
[2]:https://twitter.com/sogrady/status/820001441733607424
|
||||
[3]:https://opensource.org/licenses/MIT
|
||||
[4]:http://apache.org/licenses/
|
||||
[5]:https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
[6]:http://www.fsf.org/
|
||||
[7]:https://sfconservancy.org/
|
||||
[8]:https://github.com/blog/1964-open-source-license-usage-on-github-com
|
||||
[9]:http://learning.xprize.org/
|
||||
[10]:http://www.jonobacon.org/consulting
|
||||
[11]:https://opensource.com/business/16/5/2016-future-open-source-survey
|
||||
[12]:https://opensource.com/user/26312/feed
|
||||
[13]:https://opensource.com/article/17/2/decline-gpl#comments
|
||||
[14]:https://opensource.com/users/jonobacon
|
||||
@@ -0,0 +1,54 @@
|
||||
Linus Torvalds 说:谈论技术创新是愚蠢的,闭上嘴把事情做好
|
||||
============================================================
|
||||
|
||||
> 来自 Linux 内核首领的最佳生活提示。
|
||||
|
||||

|
||||
|
||||
**OSLS 报道:** Linus Torvalds 认为,技术行业的创新庆祝活动是沾沾自喜,自我陶醉和自私自利的。
|
||||
|
||||
他所使用的艺术化术语更为直率:“行业的创新如此之多都是胡说。” 他说:“人人创新——不要做这种‘不同思考’,这是无意义的,它们有百分之九十九只是工作而已。”
|
||||
|
||||
周三在加利福尼亚州召开的[开源领袖峰会(OSLS)][5]中,Linux 基金会执行总监 Jim Zemlin 采访了 Linus,讨论了他如何管理 Linux 内核的开发和他对工作的态度。
|
||||
|
||||
Torvalds 说:“所有的炒作都不是真正的工作,真正的工作是在细节之中。”
|
||||
|
||||
Torvalds 表示赞成这样一个观点,即成功的项目是 99% 的汗水,百分之一的创新。
|
||||
|
||||
作为[开源 Linux 内核][6]的创造者和仁慈独裁者,不用提还是 Git 分布式版本控制系统的发明者,Torvalds 已经证明他的方法产生了结果。Linux 对技术行业的影响已经不用再夸大了。Linux 是服务器的主要操作系统,几乎所有的高性能计算都运行在 Linux 上,而大多数移动设备和嵌入式设备都依赖于 Linux。
|
||||
|
||||
Linux 内核可能是 PC 时代最成功的技术协作项目。根据 Zemlin 的说法,内核贡献者自 2005 年以来总共增加了 13500 多个,其中每天大约增加 10000 行代码,移除 8000 行代码,修改 1500 到 1800 行代码,而且这一直在继续 —— 虽然不是一直以目前的速度 —— 但这已经超过了二十五年。
|
||||
|
||||
Torvalds 说:“我们已经这样做了 25 年,而且我们遇到的一个常见问题是人们彼此需要磨合。所以组织代码、组织代码流、[以及]组织我们的维护关系构成了我们的历史,最终那些痛点,我说的是代码争议,基本上消失了。”
|
||||
|
||||
Torvalds 解释说,该项目的结构使人们能够独立工作。他说:“我们已经能够真正模块化代码和开发模式,所以我们可以并行做很多事情。”
|
||||
|
||||
Torvalds 说,技术起着明显的作用,但流程至少是同样重要的。
|
||||
|
||||
Torvalds 说:“这是一个社会化项目。这是技术层面的东西,而技术是让人们能够就问题达成一致的东西,因为……它通常有非常明确的对和错。”
|
||||
|
||||
但是现在 Torvalds 并没有像 20 年前一样对每一个变化进行审查,而是依靠贡献者的社交网络。他说:“这是社交网络和信任,并且我们有一个非常强大的网络,这就是为什么我们可以有一千人参与到每个发布当中。”
|
||||
|
||||
对信任的重视解释了参与内核开发的困难,因为人们不可以登录、提交代码然后消失不见。Torvalds 说:“你要提交很多小的补丁直到维护者信任你才行,在这一点上,你不仅仅是一个提交补丁的人,而是成为信任网络的一部分。”
|
||||
|
||||
十年前,Torvalds 表示,他告诉其他内核贡献者,他希望有一个八周的发布时间表,而不是可能拖延几年的发布周期。内核开发人员设法将其发布周期减少到大约两个半月。从那时起,开发工作就一直很平稳。
|
||||
|
||||
Torvalds 说:“说我们的流程有多么好很无聊。对于我来说,所有真正紧张的时刻都是关于流程的,它们和代码无关,当代码不工作时,这实际上是令人高兴的……流程问题是很痛苦的。你永远不会想有流程问题……尤其是当人们开始彼此生气时。”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/
|
||||
|
||||
作者:[Thomas Claburn][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.theregister.co.uk/Author/3190
|
||||
[1]:https://www.reddit.com/submit?url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&title=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds
|
||||
[2]:https://twitter.com/share?text=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds&url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&via=theregister
|
||||
[3]:https://www.linkedin.com/shareArticle?mini=true&url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&title=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds&summary=A%20top%20life%20tip%2C%20there%2C%20from%20the%20Linux%20kernel%20chieftain
|
||||
[4]:http://www.theregister.co.uk/Author/3190
|
||||
[5]:https://www.theregister.co.uk/2017/02/14/the_government_is_coming_for_your_code/
|
||||
[6]:https://www.kernel.org/
|
||||
@@ -0,0 +1,66 @@
|
||||
在物联网中使用脚本语言面临的挑战与对策
|
||||
============================================================
|
||||
|
||||
|
||||

|
||||
|
||||
> 在即将到来的嵌入式 Linux 会议 + OpenIoT 峰会中,Paul Sokolovsky 将会讨论在嵌入式开发中使用脚本语言的一些挑战。
|
||||
|
||||
脚本语言(又称作<ruby>超高级语言<rt>Very High-Level Languages</rt></ruby>或 VHLLs ),例如 Python、 PHP 以及 JavaScript 常用在桌面、服务器和网页开发中。它们强大的内置功能能够让你花费少量的时间和精力来开发小型却有用的应用,Paul Sokolovsky,Linaro 公司物联网工程师如是说。然而,目前在物联网中使用超高级语言深度开发嵌入式应用相对来说有些别扭。
|
||||
|
||||
在即将到来的[嵌入式 Linux 会议][6] + [OpenIoT 峰会][7]中,Sokolovsky 会讨论在嵌入式开发中使用 VHLLs 的挑战并且基于 MicroPython 的例子与 JerryScript + Zephyr.js 项目比较不同的对策。 我们与Sokolovsky 进行了一番交谈来获得更多信息。
|
||||
|
||||
**Linux.com:您可以给我们的读者一些 VHLLs 的背景知识吗?**
|
||||
|
||||
Paul Sokolovsky: 超高级语言成为计算机科学和信息技术风景中的一部分已经几十年了。也许第一个流行的脚本语言是 Unix shell(sh),尽管由于较小的特征集,它很少被认为是一种超高级语言,而是一种特定领域语言。所以第一个真正破纪录的 VHLLs 是 Perl(1987)和 Tcl(1988),很快紧跟着出现了 Python(1991),Ruby(1995),PHP(1995),JavaScript(1995)以及许多其它语言。
|
||||
|
||||
不同 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 峰会上的演讲会涵盖使用两种嵌入式脚本语言的经验和成就:MicroPython(Python3 的子集)和 Zephyr.js(JavaScript/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&utm_campaign=elc17&utm_medium=blog&utm_content=video-blog
|
||||
[6]:http://events.linuxfoundation.org/events/embedded-linux-conference
|
||||
[7]:https://events.linuxfoundation.org/events/openiot-summit/program/schedule
|
||||
@@ -0,0 +1,80 @@
|
||||
GitHub 对软件开发业造成的冲击
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
在未来的 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
|
||||
@@ -0,0 +1,65 @@
|
||||
与开放社区讨论法律事宜的 7 种方式
|
||||
============================================================
|
||||
|
||||
> 你的组织的律师准备好与开源社区打交道了么?不要让他们犯这些错。
|
||||
|
||||

|
||||
|
||||
我注意到有相当多的人尝试与[开源推进联盟的许可证评估社区] [3]以及 [Apache 软件基金会的法律事务委员会][4]建立沟通,当轮到_你_与开放社区进行法律讨论时,我想提供一些成功的提示和技巧。
|
||||
|
||||
### 不要代理人
|
||||
|
||||
首先,也是最重要的是,要确保进行谈话的人员既是_有资格的_,也是_有授权的_。不要用代理人,这只会让社区沮丧,他们很快会发现你的代表总是扮演二手车推销员的角色并且要求到后面的房间交易。显然,法律讨论将涉及公司的一个团队,可能涉及产品管理、工程和内部咨询。 但代表们需要能够自己控制谈话内容,不要总是引用幕后某个匿名人物的话。
|
||||
|
||||
### 多边主义
|
||||
|
||||
开源社区就安全合作所需的确定性达成了难得一致的共识。这种共识体现在其治理中,尤其是在他们使用的开源许可证中。所以当你提出一个新的提案时,就不像是一个普通的商业交易。这些是双边谈判,以双方的自由为代价来创造一个最佳妥协的和平条约。在这个讨论中,你只是许多方面之一,你需要解释为什么你的提案对所有人都有益。写上多边之间的调整本质上是缓慢的,所以不要设置最后期限。无论你做什么,不要建议对开源许可证进行更改!
|
||||
|
||||
### 首先学习
|
||||
|
||||
现有的共识和过程其存在是有原因的。你应该了解每个元素的原因,最好连同其发生的历史一起了解,然后再提出修改。这样,你可以在进一步发展的背景下表达你的提案,这样你可以避免在社区历史中受教育(浪费社区资源,降低你机会的有效性)。回看邮件列表,并向开发人员询问历史和来龙去脉。
|
||||
|
||||
### 透明
|
||||
|
||||
开源开发人员使用一个迭代、增量修改的过程。即使需要大的变化,它几乎总是用一系列更小、更好的解释或不言而喻的正确变化来实现的,这样每个人都可以跟进并支持。你提出的更改也是如此。不要弄出新的贡献者协议或者修改过的许可证,并期望每个人都相信你是专家、一切都是对的。你需要提供一根“红线”(相当于法律文件的差异),记录每个变化,并提供一个承认任何社区影响并为其辩护的理由。如果你_只是_为了你自己的利益需要一个东西,那就承认它,而不是希望没有人会注意到。
|
||||
|
||||
### 谦逊
|
||||
|
||||
你是一个炙手可热的律师,而你认为只有程序员才使用邮件列表。很明显,对你而言他们缺乏讨论的经验,所以你安排了一个你认为是同等的代理人,简化这一切,或者提出与社区选择的律师进行一对一的讨论。 我很抱歉地说你做的全都是错的。由于社区的政策是多边协商一致的,所以他们很有可能知道他们为什么定下现在的这些决定。名单上的一些人将具有优秀的领域知识,可能会比你的更好。而且一对一这件事是终极的羞辱,就像询问是否有一个成年人可以与你说话。
|
||||
|
||||
### 不要秘密渠道
|
||||
|
||||
有可能在某种领导机构,也许你认识在公司法务工作的 VP,也许你认识社区的总法律顾问。虽然在某些情况下,询问如何操控流程的提示可能是可以接受的,但尝试通过秘密渠道讨论或协商来试图影响甚至决定结果,那么结果会很糟糕。你最终可能会被邀请进行一对一的讨论, 但你不应该要求或期待它。
|
||||
|
||||
### 成为一个成员
|
||||
|
||||
如果你一切都做得正确,那么社区就有可能尊重你。坚持这些。作为一名冷静、机智的贡献者建立你的声誉。当人们犯你犯过的错误(或者已避免的)时,帮助他们。作为邮件列表社区的值得信赖的参与者,你是项目和雇主的真正资产。继续贡献,一些项目最终会在它们的治理中为你提供一个角色。
|
||||
|
||||
_这个文章的早期版本[最初发表][1]在 Meshed Insights 中。_
|
||||
|
||||
(题图: opensource.com)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Simon Phipps - 计算机行业和开源老手 Simon Phipps 上线了 Public Software,一个欧洲的开源项目托管,Document Foundation 的志愿者总监。他的帖子由 Patreon 赞助者赞助 - 如果你想要看更多,成为其中一个!
|
||||
|
||||
------------
|
||||
|
||||
via: https://opensource.com/open-organization/17/3/legal-matters-community
|
||||
|
||||
作者:[Simon Phipps][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/simonphipps
|
||||
[1]:https://meshedinsights.com/2017/02/28/engaging-communities-on-legal-matters-7-tips/
|
||||
[2]:https://opensource.com/open-organization/17/3/legal-matters-community?rate=gSFbyOzBTIipXOdeeL-GVIT1BYoC4f61FKZJ7KRg3d0
|
||||
[3]:https://opensource.org/approval
|
||||
[4]:https://www.apache.org/legal/
|
||||
[5]:https://opensource.com/user/12532/feed
|
||||
[6]:https://opensource.com/open-organization/17/3/legal-matters-community#comments
|
||||
[7]:https://opensource.com/users/simonphipps
|
||||
@@ -0,0 +1,320 @@
|
||||
开发一个 Linux 调试器(三):寄存器和内存
|
||||
============================================================
|
||||
|
||||
上一篇博文中我们给调试器添加了一个简单的地址断点。这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器、观察状态和改变程序的行为。
|
||||
|
||||
### 系列文章索引
|
||||
|
||||
随着后面文章的发布,这些链接会逐渐生效。
|
||||
|
||||
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` 中寄存器结构体相同。
|
||||
|
||||
```
|
||||
enum class reg {
|
||||
rax, rbx, rcx, rdx,
|
||||
rdi, rsi, rbp, rsp,
|
||||
r8, r9, r10, r11,
|
||||
r12, r13, r14, r15,
|
||||
rip, rflags, cs,
|
||||
orig_rax, fs_base,
|
||||
gs_base,
|
||||
fs, gs, ss, ds, es
|
||||
};
|
||||
|
||||
constexpr std::size_t n_registers = 27;
|
||||
|
||||
struct reg_descriptor {
|
||||
reg r;
|
||||
int dwarf_r;
|
||||
std::string name;
|
||||
};
|
||||
|
||||
const std::array<reg_descriptor, n_registers> g_register_descriptors {{
|
||||
{ reg::r15, 15, "r15" },
|
||||
{ reg::r14, 14, "r14" },
|
||||
{ reg::r13, 13, "r13" },
|
||||
{ reg::r12, 12, "r12" },
|
||||
{ reg::rbp, 6, "rbp" },
|
||||
{ reg::rbx, 3, "rbx" },
|
||||
{ reg::r11, 11, "r11" },
|
||||
{ reg::r10, 10, "r10" },
|
||||
{ reg::r9, 9, "r9" },
|
||||
{ reg::r8, 8, "r8" },
|
||||
{ reg::rax, 0, "rax" },
|
||||
{ reg::rcx, 2, "rcx" },
|
||||
{ reg::rdx, 1, "rdx" },
|
||||
{ reg::rsi, 4, "rsi" },
|
||||
{ reg::rdi, 5, "rdi" },
|
||||
{ reg::orig_rax, -1, "orig_rax" },
|
||||
{ reg::rip, -1, "rip" },
|
||||
{ reg::cs, 51, "cs" },
|
||||
{ reg::rflags, 49, "eflags" },
|
||||
{ reg::rsp, 7, "rsp" },
|
||||
{ reg::ss, 52, "ss" },
|
||||
{ reg::fs_base, 58, "fs_base" },
|
||||
{ reg::gs_base, 59, "gs_base" },
|
||||
{ reg::ds, 53, "ds" },
|
||||
{ reg::es, 50, "es" },
|
||||
{ reg::fs, 54, "fs" },
|
||||
{ reg::gs, 55, "gs" },
|
||||
}};
|
||||
```
|
||||
|
||||
如果你想自己看看的话,你通常可以在 `/usr/include/sys/user.h` 找到寄存器数据结构,另外 DWARF 寄存器编号取自 [System V x86_64 ABI][11]。
|
||||
|
||||
现在我们可以编写一堆函数来和寄存器交互。我们希望可以读取寄存器、写入数据、根据 DWARF 寄存器编号获取值,以及通过名称查找寄存器,反之类似。让我们先从实现 `get_register_value` 开始:
|
||||
|
||||
```
|
||||
uint64_t get_register_value(pid_t pid, reg r) {
|
||||
user_regs_struct regs;
|
||||
ptrace(PTRACE_GETREGS, pid, nullptr, ®s);
|
||||
//...
|
||||
}
|
||||
```
|
||||
|
||||
`ptrace` 使得我们可以轻易获得我们想要的数据。我们只需要构造一个 `user_regs_struct` 实例并把它和 `PTRACE_GETREGS` 请求传递给 `ptrace`。
|
||||
|
||||
现在根据要请求的寄存器,我们要读取 `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),
|
||||
[r](auto&& rd) { return rd.r == r; });
|
||||
|
||||
return *(reinterpret_cast<uint64_t*>(®s) + (it - begin(g_register_descriptors)));
|
||||
```
|
||||
|
||||
到 `uint64_t` 的转换是安全的,因为 `user_regs_struct` 是一个标准布局类型,但我认为指针算术技术上是<ruby>未定义的行为<rt>undefined behavior</rt></ruby>。当前没有编译器会对此产生警告,我也懒得修改,但是如果你想保持最严格的正确性,那就写一个大的 switch 语句。
|
||||
|
||||
`set_register_value` 非常类似,我们只是写入该位置并在最后写回寄存器:
|
||||
|
||||
```
|
||||
void set_register_value(pid_t pid, reg r, uint64_t value) {
|
||||
user_regs_struct regs;
|
||||
ptrace(PTRACE_GETREGS, pid, nullptr, ®s);
|
||||
auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
|
||||
[r](auto&& rd) { return rd.r == r; });
|
||||
|
||||
*(reinterpret_cast<uint64_t*>(®s) + (it - begin(g_register_descriptors))) = value;
|
||||
ptrace(PTRACE_SETREGS, pid, nullptr, ®s);
|
||||
}
|
||||
```
|
||||
|
||||
下一步是通过 DWARF 寄存器编号查找。这次我会真正检查一个错误条件以防我们得到一些奇怪的 DWARF 信息。
|
||||
|
||||
```
|
||||
uint64_t get_register_value_from_dwarf_register (pid_t pid, unsigned regnum) {
|
||||
auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
|
||||
[regnum](auto&& rd) { return rd.dwarf_r == regnum; });
|
||||
if (it == end(g_register_descriptors)) {
|
||||
throw std::out_of_range{"Unknown dwarf register"};
|
||||
}
|
||||
|
||||
return get_register_value(pid, it->r);
|
||||
}
|
||||
```
|
||||
|
||||
就快完成啦,现在我们已经有了寄存器名称查找:
|
||||
|
||||
```
|
||||
std::string get_register_name(reg r) {
|
||||
auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
|
||||
[r](auto&& rd) { return rd.r == r; });
|
||||
return it->name;
|
||||
}
|
||||
|
||||
reg get_register_from_name(const std::string& name) {
|
||||
auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
|
||||
[name](auto&& rd) { return rd.name == name; });
|
||||
return it->r;
|
||||
}
|
||||
```
|
||||
|
||||
最后我们会添加一个简单的帮助函数用于导出所有寄存器的内容:
|
||||
|
||||
```
|
||||
void debugger::dump_registers() {
|
||||
for (const auto& rd : g_register_descriptors) {
|
||||
std::cout << rd.name << " 0x"
|
||||
<< std::setfill('0') << std::setw(16) << std::hex << get_register_value(m_pid, rd.r) << std::endl;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
正如你看到的,iostreams 有非常精确的接口用于美观地输出十六进制数据(啊哈哈哈哈哈哈)。如果你喜欢你也可以通过 I/O 操纵器来摆脱这种混乱。
|
||||
|
||||
这些已经足够支持我们在调试器接下来的部分轻松地处理寄存器,所以我们现在可以把这些添加到我们的用户界面。
|
||||
|
||||
### 显示我们的寄存器
|
||||
|
||||
这里我们要做的就是给 `handle_command` 函数添加一个命令。通过下面的代码,用户可以输入 `register read rax`、 `register write rax 0x42` 以及类似的语句。
|
||||
|
||||
```
|
||||
else if (is_prefix(command, "register")) {
|
||||
if (is_prefix(args[1], "dump")) {
|
||||
dump_registers();
|
||||
}
|
||||
else if (is_prefix(args[1], "read")) {
|
||||
std::cout << get_register_value(m_pid, get_register_from_name(args[2])) << std::endl;
|
||||
}
|
||||
else if (is_prefix(args[1], "write")) {
|
||||
std::string val {args[3], 2}; //assume 0xVAL
|
||||
set_register_value(m_pid, get_register_from_name(args[2]), std::stol(val, 0, 16));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### 接下来做什么?
|
||||
|
||||
设置断点的时候我们已经读取和写入内存,因此我们只需要添加一些函数用于隐藏 `ptrace` 调用。
|
||||
|
||||
```
|
||||
uint64_t debugger::read_memory(uint64_t address) {
|
||||
return ptrace(PTRACE_PEEKDATA, m_pid, address, nullptr);
|
||||
}
|
||||
|
||||
void debugger::write_memory(uint64_t address, uint64_t value) {
|
||||
ptrace(PTRACE_POKEDATA, m_pid, address, value);
|
||||
}
|
||||
```
|
||||
|
||||
你可能想要添加支持一次读取或者写入多个字节,你可以在每次希望读取另一个字节时通过递增地址来实现。如果你需要的话,你也可以使用 [`process_vm_readv` 和 `process_vm_writev`][12] 或 `/proc/<pid>/mem` 代替 `ptrace`。
|
||||
|
||||
现在我们会给我们的用户界面添加命令:
|
||||
|
||||
```
|
||||
else if(is_prefix(command, "memory")) {
|
||||
std::string addr {args[2], 2}; //assume 0xADDRESS
|
||||
|
||||
if (is_prefix(args[1], "read")) {
|
||||
std::cout << std::hex << read_memory(std::stol(addr, 0, 16)) << std::endl;
|
||||
}
|
||||
if (is_prefix(args[1], "write")) {
|
||||
std::string val {args[3], 2}; //assume 0xVAL
|
||||
write_memory(std::stol(addr, 0, 16), std::stol(val, 0, 16));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 给 `continue_execution` 打补丁
|
||||
|
||||
在我们测试我们的更改之前,我们现在可以实现一个更健全的 `continue_execution` 版本。由于我们可以获取程序计数器,我们可以检查我们的断点映射来判断我们是否处于一个断点。如果是的话,我们可以停用断点并在继续之前跳过它。
|
||||
|
||||
为了清晰和简洁起见,首先我们要添加一些帮助函数:
|
||||
|
||||
```
|
||||
uint64_t debugger::get_pc() {
|
||||
return get_register_value(m_pid, reg::rip);
|
||||
}
|
||||
|
||||
void debugger::set_pc(uint64_t pc) {
|
||||
set_register_value(m_pid, reg::rip, pc);
|
||||
}
|
||||
```
|
||||
|
||||
然后我们可以编写函数来跳过断点:
|
||||
|
||||
```
|
||||
void debugger::step_over_breakpoint() {
|
||||
// - 1 because execution will go past the breakpoint
|
||||
auto possible_breakpoint_location = get_pc() - 1;
|
||||
|
||||
if (m_breakpoints.count(possible_breakpoint_location)) {
|
||||
auto& bp = m_breakpoints[possible_breakpoint_location];
|
||||
|
||||
if (bp.is_enabled()) {
|
||||
auto previous_instruction_address = possible_breakpoint_location;
|
||||
set_pc(previous_instruction_address);
|
||||
|
||||
bp.disable();
|
||||
ptrace(PTRACE_SINGLESTEP, m_pid, nullptr, nullptr);
|
||||
wait_for_signal();
|
||||
bp.enable();
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
首先我们检查当前程序计算器的值是否设置了一个断点。如果有,首先我们把执行返回到断点之前,停用它,跳过原来的指令,再重新启用断点。
|
||||
|
||||
`wait_for_signal` 封装了我们常用的 `waitpid` 模式:
|
||||
|
||||
```
|
||||
void debugger::wait_for_signal() {
|
||||
int wait_status;
|
||||
auto options = 0;
|
||||
waitpid(m_pid, &wait_status, options);
|
||||
}
|
||||
```
|
||||
|
||||
最后我们像下面这样重写 `continue_execution`:
|
||||
|
||||
```
|
||||
void debugger::continue_execution() {
|
||||
step_over_breakpoint();
|
||||
ptrace(PTRACE_CONT, m_pid, nullptr, nullptr);
|
||||
wait_for_signal();
|
||||
}
|
||||
```
|
||||
|
||||
### 测试效果
|
||||
|
||||
现在我们可以读取和修改寄存器了,我们可以对我们的 hello world 程序做一些有意思的更改。类似第一次测试,再次尝试在 `call` 指令处设置断点然后从那里继续执行。你可以看到输出了 `Hello world`。现在是有趣的部分,在输出调用后设一个断点、继续、将 `call` 参数设置代码的地址写入程序计数器(`rip`)并继续。由于程序计数器操纵,你应该再次看到输出了 `Hello world`。为了以防你不确定在哪里设置断点,下面是我上一篇博文中的 `objdump` 输出:
|
||||
|
||||
|
||||
```
|
||||
0000000000400936 <main>:
|
||||
400936: 55 push rbp
|
||||
400937: 48 89 e5 mov rbp,rsp
|
||||
40093a: be 35 0a 40 00 mov esi,0x400a35
|
||||
40093f: bf 60 10 60 00 mov edi,0x601060
|
||||
400944: e8 d7 fe ff ff call 400820 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
|
||||
400949: b8 00 00 00 00 mov eax,0x0
|
||||
40094e: 5d pop rbp
|
||||
40094f: c3 ret
|
||||
|
||||
```
|
||||
|
||||
你要将程序计数器移回 `0x40093a` 以便正确设置 `esi` 和 `edi` 寄存器。
|
||||
|
||||
在下一篇博客中,我们会第一次接触到 DWARF 信息并给我们的调试器添加一系列逐步调试的功能。之后,我们会有一个功能工具,它能逐步执行代码、在想要的地方设置断点、修改数据以及其它。一如以往,如果你有任何问题请留下你的评论!
|
||||
|
||||
你可以在[这里][13]找到这篇博文的代码。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/
|
||||
|
||||
作者:[Simon Brand][a]
|
||||
译者:[ictlyh](https://github.com/ictlyh)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.twitter.com/TartanLlama
|
||||
[1]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fnref:2
|
||||
[2]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fnref:1
|
||||
[3]:https://linux.cn/article-8626-1.html
|
||||
[4]:https://linux.cn/article-8645-1.html
|
||||
[5]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/
|
||||
[6]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/
|
||||
[7]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/
|
||||
[8]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/
|
||||
[9]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fn:2
|
||||
[10]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fn:1
|
||||
[11]:https://www.uclibc.org/docs/psABI-x86_64.pdf
|
||||
[12]:http://man7.org/linux/man-pages/man2/process_vm_readv.2.html
|
||||
[13]:https://github.com/TartanLlama/minidbg/tree/tut_registers
|
||||
@@ -0,0 +1,57 @@
|
||||
为什么可以在任何地方工作的开发者们要聚集到世界上最昂贵的城市?
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
政治家和经济学家都在[哀嚎][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&url=http://tcrn.ch/2owXJ0C&text=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&hashtags=
|
||||
[4]:https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftechcrunch.com%2F2017%2F04%2F02%2Fwhy-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities%2F&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/&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?&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&title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&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
|
||||
@@ -0,0 +1,292 @@
|
||||
开发一个 Linux 调试器(四):Elves 和 dwarves
|
||||
============================================================
|
||||
|
||||
到目前为止,你已经偶尔听到了关于 dwarves、调试信息、一种无需解析就可以理解源码方式。今天我们会详细介绍源码级的调试信息,作为本指南后面部分使用它的准备。
|
||||
|
||||
### 系列文章索引
|
||||
|
||||
随着后面文章的发布,这些链接会逐渐生效。
|
||||
|
||||
1. [准备环境][1]
|
||||
2. [断点][2]
|
||||
3. [寄存器和内存][3]
|
||||
4. [Elves 和 dwarves][4]
|
||||
5. [源码和信号][5]
|
||||
6. [源码级逐步执行][6]
|
||||
7. 源码级断点
|
||||
8. 调用栈展开
|
||||
9. 读取变量
|
||||
10. 下一步
|
||||
|
||||
### ELF 和 DWARF 简介
|
||||
|
||||
ELF 和 DWARF 可能是两个你没有听说过,但可能大部分时间都在使用的组件。ELF([Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format"),可执行和可链接格式)是 Linux 系统中使用最广泛的目标文件格式;它指定了一种存储二进制文件的所有不同部分的方式,例如代码、静态数据、调试信息以及字符串。它还告诉加载器如何加载二进制文件并准备执行,其中包括说明二进制文件不同部分在内存中应该放置的地点,哪些位需要根据其它组件的位置固定(_重分配_)以及其它。在这些博文中我不会用太多篇幅介绍 ELF,但是如果你感兴趣的话,你可以查看[这个很好的信息图][7]或[该标准][8]。
|
||||
|
||||
[DWARF](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")是通常和 ELF 一起使用的调试信息格式。它不一定要绑定到 ELF,但它们两者是一起发展的,一起工作得很好。这种格式允许编译器告诉调试器最初的源代码如何和被执行的二进制文件相关联。这些信息分散到不同的 ELF 部分,每个部分都衔接有一份它自己的信息。下面不同部分的定义,信息取自这个稍有过时但非常重要的 [DWARF 调试格式简介][9]:
|
||||
|
||||
* `.debug_abbrev` `.debug_info` 部分使用的缩略语
|
||||
* `.debug_aranges` 内存地址和编译的映射
|
||||
* `.debug_frame` 调用帧信息
|
||||
* `.debug_info` 包括 DWARF 信息条目(DIEs:DWARF Information Entries)的核心 DWARF 数据
|
||||
* `.debug_line` 行号程序
|
||||
* `.debug_loc` 位置描述
|
||||
* `.debug_macinfo` 宏描述
|
||||
* `.debug_pubnames` 全局对象和函数查找表
|
||||
* `.debug_pubtypes` 全局类型查找表
|
||||
* `.debug_ranges` DIEs 的引用地址范围
|
||||
* `.debug_str` `.debug_info` 使用的字符串列表
|
||||
* `.debug_types` 类型描述
|
||||
|
||||
我们最关心的是 `.debug_line` 和 `.debug_info` 部分,让我们来看一个简单程序的 DWARF 信息。
|
||||
|
||||
```
|
||||
int main() {
|
||||
long a = 3;
|
||||
long b = 2;
|
||||
long c = a + b;
|
||||
a = 4;
|
||||
}
|
||||
```
|
||||
|
||||
### DWARF 行表
|
||||
|
||||
如果你用 `-g` 选项编译这个程序,然后将结果传递给 `dwarfdump` 执行,在行号部分你应该可以看到类似这样的东西:
|
||||
|
||||
```
|
||||
.debug_line: line number info for a single cu
|
||||
Source lines (from CU-DIE at .debug_info offset 0x0000000b):
|
||||
|
||||
NS new statement, BB new basic block, ET end of text sequence
|
||||
PE prologue end, EB epilogue begin
|
||||
IS=val ISA number, DI=val discriminator value
|
||||
<pc> [lno,col] NS BB ET PE EB IS= DI= uri: "filepath"
|
||||
0x00400670 [ 1, 0] NS uri: "/home/simon/play/MiniDbg/examples/variable.cpp"
|
||||
0x00400676 [ 2,10] NS PE
|
||||
0x0040067e [ 3,10] NS
|
||||
0x00400686 [ 4,14] NS
|
||||
0x0040068a [ 4,16]
|
||||
0x0040068e [ 4,10]
|
||||
0x00400692 [ 5, 7] NS
|
||||
0x0040069a [ 6, 1] NS
|
||||
0x0040069c [ 6, 1] NS ET
|
||||
|
||||
```
|
||||
|
||||
前面几行是一些如何理解 dump 的信息 - 主要的行号数据从以 `0x00400670` 开头的行开始。实际上这是一个代码内存地址到文件中行列号的映射。`NS` 表示地址标记一个新语句的开始,这通常用于设置断点或逐步执行。`PE` 表示函数序言(LCTT 译注:在汇编语言中,[function prologue](https://en.wikipedia.org/wiki/Function_prologue "function prologue") 是程序开始的几行代码,用于准备函数中用到的栈和寄存器)的结束,这对于设置函数断点非常有帮助。`ET` 表示转换单元的结束。信息实际上并不像这样编码;真正的编码是一种非常节省空间的排序程序,可以通过执行它来建立这些行信息。
|
||||
|
||||
那么,假设我们想在 `variable.cpp` 的第 4 行设置断点,我们该怎么做呢?我们查找和该文件对应的条目,然后查找对应的行条目,查找对应的地址,在那里设置一个断点。在我们的例子中,条目是:
|
||||
|
||||
```
|
||||
0x00400686 [ 4,14] NS
|
||||
|
||||
```
|
||||
|
||||
假设我们想在地址 `0x00400686` 处设置断点。如果你想尝试的话你可以在已经编写好的调试器上手动实现。
|
||||
|
||||
反过来也是如此。如果我们已经有了一个内存地址 - 例如说,一个程序计数器值 - 想找到它在源码中的位置,我们只需要从行表信息中查找最接近的映射地址并从中抓取行号。
|
||||
|
||||
### DWARF 调试信息
|
||||
|
||||
`.debug_info` 部分是 DWARF 的核心。它给我们关于我们程序中存在的类型、函数、变量、希望和梦想的信息。这部分的基本单元是 DWARF 信息条目(DWARF Information Entry),我们亲切地称之为 DIEs。一个 DIE 包括能告诉你正在展现什么样的源码级实体的标签,后面跟着一系列该实体的属性。这是我上面展示的简单事例程序的 `.debug_info` 部分:
|
||||
|
||||
```
|
||||
.debug_info
|
||||
|
||||
COMPILE_UNIT<header overall offset = 0x00000000>:
|
||||
< 0><0x0000000b> DW_TAG_compile_unit
|
||||
DW_AT_producer clang version 3.9.1 (tags/RELEASE_391/final)
|
||||
DW_AT_language DW_LANG_C_plus_plus
|
||||
DW_AT_name /super/secret/path/MiniDbg/examples/variable.cpp
|
||||
DW_AT_stmt_list 0x00000000
|
||||
DW_AT_comp_dir /super/secret/path/MiniDbg/build
|
||||
DW_AT_low_pc 0x00400670
|
||||
DW_AT_high_pc 0x0040069c
|
||||
|
||||
LOCAL_SYMBOLS:
|
||||
< 1><0x0000002e> DW_TAG_subprogram
|
||||
DW_AT_low_pc 0x00400670
|
||||
DW_AT_high_pc 0x0040069c
|
||||
DW_AT_frame_base DW_OP_reg6
|
||||
DW_AT_name main
|
||||
DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp
|
||||
DW_AT_decl_line 0x00000001
|
||||
DW_AT_type <0x00000077>
|
||||
DW_AT_external yes(1)
|
||||
< 2><0x0000004c> DW_TAG_variable
|
||||
DW_AT_location DW_OP_fbreg -8
|
||||
DW_AT_name a
|
||||
DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp
|
||||
DW_AT_decl_line 0x00000002
|
||||
DW_AT_type <0x0000007e>
|
||||
< 2><0x0000005a> DW_TAG_variable
|
||||
DW_AT_location DW_OP_fbreg -16
|
||||
DW_AT_name b
|
||||
DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp
|
||||
DW_AT_decl_line 0x00000003
|
||||
DW_AT_type <0x0000007e>
|
||||
< 2><0x00000068> DW_TAG_variable
|
||||
DW_AT_location DW_OP_fbreg -24
|
||||
DW_AT_name c
|
||||
DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp
|
||||
DW_AT_decl_line 0x00000004
|
||||
DW_AT_type <0x0000007e>
|
||||
< 1><0x00000077> DW_TAG_base_type
|
||||
DW_AT_name int
|
||||
DW_AT_encoding DW_ATE_signed
|
||||
DW_AT_byte_size 0x00000004
|
||||
< 1><0x0000007e> DW_TAG_base_type
|
||||
DW_AT_name long int
|
||||
DW_AT_encoding DW_ATE_signed
|
||||
DW_AT_byte_size 0x00000008
|
||||
|
||||
```
|
||||
|
||||
第一个 DIE 表示一个编译单元(CU),实际上是一个包括了所有 `#includes` 和类似语句的源文件。下面是带含义注释的属性:
|
||||
|
||||
```
|
||||
DW_AT_producer clang version 3.9.1 (tags/RELEASE_391/final) <-- 产生该二进制文件的编译器
|
||||
DW_AT_language DW_LANG_C_plus_plus <-- 原编程语言
|
||||
DW_AT_name /super/secret/path/MiniDbg/examples/variable.cpp <-- 该 CU 表示的文件名称
|
||||
DW_AT_stmt_list 0x00000000 <-- 跟踪该 CU 的行表偏移
|
||||
DW_AT_comp_dir /super/secret/path/MiniDbg/build <-- 编译目录
|
||||
DW_AT_low_pc 0x00400670 <-- 该 CU 的代码起始
|
||||
DW_AT_high_pc 0x0040069c <-- 该 CU 的代码结尾
|
||||
|
||||
```
|
||||
|
||||
其它的 DIEs 遵循类似的模式,你也很可能推测出不同属性的含义。
|
||||
|
||||
现在我们可以根据新学到的 DWARF 知识尝试和解决一些实际问题。
|
||||
|
||||
### 当前我在哪个函数?
|
||||
|
||||
假设我们有一个程序计数器值然后想找到当前我们在哪一个函数。一个解决该问题的简单算法:
|
||||
|
||||
```
|
||||
for each compile unit:
|
||||
if the pc is between DW_AT_low_pc and DW_AT_high_pc:
|
||||
for each function in the compile unit:
|
||||
if the pc is between DW_AT_low_pc and DW_AT_high_pc:
|
||||
return function information
|
||||
|
||||
```
|
||||
|
||||
这对于很多目的都有效,但如果有成员函数或者内联(inline),就会变得更加复杂。假如有内联,一旦我们找到其范围包括我们的程序计数器(PC)的函数,我们需要递归遍历该 DIE 的所有孩子检查有没有内联函数能更好地匹配。在我的代码中,我不会为该调试器处理内联,但如果你想要的话你可以添加该功能。
|
||||
|
||||
### 如何在一个函数上设置断点?
|
||||
|
||||
再次说明,这取决于你是否想要支持成员函数、命名空间以及类似的东西。对于简单的函数你只需要迭代遍历不同编译单元中的函数直到你找到一个合适的名字。如果你的编译器能够填充 `.debug_pubnames` 部分,你可以更高效地做到这点。
|
||||
|
||||
一旦找到了函数,你可以在 `DW_AT_low_pc` 给定的内存地址设置一个断点。不过那会在函数序言处中断,但更合适的是在用户代码处中断。由于行表信息可以指定序言的结束的内存地址,你只需要在行表中查找 `DW_AT_low_pc` 的值,然后一直读取直到被标记为序言结束的条目。一些编译器不会输出这些信息,因此另一种方式是在该函数第二行条目指定的地址处设置断点。
|
||||
|
||||
假如我们想在我们示例程序中的 `main` 函数设置断点。我们查找名为 `main` 的函数,获取到它的 DIE:
|
||||
|
||||
```
|
||||
< 1><0x0000002e> DW_TAG_subprogram
|
||||
DW_AT_low_pc 0x00400670
|
||||
DW_AT_high_pc 0x0040069c
|
||||
DW_AT_frame_base DW_OP_reg6
|
||||
DW_AT_name main
|
||||
DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp
|
||||
DW_AT_decl_line 0x00000001
|
||||
DW_AT_type <0x00000077>
|
||||
DW_AT_external yes(1)
|
||||
|
||||
```
|
||||
|
||||
这告诉我们函数从 `0x00400670` 开始。如果我们在行表中查找这个,我们可以获得条目:
|
||||
|
||||
```
|
||||
0x00400670 [ 1, 0] NS uri: "/super/secret/path/MiniDbg/examples/variable.cpp"
|
||||
|
||||
```
|
||||
|
||||
我们希望跳过序言,因此我们再读取一个条目:
|
||||
|
||||
```
|
||||
0x00400676 [ 2,10] NS PE
|
||||
|
||||
```
|
||||
|
||||
Clang 在这个条目中包括了序言结束标记,因此我们知道在这里停止,然后在地址 `0x00400676` 处设一个断点。
|
||||
|
||||
### 我如何读取一个变量的内容?
|
||||
|
||||
读取变量可能非常复杂。它们是难以捉摸的东西,可能在整个函数中移动、保存在寄存器中、被放置于内存、被优化掉、隐藏在角落里,等等。幸运的是我们的简单示例是真的很简单。如果我们想读取变量 `a` 的内容,我们需要看它的 `DW_AT_location` 属性:
|
||||
|
||||
```
|
||||
DW_AT_location DW_OP_fbreg -8
|
||||
|
||||
```
|
||||
|
||||
这告诉我们内容被保存在以栈帧基(base of the stack frame)偏移为 `-8` 的地方。为了找到栈帧基,我们查找所在函数的 `DW_AT_frame_base` 属性。
|
||||
|
||||
```
|
||||
DW_AT_frame_base DW_OP_reg6
|
||||
|
||||
```
|
||||
|
||||
从 [System V x86_64 ABI][10] 我们可以知道 `reg6` 在 x86 中是帧指针寄存器。现在我们读取帧指针的内容,从中减去 `8`,就找到了我们的变量。如果我们知道它具体是什么,我们还需要看它的类型:
|
||||
|
||||
```
|
||||
< 2><0x0000004c> DW_TAG_variable
|
||||
DW_AT_name a
|
||||
DW_AT_type <0x0000007e>
|
||||
|
||||
```
|
||||
|
||||
如果我们在调试信息中查找该类型,我们得到下面的 DIE:
|
||||
|
||||
```
|
||||
< 1><0x0000007e> DW_TAG_base_type
|
||||
DW_AT_name long int
|
||||
DW_AT_encoding DW_ATE_signed
|
||||
DW_AT_byte_size 0x00000008
|
||||
|
||||
```
|
||||
|
||||
这告诉我们该类型是 8 字节(64 位)有符号整型,因此我们可以继续并把这些字节解析为 `int64_t` 并向用户显示。
|
||||
|
||||
当然,类型可能比那要复杂得多,因为它们要能够表示类似 C++ 的类型,但是这能给你它们如何工作的基本认识。
|
||||
|
||||
再次回到帧基(frame base),Clang 可以通过帧指针寄存器跟踪帧基。最近版本的 GCC 倾向于使用 `DW_OP_call_frame_cfa`,它包括解析 `.eh_frame` ELF 部分,那是一个我不会去写的另外一篇完全不同的文章。如果你告诉 GCC 使用 DWARF 2 而不是最近的版本,它会倾向于输出位置列表,这更便于阅读:
|
||||
|
||||
```
|
||||
DW_AT_frame_base <loclist at offset 0x00000000 with 4 entries follows>
|
||||
low-off : 0x00000000 addr 0x00400696 high-off 0x00000001 addr 0x00400697>DW_OP_breg7+8
|
||||
low-off : 0x00000001 addr 0x00400697 high-off 0x00000004 addr 0x0040069a>DW_OP_breg7+16
|
||||
low-off : 0x00000004 addr 0x0040069a high-off 0x00000031 addr 0x004006c7>DW_OP_breg6+16
|
||||
low-off : 0x00000031 addr 0x004006c7 high-off 0x00000032 addr 0x004006c8>DW_OP_breg7+8
|
||||
|
||||
```
|
||||
|
||||
位置列表取决于程序计数器所处的位置给出不同的位置。这个例子告诉我们如果程序计数器是在 `DW_AT_low_pc` 偏移量为 `0x0` 的位置,那么帧基就在和寄存器 7 中保存的值偏移量为 8 的位置,如果它是在 `0x1` 和 `0x4` 之间,那么帧基就在和相同位置偏移量为 16 的位置,以此类推。
|
||||
|
||||
### 休息一会
|
||||
|
||||
这里有很多的信息需要你的大脑消化,但好消息是在后面的几篇文章中我们会用一个库替我们完成这些艰难的工作。理解概念仍然很有帮助,尤其是当出现错误或者你想支持一些你使用的 DWARF 库所没有实现的 DWARF 概念时。
|
||||
|
||||
如果你想了解更多关于 DWARF 的内容,那么你可以从[这里][11]获取其标准。在写这篇博客时,刚刚发布了 DWARF 5,但更普遍支持 DWARF 4。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/
|
||||
|
||||
作者:[Simon Brand][a]
|
||||
译者:[ictlyh](https://github.com/ictlyh)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.twitter.com/TartanLlama
|
||||
[1]:https://linux.cn/article-8626-1.html
|
||||
[2]:https://linux.cn/article-8645-1.html
|
||||
[3]:https://linux.cn/article-8663-1.html
|
||||
[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/
|
||||
[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/
|
||||
[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/
|
||||
[7]:https://github.com/corkami/pics/raw/master/binary/elf101/elf101-64.pdf
|
||||
[8]:http://www.skyfree.org/linux/references/ELF_Format.pdf
|
||||
[9]:http://www.dwarfstd.org/doc/Debugging%20using%20DWARF-2012.pdf
|
||||
[10]:https://www.uclibc.org/docs/psABI-x86_64.pdf
|
||||
[11]:http://dwarfstd.org/Download.php
|
||||
@@ -0,0 +1,118 @@
|
||||
如何开始学习编程?
|
||||
======================================================
|
||||
|
||||
> 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。
|
||||
|
||||

|
||||
|
||||
|
||||
最近有很多关于学习编程的争论。不仅仅是因为与软件开发公司公开的待应聘的职位数量相比较[符合招聘要求的人远远无法满足缺口][21],编程也是[工资最高][22]和[工作满足感最强][23]的众多职业之一。也难怪越来越多的人都想进入这个行业。
|
||||
|
||||
但是你要怎么做才能正确地入行呢?“**我应该怎么学习编程?**”是初学者常见的一个问题。尽管我没有这些问题的全部答案,但是我希望这篇文章能够给你提供相关指导来帮助你找到最适合你的需求和自身情况发展的解决办法。
|
||||
|
||||
### 你的学习方式是什么?
|
||||
|
||||
在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24](gnothi seauton),意思是“认识你自己”。投入到一个大型的编程学习过程中难度不小。足够的自我认识是非常有必要的,这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题:
|
||||
|
||||
* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。
|
||||
* **你的需要和要求是什么?**你为什么想学习如何编程?是因为你只是想换一份工作吗?如果是这样的话,你需要多次时间才能完成呢?你要牢记,这些是_需要的_ ,不是_想要的_ 。你可能_想要_下周就换份新工作,但是_需要_在接下来的一年里供养你正在成长的家庭。当你在人生的道路上面临方向的抉择时,时间的安排特别重要。
|
||||
* **你能获取的参考资料有哪些?**当然,重返大学并获得一份计算机科学专业的学位证书可能也不错,但是你必须对你自己实事求是面对现实。你的生活必须和你学习相适应。你能承受花费几个月的时间和不菲的费用去参加集训吗?你是否生活在一个可以提供学习机会的地方,比如提供技术性的聚会或者大学课程?你能获取到的参考资料会对你的学习过程产生巨大的影响。在打算学编程换工作前先调查好这些。
|
||||
|
||||
### 选择一门编程语言
|
||||
|
||||
当你打算开始你的编程学习之路和考虑你的选择的时候,请记住不管其他人说什么,选择哪门编程语言来开始你的编程学习_关系不大_。是的,是有些编程语言比其他的更流行。比如,根据一份调查研究,目前 JavaScript,Java,PHP, 和 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
|
||||
@@ -0,0 +1,358 @@
|
||||
Samba 系列(十一):如何配置并集成 iRedMail 服务到 Samba4 AD DC 中
|
||||
=========================================================
|
||||
|
||||
|
||||
在本教程中,将学习如何修改提供邮件服务的 iRedMail 主要守护进程,相应地,[Postfix 用于邮件传输,Dovecot 将邮件传送到帐户邮箱][4],以便将它们集成到 [Samba4 AD 域控制器][5]中。
|
||||
|
||||
将 iRedMail 集成到 Samba4 AD DC 中,你将得到以下好处:通过 Samba AD DC 得到用户身份验证、管理和状态,在 AD 组和 Roundcube 中的全局 LDAP 地址簿的帮助下创建邮件列表。
|
||||
|
||||
### 要求
|
||||
|
||||
1. [在 CentOS 7 中为 Samba4 AD 集成安装 iRedMail][1]
|
||||
|
||||
### 第一步:准备 iRedMail 系统用于 Samba4 AD 集成
|
||||
|
||||
1、 在第一步中,你需要[为你的机器分配一个静态的 IP 地址][6]以防你使用的是由 DHCP 服务器提供的动态 IP 地址。
|
||||
|
||||
运行 [ifconfig 命令][7]列出你的机器网络接口名,并对正确的网卡发出 [nmtui-edit][8] 命令,使用自定义 IP 设置编辑正确的网络接口。
|
||||
|
||||
root 权限运行 nmtui-edit 命令。
|
||||
|
||||
```
|
||||
# ifconfig
|
||||
# nmtui-edit eno16777736
|
||||
```
|
||||
|
||||
[][9]
|
||||
|
||||
*找出网络接口名*
|
||||
|
||||
2、 在打开要编辑的网络接口后,添加正确的静态 IP 设置,确保添加了 Samba4 AD DC 的 DNS 服务器 IP 地址以及你的域的名字,以便从机器查询 realm。使用以下截图作为指导。
|
||||
|
||||
[][10]
|
||||
|
||||
*配置网络设置*
|
||||
|
||||
3、 在你完成配置网络接口后,重启网络进程使更改生效,并对域名以及 samba 4 域控制器的 FQDN 使用 ping 命令测试。
|
||||
|
||||
```
|
||||
# systemctl restart network.service
|
||||
# cat /etc/resolv.conf # 验证 DNS 解析器配置是否对域解析使用了正确的 DNS 服务器 IP
|
||||
# ping -c2 tecmint.lan # ping 域名
|
||||
# ping -c2 adc1 # ping 第一个 AD DC
|
||||
# ping -c2 adc2 # Ping 第二个 AD DC
|
||||
```
|
||||
[][11]
|
||||
|
||||
*验证网络 DNS 配置*
|
||||
|
||||
4、 接下来,用下面的命令安装 `ntpdate` 包,与域控制器同步时间,并请求 samba4 机器的 NTP 服务器:
|
||||
|
||||
```
|
||||
# yum install ntpdate
|
||||
# ntpdate -qu tecmint.lan # querry domain NTP servers
|
||||
# ntpdate tecmint.lan # Sync time with the domain
|
||||
```
|
||||
|
||||
[][12]
|
||||
|
||||
*与 Samba NTP 服务器同步时间*
|
||||
|
||||
5、 你或许想要本地时间自动与 samba AD 时间服务器同步。为了实现这个设置,通过运行 [crontab -e 命令][13]并追加下面的行添加一条计划任务。
|
||||
|
||||
```
|
||||
0 */1 * * * /usr/sbin/ntpdate tecmint.lan > /var/log/ntpdate.lan 2>&1
|
||||
```
|
||||
|
||||
[][14]
|
||||
|
||||
*自动与 Samba NTP 同步时间*
|
||||
|
||||
### 第二步:为 iRedMail 集成准备 Samba4 AD DC
|
||||
|
||||
6、 现在,如[这篇][16]教程所述进入一台[安装了 RSAT 工具的 Windows 机器][15]管理 Samba4 AD。
|
||||
|
||||
打开 DNS 管理器,转到你的域转发查找区并添加新的 A 记录、MX记录还有 PTR 记录指向你的 iRedMail 系统的 IP 地址。使用以下截图作为指导。
|
||||
|
||||
添加一条 A 记录(相应地用 iRedMail 机器的名字和 IP 替换)。
|
||||
|
||||
[][17]
|
||||
|
||||
*为 iRedMail 创建 DNS A 记录*
|
||||
|
||||
添加 MX 记录(将子域留空,优先级为 10)。
|
||||
|
||||
[][18]
|
||||
|
||||
*为 iRedMail 创建 DNS MX 记录*
|
||||
|
||||
在反向查找区域(相应地替换 iRedMail 服务器的 IP 地址)添加 PTR 记录。如果你尚未为域控制器配置反向区域,请阅读以下教程:[从 Windows 管理 Samba4 DNS 组策略][2]
|
||||
|
||||
[][19]
|
||||
|
||||
*为 iRedMail 创建 DNS PTR 记录*
|
||||
|
||||
7、添加了使邮件服务器正常运行的基本 DNS 记录后,请进入 iRedMail 机器,安装 bind-utils 软件包,并按如下建议查询新添加的邮件记录。
|
||||
|
||||
Samba4 AD DC DNS 应该会响应之前添加的 DNS 记录。
|
||||
|
||||
```
|
||||
# yum install bind-utils
|
||||
# host tecmint.lan
|
||||
# host mail.tecmint.lan
|
||||
# host 192.168.1.245
|
||||
```
|
||||
|
||||
[][20]
|
||||
|
||||
*安装 Bind 并查询邮件记录*
|
||||
|
||||
在一台 Windows 机器上,打开命令行窗口并使用 [nslookup 命令][21]查询上面的邮件服务器记录。
|
||||
|
||||
8、 作为最后一个先决要求,在 Samba4 AD DC 中创建一个具有最小权限的新用户帐户,并使用名称 vmail, 为此用户选择一个强密码, 并确保该用户的密码永不过期。
|
||||
|
||||
vmail 帐户将被 iRedMail 服务用来查询 Samba4 AD DC LDAP 数据库并拉取电子邮件帐户。
|
||||
|
||||
要创建 vmail 账户,如截图所示,使用加入了已安装 RSAT 工具域的 Windows 机器上的 ADUC 图形化工具,或者按照先前主题中那样用 [samba-tool 命令行][3]直接在域控制器中运行。
|
||||
|
||||
在本指导中,我们会使用上面提到的第一种方法。
|
||||
|
||||
[][22]
|
||||
|
||||
*AD 用户和计算机*
|
||||
|
||||
[][23]
|
||||
|
||||
*为 iRedMail 创建新的用户*
|
||||
|
||||
[][24]
|
||||
|
||||
*为用户设置强密码*
|
||||
|
||||
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`)。
|
||||
|
||||
[][25]
|
||||
|
||||
*查询 Samba4 AD DC LDAP*
|
||||
|
||||
### 第三步:将 iRedMail 服务集成到 Samba4 AD DC 中
|
||||
|
||||
10、 现在是时候修改 iRedMail 服务(Postfix、Dovecot 和 Roundcube)以便为邮箱帐户查询 Samba4 域控制器。
|
||||
|
||||
第一个要修改的服务是 MTA 代理,Postfix。执行以下命令禁用一系列的 MTA 设置,添加你的域名到 Postfix 本地域以及邮箱域中,并使用 Dovecot 代理发送已接收的邮件到用户邮箱中。
|
||||
|
||||
```
|
||||
# postconf -e virtual_alias_maps=' '
|
||||
# postconf -e sender_bcc_maps=' '
|
||||
# postconf -e recipient_bcc_maps= ' '
|
||||
# postconf -e relay_domains=' '
|
||||
# postconf -e relay_recipient_maps=' '
|
||||
# postconf -e sender_dependent_relayhost_maps=' '
|
||||
# postconf -e smtpd_sasl_local_domain='tecmint.lan' #用你自己的域替换
|
||||
# postconf -e virtual_mailbox_domains='tecmint.lan' #用你自己的域替换
|
||||
# postconf -e transport_maps='hash:/etc/postfix/transport'
|
||||
# postconf -e smtpd_sender_login_maps='proxy:ldap:/etc/postfix/ad_sender_login_maps.cf' # 检查 SMTP 发送者
|
||||
# postconf -e virtual_mailbox_maps='proxy:ldap:/etc/postfix/ad_virtual_mailbox_maps.cf' # 检查本地邮件帐户
|
||||
# postconf -e virtual_alias_maps='proxy:ldap:/etc/postfix/ad_virtual_group_maps.cf' # 检查本地邮件列表
|
||||
# cp /etc/postfix/transport /etc/postfix/transport.backup # 备份 transport 配置
|
||||
# echo "tecmint.lan dovecot" > /etc/postfix/transport # 添加带 dovecot transport 的域
|
||||
# cat /etc/postfix/transport # 验证 transport 文件
|
||||
# postmap hash:/etc/postfix/transport
|
||||
```
|
||||
|
||||
11、 接下来,用你最喜欢的文本编辑器创建 Postfix 的 `/etc/postfix/ad_sender_login_maps.cf` 配置文件,并添加下面的配置。
|
||||
|
||||
```
|
||||
server_host = tecmint.lan
|
||||
server_port = 389
|
||||
version = 3
|
||||
bind = yes
|
||||
start_tls = no
|
||||
bind_dn = vmail@tecmint.lan
|
||||
bind_pw = ad_vmail_account_password
|
||||
search_base = dc=tecmint,dc=lan
|
||||
scope = sub
|
||||
query_filter = (&(userPrincipalName=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
|
||||
result_attribute= userPrincipalName
|
||||
debuglevel = 0
|
||||
```
|
||||
|
||||
12、 使用下面的配置创建 `/etc/postfix/ad_virtual_mailbox_maps.cf`。
|
||||
|
||||
```
|
||||
server_host = tecmint.lan
|
||||
server_port = 389
|
||||
version = 3
|
||||
bind = yes
|
||||
start_tls = no
|
||||
bind_dn = vmail@tecmint.lan
|
||||
bind_pw = ad_vmail_account_password
|
||||
search_base = dc=tecmint,dc=lan
|
||||
scope = sub
|
||||
query_filter = (&(objectclass=person)(userPrincipalName=%s))
|
||||
result_attribute= userPrincipalName
|
||||
result_format = %d/%u/Maildir/
|
||||
debuglevel = 0
|
||||
```
|
||||
|
||||
13、 使用下面的配置创建 `/etc/postfix/ad_virtual_group_maps.cf`。
|
||||
|
||||
```
|
||||
server_host = tecmint.lan
|
||||
server_port = 389
|
||||
version = 3
|
||||
bind = yes
|
||||
start_tls = no
|
||||
bind_dn = vmail@tecmint.lan
|
||||
bind_pw = ad_vmail_account_password
|
||||
search_base = dc=tecmint,dc=lan
|
||||
scope = sub
|
||||
query_filter = (&(objectClass=group)(mail=%s))
|
||||
special_result_attribute = member
|
||||
leaf_result_attribute = mail
|
||||
result_attribute= userPrincipalName
|
||||
debuglevel = 0
|
||||
```
|
||||
|
||||
替换上面三个配置文件中的 `server_host`、`bind_dn`、`bind_pw` 和 `search_base` 以反应你自己域的设置。
|
||||
|
||||
14、 接下来,打开 Postfix 主配置文件,通过在下面的行前添加 `#` 注释,搜索并禁用 iRedAPD 的 `check_policy_service` 和 `smtpd_end_of_data_restrictions`。
|
||||
|
||||
```
|
||||
# nano /etc/postfix/main.cf
|
||||
```
|
||||
|
||||
注释下面的行:
|
||||
|
||||
```
|
||||
#check_policy_service inet:127.0.0.1:7777
|
||||
#smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:7777
|
||||
```
|
||||
|
||||
15、 现在,通过执行一系列查询,验证 Postfix 是否使用现有的域用户和域组绑定到 Samba AD,如以下示例所示。
|
||||
|
||||
结果应与下面的截图类似。
|
||||
|
||||
```
|
||||
# postmap -q tecmint_user@tecmint.lan ldap:/etc/postfix/ad_virtual_mailbox_maps.cf
|
||||
# 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
|
||||
```
|
||||
|
||||
[][26]
|
||||
|
||||
*验证 Postfix 绑定到了 Samba AD*
|
||||
|
||||
相应替换 AD 用户及组帐户。同样,确保你使用的 AD 组已被分配了一些成员。
|
||||
|
||||
16、 在下一步中修改 Dovecot 配置文件以查询 Samba4 AD DC。打开 `/etc/dovecot/dovecot-ldap.conf` 文件并添加下面的行。
|
||||
|
||||
```
|
||||
hosts = tecmint.lan:389
|
||||
ldap_version = 3
|
||||
auth_bind = yes
|
||||
dn = vmail@tecmint.lan
|
||||
dnpass = ad_vmail_password
|
||||
base = dc=tecmint,dc=lan
|
||||
scope = subtree
|
||||
deref = never
|
||||
user_filter = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
|
||||
pass_filter = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
|
||||
pass_attrs = userPassword=password
|
||||
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/` 中。
|
||||
|
||||
17、 确保 dovecot 的主配置文件中启用了 pop3 和 imap 协议。打开 `/etc/dovecot/dovecot.conf` 验证是否启用了 `quota` 和 `acl` 邮件插件,并检查这些值是否存在。
|
||||
|
||||
[][27]
|
||||
|
||||
*在 Dovecot 中启用 POP3 和 IMAP*
|
||||
|
||||
18、 可选地,如果要将全局硬配额设置为每个域用户的最大不超过 500 MB 存储,请在 `/etc/dovecot/dovecot.conf` 文件中添加以下行。
|
||||
|
||||
```
|
||||
quota_rule = *:storage=500M
|
||||
```
|
||||
|
||||
19、 最后,为了使目前这些更改生效,用 root 权限执行下面的命令重启并验证 Postfix 和 Dovecot 守护进程的状态。
|
||||
|
||||
```
|
||||
# systemctl restart postfix dovecot
|
||||
# systemctl status postfix dovecot
|
||||
```
|
||||
|
||||
20、 为了使用 IMAP 协议从命令行测试邮件服务器配置,请使用 telnet 或 [netcat 命令][28],如下所示。
|
||||
|
||||
```
|
||||
# nc localhost 143
|
||||
a1 LOGIN ad_user@your_domain.tld ad_user_password
|
||||
a2 LIST “” “*”
|
||||
a3 LOGOUT
|
||||
```
|
||||
|
||||
[][29]
|
||||
|
||||
*测试 iRedMail 配置*
|
||||
|
||||
如果你可以使用 Samba4 用户帐户从命令行执行 IMAP 登录,那么 iRedMail 服务器似乎已经准备好发送和接收 AD 帐户的邮件。
|
||||
|
||||
在下一个教程中将讨论如何将 Roundcube webmail 与 Samba4 AD DC 集成,并启用全局 LDAP 地址簿,自定义 Roudcube,从浏览器访问 Roundcube Web 界面,并禁用某些不需要的 iRedMail 服务。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。
|
||||
|
||||
-----
|
||||
|
||||
via: https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/
|
||||
|
||||
作者:[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://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://linux.cn/article-8065-1.html
|
||||
[6]:https://linux.cn/article-3977-1.html
|
||||
[7]:https://www.tecmint.com/ifconfig-command-examples/
|
||||
[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://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
|
||||
[20]:https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png
|
||||
[21]:https://www.tecmint.com/8-linux-nslookup-commands-to-troubleshoot-dns-domain-name-server/
|
||||
[22]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-Users-and-Computers.png
|
||||
[23]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-New-User-for-iRedMail.png
|
||||
[24]:https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Password-for-User.png
|
||||
[25]:https://www.tecmint.com/wp-content/uploads/2017/05/Query-Samba4-AD-DC-LDAP.png
|
||||
[26]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png
|
||||
[27]:https://www.tecmint.com/wp-content/uploads/2017/05/Enable-Pop3-Imap-in-Dovecot.png
|
||||
[28]:https://www.tecmint.com/check-remote-port-in-linux/
|
||||
[29]:https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png
|
||||
[30]:https://www.tecmint.com/author/cezarmatei/
|
||||
[31]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
|
||||
[32]:https://www.tecmint.com/free-linux-shell-scripting-books/
|
||||
@@ -0,0 +1,277 @@
|
||||
Samba 系列(十二):如何在 Samba4 AD 中集成 iRedMail Roundcube
|
||||
============================================================
|
||||
|
||||
[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 工具显式地在邮箱字段填写正确的地址。
|
||||
|
||||
[][5]
|
||||
|
||||
*添加邮箱帐户来加入 Samba4 AD DC*
|
||||
|
||||
2、 相似地,要使用邮件列表,你需要在 ADUC 中创建组,为每个组添加相应的电子邮件地址,并分配合适的用户帐户作为每个组的成员。
|
||||
|
||||
这步创建了一个邮件列表,所有 Samba4 AD 组成员的邮箱都会收到给这个 AD 组邮箱地址的邮件。使用下面的截图作为指导为 Samba4 组声明电子邮件字段,并为组添加域成员。
|
||||
|
||||
确保所有的域账户成员都添加到了声明了邮件地址的组中。
|
||||
|
||||
[][6]
|
||||
|
||||
*为 Samba4 AD DC 创建组管理员*
|
||||
|
||||
[][7]
|
||||
|
||||
*将用户添加到组*
|
||||
|
||||
在本例中,发送给 admins@tecmint.lan 的所有邮件地址将被该组的每个成员邮箱接收,它是 “Domain Admins” 组声明的电子邮件地址。
|
||||
|
||||
3、 你可以声明 Samba4 AD 帐户的电子邮件地址的另一种方法是直接从其中一个 AD DC 控制台使用 samba-tool 命令行创建一个用户或组,并使用 `--mail-address` 标志指定邮件地址。
|
||||
|
||||
使用下面其中一个命令创建一个指定邮件地址的用户:
|
||||
|
||||
```
|
||||
# samba-tool user add --mail-address=user_email@domain.tld --surname=your_surname --given-name=your_given_name your_ad_user
|
||||
```
|
||||
|
||||
创建一个指定邮件地址的组:
|
||||
|
||||
```
|
||||
# samba-tool group add --mail-address=group_email@domain.tld your_ad_group
|
||||
```
|
||||
|
||||
将成员添加到组中:
|
||||
|
||||
```
|
||||
# samba-tool group addmembers your_group user1,user2,userX
|
||||
```
|
||||
|
||||
使用下面的语法列出 samba-tool 中有关用户或者组的命令字段:
|
||||
|
||||
```
|
||||
# samba-tool user add -h
|
||||
# samba-tool group add -h
|
||||
```
|
||||
|
||||
### 第二步:安全 Roundcube Webmail
|
||||
|
||||
4、 开始修改 Roundcube 配置文件之前,首先使用 [netstat 命令][8]管道输出给 egrep 过滤器来列出 [Dovecot 和 Postfix][9] 监听的套接字,并确保安全端口(IMAPS 是 993,submission 是 587 )是活跃的并且已启用。
|
||||
|
||||
```
|
||||
# netstat -tulpn| egrep 'dovecot|master'
|
||||
```
|
||||
|
||||
5、 要强制邮件的接收和发送在使用安全的 IMAP 和 SMTP 端口的 Roundcube 以及 iRedMail 服务之间,打开位于 `/var/www/roundcubemail/config/config.inc.php` 的 Roundcube 配置文件并确保你修改过了下面的行,本例中是 `localhost`,如下片段所示:
|
||||
|
||||
```
|
||||
// For IMAPS
|
||||
$config['default_host'] = 'ssl://127.0.0.1';
|
||||
$config['default_port'] = 993;
|
||||
$config['imap_auth_type'] = 'LOGIN';
|
||||
// For SMTP
|
||||
$config['smtp_server'] = 'tls://127.0.0.1';
|
||||
$config['smtp_port'] = 587;
|
||||
$config['smtp_user'] = '%u';
|
||||
$config['smtp_pass'] = '%p';
|
||||
$config['smtp_auth_type'] = 'LOGIN';
|
||||
```
|
||||
|
||||
这步强烈建议在远程主机中安装 Roudcube,而不是提供了邮件服务的主机中(IMAP、POP3 或者 SMTP 守护进程)。
|
||||
|
||||
6、 接下来,不要关闭配置文件,搜索并做如下小的修改以便 Roundcube 能够通过 HTTPS 协议访问、隐藏版本号以及自动为登录 Web 界面的帐户追加域名。
|
||||
|
||||
```
|
||||
$config['force_https'] = true;
|
||||
$config['useragent'] = 'Your Webmail'; // Hide version number
|
||||
$config['username_domain'] = 'domain.tld'
|
||||
```
|
||||
|
||||
7、 同样,禁用下面的插件:managesieve 和 password,通过在以 `$config[‘plugins’]` 开头的行前添加注释 `//`。
|
||||
|
||||
一旦登录并验证了域,用户将从连接到 Samba4 AD DC 的 Windows 或 Linux 机器上更改密码。系统管理员将全局管理域帐户的所有筛选规则。
|
||||
|
||||
```
|
||||
// $config['plugins'] = array('managesieve', 'password');
|
||||
```
|
||||
|
||||
8、 最后,保存并关闭配置文件,并打开浏览器访问 Roundcube Webmail,通过 HTTPS 协议进入 iRedMail IP 地址或者 FQDN/mail 位置。
|
||||
|
||||
由于浏览器使用的是自签名证书,所以你首次访问 Roundcube 会在浏览器上看到一个警告。接受证书并用 Samba AD 帐户凭证登录。
|
||||
|
||||
```
|
||||
https://iredmail-FQDN/mail
|
||||
```
|
||||
[][10]
|
||||
|
||||
*Roundcube Webmail 登录*
|
||||
|
||||
### 第三步:在 Roundcube 中启用 Samba AD 联系人
|
||||
|
||||
9、 要配置 Samba AD 全局 LDAP 地址簿以在 Roundcube 联系人中显示,再次打开 Roundcube 配置文件,并做如下修改:
|
||||
|
||||
到达文件的底部,并辨认以 `# Global LDAP Address Book with AD` 开头的部分,删除到文件底部的所有内容,并替换成如下代码段:
|
||||
|
||||
```
|
||||
# Global LDAP Address Book with AD.
|
||||
#
|
||||
$config['ldap_public']["global_ldap_abook"] = array(
|
||||
'name' => 'tecmint.lan',
|
||||
'hosts' => array("tecmint.lan"),
|
||||
'port' => 389,
|
||||
'use_tls' => false,
|
||||
'ldap_version' => '3',
|
||||
'network_timeout' => 10,
|
||||
'user_specific' => false,
|
||||
'base_dn' => "dc=tecmint,dc=lan",
|
||||
'bind_dn' => "vmail@tecmint.lan",
|
||||
'bind_pass' => "your_password",
|
||||
'writable' => false,
|
||||
'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'),
|
||||
'fieldmap' => array(
|
||||
'name' => 'cn',
|
||||
'surname' => 'sn',
|
||||
'firstname' => 'givenName',
|
||||
'title' => 'title',
|
||||
'email' => 'mail:*',
|
||||
'phone:work' => 'telephoneNumber',
|
||||
'phone:mobile' => 'mobile',
|
||||
'department' => 'departmentNumber',
|
||||
'notes' => 'description',
|
||||
),
|
||||
'sort' => 'cn',
|
||||
'scope' => 'sub',
|
||||
'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))',
|
||||
'fuzzy_search' => true,
|
||||
'vlv' => false,
|
||||
'sizelimit' => '0',
|
||||
'timelimit' => '0',
|
||||
'referrals' => false,
|
||||
);
|
||||
```
|
||||
|
||||
在这段代码中替换相应的 `name`、`hosts`、`base_dn`、`bind_dn` 和 `bind_pass` 的值。
|
||||
|
||||
10、 做了所需修改后,保存并关闭文件,登录 Roundcube webmail 界面,并进入地址簿菜单。
|
||||
|
||||
所有域名帐户(用户和组)与其指定的电子邮件地址的联系人列表都将被显示在全局地址簿上。
|
||||
|
||||
[][11]
|
||||
|
||||
*Roundcube 用户联系人列表*
|
||||
|
||||
### 第四步:为 Roundcube Webmail 界面添加一个别名
|
||||
|
||||
11、 要从 https://webmail.domain.tld 访问 Roundcube 而不是从 iRedMail 默认提供的旧地址,你需要进行以下更改。
|
||||
|
||||
在已安装 RSAT 工具的已加入的 Windows 机器上打开 DNS 管理器,并如下所示,添加一条 iRedMail FQDN、named webmail 的 CNAME 记录。
|
||||
|
||||
[][12]
|
||||
|
||||
*DNS Webmail 属性*
|
||||
|
||||
12、 接下来,在 iRedMail 机器中,打开位于 `/etc/httpd/conf.d/ssl.conf` 的 Apache Web 服务器的 SSL 配置文件,将 `DocumentRoot` 指向 `/var/www/roundcubemail/`。
|
||||
|
||||
修改 `/etc/httpd/conf.d/ssl.conf` 片段:
|
||||
|
||||
|
||||
```
|
||||
DocumentRoot “/var/www/roundcubemail/”
|
||||
```
|
||||
|
||||
重启 Apache 使更改生效。
|
||||
|
||||
```
|
||||
# systemctl restart httpd
|
||||
```
|
||||
|
||||
13、 现在打开下面的地址,Roundcube 界面应该会显示出来。接受自签名证书错误以进入登录页面。用你自己的域名替换例子中的 domain.tld。
|
||||
|
||||
```
|
||||
https://webmail.domain.tld
|
||||
```
|
||||
|
||||
### 第五步:禁用 iRedMail 未使用的服务
|
||||
|
||||
14、 由于 iRedMail 守护进程配置为查询 Samba4 AD DC LDAP 服务器的帐户信息和其他资源,因此可以通过使用以下命令来安全地停止和禁用 iRedMail 机器上的某些本地服务,例如 LDAP 数据库服务器和 iredpad 服务。
|
||||
|
||||
```
|
||||
# systemctl stop slapd iredpad
|
||||
# systemctl disable slapd iredpad
|
||||
```
|
||||
|
||||
15、 另外,如下图所示,通过在 crontab 文件中的每行之前添加注释 `#`,禁用 iRedMail 执行的某些计划任务,例如 LDAP 数据库备份和 iRedPad 跟踪记录。
|
||||
|
||||
```
|
||||
# crontab -e
|
||||
```
|
||||
[][13]
|
||||
|
||||
*禁用 iRedMail 任务*
|
||||
|
||||
### 第六步:在 Postfix 中使用邮件别名
|
||||
|
||||
16、 要将所有本地生成的邮件(发往 postmaster 并随后重定向到 root 帐户)重定向到特定的 Samba4 AD 帐户,请打开位于 `/etc/postfix/aliases` 中的 Postfix 别名配置文件,并修改 `root` 行,如下所示:
|
||||
|
||||
```
|
||||
root: your_AD_email_account@domain.tld
|
||||
```
|
||||
|
||||
17、 应用别名配置文件,以便 Postfix 可以通过执行 `newaliases` 命令以其自己的格式读取它,并测试邮件是否通过发出以下命令发送到正确的域电子邮件帐户。
|
||||
|
||||
```
|
||||
# echo “Test mail” | mail -s “This is root’s email” root
|
||||
```
|
||||
|
||||
18、 邮件发送完毕后,请使用你为邮件重定向设置的域帐户登录 Roundcube webmail,并验证先前发送的邮件应该在你的帐户收件箱中。
|
||||
|
||||
[][14]
|
||||
|
||||
*验证用户邮件*
|
||||
|
||||
就是这样了!现在你已经有了一个完全工作的与 Samba4 AD 集成的邮件服务器了。域帐户可以用它们的内部或者其他外部域发送和接收邮件了。
|
||||
|
||||
本教程中使用的配置可以成功将 iRedMail 服务器集成到 Windows Server 2012 R2 或 2016 AD 中。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。
|
||||
|
||||
-----------
|
||||
|
||||
|
||||
via: https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/
|
||||
|
||||
作者:[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://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://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
|
||||
[8]:https://www.tecmint.com/20-netstat-commands-for-linux-network-management/
|
||||
[9]:https://www.tecmint.com/configure-postfix-and-dovecot-with-virtual-domain-users-in-linux/
|
||||
[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png
|
||||
[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png
|
||||
[12]:https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg
|
||||
[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png
|
||||
[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png
|
||||
[15]:https://www.tecmint.com/author/cezarmatei/
|
||||
[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
|
||||
[17]:https://www.tecmint.com/free-linux-shell-scripting-books/
|
||||
@@ -0,0 +1,191 @@
|
||||
Libral:一个提供资源和服务统一管理 API 的系统管理库
|
||||
============================================================
|
||||
|
||||
> Libral 为系统资源和服务提供了一个统一的管理 API ,其可以作为脚本管理任务和构建配置管理系统的坚实基础。
|
||||
|
||||

|
||||
|
||||
作为继承了 Unix 的传统的 Linux 操作系统,其并没有一个综合的系统管理 API 接口,相反,管理操作是通过多种特定用途的工具和 API 来实现的,其每一个都有自己约定和特有的风格。这就使得编写一个哪怕是简单的系统管理任务的脚本也很困难、很脆弱。
|
||||
|
||||
举个例子来说,改变 “app” 用户的登录 shell 要运行 `usermod -s /sbin/nologin app`。这个命令通常没有问题,只是当系统上没有 “app” 用户时就不行了。为了解决这个例外错误,具有创新精神的脚本编写者也许要这样写:
|
||||
|
||||
```
|
||||
grep -q app /etc/passwd \
|
||||
&& usermod -s /sbin/nologin app \
|
||||
|| useradd ... -s /sbin/nologin app
|
||||
```
|
||||
|
||||
这样,当 “app” 用户存在于系统中时,会执行更改登录 shell 的操作;而当此用户不存在时,就会创建此用户。不幸的是,这种编写系统管理任务脚本的方式是不适合的:对于每一种资源来说都会有一套不同的工具,而且每个都有其不同的使用惯例;不一致性和经常出现的不完备的错误报告将会使错误的处理变得困难;再者也会因为工具自身的特性引发的故障而导致执行失败。
|
||||
|
||||
实际上,以上所举的例子也是不正确的:`grep` 并不是用来查找 “app” 用户的,它只能在文件 `/etc/passwd` 的一些行中简单的查找是否有字符串 “app”,在大多数情况下它或许可以工作,但是也可能会在最关键的时刻出错。
|
||||
|
||||
很显然,那些执行简单任务的脚本管理工具,很难成为大型管理系统的基础。认识到这一点,现有的配置管理系统,比如 Puppet、Chef 及 Ansible,围绕基本的操作系统资源的管理竭尽全力的建立其内部 API 就是明智之举。这些资源抽象是内部 API,其与所需的相应工具密切相关。但这不仅导致大量的重复性工作,也为尝试一个新创新的管理工具设置了强大的障碍。
|
||||
|
||||
在创建虚拟机或者容器镜像这一领域,这种障碍就变得非常明显:比如在创建镜像的过程中,就要么需要回答关于它们的简单问题,要么需要对其进行简单的更改才行。但是工具全都需要特别处理,那些所遇到的问题和更改需要用脚本逐个处理。因此,镜像构建要么依靠特定的脚本,要么需要使用(和安装)一个相当强大的配置管理系统。
|
||||
|
||||
[Libral][11] 将为管理工具和任务提供一个可靠的保证,通过对系统资源提供一个公用的管理 API,并使其可以通过命令行工具 `ralsh` 使用,它允许用户按照相同的方法查询和修改系统资源,并有可预见的错误报告。对以上的举例来说,可以通过命令 `ralsh -aq user app` 检查 “app” 用户是否存在;通过 `ralsh -aq package foo` 检查 “foo” 软件包是否已经安装;一般情况下,可以通过命令 `ralsh -aq TYPE NAME` 检查 ”NAME“ 是否是 ”TYPE“ 类型的资源。类似的,要创建或更改已存在的用户,可以运行:
|
||||
|
||||
```
|
||||
ralsh user app home=/srv/app shell=/sbin/nologin
|
||||
```
|
||||
|
||||
以及,要在文件 `/etc/hosts` 创建和修改条目,可以运行命令:
|
||||
|
||||
|
||||
```
|
||||
ralsh hostmyhost.example.com ip=10.0.0.1 \
|
||||
host_aliases=myhost,apphost
|
||||
```
|
||||
|
||||
以这种方式运行,“ralsh” 的使用者事实上完全隔离在那两个命令内部的不同运行工作机制之外:第一个命令需要适当的调用命令 `useradd` 或者 `usermod`,而第二个需要在 `/etc/hosts` 文件中进行编辑。而对于该用户来说,他们似乎都采取同样的模型:“确保资源处于我所需要的状态。”
|
||||
|
||||
### 怎样获取和使用 Libral 呢?
|
||||
|
||||
Libral 可以在[这个 git 仓库][12]找到并下载。其核心是由 C++ 编写的,构建它的说明可以[在该仓库中][13]找到,不过只是在你想要为 Libral 的 C++ 核心做贡献的时候才需要看它。Libral 的网站上包含了一个 [预构建的 tarball][14],可以用在任何使用 “glibc 2.12” 或者更高版本的 Linux 机器上。可以使用该 “tarball” 的内容进一步探究 ralsh ,以及开发新的提供者(provider),它使得 Libral 具备了管理新类型资源的能力。
|
||||
|
||||
在下载解压 tarball 后,在目录 `ral/bin` 下能找到 `ralsh` 命令。运行不需要任何参数的 `ralsh` 命令就会列举出来 Libral 的所有资源类型。利用 `--help` 选项可以打印输出关于 `ralsh` 的更多说明。
|
||||
|
||||
### 与配置管理系统的关系
|
||||
|
||||
知名的配置管理系统,如 Puppet、Chef 及 Ansible,解决了一些 Libral 所解决的同样的问题。将 Libral 与它们的区分开的主要是它们所做工作和 Libral 不同。配置管理系统被构建来处理跨大量节点管理各种事物的多样性和复杂性。而另一方面 Libral 旨在提供一个定义明确的低级别的系统管理 API ,独立于任何特定的工具,可用于各种各样的编程语言。
|
||||
|
||||
通过消除大型配置管理系统中包含的应用程序逻辑,Libral 从前面介绍里提及的简单的脚本任务,到作为构建复杂的管理应用的构建块,它在如何使用方面是非常灵活的。专注与这些基础层面也使其保持很小,目前不到 2.5 MB,这对于资源严重受限的环境,如容器和小型设备来说是一个重要考虑因素。
|
||||
|
||||
### Libral API
|
||||
|
||||
在过去的十年里,Libral API 是在实现配置管理系统的经验下指导设计的,虽然它并没有直接绑定到它们其中任何一个应用上,但它考虑到了这些问题,并规避了它们的缺点。
|
||||
|
||||
在 API 设计中四个重要的原则:
|
||||
|
||||
* 期望的状态
|
||||
* 双向性
|
||||
* 轻量级抽象
|
||||
* 易于扩展
|
||||
|
||||
基于期望状态的管理 API,举个例子来说,用户表示当操作执行后希望系统看起来是什么状态,而不是怎样进入这个状态,这一点什么争议。双向性使得使用(读、写)相同的 API 成为可能,更重要的是,相同的资源可以抽象成读取现有状态和强制修改成这种状态。轻量级抽象行为确保能容易的学习 API 并能快速的使用;过去在管理 API 上的尝试过度加重了学习建模框架的使用者的负担,其中一个重要的因素是他们的接受力缺乏。
|
||||
|
||||
最后,它必须易于扩展 Libral 的管理功能,这样用户可以教给 Libral 如何管理新类型的资源。这很重要,因为人们也许要管理的资源可能很多(而且 Libral 需要在适当时间进行管理),再者,因为即使是完全成熟的 Libral 也总是存在达不到用户自定义的管理需求。
|
||||
|
||||
目前与 Libral API 进行交互的主要方式是通过 `ralsh` 命令行工具。它也提供了底层的 C++ API ,不过其仍处在不断的演变当中,主要的还是为简单的脚本任务做准备。该项目也提供了为 CRuby 提供语言绑定,其它语言也在陆续跟进。
|
||||
|
||||
未来 Libral 还将提供一个提供远程 API 的守护进程,它可以做为管理系统的基础服务,而不需要在管理节点上安装额外的代理。这一点,加上对 Libral 管理功能的定制能力,可以严格控制系统的哪些方面可以管理,哪些方面要避免干扰。
|
||||
|
||||
举个例子来说,一个仅限于管理用户和服务的 Libral 配置会避免干扰到在节点上安装的包。当前任何现有的配置管理系统都不可能控制以这种方式管理的内容;尤其是,需要对受控节点进行任意的 SSH 访问也会将该系统暴露不必要的意外和恶意干扰。
|
||||
|
||||
Libral API 的基础是由两个非常简单的操作构成的:“get” 用来检索当前资源的状态,“set” 用来设置当前资源的状态。理想化地实现是这样的,通过以下步骤:
|
||||
|
||||
|
||||
```
|
||||
provider.get(names) -> List[resource]
|
||||
provider.set(List[update]) -> List[change]
|
||||
```
|
||||
|
||||
“provider” 是要知道怎样管理的一种资源的对象,就像用户、服务、软件包等等,Libral API 提供了一种查找特定资源的管理器(provider)的方法。
|
||||
|
||||
“get” 操作能够接收资源名称列表(如用户名),然后产生一个资源列表,其本质来说是利用散列的方式列出每种资源的属性。这个列表必须包含所提供名称的资源,但是可以包含更多内容,因此一个简单的 “get” 的实现可以忽略名称并列出所有它知道的资源。
|
||||
|
||||
“set” 操作被用来设置所要求的状态,并接受一个更新列表。每个更新可以包含 “update.is”,其表示当前状态的资源,“update.should” 表示被资源所期望的状态。调用 “set” 方法将会让更新列表中所提到的资源成为 “update.should” 中指示的状态,并列出对每个资源所做的更改。
|
||||
|
||||
在 `ralsh` 下,利用 `ralsh user root` 能够重新获得 “root” 用户的当前状态;默认情况下,这个命令会产生一个用户可读的输出,就像 Puppet 中一样,但是 `ralsh` 支持 `--json` 选项,可以生成脚本可以使用的 JSON 输出。用户可读的输出是:
|
||||
|
||||
```
|
||||
# ralsh user root
|
||||
user::useradd { 'root':
|
||||
ensure => 'present',
|
||||
comment => 'root',
|
||||
gid => '0',
|
||||
groups => ['root'],
|
||||
home => '/root',
|
||||
shell => '/bin/bash',
|
||||
uid => '0',
|
||||
}
|
||||
```
|
||||
|
||||
类似的,用户也可以用下面的形式修改:
|
||||
|
||||
```
|
||||
# ralsh user root comment='The superuser'
|
||||
user::useradd { 'root':
|
||||
ensure => 'present',
|
||||
comment => 'The superuser',
|
||||
gid => '0',
|
||||
groups => ['root'],
|
||||
home => '/root',
|
||||
shell => '/bin/bash',
|
||||
uid => '0',
|
||||
}
|
||||
comment(root->The superuser)
|
||||
```
|
||||
|
||||
`ralsh` 的输出列出了 “root” 用户的新状态和被改变的 `comment` 属性,以及修改了什么内容(在这种情形下单指 `comment` 属性)。下一秒运行相同的命令将产生同样的输出,但是不会提示修改,因为没有需要修改的内容。
|
||||
|
||||
### 编写管理器(provider)
|
||||
|
||||
为 `ralsh` 编写新的管理器(provider)是很容易的,也花费不了多少工夫,但是这一步骤是至关重要的。正因为如此,`ralsh` 提供了大量的调用约定,使得可以根据管理器所能提供的能力而调整其实现复杂性成为可能。管理器可以使用遵循特定调用约定的外部脚本,也可以以 C++ 实现并内置到 Libral 里面。到目前为止,有三种调用约定:
|
||||
|
||||
|
||||
* [simple][16] 调用约定是编写 shell 脚本用为管理器。
|
||||
* [JSON][7] 调用约定意味着可以利用 Ruby 或者 Python 脚本语言编写管理器。
|
||||
* [内部 C++ API[8] 可以被用来实现原生的管理器。
|
||||
|
||||
强烈建议使用 “simple” 或者 “JSON” 调用约定开始开发管理器。GitHub 上的 [simple.prov][15] 文件包含了一个简单的 shell 管理器框架,应该很容易的替换为你自己的管理器。[python.prov][16] 文件包含了利用 Python编写的 JSON 管理器框架。
|
||||
|
||||
利用高级脚本语言编写的管理器存在一个问题是,对于这些语言,在当前运行 Libral 的系统上需要包含所有的支持库在内运行环境。在某些情况下,这不是一个障碍;举例子来说,基于 “yum” 的包管理的管理器需要 Python 被安装在当前的系统上,因为 “yum” 就是用 Python 开发的。
|
||||
|
||||
然而在很多时候,无法预期一种 Bourne shell(Bash)之外的设计语言能够安装到所有的管理系统上。通常,管理器的编写者需要一个更加强大的脚本编译环境是实际需要。然而事与愿违,绑定一个完整的 Ruby 或 Python 作为解释器来运行将会增加 Libral 的大小超出了实际使用环境对资源的限制。另一方面,通常选择 Lua 或者 JavaScript 作为可嵌入的脚本编辑语言是不适应这种环境的,因为大多数的管理器的编写者不熟悉他们,通常情况下需要做大量的工作才能满足系统管理的实际需求。
|
||||
|
||||
Libral 绑定了一个 [mruby][17] 版本,一个小的、嵌入在 Ruby 的版本,提供给管理器的编写者一个稳定的基础以及功能强大的可实现的程序设计语言。mruby 是 Ruby 语言的一个完整实现,尽管其减少了大量的标准库支持。与 Libral 绑定的 mruby 包含了 Ruby 用于脚本编辑管理任务的大多数的重要标准库,其将基于管理器编写者的需求随着时间的推移得到加强。Libral 的 mruby 绑定了 API 适配器使编写管理器更适合 JSON 约定,比如它包含了简单的工具(如编译修改结构体文件的 [Augeas][18])来解决解析和输出 JSON 的约定。[mruby.prov][19] 文件包含了利用 mruby 编写的 JSON 管理器框架实例。
|
||||
|
||||
|
||||
### 下一步工作
|
||||
|
||||
|
||||
Libral 最关键的是下一步要使其增加广泛的可用性——从 [预编译的 tarball][20] 对于开发管理器的起步和深入是一个不错的方法,但是 Libral 也需要打包到主流的发行版上,并在上面可以找到。同样的,Libral 强大的功能取决于它附带的管理器的集合,及需要被扩展覆盖一组核心管理功能。Libral 的网站上包含了[一个 todo 列表][21]列出了管理器的最迫切需求。
|
||||
|
||||
现在有多种方法能够提高不同用途的 Libral 的可用性:从编写更多程序语言的绑定,举例来说,Python 或者 Go;到使 `ralsh` 更容易在 shell 脚本中使用,除了现有的可读输出和 JSON 输出之外,可以很轻松的在 shell 脚本中格式化输出。在大规模的管理中使用 Libral 也能够在增加上面讨论过的远程 API 而得到改良,Libral 利用像 SSH 这样的传输工具实现更好的支持批量安装要求为各种架构提供预编译的 tarball,并且脚本基于所发现的目标系统架构选择正确的包。
|
||||
|
||||
Libral 和它的 API、它的性能能够不断地进化发展;一个有趣的可能性是为 API 增加提醒能力,这样做可以向系统报告资源在超出它的范围发生的变化。Libral 面临的挑战是保持小型化、轻量级和良好定义的工具,来对抗不断增加的用例和管理性能——我希望每一个读者都能成为这个挑战之旅的一部分。
|
||||
|
||||
如果这让你很好奇,我很想听听你的想法,可以用拉取请求的方式,也可以是增强请求方式,亦或者报告你对 ralsh 体验经验。
|
||||
|
||||
(题图:[Internet Archive Book Images][10],修改:Opensource.com. CC BY-SA 4.0)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
David Lutterkort - 戴维是一个 Puppet 的软件工程师,他曾经参与的项目有 Direct Puppet 和最好的供给工具 Razor。他是 Puppet 最早的编著者之一,也是配置编辑工具 Augeas 的主要作者。
|
||||
|
||||
------------------------
|
||||
|
||||
via: https://opensource.com/article/17/5/intro-libral-systems-management-library-linux
|
||||
|
||||
作者:[David Lutterkort][a]
|
||||
译者:[stevenzdg988](https://github.com/stevenzdg988)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/david-lutterkort
|
||||
[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://github.com/puppetlabs/libral/blob/master/doc/invoke-simple.md
|
||||
[7]:https://github.com/puppetlabs/libral/blob/master/doc/invoke-json.md
|
||||
[8]:https://github.com/puppetlabs/libral/blob/master/doc/invoke-native.md
|
||||
[9]:https://opensource.com/article/17/5/intro-libral-systems-management-library-linux?rate=PqOZGb7A0LUlHQRwkzl23iaJZ2ZUy6gKcc6HOzaRL58
|
||||
[10]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR
|
||||
[11]:https://github.com/puppetlabs/libral
|
||||
[12]:https://github.com/puppetlabs/libral
|
||||
[13]:https://github.com/puppetlabs/libral#building-and-installation
|
||||
[14]:http://download.augeas.net/libral/ralsh-latest.tgz
|
||||
[15]:https://github.com/puppetlabs/libral/blob/master/examples/providers/simple.prov
|
||||
[16]:https://github.com/puppetlabs/libral/blob/master/examples/providers/python.prov
|
||||
[17]:http://mruby.org/
|
||||
[18]:http://augeas.net/
|
||||
[19]:https://github.com/puppetlabs/libral/blob/master/examples/providers/mruby.prov
|
||||
[20]:http://download.augeas.net/libral/ralsh-latest.tgz
|
||||
[21]:https://github.com/puppetlabs/libral#todo-list
|
||||
[22]:https://opensource.com/user/140051/feed
|
||||
[23]:https://opensource.com/users/david-lutterkort
|
||||
@@ -0,0 +1,177 @@
|
||||
Samba 系列(十三):如何在 Samba4 AD 中使用 iRedMail 配置 Thunderbird
|
||||
============================================================
|
||||
|
||||
|
||||
本教程将指导你如何使用 iRedMail 服务器配置 Mozilla Thunderbird 客户端,以便通过 IMAPS 和 SMTP 提交协议发送和接收邮件,如何使用 Samba AD LDAP 服务器设置联系人数据库以及如何配置其他相关的邮件功能,例如通过 LDAP 数据库离线副本启用 Thunderbird 联系人。
|
||||
|
||||
安装和配置 Mozilla Thunderbird 客户端的过程适用于安装在 Windows 或 Linux 操作系统上的 Thunderbird 客户端。
|
||||
|
||||
#### 要求
|
||||
|
||||
1. [如何在 CentOS 7 上安装 iRedMail 集成到 Samba4 AD][0]
|
||||
2. [如何配置和集成 iRedMail 服务到 Samba4 AD DC][1]
|
||||
3. [将 iRedMail Roundcube 与 Samba4 AD DC 集成][2]
|
||||
|
||||
|
||||
### 第一步:为 iRedMail 服务器配置 Thunderbird
|
||||
|
||||
1、 在安装完成 Thunderbird 邮件客户端之后,点击启动器或者快捷方式打开程序,并在首屏检查 E-mail 系统集成,然后点击跳过集成按钮继续。
|
||||
|
||||
[][3]
|
||||
|
||||
*Thunderbird 系统集成*
|
||||
|
||||
2、 在欢迎界面点击跳过并使用我已存在的邮件按钮添加你的名字、你的 Samba 帐户邮件地址以及密码,检查记住密码区域并点击继续按钮启动你的邮箱帐户设置。
|
||||
|
||||
在 Thunderbird 客户端尝试识别由 iRedMail 服务器提供的正确的IMAP设置后,点击手动配置按钮手动设置 Thunderbird。
|
||||
|
||||
[][4]
|
||||
|
||||
*Thunderbird 邮箱帐户设置*
|
||||
|
||||
3、 邮件帐户设置窗口展开后,通过添加正确的 iRedMail 服务器 FQDN 来手动编辑 IMAP 和 SMTP 设置,为邮件服务添加安全端口(IMAPS 为 993,发送为 587),为每个端口选择合适的 SSL 通信通道并验证然后点击完成完成设置。使用以下图片作为指导。
|
||||
|
||||
[][5]
|
||||
|
||||
*Thunderbird iRedMail 设置*
|
||||
|
||||
4、 由于你的 iRedMail 服务器使用自签名证书,屏幕上应会显示一个新的“安全异常”窗口。点击永久存储此异常并按确认安全异常按钮添加此安全性异常,Thunderbird 客户端应该就被成功配置了。
|
||||
|
||||
[][6]
|
||||
|
||||
*Thunderbird 安全异常*
|
||||
|
||||
你会看到你的域帐号的所有已收文件,并且你能够从你的域或者其他域发送或者接收文件。
|
||||
|
||||
[][7]
|
||||
|
||||
*域邮箱收件箱*
|
||||
|
||||
### 第二步:使用 Samba AD LDAP 设置 Thunderbird 联系人数据库
|
||||
|
||||
5、 为了让 Thunderbird 客户端查询 Samba AD LDAP 数据库中的联系人,点击“设置”菜单,在左边面板右键单击您的帐户,如下图片所示找到 “Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories”
|
||||
|
||||
[][8]
|
||||
|
||||
*Thunderbird Samba AD LDAP 设置*
|
||||
|
||||
[][9]
|
||||
|
||||
*Thunderbird Composition & Addressing 设置*
|
||||
|
||||
6、 LDAP 目录服务器窗口应该带开了,点击添加按钮并将下面的内容填写到目录服务器属性窗口中:
|
||||
|
||||
在 “常规” 选项卡上添加此对象的描述性名称,添加你的域的名称或 Samba 域控制器的 FQDN,你的域的基本 DN 形式是 “dc=你的域,dc=tld”,LDAP 端口号 389,vmail 绑定 DN 帐户用于以 vmail@your_domain.tld 的形式查询 Samba AD LDAP 数据库。
|
||||
|
||||
使用下面的截图作为指导:
|
||||
|
||||
[][10]
|
||||
|
||||
*目录服务器属性*
|
||||
|
||||
7、 在下一步中,从目录服务器属性进入高级选项卡,并在搜索过滤栏添加下面的内容:
|
||||
|
||||
```
|
||||
(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))
|
||||
```
|
||||
[][11]
|
||||
|
||||
*添加搜索过滤*
|
||||
|
||||
让其他的设置保持默认,并点击 OK 按钮来应用更改,再次点击 OK 按钮关闭 LDAP 目录服务器窗口,在账户设置界面点击 OK 关闭窗口。
|
||||
|
||||
[][12]
|
||||
|
||||
*选择 LDAP 目录服务器*
|
||||
|
||||
8、 要测试 Thunderbird 是否能够向 Samba AD LDAP 数据库请求联系人,点击上方的地址簿图标,选择之前创建的 LDAP 数据库名。
|
||||
|
||||
添加绑定 DN 帐户密码来查询 AD LDAP 服务器,勾选使用密码管理器记住密码,然后点击确定按钮保存更改并关闭窗口。
|
||||
|
||||
[][13]
|
||||
|
||||
*Thunderbird Samba AD LDAP 测试*
|
||||
|
||||
9、 使用上面的搜索框搜索 Samba AD 联系人,并提供一个域名帐户名。注意没有在 AD E-mail 字段声明的邮件地址的 Samba AD 帐户不会在 Thunderbird 地址簿搜索中列出。
|
||||
|
||||
[][14]
|
||||
|
||||
*搜索 Samba AD 邮件联系人*
|
||||
|
||||
10、 要在编写电子邮件时搜索联系人,请单击视图→联系人侧边栏或按 F9 键打开 “联系人” 面板。
|
||||
|
||||
[][15]
|
||||
|
||||
*在 Thunderbird 中搜索联系人*
|
||||
|
||||
11、 选择合适的地址簿,你应该能够搜索并添加收件人的电子邮件地址。发送第一封邮件时,会出现一个新的安全警报窗口。点击确认安全例外,邮件应该就能发送到收件人地址中了。
|
||||
|
||||
[][16]
|
||||
|
||||
*在 Thunderbird 发送邮件*
|
||||
|
||||
12、 如果你想通过仅针对特定 AD 组织单位的 Samba LDAP 数据库搜索联系人,请从左边面板编辑你的目录服务器名称的地址簿,点击属性并添加自定义的 Samba AD OU,如下所示。
|
||||
|
||||
```
|
||||
ou=your_specific_ou,dc=your_domain,dc=tld
|
||||
```
|
||||
[][17]
|
||||
|
||||
*Samba LDAP 数据库中搜索联系人*
|
||||
|
||||
### 第三步:设置 LDAP 离线副本
|
||||
|
||||
13、 要为 Thunderbird 配置 Samba AD LDAP 离线副本,请点击“地址簿”按钮,选择你的 LDAP 通讯录,打开“目录服务器属性” -> “常规” 选项卡,将端口号更改为 3268。
|
||||
|
||||
接着切换到离线选项卡并点击“现在下载”按钮开始在本地复制 Samba AD LDAP 数据库。
|
||||
|
||||
[][18]
|
||||
|
||||
*在 Thunderbird 设置 LDAP 离线副本*
|
||||
|
||||
[][19]
|
||||
|
||||
*为离线下载 LDAP 数据库*
|
||||
|
||||
当同步联系人完成后,你将收到消息复制成功通知。点击 OK 并关闭所有窗口。在无法访问 Samba 域控制器的情况下,你仍然可以通过离线方式进行搜索。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。
|
||||
|
||||
--------------
|
||||
|
||||
via: https://www.tecmint.com/configure-thunderbird-with-iredmail-for-samba4-ad-ldap/
|
||||
|
||||
作者:[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/
|
||||
[0]:https://linux.cn/article-8567-1.html
|
||||
[1]:https://linux.cn/article-8673-1.html
|
||||
[2]:https://linux.cn/article-8678-1.html
|
||||
[3]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png
|
||||
[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png
|
||||
[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png
|
||||
[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png
|
||||
[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png
|
||||
[8]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png
|
||||
[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png
|
||||
[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png
|
||||
[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png
|
||||
[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png
|
||||
[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png
|
||||
[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png
|
||||
[15]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png
|
||||
[16]:https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg
|
||||
[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png
|
||||
[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png
|
||||
[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png
|
||||
[20]:https://www.tecmint.com/author/cezarmatei/
|
||||
[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
|
||||
[22]:https://www.tecmint.com/free-linux-shell-scripting-books/
|
||||
@@ -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。
|
||||
|
||||

|
||||
|
||||
*图 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 只使用一个或两个直接数据指针,而不使用间接指针。
|
||||
|
||||

|
||||
|
||||
*图 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
|
||||
175
published/201707/20170529 NMAP OS Detection.md
Normal file
175
published/201707/20170529 NMAP OS Detection.md
Normal 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 所示:
|
||||
|
||||

|
||||
|
||||
*图 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所示,扫描显示七个开放的端口。
|
||||
|
||||

|
||||
|
||||
*图 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.04,Linux 内核为 4.8,运行时间猜的较准确。
|
||||
|
||||
我在另一个系统了又进行了一次测试,结果如图3所示:
|
||||
|
||||

|
||||
|
||||
*图 3*
|
||||
|
||||
这次扫描中开放的端口与上次不同。所猜的系统为 ‘Microsoft Windows 2000|XP’,实际上是 Windows XP sp3。
|
||||
|
||||
### 端口嗅探结果
|
||||
|
||||
让我们来看看图 2 所示的第一次扫描中在后台发生了什么。
|
||||
|
||||
首先 NMAP 执行一次 TCP 隐秘扫描,在本次系统探测实例中以一个如图 4 所示的数据包 2032 开始。
|
||||
|
||||

|
||||
|
||||
*图 4*
|
||||
|
||||
序列生成(Sequence Generation)开始于数据包 2032/2033,第六个数据包是 2047/2048。注意每个都被发送两次,且每隔 100ms 发送下一个数据包。
|
||||
|
||||
发送的 ICMP 数据包是 2050 - 2053,2 个数据包重复一遍,实际上是 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
|
||||
165
published/201707/20170529 Ubuntu GamePack.md
Normal file
165
published/201707/20170529 Ubuntu GamePack.md
Normal 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 的游戏,可以用 PlayOnLinux,WINE 和 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 的屏幕。
|
||||
|
||||

|
||||
|
||||
*图 1*
|
||||
|
||||
一旦加载完毕,安装程序就可以继续安装了。图 2 显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变硬盘内容的情况下把它加载到内存中来试试它。
|
||||
|
||||

|
||||
|
||||
*图 2*
|
||||
|
||||
接下来继续选择 ‘Install Ubuntu’ 进行安装了。
|
||||
|
||||
下一个屏幕,如图 3 所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:图形、WiFi、Flash、 MP3 和其他更新。
|
||||
|
||||
当定制好你的系统后,就可以点击“Continue”
|
||||
|
||||

|
||||
|
||||
*图 3*
|
||||
|
||||
接下来,您必须指定驱动器将如何配置使用,如图 4 所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。
|
||||
|
||||

|
||||
|
||||
*图 4*
|
||||
|
||||
接下来在图 5 中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。
|
||||
|
||||

|
||||
|
||||
*图 5*
|
||||
|
||||
接下来,如图 6 所示,你将按照提示选择时区,选择完毕后点击“Continue”。
|
||||
|
||||

|
||||
|
||||
*图 6*
|
||||
|
||||
接下来,如图 7 所示一个窗口,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。
|
||||
|
||||

|
||||
|
||||
*图 7*
|
||||
|
||||
最后一个配置屏幕是为您设置一个用户帐户,如图 8 所示。键入您的姓名、计算机名、用户名、密码并选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。
|
||||
|
||||

|
||||
|
||||
*图 8*
|
||||
|
||||
安装将按指定来设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图 9 所示。所有内容复制到硬盘并设置好,您将被提示移除引导介质并允许重新启动系统。
|
||||
|
||||

|
||||
|
||||
*图 9*
|
||||
|
||||
重新启动后,您需要选择要求用户登录,会得到类似于图 10 的屏幕。输入指定的用户密码登录到 Ubuntu Gamepack。
|
||||
|
||||

|
||||
|
||||
*图 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
|
||||
@@ -0,0 +1,346 @@
|
||||
LKU:一套在 Ubuntu/LinuxMint 上编译、安装和更新最新内核的 Shell 脚本
|
||||
============================================================
|
||||
|
||||
以手动方式安装和升级最新的 Linux 内核对于每个人来说都不是一件小事,甚至包括一些有经验的人也是如此。它需要对 Linux 内核有深入的了解。过去我们已经介绍了 UKUU(Ubuntu Kernel Upgrade Utility),它可以从 kernel.ubuntu.com 网站上自动检测最新的主线内核,并弹出一个不错的窗口界面进行安装。
|
||||
|
||||
[Linux Kernel Utilities][2] (LKU)提供一组 shell 脚本(三个 Shell 脚本),可以帮助用户从 kernel.org 获取并编译和安装最新的 Linux 内核,也可以从 kernel.ubuntu.com 获取安装最新的预编译的 Ubuntu 内核。甚至可以根据需要选择所需的内核(手动内核选择)。
|
||||
|
||||
该脚本还将根据 PGP 签名文件检查下载的归档文件,并且可以选择通用和低延迟版内核。
|
||||
|
||||
建议阅读:[ukuu:一种在基于 Ubuntu 的系统上轻松安装升级 Linux 内核的方式][3]
|
||||
|
||||
它可以删除或清除所有非活动的内核,并且不会为了安全目的留下备份的内核。强烈建议在执行此脚本之前重新启动一次。
|
||||
|
||||
* `compile_linux_kernel.sh` :用户可以从 kernel.org 编译和安装所需的或最新的内核
|
||||
* `update_ubuntu_kernel.sh` :用户可以从 kernel.ubuntu.com 安装并更新所需或最新的预编译 Ubuntu 内核
|
||||
* `remove_old_kernels.sh` :这将删除或清除所有非活动内核,并且只保留当前加载的版本
|
||||
|
||||
kernel.org 有固定的发布周期(每三个月一次),发布的内核包括了新的功能,改进了硬件和系统性能。由于它具有标准的发布周期,除了滚动发布的版本(如 Arch Linux,openSUSE Tumbleweed 等),大多数发行版都不提供最新的内核。
|
||||
|
||||
### 如何安装 Linux Kernel Utilities (LKU)
|
||||
|
||||
正如我们在文章的开头所说的,它的 shell 脚本集只是克隆开发人员的 github 仓库并运行相应的 shell 文件来执行这个过程。
|
||||
|
||||
```
|
||||
$ git clone https://github.com/mtompkins/linux-kernel-utilities.git && cd linux-kernel-utilities
|
||||
```
|
||||
|
||||
### 安装指定版本内核
|
||||
|
||||
为了测试的目的,我们将安装 Linux v4.4.10-xenial 内核。在安装新内核之前,我们需要通过 `uanme -a` 命令检查当前安装的内核版本,以便我们可以检查新内核是否可以安装。
|
||||
|
||||
```
|
||||
$ uname -a
|
||||
Linux magi-VirtualBox 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
|
||||
```
|
||||
|
||||
根据上面的输出,我们的系统使用的是 4.4.0-21 通用内核。
|
||||
|
||||
只需运行 `update_ubuntu_kernel.sh` shell 脚本。第一次运行脚本时会检查是否满足所有的依赖关系,然后自动安装缺少的依赖项。它会检测系统使用的发行版,并检索 kernel.ubuntu.com 中可用的预编译内核。现在,从列表中选择你需要的内核并输入序号,然后按回车键,它将下载内核映像(linux-headers-4.4.10,linux-headers-4.4.10-xxx-generic 和 linux-image-4.4.10-xxx-generic)。
|
||||
|
||||
一旦内核镜像被下载,它将要求输入 `sudo` 密码来启动新内核的安装。
|
||||
|
||||
```
|
||||
$ ./update_ubuntu_kernel.sh
|
||||
|
||||
[+] Checking Distro
|
||||
\_ Distro identified as LinuxMint.
|
||||
|
||||
[+] Checking Dependencies
|
||||
curl Found
|
||||
dkms Found
|
||||
git Found
|
||||
sudo Found
|
||||
wget Found
|
||||
whiptail Found
|
||||
lynx Not Found
|
||||
|
||||
-- Installing Dependencies --
|
||||
|
||||
[!] The first time this script is run missing dependencies will be installed.
|
||||
For compiling a kernel this may take a bit of time. Feedback will be provided.
|
||||
|
||||
[+] Dependencies
|
||||
\_Elevating permissions as necessary . . .
|
||||
[%] Elevated
|
||||
|
||||
[+] Testing for previous held packages and trying to correct any found.
|
||||
\_Passed
|
||||
|
||||
[+] Updating package cache . . .
|
||||
\_Complete
|
||||
|
||||
[+] Installing dependencies . . .
|
||||
\_Complete
|
||||
|
||||
curl Found
|
||||
dkms Found
|
||||
git Found
|
||||
sudo Found
|
||||
wget Found
|
||||
whiptail Found
|
||||
lynx Found
|
||||
|
||||
[+] Changing to temporary directory to work in . . .
|
||||
\_ Temporary directory access granted: /tmp/tmp.97eHDsmg2K
|
||||
|
||||
[+] Removing any conflicting remnants . . .
|
||||
\_ Done
|
||||
|
||||
[+] Retrieving available kernel choices . . .
|
||||
\_ Precompiled kernels available from kernel.ubuntu.com:
|
||||
|
||||
1) Linux v4.11 2) Linux v4.11.3 3) Linux v4.11.2 4) Linux v4.11.1
|
||||
5) Linux v4.10 6) Linux v4.10.17 7) Linux v4.10.16 8) Linux v4.10.15
|
||||
9) Linux v4.10.14 10) Linux v4.10.13 11) Linux v4.10.12 12) Linux v4.10.11
|
||||
13) Linux v4.10.10 14) Linux v4.10.9 15) Linux v4.10.8 16) Linux v4.10.7
|
||||
17) Linux v4.10.6 18) Linux v4.10.5 19) Linux v4.10.4 20) Linux v4.10.3
|
||||
21) Linux v4.10.2 22) Linux v4.10.1 23) Linux v4.9 24) Linux v4.9.30
|
||||
25) Linux v4.9.29 26) Linux v4.9.28 27) Linux v4.9.27 28) Linux v4.9.26
|
||||
29) Linux v4.9.25 30) Linux v4.9.24 31) Linux v4.9.23 32) Linux v4.9.22
|
||||
33) Linux v4.9.21 34) Linux v4.9.20 35) Linux v4.9.19 36) Linux v4.9.18
|
||||
37) Linux v4.9.17 38) Linux v4.9.16 39) Linux v4.9.15 40) Linux v4.9.14
|
||||
41) Linux v4.9.13 42) Linux v4.9.12 43) Linux v4.9.11 44) Linux v4.9.10
|
||||
45) Linux v4.9.9 46) Linux v4.9.8 47) Linux v4.9.7 48) Linux v4.9.6
|
||||
49) Linux v4.9.5 50) Linux v4.9.4 51) Linux v4.9.3 52) Linux v4.9.2
|
||||
53) Linux v4.9.1 54) Linux v4.8 55) Linux v4.8.17 56) Linux v4.8.16
|
||||
57) Linux v4.8.15 58) Linux v4.8.14 59) Linux v4.8.13 60) Linux v4.8.12
|
||||
61) Linux v4.8.11 62) Linux v4.8.10 63) Linux v4.8.9 64) Linux v4.8.8
|
||||
65) Linux v4.8.7 66) Linux v4.8.6 67) Linux v4.8.5 68) Linux v4.8.4
|
||||
69) Linux v4.8.3 70) Linux v4.8.2 71) Linux v4.8.1 72) Linux v4.7
|
||||
73) Linux v4.7.10 74) Linux v4.7.9 75) Linux v4.7.8 76) Linux v4.7.7
|
||||
77) Linux v4.7.6 78) Linux v4.7.5 79) Linux v4.7.4 80) Linux v4.7.3
|
||||
81) Linux v4.7.2 82) Linux v4.7.1 83) Linux v4.6.7 84) Linux v4.6.6
|
||||
85) Linux v4.6.5 86) Linux v4.6.4 87) Linux v4.6.3-yakkety 88) Linux v4.6.2-yakkety
|
||||
89) Linux v4.6.1-yakkety 90) Linux v4.6-yakkety 91) Linux v4.5.7-yakkety 92) Linux v4.5.6-yakkety
|
||||
93) Linux v4.5.5-yakkety 94) Linux v4.5.4-yakkety 95) Linux v4.5.3-wily 96) Linux v4.5.2-wily
|
||||
97) Linux v4.5.1-wily 98) Linux v4.5-wily 99) Linux v4.4.70 100) Linux v4.4.69
|
||||
101) Linux v4.4.68 102) Linux v4.4.67 103) Linux v4.4.66 104) Linux v4.4.65
|
||||
105) Linux v4.4.64 106) Linux v4.4.63 107) Linux v4.4.62 108) Linux v4.4.61
|
||||
109) Linux v4.4.60 110) Linux v4.4.59 111) Linux v4.4.58 112) Linux v4.4.57
|
||||
113) Linux v4.4.56 114) Linux v4.4.55 115) Linux v4.4.54 116) Linux v4.4.53
|
||||
117) Linux v4.4.52 118) Linux v4.4.51 119) Linux v4.4.50 120) Linux v4.4.49
|
||||
121) Linux v4.4.48 122) Linux v4.4.47 123) Linux v4.4.46 124) Linux v4.4.45
|
||||
125) Linux v4.4.44 126) Linux v4.4.43 127) Linux v4.4.42 128) Linux v4.4.41
|
||||
129) Linux v4.4.40 130) Linux v4.4.39 131) Linux v4.4.38 132) Linux v4.4.37
|
||||
133) Linux v4.4.36 134) Linux v4.4.35 135) Linux v4.4.34 136) Linux v4.4.33
|
||||
137) Linux v4.4.32 138) Linux v4.4.31 139) Linux v4.4.30 140) Linux v4.4.29
|
||||
141) Linux v4.4.28 142) Linux v4.4.27 143) Linux v4.4.26 144) Linux v4.4.25
|
||||
145) Linux v4.4.24 146) Linux v4.4.23 147) Linux v4.4.22 148) Linux v4.4.21
|
||||
149) Linux v4.4.20 150) Linux v4.4.19 151) Linux v4.4.17 152) Linux v4.4.16
|
||||
153) Linux v4.4.15 154) Linux v4.4.14-xenial 155) Linux v4.4.13-xenial 156) Linux v4.4.12-xenial
|
||||
157) Linux v4.4.11-xenial 158) Linux v4.4.10-xenial 159) Linux v4.4.9-xenial 160) Linux v4.4.8-wily
|
||||
161) Linux v4.4.7-wily 162) Linux v4.4.6-wily 163) Linux v4.4.5-wily 164) Linux v4.4.4-wily
|
||||
165) Linux v4.4.3-wily 166) Linux v4.4.2-wily 167) Linux v4.4.1-wily 168) Linux v4.4-wily
|
||||
169) Linux v4.3.6-wily 170) Linux v4.3.5-wily 171) Linux v4.3.4-wily 172) Linux v4.3.3-wily
|
||||
173) Linux v4.3.2-wily 174) Linux v4.3.1-wily 175) Linux v4.3-wily 176) Linux v4.3-unstable
|
||||
177) Linux v4.2.8-wily 178) Linux v4.2.8-ckt13 179) Linux v4.2.8-ckt12-wily 180) Linux v4.2.8-ckt10-yakkety
|
||||
181) Linux v4.2.8-ckt9-wily 182) Linux v4.2.8-ckt8-wily 183) Linux v4.2.8-ckt7-wily 184) Linux v4.2.8-ckt6-wily
|
||||
185) Linux v4.2.8-ckt5-wily 186) Linux v4.2.8-ckt4-wily 187) Linux v4.2.8-ckt3-wily 188) Linux v4.2.8-ckt2-wily
|
||||
189) Linux v4.2.8-ckt1-wily 190) Linux v4.2.7-wily 191) Linux v4.2.6-wily 192) Linux v4.2.5-wily
|
||||
193) Linux v4.2.4-wily 194) Linux v4.2.4-unstable 195) Linux v4.2.3-unstable 196) Linux v4.2.2-unstable
|
||||
197) Linux v4.2.1-unstable 198) Linux v4.2-wily 199) Linux v4.2-unstable 200) Linux v4.1.40
|
||||
201) Linux v4.1.39 202) Linux v4.1.38 203) Linux v4.1.37 204) Linux v4.1.36
|
||||
205) Linux v4.1.35 206) Linux v4.1.34 207) Linux v4.1.33 208) Linux v4.1.32
|
||||
209) Linux v4.1.31 210) Linux v4.1.30 211) Linux v4.1.29 212) Linux v4.1.28
|
||||
213) Linux v4.1.27-wily 214) Linux v4.1.26-wily 215) Linux v4.1.25-wily 216) Linux v4.1.24-wily
|
||||
217) Linux v4.1.23-wily 218) Linux v4.1.22-wily 219) Linux v4.1.21-wily 220) Linux v4.1.20-wily
|
||||
221) Linux v4.1.19-wily 222) Linux v4.1.18-wily 223) Linux v4.1.17-wily 224) Linux v4.1.16-wily
|
||||
225) Linux v4.1.15-wily 226) Linux v4.1.14-wily 227) Linux v4.1.13-wily 228) Linux v4.1.12-wily
|
||||
229) Linux v4.1.11-wily 230) Linux v4.1.11-unstable 231) Linux v4.1.10-unstable 232) Linux v4.1.9-unstable
|
||||
233) Linux v4.1.8-unstable 234) Linux v4.1.7-unstable 235) Linux v4.1.6-unstable 236) Linux v4.1.5-unstable
|
||||
237) Linux v4.1.4-unstable 238) Linux v4.1.3-unstable 239) Linux v4.1.2-unstable 240) Linux v4.1.1-unstable
|
||||
241) Linux v4.1-wily 242) Linux v4.1-unstable 243) Linux v4.0.9-wily 244) Linux v4.0.8-wily
|
||||
245) Linux v4.0.7-wily 246) Linux v4.0.6-wily 247) Linux v4.0.5-wily 248) Linux v4.0.4-wily
|
||||
249) Linux v4.0.3-wily 250) Linux v4.0.2-wily 251) Linux v4.0.1-wily 252) Linux v4.0-vivid
|
||||
|
||||
Select your desired kernel: 158
|
||||
|
||||
Do you want the lowlatency kernel? (y/[n]):
|
||||
|
||||
[+] Processing selection
|
||||
\_ Determining CPU type: amd64
|
||||
\_ Locating source of v4.4.10-xenial generic kernel packages.
|
||||
\_ Done
|
||||
|
||||
[+] Checking AntiVirus flag and disabling if necessary
|
||||
[+] Installing kernel . . .
|
||||
[sudo] password for magi:
|
||||
Selecting previously unselected package linux-headers-4.4.10-040410.
|
||||
(Reading database ... 230647 files and directories currently installed.)
|
||||
Preparing to unpack linux-headers-4.4.10-040410_4.4.10-040410.201605110631_all.deb ...
|
||||
Unpacking linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ...
|
||||
Selecting previously unselected package linux-headers-4.4.10-040410-generic.
|
||||
Preparing to unpack linux-headers-4.4.10-040410-generic_4.4.10-040410.201605110631_amd64.deb ...
|
||||
Unpacking linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
|
||||
Selecting previously unselected package linux-image-4.4.10-040410-generic.
|
||||
Preparing to unpack linux-image-4.4.10-040410-generic_4.4.10-040410.201605110631_amd64.deb ...
|
||||
Done.
|
||||
Unpacking linux-image-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
|
||||
Setting up linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ...
|
||||
Setting up linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
|
||||
Examining /etc/kernel/header_postinst.d.
|
||||
run-parts: executing /etc/kernel/header_postinst.d/dkms 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
|
||||
Setting up linux-image-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
|
||||
Running depmod.
|
||||
update-initramfs: deferring update (hook will be called later)
|
||||
Examining /etc/kernel/postinst.d.
|
||||
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
|
||||
run-parts: executing /etc/kernel/postinst.d/dkms 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
|
||||
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
|
||||
update-initramfs: Generating /boot/initrd.img-4.4.10-040410-generic
|
||||
Warning: No support for locale: en_IN
|
||||
run-parts: executing /etc/kernel/postinst.d/pm-utils 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
|
||||
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
|
||||
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.4.10-040410-generic /boot/vmlinuz-4.4.10-040410-generic
|
||||
Generating grub configuration file ...
|
||||
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
|
||||
Found linux image: /boot/vmlinuz-4.4.10-040410-generic
|
||||
Found initrd image: /boot/initrd.img-4.4.10-040410-generic
|
||||
Found linux image: /boot/vmlinuz-4.4.9-040409-lowlatency
|
||||
Found initrd image: /boot/initrd.img-4.4.9-040409-lowlatency
|
||||
Found linux image: /boot/vmlinuz-4.4.0-21-generic
|
||||
Found initrd image: /boot/initrd.img-4.4.0-21-generic
|
||||
Found memtest86+ image: /boot/memtest86+.elf
|
||||
Found memtest86+ image: /boot/memtest86+.bin
|
||||
done
|
||||
\_ Done
|
||||
```
|
||||
|
||||
安装后需要重新启动以使用新安装的内核。
|
||||
|
||||
```
|
||||
$ sudo reboot now
|
||||
```
|
||||
|
||||
现在,你正在使用的就是新安装的 4.4.10-040410-generic 版本内核。
|
||||
|
||||
```
|
||||
$ uname -a
|
||||
Linux magi-VirtualBox 4.4.10-040410-generic #201605110631 SMP Wed May 11 10:33:23 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
|
||||
```
|
||||
|
||||
### 安装最新版本内核
|
||||
|
||||
过程与上述相同,它将自动安装最新版本的内核。
|
||||
|
||||
```
|
||||
$ ./update_ubuntu_kernel.sh --latest
|
||||
|
||||
[+] Checking Distro
|
||||
\_ Distro identified as LinuxMint.
|
||||
|
||||
[+] Checking Dependencies
|
||||
curl Found
|
||||
dkms Found
|
||||
git Found
|
||||
sudo Found
|
||||
wget Found
|
||||
whiptail Found
|
||||
lynx Found
|
||||
|
||||
[+] Changing to temporary directory to work in . . .
|
||||
\_ Temporary directory access granted: /tmp/tmp.pLPYmCze6S
|
||||
|
||||
[+] Removing any conflicting remnants . . .
|
||||
\_ Done
|
||||
|
||||
[+] Retrieving available kernel choices . . .
|
||||
\_ Precompiled kernels available from kernel.ubuntu.com:
|
||||
.
|
||||
.
|
||||
.
|
||||
.
|
||||
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
|
||||
Found linux image: /boot/vmlinuz-4.11.3-041103-generic
|
||||
Found initrd image: /boot/initrd.img-4.11.3-041103-generic
|
||||
Found linux image: /boot/vmlinuz-4.4.10-040410-generic
|
||||
Found initrd image: /boot/initrd.img-4.4.10-040410-generic
|
||||
Found linux image: /boot/vmlinuz-4.4.9-040409-lowlatency
|
||||
Found initrd image: /boot/initrd.img-4.4.9-040409-lowlatency
|
||||
Found linux image: /boot/vmlinuz-4.4.0-21-generic
|
||||
Found initrd image: /boot/initrd.img-4.4.0-21-generic
|
||||
Found memtest86+ image: /boot/memtest86+.elf
|
||||
Found memtest86+ image: /boot/memtest86+.bin
|
||||
done
|
||||
\_ Done
|
||||
```
|
||||
|
||||
安装后需要重新启动以使用新安装的内核。
|
||||
|
||||
```
|
||||
$ sudo reboot now
|
||||
```
|
||||
|
||||
现在,你正在使用的就是最新版本 4.11.3-041103-generic 的内核。
|
||||
|
||||
```
|
||||
$ uname -a
|
||||
Linux magi-VirtualBox 4.11.3-041103-generic #201705251233 SMP Thu May 25 16:34:52 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
|
||||
```
|
||||
|
||||
### 删除或清除旧内核
|
||||
|
||||
只需要运行 `remove_old_kernels.sh` shell 脚本即可删除或清除所有非活动状态的内核。
|
||||
|
||||
```
|
||||
$ ./remove_old_kernels.sh
|
||||
|
||||
++++++++++++++++++++++++++++++++
|
||||
+++ W A R N I N G +++
|
||||
++++++++++++++++++++++++++++++++
|
||||
|
||||
A reboot is recommended before running this script to ensure the current kernel tagged
|
||||
as the boot kernel is indeed registered and old kernels properly marked for removal.
|
||||
If you have just installed or modified your existing kernel and do not reboot before
|
||||
running this script it may render you system INOPERABLE and that would indeed suck.
|
||||
|
||||
You have been warned.
|
||||
~the Mgmt
|
||||
|
||||
[?]Continue to automagically remove ALL old kernels? (y/N)y
|
||||
\_ Removing ALL old kernels . . .
|
||||
[sudo] password for magi:
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
The following packages will be REMOVED:
|
||||
linux-headers-4.4.0-21* linux-headers-4.4.0-21-generic* linux-headers-4.4.10-040410*
|
||||
linux-headers-4.4.10-040410-generic* linux-headers-4.4.9-040409* linux-headers-4.4.9-040409-lowlatency*
|
||||
linux-image-4.4.0-21-generic* linux-image-4.4.10-040410-generic* linux-image-4.4.9-040409-lowlatency*
|
||||
linux-image-extra-4.4.0-21-generic* linux-kernel-generic*
|
||||
0 upgraded, 0 newly installed, 11 to remove and 547 not upgraded.
|
||||
After this operation, 864 MB disk space will be freed.
|
||||
(Reading database ... 296860 files and directories currently installed.)
|
||||
Removing linux-kernel-generic (4.4.0-21) ...
|
||||
Removing linux-headers-4.4.0-21-generic (4.4.0-21.37) ...
|
||||
Removing linux-headers-4.4.0-21 (4.4.0-21.37) ...
|
||||
Removing linux-headers-4.4.10-040410-generic (4.4.10-040410.201605110631) ...
|
||||
Removing linux-headers-4.4.10-040410 (4.4.10-040410.201605110631) ...
|
||||
Removing linux-headers-4.4.9-040409-lowlatency (4.4.9-040409.201605041832) ...
|
||||
Removing linux-headers-4.4.9-040409 (4.4.9-040409.201605041832) ...
|
||||
Removing linux-image-extra-4.4.0-21-generic (4.4.0-21.37) ...
|
||||
.
|
||||
.
|
||||
.
|
||||
done
|
||||
Purging configuration files for linux-image-4.4.9-040409-lowlatency (4.4.9-040409.201605041832) ...
|
||||
Examining /etc/kernel/postrm.d .
|
||||
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 4.4.9-040409-lowlatency /boot/vmlinuz-4.4.9-040409-lowlatency
|
||||
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.4.9-040409-lowlatency /boot/vmlinuz-4.4.9-040409-lowlatency
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.2daygeek.com/lku-linux-kernel-utilities-compile-install-update-latest-kernel-in-linux-mint-ubuntu/
|
||||
|
||||
作者:[2DAYGEEK][a]
|
||||
译者:[firmianay](https://github.com/firmianay)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.2daygeek.com/author/2daygeek/
|
||||
[1]:http://www.2daygeek.com/author/2daygeek/
|
||||
[2]:https://github.com/mtompkins/linux-kernel-utilities
|
||||
[3]:http://www.2daygeek.com/ukuu-install-upgrade-linux-kernel-in-linux-mint-ubuntu-debian-elementary-os/
|
||||
@@ -0,0 +1,138 @@
|
||||
uCareSystem:Ubuntu/Linux Mint 的一体化系统更新和维护工具
|
||||
============================================================
|
||||
|
||||
[uCareSystem Core][2] 是一种能够自动执行基本的系统维护活动的轻型实用程序,另一方面它可以通过多种方式减少系统管理员的任务,节省大量时间。它没有任何 GUI,并提供纯粹的命令行界面来执行活动。
|
||||
|
||||
Ubuntu 中有几种实用程序来执行系统维护活动。每种工具有它们相应的独特功能和设计。你可以添加一个 cron 任务来自动化这些任务。
|
||||
|
||||
uCareSystem Core 会自动刷新发行版仓库、更新可用包列表、卸载包(过期包、孤儿包和旧的 Linux 内核)以及清理取回的包来节省系统磁盘空间。
|
||||
|
||||
- 建议阅读:[Stacer - Linux 系统优化器及监控工具][3]
|
||||
- 建议阅读:[BleachBit – 快速及最佳的方式清理你的 Linux 系统][4]
|
||||
- 建议阅读:[用 Ubuntu Cleaner 在 Ubuntu/LinuxMint 中释放一些空间][5]
|
||||
|
||||
### uCareSystem Core 功能
|
||||
|
||||
* 更新包列表(它将刷新包索引)
|
||||
* 下载及安装更新
|
||||
* 更新包及系统库到最新版本
|
||||
* 移除不需要的、过期的和孤儿包。
|
||||
* 移除旧内核(它为了安全保留当前和之前一个内核)
|
||||
* 移除不需要的配置文件
|
||||
* 清理已下载的临时包
|
||||
|
||||
### 在 Ubuntu/LinuxMint 中安装 uCareSystem Core
|
||||
|
||||
因为开发者提供了自己的 PPA,因此我们可以轻易地通过 PPA 在 Ubuntu/LinuxMint 中安装 uCareSystem Core。
|
||||
|
||||
```
|
||||
$ sudo add-apt-repository ppa:utappia/stable
|
||||
$ sudo apt update
|
||||
$ sudo apt install ucaresystem-core
|
||||
```
|
||||
|
||||
我们已经成功安装了 `uCareSystem Core` 包,并且在执行 CareSystem Core 命令之前要了解它是否会节省磁盘空间,使用 `df -h` 命令检查当前磁盘利用率。
|
||||
|
||||
```
|
||||
$ df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
udev 979M 0 979M 0% /dev
|
||||
tmpfs 200M 6.4M 194M 4% /run
|
||||
/dev/sda1 38G 19G 17G 54% /
|
||||
tmpfs 999M 216K 999M 1% /dev/shm
|
||||
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
|
||||
tmpfs 999M 0 999M 0% /sys/fs/cgroup
|
||||
tmpfs 200M 112K 200M 1% /run/user/1000
|
||||
```
|
||||
|
||||
只需在终端中运行 `ucaresystem-core` 命令,在结束之前它会自动执行而不需要人类交互。
|
||||
|
||||
```
|
||||
$ sudo ucaresystem-core
|
||||
|
||||
_______________________________________________________
|
||||
|
||||
uCareSystem Core v3.0
|
||||
~ '' ~
|
||||
|
||||
Welcome to all-in-one System Update and maintenance
|
||||
assistant app.
|
||||
|
||||
This simple script will automatically
|
||||
refresh your packagelist, download and
|
||||
install updates (if there are any), remove any old
|
||||
kernels, obsolete packages and configuration files
|
||||
to free up disk space, without any need of user
|
||||
interference.
|
||||
_______________________________________________________
|
||||
|
||||
uCareSystem Core will start in 5 seconds...
|
||||
#########################
|
||||
Started
|
||||
#########################
|
||||
|
||||
Ign:1 https://wire-app.wire.com/linux/debian stable InRelease
|
||||
Hit:2 https://wire-app.wire.com/linux/debian stable Release
|
||||
Hit:4 https://deb.nodesource.com/node_6.x yakkety InRelease
|
||||
Hit:5 https://repo.skype.com/deb stable InRelease
|
||||
Hit:6 http://in.archive.ubuntu.com/ubuntu yakkety InRelease
|
||||
Hit:7 http://archive.canonical.com/ubuntu yakkety InRelease
|
||||
.
|
||||
.
|
||||
.
|
||||
Removing linux-image-extra-4.8.0-34-generic (4.8.0-34.36) ...
|
||||
Purging configuration files for linux-image-extra-4.8.0-34-generic (4.8.0-34.36) ...
|
||||
Removing linux-image-extra-4.8.0-32-generic (4.8.0-32.34) ...
|
||||
Purging configuration files for linux-image-extra-4.8.0-32-generic (4.8.0-32.34) ...
|
||||
|
||||
#####################################
|
||||
Finished removing unused config files
|
||||
#####################################
|
||||
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
Del tilix 1.5.6-1~webupd8~yakkety1 [449 kB]
|
||||
Del tilix-common 1.5.6-1~webupd8~yakkety1 [174 kB]
|
||||
Del libfreetype6 2.6.3-3ubuntu1.2 [336 kB]
|
||||
Del terminix 1.5.6-1~webupd8~yakkety1 [13.7 kB]
|
||||
|
||||
######################################
|
||||
Cleaned downloaded temporary packages
|
||||
######################################
|
||||
|
||||
#########################
|
||||
Done
|
||||
#########################
|
||||
```
|
||||
|
||||
我可以看见它如预期那样工作。同样也可以发现大概在`/` 分区节省了 `2GB`。
|
||||
|
||||
```
|
||||
$ df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
udev 979M 0 979M 0% /dev
|
||||
tmpfs 200M 6.4M 194M 4% /run
|
||||
/dev/sda1 38G 18G 19G 49% /
|
||||
tmpfs 999M 216K 999M 1% /dev/shm
|
||||
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
|
||||
tmpfs 999M 0 999M 0% /sys/fs/cgroup
|
||||
tmpfs 200M 112K 200M 1% /run/user/1000
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.2daygeek.com/ucaresystem-system-update-and-maintenance-tool-for-ubuntu-linuxmint/
|
||||
|
||||
作者:[2DAYGEEK][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.2daygeek.com/author/2daygeek/
|
||||
[1]:http://www.2daygeek.com/author/2daygeek/
|
||||
[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]:https://linux.cn/article-8642-1.html
|
||||
@@ -0,0 +1,81 @@
|
||||
Linux 上如何安装并切换最新版本的 Python 3.6
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
**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`。但是如果你尝试获取可能的列表,我们会得到错误:
|
||||
|
||||
[][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
|
||||
```
|
||||
|
||||
[][7]
|
||||
|
||||
现在我们选择需要的版本并按需切换。对于设置使用配置命令:
|
||||
|
||||
```
|
||||
$ sudo update-alternatives --config python3
|
||||
```
|
||||
|
||||
[][8]
|
||||
|
||||
在提示符中,你需要指定默认使用的编号。
|
||||
|
||||
> 选择版本时要小心,不要去动 python(python2),只使用我说的 python3,Python 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/
|
||||
@@ -0,0 +1,206 @@
|
||||
三种在 Linux 上创建或扩展交换分区的简单方法
|
||||
============================================================
|
||||
|
||||
用户可以在任何 Linux 操作系统的安装过程中或者是其它必要的时候创建交换空间。如果你在安装 Linux 的时候忘记了创建或是你想要再增加交换分区的空间,你随时都可以再创建或增加。
|
||||
|
||||
有时候在你安装后摇升级 RAM 的时候需要增加一点交换分区的空间,比如你要将你的系统的 RAM 从 1GB 升级到 2GB 你,那么你就不得不将你的交换分区空间也升级一下(从 2GB 到 4GB),这是因为它使用的容量是物理 RAM 的双倍容量。(LCTT 译注:其实这里是个误区,交换分区不一定非得是双倍的物理内存容量,只是惯例如此。事实上,如果你的物理内存足够的话,你完全可以不用交换分区——在这里的情形下,或许你增加了物理内存,就没必要增加交换分区大小了。)
|
||||
|
||||
交换空间是当物理内存(RAM 随机存取存储器)的用量已满时,被保留用作虚拟内存的磁盘上的空间。 如果系统在 RAM 满载时需要更多的内存资源,内存中的非活动页面将被移动到交换空间,这样可以帮助系统运行应用程序更多的时间,但不应该把它当做 RAM 的扩展。
|
||||
|
||||
建议你创建一个专用的交换分区,但是如果你没有可用的分区,那么可以使用交换文件,或交换分区和交换文件的组合。 交换空间通常建议用户至少 4 GB,用户也可以根据自己的要求和环境创建交换空间。
|
||||
|
||||
我发现大部分 VM 和 云服务器都没有交换分区,所以在这种情况下,我们可以使用以下三种方法创建,扩展或增加交换空间。
|
||||
|
||||
### 如何检测当前交换分区大小
|
||||
|
||||
通过 [free][1] & `swapon` 命令来检测当前的交换分区空间的大小。
|
||||
|
||||
```
|
||||
$ free -h
|
||||
total used free shared buff/cache available
|
||||
Mem: 2.0G 1.3G 139M 45M 483M 426M
|
||||
Swap: 2.0G 655M 1.4G
|
||||
|
||||
$ swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/dev/sda5 partition 2G 655.2M -1
|
||||
```
|
||||
|
||||
上面的输出显示了当前的交换分区空间是 `2GB` 。
|
||||
|
||||
### 方法 1 : 通过 fallocate 命令创建交换文件
|
||||
|
||||
`fallocate` 程序是立即创建预分配大小的文件的最佳方法。
|
||||
|
||||
下面这个命令会创建一个 1GB 大小的 `/swapfile`。
|
||||
|
||||
```
|
||||
$ sudo fallocate -l 1G /swapfile
|
||||
```
|
||||
|
||||
检查一下创建的文件的大小是否正确。
|
||||
|
||||
```
|
||||
$ ls -lh /swapfile
|
||||
-rw-r--r-- 1 root root 1.0G Jun 7 09:49 /swapfile
|
||||
```
|
||||
|
||||
将该文件的权限设置为 `600` 这样只有 root 用户可以访问这个文件。
|
||||
|
||||
```
|
||||
$ sudo chmod 600 /swapfile
|
||||
```
|
||||
|
||||
通过运行以下的命令来将此文件转换为交换文件。
|
||||
|
||||
```
|
||||
$ sudo mkswap /swapfile
|
||||
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
|
||||
no label, UUID=cda50e0e-41f3-49c7-af61-b8cb4a33a464
|
||||
```
|
||||
|
||||
通过运行以下的命令来使交换文件生效。
|
||||
|
||||
```
|
||||
$ sudo swapon /swapfile
|
||||
```
|
||||
|
||||
将新创建的交换文件添加到 `fstab` 文件中,这样交换分区空间的修改即使在重启后也可以生效。
|
||||
|
||||
```
|
||||
$ vi /etc/fstab
|
||||
|
||||
/swapfile swap swap defaults 0 0
|
||||
```
|
||||
|
||||
检查一下新创建的交换文件。
|
||||
|
||||
```
|
||||
$ swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/dev/sda5 partition 2G 657.8M -1
|
||||
/swapfile file 1024M 0B -2
|
||||
```
|
||||
|
||||
现在我可以看到一个新的 1GB 的 `/swapfile1` 文件了。重启系统以使新的交换文件生效。
|
||||
|
||||
### 方法 2 : 通过 dd 命令来创建交换文件
|
||||
|
||||
`dd` 命令是另一个实用程序,可以帮助我们立即创建预分配大小的文件。
|
||||
|
||||
以下 dd 命令将创建 1GB 的 `/swapfile1`。
|
||||
|
||||
```
|
||||
$ sudo dd if=/dev/zero of=/swapfile1 bs=1G count=1
|
||||
1+0 records in
|
||||
1+0 records out
|
||||
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.6154 s, 64.6 MB/s
|
||||
```
|
||||
|
||||
**详解:**
|
||||
|
||||
* `if=/dev/zero` 是输入文件,`/dev/zero` 是类 Unix 操作系统中的一个特殊文件,它提供从它读取的尽可能多的空字符(ASCII NUL,0x00)。
|
||||
* `of=/swapfile1` 设置输出文件。
|
||||
* `bs=1G` 一次性读写的大小为 1GB
|
||||
* `count=1` 仅复制一个输入块
|
||||
|
||||
检查一下创建的文件的大小是否正确。
|
||||
|
||||
```
|
||||
$ ls -lh /swapfile1
|
||||
-rw-r--r-- 1 root root 1.0G Jun 7 09:58 /swapfile1
|
||||
```
|
||||
|
||||
将该文件的权限设置为 `600` 这样只有 root 用户可以访问这个文件。
|
||||
|
||||
```
|
||||
$ sudo chmod 600 /swapfile1
|
||||
```
|
||||
|
||||
通过运行以下的命令来将此文件转换为交换文件。
|
||||
|
||||
```
|
||||
$ sudo mkswap /swapfile1
|
||||
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
|
||||
no label, UUID=96def6d7-b2da-4954-aa72-aa32316ec993
|
||||
```
|
||||
|
||||
通过运行以下的命令来使交换文件生效。
|
||||
|
||||
```
|
||||
$ sudo swapon /swapfile1
|
||||
```
|
||||
|
||||
将新创建的交换文件添加到 `fstab` 文件中,这样交换分区空间的修改即使在重启后也可以生效。
|
||||
|
||||
```
|
||||
$ vi /etc/fstab
|
||||
|
||||
/swapfile1 swap swap defaults 0 0
|
||||
```
|
||||
|
||||
检查新创建的交换文件。
|
||||
|
||||
```
|
||||
$ swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/dev/sda5 partition 2G 1.3G -1
|
||||
/swapfile file 1024M 0B -2
|
||||
/swapfile1 file 1024M 0B -3
|
||||
```
|
||||
|
||||
现在我可以看到一个新的 1GB 的 `/swapfile1` 了。重启系统以使新的交换文件生效。
|
||||
|
||||
### 方法 3 : 通过硬盘分区来创建交换文件
|
||||
|
||||
我们也推荐使用通过硬盘分区的方式来创建交换分区。
|
||||
|
||||
如果你已经在你的另一个硬盘上通过 `fdisk` 命令创建了一个新的分区,假设我们已经创建了一个叫做 `/dev/sda4` 的分区。
|
||||
|
||||
使用 `mkswap` 命令来将这个分区转换成交换分区。
|
||||
|
||||
```
|
||||
$ sudo mkswap /dev/sda4
|
||||
```
|
||||
|
||||
通过运行以下命令来使交换文件生效。
|
||||
|
||||
```
|
||||
$ sudo swapon /dev/sda4
|
||||
```
|
||||
|
||||
把新增的交换文件添加到 `fstab` 文件中,这样即使是重启了系统交换分区的修改也能生效。
|
||||
|
||||
```
|
||||
$ vi /etc/fstab
|
||||
|
||||
/dev/sda4 swap swap defaults 0 0
|
||||
```
|
||||
|
||||
检查新创建的交换文件。
|
||||
|
||||
```
|
||||
$ swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/dev/sda5 partition 2G 1.3G -1
|
||||
/swapfile file 1024M 0B -2
|
||||
/swapfile1 file 1024M 0B -3
|
||||
/dev/sda4 partition 1G 0B -4
|
||||
```
|
||||
|
||||
我可以看到新的交换分区 1GB 的 `/dev/sda4`。重启系统就可以使用新的交换分区了。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/
|
||||
|
||||
作者:[2DAYGEEK][a]
|
||||
译者:[chenxinlong](https://github.com/chenxinlong)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.2daygeek.com/author/2daygeek/
|
||||
[1]:http://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/
|
||||
[2]:http://www.2daygeek.com/author/2daygeek/
|
||||
@@ -0,0 +1,40 @@
|
||||
成为一名软件开发者你应该学习哪种语言?
|
||||
=================
|
||||
|
||||

|
||||
|
||||
应用程序的领域在不断发展。底层的 Linux 做了很多工作,而且还在继续,但是在过去几年里,应用程序领域开始增长。在这种情况下,开发人员使用哪种语言构建这些应用程序?简而言之,要看情况,我知道这个说法没啥稀奇的。但是,通过我们拥有的数据,我们可以确定哪些语言领先。
|
||||
|
||||
站在山顶的语言是 Java。它已经出现在开源软件领域 15 年以上,但它并不是一直在顶峰。在早期,我们没有看到那么多对 java 开发者感兴趣的,但现在情况已经改变了。它是目前应用领域的权威领导者。虽然这个数字在过去六个季度没有明显增长,但其整体数量却令人印象深刻。平均而言,关注于开源软件的公司发布的职位中有超过 1/3 的职位要求 Java 技能。这对几年前没有在榜单上出现的语言而言是一个非凡的成就。而且,由于它在 Android 中的大量使用,未来这个数字进一步增加也并不奇怪。
|
||||
|
||||
在应用程序领域中使用的另一种语言是 C++。虽然它的数量不能与 Java 竞争,但它仍然在这个领域占据了很大的市场份额。而且每 3 个招聘中有一个要求 Java,C++ 则是每 4 个中有一个要求它。与 Java 非常类似,其数量在过去六个季度中保持相对稳定。C++ 一直被大量使用,即使 Java 已经取代它,它仍然是一种高度相关的语言。
|
||||
|
||||
|
||||
|
||||
进入到网络应用领域,多年来一直在城头变幻大王旗。在早期,大多数 Web 程序毫无疑问地选择使用 PHP 开发。正如之前关于脚本的文章所讨论的,这几年来已经发生了变化。在过去几年中,PHP 的使用似乎有所恶化。在过去一年半的时间里,已经急剧下降了 30% 以上。这是一个令人震惊的数字,只有时间才能告诉我们趋势是否持续。
|
||||
|
||||
最初打破 PHP 领导地位的是 Ruby on Rails。多年来,我看到公司们和开发者们进行了这一转型。Ruby on Rails 经历了一段时间,在这个时期它是这个领域的首选语言。然而,从我们收集的数字来看,它的光泽似乎已经失去了一点。虽然没有像 PHP 这样的衰退,但其数量一直保持相对平稳,它曾经有过的增长似乎停滞不前。
|
||||
|
||||
|
||||
|
||||
目前在网络应用程序领域的王者似乎是 Javascript。它获得了最大的总数。虽然它的数量保持平坦,这很像 Ruby on Rails,但它已经吸引了更多的观众。平均来说,过去六个季度,公司在分析的 10,000 份工作清单中有 1,500 份需要 Javascript 技能。这比 PHP 或 Ruby on Rails 多了 70%。
|
||||
|
||||
随着 PHP 的衰落以及 Ruby on Rails 和 Javascript 停滞不前,是谁在 Web 程序领域保持增长呢?这个群体的突出者似乎是 Golang。它在 2007 年由 Google 内的几位开发人员创建,似乎这种语言开始获得更广泛的受众群体。虽然与我们讨论的其它三个的总数相比不多,但看起来这一年半以来增长了 50%。如果这种趋势继续下去,那将是非常有趣的。在我看来,我预计我们会继续看到 Golang 挤占 其它三个的群体份额。
|
||||
|
||||
|
||||
|
||||
如往常一样,我们会监测这些语言的各种前进方向,以观察市场趋势。而且,榜单的任何新进入者都会被密切关注。这是一个令人兴奋和动态的发展领域。一个会提供随时间不断变化的结果。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer
|
||||
|
||||
作者:[Brent Marinaccio][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [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#
|
||||
@@ -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” 键来呼出启动选项。我的选择如下图:
|
||||
|
||||

|
||||
|
||||
点击 “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
|
||||
83
published/201707/20170619 Is IoT the Future of Linux.md
Normal file
83
published/201707/20170619 Is IoT the Future of Linux.md
Normal file
@@ -0,0 +1,83 @@
|
||||
物联网是 Linux 的未来么?
|
||||
============================================================
|
||||
|
||||
> Linux 无疑将在物联网中扮演一个关键角色,但是其光彩将与其它的一些分享。
|
||||
|
||||
随着 [Canonical 重新关注于][8]赢利和新技术,我们中的一些人发现我们正在思考 Linux 未来将走向何方,IoT(物联网)是否是 Linux 的未来? 本文旨在解决这两个问题。
|
||||
|
||||
### Mycroft 运行于 Linux
|
||||
|
||||
对于大多数非技术世界的人来说,实际上有几个不同的 IoT 项目,它们不是我们不断在网络上看到广告的过度商业化的项目,其中最成功的就是 [Mycroft][9] 项目。
|
||||
|
||||
使得 Mycroft 有趣的部分原因是你不需要在专门的硬件上得到它。这意味着你可以将其下载到 Raspberry Pi 或甚至您自己的 PC 上。这是物联网领域更常见的来自其它厂商的商业化替代品中所没有出现的自由元素。Mycroft 项目的另一个有趣的事实是,它最初是众筹的,所以从一开始它就是真正的社区驱动的项目。
|
||||
|
||||
那么它的技能(skill)——这个用来描述它能力的术语——怎么样?目前,我听到一些褒贬不一的评论。通过查看 Github 上列出的技能,其整个列表似乎相当令人印象深刻。更深层次挖掘的话,很容易看出,它的许多技能比使用专有的 IoT 设备要好。
|
||||
|
||||
值得注意的是,为物联网设备开发的官方技能与社区成员开发的功能之间存在明显的区别。Mycroft 的官方技能列表其实很薄弱。让我们面对这个情况,就像 Linux 运行在物联网设备上一样酷,让我大开眼界的是,在 [Mycroft Github][10] 页面上并没有一个官方的邮件检查技能。好吧,在社区技能部分有一个 Gmail,它带有一个问号,因为它显然没有验证过是否可以工作(或不工作)。
|
||||
|
||||
### Google Home - 这是一个包含在谜语中的 Linux 谜题
|
||||
|
||||
那么 Google 的物联网产品 Google Home 呢?当然这运行在 Linux上,对吧?是的,在广义上说是这样……事实证明,Google Home [基于 Chromecast][11]。那 Chromecast 呢?它是基于 Google TV。我们还在 Linux 的部分么?不完全是。
|
||||
|
||||
显然,Chromecast 基本上运行的是 [Android 的精简版][12]。而且我们大多数人都知道,Android 确实使用了 Linux 内核的定制版本。
|
||||
|
||||
在这一点上,我觉得我们需要问自己 - Google 是我们可以想出的最好的 Linux 物联网代表吗?我认为不是,因为我觉得他们会愿意做出隐私妥协,而这是我们在一个纯粹的 Linux 物联网环境中所不愿见的。 但这只是我个人的信仰。
|
||||
|
||||
假设我们愿意接受 Google Home 这种隐私方面的可疑而带来的好处,也假设有在底层有一些可辨识出来的 Linux 成分,那么与 Mycroft 的纯粹的开源体验相比如何呢?
|
||||
|
||||
目前,谷歌正在解决这个局面。首先,如果你愿意,你可以安装 Google Home的“大脑”(称为 Google Assistant)到树莓派上。这可以通过 [Google Assistant SDK][13] 获得。
|
||||
|
||||
如你猜的那样,这个 SDK 可以在 Linux 上安装。安装完 portaudio、各种库和用 pip 安装 google-assistant-sdk 之后,你可以开始用树莓派进行通话了,就像 Google Home 设备一样。
|
||||
|
||||
回到实际 Google Home 设备本身,你可能会想知道它的可用技能?开箱即用,它提供与 Google Play 音乐、Pandora、Spotify 和 iHeart Radio 以及其他流式音乐服务的音乐播放。Google Home 不仅拥有比 Mycroft 更多的“交流”技能,它还可以与像 Netflix 这样的服务和诸如 Philips、Nest 和 [IFTTT][14] 等各种智能家居任务的家庭品牌一同工作。我有提到它还可以安排 Google 日历或者订购披萨么?
|
||||
|
||||
相比之下,Mycroft 对于想要创造自己的技能的 DIY 开发者来说更好,Google Home 现在可以就开始使用,而不是某一天。
|
||||
|
||||
### Amazon Echo 可以运行于 Linux
|
||||
|
||||
我首先要承认的是我不知道 Amazon Echo 本身是否运行在 Linux 的某些元素上。也就是说,我知道你可以将 Echo 背后的大脑安装到 Linux 驱动的树莓派上!当[第一次发布派上的版本时][15],有点让人失望的是,你不得不按一个按钮来激活 Echo 的聆听模式。
|
||||
|
||||
转眼到了现在,派上的 Echo 现在支持用可编程的“热词”来激活它。这意味着你可以运行一个安装了 Linux 的派,其操作方式与官方 Amazon Echo 相似。然后,如果你买了 Echo Dot,你可以跳过额外的工作,省去在树莓派上安装 Mycroft 的那些极客的东西。
|
||||
|
||||
就像 Mycroft 和 Google Home 一样,Amazon Echo 可以在派上使用很重要,因为它使任何人都可以使用物联网技术 - 而不仅仅是那些选择官方硬件的人。而且由于亚马逊已经有更多的时间来开发这项技术,因此,可以说 Echo 是超前于可编程技能竞争以及整体进度的。
|
||||
|
||||
所以即使 Google Home 在问题回答上做的更好,但是 Echo 支持更多的第三方物联网设备,有些人认为它比 Google Home 的声音更自然。就个人而言,我认为两台设备的声音听起来都不错。但这只是我的意见。
|
||||
|
||||
### 物联网是 Linux 最好的
|
||||
|
||||
假如我们用一点时间来继续看看这些与 Linux 兼容的物联网设备或者像 Mycroft 这样真正使用 Linux 的社区伙伴的项目,有一点是可以肯定的,Linux 仍然是等式的一部分。
|
||||
|
||||
我认为不使用像 Linux 这样的自由/开放源代码平台是愚蠢的。毕竟,这些设备往往会连接到其他物联网自动化组件。这意味着安全性是一个真正的考虑。在 Linux 下运行物联网意味着我们可以有一个社区确保安全,而不是希望制造商为我们做到这一点。
|
||||
|
||||
需要一个例子说明为什么这很重要吗?看看那些不运行开源固件的路由器,当制造商停止支持该设备时会发生什么 - 安全风险开始出现。
|
||||
|
||||
物联网是 Linux 的未来吗?在我看来,我认为是……但不是全部。我认为对许多人来说,这是前进的道路。但是最后,我认为在 Linux 之上将会有许多专有的“东西”,只有像 Mycroft 这样纯粹的项目才能保持 Linux。
|
||||
|
||||
那么你怎么看?你认为像 Mycroft 这样的开源项目现在与 Google 和 Amazon 的产品在正常竞争么?反之,你觉得还有其他基于 Linux 的产品更适合这项工作么?无论是什么,点击评论,让我们来谈谈。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.datamation.com/open-source/is-iot-the-future-of-linux.html
|
||||
|
||||
作者:[Matt Hartley][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.datamation.com/author/Matt-Hartley-3080.html
|
||||
[1]:http://www.datamation.com/feedback/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html
|
||||
[2]:http://www.datamation.com/author/Matt-Hartley-3080.html
|
||||
[3]:http://www.datamation.com/e-mail/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html
|
||||
[4]:http://www.datamation.com/print/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html
|
||||
[5]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html#comment_form
|
||||
[6]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html#
|
||||
[7]:http://www.datamation.com/author/Matt-Hartley-3080.html
|
||||
[8]:https://insights.ubuntu.com/2017/04/05/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence/
|
||||
[9]:https://mycroft.ai/
|
||||
[10]:https://github.com/MycroftAI/mycroft-skills
|
||||
[11]:https://www.theverge.com/circuitbreaker/2016/5/31/11822032/google-home-chromecast-android
|
||||
[12]:https://www.extremetech.com/computing/162463-chromecast-hacked-its-based-on-google-tv-and-android-not-chrome-os
|
||||
[13]:https://developers.google.com/assistant/sdk/
|
||||
[14]:https://ifttt.com/google_assistant
|
||||
[15]:https://www.raspberrypi.org/blog/amazon-echo-homebrew-version/
|
||||
83
published/201707/20170620 Debian armhf VM on arm64 server.md
Normal file
83
published/201707/20170620 Debian armhf VM on arm64 server.md
Normal 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
|
||||
@@ -0,0 +1,296 @@
|
||||
如何修补和保护 Linux 内核堆栈冲突漏洞 CVE-2017-1000364
|
||||
============================================================
|
||||
|
||||
在 Linux 内核中发现了一个名为 “Stack Clash” 的严重安全问题,攻击者能够利用它来破坏内存数据并执行任意代码。攻击者可以利用这个及另一个漏洞来执行任意代码并获得管理帐户(root)权限。
|
||||
|
||||
在 Linux 中该如何解决这个问题?
|
||||
|
||||
[][22]
|
||||
|
||||
Qualys 研究实验室在 GNU C Library(CVE-2017-1000366)的动态链接器中发现了许多问题,它们通过与 Linux 内核内的堆栈冲突来允许本地特权升级。这个 bug 影响到了 i386 和 amd64 上的 Linux、OpenBSD、NetBSD、FreeBSD 和 Solaris。攻击者可以利用它来破坏内存数据并执行任意代码。
|
||||
|
||||
### 什么是 CVE-2017-1000364 bug?
|
||||
|
||||
[来自 RHN][13]:
|
||||
|
||||
> 在用户空间二进制文件的堆栈中分配内存的方式发现了一个缺陷。如果堆(或不同的内存区域)和堆栈内存区域彼此相邻,则攻击者可以使用此缺陷跳过堆栈保护区域,从而导致进程堆栈或相邻内存区域的受控内存损坏,从而增加其系统权限。有一个在内核中减轻这个漏洞的方法,将堆栈保护区域大小从一页增加到 1 MiB,从而使成功利用这个功能变得困难。
|
||||
|
||||
[据原研究文章][14]:
|
||||
|
||||
> 计算机上运行的每个程序都使用一个称为堆栈的特殊内存区域。这个内存区域是特别的,因为当程序需要更多的堆栈内存时,它会自动增长。但是,如果它增长太多,并且与另一个内存区域太接近,程序可能会将堆栈与其他内存区域混淆。攻击者可以利用这种混乱来覆盖其他内存区域的堆栈,或者反过来。
|
||||
|
||||
### 受到影响的 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
|
||||
|
||||
### 我需要重启我的电脑么?
|
||||
|
||||
是的,由于大多数服务依赖于 GNU C Library 的动态连接器,并且内核自身需要在内存中重新加载。
|
||||
|
||||
### 我该如何在 Linux 中修复 CVE-2017-1000364?
|
||||
|
||||
根据你的 Linux 发行版来输入命令。你需要重启电脑。在应用补丁之前,记下你当前内核的版本:
|
||||
|
||||
```
|
||||
$ uname -a
|
||||
$ uname -mrs
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
Linux 4.4.0-78-generic x86_64
|
||||
```
|
||||
|
||||
### Debian 或者 Ubuntu Linux
|
||||
|
||||
输入下面的 [apt 命令][15] / [apt-get 命令][16]来应用更新:
|
||||
|
||||
```
|
||||
$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
Calculating upgrade... Done
|
||||
The following packages will be upgraded:
|
||||
libc-bin libc-dev-bin libc-l10n libc6 libc6-dev libc6-i386 linux-compiler-gcc-6-x86 linux-headers-4.9.0-3-amd64 linux-headers-4.9.0-3-common linux-image-4.9.0-3-amd64
|
||||
linux-kbuild-4.9 linux-libc-dev locales multiarch-support
|
||||
14 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
|
||||
Need to get 0 B/62.0 MB of archives.
|
||||
After this operation, 4,096 B of additional disk space will be used.
|
||||
Do you want to continue? [Y/n] y
|
||||
Reading changelogs... Done
|
||||
Preconfiguring packages ...
|
||||
(Reading database ... 115123 files and directories currently installed.)
|
||||
Preparing to unpack .../libc6-i386_2.24-11+deb9u1_amd64.deb ...
|
||||
Unpacking libc6-i386 (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Preparing to unpack .../libc6-dev_2.24-11+deb9u1_amd64.deb ...
|
||||
Unpacking libc6-dev:amd64 (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Preparing to unpack .../libc-dev-bin_2.24-11+deb9u1_amd64.deb ...
|
||||
Unpacking libc-dev-bin (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Preparing to unpack .../linux-libc-dev_4.9.30-2+deb9u1_amd64.deb ...
|
||||
Unpacking linux-libc-dev:amd64 (4.9.30-2+deb9u1) over (4.9.30-2) ...
|
||||
Preparing to unpack .../libc6_2.24-11+deb9u1_amd64.deb ...
|
||||
Unpacking libc6:amd64 (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Setting up libc6:amd64 (2.24-11+deb9u1) ...
|
||||
(Reading database ... 115123 files and directories currently installed.)
|
||||
Preparing to unpack .../libc-bin_2.24-11+deb9u1_amd64.deb ...
|
||||
Unpacking libc-bin (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Setting up libc-bin (2.24-11+deb9u1) ...
|
||||
(Reading database ... 115123 files and directories currently installed.)
|
||||
Preparing to unpack .../multiarch-support_2.24-11+deb9u1_amd64.deb ...
|
||||
Unpacking multiarch-support (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Setting up multiarch-support (2.24-11+deb9u1) ...
|
||||
(Reading database ... 115123 files and directories currently installed.)
|
||||
Preparing to unpack .../0-libc-l10n_2.24-11+deb9u1_all.deb ...
|
||||
Unpacking libc-l10n (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Preparing to unpack .../1-locales_2.24-11+deb9u1_all.deb ...
|
||||
Unpacking locales (2.24-11+deb9u1) over (2.24-11) ...
|
||||
Preparing to unpack .../2-linux-compiler-gcc-6-x86_4.9.30-2+deb9u1_amd64.deb ...
|
||||
Unpacking linux-compiler-gcc-6-x86 (4.9.30-2+deb9u1) over (4.9.30-2) ...
|
||||
Preparing to unpack .../3-linux-headers-4.9.0-3-amd64_4.9.30-2+deb9u1_amd64.deb ...
|
||||
Unpacking linux-headers-4.9.0-3-amd64 (4.9.30-2+deb9u1) over (4.9.30-2) ...
|
||||
Preparing to unpack .../4-linux-headers-4.9.0-3-common_4.9.30-2+deb9u1_all.deb ...
|
||||
Unpacking linux-headers-4.9.0-3-common (4.9.30-2+deb9u1) over (4.9.30-2) ...
|
||||
Preparing to unpack .../5-linux-kbuild-4.9_4.9.30-2+deb9u1_amd64.deb ...
|
||||
Unpacking linux-kbuild-4.9 (4.9.30-2+deb9u1) over (4.9.30-2) ...
|
||||
Preparing to unpack .../6-linux-image-4.9.0-3-amd64_4.9.30-2+deb9u1_amd64.deb ...
|
||||
Unpacking linux-image-4.9.0-3-amd64 (4.9.30-2+deb9u1) over (4.9.30-2) ...
|
||||
Setting up linux-libc-dev:amd64 (4.9.30-2+deb9u1) ...
|
||||
Setting up linux-headers-4.9.0-3-common (4.9.30-2+deb9u1) ...
|
||||
Setting up libc6-i386 (2.24-11+deb9u1) ...
|
||||
Setting up linux-compiler-gcc-6-x86 (4.9.30-2+deb9u1) ...
|
||||
Setting up linux-kbuild-4.9 (4.9.30-2+deb9u1) ...
|
||||
Setting up libc-l10n (2.24-11+deb9u1) ...
|
||||
Processing triggers for man-db (2.7.6.1-2) ...
|
||||
Setting up libc-dev-bin (2.24-11+deb9u1) ...
|
||||
Setting up linux-image-4.9.0-3-amd64 (4.9.30-2+deb9u1) ...
|
||||
/etc/kernel/postinst.d/initramfs-tools:
|
||||
update-initramfs: Generating /boot/initrd.img-4.9.0-3-amd64
|
||||
cryptsetup: WARNING: failed to detect canonical device of /dev/md0
|
||||
cryptsetup: WARNING: could not determine root device from /etc/fstab
|
||||
W: initramfs-tools configuration sets RESUME=UUID=054b217a-306b-4c18-b0bf-0ed85af6c6e1
|
||||
W: but no matching swap device is available.
|
||||
I: The initramfs will attempt to resume from /dev/md1p1
|
||||
I: (UUID=bf72f3d4-3be4-4f68-8aae-4edfe5431670)
|
||||
I: Set the RESUME variable to override this.
|
||||
/etc/kernel/postinst.d/zz-update-grub:
|
||||
Searching for GRUB installation directory ... found: /boot/grub
|
||||
Searching for default file ... found: /boot/grub/default
|
||||
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
|
||||
Searching for splash image ... none found, skipping ...
|
||||
Found kernel: /boot/vmlinuz-4.9.0-3-amd64
|
||||
Found kernel: /boot/vmlinuz-3.16.0-4-amd64
|
||||
Updating /boot/grub/menu.lst ... done
|
||||
|
||||
Setting up libc6-dev:amd64 (2.24-11+deb9u1) ...
|
||||
Setting up locales (2.24-11+deb9u1) ...
|
||||
Generating locales (this might take a while)...
|
||||
en_IN.UTF-8... done
|
||||
Generation complete.
|
||||
Setting up linux-headers-4.9.0-3-amd64 (4.9.30-2+deb9u1) ...
|
||||
Processing triggers for libc-bin (2.24-11+deb9u1) ...
|
||||
```
|
||||
|
||||
使用 [reboot 命令][17]重启桌面/服务器:
|
||||
|
||||
```
|
||||
$ sudo reboot
|
||||
```
|
||||
|
||||
### Oracle/RHEL/CentOS/Scientific Linux
|
||||
|
||||
输入下面的 [yum 命令][18]:
|
||||
|
||||
```
|
||||
$ sudo yum update
|
||||
$ sudo reboot
|
||||
```
|
||||
|
||||
### Fedora Linux
|
||||
|
||||
输入下面的 dnf 命令:
|
||||
|
||||
```
|
||||
$ sudo dnf update
|
||||
$ 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
|
||||
```
|
||||
|
||||
### SUSE Linux Enterprise Server for SAP 12-SP1
|
||||
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
|
||||
### SUSE Linux Enterprise Module for Public Cloud 12
|
||||
|
||||
```
|
||||
$ sudo zypper in -t patch SUSE-SLE-Module-Public-Cloud-12-2017-996=1
|
||||
$ sudo reboot
|
||||
```
|
||||
|
||||
### 验证
|
||||
|
||||
你需要确认你的版本号在 [reboot 命令][19]之后改变了。
|
||||
|
||||
```
|
||||
$ uname -a
|
||||
$ uname -r
|
||||
$ uname -mrs
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
Linux 4.4.0-81-generic x86_64
|
||||
```
|
||||
|
||||
### 给 OpenBSD 用户的注意事项
|
||||
|
||||
见[此页][20]获取更多信息。
|
||||
|
||||
### 给 Oracle Solaris 的注意事项
|
||||
|
||||
[见此页][20]获取更多信息。
|
||||
|
||||
### 参考
|
||||
|
||||
* [堆栈冲突][4]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
作者简介:
|
||||
|
||||
Vivek Gite
|
||||
|
||||
作者是 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]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://plus.google.com/+CybercitiBiz
|
||||
[1]:https://twitter.com/nixcraft
|
||||
[2]:https://facebook.com/nixcraft
|
||||
[3]:https://plus.google.com/+CybercitiBiz
|
||||
[4]:https://blog.qualys.com/securitylabs/2017/06/19/the-stack-clash
|
||||
[5]:https://www.cyberciti.biz/faq/howto-patch-linux-kernel-stack-clash-vulnerability-cve-2017-1000364/
|
||||
[6]:https://www.cyberciti.biz/faq/category/centos/
|
||||
[7]:https://www.cyberciti.biz/faq/category/debian-ubuntu/
|
||||
[8]:https://www.cyberciti.biz/faq/category/linux/
|
||||
[9]:https://www.cyberciti.biz/faq/category/redhat-and-friends/
|
||||
[10]:https://www.cyberciti.biz/faq/category/security/
|
||||
[11]:https://www.cyberciti.biz/faq/category/suse/
|
||||
[12]:https://www.cyberciti.biz/faq/category/linux/
|
||||
[13]:https://access.redhat.com/security/cve/cve-2017-1000364
|
||||
[14]:https://blog.qualys.com/securitylabs/2017/06/19/the-stack-clash
|
||||
[15]:https://www.cyberciti.biz/faq/ubuntu-lts-debian-linux-apt-command-examples/
|
||||
[16]:https://www.cyberciti.biz/tips/linux-debian-package-management-cheat-sheet.html
|
||||
[17]:https://www.cyberciti.biz/faq/linux-reboot-command/
|
||||
[18]:https://www.cyberciti.biz/faq/rhel-centos-fedora-linux-yum-command-howto/
|
||||
[19]:https://www.cyberciti.biz/faq/linux-reboot-command/
|
||||
[20]:https://ftp.openbsd.org/pub/OpenBSD/patches/6.1/common/008_exec_subr.patch.sig
|
||||
[21]:http://www.oracle.com/technetwork/security-advisory/alert-cve-2017-3629-3757403.html
|
||||
[22]:https://www.cyberciti.biz/media/new/faq/2017/06/the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris.jpeg
|
||||
@@ -0,0 +1,111 @@
|
||||
Boot Repair Tool: 可以修复与启动相关的大部分问题
|
||||
=========
|
||||
|
||||
[][1]
|
||||
|
||||
我们都碰到过启动相关的问题,并且大部分时候都是简单的 **GRUB** 上的问题。 有时候很多人会觉得、输入一段很长的命令或在论坛中搜索来找到解决方法太麻烦了。今天我要告诉你如何使用一个简单而轻巧的软件来解决大部分的启动相关的问题。这个工具就是著名的 **Boot Repair Tool** 。好了,话不多说,让我们开始吧。
|
||||
|
||||
### 如何在 Linux 中安装和使用启动修复工具
|
||||
|
||||
你需要一个你所安装的操作系统的现场版的 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
|
||||
```
|
||||
|
||||
[][2]
|
||||
|
||||
在安装结束以后,你可以从应用菜单或或其它你在系统上启动应用的地方启动你的修复工具。
|
||||
|
||||
[][3]
|
||||
|
||||
你可以在菜单栏中看到 Boot Repair。
|
||||
|
||||
[][4]
|
||||
|
||||
启动它,它就会开始进行一些扫描操作,我们只要等它自己结束就好了。
|
||||
|
||||
[][5]
|
||||
|
||||
现在你会看到这个界面,这是基于之前扫描的建议修复。 在底部还可以有一个高级选项,你可以在高级选项里进行各方面的设置。 我建议没有经验的用户使用推荐维修,因为它很简单,在大多数情况下我们都可以这样做。
|
||||
|
||||
[][6]
|
||||
|
||||
选择推荐的更新后,它将开始修复。 等待进一步的处理。
|
||||
|
||||
[][7]
|
||||
|
||||
你现在会看到一个指令界面。 现在是轮到我们操作的时候了。打开终端,逐个复制并粘贴其中高亮的命令到终端中。
|
||||
|
||||
[][8]
|
||||
|
||||
命令完成后,你会看到一个上面提及的要求确认的界面。 使用箭头键或 Tab 键选择“Yes”,然后按回车键。 现在在 **启动修复工具** 界面中点击 “forward”。
|
||||
|
||||
[][9]
|
||||
|
||||
现在你会看到这个界面。 复制在那里提到的命令,并将其粘贴到终端中,然后按回车并让其执行此操作。 需要一段时间所以请耐心等待,它将下载GRUB、内核或任何修复您的引导所需的内容。
|
||||
|
||||
[][10]
|
||||
|
||||
现在你可能会看到一些选项用于配置安装 GRUB 的位置。 选择“yes”,然后按回车,你会看到上面的界面。使用空格键选择选项和按 TAB 以浏览选项。 选择并安装 GRUB 后,可以关闭终端。 现在在启动修复工具屏幕中选择 “forward” 选项。
|
||||
|
||||
[][11]
|
||||
|
||||
现在它会做一些扫描操作,并且会询问你一些需要确认的一些选项。 每个选项都选择是即可。
|
||||
|
||||
[][12]
|
||||
|
||||
它会显示一个成功的确认消息。 如果没有,并且显示失败的消息,则将生成链接。 转到该链接获取更多帮助。
|
||||
|
||||
成功后,重启你的电脑。 当你重新启动时,你会看到 GRUB。 现在已成功维修您的电脑。 一切顺利。
|
||||
|
||||
### 引导修复的高级技巧
|
||||
|
||||
当我的电脑出现双引导启动画面时,我发现在修复时,它无法识别 [安装在另一个分区上的 Windows 7][19]。 这里有一个简单的提示来帮你解决这个问题。
|
||||
|
||||
打开终端并安装 os-prober。 它很简单,可以在软件中心或通过终端找到。
|
||||
|
||||
os-prober 可以帮助您识别安装在 PC 上的其他操作系统。
|
||||
|
||||
[][13]
|
||||
|
||||
os-prober 安装完成后,通过输入 `os-prober` 在终端运行它。 如果失败了那么试着用 root 账号运行它。 之后运行`update-grub` 命令。 这就是你可以用于从 GRUB 中启动 Windows 的所需要做的全部。
|
||||
|
||||
[][14]
|
||||
|
||||
### 总结
|
||||
|
||||
以上就是全部的内容。现在你已经成功地修复了你的 PC。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
|
||||
|
||||
作者:[linuxandubuntu][a]
|
||||
译者:[chenxinlong](https://github.com/chenxinlong)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
|
||||
[1]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
|
||||
[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-boot-repair-tool-in-linux_orig.jpg
|
||||
[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/run-boot-repair-from-apps-menu_orig.jpg
|
||||
[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/scan-boot-issues-with-boot-repair_orig.jpg
|
||||
[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/boot-repair-app-menu-to-repair-system_orig.jpg
|
||||
[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/apply-recommended-fixes-to-fix-grub-issues_orig.jpg
|
||||
[7]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/fix-the-grub-menu-using-boot-repair_orig.jpg
|
||||
[8]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/confirm-grub-packages-installation_orig.jpg
|
||||
[9]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-grub-menu-and-kernel-to-fix-boot-menu_orig.jpg
|
||||
[10]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-grub_orig.jpg
|
||||
[11]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/scan-for-the-boot-issues_orig.jpg
|
||||
[12]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/fixed-boot-issues-with-boot-rescue_orig.jpg
|
||||
[13]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-os-prober_orig.jpg
|
||||
[14]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/upgrade-grub-in-linux_orig.jpg
|
||||
[15]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
|
||||
[16]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems#comments
|
||||
[17]:http://www.linuxandubuntu.com/home/category/distros
|
||||
[18]:http://www.linuxandubuntu.com/home/linux-kernel-40-codenamed-hurr-durr-im-a-sheep-released-installupgrade-in-ubuntulinux-mint
|
||||
[19]:http://www.linuxandubuntu.com/home/how-to-dual-boot-windows-7-and-ubuntu
|
||||
@@ -0,0 +1,119 @@
|
||||
如何关闭一个不活动的或者空闲的 SSH 会话
|
||||
============================================================
|
||||
|
||||
让我们来假设一下,当你通过 ssh 在服务器上工作时,由于网络、电源或者是本地 PC 重启等原因会导致你的会话连接断开。
|
||||
|
||||
你可能会再次登录服务器继续工作也可能不会,但是你始终会留下之前没有关闭的 ssh 会话。
|
||||
|
||||
如何关闭一个不活动的 ssh 会话?首先使用 `w` 命令来识别出不活动或者是空闲的 ssh 会话,接着使用 `pstree` 命令来获取空闲会话的 PID,最后就是使用 `kill` 命令来关闭会话了。
|
||||
|
||||
建议阅读:[Mosh(Mobile 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` 的主进程是 `sshd(2023)`,另两个分支分别为 `sshd(10132)` 和 `sshd(10199)`。
|
||||
|
||||
跟我在文章开始讲的相同,其中一个是我新的会话连接 `sshd(10199)` 它展示了我正在执行的 `pstree` 命令,因此空闲会话是另一个进程为 `sshd(10132)`。
|
||||
|
||||
- 建议阅读:[如何通过标准的网页浏览器来接入 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/
|
||||
@@ -0,0 +1,267 @@
|
||||
使用 Kdump 检查 Linux 内核崩溃
|
||||
============================================================
|
||||
|
||||
> 让我们先看一下 kdump 的基本使用方法,和 kdump/kexec 在内核中是如何实现。
|
||||
|
||||

|
||||
|
||||
[kdump][16] 是获取崩溃的 Linux 内核转储的一种方法,但是想找到解释其使用和内部结构的文档可能有点困难。在本文中,我将研究 kdump 的基本使用方法,和 kdump/kexec 在内核中是如何实现。
|
||||
|
||||
[kexec][17] 是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核。kexec 会关闭第一个内核,绕过 BIOS 或固件阶段,并跳转到第二个内核。因此,在没有 BIOS 阶段的情况下,重新启动变得更快。
|
||||
|
||||
kdump 可以与 kexec 应用程序一起使用 —— 例如,当第一个内核崩溃时第二个内核启动,第二个内核用于复制第一个内核的内存转储,可以使用 `gdb` 和 `crash` 等工具分析崩溃的原因。(在本文中,我将使用术语“第一内核”作为当前运行的内核,“第二内核” 作为使用 kexec 运行的内核,“捕获内核” 表示在当前内核崩溃时运行的内核。)
|
||||
|
||||
kexec 机制在内核以及用户空间中都有组件。内核提供了几个用于 kexec 重启功能的系统调用。名为 kexec-tools 的用户空间工具使用这些调用,并提供可执行文件来加载和引导“第二内核”。有的发行版还会在 kexec-tools 上添加封装器,这有助于捕获并保存各种转储目标配置的转储。在本文中,我将使用名为 distro-kexec-tools 的工具来避免上游 kexec 工具和特定于发行版的 kexec-tools 代码之间的混淆。我的例子将使用 Fedora Linux 发行版。
|
||||
|
||||
### Fedora kexec-tools 工具
|
||||
|
||||
使用 `dnf install kexec-tools` 命令在 Fedora 机器上安装 fedora-kexec-tools。在安装 fedora-kexec-tools 后可以执行 `systemctl start kdump` 命令来启动 kdump 服务。当此服务启动时,它将创建一个根文件系统(initramfs),其中包含了要挂载到目标位置的资源,以保存 vmcore,以及用来复制和转储 vmcore 到目标位置的命令。然后,该服务将内核和 initramfs 加载到崩溃内核区域内的合适位置,以便在内核崩溃时可以执行它们。
|
||||
|
||||
Fedora 封装器提供了两个用户配置文件:
|
||||
|
||||
1. `/etc/kdump.conf` 指定修改后需要重建 initramfs 的配置参数。例如,如果将转储目标从本地磁盘更改为 NFS 挂载的磁盘,则需要由“捕获内核”所加载的 NFS 相关的内核模块。
|
||||
2. `/etc/sysconfig/kdump` 指定修改后不需要重新构建 initramfs 的配置参数。例如,如果只需修改传递给“捕获内核”的命令行参数,则不需要重新构建 initramfs。
|
||||
|
||||
如果内核在 kdump 服务启动之后出现故障,那么“捕获内核”就会执行,其将进一步执行 initramfs 中的 vmcore 保存过程,然后重新启动到稳定的内核。
|
||||
|
||||
### kexec-tools 工具
|
||||
|
||||
编译 kexec-tools 的源代码得到了一个名为 `kexec` 的可执行文件。这个同名的可执行文件可用于加载和执行“第二内核”,或加载“捕获内核”,它可以在内核崩溃时执行。
|
||||
|
||||
加载“第二内核”的命令:
|
||||
|
||||
```
|
||||
# kexec -l kernel.img --initrd=initramfs-image.img –reuse-cmdline
|
||||
```
|
||||
|
||||
`--reuse-command` 参数表示使用与“第一内核”相同的命令行。使用 `--initrd` 传递 initramfs。 `-l` 表明你正在加载“第二内核”,其可以由 `kexec` 应用程序本身执行(`kexec -e`)。使用 `-l` 加载的内核不能在内核崩溃时执行。为了加载可以在内核崩溃时执行的“捕获内核”,必须传递参数 `-p` 取代 `-l`。
|
||||
|
||||
加载捕获内核的命令:
|
||||
|
||||
```
|
||||
# kexec -p kernel.img --initrd=initramfs-image.img –reuse-cmdline
|
||||
```
|
||||
|
||||
`echo c > /pros/sysrq-trigger` 可用于使内核崩溃以进行测试。有关 kexec-tools 提供的选项的详细信息,请参阅 `man kexec`。在转到下一个部分之前,请看这个 kexec_dump 的演示:
|
||||
|
||||
[kexec_dump_demo (YouTube)](https://www.youtube.com/embed/iOq_rJhrKhA?rel=0&origin=https://opensource.com&enablejsapi=1)
|
||||
|
||||
### kdump: 端到端流
|
||||
|
||||
下图展示了流程图。必须在引导“第一内核”期间为捕获内核保留 crashkernel 的内存。您可以在内核命令行中传递 `crashkernel=Y@X`,其中 `@X` 是可选的。`crashkernel=256M` 适用于大多数 x86_64 系统;然而,为崩溃内核选择适当的内存取决于许多因素,如内核大小和 initramfs,以及 initramfs 中包含的模块和应用程序运行时的内存需求。有关传递崩溃内核参数的更多方法,请参阅 [kernel-parameters 文档][18]。
|
||||
|
||||

|
||||
|
||||
您可以将内核和 initramfs 镜像传递给 `kexec` 可执行文件,如(`kexec-tools`)部分的命令所示。“捕获内核”可以与“第一内核”相同,也可以不同。通常,一样即可。Initramfs 是可选的;例如,当内核使用 `CONFIG_INITRAMFS_SOURCE` 编译时,您不需要它。通常,从第一个 initramfs 中保存一个不一样的捕获 initramfs,因为在捕获 initramfs 中自动执行 vmcore 的副本能获得更好的效果。当执行 `kexec` 时,它还加载了 `elfcorehdr` 数据和 purgatory 可执行文件(LCTT 译注:purgatory 就是一个引导加载程序,是为 kdump 定作的。它被赋予了“炼狱”这样一个古怪的名字应该只是一种调侃)。 `elfcorehdr` 具有关于系统内存组织的信息,而 purgatory 可以在“捕获内核”执行之前执行并验证第二阶段的二进制或数据是否具有正确的 SHA。purgatory 也是可选的。
|
||||
|
||||
当“第一内核”崩溃时,它执行必要的退出过程并切换到 purgatory(如果存在)。purgatory 验证加载二进制文件的 SHA256,如果是正确的,则将控制权传递给“捕获内核”。“捕获内核”根据从 `elfcorehdr` 接收到的系统内存信息创建 vmcore。因此,“捕获内核”启动后,您将看到 `/proc/vmcore` 中“第一内核”的转储。根据您使用的 initramfs,您现在可以分析转储,将其复制到任何磁盘,也可以是自动复制的,然后重新启动到稳定的内核。
|
||||
|
||||
### 内核系统调用
|
||||
|
||||
内核提供了两个系统调用:`kexec_load()` 和 `kexec_file_load()`,可以用于在执行 `kexec -l` 时加载“第二内核”。它还为 `reboot()` 系统调用提供了一个额外的标志,可用于使用 `kexec -e` 引导到“第二内核”。
|
||||
|
||||
`kexec_load()`:`kexec_load()` 系统调用加载一个可以在之后通过 `reboot()` 执行的新的内核。其原型定义如下:
|
||||
|
||||
```
|
||||
long kexec_load(unsigned long entry, unsigned long nr_segments,
|
||||
struct kexec_segment *segments, unsigned long flags);
|
||||
```
|
||||
|
||||
用户空间需要为不同的组件传递不同的段,如内核,initramfs 等。因此,`kexec` 可执行文件有助于准备这些段。`kexec_segment` 的结构如下所示:
|
||||
|
||||
```
|
||||
struct kexec_segment {
|
||||
void *buf;
|
||||
/* 用户空间缓冲区 */
|
||||
size_t bufsz;
|
||||
/* 用户空间中的缓冲区长度 */
|
||||
void *mem;
|
||||
/* 内核的物理地址 */
|
||||
size_t memsz;
|
||||
/* 物理地址长度 */
|
||||
};
|
||||
```
|
||||
|
||||
当使用 `LINUX_REBOOT_CMD_KEXEC` 调用 `reboot()` 时,它会引导进入由 `kexec_load` 加载的内核。如果标志 `KEXEC_ON_CRASH` 被传递给 `kexec_load()`,则加载的内核将不会使用 `reboot(LINUX_REBOOT_CMD_KEXEC)` 来启动;相反,这将在内核崩溃中执行。必须定义 `CONFIG_KEXEC` 才能使用 `kexec`,并且为 `kdump` 定义 `CONFIG_CRASH_DUMP`。
|
||||
|
||||
`kexec_file_load()`:作为用户,你只需传递两个参数(即 `kernel` 和 `initramfs`)到 `kexec` 可执行文件。然后,`kexec` 从 sysfs 或其他内核信息源中读取数据,并创建所有段。所以使用 `kexec_file_load()` 可以简化用户空间,只传递内核和 initramfs 的文件描述符。其余部分由内核本身完成。使用此系统调用时应该启用 `CONFIG_KEXEC_FILE`。它的原型如下:
|
||||
|
||||
```
|
||||
long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long
|
||||
cmdline_len, const char __user * cmdline_ptr, unsigned long
|
||||
flags);
|
||||
```
|
||||
|
||||
请注意,`kexec_file_load` 也可以接受命令行,而 `kexec_load()` 不行。内核根据不同的系统架构来接受和执行命令行。因此,在 `kexec_load()` 的情况下,`kexec-tools` 将通过其中一个段(如在 dtb 或 ELF 引导注释等)中传递命令行。
|
||||
|
||||
目前,`kexec_file_load()` 仅支持 x86 和 PowerPC。
|
||||
|
||||
#### 当内核崩溃时会发生什么
|
||||
|
||||
当第一个内核崩溃时,在控制权传递给 purgatory 或“捕获内核”之前,会执行以下操作:
|
||||
|
||||
* 准备 CPU 寄存器(参见内核代码中的 `crash_setup_regs()`);
|
||||
* 更新 vmcoreinfo 备注(请参阅 `crash_save_vmcoreinfo()`);
|
||||
* 关闭非崩溃的 CPU 并保存准备好的寄存器(请参阅 `machine_crash_shutdown()` 和 `crash_save_cpu()`);
|
||||
* 您可能需要在此处禁用中断控制器;
|
||||
* 最后,它执行 kexec 重新启动(请参阅 `machine_kexec()`),它将加载或刷新 kexec 段到内存,并将控制权传递给进入段的执行文件。输入段可以是下一个内核的 purgatory 或开始地址。
|
||||
|
||||
#### ELF 程序头
|
||||
|
||||
kdump 中涉及的大多数转储核心都是 ELF 格式。因此,理解 ELF 程序头部很重要,特别是当您想要找到 vmcore 准备的问题。每个 ELF 文件都有一个程序头:
|
||||
|
||||
* 由系统加载器读取,
|
||||
* 描述如何将程序加载到内存中,
|
||||
* 可以使用 `Objdump -p elf_file` 来查看程序头。
|
||||
|
||||
vmcore 的 ELF 程序头的示例如下:
|
||||
|
||||
```
|
||||
# objdump -p vmcore
|
||||
vmcore:
|
||||
file format elf64-littleaarch64
|
||||
Program Header:
|
||||
NOTE off 0x0000000000010000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**0 filesz
|
||||
0x00000000000013e8 memsz 0x00000000000013e8 flags ---
|
||||
LOAD off 0x0000000000020000 vaddr 0xffff000008080000 paddr 0x0000004000280000 align 2**0 filesz
|
||||
0x0000000001460000 memsz 0x0000000001460000 flags rwx
|
||||
LOAD off 0x0000000001480000 vaddr 0xffff800000200000 paddr 0x0000004000200000 align 2**0 filesz
|
||||
0x000000007fc00000 memsz 0x000000007fc00000 flags rwx
|
||||
LOAD off 0x0000000081080000 vaddr 0xffff8000ffe00000 paddr 0x00000040ffe00000 align 2**0 filesz
|
||||
0x00000002fa7a0000 memsz 0x00000002fa7a0000 flags rwx
|
||||
LOAD off 0x000000037b820000 vaddr 0xffff8003fa9e0000 paddr 0x00000043fa9e0000 align 2**0 filesz
|
||||
0x0000000004fc0000 memsz 0x0000000004fc0000 flags rwx
|
||||
LOAD off 0x00000003807e0000 vaddr 0xffff8003ff9b0000 paddr 0x00000043ff9b0000 align 2**0 filesz
|
||||
0x0000000000010000 memsz 0x0000000000010000 flags rwx
|
||||
LOAD off 0x00000003807f0000 vaddr 0xffff8003ff9f0000 paddr 0x00000043ff9f0000 align 2**0 filesz
|
||||
0x0000000000610000 memsz 0x0000000000610000 flags rwx
|
||||
```
|
||||
|
||||
在这个例子中,有一个 note 段,其余的是 load 段。note 段提供了有关 CPU 信息,load 段提供了关于复制的系统内存组件的信息。
|
||||
|
||||
vmcore 从 `elfcorehdr` 开始,它具有与 ELF 程序头相同的结构。参见下图中 `elfcorehdr` 的表示:
|
||||
|
||||

|
||||
|
||||
`kexec-tools` 读取 `/sys/devices/system/cpu/cpu%d/crash_notes` 并准备 `CPU PT_NOTE` 的标头。同样,它读取 `/sys/kernel/vmcoreinfo` 并准备 `vmcoreinfo PT_NOTE` 的标头,从 `/proc/iomem` 读取系统内存并准备存储器 `PT_LOAD` 标头。当“捕获内核”接收到 `elfcorehdr` 时,它从标头中提到的地址中读取数据,并准备 vmcore。
|
||||
|
||||
#### Crash note
|
||||
|
||||
Crash notes 是每个 CPU 中用于在系统崩溃的情况下存储 CPU 状态的区域;它有关于当前 PID 和 CPU 寄存器的信息。
|
||||
|
||||
#### vmcoreinfo
|
||||
|
||||
该 note 段具有各种内核调试信息,如结构体大小、符号值、页面大小等。这些值由捕获内核解析并嵌入到 `/proc/vmcore` 中。 `vmcoreinfo` 主要由 `makedumpfile` 应用程序使用。在 Linux 内核,`include/linux/kexec.h` 宏定义了一个新的 `vmcoreinfo`。 一些示例宏如下所示:
|
||||
|
||||
* `VMCOREINFO_PAGESIZE()`
|
||||
* `VMCOREINFO_SYMBOL()`
|
||||
* `VMCOREINFO_SIZE()`
|
||||
* `VMCOREINFO_STRUCT_SIZE()`
|
||||
|
||||
#### makedumpfile
|
||||
|
||||
vmcore 中的许多信息(如可用页面)都没有用处。`makedumpfile` 是一个用于排除不必要的页面的应用程序,如:
|
||||
|
||||
* 填满零的页面;
|
||||
* 没有私有标志的缓存页面(非专用缓存);
|
||||
* 具有私有标志的缓存页面(专用缓存);
|
||||
* 用户进程数据页;
|
||||
* 可用页面。
|
||||
|
||||
此外,`makedumpfile` 在复制时压缩 `/proc/vmcore` 的数据。它也可以从转储中删除敏感的符号信息; 然而,为了做到这一点,它首先需要内核的调试信息。该调试信息来自 `VMLINUX` 或 `vmcoreinfo`,其输出可以是 ELF 格式或 kdump 压缩格式。
|
||||
|
||||
典型用法:
|
||||
|
||||
```
|
||||
# makedumpfile -l --message-level 1 -d 31 /proc/vmcore makedumpfilecore
|
||||
```
|
||||
|
||||
详细信息请参阅 `man makedumpfile`。
|
||||
|
||||
### kdump 调试
|
||||
|
||||
新手在使用 kdump 时可能会遇到的问题:
|
||||
|
||||
#### `Kexec -p kernel_image` 没有成功
|
||||
|
||||
* 检查是否分配了崩溃内存。
|
||||
* `cat /sys/kernel/kexec_crash_size` 不应该有零值。
|
||||
* `cat /proc/iomem | grep "Crash kernel"` 应该有一个分配的范围。
|
||||
* 如果未分配,则在命令行中传递正确的 `crashkernel=` 参数。
|
||||
* 如果没有显示,则在 `kexec` 命令中传递参数 `-d`,并将输出信息发送到 kexec-tools 邮件列表。
|
||||
|
||||
#### 在“第一内核”的最后一个消息之后,在控制台上看不到任何东西(比如“bye”)
|
||||
|
||||
* 检查 `kexec -e` 之后的 `kexec -l kernel_image` 命令是否工作。
|
||||
* 可能缺少支持的体系结构或特定机器的选项。
|
||||
* 可能是 purgatory 的 SHA 验证失败。如果您的体系结构不支持 purgatory 中的控制台,则很难进行调试。
|
||||
* 可能是“第二内核”早已崩溃。
|
||||
* 将您的系统的 `earlycon` 或 `earlyprintk` 选项传递给“第二内核”的命令行。
|
||||
* 使用 kexec-tools 邮件列表共享第一个内核和捕获内核的 `dmesg` 日志。
|
||||
|
||||
### 资源
|
||||
|
||||
#### fedora-kexec-tools
|
||||
|
||||
* GitHub 仓库:`git://pkgs.fedoraproject.org/kexec-tools`
|
||||
* 邮件列表:[kexec@lists.fedoraproject.org][7]
|
||||
* 说明:Specs 文件和脚本提供了用户友好的命令和服务,以便 `kexec-tools` 可以在不同的用户场景下实现自动化。
|
||||
|
||||
#### kexec-tools
|
||||
|
||||
* GitHub 仓库:git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
|
||||
* 邮件列表:[kexec@lists.infradead.org][8]
|
||||
* 说明:使用内核系统调用并提供用户命令 `kexec`。
|
||||
|
||||
#### Linux kernel
|
||||
|
||||
* GitHub 仓库: `git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git`
|
||||
* 邮件列表:[kexec@lists.infradead.org][9]
|
||||
* 说明:实现了 `kexec_load()`、`kexec_file_load()`、`reboot()` 系统调用和特定体系结构的代码,例如 `machine_kexec()` 和 `machine_crash_shutdown()`。
|
||||
|
||||
#### Makedumpfile
|
||||
|
||||
* GitHub 仓库: `git://git.code.sf.net/p/makedumpfile/code`
|
||||
* 邮件列表:[kexec@lists.infradead.org][10]
|
||||
* 说明:从转储文件中压缩和过滤不必要的组件。
|
||||
|
||||
(题图:[Penguin][13]、 [Boot][14],修改:Opensource.com. [CC BY-SA 4.0][15])
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
作者简介:
|
||||
|
||||
Pratyush Anand - Pratyush 正在以以为 Linux 内核专家的身份与 Red Hat 合作。他主要负责 Red Hat 产品和上游所面临的几个 kexec/kdump 问题。他还处理 Red Hat 支持的 ARM64 平台周围的其他内核调试、跟踪和性能问题。除了 Linux 内核,他还在上游的 kexec-tools 和 makedumpfile 项目中做出了贡献。他是一名开源爱好者,并在教育机构举办志愿者讲座,促进了 FOSS。
|
||||
|
||||
-------
|
||||
|
||||
|
||||
via: https://opensource.com/article/17/6/kdump-usage-and-internals
|
||||
|
||||
作者:[Pratyush Anand][a]
|
||||
译者:[firmianay](https://github.com/firmianay)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/pratyushanand
|
||||
[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://opensource.com/article/17/6/kdump-usage-and-internals?rate=7i_-TnAGi8Q9GR7fhULKlQUNJw8KWgzadgMY9TDuiAY
|
||||
[7]:mailto:kexec@lists.fedoraproject.org
|
||||
[8]:mailto:kexec@lists.infradead.org
|
||||
[9]:mailto:kexec@lists.infradead.org
|
||||
[10]:mailto:kexec@lists.infradead.org
|
||||
[11]:http://sched.co/AVB4
|
||||
[12]:https://opensource.com/user/143191/feed
|
||||
[13]:https://pixabay.com/en/penguins-emperor-antarctic-life-429136/
|
||||
[14]:https://pixabay.com/en/shoe-boots-home-boots-house-1519804/
|
||||
[15]:https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[16]:https://www.kernel.org/doc/Documentation/kdump/kdump.txt
|
||||
[17]:https://linux.die.net/man/8/kexec
|
||||
[18]:https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt
|
||||
[19]:https://opensource.com/users/pratyushanand
|
||||
@@ -0,0 +1,92 @@
|
||||
8 种在你没有时间的时候为开源做贡献的方式
|
||||
============================================================
|
||||
|
||||
> 在忙碌的生活中抽出时间回馈给你关心的项目。
|
||||
|
||||

|
||||
|
||||
人们不给开源做贡献(或不能做更多贡献)的[最常见的原因][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
|
||||
@@ -0,0 +1,79 @@
|
||||
Ring :一个专注隐私,开源的 Skype 替代品
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
**如果你对 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/
|
||||
@@ -0,0 +1,89 @@
|
||||
Chromebook 如何双启动:Ubuntu 17.04 GNOME 和 Chrome OS
|
||||
============================================================
|
||||
|
||||
|
||||
> 本教程使用著名的 Crouton 安装器
|
||||
|
||||

|
||||
|
||||
在去年我拿到我的 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 之间切换。
|
||||
|
||||

|
||||
|
||||
作为这篇笔记的结尾,我想提醒你注意,由于 Chromebook 现在始终处于开发人员模式,所以当电池电量耗尽、打开或关闭设备时,你会一直看到一个警告,显示 “OS verification is OFF - Press SPACE to re-enable”,当你看到它时,请按 `CTRL+D`。玩得开心!
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
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
|
||||
@@ -0,0 +1,96 @@
|
||||
如何将树莓派变成电子书服务器
|
||||
============================================================
|
||||
|
||||
> Calibre 电子书管理软件可以轻松地在树莓派 3 上设置电子书服务器,即使在连接较慢区域也是如此。
|
||||
|
||||

|
||||
|
||||
最近 [Calibre 3.0 发布了][12],它让用户能够在浏览器中阅读电子书!注意 Raspbian 的仓库还没有更新它(截至写作时)。
|
||||
|
||||
电子书是教师、图书馆员和其他人与学生共享书籍、课堂资料或其他文件的好方法,只需要你有可靠的带宽接入即可。但是,即使你的连接速度较慢或无法连接,还有一个简单的解决方案:使用在树莓派 3 上运行的开源 Calibre 电子书管理软件创建电子书服务器。这是我所做的,你也可以。
|
||||
|
||||
首先我下载了最新的 [Raspbian Pixel 镜像][13],并安装在一个新的 8GB microSD 卡上。然后我插入 microSD,连接了键盘、鼠标并用一根 HDMI 线连接到一台旧的 LCD 电视,然后启动了 Pi。在我的显示器上[调整了 Pixel 环境分辨率][14]并连接到本地网络之后,我准备开始了。我打开一个终端,并输入 `sudo apt-get update` 以获取操作系统的最新更新。
|
||||
|
||||

|
||||
|
||||
接下来,我在终端中输入 `sudo apt-get install calibre` 来安装 [Calibre][15]。
|
||||
|
||||

|
||||
|
||||
我从命令行启动了 Calibre(注意它也可以从 GUI 启动)。Calibre 的界面非常直观。第一次启动时,你会看到 **Welcome to Calibre** 的向导。我将默认 “Calibre Library” 更改为 “CalibreLibrary”(一个词),因为这启动内容服务器时更容易。
|
||||
|
||||
在选择完我的 Calibre 内容位置后,我准备好开始下载书了。
|
||||
|
||||

|
||||
|
||||
我从菜单中选择了 **Get Books** 选项,在这很容易输入我的搜索字词,并选择我感兴趣的电子书提供者。我正在寻找[非 DRM][16] 的材料,所以我选择 [Project Gutenberg][17] 作为我的源。(Caliber 的免责声明指出,电子书交易是在你和个人内容提供商之间。)我在作者字段中输入 “Mark Twain”,并得到10个结果。
|
||||
|
||||

|
||||
|
||||
我选择了 _Adventures of Huckleberry Finn_ 这本书。在下一页面上,我可以选择 **MOBI** 和 **EPUB** 这两种电子书格式。我选择了 EPUB,这本书下载得很快。
|
||||
|
||||
|
||||

|
||||
|
||||
你也可以从其他内容提供商向库中添加图书,而不是在 Calibre 的列表中添加图书。例如,老师可以通过该内容服务器与学生分享电子书格式的开放教育资源。要加载内容,请使用界面最左侧的 “Add Books” 选项。
|
||||
|
||||
根据你图书库的大小,你也许需要增加 microSD 卡的大小。
|
||||
|
||||

|
||||
|
||||
将内容添加到电子书服务器后,即可与网络中的其他人共享内容。通过在终端中输入 `ifconfig` 获取你的树莓派 IP 地址。我正在使用无线网络,所以我在下面的例子中使用了 **wlan0** 中的结果。点击界面的最右侧并展开菜单。然后点击 “Connect and Share” 并启动服务器。
|
||||
|
||||

|
||||
|
||||
我下一步是通过我的电脑客户端连接到树莓派访问我添加的电子书。我在客户端上打开一个浏览器并输入树莓的地址,后面加上 **:8080** 端口。在我这里是 **http://192.168.1.10:8080** (根据你 Pi 的地址来适配)。
|
||||
|
||||
你会在浏览器中看到主页:
|
||||
|
||||

|
||||
|
||||
我已经测试,并能用 iPhone、Linux、MacOS 计算机轻易连接到服务器。
|
||||
|
||||
你可以在这个主页总探索选项,或者点击 **All 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
|
||||
@@ -0,0 +1,224 @@
|
||||
网络分析利器:在 Ubuntu 16.04 上安装 Bro
|
||||
============================================================
|
||||
|
||||
|
||||
[][4]
|
||||
|
||||
### 简介:Bro 网络分析框架
|
||||
|
||||
Bro 是一个开源的网络分析框架,侧重于网络安全监控。这是一项长达 15 年的研究成果,被各大学、研究实验室、超级计算机中心和许多开放科学界广泛使用。它主要由伯克利国际计算机科学研究所和伊利诺伊大学厄巴纳-香槟分校的国家超级计算机应用中心开发。
|
||||
|
||||
Bro 的功能包括:
|
||||
|
||||
* Bro 的脚本语言支持针对站点定制监控策略
|
||||
* 针对高性能网络
|
||||
* 分析器支持许多协议,可以在应用层面实现高级语义分析
|
||||
* 它保留了其所监控的网络的丰富的应用层统计信息
|
||||
* Bro 能够与其他应用程序接口实时地交换信息
|
||||
* 它的日志全面地记录了一切信息,并提供网络活动的高级存档
|
||||
|
||||
本教程将介绍如何从源代码构建,并在 Ubuntu 16.04 服务器上安装 Bro。
|
||||
|
||||
### 准备工作
|
||||
|
||||
Bro 有许多依赖文件:
|
||||
|
||||
* Libpcap ([http://www.tcpdump.org][2])
|
||||
* OpenSSL 库 ([http://www.openssl.org][3])
|
||||
* BIND8 库
|
||||
* Libz
|
||||
* Bash (BroControl 所需要)
|
||||
* Python 2.6+ (BroControl 所需要)
|
||||
|
||||
从源代码构建还需要:
|
||||
|
||||
* CMake 2.8+
|
||||
* Make
|
||||
* GCC 4.8+ or Clang 3.3+
|
||||
* SWIG
|
||||
* GNU Bison
|
||||
* Flex
|
||||
* Libpcap headers
|
||||
* OpenSSL headers
|
||||
* zlib headers
|
||||
|
||||
### 起步
|
||||
|
||||
首先,通过执行以下命令来安装所有必需的依赖项:
|
||||
|
||||
```
|
||||
# apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev
|
||||
```
|
||||
|
||||
#### 安装定位 IP 地理位置的 GeoIP 数据库
|
||||
|
||||
Bro 使用 GeoIP 的定位地理位置。安装 IPv4 和 IPv6 版本:
|
||||
|
||||
```
|
||||
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
|
||||
$wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz
|
||||
```
|
||||
|
||||
解压这两个压缩包:
|
||||
|
||||
```
|
||||
$ gzip -d GeoLiteCity.dat.gz
|
||||
$ gzip -d GeoLiteCityv6.dat.gz
|
||||
```
|
||||
|
||||
将解压后的文件移动到 `/usr/share/GeoIP` 目录下:
|
||||
|
||||
```
|
||||
# mvGeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
|
||||
# mv GeoLiteCityv6.dat /usr/share/GeoIP/GeoIPCityv6.dat
|
||||
```
|
||||
|
||||
现在,可以从源代码构建 Bro 了。
|
||||
|
||||
### 构建 Bro
|
||||
|
||||
最新的 Bro 开发版本可以通过 `git` 仓库获得。执行以下命令:
|
||||
|
||||
```
|
||||
$ git clone --recursive git://git.bro.org/bro
|
||||
```
|
||||
|
||||
转到克隆下来的目录,然后使用以下命令就可以简单地构建 Bro:
|
||||
|
||||
```
|
||||
$ cd bro
|
||||
$ ./configure
|
||||
$ make
|
||||
```
|
||||
|
||||
`make` 命令需要一些时间来构建一切。确切的时间取决于服务器的性能。
|
||||
|
||||
可以使用一些参数来执行 `configure` 脚本,以指定要构建的依赖关系,特别是 `--with-*` 选项。
|
||||
|
||||
### 安装 Bro
|
||||
|
||||
在克隆的 `bro` 目录中执行:
|
||||
|
||||
```
|
||||
# make install
|
||||
```
|
||||
|
||||
默认安装路径为 `/usr/local/bro`。
|
||||
|
||||
### 配置 Bro
|
||||
|
||||
Bro 的配置文件位于 `/usr/local/bro/etc` 目录下。 这里有三个文件:
|
||||
|
||||
* `node.cfg`,用于配置要监视的单个节点(或多个节点)。
|
||||
* `broctl.cfg`,BroControl 的配置文件。
|
||||
* `networks.cgf`,包含一个使用 CIDR 标记法表示的网络列表。
|
||||
|
||||
#### 配置邮件设置
|
||||
|
||||
打开 `broctl.cfg` 配置文件:
|
||||
|
||||
```
|
||||
# $EDITOR /usr/local/bro/etc/broctl.cfg
|
||||
```
|
||||
|
||||
查看 `Mail Options` 选项,并编辑 `MailTo` 行如下:
|
||||
|
||||
```
|
||||
# Recipient address for emails sent out by Bro and BroControl
|
||||
MailTo = admin@example.com
|
||||
```
|
||||
|
||||
保存并关闭。还有许多其他选项,但在大多数情况下,默认值就足够好了。
|
||||
|
||||
#### 选择要监视的节点
|
||||
|
||||
开箱即用,Bro 被配置为以独立模式运行。在本教程中,我们就是做一个独立的安装,所以没有必要改变。但是,也请查看 `node.cfg` 配置文件:
|
||||
|
||||
```
|
||||
# $EDITOR /usr/local/bro/etc/node.cfg
|
||||
```
|
||||
|
||||
在 `[bro]` 部分,你应该看到这样的东西:
|
||||
|
||||
```
|
||||
[bro]
|
||||
type=standalone
|
||||
host=localhost
|
||||
interface=eth0
|
||||
```
|
||||
|
||||
请确保 `inferface` 与 Ubuntu 16.04 服务器的公网接口相匹配。
|
||||
|
||||
保存并退出。
|
||||
|
||||
#### 配置监视节点的网络
|
||||
|
||||
最后一个要编辑的文件是 `network.cfg`。使用文本编辑器打开它:
|
||||
|
||||
```
|
||||
# $EDITOR /usr/local/bro/etc/networks.cfg
|
||||
```
|
||||
|
||||
默认情况下,你应该看到以下内容:
|
||||
|
||||
```
|
||||
# List of local networks in CIDR notation, optionally followed by a
|
||||
# descriptive tag.
|
||||
# For example, "10.0.0.0/8" or "fe80::/64" are valid prefixes.
|
||||
|
||||
10.0.0.0/8 Private IP space
|
||||
172.16.0.0/12 Private IP space
|
||||
192.168.0.0/16 Private IP space
|
||||
```
|
||||
|
||||
删除这三个条目(这只是如何使用此文件的示例),并输入服务器的公用和专用 IP 空间,格式如下:
|
||||
|
||||
```
|
||||
X.X.X.X/X Public IP space
|
||||
X.X.X.X/X Private IP space
|
||||
```
|
||||
|
||||
保存并退出。
|
||||
|
||||
### 使用 BroControl 管理 Bro 的安装
|
||||
|
||||
管理 Bro 需要使用 BroControl,它支持交互式 shell 和命令行工具两种形式。启动该 shell:
|
||||
|
||||
```
|
||||
# /usr/local/bro/bin/broctl
|
||||
```
|
||||
|
||||
要想使用命令行工具,只需将参数传递给上一个命令,例如:
|
||||
|
||||
```
|
||||
# /usr/local/bro/bin/broctl status
|
||||
```
|
||||
|
||||
这将通过显示以下的输出来检查 Bro 的状态:
|
||||
|
||||
```
|
||||
Name Type Host Status Pid Started
|
||||
bro standalone localhost running 6807 20 Jul 12:30:50
|
||||
```
|
||||
|
||||
### 结论
|
||||
|
||||
这是一篇 Bro 的安装教程。我们使用基于源代码的安装,因为它是获得可用的最新版本的最有效的方法,但是该网络分析框架也可以下载预构建的二进制格式文件。
|
||||
|
||||
下次见!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.unixmen.com/how-to-install-bro-ubuntu-1604/
|
||||
|
||||
作者:[Giuseppe Molica][a]
|
||||
译者:[firmianay](https://github.com/firmianay)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.unixmen.com/author/tutan/
|
||||
[1]:https://www.unixmen.com/author/tutan/
|
||||
[2]:http://www.tcpdump.org/
|
||||
[3]:http://www.openssl.org/
|
||||
[4]:https://www.unixmen.com/wp-content/uploads/2017/07/brologo.jpg
|
||||
@@ -0,0 +1,70 @@
|
||||
FreeDOS: 已经积极开发了 23 年的 DOS
|
||||
============================================================
|
||||
|
||||
> 23 年后,FreeDOS 仍在积极开发,并将 MS-DOS 的生命延长了几年
|
||||
|
||||

|
||||
|
||||
在 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
|
||||
@@ -0,0 +1,59 @@
|
||||
6 个学习 OpenStack 的新指南和教程
|
||||
============================================================
|
||||
|
||||
> 想了解更多关于 OpenStack 的内容?这些免费资源可能只是你所需要的。
|
||||
|
||||

|
||||
|
||||
|
||||
云基础设施是一个非常需要的技能。如果你正在为你的云基础架构需求寻找开源解决方案,那么 [OpenStack][12] 就是其中之一。
|
||||
|
||||
OpenStack 是一个巨大的项目集合,为云服务的几乎每一个部分都提供了解决方案和集成。虽然这个巨大范围使得它成为一个强大的工具,但这也意味着可能很难跟上并了解整个项目,了解如何使用它们、如何自定义它们以及如何向其提供代码。
|
||||
|
||||
幸运的是,有很多选择可以帮助你。除了[官方项目文档] [13]、纸质书籍和认证培训计划外,还有大量社区创造的优秀资源。我们每个月可以在 Opensource.com 上查看它在博客和其他网站上最近发布的指南和教程,这会给你启发。我们来看看这次我们发现了什么。
|
||||
|
||||
* 首先在本月的这一批中,我们有一篇来自 Antony Messerli 的指南,介绍如何通过 Ansible [设置 OpenStack 云][1]。Messerli 将引导我们完成实验室环境中的配置以及在集群上运行 OpenStack 所需的 playbook,还有添加镜像、设置网络等的基础知识。如果你正在考虑使用 Ansible 安装 OpenStack 小型本地测试环境,这是一篇很好的文章。
|
||||
* 接下来,你有没有想过 Neutron 网络如何在 OpenStack 中的工作的?应用程序中发生的事情如何对应于底层代码?Arie Bregman 在[这篇文章][2]中提供了一段 OpenStack Neutron 代码。你需要熟悉一般的网络原理,至少有一点 OpenStack 代码基础才能跟上。
|
||||
* Gerrit是 OpenStack 使用的开源代码审查项目,用于管理上传的修补程序,并允许在将更改合并到主 OpenStack 代码库之前进行反馈和测试。对于那些习惯于不同的代码审查系统(或根本没有的),Gerrit 可能会有点混乱,尽管它具有很好的仪表板功能,因此你只能看到对你很重要的信息。Dougal Matthews 在[这篇文章][3]中带我们看了他的 Gerrit 仪表板设置,这可能会帮助你设置自己的。
|
||||
* 上个月在波士顿举办的 OpenStack 峰会的[视频][4]已经发布了,无论你是否参加过上个月的活动,这都包含了技术和非技术专题的宝库。不知道从哪里开始?这有个来自 Julio Villarreal Pelegrino 关于如何规划、构建、运行一个成功的 OpenStack 云计算的[演讲][5]。
|
||||
* 任何云管理员都应该担心安全问题。但你从哪里开始?Naveen Joy 发布了一个很好的十个安全问题的[清单][6],用于加固你的 OpenStack 网络;你可以在上个月的同一主题演讲中查看[这个视频][7]。
|
||||
* OpenStack 中的内部消息服务在一个公共库中进行管理,该库存在于一个称为 Oslo 的项目中,自然它被称为 Oslo.Messenging。要了解这个库的基础知识,它在这个分为[两个][8][部分][9]的博客中提到。
|
||||
|
||||
想要了解更多?可以从这三年来社区说提供的内容中找到我们完整的 [OpenStack 指南、如何做和教程][14],以帮助你学习成为一名高效的 OpenStack 开发人员或管理员。
|
||||
|
||||
有很棒教程、指导或者如何做需要我们分享的么?在下面的评论中分享。
|
||||
|
||||
(图片来源:opensource.com)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Jason Baker - Jason 热衷于使用技术使世界更加开放,从软件开发到阳光政府行动。Linux 桌面爱好者、地图/地理空间爱好者、树莓派工匠、数据分析和可视化极客、偶尔的码农、云本土主义者。在 Twitter 上关注他。
|
||||
|
||||
via: https://opensource.com/article/17/6/openstack-guides-and-tutorials
|
||||
|
||||
作者:[Jason Baker][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/jason-baker
|
||||
[1]:https://www.reversengineered.com/2016/05/09/setting-up-an-openstack-cloud-using-ansible/
|
||||
[2]:http://abregman.com/2017/05/29/openstack-neutron-service-code-deep-dive/
|
||||
[3]:http://www.dougalmatthews.com/2017/May/19/how-i-gerrit/
|
||||
[4]:https://www.openstack.org/videos/
|
||||
[5]:http://www.juliosblog.com/dont-fail-at-scale-how-to-plan-for-build-and-operate-a-successful-openstack-cloud-video-openstack-summit2017/
|
||||
[6]:https://blogs.cisco.com/cloud/securing-openstack-networking
|
||||
[7]:https://www.openstack.org/videos/boston-2017/securing-openstack-networking
|
||||
[8]:https://pigdogweb.wordpress.com/2017/05/22/intro-to-oslo-messaging/
|
||||
[9]:https://pigdogweb.wordpress.com/2017/06/02/oslo-messaging-the-cloud-is-calling/
|
||||
[10]:https://opensource.com/article/17/6/openstack-guides-and-tutorials?rate=tRBp5wgAE1d3YHJSwcHWnfgXyJlqJedMImQFqJiW-tE
|
||||
[11]:https://opensource.com/user/19894/feed
|
||||
[12]:https://opensource.com/resources/what-is-openstack
|
||||
[13]:http://docs.openstack.org/
|
||||
[14]:https://opensource.com/resources/openstack-tutorials
|
||||
[15]:https://opensource.com/users/jason-baker
|
||||
[16]:https://opensource.com/users/jason-baker
|
||||
[17]:https://opensource.com/article/17/6/openstack-guides-and-tutorials#comments
|
||||
@@ -0,0 +1,82 @@
|
||||
不需要编码:树莓派上的 Node-RED
|
||||
============================================================
|
||||
|
||||
> 查看本教程,看看使用 Node-RED 的拖放界面设置硬件流程是多么容易。
|
||||
|
||||

|
||||
|
||||
Node-RED 是一个编程工具,可让你使用基于浏览器的编辑器快速连接硬件设备。它具有大量的节点,可以以拖放的方式构建流程,这大大减少了开发时间。[Node-RED][14] 与树莓派的 Raspian Jessie 一起安装,你还可以独立下载 Node-RED。
|
||||
|
||||
为了向你展示它如何工作,我们将使用 Node-RED 构建一个简单的工具,与连接到树莓派的蜂窝调制解调器通信。使用蜂窝调制解调器,你可以通过蜂窝网络从你的树莓派发送/接收数据。你可以使用蜂窝网络提供商通常提供的 3G/4G USB 加密狗,也可以将开发板与 3G 或 4G 无线调制解调器连接。
|
||||
|
||||
无论你是连接 USB 加密狗还是开发板,树莓派的连接接口都是通过 USB 端口的。在本教程中,我将一块 [SIM900][15] 开发板通过一根 USB 转串行电缆连接到树莓派。
|
||||
|
||||

|
||||
|
||||
第一步是检查 SIM900 开发板是否连接到树莓派上。
|
||||
|
||||

|
||||
|
||||
USB 转串行适配器在这里被显示为连接到树莓派的 USB 设备之一。
|
||||
|
||||
接下来,检查 SIM900 连接的 USB 端口号。
|
||||
|
||||

|
||||
|
||||
在最后一行,你可以看到 SIM900 板(通过 USB 转串行转换器连接)连接到了树莓派上的 **ttyUSB0**。现在我们准备开始使用 Node-RED。
|
||||
|
||||
在树莓派上启动 Node-RED。
|
||||
|
||||

|
||||
|
||||
下载[示例流图][16]并将其导入到 Node-RED 中。请注意,流文件是该图形 UI 的 JSON 表示形式。
|
||||
|
||||
在 Node-RED 中,导入的流图应该看上去像这样:
|
||||
|
||||

|
||||
|
||||
注入节点设置 [AT 命令][17]需要查询调制解调器。**添加换行** 功能节点会在注入节点传递过来的 AT 命令后面附加 **\r\n**。**添加换行** 的输出然后被连接到**串行输出**节点,它将数据写入串行端口。来自调制解调器的 AT 命令的响应通过 **串行输入** 节点读取,该节点将响应输出到 **调试** 窗口。确认串行端口号和端口速度在 **串行输入** 和 **串行输出** 节点中的配置。
|
||||
|
||||
Node-RED 是一种易于使用的编程工具,可用于快速集成和测试硬件设备。从本教程可以看出,使用 Node-RED 连接和测试使用树莓派的蜂窝模式不需要编码。
|
||||
|
||||
有关 Node-RED 和其他可以使用的方式的更多信息,请访问[项目网站][18]。
|
||||
|
||||
(题图: Thomas Hawk 的 [Flickr][12]. [CC BY-NC 2.0][13]. Opensource.com 修改)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Surya G - 我的兴趣是为物联网项目尤其是使用蜂窝调制解调器的项目做软件开发。
|
||||
|
||||
---
|
||||
|
||||
via: https://opensource.com/article/17/7/nodered-raspberrypi-hardware
|
||||
|
||||
作者:[Surya G][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/gssm2m
|
||||
[1]:https://opensource.com/tags/raspberry-pi?src=raspberry_pi_resource_menu1
|
||||
[2]:https://opensource.com/resources/what-raspberry-pi?src=raspberry_pi_resource_menu2
|
||||
[3]:https://opensource.com/article/16/12/getting-started-raspberry-pi?src=raspberry_pi_resource_menu3
|
||||
[4]:https://opensource.com/article/17/2/raspberry-pi-submit-your-article?src=raspberry_pi_resource_menu4
|
||||
[5]:https://opensource.com/file/359036
|
||||
[6]:https://opensource.com/file/359086
|
||||
[7]:https://opensource.com/file/359091
|
||||
[8]:https://opensource.com/file/359716
|
||||
[9]:https://opensource.com/file/359056
|
||||
[10]:https://opensource.com/article/17/7/nodered-raspberrypi-hardware?rate=NjMvod1gAOI2Tf9t0YLr-4tbe_K1XWfHWNjVkTkPuzU
|
||||
[11]:https://opensource.com/user/137861/feed
|
||||
[12]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG
|
||||
[13]:https://creativecommons.org/licenses/by-nc/2.0/
|
||||
[14]:https://nodered.org/
|
||||
[15]:http://m2msupport.net/m2msupport/simcom-sim900-gprs-2g-module/
|
||||
[16]:http://m2msupport.net/m2msupport/wp-content/themes/admired/Node-RED/modem_commands
|
||||
[17]:http://m2msupport.net/m2msupport/software-and-at-commands-for-m2m-modules/
|
||||
[18]:https://nodered.org/
|
||||
[19]:https://opensource.com/users/gssm2m
|
||||
[20]:https://opensource.com/users/gssm2m
|
||||
124
published/201707/20170707 Bash prompt tips and tricks.md
Normal file
124
published/201707/20170707 Bash prompt tips and tricks.md
Normal file
@@ -0,0 +1,124 @@
|
||||
Linux Bash 提示符的一些骚操作
|
||||
=======================================================
|
||||
|
||||
> 一些能让你自定义 Bash 提示符的黑科技
|
||||
|
||||

|
||||
|
||||
当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符:
|
||||
|
||||
```
|
||||
[user@$host ~]$
|
||||
```
|
||||
|
||||
你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~
|
||||
|
||||
### 如何设置 Bash 提示符
|
||||
|
||||
Bash 提示符是通过环境变量 `PS1` (<ruby>提示符字符串 1<rt>Prompt String 1</rt></ruby>) 来设置的,它用于交互式 shell 提示符。当然如果你需要更多的输入才能完成一个 Bash 命令时,`PS2` 环境变量就是用来设置多行提示符的:
|
||||
|
||||
```
|
||||
[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ "
|
||||
[Linux Rulez] export PS2="... "
|
||||
[Linux Rulez] if true; then
|
||||
... echo "Success!"
|
||||
... fi
|
||||
Success!
|
||||
```
|
||||
|
||||
### 在哪里设置 PS1 的值?
|
||||
|
||||
`PS1` 就是一个普通的环境变量,系统默认值设置在 `/etc/bashrc` 中,在我的系统中,默认提示符通过以下命令来设置的:
|
||||
|
||||
```
|
||||
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
|
||||
```
|
||||
|
||||
它判断 `PS1` 是否是系统的默认值 `\s-\v$` ,如果是的话则将值设置为 `[\u@\h \W]\$`。(LCTT 译注:注意命令中用 `\` 做了转义。)
|
||||
|
||||
但如果你想要自定义提示符,不应该修改 `/etc/bashrc` ,而是应该在你的主目录下将自定义命令加到 `.bashrc` 文件中。
|
||||
|
||||
### 上面提到的 `\u`、`\h`、`\W`、`\s` 和 `\v` 是什么意思?
|
||||
|
||||
在 `man bash` 中的 PROMPTING 章节中,你能够找到所有 `PS1` 和 `PS2` 相关的特殊字符的描述,以下是一些比较常用的:
|
||||
|
||||
- `\u`:用户名
|
||||
- `\h`:短主机名
|
||||
- `\W`:当前你所在的目录的名称(basename),`~` 表示你的主目录
|
||||
- `\s`:Shell 名字(bash 或者 sh,取决于你的 Shell 的名字是什么)
|
||||
- `\v`:Shell 的版本号
|
||||
|
||||
### 还有哪些特殊的字符串可以用在提示符当中
|
||||
|
||||
除了上面这些,还有很多有用的字符串可以用在提示符当中:
|
||||
|
||||
- `\d`:将日期扩展成 “Tue Jun 27” 这种格式
|
||||
- `\D{fmt}`:允许自定义日期格式——可通过 `man strftime` 来获得更多信息
|
||||
- `\D{%c}`:获得本地化的日期和时间
|
||||
- `\n`:换行(参考下面的多行提示符)
|
||||
- `\w`:显示当前工作目录的完整路径
|
||||
- `\H`:当前工作机器的完整主机名
|
||||
|
||||
除了以上这些,你还可以在 Bash 的 man 页面的 PROMPTING 部分找到更多的特殊字符和它的用处。
|
||||
|
||||
### 多行提示符
|
||||
|
||||
如果你的提示符过长(比如说你想包括 `\H` 、`\w` 或完整的日期时间时 ),想将提示符切成两行,可以使用 `\n` 将提示符切断成两行显示,比如下面的多行的例子会在第一行显示日期、时间和当前工作目录,第二行显示用户名和主机名:
|
||||
|
||||
```
|
||||
PS1="\D{%c} \w\n[\u@\H]$ "
|
||||
```
|
||||
### 还能再好玩点吗?
|
||||
|
||||
人们偶尔也想将提示符变成彩色的。虽然我觉得彩色提示符让人分心、易怒,但是也许你很喜欢。如果我们想将日期变成红色的,目录变成青蓝色,用户名搞一个黄色背景,你可以这样做:
|
||||
|
||||
```
|
||||
PS1="\[\e[31m\]\D{%c}\[\e[0m\]
|
||||
\[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ "
|
||||
```
|
||||
|
||||
- `\[..\]` :表示一些非打印字符
|
||||
- `\e[..` :转义字符,后面的跟着的特定的转义字符串在终端中表示颜色或者其他意思
|
||||
- `31m` :表示红色字体(`41m` 表示是红色背景)
|
||||
- `36m` :表示是青蓝色字体
|
||||
- `1;43m` :表示黄色字体(`1;33m` 表示黄色字体)
|
||||
- `[\e[0m]]` :它在最后将颜色恢复成系统终端默认颜色
|
||||
|
||||
你可以在 [Bash prompt HOWTO][11] 这里找到更多的颜色代码,甚至可以让字符反相和闪烁!我不知道为什么地球人会有这种想法,但是你可以这么干!
|
||||
|
||||
所以你最喜欢的自定义提示符是什么样子的呢?有没有让你抓狂的自定义提示符呢?请在评论里告诉我吧~
|
||||
|
||||
|
||||
(照片来源:[ajmexico][8]. 修改自 [Jason Baker][9]. [CC BY-SA 2.0][10].)
|
||||
|
||||
---
|
||||
|
||||
作者简介:
|
||||
|
||||
Dave Neary - Dave Neary 是红帽开源和标准化团队成员,帮助开源项目对红帽的成功至关重要。自从在 1999 年为 GIMP 提交了第一个补丁以来,他一直带着各种不同的帽子,在开源的世界徜徉。
|
||||
|
||||
---
|
||||
|
||||
via: https://opensource.com/article/17/7/bash-prompt-tips-and-tricks
|
||||
|
||||
作者:[Dave Neary][a]
|
||||
译者:[吴霄/toyijiu](https://github.com/toyijiu)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/dneary
|
||||
[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[6]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks?rate=7o5TkSbm_tDUEANDpxTZJU3LgEg0EK-j4xPuNL79m3M
|
||||
[7]:https://opensource.com/user/16681/feed
|
||||
[8]:https://www.flickr.com/photos/15587432@N02/3281139507/
|
||||
[9]:https://opensource.com/users/jason-baker
|
||||
[10]:https://creativecommons.org/licenses/by/2.0/
|
||||
[11]:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
|
||||
[12]:https://opensource.com/users/dneary
|
||||
[13]:https://opensource.com/users/dneary
|
||||
[14]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks#comments
|
||||
@@ -0,0 +1,57 @@
|
||||
在 Linux Mint 安装 Linux Kernel 4.12(稳定版)
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
**Linus Torvalds** 发布了 **Linux 内核 4.12**。你可以从**[这里][7]**直接下载相关的 **deb** 包来安装。或者,继续阅读本文,按下面的步骤安装新内核。
|
||||
|
||||
**警告:Linux 内核 是系统的关键元素。在某个硬件设备不正常工作时,可以尝试执行升级,新的内核可能会解决此问题。 但同样的,非必须地更新一个新的内核也可能导致不必要的回滚,例如,无网络连接, 没有声音,甚至是无法正常启动系统,所以安装一个新的内核,请正确认识风险。**
|
||||
|
||||
最简单的安装任意内核方法 - 在**Linux Mint** 使用 [UKUU][8]。
|
||||
|
||||
```
|
||||
TerminalShekin@mylinuxmintpc~$sudo apt-add-repository -y ppa:teejee2008/ppa
|
||||
sudo apt-get update
|
||||
sudo apt-get install ukuu
|
||||
```
|
||||
|
||||
**提醒:所有的 Nvidia/AMD 电脑用户, 在安装内核之前,建议切换到 free 版本的驱动。**
|
||||
|
||||
|
||||
**如果决定删除内核 4.12,**
|
||||
|
||||
1. 首先,重启计算机,选择 GRUB 菜单中的旧内核启动。系统引导完成之后,通过以下命令删除新的内核:
|
||||
2. 然后,使用 [UKUU][13] 程序,或者命令:`sudo apt purge linux-image-4.12-*`
|
||||
3. 最后,更新 **GRUB** 或者 **[BURG][10]**:`sudo update-grub`
|
||||
|
||||
在启动 **GRUB** 的时候,选择**以前的 Linux 版本**即可回到以前版本的内核。
|
||||
|
||||
Good Luck!!!
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://mintguide.org/system/798-install-linux-kernel-4-12-stable-on-linux-mint.html
|
||||
|
||||
作者:[Shekin][a]
|
||||
译者:[VicYu](https://vicyu.com)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://mintguide.org/user/Shekin/
|
||||
[1]:https://mintguide.org/
|
||||
[2]:https://mintguide.org/tags/kernel/
|
||||
[3]:https://mintguide.org/tags/nvidia/
|
||||
[4]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL2tlcm5lbC51YnVudHUuY29tL35rZXJuZWwtcHBhL21haW5saW5lL3Y0LjEyLw%3D%3D
|
||||
[5]:https://mintguide.org/
|
||||
[6]:https://mintguide.org/tags/kernel/
|
||||
[7]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL2tlcm5lbC51YnVudHUuY29tL35rZXJuZWwtcHBhL21haW5saW5lL3Y0LjEyLw%3D%3D
|
||||
[8]:https://mintguide.org/tools/691-ukuu-ubuntu-kernel-upgrade-utility.html
|
||||
[9]:https://mintguide.org/
|
||||
[10]:https://mintguide.org/effects/716-burg-graphical-bootloader-install-to-linux-mint.html
|
||||
[11]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cua2VybmVsLm9yZy8%3D
|
||||
[12]:https://mintguide.org/tools/37-restore-grub-boot-loader-in-linux-mint-after-installation-reinstallation-windows.html
|
||||
[13]:https://mintguide.org/tools/691-ukuu-ubuntu-kernel-upgrade-utility.html
|
||||
[14]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cua2VybmVsLm9yZy8%3D
|
||||
[15]:https://mintguide.org/system/
|
||||
@@ -0,0 +1,126 @@
|
||||
教你如何比谷歌搜索更快速有效地利用 man
|
||||
============================================================
|
||||
|
||||
> Linux 的帮助手册其实拥有很多有用的信息,而且比你想象中更容易使用
|
||||
|
||||

|
||||
|
||||
我们通常通过 google 来查询 Linux 中的命令说明,但是其实还有一个更好的办法:那就是通过 Linux 自带的 **man 帮助页**来查询命令详尽完整的使用说明。
|
||||
|
||||
man 页面的历史本身比 Linux 还长,可以追溯到 Unix 早期那个年代。 通过[这个 Wikipedia][9] 可以知道,Dennis Ritchie 和 Ken Thompson 在 1971 年写了第一个 man 帮助页,那个年代的计算器使用的还是像烤箱一样的计算机,个人电脑还未出世。man 帮助页也有它自己的一套设计精炼的语法,和 Unix 与 Linux 一样,man 帮助页也不是一成不变的,它就像 Linux 内核一样不停地发展更新。
|
||||
|
||||
Man 帮助页通过数字标识符来分成不同类型的内容:
|
||||
|
||||
1. 一般用户命令
|
||||
2. 系统调用命令
|
||||
3. 库函数
|
||||
4. 特殊的文件和驱动程序
|
||||
5. 文件格式
|
||||
6. 游戏和屏保
|
||||
7. 杂项
|
||||
8. 系统管理命令和守护进程
|
||||
|
||||
尽管如此,用户一般也不需要知道他们想查询的命令是属于哪一个类型的。
|
||||
|
||||
这些文件格式化的方式在当今许多用户看来有点古怪。因为最开始他们是用 **trooff** 的方式,通过 PostScript 打印机来打印,所以包含了头部和布局方面的格式化信息。在 Linux 中,取而代之使用了一种叫做 [groff][10] 的方法。
|
||||
|
||||
在我的 Fedora 系统中,man 帮助页相关的文件存储在 `/usr/share/man` 下的子目录中(比如 `man1` 存储第一部分的命令),还有进一步的子目录用于存储 man 帮助页的翻译。
|
||||
|
||||
如果你在 Shell 中查找 `man` 命令的 man 帮助页,你时间看到将是 gzip 工具压缩的 `man.1.gz` 文件。想要查询 man 帮助页,需要输入类似如下命令:
|
||||
|
||||
```
|
||||
man man
|
||||
```
|
||||
|
||||
这个例子会显示 `man` 命令的 man 帮助页,这将先解压 man 帮助页文件,然后解释格式化指令并用 `less` 显示结果,所以导航操作和在 `less` 中一样。
|
||||
|
||||
所有的 man 帮助页都应该显示这些子段落:**Name**、 **Synopsis**、 **Description**、**Examples**、**See**、**Also**。有些还会添加一些额外的子段落,比如 **Options**、 **Exit**、**Status**、 **Environment**、**Bugs**、**Files**、**Author**、**Reporting**、**Bugs**、**History**、**Copyright**。
|
||||
|
||||
### 详细说明一个 man 帮助页
|
||||
|
||||
为了更详细地介绍一个典型的 man 帮助页,就用 [ls][12] 命令的帮助页来分析吧,在 **Name** 分段下,我们可以看到如下内容:
|
||||
|
||||
```
|
||||
ls - list directory contents
|
||||
```
|
||||
|
||||
它会简要地告诉我 `ls` 这条命令的作用.
|
||||
|
||||
在 `Synopsis` 分段下,我们可以看到如下的内容:
|
||||
|
||||
```
|
||||
ls [OPTION]... [FILE]…
|
||||
```
|
||||
|
||||
任何在中括号中的元素都是可选的。你可以只输入 `ls` 命令,后面不接任何参数。参数后面的省略号表示你可以添加任意多个彼此兼容的参数,以及许多文件名。对于 `[FILE]` 参数,你可以指定具体的目录名,或者可以使用通配符 `*`,比如这个例子,它会显示 `Documents` 文件夹下的 `.txt` 文件:
|
||||
|
||||
```
|
||||
ls Documents/*.txt
|
||||
```
|
||||
|
||||
在 **Description** 分段下, 我们可以看到关于这条命令更加详细的信息,还有关于这条命令各个参数作用的详细介绍的列表,比如说 `ls` 命令第一个选项 `-a` 参数,它的作用是显示包括隐藏文件/目录在内的所有文件:
|
||||
|
||||
```
|
||||
-a, --all
|
||||
```
|
||||
|
||||
如果我们想用这些参数,要么用它们的别名,比如 `-a`,要么用它们的全名,比如 `--all`(两条中划线)。然而并不是所有参数都有全名和别名(比如 `--author` 只有一种),而且两者的名字并不总是相互关联的(`-F` 和 `--classify`)。当你想用多个参数时,要么以空格隔开,要么共用一个连字符 `-`,在连字符后连续输入你需要的参数(不要添加空格)。比如下面两个等价的例子:
|
||||
|
||||
```
|
||||
ls -a -d -l
|
||||
```
|
||||
|
||||
```
|
||||
ls -adl
|
||||
```
|
||||
|
||||
但是 `tar` 这个命令有些例外,由于一些历史遗留原因,当参数使用别名时可以不用添加连字符 `-`,因此以下两种命令都是合法的:
|
||||
|
||||
```
|
||||
tar -cvf filearchive.tar thisdirectory/
|
||||
|
||||
tar cvf filearchive.tar thisdirectory/
|
||||
```
|
||||
|
||||
**ls** 的 **Description** 分段后是 **Author**、**Reporting Bugs**、**Copyright**、 **See Also** 等分段。
|
||||
|
||||
**See Also** 分段会提供一些相关的 man 帮助页,没事的话可以看看。毕竟除了命令外还有许多其他类型的 man 帮助页。
|
||||
|
||||
有一些命令不是系统命令,而是 Bash 特有的,比如 `alias` 和 `cd`。这些 Bash 特有的命令可以在 **BASH_BUILTINS** man 帮助页中查看,和上面的比起来它们的描述更加精炼,不过内容都是类似的。
|
||||
|
||||
其实通过 man 帮助页让你可以获得大量有用的信息,特别是当你想用一个已经很久没用过的命令,需要复习下这条命令的作用时。这个时候 man 帮助页饱受非议的简洁性反而对你来说是更好的。
|
||||
|
||||
(题图: [Internet Archive Book Images][8]. 修改自 Opensource.com. CC BY-SA 4.0)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Greg Pittman - Greg 是住在肯塔基州路易斯维尔的一位退休神经学家,但是却对计算机和编程保持着长久的兴趣,从十九世纪六十年代就开始捣腾 Fortran IV 了。随着 Linux 和开源软件的到来,更加激起了他去学习的兴趣并投身于这项事业中,并成为 Scribus 组织的一员。
|
||||
|
||||
-------
|
||||
|
||||
via: https://opensource.com/article/17/7/using-man-pages
|
||||
|
||||
作者:[Greg Pittman][a]
|
||||
译者:[吴霄/toyijiu](https://github.com/toyijiu)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/greg-p
|
||||
[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[6]:https://opensource.com/article/17/7/using-man-pages?rate=W0QImEyJK1b4qSGof6I3agtPeTpPQXkaSekp_bI_Rno
|
||||
[7]:https://opensource.com/user/30666/feed
|
||||
[8]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR
|
||||
[9]:https://en.wikipedia.org/wiki/Man_page
|
||||
[10]:https://en.wikipedia.org/wiki/Groff_(software)
|
||||
[11]:https://en.wikipedia.org/wiki/Less_(Unix)
|
||||
[12]:http://linuxcommand.org/man_pages/ls1.html
|
||||
[13]:https://opensource.com/users/greg-p
|
||||
[14]:https://opensource.com/users/greg-p
|
||||
[15]:https://opensource.com/article/17/7/using-man-pages#comments
|
||||
@@ -0,0 +1,231 @@
|
||||
NoSQL: 如何在 Ubuntu 16.04 上安装 OrientDB
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
### 说明 - 非关系型数据库(NoSQL)和 OrientDB
|
||||
|
||||
通常在我们提及数据库的时候,想到的是两个主要的分类:使用用于用户和应用程序之间进行对接的一种被称为结构化查询语言(**S**tructured **Q**uery **L**anguage ,缩写 SQL)的关系型数据库管理系统(**R**elational **D**ata **b**ase **M**anagement **S**ystem,缩写 RDBMS) 以及非关系型数据库管理系统(non-relational database management systems 或称 NoSQL 数据库)。
|
||||
|
||||
这两种模型在如何处理(存储)数据的方面存在着巨大的差异。
|
||||
|
||||
#### 关系数据库管理系统
|
||||
|
||||
在关系模型中(如 MySQL,或者其分支 MariaDB),一个数据库是一个表的集合,其中每个表包含一个或多个以列组织的数据分类。数据库的每行包含一个唯一的数据实例,其分类由列定义。
|
||||
|
||||
举个例子,想象一个包含客户的表。每一行相当于一个客户,而其中的每一列分别对应名字、地址以及其他所必须的信息。
|
||||
|
||||
而另一个表可能是包含订单、产品、客户、日期以及其它的种种。而这个数据库的使用者则可以获得一个满足其需要的视图,例如一个客户在一个特定的价格范围购买产品的报告。
|
||||
|
||||
#### 非关系型数据库管理系统
|
||||
|
||||
在非关系型数据库(或称为<ruby>不仅仅是数据库<rt>Not only SQL</rt></ruby>)管理系统中,数据库被设计为使用不同的方式存储数据,比如文档存储、键值对存储、图形关系存储以及其他方式存储。使用此种形式实现的数据库系统专门被用于大型数据库集群和大型 Web 应用。现今,非关系型数据库被用于某些大公司,如谷歌和亚马逊。
|
||||
|
||||
##### 文档存储数据库
|
||||
|
||||
文档存储数据库是将数据用文档的形式存储。这种类型的运用通常表现为 JavaScript 和 JSON,实际上,XML 和其他形式的存储也是可以被采用的。这里的一个例子就是 MongoDB。
|
||||
|
||||
##### 键值对存储数据库
|
||||
|
||||
这是一个由唯一的<ruby>键<rt>key</rt></ruby>配对一个<ruby>值<rt>value</rt></ruby>的简单模型。这个系统在高速缓存方面具有高性能和高度可扩展性。这里的例子包括 BerkeleyDB 和 MemacacheDB。
|
||||
|
||||
##### 图形关系数据库
|
||||
|
||||
正如其名,这种数据库通过使用<ruby>图<rt>graph</rt></ruby>模型存储数据,这意味着数据通过节点和节点之间的互连进行组织。这是一个可以随着时间的推移和使用而发展的灵活模型。这个系统应用于那些强调映射关系的地方。这里的例子有 IBM Graphs、Neo4j 以及 **OrientDB**。
|
||||
|
||||
### OrientDB
|
||||
|
||||
[OrientDB][3] 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“_它是一个将图形关系与文档、键值对、反应性、面向对象和地理空间模型结合在一起的**可扩展的、高性能的数据库**_”。
|
||||
|
||||
OrientDB 还支持 SQL ,经过扩展可以用来操作树和图。
|
||||
|
||||
### 目标
|
||||
|
||||
这个教程旨在教会大家如何在运行 Ubuntu 16.04 的服务器上下载并配置 OrientDB 社区版。
|
||||
|
||||
### 下载 OrientDB
|
||||
|
||||
我们可以从最新的服务端上通过输入下面的指令来下载最新版本的 OrientDB。
|
||||
|
||||
```
|
||||
$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux
|
||||
```
|
||||
|
||||
这里下载的是一个包含预编译二进制文件的压缩包,所以我们可以使用 `tar` 指令来操作解压它:
|
||||
|
||||
```
|
||||
$ tar -zxf orientdb-community-2.2.22.tar.gz
|
||||
```
|
||||
|
||||
将从中提取出来的文件夹整体移动到 `/opt`:
|
||||
|
||||
```
|
||||
# mv orientdb-community-2.2.22 /opt/orientdb
|
||||
```
|
||||
|
||||
### 启动 OrientDB 服务器
|
||||
|
||||
启动 OrientDB 服务器需要运行 `orientdb/bin/` 目录下的 shell 脚本:
|
||||
|
||||
```
|
||||
# /opt/orientdb/bin/server.sh
|
||||
```
|
||||
|
||||
如果你是第一次开启 OrientDB 服务器,安装程序还会显示一些提示信息,以及提醒你设置 OrientDB 的 root 用户密码:
|
||||
|
||||
```
|
||||
+---------------------------------------------------------------+
|
||||
| WARNING: FIRST RUN CONFIGURATION |
|
||||
+---------------------------------------------------------------+
|
||||
| This is the first time the server is running. Please type a |
|
||||
| password of your choice for the 'root' user or leave it blank |
|
||||
| to auto-generate it. |
|
||||
| |
|
||||
| To avoid this message set the environment variable or JVM |
|
||||
| setting ORIENTDB_ROOT_PASSWORD to the root password to use. |
|
||||
+---------------------------------------------------------------+
|
||||
|
||||
Root password [BLANK=auto generate it]: ********
|
||||
Please confirm the root password: ********
|
||||
```
|
||||
|
||||
在完成这些后,OrientDB 数据库服务器将成功启动:
|
||||
|
||||
```
|
||||
INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer]
|
||||
```
|
||||
|
||||
从现在开始,我们需要用第二个终端来与 OrientDB 服务器进行交互。
|
||||
|
||||
若要强制停止 OrientDB 执行 `Ctrl+C` 即可。
|
||||
|
||||
### 配置守护进程
|
||||
|
||||
此时,我们可以认为 OrientDB 仅仅是一串 shell 脚本,可以用编辑器打开 `/opt/orientdb/bin/orientdb.sh`:
|
||||
|
||||
```
|
||||
# $EDITOR /opt/orientdb/bin/orientdb.sh
|
||||
```
|
||||
|
||||
在它的首段,我们可以看到:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
# OrientDB service script
|
||||
#
|
||||
# Copyright (c) OrientDB LTD (http://orientdb.com/)
|
||||
|
||||
# chkconfig: 2345 20 80
|
||||
# description: OrientDb init script
|
||||
# processname: orientdb.sh
|
||||
|
||||
# You have to SET the OrientDB installation directory here
|
||||
ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH"
|
||||
ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH"
|
||||
```
|
||||
|
||||
我们需要配置`ORIENTDB_DIR` 以及 `ORIENTDB_USER`.
|
||||
|
||||
然后创建一个用户,例如我们创建一个名为 `orientdb` 的用户,我们需要输入下面的指令:
|
||||
|
||||
```
|
||||
# useradd -r orientdb -s /sbin/nologin
|
||||
```
|
||||
|
||||
`orientdb` 就是我们在 `ORIENTDB_USER` 处输入的用户。
|
||||
|
||||
再更改 `/opt/orientdb` 目录的所有权:
|
||||
|
||||
```
|
||||
# chown -R orientdb:orientdb /opt/orientdb
|
||||
```
|
||||
|
||||
改变服务器配置文件的权限:
|
||||
|
||||
```
|
||||
# chmod 640 /opt/orientdb/config/orientdb-server-config.xml
|
||||
```
|
||||
|
||||
#### 下载系统守护进程服务
|
||||
|
||||
OrientDB 的压缩包包含一个服务文件 `/opt/orientdb/bin/orientdb.service`。我们将其复制到 `/etc/systemd/system` 文件夹下:
|
||||
|
||||
```
|
||||
# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system
|
||||
```
|
||||
|
||||
编辑该服务文件:
|
||||
|
||||
```
|
||||
# $EDITOR /etc/systemd/system/orientdb.service
|
||||
```
|
||||
|
||||
其中 `[service]` 内容块看起来应该是这样的:
|
||||
|
||||
```
|
||||
[Service]
|
||||
User=ORIENTDB_USER
|
||||
Group=ORIENTDB_GROUP
|
||||
ExecStart=$ORIENTDB_HOME/bin/server.sh
|
||||
```
|
||||
|
||||
将其改成如下样式:
|
||||
|
||||
```
|
||||
[Service]
|
||||
User=orientdb
|
||||
Group=orientdb
|
||||
ExecStart=/opt/orientdb/bin/server.sh
|
||||
```
|
||||
|
||||
保存并退出。
|
||||
|
||||
重新加载系统守护进程:
|
||||
|
||||
```
|
||||
# systemctl daemon-reload
|
||||
```
|
||||
|
||||
启动 OrientDB 并使其开机自启动:
|
||||
|
||||
```
|
||||
# systemctl start orientdb
|
||||
# systemctl enable orientdb
|
||||
```
|
||||
|
||||
确认 OrientDB 的状态:
|
||||
|
||||
```
|
||||
# systemctl status orientdb
|
||||
```
|
||||
|
||||
上述指令应该会输出:
|
||||
|
||||
```
|
||||
● orientdb.service - OrientDB Server
|
||||
Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled)
|
||||
Active: active (running) ...
|
||||
```
|
||||
|
||||
流程就是这样了!OrientDB 社区版成功安装并且正确运行在我们的服务器上了。
|
||||
|
||||
### 总结
|
||||
|
||||
在这个指导中,我们看到了一些关系型数据库管理系统(RDBMS)以及非关系型数据库管理系统(NoSQL DBMS)的简单对照。我们也安装 OrientDB 社区版的服务器端并完成了其基础的配置。
|
||||
|
||||
这是我们部署完全的 OrientDB 基础设施的第一步,也是我们用于管理大型系统数据的起步。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/
|
||||
|
||||
作者:[Giuseppe Molica][a]
|
||||
译者:[a92667237](https://github.com/a972667237)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.unixmen.com/author/tutan/
|
||||
[1]:https://www.unixmen.com/author/tutan/
|
||||
[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png
|
||||
[3]:https://orientdb.com/
|
||||
@@ -0,0 +1,68 @@
|
||||
Neo4j 图数据库基础
|
||||
============================================================
|
||||
|
||||
> 在这个三篇系列文章的第一篇文章中,我们将学习图数据库(graph database)的基础知识,它支持了这地球上最大的一些数据池。
|
||||
|
||||

|
||||
|
||||
对于海量的各种非结构化信息来说,图数据库已经成为帮助收集、管理和搜索大量数据的技术。在这三篇系列文章中,我们将使用开源图数据库软件 [Neo4j][9] 来研究图数据库。
|
||||
|
||||
在本文中,我将向你展示图数据库的基础知识,帮助你快速了解概念模型。在第二篇中,我将向你展示如何启动 Neo4j 数据库,并使用内置的浏览器工具填充一些数据。而且,在本系列的最后一篇文章中,我们将探讨一些在开发工作中使用的 Neo4j 编程库。
|
||||
|
||||
掌握图数据库的概念模型是有用的,所以我们从那里开始。图数据库中只存储两种数据:<ruby>节点<rt>node</rt></ruby>和<ruby>边<rt>edge</rt></ruby>。
|
||||
|
||||
* **节点是实体:**诸如人物、发票、电影、书籍或其他具体事物。这些有些等同于关系数据库中的记录或行。
|
||||
* **边名关系:**连接节点的概念、事件或事物。在关系数据库中,这些关系通常存储在具有链接字段的数据库行中。在图数据库中,它们本身就是有用的,是可以以其自己的权限搜索的对象。
|
||||
|
||||
节点和边都可以拥有可搜索的_属性_。例如,如果你的节点代表人,他们可能拥有名字、性别、出生日期、身高等属性。而边的属性可能描述了两个人之间的关系何时建立,见面的情况或关系的性质。
|
||||
|
||||
这是一个帮助你可视化的图表:
|
||||
|
||||

|
||||
|
||||
在这张图中,你知道 Jane Doe 有一个新的丈夫 John;一个女儿(来自她以前的夫妻关系)Mary Smith 和朋友 Robert 和 Rhonda Roe。Roes 有一个儿子 Ryan,他正在与 Mary Smith 约会。
|
||||
|
||||
看看它怎么工作?每个节点代表一个独立于其他节点的人。你需要找到关于_那个_人的一切都可以存储在节点的属性中。边描述了人们之间的关系,这与你在程序中需要的一样多。
|
||||
|
||||
关系是单向的,且不能是无向的,但这没有问题。由于数据库可以以相同的速度遍历两个方向,并且方向可以忽略,你只需要定义一次此关系。如果你的程序需要定向关系,则可以自由使用它们,但如果双向性是暗含的,则不需要。
|
||||
|
||||
另外需要注意的是,图数据库本质上是无 schema 的。这与关系数据库不同,关系数据库每行都有一组列表,并且添加新的字段会给开发和升级带来很多工作。
|
||||
|
||||
每个节点都可以拥有一个<ruby>标签<rt>label</rt></ruby>;对于大多数程序你需要“输入”这个标签,是对典型的关系数据库中的表名的模拟。标签可以让你区分不同的节点类型。如果你需要添加新的标签或属性,修改程序来用它就行!
|
||||
|
||||
使用图数据库,你可以直接开始使用新的属性和标签,节点将在创建或编辑时获取它们。不需要转换东西;只需在你的代码中使用它们即可。在这里的例子中,你可以看到,我们知道 Jane 和 Mary 最喜欢的颜色和 Mary 的出生日期,但是别人没有(这些属性)。这个系统不需要知道它;用户可以在正常使用程序的过程中访问节点时为其添加信息(属性)。
|
||||
|
||||
作为一名开发人员,这是一个有用的特性。你可以将新的标签或属性添加到由节点处理的表单中并开始使用它,而不必进行数据库 schema 的修改。对于没有该属性的节点,将不显示任何内容。你可以使用任何一种类型的数据库来为表单进行编码,但是你可以放下在关系型数据库中要进行的许多后端工作了。
|
||||
|
||||
让我们添加一些新的信息:
|
||||
|
||||

|
||||
|
||||
这是一个新的节点类型,它代表一个位置,以及一些相关关系。现在我们看到 John Doe 出生在加利福尼亚州的 Petaluma,而他的妻子 Jane 则出生在德克萨斯州的 Grand Prairie。 他们现在住在得克萨斯州的赛普拉斯,因为 Jane 在附近的休斯顿工作。Ryan Roe 缺乏城市关系对数据库来说没有什么大不了的事情,我们_不知道_那些信息而已。当用户输入更多数据时,数据库可以轻松获取新数据并添加新数据,并根据需要创建新的节点和关系。
|
||||
|
||||
了解节点和边应该足以让你开始使用图形数据库。如果你像我一样,已经在考虑如何在一个图中重组你的程序。在本系列的下一篇文章中,我将向你展示如何安装 Neo4j、插入数据,并进行一些基本的搜索。
|
||||
|
||||
(题图:由 Jen Wike Huger 修改,CC BY-SA)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j
|
||||
|
||||
作者:[Ruth Holloway][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/druthb
|
||||
[1]:https://opensource.com/tags/python?src=programming_resource_menu1
|
||||
[2]:https://opensource.com/tags/javascript?src=programming_resource_menu2
|
||||
[3]:https://opensource.com/tags/perl?src=programming_resource_menu3
|
||||
[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu4
|
||||
[5]:https://opensource.com/file/363056
|
||||
[6]:https://opensource.com/file/363061
|
||||
[7]:https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j?rate=QlLa3Y_1alHoy77MX2w69IZN5nYBJZrkZ0b2F_0wH_A
|
||||
[8]:https://opensource.com/user/36051/feed
|
||||
[9]:https://neo4j.com/
|
||||
[10]:https://opensource.com/users/druthb
|
||||
[11]:https://opensource.com/users/druthb
|
||||
@@ -0,0 +1,135 @@
|
||||
如何在 Linux 中恢复仍在活动进程中的已删除文件
|
||||
============================================================
|
||||
|
||||
> 使用终端恢复你 Linux 系统上仍在运行进程的已删除文件的快速指南。
|
||||
|
||||
许多情况下,删除的文件都可以恢复,比如在该文件有活动的进程在操作它,并且目前被单个或多个用户使用时。在 Linux 系统中,每个当前正在运行的进程都会获得 ID,其被称之为进程标识符 “PID”,并将它们存放在 `/proc` 目录中。这正是我们恢复仍在运行的进程中(具有PID)已删除的文件所需要的东西。这里就是介绍我们如何做到这一点的。
|
||||
|
||||
假设你打开了一个压缩文件,之后你删除了这个文件。为了演示目的,压缩文件称为 “opengapps.zip”,这将是之后我们将打开和删除的文件。
|
||||
|
||||
### 计算原始文件的 MD5 哈希
|
||||
|
||||
删除之前,我们将计算该文件的 MD5。这样我们可以将原来的 MD5 哈希值与恢复文件的 MD5 哈希进行比较。这个过程将保证我们恢复的压缩文件的完整性是一样的,它没有被破坏。
|
||||
|
||||
```
|
||||
md5sum opengapps.zip >> md5-opengapps.txt
|
||||
```
|
||||
|
||||
要显示文本文件的内容。
|
||||
|
||||
```
|
||||
cat md5-opengapps.txt
|
||||
|
||||
86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip
|
||||
```
|
||||
|
||||
检查压缩文件的 MD5 哈希值之后。我们将压缩文件保持打开(LCTT 译注:此处是使用 file-roller 这个图形界面的解压程序保持对该压缩文件的打开,其内置在 GNOME 环境中;在桌面环境中,使用桌面工具打开一个压缩包也能起到同样的作用。又及,本文举例不是很恰当,如果是删除了某个服务进程的已经打开的配置文件,那么这种恢复就很有意义),并将其删除。之后,我们将从文件的恢复过程开始,步骤如下:
|
||||
|
||||
```
|
||||
rm opengapps.zip
|
||||
```
|
||||
|
||||
### 删除文件的恢复过程
|
||||
|
||||
正如我们前面提到的,运行的进程在 `/proc` 目录中。我们可以使用以下命令搜索该目录中需要的进程:
|
||||
|
||||
由于我们已经知道文件名包括 .zip 扩展名,因此我们可以使用 .zip 扩展名进行搜索。它将限制输出结果并显示所需的进程。
|
||||
|
||||
```
|
||||
ps -axu | grep .zip
|
||||
|
||||
m 13119 0.8 1.0 121788 30788 ? Sl 06:17 0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip
|
||||
m 13164 0.0 0.0 5108 832 pts/20 S+ 06:18 0:00 grep --color=auto .zip
|
||||
```
|
||||
|
||||
然后我们将进入到包含 PID `13119` 的目录并打开 `fd` 子目录。
|
||||
|
||||
```
|
||||
cd /proc/13119/fd
|
||||
```
|
||||
|
||||
`fd` (文件描述符)目录包含多个文件,包括我们需要恢复的文件。该文件以硬链接的方式链接到原始文件。 `fd` 目录中的所有文件都以数字链接到“文件名”。因此,要确定这些文件中的哪一个链接到该原始文件,我们将用详细列表选项列出 /fd 目录。
|
||||
|
||||
```
|
||||
ls -l
|
||||
|
||||
total 0
|
||||
lr-x------ 1 m m 64 Jul 14 06:17 0 -> /dev/null
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 1 -> socket:[26161]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 10 -> anon_inode:[eventfd]
|
||||
lr-x------ 1 m m 64 Jul 14 06:17 11 -> anon_inode:inotify
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 12 -> socket:[5752671]
|
||||
lr-x------ 1 m m 64 Jul 14 06:17 13 -> /home/m/Downloads/Compressed/opengapps.zip (deleted)
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 2 -> socket:[26161]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 3 -> anon_inode:[eventfd]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 4 -> anon_inode:[eventfd]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 5 -> socket:[5751361]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 6 -> anon_inode:[eventfd]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 7 -> anon_inode:[eventfd]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 8 -> socket:[5751363]
|
||||
lrwx------ 1 m m 64 Jul 14 06:17 9 -> socket:[5751365]
|
||||
```
|
||||
|
||||
正如你在终端输出中看到的,原始文件 “opengapps.zip” 已被删除,但它仍然链接到一个文件名 `13`,其进程 PID `13119`。但是,我们仍然可以通过将链接的文件复制到安全的地方来恢复它。
|
||||
|
||||
```
|
||||
cp 13 /home/m/Downloads/Compressed
|
||||
```
|
||||
|
||||
文件复制后。我们将返回包含恢复文件的目录,并使用以下命令重命名它。
|
||||
|
||||
```
|
||||
mv 13 opengapps-recovered.zip
|
||||
```
|
||||
|
||||
### 计算恢复文件的 MD5 哈希
|
||||
|
||||
由于我们已经恢复了该文件。让我们检查该文件的完整性,这只是为了确保文件没有损坏,并且和原来一样。早先我们保存了原始文件的 MD5 哈希值。
|
||||
|
||||
```
|
||||
md5sum opengapps-recovered.zip >> md5-opengapps.txt
|
||||
```
|
||||
|
||||
该命令将检查文件的 MD5 哈希值,并在文件中追加新恢复文件的 MD5 哈希值,以轻松比较两个 MD5 哈希值。
|
||||
|
||||
可以显示文本文件的内容来比较原始文件和恢复文件的 MD5 哈希值。
|
||||
|
||||
```
|
||||
cat md5-opengapps.txt
|
||||
|
||||
86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip
|
||||
86489b68b40d144f0e00a0ea8407f7c0 opengapps-recovered.zip
|
||||
```
|
||||
|
||||
恢复文件的 MD5 哈希是一样的。所以,我们成功地恢复了我们以前删除的文件,并且恢复后文件完整性一致,并且工作正常。
|
||||
|
||||
[][5]
|
||||
|
||||
**注意:** 在某些情况下,某些文件无法通过 `ps -axu` 命令看到。 所以,尝试检查运行的程序,并从中恢复文件。
|
||||
|
||||
假设我们有一个使用 Totem 媒体播放器播放中的以 .avi 为扩展名的视频。你需要做的就是检查 Totem 的 PID,并按照本示例中提到的相同说明进行操作。
|
||||
|
||||
要查找正在运行的程序的 PID,请使用以下命令,后面跟程序的名称。
|
||||
|
||||
```
|
||||
pidof 程序名
|
||||
```
|
||||
|
||||
通过分享支持我们。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/
|
||||
|
||||
作者:[mhnassif][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.linuxnov.com/author/mhnassif/
|
||||
[1]:http://www.linuxnov.com/author/mhnassif/
|
||||
[2]:http://www.linuxnov.com/category/how-to/
|
||||
[3]:http://www.linuxnov.com/category/shell-cli/
|
||||
[4]:http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/#comments
|
||||
[5]:http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png
|
||||
@@ -0,0 +1,60 @@
|
||||
LinkArchiver:自动提交链接给互联网档案(Internet Archive)
|
||||
============================================================
|
||||
|
||||
> 在 Twitter 上分享的链接可以永久保存,用户不用担心。
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
互联网是永远的,当发生下面的情况的就不是了。 “链接腐烂” - 当页面移动或者站点脱机,随着时间的流逝,到网站的有效链接就会断开 - 对于尝试在线做研究的人来说,这是一个真正的问题。[互联网档案馆(Internet Archive)][4]通过在它的“时光机(Wayback Machine)”中提供提交的内容来帮助解决这个问题。
|
||||
|
||||
当然,困难的是让人们记得提交档案链接。
|
||||
|
||||
这就是 Parker Higgins 的新 Twitter 机器人所切入的地方。[@LinkArchiver][5] 会自动提交关注了[互联网档案馆(Internet Archive)][4]的帐户所提交的链接。如果一个 Twitter 用户关注了 [@LinkArchiver][6],它会回关,即使用户取消关注机器人,它也会继续添加链接。这意味着在 Twitter 上共享的链接可以永久保存,用户不用担心。
|
||||
|
||||
无需留意这个方面对 Higgins 非常有吸引力。他对 Opensource.com 说:“我对整个装置的被动程度非常在意。如果你依靠人们选择什么是_重要的_来存档,你会错过很多最重要的东西,只要抓取每个发表链接的副本,这个机器人应该有助于确保我们不会错过上下文。”
|
||||
|
||||
在最初开发机器人之后,Higgins 联系了[互联网档案馆(Internet Archive)][4]。他对自动化造成问题的担忧很快被消除。尽管他在请求时给 API 请求用了一个自定义的用户代理字符串,但是他说:“他们处理的流量实际上是个舍入错误。”扩展性的问题在 Twitter 方面:其服务限制了帐户的关注者数量和新关注者的比例。这限制了 LinkArchiver 的单个实例的能力。
|
||||
|
||||
幸运的是,LinkArchiver 以 AGPLv3 授权在 [GitHub][7] 上发布。
|
||||
|
||||
有了一台小的服务器和一个 Twitter 账号, 任何人都可以运行这个机器人。Higgins 设想人们运行一个关注特定的兴趣或社交圈子的 LinkArchiver 的实例。“发生在我身上的一件事是,你可以关闭回关行为,并关注特定的组或者兴趣。例如,机器人可以关注一群朋友或同学,或主要媒体,或每一个美国参议员和代表,并存档他们发表的 tweet。”
|
||||
|
||||
这不是 Higgins 第一次写 Twitter 机器人:[@securethenews][8]、[@pomological][9] 以及受欢迎的 [@choochoobot][10] 是他之前的作品。这些机器人都是只写的。 LinkArchiver 是他开发的第一个互动机器人,这需要学习几种新技能。这是 Higgins 参与 [Recurse Center][11] 的一部分,这是为程序员进行的为期 12 周的活动。
|
||||
|
||||
Higgins 鼓励大家的拉取请求以及其他的 LinkArchiver 机器人实例。
|
||||
|
||||
(题图:Beatrice Murch 拍摄的 Inernet Archive 总部; CC BY ([on Flickr][3]))
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Ben Cotton - Ben Cotton 是一个受训过的气象学家和一名高性能计算机工程师。Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco)
|
||||
|
||||
|
||||
---
|
||||
|
||||
via: https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive
|
||||
|
||||
作者:[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/7/linkarchiver-automatically-submits-links-internet-archive?rate=Z9DDX962B5JWk6LID_iia3S7H9s7ZMF8cGTVlNLvCs8
|
||||
[2]:https://opensource.com/user/30131/feed
|
||||
[3]:https://www.flickr.com/photos/blmurch/5079018246/
|
||||
[4]:https://archive.org/
|
||||
[5]:https://twitter.com/linkarchiver
|
||||
[6]:https://twitter.com/linkarchiver
|
||||
[7]:https://github.com/thisisparker/linkarchiver
|
||||
[8]:https://twitter.com/securethenews
|
||||
[9]:https://twitter.com/pomological
|
||||
[10]:https://twitter.com/choochoobot
|
||||
[11]:https://www.recurse.com/
|
||||
[12]:https://opensource.com/users/bcotton
|
||||
[13]:https://opensource.com/users/bcotton
|
||||
@@ -0,0 +1,108 @@
|
||||
拯救者 Linux:我是如何给我的团队引入 Linux 的
|
||||
============================================================
|
||||
|
||||
> 在项目早期就遇到公开的失败后,一个著名大学的 IT 团队决定将他们的 web 注册系统部署到 Linux上,此举几乎将服务器的最大用户访问量提高了 3 倍
|
||||
|
||||

|
||||
|
||||
1998年,我在明尼苏达大学为一个新的 web 团队管理他们的服务器管理组。明尼苏达大学是一个非常大的大学,个个院校拥有接近 6000 名在校大学生。当时学校是用一个上了年纪的大型机系统来做学生的档案管理系统,这种系统已经过时了,所以需要做出改变。
|
||||
|
||||
这个系统不是 Y2K 类型的(LCTT 译注:保存年份时只用两位数,导致记录 2000 年时计算机会记录为 1900 年,详见[What Does Y2K Compliant Mean?](https://stackoverflow.com/questions/18200744/what-does-y2k-compliant-mean)),所以我们准备建立一个由仁科软件公司来交付的新的学生档案管理系统。这个新系统对明尼苏达大学来说有很多作用,不仅能够管理学生的档案,还能提供其他的一些功能。然而它却缺少了一项关键特性:你不能在你的浏览器上通过 web 来给你的班级进行注册。
|
||||
|
||||
按照今天的标准来看,这是一个重大的疏忽,但是在上世纪九十年代,互联网还是一个新生概念。亚马逊才建立不久,ebay 刚创业一年,google 呱呱坠地,Wikipedia 还没有影儿。所以 1998 年仁科公司没有支持 web 在线注册课程这个功能也就不足为奇了。但是明尼苏达大学作为 Gopher 网络的发源地,并且给之前的大型机系统开发了一套 web 功能接口,我们觉得 web 在线注册功能对于这个新的学生档案管理系统是至关重要的。
|
||||
|
||||
我们在这个 web 团队的任务就是去实现此管理系统的 web 在线注册功能。
|
||||
|
||||
幸运的是,我们并不是孤军奋战。我们联系了 IBM ,在第二年一起开始来搭建这个新的 web 在线注册系统。IBM 负责提供硬件和软件环境来运行这个 web 系统:3 个运行最新的 AIX 系统(类 UNIX 操作系统)、IBM Java 和 IBM WebSphere 平台的 SP 电脑节点,并用一个 IBM 的负载均衡器来实现 3 个节点的负载分流。
|
||||
|
||||

|
||||
|
||||
在经过一年多的开发和测试后,我们的系统终于上线了!但不幸的是失败却接踵而至。
|
||||
|
||||
### 负载过大
|
||||
|
||||
在开发过程中,我们无法准确地模拟测试真实场景下许多学生同时登录的场景。原因不是没有测试环境,明尼苏达大学有定制的 web 负载测试软件包,而且 IBM 有自己的工具做补充,但是这个 web 系统在当时对我们来说实在是太陌生了,我们没有意识到这些测试工具是不能满足要求的。
|
||||
|
||||
通过数月的测试,我们将此 web 系统的预期负载量调整到 240 个并发用户。但不幸的是,我们实际的使用量却是预期的两倍左右,在第一天系统上线时,超过 400 名学生马上同时登录进系统,由于负载远远超出预期值,3 台 web 服务器直接宕机了。由于持续的高负载,服务器一直崩溃,只能不断地重启。一台刚重启完,另一台又宕机重启了,这种场景居然持续了一个月。
|
||||
|
||||
由于不能有效地通过 web 注册,学生只能通过原来的方法来注册:来到登记员的办公室,拿着笔注册,然后再出门。当地报纸也幸灾乐祸地嘲讽道:"电脑软件的失败强迫学生只能面对面地注册!"
|
||||
|
||||

|
||||
|
||||
面对失败这个事实,我们尽自己全力在下一个开发周期中来提高软件性能,在之后 6 个月的时间里,我们疯狂地想去增强这套系统的负载能力。尽管增加了更多的代码,调整了多次配置,还是不能支持更多的用户。尽力了,然而面对的还是失败。
|
||||
|
||||
就如所料的,在下一个迭代周期后,迎接我们的还是失败。服务器由于负载问题一次又一次地宕机。这一次新闻标题已经变成了:“web 注册系统就是垃圾”。
|
||||
|
||||
在开始下一个为期 6 个月的迭代前,我们已经绝望了。没有人知道服务器不停宕机的原因,我们已经预期这个问题现在是无解的。我们是要采取一些措施来搞定这个问题,但是怎么做呢?以下是我们讨论得出的方法:
|
||||
|
||||
### 是否需要切换新的平台?
|
||||
|
||||
IBM 当时引入了 Linux,给它的 Java 和 WebSphere 平台做了二次开发。所有产品都获得了红帽公司的 RHEL 认证,并且有几个产品已经在我们的桌面系统上运行了。我们意识到了现在在 Linux 上已经有了完整的生态系统来运行我们的 web 管理系统,但是它能表现的比 AIX 更好吗?
|
||||
|
||||
在搭建好一个测试服务器并进行基本的负载测试后,我们惊奇的发现一台 Linux 服务器能够轻松地支持之前 3 台 AIX 服务器所不能支持的负载量,在相同的 web 代码、IBM Java 和 WebSphere 平台下,单台 Linux 服务器能够支持超过 200 个用户。
|
||||
|
||||
我们将这个消息告诉了登记员和 CIO,他们同意将 web 注册系统切换到 Linux 平台上。虽然这是我们第一次在明尼苏达大学跑 Linux,但是失败已成习惯,反而无所畏惧了。AIX 只会失败,Linux 却是我们唯一的希望。
|
||||
|
||||
我们马上基于 Linux 来进行开发。另一个组的同事也提供了几台 Intel 服务器来给我们使用,我们给服务器装上红帽系统和相关的 IBM 组件,然后在新系统上进行了持续性的负载测试,令人欣喜的是,Linux 服务器没有出现任何问题。
|
||||
|
||||
经过两个月高强度的开发测试,我们的新系统终于上线了,而且是巨大的成功!在巨大的负载下,web 注册系统在 Linux 的表现都堪称完美。同时在线峰值甚至超过了 600 名用户。Linux 拯救了明尼苏达大学的 web 注册系统~
|
||||
|
||||
### 成功的经验
|
||||
|
||||
当我回首这个项目时,我发现你可以用以下几个点来向你的团队介绍 Linux:
|
||||
|
||||
1、 **解决问题, 不要自欺欺人**
|
||||
|
||||
当我们提议在企业中使用 Linux 时,并不是因为我们认为 Linux 很酷才使用它。当然,我们是 Linux 的爱好者并且已经在自己的环境中运行过它,但是我们在公司是为了解决问题的。能用 Linux 是因为我们的登记员和出资人同意 Linux 是解决问题的一个方法,而不仅仅是因为 Linux很酷我们想用它。
|
||||
|
||||
2、 **尽可能小的去做改变**
|
||||
|
||||
我们的成功是建立在 IBM 已经基于 Linux 做出了它的 Java 和 WebSphere 产品的基础上的。这能让我们在将 web 系统从 AIX 切换到 Linux 上不用做过多的修改适配。两者比起来只有硬件和操作系统改变了,其他系统相关的组件都保持了一致,这些都是保证平台切换成功的基石。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
3、 **诚实对待风险和回报**
|
||||
|
||||
我们的问题很明显:web 注册系统在前两个迭代周期中都失败了,而且很可能再次失败。当我们将自己的想法(AIX 切换到 Linux)告诉出资方后,我们对其中的风险和回报是心知肚明的。如果我们什么都不做,就只有失败,如果我们尝试切换到 Linux 平台,我们可能会成功,而且从最初的测试结果分析,成功的概率是高于失败的。
|
||||
|
||||
而且就算在 Linux 平台下项目还是失败了,我们也可以迅速地切换回 AIX 服务器。有了这些细致的分析和措施,终于使登记员能够安心让我们试试 Linux。
|
||||
|
||||
4、 **言简意赅地交流**
|
||||
|
||||
在项目平台切换的过程中,我们做了一个整体计划。我们在一张白纸上明确地写下了我们计划做什么,为什么要这么做。这种方式的成功关键就在于计划的简短性。领导们不喜欢像看小说一样来看技术性的主意,他们不想纠缠在技术细节中。所以我们有意地在执行层面上进行计划安排,在框架层面上进行描述。
|
||||
|
||||
当我们在进行平台切换时,我们会定期的告诉出资人当前进展。当新系统成功完成后,我们每天都会提交更新,报告已经有多少学生成功通过此系统完成注册和遇到的问题。
|
||||
|
||||
尽管这个项目已经过去了接近 20 年,但是其中的经验教训在今天仍然适用。尽管 Linux 在其中起了举足轻重的作用,但是最重要的还是我们成功地将所有人的目标引导到解决共同的问题上。我认为这种经验也可以运用到很多你所面对的事情当中。
|
||||
|
||||
(题图 : Opensource.com)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Jim Hall -我是 FreeDOS 项目的发起者和协调人,我也在 GNOME 理事会中担任董事。工作上我是明尼苏达州拉姆西县的首席信息官,空闲时间里我为开源软件的可用性做出相关的贡献,并通过 [Outreachy](https://en.wikipedia.org/wiki/Outreachy)(为女性提供帮助的一项GNOME外展服务)来指导可用性测试。
|
||||
|
||||
|
||||
---
|
||||
via: https://opensource.com/article/17/7/how-introduced-organization-linux
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
译者:[吴霄/toyijiu](https://github.com/toyijiu)
|
||||
校对:[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/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent
|
||||
[6]:https://opensource.com/article/17/7/how-introduced-organization-linux?rate=G1WfZzJPTN4w4fVviJ7iFru6ZBDBBTKkT8QRxSh727g
|
||||
[7]:https://opensource.com/user/126046/feed
|
||||
[8]:https://opensource.com/users/jim-hall
|
||||
[9]:https://opensource.com/users/jim-hall
|
||||
[10]:https://opensource.com/article/17/7/how-introduced-organization-linux#comments
|
||||
@@ -0,0 +1,69 @@
|
||||
Nylas Mail: 一个 Linux 的免费邮件客户端
|
||||
========
|
||||
|
||||
[][1]
|
||||
|
||||
|
||||
有一个经常被提及的问题是 Ubuntu 是否还应该提供默认的电子邮件客户端。就个人而言,我已经很长时间没有使用 [Thunderbird][9] 了。我相信这不是一个第一次被问到的问题,但我相信这是一个把它解决掉的很好机会。这是因为日常用户倾向于使用基于网络的客户端,例如 Gmail 或 Outlook 来满足其邮件需求。而对于 Linux 上的经验丰富的用户而言,还有很多可供选择的选项。[Geary][10]、Empathy、Evolution 和 Thunderbird 本身已经为很多用户提供了很好的服务,但是我发现了值得一试的东西:它被称为 Nylas Mail。
|
||||
|
||||
它以前被称为 [Nylas N1][11],Nylas Mail 于今年初在 1 月份推出,同时还发布了一个免费版本;**Nylas Mail** Basic 以前是一个付费版本。此外,在 1 月份,客户端仅适用于 Mac,但现在可用于 Linux 和 Windows 用户。
|
||||
|
||||
(在我写此文时,它还处于活跃开发状态,但是现在已经停止开发了。)
|
||||
|
||||
### 为什么使用 Nylas?
|
||||
|
||||
很多人因为种种原因选择了 Nylas Mail。让我们来看看一些常见的原因。
|
||||
|
||||
**简单** - Nylas Mail 客户端管理优雅简单。用 electron 构建,应用非常漂亮,易于使用。其设计还确保了在 Nylas 中设置电子邮件非常简单直接。
|
||||
|
||||
[][2]
|
||||
|
||||
**兼容性** - Nylas Mail 与所有电子邮件提供商兼容。它与 Gmail、Yahoo、Exchange 和 IMAP 帐户兼容,因此你可以在任何地方收到邮件。
|
||||
|
||||
[][3]
|
||||
|
||||
**功能强大** - Nylas 拥有大量功能。它有一个全屏模式、离线支持、多布局格式、多帐户、统一的收件箱、提醒、打盹、签名和稍后发送功能。其中一些功能随 Nylas Mail Basic 一起提供。
|
||||
|
||||
[][4]
|
||||
|
||||
**混合后端** - 以前,Nylas 将邮件的一个副本同步到使用 Nylas 云的服务器中,这对许多人来说就像 mehn 一样。幸运的是,在最新版本中,Nylas 采用了一个混合后端,可直接连接到 Gmail 或 Outlook 等电子邮件提供商。云同步虽然仍然可用,但仅在使用高级订阅工具(如<ruby>打盹<rt>snoozing</rt></ruby>和跟踪)时使用。缺点是它是一而二的。如果想要一些专业功能,你需要云同步;你不想用云同步,那你错过了这些功能。
|
||||
|
||||
[][5]
|
||||
|
||||
**开源和免费版** - Nylas 作为开源项目。这意味着你可以自己编写代码并自行构建。你甚至可以设置自己的服务器以回避问题。
|
||||
|
||||
[][6]
|
||||
|
||||
**跨平台** - Nylas 是在 Linux、Windows 和 Mac OS X 上提供的跨平台应用程序。因此,无论你喜欢哪种桌面操作系统,你都可以放心,因为 Nylas 都已经覆盖了。而且用法是相同的。
|
||||
|
||||
### 还要做些什么?
|
||||
|
||||
到目前为止,Nylas 邮件客户端很好,但有一些抱怨。首先是在 2016 年推出的付费选项。引入免费版本有点像是这个解决这个问题的方案,但事实上,一些功能只能以每月 $9 的价格使用让包括我在内的大部分人不快。此外,没有多少人喜欢将邮件的副本保存在某台服务器上。当然,你可以设置自己的服务器,但有些麻烦。最后,对于在后台运行的应用程序来说,它需要相当多的内存。我希望这不是因为它主要是用 electron 写的,我相信随着它的更新和改进,它会变得更好。
|
||||
|
||||
### 总结
|
||||
|
||||
**Nylas Mail** 在特性和功能方面对我来说非常棒,我相信你一定要用一下。作为一个电子邮件客户端,它是非常有效的,我真的很喜欢 Nylas Mail,并且一定会一直使用它。也许你应该也会。向开发人员的所做的工作致谢。你有其他的程序想让我们看下么?在下面的评论中指出,并分享你的想法和意见。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux
|
||||
|
||||
作者:[linuxandubuntu][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux
|
||||
[1]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux
|
||||
[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-an-awesome-email-client-for-linux_orig.jpg
|
||||
[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-compatible-with-gmail-facebook-imap_orig.jpg
|
||||
[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-client-powerful-features_orig.jpg
|
||||
[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-hybrid-backend_orig.jpg
|
||||
[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-open-source-and-free-email-client_orig.jpg
|
||||
[7]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux
|
||||
[8]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux#comments
|
||||
[9]:http://www.linuxandubuntu.com/home/thunderbird-release-with-several-bug-fixes
|
||||
[10]:http://www.linuxandubuntu.com/home/geany-a-lightweight-ide-or-code-editor-for-programmers
|
||||
[11]:http://www.linuxandubuntu.com/home/nylas-n1-a-premium-email-client-for-linux
|
||||
[12]:https://www.nylas.com/nylas-mail/
|
||||
@@ -0,0 +1,50 @@
|
||||
使用开源代码构建机器人时需要考虑的事项
|
||||
=============
|
||||
|
||||

|
||||
|
||||
或许你正在考虑(或正在进行)将机器人使用开源软件推向市场。这个机器人是基于 linux 构建的。也许你正在使用[机器人操作系统][1](ROS)或[任务导向操作套件][2](MOOS),或者是另外一个可以帮助你简化开发过程的开源中间件。当开发接近实用化,对回报的期望开始给你带来一些压力。你可能会被问到“我们的产品什么时候可以开始销售?”,这时你将面临重要的抉择。
|
||||
|
||||
你可以做下面两件事之一:
|
||||
|
||||
1. 对现有的产品开始出货
|
||||
|
||||
2. 回过头去,把产品化当做一个全新的问题来解决,并处理新的问题
|
||||
|
||||
不需要看很远,就可以找到采用方式(1)的例子。事实上,在物联网设备市场上,到处都是这样的设备。由于急于将设备推向市场,这些可以在设备中找到硬编码证书、开发密钥、各种安全漏洞和没有更新方式的产品并不少见。
|
||||
|
||||
想想 Mirai 僵尸网络,通过该僵尸网络发起的流量超过 1Tbps 的分布式拒绝服务攻击(DDos),导致一些互联网上最大的网站停止服务。这个僵尸网络主要由物联网设备组成。这种攻破设备的防御机制进而控制设备所开发的僵尸程序,是采用了超级酷的黑魔法在一个没有窗户的实验室(或地下基地)开发的吗?不是,默认(通常是硬编码)证书而已。这些设备的制造商是否快速反应并发布所有这些设备的更新,以确保设备的安全?不,很多制造商根本没有更新方法。[他们召回设备而不是发布更新][3]。
|
||||
|
||||
不要急于将产品推向市场,而是退后一步。只要多思考几点,就可以使你自己和你所在公司避免痛苦。
|
||||
|
||||
例如,**你的软件如何更新?**你*必须*能回答这个问题。你的软件不是完美的。只要几个星期你就会发现,当你在加利福尼亚使用自主的高机动性多用途轮式车辆(HMMWV)时,它把小灌木识别为一棵橡树。或者你不小心在软件中包含了你的 SSH 密钥。
|
||||
|
||||
**基础操作系统如何更新?**也许这仍然是你的产品的一部分,也是你回答上一个问题的答案。但也许你使用的操作系统来自于另外一个供应商。你如何从供应商那里得到更新并提供给客户?这就是安全漏洞真正让你头痛的地方:从来不更新的内核,或者严重过时的 openssl。
|
||||
|
||||
当你解决了更新问题,**在更新过程出现问题时,机器人怎么恢复?**我的示例是对前面问题的一个常见解决方案:自动安全更新。对于服务器和台式机以及显然是计算机的东西来说,这是一个很好的做法,因为大多数人意识到有一个可接受的方法来关闭它,而*不是*按住电源按钮 5 秒钟。机器人系统(以及大多数物联网系统)有一个问题,有时它们根本不被认为是计算机。如果您的机器人表现奇怪,有可能会被强制关闭。如果你的机器人行为奇怪是因为它正在快速安装一个内核更新,那么,现在你就有一个安装了半个内核的机器人镇纸了。你需要能够处理这种情况。
|
||||
|
||||
最后,**你的工厂流程是什么?**你如何安装 Linux,ROS(或者你使用的中间件),以及你要安装在设备上的你自己的东西?小的工厂可能会手工操作,但这种方法不成规模,也容易出错。其他厂商可能会制作一个定制化的初始发行版 ISO,但这是个不小的任务,在更新软件时也不容易维护。还有一些厂商会使用 Chef 或者有陡峭学习曲线的自动化工具,不久你就会意识到,你把大量的工程精力投入到了本来应该很简单的工作中。
|
||||
|
||||
所有这些问题都很重要。针对这些问题,如果你发现自己没有任何明确的答案,你应该加入我们的[网络研讨会][4],在研讨会上我们讨论如何使用开放源代码构建一个商业化机器人。我们会帮助你思考这些问题,并可以回答你更多问题。
|
||||
|
||||
----------
|
||||
|
||||
作者简介:
|
||||
|
||||
Kyle 是 Snapcraft 团队的一员,也是 Canonical 公司的常驻机器人专家,他专注于 snaps 和 snap 开发实践,以及 snaps 和 Ubuntu Core 的机器人技术实现。
|
||||
|
||||
----------
|
||||
|
||||
via: [https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/](https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/)
|
||||
|
||||
作者:[Kyle Fazzari][a]
|
||||
译者:[SunWave](https://github.com/SunWave)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 LCTT 原创编译,Linux中国 荣誉推出
|
||||
|
||||
[a]:https://insights.ubuntu.com/author/kyrofa/
|
||||
[1]:http://www.ros.org/
|
||||
[2]:http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/HomePage
|
||||
[3]:https://krebsonsecurity.com/2016/10/iot-device-maker-vows-product-recall-legal-action-against-western-accusers/
|
||||
[4]:https://www.brighttalk.com/webcast/6793/268763?utm_source=insights
|
||||
@@ -0,0 +1,84 @@
|
||||
我选择 dwm 作为窗口管理器的 4 大理由
|
||||
============================================================
|
||||
|
||||
> <ruby>窗口管理器<rt>window manager</rt></ruby>负责管理打开窗口的大小、布置以及其它相关的方面。
|
||||
|
||||
|
||||

|
||||
|
||||
(图片来自:Internet Archive [Book][4] [Images][5] 由 Opensource.com 修改 CC BY-SA 4.0)
|
||||
|
||||
我喜欢极简。如果可能,我会尽量在一个终端下运行所有需要的程序。这避免了一些浮夸的特效占用我的资源或者分散我的注意力。而且,无论怎么调整窗口大小和位置却依旧无法使它们完美地对齐,这也让我感到厌烦。
|
||||
|
||||
出于对极简化的追求,我喜欢上了 [Xfce][6] 并且把它作为我主要的 Linux [桌面环境][7]好几年了。直到后来我看了 [Bryan Lunduke][8] 关于他所使用的名为 [Awesome][10] 的[窗口管理器][9]的视频。Awesome 为用户整齐地布置好他们的窗口,看起来就是我想要的效果。但在我尝试之后却发现我难以把它配置成我喜欢的样子。于是我继续搜寻,发现了 [xmonad][11],然而我遇到了同样的问题。[xmonad][11] 可以良好运作但为了把它配置成我理想中的样子我却不得不先通过 Haskell 语言这关。(LCTT 译注: AwesomeWM 使用 lua 语言作为配置语言,而 xmonad 使用 Haskell 语言)
|
||||
|
||||
几年后,我无意间发现了 [suckless.org][12] 和他们的窗口管理器 [dwm][13]。
|
||||
|
||||
简而言之,一个窗口管理器,例如 KDE,Gnome 或者 Xfce,包括了许多部件,其中除了窗口管理器还有其它应用程序。窗口管理器负责管理打开窗口的大小、布置(以及其它窗口相关的方面)。不同的桌面环境使用不同的窗口管理器,KDE 使用 KWin,Gnome 2 使用 Metacity, Gnome 3 使用 Mutter, 以及 Xfce 使用 Xfwm。当然,你可以方便地替换这些桌面环境的默认窗口管理器。我已经把我的窗口管理器替换成 dwm,下面我说说我喜欢 dwm 的理因。
|
||||
|
||||
### 动态窗口管理
|
||||
|
||||
与 Awesome 及 xmonad 一样,dwm 的杀手锏是它能利用屏幕的所有空间为你自动排布好窗口。当然,在现在的大多数桌面环境中,你也可以设置相应的快捷键把你的窗口放置在屏幕的上下左右或者是全屏,但是有了 dwm 我们就不需要考虑这么多了。
|
||||
|
||||
dwm 把屏幕分为主区域和栈区域。它包含三种布局:平铺,单片镜(monocle)和浮动。平铺模式是我最常使用的,它把一个主要的窗口放置在主区域来获取最大关注力,而将其余窗口平铺在栈区域中。在单片镜模式中,所有窗口都会被最大化,你可以在它们之间相互切换。浮动模式允许你自由调整窗口大小(就像在大多数窗口管理器下那样),这在你使用像 Gimp 这类需要自定义窗口大小的应用时更为方便。
|
||||
|
||||
一般情况下,在你的桌面环境下你可以使用不同的工作空间(workspace)来分类你的窗口,把相近的应用程序放置在计划好的工作空间中。在工作时,我会使用一个工作空间来进行工作,同时使用另一个工作空间来浏览网页。dwm 有一个相似的功能叫标签。你可以使用标签给窗口分组,当你选中一个标签时,就能显示具有相应标签的窗口。
|
||||
|
||||
### 高效
|
||||
|
||||
dwm 能让你的计算机尽量地节省电量。Xfce 和其它轻量桌面环境在较旧或者较低性能的机器上很受欢迎,但是相比于 Xfce,dwm 在登录后只使用了它们 1/3 的资源(在我的例子中)。当我在使用一台 1 GB 内存的 Eee PC (LCTT 译注:华硕生产的一款上网本,已停产)时,占用 660 MB 和 230MB 的差别就很大了。这让我有足够的内存空间运行我的编辑器和浏览器。
|
||||
|
||||
### 极简
|
||||
|
||||
通常,我让我的应用程序彼此相邻:作为主窗口的终端(通常运行着 Vim)、用来查阅邮件的浏览器,和另外一个用来查阅资料或者打开 [Trello][14] 的浏览器窗口。对于临时的网页浏览,我会在另一个工作空间或者说是另一个 _标签_ 中开启一个 Chromium 窗口。
|
||||
|
||||

|
||||
|
||||
*来自作者的屏幕截图。*
|
||||
|
||||
在标准的桌面环境下,通常会有一或两个面板占据着屏幕上下或者两侧的空间。我尝试过使用自动隐藏功能,但当光标太靠近边缘导致面板弹出造成的不便实在让我很厌烦。你也可以把它们设置得更小,但我还是更喜欢 dwm 的极简状态栏。
|
||||
|
||||
### 速度
|
||||
|
||||
评判速度时,我比较看重 dwm 在登录后的加载速度和启动程序的速度。如果使用更快、更新的计算机,你可能不会在意这些细节,但是对我来说,不同的桌面环境和窗口管理器会有明显的差距。我实在不想连这种简单的操作也要等待,它们应该一下子就完成。另外,使用键盘快捷键来启动程序比起用鼠标或者触控板要快一些,而且我不想让双手离开键盘。
|
||||
|
||||
### 小结
|
||||
|
||||
即便如此,我也不会向新手用户推荐 dwm。研究如何配置它需要耗费一些时间(除非你对你的发行版提供的默认配置感到满意)。我发现要让一些你想要的补丁正常工作可能会有点棘手,而且相应的社区也比较小(其 IRC 频道明确表示不提供补丁的手把手帮助)。所以,为了得到你想要的效果,你得有些付出才行。不过,这也是值得的。
|
||||
|
||||
而且你看,它就像 Awesome 一样 awesome。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Jimmy Sjölund - 他是 Telia Company 的高级 IT 服务经理,关注团队开发、探索敏捷工作流和精益工作流的创新导师,以及可视化方向爱好者。他同时也是一名开源布道者,先前从事于 Ubuntu Studio 和 Plume Creator。
|
||||
|
||||
-----------------
|
||||
|
||||
via: https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager
|
||||
|
||||
作者:[Jimmy Sjölund][a]
|
||||
译者:[haoqixu](https://github.com/haoqixu)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/jimmysjolund
|
||||
[1]:https://opensource.com/file/363336
|
||||
[2]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager?rate=T8qhopZLfd1eum_NMLOSGckUh2nIjfeRpkERGjGhu7w
|
||||
[3]:https://opensource.com/user/56551/feed
|
||||
[4]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt
|
||||
[5]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP
|
||||
[6]:https://xfce.org/
|
||||
[7]:https://en.wikipedia.org/wiki/Desktop_environment
|
||||
[8]:http://lunduke.com/
|
||||
[9]:https://en.wikipedia.org/wiki/Window_manager
|
||||
[10]:https://awesomewm.org/
|
||||
[11]:http://xmonad.org/
|
||||
[12]:http://suckless.org/
|
||||
[13]:http://dwm.suckless.org/
|
||||
[14]:https://opensource.com/node/22546
|
||||
[15]:https://opensource.com/users/jimmysjolund
|
||||
[16]:https://opensource.com/users/jimmysjolund
|
||||
[17]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager#comments
|
||||
@@ -0,0 +1,55 @@
|
||||
漏洞修复八个月后,仍有超过七万台 memcached 服务器面临危险
|
||||
============================================================
|
||||
|
||||

|
||||
|
||||
在开源缓存软件 memcached 修复了三个关键漏洞的八个月之后,仍有超过 70000 台未打补丁的缓存服务器直接暴露在互联网上。安全研究员警告说,黑客可能会在服务器上执行恶意代码或从其缓存中窃取潜在的敏感数据。
|
||||
|
||||
[memcached][1] 是一个实现了高性能缓存服务的软件包,用于在内存中存储从数据库和 API 调用中获取的数据块。这有助于提高动态 Web 应用程序的响应速度,使其更加适合大型网站和大数据项目。
|
||||
|
||||
虽然 memcached 不是数据库的替代品,但它存储在内存中的数据包括了来自数据库查询的用户会话和其他敏感信息。因此,该服务器在设计上并不能直接暴露在互联网等不受信任的环境中,其最新的版本已经支持了基本身份验证。
|
||||
|
||||
去年 10 月份,memcached 的开发者修复了由 [思科 Talos 部门][5] 安全研究员发现并报告的三个远程代码执行漏洞([CVE-2016-8704][2]、[CVE-2016-8705][3] 和 [CVE-2016-8706][4])。所有这些漏洞都影响到了 memcached 用于存储和检索数据的二进制协议,其中一个漏洞出现在 [Simple Authentication and Security Layer ][6](SASL)的实现中。
|
||||
|
||||
在去年 12 月到今年 1 月期间,成队的攻击者从数万个公开的数据库中擦除数据,这包括 MongoDB、CouchDB、Hadoop 和 Elasticsearch 集群。在很多情况下,攻击者勒索想要恢复数据的服务器管理员,然而没有任何证据表明他们的确对所删除的数据进行了复制。
|
||||
|
||||
Talos 的研究人员认为, memcached 服务器可能是下一个被攻击的目标,特别是在几个月前发现了漏洞之后。所以在二月份他们决定进行一系列的互联网扫描来确定潜在的攻击面。
|
||||
|
||||
扫描结果显示,大约有 108000 个 memcached 服务器直接暴露在互联网上,其中只有 24000 个服务器需要身份验证。如此多的服务器在没有身份验证的情况下可以公开访问已经足够糟糕,但是当他们对所提交的三个漏洞进行测试时,他们发现只有 200 台需要身份验证的服务器部署了 10 月的补丁,其它的所有服务器都可能通过 SASL 漏洞进行攻击。
|
||||
|
||||
总的来说,暴露于互联网上的 memcached 服务器有大约 80%,即 85000 个都没有对 10 月份的三个关键漏洞进行安全修复。
|
||||
|
||||
由于补丁的采用率不佳,Talos 的研究人员决定对所有这些服务器的 IP 地址进行 whois 查询,并向其所有者发送电子邮件通知。
|
||||
|
||||
本月初,研究人员决定再次进行扫描。他们发现,虽然有 28500 台服务器的 IP 地址与 2 月份时的地址不同,但仍然有 106000 台 memcached 服务器暴露在因特网上。
|
||||
|
||||
在这 106000 台服务器中,有大约 70%,即 73400 台服务器在 10 月份修复的三个漏洞的测试中仍然受到攻击。超过 18000 个已识别的服务器需要身份验证,其中 99% 的服务器仍然存在 SASL 漏洞。
|
||||
|
||||
即便是发送了成千上万封电子邮件进行通知,补丁的采用率也仅仅提高了 10%。
|
||||
|
||||
Talos 研究人员在周一的[博客][7]中表示:“这些漏洞的严重程度不能被低估。这些漏洞可能会影响到小型和大型企业在互联网上部署的平台,随着最近大量的蠕虫利用漏洞进行攻击,应该为全世界的服务器管理员敲响警钟。如果这些漏洞没有修复,就可能被利用,对组织和业务造成严重的影响。”
|
||||
|
||||
这项工作的结论表明,许多网络应用程序的所有者在保护用户数据方面做得不好。首先,大量的 Memcached 服务器直接暴露在互联网上,其中大多数都没有使用身份验证。即使没有任何漏洞,这些服务器上缓存的数据也存在着安全风险。
|
||||
|
||||
其次,即使提供了关键漏洞的补丁,许多服务器管理员也不会及时地进行修复。
|
||||
|
||||
在这种情况下,看到 memcached 服务器像 MongoDB 数据库一样被大规模攻击也并不奇怪。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://thenewstack.io/70000-memcached-servers-can-hacked-using-eight-month-old-flaws/
|
||||
|
||||
作者:[Lucian Constantin][a]
|
||||
译者:[firmianay](https://github.com/firmianay)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://thenewstack.io/author/lucian/
|
||||
[1]:https://memcached.org/
|
||||
[2]:https://www.talosintelligence.com/reports/TALOS-2016-0219/
|
||||
[3]:https://www.talosintelligence.com/reports/TALOS-2016-0220/
|
||||
[4]:https://www.talosintelligence.com/reports/TALOS-2016-0221/
|
||||
[5]:https://www.talosintelligence.com/
|
||||
[6]:https://tools.ietf.org/html/rfc4422
|
||||
[7]:http://blog.talosintelligence.com/2017/07/memcached-patch-failure.html
|
||||
52
published/201707/20170725 Linux Weather Forecast.md
Normal file
52
published/201707/20170725 Linux Weather Forecast.md
Normal file
@@ -0,0 +1,52 @@
|
||||
Linux “天气预报”
|
||||
============================================================
|
||||
|
||||
### 欢迎来到 Linux 天气预报
|
||||
|
||||
本页面是为了跟踪在不久的将来某个时间内有可能出现在主线内核和/或主要发行版中的 Linux 开发社区的进展情况。你的“首席气象学家”是 [LWN.net][8] 执行主编 Jonathan Corbet。如果你有改进预测的建议(特别是如果你有一个你认为应该跟踪的项目或修补程序的情况下),请在下面补充你的意见。
|
||||
|
||||
### 预测摘要
|
||||
|
||||
**当前情况**:内核 4.12 于 7 月 2 日发布。它包含了许多新功能,包括:
|
||||
|
||||
* [BFQ 和 Kyber 块 I/O 调度器][2]。已经开发多年的 BFQ 在交互式系统上表现更好,这引起了移动设备领域的兴趣。相反,Kyber 是一个更简单的调度程序,旨在用于通常出现在企业配置中的快速设备。
|
||||
* epoll_wait() 系统调用现在可以执行网络套接字的繁忙轮询。
|
||||
* 实时修补机制已经实现了[混合一致性模型][3],这将可以把更复杂的补丁应用于运行中的内核。
|
||||
* [可信执行框架][4]应该使得内核与在 ARM TrustZone 安全世界中运行的代码之间的交互更加容易。
|
||||
|
||||
4.12 是最繁忙的内核开发周期之一,合并了近 15000 次更新。有关这些变化来源的概述,请参阅[这里][9]。
|
||||
|
||||
**短期预测**:4.13 内核预期在 2017 年 9 月初发布。这个内核中会出现的一些变化是:
|
||||
|
||||
* 更好地支持非阻塞直接块 I/O 操作。
|
||||
* [结构布局随机化机制][5]是正在进行的内核加固防攻击项目的下一步。
|
||||
* 内核现在已经[原生支持 TLS 网络协议][6]。
|
||||
* 采取[透明大页交换][7],这使得有更好的内存管理性能。
|
||||
* 块子系统中回写错误的处理[已经改进][1],这使得错误不太可能不告知程序而写入数据。
|
||||
|
||||
4.13 内核现在处于稳定时期,所以在这个开发周期的剩余时间内只会接受修复补丁。
|
||||
|
||||
这篇[文章][10]根据[知识共享署名 - 共享 3.0 许可证][11]获得许可。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/news/2017/7/linux-weather-forecast
|
||||
|
||||
作者:[JONATHAN CORBET][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.linux.com/users/corbet
|
||||
[1]:https://lwn.net/Articles/724307/
|
||||
[2]:https://lwn.net/Articles/720675/
|
||||
[3]:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d83a7cb375eec21f04c83542395d08b2f6641da2
|
||||
[4]:https://lwn.net/Articles/717125/
|
||||
[5]:https://lwn.net/Articles/722293/
|
||||
[6]:https://lwn.net/Articles/666509/
|
||||
[7]:https://lwn.net/Articles/717707/
|
||||
[8]:http://www.lwn.net/
|
||||
[9]:https://lwn.net/Articles/726950/
|
||||
[10]:http://purl.org/dc/elements/1.1/
|
||||
[11]:http://creativecommons.org/licenses/by-sa/3.0/
|
||||
@@ -0,0 +1,64 @@
|
||||
ss:查看网络连接的另一种方法
|
||||
============================================================
|
||||
|
||||
在之前的文章中,我提到过 `ss`,它是 iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息。可以完成 `netstat` 同样的任务,但是,`ss` 稍微快一点而且命令更简短。
|
||||
|
||||
直接输入 `ss`,默认会显示与 `netstat` 同样的内容,并且输入类似的参数可以获取你想要的类似输出。例如:
|
||||
|
||||
```
|
||||
$ ss -t
|
||||
State Recv-Q Send-Q Local Address:Port Peer Address:Port
|
||||
ESTAB 0 0 127.0.0.1:postgresql 127.0.0.1:48154
|
||||
ESTAB 0 0 192.168.0.136:35296 192.168.0.120:8009
|
||||
ESTAB 0 0 192.168.0.136:47574 173.194.74.189:https
|
||||
[…]
|
||||
```
|
||||
|
||||
`ss -t` 只显示 TCP 连接。`ss -u` 用于显示 UDP 连接,`-l` 参数只会显示监听的端口,而且可以进一步过滤到任何想要的信息。
|
||||
|
||||
我并没有测试所有可用参数,但是你甚至可以使用 `-K` 强制关闭 socket。
|
||||
|
||||
`ss` 真正耀眼的地方是其内置的过滤能力。让我们列出所有端口为 22(ssh)的连接:
|
||||
|
||||
```
|
||||
$ ss state all sport = :ssh
|
||||
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
|
||||
tcp LISTEN 0 128 *:ssh *:*
|
||||
tcp ESTAB 0 0 192.168.0.136:ssh 192.168.0.102:46540
|
||||
tcp LISTEN 0 128 :::ssh :::*
|
||||
```
|
||||
|
||||
如果只想看已建立的 socket(排除了 _listening_ 和 _closed_ ):
|
||||
|
||||
```
|
||||
$ ss state connected sport = :ssh
|
||||
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
|
||||
tcp ESTAB 0 0 192.168.0.136:ssh 192.168.0.102:46540
|
||||
```
|
||||
|
||||
类似的,可以列出指定的 host 或者 ip 段。例如,列出到达 74.125.0.0/16 子网的连接,这个子网属于 Google:
|
||||
|
||||
```
|
||||
$ ss state all dst 74.125.0.0/16
|
||||
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
|
||||
tcp ESTAB 0 0 192.168.0.136:33616 74.125.142.189:https
|
||||
tcp ESTAB 0 0 192.168.0.136:42034 74.125.70.189:https
|
||||
tcp ESTAB 0 0 192.168.0.136:57408 74.125.202.189:https
|
||||
```
|
||||
|
||||
`ss`与 iptables 的语法非常相同,如果已经熟悉了其语法,`ss` 非常容易上手。也可以安装 iproute2-doc 包, 通过 `/usr/share/doc/iproute2-doc/ss.html` 获得完整文档。
|
||||
|
||||
还不快试试! 你就可以知道它有多棒。无论如何,让我输入的字符越少我越高兴。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://insights.ubuntu.com/2017/07/25/ss-another-way-to-get-socket-statistics/
|
||||
|
||||
作者:[Mathieu Trudel-Lapierre][a]
|
||||
译者:[VicYu](https://vicyu.com)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://insights.ubuntu.com/author/mathieu-trudel-lapierre/
|
||||
[1]:https://insights.ubuntu.com/author/mathieu-trudel-lapierre/
|
||||
Reference in New Issue
Block a user