检查 Linux 中内存使用情况的 8 条命令

# 检查 Linux 中内存使用情况的 8 条命令

Linux 并不像 Windows，你经常不会有图形界面可供使用，特别是在服务器环境中。

作为一名 Linux 管理员，知道如何获取当前可用的和已经使用的资源情况，比如内存、CPU、磁盘等，是相当重要的。如果某一应用在你的系统上占用了太多的资源，导致你的系统无法达到最优状态，那么你需要找到并修正它。

如果你想找到消耗内存前十名的进程，你需要去阅读这篇文章：[如何在 Linux 中找出内存消耗最大的进程](/article-11542-1.html)。

在 Linux 中，命令能做任何事，所以使用相关命令吧。在这篇教程中，我们将会给你展示 8 个有用的命令来即查看在 Linux 系统中内存的使用情况，包括 RAM 和交换分区。

创建交换分区在 Linux 系统中是非常重要的，如果你想了解如何创建，可以去阅读这篇文章：[在 Linux 系统上创建交换分区](/article-9579-1.html)。

下面的命令可以帮助你以不同的方式查看 Linux 内存使用情况。

* `free` 命令
* `/proc/meminfo` 文件
* `vmstat` 命令
* `ps_mem` 命令
* `smem` 命令
* `top` 命令
* `htop` 命令
* `glances` 命令

### 1）如何使用 free 命令查看 Linux 内存使用情况

[free 命令](/article-8314-1.html) 是被 Linux 管理员广泛使用的主要命令。但是它提供的信息比 `/proc/meminfo` 文件少。

`free` 命令会分别展示物理内存和交换分区内存中已使用的和未使用的数量，以及内核使用的缓冲区和缓存。

这些信息都是从 `/proc/meminfo` 文件中获取的。

```
# free -m
              total        used        free      shared  buff/cache   available
Mem:          15867        9199        1702        3315        4965        3039
Swap:         17454         666       16788
```

* `total`：总的内存量
* `used`：被当前运行中的进程使用的内存量（`used` = `total` – `free` – `buff/cache`）
* `free`： 未被使用的内存量（`free` = `total` – `used` – `buff/cache`）
* `shared`： 在两个或多个进程之间共享的内存量
* `buffers`： 内存中保留用于内核记录进程队列请求的内存量
* `cache`： 在 RAM 中存储最近使用过的文件的页缓冲大小
* `buff/cache`： 缓冲区和缓存总的使用内存量
* `available`： 可用于启动新应用的可用内存量（不含交换分区）

### 2) 如何使用 /proc/meminfo 文件查看 Linux 内存使用情况

`/proc/meminfo` 文件是一个包含了多种内存使用的实时信息的虚拟文件。它展示内存状态单位使用的是 kB，其中大部分属性都难以理解。然而它也包含了内存使用情况的有用信息。

```
# cat /proc/meminfo

MemTotal:       16248572 kB
MemFree:         1764576 kB
MemAvailable:    3136604 kB
Buffers:          234132 kB
Cached:          4731288 kB
SwapCached:        28516 kB
Active:          9004412 kB
Inactive:        3552416 kB
Active(anon):    8094128 kB
Inactive(anon):  2896064 kB
Active(file):     910284 kB
Inactive(file):   656352 kB
Unevictable:          80 kB
Mlocked:              80 kB
SwapTotal:      17873388 kB
SwapFree:       17191328 kB
Dirty:               252 kB
Writeback:             0 kB
AnonPages:       7566736 kB
Mapped:          3692368 kB
Shmem:           3398784 kB
Slab:             278976 kB
SReclaimable:     125480 kB
SUnreclaim:       153496 kB
KernelStack:       23936 kB
PageTables:        73880 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    25997672 kB
Committed_AS:   24816804 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             3392 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:     1059088 kB
DirectMap2M:    14493696 kB
DirectMap1G:     2097152 kB
```

### 3) 如何使用 vmstat 命令查看 Linux 内存使用情况

[vmstat 命令](/article-8157-1.html) 是另一个报告虚拟内存统计信息的有用工具。

`vmstat` 报告的信息包括：进程、内存、页面映射、块 I/O、陷阱、磁盘和 CPU 特性信息。`vmstat` 不需要特殊的权限，并且它可以帮助诊断系统瓶颈。

```
# vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 682060 1769324 234188 4853500  0    3    25    91   31   16 34 13 52  0  0
```

如果你想详细了解每一项的含义，阅读下面的描述。

* `procs`：进程
	+ `r`： 可以运行的进程数目（正在运行或等待运行）
	+ `b`： 处于不可中断睡眠中的进程数目
* `memory`：内存
	+ `swpd`： 使用的虚拟内存数量
	+ `free`： 空闲的内存数量
	+ `buff`： 用作缓冲区内存的数量
	+ `cache`： 用作缓存内存的数量
	+ `inact`： 不活动的内存数量（使用 `-a` 选项）
	+ `active`： 活动的内存数量（使用 `-a` 选项）
* `Swap`：交换分区
	+ `si`： 每秒从磁盘交换的内存数量
	+ `so`： 每秒交换到磁盘的内存数量
* `IO`：输入输出
	+ `bi`： 从一个块设备中收到的块（块/秒）
	+ `bo`： 发送到一个块设备的块（块/秒）
* `System`：系统
	+ `in`： 每秒的中断次数，包括时钟。
	+ `cs`： 每秒的上下文切换次数。
* `CPU`：下面这些是在总的 CPU 时间占的百分比
	+ `us`： 花费在非内核代码上的时间占比（包括用户时间，调度时间）
	+ `sy`： 花费在内核代码上的时间占比 （系统时间）
	+ `id`： 花费在闲置的时间占比。在 Linux 2.5.41 之前，包括 I/O 等待时间
	+ `wa`： 花费在 I/O 等待上的时间占比。在 Linux 2.5.41 之前，包括在空闲时间中
	+ `st`： 被虚拟机偷走的时间占比。在 Linux 2.6.11 之前，这部分称为 unknown

运行下面的命令查看详细的信息。

```
# vmstat -s

        16248580 K total memory
         2210256 K used memory
         2311820 K active memory
         2153352 K inactive memory
        11368812 K free memory
          107584 K buffer memory
         2561928 K swap cache
        17873388 K total swap
               0 K used swap
        17873388 K free swap
           44309 non-nice user cpu ticks
             164 nice user cpu ticks
           14332 system cpu ticks
          382418 idle cpu ticks
            1248 IO-wait cpu ticks
            1407 IRQ cpu ticks
            2147 softirq cpu ticks
               0 stolen cpu ticks
         1022437 pages paged in
          260296 pages paged out
               0 pages swapped in
               0 pages swapped out
         1424838 interrupts
         4979524 CPU context switches
      1577163147 boot time
            3318 forks
```

### 4) 如何使用 ps\_mem 命令查看 Linux 内存使用情况

[ps\_mem](/article-8639-1.html) 是一个用来查看当前内存使用情况的简单的 Python 脚本。该工具可以确定每个程序使用了多少内存（不是每个进程）。

该工具采用如下的方法计算每个程序使用内存：总的使用 = 程序进程私有的内存 + 程序进程共享的内存。

计算共享内存是存在不足之处的，该工具可以为运行中的内核自动选择最准确的方法。

```
# ps_mem

 Private  +   Shared  =  RAM used    Program
180.0 KiB +  30.0 KiB = 210.0 KiB    xf86-video-intel-backlight-helper (2)
192.0 KiB +  66.0 KiB = 258.0 KiB    cat (2)
312.0 KiB +  38.5 KiB = 350.5 KiB    lvmetad
380.0 KiB +  25.5 KiB = 405.5 KiB    crond
392.0 KiB +  32.5 KiB = 424.5 KiB    rtkit-daemon
852.0 KiB + 117.0 KiB = 969.0 KiB    gnome-session-ctl (2)
928.0 KiB +  56.5 KiB = 984.5 KiB    gvfs-mtp-volume-monitor
  1.0 MiB +  42.5 KiB =   1.0 MiB    dconf-service
  1.0 MiB + 106.5 KiB =   1.1 MiB    gvfs-goa-volume-monitor
  1.0 MiB + 180.5 KiB =   1.2 MiB    gvfsd
.
.
  5.3 MiB +   3.0 MiB =   8.3 MiB    evolution-addressbook-factory
  8.5 MiB +   1.2 MiB =   9.7 MiB    gnome-session-binary (4)
  7.5 MiB +   3.1 MiB =  10.5 MiB    polkitd
  7.4 MiB +   3.3 MiB =  10.7 MiB    pulseaudio (2)
  7.0 MiB +   7.0 MiB =  14.0 MiB    msm_notifier
 12.7 MiB +   2.3 MiB =  15.0 MiB    evolution-source-registry
 13.3 MiB +   2.5 MiB =  15.8 MiB    gnome-terminal-server
 15.8 MiB +   1.0 MiB =  16.8 MiB    tracker-miner-fs
 18.7 MiB +   1.8 MiB =  20.5 MiB    python3.7
 16.6 MiB +   4.0 MiB =  20.5 MiB    evolution-calendar-factory
 22.3 MiB + 753.0 KiB =  23.0 MiB    gsd-keyboard (2)
 22.4 MiB + 832.0 KiB =  23.2 MiB    gsd-wacom (2)
 20.8 MiB +   2.5 MiB =  23.3 MiB    blueman-tray
 22.0 MiB +   1.8 MiB =  23.8 MiB    blueman-applet
 23.1 MiB + 934.0 KiB =  24.0 MiB    gsd-xsettings (2)
 23.7 MiB +   1.2 MiB =  24.9 MiB    gsd-media-keys (2)
 23.4 MiB +   1.6 MiB =  25.0 MiB    gsd-color (2)
 23.9 MiB +   1.2 MiB =  25.1 MiB    gsd-power (2)
 16.5 MiB +   8.9 MiB =  25.4 MiB    evolution-alarm-notify
 27.2 MiB +   2.0 MiB =  29.2 MiB    systemd-journald
 28.7 MiB +   2.8 MiB =  31.5 MiB    c
 29.6 MiB +   2.2 MiB =  31.8 MiB    chrome-gnome-sh (2)
 43.9 MiB +   6.8 MiB =  50.7 MiB    WebExtensions
 46.7 MiB +   6.7 MiB =  53.5 MiB    goa-daemon
 86.5 MiB +  55.2 MiB = 141.7 MiB    Xorg (2)
191.4 MiB +  24.1 MiB = 215.4 MiB    notepadqq-bin
306.7 MiB +  29.0 MiB = 335.7 MiB    gnome-shell (2)
601.6 MiB +  77.7 MiB = 679.2 MiB    firefox
  1.0 GiB + 109.7 MiB =   1.1 GiB    chrome (15)
  2.3 GiB + 123.1 MiB =   2.5 GiB    Web Content (8)
----------------------------------
                           5.6 GiB
==================================
```

### 5）如何使用 smem 命令查看 Linux 内存使用情况

[smem](/article-7681-1.html) 是一个可以为 Linux 系统提供多种内存使用情况报告的工具。不同于现有的工具，`smem` 可以报告<ruby> 比例集大小 <rt>  Proportional Set Size </rt></ruby>（PSS）、<ruby> 唯一集大小 <rt>  Unique Set Size </rt></ruby>（USS）和<ruby> 驻留集大小 <rt>  Resident Set Size </rt></ruby>（RSS）。

* 比例集大小（PSS）：库和应用在虚拟内存系统中的使用量。
* 唯一集大小（USS）：其报告的是非共享内存。
* 驻留集大小（RSS）：物理内存（通常多进程共享）使用情况，其通常高于内存使用量。

```
# smem -tk

 PID User     Command                         Swap      USS      PSS      RSS
3383 daygeek  cat                                0    92.0K   123.0K     1.7M
3384 daygeek  cat                                0   100.0K   129.0K     1.7M
1177 daygeek  /usr/lib/gnome-session-ctl         0   436.0K   476.0K     4.6M
1171 daygeek  /usr/bin/dbus-daemon --conf        0   524.0K   629.0K     3.8M
1238 daygeek  /usr/lib/xdg-permission-sto        0   592.0K   681.0K     5.9M
1350 daygeek  /usr/lib/gsd-screensaver-pr        0   652.0K   701.0K     5.8M
1135 daygeek  /usr/lib/gdm-x-session --ru        0   648.0K   723.0K     6.0M
.
.
1391 daygeek  /usr/lib/evolution-data-ser        0    16.5M    25.2M    63.3M
1416 daygeek  caffeine-ng                        0    28.7M    31.4M    66.2M
4855 daygeek  /opt/google/chrome/chrome -        0    38.3M    46.3M   120.6M
2174 daygeek  /usr/lib/firefox/firefox -c        0    44.0M    50.7M   120.3M
1254 daygeek  /usr/lib/goa-daemon                0    46.7M    53.3M    80.4M
3416 daygeek  /opt/google/chrome/chrome -        0    44.7M    54.2M   103.3M
4782 daygeek  /opt/google/chrome/chrome -        0    57.2M    65.8M   142.3M
1137 daygeek  /usr/lib/Xorg vt2 -displayf        0    77.2M   129.6M   192.3M
3376 daygeek  /opt/google/chrome/chrome          0   117.8M   131.0M   210.9M
4448 daygeek  /usr/lib/firefox/firefox -c        0   124.4M   133.8M   224.1M
3558 daygeek  /opt/google/chrome/chrome -        0   157.3M   165.7M   242.2M
2310 daygeek  /usr/lib/firefox/firefox -c        0   159.6M   169.4M   259.6M
4331 daygeek  /usr/lib/firefox/firefox -c        0   176.8M   186.2M   276.8M
4034 daygeek  /opt/google/chrome/chrome -        0   179.3M   187.9M   264.6M
3911 daygeek  /opt/google/chrome/chrome -        0   183.1M   191.8M   269.4M
3861 daygeek  /opt/google/chrome/chrome -        0   199.8M   208.2M   285.2M
2746 daygeek  /usr/bin/../lib/notepadqq/n        0   193.5M   217.5M   261.5M
1194 daygeek  /usr/bin/gnome-shell               0   203.7M   219.0M   285.1M
2945 daygeek  /usr/lib/firefox/firefox -c        0   294.5M   308.0M   410.2M
2786 daygeek  /usr/lib/firefox/firefox -c        0   341.2M   354.3M   459.1M
4193 daygeek  /usr/lib/firefox/firefox -c        0   417.4M   427.6M   519.3M
2651 daygeek  /usr/lib/firefox/firefox -c        0   417.0M   430.1M   535.6M
2114 daygeek  /usr/lib/firefox/firefox -c        0   430.6M   473.9M   610.9M
2039 daygeek  /usr/lib/firefox/firefox --        0   601.3M   677.5M   840.6M
-------------------------------------------------------------------------------
  90 1                                           0     4.8G     5.2G     8.0G
```

### 6) 如何使用 top 命令查看 Linux 内存使用情况

[top 命令](https://www.2daygeek.com/linux-top-command-linux-system-performance-monitoring-tool/) 是一个 Linux 系统的管理员最常使用的用于查看进程的资源使用情况的命令。

该命令会展示了系统总的内存量、当前内存使用量、空闲内存量和缓冲区使用的内存总量。此外，该命令还会展示总的交换空间内存量、当前交换空间的内存使用量、空闲的交换空间内存量和缓存使用的内存总量。

```
# top -b | head -10

top - 11:04:39 up 40 min,  1 user,  load average: 1.59, 1.42, 1.28
Tasks: 288 total,   2 running, 286 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.3 us,  1.5 sy,  0.0 ni, 84.4 id,  0.0 wa,  0.3 hi,  0.5 si,  0.0 st
KiB Mem : 16248572 total,  7755928 free,  4657736 used,  3834908 buff/cache
KiB Swap: 17873388 total, 17873388 free,        0 used.  9179772 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 2114 daygeek   20     3182736 616624 328228 R  83.3   3.8   7:09.72 Web Content
 2039 daygeek   20     4437952 849616 261364 S  13.3   5.2   7:58.54 firefox
 1194 daygeek   20     4046856 291288 165460 S   4.2   1.8   1:57.68 gnome-shell
 4034 daygeek   20      808556 273244  88676 S   4.2   1.7   1:44.72 chrome
 2945 daygeek   20     3309832 416572 150112 S   3.3   2.6   4:04.60 Web Content
 1137 daygeek   20      564316 197292 183380 S   2.5   1.2   2:55.76 Xorg
 2651 daygeek   20     3098420 547260 275700 S   1.7   3.4   2:15.96 Web Content
 2786 daygeek   20     2957112 463912 240744 S   1.7   2.9   3:22.29 Web Content
    1 root      20      182756  10208   7760 S   0.8   0.1   0:04.51 systemd
  442 root     -51                           S   0.8         0:05.02 irq/141-iw+
 1426 daygeek   20      373660  48948  29820 S   0.8   0.3   0:03.55 python3
 2174 daygeek   20     2466680 122196  78604 S   0.8   0.8   0:17.75 WebExtensi+
```

### 7) 如何使用 htop 命令查看 Linux 内存使用情况

[htop 命令](https://www.2daygeek.com/linux-htop-command-linux-system-performance-resource-monitoring-tool/) 是一个可交互的 Linux/Unix 系统进程查看器。它是一个文本模式应用，且使用它需要 Hisham 开发的 ncurses 库。

该名令的设计目的使用来代替 `top` 命令。该命令与 `top` 命令很相似，但是其允许你可以垂直地或者水平地的滚动以便可以查看系统中所有的进程情况。

`htop` 命令拥有不同的颜色，这个额外的优点当你在追踪系统性能情况时十分有用。

此外，你可以自由地执行与进程相关的任务，比如杀死进程或者改变进程的优先级而不需要其进程号（PID）。

### 8）如何使用 glances 命令查看 Linux 内存使用情况

[Glances](https://www.2daygeek.com/linux-glances-advanced-real-time-linux-system-performance-monitoring-tool/) 是一个 Python 编写的跨平台的系统监视工具。

你可以在一个地方查看所有信息，比如：CPU 使用情况、内存使用情况、正在运行的进程、网络接口、磁盘 I/O、RAID、传感器、文件系统信息、Docker、系统信息、运行时间等等。

---

via: <https://www.2daygeek.com/linux-commands-check-memory-usage/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[萌新阿岩](https://github.com/mengxinayan) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 上如何清理垃圾系统管理员

Summary: 作为一个真正的系统管理员，而不是一个脚本小子，需要认真地研究每个命令和细节。

作为一个真正的系统管理员，而不是一个脚本小子，需要认真地研究每个命令和细节。

# 在 Linux 上如何清理垃圾系统管理员

最近在网上看到一张图（原图出处不详，题图据原图重制，有修改。）

<img src="content_image/album_202002_10_103131y1z8ancap91z1pys.png" alt="" title="">

唔，感觉很有道理啊，你看，`rm` 是删除，这个单词简单好记；连 `rf` 都给出了解释，“垃圾文件”；`/*` 代表目录下的所有文件，没毛病；`sudo` 也有了，确保权限没问题。

哈哈，你一定会说，又编段子搞笑，没人会信的。

会有人执行这样的命令来清理所谓的垃圾文件么？你别说，这还真不好说。

我们经常会发一些关于关于 Bash 别名的文章，总有一些同学皮一下“贡献”一些别致的别名，比如 `alias ls=rm -rf`，`alias cd=rm -rf` 等等。虽然我认为几乎没有人会被这些命令恶搞，但是大家也屡屡乐此不疲。

我将这张图发到朋友圈里，好友“龙十三”表示，这不仅仅清除垃圾文件，而且清除**垃圾系统管理员**。

是啊，为什么会有这样的段子一再出现呢？就是因为我们有些不求甚解的人，遇到问题了，习惯于从网上随便找个命令示例瞎试，不去探究其原理，也不去核实可靠性。所以，这样的段子真是用来清除“系统管理员里的垃圾”的。

那么让我们来探究一下上面这条命令，看看这里有多少知识点。

### rm 的那些事

首先，这条命令是用来清除 Linux 系统的根目录（`/`）下所有文件的。它使用了两个命令选项：

* `-r`：<ruby> 递归 <rp>  （ </rp> <rt>  recursive </rt> <rp>  ） </rp></ruby>，对目录及其下的内容进行递归操作
* `-f`：<ruby> 强制 <rp>  （ </rp> <rt>  force </rt> <rp>  ） </rp></ruby>，无需确认操作

这两个选项可以单独写作 `-r` 和 `-f` ，也可以按 POSIX 惯例，将两个选项合并成 `-rf` 。这里的 `-r` 和 `-f` 选项，绝非上图中恶搞的 “Rubbish” 和 “Files”。

其后的参数 `/*` 指的是根目录 `/` 下的所有文件。

#### -r 选项

`-r` 选项代表<ruby> 递归 <rp>  （ </rp> <rt>  recurive </rt> <rp>  ） </rp></ruby>，其意思是指递归地对参数中的目录及其下的文件或子目录进行删除操作。

这个选项除了短选项风格，还有 GNU 风格的长选项 `--recursive` ；也出于兼容性的原因，支持同义的大写 `-R` 参数。

如果没有该选项，则不会删除目录及其下的内容。

#### -f 选项

在介绍 `-f` 选项之前，让我们先看一下这里没有出现的 `-i` 选项。

原生的 `rm` 命令在删除文件或目录时，遵循 UNIX 惯例，在执行删除操作前和操作成功后，是静默的，毫无提示的。除非遇到错误（如要删除的文件不存在）时，否则绝不抱怨。

后来，可能是鉴于很多人经常会错误删除文件，在绝大多数的 Linux 发行版上的 `rm` 命令是一个添加了 `-i` 选项的别名：

```
alias rm=rm -i
```

这里的 `-i` 选项用于在每一个删除动作前做个提示，需要用户明确给予确认才会删除。

但是，有时候，这种提示实在是太烦了，所以，很多人在操作时，特意使用 `-f` 选项覆盖了 `-i` 选项的行为，使得这个别名的定义毫无意义。

因此，还有一个 `-I` 选项，这个选项在要删除三个及更多的文件或递归删除时，会做**一次**确认提示。这样，既没有 `-i` 选项那么烦人，又能防止大部分错误操作。所以，可以将上述别名采用 `-I` 选项，并避免使用 `-f` 选项。

#### \* 通配了什么

我们看到命令中以`*` 来指代目录下的所有文件。但是严格来说，`*` 这个通配符代表不以点 “`.`” 开头的所有文件。以 “`.`” 开头的文件默认属于 Linux 下的隐藏文件。

因此，这个命令不会删除 `/` 目录下以 `.` 开头的隐藏文件，以及 `.` 和 `..` 两个目录。但是在递归操作时，会递归地删除子目录下除了 `.` 和 `..` 目录之外的所以文件和子目录——无论是否以 `.` 开头——因为递归操作不是由 Bash 等 shell 进行通配展开的。

至于为什么不在删除目录下的内容时也将 `.` 和 `..` 一视同仁？因为自从 1979 年 `rm` 命令[开始有删除目录的能力](https://unix.stackexchange.com/a/90075/22222)时，就专门避开了这两个特殊目录。

#### 根目录保护

有一定经验的系统管理员可能这个时候会想起来，`rm` 命令有一对专门针对根目录的选项 `--preserve-root` 和 `--no-preserve-root` 。这对选项的意思是：

* `--preserve-root`：保护根目录，这是默认行为。
* `--no-preserve-root`：不保护根目录。

这对选项是后来添加到 `rm` 命令的。可能几乎每个系统管理员都犯过操作错误，而这其中删除过根目录的比比皆是（我就是一个）。出现这种情况的原因有几种：

* 输入手误：比如本来想输入 `rm /tmp/test.txt`，结果不小心键盘打的飞起，多输入了一个空格变成： `rm / tmp/test.txt` 。看到根目录（`/`）后面的空格了么？！——这就是我当前自己亲手犯过的错误，而且是在生产服务器上。
* 未正确初始化或命名错误的 shell 脚本变量：比如在脚本中，`rm -rf /${tmp_dir}`，如果无论是 `tmp_dir` 变量没有正确赋值还是输入错误（原本或许是 `tmpdir` ？），那会导致什么？当然是删除根目录咯~

鉴于这种情况层出不穷，在 Linux 圈子几乎和“初学者如何退出 vi” 一样成为经典笑话了。所以，在 POSIX 第七版规范中，`rm` 命令[添加](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/rm.html)了 `--preserve-root` 选项，并将其作为默认行为，以降低出现这种错误的可能。

但是，这个选项不能防范本文中所述的清除根目录下所有文件（`/*`）的操作。

有的同学可能要问，那为什么还会专门出现 `--no-preserve-root` 选项呢？这可能主要是出于 UNIX 哲学的考虑，给予你想要的一切权力，犯傻是你的事情，而不是操作系统的事情。万一，你真的想删除根目录下的所有文件呢？

你还别说，真有这种需求：比如你要清除一个 chroot 环境下的所有文件。 chroot 我们这里不多讲，它就是以一个目录作为“监狱”，该目录在逻辑上形成了新的“根目录”，在该监狱内的文件操作不能跨出该目录范畴。近些年流行的 Docker、LXC/LXD 之类的容器技术，都是一种 chroot 技术。

#### UEFI 系统

好吧，你可能更特立独行一些，就是要清除物理环境中的根目录下所有文件！但是在你按下回车键之前，请再考虑一下，你是否在一个 UEFI 系统上？

因为 UEFI 系统会将其固件、变量和设置映射到根目录下的 `/sys` 分区里面，所以，如果在 UEFI 环境中清除根目录下的所有内容，也会同样清除 `/sys` ，这将可能会导致你丢失 UEFI 的固件设置，从而使设备变砖。

### sudo 提权

为了可以删除属于 root 等系统和其它用户的文件，这个命令还需要在前面加上 `sudo` 来提权。

输入该命令后，会要求输入密码。谁的密码？不是 root 密码，而是输入该命令的当前用户的密码。

而对于谁能执行 `sudo` 命令，以及他可以通过 `sudo` 命令执行什么命令等知识点，这里就不再赘述，请参阅我们的[其它](/article-8278-1.html)[文章](/article-11595-1.html)。顺便说一句，要记得区分 `sudo` 和 `su` 命令的[联系与区别](/article-8404-1.html)。

### 垃圾文件

研究到这里，我们不能忘记这条命令原本的意图，删除“垃圾文件”。

Linux 下有垃圾文件么？有。这些垃圾文件一般来源于：

* 没有被包管理器管理的孤儿文件，在软件包被删除后，遗留在系统中
* 无用的依赖包，在需要这些依赖包的软件被删除后，没有相应删除
* 没有清理的临时文件
* 遗留的诊断文件

那么这些垃圾文件需要清除么？一般而言，Linux 系统上的这些文件大多不会对系统的健康运行造成任何影响，除非太多了，占据了很多存储空间和 inode。

所以，如果你感觉你的 Linux 系统慢了，那几乎可以肯定不是由于垃圾文件导致的，至少在这一点上，来自 Windows 系统的经验并不值得复制。

---

好了，关于这个简单的命令，我们已经挖掘了这么多知识点，你都知道了吗？

事实上，关于这些知识，还有更多的内涵、外延和历史信息，作为一个真正的系统管理员，而不是一个脚本小子，需要认真地研究每个命令和细节。


顶级 CI / CD 资源，助您成功

# 顶级 CI / CD 资源，助您成功

>
> 随着企业期望实现无缝、灵活和可扩展的部署，持续集成和持续部署成为 2019 年的关键主题。
>
>
>

<img src="content_image/album_202002_10_160605m6w74nyzod5dolnl.png" alt="Plumbing tubes in many directions" title="Plumbing tubes in many directions">

对于 CI/CD 和 DevOps 来说，2019 年是非常棒的一年。Opensource.com 的作者分享了他们专注于无缝、灵活和可扩展部署时是如何朝着敏捷和 scrum 方向发展的。以下是我们 2019 年发布的 CI/CD 文章中的一些重要文章。

### 学习和提高你的 CI/CD 技能

我们最喜欢的一些文章集中在 CI/CD 的实操经验上，并涵盖了许多方面。通常以 [Jenkins](https://jenkins.io/) 管道开始，Bryant Son 的文章《[用 Jenkins 构建 CI/CD 管道](/article-11546-1.html)》将为你提供足够的经验，以开始构建你的第一个管道。Daniel Oh 在《[用 DevOps 管道进行自动验收测试](https://opensource.com/article/19/4/devops-pipeline-acceptance-testing)》一文中，提供了有关验收测试的重要信息，包括可用于自行测试的各种 CI/CD 应用程序。我写的《[安全扫描 DevOps 管道](https://opensource.com/article/19/7/security-scanning-your-devops-pipeline)》非常简短，其中简要介绍了如何使用 Jenkins 平台在管道中设置安全性。

### 交付工作流程

正如 Jithin Emmanuel 在《[Screwdriver：一个用于持续交付的可扩展构建平台](https://opensource.com/article/19/3/screwdriver-cicd)》中分享的，在学习如何使用和提高你的 CI/CD 技能方面，工作流程很重要，特别是当涉及到管道时。Emily Burns 在《[为什么 Spinnaker 对 CI/CD 很重要](https://opensource.com/article/19/8/why-spinnaker-matters-cicd)》中解释了灵活地使用 CI/CD 工作流程准确构建所需内容的原因。Willy-Peter Schaub 还盛赞了为所有产品创建统一管道的想法，以便《[在一个 CI/CD 管道中一致地构建每个产品](https://opensource.com/article/19/7/cicd-pipeline-rule-them-all)》。这些文章将让你很好地了解在团队成员加入工作流程后会发生什么情况。

### CI/CD 如何影响企业

2019 年也是认识到 CI/CD 的业务影响以及它是如何影响日常运营的一年。Agnieszka Gancarczyk 分享了 Red Hat 《[小型 Scrum vs. 大型 Scrum](https://opensource.com/article/19/3/small-scale-scrum-vs-large-scale-scrum)》的调查结果, 包括受访者对 Scrum、敏捷运动及对团队的影响的不同看法。Will Kelly 的《[持续部署如何影响整个组织](https://opensource.com/article/19/7/organizational-impact-continuous-deployment)》，也提及了开放式沟通的重要性。Daniel Oh 也在《[DevOps 团队必备的 3 种指标仪表板](/article-11183-1.html)》中强调了指标和可观测性的重要性。最后是 Ann Marie Fred 的精彩文章《[不在生产环境中测试？要在生产环境中测试！](https://opensource.com/article/19/5/dont-test-production)》详细说明了在验收测试前在生产环境中测试的重要性。

感谢许多贡献者在 2019 年与 Opensource 的读者分享他们的见解，我期望在 2020 年里从他们那里了解更多有关 CI/CD 发展的信息。

---

via: <https://opensource.com/article/19/12/cicd-resources>

作者：[Jessica Cherry](https://opensource.com/users/jrepka) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Morisun029](https://github.com/Morisun029) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用此开源工具在一起收取你的 RSS 订阅源和播客

# 使用此开源工具在一起收取你的 RSS 订阅源和播客

>
> 在我们的 20 个使用开源提升生产力的系列的第十二篇文章中使用 Newsboat 收取你的新闻 RSS 源和播客。
>
>
>

去年，我在 19 天里给你介绍了 19 个新（对你而言）的生产力工具。今年，我换了一种方式：使用你在使用或者还没使用的工具，构建一个使你可以在新一年更加高效的环境。

### 使用 Newsboat 访问你的 RSS 源和播客

RSS 新闻源是了解各个网站最新消息的非常方便的方法。除了 Opensource.com，我还会关注 [SysAdvent](https://sysadvent.blogspot.com/) sysadmin 年度工具，还有一些我最喜欢的作者以及一些网络漫画。RSS 阅读器可以让我“批处理”阅读内容，因此，我每天不会在不同的网站上花费很多时间。

[Newsboat](https://newsboat.org) 是一个基于终端的 RSS 订阅源阅读器，外观感觉很像电子邮件程序 [Mutt](http://mutt.org/)。它使阅读新闻变得容易，并有许多不错的功能。

安装 Newsboat 非常容易，因为它包含在大多数发行版（以及 MacOS 上的 Homebrew）中。安装后，只需在 `~/.newsboat/urls` 中添加订阅源。如果你是从其他阅读器迁移而来，并有导出的 OPML 文件，那么可以使用以下方式导入：

```
newsboat -i </path/to/my/feeds.opml>
```

添加订阅源后，Newsboat 的界面非常熟悉，特别是如果你使用过 Mutt。你可以使用箭头键上下滚动，使用 `r` 检查某个源中是否有新项目，使用 `R` 检查所有源中是否有新项目，按回车打开订阅源，并选择要阅读的文章。

但是，你不仅限于本地 URL 列表。Newsboat 还是 [Tiny Tiny RSS](https://tt-rss.org/)、ownCloud 和 Nextcloud News 等新闻阅读服务以及一些 Google Reader 后续产品的客户端。[Newsboat 的文档](https://newsboat.org/releases/2.18/docs/newsboat.html)中涵盖了有关此的详细信息以及其他许多配置选项。

#### 播客

Newsboat 还通过 Podboat 提供了[播客支持](https://newsboat.org/releases/2.18/docs/newsboat.html#_podcast_support)，Podboat 是一个附带的应用，它可帮助下载和排队播客节目。在 Newsboat 中查看播客源时，按下 `e` 将节目添加到你的下载队列中。所有信息将保存在 `~/.newsboat` 目录中的队列文件中。Podboat 读取此队列并将节目下载到本地磁盘。你可以在 Podboat 的用户界面（外观和行为类似于 Newsboat）执行此操作，也可以使用 `podboat -a` 让 Podboat 下载所有内容。作为播客人和播客听众，我认为这*真的*很方便。

总体而言，Newsboat 有一些非常好的功能，并且是一些基于 Web 或桌面应用的不错的轻量级替代方案。

---

via: <https://opensource.com/article/20/1/open-source-rss-feed-reader>

作者：[Kevin Sonney](https://opensource.com/users/ksonney) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用于安全计算的 HTTPS 是什么？

Summary: 在默认的情况下，网站的安全性还不足够。

在默认的情况下，网站的安全性还不足够。

# 用于安全计算的 HTTPS 是什么？

>
> 在默认的情况下，网站的安全性还不足够。
>
>
>

<img src="content_image/album_202002_11_123552rqncn4c7474j44jq.jpg" alt="" title="">

在过去的几年里，寻找一个只以 “http://…” 开头的网站变得越来越难，这是因为业界终于意识到，网络安全“是件事”，同时也是因为客户端和服务端之间建立和使用 https 连接变得更加容易了。类似的转变可能正以不同的方式发生在云计算、边缘计算、物联网、区块链，人工智能、机器学习等领域。长久以来，我们都知道我们应该对存储的静态数据和在网络中传输的数据进行加密，但是在使用和处理数据的时候对它进行加密是困难且昂贵的。可信计算（使用例如<ruby> 受信任的执行环境 <rt>  Trusted Execution Environments </rt></ruby> TEEs 这样的硬件功能来提供数据和算法这种类型的保护）可以保护主机系统中的或者易受攻击的环境中的数据。

关于 [TEEs](https://aliceevebob.com/2019/02/26/oh-how-i-love-my-tee-or-do-i/)，当然，还有我和 Nathaniel McCallum 共同创立的 [Enarx 项目](https://enarx.io/)，我已经写了几次文章（参见《[给每个人的 Enarx（一个任务）](https://aliceevebob.com/2019/08/20/enarx-for-everyone-a-quest/)》 和 《[Enarx 迈向多平台](https://aliceevebob.com/2019/10/29/enarx-goes-multi-platform/)》）。Enarx 使用 TEEs 来提供独立于平台和语言的部署平台，以此来让你能够安全地将敏感应用或者敏感组件（例如微服务）部署在你不信任的主机上。当然，Enarx 是完全开源的（顺便提一下，我们使用的是 Apache 2.0 许可证）。能够在你不信任的主机上运行工作负载，这是可信计算的承诺，它扩展了使用静态敏感数据和传输中数据的常规做法：

* **存储**：你要加密你的静态数据，因为你不完全信任你的基础存储架构。
* **网络**：你要加密你正在传输中的数据，因为你不完全信任你的基础网络架构。
* **计算**：你要加密你正在使用中的数据，因为你不完全信任你的基础计算架构。

关于信任，我有非常多的话想说，而且，上述说法里的单词“**完全**”是很重要的（在重新读我写的这篇文章的时候，我新加了这个单词）。不论哪种情况，你必须在一定程度上信任你的基础设施，无论是传递你的数据包还是存储你的数据块，例如，对于计算基础架构，你必须要去信任 CPU 和与之关联的固件，这是因为如果你不信任他们，你就无法真正地进行计算（现在有一些诸如<ruby> 同态加密 <rt>  homomorphic encryption </rt></ruby>一类的技术，这些技术正在开始提供一些可能性，但是它们依然有限，这些技术还不够成熟）。

考虑到发现的一些 CPU 安全性问题，是否应该完全信任 CPU 有时自然会产生疑问，以及它们是否在针对其所在的主机的物理攻击中具有完全的安全性。

这两个问题的回答都是“不”，但是在考虑到大规模可用性和普遍推广的成本，这已经是我们当前拥有的最好的技术了。为了解决第二个问题，没有人去假装这项技术（或者任何的其他技术）是完全安全的：我们需要做的是思考我们的[威胁模型](https://aliceevebob.com/2018/02/20/there-are-no-absolutes-in-security/)并确定这个情况下的 TEEs 是否为我们的特殊需求提供了足够的安全防护。关于第一个问题，Enarx 采用的模型是在部署时就对你是否信任一个特定的 CPU 组做出决定。举个例子，如果供应商 Q 的 R 代芯片被发现有漏洞，可以很简单地说“我拒绝将我的工作内容部署到 Q 的 R 代芯片上去，但是仍然可以部署到 Q 的 S 型号、T 型号和 U 型号的芯片以及任何 P、M 和 N 供应商的任何芯片上去。”

我认为这里发生了三处改变，这些改变引起了人们现在对<ruby> 机密计算 <rt>  confidential computing </rt></ruby>的兴趣和采用。

1. **硬件可用**：只是在过去的 6 到 12 个月里，支持 TEEs 的硬件才开始变得广泛可用，这会儿市场上的主要例子是 Intel 的 SGX 和 AMD 的 SEV。我们期望在未来可以看到支持 TEE 的硬件的其他例子。
2. **行业就绪**：就像上云越来越多地被接受作为应用程序部署的模型，监管机构和立法机构也在提高各类组织保护其管理的数据的要求。组织开始呼吁在不受信任的主机运行敏感程序（或者是处理敏感数据的应用程序）的方法，更确切地说，是在无法完全信任且带有敏感数据的主机上运行的方法。这不足为奇：如果芯片制造商看不到这项技术的市场，他们就不会投太多的钱在这项技术上。Linux 基金会的[机密计算联盟（CCC）](https://confidentialcomputing.io/)的成立就是业界对如何寻找使用加密计算的通用模型并且鼓励开源项目使用这些技术感兴趣的案例。（红帽发起的 Enarx 是一个 CCC 项目。）
3. **开放源码**：就像区块链一样，机密计算是使用开源绝对明智的技术之一。如果你要运行敏感程序，你需要去信任正在为你运行的程序。不仅仅是 CPU 和固件，同样还有在 TEE 内执行你的工作负载的框架。可以很好地说，“我不信任主机机器和它上面的软件栈，所以我打算使用 TEE，”但是如果你不够了解 TEE 软件环境，那你就是将一种软件不透明换成另外一种。TEEs 的开源支持将允许你或者社区（实际上是你与社区）以一种专有软件不可能实现的方式来检查和审计你所运行的程序。这就是为什么 CCC 位于 Linux 基金会旗下（这个基金会致力于开放式开发模型）并鼓励 TEE 相关的软件项目加入且成为开源项目（如果它们还没有成为开源）。

我认为，在过去的 15 到 20 年里，硬件可用、行业就绪和开放源码已成为推动技术改变的驱动力。区块链、人工智能、云计算、<ruby> 大规模计算 <rt>  webscale computing </rt></ruby>、大数据和互联网商务都是这三个点同时发挥作用的例子，并且在业界带来了巨大的改变。

在一般情况下，安全是我们这数十年来听到的一种承诺，并且其仍然未被实现。老实说，我不确定它未来会不会实现。但是随着新技术的到来，特定用例的安全变得越来越实用和无处不在，并且在业内受到越来越多的期待。这样看起来，机密计算似乎已准备好成为成为下一个重大变化 —— 而你，我亲爱的读者，可以一起来加入到这场革命（毕竟它是开源的）。

这篇文章最初是发布在 Alice, Eve, and Bob 上的，这是得到了作者许可的重发。

---

via: <https://opensource.com/article/20/1/confidential-computing>

作者：[Mike Bursell](https://opensource.com/users/mikecamel) 选题：[lujun9972](https://github.com/lujun9972) 译者：[hopefully2333](https://github.com/hopefully2333) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用这个开源工具获取本地天气预报

# 使用这个开源工具获取本地天气预报

>
> 在我们的 20 个使用开源提升生产力的系列的第十三篇文章中使用 wego 来了解出门前你是否要需要外套、雨伞或者防晒霜。
>
>
>

去年，我在 19 天里给你介绍了 19 个新（对你而言）的生产力工具。今年，我换了一种方式：使用你在使用或者还没使用的工具，构建一个使你可以在新一年更加高效的环境。

### 使用 wego 了解天气

过去十年我对我的职业最满意的地方之一是大多数时候是远程工作。尽管现实情况是我很多时候是在家里办公，但我可以在世界上任何地方工作。缺点是，离家时我会根据天气做出一些决定。在我居住的地方，“晴朗”可以表示从“酷热”、“低于零度”到“一小时内会小雨”。能够了解实际情况和快速预测非常有用。

[Wego](https://github.com/schachmat/wego) 是用 Go 编写的程序，可以获取并显示你的当地天气。如果你愿意，它甚至可以用闪亮的 ASCII 艺术效果进行渲染。

要安装 `wego`，你需要确保在系统上安装了[Go](https://golang.org/doc/install)。之后，你可以使用 `go get` 命令获取最新版本。你可能还想将 `~/go/bin` 目录添加到路径中：

```
go get -u github.com/schachmat/wego
export PATH=~/go/bin:$PATH
wego
```

首次运行时，`wego` 会报告缺失 API 密钥。现在你需要决定一个后端。默认后端是 [Forecast.io](https://forecast.io)，它是 [Dark Sky](https://darksky.net)的一部分。`wego` 还支持 [OpenWeatherMap](https://openweathermap.org/) 和 [WorldWeatherOnline](https://www.worldweatheronline.com/)。我更喜欢 OpenWeatherMap，因此我将在此向你展示如何设置。

你需要在 OpenWeatherMap 中[注册 API 密钥](https://openweathermap.org/api)。注册是免费的，尽管免费的 API 密钥限制了一天可以查询的数量，但这对于普通用户来说应该没问题。得到 API 密钥后，将它放到 `~/.wegorc` 文件中。现在可以填写你的位置、语言以及使用公制、英制（英国/美国）还是国际单位制（SI）。OpenWeatherMap 可通过名称、邮政编码、坐标和 ID 确定位置，这是我喜欢它的原因之一。

```
# wego configuration for OEM
aat-coords=false
aat-monochrome=false
backend=openweathermap
days=3
forecast-lang=en
frontend=ascii-art-table
jsn-no-indent=false
location=Pittsboro
owm-api-key=XXXXXXXXXXXXXXXXXXXXX
owm-debug=false
owm-lang=en
units=imperial
```

现在，在命令行运行 `wego` 将显示接下来三天的当地天气。

`wego` 还可以输出 JSON 以便程序使用，还可显示 emoji。你可以使用 `-f` 参数或在 `.wegorc` 文件中指定前端。

如果你想在每次打开 shell 或登录主机时查看天气，只需将 wego 添加到 `~/.bashrc`（我这里是 `~/.zshrc`）即可。

[wttr.in](https://github.com/chubin/wttr.in) 项目是 wego 上的基于 Web 的封装。它提供了一些其他显示选项，并且可以在同名网站上看到。关于 wttr.in 的一件很酷的事情是，你可以使用 `curl` 获取一行天气信息。我有一个名为 `get_wttr` 的 shell 函数，用于获取当前简化的预报信息。

```
get_wttr() {
  curl -s "wttr.in/Pittsboro?format=3"
}
```

现在，在我离开家之前，我就可以通过命令行快速简单地获取我是否需要外套、雨伞或者防晒霜了。

---

via: <https://opensource.com/article/20/1/open-source-weather-forecast>

作者：[Kevin Sonney](https://opensource.com/users/ksonney) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何进行 Linux 启动时间优化

居然没提到 systemd-analyze plot ？

编译内核，不用桌面

来自111.32.81.16的 Firefox 72.0|GNU/Linux 用户

用不用桌面，跟这个有什么关系？

我也想说

我也想说

我也想说

# 如何进行 Linux 启动时间优化

>
> 快速启动嵌入式设备或电信设备，对于时间要求紧迫的应用程序是至关重要的，并且在改善用户体验方面也起着非常重要的作用。这个文章给予一些关于如何增强任意设备的启动时间的重要技巧。
>
>
>

快速启动或快速重启在各种情况下起着至关重要的作用。为了保持所有服务的高可用性和更好的性能，嵌入式设备的快速启动至关重要。设想有一台运行着没有启用快速启动的 Linux 操作系统的电信设备，所有依赖于这个特殊嵌入式设备的系统、服务和用户可能会受到影响。这些设备维持其服务的高可用性是非常重要的，为此，快速启动和重启起着至关重要的作用。

一台电信设备的一次小故障或关机，即使只是几秒钟，都可能会对无数互联网上的用户造成破坏。因此，对于很多对时间要求严格的设备和电信设备来说，在它们的设备中加入快速启动的功能以帮助它们快速恢复工作是非常重要的。让我们从图 1 中理解 Linux 启动过程。

### 监视工具和启动过程

在对机器做出更改之前，用户应注意许多因素。其中包括计算机的当前启动速度，以及占用资源并增加启动时间的服务、进程或应用程序。

#### 启动图

为监视启动速度和在启动期间启动的各种服务，用户可以使用下面的命令来安装：

```
sudo apt-get install pybootchartgui
```

你每次启动时，启动图会在日志中保存一个 png 文件，使用户能够查看该 png 文件来理解系统的启动过程和服务。为此，使用下面的命令：

```
cd /var/log/bootchart
```

用户可能需要一个应用程序来查看 png 文件。Feh 是一个面向控制台用户的 X11 图像查看器。不像大多数其它的图像查看器，它没有一个精致的图形用户界面，但它只用来显示图片。Feh 可以用于查看 png 文件。你可以使用下面的命令来安装它：

```
sudo apt-get install feh
```

你可以使用 `feh xxxx.png` 来查看 png 文件。

图 2 显示了一个正在查看的引导图 png 文件。

#### systemd-analyze

但是，对于 Ubuntu 15.10 以后的版本不再需要引导图。为获取关于启动速度的简短信息，使用下面的命令：

```
systemd-analyze
```

图表 3 显示命令 `systemd-analyze` 的输出。

命令 `systemd-analyze blame` 用于根据初始化所用的时间打印所有正在运行的单元的列表。这个信息是非常有用的，可用于优化启动时间。`systemd-analyze blame` 不会显示服务类型为简单（`Type=simple`）的服务，因为 systemd 认为这些服务应是立即启动的；因此，无法测量初始化的延迟。

图 4 显示 `systemd-analyze blame` 的输出。

下面的命令打印时间关键的服务单元的树形链条：

```
command systemd-analyze critical-chain
```

图 5 显示命令 `systemd-analyze critical-chain` 的输出。

### 减少启动时间的步骤

下面显示的是一些可以减少启动时间的各种步骤。

#### BUM（启动管理器）

BUM 是一个运行级配置编辑器，允许在系统启动或重启时配置初始化服务。它显示了可以在启动时启动的每个服务的列表。用户可以打开和关闭各个服务。BUM 有一个非常清晰的图形用户界面，并且非常容易使用。

在 Ubuntu 14.04 中，BUM 可以使用下面的命令安装：

```
sudo apt-get install bum
```

为在 15.10 以后的版本中安装它，从链接 <http://apt.ubuntu.com/p/bum> 下载软件包。

以基本的服务开始，禁用扫描仪和打印机相关的服务。如果你没有使用蓝牙和其它不想要的设备和服务，你也可以禁用它们中一些。我强烈建议你在禁用相关的服务前学习服务的基础知识，因为这可能会影响计算机或操作系统。图 6 显示 BUM 的图形用户界面。

#### 编辑 rc 文件

要编辑 rc 文件，你需要转到 rc 目录。这可以使用下面的命令来做到：

```
cd /etc/init.d
```

然而，访问 `init.d` 需要 root 用户权限，该目录基本上包含的是开始/停止脚本，这些脚本用于在系统运行时或启动期间控制（开始、停止、重新加载、启动启动）守护进程。

在 `init.d` 目录中的 `rc` 文件被称为<ruby> 运行控制 <rt>  run control </rt></ruby>脚本。在启动期间，`init` 执行 `rc` 脚本并发挥它的作用。为改善启动速度，我们可以更改 `rc` 文件。使用任意的文件编辑器打开 `rc` 文件（当你在 `init.d` 目录中时）。

例如，通过输入 `vim rc` ，你可以更改 `CONCURRENCY=none` 为 `CONCURRENCY=shell`。后者允许某些启动脚本同时执行，而不是依序执行。

在最新版本的内核中，该值应该被更改为 `CONCURRENCY=makeﬁle`。

图 7 和图 8 显示编辑 `rc` 文件前后的启动时间比较。可以注意到启动速度有所提高。在编辑 `rc` 文件前的启动时间是 50.98 秒，然而在对 `rc` 文件进行更改后的启动时间是 23.85 秒。

但是，上面提及的更改方法在 Ubuntu 15.10 以后的操作系统上不工作，因为使用最新内核的操作系统使用 systemd 文件，而不再是 `init.d` 文件。

#### E4rat

E4rat 代表 e4 <ruby> 减少访问时间 <rt>  reduced access time </rt></ruby>（仅在 ext4 文件系统的情况下）。它是由 Andreas Rid 和 Gundolf Kiefer 开发的一个项目。E4rat 是一个通过碎片整理来帮助快速启动的应用程序。它还会加速应用程序的启动。E4rat 使用物理文件的重新分配来消除寻道时间和旋转延迟，因而达到较高的磁盘传输速度。

E4rat 可以 .deb 软件包形式获得，你可以从它的官方网站 <http://e4rat.sourceforge.net/> 下载。

Ubuntu 默认安装的 ureadahead 软件包与 e4rat 冲突。因此必须使用下面的命令安装这几个软件包：

```
sudo dpkg purge ureadahead ubuntu-minimal
```

现在使用下面的命令来安装 e4rat 的依赖关系：

```
sudo apt-get install libblkid1 e2fslibs
```

打开下载的 .deb 文件，并安装它。现在需要恰当地收集启动数据来使 e4rat 工作。

遵循下面所给的步骤来使 e4rat 正确地运行并提高启动速度。

* 在启动期间访问 Grub 菜单。这可以在系统启动时通过按住 `shift` 按键来完成。
* 选择通常用于启动的选项（内核版本），并按 `e`。
* 查找以 `linux /boot/vmlinuz` 开头的行，并在该行的末尾添加下面的代码（在句子的最后一个字母后按空格键）：`init=/sbin/e4rat-collect or try - quiet splash vt.handsoff =7 init=/sbin/e4rat-collect`。
* 现在，按 `Ctrl+x` 来继续启动。这可以让 e4rat 在启动后收集数据。在这台机器上工作，并在接下来的两分钟时间内打开并关闭应用程序。
* 通过转到 e4rat 文件夹，并使用下面的命令来访问日志文件：`cd /var/log/e4rat`。
* 如果你没有找到任何日志文件，重复上面的过程。一旦日志文件就绪，再次访问 Grub 菜单，并对你的选项按 `e`。
* 在你之前已经编辑过的同一行的末尾输入 `single`。这可以让你访问命令行。如果出现其它菜单，选择恢复正常启动（Resume normal boot）。如果你不知为何不能进入命令提示符，按 `Ctrl+Alt+F1` 组合键。
* 在你看到登录提示后，输入你的登录信息。
* 现在输入下面的命令：`sudo e4rat-realloc /var/lib/e4rat/startup.log`。此过程需要一段时间，具体取决于机器的磁盘速度。
* 现在使用下面的命令来重启你的机器：`sudo shutdown -r now`。
* 现在，我们需要配置 Grub 来在每次启动时运行 e4rat。
* 使用任意的编辑器访问 grub 文件。例如，`gksu gedit /etc/default/grub`。
* 查找以 `GRUB CMDLINE LINUX DEFAULT=` 开头的一行，并在引号之间和任何选项之前添加下面的行：`init=/sbin/e4rat-preload 18`。
* 它应该看起来像这样：`GRUB CMDLINE LINUX DEFAULT = init=/sbin/e4rat- preload quiet splash`。
* 保存并关闭 Grub 菜单，并使用 `sudo update-grub` 更新 Grub 。
* 重启系统，你将发现启动速度有明显变化。

图 9 和图 10 显示在安装 e4rat 前后的启动时间之间的差异。可注意到启动速度的提高。在使用 e4rat 前启动所用时间是 22.32 秒，然而在使用 e4rat 后启动所用时间是 9.065 秒。

### 一些易做的调整

使用很小的调整也可以达到良好的启动速度，下面列出其中两个。

#### SSD

使用固态设备而不是普通的硬盘或者其它的存储设备将肯定会改善启动速度。SSD 也有助于加快文件传输和运行应用程序方面的速度。

#### 禁用图形用户界面

图形用户界面、桌面图形和窗口动画占用大量的资源。禁用图形用户界面是获得良好的启动速度的另一个好方法。

---

via: <https://opensourceforu.com/2019/10/how-to-go-about-linux-boot-time-optimisation/>

作者：[B Thangaraju](https://opensourceforu.com/author/b-thangaraju/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[robsean](https://github.com/robsean) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


3 个方便的命令行网速度测试工具

Summary: 用这三个开源工具检查你的互联网和局域网速度。

用这三个开源工具检查你的互联网和局域网速度。

# 3 个方便的命令行网速度测试工具

>
> 用这三个开源工具检查你的互联网和局域网速度。
>
>
>

能够验证网络连接速度使您可以控制计算机。 使您可以在命令行中检查互联网和网络速度的三个开源工具是 Speedtest、Fast 和 iPerf。

### Speedtest

[Speedtest](https://github.com/sivel/speedtest-cli) 是一个旧宠。它用 Python 实现，并打包在 Apt 中，也可用 `pip` 安装。你可以将它作为命令行工具或在 Python 脚本中使用。

使用以下命令安装：

```
sudo apt install speedtest-cli
```

或者

```
sudo pip3 install speedtest-cli
```

然后使用命令 `speedtest` 运行它：

```
$ speedtest
Retrieving speedtest.net configuration...
Testing from CenturyLink (65.128.194.58)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by CenturyLink (Cambridge, UK) [20.49 km]: 31.566 ms
Testing download speed................................................................................
Download: 68.62 Mbit/s
Testing upload speed......................................................................................................
Upload: 10.93 Mbit/s
```

它给你提供了互联网上传和下载的网速。它快速而且可脚本调用，因此你可以定期运行它，并将输出保存到文件或数据库中，以记录一段时间内的网络速度。

### Fast

[Fast](https://github.com/sindresorhus/fast-cli) 是 Netflix 提供的服务。它的网址是 [Fast.com](https://fast.com/)，同时它有一个可通过 `npm` 安装的命令行工具：

```
npm install --global fast-cli
```

网站和命令行程序都提供了相同的基本界面：它是一个尽可能简单的速度测试：

```
$ fast

     82 Mbps ↓
```

该命令返回你的网络下载速度。要获取上传速度，请使用 `-u` 标志：

```
$ fast -u

   ⠧ 80 Mbps ↓ / 8.2 Mbps ↑
```

### iPerf

[iPerf](https://iperf.fr/) 测试的是局域网速度（而不是像前两个工具一样测试互联网速度）的好方法。Debian、Raspbian 和 Ubuntu 用户可以使用 apt 安装它：

```
sudo apt install iperf
```

它还可用于 Mac 和 Windows。

安装完成后，你需要在同一网络上的两台计算机上使用它（两台都必须安装 iPerf）。指定其中一台作为服务器。

获取服务端计算机的 IP 地址：

```
ip addr show | grep inet.*brd
```

你的本地 IP 地址（假设为 IPv4 本地网络）以 `192.168` 或 `10` 开头。记下 IP 地址，以便可以在另一台计算机（指定为客户端的计算机）上使用它。

在服务端启动 `iperf`：

```
iperf -s
```

它会等待来自客户端的传入连接。将另一台计算机作为为客户端并运行此命令，将示例中的 IP 替换为服务端计算机的 IP：

```
iperf -c 192.168.1.2
```

只需几秒钟即可完成测试，然后返回传输大小和计算出的带宽。我使用家用服务器作为服务端，在 PC 和笔记本电脑上进行了一些测试。我最近在房屋周围安装了六类线以太网，因此我的有线连接速度达到 1Gbps，但 WiFi 连接速度却低得多。

你可能注意到它记录到 16Gbps。那是我使用服务器进行自我测试，因此它只是在测试写入磁盘的速度。该服务器具有仅 16 Gbps 的硬盘驱动器，但是我的台式机有 46Gbps，另外我的（较新的）笔记本超过了 60Gbps，因为它们都有固态硬盘。

### 总结

通过这些工具来了解你的网络速度是一项非常简单的任务。如果你更喜欢脚本或者在命令行中运行，上面的任何一个都能满足你。如果你要了解点对点的指标，iPerf 能满足你。

你还使用其他哪些工具来衡量家庭网络？在评论中分享你的评论。

本文最初发表在 Ben Nuttall 的 [Tooling blog](https://tooling.bennuttall.com/command-line-speedtest-tools/) 上，并获准在此使用。

---

via: <https://opensource.com/article/20/1/internet-speed-tests>

作者：[Ben Nuttall](https://opensource.com/users/bennuttall) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


7 个可用于自建电商站点的开源解决方案

# 7 个可用于自建电商站点的开源解决方案

在[之前的文章](https://itsfoss.com/open-source-cms/)中，我介绍过一些开源<ruby> 内容管理系统 <rt>  Content Management System </rt></ruby>（CMS），顾名思义，这些 CMS 平台更适用于以内容为主的站点。

那如果想要建立自己的线上购物站点呢？我们正好还有一些优秀的开源电商解决方案，可以自行部署在自己的 Linux 服务器上。

这些电商解决方案是专为搭建线上购物站点设计的，因此都集成了库存管理、商品列表、购物车、下单、愿望清单以及支付这些必需的基础功能。

但请注意，这篇文章并不会进行深入介绍。因此，我建议最好广泛试用其中的多个产品，以便进一步的了解和比较。

### 优秀的开源电商解决方案

开源电商解决方案种类繁多，一些缺乏维护的都会被我们忽略掉，以免搭建出来的站点因维护不及时而受到影响。

另外，以下的列表排名不分先后。

#### 1、nopCommerce

nopCommerce 是基于 [ASP.NET Core](https://en.wikipedia.org/wiki/ASP.NET_Core) 的自由开源的电商解决方案。如果你要找的是基于 PHP 的解决方案，可以跳过这一节了。

nopCommerce 的管理面板界面具有简洁易用的特点，如果你还使用过 OpenCart，就可能会感到似曾相识（我不是在抱怨）。在默认情况下，它就已经自带了很多基本的功能，同时还为移动端用户提供了响应式的设计。

你可以在其[官方商店](https://www.nopcommerce.com/marketplace)中获取到一些兼容的界面主题和应用扩展，还可以选择付费的支持服务。

在开始使用前，你可以从 nopCommerce 的[官方网站](https://www.nopcommerce.com/download-nopcommerce)下载源代码包，然后进行自定义配置和部署；也可以直接下载完整的软件包快速安装到 web 服务器上。详细信息可以查阅 nopCommerce 的 [GitHub 页面](https://github.com/nopSolutions/nopCommerce)或官方网站。

* [nopCommerce](https://www.nopcommerce.com/)

#### 2、OpenCart

OpenCart 是一个基于 PHP 的非常流行的电商解决方案，就我个人而言，我曾为一个项目用过它，并且体验非常好，如果不是最好的话。

或许你会觉得它维护得不是很频繁，但实际上使用 OpenCart 的开发者并不在少数。你可以获得许多受支持的扩展并将它们的功能加入到 OpenCart 中。

OpenCart 不一定是适合所有人的“现代”电商解决方案，但如果你需要的只是一个基于 PHP 的开源解决方案，OpenCart 是个值得一试的选择。在大多数具有一键式应用程序安装支持的网络托管平台中，应该可以安装 OpenCart。想要了解更多，可以查阅 OpenCart 的官方网站或 [GitHub 页面](https://github.com/opencart/opencart)。

* [OpenCart](https://www.opencart.com/)

#### 3、PrestaShop

PrestaShop 也是一个可以尝试的开源电商解决方案。

PrestaShop 是一个积极维护下的开源解决方案，它的官方商店中也有额外提供主题和扩展。与 OpenCart 不同，在托管服务平台上，你可能找不到一键安装的 PrestaShop。但不需要担心，从官方网站下载下来之后，它的部署过程也并不复杂。如果你需要帮助，也可以参考 PrestaShop 的[安装指南](http://doc.prestashop.com/display/PS17/Installing+PrestaShop)。

PrestaShop 的特点就是配置丰富和易于使用，我发现很多其它用户也在用它，你也不妨试用一下。

你也可以在 PrestaShop 的 [GitHub 页面](https://github.com/PrestaShop/PrestaShop)查阅到更多相关内容。

* [PrestaShop](https://www.prestashop.com/en)

#### 4、WooCommerce

如果你想用 [WordPress](https://wordpress.org/) 来搭建电商站点，不妨使用 WooCommerce。

从技术上来说，这种方式其实是搭建一个 WordPress 应用，然后把 WooCommerce 作为一个插件或扩展以实现电商站点所需要的功能。很多 web 开发者都知道如何使用 WordPress，因此 WooCommerce 的学习成本不会很高。

WordPress 作为目前最好的开源站点项目之一，对大部分人来说都不会有太高的门槛。它具有易用、稳定的特点，同时还支持大量的扩展插件。

WooCommerce 的灵活性也是一大亮点，在它的线上商店提供了许多设计和扩展可供选择。你也可以到它的 [GitHub 页面](https://github.com/woocommerce/woocommerce)查看相关介绍。

* [WooCommerce](https://woocommerce.com/)

#### 5、Zen Cart

这或许是一个稍显古老的电商解决方案，但同时也是最好的开源解决方案之一。如果你喜欢老式风格的模板（主要基于 HTML），而且只需要一些基础性的扩展，那你也可以尝试使用 Zen Cart。

就我个人而言，我不建议把 Zen Cart 用在一个新项目当中。但考虑到它仍然是一个活跃更新中的解决方案，如果你喜欢的话，也不妨用它来进行试验。

你也可以在 [SourceForge](https://sourceforge.net/projects/zencart/) 找到 Zen Cart 这个项目。

* [Zen Cart](https://www.zen-cart.com/)

#### 6、Magento

Magento 是 Abode 旗下的开源电商解决方案，从某种角度来说，可能比 WordPress 表现得更为优秀。

Magento 完全是作为电商应用程序而生的，因此你会发现它的很多基础功能都非常好用，甚至还提供了高级的定制。

但如果你使用的是 Magento 的开源版，可能会接触不到托管版的一些高级功能，两个版本的差异，可以在[官方文档](https://magento.com/compare-open-source-and-magento-commerce)中查看到。如果你使用托管版，还可以选择相关的托管支持服务。

想要了解更多，可以查看 Magento 的 [GitHub 页面](https://github.com/magento)。

* [Magento](https://magento.com/)

#### 7、Drupal

Drupal 是一个适用于创建电商站点的开源 CMS 解决方案。

我没有使用过 Drupal，因此我不太确定它用起来是否足够灵活。但从它的官方网站上来看，它提供的扩展模块和主题列表，足以让你轻松完成一个电商站点需要做的任何事情。

跟 WordPress 类似，Drupal 在服务器上的部署并不复杂，不妨看看它的使用效果。在它的[下载页面](https://www.drupal.org/project/drupal)可以查看这个项目以及下载最新的版本。

* [Drupal](https://www.drupal.org/industries/ecommerce)

#### 8、Odoo eCommerce

如果你还不知道，Odoo 提供了一套开源商务应用程序。他们还提供了[开源会计软件](https://itsfoss.com/open-source-accounting-software/)和 CRM 解决方案，我们将会在单独的列表中进行介绍。

对于电子商务门户，你可以根据需要使用其在线拖放生成器自定义网站。你也可以推广该网站。除了简单的主题安装和自定义选项之外，你还可以利用 HTML/CSS 在一定程度上手动自定义外观。

你也可以查看其 [GitHub](https://github.com/odoo/odoo) 页面以进一步了解它。

* [Odoo eCommerce](https://www.odoo.com/page/open-source-ecommerce)

### 总结

我敢肯定还有更多的开源电子商务平台，但是，我现在还没有遇到比我上面列出的更好的东西。

如果你还有其它值得一提的产品，可以在评论区发表。也欢迎在评论区分享你对开源电商解决方案的经验和想法。

---

via: <https://itsfoss.com/open-source-ecommerce/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[HankChow](https://github.com/HankChow) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


10 分钟构建企业级云原生框架

Summary: 对于企业来说，亟需一款能够帮助他们解决云原生基础部署和配置的产品，帮助他们抹平云原生落地场景下所需的各项应用，打通网络、存储等基础设施，让云原生变得开箱即用。

# 10 分钟构建企业级云原生框架

<ruby> 云原生 <rp>  （ </rp> <rt>  Cloud Native </rt> <rp>  ） </rp></ruby> 绝对算的上是热词一个，但是，对于绝大多数的企业，甚至是绝大多数的互联网企业来说，却从来没有动手实践过云原生。无他，现在的云原生实践成本太高。

### 企业面临的云原生困境

云原生很好，弹性拓展、容错性好、易于管理、便于观察，但是，云原生的优势对应的是其高昂的实现和落地成本。对于绝大多数企业来说，想要在自己的企业中应用云原生绝非我们说的那么简单。云原生整个生态中包含了大量的软件设备、硬件基础设施、开发运维成本等，对于绝大多数的企业来说，绝非易事。

对于不少企业来说，其核心是自己的业务逻辑，而非处理容器编排、自动化测试、微服务等，企业的需求只是让自己的业务可以更加的平稳、高性能的运转，服务好自己的客户，解决客户的问题，赚取收益。

对于这些企业来说，他们希望能够被云原生赋能，但又无法支撑起高昂的落地费用和维护成本，毕竟，看起来云原生所使用的各种组件都已经开源，企业都可以免费使用，但免费使用不意味着好用。作为云原生容器编排的首选工具，Kubernetes 的学习成本很高且安装部署极为复杂，更不用说云原生还需要配合各种组件搭配使用，还要和网络、存储等基础设施配合使用，学习成本，使用成本极高。

对于企业来说，亟需一款能够帮助他们解决云原生基础部署和配置的产品，帮助他们抹平云原生落地场景下所需的各项应用，打通网络、存储等基础设施，**让云原生变得开箱即用。**

### QKE —— 极简的云原生方案

青云QingCloud很早就感知了这个问题，并在 2018 年开发了 KubeSphere ，解决了云原生组件落地的使用和管理问题，让更多的开发者从学习 Kubernetes 的命令中解脱出来，借助 KubeSphere 的 GUI 来完成各项管理控制操作。

为了帮助企业快速稳定地落地云原生，青云又推出了 QKE （QingCloud KubeSphere Engine） 服务，是在青云QingCloud公有云上提供的 KubeSphere 容器服务，整合了来自青云公有云的计算、网络、存储资源，彻底抹平云原生落地的成本。

QKE 是基于青云QingCloud 数年的基础设施研发经验而来的，青云有自己的网络产品、存储产品，在 SDN 、存储方面有着大规模云平台经验和应用，可以很好的解决企业所需要的弹性拓展等问题。 **QKE 基于 KubeSphere 提供的 Kubernetes 的标准接口，对接了青云的各项基础设施，可以让企业可以更加轻松的完成基础设施的调用和配置，为开发者屏蔽掉底层的基础设施、运维问题，更加专注于应用本身的日常开发、运维等工作。**

同时，由于 QKE 是基于 KubeSphere 提供的，QKE 也支持了构建多云和混合云环境，只需要简单的配置，就可以将公有云中的 QKE 和部署在客户私有云或其他云环境的 KubeSphere 整合在一起，轻松的构建一整套高可用、高性能的云原生应用架构。

### 如何在 10 分钟内构建云原生方案？

QKE 的使用十分简单，对于绝大多数人来说，都可以在 10 分钟内构建出一套完整的云原生运行平台方案。

#### 1、准备工作

创建 QKE 服务之前，需要创建相应的私有网络和 VPC ，以方便后续构建 QKE 云原生集群使用。

此外，还需要创建一个 API Key，用以后续 QKE 帮助你自动调整网络及存储相关的配置。

这样就完成了基础的准备工作

#### 2、选择配置

准备工作完成后，就可以开始选择 QKE 所需的配置了。

根据实际的情况，选择所需的配置、私有网络、计费方式等。

再选择 QKE 所使用的 API KEY 和对应的公网 IP ，就可以点击创建了。

#### 3、创建成功

点击创建后，会自动进入到 QKE 的管理控制台中。在这里可以看到 QKE 帮助开发者自动创建好了所需要的集群。

#### 4、体验管理控制台

点击确认后，稍等几分钟，当看到所有的节点都变为活跃状态，就说明集群已经正常运行，就可以开始体验 QKE 提供的管理控制台了。

点击 QKE 集群详情页的 “KubeSphere 控制台链接” 标签页，找到其中的 KubeSphere 控制台地址，并使用账号 `admin@kubesphere.io` ，密码 `P@88w0rd` 即可登录到 KubeSphere 上，享受来自 KubeSphere 提供的 CI/CD、微服务管理、集群运维管理等功能。

整个 QKE 创建的过程流畅，一气呵成，十分钟，就可以轻松的部署一个 QKE 集群，十分的方便。

### QKE ：开源与云的完美结合

开源社区的兴盛近几年有目共睹，但开源社区的最大问题在于，过于理想化和技术化，这使得整个产品在可用性、产品化方面举步维艰。QKE 的出现是一个很好的开源与云计算的结合。

一方面， QKE 可以借助开源项目 KubeSphere ，吸收来自开源社区的优秀创意和修改，让用户体验得到提升，用户能力得到拓展。

另一方面，QKE 基于云计算构建，可以让开源产品得以产品化，让过去难以落地的云原生现在触手可及。对于一些技术能力储备没有那么充沛的企业来说，也可以轻松用上云原生方案，享受云原生带来的企业和商业价值。

### 总结

QKE 的出现，是开源的一小步，更是云原生的一大步。对于开源来说，产品化的路径被打通，后人可以借鉴。从云原生来说，QKE 的出现让过去需要数十个人，数人日的工作，被缩短为 10 分钟，大大的提升了云原生普及的可能。


用 Python 脚本发现 OpenStack Overcloud 中的问题

# 用 Python 脚本发现 OpenStack Overcloud 中的问题

>
> LogTool 是一组 Python 脚本，可帮助你找出 Overcloud 节点中问题的根本原因。
>
>
>

<img src="content_image/album_202002_12_211455woy57xx5q19cx175.jpg" alt="" title="">

OpenStack 在其 Overcloud 节点和 Undercloud 主机上存储和管理了一堆日志文件。因此，使用 OSP 日志文件来排查遇到的问题并不是一件容易的事，尤其在你甚至都不知道是什么原因导致问题时。

如果你正处于这种情况，那么 [LogTool](https://github.com/zahlabut/LogTool) 可以使你的生活变得更加轻松！它会为你节省本需要人工排查问题所需的时间和精力。LogTool 基于模糊字符串匹配算法，可提供过去发生的所有唯一错误和警告信息。你可以根据日志中的时间戳导出特定时间段（例如 10 分钟前、一个小时前、一天前等）的这些信息。

LogTool 是一组 Python 脚本，其主要模块 `PyTool.py` 在 Undercloud 主机上执行。某些操作模式使用直接在 Overcloud 节点上执行的其他脚本，例如从 Overcloud 日志中导出错误和警告信息。

LogTool 支持 Python 2 和 Python 3，你可以根据需要更改工作目录：[LogTool\_Python2](https://github.com/zahlabut/LogTool/tree/master/LogTool_Python2) or [LogTool\_Python3](https://github.com/zahlabut/LogTool/tree/master/LogTool_Python3)。

### 操作方式

#### 1、从 Overcloud 日志中导出错误和警告信息

此模式用于从过去发生的 Overcloud 节点中提取 **错误** 和 **警告** 信息。作为用户，系统将提示你提供“开始时间”和“调试级别”，以用于提取错误或警告消息。例如，如果在过去 10 分钟内出了问题，你则可以只提取该时间段内的错误和警告消息。

此操作模式将为每个 Overcloud 节点生成一个包含结果文件的目录。结果文件是经过压缩的简单文本文件（`*.gz`），以减少从 Overcloud 节点下载所需的时间。将压缩文件转换为常规文本文件，可以使用 `zcat` 或类似工具。此外，Vi 的某些版本和 Emacs 的任何最新版本均支持读取压缩数据。结果文件分为几部分，并在底部包含目录。

LogTool 可以即时检测两种日志文件：标准和非标准。在标准文件中，每条日志行都有一个已知的和已定义的结构：时间戳、调试级别、信息等等。在非标准文件中，日志的结构未知。例如，它可能是第三方的日志。在目录中，你可以找到每个部分的“名称 –> 行号”例如：

* **原始数据 - 从标准 OSP 日志中提取的错误/警告消息：** 这部分包含所有提取的错误/警告消息，没有任何修改或更改。这些消息是 LogTool 用于模糊匹配分析的原始数据。
* **统计信息 - 每个标准 OSP 日志的错误/警告信息数量：** 在此部分，你将找到每个标准日志文件的错误和警告数量。这些信息可以帮助你了解用于排查问题根本原因的潜在组件。
* **统计信息 - 每个标准 OSP 日志文件的唯一消息：** 这部分提供指定时间戳内的唯一的错误和警告消息。有关每个唯一错误或警告的更多详细信息，请在“原始数据”部分中查找相同的消息。
* **统计信息 - 每个非标准日志文件在任意时间的唯一消息：** 此部分包含非标准日志文件中的唯一消息。遗憾的是，LogTool 无法像标准日志文件那样的处理方式处理这些日志文件。因此，在你提取“特定时间”的日志信息时会被忽略，你会看到过去创建的所有唯一的错误/警告消息。因此，首先，向下滚动到结果文件底部的目录并查看其部分-使用目录中的行索引跳到相关部分，其中第 3、4 和 5 行的信息最重要。

#### 2、从 Overcloud 节点下载所有日志

所有 Overcloud 节点的日志将被压缩并下载到 Undercloud 主机上的本地目录。

#### 3、所有 Overcloud 日志中搜索字符串

该模式“grep”（搜索）由用户在所有 Overcloud 日志上提供的字符串。例如，你可能希望查看特定请求的所有日志消息，例如，“Create VM”的失败的请求 ID。

#### 4、检查 Overcloud 上当前的 CPU、RAM 和磁盘使用情况

该模式显示每个 Overcloud 节点上的当前 CPU、RAM 和磁盘信息。

#### 5、执行用户脚本

该模式使用户可以在 Overcloud 节点上运行自己的脚本。例如，假设 Overcloud 部署失败，你就需要在每个控制器节点上执行相同的过程来修复该问题。你可以实现“替代方法”脚本，并使用此模式在控制器上运行它。

#### 6、仅按给定的时间戳下载相关日志

此模式仅下载 Overcloud 上 “给定的时间戳”的“上次修改时间”的日志。例如，如果 10 分钟前出现错误，则与旧日志文件就没有关系，因此无需下载。此外，你不能（或不应）在某些错误报告工具中附加大文件，因此此模式可能有助于编写错误报告。

#### 7、从 Undercloud 日志中导出错误和警告信息

这与上面的模式 1 相同。

#### 8、在 Overcloud 上检查不正常的 docker

此模式用于在节点上搜索不正常的 Docker。

#### 9、下载 OSP 日志并在本地运行 LogTool

此模式允许你从 Jenkins 或 Log Storage 下载 OSP 日志（例如，`cougar11.scl.lab.tlv.redhat.com`），并在本地分析。

#### 10、在 Undercloud 上分析部署日志

此模式可以帮助你了解 Overcloud 或 Undercloud 部署过程中出了什么问题。例如，在`overcloud_deploy.sh` 脚本中，使用 `--log` 选项时会生成部署日志；此类日志的问题是“不友好”，你很难理解是什么出了问题，尤其是当详细程度设置为 `vv` 或更高时，使得日志中的数据难以读取。此模式提供有关所有失败任务的详细信息。

#### 11、分析 Gerrit（Zuul）失败的日志

此模式用于分析 Gerrit（Zuul）日志文件。它会自动从远程 Gerrit 门下载所有文件（HTTP 下载）并在本地进行分析。

### 安装

GitHub 上有 LogTool，使用以下命令将其克隆到你的 Undercloud 主机：

```
git clone https://github.com/zahlabut/LogTool.git
```

该工具还使用了一些外部 Python 模块：

#### Paramiko

默认情况下，SSH 模块通常会安装在 Undercloud 上。使用以下命令来验证是否已安装：

```
ls -a /usr/lib/python2.7/site-packages | grep paramiko
```

如果需要安装模块，请在 Undercloud 上执行以下命令：

```
sudo easy_install pip
sudo pip install paramiko==2.1.1
```

#### BeautifulSoup

此 HTML 解析器模块仅在使用 HTTP 下载日志文件的模式下使用。它用于解析 Artifacts HTML 页面以获取其中的所有链接。安装 BeautifulSoup，请输入以下命令：

```
pip install beautifulsoup4
```

你还可以通过执行以下命令使用 [requirements.txt](https://github.com/zahlabut/LogTool/blob/master/LogTool_Python3/requirements.txt) 文件安装所有必需的模块：

```
pip install -r requirements.txt
```

### 配置

所有必需的参数都直接在 `PyTool.py` 脚本中设置。默认值为：

```
overcloud_logs_dir = '/var/log/containers'
overcloud_ssh_user = 'heat-admin'
overcloud_ssh_key = '/home/stack/.ssh/id_rsa'
undercloud_logs_dir ='/var/log/containers'
source_rc_file_path='/home/stack/'
```

### 用法

此工具是交互式的，因此要启动它，只需输入：

```
cd LogTool
python PyTool.py
```

### 排除 LogTool 故障

在运行时会创建两个日志文件：`Error.log` 和 `Runtime.log`。请在你要打开的问题的描述中添加两者的内容。

### 局限性

LogTool 进行硬编码以处理最大 500 MB 的文件。

### LogTool\_Python3 脚本

在 [github.com/zahlabut/LogTool](https://github.com/zahlabut/LogTool) 获取。

---

via: <https://opensource.com/article/20/1/logtool-root-cause-identification>

作者：[Arkady Shtempler](https://opensource.com/users/ashtempl) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Morisun029](https://github.com/%E8%AF%91%E8%80%85ID) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


NVIDIA 的云游戏服务 GeForce NOW 无耻地忽略了Linux

Summary: NVIDIA 的 GeForce NOW 云游戏服务对于那些可能没有硬件但想使用 GeForce NOW 在最新的最好的游戏上获得尽可能好的游戏体验玩家来说是充满前景的

# NVIDIA 的云游戏服务 GeForce NOW 无耻地忽略了Linux

NVIDIA 的 [GeForce NOW](https://www.nvidia.com/en-us/geforce-now/) 云游戏服务对于那些可能没有硬件但想使用 GeForce NOW 在最新的最好的游戏上获得尽可能好的游戏体验玩家来说是充满前景的（在线推流游戏，并可以在任何设备上玩）。

该服务仅限于一些用户（以等待列表的形式）使用。然而，他们最近宣布 [GeForce NOW 面向所有人开放](https://blogs.nvidia.com/blog/2020/02/04/geforce-now-pc-gaming/)。但实际上并不是。

有趣的是，它**并不是面向全球所有区域**。而且，更糟的是 **GeForce NOW 不支持 Linux**。

### GeForce NOW 并不是向“所有人开放”

制作一个基于订阅的云服务来玩游戏的目的是消除平台依赖性。

就像你通常使用浏览器访问网站一样，你应该能够在每个平台上玩游戏。是这个概念吧？

好吧，这绝对不是火箭科学，但是 NVIDIA 仍然不支持 Linux（和 iOS）？

### 是因为没有人使用 Linux 吗？

我非常不同意这一点，即使这是某些不支持 Linux 的原因。如果真是这样，我不会使用 Linux 作为主要桌面操作系统来为 “It’s FOSS” 写文章。

不仅如此，如果 Linux 不值一提，你认为为何一个 Twitter 用户会提到缺少 Linux 支持？

是的，也许用户群不够大，但是在考虑将其作为基于云的服务时，**不支持 Linux** 显得没有意义。

从技术上讲，如果 Linux 上没有游戏，那么 **Valve** 就不会在 Linux 上改进 [Steam Play](https://itsfoss.com/steam-play/) 来帮助更多用户在 Linux 上玩纯 Windows 的游戏。

我不想说任何不正确的说法，但台式机 Linux 游戏的发展比以往任何时候都要快（即使统计上要比 Mac 和 Windows 要低）。

### 云游戏不应该像这样

如上所述，找到使用 Steam Play 的 Linux 玩家不难。只是你会发现 Linux 上游戏玩家的整体“市场份额”低于其他平台。

即使这是事实，云游戏也不应该依赖于特定平台。而且，考虑到 GeForce NOW 本质上是一种基于浏览器的可以玩游戏的流媒体服务，所以对于像 NVIDIA 这样的大公司来说，支持 Linux 并不困难。

来吧，Nvidia，*你想要我们相信在技术上支持 Linux 有困难？或者，你只是想说不值得支持 Linux 平台？*

### 结语

不管我为 GeForce NOW 服务发布而感到多么兴奋，当看到它根本不支持 Linux，我感到非常失望。

如果像 GeForce NOW 这样的云游戏服务在不久的将来开始支持 Linux，**你可能没有理由使用 Windows 了**（*咳嗽*）。

你怎么看待这件事？在下面的评论中让我知道你的想法。

---

via: <https://itsfoss.com/geforce-now-linux/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


通过 Git 来管理多媒体文件

# 通过 Git 来管理多媒体文件

>
> 在我们有关 Git 鲜为人知的用法系列的最后一篇文章中，了解如何使用 Git 跟踪项目中的大型多媒体文件。
>
>
>

Git 是专用于源代码版本控制的工具。因此，Git 很少被用于非纯文本的项目以及行业。然而，异步工作流的优点是十分诱人的，尤其是在一些日益增长的行业中，这种类型的行业把重要的计算和重要的艺术创作结合起来，这包括网页设计、视觉效果、视频游戏、出版、货币设计（是的，这是一个真实的行业）、教育……等等。还有许多行业属于这个类型。

在这个 Git 系列文章中，我们分享了六种鲜为人知的 Git 使用方法。在最后一篇文章中，我们将介绍将 Git 的优点带到管理多媒体文件的软件。

### Git 管理多媒体文件的问题

众所周知，Git 用于处理非文本文件不是很好，但是这并不妨碍我们进行尝试。下面是一个使用 Git 来复制照片文件的例子：

```
$ du -hs
108K .
$ cp ~/photos/dandelion.tif .
$ git add dandelion.tif
$ git commit -m 'added a photo'
[master (root-commit) fa6caa7] two photos
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dandelion.tif
$ du -hs
1.8M .
```

目前为止没有什么异常。增加一个 1.8MB 的照片到一个目录下，使得目录变成了 1.8 MB 的大小。所以下一步，我们尝试删除文件。

```
$ git rm dandelion.tif
$ git commit -m 'deleted a photo'
$ du -hs
828K .
```

在这里我们可以看到有些问题：删除一个已经被提交的文件，还是会使得存储库的大小扩大到原来的 8 倍（从 108K 到 828K）。我们可以测试多次来得到一个更好的平均值，但是这个简单的演示与我的经验一致。提交非文本文件，在一开始花费空间比较少，但是一个工程活跃地时间越长，人们可能对静态内容修改的会更多，更多的零碎文件会被加和到一起。当一个 Git 存储库变的越来越大，主要的成本往往是速度。拉取和推送的时间，从最初抿一口咖啡的时间到你觉得你可能断网了。

静态内容导致 Git 存储库的体积不断扩大的原因是什么呢？那些通过文本的构成的文件，允许 Git 只拉取那些修改的部分。光栅图以及音乐文件对 Git 文件而言与文本不同，你可以查看一下 .png 和 .wav 文件中的二进制数据。所以，Git 只不过是获取了全部的数据，并且创建了一个新的副本，哪怕是一张图仅仅修改了一个像素。

### Git-portal

在实践中，许多多媒体项目不需要或者不想追踪媒体的历史记录。相对于文本或者代码的部分，项目的媒体部分一般有一个不同的生命周期。媒体资源一般按一个方向产生：一张图片从铅笔草稿开始，以数字绘画的形式抵达它的目的地。然后，尽管文本能够回滚到早起的版本，但是艺术制品只会一直向前发展。工程中的媒体很少被绑定到一个特定的版本。例外情况通常是反映数据集的图形，通常是可以用基于文本的格式（如 SVG）完成的表、图形或图表。

所以，在许多同时包含文本（无论是叙事散文还是代码）和媒体的工程中，Git 是一个用于文件管理的，可接受的解决方案，只要有一个在版本控制循环之外的游乐场来给艺术家游玩就行。

一个启用这个特性的简单方法是 [Git-portal](http://gitlab.com/slackermedia/git-portal.git)，这是一个通过带有 Git 钩子的 Bash 脚本，它可将静态文件从文件夹中移出 Git 的范围，并通过符号链接来取代它们。Git 提交链接文件（有时候称作别名或快捷方式），这种符号链接文件比较小，所以所有的提交都是文本文件和那些代表媒体文件的链接。因为替身文件是符号链接，所以工程还会像预期的运行，因为本地机器会处理他们，转换成“真实的”副本。当用符号链接替换出文件时，Git-portal 维护了项目的结构，因此，如果你认为 Git-portal 不适合你的项目，或者你需要构建项目的一个没有符号链接的版本（比如用于分发），则可以轻松地逆转该过程。

Git-portal 也允许通过 `rsync` 来远程同步静态资源，所以用户可以设置一个远程存储位置，来做为一个中心的授权源。

Git-portal 对于多媒体的工程是一个理想的解决方案。类似的多媒体工程包括视频游戏、桌面游戏、需要进行大型 3D 模型渲染和纹理的虚拟现实工程、[带图](https://www.apress.com/gp/book/9781484241691)以及 .odt 输出的书籍、协作型的[博客站点](http://mixedsignals.ml)、音乐项目，等等。艺术家在应用程序中以图层（在图形世界中）和曲目（在音乐世界中）的形式执行版本控制并不少见——因此，Git 不会向多媒体项目文件本身添加任何内容。Git 的功能可用于艺术项目的其他部分（例如散文和叙述、项目管理、字幕文件、致谢、营销副本、文档等），而结构化远程备份的功能则由艺术家使用。

#### 安装 Git-portal

Git-portal 的 RPM 安装包位于 <https://klaatu.fedorapeople.org/git-portal>，可用于下载和安装。

此外，用户可以从 Git-portal 的 Gitlab 主页手动安装。这仅仅是一个 Bash 脚本以及一些 Git 钩子（也是 Bash 脚本），但是需要一个快速的构建过程来让它知道安装的位置。

```
$ git clone https://gitlab.com/slackermedia/git-portal.git git-portal.clone
$ cd git-portal.clone
$ ./configure
$ make
$ sudo make install
```

#### 使用 Git-portal

Git-portal 与 Git 一起使用。这意味着，如同 Git 的所有大型文件扩展一样，都需要记住一些额外的步骤。但是，你仅仅需要在处理你的媒体资源的时候使用 Git-portal，所以很容易记住，除非你把大文件都当做文本文件来进行处理（对于 Git 用户很少见）。使用 Git-portal 必须做的一个安装步骤是：

```
$ mkdir bigproject.git
$ cd !$
$ git init
$ git-portal init
```

Git-portal 的 `init` 函数在 Git 存储库中创建了一个 `_portal` 文件夹并且添加到 `.gitignore` 文件中。

在平日里使用 Git-portal 和 Git 协同十分平滑。一个较好的例子是基于 MIDI 的音乐项目：音乐工作站产生的项目文件是基于文本的，但是 MIDI 文件是二进制数据：

```
$ ls -1
_portal
song.1.qtr
song.qtr
song-Track_1-1.mid
song-Track_1-3.mid
song-Track_2-1.mid
$ git add song*qtr
$ git-portal song-Track*mid
$ git add song-Track*mid
```

如果你查看一下 `_portal` 文件夹，你会发现那里有最初的 MIDI 文件。这些文件在原本的位置被替换成了指向 `_portal` 的链接文件，使得音乐工作站像预期一样运行。

```
$ ls -lG
[...] _portal/
[...] song.1.qtr
[...] song.qtr
[...] song-Track_1-1.mid -> _portal/song-Track_1-1.mid*
[...] song-Track_1-3.mid -> _portal/song-Track_1-3.mid*
[...] song-Track_2-1.mid -> _portal/song-Track_2-1.mid*
```

与 Git 相同，你也可以添加一个目录下的文件。

```
$ cp -r ~/synth-presets/yoshimi .
$ git-portal add yoshimi
Directories cannot go through the portal. Sending files instead.
$ ls -lG _portal/yoshimi
[...] yoshimi.stat -> ../_portal/yoshimi/yoshimi.stat*
```

删除功能也像预期一样工作，但是当从 `_portal` 中删除一些东西时，你应该使用 `git-portal rm` 而不是 `git rm`。使用 Git-portal 可以确保文件从 `_portal` 中删除：

```
$ ls
_portal/    song.qtr             song-Track_1-3.mid@  yoshimi/
song.1.qtr  song-Track_1-1.mid@  song-Track_2-1.mid@
$ git-portal rm song-Track_1-3.mid
rm 'song-Track_1-3.mid'
$ ls _portal/
song-Track_1-1.mid*  song-Track_2-1.mid*  yoshimi/
```

如果你忘记使用 Git-portal，那么你需要手动删除 `_portal` 下的文件：

```
$ git-portal rm song-Track_1-1.mid
rm 'song-Track_1-1.mid'
$ ls _portal/
song-Track_1-1.mid* song-Track_2-1.mid* yoshimi/
$ trash _portal/song-Track_1-1.mid
```

Git-portal 其它的唯一功能，是列出当前所有的链接并且找到里面可能已经损坏的符号链接。有时这种情况会因为项目文件夹中的文件被移动而发生：

```
$ mkdir foo
$ mv yoshimi foo
$ git-portal status
bigproject.git/song-Track_2-1.mid: symbolic link to _portal/song-Track_2-1.mid
bigproject.git/foo/yoshimi/yoshimi.stat: broken symbolic link to ../_portal/yoshimi/yoshimi.stat
```

如果你使用 Git-portal 用于私人项目并且维护自己的备份，以上就是技术方面所有你需要知道关于 Git-portal 的事情了。如果你想要添加一个协作者或者你希望 Git-portal 来像 Git 的方式来管理备份，你可以创建一个远程位置。

#### 增加 Git-portal 远程位置

为 Git-portal 增加一个远程位置是通过 Git 已有的远程功能来实现的。Git-portal 实现了 Git 钩子（隐藏在存储库 `.git` 文件夹中的脚本），来寻找你的远程位置上是否存在以 `_portal` 开头的文件夹。如果它找到一个，它会尝试使用 `rsync` 来与远程位置同步文件。Git-portal 在用户进行 Git 推送以及 Git 合并的时候（或者在进行 Git 拉取的时候，实际上是进行一次获取和自动合并），都会执行此操作。

如果你仅克隆了 Git 存储库，那么你可能永远不会自己添加一个远程位置。这是一个标准的 Git 过程：

```
$ git remote add origin git@gitdawg.com:seth/bigproject.git
$ git remote -v
origin git@gitdawg.com:seth/bigproject.git (fetch)
origin git@gitdawg.com:seth/bigproject.git (push)
```

对你的主要 Git 存储库来说，`origin` 这个名字是一个流行的惯例，将其用于 Git 数据是有意义的。然而，你的 Git-portal 数据是分开存储的，所以你必须创建第二个远程位置来让 Git-portal 了解向哪里推送和从哪里拉取。取决于你的 Git 主机，你可能需要一个单独的服务器，因为空间有限的 Git 主机不太可能接受 GB 级的媒体资产。或者，可能你的服务器仅允许你访问你的 Git 存储库而不允许访问外部的存储文件夹：

```
$ git remote add _portal seth@example.com:/home/seth/git/bigproject_portal
$ git remote -v
origin git@gitdawg.com:seth/bigproject.git (fetch)
origin git@gitdawg.com:seth/bigproject.git (push)
_portal seth@example.com:/home/seth/git/bigproject_portal (fetch)
_portal seth@example.com:/home/seth/git/bigproject_portal (push)
```

你可能不想为所有用户提供服务器上的个人帐户，也不必这样做。为了提供对托管资源库大文件资产的服务器的访问权限，你可以运行一个 Git 前端，比如 [Gitolite](https://opensource.com/article/19/4/file-sharing-git) 或者你可以使用 `rrsync` （受限的 rsync）。

现在你可以推送你的 Git 数据到你的远程 Git 存储库，并将你的 Git-portal 数据到你的远程的门户:

```
$ git push origin HEAD
master destination detected
Syncing _portal content...
sending incremental file list
sent 9,305 bytes  received 18 bytes  1,695.09 bytes/sec
total size is 60,358,015  speedup is 6,474.10
Syncing _portal content to example.com:/home/seth/git/bigproject_portal
```

如果你已经安装了 Git-portal，并且配置了 `_portal` 的远程位置，你的 `_portal` 文件夹将会被同步，并且从服务器获取新的内容，以及在每一次推送的时候发送新的内容。尽管你不需要进行 Git 提交或者推送来和服务器同步（用户可以使用直接使用 `rsync`），但是我发现对于艺术性内容的改变，提交是有用的。这将会把艺术家及其数字资产集成到工作流的其余部分中，并提供有关项目进度和速度的有用元数据。

### 其他选择

如果 Git-portal 对你而言太过简单，还有一些用于 Git 管理大型文件的其他选择。[Git 大文件存储](https://git-lfs.github.com/)（LFS）是一个名为 git-media 的停工项目的分支，这个分支由 GitHub 维护和支持。它需要特殊的命令（例如 `git lfs track` 来保护大型文件不被 Git 追踪）并且需要用户维护一个 `.gitattributes` 文件来更新哪些存储库中的文件被 LFS 追踪。对于大文件而言，它**仅**支持 HTTP 和 HTTPS 远程主机。所以你必须配置 LFS 服务器，才能使得用户可以通过 HTTP 而不是 SSH 或 `rsync` 来进行鉴权。

另一个相对 LFS 更灵活的选择是 [git-annex](https://git-annex.branchable.com/)。你可以在我的文章 [管理 Git 中大二进制 blob](https://opensource.com/life/16/8/how-manage-binary-blobs-git-part-7) 中了解更多（忽略其中 git-media 这个已经废弃项目的章节，因为其灵活性没有被它的继任者 Git LFS 延续下来）。Git-annex 是一个灵活且优雅的解决方案。它拥有一个细腻的系统来用于添加、删除、移动存储库中的大型文件。因为它灵活且强大，有很多新的命令和规则需要进行学习，所以建议看一下它的[文档](https://git-annex.branchable.com/walkthrough/)。

然而，如果你的需求很简单，你可能更加喜欢整合已有技术来进行简单且明显任务的解决方案，则 Git-portal 可能是对于工作而言比较合适的工具。

---

via: <https://opensource.com/article/19/4/manage-multimedia-files-git>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[svtter](https://github.com/svtter) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用此开源窗口环境一次运行多个控制台

# 使用此开源窗口环境一次运行多个控制台

>
> 在我们的 20 个使用开源提升生产力的系列的第十四篇文章中用 twin 模拟了老式的 DESQview 体验。
>
>
>

去年，我在 19 天里给你介绍了 19 个新（对你而言）的生产力工具。今年，我换了一种方式：使用你在使用或者还没使用的工具，构建一个使你可以在新一年更加高效的环境。

### 通过 twin 克服“一个屏幕，一个应用程序”的限制

还有人记得 [DESQview](https://en.wikipedia.org/wiki/DESQview) 吗？我们在 Windows、Linux 和 MacOS 中理所当然地可以在屏幕上同时运行多个程序，而 DESQview 赋予了 DOS 同样的功能。在我运营拨号 BBS 服务的初期，DESQview 是必需的，它使我能够让 BBS 在后台运行，同时在前台进行其他操作。例如，当有人拨打电话时，我可能正在开发新功能或设置新的外部程序而不会影响他们的体验。后来，在我早期做支持工作的时候，我可以同时运行我的工作电子邮件（[MHS 上的 DaVinci 电子邮件](https://en.wikipedia.org/wiki/Message_Handling_System)）、支持单据系统和其他 DOS 程序。这是令人吃惊的！

从那时起，运行多个控制台应用程序的功能已经发展了很多。但是 [tmux](https://github.com/tmux/tmux/wiki) 和 [Screen](https://www.gnu.org/software/screen/) 等应用仍然遵循“一个屏幕，一个应用”的显示方式。好吧，是的，tmux 具有屏幕拆分和窗格，但是不像 DESQview 那样具有将窗口“浮动”在其他窗口上的功能，就我个人而言，我怀念那个功能。

让我们来看看 [twin](https://github.com/cosmos72/twin)（文本模式窗口环境）。我认为，这个相对年轻的项目是 DESQview 的精神继任者。它支持控制台和图形环境，并具有与会话脱离和重新接驳的功能。设置起来并不是那么容易，但是它可以在大多数现代操作系统上运行。

Twin 是从源代码安装的（现在是这样）。但是首先，你需要安装所需的开发库。库名称将因操作系统而异。 以下示例显示了在我的 Ubuntu 19.10 系统中的情况。一旦安装了依赖库，请从 Git 中检出 twin 源代码，并运行 `./configure` 和 `make`，它们应自动检测所有内容并构建 twin：

```
sudo apt install libx11-dev libxpm-dev libncurses-dev zlib1g-dev libgpm-dev
git clone git@github.com:cosmos72/twin.git
cd twin
./configure
make
sudo make install
```

注意：如果要在 MacOS 或 BSD 上进行编译，则需要在运行 `make` 之前在文件 `include/Tw/autoconf.h` 和 `include/twautoconf.h` 中注释掉 `#define socklen_t int`。这个问题应该在 [twin #57](https://github.com/cosmos72/twin/issues/57) 解决了。

第一次调用 twin 是一个挑战。你需要通过 `--hw` 参数告诉它正在使用哪种显示。例如，要启动文本模式的 twin，请输入 `twin --hw=tty,TERM=linux`。这里指定的 `TERM` 变量替代了你当前 Shell 中终端变量。要启动图形版本，运行 `twin --hw=X@$DISPLAY`。在 Linux 上，twin 一般都“可以正常工作”，而在 MacOS 上，Twin 基本是只能在终端上使用。

*真正*的乐趣是可以通过 `twattach` 和 `twdisplay` 命令接驳到正在运行的会话的功能。它们使你可以接驳到其他正在运行的 twin 会话。例如，在 Mac 上，我可以运行以下命令以接驳到演示机器上运行的 twin 会话：

```
twdisplay --twin@20days2020.local:0 --hw=tty,TERM=linux
```

通过多做一些工作，你还可以将其用作登录外壳，以代替控制台上的 [getty](https://en.wikipedia.org/wiki/Getty_(Unix))。这需要 gdm 鼠标守护程序、twdm 应用程序（包括）和一些额外的配置。在使用 systemd 的系统上，首先安装并启用 gdm（如果尚未安装），然后使用 `systemctl` 为控制台（我使用 tty6）创建一个覆盖。这些命令必须以 root 用户身份运行；在 Ubuntu 上，它们看起来像这样：

```
apt install gdm
systemctl enable gdm
systemctl start gdm
systemctl edit getty@tty6
```

`systemctl edit getty@tty6` 命令将打开一个名为 `override.conf` 的空文件。它可以定义 systemd 服务设置以覆盖 tty6 的默认设置。将内容更新为：

```
[service]
ExecStart=
ExecStart=-/usr/local/sbin/twdm --hw=tty@/dev/tty6,TERM=linux
StandardInput=tty
StandardOutput=tty
```

现在，重新加载 systemd 并重新启动 tty6 以获得 twin 登录提示界面：

```
systemctl daemon-reload
systemctl restart getty@tty6
```

这将为登录的用户启动一个 twin 会话。我不建议在多用户系统中使用此会话，但是对于个人桌面来说，这是很酷的。并且，通过使用 `twattach` 和 `twdisplay`，你可以从本地 GUI 或远程桌面访问该会话。

我认为 twin 真是太酷了。它还有一些细节不够完善，但是基本功能都已经有了，并且有一些非常好的文档。另外，它也使我可以在现代操作系统上稍解对 DESQview 式的体验的渴望。我希望随着时间的推移它会有所改进，希望你和我一样喜欢它。

---

via: <https://opensource.com/article/20/1/multiple-consoles-twin>

作者：[Kevin Sonney](https://opensource.com/users/ksonney) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


从监狱到 Python

Summary: 入狱后，开源编程是如何提供机会的。

入狱后，开源编程是如何提供机会的。

# 从监狱到 Python

>
> 入狱后，开源编程是如何提供机会的。
>
>
>

<img src="content_image/album_202002_15_114918ditsiiu9p6x6u69m.jpg" alt="" title="">

不到一年前，我还在圣昆廷州立监狱服刑，我是无期徒刑。

我高三的时候，我抢劫了一个人并向他开了枪。现在，我经过一段时间才意识到并承认自己做错了，这是在经历了陪审团审判并看到我的行为带来的恶果后，我知道需要改变自己，我也确实做到了。尽管我对我的行为表示懊悔，但我毕竟开枪打了一个人，并差点杀了他。做这样的事是有后果的，这是理所当然的。所以在我 18 岁的时候，我被判了终身监禁。

监狱是一个非常可怕的地方；我是不推荐你去的。但是我必须去，所以我去了。我不告诉你具体的细节，但你可以放心，这是一个没有太多动机去改变的地方，许多人在这里养成的坏习惯比他们过去在别处养成的更多。

我是幸运儿之一。当我在服刑的时候，发生了一些不同寻常的事情。我开始想象自己出狱后的的未来，虽然在这之前，我还是已经在那里度过了我整个成年生活。

现在你想想：我是黑人，只受过高中教育。我没有工作经历，如果我离开监狱，在被释放前，我还是一个被定罪的重罪犯。当每个雇主看到我的简历，都不会有“我需要雇用这个人”想法，我认为是正常的。

我不知道我的选择是什么，但我已经下定决心了。我需要做些活下去的事情，并且这和我入狱前的生活一点也不像。

### Python 之路

最终，我被关在了圣昆廷州立监狱，我不知道我为何幸运地被关在那里。圣昆廷提供了几个自助和教育编程项目。这些[改造机会](https://www.dailycal.org/2019/02/27/san-quentin-rehabilitation-programs-offer-inmates-education-a-voice/)帮助囚犯使他们拥有在获释后避免再次犯罪的技能。

作为其中一个编程项目的一部分，2017 年我通过圣昆廷媒体项目认识了[杰西卡·麦凯拉](https://twitter.com/jessicamckellar?lang=en)。杰西卡是编程语言 [Python](https://www.python.org/) 的爱好者，她开始向我推荐 Python 有多棒，以及它是刚起步的人学习的完美语言。这就是故事变得比小说更精彩的地方。

>
> 感谢 [@northbaypython](https://twitter.com/northbaypython?ref_src=twsrc%5Etfw) 让 [@ShaStepter](https://twitter.com/ShaStepter?ref_src=twsrc%5Etfw) 和我重复 [@pycon](https://twitter.com/pycon?ref_src=twsrc%5Etfw) 的主题演讲，让他们被录制下来。我很荣幸与大家分享：
>
>
> 从监狱到 Pythone: <https://t.co/rcumoAgZHm>
>
>
> 大规模裁员:如果我们不雇佣被判重罪的人，谁会呢？ <https://t.co/fENDUFdxfX>
>
>
> [pic.Twitter.com/kpjo8d3ul6](https://t.co/Kpjo8d3ul6)
>
>
> —杰西卡·麦凯拉（@jessicamckellar）[2019 年 11 月 5 日](https://twitter.com/jessicamckellar/status/1191601209917837312?ref_src=twsrc%5Etfw)
>
>
>

杰西卡向我介绍了一些 Python 视频教程，这些教程是她为一家名叫 [O’Reilly Media](http://shop.oreilly.com/product/110000448.do) 的公司做的，课程是在线的，如果我能接触到它们，那该有多好呀。不幸的是，在监狱里上网是不可能的。但是，我遇到了一个叫 Tim O’Reilly 的人，他最近刚来到圣昆廷。在他访问之后，Tim 从他的公司 O’Reilly Media 公司向监狱的编程班捐赠了大量内容。最终，我拿到了一款平板电脑，上面有杰西卡的 Python 教程，并学会了如何使用这些 Python 教程进行编码。

真是难以置信。背景和生活与我完全不同的陌生人把这些联系在一起，让我学会了编码。

### 对 Python 社区的热爱

在这之后，我开始经常和杰西卡见面，她开始告诉我关于开源社区的情况。我了解到，从根本上说，开源社区就是关于伙伴关系和协作的社区。之所以如此有效，是因为没有人被排除在外。

对我来说，一个努力寻找自己定位的人，我所看到的是一种非常基本的爱——通过合作和接受的爱，通过接触的爱，通过包容的爱。我渴望成为其中的一部分。所以我继续学习 Python，不幸的是，我无法获得更多的教程，但是我能够从开源社区收集的大量书面知识中获益。我读一切提到 Python 的东西，从平装本到晦涩难懂的杂志文章，我使用平板电脑来解决我读到的 Python 问题。

我对 Python 和编程的热情不是我的许多同龄人所共有的。除了监狱编程课上的极少数人之外，我认识的其他人都没有提到过编程；一般囚犯都不知道。我认为这是因为有过监禁经历的人无法接触编程，尤其是如果你是有色人种。

### 监狱外的 Python 生活

然而，在 2018 年 8 月 17 日，我得到了生命中的惊喜。时任州长的杰里·布朗将我 27 年的刑期减刑，在服刑将近 19 年后，我被释放出狱了。

但现实情况是，这也是为什么我认为编程和开源社区如此有价值。我是一名 37 岁的黑人罪犯，没有工作经历，刚刚在监狱服刑 18 年。我有犯罪史，并且现存偏见导致没有多少职业适合我。但是编程是少数例外之一。

现在，监禁后重返社会的人们迫切需要包容，但当谈及工作场所的多样性以及对多样性的需求时，你真的听不到这个群体被提及或包容。

>
> 还有什么:
>
>
> 1、背景调查：询问他们在你的公司是如何使用的。
>
>
> 2、初级角色：删除虚假的、不必要的先决条件，这些条件将排除有记录的合格人员。
>
>
> 3、积极拓展：与当地再就业项目合作，创建招聘渠道。
>
>
> [pic.twitter.com/WnzdEUTuxr](https://t.co/WnzdEUTuxr)
>
>
> —杰西卡·麦凯拉（@jessicamckellar）[2019 年 5 月 12 日](https://twitter.com/jessicamckellar/status/1127640222504636416?ref_src=twsrc%5Etfw)
>
>
>

因此，我想谦卑地挑战开源社区的所有程序员和成员，让他们围绕包容和多样性展开思考。今天，我自豪地站在你们面前，代表一个大多数人都没有想到的群体——以前被监禁的人。但是我们存在，我们渴望证明我们的价值，最重要的是，我们期待被接受。当我们重返社会时，许多挑战等待着我们，我请求你们允许我们有机会展示我们的价值。欢迎我们，接受我们，最重要的是，包容我们。

---

via: <https://opensource.com/article/20/1/prison-to-python>

作者：[Shadeed Sha Wallace-Stepter](https://opensource.com/users/shastepter) 选题：[lujun9972](https://github.com/lujun9972) 译者：[heguangzhi](https://github.com/heguangzhi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


开始使用 GnuCash

Summary: 使用 GnuCash 管理你的个人或小型企业会计。

使用 GnuCash 管理你的个人或小型企业会计。

# 开始使用 GnuCash

>
> 使用 GnuCash 管理你的个人或小型企业会计。
>
>
>

在过去的四年里，我一直在用 [GnuCash](https://www.gnucash.org/) 来管理我的个人财务，我对此非常满意。这个开源（GPL v3）项目自 1998 年首次发布以来一直成长和改进，2019 年 12 月发布的最新版本 3.8 增加了许多改进和 bug 修复。

GnuCash 可在 Windows、MacOS 和 Linux 中使用。它实现了一个复式记账系统，并可以导入各种流行的开放和专有文件格式，包括 QIF、QFX、OFX、CSV 等。这使得从其他财务应用转换（包括 Quicken）而来很容易，它是为取代这些而出现的。

借助 GnuCash，你可以跟踪个人财务状况以及小型企业会计和开票。它没有集成的工资系统。根据文档，你可以在 GnuCash 中跟踪工资支出，但你必须在该软件外计算税金和扣减。

### 安装

要在 Linux 上安装 GnuCash：

* 在 Red Hat、CentOS 或 Fedora 中： `$ sudo dnf install gnucash`
* 在 Debian、Ubuntu 或 Pop\_OS 中： `$ sudo apt install gnucash`

你也可以从 [Flathub](https://flathub.org/apps/details/org.gnucash.GnuCash) 安装它，我在运行 Elementary OS 的笔记本上使用它。（本文中的所有截图都来自此次安装）。

### 设置

安装并启动程序后，你将看到一个欢迎屏幕，该页面提供了创建新账户集、导入 QIF 文件或打开新用户教程的选项。

#### 个人账户

如果你选择第一个选项（正如我所做的那样），GnuCash 会打开一个页面帮你起步。它收集初始数据并设置账户首选项，例如账户类型和名称、商业数据（例如，税号）和首选货币。

GnuCash 支持个人银行账户、商业账户、汽车贷款、CD 和货币市场账户、儿童保育账户等。

例如，首先创建一个简单的支票簿。你可以输入账户的初始余额或以多种格式导入现有账户数据。

#### 开票

GnuCash 还支持小型企业功能，包括客户、供应商和开票。要创建发票，请在 “Business -> Invoice” 中输入数据。

然后，你可以将发票打印在纸上，也可以将其导出到 PDF 并通过电子邮件发送给你的客户。

### 获取帮助

如果你有任何疑问，它有一个优秀的帮助，你可在菜单栏的右侧获取指导。

该项目的网站包含许多有用的信息的链接，例如 GnuCash [功能](https://www.gnucash.org/features.phtml)的概述。GnuCash 还提供了[详细的文档](https://www.gnucash.org/docs/v3/C/gnucash-help.pdf)，可供下载和离线阅读，它还有一个 [wiki](https://wiki.gnucash.org/wiki/GnuCash)，为用户和开发人员提供了有用的信息。

你可以在项目的 [GitHub](https://github.com/Gnucash) 仓库中找到其他文件和文档。GnuCash 项目由志愿者驱动。如果你想参与，请查看项目的 wiki 上的 [Getting involved](https://wiki.gnucash.org/wiki/GnuCash#Getting_involved_in_the_GnuCash_project) 部分。

---

via: <https://opensource.com/article/20/2/gnucash>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Joplin：真正的 Evernote 开源替代品

【Joplin Bug】这joplin就不好的短板就是没考虑隐私保密的问题，我本来想终于找到Evernote的替代品了，但下载了App后使用过发现，这TM居然没有locked功能，用来写个人日记和记录各种东西的想法都没了。没有锁定功能的Encrypted Digital Notebooks工具有卵用？没任何保密措施，别人一点击程序，就能看到写了什么，没任何隐私可言。

不用密码/密匙就能开的Encrypted Digital Notebooks有什么用？开源又如何？没了安全和隐私保障称得了算是Note工具吗？

所以建议老弟，如果你英文可以，就给joplin Support在GitHub  Issues和Forum写建议增加

# Joplin：真正的 Evernote 开源替代品

>
> Joplin 是一个开源笔记记录和待办应用。你可以将笔记组织到笔记本中并标记它们。Joplin 还提供网络剪贴板来保存来自互联网的文章。
>
>
>

### Joplin：开源笔记管理器

如果你喜欢 [Evernote](https://evernote.com/)，那么你不会不太适应这个开源软件 [Joplin](https://joplinapp.org/)。

Joplin 是一个优秀的开源笔记应用，拥有丰富的功能。你可以记笔记、记录待办事项并且通过和 Dropbox 和 NextCloud 等云服务链接来跨设备同步笔记。同步过程通过端到端加密保护。

Joplin 还有一个 Web 剪贴板，能让你将网页另存为笔记。这个网络剪贴板可用于 Firefox 和 Chrome/Chromium 浏览器。

Joplin 可以导入 enex 格式的 Evernote 文件，这让从 Evernote 切换变得容易。

因为数据自行保存，所以你可以用 Joplin 格式或者原始格式导出所有文件。

### Joplin 的功能

以下是 Joplin 的所有功能列表：

* 将笔记保存到笔记本和子笔记本中，以便更好地组织
* 创建待办事项清单
* 可以标记和搜索笔记
* 离线优先，因此即使没有互联网连接，所有数据始终在设备上可用
* Markdown 笔记支持图片、数学符号和复选框
* 支持附件
* 可在桌面、移动设备和终端（CLI）使用
* 可在 Firefox 和 Chrome 使用[网页剪切板](https://joplinapp.org/clipper/)
* 端到端加密
* 保留笔记历史
* 根据名称、时间等对笔记进行排序
* 可与 [Nextcloud](https://nextcloud.com/)、Dropbox、WebDAV 和 OneDrive 等各种[云服务](https://itsfoss.com/cloud-services-linux/)同步
* 从 Evernote 导入文件
* 导出 JEX 文件（Joplin 导出格式）和原始文件
* 支持笔记、待办事项、标签和笔记本
* 任意跳转功能
* 支持移动设备和桌面应用通知
* 地理位置支持
* 支持多种语言
* 外部编辑器支持：在 Joplin 中一键用你最喜欢的编辑器打开笔记

### 在 Linux 和其它平台上安装 Joplin

[Joplin](https://github.com/laurent22/joplin) 是一个跨平台应用，可用于 Linux、macOS 和 Windows。在移动设备上，你可以[获取 APK 文件](https://itsfoss.com/download-apk-ubuntu/)将其安装在 Android 和基于 Android 的 ROM 上。你也可以[从谷歌 Play 商店下载](https://play.google.com/store/apps/details?id=net.cozic.joplin&hl=en_US)。

在 Linux 中，你可以获取 Joplin 的 [AppImage](https://itsfoss.com/use-appimage-linux/) 文件，并作为可执行文件运行。你需要为下载的文件授予执行权限。

* [下载 Joplin](https://github.com/laurent22/joplin/releases)

### 体验 Joplin

Joplin 中的笔记使用 Markdown，但你不需要了解它。编辑器的顶部面板能让你以图形方式选择项目符号、标题、图像、链接等。

虽然 Joplin 提供了许多有趣的功能，但你需要自己去尝试。例如，默认情况下未启用 Web 剪切板，我需要发现如何打开它。

你需要从桌面应用启用剪切板。在顶部菜单中，进入 “Tools->Options”。你可以在此处找到 Web 剪切板选项：

它的 Web 剪切板不如 Evernote 的 Web 剪切板聪明，后者可以以图形方式剪辑网页文章的一部分。但是，也足够了。

这是一个在活跃开发中的开源软件，我希望它随着时间的推移得到更多的改进。

### 总结

如果你正在寻找一个不错的拥有 Web 剪切板的笔记应用，你可以试试 Joplin。如果你喜欢它，并将继续使用，尝试通过捐赠或改进代码和文档来帮助 Joplin 开发。我以 FOSS 的名义[捐赠](https://itsfoss.com/donations-foss/)了 25 欧。

如果你曾经使用过 Joplin，或者仍在使用它，你对此的体验如何？如果你用的是其他笔记应用，你会切换到 Joplin 么？欢迎分享你的观点。

---

via: <https://itsfoss.com/joplin/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 GSConnect 将 Android 手机连接到 Fedora 系统

很好用

来自河南郑州的 Chrome Mobile 80.0|Android 8.0 用户

识别不到设备

# 使用 GSConnect 将 Android 手机连接到 Fedora 系统

苹果和微软公司都不同程度的提供了桌面产品与移动设备集成。Fedora 提供了类似甚至更高集成度的工具——GSConnect。它可以让你将安卓手机和你的 Fedora 桌面配对并使用。请继续阅读，以了解更多关于它的情况以及它是如何工作的信息。

### GSConnect 是什么?

GSConnect 是针对 GNOME 桌面定制的 KDE Connect 程序。KDE Connect 可以使你的设备能够互相通信。但是，在 Fedora 默认的 GNOME 桌面上安装它需要安装大量的 KDE 依赖。

GSConnect 是一个 KDE Connect 的完整实现，其以 GNOME shell 的拓展形式出现。安装后，GSConnect 允许你执行以下操作及更多：

* 在计算机上接收电话通知并回复信息
* 用手机操纵你的桌面
* 在不同设备之间分享文件与链接
* 在计算机上查看手机电量
* 让手机响铃以便你能找到它

### 设置 GSConnect 扩展

设置 GSConnect 需要安装两个组件：计算机上的 GSConnect 扩展和 Android 设备上的 KDE Connect 应用。

首先，从 GNOME Shell 扩展网站上安装 [GSConnect](https://extensions.gnome.org/extension/1319/gsconnect/) 扩展。（Fedora Magazine 有一篇关于[如何安装 GNOME Shell 扩展](https://fedoramagazine.org/install-gnome-shell-extension/)的文章，可以帮助你完成这一步。）

KDE Connect 应用程序可以在 Google 的 [Play 商店](https://play.google.com/store/apps/details?id=org.kde.kdeconnect_tp)上找到。它也可以在 FOSS Android 应用程序库 [F-Droid](https://f-droid.org/en/packages/org.kde.kdeconnect_tp/) 上找到。

一旦安装了这两个组件，就可以配对两个设备。安装扩展后它在你的系统菜单中显示为“<ruby> 移动设备 <rt>  Mobile Devices </rt></ruby>”。单击它会出现一个下拉菜单，你可以从中访问“<ruby> 移动设置 <rt>  Mobile Settings </rt></ruby>”。

你可以在这里用 GSConnect 查看并管理已配对的设备。进入此界面后，需要在 Android 设备上启动应用程序。

你可以在任意一台设备上进行配对初始化，在这里我们从 Android 设备连接到计算机。点击应用程序上的“刷新”，只要两个设备都在同一个无线网络环境中，你的 Android 设备便可以搜索到你的计算机。现在可以向桌面发送配对请求，并在桌面上接受配对请求以完成配对。

### 使用 GSConnect

配对后，你将需要在 Android 设备授予权限，才能使用 GSConnect 上提供的许多功能。单击设备列表中的已配对设备，便可以查看所有可用功能，并根据你的偏好和需要启用或禁用它们。

请记住，你还需要在这个 Android 应用程序中授予相应的权限才能使用这些功能。启用权限后，你现在可以访问桌面上的移动联系人，获得消息通知并回复消息，甚至同步桌面和 Android 设备的剪贴板。

### 将你的浏览器与“文件”应用集成

GSConnect 允许你直接从计算机上的文件资源管理器的关联菜单向 Android 设备发送文件。

在 Fedora 的默认 GNOME 桌面上，你需要安装 `nautilus-python` 依赖包，以便在关联菜单中显示配对的设备。安装此命令非常简单，只需要在你的首选终端运行以下命令：

```
$ sudo dnf install nautilus-python
```

完成后，将在“<ruby> 文件 <rt>  Files </rt></ruby>”应用的关联菜单中显示“<ruby> 发送到移动设备 <rt>  Send to Mobile Device </rt></ruby>”选项。

同样，为你的浏览器安装相应的 WebExtension，无论是 [Firefox](https://addons.mozilla.org/en-US/firefox/addon/gsconnect/) 还是 [Chrome](https://chrome.google.com/webstore/detail/gsconnect/jfnifeihccihocjbfcfhicmmgpjicaec) 浏览器，都可以将链接发送到你的 Android 设备。你可以选择直接发送链接以在浏览器中直接打开，或将其作为短信息发送。

### 运行命令

GSConnect 允许你定义命令，然后可以从远程设备在计算机上运行这些命令。这使得你可以远程截屏，或者从你的 Android 设备锁定和解锁你的桌面。

要使用此功能，可以使用标准的 shell 命令和 GSConnect 提供的 CLI。该项目的 GitHub 存储库（CLI Scripting）中提供了有关此操作的文档。

[KDE UserBase Wiki](https://userbase.kde.org/KDE_Connect/Tutorials/Useful_commands) 有一个命令示例列表。这些例子包括控制桌面的亮度和音量、锁定鼠标和键盘，甚至更改桌面主题。其中一些命令是针对 KDE Plasma 设计的，需要进行修改才能在 GNOME 桌面上运行。

### 探索并享受乐趣

GSConnect 使我们能够享受到极大的便利和舒适。深入研究首选项，查看你可以做的所有事情，灵活的使用这些命令功能发挥创意，并在下面的评论中自由分享你解锁的新方式。

---

via: <https://fedoramagazine.org/connect-fedora-to-your-android-phone-with-gsconnect/>

作者：[Lokesh Krishna](https://fedoramagazine.org/author/lowkeyskywalker/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[chai-yuan](https://github.com/chai-yuan) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何防范误植攻击

Summary: 误植是一种引诱用户将敏感数据泄露给不法分子的方式，针对这种攻击方式，我们很有必要了解如何保护我们的组织、我们的开源项目以及我们自己。

# 如何防范误植攻击

>
> <ruby> 误植 <rt>  Typosquatting </rt></ruby>是一种引诱用户将敏感数据泄露给不法分子的方式，针对这种攻击方式，我们很有必要了解如何保护我们的组织、我们的开源项目以及我们自己。
>
>
>

除了常规手段以外，网络罪犯还会利用社会工程的方式，试图让安全意识较弱的人泄露私人信息或是有价值的证书。很多[网络钓鱼骗局](https://www.cloudberrylab.com/resources/guides/types-of-phishing/)的实质都是攻击者伪装成信誉良好的公司或组织，然后借此大规模传播病毒或恶意软件。

<ruby>   误植  <rt>  Typosquatting </rt></ruby>就是其中一个常用的手法。它是一种社会工程学的攻击方式，通过使用一些合法网站的错误拼写的 URL 以引诱用户访问恶意网站，这样的做法既使真正的原网站遭受声誉上的损害，又诱使用户向这些恶意网站提交个人敏感信息。因此，网站的管理人员和用户双方都应该意识到这个问题带来的风险，并采取措施加以保护。

一些由广大开发者在公共代码库中维护的开源软件通常都被认为具有安全上的优势，但当面临社会工程学攻击或恶意软件植入时，开源软件也需要注意以免受到伤害。

下面就来关注一下误植攻击的发展趋势，以及这种攻击方式在未来可能对开源软件造成的影响。

### 什么是误植？

误植是一种非常特殊的网络犯罪形式，其背后通常是一个更大的网络钓鱼骗局。不法分子首先会购买和注册域名，而他们注册的域名通常是一个常用网站的错误拼写形式，例如在正确拼写的基础上添加一个额外的元音字母，又或者是将字母“i”替换成字母“l”。对于同一个正常域名，不法分子通常会注册数十个拼写错误的变体域名。

用户一旦访问这样的域名，不法分子的目的就已经成功了一半。为此，他们会通过电子邮件的方式，诱导用户访问这样的伪造域名。伪造域名指向的页面中，通常都带有一个简单的登录界面，还会附上熟悉的被模仿网站的徽标，尽可能让用户认为自己访问的是真实的网站。

如果用户没有识破这一个骗局，在页面中提交了诸如银行卡号、用户名、密码等敏感信息，这些数据就会被不法分子所完全掌控。进一步来看，如果这个用户在其它网站也使用了相同的用户名和密码，那就有同样受到波及的风险。受害者最终可能会面临身份被盗、信用记录被破坏等危险。

### 最近的一些案例

从网站的所有方来看，遭到误植攻击可能会带来一场公关危机。尽管网站域名的所有者没有参与到犯罪当中，但这会被认为是一次管理上的失职，因为域名所有者有主动防御误植攻击的责任，以避免这一类欺诈事件的发生。

在几年之前就发生过[一起案件](https://www.menlosecurity.com/blog/-a-new-approach-to-end-typosquatting)，很多健康保险客户收到了一封指向 we11point.com 的钓鱼电子邮件，其中 URL 里正确的字母“l”被换成了数字“1”，从而导致一批用户成为了这一次攻击的受害者。

最初，与特定国家/地区相关的顶级域名是不允许随意注册的。但后来国际域名规则中放开这一限制之后，又兴起了一波新的误植攻击。例如最常见的一种手法就是注册一个与 .com 域名类似的 .om 域名，一旦在输入 URL 时不慎遗漏了字母 c 就会给不法分子带来可乘之机。

### 网站如何防范误植攻击

对于一个公司来说，最好的策略就是永远比误植攻击采取早一步的行动。

也就是说，在注册域名的时候，不仅要注册自己商标名称的域名，最好还要同时注册可能由于拼写错误产生的其它域名。当然，没有太大必要把可能导致错误的所有顶级域名都注册掉，但至少要把可能导致错误的一些一级域名抢注下来。

如果你有让用户跳转到一个第三方网站的需求，务必要让用户从你的官方网站上进行跳转，而不应该通过类似群发邮件的方式向用户告知 URL。因此，必须明确一个策略：在与用户通信交流时，不将用户引导到官方网站以外的地方去。在这样的情况下，如果有不法分子试图以你公司的名义发布虚假消息，用户将会从带有异样的页面或 URL 上有所察觉。

你可以使用类似 [DNS Twist](https://github.com/elceef/dnstwist) 的开源工具来扫描公司正在使用的域名，它可以确定是否有相似的域名已被注册，从而暴露潜在的误植攻击。DNS Twist 可以在 Linux 系统上通过一系列的 shell 命令来运行。

还有一些网络提供商（ISP）会将防护误植攻击作为他们网络产品的一部分。这就相当于一层额外的保护，如果用户不慎输入了带有拼写错误的 URL，就会被提示该页面已经被阻止并重定向到正确的域名。

如果你是系统管理员，还可以考虑运行一个自建的 [DNS 服务器](https://opensource.com/article/17/4/build-your-own-name-server)，以便通过黑名单的机制禁止对某些域名的访问。

你还可以密切监控网站的访问流量，如果来自某个特定地区的用户被集体重定向到了虚假的站点，那么访问量将会发生骤降。这也是一个有效监控误植攻击的角度。

防范误植攻击与防范其它网络攻击一样需要保持警惕。所有用户都希望网站的所有者能够扫除那些与正主类似的假冒站点，如果这项工作没有做好，用户的信任对你的信任程度就会每况愈下。

### 误植对开源软件的影响

因为开源项目的源代码是公开的，所以其中大部分项目都会进行安全和渗透测试。但错误是不可能完全避免的，如果你参与了开源项目，还是有需要注意的地方。

当你收到一个不明来源的<ruby> 合并请求 <rt>  Merge Request </rt></ruby>或补丁时，必须在合并之前仔细检查，尤其是相关代码涉及到网络层面的时候。不要屈服于只测试构建的诱惑； 一定要进行严格的检查和测试，以确保没有恶意代码混入正常的代码当中。

同时，还要严格按照正确的方法使用域名，避免不法分子创建仿冒的下载站点并提供带有恶意代码的软件。可以通过如下所示的方法使用数字签名来确保你的软件没有被篡改：

```
gpg --armor --detach-sig \
  --output advent-gnome.sig \
  example-0.0.1.tar.xz
```

同时给出你提供的文件的校验和：

```
sha256sum example-0.0.1.tar.xz > example-0.0.1.txt
```

无论你的用户会不会去用上这些安全措施，你也应该提供这些必要的信息。因为只要有那么一个人留意到签名有异样，就能为你敲响警钟。

### 总结

人类犯错在所难免。世界上数百万人输入同一个网址时，总会有人出现拼写的错误。不法分子也正是抓住了这个漏洞才得以实施误植攻击。

用抢注域名的方式去完全根治误植攻击也是不太现实的，我们更应该关注这种攻击的传播方式以减轻它对我们的影响。最好的保护就是和用户之间建立信任，并积极检测误植攻击的潜在风险。作为开源社区，我们更应该团结起来一起应对误植攻击。

---

via: <https://opensource.com/article/20/1/stop-typosquatting-attacks>

作者：[Sam Bocetta](https://opensource.com/users/sambocetta) 选题：[lujun9972](https://github.com/lujun9972) 译者：[HankChow](https://github.com/HankChow) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 tmux 创建你的梦想主控台

# 使用 tmux 创建你的梦想主控台

>
> 使用 tmux 可以做很多事情，尤其是在将 tmuxinator 添加到其中时。在我们的二十篇系列文章的第十五期中查看它们，以在 2020 年实现开源生产力的提高。
>
>
>

去年，我在 19 天里给你介绍了 19 个新（对你而言）的生产力工具。今年，我换了一种方式：使用你在使用或者还没使用的工具，构建一个使你可以在新一年更加高效的环境。

### 使用 tmux 和 tmuxinator 全部放到主控台上

到目前为止，在本系列文章中，我已经撰写了有关单个应用程序和工具的文章。从今天开始，我将把它们放在一起进行全面设置以简化操作。让我们从命令行开始。为什么使用命令行？简而言之，在命令行上工作可以使我能够从运行 SSH 的任何位置访问许多这些工具和功能。我可以 SSH 进入我的一台个人计算机，并在工作计算机上运行与我的个人计算机上所使用的相同设置。我要使用的主要工具是 [tmux](https://github.com/tmux/tmux)。

大多数人都只使用了 tmux 非常基础的功能，比如说在远程服务器上打开 tmux，然后启动进程，也许还会打开第二个会话以查看日志文件或调试信息，然后断开连接并在稍后返回。但是其实你可以使用 tmux 做很多工作。

首先，如果你有一个已有的 tmux 配置文件，请对其进行备份。tmux 的配置文件是 `~/.tmux.conf`。将其移动到另一个目录，例如 `~/tmp`。现在，用 Git 克隆 [Oh My Tmux](https://github.com/gpakosz/.tmux) 项目。从该克隆目录中将 `.tmux.conf` 符号链接到你的家目录，并复制该克隆目录中的 `.tmux.conf.local` 文件到家目录中以进行调整：

```
cd ~
mkdir ~/tmp
mv ~/.tmux.conf ~/tmp/
git clone https://github.com/gpakosz/.tmux.git
ln -s ~/.tmux/.tmux.conf ./
cp ~/.tmux/.tmux.conf.local ./
```

`.tmux.conf.local` 文件包含了本地设置和覆盖的设置。例如，我稍微更改了默认颜色，然后启用了 [Powerline](https://github.com/powerline/powerline) 分隔线。下面的代码段仅显示了我更改过的内容：

```
tmux_conf_theme_24b_colour=true
tmux_conf_theme_focused_pane_bg='default'
tmux_conf_theme_pane_border_style=fat
tmux_conf_theme_left_separator_main='\uE0B0'
tmux_conf_theme_left_separator_sub='\uE0B1'
tmux_conf_theme_right_separator_main='\uE0B2'
tmux_conf_theme_right_separator_sub='\uE0B3'
#tmux_conf_battery_bar_symbol_full='◼'
#tmux_conf_battery_bar_symbol_empty='◻'
tmux_conf_battery_bar_symbol_full='♥'
tmux_conf_battery_bar_symbol_empty='·'
tmux_conf_copy_to_os_clipboard=true
set -g mouse on
```

请注意，你不需要安装 Powerline，你只需要支持 Powerline 符号的字体即可。我在与控制台相关的所有内容中几乎都使用 [Hack Nerd Font](https://www.nerdfonts.com/)，因为它易于阅读并且具有许多有用的额外符号。你还会注意到，我打开了操作系统剪贴板支持和鼠标支持。

现在，当 tmux 启动时，底部的状态栏会以吸引人的颜色提供更多信息。`Ctrl` + `b` 仍然是输入命令的 “引导” 键，但其他一些进行了更改。现在水平拆分（顶部/底部）窗格为 `Ctrl` + `b` + `-`，垂直拆分为 `Ctrl` + `b` + `_`。启用鼠标模式后，你可以单击以在窗格之间切换，并拖动分隔线以调整其大小。打开新窗口仍然是 `Ctrl` + `b` + `n`，你现在可以单击底部栏上的窗口名称在它们之间进行切换。同样，`Ctrl` + `b` + `e` 将打开 `.tmux.conf.local` 文件以进行编辑。退出编辑器时，tmux 将重新加载配置，而不会重新加载其他任何内容。这很有用。

到目前为止，我仅对功能和视觉显示进行了一些简单的更改，并增加了鼠标支持。现在，我将它设置为以一种有意义的方式启动我想要的应用程序，而不必每次都重新定位和调整它们的大小。为此，我将使用 [tmuxinator](https://github.com/tmuxinator/tmuxinator)。tmuxinator 是 tmux 的启动器，它允许你指定和管理布局以及使用 YAML 文件自动启动应用程序。要使用它，请启动 tmux 并创建要在其中运行程序的窗格。然后，使用 `Ctrl` + `b` + `n` 打开一个新窗口，并执行 `tmux list-windows`。你将获得有关布局的详细信息。

请注意上面代码中的第一行，我在其中设置了四个窗格，每个窗格中都有一个应用程序。保存运行时的输出以供以后使用。现在，运行 `tmuxinator new 20days` 以创建名为 “20days” 的布局。这将显示一个带有默认布局文件的文本编辑器。它包含很多有用的内容，我建议你阅读所有选项。首先输入上方的布局信息以及所需的应用程序：

```
# /Users/ksonney/.config/tmuxinator/20days.yml
name: 20days
root: ~/
windows:
   - mail:
      layout: d9da,208x60,0,0[208x26,0,0{104x26,0,0,0,103x26,105,0,5},208x33,0,27{104x33,0,27,1,103x33,105,27,4}]] @0
      panes:
        - alot
        - abook
        - ikhal
        - todo.sh ls +20days
```

注意空格缩进！与 Python 代码一样，空格和缩进关系到文件的解释方式。保存该文件，然后运行 `tmuxinator 20days`。你应该会得到四个窗格，分别是 [alot](https://opensource.com/article/20/1/organize-email-notmuch) 邮件程序、[abook](https://opensource.com/article/20/1/sync-contacts-locally)、ikhal（交互式 [khal](https://opensource.com/article/20/1/open-source-calendar) 的快捷方式）以及 [todo.txt](https://opensource.com/article/20/1/open-source-to-do-list) 中带有 “+20days” 标签的任何内容。

你还会注意到，底部栏上的窗口标记为 “Mail”。你可以单击该名称（以及其他命名的窗口）以跳到该视图。漂亮吧？我在同一个文件中还设置了名为 “Social” 的第二个窗口，包括 [Tuir](https://opensource.com/article/20/1/open-source-reddit-client)、[Newsboat](https://opensource.com/article/20/1/open-source-rss-feed-reader)、连接到 [BitlBee](https://opensource.com/article/20/1/open-source-chat-tool) 的 IRC 客户端和 [Rainbow Stream](https://opensource.com/article/20/1/tweet-terminal-rainbow-stream)。

tmux 是我跟踪所有事情的生产力动力之源，有了 tmuxinator，我不必在不断调整大小、放置和启动我的应用程序上费心。

---

via: <https://opensource.com/article/20/1/tmux-console>

作者：[Kevin Sonney](https://opensource.com/users/ksonney) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用 Linux 让旧 MacBook 焕发新生

不用深度deepin吗？太孤陋寡闻啦吧。

毕竟是个国外用户发的文章，可以去他原文科普一下   哈哈

来自河南周口的 Microsoft Edge 18.18363|Windows 10 用户

不用deepin就是孤陋寡闻，太孤陋寡闻了吧。

# 用 Linux 让旧 MacBook 焕发新生

>
> Elementary OS 的最新版本 Hera 是一个令人印象深刻的平台，它可以让过时的 MacBook 得以重生。
>
>
>

当我安装苹果的 [MacOS Mojave](https://en.wikipedia.org/wiki/MacOS_Mojave) 时，它使我以前可靠的 MacBook Air 慢得像爬一样。我的计算机发售于 2015 年，具有 4 GB 内存、i5 处理器和 Broadcom 4360 无线卡，但是对于我的日常使用来说，Mojava 有点过分了，它不能和 [GnuCash](https://www.gnucash.org/) 一起工作，这激起了我重返 Linux 的欲望。我很高兴能重返，但是我深感遗憾的是，我的这台出色的 MacBook 被闲置了。

我在 MacBook Air 上尝试了几种 Linux 发行版，但总会有缺陷。有时是无线网卡；还有一次，它缺少对触摸板的支持。看了一些不错的评论后，我决定尝试 [Elementary OS](https://elementary.io/) 5.0（Juno）。我用 USB [制作了启动盘](https://opensource.com/life/14/10/test-drive-linux-nothing-flash-drive)，并将其插入 MacBook Air 。我来到了一个<ruby> 现场 <rt>  live </rt></ruby>桌面，并且操作系统识别出了我的 Broadcom 无线芯片组 —— 我认为这可能行得通！

我喜欢在 Elementary OS 中看到的内容。它的 [Pantheon](https://opensource.com/article/19/12/pantheon-linux-desktop) 桌面真的很棒，并且其外观和使用起来的感觉对 Apple 用户来说很熟悉 —— 它的显示屏底部有一个扩展坞，并带有一些指向常用应用程序的图标。我对我之前期待的预览感到满意，所以我决定安装它，然后我的无线设备消失了。真的很令人失望。我真的很喜欢 Elementary OS ，但是没有无线网络是不行的。

时间快进到 2019 年 12 月，当我在 [Linux4Everyone](https://www.linux4everyone.com/20-macbook-pro-elementary-os) 播客上听到有关 Elementary 最新版本 v.5.1（Hera） 使 MacBook 复活的评论时，我决定用 Hera 再试一次。我下载了 ISO ，创建了可启动驱动器，将其插入电脑，这次操作系统识别了我的无线网卡。我可以在上面工作了。

我非常高兴我轻巧又功能强大的 MacBook Air 通过 Linux 焕然一新。我一直在更详细地研究 Elementary OS，我可以告诉你我印象深刻的东西。

### Elementary OS 的功能

根据 [Elementary 的博客](https://blog.elementary.io/introducing-elementary-os-5-1-hera/)，“新设计的登录和锁定屏幕问候语看起来更清晰、效果更好，并且修复了以前问候语中报告的许多问题，包括输入焦点问题，HiDPI 问题和更好的本地化。Hera 的新设计是为了响应来自 Juno 的用户反馈，并启用了一些不错的新功能。”

“不错的新功能”是在轻描淡写 —— Elementary OS 拥有我见过的最佳设计的 Linux 用户界面之一。默认情况下，系统上的“系统设置”图标位于扩展坞上。更改设置很容易，很快我就按照自己的喜好配置了系统。我需要的文字大小比默认值大，辅助功能是易于使用的，允许我设置大文字和高对比度。我还可以使用较大的图标和其他选项来调整扩展坞。

按下 Mac 的 Command 键将弹出一个键盘快捷键列表，这对新用户非常有帮助。

Elementary OS 附带的 [Epiphany](https://en.wikipedia.org/wiki/GNOME_Web) Web 浏览器，我发现它非常易于使用。它与 Chrome、Chromium 或 Firefox 略有不同，但它已经绰绰有余。

对于注重安全的用户（我们应该都是），Elementary OS 的安全和隐私设置提供了多个选项，包括防火墙、历史记录、锁定，临时和垃圾文件的自动删除以及用于位置服务开/关的开关。

### 有关 Elementray OS 的更多信息

Elementary OS 最初于 2011 年发布，其最新版本 Hera 于 2019 年 12 月 3 日发布。 Elementary 的联合创始人兼 CXO 的 [Cassidy James Blaede](https://github.com/cassidyjames) 是操作系统的 UX 架构师。 Cassidy 喜欢使用开放技术来设计和构建有用、可用和令人愉悦的数字产品。

Elementary OS 具有出色的用户[文档](https://elementary.io/docs/learning-the-basics#learning-the-basics)，其代码（在 GPL 3.0 下许可）可在 [GitHub](https://github.com/elementary) 上获得。Elementary OS 鼓励参与该项目，因此请务必伸出援手并[加入社区](https://elementary.io/get-involved)。

---

via: <https://opensource.com/article/20/2/macbook-linux-elementary>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[lujun9972](https://github.com/lujun9972) 译者：[qianmingtian](https://github.com/qianmingtian) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Ubuntu 中更改默认终端

Summary: 如何在 Ubuntu 中更改默认终端。它没有遵循更改 Ubuntu 中的默认应用的标准方式，要怎么做？

# 如何在 Ubuntu 中更改默认终端

<ruby> 终端 <rt>  Terminal </rt></ruby>是 Linux 系统的关键部分。它能让你通过 shell 访问 Linux 系统。Linux 上有多个终端应用（技术上称为终端仿真器）。

大多数[桌面环境](https://itsfoss.com/best-linux-desktop-environments/)都有自己的终端实现。它们的外观可能有所不同，并且可能有不同的快捷键。例如，[Guake 终端](http://guake-project.org/)对高级用户非常有用，它提供了一些可能无法在发行版默认终端中使用的功能。

你可以在系统上安装其他终端，并将其设为默认，并能通过[快捷键 Ctrl+Alt+T](https://itsfoss.com/ubuntu-shortcuts/) 打开。

现在问题来了，如何在 Ubuntu 中更改默认终端。它没有遵循[更改 Ubuntu 中的默认应用](https://itsfoss.com/change-default-applications-ubuntu/)的标准方式，要怎么做？

### 更改 Ubuntu 中的默认终端

<img src="content_image/album_202002_18_114944tzfkzuuzuztk3ab3.png" alt="" title="">

在基于 Debian 的发行版中，有一个方便的命令行程序，称为 [update-alternatives](https://manpages.ubuntu.com/manpages/trusty/man8/update-alternatives.8.html)，可用于处理默认应用。

你可以使用它来更改默认的命令行文本编辑器、终端等。为此，请运行以下命令：

```
sudo update-alternatives --config x-terminal-emulator
```

它将显示系统上存在的所有可作为默认值的终端仿真器。当前的默认终端标有星号。

```
abhishek@nuc:~$ sudo update-alternatives --config x-terminal-emulator
There are 2 choices for the alternative x-terminal-emulator (providing /usr/bin/x-terminal-emulator).

  Selection    Path                             Priority   Status
------------------------------------------------------------
  0            /usr/bin/gnome-terminal.wrapper   40        auto mode
  1            /usr/bin/gnome-terminal.wrapper   40        manual mode
* 2            /usr/bin/st                       15        manual mode

Press <enter> to keep the current choice[*], or type selection number:
```

你要做的就是输入选择编号。对我而言，我想使用 GNOME 终端，而不是来自 [Regolith 桌面](https://itsfoss.com/regolith-linux-desktop/)的终端。

```
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/gnome-terminal.wrapper to provide /usr/bin/x-terminal-emulator (x-terminal-emulator) in manual mode
```

>
> **自动模式 vs 手动模式**
>
>
> 你可能已经在 `update-alternatives` 命令的输出中注意到了自动模式和手动模式。
>
>
> 如果选择自动模式，那么在安装或删除软件包时，系统可能会自动决定默认应用。该决定受优先级数字的影响（如上一节中的命令输出所示）。
>
>
> 假设你的系统上安装了 5 个终端仿真器，并删除了默认的仿真器。现在，你的系统将检查哪些仿真器处于自动模式。如果有多个，它将选择优先级最高的一个作为默认仿真器。
>
>
>

我希望你觉得这个小技巧有用。随时欢迎提出问题和建议。

---

via: <https://itsfoss.com/change-default-terminal-ubuntu/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


3 种使用 PostgreSQL 命令的方式

PostgreSQL 文档资料汇总     https://www.rockdata.net/zh-cn/docs/

PostgreSQL 技术博客     https://www.rockdata.net/zh-cn/blog/

# 3 种使用 PostgreSQL 命令的方式

>
> 无论你需要的东西简单（如一个购物清单）亦或复杂（如色卡生成器） ，PostgreSQL 命令都能使它变得容易起来。
>
>
>

<img src="content_image/album_202002_18_124003twk7fryz2krw2r39.jpg" alt="" title="">

在 [PostgreSQL 入门](/article-11593-1.html)一文中, 我解释了如何安装、设置和开始使用这个开源数据库软件。不过，使用 [PostgreSQL](https://www.postgresql.org/) 中的命令可以做更多事情。

例如，我使用 Postgres 来跟踪我的杂货店购物清单。我的大多数杂货店购物是在家里进行的，而且每周进行一次大批量的采购。我去几个不同的地方购买清单上的东西，因为每家商店都提供特定的选品或质量，亦或更好的价格。最初，我制作了一个 HTML 表单页面来管理我的购物清单，但这样无法保存我的输入内容。因此，在想到要购买的物品时我必须马上列出全部清单，然后到采购时我常常会忘记一些我需要或想要的东西。

相反，使用 PostgreSQL，当我想到需要的物品时，我可以随时输入，并在购物前打印出来。你也可以这样做。

### 创建一个简单的购物清单

首先，输入 `psql` 命令进入数据库，然后用下面的命令创建一个表：

```
Create table groc (item varchar(20), comment varchar(10));
```

输入如下命令在清单中加入商品：

```
insert into groc values ('milk', 'K');
insert into groc values ('bananas', 'KW');
```

括号中有两个信息（逗号隔开）：前面是你需要买的东西，后面字母代表你要购买的地点以及哪些东西是你每周通常都要买的（`W`）。

因为 `psql` 有历史记录，你可以按向上键在括号内编辑信息，而无需输入商品的整行信息。

在输入一小部分商品后，输入下面命令来检查前面的输入内容。

```
Select * from groc order by comment;

      item      | comment
----------------+---------
 ground coffee  | H
 butter         | K
 chips          | K
 steak          | K
 milk           | K
 bananas        | KW
 raisin bran    | KW
 raclette       | L
 goat cheese    | L
 onion          | P
 oranges        | P
 potatoes       | P
 spinach        | PW
 broccoli       | PW
 asparagus      | PW
 cucumber       | PW
 sugarsnap peas | PW
 salmon         | S
(18 rows)
```

此命令按 `comment` 列对结果进行排序，以便按购买地点对商品进行分组，从而使你的购物更加方便。

使用 `W` 来指明你每周要买的东西，当你要清除表单为下周的列表做准备时，你可以将每周的商品保留在购物清单上。输入：

```
delete from groc where comment not like '%W';
```

注意，在 PostgreSQL 中 `%` 表示通配符（而非星号）。所以，要保存输入内容，需要输入：

```
delete from groc where item like 'goat%';
```

不能使用 `item = 'goat%'`，这样没用。

在购物时，用以下命令输出清单并打印或发送到你的手机：

```
\o groclist.txt
select * from groc order by comment;
\o
```

最后一个命令 `\o` 后面没有任何内容，将重置输出到命令行。否则，所有的输出会继续输出到你创建的杂货店购物文件 `groclist.txt` 中。

### 分析复杂的表

这个逐项列表对于数据量小的表来说没有问题，但是对于数据量大的表呢？几年前，我帮 [FreieFarbe.de](http://freiefarbe.de) 的团队从 HLC 调色板中创建一个自由色的色样册。事实上，任何能想象到的打印色都可按色调、亮度、浓度（饱和度）来规定。最终结果是 [HLC Color Atlas](https://www.freiefarbe.de/en/thema-farbe/hlc-colour-atlas/)，下面是我们如何实现的。

该团队向我发送了具有颜色规范的文件，因此我可以编写可与 Scribus 配合使用的 Python 脚本，以轻松生成色样册。一个例子像这样开始：

```
HLC, C, M, Y, K
H010_L15_C010, 0.5, 49.1, 0.1, 84.5
H010_L15_C020, 0.0, 79.7, 15.1, 78.9
H010_L25_C010, 6.1, 38.3, 0.0, 72.5
H010_L25_C020, 0.0, 61.8, 10.6, 67.9
H010_L25_C030, 0.0, 79.5, 18.5, 62.7
H010_L25_C040, 0.4, 94.2, 17.3, 56.5
H010_L25_C050, 0.0, 100.0, 15.1, 50.6
H010_L35_C010, 6.1, 32.1, 0.0, 61.8
H010_L35_C020, 0.0, 51.7, 8.4, 57.5
H010_L35_C030, 0.0, 68.5, 17.1, 52.5
H010_L35_C040, 0.0, 81.2, 22.0, 46.2
H010_L35_C050, 0.0, 91.9, 20.4, 39.3
H010_L35_C060, 0.1, 100.0, 17.3, 31.5
H010_L45_C010, 4.3, 27.4, 0.1, 51.3
```

这与原始数据相比，稍有修改，原始数据用制表符分隔。我将其转换成 CSV 格式（用逗号分割值），我更喜欢其与 Python 一起使用（CSV 文也很有用，因为它可轻松导入到电子表格程序中）。

在每一行中，第一项是颜色名称，其后是其 C、M、Y 和 K 颜色值。 该文件包含 1,793 种颜色，我想要一种分析信息的方法，以了解这些值的范围。这就是 PostgreSQL 发挥作用的地方。我不想手动输入所有数据 —— 我认为输入过程中我不可能不出错，而且令人头痛。幸运的是，PostgreSQL 为此提供了一个命令。

首先用以下命令创建数据库：

```
Create table hlc_cmyk (color varchar(40), c decimal, m decimal, y decimal, k decimal);
```

然后通过以下命令引入数据：

```
\copy  hlc_cmyk from '/home/gregp/HLC_Atlas_CMYK_SampleData.csv' with (header, format CSV);
```

开头有反斜杠，是因为使用纯 `copy` 命令的权限仅限于 root 用户和 Postgres 的超级用户。在括号中，`header` 表示第一行包含标题，应忽略，`CSV` 表示文件格式为 CSV。请注意，在此方法中，颜色名称不需要用括号括起来。

如果操作成功，会看到 `COPY NNNN`，其中 N 表示插入到表中的行数。

最后，可以用下列命令查询：

```
select * from hlc_cmyk;

     color     |   c   |   m   |   y   |  k
---------------+-------+-------+-------+------
 H010_L15_C010 |   0.5 |  49.1 |   0.1 | 84.5
 H010_L15_C020 |   0.0 |  79.7 |  15.1 | 78.9
 H010_L25_C010 |   6.1 |  38.3 |   0.0 | 72.5
 H010_L25_C020 |   0.0 |  61.8 |  10.6 | 67.9
 H010_L25_C030 |   0.0 |  79.5 |  18.5 | 62.7
 H010_L25_C040 |   0.4 |  94.2 |  17.3 | 56.5
 H010_L25_C050 |   0.0 | 100.0 |  15.1 | 50.6
 H010_L35_C010 |   6.1 |  32.1 |   0.0 | 61.8
 H010_L35_C020 |   0.0 |  51.7 |   8.4 | 57.5
 H010_L35_C030 |   0.0 |  68.5 |  17.1 | 52.5
```

所有的 1,793 行数据都是这样的。回想起来，我不能说此查询对于 HLC 和 Scribus 任务是绝对必要的，但是它减轻了我对该项目的一些担忧。

为了生成 HLC 色谱，我使用 Scribus 为色板页面中的 13,000 多种颜色自动创建了颜色图表。

我可以使用 `copy` 命令输出数据：

```
\copy hlc_cmyk to '/home/gregp/hlc_cmyk_backup.csv' with (header, format CSV);
```

我还可以使用 `where` 子句根据某些值来限制输出。

例如，以下命令将仅发送以 `H10` 开头的色调值。

```
\copy hlc_cmyk to '/home/gregp/hlc_cmyk_backup.csv' with (header, format CSV) where color like 'H10%';
```

### 备份或传输数据库或表

我在此要提到的最后一个命令是 `pg_dump`，它用于备份 PostgreSQL 数据库，并在 `psql` 控制台之外运行。 例如：

```
pg_dump gregp -t hlc_cmyk > hlc.out
pg_dump gregp > dball.out
```

第一行是导出 `hlc_cmyk` 表及其结构。第二行将转储 `gregp` 数据库中的所有表。这对于备份或传输数据库或表非常有用。

要将数据库或表传输到另一台电脑（查看 [PostgreSQL 入门](/article-11593-1.html)那篇文章获取详细信息），首先在要转入的电脑上创建一个数据库，然后执行相反的操作。

```
psql -d gregp -f dball.out
```

一步创建所有表并输入数据。

### 总结

在本文中，我们了解了如何使用 `WHERE` 参数限制操作，以及如何使用 PostgreSQL 通配符 `％`。我们还了解了如何将大批量数据加载到表中，然后将部分或全部表数据输出到文件，甚至是将整个数据库及其所有单个表输出。

---

via: <https://opensource.com/article/20/2/postgresql-commands>

作者：[Greg Pittman](https://opensource.com/users/greg-p) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Morisun029](https://github.com/Morisun029) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用开源搜索引擎定制你的互联网

Summary: 上手开源的对等 Web 索引器 YaCy。

上手开源的对等 Web 索引器 YaCy。

# 用开源搜索引擎定制你的互联网

>
> 上手开源的对等 Web 索引器 YaCy。
>
>
>

很久以前，互联网很小，小到几个人就可以索引它们，这些人收集了所有网站的名称和链接，并按主题将它们分别列在页面或印刷书籍中。随着万维网网络的发展，形成了“网站环”形式，具有类似的内容、主题或敏感性的站点捆绑在一起，形成了通往每个成员的循环路径。环中任何站点的访问者都可以单击按钮以转到环中的下一个或上一个站点，以发现与其兴趣相关的新站点。

又过了一段时间，互联网似乎变得臃肿不堪了。每个人都在网络上，有很多冗余信息和垃圾邮件，多到让你无法找到任何东西。Yahoo 和 AOL、CompuServe 以及类似的服务各自采用了不同的方法来解决这个问题，但是直到谷歌出现后，现代的搜索模型才得以普及。按谷歌的做法，互联网应该通过搜索引擎进行索引、排序和排名。

### 为什么选择开源替代品？

像谷歌和 DuckDuckGo 这样的搜索引擎显然是卓有成效的。你可能是通过搜索引擎访问的本站。尽管对于因主机没有选择遵循优化搜索引擎的最佳实践从而导致会内容陷入困境这件事仍存在争论，但用于管理丰富的文化、知识和轻率的信息（即互联网）的现代解决方案是冷冰冰的索引。

但是也许出于隐私方面的考虑，或者你希望为使互联网更加独立而做出贡献，你或许不愿意使用谷歌或 DuckDuckGo。如果你对此感兴趣，那么可以考虑参加 [YaCy](https://yacy.net/)，这是一个对等互联网索引器和搜索引擎。

### 安装 YaCy

要安装并尝试 YaCy，请首先确保已安装 Java。如果你使用的是 Linux，则可以按照我的《[如何在 Linux 上安装 Java](/article-11614-1.html)》中的说明进行操作。如果你使用 Windows 或 MacOS，请从 [AdoptOpenJDK.net](https://adoptopenjdk.net/releases.html) 获取安装程序。

安装 Java 后，请根据你的平台[下载安装程序](https://yacy.net/download_installation/)。

如果你使用的是 Linux，请解压缩 tarball 并将其移至 `/opt` 目录：

```
$ sudo tar --extract --file  yacy_*z --directory /opt
```

根据下载的安装程序的说明启动 YaCy。

在 Linux 上，启动在后台运行的 YaCy：

```
$ /opt/startYACY.sh &
```

在 Web 浏览器中，导航到 `localhost:8090` 并进行搜索。

### 将 YaCy 添加到你的地址栏

如果你使用的是 Firefox Web 浏览器，则只需单击几下，即可在 Awesome Bar（Mozilla 给 URL 栏起的名称）中将 YaCy 设置为默认搜索引擎。

首先，如果尚未显示，在 Firefox 工具栏中使专用搜索栏显示出来（你不必使搜索栏保持一直可见；只需要激活它足够长的时间即可添加自定义搜索引擎）。Firefox 右上角的“汉堡”菜单中的“自定义”菜单中提供了搜索栏。在 Firefox 工具栏上的搜索栏可见后，导航至 `localhost:8090`，然后单击刚添加的 Firefox 搜索栏中的放大镜图标。单击选项将 YaCy 添加到你的 Firefox 的搜索引擎中。

完成此操作后，你可以在 Firefox 首选项中将其标记为默认值，或者仅在 Firefox 搜索栏中执行的搜索中选择性地使用它。如果将其设置为默认搜索引擎，则可能不需要专用搜索栏，因为 Awesome Bar 也使用默认引擎，因此可以将其从工具栏中删除。

### 对等搜索引擎如何工作

YaCy 是一个开源的分布式搜索引擎。它是用 [Java](https://opensource.com/resources/java) 编写的，因此可以在任何平台上运行，并且可以执行 Web 爬网、索引和搜索。这是一个对等（P2P）网络，因此每个运行 YaCy 的用户都将努力地不断跟踪互联网的变化情况。当然，没有单个用户能拥有整个互联网的完整索引，因为这将需要一个数据中心来容纳，但是该索引分布在所有 YaCy 用户中且是冗余的。它与 BitTorrent 非常相似（因为它使用分布式哈希表 DHT 来引用索引条目），只不过你所共享的数据是单词和 URL 关联的矩阵。通过混合哈希表返回的结果，没人能说出谁搜索了哪些单词，因此所有搜索在功能上都是匿名的。这是用于无偏见、无广告、未跟踪和匿名搜索的有效系统，你只需要使用它就加入了它。

### 搜索引擎和算法

索引互联网的行为是指将网页分成单个单词，然后将页面的 URL 与每个单词相关联。在搜索引擎中搜索一个或多个单词将获取与该查询关联的所有 URL。YaCy 客户端在运行时也是如此。

客户端要做的另一件事是为你的浏览器提供搜索界面。你可以将 Web 浏览器指向 `localhost:8090` 来搜索 YaCy，而不是在要搜索时导航到谷歌。你甚至可以将其添加到浏览器的搜索栏中（取决于浏览器的可扩展性），因此可以从 URL 栏中进行搜索。

### YaCy 的防火墙设置

首次开始使用 YaCy 时，它可能运行在“初级”模式下。这意味着你的客户端爬网的站点仅对你可用，因为其他 YaCy 客户端无法访问你的索引条目。要加入对等环境，必须在路由器的防火墙（或者你正在运行的软件防火墙）中打开端口 8090，这称为“高级”模式。

如果你使用的是 Linux，则可以在《[使用防火墙让你的 Linux 更加强大](https://opensource.com/article/19/7/make-linux-stronger-firewalls)》中找到有关计算机防火墙的更多信息。在其他平台上，请参考操作系统的文档。

互联网服务提供商（ISP）提供的路由器上几乎总是启用了防火墙，并且有太多种类的防火墙无法准确说明。大多数路由器都提供了在防火墙上“打洞”的选项，因为许多流行的联网游戏都需要双向流量。

如果你知道如何登录路由器（通常为 192.168.0.1 或 10.1.0.1，但可能因制造商的设置而异），则登录并查找配置面板来控制“防火墙”或“端口转发”或“应用”。

找到路由器防火墙的首选项后，将端口 8090 添加到白名单。例如：

如果路由器正在进行端口转发，则必须使用相同的端口将传入的流量转发到计算机的 IP 地址。例如：

如果由于某种原因无法调整防火墙设置，那也没事。YaCy 将继续以初级模式运行并作为对等搜索网络的客户端运行。

### 你的互联网

使用 YaCy 搜索引擎可以做的不仅仅是被动搜索。你可以强制抓取不太显眼的网站，可以请求对网站进行网络抓取，可以选择使用 YaCy 进行本地搜索等等。你可以更好地控制*你的*互联网的所呈现的一切。高级用户越多，索引的网站就越多。索引的网站越多，所有用户的体验就越好。加入吧！

---

via: <https://opensource.com/article/20/2/open-source-search-engine>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


一条命令在 Ubuntu 中安装所有基本的媒体编解码器

Summary: VLC 是 Linux 上的最佳视频播放器之一，它几乎可以播放任何视频文件格式。但你仍然会遇到无法播放音频和 flash 的麻烦。

# 一条命令在 Ubuntu 中安装所有基本的媒体编解码器

如果你刚刚安装了 Ubuntu 或其他 [Ubuntu 特色版本](https://itsfoss.com/which-ubuntu-install/) 如 Kubuntu、Lubuntu 等，你会注意到系统无法播放某些音频或视频文件。

对于视频文件，你可以[在 Ubuntu 上安装 VLC](https://itsfoss.com/install-latest-vlc/)。[VLC](https://www.videolan.org/index.html) 是 [Linux 上的最佳视频播放器](https://itsfoss.com/video-players-linux/)之一，它几乎可以播放任何视频文件格式。但你仍然会遇到无法播放音频和 flash 的麻烦。

好消息是 [Ubuntu](https://ubuntu.com/) 提供了一个软件包来安装所有基本的媒体编解码器：ubuntu-restricted-extras。

### 什么是 Ubuntu Restricted Extras？

ubuntu-restricted-extras 是一个包含各种基本软件，如 Flash 插件、[unrar](https://itsfoss.com/use-rar-ubuntu-linux/)、[gstreamer](https://gstreamer.freedesktop.org/)、mp4、[Ubuntu 中的 Chromium 浏览器](https://itsfoss.com/install-chromium-ubuntu/)的编解码器等的软件包。

由于这些软件不是开源软件，并且其中一些涉及软件专利，因此 Ubuntu 默认情况下不会安装它们。你必须使用 multiverse 仓库，它是 Ubuntu 专门为用户提供非开源软件而创建的仓库。

请阅读本文以[了解有关各种 Ubuntu 仓库的更多信息](https://itsfoss.com/ubuntu-repositories/)。

### 如何安装 Ubuntu Restricted Extras？

令我惊讶的是，我发现软件中心未列出 Ubuntu Restricted Extras。不管怎样，你都可以使用命令行安装该软件包，这非常简单。

在菜单中搜索或使用[终端键盘快捷键 Ctrl+Alt+T](https://itsfoss.com/ubuntu-shortcuts/) 打开终端。

由于 ubuntu-restrcited-extras 软件包在 multiverse 仓库中，因此你应验证系统上已启用 multiverse 仓库：

```
sudo add-apt-repository multiverse
```

然后你可以使用以下命令安装：

```
sudo apt install ubuntu-restricted-extras
```

输入回车后，你会被要求输入密码，**当你输入密码时，屏幕不会有显示**。这是正常的。输入你的密码并回车。

它将显示大量要安装的包。按回车确认选择。

你会看到 [EULA](https://en.wikipedia.org/wiki/End-user_license_agreement)（最终用户许可协议），如下所示：

浏览此页面可能会很麻烦，但是请放心。只需按 Tab 键，它将高亮选项。当高亮在正确的选项上，按下回车确认你的选择。

安装完成后，由于新安装的媒体编解码器，你应该可以播放 MP3 和其他媒体格式了。

#### 在 Kubuntu、Lubuntu、Xubuntu 上安装受限制的额外软件包

请记住，Kubuntu、Lubuntu 和 Xubuntu 都有此软件包，并有各自不同的名称。它们本应使用相同的名字，但不幸的是并不是。

在 Kubuntu 上，使用以下命令：

```
sudo apt install kubuntu-restricted-extras
```

在 Lubuntu 上，使用：

```
sudo apt install lubuntu-restricted-extras
```

在 Xubuntu 上，你应该使用：

```
sudo apt install xubuntu-restricted-extras
```

我一直建议将 ubuntu-restricted-extras 作为[安装 Ubuntu 后要做的基本事情](https://itsfoss.com/things-to-do-after-installing-ubuntu-18-04/)之一。只需一个命令即可在 Ubuntu 中安装多个编解码器。

希望你喜欢 Ubuntu 初学者系列中这一技巧。以后，我将分享更多此类技巧。

---

via: <https://itsfoss.com/install-media-codecs-ubuntu/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 Vim 发送邮件和检查日历

我不用日历这种应用，但是个人觉得大部分用日历这种应用的，倾向于带有云同步的，比如google家的

# 使用 Vim 发送邮件和检查日历

>
> 在 2020 年用开源实现更高生产力的二十种方式的第十六篇文章中，直接通过文本编辑器管理你的电子邮件和日历。
>
>
>

去年，我在 19 天里给你介绍了 19 个新（对你而言）的生产力工具。今年，我换了一种方式：使用你在使用或者还没使用的工具，构建一个使你可以在新一年更加高效的环境。

### 用 Vim 做（几乎）所有事情，第一部分

我经常使用两个文本编辑器 —— [Vim](https://www.vim.org/) 和 [Emacs](https://www.gnu.org/software/emacs/)。为什么两者都用呢？它们有不同的使用场景，在本系列的后续几篇文章中，我将讨论其中的一些用例。

好吧，为什么要在 Vim 中执行所有操作？因为如果有一个应用程序是我可以访问的每台计算机上都有的，那就是 Vim。如果你像我一样，可能已经在 Vim 中打发了很多时光。那么，为什么不将其用于**所有事情**呢？

但是，在此之前，你需要做一些事情。首先是确保你的 Vim 具有 Ruby 支持。你可以使用 `vim --version | grep ruby`。如果结果不是 `+ruby`，则需要解决这个问题。这可能有点麻烦，你应该查看发行版的文档以获取正确的软件包。在 MacOS 上，用的是官方的 MacVim（不是 Brew 发行的），在大多数 Linux 发行版中，用的是 vim-nox 或 vim-gtk，而不是 vim-gtk3。

我使用 [Pathogen](https://github.com/tpope/vim-pathogen) 自动加载插件和捆绑软件。如果你使用 [Vundle](https://github.com/VundleVim/Vundle.vim) 或其他 Vim 软件包管理器，则需要调整以下命令才能使用它。

#### 在 Vim 中管理你的邮件

使 Vim 在你的生产力计划中发挥更大作用的一个很好的起点是使用它通过 [Notmuch](https://opensource.com/article/20/1/organize-email-notmuch) 发送和接收电子邮件，和使用 [abook](https://opensource.com/article/20/1/sync-contacts-locally) 访问你的联系人列表。你需要为此安装一些东西。下面的所有示例代码都运行在 Ubuntu 上，因此如果你使用其他发行版，则需要对此进行调整。通过以下步骤进行设置：

```
sudo apt install notmuch-vim ruby-mail
curl -o ~/.vim/plugin/abook --create-dirs https://raw.githubusercontent.com/dcbaker/vim-abook/master/plugin/abook.vim
```

到目前为止，一切都很顺利。现在启动 Vim 并执行 `:NotMuch`。由于是用较旧版本的邮件库 `notmuch-vim` 编写的，可能会出现一些警告，但总的来说，Vim 现在将成为功能齐全的 Notmuch 邮件客户端。

如果要搜索特定标签，请输入 `\t`，输入标签名称，然后按回车。这将拉出一个带有该标签的所有消息的列表。`\s` 组合键会弹出 `Search:` 提示符，可以对 Notmuch 数据库进行全面搜索。使用箭头键浏览消息列表，按回车键显示所选项目，然后输入 `\q` 退出当前视图。

要撰写邮件，请使用 `\c` 按键。你将看到一条空白消息。这是 `abook.vim` 插件发挥作用的位置。按下 `Esc` 并输入 `:AbookQuery <SomeName>`，其中 `<SomeName>` 是你要查找的名称或电子邮件地址的一部分。你将在 abook 数据库中找到与你的搜索匹配的条目列表。通过键入你想要的地址的编号，将其添加到电子邮件的地址行中。完成电子邮件的键入和编辑，按 `Esc` 退出编辑模式，然后输入 `,s` 发送。

如果要在 `:NotMuch` 启动时更改默认文件夹视图，则可以将变量 `g:notmuch_folders` 添加到你的 `.vimrc` 文件中：

```
let g:notmuch_folders = [
      \ [ 'new', 'tag:inbox and tag:unread' ],
      \ [ 'inbox', 'tag:inbox' ],
      \ [ 'unread', 'tag:unread' ],
      \ [ 'News', 'tag:@sanenews' ],
      \ [ 'Later', 'tag:@sanelater' ],
      \ [ 'Patreon', 'tag:@patreon' ],
      \ [ 'LivestockConservancy', 'tag:livestock-conservancy' ],
    \ ]
```

Notmuch 插件的文档中涵盖了更多设置，包括设置标签键和使用其它的邮件程序。

#### 在 Vim 中查询日历

遗憾的是，似乎没有使用 vCalendar 或 iCalendar 格式的 Vim 日历程序。有个 [Calendar.vim](https://github.com/itchyny/calendar.vim)，做得很好。设置 Vim 通过以下方式访问你的日历：

```
cd ~/.vim/bundle
git clone git@github.com:itchyny/calendar.vim.git
```

现在，你可以通过输入 `:Calendar` 在 Vim 中查看日历。你可以使用 `<` 和 `>` 键在年、月、周、日和时钟视图之间切换。如果要从一个特定的视图开始，请使用 `-view=` 标志告诉它你希望看到哪个视图。你也可以在任何视图中定位日期。例如，如果我想查看 2020 年 7 月 4 日这一周的情况，请输入 `:Calendar -view week 7 4 2020`。它的帮助信息非常好，可以使用 `?` 键参看。

Calendar.vim 还支持 Google Calendar（我需要），但是在 2019 年 12 月，Google 禁用了它的访问权限。作者已在 [GitHub 上的这个提案](https://github.com/itchyny/calendar.vim/issues/156)中发布了一种变通方法。

这样你就在 Vim 中有了这些：你的邮件、地址簿和日历。但是这些还没有完成； 下一篇你将在 Vim 上做更多的事情！

Vim 为作家提供了很多好处，无论他们是否具有技术意识。

需要保持时间表正确吗？了解如何使用这些免费的开源软件来做到这一点。

---

via: <https://opensource.com/article/20/1/vim-email-calendar>

作者：[Kevin Sonney](https://opensource.com/users/ksonney) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在你的 Fedora 终端上播放音乐

Summary: 做一个极客，在你的终端上播放音乐！

做一个极客，在你的终端上播放音乐！

# 在你的 Fedora 终端上播放音乐

<img src="content_image/album_202002_20_102016cacz6aabazpsqblf.png" alt="" title="">

MPD（Music Playing Daemon），顾名思义，是一个音乐（Music）播放（Playing）守护进程（Daemon）。它可以播放音乐，并且作为一个守护进程，任何软件都可以与之交互并播放声音，包括一些 CLI 客户端。

其中一个被称为 `ncmpcpp`，它是对之前 `ncmpc` 工具的改进。名字的变化与编写它们的语言没有太大关系：都是 C++，而之所以被称为 `ncmpcpp`，因为它是 “NCurses Music Playing Client Plus Plus”。 缘故

### 安装 MPD 和 ncmpcpp

`ncmpmpcc` 的客户端可以从官方 Fedora 库中通过 `dnf` 命令直接安装。

```
$ sudo dnf install ncmpcpp
```

另一方面，MPD 必须从 RPMFusion free 库安装，你可以通过运行：

```
$ sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
```

然后你可以运行下面的命令安装它：

```
$ sudo dnf install mpd
```

### 配置并启用 MPD

设置 MPD 最简单的方法是以普通用户的身份运行它。默认情况是以专用 `mpd` 用户的身份运行它，但这会导致各种权限问题。

在运行它之前，我们需要创建一个本地配置文件，允许我们作为普通用户运行。

首先在 `~/.config` 里创建一个名叫 `mpd` 的目录:

```
$ mkdir ~/.config/mpd
```

将配置文件拷贝到此目录下:

```
$ cp /etc/mpd.conf ~/.config/mpd
```

然后用 `vim`、`nano` 或 `gedit` 之类的软件编辑它:

```
$ nano ~/.config/mpd/mpd.conf
```

我建议你通读所有内容，检查是否有任何需要做的事情，但对于大多数设置你都可以删除，只需保留以下内容：

```
db_file "~/.config/mpd/mpd.db"
log_file "syslog"
```

现在你可以运行它了：

```
$ mpd
```

没有报错，这将在后台启动 MPD 守护进程。

### 使用 ncmpcpp

只需运行：

```
$ ncmpcpp
```

你将在终端中看到一个由 ncurses 所支持的图形用户界面。

按下 `4` 键，然后就可以看到本地的音乐目录，用方向键进行选择并按下回车进行播放。

多播放几个歌曲就会创建一个*播放列表*，让你可以使用 `>` 键（不是右箭头, 是右尖括号）移动到下一首，并使用 `<` 返回上一首。`+` 和 `–` 键可以调节音量。`Q` 键可以让你退出 `ncmpcpp` 但不停止播放音乐。你可以按下 `P` 来控制暂停和播放。

你可以按下 `1` 键来查看当前播放列表（这是默认的视图）。从这个视图中，你可以按 `i` 查看有关当前歌曲的信息（标签）。按 `6` 可更改当前歌曲的标签。

按 `\` 按钮将在视图顶部添加（或删除）信息面板。在左上角，你可以看到如下的内容：

```
[------]
```

按下 `r`、`z`、`y`、`R`、`x` 将会分别切换到 `repeat`、`random`、`single`、`consume` 和 `crossfade` 等播放模式，并将这个小指示器中的 `–` 字符替换为选定模式。

按下 `F1` 键将会显示一些帮助文档，包含一系列的键绑定列表，因此无需在此处列出完整列表。所以继续吧！做一个极客，在你的终端上播放音乐！

---

via: <https://fedoramagazine.org/playing-music-on-your-fedora-terminal-with-mpd-and-ncmpcpp/>

作者：[Carmine Zaccagnino](https://fedoramagazine.org/author/carzacc/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[chai-yuan](https://github.com/chai-yuan) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出