如何在 Linux 中列出可用的软件包组

![](/data/attachment/album/201810/14/222157feyljytzazss7es9.jpg)

我们知道，如果想要在 Linux 中安装软件包，可以使用软件包管理器来进行安装。由于系统管理员需要频繁用到软件包管理器，所以它是 Linux 当中的一个重要工具。

但是如果想一次性安装一个软件包组，在 Linux 中有可能吗？又如何通过命令去实现呢？

在 Linux 中确实可以用软件包管理器来达到这样的目的。很多软件包管理器都有这样的选项来实现这个功能，但就我所知，`apt` 或 `apt-get` 软件包管理器却并没有这个选项。因此对基于 Debian 的系统，需要使用的命令是 `tasksel`，而不是 `apt` 或 `apt-get` 这样的官方软件包管理器。

在 Linux 中安装软件包组有很多好处。对于 LAMP 来说，安装过程会包含多个软件包，但如果安装软件包组命令来安装，只安装一个包就可以了。

当你的团队需要安装 LAMP，但不知道其中具体包含哪些软件包，这个时候软件包组就派上用场了。软件包组是 Linux 系统上一个很方便的工具，它能让你轻松地完成一组软件包的安装。

软件包组是一组用于公共功能的软件包，包括系统工具、声音和视频。 安装软件包组的过程中，会获取到一系列的依赖包，从而大大节省了时间。

**推荐阅读：**

* [如何在 Linux 上按照大小列出已安装的软件包](https://www.2daygeek.com/how-to-list-installed-packages-by-size-largest-on-linux/)
* [如何在 Linux 上查看/列出可用的软件包更新](https://www.2daygeek.com/how-to-view-list-the-available-packages-updates-in-linux/)
* [如何在 Linux 上查看软件包的安装/更新/升级/移除/卸载时间](https://www.2daygeek.com/how-to-view-a-particular-package-installed-updated-upgraded-removed-erased-date-on-linux/)
* [如何在 Linux 上查看一个软件包的详细信息](https://www.2daygeek.com/how-to-view-detailed-information-about-a-package-in-linux/)
* [如何查看一个软件包是否在你的 Linux 发行版上可用](https://www.2daygeek.com/how-to-search-if-a-package-is-available-on-your-linux-distribution-or-not/)
* [萌新指导：一个可视化的 Linux 包管理工具](https://www.2daygeek.com/list-of-graphical-frontend-tool-for-linux-package-manager/)
* [老手必会：命令行软件包管理器的用法](https://www.2daygeek.com/list-of-command-line-package-manager-for-linux/)

### 如何在 CentOS/RHEL 系统上列出可用的软件包组

RHEL 和 CentOS 系统使用的是 RPM 软件包，因此可以使用 `yum` 软件包管理器来获取相关的软件包信息。

`yum` 是 “Yellowdog Updater, Modified” 的缩写，它是一个用于基于 RPM 系统（例如 RHEL 和 CentOS）的，开源的命令行软件包管理工具。它是从发行版仓库或其它第三方库中获取、安装、删除、查询和管理 RPM 包的主要工具。

**推荐阅读：** [使用 yum 命令在 RHEL/CentOS 系统上管理软件包](https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/)

```
# yum grouplist
Loaded plugins: fastestmirror, security
Setting up Group Process
Loading mirror speeds from cached hostfile
 * epel: epel.mirror.constant.com
Installed Groups:
 Base
 E-mail server
 Graphical Administration Tools
 Hardware monitoring utilities
 Legacy UNIX compatibility
 Milkymist
 Networking Tools
 Performance Tools
 Perl Support
 Security Tools
Available Groups:
 Additional Development
 Backup Client
 Backup Server
 CIFS file server
 Client management tools
 Compatibility libraries
 Console internet tools
 Debugging Tools
 Desktop
.
.
Available Language Groups:
 Afrikaans Support [af]
 Albanian Support [sq]
 Amazigh Support [ber]
 Arabic Support [ar]
 Armenian Support [hy]
 Assamese Support [as]
 Azerbaijani Support [az]
.
.
Done
```

如果需要列出相关联的软件包，可以执行以下这个命令。下面的例子是列出和 “Performance Tools” 组相关联的软件包。

```
# yum groupinfo "Performance Tools"
Loaded plugins: fastestmirror, security
Setting up Group Process
Loading mirror speeds from cached hostfile
 * epel: ewr.edge.kernel.org

Group: Performance Tools
 Description: Tools for diagnosing system and application-level performance problems.
 Mandatory Packages:
 blktrace
 sysstat
 Default Packages:
 dstat
 iotop
 latencytop
 latencytop-tui
 oprofile
 perf
 powertop
 seekwatcher
 Optional Packages:
 oprofile-jit
 papi
 sdparm
 sg3_utils
 tiobench
 tuned
 tuned-utils
```

### 如何在 Fedora 系统上列出可用的软件包组

Fedora 系统使用的是 DNF 软件包管理器，因此可以通过 DNF 软件包管理器来获取相关的信息。

DNF 的含义是 “Dandified yum”。DNF 软件包管理器是 YUM 软件包管理器的一个分支，它使用 hawkey/libsolv 库作为后端。从 Fedora 18 开始，Aleš Kozumplík 开始着手 DNF 的开发，直到在 Fedora 22 开始加入到系统中。

`dnf` 命令可以在 Fedora 22 及更高版本上安装、更新、搜索和删除软件包， 它可以自动解决软件包的依赖关系并其顺利安装，不会产生问题。

YUM 被 DNF 取代是由于 YUM 中存在一些长期未被解决的问题。为什么 Aleš Kozumplík 没有对 yum 的这些问题作出修补呢，他认为补丁解决存在技术上的难题，而 YUM 团队也不会马上接受这些更改，还有一些重要的问题。而且 YUM 的代码量有 5.6 万行，而 DNF 只有 2.9 万行。因此已经不需要沿着 YUM 的方向继续开发了，重新开一个分支才是更好的选择。

**推荐阅读：** [在 Fedora 系统上使用 DNF 命令管理软件包](https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/)

```
# dnf grouplist
Last metadata expiration check: 0:00:00 ago on Sun 09 Sep 2018 07:10:36 PM IST.
Available Environment Groups:
 Fedora Custom Operating System
 Minimal Install
 Fedora Server Edition
 Fedora Workstation
 Fedora Cloud Server
 KDE Plasma Workspaces
 Xfce Desktop
 LXDE Desktop
 Hawaii Desktop
 LXQt Desktop
 Cinnamon Desktop
 MATE Desktop
 Sugar Desktop Environment
 Development and Creative Workstation
 Web Server
 Infrastructure Server
 Basic Desktop
Installed Groups:
 C Development Tools and Libraries
 Development Tools
Available Groups:
 3D Printing
 Administration Tools
 Ansible node
 Audio Production
 Authoring and Publishing
 Books and Guides
 Cloud Infrastructure
 Cloud Management Tools
 Container Management
 D Development Tools and Libraries
.
.
 RPM Development Tools
 Security Lab
 Text-based Internet
 Window Managers
 GNOME Desktop Environment
 Graphical Internet
 KDE (K Desktop Environment)
 Fonts
 Games and Entertainment
 Hardware Support
 Sound and Video
 System Tools
```

如果需要列出相关联的软件包，可以执行以下这个命令。下面的例子是列出和 “Editor” 组相关联的软件包。

```
# dnf groupinfo Editors
Last metadata expiration check: 0:04:57 ago on Sun 09 Sep 2018 07:10:36 PM IST.

Group: Editors
 Description: Sometimes called text editors, these are programs that allow you to create and edit text files. This includes Emacs and Vi.
 Optional Packages:
 code-editor
 cssed
 emacs
 emacs-auctex
 emacs-bbdb
 emacs-ess
 emacs-vm
 geany
 gobby
 jed
 joe
 leafpad
 nedit
 poedit
 psgml
 vim-X11
 vim-enhanced
 xemacs
 xemacs-packages-base
 xemacs-packages-extra
 xemacs-xft
 xmlcopyeditor
 zile
```

### 如何在 openSUSE 系统上列出可用的软件包组

openSUSE 系统使用的是 zypper 软件包管理器，因此可以通过 zypper 软件包管理器来获取相关的信息。

Zypper 是 suse 和 openSUSE 发行版的命令行包管理器。它可以用于安装、更新、搜索和删除软件包，还有管理存储库，执行各种查询等功能。 Zypper 命令行界面用到了 ZYpp 系统管理库（libzypp）。

**推荐阅读：** [在 openSUSE 和 suse 系统使用 zypper 命令管理软件包](https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/)

```
# zypper patterns
Loading repository data...
Warning: Repository 'Update Repository (Non-Oss)' appears to be outdated. Consider using a different mirror or server.
Warning: Repository 'Main Update Repository' appears to be outdated. Consider using a different mirror or server.
Reading installed packages...
S | Name | Version | Repository | Dependency
---|----------------------|---------------|-----------------------|-----------
 | 64bit | 20150918-25.1 | Main Repository (OSS) |
 | apparmor | 20150918-25.1 | Main Repository (OSS) |
i | apparmor | 20150918-25.1 | @System |
 | base | 20150918-25.1 | Main Repository (OSS) |
i+ | base | 20150918-25.1 | @System |
 | books | 20150918-25.1 | Main Repository (OSS) |
 | console | 20150918-25.1 | Main Repository (OSS) |
 | devel_C_C++ | 20150918-25.1 | Main Repository (OSS) |
i | enhanced_base | 20150918-25.1 | @System |
 | enlightenment | 20150918-25.1 | Main Repository (OSS) |
 | file_server | 20150918-25.1 | Main Repository (OSS) |
 | fonts | 20150918-25.1 | Main Repository (OSS) |
i | fonts | 20150918-25.1 | @System |
 | games | 20150918-25.1 | Main Repository (OSS) |
i | games | 20150918-25.1 | @System |
 | gnome | 20150918-25.1 | Main Repository (OSS) |
 | gnome_basis | 20150918-25.1 | Main Repository (OSS) |
i | imaging | 20150918-25.1 | @System |
 | kde | 20150918-25.1 | Main Repository (OSS) |
i+ | kde | 20150918-25.1 | @System |
 | kde_plasma | 20150918-25.1 | Main Repository (OSS) |
i | kde_plasma | 20150918-25.1 | @System |
 | lamp_server | 20150918-25.1 | Main Repository (OSS) |
 | laptop | 20150918-25.1 | Main Repository (OSS) |
i+ | laptop | 20150918-25.1 | @System |
 | lxde | 20150918-25.1 | Main Repository (OSS) |
 | lxqt | 20150918-25.1 | Main Repository (OSS) |
i | multimedia | 20150918-25.1 | @System |
 | network_admin | 20150918-25.1 | Main Repository (OSS) |
 | non_oss | 20150918-25.1 | Main Repository (OSS) |
i | non_oss | 20150918-25.1 | @System |
 | office | 20150918-25.1 | Main Repository (OSS) |
i | office | 20150918-25.1 | @System |
 | print_server | 20150918-25.1 | Main Repository (OSS) |
 | remote_desktop | 20150918-25.1 | Main Repository (OSS) |
 | x11 | 20150918-25.1 | Main Repository (OSS) |
i+ | x11 | 20150918-25.1 | @System |
 | x86 | 20150918-25.1 | Main Repository (OSS) |
 | xen_server | 20150918-25.1 | Main Repository (OSS) |
 | xfce | 20150918-25.1 | Main Repository (OSS) |
 | xfce_basis | 20150918-25.1 | Main Repository (OSS) |
 | yast2_basis | 20150918-25.1 | Main Repository (OSS) |
i | yast2_basis | 20150918-25.1 | @System |
 | yast2_install_wf | 20150918-25.1 | Main Repository (OSS) |
```

如果需要列出相关联的软件包，可以执行以下这个命令。下面的例子是列出和 “file\_server” 组相关联的软件包。另外 `zypper` 还允许用户使用不同的选项执行相同的操作。

```
# zypper info file_server
Loading repository data...
Warning: Repository 'Update Repository (Non-Oss)' appears to be outdated. Consider using a different mirror or server.
Warning: Repository 'Main Update Repository' appears to be outdated. Consider using a different mirror or server.
Reading installed packages...

Information for pattern file_server:
------------------------------------
Repository : Main Repository (OSS)
Name : file_server
Version : 20150918-25.1
Arch : x86_64
Vendor : openSUSE
Installed : No
Visible to User : Yes
Summary : File Server
Description :
 File services to host files so that they may be accessed or retrieved by other computers on the same network. This includes the FTP, SMB, and NFS protocols.
Contents :
 S | Name | Type | Dependency
 ---|-------------------------------|---------|------------
 i+ | patterns-openSUSE-base | package | Required
 | patterns-openSUSE-file_server | package | Required
 | nfs-kernel-server | package | Recommended
 i | nfsidmap | package | Recommended
 i | samba | package | Recommended
 i | samba-client | package | Recommended
 i | samba-winbind | package | Recommended
 | tftp | package | Recommended
 | vsftpd | package | Recommended
 | yast2-ftp-server | package | Recommended
 | yast2-nfs-server | package | Recommended
 i | yast2-samba-server | package | Recommended
 | yast2-tftp-server | package | Recommended
```

如果需要列出相关联的软件包，可以执行以下这个命令。

```
# zypper pattern-info file_server
Loading repository data...
Warning: Repository 'Update Repository (Non-Oss)' appears to be outdated. Consider using a different mirror or server.
Warning: Repository 'Main Update Repository' appears to be outdated. Consider using a different mirror or server.
Reading installed packages...

Information for pattern file_server:
------------------------------------
Repository : Main Repository (OSS)
Name : file_server
Version : 20150918-25.1
Arch : x86_64
Vendor : openSUSE
Installed : No
Visible to User : Yes
Summary : File Server
Description :
 File services to host files so that they may be accessed or retrieved by other computers on the same network. This includes the FTP, SMB, and NFS protocols.
Contents :
 S | Name | Type | Dependency
 ---|-------------------------------|---------|------------
 i+ | patterns-openSUSE-base | package | Required
 | patterns-openSUSE-file_server | package | Required
 | nfs-kernel-server | package | Recommended
 i | nfsidmap | package | Recommended
 i | samba | package | Recommended
 i | samba-client | package | Recommended
 i | samba-winbind | package | Recommended
 | tftp | package | Recommended
 | vsftpd | package | Recommended
 | yast2-ftp-server | package | Recommended
 | yast2-nfs-server | package | Recommended
 i | yast2-samba-server | package | Recommended
 | yast2-tftp-server | package | Recommended
```

如果需要列出相关联的软件包，也可以执行以下这个命令。

```
# zypper info pattern file_server
Loading repository data...
Warning: Repository 'Update Repository (Non-Oss)' appears to be outdated. Consider using a different mirror or server.
Warning: Repository 'Main Update Repository' appears to be outdated. Consider using a different mirror or server.
Reading installed packages...

Information for pattern file_server:
------------------------------------
Repository : Main Repository (OSS)
Name : file_server
Version : 20150918-25.1
Arch : x86_64
Vendor : openSUSE
Installed : No
Visible to User : Yes
Summary : File Server
Description :
 File services to host files so that they may be accessed or retrieved by other computers on the same network. This includes the FTP, SMB, and NFS protocols.
Contents :
 S | Name | Type | Dependency
 ---|-------------------------------|---------|------------
 i+ | patterns-openSUSE-base | package | Required
 | patterns-openSUSE-file_server | package | Required
 | nfs-kernel-server | package | Recommended
 i | nfsidmap | package | Recommended
 i | samba | package | Recommended
 i | samba-client | package | Recommended
 i | samba-winbind | package | Recommended
 | tftp | package | Recommended
 | vsftpd | package | Recommended
 | yast2-ftp-server | package | Recommended
 | yast2-nfs-server | package | Recommended
 i | yast2-samba-server | package | Recommended
 | yast2-tftp-server | package | Recommended
```

如果需要列出相关联的软件包，也可以执行以下这个命令。

```
# zypper info -t pattern file_server
Loading repository data...
Warning: Repository 'Update Repository (Non-Oss)' appears to be outdated. Consider using a different mirror or server.
Warning: Repository 'Main Update Repository' appears to be outdated. Consider using a different mirror or server.
Reading installed packages...

Information for pattern file_server:
------------------------------------
Repository : Main Repository (OSS)
Name : file_server
Version : 20150918-25.1
Arch : x86_64
Vendor : openSUSE
Installed : No
Visible to User : Yes
Summary : File Server
Description :
 File services to host files so that they may be accessed or retrieved by other computers on the same network. This includes the FTP, SMB, and NFS protocols.
Contents :
 S | Name | Type | Dependency
 ---|-------------------------------|---------|------------
 i+ | patterns-openSUSE-base | package | Required
 | patterns-openSUSE-file_server | package | Required
 | nfs-kernel-server | package | Recommended
 i | nfsidmap | package | Recommended
 i | samba | package | Recommended
 i | samba-client | package | Recommended
 i | samba-winbind | package | Recommended
 | tftp | package | Recommended
 | vsftpd | package | Recommended
 | yast2-ftp-server | package | Recommended
 | yast2-nfs-server | package | Recommended
 i | yast2-samba-server | package | Recommended
 | yast2-tftp-server | package | Recommended
```

### 如何在 Debian/Ubuntu 系统上列出可用的软件包组

由于 APT 或 APT-GET 软件包管理器没有为基于 Debian/Ubuntu 的系统提供这样的选项，因此需要使用 `tasksel` 命令来获取相关信息。

[tasksel](https://wiki.debian.org/tasksel) 是 Debian/Ubuntu 系统上一个很方便的工具，只需要很少的操作就可以用它来安装好一组软件包。可以在 `/usr/share/tasksel` 目录下的 `.desc` 文件中安排软件包的安装任务。

默认情况下，`tasksel` 工具是作为 Debian 系统的一部分安装的，但桌面版 Ubuntu 则没有自带 `tasksel`，这个功能类似软件包管理器中的元包（meta-packages）。

`tasksel` 工具带有一个基于 zenity 的简单用户界面，例如命令行中的弹出图形对话框。

**推荐阅读：** [使用 tasksel 在 Debian/Ubuntu 系统上快速安装软件包组](https://www.2daygeek.com/tasksel-install-group-of-software-in-a-single-click-or-single-command-on-debian-ubuntu/)

```
# tasksel --list-task
u kubuntu-live Kubuntu live CD
u lubuntu-live-gtk Lubuntu live CD (GTK part)
u ubuntu-budgie-live Ubuntu Budgie live CD
u ubuntu-live Ubuntu live CD
u ubuntu-mate-live Ubuntu MATE Live CD
u ubuntustudio-dvd-live Ubuntu Studio live DVD
u vanilla-gnome-live Ubuntu GNOME live CD
u xubuntu-live Xubuntu live CD
u cloud-image Ubuntu Cloud Image (instance)
u dns-server DNS server
u kubuntu-desktop Kubuntu desktop
u kubuntu-full Kubuntu full
u lamp-server LAMP server
u lubuntu-core Lubuntu minimal installation
u lubuntu-desktop Lubuntu Desktop
u lubuntu-gtk-core Lubuntu minimal installation (GTK part)
u lubuntu-gtk-desktop Lubuntu Desktop (GTK part)
u lubuntu-qt-core Lubuntu minimal installation (Qt part)
u lubuntu-qt-desktop Lubuntu Qt Desktop (Qt part)
u mail-server Mail server
u postgresql-server PostgreSQL database
i print-server Print server
u samba-server Samba file server
u tomcat-server Tomcat Java server
u ubuntu-budgie-desktop Ubuntu Budgie desktop
i ubuntu-desktop Ubuntu desktop
u ubuntu-mate-core Ubuntu MATE minimal
u ubuntu-mate-desktop Ubuntu MATE desktop
i ubuntu-usb Ubuntu desktop USB
u ubuntustudio-audio Audio recording and editing suite
u ubuntustudio-desktop Ubuntu Studio desktop
u ubuntustudio-desktop-core Ubuntu Studio minimal DE installation
u ubuntustudio-fonts Large selection of font packages
u ubuntustudio-graphics 2D/3D creation and editing suite
u ubuntustudio-photography Photograph touchup and editing suite
u ubuntustudio-publishing Publishing applications
u ubuntustudio-video Video creation and editing suite
u vanilla-gnome-desktop Vanilla GNOME desktop
u xubuntu-core Xubuntu minimal installation
u xubuntu-desktop Xubuntu desktop
u openssh-server OpenSSH server
u server Basic Ubuntu server
```

如果需要列出相关联的软件包，可以执行以下这个命令。下面的例子是列出和 “lamp-server” 组相关联的软件包。

```
# tasksel --task-desc "lamp-server"
Selects a ready-made Linux/Apache/MySQL/PHP server.
```

### 如何在基于 Arch Linux 的系统上列出可用的软件包组

基于 Arch Linux 的系统使用的是 pacman 软件包管理器，因此可以通过 pacman 软件包管理器来获取相关的信息。

pacman 是 “package manager” 的缩写。`pacman` 可以用于安装、构建、删除和管理 Arch Linux 软件包。`pacman` 使用 libalpm（Arch Linux Package Management 库，ALPM）作为后端来执行所有操作。

**推荐阅读：** [使用 pacman 在基于 Arch Linux 的系统上管理软件包](https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/)

```
# pacman -Sg
base-devel
base
multilib-devel
gnome-extra
kde-applications
kdepim
kdeutils
kdeedu
kf5
kdemultimedia
gnome
plasma
kdegames
kdesdk
kdebase
xfce4
fprint
kdegraphics
kdenetwork
kdeadmin
kf5-aids
kdewebdev
.
.
dlang-ldc
libretro
ring
lxqt
non-daw
non
alsa
qtcurve
realtime
sugar-fructose
tesseract-data
vim-plugins
```

如果需要列出相关联的软件包，可以执行以下这个命令。下面的例子是列出和 “gnome” 组相关联的软件包。

```
# pacman -Sg gnome
gnome baobab
gnome cheese
gnome eog
gnome epiphany
gnome evince
gnome file-roller
gnome gdm
gnome gedit
gnome gnome-backgrounds
gnome gnome-calculator
gnome gnome-calendar
gnome gnome-characters
gnome gnome-clocks
gnome gnome-color-manager
gnome gnome-contacts
gnome gnome-control-center
gnome gnome-dictionary
gnome gnome-disk-utility
gnome gnome-documents
gnome gnome-font-viewer
.
.
gnome sushi
gnome totem
gnome tracker
gnome tracker-miners
gnome vino
gnome xdg-user-dirs-gtk
gnome yelp
gnome gnome-boxes
gnome gnome-software
gnome simple-scan

```

也可以执行以下这个命令实现同样的效果。

```
# pacman -S gnome
:: There are 64 members in group gnome:
:: Repository extra
 1) baobab 2) cheese 3) eog 4) epiphany 5) evince 6) file-roller 7) gdm 8) gedit 9) gnome-backgrounds 10) gnome-calculator 11) gnome-calendar 12) gnome-characters 13) gnome-clocks
 14) gnome-color-manager 15) gnome-contacts 16) gnome-control-center 17) gnome-dictionary 18) gnome-disk-utility 19) gnome-documents 20) gnome-font-viewer 21) gnome-getting-started-docs
 22) gnome-keyring 23) gnome-logs 24) gnome-maps 25) gnome-menus 26) gnome-music 27) gnome-photos 28) gnome-screenshot 29) gnome-session 30) gnome-settings-daemon 31) gnome-shell
 32) gnome-shell-extensions 33) gnome-system-monitor 34) gnome-terminal 35) gnome-themes-extra 36) gnome-todo 37) gnome-user-docs 38) gnome-user-share 39) gnome-video-effects 40) grilo-plugins
 41) gvfs 42) gvfs-afc 43) gvfs-goa 44) gvfs-google 45) gvfs-gphoto2 46) gvfs-mtp 47) gvfs-nfs 48) gvfs-smb 49) mousetweaks 50) mutter 51) nautilus 52) networkmanager 53) orca 54) rygel
 55) sushi 56) totem 57) tracker 58) tracker-miners 59) vino 60) xdg-user-dirs-gtk 61) yelp
:: Repository community
 62) gnome-boxes 63) gnome-software 64) simple-scan

Enter a selection (default=all): ^C
Interrupt signal received

```

可以执行以下命令检查相关软件包的数量。

```
# pacman -Sg gnome | wc -l
64
```

---

via: <https://www.2daygeek.com/how-to-list-an-available-package-groups-in-linux/>

作者：[Prakash Subramanian](https://www.2daygeek.com/author/prakash/) 选题：[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/) 荣誉推出


Hegemon：使用 Rust 编写的模块化系统监视程序

Summary: 我个人最喜欢的是 htop。但是，开发人员不时会发布这些程序的替代品。

我个人最喜欢的是 htop。但是，开发人员不时会发布这些程序的替代品。

![](/data/attachment/album/201810/15/120759n21jo62fs69sldqf.png)

在类 Unix 系统中监视运行进程时，最常用的程序是 `top` 和它的增强版 `htop`。我个人最喜欢的是 `htop`。但是，开发人员不时会发布这些程序的替代品。`top` 和 `htop` 工具的一个替代品是 `Hegemon`。它是使用 Rust 语言编写的模块化系统监视程序。

关于 Hegemon 的功能，我们可以列出以下这些：

* Hegemon 会监控 CPU、内存和交换页的使用情况。
* 它监控系统的温度和风扇速度。
* 更新间隔时间可以调整。默认值为 3 秒。
* 我们可以通过扩展数据流来展示更详细的图表和其他信息。
* 单元测试。
* 干净的界面。
* 自由开源。

### 安装 Hegemon

确保已安装 Rust 1.26 或更高版本。要在 Linux 发行版中安装 Rust，请参阅以下指南：

* [在 Linux 中安装 Rust 编程语言](https://www.ostechnix.com/install-rust-programming-language-in-linux/)

另外要安装 [libsensors](https://github.com/lm-sensors/lm-sensors) 库。它在大多数 Linux 发行版的默认仓库中都有。例如，你可以使用以下命令将其安装在基于 RPM 的系统（如 Fedora）中：

```
$ sudo dnf install lm_sensors-devel
```

在像 Ubuntu、Linux Mint 这样的基于 Debian 的系统上，可以使用这个命令安装它：

```
$ sudo apt-get install libsensors4-dev
```

在安装 Rust 和 libsensors 后，使用命令安装 Hegemon：

```
$ cargo install hegemon
```

安装 hegemon 后，使用以下命令开始监视 Linux 系统中正在运行的进程：

```
$ hegemon
```

以下是 Arch Linux 桌面的示例输出。

![](/data/attachment/album/201810/15/120800ik56fafg7zxfomro.gif)

要退出，请按 `Q`。

请注意，hegemon 仍处于早期开发阶段，并不能完全取代 `top` 命令。它可能存在 bug 和功能缺失。如果你遇到任何 bug，请在项目的 GitHub 页面中报告它们。开发人员计划在即将推出的版本中引入更多功能。所以，请关注这个项目。

就是这些了。希望这篇文章有用。还有更多的好东西。敬请关注！

干杯!

---

via: <https://www.ostechnix.com/hegemon-a-modular-system-monitor-application-written-in-rust/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[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/) 荣誉推出


cloc：计算不同编程语言源代码的行数

![](/data/attachment/album/201810/15/121813la77nf3fecw2pd7a.png)

作为一个开发人员，你可能需要不时地向你的领导或者同事分享你目前的工作与代码开发进展，抑或你的领导想对代码进行全方位的分析。这时，你就需要用到一些代码统计的工具，我知道其中一个是 [**Ohcount**](https://www.ostechnix.com/ohcount-the-source-code-line-counter-and-analyzer/)。今天，我遇到了另一个程序，**cloc**。你可以用 cloc 很容易地统计多种语言的源代码行数。它还可以计算空行数、代码行数、实际代码的行数，并通过整齐的表格进行结果输出。cloc 是自由开源的跨平台程序，使用 **Perl** 进行开发。

### 特点

cloc 有很多优势：

* 安装方便而且易用，不需要额外的依赖项
* 可移植
* 支持多种的结果格式导出，包括：纯文本、SQL、JSON、XML、YAML、CSV
* 可以计算 git 的提交数
* 可递归计算文件夹内的代码行数
* 可计算压缩后的文件，如：tar、zip、Java 的 .ear 等类型
* 开源，跨平台

### 安装

cloc 的安装包在大多数的类 Unix 操作系统的默认软件库内，所以你只需要使用默认的包管理器安装即可。

Arch Linux:

```
$ sudo pacman -S cloc
```

Debian/Ubuntu:

```
$ sudo apt-get install cloc
```

CentOS/Red Hat/Scientific Linux:

```
$ sudo yum install cloc
```

Fedora:

```
$ sudo dnf install cloc
```

FreeBSD:

```
$ sudo pkg install cloc
```

当然你也可以使用第三方的包管理器，比如 [**NPM**](https://www.ostechnix.com/install-node-js-linux/)。

```
$ npm install -g cloc
```

### 统计多种语言代码数据的使用举例

首先来几个简单的例子，比如下面在我目前工作目录中的的 C 代码。

```
$ cat hello.c
#include <stdio.h>
int main()
{
    // printf() displays the string inside quotation
    printf("Hello, World!");
    return 0;
}
```

想要计算行数，只需要简单运行：

```
$ cloc hello.c
```

输出：

![](/data/attachment/album/201810/15/121814hfjzwmjrn6zi2iwh.png)

第一列是被分析文件的编程语言，上面我们可以看到这个文件是用 C 语言编写的。

第二列显示的是该种语言有多少文件，图中说明只有一个。

第三列显示空行的数量，图中显示是 0 行。

第四列显示注释的行数。

第五列显示该文件中实际的代码总行数。

这是一个有只有 6 行代码的源文件，我们看到统计的还算准确，那么如果用来统计一个行数较多的源文件呢？

```
$ cloc file.tar.gz
```

输出：

![](/data/attachment/album/201810/15/121815mc7ddd5cnkk467nu.png)

上述输出结果如果手动统计准确的代码行数非常困难，但是 cloc 只需要几秒，而且以易读的表格格式显示结果。你还可以在最后查看每个部分的总计，这在分析程序的源代码时非常方便。

除了源代码文件，cloc 还能递归计算各个目录及其子目录下的文件、压缩包、甚至 git commit 数目等。

文件夹中使用的例子：

```
$ cloc dir/
```

![](/data/attachment/album/201810/15/121816g9dwu9h3y9x9x3t9.png)

子文件夹中使用的例子\*：

```
$ cloc dir/cloc/tests
```

![](/data/attachment/album/201810/15/121817yxgod3zgtc3z2k7b.png)

计算一个压缩包中源代码的行数：

```
$ cloc archive.zip
```

![](/data/attachment/album/201810/15/121819o8irvua2ekti7z8n.png)

你还可以计算一个 git 项目，也可以像下面这样针对某次提交时的状态统计：

```
$ git clone https://github.com/AlDanial/cloc.git

$ cd cloc

$ cloc 157d706
```

![](/data/attachment/album/201810/15/121820nobznv8qhh6zhvhl.png)

cloc 可以自动识别一些语言，使用下面的命令查看 cloc 支持的语言：

```
$ cloc --show-lang
```

更新信息请查阅 cloc 的使用帮助。

```
$ cloc --help
```

开始使用吧！

---

via: <https://www.ostechnix.com/cloc-count-the-lines-of-source-code-in-many-programming-languages/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[littleji](https://github.com/littleji) 校对：[pityonline](https://github.com/pityonline)

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


如何在 Linux 下锁住键盘和鼠标而不锁屏

Summary: 它很简单但非常实用，你可以锁定屏幕的显示直到用户在键盘上输入自己设定的密码

它很简单但非常实用，你可以锁定屏幕的显示直到用户在键盘上输入自己设定的密码

![](/data/attachment/album/201810/15/230017vhmqmjbpmnhpbbjh.jpg)

我四岁的侄女是个好奇的孩子，她非常喜爱“阿凡达”电影，当阿凡达电影在播放时，她是如此的专注，好似眼睛粘在了屏幕上。但问题是当她观看电影时，她经常会碰到键盘上的某个键或者移动了鼠标，又或者是点击了鼠标的按钮。有时她非常意外地按了键盘上的某个键，从而将电影关闭或者暂停了。所以我就想找个方法来将键盘和鼠标都锁住，但屏幕不会被锁住。幸运的是，我在 Ubuntu 论坛上找到了一个完美的解决方法。假如在你正看着屏幕上的某些重要的事情时，你不想让你的小猫或者小狗在你的键盘上行走，或者让你的孩子在键盘上瞎搞一气，那我建议你试试 **xtrlock** 这个工具。它很简单但非常实用，你可以锁定屏幕的显示直到用户在键盘上输入自己设定的密码（LCTT 译注：就是用户自己的密码，例如用来打开屏保的那个密码，不需要单独设定）。在这篇简单的教程中，我将为你展示如何在 Linux 下锁住键盘和鼠标，而不锁掉屏幕。这个技巧几乎可以在所有的 Linux 操作系统中生效。

### 安装 xtrlock

xtrlock 软件包在大多数 Linux 操作系统的默认软件仓库中都可以获取到。所以你可以使用你安装的发行版的包管理器来安装它。

在 **Arch Linux** 及其衍生发行版中，运行下面的命令来安装它：

```
$ sudo pacman -S xtrlock
```

在 **Fedora** 上使用：

```
$ sudo dnf install xtrlock
```

在 **RHEL、CentOS** 上使用：

```
$ sudo yum install xtrlock
```

在 **SUSE/openSUSE** 上使用：

```
$ sudo zypper install xtrlock
```

在 **Debian、Ubuntu、Linux Mint** 上使用：

```
$ sudo apt-get install xtrlock
```

### 使用 xtrlock 锁住键盘和鼠标但不锁屏

安装好 xtrlock 后，你需要根据你的选择来创建一个快捷键，通过这个快捷键来锁住键盘和鼠标。

（LCTT 译注：译者在自己的系统（Arch + Deepin）中发现这里的到下面创建快捷键的部分可以不必做，依然生效。）

在 `/usr/local/bin` 目录下创建一个名为 `lockkbmouse` 的新文件：

```
$ sudo vi /usr/local/bin/lockkbmouse
```

然后将下面的命令添加到这个文件中：

```
#!/bin/bash
sleep 1 && xtrlock
```

保存并关闭这个文件。

然后使用下面的命令来使得它可以被执行：

```
$ sudo chmod a+x /usr/local/bin/lockkbmouse
```

接着，我们就需要创建快捷键了。

#### 创建快捷键

**在 Arch Linux MATE 桌面中**

依次点击 “System -> Preferences -> Hardware -> keyboard Shortcuts”

然后点击 “Add” 来创建快捷键。

![](/data/attachment/album/201810/15/230020jkcqnb5ddnd2cz3y.png)

首先键入你的这个快捷键的名称，然后将下面的命令填入命令框中，最后点击 “Apply” 按钮。

```
bash -c "sleep 1 && xtrlock"
```

![](/data/attachment/album/201810/15/230022f38xusjku73ee78k.png)

为了能够给这个快捷键赋予快捷方式，需要选中它或者双击它然后输入你选定的快捷键组合，例如我使用 `Alt+k` 这组快捷键。

![](/data/attachment/album/201810/15/230023nbbt5ihkmo9zltat.png)

如果要清除这个快捷键组合，按住 `BACKSPACE` 键就可以了。完成后，关闭键盘设定窗口。

**在 Ubuntu GNOME 桌面中**

依次进入 “System Settings -> Devices -> Keyboard”，然后点击 “+” 这个符号。

键入你快捷键的名称并将下面的命令加到命令框里面，然后点击 “Add” 按钮。

```
bash -c "sleep 1 && xtrlock"
```

![](/data/attachment/album/201810/15/230025skvl39zzebhkuglv.png)

接下来为这个新建的快捷键赋予快捷方式。我们只需要选择或者双击 “Set shortcut” 这个按钮就可以了。

![](/data/attachment/album/201810/15/230027cbjrbd95rtdesr5a.png)

然后你将看到下面的一屏。

![](/data/attachment/album/201810/15/230029coxdbhg00bvke0hx.png)

输入你选定的快捷键组合，例如我使用 `Alt+k`。

![](/data/attachment/album/201810/15/230030l752a99aa9e0e54w.png)

如果要清除这个快捷键组合，则可以按 `BACKSPACE` 这个键。这样快捷键便设定好了，完成这个后，关闭键盘设定窗口。

从现在起，每当你输入刚才设定的快捷键（在我们的示例中是 `ATL+K`），鼠标的指针便会变成一个挂锁的模样。现在，键盘和鼠标便被锁定了，这时你便可以自在地观看你的电影或者做其他你想做的事儿。即便是你的孩子或者宠物碰了键盘上的某些键或者点击了鼠标，这些操作都不会起作用。

因为 `xtrlock` 已经在工作了。

![](/data/attachment/album/201810/15/230032cssvpckmznpnulkk.png)

你看到了那个小的锁按钮了吗？它意味着键盘和鼠标已经被锁定了。即便你移动这个锁按钮，也不会发生任何事情。后台的任务在一直执行，直到你将屏幕解除，然后手动停掉运行中的任务。

### 将键盘和鼠标解锁

要将键盘和鼠标解锁，只需要输入你的密码然后敲击回车键就可以了，在输入的过程中你将看不到密码。只需要输入然后敲回车键就可以了。在你输入了正确的密码后，鼠标和键盘就可以再工作了。假如你输入了一个错误的密码，你将听到警告声。按 `ESC` 来清除输入的错误密码，然后重新输入正确的密码。要去掉未完全输入完的密码中的一个字符，只需要按 `BACKSPACE` 或者 `DELETE` 键就可以了。

### 要是我被永久地锁住了怎么办？

以防你被永久地锁定了屏幕，切换至一个 TTY（例如 `CTRL+ALT+F2`）然后运行：

```
$ sudo killall xtrlock
```

或者你还可以使用 `chvt` 命令来在 TTY 和 X 会话之间切换。

例如，如果要切换到 TTY1，则运行：

```
$ sudo chvt 1
```

要切换回 X 会话，则键入：

```
$ sudo chvt 7
```

不同的发行版使用了不同的快捷键组合来在不同的 TTY 间切换。请参考你安装的对应发行版的官方网站了解更多详情。

如果想知道更多 xtrlock 的信息，请参考 man 页：

```
$ man xtrlock
```

那么这就是全部了。希望这个指南可以帮到你。假如你发现这个指南很有用，请花点时间将这个指南共享到你的朋友圈并支持我们（OSTechNix）。

**资源：**

* [**Ubuntu 论坛**](https://ubuntuforums.org/showthread.php?t=993800)

---

via: <https://www.ostechnix.com/lock-keyboard-mouse-not-screen-linux/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[FSSlc](https://github.com/FSSlc) 校对：[wxy](https://github.com/wxy)

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


如何在救援（单用户模式）/紧急模式下启动 Ubuntu 18.04/Debian 9 服务器

Summary: 将 Linux 服务器引导到单用户模式或救援模式是 Linux 管理员在关键时刻恢复服务器时通常使用的重要故障排除方法之一。

有用！！！

![](/data/attachment/album/201810/16/105315vczya87xzdkyz3d7.jpg)

将 Linux 服务器引导到单用户模式或<ruby> 救援模式 <rt>  rescue mode </rt></ruby>是 Linux 管理员在关键时刻恢复服务器时通常使用的重要故障排除方法之一。在 Ubuntu 18.04 和 Debian 9 中，单用户模式被称为救援模式。

除了救援模式外，Linux 服务器可以在<ruby> 紧急模式 <rt>  emergency mode </rt></ruby>下启动，它们之间的主要区别在于，紧急模式加载了带有只读根文件系统文件系统的最小环境，没有启用任何网络或其他服务。但救援模式尝试挂载所有本地文件系统并尝试启动一些重要的服务，包括网络。

在本文中，我们将讨论如何在救援模式和紧急模式下启动 Ubuntu 18.04 LTS/Debian 9 服务器。

#### 在单用户/救援模式下启动 Ubuntu 18.04 LTS 服务器：

重启服务器并进入启动加载程序 （Grub） 屏幕并选择 “Ubuntu”，启动加载器页面如下所示，

![](/data/attachment/album/201810/16/105335iyyes0x8e3r5sxo3.jpg)

按下 `e`，然后移动到以 `linux` 开头的行尾，并添加 `systemd.unit=rescue.target`。如果存在单词 `$vt_handoff` 就删除它。

![](/data/attachment/album/201810/16/105337gpmsv4cweappamcs.jpg)

现在按 `Ctrl-x` 或 `F10` 启动，

![](/data/attachment/album/201810/16/105338dn7mr1en1347l3rl.jpg)

现在按回车键，然后你将得到所有文件系统都以读写模式挂载的 shell 并进行故障排除。完成故障排除后，可以使用 `reboot` 命令重新启动服务器。

#### 在紧急模式下启动 Ubuntu 18.04 LTS 服务器

重启服务器并进入启动加载程序页面并选择 “Ubuntu”，然后按 `e` 并移动到以 `linux` 开头的行尾，并添加 `systemd.unit=emergency.target`。

![](/data/attachment/album/201810/16/105340n039llic3h4g9cs9.jpg)

现在按 `Ctrl-x` 或 `F10` 以紧急模式启动，你将获得一个 shell 并从那里进行故障排除。正如我们已经讨论过的那样，在紧急模式下，文件系统将以只读模式挂载，并且在这种模式下也不会有网络，

![](/data/attachment/album/201810/16/105341x8ttlibn7lnjnn53.jpg)

使用以下命令将根文件系统挂载到读写模式，

```
# mount -o remount,rw /

```

同样，你可以在读写模式下重新挂载其余文件系统。

#### 将 Debian 9 引导到救援和紧急模式

重启 Debian 9.x 服务器并进入 grub页面选择 “Debian GNU/Linux”。

![](/data/attachment/album/201810/16/105341urmm99mtrmq3nxtr.jpg)

按下 `e` 并移动到 linux 开头的行尾并添加 `systemd.unit=rescue.target` 以在救援模式下启动系统， 要在紧急模式下启动，那就添加 `systemd.unit=emergency.target`。

#### 救援模式：

![](/data/attachment/album/201810/16/105342wrccvd5rpzmd7ale.jpg)

现在按 `Ctrl-x` 或 `F10` 以救援模式启动

![](/data/attachment/album/201810/16/105344bffn260n6z6nqn6f.jpg)

按下回车键以获取 shell，然后从这里开始故障排除。

#### 紧急模式：

![](/data/attachment/album/201810/16/105345rcjz04qv4jqqo4kb.jpg)

现在按下 `ctrl-x` 或 `F10` 以紧急模式启动系统

![](/data/attachment/album/201810/16/105341x8ttlibn7lnjnn53.jpg)

按下回车获取 shell 并使用 `mount -o remount,rw /` 命令以读写模式挂载根文件系统。

**注意：**如果已经在 Ubuntu 18.04 和 Debian 9 Server 中设置了 root 密码，那么你必须输入 root 密码才能在救援和紧急模式下获得 shell

就是这些了，如果您喜欢这篇文章，请分享你的反馈和评论。

---

via: <https://www.linuxtechi.com/boot-ubuntu-18-04-debian-9-rescue-emergency-mode/>

作者：[Pradeep Kumar](http://www.linuxtechi.com/author/pradeep/) 选题：[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/) 荣誉推出


在 Ubuntu 18.04 LTS 上使用 KVM 配置无头虚拟化服务器

Summary: 使用 KVM，我们可以在几分钟之内，很轻松地将任意 Linux 服务器转换到一个完全的虚拟化环境中，以及部署不同种类的虚拟机，比如 GNU/Linux、*BSD、Windows 等等。

为什么我连的vnc之后要输入密码？

![](/data/attachment/album/201810/16/111911yazztadztjtbilrr.jpg)

我们已经讲解了 [在 Ubuntu 18.04 无头服务器上配置 Oracle VirtualBox](https://www.ostechnix.com/install-oracle-virtualbox-ubuntu-16-04-headless-server/) 。在本教程中，我们将讨论如何使用 **KVM** 去配置无头虚拟化服务器，以及如何从一个远程客户端去管理访客系统。正如你所知道的，KVM（**K**ernel-based **v**irtual **m**achine）是开源的，是 Linux 上的全虚拟化。使用 KVM，我们可以在几分钟之内，很轻松地将任意 Linux 服务器转换到一个完全的虚拟化环境中，以及部署不同种类的虚拟机，比如 GNU/Linux、\*BSD、Windows 等等。

### 使用 KVM 配置无头虚拟化服务器

我在 Ubuntu 18.04 LTS 服务器上测试了本指南，但是它在其它的 Linux 发行版上也可以使用，比如，Debian、CentOS、RHEL 以及 Scientific Linux。这个方法完全适合哪些希望在没有任何图形环境的 Linux 服务器上，去配置一个简单的虚拟化环境。

基于本指南的目的，我将使用两个系统。

**KVM 虚拟化服务器：**

* **宿主机操作系统** – 最小化安装的 Ubuntu 18.04 LTS（没有 GUI）
* **宿主机操作系统的 IP 地址**：192.168.225.22/24
* **访客操作系统**（它将运行在 Ubuntu 18.04 的宿主机上）：Ubuntu 16.04 LTS server

**远程桌面客户端：**

* **操作系统** – Arch Linux

### 安装 KVM

首先，我们先检查一下我们的系统是否支持硬件虚拟化。为此，需要在终端中运行如下的命令：

```
$ egrep -c '(vmx|svm)' /proc/cpuinfo
```

假如结果是 `zero (0)`，说明系统不支持硬件虚拟化，或者在 BIOS 中禁用了虚拟化。进入你的系统 BIOS 并检查虚拟化选项，然后启用它。

假如结果是 `1` 或者 **更大的数**，说明系统将支持硬件虚拟化。然而，在你运行上面的命令之前，你需要始终保持 BIOS 中的虚拟化选项是启用的。

或者，你也可以使用如下的命令去验证它。但是为了使用这个命令你需要先安装 KVM。

```
$ kvm-ok
```

示例输出：

```
INFO: /dev/kvm exists
KVM acceleration can be used
```

如果输出的是如下这样的错误，你仍然可以在 KVM 中运行访客虚拟机，但是它的性能将非常差。

```
INFO: Your CPU does not support KVM extensions
INFO: For more detailed results, you should run this as root
HINT: sudo /usr/sbin/kvm-ok
```

当然，还有其它的方法来检查你的 CPU 是否支持虚拟化。更多信息参考接下来的指南。

* [如何知道 CPU 是否支持虚拟技术（VT）](https://www.ostechnix.com/how-to-find-if-a-cpu-supports-virtualization-technology-vt/)

接下来，安装 KVM 和在 Linux 中配置虚拟化环境所需要的其它包。

在 Ubuntu 和其它基于 DEB 的系统上，运行如下命令：

```
$ sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checker
```

KVM 安装完成后，启动 libvertd 服务（如果它没有启动的话）：

```
$ sudo systemctl enable libvirtd
$ sudo systemctl start libvirtd
```

### 创建虚拟机

所有的虚拟机文件和其它的相关文件都保存在 `/var/lib/libvirt/` 下。ISO 镜像的默认路径是 `/var/lib/libvirt/boot/`。

首先，我们先检查一下是否有虚拟机。查看可用的虚拟机列表，运行如下的命令：

```
$ sudo virsh list --all
```

示例输出：

```
Id Name State
----------------------------------------------------
```

![](/data/attachment/album/201810/16/111912jdm41ud448cc8fcx.png)

正如上面的截屏，现在没有可用的虚拟机。

现在，我们来创建一个。

例如，我们来创建一个有 512 MB 内存、1 个 CPU 核心、8 GB 硬盘的 Ubuntu 16.04 虚拟机。

```
$ sudo virt-install --name Ubuntu-16.04 --ram=512 --vcpus=1 --cpu host --hvm --disk path=/var/lib/libvirt/images/ubuntu-16.04-vm1,size=8 --cdrom /var/lib/libvirt/boot/ubuntu-16.04-server-amd64.iso --graphics vnc
```

请确保在路径 `/var/lib/libvirt/boot/` 中有一个 Ubuntu 16.04 的 ISO 镜像文件，或者在上面命令中给定的其它路径中有相应的镜像文件。

示例输出：

```
WARNING Graphics requested but DISPLAY is not set. Not running virt-viewer.
WARNING No console to launch for the guest, defaulting to --wait -1

Starting install...
Creating domain... | 0 B 00:00:01
Domain installation still in progress. Waiting for installation to complete.
Domain has shutdown. Continuing.
Domain creation completed.
Restarting guest.
```

![](/data/attachment/album/201810/16/111914sd7988j3x983zx8d.png)

我们来分别讲解以上的命令和看到的每个选项的作用。

* `–name`：这个选项定义虚拟机名字。在我们的案例中，这个虚拟机的名字是 `Ubuntu-16.04`。
* `–ram=512`：给虚拟机分配 512MB 内存。
* `–vcpus=1`：指明虚拟机中 CPU 核心的数量。
* `–cpu host`：通过暴露宿主机 CPU 的配置给访客系统来优化 CPU 属性。
* `–hvm`：要求完整的硬件虚拟化。
* `–disk path`：虚拟机硬盘的位置和大小。在我们的示例中，我分配了 8GB 的硬盘。
* `–cdrom`：安装 ISO 镜像的位置。请注意你必须在这个位置真的有一个 ISO 镜像。
* `–graphics vnc`：允许 VNC 从远程客户端访问虚拟机。

### 使用 VNC 客户端访问虚拟机

现在，我们在远程桌面系统上使用 SSH 登入到 Ubuntu 服务器上（虚拟化服务器），如下所示。

```
$ ssh sk@192.168.225.22
```

在这里，`sk` 是我的 Ubuntu 服务器的用户名，而 `192.168.225.22` 是它的 IP 地址。

运行如下的命令找出 VNC 的端口号。我们从一个远程系统上访问虚拟机需要它。

```
$ sudo virsh dumpxml Ubuntu-16.04 | grep vnc
```

示例输出：

```
<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>

```

![](/data/attachment/album/201810/16/111915gqokgnzxnf0y9xjk.png)

记下那个端口号 `5900`。安装任意的 VNC 客户端应用程序。在本指南中，我们将使用 TigerVnc。TigerVNC 是 Arch Linux 默认仓库中可用的客户端。在 Arch 上安装它，运行如下命令：

```
$ sudo pacman -S tigervnc
```

在安装有 VNC 客户端的远程客户端系统上输入如下的 SSH 端口转发命令。

```
$ ssh sk@192.168.225.22 -L 5900:127.0.0.1:5900
```

再强调一次，`192.168.225.22` 是我的 Ubuntu 服务器（虚拟化服务器）的 IP 地址。

然后，从你的 Arch Linux（客户端）打开 VNC 客户端。

在 VNC 服务器框中输入 `localhost:5900`，然后点击 “Connect” 按钮。

![](/data/attachment/album/201810/16/111916u5faeetyofti68e2.png)

然后就像你在物理机上安装系统一样的方法开始安装 Ubuntu 虚拟机。

![](/data/attachment/album/201810/16/111917hs7pp8pms8m85l7p.png)

![](/data/attachment/album/201810/16/111918j6ysw85jsukju5y6.png)

同样的，你可以根据你的服务器的硬件情况配置多个虚拟机。

或者，你可以使用 `virt-viewer` 实用程序在访客机器中安装操作系统。`virt-viewer` 在大多数 Linux 发行版的默认仓库中都可以找到。安装完 `virt-viewer` 之后，运行下列的命令去建立到虚拟机的访问连接。

```
$ sudo virt-viewer --connect=qemu+ssh://192.168.225.22/system --name Ubuntu-16.04
```

### 管理虚拟机

使用管理用户接口 `virsh` 从命令行去管理虚拟机是非常有趣的。命令非常容易记。我们来看一些例子。

查看运行的虚拟机，运行如下命令：

```
$ sudo virsh list
```

或者，

```
$ sudo virsh list --all
```

示例输出：

```
 Id Name State
----------------------------------------------------
 2 Ubuntu-16.04 running
```

![](/data/attachment/album/201810/16/111919o2k2ru4ykmbuybb8.png)

启动一个虚拟机，运行如下命令：

```
$ sudo virsh start Ubuntu-16.04
```

或者，也可以使用虚拟机 id 去启动它。

![](/data/attachment/album/201810/16/111920hu0d2u06tzw4t02u.png)

正如在上面的截图所看到的，Ubuntu 16.04 虚拟机的 Id 是 2。因此，启动它时，你也可以像下面一样只指定它的 ID。

```
$ sudo virsh start 2
```

重启动一个虚拟机，运行如下命令：
  `$ sudo virsh reboot Ubuntu-16.04`

示例输出：

```
Domain Ubuntu-16.04 is being rebooted
```

![](/data/attachment/album/201810/16/111922bdoo8909q06ch6cu.png)

暂停一个运行中的虚拟机，运行如下命令：

```
$ sudo virsh suspend Ubuntu-16.04
```

示例输出：

```
Domain Ubuntu-16.04 suspended
```

让一个暂停的虚拟机重新运行，运行如下命令：

```
$ sudo virsh resume Ubuntu-16.04
```

示例输出：

```
Domain Ubuntu-16.04 resumed
```

关闭一个虚拟机，运行如下命令：

```
$ sudo virsh shutdown Ubuntu-16.04
```

示例输出：

```
Domain Ubuntu-16.04 is being shutdown
```

完全移除一个虚拟机，运行如下的命令：

```
$ sudo virsh undefine Ubuntu-16.04
$ sudo virsh destroy Ubuntu-16.04
```

示例输出：

```
Domain Ubuntu-16.04 destroyed
```

![](/data/attachment/album/201810/16/111923qm4zrx9rxjj4kkmz.png)

关于它的更多选项，建议你去查看 man 手册页：

```
$ man virsh
```

今天就到这里吧。开始在你的新的虚拟化环境中玩吧。对于研究和开发者、以及测试目的，KVM 虚拟化将是很好的选择，但它能做的远不止这些。如果你有充足的硬件资源，你可以将它用于大型的生产环境中。如果你还有其它好玩的发现，不要忘记在下面的评论区留下你的高见。

谢谢！

---

via: <https://www.ostechnix.com/setup-headless-virtualization-server-using-kvm-ubuntu/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


Linux 拥有了新的行为准则，但是许多人都对此表示不满

这么好的译文竟然在页面内找到可点赞的地方？那手动点赞一下吧???????????????????

来自广东广州的 Chrome Mobile 67.0|Android 8.0 用户

>
> Linux 内核有了新的<ruby> 行为准则 <rt>  Code of Conduct </rt></ruby>(CoC)。但在这条行为准则被签署以及发布仅仅 30 分钟之后，Linus Torvalds 就暂时离开了 Linux 内核的开发工作。因为新行为准则的作者那富有争议的过去，现在这件事成为了热点话题。许多人都对这新的行为准则表示不满。
>
>
>

如果你还不了解这件事，请参阅 [Linus Torvalds 对于自己之前的不良态度致歉并开始休假，以改善自己的行为态度](/article-10022-1.html)

### Linux 内核开发遵守的新行为准则

Linux 内核开发者并不是以前没有需要遵守的行为准则，但是之前的[<ruby> 冲突准则 <rt>  code of conflict </rt></ruby>](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/CodeOfConflict?id=ddbd2b7ad99a418c60397901a0f3c997d030c65e)现在被替换成了以“给内核开发社区营造更加热情，更方便他人参与的氛围”为目的的行为准则。

>
> “为营造一个开放并且热情的社区环境，我们，贡献者与维护者，许诺让每一个参与进我们项目和社区的人享受一个没有骚扰的体验。无关于他们的年纪、体型、身体残疾、种族、性别、性别认知与表达、社会经验、教育水平、社会或者经济地位、国籍、外表、人种、信仰、性认同和性取向。”
>
>
>

你可以在这里阅读整篇行为准则：[Linux 行为准则](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a104f8b5867c682d994ffa7a74093c54469c11f)。

### Linus Torvalds 是被迫道歉并且休假的吗？

![Linus Torvalds 的道歉](/data/attachment/album/201810/16/122734pipmibdrptydzzi6.jpg)

这个新的行为准则由 Linus Torvalds 和 Greg Kroah-Hartman (仅次于 Torvalds 的二把手）签发。来自 Intel 的 Dan Williams 和来自 Facebook 的 Chris Mason 也是该准则的签署者之一。

如果我正确地解读了时间线，在签署这个行为准则的半小时之后，Torvalds [发送了一封邮件，对自己之前的不良态度致歉](https://lkml.org/lkml/2018/9/16/167)。他同时宣布会进行休假，以改善自己的行为态度。

不过有些人开始阅读这封邮件的话外之音，并对如下文字报以特别关注：

>
> **在这周，许多社区成员批评了我之前种种不解人意的行为。我以前在邮件里进行的，对他人轻率的批评是非专业以及不必要的**。这种情况在我将事情放在私人渠道处理的时候尤为严重。我理解这件事情的严重性，这是不好的行为，我对此感到十分抱歉。
>
>
>

他是否是因为新的行为准则被强迫做出道歉，并且决定休假，可以通过这几行来判断。这也可以让我们采取一些措施，避免 Torvalds 被新的行为准则伤害。

### 有关贡献者盟约作者 Coraline Ada Ehmke 的争议

Linux 的行为准则基于[<ruby> 贡献者盟约 <rt>  Contributor Convenant </rt></ruby>1.4 版本](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html)。贡献者盟约[被上百个开源项目所接纳](https://www.contributor-covenant.org/adopters)，包括 Eclipse、Angular、Ruby、Kubernetes 等项目。

贡献者盟约由 [Coraline Ada Ehmke](https://en.wikipedia.org/wiki/Coraline_Ada_Ehmke) 创作，她是一个软件工程师，开源支持者，以及 [LGBT](https://en.wikipedia.org/wiki/LGBT) 活动家。她对于促进开源世界的多样性做了显著的贡献。

Coraline 对于精英主义的反对立场同样十分鲜明。[<ruby> 精英主义 <rt>  meritocracy </rt></ruby>](https://en.wikipedia.org/wiki/Meritocracy)这个词语源自拉丁文，本意为系统内的进步取决于“精英”，例如智力水平、取得的证书以及教育程度。但[类似 Coraline 的活动家们认为](https://modelviewculture.com/pieces/the-dehumanizing-myth-of-the-meritocracy)唯才是用是个糟糕的体系，因为它只是通过人的智力产出来度量一个人，而并不重视他们的人性。

[![croraline meritocracy](/data/attachment/album/201810/16/122734dvg5as6ags6tss3t.jpg)](https://pbs.twimg.com/media/DnTTfi7XoAAdk08.jpg)

*图片来源：推特用户@nickmon1112*

[Linus Torvalds 不止一次地说到，他在意的只是代码而并非写代码的人](https://arstechnica.com/information-technology/2015/01/linus-torvalds-on-why-he-isnt-nice-i-dont-care-about-you/)。所以很明显，这忤逆了 Coraline 有关唯才是用体系的观点。

具体来说，Coraline 那被人关注饱受争议的过去，是一个关于 [Opal 项目](https://opalrb.com/)贡献者的事件。那是一个发生[在推特上的讨论](https://twitter.com/krainboltgreene/status/611569515315507200)，Elia，来自意大利的 Opal 项目核心开发者说“（那些变性人）不接受现实才是问题所在。”

Coraline 并没有参加讨论，也不是 Opal 项目的贡献者。不过作为 LGBT 活动家，她以 Elia 发表“冒犯变性人群体的发言”为由，[要求他退出 Opal 项目](https://github.com/opal/opal/issues/941)。 Coraline 和她的支持者——他们给这个项目做过贡献，通过在 GitHub 仓库平台上冗长且激烈的争论，试图将 Elia——此项目的核心开发者移出项目。

虽然 Elia 并没有离开这个项目，不过 Opal 项目的维护者同意实行一个行为准则。这个行为准则就是 Coraline 不停向维护者们宣扬的，她那著名的贡献者盟约。

不过故事到这里并没有结束。贡献者盟约稍后被更改，[加入了一些针对 Elia 的新条款](https://github.com/opal/opal/pull/948/commits/817321e27eccfffb3841f663815c17eecb8ef061#diff-a1ee87dafebc22cbd96979f1b2b7e837R11)。这些新条款将行为准则的管束范围扩展到公共领域。不过这些更改稍后[被维护者们标记为恶意篡改](https://github.com/opal/opal/pull/948#issuecomment-113486020)。最后 Opal 项目摆脱了贡献者盟约，并用自己的行为准则取而代之。

这个例子非常好的说明了，某些被冒犯的少数人群——哪怕他们并没有给这个项目做过一点贡献，是怎样试图去驱逐这个项目的核心开发者的。

### 人们对于 Linux 新的行为准则的以及 Torvalds 道歉的反映。

Linux 行为准则以及 Torvalds 的道歉一发布，社交媒体与论坛上就开始盛传种种谣言与[推测](https://www.reddit.com/r/linux/comments/9go8cp/linus_torvalds_daughter_has_signed_the/)。虽然很多人对新的行为准则感到满意，但仍有些人认为这是 [SJW 尝试渗透 Linux 社区](https://snew.github.io/r/linux/comments/9ghrrj/linuxs_new_coc_is_a_piece_of_shit/)的阴谋。（LCTT 译注：SJW——Social Justice Warrior 所谓“为社会正义而战的人”。）

Caroline 发布的一个富有嘲讽意味的推特让争论愈发激烈。

>
> 我迫不及待期待看到大批的人离开 Linux 社区的场景了。现在它已经被 SJW 的成员渗透了。哈哈哈哈。
>  [pic.twitter.com/eFeY6r4ENv](https://t.co/eFeY6r4ENv)
>
>
> — Coraline Ada Ehmke (@CoralineAda) [9 月 16 日, 2018](https://twitter.com/CoralineAda/status/1041441155874009093?ref_src=twsrc%5Etfw)
>
>
>

随着对于 Linux 行为准则的争论持续发酵，Carolaine 公开宣称贡献者盟约是一份政治文件。这并不能被那些试图将政治因素排除在开源项目之外的人所接收。

>
> 有些人说贡献者盟约是一份政治文件，他们说的没错。
>
>
> — Coraline Ada Ehmke (@CoralineAda) [9 月 16 日, 2018](https://twitter.com/CoralineAda/status/1041465346656530432?ref_src=twsrc%5Etfw)
>
>
>

Nick Monroe，一位自由记者，宣称 Linux 行为准则远没有表面上看上去那么简单。为了证明自己的观点，他挖掘出了 Coraline 的过去。如果您愿意，可以阅读以下材料。

>
> 好啦，你们已经看到过几千次了。这是一个行为准则。
>
>
> 它包含了社会认同的正义行为。<https://t.co/KuQqeriYeJ>
>
>
> 不过它或许没有看上去来的那么简单。[pic.twitter.com/8NUL2K1gu2](https://t.co/8NUL2K1gu2)
>
>
> — Nick Monroe (@nickmon1112) [9 月 17 日, 2018](https://twitter.com/nickmon1112/status/1041668315947708416?ref_src=twsrc%5Etfw)
>
>
>

Nick 并不是唯一一个反对 Linux 新的行为准则的人。[SJW](https://www.urbandictionary.com/define.php?term=SJW) 的参与引发了更多的阴谋论猜测。

>
> 我猜今天关于 Linux 的大新闻就是现在，Linux 内核被一个 “<ruby> 后精英政治 <rt>  post meritocracy </rt></ruby>” 世界观下的行为准则给掌控了。
>
>
> 这个行为准则的宗旨看起来不错。不过在实际操作中，它们通常被当作 SJW 分子攻击他们不喜之人的工具。况且，很多人都被 SJW 分子所厌恶。
>
>
> — Mark Kern (@Grummz) [September 17, 2018](https://twitter.com/Grummz/status/1041524170331287552?ref_src=twsrc%5Etfw)
>
>
>

虽然很多人对于 Torvalds 的道歉感到欣慰，仍有一些人在责备 Torvalds 的态度。

>
> 我是不是唯一一个认为 Linus Torvalds 这十几年来的态度恰好就是 Linux 和开源“社区”特有的那种，居高临下，粗鲁，鄙视一切新人的行为作风？反正作为一个新用户，我从来没有在 Linux 社区里感受到自己是受欢迎的。
>
>
> — Jonathan Frappier (@jfrappier) [9 月 17 日, 2018](https://twitter.com/jfrappier/status/1041486055038492674?ref_src=twsrc%5Etfw)
>
>
>

还有些人并不能接受 Torvalds 的道歉。

>
> 哦快看啊，一个喜欢辱骂他人的开源软件维护者，在十几年的恶行之后，终于承认了他的行为**可能**是不正确的。
>
>
> 我关注的那些人因为这件事都惊讶到平地摔，并且决定给他（Linus Torvalds）寄饼干来庆祝。
>
>
> — Kelly Ellis (@justkelly\_ok) [9 月 17 日, 2018](https://twitter.com/justkelly_ok/status/1041522269002985473?ref_src=twsrc%5Etfw)
>
>
>

Torvalds 的道歉引起了广泛关注 ;)

>
> 我现在要在我的个人档案里写上”我不知是否该原谅 Linus Torvalds“ 吗？
>
>
> — Verónica. (@maria\_fibonacci) [9 月 17 日, 2018](https://twitter.com/maria_fibonacci/status/1041538148121997313?ref_src=twsrc%5Etfw)
>
>
>

不继续开玩笑了。有关 Linus 道歉的关注是由 Sharp 挑起的。她因为“恶劣的社区环境”于 2015 年[退出了 Linux 内核的开发](https://www.networkworld.com/article/2988850/opensource-subnet/linux-kernel-dev-sarah-sharp-quits-citing-brutal-communications-style.html)。（LCTT 译注，Sarah Sharp 现在改名为“Sage Sharp”，并要求别人称其为“them”而不是“she”或“he”。）

>
> 现在我们要面对的问题是，这个成就了 Linus，给予他肆意辱骂特权的社区能否迎来改变。不仅仅是 Linus 个人，Linux 内核开发社区也急需改变。<https://t.co/EG5KO43416>
>
>
> — Sage Sharp (@sagesharp) [9 月 17 日, 2018](https://twitter.com/_sagesharp_/status/1041480963287539712?ref_src=twsrc%5Etfw)
>
>
>

### 你对于 Linux 行为准则怎么看？

如果你问我的观点，我认为目前社区的确是需要一个行为准则。它能指导人们尊重他人，不因为他人的种族、宗教信仰、国籍、政治观点（左派或者右派）而歧视，营造出一个积极向上的社区氛围。

对于这个事件，你怎么看？你认为这个行为准则能够帮助 Linux 内核的开发，或者说因为 SJW 成员们的加入，情况会变得更糟？

在 FOSS 里我们没有行为准则，不过我们都会持着文明友好的态度讨论问题。

---

via: <https://itsfoss.com/linux-code-of-conduct/>

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

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


如何在 Linux 中找到并删除重复文件

![](/data/attachment/album/201810/16/170704e7dhu41fqsrqkzf1.png)

在编辑或修改配置文件或旧文件前，我经常会把它们备份到硬盘的某个地方，因此我如果意外地改错了这些文件，我可以从备份中恢复它们。但问题是如果我忘记清理备份文件，一段时间之后，我的磁盘会被这些大量重复文件填满 —— 我觉得要么是懒得清理这些旧文件，要么是担心可能会删掉重要文件。如果你们像我一样，在类 Unix 操作系统中，大量多版本的相同文件放在不同的备份目录，你可以使用下面的工具找到并删除重复文件。

**提醒一句：**

在删除重复文件的时请尽量小心。如果你不小心，也许会导致[意外丢失数据](https://www.ostechnix.com/prevent-files-folders-accidental-deletion-modification-linux/)。我建议你在使用这些工具的时候要特别注意。

### 在 Linux 中找到并删除重复文件

出于本指南的目的，我将讨论下面的三个工具：

1. Rdfind
2. Fdupes
3. FSlint

这三个工具是自由开源的，且运行在大多数类 Unix 系统中。

#### 1. Rdfind

**Rdfind** 意即 **r**edundant **d**ata **find**（冗余数据查找），是一个通过访问目录和子目录来找出重复文件的自由开源的工具。它是基于文件内容而不是文件名来比较。Rdfind 使用**排序**算法来区分原始文件和重复文件。如果你有两个或者更多的相同文件，Rdfind 会很智能的找到原始文件并认定剩下的文件为重复文件。一旦找到副本文件，它会向你报告。你可以决定是删除还是使用[硬链接或者符号（软）链接](https://www.ostechnix.com/explaining-soft-link-and-hard-link-in-linux-with-examples/)代替它们。

**安装 Rdfind**

Rdfind 存在于 [AUR](https://aur.archlinux.org/packages/rdfind/) 中。因此，在基于 Arch 的系统中，你可以像下面一样使用任一如 [Yay](https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/) AUR 程序助手安装它。

```
$ yay -S rdfind
```

在 Debian、Ubuntu、Linux Mint 上：

```
$ sudo apt-get install rdfind
```

在 Fedora 上：

```
$ sudo dnf install rdfind
```

在 RHEL、CentOS 上：

```
$ sudo yum install epel-release
$ sudo yum install rdfind
```

**用法**

一旦安装完成，仅带上目录路径运行 Rdfind 命令就可以扫描重复文件。

```
$ rdfind ~/Downloads
```

![](/data/attachment/album/201810/16/170705e3dr7l37atsabsci.png)

正如你看到上面的截屏，Rdfind 命令将扫描 `~/Downloads` 目录，并将结果存储到当前工作目录下一个名为 `results.txt` 的文件中。你可以在 `results.txt` 文件中看到可能是重复文件的名字。

```
$ cat results.txt
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1469 8 9 2050 15864884 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test5.regex
DUPTYPE_WITHIN_SAME_TREE -1469 8 9 2050 15864886 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test6.regex
[...]
DUPTYPE_FIRST_OCCURRENCE 13 0 403635 2050 15740257 1 /home/sk/Downloads/Hyperledger(1).pdf
DUPTYPE_WITHIN_SAME_TREE -13 0 403635 2050 15741071 1 /home/sk/Downloads/Hyperledger.pdf
# end of file

```

通过检查 `results.txt` 文件，你可以很容易的找到那些重复文件。如果愿意你可以手动的删除它们。

此外，你可在不修改其他事情情况下使用 `-dryrun` 选项找出所有重复文件，并在终端上输出汇总信息。

```
$ rdfind -dryrun true ~/Downloads
```

一旦找到重复文件，你可以使用硬链接或符号链接代替他们。

使用硬链接代替所有重复文件，运行：

```
$ rdfind -makehardlinks true ~/Downloads
```

使用符号链接/软链接代替所有重复文件，运行：

```
$ rdfind -makesymlinks true ~/Downloads
```

目录中有一些空文件，也许你想忽略他们，你可以像下面一样使用 `-ignoreempty` 选项：

```
$ rdfind -ignoreempty true ~/Downloads
```

如果你不再想要这些旧文件，删除重复文件，而不是使用硬链接或软链接代替它们。

删除重复文件，就运行：

```
$ rdfind -deleteduplicates true ~/Downloads
```

如果你不想忽略空文件，并且和所哟重复文件一起删除。运行：

```
$ rdfind -deleteduplicates true -ignoreempty false ~/Downloads
```

更多细节，参照帮助部分：

```
$ rdfind --help
```

手册页：

```
$ man rdfind
```

#### 2. Fdupes

**Fdupes** 是另一个在指定目录以及子目录中识别和移除重复文件的命令行工具。这是一个使用 C 语言编写的自由开源工具。Fdupes 通过对比文件大小、部分 MD5 签名、全部 MD5 签名，最后执行逐个字节对比校验来识别重复文件。

与 Rdfind 工具类似，Fdupes 附带非常少的选项来执行操作，如：

* 在目录和子目录中递归的搜索重复文件
* 从计算中排除空文件和隐藏文件
* 显示重复文件大小
* 出现重复文件时立即删除
* 使用不同的拥有者/组或权限位来排除重复文件
* 更多

**安装 Fdupes**

Fdupes 存在于大多数 Linux 发行版的默认仓库中。

在 Arch Linux 和它的变种如 Antergos、Manjaro Linux 上，如下使用 Pacman 安装它。

```
$ sudo pacman -S fdupes
```

在 Debian、Ubuntu、Linux Mint 上:

```
$ sudo apt-get install fdupes
```

在 Fedora 上：

```
$ sudo dnf install fdupes
```

在 RHEL、CentOS 上：

```
$ sudo yum install epel-release
$ sudo yum install fdupes
```

**用法**

Fdupes 用法非常简单。仅运行下面的命令就可以在目录中找到重复文件，如：`~/Downloads`。

```
$ fdupes ~/Downloads
```

我系统中的样例输出：

```
/home/sk/Downloads/Hyperledger.pdf
/home/sk/Downloads/Hyperledger(1).pdf
```

你可以看到，在 `/home/sk/Downloads/` 目录下有一个重复文件。它仅显示了父级目录中的重复文件。如何显示子目录中的重复文件？像下面一样，使用 `-r` 选项。

```
$ fdupes -r ~/Downloads
```

现在你将看到 `/home/sk/Downloads/` 目录以及子目录中的重复文件。

Fdupes 也可用来从多个目录中迅速查找重复文件。

```
$ fdupes ~/Downloads ~/Documents/ostechnix
```

你甚至可以搜索多个目录，递归搜索其中一个目录，如下：

```
$ fdupes ~/Downloads -r ~/Documents/ostechnix
```

上面的命令将搜索 `~/Downloads` 目录，`~/Documents/ostechnix` 目录和它的子目录中的重复文件。

有时，你可能想要知道一个目录中重复文件的大小。你可以使用 `-S` 选项，如下：

```
$ fdupes -S ~/Downloads
403635 bytes each:
/home/sk/Downloads/Hyperledger.pdf
/home/sk/Downloads/Hyperledger(1).pdf
```

类似的，为了显示父目录和子目录中重复文件的大小，使用 `-Sr` 选项。

我们可以在计算时分别使用 `-n` 和 `-A` 选项排除空白文件以及排除隐藏文件。

```
$ fdupes -n ~/Downloads
$ fdupes -A ~/Downloads
```

在搜索指定目录的重复文件时，第一个命令将排除零长度文件，后面的命令将排除隐藏文件。

汇总重复文件信息，使用 `-m` 选项。

```
$ fdupes -m ~/Downloads
1 duplicate files (in 1 sets), occupying 403.6 kilobytes
```

删除所有重复文件，使用 `-d` 选项。

```
$ fdupes -d ~/Downloads
```

样例输出：

```
[1] /home/sk/Downloads/Hyperledger Fabric Installation.pdf
[2] /home/sk/Downloads/Hyperledger Fabric Installation(1).pdf

Set 1 of 1, preserve files [1 - 2, all]:
```

这个命令将提示你保留还是删除所有其他重复文件。输入任一号码保留相应的文件，并删除剩下的文件。当使用这个选项的时候需要更加注意。如果不小心，你可能会删除原文件。

如果你想要每次保留每个重复文件集合的第一个文件，且无提示的删除其他文件，使用 `-dN` 选项（不推荐）。

```
$ fdupes -dN ~/Downloads
```

当遇到重复文件时删除它们，使用 `-I` 标志。

```
$ fdupes -I ~/Downloads
```

关于 Fdupes 的更多细节，查看帮助部分和 man 页面。

```
$ fdupes --help
$ man fdupes
```

#### 3. FSlint

**FSlint** 是另外一个查找重复文件的工具，有时我用它去掉 Linux 系统中不需要的重复文件并释放磁盘空间。不像另外两个工具，FSlint 有 GUI 和 CLI 两种模式。因此对于新手来说它更友好。FSlint 不仅仅找出重复文件，也找出坏符号链接、坏名字文件、临时文件、坏的用户 ID、空目录和非精简的二进制文件等等。

**安装 FSlint**

FSlint 存在于 [AUR](https://aur.archlinux.org/packages/fslint/)，因此你可以使用任一 AUR 助手安装它。

```
$ yay -S fslint
```

在 Debian、Ubuntu、Linux Mint 上：

```
$ sudo apt-get install fslint
```

在 Fedora 上：

```
$ sudo dnf install fslint
```

在 RHEL，CentOS 上：

```
$ sudo yum install epel-release
$ sudo yum install fslint
```

一旦安装完成，从菜单或者应用程序启动器启动它。

FSlint GUI 展示如下：

![](/data/attachment/album/201810/16/170706vy0opgozoi3ycypg.png)

如你所见，FSlint 界面友好、一目了然。在 “Search path” 栏，添加你要扫描的目录路径，点击左下角 “Find” 按钮查找重复文件。验证递归选项可以在目录和子目录中递归的搜索重复文件。FSlint 将快速的扫描给定的目录并列出重复文件。

![](/data/attachment/album/201810/16/170707dfqw80zq8o8e819h.png)

从列表中选择那些要清理的重复文件，也可以选择 “Save”、“Delete”、“Merge” 和 “Symlink” 操作他们。

在 “Advanced search parameters” 栏，你可以在搜索重复文件的时候指定排除的路径。

![](/data/attachment/album/201810/16/170709p5105l91u185dlce.png)

**FSlint 命令行选项**

FSlint 提供下面的 CLI 工具集在你的文件系统中查找重复文件。

* `findup` — 查找重复文件
* `findnl` — 查找名称规范（有问题的文件名）
* `findu8` — 查找非法的 utf8 编码的文件名
* `findbl` — 查找坏链接（有问题的符号链接）
* `findsn` — 查找同名文件（可能有冲突的文件名）
* `finded` — 查找空目录
* `findid` — 查找死用户的文件
* `findns` — 查找非精简的可执行文件
* `findrs` — 查找文件名中多余的空白
* `findtf` — 查找临时文件
* `findul` — 查找可能未使用的库
* `zipdir` — 回收 ext2 目录项下浪费的空间

所有这些工具位于 `/usr/share/fslint/fslint/fslint` 下面。

例如，在给定的目录中查找重复文件，运行：

```
$ /usr/share/fslint/fslint/findup ~/Downloads/
```

类似的，找出空目录命令是：

```
$ /usr/share/fslint/fslint/finded ~/Downloads/
```

获取每个工具更多细节，例如：`findup`，运行：

```
$ /usr/share/fslint/fslint/findup --help
```

关于 FSlint 的更多细节，参照帮助部分和 man 页。

```
$ /usr/share/fslint/fslint/fslint --help
$ man fslint
```

##### 总结

现在你知道在 Linux 中，使用三个工具来查找和删除不需要的重复文件。这三个工具中，我经常使用 Rdfind。这并不意味着其他的两个工具效率低下，因为到目前为止我更喜欢 Rdfind。好了，到你了。你的最喜欢哪一个工具呢？为什么？在下面的评论区留言让我们知道吧。

就到这里吧。希望这篇文章对你有帮助。更多的好东西就要来了，敬请期待。

谢谢！

---

via: <https://www.ostechnix.com/how-to-find-and-delete-duplicate-files-in-linux/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[pygmalion666](https://github.com/pygmalion666) 校对：[wxy](https://github.com/wxy)

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


什么是行为驱动的 Python？

>
> 使用 Python behave 框架的行为驱动开发模式可以帮助你的团队更好的协作和测试自动化。
>
>
>

![](/data/attachment/album/201810/16/182736st3x3b2gt8ct23ry.jpeg)

您是否听说过<ruby> <a href="https://automationpanda.com/bdd/">  行为驱动开发 </a> <rt>  behavior-driven development </rt></ruby>（BDD），并好奇这是个什么东西？也许你发现了团队成员在谈论“嫩瓜”（LCTT 译注：“<ruby> 嫩瓜 <rt>  gherkin </rt></ruby>” 是一种简单的英语文本语言，工具 cucumber 通过解释它来执行测试脚本，见下文），而你却不知所云。或许你是一个 <ruby> Python 人 <rt>  Pythonista </rt></ruby>，正在寻找更好的方法来测试你的代码。 无论在什么情况下，了解 BDD 都可以帮助您和您的团队实现更好的协作和测试自动化，而 Python 的 [behave](https://behave.readthedocs.io/en/latest/) 框架是一个很好的起点。

### 什么是 BDD？

在软件中，*行为*是指在明确定义的输入、动作和结果场景中功能是如何运转的。 产品可以表现出无数的行为，例如：

* 在网站上提交表单
* 搜索想要的结果
* 保存文档
* 进行 REST API 调用
* 运行命令行界面命令

根据产品的行为定义产品的功能可以更容易地描述产品，并对其进行开发和测试。 BDD 的核心是：使行为成为软件开发的焦点。在开发早期使用示例语言的规范来定义行为。最常见的行为规范语言之一是 Gherkin，Cucumber项目中的Given-When-Then场景格式。 行为规范基本上是对行为如何工作的简单语言描述，具有一致性和焦点的一些正式结构。 通过将步骤文本“粘合”到代码实现，测试框架可以轻松地自动化这些行为规范。

下面是用Gherkin编写的行为规范的示例：

根据产品的行为定义产品的功能可以更容易地描述产品，开发产品并对其进行测试。 这是BDD的核心：使行为成为软件开发的焦点。 在开发早期使用[示例规范](https://en.wikipedia.org/wiki/Specification_by_example)的语言来定义行为。 最常见的行为规范语言之一是[Gherkin](https://automationpanda.com/2017/01/26/bdd-101-the-gherkin-language/)，来自 [Cucumber](https://cucumber.io/) 项目中的 Given-When-Then 场景格式。 行为规范基本上是对行为如何工作的简单语言描述，具有一致性和聚焦点的一些正式结构。 通过将步骤文本“粘合”到代码实现，测试框架可以轻松地自动化这些行为规范。

下面是用 Gherkin 编写的行为规范的示例：

```
Scenario: Basic DuckDuckGo Search
  Given the DuckDuckGo home page is displayed
  When the user searches for "panda"
  Then results are shown for "panda"
```

快速浏览一下，行为是直观易懂的。 除少数关键字外，该语言为自由格式。 场景简洁而有意义。 一个真实的例子说明了这种行为。 步骤以声明的方式表明应该发生什么——而不会陷入如何如何的细节中。

[BDD 的主要优点](https://automationpanda.com/2017/02/13/12-awesome-benefits-of-bdd/)是良好的协作和自动化。 每个人都可以为行为开发做出贡献，而不仅仅是程序员。从流程开始就定义并理解预期的行为。测试可以与它们涵盖的功能一起自动化。每个测试都包含一个单一的、独特的行为，以避免重复。最后，现有的步骤可以通过新的行为规范重用，从而产生雪球效果。

### Python 的 behave 框架

behave 是 Python 中最流行的 BDD 框架之一。 它与其他基于 Gherkin 的 Cucumber 框架非常相似，尽管没有得到官方的 Cucumber 定名。 behave 有两个主要层：

1. 用 Gherkin 的 `.feature` 文件编写的行为规范
2. 用 Python 模块编写的步骤定义和钩子，用于实现 Gherkin 步骤

如上例所示，Gherkin 场景有三部分格式：

1. 鉴于（Given）一些初始状态
2. 每当（When）行为发生时
3. 然后（Then）验证结果

当 behave 运行测试时，每个步骤由装饰器“粘合”到 Python 函数。

### 安装

作为先决条件，请确保在你的计算机上安装了 Python 和 `pip`。 我强烈建议使用 Python 3.（我还建议使用 [pipenv](https://docs.pipenv.org/)，但以下示例命令使用更基本的 `pip`。）

behave 框架只需要一个包：

```
pip install behave
```

其他包也可能有用，例如：

```
pip install requests    # 用于调用 REST API
pip install selenium    # 用于 web 浏览器交互
```

GitHub 上的 [behavior-driven-Python](https://github.com/AndyLPK247/behavior-driven-python) 项目包含本文中使用的示例。

### Gherkin 特点

behave 框架使用的 Gherkin 语法实际上是符合官方的 Cucumber Gherkin 标准的。`.feature` 文件包含了功能（`Feature`）部分，而场景部分又包含具有 Given-When-Then 步骤的场景（`Scenario`） 部分。 以下是一个例子：

```
Feature: Cucumber Basket
  As a gardener,
  I want to carry many cucumbers in a basket,
  So that I don’t drop them all.

  @cucumber-basket
  Scenario: Add and remove cucumbers
    Given the basket is empty
    When "4" cucumbers are added to the basket
    And "6" more cucumbers are added to the basket
    But "3" cucumbers are removed from the basket
    Then the basket contains "7" cucumbers
```

这里有一些重要的事情需要注意：

* `Feature` 和 `Scenario` 部分都有[简短的描述性标题](https://automationpanda.com/2018/01/31/good-gherkin-scenario-titles/)。
* 紧跟在 `Feature` 标题后面的行是会被 behave 框架忽略掉的注释。将功能描述放在那里是一种很好的做法。
* `Scenario` 和 `Feature` 可以有标签（注意 `@cucumber-basket` 标记）用于钩子和过滤（如下所述）。
* 步骤都遵循[严格的 Given-When-Then 顺序](https://automationpanda.com/2018/02/03/are-gherkin-scenarios-with-multiple-when-then-pairs-okay/)。
* 使用 `And` 和 `But` 可以为任何类型添加附加步骤。
* 可以使用输入对步骤进行参数化——注意双引号里的值。

通过使用场景大纲（`Scenario Outline`），场景也可以写为具有多个输入组合的模板：

```
Feature: Cucumber Basket

  @cucumber-basket
  Scenario Outline: Add cucumbers
    Given the basket has “<initial>” cucumbers
    When "<more>" cucumbers are added to the basket
    Then the basket contains "<total>" cucumbers

    Examples: Cucumber Counts
      | initial | more | total |
      |    0    |   1  |   1   |
      |    1    |   2  |   3   |
      |    5    |   4  |   9   |
```

场景大纲总是有一个示例（`Examples`）表，其中第一行给出列标题，后续每一行给出一个输入组合。 只要列标题出现在由尖括号括起的步骤中，行值就会被替换。 在上面的示例中，场景将运行三次，因为有三行输入组合。 场景大纲是避免重复场景的好方法。

Gherkin 语言还有其他元素，但这些是主要的机制。 想了解更多信息，请阅读 Automation Panda 这个网站的文章 [Gherkin by Example](https://automationpanda.com/2017/01/27/bdd-101-gherkin-by-example/) 和 [Writing Good Gherkin](https://automationpanda.com/2017/01/30/bdd-101-writing-good-gherkin/)。

### Python 机制

每个 Gherkin 步骤必须“粘合”到步骤定义——即提供了实现的 Python 函数。 每个函数都有一个带有匹配字符串的步骤类型装饰器。它还接收共享的上下文和任何步骤参数。功能文件必须放在名为 `features/` 的目录中，而步骤定义模块必须放在名为 `features/steps/` 的目录中。 任何功能文件都可以使用任何模块中的步骤定义——它们不需要具有相同的名称。 下面是一个示例 Python 模块，其中包含 cucumber basket 功能的步骤定义。

```
from behave import *
from cucumbers.basket import CucumberBasket

@given('the basket has "{initial:d}" cucumbers')
def step_impl(context, initial):
    context.basket = CucumberBasket(initial_count=initial)

@when('"{some:d}" cucumbers are added to the basket')
def step_impl(context, some):
    context.basket.add(some)

@then('the basket contains "{total:d}" cucumbers')
def step_impl(context, total):
    assert context.basket.count == total
```

可以使用三个[步骤匹配器](http://behave.readthedocs.io/en/latest/api.html#step-parameters)：`parse`、`cfparse` 和 `re`。默认的，也是最简单的匹配器是 `parse`，如上例所示。注意如何解析参数化值并将其作为输入参数传递给函数。一个常见的最佳实践是在步骤中给参数加双引号。

每个步骤定义函数还接收一个[上下文](http://behave.readthedocs.io/en/latest/api.html#detecting-that-user-code-overwrites-behave-context-attributes)变量，该变量保存当前正在运行的场景的数据，例如 `feature`、`scenario` 和 `tags` 字段。也可以添加自定义字段，用于在步骤之间共享数据。始终使用上下文来共享数据——永远不要使用全局变量！

behave 框架还支持[钩子](http://behave.readthedocs.io/en/latest/api.html#environment-file-functions)来处理 Gherkin 步骤之外的自动化问题。钩子是一个将在步骤、场景、功能或整个测试套件之前或之后运行的功能。钩子让人联想到[面向方面的编程](https://en.wikipedia.org/wiki/Aspect-oriented_programming)。它们应放在 `features/` 目录下的特殊 `environment.py` 文件中。钩子函数也可以检查当前场景的标签，因此可以有选择地应用逻辑。下面的示例显示了如何使用钩子为标记为 `@web` 的任何场景生成和销毁一个 Selenium WebDriver 实例。

```
from selenium import webdriver

def before_scenario(context, scenario):
    if 'web' in context.tags:
        context.browser = webdriver.Firefox()
        context.browser.implicitly_wait(10)

def after_scenario(context, scenario):
    if 'web' in context.tags:
        context.browser.quit()
```

注意：也可以使用 [fixtures](http://behave.readthedocs.io/en/latest/api.html#fixtures) 进行构建和清理。

要了解一个 behave 项目应该是什么样子，这里是示例项目的目录结构：

![](/data/attachment/album/201810/16/182747xm6659k1zco7yoxf.png)

任何 Python 包和自定义模块都可以与 behave 框架一起使用。 使用良好的设计模式构建可扩展的测试自动化解决方案。步骤定义代码应简明扼要。

### 运行测试

要从命令行运行测试，请切换到项目的根目录并运行 behave 命令。 使用 `-help` 选项查看所有可用选项。

以下是一些常见用例：

```
# run all tests
behave

# run the scenarios in a feature file
behave features/web.feature

# run all tests that have the @duckduckgo tag
behave --tags @duckduckgo

# run all tests that do not have the @unit tag
behave --tags ~@unit

# run all tests that have @basket and either @add or @remove
behave --tags @basket --tags @add,@remove
```

为方便起见，选项可以保存在 [config](http://behave.readthedocs.io/en/latest/behave.html#configuration-files) 文件中。

### 其他选择

behave 不是 Python 中唯一的 BDD 测试框架。其他好的框架包括：

* pytest-bdd，是 pytest 的插件，和 behave 一样，它使用 Gherkin 功能文件和步骤定义模块，但它也利用了 pytest 的所有功能和插件。例如，它可以使用 pytest-xdist 并行运行 Gherkin 场景。 BDD 和非 BDD 测试也可以与相同的过滤器一起执行。pytest-bdd 还提供更灵活的目录布局。
* radish 是一个 “Gherkin 增强版”框架——它将场景循环和前提条件添加到标准的 Gherkin 语言中，这使得它对程序员更友好。它还像 behave 一样提供了丰富的命令行选项。
* lettuce 是一种较旧的 BDD 框架，与 behave 非常相似，在框架机制方面存在细微差别。然而，GitHub 最近显示该项目的活动很少（截至2018 年 5 月）。

任何这些框架都是不错的选择。

另外，请记住，Python 测试框架可用于任何黑盒测试，即使对于非 Python 产品也是如此！ BDD 框架非常适合 Web 和服务测试，因为它们的测试是声明性的，而 Python 是一种[很好的测试自动化语言](https://automationpanda.com/2017/01/21/the-best-programming-language-for-test-automation/)。

本文基于作者的 [PyCon Cleveland 2018](https://us.pycon.org/2018/) 演讲“[行为驱动的Python](https://us.pycon.org/2018/schedule/presentation/87/)”。

---

via: <https://opensource.com/article/18/5/behavior-driven-python>

作者：[Andrew Knight](https://opensource.com/users/andylpk247) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Flowsnow](https://github.com/Flowsnow) 校对：[wxy](https://github.com/wxy)

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


Minikube 入门：笔记本上的 Kubernetes

Summary: 运行 Minikube 的分步指南。

运行 Minikube 的分步指南。

>
> 运行 Minikube 的分步指南。
>
>
>

![](/data/attachment/album/201810/17/214443rikxkirgmv4eti41.png)

在 [Hello Minikube](https://kubernetes.io/docs/tutorials/hello-minikube) 教程页面上 Minikube 被宣传为基于 Docker 运行 Kubernetes 的一种简单方法。 虽然该文档非常有用，但它主要是为 MacOS 编写的。 你可以深入挖掘在 Windows 或某个 Linux 发行版上的使用说明，但它们不是很清楚。 许多文档都是针对 Debian / Ubuntu 用户的，比如[安装 Minikube 的驱动程序](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md)。

这篇指南旨在使得在基于 RHEL/Fedora/CentOS 的操作系统上更容易安装 Minikube。

### 先决条件

1. 你已经[安装了 Docker](https://docs.docker.com/install)。
2. 你的计算机是一个基于 RHEL / CentOS / Fedora 的工作站。
3. 你已经[安装了正常运行的 KVM2 虚拟机管理程序](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#kvm2-driver)。
4. 你有一个可以工作的 docker-machine-driver-kvm2。 以下命令将安装该驱动程序：

```
curl -Lo docker-machine-driver-kvm2 https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 \
chmod +x docker-machine-driver-kvm2 \
&& sudo cp docker-machine-driver-kvm2 /usr/local/bin/ \
&& rm docker-machine-driver-kvm2
```

### 下载、安装和启动Minikube

1、为你要即将下载的两个文件创建一个目录，两个文件分别是：[minikube](https://github.com/kubernetes/minikube/releases) 和 [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-using-curl)。

2、打开终端窗口并运行以下命令来安装 minikube。

```
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
```

请注意，minikube 版本（例如，minikube-linux-amd64）可能因计算机的规格而有所不同。

3、`chmod` 加执行权限。

```
chmod +x minikube
```

4、将文件移动到 `/usr/local/bin` 路径下，以便你能将其作为命令运行。

```
mv minikube /usr/local/bin
```

5、使用以下命令安装 `kubectl`（类似于 minikube 的安装过程）。

```
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
```

使用 `curl` 命令确定最新版本的Kubernetes。

6、`chmod` 给 `kubectl` 加执行权限。

```
chmod +x kubectl
```

7、将 `kubectl` 移动到 `/usr/local/bin` 路径下作为命令运行。

```
mv kubectl /usr/local/bin
```

8、 运行 `minikube start` 命令。 为此，你需要有虚拟机管理程序。 我使用过 KVM2，你也可以使用 Virtualbox。 确保是以普通用户而不是 root 身份运行以下命令，以便为用户而不是 root 存储配置。

```
minikube start --vm-driver=kvm2
```

这可能需要一段时间，等一会。

9、 Minikube 应该下载并启动。 使用以下命令确保成功。

```
cat ~/.kube/config
```

10、 执行以下命令以运行 Minikube 作为上下文环境。 上下文环境决定了 `kubectl` 与哪个集群交互。 你可以在 `~/.kube/config` 文件中查看所有可用的上下文环境。

```
kubectl config use-context minikube
```

11、再次查看 `config` 文件以检查 Minikube 是否存在上下文环境。

```
cat ~/.kube/config
```

12、最后，运行以下命令打开浏览器查看 Kubernetes 仪表板。

```
minikube dashboard
```

现在 Minikube 已启动并运行，请阅读[通过 Minikube 在本地运行 Kubernetes](https://kubernetes.io/docs/setup/minikube) 这篇官网教程开始使用它。

---

via: <https://opensource.com/article/18/10/getting-started-minikube>

作者：[Bryant Son](https://opensource.com/users/brson) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Flowsnow](https://github.com/Flowsnow) 校对：[wxy](https://github.com/wxy)

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


树莓派自建 NAS 云盘之——云盘构建

Summary: 用自行托管的树莓派 NAS 云盘来保护数据的安全！

ERROR: Site 001-nextcloud does not exist!<br />
这个是怎么回事

用自行托管的树莓派 NAS 云盘来保护数据的安全！

>
> 用自行托管的树莓派 NAS 云盘来保护数据的安全！
>
>
>

![](/data/attachment/album/201810/17/231845lcxls9emctcc6mbz.jpg)

在前面两篇文章中，我们讨论了用树莓派搭建一个 NAS 云盘所需要的一些 [软硬件环境及其操作步骤](/article-10104-1.html?utm_source=index&utm_medium=more)。我们还制定了适当的 [备份策略](/article-10112-1.html) 来保护 NAS 上的数据。本文中，我们将介绍讨论利用 [Nestcloud](https://nextcloud.com/) 来方便快捷的存储、获取以及分享你的数据。

![](/data/attachment/album/201810/17/231935uowcp6sfh2jezhpz.png)

### 必要的准备工作

想要方便的使用 Nextcloud，需要一些必要的准备工作。首先，你需要一个指向 Nextcloud 的域名。方便起见，本文将使用 **nextcloud.pi-nas.com** 。如果你是在家庭网络里运行，你需要为该域名配置 DNS 服务（动态域名解析服务）并在路由器中开启 80 端口和 443 端口转发功能（如果需要使用 https，则需要开启 443 端口转发，如果只用 http，80 端口足以）。

你可以使用 [ddclient](https://sourceforge.net/p/ddclient/wiki/Home/) 在树莓派中自动更新 DNS。

### 安装 Nextcloud

为了在树莓派（参考 [第一篇](/article-10104-1.html?utm_source=index&utm_medium=more) 中步骤设置）中运行 Nextcloud，首先用命令 `apt` 安装 以下的一些依赖软件包。

```
sudo apt install unzip wget php apache2 mysql-server php-zip php-mysql php-dom php-mbstring php-gd php-curl
```

其次，下载 Nextcloud。在树莓派中利用 `wget` 下载其 [最新的版本](https://nextcloud.com/install/#instructions-server)。在 [第一篇](/article-10104-1.html?utm_source=index&utm_medium=more) 文章中，我们将两个磁盘驱动器连接到树莓派，一个用于存储当前数据，另一个用于备份。这里在数据存储盘上安装 Nextcloud，以确保每晚自动备份数据。

```
sudo mkdir -p /nas/data/nextcloud
sudo chown pi /nas/data/nextcloud
cd /nas/data/
wget https://download.nextcloud.com/server/releases/nextcloud-14.0.0.zip -O /nas/data/nextcloud.zip
unzip nextcloud.zip
sudo ln -s /nas/data/nextcloud /var/www/nextcloud
sudo chown -R www-data:www-data /nas/data/nextcloud
```

截止到写作本文时，Nextcloud 最新版更新到如上述代码中所示的 14.0.0 版本。Nextcloud 正在快速的迭代更新中，所以你可以在你的树莓派中安装更新一点的版本。

### 配置数据库

如上所述，Nextcloud 安装完毕。之前安装依赖软件包时就已经安装了 MySQL 数据库来存储 Nextcloud 的一些重要数据（例如，那些你创建的可以访问 Nextcloud 的用户的信息）。如果你更愿意使用 Pstgres 数据库，则上面的依赖软件包需要做一些调整。

以 root 权限启动 MySQL：

```
sudo mysql
```

这将会打开 SQL 提示符界面，在那里可以插入如下指令——使用数据库连接密码替换其中的占位符——为 Nextcloud 创建一个数据库。

```
CREATE USER nextcloud IDENTIFIED BY '<这里插入密码>';
CREATE DATABASE nextcloud;
GRANT ALL ON nextcloud.* TO nextcloud;
```

按 `Ctrl+D` 或输入 `quit` 退出 SQL 提示符界面。

### Web 服务器配置

Nextcloud 可以配置以适配于 Nginx 服务器或者其他 Web 服务器运行的环境。但本文中，我决定在我的树莓派 NAS 中运行 Apache 服务器（如果你有其他效果更好的服务器选择方案，不妨也跟我分享一下）。

首先为你的 Nextcloud 域名创建一个虚拟主机，创建配置文件 `/etc/apache2/sites-available/001-netxcloud.conf`，在其中输入下面的参数内容。修改其中 `ServerName` 为你的域名。

```
<VirtualHost *:80>
ServerName nextcloud.pi-nas.com
ServerAdmin admin@pi-nas.com
DocumentRoot /var/www/nextcloud/

<Directory /var/www/nextcloud/>
AllowOverride None
</Directory>
</VirtualHost>
```

使用下面的命令来启动该虚拟主机。

```
a2ensite 001-nextcloud
sudo systemctl reload apache2
```

现在，你应该可以通过浏览器中输入域名访问到 web 服务器了。这里我推荐使用 HTTPS 协议而不是 HTTP 协议来访问 Nextcloud。一个简单而且免费的方法就是利用 [Certbot](https://certbot.eff.org/) 下载 [Let’s Encrypt](https://letsencrypt.org/) 证书，然后设置定时任务自动刷新。这样就避免了自签证书等的麻烦。参考 [如何在树莓派中安装](https://certbot.eff.org/lets-encrypt/debianother-apache) Certbot 。在配置 Certbot 的时候，你甚至可以配置将 HTTP 自动转到 HTTPS ，例如访问 `http://nextcloud.pi-nas.com` 自动跳转到 `https://nextcloud.pi-nas.com`。注意，如果你的树莓派 NAS 运行在家庭路由器的下面，别忘了设置路由器的 443 端口和 80 端口转发。

### 配置 Nextcloud

最后一步，通过浏览器访问 Nextcloud 来配置它。在浏览器中输入域名地址，插入上文中的数据库设置信息。这里，你可以创建 Nextcloud 管理员用户。默认情况下，数据保存目录在在 Nextcloud 目录下，所以你也无需修改我们在 [第二篇](/article-10112-1.html) 一文中设置的备份策略。

然后，页面会跳转到 Nextcloud 登陆界面，用刚才创建的管理员用户登陆。在设置页面中会有基础操作教程和安全安装教程（这里是访问 `https://nextcloud.pi-nas.com/settings/admin`）。

恭喜你，到此为止，你已经成功在树莓派中安装了你自己的云 Nextcloud。去 Nextcloud 主页 [下载 Nextcloud 客户端](https://nextcloud.com/install/#install-clients)，客户端可以同步数据并且离线访问服务器。移动端甚至可以上传图片等资源，然后电脑桌面都可以去访问它们。

---

via: <https://opensource.com/article/18/9/host-cloud-nas-raspberry-pi>

作者：[Manuel Dewald](https://opensource.com/users/ntlx) 选题：[lujun9972](https://github.com/lujun9972) 译者：[jrg](https://github.com/jrglinux) 校对：[wxy](https://github.com/wxy)

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


三个开源的分布式追踪工具

Summary: 这几个工具对复杂软件系统中的实时事件做了可视化，能帮助你快速发现性能问题。

这几个工具对复杂软件系统中的实时事件做了可视化，能帮助你快速发现性能问题。

>
> 这几个工具对复杂软件系统中的实时事件做了可视化，能帮助你快速发现性能问题。
>
>
>

![](/data/attachment/album/201810/18/000511wi277hjm2vmo4oah.png)

分布式追踪系统能够从头到尾地追踪跨越了多个应用、服务、数据库以及像代理这样的中间件的分布式软件的请求。它能帮助你更深入地理解系统中到底发生了什么。追踪系统以图形化的方式，展示出每个已知步骤以及某个请求在每个步骤上的耗时。

用户可以通过这些展示来判断系统的哪个环节有延迟或阻塞，当请求失败时，运维和开发人员可以看到准确的问题源头，而不需要去测试整个系统，比如用二叉查找树的方法去定位问题。在开发迭代的过程中，追踪系统还能够展示出可能引起性能变化的环节。通过异常行为的警告自动地感知到性能的退化，总是比客户告诉你要好。

这种追踪是怎么工作的呢？给每个请求分配一个特殊 ID，这个 ID 通常会插入到请求头部中。它唯一标识了对应的事务。一般把事务叫做<ruby> 踪迹 <rt>  trace </rt></ruby>，“踪迹”是整个事务的抽象概念。每一个“踪迹”由<ruby> 单元 <rt>  span </rt></ruby>组成，“单元”代表着一次请求中真正执行的操作，比如一次服务调用，一次数据库请求等。每一个“单元”也有自己唯一的 ID。“单元”之下也可以创建子“单元”，子“单元”可以有多个父“单元”。

当一次事务（或者说踪迹）运行过之后，就可以在追踪系统的表示层上搜索了。有几个工具可以用作表示层，我们下文会讨论，不过，我们先看下面的图，它是我在 [Istio walkthrough](https://www.youtube.com/watch?v=T8BbeqZ0Rls) 视频教程中提到的 [Jaeger](https://www.jaegertracing.io/) 界面，展示了单个踪迹中的多个单元。很明显，这个图能让你一目了然地对事务有更深的了解。

![](/data/attachment/album/201810/18/000535l0oee2uhfef1wh94.png)

这个演示使用了 Istio 内置的 OpenTracing 实现，所以我甚至不需要修改自己的应用代码就可以获得追踪数据。我也用到了 Jaeger，它是兼容 OpenTracing 的。

那么 OpenTracing 到底是什么呢？我们来看看。

### OpenTracing API

[OpenTracing](http://opentracing.io/) 是源自 [Zipkin](https://zipkin.io/) 的规范，以提供跨平台兼容性。它提供了对厂商中立的 API，用来向应用程序添加追踪功能并将追踪数据发送到分布式的追踪系统。按照 OpenTracing 规范编写的库，可以被任何兼容 OpenTracing 的系统使用。采用这个开放标准的开源工具有 Zipkin、Jaeger 和 Appdash 等。甚至像 [Datadog](https://www.datadoghq.com/) 和 [Instana](https://www.instana.com/) 这种付费工具也在采用。因为现在 OpenTracing 已经无处不在，这样的趋势有望继续发展下去。

### OpenCensus

OpenTracing 已经说过了，可 [OpenCensus](https://opencensus.io/) 又是什么呢？它在搜索结果中老是出现。它是一个和 OpenTracing 完全不同或者互补的竞争标准吗？

这个问题的答案取决于你的提问对象。我先尽我所能地解释一下它们的不同（按照我的理解）：OpenCensus 更加全面或者说它包罗万象。OpenTracing 专注于建立开放的 API 和规范，而不是为每一种开发语言和追踪系统都提供开放的实现。OpenCensus 不仅提供规范，还提供开发语言的实现，和连接协议，而且它不仅只做追踪，还引入了额外的度量指标，这些一般不在分布式追踪系统的职责范围。

使用 OpenCensus，我们能够在运行着应用程序的主机上查看追踪数据，但它也有个可插拔的导出器系统，用于导出数据到中心聚合器。目前 OpenCensus 团队提供的导出器包括 Zipkin、Prometheus、Jaeger、Stackdriver、Datadog 和 SignalFx，不过任何人都可以创建一个导出器。

依我看这两者有很多重叠的部分，没有哪个一定比另外一个好，但是重要的是，要知道它们做什么事情和不做什么事情。OpenTracing 主要是一个规范，具体的实现和独断的设计由其他人来做。OpenCensus 更加独断地为本地组件提供了全面的解决方案，但是仍然需要其他系统做远程的聚合。

### 可选工具

#### Zipkin

Zipkin 是最早出现的这类工具之一。 谷歌在 2010 年发表了介绍其内部追踪系统 Dapper 的[论文](https://research.google.com/archive/papers/dapper-2010-1.pdf)，Twitter 以此为基础开发了 Zipkin。Zipkin 的开发语言 Java，用 Cassandra 或 ElasticSearch 作为可扩展的存储后端，这些选择能满足大部分公司的需求。Zipkin 支持的最低 Java 版本是 Java 6，它也使用了 [Thrift](https://thrift.apache.org/) 的二进制通信协议，Thrift 在 Twitter 的系统中很流行，现在作为 Apache 项目在托管。

这个系统包括上报器（客户端）、数据收集器、查询服务和一个 web 界面。Zipkin 只传输一个带事务上下文的踪迹 ID 来告知接收者追踪的进行，所以说在生产环境中是安全的。每一个客户端收集到的数据，会异步地传输到数据收集器。收集器把这些单元的数据存到数据库，web 界面负责用可消费的格式展示这些数据给用户。客户端传输数据到收集器有三种方式：HTTP、Kafka 和 Scribe。

[Zipkin 社区](https://zipkin.io/pages/community.html) 还提供了 [Brave](https://github.com/openzipkin/brave)，一个跟 Zipkin 兼容的 Java 客户端的实现。由于 Brave 没有任何依赖，所以它不会拖累你的项目，也不会使用跟你们公司标准不兼容的库来搞乱你的项目。除 Brave 之外，还有很多其他的 Zipkin 客户端实现，因为 Zipkin 和 OpenTracing 标准是兼容的，所以这些实现也能用到其他的分布式追踪系统中。流行的 Spring 框架中一个叫 [Spring Cloud Sleuth](https://cloud.spring.io/spring-cloud-sleuth/) 的分布式追踪组件，它和 Zipkin 是兼容的。

#### Jaeger

[Jaeger](https://www.jaegertracing.io/) 来自 Uber，是一个比较新的项目，[CNCF](https://www.cncf.io/)（云原生计算基金会）已经把 Jaeger 托管为孵化项目。Jaeger 使用 Golang 开发，因此你不用担心在服务器上安装依赖的问题，也不用担心开发语言的解释器或虚拟机的开销。和 Zipkin 类似，Jaeger 也支持用 Cassandra 和 ElasticSearch 做可扩展的存储后端。Jaeger 也完全兼容 OpenTracing 标准。

Jaeger 的架构跟 Zipkin 很像，有客户端（上报器）、数据收集器、查询服务和一个 web 界面，不过它还有一个在各个服务器上运行着的代理，负责在服务器本地做数据聚合。代理通过一个 UDP 连接接收数据，然后分批处理，发送到数据收集器。收集器接收到的数据是 [Thrift](https://en.wikipedia.org/wiki/Apache_Thrift) 协议的格式，它把数据存到 Cassandra 或者 ElasticSearch 中。查询服务能直接访问数据库，并给 web 界面提供所需的信息。

默认情况下，Jaeger 客户端不会采集所有的追踪数据，只抽样了 0.1% 的（ 1000 个采 1 个）追踪数据。对大多数系统来说，保留所有的追踪数据并传输的话就太多了。不过，通过配置代理可以调整这个值，客户端会从代理获取自己的配置。这个抽样并不是完全随机的，并且正在变得越来越好。Jaeger 使用概率抽样，试图对是否应该对新踪迹进行抽样进行有根据的猜测。 [自适应采样已经在路线图当中](https://www.jaegertracing.io/docs/roadmap/#adaptive-sampling)，它将通过添加额外的、能够帮助做决策的上下文来改进采样算法。

#### Appdash

[Appdash](https://github.com/sourcegraph/appdash) 也是一个用 Golang 写的分布式追踪系统，和 Jaeger 一样。Appdash 是 [Sourcegraph](https://about.sourcegraph.com/) 公司基于谷歌的 Dapper 和 Twitter 的 Zipkin 开发的。同样的，它也支持 Opentracing 标准，不过这是后来添加的功能，依赖了一个与默认组件不同的组件，因此增加了风险和复杂度。

从高层次来看，Appdash 的架构主要有三个部分：客户端、本地收集器和远程收集器。因为没有很多文档，所以这个架构描述是基于对系统的测试以及查看源码。写代码时需要把 Appdash 的客户端添加进来。Appdash 提供了 Python、Golang 和 Ruby 的实现，不过 OpenTracing 库可以与 Appdash 的 OpenTracing 实现一起使用。 客户端收集单元数据，并将它们发送到本地收集器。然后，本地收集器将数据发送到中心的 Appdash 服务器，这个服务器上运行着自己的本地收集器，它的本地收集器是其他所有节点的远程收集器。

---

via: <https://opensource.com/article/18/9/distributed-tracing-tools>

作者：[Dan Barker](https://opensource.com/users/barkerd427) 选题：[lujun9972](https://github.com/lujun9972) 译者：[belitex](https://github.com/belitex) 校对：[wxy](https://github.com/wxy)

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


使用 Python 为你的油箱加油

Summary: 我来介绍一下我是如何使用 Python 来节省成本的。

我来介绍一下我是如何使用 Python 来节省成本的。

>
> 我来介绍一下我是如何使用 Python 来节省成本的。
>
>
>

![](/data/attachment/album/201810/18/003647fykfkj2p2kc57ezx.jpg)

我最近在开一辆烧 93 号汽油的车子。根据汽车制造商的说法，它只需要加 91 号汽油就可以了。然而，在美国只能买到 87 号、89 号、93 号汽油。而我家附近的汽油的物价水平是每增加一号，每加仑就要多付 30 美分，因此如果加 93 号汽油，每加仑就要多花 60 美分。为什么不能节省一些钱呢？

一开始很简单，只需要先加满 93 号汽油，然后在油量表显示油箱半满的时候，用 89 号汽油加满，就得到一整箱 91 号汽油了。但接下来就麻烦了，剩下半箱 91 号汽油加上半箱 93 号汽油，只会变成一箱 92 号汽油，再接下来呢？如果继续算下去，只会越来越混乱。这个时候 Python 就派上用场了。

我的方案是，可以根据汽油的实时状态，不断向油箱中加入 93 号汽油或者 89 号汽油，而最终目标是使油箱内汽油的号数不低于 91。我需要做的是只是通过一些算法来判断新旧汽油混合之后的号数。使用多项式方程或许也可以解决这个问题，但如果使用 Python，好像只需要进行循环就可以了。

```
#!/usr/bin/env python
# octane.py

o = 93.0
newgas = 93.0   # 这个变量记录上一次加入的汽油号数
i = 1
while i < 21:                   # 20 次迭代 (加油次数)
    if newgas == 89.0:          # 如果上一次加的是 89 号汽油，改加 93 号汽油
        newgas = 93.0
        o = newgas/2 + o/2      # 当油箱半满的时候就加油
    else:                       # 如果上一次加的是 93 号汽油，则改加 89 号汽油
        newgas = 89.0
        o = newgas/2 + o/2      # 当油箱半满的时候就加油
    print str(i) + ': '+ str(o)
    i += 1
```

在代码中，我首先将变量 `o`（油箱中的当前混合汽油号数）和变量 `newgas`（上一次加入的汽油号数）的初始值都设为 93，然后循环 20 次，也就是分别加入 89 号汽油和 93 号汽油一共 20 次，以保持混合汽油号数稳定。

```
1: 91.0
2: 92.0
3: 90.5
4: 91.75
5: 90.375
6: 91.6875
7: 90.34375
8: 91.671875
9: 90.3359375
10: 91.66796875
11: 90.333984375
12: 91.6669921875
13: 90.3334960938
14: 91.6667480469
15: 90.3333740234
16: 91.6666870117
17: 90.3333435059
18: 91.6666717529
19: 90.3333358765
20: 91.6666679382
```

从以上数据来看，只需要 10 到 15 次循环，汽油号数就比较稳定了，也相当接近 91 号汽油的目标。这种交替混合直到稳定的现象看起来很有趣，每次交替加入同等量的不同号数汽油，都会趋于稳定。实际上，即使加入的 89 号汽油和 93 号汽油的量不同，也会趋于稳定。

因此，我尝试了不同的比例，我认为加入的 93 号汽油需要比 89 号汽油更多一点。在尽量少补充新汽油的情况下，我最终计算到的结果是 89 号汽油要在油箱大约 7/12 满的时候加进去，而 93 号汽油则要在油箱 ¼ 满的时候才加进去。

我的循环将会更改成这样：

```
    if newgas == 89.0:

        newgas = 93.0
        o = 3*newgas/4 + o/4
    else:
        newgas = 89.0
        o = 5*newgas/12 + 7*o/12
```

以下是从第十次加油开始的混合汽油号数：

```
10: 92.5122272978
11: 91.0487992571
12: 92.5121998143
13: 91.048783225
14: 92.5121958062
15: 91.048780887
```

如你所见，这个调整会令混合汽油号数始终略高于 91。当然，我的油量表并没有 1/12 的刻度，但是 7/12 略小于 5/8，我可以近似地计算。

一个更简单地方案是每次都首先加满 93 号汽油，然后在油箱半满时加入 89 号汽油直到耗尽，这可能会是我的常规方案。就我个人而言，这种方法并不太好，有时甚至会产生一些麻烦。但对于长途旅行来说，这种方案会相对简便一些。有时我也会因为油价突然下跌而购买一些汽油，所以，这个方案是我可以考虑的一系列选项之一。

当然最重要的是：开车不写码，写码不开车！

---

via: <https://opensource.com/article/18/10/python-gas-pump>

作者：[Greg Pittman](https://opensource.com/users/greg-p) 选题：[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/) 荣誉推出


如何在家中使用 SSH 和 SFTP 协议

>
> 通过 SSH 和 SFTP 协议，我们能够访问其他设备，有效而且安全的传输文件等等。
>
>
>

![](/data/attachment/album/201810/18/205017sh5ghl6w7eaihdd1.png)

几年前，我决定配置另外一台电脑，以便我能在工作时访问它来传输我所需要的文件。要做到这一点，最基本的一步是要求你的网络提供商（ISP）提供一个固定的地址。

有一个不必要但很重要的步骤，就是保证你的这个可以访问的系统是安全的。在我的这种情况下，我计划只在工作场所访问它，所以我能够限定访问的 IP 地址。即使如此，你依然要尽多的采用安全措施。一旦你建立起来这个系统，全世界的人们马上就能尝试访问你的系统。这是非常令人惊奇及恐慌的。你能通过日志文件来发现这一点。我推测有探测机器人在尽其所能的搜索那些没有安全措施的系统。

在我设置好系统不久后，我觉得这种访问没什么大用，为此，我将它关闭了以便不再为它操心。尽管如此，只要架设了它，在家庭网络中使用 SSH 和 SFTP 还是有点用的。

当然，有一个必备条件，这个另外的电脑必须已经开机了，至于电脑是否登录与否无所谓的。你也需要知道其 IP 地址。有两个方法能够知道，一个是通过浏览器访问你的路由器，一般情况下你的地址格式类似于 192.168.1.254 这样。通过一些搜索，很容易找出当前是开机的并且接在 eth0 或者 wifi 上的系统。如何识别你所要找到的电脑可能是个挑战。

更容易找到这个电脑的方式是，打开 shell，输入 ：

```
ifconfig
```

命令会输出一些信息，你所需要的信息在 `inet` 后面，看起来和 192.168.1.234 类似。当你发现这个后，回到你要访问这台主机的客户端电脑，在命令行中输入 ：

```
ssh gregp@192.168.1.234
```

如果要让上面的命令能够正常执行，`gregp` 必须是该主机系统中正确的用户名。你会被询问其密码。如果你键入的密码和用户名都是正确的，你将通过 shell 环境连接上了这台电脑。我坦诚，对于 SSH 我并不是经常使用的。我偶尔使用它，我能够运行 `dnf` 来更新我所常使用电脑之外的其它电脑。通常，我用 SFTP ：

```
sftp grego@192.168.1.234
```

我更需要用简单的方法来把一个文件传输到另一个电脑。相对于闪存棒和额外的设备，它更加方便，耗时更少。

一旦连接建立成功，SFTP 有两个基本的命令，`get`，从主机接收文件 ；`put`，向主机发送文件。在连接之前，我经常在客户端移动到我想接收或者传输的文件夹下。在连接之后，你将处于一个顶层目录里，比如 `home/gregp`。一旦连接成功，你可以像在客户端一样的使用 `cd`，改变你在主机上的工作路径。你也许需要用 `ls` 来确认你的位置。

如果你想改变你的客户端的工作目录。用 `lcd` 命令（ 即 local change directory 的意思）。同样的，用 `lls` 来显示客户端工作目录的内容。

如果主机上没有你想要的目录名，你该怎么办？用 `mkdir` 在主机上创建一个新的目录。或者你可以将整个目录的文件全拷贝到主机 ：

```
put -r thisDir/
```

这将在主机上创建该目录并复制它的全部文件和子目录到主机上。这种传输是非常快速的，能达到硬件的上限。不像在互联网传输一样遇到网络瓶颈。要查看你能在 SFTP 会话中能够使用的命令列表：

```
man sftp
```

我也能够在我的电脑上的 Windows 虚拟机内用 SFTP，这是配置一个虚拟机而不是一个双系统的另外一个优势。这让我能够在系统的 Linux 部分移入或者移出文件。而我只需要在 Windows 中使用一个客户端就行。

你能够使用 SSH 或 SFTP 访问通过网线或者 WIFI 连接到你路由器的任何设备。这里，我使用了一个叫做 [SSHDroid](https://play.google.com/store/apps/details?id=berserker.android.apps.sshdroid) 的应用，能够在被动模式下运行 SSH。换句话来说，你能够用你的电脑访问作为主机的 Android 设备。近来我还发现了另外一个应用，[Admin Hands](https://play.google.com/store/apps/details?id=com.arpaplus.adminhands&hl=en_US)，不管你的客户端是平板还是手机，都能使用 SSH 或者 SFTP 操作。这个应用对于备份和手机分享照片是极好的。

---

via: <https://opensource.com/article/18/10/ssh-sftp-home-network>

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

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


如何创建和维护你自己的 man 手册

![](/data/attachment/album/201810/19/062636oamaqp01aun6vqov.png)

我们已经讨论了一些 [man 手册的替代方案](https://www.ostechnix.com/3-good-alternatives-man-pages-every-linux-user-know/)。 这些替代方案主要用于学习简洁的 Linux 命令示例，而无需通过全面而过于详细的手册页。 如果你正在寻找一种快速而简单的方法来轻松快速地学习 Linux 命令，那么这些替代方案值得尝试。 现在，你可能正在考虑 —— 如何为 Linux 命令创建自己的 man 式的帮助页面？ 这时 “Um” 就派上用场了。 Um 是一个命令行实用程序，可以用于轻松创建和维护包含你到目前为止所了解的所有命令的 man 页面。

通过创建自己的手册页，你可以在手册页中避免大量不必要的细节，并且只包含你需要记住的内容。 如果你想创建自己的一套 man 式的页面，“Um” 也能为你提供帮助。 在这个简短的教程中，我们将学习如何安装 “Um” 命令以及如何创建自己的 man 手册页。

### 安装 Um

Um 适用于 Linux 和Mac OS。 目前，它只能在 Linux 系统中使用 Linuxbrew 软件包管理器来进行安装。 如果你尚未安装 Linuxbrew，请参考以下链接：

* [Linuxbrew：一个用于 Linux 和 MacOS 的通用包管理器](https://www.ostechnix.com/linuxbrew-common-package-manager-linux-mac-os-x/)

安装 Linuxbrew 后，运行以下命令安装 Um 实用程序。

```
$ brew install sinclairtarget/wst/um
```

如果你会看到类似下面的输出，恭喜你！ Um 已经安装好并且可以使用了。

```
[...]
==> Installing sinclairtarget/wst/um
==> Downloading https://github.com/sinclairtarget/um/archive/4.0.0.tar.gz
==> Downloading from https://codeload.github.com/sinclairtarget/um/tar.gz/4.0.0
-=#=# # #
==> Downloading https://rubygems.org/gems/kramdown-1.17.0.gem
######################################################################## 100.0%
==> gem install /home/sk/.cache/Homebrew/downloads/d0a5d978120a791d9c5965fc103866815189a4e3939
==> Caveats
Bash completion has been installed to:
/home/linuxbrew/.linuxbrew/etc/bash_completion.d
==> Summary
[] /home/linuxbrew/.linuxbrew/Cellar/um/4.0.0: 714 files, 1.3MB, built in 35 seconds
==> Caveats
==> openssl
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
/home/linuxbrew/.linuxbrew/etc/openssl/certs

and run
/home/linuxbrew/.linuxbrew/opt/openssl/bin/c_rehash
==> ruby
Emacs Lisp files have been installed to:
/home/linuxbrew/.linuxbrew/share/emacs/site-lisp/ruby
==> um
Bash completion has been installed to:
/home/linuxbrew/.linuxbrew/etc/bash_completion.d
```

在制作你的 man 手册页之前，你需要为 Um 启用 bash 补全。

要开启 bash 补全，首先你需要打开 `~/.bash_profile` 文件:

```
$ nano ~/.bash_profile
```

并在其中添加以下内容：

```
if [ -f $(brew --prefix)/etc/bash_completion.d/um-completion.sh ]; then
 . $(brew --prefix)/etc/bash_completion.d/um-completion.sh
fi
```

保存并关闭文件。运行以下命令以更新更改。

```
$ source ~/.bash_profile
```

准备工作全部完成。让我们继续创建我们的第一个 man 手册页。

### 创建并维护自己的man手册

如果你想为 `dpkg` 命令创建自己的 man 手册。请运行:

```
$ um edit dpkg
```

上面的命令将在默认编辑器中打开 markdown 模板：

![](/data/attachment/album/201810/19/062637gsizhv5ohhaoadnl.png)

我的默认编辑器是 Vi，因此上面的命令会在 Vi 编辑器中打开它。现在，开始在此模板中添加有关 `dpkg` 命令的所有内容。

下面是一个示例：

![](/data/attachment/album/201810/19/062638pqq3cz99v1j6urxp.png)

正如你在上图的输出中看到的，我为 `dpkg` 命令添加了概要，描述和两个参数选项。 你可以在 man 手册中添加你所需要的所有部分。不过你也要确保为每个部分提供了适当且易于理解的标题。 完成后，保存并退出文件（如果使用 Vi 编辑器，请按 `ESC` 键并键入`:wq`）。

最后，使用以下命令查看新创建的 man 手册页：

```
$ um dpkg
```

![](/data/attachment/album/201810/19/062639zw2h1m7ml9sfa2s7.png)

如你所见，`dpkg` 的 man 手册页看起来与官方手册页完全相同。 如果要在手册页中编辑和/或添加更多详细信息，请再次运行相同的命令并添加更多详细信息。

```
$ um edit dpkg
```

要使用 Um 查看新创建的 man 手册页列表，请运行：

```
$ um list
```

所有手册页将保存在主目录中名为 `.um` 的目录下

以防万一，如果你不想要某个特定页面，只需删除它，如下所示。

```
$ um rm dpkg
```

要查看帮助部分和所有可用的常规选项，请运行：

```
$ um --help
usage: um <page name>
 um <sub-command> [ARGS...]

The first form is equivalent to `um read <page name>`.

Subcommands:
 um (l)ist List the available pages for the current topic.
 um (r)ead <page name> Read the given page under the current topic.
 um (e)dit <page name> Create or edit the given page under the current topic.
 um rm <page name> Remove the given page.
 um (t)opic [topic] Get or set the current topic.
 um topics List all topics.
 um (c)onfig [config key] Display configuration environment.
 um (h)elp [sub-command] Display this help message, or the help message for a sub-command.
```

### 配置 Um

要查看当前配置，请运行：

```
$ um config
Options prefixed by '*' are set in /home/sk/.um/umconfig.
editor = vi
pager = less
pages_directory = /home/sk/.um/pages
default_topic = shell
pages_ext = .md
```

在此文件中，你可以根据需要编辑和更改 `pager`、`editor`、`default_topic`、`pages_directory` 和 `pages_ext` 选项的值。 比如说，如果你想在 [Dropbox](https://www.ostechnix.com/install-dropbox-in-ubuntu-18-04-lts-desktop/) 文件夹中保存新创建的 Um 页面，只需更改 `~/.um/umconfig` 文件中 `pages_directory` 的值并将其更改为 Dropbox 文件夹即可。

```
pages_directory = /Users/myusername/Dropbox/um
```

这就是全部内容，希望这些能对你有用，更多好的内容敬请关注！

干杯！

---

via: <https://www.ostechnix.com/how-to-create-and-maintain-your-own-man-pages/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[way-ww](https://github.com/way-ww) 校对：[wxy](https://github.com/wxy)

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


Linux vs Mac：Linux 比 Mac 好的 7 个原因

长时间使用过 Mac 和 Linux，各有各的优劣势。关键是使用者的需求是什么？

最近我们谈论了一些[为什么 Linux 比 Windows 好](https://itsfoss.com/linux-better-than-windows/)的原因。毫无疑问，Linux 是个非常优秀的平台。但是它和其它操作系统一样也会有缺点。对于某些专门的领域，像是游戏，Windows 当然更好。而对于视频编辑等任务，Mac 系统可能更为方便。这一切都取决于你的偏好，以及你想用你的系统做些什么。在这篇文章中，我们将会介绍一些 Linux 相对于 Mac 更好的一些地方。

如果你已经在用 Mac 或者打算买一台 Mac 电脑，我们建议你仔细考虑一下，看看是改为使用 Linux 还是继续使用 Mac。

### Linux 比 Mac 好的 7 个原因

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223947s1dfxs9ff603e3q3.png)

Linux 和 macOS 都是类 Unix 操作系统，并且都支持 Unix 命令、bash 和其它 shell，相比于 Windows，它们所支持的应用和游戏比较少。但也就是这点比较相似。

平面设计师和视频剪辑师更加倾向于使用 Mac 系统，而 Linux 更加适合做开发、系统管理、运维的工程师。

那要不要使用 Linux 呢，为什么要选择 Linux 呢？下面是根据实际经验和理性分析给出的一些建议。

#### 1、价格

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223947oqustt3npkepqfsf.jpg)

假设你只是需要浏览文件、看电影、下载图片、写文档、制作报表或者做一些类似的工作，并且你想要一个更加安全的系统。

那在这种情况下，你觉得花费几百美金买个系统完成这项工作，或者花费更多直接买个 MacBook 更好？当然，最终的决定权还是在你。

买个装好 Mac 系统的电脑？还是买个便宜的电脑，然后自己装上免费的 Linux 系统？这个要看你自己的偏好。就我个人而言，除了音视频剪辑创作之外，Linux 都非常好地用，而对于音视频方面，我更倾向于使用 Final Cut Pro（专业的视频编辑软件）和 Logic Pro X（专业的音乐制作软件）（LCTT 译注：这两款软件都是苹果公司推出的）。

#### 2、硬件支持

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223948k4onm7vvo050oon5.jpg)

Linux 支持多种平台。无论你的电脑配置如何，你都可以在上面安装 Linux，无论性能好或者差，Linux 都可以运行。[即使你的电脑已经使用很久了，你仍然可以通过选择安装合适的发行版让 Linux 在你的电脑上流畅的运行](https://itsfoss.com/lightweight-linux-beginners/)。

而 Mac 不同，它是苹果机专用系统。如果你希望买个便宜的电脑，然后自己装上 Mac 系统，这几乎是不可能的。一般来说 Mac 都是和苹果设备配套的。

这有一些[在非苹果系统上安装 Mac OS 的教程](https://hackintosh.com/)。这里面需要用到的专业技术以及可能遇到的一些问题将会花费你许多时间，你需要想好这样做是否值得。

总之，Linux 所支持的硬件平台很广泛，而 MacOS 相对而言则非常少。

#### 3、安全性

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223949t6fkf620x06xm903.jpg)

很多人都说 iOS 和 Mac 是非常安全的平台。的确，或许相比于 Windows，它确实比较安全，可并不一定有 Linux 安全。

我不是在危言耸听。Mac 系统上也有不少恶意软件和广告，并且[数量与日俱增](https://www.computerworld.com/article/3262225/apple-mac/warning-as-mac-malware-exploits-climb-270.html)。我认识一些不太懂技术的用户使用着很慢的 Mac 电脑并且为此深受折磨。一项快速调查显示[浏览器恶意劫持软件](https://www.imore.com/how-to-remove-browser-hijack)是罪魁祸首。

从来没有绝对安全的操作系统，Linux 也不例外。Linux 也有漏洞，但是 Linux 发行版提供的及时更新弥补了这些漏洞。另外，到目前为止在 Linux 上还没有自动运行的病毒或浏览器劫持恶意软件的案例发生。

这可能也是一个你应该选择 Linux 而不是 Mac 的原因。

#### 4、可定制性与灵活性

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223950hqtjiaj5ccj5ze1h.jpg)

如果你有不喜欢的东西，自己定制或者修改它都行。

举个例子，如果你不喜欢 Ubuntu 18.04.1 的 [Gnome 桌面环境](https://www.gnome.org/)，你可以换成 [KDE Plasma](https://www.kde.org/plasma-desktop)。你也可以尝试一些 [Gnome 扩展](https://itsfoss.com/best-gnome-extensions/)丰富你的桌面选择。这种灵活性和可定制性在 Mac OS 是不可能有的。

除此之外，你还可以根据需要修改一些操作系统的代码（但是可能需要一些专业知识）来打造适合你的系统。这个在 MacOS 上可以做吗?

另外你可以根据需要从一系列的 Linux 发行版进行选择。比如说，如果你喜欢 MacOS 上的工作方式，[Elementary OS](https://elementary.io/) 可能是个不错的选择。你想在你的旧电脑上装上一个轻量级的 Linux 发行版系统吗？这里有一个[轻量级 Linux 发行版列表](https://itsfoss.com/lightweight-linux-beginners/)。相比较而言，MacOS 缺乏这种灵活性。

#### 5、使用 Linux 有助于你的职业生涯（针对 IT 行业和科学领域的学生）

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223951updqfqdi345061r4.jpg)

对于 IT 领域的学生和求职者而言，这是有争议的但是也是有一定的帮助的。使用 Linux 并不会让你成为一个优秀的人，也不一定能让你得到任何与 IT 相关的工作。

但是当你开始使用 Linux 并且探索如何使用的时候，你将会积累非常多的经验。作为一名技术人员，你迟早会接触终端，学习通过命令行操作文件系统以及安装应用程序。你可能不会知道这些都是一些 IT 公司的新员工需要培训的内容。

除此之外，Linux 在就业市场上还有很大的发展空间。Linux 相关的技术有很多（云计算、Kubernetes、系统管理等），你可以学习、考取专业技能证书并获得一份相关的高薪工作。要学习这些，你必须使用 Linux。

#### 6、可靠

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223952e3crt3cj3zqb4txt.jpg)

想想为什么服务器上用的都是 Linux 系统，当然是因为它可靠。

但是它为什么可靠呢，相比于 MacOS，它的可靠体现在什么方面呢？

答案很简单 —— 给用户更多的控制权，同时提供更好的安全性。在 MacOS 上，你并不能完全控制它，这样做是为了让操作变得更容易，同时提高你的用户体验。使用 Linux，你可以做任何你想做的事情 —— 这可能会导致（对某些人来说）糟糕的用户体验 —— 但它确实使其更可靠。

#### 7、开源

![Linux vs Mac：为什么 Linux 更好](/data/attachment/album/201810/19/223953fhhyy9vhyhvry6i0.jpg)

开源并不是每个人都关心的。但对我来说，Linux 最重要的优势在于它的开源特性。上面讨论的大多数观点都是开源软件的直接优势。

简单解释一下，如果是开源软件，你可以自己查看或者修改源代码。但对 Mac 来说，苹果拥有独家控制权。即使你有足够的技术知识，也无法查看 MacOS 的源代码。

形象点说，Mac 驱动的系统可以让你得到一辆车，但缺点是你不能打开引擎盖看里面是什么。那可太差劲了!

如果你想深入了解开源软件的优势，可以在 OpenSource.com 上浏览一下 [Ben Balter 的文章](https://opensource.com/life/15/12/why-open-source)。

### 总结

现在你应该知道为什么 Linux 比 Mac 好了吧，你觉得呢？上面的这些原因可以说服你选择 Linux 吗？如果不行的话那又是为什么呢？

请在下方评论让我们知道你的想法。

提示：这里的图片是以“企鹅俱乐部”为原型的。

---

via: <https://itsfoss.com/linux-vs-mac/>

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

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


在 Linux 手册页中查看整个 Arch Linux Wiki

![](/data/attachment/album/201810/19/232304eyx755vrg8x8zcsx.jpg)

不久之前，我写了篇关于一个名叫 [arch-wiki-cli](https://www.ostechnix.com/search-arch-wiki-website-commandline/) 的命令行脚本的文章，使用它可以在终端命令行中查看 Arch Linux Wiki。使用这个脚本，你可以很轻松的用你喜欢的文本浏览器查看整个 Arch Wiki 网站。显然，使用这个脚本需要你有网络连接。我今天偶然发现了一个名为 Arch-wiki-man 的程序，与其有着相同的功能。就跟名字说的一样，它可以让你在命令行查看 Arch Wiki，但是无需联网。它可以以手册页的形式为你显示来自 Arch Wiki 的任何文章。它会下载整个 Arch Wiki 到本地，并每两天自动推送一次。因此，你的系统上总能有一份 Arch Wiki 最新的副本。

### 安装 Arch-wiki-man

Arch-wiki-man 在 [AUR](https://aur.archlinux.org/packages/arch-wiki-man/) 中可用，所以你可以通过类似[Yay](https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/) 的 AUR 帮助程序安装它。

```
$ yay -S arch-wiki-man
```

另外，它也可以使用 NPM 安装。首先确保你已经[安装了 NoodJS](https://www.ostechnix.com/install-node-js-linux/)，然后使用以下命令安装它。

```
$ npm install -g arch-wiki-man
```

### 以手册页的形式查看整个 Arch Wiki

Arch-wiki-man 的典型语法如下：

```
$ awman <search-query>
```

下面看一些具体的例子：

#### 搜索一个或多个匹配项

只需要下面的命令，就可以搜索 [Arch Linux 安装指南](https://www.ostechnix.com/install-arch-linux-latest-version/)。

```
$ awman Installation guide
```

上面的命令将会从 Arch Wiki 中搜索所有包含 “Installation guide” 的条目。如果对于给出的搜索条目有很多的匹配项，将会展示为一个选择菜单。使用上下方向键或是 Vim 风格的方向键（`j`/`k`），移动到你想查看的指南上，点击回车打开。然后就会像下面这样，以手册页的形式展示指南的内容。

![](/data/attachment/album/201810/19/232306e72fi67fpidpk6y7.gif)

awman 指的是 arch wiki man 的首字母组合。

它支持手册页的所有操作，所以你可以像使用手册页一样使用它。按 `h` 查看帮助选项。

![](/data/attachment/album/201810/19/232307iyy8rrmwdow1ryol.png)

要退出选择菜单而不显示手册页，只需要按 `Ctrl+c`。

输入 `q` 返回或者/并且退出手册页。

#### 在标题或者概述中搜索匹配项

awman 默认只会在标题中搜索匹配项。但是你也可以指定它同时在标题和概述中搜索匹配项。

```
$ awman -d vim
```

或者，

```
$ awman --desc-search vim
```

#### 在目录中搜索匹配项

不同于在标题和概述中搜索匹配项，它也能够扫描整个内容以匹配。不过请注意，这样将会使搜索进程明显变慢。

```
$ awman -k emacs
```

或者，

```
$ awman --apropos emacs
```

#### 在 web 浏览器中打开搜索结果

如果你不想以手册页的形式查看 Arch Wiki 指南，你也可以像下面这样在 web 浏览器中打开它。

```
$ awman -w pacman
```

或者，

```
$ awman --web pacman
```

这条命令将会在 web 浏览器中打开匹配结果。请注意，使用这个选项需要网络连接。

#### 在其他语言中搜索

awman 默认打开的是英文的 Arch Wiki 页面。如果你想用其他的语言查看搜索结果，例如西班牙语，只需要像这样做：

```
$ awman -l spanish codecs
```

![](/data/attachment/album/201810/19/232308osssnzfssa9jsafr.png)

使用以下命令查看可用的语言：

```
$ awman --list-languages
```

#### 升级本地的 Arch Wiki 副本

就像我已经说过的，更新会每两天自动推送一次。或者你也可以使用以下命令手动更新。

```
$ awman-update
arch-wiki-man@1.3.0 /usr/lib/node_modules/arch-wiki-man
└── arch-wiki-md-repo@0.10.84

arch-wiki-md-repo has been successfully updated or reinstalled.
```

：）

---

via: <https://www.ostechnix.com/how-to-browse-and-read-entire-arch-wiki-as-linux-man-pages/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[dianbanjiu](https://github.com/dianbanjiu) 校对：[wxy](https://github.com/wxy)

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


一个简单而美观的跨平台播客应用程序

![](/data/attachment/album/201810/19/234010rpsfnsn7nmpos16r.png)

播客在过去几年中变得非常流行。 播客就是所谓的“<ruby> 信息娱乐 <rt>  infotainment </rt></ruby>”，它们通常是轻松的，但也会为你提供有价值的信息。 播客在过去几年中已经非常火爆了，如果你喜欢某些东西，就很可能有个相关的播客。 Linux 桌面版上有很多播客播放器，但是如果你想要一些视觉上美观、有顺滑的动画并且可以在每个平台上运行的东西，那就并没有很多替代品可以替代 CPod 了。 CPod（以前称为 Cumulonimbus）是一个开源而成熟的播客应用程序，适用于 Linux、MacOS 和 Windows。

CPod 运行在一个名为 Electron 的东西上 —— 这个工具允许开发人员构建跨平台（例如 Windows、MacOS 和 Linux）的桌面图形化应用程序。 在本简要指南中，我们将讨论如何在 Linux 中安装和使用 CPod 播客应用程序。

### 安装 CPod

转到 CPod 的[发布页面](https://github.com/z-------------/CPod/releases)。 下载并安装所选平台的二进制文件。 如果你使用 Ubuntu / Debian，你只需从发布页面下载并安装 .deb 文件，如下所示。

```
$ wget https://github.com/z-------------/CPod/releases/download/v1.25.7/CPod_1.25.7_amd64.deb
$ sudo apt update
$ sudo apt install gdebi
$ sudo gdebi CPod_1.25.7_amd64.deb
```

如果你使用其他发行版，你可能需要使用发布页面中的 AppImage。

从发布页面下载 AppImage 文件。

打开终端，然后转到存储 AppImage 文件的目录。 更改权限以允许执行：

```
$ chmod +x CPod-1.25.7-x86_64.AppImage
```

执行 AppImage 文件：

```
$ ./CPod-1.25.7-x86_64.AppImage
```

你将看到一个对话框询问是否将应用程序与系统集成。 如果要执行此操作，请单击“yes”。

### 特征

#### 探索标签页

![](/data/attachment/album/201810/19/234012w3dphzdpzqvov3ds.png)

CPod 使用 Apple iTunes 数据库查找播客。 这很好，因为 iTunes 数据库是最大的这类数据库。 如果某个播客存在，那么很可能就在 iTunes 上。 要查找播客，只需使用探索部分中的顶部搜索栏即可。 探索部分还展示了一些受欢迎的播客。

#### 主标签页

![](/data/attachment/album/201810/19/234016k83f1fj918x1nfl3.png)

主标签页在打开应用程序时是默认打开的。 主标签页显示你已订阅的所有播客的所有剧集的时间顺序列表。

在主页选项卡中，你可以：

1. 标记剧集阅读。
2. 下载它们进行离线播放
3. 将它们添加到播放队列中。

![](/data/attachment/album/201810/19/234018s4ivnz4lqt1tn44a.png)

#### 订阅标签页

![](/data/attachment/album/201810/19/234020t35r8t97im5g60m6.png)

你当然可以订阅你喜欢的播客。 你可以在订阅标签页中执行的其他一些操作是：

1. 刷新播客艺术作品
2. 导出订阅到 .OPML 文件中，从 .OPML 文件中导入订阅。

#### 播放器

![](/data/attachment/album/201810/19/234022xz5cnjc0jjwwziee.png)

播放器可能是 CPod 最美观的部分。 该应用程序根据播客的横幅更改整体外观。 底部有一个声音可视化器。 在右侧，你可以查看和搜索此播客的其他剧集。

#### 缺点/缺失功能

虽然我喜欢这个应用程序，但 CPod 确实有一些特性和缺点：

1. 糟糕的 MPRIS 集成 —— 你可以从桌面环境的媒体播放器对话框中播放或者暂停播客，但这是不够的。 播客的名称未显示，你可以转到下一个或者上一个剧集。
2. 不支持章节。
3. 没有自动下载 —— 你必须手动下载剧集。
4. 使用过程中的 CPU 使用率非常高（即使对于 Electron 应用程序而言）。

### 总结

虽然它确实有它的缺点，但 CPod 显然是最美观的播客播放器应用程序，并且它具有最基本的功能。 如果你喜欢使用视觉上美观的应用程序，并且不需要高级功能，那么这就是你的完美应用。我知道我肯定会使用它。

你喜欢 CPod 吗？ 请将你的意见发表在下面的评论中。

**资源**

* [CPod GitHub 仓库](https://github.com/z-------------/CPod)

---

via: <https://www.ostechnix.com/cpod-a-simple-beautiful-and-cross-platform-podcast-app/>

作者：[EDITOR](https://www.ostechnix.com/author/editor/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Flowsnow](https://github.com/Flowsnow) 校对：[wxy](https://github.com/wxy)

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


介绍 Fedora 上的 Swift

![](/data/attachment/album/201810/20/093525ccnxl3l5zxqwwpsj.jpg)

Swift 是一种使用现代方法构建安全性、性能和软件设计模式的通用编程语言。它旨在成为各种编程项目的最佳语言，从系统编程到桌面应用程序，以及扩展到云服务。继续阅读了解它以及如何在 Fedora 中尝试它。

### 安全、快速、富有表现力

与许多现代编程语言一样，Swift 被设计为比基于 C 的语言更安全。例如，变量总是在使用之前初始化。检查数组和整数是否溢出。内存自动管理。

Swift 将意图放在语法中。要声明变量，请使用 `var` 关键字。要声明常量，请使用 `let`。

Swift 还保证对象永远不会是 `nil`。实际上，尝试使用已知为 `nil` 的对象将导致编译时错误。当使用 `nil` 值时，它支持一种称为 **optional** 的机制。optional 可能包含 `nil`，但使用 `?` 运算符可以安全地解包。

更多的功能包括：

* 与函数指针统一的闭包
* 元组和多个返回值
* 泛型
* 对范围或集合进行快速而简洁的迭代
* 支持方法、扩展和协议的结构体
* 函数式编程模式，例如 `map` 和 `filter`
* 内置强大的错误处理
* 拥有 `do`、`guard`、`defer` 和 `repeat` 关键字的高级控制流

### 尝试 Swift

Swift 在 Fedora 28 中可用，包名为 **swift-lang**。安装完成后，运行 `swift` 并启动 REPL 控制台。

```
$ swift
Welcome to Swift version 4.2 (swift-4.2-RELEASE). Type :help for assistance.
 1> let greeting="Hello world!"
greeting: String = "Hello world!"
 2> print(greeting)
Hello world!
 3> greeting = "Hello universe!"
error: repl.swift:3:10: error: cannot assign to value: 'greeting' is a 'let' constant
greeting = "Hello universe!"
~~~~~~~~ ^

 3>
```

Swift 有一个不断发展的社区，特别的，有一个[工作组](https://swift.org/server/)致力于使其成为一种高效且有力的服务器端编程语言。请访问其[主页](http://swift.org)了解更多参与方式。

图片由 [Uillian Vargas](https://unsplash.com/photos/7oJpVR1inGk?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 发布在 [Unsplash](https://unsplash.com/search/photos/fast?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上。

---

via: <https://fedoramagazine.org/introducing-swift-fedora/>

作者：[Link Dupont](https://fedoramagazine.org/author/linkdupont/) 选题：[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/) 荣誉推出


命令行小技巧：读取文件的不同方式

Summary: 如果你在系统中打开一个终端完成一些工作，你就有可能需要读取一两个文件。

如果你在系统中打开一个终端完成一些工作，你就有可能需要读取一两个文件。

![](/data/attachment/album/201810/21/000526kk3y3iwphyhkocw4.jpg)

作为图形操作系统，Fedora 的使用是令人愉快的。你可以轻松地点击完成任何任务。但你可能已经看到了，在底层还有一个强大的命令行。想要在 shell 下体验，只需要在 Fedora 系统中打开你的终端应用。这篇文章是向你展示常见的命令行使用方法的系列文章之一。

在这部分，你将学习如何以不同的方式读取文件，如果你在系统中打开一个终端完成一些工作，你就有可能需要读取一两个文件。

### 一应俱全的大餐

对命令行终端的用户来说， `cat` 命令众所周知。 当你 `cat` 一个文件，你很容易的把整个文件内容展示在你的屏幕上。而真正发生在底层的是文件一次读取一行，然后一行一行写入屏幕。

假设你有一个文件，叫做 `myfile`， 这个文件每行只有一个单词。为了简单起见，每行的单词就是这行的行号，就像这样：

```
one
two
three
four
five
```

所以如果你 `cat` 这个文件，你就会看到如下输出：

```
$ cat myfile
one
two
three
four
five
```

并没有太惊喜，不是吗？ 但是有个有趣的转折，只要使用 `tac` 命令，你可以从后往前 `cat` 这个文件。（请注意， Fedora 对这种有争议的幽默不承担任何责任！）

```
$ tac myfile
five
four
three
two
one
```

`cat` 命令允许你以不同的方式装饰输出，比如，你可以输出行号：

```
$ cat -n myfile
     1 one
     2 two
     3 three
     4 four
     5 five
```

还有其他选项可以显示特殊字符和其他功能。要了解更多, 请运行 `man cat` 命令， 看完之后，按 `q` 即可退出回到 shell。

### 挑选你的食物

通常，文件太长会无法全部显示在屏幕上，您可能希望能够像文档一样查看它。 这种情况下，可以试试 `less` 命令：

```
$ less myfile
```

你可以用方向键，也可以用 `PgUp`/`PgDn` 来查看文件， 按 `q` 就可以退回到 shell。

实际上，还有一个 `more` 命令，其基于老式的 UNIX 系统命令。如果在退回 shell 后仍想看到该文件的内容，则可能需要使用它。而 `less` 命令则让你回到你离开 shell 之前的样子，并且清除屏幕上你看到的所有的文件内容。

### 一点披萨或甜点

有时，你所需的输出只是文件的开头。 比如，有一个非常长的文件，当你使用 `cat` 命令时，会显示这个文件所有内容，前几行的内容很容易滚动过去，导致你看不到。`head` 命令会帮你获取文件的前几行：

```
$ head -n 2 myfile
one
two
```

同样，你会用 `tail` 命令来查看文件的末尾几行：

```
$ tail -n 3 myfile
three
four
five
```

当然，这些只是在这个领域的几个简单的命令。但它们可以让你在阅读文件时容易入手。

---

via: <https://fedoramagazine.org/commandline-quick-tips-reading-files-different-ways/>

作者：[Paul W. Frields](https://fedoramagazine.org/author/pfrields/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[distant1219](https://github.com/distant1219) 校对：[wxy](https://github.com/wxy)

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


如何在双系统引导下替换 Linux 发行版

>
> 在双系统引导的状态下，你可以将已安装的 Linux 发行版替换为另一个发行版，同时还可以保留原本的个人数据。
>
>
>

![How to Replace One Linux Distribution With Another From Dual Boot](/data/attachment/album/201810/21/002240jg0d00rl4devsllr.png)

假设你的电脑上已经[以双系统的形式安装了 Ubuntu 和 Windows](https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/)，但经过[将 Linux Mint 与 Ubuntu 比较](https://itsfoss.com/linux-mint-vs-ubuntu/)之后，你又觉得 [Linux Mint](https://www.linuxmint.com/) 会更适合自己的时候，你会怎样做？又该如何在[删除 Ubuntu](https://itsfoss.com/uninstall-ubuntu-linux-windows-dual-boot/) 的同时[在双系统中安装 Mint](https://itsfoss.com/guide-install-linux-mint-16-dual-boot-windows/) 呢？

你或许觉得应该首先从在双系统中卸载 [Ubuntu](https://www.ubuntu.com/)，然后使用 Linux Mint 重新安装成双系统。但实际上并不需要这么麻烦。

如果你已经在双系统引导中安装了一种 Linux 发行版，就可以轻松替换成另一个发行版了，而且也不必卸载已有的 Linux 发行版，只需要删除其所在的分区，然后在腾出的磁盘空间上安装另一个 Linux 发行版就可以了。

与此同时，更换 Linux 发行版后，仍然会保留原本 home 目录中包含所有文件。

下面就来详细介绍一下。

### 在双系统引导中替换 Linux 发行版

<https://youtu.be/ptF2RUehbKs>

这是我的演示范例。我使用双系统引导同时安装了 Windows 10 和 Linux Mint 19，然后我会把 Linux Mint 19 替换成 Elementary OS 5，同时在替换后保留我的个人文件（包括音乐、图片、视频和 home 目录中的文件）。

你需要做好以下这些准备：

* 使用 Linux 和 Windows 双系统引导
* 需要安装的 Linux 发行版的 USB live 版
* 在外部磁盘备份 Windows 和 Linux 中的重要文件（并非必要，但建议备份一下）

#### 在替换 Linux 发行版时要记住保留你的 home 目录

如果想让个人文件在安装新 Linux 系统的过程中不受影响，原有的 Linux 系统必须具有单独的 root 目录和 home 目录。你可能会发现我的[双系统引导教程](https://itsfoss.com/guide-install-elementary-os-luna/)在安装过程中不选择“与 Windows 共存”选项，而选择“其它”选项，然后手动创建 root 和 home 分区。所以，手动创建单独的 home 分区也算是一个磨刀不误砍柴工的操作。因为如果要在不丢失文件的情况下，将现有的 Linux 发行版替换为另一个发行版，需要将 home 目录存放在一个单独的分区上。

不过，你必须记住现有 Linux 系统的用户名和密码才能使用与新系统中相同的 home 目录。

如果你没有单独的 home 分区，也可以后续再进行创建。但这并不是推荐做法，因为这个过程会比较复杂，有可能会把你的系统搞乱。

下面来看看如何替换到另一个 Linux 发行版。

#### 步骤 1：为新的 Linux 发行版创建一个 USB live 版

尽管上文中已经提到了它，但我还是要重复一次以免忽略。

你可以使用 Windows 或 Linux 中的启动盘创建器（例如 [Etcher](https://etcher.io/)）来创建 USB live 版，这个过程比较简单，这里不再详细叙述。

#### 步骤 2：启动 USB live 版并安装 Linux

你应该已经使用过双系统启动，对这个过程不会陌生。使用 USB live 版重新启动系统，在启动时反复按 F10 或 F12 进入 BIOS 设置。选择从 USB 启动，就可以看到进入 live 环境或立即安装的选项。

在安装过程中，进入“安装类型”界面时，选择“其它”选项。

![Replacing one Linux with another from dual boot](/data/attachment/album/201810/21/002240leyy1hfcyvl3yuoz.jpg)

*在这里选择“其它”选项*

#### 步骤 3：准备分区操作

下图是分区界面。你会看到使用 Ext4 文件系统类型来安装 Linux。

![Identifying Linux partition in dual boot](/data/attachment/album/201810/21/002242kuv11f1hafmhzunm.jpg)

*确定 Linux 的安装位置*

在上图中，标记为 Linux Mint 19 的 Ext4 分区是 root 分区，大小为 82691 MB 的第二个 Ext4 分区是 home 分区。在这里我这里没有使用[交换空间](https://itsfoss.com/swap-size/)。

如果你只有一个 Ext4 分区，就意味着你的 home 目录与 root 目录位于同一分区。在这种情况下，你就无法保留 home 目录中的文件了，这个时候我建议将重要文件复制到外部磁盘，否则这些文件将不会保留。

然后是删除 root 分区。选择 root 分区，然后点击 `-` 号，这个操作释放了一些磁盘空间。

![Delete root partition of your existing Linux install](/data/attachment/album/201810/21/002244q77ewwjk6qsmkqgk.jpg)

*删除 root 分区*

磁盘空间释放出来后，点击 `+` 号。

![Create root partition for the new Linux](/data/attachment/album/201810/21/002246gfbvj66nzjeepzzq.jpg)

*创建新的 root 分区*

现在已经在可用空间中创建一个新分区。如果你之前的 Linux 系统中只有一个 root 分区，就应该在这里创建 root 分区和 home 分区。如果需要，还可以创建交换分区。

如果你之前已经有 root 分区和 home 分区，那么只需要从已删除的 root 分区创建 root 分区就可以了。

![Create root partition for the new Linux](/data/attachment/album/201810/21/002248dovkgofjjx1xzxdf.jpg)

*创建 root 分区*

你可能有疑问，为什么要经过“删除”和“添加”两个过程，而不使用“更改”选项。这是因为以前使用“更改”选项好像没有效果，所以我更喜欢用 `-` 和 `+`。这是迷信吗？也许是吧。

这里有一个重要的步骤，对新创建的 root 分区进行格式化。在没有更改分区大小的情况下，默认是不会对分区进行格式化的。如果分区没有被格式化，之后可能会出现问题。

![](/data/attachment/album/201810/21/002249izf61ww2gxxfwtgx.jpg)

*格式化 root 分区很重要*

如果你在新的 Linux 系统上已经划分了单独的 home 分区，选中它并点击更改。

![Recreate home partition](/data/attachment/album/201810/21/002251frjrlu4gzgwqjfua.jpg)

*修改已有的 home 分区*

然后指定将其作为 home 分区挂载即可。

![Specify the home mount point](/data/attachment/album/201810/21/002253bgtk5tq65qah5a17.jpg)

*指定 home 分区的挂载点*

如果你还有交换分区，可以重复与 home 分区相同的步骤，唯一不同的是要指定将空间用作交换空间。

现在的状态应该是有一个 root 分区（将被格式化）和一个 home 分区（如果需要，还可以使用交换分区）。点击“立即安装”可以开始安装。

![Verify partitions while replacing one Linux with another](/data/attachment/album/201810/21/002255mmwffwzw5mcmfwhh.jpg)

*检查分区情况*

接下来的几个界面就很熟悉了，要重点注意的是创建用户和密码的步骤。如果你之前有一个单独的 home 分区，并且还想使用相同的 home 目录，那你必须使用和之前相同的用户名和密码，至于设备名称则可以任意指定。

![To keep the home partition intact, use the previous user and password](/data/attachment/album/201810/21/002258arnaq6qcu6eeka6f.jpg)

*要保持 home 分区不变，请使用之前的用户名和密码*

接下来只要静待安装完成，不需执行任何操作。

![Wait for installation to finish](/data/attachment/album/201810/21/002300avt79y77711hp79h.jpg)

*等待安装完成*

安装完成后重新启动系统，你就能使用新的 Linux 发行版。

在以上的例子中，我可以在新的 Linux Mint 19 中使用原有的 Elementary OS 中的整个 home 目录，并且其中所有视频和图片都原封不动。岂不美哉？

---

via: <https://itsfoss.com/replace-linux-from-dual-boot/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[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/) 荣誉推出