mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
commit
1eef11bc1d
1105
published/20160917 A Web Crawler With asyncio Coroutines.md
Normal file
1105
published/20160917 A Web Crawler With asyncio Coroutines.md
Normal file
File diff suppressed because it is too large
Load Diff
146
published/20161018 Suspend to Idle.md
Normal file
146
published/20161018 Suspend to Idle.md
Normal file
@ -0,0 +1,146 @@
|
||||
浅述内核中“挂起到空闲”的实现
|
||||
===============
|
||||
|
||||
### 简介
|
||||
|
||||
Linux 内核提供了多种睡眠状态,各个状态通过设置系统中的不同部件进入低耗电模式来节约能源。目前总共有四种睡眠状态,分别是:挂起到空闲(suspend to idle)、加电待机(power-on standby(standby))、挂起到内存(suspend to ram)和挂起到磁盘(suspend to disk)。这些状态分别对应 ACPI 的 4 种状态:S0,S1,S3 和 S4。挂起到空闲(suspend to idle)是纯软件实现的,用于将 CPU 维持在尽可能深的 idle 状态。加电待机(power-on standby(standby))则使设备处于低功耗状态,并且关闭所有非引导 CPU。挂起到内存(suspend to ram)就更进一步,关闭所有 CPU 并且设置 RAM 进入自刷新模式。挂起到磁盘(suspend to disk)则是最省功耗的模式,关闭尽可能多的系统,包括关闭内存。然后内存中的内容会被写到硬盘,待唤醒计算机的时候将硬盘中的内容重新恢复到内存中。
|
||||
|
||||
这篇博文主要介绍挂起到空闲(suspend to idle)的实现。如上所说,它主要通过软件实现。一般平台的挂起过程包括冻结用户空间并将外围设备调至低耗电模式。但是,系统并不是直接关闭和热插拔掉 CPU,而是静静地强制将 CPU 进入空闲(idle)状态。随着外围设备进入了低耗电模式,除了唤醒相关的中断外不应有其他中断产生。唤醒中断包括那些设置用于唤醒系统的计时器(比如 RTC,普通计时器等)、或者电源开关、USB 和其它外围设备等。
|
||||
|
||||
在冻结过程中,当系统进入空闲状态时会调用一个特殊的 cpu 空闲函数。这个 `enter_freeze()` 函数可以和调用使 cpu 空闲的 `enter()` 函数一样简单,也可以复杂得多。该函数复杂的程度由将 SoC 置为低耗电模式的条件和方法决定。
|
||||
|
||||
### 先决条件
|
||||
|
||||
#### `platform_suspend_ops`
|
||||
|
||||
一般情况,为了支持 S2I,系统必须实现 `platform_suspend_ops` 并提供最低限度的挂起支持。这意味着至少要完成 `platform_suspend_ops` 中的 `valid()` 函数。如果挂起到空闲(suspend to idle)和挂起到内存(suspend to ram)都要支持,valid 函数中应使用 `suspend_valid_only_mem`。
|
||||
|
||||
不过,最近内核增加了对 S2I 的自动支持。Sudeep Holla 提出了一个变更,可以让系统不需要满足 `platform_suspend_ops` 条件也能提供 S2I 支持。这个补丁已经被接收并将合并在 4.9 版本中,该补丁可从这里获取: [https://lkml.org/lkml/2016/8/19/474][1]。
|
||||
|
||||
如果定义了 `suspend_ops`,那么可以通过查看 `/sys/power/state` 文件得知系统具体支持哪些挂起状态。如下操作:
|
||||
|
||||
```
|
||||
# cat /sys/power/state
|
||||
freeze mem
|
||||
```
|
||||
|
||||
这个示例的结果显示该平台支持 S0(挂起到空闲(suspend to idle))和 S3(挂起到内存(suspend to ram))。按 Sudeep 的变更,那些没有实现 `platform_suspend_ops` 的平台将只显示 freeze 状态。
|
||||
|
||||
#### 唤醒中断
|
||||
|
||||
一旦系统处于某种睡眠状态,系统必须要接收某个唤醒事件才能恢复系统。这些唤醒事件一般由系统的设备产生。因此一定要确保这些设备驱动使用唤醒中断,并且将自身配置为接收唤醒中断后产生唤醒事件。如果没有正确识别唤醒设备,系统收到中断后会继续保持睡眠状态而不会恢复。
|
||||
|
||||
一旦设备正确实现了唤醒接口的调用,就可用来生成唤醒事件。请确保 DT 文件正确配置了唤醒源。下面是一个配置唤醒源示例,该文件来自(`arch/arm/boot/dst/am335x-evm.dts`):
|
||||
|
||||
```
|
||||
gpio_keys: volume_keys@0 {
|
||||
compatible = “gpio-keys”;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
autorepeat;
|
||||
|
||||
switch@9 {
|
||||
label = “volume-up”;
|
||||
linux,code = <115>;
|
||||
gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
|
||||
wakeup-source;
|
||||
};
|
||||
|
||||
switch@10 {
|
||||
label = “volume-down”;
|
||||
linux,code = <114>;
|
||||
gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
```
|
||||
如上所示,有两个 gpio 键被配置为唤醒源,在系统挂起期间,其中任何一个键被按下都会产生一个唤醒事件。
|
||||
|
||||
可替代 DT 文件配置的另一个唤醒源配置就是设备驱动,如果设备驱动自身在代码里面配置了唤醒支持,那么就会使用该默认唤醒配置。
|
||||
|
||||
### 实施
|
||||
|
||||
#### 冻结功能
|
||||
|
||||
如果系统希望能够充分使用挂起到空闲(suspend to idle),那么应该在 CPU 空闲驱动代码中定义 `enter_freeze()` 函数。`enter_freeze()` 与 `enter()` 的函数原型略有不同。因此,不能将 `enter()` 同时指定给 `enter` 和 `enter_freeze`。至少,系统会直接调用 `enter()`。如果没有定义 `enter_freeze()`,系统会挂起,但是不会触发那些只有当 `enter_freeze()` 定义了才会触发的函数,比如 `tick_freeze()` 和 `stop_critical_timing()` 都不会发生。这会导致计时器中断唤醒系统,但不会导致系统恢复,因为系统处理完中断后会继续挂起。
|
||||
|
||||
在挂起过程中,中断越少越好(最好一个也没有)。
|
||||
|
||||
下图显示了能耗和时间的对比。图中的两个尖刺分别是挂起和恢复。挂起前后的能耗尖刺是系统退出空闲态进行记录操作,进程调度,计时器处理等。因延迟的缘故,系统进入更深层次空闲状态需要花费一段时间。
|
||||
|
||||
![blog-picture-one](http://www.linaro.org/wp-content/uploads/2016/10/blog-picture-one-1024x767.png)
|
||||
|
||||
*能耗使用时序图*
|
||||
|
||||
下图为 ftrace 抓取的 4 核 CPU 在系统挂起和恢复操作之前、之中和之后的活动。可以看到,在挂起期间,没有请求或者中断被处理。
|
||||
|
||||
![blog-picture-2](http://www.linaro.org/wp-content/uploads/2016/10/blog-picture-2-1024x577.png)
|
||||
|
||||
*Ftrace 抓取的挂起/恢复活动图*
|
||||
|
||||
#### 空闲状态
|
||||
|
||||
你必须确定哪个空闲状态支持冻结。在冻结期间,电源相关代码会决定用哪个空闲状态来实现冻结。这个过程是通过在每个空闲状态中查找谁定义了 `enter_freeze()` 来决定的。CPU 空闲驱动代码或者 SoC 挂起相关代码必须确定哪种空闲状态实现冻结操作,并通过给每个 CPU 的可应用空闲状态指定冻结功能来进行配置。
|
||||
|
||||
例如, Qualcomm 会在平台挂起代码的挂起初始化函数处定义 `enter_freeze` 函数。这个工作是在 CPU 空闲驱动已经初始化后进行,以便所有结构已经定义就位。
|
||||
|
||||
#### 挂起/恢复相关驱动支持
|
||||
|
||||
你可能会在第一次成功挂起操作后碰到驱动相关的 bug。很多驱动开发者没有精力完全测试挂起和恢复相关的代码。你甚至可能会发现挂起操作并没有多少工作可做,因为 `pm_runtime` 已经做了你要做的挂起相关的一切工作。由于用户空间已经被冻结,设备此时已经处于休眠状态并且 `pm_runtime` 已经被禁止。
|
||||
|
||||
### 测试相关
|
||||
|
||||
测试挂起到空闲(suspend to idle)可以手动进行,也可以使用脚本/进程等实现自动挂起、自动睡眠,或者使用像 Android 中的 `wakelock` 来让系统挂起。如果手动测试,下面的操作会将系统冻结。
|
||||
|
||||
```
|
||||
/ # echo freeze > /sys/power/state
|
||||
[ 142.580832] PM: Syncing filesystems … done.
|
||||
[ 142.583977] Freezing user space processes … (elapsed 0.001 seconds) done.
|
||||
[ 142.591164] Double checking all user space processes after OOM killer disable… (elapsed 0.000 seconds)
|
||||
[ 142.600444] Freezing remaining freezable tasks … (elapsed 0.001 seconds) done.
|
||||
[ 142.608073] Suspending console(s) (use no_console_suspend to debug)
|
||||
[ 142.708787] mmc1: Reset 0x1 never completed.
|
||||
[ 142.710608] msm_otg 78d9000.phy: USB in low power mode
|
||||
[ 142.711379] PM: suspend of devices complete after 102.883 msecs
|
||||
[ 142.712162] PM: late suspend of devices complete after 0.773 msecs
|
||||
[ 142.712607] PM: noirq suspend of devices complete after 0.438 msecs
|
||||
< system suspended >
|
||||
….
|
||||
< wake irq triggered >
|
||||
[ 147.700522] PM: noirq resume of devices complete after 0.216 msecs
|
||||
[ 147.701004] PM: early resume of devices complete after 0.353 msecs
|
||||
[ 147.701636] msm_otg 78d9000.phy: USB exited from low power mode
|
||||
[ 147.704492] PM: resume of devices complete after 3.479 msecs
|
||||
[ 147.835599] Restarting tasks … done.
|
||||
/ #
|
||||
```
|
||||
|
||||
在上面的例子中,需要注意 MMC 驱动的操作占了 102.883ms 中的 100ms。有些设备驱动在挂起的时候有很多工作要做,比如将数据刷出到硬盘,或者其他耗时的操作等。
|
||||
|
||||
如果系统定义了冻结(freeze),那么系统将尝试挂起操作,如果没有冻结功能,那么你会看到下面的提示:
|
||||
|
||||
```
|
||||
/ # echo freeze > /sys/power/state
|
||||
sh: write error: Invalid argument
|
||||
/ #
|
||||
```
|
||||
|
||||
### 未来的发展
|
||||
|
||||
目前在 ARM 平台上的挂起到空闲(suspend to idle)有两方面的工作需要做。第一方面工作在前面 `platform_suspend_ops` 小节中提到过,是总允许接受冻结状态以及合并到 4.9 版本内核中的工作。另一方面工作是冻结功能的支持。
|
||||
|
||||
如果你希望设备有更好的响应及表现,那么应该继续完善冻结功能的实现。然而,由于很多 SoC 会使用 ARM 的 CPU 空闲驱动,这使得 ARM 的 CPU 空闲驱动完善它自己的通用冻结功能的工作更有意义了。而事实上,ARM 正在尝试添加此通用支持。如果 SoC 供应商希望实现他们自己的 CPU 空闲驱动或者需要在进入更深层次的冻结休眠状态时提供额外的支持,那么只有实现自己的冻结功能。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linaro.org/blog/suspend-to-idle/
|
||||
|
||||
作者:[Andy Gross][a]
|
||||
译者:[beyondworld](https://github.com/beyondworld)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.linaro.org/author/andygross/
|
||||
[1]:https://lkml.org/lkml/2016/8/19/474
|
@ -1,58 +1,59 @@
|
||||
Manage Samba4 AD Domain Controller DNS and Group Policy from Windows – Part 4
|
||||
Samba 系列(四):在 Windows 下管理 Samba4 AD 域管制器 DNS 和组策略
|
||||
============================================================
|
||||
在 Windows 系统下管理 Samba4 AD 域管制器 DNS 和组策略(四)
|
||||
|
||||
接着前一篇教程写的关于[使用 Windows 10 系统的 RSAT 工具来管理 Samba4 活动目录架构][4],在这篇文章中我们将学习如何使用微软 DNS 管理器远程管理我们的 Samba AD 域控制器的 DNS 服务器,如何创建 DNS 记录,如何创建反向查找区域以及如何通过组策略管理工具来创建域策略。
|
||||
接着前一篇教程写的关于[使用 Windows 10 的 RSAT 工具来管理 Samba4 活动目录架构][4],在这篇文章中我们将学习如何使用微软 DNS 管理器远程管理我们的 Samba AD 域控制器的 DNS 服务器,如何创建 DNS 记录,如何创建反向查找区域以及如何通过组策略管理工具来创建域策略。
|
||||
|
||||
#### 需求
|
||||
#### 要求
|
||||
|
||||
1、 [在 Ubuntu 16.04 系统上使用 Samba4 软件来创建活动目录架构(一)][1]
|
||||
|
||||
1、 [在 Ubuntu16.04 系统上使用 Samba4 软件来创建活动目录架构(一)][1]
|
||||
2、 [在 Linux 命令行下管理 Samba4 AD 架构(二)][2]
|
||||
3、 [使用 Windows 10 系统的 RSAT 工具来管理 Samba4 活动目录架构 (三)][3]
|
||||
|
||||
3、 [使用 Windows 10 的 RSAT 工具来管理 Samba4 活动目录架构 (三)][3]
|
||||
|
||||
### 第 1 步:管理 Samba DNS 服务器
|
||||
|
||||
Samba4 AD DC 使用内部的 DNS 解析模块,该模块在初始化域提供的过程中被创建完成(如果 BIND9 DLZ 模块未特定使用的情况下)。
|
||||
Samba4 AD DC 使用内部的 DNS 解析器模块,该模块在初始化域提供的过程中创建(如果 BIND9 DLZ 模块未指定使用的情况下)。
|
||||
|
||||
Samba4 内部的 DNS 域模块支持 AD 域控制器所必须的基本功能。有两种方式来管理域 DNS 服务器,直接在命令行下通过 samba-tool 接口来管理,或者使用已加入域的微软工作站中的 RSAT DNS 管理器远程进行管理。
|
||||
Samba4 内部的 DNS 模块支持 AD 域控制器所必须的基本功能。有两种方式来管理域 DNS 服务器,直接在命令行下通过 samba-tool 接口来管理,或者使用已加入域的微软工作站中的 RSAT DNS 管理器远程进行管理。
|
||||
|
||||
在这篇文章中,我们使用第二种方式来进行管理,因为这种方式很直观,也不容易出错。
|
||||
|
||||
1、要使用 RSAT 工具来管理域控制器上的 DNS 服务器,在 Windows 机器上,打开控制面板 -> 系统和安全 -> 管理工具,然后运行 DNS 管理器工具。
|
||||
|
||||
当打开这个工具时,它会询问你将要连接到哪台正在运行的 DNS 服务器。选择使用下面的计算机,输入域名(IP 地址或 FQDN 地址都可以使用),勾选‘现在连接到指定计算机’,然后单击 OK 按钮以开启 Samba DNS 服务。
|
||||
当打开这个工具时,它会询问你将要连接到哪台正在运行的 DNS 服务器。选择“使用下面的计算机”,输入域名(IP 地址或 FQDN 地址都可以使用),勾选“现在连接到指定计算机”,然后单击 OK 按钮以开启 Samba DNS 服务。
|
||||
|
||||
[
|
||||
![Connect Samba4 DNS on Windows](http://www.tecmint.com/wp-content/uploads/2016/12/Connect-Samba4-DNS-on-Windows.png)
|
||||
][5]
|
||||
|
||||
在 Windows 系统上连接 Samba4 DNS 服务器
|
||||
*在 Windows 系统上连接 Samba4 DNS 服务器*
|
||||
|
||||
2、为了添加一条 DNS 记录(比如我们添加一条指向 LAN 网关的记录 ‘A'),打开 DNS 管理器,找到域正向查找区,在右侧单击右键选择新的主机(’A‘ 或 ’AAA‘)。
|
||||
2、为了添加一条 DNS 记录(比如我们添加一条指向 LAN 网关的 A 记录),打开 DNS 管理器,找到域正向查找区,在右侧单击右键选择新的主机(A 或 AAAA)。
|
||||
|
||||
[
|
||||
![Add DNS A Record on Windows](http://www.tecmint.com/wp-content/uploads/2016/12/Add-DNS-A-Record.png)
|
||||
][6]
|
||||
|
||||
在 Windows 下添加一条 DNS 记录
|
||||
*在 Windows 下添加一条 DNS 记录*
|
||||
|
||||
3、在打开的新主机窗口界面,输入 DNS 服务器的主机名和 IP 地址。 DNS 管理器工具会自动填写完成 FQDN 地址。填写完成后,点击添加主机按钮,之后会弹出一个新的窗口提示你 DNS A 记录已经创建完成。
|
||||
3、在打开的新主机窗口界面,输入 DNS 服务器的主机名和 IP 地址。 DNS 管理器工具会自动填写完成 FQDN 地址。填写完成后,点击“添加主机”按钮,之后会弹出一个新的窗口提示你 DNS A 记录已经创建完成。
|
||||
|
||||
确保你添加的 DNS A 记录是你们网络中的资源[已配置静态 IP][7]。不要为那些从 DHCP 服务器自动获取 IP 地址或者经常变换 IP 地址的主机添加 DNS A 记录。
|
||||
确保仅为你的网络中[已配置静态 IP][7]的资源(设备)添加 DNS A 记录。不要为那些从 DHCP 服务器自动获取 IP 地址或者经常变换 IP 地址的主机添加 DNS A 记录。
|
||||
|
||||
[
|
||||
![Configure Samba Host on Windows](http://www.tecmint.com/wp-content/uploads/2016/12/Configure-Samba-Host-on-Windows.png)
|
||||
][8]
|
||||
|
||||
在 Windows 系统下配置 Samba 主机
|
||||
*在 Windows 系统下配置 Samba 主机*
|
||||
|
||||
要更新一条 DNS 记录只需要双击那条记录,然后输入更改原因即可。要删除一条记录时,只需要在这条记录上单击右键,选择从菜单删除即可。
|
||||
要更新一条 DNS 记录只需要双击那条记录,然后输入更改即可。要删除一条记录时,只需要在这条记录上单击右键,选择从菜单删除即可。
|
||||
|
||||
同样的方式,你也可以为你的域添加其它类型的 DNS 记录,比如说 CNAME 记录(也称为 DNS 别名记录),MX 记录(在邮件服务器上非常有用)或者其它类型的记录(SPE、TXT、SRVetc类型)。
|
||||
同样的方式,你也可以为你的域添加其它类型的 DNS 记录,比如说 CNAME 记录(也称为 DNS 别名记录),MX 记录(在邮件服务器上非常有用)或者其它类型的记录(SPE、TXT、SRV 等类型)。
|
||||
|
||||
### 第 2 步:创建反向查找区域
|
||||
|
||||
默认情况下, Samba4 AD DC 不会自动为你的域添加一个反向查找区域和 PTR 记录,因为这些类型的记录对于域控制器的正常工作来说是无关紧要的。
|
||||
默认情况下,Samba4 AD DC 不会自动为你的域添加一个反向查找区域和 PTR 记录,因为这些类型的记录对于域控制器的正常工作来说是无关紧要的。
|
||||
|
||||
相反,DNS 反向区和 PTR 记录在一些重要的网络服务中显得非常有用,比如邮件服务,因为这些类型的记录可以用于验证客户端请求服务的身份。
|
||||
|
||||
@ -64,56 +65,56 @@ Samba4 内部的 DNS 域模块支持 AD 域控制器所必须的基本功能。
|
||||
![Create Reverse Lookup DNS Zone](http://www.tecmint.com/wp-content/uploads/2016/12/Create-Reverse-Lookup-DNS-Zone.png)
|
||||
][9]
|
||||
|
||||
创建 DNS 反向查找区域
|
||||
*创建 DNS 反向查找区域*
|
||||
|
||||
5、下一步,单击下一步按钮,然后从区域类型向导中选择主区域。
|
||||
5、下一步,单击下一步按钮,然后从区域类型向导中选择主区域(Primary)。
|
||||
[
|
||||
![Select DNS Zone Type](http://www.tecmint.com/wp-content/uploads/2016/12/Select-DNS-Zone-Type.png)
|
||||
][10]
|
||||
|
||||
选择 DNS 区域类型
|
||||
*选择 DNS 区域类型*
|
||||
|
||||
6、下一步,在 AD 区域复制范围中选择复制到该域里运行在域控制器上的所有的 DNS 服务器,选择 IPv4 反向查找区域然后单击下一步继续。
|
||||
6、下一步,在 “AD 区域复制范围”中选择复制到该域里运行在域控制器上的所有的 DNS 服务器,选择 “IPv4 反向查找区域”然后单击下一步继续。
|
||||
|
||||
[
|
||||
![Select DNS for Samba Domain Controller](http://www.tecmint.com/wp-content/uploads/2016/12/Select-DNS-for-Samba-Domain-Controller.png)
|
||||
][11]
|
||||
|
||||
为 Samba 域控制器选择 DNS 服务器
|
||||
*为 Samba 域控制器选择 DNS 服务器*
|
||||
|
||||
[
|
||||
![Add Reverse Lookup Zone Name](http://www.tecmint.com/wp-content/uploads/2016/12/Add-Reverse-Lookup-Zone-Name.png)
|
||||
][12]
|
||||
|
||||
添加反向查找区域名
|
||||
*添加反向查找区域名*
|
||||
|
||||
7、下一步,在网络ID 框中输入你的 LAN IP 地址,然后单击下一步继续。
|
||||
|
||||
资源在这个区域内添加的所有 PTR 记录仅指向 192.168.1.0/24 网络段。如果你想要为一个不在该网段中的服务器创建一个 PTR 记录(比如邮件服务器位于 10.0.0.0/24 这个网段的时候),那么你还得为那个网段创建一个新的反向查找区域。
|
||||
在这个区域内添加的所有资源(设备)的 PTR 记录仅能指向 192.168.1.0/24 网络段。如果你想要为一个不在该网段中的服务器创建一个 PTR 记录(比如邮件服务器位于 10.0.0.0/24 这个网段的时候),那么你还得为那个网段创建一个新的反向查找区域。
|
||||
|
||||
[
|
||||
![Add IP Address of Reverse Lookup DNS Zone](http://www.tecmint.com/wp-content/uploads/2016/12/Add-IP-Address-of-Reverse-DNS-Zone.png)
|
||||
][13]
|
||||
|
||||
添加 DNS 反向查找区域的 IP 地址
|
||||
*添加 DNS 反向查找区域的 IP 地址*
|
||||
|
||||
8、在下一个截图中选择仅允许安全的动态更新,单击下一步继续,最后单击完成按钮以完成反向查找区域的创建。
|
||||
8、在下一个截图中选择“仅允许安全的动态更新”,单击下一步继续,最后单击完成按钮以完成反向查找区域的创建。
|
||||
|
||||
[
|
||||
![Enable Secure Dynamic Updates](http://www.tecmint.com/wp-content/uploads/2016/12/Enable-Secure-Dynamic-Updates.png)
|
||||
][14]
|
||||
|
||||
启用安全动态更新
|
||||
*启用安全动态更新*
|
||||
|
||||
[
|
||||
![New DNS Zone Summary](http://www.tecmint.com/wp-content/uploads/2016/12/New-DNS-Zone-Summary.png)
|
||||
][15]
|
||||
|
||||
新 DNS 区域概述
|
||||
*新 DNS 区域概览*
|
||||
|
||||
9、此时,你已经为你的域环境创建完成了一个有效的 DNS 反向查找区域。为了在这个区域中添加一个 PTR 记录,在右侧右键单击,选择为网络资源创建一个 PTR 记录。
|
||||
|
||||
这个时候,我们已经为网关创建了一个指向。为了测试这条记录对于客户端是否添加正确和工作正常,打开命令行提示符执行 nslookup 查询资源名,再执行另外一条命令查询 IP 地址。
|
||||
这个时候,我们已经为网关创建了一个指向。为了测试这条记录对于客户端是否添加正确和工作正常,打开命令行提示符执行 `nslookup` 查询资源名,再执行另外一条命令查询 IP 地址。
|
||||
|
||||
两个查询都应该为你的 DNS 资源返回正确的结果。
|
||||
|
||||
@ -122,18 +123,20 @@ nslookup gate.tecmint.lan
|
||||
nslookup 192.168.1.1
|
||||
ping gate
|
||||
```
|
||||
|
||||
[
|
||||
![Add DNS PTR Record and Query PTR](http://www.tecmint.com/wp-content/uploads/2016/12/Add-DNS-PTR-Record-and-Query.png)
|
||||
][16]
|
||||
|
||||
添加及查询 PTR 记录
|
||||
*添加及查询 PTR 记录*
|
||||
|
||||
### 第 3 步:管理域控制策略
|
||||
|
||||
10、域控制器最重要的作用就是集中控制系统资源及安全。使用域控制器的域组策略功能很容易实现这些类型的任务。
|
||||
|
||||
遗憾的是,在 Samba 域控制器上唯一用来编辑或管理组策略的方法是通过微软的 RSAT GPM 工具。
|
||||
|
||||
在下面的实例中,我们将看到通过组策略来实现在 Samba 域环境中为域用户创建一种交互式的登录方式是多么的简单。
|
||||
在下面的实例中,我们将看到通过组策略来实现在 Samba 域环境中为域用户创建一种交互式的登录提示是多么的简单。
|
||||
|
||||
要访问组策略控制台,打开控制面板 -> 系统和安全 -> 管理工具,然后打开组策略管理控制台。
|
||||
|
||||
@ -143,9 +146,9 @@ ping gate
|
||||
![Manage Samba Domain Group Policy](http://www.tecmint.com/wp-content/uploads/2016/12/Manage-Samba-Domain-Group-Policy.png)
|
||||
][17]
|
||||
|
||||
管理 Samba 域组策略
|
||||
*管理 Samba 域组策略*
|
||||
|
||||
11、在组策略管理编辑器窗口中,进入到电脑配置 -> 组策略 -> Windows 设置 -> 安全设置 -> 本地策略 -> 安全选项,你将在右侧看到一个新的选项列表。
|
||||
11、在组策略管理编辑器窗口中,进入到计算机配置 -> 组策略 -> Windows 设置 -> 安全设置 -> 本地策略 -> 安全选项,你将在右侧看到一个新的选项列表。
|
||||
|
||||
在右侧查询并编辑你的定制化设置,参考下图中的两条设置内容。
|
||||
|
||||
@ -153,7 +156,7 @@ ping gate
|
||||
![Configure Samba Domain Group Policy](http://www.tecmint.com/wp-content/uploads/2016/12/Configure-Samba-Domain-Group-Policy.png)
|
||||
][18]
|
||||
|
||||
配置 Samba 域组策略
|
||||
*配置 Samba 域组策略*
|
||||
|
||||
12、这两个条目编辑完成后,关闭所有窗口,打开 CMD 窗口,执行以下命令来强制应用组策略。
|
||||
|
||||
@ -164,14 +167,15 @@ gpupdate /force
|
||||
![Update Samba Domain Group Policy](http://www.tecmint.com/wp-content/uploads/2016/12/Update-Samba-Domain-Group-Policy.png)
|
||||
][19]
|
||||
|
||||
更新 Samba 域组策略
|
||||
*更新 Samba 域组策略*
|
||||
|
||||
13、最后,重启你的电脑,当你准备登录进入系统的时候,你就会看到登录提示生效了。
|
||||
|
||||
[
|
||||
![Samba4 AD Domain Controller Logon Banner](http://www.tecmint.com/wp-content/uploads/2016/12/Samba4-Domain-Controller-User-Login.png)
|
||||
][20]
|
||||
|
||||
Samba4 AD 域控制器登录提示
|
||||
*Samba4 AD 域控制器登录提示*
|
||||
|
||||
就写到这里吧!组策略是一个操作起来很繁琐和很谨慎的主题,在管理系统的过程中你得非常的小心。还有,注意你设置的组策略不会以任何方式应用到已加入域的 Linux 系统中。
|
||||
|
||||
@ -184,17 +188,17 @@ Samba4 AD 域控制器登录提示
|
||||
|
||||
via: http://www.tecmint.com/manage-samba4-dns-group-policy-from-windows/
|
||||
|
||||
作者:[Matei Cezar ][a]
|
||||
作者:[Matei Cezar][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/cezarmatei/
|
||||
[1]:http://www.tecmint.com/install-samba4-active-directory-ubuntu/
|
||||
[2]:http://www.tecmint.com/manage-samba4-active-directory-linux-command-line/
|
||||
[3]:http://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/
|
||||
[4]:http://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/
|
||||
[1]:https://linux.cn/article-8065-1.html
|
||||
[2]:https://linux.cn/article-8070-1.html
|
||||
[3]:https://linux.cn/article-8097-1.html
|
||||
[4]:https://linux.cn/article-8097-1.html
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2016/12/Connect-Samba4-DNS-on-Windows.png
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2016/12/Add-DNS-A-Record.png
|
||||
[7]:http://www.tecmint.com/set-add-static-ip-address-in-linux/
|
@ -0,0 +1,126 @@
|
||||
Vim 初学者入门指南
|
||||
============================================================
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2012/03/vim-beginner-guide-featured.jpg "Vim 初学者入门指南")
|
||||
|
||||
|
||||
这篇文章是 [VIM 用户指南][12] 系列文章中的一篇:
|
||||
|
||||
* Vim 初学者入门指南
|
||||
* [Vim 快捷键速查表][3]
|
||||
* [5 个针对有经验用户的 Vim 技巧][4]
|
||||
* [3 个针对高级用户的 Vim 编辑器有用技巧][5]
|
||||
|
||||
对一个程序员来说,选择一个文本编辑器是一件非常重要的事。因为不同编辑器之间有着不少的差异:图形界面或者非图形界面、不同的快捷键、不同的编程语言支持、不同的插件以及自定义设置等等。我建议不是去搜索最棒的编辑器,而是去选择最适合你的习惯且最适应你的任务的那一个。假如你打算在一个团体中工作,那么最好和你的共事者选择一样的编辑器。这样的话,一旦你在使用中遇到问题,你就可以去向他们寻求帮助。
|
||||
|
||||
这正是我在几年之前开始使用 Vim 的原因。通常来说,Vim 会被置于传说中的 Emacs 的对立面。我承认我对 Emacs 知之甚少,但是对于它俩,你需要知道的是它们都可以被深度定制,并且在初学时也都非常令人困惑。这个教程并不会介绍有关 Vim 的所有内容,而是将介绍一些基础以使你在最初就能正确使用它,随后还会展示一些小技巧,借此(希望能)让你有能力自己去探索学习。
|
||||
|
||||
Vim 一词来源于 “VI iMproved”。Vi 是一个被广泛安装于 Unix 系统的非图形界面文本编辑器,并且它也被默认安装在了 Linux 系统中。Vim 是这个原始编辑器的增强版,但是不同于 Vi,并不是每个发行版都默认安装了它。
|
||||
|
||||
### 安装
|
||||
|
||||
在 Ubuntu 中可以使用如下命令来安装 Vim:
|
||||
|
||||
```
|
||||
sudo apt-get install vim
|
||||
```
|
||||
|
||||
如果你已经对某些插件有了兴趣,使用以下命令:
|
||||
|
||||
```
|
||||
sudo apt-cache search vim
|
||||
```
|
||||
|
||||
这命令将给你输出一个很长的和 Vim 有关的包列表。在这之中,有针对不同编程语言的工具,有插件管理器,等等。
|
||||
|
||||
在这系列教程中,我将会在 Ubuntu 上使用最新版的 Vim(7.3.154,LCTT 译注:现在最新版为 8.0)。当然你也可以使用其它任何版本。
|
||||
|
||||
### 热身
|
||||
|
||||
在终端输入 `vim` 命令,你将会看到一个非常棒的欢迎界面。
|
||||
|
||||
![vim-welcome](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2012/02/vim-welcome.jpg "vim-welcome")
|
||||
|
||||
(LCTT 译注:看到了欢迎界面中那行“Help poor children in Uganda!” 了吗?)
|
||||
|
||||
如果你之前从未使用过 Vi 或者 Vim,那么你很可能甚至不知道该怎么退出它... 是的,这是事实。**任何你常用的快捷键在 Vim 中都将失去原有的效果**。(LCTT 译注:网上有个流传的笑话——“如何制造乱码”,“让新手退出 vi”)
|
||||
|
||||
首先,要使用任何命令式的功能,像保存(save)或者退出(exit),你都先得输入一个冒号(`:`)。保存是 `:w` 而退出是 `:q`。如果你想不保存文件就退出,那么就要使用强制退出命令 `:q!`。Vim 中非常棒的一点是你不需要分开输入各个命令,换言之,如果你想保存然后退出,你就可以直接使用 `:wq`。
|
||||
|
||||
现在,我们退出 Vim 再打开一个文本文件。为此,你只需把想要编辑的文件名加在命令后面即可:
|
||||
|
||||
```
|
||||
vim [文本文件名]
|
||||
```
|
||||
|
||||
![vim-file](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2012/02/vim-file.jpg "vim-file")
|
||||
|
||||
一般而言,当你打开一个文本文件,你将会处在查看模式。这使得 Vim 与众不同并且最初会让人感到困惑。Vim 主要由两种模式构成:查看模式和编辑模式。查看模式用于查看内容并且使用一些命令。想要进入编辑模式,只需按 `i` 键进行插入(insert)或者 `a` 键进行添加(add)。想要返回到查看模式或者进行命令式功能的操作,按 `Escape` 键即可。插入(insert)和添加(add)的差异仅仅在于你是想在光标位置之前还是在光标之后进入编辑模式并进行文字输入。要想彻底地明白,你应该亲自去尝试一下。我的建议是:仅在行尾使用添加(add),而在其它时候使用插入(insert)。
|
||||
|
||||
(LCTT 译注:此段落中“查看模式”原文是 “visual mode”,疑为“view mode”,在此模式下可以查看文本,但是不能进行编辑;而“visual mode” 是编辑模式的一种,可以按 `v` 键进入,然后就可以用方向键从当前光标位置开始进行选择,并以反白的视觉效果显示,通常选择后可以按 `y` 进行复制、按 `d` 进行剪切等操作。)
|
||||
|
||||
要想在文本之中移动光标,你通常可以使用键盘上的方向键,它们无论是在查看模式还是在编辑模式都可以生效。不过,一个真正的纯粹主义者将会告诉你使用按键 `h` 向左,`j` 向下,`k` 向上,`l` 向右来(在查看模式)进行移动。
|
||||
|
||||
现在你已经明白了如何和简单地控制 Vim,我们再来更加深入一些。
|
||||
|
||||
### 一些简单命令
|
||||
|
||||
现在你已经熟悉了在正常模式和插入模式之间进行切换,下面是一些可以在正常模式中使用的命令:
|
||||
|
||||
* `x`:删除一个字符
|
||||
* `u`:撤销一个操作(相当与 `Ctrl+z`)
|
||||
* `dd`:删除一行内容
|
||||
* `dw`:删除一个单词
|
||||
* `yy`:复制一行内容
|
||||
* `yw`:复制一个单词
|
||||
* `p`:粘贴一个之前删除或复制的行或者单词
|
||||
* `e`:跳到下个单词(LCTT 译注:词尾)(比单纯用方向键更快)
|
||||
* `r`:替换一个字母(按 `r`,松开,然后再按新字母)
|
||||
|
||||
当然不止这些,不过这些对现在来说已经足够了。如果你掌握了上面的全部,你将能你很顺溜地使用 Vim 了。
|
||||
|
||||
对于那些还想知道更多的人,我再多提一下。你可以在任何这些命令之前加上一个数值,那么这个命令将被重复执行相应的次数。例如,`5x` 将在当前行连续删除 5 个字母,而 `3p` 将会粘贴 3 次。
|
||||
|
||||
### 高级命令
|
||||
|
||||
最后,作为对你自己继续探索的鼓励和示例,这里给出几个高级且常用的命令:
|
||||
|
||||
* `/所搜索的内容`:在文中搜索特定内容
|
||||
* `:sp 文本文件名`:将屏幕水平分割成上下两半,新文件展示在另一半。想要在两侧切换焦点,可以使用 `Ctrl+w` 快捷键。
|
||||
|
||||
![vim-sp](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2012/02/vim-sp.jpg "vim-sp")
|
||||
* `:vsp 文本文件名`:同上,但是是垂直分割屏幕
|
||||
* `Ctrl+Shift+C` 和 `Ctrl+Shift+V`:在终端中复制和粘贴文本
|
||||
* `:! 命令名`:在 Vim 中运行 Vim 外的终端命令,直接发送给 shell。例如,`:! ls` 将在不退出编辑器的同时,显示你当前目录内的文件。
|
||||
|
||||
![vim-ls](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2012/02/vim-ls.jpg "vim-ls")
|
||||
|
||||
### 结论
|
||||
|
||||
我觉得你现在应该已经有了足够的准备来开始使用 Vim。你还可以通过安装各种插件,编辑 `~.vimrc` 文件,或者在 shell 中输入 `vimtutor` 命令来使用交互式教程以学到更多。
|
||||
|
||||
如果你有任何你想分享的关于 Vim 的其它命令,请在评论中告知我们。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/start-with-vim-linux/
|
||||
|
||||
作者:[Himanshu Arora][a]
|
||||
译者:[Yinr](https://github.com/Yinr)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.maketecheasier.com/author/himanshu/
|
||||
[1]:https://www.maketecheasier.com/author/adrienbrochard/
|
||||
[2]:https://www.maketecheasier.com/start-with-vim-linux/#comments
|
||||
[3]:https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/
|
||||
[4]:https://www.maketecheasier.com/vim-tips-tricks-for-experienced-users/
|
||||
[5]:https://www.maketecheasier.com/vim-tips-tricks-advanced-users/
|
||||
[6]:https://www.maketecheasier.com/category/linux-tips/
|
||||
[7]:http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.maketecheasier.com%2Fstart-with-vim-linux%2F
|
||||
[8]:http://twitter.com/share?url=https%3A%2F%2Fwww.maketecheasier.com%2Fstart-with-vim-linux%2F&text=The+Beginner%26%238217%3Bs+Guide+to+Start+Using+Vim
|
||||
[9]:mailto:?subject=The%20Beginner%E2%80%99s%20Guide%20to%20Start%20Using%20Vim&body=https%3A%2F%2Fwww.maketecheasier.com%2Fstart-with-vim-linux%2F
|
||||
[10]:https://www.maketecheasier.com/turn-dropbox-into-a-blogging-tool-with-scriptogram/
|
||||
[11]:https://www.maketecheasier.com/4-sms-back-up-applications-to-keep-your-messages-safe-android/
|
||||
[12]:https://www.maketecheasier.com/series/vim-user-guide/
|
||||
[13]:https://support.google.com/adsense/troubleshooter/1631343
|
@ -0,0 +1,211 @@
|
||||
Vim 快捷键速查表
|
||||
============================================================
|
||||
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2013/12/vim-shortcut-cheatsheet-featured.jpg "Vim Keyboard Shortcuts Cheatsheets")
|
||||
|
||||
本文是 [Vim 用户指南][12] 系列的其中一篇:
|
||||
|
||||
* [Vim 初学者入门指南][3]
|
||||
* Vim 快捷键速查表
|
||||
* [5 个针对有经验用户的 Vim 技巧][4]
|
||||
* [3 个针对高级用户的 Vim 编辑器实用技巧][5]
|
||||
|
||||
Vim 编辑器是一个基于命令行的工具,是传奇编辑器 vi 的增强版。尽管图形界面的富文本编辑有很多,但是熟悉 Vim 对于每一位 Linux 的使用者都能有所帮助——无论你是经验丰富的系统管理员,还是刚上手树莓派的新手用户。
|
||||
|
||||
这个轻量级的编辑器是个非常强大的工具。在有经验的使用者手中,它能完成不可思议的任务。除了常规的文本编辑功能以外,它还支持一些进阶特性。例如,基于正则表达式的搜索和替换、编码转换,以及语法高亮、代码折叠等的编程特性。
|
||||
|
||||
使用 Vim 时有一个非常重要的一点需要注意,那就是按键的功能取决于编辑器当前的“模式”。例如,在“普通模式”输入字母`j`时,光标会向下移动一行。而当你在“插入模式”下输入字符,则只是正常的文字录入。
|
||||
|
||||
下面就是速查表,以便于你充分利用 Vim。
|
||||
|
||||
### 基本操作
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `Esc` | 从当前模式转换到“普通模式”。所有的键对应到命令。 |
|
||||
| `i` | “插入模式”用于插入文字。回归按键的本职工作。 |
|
||||
| `:` | “命令行模式” Vim 希望你输入类似于保存该文档命令的地方。 |
|
||||
|
||||
|
||||
### 方向键
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `h` | 光标向左移动一个字符 |
|
||||
| `j` 或 `Ctrl + J` | 光标向下移动一行 |
|
||||
| `k` 或 `Ctrl + P` | 光标向上移动一行 |
|
||||
| `l` | 光标向右移动一个字符 |
|
||||
| `0` | (数字 0)移动光标至本行开头 |
|
||||
| `$` | 移动光标至本行末尾 |
|
||||
| `^` | 移动光标至本行第一个非空字符处 |
|
||||
| `w` | 向前移动一个词 (上一个字母和数字组成的词之后) |
|
||||
| `W` | 向前移动一个词 (以空格分隔的词) |
|
||||
| `5w` | 向前移动五个词 |
|
||||
| `b` | 向后移动一个词 (下一个字母和数字组成的词之前) |
|
||||
| `B` | 向后移动一个词 (以空格分隔的词) |
|
||||
| `5b` | 向后移动五个词 |
|
||||
| `G` | 移动至文件末尾 |
|
||||
| `gg` | 移动至文件开头 |
|
||||
|
||||
|
||||
### 浏览文档
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `(` | 跳转到上一句 |
|
||||
| `)` | 跳转到下一句 |
|
||||
| `{` | 跳转到上一段 |
|
||||
| `}` | 跳转到下一段 |
|
||||
| `[[` | 跳转到上一部分 |
|
||||
| `]]` | 跳转到下一部分 |
|
||||
| `[]` | 跳转到上一部分的末尾 |
|
||||
| `][` | 跳转到上一部分的开头 |
|
||||
|
||||
|
||||
### 插入文本
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `a` | 在光标后插入文本 |
|
||||
| `A` | 在行末插入文本 |
|
||||
| `i` | 在光标前插入文本 |
|
||||
| `o` | (小写字母 o)在光标下方新开一行 |
|
||||
| `O` | (大写字母 O)在光标上方新开一行 |
|
||||
|
||||
|
||||
|
||||
### 特殊插入
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `:r [filename]` | 在光标下方插入文件 [filename] 的内容 |
|
||||
| `:r ![command]` | 执行命令 [command] ,并将输出插入至光标下方 |
|
||||
|
||||
|
||||
|
||||
### 删除文本
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `x` | 删除光标处字符 |
|
||||
| `dw` | 删除一个词 |
|
||||
| `d0` | 删至行首 |
|
||||
| `d$` | 删至行末 |
|
||||
| `d)` | 删至句末 |
|
||||
| `dgg` | 删至文件开头 |
|
||||
| `dG` | 删至文件末尾 |
|
||||
| `dd` | 删除该行 |
|
||||
| `3dd` | 删除三行 |
|
||||
|
||||
### 简单替换文本
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `r{text}` | 将光标处的字符替换成 {text} |
|
||||
| `R` | 进入覆写模式,输入的字符将替换原有的字符 |
|
||||
|
||||
### 复制/粘贴文本
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `yy` | 复制当前行至存储缓冲区 |
|
||||
| `["x]yy` | 复制当前行至寄存器 x |
|
||||
| `p` | 在当前行之后粘贴存储缓冲区中的内容 |
|
||||
| `P` | 在当前行之前粘贴存储缓冲区中的内容 |
|
||||
| `["x]p` | 在当前行之后粘贴寄存器 x 中的内容 |
|
||||
| `["x]P` | 在当前行之前粘贴寄存器 x 中的内容 |
|
||||
|
||||
### 撤销/重做操作
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `u` | 撤销最后的操作 |
|
||||
| `Ctrl+r` | 重做最后撤销的操作 |
|
||||
|
||||
### 搜索和替换
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `/search_text` | 检索文档,在文档后面的部分搜索 search_text |
|
||||
| `?search_text` | 检索文档,在文档前面的部分搜索 search_text |
|
||||
| `n` | 移动到后一个检索结果 |
|
||||
| `N` | 移动到前一个检索结果 |
|
||||
| `:%s/original/replacement` | 检索第一个 “original” 字符串并将其替换成 “replacement” |
|
||||
| `:%s/original/replacement/g` | 检索并将所有的 “original” 替换为 “replacement” |
|
||||
| `:%s/original/replacement/gc` | 检索出所有的 “original” 字符串,但在替换成 “replacement” 前,先询问是否替换 |
|
||||
|
||||
### 书签
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `m {a-zA-Z}` | 在当前光标位置设置书签,书签名可用一个大小写字母({a-zA-Z}) |
|
||||
| `:marks` | 列出所有书签 |
|
||||
| `{a-zA-Z}` | 跳转到书签 {a-zA-Z} |
|
||||
|
||||
|
||||
### 选择文本
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `v` | 进入逐字可视模式 |
|
||||
| `V` | 进入逐行可视模式 |
|
||||
| `Esc` | 退出可视模式 |
|
||||
|
||||
|
||||
### 改动选中文本
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `~` | 切换大小写 |
|
||||
| `d` | 删除一个词 |
|
||||
| `c` | 变更 |
|
||||
| `y` | 复制 |
|
||||
| `>` | 右移 |
|
||||
| `<` | 左移 |
|
||||
| `!` | 通过外部命令进行过滤 |
|
||||
|
||||
|
||||
### 保存并退出
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
| --- | --- |
|
||||
| `:q` | 退出 Vim,如果文件已被修改,将退出失败 |
|
||||
| `:w` | 保存文件 |
|
||||
| `:w new_name` | 用 new_name 作为文件名保存文件 |
|
||||
| `:wq` | 保存文件并退出 Vim |
|
||||
| `:q!` | 退出 Vim,不保存文件改动 |
|
||||
| `ZZ` | 退出 Vim,如果文件被改动过,保存改动内容 |
|
||||
| `ZQ` | 与 :q! 相同,退出 Vim,不保存文件改动 |
|
||||
|
||||
### 下载 Vim 快捷键速查表
|
||||
|
||||
仅仅是这样是否还不足以满足你?别担心,我们已经为你整理好了一份下载版的速查表,以备不时之需。
|
||||
|
||||
[点此下载(英文)][14]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/
|
||||
|
||||
作者:[Himanshu Arora][a]
|
||||
译者:[martin2011qi](https://github.com/martin2011qi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.maketecheasier.com/author/himanshu/
|
||||
[1]:https://www.maketecheasier.com/author/mayank/
|
||||
[2]:https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/#comments
|
||||
[3]:https://linux.cn/article-8143-1.html
|
||||
[4]:https://www.maketecheasier.com/vim-tips-tricks-for-experienced-users/
|
||||
[5]:https://www.maketecheasier.com/vim-tips-tricks-advanced-users/
|
||||
[6]:https://www.maketecheasier.com/category/linux-tips/
|
||||
[7]:http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-keyboard-shortcuts-cheatsheet%2F
|
||||
[8]:http://twitter.com/share?url=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-keyboard-shortcuts-cheatsheet%2F&text=Vim+Keyboard+Shortcuts+Cheatsheet
|
||||
[9]:mailto:?subject=Vim%20Keyboard%20Shortcuts%20Cheatsheet&body=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-keyboard-shortcuts-cheatsheet%2F
|
||||
[10]:https://www.maketecheasier.com/locate-system-image-tool-in-windows-81/
|
||||
[11]:https://www.maketecheasier.com/create-system-image-in-windows8/
|
||||
[12]:https://www.maketecheasier.com/series/vim-user-guide/
|
||||
[13]:https://support.google.com/adsense/troubleshooter/1631343
|
||||
[14]:http://www.maketecheasier.com/cheatsheet/vim-keyboard-shortcuts-cheatsheet/
|
@ -0,0 +1,133 @@
|
||||
5 个针对有经验用户的 Vim 实用技巧
|
||||
============================================================
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2014/08/vim-tips-tricks-featured.jpg "5 Vim Tips and Tricks for Experienced Userss")
|
||||
|
||||
这篇文章是 [Vim 用户指南][12]系列文章中的一篇:
|
||||
|
||||
* [Vim 初学者入门指南][3]
|
||||
* [Vim 快捷键速查表][4]
|
||||
* 5 个针对有经验用户的 Vim 实用技巧
|
||||
* [3 个针对高级用户的 Vim 编辑器实用技巧][5]
|
||||
|
||||
Vim 编辑器提供了很多的特性,要想全部掌握它们很困难。然而,花费更多的时间在命令行编辑器上总是有帮助的。毫无疑问,和 Vim 用户们进行交流能够让你更快地学习新颖有创造性的东西。
|
||||
|
||||
|
||||
**注:** 本文中用到的例子,使用的 Vim 版本是 7.4.52 。
|
||||
|
||||
### 1、 同时编辑多个文件
|
||||
|
||||
如果你是一名软件开发者或者把 Vim 作为主要的编辑器,那么可能很多时候你需要同时编辑多个文件。“紧跟(following)”是在同时编辑多个文件时可用的实用技巧。
|
||||
|
||||
不需要在多个 shell 界面中打开多个文件,你可以通过把多个文件的文件名作为 Vim 命令的参数从而在一个 shell 界面中打开多个文件。比如:
|
||||
|
||||
```
|
||||
vim 文件1 文件2 文件3
|
||||
```
|
||||
|
||||
第一个文件(例子中的文件1)将成为当前文件并被读入缓冲区。
|
||||
|
||||
在编辑器中,使用 `:next` 或 `:n` 命令来移动到下一个文件,使用 `:prev` 或 `:N` 命令返回上一个文件。如果想直接切换到第一个文件或最后一个文件,使用 `:bf` 和 `:bl` 命令。特别地,如果想打开另外的文件并编辑,使用 `:e` 命令并把文件名作为参数(如果该文件不在当前目录中则需要完整路径做为参数)。
|
||||
|
||||
任何时候如果需要列出当前打开的所有文件,使用 `:ls` 命令。看下面展示的屏幕截图。
|
||||
|
||||
![vim-ls](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2014/08/vim-ls.png "vim-ls")
|
||||
|
||||
注意 ”%a” 表示文件在当前活动窗口,而 “#” 表示上一个活动窗口的文件。
|
||||
|
||||
### 2、 通过自动补全节约时间
|
||||
|
||||
想节约时间并提高效率吗?使用缩写吧。使用它们能够快速写出文件中多次出现、复杂冗长的词。在 Vim 中缩写命令写就是 `ab` 。
|
||||
|
||||
比如,当你运行下面的命令以后:
|
||||
|
||||
```
|
||||
:ab asap as soon as possible
|
||||
```
|
||||
|
||||
文件中出现的每一个 `asap` 都会被自动替换为 `as soon as possible` ,就像你自己输入的一样。
|
||||
|
||||
类似地,你可以使用缩写来更正常见的输入错误。比如,下面的命令
|
||||
|
||||
```
|
||||
:ab recieve receive
|
||||
```
|
||||
|
||||
将会自动更正拼写错误,就像你自己输入的一样。如果在一次特殊情况下你想阻止缩写展开或更正发生,那么你只需要在输入一个单词的最后一个字母以后按 `Ctrl + V` ,然后按空格键。
|
||||
|
||||
如果你想把刚才使用的缩写保存下来,从而当你下次使用 Vim 编辑器的时候可以再次使用,那么只需将完整的 `ab` 命令(没有起始的冒号)添加到 `/etc/vim/vimrc` 文件中。如果想删除某个缩写,你可以使用 `una` 命令。比如: `una asap` 。
|
||||
|
||||
|
||||
### 3、 切分窗口便于复制/粘贴
|
||||
|
||||
有时,你需要从一个文件将一段代码或文本的一部分复制到另一个。当使用 GUI(图形界面)编辑器的时候,这很容易实现,但是当使用一个命令行编辑器的时候,这就变得比较困难并且很费时间。幸运的是, Vim 提供了一种高效、节约时间的方式来完成这件事。
|
||||
|
||||
打开两个文件中的一个然后切分 Vim 窗口来打开另一个文件。可以通过使用 `split` 命令并以文件名作为参数来完成这件事。比如:
|
||||
|
||||
```
|
||||
:split test.c
|
||||
```
|
||||
|
||||
上面的命令将分离窗口并打开文件 “test.c”
|
||||
|
||||
![vim-split](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2014/08/vim-split.png "vim-split")
|
||||
|
||||
注意到 `split` 命令水平分离 Vim 窗口。如果你想垂直分离窗口,那么你可以使用 `vsplit` 命令。当同时打开了两个文件并从一个文件中复制好内容以后,按 `Ctrl + W` 切换到另一个文件,然后粘贴。
|
||||
|
||||
### 4、 保存一个没有权限的已编辑文件
|
||||
|
||||
有时候当你对一个文件做了大量更改以后才会意识到你对该文件仅有 `只读` 权限。
|
||||
|
||||
![vim-sudo](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2014/08/vim-sudo.png "vim-sudo")
|
||||
|
||||
虽然把文件关闭,获取权限以后再重新打开是一种解决方法。但是如果你已经做了大量更改,这样做会很浪费时间,因为在这个过程中所有的更改都会丢失。 Vim 提供了一种方式来处理这种情况:你可以在编辑器中在保存文件前更改文件权限。命令是:
|
||||
|
||||
```
|
||||
:w !sudo tee %
|
||||
```
|
||||
|
||||
这个命令将会向你询问密码,就像在命令行中使用 `sudo` 一样,然后就能保存更改。
|
||||
|
||||
**一个相关的技巧**:在 Vim 中编辑一个文件的时候,如果想快速进入命令行提示符,可以在编辑器中运行 `:sh` 命令,从而你将进入一个交互的 shell 中。完成以后,运行 `exit` 命令可以快速回到 Vim 模式中。
|
||||
|
||||
### 5、 在复制/粘贴过程中保持缩进
|
||||
|
||||
大多数有经验的程序员在 Vim 上工作时都会启用自动缩进。虽然这是一个节约时间的做法,但是在粘贴一段已经缩进了的代码的时候会产生新的问题。比如,下图是我把一段已缩进代码粘贴到一个在自动缩进的 Vim 编辑器中打开的文件中时遇到的问题:
|
||||
|
||||
![vim-indentation](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2014/08/vim-indentation.png "vim-indentation")
|
||||
|
||||
这个问题的解决方法是 `pastetoggle` 选项。在 `/etc/vim/vimrc` 文件中加入下面这行内容:
|
||||
|
||||
```
|
||||
set pastetoggle=<F2>
|
||||
```
|
||||
|
||||
然后当你在 `插入` 模式中准备粘贴代码前先按 `F2` 键,就不会再出现上图中的问题,这样会保留原始的缩进。注意,你可以用其他的任何键来代替 `F2`,如果它已经映射到了别的功能上。
|
||||
|
||||
### 结论
|
||||
|
||||
更进一步的提高你的 Vim 编辑器技巧的唯一方法是,在你日复一日的工作中使用命令行编辑器。留意那些耗时多的操作,然后尝试去寻找是否有编辑器命令可以很快地完成这个操作。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/vim-tips-tricks-for-experienced-users/
|
||||
|
||||
作者:[Himanshu Arora][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.maketecheasier.com/author/himanshu/
|
||||
[1]:https://www.maketecheasier.com/author/himanshu/
|
||||
[2]:https://www.maketecheasier.com/vim-tips-tricks-for-experienced-users/#comments
|
||||
[3]:https://www.maketecheasier.com/start-with-vim-linux/
|
||||
[4]:https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/
|
||||
[5]:https://www.maketecheasier.com/vim-tips-tricks-advanced-users/
|
||||
[6]:https://www.maketecheasier.com/category/linux-tips/
|
||||
[7]:http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-tips-tricks-for-experienced-users%2F
|
||||
[8]:http://twitter.com/share?url=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-tips-tricks-for-experienced-users%2F&text=5+Vim+Tips+and+Tricks+for+Experienced+Users
|
||||
[9]:mailto:?subject=5%20Vim%20Tips%20and%20Tricks%20for%20Experienced%20Users&body=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-tips-tricks-for-experienced-users%2F
|
||||
[10]:https://www.maketecheasier.com/enable-two-step-verification-apple-icloud-account/
|
||||
[11]:https://www.maketecheasier.com/mistakes-wordpress-user-should-avoid/
|
||||
[12]:https://www.maketecheasier.com/series/vim-user-guide/
|
||||
[13]:https://support.google.com/adsense/troubleshooter/1631343
|
@ -0,0 +1,73 @@
|
||||
aria2 与 wget :选择你的下载管理器
|
||||
============================================================
|
||||
|
||||
任何没有下载管理器的 Linux 操作系统是不完整的。多年来,基于 Linux 的发行版使用 wget 作为默认下载管理器。它是一个很棒的小程序,可以在命令行下工作,如果你需要安装东西、下载东西、运行 shell 脚本等,某种程度上都可以在 wget 中完成任务。在过去的很多年里,我们发现 wget 缺乏一些高级的功能,而它的替代品 ** aria2** ,由于满足了高级 Linux 用户的渴望而受到了许多用户的关注。我们将在本文中回顾 **aria2** 的安装过程以及 wget 和 aria2 之间的区别,因此你可以决定哪个下载管理器最符合你的需要。
|
||||
|
||||
### 安装 aria2
|
||||
|
||||
**在 Ubuntu/Debian 中安装 aria2:**
|
||||
|
||||
只要在 Ubuntu 中运行下面的命令安装:
|
||||
|
||||
```
|
||||
sudo apt-get install aria2
|
||||
```
|
||||
|
||||
[
|
||||
![aria2](http://linuxpitstop.com/wp-content/uploads/2015/06/aria2.png)
|
||||
][1]
|
||||
|
||||
**在 Fedora/RHEL/Centos 中安装 aria2:**
|
||||
|
||||
运行下面的命令在 Fedora/RHEL 和基于 Centos 的系统中安装:
|
||||
|
||||
```
|
||||
sudo yum install aria2
|
||||
```
|
||||
|
||||
**在 Arch Linux 中安装 aria2:**
|
||||
|
||||
运行下面的命令在基于 Arch Linux 的系统中安装。
|
||||
|
||||
```
|
||||
sudo pacman -Sy aria2
|
||||
```
|
||||
|
||||
### aria2 的重要功能
|
||||
|
||||
让我们来讨论 aria2 中使它如此受欢迎的重要功能:
|
||||
|
||||
* 通过使用多个连接下载文件,最大限度地利用可用带宽。
|
||||
* 同时下载多个文件和同时下载的能力。
|
||||
* torrent 客户端提供的所有功能都可以在这个小程序中找到。
|
||||
* 它提供 meta 链接下载。
|
||||
* 支持使用 JSON-RPC 和 XML-RPC 协议的远程过程调用。
|
||||
* 无需等待当前下载完成,轻松批量下载文件。
|
||||
|
||||
### aria2 的一些副作用:
|
||||
|
||||
aria2 的多线程机制可能会使目标服务器过载。相比下来 wget 就轻量级多了,wget 比 aria2 消耗资源少 20%。aria2 尚未经受 wget 那样巨大的使用规模的测试,因此可能完全准备好成为默认下载管理器。
|
||||
|
||||
### wget 的重要特性
|
||||
|
||||
* 当然它是最广泛使用和测试的下载管理器。
|
||||
* 它是一个简单的程序,具有较少的功能,但稳定工作了几十年。
|
||||
* 默认所有 Linux 发行版上都有,不需要繁重的安装。
|
||||
* 与 aria2 相比更轻量级。
|
||||
|
||||
### 总结
|
||||
|
||||
虽然 wget 没有丰富的功能,但仍然工作得相当不错,然而,高级用户肯定会喜欢 aria2,因为它满足更快和并发下载的需要。aria2 可能需要很长时间来取代 wget 成为默认下载管理器,而目前 wget 用在几乎所有 linux 发行版的安装程序脚本中。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://linuxpitstop.com/aria-2-vs-wget/
|
||||
|
||||
作者:[Aun][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://linuxpitstop.com/author/aun/
|
||||
[1]:http://linuxpitstop.com/wp-content/uploads/2015/06/aria2.png
|
@ -0,0 +1,256 @@
|
||||
Powerline:给 Vim 和 Bash 提供更棒的状态行和提示信息
|
||||
=================================================
|
||||
|
||||
Powerline 是一个极棒的 [Vim 编辑器][1]的状态行插件,这个插件是使用 Python 开发的,主要用于显示状态行和提示信息,适用于很多软件,比如 bash、zsh、tmux 等等。
|
||||
|
||||
[
|
||||
![Install Powerline Statuslines in Linux](http://www.tecmint.com/wp-content/uploads/2015/10/Install-Powerline-Statuslines-in-Linux-620x297.png)
|
||||
][2]
|
||||
|
||||
*Powerline 使 Linux 终端更具威力*
|
||||
|
||||
### 特色
|
||||
|
||||
1. 使用 python 编写,使其更具扩展性且功能丰富
|
||||
2. 稳定易测的代码库,兼容 python 2.6+ 和 python 3
|
||||
3. 支持多种 Linux 功能及工具的提示和状态栏
|
||||
4. 通过 JSON 保存配置和颜色方案
|
||||
5. 快速、轻量级,具有后台守护进程支持,提供更佳的性能
|
||||
|
||||
### Powerline 效果截图
|
||||
|
||||
[
|
||||
![Powerline Vim Statuslines](http://www.tecmint.com/wp-content/uploads/2015/10/Powerline-Vim-Statuslines.png)
|
||||
][3]
|
||||
|
||||
*Vim 中 Powerline 状态行效果*
|
||||
|
||||
在本文中,我会介绍如何安装 Powerline 及其字体,以及如何在 RedHat 和 Debian 类的系统中使 Bash 和 Vim 支持 Powerline。
|
||||
|
||||
### 第一步:准备好安装 Powerline 所需的软件
|
||||
|
||||
由于和其它无关项目之间存在命名冲突,因此 powerline 只能放在 PyPI(Python Package Index)中的 `powerline-status` 包下.
|
||||
|
||||
为了从 PyPI 中安装该包,需要先准备好 `pip`(该工具专门用于 Python 包的管理)工具。所以首先要在 Linux 系统下安装好 `pip` 工具。
|
||||
|
||||
#### 在 Debian、Ubuntu 和 Linux Mint 中安装 pip
|
||||
|
||||
```
|
||||
# apt-get install python-pip
|
||||
```
|
||||
**示例输出:**
|
||||
|
||||
```
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
Recommended packages:
|
||||
python-dev-all python-wheel
|
||||
The following NEW packages will be installed:
|
||||
python-pip
|
||||
0 upgraded, 1 newly installed, 0 to remove and 533 not upgraded.
|
||||
Need to get 97.2 kB of archives.
|
||||
After this operation, 477 kB of additional disk space will be used.
|
||||
Get:1 http://archive.ubuntu.com/ubuntu/ trusty-updates/universe python-pip all 1.5.4-1ubuntu3 [97.2 kB]
|
||||
Fetched 97.2 kB in 1s (73.0 kB/s)
|
||||
Selecting previously unselected package python-pip.
|
||||
(Reading database ... 216258 files and directories currently installed.)
|
||||
Preparing to unpack .../python-pip_1.5.4-1ubuntu3_all.deb ...
|
||||
Unpacking python-pip (1.5.4-1ubuntu3) ...
|
||||
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
|
||||
Setting up python-pip (1.5.4-1ubuntu3) ...
|
||||
```
|
||||
|
||||
#### 在 CentOS、RHEL 和 Fedora 中安装 pip
|
||||
|
||||
在 Fedora 类系统中,需要先打开 [epel 仓库][4],然后按照如下方法安装 pip 包。
|
||||
|
||||
```
|
||||
# yum install python-pip
|
||||
# dnf install python-pip [Fedora 22+ 以上]
|
||||
```
|
||||
|
||||
**示例输出:**
|
||||
|
||||
```
|
||||
Installing:
|
||||
python-pip noarch 7.1.0-1.el7 epel 1.5 M
|
||||
Transaction Summary
|
||||
=================================================================================
|
||||
Install 1 Package
|
||||
Total download size: 1.5 M
|
||||
Installed size: 6.6 M
|
||||
Is this ok [y/d/N]: y
|
||||
Downloading packages:
|
||||
python-pip-7.1.0-1.el7.noarch.rpm | 1.5 MB 00:00:01
|
||||
Running transaction check
|
||||
Running transaction test
|
||||
Transaction test succeeded
|
||||
Running transaction
|
||||
Installing : python-pip-7.1.0-1.el7.noarch 1/1
|
||||
Verifying : python-pip-7.1.0-1.el7.noarch 1/1
|
||||
Installed:
|
||||
python-pip.noarch 0:7.1.0-1.el7
|
||||
Complete!
|
||||
```
|
||||
|
||||
### 第二步:在 Linux 中安装 Powerline
|
||||
|
||||
现在可以从 Git 仓库中安装 Powerline 的最新开发版。在此之前系统需要安装好 Git 工具以便可以从仓库拉下代码。
|
||||
|
||||
```
|
||||
# apt-get install git
|
||||
# yum install git
|
||||
# dnf install git
|
||||
```
|
||||
|
||||
然后你可以通过 `pip` 命令安装 Powerline。
|
||||
|
||||
```
|
||||
# pip install git+git://github.com/Lokaltog/powerline
|
||||
```
|
||||
|
||||
**示例输出:**
|
||||
|
||||
```
|
||||
Cloning git://github.com/Lokaltog/powerline to /tmp/pip-WAlznH-build
|
||||
Running setup.py (path:/tmp/pip-WAlznH-build/setup.py) egg_info for package from git+git://github.com/Lokaltog/powerline
|
||||
warning: no previously-included files matching '*.pyc' found under directory 'powerline/bindings'
|
||||
warning: no previously-included files matching '*.pyo' found under directory 'powerline/bindings'
|
||||
Installing collected packages: powerline-status
|
||||
Found existing installation: powerline-status 2.2
|
||||
Uninstalling powerline-status:
|
||||
Successfully uninstalled powerline-status
|
||||
Running setup.py install for powerline-status
|
||||
warning: no previously-included files matching '*.pyc' found under directory 'powerline/bindings'
|
||||
warning: no previously-included files matching '*.pyo' found under directory 'powerline/bindings'
|
||||
changing mode of build/scripts-2.7/powerline-lint from 644 to 755
|
||||
changing mode of build/scripts-2.7/powerline-daemon from 644 to 755
|
||||
changing mode of build/scripts-2.7/powerline-render from 644 to 755
|
||||
changing mode of build/scripts-2.7/powerline-config from 644 to 755
|
||||
changing mode of /usr/local/bin/powerline-config to 755
|
||||
changing mode of /usr/local/bin/powerline-lint to 755
|
||||
changing mode of /usr/local/bin/powerline-render to 755
|
||||
changing mode of /usr/local/bin/powerline-daemon to 755
|
||||
Successfully installed powerline-status
|
||||
Cleaning up...
|
||||
```
|
||||
|
||||
### 第三步:在 Linux 中安装 Powerline 的字体
|
||||
|
||||
Powerline 使用特殊的符号来为开发者显示特殊的箭头效果和符号内容。因此你的系统中必须要有符号字体或者补丁过的字体。
|
||||
|
||||
通过下面的 [wget][5] 命令下载最新的系统字体及字体配置文件。
|
||||
|
||||
```
|
||||
# wget https://github.com/powerline/powerline/raw/develop/font/PowerlineSymbols.otf
|
||||
# wget https://github.com/powerline/powerline/raw/develop/font/10-powerline-symbols.conf
|
||||
```
|
||||
|
||||
然后你将下载的字体放到字体目录下 `/usr/share/fonts` 或者 `/usr/local/share/fonts`,或者你可以通过 `xset q` 命令找到一个有效的字体目录。
|
||||
|
||||
```
|
||||
# mv PowerlineSymbols.otf /usr/share/fonts/
|
||||
```
|
||||
|
||||
接下来你需要通过如下命令更新你系统的字体缓存。
|
||||
|
||||
```
|
||||
# fc-cache -vf /usr/share/fonts/
|
||||
```
|
||||
|
||||
其次安装字体配置文件。
|
||||
|
||||
```
|
||||
# mv 10-powerline-symbols.conf /etc/fonts/conf.d/
|
||||
```
|
||||
|
||||
注意:如果相应的符号没有出现,可以尝试关闭终端会话并重启 X window,这样就会生效了。
|
||||
|
||||
### 第四步:给 Bash Shell 和 Vim 状态行设置 Powerline
|
||||
|
||||
在这一节将介绍 bash shell 和 vim 编辑器中关于 Powerline 的配置。首先通过在 `~/.bashrc` 中添加如下内容以便设置终端为 256 色。
|
||||
|
||||
```
|
||||
export TERM="screen-256color"
|
||||
```
|
||||
|
||||
#### 打开 Bash Shell 中的 Powerline
|
||||
|
||||
如果希望在 bash shell 中默认打开 Powerline,可以在 `~/.bashrc` 中添加如下内容。
|
||||
|
||||
首先通过如下命令获取 powerline 的安装位置。
|
||||
|
||||
```
|
||||
# pip show powerline-status
|
||||
Name: powerline-status
|
||||
Version: 2.2.dev9999-git.aa33599e3fb363ab7f2744ce95b7c6465eef7f08
|
||||
Location: /usr/local/lib/python2.7/dist-packages
|
||||
Requires:
|
||||
```
|
||||
|
||||
一旦找到 powerline 的具体位置后,根据你系统的情况替换到下列行中的 `/usr/local/lib/python2.7/dist-packages` 对应的位置。
|
||||
|
||||
```
|
||||
powerline-daemon -q
|
||||
POWERLINE_BASH_CONTINUATION=1
|
||||
POWERLINE_BASH_SELECT=1
|
||||
. /usr/local/lib/python2.7/dist-packages/powerline/bindings/bash/powerline.sh
|
||||
```
|
||||
|
||||
然后退出后重新登录,现在 powerline 的状态行应该如下显示了。
|
||||
|
||||
[
|
||||
![Bash Powerline Statuslines](http://www.tecmint.com/wp-content/uploads/2015/10/Bash-Powerline-Statuslines.gif)
|
||||
][6]
|
||||
|
||||
现在切换目录并注意显示你当前路径的面包屑导航提示的变化。
|
||||
|
||||
如果远程 Linux 服务器上安装了 powerline,你能看到后台挂起的任务,当你用 ssh 登录上去时,会看到该提示增加了主机名。
|
||||
|
||||
#### 在 Vim 中打开 Powerline
|
||||
|
||||
如果你喜欢使用 vim,正好有一个 vim 的强力插件。可以在 `~/.vimrc` 中添加如下内容打开该插件(LCTT 译注:注意同样需要根据你的系统情况修改路径)。
|
||||
|
||||
```
|
||||
set rtp+=/usr/local/lib/python2.7/dist-packages/powerline/bindings/vim/
|
||||
set laststatus=2
|
||||
set t_Co=256
|
||||
```
|
||||
|
||||
然后你打开 vim 后会看到一个新的状态行:
|
||||
|
||||
[
|
||||
![Vim Powerline Statuslines](http://www.tecmint.com/wp-content/uploads/2015/10/Vim-Powerline-Statuslines.gif)
|
||||
][7]
|
||||
|
||||
### 总结
|
||||
|
||||
Powerline 可以在某些软件中提供颜色鲜艳、很优美的状态行及提示内容,这对编程环境有利。希望这篇指南对您有帮助,如果您需要帮助或者有任何好的想法,请留言给我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/7badddbc53297b2e8ed7011cf45df0c0?s=128&d=blank&r=g)
|
||||
|
||||
我是Ravi Saive,TecMint的作者。一个喜欢分享诀窍和想法的电脑极客及Linux专家。我的大部分服务都运行在开源平台Linux中。关注我的Twitter,Facebook和Google+。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/powerline-adds-powerful-statuslines-and-prompts-to-vim-and-bash/
|
||||
|
||||
作者:[Ravi Saive][a]
|
||||
译者:[beyondworld](https://github.com/beyondworld)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/admin/
|
||||
[1]:http://www.tecmint.com/vi-editor-usage/
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2015/10/Install-Powerline-Statuslines-in-Linux.png
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2015/10/Powerline-Vim-Statuslines.png
|
||||
[4]:https://linux.cn/article-2324-1.html
|
||||
[5]:http://www.tecmint.com/10-wget-command-examples-in-linux/
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2015/10/Bash-Powerline-Statuslines.gif
|
||||
[7]:http://www.tecmint.com/wp-content/uploads/2015/10/Vim-Powerline-Statuslines.gif
|
@ -0,0 +1,212 @@
|
||||
3 个在 Linux 中永久并安全删除文件和目录的方法
|
||||
============================================================
|
||||
|
||||
在大多数情况下,我们习惯于使用 `Delete` 键、垃圾箱或 `rm` 命令[从我们的计算机中删除文件][1],但这不是永久安全地从硬盘中(或任何存储介质)删除文件的方法。
|
||||
|
||||
该文件只是对用户隐藏,它驻留在硬盘上的某个地方。它有可能被数据窃贼、执法取证或其它方式来恢复。
|
||||
|
||||
假设文件包含密级或机密内容,例如安全系统的用户名和密码,具有必要知识和技能的攻击者可以轻松地[恢复删除文件的副本][2]并访问这些用户凭证(你可以猜测到这种情况的后果)。
|
||||
|
||||
在本文中,我们将解释一些命令行工具,用于永久并安全地删除 Linux 中的文件。
|
||||
|
||||
### 1、 shred – 覆盖文件来隐藏内容
|
||||
|
||||
`shred` 会覆盖文件来隐藏它的内容,并且也可以选择删除它。
|
||||
|
||||
```
|
||||
$ shred -zvu -n 5 passwords.list
|
||||
```
|
||||
|
||||
在下面的命令中,选项有:
|
||||
|
||||
1. `-z` - 用零覆盖以隐藏碎片
|
||||
2. `-v` - 显示操作进度
|
||||
3. `-u` - 在覆盖后截断并删除文件
|
||||
4. `-n` - 指定覆盖文件内容的次数(默认值为3)
|
||||
|
||||
[
|
||||
![shred - overwrite a file to hide its contents](http://www.tecmint.com/wp-content/uploads/2017/01/shred-command-example.png)
|
||||
][3]
|
||||
|
||||
*shred - 覆盖文件来隐藏它的内容*
|
||||
|
||||
你可以在 `shred` 的帮助页中找到更多的用法选项和信息:
|
||||
|
||||
```
|
||||
$ man shred
|
||||
```
|
||||
|
||||
### 2、 wipe – 在 Linux 中安全删除文件
|
||||
|
||||
`wipe` 命令可以安全地擦除磁盘中的文件,从而不可能[恢复删除的文件或目录内容][4]。
|
||||
|
||||
首先,你需要安装 `wipe` 工具,运行以下适当的命令:
|
||||
|
||||
```
|
||||
$ sudo apt-get install wipe [Debian 及其衍生版]
|
||||
$ sudo yum install wipe [基于 RedHat 的系统]
|
||||
```
|
||||
|
||||
下面的命令会销毁 private 目录下的所有文件。
|
||||
|
||||
```
|
||||
$ wipe -rfi private/*
|
||||
```
|
||||
|
||||
当使用下面的标志时:
|
||||
|
||||
1. `-r` - 告诉 `wipe` 递归地擦除子目录
|
||||
2. `-f` - 启用强制删除并禁用确认查询
|
||||
3. `-i` - 显示擦除进度
|
||||
|
||||
[
|
||||
![Wipe - Securely Erase Files in Linux](http://www.tecmint.com/wp-content/uploads/2017/01/Wipe-Securely-Erase-Files.png)
|
||||
][5]
|
||||
|
||||
*wipe – 在 Linux 中安全擦除文件*
|
||||
|
||||
注意:`wipe` 仅可以在磁性存储上可以可靠地工作,因此对固态磁盘(内存)请使用其他方法。
|
||||
|
||||
阅读 `wipe` 手册以获取其他使用选项和说明:
|
||||
|
||||
```
|
||||
$ man wipe
|
||||
```
|
||||
|
||||
### 3、 Linux 中的安全删除工具集
|
||||
|
||||
secure-delete 是一个安全文件删除工具的集合,它包含用于安全删除文件的 `srm`(secure_deletion)工具。
|
||||
|
||||
首先,你需要使用以下相关命令安装它:
|
||||
|
||||
```
|
||||
$ sudo apt-get install secure-delete [On Debian and its derivatives]
|
||||
$ sudo yum install secure-delete [On RedHat based systems]
|
||||
```
|
||||
|
||||
安装完成后,你可以使用 `srm` 工具在 Linux 中安全地删除文件和目录。
|
||||
|
||||
```
|
||||
$ srm -vz private/*
|
||||
```
|
||||
|
||||
下面是使用的选项:
|
||||
|
||||
1. `-v` – 启用 verbose 模式
|
||||
2. `-z` – 用0而不是随机数据来擦除最后的写入
|
||||
|
||||
[
|
||||
![srm - Securely Delete Files in Linux ](http://www.tecmint.com/wp-content/uploads/2017/01/srm-securely-delete-Files-in-Linux.png)
|
||||
][6]
|
||||
|
||||
*srm – 在 Linux 中安全删除文件*
|
||||
|
||||
阅读 srm 手册来获取更多的使用选项和信息:
|
||||
|
||||
```
|
||||
$ man srm
|
||||
```
|
||||
|
||||
### 4、 sfill -安全免费的磁盘 / inode 空间擦除器
|
||||
|
||||
`sfill` 是 secure-deletetion 工具包的一部分,是一个安全免费的磁盘和 inode 空间擦除器,它以安全的方法删除可用磁盘空间中的文件。 `sfill` 会[检查指定分区上的可用空间][7],并使用来自 `/dev/urandom` 的随机数据填充它。
|
||||
|
||||
以下命令将在我的根分区上执行 `sfill`,使用 `-v' 选项启用 verbose 模式:
|
||||
|
||||
```
|
||||
$ sudo sfill -v /home/aaronkilik/tmp/
|
||||
```
|
||||
|
||||
假设你创建了一个单独的分区 `/home` 来存储正常的系统用户主目录,你可以在该分区上指定一个目录,以便在其上应用 `sfill`:
|
||||
|
||||
```
|
||||
$ sudo sfill -v /home/username
|
||||
```
|
||||
|
||||
你可以在 sfill 的手册上看到一些限制,你也可以看到额外的使用标志和命令:
|
||||
|
||||
```
|
||||
$ man sfill
|
||||
```
|
||||
|
||||
注意:secure-deletetion 工具包中的另外两个工具(`sswap` 和 `sdmem`)与本指南的范围不直接相关,但是,为了将来的使用和传播知识的目的,我们会在下面介绍它们。
|
||||
|
||||
### 5、 sswap – 安全 swap 擦除器
|
||||
|
||||
它是一个安全的分区擦除器,`sswap` 以安全的方式删除 swap 分区上存在的数据。
|
||||
|
||||
警告:请记住在使用 `sswap` 之前卸载 swap 分区! 否则你的系统可能会崩溃!
|
||||
|
||||
要找到交换分区(并检查分页和交换设备/文件是否已经使用,请使用 `swapon` 命令),接下来,使用 `swapoff` 命令禁用分页和交换设备/文件(使 swap 分区不可用)。
|
||||
|
||||
然后在(关闭的) swap 分区上运行 `sswap` 命令:
|
||||
|
||||
```
|
||||
$ cat /proc/swaps
|
||||
$ swapon
|
||||
$ sudo swapoff /dev/sda6
|
||||
$ sudo sswap /dev/sda6 #this command may take some time to complete with 38 default passes
|
||||
```
|
||||
|
||||
[
|
||||
![sswap - Secure Swap Wiper](http://www.tecmint.com/wp-content/uploads/2017/01/sswap-Secure-Swap-Wiper.png)
|
||||
][8]
|
||||
|
||||
*sswap – 安全 swap 擦除器*
|
||||
|
||||
阅读 `sswap` 的手册来获取更多的选项和信息:
|
||||
|
||||
```
|
||||
$ man sswap
|
||||
```
|
||||
|
||||
### 6、 sdmem – 安全内存擦除器
|
||||
|
||||
`sdmem` 是一个安全的内存擦除器,其设计目的是以安全的方式删除存储器(RAM)中的数据。
|
||||
|
||||
它最初命名为 [smem][9],但是因为在 Debain 系统上存在另一个包 [smem - 报告每个进程和每个用户的内存消耗][10],开发人员决定将它重命名为 `sdmem`。
|
||||
|
||||
```
|
||||
$ sudo sdmem -f -v
|
||||
```
|
||||
|
||||
关于更多的使用信息,阅读 `sdmen` 的手册:
|
||||
|
||||
```
|
||||
$ man sdmem
|
||||
```
|
||||
|
||||
**推荐阅读:** [在 Linux 系统下使用 PhotoRec & TestDisk 工具来恢复文件][11]。
|
||||
|
||||
就是这样了!在本文中,我们查看了一系列可以永久安全地删除 Linux 中的文件的工具。像往常一样,通过下面的评论栏发表你对本篇文章的想法或建议。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是一个 Linux 系统及 F.O.S.S 爱好者,即将成为一名系统管理员及 Web 开发人员,他现在是 TecMint 网站的内容创建者,他喜欢使用电脑来工作,并且他坚信分享知识是一种美德。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/admin/
|
||||
[1]:https://linux.cn/article-7954-1.html
|
||||
[2]:https://linux.cn/article-8122-1.html
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2017/01/shred-command-example.png
|
||||
[4]:https://linux.cn/article-7974-1.html
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2017/01/Wipe-Securely-Erase-Files.png
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2017/01/srm-securely-delete-Files-in-Linux.png
|
||||
[7]:https://linux.cn/article-8024-1.html
|
||||
[8]:http://www.tecmint.com/wp-content/uploads/2017/01/sswap-Secure-Swap-Wiper.png
|
||||
[9]:https://linux.cn/article-7681-1.html
|
||||
[10]:https://linux.cn/article-7681-1.html
|
||||
[11]:https://linux.cn/article-8122-1.html
|
220
published/201701/20160610 Setting Up Real-Time Monitoring with Ganglia.md
Executable file
220
published/201701/20160610 Setting Up Real-Time Monitoring with Ganglia.md
Executable file
@ -0,0 +1,220 @@
|
||||
使用 Ganglia 对 linux 网格和集群服务器进行实时监控
|
||||
===========
|
||||
|
||||
从系统管理员接手服务器和主机管理以来,像应用监控这样的工具就成了他们的好帮手。其中比较有名的有 [Nagios][11]、 [Zabbix][10]、 [Icinga][9] 和 Centreon。以上这些是重量级的监控工具,让一个新手管理员来设置,并使用其中的高级特性是有些困难的。
|
||||
|
||||
本文将向你介绍 Ganglia,它是一个易于扩展的监控系统。使用它可以实时查看 Linux 服务器和集群(图形化展示)中的各项性能指标。
|
||||
|
||||
![Install Gangila Monitoring in Linux](http://www.tecmint.com/wp-content/uploads/2016/06/Install-Gangila-Monitoring-in-Linux.png)
|
||||
|
||||
*在 Linux 上安装 Ganglia*
|
||||
|
||||
**Ganglia** 能够让你以**集群**(按服务器组)和**网格**(按地理位置)的方式更好地组织服务器。
|
||||
|
||||
这样,我们可以创建一个包含所有远程主机的网格,然后将那些机器按照其它标准分组成小的集合。
|
||||
|
||||
此外, Ganglia 的 web 页面对移动设备进行过优化,也允许你导出 `csv` 和 `.json` 格式的数据。
|
||||
|
||||
我们的测试环境包括一个安装 Ganglia 的主节点服务器 CentOS 7 (IP 地址 192.168.0.29),和一个作为被监控端的 Ubuntu 14.04 主机(192.168.0.32)。我们将通过 Ganglia 的 Web 页面来监控这台 Ubuntu 主机。
|
||||
|
||||
下面的例子可以给大家提供参考,CentOS7 作为主节点,Ubuntu 作为被监控对象。
|
||||
|
||||
### 安装和配置 Ganglia
|
||||
|
||||
请遵循以下步骤,在主节点服务器安装监控工具。
|
||||
|
||||
1、 启用 [EPEL 仓库][7] ,然后安装 Ganglia 和相关工具:
|
||||
|
||||
```
|
||||
# yum update && yum install epel-release
|
||||
# yum install ganglia rrdtool ganglia-gmetad ganglia-gmond ganglia-web
|
||||
```
|
||||
|
||||
在上面这步随 Ganglia 将安装一些应用,它们的功能如下:
|
||||
|
||||
- `rrdtool`,Round-Robin 数据库,它是一个储存并图形化显示随着时间变化的数据的工具;
|
||||
- `ganglia-gmetad` 一个守护进程,用来收集被监控主机的数据。被监控主机与主节点主机都要安装 Ganglia-gmond(监控守护进程本身);
|
||||
- `ganglia-web` 提供 Web 前端,用于显示监控系统的历史数据和图形。
|
||||
|
||||
2、 使用 Apache 提供的基本认证功能,为 Ganglia Web 界面(`/usr/share/ganglia`)配置身份认证。
|
||||
|
||||
如果你想了解更多高级安全机制,请参阅 Apache 文档的 [授权与认证][6]部分。
|
||||
|
||||
为完成这个目标,我们需要创建一个用户名并设定一个密码,以访问被 Apache 保护的资源。在本例中,我们先来创建一个叫 `adminganglia` 的用户名,然后给它分配一个密码,它将被储存在 `/etc/httpd/auth.basic`(可以随意选择另一个目录 和/或 文件名, 只要 Apache 对此有读取权限就可以。)
|
||||
|
||||
```
|
||||
# htpasswd -c /etc/httpd/auth.basic adminganglia
|
||||
```
|
||||
|
||||
给 adminganglia 输入两次密码完成密码设置。
|
||||
|
||||
3、 修改配置文件 `/etc/httpd/conf.d/ganglia.conf`:
|
||||
|
||||
```
|
||||
Alias /ganglia /usr/share/ganglia
|
||||
<Location /ganglia>
|
||||
AuthType basic
|
||||
AuthName "Ganglia web UI"
|
||||
AuthBasicProvider file
|
||||
AuthUserFile "/etc/httpd/auth.basic"
|
||||
Require user adminganglia
|
||||
</Location>
|
||||
```
|
||||
|
||||
4、 编辑 `/etc/ganglia/gmetad.conf`:
|
||||
|
||||
首先,使用 `gridname` 指令来为网格设置一个描述性名称。
|
||||
|
||||
```
|
||||
gridname "Home office"
|
||||
```
|
||||
|
||||
然后,使用 `data_source` 指令,后面跟集群名(服务器组)、轮询时间间隔(秒)、主节点主机和被监控节点的 IP 地址:
|
||||
|
||||
```
|
||||
data_source "Labs" 60 192.168.0.29:8649 # 主节点
|
||||
data_source "Labs" 60 192.168.0.32 # 被监控节点
|
||||
```
|
||||
|
||||
5、 编辑 `/etc/ganglia/gmond.conf`。
|
||||
|
||||
a) 确保集群的配置类似下面。
|
||||
|
||||
```
|
||||
cluster {
|
||||
name = "Labs" # gmetad.conf 中的 data_source 指令的名字
|
||||
owner = "unspecified"
|
||||
latlong = "unspecified"
|
||||
url = "unspecified"
|
||||
}
|
||||
```
|
||||
|
||||
b) 在 `udp_send_chanel` 中,注释掉 `mcast_join`:
|
||||
|
||||
```
|
||||
udp_send_channel {
|
||||
# mcast_join = 239.2.11.71
|
||||
host = localhost
|
||||
port = 8649
|
||||
ttl = 1
|
||||
}
|
||||
```
|
||||
|
||||
c) 在 `udp_recv_channel` 中,注释掉 `mcast_join` 和 `bind` 部分:
|
||||
|
||||
```
|
||||
udp_recv_channel {
|
||||
# mcast_join = 239.2.11.71 ## comment out
|
||||
port = 8649
|
||||
# bind = 239.2.11.71 ## comment out
|
||||
}
|
||||
```
|
||||
|
||||
保存并退出。
|
||||
|
||||
6、打开 8649/udp 端口,使用 SELinux 确保 php 脚本(通过 Apache 运行)能够连接到网络:
|
||||
|
||||
```
|
||||
# firewall-cmd --add-port=8649/udp
|
||||
# firewall-cmd --add-port=8649/udp --permanent
|
||||
# setsebool -P httpd_can_network_connect 1
|
||||
```
|
||||
|
||||
7、重启 Apache、gmetad、gmond,并确保它们启用了“开机启动”。
|
||||
|
||||
```
|
||||
# systemctl restart httpd gmetad gmond
|
||||
# systemctl enable httpd gmetad httpd
|
||||
```
|
||||
|
||||
至此,我们现在能够打开 Ganglia 的 Web 页面 `http://192.168.0.29/ganglia` 并用步骤 2 中设置的凭证登录。
|
||||
|
||||
[![Gangila Web Interface](http://www.tecmint.com/wp-content/uploads/2016/06/Gangila-Web-Interface.png)][5]
|
||||
|
||||
*Gangila Web 页面*
|
||||
|
||||
8、 在 **Ubuntu** 主机上,只需安装 Ganglia-monitor,等同于 CentOS 上的 ganglia-gmond:
|
||||
|
||||
```
|
||||
$ sudo aptitude update && aptitude install ganglia-monitor
|
||||
|
||||
```
|
||||
|
||||
9、 编辑被监控主机的 `/etc/ganglia/gmond.conf` 文件。与主节点主机上是相同的文件,除了被注释掉的 `cluster`, `udp_send_channel` , `udp_recv_channel` 这里不应被注释:
|
||||
|
||||
```
|
||||
cluster {
|
||||
name = "Labs" # The name in the data_source directive in gmetad.conf
|
||||
owner = "unspecified"
|
||||
latlong = "unspecified"
|
||||
url = "unspecified"
|
||||
}
|
||||
udp_send_channel {
|
||||
mcast_join = 239.2.11.71
|
||||
host = localhost
|
||||
port = 8649
|
||||
ttl = 1
|
||||
}
|
||||
udp_recv_channel {
|
||||
mcast_join = 239.2.11.71 ## comment out
|
||||
port = 8649
|
||||
bind = 239.2.11.71 ## comment out
|
||||
}
|
||||
```
|
||||
|
||||
之后重启服务。
|
||||
|
||||
```
|
||||
$ sudo service ganglia-monitor restart
|
||||
```
|
||||
|
||||
10、 刷新页面,你将在 Home office grid / Labs cluster 中看到两台主机的各种统计及图形化的展示(用下拉菜单选择集群,本例中为 Labs):
|
||||
|
||||
[![Ganglia Home Office Grid Report](http://www.tecmint.com/wp-content/uploads/2016/06/Ganglia-Home-Office-Grid-Report.png)][4]
|
||||
|
||||
*Ganglia 中 Home office 网格报告*
|
||||
|
||||
使用菜单按钮(如上指出的),你可以获取到每台服务器和集群的信息。还可以使用 <ruby>对比主机</ruby>Compare Hosts<rt></rt>选项卡来比较集群中所有服务器的状态。
|
||||
|
||||
可以使用正则表达式选择一组服务器,立刻就可以看到它们性能的对比:
|
||||
|
||||
[![Ganglia Host Server Information](http://www.tecmint.com/wp-content/uploads/2016/06/Ganglia-Server-Information.png)][3]
|
||||
|
||||
*Ganglia 服务器信息*
|
||||
|
||||
我最喜欢的一个特点是对移动端有友好的总结界面,可以通过 Mobile 选项来访问。选择你感兴趣的集群,然后选中一个主机。
|
||||
|
||||
[![Ganglia Mobile Friendly Summary View](http://www.tecmint.com/wp-content/uploads/2016/06/Ganglia-Mobile-View.png)][2]
|
||||
|
||||
*Ganglia 移动端总结截图*
|
||||
|
||||
### 总结
|
||||
|
||||
本篇文章向大家介绍了 Ganglia,它是一个功能强大、扩展性很好的监控工具,主要用来监控集群和网格。它可以随意安装,便捷的组合各种功能(你甚至可以尝试一下[官方网站][1] 提供的 Demo)。
|
||||
|
||||
此时,你可能会发现许多知名的 IT 或非 IT 的企业在使用 Ganglia。除了我们在文章中提及的之外,还有很多理由这样做,其中易用性,统计的图形化(在名字旁附上脸部照片更清晰,不是吗)可能是最重要的原因。
|
||||
|
||||
但是请不要拘泥于本篇文章,尝试一下自己去做。如果你有任何问题,欢迎给我留言。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/install-configure-ganglia-monitoring-centos-linux/
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[ivo-wang](https://github.com/ivo-wang)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: http://www.tecmint.com/author/gacanepa/
|
||||
[1]:http://ganglia.info/
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2016/06/Ganglia-Mobile-View.png
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2016/06/Ganglia-Server-Information.png
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2016/06/Ganglia-Home-Office-Grid-Report.png
|
||||
[5]:http://www.tecmint.co m/wp-content/uploads/2016/06/Gangila-Web-Interface.png
|
||||
[6]:http://httpd.apache.org/docs/current/howto/auth.html
|
||||
[7]:https://linux.cn/article-2324-1.html
|
||||
[8]:http://www.tecmint.com/wp-content/uploads/2016/06/ Install-Gangila-Monitoring-in-Linux.png
|
||||
[9]:http://www.tecmint.com/install-icinga-in-centos-7/
|
||||
[10]:http://www.tecmint.com/install-and-configure-zabbix-monitoring-on-debian-centos-rhel/
|
||||
[11]:http://www.tecmint.com/install-nagios-in-linux/
|
@ -0,0 +1,62 @@
|
||||
初识 HTTP/2(一)
|
||||
============================================================
|
||||
![](https://static.viget.com/_284x284_crop_center-center/http2-pizza.png?mtime=20160822160641)
|
||||
|
||||
> 用披萨来说明当你订单数很大的时候 HTTP/2 是怎么打败 HTTP/1.1 的。
|
||||
|
||||
在建立网站和应用的方式上 HTTP/2 有些令人惊叹的改变,在 HTTP/2 发布后的一年半,几乎 [10% 的网站使用了 HTTP/2][4]。它绝对值得采用,但是这篇文章应该首先推给使用 HTTP/2 的前端开发者。这个连载的文章是指导前端开发者怎么转换到 HTTP/2。
|
||||
|
||||
本文涵盖了 HTTP/2 对 HTTP/1.1 来说有什么提高的内容,并且向前端开发者介绍了 HTTP/2。
|
||||
|
||||
### 再次让我想起什么是 HTTP ...
|
||||
|
||||
超文本传输协议,也就是 HTTP,这个协议决定了 web 内容怎么传输。HTTP/1.1 在 1999 年被标准化,那时候的 web 和现在有很大的不同,表格霸占了整个网络。样式通常被内联在元素中,如果网站管理员更加的细致,他们会在头部写个 `<style>`标签。 JavaScript 也被丢在文档里面,那时候完整的网站通常也不会超过几页。
|
||||
|
||||
HTTP/1.1 预计这种情况会持续一段时间,所以它并没有太过关注在让一个站点可以加载大量的资源方面,因为那时候的开发者并不需要这个。因此它使用了一个非常简单的方式来处理资源,你访问一个资源然后服务器去寻找它,并且返回你访问的资源,或者告诉你这个资源不存在。这种被叫作"线头堵塞"方式非常高效,但是当你需要多个资源的时候,这个进程会依次寻找每个资源。这意味着在你访问第二个资源之前,服务器必须找到你访问的第一个资源并且载入它,或者告诉你没找到。
|
||||
|
||||
### 大型站点的发展
|
||||
|
||||
在 1999 年之后的几年里,随着 php 和其他像 Rails 这样的动态语言的崛起,站点变得越来越复杂。css 文件也随着向响应式开发的转变而变的越来越大,因此像 Sass 这样的可以创造一个简单的工作环境的 CSS 编译器就应运而生。 JavaScript 也在 web 上有了更大的作用,它允许开发者编写复杂的应用,这曾经只是 C++ 开发人员的工作。随着 Retina 和高清显示屏的兴起,也让图片变得更高清。随着这些改变,文件大小呈现指数式的增长,使得本来是等待几个字节的资源变成了加载几千字节,甚至在某些情况下有几兆。当你开始载入页面的其它东西前,必须先载入数百 K 的东西,你只能乐观的假设你的用户有很快的网络接入。
|
||||
|
||||
想象 HTTP/1.1 是个过去的那种柜台购买式的街旁披萨店。你能自己过去并且预定一个雪碧和 2 片 Angry Hawaiian ,然后等待 3 分钟。他们可以很容易地处理这些,实际上这是一个蓬勃发展的商业模式-定单简单、处理迅速。
|
||||
|
||||
![](https://static.viget.com/_300xAUTO_crop_center-center/http2-pizzaorder1.png?mtime=20160823122331)
|
||||
|
||||
然而,一旦你决定在同样的披萨店主办一场小区域的季度颁奖典礼,事情就变的更复杂了。每个人都预定不同的东西,快速而杂乱无章让等待时间直线上升。
|
||||
|
||||
![](https://static.viget.com/_300xAUTO_crop_center-center/http2-pizzaorder2.png?mtime=20160823130750)
|
||||
|
||||
### 哪里是 HTTP/2 的舞台
|
||||
|
||||
HTTP/2 对前端开发者主要的承诺就是复用。意思就是资源请求能发生在同一时间,并且服务器能马上响应这些资源。在请求之间没有等待,因为它们发生在同一时间。
|
||||
|
||||
使用同样的比喻,HTTP/2 允许披萨店在餐馆他们自己区域举办派对。派一个服务员接受订单,并把所有已经准备好的订单交付。当其他人的比萨在制作的时候,你也不需要花 30 分钟去等待你的雪碧,它们在第一批交付的东西之中。这方式使得管理大量订单更加简单,并且防止人们等他们的订单时间太长。
|
||||
|
||||
复用带给我们的 web 开发的大变化是改变了文件的加载方式。帮助绕过资源加载的 HTTP/1.1 瓶颈的方式是通过连接和压缩需要被加载的文件。所有任务运行器都默认采取这样的操作方式,或者需要作一点小设置就行。和过去一样,开发人员可以将图像放在精灵拼图(sprite sheets)中,这会减少了对服务器的请求数。
|
||||
|
||||
### 改进 HTTP/1.1
|
||||
|
||||
将文件连接起来是个处理 HTTP1.1 的请求限制问题的非常聪明的方式,但是连接文件的主要问题是它要求用户第一次访问整个网站时下载所有的资源。一旦它们载入后,浏览器就会缓存所有的资源。这能提高用户每次访问网页时的速度,但是前期负载很重,对[跳出率不利][5]。此外,他们可能为所不访问的页面加载资源。期望用户访问每个页面以查看每个样式,并与每个脚本进行交互是不现实的。此外,在加拿大和欧洲以及几乎每个美国移动提供商的地方,有每月的带宽上限。不是加载额外的 54 千字节的内容就会超过每月的流量限制,而是让我们假设用户想保留这些额外的流量看 Taylor Swift 的 gif。
|
||||
|
||||
使用 HTTP/2 和多路复用,您可以开发一些最高效的网站,但它需要一些重新思考、甚至撤销之前的最佳做法。重复一次,我的目的是加快 HTTP/2 的会话,使用我们新的工具,我们可以发现这些新的最佳的做法。
|
||||
|
||||
在我的下一篇文章,[我将探索建设基于 HTTP/2 的网站的一些最好方式][6]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.viget.com/articles/getting-started-with-http-2-part-1?imm_mid=0eb24a&cmp=em-web-na-na-newsltr_20161130
|
||||
|
||||
作者:[Ben][a]
|
||||
译者:[hkurj](https://github.com/hkurj)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.viget.com/about/team/btinsley
|
||||
[1]:https://twitter.com/home?status=Using%20pizza%20to%20show%20how%20HTTP%2F2%20beats%20HTTP%2F1.1%20when%20your%20orders%20get%20too%20big.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fgetting-started-with-http-2-part-1
|
||||
[2]:https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fgetting-started-with-http-2-part-1
|
||||
[3]:http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fgetting-started-with-http-2-part-1
|
||||
[4]:https://w3techs.com/technologies/details/ce-http2/all/all
|
||||
[5]:https://blog.kissmetrics.com/speed-is-a-killer/
|
||||
[6]:https://www.viget.com/articles/getting-started-with-http-2-part-2
|
||||
[7]:https://www.viget.com/about/team/btinsley
|
181
published/201701/20160929 Getting Started with HTTP2 - Part 2.md
Normal file
181
published/201701/20160929 Getting Started with HTTP2 - Part 2.md
Normal file
@ -0,0 +1,181 @@
|
||||
初识 HTTP/2(二)
|
||||
============================================================
|
||||
![](https://static.viget.com/_284x284_crop_center-center/ben-t-http-blog-thumb-01_360.png?mtime=20160928234634)
|
||||
|
||||
> HTTP/2 时代的开启为前端开发带来了最佳体验。
|
||||
|
||||
如果你对 HTTP/2 有所了解,那你可能用过它,或者至少想过怎样能把它融入你的项目中。尽管有很多关于它如何改变工作流程,提高 Web 速度和效率等方面的猜想,但最佳使用方式还没有定下来。这里我想讲的就是我在之前的项目中所发现的 HTTP/2 的最佳实践。
|
||||
|
||||
如果你还不确定什么是 HTTP/2,或者为什么它能改进你的工作,可以先看看我[介绍背景方面的第一篇文章][4]。
|
||||
|
||||
记住:开始之前,我要告诉你,尽管你的浏览器可能支持 HTTP/2,但你的服务器可能不支持。检查你的主机托管服务,看看他们是否提供 HTTP/2 的支持。否则你可能要建立你自己的服务器。这篇文章并不会涉及这方面该如何做,但你可以查看 [http2 github][5] 页面,找一找这方面的工具。
|
||||
|
||||
### 🙏 [热身工作]
|
||||
|
||||
首先组织好你的文件。看一看下面的文件树结构,作为组织你的样式表的起点:
|
||||
|
||||
```
|
||||
/styles
|
||||
|── /setup
|
||||
| /* 变量、混入(minin)和函数 */
|
||||
|── /global
|
||||
| /* 能放在任何组件和部分中的可重用组件 */
|
||||
|── /components
|
||||
| /* 特殊组件和部分 */
|
||||
|── setup.scss // setup 样式索引
|
||||
|── global.scss // 全局样式索引
|
||||
```
|
||||
|
||||
这会把你的样式分到三个目录下面:`setup`、`global` 和 `componenets`。接下来我会说明这些目录对你的项目有什么用。
|
||||
|
||||
### setup 目录
|
||||
|
||||
`setup` 目录保存所有的变量、函数、混入(minin)以及一些正常编译需要的其它文件的定义。要想让这个目录物尽其用,把这个目录下所有内容导入到 `setup.scss` 文件中是个很不错的主意,这样这个文件就会像下面所展示的一样:
|
||||
|
||||
```
|
||||
/* setup.scss */
|
||||
|
||||
/* 变量 */
|
||||
@import "setup/variables/colors";
|
||||
|
||||
/* 混入 */
|
||||
@import "setup/mixins/color";
|
||||
|
||||
/* 函数 */
|
||||
@import "setup/functions/color";
|
||||
|
||||
... 等等
|
||||
```
|
||||
|
||||
现在我们能快速引用这个站点中的所有定义,应该确保在所有的样式文件顶部包含我们这里创建的这个文件。
|
||||
|
||||
### global 目录
|
||||
|
||||
接下来的目录,global 目录,应该包含可在当前站点的多个部分或者每一个页面中重复使用的组件。像按钮、文本、主要样式,以及你的浏览器默认设置应该放在这里。我不建议把页面的头部或底部样式放在这儿,因为某些项目中没有头部,或者不同页面头部不同。而且,底部永远是页面的最后一个元素,所以在用户加载完当前站点的其它东西前,不必过分优先考虑加载底部样式。
|
||||
|
||||
记住,如果没有那些定义在 setup 目录下的东西,你的 global 样式就可能没有作用,你的 global 文件看起来应该像这样:
|
||||
|
||||
```
|
||||
/* global.scss */
|
||||
|
||||
/* 应用定义 */
|
||||
@import "setup";
|
||||
|
||||
/* 全局样式 */
|
||||
@import "global/reset";
|
||||
@import "global/buttons";
|
||||
@import "global/typography";
|
||||
@import "global/grid";
|
||||
|
||||
... 等等
|
||||
```
|
||||
|
||||
注意,首先要做的就是导入 setup 样式。这样的话,之后的文件都可以引用这个样式里的定义。
|
||||
|
||||
由于站点内的每个页面都需要 global 样式,我们可以用典型的方式,在 `<head>` 标签内用一个 `<link>` 标签来加载它们。你所看到的将是一个十分小巧的 css 文件,或者说理论上小巧的,这取决于你需要多少全局样式。
|
||||
|
||||
### 最后,你的组件
|
||||
|
||||
注意,我没有在上述目录树中的 components 目录里包含索引文件。这是 HTTP/2 所带来的效用。直到现在,我们已经按照标准步骤构建了一个典型的站点,保持相当简单的结构,仅选择全局化那些最重要的样式。组件充当它们自己的索引文件。
|
||||
|
||||
大多数开发者有独特的组织组件的方式,因此我并不想影响你的策略。但是,你所有的组件看起来应该像这样:
|
||||
|
||||
```
|
||||
/* header.scss */
|
||||
|
||||
/* 应用定义 */
|
||||
@import "../setup";
|
||||
|
||||
header {
|
||||
// 样式
|
||||
}
|
||||
|
||||
... 等等
|
||||
```
|
||||
|
||||
同样的,你要把 setup 样式包含进来,确保所有东西在编译时都定义过。除了编译这些文件,以及可能要把他们放到 `/assets` 目录,以便很容易找到模版,对这些文件你不必 <ruby>拼接<rt>concatenate</rt></ruby>、<ruby>压缩<rt>minify</rt></ruby> 它们或者改变什么。
|
||||
|
||||
现在样式表已经差不多了,构建站点应该很简单。
|
||||
|
||||
### 构建组件
|
||||
|
||||
或许对于模板语言你有自己的选择,这取决于你的项目,有可能是 Twig、Rails、Jade 或者 Handlebars。我认为考虑组件最好的方式是它是否有自己的模版文件,它该有个与名字相应的样式。这样你的项目中,模版和样式的比例就会是个不错的 1:1 的比例,而且你知道哪个文件有哪些东西,哪里有哪个文件,因为它们的命名是有规律的。
|
||||
|
||||
现在它正步入正轨,用好 HTTP/2 的多种功能十分简单,让我们做一个模版:
|
||||
|
||||
```
|
||||
{# header.html #}
|
||||
|
||||
{# compiled header styles #}
|
||||
<link href="assets/components/header.css" rel="stylesheet" media="all">
|
||||
|
||||
<header>
|
||||
<h1>This Awesome HTTP/2 Site</h1>
|
||||
... 等等
|
||||
```
|
||||
|
||||
非常好!在模版里你可能有更简单的方式链接到资源,但这里显示你所要做的仅是在开始构建时,在模版文件中链接一个小小的头部样式。这将允许你的站点仅仅加载特定资源到任意给定页面的组件中,而且,能够设定页面从头到脚的组件的优先级。
|
||||
|
||||
### 结合在一起
|
||||
|
||||
现在所有的组件都有结构,浏览器将会类似以下方式来渲染它们:
|
||||
|
||||
```
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" media="all" href="/assets/global.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<link rel="stylesheet" media="all" href="/assets/components/header.css">
|
||||
<header>
|
||||
... etc
|
||||
</header>
|
||||
|
||||
<link rel="stylesheet" media="all" href="/assets/components/title.css">
|
||||
<section class="title">
|
||||
... etc
|
||||
</section>
|
||||
|
||||
<link rel="stylesheet" media="all" href="/assets/components/image-component.css">
|
||||
<section class="image-component">
|
||||
... etc
|
||||
</section>
|
||||
|
||||
<link rel="stylesheet" media="all" href="/assets/components/text-component.css">
|
||||
<section class="text-component">
|
||||
... etc
|
||||
</section>
|
||||
|
||||
<link rel="stylesheet" media="all" href="/assets/components/footer.css">
|
||||
<footer>
|
||||
... etc
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
这是一个高级别方法,但你的项目中可能有调整的更细致的组件。例如,在头部的 `<nav>` 组件可能要加载自己的样式表。尽你所能地自由发挥,让组件更有作用 - HTTP/2 不会因这些需求而阻碍你!
|
||||
|
||||
### 结论
|
||||
|
||||
这只是一个关于如何在前端用 HTTP/2 构建项目的基本介绍,仅是皮毛而已。你可能注意到我上面所用的方法有的还有改进的空间。请不吝赐教!正如我在第一篇文章中所说的,HTTP/2 可能颠覆自 HTTP/1 以来我们所熟知的某些标准,所以要慎重思考和实践,以便高效使用 HTTP/2 的开发环境。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.viget.com/articles/getting-started-with-http-2-part-2
|
||||
|
||||
作者:[Ben][a]
|
||||
译者:[GitFuture](https://github.com/GitFuture)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.viget.com/about/team/btinsley
|
||||
[1]:https://twitter.com/home?status=Firmly%20planting%20a%20flag%20in%20the%20sand%20for%20HTTP%2F2%20best%20practices%20for%20front%20end%20development.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fgetting-started-with-http-2-part-2
|
||||
[2]:https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fgetting-started-with-http-2-part-2
|
||||
[3]:http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fgetting-started-with-http-2-part-2
|
||||
[4]:https://linux.cn/article-8111-1.html
|
||||
[5]:https://github.com/http2/http2-spec/wiki/Tools
|
@ -0,0 +1,66 @@
|
||||
保持 Linux 容器的安全和稳定
|
||||
============
|
||||
|
||||
![Interview with Andy Cathrow of Anchore](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/bus-containers2.png?itok=rG1pTnZ4)
|
||||
|
||||
> 图片来源: [Lucarelli](http://commons.wikimedia.org/wiki/User:Lucarelli) 基于 [Wikimedia Commons](http://commons.wikimedia.org/wiki/File:Containers_Livorno.jpg). CC-BY-SA 3.0
|
||||
|
||||
Linux 容器正在改变 IT 从业者的工作方式。相比于庞大、沉重的虚拟机,一些组织发现把他们的应用部署在容器中更有效,可以提供更快的速度,更加密集,提升他们操作的敏捷性。
|
||||
|
||||
从安全的角度看,容器带来了一些优势,但是也面临着它们自己的一些安全挑战。和传统的基础设施一样,为了避免安全缺陷,确保运行在一个容器内的组件和系统库的定期更新是至关重要的。但是你如何知道什么东西运行在你的容器内?为了帮助你应对这些的安全挑战,一个名为 [Anchore](https://anchore.com)的初创公司正在开发一个[同名的开源项目](https://github.com/anchore/anchore),它用来帮助展示 Linux 容器中的内容。
|
||||
|
||||
为了了解更多关于 Anchore,我找到了 Anchore 的市场和产品的发言人 Andrew Cathrow,来了解更多关于这个开源项目背后的公司。
|
||||
|
||||
![](https://opensource.com/sites/default/files/images/life/Interview%20banner%20Q%26A.png)
|
||||
|
||||
### 简而言之 Anchore 是什么? 它如何工作?
|
||||
|
||||
Anchore 的目标是提供一套工具,允许开发人员、运营团队、安全团队在容器的整个开发周期中保持对“监管链(Chain of Custody)”的全程可见,并提供生产部署所需的可见性、可预测性和控制性。Anchore 的引擎通过插件可以进行分析(通过提取镜像数据和元数据)、查询(允许对容器进行分析)、以及策略评估(这里的策略指可以被指定的管理的图像)。
|
||||
|
||||
虽然市场上有很多扫描工具,但是大部分不开源。我们认为安全合规的产品应该是开源的,否则你怎么才能信任他们。
|
||||
|
||||
Anchore 除了开源以外,还有两大优势,使它可以区别于市场中的商业产品。
|
||||
|
||||
首先,我们看的不止是操作系统的镜像。如今的扫描工具专注于操作系统的软件包,比如“你的 RPM 或 DEB 包中有CVE(安全漏洞)么?”这虽然是很重要的,你不希望你的镜像中有不安全的包,但是操作系统包只是镜像的基础。其他的层次都需要进行验证,包括配置文件、语言模块、中间件等等。你可以用的全是最新的软件包,但是可能一个配置文件配置出现错误,不安全就出现在里面。第二个不同就是允许用户添加自己的数据、查询或策略来扩展这个引擎。
|
||||
|
||||
### 什么推动了容器的校验和分析工具的需求出现?这个工具可以解决运营面临的什么问题呢?
|
||||
|
||||
企业使用 Docker 首要关注的就是安全,特别是他们正在部署的容器的分配和合规性。在生产环境中,从公共镜像库拉取一个镜像,运行它,并在几秒钟部署,是非常简单的,甚至不知道下面可能发生什么。终端用户在部署应用时,必须信任他们所部署的是安全、高效和易于维护的。
|
||||
|
||||
容器是不透明的,它们是一个包含应用程序的可部署的“黑盒”。虽然非常容易把这些镜像看作“打包的应用程序”,但是它们包括了系统的镜像和多达数百个包和成千上万个文件。如同所有在物理服务器、虚拟机或者云上的操作系统一样,镜像也需要维护。镜像或许包含了未补丁的安全缺陷、带有 bug 和错误配置的过期软件。
|
||||
|
||||
要对您的容器部署有信心,你需要知道底层是什么,并基于容器镜像的内容来做出决定。
|
||||
|
||||
### 如今容器的创新基本上都是开源的,你认为是为什么呢?是什么促使了它们开源呢?
|
||||
|
||||
在过去的 20 年中,各个组织已经经历了开源带来的优势,节省成本,减少锁定,提高了安全性和更快的创新。容器,特别是 Docker,都是非常好的例子。Docker 公司的团队不能在专有系统上创建一个新的软件部署模式,他们不能要求在修改专有系统的代码,而是与行业领导者比如谷歌、IBM、英特尔、红帽合作,朝着一个共同的目标。开源和 Linux 总是开启创新和激励产业困境。在过去,实现一个大的想法需要一个大的团队和很多资源。在开源世界,一个有着很大的创意的小公司可以工作在一个更大的社区中,通过知识共享的力量来协作,提供真正的企业创新。
|
||||
|
||||
为了深入的说明开源的使用,Anchroe 团队最近刚从多伦多的 LinuxCon 回来,在哪里,令人难以相信的是,微软作为钻石级的赞助商,展示了他们用在 Linux 上的产品投入的增长。Linus Toravlds 曾说过,“如果微软为 Linux 开发应用就意味着我赢了”。我要把这句话改为“开源赢了”。
|
||||
|
||||
### 容器领域的通用标准的创建还需要时间,在容器的几乎所有部分,仍有许多挑战。在这个领域,创业公司有哪些挑战?
|
||||
|
||||
这里有个很重要的点,就是没有开放的标准和开源,我们不可能看到快速推动容器的采用和改变行业格局的创新。开放容器倡议(OCI)由 Linux 和容器行业的行业领导者组成,正在为运行环境和镜像格式创造标准,这将使我们能够看到更多的创新。Anchore 很自豪能成为 OCI 的新成员,我们期待帮助形成标准。
|
||||
|
||||
###你将如何围绕 Anchor 项目建立一个开源社区?
|
||||
|
||||
Anchore 团队来自 Ansible、Eucalyptus Systems 和 Red Hat 的领导团队,在开源社区中拥有丰富的工作经验。从一开始,Anchore 就准备创建一个强大的开源社区,我们正在应用我们在开源世界中学到的经验和教训。第一课,当然,发布要尽早尽快。我们在 6 月开源我们的检测和分析引擎,远远早于我们的商用产品,以便了确保开源项目能够独立运行,使更多的直接用户能够使用它,而无需购买 Anchore 的商用产品。通过支持、服务和增强型的数据源,有很多机会给商用产品创造更多价值,但是如果开源引擎本身没有用,我们将看不到活跃的社区。
|
||||
|
||||
我们将 Anchore 模块化,允许添加分析、报告和策略插件,而不需要更改核心的引擎。我们希望保证任何人都可以创建插件,所以我们选择了 Python 作为项目的基本语言,因为 Python 被开发者和系统管理员广泛应用。但是,即使你不熟悉 Python,你仍然可以使用任何你喜欢的语言或者脚本环境创建插件。如果你可以创建一个 Bash 脚本,那么你也可以创建一个 Anchore 插件。我们的目标是最大化的吸引社区的参与。虽然我们鼓励用户将贡献回馈给社区,但是我们也为这个项目构建并进行了授权,来确保可以独立创建和维护私有的插件和模块。
|
||||
|
||||
### 容器的用途不止是在服务器上更大密度的部署应用程序或者技术层面更快的速度,而且还有不同工具的组合,这些工具提供了一种不同的方式来拉近开发者和操作者共同工作。作为在这个领域工作的公司,你们希望提供一个什么样的消息来让开发者和运营产生共鸣?
|
||||
|
||||
随着越来越多的运行环境、编排、监控和集成产品,容器的生态系统正在快速发展。所以,我们的架构中的第一个考虑因素不是限定 Anchore 的部署和使用。我们需要确保我们可以适应任何 CI/CD 工作流,无论是私有部署还是云端部署。一个经常问到我们的问题是,Anchore 是否将提供一个包含了镜像扫描和分析的容器仓库。虽然这将大大简化我们的工作,但是这会迫使用户进入特定的部署架构,并限制了用户部署他们自己最好的组件的能力。我们已经确保 Anchore 可以和所有领先的仓库、运行环境平台、 CI/CD 平台和编排工具配合使用。
|
||||
|
||||
一些开发者掌握了运营技能,并转换为 DevOps 角色,我们看到系统管理员/运营团队也在更多的了解开发,转换成 DevOps 角色。我们也看到了具有混合能力的团队。我们设计了可供开发运营和安全团队使用的 Anchore ,以便他们共同定义规则和策略来评估开发周期中的任何一个环节。另外一个例子是插件/模块的架构,使任何人都可以在他们喜欢的环境中轻松创建一个模块 —— 无论是以 Python、Go、Perl、C 甚至是一个 Bash 脚本。
|
||||
|
||||
------
|
||||
|
||||
via: https://opensource.com/business/16/10/interview-andy-cathrow-anchore
|
||||
|
||||
作者:[Jason Baker][a]
|
||||
译者:[Bestony](https://github.co/Bestony)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jason-baker
|
@ -1,29 +1,29 @@
|
||||
开始使用Ansible
|
||||
Ansible 起步指南
|
||||
==========
|
||||
|
||||
|
||||
这是一篇关于 Ansible 的课程,你也可以用来作小项目的模板,或者继续深入这个工具。在本指南的最后,你将了解足够的自动化服务器配置、部署等。
|
||||
这是一篇关于 Ansible 的速成课程,你可以用作小项目的模板,或者帮你深入了解这个神奇的工具。阅读了本指南之后,你将对自动化服务器配置、部署等有足够的了解。
|
||||
|
||||
### Ansible 是什么,为什么你该了解?
|
||||
|
||||
Ansible是一个简单的配置管理系统。你只需要访问你的服务器或设备的ssh。它也不同于其他工具,因为它使用push的方式,而不是像chef那样使用pull的方式。你可以将代码部署到任意数量的服务器上,配置网络设备或在基础架构中自动执行任何操作。
|
||||
Ansible 简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 或 chef 那样使用拉取的方式。你可以将代码部署到任意数量的服务器上,配置网络设备或在基础架构中自动执行任何操作。
|
||||
|
||||
#### 要求
|
||||
### 前置要求
|
||||
|
||||
假设你使用 Mac 或 Linux 作为你的工作站,Ubuntu Trusty为你的服务器,并有一些安装软件包的经验。此外,你的计算机上将需要以下软件。所以,如果你还没有它们,请先安装:
|
||||
假设你使用 Mac 或 Linux 作为你的工作站,Ubuntu Trusty 作为你的服务器,并有一些安装软件包的经验。此外,你的计算机上将需要以下软件。所以,如果你还没有它们,请先安装:
|
||||
|
||||
- Virtualbox
|
||||
- Vagrant
|
||||
- Mac 用户: Homebrew
|
||||
- [Virtualbox](https://www.virtualbox.org/)
|
||||
- [Vagrant](https://www.vagrantup.com/downloads.html)
|
||||
- Mac 用户:[Homebrew](http://brew.sh/)
|
||||
|
||||
#### 情景
|
||||
我们将模拟2个连接到MySQL数据库的Web应用程序服务器。Web应用程序使用Rails 5和Puma。
|
||||
### 情景
|
||||
|
||||
我们将模拟 2 个连接到 MySQL 数据库的 Web 应用程序服务器。Web 应用程序使用 Rails 5 和 Puma。
|
||||
|
||||
### 准备
|
||||
|
||||
#### Vagrantfile
|
||||
|
||||
为这个项目创建一个文件夹并将下面的内容保存到:Vagrantfile
|
||||
为这个项目创建一个文件夹,并将下面的内容保存到名为 `Vagrantfile` 的文件。
|
||||
|
||||
```
|
||||
VMs = [
|
||||
@ -46,9 +46,9 @@ Vagrant.configure(2) do |config|
|
||||
end
|
||||
```
|
||||
|
||||
### 配置你的虚拟网络
|
||||
#### 配置你的虚拟网络
|
||||
|
||||
我们希望我们的虚拟机能互相交互,但不要让流量流出到真实的网络,所以我们将在Virtualbox中创建一个仅在主机的网络适配器。
|
||||
我们希望我们的虚拟机能互相交互,但不要让流量流出到真实的网络,所以我们将在 Virtualbox 中创建一个仅主机(HOST-Only)的网络适配器。
|
||||
|
||||
1. 打开 Virtualbox
|
||||
2. 转到 Preferences
|
||||
@ -56,18 +56,18 @@ end
|
||||
4. 单击 Host-Only
|
||||
5. 单击添加网络
|
||||
6. 单击 Adapter
|
||||
7. 将IPv4设置为 10.1.1.1,IPv4网络掩码:255.255.255.0
|
||||
7. 将 IPv4 设置为 `10.1.1.1`,IPv4 网络掩码:`255.255.255.0`
|
||||
8. 单击 “OK”
|
||||
|
||||
#### 测试虚拟机及虚拟网络
|
||||
|
||||
在终端中,在具有Vagrantfile的目录中,输入下面的命令:
|
||||
在终端中,在存放 `Vagrantfile` 的项目目录中,输入下面的命令:
|
||||
|
||||
```
|
||||
vagrant up
|
||||
```
|
||||
|
||||
这回创建你的虚拟机,因此会花费一会时间。输入下面的命令并验证输出来检查是否已经工作:
|
||||
它会创建你的虚拟机,因此会花费一会时间。输入下面的命令并验证输出内容以检查是否已经工作:
|
||||
|
||||
```
|
||||
$ vagrant status
|
||||
@ -82,8 +82,7 @@ above with their current state. For more information about a specific
|
||||
VM, run `vagrant status NAME`.
|
||||
```
|
||||
|
||||
现在使用用户名和密码为vagrant,Vagrantfile中的IP登录其中一台虚拟机,这将验证虚拟机并将它们的密钥添加到你的已知主机文件中。
|
||||
|
||||
现在使用 `vagrant` 的用户名和密码 ,按 `Vagrantfile` 中的 IP 登录其中一台虚拟机,这将验证虚拟机并将它们的密钥添加到你的已知主机(`known_hosts`)文件中。
|
||||
|
||||
```
|
||||
ssh vagrant@10.1.1.11 # password is `vagrant`
|
||||
@ -107,16 +106,16 @@ $ brew install ansible
|
||||
$ sudo apt install ansible
|
||||
```
|
||||
|
||||
确保你使用了ansible最近的版本 2.1 或者更高的版本:
|
||||
确保你使用了ansible 最近的版本 2.1 或者更高的版本:
|
||||
|
||||
```
|
||||
$ ansible --version
|
||||
ansible 2.1.1.0
|
||||
```
|
||||
|
||||
### inventory
|
||||
### 清单
|
||||
|
||||
Ansible 使用 inventory 来了解要使用的服务器,以及如何将它们分组以并行执行任务。让我们为这个项目创建我们的 inventory,并将 inventory 放在与 Vagrantfile 相同的文件夹中:
|
||||
Ansible 使用清单文件来了解要使用的服务器,以及如何将它们分组以并行执行任务。让我们为这个项目创建我们的清单文件 `inventory`,并将它放在与 `Vagrantfile` 相同的文件夹中:
|
||||
|
||||
```
|
||||
[all:children]
|
||||
@ -135,21 +134,20 @@ web2 ansible_host=10.1.1.12
|
||||
dbserver ansible_host=10.1.1.21
|
||||
```
|
||||
|
||||
- `[all:children]` 定义一个组(all)的组
|
||||
- `[all:vars]` 定义属于组all的变量
|
||||
- `[webs]` 定义一个组,就像[dbs]
|
||||
- 文件的其余部分只是主机的声明,带有它们的名称和IP
|
||||
- `[all:children]` 定义一个组的组(`all`)
|
||||
- `[all:vars]` 定义属于组 `all` 的变量
|
||||
- `[webs]` 定义一个组,就像 `[db]` 一样
|
||||
- 文件的其余部分只是主机的声明,带有它们的名称和 IP
|
||||
- 空行表示声明结束
|
||||
|
||||
现在我们有了一个inventory,我们可以从命令行开始使用 ansible,指定一个主机或一个组来执行命令。以下是检查与服务器的连接的命令示例:
|
||||
现在我们有了一个清单,我们可以从命令行开始使用 ansible,指定一个主机或一个组来执行命令。以下是检查与服务器的连接的命令示例:
|
||||
|
||||
```
|
||||
$ ansible -i inventory all -m ping
|
||||
```
|
||||
|
||||
- `-i` 指定inventory文件
|
||||
- `-i` 指定清单文件
|
||||
- `all` 指定要操作的服务器或服务器组
|
||||
- `-m' 指定一个ansible模块,在这种情况下为ping
|
||||
- `-m' 指定一个 ansible 模块,在这种情况下为 `ping`
|
||||
|
||||
下面是命令输出:
|
||||
|
||||
@ -168,9 +166,9 @@ web2 | SUCCESS => {
|
||||
}
|
||||
```
|
||||
|
||||
服务器以不同的顺序响应,这只取决于谁先响应,但是这个没有相关,因为ansible独立保持每台服务器的状态。
|
||||
服务器以不同的顺序响应,这只取决于谁先响应,但是这个没有关系,因为 ansible 独立保持每台服务器的状态。
|
||||
|
||||
你也可以使用另外一个选项运行任何命令:
|
||||
你也可以使用另外一个选项来运行任何命令:
|
||||
|
||||
- `-a <command>`
|
||||
|
||||
@ -195,11 +193,11 @@ Filesystem Size Used Avail Use% Mounted on
|
||||
/dev/sda1 40G 1.4G 37G 4% /
|
||||
```
|
||||
|
||||
### Playbook
|
||||
### 剧本
|
||||
|
||||
Playbook 只是 YAML 文件,它将inventory中的服务器组与命令关联。ansible的正确用法是任务,它可以是期望的状态,shell 命令或许多其他选项。有关 ansible 可做的所有事情列表,可以查看所有模块的列表。
|
||||
剧本(playbook)只是个 YAML 文件,它将清单文件中的服务器组与命令关联。在 ansible 中的对于关键字是 `tasks`,它可以是一个预期的状态、shell 命令或许多其它的选项。有关 ansible 可做的所有事情列表,可以查看[所有模块的列表](http://docs.ansible.com/ansible/list_of_all_modules.html)。
|
||||
|
||||
下面是一个运行 shell 命令的 playbook 示例,将其保存为 playbook1.yml:
|
||||
下面是一个运行 shell 命令的剧本示例,将其保存为 `playbook1.yml`:
|
||||
|
||||
```
|
||||
---
|
||||
@ -211,8 +209,8 @@ Playbook 只是 YAML 文件,它将inventory中的服务器组与命令关联
|
||||
- `---` 是 YAML 文件的开始
|
||||
- ` - hosts`:指定要使用的组
|
||||
- `tasks`:标记任务列表的开始
|
||||
- ` - shell`:指定使用shell模块的第一个任务
|
||||
- 记住:YAML 需要缩进,确保你始终遵循playbook中的正确结构
|
||||
- ` - shell`:指定第一个任务使用 [shell] (http://docs.ansible.com/ansible/shell_module.html) 模块
|
||||
- **记住:YAML 需要缩进结构,确保你始终遵循剧本中的正确结构**
|
||||
|
||||
用下面的命令运行它:
|
||||
|
||||
@ -237,14 +235,13 @@ web1 : ok=2 changed=1 unreachable=0 failed=0
|
||||
web2 : ok=2 changed=1 unreachable=0 failed=0
|
||||
```
|
||||
|
||||
正如你所见,ansible 运行了 2 个任务,而不是只有 playbook 中的一个。TASK [setup]是一个隐式任务,它会首先运行以捕获服务器的信息,如主机名、IP、分布和更多详细信息,然后可以使用该信息运行条件任务。
|
||||
正如你所见,ansible 运行了 2 个任务,而不是只有剧本中的一个。`TASK [setup]` 是一个隐式任务,它会首先运行以捕获服务器的信息,如主机名、IP、发行版和更多详细信息,然后可以使用这些信息运行条件任务。
|
||||
|
||||
还有一个最后的PLAY RECAP,其中 ansible 显示了有多少个运行的任务以及每个对应的状态。在我们的例子中,因为我们运行了一个 shell 命令,ansible 不知道结果的状态,它被认为是 changed。
|
||||
还有最后的 `PLAY RECAP`,其中 ansible 显示了运行了多少个任务以及每个对应的状态。在我们的例子中,因为我们运行了一个 shell 命令,ansible 不知道结果的状态,它被认为是 `changed`。
|
||||
|
||||
#### 安装软件
|
||||
|
||||
### 安装软件
|
||||
|
||||
我们将使用 apt 在我们的服务器上安装软件,因为我们需要root,所以我们必须使用 become 语句,将这个内容保存在 playbook2.yml 中并运行它(ansible-playbook playbook2.yml):
|
||||
我们将使用 [apt](http://docs.ansible.com/ansible/apt_module.html) 在我们的服务器上安装软件,因为我们需要 root 权限,所以我们必须使用 `become` 语句,将这个内容保存在 `playbook2.yml` 中并运行它(`ansible-playbook playbook2.yml`):
|
||||
|
||||
```
|
||||
---
|
||||
@ -255,7 +252,7 @@ web2 : ok=2 changed=1 unreachable=0 failed=0
|
||||
- apt: name=git state=present
|
||||
```
|
||||
|
||||
有可以应用于 ansible 中所有模块的语句; 一个是 name 语句,让我们可以打印关于正在执行的任务的更具描述性的文本。要使用它,任务还是一样,但是添加 name 字段:描述性文本作为第一行,所以我们以前的文本将是:
|
||||
有一些语句可以应用于 ansible 中所有模块;一个是 `name` 语句,可以让我们输出关于正在执行的任务的更具描述性的文本。要使用它,保持任务内容一样,但是添加 `name :描述性文本` 作为第一行,所以我们以前的文本将改成:
|
||||
|
||||
```
|
||||
---
|
||||
@ -267,9 +264,9 @@ web2 : ok=2 changed=1 unreachable=0 failed=0
|
||||
apt: name=git state=present
|
||||
```
|
||||
|
||||
### 使用 `with_items`
|
||||
#### 使用 `with_items`
|
||||
|
||||
当你在处理一个项目列表、要安装的包、要创建的文件等时可以用 ansible 提供的 with_items。下面是我们如何在 playbook3.yml 中使用它,同时添加一些我们已经知道的其他语句:
|
||||
当你要处理一个列表时,比如要安装的项目和软件包、要创建的文件,可以用 ansible 提供的 `with_items`。下面是我们如何在 `playbook3.yml` 中使用它,同时添加一些我们已经知道的其他语句:
|
||||
|
||||
```
|
||||
---
|
||||
@ -287,9 +284,9 @@ web2 : ok=2 changed=1 unreachable=0 failed=0
|
||||
- python-software-properties
|
||||
```
|
||||
|
||||
### 使用 `template` 和 `vars`
|
||||
#### 使用 `template` 和 `vars`
|
||||
|
||||
`vars` 是一个定义变量语句,可以在 `task` 语句或 `template` 文件中使用。 Jinja2 是 Ansible 中使用的模板引擎,但是关于它你不需要学习很多。在你的 playbook 中定义变量,如下所示:
|
||||
`vars` 是一个定义变量语句,可以在 `task` 语句或 `template` 文件中使用。 [Jinja2](http://jinja.pocoo.org/docs/dev/) 是 Ansible 中使用的模板引擎,但是关于它你不需要学习很多。在你的剧本中定义变量,如下所示:
|
||||
|
||||
```
|
||||
---
|
||||
@ -302,7 +299,7 @@ web2 : ok=2 changed=1 unreachable=0 failed=0
|
||||
template: src=myconfig.j2 dest={{path_to_vault}}/app.conf
|
||||
```
|
||||
|
||||
正如你看到的,我可以使用 {{path_to_vault}} 作为 playbook 的一部分,但也因为我使用了模板语句,我可以使用 myconfig.j2 中的任何变量,它必须存在一个名为 templates 的子文件夹中。你项目树应该如下所示:
|
||||
正如你看到的,我可以使用 `{{path_to_vault}}` 作为剧本的一部分,但也因为我使用了 `template`语句,我可以使用 `myconfig.j2` 中的任何变量,该文件必须存在一个名为 `templates` 的子文件夹中。你项目树应该如下所示:
|
||||
|
||||
```
|
||||
├── Vagrantfile
|
||||
@ -313,15 +310,15 @@ web2 : ok=2 changed=1 unreachable=0 failed=0
|
||||
└── myconfig.j2
|
||||
```
|
||||
|
||||
当 ansible 找到一个模板语句后它会在模板文件夹内查找,并将把被“{{”和“}}”括起来的变量展开来。
|
||||
当 ansible 找到一个 `template` 语句后它会在 `templates` 文件夹内查找,并将把被 `{{` 和 `}}` 括起来的变量展开来。
|
||||
|
||||
示例模板:
|
||||
示例模板:
|
||||
|
||||
```
|
||||
this is just an example vault_dir: {{path_to_vault}} secret_password: {{secret_key}}
|
||||
```
|
||||
|
||||
即使你不扩展变量你也可以使用`模板`。考虑到将来会添加所以我先做了。比如创建一个 `hosts.j2` 模板并加入主机名和IP。
|
||||
即使你不扩展变量你也可以使用 `template`。考虑到将来会添加所以我先做了。比如创建一个 `hosts.j2` 模板并加入主机名和 IP。
|
||||
|
||||
```
|
||||
10.1.1.11 web1
|
||||
@ -329,31 +326,31 @@ this is just an example vault_dir: {{path_to_vault}} secret_password: {{secret_k
|
||||
10.1.1.21 dbserver
|
||||
```
|
||||
|
||||
这里要求像这样的语句:
|
||||
这里要用像这样的语句:
|
||||
|
||||
```
|
||||
- name: Installing the hosts file in all servers
|
||||
template: src=hosts.j2 dest=/etc/hosts mode=644
|
||||
```
|
||||
|
||||
### shell 命令
|
||||
#### shell 命令
|
||||
|
||||
你应该总是尝试使用模块,因为 Ansible 可以跟踪任务的状态,并避免不必要的重复,但有时 shell 命令是不可避免的。 对于这些情况,Ansible 提供两个选项:
|
||||
你应该尽量使用模块,因为 Ansible 可以跟踪任务的状态,并避免不必要的重复,但有时 shell 命令是不可避免的。 对于这些情况,Ansible 提供两个选项:
|
||||
|
||||
- command:直接运行一个命令,没有环境变量或重定向(|,<,>等)
|
||||
- shell:运行 /bin/sh 并展开变量和重定向
|
||||
- [command](http://docs.ansible.com/ansible/command_module.html):直接运行一个命令,没有环境变量或重定向(`|`,`<`,`>` 等)
|
||||
- [shell](http://docs.ansible.com/ansible/shell_module.html):运行 `/bin/sh` 并展开变量和支持重定向
|
||||
|
||||
#### 其他有用的模块
|
||||
|
||||
- apt_repository - Debian家族中添加/删除包仓库
|
||||
- yum_repository - RedHat系列中添加/删除包仓库
|
||||
- service - 启动/停止/重新启动/启用/禁用服务
|
||||
- git - 从git服务器部署代码
|
||||
- unarchive - 从Web或本地源解开软件包
|
||||
- [apt_repository](http://docs.ansible.com/ansible/apt_repository_module.html) - 在 Debian 系的发行版中添加/删除包仓库
|
||||
- [yum_repository](https://docs.ansible.com/ansible/yum_repository_module.html) - 在 RedHat 系的发行版中添加/删除包仓库
|
||||
- [service](http://docs.ansible.com/ansible/service_module.html) - 启动/停止/重新启动/启用/禁用服务
|
||||
- [git](http://docs.ansible.com/ansible/git_module.html) - 从 git 服务器部署代码
|
||||
- [unarchive](http://docs.ansible.com/ansible/unarchive_module.html) - 从 Web 或本地源解开软件包
|
||||
|
||||
#### 只在一台服务器中运行任务
|
||||
|
||||
Rails 使用 `migrations` 来逐步更改数据库,但由于你有多个应用程序服务器,因此这些迁移不能被分配为组任务,而只需要一个服务器来运行迁移。在这种情况下,当使用 run_once 时,run_once 将分派任务到一个服务器,并继续下一个任务,直到这个任务完成。你只需要在你的任务中设置 run_once:true。
|
||||
Rails 使用 [migrations](http://edgeguides.rubyonrails.org/active_record_migrations.html) 来逐步更改数据库,但由于你有多个应用程序服务器,因此这些迁移任务不能被分配为组任务,而我们只需要一个服务器来运行迁移。在这种情况下,当使用 `run_once` 时,`run_once` 将分派任务到一个服务器,并直到这个任务完成继续下一个任务。你只需要在你的任务中设置 `run_once:true`。
|
||||
|
||||
```
|
||||
- name: 'Run db:migrate'
|
||||
@ -361,9 +358,9 @@ Rails 使用 `migrations` 来逐步更改数据库,但由于你有多个应用
|
||||
run_once: true
|
||||
```
|
||||
|
||||
##### 会失败的任务
|
||||
#### 会失败的任务
|
||||
|
||||
通过指定 ignore_errors:true,你可以运行可能会失败但不影响剩余 playbook 完成的任务。这是非常有用的,例如,当删除最初不存在的日志文件时。
|
||||
通过指定 `ignore_errors:true`,你可以运行可能会失败的任务,但不会影响剧本中剩余的任务完成。这是非常有用的,例如,当删除最初并不存在的日志文件时。
|
||||
|
||||
```
|
||||
- name: 'Delete logs'
|
||||
@ -371,11 +368,11 @@ Rails 使用 `migrations` 来逐步更改数据库,但由于你有多个应用
|
||||
ignore_errors: true
|
||||
```
|
||||
|
||||
##### 放到一起
|
||||
### 放到一起
|
||||
|
||||
现在用我们先前学到的,这里是每个文件的最终版:
|
||||
|
||||
Vagrantfile:
|
||||
`Vagrantfile`:
|
||||
|
||||
```
|
||||
VMs = [
|
||||
@ -398,7 +395,7 @@ Vagrant.configure(2) do |config|
|
||||
end
|
||||
```
|
||||
|
||||
inventory:
|
||||
`inventory`:
|
||||
|
||||
```
|
||||
[all:children]
|
||||
@ -417,7 +414,7 @@ web2 ansible_host=10.1.1.12
|
||||
dbserver ansible_host=10.1.1.21
|
||||
```
|
||||
|
||||
templates/hosts.j2:
|
||||
`templates/hosts.j2`:
|
||||
|
||||
```
|
||||
10.1.1.11 web1
|
||||
@ -425,7 +422,7 @@ templates/hosts.j2:
|
||||
10.1.1.21 dbserver
|
||||
```
|
||||
|
||||
templates/my.cnf.j2:
|
||||
`templates/my.cnf.j2`:
|
||||
|
||||
```
|
||||
[client]
|
||||
@ -470,9 +467,11 @@ max_allowed_packet = 16M
|
||||
key_buffer = 16M
|
||||
|
||||
!includedir /etc/mysql/conf.d/
|
||||
```
|
||||
|
||||
final-playbook.yml:
|
||||
`final-playbook.yml`:
|
||||
|
||||
```
|
||||
- hosts: all
|
||||
become_user: root
|
||||
become: true
|
||||
@ -551,7 +550,7 @@ final-playbook.yml:
|
||||
shell: cd {{appdir}};rails server -b 0.0.0.0 -p 80 --pid /run/puma.pid -d
|
||||
```
|
||||
|
||||
### 打开你的环境
|
||||
### 放在你的环境中
|
||||
|
||||
将这些文件放在相同的目录,运行下面的命令打开你的开发环境:
|
||||
|
||||
@ -560,9 +559,9 @@ vagrant up
|
||||
ansible-playbook -i inventory final-playbook.yml
|
||||
```
|
||||
|
||||
#### 部署新的代码
|
||||
### 部署新的代码
|
||||
|
||||
确保修改了代码并push到了仓库中。接下来,确保你git语句中有正确的分支:
|
||||
确保修改了代码并推送到了仓库中。接下来,确保你 git 语句中使用了正确的分支:
|
||||
|
||||
```
|
||||
- name: 'Clone app repo'
|
||||
@ -573,19 +572,19 @@ ansible-playbook -i inventory final-playbook.yml
|
||||
force=yes
|
||||
```
|
||||
|
||||
作为一个例子,你可以在master上修改version字段,再次运行 playbook:
|
||||
作为一个例子,你可以修改 `version` 字段为 `master`,再次运行剧本:
|
||||
|
||||
```
|
||||
ansible-playbook -i inventory final-playbook.yml
|
||||
```
|
||||
|
||||
检查所有的 web 服务器上的页面是否已更改:`http:// 10.1.1.11` 或 `http:// 10.1.1.12`。将其更改为 `version = staging` 并重新运行 playbook 并再次检查页面。
|
||||
检查所有的 web 服务器上的页面是否已更改:`http://10.1.1.11` 或 `http://10.1.1.12`。将其更改为 `version = staging` 并重新运行剧本并再次检查页面。
|
||||
|
||||
你还可以创建只包含与部署相关的任务的替代 playbook,以便其运行更快。
|
||||
你还可以创建只包含与部署相关的任务的替代剧本,以便其运行更快。
|
||||
|
||||
### 接下来是什么 ?!
|
||||
|
||||
这只是可以做的很小一部分。我们没有接触角色、过滤器、调试器等许多其他很棒的功能,但我希望它给了你一个良好的开始!所以,请继续学习并使用它。如果你有任何问题,你可以在 twitter 或评论栏联系我,让我知道你还想知道哪些关于 ansible 的东西!
|
||||
这只是可以做的很小一部分。我们没有接触角色(role)、过滤器(filter)、调试等许多其他很棒的功能,但我希望它给了你一个良好的开始!所以,请继续学习并使用它。如果你有任何问题,你可以在 [twitter](https://twitter.com/c0d5x) 或评论栏联系我,让我知道你还想知道哪些关于 ansible 的东西!
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
@ -593,10 +592,8 @@ ansible-playbook -i inventory final-playbook.yml
|
||||
via: https://gorillalogic.com/blog/getting-started-with-ansible/?utm_source=webopsweekly&utm_medium=email
|
||||
|
||||
作者:[JOSE HIDALGO][a]
|
||||
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
347
published/201701/20161012 Introduction to FirewallD on CentOS.md
Normal file
347
published/201701/20161012 Introduction to FirewallD on CentOS.md
Normal file
@ -0,0 +1,347 @@
|
||||
CentOS 上的 FirewallD 简明指南
|
||||
============================================================
|
||||
|
||||
[FirewallD][4] 是 iptables 的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面,在大多数 Linux 发行版的仓库中都有。与直接控制 iptables 相比,使用 FirewallD 有两个主要区别:
|
||||
|
||||
1. FirewallD 使用区域和服务而不是链式规则。
|
||||
2. 它动态管理规则集,允许更新规则而不破坏现有会话和连接。
|
||||
|
||||
> FirewallD 是 iptables 的一个封装,可以让你更容易地管理 iptables 规则 - 它并*不是* iptables 的替代品。虽然 iptables 命令仍可用于 FirewallD,但建议使用 FirewallD 时仅使用 FirewallD 命令。
|
||||
|
||||
本指南将向您介绍 FirewallD 的区域和服务的概念,以及一些基本的配置步骤。
|
||||
|
||||
### 安装与管理 FirewallD
|
||||
|
||||
CentOS 7 和 Fedora 20+ 已经包含了 FirewallD,但是默认没有激活。可以像其它的 systemd 单元那样控制它。
|
||||
|
||||
1、 启动服务,并在系统引导时启动该服务:
|
||||
|
||||
```
|
||||
sudo systemctl start firewalld
|
||||
sudo systemctl enable firewalld
|
||||
```
|
||||
|
||||
要停止并禁用:
|
||||
|
||||
```
|
||||
sudo systemctl stop firewalld
|
||||
sudo systemctl disable firewalld
|
||||
```
|
||||
|
||||
2、 检查防火墙状态。输出应该是 `running` 或者 `not running`。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --state
|
||||
```
|
||||
|
||||
3、 要查看 FirewallD 守护进程的状态:
|
||||
|
||||
```
|
||||
sudo systemctl status firewalld
|
||||
```
|
||||
|
||||
示例输出
|
||||
|
||||
```
|
||||
firewalld.service - firewalld - dynamic firewall daemon
|
||||
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
|
||||
Active: active (running) since Wed 2015-09-02 18:03:22 UTC; 1min 12s ago
|
||||
Main PID: 11954 (firewalld)
|
||||
CGroup: /system.slice/firewalld.service
|
||||
└─11954 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
|
||||
```
|
||||
|
||||
4、 重新加载 FirewallD 配置:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --reload
|
||||
```
|
||||
|
||||
### 配置 FirewallD
|
||||
|
||||
FirewallD 使用 XML 进行配置。除非是非常特殊的配置,你不必处理它们,而应该使用 `firewall-cmd`。
|
||||
|
||||
配置文件位于两个目录中:
|
||||
|
||||
* `/usr/lib/FirewallD` 下保存默认配置,如默认区域和公用服务。 避免修改它们,因为每次 firewall 软件包更新时都会覆盖这些文件。
|
||||
* `/etc/firewalld` 下保存系统配置文件。 这些文件将覆盖默认配置。
|
||||
|
||||
#### 配置集
|
||||
|
||||
FirewallD 使用两个_配置集_:“运行时”和“持久”。 在系统重新启动或重新启动 FirewallD 时,不会保留运行时的配置更改,而对持久配置集的更改不会应用于正在运行的系统。
|
||||
|
||||
默认情况下,`firewall-cmd` 命令适用于运行时配置,但使用 `--permanent` 标志将保存到持久配置中。要添加和激活持久性规则,你可以使用两种方法之一。
|
||||
|
||||
1、 将规则同时添加到持久规则集和运行时规则集中。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-service=http --permanent
|
||||
sudo firewall-cmd --zone=public --add-service=http
|
||||
```
|
||||
|
||||
2、 将规则添加到持久规则集中并重新加载 FirewallD。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-service=http --permanent
|
||||
sudo firewall-cmd --reload
|
||||
```
|
||||
|
||||
> `reload` 命令会删除所有运行时配置并应用永久配置。因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。
|
||||
|
||||
### 防火墙的区域
|
||||
|
||||
“区域”是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。 首次启用 FirewallD 后,`public` 将是默认区域。
|
||||
|
||||
区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 `internal` 区域上允许 DHCP,但在`external` 区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。
|
||||
|
||||
要找到默认区域:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --get-default-zone
|
||||
```
|
||||
|
||||
要修改默认区域:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --set-default-zone=internal
|
||||
```
|
||||
|
||||
要查看你网络接口使用的区域:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --get-active-zones
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
public
|
||||
interfaces: eth0
|
||||
```
|
||||
|
||||
要得到特定区域的所有配置:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --list-all
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
public (default, active)
|
||||
interfaces: ens160
|
||||
sources:
|
||||
services: dhcpv6-client http ssh
|
||||
ports: 12345/tcp
|
||||
masquerade: no
|
||||
forward-ports:
|
||||
icmp-blocks:
|
||||
rich rules:
|
||||
```
|
||||
|
||||
要得到所有区域的配置:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --list-all-zones
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
block
|
||||
interfaces:
|
||||
sources:
|
||||
services:
|
||||
ports:
|
||||
masquerade: no
|
||||
forward-ports:
|
||||
icmp-blocks:
|
||||
rich rules:
|
||||
|
||||
...
|
||||
|
||||
work
|
||||
interfaces:
|
||||
sources:
|
||||
services: dhcpv6-client ipp-client ssh
|
||||
ports:
|
||||
masquerade: no
|
||||
forward-ports:
|
||||
icmp-blocks:
|
||||
rich rules:
|
||||
```
|
||||
|
||||
|
||||
#### 与服务一起使用
|
||||
|
||||
FirewallD 可以根据特定网络服务的预定义规则来允许相关流量。你可以创建自己的自定义系统规则,并将它们添加到任何区域。 默认支持的服务的配置文件位于 `/usr/lib /firewalld/services`,用户创建的服务文件在 `/etc/firewalld/services` 中。
|
||||
|
||||
要查看默认的可用服务:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --get-services
|
||||
```
|
||||
|
||||
比如,要启用或禁用 HTTP 服务:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-service=http --permanent
|
||||
sudo firewall-cmd --zone=public --remove-service=http --permanent
|
||||
```
|
||||
|
||||
#### 允许或者拒绝任意端口/协议
|
||||
|
||||
比如:允许或者禁用 12345 端口的 TCP 流量。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
|
||||
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent
|
||||
```
|
||||
|
||||
#### 端口转发
|
||||
|
||||
下面是**在同一台服务器上**将 80 端口的流量转发到 12345 端口。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
|
||||
```
|
||||
|
||||
要将端口转发到**另外一台服务器上**:
|
||||
|
||||
1、 在需要的区域中激活 masquerade。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-masquerade
|
||||
```
|
||||
|
||||
2、 添加转发规则。例子中是将 IP 地址为 :123.456.78.9 的_远程服务器上_ 80 端口的流量转发到 8080 上。
|
||||
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9
|
||||
```
|
||||
|
||||
要删除规则,用 `--remove` 替换 `--add`。比如:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --remove-masquerade
|
||||
```
|
||||
|
||||
### 用 FirewallD 构建规则集
|
||||
|
||||
例如,以下是如何使用 FirewallD 为你的服务器配置基本规则(如果您正在运行 web 服务器)。
|
||||
|
||||
1. 将 `eth0` 的默认区域设置为 `dmz`。 在所提供的默认区域中,dmz(非军事区)是最适合于这个程序的,因为它只允许 SSH 和 ICMP。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --set-default-zone=dmz
|
||||
sudo firewall-cmd --zone=dmz --add-interface=eth0
|
||||
```
|
||||
|
||||
2、 把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=dmz --add-service=http --permanent
|
||||
sudo firewall-cmd --zone=dmz --add-service=https --permanent
|
||||
```
|
||||
|
||||
3、 重新加载 FirewallD 让规则立即生效:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --reload
|
||||
```
|
||||
|
||||
如果你运行 `firewall-cmd --zone=dmz --list-all`, 会有下面的输出:
|
||||
|
||||
```
|
||||
dmz (default)
|
||||
interfaces: eth0
|
||||
sources:
|
||||
services: http https ssh
|
||||
ports:
|
||||
masquerade: no
|
||||
forward-ports:
|
||||
icmp-blocks:
|
||||
rich rules:
|
||||
```
|
||||
|
||||
这告诉我们,`dmz` 区域是我们的**默认**区域,它被用于 `eth0` 接口**中所有网络的**源地址**和**端口**。 允许传入 HTTP(端口 80)、HTTPS(端口 443)和 SSH(端口 22)的流量,并且由于没有 IP 版本控制的限制,这些适用于 IPv4 和 IPv6。 不允许**IP 伪装**以及**端口转发**。 我们没有 **ICMP 块**,所以 ICMP 流量是完全允许的。没有**丰富(Rich)规则**,允许所有出站流量。
|
||||
|
||||
### 高级配置
|
||||
|
||||
服务和端口适用于基本配置,但对于高级情景可能会限制较多。 丰富(Rich)规则和直接(Direct)接口允许你为任何端口、协议、地址和操作向任何区域 添加完全自定义的防火墙规则。
|
||||
|
||||
#### 丰富规则
|
||||
|
||||
丰富规则的语法有很多,但都完整地记录在 [firewalld.richlanguage(5)][5] 的手册页中(或在终端中 `man firewalld.richlanguage`)。 使用 `--add-rich-rule`、`--list-rich-rules` 、 `--remove-rich-rule` 和 firewall-cmd 命令来管理它们。
|
||||
|
||||
这里有一些常见的例子:
|
||||
|
||||
允许来自主机 192.168.0.14 的所有 IPv4 流量。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'
|
||||
```
|
||||
|
||||
拒绝来自主机 192.168.1.10 到 22 端口的 IPv4 的 TCP 流量。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'
|
||||
```
|
||||
|
||||
允许来自主机 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量,并将流量转发到 6532 端口上。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'
|
||||
```
|
||||
|
||||
将主机 172.31.4.2 上 80 端口的 IPv4 流量转发到 8080 端口(需要在区域上激活 masquerade)。
|
||||
|
||||
```
|
||||
sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'
|
||||
```
|
||||
|
||||
列出你目前的丰富规则:
|
||||
|
||||
```
|
||||
sudo firewall-cmd --list-rich-rules
|
||||
```
|
||||
|
||||
### iptables 的直接接口
|
||||
|
||||
对于最高级的使用,或对于 iptables 专家,FirewallD 提供了一个直接(Direct)接口,允许你给它传递原始 iptables 命令。 直接接口规则不是持久的,除非使用 `--permanent`。
|
||||
|
||||
要查看添加到 FirewallD 的所有自定义链或规则:
|
||||
|
||||
```
|
||||
firewall-cmd --direct --get-all-chains
|
||||
firewall-cmd --direct --get-all-rules
|
||||
```
|
||||
|
||||
讨论 iptables 的具体语法已经超出了这篇文章的范围。如果你想学习更多,你可以查看我们的 [iptables 指南][6]。
|
||||
|
||||
### 更多信息
|
||||
|
||||
你可以查阅以下资源以获取有关此主题的更多信息。虽然我们希望我们提供的是有效的,但是请注意,我们不能保证外部材料的准确性或及时性。
|
||||
|
||||
* [FirewallD 官方网站][1]
|
||||
* [RHEL 7 安全指南:FirewallD 简介][2]
|
||||
* [Fedora Wiki:FirewallD][3]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linode.com/docs/security/firewalls/introduction-to-firewalld-on-centos
|
||||
|
||||
作者:[Linode][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.linode.com/docs/security/firewalls/introduction-to-firewalld-on-centos
|
||||
[1]:http://www.firewalld.org/
|
||||
[2]:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld
|
||||
[3]:https://fedoraproject.org/wiki/FirewallD
|
||||
[4]:http://www.firewalld.org/
|
||||
[5]:https://jpopelka.fedorapeople.org/firewalld/doc/firewalld.richlanguage.html
|
||||
[6]:https://www.linode.com/docs/networking/firewalls/control-network-traffic-with-iptables
|
@ -1,13 +1,13 @@
|
||||
如何在 Ubuntu 16.10 的 Unity 8 上使用之前的 Xorg 程序
|
||||
如何在 Ubuntu 16.10 的 Unity 8 上运行老式 Xorg 程序
|
||||
====
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/10/unity8-feature-image.jpg "How to Use Old Xorg Apps in Unity 8 on Ubuntu 16.10s")
|
||||
|
||||
随着 Ubuntu 16.10 的发布,Unity 8 吸引到了比平时更多的目光。这是因为这个大家最爱的 Linux 发行版的最新版本进行着一项桌面显示实验。桌面发行版是人们最熟悉的 Unity 环境,但有一点点不同。它不再使用 X11 图形技术,Ubuntu的开发者选择了另一种截然不同的方式。
|
||||
随着 Ubuntu 16.10 的发布,Unity 8 越来越吸引到了更多人的关注。这是因为在这个大家最爱的 Linux 发行版的最新版本中可以体验其带有的试验性桌面。桌面发行版是人们最熟悉的 Unity 环境,但有一点点不同。它不再使用 X11 图形技术,Ubuntu 的开发者选择了另一种截然不同的方式。
|
||||
|
||||
原来,Unity 8 用的是 Mir,这是 Ubuntu 对 Linux 上更好显示服务的号召所做出的回答。这项技术已经 Ubuntu phone 和平板上大量使用,但是这次新版是我们在桌面环境上第一次见到 Mir 。
|
||||
原来,Unity 8 用的是 Mir,这是 Ubuntu 为了在 Linux 上提供显示服务而做出的努力。这项技术已经在 Ubuntu phone 和平板上大量使用,但是这次新版是我们在桌面环境上第一次见到 Mir 。
|
||||
|
||||
这项技术相当新颖,结果是没多少 Linux 程序能运行在它之上。不是所有,那也是大部分的程序被设计在 Xorg 和 X11 之上运行。如果你一直尝试在 Unity 8 上运行这些程序,当你了解到在 Unity 8上确实有可能运行之前的 Xorg 程序时,你会很开心的。接下来是如何做!
|
||||
这项技术相当新颖,结果是没多少 Linux 程序能运行在它之上。不是所有,那也是大部分的程序设计在 Xorg 和 X11 之上运行。如果你想要试试在 Unity 8 上运行这些程序,你肯定会为在 Unity 8上确实能够运行之前的 Xorg 程序而高兴。接下来是如何做!
|
||||
|
||||
### 登录进 Unity 8
|
||||
|
||||
@ -19,7 +19,7 @@ Unity 8 在 Ubuntu 16.10 上是一个可选会话。在使用之前只须牢记
|
||||
|
||||
### 安装 Libertine
|
||||
|
||||
Xorg 程序(例如 Firefox 等)确实能在 Unity 8 上使用,在使用之前需要一点小调整。在 Mir 桌面上用终端打开 Libertine ,在 scopes 窗口中点击终端图标就能完成。一旦打开,输入你的密码。接下来,输入以下的命令:
|
||||
Xorg 程序(例如 Firefox 等)确实能在 Unity 8 上使用,在使用之前需要一点小调整。在 Mir 桌面上用终端打开 Libertine ,在 Scopes 窗口中点击终端图标就能完成。一旦打开,输入你的密码。接下来,输入以下的命令:
|
||||
|
||||
![unity8-installing-libertine-in-terminal](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/10/unity8-installing-libertine-in-terminal.jpg "unity8-installing-libertine-in-terminal")
|
||||
|
||||
@ -27,15 +27,15 @@ Xorg 程序(例如 Firefox 等)确实能在 Unity 8 上使用,在使用之
|
||||
sudo apt install libertine-tools libertine-scope libertine
|
||||
```
|
||||
|
||||
当这些程序完成安装后,点击并拖动 scopes 窗口以刷新内容。然后,在面板上点击来启动libertine。
|
||||
当这些程序完成安装后,点击并拖动 Scopes 窗口以刷新内容。然后,在面板上点击来启动 libertine。
|
||||
|
||||
### 新建 Xorg 容器
|
||||
|
||||
打开 Libertine,就到时间来新建一些容器了。这些容器很特别,因为他们能让基于 X11 的 Linux 程序在 Mir/Unity 8 桌面上的容器之中运行。另外,点击“i386 multiarch support"复选框来获得 32 位支持。否则,什么都不要动(或者输入名字和密码),点击”OK”。
|
||||
打开 Libertine,就可以新建一些(应用)容器了。这些容器很特别,因为它们能让基于 X11 的 Linux 程序在 Mir/Unity 8 桌面上的容器之中运行。另外,如果需要支持 32 位应用,勾选“i386 multiarch support”复选框。否则,什么都不要动(或者输入名字和密码),点击“OK”。
|
||||
|
||||
![unity8-libertine-create-new-container](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/10/unity8-libertine-create-new-container.jpg "unity8-libertine-create-new-container")
|
||||
|
||||
在这之后,这个 Xorg 容器就准备好以供使用了。在 Libertine 找到它并启动。删除也很容易,右键点击容器,选择“删除”选项。
|
||||
在这之后,这个 Xorg 容器就准备好,可以使用了。在 Libertine 找到它并启动。删除也很容易,右键点击容器,选择“删除”选项。
|
||||
|
||||
**注意**:每一个 Xorg 容器有 500 MB的最大内存限制。所以多个容器是有必要的。
|
||||
|
||||
@ -43,23 +43,21 @@ sudo apt install libertine-tools libertine-scope libertine
|
||||
|
||||
![unity8-libertine-install-software](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/10/unity8-libertine-install-software.jpg "unity8-libertine-install-software")
|
||||
|
||||
两天内在 Libertine 容器中安装好软件。第一步允许用户启动容器后选择“输入包名或者 Debian 文件”,这意味着用户可以在软件中心或者终端找到一个软件的名字,然后输入 Libertine 来安装,也可以指定特定的 DEB 文件来安装,也可以在Libertine LXC 容器中直接搜索安装包。
|
||||
在 Libertine 容器中安装软件有两个方法。第一种是允许用户启动容器后选择“输入包名或者 Debian 文件”,这意味着用户可以在软件中心或者终端找到一个软件的名字,然后在 Libertine 中输入它来安装。也可以指定特定的 DEB 文件来安装,可以在Libertine LXC 容器中直接搜索安装包。
|
||||
|
||||
**注意**:Unity 8 非常新,一些程序或许不能在 Libertine 里加载或者完全安装。
|
||||
|
||||
### 结论
|
||||
|
||||
Unity 8展现了不少的新特性,它现代、时髦,而且比之前任何一个 Unity 迭代版本都快。唯一限制它的就是使用率。事实是大部分用户更乐意选择实用的应用程序,而不是一个别致新颖的桌面环境。某种程度上来说,使用 Libertine 能解决这个问题,但它不会永久有效。早晚有一天,Canonical 将有必要自行引进程序或者向社区求助来彻底解决这个问题。
|
||||
Unity 8 展现了不少的新特性,它现代、时髦,而且比之前任何一个 Unity 迭代版本都快。唯一限制它的就是使用率。事实是大部分用户更乐意选择实用的应用程序,而不是一个别致新颖的桌面环境。某种程度上来说,使用 Libertine 能解决这个问题,但它不会永久有效。早晚有一天,Canonical 都需要自行移植这些程序或者向社区求助来彻底解决这个问题。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/use-old-xorg-apps-unity-8/
|
||||
|
||||
作者:[Derrik Diener][a]
|
||||
|
||||
译者:[ypingcn](https://github.com/ypingcn)
|
||||
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,105 @@
|
||||
专注于云端的 Linux 发行版
|
||||
============================================================
|
||||
|
||||
[
|
||||
![Best Linux distributions for cloud computing](https://itsfoss.com/wp-content/uploads/2016/11/cloud-centric-Linux-distributions.jpg)
|
||||
][6]
|
||||
|
||||
概述:我们列举几款以云端为中心的 Linux 发行版,它们被视为真正能替代 Chrome OS 的 Linux 发行版。
|
||||
|
||||
世界正在向云端服务转变,而且我们都知道 Chrome OS 倍受人们喜爱。嗯,它确实值得赞许。它超级快、轻盈、省电、简约、设计精美而且充分发挥了当今科技所能提供的云端潜能。
|
||||
|
||||
虽然 [Chrome OS][7] 只能在谷歌的硬件上使用,但是,在你的台式机或者笔记本上,还是有其他的方法来体验云计算的潜能。
|
||||
|
||||
正如我重复所说的,在 Linux 领域中,人们总能参与其中,比如那些看起来像 Windows 或者 Mac OS 的Linux 发行版。Linux 汇集了分享,爱和计算体验的最前沿。让我们马上看看这份列表吧!
|
||||
|
||||
### 1、 Cub Linux
|
||||
|
||||
![Cub Linux Desktop](https://itsfoss.com/wp-content/uploads/2016/10/cub1.jpg)
|
||||
|
||||
这不是 Chrome OS ,上述图片描绘的是 Cub Linux 的桌面。不清楚我说的什么?
|
||||
|
||||
Cub Linux 对于 Linux 用户来说不是什么新鲜事,但是如果你确实不知道的话,(我来解释下,)Cub Linux 灵感来源于主流的 Chrome OS ,是一款专注于网页的 Linux 发行版。从母亲 Linux 来讲,它也是 Chrome OS 的开源兄弟。
|
||||
|
||||
Chrome OS 内置了 Chrome 浏览器。不久之前,一个名为 [Chromixium OS][10] 的项目启动,旨在用 Chromium 浏览器取代 Chrome 浏览器,来提供与 Chrome OS 同样的体验。因为一些法律上的争论,项目名字后来改为 Cub Linux (取自 **C**hromium 和 **Ub**untu 两个词)。
|
||||
|
||||
![cub2](https://itsfoss.com/wp-content/uploads/2016/10/cub2.jpg)
|
||||
|
||||
撇开历史不说,如名字提示的那样,Cub Linux 基于 Ubuntu ,使用了轻量的 Openbox 桌面环境。定制的桌面来给人以 Chrome OS 的印象,而且看起来很整洁。
|
||||
|
||||
在应用部分,你能安装 Chrome 网上商店的网页应用和所有的 Ubuntu 应用。对,有 Chrome OS 的精美应用,你仍能体会到 Ubuntu 的好处。
|
||||
|
||||
就表现而言,这操作系统相当快,这多亏了它自身的 Openbox 桌面环境。基于 Ubuntu ,Cub Linux 的稳定性是毋庸置疑的。这桌面流畅的动画和漂亮的用户界面,对于眼睛是一种享受。
|
||||
|
||||
我向花费大部分时间在浏览器,时不时做些家务的人推荐 Cub Linux 。嗯,一个浏览器就是你所需要的全部,而且,一个浏览器就可以让你得到全部。
|
||||
|
||||
### 2、Peppermint OS
|
||||
|
||||
不少人把目光投向 Linux 因为他们想要一个良好的使用计算机的体验。一些人是真的不喜欢防病毒软件、磁盘整理程序、清理工具的打扰,他们只是想要一个操作系统而不是个孩子。我必须说 Peppermint OS 真的不会打扰用户。[Peppermint OS][12] 的开发者在理解用户需求上花费了大量的时间精力。
|
||||
|
||||
![pep1](https://itsfoss.com/wp-content/uploads/2016/11/pep1.jpg)
|
||||
|
||||
系统默认内置了很少的软件。从每一个软件类别挑选的一些应用内置进去,这种传统的想法没有被开发者所采纳,这是为了良好的用户体验。个性化定制电脑的权力已经移交给用户。顺便说一句,当能用网页替代几乎大部分应用时,我们真的需要安装那么多的应用吗?
|
||||
|
||||
**Ice**
|
||||
|
||||
Ice 是一个有用的小工具,它能将你最喜爱和经常用到的网页转化成桌面应用,这样你就能直接从你的桌面或菜单启动。这就是我们所说的特定页浏览器。
|
||||
|
||||
![pep4](https://itsfoss.com/wp-content/uploads/2016/11/pep4.jpg)
|
||||
|
||||
喜欢 facebook ?想要快速启动,为什么不弄一个 facebook 的网页应用在你的桌面上?当人们抱怨 Linux 上不知如何正确安装 Google Drive 应用时,Ice 能让你在一次单击就能访问
|
||||
|
||||
Peppermint OS 7 是基于 Ubuntu 16.04 。它不仅有流畅、稳固的表现,而且反应很快。一个深度定制的 LXDE 将会是你的首页。我所说的定制是兼顾了华丽的表现和视觉吸引力。
|
||||
|
||||
Peppermint OS 介于云操作系统和本地操作系统。虽然这个操作系统的框架被设计来支持快速的云端应用,但是本地的 Ubuntu 应用运行得也不错。如果你是像我那样,想要一个能在在线和离线之间保持平衡的操作系统的话,[Peppermint OS][13] 很适合你。
|
||||
|
||||
### 3、Apricity OS
|
||||
|
||||
[Apricity OS][15] 在这里是极具美感的 Linux 发行版之一。它就像是 Linux 里的蒙娜丽莎。但是,不止外观优美,它还有更多优点。
|
||||
|
||||
![ap2](https://itsfoss.com/wp-content/uploads/2016/11/ap2.jpg)
|
||||
|
||||
将 [Apricity OS][16] 加入这名单中的基本理由是它的简洁。当桌面操作系统设计变得越来越乱、堆砌元素时(我不只是在讨论非 Linux 操作系统),Apricity 除去所有杂项,简化最基本的人机交互。在这,Gnome 桌面环境被定制得非常优美。他们使其变得更简单。
|
||||
|
||||
预装的软件真的很少。几乎所有的 Linux 发行版都预装一样的预装软件。但是 Apricity OS 有一个全新的软件集合。提供了 Chrome 而不是 Firefox 。我真的很期待这点。我是说为什么不在外面告诉我们改变了什么?
|
||||
|
||||
Apricity OS 也展现了我们在上一段讨论的 Ice 工具。但不是 Firefox ,而是将 Chrome 浏览器用在网页-桌面一体化里。Apricity OS 默认内置了 Numix Circle 图标。每一次你添加一个流行的网页应用,那就会有一个优美的图标放在你的底栏上。
|
||||
|
||||
![](https://itsfoss.com/wp-content/uploads/2016/11/ap1.jpg)
|
||||
|
||||
看见我所说的了吗?
|
||||
|
||||
Apricity OS 基于 Arch Linux 。(所以任何想要快速上手 Arch ,想要优美发行版的人,来[这里][17]下载 Apricity 的 ISO 文件吧。) Apricity 完全保持了 Arch “选择自由”的原则。在 Ice 上只要花费十分钟,你就能把你所有喜爱的网页应用配置好。
|
||||
|
||||
华丽的背景,极简主义的桌面和一大堆的功能。这些特性使得 Apricity OS 在建立一个很棒的云端系统方面成为一个极佳选择。在 Apricity OS 花上 5 分钟,你就会完全爱上它。我是认真的。
|
||||
|
||||
到此你就看完了全部,这是给网上居住者的云端 Linux 发行版。给我们一些关于网页应用和本地应用话题的看法。别忘了分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/cloud-focused-linux-distros/
|
||||
|
||||
作者:[Aquil Roshan][a]
|
||||
译者:[ypingcn](https://github.com/ypingcn)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://itsfoss.com/author/aquil/
|
||||
[1]:https://itsfoss.com/author/aquil/
|
||||
[2]:https://itsfoss.com/cloud-focused-linux-distros/#comments
|
||||
[3]:https://twitter.com/share?original_referer=https%3A%2F%2Fitsfoss.com%2F&source=tweetbutton&text=Cloud+Focused+Linux+Distros+For+People+Who+Breathe+Online&url=https%3A%2F%2Fitsfoss.com%2Fcloud-focused-linux-distros%2F&via=%40itsfoss
|
||||
[4]:https://www.linkedin.com/cws/share?url=https://itsfoss.com/cloud-focused-linux-distros/
|
||||
[5]:http://pinterest.com/pin/create/button/?url=https://itsfoss.com/cloud-focused-linux-distros/&description=Cloud+Focused+Linux+Distros+For+People+Who+Breathe+Online&media=https://itsfoss.com/wp-content/uploads/2016/11/cloud-centric-Linux-distributions.jpg
|
||||
[6]:https://itsfoss.com/wp-content/uploads/2016/11/cloud-centric-Linux-distributions.jpg
|
||||
[7]:https://en.wikipedia.org/wiki/Chrome_OS
|
||||
[8]:https://itsfoss.com/windows-like-linux-distributions/
|
||||
[9]:https://cublinux.com/
|
||||
[10]:https://itsfoss.com/chromixiumos-released/
|
||||
[11]:https://itsfoss.com/year-2013-linux-2-linux-distributions-discontinued/
|
||||
[12]:https://peppermintos.com/
|
||||
[13]:https://peppermintos.com/
|
||||
[14]:https://itsfoss.com/pennsylvania-high-school-ubuntu/
|
||||
[15]:https://apricityos.com/
|
||||
[16]:https://itsfoss.com/apricity-os/
|
||||
[17]:https://apricityos.com/
|
120
published/201701/20161126 Building Vim from source.md
Normal file
120
published/201701/20161126 Building Vim from source.md
Normal file
@ -0,0 +1,120 @@
|
||||
从源代码编译 Vim 8.0
|
||||
========
|
||||
|
||||
从源代码编译 Vim 实际上并不那么困难。下面是你所要做的:
|
||||
|
||||
1、首先,安装包括 Git 在内的所有必备的库。对于一个 Debian 类的 Linux 发行版,例如 Ubuntu,命令如下:
|
||||
|
||||
```
|
||||
sudo apt-get install libncurses5-dev libgnome2-dev libgnomeui-dev \
|
||||
libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \
|
||||
libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev \
|
||||
python3-dev ruby-dev lua5.1 lua5.1-dev libperl-dev git
|
||||
```
|
||||
|
||||
在 Ubuntu 16.04 上,lua 开发包的名称是 `liblua5.1-dev` 而非 `lua5.1-dev`。
|
||||
|
||||
如果你知道你将使用哪种语言,可随意删去你不需要的包。例如:Python2 `python-dev` 或者是 Ruby `ruby-dev`。这一原则适用于本文的大部分内容。
|
||||
|
||||
对于 Fedora 20,将是以下命令:
|
||||
|
||||
```
|
||||
sudo yum install -y ruby ruby-devel lua lua-devel luajit \
|
||||
luajit-devel ctags git python python-devel \
|
||||
python3 python3-devel tcl-devel \
|
||||
perl perl-devel perl-ExtUtils-ParseXS \
|
||||
perl-ExtUtils-XSpp perl-ExtUtils-CBuilder \
|
||||
perl-ExtUtils-Embed
|
||||
```
|
||||
|
||||
在 Fedora 20 上需要这一步来纠正安装 XSubPP 时出现的问题:
|
||||
|
||||
```
|
||||
# 从 /usr/bin 到 perl 目录做个 xsubpp (perl) 的符号链接
|
||||
sudo ln -s /usr/bin/xsubpp /usr/share/perl5/ExtUtils/xsubpp
|
||||
```
|
||||
|
||||
2、 如果你已经安装了 vim,删掉它。
|
||||
|
||||
```
|
||||
sudo apt-get remove vim vim-runtime gvim
|
||||
```
|
||||
|
||||
如果是 Ubuntu 12.04.2,你或许也需要同时删除下面这些软件包:
|
||||
|
||||
```
|
||||
sudo apt-get remove vim-tiny vim-common vim-gui-common vim-nox
|
||||
```
|
||||
|
||||
3、 一旦上述内容都被安装好之后,获取 vim 源代码很容易。
|
||||
|
||||
注意:如果你使用 python,你的配置目录或许有一个特定的机器名 (例如 `config-3.5m-x86_64-linux-gnu`)。检查 `/usr/lib/python[2/3/3.5]` 目录来找到你的 python 配置目录,据此更改 `python-config-dir` 和/或 `python3-config-dir `的参数。
|
||||
|
||||
添加/删除下面的编译参数以适合您的设置。例如,如果您不打算写任何 Lua 脚本,您可以删去 `enable-luainterp`。
|
||||
|
||||
同时,如果你使用的不是 vim 8.0,请确认下面 `VIMRUNTIMEDIR` 参数设置正确(例如,如果使用 vim 8.0a, 就用 `/usr/share/vim/vim80a`)。记住,一些 vim 安装是直接安装在 `/usr/share/vim` 下的;调整好参数以适应你的系统:
|
||||
|
||||
```
|
||||
cd ~
|
||||
git clone https://github.com/vim/vim.git
|
||||
cd vim
|
||||
./configure --with-features=huge \
|
||||
--enable-multibyte \
|
||||
--enable-rubyinterp=yes \
|
||||
--enable-pythoninterp=yes \
|
||||
--with-python-config-dir=/usr/lib/python2.7/config \
|
||||
--enable-python3interp=yes \
|
||||
--with-python3-config-dir=/usr/lib/python3.5/config \
|
||||
--enable-perlinterp=yes \
|
||||
--enable-luainterp=yes \
|
||||
--enable-gui=gtk2 --enable-cscope --prefix=/usr
|
||||
make VIMRUNTIMEDIR=/usr/share/vim/vim80
|
||||
```
|
||||
|
||||
在 Ubuntu 16.04 上,由于同时开启了 Python2 和 Python3,Python 支持将不工作。 阅读 [chirinosky 的回答](http://stackoverflow.com/questions/23023783/vim-compiled-with-python-support-but-cant-see-sys-version) 以获取变通的处理方法。
|
||||
|
||||
如果你想将来轻松卸载 vim,可以使用 `checkinstall` 来安装 。
|
||||
|
||||
```
|
||||
sudo apt-get install checkinstall
|
||||
cd ~/vim
|
||||
sudo checkinstall
|
||||
```
|
||||
|
||||
否则,可以使用 `make` 来安装。
|
||||
|
||||
```
|
||||
cd ~/vim
|
||||
sudo make install
|
||||
```
|
||||
|
||||
要让 vim 成为你默认的编辑器,请使用 `update-alternatives`。
|
||||
|
||||
```
|
||||
sudo update-alternatives --install /usr/bin/editor editor /usr/bin/vim 1
|
||||
sudo update-alternatives --set editor /usr/bin/vim
|
||||
sudo update-alternatives --install /usr/bin/vi vi /usr/bin/vim 1
|
||||
sudo update-alternatives --set vi /usr/bin/vim
|
||||
```
|
||||
|
||||
4、 再检查下,通过查看 `vim --version` 输出来确认确实在运行新的 Vim 应用程序版本。
|
||||
|
||||
**如果你的 gvim 不工作(在 ubuntu 12.04.1 LTS 上),试着把 `--enable-gui=gtk2` 参数变为 `--enable-gui=gnome2`。**
|
||||
|
||||
如果你遇到问题,仔细检查在步骤 3 开始提到的,使用正确的 Python 配置目录配置 `configure`。
|
||||
|
||||
这些 `configure` 和 `make` 命令假设你是一个 Debian 发行版,Vim 的运行库文件目录放在 `/usr/share/vim/vim80/`,这不是 vim 的默认路径。 在 `configure` 命令中的 `--prefix=/usr` 也是如此。这些参数或许对一个不是基于 Debian 的 Linux 发行版来说是有所不同的,在这种情况下,试着移除 `configure` 命令中的 `--prefix` 变量和 `make` 命令中的 `VIMRUNTIMEDIR` (换句话说,使用这些参数的默认值)。
|
||||
|
||||
如果你遇到麻烦, 这里是一些[其它编译 Vim 的有用的信息](http://vim.wikia.com/wiki/Building_Vim)。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source
|
||||
|
||||
作者:[Val Markovic][a]
|
||||
译者:[zky001](https://github.com/zky001)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://github.com/Valloric
|
184
published/201701/20161128 Managing devices in Linux.md
Normal file
184
published/201701/20161128 Managing devices in Linux.md
Normal file
@ -0,0 +1,184 @@
|
||||
在 Linux 中管理设备
|
||||
=============
|
||||
|
||||
探索 `/dev` 目录可以让您知道如何直接访问到 Linux 中的设备。
|
||||
|
||||
![Managing devices in Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_Penguin_Image_520x292_12324207_0714_mm_v1a.png itok=WfAkwbFy "Managing devices in Linux")
|
||||
|
||||
*照片提供:Opensource.com*
|
||||
|
||||
Linux 目录结构中有很多有趣的功能,这次我会讲到 `/dev` 目录一些迷人之处。在继续阅读这篇文章之前,建议你看看我前面的文章。[Linux 文件系统][9],[一切皆为文件][8],这两篇文章介绍了一些有趣的 Linux 文件系统概念。请先看看 - 我会等你看完再回来。
|
||||
|
||||
……
|
||||
|
||||
太好了 !欢迎回来。现在我们可以继续更详尽地探讨 `/dev` 目录。
|
||||
|
||||
### 设备文件
|
||||
|
||||
设备文件也称为[设备特定文件][4]。设备文件用来为操作系统和用户提供它们代表的设备接口。所有的 Linux 设备文件均位于 `/dev` 目录下,是根 (`/`) 文件系统的一个组成部分,因为这些设备文件在操作系统启动过程中必须可以使用。
|
||||
|
||||
关于这些设备文件,要记住的一件重要的事情,就是它们大多不是设备驱动程序。更准确地描述来说,它们是设备驱动程序的门户。数据从应用程序或操作系统传递到设备文件,然后设备文件将它传递给设备驱动程序,驱动程序再将它发给物理设备。反向的数据通道也可以用,从物理设备通过设备驱动程序,再到设备文件,最后到达应用程序或其他设备。
|
||||
|
||||
让我们以一个典型命令的数据流程来直观地看看。
|
||||
|
||||
![dboth-dev-dir_0.png](https://opensource.com/sites/default/files/images/life-uploads/dboth-dev-dir_0.png)
|
||||
|
||||
*图 1:一个典型命令的简单数据流程。*
|
||||
|
||||
在上面的图 1 中,显示一个简单命令的简化数据流程。从一个 GUI 终端仿真器,例如 Konsole 或 xterm 中发出 `cat /etc/resolv.conf` 命令,它会从磁盘中读取 `resolv.conf` 文件,磁盘设备驱动程序处理设备的具体功能,例如在硬盘驱动器上定位文件并读取它。数据通过设备文件传递,然后从命令到设备文件,然后到 6 号伪终端的设备驱动,然后在终端会话中显示。
|
||||
|
||||
当然, `cat` 命令的输出可以以下面的方式被重定向到一个文件, `cat /etc/resolv.conf > /etc/resolv.bak` ,这样会创建该文件的备份。在这种情况下,图 1 左侧的数据流量将保持不变,而右边的数据流量将通过 `/dev/sda2` 设备文件、硬盘设备驱动程序,然后到硬盘驱动器本身。
|
||||
|
||||
这些设备文件使得使用标准流 (STD/IO) 和重定向访问 Linux 或 Unix 计算机上的任何一个设备非常容易。只需将数据流定向到设备文件,即可将数据发送到该设备。
|
||||
|
||||
### 设备文件类别
|
||||
|
||||
设备文件至少可以按两种方式划分。第一种也是最常用的分类是根据与设备相关联的数据流进行划分。比如,tty (teletype) 和串行设备被认为是基于字符的,因为数据流的传送和处理是以一次一个字符或字节进行的;而块类型设备(如硬盘驱动器)是以块为单位传输数据,通常为 256 个字节的倍数。
|
||||
|
||||
您可以在终端上以一个非 root 用户,改变当前工作目录(`PWD`)到 `/dev` ,并显示长目录列表。 这将显示设备文件列表、文件权限及其主、次设备号。 例如,下面的设备文件只是我的 Fedora 24 工作站上 `/dev` 目录中的几个文件。 它们表示磁盘和 tty 设备类型。 注意输出中每行的最左边的字符。 `b` 代表是块类型设备,`c` 代表字符设备。
|
||||
|
||||
```
|
||||
brw-rw---- 1 root disk 8, 0 Nov 7 07:06 sda
|
||||
brw-rw---- 1 root disk 8, 1 Nov 7 07:06 sda1
|
||||
brw-rw---- 1 root disk 8, 16 Nov 7 07:06 sdb
|
||||
brw-rw---- 1 root disk 8, 17 Nov 7 07:06 sdb1
|
||||
brw-rw---- 1 root disk 8, 18 Nov 7 07:06 sdb2
|
||||
crw--w---- 1 root tty 4, 0 Nov 7 07:06 tty0
|
||||
crw--w---- 1 root tty 4, 1 Nov 7 07:07 tty1
|
||||
crw--w---- 1 root tty 4, 10 Nov 7 07:06 tty10
|
||||
crw--w---- 1 root tty 4, 11 Nov 7 07:06 tty11
|
||||
```
|
||||
|
||||
识别设备文件更详细和更明确的方法是使用设备主要以及次要号。 磁盘设备主设备号为 8,将它们指定为 SCSI 块设备。请注意,所有 PATA 和 SATA 硬盘驱动器都由 SCSI 子系统管理,因为旧的 ATA 子系统多年前就由于代码质量糟糕而被认为不可维护。造成的结果就是,以前被称为 “hd[a-z]” 的硬盘驱动器现在被称为 “sd[a-z]”。
|
||||
|
||||
你大概可以从上面的示例中推出磁盘驱动器次设备号的模式。次设备号 0、 16、 32 等等,直到 240,是整个磁盘的号。所以主/次 8/16 表示整个磁盘 `/dev/sdb` , 8/17 是第一个分区的设备文件,`/dev/sdb1`。数字 8/34 代表 `/dev/sdc2`。
|
||||
|
||||
在上面列表中的 tty 设备文件编号更简单一些,从 tty0 到 tty63 。
|
||||
|
||||
Kernel.org 上的 [Linux 下的已分配设备][5]文件是设备类型和主次编号分配的正式注册表。它可以帮助您了解所有当前定义的设备的主要/次要号码。
|
||||
|
||||
### 趣味设备文件
|
||||
|
||||
让我们花几分钟时间,执行几个有趣的实验,演示 Linux 设备文件的强大和灵活性。 大多数 Linux 发行版都有 1 到 7 个虚拟控制台,可用于使用 shell 接口登录到本地控制台会话。 可以使用 `Ctrl-Alt-F1`(控制台 1),`Ctrl-Alt-F2`(控制台 2)等键盘组合键来访问。
|
||||
|
||||
请按 `Ctrl-Alt-F2` 切换到控制台 2。在某些发行版,登录显示的信息包括了与此控制台关联的 tty 设备,但大多不包括。它应该是 tty2,因为你是在控制台 2 中。
|
||||
|
||||
以非 root 用户身份登录。 然后你可以使用 `who am i` 命令 — 是的,就是这个命令,带空格 — 来确定哪个 tty 设备连接到这个控制台。
|
||||
|
||||
在我们实际执行此实验之前,看看 `/dev` 中的 tty2 和 tty3 的设备列表。
|
||||
|
||||
```
|
||||
ls -l /dev/tty[23]
|
||||
```
|
||||
|
||||
有大量的 tty 设备,但我们不关心他们中的大多数,只注意 tty2 和 tty3 设备。 作为设备文件,它们没什么特别之处。它们都只是字符类型设备。我们将使用这些设备进行此实验。 tty2 设备连接到虚拟控制台 2,tty3 设备连接到虚拟控制台 3。
|
||||
|
||||
按 `Ctrl-Alt-F3` 切换到控制台 3。再次以同一非 root 用户身份登录。 现在在控制台 3 上输入以下命令。
|
||||
|
||||
```
|
||||
echo "Hello world" > /dev/tty2
|
||||
```
|
||||
|
||||
按 `Ctrl-Alt-f2` 键以返回到控制台 2。字符串 “Hello world”(没有引号)将显示在控制台 2。
|
||||
|
||||
该实验也可以使用 GUI 桌面上的终端仿真器来执行。 桌面上的终端会话使用 `/dev` 中的伪终端设备,如 `/dev/pts/1`。 使用 Konsole 或 Xterm 打开两个终端会话。 确定它们连接到哪些伪终端,并使用一个向另一个发送消息。
|
||||
|
||||
现在继续实验,使用 `cat` 命令,试试在不同的终端上显示 `/etc/fstab` 文件。
|
||||
|
||||
另一个有趣的实验是使用 `cat` 命令将文件直接打印到打印机。 假设您的打印机设备是 `/dev/usb/lp0`,并且您的打印机可以直接打印 PDF 文件,以下命令将在您的打印机上打印 `test.pdf` 文件。
|
||||
|
||||
```
|
||||
cat test.pdf > /dev/usb/lp0
|
||||
```
|
||||
|
||||
`/dev` 目录包含一些非常有趣的设备文件,这些文件是硬件的入口,人们通常不认为这是硬盘驱动器或显示器之类的设备。 例如,系统存储器 RAM 不是通常被认为是“设备”的东西,而 `/dev/mem` 是通过其可以实现对存储器的直接访问的入口。 下面的例子有一些有趣的结果。
|
||||
|
||||
```
|
||||
dd if=/dev/mem bs=2048 count=100
|
||||
```
|
||||
|
||||
上面的 `dd` 命令提供比简单地使用 `cat` 命令 dump 所有系统的内存提供了更多的控制。 它提供了指定从 `/dev/mem` 读取多少数据的能力,还允许指定从存储器哪里开始读取数据。虽然读取了一些内存,但内核响应了以下错误,在 `/var/log/messages` 中可以看到。
|
||||
|
||||
```
|
||||
Nov 14 14:37:31 david kernel: usercopy: kernel memory exposure attempt detected from ffff9f78c0010000 (dma-kmalloc-512) (2048 bytes)
|
||||
```
|
||||
|
||||
这个错误意味着内核正在通过保护属于其他进程的内存来完成它的工作,这正是它应该工作的方式。 所以,虽然可以使用 `/dev/mem` 来显示存储在 RAM 内存中的数据,但是访问的大多数内存空间是受保护的并且会导致错误。 只可以访问由内核内存管理器分配给运行 `dd` 命令的 BASH shell 的虚拟内存,而不会导致错误。 抱歉,但你不能窥视不属于你的内存,除非你发现了一个可利用的漏洞。
|
||||
|
||||
`/dev` 中还有一些非常有趣的设备文件。 设备文件 `null`,`zero`,`random` 和 `urandom` 不与任何物理设备相关联。
|
||||
|
||||
例如,空设备 `/dev/null` 可以用作来自 shell 命令或程序的输出重定向的目标,以便它们不显示在终端上。 我经常在我的 BASH 脚本中使用这个,以防止向用户展示可能会让他们感到困惑的输出。 `/dev/null` 设备可用于产生一个空字符串。 使用如下所示的 `dd` 命令查看 `/dev/null` 设备文件的一些输出。
|
||||
|
||||
```
|
||||
# dd if=/dev/null bs=512 count=500 | od -c
|
||||
0+0 records in
|
||||
0+0 records out
|
||||
0 bytes copied, 1.5885e-05 s, 0.0 kB/s
|
||||
0000000
|
||||
```
|
||||
|
||||
注意,因为空字符什么也没有所以确实没有可见的输出。 注意看看字节数。
|
||||
|
||||
`/dev/random` 和 `/dev/urandom` 设备也很有趣。 正如它们的名字所暗示的,它们都产生随机输出,不仅仅是数字,而是任何字节组合。 `/dev/urandom` 设备产生的是**确定性**的随机输出,并且非常快。 这意味着输出由算法确定,并使用种子字符串作为起点。 结果,如果原始种子是已知的,则黑客可以再现输出,尽管非常困难,但这是有可能的。 使用命令 `cat /dev/urandom` 可以查看典型的输出,使用 `Ctrl-c` 退出。
|
||||
|
||||
`/dev/random` 设备文件生成**非确定性**的随机输出,但它产生的输出更慢一些。 该输出不是由依赖于先前数字的算法确定的,而是由击键动作和鼠标移动而产生的。 这种方法使得复制特定系列的随机数要困难得多。使用 `cat` 命令去查看一些来自 `/dev/random` 设备文件输出。尝试移动鼠标以查看它如何影响输出。
|
||||
|
||||
正如其名字所暗示的,`/dev/zero` 设备文件产生一个无止境的零作为输出。 注意,这些是八进制零,而不是ASCII字符零(`0`)。 使用如下所示的 `dd` 查看 `/dev/zero` 设备文件中的一些输出
|
||||
|
||||
```
|
||||
# dd if=/dev/zero bs=512 count=500 | od -c
|
||||
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
|
||||
*
|
||||
500+0 records in
|
||||
500+0 records out
|
||||
256000 bytes (256 kB, 250 KiB) copied, 0.00126996 s, 202 MB/s
|
||||
0764000
|
||||
```
|
||||
|
||||
请注意,此命令的字节数不为零。
|
||||
|
||||
### 创建设备文件
|
||||
|
||||
在过去,在 `/dev` 中的设备文件都是在安装时创建的,导致一个目录中有几乎所有的设备文件,尽管大多数文件永远不会用到。 在不常发生的情况,例如需要新的设备文件,或意外删除后需要重新创建设备文件,可以使用 `mknod` 程序手动创建设备文件。 前提是你必须知道设备的主要和次要号码。
|
||||
|
||||
CentOS 和 RHEL 6、7,以及 Fedora 的所有版本——可以追溯到至少 Fedora 15,使用较新的创建设备文件的方法。 所有设备文件都是在引导时创建的。 这是因为 udev 设备管理器在设备添加和删除发生时会进行检测。这可实现在主机启动和运行时的真正的动态即插即用功能。 它还在引导时执行相同的任务,通过在引导过程的很早的时期检测系统上安装的所有设备。 [Linux.com][6] 上有一篇很棒的对 [udev 的描述][7]。
|
||||
|
||||
回到 `/dev` 中的文件列表,注意文件的日期和时间。 所有文件都是在上次启动时创建的。 您可以使用 `uptime` 或者 `last` 命令来验证这一点。在上面我的设备列表中,所有这些文件都是在 11 月 7 日上午 7:06 创建的,这是我最后一次启动系统。
|
||||
|
||||
当然, `mknod` 命令仍然可用, 但新的 `MAKEDEV` (是的,所有字母大写,在我看来是违背 Linux 使用小写命令名的原则的) 命令提供了一个创建设备文件的更容易的界面。 在当前版本的 Fedora 或 CentOS 7 中,默认情况下不安装 `MAKEDEV` 命令;它安装在 CentOS 6。您可以使用 YUM 或 DNF 来安装 MAKEDEV 包。
|
||||
|
||||
### 结论
|
||||
|
||||
有趣的是,我很久没有创建一个设备文件的需要了。 然而,最近我遇到一个有趣的情况,其中一个我常使用的设备文件没有创建,我不得不创建它。 之后该设备再没出过问题。所以丢失设备文件的情况仍然可以发生,知道如何处理它可能很重要。
|
||||
|
||||
设备文件有无数种,您遇到的设备文件我可能没有涵盖到。 这些信息在所下面引用的资源中有大量的细节信息可用。 关于这些文件的功能和工具,我希望我已经给您一些基本的了解,下一步您自己可以探索更多。
|
||||
|
||||
资源
|
||||
|
||||
- [一切皆文件][1], David Both, Opensource.com
|
||||
- [Linux 文件系统介绍][2], David Both, Opensource.com
|
||||
- [文件系统层次结构][10], The Linux Documentation Project
|
||||
- [设备文件][4], Wikipedia
|
||||
- [Linux 下已分配设备][5], Kernel.org
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/16/11/managing-devices-linux
|
||||
|
||||
作者:[David Both][a]
|
||||
译者:[erlinux](http://www.itxdm.me)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/dboth
|
||||
[1]:https://opensource.com/life/15/9/everything-is-a-file
|
||||
[2]:https://opensource.com/life/16/10/introduction-linux-filesystems
|
||||
[4]:https://en.wikipedia.org/wiki/Device_file
|
||||
[5]:https://www.kernel.org/doc/Documentation/devices.txt
|
||||
[6]:https://www.linux.com/
|
||||
[7]:https://www.linux.com/news/udev-introduction-device-management-modern-linux-system
|
||||
[8]:https://opensource.com/life/15/9/everything-is-a-file
|
||||
[9]:https://opensource.com/life/16/10/introduction-linux-filesystems
|
||||
[10]:http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/dev.html
|
||||
|
133
published/201701/20161201 Using the NTP time synchronization.md
Normal file
133
published/201701/20161201 Using the NTP time synchronization.md
Normal file
@ -0,0 +1,133 @@
|
||||
在 Ubuntu 中使用 NTP 进行时间同步
|
||||
==========
|
||||
|
||||
NTP 是通过网络来同步时间的一种 TCP/IP 协议。通常客户端向服务器请求当前的时间,并根据结果来设置其时钟。
|
||||
|
||||
这个描述是挺简单的,实现这一功能却是极为复杂的 - 首先要有多层 NTP 服务器,第一层 NTP 服务器连接原子时钟,第二层、第三层服务器则担起负载均衡的责任,以处理因特网传来的所有请求。另外,客户端可能也超乎你想象的复杂 - 它必须排除通讯延迟,调整时间的同时不干扰其它在服务器中运行的进程。幸运的是,所有的这些复杂性都进行了封装,你是不可见也不需要见到的。
|
||||
|
||||
在 Ubuntu 中,是使用 `ntpdate` 和 `ntpd` 来同步时间的。
|
||||
|
||||
* [timedatectl](#timedatectl)
|
||||
* [timesyncd](#timesyncd)
|
||||
* [ntpdate](#ntpdate)
|
||||
* [timeservers](#timeservers)
|
||||
* [ntpd](#ntpd)
|
||||
* [安装](#installation)
|
||||
* [配置](#configuration)
|
||||
* [View status](#status)
|
||||
* [PPS Support](#Support)
|
||||
* [参考资料](#reference)
|
||||
|
||||
### <span id="timedatectl">timedatectl</span>
|
||||
|
||||
在最新的 Ubuntu 版本中,`timedatectl` 替代了老旧的 `ntpdate`。默认情况下,`timedatectl` 在系统启动的时候会立刻同步时间,并在稍后网络连接激活后通过 socket 再次检查一次。
|
||||
|
||||
如果已安装了 `ntpdate` / `ntp`,`timedatectl` 会退而让你使用之前的设置。这样确保了两个时间同步服务不会相互冲突,同时在你升级的时候还保留原本的行为和配置。但这也意味着从旧版本的发行版升级时 `ntp`/`ntpdate` 仍会安装,因此会导致新的基于 systemd 的时间服务被禁用。
|
||||
|
||||
### <span id="timesyncd">timesyncd</span>
|
||||
|
||||
在最新的 Ubuntu 版本中,`timesyncd` 替代了 `ntpd` 的客户端的部分。默认情况下 `timesyncd` 会定期检测并同步时间。它还会在本地存储更新的时间,以便在系统重启时做时间单步调整。
|
||||
|
||||
通过 `timedatectl` 和 `timesyncd` 设置的当前时间状态和时间配置,可以使用 `timedatectl status` 命令来进行确认。
|
||||
|
||||
```
|
||||
timedatectl status
|
||||
Local time: Fri 2016-04-29 06:32:57 UTC
|
||||
Universal time: Fri 2016-04-29 06:32:57 UTC
|
||||
RTC time: Fri 2016-04-29 07:44:02
|
||||
Time zone: Etc/UTC (UTC, +0000)
|
||||
Network time on: yes
|
||||
NTP synchronized: no
|
||||
RTC in local TZ: no
|
||||
```
|
||||
|
||||
如果安装了 NTP,并用它替代 `timedatectl` 来同步时间,则 `NTP synchronized` 将被设置为 `yes`。
|
||||
|
||||
`timedatectl` 和 `timesyncd` 用来获取时间的 nameserver 可以通过 `/etc/systemd/timesyncd.conf` 来指定,另外在 `/etc/systemd/timesyncd.conf.d/` 下还有灵活的附加配置文件。
|
||||
|
||||
### <span id="ntpdate">ntpdate</span>
|
||||
|
||||
由于 `timedatectl` 的存在,各发行版已经弃用了 `ntpdate`,默认不再进行安装。如果你安装了,它会在系统启动的时候根据 Ubuntu 的 NTP 服务器来设置你电脑的时间。之后每当一个新的网络接口启动时,它就会重新尝试同步时间 —— 在这期间只要其涵盖的时间差不是太大,它就会慢慢偏移时间。该行为可以通过 `-B`/`-b` 开关来进行控制。
|
||||
|
||||
```
|
||||
ntpdate ntp.ubuntu.com
|
||||
```
|
||||
|
||||
### <span id="timeservers">时间服务器</span>
|
||||
|
||||
默认情况下,基于 systemd 的工具都是从 `ntp.ubuntu.com` 请求时间同步的。经典的基于 `ntpd` 的服务基本上都是使用 `[0-3].ubuntu.pool.ntp.org` 池中的 `2.ubuntu.pool.ntp.org`,还有 `ntp.ubuntu.com`,此外需要的话还支持 IPv6。如果想强制使用 IPv6,可以使用 `ipv6.ntp.ubuntu.com`,不过这并非默认配置。
|
||||
|
||||
### <span id="ntpd">ntpd</span>
|
||||
|
||||
ntp 的守护进程 `ntpd` 会计算你的系统时钟的时间偏移量并且持续的进行调整,所以不会出现时间差距较大的更正,比如说,不会导致不连续的日志。该进程只花费少量的进程资源和内存,但对于现代的服务器来说实在是微不足道的了。
|
||||
|
||||
### <span id="installation">安装</span>
|
||||
|
||||
要安装 `ntpd`,在终端命令行中输入:
|
||||
|
||||
```
|
||||
sudo apt install ntp
|
||||
```
|
||||
|
||||
### <span id="configuration">配置</span>
|
||||
|
||||
编辑 `/etc/ntp.conf` —— 增加/移除 `server` 行。默认配置有以下服务器:
|
||||
|
||||
```
|
||||
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
|
||||
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
|
||||
# more information.
|
||||
server 0.ubuntu.pool.ntp.org
|
||||
server 1.ubuntu.pool.ntp.org
|
||||
server 2.ubuntu.pool.ntp.org
|
||||
server 3.ubuntu.pool.ntp.org
|
||||
```
|
||||
|
||||
修改配置文件之后,你需要重新加载 `ntpd`:
|
||||
|
||||
```
|
||||
sudo systemctl reload ntp.service
|
||||
```
|
||||
|
||||
### <span id="status">查看状态</span>
|
||||
|
||||
使用 `ntpq` 来查看更多信息:
|
||||
|
||||
```
|
||||
# sudo ntpq -p
|
||||
remote refid st t when poll reach delay offset jitter
|
||||
==============================================================================
|
||||
+stratum2-2.NTP. 129.70.130.70 2 u 5 64 377 68.461 -44.274 110.334
|
||||
+ntp2.m-online.n 212.18.1.106 2 u 5 64 377 54.629 -27.318 78.882
|
||||
*145.253.66.170 .DCFa. 1 u 10 64 377 83.607 -30.159 68.343
|
||||
+stratum2-3.NTP. 129.70.130.70 2 u 5 64 357 68.795 -68.168 104.612
|
||||
+europium.canoni 193.79.237.14 2 u 63 64 337 81.534 -67.968 92.792
|
||||
```
|
||||
|
||||
### <span id="Support">PPS 支持</span>
|
||||
|
||||
从 Ubuntu 16.04 开始,ntp 支持 PPS 规范,给 ntp 提供了本地时间源,以提供更高的精度。查看下边列出的链接来获取更多配置信息。
|
||||
|
||||
### <span id="reference">参考资料</span>
|
||||
|
||||
* 参考 [Ubuntu Time][1] wiki 页来获取更多信息
|
||||
|
||||
* [ntp.org,网络时间协议项目主页][2]
|
||||
|
||||
* [ntp.org,关于配置 PPS 的 FAQ][3]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://help.ubuntu.com/lts/serverguide/NTP.html
|
||||
|
||||
作者:[Ubuntu][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://help.ubuntu.com/lts/serverguide/NTP.html
|
||||
[1]:https://help.ubuntu.com/community/UbuntuTime
|
||||
[2]:http://www.ntp.org/
|
||||
[3]:http://www.ntp.org/ntpfaq/NTP-s-config-adv.htm#S-CONFIG-ADV-PPS
|
||||
|
@ -1,6 +1,5 @@
|
||||
Manage Samba4 Active Directory Infrastructure from Windows10 via RSAT – Part 3
|
||||
使用 Windows 10 的 RSAT 工具来管理 Samba4 活动目录架构 (三)
|
||||
============================================================
|
||||
使用 Windows 10 系统的 RSAT 工具来管理 Samba4 活动目录架构 (三)
|
||||
|
||||
这一节的[Samba4 AD DC 架构系列文章][8],我们将会讨论如何把 Windows 10 系统的电脑添加到 Samba4 域环境中,以及如何在 Windows 10 系统下管理域环境。
|
||||
|
||||
@ -10,17 +9,16 @@ Manage Samba4 Active Directory Infrastructure from Windows10 via RSAT – Part 3
|
||||
|
||||
#### 要求
|
||||
|
||||
1、 [在 Ubuntu16.04 系统上使用 Samba4 软件来创建活动目录架构(一)][1]
|
||||
1、 [在 Ubuntu 系统上使用 Samba4 来创建活动目录架构(一)][1]
|
||||
2、 [在 Linux 命令行下管理 Samba4 AD 架构(二)][2]
|
||||
3、 [在 Windows 下管理 Samba4 AD 域管制器 DNS 和组策略(四)][3]
|
||||
|
||||
### 第1步:配置域时间同步
|
||||
|
||||
1、在使用 Windows 10 系统的 RSAT 工具来管理 Samba4 ADDC 之前,我们需要了解与活动目录相关的一个很重要的服务,该服务要求[精确的时间同步][9]
|
||||
|
||||
在大多数的 Linux 发行版中,NTP 进程都提供时间同步机制。AD 环境默认允许最大的时间差距是 5 分钟。
|
||||
在大多数的 Linux 发行版中,都由 NTP 进程提供时间同步机制。AD 环境默认允许最大的时间差距是 5 分钟。
|
||||
|
||||
如果时间差距超过 5 分钟,你将会遇到各种各样的异常报错,影响最严重的是导致 AD 用户,域成员服务器或共享访问相关的问题。
|
||||
如果时间差距超过 5 分钟,你将会遇到各种各样的异常报错,最严重的会影响到 AD 用户、域成员服务器或共享访问等。
|
||||
|
||||
为了在 Ubuntu 系统中安装网络时间协议进程和 NTP 客户端工具,可执行以下命令:
|
||||
|
||||
@ -31,17 +29,17 @@ $ sudo apt-get install ntp ntpdate
|
||||
![Install NTP on Ubuntu](http://www.tecmint.com/wp-content/uploads/2016/12/Install-NTP-on-Ubuntu.png)
|
||||
][10]
|
||||
|
||||
在 Ubuntu 系统下安装 NTP 服务
|
||||
*在 Ubuntu 系统下安装 NTP 服务*
|
||||
|
||||
2、下一步,修改 NTP 配置文件,使用一个离你最近的 NTP 服务地址列表替换默认的 NTP 池服务列表。
|
||||
|
||||
NTP 服务器地址列表可以从 NTP 地址库项目官方网站获取:[http://www.pool.ntp.org/en/][11].
|
||||
NTP 服务器地址列表可以从 NTP 地址库项目官方网站获取:[http://www.pool.ntp.org/en/][11]。
|
||||
|
||||
```
|
||||
$ sudo nano /etc/ntp.conf
|
||||
```
|
||||
|
||||
在每一行 pool 前添加一个 ‘#’ 符号以注释默认的服务器列表,并替换为适合你的 NTP 服务地址,如下图所示:
|
||||
在每一行 `pool` 前添加一个 ‘#’ 符号以注释默认的服务器列表,并替换为适合你的 NTP 服务器地址,如下图所示:
|
||||
|
||||
```
|
||||
pool 0.ro.pool.ntp.org iburst
|
||||
@ -50,13 +48,14 @@ pool 2.ro.pool.ntp.org iburst
|
||||
# Use Ubuntu's ntp server as a fallback.
|
||||
pool 3.ro.pool.ntp.org
|
||||
```
|
||||
|
||||
[
|
||||
![Configure NTP Server in Ubuntu](http://www.tecmint.com/wp-content/uploads/2016/12/Configure-NTP-Server-in-Ubuntu.png)
|
||||
][12]
|
||||
|
||||
在 Ubuntu 系统下配置 NTP 服务
|
||||
*在 Ubuntu 系统下配置 NTP 服务*
|
||||
|
||||
3、此时,先不要关闭该文件。移动光标到文件顶部,在 driftfile 参数后面添加下面一行内容。该设置是为了让客户端查询该服务时使用 AD NTP 签署请求。
|
||||
3、此时,先不要关闭该文件。移动光标到文件顶部,在 `driftfile` 参数后面添加下面一行内容。该设置是为了让客户端查询该服务时使用 AD 的 NTP 签署请求。
|
||||
|
||||
```
|
||||
ntpsigndsocket /var/lib/samba/ntp_signd/
|
||||
@ -65,9 +64,10 @@ ntpsigndsocket /var/lib/samba/ntp_signd/
|
||||
![Sync AD with NTP](http://www.tecmint.com/wp-content/uploads/2016/12/Sync-AD-with-NTP.png)
|
||||
][13]
|
||||
|
||||
使用 NTP 来同步 AD
|
||||
*使用 NTP 来同步 AD*
|
||||
|
||||
4、最后,移动光标到文件底部并添加如下一行内容,如截图所示,仅允许网络客户端查询该服务器上的时间。
|
||||
|
||||
4、最后,移动光标到文件底部并添加如下面一行内容,如截图所示,仅允许网络客户端查询该服务器上的时间。
|
||||
```
|
||||
restrict default kod nomodify notrap nopeer mssntp
|
||||
```
|
||||
@ -75,11 +75,11 @@ restrict default kod nomodify notrap nopeer mssntp
|
||||
![Query Clients to NTP Server](http://www.tecmint.com/wp-content/uploads/2016/12/Query-Client-to-NTP-Server.png)
|
||||
][14]
|
||||
|
||||
限制 NPT 服务的查询客户端
|
||||
*限制 NTP 服务的查询客户端*
|
||||
|
||||
5、设置完成之后,保存并关闭 NTP 配置文件,为了让 NTP 服务读取 ntp_signed 目录,需要授予 NTP 服务合适的权限。
|
||||
5、设置完成之后,保存并关闭 NTP 配置文件,为了让 NTP 服务读取 `ntp_signed` 目录,需要授予 NTP 服务合适的权限。
|
||||
|
||||
以下是 Samba NTP socket 的系统路径。之后,重启 NTP 服务以应用更改,并使用 [netstat 命令][15]与[grep 过滤][16]相接合来检查 NTP服务是否正常。
|
||||
以下是 Samba NTP socket 的系统路径。之后,重启 NTP 服务以应用更改,并使用 [netstat 命令][15]与[grep 过滤][16]相接合来检查 NTP 服务是否正常。
|
||||
|
||||
```
|
||||
$ sudo chown root:ntp /var/lib/samba/ntp_signd/
|
||||
@ -91,7 +91,7 @@ $ sudo netstat –tulpn | grep ntp
|
||||
![Grant Permission to NTP](http://www.tecmint.com/wp-content/uploads/2016/12/Grant-Permission-to-NTP.png)
|
||||
][17]
|
||||
|
||||
NTP 授权
|
||||
*给 NTP 服务授权*
|
||||
|
||||
使用 ntpq 命令行工具来监控 NTP 进程,加上 '-p' 参数来显示摘要信息。
|
||||
|
||||
@ -102,11 +102,11 @@ $ ntpq -p
|
||||
![Monitor NTP Server Pool](http://www.tecmint.com/wp-content/uploads/2016/12/Monitor-NTP-Server-Pool.png)
|
||||
][18]
|
||||
|
||||
监控 NTP Server Pool
|
||||
*监控 NTP 服务器池*
|
||||
|
||||
### 第二步:处理 NTP 时间同步异常问题
|
||||
|
||||
6、有时候 NTP 进程在尝试与上游 ntp 服务端同步时间的计算过程中会卡住,导致客户端使用 ntpdate 工具手动强制同步时间时报如下错误:
|
||||
6、有时候 NTP 进程在尝试与上游 ntp 服务端同步时间的计算过程中会卡住,导致客户端使用 `ntpdate` 工具手动强制同步时间时报如下错误:
|
||||
|
||||
```
|
||||
# ntpdate -qu adc1
|
||||
@ -116,9 +116,9 @@ ntpdate[4472]: no server suitable for synchronization found
|
||||
![NTP Time Synchronization Error](http://www.tecmint.com/wp-content/uploads/2016/12/NTP-Time-Synchronization-Error.png)
|
||||
][19]
|
||||
|
||||
NTP 时间同步异常
|
||||
*NTP 时间同步异常*
|
||||
|
||||
ntpdate 命令加上 -d 选项
|
||||
`ntpdate` 命令加上 `-d` 调试选项:
|
||||
|
||||
```
|
||||
# ntpdate -d adc1.tecmint.lan
|
||||
@ -128,13 +128,13 @@ Server dropped: Leap not in sync
|
||||
![NTP Server Dropped Leap Not in Sync](http://www.tecmint.com/wp-content/uploads/2016/12/NTP-Server-Dropped-Leap-Not-Sync.png)
|
||||
][20]
|
||||
|
||||
NTP Server Dropped Leap Not in Sync
|
||||
*NTP Server Dropped Leap Not in Sync*
|
||||
|
||||
7、为了避免出现该问题,使用下面的方法来解决这个问题:在服务器上停止 NTP 服务,使用 ntpdate 客户端工具加上 '-b' 参数指定外部 peer 地址来手动强制同步时间,如下图所示:
|
||||
7、为了避免出现该问题,使用下面的方法来解决这个问题:在服务器上停止 NTP 服务,使用 `ntpdate` 客户端工具加上 `-b` 参数指定外部 peer 地址来手动强制同步时间,如下图所示:
|
||||
|
||||
```
|
||||
# systemctl stop ntp.service
|
||||
# ntpdate -b 2.ro.pool.ntp.org [your_ntp_peer]
|
||||
# ntpdate -b 2.ro.pool.ntp.org [你的 ntp peer]
|
||||
# systemctl start ntp.service
|
||||
# systemctl status ntp.service
|
||||
```
|
||||
@ -142,7 +142,7 @@ NTP Server Dropped Leap Not in Sync
|
||||
![Force NTP Time Synchronization](http://www.tecmint.com/wp-content/uploads/2016/12/Force-NTP-Time-Synchronization.png)
|
||||
][21]
|
||||
|
||||
强制 NTP 时间同步
|
||||
*强制 NTP 时间同步*
|
||||
|
||||
8、当时间正确同步之后,启动服务器上的 NTP 服务,并且在客户端服务器上执行如下命令来验证 NTP 时间同步服务是否可用:
|
||||
|
||||
@ -153,7 +153,7 @@ NTP Server Dropped Leap Not in Sync
|
||||
![Verify NTP Time Synchronization](http://www.tecmint.com/wp-content/uploads/2016/12/Verify-NTP-Time-Synchronization.png)
|
||||
][22]
|
||||
|
||||
验证 NTP 时间同步
|
||||
*验证 NTP 时间同步*
|
||||
|
||||
至此, NTP 服务应该已经工作正常了。
|
||||
|
||||
@ -165,21 +165,21 @@ NTP Server Dropped Leap Not in Sync
|
||||
|
||||
把 Windows 10 或是之前版本的微软操作系统加入到 Samba4 AD DC 环境中的过程也是非常容易的。首先,确保你的 Windows 10 电脑已经设置了正确的 Samba4 DNS 服务器的 IP 地址,以查询出准确的域解析结果。
|
||||
|
||||
打开控制面板 -> 网络和 Internet -> 网络和共享中心 -> 网卡设置 -> 属性 -> IPv4 -> 属性 -> 使用下面的 DNS 服务器地址,并且手动输入 Samba4 AD 服务器的 IP 地址,如下图所示:
|
||||
打开“控制面板 -> 网络和 Internet -> 网络和共享中心 -> 网卡设置 -> 属性 -> IPv4 -> 属性 -> 使用下面的 DNS 服务器地址”,并且手动输入 Samba4 AD 服务器的 IP 地址,如下图所示:
|
||||
|
||||
[
|
||||
![join Windows to Samba4 AD](http://www.tecmint.com/wp-content/uploads/2016/12/Join-Windows-to-Samba4-AD.png)
|
||||
][24]
|
||||
|
||||
把 Windows 10 加入到 Samba4 AD 环境
|
||||
*把 Windows 10 加入到 Samba4 AD 环境*
|
||||
|
||||
[
|
||||
![Add DNS and Samba4 AD IP Address](http://www.tecmint.com/wp-content/uploads/2016/12/Add-DNS-and-Samba4-AD-IP-Address.png)
|
||||
][25]
|
||||
|
||||
添加 DNS 和 Samba4 AD 服务器地址
|
||||
*添加 DNS 和 Samba4 AD 服务器地址*
|
||||
|
||||
这里的 192.168.1.254 是 Samba4 AD 域控服务器的地址,用于域名解析。按顺序替换 IP 地址。
|
||||
这里的 `192.168.1.254` 是 Samba4 AD 域控服务器的地址,用于域名解析。相应替换该 IP 地址。
|
||||
|
||||
10、下一步,点击 OK 按钮以应用网络设置,打开 CMD 命令行窗口,通过 ping 域名和 Samba4 服务器的 FQDN 地址来测试通过 DNS 解析到域是否连通。
|
||||
|
||||
@ -191,11 +191,11 @@ ping adc1.tecmint.lan
|
||||
![Check Network Connectivity Between Windows and Samba4 AD](http://www.tecmint.com/wp-content/uploads/2016/12/Check-Samba4-AD-from-Windows.png)
|
||||
][26]
|
||||
|
||||
检查Windows 和 Samb4 AD 服务器的网络连通性
|
||||
*检查 Windows 和 Samb4 AD 服务器的网络连通性*
|
||||
|
||||
11、如果 Windows 客户端 DNS 查询的结果解析正确,那么,你还需要确认客户端时间是否已跟域环境同步。
|
||||
|
||||
打开控制面板 -> 时钟、语言和区域 -> 设置时间和日期 -> Internet 时间页 -> 更改设置,输入你同步时间的域名和 Internet 时间服务器字段。
|
||||
打开“控制面板 -> 时钟、语言和区域 -> 设置时间和日期 -> Internet 时间页 -> 更改设置”,输入你同步时间的域名和 Internet 时间服务器字段。
|
||||
|
||||
点击立即更新按钮来强制与域同步时间,点击 OK 关闭窗口。
|
||||
|
||||
@ -203,38 +203,37 @@ ping adc1.tecmint.lan
|
||||
![Synchronize Time with Internet Server](http://www.tecmint.com/wp-content/uploads/2016/12/Synchronize-Time-with-Internet-Server.png)
|
||||
][27]
|
||||
|
||||
与 Internet 服务器同步时间
|
||||
*与 Internet 服务器同步时间*
|
||||
|
||||
12、最后,通过打开系统属性 -> 更改 -> 域成员 -> 输入域名,点击 OK,输入你的域管理员账号和密码,再次点击 OK。
|
||||
12、最后,通过打开“系统属性 -> 更改 -> 域成员 -> 输入域名”,点击 OK,输入你的域管理员账号和密码,再次点击 OK。
|
||||
|
||||
|
||||
应该弹出一个新的窗口通知你已经是一个域成员了。点击 OK 关闭弹出窗口,并且重启机器以应用域更改。
|
||||
|
||||
|
||||
下面的截图将说明这些操作步骤。
|
||||
|
||||
[
|
||||
![Join Windows Domain to Samba4 AD](http://www.tecmint.com/wp-content/uploads/2016/12/Join-Windows-Domain-to-Samba4-AD.png)
|
||||
][28]
|
||||
|
||||
把 Windows 域加入到 Samba4 AD 环境
|
||||
*把 Windows 域加入到 Samba4 AD 环境*
|
||||
[
|
||||
![Enter Domain Administration Login](http://www.tecmint.com/wp-content/uploads/2016/12/Enter-Domain-Administration-Login.png)
|
||||
][29]
|
||||
|
||||
输入域管理员账号登录
|
||||
*输入域管理员账号登录*
|
||||
|
||||
[
|
||||
![Domain Joined to Samba4 AD Confirmation](http://www.tecmint.com/wp-content/uploads/2016/12/Domain-Joined-to-Samba4-AD.png)
|
||||
][30]
|
||||
|
||||
确认域已加入到 Samba4 AD 环境
|
||||
*确认域已加入到 Samba4 AD 环境*
|
||||
|
||||
[
|
||||
![Restart Windows Server for Changes](http://www.tecmint.com/wp-content/uploads/2016/12/Restart-Windows-Server-for-Changes.png)
|
||||
][31]
|
||||
|
||||
重启 Windows 服务器以应用更改
|
||||
*重启 Windows 服务器以应用更改*
|
||||
|
||||
13、重启之后,单击其它用户并且使用具有管理员权限的 Samba4 域账号登录到 Windows 系统,你已经准备好进入到后边几个步骤了。
|
||||
|
||||
@ -242,7 +241,7 @@ ping adc1.tecmint.lan
|
||||
![Login to Windows Using Samba4 AD Account](http://www.tecmint.com/wp-content/uploads/2016/12/Login-to-Windows-Using-Samba4-AD-Account.png)
|
||||
][32]
|
||||
|
||||
使用 Samba4 AD 账号登录到 Windows
|
||||
*使用 Samba4 AD 账号登录到 Windows*
|
||||
|
||||
#### 第 4 步:使用 RSAT 工具来管理 Samba4 AD DC
|
||||
|
||||
@ -255,47 +254,48 @@ ping adc1.tecmint.lan
|
||||
|
||||
一旦 Windows 10 独立安装包下载完成,运行安装包,等待安装完成并重启机器以应用所有更新。
|
||||
|
||||
重启之后,打开控制面板 -> 程序(卸载程序) -> 启用或关闭 Windows 功能,勾选所有的远程服务器管理工具。
|
||||
重启之后,打开“控制面板 -> 程序(卸载程序) -> 启用或关闭 Windows 功能”,勾选所有的远程服务器管理工具。
|
||||
|
||||
点击 OK 开始安装,安装完成之后重启系统。
|
||||
[
|
||||
![Administer Samba4 AD from Windows](http://www.tecmint.com/wp-content/uploads/2016/12/Administer-Samba4-AD-from-Windows.png)
|
||||
][33]
|
||||
|
||||
从 Windows 系统下管理 Samba4 AD
|
||||
*从 Windows 系统下管理 Samba4 AD*
|
||||
|
||||
15、要进入 RSAT 工具集,打开“控制面板 -> 系统和安全 -> 管理工具”。
|
||||
|
||||
15、要进入 RSAT 工具集,打开控制面板 -> 系统和安全 -> 管理工具
|
||||
|
||||
这些工具也可以在开始工菜单的管理工具菜单中找到。另外,你也可以打开 Windows MMC 工具和管理单元,从文件 -> 添加/删除管理单元菜单中访问它们。
|
||||
这些工具也可以在开始工菜单的管理工具菜单中找到。另外,你也可以打开 Windows MMC 工具和管理单元,从“文件 -> 添加/删除管理单元”菜单中访问它们。
|
||||
|
||||
[
|
||||
![Access Remote Server Administration Tools](http://www.tecmint.com/wp-content/uploads/2016/12/Access-Remote-Server-Administration-Tools.png)
|
||||
][34]
|
||||
|
||||
访问远程服务器管理工具集
|
||||
*访问远程服务器管理工具集*
|
||||
|
||||
最常用的工具,比如 AD UC ,DNS 和组策略管理工具可以通过从右键菜单发送到功能来新建快捷方式到桌面直接运行。
|
||||
|
||||
16、你可以通过 AD UC 和列出域里的电脑(新加入的 Windows 机器应该出现在列表中)来验证 RSAT 功能,创建一个组织单元或组。
|
||||
|
||||
在 Samba4 服务器上使用 wbinf 命令来检查用户和组是否已经创建成功。
|
||||
在 Samba4 服务器上使用 `wbinf` 命令来检查用户和组是否已经创建成功。
|
||||
|
||||
[
|
||||
![Active Directory Users and Computers](http://www.tecmint.com/wp-content/uploads/2016/12/Active-Directory-Users-and-Computers.png)
|
||||
][35]
|
||||
|
||||
活动目录用户和计算机
|
||||
*活动目录用户和计算机*
|
||||
|
||||
[
|
||||
![Create Organizational Units and New Users](http://www.tecmint.com/wp-content/uploads/2016/12/Create-Organizational-Unit-and-Users.png)
|
||||
][36]
|
||||
|
||||
创建组织单元和新用户
|
||||
*创建组织单元和新用户*
|
||||
|
||||
[
|
||||
![Confirm Samba4 AD Users](http://www.tecmint.com/wp-content/uploads/2016/12/Confirm-Samba4-AD-Users.png)
|
||||
][37]
|
||||
|
||||
确认 Samba4 AD 用户
|
||||
*确认 Samba4 AD 用户*
|
||||
|
||||
就这些吧!该主题的下一篇文章将包含其它 Samba4 活动目录的重要内容,包括通过 RSAT 工具来管理 Samba4 活动目录,比如,如何管理 DNS 服务器,添加 DNS 记录和创建 DNS 解析查询区,如何管理及应用域策略以及域用户如何创建交互式登录提示信息。
|
||||
|
||||
@ -306,15 +306,15 @@ ping adc1.tecmint.lan
|
||||
|
||||
via: http://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/
|
||||
|
||||
作者:[Matei Cezar ][a]
|
||||
作者:[Matei Cezar][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/cezarmatei/
|
||||
[1]:http://www.tecmint.com/install-samba4-active-directory-ubuntu/
|
||||
[2]:http://www.tecmint.com/manage-samba4-active-directory-linux-command-line/
|
||||
[1]:https://linux.cn/article-8065-1.html
|
||||
[2]:https://linux.cn/article-8070-1.html
|
||||
[3]:http://www.tecmint.com/manage-samba4-dns-group-policy-from-windows/
|
||||
[4]:https://www.microsoft.com/en-us/download/details.aspx?id=45520
|
||||
[5]:http://www.microsoft.com/en-us/download/details.aspx?id=39296
|
||||
@ -335,7 +335,7 @@ via: http://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/
|
||||
[20]:http://www.tecmint.com/wp-content/uploads/2016/12/NTP-Server-Dropped-Leap-Not-Sync.png
|
||||
[21]:http://www.tecmint.com/wp-content/uploads/2016/12/Force-NTP-Time-Synchronization.png
|
||||
[22]:http://www.tecmint.com/wp-content/uploads/2016/12/Verify-NTP-Time-Synchronization.png
|
||||
[23]:http://www.tecmint.com/manage-samba4-active-directory-linux-command-line/
|
||||
[23]:https://linux.cn/article-8070-1.html
|
||||
[24]:http://www.tecmint.com/wp-content/uploads/2016/12/Join-Windows-to-Samba4-AD.png
|
||||
[25]:http://www.tecmint.com/wp-content/uploads/2016/12/Add-DNS-and-Samba4-AD-IP-Address.png
|
||||
[26]:http://www.tecmint.com/wp-content/uploads/2016/12/Check-Samba4-AD-from-Windows.png
|
@ -1,7 +1,7 @@
|
||||
如何在 Linux 中找出最近或今天被修改的文件
|
||||
============================================================
|
||||
|
||||
在本文中,我们将解释两个简单的[命令行小贴士][5],它可以帮你只列出今天的所有文件。
|
||||
在本文中,我们将解释两个简单的[命令行小技巧][5],它可以帮你只列出所有的今天的文件。
|
||||
|
||||
Linux 用户在命令行上遇到的常见问题之一是[定位具有特定名称的文件][6],如果你知道确定的文件名则可能会容易得多。
|
||||
|
||||
@ -9,23 +9,25 @@ Linux 用户在命令行上遇到的常见问题之一是[定位具有特定名
|
||||
|
||||
下面用不同的方式只[列出所有你今天创建或修改的文件][7](直接或间接)。
|
||||
|
||||
1. 使用[ ls 命令][8],只列出你的 home 文件夹中今天的文件,其中:
|
||||
|
||||
- `-a` - 列出所有文件,包括隐藏文件
|
||||
- `-l` - 启用长列表格式
|
||||
- `--time-style = FORMAT` - 显示指定 FORMAT 的时间
|
||||
- `+%D` - 以 %m/%d/%y (月/日/年)格式显示或使用日期
|
||||
1、 使用 [ls 命令][8],只列出你的 home 文件夹中今天的文件。
|
||||
|
||||
```
|
||||
# ls -al --time-style=+%D | grep 'date +%D'
|
||||
```
|
||||
|
||||
其中:
|
||||
|
||||
- `-a` - 列出所有文件,包括隐藏文件
|
||||
- `-l` - 启用长列表格式
|
||||
- `--time-style=FORMAT` - 显示指定 FORMAT 的时间
|
||||
- `+%D` - 以 `%m/%d/%y` (月/日/年)格式显示或使用日期
|
||||
|
||||
[
|
||||
![Find Recent Files in Linux](http://www.tecmint.com/wp-content/uploads/2016/12/Find-Recent-Files-in-Linux.png)
|
||||
][9]
|
||||
|
||||
*在Linux中找出最近的文件*
|
||||
|
||||
|
||||
此外,你使用可以 `-X` 标志来[按字母顺序对结果排序][10]:
|
||||
|
||||
```
|
||||
@ -38,15 +40,15 @@ Linux 用户在命令行上遇到的常见问题之一是[定位具有特定名
|
||||
# ls -alS --time-style=+%D | grep 'date +%D'
|
||||
```
|
||||
|
||||
2. 另外,使用 [find 命令][11]会更灵活,并且提供比 ls 更多的选项,可以实现相同的目的。
|
||||
2、 另外,使用 [find 命令][11]会更灵活,并且提供比 `ls` 更多的选项,可以实现相同的目的。
|
||||
|
||||
- `-maxdepth` 级别用于指定搜索操作的起点(在这个情况下为当前目录)下的搜索层级(子目录层级数)。
|
||||
- `-newerXY`,用于寻找时间戳 X 比参照文件的时间戳 Y 更新的文件。 X 和 Y 表示以下任何字母:
|
||||
- a - 参照文件的访问时间
|
||||
- B - 参照文件的创建时间
|
||||
- c - 参照文件的 inode 状态改变时间
|
||||
- m - 参照文件的修改时间
|
||||
- t - 直接指定一个绝对时间
|
||||
- `-maxdepth` 级别用于指定在搜索操作的起点下(在这个情况下为当前目录)的搜索层级(子目录层级数)。
|
||||
- `-newerXY`,用于所寻找的文件的时间戳 `X` 比参照文件的时间戳 `Y` 更新一些的文件。 `X` 和 `Y` 表示以下任何字母:
|
||||
- `a` - 参照文件的访问时间
|
||||
- `B` - 参照文件的创建时间
|
||||
- `c` - 参照文件的 inode 状态改变时间
|
||||
- `m` - 参照文件的修改时间
|
||||
- `t` - 直接指定一个绝对时间
|
||||
|
||||
下面的命令意思是只找出 2016-12-06 这一天修改的文件:
|
||||
|
||||
@ -82,7 +84,7 @@ find: I cannot figure out how to interpret '12-06-2016' as a date or time
|
||||
你可以在我们的下面一系列文章中获得 `ls `和 `find` 命令的更多使用信息。
|
||||
|
||||
- [用 15 例子的掌握 Linux ‘ls’ 命令][1]
|
||||
- [对 Linux 用户有用的 7 个奇怪的技巧][2]
|
||||
- [对 Linux 用户有用的 7 个奇特技巧][2]
|
||||
- [用 35 个例子掌握 Linux ‘find’ 命令][3]
|
||||
- [在 Linux 中使用扩展查找多个文件名的方法][4]
|
||||
|
@ -1,22 +1,19 @@
|
||||
|
||||
九款开源或商业的数据中心基础设施管理软件
|
||||
============================================================
|
||||
|
||||
|
||||
当一个公司发展壮大时,相应地对计算资源的需求也会与日俱增。无论是普通公司还是服务提供商,包括那些出租服务器的公司,当服务器数量过多时都不得不面对很多问题。
|
||||
|
||||
如何盘存服务器和备件?如何维护使数据中心保持健康运作,及时定位和修复潜在的威胁?如何快速找到宕机设备的机架位置?如何准备物理机上线工作?做完这些事情需要花费大量的时间,或者需要 IT 部门有一大帮管理员支持才能办到。
|
||||
如何盘存服务器和备件?如何维护使数据中心保持健康运作,及时定位并修复潜在的威胁?如何快速找到宕机设备的机架位置?如何准备物理机上线工作?做完这些事情需要花费大量的时间,或者需要 IT 部门有一大帮管理员支持才能办到。
|
||||
|
||||
现在有一个更好的方案解决这些问题,使用特定软件来实现数据中心管理自动化,下文将介绍当前市场上已有的一些数据中心管理工具。
|
||||
|
||||
### 1\. Opendcim
|
||||
### 1、 Opendcim
|
||||
|
||||
这是该类目前唯一的免费软件,该软件开源并且按照商业化<ruby>数据中心基础设施管理<rt>Data Center Infrastructure Management</rt></ruby>(DCIM)解决方案的替代方案来设计。该软件可以管理库存、生成数据中心的地图和监控机房温度与电力消耗。
|
||||
这是该类目前唯一的自由软件,该软件开源并且按照商业化<ruby>数据中心基础设施管理<rt>Data Center Infrastructure Management</rt></ruby>(DCIM)解决方案的替代方案来设计。该软件可以管理库存、生成数据中心的地图和监控机房温度与电力消耗。
|
||||
|
||||
不过,它不支持远程关机,服务器重启,操作系统安装等功能。尽管如此,它仍然被全球很多非商业机构使用。
|
||||
|
||||
多亏了该软件开源,有研发能力的公司可以修改它,使 [Opendcims][2] 更适合自己的公司。
|
||||
不过,它不支持远程关机、服务器重启、操作系统安装等功能。尽管如此,它仍然被全球很多非商业机构使用。
|
||||
|
||||
由于该软件开源,有研发能力的公司可以修改它,使 [opendcim][2] 更适合自己的公司。
|
||||
|
||||
[
|
||||
![openDCIM](http://www.tecmint.com/wp-content/uploads/2016/12/openDCIM.png)
|
||||
@ -24,41 +21,39 @@
|
||||
|
||||
*openDCIM*
|
||||
|
||||
### 2\. NOC-PS
|
||||
### 2、 NOC-PS
|
||||
|
||||
这是一款可以管理物理和虚拟设备的商业软件。有很多可以用于初始化设备的工具,比如:操作系统和其他软件安装、网络配置,并且集成了 WHMCS 和 Blesta。美中不足的是,如果你希望能够看到数据中心设备地图或者机架位置,那该软件就不是你的最佳选择了。
|
||||
这是一款可以管理物理和虚拟设备的商业软件。它有很多可以用于初始化设备的工具,比如:操作系统和其他软件安装、网络配置,并且集成了 WHMCS 和 Blesta。美中不足的是,如果你希望能够看到数据中心设备地图或者机架位置,那该软件就不是你的最佳选择了。
|
||||
|
||||
[NOC-PS][4] 每 100 台服务器每年管理费需要 100€,比较适合中小企业使用。
|
||||
|
||||
|
||||
[
|
||||
![NOC-PS](http://www.tecmint.com/wp-content/uploads/2016/12/NOC-PS.png)
|
||||
][5]
|
||||
|
||||
*NOC-PS*
|
||||
|
||||
### 3\. DCImanager
|
||||
### 3、 DCImanager
|
||||
|
||||
[DCImanager][6] 是一个专用的解决方案,正如宣传所说的,考虑了 DC 工程师和托管服务提供商的需求。该软件集成了很多有名的计费软件,比如 WHMCS、Hostbill、BILLmanager 等。
|
||||
|
||||
该软件的主要功能有:服务器配置、模板化安装操作系统、传感器监控、流量和电力消耗报告、VLAN管理。除此之外,企业版还可以生成数据中心服务器地图、以及对服务器和备件进行盘点管理。
|
||||
该软件的主要功能有:服务器配置、模板化安装操作系统、传感器监控、流量和电力消耗报告、VLAN 管理。除此之外,企业版还可以生成数据中心服务器地图、以及对服务器和备件进行盘点管理。
|
||||
|
||||
你可以试用免费版,但是免费版最多支持 5 台物理服务器管理,而收费版每 100 台服务器每年的授权使用费是 120€。
|
||||
|
||||
根据版本不同,收费版可适用中小企业或者大企业。
|
||||
|
||||
|
||||
[
|
||||
![DCImanager](http://www.tecmint.com/wp-content/uploads/2016/12/DCImanager.png)
|
||||
][8]
|
||||
|
||||
*DCImanager*
|
||||
|
||||
### 4\. EasyDCIM
|
||||
### 4、 EasyDCIM
|
||||
|
||||
[EasyDCIM][9] 是一款主要面向服务提供商的收费软件。拥有可以安装操作或其他软件的特点,并且能方便地生成机房目录及机架分布图。
|
||||
[EasyDCIM][9] 是一款主要面向服务提供商的收费软件。拥有可以安装操作系统或其他软件的特点,并且能方便地生成机房目录及机架分布图。
|
||||
|
||||
该软件本身并不支持通过开关对 IP 和 DNS 进行管理。不过可以通过安装模块的方式获得这些功能,这些模块可能付费或者免费(包括 WHMCS 集成模块)。
|
||||
该软件本身并不支持对 IP 和 DNS 进行管理。不过可以通过安装模块的方式获得这些功能,这些模块可能付费或者免费(包括 WHMCS 集成模块)。
|
||||
|
||||
该软件每 100 台服务器每年的服务费起步价 $999。对于小公司来说这个价格有点贵,不过中型或者大型企业可以尝试使用。
|
||||
|
||||
@ -68,32 +63,29 @@
|
||||
|
||||
*EasyDCIM*
|
||||
|
||||
### 5\. Ansible Tower
|
||||
### 5、 Ansible Tower
|
||||
|
||||
[Ansible Tower][11] 是红帽出品的企业级计算中心管理软件。该解决方案的核心思想是实现对服务器和不同用户设备的集中式部署。
|
||||
|
||||
|
||||
感谢 **Ansible Tower** 能够通过集成软件的方式使用几乎所有的工具程序,并且该软件的数据统计收集模块特别好用。不好的一面则是缺乏和当前比较流行的计费软件的集成,而且价格也不便宜。
|
||||
由于 **Ansible Tower** 能够通过集成软件的方式使用几乎所有的工具程序,并且该软件的数据统计收集模块特别好用。不好的一面则是缺乏和当前比较流行的计费软件的集成,而且价格也不便宜。
|
||||
|
||||
每 100 台设备每年的服务器费是 $5000,这个价格估计只有大公司才能接受。
|
||||
|
||||
|
||||
[
|
||||
![Ansible Tower](http://www.tecmint.com/wp-content/uploads/2016/12/Ansible_Tower.png)
|
||||
][12]
|
||||
|
||||
*Ansible Tower*
|
||||
|
||||
### 6\. Puppet Enterprise
|
||||
### 6、 Puppet Enterprise
|
||||
|
||||
在商业基础上发展而来并作为 IT 部门的辅助软件。该软件用于在服务器或者用户设备上安装操作系统及其他软件,无论是初步部署或者进一步开发都适用。
|
||||
|
||||
不幸的是,盘存和其他更好的交互方案(电缆连接、协议等)仍然处于开发中。
|
||||
|
||||
[Puppet Enterprise][13]对于小于 10 台服务器的管理免费并且开放全部功能。而收费版则是每台服务器每年 $120。
|
||||
|
||||
这个价格适合大公司使用.
|
||||
[Puppet Enterprise][13] 对于小于 10 台服务器的管理免费并且开放全部功能。而收费版则是每台服务器每年 $120。
|
||||
|
||||
这个价格适合大公司使用。
|
||||
|
||||
[
|
||||
![Puppet Enterprise](http://www.tecmint.com/wp-content/uploads/2016/12/Puppet-Enterprise.png)
|
||||
@ -101,24 +93,22 @@
|
||||
|
||||
*Puppet Enterprise*
|
||||
|
||||
### 7\. Device 42
|
||||
### 7、 Device 42
|
||||
|
||||
该软件主要用于数据中心监控。有一个很棒的盘存工具,自动创建软硬件依赖关系图。通过 [Device 42][15] 生成数据中心地图,给不同机架标特定颜色,并可以通过图表方式反映温度、空闲空间情况和机架的其他指标。但是不支持软件安装和计费软件的集成。
|
||||
|
||||
每 100 台服务器每年的收费是 $1499,这个价位比较适合大中型企业。
|
||||
|
||||
|
||||
[
|
||||
![Device42](http://www.tecmint.com/wp-content/uploads/2016/12/Device42.png)
|
||||
][16]
|
||||
|
||||
*Device42*
|
||||
|
||||
### 8\. CenterOS
|
||||
### 8、 CenterOS
|
||||
|
||||
这是一款适合数据中心管理的操作系统,主要功能是设备盘点。除此之外可以生成数据中心地图及机架方案,并连接了一个评价不错的服务器状态监控系统,方便内部技术管理工作。
|
||||
|
||||
|
||||
该软件还有一个特性就是能够通过简单的几次点击就可以找到某个设备对应的人(可能是设备所有人、技术管理员或者该设备的制造商),当出现紧急问题时这个就特别有用了。
|
||||
|
||||
**建议阅读:** [8 Open Source/Commercial Billing Platforms for Hosting Providers][17]
|
||||
@ -127,16 +117,15 @@
|
||||
|
||||
该软件价格的神秘性也决定了软件的目标客户,极有可能这个软件是给大公司用的。
|
||||
|
||||
|
||||
[
|
||||
![CenterOS](http://www.tecmint.com/wp-content/uploads/2016/12/CenterOS.png)
|
||||
][19]
|
||||
|
||||
*CenterOS*
|
||||
|
||||
### 9\. LinMin
|
||||
### 9、 LinMin
|
||||
|
||||
这个一款用于初始化物理设备以便后期使用的软件。使用 PXE 安装选定的操作系统,并可随后部署一系列必要的软件安装。
|
||||
这是一款用于初始化物理设备以便后期使用的软件。使用 PXE 安装选定的操作系统,并可随后部署一系列必要的软件安装。
|
||||
|
||||
与同类软件不同的是,[LinMin][20] 有一个开发完善的硬盘备份系统,可以迅速在系统崩溃后恢复以及大规模部署相同配置的服务器。
|
||||
|
||||
@ -157,20 +146,21 @@
|
||||
希望通过这篇回顾能够帮你找到适合的软件让你的工作更轻松。另,祝您的服务器永不出错。
|
||||
|
||||
|
||||
|
||||
-----------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/ae5edcc20865ae20859fb566c796b97a?s=128&d=blank&r=g)
|
||||
|
||||
Nikita Nesmiyanov
|
||||
|
||||
我是一名俄罗斯西伯利亚托管软件开发公司的技术专家。我希望能够在新的 Linux 软件工具和托管行业的发展趋势、可能性、发展历史和发展机遇等方面拓展我的知识。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/data-center-server-management-tools/
|
||||
|
||||
作者:[ Nikita Nesmiyanov][a]
|
||||
作者:[Nikita Nesmiyanov][a]
|
||||
译者:[beyondworld](https://github.com/beyondworld)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
@ -1,14 +1,13 @@
|
||||
在 Ubuntu 上搭建一台 Email 服务器(三)
|
||||
如何在 Ubuntu 上搭建一台 Email 服务器(三)
|
||||
============================================================
|
||||
|
||||
### [mail-server.jpg][2]
|
||||
|
||||
![Mail server](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/mail-server.jpg?itok=Ox1SCDsV "Mail server")
|
||||
|
||||
在本系列的最后,我们将详细介绍如何在 Dovecot 和 Postfix 中设置虚拟用户和邮箱。
|
||||
|
||||
欢迎回来,热心的 Linux 系统管理员们! 在本系列的[第一部分][3]和[第二部分][4]中,我们学习了如何将 Postfix 和 Dovecot 组合在一起,搭建一个不错的 IMAP 和 POP3 邮件服务器。 现在我们将学习设置虚拟用户,以便我们可以管理所有 Dovecot 中的用户。
|
||||
|
||||
### 抱歉,还不能配置SSL
|
||||
### 抱歉,还不能配置 SSL
|
||||
|
||||
我知道我答应过教你们如何设置一个受 SSL 保护的服务器。 不幸的是,我低估了这个话题的范围。 所以,我会下个月再写一个全面的教程。
|
||||
|
||||
@ -16,10 +15,9 @@
|
||||
|
||||
### 虚拟用户
|
||||
|
||||
你希望邮件服务器上的是虚拟用户而不是 Linux 系统用户。使用 Linux 系统用户不能扩展,并且它们会暴露登录账号,给你的服务器带来不必要的风险。 设置虚拟用户需要在 Postfix 和 Dovecot 中编辑配置文件。我们将从 Postfix 开始。首先,我们将从一个干净、简化的 `/etc /postfix/main.cf` 开始。移动你原始的`main.cf` 到别处,创建一个新的干净的文件,内容如下:
|
||||
我们希望邮件服务器上用的是虚拟用户而不是 Linux 系统用户。使用 Linux 系统用户不能扩展,并且它们会暴露系统登录账号,给你的服务器带来不必要的风险。 设置虚拟用户需要在 Postfix 和 Dovecot 中编辑配置文件。我们将从 Postfix 开始。首先,我们将从一个干净、简化的 `/etc /postfix/main.cf` 开始。移动你原始的 `main.cf` 到别处做个备份,创建一个新的干净的文件,内容如下:
|
||||
|
||||
```
|
||||
|
||||
compatibility_level=2
|
||||
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu/GNU)
|
||||
biff = no
|
||||
@ -43,12 +41,11 @@ virtual_gid_maps = static:5000
|
||||
virtual_transport = lmtp:unix:private/dovecot-lmtp0
|
||||
```
|
||||
|
||||
你可以直接拷贝这份文件,除了 `mynetworks` 参数的设置 `192.168.0.0/24`,它应为你的本地子网掩码。
|
||||
你可以直接拷贝这份文件,除了 `mynetworks` 参数的设置 `192.168.0.0/24`,它应该是你的本地子网掩码。
|
||||
|
||||
接下来,创建用户和组 `vmail` 来拥有你的虚拟邮箱。虚拟邮箱保存在 `vmail` 的家目录下。
|
||||
|
||||
```
|
||||
|
||||
$ sudo groupadd -g 5000 vmail
|
||||
$ sudo useradd -m -u 5000 -g 5000 -s /bin/bash vmail
|
||||
```
|
||||
@ -56,7 +53,6 @@ $ sudo useradd -m -u 5000 -g 5000 -s /bin/bash vmail
|
||||
接下来重新加载 Postfix 配置:
|
||||
|
||||
```
|
||||
|
||||
$ sudo postfix reload
|
||||
[sudo] password for carla:
|
||||
postfix/postfix-script: refreshing the Postfix mail system
|
||||
@ -67,14 +63,12 @@ postfix/postfix-script: refreshing the Postfix mail system
|
||||
我们会使用 Dovecot 的 `lmtp` 协议来连接到 Postfix。你可以这样安装:
|
||||
|
||||
```
|
||||
|
||||
$ sudo apt-get install dovecot-lmtpd
|
||||
```
|
||||
|
||||
`main.cf` 的最后一行涉及到 `lmtp`。复制这个 `/etc/dovecot/dovecot.conf` 示例文件来替换已存在的文件。再说一次,我们只使用这个文件,而不是 `/etc/dovecot/conf.d` 内的所有文件。
|
||||
`main.cf` 的最后一行涉及到 `lmtp`。复制这个 `/etc/dovecot/dovecot.conf` 示例文件来替换已存在的文件。再说一次,我们只使用这一个文件,而不是 `/etc/dovecot/conf.d` 内的所有文件。
|
||||
|
||||
```
|
||||
|
||||
protocols = imap pop3 lmtp
|
||||
log_path = /var/log/dovecot.log
|
||||
info_log_path = /var/log/dovecot-info.log
|
||||
@ -114,7 +108,6 @@ service lmtp {
|
||||
最后,你可以创建一个含有用户和密码的文件 `/etc/dovecot/passwd`。对于纯文本验证,我们只需要用户的完整邮箱地址和密码:
|
||||
|
||||
```
|
||||
|
||||
alrac@studio:{PLAIN}password
|
||||
layla@studio:{PLAIN}password
|
||||
fred@studio:{PLAIN}password
|
||||
@ -125,7 +118,6 @@ benny@studio:{PLAIN}password
|
||||
Dovecot 虚拟用户独立于 Postfix 虚拟用户,因此你需要管理 Dovecot 中的用户。保存所有的设置并重启 Postfix 和 Dovecot:
|
||||
|
||||
```
|
||||
|
||||
$ sudo service postfix restart
|
||||
$ sudo service dovecot restart
|
||||
```
|
||||
@ -133,7 +125,6 @@ $ sudo service dovecot restart
|
||||
现在让我们使用老朋友 telnet 来看下 Dovecot 是否设置正确。
|
||||
|
||||
```
|
||||
|
||||
$ telnet studio 110
|
||||
Trying 127.0.1.1...
|
||||
Connected to studio.
|
||||
@ -151,17 +142,15 @@ Connection closed by foreign host.
|
||||
现在一切都好!让我们用 `mail` 命令,发送测试消息给我们的用户。确保使用用户的完整电子邮箱地址而不只是用户名。
|
||||
|
||||
```
|
||||
|
||||
$ mail benny@studio
|
||||
Subject: hello and welcome!
|
||||
Please enjoy your new mail account!
|
||||
.
|
||||
```
|
||||
|
||||
最后一行的句点表示发送消息。让我们看下它是否到达了正确的邮箱。
|
||||
最后一行的**英文句点**表示发送消息。让我们看下它是否到达了正确的邮箱。
|
||||
|
||||
```
|
||||
|
||||
$ sudo ls -al /home/vmail/studio/benny@studio/.Mail/new
|
||||
total 16
|
||||
drwx------ 2 vmail vmail 4096 Dec 14 12:39 .
|
||||
@ -198,17 +187,14 @@ Please enjoy your new mail account!
|
||||
|
||||
### 接下来?
|
||||
|
||||
假设你的 LAN 名称服务配置正确,你现在有一台很好用的 LAN 邮件服务器。 显然,以纯文本发送消息不是最佳的,对于 Internet 邮件也是绝对不可以的。 请参阅[ Dovecot SSL 配置][5]和[ Postfix TLS 支持][6],涵盖了 TLS 和数据库后端。并请期待我之后的 SSL 指南。这次我说的是真的。
|
||||
|
||||
|
||||
|
||||
假设你的 LAN 名称服务配置正确,你现在有一台很好用的 LAN 邮件服务器。 显然,以纯文本发送消息不是最佳的,不支持互联网的邮件也是绝对不可以的。 请参阅 [Dovecot SSL 配置][5]和 [Postfix TLS 支持][6],[VirtualUserFlatFilesPostfix][7] 涵盖了 TLS 和数据库后端。并请期待我之后的 SSL 指南。这次我说的是真的。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/learn/sysadmin/building-email-server-ubuntu-linux-part-3
|
||||
|
||||
作者:[ CARLA SCHRODER][a]
|
||||
作者:[CARLA SCHRODER][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
@ -217,8 +203,8 @@ via: https://www.linux.com/learn/sysadmin/building-email-server-ubuntu-linux-par
|
||||
[a]:https://www.linux.com/users/cschroder
|
||||
[1]:https://www.linux.com/licenses/category/creative-commons-zero
|
||||
[2]:https://www.linux.com/files/images/mail-serverjpg
|
||||
[3]:https://www.linux.com/learn/how-build-email-server-ubuntu-linux
|
||||
[4]:https://www.linux.com/learn/sysadmin/building-email-server-ubuntu-linux-part-2
|
||||
[3]:https://linux.cn/article-8071-1.html
|
||||
[4]:https://linux.cn/article-8077-1.html
|
||||
[5]:http://wiki.dovecot.org/SSL/DovecotConfiguration
|
||||
[6]:http://www.postfix.org/TLS_README.html
|
||||
[7]:http://www.postfix.org/TLS_README.html
|
||||
[7]:http://wiki2.dovecot.org/HowTo/VirtualUserFlatFilesPostfix
|
@ -0,0 +1,245 @@
|
||||
Linux 系统的成长之路:试用 1993-2003 年之间的 Linux 老版本系统
|
||||
============================================================
|
||||
|
||||
> 让我们一起来回顾 Linux 早期版本的美好时光
|
||||
|
||||
![How Linux got to be Linux: Test driving 1993-2003 distros](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "How Linux got to be Linux: Test driving 1993-2003 distros")
|
||||
|
||||
*图片来源:互联网档案馆[书籍][7][图片][8]。 Opensource.com. CC BY-SA 4.0 编辑引用。*
|
||||
|
||||
开源软件最具独特性的一点就是它永远不会真正的走到 EOL(生命的终点)。它们的磁盘镜像文件大都可以一直在网上找到,并且它们的许可证也不会过期,因此,我们可以返回去找到那些老版本的 Linux 系统,并在虚拟机中安装它们,这都是很容易做到的。通过回顾那些珍贵的系统画面,让我们来回顾 Linux 系统这么多年来所发生的翻天覆地的变化。
|
||||
|
||||
我们从 Slackware 1.01 版本来开始这段旅程,在二十多年前它就发布在 **comp.os.linux.announce** 新闻组上了。
|
||||
|
||||
### Slackware 1.01 版本系统 (1993 年)
|
||||
|
||||
![slackware 1.0 screenshot](https://opensource.com/sites/default/files/slack1.png "slackware 1.0 screenshot")
|
||||
|
||||
*Slackware 1.01*
|
||||
|
||||
体验 Slackware 1.01 系统最爽的是在 Qemu 模拟器软件 [2014 免费镜像系列][9]中有一个预先制作好的镜像文件,因此你可以不用手动去执行安装任务(真不习惯这种“奢华”待遇)。其引导启动命令如下:
|
||||
|
||||
```
|
||||
$ qemu-kvm -m 16M -drive if=ide,format=qcow2,file=slackware.qcow2 \
|
||||
-netdev user,id=slirp -device ne2k_isa,netdev=slirp \
|
||||
-serial stdio -redir tcp:22122::22
|
||||
```
|
||||
|
||||
在 1993 年那个版本的 Linux 系统中,很多东西都跟我们所想像的一样。所有常用的基本命令,比如 `ls` 和 `cd` 命令的使用方式,以及所有的基本工具(`gawk` , `cut` , `diff` , `perl`,当然还有 [Volkerding][10] 最喜欢的 `elvis` 工具)现在都在使用,而且也包含在如今的 Linux 系统中,但是仍然有一小部分东西让我感到惊讶。当你尝试使用 tab 补全命令方式来列出上百个文件时, BASH 会非常友好的提示用户确认,并且那些查看压缩文件的工具(比如 `zless` 和 `zmore` 以及 `zcat`)都已经出现了。很多方面都超乎我的预计,总之,该系统给人的感觉就是超级现代化。
|
||||
|
||||
不过,该系统没有软件包管理的相关概念。所有软件的安装和卸载都得手动完成,也不能查询出已安装的软件包。
|
||||
|
||||
总的来说,Slackware 1.01 系统感觉更像是一个非常现代化的 UNIX 系统,或者更恰当的是,它给人的感觉就是一个 Linux 用户在操作一个现代化的 UNIX 系统。很多东西都非常熟悉,但是也不尽相同。这个在 1993 年发布的操作系统中,并不是所有东西都跟你想像中的一样。
|
||||
|
||||
### Debian 0.91 版本系统(1994 年)
|
||||
|
||||
为了尝试 Debian 0.91 版本系统,我使用的是 [Ibiblio 数字档案][11] 网站下载的软盘镜像文件,该系统最初发表在 1994 年。启动命令如下:
|
||||
|
||||
```
|
||||
$ gunzip bootdsk.gz basedsk1.gz basedsk2.gz
|
||||
$ qemu-system-i386 -M pc -m 64 -boot order=ac,menu=on \
|
||||
-drive file=bootdisk,if=floppy,format=raw \
|
||||
-drive file=debian.raw,if=ide,format=raw \
|
||||
-device ne2k_isa,netdev=slirp \
|
||||
-serial msmouse -vga std \
|
||||
-redir tcp:22122::22 \
|
||||
-netdev user,id=slirp
|
||||
```
|
||||
|
||||
从 Debian 0.91 的启动磁盘启动后进入到一个简洁的 shell 界面,有很清晰的提示信息告诉你下一步将要执行的操作。
|
||||
|
||||
安装过程进行得非常顺利。从磁盘分区,写入 ext2 文件系统到分区,到显示图形菜单操作界面要经过七个步骤,之后开始复制 `basedsk` 镜像文件。这里使用的是以最小化方式来安装 Debian 系统,跟大家在安装自己的 Linux 系统过程中的很多步骤都非常相似。
|
||||
|
||||
Debian 系统因其自身的包管理器而出名,但是在早期的版本中只是有一些提示功能而已。有 `dpkg` 命令,但它是一个基于交互式菜单的系统——一种古老的 `aptitude`,有多个层次的可选菜单,并且自然地附带了几个可用软件包。
|
||||
|
||||
尽管如此,你也可以感受到其简便的设计理念。你只需下载三个软盘镜像文件,最后合成一个可启动的系统,然后就可以使用一个简单的文本菜单来安装更多的东西。我由衷的明白了为什么 Debian 系统如此受欢迎的原因。
|
||||
|
||||
### Jurix/S.u.S.E. 系统(1996 年)
|
||||
|
||||
![Jurix install screen](https://opensource.com/sites/default/files/jurix_install.png "Jurix install screen")
|
||||
|
||||
*安装 Jurix 系统*
|
||||
|
||||
Jurix 系统是 SUSE 系统的前身, Jurix 带有的二进制的 `.tgz` 软件包会被组织到类似 Slackware 安装包结构的目录中,其安装包本身也跟 Slackware 的安装包很相似。
|
||||
|
||||
```
|
||||
$ qemu-system-i386 -M pc -m 1024 \
|
||||
-boot order=ac,menu=on \
|
||||
-drive \
|
||||
file=jurix/install,if=floppy,format=raw \
|
||||
-drive file=jurix.img,if=ide \
|
||||
-drive file=pkg.raw,if=ide,format=raw \
|
||||
-device ne2k_isa,netdev=slirp \
|
||||
-serial msmouse -vga std \
|
||||
-redir tcp:22122::22 \
|
||||
-netdev user,id=slirp
|
||||
```
|
||||
|
||||
|
||||
因为我不是刻意去寻找最早期的版本, Jurix 系统是找到的第一个真正’感觉‘像是打算给用户使用的有图形界面的 Linux 发行版。 [XFree86][12] 图形桌面环境已默认安装了,如果你不打算使用该工具,选择退出该环境即可。
|
||||
|
||||
比如 `/usr/lib/X11/XF86Config` (该文件后来变成 `Xorg.conf` )这个配置文件已经存在了,这让我在使用 GUI 前完成了 90% 的工作,但是我花费了一整个周末的时间来调试 `vsync` ,`hsync`,和 `ramdac` 颜色表重写,最后我完全放弃了。
|
||||
|
||||
在 Jurix 系统上安装软件包也非常简单;找到源路径下的 `.tgz` 文件,然后运行一个常用的 `tar` 命令: ` $ su -c 'tar xzvf foo.tgz -C /'` 该软件包就会被解压到 root 分区,并准备好使用了。我刚开始的时候安装了几个之前未安装过的软件包,发现操作也很简单、快速且非常可靠。
|
||||
|
||||
### SUSE 5.1 版本系统(1998 年)
|
||||
|
||||
![suse install](https://opensource.com/sites/default/files/suse5fvwm.png "suse install")
|
||||
|
||||
*在 SuSE 5.1 系统上运行 FVWM 窗口管理器*
|
||||
|
||||
我是使用 1998 年在马里兰州的一家软件商店里买的 InfoMagic CD-ROM 来安装 SUSE 5.1 系统的。其引导启动命令如下:
|
||||
|
||||
```
|
||||
$ qemu-system-i386 -M pc-0.10 -m 64 \
|
||||
-boot order=ad,menu=on \
|
||||
-drive file=floppy.raw,if=floppy,format=raw \
|
||||
-cdrom /dev/sr0 \
|
||||
-drive file=suse5.raw,if=ide,format=raw \
|
||||
-vga cirrus -serial msmouse
|
||||
```
|
||||
|
||||
安装过程相对于前边几次来说要复杂得多。 YasT 工具在软盘和 CD-ROM 光驱之间搞乱了配置文件和设置,还需要重启好多次,在重启了好几次后我才反应过来是我操作顺序不当导致的问题。在安装过程中,我就犯了两次同样的错,我只是习惯了 YasT 工具的安装方式,到第三次才顺利的安装成功,这对于一个 Linux 用户将来的成长来说是一个很大的教训及经验。
|
||||
|
||||
我使用 SUSE 5.1 的主要目的就是体验其 GUI 桌面环境。配置的过程已经很熟悉了,使用几个漂亮的图形界面工具(包括一个很好用的 `XF86Setup` 前端界面配置工具)来测试和调试鼠标及显示器问题。我用了一个小时不到的时间就调试好 GUI 界面,并正常运行起来,其中大部分时间是耽搁在研究 Qemu 的虚拟显卡可以提供哪种分辨率和颜色方案。
|
||||
|
||||
可选用的桌面环境包括 fvwm、fvwm2 和 ctwm。我使用的是 fvwm,并且运行得也正常。我发现 tkDesk 这个 dock 式的文件管理器跟 Ubuntu 系统的 Unity 的启动栏非常的相似。
|
||||
|
||||
使用该系统总的来说还是非常令人愉快的,一旦成功安装了桌面环境并正常运行起来,SUSE 5.1 可以说是取得了令人瞩目的成功。
|
||||
|
||||
### Red Hat 6.0 版本系统(1999 年)
|
||||
|
||||
![Red Hat 1999](https://opensource.com/sites/default/files/redhat6_gimp_0.png "Red Hat 1999")
|
||||
|
||||
*在 Red Hat 6 系统上运行 GIMP 1.x 图像处理程序*
|
||||
|
||||
下一个系统 Red Hat 6.0 安装盘我刚好家里有。不是 RHEL 6.0 —— 而是 Red Hat 6.0,这是一个在 RHEL 或 Fedora 系统出现之前商店里就有卖的桌面版系统。这个安装盘是我在 1999 年 6 月份买的。
|
||||
|
||||
其引导启动命令如下:
|
||||
|
||||
```
|
||||
$ qemu-system-i386 -M pc-0.10 -m 512 \
|
||||
-boot order=ad,menu=on \
|
||||
-drive file=redhat6.raw,if=ide,format=raw \
|
||||
-serial msmouse -netdev user,id=slirp \
|
||||
-vga cirrus -cdrom /dev/sr0
|
||||
```
|
||||
|
||||
整个安装过程由完全由安装向导指引的,并且速度非常快。无论是选择要安装什么包(按**工作站**, **服务器**, 及**自定义**进行分组 ),磁盘分区,或者是启动安装,你都不会出现进行不下去的问题。
|
||||
|
||||
Red Hat 6 包括一个 `xf86config` 应用程序来一步步指导你完成 X 配置工作,尽管它有一些之后的 X 不认的奇怪的鼠标模拟选项。它比手动修改 Xf86Config 配置文件要容易得多,但是要正确无误的配置好 X 环境显然不是一个简单的工作。
|
||||
|
||||
Red Hat 6 绑定的桌面环境是 GNOME ,没错就是它,但是窗口管理器是早期的 [Enlightenment][13] ,它同样也提供了主要的声卡服务进程。Xdm 和 gdm 都作为登录管理器包含在其中,以便普通用户没有权限也可以登录到系统中并启动或者关闭 X 桌面进程,这在多用户系统中是非常重要的。
|
||||
|
||||
它缺少一些主要的应用程序;还没有 gedit 工具,没有重要的统一办公应用程序,更没有软件包管理器。有 GnoRPM 工具,这是一个图形界面的 RPM 包管理工具,用于查看及删除软件包,这个工具跟 yum 或 PackageKit 工具非常类似,还有基于图形界面的文件编辑器 gnotepad+ (尽管没有 Emacs 工具)。
|
||||
|
||||
总的来说,桌面环境在使用上也是非常直观的。跟后期实现的 GNOME 桌面环境不同,这个早期版本的在屏幕底部有个面板,其中有一个应用程序菜单和启动器图标,在中间位置有个虚拟桌面控制器。我无法想象其它操作系统的用户在使用这个桌面环境时会有多么的不习惯。
|
||||
|
||||
Red Hat 6 对于 Linux 系统来说是一个巨大的进步,很明显 Linux 系统正向着成为一个适用的桌面系统方向发展。
|
||||
|
||||
### Mandrake 8.0 版本系统(2001 年)
|
||||
|
||||
![Mandrake 8.0 installer](https://opensource.com/sites/default/files/mandrake8.png "Mandrake 8.0 installer")
|
||||
|
||||
*Mandrake: Linux 系统的一个转折点*
|
||||
|
||||
Mandrake 8.0 于 2001 年发布,这已经可以跟 Apple OS 9.2 和 Windows ME 系统相提并论了。
|
||||
|
||||
我反而觉得老版本的系统才更安全一些。
|
||||
|
||||
其引导启动命令如下:
|
||||
|
||||
```
|
||||
$ qemu-system-i386 \
|
||||
-M pc-0.10 -m 2048 \
|
||||
-boot order=ad,menu=on \
|
||||
-drive file=mandrake8.qcow2 \
|
||||
-usb -net nic,model=rtl8139 \
|
||||
-netdev user,id=slirp \
|
||||
-vga cirrus \
|
||||
-cdrom mandrake-8.0-i386.iso
|
||||
```
|
||||
|
||||
我一直觉得 Red Hat 系统的安装过程非常棒了,但是 Mandrake 的安装过程更是让人喜出望外。它非常友好,并且在继续下一步之前还给用户一个测试配置文件的机会,易用高效,使用起来像魔法一样。我也不用导入自己的 `XF86Config` 配置文件,因为 Mandrake 的安装程序会自动完成该任务。
|
||||
|
||||
![Mandrake install](https://opensource.com/sites/default/files/mandrake8install_new.png "Mandrake install")
|
||||
|
||||
*Mandrake 8.0 系统的安装程序*
|
||||
|
||||
实际上,使用 Mandrake 系统跟使用其它的桌面环境系统的感受基本相同。让我很惊奇是的它们在操作体验上如此的相似。我相信,即使这个时候我在使用 Mandrake 系统的过程中遇到一些问题,以我自己的技术能力甚至是一个技术水平一般的年轻人也很容易解决。它的界面非常直观,帮助文档也很有用,并且软件包管理起来也很容易,只是那个时候人们还不习惯直接到网上下载他们需要的任何软件包来安装。
|
||||
|
||||
### Fedora 1 版本系统(2003 年)
|
||||
|
||||
![Fedora Core install](https://opensource.com/sites/default/files/fedora1.png "Fedora Core install")
|
||||
|
||||
*基于 Red Hat 的 Fedora 系统 *
|
||||
|
||||
2003 年,新的 Fedora Core 版本系统发布了。 Fedora Core 基于 Red Hat 系统,它的主要目的是在 Red Hat 企业版(RHEL)成为该公司旗舰产品之前继续带动 Linux 桌面版系统的发展。
|
||||
|
||||
启动老版本的 Fedora Core 1 系统也没啥特别的地方:
|
||||
|
||||
```
|
||||
$ qemu-system-i386 -M pc \
|
||||
-m 2048 -boot order=ac,menu=on \
|
||||
-drive file=fedora1.qcow2 -usb \
|
||||
-net nic,model='rtl8139' -netdev user \
|
||||
-vga cirrus -cdrom fedora-1-i386-cd1.iso
|
||||
```
|
||||
|
||||
安装 Fedora Core 同样简单容易; Fedora 和 Red Hat 系统在之后的 9 年中使用同样的安装器。它同样使用简单易用的图形化界面。
|
||||
|
||||
![Fedora Anaconda](https://opensource.com/sites/default/files/fedora1anaconda.png "Fedora Anaconda")
|
||||
|
||||
*Anaconda GUI 界面*
|
||||
|
||||
使用 Fedora Core 系统的体验跟 Red Hat 6 或 7 版本没多少区别。 GNOME 图形界面很漂亮,有各种独立的配置程序助手,并且界面展示都非常的整洁和专业。
|
||||
|
||||
桌面上的 “Start Here” 图标指导用户前往三个位置:应用程序目录,首选项面板和系统设置。 一个红帽的图标表示应用程序菜单,而下边的 GNOME 面板里包括所有最新的 Linux 应用程序启动器,包括 OpenOffice 办公套件和 mozilla 浏览器。
|
||||
|
||||
### 展望未来
|
||||
|
||||
在 2000 左右, Linux 系统已经发展得很好并取得了巨大的进步。桌面环境前所未有的更加精致美观,有各种可用的应用程序,安装过程比其它操作操作更简易更高效。事实上,从 2000 年以来,用户和系统之间的关系更加紧密,即使到现在也没发生根本上的改变。当然还有一些更新和改善,以及数量惊人的创新方面的变化。
|
||||
|
||||
让我们来了解一下各个 Linux 系统项目上的演变:
|
||||
|
||||
* Mandrake 系统后来更名为 Mandriva,如今为 [Mageia][1] ;
|
||||
* Fedora Core 随后改为 [Fedora][2] ;
|
||||
* [Ubuntu][3] 脱胎于 [Debian][4] 并且,它让 “Linux” 成为一个家喻户晓的词汇;
|
||||
* Valve 公司开发的 [SteamOS][5] 成为其官方游戏平台;
|
||||
* [Slackware][6] 现如今仍在平稳发展。
|
||||
|
||||
无论你是一个 Linux 新手,还是一个技术精湛的 Linux 老用户,上面的大多数截图都构成了让 Linux 系统被记入历史的一本传记。很高兴今天我们能够回顾成为世界上最大的开源项目之一的 Linux 系统是如何发展壮大起来的。更重要的是,每一次想到自己也是 Linux 开源世界中的一员我们就无比激动,把握现在,展望未来。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/penguinmedallion200x200.png?itok=ROQSR50J)
|
||||
|
||||
Seth Kenlon —— Seth Kenlon 是一位独立多媒体艺术家,开源文化倡导者, Unix 极客。他还是 Slackware 多媒体产品项目的维护人员之一,官网:http://slackermedia.ml 。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/16/12/yearbook-linux-test-driving-distros
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/seth
|
||||
[1]:http://mageia.org/
|
||||
[2]:http://fedoraproject.org/
|
||||
[3]:http://ubuntu.com/
|
||||
[4]:http://debian.org/
|
||||
[5]:http://store.steampowered.com/steamos
|
||||
[6]:http://slackware.com/
|
||||
[7]: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
|
||||
[8]: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
|
||||
[9]:http://www.qemu-advent-calendar.org/2014
|
||||
[10]:http://www.slackware.com/~volkerdi/
|
||||
[11]:https://ibiblio.org/pub/historic-linux/distributions/debian-0.91/debian-0.91/dist
|
||||
[12]:http://www.xfree86.org/
|
||||
[13]:http://enlightenment.org/
|
@ -0,0 +1,293 @@
|
||||
完全指南之在 Ubuntu 操作系统中安装及卸载软件
|
||||
============================================================
|
||||
|
||||
![Complete guide for installing and removing applications in Ubuntu](https://itsfoss.com/wp-content/uploads/2016/12/Managing-Software-in-Ubuntu-1.jpg)
|
||||
|
||||
摘要:这篇文章详尽地说明了在 Ubuntu Linux 系统中安装及卸载软件的各种方法。
|
||||
|
||||
当你从 Windows 系统[转向 Linux 系统][14]的时候,刚开始的体验绝对是非比寻常的。在 Ubuntu 系统下就连最基本的事情,比如安装个应用程序都会让(刚从 Windows 世界来的)人感到无比困惑。
|
||||
|
||||
但是你也不用太担心。因为 Linux 系统提供了各种各样的方法来完成同一个任务,刚开始你感到困惑那也是正常的。你并不孤单,我们大家都是这么经历过来的。
|
||||
|
||||
在这篇初学者指南中,我将会教大家在 Ubuntu 系统里以最常用的方式来安装软件,以及如何卸载之前已安装的软件。
|
||||
|
||||
关于在 Ubuntu 上应使用哪种方法来安装软件,我也会提出自己的建议。请用心学习。这篇文章写得很长也很详细,你从中绝对能够学到东西。
|
||||
|
||||
### 在 Ubuntu 系统中安装和卸载软件
|
||||
|
||||
在这篇教程中我使用的是运行着 Unity 桌面环境的 Ubuntu 16.04 版本的系统。除了一些截图外,这篇教程也同样适用于其它版本的 Ubuntu 系统。
|
||||
|
||||
### 1.1 使用 Ubuntu 软件中心来安装软件 【推荐使用】
|
||||
|
||||
在 Ubuntu 系统中查找和安装软件最简单便捷的方法是使用 Ubuntu 软件中心。在 Ubuntu Unity 桌面里,你可以在 Dash 下搜索 Ubuntu 软件中心,然后选中打开即可:
|
||||
|
||||
[
|
||||
![Run Ubuntu Software Center](https://itsfoss.com/wp-content/uploads/2016/12/Ubuntu-Software-Center.png)
|
||||
][15]
|
||||
|
||||
你可以把 Ubuntu 软件中心想像成 Google 的 Play 商店或者是苹果的 App 商店。它包含 Ubuntu 系统下所有可用的软件。你可以通过应用程序的名称来搜索应用程序或者是通过浏览各种软件目录来进行查找软件。你还可以根据作者进行查询。这由你自己来选择。
|
||||
|
||||
![Installing software in Ubuntu using Ubuntu Software Center](https://itsfoss.com/wp-content/uploads/2016/12/install-software-Ubuntu-linux.jpeg)
|
||||
|
||||
一旦你找到自己想要的应用程序,选中它。软件中心将打开该应用程序的描述页面。你可以阅读关于这款软件的说明,评分等级和用户的评论。如果你愿意,也可以写一条评论。
|
||||
|
||||
一旦你确定想安装这款软件,你可以点击安装按钮来安装已选择的应用程序。在 Ubuntu 系统中,你需要输入 root 账号的密码才能安装该应用程序。
|
||||
|
||||
[
|
||||
![Installing software in Ubuntu: The easy way](https://itsfoss.com/wp-content/uploads/2016/12/install-software-Ubuntu-linux-1.jpg)
|
||||
][16]
|
||||
|
||||
还有什么比这更简单的吗?我觉得应该没有了吧!
|
||||
|
||||
提示:正如我[在 Ubuntu 16.04 系统安装完成后你需要做的事情][17]这篇文章提到的那样,你应该启用 Canonical 合作伙伴仓库。默认情况下,Ubuntu 系统仅提供了那些源自自身软件库(Ubuntu 认证)的软件。
|
||||
|
||||
但是还有一个 Canonical 合伙伙伴软件库,它包含一些闭源专属软件,Ubuntu 并不直接管控它。启用该仓库后将让你能够访问更多的软件。[在 Ubuntu 系统下安装 Skype 软件][18]就是通过那种方式安装完成的。
|
||||
|
||||
在 Unity Dash 中,找到软件或更新工具。
|
||||
|
||||
[
|
||||
![Ubuntu Software Update Settings](https://itsfoss.com/wp-content/uploads/2014/08/Software_Update_Ubuntu.jpeg)
|
||||
][19]
|
||||
|
||||
如下图,打开其它软件标签面,勾选 Canonical 合作伙伴选项。
|
||||
|
||||
[
|
||||
![Enable Canonical partners in Ubuntu 14.04](https://itsfoss.com/wp-content/uploads/2014/04/Enable_Canonical_Partner.jpeg)
|
||||
][20]
|
||||
|
||||
### 1.2 从 Ubuntu 软件中心卸载软件(推荐方式)
|
||||
|
||||
我们刚刚演示了如何在 Ubuntu 软件中心安装软件。那么如何使用同样的方法来卸载已安装的软件呢?
|
||||
|
||||
在 Ubuntu 软件中心卸载软件跟安装软件的步骤一样简单。
|
||||
|
||||
打开软件中心然后点击已安装的软件标签面。它将显示所有已安装的软件。或者,你也可以只搜索应用程序的名称。
|
||||
|
||||
要卸载 Ubuntu 系统中的应用程序,点击删除按钮即中。你同样需要输入 root 账号的密码。
|
||||
|
||||
[
|
||||
![Uninstall software installed in Ubuntu](https://itsfoss.com/wp-content/uploads/2016/12/Uninstall-Software-Ubuntu.jpeg)
|
||||
][22]
|
||||
|
||||
### 2.1 在 Ubuntu 系统中使用 .DEB 文件来安装软件
|
||||
|
||||
.deb 文件跟 Windows 下的 .exe 文件很相似。这是一种安装软件的简易方式。很多软件开发商都会提供 .deb 格式的安装包。
|
||||
|
||||
Google Chrome 浏览器就是这样的。你可以下载从其官网下载 .deb 安装文件
|
||||
|
||||
[
|
||||
![Downloading deb packaging](https://itsfoss.com/wp-content/uploads/2016/12/install-software-deb-package.png)
|
||||
][23]
|
||||
|
||||
一旦你下载完成 .deb 安装文件之后,只需要双击运行即可。它将在 Ubuntu 软件中心打开,你就可以使用前面 1.1 节中同样的方式来安装软件。
|
||||
|
||||
或者,你也可以使用轻量级的安装程序 [在 Ubuntu 系统中使用 Gdebi 工具来安装 .deb 安装文件][24]。
|
||||
|
||||
软件安装完成后,你可以随意删除下载的 .deb 安装包。
|
||||
|
||||
提示:在使用 .deb 文件的过程中需要注意的一些问题:
|
||||
|
||||
* 确保你是从官网下载的 .deb 安装文件。仅使用官网或者 GitHub 上提供的软件包。
|
||||
* 确保你下载的 .deb 文件系统类型正确(32 位或是 64 位)。请阅读我们写的快速指南[如何查看你的 Ubuntu 系统是 32 位的还是 64 位的][8]
|
||||
|
||||
### 2.2 使用 .DEB 文件来删除已安装的软件
|
||||
|
||||
卸载 .deb 文件安装的软件跟我们在 1.2 节看到的步骤一样的。只需要打开 Ubuntu 软件中心,搜索应用程序名称,然后单击移除并卸载即可。
|
||||
|
||||
或者你也可以使用[新立得包管理器][25]。这也不是必须的,但是如果在 Ubuntu 软件中心找不到已安装的应用程序的情况下,就可以使用这个工具了。新立得软件包管理器会列出你系统里已安装的所有可用的软件。这是一个非常强大和有用的工具。
|
||||
|
||||
这个工具很强大非常有用。在 Ubuntu 软件中心被开发出来提供一种更友好的安装软件方式之前,新立得包管理器是 Ubuntu 系统中默认的安装和卸载软件的工具。
|
||||
|
||||
你可以单击下面的链接来安装新立得软件包管器(它将会在 Ubuntu 软件中心中打开)。
|
||||
|
||||
- [安装新立得包管理器][26]
|
||||
|
||||
打开新立得包管理器,然后找到你想卸载的软件。已安装的软件标记为绿色按钮。单击并选择“标记为删除”。然后单击“应用”来删除你所选择的软件。
|
||||
|
||||
[
|
||||
![Using Synaptic to remove software in Ubuntu](https://itsfoss.com/wp-content/uploads/2016/12/uninstall-software-ubuntu-synaptic.jpeg)
|
||||
][27]
|
||||
|
||||
### 3.1 在 Ubuntu 系统中使用 APT 命令来安装软件(推荐方式)
|
||||
|
||||
你应该看到过一些网站告诉你使用 `sudo apt-get install` 命令在 Ubuntu 系统下安装软件。
|
||||
|
||||
实际上这种命令行方式跟第 1 节中我们看到的安装方式一样。只是你没有使用 Ubuntu 软件中心来安装或卸载软件,而是使用的是命令行接口。别的没什么不同。
|
||||
|
||||
使用 `apt-get` 命令来安装软件超级简单。你只需要执行下面的命令:
|
||||
|
||||
```
|
||||
sudo apt-get install package_name
|
||||
```
|
||||
|
||||
上面使用 `sudo` 是为了获取“管理员”或 “root” (Linux 专用术语)账号权限。你可以替换 package_name 为你想要安装的软件包名。
|
||||
|
||||
`apt-get` 命令可以自动补全,你只需要输入一些字符并按 tab 键即可, `apt-get` 命令将会列出所有与该字符相匹配的程序。
|
||||
|
||||
### 3.2 在 Ubuntu 系统下使用 APT 命令来卸载软件(推荐方式)
|
||||
|
||||
在命令行下,你可以很轻易的卸载 Ubuntu 软件中心安装的软件,以及使用 `apt` 命令或是使用 .deb 安装包安装的各种软件。
|
||||
|
||||
你只需要使用下面的命令,替换 package-name 为你想要删除的软件名。
|
||||
|
||||
```
|
||||
sudo apt-get remove package_name
|
||||
```
|
||||
|
||||
同样地,你也可以通过按 tab 键来利用 `apt-get` 命令的自动补全功能。
|
||||
|
||||
使用 `apt-get` 命令来安装卸载或卸载并不算什么高深的技能。这实际上非常简便。通过这些简单命令的运用,你可以熟悉 Ubuntu Linux 系统的命令行操作,长期使用对你学习 Linux 系统的帮忙也很大。建议你看下我写的一篇很详细的[apt-get 命令使用指导][28]文章来进一步的了解该命令的使用。
|
||||
|
||||
- 建议阅读:[Linux 系统下 apt-get 命令初学者完全指南][29]
|
||||
|
||||
### 4.1 使用 PPA 命令在 Ubuntu 系统下安装应用程序
|
||||
|
||||
PPA 是[个人软件包归档( Personal Package Archive)][30]的缩写。这是开发者为 Ubuntu 用户提供软件的另一种方式。
|
||||
|
||||
在第 1 节中出现了一个叫做 ‘仓库(repository)’ 的术语。仓库本质上是一个软件集。 Ubuntu 官方仓库主要用于提供经过 Ubuntu 自己认证过的软件。 Canonical 合作伙伴仓库包含来自合作厂商提供的各种应用软件。
|
||||
|
||||
同时,PPA 允许开发者创建自己的 APT 仓库。当用户在系统里添加了一个仓库时(`sources.list` 中增加了该仓库),用户就可以使用开发者自己的仓库里提供的软件了。
|
||||
|
||||
现在你也许要问既然我们已经有 Ubuntu 的官方仓库了,还有什么必要使用 PPA 方式呢?
|
||||
|
||||
答案是并不是所有的软件都会自动添加到 Ubuntu 的官方仓库中。只有受信任的软件才会添加到其中。假设你开发出一款很棒的 Linux 应用程序,然后你想为用户提供定期的更新,但是在它被添加到 Ubuntu 仓库之前,这需要花费好几个月的时间(如果是在被允许的情况下)。 PPA 的出现就是为了解决这个问题。
|
||||
|
||||
除此之外, Ubuntu 官方仓库通常不会把最新版的软件添加进来。这会影响到 Ubuntu 系统的安全性及稳定性。新版本的软件或许会有影响到系统的[回退][31]。这就是为什么在新款软件进入到官方仓库前要花费一定的时间,有时候需要等待几个月。
|
||||
|
||||
但是,如果你不想等待最新版出现在 Ubuntu 仓库中呢?这个时候 PPA 就对你有帮助了。通过 PPA 方式,你可以获得该应用程序的最新版本。
|
||||
|
||||
通常情况下, PPA 通过这三个命令来进行使用。第一个命令添加 PPA 仓库到源列表中。第二个命令更新软件缓存列表,这样你的系统就可以获取到可用的新版本软件了。第三个命令用于从 PPA 安装软件。
|
||||
|
||||
我将演示使用 PPA 方式来安装 [Numix 主题][32]:
|
||||
|
||||
```
|
||||
sudo add-apt-repository ppa:numix/ppa
|
||||
sudo apt-get update
|
||||
sudo apt-get install numix-gtk-theme numix-icon-theme-circle
|
||||
```
|
||||
|
||||
在上面的实例中,我们添加了一个[Numix 项目][33]提供的 PPA 。在更新软件信息之后,我们安装了两个 Numix PPA 中可用的应用程序。
|
||||
|
||||
如果你想使用带有图形界面的应用程序,你可以使用 [Y-PPA 应用程序][34]。通过它你可以很方便地查询 PPA,添加和删除软件。
|
||||
|
||||
注意:PPA 的安全性经常受到争议。我的建议是你应该从受信任的源添加 PPA,最好是从官方软件源添加。
|
||||
|
||||
### 4.2 卸载使用 PPA 方式安装的应用程序
|
||||
|
||||
在之前的文章[在 Ubuntu 系统下移除 PPA][35] 中我已经写得很详细了。你可以跳转到这篇文章去深入学习卸载 PPA 方式安装的软件。
|
||||
|
||||
这里简要提一下,你可以使用下面的两个命令来卸载:
|
||||
|
||||
```
|
||||
sudo apt-get remove numix-gtk-theme numix-icon-theme-circle
|
||||
|
||||
sudo add-apt-repository --remove ppa:numix/ppa
|
||||
```
|
||||
|
||||
第一个命令是卸载通过 PPA 方式安装的软件。第二个命令是从 `source.list` 中删除该 PPA。
|
||||
|
||||
### 5.1 在 Ubuntu Linux 系统中使用源代码来安装软件(不推荐使用)
|
||||
|
||||
我并不建议你使用[软件源代码][36]来安装该应用程序。这种方法很麻烦,容易出问题而且还非常地不方便。你得费尽周折去解决依赖包的问题。你还得保留源代码文件,以便将来卸载该应用程序。
|
||||
|
||||
但是还是有一些用户喜欢通过源代码编译的方式来安装软件,尽管他们自己本身并不会开发软件。实话告诉你,我曾经也经常使用这种方式来安装软件,不过那都是 5 年前的事了,那时候我还是一个实习生,我必须在 Ubuntu 系统下开发一款软件出来。但是,从那之后我更喜欢使用其它方式在 Ubuntu 系统中安装应用程序。我觉得,对于普通的 Linux 桌面用户,最好不要使用源代码的方式来安装软件。
|
||||
|
||||
在这一小节中我将简要地列出使用源代码方式来安装软件的几个步骤:
|
||||
* 下载你想要安装软件的源代码。
|
||||
* 解压下载的文件。
|
||||
* 进入到解压目录里并找到 `README` 或者 `INSTALL` 文件。一款开发完善的软件都会包含这样的文件,用于提供安装或卸载软件的指导方法。
|
||||
* 找到名为 `configure` 的配置文件。如果在当前目录下,使用这个命令来执行该文件:`./configure` 。它将会检查你的系统是否包含所有的必须的软件(在软件术语中叫做‘依赖包’)来安装该应用程序。(LCTT 译注:你可以先使用 `./configure --help` 来查看有哪些编译选项,包括安装的位置、可选的特性和模块等等。)注意并不是所有的软件都包括该配置文件,我觉得那些开发很糟糕的软件就没有这个配置文件。
|
||||
* 如果配置文件执行结果提示你缺少依赖包,你得先安装它们。
|
||||
* 一旦你安装完成所有的依赖包后,使用 `make` 命令来编译该应用程序。
|
||||
* 编译完成后,执行 `sudo make install` 命令来安装该应用程序。
|
||||
|
||||
注意有一些软件包会提供一个安装软件的脚本文件,你只需要运行这个文件即可安装完成。但是大多数情况下,你可没那么幸运。
|
||||
|
||||
还有,使用这种方式安装的软件并不会像使用 Ubuntu 软件库、 PPA 方式或者 .deb 安装方式那样安装的软件会自动更新。
|
||||
|
||||
如果你坚持使用源代码方式来安装软件,我建议你看下这篇很详细的文章[在 Ubuntu 系统中使用源代码安装软件][37]。
|
||||
|
||||
### 5.2 卸载使用源代码方式安装的软件(不推荐使用)
|
||||
|
||||
如果你觉得使用源代码安装软件的方式太难了,再想想看,当你卸载使用这种方式安装的软件将会更痛苦。
|
||||
|
||||
* 首先,你不能删除用于安装该软件的源代码。
|
||||
* 其次,你必须确保在安装的时候也有对应的方式来卸载它。一款设计上很糟糕的应用程序就不会提供卸载软件的方法,因此你不得不手动去删除那个软件包安装的所有文件。
|
||||
|
||||
正常情况下,你应该切换到源代码的解压目录下,使用下面的命令来卸载那个应用程序:
|
||||
|
||||
```
|
||||
sudo make uninstall
|
||||
```
|
||||
|
||||
但是,这也不能保证你每次都会很顺利地卸载完成。
|
||||
|
||||
看到了吧,使用源代码方式来安装软件实在是太麻烦了。这就是为什么我不推荐大家在 Ubuntu 系统中使用源代码来安装软件的原因。
|
||||
|
||||
### 其它一些在 Ubuntu 系统中安装软件的方法
|
||||
|
||||
另外,还有一些在 Ubuntu 系统下并不常用的安装软件的方法。由于这篇文章已经写得够长了,我就不再深入探讨了。下面我将把它们列出来:
|
||||
* Ubuntu 新推出的 [Snap 打包][9]方式
|
||||
* 使用 [dpkg][10] 命令
|
||||
* [AppImage][11] 方式
|
||||
* [pip][12] : 用于安装基于 Python 语言的应用程序
|
||||
|
||||
### 你是如何在 UBUNTU 系统中安装软件的呢?
|
||||
|
||||
如果你一直都在使用 Ubuntu 系统,那么你在 Ubuntu Linux 系统下最喜欢使用什么方式来安装软件呢?你觉得这篇文章对你有用吗?请分享你的一些观点,建议和提出相关的问题。
|
||||
|
||||
--------------------
|
||||
|
||||
作者简介:
|
||||
![](https://secure.gravatar.com/avatar/20749c268f5d3e4d2c785499eb6a17c0?s=70&d=mm&r=g)
|
||||
|
||||
我叫 Abhishek Prakash ,F.O.S.S 开发者。我的工作是一名专业的软件开发人员。我是一名狂热的 Linux 系统及开源软件爱好者。我使用 Ubuntu 系统,并且相信分享是一种美德。除了 Linux 系统之外,我喜欢经典的侦探神秘小说。我是 Agatha Christie 作品的真爱粉。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/remove-install-software-ubuntu/
|
||||
|
||||
作者:[ABHISHEK PRAKASH][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://itsfoss.com/author/abhishek/
|
||||
[1]:https://itsfoss.com/author/abhishek/
|
||||
[2]:https://itsfoss.com/remove-install-software-ubuntu/#comments
|
||||
[3]:http://www.facebook.com/share.php?u=https%3A%2F%2Fitsfoss.com%2Fremove-install-software-ubuntu%2F%3Futm_source%3Dfacebook%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
|
||||
[4]:https://twitter.com/share?original_referer=/&text=How+To+Install+And+Remove+Software+In+Ubuntu+%5BComplete+Guide%5D&url=https://itsfoss.com/remove-install-software-ubuntu/%3Futm_source%3Dtwitter%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare&via=abhishek_pc
|
||||
[5]:https://plus.google.com/share?url=https%3A%2F%2Fitsfoss.com%2Fremove-install-software-ubuntu%2F%3Futm_source%3DgooglePlus%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
|
||||
[6]:https://www.linkedin.com/cws/share?url=https%3A%2F%2Fitsfoss.com%2Fremove-install-software-ubuntu%2F%3Futm_source%3DlinkedIn%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
|
||||
[7]:https://www.reddit.com/submit?url=https://itsfoss.com/remove-install-software-ubuntu/&title=How+To+Install+And+Remove+Software+In+Ubuntu+%5BComplete+Guide%5D
|
||||
[8]:https://itsfoss.com/32-bit-64-bit-ubuntu/
|
||||
[9]:https://itsfoss.com/use-snap-packages-ubuntu-16-04/
|
||||
[10]:https://help.ubuntu.com/lts/serverguide/dpkg.html
|
||||
[11]:http://appimage.org/
|
||||
[12]:https://pypi.python.org/pypi/pip
|
||||
[13]:https://itsfoss.com/remove-install-software-ubuntu/managing-software-in-ubuntu-1/
|
||||
[14]:https://itsfoss.com/reasons-switch-linux-windows-xp/
|
||||
[15]:https://itsfoss.com/wp-content/uploads/2016/12/Ubuntu-Software-Center.png
|
||||
[16]:https://itsfoss.com/remove-install-software-ubuntu/install-software-ubuntu-linux-1/
|
||||
[17]:https://itsfoss.com/things-to-do-after-installing-ubuntu-16-04/
|
||||
[18]:https://itsfoss.com/install-skype-ubuntu-1404/
|
||||
[19]:https://itsfoss.com/ubuntu-notify-updates-frequently/software_update_ubuntu/
|
||||
[20]:https://itsfoss.com/things-to-do-after-installing-ubuntu-14-04/enable_canonical_partner/
|
||||
[21]:https://itsfoss.com/essential-linux-applications/
|
||||
[22]:https://itsfoss.com/remove-install-software-ubuntu/uninstall-software-ubuntu/
|
||||
[23]:https://itsfoss.com/remove-install-software-ubuntu/install-software-deb-package/
|
||||
[24]:https://itsfoss.com/gdebi-default-ubuntu-software-center/
|
||||
[25]:http://www.nongnu.org/synaptic/
|
||||
[26]:apt://synaptic
|
||||
[27]:https://itsfoss.com/remove-install-software-ubuntu/uninstall-software-ubuntu-synaptic/
|
||||
[28]:https://itsfoss.com/apt-get-linux-guide/
|
||||
[29]:https://itsfoss.com/apt-get-linux-guide/
|
||||
[30]:https://help.launchpad.net/Packaging/PPA
|
||||
[31]:https://en.wikipedia.org/wiki/Software_regression
|
||||
[32]:https://itsfoss.com/install-numix-ubuntu/
|
||||
[33]:https://numixproject.org/
|
||||
[34]:https://itsfoss.com/easily-manage-ppas-ubuntu-1310-ppa-manager/
|
||||
[35]:https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/
|
||||
[36]:https://en.wikipedia.org/wiki/Source_code
|
||||
[37]:http://www.howtogeek.com/105413/how-to-compile-and-install-from-source-on-ubuntu/
|
95
published/201701/20161222 LFCS Command Line Basics.md
Normal file
95
published/201701/20161222 LFCS Command Line Basics.md
Normal file
@ -0,0 +1,95 @@
|
||||
LFCS 命令行基础
|
||||
=======================
|
||||
|
||||
本文中包含了很多命令行基础。我们将讨论 TeleTYpe(TTY)和几个命令及其选项。确保做完所有练习,并要知道,除非另有说明,对 CentOS 和 Ubuntu 都是相同的。
|
||||
|
||||
### TTY
|
||||
|
||||
当没有图形用户界面(GUI)或当用户在 GUI 之外,Linux 就会使用 TTY。当打开终端窗口时也使用 TTY,但这些是不同类型的 TTY。
|
||||
|
||||
有三种类型的 TTY:
|
||||
|
||||
1. 物理终端
|
||||
2. 本地伪终端
|
||||
3. 远程伪终端
|
||||
|
||||
基本上,每个 Linux 系统有大约六个或七个物理 TTY。 通过按住 `CTRL + ALT` 键,然后在 CentOS 按住 `F1` 到 `F6` ,而在 Ubuntu 中是 `F1` 到 `F7`。
|
||||
|
||||
**注意:** 一些发行版可能有不同数量的 TTY 和不同的 GUI 默认位置。有点发行版可能有在物理 TTY 之间切换的不同组合键,如 `CTRL + F#` 或 `ALT + F#` ( LCTT 译注:`F#` 代表 F1、F2 等)。当使用 VirtualBox 时,除非您更改了主机键映射,请使用右 CTRL 键。
|
||||
|
||||
在 CentOS 中,GUI 在 TTY1(`CTRL + ALT + F1`)上,其他物理 TTY 都是基于文本的。 在 Ubuntu 上,GUI 在 TTY7(`CTRL + ALT + F7`)上,其他物理 TTY 都是基于文本的。
|
||||
|
||||
**注意:** 尝试在另一个 TTY 下加载 GUI 是不明智的,因为这可能耗用大量资源,但你可以这样做。
|
||||
|
||||
当 Linux 启动时,不管是 CentOS 还是 Ubuntu,都会打开默认 TTY。如果安装了 GUI,对于 CentOS 是打开 TTY1,对于 Ubuntu 是打开 TTY7。如果你打开一个终端窗口(伪 TTY)并使用命令 `who`,你可以看到正在使用的 TTY 的列表。 如图 1 所示。
|
||||
|
||||
![Figure 01.jpg](https://www.linuxforum.com/attachments/figure-01-jpg.93/)
|
||||
|
||||
*图 1*
|
||||
|
||||
在图 1 中,你可以看到我当前登录到 TTY1(非 GUI)。第二行连接显示我已登录到 GUI(TTY7)以及两个伪 TTY(PTS/1 和 PTS/2)。如图 2,你可以看到新条目显示了远程伪 TTY(PTS/3)。 远程伪连接来自 IP 地址为 192.168.0.11 的系统。
|
||||
|
||||
![Figure 02.jpg](https://www.linuxforum.com/attachments/figure-02-jpg.94/)
|
||||
|
||||
*图 2*
|
||||
|
||||
可以使用诸如 PuTTY 或任何 SSH 的客户端(如果远程 Linux 系统上启用了 SSH)之类的应用程序进行远程 TTY 连接。
|
||||
|
||||
如果终端窗口字体比较小,你可以使用 `CTRL + SHIFT` 键和 `+` 键来放大字体。多次按下可以更大。要缩小大小,请使用 `CTRL + SHIFT + -` 不断缩小。要使终端字体恢复为原始大小,请按下 `CTRL + SHIFT + 0`。
|
||||
|
||||
**注意:** 请注意,如果字体已经足够大或足够小了,组合键就不再工作了。
|
||||
|
||||
希望你现在已经了解各种类型的 TTY。让我们看看一些可以在 TTY 中使用的命令。
|
||||
|
||||
### 命令
|
||||
|
||||
其中一个命令前面已经讨论过了。命令 `who` 用于显示谁登录到了系统。
|
||||
|
||||
另一个命令是 `pwd`。命令 `pwd` 代表“打印工作目录(Print Working Directory)”。该命令返回你所在的当前目录。例如,如果终端提示符是 `[jbuse@localhost〜]$`,则用户名为 `jbuse`,当前目录为 `〜`。波浪号(`〜`)代表用户的主文件夹。主文件夹应该是 `/home/USERNAME`。用户名是用于登录系统的名称。
|
||||
|
||||
要列出当前文件夹的内容,请使用命令 `ls`。`ls` 命令代表 List。如果未指定任何选项,则列出当前文件夹。如果给出文件夹名称,则会列出该文件夹的内容。例如,要查看 `media` 文件夹的内容,你可以使用命令 `ls /media`。
|
||||
|
||||
在 `ls` 命令后面我们可以添加一些选项以显示更多详细信息或特定详细信息。如果你想看到所有的文件夹和文件,即使是隐藏的,请使用选项 `-a`。要查看当前目录中的所有文件和文件夹,请使用命令 `ls -a`。隐藏的文件和文件夹将在名称前面显示一个句点(`.`)。
|
||||
|
||||
要在每个文件夹名称后看到正斜杠(`/`),请使用 `-F` 选项。当前文件夹列表将是 `ls -F`。`-F` 用于按文件类型对文件进行分类。符号链接在文件夹名称后用 `@` 表示。
|
||||
|
||||
你可以把这两个选项连在一起形成 `ls -aF`。
|
||||
|
||||
**注意:** 一些选项可能有不同的大小写。选项区分大小写。
|
||||
|
||||
另一个选项是显示长列表的 `-l`。示例输出如图 3 所示。文件夹和文件名称列在右侧。文件为白色,文件夹为深蓝色,符号链接为浅蓝色。如图 3 所示,符号链接 `vtrgb` 链接自 `/etc/alternatives/vtrgb` 。
|
||||
|
||||
![Figure 03.jpg](https://www.linuxforum.com/attachments/figure-03-jpg.95/)
|
||||
|
||||
*图 3*
|
||||
|
||||
左侧的第一列是文件或文件夹的权限。第一个字母是 `d` 的为目录,是 `-` 的为文件。接下来的三个字母显示所有者的权限(`r` - 读、`w` - 写、`x` - 执行),后面是组权限以及“其他人”的权限。下一列数字显示指向文件或文件夹的链接数。再下一列是所有者名称,后面是所有组名称。再下一列是文件或文件夹在存储设备上占用的字节数。接下来的三列是文件上次修改的月份、日期和年份。最后一列是路径名。
|
||||
|
||||
目前为止,你可以看到列表是按字母顺序排序。要颠倒从 “z” 到 “a” 而不是 “a” 到 “z” 的顺序,请使用 `-r` 选项。逆转选项 `-r` 使 ls 命令反转输出顺序。
|
||||
|
||||
要按修改的时间戳列出文件,请使用 `-t` 选项。顺序是从最近修改到最早的修改日期。当然,在命令 `ls -tr` 中,同时使用 `-t` 和 `-r` 颠倒了顺序。
|
||||
|
||||
如果你不喜欢看文件的长长的字节数,使用选项 `-h`。输出将会更易读,如显示 `4.0K` 而不是 `4096`。
|
||||
|
||||
要获取单个文件夹的特定信息,请使用选项 `-d`,但必须指定该文件夹。例如,要查看文件夹 `/media` 的详细信息,请使用命令 `ls -ld /media`。
|
||||
|
||||
另一个要熟悉的命令是命令 `cat`。命令 `cat` 用于将标准输入(文件)复制到标准输出(屏幕)。使用 `cat` 可以轻松地查看文件的内容。例如,要查看名为 `text` 的文件的内容,如果你与文件 `text` 在同一个文件夹中请使用命令 `cat text`。如果你不在同一个文件夹中,那么你必须指定位置。例如,如果文件 `text` 在文件夹 `/home/jarret/test/` 中,那么命令将是 `cat /home/jarret/test/text`。
|
||||
|
||||
另一个非常有用的命令是 `man`。`man` 命令用于查看特定命令的文档。例如,要查看命令 `ls` 的帮助页面,请使用命令 `man ls`。
|
||||
|
||||
**注意:** 记住,在 LFCS 考试中,你可以使用 `man` 命令。
|
||||
|
||||
查看这些命令并测试它们以熟悉它们。使用 `man` 命令,查看本文中的命令以查看其他可用的选项。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linuxforum.com/threads/lfcs-command-line-basics.3334/
|
||||
|
||||
作者:[Jarret][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.linuxforum.com/members/jarret.268/
|
@ -0,0 +1,101 @@
|
||||
4 个 Linux 下最好的命令行下载管理器/加速器
|
||||
============================================================
|
||||
|
||||
我们经常由于不同需求使用下载管理器从互联网下载文件,它给我和其他人提供了很多帮助。我们都想要一个超级快速的下载管理器来完成下载尽可能多的任务,以便我们可以节省时间来进一步地工作。有很多可以加速下载的下载管理器和加速器可用(图形化界面和命令行界面)。
|
||||
|
||||
所有的下载工具做着同样的任务,但它们的处理方式和功能是不同的,比如,单线程和多线程、交互和非交互。 在这里,我们将列出 4 个最好的我们日常工作使用的命令行下载加速器。
|
||||
|
||||
#### #1 Aria2
|
||||
|
||||
[Aria2][1] 是一个用于 Linux、Windows 和 Mac OSX 的轻量级、多协议和多源的命令行下载管理器/实用程序。它支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink。aria2 可以通过内置的 JSON-RPC 和 XML-RPC 接口操作。
|
||||
|
||||
它支持多线程,可以使用多个源或协议下载文件,确实可以加速并尽可能多的完成下载。
|
||||
|
||||
它非常轻量级,不需要太多的内存和 CPU。我们可以使用它作为 BitTorrent 客户端,因为它有所有你想要的 BitTorrent 客户端的功能。
|
||||
|
||||
#### Aria2 功能
|
||||
|
||||
* 支持 HTTP/HTTPS GET 方式
|
||||
* 支持 HTTP 代理
|
||||
* 支持 HTTP BASIC 认证
|
||||
* 支持 HTTP 代理认证
|
||||
* 支持 FTP (主动、被动模式)
|
||||
* 通过 HTTP 代理的 FTP(GET 命令或隧道)
|
||||
* 分段下载
|
||||
* 支持 Cookie
|
||||
* 它可以作为守护进程运行。
|
||||
* 支持 BitTorrent 协议和 fast 扩展。
|
||||
* 在含有多个文件的 torrent 中的选择性下载
|
||||
* 支持 Metalink 版本 3.0 (HTTP/FTP/BitTorrent)。
|
||||
* 限制下载/上传速度
|
||||
|
||||
有关 Aria2 的进一步用法,请参阅以下文章:[如何在 Linux 中安装和使用 Aria2][2]。
|
||||
|
||||
#### #2 Axel
|
||||
|
||||
[Axel][3] 是一个轻量级下载程序,它如其他加速器那样做着同样的事情。它可以为一个文件打开多个连接,每个连接下载单独的文件片段以更快地完成下载。
|
||||
|
||||
Axel 支持 HTTP、HTTPS、FTP 和 FTPS 协议。它也可以使用多个镜像站点来下载单个文件。 所以,Axel 可以为下载加速高达 40%(大约,我个人认为)。 它非常轻量级,因为没有依赖,而且使用非常少的 CPU 和内存。
|
||||
|
||||
Axel 使用一个单线程将所有数据直接下载到目标文件。
|
||||
|
||||
注意:没有可以在单条命令中下载两个文件的选项。
|
||||
|
||||
有关 Axel 的更多使用,请参阅以下文章:[如何在 Linux 中安装和使用 Axel][4]。
|
||||
|
||||
#### #3 Wget
|
||||
|
||||
[wget][5](以前称为 Geturl)是一个免费的、开源的命令行下载程序,它使用 HTTP、HTTPS 和 FTP 这些最广泛使用的 Internet 协议来获取文件。它是一个非交互式命令行工具,其名字是意思是从万维网中获取文件。
|
||||
|
||||
相比其它工具,wget 将下载处理得相当好,即使它不支持多线程以及包括后台工作、递归下载、多个文件下载、恢复下载、非交互式下载和大文件下载在内的功能。
|
||||
|
||||
默认情况下,所有的 Linux 发行版都包含 wget,所以我们可以从官方仓库轻松安装,也可以安装到 windows 和 Mac 操作系统。
|
||||
|
||||
wget 可在慢速或不稳定的网络连接下保持健壮性,如果由于网络问题下载失败,它将继续重试,直到整个文件下载完成。如果服务器支持重新获取,它将指示服务器从中断的地方继续下载。
|
||||
|
||||
#### wget 功能
|
||||
|
||||
* 可以使用 REST 和 RANGE 恢复中止的下载
|
||||
* 可以使用文件名通配符和递归来对目录进行镜像同步
|
||||
* 基于 NLS 消息文件,提供许多不同语言支持
|
||||
* 可选将下载的文档中的绝对链接转换为相对链接,以便下载的文档可以在本地链接到彼此
|
||||
* 可在大多数类 UNIX 操作系统以及 Microsoft Windows 上运行
|
||||
* 支持 HTTP 代理
|
||||
* 支持 HTTP cookie
|
||||
* 支持持久 HTTP 连接
|
||||
* 无人值守/后台操作
|
||||
* 使用本地文件时间戳来确定是否需要在镜像时重新下载文档
|
||||
|
||||
有关 wget 的进一步用法,请参阅以下文章:[如何在 Linux 中安装和使用 wget][6]。
|
||||
|
||||
#### #4 Curl
|
||||
|
||||
[curl][7] 类似于 wget,但是不支持多线程,但令人惊讶的是,与 wget 相比,它的下载速度更快。
|
||||
|
||||
curl 是一个向服务器上传或下载的数据传输工具,支持的协议有 DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、TELNET 和 TFT 等。
|
||||
|
||||
该命令无需用户交互即可工作。此外,curl 支持代理、用户身份验证、FTP 上传、HTTP POST、SSL 连接、Cookie、恢复文件传输、Metalink 等。curl 由 libcurl 为所有相关传输功能提供支持。
|
||||
|
||||
如果指定的 URL 没有 `protocol://` 前缀,curl 将尝试猜测你可能需要什么协议。例如,以 “ftp.” 开头的主机名 curl 将假定你要使用 FTP。如果没有找到特定的协议,那么默认为 HTTP。
|
||||
|
||||
参考下面的文章来进一步使用 curl:[如何在 Linux 中安装和使用 curl] [8]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.2daygeek.com/best-4-command-line-download-managers-accelerators-for-linux/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.2daygeek.com/author/magesh/
|
||||
[1]:https://aria2.github.io/
|
||||
[2]:https://linux.cn/article-7982-1.html
|
||||
[3]:https://axel.alioth.debian.org/
|
||||
[4]:http://www.2daygeek.com/axel-command-line-downloader-accelerator-for-linux/
|
||||
[5]:https://www.gnu.org/software/wget/
|
||||
[6]:https://linux.cn/article-4129-1.html
|
||||
[7]:https://curl.haxx.se/
|
||||
[8]:http://www.2daygeek.com/curl-command-line-download-manager/
|
@ -0,0 +1,262 @@
|
||||
你值得了解的 10 个有趣的 Linux 命令行小技巧
|
||||
============================================================
|
||||
|
||||
我非常喜欢使用命令,因为它们比 GUI(图形用户界面)应用程序对 Linux 系统提供更多的控制,因此,我一直在寻找一些有趣的方法[让 Linux 的操作变得简单好玩][1],主要是基于终端操作。
|
||||
|
||||
当我们发现[使用 Linux 的新技巧][2]时,尤其是像我这样的命令行极客,我们总会感到非常来劲。
|
||||
|
||||
**建议阅读:** [5 有趣的 Linux 命令行技巧 - 第一部分][3]
|
||||
|
||||
而且我们也会很想与数百万 Linux 用户分享新学到的实践或命令,特别是那些还在使用自己的方式操作这个令人兴奋的操作系统的新手们。
|
||||
|
||||
|
||||
**建议阅读:** [10 个对新手有用的 Linux 命令行技巧 - 第二部分][4]
|
||||
|
||||
在这篇文章中,我们将回顾一系列[有用的命令行小技巧][4],它们可以显著地提高你的 Linux 使用技能。
|
||||
|
||||
### 1、 在 Linux 中锁定或隐藏文件或目录
|
||||
|
||||
锁定文件或目录最简单的方法是使用 Linux 文件权限。如果你是文件或目录的所有者,你可以阻止其他用户和组访问(删除、读取、写入、执行)它,如下所示:
|
||||
|
||||
```
|
||||
$ chmod 700 tecmint.info
|
||||
或
|
||||
$ chmod go-rwx tecmint.info
|
||||
```
|
||||
|
||||
想要了解更多有关 Linux 文件权限的内容,请阅读这篇文章[在 Linux 中管理用户和组,文件权限和属性][5]。
|
||||
|
||||
为了实现对系统中的其他用户隐藏文件或目录,可以通过在文件或目录开头添加 `.` 的方式重命名:
|
||||
|
||||
```
|
||||
$ mv filename .tecmint.info
|
||||
```
|
||||
|
||||
### 2、 在 Linux 中将 rwx 权限转为八进制格式
|
||||
|
||||
默认情况下,当你运行 [ls 命令][6]之后,它会使用 `rwx` 格式显示文件权限,为了了解 rwx 格式和八进制格式的等同性,你可以学习如何[在 Linux 中将 rwx 权限转为八进制格式][7]。
|
||||
|
||||
### 3、 当 `sudo` 命令执行失败时怎么使用 `su` 命令
|
||||
|
||||
虽然 [sudo 命令][8]被用来以超级用户权限执行命令,但是在某些情况下它也会执行失败,如下所示。
|
||||
|
||||
在这里,我想[清空一个大文件的内容][9],其文件名为 `uptime.log`,但是即便我是使用 sudo 命令也执行失败了。
|
||||
|
||||
```
|
||||
$ cat /dev/null >/var/log/uptime.log
|
||||
$ sudo cat /dev/null >/var/log/uptime.log
|
||||
```
|
||||
[
|
||||
![在 Linux 中清空大文件的内容](http://www.tecmint.com/wp-content/uploads/2016/12/Empty-Large-File-Content-in-Linux.png)
|
||||
][10]
|
||||
|
||||
*在 Linux 中清空大文件的内容*
|
||||
|
||||
遇到这种情况,你需要使用 `su` 命令切换到 `root` 用户,然后像下面这样去执行清空操作:
|
||||
|
||||
```
|
||||
$ su
|
||||
$ sudo cat /dev/null >/var/log/uptime.log
|
||||
$ cat /var/log/uptime.log
|
||||
```
|
||||
|
||||
[
|
||||
![切换到超级用户](http://www.tecmint.com/wp-content/uploads/2016/12/Switch-to-Super-User.png)
|
||||
][11]
|
||||
|
||||
*切换到超级用户*
|
||||
|
||||
尝试理解 [su 和 sudo 之间的区别][12],另外,通过阅读它们的手册页以了解更多的使用指南:
|
||||
|
||||
```
|
||||
$ man sudo
|
||||
$ man su
|
||||
```
|
||||
|
||||
### 4、 在 Linux 中结束一个进程
|
||||
|
||||
有些时候,当你想[使用 kill、killall、pkill 命令结束一个进程][13]时,它们有可能无法生效,你可能会看到该进程仍然还在系统上运行。
|
||||
|
||||
如果要强制结束一个进程,可以发送 `-KILL` 信号给该进程。
|
||||
|
||||
首先[获取指定进程 ID][14],然后像下面这样结束该进程:
|
||||
|
||||
```
|
||||
$ pidof vlc
|
||||
$ sudo kill -KILL 10279
|
||||
```
|
||||
[
|
||||
![在 Linux 中查找和结束进程](http://www.tecmint.com/wp-content/uploads/2016/12/Find-and-Kill-Process-in-Linux.png)
|
||||
][15]
|
||||
|
||||
*在 Linux 中查找和结束进程*
|
||||
|
||||
查看 [kill 命令][16]以获取更多的使用选项和信息。
|
||||
|
||||
### 5、 在 Linux 中永久删除文件
|
||||
|
||||
一般情况下,我们通过使用 `rm` 命令将文件从 Linux 系统中删除。然而,这些文件并没有被真正的删除,它们仍被存储在那里并隐藏在你的硬盘中,其他用户仍然可以[在 Linux 中恢复删除的文件][17]并查看。
|
||||
|
||||
为了防止这种情况发生,我们可以使用 `shred` 命令来覆写文件内容,并在覆盖完成后选择删除文件。
|
||||
|
||||
```
|
||||
$ shred -zvu tecmint.pdf
|
||||
```
|
||||
|
||||
上述命令中所使用的选项说明:
|
||||
|
||||
1. `-z` – 最后一次使用 0 进行覆盖以隐藏覆写动作。
|
||||
2. `-u` – 覆写后截断并移除文件。
|
||||
3. `-v` – 显示详细过程。
|
||||
|
||||
[
|
||||
![在 Linux 中永久删除文件](http://www.tecmint.com/wp-content/uploads/2016/12/Delete-File-Permanently-in-Linux.png)
|
||||
][18]
|
||||
|
||||
*在 Linux 中永久删除文件*
|
||||
|
||||
阅读 `shred` 手册以获取更多的使用信息。
|
||||
|
||||
```
|
||||
$ man shred
|
||||
```
|
||||
|
||||
### 6、 在 Linux 中重命名多个文件
|
||||
|
||||
你可以通过使用 `rename` 命令随时[在 Linux 中重命名多个文件][19]。
|
||||
|
||||
`rename` 命令会根据第一个参数中的规则重命名指定文件。
|
||||
|
||||
以下命令会将所有 `.pdf` 文件重命名为 `.doc` 文件,使用的规则为 `'s/\.pdf$/\.doc/'`:
|
||||
|
||||
```
|
||||
$ rename -v 's/\.pdf$/\.doc/' *.pdf
|
||||
```
|
||||
|
||||
[
|
||||
![在 Linux 中重命名多个文件](http://www.tecmint.com/wp-content/uploads/2016/12/Rename-Multiple-Files-in-Linux.png)
|
||||
][20]
|
||||
|
||||
*在 Linux 中重命名多个文件*
|
||||
|
||||
在接下来的例子中,我们将通过重命名所有匹配 `"*.bak"` 的文件来移除其拓展名,使用的规则是 `'s/\e.bak$//'`:
|
||||
|
||||
```
|
||||
$ rename -v 's/\e.bak$//' *.bak
|
||||
```
|
||||
|
||||
### 7、 在 Linux 中检查单词拼写
|
||||
|
||||
`look` 命令用于显示文件中以指定字符串为前缀的任意行,同时它也可以帮你检查命令行中给定单词的拼写。尽管它并不是那么有效和可靠,但它仍然算得上是其他强大的拼写检查工具的有用替代品。
|
||||
|
||||
```
|
||||
$ look linu
|
||||
$ look docum
|
||||
```
|
||||
|
||||
[
|
||||
![在 Linux 中检查单词拼写](http://www.tecmint.com/wp-content/uploads/2016/12/Spell-Checking-in-Linux.png)
|
||||
][21]
|
||||
|
||||
*在 Linux 中检查单词拼写*
|
||||
|
||||
### 8、 按关键字搜索手册页
|
||||
|
||||
`man` 命令用于显示命令的手册页,当使用 `-k` 选项时,它会将关键字 `printf`(或者如下命令中的关键字 `adjust`、`apache`、`php` )作为正则表达式,来搜索所有匹配该名称手册页,并显示其简介。
|
||||
|
||||
```
|
||||
$ man -k adjust
|
||||
$ man -k apache
|
||||
$ man -k php
|
||||
```
|
||||
|
||||
[
|
||||
![按关键字搜索手册页](http://www.tecmint.com/wp-content/uploads/2016/12/Show-Description-of-Keyword-in-Manual-Pages.png)
|
||||
][22]
|
||||
|
||||
*按关键字搜索手册页*
|
||||
|
||||
### 9、 在 Linux 中实时监测日志
|
||||
|
||||
`watch` 命令可以[定期执行另一个 Linux 命令][23]并全屏显示该命令的执行结果。当 `watch` 命令与 [tail 命令][24](用于查看文件结尾的 Linux 命令)配合使用时,可以监测到日志文件的日志记录情况。
|
||||
|
||||
在以下示例中,你将实时监测系统认证日志文件。打开两个终端窗口,在第一个窗口中实时监测该日志文件,如下:
|
||||
|
||||
```
|
||||
$ sudo watch tail /var/log/auth.log
|
||||
```
|
||||
|
||||
你也可以使用 [tail 命令][25](显示文件结尾的 Linux 命令)的 `-f` 选项实时监测文件变化。这样,我们就可以在日志文件中看到日志的生成情况。
|
||||
|
||||
```
|
||||
$ sudo tail -f /var/log/auth.log
|
||||
```
|
||||
|
||||
接着,在第二个终端窗口中运行以下命令,之后,你就可以在第一个终端窗口中观察日志文件内容:
|
||||
|
||||
```
|
||||
$ sudo mkdir -p /etc/test
|
||||
$ sudo rm -rf /etc/test
|
||||
```
|
||||
|
||||
### 10、 列出所有 Shell 内置命令
|
||||
|
||||
shell 内置命令是一个命令或者函数,从内部调用并直接在 shell 里执行,而不是从硬盘加载外部的可执行程序来执行。
|
||||
|
||||
列出所有 shell 内置命令及其语法,执行如下命令:
|
||||
|
||||
```
|
||||
$ help
|
||||
```
|
||||
|
||||
作为结束语,[命令行小技巧][26]不仅能派得上用场,而且让学习和使用 Linux 变得更加简单有趣,尤其是对新手来讲。
|
||||
|
||||
你也可以通过留言给我们分享其他在 Linux 中[有用有趣的命令行小技巧][27]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是一名 Linux 和 F.O.S.S 的爱好者,未来的 Linux 系统管理员、网站开发人员,目前是 TecMint 的写作者,他喜欢用电脑工作,并且乐忠于分享知识。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/linux-command-line-tricks-and-tips-worth-knowing/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[zhb127](https://github.com/zhb127)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/20-funny-commands-of-linux-or-linux-is-fun-in-terminal/
|
||||
[2]:http://www.tecmint.com/tag/linux-tricks/
|
||||
[3]:https://linux.cn/article-5485-1.html
|
||||
[4]:https://linux.cn/article-6314-1.html
|
||||
[5]:https://linux.cn/article-7418-1.html
|
||||
[6]:http://www.tecmint.com/tag/linux-ls-command/
|
||||
[7]:http://www.tecmint.com/check-linux-file-octal-permissions-using-stat-command/
|
||||
[8]:http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/
|
||||
[9]:https://linux.cn/article-8024-1.html
|
||||
[10]:http://www.tecmint.com/wp-content/uploads/2016/12/Empty-Large-File-Content-in-Linux.png
|
||||
[11]:http://www.tecmint.com/wp-content/uploads/2016/12/Switch-to-Super-User.png
|
||||
[12]:http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/
|
||||
[13]:http://www.tecmint.com/how-to-kill-a-process-in-linux/
|
||||
[14]:http://www.tecmint.com/find-process-name-pid-number-linux/
|
||||
[15]:http://www.tecmint.com/wp-content/uploads/2016/12/Find-and-Kill-Process-in-Linux.png
|
||||
[16]:http://www.tecmint.com/how-to-kill-a-process-in-linux/
|
||||
[17]:https://linux.cn/article-7974-1.html
|
||||
[18]:http://www.tecmint.com/wp-content/uploads/2016/12/Delete-File-Permanently-in-Linux.png
|
||||
[19]:http://www.tecmint.com/rename-multiple-files-in-linux/
|
||||
[20]:http://www.tecmint.com/wp-content/uploads/2016/12/Rename-Multiple-Files-in-Linux.png
|
||||
[21]:http://www.tecmint.com/wp-content/uploads/2016/12/Spell-Checking-in-Linux.png
|
||||
[22]:http://www.tecmint.com/wp-content/uploads/2016/12/Show-Description-of-Keyword-in-Manual-Pages.png
|
||||
[23]:http://www.tecmint.com/run-repeat-linux-command-every-x-seconds/
|
||||
[24]:http://www.tecmint.com/view-contents-of-file-in-linux/
|
||||
[25]:http://www.tecmint.com/view-contents-of-file-in-linux/
|
||||
[26]:http://www.tecmint.com/tag/linux-tricks/
|
||||
[27]:https://linux.cn/article-5485-1.html
|
162
published/201701/20161225 Minecraft Server on Linux.md
Normal file
162
published/201701/20161225 Minecraft Server on Linux.md
Normal file
@ -0,0 +1,162 @@
|
||||
Linux 上搭建 Minecraft 服务器
|
||||
===============
|
||||
|
||||
![Title.jpg](https://www.linuxforum.com/attachments/title-jpg.89/)
|
||||
|
||||
“我的世界(Minecraft)”是一个人们可以在各种游戏主机和计算机上玩的主流游戏。 截止至 2016 年 6 月,在各种平台上已经售出了超过十亿六千万份。因其受欢迎,你可能想在家里举办一个“我的世界”派对,那么你就需要安装一个 “我的世界” 服务器,让所有的玩家连接到同一个世界中一起玩。
|
||||
|
||||
### 系统要求
|
||||
|
||||
要开始的话,你需要一个有相当数量内存的 Linux 操作系统。你要在服务器上容纳的玩家越多,你就需要越多的内存。硬盘空间倒不是需求很大,只要足够去安装 Java 以及“我的世界”服务器 Java 文件就行。Minecraft 服务器需要有一个稳定的网络连接,不管是有线还是无线网络。
|
||||
|
||||
让我们看看 “我的世界”服务器最低要求:
|
||||
|
||||
- **CPU:**双核或更好。
|
||||
- **内存:** 2 GB (20-40 用户量),3 GB(30-60 用户量),8 GB(60+ 用户量)。
|
||||
- **系统:** 不需要图形化用户接口,可以留出更多的空闲资源。
|
||||
|
||||
**备注:** 这是“我的世界” 服务端程序的需求,而不是一个完整的操作系统的需求。如果可以给我的世界服务器分配更多的资源,它将运行得更好。
|
||||
|
||||
###安装 Java
|
||||
|
||||
如果你用 Linux 操作系统运行它的话,你需要安装最新版本的 Java 环境。
|
||||
|
||||
为了验证你的 Java 版本,位于终端输入以下命令:`java -version`。结果应该是:
|
||||
|
||||
```
|
||||
java version "1.8.0_101"
|
||||
|
||||
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
|
||||
|
||||
Java HotSpot(TM) Client VM (build 25.101-b13, mixed mode)
|
||||
```
|
||||
|
||||
如果你当前的 Java 版本不是 1.8 或者更高,则通过在 Ubuntu 系统的终端下执行以下操作来安装 Java 版本 8:
|
||||
|
||||
```
|
||||
sudo add-apt-repository ppa:webupd8team/java
|
||||
sudo apt-get update
|
||||
sudo apt-get install oracle-java8-installer
|
||||
```
|
||||
|
||||
**注意:**如果 `add-apt-repository` 命令无法找到,运行 `sudo apt-get install software-properties-common` 来安装。 您还可以将第三个命令中更改为 `oracle-java9-installer` 来安装最新的 java 版本。
|
||||
|
||||
对于 Redhat 系统(如 CentOS),请使用以下命令:
|
||||
|
||||
```
|
||||
sudo yum install java-1.8.0-openjdk
|
||||
```
|
||||
|
||||
安装后,核实键入版本命令 `java-version` ,并且核实输出。这样你就有了一个适当的 Java 版本,你可以继续进行接下来的安装。
|
||||
|
||||
### “我的世界”服务器版本下载
|
||||
|
||||
接下来做的事就是去检查用户将运行的“我的世界”的版本。图 1 显示了一个正在运行的 ”我的世界“ ,注意左下角的版本号。
|
||||
|
||||
![Figure 01.jpg](https://www.linuxforum.com/attachments/figure-01-jpg.85/)
|
||||
|
||||
*图 1*
|
||||
|
||||
请记住“我的世界”客户端版本号。每个客户端应该是相同的版本才行。
|
||||
|
||||
您接下来要做的是下载客户端所需要的“我的世界”的服务器版本。为了下载该版本你需要知道它的位置。得到所需的文件的命令是:
|
||||
|
||||
```
|
||||
sudo wget https://s3.amazonaws.com/Minecraft.Download/versions/[version]/minecraft_server.[version].jar
|
||||
```
|
||||
|
||||
在 图1 看到,版本号是 1.10.2。那么这个命令就该变成:
|
||||
|
||||
```
|
||||
sudo wget https://s3.amazonaws.com/Minecraft.Download/versions/1.10.2/minecraft_server.1.10.2.jar
|
||||
```
|
||||
|
||||
|
||||
当你下载好文件,会保存到你当前目录下。使用命令 `pwd` 确定当前位置。
|
||||
|
||||
一旦你有了该文件,知道它所保存的文件夹就可以继续了。
|
||||
|
||||
### 服务器信息
|
||||
|
||||
在启动“我的世界”服务器之前,您必须知道当前系统上能被你使用的可用内存大小。 当启动“我的世界”服务器时,你将需要指定起始内存量和当更多玩家加入时最大分配的内存量。 再次提示,重要的是要有足够的内存。 如果可以,使用最小化安装操作系统来留出更多的内存,例如最小化安装的 Ubuntu。
|
||||
|
||||
一旦你有了所需的“我的世界”服务器文件,就可以确定分配给“我的世界”的内存数量。 要确定可用内存,打开一个终端并键入以下命令 ,示例输出如图 2 所示:
|
||||
|
||||
```
|
||||
free -h
|
||||
```
|
||||
|
||||
![Figure 02.jpg](https://camo.githubusercontent.com/686cb2c9421f276e1cab0b08b713f636ed3ca614/68747470733a2f2f7777772e6c696e7578666f72756d2e636f6d2f6174746163686d656e74732f6669677572652d30322d6a70672e38362f)
|
||||
|
||||
*图 2*
|
||||
|
||||
如图 2 所示,在这个低端系统上你可以看到那只有 684 MB 空闲内存。这不是一个可以用于搭建一个 “我的世界” 服务器的系统。在另一个服务器上我有 2.8 GB 内存可供给“我的世界” 使用。
|
||||
|
||||
在我们启动服务器之前,我们需要找到服务器的 IP 地址。 为此,请运行命令 `ifconfig`。 如图 3 所示,应该列出了网络连接,显示 `Internet Address` 或 `inet addr`,这里是 `192.168.0.2`。 在我的服务器系统上,它列出的地址是 `192.168.0.14`,这个地址是客户端系统将要使用的地址。
|
||||
|
||||
![Figure 03.jpg](https://camo.githubusercontent.com/62dc2bfe97f8df7895d606c594d74f27b4881ee4/68747470733a2f2f7777772e6c696e7578666f72756d2e636f6d2f6174746163686d656e74732f6669677572652d30332d6a70672e38372f)
|
||||
|
||||
*图 3*
|
||||
|
||||
### 启动“我的世界”服务器
|
||||
|
||||
下一步才是真正的启动“我的世界”服务器。在我们实际开始前,会涉及到几个选项。当启动“我的世界”服务器时,你需要指定用多少内存来初始化“我是世界”。 您还将指定使用的最大内存量。
|
||||
|
||||
如果我的系统有 3.7GB 闲置内存,我知道会有不到 40 位玩家,于是我只需要划出 2GB。当然,我可以增加些以允许用户增长。如果需要的话,我还可以留一点内存给系统运行。我将最小值设置为 2 GB,最大值设置为 3 GB。 由于最大值设置为 3 GB,如果需要的话,还可以至少留给系统 700 MB 内存,但这只有在“我的世界”服务器使用超过最初分配的2 GB 时才会发生。
|
||||
|
||||
启动服务器的命令行是:
|
||||
|
||||
```
|
||||
sudo java -Xms# -Xmx# -jar [path]/minecraft_server.[version].jar nogui
|
||||
```
|
||||
|
||||
现在解释一下命令结构:
|
||||
|
||||
- -Xms# - 初始启动分配的内存(`-Xms2048m`)
|
||||
- -Xmx# - 最大分配的内存(`-Xmx3096m`)
|
||||
- [path] – “我的世界” 服务器文件路径( `/home/tux/MCS/`)
|
||||
- [version] – 下载的“我的世界” 服务器的版本(`1.10.2`)
|
||||
- nogui – 用于以基于文本的界面来显示,可以减少内存使用。如果你使用图形化界面,那么移除 `nogui` 选项。
|
||||
|
||||
一个使用 2GB 内存以及最大 3GB、位置为 `/home/tux/MCS`、 版本号为 `1.10.2` 的系统的完整命令实例是:
|
||||
|
||||
```
|
||||
sudo java -Xms2048m -Xmx3096m -jar /home/tux/MCS/minecraft_server.1.10.2.jar nogui
|
||||
```
|
||||
|
||||
**注意:** 这里内存容量的大小是兆字节单位。容量要乘以 1024。举个例子,2GB 的内存使 2 与 1024 相乘,容量为 2048。但别忘小写字母 `m` 是特指兆字节。你可以简单地使用特指的 `2g` 和 `3g` 来表示 2GB 和 3GB。
|
||||
|
||||
在你首次运行服务器时会发成一些错误。开始之前,它表明需要同意 “最终用户许可协议 EULA”。
|
||||
|
||||
要同意 “最终用户许可协议 EULA”,你需要编辑与“我的世界”服务器 JAR 文件同一文件夹下的的 `eula.txt` 文件。
|
||||
|
||||
使用一个类似 `nano` 的文件编辑器打开文件 `eula.txt` 文件。确定你进行这步时使用的是 root 权限。将行 `eula = false` 更改为 `eula = true`,并保存文件。
|
||||
|
||||
现在,再次输入上述命令以启动服务器。 应该滚过满屏幕信息,然后一个状态行将显示它的创建过程。 当其这个初始世界创建好之后,状态行将显示 100%。 有关系统时间更改的任何错误消息是正常的,因此忽略它们。
|
||||
|
||||
此时,你可以打开客户端程序并且看到如上图 1 的界面。点击“Multiplayer”按钮。在下一屏幕,如图 4,选择 “Direct Connect”,这将提示您输入服务器地址,因此键入“我的世界”服务器的 IP 地址。你现在应该已经连接到游戏了。
|
||||
|
||||
|
||||
![Figure 04.jpg](https://camo.githubusercontent.com/6893151530092ac59b7b04d17ca5bc07d9bfc9b4/68747470733a2f2f7777772e6c696e7578666f72756d2e636f6d2f6174746163686d656e74732f6669677572652d30342d6a70672e38382f)
|
||||
|
||||
*图 4*
|
||||
|
||||
### 连接的某些麻烦
|
||||
|
||||
如果一些客户端无法连接到服务器,那么你需要按下 `CTRL+Z` 退出 Java 程序。打开文件 `server.propertices`, 使用一个 nano 之类的编辑器进行编辑。记住要 root 权限。编辑 `online-mode` 行,它应该设置为 `true` ,修改为 `false` 并保存。重启服务器并打开“我的世界”服务器。使用客户端重新连接到服务器,现在应该一切都好了。
|
||||
|
||||
建设快乐!
|
||||
|
||||
------
|
||||
|
||||
via: https://www.linuxforum.com/threads/minecraft-server-on-linux.3202/
|
||||
|
||||
作者:[Jarret][a]
|
||||
译者:[erlinux](http://www.itxdm.me)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.linuxforum.com/members/jarret.268/
|
||||
[1]: https://s3.amazonaws.com/Minecraft.Download/versions/%5Bversion%5D/minecraft_server.%5Bversion%5D.jar
|
||||
[2]: https://s3.amazonaws.com/Minecraft.Download/versions/%5Bversion%5D/minecraft_server.%5Bversion%5D.jar
|
@ -0,0 +1,135 @@
|
||||
Linux 系统管理员 2017 年的 10 个新决心
|
||||
============================================================
|
||||
|
||||
当我们告别 2016 时,也到时间定下我们的 **新年决心** 了。不管你身为 Linux 系统管理员的经验水平如何,我们认为,制定接下来 12 个月的成长目标是很值得的。
|
||||
|
||||
如果你还没什么想法,我们将会在这篇文章分享 10 个简单的专业提升决心,你可以为 2017 年考虑一下。
|
||||
|
||||
### 1、 决定更自动化
|
||||
|
||||
你没必要忙得像头无头苍蝇,每天忙于解决可预见的问题。如果你发现自己每天都花费时间在执行重复的任务,你有必要现在就停下来。
|
||||
|
||||
在了解了所有[基于 Linux 而且开源的工具][4]后,你可以尽可能地[自动化你的 Linux 任务][5]来给自己一些休闲的时间。
|
||||
|
||||
你会发现,接下来的几个决心会帮你在工作上朝着这个目标前进。所以继续看下去吧。
|
||||
|
||||
另外,帮自己一个忙,花费几分钟来浏览我们[免费的电子书][6]部分吧。
|
||||
|
||||
你将有机会下载与[Bash shell 脚本编程][7]相关的书籍来提升你的技能。开心地自动化!
|
||||
|
||||
### 2、 学习一门新的脚本语言
|
||||
|
||||
虽然每一个系统管理员应该熟练地使用 Bash 写脚本,但考虑一下其它更现代化、健壮性更强的工具也是很重要的,例如 Python。
|
||||
|
||||
不要只是相信我们说的话 —— 看看不久前我们发布的[两篇关于 Python 的系列文章][9]。你将会意识到,与其它语言相比,Python 带来了面向对象编程的力量,使您写出更短、健壮性更强的脚本。
|
||||
|
||||
### 3、 学习一门新的编程语言
|
||||
|
||||
除了学习一门新的脚本语言,(你也可以)决定花费点时间来开始学习或者提升你的编程技能。不确定从何处开始?今年的 [Stackoverflow 开发者调查][10]表明 Javascript 连续第三年引领最流行语言的榜单。
|
||||
|
||||
其他经典例如 Java 和 C 也值得考虑。来看我们 [2016 年最好的编程课程][11]。
|
||||
|
||||
### 4、 注册一个 Github 账户并且定期更新
|
||||
|
||||
特别是如果你是一个编程新手,你应该考虑一下在 Github 上展示你的成果。通过允许别人去复刻你的脚本或者程序,你就能提高知识水平,并通过别人的帮助创造出更复杂的软件。
|
||||
|
||||
在[《如何安装和注册 Github 帐号》][12]一文中了解更多。
|
||||
|
||||
### 5、 向一个开源项目做贡献
|
||||
|
||||
在 Github 上向一个开源项目做贡献,这是另一个学习或者提高一门新脚本语言或者编程语言能力的好办法。
|
||||
|
||||
如果这吸引到了你的兴趣,点击 [Explore Github][13] 页面。这里你能按热度或者编程语言浏览仓库,你能在这里面找到一些有趣的事情来做。
|
||||
|
||||
在此基础上,你将因回馈社区而获得满足感。
|
||||
|
||||
### 6、 每月尝试一个新的发行版
|
||||
|
||||
经常会有新的发行版或者分支出现,你有不同的选项以供选择。谁知道你梦想中的发行版是否就在近前,而你还没发现它?每个月去一次 **Distrowatch** 然后选择一个新的发行版。
|
||||
|
||||
也别忘了[订阅 Techmint][14] 来获取新发行版的消息。
|
||||
|
||||
如果你想要尝试一个新的发行版,希望我们的评论能帮你做出决定。也可以点击我们这里关于最好的 Linux 发行版的文章:
|
||||
|
||||
- [2016年最好的 5 个注重安全的 Linux 发行版][1]
|
||||
- [2016年最值得期待的 Linux 发行版][2]
|
||||
- [2015年最流行的 10个 Linux 发行版][3]
|
||||
|
||||
### 7、 参加一个 Linux 或者开源会议。
|
||||
|
||||
如果你住在由 Linux 基金会赞助的会议举办地附近,我强烈建议你去参加会议。
|
||||
|
||||
这不仅将会给你一个提高 Linux 知识的机会,而且将是个见见其他开源专家的机会。
|
||||
|
||||
### 8、 从 Linux 基金会的免费或付费课程中学习
|
||||
|
||||
Linux 基金会分别通过 **edX.org** 和他们自己的门户,不断地提供免费或付费课程。
|
||||
|
||||
免费课程的话题包括(但不仅限于)Linux 介绍、云基础设施技术介绍和 OpenStack 介绍。
|
||||
|
||||
另一方面,付费课程包括 [LFCS 认证][16] 和 [LFCE 认证][17] 考试的准备,给开发者的 Linux ,内核内部构件,Linux 安全,性能试验,高可用性及其他。
|
||||
|
||||
另外,他们对企业课程有折扣,所以尝试去说服你上司来为你和你同事的训练付费。还有,也会提供周期性的免费在线研讨会,所以别忘了订阅他们的 newsletters!
|
||||
|
||||
你也可以考虑下看看我们最棒的[在线 Linux 训练课程][18]。
|
||||
|
||||
### 9、 每周在 Linux 论坛上回答特定数量的问题
|
||||
|
||||
另一个回馈社区的好方法是帮助那些刚开始使用 Linux 的人。你将会发现网上的 Linux 论坛上有许多人正在寻找着答复。
|
||||
|
||||
牢记你曾经也是像他们那样是个新手,试着换位思考。
|
||||
|
||||
### 10、 教一个孩子或少年使用 Linux
|
||||
|
||||
如果我能回到 20 年前,我希望我能有台电脑,有个能[在青年时学习 Linux ][19]的机会。
|
||||
|
||||
我也希望我能比当年还早很多地开始编程。毫无疑问,这样事情就会简单许多。我认为给孩子和青年教授至少是基础的 Linux 和编程技巧(我对我的孩子这样做)是个重要的尝试。
|
||||
|
||||
教育成长中的一代如何有效地使用开源技术将会给他们选择的自由,而他们会因此永远感激你。
|
||||
|
||||
##### 总结
|
||||
|
||||
在这篇文章里我们分享了 10 个适合系统管理员的可能新年决心。[Tecmint.com][20] 祝你在朝着目标的工作顺顺利利,希望你能在 2017 年成为我们网站的常客。
|
||||
|
||||
如果你有关于这篇文章的问题或者评论,请不要犹豫使用下面的表格提交。我们期待着收到您的信息。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/d9d14c5b51331864398e6288cb0c2091?s=128&d=blank&r=g)
|
||||
|
||||
Gabriel Cánepa 是个 GNU/Linux 系统管理员和网页开发者,他来自阿根廷圣路易斯的 Villa Mercedes 。他供职于全球领先的消费品公司,享受在日常工作的方方面面使用 FOSS(自由及开源软件) 工具来提高生产效率。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/linux-system-administrators-new-years-resolutions-ideas/
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[ypingcn](https://github.com/ypingcn)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: http://www.tecmint.com/author/gacanepa/
|
||||
[1]: http://www.tecmint.com/best-security-centric-linux-distributions-of-2016/
|
||||
[2]: http://www.tecmint.com/top-linux-distributions-to-look-forward-in-2016/
|
||||
[3]: http://www.tecmint.com/10-top-most-popular-linux-distributions-of-2015/
|
||||
[4]: http://www.tecmint.com/category/top-tools/
|
||||
[5]: http://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/
|
||||
[6]: http://tecmint.tradepub.com/category/information-technology-servers-and-linux-server-os/806/
|
||||
[7]: http://tecmint.tradepub.com/free/w_syst05/?p=w_syst05
|
||||
[8]: http://www.tecmint.com/category/python/
|
||||
[9]: https://linux.cn/article-7693-1.html
|
||||
[10]: http://stackoverflow.com/research/developer-survey-2016#technology
|
||||
[11]: https://deals.tecmint.com/collections/best-of-bundles-2016
|
||||
[12]: http://www.tecmint.com/install-git-centos-fedora-redhat/
|
||||
[13]: https://help.github.com/articles/where-can-i-find-open-source-projects-to-work-on/
|
||||
[14]: http://subscribe.tecmint.com/newsletter
|
||||
[15]: http://events.linuxfoundation.org/
|
||||
[16]: http://www.tecmint.com/sed-command-to-create-edit-and-manipulate-files-in-linux/
|
||||
[17]: http://www.tecmint.com/installing-network-services-and-configuring-services-at-system-boot/
|
||||
[18]: http://www.tecmint.com/linux-online-training-courses/
|
||||
[19]: http://www.tecmint.com/free-online-linux-learning-guide-for-beginners/
|
||||
[20]: http://tecmint.com/
|
@ -0,0 +1,212 @@
|
||||
如何在 Docker 中设置 Go 并部署应用
|
||||
============================================================
|
||||
|
||||
嗨,在本教程中,我们将学习如何使用 docker 部署 golang web 应用程序。 你可能已经知道,由于 golang 的高性能和可靠性,docker 是完全是用 golang 写的。在我们详细介绍之前,请确保你已经安装了 docker 以及 golang 并对它们有基本了解。
|
||||
|
||||
### 关于 docker
|
||||
|
||||
Docker 是一个开源程序,它可以将应用及其完整的依赖包捆绑到一起,并打包为容器,与宿主机共享相同的 Linux 内核。另一方面,像 VMware 这样的基于 hypervisor 的虚拟化操作系统容器提供了高级别的隔离和安全性,这是由于客户机和主机之间的通信是通过 hypervisor 来实现的,它们不共享内核空间。但是硬件仿真也导致了性能的开销,所以容器虚拟化诞生了,以提供一个轻量级的虚拟环境,它将一组进程和资源与主机以及其它容器分组及隔离,因此,容器内部的进程无法看到容器外部的进程或资源。
|
||||
|
||||
### 用 Go 语言创建一个 “Hello World” web 应用
|
||||
|
||||
首先我们为 Go 应用创建一个目录,它会在浏览器中显示 “Hello World”。创建一个 `web-app` 目录并使它成为当前目录。进入 `web-app` 应用目录并编辑一个名为 `main.go` 的文件。
|
||||
|
||||
```
|
||||
root@demohost:~# mkdir web-app
|
||||
root@demohost:~# cd web-app/
|
||||
root@demohost:~/web-app# vim.tiny main.go
|
||||
|
||||
package main
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "Hello %s", r.URL.Path[1:])
|
||||
}
|
||||
|
||||
func main() {
|
||||
http.HandleFunc("/World", handler)
|
||||
http.ListenAndServe(":8080", nil)
|
||||
}
|
||||
```
|
||||
|
||||
使用下面的命令运行上面的 “Hello World” Go 程序。在浏览器中输入 `http://127.0.0.1:8080/World` 测试,你会在浏览器中看到 “Hello World”。
|
||||
|
||||
```
|
||||
root@demohost:~/web-app# PORT=8080 go run main.go
|
||||
```
|
||||
|
||||
下一步是将上面的应用在 docker 中容器化。因此我们会创建一个 dockerfile 文件,它会告诉 docker 如何容器化我们的 web 应用。
|
||||
|
||||
```
|
||||
root@demohost:~/web-app# vim.tiny Dockerfile
|
||||
|
||||
# 得到最新的 golang docker 镜像
|
||||
FROM golang:latest
|
||||
|
||||
# 在容器内部创建一个目录来存储我们的 web 应用,接着使它成为工作目录。
|
||||
RUN mkdir -p /go/src/web-app
|
||||
WORKDIR /go/src/web-app
|
||||
|
||||
# 复制 web-app 目录到容器中
|
||||
COPY . /go/src/web-app
|
||||
|
||||
# 下载并安装第三方依赖到容器中
|
||||
RUN go-wrapper download
|
||||
RUN go-wrapper install
|
||||
|
||||
# 设置 PORT 环境变量
|
||||
ENV PORT 8080
|
||||
|
||||
# 给主机暴露 8080 端口,这样外部网络可以访问你的应用
|
||||
EXPOSE 8080
|
||||
|
||||
# 告诉 Docker 启动容器运行的命令
|
||||
CMD ["go-wrapper", "run"]
|
||||
```
|
||||
|
||||
### 构建/运行容器
|
||||
|
||||
使用下面的命令构建你的 Go web-app,你会在成功构建后获得确认。
|
||||
|
||||
```
|
||||
root@demohost:~/web-app# docker build --rm -t web-app .
|
||||
Sending build context to Docker daemon 3.584 kB
|
||||
Step 1 : FROM golang:latest
|
||||
latest: Pulling from library/golang
|
||||
386a066cd84a: Already exists
|
||||
75ea84187083: Pull complete
|
||||
88b459c9f665: Pull complete
|
||||
a31e17eb9485: Pull complete
|
||||
1b272d7ab8a4: Pull complete
|
||||
eca636a985c1: Pull complete
|
||||
08158782d330: Pull complete
|
||||
Digest: sha256:02718aef869a8b00d4a36883c82782b47fc01e774d0ac1afd434934d8ccfee8c
|
||||
Status: Downloaded newer image for golang:latest
|
||||
---> 9752d71739d2
|
||||
Step 2 : RUN mkdir -p /go/src/web-app
|
||||
---> Running in 9aef92fff9e8
|
||||
---> 49936ff4f50c
|
||||
Removing intermediate container 9aef92fff9e8
|
||||
Step 3 : WORKDIR /go/src/web-app
|
||||
---> Running in 58440a93534c
|
||||
---> 0703574296dd
|
||||
Removing intermediate container 58440a93534c
|
||||
Step 4 : COPY . /go/src/web-app
|
||||
---> 82be55bc8e9f
|
||||
Removing intermediate container cae309ac7757
|
||||
Step 5 : RUN go-wrapper download
|
||||
---> Running in 6168e4e96ab1
|
||||
+ exec go get -v -d
|
||||
---> 59664b190fee
|
||||
Removing intermediate container 6168e4e96ab1
|
||||
Step 6 : RUN go-wrapper install
|
||||
---> Running in e56f093b6f03
|
||||
+ exec go install -v
|
||||
web-app
|
||||
---> 584cd410fdcd
|
||||
Removing intermediate container e56f093b6f03
|
||||
Step 7 : ENV PORT 8080
|
||||
---> Running in 298e2a415819
|
||||
---> c87fd2b43977
|
||||
Removing intermediate container 298e2a415819
|
||||
Step 8 : EXPOSE 8080
|
||||
---> Running in 4f639a3790a7
|
||||
---> 291167229d6f
|
||||
Removing intermediate container 4f639a3790a7
|
||||
Step 9 : CMD go-wrapper run
|
||||
---> Running in 6cb6bc28e406
|
||||
---> b32ca91bdfe0
|
||||
Removing intermediate container 6cb6bc28e406
|
||||
Successfully built b32ca91bdfe0
|
||||
```
|
||||
|
||||
现在可以运行我们的 web-app 了,可以执行下面的命令。
|
||||
|
||||
```
|
||||
root@demohost:~/web-app# docker run -p 8080:8080 --name="test" -d web-app
|
||||
7644606b9af28a3ef1befd926f216f3058f500ffad44522c1d4756c576cfa85b
|
||||
```
|
||||
|
||||
进入 `http://localhost:8080/World` 浏览你的 web 应用。你已经成功容器化了一个可重复的/确定性的 Go web 应用。使用下面的命令来启动、停止并检查容器的状态。
|
||||
|
||||
```
|
||||
### 列出所有容器
|
||||
root@demohost:~/ docker ps -a
|
||||
|
||||
### 使用 id 启动容器
|
||||
root@demohost:~/ docker start CONTAINER_ID_OF_WEB_APP
|
||||
|
||||
### 使用 id 停止容器
|
||||
root@demohost:~/ docker stop CONTAINER_ID_OF_WEB_APP
|
||||
```
|
||||
|
||||
### 重新构建镜像
|
||||
|
||||
假设你正在开发 web 应用程序并在更改代码。现在要在更新代码后查看结果,你需要重新生成 docker 镜像、停止旧镜像并运行新镜像,并且每次更改代码时都要这样做。为了使这个过程自动化,我们将使用 docker 卷在主机和容器之间共享一个目录。这意味着你不必为在容器内进行更改而重新构建镜像。容器如何检测你是否对 web 程序的源码进行了更改?答案是有一个名为 “Gin” 的好工具 [https://github.com/codegangsta/gin][1],它能检测是否对源码进行了任何更改,然后重建镜像/二进制文件并在容器内运行更新过代码的进程。
|
||||
|
||||
要使这个过程自动化,我们将编辑 Dockerfile 并安装 Gin 将其作为入口命令来执行。我们将开放 `3030` 端口(Gin 代理),而不是 `8080`。 Gin 代理将转发流量到 web 程序的 `8080` 端口。
|
||||
|
||||
```
|
||||
root@demohost:~/web-app# vim.tiny Dockerfile
|
||||
|
||||
# 得到最新的 golang docker 镜像
|
||||
FROM golang:latest
|
||||
|
||||
# 在容器内部创建一个目录来存储我们的 web 应用,接着使它称为工作目录。
|
||||
RUN mkdir -p /go/src/web-app
|
||||
WORKDIR /go/src/web-app
|
||||
|
||||
# 复制 web 程序到容器中
|
||||
COPY . /go/src/web-app
|
||||
|
||||
# 下载并安装第三方依赖到容器中
|
||||
RUN go get github.com/codegangsta/gin
|
||||
RUN go-wrapper download
|
||||
RUN go-wrapper install
|
||||
|
||||
# 设置 PORT 环境变量
|
||||
ENV PORT 8080
|
||||
|
||||
# 给主机暴露 8080 端口,这样外部网络可以访问你的应用
|
||||
EXPOSE 3030
|
||||
|
||||
# 启动容器时运行 Gin
|
||||
CMD gin run
|
||||
|
||||
# 告诉 Docker 启动容器运行的命令
|
||||
CMD ["go-wrapper", "run"]
|
||||
```
|
||||
|
||||
现在构建镜像并启动容器:
|
||||
|
||||
```
|
||||
root@demohost:~/web-app# docker build --rm -t web-app .
|
||||
```
|
||||
|
||||
我们会在当前 web 程序的根目录下运行 docker,并通过暴露的 `3030` 端口链接 CWD (当前工作目录)到容器中的应用目录下。
|
||||
|
||||
```
|
||||
root@demohost:~/web-app# docker run -p 3030:3030 -v `pwd`:/go/src/web-app --name="test" -d web-app
|
||||
````
|
||||
|
||||
打开 `http://localhost:3030/World`, 你就能看到你的 web 程序了。现在如果你改变了任何代码,会在浏览器刷新后反映在你的浏览器中。
|
||||
|
||||
### 总结
|
||||
|
||||
就是这样,我们的 Go web 应用已经运行在 Ubuntu 16.04 Docker 容器中运行了!你可以通过使用 Go 框架来快速开发 API、网络应用和后端服务,从而扩展当前的网络应用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://linoxide.com/containers/setup-go-docker-deploy-application/
|
||||
|
||||
作者:[Dwijadas Dey][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://linoxide.com/author/dwijadasd/
|
||||
[1]:https://github.com/codegangsta/gin
|
83
published/201701/20161230 Hot programming trends in 2016.md
Normal file
83
published/201701/20161230 Hot programming trends in 2016.md
Normal file
@ -0,0 +1,83 @@
|
||||
2016 年编程语言发展趋势
|
||||
============================================================
|
||||
|
||||
> 回顾年度最热门的 AI 项目和容器的编程语言、新出现的编程语言,和更多编程趋势。
|
||||
|
||||
![Top programming trends in 2016](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/climb-top-bridge-yearbook_red.png?itok=YITYmpoR "Top programming trends in 2016")
|
||||
|
||||
图片提供:[Museum of Photographic Arts][6]。由 Opensource.com 修改。 CC BY-SA 4.0
|
||||
|
||||
技术在不断前进 - 可能不总是向前,但总是在变动。但即使对于那些关注发展趋势及其对程序员的影响的人来说,确切地了解技术的方向也是一个挑战。我们总是在每年秋季才能够清晰地看出当年开源编程趋势,那时我与我的同事,Kelsey Hightower 和 Scott Hanselman,以及我们非常棒的编程委员会,正在筹备来年的 [OSCON] [7](O'Reilly 开源大会)。我们获得的建议和对特定主题的关注数量是反映开源世界热门趋势的良好指标。以下是我们在 2016 年看到的顶级编程趋势的概述。
|
||||
|
||||
### 编程语言驱动 AI
|
||||
|
||||
走出 20 世纪 90 年代的人工智能冬季,人工智能随着它所依赖的计算能力的提升再次出现,它影响着我们如何构建软件。机器学习、深度学习、自然语言处理和自动语音识别覆盖了世界各地 - 从 GitHub 的项目和工作岗位,到新公司成立背后的原因,以及清除我们杂乱的台面(Hey, Alexa!)。(LCTT 译注:Alexa 是预装在亚马逊 Echo 内的个人虚拟助手,可以接收及相应语音命令,可被看成是亚马逊版的 Siri 语音助手。用户只需要说一声“Alexa”,就可以创建各种任务,还可以和各种智能家居设备进行交互。) 是的,即使像 OSCON 这样的会议都处处提及 <ruby>“万物皆智能”<rt>all things AI</rt></ruby> 。虽然计算能力的提升已经铺平了道路,所有关于 all things AI 的开源已经引起了行业广泛开放的创新和竞争。谷歌的 [TensorFlow][8]、[OpenAI][9] 和 [Apache Spark][10] 使用强大框架成为行业领导者,但也有较小的参与者,如 [Nervana][11] 的 [Neon][12] 和 [Theano][13]。
|
||||
|
||||
AI 的兴起已经影响到了软件开发者的前景?没错,现在是了解 Python 的好时机 - 它给数据工程师和科学家带来的敏捷性和流行性使它成为最流行的 AI 编程语言,其次是 R、Java 和 Scala。
|
||||
|
||||
### 容器和 Go 的结合就像花生、黄油和果冻
|
||||
|
||||
(花生、黄油和果冻 —— LCTT译注:最佳组合)
|
||||
|
||||
[Go 1.0 发布][14]于 2012 年 3 月。紧接着 [Docker][15] 在一年后发布,[Kubernetes][16] 在另外一年后发布。总之,Go 并不是如我们所知的那样专为基础设施的未来而设计的,但 Go 似乎是为了填充编程世界的一个主要的空洞而出现。对于一个高度联网的世界,一个必须拥有一流并发性的世界而言,Go 是以 Java 或 C++ 永远不会有的方式专门写的。如果你在做运维或者类似的事,你应该至少稍微了解下 Go ,因为它正在发展中,它将会被使用多年,并成为许多程序的骨干。
|
||||
|
||||
### Swift 超越了 Apple 的生态系统
|
||||
|
||||
Swift 是 [Apple 在 2015 年启动该编程语言不久之后就开源的][17]。Swift 已经成为 iOS 和 Mac OS X 开发人员的热门话题。这种语言很容易理解,因此很快流行起来,并且它比它要取代的语言 - Objective-C 和 C++ 赢得了一个[更安全的声誉][18]。在 [JavaScript 框架][19]和其他新语言的世界中,Swift 是否成功仍有待观察,但如果它能继续获得苹果忠实用户的欢迎,Swift 将有机会成为伟大的网络世界中最有望成功的竞争者和超越者。
|
||||
|
||||
### Java 8 vs 使用 JVM 的函数式语言
|
||||
|
||||
Java 8 的函数式能力(即引入 Lambdas )的出现使得 JVM 语言(如 Scala 和 Clojure)上榜单了。最近,很大程度上由于 Apache Spark 的增长使得 Scala 有一点小爆发。现在,因为新老开发人员都在关注 Java 8 所带来的东西,至少目前,Scala 和 Clojure 似乎被搁置了。Java 现在能够解决并发和大数据相关的事,而那些专门为满足此方面要求而构建的其他编程语言已经做了多年。在 2017 年,OSCON 几乎没有 Scala 和 Clojure 的提案,不是因为这样计划的,而是那些提交提案的发言者似乎没有什么兴趣。
|
||||
|
||||
### 新兴语言
|
||||
|
||||
和往常一样,世上总是在不停出现新兴语言,目的是比之前的语言做得更好,可以响应从前的语言出现时没有的需求,或者开始只是疯狂思想,最终却改变了我们对编程的看法。今年有五种语言即将进入大时代:Rust、Elixir、Elm、Kotlin 和 Perl 6。
|
||||
|
||||
这 5 个热门会给行业带来什么?
|
||||
|
||||
* [Rust][1]:兼顾速度和一定安全的系统编程语言。
|
||||
* [Elixir][2]:函数式、动态和容错,适用于那些规模越来越大的应用程序。
|
||||
* [Elm][3]:更多函数式的乐趣,使用 JavaScript,学习成为一种乐趣。
|
||||
* [Kotlin][4]:这一个是为使用 Java 和 JVM 的人设计的语言 - 静态类型、安全,此外我提到 Java 兼容了吗?
|
||||
* [Perl 6] [5]:它还活着!Perl 6 碰巧是一种新的语言,它胜在富有表现力和功能丰富。
|
||||
|
||||
时间会告诉他们是否会如约发布。尝试他们,为他们贡献,成为未来的一部分!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/_mts0602.jpg?itok=7cSl2h8C)
|
||||
|
||||
Rachel Roumeliotis - O'Reilly Media,Inc. 的战略内容总监,领导了一个编辑团队,其涵盖各种各样的编程主题,从全栈 web 开发到企业中的开源到新兴的编程语言。她是 OSCON(O'Reilly 软件架构会议)和 Fluent 的编程主席。 她从事技术出版工作超过 10 年,出版了许多领域的内容,包括移动编程、UX、计算机安全。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/16/12/yearbook-top-programming-trends-2016
|
||||
|
||||
作者:[Rachel Roumeliotis][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/rroumeliotis
|
||||
[1]:https://www.rust-lang.org/en-US/
|
||||
[2]:http://elixir-lang.org/
|
||||
[3]:http://elm-lang.org/
|
||||
[4]:https://kotlinlang.org/
|
||||
[5]:https://perl6.org/
|
||||
[6]:https://www.flickr.com/photos/mopa1/5710937421/in/photolist-9GE3Ji-6tCkcs-otWCnW-wkkhM8-tm7Nah-7vwJ3Q-68HXuT-oruzry-7Dnhxt-oeUiuj-otcNUW-oyfLei-i1n1f6-owqxpT-i8RyRi-owbQS4-ovnJwp-otgwsB-qtFP4G-i1yVzD-i9cB9K-i1Db76-8eHe5n-i8VwCo-oupp7X-ouCYj2-i7VHNV-qrLEpj-ou6mGD-otHdws-55Bcba-ba4NaZ-owr9WM-r5rFgN-i1As83-i9e17E-of1nLV-ocbpqf-occJbg-oeZBT4-oujeML-obZjTD-oePhsw-odkejY-5ohHHH-odjBfU-odkSVS-otTy9e-obWKAc-ouXqVQ
|
||||
[7]:http://conferences.oreilly.com/oscon/oscon-tx
|
||||
[8]:https://www.tensorflow.org/
|
||||
[9]:https://openai.com/blog/
|
||||
[10]:http://spark.apache.org/
|
||||
[11]:https://www.nervanasys.com/
|
||||
[12]:https://github.com/NervanaSystems/neon
|
||||
[13]:https://github.com/benanne/nervana_theano
|
||||
[14]:https://blog.golang.org/go-version-1-is-released
|
||||
[15]:https://opensource.com/resources/what-docker
|
||||
[16]:https://opensource.com/resources/what-is-kubernetes
|
||||
[17]:https://opensource.com/life/15/12/most-likely-succeed-2016
|
||||
[18]:http://www.infoworld.com/article/2920333/mobile-development/swift-vs-objective-c-10-reasons-the-future-favors-swift.html
|
||||
[19]:https://opensource.com/article/16/11/15-javascript-frameworks-libraries
|
@ -0,0 +1,260 @@
|
||||
如何在 Shell 脚本中跟踪调试命令的执行
|
||||
============================================================
|
||||
|
||||
在 [shell 脚本调试系列][3] 中,本文将解释第三种 shell 脚本调试模式,即 shell 跟踪,并查看一些示例来演示它如何工作以及如何使用它。
|
||||
|
||||
本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的例子展示了如何在这些模式下启用 shell 脚本调试。
|
||||
|
||||
1. [如何在 Linux 中启用 Shell 脚本的调试模式][1]
|
||||
2. [如何在 Shell 脚本中执行语法检查调试模式][2]
|
||||
|
||||
shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行。要打开 shell 跟踪,请使用 `-x` 调试选项。
|
||||
|
||||
这会让 shell 在终端上显示所有执行的命令及其参数。
|
||||
|
||||
我们将使用下面的 `sys_info.sh` shell 脚本,它会简要地打印出你的系统日期和时间、登录的用户数和系统的运行时间。不过,脚本中包含我们需要查找和更正的语法错误。
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
#script to print brief system info
|
||||
ROOT_ID="0"
|
||||
DATE=`date`
|
||||
NO_USERS=`who | wc -l`
|
||||
UPTIME=`uptime`
|
||||
check_root(){
|
||||
if [ "$UID" -ne "$ROOT_ID" ]; then
|
||||
echo "You are not allowed to execute this program!"
|
||||
exit 1;
|
||||
}
|
||||
print_sys_info(){
|
||||
echo "System Time : $DATE"
|
||||
echo "Number of users: $NO_USERS"
|
||||
echo "System Uptime : $UPTIME
|
||||
}
|
||||
check_root
|
||||
print_sys_info
|
||||
exit 0
|
||||
```
|
||||
|
||||
保存文件并执行脚本。脚本只能用 root 用户运行,因此如下使用 [sudo 命令][4]运行:
|
||||
|
||||
```
|
||||
$ chmod +x sys_info.sh
|
||||
$ sudo bash -x sys_info.sh
|
||||
```
|
||||
|
||||
[
|
||||
![Shell Tracing - Show Error in Script](http://www.tecmint.com/wp-content/uploads/2016/12/Shell-Tracing-Errors.png)
|
||||
][5]
|
||||
|
||||
*shell 跟踪 - 显示脚本中的错误*
|
||||
|
||||
从上面的输出我们可以观察到,首先执行命令,然后其输出做为一个变量的值。
|
||||
|
||||
例如,先执行 `date`,其输出做为变量 `DATE` 的值。
|
||||
|
||||
我们可以执行语法检查来只显示其中的语法错误,如下所示:
|
||||
|
||||
```
|
||||
$ sudo bash -n sys_info.sh
|
||||
```
|
||||
|
||||
[
|
||||
![Syntax Checking in Script](http://www.tecmint.com/wp-content/uploads/2016/12/Syntax-Checking-in-Script.png)
|
||||
][6]
|
||||
|
||||
*脚本中语法检查*
|
||||
|
||||
如果我们审视这个 shell 脚本,我们就会发现 `if` 语句缺少了封闭条件的 `fi` 关键字。因此,让我们加上它,新的脚本应该看起来像这样:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
#script to print brief system info
|
||||
ROOT_ID="0"
|
||||
DATE=`date`
|
||||
NO_USERS=`who | wc -l`
|
||||
UPTIME=`uptime`
|
||||
check_root(){
|
||||
if [ "$UID" -ne "$ROOT_ID" ]; then
|
||||
echo "You are not allowed to execute this program!"
|
||||
exit 1;
|
||||
fi
|
||||
}
|
||||
print_sys_info(){
|
||||
echo "System Time : $DATE"
|
||||
echo "Number of users: $NO_USERS"
|
||||
echo "System Uptime : $UPTIME
|
||||
}
|
||||
check_root
|
||||
print_sys_info
|
||||
exit 0
|
||||
```
|
||||
|
||||
再次保存文件并以 root 执行,同时做语法检查:
|
||||
|
||||
```
|
||||
$ sudo bash -n sys_info.sh
|
||||
```
|
||||
[
|
||||
![Perform Syntax Check in Shell Scripts](http://www.tecmint.com/wp-content/uploads/2016/12/Syntax-Check-in-Shell-Scripts.png)
|
||||
][7]
|
||||
|
||||
*在 shell 脚本中执行语法检查*
|
||||
|
||||
上面的语法检查操作的结果仍然显示在脚本的第 21 行还有一个错误。所以,我们仍然要纠正一些语法。
|
||||
|
||||
再一次分析脚本,会发现第 21 行的错误是由于在 `print_sys_info` 函数内最后一个 [echo 命令][8]中没有闭合双引号 `"`。
|
||||
|
||||
我们将在 `echo` 命令中添加闭合双引号并保存文件。修改过的脚本如下:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
#script to print brief system info
|
||||
ROOT_ID="0"
|
||||
DATE=`date`
|
||||
NO_USERS=`who | wc -l`
|
||||
UPTIME=`uptime`
|
||||
check_root(){
|
||||
if [ "$UID" -ne "$ROOT_ID" ]; then
|
||||
echo "You are not allowed to execute this program!"
|
||||
exit 1;
|
||||
fi
|
||||
}
|
||||
print_sys_info(){
|
||||
echo "System Time : $DATE"
|
||||
echo "Number of users: $NO_USERS"
|
||||
echo "System Uptime : $UPTIME"
|
||||
}
|
||||
check_root
|
||||
print_sys_info
|
||||
exit 0
|
||||
```
|
||||
|
||||
现在再一次检查语法。
|
||||
|
||||
```
|
||||
$ sudo bash -n sys_info.sh
|
||||
```
|
||||
|
||||
上面的命令不会产生任何输出,因为我们的脚本语法上正确。我们也可以再次跟踪脚本执行,它应该工作得很好:
|
||||
|
||||
```
|
||||
$ sudo bash -x sys_info.sh
|
||||
```
|
||||
[
|
||||
![Trace Shell Script Execution](http://www.tecmint.com/wp-content/uploads/2016/12/Trace-Shell-Execution.png)
|
||||
][9]
|
||||
|
||||
*跟踪 shell 脚本执行*
|
||||
|
||||
现在运行脚本。
|
||||
|
||||
```
|
||||
$ sudo ./sys_info.sh
|
||||
```
|
||||
[
|
||||
![Shell Script to Show Date, Time and Uptime](http://www.tecmint.com/wp-content/uploads/2016/12/Script-to-Show-Date-and-Uptime.png)
|
||||
][10]
|
||||
|
||||
*用 shell 脚本显示日期、时间和运行时间*
|
||||
|
||||
### shell 跟踪执行的重要性
|
||||
|
||||
shell 脚本跟踪可以帮助我们识别语法错误,更重要的是识别逻辑错误。例如,在 `sys_info.sh` shell 脚本中的 `check_root` 函数,它用于确定用户是否为 root,因为脚本只允许由超级用户执行。
|
||||
|
||||
```
|
||||
check_root(){
|
||||
if [ "$UID" -ne "$ROOT_ID" ]; then
|
||||
echo "You are not allowed to execute this program!"
|
||||
exit 1;
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
这里的魔法是由 `if` 语句表达式 `["$ UID" -ne "$ ROOT_ID"]` 控制的,一旦我们不使用合适的数字运算符(示例中为 `-ne`,这意味着不相等),我们最终可能会出一个逻辑错误。
|
||||
|
||||
假设我们使用 `-eq` (意思是等于),这将允许任何系统用户以及 root 用户运行脚本,因此是一个逻辑错误。
|
||||
|
||||
```
|
||||
check_root(){
|
||||
if [ "$UID" -eq "$ROOT_ID" ]; then
|
||||
echo "You are not allowed to execute this program!"
|
||||
exit 1;
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
注意:我们在本系列开头介绍过,`set` 这个 shell 内置命令可以在 shell 脚本的特定部分激活调试。
|
||||
|
||||
因此,下面的行将帮助我们通过跟踪脚本的执行在其中找到这个逻辑错误:
|
||||
|
||||
具有逻辑错误的脚本:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
#script to print brief system info
|
||||
ROOT_ID="0"
|
||||
DATE=`date`
|
||||
NO_USERS=`who | wc -l`
|
||||
UPTIME=`uptime`
|
||||
check_root(){
|
||||
if [ "$UID" -eq "$ROOT_ID" ]; then
|
||||
echo "You are not allowed to execute this program!"
|
||||
exit 1;
|
||||
fi
|
||||
}
|
||||
print_sys_info(){
|
||||
echo "System Time : $DATE"
|
||||
echo "Number of users: $NO_USERS"
|
||||
echo "System Uptime : $UPTIME"
|
||||
}
|
||||
#turning on and off debugging of check_root function
|
||||
set -x ; check_root; set +x ;
|
||||
print_sys_info
|
||||
exit 0
|
||||
```
|
||||
|
||||
保存文件并调用脚本,在输出中,我们可以看到一个普通系统用户可以在未 sudo 的情况下运行脚本。 这是因为 `USER_ID` 的值为 100,不等于为 0 的 root 的 `ROOT_ID` 。
|
||||
|
||||
```
|
||||
$ ./sys_info.sh
|
||||
```
|
||||
[
|
||||
![Run Shell Script Without Sudo](http://www.tecmint.com/wp-content/uploads/2016/12/Run-Shell-Script-Without-Sudo.png)
|
||||
][11]
|
||||
|
||||
**未 sudo 的情况下运行 shell 脚本**
|
||||
|
||||
那么,现在我们已经完成了 [shell 脚本调试系列][12],可以在下面的反馈栏里给我们关于本篇或者本系列提出问题或反馈。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin、web 开 发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/trace-shell-script-execution-in-linux/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:https://linux.cn/article-8028-1.html
|
||||
[2]:https://linux.cn/article-8045-1.html
|
||||
[3]:https://linux.cn/article-8028-1.html
|
||||
[4]:http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2016/12/Shell-Tracing-Errors.png
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2016/12/Syntax-Checking-in-Script.png
|
||||
[7]:http://www.tecmint.com/wp-content/uploads/2016/12/Syntax-Check-in-Shell-Scripts.png
|
||||
[8]:http://www.tecmint.com/echo-command-in-linux/
|
||||
[9]:http://www.tecmint.com/wp-content/uploads/2016/12/Trace-Shell-Execution.png
|
||||
[10]:http://www.tecmint.com/wp-content/uploads/2016/12/Script-to-Show-Date-and-Uptime.png
|
||||
[11]:http://www.tecmint.com/wp-content/uploads/2016/12/Run-Shell-Script-Without-Sudo.png
|
||||
[12]:https://linux.cn/article-8028-1.html
|
100
published/201701/20170102 A Guide To Buying A Linux Laptop.md
Normal file
100
published/201701/20170102 A Guide To Buying A Linux Laptop.md
Normal file
@ -0,0 +1,100 @@
|
||||
Linux 笔记本电脑选购指南
|
||||
============================================================
|
||||
|
||||
众所周知,如果你去电脑城[购买一个新的笔记本电脑][5],你所见到的尽是预安装了 Windows 或是 Mac 系统的笔记本电脑。无论怎样,你都会被迫支付一笔额外的费用—— 微软系统的许可费用或是苹果电脑背后的商标使用权费用。
|
||||
|
||||
当然,你也可以选择购买一款笔记本电脑,然后安装自己喜欢的操作系统。然而,最困难的可能是需要找到一款硬件跟你想安装的操作系统兼容性良好的笔记本电脑。
|
||||
|
||||
在此之上,我们还需要考虑硬件驱动程序的可用性。那么,你应该怎么办呢?答案很简单:[购买一款预安装了 Linux 系统的笔记本电脑][6]。
|
||||
|
||||
幸运的是,正好有几家值得依赖的公司提供质量好、有名气,并且预安装了 Linux 系统的笔记本电脑,这样你就不用再担心驱动程序的可用性了。
|
||||
|
||||
也就是说,在这篇文章中,我们将根据用户对笔记本电脑的用途列出 3 款可供用户选择的高性价比机器。
|
||||
|
||||
### 普通用户使用的 Linux 笔记本电脑
|
||||
|
||||
如果你正在寻找一款能够满足日常工作及娱乐需求的 Linux 笔记本电脑,它能够正常运行办公软件,有诸如 Firefox或是 Chrome 这样的 Web 浏览器,有局域网 / Wifi 连接功能,那么你可以考虑选择 [System76][7] 公司生产的 Linux 笔记本电脑,它可以根据用户的定制化需求选择处理器类型,内存及磁盘大小,以及其它配件。
|
||||
|
||||
除此之外, System76 公司为他们所有的 Ubuntu 系统的笔记本电脑提供终身技术支持。如果你觉得这听起来不错,并且也比较感兴趣,你可以考虑下 [Lemur][8] 或者 [Gazelle][9] 这两款笔记本电脑。
|
||||
|
||||
![Lemur Laptop for Linux](http://www.tecmint.com/wp-content/uploads/2016/11/Lemur-Laptop.png)
|
||||
|
||||
*Lemur Linux 笔记本电脑*
|
||||
|
||||
|
||||
![Gazelle Laptop for Linux](http://www.tecmint.com/wp-content/uploads/2016/11/Gazelle-Laptop.png)
|
||||
|
||||
*Gazelle Linux 笔记本电脑*
|
||||
|
||||
|
||||
### 开发者使用的 Linux 笔记本电脑
|
||||
|
||||
如果你想找一款坚固可靠,外观精美,并且性能强悍的笔记本电脑用于开发工作,你可以考虑一下 [Dell 的 XPS 13 笔记本电脑][10]。
|
||||
|
||||
这款 13 英寸的精美笔记本电脑,配置全高清 HD 显示器,触摸板,售价范围视其配置情况而定,CPU 代号/型号:Intel 的第 7 代处理器 i5 和 i7,固态硬盘大小:128 至 512 GB,内存大小:8 至 16 GB。
|
||||
|
||||
|
||||
![Dells XPS Laptop for Linux](http://www.tecmint.com/wp-content/uploads/2016/11/Dells-XPS-Laptops.png)
|
||||
|
||||
*Dell XPS Linux 笔记本电脑*
|
||||
|
||||
这些都是你应该考虑在内的重要因素,Dell 已经做得很到位了。不幸的是,Dell ProSupport 为该型号的笔记本电脑仅提供 Ubuntu 16.04 LTS 系统的技术支持(在写本篇文章的时候 - 2016 年 12 月)。
|
||||
|
||||
### 系统管理员使用的 Linux 笔记本电脑
|
||||
|
||||
虽然系统管理员可以顺利搞定在裸机上安装 Linux 系统的工作,但是使用 System76 的产品,你可以避免寻找各种驱动并解决兼容性问题上的麻烦。
|
||||
|
||||
之后,你可以根据自己的需求来配置电脑特性,你可以提高笔记本电脑的性能,增加内存到 32 GB 以确保你可以运行虚拟化环境并进行各种系统管理相关的任务。
|
||||
|
||||
如果你对此比较感兴趣,你可以考虑购买 [Kudu][12] 或者是 [Oryx Pro][13] 笔记本电脑。
|
||||
|
||||
![Kudu Linux Laptop](http://www.tecmint.com/wp-content/uploads/2016/11/Kudu-Linux-Laptop.png)
|
||||
|
||||
*Kudu Linux 笔记本电脑*
|
||||
|
||||
|
||||
![Oryx Pro Linux Laptop](http://www.tecmint.com/wp-content/uploads/2016/11/Oryx-Pro-Linux-Laptop.png)
|
||||
|
||||
*Oryx Pro 笔记本电脑*
|
||||
|
||||
### 总结
|
||||
|
||||
在这篇文章中,我们探讨了对于普通用户、开发者及系统管理员来说,为什么购买一款预安装了 Linux 系统的笔记本是一个不错的选择。一旦你决定好,你就可以轻松自如的考虑下应该如何消费这笔省下来的钱了。
|
||||
|
||||
你觉得在购买一款 Linux 系统的笔记本电脑时还应该注意些什么?请在下面的评论区与大家分享。
|
||||
|
||||
像往常一样,如果你对这篇文章有什么意见和看法,请随时提出来。我们很期待看到你的回复。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/d9d14c5b51331864398e6288cb0c2091?s=128&d=blank&r=g)
|
||||
|
||||
Gabriel Cánepa 来自 Argentina,San Luis,Villa Mercedes ,他是一名 GNU/Linux 系统管理员和网站开发工程师。目前在一家世界领先的消费品公司工作,在日常工作中,他非常善于使用 FOSS 工具来提高公司在各个领域的生产率。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/buy-linux-laptops/
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
|
||||
[a]:http://www.tecmint.com/author/gacanepa/
|
||||
[1]:http://www.tecmint.com/wp-content/uploads/2016/11/Lemur-Laptop.png
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2016/11/Gazelle-Laptop.png
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2016/11/Kudu-Linux-Laptop.png
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2016/11/Oryx-Pro-Linux-Laptop.png
|
||||
[5]:http://amzn.to/2fPxTms
|
||||
[6]:http://amzn.to/2fPxTms
|
||||
[7]:https://system76.com/laptops
|
||||
[8]:https://system76.com/laptops/lemur
|
||||
[9]:https://system76.com/laptops/gazelle
|
||||
[10]:http://amzn.to/2fBLMGj
|
||||
[11]:http://www.tecmint.com/wp-content/uploads/2016/11/Dells-XPS-Laptops.png
|
||||
[12]:https://system76.com/laptops/kudu
|
||||
[13]:https://system76.com/laptops/oryx
|
@ -0,0 +1,62 @@
|
||||
2017 年成为 Linux 专家的 4 个热门技能
|
||||
============================================================
|
||||
|
||||
### 你在新的一年里需要刷哪些技能?
|
||||
|
||||
![4 hot skills for Linux pros in 2017](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/lightbulb-idea-think-yearbook-lead.png?itok=56ovNk8n "4 hot skills for Linux pros in 2017")
|
||||
|
||||
图片提供:[Internet Archive Book Images][1]。由 Opensource.com 修改。 CC BY-SA 4.0
|
||||
|
||||
成为 Linux 专家的一个问题是“专家”的定义在不断变化。当我进入 Linux 世界的时候,那时认为成为一个 _Linux 专家_,你需要能够编译自己的内核。天啊,如果你想在笔记本电脑上使用 Linux,即便你只是_用户_,你也必须编译一个自定义内核。 如今编译自己的内核通常是浪费时间。这不是说它并不重要,但在开源世界,我们建立在他人成功的基础之上,而 Linux 发行版为我们提供了运行良好的内核。虽然“专家”的定义并不总是那么剧烈变化,但对 IT 专业人员的需求每年都在变化。
|
||||
|
||||
下面是 2017 年 Linux 专业人员的四个重要技能:
|
||||
|
||||
### 1、 安全
|
||||
|
||||
我不是在讨论安全专家或安全顾问。这些职位和服务当然很重要,但是随着联网设备渗透到我们生活的每一个方面,我们需要在我们做出的每一个决定中都具有[安全][2]意识。今年,我的妻子和我买了一台洗衣机和一台冰箱,它们都配备了蓝牙。黑客攻入我的漂洗系统的想法可能看起来很傻,但这都是潜在的攻击点。
|
||||
|
||||
当激活工作、家庭或我们的口袋中的任何系统时,我们应该考虑它们可能引发的安全问题。而且因为像联网烤面包机这样的物品不太可能及时获得固件升级,我们需要按照普通设备可能遭到破坏的思路来设计其余的系统。相比以前任何时候,我们更需要考虑来自防火墙内的攻击。不要让你的文件服务器被你的搅拌器破坏!
|
||||
|
||||
### 2、 DevOps
|
||||
|
||||
[DevOps][3] 不再是一个新概念。在过去两三年里,我们一直鼓励员工学习 DevOps,以便他们能够在工作中取得成功。这是个好建议,但这并不意味着我们应该完全依赖自动化工具来完成我们的工作。Chef、Puppet、Ansible、Salt Stack 及类似的工具是美好的,但我们需要了解背后发生了什么,所以当发生一些不可避免的错误,我们应该知道如何解决它。
|
||||
|
||||
使用 DevOps 的编程方法来计算,我们仍然需要能够维护、修复和理解在代码层之下运行的系统的人。没有 Linux 专家,云计算将是一个可怕的地方,即使那个云在你自己的机房里。
|
||||
|
||||
### 3、 开发
|
||||
|
||||
作为系统管理员,20 年来,我从来没有时间学习编程。这听起来可能是一个借口,但这是事实。我所有的开发技能就是基本的脚本编写,以帮助我更快工作。不过,那些日子已经结束了。虽然我们需要在 DevOps 世界中拥有系统管理技能,但我们还需要系统管理员拥有编程技能。
|
||||
|
||||
如果你是一个像我一样的老练的系统管理员,你可能已经采用 DevOps 并每天使用它。如果你真的想要胜过他人,你需要学习如何以编程方式解决问题,并且不要认为 Chef 或 Puppet 代码只是配置文件。 每个 IT 专业人员都至少需要掌握编程的概念,因为 DevOps 代码至少在某种程度上抽象了 IT 的每个方面。
|
||||
|
||||
### 4、 软技能
|
||||
|
||||
通常,我们在准备职业生涯时所考虑的最后一件事是所谓的 *软技能* - 社交和沟通技巧 - 但是它们可能是最有可能决定你走向成功的技能。无论你正在寻找一份新工作,还是试图适应当前职业生涯的变化,软技能是至关重要的。
|
||||
|
||||
划分 IT 各个领域的标准是交错的,并且良好的沟通能力使得这些模糊的分野成为一个有利条件,而不是绊脚石。我们正生活在一个开发人员围绕着服务器,而运维团队编写 Ruby 代码来维护服务器农场的世界里。这些都是 IT 中的大胆的新思想,如果人们不能在不同部门间很好的沟通,工作场所将迅速有敌对气氛。此外,IT 人员总是需要与其他业务领域的人员进行有效沟通。而且,现在比以往有更大的需求。
|
||||
|
||||
|
||||
你计划在 2017 年里添加什么到你的技能中?在评论栏中让我们知道吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/Shawn%20Powers%20350%20x%20250%20px_2.jpg?itok=6n0E_-Z2)
|
||||
|
||||
Shawn Powers - 自 2009 年起是 CBT Nuggets (www.cbtnuggets.com) 的一名 IT 训练员,专于 Linux、Chef 及为大规模网络集成多个平台。他在 2016 年 12 月发布了一个在线高级 Linux 认证课程(LPIC-2)。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/yearbook-4-hot-skills-linux-pros-2017
|
||||
|
||||
作者:[Shawn Powers][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/shawnpowers
|
||||
[1]:https://www.flickr.com/photos/internetarchivebookimages/14758810172/in/photolist-oubL5m-ocu2ck-odJwF4-oeq1na-odgZbe-odcugD-w7KHtd-owgcWd-oucGPe-oud585-rgBDNf-obLoQH-oePNvs-osVgEq-othPLM-obHcKo-wQR3KN-oumGqG-odnCyR-owgLg3-x2Zeyq-hMMxbq-oeRzu1-oeY49i-odumMM-xH4oJo-odrT31-oduJr8-odX8B3-obKG8S-of1hTN-ovhHWY-ow7Scj-ovfm7B-ouu1Hj-ods7Sg-qwgw5G-oeYz5D-oeXqFZ-orx8d5-hKPN4Q-ouNKch-our8E1-odvGSH-oweGTn-ouJNQQ-ormX8L-od9XZ1-roZJPJ-ot7Wf4
|
||||
[2]:https://opensource.com/tags/security
|
||||
[3]:https://opensource.com/tags/devops
|
@ -0,0 +1,152 @@
|
||||
在 Linux 终端中自定义 Bash 配色和提示内容
|
||||
============================================================
|
||||
|
||||
现今,大多数(如果不是全部的话)现代 Linux 发行版的默认 shell 都是 Bash。然而,你可能已经注意到这样一个现象,在各个发行版中,其终端配色和提示内容都各不相同。
|
||||
|
||||
如果你一直都在考虑,或者只是一时好奇,如何定制可以使 Bash 更好用。不管怎样,请继续读下去 —— 本文将告诉你怎么做。
|
||||
|
||||
### PS1 Bash 环境变量
|
||||
|
||||
命令提示符和终端外观是通过一个叫 `PS1` 的变量来进行管理的。根据 **Bash** 手册页说明,**PS1** 代表了 shell 准备好读取命令时显示的主体的提示字符串。
|
||||
|
||||
**PS1** 所允许的内容包括一些反斜杠转义的特殊字符,可以查看手册页中 **PRMPTING** 部分的内容来了解它们的含义。
|
||||
|
||||
为了演示,让我们先来显示下我们系统中 `PS1` 的当前内容吧(这或许看上去和你们的有那么点不同):
|
||||
|
||||
```
|
||||
$ echo $PS1
|
||||
[\u@\h \W]\$
|
||||
```
|
||||
|
||||
现在,让我们来了解一下怎样自定义 PS1 吧,以满足我们各自的需求。
|
||||
|
||||
#### 自定义 PS1 格式
|
||||
|
||||
根据手册页 PROMPTING 章节的描述,下面对各个特殊字符的含义作如下说明:
|
||||
|
||||
- `\u:` 显示当前用户的 **用户名**。
|
||||
- `\h:` <ruby>完全限定域名 <rt>Fully-Qualified Domain Name</rt></ruby>(FQDN)中第一个点(.)之前的**主机名**。
|
||||
- `\W:` 当前工作目录的**基本名**,如果是位于 `$HOME` (家目录)通常使用波浪符号简化表示(`~`)。
|
||||
- `\$:` 如果当前用户是 root,显示为 `#`,否则为 `$`。
|
||||
|
||||
例如,如果我们想要显示当前命令的历史数量,可以考虑添加 `\!`;如果我们想要显示 FQDN 全称而不是短服务器名,那么可以考虑添加 `\H`。
|
||||
|
||||
在下面的例子中,我们同时将这两个特殊字符引入我们当前的环境中,命令如下:
|
||||
|
||||
```
|
||||
PS1="[\u@\H \W \!]\$"
|
||||
```
|
||||
|
||||
当按下回车键后,你将会看到提示内容会变成下面这样。可以对比执行命令修改前和修改后的提示内容:
|
||||
|
||||
[
|
||||
![Customize Linux Terminal Prompt PS1](http://www.tecmint.com/wp-content/uploads/2017/01/Customize-Linux-Terminal-Prompt.png)
|
||||
][1]
|
||||
|
||||
*自定义 Linux 终端提示符 PS1*
|
||||
|
||||
现在,让我们再深入一点,修改命令提示符中的用户名和主机名 —— 同时修改文本和环境背景。
|
||||
|
||||
实际上,我们可以对提示符进行 3 个方面的自定义:
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>文本格式</th>
|
||||
<th>前景色(文本)</th>
|
||||
<th>背景色 </th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>0: 常规文本</th>
|
||||
<th>30: 黑色</th>
|
||||
<th>40: 黑色</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>1: 加粗</th>
|
||||
<th>31: 红色</th>
|
||||
<th>41: 红色</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>4: 下划线文本</th>
|
||||
<th> 32: 绿色</th>
|
||||
<th>42: 绿色</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>33: 黄色</th>
|
||||
<th>43: 黄色</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>34: 蓝色</th>
|
||||
<th>44: 蓝色</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>35: 紫色</th>
|
||||
<th>45: 紫色</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>36: 青色</th>
|
||||
<th>46: 青色</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>37: 白色</th>
|
||||
<th>47: 白色</th>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
我们将在开头使用 `\e` 特殊字符,跟着颜色序列,在结尾使用 `m` 来表示结束。
|
||||
|
||||
在该序列中,三个值(**背景**,**格式**和**前景**)由分号分隔(如果不赋值,则假定为默认值)。
|
||||
|
||||
**建议阅读:** [在 Linux 中学习 Bash shell 脚本][2]。
|
||||
|
||||
此外,由于值的范围不同,指定背景,格式,或者前景的先后顺序没有关系。
|
||||
|
||||
例如,下面的 `PS1` 将导致提示符为黄色带下划线文本,并且背景为红色:
|
||||
|
||||
```
|
||||
PS1="\e[41;4;33m[\u@\h \W]$ "
|
||||
```
|
||||
[
|
||||
![Change Linux Terminal Color Prompt PS1](http://www.tecmint.com/wp-content/uploads/2017/01/Change-Linux-Terminal-Color-Prompt.png)
|
||||
][3]
|
||||
|
||||
*修改 Linux 终端提示符配色 PS1*
|
||||
|
||||
虽然它看起来那么漂亮,但是这个自定义将只会持续到当前用户会话结束。如果你关闭终端,或者退出本次会话,所有修改都会丢失。
|
||||
|
||||
为了让修改永久生效,你必须将下面这行添加到 `~/.bashrc`或者 `~/.bash_profile`,这取决于你的版本。
|
||||
|
||||
```
|
||||
PS1="\e[41;4;33m[\u@\h \W]$ "
|
||||
```
|
||||
|
||||
尽情去玩耍吧,你可以尝试任何色彩,直到找出最适合你的。
|
||||
|
||||
##### 小结
|
||||
|
||||
在本文中,我们讲述了如何来自定义 Bash 提示符的配色和提示内容。如果你对本文还有什么问题或者建议,请在下面评论框中写下来吧。我们期待你们的声音。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:Aaron Kili 是一位 Linux 及 F.O.S.S 的狂热爱好者,一位未来的 Linux 系统管理员,web 开发者,而当前是 TechMint 的原创作者,他热爱计算机工作,并且信奉知识分享。
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/customize-bash-colors-terminal-prompt-linux/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[GOLinux](https://github.com/GOLinux)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/wp-content/uploads/2017/01/Customize-Linux-Terminal-Prompt.png
|
||||
[2]:http://www.tecmint.com/category/bash-shell/
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2017/01/Change-Linux-Terminal-Color-Prompt.png
|
@ -0,0 +1,173 @@
|
||||
5 个找出“二进制命令”描述和系统中位置的方法
|
||||
============================================================
|
||||
|
||||
在数千个 [Linux 系统上的命令/程序][1]中,知道给定命令的类型和目的以及其在系统上的位置(绝对路径)对于新手来说可能是一个挑战。
|
||||
|
||||
知道命令/程序的一些细节不仅有助于 [Linux 用户掌握大量命令][2],还能使用户理解命令行或脚本在系统上的操作。
|
||||
|
||||
因此,在本文中我们将向你解释五个有用的命令,用于显示给定命令的简短描述和位置。
|
||||
|
||||
要在系统上发现新命令,请查看 PATH 环境变量中的所有目录。这些目录存储系统上安装的所有命令/程序。
|
||||
|
||||
一旦你找到一个有趣的命令,在继续阅读更多关于它的手册页之前,请尝试如下收集一些简要的信息。
|
||||
|
||||
假设你输出了 `PATH` 的值,然后进到其中的一个目录 `/usr/local/bin`,注意到一个名为 [`fswatch`(监视文件修改更改)][3]的新命令:
|
||||
|
||||
```
|
||||
$ echo $PATH
|
||||
$ cd /usr/local/bin
|
||||
```
|
||||
|
||||
[
|
||||
![Find New Commands in Linux](http://www.tecmint.com/wp-content/uploads/2017/01/Find-New-Commands-in-Linux.png)
|
||||
][4]
|
||||
|
||||
*在 Linux 中找出新命令*
|
||||
|
||||
现在让我们在 Linux 中用不同的方法找出 `fswatch` 命令的描述和位置。
|
||||
|
||||
### 1、 whatis 命令
|
||||
|
||||
`whatis` 用于显示你作为参数输入的命令名的单行描述(例如下面命令中的 `fswatch`)。
|
||||
|
||||
如果描述太长,一些部分在默认情况下会被省略,使用 `-l` 标志来显示完整的描述。
|
||||
|
||||
```
|
||||
$ whatis fswatch
|
||||
$ whatis -l fswatch
|
||||
```
|
||||
[
|
||||
![Linux whatis Command Example](http://www.tecmint.com/wp-content/uploads/2017/01/Whatis-Command-Example.png)
|
||||
][5]
|
||||
|
||||
*Linux whatis 命令示例*
|
||||
|
||||
### 2、 apropos 命令
|
||||
|
||||
`apropos` 会搜索手册页名称和关键字描述(以命令名作为正则表达式搜索)。
|
||||
|
||||
使用 `-l` 标志来显示完整的描述。
|
||||
|
||||
```
|
||||
$ apropos fswatch
|
||||
$ apropos -l fswatch
|
||||
```
|
||||
|
||||
[
|
||||
![Linux apropos Command Example](http://www.tecmint.com/wp-content/uploads/2017/01/Linux-apropos-Command-Example.png)
|
||||
][6]
|
||||
|
||||
*Linux apropos 命令示例*
|
||||
|
||||
默认上,`apropos` 会如示例那样输出所有匹配的行。你可以使用 `-e` 选项来精确匹配:
|
||||
|
||||
```
|
||||
$ apropos fmt
|
||||
$ apropos -e fmt
|
||||
```
|
||||
[
|
||||
![Linux apropos Command Show by Keyword](http://www.tecmint.com/wp-content/uploads/2017/01/Linux-apropos-Command-Keyword-Example.png)
|
||||
][7]
|
||||
|
||||
*Linux apropos 命令根据关键词显示*
|
||||
|
||||
### 3、 type 命令
|
||||
|
||||
`type` 命令会输出给定命令的完整路径名,此外,如果输入的命令名不是做为独立存储在磁盘的文件的程序,`type` 还会告诉你命令分类:
|
||||
|
||||
- shell 内置命令
|
||||
- shell 关键字或保留字
|
||||
- 别名
|
||||
|
||||
```
|
||||
$ type fswatch
|
||||
```
|
||||
|
||||
[
|
||||
![Linux type Command Example](http://www.tecmint.com/wp-content/uploads/2017/01/Linux-type-Command-Example.png)
|
||||
][8]
|
||||
|
||||
*Linux type 命令示例*
|
||||
|
||||
当命令是另外一个命令的别名时,`type` 会显示运行别名时所执行的命令。使用 `alias` 命令可以查看你系统上创建的所有别名:
|
||||
|
||||
```
|
||||
$ alias
|
||||
$ type l
|
||||
$ type ll
|
||||
```
|
||||
|
||||
[
|
||||
![Show All Aliases in Linux](http://www.tecmint.com/wp-content/uploads/2017/01/Show-All-Aliases-in-Linux.png)
|
||||
][9]
|
||||
|
||||
*显示 Linux 中所有别名*
|
||||
|
||||
### 4、 which 命令
|
||||
|
||||
`which` 可以帮助命令定位命令,它会打印出命令的绝对路径:
|
||||
|
||||
```
|
||||
$ which fswatch
|
||||
```
|
||||
|
||||
[
|
||||
![Find Linux Command Location](http://www.tecmint.com/wp-content/uploads/2017/01/Find-Linux-Command-Location.png)
|
||||
][10]
|
||||
|
||||
*找出 Linux 命令位置*
|
||||
|
||||
一些二进制文件存在于 `PATH` 环境变量中的多个目录,使用 `-a` 标志来找出所有匹配的路径名。
|
||||
|
||||
### 5、 whereis 命令
|
||||
|
||||
`whereis` 定位指定命令名的二进制、源和帮助页文件,如下所示:
|
||||
|
||||
```
|
||||
$ whereis fswatch
|
||||
$ whereis mkdir
|
||||
$ whereis rm
|
||||
```
|
||||
[
|
||||
![Linux whereis Command Example](http://www.tecmint.com/wp-content/uploads/2017/01/Linux-whereis-Command-Example.png)
|
||||
][11]
|
||||
|
||||
*Linux whereis 命令示例*
|
||||
|
||||
虽然上面的命令对于查找关于命令/程序的一些快速信息很重要,但是该命令的手册总是可以提供完整的文档,它还包括其他相关程序的列表:
|
||||
|
||||
```
|
||||
$ man fswatch
|
||||
```
|
||||
|
||||
在本文中,我们回顾了五个简单的命令,用于显示命令的简短的手册描述和位置。 你可以在反馈栏中对此文章做出贡献或提出问题。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin、web 开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
via: http://www.tecmint.com/find-linux-command-description-and-location/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/category/top-tools/
|
||||
[2]:http://www.tecmint.com/tag/linux-tricks/
|
||||
[3]:http://www.tecmint.com/fswatch-monitors-files-and-directory-changes-modifications-in-linux/
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2017/01/Find-New-Commands-in-Linux.png
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2017/01/Whatis-Command-Example.png
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2017/01/Linux-apropos-Command-Example.png
|
||||
[7]:http://www.tecmint.com/wp-content/uploads/2017/01/Linux-apropos-Command-Keyword-Example.png
|
||||
[8]:http://www.tecmint.com/wp-content/uploads/2017/01/Linux-type-Command-Example.png
|
||||
[9]:http://www.tecmint.com/wp-content/uploads/2017/01/Show-All-Aliases-in-Linux.png
|
||||
[10]:http://www.tecmint.com/wp-content/uploads/2017/01/Find-Linux-Command-Location.png
|
||||
[11]:http://www.tecmint.com/wp-content/uploads/2017/01/Linux-whereis-Command-Example.png
|
@ -0,0 +1,185 @@
|
||||
50 种系统免遭黑客侵袭的方法 [2017 年版]
|
||||
============================================================
|
||||
|
||||
> Paul Simon 概括了“与爱人分手的 50 法”,而这里,我们提供了提高系统安全性的 50 种方法。
|
||||
|
||||
![secure your systems](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/rh_003601_05_mech_osyearbook2016_security_cc.png?itok=VNmpz6K- "secure your systems")
|
||||
|
||||
图片来自:
|
||||
|
||||
Opensource.com
|
||||
|
||||
当我还是小孩子,耳畔萦绕着 Paul Simon 的流行歌:“[与爱人分手的50法][3]”。当我渐渐地长大,突然受歌的启发,收集了 50 种方法,免得你——门内汉和门外汉——遭受黑客侵袭啊:
|
||||
|
||||
### “你刚刚从后头溜出去了,杰克”
|
||||
|
||||
1、 备份你的数据。如果你不幸被勒索软件光顾,那么你就不用支付赎金,因为你做了备份。
|
||||
|
||||
2、 当你需要在公共场所为你的手机充电,那就使用 [sysncstop][4]吧,或者你也可以用你的备份电池。(LCTT 译注:sysncstop 是一种可以在公共场所安全充电的 USB 设备。在公共场所充电的风险,你知道的。)
|
||||
|
||||
3、 利用好你的审计系统,里头有好多很酷的工具可以帮助你监控系统。如果你确实遭到了入侵,那么审计系统也许就可以告诉你发生了什么,以及攻击者做了些什么。
|
||||
|
||||
4、 说到日志,把日志定向到集中式服务器上总是一个不错的想法,因为如果某个黑客侵入你的系统里,他首先要攻击的就是日志系统以便隐藏他的踪迹。构建一个好的入侵检测系统来监控日志,这对于防范黑客也很有帮助。
|
||||
|
||||
### “做份新的计划吧,斯坦”
|
||||
|
||||
5、 以强制模式运行 SELinux(见 [StopDisablingSelinux.com][5])。不要觉得我现在还在喋喋不休地说这个可笑。SELinux 可以防止 0day 漏洞的影响。当[破壳][6]漏洞出现的时候,SELinux 曾是唯一的防护手段。
|
||||
|
||||
6、 如果可能,在 [SELinux 沙盒][7]中运行应用程序吧——在容器火遍全球前,它就已经是容器了。同时,请关注 [Flatpack][8] 开发,这个工具很快会开发沙盒功能。
|
||||
|
||||
7、 不要安装或者使用 Flash。Firefox 不再支持它了,同时也希望大多数 web 服务器正在远离它。
|
||||
|
||||
8、 使用[受约束的 SELinux 用户][9]来控制用户在你的系统中所能做的事。如果你正运行着一台共享登录的系统,设置用户为 `guest_t`。
|
||||
|
||||
### “你不必害羞,罗伊”
|
||||
|
||||
9、 利用 [systemd 工具的能力][10]来帮助你提升系统安全。大多数系统攻击是通过那些监听着网络的服务来实现的,而 Systemd 提供了一些很棒的方法来锁定服务。例如,使用 [PrivateTmp=yes][11] 。Privatemp 利用挂载命名空间来为服务器的 `/tmp` 设置一个私有的 **tmpfs** 挂载,这可以阻止被入侵的服务访问到主机 `/tmp` 中的内容,以及针对系统中基于监听 `/tmp` 的服务的潜在攻击。
|
||||
|
||||
10、 `InaccessibleDirectories=/home` 是一个 systemd 单元的选项,它使用挂载命名空间的方式使从服务的角度看不到 `/home` 目录(或者其它任何目录),这会使得被入侵的服务攻击到数据更为困难。
|
||||
|
||||
11、 `ReadOnlyDirectories=/var` 是另外一个 systemd 单元的选项,它使用挂载命名空间的方式来将目录内容变成只读模式。基本上你总是可以让 `/usr` 运行在**只读模式**。这可以阻止一个被入侵的应用程序重写二进制文件,因为那可以在下次服务重启时,该服务依旧是被入侵的。
|
||||
|
||||
12、 降低服务权限(`CapabilityBoundingSet=CAP_CHOWN CAP_KILL`)。在内核中,特权服务被分解成一些列不同的权限。大多数服务不需要很多权限(如果需要一些的话),而 systemd 提供了一个简单的开关来从服务中剥离这些权限。
|
||||
|
||||
13、 如果服务不使用网络,那么你可以使用 `PrivateNetwork=yes` 来为该服务关闭网络功能。只需在服务的单元文件中开启该选项,就可以享受它带来的好处,关闭服务所有可用的网络。黑客常常并不是真的想破坏你的机器——他只是想用它作为攻击服务器来攻击其它机器。如果服务连不上网络,那么就不会受到攻击。
|
||||
|
||||
14、 控制服务可用的设备。 Systemd 提供了 `DeviceAllow` 配置,它控制了该服务可用的设备。`DeviceAllow=/dev/null rw` 将访问限制为 `/dev/null`,且仅可访问该设备节点,不允许对其它任何设备节点的访问。该功能实现于设备的 cgroup 控制器顶端。
|
||||
|
||||
15、 Systemd 系统即将迎来的一个新功能是 [`ProtectSystem Strict`][2],该功能可以开启所有这些命名空间以完全锁定服务运行的环境。
|
||||
|
||||
### “刚刚重获自由”
|
||||
|
||||
16、 不要使用没有运行着 SELinux([SEAndroid][11])强制模式的手机。幸运的是,我听说目前超过 90% 的安卓手机都运行着 SEAndroid 的强制模式,这真让我高兴。现在要是我们能让那些果粉们使用 SELinux 就好了。
|
||||
|
||||
17、 只从受信源安装软件。不要安装你从因特网找来的危险东西,对于你的手机、计算机系统、虚拟机以及容器等等也一样。
|
||||
|
||||
18、 我不会在我的手机上进行网上银行操作——我只在我的 Linux 计算机上做这事儿。如果黑客偷了我的信用卡,也许我就丢了那么 50 美元;而如果他黑进我的银行账户,那我丢的钱就会更多。我想我是个老古板。(“滚出我的地盘。”——那些老古板都会这样说。)
|
||||
|
||||
19、 我用我手机做的一件很酷的事情,就是设置让我的信用卡公司每次在我的信用卡消费时给我发送短信。那样的话,如果账号被盗,我会更快地知道。
|
||||
|
||||
20、 当你需要安全地通讯,请使用 [Signal 安全信息应用][12]。
|
||||
|
||||
### “搭个便车,格斯”
|
||||
|
||||
21、 在你的计算机系统上运行 Linux。当我第一次想用计算机联络我的父亲时,在他的计算机中毒前,我很少回家。我回去给他的系统安了个 Linux,而他从那以后就一直运行着它。我相信 Linux 大体上说是一个更加安全的系统,因为它的设计方式。而且我也相信这个桌面被黑的可能性也相对较小,因为用它的人相对较少。有些人或许要持反对意见了,他们会说 Windows 在过去几年中已经有了很大的改进了,但对于我而言,我仍然坚持己见。
|
||||
|
||||
22、 只运行那些有[安全响应团队][13]进行安全监管的发行版。企业软件及其重要。
|
||||
|
||||
23、 运行一个企业级内核。在容器中,单点故障往往是内核。如果你想要保证它安全,那么就使用一个企业级内核,即便它不是一个最新的版本,但也包含了最新的安全补丁。记住,最新的内核虽然带来了最新的安全补丁,但是它也带来了大量的新代码,这些代码可能存在漏洞。
|
||||
|
||||
### “你不要说太多”
|
||||
|
||||
24、 大多数非法入侵都是通过社会工程学实施的——例如,电子邮件链接、web 浏览器攻击,以及电话。对于此,最好的选择是接受相关教育,并且对一切留个心眼儿。没有哪个来自尼日利亚的家伙会给你钱,国税局也不会打电话到你家问你要钱。如果你电子邮件收到了来自你银行的电子邮件,里面包含有到某个网站的链接,那么不要直接去点击那个链接,在 web 浏览器中输入那个地址来打开。
|
||||
|
||||
25、 总是把你的系统打上最新的安全补丁。已知有安全漏洞以及过时的系统的数量十分可怕,脚本小子们依赖于你**不**更新系统。
|
||||
|
||||
26、 当连接到网络上的服务时,请始终使用 HTTPS。Chrome 和 Firefox 现在有个强制开启 HTTPS 的模式。到 2016 年为止,那些还不支持安全通讯的网站可能就不值得你们访问。
|
||||
|
||||
27、 在你的容器中使用 [seccomp][14],这会将攻击限制在内核之外,内核是个单点故障。限制什么进程可以具体讨论。
|
||||
|
||||
### “就把那钥匙丢下吧,李”
|
||||
|
||||
28、 使用 [YubiKey][15] 来存储私钥。
|
||||
|
||||
29、 加密你系统上的数据。至少对于笔记本而言,应该把**家目录**以及你的其它数据目录加密。几年前,我正乘坐在伦敦的地铁上,我的笔记本就成了某些人的目标——我下了车,车门关上了,而我发现我的笔记本不见了。此时,地铁已经驶出了站台。幸运的是,我把磁盘加密了。
|
||||
|
||||
30、 给你的所有网站用上 [Let's Encrypt][16] 吧,没有任何理由不再运行 HTTPS 了。
|
||||
|
||||
31、 绝不要在不同 web 服务器上使用相同的密码。虽然这个很难不落入陷阱,但是像 [Let's Encrypt][16] 这样的工具会有很大帮助。如果你使用 ssh 密钥来登录进系统,这会更好。
|
||||
|
||||
32、 使用双因素认证(2FA)。密码变得无关紧要,使用 Yubikey 以及诸如此类的工具可以使得双因素认证很方便,我们都有手机。在大脑中记一个密码,并在手机中生成一个密钥,总是比一个密码来得更好。
|
||||
|
||||
33、 网站总要我注册个帐号,没有比这更激怒我的事情了——我们就不能做得更好点?对于网站密码,始终都要使用密码生成工具来生成。我是个保守派:我使用 [Password Safe][17] 来生成密码,然后剪切粘贴到 web 浏览器中。我听说,其他人使用 [LastPass][18],或者其它整合在手机和 web 服务中的工具也用着不错。
|
||||
|
||||
34、 配置像 [FreeIPA][19] 之类的服务用于身份认证。使用像 [Kerberos][20] 之类的工具来认证和授权,会使得跟踪雇员及其对系统的访问更为简便(而且它也有很酷的加密服务)。使用活动目录也很不错,或许我有点偏颇。
|
||||
|
||||
35、 如果你经常输入密码,那就使用一个容易记忆的句子,而不是一个单词。我所偏好的用于记忆密码的方式,就是使用有几个单词并且易于输入的词组。
|
||||
|
||||
### “让自己自由”
|
||||
|
||||
36、 使用 [USBGuard][21] 来保护你的系统免遭流氓 USB 设备破坏。
|
||||
|
||||
37、 在过去几年中,我一直工作于容器方面,让我们来说说容器的安全吧。首先,让它们在开启强制模式的 SELinux 的系统中运行。如果你的系统不支持 SELinux,那就换个支持它的版本吧。SELinux 是使用文件系统来保护容器免遭破坏的最佳工具。
|
||||
|
||||
38、 如果可能,在容器中跑你的服务吧。我相信,使用 [OCI 镜像格式][22] 和 Linux 容器技术是应用的未来。用 [runC][23]、OCID、RKT、Systemd-nspawn 等等来启动这些容器。虽然我常常说“容器并不包容“,但是不要在容器外面运行这些服务更好一些。
|
||||
|
||||
39、 在虚拟机中运行容器。虚拟机提供比容器更好的隔离机制,在虚拟机中跑像容器之类的东西,更加灵活有弹性,并且互相隔离。
|
||||
|
||||
40、 在不同的虚拟机中,按不同的安全需求跑容器应用。你可以在 DMZ 中的虚拟机上跑 web 服务容器,而在 DMZ 外的虚拟机上跑数据容器。
|
||||
|
||||
41、 同时,记得在不同的物理机上跑需要最高安全性的虚拟机,并且容器放在不同虚拟机上(这也叫深度防护)(LCTT 译注:此处原文有误,根据理解修改)。
|
||||
|
||||
42、 以[只读模式][24]跑容器。开发环境中的容器需要能够写入到 `/usr`,但是生产环境中的容器只能写入到 `tmpfs`,并且将卷挂载到容器中。
|
||||
|
||||
43、 [降低容器权限][25]。不管是在容器中,还是在容器外,我们都以比它们所需的更多的“权限”跑它们的进程,你可以通过降低权限来让你的进程更加安全。
|
||||
|
||||
44、 [不要以 root 身份在容器中跑进程][26]。大多数服务都不需要 root 特权,或者它们需要该权限来绑定到低于 1024 的端口,然后切换到非 root 用户。我建议你始终以非 root 身份来跑应用。
|
||||
|
||||
45、 给你的容器打上最新的 CVE 补丁。使用像 OpenShift 这样的工具来构建并维护你的容器镜像是个不错的主意,因为它会在新的安全补丁出现时自动重构容器镜像。
|
||||
|
||||
46、 我的一个同事说 “Docker 就是用来在你的主机上以 root 身份运行来自因特网的随机代码的。”从一个受信源获取软件,不要抓取你在 docker.io 上随便找到的第一个 Apache 应用。[操作系统有重要关系][27]。
|
||||
|
||||
47、 在一台受限的容器化优化的主机上跑生产环境容器,例如在一台[原子主机][28]上,它开启了所有安全特性,为运行中的容器而优化,带有限制攻击层和原子级更新。有什么不喜欢的吗?
|
||||
|
||||
48、 使用像 [OpenScap][29] 这样的工具来扫描你系统的漏洞。糟糕的是,新的漏洞总是层出不穷,所以你得时刻更新你的扫描器。(也可以看看 [原子扫描][30],用于扫描你的容器。)
|
||||
|
||||
49、 OpenScap 也具有扫描[安全配置][31]的功能,如 STIG(安全技术部署指南)。
|
||||
|
||||
50、 为你孩子收到的所有那些圣诞物联网设备设置一个特别的客户网络。我钟爱我的 Amazon Echo,还有自动化灯以及电源开关(“Alexa,打开圣诞灯“),但是所有这些都是由可能存在安全问题的 Linux 操作系统控制。
|
||||
|
||||
### ”一定还有着另外 50 种免遭黑客侵害的方法“
|
||||
|
||||
你会为这个列表添加点什么呢?在下面的评论中告诉我们吧。
|
||||
|
||||
_Josh Bressers 对本文作出贡献。_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/walsh1.jpg?itok=JbZWFm6J)
|
||||
|
||||
Daniel J Walsh - Daniel Walsh 已经致力于计算机安全领域将近 30 年。Dan 在 2001 年 8 月份加入 Red Hat。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/yearbook-50-ways-avoid-getting-hacked
|
||||
|
||||
作者:[Daniel J Walsh][a]
|
||||
译者:[GOLinux](https://github.com/GOLinux)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/rhatdan
|
||||
[1]:http://danwalsh.livejournal.com/51459.html
|
||||
[2]:https://www.phoronix.com/scan.php?page=news_item&px=systemd-New-Protect-Tunables
|
||||
[3]:https://www.youtube.com/watch?v=0H5chfbcWtY
|
||||
[4]:http://syncstop.com/
|
||||
[5]:http://stopdisablingselinux.com/
|
||||
[6]:http://danwalsh.livejournal.com/71122.html
|
||||
[7]:http://danwalsh.livejournal.com/31146.html
|
||||
[8]:http://flatpak.org/
|
||||
[9]:http://danwalsh.livejournal.com/37404.html
|
||||
[10]:http://0pointer.de/blog/projects/security.html
|
||||
[11]:https://source.android.com/security/selinux/
|
||||
[12]:https://whispersystems.org/
|
||||
[13]:https://access.redhat.com/blogs/766093/posts/2695561
|
||||
[14]:https://lwn.net/Articles/656307/
|
||||
[15]:https://www.yubico.com/
|
||||
[16]:https://letsencrypt.org/
|
||||
[17]:https://pwsafe.org/
|
||||
[18]:https://www.lastpass.com/
|
||||
[19]:https://www.freeipa.org/page/Main_Page
|
||||
[20]:https://web.mit.edu/kerberos/
|
||||
[21]:https://github.com/dkopecek/usbguard
|
||||
[22]:https://www.opencontainers.org/
|
||||
[23]:https://runc.io/
|
||||
[24]:http://www.projectatomic.io/blog/2015/12/making-docker-images-write-only-in-production/
|
||||
[25]:http://rhelblog.redhat.com/2016/10/17/secure-your-containers-with-this-one-weird-trick/
|
||||
[26]:https://www.projectatomic.io/blog/2016/01/how-to-run-a-more-secure-non-root-user-container/
|
||||
[27]:https://opensource.com/16/12/yearbook-why-operating-system-matters
|
||||
[28]:https://access.redhat.com/articles/rhel-atomic-getting-started
|
||||
[29]:https://www.open-scap.org/
|
||||
[30]:https://developers.redhat.com/blog/2016/05/02/introducing-atomic-scan-container-vulnerability-detection/
|
||||
[31]:https://www.open-scap.org/security-policies/scap-security-guide/
|
@ -0,0 +1,329 @@
|
||||
使用 Axel 命令行下载器/加速器加速下载
|
||||
============================================================
|
||||
|
||||
[Axel][7] 是一个轻量级下载程序,它和其他加速器一样,对同一个文件建立多个连接,每个连接下载单独的文件片段以更快地完成下载。
|
||||
|
||||
Axel 支持 HTTP、HTTPS、FTP 和 FTPS 协议。它也可以使用多个镜像站点下载单个文件,所以,Axel 可以加速下载高达 40%(大约,我个人认为)。它非常轻量级,因为它没有依赖并且使用非常少的 CPU 和内存。
|
||||
|
||||
Axel 一步到位地将所有数据直接下载到目标文件(LCTT 译注:而不是像其它的下载软件那样下载成多个文件块,然后拼接)。
|
||||
|
||||
**注意**:不支持在单条命令中下载两个文件。
|
||||
|
||||
你还可以尝试其他命令行下载管理器/加速器。
|
||||
|
||||
* [aria2 - 超快速下载程序] [1]
|
||||
* [wget - 标准命令行下载程序] [2]
|
||||
* [curl - 命令行下载程序] [3]
|
||||
* [Linux 下的最好的 4 个命令行下载管理器/加速器] [4]
|
||||
|
||||
大多数发行版(Debian、Ubuntu、Mint、Fedora、suse、openSUSE、Arch Linux、Manjaro、Mageia 等)都有 axel 包,所以我们可以从发行版官方仓库轻松安装。对于 CentOS/RHEL,我们需要启用 [EPEL Repository][5]。
|
||||
|
||||
```
|
||||
[在 Debian/Ubuntu/LinuxMint 上安装 Axel]
|
||||
$ sudo apt-get install axel
|
||||
|
||||
[在 RHEL/CentOS 上安装 Axel]
|
||||
$ sudo yum install axel
|
||||
|
||||
[在 Fedora 上安装 Axel]
|
||||
$ sudo dnf install axel
|
||||
|
||||
[在 openSUSE 上安装 Axel]
|
||||
$ sudo zypper install axel
|
||||
|
||||
[在 Mageia 上安装 Axel]
|
||||
$ sudo urpmi axel
|
||||
|
||||
[在基于 Arch Linux 的发行版安装 Axel]
|
||||
$ sudo pacman -S axel
|
||||
```
|
||||
|
||||
#### 1) 下载单个文件
|
||||
|
||||
以下命令将从给定的 URL 下载文件并存储在当前目录中,下载文件时,我们可以看到文件的信息(建立的连接数、下载速度、下载进度、完成下载所花费的时间以及连接完成的时间)。
|
||||
|
||||
```
|
||||
# axel https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file owncloud-9.0.0.tar.bz2
|
||||
Starting download
|
||||
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 146.7KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 267.0KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 373.9KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 406.9KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 487.5KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 572.6KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 650.7KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 649.3KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 718.1KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 769.3KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 838.7KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 866.0KB/s]
|
||||
Connection 0 finished
|
||||
.
|
||||
.
|
||||
[ 99%] .......... .......... .......... .......... .......... [5721.0KB/s]
|
||||
Connection 2 finished
|
||||
[ 99%] .......... .......... .......... .......... .......... [5733.4KB/s]
|
||||
Connection 1 finished
|
||||
[ 99%] .......... .......... .......... .......... .......... [5745.4KB/s]
|
||||
[100%] .......... .......... .......... .......... ......
|
||||
|
||||
Downloaded 21.6 megabytes in 3 seconds. (5755.94 KB/s)
|
||||
```
|
||||
|
||||
#### 2) 用不同的名称保存文件
|
||||
|
||||
要使用其他名称来保存文件,启动下载时可以添加 `-o`(小写字母)选项和文件名。这里我们使用文件名 `owncloud.tar.bz2` 来保存文件。
|
||||
|
||||
```
|
||||
# axel -o cloud.tar.bz2 https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file cloud.tar.bz2
|
||||
Starting download
|
||||
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 143.0KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 264.1KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 309.8KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 406.3KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 495.4KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 586.3KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 673.1KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 647.1KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 721.1KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 781.3KB/s]
|
||||
Connection 2 finished
|
||||
.
|
||||
.
|
||||
Connection 0 finished
|
||||
[ 98%] .......... .......... .......... .......... .......... [6221.9KB/s]
|
||||
[ 98%] .......... .......... .....
|
||||
Connection 1 finished
|
||||
,,,,,,,,,, ,,,,,,,,,, ,,,,,..... .......... .......... [6145.6KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [6159.2KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [6172.0KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [5977.9KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [5989.6KB/s]
|
||||
[100%] .......... .......... .......... .......... ......
|
||||
|
||||
Downloaded 21.6 megabytes in 3 seconds. (6001.05 KB/s)
|
||||
```
|
||||
|
||||
#### 3) 限制下载速度
|
||||
|
||||
默认情况下 axel 以字节/秒为单位设置下载文件的最大速度。当我们的网络连接速度较慢时,可以使用此选项。只需添加 `-s` 选项,后面跟字节值。这里我们要限速 `512 KB/s` 下载一个文件。
|
||||
|
||||
```
|
||||
# axel -s 512000 https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file owncloud-9.0.0.tar.bz2
|
||||
Starting download
|
||||
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 141.5KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 266.1KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 308.0KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 405.9KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 496.7KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 526.4KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 507.0KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 505.6KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 504.8KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 503.9KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 503.4KB/s]
|
||||
.
|
||||
.
|
||||
[ 99%] .......... .......... .......... .......... .......... [ 497.0KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [ 496.9KB/s]
|
||||
[100%] .......... ..
|
||||
Connection 0 finished
|
||||
,,,,,,,,,, ,,.....
|
||||
Connection 1 finished
|
||||
Connection 3 finished
|
||||
,,,,,,,,,, ,,,,,,,... .......... .......... ......
|
||||
|
||||
Downloaded 21.6 megabytes in 44 seconds. (494.54 KB/s)
|
||||
```
|
||||
|
||||
#### 4) 限制连接数
|
||||
|
||||
axel 默认建立 4 个连接以从不同的镜像获取文件。此外,我们可以通过使用 `-n` 选项添加更多的连接,后跟连接数 `10` 来提高下载速度。保险起见,我们添加了十个连接,但不幸的是,它花了更多时间来下载文件。
|
||||
|
||||
```
|
||||
# axel -n 10 https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file owncloud-9.0.0.tar.bz2
|
||||
Starting download
|
||||
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 140.8KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 265.7KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 305.4KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 402.1KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 496.3KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 522.1KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 567.5KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 640.5KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 710.8KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 780.5KB/s]
|
||||
.
|
||||
.
|
||||
[ 98%] .......... .......... .......... .......... .......... [7544.9KB/s]
|
||||
[ 98%] .......... .......... .......... .......... .......... [7557.9KB/s]
|
||||
[ 98%] .......... .......... .......... .......... .......... [7570.4KB/s]
|
||||
[ 98%] .......... .......... .......... .......... .......... [7495.3KB/s]
|
||||
[ 99%] .......... .......... .......... .......... ......
|
||||
Connection 2 finished
|
||||
,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,.... [7311.6KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [7318.9KB/s]
|
||||
[ 99%] .......... .......... .......... .......... ..........
|
||||
Connection 9 finished
|
||||
,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, [7331.0KB/s]
|
||||
[ 99%] .......... .......... .......... ..........
|
||||
Connection 3 finished
|
||||
,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, .......... [4300.7KB/s]
|
||||
[100%] .......... .......... .......... .......... ......
|
||||
|
||||
Downloaded 21.6 megabytes in 5 seconds. (4109.41 KB/s)
|
||||
```
|
||||
|
||||
#### 5) 恢复未完成的下载
|
||||
|
||||
axel 默认具有恢复未完成的下载的行为。Axel 在下载文件时定期更新状态文件(扩展名为 `.st`)。由于某些原因,下载中途停止了?不用担心,只要使用相同的 axel 命令,它将会检查 `file` 和 `file.st`,如果找到,它会从停止处恢复下载。
|
||||
|
||||
```
|
||||
# axel https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file owncloud-9.0.0.tar.bz2
|
||||
Starting download
|
||||
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 140.8KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 265.7KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 305.4KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 402.1KB/s]
|
||||
[ 0%] .......... .......... .......... .......... .......... [ 496.3KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 522.1KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 567.5KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 640.5KB/s]
|
||||
[ 1%] .......... .......... .......... .......... .......... [ 710.8KB/s]
|
||||
[ 2%] .......... .......... .......... .......... .......... [ 780.5KB/s]
|
||||
.
|
||||
.
|
||||
[ 84%] .......... .......... .......... .......... .......... [7100.7KB/s]
|
||||
[ 84%] .......... .......... .......... .......... .......... [7104.3KB/s]
|
||||
[ 84%] .......... .......... .......... .^C
|
||||
|
||||
Downloaded 18.3 megabytes in 2 seconds. (7009.79 KB/s)
|
||||
```
|
||||
|
||||
上面的输出清晰地显示了在下载断开时有两个文件 `owncloud-9.0.0.tar.bz2` 和 `owncloud-9.0.0.tar.bz2.st`。当重新开始下载时,它会从停止处开始下载。
|
||||
|
||||
```
|
||||
# ls -lh
|
||||
total 19M
|
||||
-rw------- 1 root root 22M Dec 27 08:33 owncloud-9.0.0.tar.bz2
|
||||
-rw------- 1 root root 44 Dec 27 08:33 owncloud-9.0.0.tar.bz2.st
|
||||
|
||||
# axel https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file owncloud-9.0.0.tar.bz2
|
||||
State file found: 19180828 bytes downloaded, 3497380 to go.
|
||||
Starting download
|
||||
|
||||
,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,......... .......... [ 66.5KB/s]
|
||||
[ 84%] .......... .......... .......... .......... .......... [ 186.0KB/s]
|
||||
[ 85%] .......... .......... .......... .......... .......... [ 241.7KB/s]
|
||||
[ 85%] .......... .......... .......... .......... .......... [ 335.6KB/s]
|
||||
[ 85%] .......... .......... .......... .......... .......... [ 351.5KB/s]
|
||||
[ 85%] .......... .......... .......... .......... .......... [ 427.1KB/s]
|
||||
[ 85%] .......... .......... .......... .......... .......... [ 427.4KB/s]
|
||||
[ 86%] .......... .......... .......... .......... .......... [ 491.5KB/s]
|
||||
.
|
||||
.
|
||||
[ 98%] ...
|
||||
Connection 0 finished
|
||||
,,,....... .......... .......... .......... .......... [2106.6KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [2140.5KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [2172.4KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [2203.2KB/s]
|
||||
[ 99%] .......... .......... .......... .......... .......... [2236.2KB/s]
|
||||
[100%] .......... .......... .......... .......... ......
|
||||
|
||||
Downloaded 3415.4 kilobytes in 1 second. (2264.93 KB/s)
|
||||
```
|
||||
|
||||
#### 6) 不显示文件下载进度
|
||||
|
||||
如果你不想要看到文件的下载进度,只要在 axel 命令中加入 `-q` 选项。
|
||||
|
||||
```
|
||||
# axel -q https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
```
|
||||
|
||||
#### 7) 替换进度条
|
||||
|
||||
如果你不喜欢默认的进度条,你可以使用 `-a` 选项来替换进度条。
|
||||
|
||||
```
|
||||
# axel -a https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file owncloud-9.0.0.tar.bz2
|
||||
Starting download
|
||||
|
||||
[ 66%] [......0 ...1 ..........2 ...........3] [ 5.8MB/s] [00:01]^C
|
||||
|
||||
Downloaded 14.3 megabytes in 2 seconds. (5916.11 KB/s)
|
||||
```
|
||||
|
||||
我们中断了上面的下载,以便在下载文件时能清楚地显示替代进度条状态。一旦文件成功下载后,你可以看到相同的输出,如下所示。
|
||||
|
||||
```
|
||||
# axel -a https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
|
||||
File size: 22678208 bytes
|
||||
Opening output file owncloud-9.0.0.tar.bz2
|
||||
Starting download
|
||||
|
||||
Connection 2 finished ]
|
||||
Connection 1 finished ]
|
||||
Connection 3 finished ]
|
||||
Connection 0 finished ]
|
||||
|
||||
Downloaded 21.6 megabytes in 4 seconds. (5062.32 KB/s)
|
||||
```
|
||||
|
||||
#### 8) 了解关于 axel 的更多信息
|
||||
|
||||
如果你想要了解更多关于 axel 的选项,只需要进入它的手册。
|
||||
|
||||
```
|
||||
# man axel
|
||||
或者
|
||||
# axel --help
|
||||
```
|
||||
|
||||
享受吧。。。)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.2daygeek.com/axel-command-line-downloader-accelerator-for-linux/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.2daygeek.com/author/magesh/
|
||||
[1]:http://www.2daygeek.com/aria2-command-line-download-utility-tool/
|
||||
[2]:http://www.2daygeek.com/wget-command-line-download-utility-tool/
|
||||
[3]:http://www.2daygeek.com/aria2-command-line-download-utility-tool/
|
||||
[4]:https://linux.cn/article-8124-1.html
|
||||
[5]:https://linux.cn/article-2324-1.html
|
||||
[6]:http://www.2daygeek.com/author/magesh/
|
||||
[7]:https://axel.alioth.debian.org/
|
@ -0,0 +1,176 @@
|
||||
在 Linux 系统下使用 PhotoRec & TestDisk 工具来恢复文件
|
||||
============================================================
|
||||
|
||||
当你在系统中有意或无意地使用 `shift + delete` 组合键、删除选项,或是清空回收站的方式来删除一个文件时,该文件的内容并没有从硬盘(或是其它存储设备)上直接销毁。
|
||||
|
||||
它仅仅是从系统的目录结构中被移除,然后你在删除文件的目录下就看不到该文件了,但是这个文件仍然存在你磁盘中的某个位置上。
|
||||
|
||||
如果你有一个合适的工具和相关的专业知识,你就可以[从电脑中恢复已丢失的文件][1]。然而,随着你存储的文件越来越多,删除的文件将会被覆盖,你可能只能恢复最近删除的文件了。
|
||||
|
||||
在这篇文章中,我们将阐明如何在 Linux 系统中使用 **TestDisk** 来恢复硬盘上已删除或丢失的文件,它是非常优秀的修复工具,随一款免费的叫做 **PhotoRec** 的工具发布。
|
||||
|
||||
**PhoteRec** 工具用于从存储介质比如硬盘,数码相机和 cdrom 设备中恢复丢失的文件。(LCTT 译注:PhotoRec 的意思是 Photo Recovery,不是 Photo Recorder。)
|
||||
|
||||
### 在 Linux 系统中安装 TestDisk(PhotoRec)
|
||||
|
||||
在系统中执行以下相关的命令来安装 **TestDisk**:
|
||||
|
||||
```
|
||||
------- On Debian/Ubuntu/Linux Mint -------
|
||||
$ sudo apt-get install testdisk
|
||||
------- On CentOS/RHEL/Fedora -------
|
||||
$ sudo yum install testdisk
|
||||
------- On Fedora 22+ -------
|
||||
$ sudo dnf install testdisk
|
||||
------- On Arch Linux -------
|
||||
$ pacman -S testdisk
|
||||
------- On Gentoo -------
|
||||
$ emerge testdisk
|
||||
```
|
||||
|
||||
如果你的 Linux 系统仓库中没有这个安装包,可以从 [这里][2] 下载然后在 Live CD 中运行即可。
|
||||
|
||||
这个安装包也可以在应急修复 CD 工具中找到,比如 Gparted LiveCD 、 Parted Magic 、 Ubuntu Boot CD 、 Ubuntu-Rescue-Remix 及其它工具等。
|
||||
|
||||
安装完成之后,使用 root 账号权限打开文本窗口,启动 **PhotoRec**,并指定已删除文件的分区:
|
||||
|
||||
```
|
||||
$ sudo photorec /dev/sda3
|
||||
```
|
||||
|
||||
你将会看到下面的交互界面:
|
||||
|
||||
[
|
||||
![PhotoRec Data Recovery Tool for Linux](http://www.tecmint.com/wp-content/uploads/2017/01/PhotoRec-Data-Recovery-Tool.png)
|
||||
][3]
|
||||
|
||||
*Linux 系统 PhotoRec 数据恢复工具*
|
||||
|
||||
使用左右箭头选择菜单选项,按回车键确认。要继续恢复操作,选择 `[Proceed]` 并单击 Enter。
|
||||
|
||||
你将看到下面的界面:
|
||||
|
||||
[
|
||||
![Select Partition to Proceed File Recovery](http://www.tecmint.com/wp-content/uploads/2017/01/Select-Partition-to-Proceed-File-Recovery.png)
|
||||
][4]
|
||||
|
||||
*选择分区进行文件恢复*
|
||||
|
||||
选择 `[Options]` 来查看可用的恢复选项,如下图所示:
|
||||
|
||||
[
|
||||
![Linux File Recovery Options](http://www.tecmint.com/wp-content/uploads/2017/01/Linux-File-Recovery-Options.png)
|
||||
][5]
|
||||
|
||||
*Linux 系统文件恢复选项*
|
||||
|
||||
按 `Q` 返回,在下图界面,你可以指定你想要查询并恢复的文件扩展名。因此,选择 `[File Opt]`,按回车键确认。
|
||||
|
||||
按 `s` 来选择或取消选择所有的文件扩展名,如果你已经取消选择了所有的文件扩展名,只需要使用向右箭头选择你想要恢复的文件类型即可(或者按向左箭头取消选择)。
|
||||
|
||||
例如,我想恢复所有系统中丢失的 `.mov` 类型的文件:
|
||||
|
||||
[
|
||||
![Specify Recovery File Type](http://www.tecmint.com/wp-content/uploads/2017/01/Specify-Recovery-File-Type.png)
|
||||
][6]
|
||||
|
||||
*指定恢复文件类型*
|
||||
|
||||
按 `b` 键保存设置,之后你应该看到如下图所示信息。单击回车键返回(或者按 `Q` 键),再按 `Q` 键返回到主界面。
|
||||
|
||||
[
|
||||
![Save File Recovery Settings](http://www.tecmint.com/wp-content/uploads/2017/01/Save-File-Recovery-Settings.png)
|
||||
][7]
|
||||
|
||||
*保存文件恢复设置*
|
||||
|
||||
现在选择 `[Search]` 开始文件恢复。在下图中,选择存储文件分区的文件系统类型,然后按回车键。
|
||||
|
||||
[
|
||||
![Select Filesystem to Recover Deleted Files](http://www.tecmint.com/wp-content/uploads/2017/01/Select-Filesystem-to-Recover-Files.png)
|
||||
][8]
|
||||
|
||||
*选择文件系统类型来恢复删除的文件*
|
||||
|
||||
下一步,如下图所示,选择是仅对空闲空间还是整个分区进行分析。注意选择整个分区将会让操作过程变得更长更慢。选择合适的选项后,按回车键继续。
|
||||
|
||||
[
|
||||
![Choose Filesystem to Analyze](http://www.tecmint.com/wp-content/uploads/2017/01/Select-Filesystem-to-Analyze.png)
|
||||
][9]
|
||||
|
||||
*选择文件系统进行分析*
|
||||
|
||||
选择一个目录用于存储将要恢复的文件,选择完成之后,按 `C` 键继续。选择不同分区的目录,以避免当更多的文件存储在这个分区时覆盖掉已删除的文件。
|
||||
|
||||
按向左箭头返回到根分区下。
|
||||
|
||||
[
|
||||
![Select Directory to Save Recovered Files](http://www.tecmint.com/wp-content/uploads/2017/01/Select-Directory-to-Save-Recovered-Files.png)
|
||||
][10]
|
||||
|
||||
*选择要保存恢复文件的目录*
|
||||
|
||||
下图显示正在被恢复的指定类型的已删除文件。你可以按回车键来停止操作。
|
||||
|
||||
**注意**:在恢复的过程中,你的系统会变得很慢,很可能会卡住一段时间,请耐心等待直至恢复完成。
|
||||
|
||||
[
|
||||
![Recovering Deleted Files in Linux](http://www.tecmint.com/wp-content/uploads/2017/01/Recover-Deleted-Files-in-Linux.png)
|
||||
][11]
|
||||
|
||||
*在 Linux 系统中恢复已删除的文件*
|
||||
|
||||
最后, **Photorec** 工具将会显示出已恢复文件的数量及保存的路径。
|
||||
|
||||
[
|
||||
![Linux File Recovery Summary](http://www.tecmint.com/wp-content/uploads/2017/01/Linux-File-Recovery-Summary.png)
|
||||
][12]
|
||||
|
||||
*Linux 文件恢复情况汇总*
|
||||
|
||||
默认情况下,已恢复的文件将会以 root 账号权限保存,因此,你需要以提升权限的方式打开文件管理器来访问这些文件。
|
||||
|
||||
使用如下命令(指定你的文件管理器):
|
||||
|
||||
```
|
||||
$ gksudo nemo
|
||||
or
|
||||
$ gksudo nautilus
|
||||
```
|
||||
|
||||
想了解更多的信息,访问 PhotoRec 官网: [http://www.cgsecurity.org/wiki/PhotoRec][13]。
|
||||
|
||||
到此为止吧!在这篇文章中,我们阐明了使用 PhotoRec 工具来恢复磁盘中已删除或丢失文件每一个步骤。这是目前为止我使用过的最可靠和有效的恢复工具,如果你知道还有其它相似的工具,请在评论中跟大家分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是一个 Linux 系统及 F.O.S.S 爱好者,即将成为一名系统管理员及 Web 开发人员,他现在是 TecMint 网站的内容创建者,他喜欢使用电脑来工作,并且他坚信分享知识是一种美德。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/photorec-recover-deleted-lost-files-in-linux/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:https://linux.cn/article-7974-1.html
|
||||
[2]:http://www.cgsecurity.org/wiki/TestDisk_Download
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2017/01/PhotoRec-Data-Recovery-Tool.png
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2017/01/Select-Partition-to-Proceed-File-Recovery.png
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2017/01/Linux-File-Recovery-Options.png
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2017/01/Specify-Recovery-File-Type.png
|
||||
[7]:http://www.tecmint.com/wp-content/uploads/2017/01/Save-File-Recovery-Settings.png
|
||||
[8]:http://www.tecmint.com/wp-content/uploads/2017/01/Select-Filesystem-to-Recover-Files.png
|
||||
[9]:http://www.tecmint.com/wp-content/uploads/2017/01/Select-Filesystem-to-Analyze.png
|
||||
[10]:http://www.tecmint.com/wp-content/uploads/2017/01/Select-Directory-to-Save-Recovered-Files.png
|
||||
[11]:http://www.tecmint.com/wp-content/uploads/2017/01/Recover-Deleted-Files-in-Linux.png
|
||||
[12]:http://www.tecmint.com/wp-content/uploads/2017/01/Linux-File-Recovery-Summary.png
|
||||
[13]:http://www.cgsecurity.org/wiki/PhotoRec
|
@ -0,0 +1,247 @@
|
||||
在 Linux 中设置 sudo 的十条 sudoers 实用配置
|
||||
===================
|
||||
|
||||
在 Linux 和其他的类 Unix 操作系统中,只有 root 用户可以运行所有的命令,才能在系统中执行那些需要鉴权的操作,比如安装、升级和移除软件包、[创建用户和用户组][1]、修改系统重要的配置文件等等。
|
||||
|
||||
然而,系统管理员,比如说 root 用户,可以通过 [sudo 命令][2] 和一些配置选项来给普通用户进行授权,从而让该普通用户可以运行某些命令已经上述的那些相当重要的系统级操作。
|
||||
|
||||
另外,系统管理员还可以分享 root 用户密码 (这个做法是不值得提倡的),这样普通用户就可以通过 `su` 命令来转化为 root 用户角色。
|
||||
|
||||
`sudo` 允许已授权用户按照指定的安全策略、以 root 用户 (或者是其他的用户角色) 权限来执行某个命令。
|
||||
|
||||
1. `sudo` 会读取和解析 `/etc/sudoers` 文件,查找调用命令的用户及其权限。
|
||||
2. 然后提示调用该命令的用户输入密码 (通常是用户密码,但也可能是目标用户的密码,或者也可以通过 `NOPASSWD` 标志来跳过密码验证)。
|
||||
3. 这之后, `sudo` 会创建一个子进程,调用 setuid() 来切换到目标用户。
|
||||
4. 接着,它会在上述子进程中执行参数给定的 shell 或命令。
|
||||
|
||||
以下列出十个 `/etc/sudoers` 文件配置,使用 `Defaults` 项修改 sudo 命令的行为。
|
||||
|
||||
```
|
||||
$ sudo cat /etc/sudoers
|
||||
```
|
||||
|
||||
`/etc/sudoers` 文件:
|
||||
|
||||
```
|
||||
#
|
||||
# This file MUST be edited with the 'visudo' command as root.
|
||||
#
|
||||
# Please consider adding local content in /etc/sudoers.d/ instead of
|
||||
# directly modifying this file.
|
||||
#
|
||||
# See the man page for details on how to write a sudoers file.
|
||||
#
|
||||
Defaults env_reset
|
||||
Defaults mail_badpass
|
||||
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
Defaults logfile="/var/log/sudo.log"
|
||||
Defaults lecture="always"
|
||||
Defaults badpass_message="Password is wrong, please try again"
|
||||
Defaults passwd_tries=5
|
||||
Defaults insults
|
||||
Defaults log_input,log_output
|
||||
```
|
||||
|
||||
#### Defaults 项的类型
|
||||
|
||||
```
|
||||
Defaults parameter, parameter_list ### 对任意主机登录的所有用户起作用
|
||||
Defaults@Host_List parameter, parameter_list ### 对指定主机登录的所有用户起作用
|
||||
Defaults:User_List parameter, parameter_list ### 对指定用户起作用
|
||||
Defaults!Cmnd_List parameter, parameter_list ### 对指定命令起作用
|
||||
Defaults>Runas_List parameter, parameter_list ### 对以指定目标用户运行命令起作用
|
||||
```
|
||||
|
||||
在本文讨论范围内,我们下面的将以第一个 `Defaults` 作为基准来参考。parameter 参数可以是标记 (flags)、整数值或者是列表 (list)。
|
||||
|
||||
值得注意的是,标记 (flag) 是指布尔类型值,可以使用 `!` 操作符来进行取反,列表 (list) 有两个赋值运算符:`+=` (添加到列表) 和 `-=` (从列表中移除)。
|
||||
|
||||
```
|
||||
Defaults parameter
|
||||
或
|
||||
Defaults parameter=值
|
||||
或
|
||||
Defaults parameter -=值
|
||||
Defaults parameter +=值
|
||||
或
|
||||
Defaults !parameter
|
||||
```
|
||||
|
||||
### 1、 安置一个安全的 PATH 环境变量
|
||||
|
||||
该 `PATH` 环境变量应用于每个通过 `sudo` 执行的命令,需要注意两点:
|
||||
|
||||
1. 当系统管理员不信任 `sudo` 用户,便可以设置一个安全的 `PATH` 环境变量。
|
||||
2. 该设置将 root 的 PATH 和用户的 PATH 分开,只有在 `exempt_group` 组的用户不受该设置的影响。
|
||||
|
||||
可以添加以下内容来设置:
|
||||
|
||||
```
|
||||
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
|
||||
```
|
||||
|
||||
### 2、 允许 tty 用户会话使用 sudo
|
||||
|
||||
该设置允许在一个真实的 tty 中进行调用 `sudo`,但不允许通过 cron 或者 cgi-bin 脚本等方法来调用。添加以下内容来设置:
|
||||
|
||||
```
|
||||
Defaults requiretty
|
||||
```
|
||||
|
||||
### 3、 使用 pty 运行 sudo 命令
|
||||
|
||||
少数情况下,攻击者可以通过 sudo 来运行一个恶意程序 (比如病毒或者恶意代码),这种恶意程序可能会分叉出一个后台运行的进程,即使主程序完成执行,它仍能够运行在用户的终端设备上。
|
||||
|
||||
为了防止出现这样的情况,你可以通过 `use_pty` 参数来设置 `sudo` 使用伪终端来运行其他命令,而不必管 I/O 日志的开启状态。如下:
|
||||
|
||||
```
|
||||
Defaults use_pty
|
||||
```
|
||||
|
||||
### 4、 创建 sudo 日志文件
|
||||
|
||||
默认下,`sudo` 通过 syslog(3) 来记录到日志。但是我们可以通过 `logfile` 参数来指定一个自定义的日志文件。如下:
|
||||
|
||||
```
|
||||
Defaults logfile="/var/log/sudo.log"
|
||||
```
|
||||
|
||||
使用 `log_host` 和 `log_year` 参数可以对应记录日志主机名和 4 位数年份到自定义日志文件。如下:
|
||||
|
||||
```
|
||||
Defaults log_host, log_year, logfile="/var/log/sudo.log"
|
||||
```
|
||||
|
||||
下面是自定义 sudo 日志文件的例示:
|
||||
|
||||
[![Create Custom Sudo Log File](http://www.tecmint.com/wp-content/uploads/2017/01/Create-Sudo-Log-File.png)][3]
|
||||
|
||||
*创建 sudo 日志文件*
|
||||
|
||||
### 5、 记录 sudo 命令的输入/输出
|
||||
|
||||
`log_input` 和 `log_output` 参数可以让 `sudo` 命令运行在伪终端,并可以对应地记录所有的用户输入和输出到屏幕上。
|
||||
|
||||
默认的 I/O 日志目录为 `/var/log/sudo-io`,如果存在会话序列号,它将被存储到该目录。你可以通过 `iolog_dir` 参数来指定一个目录。
|
||||
|
||||
```
|
||||
Defaults log_input, log_output
|
||||
```
|
||||
|
||||
这其中支持转义字符,像 `%{seq}` —— 以 36 为基数的单调递增序列,比如 000001,这里每两个数字都分别用来形成一个新目录。请看下边例示 00/00/01:
|
||||
|
||||
```
|
||||
$ cd /var/log/sudo-io/
|
||||
$ ls
|
||||
$ cd 00/00/01
|
||||
$ ls
|
||||
$ cat log
|
||||
```
|
||||
|
||||
[![Log sudo Input Output](http://www.tecmint.com/wp-content/uploads/2017/01/Log-sudo-Input-Output.png)][4]
|
||||
|
||||
*记录 sudo 命令的输入/输出*
|
||||
|
||||
[cat 命令][5] 来查看该目录的其余部分。
|
||||
|
||||
### 6、 为 sudo 用户提示命令用法
|
||||
|
||||
如下,使用 `lecture` 参数可以在系统中为 `sudo` 用户提示命令的用法:
|
||||
|
||||
参数属性值有三个选择:
|
||||
|
||||
1. `always` – 一直提示
|
||||
2. `once` – 用户首次运行 sudo 时提示 (未指定参数属性值时的默认值)
|
||||
3. `never` – 从不提示
|
||||
|
||||
```
|
||||
Defaults lecture="always"
|
||||
```
|
||||
|
||||
此外,你还可以使用 `lecture_file` 参数类自定义提示内容,在指定的文件中输入适当的提示内容即可:
|
||||
|
||||
```
|
||||
Defaults lecture_file="/path/to/file"
|
||||
```
|
||||
|
||||
[![Lecture Sudo Users](http://www.tecmint.com/wp-content/uploads/2017/01/Lecture-Sudo-Users.png)][6]
|
||||
|
||||
*为 sudo 用户提示命令用法*
|
||||
|
||||
### 7、 输入错误的 sudo 密码是显示自定义信息
|
||||
|
||||
当某个用户输错密码时,会有一个对应的信息显示在屏幕上。默认是“抱歉,请重新尝试。(sorry, try again)”,你可以通过 `badpass_message` 参数来修改该信息:
|
||||
|
||||
```
|
||||
Defaults badpass_message="Password is wrong, please try again"
|
||||
```
|
||||
|
||||
### 8、 增加 sudo 密码尝试限制次数
|
||||
|
||||
`passwd_tries` 参数用于指定用户尝试输入密码的次数。
|
||||
|
||||
默认为 3。
|
||||
|
||||
```
|
||||
Defaults passwd_tries=5
|
||||
```
|
||||
|
||||
[![Increase Sudo Password Attempts](http://www.tecmint.com/wp-content/uploads/2017/01/Increase-Sudo-Password-Attempts.png)][7]
|
||||
|
||||
*增加 sudo 密码尝试限制次数*
|
||||
|
||||
使用 `passwd_timeout` 参数设置密码超时 (默认为 5 分钟),如下:
|
||||
|
||||
```
|
||||
Defaults passwd_timeout=2
|
||||
```
|
||||
|
||||
### 9、 在输错密码时让 sudo 羞辱用户
|
||||
|
||||
使用了 `insults` 参数之后,一旦你输出了密码,sudo 便会在命令窗口中显示羞辱你的信息。这个参数会自动关闭 `badpass_message` 参数。
|
||||
|
||||
```
|
||||
Defaults insults
|
||||
```
|
||||
|
||||
[![Let's Sudo Insult You When Enter Wrong Password](http://www.tecmint.com/wp-content/uploads/2017/01/Sudo-Insult-Message.png)][8]
|
||||
|
||||
*在输错密码时让 sudo 羞辱用户*
|
||||
|
||||
### 10、 更多关于 sudo 的配置
|
||||
|
||||
此外,欲了解更多 sudo 命令的配置,请自行阅读:[su 与 sudo 的差异以及如何配置 sudo][9]。
|
||||
|
||||
文毕。你也可以在评论区分享其他有用的 sudo 配置或者 [Linux 技巧][10]。
|
||||
|
||||
---------------------------------------------------------------------
|
||||
|
||||
作者简介:Aaron Kili 是一名 Linux 和 F.O.S.S 忠实拥护者、高级 Linux 系统管理员、Web 开发者,目前在 TecMint 是一名活跃的博主,热衷于计算机并有着强烈的只是分享意愿。
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
译者简介:[GHLandy](http://GHLandy.com) —— 欲得之,则为之奋斗 (If you want it, work for it.)。
|
||||
|
||||
![GHLandy](http://GHLandy.com/images/GHLandy.ico)
|
||||
|
||||
---------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/add-users-in-linux/
|
||||
[2]:http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2017/01/Create-Sudo-Log-File.png
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2017/01/Log-sudo-Input-Output.png
|
||||
[5]:http://www.tecmint.com/13-basic-cat-command-examples-in-linux/
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2017/01/Lecture-Sudo-Users.png
|
||||
[7]:http://www.tecmint.com/wp-content/uploads/2017/01/Increase-Sudo-Password-Attempts.png
|
||||
[8]:http://www.tecmint.com/wp-content/uploads/2017/01/Sudo-Insult-Message.png
|
||||
[9]:http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/
|
||||
[10]:http://www.tecmint.com/tag/linux-tricks/
|
@ -0,0 +1,86 @@
|
||||
CentOS 与 Ubuntu:哪个更适合做服务器?
|
||||
============================================================
|
||||
|
||||
![](https://thishosting.rocks/wp-content/uploads/2017/01/centos-vs-ubuntu.jpg.webp)
|
||||
|
||||
已经决定买一台虚拟服务器,但还不能决定使用哪个 Linux 发行版?我们都经历过这种困扰。对于 Linux 发行版来说,要在这么多的发行版和种种支流(flavors)中选择一个,那简直能让人崩溃。不过,对于服务器而言,有两个主流的 Linux 发行版,那就是 CentOS 和 Ubuntu。但如何从这两个之中选择,这是摆在管理员、初学者和专业人士面前的主要问题。在对这两个(和更多)发行版有了一定的经验之后,我们决定对这两个发行版用于服务器时做个比较。
|
||||
|
||||
### 概览
|
||||
|
||||
| ![CentOS](https://thishosting.rocks/wp-content/uploads/2017/01/centos-logo-50.png.webp) CentOS | ![Ubuntu](https://thishosting.rocks/wp-content/uploads/2017/01/ubuntu-logo-50.png.webp) Ubuntu |
|
||||
| --- | --- |
|
||||
| 基于 Red Hat Linux Enterprise | 基于 Debian |
|
||||
| 更新频度较少 | 经常更新 |
|
||||
| 更稳定和更安全一些,因为不经常更新。 | 更新的软件包可能不稳定,不安全?不会,因为他们在发布到正式版本前进行了大量测试。 |
|
||||
| 没有足够的教程和用户群较少(LCTT 译注:可能是由于国内外情况不同,在国内,相对 Ubuntu 来说,人们更喜欢用 CentOS 做服务器) | 丰富的文档,活跃的社区和大量的在线教程|
|
||||
| 对初学者困难,因为基于 Red Hat 桌面发行版不流行 | 更容易为已经熟悉桌面版 Ubuntu 的初学者使用|
|
||||
| 支持 cPanel | 不支持 cPanel |
|
||||
| .rpm 软件包和 “yum” 软件包管理器 | .deb 软件包和 “apt-get” 软件包管理器 |
|
||||
| 在 [DigitalOcean][1] 免费试用 CentOS 服务器 | 在[DigitalOcean][2] 免费试用 Ubuntu 服务器 |
|
||||
|
||||
### 哪个更适合新手?
|
||||
|
||||
Ubuntu。
|
||||
|
||||
一如往常那样,它主要取决于你的需求和以前的经验,但一般来说,Ubuntu 对于初学者来说是更好的选择。主要是因为这两个原因:
|
||||
|
||||
* Ubuntu 有一个庞大的社区,随时可以免费提供帮助。我指的是真正的大。数以千计的用户分布在数百个不同的在线论坛和兴趣组内。甚至有现实生活中的大会。你也可以为 CentOS 找到很多教程和帮助,特别是对于简单的 LAMP 栈和流行的应用程序而言。
|
||||
* Ubuntu 服务器对于以前使用过 Ubuntu 桌面的人来说会容易得多。同样的情况也存在于 CentOS 和 Fedora 之间,但是 Ubuntu 桌面版比任何其他基于 Linux 的家用桌面更受欢迎。
|
||||
|
||||
所以,如果你是一个初学者,而且没有任何特殊要求,那就去使用 Ubuntu 服务器。 更好的是,你可以从一个[便宜的托管服务提供商][4]那购买服务,这样你就可以在你的服务器上进行实验,还有一个[专业的 24/7 支持团队][7]准备好帮助你。
|
||||
|
||||
### 哪个更适合商用?
|
||||
|
||||
CentOS。
|
||||
|
||||
同样,你仍然可以使用 Ubuntu 作为商用网站或公司内部服务器,但 CentOS 有它的优势:
|
||||
|
||||
* CentOS(可以说)更稳定以及更安全。由于 CentOS 的更新频率较低,这意味着软件测试的时间更长,并且只有真正稳定的版本才会得到发布。如果你使用 CentOS,你不会因新的有 bug 的应用程序版本而遇到任何稳定性问题,因为你不会得到那个新的有 bug 的版本。
|
||||
* 大多数控制面板(包括最受欢迎的控制面板 - cPanel)仅支持 CentOS。所以这意味着如果你是一个网站托管公司,或者如果你是一个有很多客户的网站服务代理商,并且需要一个控制面板 - CentOS 是一个更好的选择。
|
||||
|
||||
### 尝试一下它们并选择一个
|
||||
|
||||
如果你还是不能决定,你可以免费试试它们。你可以在本地安装或使用 live 镜像。你还可以从 [Vultr][6] 和 [DigitalOcean][7] 这样的地方买到便宜的 VPS($5/月)。你可以在几秒钟内启动 CentOS/Ubuntu 服务器。当你通过推广链接(如我们的)注册,你可能会得到免费金额 - 这意味着你会真的可以免费试用。
|
||||
|
||||
### 哪个更快?
|
||||
|
||||
它们在速度方面是相同的。它们和运行在你自己的硬件上一样快。它们将如你配置的一样快。不管怎样,你都应该正确配置并且保护所有的服务器、配置和应用程序。
|
||||
|
||||
你会使用哪个发行版?想告诉我们你是哪个发行版的拥趸么?请随时留下评论。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
**文末评论**
|
||||
|
||||
W. Anderson:
|
||||
|
||||
> 我的大多数 Linux 服务器部署都是针对企业客户的,所以我对文章作者以 GUI 客户端版本来反映任何服务器的管理功能感到困惑。通常,许多服务提供商也会在 CentOS、Ubuntu,或经常部署的 OpenSuse Leap 和 FreeBSD 10+ 服务器操作系统上提供 WebMin、VirtualAdmin 或类似工具作为控制面板,即使是在虚拟专用服务器(VPS)环境中。
|
||||
|
||||
> CentOS 在许多商业应用以及高级网络/虚拟化和云计算环境方面具有明显优于 Ubuntu 的优势,并且 CentOS 充分利用 SELinux 框架用于加强的安全层,而目前在 Ubuntu 中则不可用(或不容易)。
|
||||
|
||||
> 这种类型的比较通常是多余的,因为几乎总是有特定的和细微的要求,和需要服务器实现的需求,这将决定哪个发行版具有更多的优势或用途 - 基于技术专家/托管公司的专业知识和广泛的经验。
|
||||
|
||||
VAN DER BEKEN:
|
||||
|
||||
> 正确的比较应该是对 Debian 和 CentOS 进行比较。
|
||||
|
||||
> 以我的经验,我使用 CentOS 和 Debian 作为服务器,稍微偏爱 Debian 一点点,因为它的社区。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://thishosting.rocks/centos-vs-ubuntu-server/
|
||||
|
||||
作者:[W. Anderson][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://thishosting.rocks/centos-vs-ubuntu-server/
|
||||
[1]:https://thishosting.rocks/go/digitalocean/
|
||||
[2]:https://thishosting.rocks/go/digitalocean/
|
||||
[3]:https://thishosting.rocks/how-to-choose-web-hosting/
|
||||
[4]:https://thishosting.rocks/best-cheap-managed-vps/
|
||||
[5]:https://thishosting.rocks/support/
|
||||
[6]:https://thishosting.rocks/go/vultr/
|
||||
[7]:https://thishosting.rocks/go/digitalocean/
|
@ -0,0 +1,32 @@
|
||||
是时候抛弃 Skype 和 TeamSpeak 了, Discord 为 Linux 用户发布了应用
|
||||
============================================================
|
||||
|
||||
### 程序已经在 Ubuntu Linux 和其他发行版上可用了
|
||||
|
||||
在 2016 年 1 月 11 日发布的一则非常简短的声明中,[Discord][1] 公司发布了首个 Linux 平台的稳定版本,它是一款给玩家开发的流行、免费的、安全一体化的语音和文字聊天程序。
|
||||
|
||||
Linux 是他们补足全平台(桌面设备和移动设备)服务支持的缺失的一块。Discord 目前可用于 Android、iOS、Mac和 Windows,但你也可以使用兼容的网络浏览器直接在网络上使用它。
|
||||
|
||||
该应用程序似乎是微软 Skype VoIP 客户端,以及著名的 TeamSpeak 语音通信平台的直接竞争对手。它提供了广泛的功能,包括 IP 和 DDoS 保护,游戏内叠加,智能推送通知,单独音量控制,支持多个通道和现代化的文字聊天。
|
||||
|
||||
Discord 其他值得注意的功能包括支持编解码器、权限和自定义键盘快捷键、直接消息系统和朋友列表。它还承诺尽可能减少 CPU 使用率,为音频和自动故障转移功能提供低延迟支持。
|
||||
|
||||
### 在 Ubuntu 上安装 Discord
|
||||
|
||||
官方 Discord 的第一个 Linux 稳定版本(版本 0.0.1)目前以二进制软件包[提供][2],支持 Debian 和基于 Ubuntu 的发行版(例如 Ubuntu、Debian、Linux Mint 等)。但是要安装它,你需要一个 64位系统。
|
||||
|
||||
如果你没有运行一个基于 Debian 或 Ubuntu 的操作系统,还有一个源码 tarball 可供下载,但你必须自行编译它。目前 Discord 0.0.1 已经进入 Arch Linux AUR 仓库了,并且很快也会到 Solus 中。其他发行版可能在未来几周内向其仓库添加 Discord。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://news.softpedia.com/news/it-s-time-to-ditch-skype-and-teamspeak-discord-launches-its-app-for-linux-users-511753.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]:https://discordapp.com/
|
||||
[2]:https://discordapp.com/download
|
@ -0,0 +1,100 @@
|
||||
3 个针对高级用户的 Vim 编辑器实用技巧
|
||||
============================================================
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/vim-featured.jpg "3 Useful VIM Editor Tips and Tricks for Advanced Userss")
|
||||
|
||||
这篇文章是[ Vim 用户指南][12]系列文章中的一篇:
|
||||
|
||||
* [Vim 初学者入门指南][3]
|
||||
* [Vim 快捷键速查表][4]
|
||||
* [5 个针对有经验用户的 Vim 技巧][4]
|
||||
* 3 个针对高级用户的 Vim 编辑器实用技巧
|
||||
|
||||
毫无疑问, Vim 是一个很强大的文本编辑器。它提供了大量的特性,这意味着学习并记住 Vim 的所有功能实际上是不可能的。但是我们至少可以不断学习简单的方法来完成事情,从而随着时间的增长,我们使用编辑器的经验将会变得更好。
|
||||
|
||||
请记住,在这篇文章中我们将讨论的一些 Vim 编辑器技巧是针对高级用户的。
|
||||
|
||||
**注**:如果你是第一次接触 Vim,你可以首先阅读我们的[入门指南][14]。对于已经使用过 Vim 编辑器的用户,我确信[ Vim 快捷键速查表][15]将会对你很有帮助。如果你已经是一名有经验的用户,你可能对[一些针对有经验用户的技巧][16]比较感兴趣。
|
||||
|
||||
请注意文中提到的所有技巧绝大多数都是在简单、易于理解的代码环境中进行阐述的,因为它们在软件开发中确实很实用。但这并不意味着普通用户(非程序员、没有把 Vim 作为一般的文本编辑器)在他们的工作中用不到。
|
||||
|
||||
### 1、为文件设置特定的变量
|
||||
|
||||
有时候,在一个特定文件中,你可能想把输入的制表符用空格代替,或者想要把源代码文件使用两个空格缩进,即便编辑器的默认缩进是四个空格。
|
||||
|
||||
基本上我们在这儿讨论对针对文件的的更改。 Vim 提供的这个特性允许你对一个指定的文件更改特定的设置。这个特性叫做 “模式行(Modeline)” 。
|
||||
|
||||
比如,如果你想把输入的每一个制表符(Tab)用空格代替,那么你只需要在文件的前几行或最后几行加入下面的模式行:
|
||||
|
||||
```
|
||||
# vim: set expandtab:
|
||||
```
|
||||
|
||||
如果想把默认缩进从 4 个空格变成 2 个空格,可以在源文件中添加下面的模式行:
|
||||
|
||||
```
|
||||
// vim: noai:ts=2:sw=2
|
||||
```
|
||||
|
||||
在使用模式行时,请记住下面这几个重要的点:
|
||||
|
||||
* 模式行只能添加在文件中的前五行或者最后五行。
|
||||
* 为了使用模式行这个特性,必须在 `.vimrc` 文件中添加 `:set modeline` 。
|
||||
* 在以 root 用户身份对文件进行编辑的时候该特性失效。
|
||||
|
||||
了解更多的信息,请阅读该特性的[官方文档][17]。
|
||||
|
||||
### 2、 关键字补全
|
||||
|
||||
当你开始写的复杂代码越来越多或者开始在一个大的源文件上编辑时,你会遇到一些变量名字。有时,要记住所有的变量名字不太容易,所以当需要输入变量名字的时候,你通常从已经使用过的地方复制过来。
|
||||
|
||||
幸运的是,使用 Vim 你只需要输入变量的几个起始字母即可。在’插入模式’中,按 `Ctrl + n` 或者 `Ctrl + p` 可以得到一个匹配的关键词列表。 `Ctrl + n` 用来插入下一个匹配词; `Ctrl + p` 给出一个之前匹配的关键词列表。
|
||||
|
||||
下图是该特性的一个展示:
|
||||
|
||||
![vim-keyword-completion1](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/vim-keyword-completion1.jpg "vim-keyword-completion1")
|
||||
|
||||
正如上面的屏幕截图清晰展示的那样,列表中也会出现其他源文件中包含的词。关于该特性的更多信息,请访问[这儿][18]。
|
||||
|
||||
### 3、 搜索
|
||||
|
||||
假设你正在调试代码,其中一个需要做的工作是快速查看一个变量在一个文件中所有出现的地方。一个常用的方法是退出‘插入模式’,输入 `/[变量名字]` 命令,按回车 ,然后返回‘插入模式’,使用 `n` 和 `p` 在关键字之间导航。
|
||||
|
||||
上面讲到的这种方法没毛病,但是还有一种更简单、更快捷的方法可以来完成这样的搜索。使用这种方法,首先你需要退出‘插入模式’,然后把光标移动到你想要搜索的词/变量下面,这并不费时。接下来,你只需要按 `Shift + *` 即可。
|
||||
|
||||
重复这样做,然后编辑器将会带你找到在文件中所有使用了这个词/变量的地方。
|
||||
|
||||
### 结论
|
||||
|
||||
尽管是针对高级用户,但文章中讨论的这些技巧并不难理解,也比较容易使用。如果你具有一定的基础,那么你能够从中获益很多。不必多说,无论是任何新特性或观念,你需要勤于练习这些技巧才能够把它们变成一种习惯。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/vim-tips-tricks-advanced-users/
|
||||
|
||||
作者:[Himanshu Arora][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.maketecheasier.com/author/himanshu/
|
||||
[1]:https://www.maketecheasier.com/author/himanshu/
|
||||
[2]:https://www.maketecheasier.com/vim-tips-tricks-advanced-users/#respond
|
||||
[3]:https://www.maketecheasier.com/start-with-vim-linux/
|
||||
[4]:https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/
|
||||
[5]:https://www.maketecheasier.com/vim-tips-tricks-for-experienced-users/
|
||||
[6]:https://www.maketecheasier.com/category/linux-tips/
|
||||
[7]:http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-tips-tricks-advanced-users%2F
|
||||
[8]:http://twitter.com/share?url=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-tips-tricks-advanced-users%2F&text=3+Useful+VIM+Editor+Tips+and+Tricks+for+Advanced+Users
|
||||
[9]:mailto:?subject=3%20Useful%20VIM%20Editor%20Tips%20and%20Tricks%20for%20Advanced%20Users&body=https%3A%2F%2Fwww.maketecheasier.com%2Fvim-tips-tricks-advanced-users%2F
|
||||
[10]:https://www.maketecheasier.com/opt-out-google-personalized-ads/
|
||||
[11]:https://www.maketecheasier.com/wi-fi-vs-ethernet-vs-4g/
|
||||
[12]:https://www.maketecheasier.com/series/vim-user-guide/
|
||||
[13]:https://support.google.com/adsense/troubleshooter/1631343
|
||||
[14]:https://www.maketecheasier.com/start-with-vim-linux/
|
||||
[15]:https://www.maketecheasier.com/vim-keyboard-shortcuts-cheatsheet/
|
||||
[16]:https://www.maketecheasier.com/vim-tips-tricks-for-experienced-users/
|
||||
[17]:http://vim.wikia.com/wiki/Modeline_magic
|
||||
[18]:http://vim.wikia.com/wiki/Any_word_completion
|
@ -0,0 +1,96 @@
|
||||
让 sudo 在你输入错误的密码时“嘲讽”你
|
||||
============================================================
|
||||
|
||||
**sudoers** 是 Linux 中的默认 sudo 安全策略插件,但是经验丰富的系统管理员可以自定义安全策略以及输入输出日志记录的插件。它由 `/etc/sudoers` 这个文件驱动,或者也可在 LDAP 中。
|
||||
|
||||
你可以在上面的文件中定义 **sudoers** <ruby>嘲讽<rt>insults</rt></ruby> 或其他选项。它在 `defaults` 部分下设置。请阅读我们的上一篇文章[在 Linux 中设置 `sudo` 时 10 个有用的 sudoers 配置][1]。
|
||||
|
||||
在本文中,我们将解释一个 sudoers 配置参数,以允许个人或系统管理员设置 [sudo 命令][2],当系统用户输入错误密码时“嘲讽”他们。
|
||||
|
||||
首先打开文件 `/etc/sudoers`,如下所示:
|
||||
|
||||
```
|
||||
$ sudo visudo
|
||||
```
|
||||
|
||||
进入 `defaults` 部分,并添加下面的行:
|
||||
|
||||
```
|
||||
Defaults insults
|
||||
```
|
||||
|
||||
下面是我系统中 `/etc/sudoers` 默认展示的 `defaults` 部分。
|
||||
|
||||
[
|
||||
![Set sudo Insults Parameter](http://www.tecmint.com/wp-content/uploads/2017/01/Set-sudo-Insults-Parameter.png)
|
||||
][3]
|
||||
|
||||
*设置 sudo insults 参数*
|
||||
|
||||
从上面的截图中,你可以看到 `defaults` 中还有许多其他默认值定义,例如,每次用户输入错误的密码时发送邮件到 root、设置安全路径、配置自定义 sudo 日志文件等。
|
||||
|
||||
保存并关闭文件。
|
||||
|
||||
运行 `sudo` 命令并输入错误的密码,然后观察 insults 选项是如何工作的:
|
||||
|
||||
```
|
||||
$ sudo visudo
|
||||
```
|
||||
[
|
||||
![sudo Insult in Action](http://www.tecmint.com/wp-content/uploads/2017/01/How-sudo-Insult-Works.png)
|
||||
][4]
|
||||
|
||||
*实践 sudo insult*
|
||||
|
||||
**注意**:当配置 insults 参数时,它会禁用 `badpass_message` 参数,该参数在用户输入错误的密码时,会在命令行中输出特定的消息(默认消息为 “**sorry, try again**”)。
|
||||
|
||||
要修改该消息,请将 `badpass_message` 参数添加到 `/etc/sudoers` 文件中,如下所示。
|
||||
|
||||
```
|
||||
Defaults badpass_message="Password is wrong, please try again" #try to set a message of your own
|
||||
```
|
||||
[
|
||||
![Set sudo badpassword Message](http://www.tecmint.com/wp-content/uploads/2017/01/Set-sudo-badpassword-Message.png)
|
||||
][5]
|
||||
|
||||
*设置 sudo 错误密码消息*
|
||||
|
||||
保存并关闭文件,然后调用 `sudo` 查看它是如何工作的,你设置的 `badpass_message` 消息会在每次你或任何系统用户输入错误的密码的时候打印出来。
|
||||
|
||||
```
|
||||
$ sudo visudo
|
||||
```
|
||||
[
|
||||
![Sudo badpassword Message](http://www.tecmint.com/wp-content/uploads/2017/01/sudo-badpassword-Message.png)
|
||||
][6]
|
||||
|
||||
*sudo 密码错误消息*
|
||||
|
||||
就是这样了,在本文中,我们回顾了如何在用户输入错误的密码时将 `sudo` 设置为显示嘲讽。请通过下面的评论栏分享你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin、web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
via: http://www.tecmint.com/sudo-insult-when-enter-wrong-password/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/
|
||||
[2]:http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2017/01/Set-sudo-Insults-Parameter.png
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2017/01/How-sudo-Insult-Works.png
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2017/01/Set-sudo-badpassword-Message.png
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2017/01/sudo-badpassword-Message.png
|
@ -0,0 +1,31 @@
|
||||
你现在可以下载包含所有风味的 Ubuntu 16.10 的单独 ISO 镜像了
|
||||
======================================
|
||||
Linux AIO 开发商 Željko Popivoda 通知说可以下载 Linux AIO(All-in-One)Ubuntu 16.10 Live DVD 了,该 DVD 包含所有主要的 Ubuntu 16.10 风味(flavor)版本。
|
||||
|
||||
如果你梦想有一个可以写在 USB 或 DVD 光盘上的单独 ISO 镜像,然后在需要时启动某个 Ubuntu Linux 操作系统(如 Ubuntu、Kubuntu、Xubuntu、Lubuntu 或者 Ubuntu MATE),现在你就可以用 Linux AIO Ubuntu 16.10 做到了。
|
||||
|
||||
[Linux AIO][1] 团队以开发这种完全免费的多发行版 ISO 镜像而闻名,而 Linux AIO Ubuntu 16.10 有两个版本,分别用于 64 位和 32 位平台,里面有 Ubuntu 16.10、Kubuntu 16.10、Xubuntu 16.10、Lubuntu 16.10、Ubuntu MATE 16.10 和 Ubuntu GNOME 16.10。
|
||||
|
||||
这些都是未修改的官方发行版。Linux AIO 团队把它们都放在一个易于使用的单一容器中,例如,当你在客户那,你需要向他/她展示各种基于 Linux 的操作系统来选择,你就不必带来六个不同的 U 盘或 DVD 光盘。
|
||||
|
||||
### 包含了硬件和内存测试工具
|
||||
|
||||
两种 Linux AIO Ubuntu 16.10 都附带两个重要的实用程序,即 HDT(硬件检测工具),用于查看目标计算机上是否与各个同 Ubuntu 16.10 流派完全兼容,还有 Memtest86+,这是一个非常流行的命令行工具,用于测试系统内存错误并验证其完整性。
|
||||
|
||||
[Linux AIO Ubuntu 16.10 现在可以下载了][2],但请记住,由于托管文件的 SourceForge 服务器的存储限制,镜像被分为两个 .7z 存档,你需要下载并解压缩以获取可用的 ISO。
|
||||
|
||||
我们曾经被许多读者问过 Linux AIO Live DVD 是否支持 UEFI ,答案仍然是没有,但是团队正在努力实现未来对 UEFI 的支持。还请查看最近发布的 Linux AIO Ubuntu Mixture 2017.01。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://news.softpedia.com/news/you-can-now-have-a-single-iso-image-with-all-essential-ubuntu-16-10-flavors-exclusive-511788.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://linuxaio.net/
|
||||
[2]:http://linux.softpedia.com/get/Linux-Distributions/Ubuntu-AIO-DVD-103429.shtml
|
@ -0,0 +1,99 @@
|
||||
给 Linux 新手的最佳发行版
|
||||
============================================================
|
||||
|
||||
![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/distros-new-users.jpg?itok=Prp88H71)
|
||||
|
||||
Jack Wallen 为来自不同环境的新手们挑选出专门为他们设计的发行版。[CC0][5]社区。
|
||||
|
||||
一个很古老的问题,找到适合的 Linux 发行版比简单的指出哪种 Linux 版本受欢迎更重要。为什么这么说?
|
||||
|
||||
让我们设置一个情景:你有一位用户,很有可能,他过去大多数时候都是在 Windows 或者 Mac 系统上工作,他们想让你给他们一个选择的替代品。现在,你想要在很短的时间里直截了当的说明 Linux 系统的工作方式并突出它的强大性和灵活性。
|
||||
|
||||
但是,请记住,最重要的一个方面是他们必须能够 _get it_,即开箱即用。
|
||||
|
||||
这就是为什么我们经常需要花费时间来找出哪种版本是最适合新手的 -- 因为把新手们带入 Linux 系统是传播 Linux 并增加 Linux 用户的最好方式。
|
||||
|
||||
对于新手来说最好的版本是什么?这次,我将要花费一定时间来说明对于来自不同环境的用户哪种版本才是最适合的。此外,你也可以查看我在 [2017 最好的发行版][11]中列出的发行版。
|
||||
|
||||
### 从 Windows 7 到 Linux:ZorinOS
|
||||
|
||||
当 Windows 8 发布以后,有一个理由让如此多的用户依然坚持使用 Windows 7, 那就是熟悉度。用户们已经在相同的桌面环境上工作了十几年,他们不想转移到 Windows 8 这种更以触摸屏为主的平台上。所以,你会去选择哪种版本呢?你首先必须要考虑的是桌面环境。为什么?因为这是你能够立刻吸引上这些 Windows 7 用户的地方。对于这个任务,还有什么版本会比 [ZorinOS][13] 更好呢?
|
||||
|
||||
ZorinOS 就是专门作为 Windows 和 Mac 系统的替代品而设计的,所以它下了很大的功夫来模仿 Windows 和 Mac 桌面的外观和感觉。事实上,除了 ZorinOS 以外,你很难找到一个别的 Linux 版本,能够完美的从 Windows 7 转移到 Linux 系统上,同时保留 Linux 系统如此强大、灵活的平台。
|
||||
|
||||
除了桌面环境(图片 1)以外, 因为 ZorinOS 完全基于 Ubuntu 系统,所以在其“外表”下面, ZorinOS 和 Ubuntu 以同样的方式工作(所以基本不用去担心硬件不能够被检测到)。同时伴有已经就绪的软件,你便有了针对来自 Windows 7 用户的最完美的 Linux 版本。
|
||||
|
||||
![ZorinOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/zorinos.jpg?itok=i970f1Id "ZorinOS")
|
||||
|
||||
*图片 1:类 Windows 7 的 ZorinOS 桌面,准备开始服务。[使用许可][1]*
|
||||
|
||||
请注意:然而, ZorinOS 有两个版本: Zorin Ultimate 和 Zorin Core 。 Zorin Core 是免费的,但它不包含几乎所有你能够在 Zorin Ultimate 中找到的软件。如果你想要一个适合于所有来自 Windows 7 用户的开箱即用的版本,那么我强烈推荐购买 [Zorin Ultimate][14](大约需要花费 20 美元)。当然,如果你不想花钱购买 Ultimate 版本,你也可以从 Core 版本包含的软件包管理工具中安装几乎所有你需要的东西。
|
||||
|
||||
### 从 Windows 8 到 Linux : Ubuntu GNOME
|
||||
|
||||
让我们来看看 Windows 8, 它带来了一个以触摸屏为中心的环境,改变了用户与电脑互动的方式。老式的启动菜单、面板、系统托盘桌面已经被触摸屏环境界面所取代。如果你正在找一个能给 Linux 新手们带来不同体验的最好环境,同时功能也要是最好的,那么没有比 [Ubuntu GNOME][16] 更合适的了。
|
||||
|
||||
Ubuntu GNOME 是 Ubuntu 和 GNOME(图 2)这两个世界之间最好的融合。用一个现代、优雅、简洁并且用户友好的桌面代替了 Unity 界面, 因此 Ubuntu GNOME 不会给任何来自 Windows 8 的用户造成太多的麻烦。该版本不仅基于最新的长期支持版的 Ubuntu 发行版(支持期会很长),同时使用了 GNOME 桌面的最新稳定版本 - 这意味着用户将能够享受到难以置信的稳定体验。
|
||||
|
||||
![Ubuntu GNOME](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ubuntugnome.jpg?itok=SNjA3y7T "Ubuntu GNOME")
|
||||
|
||||
*图片 2 :在 Ubuntu GNOME 中可以发现,在优雅而又简洁。 [使用许可][2]*
|
||||
|
||||
### 从 Mac 到 Linux : Elementary OS
|
||||
|
||||
毫无疑问,这一场的绝对赢家是 [Elementary OS][17]。尽管 Elementary OS 在外观和感觉上所达到的效果和 OS X 桌面非常相似,但实际还有更多优秀的地方。 Elementary OS 同样是基于 Linux 系统的,只不过是它采取了很多 Mac X 桌面的设计元素。
|
||||
|
||||
任何的 Mac 用户使用 Elementary OS 的桌面环境(图片 3)都会感觉就像是“在家一样”(使用 Mac 一样)。伴有如此熟悉的文档,同时包含一个熟悉的应用菜单, Elementary OS 总是位于我的‘最佳发行版列表’的顶部。如果我们正在和 Mac 用户讨论迁移,那么没有比 Elementary OS 更好的 Mac 替代品了。
|
||||
|
||||
![Elementary OS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/elementaryos.jpg?itok=qaXRClRM "Elementary OS")
|
||||
|
||||
*图片 3 :Elementary OS 桌面的荣耀。[使用许可][3]*
|
||||
|
||||
有一件事情 Mac 用户们将会非常感激,那就是 Elementary OS 的开发者们很好的保持了桌面的一致性。从 dock, 到面板、菜单、到包括的应用,你找不到任何一个看起来或感觉没有归属感的单一元素。
|
||||
|
||||
我将在这儿说一个关于 Elementary OS 的预警。你需要安装一个好的浏览器(因为它自带安装的 Epiphany-a 浏览器没有得到许多常用站点的支持),同时,你需要从官方的 [LibreOffice 网站][18]下载安装包来安装 LibreOffice (因为在 Elementary OS 的软件中心找到的安装包已经有些过时了)。
|
||||
|
||||
### 从 Android 到 Linux:Ubuntu
|
||||
|
||||
这似乎有点像是一个延伸话题,但考虑到 Android 在全球市场中占主导地位,所以你可能遇到一个来自以移动设备为中心的用户,他可能需要一个 Linux 桌面,从而让他一直感觉像是‘在家’一样。对于我来说, [Ubuntu][19] 是最显然的赢家。为什么?和其他系统相比, Ubuntu Unity 在桌面上做出了很杰出的工作,它使得桌面感觉像是一个包罗万象的界面。如果你愿意,那么可以包含在线搜索结果(默认情况下禁用),这是在几乎每个移动环境中均可找到的东西。同样, Unity HUD 菜单系统(图片 4)是在任何界面系统中所能找到的最独一无二的菜单系统之一。通过 Unity HUD 菜单系统,用户可以更少的依赖鼠标(就像他们过去在 Android 支持的移动设备上工作一样)。
|
||||
|
||||
![Ubuntu Unity](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ubuntu.jpg?itok=HsvBJAIN "Ubuntu Unity")
|
||||
|
||||
*图片 4: 使用中的 Unity HUD 。[使用许可][4]*
|
||||
|
||||
当然, Ubuntu 也提供了市场上最稳定的桌面平台,所以用户体验近乎完美。
|
||||
|
||||
### 总有一款 Linux 发行版适合你
|
||||
|
||||
有一件很重要的事情需要记住,那就是总有一款 Linux 发行版适合你。但是对于那些来自特殊环境的人,我强烈推荐找到一个最喜爱的 Linux 版本,从而能够帮助他们无缝过渡。给自己一个机会尝试一下,看看你是否可以轻松体验到开源和 Linux 的强大。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/news/best-linux-distributions-new-users
|
||||
|
||||
作者:[JACK WALLEN][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.linux.com/users/jlwallen
|
||||
[1]:https://www.linux.com/licenses/category/used-permission
|
||||
[2]:https://www.linux.com/licenses/category/used-permission
|
||||
[3]:https://www.linux.com/licenses/category/used-permission
|
||||
[4]:https://www.linux.com/licenses/category/used-permission
|
||||
[5]:https://www.linux.com/licenses/category/creative-commons-zero
|
||||
[6]:https://www.linux.com/files/images/zorinosjpg
|
||||
[7]:https://www.linux.com/files/images/ubuntugnomejpg
|
||||
[8]:https://www.linux.com/files/images/elementaryosjpg-1
|
||||
[9]:https://www.linux.com/files/images/ubuntujpg
|
||||
[10]:https://www.linux.com/files/images/distros-new-usersjpg
|
||||
[11]:https://www.linux.com/news/learn/sysadmin/best-linux-distributions-2017
|
||||
[12]:http://bit.ly/2jJgK0Q
|
||||
[13]:https://zorinos.com/
|
||||
[14]:https://zorinos.com/download/#ultimate
|
||||
[15]:https://training.linuxfoundation.org/certification/lfcs?utm_source=linux-inline-ad&utm_campaign=new-users-2017&utm_medium=online-advertising&utm_content=new-year
|
||||
[16]:https://ubuntugnome.org/
|
||||
[17]:https://elementary.io/
|
||||
[18]:http://www.libreoffice.org/download/libreoffice-fresh/
|
||||
[19]:https://www.ubuntu.com/
|
@ -0,0 +1,231 @@
|
||||
Linux I/O 重定向基础
|
||||
============================================================
|
||||
|
||||
Linux 管理的一个最重要并且[有趣的话题][4]是 I/O 重定向。此功能在命令行中使你能够将命令的输入输出取自或送到文件中,或者可以使用管道将多个命令连接在一起以形成所谓的“**命令管道**”。
|
||||
|
||||
我们运行的所有命令基本上产生两种输出:
|
||||
|
||||
- 命令结果 - 程序产生的数据,以及
|
||||
- 程序状态和错误消息,用来通知用户程序的执行细节。
|
||||
|
||||
在 Linux 和其他类 Unix 系统中,有三个默认文件(名称如下),这些文件也由 shell 使用文件描述符号标识:
|
||||
|
||||
- stdin 或 0 - 它连接键盘,大多数程序从此文件读取输入。
|
||||
- stdout 或 1 - 它连接屏幕,并且所有程序将其结果发送到此文件
|
||||
- stderr 或 2 - 程序将状态/错误消息发送到此文件,它也连接到屏幕上。
|
||||
|
||||
因此,I/O 重定向允许你更改命令的输入源以及将输出和错误消息发送到其他地方。这可以通过 `<` 和 `>` 重定向操作符来实现。
|
||||
|
||||
### 如何在 Linux 中重定向标准输出到文件中
|
||||
|
||||
如下面的示例所示,你可以重定向标准输出,这里,我们要存储 [top 命令][5]的输出以供以后检查:
|
||||
|
||||
```
|
||||
$ top -bn 5 >top.log
|
||||
```
|
||||
|
||||
其中标志的含义:
|
||||
|
||||
- `-b` - 让 `top` 以批处理模式运行,以便你可以将其输出重定向到一个文件或另一个命令。
|
||||
- `-n` - 指定命令终止前的迭代次数。
|
||||
|
||||
你可以使用 [cat 命令][6]来查看 `top.log` 文件的内容:
|
||||
|
||||
```
|
||||
$ cat top.log
|
||||
```
|
||||
|
||||
要将命令输出**附加**在文件后面,请使用 `>>` 操作符。
|
||||
|
||||
例如,要将 [top 命令][7]的输出追加在上面的 `top.log` 文件中,特别是在脚本(或命令行)中,请输入下面的那行:
|
||||
|
||||
```
|
||||
$ top -bn 5 >>top.log
|
||||
```
|
||||
|
||||
**注意**: 也可以使用文件描述符数字,上面的重定向命令等同于:
|
||||
|
||||
```
|
||||
$ top -bn 5 1>top.log
|
||||
```
|
||||
|
||||
### 如何在 Linux 中重定向标准错误到文件中
|
||||
|
||||
要重定向命令的标准错误,你需要明确指定文件描述符 `2`,以便让 shell 了解你正在尝试做什么。
|
||||
|
||||
例如,下面的 [ls 命令][8]将在没有 root 权限的普通系统用户执行时产生错误:
|
||||
|
||||
```
|
||||
$ ls -l /root/
|
||||
```
|
||||
|
||||
你可以重定向标准错误到文件中:
|
||||
|
||||
```
|
||||
$ ls -l /root/ 2>ls-error.log
|
||||
$ cat ls-error.log
|
||||
```
|
||||
|
||||
[
|
||||
![Redirect Standard Error to File](http://www.tecmint.com/wp-content/uploads/2017/01/Redirect-Standard-Error-in-Linux.png)
|
||||
][9]
|
||||
|
||||
*重定向标准错误到文件中*
|
||||
|
||||
为了将标准错误附加在文件后,使用下面的命令:
|
||||
|
||||
```
|
||||
$ ls -l /root/ 2>>ls-error.log
|
||||
```
|
||||
|
||||
### 如何重定向标准输出及标准错误到一个文件中
|
||||
|
||||
还可以将命令的所有输出(包括标准输出和标准错误)捕获到单个文件中。这可以用两种可能的方式,通过指定文件描述符来完成:
|
||||
|
||||
1、 第一种是相对较旧的方法,其工作方式如下:
|
||||
|
||||
```
|
||||
$ ls -l /root/ >ls-error.log 2>&1
|
||||
```
|
||||
|
||||
上面的命令意思是 shell 首先将 [ls 命令][10]的输出发送到文件 `ls-error.log`(使用 `>ls-error.log`),然后将所有写到文件描述符 `2`(标准错误)的错误消息重定向到文件 `ls-error.log`(使用`2>&1`)中。(LCTT 译注:此处原文有误,径改。)这表示标准错误也被发送到与标准输出相同的文件中。
|
||||
|
||||
|
||||
2、 第二种并且更直接的方法是:
|
||||
|
||||
```
|
||||
$ ls -l /root/ &>ls-error.log
|
||||
```
|
||||
|
||||
你也可以这样将标准输出和标准错误附加到单个文件后:
|
||||
|
||||
```
|
||||
$ ls -l /root/ &>>ls-error.log
|
||||
```
|
||||
|
||||
### 如何将标准输入重定向到文件中
|
||||
|
||||
大多数(如果不是全部)命令从标准输入获得其输入,并且标准输入默认连接到键盘。
|
||||
|
||||
要从键盘以外的文件重定向标准输入,请使用 `<` 操作符,如下所示:
|
||||
|
||||
```
|
||||
$ cat <domains.list
|
||||
```
|
||||
|
||||
[
|
||||
![Redirect Standard Input to File](http://www.tecmint.com/wp-content/uploads/2017/01/Redirect-Standard-Input-to-File.png)
|
||||
][11]
|
||||
|
||||
*重定向文件到标准输入中*
|
||||
|
||||
### 如何重定向标准输入/输出到文件中
|
||||
|
||||
你可以如下在 [sort 命令中][12] 同时执行标准输入、标准输出的重定向:
|
||||
|
||||
```
|
||||
$ sort <domains.list >sort.output
|
||||
```
|
||||
|
||||
### 如何使用管道进行 I/O 重定向
|
||||
|
||||
要将一个命令的输出重定向为另一个命令的输入,你可以使用管道,这是用于构建复杂操作命令的有力方法。
|
||||
|
||||
|
||||
例如,以下命令将[列出最近修改的前五个文件][13]。
|
||||
|
||||
```
|
||||
$ ls -lt | head -n 5
|
||||
```
|
||||
|
||||
选项的意思是:
|
||||
|
||||
- `-l` - 启用长列表格式
|
||||
- `-t` - [最新修改的文件][1]首先显示
|
||||
- `-n` - 指定要显示的标题行数
|
||||
|
||||
### 构建管道的重要命令
|
||||
|
||||
在这里,我们将简要回顾一下构建命令管道的两个重要命令,它们是:
|
||||
|
||||
`xargs` 用于从标准输入构建和执行命令行。下面是使用 `xargs` 的管道示例,此命令用于[将文件复制到 Linux 中的多个目录][14]:
|
||||
|
||||
```
|
||||
$ echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh
|
||||
```
|
||||
|
||||
[
|
||||
![Copy Files to Multiple Directories](http://www.tecmint.com/wp-content/uploads/2017/01/Copy-Files-to-Multiple-Directories.png)
|
||||
][15]
|
||||
|
||||
*复制文件到多个目录*
|
||||
|
||||
选项含义:
|
||||
|
||||
- `-n 1` - 让 `xargs` 对每个命令行最多使用一个参数,并发送到 [cp命令][2]
|
||||
- `cp` - 复制文件
|
||||
- `-v` - [显示 `cp` 命令的进度][3]。
|
||||
|
||||
有关更多的使用选项和信息,请阅读 `xargs` 手册页:
|
||||
|
||||
```
|
||||
$ man xargs
|
||||
```
|
||||
|
||||
`tee` 命令从标准输入读取,并写入到标准输出和文件中。我们可以演示 `tee` 如何工作:
|
||||
|
||||
```
|
||||
$ echo "Testing how tee command works" | tee file1
|
||||
```
|
||||
[
|
||||
![tee Command Example](http://www.tecmint.com/wp-content/uploads/2017/01/tee-command-example.png)
|
||||
][16]
|
||||
|
||||
*tee 命令示例*
|
||||
|
||||
[文件或文本过滤器][17]通常与管道一起用于[有效地操作 Linux 文件][18],来以强大的方式来处理信息,例如命令的重组输出(这对于[生成有用的 Linux 报告][19]是必不可少的)、修改文件中的文本和其他的 [Linux 系统管理任务][20]。
|
||||
|
||||
要了解有关 Linux 过滤器和管道的更多信息,请阅读这篇文章[查找前十个访问 Apache 服务器的 IP 地址][21],这里展示了使用过滤器和管道的一个例子。
|
||||
|
||||
在本文中,我们解释了 Linux 中 I/O 重定向的基本原理。请通过下面的反馈栏分享你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin、web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/linux-io-input-output-redirection-operators/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/find-and-sort-files-modification-date-and-time-in-linux/
|
||||
[2]:http://www.tecmint.com/progress-monitor-check-progress-of-linux-commands/
|
||||
[3]:http://www.tecmint.com/monitor-copy-backup-tar-progress-in-linux-using-pv-command/
|
||||
[4]:http://www.tecmint.com/how-to-setup-and-configure-static-network-routing-in-rhel/
|
||||
[5]:http://www.tecmint.com/12-top-command-examples-in-linux/
|
||||
[6]:http://www.tecmint.com/13-basic-cat-command-examples-in-linux/
|
||||
[7]:http://www.tecmint.com/12-top-command-examples-in-linux/
|
||||
[8]:http://www.tecmint.com/tag/linux-ls-command/
|
||||
[9]:http://www.tecmint.com/wp-content/uploads/2017/01/Redirect-Standard-Error-in-Linux.png
|
||||
[10]:http://www.tecmint.com/15-basic-ls-command-examples-in-linux/
|
||||
[11]:http://www.tecmint.com/wp-content/uploads/2017/01/Redirect-Standard-Input-to-File.png
|
||||
[12]:http://www.tecmint.com/sort-command-linux/
|
||||
[13]:http://www.tecmint.com/find-recent-modified-files-in-linux/
|
||||
[14]:http://www.tecmint.com/copy-file-to-multiple-directories-in-linux/
|
||||
[15]:http://www.tecmint.com/wp-content/uploads/2017/01/Copy-Files-to-Multiple-Directories.png
|
||||
[16]:http://www.tecmint.com/wp-content/uploads/2017/01/tee-command-example.png
|
||||
[17]:http://www.tecmint.com/linux-file-operations-commands/
|
||||
[18]:http://www.tecmint.com/linux-file-operations-commands/
|
||||
[19]:http://www.tecmint.com/linux-performance-monitoring-and-file-system-statistics-reports/
|
||||
[20]:http://www.tecmint.com/automating-linux-system-administration-tasks/
|
||||
[21]:http://www.tecmint.com/find-top-ip-address-accessing-apache-web-server/
|
@ -0,0 +1,97 @@
|
||||
为你在 Bash 历史中执行过的每一项命令设置时间和日期
|
||||
============================================================
|
||||
|
||||
在默认情况下,所有通过 Bash 在命令行中执行过的命令都被存储在历史缓存区或者一个叫做 `~/.bash_history` 的文件里。这意味着系统管理员可以看到系统上用户执行过的命令清单,或者用户可以通过像 [history 命令][1]这样的选项来看他或她自己的命令历史。
|
||||
```
|
||||
$ history
|
||||
```
|
||||
[
|
||||
![Linux History Command](http://www.tecmint.com/wp-content/uploads/2017/01/Linux-History-Command.png)
|
||||
][2]
|
||||
|
||||
*Linux 历史命令*
|
||||
|
||||
从上面 [history 命令][3]的输出可知,命令被执行的日期和时间并没有显示出来。基本上所有的 Linux 发行版的默认设置都是这样的。
|
||||
|
||||
在这篇文章里,我们将解释当在 Bash 中执行 `history` 命令显示每个命令时,如何配置显示时间戳信息。
|
||||
|
||||
每个命令相关的日期和时间可以记录到历史文件中,用 `HISTTIMEFORMAT` 环境变量的设置作为命令历史的备注记录。
|
||||
|
||||
这里有两种可行的方式来达到目的:一种是暂时的效果,一种是永久的效果。
|
||||
|
||||
要临时设置 `HISTTIMEFORMAT` 环境变量,在命令行这样输出它:
|
||||
|
||||
```
|
||||
$ export HISTTIMEFORMAT='%F %T'
|
||||
```
|
||||
|
||||
在上面的输出命令当中,时间戳格式如下:
|
||||
|
||||
1、`%F`-展开为完整日期,即 `%Y-%m-%d`(年-月-日)。
|
||||
|
||||
2、`%T`-展开为时间,即 `%H:%M:%S`(时:分:秒)。
|
||||
|
||||
通读 [date 命令][4]的 man 手册来获得更多使用说明:
|
||||
|
||||
```
|
||||
$ man date
|
||||
```
|
||||
|
||||
然后如下检查你的命令历史:
|
||||
|
||||
```
|
||||
$ history
|
||||
```
|
||||
[
|
||||
![Display Linux Command History with Date and Time](http://www.tecmint.com/wp-content/uploads/2017/01/Set-Date-and-Time-on-Linux-Commands-History.png)
|
||||
][5]
|
||||
|
||||
*显示带有日期和时间的 Linux 命令历史。*
|
||||
|
||||
(LCTT 译注:注意:这个功能只能用在当 HISTTIMEFORMAT 这个环境变量被设置之后,之后的那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令,都将会显示成设置 HISTTIMEFORMAT 变量的时间。)
|
||||
|
||||
然而,如果你想永久地配置该变量,用你最喜欢的编辑器打开文件 `~/.bashrc`。
|
||||
|
||||
```
|
||||
$ vi ~/.bashrc
|
||||
```
|
||||
|
||||
然后在下方添加(用注释将其标记为你自己的配置):
|
||||
|
||||
```
|
||||
# 我的配置
|
||||
export HISTTIMEFORMAT='%F %T'
|
||||
```
|
||||
|
||||
保存文件并退出,然后,运行下面的命令以便改动当即生效:
|
||||
|
||||
```
|
||||
$ source ~/.bashrc
|
||||
```
|
||||
|
||||
就是这些!请通过下方的评论区来与我们分享一些有趣的历史命令的小技巧以及你对这篇文章的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/7badddbc53297b2e8ed7011cf45df0c0?s=128&d=blank&r=g)
|
||||
|
||||
我是 Ravi Saive,TecMint 的创建者。一个爱在网上分享的技巧和提示的电脑极客和 Linux 专家。我的大多数服务器运行在名为 Linux 的开源平台上。请在 Twitter、 Facebook 和 Google 等上关注我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/display-linux-command-history-with-date-and-time/
|
||||
|
||||
作者:[Ravi Saive][a]
|
||||
译者:[Hymantin](https://github.com/Hymantin)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/admin/
|
||||
[1]:http://www.tecmint.com/history-command-examples/
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2017/01/Linux-History-Command.png
|
||||
[3]:http://www.tecmint.com/history-command-examples/
|
||||
[4]:http://www.tecmint.com/sort-ls-output-by-last-modified-date-and-time/
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2017/01/Set-Date-and-Time-on-Linux-Commands-History.png
|
@ -0,0 +1,45 @@
|
||||
RISC-V,微处理器中的 Linux :它会开启一个开源硬件的文艺复兴么?
|
||||
============================================================
|
||||
|
||||
![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/riscv2-1122x812.png)
|
||||
|
||||
|
||||
我与许多人分享过一个愿景,我们很快就能使用由开源硬件([OSH][1])和开源软件所驱动的现代而强大的设备。
|
||||
|
||||
开放硬件是那种有完整的文档,并且可以根据你的需求自由使用、研究、修改和复制的设备。它从原理图到 PCB 布局的所有内容全都是公开的,包括驱动硬件的软件。近年来有所进步,有更多的硬件被开放了,但是我们的 PC 和其它设备中的微处理器却被限制在了桌面端的以 x86 为主导的、封闭的指令集架构([ISA][2]),或者智能手机/平板设备上的 ARM 变体。这两个指令集架构都是闭源的,并且不能用于开放设备。此外,许多广泛使用的 ARM 实现,比如 A9 或 Snapdragon 在这些已经专有的指令集架构上添加了进一步的专有层。
|
||||
|
||||
[RISC-V][3] 是不同的。在加州大学伯克利分校的研究人员于 2010 年推出的 RISC-V(发音 risk-five)是根据同样的初始 [RISC][4](精简指令集计算(Reduced Instruction Set Computing)) CPU 设计构建的,其基础是其它熟悉的指令集架构,如 ARM、MIPS、PowerPC 和 SPARC,但目的是开放且不受专利保护(注意:目前,RISC-V 规范仅供私人或教育用途使用,计划在将来完全开放)。RISC 设计策略与 x86 系列的复杂指令集计算(CISC)设计相反。
|
||||
|
||||
虽然 RISC-V 不是现有唯一的开放指令集架构,但它是唯一一个极速推进的。指导指令集架构的开发和采用的 RISC-V 基金会有一些相当大的捐赠者,如 Oracle、Western Digital、HP、Google、IBM 和 Nvidia。我可以看到名单上缺少的几个著名的芯片制造商。似乎大的玩家们已经意识到,与软件一样,硬件会在开放下发展得更快更好。而且,任何人使用它你都不必付费。因为开发中的困难和成本,像这样的项目并没有被更快取得成功。现在,一个公开的结果是大的公司正在跟进,开发资金正在源源而来。
|
||||
|
||||
RISC-V 在学术界也有很多支持。从在伯克利的孵化到在世界范围内超过 35 个大学项目协助其发展,在那里不缺乏聪明的头脑为这个项目工作。
|
||||
|
||||
在其背后也有进展。在软件方面,人们正在将程序移植到 RISC-V 上,让它启动起来。Fedora 已经移植了成千上万的程序 - 下面是 [Fedora/RISC-V][5] 在 QEMU 中启动:
|
||||
|
||||
![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/booting-500x664.gif)
|
||||
|
||||
*向 Richard WM Jones 做出这么棒的动画致敬*
|
||||
|
||||
在硬件方面,人们正在制造开发板。HiFive1 是一个成功众筹的项目,它是来自 SiFive 的一块 Arduino 板,由他们的 FE310 SoC 驱动,这是一块 32 位的 RISC-V 芯片,运行频率为 320+ MHz。 它会在 2 月发货,你可以[在这里][6]预订一个,价格为 $59。
|
||||
|
||||
![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/si5-640x457.jpg)
|
||||
|
||||
这一切听起来很棒 - 我希望他们能够交付,因为我们都将从中受益非浅。如果可以,请支持这个项目。告诉人们这个东西。购买一块 HiFive1,看看它上面运行了什么。我在你的未来看到了这些芯片。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.darrentoback.com/can-risc-v-linux-of-microprocessors-start-an-open-hardware-renaissance
|
||||
|
||||
作者:[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://en.wikipedia.org/wiki/Open-source_hardware
|
||||
[2]:https://en.wikipedia.org/wiki/Comparison_of_instruction_set_architectures
|
||||
[3]:https://en.wikipedia.org/wiki/RISC-V
|
||||
[4]:https://en.wikipedia.org/wiki/Reduced_instruction_set_computing
|
||||
[5]:https://fedoraproject.org/wiki/Architectures/RISC-V
|
||||
[6]:https://www.crowdsupply.com/sifive/hifive1/
|
@ -0,0 +1,78 @@
|
||||
如何知道目录及子目录下文件的数量
|
||||
============================================================
|
||||
|
||||
在本指南中,我们将介绍如何在 Linux 系统上显示当前工作目录或任何目录及其子目录中的文件数量。
|
||||
|
||||
我们将使用 [find 命令][6],它用于搜索目录层次结构中的文件,以及 [wc 命令][7],它会打印每个文件或来自标准输入的换行符、单词和字节计数。
|
||||
|
||||
以下是我们在 [find 命令][8]中使用的选项,如下所示:
|
||||
|
||||
1. `-type` - 指定要搜索的文件类型,在上面的情况下,`f` 表示查找所有常规文件。
|
||||
2. `-print` - 打印文件绝对路径。
|
||||
|
||||
以下是我们 [wc 命令][8]中使用的选项,如下所示:
|
||||
|
||||
1. `-l` - 此选项打印换行符的总数,也即由 [find 命令][1]输出的绝对文件路径总数。
|
||||
|
||||
`find` 命令的一般语法。
|
||||
|
||||
```
|
||||
# find . -type f -print | wc -l
|
||||
$ sudo find . -type f -print | wc -l
|
||||
```
|
||||
|
||||
重要:使用 [sudo 命令][9]来读取指定目录中的所有文件,包括具有超级用户权限的子目录中的文件,以避免 “Permission denied” 错误,如下截图所示:
|
||||
|
||||
[
|
||||
![Find Number of Files in Linux](http://www.tecmint.com/wp-content/uploads/2017/01/Find-Number-of-Files-in-Linux.png)
|
||||
][10]
|
||||
|
||||
*Linux 中的文件数量*
|
||||
|
||||
你可以看到,在上面的第一个命令中,`find` 命令没有读取当前工作目录中的所有文件。
|
||||
|
||||
下面是更多的示例,分别显示 `/var/log` 和 `/etc` 目录中的常规文件总数:
|
||||
|
||||
```
|
||||
$ sudo find /var/log/ -type f -print | wc -l
|
||||
$ sudo find /etc/ -type f -print | wc -l
|
||||
```
|
||||
|
||||
有关 Linux 中 `find` 和 `wc` 命令的更多示例,请查看以下系列文章以了解其他使用选项,提示和相关命令:
|
||||
|
||||
1. [35 个 Linux 中的 “find” 命令示例][2]
|
||||
2. [如何在 Linux 中查找最近或今天的修改的文件][3]
|
||||
3. [在 Linux 中查找十个占用最大的目录和文件][4]
|
||||
4. [6 个有用的 “wc” 命令示例来计算行数、单词和字符][5]
|
||||
|
||||
就是这样了!如果你知道其他任何方法来显示目录及其子目录中的文件总数,请在评论中与我们分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin、web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/find-number-of-files-in-directory-subdirectories-linux/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/find-top-large-directories-and-files-sizes-in-linux/
|
||||
[2]:http://www.tecmint.com/35-practical-examples-of-linux-find-command/
|
||||
[3]:http://www.tecmint.com/find-recent-modified-files-in-linux/
|
||||
[4]:http://www.tecmint.com/find-top-large-directories-and-files-sizes-in-linux/
|
||||
[5]:http://www.tecmint.com/wc-command-examples/
|
||||
[6]:http://www.tecmint.com/35-practical-examples-of-linux-find-command/
|
||||
[7]:http://www.tecmint.com/wc-command-examples/
|
||||
[8]:http://www.tecmint.com/find-recent-modified-files-in-linux/
|
||||
[9]:http://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/
|
||||
[10]:http://www.tecmint.com/wp-content/uploads/2017/01/Find-Number-of-Files-in-Linux.png
|
@ -0,0 +1,61 @@
|
||||
如何在 Linux 中让 sudo 密码会话的超时更长些
|
||||
============================================================
|
||||
|
||||
在最近的文章中,我们向你展示了 在 Linux 中设置 sudo 的十条 sudoers 实用配置][1]以及[让 sudo 在你输入错误的密码时“嘲讽”你][2],在本文中,我们发现了另一个 sudo 贴士,在 Ubuntu Linux 中使 sudo 密码会话(超时)更长或更短。
|
||||
|
||||
在 Ubuntu 及其衍生版如 Linux Mint 或任何其他基于 Ubuntu 的发行版中,当你执行 [sudo 命令][3] 时,它将提示你输入管理密码。
|
||||
|
||||
在第一次执行 sudo 命令后,默认情况下密码将保持 15 分钟,因此你不需要为每个 sudo 命令键入密码。
|
||||
|
||||
如果,你因为某种原因觉得 15 分钟太长或太短,你可以在 `sudoers` 文件中做一个简单的调整。
|
||||
|
||||
要设置 sudo 密码超时值,请使用 `passwd_timeout` 参数。首先使用 `sudo` 和 `visudo` 命令以超级用户权限打开 `/etc/sudoers` 文件,如下所示:
|
||||
|
||||
```
|
||||
$ sudo visudo
|
||||
```
|
||||
|
||||
接着添加下面的默认值,这意味着 sudo 密码提示将会在用户使用 sudo 20 分钟后过期。
|
||||
|
||||
```
|
||||
Defaults env_reset,timestamp_timeout=20
|
||||
```
|
||||
|
||||
注意:你可以以分钟设置为你所需的任何时间,它会在超时之前一直等待。 如果要为每个执行的 sudo 命令弹出密码提示,你也可以将时间设置为 `0`,或者通过设置值 `-1` 永久禁用密码提示。
|
||||
|
||||
下面的截图显示了我在 `/etc/sudoers` 文件中设置的默认参数。
|
||||
|
||||
[
|
||||
![Change sudo Password Timeout](http://www.tecmint.com/wp-content/uploads/2017/01/set-sudo-password-timeout-session.png)
|
||||
][4]
|
||||
|
||||
*改变 sudo 密码超时*
|
||||
|
||||
按 `Ctrl + O` 保存文件,然后使用 `Ctrl + X` 退出。 然后,使用 `sudo` 运行命令并等待 2 分钟以检查密码提示是否超时以测试设置是否正常。
|
||||
|
||||
在本篇中,我们解释了如何设置 `sudo` 密码提示超时之前的分钟数,记得在评论栏分享你对这篇文章的想法或者其他[对系统管理员配置有用的 sudo 配置][5]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin 以及 web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。
|
||||
|
||||
-----
|
||||
|
||||
via: http://www.tecmint.com/set-sudo-password-timeout-session-longer-linux/
|
||||
|
||||
作者:[Aaron Kili ][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:https://linux.cn/article-8145-1.html
|
||||
[2]:https://linux.cn/article-8128-1.html
|
||||
[3]:http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2017/01/set-sudo-password-timeout-session.png
|
||||
[5]:http://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/
|
@ -0,0 +1,81 @@
|
||||
如何将 Linux 命令的输出赋值给变量
|
||||
==================================
|
||||
|
||||
运行一条命令时,它都会产生某种输出:要么是该命令的期望结果,或者是该命令执行细节的状态/错误消息。有些时候,你可能想要将某个命令的输出内容存储在一个变量中,以待在后续操作中取出来使用。
|
||||
|
||||
本文将介绍将 shell 命令赋值给变量的不同方法,这对于 shell 脚本编程是特别有用的。
|
||||
|
||||
可以使用如下形式的 shell 命令置换特性,将命令的输出存储到变量中:
|
||||
|
||||
```
|
||||
变量名=$(命令)
|
||||
变量名=$(命令 [命令选项 ...] 参数1 参数2 ...)
|
||||
或者:
|
||||
变量名='命令'
|
||||
变量名='命令 [命令选项 ...] 参数1 参数2 ...'
|
||||
```
|
||||
|
||||
以下是使用命令置换特性的示例:
|
||||
|
||||
本例,我们将 `who` (显示当前登录系统的用户) 的输出值存储到 `CURRENT_USERS` 变量中:
|
||||
|
||||
```
|
||||
$ CURRENT_USERS=$(who)
|
||||
```
|
||||
|
||||
然后,我们可以使用 [echo 命令][1] 显示一个句子并使用上述变量,如下:
|
||||
|
||||
```
|
||||
$ echo -e "以下为登录到系统中的用户:\n\n $CURRENT_USERS"
|
||||
```
|
||||
|
||||
上面的命令中:`-e` 标记表示解释所有的转义序列 (如 `\n` 为换行)。为节约时间和内存,通常在 [echo 命令][2] 中直接使用命令置换特性,如下:
|
||||
|
||||
```
|
||||
$ echo -e "以下为登录到系统中的用户:\n\n $(who)"
|
||||
```
|
||||
|
||||
[![显示当前登录系统的用户](http://www.tecmint.com/wp-content/uploads/2017/01/Shows-Current-Logged-Users-in-Linux.png)][3]
|
||||
|
||||
*在 Linux 中显示当前登录系统的用户*
|
||||
|
||||
接下来,为了演示上面提到的第二种形式,我们以把当前工作目录下文件数存储到变量 `FILES` ,然后使用 **echo** 来输出,如下:
|
||||
|
||||
```
|
||||
$ FILES=`sudo find . -type f -print | wc -l`
|
||||
$ echo "当前目录有 $FILES 个文件。"
|
||||
```
|
||||
[![显示目中包含文件的数量](http://www.tecmint.com/wp-content/uploads/2017/01/Show-Number-of-Files-in-Directory.png)][4]
|
||||
|
||||
*显示目中包含文件的数量*
|
||||
|
||||
就是这些了。我们展示了将 shell 命令的输出赋值给变量的方法。你可以在下边的评论反馈区留下你的想法。
|
||||
|
||||
---------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
Aaron Kili 是一名 Linux 和 F.O.S.S 忠实拥护者、未来的 Linux 系统管理员、Web 开发者,目前是 TecMint 的原创作者,热衷于计算机并乐于知识分享。
|
||||
译者简介:
|
||||
|
||||
![GHLandy](http://GHLandy.com/images/GHLandy.ico)
|
||||
|
||||
[GHLandy](http://GHLandy.com) —— 欲得之,则为之奋斗 (If you want it, work for it.)。
|
||||
|
||||
------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/assign-linux-command-output-to-variable/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/echo-command-in-linux/
|
||||
[2]:http://www.tecmint.com/echo-command-in-linux/
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2017/01/Shows-Current-Logged-Users-in-Linux.png
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2017/01/Show-Number-of-Files-in-Directory.png
|
@ -0,0 +1,335 @@
|
||||
vmstat:一个标准的报告虚拟内存统计工具
|
||||
============================================================
|
||||
|
||||
### 什么是 RAM?
|
||||
|
||||
在智能手机世界,我们每一个人都知道 RAM。因此,我不想深入介绍,这样我就简要概括下。RAM 代表“随机访问内存”(Random Access Memory),是一种计算机数据存储,它会存储经常使用的程序来提升系统性能。
|
||||
|
||||
### 什么是虚拟内存?
|
||||
|
||||
虚拟内存是一种内存管理方式,计算机通过临时将最近未使用的程序数据从 RAM 转移到硬盘,以平衡或管理内存的短缺。
|
||||
|
||||
### 什么是 vmstat?
|
||||
|
||||
vmstat 是一个标准的工具,它会报告 Linux 系统的虚拟内存统计。vmstat 会报告有关进程、内存、分页、块 IO、陷阱(中断)和 cpu 活动的信息。它可以帮助 Linux 管理员在解决问题时识别系统瓶颈。
|
||||
|
||||
### 在 Linux 中安装 Sysstat
|
||||
|
||||
Linux 中没有独立的 `vmstat` 包。它与 `sysstat` 绑定在一起,并在大多数发行版的默认仓库上都有。如果还没有安装,只要基于你的发行版输入下面的命令。
|
||||
|
||||
```
|
||||
[在 CentOS/RHEL 中安装 vmstat]
|
||||
$ sudo yum install sysstat
|
||||
|
||||
[在 Fedora 中安装 vmstat]
|
||||
$ sudo dnf install sysstat
|
||||
|
||||
[在 Debian/Ubuntu 中安装 vmstat]
|
||||
$ sudo apt-get install sysstat
|
||||
|
||||
[在 Arch Linux 中安装 vmstat]
|
||||
$ sudo pacman -S sysstat
|
||||
|
||||
[在 Mageia 中安装 vmstat]
|
||||
$ sudo urpmi sysstat
|
||||
|
||||
[在 openSUSE 中安装 vmstat]
|
||||
$ sudo zypper install sysstat
|
||||
```
|
||||
|
||||
### 不带参数运行 vmstat
|
||||
|
||||
假设你已经成功安装 vmstat,在终端中不带参数运行 `vmstat`,它会向你展示 vmstat 的默认结果。
|
||||
|
||||
```
|
||||
# vmstat
|
||||
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
|
||||
r b swpd free buff cache si so bi bo in cs us sy id wa
|
||||
2 0 79496 1614120 139240 787928 0 0 23 10 0 0 11 1 88 0
|
||||
```
|
||||
|
||||
当你看到上面的输出,你可能已经大致了解了它是什么以及它的目的。不要担心,我们将深入解释每个参数,以便你可以了解 vmstat 的用途和目的。
|
||||
|
||||
`procs`:procs 中有 `r` 和 `b` 列,它报告进程统计信息。在上面的输出中,在运行队列(`r`)中有两个进程在等待 CPU 并有零个休眠进程(`b`)。通常,它不应该超过处理器(或核心)的数量,如果你发现异常,最好使用 [top 命令][1]进一步地排除故障。
|
||||
|
||||
* `r`:等待运行的进程数。
|
||||
* `b`:休眠状态下的进程数。
|
||||
|
||||
`memory`: memory 下有报告内存统计的 `swpd`、`free`、`buff` 和 `cache` 列。你可以用 `free -m` 命令看到同样的信息。在上面的内存统计中,统计数据以千字节表示,这有点难以理解,最好添加 `M` 参数来看到以兆字节为单位的统计数据。
|
||||
|
||||
* `swpd`:使用的虚拟内存量。
|
||||
* `free`:空闲内存量。
|
||||
* `buff`:用作缓冲区的内存量。
|
||||
* `cache`:用作高速缓存的内存量。
|
||||
* `inact`:非活动内存的数量。
|
||||
* `active`:活动内存量。
|
||||
|
||||
`swap`:swap 有 `si` 和 `so` 列,用于报告交换内存统计信息。你可以用 `free -m` 命令看到相同的信息。
|
||||
|
||||
* `si`:从磁盘交换的内存量(换入,从 swap 移到实际内存的内存)。
|
||||
* `so`:交换到磁盘的内存量(换出,从实际内存移动到 swap 的内存)。
|
||||
|
||||
`I/O`:I/O 有 `bi` 和 `bo` 列,它以“块读取”和“块写入”的单位来报告每秒磁盘读取和写入的块的统计信息。如果你发现有巨大的 I/O 读写,最好使用 [iotop][2] 和 [iostat][3] 命令来查看。
|
||||
|
||||
* `bi`:从块设备接收的块数。
|
||||
* `bo`:发送到块设备的块数。
|
||||
|
||||
`system`:system 有 `in` 和 `cs` 列,它报告每秒的系统操作。
|
||||
|
||||
* `in`:每秒的系统中断数,包括时钟中断。
|
||||
* `cs`:发送到块设备的块数。
|
||||
|
||||
`CPU`:CPU 有 `cs`、`us`、`sy`、`id` 和 `wa` 列,报告(所用的) CPU 资源占总 CPU 时间的百分比。如果你发现异常,最好使用 `top` 和 `free` 命令。
|
||||
|
||||
* `cs`:每秒的系统中断数,包括时钟。
|
||||
* `us`:发送到块设备的块数。
|
||||
* `sy`:用作高速缓存的内存量。
|
||||
* `id`:非活动内存量。
|
||||
* `wa`:活动内存量。
|
||||
|
||||
### 以 MB 方式输出
|
||||
|
||||
默认情况下,vmstat 以千字节为单位显示内存统计,这是非常难以理解的,最好添加 `-S m` 参数以获取以兆字节为单位的统计。
|
||||
|
||||
```
|
||||
# vmstat -S m
|
||||
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
|
||||
r b swpd free buff cache si so bi bo in cs us sy id wa
|
||||
1 0 103 371 406 2116 0 0 40 15 0 0 11 1 87 0
|
||||
```
|
||||
|
||||
### 以延迟方式运行 vmstat 获取更好的统计信息
|
||||
|
||||
默认情况下,vmstat 的单次统计信息不足以进一步进行故障排除,因此,添加更新延迟(延迟是更新之间的延迟,以秒为单位)以定期捕获活动。如果你想以 2 秒延迟运行 vmstat ,只需使用下面的命令(如果你想要更长的延迟,你可以根据你的愿望改变)。
|
||||
|
||||
以下命令将每 2 秒运行一次,直到退出。
|
||||
|
||||
```
|
||||
# vmstat 2
|
||||
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
|
||||
r b swpd free buff cache si so bi bo in cs us sy id wa
|
||||
1 0 105500 325776 416016 2166912 0 0 40 15 0 0 11 1 87 0
|
||||
0 0 105500 325644 416016 2166920 0 0 0 13 1083 1174 11 1 87 0
|
||||
0 0 105500 308648 416024 2166928 0 0 1 16 1559 1453 16 2 82 0
|
||||
0 0 105500 285948 416032 2166932 0 0 0 12 934 1003 9 1 90 0
|
||||
0 0 105500 326620 416040 2166940 0 0 1 27 922 1068 9 1 90 0
|
||||
0 0 105500 366704 416048 2166944 0 0 0 17 835 955 9 1 90 0
|
||||
0 0 105500 366456 416056 2166948 0 0 1 22 859 918 9 1 90 0
|
||||
0 0 105500 366456 416056 2166948 0 0 0 15 1539 1504 17 2 81 0
|
||||
0 0 105500 365224 416060 2166996 0 0 1 19 984 1097 11 1 88 0
|
||||
```
|
||||
|
||||
### 带延迟和计数运行 vmstat
|
||||
|
||||
或者,你可以带延迟和特定计数运行 vmstat,一旦达到给定的计数,然后自动退出。
|
||||
|
||||
以下命令将每 2 秒运行一次,10 次后自动退出。
|
||||
|
||||
```
|
||||
# vmstat 2 10
|
||||
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
|
||||
r b swpd free buff cache si so bi bo in cs us sy id wa
|
||||
1 0 79496 1581916 157380 810412 0 0 23 10 0 1 11 1 88 0
|
||||
2 0 79496 1559464 157380 810416 0 0 1 1 1821 1749 21 2 77 0
|
||||
0 0 79496 1583768 157384 810416 0 0 1 46 681 799 9 1 90 0
|
||||
2 0 79496 1556364 157384 810428 0 0 1 1 1392 1545 15 2 83 0
|
||||
0 0 79496 1583272 157384 810428 0 0 1 0 1307 1448 14 2 84 0
|
||||
2 0 79496 1582032 157384 810428 0 0 1 41 424 605 4 1 96 0
|
||||
1 0 79496 1575848 157384 810428 0 0 1 0 1912 2407 26 2 71 0
|
||||
0 0 79496 1582884 157384 810436 0 0 1 69 678 825 9 1 90 0
|
||||
2 0 79496 1569368 157392 810432 0 0 11 26 920 969 9 1 90 0
|
||||
1 0 79496 1583612 157400 810444 0 0 7 39 2001 2530 20 2 77 0
|
||||
```
|
||||
|
||||
### 显示活动和非活动内存
|
||||
|
||||
默认情况下,vmstat 会显示除活动和非活动内存之外的内存统计信息。如果要查看活动和非活动内存统计信息,请在 vmstat 后添加 `-a` 参数。
|
||||
|
||||
```
|
||||
# vmstat -a
|
||||
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
|
||||
r b swpd free inact active si so bi bo in cs us sy id wa
|
||||
1 0 105500 2387592 415148 584112 0 0 40 15 0 1 11 1 87 0
|
||||
```
|
||||
|
||||
### 打印磁盘统计
|
||||
|
||||
在 vmstat 后面添加 `-d` 参数会以每个磁盘一行的方式显示统计(包含读、写和 IO)。
|
||||
|
||||
```
|
||||
# vmstat -d
|
||||
disk- ------------reads------------ ------------writes----------- -----IO------
|
||||
total merged sectors ms total merged sectors ms cur sec
|
||||
ram0 0 0 0 0 0 0 0 0 0 0
|
||||
ram1 0 0 0 0 0 0 0 0 0 0
|
||||
ram2 0 0 0 0 0 0 0 0 0 0
|
||||
ram3 0 0 0 0 0 0 0 0 0 0
|
||||
ram4 0 0 0 0 0 0 0 0 0 0
|
||||
ram5 0 0 0 0 0 0 0 0 0 0
|
||||
ram6 0 0 0 0 0 0 0 0 0 0
|
||||
ram7 0 0 0 0 0 0 0 0 0 0
|
||||
ram8 0 0 0 0 0 0 0 0 0 0
|
||||
ram9 0 0 0 0 0 0 0 0 0 0
|
||||
ram10 0 0 0 0 0 0 0 0 0 0
|
||||
ram11 0 0 0 0 0 0 0 0 0 0
|
||||
ram12 0 0 0 0 0 0 0 0 0 0
|
||||
ram13 0 0 0 0 0 0 0 0 0 0
|
||||
ram14 0 0 0 0 0 0 0 0 0 0
|
||||
ram15 0 0 0 0 0 0 0 0 0 0
|
||||
loop0 0 0 0 0 0 0 0 0 0 0
|
||||
loop1 0 0 0 0 0 0 0 0 0 0
|
||||
loop2 0 0 0 0 0 0 0 0 0 0
|
||||
loop3 0 0 0 0 0 0 0 0 0 0
|
||||
loop4 0 0 0 0 0 0 0 0 0 0
|
||||
loop5 0 0 0 0 0 0 0 0 0 0
|
||||
loop6 0 0 0 0 0 0 0 0 0 0
|
||||
loop7 0 0 0 0 0 0 0 0 0 0
|
||||
fd0 0 0 0 0 0 0 0 0 0 0
|
||||
sda 16604050 904497 2594882190 57455732 30037054 28093770 2160032056 118189160 0 40915
|
||||
sdb 257357577 479985 3124712204 577235320 8502519 1283237 36645890 11250948 0 182336
|
||||
```
|
||||
|
||||
### 总结磁盘统计
|
||||
|
||||
在 vmstat 后面添加 `-D` 会显示全局统计(包括全部的磁盘、分区、全部读、合并的读、读取的扇区、写、合并的写、写入的扇区和 IO)。
|
||||
|
||||
```
|
||||
# vmstat -D
|
||||
27 disks
|
||||
3 partitions
|
||||
275754028 total reads
|
||||
1388030 merged reads
|
||||
5751195976 read sectors
|
||||
638710116 milli reading
|
||||
38795040 writes
|
||||
29520659 merged writes
|
||||
2209820333 written sectors
|
||||
130210652 milli writing
|
||||
0 inprogress IO
|
||||
224704 milli spent IO
|
||||
```
|
||||
|
||||
### 打印指定分区统计
|
||||
|
||||
vmstat 添加 `-p` 参数后面跟上设备名会显示指定分区统计(包括读、读取的扇区、写以及请求的写)。
|
||||
|
||||
```
|
||||
# vmstat -p /dev/sdb1
|
||||
sdb1 reads read sectors writes requested writes
|
||||
3115 27890 839453 206728016
|
||||
```
|
||||
|
||||
### vmstat 统计信息带上时间戳
|
||||
|
||||
当你想在特定时间区间内找到内存尖峰时,用 vmstat 命令添加 `-t` 参数,后跟延迟和计数。
|
||||
|
||||
注意:此组合不适用于基于 Debian 的系统。
|
||||
|
||||
```
|
||||
# vmstat -t 1 5
|
||||
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
|
||||
r b swpd free buff cache si so bi bo in cs us sy id wa st
|
||||
0 0 0 6981416 181324 24588604 0 0 0 1 0 0 0 0 100 0 0 2017-01-11 15:42:15 MST
|
||||
2 0 0 6981276 181324 24588604 0 0 0 0 91 40 0 0 100 0 0 2017-01-11 15:42:16 MST
|
||||
0 0 0 6982016 181324 24588604 0 0 0 0 75 116 0 0 100 0 0 2017-01-11 15:42:17 MST
|
||||
0 0 0 6982016 181324 24588604 0 0 0 0 43 39 0 0 100 0 0 2017-01-11 15:42:18 MST
|
||||
0 0 0 6982280 181324 24588604 0 0 0 0 113 185 0 0 100 0 0 2017-01-11 15:42:19 MST
|
||||
```
|
||||
|
||||
### 打印更多统计
|
||||
|
||||
vmstat 后面跟上 `-s` 参数会显示不同统计的总结。
|
||||
|
||||
```
|
||||
# vmstat -s
|
||||
32849392 total memory
|
||||
25864128 used memory
|
||||
16468180 active memory
|
||||
8320888 inactive memory
|
||||
6985264 free memory
|
||||
181324 buffer memory
|
||||
24588612 swap cache
|
||||
20970492 total swap
|
||||
0 used swap
|
||||
20970492 free swap
|
||||
891075 non-nice user cpu ticks
|
||||
6532 nice user cpu ticks
|
||||
1507099 system cpu ticks
|
||||
18925265601 idle cpu ticks
|
||||
113043 IO-wait cpu ticks
|
||||
108 IRQ cpu ticks
|
||||
4185 softirq cpu ticks
|
||||
0 stolen cpu ticks
|
||||
4071862 pages paged in
|
||||
216759718 pages paged out
|
||||
0 pages swapped in
|
||||
0 pages swapped out
|
||||
369611221 interrupts
|
||||
477861261 CPU context switches
|
||||
1478258826 boot time
|
||||
2196121 forks
|
||||
```
|
||||
|
||||
### 打印 slab 统计
|
||||
|
||||
vmstat 后面跟上 `-m` 参数会显示 slab 信息。
|
||||
|
||||
```
|
||||
# vmstat -m
|
||||
Cache Num Total Size Pages
|
||||
nf_conntrack_expect 0 0 240 16
|
||||
nf_conntrack_ffffffff81b2a920 18 60 312 12
|
||||
fib6_nodes 24 59 64 59
|
||||
ip6_dst_cache 16 30 384 10
|
||||
ndisc_cache 7 30 256 15
|
||||
ip6_mrt_cache 0 0 128 30
|
||||
RAWv6 35 35 1088 7
|
||||
UDPLITEv6 0 0 1024 4
|
||||
UDPv6 4 12 1024 4
|
||||
tw_sock_TCPv6 0 0 320 12
|
||||
request_sock_TCPv6 0 0 192 20
|
||||
TCPv6 4 6 1920 2
|
||||
fat_inode_cache 5 6 672 6
|
||||
fat_cache 0 0 32 112
|
||||
ioat2 4096 4140 128 30
|
||||
ext4_inode_cache 34322 34364 1000 4
|
||||
ext4_xattr 0 0 88 44
|
||||
.
|
||||
.
|
||||
.
|
||||
```
|
||||
|
||||
### 阅读更多关于 vmstat
|
||||
|
||||
如果你想了解关于 vmstat 的更多选项,请阅读手册。
|
||||
|
||||
```
|
||||
# vmstat --help
|
||||
或者
|
||||
# man vmstat
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/d487bef1de15143a7b80a40396e96118?s=256&d=mm&r=g)
|
||||
|
||||
热爱玩所有的 Linux 发行版
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.2daygeek.com/linux-vmstat-command-examples-tool-report-virtual-memory-statistics/
|
||||
|
||||
作者:[Magesh Maruthamuthu][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/magesh/
|
||||
[1]:http://www.2daygeek.com/top-command-examples-to-monitor-server-
|
||||
[2]:http://www.2daygeek.com/monitor-disk-io-activity-using-iotop-
|
||||
[3]:http://www.2daygeek.com/monitor-disk-io-activity-using-iotop-
|
||||
[4]:https://en.wikipedia.org/wiki/Virtual_memory
|
||||
[5]:http://www.2daygeek.com/sar-command-examples-system-performance-monitoring-linux/
|
@ -0,0 +1,36 @@
|
||||
MapD:由 GPU 驱动的数据库分析平台可在几毫秒内查询数十亿条数据
|
||||
=================================================
|
||||
|
||||
![database analytics platform MapD](http://i0.wp.com/opensourceforu.com/wp-content/uploads/2015/03/Database-Backup1.jpg?resize=750%2C525)
|
||||
|
||||
|
||||
麻省理工学院计算机科学与人工智能实验室(CSAIL)的前研究员开发了一款名为 MapD 的数据库分析平台。该平台使用 GPU 而不是 CPU ,可在几毫秒内查询和映射数十亿条数据。
|
||||
|
||||
人们通常将 GPU 与图像处理和游戏相关联。然而,现代 GPU 中高效的核心和处理单元也可以用于通用计算应用。以前在 CSAIL 工作的 Todd Mostak 开发了 MapD,它能在毫秒内处理数十亿条数据。
|
||||
|
||||
Mostak [声称][5] 他的 MapD 比由 CPU 驱动的传统数据库管理系统的快 100 倍。该平台可以在短时间内处理并可视化大量数据,并且被处理的数据的参数可以很容易地修改。
|
||||
|
||||
MapD 将所有数据缓存在多个 GPU 上,而不是存储在某些 CPU 上。每个 GPU 被给予不同的缓冲池以节省时间。通过此过程,系统可以提供比 CPU 驱动的数据库系统快两到三倍的性能。
|
||||
|
||||
许多公司客户已经开始使用 Mostak 的 MapD。像 Verizon 这样的电信公司据说也在为其内部研发尝试该数据库分析平台。这家电信公司使用 MapD 分析了 8500 万用户的 SIM 卡更新数据库。
|
||||
|
||||
除了 Verizon,MapD 还有如社交媒体公司,金融和广告公司的客户。
|
||||
|
||||
由 Mostak 领导的创业公司最近从美国中央情报局的投资部门 In-Q-Tel 筹集了一笔资金。你可以期望在不久的将来在不同的领域中使用 MapD 的各种情况。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://opensourceforu.com/2017/01/gpu-powered-database-analytics-platform-query-billions-data-points/
|
||||
|
||||
作者:[RAJAT KABADE][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:
|
||||
[1]:https://twitter.com/home?status=This%20GPU-powered%20database%20analytics%20platform%20can%20query%20billions%20of%20data%20points%20in%20milliseconds+http://opensourceforu.com/2017/01/gpu-powered-database-analytics-platform-query-billions-data-points/
|
||||
[2]:https://plus.google.com/share?url=http://opensourceforu.com/2017/01/gpu-powered-database-analytics-platform-query-billions-data-points/
|
||||
[3]:http://pinterest.com/pin/create/button/?url=http://opensourceforu.com/2017/01/gpu-powered-database-analytics-platform-query-billions-data-points/&media=http://opensourceforu.com/wp-content/uploads/2015/03/Database-Backup1.jpg&description=This%20GPU-powered%20database%20analytics%20platform%20can%20query%20billions%20of%20data%20points%20in%20milliseconds
|
||||
[4]:https://www.tumblr.com/widgets/share/tool?shareSource=legacy&canonicalUrl=&url=http%3A%2F%2Fopensourceforu.com%2F2017%2F01%2Fgpu-powered-database-analytics-platform-query-billions-data-points%2F&posttype=link&title=This+GPU-powered+database+analytics+platform+can+query+billions+of+data+points+in+milliseconds&content=
|
||||
[5]:http://news.mit.edu/2017/startup-mapd-fast-big-data-mapping-0111
|
@ -0,0 +1,92 @@
|
||||
剪切板是一个安全问题 - 在 Linux 中你可以用 xclip 和 cron 修复它
|
||||
============================================================
|
||||
|
||||
![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/clip2-630x520.png)
|
||||
|
||||
|
||||
**更新:我原文推荐的是 xsel,但几个用户报告说它禁用了他们的声音。这对我来说不是问题,但我发现了另一种方式(使用 [xclip][1] )来实现同样的目标,这样应该就能回避这个问题。文章已更新,切换到了 xclip。**
|
||||
|
||||
在你的操作系统上复制/粘贴的能力是必不可少的。无论你写的是代码还是剧本,这两个功能是在计算机上处理文本的核心。当你复制文本时,它会进入内存驻留的剪贴板。除非安装了可以容纳多个条目的剪贴板管理器,否则剪贴板默认情况下只会处理一个_复制_事件,当你_复制_其他东西的时候,它之前的条目才会消失。在标准 Linux 设置中,剪贴板内容存储在控制它的程序的内存中(通常是 Xorg)。
|
||||
|
||||
剪贴板应该有所限制,因为任何程序都可以读取其内容,如果放任它,它保存的东西就会一直呆在那里。此外,现代浏览器允许恶意网站以多种方式从剪贴板读取(和写入)。
|
||||
|
||||
虽然不是默认设置,但浏览器可以设置为禁止访问剪贴板。虽然也有用于浏览器和操作系统管理剪贴板的附加组件,但是,在此链条的源头解决问题更容易、更可靠,并使系统范围内的剪贴板安全。有很多理由使用一个剪贴板,但没有足够的理由让内容在那里保留一两分钟以上。
|
||||
|
||||
密码管理器最近变得很受欢迎,如果你使用过的话,你已经了解了它们如何将密码复制到剪贴板,以便你可以将其粘贴到浏览器中,并登录到你的帐户。接下来会发生什么?你的密码会保留在剪贴板上,直到另一个复制事件或重新启动。
|
||||
|
||||
即使你使用单独的浏览器来处理银行等事务,复制密码时,通过剪贴板会将其带回其他浏览器,并将其暴露在基于 web 的剪贴板收集技术中。
|
||||
|
||||
我的解决方案是在后台进行处理,每分钟自动清除剪贴板的内容。它使用 xclip 这个命令行工具、一个小脚本和 [cron][2]。cron 的一分钟间隔给你足够的时间来复制密码,然后它会清空剪贴板。此动作会每分钟执行一次,保证复制无忧。
|
||||
|
||||
我们需要使用 [xclip][3] 工具清除终端中的剪贴板。在基于 apt 的发行版中,输入:
|
||||
|
||||
```
|
||||
sudo apt-get install xclip
|
||||
```
|
||||
|
||||
我们在终端中测试一下程序。首先从某处复制一些文字,复制到其他地方,并输入这两条命令:
|
||||
|
||||
```
|
||||
touch blank
|
||||
xclip -selection clipboard blank
|
||||
```
|
||||
|
||||
接着再次尝试复制文本 - 它应该就会消失了。现在把这个命令放在脚本中。创建一个脚本(用你的文本编辑器代替 leafpad):
|
||||
|
||||
```
|
||||
leafpad nukeclipboard.sh
|
||||
```
|
||||
|
||||
并在新文件中输入下面的内容:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
touch blank && xclip -selection clipboard blank
|
||||
```
|
||||
|
||||
保存并关闭文件,接着加上可执行权限:
|
||||
|
||||
```
|
||||
chmod +x nukeclipboard.sh
|
||||
```
|
||||
|
||||
现在让 cron 任务每分钟运行一次。首先要小心,不同的发行版有不同的 cron 选项。以下设置适用于 Ubuntu(基于)的发行版,并且在你的发行版中过程可能不同,因此[请阅读手册][4]。
|
||||
|
||||
要设置 cron 任务,请在终端输入:
|
||||
|
||||
```
|
||||
crontab -e
|
||||
```
|
||||
|
||||
在最后被注释掉的行后,输入下面的行(将 `/home/user/` 替换为你的脚本位置):
|
||||
|
||||
```
|
||||
* * * * * export DISPLAY=:0 && /home/user/nukeclipboard.sh
|
||||
```
|
||||
|
||||
现在按下 `ctrl-o` 保存(使用你的 cron 任务编辑器的保存快捷键),然后点击回车保存你的 crontab。最后,按下 `ctrl-x` 退出程序。从现在起,你的剪贴板的使用寿命为一分钟。
|
||||
|
||||
关于上面的 cron 条目的解释: cron 有环境变量的限制,当它失败时,你可能要花一整天试着一百种方法来解决它。在我找到了一个建议设置 DISPLAY 的[快速修复][5] 后,就解决了。感谢 [Mike Q][6] 的贡献。
|
||||
|
||||
现在,可能会发生当你要粘贴复制的东西时,正好剪贴板被清空,从而无法粘贴,但它只是安全的一个小的代价。 如果这是一个问题,您可以配置 cron 以任何适合您的间隔运行任务(比如 2 分钟)。 Ubuntu 的说明在[此] [7]页。
|
||||
|
||||
我希望这个教程能帮助你把剪贴板锁定下来 - 如果你有可以工作的脚本或者更好的方法,欢迎来做评论。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.darrentoback.com/your-computer-s-clipboard-is-a-security-problem-fix-it-in-linux-with-xsel-and-cron
|
||||
|
||||
作者:[dmt][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.darrentoback.com/about-me
|
||||
[1]:https://github.com/astrand/xclip
|
||||
[2]:https://en.wikipedia.org/wiki/Cron
|
||||
[3]:https://github.com/astrand/xclip
|
||||
[4]:https://en.wikipedia.org/wiki/Cron
|
||||
[5]:https://stackoverflow.com/questions/14296911/when-linux-system-calls-scripts-some-commands-dont-work-cron-if-up-d/24070707#24070707
|
||||
[6]:https://stackoverflow.com/users/1618630/mike-q
|
||||
[7]:https://help.ubuntu.com/community/CronHowto
|
175
published/20170116 Use Docker remotely on Atomic Host.md
Normal file
175
published/20170116 Use Docker remotely on Atomic Host.md
Normal file
@ -0,0 +1,175 @@
|
||||
在 Atomic 主机上远程使用 Docker
|
||||
==========
|
||||
|
||||
![remote-atomic-docker](https://cdn.fedoramagazine.org/wp-content/uploads/2017/01/remote-atomic-docker-945x400.jpg)
|
||||
|
||||
来自 [Atomic 项目][2] 的 Atomic 主机是一个轻量级的容器基于的操作系统,它可以运行 Linux 容器。它已被优化为用作云环境的容器运行时系统。例如,它可以托管 Docker 守护进程和容器。有时,你可能需要在该主机上运行 docker 命令,并从其他地方管理服务器。本文介绍如何远程访问 Fedora Atomic 主机([你可以在这里下载到它][4])上的 [Docker][3] 守护进程。整个过程由 [Ansible][5] 自动完成 - 在涉及到自动化的一切上,这真是一个伟大的工具!
|
||||
|
||||
### 安全备忘录
|
||||
|
||||
由于我们通过网络连接,所以我们使用 [TLS][6] 保护 Docker 守护进程。此过程需要客户端证书和服务器证书。OpenSSL 包用于创建用于建立 TLS 连接的证书密钥。这里,Atomic 主机运行守护程序,我们的本地的 [Fedora Workstation][7] 充当客户端。
|
||||
|
||||
在你按照这些步骤进行之前,请注意,_任何_在客户端上可以访问 TLS 证书的进程在服务器上具有**完全的 root 访问权限**。 因此,客户端可以在服务器上做任何它想做的事情。我们需要仅向可信任的特定客户端主机授予证书访问权限。你应该将客户端证书仅复制到完全由你控制的客户端主机。但即使在这种情况下,客户端机器的安全也至关重要。
|
||||
|
||||
不过,此方法只是远程访问守护程序的一种方法。编排工具通常提供更安全的控制。下面的简单方法适用于个人实验,可能不适合开放式网络。
|
||||
|
||||
### 获取 Ansible role
|
||||
|
||||
[Chris Houseknecht][8] 写了一个 Ansible role,它会创造所需的所有证书。这样,你不需要手动运行 `openssl` 命令了。 这些在 [Ansible role 仓库][9]中提供。将它克隆到你当前的工作主机。
|
||||
|
||||
```
|
||||
$ mkdir docker-remote-access
|
||||
$ cd docker-remote-access
|
||||
$ git clone https://github.com/ansible/role-secure-docker-daemon.git
|
||||
```
|
||||
|
||||
### 创建配置文件
|
||||
|
||||
接下来,你必须创建 Ansible 配置文件、清单(inventory)和剧本(playbook)文件以设置客户端和守护进程。以下说明在 Atomic 主机上创建客户端和服务器证书。然后,获取客户端证书到本地。最后,它们会配置守护进程以及客户端,使它们能彼此交互。
|
||||
|
||||
这里是你需要的目录结构。如下所示,创建下面的每个文件。
|
||||
|
||||
```
|
||||
$ tree docker-remote-access/
|
||||
docker-remote-access/
|
||||
├── ansible.cfg
|
||||
├── inventory
|
||||
├── remote-access.yml
|
||||
└── role-secure-docker-daemon
|
||||
```
|
||||
|
||||
`ansible.cfg`:
|
||||
|
||||
```
|
||||
$ vim ansible.cfg
|
||||
```
|
||||
```
|
||||
[defaults]
|
||||
inventory=inventory
|
||||
```
|
||||
|
||||
清单文件(`inventory`):
|
||||
|
||||
```
|
||||
$ vim inventory
|
||||
```
|
||||
```
|
||||
[daemonhost]
|
||||
'IP_OF_ATOMIC_HOST' ansible_ssh_private_key_file='PRIVATE_KEY_FILE'
|
||||
```
|
||||
|
||||
将清单文件(`inventory`) 中的 `IP_OF_ATOMIC_HOST` 替换为 Atomic 主机的 IP。将 `PRIVATE_KEY_FILE` 替换为本地系统上的 SSH 私钥文件的位置。
|
||||
|
||||
剧本文件(`remote-access.yml`):
|
||||
|
||||
```
|
||||
$ vim remote-access.yml
|
||||
```
|
||||
```
|
||||
- name: Docker Client Set up
|
||||
hosts: daemonhost
|
||||
gather_facts: no
|
||||
tasks:
|
||||
- name: Make ~/.docker directory for docker certs
|
||||
local_action: file path='~/.docker' state='directory'
|
||||
|
||||
- name: Add Environment variables to ~/.bashrc
|
||||
local_action: lineinfile dest='~/.bashrc' line='export DOCKER_TLS_VERIFY=1\nexport DOCKER_CERT_PATH=~/.docker/\nexport DOCKER_HOST=tcp://{{ inventory_hostname }}:2376\n' state='present'
|
||||
|
||||
- name: Source ~/.bashrc file
|
||||
local_action: shell source ~/.bashrc
|
||||
|
||||
- name: Docker Daemon Set up
|
||||
hosts: daemonhost
|
||||
gather_facts: no
|
||||
remote_user: fedora
|
||||
become: yes
|
||||
become_method: sudo
|
||||
become_user: root
|
||||
roles:
|
||||
- role: role-secure-docker-daemon
|
||||
dds_host: "{{ inventory_hostname }}"
|
||||
dds_server_cert_path: /etc/docker
|
||||
dds_restart_docker: no
|
||||
tasks:
|
||||
- name: fetch ca.pem from daemon host
|
||||
fetch:
|
||||
src: /root/.docker/ca.pem
|
||||
dest: ~/.docker/
|
||||
fail_on_missing: yes
|
||||
flat: yes
|
||||
- name: fetch cert.pem from daemon host
|
||||
fetch:
|
||||
src: /root/.docker/cert.pem
|
||||
dest: ~/.docker/
|
||||
fail_on_missing: yes
|
||||
flat: yes
|
||||
- name: fetch key.pem from daemon host
|
||||
fetch:
|
||||
src: /root/.docker/key.pem
|
||||
dest: ~/.docker/
|
||||
fail_on_missing: yes
|
||||
flat: yes
|
||||
- name: Remove Environment variable OPTIONS from /etc/sysconfig/docker
|
||||
lineinfile:
|
||||
dest: /etc/sysconfig/docker
|
||||
regexp: '^OPTIONS'
|
||||
state: absent
|
||||
|
||||
- name: Modify Environment variable OPTIONS in /etc/sysconfig/docker
|
||||
lineinfile:
|
||||
dest: /etc/sysconfig/docker
|
||||
line: "OPTIONS='--selinux-enabled --log-driver=journald --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H=0.0.0.0:2376 -H=unix:///var/run/docker.sock'"
|
||||
state: present
|
||||
|
||||
- name: Remove client certs from daemon host
|
||||
file:
|
||||
path: /root/.docker
|
||||
state: absent
|
||||
|
||||
- name: Reload Docker daemon
|
||||
command: systemctl daemon-reload
|
||||
- name: Restart Docker daemon
|
||||
command: systemctl restart docker.service
|
||||
```
|
||||
|
||||
### 访问 Atomic 主机
|
||||
|
||||
现在运行 Ansible 剧本:
|
||||
|
||||
```
|
||||
$ ansible-playbook remote-access.yml
|
||||
```
|
||||
|
||||
确保 tcp 端口 2376 在你的 Atomic 主机上打开了。如果你在使用 Openstack,请在安全规则中添加 TCP 端口 2376。 如果你使用 AWS,请将其添加到你的安全组。
|
||||
|
||||
现在,在你的工作站上作为普通用户运行的 `docker` 命令与 Atomic 主机的守护进程通信,并在那里执行命令。你不需要手动 `ssh` 或在 Atomic 主机上发出命令。这可以让你远程、轻松、安全地启动容器化应用程序。
|
||||
|
||||
如果你想克隆 Ansible 剧本和配置文件,这里是 [git 仓库][10]。
|
||||
|
||||
[
|
||||
![docker-daemon](https://cdn.fedoramagazine.org/wp-content/uploads/2017/01/docker-daemon.jpg)
|
||||
][11]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/use-docker-remotely-atomic-host/
|
||||
|
||||
作者:[Trishna Guha][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://trishnag.id.fedoraproject.org/
|
||||
[1]:https://fedoramagazine.org/use-docker-remotely-atomic-host/
|
||||
[2]:http://www.projectatomic.io/
|
||||
[3]:https://www.docker.com/
|
||||
[4]:https://getfedora.org/atomic/
|
||||
[5]:https://www.ansible.com/
|
||||
[6]:https://en.wikipedia.org/wiki/Transport_Layer_Security
|
||||
[7]:https://getfedora.org/en/workstation/
|
||||
[8]:https://twitter.com/CHouseknecht
|
||||
[9]:https://github.com/ansible/role-secure-docker-daemon
|
||||
[10]:https://github.com/trishnaguha/fedora-cloud-ansible/tree/master/docker-remote-access
|
||||
[11]:https://cdn.fedoramagazine.org/wp-content/uploads/2017/01/docker-daemon.jpg
|
@ -0,0 +1,37 @@
|
||||
我需要在 AGPLv3 许可证下提供源码么?
|
||||
============================================================
|
||||
|
||||
![Do I need to provide access to source code under the AGPLv3 license?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW_PatentSpotlight_520x292_cm.png.png?itok=bCn-kMx2 "Do I need to provide access to source code under the AGPLv3 license?")
|
||||
|
||||
图片提供:opensource.com
|
||||
|
||||
[GNU Affero 通用公共许可证版本 3][1](AGPLv3)是与 GPLv3 几乎相同的左版(copyleft)许可证。两个许可证具有相同的公共版权范围,但在一个重要方面有重大差异。 AGPLv3 的第 13 节规定了 GPLv2 或 GPLv3 中不存在的附加条件:
|
||||
|
||||
> 在本许可证的其它条款之外,如果你修改了程序,你必须把你修改的版本,给你的那些使用计算机网络远程(如果你的版本支持此类交互)与之交互的用户,明确提供一个通过一些标准或者常规的复制手段,从网络服务器上免费获得与你所修改的版本相匹配的源码的机会。
|
||||
|
||||
这个“通过计算机网络远程交互”的范围主要被认为是 SaaS 部署的情形,尽管其实际上读起来的意思超乎了惯例的 SaaS 部署情形。其目标是解决在用户在使用像 Web Services 这样的功能时,其代码没有公开的常规 GPL 协议所暴露出的漏洞。因此,该协议的第 13 节,在 GPLv2 第 3 节以及 GPLv3 和 AGPLv3 第 6 节中包含的目标代码分发的触发要求之外,提供了额外的源代码公开的要求。
|
||||
|
||||
常常被误解的是,AGPLv3 第 13 节中的源代码分发要求仅在 AGPLv3 软件已被“你”(例如,提供网络服务的实体)修改的地方才触发。我的理解是,只要“你”不修改 AGPLv3 的代码,许可证就不应该被理解为需要按照第 13 节规定的方式访问相应的源码。如我所见,尽管即使公开许可证中不要求公开的源代码也是一个好主意,但在 AGPL 下许多未修改以及标准部署的软件模块根本不会触发第 13 节。
|
||||
|
||||
如何解释 AGPL 的条款和条件,包括 AGPL 软件是否已被修改,可能需要根据具体情况的事实和细节进行法律层面的分析。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/kaufman-picture.jpg?itok=FPIizDR-)
|
||||
|
||||
Jeffrey R. Kaufman 是全球领先的开源软件解决方案提供商 Red Hat 公司的开源 IP 律师。Jeffrey 也是托马斯·杰斐逊法学院的兼职教授。在入职 Red Hat 之前,Jeffrey 曾经担任高通公司的专利顾问,向首席科学家办公室提供开源顾问。Jeffrey 在 RFID、条形码、图像处理和打印技术方面拥有多项专利。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/providing-corresponding-source-agplv3-license
|
||||
|
||||
作者:[Jeffrey Robert Kaufman][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[Bestony](https://github.com/Bestony)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/jkaufman
|
||||
[1]:https://www.gnu.org/licenses/agpl-3.0-standalone.html
|
@ -0,0 +1,71 @@
|
||||
为何 Linux 安装器需要添加安全功能
|
||||
============================================================
|
||||
|
||||
> 由于安全问题越来越严重,Linux 发行版需要在安装程序中突出显示基本安全选项,而不是让用户稍后手动添加这些选项。
|
||||
|
||||
十二年前,Linux 发行版努力使安装变得简单。在 Ubuntu 和 Fedora 的引领下,它们很早就实现了这一目标。现在,随着对安全性越来越关注,它们需要稍微转变下方向,并在安装程序中突出显示基本安全选项,而不是让用户稍后手动添加这些选项。
|
||||
|
||||
当然,即便是在最好的情况下,说服用户来设置安全功能都是困难的。太多用户甚至不愿意添加如非特权用户帐户或密码这样简单的功能,他们显然更喜欢用重装或者以每小时 80 美元的价格咨询专家来减少风险。
|
||||
|
||||
然而,即便一般用户不会专门注意安全,但他也可能会在安装过程中注意。他们可能永远不会再想到它,但也许在安装过程中,当他们的注意力集中时,特别是如果有可见的在线帮助来解释其好处时,他们可能被说服选择一个复选框。
|
||||
|
||||
这种转变也并不伟大。许多安装程序已经提供了自动登录的选择 - 这对于不包含个人数据的安装来说或许是可以接受的功能,但更可能会被那些觉得登录不方便的用户使用。同样感谢 Ubuntu,它选择加密文件系统 - 至少在主目录中是这样 - 它已经成为许多安装程序的标准。我真正建议的也是这样的。
|
||||
|
||||
此外,外部安装程序如 Firefox 已经无缝合并了隐私浏览,而 [Signal Private Messenger][8] 则是一个可替代标准 的 Android 手机和联系人的应用程序。
|
||||
|
||||
这些建议远不算激进。它只需要意志和想象力来实现它。
|
||||
|
||||
### Linux 安全第一步
|
||||
|
||||
应该将什么类型的安全功能添加到安装程序呢?
|
||||
|
||||
首先是防火墙。有许多图形界面程序可以设置防火墙。尽管十七年的经验,但是就像拜伦对柯尔律治的形而上的思想的讨论一样,我有时还是希望有人能来解释一下。
|
||||
|
||||
尽管出于好意,大多数防火墙工具对 iptables 的处理看起来都很直接。有一个现在已经停止维护的加固系统 [Bastille Linux][9] 可以用于安装一个基本的防火墙,我看不出为什么其他发行版做不到同样的事情。
|
||||
|
||||
一些工具可以用于安装后处理,并且对于安装器而言可以毫无困难地添加使用。例如,对于 [Grub 2][10],这个大多数发行版使用的引导管理器包含了基本密码保护。诚然,密码可以通过 Live CD 绕过,但它仍然在包括远程登录在内的日常情况下提供一定程度的保护。
|
||||
|
||||
类似地,一个类似于 [pwgen][11] 的密码生成器也可以添加到安装程序设置帐户的环节。这些工具强制可接受密码的长度、以及它们的大小写字母、数字和特殊字符的组合。它们许多都可以为你生成密码,有些甚至可以使生成的密码可拼读,以便你记住密码。
|
||||
|
||||
还有些工具也可以添加到安装过程的这个部分。例如,安装程序可以请求定期备份的计划,并添加一个计划任务和一个类似 [kbackup][12] 的简单的备份工具。
|
||||
|
||||
那么加密电子邮件怎么办?如今最流行的邮件阅读器包括了加密邮件的能力,但是设置和使用加密需要用户采取额外的设置,这使常见的任务复杂化,以至于用户会忽略它。然而,看看 Signal 在手机上的加密有多么简单,很显然,在笔记本电脑和工作站上加密会更容易。大多数发行版可能都喜欢对等加密,而不喜欢 Signal 那样的集中式服务器,但像 [Ring][13] 这样的程序可以提供这种功能。
|
||||
|
||||
无论在安装程序中添加了什么功能,也许这些预防措施也可以扩展到生产力软件,如 LibreOffice。大多数安全工作都集中在电子邮件、网络浏览和聊天中,但文字处理程序和电子表格及其宏语言,是一个明显的恶意软件感染的来源和隐私关注点。除了像 [Qubes OS][14] 或 [Subgraph][15] 这样的几个例外之外,很少有人努力将生产力软件纳入其安全预防措施 - 这可能会留下一个安全漏洞空缺。
|
||||
|
||||
### 适应现代
|
||||
|
||||
当然,在意安全的用户也许会采取一些安全的方法,这样的用户可以为自己负责。
|
||||
|
||||
我关心的是那些不太了解安全或不太愿意自己做修补的用户。我们越来越需要易于使用的安全性,并且亟待解决。
|
||||
|
||||
这些例子只是开始。所需要的工具大多数已经存在,只是需要以这样的方式来实现它们,使得用户不能忽略它们,并且能够不用懂什么就可以使用它们。可能实现所有这些只需要一个人月而已,包括原型、UI 设计和测试等等。
|
||||
|
||||
然而,在添加这些功能前,大多数主流的 Linux 发行版几乎不能说是关注到了安全性。毕竟,如果用户从不使用它们,那怎么会是好工具?
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.datamation.com/security/why-linux-installers-need-to-add-security-features.html
|
||||
|
||||
作者:[Bruce Byfield][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[Bestony](https://github.com/Bestony), [wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.datamation.com/author/Bruce-Byfield-6030.html
|
||||
[1]:http://www.datamation.com/feedback/http://www.datamation.com/security/why-linux-installers-need-to-add-security-features.html
|
||||
[2]:http://www.datamation.com/author/Bruce-Byfield-6030.html
|
||||
[3]:http://www.datamation.com/e-mail/http://www.datamation.com/security/why-linux-installers-need-to-add-security-features.html
|
||||
[4]:http://www.datamation.com/print/http://www.datamation.com/security/why-linux-installers-need-to-add-security-features.html
|
||||
[5]:http://www.datamation.com/security/why-linux-installers-need-to-add-security-features.html#comment_form
|
||||
[6]:http://www.datamation.com/security/why-linux-installers-need-to-add-security-features.html#
|
||||
[7]:http://www.datamation.com/author/Bruce-Byfield-6030.html
|
||||
[8]:https://whispersystems.org/
|
||||
[9]:http://bastille-linux.sourceforge.net/
|
||||
[10]:https://help.ubuntu.com/community/Grub2/Passwords
|
||||
[11]:http://pwgen-win.sourceforge.net/downloads.html
|
||||
[12]:http://kbackup.sourceforge.net/
|
||||
[13]:https://savannah.gnu.org/projects/ring/
|
||||
[14]:https://www.qubes-os.org/
|
||||
[15]:https://subgraph.com/sgos/
|
@ -0,0 +1,77 @@
|
||||
将 Tuleap 用于软件项目管理
|
||||
============================================================
|
||||
|
||||
> Tuleap 正在被 Eclipse 基金会使用,用来取代 Bugzilla
|
||||
|
||||
![Get to know Tuleap for project management](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=kOixOaEU "Get to know Tuleap for project management")
|
||||
|
||||
图片提供:opensource.com
|
||||
|
||||
Tuleap 是一个独特的开源项目管理工具,目前发展势头很好,现在,每个月它会出一个大版本。它还被列在 [2015 年五大开源项目管理工具][1]和 [2016 年十一个名列前茅项目管理工具][2]中。
|
||||
|
||||
Manuel Vacelet 是开发 Tuleap 项目的 Enalean 公司的联合创始人和 CTO,他说:“Tuleap 是一个完整用于托管软件项目的 GPLv2 平台,它提供了一个集中化的平台,在这里,团队可以找到他们所需的所有工具,追踪他们软件项目的生命周期。他们可以找到项目管理(Scrum、看板、瀑布、混合等等)、源码控制(git 和 svn)和代码审查(pull 请求和 gerrit)、持续集成、问题跟踪、wiki 和文档等的支持。”
|
||||
|
||||
在这次采访中,我会和 Manuel 讨论如何开始使用它,以及如何以开源方式管理 Tuleap。
|
||||
|
||||
**Nitish Tiwari(以下简称 NT): 为什么 Tuleap 项目很重要? **
|
||||
|
||||
**Manuel Vacelet(以下简称 MV):** Tuleap 很重要是因为我们坚信一个成功的(软件)项目必须涉及所有利益相关者:开发人员、项目经理、QA、客户和用户。
|
||||
|
||||
很久以前,我还是一个 SourceForge 衍生项目的实习生(当时 SourceForge 还是一个自由开源项目),几年后它变成了 Tuleap。 我的第一个贡献是将 PhpWiki 集成到该工具中(不要告诉任何人,代码写的很糟)。
|
||||
|
||||
现在,我很高兴作为首席技术官和产品负责人在 Enalean 工作,该公司是 Tuleap 项目的主要贡献公司。
|
||||
|
||||
**NT:让我们聊聊技术方面。**
|
||||
|
||||
**MV:** Tuleap 核心系统是基于 LAMP 并且架构于 CentOS 之上。如今的开发栈是 AngularJS (v1)、REST 后端(PHP)、基于 NodeJS 的实时推送服务器。但如果你想成为一名 Tuleap 全栈开发人员,你还将需要接触 bash、Perl、Python、Docker、Make 等等。
|
||||
|
||||
说到技术方面,需要重点强调的 Tuleap 的一个显著特征是它的可扩展性。一个运行在单服务器上的 Tuleap 单一实例、并且没有复杂的 IT 架构,可以处理超过 10000 人的访问。
|
||||
|
||||
**NT:给我们说下该项目的用户和社区。有谁参与?他们如何使用这个工具?**
|
||||
|
||||
**MV:** 用户非常多样化。从使用 Tuleap 跟踪他们的项目进度并管理他们的源代码的小型初创公司,到非常大的公司,如法国电信运营商 Orange,它为超过 17000 用户部署了它,并托管了 5000 个项目。
|
||||
|
||||
许多用户依靠 Tuleap 来促进敏捷项目并跟踪其进度。开发人员和客户共享同一个工作区。客户不需要学习如何使用 GitHub,也不需要开发人员做额外的工作,就可以将其工作转换到“客户可访问”平台。
|
||||
|
||||
今年,Tuleap 被 [Eclipse 基金会][3]所使用,取代了 Bugzilla。
|
||||
|
||||
印度电子信息技术部使用 Tuleap 创建了印度政府开放电子政务的开放式协作开发平台。
|
||||
|
||||
Tuleap 有多种不同的使用方式和配置。有些人使用它作为 Drupal 客户门户网站的后端; 它们通过 REST API 插入到 Tuleap 中以管理 bug 和服务请求。
|
||||
|
||||
甚至一些建筑师也使用它来管理他们的工作进度和 AutoCAD 文件。
|
||||
|
||||
**NT:Tuleap 是否做了一些特别的事,使社区更安全,更多样化?**
|
||||
|
||||
**MV:** 我们还没有创建“行为准则”;本社区非常平和而欢迎新人,但我们有计划这样做。Tuleap 的开发人员和贡献者来自不同的国家(例如加拿大、突尼斯、法国)。而且 35% 的活跃开发者和贡献者是女性。
|
||||
|
||||
**NT:由社区提议的 Tuleap 功能的百分比是多少?**
|
||||
|
||||
**MV:** 几乎 100% 的功能是由社区驱动的。
|
||||
|
||||
这是 Enalean 的关键挑战之一:找到一种商业模式,使我们能以正确的方式做开源软件。对我们来说,“开放核心”模式(其中应用程序的核心是开放的,但有趣和有用的部分是封闭源的)不是正确的方法,因为你最终还是要依赖闭源。因此,我们发明了 [OpenRoadmap][4],这种方式是我们从社区和最终用户那里收集需求,并找公司来为此买单。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/nitish-crop.png?itok=h4PaLDQq)
|
||||
|
||||
Nitish 是一名专业的软件开发人员并对开源有热情。作为一本基于 Linux 的杂志的技术作者,他会尝试新的开源工具。他喜欢阅读和探索任何开源相关的事情。在他的空闲时间,他喜欢读励志书。他目前正在构建 DevUp - 一个让开发人员以真正的方式连接所有工具和拥抱 DevOps 的平台。你可以在 Twitter 上关注他 @tiwari_nitish。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/interview-Tuleap-project
|
||||
|
||||
作者:[Nitish Tiwari][a]
|
||||
译者:[geekpi](https://github.com/geeki)
|
||||
校对:[jamsinepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/tiwarinitish86
|
||||
[1]:https://opensource.com/business/15/1/top-project-management-tools-2015
|
||||
[2]:https://opensource.com/business/16/3/top-project-management-tools-2016
|
||||
[3]:http://www.eclipse.org/
|
||||
[4]:https://blog.enalean.com/enalean-open-roadmap-how-it-works/
|
@ -0,0 +1,54 @@
|
||||
长期维护嵌入式 Linux 内核变得容易
|
||||
============================================================
|
||||
|
||||
![Jan Lübbe ](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/jan-lubbe-elc.png?itok=6G5lADKu "Jan Lübbe ")
|
||||
|
||||
*Pengutronix 内核黑客 Jan Lübbe 总结了嵌入式 Linux 中正在不断增长的安全威胁,并在这次欧洲嵌入式 Linux 会议上概述了一个计划,以保持长期设备的安全和功能完整。* [Linux 基金会][1]
|
||||
|
||||
安全漏洞只发生在 Windows 上的好日子正在快速过去。恶意软件黑客和拒绝服务老手们正在越来越多地瞄准过时的嵌入式 Linux 设备,因此在 10 月的[<ruby>欧洲嵌入式 Linux 会议<rt>Embedded Linux Conference Europe</rt></ruby>][3](ELCE)上的几个演讲的主题就与修复 Linux 安全漏洞相关。
|
||||
|
||||
最值得去听的讲演之一是 [Pengutronix][4] 内核黑客 Jan Lübbe 的《长期维护或管理(或免管理)嵌入式系统 10 年以上》。在总结嵌入式 Linux 中不断增长的安全威胁后,Lübbe 制定了一项计划,以确保长期设备的安全和功能完整。 Lübbe 说:“我们需要迁移到更新、更稳定的内核,并进行持续维护以修复关键漏洞。我们需要做上游更新和自动化流程,并建立一个可持续的工作流程。我们没有理由让系统中仍留有过时的软件。”
|
||||
|
||||
随着 Linux 设备变得越来越老,传统的生命周期过程已经不再适用。 Lübbe 说:“通常,你会从 SoC 供应商或主线上获取内核、构建系统,并添加到用户空间。你可以定制和添加程序,并做一些测试。但是,在此之后有 15 年的维护阶段,你最好期望平台不会发生变化、不会想要添加新的功能、不需要实施管理调整。”
|
||||
|
||||
所有这些变化,越来越多地导致你的系统暴露出新的错误,并需要大量更新以才能与上游软件保持同步。 Lübbe 说:“在内核中发生导致问题的错误并不总是无意的”。对于去年在 Allwinner 内核中发现的[后门][5],他又补充说:“这些供应商的内核从来不会执行主线内核社区的审查流程”。
|
||||
|
||||
Lübbe 继续说:“你不能认为你的供应商一直没问题。也许只有一两个工程师查看过后门代码这块。如果补丁发布在 Linux 内核邮件列表上,就不会有这种事,因为总会有人注意到。硬件供应商不关心安全或维护,也许你会在一两年后得到更新,但是即使这样,他们从一个固定版本开始开发,到他们发布稳定的版本通常需要几年的时间。如果你在这个基础上再开始开发,可能又过了半年,这就更过时了。”
|
||||
|
||||
越来越多的嵌入式开发人员在<ruby>长期稳定<rt>Long Term Stable</rt></ruby>(LTS)内核上构建长期产品。但这并不意味着没事了。Lübbe 说:“一个产品发布后,人们经常不再遵循稳定的发行链,也不再应用安全补丁。这样你会得到两个最糟糕的结果:过时的内核和没有安全性。你失去了多人测试的好处。”
|
||||
|
||||
Lübbe 指出,使用像 Red Hat 这样的面向服务器的发行版的 Pengutronix 客户经常由于快速的定制、需要系统管理员干预的部署和升级系统而遇到问题。
|
||||
|
||||
“更新对一些东西有用,特别是在 x86 上,但每个项目基本上是自己建立基础设施来更新到新版本。”
|
||||
|
||||
许多开发人员选择把向后移植作为更新长期产品的解决方案。Lübbe 说:“开始时很容易,但是一旦你不处于项目的维护范围,他们就不会告诉你所使用的版本是否受到一个 bug 的影响,因此很难判断一个修复是否相关。于是你不停打补丁和更新,而 bug 也在不断累积,而这些你必须自己维护,因为其他人不使用这些补丁。使用开源软件的好处就丢失了。”
|
||||
|
||||
### 跟随上游项目
|
||||
|
||||
Lübbe 认为,最好的解决方案是跟踪由上游项目维护的版本。“我们主要关注基于主线内核的开发,所以我们在产品和主流内核及其他上游项目之间尽可能没有差别。长期系统在主线内核上得到很好的支持。大多数不使用 3D 图形的系统只需要很少的补丁。较新的内核版本还有很多[新的强化功能][6],这些可以减少漏洞的影响。
|
||||
|
||||
跟随主线发展对许多开发人员来说似乎令人畏惧,但是如果从一开始就这样,然后坚持下去,就会相对容易一些,Lübbe 说:“你需要为系统上做的一切制定流程。你总需要知道什么软件正在运行,这在使用良好的构建系统时会更容易。每个软件版本应定义完整的系统,以便你可以更新相关的一切。如果你不知道那里有什么,你就不能解决它。你也需要一个自动测试和自动部署更新。”
|
||||
|
||||
为了“减少更新周期”,Lübbe 建议在开始开发时使用最新的 Linux 内核,并且在进入测试时才转到稳定的内核。之后,他建议每年将系统中的所有软件(包括内核、构建系统、用户空间、glibc 和组件(如 OpenSSL))更新为当年上游项目支持的版本。
|
||||
|
||||
Lübbe 说:“得到更新并不意味着你需要部署。如果没有看到安全漏洞,你可以把补丁放在一边,需要时它再用就行。”
|
||||
|
||||
最后,Lübbe 建议每个月查看发布公告,并且每周检查 CVE 和主线列表上的安全公告。你只需要问自己“该安全公告是否影响到了你”。他补充说:“如果你的内核足够新,就没有太多的工作。你不会希望通过在新闻中看到你的设备才获得有关你的产品的反馈。”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/news/event/ELCE/2017/long-term-embedded-linux-maintenance-made-easier
|
||||
|
||||
作者:[ERIC BROWN][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [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-lubbe-elcpng
|
||||
[3]:http://events.linuxfoundation.org/events/archive/2016/embedded-linux-conference-europe
|
||||
[4]:http://www.pengutronix.de/index_en.html
|
||||
[5]:http://arstechnica.com/security/2016/05/chinese-arm-vendor-left-developer-backdoor-in-kernel-for-android-pi-devices/
|
||||
[6]:https://www.linux.com/news/event/ELCE/2017hardening-kernel-protect-against-attackers
|
66
published/20170120 How to write web apps in R with Shiny.md
Normal file
66
published/20170120 How to write web apps in R with Shiny.md
Normal file
@ -0,0 +1,66 @@
|
||||
如何用 R 语言的 Shiny 库编写 web 程序
|
||||
============================================================
|
||||
![How to write web apps in R with Shiny](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_lightbulbs.png?itok=70w-2-Ta "How to write web apps in R with Shiny")
|
||||
|
||||
图片提供: opensource.com
|
||||
|
||||
我这个月在写一些更加长的文章,所以你们可以在几周后再来看看。本月,我想简要地提下我自己一直在玩的一个很棒的 R 库。
|
||||
|
||||
我的一个亲密朋友最近在用 R 编写东西。我一直都对它很感兴趣,也一直在试图挤时间,学习更多关于 R 的知识以及可用它做的事情。探索 R 的超强数字处理能力对我而言有些困难,因为我并不如我朋友那样有一个数学头脑。我进展有点慢,但我一直试图将它与我在其他领域的经验联系起来,我甚至开始考虑非常简单的 web 程序。
|
||||
|
||||
[Shiny][1] 是一个来自 RStudio 的工具包,它让创建 web 程序变得更容易。它能从 R 控制台轻松安装,只需要一行,就可以加载好最新的稳定版本来使用。这里有一个很棒的[教程][2],它可以在前面课程基础上,带着你理解应用架设的概念。 Shiny 的授权是 GPLv3,源代码可以在 [GitHub][3] 上获得。
|
||||
|
||||
这是一个用 Shiny 写的简单的小 web 程序:
|
||||
|
||||
```
|
||||
library(shiny)
|
||||
|
||||
server <- function(input, output, session) {
|
||||
observe({
|
||||
myText <- paste("Value above is: ", input$textIn)
|
||||
updateTextInput(session, "textOut", value=myText)
|
||||
})
|
||||
}
|
||||
|
||||
ui <- basicPage(
|
||||
h3("My very own sample application!"),
|
||||
textInput("textIn", "Input goes here, please."),
|
||||
textInput("textOut", "Results will be printed in this box")
|
||||
)
|
||||
|
||||
shinyApp(ui = ui, server = server)
|
||||
```
|
||||
|
||||
当你在输入框中输入文字时,它会被复制到输出框中提示语后。这并没有什么奇特的,但它向你展示了一个 Shiny 程序的基本结构。“server”部分允许你处理所有后端工作,如计算、数据库检索或程序需要发生的任何其他操作。“ui”部分定义了接口,它可以根据需要变得简单或复杂。
|
||||
|
||||
包括在 Shiny 中的 [Bootstrap][4] 有了大量样式和主题,所以在学习了一点后,就能用 R 创建大量功能丰富的 web 程序。使用附加包可以将功能扩展到更高级的 JavaScript 程序、模板等。
|
||||
|
||||
有几种方式处理 Shiny 的后端工作。如果你只是在本地运行你的程序,加载库就能做到。对于想要发布到网络上的程序,你可以在 [RStudio 的 Shiny 网站][5]上共享它们,运行开源版本的 Shiny 服务器,或通过按年订阅服务从 RStudio 处购买 Shiny Server Pro。
|
||||
|
||||
经验丰富的 R 大牛可能已经知道 Shiny 了;它已经存在大约几年了。对于像我这样来自一个完全不同的编程语言,并且希望学习一点 R 的人来说,它是相当有帮助的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/ruth1_avi.jpg?itok=I_EE7NmY)
|
||||
|
||||
D Ruth Bavousett - D Ruth Bavousett 作为一名系统管理员和软件开发人员已经很长时间了,她的专业生涯开始于 VAX 11/780。在她的职业生涯(迄今为止)中,她花费了大量的时间在满足库的需求上,她自 2008 年以来一直是 Koha 开源库自动化套件的贡献者. Ruth 目前在休斯敦的 cPanel 任 Perl 开发人员,他也作为首席员工效力于双猫公司。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/writing-new-web-apps-shiny
|
||||
|
||||
作者:[D Ruth Bavousett][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/druthb
|
||||
[1]:http://shiny.rstudio.com/
|
||||
[2]:http://shiny.rstudio.com/tutorial
|
||||
[3]:https://github.com/studio/shiny
|
||||
[4]:http://getbootstrap.com/
|
||||
[5]:http://shinyapps.io/
|
@ -0,0 +1,94 @@
|
||||
GNU/Linux,爱憎由之
|
||||
==================
|
||||
|
||||
首先,我能确定本文提及的内容一定会造成激烈的辩论,从之前那篇 [我讨厌 GNU/Linux 的五个理由 – 你呢,爱还是恨?][1] 的页底评论区就可见一斑。
|
||||
|
||||
也因此,我在此没有使用恨 (hate) 这个词,那会让我感觉很不舒服,所以我觉得用不喜欢 (dislike) 来代替更合适。
|
||||
|
||||
[![关于 Linux,我所不喜欢的事情](http://www.tecmint.com/wp-content/uploads/2015/11/Things-I-Dislike-About-Linux.png)][2]
|
||||
|
||||
*关于 Linux,我所不喜欢的 5 件事。*
|
||||
|
||||
也就是说,请读者记住,文中的观点完完全全出于我个人和自身的经历,而这些想法和经历可能会和他人的相似,也可能相去甚远。
|
||||
|
||||
此外,我也意识到,这些所谓的不喜欢(dislike)是与经验相关的,Linux 就是这个样子。然而,但正是这些事实阻碍了新用户做出迁移系统的决定。
|
||||
|
||||
像从前一样,随时留下评论并展开讨论,或者提出任何其他符合本文主题的观点。
|
||||
|
||||
### 不喜欢理由之一:从 Windows 迁移到 Linux 对用户来说是个陡峭的学习曲线
|
||||
|
||||
如果说使用 Windows 已经成为了你生活中不可缺少的一个部分,那么你在 Linux 电脑上安装一个新软件之前,还必须要习惯和理解诸如远程仓库(repository)、依赖关系(dependency)、包(package)和包管理器(package manager)等概念。
|
||||
|
||||
不久你也会发现,仅仅使用鼠标点击一个可执行程序是很难完成某个程序的安装的。或者由于一些原因,你没有可用的网络,那么安装一个你想要的软件会是一件非常累人的任务。
|
||||
|
||||
### 不喜欢理由之二:独立学习使用仍存在困难
|
||||
|
||||
类似理由一,事实上,最开始独立学习 Linux 知识的时候,很多人都会觉得那是一个巨大挑战。尽管网上有数以千万计的教程和 [大量的好书][3],但初学者也会因此烦了选择困难症,不知从何开始学习。
|
||||
|
||||
此外,数不清的社区 (比如:[linuxsay.com][4]) 论坛中都有大量的有经验用户为大家无偿提供(通常都是这样的)解答,但不幸的是,这些问题的解答并不完全可信、或者与新用户的经验和知识层面不匹配,导致用户无法理解。
|
||||
|
||||
事实上,因为有太多的发行版系列及其衍生版本可以获取,这使得我们有必要向第三方机构付费,让他们指引我们走向 Linux 世界的第一步、了解这些发行版系列之间的相同点以及区别。
|
||||
|
||||
### 不喜欢理由之三:新老系统/软件迁移问题
|
||||
|
||||
一旦你下定决心开始使用 Linux,那么无论是在家里或是办公室,也无论是个人版或者企业级,你都要完全从旧系统向新系统迁移,然后要考虑这些年来你所使用的软件在 Linux 平台上的替代产品。
|
||||
|
||||
而这确实令人矛盾不已,特别是要面对相同类型(比如文本处理器、关系型数据库系统、图形套件等) 的多个不同程序,而又没有受过专业指导和训练,那么很多人都下定不了决心要使用哪个好。
|
||||
|
||||
除非有可敬的有经验用户或者教学视频进行指导,否则存在太多的软件实例给用户进行选择,真的会让人走进误区。
|
||||
|
||||
### 不喜欢理由之四:缺乏硬件厂商的驱动支持
|
||||
|
||||
恐怕没有人能否认这样的事实,Linux 走过了漫长的历史,它的第一个内核版本公布已经有 20 多年了(LCTT 译注:准确说是将近 26 年了,1991.10.05 - 2017.02,相信现今很多我们这些 Linux 用户在第一个内核版本公布的时候都还没出生,包括译者在内)。随着越来越多的设备驱动编译进每次发布的稳定内核中、越来越多的厂商开始支持研究和开发兼容 Linux 的设备驱动,Linux 用户们不再会经常遇到设备运行不正常的情况了,但还是会偶尔遭遇的。
|
||||
|
||||
并且,如果你的个人计算或者公司业务需要一个特殊设备,但恰巧又没有现成的 Linux 驱动,你还得困在 Windows 或者其他有驱动支持的其他系统。
|
||||
|
||||
尽管你经常这样提醒自己:“闭源软件真他妈邪恶!”,但事实上的确有闭源软件,并且不幸的是,出于商业需求我们多数情况还是被迫使用它。
|
||||
|
||||
### 不喜欢理由之五:Linux 的主要力量仍在于服务器
|
||||
|
||||
这么说吧,我加入 Linux 阵营的主要原因是多年前它将一台老电脑生机焕发并能够正常使用让我看到了它的前景。花费了一段时间来解决不喜欢理由之一、之二中遇到的那些问题,并且成功使用一台 566 MHz 赛扬处理器、10 GB IDE 硬盘以及仅有 256 MB 内存的机器搭载 Debian Squeeze 建立起一个家庭文件/打印/ Web 服务于一体的服务器之后,我非常开心。
|
||||
|
||||
当我发现即便是处于高负载的情况,[htop 显示][5] 系统资源消耗才勉强到达一半,这令非常我惊喜。
|
||||
|
||||
你可能已经不停在再问自己,文中明明说的是不喜欢 Linux,为什么还提这些事呢?答案很简单,我是需要一个比较好的 Linux 桌面发行版来运行在一台相对老旧的电脑上。当然我并不指望能够有那么一个发行版可以运行上述提到那种硬件特征的电脑上,但我的确没有发现有任何一款外观漂亮的可定制桌面系统能运行在 1 GB 内存以下的电脑中,如果可以,其速度大概比鼻涕虫还慢吧。
|
||||
|
||||
我想在此重申一下:我是说“我没发现”,而非“不存在”。可能某天我会发现一个较好的 Linux 桌面发行版能够用在我房间里那台寿终正寝的笔记本上。如果那天真的到来,我将首先删除这篇文章,并向它竖起大拇指。
|
||||
|
||||
### 总而言之
|
||||
|
||||
在本文中,我也尝试了提及 Linux 在某些地方仍需不断改进。我是一名幸福的 Linux 用户,并由衷地感谢那些杰出的社区不断为 Linux 系统、组件和其他功能做出贡献。我想重复一下我在本文开头说的 —— 这些明显的不足点,如果从适当的角度去看也是一种优势,或者也快了吧。
|
||||
|
||||
在那到来之前,让我们相互支持,一起学习并帮助 Linux 成长和传播。随时在下方留下你的评论和问题 —— 我们期待你不同的观点。
|
||||
|
||||
-------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Gabriel Cánepa —— 一位来自阿根廷圣路易斯梅塞德斯镇 (Villa Mercedes, San Luis, Argentina) 的 GNU/Linux 系统管理员,Web 开发者。就职于一家世界领先级的消费品公司,乐于在每天的工作中能使用 FOSS 工具来提高生产力。
|
||||
|
||||
-------------------------------
|
||||
|
||||
译者简介:
|
||||
|
||||
[GHLandy](http://GHLandy.com) —— 生活中所有欢乐与苦闷都应藏在心中,有些事儿注定无人知晓,自己也无从说起。
|
||||
|
||||
-------------------------------
|
||||
|
||||
via: http://www.tecmint.com/things-i-dislike-and-love-about-gnu-linux/
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/gacanepa/
|
||||
[1]:https://linux.cn/article-3855-1.html
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2015/11/Things-I-Dislike-About-Linux.png
|
||||
[3]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
|
||||
[4]:http://linuxsay.com/
|
||||
[5]:http://www.tecmint.com/install-htop-linux-process-monitoring-for-rhel-centos-fedora/
|
||||
[6]:http://www.tecmint.com/author/gacanepa/
|
||||
[7]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
|
||||
[8]:http://www.tecmint.com/free-linux-shell-scripting-books/
|
@ -0,0 +1,411 @@
|
||||
如何获取、安装和制作 GTK 主题
|
||||
=====================
|
||||
|
||||
多数桌面版 Linux 都支持主题。GUI(LCTT 译注:图形用户界面)独有的外观或者“风格”叫做主题。用户可以改变主题让桌面看起来与众不同。通常,用户也会更改图标,然而,主题和图标包是两个独立的实体。很多人想制作他们自己的主题,因此这是一篇关于 GTK 主题的制作以及各种制作时所必需的信息的文章。
|
||||
|
||||
**注意:** 这篇文章着重讨论 GTK3,但会稍微谈一下 GTK2、Metacity 等。本文不会讨论光标和图标。
|
||||
|
||||
###基本概念
|
||||
|
||||
GIMP 工具包(简称 GTK)是一个用来在多种系统上(因此造就了 GTK 的跨平台)创建图形用户界面的构件工具包。GTK([http://www.gtk.org/][17])通常被误认为代表“GNOME 工具包”,但实际上它代表“GIMP 工具包”,因为最初创造它是为了给 GIMP 设计用户界面。GTK 是一个用 C 语言编写的面向对象工具包(GTK 本身不是一种语言)。GTK 遵循 LGPL 协议完全开源。GTK 是一个广泛使用的图形用户界面工具包,它含有很多用于 GTK 的工具。
|
||||
|
||||
为 GTK 制作的主题无法用在基于 Qt 的应用上。QT 应用需要使用 Qt 主题。
|
||||
|
||||
主题使用层叠样式表(CSS)来生成主题样式。这里的 CSS 和网站开发者在网页上使用的相同。然而不是引用 HTML 标签,而是引用 GTK 构件的专用标签。学习 CSS 对主题开发者来说很重要。
|
||||
|
||||
### 主题存放位置
|
||||
|
||||
主题可能会存储在 `~/.themes` 或者 `/usr/share/themes` 文件夹中。存放在 `~/.themes` 文件夹下的主题只有此 home 文件夹的所有者可以使用。而存放在 `/usr/share/themes` 文件夹下的全局主题可供所有用户使用。当执行 GTK 程序时,它会按照某种确定的顺序检查可用主题文件的列表。如果没有找到主题文件,它会尝试检查列表中的下一个文件。下述文字是 GTK3 程序检查时的顺序列表。
|
||||
|
||||
1. `$XDG_CONFIG_HOME/gtk-3.0/gtk.css` (另一写法 `~/.config/gtk-3.0/gtk.css`)
|
||||
2. `~/.themes/NAME/gtk-3.0/gtk.css`
|
||||
3. `$datadir/share/themes/NAME/gtk-3.0/gtk.css` (另一写法 `/usr/share/themes/name/gtk-3.0/gtk.css`)
|
||||
|
||||
**注意:** “NAME”代表当前主题名称。
|
||||
|
||||
如果有两个主题名字相同,那么存放在用户 home 文件夹(`~/.themes`)里的主题会被优先使用。开发者可以利用这个 GTK 主题查找算法的优势来测试存放在本地 home 文件夹的主题。
|
||||
|
||||
### 主题引擎
|
||||
|
||||
主题引擎是软件的一部分,用来改变图形用户界面构件的外观。引擎通过解析主题文件来了解应当绘制多少种构件。有些引擎随着主题被开发出来。每种引擎都有优点和缺点,还有些引擎添加了某些特性和特色。
|
||||
|
||||
从默认软件源中可以获取很多主题引擎。Debian 系的 Linux 发行版可以执行 `apt-get install gtk2-engines-murrine gtk2-engines-pixbuf gtk3-engines-unico` 命令来安装三种不同的引擎。很多引擎同时支持 GTK2 和 GTK3。以下述列表为例:
|
||||
|
||||
* gtk2-engines-aurora - Aurora GTK2 引擎
|
||||
* gtk2-engines-pixbuf - Pixbuf GTK2 引擎
|
||||
* gtk3-engines-oxygen - 将 Oxygen 组件风格移植 GTK 的引擎
|
||||
* gtk3-engines-unico - Unico GTK3 引擎
|
||||
* gtk3-engines-xfce - 用于 Xfce 的 GTK3 引擎
|
||||
|
||||
### 创作 GTK3 主题
|
||||
|
||||
开发者创作 GTK3 主题时,或者从空文件着手,或者将已有的主题作为模板。从现存主题着手可能会对新手有帮助。比如,开发者可以把主题复制到用户的 home 文件夹,然后编辑这些文件。
|
||||
|
||||
GTK3 主题的通用格式是新建一个以主题名字命名的文件夹。然后新建一个名为 `gtk-3.0` 的子目录,在子目录里新建一个名为 `gtk.css` 的文件。在文件 `gtk.css` 里,使用 CSS 代码写出主题的外观。为了测试可以将主题移动到 `~/.theme` 里。使用新主题并在必要时进行改进。如果有需求,开发者可以添加额外的组件,使主题支持 GTK2、Openbox、Metacity、Unity 等桌面环境。
|
||||
|
||||
为了阐明如何创造主题,我们会学习 Ambiance 主题,通常可以在 `/usr/share/themes/Ambiance` 找到它。此目录包含下面列出的子目录以及一个名为 `index.theme` 的文件。
|
||||
|
||||
* gtk-2.0
|
||||
* gtk-3.0
|
||||
* metacity-1
|
||||
* unity
|
||||
|
||||
`index.theme` 含有元数据(比如主题的名字)和一些重要的配置(比如按钮的布局)。下面是 Ambiance 主题的 `index.theme` 文件内容。
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Type=X-GNOME-Metatheme
|
||||
Name=Ambiance
|
||||
Comment=Ubuntu Ambiance theme
|
||||
Encoding=UTF-8
|
||||
|
||||
[X-GNOME-Metatheme]
|
||||
GtkTheme=Ambiance
|
||||
MetacityTheme=Ambiance
|
||||
IconTheme=ubuntu-mono-dark
|
||||
CursorTheme=DMZ-White
|
||||
ButtonLayout=close,minimize,maximize:
|
||||
X-Ubuntu-UseOverlayScrollbars=true
|
||||
```
|
||||
|
||||
`gtk-2.0` 目录包括支持 GTK2 的文件,比如文件 `gtkrc` 和文件夹 `apps`。文件夹 `apps` 包括具体程序的 GTK 配置。文件 `gtkrc` 是 GTK2 部分的主要 CSS 文件。下面是 `/usr/share/themes/Ambiance/gtk-2.0/apps/nautilus.rc` 文件的内容。
|
||||
|
||||
```
|
||||
# ==============================================================================
|
||||
# NAUTILUS SPECIFIC SETTINGS
|
||||
# ==============================================================================
|
||||
|
||||
style "nautilus_info_pane" {
|
||||
bg[NORMAL] = @bg_color
|
||||
}
|
||||
|
||||
widget_class "*Nautilus*<GtkNotebook>*<GtkEventBox>" style "nautilus_info_pane"
|
||||
widget_class "*Nautilus*<GtkButton>" style "notebook_button"
|
||||
widget_class "*Nautilus*<GtkButton>*<GtkLabel>" style "notebook_button"
|
||||
```
|
||||
|
||||
`gtk-3.0` 目录里是 GTK3 的文件。GTK3 使用 `gtk.css` 取代了 `gtkrc` 作为主文件。对于 Ambiance 主题,此文件有一行 `@import url("gtk-main.css");`。`settings.ini` 包含重要的主题级配置。GTK3 主题的 `apps` 目录和 GTK2 有同样的作用。`assets` 目录里有单选按钮、多选框等的图像文件。下面是 `/usr/share/themes/Ambiance/gtk-3.0/gtk-main.css` 的内容。
|
||||
|
||||
```
|
||||
/*default color scheme */
|
||||
@define-color bg_color #f2f1f0;
|
||||
@define-color fg_color #4c4c4c;
|
||||
@define-color base_color #ffffff;
|
||||
@define-color text_color #3C3C3C;
|
||||
@define-color selected_bg_color #f07746;
|
||||
@define-color selected_fg_color #ffffff;
|
||||
@define-color tooltip_bg_color #000000;
|
||||
@define-color tooltip_fg_color #ffffff;
|
||||
|
||||
/* misc colors used by gtk+
|
||||
*
|
||||
* Gtk doesn't currently expand color variables for style properties. Thus,
|
||||
* gtk-widgets.css uses literal color names, but includes a comment containing
|
||||
* the name of the variable. Please remember to change values there as well
|
||||
* when changing one of the variables below.
|
||||
*/
|
||||
@define-color info_fg_color rgb (181, 171, 156);
|
||||
@define-color info_bg_color rgb (252, 252, 189);
|
||||
@define-color warning_fg_color rgb (173, 120, 41);
|
||||
@define-color warning_bg_color rgb (250, 173, 61);
|
||||
@define-color question_fg_color rgb (97, 122, 214);
|
||||
@define-color question_bg_color rgb (138, 173, 212);
|
||||
@define-color error_fg_color rgb (235, 235, 235);
|
||||
@define-color error_bg_color rgb (223, 56, 44);
|
||||
@define-color link_color @selected_bg_color;
|
||||
@define-color success_color #4e9a06;
|
||||
@define-color error_color #df382c;
|
||||
|
||||
/* theme common colors */
|
||||
@define-color button_bg_color shade (@bg_color, 1.02); /*shade (#cdcdcd, 1.08);*/
|
||||
@define-color notebook_button_bg_color shade (@bg_color, 1.02);
|
||||
@define-color button_insensitive_bg_color mix (@button_bg_color, @bg_color, 0.6);
|
||||
@define-color dark_bg_color #3c3b37;
|
||||
@define-color dark_fg_color #dfdbd2;
|
||||
|
||||
@define-color backdrop_fg_color mix (@bg_color, @fg_color, 0.8);
|
||||
@define-color backdrop_text_color mix (@base_color, @text_color, 0.8);
|
||||
@define-color backdrop_dark_fg_color mix (@dark_bg_color, @dark_fg_color, 0.75);
|
||||
/*@define-color backdrop_dark_bg_color mix (@dark_bg_color, @dark_fg_color, 0.75);*/
|
||||
@define-color backdrop_selected_bg_color shade (@bg_color, 0.92);
|
||||
@define-color backdrop_selected_fg_color @fg_color;
|
||||
|
||||
@define-color focus_color alpha (@selected_bg_color, 0.5);
|
||||
@define-color focus_bg_color alpha (@selected_bg_color, 0.1);
|
||||
|
||||
@define-color shadow_color alpha(black, 0.5);
|
||||
|
||||
@define-color osd_fg_color #eeeeec;
|
||||
@define-color osd_bg_color alpha(#202526, 0.7);
|
||||
@define-color osd_border_color alpha(black, 0.7);
|
||||
|
||||
@import url("gtk-widgets-borders.css");
|
||||
@import url("gtk-widgets-assets.css");
|
||||
@import url("gtk-widgets.css");
|
||||
@import url("apps/geary.css");
|
||||
@import url("apps/unity.css");
|
||||
@import url("apps/baobab.css");
|
||||
@import url("apps/gedit.css");
|
||||
@import url("apps/nautilus.css");
|
||||
@import url("apps/gnome-panel.css");
|
||||
@import url("apps/gnome-terminal.css");
|
||||
@import url("apps/gnome-system-log.css");
|
||||
@import url("apps/unity-greeter.css");
|
||||
@import url("apps/glade.css");
|
||||
@import url("apps/california.css");
|
||||
@import url("apps/software-center.css");
|
||||
@import url("public-colors.css");
|
||||
```
|
||||
|
||||
`metacity-1` 文件夹含有 Metacity 窗口管理器按钮(比如“关闭窗口”按钮)的图像文件。此目录还有一个名为 `metacity-theme-1.xml` 的文件,包括了主题的元数据(像开发者的名字)和主题设计。然而,主题的 Metacity 部分使用 XML 文件而不是 CSS 文件。
|
||||
|
||||
`unity` 文件夹含有 Unity 按钮使用的 SVG 文件。除了 SVG 文件,这里没有其他的文件。
|
||||
|
||||
一些主题可能也会包含其他的目录。比如, Clearlooks-Phenix 主题有名为 `openbox-3` 和 `xfwm4` 的文件夹。`openbox-3` 文件夹仅有一个 `themerc` 文件,声明了主题配置和外观(下面有文件示例)。`xfwm4` 目录含有几个 xpm 文件、几个 png 图像文件(在 `png` 文件夹里)、一个 `README` 文件,还有个包含了主题配置的 `themerc` 文件(就像下面看到的那样)。
|
||||
|
||||
/usr/share/themes/Clearlooks-Phenix/xfwm4/themerc
|
||||
|
||||
```
|
||||
# Clearlooks XFWM4 by Casey Kirsle
|
||||
|
||||
show_app_icon=true
|
||||
active_text_color=#FFFFFF
|
||||
inactive_text_color=#939393
|
||||
title_shadow_active=frame
|
||||
title_shadow_inactive=false
|
||||
button_layout=O|HMC
|
||||
button_offset=2
|
||||
button_spacing=2
|
||||
full_width_title=true
|
||||
maximized_offset=0
|
||||
title_vertical_offset_active=1
|
||||
title_vertical_offset_inactive=1
|
||||
```
|
||||
|
||||
/usr/share/themes/Clearlooks-Phenix/openbox-3/themerc
|
||||
|
||||
```
|
||||
!# Clearlooks-Evolving
|
||||
!# Clearlooks as it evolves in gnome-git...
|
||||
!# Last updated 09/03/10
|
||||
|
||||
# Fonts
|
||||
# these are really halos, but who cares?
|
||||
|
||||
*.font: shadow=n
|
||||
window.active.label.text.font:shadow=y:shadowtint=30:shadowoffset=1
|
||||
window.inactive.label.text.font:shadow=y:shadowtint=00:shadowoffset=0
|
||||
menu.items.font:shadow=y:shadowtint=0:shadowoffset=1
|
||||
|
||||
!# general stuff
|
||||
|
||||
border.width: 1
|
||||
padding.width: 3
|
||||
padding.height: 2
|
||||
window.handle.width: 3
|
||||
window.client.padding.width: 0
|
||||
menu.overlap: 2
|
||||
*.justify: center
|
||||
|
||||
!# lets set our damn shadows here, eh?
|
||||
|
||||
*.bg.highlight: 50
|
||||
*.bg.shadow: 05
|
||||
|
||||
window.active.title.bg.highlight: 35
|
||||
window.active.title.bg.shadow: 05
|
||||
|
||||
window.inactive.title.bg.highlight: 30
|
||||
window.inactive.title.bg.shadow: 05
|
||||
|
||||
window.*.grip.bg.highlight: 50
|
||||
window.*.grip.bg.shadow: 30
|
||||
|
||||
window.*.handle.bg.highlight: 50
|
||||
window.*.handle.bg.shadow: 30
|
||||
|
||||
!# Menu settings
|
||||
|
||||
menu.border.color: #aaaaaa
|
||||
menu.border.width: 1
|
||||
|
||||
menu.title.bg: solid flat
|
||||
menu.title.bg.color: #E6E7E6
|
||||
menu.title.text.color: #111111
|
||||
|
||||
menu.items.bg: Flat Solid
|
||||
menu.items.bg.color: #ffffff
|
||||
menu.items.text.color: #111111
|
||||
menu.items.disabled.text.color: #aaaaaa
|
||||
|
||||
menu.items.active.bg: Flat Gradient splitvertical border
|
||||
|
||||
menu.items.active.bg.color: #97b8e2
|
||||
menu.items.active.bg.color.splitTo: #a8c5e9
|
||||
|
||||
menu.items.active.bg.colorTo: #91b3de
|
||||
menu.items.active.bg.colorTo.splitTo: #80a7d6
|
||||
menu.items.active.bg.border.color: #4b6e99
|
||||
menu.items.active.text.color: #ffffff
|
||||
|
||||
menu.separator.width: 1
|
||||
menu.separator.padding.width: 0
|
||||
menu.separator.padding.height: 3
|
||||
menu.separator.color: #aaaaaa
|
||||
|
||||
!# set handles here and only the once?
|
||||
|
||||
window.*.handle.bg: Raised solid
|
||||
window.*.handle.bg.color: #eaebec
|
||||
|
||||
window.*.grip.bg: Raised solid
|
||||
window.*.grip.bg.color: #eaebec
|
||||
|
||||
!# Active
|
||||
|
||||
window.*.border.color: #585a5d
|
||||
|
||||
window.active.title.separator.color: #4e76a8
|
||||
|
||||
*.title.bg: Raised Gradient splitvertical
|
||||
*.title.bg.color: #8CB0DC
|
||||
*.title.bg.color.splitTo: #99BAE3
|
||||
*.title.bg.colorTo: #86ABD9
|
||||
*.title.bg.colorTo.splitTo: #7AA1D1
|
||||
|
||||
window.active.label.bg: Parentrelative
|
||||
window.active.label.text.color: #ffffff
|
||||
|
||||
window.active.button.*.bg: Flat Gradient splitvertical Border
|
||||
|
||||
window.active.button.*.bg.color: #92B4DF
|
||||
window.active.button.*.bg.color.splitTo: #B0CAEB
|
||||
window.active.button.*.bg.colorTo: #86ABD9
|
||||
window.active.button.*.bg.colorTo.splitTo: #769FD0
|
||||
|
||||
window.active.button.*.bg.border.color: #49678B
|
||||
window.active.button.*.image.color: #F4F5F6
|
||||
|
||||
window.active.button.hover.bg.color: #b5d3ef
|
||||
window.active.button.hover.bg.color.splitTo: #b5d3ef
|
||||
window.active.button.hover.bg.colorTo: #9cbae7
|
||||
window.active.button.hover.bg.colorTo.splitTo: #8caede
|
||||
window.active.button.hover.bg.border.color: #4A658C
|
||||
window.active.button.hover.image.color: #ffffff
|
||||
|
||||
window.active.button.pressed.bg: Flat solid Border
|
||||
window.active.button.pressed.bg.color: #7aa1d2
|
||||
|
||||
window.active.button.hover.bg.border.color: #4A658C
|
||||
|
||||
!# inactive
|
||||
|
||||
!#window.inactive.border.color: #7e8285
|
||||
window.inactive.title.separator.color: #96999d
|
||||
|
||||
window.inactive.title.bg: Raised Gradient splitvertical
|
||||
window.inactive.title.bg.color: #E3E2E0
|
||||
window.inactive.title.bg.color.splitTo: #EBEAE9
|
||||
window.inactive.title.bg.colorTo: #DEDCDA
|
||||
window.inactive.title.bg.colorTo.splitTo: #D5D3D1
|
||||
|
||||
window.inactive.label.bg: Parentrelative
|
||||
window.inactive.label.text.color: #70747d
|
||||
|
||||
window.inactive.button.*.bg: Flat Gradient splitVertical Border
|
||||
window.inactive.button.*.bg.color: #ffffff
|
||||
window.inactive.button.*.bg.color.splitto: #ffffff
|
||||
window.inactive.button.*.bg.colorTo: #F9F8F8
|
||||
window.inactive.button.*.bg.colorTo.splitto: #E9E7E6
|
||||
window.inactive.button.*.bg.border.color: #928F8B
|
||||
window.inactive.button.*.image.color: #6D6C6C
|
||||
|
||||
!# osd (pop ups and what not, dock?)
|
||||
|
||||
osd.border.width: 1
|
||||
osd.border.color: #aaaaaa
|
||||
|
||||
osd.bg: flat border gradient splitvertical
|
||||
osd.bg.color: #F0EFEE
|
||||
osd.bg.color.splitto: #f5f5f4
|
||||
osd.bg.colorTo: #EAEBEC
|
||||
osd.bg.colorTo.splitto: #E7E5E4
|
||||
|
||||
osd.bg.border.color: #ffffff
|
||||
|
||||
osd.active.label.bg: parentrelative
|
||||
osd.active.label.bg.color: #efefef
|
||||
osd.active.label.bg.border.color: #9c9e9c
|
||||
osd.active.label.text.color: #444
|
||||
|
||||
osd.inactive.label.bg: parentrelative
|
||||
osd.inactive.label.text.color: #70747d
|
||||
|
||||
!# yeah whatever, this is fine anyhoo?
|
||||
osd.hilight.bg: flat vertical gradient
|
||||
osd.hilight.bg.color: #9ebde5
|
||||
osd.hilight.bg.colorTo: #749dcf
|
||||
osd.unhilight.bg: flat vertical gradient
|
||||
osd.unhilight.bg.color: #BABDB6
|
||||
osd.unhilight.bg.colorTo: #efefef
|
||||
```
|
||||
|
||||
### 测试主题
|
||||
|
||||
在创作主题时,测试主题并且微调代码对得到想要的样子是很有帮助的。有相当的开发者想要用到“主题预览器”这样的工具。幸运的是,已经有了。
|
||||
|
||||
* GTK+ Change Theme - 这个程序可以更改 GTK 主题,开发者可以用它预览主题。这个程序由一个含有很多构件的窗口组成,因此可以为主题提供一个完整的预览。要安装它,只需输入命令 `apt-get install gtk-chtheme`。
|
||||
* GTK Theme Switch - 用户可以使用它轻松地更换用户主题。测试主题时确保打开了一些应用,方便预览效果。要安装它,只需输入命令 `apt-get install gtk-theme-switch`,然后在终端敲出 `gtk-theme-switch2` 即可运行。
|
||||
* LXappearance - 它可以更换主题,图标以及字体。
|
||||
* PyWF - 这是基于 Python 开发的一个 The Widget Factory 的替代品。可以在 [http://gtk-apps.org/content/show.php/PyTWF?content=102024][1] 获取 PyWF。
|
||||
* The Widget Factory - 这是一个古老的 GTK 预览器。要安装它,只需输入命令 `apt-get install thewidgetfactory`,然后在终端敲出 `twf` 即可运行。
|
||||
|
||||
### 主题下载
|
||||
|
||||
* Cinnamon - [http://gnome-look.org/index.php?xcontentmode=104][2]
|
||||
* Compiz - [http://gnome-look.org/index.php?xcontentmode=102][3]
|
||||
* GNOME Shell - [http://gnome-look.org/index.php?xcontentmode=191][4]
|
||||
* GTK2 - [http://gnome-look.org/index.php?xcontentmode=100][5]
|
||||
* GTK3 - [http://gnome-look.org/index.php?xcontentmode=167][6]
|
||||
* KDE/Qt - [http://kde-look.org/index.php?xcontentmode=8x9x10x11x12x13x14x15x16][7]
|
||||
* Linux Mint Themes - [http://linuxmint-art.org/index.php?xcontentmode=9x14x100][8]
|
||||
* Metacity - [http://gnome-look.org/index.php?xcontentmode=101][9]
|
||||
* Ubuntu Themes - [http://www.ubuntuthemes.org/][10]
|
||||
|
||||
### 延伸阅读
|
||||
|
||||
* Graphical User Interface (GUI) Reading Guide - [http://www.linux.org/threads/gui-reading-guide.6471/][11]
|
||||
* GTK - [http://www.linux.org/threads/understanding-gtk.6291/][12]
|
||||
* Introduction to Glade - [http://www.linux.org/threads/introduction-to-glade.7142/][13]
|
||||
* Desktop Environment vs Window Managers - [http://www.linux.org/threads/desktop-environment-vs-window-managers.7802/][14]
|
||||
* Official GTK+ 3 Reference Manual - [https://developer.gnome.org/gtk3/stable/][15]
|
||||
* GtkCssProvider - [https://developer.gnome.org/gtk3/stable/GtkCssProvider.html][16]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linux.org/threads/installing-obtaining-and-making-gtk-themes.8463/
|
||||
|
||||
作者:[DevynCJohnson][a]
|
||||
译者:[fuowang](https://github.com/fuowang)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.linux.org/members/devyncjohnson.4843/
|
||||
[1]:http://gtk-apps.org/content/show.php/PyTWF?content=102024
|
||||
[2]:http://gnome-look.org/index.php?xcontentmode=104
|
||||
[3]:http://gnome-look.org/index.php?xcontentmode=102
|
||||
[4]:http://gnome-look.org/index.php?xcontentmode=191
|
||||
[5]:http://gnome-look.org/index.php?xcontentmode=100
|
||||
[6]:http://gnome-look.org/index.php?xcontentmode=167
|
||||
[7]:http://kde-look.org/index.php?xcontentmode=8x9x10x11x12x13x14x15x16
|
||||
[8]:http://linuxmint-art.org/index.php?xcontentmode=9x14x100
|
||||
[9]:http://gnome-look.org/index.php?xcontentmode=101
|
||||
[10]:http://www.ubuntuthemes.org/
|
||||
[11]:http://www.linux.org/threads/gui-reading-guide.6471/
|
||||
[12]:http://www.linux.org/threads/understanding-gtk.6291/
|
||||
[13]:http://www.linux.org/threads/introduction-to-glade.7142/
|
||||
[14]:http://www.linux.org/threads/desktop-environment-vs-window-managers.7802/
|
||||
[15]:https://developer.gnome.org/gtk3/stable/
|
||||
[16]:https://developer.gnome.org/gtk3/stable/GtkCssProvider.html
|
||||
[17]:http://www.gtk.org/
|
91
published/201702/20160425 What is SRE.md
Normal file
91
published/201702/20160425 What is SRE.md
Normal file
@ -0,0 +1,91 @@
|
||||
什么是 SRE(网站可靠性工程)?
|
||||
============================================================
|
||||
|
||||
网站可靠性工程师(Site Reliability Engineer)是近来越来越多看到的一个职位。它是什么意思?它来自哪里?让我们从 Google SRE 团队来学习。
|
||||
|
||||
![Bridge](https://d3tdunqjn7n0wj.cloudfront.net/360x240/bridge-1031545-1400-389c9609ff7c64083c93db48dc77eeff.jpg)
|
||||
|
||||
本文为 Niall Richard Murphy、Jennifer Petoff、Chris Jones、Betsy Beyer 编辑的 [<ruby>《网站可靠性工程》<rt>Site Reliability Engineering</rt></ruby>][9] 一书的摘录。
|
||||
|
||||
SRE 网站可靠性工程(Site Reliability Engineering)在[ 11 月 7-10 日在阿姆斯特丹举办的 O'Reilly Velocity 会议][10]上也有提到。
|
||||
|
||||
### 介绍
|
||||
|
||||
> 希望不是一种策略。
|
||||
>
|
||||
> —— 传统的 SRE 如是说
|
||||
|
||||
一个公认的事实是系统不会自己运行。 那么,一个系统 — 尤其是复杂大规模系统 — _应该_怎么运行呢?
|
||||
|
||||
### 系统管理员的服务管理方法
|
||||
|
||||
以前,公司雇用系统管理员来运行复杂的计算系统。
|
||||
|
||||
系统管理员(或者称为 sysadmin)这种方式包括整合现有软件组件,使之互相协作来完成一个服务。系统管理员的任务是运行服务,响应事件,并在事件发生时进行更新。随着系统复杂度的增长和流量的增长,事件和更新也相应增长,导致管理员团队也越来越庞大才能完成更多的工作。由于系统管理员的角色需要的技能与产品开发人员有很大不同,开发和系统管理员被分为不同的团队:“开发”和“运维”。
|
||||
|
||||
系统管理员模式的服务管理有几个优点。对于决定该如何运行和服务的公司而言,这种方法相对容易实现:它作为一个已被人们所熟悉的行业范例,有很多例子可以从中学习和效仿。相关人才库已经广泛普及。有一系列现有的工具,软件组件(现成的或其他)和集成公司可用于帮助运行这些组装的系统,所以新手系统管理团队不必重新发明轮子以及从头设计系统。
|
||||
|
||||
此方式将公司开发和运维分离,也有一些缺点和困难。主要有两类:直接代价和间接代价。
|
||||
|
||||
直接代价很显而易见了。利用依靠手工干预来进行变更管理和事件处理的团队进行服务管理,当服务和/或流量增长时,成本是很昂贵的,因为团队随着系统负载的增长也在相应增长。
|
||||
|
||||
开发/运维分离的间接代价可能不那么明显,但常常比直接代价还要昂贵。代价来自于两个团队背景,技术,激励都非常不同。他们使用不同的词汇来描述所面临的情境;对技术方案的风险和可能性他们持不同的假设;对产品稳定性的目标级别也会有不同的争议。团队的分离很容易导致不只是激励的不同,还有沟通、目标的不同,以及最终,信任和尊重的分离。这是一种恶性循环。
|
||||
|
||||
因此,传统运营团队及其在产品开发中的同行往往会发生冲突,最突出的是如何将软件发布到生产环境。在开发团队的核心上,他们希望推出新功能,并看到它们被用户采纳。在运维团队的核心上, 他们希望确保服务在运行中不会中断。因为大多数中断是由某种变化引起的 - 新的配置、新的功能发布或者新的用户流量类型 - 这两个团队的目标基本上处于紧张状态。
|
||||
|
||||
两个团队都明白,以最想要的条款(“我们可以没有阻碍地在任何时间发布任何东西”以及“我们不想在系统工作后改变任何东西”)来表达他们的利益是不可接受的。因为他们的词汇和风险假设都不同,两个团体经常采用常见的斗争形式来提高他们的利益。 运维团队试图通过提高发布和变更门槛来保护运行中的系统免受更改的风险。例如,发布审查可能包含对_每个_问题的显式审查,这些问题过去都_曾经_引起过服务中断 - 它可能是一个任意长度的列表,并且不是所有检查元素都一样重要。开发团队很快学会了如何回应。他们通过较少的“发布”和更多的“功能切换”、“增量更新”或 “选择性失明”来规避。他们采取诸如分割产品功能的策略,以便更少的功能受到发布审查。
|
||||
|
||||
### Google 的服务管理方法:网站可靠性工程
|
||||
|
||||
冲突不是提供软件服务的必然部分。Google 选择以不同的方式运行自己的系统:我们的网站可靠性工程团队专注于雇佣软件工程师来运行我们的产品,并创建系统来完成那些本来由系统工程师手动完成的工作。
|
||||
|
||||
什么是网站可靠性工程(Site Reliability Engineering),是如它在谷歌定义的那样么?我的解释很简单:SRE 是当你要求一位软件工程师设计一个运维团队时所发生的结果。当我在 2003 年加入 Google 并负责运行一个由 7 名工程师组成的“生产团队”时,那时我工作的全部都是软件工程。所以我以自己是一名 SRE 的方式,设计和管理了一个_我_想要的团队的样子。这个团队已经成为了 Google 的目前的 SRE 团队,它仍如最初一名终生软件工程师所想象的那个样子。
|
||||
|
||||
Google 服务管理方法的主要构成部分是由每个 SRE 团队组成的。作为一个整体,SRE 可以分为两大类。
|
||||
|
||||
50-60% 的人是 Google 软件工程师,或者更确切地说,是通过 Google 软件工程师的标准程序招聘的人。其他 40-50% 的候选人非常接近 Google 软件工程师资格(即拥有所需技能集的 85-99%),以及一些具有大多数软件工程师没有的一些 SRE 技术技能的人。到目前为止,UNIX 系统底层和网络(第 1 层到第 3 层)的专业知识是我们寻求的两种最常见的替代技术技能。
|
||||
|
||||
所有的 SRE 的共同点是有开发软件系统以解决复杂问题的信念和能力。在 SRE 中,我们密切跟踪两个团队的职业发展,并且迄今为止发现在两种工程师之间的表现没有实际差异。事实上,SRE 团队的多样性背景经常产生聪明、高质量的系统,这显然是几个技能集合成的产物。
|
||||
|
||||
我们这样招聘 SRE 的结果是,我们有了这样一个团队:(a)手动执行任务很快会变得无聊。(b)他们有必要的技能集来写出软件以取代以前的手动操作,即使解决方案很复杂。SRE 还会与其他开发部门分享学术以及知识背景。因此,SRE 从根本上做了一个运维团队历来做的工作,但它使用具有软件专业知识的工程师,并期望这些内在倾向于使用软件并且有能力用软件的人用软件设计并实现自动化来代替人力劳动。
|
||||
|
||||
按照设计,至关重要的是 SRE 团队专注于工程。没有恒定的工程,运维工作增加,团队将需要更多的人来上工作量。最终,传统的以运维为中心的团队与服务规模呈线性关系:如果服务支持的产品成功,运维工作将随着流量而增长。这意味着雇用更多的人一遍又一遍地完成相同的任务。
|
||||
|
||||
为了避免这种命运,负责管理服务的团队需要写代码,否则就会被工作淹没。因此,Google 为 SRE 们_设置了一个 “运维” 工作的上限,如任务单、紧急呼叫、手动任务最多只占 50% 工作量_。此上限确保 SRE 团队在其计划中有足够的时间使服务稳定及可操作。50% 是上限;随着时间的推移,除了自己的设备,SRE 团队应该只有很少的运维工作,他们几乎可以完全从事开发任务,因为服务基本上可以运行和维修自己:我们想要的系统是_自动的_,而不只是_自动化_。在实践中,规模和新功能始终是 SRE 要考虑的。
|
||||
|
||||
Google 的经验法则是,SRE 团队必须花费剩余的 50% 的时间来进行实际开发。那么我们该如何执行这个阈值呢?首先,我们必须测量 SRE 如何花费时间。通过测量,我们确保团队不断花费不到 50% 的时间用于开发改变他们实践的工作上。通常这意味着会将一些运维负担转移回开发团队,或者给团队添加新的员工,而不指派该团队额外的运维责任。意识到在运维和开发工作之间保持这种平衡使我们能保证 SRE 具有参与创造性的自主工程的空间,同时仍然保留从运维那学来的智慧。
|
||||
|
||||
我们发现 Google SRE 的运行大规模系统的方法有很多优点。由于 SRE 是直接修改代码以使 Google 的系统可以运行自己,SRE 团队的特点是快速创新以及大量接受变革。这样的团队能相对价廉地支持相同的服务,面向运维的团队需要大量的人。相反,运行、维护和改进系统所需的 SRE 的数量随系统的大小而线性收敛。最后,SRE 不仅规避了开发/运维分裂的障碍,而且这种结构也改善了我们的产品开发团队:产品开发和 SRE 团队之间的轻松转移交叉训练了整个团队,并且提高了那些在学习构建百万级别分布式系统上有困难的开发人员的技能。
|
||||
|
||||
尽管有这些好处,SRE 模型的特点是其自身独特的挑战。 Google 面临的一个持续挑战是招聘 SRE:SRE 不仅与产品开发招聘流程竞争相同的候选人,而且我们将招聘人员的编码和系统工程技能都设置得如此之高,这意味着我们的招聘池必然很小。由于我们的学科相对新颖独特,在如何建立和管理 SRE 团队方面没有太多的行业信息(不过希望这本书能朝着这个方向迈进!)。一旦 SRE 团队到位,他们潜在的非正统的服务管理方法需要强有力的管理支持。例如,一旦错误预估耗尽,除非是管理层的强制要求, 否则在季度剩余的时间里决定停止发布可能不会被产品开发团队所接受。
|
||||
|
||||
> **DevOps 或者 SRE?**
|
||||
|
||||
> “DevOps” 这个术语在 2008 年末出现,并在写这篇文章时(2016 年早期)仍在发生变动。 其核心原则:IT 部门在系统设计和开发的每个阶段的参与、严重依赖自动化与人力投入、工程实践和工具在操作任务中的应用,与许多 SRE 的原则和实践一致。 人们可以将 DevOps 视为几种核心 SRE原则向更广泛的组织,管理结构和人员的推广。 可以等价地将 SRE 视为具有某些特殊扩展的 DevOps 的特定实现。
|
||||
|
||||
------------------------
|
||||
|
||||
作者简介:Benjamin Treynor Sloss 创造了“网站可靠性工程(Site Reliability Engineering)”一词,他自 2003 年以来一直负责 Google 的全球运营、网络和生产工程。截至 2016 年,他管理着全球范围内一个大约 4000 名软硬件和网络工程师团队。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.oreilly.com/ideas/what-is-sre-site-reliability-engineering
|
||||
|
||||
作者:[Benjamin Treynor][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.oreilly.com/people/benjamin-treynor-sloss
|
||||
[1]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[2]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[3]:https://www.oreilly.com/ideas/what-is-sre-site-reliability-engineering
|
||||
[4]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[5]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[6]:https://www.oreilly.com/people/benjamin-treynor-sloss
|
||||
[7]:https://pixabay.com/
|
||||
[8]:https://www.oreilly.com/people/benjamin-treynor-sloss
|
||||
[9]:http://shop.oreilly.com/product/0636920041528.do?intcmp=il-webops-books-videos-update-na_new_site_site_reliability_engineering_text_cta
|
||||
[10]:http://conferences.oreilly.com/velocity/devops-web-performance-eu?intcmp=il-webops-confreg-update-vleu16_new_site_what_is_sre_text_cta
|
||||
[11]:https://pixabay.com/
|
114
published/201702/20160510 What is Docker.md
Normal file
114
published/201702/20160510 What is Docker.md
Normal file
@ -0,0 +1,114 @@
|
||||
Docker 是什么?
|
||||
================
|
||||
|
||||
![](https://d3tdunqjn7n0wj.cloudfront.net/720x480/card-catalog-crop-c76cf2c8b4881e6662c4e9058367a874.jpg)
|
||||
|
||||
> 这是一篇摘录,取自于 Karl Matthias 和 Sean P. Kane 撰写的 [Docker 即学即用][3]。其中或许包含一些引用到本文中没有的内容,因为那些是整本书中的一部分。
|
||||
|
||||
2013 年 3 月 15 日,在加利福尼亚州圣克拉拉召开的 Python 开发者大会上,dotCloud 的创始人兼首席执行官 Solomon Hvkes 在一场仅五分钟的[微型演讲][4]中,首次提出了 Docker 这一概念。当时,仅约 40 人(除 dotCloud 内部人员)获得了使用 Docker 的机会。
|
||||
|
||||
这在之后的几周内,有关 Docker 的新闻铺天盖地。随后这个项目很快在 [Github][5] 上开源,任何人都可以下载它并为其做出贡献。在之后的几个月中,越来越多的业界人士开始听说 Docker 以及它是如何彻底地改变了软件的开发、交付和运行的方式。一年之内,Docker 的名字几乎无人不知无人不晓,但还是有很多人不太明白 Docker 究竟是什么,人们为何如此兴奋。
|
||||
|
||||
Docker 是一个工具,它致力于为任何应用程序创建分发版本而简化封装流程,将其部署到各种规模的环境中,并将敏捷软件组织的工作流程和响应流水化。
|
||||
|
||||
### Docker 带来的希望
|
||||
|
||||
虽然表面上被视为一个虚拟化平台,但 Docker 远远不止如此。Docker 涉及的领域横跨了业界多个方面,包括 KVM、 Xen、 OpenStack、 Mesos、 Capistrano、 Fabric、 Ansible、 Chef、 Puppet、 SaltStack 等技术。或许你已经发现了,在 Docker 的竞争产品列表中有一些很值得关注。例如,大多数工程师都不会认为,虚拟化产品和配置管理工具是竞争关系,但 Docker 和这两种技术都有点关系。前面列举的一些技术常常因其提高了工作效率而获得称赞,这就导致了大量的探讨。而现在 Docker 正是这些过去十年间最广泛使用的技术之一。
|
||||
|
||||
如果你要拿 Docker 分别与这些领域的卫冕冠军按照功能逐项比较,那么 Docker 看上去可能只是个一般的竞争对手。Docker 在某些领域表现的更好,但它带来的是一个跨越广泛的解决工作流程中众多挑战的功能集合。通过将应用程序部署工具(如 Capistrano、 Fabric)的易用性和虚拟化系统管理的易于性结合,使工作流程自动化,以及易于实施<ruby>编排<rt>orchestration</rt></ruby>,Docker 提供了一个非常强大的功能集合。
|
||||
|
||||
大量的新技术来来去去,因此对这些新事物保持一定的怀疑总是好的。如果不深入研究,人们很容易误以为 Docker 只是另一种为开发者和运营团队解决一些具体问题的技术。如果把 Docker 单独看作一种虚拟化技术或者部署技术,它看起来并不引人注目。不过 Docker 可比表面上看起来的强大得多。
|
||||
|
||||
即使在小型团队中,团队内部的沟通和相处也往往是困难的。然而在我们生活的这个世界里,团队内部对于细节的沟通是迈向成功越来越不可或缺的因素。而一个能够降低沟通复杂性,协助开发更为强健软件的工具,无疑是一个巨大的成功。这正是 Docker 值得我们深入了解的原因。当然 Docker 也不是什么灵丹妙药,它的正确使用还需深思熟虑,不过 Docker 确实能够解决一些组织层面的现实问题,还能够帮助公司更好更快地发布软件。使用精心设计的 Docker 工作流程能够让技术团队更加和谐,为组织创造实实在在的收益。
|
||||
|
||||
那么,最让公司感到头疼的问题是什么呢?现如今,很难按照预期的速度发布软件,而随着公司从只有一两个开发人员成长到拥有若干开发团队的时候,发布新版本时的沟通负担将越来越重,难以管理。开发者不得不去了解软件所处环境的复杂性,生产运营团队也需要不断地理解所发布软件的内部细节。这些通常都是不错的工作技能,因为它们有利于更好地从整体上理解发布环境,从而促进软件的鲁棒性设计。但是随着组织成长的加速,这些技能的拓展很困难。
|
||||
|
||||
充分了解所用的环境细节往往需要团队之间大量的沟通,而这并不能直接为团队创造值。例如,为了发布版本 1.2.1、开发人员要求运维团队升级特定的库,这个过程就降低了开发效率,也没有为公司创造价值。如果开发人员能够直接升级他们所使的库,然后编写代码,测试新版本,最后发布软件,那么整个交付过程所用的时间将会明显缩短。如果运维人员无需与多个应用开发团队相协调,就能够在宿主系统上升级软件,那么效率将大大提高。Docker 有助于在软件层面建立一层隔离,从而减轻团队的沟通负担。
|
||||
|
||||
除了有助于解决沟通问题,在某种程度上 Docker 的软件架构还鼓励开发出更多健壮的应用程序。这种架构哲学的核心是一次性的小型容器。在新版本部署的时候,会将旧版本应用的整个运行环境全部丢弃。在应用所处的环境中,任何东西的存在时间都不会超过应用程序本身。这是一个简单却影响深远的想法。这就意味着,应用程序不会意外地依赖于之前版本的遗留产物;对应用的短暂调试和修改也不会存在于未来的版本中;应用程序具有高度的可移植性,因为应用的所有状态要么直接包含于部署物中,且不可修改,要么存储于数据库、缓存或文件服务器等外部依赖中。
|
||||
|
||||
因此,应用程序不仅具有更好的可扩展性,而且更加可靠。存储应用的容器实例数量的增减,对于前端网站的影响很小。事实证明,这种架构对于非 Docker 化的应用程序已然成功,但是 Docker 自身包含了这种架构方式,使得 Docker 化的应用程序始终遵循这些最佳实践,这也是一件好事。
|
||||
|
||||
### Docker 工作流程的好处
|
||||
|
||||
我们很难把 Docker 的好处一一举例。如果用得好,Docker 能在多个方面为组织,团队,开发者和运营工程师带来帮助。从宿主系统的角度看,所有应用程序的本质是一样的,因此这就决定了 Docker 让架构的选择更加简单。这也让工具的编写和应用程序之间的分享变得更加容易。这世上没有什么只有好处却没有挑战的东西,但是 Docker 似乎就是一个例外。以下是一些我们使用 Docker 能够得到的好处:
|
||||
|
||||
**使用开发人员已经掌握的技能打包软件**
|
||||
|
||||
> 许多公司为了管理各种工具来为它们支持的平台生成软件包,不得不提供一些软件发布和构建工程师的岗位。像 rpm、mock、 dpkg 和 pbuilder 等工具使用起来并不容易,每一种工具都需要单独学习。而 Docker 则把你所有需要的东西全部打包起来,定义为一个文件。
|
||||
|
||||
**使用标准化的镜像格式打包应用软件及其所需的文件系统**
|
||||
|
||||
> 过去,不仅需要打包应用程序,还需要包含一些依赖库和守护进程等。然而,我们永远不能百分之百地保证,软件运行的环境是完全一致的。这就使得软件的打包很难掌握,许多公司也不能可靠地完成这项工作。常有类似的事发生,使用 Scientific Linux 的用户试图部署一个来自社区的、仅在 Red Hat Linux 上经过测试的软件包,希望这个软件包足够接近他们的需求。如果使用 Dokcer、只需将应用程序和其所依赖的每个文件一起部署即可。Docker 的分层镜像使得这个过程更加高效,确保应用程序运行在预期的环境中。
|
||||
|
||||
**测试打包好的构建产物并将其部署到运行任意系统的生产环境**
|
||||
|
||||
> 当开发者将更改提交到版本控制系统的时候,可以构建一个新的 Docker 镜像,然后通过测试,部署到生产环境,整个过程中无需任何的重新编译和重新打包。
|
||||
|
||||
**将应用软件从硬件中抽象出来,无需牺牲资源**
|
||||
|
||||
> 传统的企业级虚拟化解决方案,例如 VMware,以消耗资源为代价在物理硬件和运行其上的应用软件之间建立抽象层。虚拟机管理程序和每一个虚拟机中运行的内核都要占用一定的硬件系统资源,而这部分资源将不能够被宿主系统的应用程序使用。而容器仅仅是一个能够与 Linux 内核直接通信的进程,因此它可以使用更多的资源,直到系统资源耗尽或者配额达到上限为止。
|
||||
|
||||
Docker 出现之前,Linux 容器技术已经存在了很多年,Docker 使用的技术也不是全新的。但是这个独一无二的集强大架构和工作流程于一身的 Docker 要比各个技术加在一起还要强大的多。Docker 终于让已经存在了十余年的 Linux 容器走进了普通技术人员的生活中。Docker 让容器更加轻易地融入到公司现有的工作流程中。以上讨论到的问题已被很多人认可,以至于 Docker 项目的快速发展超出了所有人的合理预期。
|
||||
|
||||
Docker 发布的第一年,许多刚接触的新人惊讶地发现,尽管 Docker 还不能在生产环境中使用,但是来自 Docker 开源社区源源不断的提交,飞速推动着这个项目向前发展。随着时间的推移,这一速度似乎越来越快。现在 Docker 进入了 1.x 发布周期,稳定性好了,可以在生产环境中使用。因此,许多公司使用 Docker 来解决它们在应用程序交付过程中面对的棘手问题。
|
||||
|
||||
### Docker 不是什么
|
||||
|
||||
Docker 可以解决很多问题,这些问题是其他类型的传统工具专门解决的。那么 Docker 在功能上的广度就意味着它在特定的功能上缺乏深度。例如,一些组织认为,使用 Docker 之后可以完全摈弃配置管理工具,但 Docker 真正强大之处在于,它虽然能够取代某些传统的工具,但通常与它们是兼容的,甚至与它们结合使用还能增强自身的功能。下面将列举一些 Docker 还未能完全取代的工具,如果与它们结合起来使用,往往能取得更好的效果。
|
||||
|
||||
**企业级虚拟化平台(VMware、KVM 等)**
|
||||
|
||||
> 容器并不是传统意义上的虚拟机。虚拟机包含完整的操作系统,运行在宿主操作系统之上。虚拟化平台最大的优点是,一台宿主机上可以使用虚拟机运行多个完全不同的操作系统。而容器是和主机共用同一个内核,这就意味着容器使用更少的系统资源,但必须基于同一个底层操作系统(如 Linux)。
|
||||
|
||||
**云平台(Openstack、CloudStack 等)**
|
||||
|
||||
> 与企业级虚拟化平台一样,容器和云平台的工作流程表面上有大量的相似之处。从传统意义上看,二者都可以按需横向扩展。但是,Docker 并不是云平台,它只能在预先安装 Docker 的宿主机中部署,运行和管理容器,并能创建新的宿主系统(实例),对象存储,数据块存储以及其他与云平台相关的资源。
|
||||
|
||||
**配置管理工具(Puppet、Chef 等)**
|
||||
|
||||
> 尽管 Docker 能够显著提高一个组织管理应用程序及其依赖的能力,但不能完全取代传统的配置管理工具。Dockerfile 文件用于定义一个容器构建时内容,但不能持续管理容器运行时的状态和 Docker 的宿主系统。
|
||||
|
||||
**部署框架(Capistrano、Fabric等)**
|
||||
|
||||
> Docker 通过创建自成一体的容器镜像,简化了应用程序在所有环境上的部署过程。这些用于部署的容器镜像封装了应用程序的全部依赖。然而 Docker 本身无法执行复杂的自动化部署任务。我们通常使用其他工具一起实现较大的工作流程自动化。
|
||||
|
||||
**工作负载管理工具(Mesos、Fleet等)**
|
||||
|
||||
> Docker 服务器没有集群的概念。我们必须使用其他的业务流程工具(如 Docker 自己开发的 Swarm)智能地协调多个 Docker 主机的任务,跟踪所有主机的状态及其资源使用情况,确保运行着足够的容器。
|
||||
|
||||
**虚拟化开发环境(Vagrant 等)**
|
||||
|
||||
> 对开发者来说,Vagrant 是一个虚拟机管理工具,经常用来模拟与实际生产环境尽量一致的服务器软件栈。此外,Vagrant 可以很容易地让 Mac OS X 和基于 Windows 的工作站运行 Linux 软件。由于 Docker 服务器只能运行在 Linux 上,于是它提供了一个名为 Boot2Docker 的工具允许开发人员在不同的平台上快速运行基于 Linux 的 Docker 容器。Boot2Docker 足以满足很多标准的 Docker 工作流程,但仍然无法支持 Docker Machine 和 Vagrant 的所有功能。
|
||||
|
||||
如果没有强有力的参考标准,很难理解 Docker 的作用。下一章我们将概览 Docker,它是什么,它的目标使用场景,以及它的优势。
|
||||
|
||||
-----------------
|
||||
作者简介:
|
||||
|
||||
#### [Karl Matthias][1]
|
||||
|
||||
Karl Matthias 曾在创业公司和世界 500 强企业中担任过开发人员,系统管理员和网络工程师。在德国和英国的初创公司工作了若干年后,他和家人回到了美国俄勒冈州波特兰,在 New Relic 公司担任首席网站可靠性工程师。业余时间,他会和他的两个女儿玩,用他那老式相机摄摄影,或者骑骑自行车。
|
||||
|
||||
#### [Sean Kane][2]
|
||||
|
||||
Sean Kane 目前在 New Relic 公司的共享基础设施团队中担任首席网站可靠性工程师。他在生产运维领域有很长的职业生涯,在不同的行业中工作过,有许多不同的头衔。他在各类聚会和技术论坛做过演讲,涉及过疲劳预警和硬件自动化等话题。他的青年阶段大部分在海外度过,毕业于林林兄弟及巴纳姆和贝利小丑学院,在美国中央情报局做过两次实习等等,他一直在探索生活的真谛。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.oreilly.com/learning/what-is-docker
|
||||
|
||||
作者:[Karl Matthias][a],[Sean Kane][b]
|
||||
译者:[Cathon](https://github.com/Cathon)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.oreilly.com/people/5abbf-karl-matthias
|
||||
[b]:https://www.oreilly.com/people/d5ce6-sean-kane
|
||||
[1]:https://www.oreilly.com/people/5abbf-karl-matthias
|
||||
[2]:https://www.oreilly.com/people/d5ce6-sean-kane
|
||||
[3]:http://shop.oreilly.com/product/0636920036142.do?intcmp=il-security-books-videos-update-na_new_site_what_is_docker_text_cta
|
||||
[4]:http://youtu.be/wW9CAH9nSLs
|
||||
[5]:https://github.com/docker/docker
|
||||
[6]:https://commons.wikimedia.org/wiki/File:2009_3962573662_card_catalog.jpg
|
@ -0,0 +1,130 @@
|
||||
6 个值得好好学习的 JavaScript 框架
|
||||
=====================
|
||||
|
||||
![值得好好学习的 6 个 JavaScript 框架](https://discoversdkcdn.azureedge.net/postscontent/products/java.png)
|
||||
|
||||
**常言道,条条大路通罗马,可是那一条适合我呢?** 由于用于构建前端页面等现代技术的出现,JavaScript 在 Web 开发社区早已是如雷贯耳。通过在网页上编写几个函数并提供执行逻辑,可以很好的支持 HTML (主要是用于页面的 _表现_ 或者 _布局_)。如果没有 JavaScript,那页面将没有任何 _交互特性_ 可言。
|
||||
|
||||
现在的框架和库的已经从蛮荒时代崛起了,很多老旧的技术纷纷开始将功能分离成模块。现在不再需要在整个核心语言中支持所有特性了,开发者允许所有用户创建库和框架来增强核心语言的功能。这样,语言的灵活性获得了了显著提高。
|
||||
|
||||
如果在已经在使用 **JavaScript** (以及 **JQuery**) 来支持 HTML,那么你肯定知道开发和维护一个大型应用需要付出多大的努力以及编写多么复杂的代码,而 JavaScript 框架可以帮助你快速的构建交互式 Web 应用 (包含单页面应用或者多页面应用)。
|
||||
|
||||
当一个新手开发者想要学习 JavaScript 时,他常常会被各种 JavaScript 框架所吸引,也幸亏有为数众多的社区,任何开发者都可以轻易地通过在线教程或者其他资源来学习。
|
||||
|
||||
但是,唉!多数的程序员都很难决定学习和使用哪一个框架。因此在本文中,我将为大家推荐 6 个值得好好学习的 JavaScript 框架。让我们开始吧。
|
||||
|
||||
### 1、AngularJS
|
||||
|
||||
![Angular](https://discoversdkcdn.azureedge.net/postscontent/products/AngularJS_logo.svg.png)
|
||||
|
||||
**(注:这是我个人最喜欢的框架)**
|
||||
|
||||
无论你是何时听说的 JavaScript,很可能你早就听过 AngularJS,因为这是在 JavaScript 社区中最为广泛使用的框架了。它发布于 2000 年,由 Google 开发 (这够有说服力让你是用了吧) ,它是一个开源项目,这意味着你可以阅读、编辑和修改其源代码以便更加符合自身的需求,并且不用向其开发者支付一分钱 (这不是很酷吗?)。
|
||||
|
||||
如果说你觉得通过纯粹的 JavaScript 代码编写一个复杂的 Web 应用比较困难的话,那么你肯定会兴奋的跳起来,因为它将显著地减轻你的编码负担。它符合支持双向数据绑定的 MVC (Model–view–controller,模型-视图-控制) 设计典范。假如你不熟悉 MVC,你只需要知道它代表着无论何时探测到某些变化,它将自动更新前端 (比如,用户界面端) 和后端 (代码或者服务器端) 数据。
|
||||
|
||||
MVC 可为大大减少构建复杂应用程序所需的时间和精力,所有你只需要集中精力于一处即可 (DOM 编程接口会自动同步更新视图和模型)。由于 _视图组件_ 与 _模型组件_ 是分离的,你可以很容易的创建一个可复用的组件,使得用户界面的效果非常好看。
|
||||
|
||||
如果因为某些原因,你已经使用了 **TypeScript** (一种与 JavaScript 非常相似的语言),那么你可以很容易就上手 AngularJS,因为这两者的语法高度相似。与 **TypeScript** 相似这一特点在一定程度上提升了 AngularJS 的受欢迎程度。
|
||||
|
||||
目前,Angular 2.0 已经发布,并且提升了移动端的性能,这也足以向一个新的开发者证明,该框架的开发活跃的够高并且定期更新。
|
||||
|
||||
AngularJS 有着大量的用户,包括 (但不限于) Udemy、Forbes、GoDaddy、Ford、NBA 和 Oscars。
|
||||
|
||||
对于那些想要一个高效的 MVC 框架,用来开发面面俱到、包含健壮且现代化的基础架构的单页应用的用户来说,我极力的推荐这个框架。这是第一个为无经验 JavaScript 开发者设计的框架。
|
||||
|
||||
### 2、React
|
||||
|
||||
![React](https://discoversdkcdn.azureedge.net/postscontent/react%20%281%29.png)
|
||||
|
||||
与 AngularJS 相似,React 也是一个 MVC (Model–view–controller,模型-视图-控制) 类型的框架,但不同的是,它完全针对于 _视图组件_ (因为它是为 UI 特别定制的) 并且可与任何架构进行无缝衔接。这意味着你可以马上将它运用到你的网站中去。
|
||||
|
||||
它从核心功能中抽象出 DOM 编程接口 (并且因此使用了虚拟 DOM),所以你可以快速的渲染 UI,这使得你能够通过 _node.js_ 将它作为一个客户端框架来使用。它是由 Facebook 开发的开源项目,还有其它的开发者为它贡献代码。
|
||||
|
||||
假如说你见到过并喜欢 Facebook 和 Instagram 的界面,那么你将会爱上 React。通过 React,你可以给你的应用的每个状态设计一个简单的视图,当数据改变的时候,视图也自动随之改变。只要你想的话,可以创建各种的复杂 UI,也可以在任何应用中复用它。在服务器端,React 同样支持通过 _node.js_ 来进行渲染。对于其他的接口,React 也一样表现得足够的灵活。
|
||||
|
||||
除 Facebook 和 Instagram 外,还有好多公司也在使用 React,包括 Whatsapp、BBC、、PayPal、Netflix 和 Dropbox 等。
|
||||
|
||||
如果你只需要一个前端开发框架来构建一个非常复杂且界面极好的强大视图层,那我极力向你推荐这个框架,但你需要有足够的经验来处理各种类型的 JavaScript 代码,而且你再也不需要其他的组件了 (因为你可以自己集成它们)。
|
||||
|
||||
### 3、Ember
|
||||
|
||||
![Ember](https://discoversdkcdn.azureedge.net/postscontent/Ember.js_Logo_and_Mascot.png)
|
||||
|
||||
这个 JavaScript 框架在 2011 年正式发布,是由 _Yehuda Katz_ 开发的开源项目。它有一个庞大且活跃的在线社区,所有在有任何问题时,你都可以在社区中提问。该框架吸收融合了非常多的通用 JavaScript 风格和经验,以便确保开发者能最快的做到开箱即用。
|
||||
|
||||
它使用了 MVVM (Model–view–viewmodel,模型-视图-视图模型) 的设计模式,这使得它与 MVC 有些不一样,因为它由一个 _连接器 (binder)_ 帮助视图和数据连接器进行通信。
|
||||
|
||||
对于 DOM 编程接口的快速服务端渲染,它借助了 _Fastboot.js_,这能够让那些复杂 UI 的性能得到极大提高。
|
||||
|
||||
它的现代化路由模式和模型引擎还支持 _RESTful API_,这可以却确保你可以使用这种最新的技术。它支持句柄集成模板(Handlebars integrated template),用以自动更新数据。
|
||||
|
||||
早在 2015 年间,它的风头曾一度盖过 AngularJS 和 React,被称为最好的 JavaScript 框架,对于它在 JavaScript 社区中的可用性和吸引力,这样的说服力该是足够了的。
|
||||
|
||||
对于不追求高灵活性和大型架构的用户,并且仅仅只是为了赶赴工期、完成任务的话,我个人非常推荐这个 JavaScript 框架,
|
||||
|
||||
### 4、Adonis
|
||||
|
||||
![Adonis](https://discoversdkcdn.azureedge.net/postscontent/products/adonis.jpg)
|
||||
|
||||
如果你曾使用过 _Laravel_ 和 _NodeJS_,那么你在使用这一个框架之时会觉得相当顺手,因为它是集合了这两个平台的优点而形成的一个框架,对于任何种类的现代应用来说,它都显得非常专业、圆润和精致。
|
||||
|
||||
它使用了 _NodeJS_,所以是一个很好的后端框架,同时还附带有一些前端特性 (与前面提到那些更多地注重前端的框架不同),所以想要进入后端开发的新手开发者会发觉这个框架相当迷人。
|
||||
|
||||
相比于 _NoSQL_,很多的开发者都比价喜欢使用 _SQL_ 数据库 (因为他们需要增强和数据以及其它特性的交互性),这一现象在这个框架中得到了很好的体现,这时的它更接近标准,开发者也更容易使用。
|
||||
|
||||
如果你混迹于各类 PHP 社区,那你一定很熟悉 **服务提供商 (Service Providers)**,也由于 Adonis 相应的 PHP 风格包含其中,所以在使用它的时候,你会觉得似曾相识。
|
||||
|
||||
在它所有的特性中,最好的便是那个极为强大的路由引擎,支持使用函数来组织和管理应用的所有状态、支持错误处理机制、支持通过 SQL ORM 来进行数据库查询、支持生成器、支持箭头函数 (arrow functions)、支持代理等等。
|
||||
|
||||
如果喜欢使用无状态 REST API 来构建服务器端应用,我比较推荐它,因为你会爱上这个框架的。
|
||||
|
||||
### 5、Vue.js
|
||||
|
||||
![Vue.js](https://discoversdkcdn.azureedge.net/postscontent/products/vuejs-logo.png)
|
||||
|
||||
这一个开源的 JavaScript 框架,发布于 2014 年,它有个极为简单的 API,用以为现代 Web 界面(Modern Web Interface)开发交互式组件 (Reactive components)。其设计着重于简单易用。与 Ember 相似,它使用的是 MVVM (Model–view–viewmodel,模型-视图-视图模型) 设计范例,这样简化了设计。
|
||||
|
||||
这个框架最有吸引力的一点是,你可以根据自身需求来选择使用的模块。比如,你需要编写简单的 HTML 代码,抓取 JSON,然后创建一个 Vue 实例来完成可以复用的小特效。
|
||||
|
||||
与之前的那些 JavaScript 框架相似,它使用双路数据绑定来更新模型和视图,同时也使用连接器来完成视图和数据连接器的通信。这是一个还未完全成熟的框架,因为它全部的关注点都在视图层,所以你需要自己处理其它的组件。
|
||||
|
||||
如果你熟悉 _AngularJS_,那你会感觉很顺手,因为它大量嵌入了 _AngularJS_ 的架构,如果你懂得 JavaScript 的基础用法,那你的许多项目都可以轻易地迁移到该框架之下。
|
||||
|
||||
假如你只想把任务完成,或者想提升你自身的 JavaScript 编程经验,又或者你需要学习不同的 JavAScript 框架的本质,我极力推荐这个。
|
||||
|
||||
### 6、Backbone.js
|
||||
|
||||
![Backbone.JS](https://discoversdkcdn.azureedge.net/postscontent/products/backbonejs.png)
|
||||
|
||||
这个框架可以很容易的集成到任何第三方的模板引擎,默认使用的是 _Underscore_ 模板引擎,而且该框架仅有一个依赖 (**JQuery**),因此它以轻量而闻名。它支持带有 **RESTful JSON** 接口的 MVC (Model–view–controller,模型-视图-控制) (可以自动更新前端和后端) 设计范例。
|
||||
|
||||
假如你曾经使用过著名的社交新闻网络服务 **reddit**,那么你肯定听说过它在几个单页面应用中使用了 **Backbone.js**。**Backbone.js** 的原作者为之建立了与 _CoffeScript_ 旗鼓相当的 _Underscore_ 模板引擎,所以你可以放心,开发者知道该做什么。
|
||||
|
||||
该框架在一个软件包中提供了键值对 (key-value) 模型、视图以及几个打包的模块,所以你不需要额外下载其他的外部包,这样可以节省不少时间。框架的源码可以在 GitHub 进行查看,这意味着你可以根据需求进行深度定制。
|
||||
|
||||
如果你是寻找一个入门级框架来快速构建一个单页面应用,那么这个框架非常适合你。
|
||||
|
||||
### 总而言之
|
||||
|
||||
至此,我已经在本文着重说明了 6 个值得好好学习的 JavaScript 框架,希望你读完本文后能够决定使用哪个框架来完成自己的任务。
|
||||
|
||||
如果说对于选择框架,你还是不知所措,请记住,这个世界是实践出真知而非教条主义的。最好就是从列表中挑选一个来使用,看看最后是否满足你的需求和兴趣,如果还是不行,接着试试另一个。你也尽管放心好了,列表中的框架肯定是足够了的。
|
||||
|
||||
-------------------------------
|
||||
|
||||
译者简介:
|
||||
|
||||
[GHLandy](http://GHLandy.com) —— 生活中所有欢乐与苦闷都应藏在心中,有些事儿注定无人知晓,自己也无从说起。
|
||||
|
||||
-------------------------------
|
||||
|
||||
via: http://www.discoversdk.com/blog/6-best-javascript-frameworks-to-learn-in-2016
|
||||
|
||||
作者:[Danyal Zia][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.discoversdk.com/blog/6-best-javascript-frameworks-to-learn-in-2016
|
@ -0,0 +1,85 @@
|
||||
如何重置 RHEL7/CentOS7 系统的密码
|
||||
=================
|
||||
|
||||
### 介绍
|
||||
|
||||
**目的**
|
||||
|
||||
在 RHEL7/CentOS7/Scientific Linux 7 中重设 root 密码。
|
||||
|
||||
**要求**
|
||||
|
||||
RHEL7 / CentOS7 / Scientific Linux 7
|
||||
|
||||
**困难程度**
|
||||
|
||||
中等
|
||||
|
||||
### 指导
|
||||
|
||||
RHEL7 的世界发生了变化,重置 root 密码的方式也一样。虽然中断引导过程的旧方法(init=/bin/bash)仍然有效,但它不再是推荐的。“Systemd” 使用 “rd.break” 来中断引导。让我们快速浏览下整个过程。
|
||||
|
||||
**启动进入最小模式**
|
||||
|
||||
重启系统并在内核列表页面在系统启动之前按下 `e`。你会进入编辑模式。
|
||||
|
||||
**中断启动进程**
|
||||
|
||||
在内核字符串中 - 在以 `linux 16 /vmlinuz- ect` 结尾的行中输入 `rd.break`。接着 `Ctrl+X` 重启。系统启动进入初始化内存磁盘,并挂载在 `/sysroot`。在此模式中你不需要输入密码。
|
||||
|
||||
**重新挂载文件系统以便读写**
|
||||
|
||||
```
|
||||
switch_root:/# mount -o remount,rw /sysroot/
|
||||
```
|
||||
|
||||
**使 /sysroot 成为根目录**
|
||||
|
||||
```
|
||||
switch_root:/# chroot /sysroot
|
||||
```
|
||||
|
||||
命令行提示符会稍微改变。
|
||||
|
||||
**修改 root 密码**
|
||||
|
||||
```
|
||||
sh-4.2# passwd
|
||||
```
|
||||
|
||||
**加载 SELinux 策略**
|
||||
|
||||
```
|
||||
sh-4.2# load_policy -i
|
||||
```
|
||||
|
||||
**在 /etc/shadow 中设置上下文类型**
|
||||
|
||||
```
|
||||
sh-4.2# chcon -t shadow_t /etc/shadow
|
||||
```
|
||||
|
||||
注意:你可以通过如下创建 `autorelabel` 文件的方式来略过最后两步,但自动重建卷标会花费很长时间。
|
||||
|
||||
```
|
||||
sh-4.2# touch /.autorelabel
|
||||
```
|
||||
|
||||
因为这个原因,尽管它更简单,它应该作为“懒人选择”,而不是建议。
|
||||
|
||||
**退出并重启**
|
||||
|
||||
退出并重启并用新的 root 密码登录。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://linuxconfig.org/how-to-reset-the-root-password-in-rhel7-centos7-scientific-linux-7-based-systems
|
||||
|
||||
作者:[Rado Folwarczny][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://linuxconfig.org/how-to-reset-the-root-password-in-rhel7-centos7-scientific-linux-7-based-systems
|
||||
|
@ -0,0 +1,90 @@
|
||||
Perl 与动态网站的诞生
|
||||
==================
|
||||
|
||||
> 在新闻组和邮件列表里、在计算机科学实验室里、在各大陆之间,流传着一个神秘的故事,那是关于 Perl 与动态网站之间的不得不说的往事。
|
||||
|
||||
![Perl and the birth of the dynamic web](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc-lead-web-internet.png?itok=hq81pSDs "Perl and the birth of the dynamic web")
|
||||
|
||||
>图片来源 : [Internet Archive Book Images][30], 由 Opensource.com 修改. [CC BY-SA 4.0][29].
|
||||
|
||||
早期互联网历史中,有一些脍炙人口的开创性事件:如 蒂姆·伯纳斯·李(Tim Berners-Lee)在邮件组上[宣布][28] WWW-project 的那天,该文档随同 [CERN][27] 发布的项目代码进入到了公共域,以及 1993 年 1 月的[第一版 NCSA Mosaic 浏览器][26]。虽然这些独立的事件是相当重要的,但是当时的技术的开发已经更为丰富,不再是由一组的孤立事件组成,而更像是一系列有内在联系的故事。
|
||||
|
||||
这其中的一个故事描述的是网站是如何变成_动态的_,通俗说来就是我们如何使服务器除了提供静态 HTML 文档之外做更多的事。这是个流传在[新闻组][25]和邮件列表间、计算机科学实验室里、各个大陆之间的故事,重点不是一个人,而是一种编程语言:Perl。
|
||||
|
||||
### CGI 脚本和信息软件
|
||||
|
||||
在上世纪 90 年代中后期,Perl 几乎和动态网站是同义词。Perl 是一种相对来说容易学习的解释型语言,并且有强大的文本处理特性,使得它能够很容易的编写脚本来把一个网站关联到数据库、处理由用户发送的表单数据,当然,还要创造那些上世纪 90 年代的网站的经典形象——计数器和留言簿。
|
||||
|
||||
类似的网站特性渐渐的变成了 CGI 脚本的形式,其全称为通用网关接口(Common Gateway Interface),[首个实现][24]由 Rob McCool 于 1993 年 11 月在 NCSA HTTPD 上完成。CGI 是目的是直面功能,并且在短短几年间,任何人都可以很容易的找到一些由 Perl 写的预制的脚本存档。有一个声名狼籍的案例就是 [Matt's Scripts Archive][23],这是一种流行却包含各种安全缺陷的源代码库,它甚至使得 Perl 社区成员创建了一种被称为 [Not Matt‘s Scripts][22] 的更为专业的替换选择。
|
||||
|
||||
在当时,无论是业余爱好者,还是职业程序员都采用 Perl 来制作动态网站和应用,Tim O’Reilly [创造了词汇“信息软件(infoware)”][21] 来描述网站和 Perl 怎样成为变化中的计算机工业的一部分。考虑到 Yahoo!和 Amazon 带来的创新,O‘Reilly 写道:“传统软件在大量的软件中仅仅包含了少量的信息;而信息软件则在少量的软件中包含了大量的信息。” Perl 是一种像瑞士军刀一样的完美的小而强大的工具,它支撑了信息媒体从巨大的网站目录向早期的用户生成内容(UGC)平台的转变。
|
||||
|
||||
### 题外话
|
||||
|
||||
尽管使用 Perl 来制作 CGI 简直是上佳之选,但是编程语言和不断提升中的动态网站之间的关系变得更加的密切与深入。从[第一个网站][20](在 1990 年的圣诞节前)出现到 1993 年 McCool 实现 CGI 的短暂时期内,Web 上的各种东西,比如表单、图片以及表格,就这么逐渐出现在上世纪 90 年代乃至后来。尽管伯纳斯·李也对这些早期的岁月产生了影响,但是不同的人看到的是 Web 不同的潜在作用,并将它推向各自不同的方向。一方面,这样的结果来自一些著名的辩论,例如 [HTML 应该和 SGML 保持多近的关系][19]、[是否应该实现一个图像标签][18]等等。在另一方面,在没有直接因素影响的情况下改变是极其缓慢的。后者已经很好的描述了动态网站是如何发展的。
|
||||
|
||||
从某种意义上说,第一个“网关”的诞生可以追溯到 1991 至 1992 年之间(LCTT 译注:此处所谓“网关”的意义请参照 CGI 的定义),当时伯纳斯·李和一些计算机科学家与超文本爱好者[编写服务程序][17]使得一些特定的资源能够连接到一起,例如 CERN 的内部应用程序、通用的应用程序如 Oracle 数据库、[广域信息查询系统(WAIS)][16] 等等。(WAIS 是 Web 的前身,上世纪 80 年代后期开发,其中,开发者之一 [Brewster Kahle][15],是一个数字化图书管理员和 [Internet Archive][14] 的创始人。)可以这样理解,“网关”就是一个被设计用来连接其它 Web、数据库或者应用程序的定制的 Web 服务器。任何的动态功能就意味着在不同的端口上运行另外一个守护进程(参考阅读,例如伯纳斯·李对于在网站上[如何添加一个搜索功能][13] 的描述)。伯纳斯·李期望 Web 可以成为不同信息系统之间的通用接口,并且鼓励建立单一用途服务。他也提到 Perl 是一种强大的(甚至是不可思议)、可以将各种东西组合起来的语言。
|
||||
|
||||
然而,另一种对“网关”的理解指出它不一定是一个定制设备,可能只是一个脚本,一个并不需要额外服务器的低吞吐量的附加脚本。这种形式的首次出现是有争议性的 Jim Davis 的 [Gateway to the U Mich Geography server][11],于 1992 年的 11 月发布在了 WWW-talk 邮件列表中。Davis 的脚本是使用 Perl 编写的,是一种 Web API 的原型,基于格式化的用户查询从另外的服务器拉取数据。我们来说明一下这两种对于网关的理解的不同之处,伯纳斯·李[回复了][10] Davis 的邮件,期望他和 Michigan 服务器的作者“能够达成某种共识”,“从网络的角度来看的话”仅使用一台服务器来提供这样的信息可能会更有意义。伯纳斯·李,可能是期待着 Web 的发明者可以提出一种有秩序的信息资源访问方式。这样从不同服务器上拉取数据的网关和脚本意味着一种潜在的 Web 的质的变化,虽然不断增多,但也可能有点偏离了伯纳斯·李的原始观点。
|
||||
|
||||
### 回到 Perl HTTPD
|
||||
|
||||
在 Davis 的地理服务器上的网关向标准化的、低吞吐量的、通过 CGI 方式实现的脚本化网关迈进的一步中,[Perl HTTPD][9] 的出现是很重要的事件,它是 1993 年初由印地安纳大学的研究生 Marc Van Heyningen 在布卢明顿(Bloomington)完全使用 Perl 语言实现的一个 Web 服务器程序。从 Van Heyningen 给出的[设计原则][8]来看,基于使用 Perl 就不需要任何的编译过程这样一种事实,使得它能够成为一种极易扩展的服务器程序,这个服务器包含了“一个向代码中增加新特性时只要简单的重启一下就可以,而不会有任何的宕机时间的特性”,使得这个服务器程序可以频繁的加入新功能。
|
||||
|
||||
Perl HTTPD 代表了那种服务器程序应该是单一、特定目的的观点。相应的,这种模式似乎暗示了在 Web 开发中像这样渐进式的、持续测试的软件产品可能会最终变成一种共识。Van Heyningen 在后来[提到过][7]他从头编写这样一个服务器程序的初衷是当时没有一种简便的方式使用 CERN 服务器程序来生成“虚拟文档”(例如,动态生成的页面),他打趣说使用 Perl 这样的“神之语言”来写可能是最简单的方式了。在他初期编写的众多脚本中有一个 Sun 操作系统的用户手册的 Web 界面,以及 [Finger 网关][6](这是一种早期用来共享计算机系统信息或者是用户信息的协议)。
|
||||
|
||||
虽然 Van Heyningen 将印地安纳大学的服务器主要用来连接现存的信息资源,他和研究生们同时也看见了作为个人发布形式的潜在可能。其中一件广为人知事件是在 1993-1994 年之间围绕着一个著名的加拿大案件而[公布][5]的一系列的文件、照片和新闻故事,与此形成鲜明对比的是,所有的全国性媒体都保持了沉默。
|
||||
|
||||
Perl HTTPD 没有坚持到现在的需要。今天,Van Heyningen 回忆起这个程序的时候认为这个程序只是当时的一个原型产品。它的原始目的只是向那些已经选择了 Gopher 作为大学的网络界面的资深教员们展示了网络的另一种利用方式。Van Heyningen 以[一种基于 Web 的、可搜索的出版物索引][4]的方式,用代码回应了他的导师们的虚荣。就是说,在服务器程序技术方面关键创新是为了赢得争论的胜利而诞生的,在这个角度上来看代码做到了所有要求它所做的事。
|
||||
|
||||
不管该服务器程序的生命是否短暂,伴随者 Perl HTTPD 一起出现的理念已经传播到了各个角落。Van Heyningen 开始收到了获取该代码的请求,而后将它分享到了网上,并提示说,需要了解一些 Perl 就可以将它移植到其它操作系统(或者找到一个这样的人也行)。不久之后,居住在奥斯汀(Austin)的程序员 Tony Sanders 开发了一个被称为 [Plexus][3] 的轻便版本。Sander 的服务器程序是一款全功能的产品,并且同样包含了 Perl HTTPD 所建议的易扩展性,而且添加一些新的特性如图片解码等。Plexus [直接影响了][2] Rob McCool 给 NCSA HTTPD 服务器上的脚本开发的“htbin”,并且同样影响到了不久之后诞生的通用网关接口(CGI)。
|
||||
|
||||
在这些历史遗产之外,感谢妙不可言的 Internet Archive(互联网时光机)使得 Perl HTTPD 在今天依然保留在一种我们依然可以获取的形式,你可以从[这里下载 tarball][1]。
|
||||
|
||||
### 历史展望
|
||||
|
||||
对于技术世界的颠覆来说,技术的改变总是在一个相互对立的过程中。现有的技术是思考新技术的基础与起点。过时的编程形式启迪了今天人们做事的新方式。网络世界的创新可能看起来更像是对于旧技术的扩展,不仅仅是 Perl。
|
||||
|
||||
在萌芽事件的简单的时间轴之外,Web 历史学者也许可以从 Perl 获取更多的线索。其中一部份的挑战在于材料的获取。更多需要做的事情包括从可获取的大量杂乱的数据中梳理出它的结构,将分散在邮件列表、归档网站,书本和杂志中的信息内容组合在一起。还有一部分的挑战是需要认识到 Web 的历史不仅仅是新技术发布的日子,它同时包括了个人记忆、人类情感与社会进程等,并且这不仅仅是单一的历史线而是有许许多多条相似的历史线组合而成的。就如 Perl 的信条一样“殊途同归。(There's More Than One Way To Do It.)”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/life/16/11/perl-and-birth-dynamic-web
|
||||
|
||||
作者:[Michael Stevenson][a]
|
||||
译者:[wcnnbdk1](https://github.com/wcnnbdk1)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/mstevenson
|
||||
[1]:https://web.archive.org/web/20011126190051/http://www.cs.indiana.edu/perl-server/httpd.pl.tar.Z
|
||||
[2]:http://1997.webhistory.org/www.lists/www-talk.1993q4/0516.html
|
||||
[3]:https://web.archive.org/web/19990421192342/http://www.earth.com/server/doc/plexus.html
|
||||
[4]:https://web.archive.org/web/19990428030253/http://www.cs.indiana.edu:800/cstr/search
|
||||
[5]:https://web.archive.org/web/19970720205155/http://www.cs.indiana.edu/canada/karla.html
|
||||
[6]:https://web.archive.org/web/19990429014629/http://www.cs.indiana.edu:800/finger/gateway
|
||||
[7]:https://web.archive.org/web/19980122184328/http://www.cs.indiana.edu/perl-server/history.html
|
||||
[8]:https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/intro.html
|
||||
[9]:https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/code.html
|
||||
[10]:https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0069.html
|
||||
[11]:https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0060.html
|
||||
[12]:http://info.cern.ch/hypertext/WWW/Provider/ShellScript.html
|
||||
[13]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0109.html
|
||||
[14]:https://archive.org/index.php
|
||||
[15]:http://brewster.kahle.org/about/
|
||||
[16]:https://en.wikipedia.org/wiki/Wide_area_information_server
|
||||
[17]:http://info.cern.ch/hypertext/WWW/Daemon/Overview.html
|
||||
[18]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0182.html
|
||||
[19]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0096.html
|
||||
[20]:http://info.cern.ch/hypertext/WWW/TheProject.html
|
||||
[21]:https://web.archive.org/web/20000815230603/http://www.edventure.com/release1/1198.html
|
||||
[22]:http://nms-cgi.sourceforge.net/
|
||||
[23]:https://web.archive.org/web/19980709151514/http://scriptarchive.com/
|
||||
[24]:http://1997.webhistory.org/www.lists/www-talk.1993q4/0518.html
|
||||
[25]:https://en.wikipedia.org/wiki/Usenet_newsgroup
|
||||
[26]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0099.html
|
||||
[27]:https://tenyears-www.web.cern.ch/tenyears-www/
|
||||
[28]:https://groups.google.com/forum/#!msg/alt.hypertext/eCTkkOoWTAY/bJGhZyooXzkJ
|
||||
[29]:https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[30]:https://www.flickr.com/photos/internetarchivebookimages/14591826409/in/photolist-oeqVBX-xezHCD-otJDtG-whb6Qz-tohe9q-tCxH8y-xq4VfN-otJFfh-xEmn3b-tERUdv-oucUgd-wKDyLy-owgebW-xd6Wew-xGEvuT-toqHkP-oegBCj-xtDdzN-tF19ip-xGFbWP-xcQMJq-wxrrkN-tEYczi-tEYvCn-tohQuy-tEzFwN-xHikPT-oetG8V-toiGvh-wKEgAu-xut1qp-toh7PG-xezovR-oegRMa-wKN2eg-oegSRp-sJ29GF-oeqXLV-oeJTBY-ovLF3X-oeh2iJ-xcQBWs-oepQoy-ow4xoo-xknjyD-ovunVZ-togQaj-tEytff-xEkSLS-xtD8G1
|
@ -0,0 +1,99 @@
|
||||
如何在 XenServer 7 GUI 虚拟机(VM)上提高屏幕分辨率
|
||||
============
|
||||
|
||||
### 介绍
|
||||
|
||||
**目的**
|
||||
|
||||
如果你想要将 XenServer 虚拟机作为远程桌面,默认的分辨率可能不能满足你的要求。
|
||||
|
||||
![Default xenserver screen VM resolution](https://linuxconfig.org/images/xenserver-7-default-screen-resolution.png)
|
||||
|
||||
本篇的目标是提高 XenServer 7 GUI 虚拟机(VM)的屏幕分辨率
|
||||
|
||||
**要求**
|
||||
|
||||
访问 XenServer 7 系统的权限
|
||||
|
||||
**难易性**
|
||||
|
||||
简单
|
||||
|
||||
**惯例**
|
||||
|
||||
* `#` - 给定命令需要作为 root 用户权限运行或者使用 `sudo` 命令
|
||||
* `$` - 给定命令作为常规权限用户运行
|
||||
|
||||
### 指导
|
||||
|
||||
**获得 VM UUID**
|
||||
|
||||
首先,我们需要获得想要提升分辨率的虚拟机的 UUID。
|
||||
|
||||
```
|
||||
# xe vm-list
|
||||
uuid ( RO) : 09a3d0d3-f16c-b215-9460-50dde9123891
|
||||
name-label ( RW): CentOS 7
|
||||
power-state ( RO): running
|
||||
```
|
||||
|
||||
提示:如果你将此 UUID 保存为 shell 变量会节省一些时间:
|
||||
|
||||
```
|
||||
# UUID=09a3d0d3-f16c-b215-9460-50dde9123891
|
||||
```
|
||||
|
||||
**关闭 VM**
|
||||
|
||||
优雅地关闭 VM 或使用 `xe vm-vm-shutdown` 命令:
|
||||
|
||||
```
|
||||
# xe vm-shutdown uuid=$UUID
|
||||
```
|
||||
|
||||
**更新 VGA 的 VIDEORAM 设置**
|
||||
|
||||
检查你目前的 VGA 的 VIDEORAM 参数设置:
|
||||
|
||||
```
|
||||
# xe vm-param-get uuid=$UUID param-name="platform" param-key=vga
|
||||
std
|
||||
# xe vm-param-get uuid=$UUID param-name="platform" param-key=videoram
|
||||
8
|
||||
```
|
||||
|
||||
要提升屏幕的分辨率,将 VGA 更新到 `std` (如果已经设置过,就不需要做什么),并将 `videoram` 调大几兆,如设置成 16:
|
||||
|
||||
```
|
||||
# xe vm-param-set uuid=$UUID platform:vga=std
|
||||
# xe vm-param-set uuid=$UUID platform:videoram=16
|
||||
```
|
||||
|
||||
**启动 VM**
|
||||
|
||||
```
|
||||
# xe vm-start uuid=$UUID
|
||||
```
|
||||
|
||||
![increased xenserver screen VM resolution](https://linuxconfig.org/images/xenserver-7-increased-screen-resolution.png)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm
|
||||
|
||||
作者:[Lubos Rendek][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm
|
||||
[1]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-1-obtain-vm-uuid
|
||||
[2]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-2-shutdown-vm
|
||||
[3]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-3-update-vga-a-videoram-settings
|
||||
[4]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-4-start-vm
|
||||
[5]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h1-objective
|
||||
[6]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h2-requirements
|
||||
[7]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h3-difficulty
|
||||
[8]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h4-conventions
|
||||
[9]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-instructions
|
85
published/201702/20161128 Mir is not only about Unity8.md
Normal file
85
published/201702/20161128 Mir is not only about Unity8.md
Normal file
@ -0,0 +1,85 @@
|
||||
Mir 并不只是 Unity 8
|
||||
============================================================
|
||||
|
||||
![mir](https://insights.ubuntu.com/wp-content/uploads/2cf2/MIR.png)
|
||||
|
||||
_这是一篇来自 Canonical 的软件工程师 Alan Griffiths 的一篇游客文章。如果你也想投稿,请联系 ubuntu-devices@canonical.com_
|
||||
|
||||
Mir 是一个计算机显示的管理应用的支持项目。它可以与当前 Ubuntu 桌面(及很多其他桌面)上使用的、我们更熟悉的 X-Window 相比较。我下面会讨论 Mir 的一些动机,但本篇的目的是澄清 Mir 和 Unity 8 之间的关系。
|
||||
|
||||
大多数时候你听说 Mir 时都会提到 Unity 8。这并不奇怪,因为 Unity 8 是 Canonical 新的用户界面 shell,用户会一直与它交互。 Mir “只”使这成为可能。Unity 8 目前用于手机和平板电脑,也可以在 Ubuntu 16.10 桌面上“预览”它。
|
||||
|
||||
在这里我想解释一下,可以不用 Unity 8 也可以使用 Mir。要么作为替代 shell,要么作为嵌入式环境的更简单的界面:信息亭,电子标牌等。Mir “抽象层”证明了这一点,它提供了三个重要的元素:
|
||||
|
||||
1. libmiral.so - Mir 的稳定接口,提供基本的窗口管理;
|
||||
2. miral-shell - 一个提供“传统”和“平铺”窗口管理的示例 shell;
|
||||
3. miral-kiosk - 一个仅提供基本窗口管理的示例“信息亭”。
|
||||
|
||||
miral-shell 和 miral-kiosk 示例服务器可从 zesty 的归档文件中获得,Kevin Gunn 已经在“Voices”上写了一篇基于 miral-kiosk 的“信息亭”的概览的[博文][1]。我将在下面给出更多关于使用这些例子的细节,但在[我的“voices”博客][2]上有更多(包括“如何”开发自己的替代 Mir 服务器)。
|
||||
|
||||
### 使用 MIR
|
||||
|
||||
Mir 是一套编程库,而不是独立的程序。这意味着这需要程序去调用它实现相应的功能。有两种方式去使用 Mir 库:编写程序的时候作为“客户端”,或者在实现 shell 时作为“服务端”。客户端(和 X11 一起)典型是使用工具库,而不是直接使用 Mir(或者 X11)。
|
||||
|
||||
GTK、Qt 和 SDL2 中有对 Mir 的支持。当在那些工具库中启用对它的支持时(默认在 Ubuntu 中启用支持),意味着使用这些工具的程序应该“可以工作”于 Mir 中。除此之外还有一个 Xmir:一个运行于 Mir 的 X11 服务器,这允许基于 X 的服务运行在 Mir 服务端上。
|
||||
|
||||
但是开始之前 Mir 客户端需要一个相匹配的 Mir 服务端。在最后一个开发周期中,Mir 团队在演示中将 MirAL 作为编写 Mir 服务端的推荐方法,并推出了一个“miral-examples”包。在 Ubuntu 的开发版本 zesty 中,你可以从归档中安装它:
|
||||
|
||||
```
|
||||
$ sudo apt install miral-examples mir-graphics-drivers-desktop qtubuntu-desktop
|
||||
```
|
||||
|
||||
_对于其他平台,你需要自己构建 MirAL(有关详细信息,请参阅 Mir 桌面环境示例)。_
|
||||
|
||||
miral-examples 安装后你可以在 Unity 7 中以窗口的方式运行一个 Mir 服务端,然后在里面运行一个客户端(比如 gedit):
|
||||
|
||||
```
|
||||
$ miral-shell&
|
||||
$ miral-run gedit
|
||||
```
|
||||
|
||||
这会给你一个(非常基础的)“传统” 的桌面窗口管理。另外你可以试下“平铺”窗口管理器:
|
||||
|
||||
```
|
||||
$ miral-shell --window-manager tiling&
|
||||
$ miral-run qterminal
|
||||
```
|
||||
|
||||
或者(甚至更基础的)信息亭界面:
|
||||
|
||||
```
|
||||
$ miral-kiosk&
|
||||
$ miral-run 7kaa
|
||||
```
|
||||
|
||||
这些 Mir 服务端都不会提供带有“启动器”、通知等的完整“桌面”。但是它们演示了不使用 Unity 8 使用 Mir 的可能。
|
||||
|
||||
### MIR 解决的问题
|
||||
|
||||
X-Window 系统已经是,并且仍然是,提供了一种与计算机的交互的非常成功的方式。它提供了广泛的硬件和驱动程序一致的抽象。它支持许多桌面环境和图形用户界面工具包,并可以让它们在大量计算机上一起工作。
|
||||
|
||||
但它来自一个与当前电脑使用方式非常不同的时代,现在有一些问题是很难满足的,因为它需要支持老旧的系统。
|
||||
|
||||
在 1980 年,大多数计算机是由专家管理的大型事物,将它们连接在一起“是非常困难的”。在那个时代,开发软件的成本是这样的,一个程序“监听”另一个程序获得的好处是可以忽略不计的:此时几乎没有计算机,同时它们是独立的,它们所有的工作和金融无关。
|
||||
|
||||
X-Window 开发于这种环境下,通过一系列扩展,它已经适应了许多变化。但它本质上是不安全的:任何应用程序可以知道显示了什么(并影响它)。你可以编写像 Xeyes(用“眼睛”跟踪光标)或“Tickeys”(通过键盘来生成打字机噪声)等应用程序。现实是,任何应用程序可以跟踪和操纵几乎所有的事情。这就是基于 X 的桌面如 Unity 7、Gnome、KDE及其它桌面工作的方式。
|
||||
|
||||
X-Window 中的窗口管理的开放性质不适合用于具有数百万计算机连接到因特网的世界,它们用于信用卡交易和网上银行,且由非专家管理,并自愿安装来自陌生人的程序。人们越来越意识到让 X-Window 适应新的安全性和图形性能的要求是不可行的。
|
||||
|
||||
现在至少有两个开源项目旨在提供一个替代品:Mir 和 Wayland。虽然有些人认为两者是竞争关系,但在很多领域,它们有共同的利益:它们都需要与那些之前假定使用 X11 的其它软件交互,并且许多引入支持的工作对两者都有益。
|
||||
|
||||
Canonical 的 X-Window 替换品 Mir,它只将信息暴露给它需要的应用程序(因此没有按键监听或光标跟踪)。它可以满足当前时代的需求,并可以利用现代硬件,如图形处理器。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://insights.ubuntu.com/2016/11/28/mir-is-not-only-about-unity8/
|
||||
|
||||
作者:[Guest][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://insights.ubuntu.com/author/guest/
|
||||
[1]:http://voices.canonical.com/kevin.gunn/
|
||||
[2]:http://voices.canonical.com/alan.griffiths/
|
@ -0,0 +1,82 @@
|
||||
如何在 RHEL 上设置 Linux RAID 1
|
||||
============================================================
|
||||
|
||||
### 设置 Linux RAID 1
|
||||
|
||||
配置 LINUX RAID 1 非常重要,因为它提供了冗余性。
|
||||
|
||||
RAID 分区拥有高级功能,如冗余和更好的性能。所以让我们来说下如何实现 RAID,以及让我们来看看不同类型的 RAID:
|
||||
|
||||
- RAID 0(条带):磁盘组合在一起,形成一个更大的驱动器。这以可用性为代价提供了更好的性能。如果 RAID 中的任何一块磁盘出现故障,则整个磁盘集将无法使用。最少需要两块磁盘。
|
||||
- RAID 1(镜像):磁盘从一个复制到另一个,提供了冗余。如果一块磁盘发生故障,则另一块磁盘接管,它有另外一份原始磁盘的数据的完整副本。其缺点是写入时间慢。最少需要两块磁盘。
|
||||
- RAID 5(带奇偶校验的条带):磁盘类似于 RAID 0,并且连接在一起以形成一个大型驱动器。这里的区别是,25% 的磁盘用于奇偶校验位,这允许在单个磁盘发生故障时可以恢复磁盘。最少需要三块盘。
|
||||
|
||||
让我们继续进行 Linux RAID 1 配置。
|
||||
|
||||
安装 Linux RAID 1 的要求:
|
||||
|
||||
1、系统中应该安装了 mdam,请用下面的命令确认。
|
||||
|
||||
```
|
||||
[root@rhel1 ~]# rpm -qa | grep -i mdadm
|
||||
mdadm-3.2.2-9.el6.x86_64
|
||||
[root@rhel1 ~]#
|
||||
```
|
||||
|
||||
2、 系统应该连接了 2 块磁盘。
|
||||
|
||||
创建两个分区,一个磁盘一个分区(sdc、sdd),每个分区占据整块磁盘。
|
||||
|
||||
```
|
||||
Disk /dev/sdc: 1073 MB, 1073741824 bytes
|
||||
255 heads, 63 sectors/track, 130 cylinders
|
||||
Units = cylinders of 16065 * 512 = 8225280 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disk identifier: 0x67cc8cfb
|
||||
|
||||
Device Boot Start End Blocks Id System
|
||||
/dev/sdc1 1 130 1044193+ 83 Linux
|
||||
|
||||
Disk /dev/sdd: 1073 MB, 1073741824 bytes
|
||||
255 heads, 63 sectors/track, 130 cylinders
|
||||
Units = cylinders of 16065 * 512 = 8225280 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disk identifier: 0x0294382b
|
||||
|
||||
Device Boot Start End Blocks Id System
|
||||
/dev/sdd1 1 130 1044193+ 83 Linux
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
作者简介:
|
||||
|
||||
大家好!我是 Manmohan Mirkar。我很高兴见到你们!我在 10 多年前开始使用 Linux,我从来没有想过我会到今天这个地步。我的激情是帮助你们获取 Linux 知识。谢谢阅读!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linuxroutes.com/linux-raid-1/
|
||||
|
||||
作者:[Manmohan Mirkar][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.linuxroutes.com/author/admin/
|
||||
[1]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[2]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[3]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[4]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[5]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[6]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[7]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[8]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[9]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[10]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[11]:http://www.linuxroutes.com/linux-raid-1/#
|
||||
[12]:http://www.linuxroutes.com/author/admin/
|
||||
[13]:http://www.linuxroutes.com/linux-raid-1/#respond
|
183
published/201702/20161226 Top 10 open source projects of 2016.md
Normal file
183
published/201702/20161226 Top 10 open source projects of 2016.md
Normal file
@ -0,0 +1,183 @@
|
||||
2016 年十大顶级开源项目
|
||||
============================================================
|
||||
|
||||
> 在我们今年的年度顶级开源项目列表中,让我们回顾一下作者们提到的几个 2016 年受欢迎的项目,以及社区管理员选出的钟爱项目。
|
||||
|
||||
![Top 10 open source projects of 2016](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/bowling-10-ten-520_cc.png?itok=Jd1FYLWt "Top 10 open source projects of 2016")
|
||||
|
||||
图片来自:[George Eastman House][1] 和 [Internet Archive Book Images][2] 。修改自 Opensource.com. CC BY-SA 4.0
|
||||
|
||||
我们持续关注每年新出现的、成长、改变和发展的优秀开源项目。挑选 10 个开源项目到我们的年度顶级项目列表中并不太容易,而且,也没有哪个如此短的列表能够包含每一个应该包含在内的项目。
|
||||
|
||||
为了挑选 10 个顶级开源项目,我们回顾了作者们 2016 年涉及到的流行的开源项目,同时也从社区管理员收集了一些意见。经过管理员的一番推荐和投票之后,我们的编辑团队选定了最终的列表。
|
||||
|
||||
它们就在这儿, 2016 年 10 个顶级开源项目:
|
||||
|
||||
### Atom
|
||||
|
||||
[Atom][3] 是一个来自 GitHub 的可魔改的(hackable)文本编辑器。Jono Bacon 在今年的早些时候为它的“简单核心”[写了一篇文章][4],对该开源项目所给用户带来的选择而大加赞赏。
|
||||
|
||||
“[Atom][3] 带来了大多数用户想要的主要核心特性和设置,但是缺失了一些用户可能想要的更加高级或独特的特性。……Atom 提供了一个强大的框架,从而允许它的许多部分都可以被改变或扩展。”
|
||||
|
||||
如果打算开始使用 Atom, 请先阅读[这篇指南][5]。如果想加入到用户社区,你可以在 [GitHub][6]、[Discuss][7] 和 [Slack][8] 上找到 Atom 。
|
||||
|
||||
Atom 是 [MIT][9] 许可的,它的[源代码][10]托管在 GitHub 上。
|
||||
|
||||
### Eclipse Che
|
||||
|
||||
[Eclipse Che][11] 是下一代在线集成开发环境(IDE)和开发者工作区。Joshua Allen Holm 在 2016 年 11 月为我们[点评][12]了 Eclipse Che,使我们可以一窥项目背后的开发者社区,Eclipse Che 创新性地使用了容器技术,并且开箱即用就支持多种流行语言。
|
||||
|
||||
“Eclipse Che 集成了就绪即用( ready-to-go)的软件环境(stack)覆盖了绝大多数现代流行语言。这包括 C++、Java、Go、PHP、Python、.NET、Node.js、Ruby on Rails 和 Android 开发的软件环境。软件环境仓库(Stack Library )如果不够的话,甚至还提供了更多的选择,你可以创建一个能够提供特殊环境的定制软件环境。”
|
||||
|
||||
你可以通过网上的[托管账户][13]、[本地安装][14],或者在你常用的[云供应商][15]上测试 Eclipse Che。你也可以在 GitHub 上找到它的[源代码][16],发布于 [Eclipse 公开许可证][17]之下。
|
||||
|
||||
### FreeCAD
|
||||
|
||||
[FreeCAD][18] 是用 Python 写的,是一款电脑辅助设计工具(或叫电脑辅助起草工具),可以用它来为实际物体创建设计模型。 Jason Baker 在 [3 款可供选择的 AutoCAD 的开源替代品][19]一文中写到关于 FreeCAD :
|
||||
|
||||
“FreeCAD 可以从各种常见格式中导入和导出 3D 对象,其模块化结构使得它易于通过各种插件扩展基本功能。该程序有许多内置的界面选项,这包括从草稿到渲染器,甚至还有一个机器人仿真能力。”
|
||||
|
||||
FreeCAD 是 [LGPL][20] 许可的,它的[源代码][21]托管在 GitHub 上。
|
||||
|
||||
### GnuCash
|
||||
|
||||
[GnuCash][22] 是一个跨平台的开源桌面应用,它可以用来管理个人和小型商业账户。 Jason Baker 把 GnuCash 列入了我们针对个人金融的 Mint 和 Quicken 的开源替代品的[综述列表][23]中:
|
||||
|
||||
GnuCash “具有多项记账的特性,能从多种格式导入数据,处理多重汇率,为你创建预算,打印支票,创建定制计划报告,并且能够直接从网上银行导入和拉取股票行情。”
|
||||
|
||||
其发布于 GPL [版本 2 或版本 3 许可证][25]下,你可以在 GitHub 上找到 GnuCash 的[源代码][24]。
|
||||
|
||||
一个值得一提的 GnuCash 可选替代品是 [KMyMoney][26],它也得到了该列表的提名,是另一个在 Linux 上管理财务的好选择。
|
||||
|
||||
### Kodi
|
||||
|
||||
[Kodi][27] 是一个开源媒体中心应用,之前叫做 XBMC,它能够在多种设备上工作,是一个用来 DIY 播放电影、TV、音乐的机顶盒的工具。 Kodi 高度可定制化,它支持多种皮肤、插件和许多遥控设备(包括它自己定制的 Android remote 应用)。
|
||||
|
||||
尽管今年我们没有深入地报道 Kodi, 但依旧出现在许多关于创建一个家用 Linux [音乐服务器][28]、媒体[管理工具][29]的文章中,还出现在之前的一个关于最喜爱的开源[视频播放器][30]的投票中(如果你在家中使用 Kodi,想要写一些自己的体验,[请让我们知道][31])。
|
||||
|
||||
其发布于 [GPLv2][33] 许可证下,你可以在 GitHub 上找到 Kodi 的[源代码][32]。
|
||||
|
||||
### MyCollab
|
||||
|
||||
[MyCollab][34] 是一套针对顾客关系管理(CRM)、文档管理和项目管理的工具。社区管理员 Robin Muilwijk 在他的综述 [2016 年 11 个顶级的项目管理工具][35]一文中详细阐述了 MyCollab-Project 的细节:
|
||||
|
||||
“MyCollab-Project 包含许多特性,比如甘特图、里程碑、时间跟踪和事件管理。它有 Kanban 板功能,因而支持敏捷开发模式。 MyCollab-Project 有三个不同的版本,其中[社区版][36]是自由且开源的。”
|
||||
|
||||
安装 MyCollab 需要 Java 运行环境和 MySQL 环境的支持。请访问 [MyCollab 网站][37]来了解如何对项目做贡献。
|
||||
|
||||
MyCollab 是 AGPLv3 许可的,它的[源代码][38]托管在 GitHub 上。
|
||||
|
||||
### OpenAPS
|
||||
|
||||
[OpenAPS][39] 是社区管理员在 2016 年发现的另一个有趣的项目,我们也深入报道过它。 OpenAPS,即 Open Artificial Pancreas System 项目,是一个致力于提高 1 型糖尿病患者生活质量的开源项目。
|
||||
|
||||
该项目包含“[一个专注安全的典范(reference)设计][40]、一个[工具箱][41]和一个开源的[典范(reference)实现][42],它们是为设备制造商或者任何能够构造人工胰腺设备的个人设计的,从而能够根据胰岛素水平安全地调节血液中葡萄糖水平。尽管潜在用户在尝试亲自构建或使用该系统前应该小心地测试该项目并和他们的健康护理医生讨论,但该项目的创建者希望开放技术能够加速医疗设备行业的研究和开发步伐,从而发现新的治疗方案并更快的投入市场。”
|
||||
|
||||
### OpenHAB
|
||||
|
||||
[OpenHAB][43] 是一个具有可插拔体系结构的家用自动化平台。社区管理员 D Ruth Bavousett 今年购买该平台并尝试使用以后为 OpenHAB [写到][44]:
|
||||
|
||||
“我所发现的其中一个有趣的模块是蓝牙绑定;它能够发现特定的已启用蓝牙的设备(比如你的智能手机、你孩子的那些设备)并且在这些设备到达或离开的时候采取行动-关门或开门、开灯、调节恒温器和关闭安全模式等等”
|
||||
|
||||
查看这个能够与社交网络、即时消息和云 IoT 平台进行集成和通讯的[绑定和捆绑设备的完整列表][45]。
|
||||
|
||||
OpenHAB 是 EPL 许可的,它的[源代码][46]托管在 GitHub 上。
|
||||
|
||||
### OpenToonz
|
||||
|
||||
[OpenToonz][47] 是一个 2D 动画生产软件。社区管理员 Joshua Allen 在 2016 年 3 月[报道][48]了它的开源版本,在 Opensource.com 网站的其他动画相关的文章中它也有被提及,但是我们并没有深入介绍,敬请期待。
|
||||
|
||||
现在,我们可以告诉你的是, OpenToonz 有许多独一无二的特性,包括 GTS,它是吉卜力工作室(Studio Ghibli )开发的一个生成工具,还有一个用于图像处理的[效果插件 SDK][49]。
|
||||
|
||||
如果想讨论开发和视频研究的话题,请查看 GitHub 上的[论坛][50]。 OpenToonz 的[源代码][51]托管在 GitHub 上,该项目是以 BSD 许可证发布。
|
||||
|
||||
### Roundcube
|
||||
|
||||
[Roundcube][52] 是一个现代化、基于浏览器的邮件客户端,它提供了邮箱用户使用桌面客户端时可能用到的许多(如果不是全部)功能。它有许多特性,包括支持超过 70 种语言、集成拼写检查、拖放界面、功能丰富的通讯簿、 HTML 电子邮件撰写、多条件搜索、 PGP 加密支持、会话线索等。 Roundcube 可以作为许多用户的邮件客户端的偶尔的替代品工作。
|
||||
|
||||
在我们的 [Gmail的开源替代品][53] 综述中, Roundcube 和另外四个邮件客户端均被包含在内。
|
||||
|
||||
其以 [GPLv3][55] 许可证发布,你可以在 GitHub 上找到 Roundcube 的[源代码][54]。除了直接[下载][56]、安装该项目,你也可以在许多完整的邮箱服务器软件中找到它,如 [Groupware][57]、[iRedMail][58]、[Mail-in-a-Box][59] 和 [mailcow][60]。
|
||||
|
||||
|
||||
这就是我们的列表了。在 2016 年,你有什么喜爱的开源项目吗?喜爱的原因呢?请在下面的评论框发表。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/jen-headshot-square.jpeg?itok=GTMugLtD)
|
||||
|
||||
Jen Wike Huger - Jen Wike Huger 是 Opensource.com 网站的内容管理员。她负责日期发布、协调编辑团队并指导新作者和已有作者。请在 Twitter 上关注她 @jenwike, 并在 Jen.io 上查看她的更多个人简介。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/16/12/yearbook-top-10-open-source-projects
|
||||
|
||||
作者:[Jen Wike Huger][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/jen-wike
|
||||
[1]:https://www.flickr.com/photos/george_eastman_house/
|
||||
[2]:https://www.flickr.com/photos/internetarchivebookimages/14784547612/in/photolist-owsEVj-odcHUi-osAjiE-x91Jr9-obHow3-owt68v-owu56t-ouySJt-odaPbp-owajfC-ouBSeL-oeTzy4-ox1okT-odZmpW-ouXBnc-ot2Du4-ocakCh-obZ8Pp-oeTNDK-ouiMZZ-ie12mP-oeVPhH-of2dD4-obXM65-owkSzg-odBEbi-oqYadd-ouiNiK-icoz2G-ie4G4G-ocALsB-ouHTJC-wGocbd-osUxcE-oeYNdc-of1ymF-idPbwn-odoerh-oeSekw-ovaayH-otn9x3-ouoPm7-od8KVS-oduYZL-obYkk3-hXWops-ocUu6k-dTeHx6-ot6Fs5-ouXK46
|
||||
[3]:https://atom.io/
|
||||
[4]:https://opensource.com/life/16/2/culture-pluggable-open-source
|
||||
[5]:https://github.com/atom/atom/blob/master/CONTRIBUTING.md
|
||||
[6]:https://github.com/atom/atom
|
||||
[7]:http://discuss.atom.io/
|
||||
[8]:http://atom-slack.herokuapp.com/
|
||||
[9]:https://raw.githubusercontent.com/atom/atom/master/LICENSE.md
|
||||
[10]:https://github.com/atom/atom
|
||||
[11]:http://www.eclipse.org/che/
|
||||
[12]:https://linux.cn/article-8018-1.html
|
||||
[13]:https://www.eclipse.org/che/getting-started/cloud/
|
||||
[14]:https://www.eclipse.org/che/getting-started/download/
|
||||
[15]:https://bitnami.com/stack/eclipse-che
|
||||
[16]:https://github.com/eclipse/che/
|
||||
[17]:https://github.com/eclipse/che/blob/master/LICENSE
|
||||
[18]:http://www.freecadweb.org/
|
||||
[19]:https://opensource.com/alternatives/autocad
|
||||
[20]:https://github.com/FreeCAD/FreeCAD/blob/master/COPYING
|
||||
[21]:https://github.com/FreeCAD/FreeCAD
|
||||
[22]:https://www.gnucash.org/
|
||||
[23]:https://opensource.com/life/16/1/3-open-source-personal-finance-tools-linux
|
||||
[24]:https://github.com/Gnucash/
|
||||
[25]:https://github.com/Gnucash/gnucash/blob/master/LICENSE
|
||||
[26]:https://kmymoney.org/
|
||||
[27]:https://kodi.tv/
|
||||
[28]:https://opensource.com/life/16/1/how-set-linux-based-music-server-home
|
||||
[29]:https://opensource.com/life/16/6/tinymediamanager-catalogs-your-movie-and-tv-files
|
||||
[30]:https://opensource.com/life/15/11/favorite-open-source-video-player
|
||||
[31]:https://opensource.com/how-submit-article
|
||||
[32]:https://github.com/xbmc/xbmc
|
||||
[33]:https://github.com/xbmc/xbmc/blob/master/LICENSE.GPL
|
||||
[34]:https://community.mycollab.com/
|
||||
[35]:https://opensource.com/business/16/3/top-project-management-tools-2016
|
||||
[36]:https://github.com/MyCollab/mycollab
|
||||
[37]:https://community.mycollab.com/docs/developing-mycollab/how-can-i-contribute-to-mycollab/
|
||||
[38]:https://github.com/MyCollab/mycollab
|
||||
[39]:https://openaps.org/
|
||||
[40]:https://openaps.org/reference-design
|
||||
[41]:https://github.com/openaps/openaps
|
||||
[42]:https://github.com/openaps/oref0/
|
||||
[43]:http://www.openhab.org/
|
||||
[44]:https://opensource.com/life/16/4/automating-your-home-openhab
|
||||
[45]:http://www.openhab.org/features/supported-technologies.html
|
||||
[46]:https://github.com/openhab/openhab
|
||||
[47]:https://opentoonz.github.io/e/index.html
|
||||
[48]:https://opensource.com/life/16/3/weekly-news-march-26
|
||||
[49]:https://github.com/opentoonz/plugin_sdk
|
||||
[50]:https://github.com/opentoonz/opentoonz/issues
|
||||
[51]:https://github.com/opentoonz/opentoonz
|
||||
[52]:https://roundcube.net/
|
||||
[53]:https://opensource.com/alternatives/gmail
|
||||
[54]:https://github.com/roundcube/roundcubemail
|
||||
[55]:https://github.com/roundcube/roundcubemail/blob/master/LICENSE
|
||||
[56]:https://roundcube.net/download/
|
||||
[57]:http://kolab.org/
|
||||
[58]:http://www.iredmail.org/
|
||||
[59]:https://mailinabox.email/
|
||||
[60]:https://mailcow.email/
|
@ -0,0 +1,149 @@
|
||||
前端开发者,2017 年你应该学习什么
|
||||
======================
|
||||
|
||||
![](https://cdn-images-1.medium.com/max/1000/1*1Xsnx4_M8uJc2klBxEtGLQ.jpeg)
|
||||
|
||||
在当今的快节奏生态中,我们都倾向于花时间尝试最新的发明,然后在网络上进行激烈的辩论。
|
||||
|
||||
这里,我并不是说我们不能这样做。但我们的确应该把脚步放慢一些,并认真了解那些不会有很大变化的事情。这样不仅会提升我们的工作质量和我们所创造的价值 —— 还将切实地帮助我们更快理解这些新的工具。
|
||||
|
||||
本文融合了我的个人经历以及对新一年的希冀。正如我想热切表达自己想法一样,我也期待能在下方的评论表单中看到你的建议。
|
||||
|
||||
### 学习如何写出可读性高的代码
|
||||
|
||||
我们多数的工作并不是编写新代码,而是维护已有代码。这意味着你最终阅读代码的时间要比编写它所花费的时间要长,所以你需要为_之后需要阅读你代码的程序员_优化代码,而不是为了解释器。
|
||||
|
||||
这里我建议你按以下顺序 — 由浅入深 — 阅读下面三本书:
|
||||
|
||||
* Dustin Boswell 的 《[编写可读代码的艺术 (The Art of Readable Code)][1]》
|
||||
* Robert C. Martin 的 《[代码整洁之道 (Clean Code: A Handbook of Agile Software Craftsmanship)][2]》
|
||||
* Steve McConnell 的 《[代码大全 (Code Complete: A Practical Handbook of Software Construction)][3]》
|
||||
|
||||
![](https://cdn-images-1.medium.com/max/1000/1*YQGwR6skf705fovSLCbmXQ.jpeg)
|
||||
|
||||
### 深入学习 JavaScript
|
||||
|
||||
现如今,每周都会出现一个新的 JavaScript 框架,并标榜自己比其他的任何旧框架都要好用。这样的情况下,我们很多人更倾向于花费时间来学习框架,而且这样也要比学习 JavaScript 本身要容易的多。如果说你正在使用框架,但并不了解该框架的工作方式,_立刻停止使用它,并去学习 JavaScript,直到你能够理解这些工具的工作方式为止_ 。
|
||||
|
||||
* 可以从 [Kyle Simpson][4] 的 [你所不知道的 JavaScript][5] 系列开始,这个系列可以在线免费阅读。
|
||||
* [Eric Elliott][6] 列出的一个长长的 [2017 年:JavaScript 的学习目标][7]。
|
||||
* [Henrique Alves][8] 列出的 [进行响应式开发之前必须了解的事情][9](实际上就是一个知识框架)。
|
||||
* Mike Pennisi 的 [JavaScript 开发者:注意你的语言][10] — 了解 ECMAScript 新特性的中 TC-39 发展过程。
|
||||
|
||||
### 学习函数式编程
|
||||
|
||||
多年以来,我们一直期待着 JavaScript 引入类,但真正引入类之后,我们却不想在 JavaScript 中使用类了,我们只想使用函数。我们甚至使用函数编写 HTML (JSX)。
|
||||
|
||||
* Kyle Simpson 的 [轻量级函数式 JavaScript][11]。
|
||||
* Frisby 教授的 [函数式编程完全指南][12] 和 [在线免费课程][13]。
|
||||
|
||||
![](https://cdn-images-1.medium.com/max/1000/1*Helkj3sq3oVOc-dtjRgrYQ.jpeg)
|
||||
|
||||
### 学习设计基础知识
|
||||
|
||||
作为一个前端开发者,我们比这个生态中的任何人 —— 甚至可能是设计人员 —— 都要更加接近用户。如果设计者必须去确认你还原在屏幕上的每一个像素,你或许做错了某些事。
|
||||
|
||||
* [David Kadavy][16] 的《[黑客设计(Design for Hackers)][14]》或对应的 [免费课程][15]。
|
||||
* [Tracy Osborn][18] 的讲座:[为非设计人员的设计知识][17]。
|
||||
* [Nathan Barry][20] 的 《[Web 应用设计(Design of Web Applications)][19]》。
|
||||
* [Jason Santa Maria][22] 的 《[Web 页面设计(On Web Typography)][21]》。
|
||||
* Alan Cooper 的 《[ 交互设计之路:让高科技产品回归人性(The Inmates Are Running the Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity )][23]》。
|
||||
* 两篇关于 UI 动画的文章:[如何使用动画来提高 UX][24]、[过渡界面][25]。
|
||||
|
||||
### 学习如何与人协作
|
||||
|
||||
有些人很喜欢通过编程来与电脑进行交互,而非与人进行交互。不幸的是,这样的结果并不是很好。
|
||||
|
||||
基本上我们不可能完全脱离群体来工作:我们总是需要和其他开发者、设计师以及项目经理 —— 有时候甚至要和用户 —— 交换意见。这是比较难的任务,但如果你想要真正理解你在做什么以及为什么要这么做的话,这一步是非常重要的,因为这正是我们工作的价值所在。
|
||||
|
||||
* [John Sonmez][27] 的《[软技能:代码之外的生存指南(Soft Skills: The software developer’s life manual)][26]》。
|
||||
* Robert C. Martin 的《[代码整洁之道:程序员的职业素养(The Clean Coder: A Code of Conduct for Professional Programmers)][28]》。
|
||||
* Jim Camp 的 《[从零开始:专业人士不想让你了解的谈判工具(Start with No: The Negotiating Tools that the Pros Don’t Want You to Know)][29]》。
|
||||
|
||||
![](https://cdn-images-1.medium.com/max/1000/1*zv6BXllLujNl-vDqkXQMqw.jpeg)
|
||||
|
||||
### 学习如何为用户编写代码
|
||||
|
||||
与同事或其他人的交流大部分是以文本的形式进行的:目标描述和评论、代码注释、Git 提交、即时聊天消息、电子邮件、推文、博客等。
|
||||
|
||||
想象一下,人们要花费多少时间来阅读和理解所有以上提到的这一切。如果你可以通过写得更清楚、简洁来减少这个时间,世界将变成一个更好的工作场所。
|
||||
|
||||
* William Zinsserd 的《[写作法宝 : 非虚构写作指南(On Writing Well: The Classic Guide to Writing Nonfiction)][30]》。
|
||||
* William Strunk 和 E. B. White 的《[英文写作指南 (The Elements of Style)][31]》。
|
||||
* [奥威尔写作规则][32]。
|
||||
* 俄文:很好的 [Glavred 课程][33]。
|
||||
|
||||
### 学习以前的计算机科学智慧
|
||||
|
||||
前端开发已经不仅仅简单的下拉菜单了,它前所未有的更复杂了。随着我们所需解决问题的复杂度越来越高,声名狼藉的“JavaScript 疲乏症”也随之出现了。
|
||||
|
||||
这意味着现在需要学习非前端开发人员过去几十年所积累形成的知识精华。而这也是我最想听到你向我推荐的内容了。
|
||||
|
||||
以下是我个人给大家的推荐:
|
||||
|
||||
* Coursera 的 《[学习像计算机科学家那样思考方式(Learn To Think Like A Computer Scientist )][34]》。
|
||||
* [DHH][36] 的 [对我意义非凡的五本书][35]。
|
||||
|
||||
|
||||
* * *
|
||||
|
||||
读完本文,你有些什么建议呢?在这新的 2017 年里你又想学习些什么呢?
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
|
||||
Web 开发者,充满激情的摄影者,crazy dogs 的主人
|
||||
|
||||
译者简介:
|
||||
|
||||
[GHLandy](http://GHLandy.com) —— 欲得之,则为之奋斗 (If you want it, work for it.)。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://medium.freecodecamp.com/what-to-learn-in-2017-if-youre-a-frontend-developer-b6cfef46effd#.ss9xbwrew
|
||||
|
||||
作者:[Artem Sapegin][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[bestony](https://github.com/bestony)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://medium.freecodecamp.com/@sapegin
|
||||
[1]:https://www.amazon.com/gp/product/0596802293/
|
||||
[2]:https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/
|
||||
[3]:https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/
|
||||
[4]:https://medium.com/u/5dccb9bb4625
|
||||
[5]:https://github.com/getify/You-Dont-Know-JS
|
||||
[6]:https://medium.com/u/c359511de780
|
||||
[7]:https://medium.com/javascript-scene/top-javascript-frameworks-topics-to-learn-in-2017-700a397b711#.zhnbn4rvg
|
||||
[8]:https://medium.com/u/b6c3841651ac
|
||||
[9]:http://alves.im/blog/before-dive-into-react.html
|
||||
[10]:https://bocoup.com/weblog/javascript-developers-watch-your-language
|
||||
[11]:https://github.com/getify/Functional-Light-JS
|
||||
[12]:https://github.com/MostlyAdequate/mostly-adequate-guide
|
||||
[13]:https://egghead.io/courses/professor-frisby-introduces-composable-functional-javascript
|
||||
[14]:https://www.amazon.com/Design-Hackers-Reverse-Engineering-Beauty-ebook/dp/B005J578EW
|
||||
[15]:http://designforhackers.com/
|
||||
[16]:https://medium.com/u/5377a93ef640
|
||||
[17]:https://youtu.be/ZbrzdMaumNk
|
||||
[18]:https://medium.com/u/e611097a5bd4
|
||||
[19]:http://nathanbarry.com/webapps/
|
||||
[20]:https://medium.com/u/ac3090433602
|
||||
[21]:https://abookapart.com/products/on-web-typography
|
||||
[22]:https://medium.com/u/8eddcb9e4ac4
|
||||
[23]:https://www.amazon.com/Inmates-Are-Running-Asylum-Products-ebook/dp/B000OZ0N62/
|
||||
[24]:http://babich.biz/how-to-use-animation-to-improve-ux/
|
||||
[25]:https://medium.com/@pasql/transitional-interfaces-926eb80d64e3#.igcwawszz
|
||||
[26]:https://www.amazon.com/Soft-Skills-software-developers-manual/dp/1617292397/
|
||||
[27]:https://medium.com/u/56e8cba02b
|
||||
[28]:https://www.amazon.com/Clean-Coder-Conduct-Professional-Programmers/dp/0137081073/
|
||||
[29]:https://www.amazon.com/Start-No-Negotiating-Tools-that-ebook/dp/B003EY7JEE/
|
||||
[30]:https://www.amazon.com/gp/product/0060891548/
|
||||
[31]:https://www.amazon.com/Elements-Style-4th-William-Strunk/dp/0205313426/
|
||||
[32]:http://www.economist.com/blogs/prospero/2013/07/george-orwell-writing
|
||||
[33]:http://maximilyahov.ru/glvrd-pro/
|
||||
[34]:https://www.coursera.org/specializations/algorithms
|
||||
[35]:https://signalvnoise.com/posts/3375-the-five-programming-books-that-meant-most-to-me
|
||||
[36]:https://medium.com/u/54bcbf647830
|
@ -0,0 +1,167 @@
|
||||
编写 android 测试单元该做的和不该做的事
|
||||
============================================================
|
||||
|
||||
在本文中, 我将根据我的实际经验,为大家阐述一个编写测试用例的最佳实践。在本文中我将使用 Espresso 编码, 但是它们可以用到单元测试和仪器测试(instrumentation test)当中。基于以上目的,我们来研究一个新闻程序。
|
||||
|
||||
> 以下内容纯属虚构,如有雷同纯属巧合 :P
|
||||
|
||||
一个新闻 APP 应该会有以下这些 activity。
|
||||
|
||||
* 语言选择 - 当用户第一次打开软件, 他必须至少选择一种语言。选择后,选项保存在共享偏好中,用户跳转到新闻列表 activity。
|
||||
* 新闻列表 - 当用户来到新闻列表 activity,将发送一个包含语言参数的请求到服务器,并将服务器返回的内容显示在 recycler view 上(包含有新闻列表的 id, _news_list_)。 如果共享偏好中未存语言参数,或者服务器没有返回一个成功消息, 就会弹出一个错误对话框并且 recycler view 将不可见。如果用户只选择了一种语言,新闻列表 activity 有个 “Change your Language” 的按钮,或者如果用户选择多种语言,则按钮为 “Change your Languages” 。 (我对天发誓这是一个虚构的 APP 软件)
|
||||
* 新闻细节 - 如同名字所述, 当用户点选新闻列表项时将启动这个 activity。
|
||||
|
||||
这个 APP 功能已经足够,,让我们深入研究下为新闻列表 activity 编写的测试用例。 这是我第一次写的代码。
|
||||
|
||||
```
|
||||
/*
|
||||
Click on the first news item.
|
||||
It should open NewsDetailActivity
|
||||
*/
|
||||
@Test
|
||||
public void testClickOnAnyNewsItem() {
|
||||
onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions
|
||||
.actionOnItemAtPosition(1, click()));
|
||||
intended(hasComponent(NewsDetailsActivity.class.getName()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* To test the correct text on the button
|
||||
*/
|
||||
@Test
|
||||
public void testChangeLanguageFeature() {
|
||||
int count = UserPreferenceUtil.getSelectedLanguagesCount();
|
||||
if (count == 1) {
|
||||
onView(withText("Choose your Language")).check(matches(isDisplayed()));
|
||||
} else if (count > 1) {
|
||||
onView(withText("Choose your Languages")).check(matches(isDisplayed()));
|
||||
}
|
||||
?}
|
||||
```
|
||||
|
||||
#### 仔细想想测试什么
|
||||
|
||||
在第一个测试用例 `testClickOnAnyNewsItem()`, 如果服务器没有返回成功信息,测试用例将会返回失败,因为 recycler view 是不可见的。但是这个测试用例的目的并非如此。 **不管该用例为 PASS 还是 FAIL,它的最低要求是 recycler view 总是可见的,** 如果因某种原因,recycler view 不可见,那么测试用例不应视为 FAILED。正确的测试代码应该像下面这个样子。
|
||||
|
||||
```
|
||||
/*
|
||||
Click on any news item.
|
||||
It should open NewsDetailActivity
|
||||
*/
|
||||
@Test
|
||||
public void testClickOnAnyNewsItem() {
|
||||
try {
|
||||
/*To test this case, we need to have recyclerView present. If we don't have the
|
||||
recyclerview present either due to the presence of error_screen, then we should consider
|
||||
this test case successful. The test case should be unsuccesful only when we click on a
|
||||
news item and it doesn't open NewsDetail activity
|
||||
*/
|
||||
ViewInteraction viewInteraction = onView(withId(R.id.news_list));
|
||||
viewInteraction.check(matches(isDisplayed()));
|
||||
} catch (NoMatchingViewException e) {
|
||||
return;
|
||||
} catch (AssertionFailedError e) {
|
||||
return;
|
||||
}
|
||||
//在这里我们确信,news_list的 recyclerview 对用户是可见的。
|
||||
onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions
|
||||
.actionOnItemAtPosition(1, click()));
|
||||
intended(hasComponent(NewsDetailsActivity.class.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
#### 一个测试用例本身应该是完整的
|
||||
|
||||
当我开始测试, 我通常按如下顺序测试 activity:
|
||||
|
||||
* 语言选择
|
||||
* 新闻列表
|
||||
* 新闻细节
|
||||
|
||||
因为我首先测试语言选择 activity,在测试 NewsList activity 之前,总有一种语言已经是选择好了的。但是当我先测试新闻列表 activity 时,测试用例开始返回错误信息。原因很简单 - 没有选择语言,recycler view 不会显示。**注意, 测试用例的执行顺序不能影响测试结果。** 因此在运行测试用例之前, 语言选项必须是保存在共享偏好中的。在本例中,测试用例独立于语言选择 activity 的测试。
|
||||
|
||||
```
|
||||
@Rule
|
||||
public ActivityTestRule activityTestRule =
|
||||
new ActivityTestRule(TopicsActivity.class, false, false);
|
||||
|
||||
/*
|
||||
Click on any news item.
|
||||
It should open NewsDetailActivity
|
||||
*/
|
||||
@Test
|
||||
public void testClickOnAnyNewsItem() {
|
||||
UserPreferenceUtil.saveUserPrimaryLanguage("english");
|
||||
Intent intent = new Intent();
|
||||
activityTestRule.launchActivity(intent);
|
||||
try {
|
||||
ViewInteraction viewInteraction = onView(withId(R.id.news_list));
|
||||
viewInteraction.check(matches(isDisplayed()));
|
||||
} catch (NoMatchingViewException e) {
|
||||
return;
|
||||
} catch (AssertionFailedError e) {
|
||||
return;
|
||||
}
|
||||
onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions
|
||||
.actionOnItemAtPosition(1, click()));
|
||||
intended(hasComponent(NewsDetailsActivity.class.getName()));
|
||||
?}
|
||||
```
|
||||
#### 在测试用例中避免使用条件代码
|
||||
|
||||
现在在第二个测试用例 `testChangeLanguageFeature()` 中,我们获取到用户选择语言的个数,基于这个数目,我们写了 if-else 条件来进行测试。 但是 if-else 条件应该写在你的代码当中,而不是测试代码里。每一个条件应该单独测试。 因此,在本例中,不是只写一条测试用例,而是要写如下两个测试用例。
|
||||
|
||||
```
|
||||
/**
|
||||
* To test the correct text on the button when only one language is selected.
|
||||
*/
|
||||
@Test
|
||||
public void testChangeLanguageFeatureForSingeLanguage() {
|
||||
//Other initializations
|
||||
UserPreferenceUtil.saveSelectedLanguagesCount(1);
|
||||
Intent intent = new Intent();
|
||||
activityTestRule.launchActivity(intent);
|
||||
onView(withText("Choose your Language")).check(matches(isDisplayed()));
|
||||
}
|
||||
|
||||
/**
|
||||
* To test the correct text on the button when more than one language is selected.
|
||||
*/
|
||||
@Test
|
||||
public void testChangeLanguageFeatureForMultipleLanguages() {
|
||||
//Other initializations
|
||||
UserPreferenceUtil.saveSelectedLanguagesCount(5); //Write anything greater than 1.
|
||||
Intent intent = new Intent();
|
||||
activityTestRule.launchActivity(intent);
|
||||
onView(withText("Choose your Languages")).check(matches(isDisplayed()));
|
||||
}
|
||||
|
||||
```
|
||||
#### 测试用例应该独立于外部因素
|
||||
|
||||
在大多数应用中,我们与外部网络或者数据库进行交互。一个测试用例运行时可以向服务器发送一个请求,并获取成功或失败的返回信息。但是不能因从服务器获取到失败信息,就认为测试用例没有通过。这样想这个问题 - 如果测试用例失败,然后我们修改客户端代码,以便测试用例通过。 但是在本例中, 我们要在客户端进行任何更改吗?- **NO**。
|
||||
|
||||
但是你应该也无法完全避免要测试网络请求和响应。由于服务器是一个外部代理,我们可以设想一个场景,发送一些可能导致程序崩溃的错误响应。因此,你写的测试用例应该覆盖所有可能来自服务器的响应,甚至包括服务器决不会发出的响应。这样可以覆盖所有代码,并能保证应用可以处理所有响应,而不会崩溃。
|
||||
|
||||
> 正确的编写测试用例与编写这些测试代码同等重要。
|
||||
|
||||
感谢你阅读此文章。希望对测试用例写的更好有所帮助。你可以在 [LinkedIn][1] 上联系我。还可以[在这里][2]阅读我的其他文章。
|
||||
|
||||
获取更多资讯请关注我们, 我们发新文章时您将获得通知。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://blog.mindorks.com/the-dos-and-don-ts-of-writing-test-cases-in-android-70f1b5dab3e1#.lfilq9k5e
|
||||
|
||||
作者:[Anshul Jain][a]
|
||||
译者:[kokialoves](https://github.com/kokialoves)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://blog.mindorks.com/@anshuljain?source=post_header_lockup
|
||||
[1]:http://www.linkedin.com/in/anshul-jain-b7082573
|
||||
[2]:https://medium.com/@anshuljain
|
||||
[3]:https://blog.mindorks.com/
|
@ -0,0 +1,121 @@
|
||||
2017 年最值得期待的 5 个新 Linux 发行版
|
||||
============================================================
|
||||
|
||||
如果你经常光顾 [Distrowatch][1] 网站,你会发现每一年的 Linux 系统流行度排行榜几乎都没啥变化。
|
||||
|
||||
排在前十名的一直都是那几个发行版,而其它一些发行版也许现在还在排行榜中,到下一年年底就有可能不在了。
|
||||
|
||||
关于 Distrowatch 的一个大家很不了解的功能叫做[候选列表][2],它包括以下类型的发行版:
|
||||
|
||||
- 还未进行评审
|
||||
- 组件缺失或有缺陷
|
||||
- 相关的英文资料不够丰富
|
||||
- 该项目好像都没人进行维护
|
||||
|
||||
一些非常具有潜力,但是还未被评审的 Linux 系统发行版也是值得大家去关注的。但是注意,由于 Distrowatch 网站暂时没时间或人力去评审这些新的发行版,因此它们可能永远无法进入网站首页排名。
|
||||
|
||||
因此,我们将会跟大家分享下 **2017** 年最具潜力的 **5** 个新的 Linux 发行版系统,并且会对它们做一些简单的介绍。
|
||||
|
||||
由于 Linux 系统的生态圈都非常活跃,你可以期待着这篇文章后续的不断更新,或许在下一年中它将完全大变样了。
|
||||
|
||||
不管怎么说,咱们还是来看下这些新系统吧!
|
||||
|
||||
### 1、 SemicodeOS 操作系统
|
||||
|
||||
[SemicodeOS 操作系统][3] 是一个专为程序员和 Web 开发人员设计的 Linux 发行版。它包括所有的开箱即用的代码编译器,[各种文本编辑器][4],[最流行的编程语言的 IDE 环境][5],以及团队协作编程工具。
|
||||
|
||||
即使你不是程序员或者开发人员,但是期望成为他们中的一员,SemicodeOS 系统自带的 Scratch IDE 工具可以在你起步时给以指引。尽管该系统还处于测试阶段,但是我相信这个基于 Sudan 的 Linux 发行版在接下来的一年中将会让 Linux 开源社区变得更加丰富多彩。
|
||||
|
||||
你可以通过其官网了解更多的详细信息。
|
||||
|
||||
[
|
||||
![Semicode Linux Distro](http://www.tecmint.com/wp-content/uploads/2016/12/Semicode-Linux-Distro.png)
|
||||
][6]
|
||||
|
||||
*Semicode Linux 操作系统*
|
||||
|
||||
### 2、 EnchantmentOS 操作系统
|
||||
|
||||
[EnchantmentOS][7] 操作系统是一个基于 Xubuntu 16.04 的发行版,它包括一些经过特别挑选的对内存要求较低的应用程序。这无论对新老设备来说都是一个不错的选择。
|
||||
|
||||
它同样遵循 Xubuntu 系统的长期支持周期,并且旨在提供可靠和安全的 Linux 应用软件。除此这外,即便是对非技术人员,其内置的应用程序也都非常地简单易用。
|
||||
|
||||
还有, EnchantmentOS 系统即使从 USB 存储设备启动时也表现出超强的性能,这一点是其创建者引以为豪的。
|
||||
|
||||
[
|
||||
![EnchantmentOS](http://www.tecmint.com/wp-content/uploads/2016/12/EnchantmentOS.jpg)
|
||||
][8]
|
||||
|
||||
*EnchantmentOS 操作系统*
|
||||
|
||||
### 3、 Escuelas Linux 操作系统
|
||||
|
||||
[Escuelas Linux 操作系统][9](在西班牙语中是 “Linux 学校” 的意思)是一个基于 Bodhi 的 Linux 发行版,它主要是为中小学教育而设计的,它包括各种各样的与教育相关的应用软件。请忽略其西班牙语名字,它也提供全英语支持。
|
||||
|
||||
Escuelas Linux 系统其它方面的特性就是它使用的是轻量级桌面环境,低内存和低存储空间要求。其官网宣称,该系统只需要 300 MB 的内存和 20 GB 的硬盘存储空间就可以完美运行。
|
||||
|
||||
[
|
||||
![Escuelas Linux](http://www.tecmint.com/wp-content/uploads/2016/12/escuelaslinux.png)
|
||||
][10]
|
||||
|
||||
*Escuelas Linux 操作系统*
|
||||
|
||||
### 4、 OviOS 操作系统
|
||||
|
||||
与前面几个 Linux 发行版截然不同的是,[OviOS 操作系统][11] 并不是一个多用途的操作系统。相反,它被描述为企业级存储操作系统,虽然它不基于任何发行版,但是完全与 Linux 标准库(LSB)相兼容。
|
||||
|
||||
你可以把 OviOS 系统作为一种功能强大的存储设备,它能够处理 iSCSI、NFS、SMB 或者是 FTP 服务,除此之外,最新版的 OviOS 系统还能实现复制及高可用性。因此,你还在等什么呢?赶紧去试用一下吧。
|
||||
|
||||
[
|
||||
![OviOS](http://www.tecmint.com/wp-content/uploads/2016/12/ovios.png)
|
||||
][12]
|
||||
|
||||
*OviOS 操作系统*
|
||||
|
||||
### 5、 Open Network Linux
|
||||
|
||||
[ONL][13] 操作系统(简称)是一个基于 Debian 的发行版,而且(就像 OviOS 操作系统一样),它也不是一个多用途的操作系统。
|
||||
|
||||
如果你是一名网络管理员,你应该为找到这个操作系统而感到庆幸(如果你之前不知道的话),你可以把 ONL 系统应用于裸交换机设备上,替换原有的昂贵且需要授权的操作系统。
|
||||
|
||||
值得注意的是, ONL 操作系统因其包含各种各样的开箱即用的软件而出名,并且这些软件都是与面向网络的裸设备相关的。你准备好去尝试了吗?
|
||||
|
||||
##### 总结
|
||||
|
||||
你应该注意到所有这些发行版在最近几个月内都已经提交给 Distrowatch 网站进行评审了。如果你对其中一些比较感兴趣,可以查看 [候选列表][14] 页面,单击发行版名称旁边的 **推荐** 按钮。你所做的操作将会推动 Distrowatch 网站安排相关人员对该系统进行评审。
|
||||
|
||||
像往常一样,如果你对这篇文章有任何问题或建议,请随意提出来。请通过下面的评论区随时与我们进行交流。我们非常期待你的参与!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](http://1.gravatar.com/avatar/d9d14c5b51331864398e6288cb0c2091?s=128&d=blank&r=g)
|
||||
|
||||
Gabriel Cánepa 来自 Argentina , San Luis , Villa Mercedes ,他是一名 GNU/Linux 系统管理员和网站开发工程师。目前在一家世界领先的消费品公司工作,在日常工作中,他非常善于使用 FOSS 工具来提高公司在各个领域的生产率。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/new-linux-distributions-2017/
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/gacanepa/
|
||||
[1]:http://distrowatch.com/
|
||||
[2]:http://distrowatch.com/dwres.php?resource=links#new
|
||||
[3]:http://www.semicodeos.com/
|
||||
[4]:http://www.tecmint.com/best-open-source-linux-text-editors/
|
||||
[5]:http://www.tecmint.com/best-linux-ide-editors-source-code-editors/
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2016/12/Semicode-Linux-Distro.png
|
||||
[7]:http://enchantment.sourceforge.net/
|
||||
[8]:http://www.tecmint.com/wp-content/uploads/2016/12/EnchantmentOS.jpg
|
||||
[9]:https://escuelaslinux.sourceforge.io/
|
||||
[10]:http://www.tecmint.com/wp-content/uploads/2016/12/escuelaslinux.png
|
||||
[11]:http://www.ovios.org/
|
||||
[12]:http://www.tecmint.com/wp-content/uploads/2016/12/ovios.png
|
||||
[13]:http://www.opennetlinux.org/
|
||||
[14]:http://distrowatch.com/dwres.php?resource=links#new
|
@ -0,0 +1,72 @@
|
||||
在 Linux 中无人看守批量创建用户的方法
|
||||
=============
|
||||
|
||||
### 介绍
|
||||
|
||||
作为一名 Linux 系统管理员,你有时必须向系统添加新的用户帐户。为此,经常使用 `adduser` 命令。当涉及到多个用户的创建时,`adduser` 命令可能会变得相当无聊和耗时。这篇短文旨在为 Linux 系统管理员提供一种简单而无人值守的方式来批量创建用户。`newusers` 命令将帮助你通过从预填文件中获取信息来创建多个用户。
|
||||
|
||||
**要求**
|
||||
|
||||
访问 Linux 计算机的特权。
|
||||
|
||||
**约定**
|
||||
|
||||
- `#` - 给定命令需要以 root 用户权限运行或者使用 `sudo` 命令
|
||||
- `$` - 给定命令以常规权限用户运行
|
||||
|
||||
### 如何进行
|
||||
|
||||
**创建一个包含用户名的文件**
|
||||
|
||||
首先,你需要创建一个包含用户名列表的文件。
|
||||
|
||||
```
|
||||
$ vi users-list.txt
|
||||
```
|
||||
|
||||
在文件中,一个用户一行,下面是样式:
|
||||
|
||||
```
|
||||
Username:Password:User ID:Group ID:User Info:Home Directory:Default Shell
|
||||
Username:Password:User ID:Group ID:User Info:Home Directory:Default Shell
|
||||
Username:Password:User ID:Group ID:User Info:Home Directory:Default Shell
|
||||
...
|
||||
```
|
||||
|
||||
**创建用户**
|
||||
|
||||
在创建了包含用户信息的文件后,使用 `newusers` 命令创建用户。
|
||||
|
||||
```
|
||||
# newusers users-list.txt
|
||||
```
|
||||
|
||||
**检查用户账户**
|
||||
|
||||
最后你可以确认用户已经正确创建了,在 `/etc/passwd` 文件中查看它们:
|
||||
|
||||
```
|
||||
# tail /etc/passwd
|
||||
```
|
||||
|
||||
![using newusers for bulk user creation](https://linuxconfig.org/images/newusers-bulk-user-creation.png)
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux
|
||||
|
||||
作者:[Essodjolo Kahanam][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux
|
||||
[1]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux#h4-1-create-a-file-containing-the-usernames
|
||||
[2]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux#h4-2-create-users
|
||||
[3]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux#h4-3-check-user-accounts
|
||||
[4]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux#h1-introduction
|
||||
[5]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux#h2-requirements
|
||||
[6]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux#h3-conventions
|
||||
[7]:https://linuxconfig.org/simple-way-for-unattended-bulk-user-creation-in-linux#h4-how-to-proceed
|
@ -0,0 +1,106 @@
|
||||
2017 年 Go 语言编程的五大关注点
|
||||
============================================================
|
||||
|
||||
### 今年像动态插件,Serverless Go 以及 HTTP/2 这些创新对你的开发意味着什么?
|
||||
|
||||
Go 1.8 刚刚发布,它有几个新功能,包括:
|
||||
|
||||
* [HTTP/2 Push][1]
|
||||
* [HTTP 服务器平滑关闭][2]
|
||||
* [插件][3]
|
||||
* [缺省 GOPATH][4]
|
||||
|
||||
这些新功能的影响力取决于你和开发团队如何使用 Go。 自从 Go 1.0 于 2012 年发布以来,其简单性、并发性和内置支持使其保持[普及度][9]不断增长,所以对“Go 擅长什么”的答案一直在增长。
|
||||
|
||||
这里我会提供一些想法,包括新到来的版本及 Go 世界最近其它吸引我的地方。这不是一个详尽的列表,所以请[让我知道][10]你认为在 2017 年 Go 还会发生哪些重要的事。
|
||||
|
||||
### Go 的超级可部署性 + 插件 = 容器、任何东西?
|
||||
|
||||
[1.8 版本][11]已经发布,我已经与其中几个人交谈过添加动态插件会如何影响像容器之类的事物,动态插件是为了加载在编译时不是程序一部分的共享库的代码。 动态插件使容器中的高并发微服务变得更加简单。 你可以轻松地以外部进程的方式加载插件,同时具备在容器中微服务的所有好处:保护你的主进程不会崩溃,并且没有任何东西会搞乱你的内存空间。 对插件的动态支持应该是在 Go 中使用容器的福音。
|
||||
|
||||
*关于专家现场 Go 培训,请注册 [ Go Beyond the Basics][12]。*
|
||||
|
||||
### 跨平台支持仍在吸引开发人员
|
||||
|
||||
在 Go 开源之后的 7 年里,它已被全球采用。[Daniel Whitenack][13] 是一名数据科学家和工程师,他为 Jupyter 维护 Go 内核,告诉我最近他[在西伯利亚做数据科学和 Go 语言培训][14],(是的,在西伯利亚!数据科学和 Go - 之后再细讲一下...)并 “很惊讶地看到那里 Go 社区是如此活跃和积极。” 人们继续在项目中采取 Go 的另一个很大的原因是交叉编译,对此,几个 Go 专家解释说[这在 Go 1.5 版本中变得更容易了][15]。来自其他语言(如 Python)的开发人员应该发现,在没有 VM 的目标平台上,能够为多个操作系统构建捆绑的、可部署的应用程序是在 Go 中工作的关键。
|
||||
|
||||
在 1.8 版本中对跨平台的支持,再加上[提升了 15% 的编译速度][16],你就可以看到为什么 Go 是初创公司最喜欢的语言。
|
||||
|
||||
*有兴趣了解 Go 的基础知识吗?查看 [Go 基础学习路径][17] 让 O’Reilly 专家来带你开始。*
|
||||
|
||||
### Go 解释器在开发中;再见 Read-Eval-Print-Loop
|
||||
|
||||
有一些聪明的家伙正在做一个 [Go 解释器][18],我一定会持续关注它。如你所知的那样,有几个 Read-Eval-Print-Loop(REPL)的解决方案可以用来评估表达式,以确保代码如你预期的工作,但那些方法通常意味着容忍一些不便,或需要费力从几个方案中找到一个适合你的用例的。有一个健壮、一致的解释器就太好了,一旦我了解到更多消息,我会告诉你们。
|
||||
|
||||
*在开发中使用 Go 复杂特性?观看 O'Reilly 的视频训练 [中级 Go ][19]*。
|
||||
|
||||
### Go 的 serverless - 会是什么样子?
|
||||
|
||||
是的,现在围绕 serverless 架构(功能即服务(FaaS))有很多炒作。但有时候也有些捉摸不定的地方,那么关于 Go 的 serverless 发生了什么?我们能在今年看到一个 Go 语言原生支持的 serverless 服务么?
|
||||
|
||||
AWS Lambda 是最知名的 serverless 提供商,不过 Google 最近也推出了 [Google Cloud Functions][20]。这两个 FaaS 解决方案使你可以在无须管理服务器的情况下运行代码,你的代码存储在别人为你管理的服务器集群上,并且仅在触发事件调用它时运行。AWS Lambda 目前支持 JavaScript、Python 和 Java,还可以启动 Go、Ruby 和 bash 进程。 Google Cloud Functions 只支持 JavaScript,但很可能不久将支持 Java 和 Python。许多物联网设备已经使用 serverless 方案,随着 Go 越来越多地被创业公司采用,serverless 似乎是一个可能的增长点,所以我在关注这些 serverless 解决方案中 Go 的开发情况。
|
||||
|
||||
已经有[几个框架][25]可以支持 AWS Lambdas:
|
||||
|
||||
* [λ Gordon][5] - 使用 CloudFormation 创建、连接及部署 AWS Lambdas
|
||||
* [Apex][6] - 构建、部署及管理 AWS Lambda 函数
|
||||
* [Sparta][7] - AWS Lambda 微服务的 Go 框架
|
||||
|
||||
还有一个 AWS Lambda 替代品支持 Go:
|
||||
|
||||
* [Iron.io][8]:建立在 Docker 和 Go 之上;语言未知;支持 Golang、Python、Ruby、PHP 和 .NET
|
||||
|
||||
*有关 serverless 架构的更多信息,请观看 Mike Roberts 在旧金山 O'Reilly 软件架构会议上的演讲主题:[_serverless介绍_][22]。*
|
||||
|
||||
### 数据科学中的 Go
|
||||
|
||||
我在本文开头暗示了这一点:也许令人惊讶的是很多人都在使用 Go 进行数据科学和机器学习。关于它是否适合还有一些争论,但基于像 [Gopher 学院之 2016 年终][23]那样的年度文章中,你会注意到 30 篇文章中至少有 4 篇是关于机器学习或分布式数据处理,它们正在像我们走来。
|
||||
|
||||
我之前关于 Go 的易部署性的观点可能是数据科学家使用 Go 的一个关键原因:他们可以更轻松地在易读而可用于生产环境的应用程序中向他人展示数据模型。与此相结合的是 Go 的广泛使用(正如我前面提到的,它正变得越来越流行!),而且有数据专家创建“可用并且与其它程序配合”的程序。任何使用 Go 构建的应用数据科学家会在公司其他部分使用相同的语言,或者至少它非常适合现代架构。
|
||||
|
||||
*更多关于 Go 的数据科学,Daniel Whitenack 写了一个很好的概述,解释了如何使用它: [Data Science Gophers][24]。*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://cdn-images-1.medium.com/fit/c/60/60/1*MFGykrfk6_HjkJzePBtaMw.png)
|
||||
|
||||
O'Reilly Media 的监督编辑,与编辑团队合作,涵盖各种各样的编程主题。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://medium.com/@sconant/5-things-to-watch-in-go-programming-in-2017-39cd7a7e58e3#.8t4to5jr1
|
||||
|
||||
作者:[Susan Conant][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://medium.com/@sconant?source=footer_card
|
||||
[1]:https://golang.org/doc/go1.8#h2push
|
||||
[2]:https://golang.org/doc/go1.8#http_shutdown
|
||||
[3]:https://golang.org/doc/go1.8#plugin
|
||||
[4]:https://golang.org/doc/go1.8#gopath
|
||||
[5]:https://github.com/jorgebastida/gordon
|
||||
[6]:https://github.com/apex/apex
|
||||
[7]:http://gosparta.io/
|
||||
[8]:https://www.iron.io/
|
||||
[9]:https://github.com/golang/go/wiki/GoUsers
|
||||
[10]:https://twitter.com/SuConant
|
||||
[11]:https://golang.org/doc/go1.8
|
||||
[12]:https://www.safaribooksonline.com/live-training/courses/go-beyond-the-basics/0636920065357/
|
||||
[13]:https://www.oreilly.com/people/1ea0c-daniel-whitenack
|
||||
[14]:https://devfest.gdg.org.ru/en/
|
||||
[15]:https://medium.com/@rakyll/go-1-5-cross-compilation-488092ba44ec#.7s7sxmc4h
|
||||
[16]:https://golang.org/doc/go1.8#compiler
|
||||
[17]:http://shop.oreilly.com/category/learning-path/go-fundamentals.do
|
||||
[18]:https://github.com/go-interpreter
|
||||
[19]:http://shop.oreilly.com/product/0636920047513.do
|
||||
[20]:https://cloud.google.com/functions/docs/
|
||||
[21]:https://github.com/SerifAndSemaphore/go-serverless-list
|
||||
[22]:https://www.safaribooksonline.com/library/view/oreilly-software-architecture/9781491976142/video288473.html?utm_source=oreilly&utm_medium=newsite&utm_campaign=5-things-to-watch-in-go-programming-body-text-cta
|
||||
[23]:https://blog.gopheracademy.com/series/advent-2016/
|
||||
[24]:https://www.oreilly.com/ideas/data-science-gophers
|
||||
[25]:https://github.com/SerifAndSemaphore/go-serverless-list
|
@ -0,0 +1,79 @@
|
||||
如何更改 Linux I/O 调度器调整性能
|
||||
============================================================
|
||||
|
||||
为了从 Linux 服务器榨取尽可能多的性能,请了解如何更改 I/O 调度器以满足你的需求。
|
||||
|
||||
![](http://tr1.cbsistatic.com/hub/i/r/2016/05/04/f765c3c7-ee08-4f3a-876a-66137ad4e6df/resize/770x/131c6931386ecf37104e8ada8d01e903/hackershero.jpg)
|
||||
|
||||
Linux I/O 调度器(Linux I/O scheduler)控制内核提交读写请求给磁盘的方式。自从 2.6 内核以来,管理员已经能够更改这个调度器,所以他们可以自定义他们的平台以完全适合他们的需要。
|
||||
|
||||
有三个调度器可供选择,每个调度器都有其优点。这些调度器是:
|
||||
|
||||
* **[CFQ (Completely Fair Scheduler(完全公平调度器))][7](cfq)** :它是许多 Linux 发行版的默认调度器;它将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。
|
||||
* **[Noop 调度器][8](noop)** : 基于先入先出(FIFO)队列概念的 Linux 内核里最简单的 I/O 调度器。此调度程序最适合于 SSD。
|
||||
* **[截止时间调度器][9](deadline)** : 尝试保证请求的开始服务时间。
|
||||
|
||||
当你想要让 Linux 机器发挥最佳性能时,这可能是你所要做的事情之一。幸运的是,更改 I/O 调度器非常简单。让我告诉你怎么做。
|
||||
|
||||
### 找出你有的调度器
|
||||
|
||||
你需要做的第一件事是找出哪个调度器正在处理你系统上的 I/O。这是从命令行完成的,你必须知道磁盘的名称。为简单起见,我假设磁盘是 sda。据此信息,打开终端窗口并输入以下命令:
|
||||
|
||||
```
|
||||
cat /sys/block/sda/queue/scheduler
|
||||
```
|
||||
|
||||
该命令的结果将显示当前运行的调度程序(下图)。
|
||||
|
||||
![Figure A](http://tr3.cbsistatic.com/hub/i/2017/01/03/abba7f22-3252-4b76-91c0-bb15630fd42c/6b4a6d971202b70926b2d991e6c9afe3/schedulera.jpg)
|
||||
|
||||
*Elementary OS Loki 运行 deadline 调度器。*
|
||||
|
||||
### 更改你的调度器
|
||||
|
||||
你可以通过两种方式更改你的调度器:即时或永久。如果你即时更改调度器,它会在重启后恢复到之前的默认调度器。你可能希望首先进行即时更改,以查看哪个调度器能为你的需求带来最佳性能。
|
||||
|
||||
说到你要即时改到 noop 调度器。 为此,输入以下命令:
|
||||
|
||||
```
|
||||
sudo echo noop > /sys/block/hda/queue/scheduler
|
||||
```
|
||||
|
||||
你可以将 `noop` 更改为 `cfq` 或 `deadline`。
|
||||
|
||||
此更改可以在不重新启动计算机的情况下生效。 一旦更改,I/O 调度器将会切换,(希望)你能看到性能提高(再说一次,根据你的需要而定)。
|
||||
|
||||
如果要将调度器更改为永久,则必须在 GRUB 配置文件中执行此操作。 为此,请输入 `sudo nano /etc/default/grub`,然后修改下面的行:
|
||||
|
||||
```
|
||||
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
|
||||
```
|
||||
|
||||
到
|
||||
|
||||
```
|
||||
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=noop"
|
||||
```
|
||||
|
||||
同样,你可以改变 `noop` 为任何你需要的调度器。如果你用的是即时修改,则不必重新启动以使新调度器生效。
|
||||
|
||||
这些就是修改调度器的方法了。
|
||||
|
||||
### 做出明智的选择
|
||||
|
||||
你应该做研究,找出什么调度器最适合你的特殊情况。要了解每个调度器的更多信息,请查看这些 Wiki 页面:[CFS][7]、[Noop][8]和 [Deadline][9]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.techrepublic.com/article/how-to-change-the-linux-io-scheduler-to-fit-your-needs/
|
||||
|
||||
作者:[Jack Wallen][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.techrepublic.com/meet-the-team/us/jack-wallen/
|
||||
[7]:https://en.wikipedia.org/wiki/Completely_Fair_Scheduler
|
||||
[8]:https://en.wikipedia.org/wiki/Noop_scheduler
|
||||
[9]:https://en.wikipedia.org/wiki/Deadline_scheduler
|
@ -0,0 +1,157 @@
|
||||
OpenSSL 在 Apache 和 Dovecot 下的使用(一)
|
||||
============================================================
|
||||
|
||||
![OpenSSL](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/openssl.jpg?itok=RWoqdCAI "OpenSSL")
|
||||
|
||||
> 在这有两部分的系列中,Carla Schroder 会向你展示如何创建自己的 OpenSSL 证书以及如何配置 Apache 和 Dovecot 来使用它们。
|
||||
|
||||
这么长时间之后,我的读者们,这里是我给你们承诺的在 Apache 中使用 OpenSSL 的方法,下周你会看到在 Dovecot 中使用 SSL。 在这个分为两部分的系列中,我们将学习如何创建自己的 OpenSSL 证书,以及如何配置 Apache 和 Dovecot 来使用它们。
|
||||
|
||||
这些例子基于这些教程:
|
||||
|
||||
* [给初学者看的在 Ubuntu Linux 上使用 Apache][3]
|
||||
* [给初学者看的在 Ubuntu Linux 上使用 Apache:第 2 部分][4]
|
||||
* [给初学者看的在 CentOS Linux 上使用 Apache][5]
|
||||
|
||||
### 创建你的证书
|
||||
|
||||
Debian/Ubuntu/Mint 会在 `/etc/ssl` 中存储私钥和证书的符号链接。系统自带的证书保存在 `/usr/share/ca-certificates` 中。你安装或创建的证书在 `/usr/local/share/ca-certificates/` 中。
|
||||
|
||||
这个例子是对 Debian 而言。创建私钥和公用证书,将证书转换为正确的格式,并将其符号链接到正确的目录:
|
||||
|
||||
```
|
||||
$ sudo openssl req -x509 -days 365 -nodes -newkey rsa:2048 \
|
||||
-keyout /etc/ssl/private/test-com.key -out \
|
||||
/usr/local/share/ca-certificates/test-com.crt
|
||||
Generating a 2048 bit RSA private key
|
||||
.......+++
|
||||
......................................+++
|
||||
writing new private key to '/etc/ssl/private/test-com.key'
|
||||
-----
|
||||
You are about to be asked to enter information that will
|
||||
be incorporated into your certificate request.
|
||||
What you are about to enter is what is called a Distinguished
|
||||
Name or a DN. There are quite a few fields but you can leave some blank
|
||||
For some fields there will be a default value,
|
||||
If you enter '.', the field will be left blank.
|
||||
-----
|
||||
Country Name (2 letter code) [AU]:US
|
||||
State or Province Name (full name) [Some-State]:WA
|
||||
Locality Name (eg, city) []:Seattle
|
||||
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Alrac Writing Sweatshop
|
||||
Organizational Unit Name (eg, section) []:home dungeon
|
||||
Common Name (e.g. server FQDN or YOUR name) []:www.test.com
|
||||
Email Address []:admin@test.com
|
||||
|
||||
$ sudo update-ca-certificates
|
||||
Updating certificates in /etc/ssl/certs...
|
||||
1 added, 0 removed; done.
|
||||
Running hooks in /etc/ca-certificates/update.d...
|
||||
|
||||
Adding debian:test-com.pem
|
||||
done.
|
||||
done.
|
||||
```
|
||||
|
||||
CentOS/Fedora 使用不同的文件结构,并不使用 `update-ca-certificates`,使用这个命令:
|
||||
|
||||
```
|
||||
$ sudo openssl req -x509 -days 365 -nodes -newkey rsa:2048 \
|
||||
-keyout /etc/httpd/ssl/test-com.key -out \
|
||||
/etc/httpd/ssl/test-com.crt
|
||||
```
|
||||
|
||||
最重要的条目是 `Common Name`,它必须与你的完全限定域名(FQDN)完全匹配。此外其它信息都是任意的。`-nodes` 用于创建一个无密码的证书,这是 Apache 所必需的。`-days` 用于定义过期日期。更新证书是一个麻烦的事情,但这样应该能够额外提供一些安全保障。参见 [90 天证书有效期的利弊][10]中的讨论。
|
||||
|
||||
### 配置 Apache
|
||||
|
||||
现在配置 Apache 以使用你的新证书。如果你遵循[给初学者看的在 Ubuntu Linux 上使用 Apache:第 2 部分][11],你所要做的就是修改虚拟主机配置中的 `SSLCertificateFile` 和 `SSLCertificateKeyFile`,以指向你的新私钥和公共证书。来自该教程中的 `test.com` 示例现在看起来像这样:
|
||||
|
||||
```
|
||||
SSLCertificateFile /etc/ssl/certs/test-com.pem
|
||||
SSLCertificateKeyFile /etc/ssl/private/test-com.key
|
||||
```
|
||||
|
||||
CentOS 用户,请参阅在 CentOS wiki 中的[在 CentOS 上设置 SSL 加密的 Web 服务器][12]一文。过程是类似的,wiki 会告诉如何处理 SELinux。
|
||||
|
||||
### 测试 Apache SSL
|
||||
|
||||
一个简单的方法是用你的网络浏览器访问 https://yoursite.com,看看它是否可以正常工作。在第一次这样做时,你会在你过度保护的 web 浏览器中看到可怕的警告说网站是不安全的,因为它使用的是自签名证书。请忽略你这个敏感的浏览器,并单击屏幕创建永久性例外。 如果你遵循在[给初学者看的在 Ubuntu Linux 上使用 Apache:第 2 部分][14]上的示例虚拟主机配置,那么即使你的网站访问者尝试使用纯 HTTP,你的网站的所有流量都将强制通过 HTTPS。
|
||||
|
||||
一个很好测试方法是使用 OpenSSL。是的,有一个漂亮的命令来测试这些东西。试下这个:
|
||||
|
||||
```
|
||||
$ openssl s_client -connect www.test.com:443
|
||||
CONNECTED(00000003)
|
||||
depth=0 C = US, ST = WA, L = Seattle, O = Alrac Writing Sweatshop,
|
||||
OU = home dungeon, CN = www.test.com, emailAddress = admin@test.com
|
||||
verify return:1
|
||||
---
|
||||
Certificate chain
|
||||
0 s:/C=US/ST=WA/L=Seattle/O=Alrac Writing Sweatshop/OU=home
|
||||
dungeon/CN=www.test.com/emailAddress=admin@test.com
|
||||
i:/C=US/ST=WA/L=Seattle/O=Alrac Writing Sweatshop/OU=home
|
||||
dungeon/CN=www.test.com/emailAddress=admin@test.com
|
||||
---
|
||||
Server certificate
|
||||
-----BEGIN CERTIFICATE-----
|
||||
[...]
|
||||
```
|
||||
|
||||
这里输出了大量的信息。这里有很多关于 `openssl s_client` 的有趣信息; 现在足够我们知道我们的 web 服务器是否使用了正确的 SSL 证书。
|
||||
|
||||
### 创建一个证书签名请求
|
||||
|
||||
如果你决定使用第三方证书颁发机构(CA),那么就必须创建证书签名请求(CSR)。你将它发送给你的新 CA,他们将签署并将其发送给您。他们可能对创建你的 CSR 有自己的要求; 这是如何创建一个新的私钥和 CSR 的典型示例:
|
||||
|
||||
```
|
||||
$ openssl req -newkey rsa:2048 -nodes \
|
||||
-keyout yourdomain.key -out yourdomain.csr
|
||||
```
|
||||
|
||||
你也可以从一个已经存在的 key 中创建一个 CSR:
|
||||
|
||||
```
|
||||
$ openssl req -key yourdomain.key \
|
||||
-new -out domain.csr
|
||||
```
|
||||
|
||||
今天就是这样了。下周我们将[学习如何正确地在 Dovecot 中设置 OpenSSL][15]。
|
||||
|
||||
### 额外的教程
|
||||
|
||||
- [消灭让人害怕的 web 浏览器 SSL 警告][16]
|
||||
- [如何在 Linux 上使用 OpenVPN 设置安全远程网络:第一部分][17]
|
||||
- [如何在 Linux 上使用 OpenVPN 设置安全远程网络:第一部分][18]
|
||||
|
||||
提高你的系统管理职业生涯吧!查看Linux基金会的[系统管理的要点][8]课程。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/learn/sysadmin/openssl-apache-and-dovecot
|
||||
|
||||
作者:[CARLA SCHRODER][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/cschroder
|
||||
[1]:https://www.linux.com/licenses/category/creative-commons-zero
|
||||
[2]:https://www.linux.com/files/images/openssljpg
|
||||
[3]:https://www.linux.com/learn/apache-ubuntu-linux-beginners
|
||||
[4]:https://www.linux.com/learn/apache-ubuntu-linux-beginners-part-2
|
||||
[5]:https://www.linux.com/learn/apache-centos-linux-beginners
|
||||
[6]:https://training.linuxfoundation.org/linux-courses/system-administration-training/essentials-of-system-administration
|
||||
[7]:https://training.linuxfoundation.org/linux-courses/system-administration-training/essentials-of-system-administration
|
||||
[8]:https://training.linuxfoundation.org/linux-courses/system-administration-training/essentials-of-system-administration
|
||||
[9]:https://www.addtoany.com/share#url=https%3A%2F%2Fwww.linux.com%2Flearn%2Fsysadmin%2Fopenssl-apache-and-dovecot&title=OpenSSL%20For%20Apache%20and%20Dovecot%20
|
||||
[10]:https://community.letsencrypt.org/t/pros-and-cons-of-90-day-certificate-lifetimes/4621
|
||||
[11]:https://www.linux.com/learn/apache-ubuntu-linux-beginners-part-2
|
||||
[12]:https://wiki.centos.org/HowTos/Https
|
||||
[13]:https://yoursite.com/
|
||||
[14]:https://www.linux.com/learn/apache-ubuntu-linux-beginners-part-2
|
||||
[15]:https://www.linux.com/learn/intro-to-linux/openssl-apache-and-dovecot-part-2
|
||||
[16]:https://www.linux.com/learn/quieting-scary-web-browser-ssl-alerts
|
||||
[17]:https://www.linux.com/learn/how-set-secure-remote-networking-openvpn-linux-part-1
|
||||
[18]:https://www.linux.com/learn/how-set-secure-remote-networking-openvpn-linux-part-2
|
@ -0,0 +1,376 @@
|
||||
Linux 上 12 个高效的文本过滤命令
|
||||
============================================================
|
||||
|
||||
在这篇文章中,我们将会看一些 Linux 中的过滤器命令行工具。过滤器是一个程序,它从标准输入读取数据,在数据上执行操作,然后把结果写到标准输出。
|
||||
|
||||
因此,它可以用来以强大的方式处理信息,例如重新结构化输出以生成有用的报告,修改文件里面的文本,以及其他很多系统管理任务。
|
||||
|
||||
下面是 Linux 上的一些有用的文件或者文本过滤器。
|
||||
|
||||
### 1、 awk 命令
|
||||
|
||||
**awk** 是一个卓越的模式扫描和处理语言,它可被用于在 Linux 下构造有用的过滤器。你可以通过阅读我们的 [awk 系列 1 到 13 部分][7] 来开始使用它。
|
||||
|
||||
另外,也可以通过阅读 **awk** 的 man 手册来获取更多的信息和使用选项。
|
||||
|
||||
```
|
||||
$ man awk
|
||||
```
|
||||
|
||||
### 2、 sed 命令
|
||||
|
||||
**sed** 是一款过滤和转换文本的强大的流编辑器。我们已经写了两篇关于 sed 的有用的文章,你可以通过这儿来了解:
|
||||
|
||||
* [如何使用 GNU sed 命令在 Linux 下创建、编辑和处理文件][1]
|
||||
* [日常 Linux 系统管理员任务使用的 15 个有用的 sed 命令小贴士和技巧][2]
|
||||
|
||||
sed 的 man 手册已经添加控制选项和说明:
|
||||
|
||||
```
|
||||
$ man sed
|
||||
```
|
||||
|
||||
### 3、 grep、 egrep、 fgrep、 rgrep 命令行
|
||||
|
||||
这些过滤器输出匹配指定模式的行。它们从一个文件或者标准输入读取行,并且输出所有匹配的行,默认输出到标准输出。
|
||||
|
||||
**注意**:主程序是 [grep][8],这些变体与[使用特定的选项的 grep][9] 相同,如下所示(为了向后兼容性,它们依旧在使用):
|
||||
|
||||
```
|
||||
$ egrep = grep -E
|
||||
$ fgrep = grep -F
|
||||
$ rgrep = grep -r
|
||||
```
|
||||
|
||||
下面是一些基本的 grep 命令:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ grep "aaronkilik" /etc/passwd
|
||||
aaronkilik:x:1001:1001::/home/aaronkilik:
|
||||
tecmint@TecMint ~ $ cat /etc/passwd | grep "aronkilik"
|
||||
aaronkilik:x:1001:1001::/home/aaronkilik:
|
||||
```
|
||||
|
||||
在 [Linux 下的 grep、 egrep 和 fgrep 的差异?][10]中,你可以了解更多。
|
||||
|
||||
### 4、 head 命令
|
||||
|
||||
**head** 用于显示文件前面的部分,默认情况下它输出前 **10** 行。你可以使用 `-n` 标志来指定显示的行数:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ head /var/log/auth.log
|
||||
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
|
||||
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
|
||||
Jan 2 10:51:34 TecMint sudo: tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
|
||||
Jan 2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
|
||||
Jan 2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
|
||||
Jan 2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0)
|
||||
Jan 2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
|
||||
Jan 2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0)
|
||||
Jan 2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
|
||||
Jan 2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0)
|
||||
tecmint@TecMint ~ $ head -n 5 /var/log/auth.log
|
||||
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
|
||||
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
|
||||
Jan 2 10:51:34 TecMint sudo: tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
|
||||
Jan 2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
|
||||
Jan 2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
|
||||
```
|
||||
|
||||
学习如何 [使用带有 tail 和 cat 命令的 head 命令][11],以便在 Linux 下更有效的使用。
|
||||
|
||||
### 5、 tail 命令
|
||||
|
||||
**tail** 输出一个文件的后面的部分(默认 **10** 行)。使用 `-n` 选项来指定显示的行数。
|
||||
|
||||
下面的命令将会输出指定文件的最后 5 行:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ tail -n 5 /var/log/auth.log
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
|
||||
```
|
||||
|
||||
另外,**tail** 有一个特殊的选项 `-f` ,可以 [实时查看一个文件的变化][12] (尤其是日志文件)。
|
||||
|
||||
下面的命令将会使你能够监控指定文件的变化:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ tail -f /var/log/auth.log
|
||||
Jan 6 12:58:01 TecMint sshd[1269]: Server listening on :: port 22.
|
||||
Jan 6 12:58:11 TecMint sshd[1269]: Received SIGHUP; restarting.
|
||||
Jan 6 12:58:12 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
|
||||
Jan 6 12:58:12 TecMint sshd[1269]: Server listening on :: port 22.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
|
||||
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
|
||||
```
|
||||
|
||||
阅读 tail 的 man 手册,获取使用选项和说明的完整内容:
|
||||
|
||||
```
|
||||
$ man tail
|
||||
```
|
||||
|
||||
### 6、 sort 命令
|
||||
|
||||
**sort** 用于将文本文件或标准输入的行进行排序。
|
||||
|
||||
下面是一个名为 domain.list 的文件的内容:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ cat domains.list
|
||||
tecmint.com
|
||||
tecmint.com
|
||||
news.tecmint.com
|
||||
news.tecmint.com
|
||||
linuxsay.com
|
||||
linuxsay.com
|
||||
windowsmint.com
|
||||
windowsmint.com
|
||||
```
|
||||
|
||||
你可以像这样运行一个简单的 [sort 命令][13] 来排序文件内容:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ sort domains.list
|
||||
linuxsay.com
|
||||
linuxsay.com
|
||||
news.tecmint.com
|
||||
news.tecmint.com
|
||||
tecmint.com
|
||||
tecmint.com
|
||||
windowsmint.com
|
||||
windowsmint.com
|
||||
```
|
||||
|
||||
你可以有多种方式来使用 sort 命令,请参阅以下一些关于 sort 命令的有用的文章。
|
||||
|
||||
* [Linux 的 ‘sort’命令的14个有用的范例(一)][3]
|
||||
* [Linux 的 'sort'命令的七个有趣实例(二)][4]
|
||||
* [如何基于修改日期和时间来查找和排序文件][5]
|
||||
|
||||
### 7、 uniq 命令
|
||||
|
||||
**uniq** 命令用于报告或者忽略重复行,它从标准输入过滤行,并且把结果写到标准输出。
|
||||
|
||||
在对一个输入流运行 `sort` 之后,你可以使用 `uniq` 删除重复行,如下例所示。
|
||||
|
||||
为了显示行出现的数目,使用 `-c` 选项,要在对比时忽略大小写的差异,使用 `-i` 选项:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ cat domains.list
|
||||
tecmint.com
|
||||
tecmint.com
|
||||
news.tecmint.com
|
||||
news.tecmint.com
|
||||
linuxsay.com
|
||||
linuxsay.com
|
||||
windowsmint.com
|
||||
tecmint@TecMint ~ $ sort domains.list | uniq -c
|
||||
2 linuxsay.com
|
||||
2 news.tecmint.com
|
||||
2 tecmint.com
|
||||
1 windowsmint.com
|
||||
```
|
||||
|
||||
通过阅读 `uniq` 的 man 手册来获取进一步的使用信息和选项:
|
||||
|
||||
```
|
||||
$ man uniq
|
||||
```
|
||||
|
||||
### 8、 fmt 命令行
|
||||
|
||||
**fmt** 是一款简单的优化的文本格式化器,它重新格式化指定文件的段落,并且打印结果到标准输出。
|
||||
|
||||
以下是从文件 domain-list.txt 提取的内容:
|
||||
|
||||
```
|
||||
1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com
|
||||
```
|
||||
|
||||
为了把上面的内容重新格式化成一个标准的清单,运行下面的命令,使用 `-w` 选项定义最大行宽度:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ cat domain-list.txt
|
||||
1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com
|
||||
tecmint@TecMint ~ $ fmt -w 1 domain-list.txt
|
||||
1.tecmint.com
|
||||
2.news.tecmint.com
|
||||
3.linuxsay.com
|
||||
4.windowsmint.com
|
||||
```
|
||||
|
||||
### 9、 pr 命令
|
||||
|
||||
**pr** 命令转换文本文件或者标准输入之后打印出来。例如在 **Debian** 系统上,你可以像下面这样显示所有的安装包:
|
||||
|
||||
```
|
||||
$ dpkg -l
|
||||
```
|
||||
|
||||
为了将要打印的列表在页面和列中组织好,使用以下命令。
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ dpkg -l | pr --columns 3 -l 20
|
||||
2017-01-06 13:19 Page 1
|
||||
Desired=Unknown/Install ii adduser ii apg
|
||||
| Status=Not/Inst/Conf- ii adwaita-icon-theme ii app-install-data
|
||||
|/ Err?=(none)/Reinst-r ii adwaita-icon-theme- ii apparmor
|
||||
||/ Name ii alsa-base ii apt
|
||||
+++-=================== ii alsa-utils ii apt-clone
|
||||
ii accountsservice ii anacron ii apt-transport-https
|
||||
ii acl ii apache2 ii apt-utils
|
||||
ii acpi-support ii apache2-bin ii apt-xapian-index
|
||||
ii acpid ii apache2-data ii aptdaemon
|
||||
ii add-apt-key ii apache2-utils ii aptdaemon-data
|
||||
2017-01-06 13:19 Page 2
|
||||
ii aptitude ii avahi-daemon ii bind9-host
|
||||
ii aptitude-common ii avahi-utils ii binfmt-support
|
||||
ii apturl ii aview ii binutils
|
||||
ii apturl-common ii banshee ii bison
|
||||
ii archdetect-deb ii baobab ii blt
|
||||
ii aspell ii base-files ii blueberry
|
||||
ii aspell-en ii base-passwd ii bluetooth
|
||||
ii at-spi2-core ii bash ii bluez
|
||||
ii attr ii bash-completion ii bluez-cups
|
||||
ii avahi-autoipd ii bc ii bluez-obexd
|
||||
.....
|
||||
```
|
||||
|
||||
其中,使用的标志如下:
|
||||
|
||||
* `--column` 定义在输出中创建的列数。
|
||||
* `-l` 指定页面的长度(默认是 66 行)。
|
||||
|
||||
### 10、 tr 命令行
|
||||
|
||||
这个命令从标准输入转换或者删除字符,然后输出结果到标准输出。
|
||||
|
||||
使用 `tr` 的语法如下:
|
||||
|
||||
```
|
||||
$ tr options set1 set2
|
||||
```
|
||||
|
||||
看一下下面的例子,在第一个命令,`set1( [:upper:] )` 代表指定输入字符的大小写(都是大写字符)。
|
||||
`set2([:lower:])` 代表期望结果字符的大小写。第二个例子意思相似,转义字符 `\n` 表示在新的一行打印输出:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ echo "WWW.TECMINT.COM" | tr [:upper:] [:lower:]
|
||||
www.tecmint.com
|
||||
tecmint@TecMint ~ $ echo "news.tecmint.com" | tr [:lower:] [:upper:]
|
||||
NEWS.TECMINT.COM
|
||||
```
|
||||
|
||||
### 11、 more 命令
|
||||
|
||||
**more** 命令是一个有用的文件过滤器,最初为查看证书而建。它一页页显示文件内容,用户可以通过按回车来显示更多的信息。
|
||||
|
||||
你可以像这样使用它来显示大文件:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ dmesg | more
|
||||
[ 0.000000] Initializing cgroup subsys cpuset
|
||||
[ 0.000000] Initializing cgroup subsys cpu
|
||||
[ 0.000000] Initializing cgroup subsys cpuacct
|
||||
[ 0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
|
||||
4.4.6)
|
||||
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
|
||||
[ 0.000000] KERNEL supported cpus:
|
||||
[ 0.000000] Intel GenuineIntel
|
||||
[ 0.000000] AMD AuthenticAMD
|
||||
[ 0.000000] Centaur CentaurHauls
|
||||
[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
|
||||
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
|
||||
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
|
||||
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
|
||||
[ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
|
||||
[ 0.000000] x86/fpu: Using 'eager' FPU context switches.
|
||||
[ 0.000000] e820: BIOS-provided physical RAM map:
|
||||
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
|
||||
[ 0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
|
||||
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
|
||||
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
|
||||
[ 0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
|
||||
[ 0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
|
||||
--More--
|
||||
```
|
||||
|
||||
### 12、 less 命令
|
||||
|
||||
**less** 是和上面的 **more** 命令相反的一个命令,但是它提供了额外的特性,而且对于大文件,它会更快些。
|
||||
|
||||
按照 `more` 命令相同的方式使用它:
|
||||
|
||||
```
|
||||
tecmint@TecMint ~ $ dmesg | less
|
||||
[ 0.000000] Initializing cgroup subsys cpuset
|
||||
[ 0.000000] Initializing cgroup subsys cpu
|
||||
[ 0.000000] Initializing cgroup subsys cpuacct
|
||||
[ 0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
|
||||
4.4.6)
|
||||
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
|
||||
[ 0.000000] KERNEL supported cpus:
|
||||
[ 0.000000] Intel GenuineIntel
|
||||
[ 0.000000] AMD AuthenticAMD
|
||||
[ 0.000000] Centaur CentaurHauls
|
||||
[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
|
||||
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
|
||||
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
|
||||
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
|
||||
[ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
|
||||
[ 0.000000] x86/fpu: Using 'eager' FPU context switches.
|
||||
[ 0.000000] e820: BIOS-provided physical RAM map:
|
||||
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
|
||||
[ 0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
|
||||
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
|
||||
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
|
||||
[ 0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
|
||||
[ 0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
|
||||
:
|
||||
```
|
||||
|
||||
学习为什么 Linux 下进行有效的文件浏览, [‘less’ 比 ‘more’ 命令更快][14]。
|
||||
|
||||
基本上就这些了,如果你还知道其他本文没有提供的 Linux 下[有用的文本过滤命令行工具][15],可以在下面的评论部分通知我们。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:Aaron Kili 是一名 Linux 和 F.O.S.S 爱好者、一名未来的 Linux 系统管理员、web 开发者,并且目前是一名 TecMint 上的内容创造者,他喜欢计算机相关的工作,并且坚信知识的分享。
|
||||
|
||||
![](http://1.gravatar.com/avatar/4e444ab611c7b8c7bcb76e58d2e82ae0?s=128&d=blank&r=g)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/linux-file-operations-commands/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[yangmingming](https://github.com/yangmingming)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:https://linux.cn/article-7161-1.html
|
||||
[2]:http://www.tecmint.com/linux-sed-command-tips-tricks/
|
||||
[3]:https://linux.cn/article-5372-1.html
|
||||
[4]:https://linux.cn/article-5373-1.html
|
||||
[5]:http://www.tecmint.com/find-and-sort-files-modification-date-and-time-in-linux/
|
||||
[6]:http://how%20to%20sort%20output%20of%20%E2%80%98ls%E2%80%99%20command%20by%20last%20modified%20date%20and%20time/
|
||||
[7]:https://linux.cn/article-7586-1.html
|
||||
[8]:http://www.tecmint.com/12-practical-examples-of-linux-grep-command/
|
||||
[9]:http://www.tecmint.com/linux-grep-commands-character-classes-bracket-expressions/
|
||||
[10]:http://www.tecmint.com/difference-between-grep-egrep-and-fgrep-in-linux/
|
||||
[11]:http://www.tecmint.com/view-contents-of-file-in-linux/
|
||||
[12]:http://www.tecmint.com/fswatch-monitors-files-and-directory-changes-modifications-in-linux/
|
||||
[13]:http://www.tecmint.com/sort-command-linux/
|
||||
[14]:http://www.tecmint.com/linux-more-command-and-less-command-examples/
|
||||
[15]:http://www.tecmint.com/tag/linux-tricks/
|
@ -0,0 +1,76 @@
|
||||
用 Pi-hole 和 Orange Pi 阻止家中所有设备上的广告
|
||||
============================================================
|
||||
|
||||
你是否很恼火地发现你的浏览器、智能手机和平板上不装广告拦截器不行? 至少我是这样的。我家里有一些“智能”设备,但是它们似乎没有任何类型的广告拦截软件。 好了,我了解到 [Pi-hole][2] 是一个可以运行在树莓派板子上的广告拦截软件,它能在各种广告到达你的设备之前拦截它们。它允许你将任何域加入到黑名单或白名单,并且它有一个很好的仪表盘面板,可以让你深入了解你的家庭网络最常访问的域/网站、最活跃的设备和最常见的广告商。
|
||||
|
||||
Pi-hole 原本是运行在树莓派上的,但我想知道它能否在我运行 Armbian Linux 的廉价 Orange Pi 上运行。 好吧,它绝对可以!下面是我让 Pi-hole 能快速运行的方法。
|
||||
|
||||
### 安装 Pi-hole
|
||||
|
||||
安装 Pi-hole 是使用终端完成的,所以打开你的 Orange Pi 桌面上的终端或使用 ssh 连接。
|
||||
|
||||
因为需要下载软件,所以进入到一个你选定的目录,确保你有写入权限。像这样:
|
||||
|
||||
```
|
||||
cd <your preferred directory>/
|
||||
```
|
||||
|
||||
我没有选择 Pi-hole 主页上的“单条命令”安装方式。 我的意思是,他们在那条命令下面写着“用管道到 bash 可能是危险的”,本地安装“更安全”。所以,这里是我的本地安装步骤:
|
||||
|
||||
```
|
||||
git clone --depth 1 https://github.com/pi-hole/pi-hole.git Pi-hole
|
||||
cd Pi-hole/automated\ install/
|
||||
./basic-install.sh
|
||||
```
|
||||
|
||||
如果你没有以 root 用户身份登录,那么这个安装脚本将提示你输入密码,然后再继续。 如果需要,脚本将下载并安装一些必备的 Linux 软件包。接着它会显示一个红蓝界面,提示你回答有关如何配置 Pi-hole 的几个问题。以我的经验,直接接受默认值就可以了,我后来发现 Pi-hole 的 web 应用可以让你更改设置,比如 DNS 提供商。
|
||||
|
||||
该脚本将告诉你在图形界面和终端中 Pi-hole 的密码。 请记住该密码!
|
||||
|
||||
脚本还会告诉你 Pi-hole 的网址,应该像这样:
|
||||
|
||||
```
|
||||
http://<your pi’s IP address>/admin
|
||||
```
|
||||
|
||||
或者类似这样:
|
||||
|
||||
```
|
||||
http://orangepipc/admin
|
||||
```
|
||||
|
||||
输入 Pi-hole 密码,接着你会看到像下面这样的漂亮的仪表盘面板:
|
||||
|
||||
![Ph-hole](https://i1.wp.com/piboards.com/wp-content/uploads/2017/01/ph-hole.png?resize=640%2C532)
|
||||
|
||||
请记住更改家庭网络路由器上的 DNS 设置并使用你的 Orange Pi 的地址。 否则,广告不会被过滤!
|
||||
|
||||
上面的说明与 Pi-hole 网站提供的替代“安全”方法大致相同,尽管 Armbian 没有被列为官方支持的操作系统。我相信这些说明应该在树莓派或其他运行某种形式的基于 Debian 的 Linux 操作系统的 Pi 上工作。但是,我并没有测试这一点,所以期待听到你的经验(请给我留下简短的评论)。
|
||||
|
||||
### 思考和观察
|
||||
|
||||
运行 Pi-hole 一段时间,并研究了在 Pi-hole 面板上出现的信息后,我发现有很多我不知道的网络活动在进行,而它们并不都是我批准的活动。例如,有一些我不知道的关于游戏程序的“有趣”连接从我的孩子的设备上发出,还有社交网络程序显然一直在给我发送骚扰数据。总之,无论是否是无害流量,我很高兴减少了流量负载,即使仅减少了一点点……我的意思是,为什么我应该允许我不想要的或者不关心的应用程序和广告吃掉我的网络流量?好吧,现在他们被封锁了。
|
||||
|
||||
像这样为 Orange Pi 设置广告屏蔽很便宜、容易,限制一些不必要的流量在我的家庭网络中进出(特别是与孩子们相关的)使我感到放松多了。如果有兴趣,你可以看看我的上一篇文章,如何[轻松设置一个 Orange Pi][3],并使用下面的链接来查看 Orange Pi 是多么便宜。我相信这是一个值得的投资。
|
||||
|
||||
- Amazon 上的 Orange Pi (受益链接): [Orange Pi PC Single Board Computer Quad Core ARM Cortex-A7 1GB DDR3 4K Decode][4]
|
||||
- [AliExpress 上的 Orange Pi 商店][5] (受益链接)
|
||||
|
||||
更新:具有讽刺意味的是,如果你成功地按照这篇文章设置了 Pi-hole,这个站点上(s.click.aliexpress.com)的受益链接会被屏蔽,是否将它加入到白名单取决于你。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://piboards.com/2017/01/07/block-ads-on-all-your-devices-at-home-with-pi-hole-and-an-orange-pi/
|
||||
|
||||
作者:[MIKE WILMOTH][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://piboards.com/author/piguy/
|
||||
[1]:http://s.click.aliexpress.com/deep_link.htm?aff_short_key=N3VJQBY&dl_target_url=http://best.aliexpress.com
|
||||
[2]:https://pi-hole.net/
|
||||
[3]:http://piboards.com/2017/01/04/easy-set-up-orange-pi/
|
||||
[4]:https://www.amazon.com/gp/product/B018W6OTIM/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B018W6OTIM&linkCode=as2&tag=piboards-20&linkId=ac292a536d58eabf1ee73e2c575e1111
|
||||
[5]:http://s.click.aliexpress.com/e/bAMVj2R
|
@ -0,0 +1,38 @@
|
||||
小技巧:检查你本地及公共 IP 地址
|
||||
===================
|
||||
|
||||
**你本地的 IP 地址:** **192.168.1.100**
|
||||
|
||||
上面是分配给你计算机上的内部硬件或虚拟网卡的本地/私有 IP 地址。根据你的 LAN 配置,上述 IP 地址可能是静态或动态的。
|
||||
|
||||
**如果你找不到上述任何地址,请在 Linux 上执行 `ifconfig` 或 `ip` 命令手动检查内部 IP 地址:**
|
||||
|
||||
```
|
||||
# ifconfig | grep -w inet | awk '{ print $2}'
|
||||
或者
|
||||
# ip a s | grep -w inet | awk '{ print $2}'
|
||||
```
|
||||
|
||||
**你公共的 IP 地址是:** **123.115.72.251**
|
||||
|
||||
上述地址是你的 Internet 服务提供商(ISP)为你分配的公共/外部 IP 地址。根据你与 ISP 的计划,它可能是动态的,这意味着它会在每次重启路由器后改变,它也可能是静态的,这意味着它将永远不会改变。
|
||||
|
||||
**如果你找不到上述任何地址,请在 Linux上 执行 `wget` 或 `curl` 命令手动检查你的公共IP地址:**
|
||||
|
||||
```
|
||||
# echo $(wget -qO - https://api.ipify.org)
|
||||
或者
|
||||
# echo $(curl -s https://api.ipify.org)
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://linuxconfig.org/check-your-local-and-public-ip-address
|
||||
|
||||
作者:[Lubos Rendek][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://linuxconfig.org/check-your-local-and-public-ip-address
|
@ -0,0 +1,88 @@
|
||||
4 个开源的可自行托管的 Trello 替代品
|
||||
============================================================
|
||||
|
||||
Trello 是一个可视的团队协作平台,最近被 Atlassian 收购了,这里我说的_最近_的意思是 2017 年 1 月 9 日,星期一。
|
||||
|
||||
我作为 DigitalOcean 社区作者的董事会成员之一,一直在使用 Trello ,并在几天前开始使用它来管理一个非营利组织的小团队项目。这是一个很好的软件,任何团队,包括那些并不 geek 的成员,都能舒适地使用它。
|
||||
|
||||
如果你喜欢 [Trello][6],但现在想要一个类似的软件,你可以自己托管,运行在自己的服务器上,我发现了四个你可以选择的工具。记住,我没有在我自己的服务器上安装其中任何一个,但从我收集的关于它们的信息上来看,我最可能使用的是 Kanboard 和 Restyaboard。
|
||||
|
||||
这是因为它们的安装要求很常见的。它们的安装过程也比较简单。Restyaboard 似乎有一个更好的 UI,所以它可能是我的第一个选择,虽然其中的一个要求(Elasticsearch)让我认为它对服务器的要求将比其它的更多。不管怎样,我会很快发布尝试自己托管 Kanboard 和 Restyaboard 的文章,所以请经常回来看看。
|
||||
|
||||
在那之前,我发现的替代 Trello 的前四个选择是:
|
||||
|
||||
### Kanboard
|
||||
|
||||
除了自由且开源,看板功能还提供与第三方工具和服务(如 Amazon S3 Storage、Hipchat、Jabber、RabbitMQ、Slack 等)的集成。Kanboard 可以安装在微软操作系统上,但要需要安装在自由开源组件之上,你需要以下内容:
|
||||
|
||||
* PHP >= 5.3.9
|
||||
* MariaDB/MySQL、Postgres 或者 Sqlite
|
||||
* Apache 或者 Nginx
|
||||
* CentOS 6/7、 Debian 8、 FreeBSD 10 或者 Ubuntu 14.04/16.04
|
||||
|
||||
从对项目的一个非常粗略的评估,UI 似乎不如本文中提到的其他工具靓丽。 如果改变主意不想自己托管,有一个有管理的或托管的 Kanboard 可供你注册。该项目的 GitHub 页面在 [https://github.com/kanboard/kanboard][8]。
|
||||
|
||||
![kanboard interface](http://linuxbsdos.com/wp-content/uploads/2017/01/kanboard-700x312.png "kanboard interface")
|
||||
|
||||
### Restyaboard
|
||||
|
||||
有靓丽的用户界面和从 Trello 导入数据的能力,Restyaboard 是一个非常有吸引力的 Trello 替代品。安装要求似乎也不高;在你的服务器上安装 Restyaboard 你需要以下内容:
|
||||
|
||||
* PHP-FPM
|
||||
* Postgres
|
||||
* Nginx
|
||||
* Elasticsearch
|
||||
|
||||
需求不多,而且有个脚本可在你的服务器上安装所有需要的组件,这使安装变得更简单。还有一个 AMI 可以用于在 Amazon AWS 上安装。对于 Docker 的粉丝,有一个非官方的 Docker 镜像可以用来运行 Restyaboard 容器。我不鼓励使用非官方 Docker 镜像运行 Docker 容器,但如果你想要试试,那会是一个选择。 项目的详细信息的 [GitHub page][9]。
|
||||
|
||||
![Restyaboard project management software](http://linuxbsdos.com/wp-content/uploads/2017/01/restyaboard-646x460.png "Restyaboard project management software")
|
||||
|
||||
### Taiga
|
||||
|
||||
部署好的 Taiga 由三个组件组成 - taiga-back(后端/ api)、taiga-front-dist(前端)、taiga-events - 每个都有自己的要求。一般来说,在你的服务器上安装 Taiga 你需要以下这些:
|
||||
|
||||
* Python >= 3.4
|
||||
* PostgreSQL >= 9.3
|
||||
* RabbitMQ(可选项,看是否需要异步提醒)
|
||||
* gcc 和开发头文件
|
||||
* Ruby >= 2.1 (仅用于编译 sass)
|
||||
* NodeJS >= 5.0 (npm、 gulp 和 bower 用于下载依赖和编译 coffeescript)
|
||||
|
||||
安装要求似乎比其它的多一点,所以如果这是一个问题,有一个托管平台可以免费使用。该托管平台上的额外功能是收费的。有关详细信息,请访问项目的 [GitHub页面][1]。
|
||||
|
||||
![Taiga project management software](http://linuxbsdos.com/wp-content/uploads/2017/01/Taiga-700x440.jpg "Taiga project management software")
|
||||
|
||||
### Wekan
|
||||
|
||||
Wekan 是用 Meteor 构建的,这是一个用于构建 web 应用程序的 JavaScript 框架,托管在 [https://github.com/wekan/wekan][2]。 该项目提供了在 Heroku、Sandstorm 的一键安装,以及经过验证的 Docker 镜像上,以便在 Docker 容器上运行它。它也可以安装在 Scalingo、IndieHosters 和 Cloudron,但我找不到部署在其他如 [Vultr][3] 和 [DigitalOcean][4] 的云托管提供商上的安装说明。
|
||||
|
||||
所以看来,你安装 Wekan 最简单的方式是使用一个支持的云托管平台。
|
||||
|
||||
![Wekan project management software](http://linuxbsdos.com/wp-content/uploads/2017/01/Wekan-700x363.jpeg "Wekan project management software")
|
||||
|
||||
如我之前承诺的,请稍后回来看看我发布的如何在你的服务器上安装 Kanboard 和 Restyaboard 指南。
|
||||
|
||||
### 更新
|
||||
|
||||
刚发布这篇文章,我就发现了 [Tuleap][5]。它似乎非常精美,但生产环境安装只支持 CentOS 6 和 Red Hat 6。支持使用 Docker 的容器化安装,但不推荐用于生产。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://linuxbsdos.com/2017/01/09/4-open-source-alternatives-to-trello-that-you-can-self-host/
|
||||
|
||||
作者:[linuxbsdos.com][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://linuxbsdos.com
|
||||
[1]:https://github.com/taigaio/
|
||||
[2]:https://github.com/wekan/wekan
|
||||
[3]:http://www.vultr.com/?ref=6827794
|
||||
[4]:https://www.digitalocean.com/?refcode=900fe177d075
|
||||
[5]:https://www.tuleap.org/
|
||||
[6]:https://trello.com/
|
||||
[8]:https://github.com/kanboard/kanboard
|
||||
[9]:https://github.com/RestyaPlatform/board
|
||||
|
@ -0,0 +1,148 @@
|
||||
如何成为一名开源程序员
|
||||
============================================================
|
||||
|
||||
![How to get started as an open source programmer](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/programming_keys.jpg?itok=_VDcN66X "How to get started as an open source programmer")
|
||||
|
||||
图片来源 : Zagrev [Flickr 网站][1] [CC BY-SA 2.0][2]。
|
||||
|
||||
科技世界的探索总是让我们兴奋不已。很多科技日新月异,你探索得越深远,你看到的世界就越广阔无穷,这就像是[一只驼一只的海龟][3]一样。因此,科技世界也像宇宙一样无穷无尽。如果你也渴望加入到推动技术世界发展的社区中,你应该如何开始呢?你要做的第一步是什么?以后应该怎么做?
|
||||
|
||||
首先,你得明白开源指的是开放软件源代码的意思。这个很好理解,但是“开源”这个词最近一段时间经常出现在我们身边,所以估计有时候大家都忘记了开源只是用来形容一种文化现象,而不是一家世界 500 强公司的名字。跟其它公司或组织不同的是,你不用去参加面试或填个申请表、注册表的方式来成为一名开源程序员。你需要做的就是**编程**,然后把代码共享出来,并且完全保证在任何情况下该代码都保持开放状态。
|
||||
|
||||
只需要这样,你就已经成为一名开源程序员了!
|
||||
|
||||
现在你有了目标,那么你为之奋斗的基础能力怎么样了?
|
||||
|
||||
### 技能树
|
||||
|
||||
你玩过 RPG 游戏吗?在那些游戏中就有关于线性“技能树”的概念。当你玩游戏时,你掌握了基本技能后,便会“升级”,并且获得新的技能,然后你使用这些新的技能再次“升级”到一个更高的等级,你又会得到更多新的技能。通过这样不断的升级,获取新技能,以让你的游戏角色变得更强大。
|
||||
|
||||
成为一个程序员有点像提升你的技能树等级。你掌握了一些基础的技术,在参与开源项目开发的过程中,你不断实践,直至自己的技术等级上升到一个新的层次,之后你又懂了一些新的技术,并在项目开发过程中不断实践,不断提升技术等级,然后你再沿着这个技能树不断成长,不断进步。
|
||||
|
||||
你会发现自己面临的不只一棵技能树。开源软件涉及到的技术比较多,包括很多参与者自身的优势、能力及兴趣爱好等。然而,有一些非常重要的技能有助于你成为一名伟大的程序员,不断的提高这些技能是成功参与到开源项目中的重要组成部分。
|
||||
|
||||
### 脚本编程
|
||||
|
||||
![Scroll--How to program ](https://opensource.com/sites/default/files/scroll.png "Scroll--How to program")
|
||||
|
||||
对于像 Linux 或 BSD 系统这样的 POSIX 系统而言,最大的优势之一就是在你每次使用电脑的过程中,你都有机会练习编程。如果你不知道如何开始编程,你可以从解决工作中的一些基本问题做起。想想你日常工作中有哪些重复性的工作,你可以通过编写脚本的方式来让它们自动执行。这一步非常简单,比如说批量转换文件格式或重置图片的大小、检查邮件,甚至是通过单击运行你最常用的五个应用程序。无论是什么任务,你可以花一些时间去编写脚本以让它们自动完成。
|
||||
|
||||
如果有些工作需要在控制终端下操作,那么你就可以编写脚本来完成。学习 bash 或 tsch 编程,把编写系统脚本作为你写代码和理解系统的工作原理的第一步。
|
||||
|
||||
### 系统管理
|
||||
|
||||
![Caesar head](https://opensource.com/sites/default/files/caesar_0.png "Caesar head")
|
||||
|
||||
从这一点来讲,你也可以转变成一个程序员,也可以整个跳到另外一个不同的技能树上:那就是系统管理工作。跟程序员比起来,这两个职业在技能上有一些相似(一个优秀的系统管理员应该有一些编程经验,并能够熟练使用 Python、Perl,或者其它类似的编程言语来解决一些独特的问题),而_程序员_指的是那些一直编写代码的人。
|
||||
|
||||
### 程序员
|
||||
|
||||
![Wizard hat--How to program](https://opensource.com/sites/default/files/pointy-hat.png "Wizard hat--How to program")
|
||||
|
||||
开源是学习编程技巧最好的方式:你可以查看其他人写的代码,从中借鉴他们的想法和技术,从他们的错误中学习,并跟自己写的代码进行对比以发现两者的优缺点;如果你是使用 Linux 或 BSD 操作系统,**整个**环境对你来说都是开放的,目之所及,随心所欲。
|
||||
|
||||
这就像旅游指南里所说的,随意行去。事实上你不大会去深入到一个项目的源代码中,但是如果这样的话,可以让你在某一时刻突然意识到自己会编程了。编程是一份很难的技术活,否则大家都可以从事编程工作了。
|
||||
|
||||
幸运的是,编程是有逻辑而结构化的,这些特性跟编程语言相关。你也许不会深入的去研究编程,但是你研究得越深,你懂的越多。
|
||||
|
||||
懂得如何控制以及让电脑自动执行任务是一回事,但是知道如何编写其它人想自动实现任务的代码,才能说明你已经真正进入到编程领域了。
|
||||
|
||||
### 精通多种编程语言
|
||||
|
||||
![Parrot--How to Program](https://opensource.com/sites/default/files/parrot-head.png "Parrot--How to Program")
|
||||
|
||||
所有的编程语言都旨在处理相同的任务:让计算机能够完成计算工作。选择一种编程语言时你得考虑以下几个因素,学编程的目的是什么,你所做的工作最常用的编程语言是什么,你最容易理解哪一种编程语言以及你的学习方式。
|
||||
|
||||
随便查下相关资料,你就可以了解编程语言的复杂性了,然后再根据自己的能力水平来决定先学习哪种编程语言。
|
||||
|
||||
选择编程语言的另一个方式是根据你的使用目的来决定,看看你身边的同事使用哪种编程语言。如果你是为了开发桌面环境的工具,你应该学习 C 语言和 Vala 语言,或者 C++ 语言。
|
||||
|
||||
总之,不要在各种编程语言之间不知所措。编程语言之间都是相通的。当你学好一种编程语言并能用它来解决工作中的一些实际问题的时候,你会发现学习另外一种编程语言更容易。毕竟,编程语言只是一些语法和相关规则的集合;学会一种编程语言后,再使用同样的方法去搞懂另外一种语言完全不是个事。
|
||||
|
||||
主要目的还是学会一种编程语言。选择一个比较适合自己或者你感兴趣的编程语言,或者是你的朋友在用的编程语言,或者是选择文档比较丰富,并且你理解起来也容易的编程语言,但是,最好是只关注并先学会其中的一种编程语言。
|
||||
|
||||
### 这是一个开源项目吗?
|
||||
|
||||
无论你是编程新手还是一个老司机,在你进入到开源新世界之前,你需要搞明白做开源软件的重要一点就是“开放源代码”。
|
||||
|
||||
最近一些厂商惯用的市场营销策略就是宣称他们的软件是开源的。然而,有些厂商只是发布了一个公共的 API 或者表示他们愿意接受其它开源用户提交的代码而已。“开源”这个词不是一个商标,并且也没有任何组织来决定怎么使用这个词。但是, Debian Linux 创造人 Ian Murdock 联合成立的[开放源代码促进会(Open Source Initiative)][4]对开源这个词进行了[定义][5](授权“允许软件被用户自由地使用、随意修改及分享”),并且被正式批准和[授予][6]许可证的软件才属于真正的开源软件。
|
||||
|
||||
给你的软件代码应用一个开源许可证,你就成为一名开源程序员了。恭喜你!
|
||||
|
||||
### 开源社区
|
||||
|
||||
![Community--How to program](https://opensource.com/sites/default/files/minions.png "Community--How to program")
|
||||
|
||||
咨询任何开源软件爱好者,他们会告诉你开源软件最关键的是人。没有积极的开源贡献者,软件开发就会中止。计算机需要用户、提交缺陷的人、设计师及程序员。
|
||||
|
||||
如果你想加入全球开源社区为开源软件做贡献,你同样需要成为该社区的一个成员,即使你并不善于社交也不要紧。这通常包括订阅邮件列表、加入 IRC 频道,或者在论坛里表现活跃,从最低级别开始。任何成熟的开源社区都已经存在了足够长的时间,见惯了来来往往的人们,所以,在你真正融入这个世界、在他们接纳你之前,你需要证明出你并非流星一逝般的过客,如果你想要做成一件大事,那就得有长期投身于其中的打算。
|
||||
|
||||
如果你只是想给他们提供一些小的帮助,这也是可以接受的。我自己也提交一些小的补丁到一些项目中,有时候项目管理者会觉得这个更新比较好,有时候他们也会拒绝我提交的代码补丁。但是,如果这个被拒绝的补丁对我很重要,我就会为我自己和客户维护它,并一直维护下去。
|
||||
|
||||
这就是参与到开源项目。
|
||||
|
||||
但是这些社区在哪里呢?这个跟开源项目有关。有些项目有专职的社区管理员,他们会把所有的社区参与者招集到一个打大家都能访问的地方。有些项目则围绕论坛运行,他们使用邮件列表,或者使用问题追踪器与参与者联系。找到这些开源社区对你来说也不是个事儿。
|
||||
|
||||
还有个重要的事情就是研究他们的源代码。“开源”就是开放“源代码”,所以你可以把他们的代码拿来瞅瞅。尽管要全面了解他们的项目可能超乎你的能力,但是你可以知道这个项目是如何管理的,他们最可能需要帮助的是什么。关于代码是如何组织的?这些代码有注释吗?它们使用统一的程序风格吗?这些问题你可以查阅相关文档,尤其是 README、 LICENSE ,或者是 COPYING 这几个文件。
|
||||
|
||||
不要低估遵守开放源代码承诺的重要性。这是你被允许参与进来到开源项目来的原因,因此,你得深入地考虑下你能从中学习到什么,以及你将如何为该项目提供帮助。
|
||||
|
||||
找到最佳的开源社区更像是约妹子,尤其是更像在[《偷天情缘》][7]里的约会。这需要时间,并且刚开始那几次有可能会失败。你参与这样的聚会越多,你就越了解这些开源项目。最后,你会更了解自己,当你找到了与其它参与者融为一体的方式时,你就已经成功了。总之,你得要有耐心,一切顺其自然。
|
||||
|
||||
### 行动比语言更重要
|
||||
|
||||
![Wingfoot--How to Program](https://opensource.com/sites/default/files/wingfoot.png "Wingfoot--How to Program")
|
||||
|
||||
作为一名开源程序员最重要的是写代码(开源中的“源”),任何想法都没多少意义。关键是把你的想法变成实际的东西。你要让大家都知道你在做什么、知道你不怕苦不怕累,也愿意在开源项目上花时间,并且能够通过编程的方式来实现自己的各种想法。
|
||||
|
||||
为了更高效地完成那些工作,你需要对开源项目做做功课,包括项目怎么样才能听取你的建议、哪个分支是稳定的哪个是开发的等等。
|
||||
|
||||
从下面几点开始:
|
||||
|
||||
* 熟悉一个项目及其协作开发的氛围,并且接受这种氛围。
|
||||
* 编写软件升级包、缺陷修复包,或者一些小的功能需求,并且提交它们。
|
||||
* 如果你提交的补丁被拒绝了,也不要难过。他们拒绝的不是你个人,而是开发小组在针对你提交的代码进行评估后作出的一个反馈。
|
||||
* 如果你提交的代码被改得面目全非后才被接受也不要泄气。
|
||||
* 从头再来,不断努力,再接受更大的挑战。
|
||||
|
||||
![Leaderboard--How to program](https://opensource.com/sites/default/files/leaderboard.png "Leaderboard--How to program")
|
||||
|
||||
在开源项目中不应该开设排行榜。然而,有些开源社区却弄了个贡献排名,其实这没必要。大家只需要积极参与、奉献,贡献你的才智、提交你的代码,这样就可以了。
|
||||
|
||||
### 开发软件
|
||||
|
||||
![Treasure Map--How to Program](https://opensource.com/sites/default/files/treasure-map.png "Treasure Map--How to Program")
|
||||
|
||||
编程不管在那种情况下都关乎于你自身的发展。无论你是否为了寻找解决问题的新方法,寻找优化代码的方式,学习新的编程语言,或者是学习如何更好的与其它人员合作,你都不会停止成长。你自己成长得越多,对开源项目越有帮助。
|
||||
|
||||
个人成长和职业技能的提升是你参与开源项目的终极目标,但是实际上这是一个贯穿整个项目的持续过程。成为一个开源程序员跟得到一份公务员工作不同;这是一个持之以恒的过程。学习、分享、再学习,或许你会去编写一个[“康威生命游戏”][8],然后你会学到越来越多。
|
||||
|
||||
这就是开源的过程:自由地开发,每一行代码。因此,发现你的技能树,激发潜能,付出努力,不断提高自己的技能,并最终参与其中。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/penguinmedallion200x200.png?itok=ROQSR50J)
|
||||
|
||||
Seth Kenlon —— Seth Kenlon 是一位独立多媒体艺术家,开源文化倡导者, Unix 极客。他还是 Slackware 多媒体产品项目的维护人员之一,官网:http://slackermedia.ml 。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/how-get-started-open-source-programmer
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[Bestony](https://github.com/Bestony), [wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/seth
|
||||
[1]:https://www.flickr.com/photos/zagrev/79470567/in/photolist-82iQc-pijuye-9CmY3Z-c1EJAf-4Y65Zt-dhLziB-51QVc-hjqkN-4rNTuC-5Mbvqi-5MfK13-7dh6AW-2fiSu7-48R7et-5sC5ck-qf1TE9-48R6qv-pXuSG9-KFBLJ-95jQ8U-jBR7-dhLpfV-5bCZVH-9vsPTT-bA2nvP-bn7cWw-d7j8q-ubap-pij32X-7WT6iw-dcZZm2-3knisv-4dgN2f-bc6V1-E9xar-EovvU-6T71Mg-pi5zwE-5SR26m-dPKXrn-HFyzb-3aJF9W-7Rvz19-zbewj-xMsv-7MFi3u-2mVokJ-nsVAx-7g5k-4jCbbP
|
||||
[2]:https://creativecommons.org/licenses/by-nc-sa/2.0/
|
||||
[3]:https://en.wikipedia.org/wiki/Turtles_all_the_way_down
|
||||
[4]:http://opensource.org/
|
||||
[5]:https://opensource.org/licenses
|
||||
[6]:https://opensource.org/licenses/category
|
||||
[7]:https://en.wikipedia.org/wiki/Groundhog_Day_(film)
|
||||
[8]:https://en.wikipedia.org/wiki/Conway's_Game_of_Life
|
@ -0,0 +1,69 @@
|
||||
故障排除提示:5 个最常见的 Linux 问题
|
||||
============================================================
|
||||
|
||||
> 了解如何解决Linux桌面用户遇到的最常见的问题
|
||||
|
||||
![5个linux最常见问题解决提示](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/rh_003601_05_mech_osyearbook2016_containers_cc.png?itok=0ZEfXLEE "Troubleshooting tips for the 5 most common Linux issues")
|
||||
|
||||
图片:Opensource.com
|
||||
|
||||
尽管绝大多数用户如预期地成功安装和操作了 Linux, 但不可避免地仍会有一些用户遇到问题。作为今年任务队列里的最后一篇文章,我认为在即将进入 2016 年时,总结一下人们所遇到的最常见的技术性的 Linux 问题会很有趣。我把这个问题发布到了 LinuxQuestions.org(LQ) 和社交媒体,我分析了 LQ 的帖子情况之后,得到如下成果。
|
||||
|
||||
### 1、 Wifi 驱动程序(特别是 Broadcom 芯片)
|
||||
|
||||
一般来说,Wifi 驱动程序,特别是 Broadcom 无线网卡,仍然是 Linux 面临的最大的问题技术问题之一。在 LQ 上,2016 年有数以百计的帖子在讨论这个话题,而且还有其他无数的地方也是。市场上有数十种 Broadcom 无线网卡可供使用,但为每一个发行版描述具体的排错细节来已经超出了一篇文章的范畴,但是基本的故障排除步骤是相同的:
|
||||
|
||||
* 通过使用 `lspci` 命令确定具体使用的 Broadcom 卡,以找出 PCI ID,
|
||||
* 确定使用发行版是否支持该卡,
|
||||
* 如果支持,找到正确的方法来使网卡工作。
|
||||
|
||||
例如,如果有一个 `14e4:4315` PCI ID 的卡,并且系统为 Ubuntu,则应该知道 BCM4312 卡可以通过安装 `firmware-b43-installer` 包来驱动。另一个选择是在购买之前,研究好可用的 WiFi 卡,以确保您的发行版完全支持它。
|
||||
|
||||
### 2、 打印机驱动程序(特别是佳能和 Lexmark)
|
||||
|
||||
打印机也是常有问题的,佳能和 Lexmark 被反复提及遇到这种问题。如果您要购买一台新打印机,请在购买之前研究兼容性。但是,如果您从其他操作系统迁移,这可能没得选择。如果你正在做调研,[OpenPrinting][1] 数据库和您的发行版的官方支持渠道是两个最好的起点。请注意,您应确保设备的所有功能完全兼容,特别是如果它是个多功能产品。对佳能打印机的一个常见的抱怨是,驱动程序通常只能在非英语,甚至是很难找的网站上才有。
|
||||
|
||||
> 如果您购买的是新打印机,请在购买之前研究兼容性。
|
||||
|
||||
### 3、 显卡
|
||||
|
||||
显卡是一个微妙的话题,因为在 Linux 上显卡可以非常好的简单直观的开箱即用。出现的问题是:显卡加速器/3D 加速;最新的显卡和最新显示技术,如 NVIDIA Optimus 和 ATI 动态 GPU 切换;专有驱动程序的安装和稳定性;能效管理;以及可靠的挂起和恢复。如果你不是一个游戏玩家,也没有别的需要高端图形功能的需求,并且不是使用笔记本电脑,那么你可能不必担心这个。如果您正在寻找一台新的笔记本电脑,一定要在购买前研究好兼容性。如果你是一个游戏玩家或需要最高端的图形功能,你需要明确知道你的需求是什么,然后开始你的研究。幸运的是,这种情况正在改善,Wayland 开始解决问题,2017 年情况应该会变得好一些。
|
||||
|
||||
### 4、 声卡
|
||||
|
||||
再次,对于简单配置,声卡非常容易设置并可以很可靠地在 Linux 上运行。一旦你买的是专业级产品,例如回声消除、音频路由,统一混合和其他复杂的配置,它可能就很快地每况愈下。我的建议是,如果你需要高端的实时音频,请使用专用的音频相关的发行版。
|
||||
|
||||
### 5、 安装
|
||||
|
||||
有了这个包罗万象的分类,本文几乎保证是高质量的。也就是说,公平的说,我不知道 Linux 有普遍的安装问题。绝大多数的安装都按预期进行。Linux 支持多种硬件,安装 Linux 机器上可能有近乎无限的硬件组合,不可避免会导致了某种情况下的例外情况。最终用户其实也很少安装类似 Mac OS 或 Windows 这样的其它系统,因为它们都是随同新设备预安装的。
|
||||
|
||||
> 绝大多数的安装都按预期进行。
|
||||
|
||||
### 前景光明
|
||||
|
||||
其他提到的问题经常包括蓝牙、挂起/恢复,HiDPI 和触摸屏。您可能会看到这里形成一个模式,本文中提到的大多数问题集中在桌面用户。如果你已经意识到了这点,这其实是有意义的。Linux 桌面使用率相对较低,导致结果是,用于发现和解决相关问题的测试和资源很少。随着桌面使用量的增加,可以预期这些部分会改善。
|
||||
|
||||
在这方面,我认为最好提及的一个例子,曾经常常作为 Linux 的问题提出,但是反而最近很罕见:字体。几年前,获得高品质的抗锯齿字体常常是个问题。但是,随着现代发行版本的更新,它已成为常规。
|
||||
|
||||
你认为 2016 年最常见的 Linux 技术问题是什么? 请在评论中留言告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/jeremy-garcia.jpg?itok=kqOMWJIg)
|
||||
|
||||
Jeremy Garcia - Jeremy Garcia is the founder of LinuxQuestions.org and an ardent but realistic open source advocate. Follow Jeremy on Twitter: @linuxquestions
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/yearbook-linux-troubleshooting-tips
|
||||
|
||||
作者:[Jeremy Garcia][a]
|
||||
译者:[Vic020](http://vicyu.net)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/jeremy-garcia
|
||||
[1]:http://www.openprinting.org/printers
|
@ -0,0 +1,58 @@
|
||||
让你的 Linux 远离黑客(一):两个安全建议
|
||||
============================================================
|
||||
|
||||
![Keep hackers out](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/security-webinar.jpg?itok=af6QqiAm "Keep hackers out")
|
||||
|
||||
> 在本系列中,我们将介绍五种将黑客拒之门外的最简单的方法。请观看免费网络研讨会以了解更多信息。
|
||||
|
||||
[Creative Commons Zero] [1] Pixabay
|
||||
|
||||
在互联网上没有什么比美味的 Linux 机器让黑客更喜欢的了。在最近的 Linux 基金会网络研讨会中,我分享了黑客用来侵入的战术、工具和方法。
|
||||
|
||||
在这个系列的博文中,我们将介绍五种将黑客拒之门外的最简单的方法,并知道他们是否已经侵入。想要了解更多信息?请[观看免费的网络研讨会点播][4]。
|
||||
|
||||
### 简单的 Linux 安全提示 #1
|
||||
|
||||
**如果你没有在使用安全 shell,你应该取使用它。**
|
||||
|
||||
这是一个有非常非常长时间的提示了。Telnet 是不安全的。 rLogin 是不安全的。仍然有服务需要这些,但它们不应该暴露在互联网上。如果你没有 SSH ,那就关闭互联网连接。我们总是说:使用 SSH 密钥。
|
||||
|
||||
SSH 规则 1:不要使用密码认证。SSH 规则 2:不要使用密码认证。SSH 规则 3:不要使用密码认证。重要的事情重复三遍。
|
||||
|
||||
如果你有一台 Linux 机器在互联网上,不管时间长短,你总是面临暴力破解。肯定会这样的。暴力破解用的是脚本。扫描器只要看到对互联网开放的端口 22,它们就会攻击它。
|
||||
|
||||
你可以做的另一件事是修改 SSH 的标准端口,我们许多人都这么做。这可以防止少量的暴力攻击,但是,一般来说,不使用密码认证,你会更安全。
|
||||
|
||||
SSH 的第四条规则:所有密钥都要设置密码。无密码密钥根本就不是真正的密钥。我知道如果你想要自动登录或自动化一些事情,这会使得难以处理,但所有的密钥应该有密码!
|
||||
|
||||
我最喜欢做的就是入侵一台主机,并找到主目录与私钥。一旦我拥有了私钥,那你就玩完了。我可以闯入使用该公钥的任何地方。
|
||||
|
||||
如果你有口令短语,哪怕只是一个密码,它不用是你的密钥环的长密码,但是它会使我的行为更加、更加困难。
|
||||
|
||||
### 简单的 Linux 安全提示 #2
|
||||
|
||||
**安装 Fail2ban**
|
||||
|
||||
我说的那些暴力攻击?fail2ban 将大大有助于你。它将自动激活 iptables 规则以阻止 SSH 到你的机器的重复尝试。把它配置好,让它不会把你关在门外或者占用太多的资源。要使用它、爱它、看着它。
|
||||
|
||||
它有自己的日志,所以一定要查看它们,并检查它是否在实际运行。这是一件非常重要的事情。
|
||||
|
||||
在[本系列的第 2 部分][5],我会给你三个更容易的安全提示,以让黑客远离你的 Linux 机器。你也可以[现在观看完整的免费网络研讨会][6]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/news/webinar/2017/how-keep-hackers-out-your-linux-machine-part-1-top-two-security-tips
|
||||
|
||||
作者:[Mike Guthrie][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/anch
|
||||
[1]:https://www.linux.com/licenses/category/creative-commons-zero
|
||||
[2]:https://www.linux.com/files/images/security-webinarjpg
|
||||
[3]:http://bit.ly/2j89ISJ
|
||||
[4]:http://bit.ly/2j89ISJ
|
||||
[5]:https://www.linux.com/news/webinar/2017/how-keep-hackers-out-your-linux-machine-part-2-three-more-easy-security-tips
|
||||
[6]:http://bit.ly/2j89ISJ
|
@ -0,0 +1,474 @@
|
||||
如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud
|
||||
==========================
|
||||
|
||||
Nextcloud 是一款自由 (开源) 的类 Dropbox 软件,由 ownCloud 分支演化形成。它使用 PHP 和 JavaScript 编写,支持多种数据库系统,比如 MySQL/MariaDB、PostgreSQL、Oracle 数据库和 SQLite。它可以使你的桌面系统和云服务器中的文件保持同步,Nextcloud 为 Windows、Linux、Mac、安卓以及苹果手机都提供了客户端支持。Nextcloud 并非只是 Dropbox 的克隆,它还提供了很多附加特性,如日历、联系人、计划任务以及流媒体 Ampache。
|
||||
|
||||
在这篇文章中,我将向你展示如何在 CentOS 7 服务器中安装和配置最新版本的 Nextcloud 10。我会通过 Nginx 和 PHP7-FPM 来运行 Nextcloud,同时使用 MariaDB 做为数据库系统。
|
||||
|
||||
**先决条件**
|
||||
|
||||
* 64 位的 CentOS 7
|
||||
* 服务器的 Root 权限
|
||||
|
||||
### 步骤 1 - 在 CentOS 7 中安装 Nginx 和 PHP7-FPM
|
||||
|
||||
在开始安装 Nginx 和 php7-fpm 之前,我们还学要先添加 EPEL 包的仓库源。使用如下命令:
|
||||
|
||||
```
|
||||
yum -y install epel-release
|
||||
```
|
||||
|
||||
现在开始从 EPEL 仓库来安装 Nginx:
|
||||
|
||||
```
|
||||
yum -y install nginx
|
||||
```
|
||||
|
||||
然后我们还需要为 php7-fpm 添加另外一个仓库。互联网中有很个远程仓库提供了 PHP 7 系列包,我在这里使用的是 webtatic。
|
||||
|
||||
添加 PHP7-FPM webtatic 仓库:
|
||||
|
||||
```
|
||||
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
|
||||
```
|
||||
|
||||
然后就是安装 PHP7-FPM 以及 Nextcloud 需要的一些包。
|
||||
|
||||
```
|
||||
yum -y install php70w-fpm php70w-cli php70w-gd php70w-mcrypt php70w-mysql php70w-pear php70w-xml php70w-mbstring php70w-pdo php70w-json php70w-pecl-apcu php70w-pecl-apcu-devel
|
||||
```
|
||||
|
||||
最后,从服务器终端里查看 PHP 的版本号,以便验证 PHP 是否正确安装。
|
||||
|
||||
```
|
||||
php -v
|
||||
```
|
||||
|
||||
[![查看 PHP 版本号](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/1.png)][10]
|
||||
|
||||
### 步骤 2 - 配置 PHP7-FPM
|
||||
|
||||
在这一个步骤中,我们将配置 php-fpm 与 Nginx 协同运行。Php7-fpm 将使用 `nginx` 用户来运行,并监听 `9000` 端口。
|
||||
|
||||
使用 vim 编辑默认的 php7-fpm 配置文件。
|
||||
|
||||
```
|
||||
vim /etc/php-fpm.d/www.conf
|
||||
```
|
||||
|
||||
在第 8 行和第 10行,`user` 和 `group` 赋值为 `nginx`。
|
||||
|
||||
```
|
||||
user = nginx
|
||||
group = nginx
|
||||
```
|
||||
|
||||
在第 22 行,确保 php-fpm 运行在指定端口。
|
||||
|
||||
```
|
||||
listen = 127.0.0.1:9000
|
||||
```
|
||||
|
||||
取消第 366-370 行的注释,启用 php-fpm 的系统环境变量。
|
||||
|
||||
```
|
||||
env[HOSTNAME] = $HOSTNAME
|
||||
env[PATH] = /usr/local/bin:/usr/bin:/bin
|
||||
env[TMP] = /tmp
|
||||
env[TMPDIR] = /tmp
|
||||
env[TEMP] = /tmp
|
||||
```
|
||||
|
||||
保存文件并退出 vim 编辑器。
|
||||
|
||||
下一步,就是在 `/var/lib/` 目录下创建一个新的文件夹 `session`,并将其拥有者变更为 `nginx` 用户。
|
||||
|
||||
```
|
||||
mkdir -p /var/lib/php/session
|
||||
chown nginx:nginx -R /var/lib/php/session/
|
||||
```
|
||||
|
||||
然后启动 php-fpm 和 Nginx,并且将它们设置为随开机启动的服务。
|
||||
|
||||
```
|
||||
sudo systemctl start php-fpm
|
||||
sudo systemctl start nginx
|
||||
|
||||
sudo systemctl enable php-fpm
|
||||
sudo systemctl enable nginx
|
||||
```
|
||||
|
||||
[![启动 php-fpm 和 Nginx](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/2.png)][11]
|
||||
|
||||
PHP7-FPM 配置完成
|
||||
|
||||
### 步骤 3 - 安装和配置 MariaDB
|
||||
|
||||
我这里使用 MariaDB 作为 Nextcloud 的数据库。可以直接使用 `yum` 命令从 CentOS 默认远程仓库中安装 `mariadb-server` 包。
|
||||
|
||||
```
|
||||
yum -y install mariadb mariadb-server
|
||||
```
|
||||
|
||||
启动 MariaDB,并将其添加到随系统启动的服务中去。
|
||||
|
||||
```
|
||||
systemctl start mariadb
|
||||
systemctl enable mariadb
|
||||
```
|
||||
|
||||
现在开始配置 MariaDB 的 root 用户密码。
|
||||
|
||||
```
|
||||
mysql_secure_installation
|
||||
```
|
||||
|
||||
键入 `Y` ,然后设置 MariaDB 的 root 密码。
|
||||
|
||||
```
|
||||
Set root password? [Y/n] Y
|
||||
New password:
|
||||
Re-enter new password:
|
||||
|
||||
Remove anonymous users? [Y/n] Y
|
||||
Disallow root login remotely? [Y/n] Y
|
||||
Remove test database and access to it? [Y/n] Y
|
||||
Reload privilege tables now? [Y/n] Y
|
||||
```
|
||||
|
||||
这样就设置好了密码,现在登录到 mysql shell 并为 Nextcloud 创建一个新的数据库和用户。这里我创建名为 `nextcloud_db` 的数据库以及名为 `nextclouduser` 的用户,用户密码为 `nextclouduser@`。当然了,要给你自己的系统选用一个更安全的密码。
|
||||
|
||||
```
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
输入 MariaDB 的 root 密码,即可登录 mysql shell。
|
||||
|
||||
输入以下 mysql 查询语句来创建新的数据库和用户。
|
||||
|
||||
```
|
||||
create database nextcloud_db;
|
||||
create user nextclouduser@localhost identified by 'nextclouduser@';
|
||||
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'nextclouduser@';
|
||||
flush privileges;
|
||||
```
|
||||
|
||||
[![为 Nextcloud 创建一个新的数据库和用户](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/3.png)][12]
|
||||
|
||||
`nextcloud_db` 数据库和 `nextclouduser` 数据库用户创建完成
|
||||
|
||||
### 步骤 4 - 为 Nextcloud 生成一个自签名 SSL 证书
|
||||
|
||||
在教程中,我会让客户端以 https 连接来运行 Nextcloud。你可以使用诸如 let's encrypt 等免费 SSL 证书,或者是自己创建自签名 (self signed) SSL 证书。这里我使用 OpenSSL 来创建自己的自签名 SSL 证书。
|
||||
|
||||
为 SSL 文件创建新目录:
|
||||
|
||||
```
|
||||
mkdir -p /etc/nginx/cert/
|
||||
```
|
||||
|
||||
如下,使用 `openssl` 生成一个新的 SSL 证书。
|
||||
|
||||
```
|
||||
openssl req -new -x509 -days 365 -nodes -out /etc/nginx/cert/nextcloud.crt -keyout /etc/nginx/cert/nextcloud.key
|
||||
```
|
||||
|
||||
最后使用 `chmod` 命令将所有证书文件的权限设置为 `600`。
|
||||
|
||||
```
|
||||
chmod 700 /etc/nginx/cert
|
||||
chmod 600 /etc/nginx/cert/*
|
||||
```
|
||||
|
||||
[![为 Nextcloud 生成一个自签名 SSL 证书](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/4.png)][13]
|
||||
|
||||
### 步骤 5 - 下载和安装 Nextcloud
|
||||
|
||||
我直接使用 `wget` 命令下载 Nextcloud 到服务器上,因此需要先行安装 `wget`。此外,还需要安装 `unzip` 来进行解压。使用 `yum` 命令来安装这两个程序。
|
||||
|
||||
```
|
||||
yum -y install wget unzip
|
||||
```
|
||||
|
||||
先进入 `/tmp` 目录,然后使用 `wget` 从官网下载最新的 Nextcloud 10。
|
||||
|
||||
```
|
||||
cd /tmp
|
||||
wget https://download.nextcloud.com/server/releases/nextcloud-10.0.2.zip
|
||||
```
|
||||
|
||||
解压 Nextcloud,并将其移动到 `/usr/share/nginx/html/` 目录。
|
||||
|
||||
```
|
||||
unzip nextcloud-10.0.2.zip
|
||||
mv nextcloud/ /usr/share/nginx/html/
|
||||
```
|
||||
|
||||
下一步,转到 Nginx 的 web 根目录为 Nextcloud 创建一个 `data` 文件夹。
|
||||
|
||||
```
|
||||
cd /usr/share/nginx/html/
|
||||
mkdir -p nextcloud/data/
|
||||
```
|
||||
|
||||
变更 `nextcloud` 目录的拥有者为 `nginx` 用户和组。
|
||||
|
||||
```
|
||||
chown nginx:nginx -R nextcloud/
|
||||
```
|
||||
|
||||
### 步骤 6 - 在 Nginx 中为 Nextcloud 配置虚拟主机
|
||||
|
||||
在步骤 5 我们已经下载好了 Nextcloud 源码,并配置好了让它运行于 Nginx 服务器中,但我们还需要为它配置一个虚拟主机。在 Nginx 的 `conf.d` 目录下创建一个新的虚拟主机配置文件 `nextcloud.conf`。
|
||||
|
||||
```
|
||||
cd /etc/nginx/conf.d/
|
||||
vim nextcloud.conf
|
||||
```
|
||||
|
||||
将以下内容粘贴到虚拟主机配置文件中:
|
||||
|
||||
```
|
||||
upstream php-handler {
|
||||
server 127.0.0.1:9000;
|
||||
#server unix:/var/run/php5-fpm.sock;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name cloud.nextcloud.co;
|
||||
# enforce https
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name cloud.nextcloud.co;
|
||||
|
||||
ssl_certificate /etc/nginx/cert/nextcloud.crt;
|
||||
ssl_certificate_key /etc/nginx/cert/nextcloud.key;
|
||||
|
||||
# Add headers to serve security related headers
|
||||
# Before enabling Strict-Transport-Security headers please read into this
|
||||
# topic first.
|
||||
add_header Strict-Transport-Security "max-age=15768000;
|
||||
includeSubDomains; preload;";
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
add_header X-Robots-Tag none;
|
||||
add_header X-Download-Options noopen;
|
||||
add_header X-Permitted-Cross-Domain-Policies none;
|
||||
|
||||
# Path to the root of your installation
|
||||
root /usr/share/nginx/html/nextcloud/;
|
||||
|
||||
location = /robots.txt {
|
||||
allow all;
|
||||
log_not_found off;
|
||||
access_log off;
|
||||
}
|
||||
|
||||
# The following 2 rules are only needed for the user_webfinger app.
|
||||
# Uncomment it if you're planning to use this app.
|
||||
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
|
||||
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
|
||||
# last;
|
||||
|
||||
location = /.well-known/carddav {
|
||||
return 301 $scheme://$host/remote.php/dav;
|
||||
}
|
||||
location = /.well-known/caldav {
|
||||
return 301 $scheme://$host/remote.php/dav;
|
||||
}
|
||||
|
||||
# set max upload size
|
||||
client_max_body_size 512M;
|
||||
fastcgi_buffers 64 4K;
|
||||
|
||||
# Disable gzip to avoid the removal of the ETag header
|
||||
gzip off;
|
||||
|
||||
# Uncomment if your server is build with the ngx_pagespeed module
|
||||
# This module is currently not supported.
|
||||
#pagespeed off;
|
||||
|
||||
error_page 403 /core/templates/403.php;
|
||||
error_page 404 /core/templates/404.php;
|
||||
|
||||
location / {
|
||||
rewrite ^ /index.php$uri;
|
||||
}
|
||||
|
||||
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
|
||||
deny all;
|
||||
}
|
||||
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
|
||||
deny all;
|
||||
}
|
||||
|
||||
location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
|
||||
include fastcgi_params;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||
fastcgi_param HTTPS on;
|
||||
#Avoid sending the security headers twice
|
||||
fastcgi_param modHeadersAvailable true;
|
||||
fastcgi_param front_controller_active true;
|
||||
fastcgi_pass php-handler;
|
||||
fastcgi_intercept_errors on;
|
||||
fastcgi_request_buffering off;
|
||||
}
|
||||
|
||||
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
|
||||
try_files $uri/ =404;
|
||||
index index.php;
|
||||
}
|
||||
|
||||
# Adding the cache control header for js and css files
|
||||
# Make sure it is BELOW the PHP block
|
||||
location ~* \.(?:css|js)$ {
|
||||
try_files $uri /index.php$uri$is_args$args;
|
||||
add_header Cache-Control "public, max-age=7200";
|
||||
# Add headers to serve security related headers (It is intended to
|
||||
# have those duplicated to the ones above)
|
||||
# Before enabling Strict-Transport-Security headers please read into
|
||||
# this topic first.
|
||||
add_header Strict-Transport-Security "max-age=15768000;
|
||||
includeSubDomains; preload;";
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
add_header X-Robots-Tag none;
|
||||
add_header X-Download-Options noopen;
|
||||
add_header X-Permitted-Cross-Domain-Policies none;
|
||||
# Optional: Don't log access to assets
|
||||
access_log off;
|
||||
}
|
||||
|
||||
location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
|
||||
try_files $uri /index.php$uri$is_args$args;
|
||||
# Optional: Don't log access to other assets
|
||||
access_log off;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
保存文件并退出 vim。
|
||||
|
||||
下载测试以下该 Nginx 配置文件是否有错误,没有的话就可以重启服务了。
|
||||
|
||||
```
|
||||
nginx -t
|
||||
systemctl restart nginx
|
||||
```
|
||||
|
||||
[![在 Nginx 中为 Nextcloud 配置虚拟主机](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/5.png)][14]
|
||||
|
||||
### 步骤 7 - 为 Nextcloud 配置 SELinux 和 FirewallD 规则
|
||||
|
||||
本教程中,我们将以强制模式运行 SELinux,因此需要一个 SELinux 管理工具来为 Nextcloud 配置 SELinux。
|
||||
|
||||
使用以下命令安装 SELinux 管理工具。
|
||||
|
||||
```
|
||||
yum -y install policycoreutils-python
|
||||
```
|
||||
|
||||
然后以 root 用户来运行以下命令,以便让 Nextcloud 运行于 SELinux 环境之下。如果你是用的其他名称的目录,记得将 `nextcloud` 替换掉。
|
||||
|
||||
```
|
||||
semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/data(/.*)?'
|
||||
semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/config(/.*)?'
|
||||
semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/apps(/.*)?'
|
||||
semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/assets(/.*)?'
|
||||
semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/.htaccess'
|
||||
semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/.user.ini'
|
||||
|
||||
restorecon -Rv '/usr/share/nginx/html/nextcloud/'
|
||||
```
|
||||
|
||||
接下来,我们要启用 firewalld 服务,同时为 Nextcloud 开启 http 和 https 端口。
|
||||
|
||||
启动 firewalld 并设置随系统启动。
|
||||
|
||||
```
|
||||
systemctl start firewalld
|
||||
systemctl enable firewalld
|
||||
```
|
||||
|
||||
现在使用 `firewall-cmd` 命令来开启 http 和 https 端口,然后重新加载防火墙。
|
||||
|
||||
```
|
||||
firewall-cmd --permanent --add-service=http
|
||||
firewall-cmd --permanent --add-service=https
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
[![为 Nextcloud 配置 FirewallD 规则](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/6.png)][15]
|
||||
|
||||
至此,服务器配置完成。
|
||||
|
||||
### 步骤 8 - Nextcloud 安装
|
||||
|
||||
打开你的 Web 浏览器,输入你为 Nextcloud 设置的域名,我这里设置为 `cloud.nextcloud.co`,然后会重定向到安全性更好的 https 连接。
|
||||
|
||||
设置你的管理员用户名和密码,然后输入数据验证信息,点击 '**完成安装 (Finish Setup)**'。
|
||||
|
||||
[![Nextcloud 安装](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/7.png)][16]
|
||||
|
||||
Nextcloud 管理面板大致如下:
|
||||
|
||||
[![Nextcloud 管理面板](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/8.png)][17]
|
||||
|
||||
Nextcloud 用户设置:
|
||||
|
||||
[![Nextcloud 用户设置](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/9.png)][18]
|
||||
|
||||
管理设置:
|
||||
|
||||
[![管理设置](https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/10.png)][19]
|
||||
|
||||
至此,我们在 CentOS 7 服务器上通过使用 Nginx、PHP7-FPM、MariaDB 完成了 Nextcloud 的安装。
|
||||
|
||||
### 参考链接
|
||||
|
||||
- [https://docs.nextcloud.com/](https://docs.nextcloud.com/)
|
||||
|
||||
------------------------------------
|
||||
|
||||
译者简介:
|
||||
|
||||
[GHLandy](http://GHLandy.com) —— 划不完粉腮柳眉泣别离。
|
||||
|
||||
------------------------------------
|
||||
|
||||
via: https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/
|
||||
|
||||
作者:[Muhammad Arul][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/
|
||||
[1]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-install-nginx-and-phpfpm-on-centos-
|
||||
[2]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-configure-phpfpm
|
||||
[3]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-install-and-configure-mariadb
|
||||
[4]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-generate-a-selfsigned-ssl-certificate-for-nextcloud
|
||||
[5]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-download-and-install-nextcloud
|
||||
[6]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-configure-nextcloud-virtual-host-in-nginx
|
||||
[7]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-configure-selinux-and-firewalld-for-nextcloud
|
||||
[8]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#step-nextcloud-installation-wizard
|
||||
[9]:https://www.howtoforge.com/tutorial/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/#reference
|
||||
[10]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/1.png
|
||||
[11]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/2.png
|
||||
[12]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/3.png
|
||||
[13]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/4.png
|
||||
[14]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/5.png
|
||||
[15]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/6.png
|
||||
[16]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/7.png
|
||||
[17]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/8.png
|
||||
[18]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/9.png
|
||||
[19]:https://www.howtoforge.com/images/how-to-install-nextcloud-with-nginx-and-php-fpm-on-centos-7/big/10.png
|
@ -0,0 +1,244 @@
|
||||
OpenSSL 在 Apache 和 Dovecot 下的使用(二)
|
||||
============================================================
|
||||
|
||||
![OpenSSL](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/key-openssl_0.jpg?itok=FDO3qAOt "OpenSSL")
|
||||
|
||||
> 本篇中,Carla Schroder 会解释如何使用 OpenSSL 保护你的 Postfix/Dovecot 邮件服务器
|
||||
|
||||
[Creative Commons Zero][1]Pixabay
|
||||
|
||||
在[上周][11],作为我们 OpenSSL 系列的一部分,我们学习了如何配置 Apache 以使用 OpenSSL 并强制所有会话使用 HTTPS。 今天,我们将使用 OpenSSL 保护我们的 Postfix/Dovecot 邮件服务器。这些示例基于前面的教程; 请参阅最后的参考资料部分,了解本系列中以前的所有教程的链接。
|
||||
|
||||
你需要配置 Postfix 以及 Dovecot 都使用 OpenSSL,我们将使用我们在[OpenSSL 在 Apache 和 Dovecot 下的使用(一)][12]中创建的密钥和证书。
|
||||
|
||||
### Postfix 配置
|
||||
|
||||
你必须编辑 `/etc/postfix/main.cf` 以及 `/etc/postfix/master.cf`。实例的 `main.cf` 是完整的配置,基于我们先前的教程。替换成你自己的 OpenSSL 密钥和证书名以及本地网络地址。
|
||||
|
||||
```
|
||||
compatibility_level=2
|
||||
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu/GNU)
|
||||
biff = no
|
||||
append_dot_mydomain = no
|
||||
|
||||
myhostname = localhost
|
||||
alias_maps = hash:/etc/aliases
|
||||
alias_database = hash:/etc/aliases
|
||||
myorigin = $myhostname
|
||||
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/24
|
||||
mailbox_size_limit = 0
|
||||
recipient_delimiter = +
|
||||
inet_interfaces = all
|
||||
|
||||
virtual_mailbox_domains = /etc/postfix/vhosts.txt
|
||||
virtual_mailbox_base = /home/vmail
|
||||
virtual_mailbox_maps = hash:/etc/postfix/vmaps.txt
|
||||
virtual_minimum_uid = 1000
|
||||
virtual_uid_maps = static:5000
|
||||
virtual_gid_maps = static:5000
|
||||
virtual_transport = lmtp:unix:private/dovecot-lmtp
|
||||
|
||||
smtpd_tls_cert_file=/etc/ssl/certs/test-com.pem
|
||||
smtpd_tls_key_file=/etc/ssl/private/test-com.key
|
||||
smtpd_use_tls=yes
|
||||
|
||||
smtpd_sasl_auth_enable = yes
|
||||
smtpd_sasl_type = dovecot
|
||||
smtpd_sasl_path = private/auth
|
||||
smtpd_sasl_authenticated_header = yes
|
||||
```
|
||||
|
||||
在 `master.cf` 取消 `submission inet` 部分的注释,并编辑 `smtpd_recipient_restrictions`:
|
||||
|
||||
```
|
||||
#submission inet n - y - - smtpd
|
||||
-o syslog_name=postfix/submission
|
||||
-o smtpd_tls_security_level=encrypt
|
||||
-o smtpd_sasl_auth_enable=yes
|
||||
-o milter_macro_daemon_name=ORIGINATING
|
||||
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
|
||||
-o smtpd_tls_wrappermode=no
|
||||
```
|
||||
|
||||
完成后重新加载 Postfix:
|
||||
|
||||
```
|
||||
$ sudo service postfix reload
|
||||
```
|
||||
|
||||
### Dovecot 配置
|
||||
|
||||
在我们以前的教程中,我们为 Dovecot 创建了一个单一配置文件 `/etc/dovecot/dovecot.conf`,而不是使用多个默认配置文件。这是一个基于我们以前的教程的完整配置。再说一次,使用你自己的 OpenSSL 密钥和证书,以及你自己的 `userdb` 的 home 文件:
|
||||
|
||||
```
|
||||
protocols = imap pop3 lmtp
|
||||
log_path = /var/log/dovecot.log
|
||||
info_log_path = /var/log/dovecot-info.log
|
||||
disable_plaintext_auth = no
|
||||
mail_location = maildir:~/.Mail
|
||||
pop3_uidl_format = %g
|
||||
auth_mechanisms = plain
|
||||
|
||||
passdb {
|
||||
driver = passwd-file
|
||||
args = /etc/dovecot/passwd
|
||||
}
|
||||
|
||||
userdb {
|
||||
driver = static
|
||||
args = uid=vmail gid=vmail home=/home/vmail/studio/%u
|
||||
}
|
||||
|
||||
service lmtp {
|
||||
unix_listener /var/spool/postfix/private/dovecot-lmtp {
|
||||
group = postfix
|
||||
mode = 0600
|
||||
user = postfix
|
||||
}
|
||||
}
|
||||
|
||||
protocol lmtp {
|
||||
postmaster_address = postmaster@studio
|
||||
}
|
||||
|
||||
service lmtp {
|
||||
user = vmail
|
||||
}
|
||||
|
||||
service auth {
|
||||
unix_listener /var/spool/postfix/private/auth {
|
||||
mode = 0660
|
||||
user=postfix
|
||||
group=postfix
|
||||
}
|
||||
}
|
||||
|
||||
ssl=required
|
||||
ssl_cert = </etc/ssl/certs/test-com.pem
|
||||
ssl_key = </etc/ssl/private/test-com.key
|
||||
```
|
||||
|
||||
重启 Dovecot:
|
||||
|
||||
```
|
||||
$ sudo service postfix reload
|
||||
```
|
||||
|
||||
### 用 telnet 测试
|
||||
|
||||
就像我们以前一样,现在我们可以通过使用 telnet 发送消息来测试我们的设置。 但是等等,你说 telnet 不支持 TLS/SSL,那么这样怎么办呢?首先通过使用 `openssl s_client` 打开一个加密会话。`openssl s_client` 的输出将显示你的证书及其指纹和大量其它信息,以便你知道你的服务器正在使用正确的证书。会话建立后输入的命令都是不以数字开头的:
|
||||
|
||||
```
|
||||
$ openssl s_client -starttls smtp -connect studio:25
|
||||
CONNECTED(00000003)
|
||||
[masses of output snipped]
|
||||
Verify return code: 0 (ok)
|
||||
---
|
||||
250 SMTPUTF8
|
||||
EHLO studio
|
||||
250-localhost
|
||||
250-PIPELINING
|
||||
250-SIZE 10240000
|
||||
250-VRFY
|
||||
250-ETRN
|
||||
250-AUTH PLAIN
|
||||
250-ENHANCEDSTATUSCODES
|
||||
250-8BITMIME
|
||||
250-DSN
|
||||
250 SMTPUTF8
|
||||
mail from: <carla@domain.com>
|
||||
250 2.1.0 Ok
|
||||
rcpt to: <alrac@studio>
|
||||
250 2.1.5 Ok
|
||||
data
|
||||
354 End data with .subject: TLS/SSL test
|
||||
Hello, we are testing TLS/SSL. Looking good so far.
|
||||
.
|
||||
250 2.0.0 Ok: queued as B9B529FE59
|
||||
quit
|
||||
221 2.0.0 Bye
|
||||
```
|
||||
|
||||
你应该可以在邮件客户端中看到一条新邮件,并在打开时要求你验证 SSL 证书。你也可以使用 `openssl s_client` 来测试 Dovecot 的 POP3 和 IMAP 服务。此示例测试加密的 POP3,第 5 号消息是我们在 telnet(如上)中创建的:
|
||||
|
||||
```
|
||||
$ openssl s_client -connect studio:995
|
||||
CONNECTED(00000003)
|
||||
[masses of output snipped]
|
||||
Verify return code: 0 (ok)
|
||||
---
|
||||
+OK Dovecot ready
|
||||
user alrac@studio
|
||||
+OK
|
||||
pass password
|
||||
+OK Logged in.
|
||||
list
|
||||
+OK 5 messages:
|
||||
1 499
|
||||
2 504
|
||||
3 514
|
||||
4 513
|
||||
5 565
|
||||
.
|
||||
retr 5
|
||||
+OK 565 octets
|
||||
Return-Path: <carla@domain.com>
|
||||
Delivered-To: alrac@studio
|
||||
Received: from localhost
|
||||
by studio.alrac.net (Dovecot) with LMTP id y8G5C8aablgKIQAAYelYQA
|
||||
for <alrac@studio>; Thu, 05 Jan 2017 11:13:10 -0800
|
||||
Received: from studio (localhost [127.0.0.1])
|
||||
by localhost (Postfix) with ESMTPS id B9B529FE59
|
||||
for <alrac@studio>; Thu, 5 Jan 2017 11:12:13 -0800 (PST)
|
||||
subject: TLS/SSL test
|
||||
Message-Id: <20170105191240.B9B529FE59@localhost>
|
||||
Date: Thu, 5 Jan 2017 11:12:13 -0800 (PST)
|
||||
From: carla@domain.com
|
||||
|
||||
Hello, we are testing TLS/SSL. Looking good so far.
|
||||
.
|
||||
quit
|
||||
+OK Logging out.
|
||||
closed
|
||||
```
|
||||
|
||||
### 现在做什么?
|
||||
|
||||
现在你有一个功能良好的,具有合适的 TLS/SSL 保护的邮件服务器了。我鼓励你深入学习 Postfix 以及 Dovecot; 这些教程中的示例尽可能地简单,不包括对安全性、防病毒扫描程序、垃圾邮件过滤器或任何其他高级功能的调整。我认为当你有一个基本工作系统时更容易学习高级功能。
|
||||
|
||||
下周回到 openSUSE 包管理备忘录上。
|
||||
|
||||
### 资源
|
||||
|
||||
* [为 Apache 和 Dovecot 使用 OpenSSL][3]
|
||||
* [如何在 Ubuntu Linux 上构建电子邮件服务器][4]
|
||||
* [在 Ubuntu Linux 上构建电子邮件服务器:第2部分][5]
|
||||
* [在 Ubuntu Linux 上构建电子邮件服务器:第3部分][6]
|
||||
* [给初学者看的在 Ubuntu Linux 上使用 Apache][7]
|
||||
* [给初学者看的在 Ubuntu Linux 上使用 Apache:第二部分][8]
|
||||
* [给初学者看的在 CentOS Linux 上使用 Apache][9]
|
||||
* [消灭让人害怕的 web 浏览器 SSL 警告][10]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/learn/intro-to-linux/openssl-apache-and-dovecot-part-2
|
||||
|
||||
作者:[CARLA SCHRODER][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/cschroder
|
||||
[1]:https://www.linux.com/licenses/category/creative-commons-zero
|
||||
[2]:https://www.linux.com/files/images/key-openssljpg-0
|
||||
[3]:https://linux.cn/article-8167-1.html
|
||||
[4]:https://linux.cn/article-8071-1.html
|
||||
[5]:https://linux.cn/article-8077-1.html
|
||||
[6]:https://linux.cn/article-8088-1.html
|
||||
[7]:https://www.linux.com/learn/apache-ubuntu-linux-beginners
|
||||
[8]:https://www.linux.com/learn/apache-ubuntu-linux-beginners-part-2
|
||||
[9]:https://www.linux.com/learn/apache-centos-linux-beginners
|
||||
[10]:https://www.linux.com/learn/quieting-scary-web-browser-ssl-alerts
|
||||
[11]:https://linux.cn/article-8167-1.html
|
||||
[12]:https://linux.cn/article-8167-1.html
|
@ -0,0 +1,110 @@
|
||||
如何在 Ubuntu 中加密硬盘
|
||||
=========================
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/hdd-encryption-ubuntu.jpg "How to Encrypt Your Hard Disk in Ubuntus")
|
||||
|
||||
隐私保护、安全和加密是不可分开的,用户可以通过加密来提高安全和保护操作系统的隐私信息。本文将会介绍在 Ubuntu Linux 中对硬盘全盘加密的优缺点。此外,我们也介绍如何在系统级别上进行加密设置,并对一些目录进行加密。加密是非常有用的,而且也没有你想象中那么复杂。综上所述,让我开始进行加密吧。
|
||||
|
||||
### 加密的优缺点
|
||||
|
||||
尽管进行全盘加密听起来非常棒,但是否要这么做还是有些争议的。我们先来看看这个做法有哪些优缺点。
|
||||
|
||||
#### 加密的优点
|
||||
|
||||
* 提高私密程度
|
||||
* 只有拥有密钥的人才能访问操作系统及其中文件
|
||||
* 确保政府或者黑客无法侦测你的系统和侵犯你的隐私
|
||||
|
||||
#### 加密的缺点
|
||||
|
||||
* 在其他的 Linux 操作系统上访问和挂载文件系统将变得困难
|
||||
* 无法从那些加密分区中恢复数据
|
||||
* 如果用户丢失了加密密钥,那就彻底悲剧了
|
||||
|
||||
### 安装前的准备
|
||||
|
||||
在 Ubuntu 中加密最好就是在安装进程开始之前在系统层面进行。在 Ubuntu 安装进程开始之后是无法加密的,所以先备份你的重要数据到 [Dropbox][10]、 [Google Drive][11] (或者其它硬盘上),然后后准备重新安装 Ubuntu。
|
||||
|
||||
![ubuntu 下载](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/ubuntu-encrypt-ubuntu-alternative-downloads.jpg "ubuntu-encrypt-ubuntu-alternative-downloads")
|
||||
|
||||
从 [此处][12] 开始下载最新版本的 Ubuntu,并制作好可启动的 U 盘 (需要至少 2 GB 可用空间)。
|
||||
|
||||
制作启动 U 盘需要一个烧录程序,可以到 [etcher.io][13] 去下载。下载好之后解压 zip 文件,右击 (或者使用鼠标选定之后按下回车) 解压出来的文件以运行。
|
||||
|
||||
![烧录程序](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/ubuntu-encrypt-etcher.jpg "ubuntu-encrypt-etcher")
|
||||
|
||||
**注意**:烧录程序会询问是否创建图标,选择“yes”。
|
||||
|
||||
在烧录程序中点击“选择镜像(Select Image)”按钮,选择之前下载好的 Ubuntu ISO 镜像。然后插入你的 U 盘。烧录程序会自动检测并为你选择。最后,点击“开始烧录( Flash)”按钮来开始创建进程。
|
||||
|
||||
完成之后,重启电脑至 BIOS,设置为 U 盘启动。
|
||||
|
||||
**注意**:如果你的电脑不支持从 U 盘启动,下载 32 位的 Ubuntu,并使用你电脑中的烧录软件将其烧录到 DVD 中。
|
||||
|
||||
### 对你的硬盘进行全盘加密
|
||||
|
||||
加载好 Live Ubuntu 之后,安装进程就可以开始了。当 Ubuntu 安装进程开始之后,会出现下面这样一个界面。注意每个人安装进程都可能不同的,或许你会看到的不太一样。
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/ubuntu-encrypt-installation-type1.jpg "ubuntu-encrypt-installation-type")
|
||||
|
||||
选择“擦除磁盘并安装 Ubuntu (Erase disk and install Ubuntu)”,并选择“加密新装的 Ubuntu 以提高安全程度(Encrypt the new Ubuntu installation for Security)”来开始加密的安装进程。这样会自动选择 LVM。两个选框都必须选中。选好加密选项之后,点击“现在安装(Install Now)”。
|
||||
|
||||
**注意**:如果是双系统启动的话,你需要安装到空余磁盘空间,而非擦除磁盘。选择好之后,像上边一样选择加密选项。
|
||||
|
||||
选择加密选项并开始安装之后,会出现一个加密配置页面。这个页面用户需要为安装进程设置自己的加密密钥。
|
||||
|
||||
![设置安全密码](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/ubuntu-encrypt-choose-security-key.jpg "ubuntu-encrypt-choose-security-key")
|
||||
|
||||
输入安全密钥。该安全密钥设置窗口会自动为你输入的密钥进行密码强度评级,使用这个功能时看着后边的显示,直到显示为“高强度密码(strong password)”为止。输入完成后,在下方在此输入来确认密码,最后用一张纸把密码写下下来妥善保管。
|
||||
|
||||
此外,选定“覆些磁盘空余空间(Overwrite empty disk space)”,当然这是一个可选步骤。一切准备就绪之后点击现在安装即可。
|
||||
|
||||
![选择时区](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/ubuntu-encrypt-timezone-select.jpg "ubuntu-encrypt-timezone-select")
|
||||
|
||||
在设置完加密密钥之后,就是传统的 Ubuntu 安装配置了。选择时区、创建用户以及对应的安全密码。
|
||||
|
||||
![加密家目录](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/ubuntu-encrypt-home-folder-e1483900399596.jpg "ubuntu-encrypt-home-folder")
|
||||
|
||||
与创建和加密 Ubuntu 磁盘对应,在创建用户的时记得候选择“登录系统需要密码(require my password to log in)”和“加密我的家目录(encrypt my home folder)”。这样可以为你的数据再增加一层保护。
|
||||
|
||||
等到用户名、加密设置以及其他所有事情都完成之后,Ubuntu 安装进程就可以开始了。随后,安装进程会告知你安装已完成,移除安装介质后重启即可享受 Ubuntu 之旅。
|
||||
|
||||
### 结论
|
||||
|
||||
进行磁盘加密之后,如果没有加密密钥则无法开启 Ubuntu。尽管无趣,但这种级别的加密使用最容易的,并且还充分利用了操作系统提供的特性。用户不需要过多的知识,或者使用其他第三方程序就可以很快完成加密要求。
|
||||
|
||||
![加密电脑](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/01/ubuntu-encrypt-decrypt-computer.jpg "ubuntu-encrypt-decrypt-computer")
|
||||
|
||||
加密之后的 Ubuntu,使用起来和没有加密的并没有什么区别。不需要其他的步骤,也不需要学习什么复杂的解密方法。对于那些非常在意隐私但又不想太过麻烦的人来说,这个提高安全等级的方法是必须学会的(当然,这很容易不是吗)。
|
||||
|
||||
你是否会使用 Ubuntu 对硬盘进行加密呢?在下方评论告诉我们。
|
||||
|
||||
---------------------------------
|
||||
|
||||
译者简介:
|
||||
|
||||
[GHLandy](http://GHLandy.com) —— 欲得之,则为之奋斗 (If you want it, work for it.)。
|
||||
|
||||
-----------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/encrypt-hard-disk-in-ubuntu/
|
||||
|
||||
作者:[Derrik Diener][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.maketecheasier.com/author/derrikdiener/
|
||||
[1]:https://www.maketecheasier.com/author/derrikdiener/
|
||||
[2]:https://www.maketecheasier.com/encrypt-hard-disk-in-ubuntu/#comments
|
||||
[3]:https://www.maketecheasier.com/category/linux-tips/
|
||||
[4]:http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.maketecheasier.com%2Fencrypt-hard-disk-in-ubuntu%2F
|
||||
[5]:http://twitter.com/share?url=https%3A%2F%2Fwww.maketecheasier.com%2Fencrypt-hard-disk-in-ubuntu%2F&text=How+to+Encrypt+Your+Hard+Disk+in+Ubuntu
|
||||
[6]:mailto:?subject=How%20to%20Encrypt%20Your%20Hard%20Disk%20in%20Ubuntu&body=https%3A%2F%2Fwww.maketecheasier.com%2Fencrypt-hard-disk-in-ubuntu%2F
|
||||
[7]:https://www.maketecheasier.com/why-is-iphone-overheating/
|
||||
[8]:https://www.maketecheasier.com/it-security-ethical-hacking-training/
|
||||
[9]:https://support.google.com/adsense/troubleshooter/1631343
|
||||
[10]:http://www.maketecheasier.com/tag/dropbox
|
||||
[11]:http://www.maketecheasier.com/tag/google-drive
|
||||
[12]:https://www.ubuntu.com/download/alternative-downloads
|
||||
[13]:https://etcher.io/
|
@ -0,0 +1,544 @@
|
||||
如何在 Ubuntu 16.04 中安装 Ceph 存储集群
|
||||
============================================================
|
||||
|
||||
Ceph 是一个高性能、可靠、可扩展的开源存储平台。它是一个自由的分布式存储系统,提供了对象、块和文件级存储的接口,并可以不受单点故障的影响而运行。
|
||||
|
||||
在这个教程中,我将指导你在 Ubuntu 16.04 服务器上安装建立一个 Ceph 集群。Ceph 集群包括这些组件:
|
||||
|
||||
* **Ceph OSD (ceph-osd)** - 控制数据存储,数据复制和恢复。Ceph 集群需要至少两个 Ceph OSD 服务器。这次安装中我们将使用三个 Ubuntu 16.04 服务器。
|
||||
* **Ceph Monitor (ceph-mon)** - 监控集群状态并运行 OSD 映射 和 CRUSH 映射。这里我们使用一个服务器。
|
||||
* **Ceph Meta Data Server (ceph-mds)** - 如果你想把 Ceph 作为文件系统使用,就需要这个。
|
||||
|
||||
### 前提条件
|
||||
|
||||
* 6 个安装了 Ubuntu 16.04 的服务器节点
|
||||
* 所有节点上的 root 权限
|
||||
|
||||
我将使用下面这些 hostname /IP 安装:
|
||||
|
||||
```
|
||||
主机名 IP 地址
|
||||
ceph-admin 10.0.15.10
|
||||
mon1 10.0.15.11
|
||||
osd1 10.0.15.21
|
||||
osd2 10.0.15.22
|
||||
osd3 10.0.15.23
|
||||
client 10.0.15.15
|
||||
```
|
||||
|
||||
### 第 1 步 - 配置所有节点
|
||||
|
||||
这次安装,我将配置所有的 6 个节点来准备安装 Ceph 集群软件。所以你必须在所有节点运行下面的命令。然后确保所有节点都安装了 ssh-server。
|
||||
|
||||
#### 创建 Ceph 用户
|
||||
|
||||
在所有节点创建一个名为 `cephuser` 的新用户
|
||||
|
||||
```
|
||||
useradd -m -s /bin/bash cephuser
|
||||
passwd cephuser
|
||||
```
|
||||
|
||||
创建完新用户后,我们需要给 `cephuser` 配置无密码的 sudo 权限。这意味着 `cephuser` 可以不先输入密码而获取到 sudo 权限运行。
|
||||
|
||||
运行下面的命令来完成配置。
|
||||
|
||||
```
|
||||
echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser
|
||||
chmod 0440 /etc/sudoers.d/cephuser
|
||||
sed -i s'/Defaults requiretty/#Defaults requiretty'/g /etc/sudoers
|
||||
```
|
||||
|
||||
#### 安装和配置 NTP
|
||||
|
||||
安装 NTP 来同步所有节点的日期和时间。先运行 `ntpdate` 命令通过 NTP 设置日期。我们将使用 US 池的 NTP 服务器。然后开启并使 NTP 服务在开机时启动。
|
||||
|
||||
```
|
||||
sudo apt-get install -y ntp ntpdate ntp-doc
|
||||
ntpdate 0.us.pool.ntp.org
|
||||
hwclock --systohc
|
||||
systemctl enable ntp
|
||||
systemctl start ntp
|
||||
```
|
||||
|
||||
#### 安装 Open-vm-tools
|
||||
|
||||
如果你正在 VMware 里运行所有节点,你需要安装这个虚拟化工具。
|
||||
|
||||
```
|
||||
sudo apt-get install -y open-vm-tools
|
||||
```
|
||||
|
||||
#### 安装 Python 和 parted
|
||||
|
||||
在这个教程,我们需要 python 包来建立 ceph 集群。安装 python 和 python-pip。
|
||||
|
||||
```
|
||||
sudo apt-get install -y python python-pip parted
|
||||
```
|
||||
|
||||
#### 配置 Hosts 文件
|
||||
|
||||
用 vim 编辑器编辑所有节点的 `hosts` 文件。
|
||||
|
||||
```
|
||||
vim /etc/hosts
|
||||
```
|
||||
|
||||
粘帖如下配置:
|
||||
|
||||
```
|
||||
10.0.15.10 ceph-admin
|
||||
10.0.15.11 mon1
|
||||
10.0.15.21 ceph-osd1
|
||||
10.0.15.22 ceph-osd2
|
||||
10.0.15.23 ceph-osd3
|
||||
10.0.15.15 ceph-client
|
||||
```
|
||||
|
||||
保存 `hosts` 文件,然后退出 vim 编辑器。
|
||||
|
||||
现在你可以试着在两个服务器间 `ping` 主机名来测试网络连通性。
|
||||
|
||||
```
|
||||
ping -c 5 mon1
|
||||
```
|
||||
|
||||
[
|
||||
![Ceph cluster Installation on Ubuntu 16.04](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/1.png)
|
||||
][8]
|
||||
|
||||
### 第 2 步 - 配置 SSH 服务器
|
||||
|
||||
这一步,我们将配置 **ceph-admin 节点**。管理节点是用来配置监控节点和 osd 节点的。登录到 ceph-admin 节点然后使用 `cephuser` 用户。
|
||||
|
||||
```
|
||||
ssh root@ceph-admin
|
||||
su - cephuser
|
||||
```
|
||||
|
||||
管理节点用来安装配置所有集群节点,所以 ceph-admin 上的用户必须有不使用密码连接到所有节点的权限。我们需要为 'ceph-admin' 节点的 `cephuser` 用户配置无密码 SSH 登录权限。
|
||||
|
||||
生成 `cephuser` 的 ssh 密钥。
|
||||
|
||||
```
|
||||
ssh-keygen
|
||||
```
|
||||
|
||||
让密码为空。
|
||||
|
||||
下面,为 ssh 创建一个配置文件
|
||||
|
||||
```
|
||||
vim ~/.ssh/config
|
||||
```
|
||||
|
||||
粘帖如下配置:
|
||||
|
||||
```
|
||||
Host ceph-admin
|
||||
Hostname ceph-admin
|
||||
User cephuser
|
||||
|
||||
Host mon1
|
||||
Hostname mon1
|
||||
User cephuser
|
||||
|
||||
Host ceph-osd1
|
||||
Hostname ceph-osd1
|
||||
User cephuser
|
||||
|
||||
Host ceph-osd2
|
||||
Hostname ceph-osd2
|
||||
User cephuser
|
||||
|
||||
Host ceph-osd3
|
||||
Hostname ceph-osd3
|
||||
User cephuser
|
||||
|
||||
Host ceph-client
|
||||
Hostname ceph-client
|
||||
User cephuser
|
||||
```
|
||||
|
||||
保存文件并退出 vim。
|
||||
|
||||
[
|
||||
![Ceph-admin configuration](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/2.png)
|
||||
][9]
|
||||
|
||||
改变配置文件权限为 644。
|
||||
|
||||
```
|
||||
chmod 644 ~/.ssh/config
|
||||
```
|
||||
|
||||
现在使用 `ssh-copy-id` 命令增加密钥到所有节点。
|
||||
|
||||
```
|
||||
ssh-keyscan ceph-osd1 ceph-osd2 ceph-osd3 ceph-client mon1 >> ~/.ssh/known_hosts
|
||||
ssh-copy-id ceph-osd1
|
||||
ssh-copy-id ceph-osd2
|
||||
ssh-copy-id ceph-osd3
|
||||
ssh-copy-id mon1
|
||||
```
|
||||
|
||||
当请求输入密码时输入你的 `cephuser` 密码。
|
||||
|
||||
[
|
||||
![Ceph-admin deploy ssh key to all cluster nodes](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/3.png)
|
||||
][10]
|
||||
|
||||
现在尝试从 ceph-admin 节点登录 osd1 服务器,测试无密登录是否正常。
|
||||
|
||||
```
|
||||
ssh ceph-osd1
|
||||
```
|
||||
|
||||
[
|
||||
![SSH Less password from ceph-admin to all nodes cluster](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/4.png)
|
||||
][11]
|
||||
|
||||
### 第 3 步 - 配置 Ubuntu 防火墙
|
||||
|
||||
出于安全原因,我们需要在服务器打开防火墙。我们更愿使用 Ufw(不复杂防火墙)来保护系统,这是 Ubuntu 默认的防火墙。在这一步,我们在所有节点开启 ufw,然后打开 ceph-admin、ceph-mon 和 ceph-osd 需要使用的端口。
|
||||
|
||||
登录到 ceph-admin 节点,然后安装 ufw 包。
|
||||
|
||||
```
|
||||
ssh root@ceph-admin
|
||||
sudo apt-get install -y ufw
|
||||
```
|
||||
|
||||
打开 80,2003 和 4505-4506 端口,然后重启防火墙。
|
||||
|
||||
```
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 2003/tcp
|
||||
sudo ufw allow 4505:4506/tcp
|
||||
```
|
||||
|
||||
开启 ufw 并设置开机启动。
|
||||
|
||||
```
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
[
|
||||
![UFW Firewall with Ceph service](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/5.png)
|
||||
][12]
|
||||
|
||||
从 ceph-admin 节点,登录到监控节点 mon1 然后安装 ufw。
|
||||
|
||||
```
|
||||
ssh mon1
|
||||
sudo apt-get install -y ufw
|
||||
```
|
||||
|
||||
打开 ceph 监控节点的端口然后开启 ufw。
|
||||
|
||||
```
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 6789/tcp
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
最后,在每个 osd 节点 ceph-osd1、ceph-osd2 和 ceph-osd3 上打开这些端口 6800-7300。
|
||||
|
||||
从 ceph-admin 登录到每个 ceph-osd 节点安装 ufw。
|
||||
|
||||
```
|
||||
ssh ceph-osd1
|
||||
sudo apt-get install -y ufw
|
||||
```
|
||||
|
||||
在 osd 节点打开端口并重启防火墙。
|
||||
|
||||
```
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 6800:7300/tcp
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
ufw 防火墙配置完成。
|
||||
|
||||
### 第 4 步 - 配置 Ceph OSD 节点
|
||||
|
||||
这个教程里,我们有 3 个 OSD 节点,每个节点有两块硬盘分区。
|
||||
|
||||
1. **/dev/sda** 用于根分区
|
||||
2. **/dev/sdb** 空闲分区 - 20GB
|
||||
|
||||
我们要使用 **/dev/sdb** 作为 ceph 磁盘。从 ceph-admin 节点,登录到所有 OSD 节点,然后格式化 /dev/sdb 分区为 **XFS** 文件系统。
|
||||
|
||||
```
|
||||
ssh ceph-osd1
|
||||
ssh ceph-osd2
|
||||
ssh ceph-osd3
|
||||
```
|
||||
|
||||
使用 fdisk 命令检查分区表。
|
||||
|
||||
```
|
||||
sudo fdisk -l /dev/sdb
|
||||
```
|
||||
|
||||
格式化 /dev/sdb 分区为 XFS 文件系统,使用 `parted` 命令创建一个 GPT 分区表。
|
||||
|
||||
```
|
||||
sudo parted -s /dev/sdb mklabel gpt mkpart primary xfs 0% 100%
|
||||
```
|
||||
|
||||
下面,使用 `mkfs` 命令格式化分区为 XFS 格式。
|
||||
|
||||
```
|
||||
sudo mkfs.xfs -f /dev/sdb
|
||||
```
|
||||
|
||||
现在检查分区,然后你会看见一个 XFS 文件系统的 /dev/sdb 分区。
|
||||
|
||||
```
|
||||
sudo fdisk -s /dev/sdb
|
||||
sudo blkid -o value -s TYPE /dev/sdb
|
||||
```
|
||||
|
||||
[
|
||||
![Format partition ceph OSD nodes](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/6.png)
|
||||
][13]
|
||||
|
||||
### 第 5 步 - 创建 Ceph 集群
|
||||
|
||||
在这步,我们将从 ceph-admin 安装 Ceph 到所有节点。马上开始,先登录到 ceph-admin 节点。
|
||||
|
||||
```
|
||||
ssh root@ceph-admin
|
||||
su - cephuser
|
||||
```
|
||||
|
||||
#### 在 ceph-admin 节点上安装 ceph-deploy
|
||||
|
||||
首先我们已经在系统上安装了 python 和 python-pip。现在我们需要从 pypi python 仓库安装 Ceph 部署工具 '**ceph-deploy**'。
|
||||
|
||||
用 pip 命令在 ceph-admin 节点安装 ceph-deploy 。
|
||||
|
||||
```
|
||||
sudo pip install ceph-deploy
|
||||
```
|
||||
|
||||
注意: 确保所有节点都已经更新。
|
||||
|
||||
ceph-deploy 工具已经安装完毕后,为 Ceph 集群配置创建一个新目录。
|
||||
|
||||
#### 创建一个新集群
|
||||
|
||||
创建一个新集群目录。
|
||||
|
||||
```
|
||||
mkdir cluster
|
||||
cd cluster/
|
||||
```
|
||||
|
||||
下一步,用 `ceph-deploy` 命令通过定义监控节点 mon1 创建一个新集群。
|
||||
|
||||
```
|
||||
ceph-deploy new mon1
|
||||
```
|
||||
|
||||
命令将在集群目录生成 Ceph 集群配置文件 `ceph.conf`。
|
||||
|
||||
[
|
||||
![Generate new ceph cluster configuration](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/7.png)
|
||||
][14]
|
||||
|
||||
用 vim 编辑 `ceph.conf`。
|
||||
|
||||
```
|
||||
vim ceph.conf
|
||||
```
|
||||
|
||||
在 `[global]` 块下,粘贴下面的配置。
|
||||
|
||||
```
|
||||
# Your network address
|
||||
public network = 10.0.15.0/24
|
||||
osd pool default size = 2
|
||||
```
|
||||
|
||||
保存文件并退出编辑器。
|
||||
|
||||
#### 安装 Ceph 到所有节点
|
||||
|
||||
现在用一个命令从 ceph-admin 节点安装 Ceph 到所有节点。
|
||||
|
||||
```
|
||||
ceph-deploy install ceph-admin ceph-osd1 ceph-osd2 ceph-osd3 mon1
|
||||
```
|
||||
|
||||
命令将自动安装 Ceph 到所有节点:mon1、osd1-3 和 ceph-admin - 安装将花一些时间。
|
||||
|
||||
现在到 mon1 节点部署监控节点。
|
||||
|
||||
```
|
||||
ceph-deploy mon create-initial
|
||||
```
|
||||
|
||||
命令将创建一个监控密钥,用 ceph 命令检查密钥。
|
||||
|
||||
```
|
||||
ceph-deploy gatherkeys mon1
|
||||
```
|
||||
|
||||
[
|
||||
![Deploy key ceph](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/8.png)
|
||||
][15]
|
||||
|
||||
#### 增加 OSD 到集群
|
||||
|
||||
在所有节点上安装了 Ceph 之后,现在我们可以增加 OSD 守护进程到该集群。OSD 守护进程将在磁盘 /dev/sdb 分区上创建数据和日志 。
|
||||
|
||||
检查所有 osd 节点的 /dev/sdb 磁盘可用性。
|
||||
|
||||
```
|
||||
ceph-deploy disk list ceph-osd1 ceph-osd2 ceph-osd3
|
||||
```
|
||||
|
||||
[
|
||||
![disk list of osd nodes](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/9.png)
|
||||
][16]
|
||||
|
||||
你将看见我们之前创建 XFS 格式的 /dev/sdb。
|
||||
|
||||
下面,在所有 OSD 节点上用 zap 选项删除该分区表。
|
||||
|
||||
```
|
||||
ceph-deploy disk zap ceph-osd1:/dev/sdb ceph-osd2:/dev/sdb ceph-osd3:/dev/sdb
|
||||
```
|
||||
|
||||
这个命令将删除所有 Ceph OSD 节点的 /dev/sdb 上的数据。
|
||||
|
||||
现在准备所有 OSD 节点,请确保结果没有报错。
|
||||
|
||||
```
|
||||
ceph-deploy osd prepare ceph-osd1:/dev/sdb ceph-osd2:/dev/sdb ceph-osd3:/dev/sdb
|
||||
```
|
||||
|
||||
当你看到 ceph-osd1-3 结果已经准备好供 OSD 使用,就表明命令已经成功。
|
||||
|
||||
[
|
||||
![Prepare the ceph-osd nodes](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/10.png)
|
||||
][17]
|
||||
|
||||
用下面的命令激活 OSD:
|
||||
|
||||
```
|
||||
ceph-deploy osd activate ceph-osd1:/dev/sdb ceph-osd2:/dev/sdb ceph-osd3:/dev/sdb
|
||||
```
|
||||
|
||||
现在你可以再一次检查 OSDS 节点的 sdb 磁盘。
|
||||
|
||||
```
|
||||
ceph-deploy disk list ceph-osd1 ceph-osd2 ceph-osd3
|
||||
```
|
||||
|
||||
[
|
||||
![Ceph osds activated](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/11.png)
|
||||
][18]
|
||||
|
||||
结果是 /dev/sdb 现在已经分为两个区:
|
||||
|
||||
1. **/dev/sdb1** - Ceph Data
|
||||
2. **/dev/sdb2** - Ceph Journal
|
||||
|
||||
或者你直接在 OSD 节点山检查。
|
||||
|
||||
```
|
||||
ssh ceph-osd1
|
||||
sudo fdisk -l /dev/sdb
|
||||
```
|
||||
|
||||
[
|
||||
![Ceph OSD nodes were created](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/12.png)
|
||||
][19]
|
||||
|
||||
接下来,部署管理密钥到所有关联节点。
|
||||
|
||||
```
|
||||
ceph-deploy admin ceph-admin mon1 ceph-osd1 ceph-osd2 ceph-osd3
|
||||
```
|
||||
|
||||
在所有节点运行下面的命令,改变密钥文件权限。
|
||||
|
||||
```
|
||||
sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
|
||||
```
|
||||
|
||||
Ceph 集群在 Ubuntu 16.04 已经创建完成。
|
||||
|
||||
### 第 6 步 - 测试 Ceph
|
||||
|
||||
在第 4 步,我们已经安装并创建了一个新 Ceph 集群,然后添加了 OSD 节点到集群。现在我们应该测试集群确保它如期工作。
|
||||
|
||||
从 ceph-admin 节点,登录到 Ceph 监控服务器 mon1。
|
||||
|
||||
```
|
||||
ssh mon1
|
||||
```
|
||||
|
||||
运行下面命令来检查集群是否健康。
|
||||
|
||||
```
|
||||
sudo ceph health
|
||||
```
|
||||
|
||||
现在检查集群状态。
|
||||
|
||||
```
|
||||
sudo ceph -s
|
||||
```
|
||||
|
||||
你可以看到下面返回结果:
|
||||
|
||||
[
|
||||
![Ceph Cluster Status](https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/13.png)
|
||||
][20]
|
||||
|
||||
确保 Ceph 健康状态是 `OK` 的,有一个监控节点 mon1 IP 地址为 '**10.0.15.11**'。有 **3 个 OSD** 服务器都是 **up** 状态并且正在运行,可用磁盘空间为 **45GB** - 3x15GB 的 Ceph 数据 OSD 分区。
|
||||
|
||||
我们在 Ubuntu 16.04 建立一个新 Ceph 集群成功。
|
||||
|
||||
### 参考
|
||||
|
||||
* http://docs.ceph.com/docs/jewel/
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/
|
||||
|
||||
作者:[Muhammad Arul][a]
|
||||
译者:[wyangsun](https://github.com/wyangsun)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/
|
||||
[1]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/#step-configure-all-nodes
|
||||
[2]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/#step-configure-the-ssh-server
|
||||
[3]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/#step-configure-the-ubuntu-firewall
|
||||
[4]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/#step-configure-the-ceph-osd-nodes
|
||||
[5]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/#step-build-the-ceph-cluster
|
||||
[6]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/#step-testing-ceph
|
||||
[7]:https://www.howtoforge.com/tutorial/how-to-install-a-ceph-cluster-on-ubuntu-16-04/#reference
|
||||
[8]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/1.png
|
||||
[9]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/2.png
|
||||
[10]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/3.png
|
||||
[11]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/4.png
|
||||
[12]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/5.png
|
||||
[13]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/6.png
|
||||
[14]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/7.png
|
||||
[15]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/8.png
|
||||
[16]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/9.png
|
||||
[17]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/10.png
|
||||
[18]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/11.png
|
||||
[19]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/12.png
|
||||
[20]:https://www.howtoforge.com/images/how-to-install-a-ceph-cluster-on-ubuntu-16-04/big/13.png
|
@ -0,0 +1,128 @@
|
||||
在 Ubuntu 上使用 DokuWiki 构建你自己的 wiki
|
||||
============================================================
|
||||
|
||||
我们在使用 [DokuWiki][2],它是一个真棒的工具。我们团队有一个内部知识库,我们使用 DokuWiki 存储我们的所有评论、教程等。它很简单,并且易于安装和使用。在这篇文章中,我们将展示如何在 Ubuntu 16.04 服务器上安装 DokuWiki。
|
||||
|
||||
### 需求
|
||||
|
||||
DokuWiki 不需要太多依赖,因为它不需要数据库。这里是 DokuWiki 的要求:
|
||||
|
||||
* PHP 5.3.4 或更高版本(建议使用 PHP 7+)
|
||||
* 一台 web 服务器(Apache/Nginx/任何其他)
|
||||
* 一台 VPS。[买一台便宜的托管 VPS][1],那么你就不必这样做了。你只需与支持团队联系,他们将会为您安装。
|
||||
|
||||
### 指导
|
||||
|
||||
在你开始之前,你应该升级你的系统。运行下面的命令:
|
||||
|
||||
```
|
||||
sudo apt-get update && sudo apt-get upgrade
|
||||
```
|
||||
|
||||
### 安装 Apache
|
||||
|
||||
我们需要一台用于我们 wiki 的 web 服务器。我们在本教程中使用 Apache,但你也可以使用 Nginx 或任何其他 web 服务器。用下面的命令安装apache:
|
||||
|
||||
```
|
||||
apt-get install apache2
|
||||
```
|
||||
|
||||
### 安装 PHP7 和模块
|
||||
|
||||
接下来,如果你还没有安装 PHP,你应该先安装 PHP。在本教程中,我们使用 PHP7。所以请使用下面的命令安装 PHP7 和一些其他 PHP 模块:
|
||||
|
||||
```
|
||||
apt-get install php7.0-fpm php7.0-cli php-apcu php7.0-gd php7.0-xml php7.0-curl php7.0-json php7.0-mcrypt php7.0-cgi php7.0 libapache2-mod-php7.0
|
||||
```
|
||||
|
||||
### 下载安装 DokuWiki
|
||||
|
||||
下面就来到主要部分了 - 实际安装 DokuWiki。
|
||||
|
||||
首先,为你的 DokuWiki 创建一个目录:
|
||||
|
||||
```
|
||||
mkdir -p /var/www/thrwiki
|
||||
```
|
||||
|
||||
进入你刚才创建的目录:
|
||||
|
||||
```
|
||||
cd /var/www/thrwiki
|
||||
```
|
||||
|
||||
运行下面的命令来下载最新(稳定)的 DokuWiki:
|
||||
|
||||
```
|
||||
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz
|
||||
```
|
||||
|
||||
解压 .tgz 文件:
|
||||
|
||||
```
|
||||
tar xvf dokuwiki-stable.tgz
|
||||
```
|
||||
|
||||
更改文件/文件夹权限:
|
||||
|
||||
```
|
||||
www-data:www-data -R /var/www/thrwiki
|
||||
chmod -R 707 /var/www/thrwiki
|
||||
```
|
||||
|
||||
### 为 DokuWiki 配置 Apache
|
||||
|
||||
为你的 DokuWiki 创建一个 .conf 文件(我们把它命名为 `thrwiki.conf`,但是你可以把它命名成任何你想要的),并用你喜欢的文本编辑器打开。我们使用 nano:
|
||||
|
||||
```
|
||||
touch /etc/apache2/sites-available/thrwiki.conf
|
||||
ln -s /etc/apache2/sites-available/thrwiki.conf /etc/apache2/sites-enabled/thrwiki.conf
|
||||
nano /etc/apache2/sites-available/thrwiki.conf
|
||||
```
|
||||
|
||||
下面是 thrwiki.conf 中的内容:
|
||||
|
||||
```
|
||||
<VirtualHost yourServerIP:80>
|
||||
ServerAdmin wikiadmin@thishosting.rocks
|
||||
DocumentRoot /var/www/thrwiki/
|
||||
ServerName wiki.thishosting.rocks
|
||||
ServerAlias www.wiki.thishosting.rocks
|
||||
<Directory /var/www/thrwiki/>
|
||||
Options FollowSymLinks
|
||||
AllowOverride All
|
||||
Order allow,deny
|
||||
allow from all
|
||||
</Directory>
|
||||
ErrorLog /var/log/apache2/wiki.thishosting.rocks-error_log
|
||||
CustomLog /var/log/apache2/wiki.thishosting.rocks-access_log common
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
编辑与你服务器相关的行。将 `wikiadmin@thishosting.rocks`、`wiki.thishosting.rocks` 替换成你自己的数据,重启 apache 使更改生效:
|
||||
|
||||
```
|
||||
systemctl restart apache2.service
|
||||
```
|
||||
|
||||
就是这样了。现在已经配置完成了。现在你可以继续通过前端页面 http://wiki.thishosting.rocks/install.php 安装配置 DokuWiki 了。安装完成后,你可以用下面的命令删除 install.php:
|
||||
|
||||
```
|
||||
rm -f /var/www/html/thrwiki/install.php
|
||||
```
|
||||
|
||||
如果你需要任何帮助,请随意留下评论。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://thishosting.rocks/build-your-own-wiki-on-ubuntu-with-dokuwiki/
|
||||
|
||||
作者:[thishostrocks.com][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://twitter.com/thishostrocks
|
||||
[1]:https://thishosting.rocks/best-cheap-managed-vps/
|
||||
[2]:https://github.com/splitbrain/dokuwiki
|
@ -0,0 +1,62 @@
|
||||
5 个让你的 WordPress 网站安全的技巧
|
||||
============================================================
|
||||
|
||||
![](https://www.rosehosting.com/blog/wp-content/uploads/2017/01/tips-for-securing-wp.jpg)
|
||||
|
||||
WordPress 是迄今为止最流行的博客平台。
|
||||
|
||||
正由于它的流行,也因此带来了正面和负面的影响。事实上,几乎每个人都使用它,使它更容易被发现漏洞。WordPress 的开发人员做了很多工作,一旦新的缺陷被发现,就会发布修复和补丁,但这并不意味着你可以安装完就置之脑后。
|
||||
|
||||
在这篇文章中,我们将提供一些最常见的保护和强化 WordPress 网站的方法。
|
||||
|
||||
### 在登录后台时总是使用 SSL
|
||||
|
||||
不用说的是,如果你并不打算只是做一个随意的博客,你应该总是使用 SSL。不使用加密连接登录到你的网站会暴露你的用户名和密码。任何人嗅探流量都可能会发现你的密码。如果你使用 WiFi 上网或者连接到一个公共热点,那么你被黑的几率更高,这是特别真实的。你可以从[这里][1]获取受信任的免费 SSL 证书。
|
||||
|
||||
### 精心挑选附加的插件
|
||||
|
||||
由第三方开发人员所开发,每个插件的质量和安全性总是值得怀疑,并且它仅取决于其开发人员的经验。当安装任何额外的插件时,你应该仔细选择,并考虑其受欢迎程度以及插件的维护频率。应该避免维护不良的插件,因为它们更容易出现易于被利用的错误和漏洞。
|
||||
|
||||
此主题也是上一个关于 SSL 主题的补充,因为许多插件包含的脚本会发出不安全连接(HTTP)的请求。只要你的网站通过 HTTP 访问,一切似乎很好。但是,一旦你决定使用加密并强制使用 SSL 访问,则会立即导致网站的功能被破坏,因为当你使用 HTTPS 访问其他网站时,这些插件上的脚本将继续通过 HTTP 提供请求。
|
||||
|
||||
### 安装 Wordfence
|
||||
|
||||
Wordfence 是由 Feedjit Inc. 开发的,Wordfence 是目前最流行的 WordPress 安全插件,并且是每个严肃的 WordPress 网站必备的,特别是那些使用 [WooCommerce][2] 或其它的 WordPress 电子商务平台的网站。
|
||||
|
||||
Wordfence 不只是一个插件,因为它提供了一系列加强您的网站的安全功能。它具有 web 程序防火墙、恶意软件扫描、实时流量分析器和各种其它工具,它们可以提高你网站的安全性。防火墙将默认阻止恶意登录尝试,甚至可以配置为按照 IP 地址范围来阻止整个国家/地区的访问。我们真正喜欢 Wordfence 的原因是,即使你的网站因为某些原因被侵害,例如恶意脚本,Wordfence 可以在安装以后扫描和清理你的网站上被感染的文件。
|
||||
|
||||
该公司提供这个插件的免费和付费订阅计划,但即使是免费计划,你的网站仍将获得令人满意的水平。
|
||||
|
||||
### 用额外的密码锁住 /wp-admin 和 /wp-login.php
|
||||
|
||||
保护你的 WordPress 后端的另一个步骤是使用额外的密码保护任何除了你以外不打算让任何人使用的目录(即URL)。 /wp-admin 目录属于此关键目录列表。 如果你不允许普通用户登录 WordPress,你应该使用密码限制对 wp.login.php 文件的访问。无论是使用 [Apache][3] 还是 [Nginx][4],你都可以访问这两篇文章,了解如何额外保护 WordPress 安装。
|
||||
|
||||
### 禁用/停止用户枚举
|
||||
|
||||
这是攻击者发现你网站上的有效用户名的一种相当简单的方法(即找出管理员用户名)。那么它是如何工作的?这很简单。在任何 WordPress 站点上的主要 URL 后面跟上 `/?author=1` 即可。 例如:`wordpressexample.com/?author=1`。
|
||||
|
||||
要保护您的网站免受此影响,只需安装[停止用户枚举][5]插件。
|
||||
|
||||
### 禁用 XML-RPC
|
||||
|
||||
RPC 代表远程过程调用,它可以用来从位于网络上另一台计算机上的程序请求服务的协议。对于 WordPress 来说,XML-RPC 允许你使用流行的网络博客客户端(如 Windows Live Writer)在你的 WordPress 博客上发布文章,如果你使用 WordPress 移动应用程序那么也需要它。 XML-RPC 在早期版本中被禁用,但是从 WordPress 3.5 时它被默认启用,这让你的网站面临更大的攻击可能。虽然各种安全研究人员建议这不是一个大问题,但如果你不打算使用网络博客客户端或 WP 的移动应用程序,你应该禁用 XML-RPC 服务。
|
||||
|
||||
有多种方法可以做到这一点,最简单的是安装[禁用 XML-RPC][6]插件。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.rosehosting.com/blog/5-tips-for-securing-your-wordpress-sites/
|
||||
|
||||
作者:[rosehosting.com][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:rosehosting.com
|
||||
[1]:https://letsencrypt.org/
|
||||
[2]:https://www.rosehosting.com/woocommerce-hosting.html
|
||||
[3]:https://www.rosehosting.com/blog/password-protect-a-directory-using-htaccess/
|
||||
[4]:https://www.rosehosting.com/blog/password-protecting-directories-with-nginx/
|
||||
[5]:https://wordpress.org/plugins/stop-user-enumeration/
|
||||
[6]:https://wordpress.org/plugins/disable-xml-rpc/
|
@ -0,0 +1,357 @@
|
||||
shell 脚本之始
|
||||
============================================================
|
||||
|
||||
![脚本之始](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_terminals.png?itok=QmkPW7P1 "Getting started with shell scripting")
|
||||
|
||||
图片引用自:[ajmexico][1],[Jason Baker][2] 修改。 [CC BY-SA 2.0][3]。
|
||||
|
||||
世界上对 shell 脚本最好的概念性介绍来自一个老的 [AT&T 培训视频][4] 。在视频中,Brian W. Kernighan(**awk** 中的“K”),Lorinda L. Cherry(**bc** 作者之一)论证了 UNIX 的基础原则之一是让用户利用现有的实用程序来定制和创建复杂的工具。
|
||||
|
||||
用 [Kernighan][5] 的话来说:“UNIX 系统程序基本上是 …… 你可以用来创造东西的构件。…… 管道的概念是 [UNIX] 系统的基础;你可以拿一堆程序 …… 并将它们端到端连接到一起,使数据从左边的一个流到右边的一个,由系统本身管着所有的连接。程序本身不知道任何关于连接的事情;对它们而言,它们只是在与终端对话。”
|
||||
|
||||
他说的是给普通用户以编程的能力。
|
||||
|
||||
POSIX 操作系统本身就像是一个 API。如果你能弄清楚如何在 POSIX 的 shell 中完成一个任务,那么你可以自动化这个任务。这就是编程,这种日常 POSIX 编程方法的主要方式就是 shell 脚本。
|
||||
|
||||
像它的名字那样,shell _脚本_ 是一行一行你想让你的计算机执行的语句,就像你手动的一样。
|
||||
|
||||
因为 shell 脚本包含常见的日常命令,所以熟悉 UNIX 或 Linux(通常称为 **POSIX** 系统)对 shell 是有帮助的。你使用 shell 的经验越多,就越容易编写新的脚本。这就像学习外语:你心里的词汇越多,组织复杂的句子就越容易。
|
||||
|
||||
当您打开终端窗口时,就是打开了 _shell_ 。shell 有好几种,本教程适用于 **bash**、**tcsh**、**ksh**、**zsh** 和其它几个。在下面几个部分,我提供一些 bash 特定的例子,但最终的脚本不会用那些,所以你可以切换到 bash 中学习设置变量的课程,或做一些简单的[语法调整][6]。
|
||||
|
||||
如果你是新手,只需使用 **bash** 。它是一个很好的 shell,有许多友好的功能,它是 Linux、Cygwin、WSL、Mac 默认的 shell,并且在 BSD 上也支持。
|
||||
|
||||
### Hello world
|
||||
|
||||
您可以从终端窗口生成您自己的 **hello world** 脚本 。注意你的引号;单和双都会有不同的效果(LCTT 译注:想必你不会在这里使用中文引号吧)。
|
||||
|
||||
```
|
||||
$ echo "#\!/bin/sh" > hello.sh
|
||||
$ echo "echo 'hello world' " >> hello.sh
|
||||
```
|
||||
|
||||
正如你所看到的,编写 shell 脚本就是这样,除了第一行之外,就是把命令“回显”或粘贴到文本文件中而已。
|
||||
|
||||
像应用程序一样运行脚本:
|
||||
|
||||
```
|
||||
$ chmod +x hello.sh
|
||||
$ ./hello.sh
|
||||
hello world
|
||||
```
|
||||
|
||||
不管多少,这就是一个 shell 脚本了。
|
||||
|
||||
现在让我们处理一些有用的东西。
|
||||
|
||||
### 去除空格
|
||||
|
||||
如果有一件事情会干扰计算机和人类的交互,那就是文件名中的空格。您在互联网上看到过:http://example.com/omg%2ccutest%20cat%20photophoto%21%211.jpg** 等网址。或者,当你不管不顾地运行一个简单的命令时,文件名中的空格会让你掉到坑里:
|
||||
|
||||
```
|
||||
$ cp llama pic.jpg ~/photos
|
||||
cp: cannot stat 'llama': No such file or directory
|
||||
cp: cannot stat 'pic.jpg': No such file or directory
|
||||
```
|
||||
|
||||
解决方案是用反斜杠来“转义”空格,或使用引号:
|
||||
|
||||
```
|
||||
$ touch foo\ bar.txt
|
||||
$ ls "foo bar.txt"
|
||||
foo bar.txt
|
||||
```
|
||||
|
||||
这些都是要知道的重要的技巧,但是它并不方便,为什么不写一个脚本从文件名中删除这些烦人的空格?
|
||||
|
||||
创建一个文件来保存脚本,以释伴(shebang)(**#!**) 开头,让系统知道文件应该在 shell 中运行:
|
||||
|
||||
```
|
||||
$ echo '#!/bin/sh' > despace
|
||||
```
|
||||
|
||||
好的代码要从文档开始。定义好目的让我们知道要做什么。这里有一个很好的 README:
|
||||
|
||||
```
|
||||
despace is a shell script for removing spaces from file names.
|
||||
|
||||
Usage:
|
||||
$ despace "foo bar.txt"
|
||||
```
|
||||
|
||||
现在让我们弄明白如何手动做,并且如何去构建脚本。
|
||||
|
||||
假设你有个只有一个 "foo bar.txt" 文件的目录,比如:
|
||||
|
||||
```
|
||||
$ ls
|
||||
hello.sh
|
||||
foo bar.txt
|
||||
```
|
||||
|
||||
计算机无非就是输入和输出而已。在这种情况下,输入是 `ls` 特定目录的请求。输出是您所期望的结果:该目录文件的名称。
|
||||
|
||||
在 UNIX 中,可以通过“管道”将输出作为另一个命令的输入,无论在管道的另一侧是什么过滤器。 `tr` 程序恰好设计为专门修改传输给它的字符串;对于这个例子,可以使用 `--delete` 选项删除引号中定义的字符。
|
||||
|
||||
```
|
||||
$ ls "foo bar.txt" | tr --delete ' '
|
||||
foobar.txt
|
||||
```
|
||||
|
||||
现在你得到了所需的输出了。
|
||||
|
||||
在 BASH shell 中,您可以将输出存储为**变量** 。变量可以视为将信息存储到其中的空位:
|
||||
|
||||
```
|
||||
$ NAME=foo
|
||||
```
|
||||
|
||||
当您需要返回信息时,可以通过在变量名称前面缀上美元符号(**$** )来引用该位置。
|
||||
|
||||
```
|
||||
$ echo $NAME
|
||||
foo
|
||||
```
|
||||
|
||||
要获得您的这个去除空格后的输出并将其放在一边供以后使用,请使用一个变量。将命令的_结果_放入变量,使用反引号(`)来完成:
|
||||
|
||||
```
|
||||
$ NAME=`ls "foo bar.txt" | tr -d ' '`
|
||||
$ echo $NAME
|
||||
foobar.txt
|
||||
```
|
||||
|
||||
我们完成了一半的目标,现在可以从源文件名确定目标文件名了。
|
||||
|
||||
到目前为止,脚本看起来像这样:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
NAME=`ls "foo bar.txt" | tr -d ' '`
|
||||
echo $NAME
|
||||
```
|
||||
|
||||
第二部分必须执行重命名操作。现在你可能已经知道这个命令:
|
||||
|
||||
```
|
||||
$ mv "foo bar.txt" foobar.txt
|
||||
```
|
||||
|
||||
但是,请记住在脚本中,您正在使用一个变量来保存目标名称。你已经知道如何引用变量:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
NAME=`ls "foo bar.txt" | tr -d ' '`
|
||||
echo $NAME
|
||||
mv "foo bar.txt" $NAME
|
||||
```
|
||||
|
||||
您可以将其标记为可执行文件并在测试目录中运行它。确保您有一个名为 foo bar.txt(或您在脚本中使用的其它名字)的测试文件。
|
||||
|
||||
```
|
||||
$ touch "foo bar.txt"
|
||||
$ chmod +x despace
|
||||
$ ./despace
|
||||
foobar.txt
|
||||
$ ls
|
||||
foobar.txt
|
||||
```
|
||||
|
||||
### 去除空格 v2.0
|
||||
|
||||
脚本可以正常工作,但不完全如您的文档所述。它目前非常具体,只适用于一个名为 `foo\ bar.txt` 的文件,其它都不适用。
|
||||
|
||||
POSIX 命令会将其命令自身称为 `$0`,并将其后键入的任何内容依次命名为 `$1`,`$2`,`$3` 等。您的 shell 脚本作为 POSIX 命令也可以这样计数,因此请尝试用 `$1` 来替换 `foo\ bar.txt` 。
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
NAME=`ls $1 | tr -d ' '`
|
||||
echo $NAME
|
||||
mv $1 $NAME
|
||||
```
|
||||
|
||||
创建几个新的测试文件,在名称中包含空格:
|
||||
|
||||
```
|
||||
$ touch "one two.txt"
|
||||
$ touch "cat dog.txt"
|
||||
```
|
||||
|
||||
然后测试你的新脚本:
|
||||
|
||||
```
|
||||
$ ./despace "one two.txt"
|
||||
ls: cannot access 'one': No such file or directory
|
||||
ls: cannot access 'two.txt': No such file or directory
|
||||
```
|
||||
|
||||
看起来您发现了一个 bug!
|
||||
|
||||
这实际上不是一个 bug,一切都按设计工作,但不是你想要的。你的脚本将 `$1` 变量真真切切地 “扩展” 成了:“one two.txt”,捣乱的就是你试图消除的那个麻烦的空格。
|
||||
|
||||
解决办法是将变量用以引号封装文件名的方式封装变量:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
NAME=`ls "$1" | tr -d ' '`
|
||||
echo $NAME
|
||||
mv "$1" $NAME
|
||||
```
|
||||
|
||||
再做个测试:
|
||||
|
||||
```
|
||||
$ ./despace "one two.txt"
|
||||
onetwo.txt
|
||||
$ ./despace c*g.txt
|
||||
catdog.txt
|
||||
```
|
||||
|
||||
此脚本的行为与任何其它 POSIX 命令相同。您可以将其与其他命令结合使用,就像您希望的使用的任何 POSIX 程序一样。您可以将其与命令结合使用:
|
||||
|
||||
```
|
||||
$ find ~/test0 -type f -exec /path/to/despace {} \;
|
||||
```
|
||||
|
||||
或者你可以使用它作为循环的一部分:
|
||||
|
||||
```
|
||||
$ for FILE in ~/test1/* ; do /path/to/despace $FILE ; done
|
||||
```
|
||||
|
||||
等等。
|
||||
|
||||
### 去除空格 v2.5
|
||||
|
||||
这个去除脚本已经可以发挥功用了,但在技术上它可以优化,它可以做一些可用性改进。
|
||||
|
||||
首先,变量实际上并不需要。 shell 可以一次计算所需的信息。
|
||||
|
||||
POSIX shell 有一个操作顺序。在数学中使用同样的方式来首先处理括号中的语句,shell 在执行命令之前会先解析反引号或 Bash 中的 `$()` 。因此,下列语句:
|
||||
|
||||
```
|
||||
$ mv foo\ bar.txt `ls foo\ bar.txt | tr -d ' '`
|
||||
```
|
||||
|
||||
会变换成:
|
||||
|
||||
```
|
||||
$ mv foo\ bar.txt foobar.txt
|
||||
```
|
||||
|
||||
然后实际的 `mv` 命令执行,就得到了 **foobar.txt** 文件。
|
||||
|
||||
知道这一点,你可以将该 shell 脚本压缩成:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
mv "$1" `ls "$1" | tr -d ' '`
|
||||
```
|
||||
|
||||
这看起来简单的令人失望。你可能认为它使脚本减少为一个单行并没有必要,但没有几行的 shell 脚本是有意义的。即使一个用简单的命令写的紧缩的脚本仍然可以防止你发生致命的打字错误,这在涉及移动文件时尤其重要。
|
||||
|
||||
此外,你的脚本仍然可以改进。更多的测试发现了一些弱点。例如,运行没有参数的 `despace` 会产生一个没有意义的错误:
|
||||
|
||||
```
|
||||
$ ./despace
|
||||
ls: cannot access '': No such file or directory
|
||||
|
||||
mv: missing destination file operand after ''
|
||||
Try 'mv --help' for more information.
|
||||
```
|
||||
|
||||
这些错误是让人迷惑的,因为它们是针对 `ls` 和 `mv` 发出的,但就用户所知,它运行的不是 `ls` 或 `mv`,而是 `despace` 。
|
||||
|
||||
如果你想一想,如果它没有得到一个文件作为命令的一部分,这个小脚本甚至不应该尝试去重命名文件,请尝试使用你知道的变量以及 `test` 功能来解决。
|
||||
|
||||
|
||||
### if 和 test
|
||||
|
||||
`if` 语句将把你的小 despace 实用程序从脚本蜕变成程序。这里面涉及到代码领域,但不要担心,它也很容易理解和使用。
|
||||
|
||||
`if` 语句是一种开关;如果某件事情是真的,那么你会做一件事,如果它是假的,你会做不同的事情。这个 `if-then` 指令的二分决策正好是计算机是擅长的;你需要做的就是为计算机定义什么是真或假以及并最终执行什么。
|
||||
|
||||
测试真或假的最简单的方法是 `test` 实用程序。你不用直接调用它,使用它的语法即可。在终端试试:
|
||||
|
||||
```
|
||||
$ if [ 1 == 1 ]; then echo "yes, true, affirmative"; fi
|
||||
yes, true, affirmative
|
||||
$ if [ 1 == 123 ]; then echo "yes, true, affirmative"; fi
|
||||
$
|
||||
```
|
||||
|
||||
这就是 `test` 的工作方式。你有各种方式的简写可供选择,这里使用的是 `-z` 选项,它检测字符串的长度是否为零(0)。将这个想法翻译到你的 despace 脚本中就是:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Provide a \"file name\", using quotes to nullify the space."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mv "$1" `ls "$1" | tr -d ' '`
|
||||
```
|
||||
|
||||
为了提高可读性,`if` 语句被放到单独的行,但是其概念仍然是:如果 `$1` 变量中的数据为空(零个字符存在),则打印一个错误语句。
|
||||
|
||||
尝试一下:
|
||||
|
||||
```
|
||||
$ ./despace
|
||||
Provide a "file name", using quotes to nullify the space.
|
||||
$
|
||||
```
|
||||
成功!
|
||||
|
||||
好吧,其实这是一个失败,但它是一个_漂亮的_失败,更重要的是,一个_有意义_的失败。
|
||||
|
||||
注意语句 `exit 1` 。这是 POSIX 应用程序遇到错误时向系统发送警报的一种方法。这个功能对于需要在脚本中使用 despace ,并依赖于它成功执行才能顺利运行的你或其它人来说很重要。
|
||||
|
||||
最后的改进是添加一些东西,以保护用户不会意外覆盖文件。理想情况下,您可以将此选项传递给脚本,所以它是可选的;但为了简单起见,这里对其进行了硬编码。 `-i` 选项告诉 `mv` 在覆盖已存在的文件之前请求许可:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Provide a \"file name\", using quotes to nullify the space."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mv -i "$1" `ls "$1" | tr -d ' '`
|
||||
```
|
||||
|
||||
现在你的 shell 脚本是有意义的、有用的、友好的 - 你是一个程序员了,所以不要停。学习新命令,在终端中使用它们,记下您的操作,然后编写脚本。最终,你会把自己从工作中解脱出来,当你的机器仆人运行 shell 脚本,接下来的生活将会轻松。
|
||||
|
||||
Happy hacking!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/penguinmedallion200x200.png?itok=ROQSR50J)
|
||||
|
||||
Seth Kenlon 是一位独立的多媒体艺术家,自由文化倡导者和 UNIX 极客。他是基于 Slackware 的多媒体制作项目(http://slackermedia.ml)的维护者之一
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/1/getting-started-shell-scripting
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
译者:[hkurj](https://github.com/hkurj)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/seth
|
||||
[1]:https://www.flickr.com/photos/15587432@N02/3281139507/
|
||||
[2]:https://opensource.com/users/jason-baker
|
||||
[3]:https://creativecommons.org/licenses/by/2.0/
|
||||
[4]:https://youtu.be/XvDZLjaCJuw
|
||||
[5]:https://youtu.be/tc4ROCJYbm0
|
||||
[6]:http://hyperpolyglot.org/unix-shells
|
@ -0,0 +1,193 @@
|
||||
在 Linux 中如何使用 gdb 调试 C 程序
|
||||
============================================================
|
||||
|
||||
无论多么有经验的程序员,开发的任何软件都不可能完全没有 bug。因此,排查及修复 bug 成为软件开发周期中最重要的任务之一。有许多办法可以排查 bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。
|
||||
|
||||
如果你是 C/C++ 程序员,或者使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 - [GDB][4] - 可以帮你更轻松地调试代码 bug 以及其它问题。在这篇文章中,我们将讨论一下 GDB 调试器的基础知识,包括它提供的一些有用的功能/选项。
|
||||
|
||||
在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在 Ubuntu 14.04 LTS 中测试过。教程中的示例代码都是 C 语言写的;使用的 shell 为 bash(4.3.11);GDB 版本为 7.7.1。
|
||||
|
||||
### GDB 调试器基础
|
||||
|
||||
通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论 GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。
|
||||
|
||||
首先,为了能够顺利使用类似 GDB 这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用 gcc 编译器(我们将在本教程之后的章节用它来编译 C 程序示例)编译代码的时候,你需要使用 `-g` 命令行选项。
|
||||
|
||||
想要了解 gcc 编译器手册页中关于 `-g` 命令行选项相关的内容,请看[这里][5]。
|
||||
|
||||
下一步,确保在你的系统中已经安装 GDB 调试器。如果没有安装,而且你使用的是基于 Debian 的系统(如 Ubuntu),那么你就可以使用以下命令轻松安装该工具:
|
||||
|
||||
```
|
||||
sudo apt-get install gdb
|
||||
```
|
||||
|
||||
在其他发行版上的安装方法,请看[这里][6]。
|
||||
|
||||
现在,当你按照上述的方式编译完程序(`gcc -g` 命令行选项),同时也已经安装好 GDB 调试器,那么你就可以使用以下命令让程序在调试模式中运行:
|
||||
|
||||
```
|
||||
gdb [可执行程序的名称]
|
||||
```
|
||||
|
||||
这样做会初始化 GDB 调试器,但你的可执行程序此时还不会被启动。在这个时候你就可以定义调试相关的设置。例如,你可以在特定行或函数中设置一个断点让 GDB 在该行暂停程序的执行。
|
||||
|
||||
接着,为了启动你的程序,你必须输入执行以下 gdb 命令:
|
||||
|
||||
```
|
||||
run
|
||||
```
|
||||
|
||||
在这里,值得一提的是,如果你的程序需要一些命令行参数,那么你可以在这里指定这些参数。例如:
|
||||
|
||||
```
|
||||
run [arguments]
|
||||
```
|
||||
|
||||
GDB 提供了很多有用的命令,在调试的时候总是能派的上用场。我们将在下一节讨论其中一部分命令。
|
||||
|
||||
### GDB 调试器用例
|
||||
|
||||
现在我们对 GDB 及其用法有了基本的概念。因此,让我们举例来应用所学的知识。这是一段示例代码:
|
||||
|
||||
```
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
int out = 0, tot = 0, cnt = 0;
|
||||
int val[] = {5, 54, 76, 91, 35, 27, 45, 15, 99, 0};
|
||||
|
||||
while(cnt < 10)
|
||||
{
|
||||
out = val[cnt];
|
||||
tot = tot + 0xffffffff/out;
|
||||
cnt++;
|
||||
}
|
||||
|
||||
printf("\n Total = [%d]\n", tot);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
简单说明一下这段代码要做什么事。获取 `val` 数组中每一个值,将其赋值给 `out` 变量,然后将 `tot` 之前的值与 `0xffffffff/out` 的结果值累加,赋值给 `tot` 变量。
|
||||
|
||||
这里遇到的问题是,当执行这段代码编译后的可执行程序时,产生以下错误:
|
||||
|
||||
```
|
||||
$ ./gdb-test
|
||||
Floating point exception (core dumped)
|
||||
```
|
||||
|
||||
因此,要调试这段代码,第一步是使用 `-g` 选项编译程序。命令如下:
|
||||
|
||||
```
|
||||
gcc -g -Wall gdb-test.c -o gdb-test
|
||||
```
|
||||
|
||||
接着,让我们运行 GDB 调试器并指定要调试的可执行程序。命令如下:
|
||||
|
||||
```
|
||||
gdb ./gdb-test
|
||||
```
|
||||
|
||||
现在,我刚才得到的错误是 `Floating point exception`,大部分人可能已经知道,这是因为 `n % x`,当 x 为 0 时导致的错误。所以,考虑到这一点,我在 11 行代码除法运算的位置处添加了一个断点。如下:
|
||||
|
||||
```
|
||||
(gdb) break 11
|
||||
```
|
||||
|
||||
注意 `(gdb)` 是调试器的提示信息,我只输入了 `break 11` 命令。
|
||||
|
||||
现在,让 GDB 开始运行程序:
|
||||
|
||||
```
|
||||
run
|
||||
```
|
||||
|
||||
当断点第一次被命中时,GDB 显示如下输出:
|
||||
|
||||
```
|
||||
Breakpoint 1, main () at gdb-test.c:11
|
||||
11 tot = tot + 0xffffffff/out;
|
||||
(gdb)
|
||||
```
|
||||
|
||||
正如你所看到的那样,调试器会显示断点所在的行代码。现在,让我们打印出此时 `out` 的值。如下:
|
||||
|
||||
```
|
||||
(gdb) print out
|
||||
$1 = 5
|
||||
(gdb)
|
||||
```
|
||||
|
||||
如上所示,值 `5` 被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 `c` 命令来完成:
|
||||
|
||||
```
|
||||
c
|
||||
```
|
||||
|
||||
重复上述操作,直到 `out` 值变为 `0` 时。
|
||||
|
||||
```
|
||||
...
|
||||
...
|
||||
...
|
||||
Breakpoint 1, main () at gdb-test.c:11
|
||||
11 tot = tot + 0xffffffff/out;
|
||||
(gdb) print out
|
||||
$2 = 99
|
||||
(gdb) c
|
||||
Continuing.
|
||||
|
||||
Breakpoint 1, main () at gdb-test.c:11
|
||||
11 tot = tot + 0xffffffff/out;
|
||||
(gdb) print out
|
||||
$3 = 0
|
||||
(gdb)
|
||||
```
|
||||
|
||||
现在,为了进一步确认问题,我使用 GDB 的 `s`(或 `step`) 命令代替 `c` 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。
|
||||
|
||||
以下是执行之后输出信息:
|
||||
|
||||
```
|
||||
(gdb) s
|
||||
|
||||
Program received signal SIGFPE, Arithmetic exception.
|
||||
0x080484aa in main () at gdb-test.c:11
|
||||
11 tot = tot + 0xffffffff/out;
|
||||
```
|
||||
|
||||
是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行 `s` 命令时,问题最终也得到了确认:
|
||||
|
||||
```
|
||||
(gdb) s
|
||||
|
||||
Program terminated with signal SIGFPE, Arithmetic exception.
|
||||
The program no longer exists.
|
||||
```
|
||||
|
||||
通过这种方式,你就可以使用 GDB 调试你的程序。
|
||||
|
||||
### 总结
|
||||
|
||||
GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.howtoforge.com/tutorial/how-to-debug-c-programs-in-linux-using-gdb/
|
||||
|
||||
作者:[Ansh][a]
|
||||
译者:[zhb127](https://github.com/zhb127)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.howtoforge.com/tutorial/how-to-debug-c-programs-in-linux-using-gdb/
|
||||
[1]:https://www.howtoforge.com/tutorial/how-to-debug-c-programs-in-linux-using-gdb/#gdb-debugger-basics
|
||||
[2]:https://www.howtoforge.com/tutorial/how-to-debug-c-programs-in-linux-using-gdb/#gdb-usage-example
|
||||
[3]:https://www.howtoforge.com/tutorial/how-to-debug-c-programs-in-linux-using-gdb/#conclusion
|
||||
[4]:https://www.sourceware.org/gdb/
|
||||
[5]:https://linux.die.net/man/1/gcc
|
||||
[6]:https://www.sourceware.org/gdb/download/
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user