2018年2月

怎样使用 curses 来绘制终端屏幕?

虽然图形界面非常酷,但是不是所有的程序都需要点击式的界面。例如,令人尊敬的 Vi 编辑器在第一个 GUI 出现之前在纯文本终端运行了很久。

Vi 编辑器是一个在“文本”模式下绘制的 面向屏幕 screen-oriented 程序的例子。它使用了一个叫 curses 的库。这个库提供了一系列的编程接口来操纵终端屏幕。curses 库产生于 BSD UNIX,但是 Linux 系统通过 ncurses 库提供这个功能。

要了解 ncurses “过去曾引起的风暴”,参见 [ncurses: Portable Screen-Handling for Linux, September 1, 1995, by Eric S. Raymond.]

使用 curses 创建程序实际上非常简单。在这个文章中,我展示了一个利用 curses 来在终端屏幕上绘图的示例程序。

谢尔宾斯基三角形

简单展示一些 curses 函数的一个方法是生成 谢尔宾斯基三角形 Sierpinski's Triangle 。如果你对生成谢尔宾斯基三角形的这种方法不熟悉的话,这里是一些产生谢尔宾斯基三角形的规则:

  1. 设置定义三角形的三个点。
  2. 随机选择任意的一个点 (x,y)

然后:

  1. 在三角形的顶点中随机选择一个点。
  2. 将新的 x,y 设置为先前的 x,y 和三角顶点的中间点。
  3. 重复(上述步骤)。

所以我按照这些指令写了这个程序,程序使用 curses 函数来向终端屏幕绘制谢尔宾斯基三角形:

/* triangle.c */

#include <curses.h>
#include <stdlib.h>

#include "getrandom_int.h"

#define ITERMAX 10000

int main(void)
{
  long iter;
  int yi, xi;
  int y[3], x[3];
  int index;
  int maxlines, maxcols;

  /* initialize curses */

  initscr();
  cbreak();
  noecho();

  clear();

  /* initialize triangle */

  maxlines = LINES - 1;
  maxcols = COLS - 1;

  y[0] = 0;
  x[0] = 0;

  y[1] = maxlines;
  x[1] = maxcols / 2;

  y[2] = 0;
  x[2] = maxcols;

  mvaddch(y[0], x[0], '0');
  mvaddch(y[1], x[1], '1');
  mvaddch(y[2], x[2], '2');

  /* initialize yi,xi with random values */

  yi = getrandom_int() % maxlines;
  xi = getrandom_int() % maxcols;

  mvaddch(yi, xi, '.');

  /* iterate the triangle */

  for (iter = 0; iter < ITERMAX; iter++) {
      index = getrandom_int() % 3;

      yi = (yi + y[index]) / 2;
      xi = (xi + x[index]) / 2;

      mvaddch(yi, xi, '*');
      refresh();
  }

  /* done */

  mvaddstr(maxlines, 0, "Press any key to quit");

  refresh();

  getch();
  endwin();

  exit(0);
}

让我一边解释一边浏览这个程序。首先,getrandom_int() 函数是我对 Linux 系统调用 getrandom() 的包装器。它保证返回一个正整数(int)值。(LCTT 译注:getrandom() 系统调用按照字节返回随机值到一个变量中,值是随机的,不保证正负,使用 stdlib.hrandom() 函数可以达到同样的效果)另外,按照上面的规则,你应该能够辨认出初始化和迭代谢尔宾斯基三角形的代码。除此之外,我们来看看我用来在终端上绘制三角形的 curses 函数。

大多数 curses 程序以这四条指令开头。 initscr() 函数获取包括大小和特征在内的终端类型,并设置终端支持的 curses 环境。cbreak() 函数禁用行缓冲并设置 curses 每次只接受一个字符。noecho() 函数告诉 curses 不要把输入回显到屏幕上。而 clear() 函数清空了屏幕:

  initscr();
  cbreak();
  noecho();

  clear();

之后程序设置了三个定义三角的顶点。注意这里使用的 LINESCOLS,它们是由 initscr() 来设置的。这些值告诉程序在终端的行数和列数。屏幕坐标从 0 开始,所以屏幕左上角是 00 列。屏幕右下角是 LINES - 1 行,COLS - 1 列。为了便于记忆,我的程序里把这些值分别设为了变量 maxlinesmaxcols

在屏幕上绘制文字的两个简单方法是 addch()addstr() 函数。也可以使用相关的 mvaddch()mvaddstr() 函数可以将字符放到一个特定的屏幕位置。我的程序在很多地方都用到了这些函数。首先程序绘制三个定义三角的点并标记为 '0''1''2'

  mvaddch(y[0], x[0], '0');
  mvaddch(y[1], x[1], '1');
  mvaddch(y[2], x[2], '2');

为了绘制任意的一个初始点,程序做了类似的一个调用:

  mvaddch(yi, xi, '.');

还有为了在谢尔宾斯基三角形递归中绘制连续的点:

      mvaddch(yi, xi, '*');

当程序完成之后,将会在屏幕左下角(在 maxlines 行,0 列)显示一个帮助信息:

  mvaddstr(maxlines, 0, "Press any key to quit");

注意 curses 在内存中维护了一个版本的屏幕显示,并且只有在你要求的时候才会更新这个屏幕,这很重要。特别是当你想要向屏幕显示大量的文字的时候,这样程序会有更好的性能表现。这是因为 curses 只能更新在上次更新之后改变的这部分屏幕。想要让 curses 更新终端屏幕,请使用 refresh() 函数。

在我的示例程序中,我选择在“绘制”每个谢尔宾斯基三角形中的连续点时更新屏幕。通过这样做,用户可以观察三角形中的每次迭代。(LCTT 译注:由于 CPU 太快,迭代过程执行就太快了,所以其实很难直接看到迭代过程)

在退出之前,我使用 getch() 函数等待用户按下一个键。然后我调用 endwin() 函数退出 curses 环境并返回终端程序到一般控制。

  getch();
  endwin();

编译和示例输出

现在你已经有了你的第一个 curses 示例程序,是时候编译运行它了。记住 Linux 操作系统通过 ncurses 库来实现 curses 功能,所以你需要在编译的时候通过 -lncurses来链接——例如:

$ ls
getrandom_int.c  getrandom_int.h  triangle.c

$ gcc -Wall -lncurses -o triangle triangle.c getrandom_int.c

(LCTT 译注:此处命令行有问题,-lncurses 选项在我的 Ubuntu 16.04 系统 + gcc 4.9.3 环境下,必须放在命令行最后,否则找不到库文件,链接时会出现未定义的引用。)

在标准的 80x24 终端运行这个 triangle 程序并没什么意思。在那样的分辨率下你不能看见谢尔宾斯基三角形的很多细节。如果你运行终端窗口并设置非常小的字体大小,你可以更加容易地看到谢尔宾斯基三角形的不规则性质。在我的系统上,输出如图 1。

图 1. triangle 程序的输出

虽然迭代具有随机性,但是每次谢尔宾斯基三角形的运行看起来都会很一致。唯一的不同是最初绘制到屏幕的一些点的位置不同。在这个例子中,你可以看到三角形开始的一个小圆点,在点 1 附近。看起来程序接下来选择了点 2,然后你可以看到在圆点和“2”之间的星号。并且看起来程序随机选择了点 2 作为下一个随机数,因为你可以看到在第一个星号和“2”之间的星号。从这里开始,就不能继续分辨三角形是怎样被画出来的了,因为所有的连续点都属于三角形区域。

开始学习 ncurses

这个程序是一个怎样使用 curses 函数绘制字符到屏幕的简单例子。按照你的程序的需要,你可以通过 curses 做得更多。在下一篇文章中,我将会展示怎样使用 curses 让用户和屏幕交互。如果你对于学习 curses 有兴趣,我建议你去读位于 Linux 文档计划 Linux Documentation Project 的 Pradeep Padala 写的 NCURSES Programming HOWTO

关于作者

Jim Hall 是一个自由及开源软件的倡议者,他最有名的工作是 FreeDOS 计划,也同样致力于开源软件的可用性。Jim 是在明尼苏达州的拉姆齐县的首席信息官。


via: http://www.linuxjournal.com/content/getting-started-ncurses

作者:Jim Hall 译者:leemeans 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

容器现在风靡于 IT 界 —— 这很好理解。容器是轻量级的,包含应用运行所需所有东西(代码、库、运行时环境、系统设置,以及依赖关系)的独立的包。每个容器都部署于它自己的 CPU、内存、块 I/O,以及网络资源上,所有这些都不依赖于某个内核和操作系统。这也是容器与虚拟机之间最大的不同;相比之下,虚拟机是一个运行于宿主机操作系统上的完整的操作系统平台,而容器不是。

容器允许你以一种前所未有的方式扩展交付能力(不管内部还是外部的)。例如,你可以快速部署多个 NGINX 实例(甚至可以应用于多个不同的阶段 —— 比如开发和生产阶段)。跟虚拟机不同,容器不会消耗太多系统资源。

Docker 使得创建、部署,和管理容器变得特别简单。更好的是,安装和使用 Docker 在 Linux 平台上特别的方便。

我将会向你演示在 Linux 上安装 Docker 是多么方便,同时带你入门 Docker。我的演示平台是 Ubuntu 16.04 Server,但流程在大多数其它 Linux 平台都差不多。

我这里假设你已经启动了 Ubuntu Server 16.04。

安装

由于 Ubuntu Server 16.04 缺少图形界面,我会完全通过命令行来安装和使用 Docker。在你安装前,你需要更新 apt 然后进行必要的升级。一定要注意,若系统内核升级了,你会需要重启系统。因此最好挑个服务器能重启的时间进行。

运行下面命令更新 apt

sudo apt update

完成后,使用命令升级系统:

sudo apt upgrade

若内核升级了,你需要用下面命令重启服务器:

sudo reboot

若内核没有升级,你就可以安装 Docker 了(无需重启)。安装 Docker 的命令为:

sudo apt install docker.io

若你使用的是其它 Linux 发行版,当尝试用相应的包管理器来安装时却发现没有 docker.io 包,则你应该安装 docker 包。例如,在 Fedora 上安装应该用命令:

sudo dnf install docker

若你使用的是 CentOS 7,那么最好使用安装脚本来安装 docker。首先使用命令 sudo yum check-update 更新系统。升级完后,输入下面命令来下载并运行所需的脚本:

curl -fsSL https://get.docker.com/ | sh

默认情况下,只有管理员权限能够运行 docker 命令。考虑到安全问题,你不会想用 root 用户或使用 sudo 来运行 Docker 的。要解决这个问题,你需要将自己的用户加入到 docker 组中。命令如下:

sudo usermod -a -G docker $USER

完成操作后,登出系统然后再重新登录,应该就搞定了。不过若你的平台是 Fedora,则添加用户到 docker 组时会发现这个组是不存在的。那该怎么办呢?你需要首先创建这个组。命令如下:

sudo groupadd docker && sudo gpasswd -a ${USER} docker && sudo systemctl restart docker
newgrp docker

登出后再登录。就可以开始用 Docker 了。

启动,暂停以及启用 Docker

安装好 Docker 后,你可以让系统在启动时自动启动 Docker 守护进程。使用下面两个命令来实现这一点:

sudo systemctl start docker
sudo systemctl enable docker

若需要暂停或重启 Docker 守护进程,则命令为:

sudo systemctl stop docker
sudo systemctl restart docker

现在可以用 Docker 来部署容器了。

拉取镜像

对 Docker 来说,镜像是构建容器的基石。你可以拉下一个镜像(比如 NGINX)然后根据这个镜像部署任意多个容器出来。使用镜像前,你首先需要把镜像拉取到系统中。镜像从注册仓库中拉取,默认情况下安装好的 Docker 包含了一个默认的注册仓库 Docker Hub —— 这个注册仓库包含了大量别人所贡献的镜像(既包括官方的镜像,也包括用户自己贡献的镜像)。

假设你想要拉取一个 Nginx Web 服务器相关的镜像。在开始拉取前,先检查一下系统中已经有了哪些镜像。输入 docker images 命令你会发现现在还没有镜像存在(图 1)。

 title=

图 1:还没有镜像。

让我们来拉取一个镜像。使用下面命令可以从 Docker Hub 中下载 Nginx 镜像:

docker pull nginx

上面命令会从 Docker Hub 下载最新的(官方的) Nginx 镜像。现在再运行 docker images 命令就能看到有列出镜像了(图 2)。

 title=

图 2:NGINX 镜像已经被拉取下来了。

注意到我这里说的是“官方” Nginx 镜像了吗?在 Docker Hub 上有很多的非官方 Nginx 镜像。这些非官方镜像都是基于各种不同的目的而创建出来的。你可以使用下面过命令来搜索 Docker Hub 中的所有 Nginx 镜像:

docker search nginx

你会发现(图 3 中),有很多基于不同目的所创建的 Nginx 镜像(反向代理、PHP-FPM(LCTT 译注: FastCGI 进程管理器 FastCGI Process Manager 是一个 PHPFastCGI 管理器,旨在将 FastCGI 进程管理整合进 PHP 包中)功能、LetsEncrypt(LCTT 译注:由 ISRG 提供的免费 SSL 项目),Bitnami,在树莓派上使用的 Nginx 和 Drupal,等等很多很多)。

 title=

图 3:Docker Hub 上找到的各种 NGINX 镜像。

假设,你想要下载内建有反向代理功能的 Nginx 镜像,有个非官方的镜像 jwilder/nginx-proxy。因此输入下面命令来拉取这个镜像:

docker pull jwilder/nginx-proxy

再输入 docker images 命令来查看新拉下来的这个镜像(图 4)。

 title=

图 4:已经有了两种不同的 NGINX 镜像了。

处于谨慎考虑,我建议只使用官方镜像,毕竟你无法确定非官方镜像是否包含了恶意代码。

有了镜像后就可以用它来部署容器了。下次我们再聊聊如何通过这些 Nginx 镜像来发布容器。

Docker 是一个超级强力的系统可以让你的工作更简单,让你的公司更具有伸缩性,也更灵活。想知道 Docker 还能做什么,运行 man docker 然后阅读它的帮助文档吧。


via: https://www.linux.com/learn/intro-to-linux/2017/11/how-install-and-use-docker-linux

作者:Jack Wallen 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

当使用 Linux 下的 find 命令时,请使用 -ok 选项来避免文件被意外删除,这个选项会在移除任何文件之前都会请求你的许可。

最近有朋友提醒我有一个有用的选项来更加谨慎地运行 find 命令,它就是 -ok。除了一个重要的区别之外,它的工作方式与 -exec 相似,它使 find 命令在执行指定的操作之前请求权限。

这有一个例子。如果你使用 find 命令查找文件并删除它们,你可能使用的是下面的命令:

$ find . -name runme -exec rm {} \;

在当前目录及其子目录中中任何名为 “runme” 的文件都将被立即删除 —— 当然,你要有权限删除它们。改用 -ok 选项,你会看到类似这样的东西,但 find 命令将在删除文件之前会请求权限。回答 y 代表 “yes” 将允许 find 命令继续并逐个删除文件。

$ find . -name runme -ok rm {} \;
< rm ... ./bin/runme > ?

-execdir 命令也是一个选择

另一个可以用来修改 find 命令行为,并可能使其更可控的选项是 -execdir-exec 会运行指定的任何命令,而 -execdir 则从文件所在的目录运行指定的命令,而不是在运行find` 命令的目录运行指定的命令。这是两个它的例子:

$ pwd
/home/shs
$ find . -name runme -execdir pwd \;
/home/shs/bin
$ find . -name runme -execdir ls \;
ls rm runme

到现在为止还挺好。但要记住的是,-execdir 也会在匹配文件的目录中执行该命令。如果运行下面的命令,并且目录包含一个名为 “ls” 的文件,那么即使该文件没有执行权限,它也将运行该文件。使用 -exec-execdir 类似于通过 source 来运行命令。

$ find . -name runme -execdir ls \;
Running the /home/shs/bin/ls file
$ find . -name runme -execdir rm {} \;
This is an imposter rm command
$ ls -l bin
total 12
-r-x------ 1 shs shs 25 Oct 13 18:12 ls
-rwxr-x--- 1 shs shs 36 Oct 13 18:29 rm
-rw-rw-r-- 1 shs shs 28 Oct 13 18:55 runme
$ cat bin/ls
echo Running the $0 file
$ cat bin/rm
echo This is an imposter rm command

-okdir 选项也会请求权限

要更谨慎,可以使用 -okdir 选项。类似 -ok,该选项将请求权限来运行该命令。

$ find . -name runme -okdir rm {} \;
< rm ... ./bin/runme > ?

你也可以小心地指定你想用的命令的完整路径,以避免像上面那样的冒牌命令出现的任何问题。

$ find . -name runme -execdir /bin/rm {} \;

find 命令除了默认打印之外还有很多选项,有些可以使你的文件搜索更精确,但谨慎一点总是好的。

FacebookLinkedIn 上加入 Network World 社区来进行评论。


via: https://www.networkworld.com/article/3233305/linux/using-the-linux-find-command-with-caution.html

作者:Sandra Henry-Stocker 译者:geekpi 校对:Locez

本文由 LCTT 原创编译,Linux中国 荣誉推出

Ubuntu 和 Arch Linux 双启动不像听起来那么容易,然而,我将使这个过程尽可能地简单明了。首先,我们需要安装 Ubuntu,然后安装 Arch Linux,因为配置 Ubuntu grub 更容易实现 Ubuntu 和 Arch Linux 双启动。

Ubuntu 和 Arch Linux 双启动

你需要准备好以下内容:

1、你需要准备你所选择的 Ubuntu 的特色版本,在这个例子中,我将使用 Ubuntu 17.10 ISO 2、两个优盘 3、Windows 或者 Linux 操作系统的 PC 机 4、Arch Linux ISO 5、基于 Windows 的 Rufus 或是基于 Linux 发行版的 etcher 的两款软件中的一种,要根据自己的系统类型来选择哦。

​安装 Ubuntu

​首先, 利用 Rufus 为 Ubuntu 和 Arch Linux 创建可启动的闪存驱动器。另外,也可以使用 etcher 创建 Ubuntu 和 Arch Linux 的可启动闪存驱动器。

Ubuntu 可启动 USB 镜像写入工具

为 Ubuntu 选择 ISO 映像文件,然后选择闪存驱动器,然后单击 Flash! 创建可引导的闪存驱动器。等到它完成,瞧!你的可启动闪存驱动器已经准备好使用了。

在 linux 下创建 Ubuntu USB 启动程序

打开你的机器并使用载有 Ubuntu 安装媒体的可启动闪存驱动器进行启动。确保引导到 UEFI 或 BIOS 兼容模式,这取决于您所使用的 PC 的类型。我更喜欢使用 UEFI 来构建新的 PC。

live Ubuntu 启动

​在成功启动后,您将看到如上图显示,要求您尝试 Ubuntu 或安装 Ubuntu,选择安装 Ubuntu。 ​ 从可启动 USB 安装

然后检查安装第三方软件的图形和 WiFi 硬件、MP3 和其他媒体。如果你有一个互联网连接,你可以选择在安装 Ubuntu 的时候下载更新,因为它会节省安装时间,并且确保安装的是最新更新。

自定义磁盘分区安装 Ubuntu

​然后选择点击“Something else”,这样我们就可以对硬盘进行分区,并预留出 Ubuntu 和 Archlinux 的分区以及它们的交换分区的空间。 ​ 创建交换分区

​创建一个交换分区。最好是内存的一半大小。在我的例子中,我有 1 GB 的内存,因此创建一个 512 MB 的交换空间。

安装 Ubuntu 到根(/)分区

然后创建挂载点为 / 的分区,并且点击“Install Now”按钮。

选择时区

接下来选择你的位置以选择语言和键盘设置。

选择键盘布局

​然后创建新用户的用户凭据。 ​ 创建用户名、系统名并开始安装

​点击“Next”开始安装。 ​ ubuntu installation finishing

​当安装完成后点击“Restart Now”重启 PC。

完成 Ubuntu 安装并重启系统

​移除安装媒介,按下回车继续。

移除安装媒介

在确认成功安装后,重新启动并利用 Arch Linux 安装媒介引导。

​安装 Arch Linux

​在引导到 Arch Linux 安装媒体时,您应该看到如下所示的初始屏幕。选择 “Boot Arch Linux(x86\_64)”。注意 Arch Linux 更类似于一种 DIY(自我定制)的操作系统。 ​ Arch Linux 安装引导菜单

选择之后,它将打开一个tty1终端,您将使用它来安装操作系统。

tty终端

注意:为了成功安装 Arch Linux,您需要一个互联网连接来下载一些必须的系统安装包。所以我们需要检查一下互联网是否运行正常。输入以下命令到终端以检查网络连接。

ping linuxandubuntu.com -c 4

检查互联网连接

​如果互联网运行正常,你应该得到一个回显,显示发送和接收的数据包的数量。在这种情况下,我们发送了 4 个包,并得到了 4 个反馈,这意味着连接是正常的。

如果想在 Arch Linux 中设置 Wifi,请阅读本文以在 Arch Linux 中配置 Wifi。 ​ ​接下来,我们需要选择之前在安装 Ubuntu 时预留出的空闲分区。

fdisk -l

​上面的命令应该显示可用的磁盘分区在哪里。您应该能看到 Ubuntu 分区以及预留的空闲空间。我们将使用 cfdisk命令进行分区。

cfdisk

利用cfdisk命令安装 Arch 分区

执行命令后将看到分区情况。选择其它已分配分区下面的空闲空间。

您需要选择 “New”,然后输入分区大小。

为 Archlinux 分区

例如,9.3G - G 表示千兆字节。

挂载 Arch Linux 分区

如下图所示,选择“primary”进行分区

将 Arch Linux 的根(root)分区设置成主分区

然后选择写分区条目。

选择分区安装 Arch

​键入“yes”,以确认写入分区表。 ​ 确认创建分区并安装 Arch Linux

然后选择 “Quit”(退出)选项。

退出 Arch Linux 的‘cfdisk’ 然后键入:

fdisk -l

​确认修改。

确认分区修改

​然后使用磁盘分区命令: ​

mkfs.ext4 /dev/sda3

​确保您选择的分区是我们创建的最后一个分区,这样我们就不会破坏 Ubuntu 分区。 ​ 完成 Arch Linux 分区安装

​然后使用以下命令安装这个分区: ​

mount /dev/sda3 /mnt

安装基础分区

用下面命令创建“home”目录:

mkdir .mnt/home

安装家目录

​用以下命令安装“home”目录到这个分区上:

mount /dev/sda3 /mnt/home

安装家目录

现在使用以下命令安装 Archlinux 的基本系统:

pacstrap /mnt base

请确保网络连接正常。 ​

接下来开始下载和配置安装所用时间取决于你的网速。

安装Arch Linux 基础系统

这一步骤完成后,将完成 Archlinux 基本安装。

Arch Linux 基础系统安装完成后,使用以下命令创建一个 fstab 文件:

genfstab -U /mnt >> /mnt/etc/fstab

创建 fstab文件

在此之后,您需要验证fstab文件,使用下面命令:

cat /mnt/etc/fstab

查看 fstab 文件的终端显示

​配置 Arch Linux 的基础配置

您将需要在安装时配置以下内容:

  1. 系统语言和系统语言环境
  2. 系统时区
  3. Root 用户密码
  4. 设置主机名

首先,您需要使用以下命令将root切换为新安装的基础系统用户:

arch-chroot /mnt

1. 系统语言和系统语言环境

然后必须配置系统语言。必须取消对 en\_Utf-8 UTF-8的注释,并加载到文件 /etc/local.gen 中。

键入:

nano /etc/local.gen

然后将 en\_UTF-8 UTF-8 取消注释。

键入命令:

locale-gen

生成本地化设置如下:

生成本地化配置

相应的需要在 locale.conf 文件中配置 LANG 变量。例如:

nano /etc/locale.conf

​修改为:

LANG=en_US.UTF-8

配置键盘布局,则在文件 vconsole.conf 中进行更改,如下操作:

nano /etc/vconsole.conf

​修改为:

KEYMAP=us-eng

2. 系统时区

​配置时区需要利用以下命令实现:

ln -sf /usr/share/zoneinfo/Region/City /etc/localtime

要查看可用时区,可以在终端使用以下命令:

注意可选时区在屏幕截图中显示为蓝色:

ls /usr/share/zoneinfo

配置时区文件

配置地区

运行 hwclock 命令来生成 /etc/adjtime(假设硬件时钟被设置为 UTC):

# hwclock --systohc

3. 配置 root 用户密码

​要为 Arch Linux 系统用户 root 设置密码,请使用:

passwd

​为 root 用户提供一个新的密码并确认密码使其生效。

配置系统用户root密码

4. 配置主机名和网络

​需要创建主机名文件:

nano /etc/hostname

配置主机名

将名字更改为您的用户名:

set arch linux username

然后向主机添加一个匹配的条目:

nano /etc/hosts
127.0.0.1 localhost.localdomain localhost

::1 localhost.localdomain localhost

127.0.1.1 LinuxandUbuntu.localdomain LinuxandUbuntu

您需要使网络保持连接,然后使用:

systemctl enable dhcpd

配置 Grub

然后重启机器,进入 Ubuntu 配置 grub。

你可以键入:

reboot

安装完成后重启

Arch Linux 仍然没有出现,因此我们需要在 Ubuntu 中使用 update-grub 来安装它。

Ubuntu grub 菜单

在Ubuntu中打开终端,输入:

sudo update-grub

这将更新 grub,添加 Arch Linux 记录。

小结

祝贺您成功地将 Ubuntu 和 Arch Linux 设置为双引导。Ubuntu 安装很简单,但是 Arch Linux 安装对新的 Linux 用户来说是一个挑战。我试着让这个教程变得简单。但是如果你对这篇文章有任何疑问,请在评论部分告诉我。还可以与您的朋友分享这篇文章,并帮助他们学习 Linux。


via: http://www.linuxandubuntu.com/home/dual-boot-ubuntu-and-arch-linux

作者:LinuxAndUbuntu 译者:stevenzdg988 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我发现 Linux 下电池的寿命普遍要比 Windows 下要短。尽管如此,这可是 Linux,我们总会有有办法的。

现在来讲一下这个名叫 TLP 的小工具,它能帮你的设备省点电。

TLP - Linux 高级电源管理 是一个小巧的命令行工具,它通过对 Linux 系统执行一些调整来真正帮助延长电池的使用寿命。

sudo apt install tlp

install tlp in linux

对于其他的发行版,你可以阅读其官方网站上的指南。

安装完成之后,你只有在第一次的时候需要运行下面命令来启动 tlp。TLP 会在下次启动系统时自动运行。

start tlp on linux

​现在 TLP 已经被启动起来了,而且已经设置好了节省电池所需要的默认配置。我们可以查看该配置文件。文件路径为 /etc/default/tlp。我们需要编辑该文件来修改各项配置。

配置文件中有很多选项,要启用某个选项的话只需要删除行首的 # 就行了。每个选项能够赋予什么值都有说明。下面是你可能会用到的选项:

  • 自动休眠 USB 设备
  • 设定启动时启用/禁用无线设备
  • 降低硬盘转速
  • 关闭无线设备
  • 设置 CPU 以性能优先还是节能优先

结论

​TLP 是一个超棒的工具,可以延长 Linux 系统的电池使用寿命。我个人的经验是使用 TLP 能延长至少 30-40% 的电池使用寿命。


via: http://www.linuxandubuntu.com/home/save-some-battery-on-our-linux-machines-with-tlp

作者:LinuxAndUbuntu 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

 title=

Konstantin Ryabitsev 为你讲解哪个 Linux 内核版本可以被视作“稳定版”,以及你应该如何选择一个适用你的内核版本。

每次 Linus Torvalds 发布 一个新 Linux 内核的主线版本,几乎都会引起这种困惑,那就是到底哪个内核版本才是最新的“稳定版”?是新的那个 X.Y,还是前面的那个 X.Y-1.Z ?最新的内核版本是不是太“新”了?你是不是应该坚持使用以前的版本?

kernel.org 网页上的信息并不会帮你解开这个困惑。目前,在该页面的最顶部,我们看到是最新稳定版内核是 4.15 — 但是在这个表格的下面,4.14.16 也被列为“ 稳定版 stable ”,而 4.15 被列为“ 主线版本 mainline ”,很困惑,是吧?

不幸的是,这个问题并不好回答。我们在这里使用“稳定”这个词有两个不同的意思:一是,作为最初发布的 Git 树的名字,二是,表示这个内核可以被视作“稳定版”,用在“生产系统”。

由于 Git 的分布式特性,Linux 的开发工作在许多 不同的分叉仓库中 进行。所有的 bug 修复和新特性也是首先由各个子系统维护者收集和准备的,然后提交给 Linus Torvalds,由 Linus Torvalds 包含进 他自己的 Linux 树 中,他的 Git 树被认为是 Git 仓库的 “master”。我们称这个树为 “主线” Linux 树。

候选发布版(RC)

在每个新的内核版本发布之前,它都要经过几轮的“候选发布”,它由开发者进行测试并“打磨”所有的这些很酷的新特性。基于他们这几轮测试的反馈,Linus 决定最终版本是否已经准备就绪。通常有 7 个每周预发布版本,但是,这个数字经常走到 -rc8,并且有时候甚至达到 -rc9 及以上。当 Linus 确信那个新内核已经没有问题了,他就制作最终发行版,我们称这个版本为“稳定版”,表示它不再是一个“候选发布版”。

Bug 修复

就像任何一个由不是十全十美的人所写的复杂软件一样,任何一个 Linux 内核的新版本都包含 bug,并且这些 bug 必须被修复。Linux 内核的 bug 修复规则非常简单:所有修复必须首先进入到 Linus 的树。一旦主线仓库中的 bug 被修复后,它接着会被应用到内核开发社区仍在维护的已发布内核中。在它们被考虑回迁到已发布的稳定版本之前,所有的 bug 修复必须满足 一套重要的标准 — 标准的其中之一是,它们 “必须已经存在于 Linus 的树中”。这是一个 独立的 Git 仓库,维护它的用途是回迁 bug 修复,而它也被称为“稳定”树 —— 因为它用于跟踪以前发布的稳定内核。这个树由 Greg Kroah-Hartman 策划和维护。

最新的稳定内核

因此,无论在什么时候,为了查看最新的稳定内核而访问 kernel.org 网站时,你应该去使用那个在大黄色按钮所说的“最新的稳定内核”。

但是,你可能会惊奇地发现 —— 4.15 和 4.14.16 都是稳定版本,那么到底哪一个更“稳定”呢?有些人不愿意使用 “.0” 的内核发行版,因为他们认为这个版本并不足够“稳定”,直到最新的是 ".1" 的为止。很难证明或者反驳这种观点的对与错,并且这两种观点都有赞成或者反对的理由,因此,具体选择哪一个取决于你的喜好。

一方面,任何一个进入到稳定树的发行版都必须首先被接受进入主线内核版本中,并且随后会被回迁到已发行版本中。这意味着内核的主线版本相比稳定树中的发行版本来说,总包含有最新的 bug 修复,因此,如果你想使用的发行版包含的“已知 bug”最少,那么使用 “.0” 的主线发行版是最佳选择。

另一方面,主线版本增加了所有很酷的新特性 —— 而新特性也给它们带来了数量未知的“新 bug”,而这些“新 bug”在老的稳定版中是不会存在的。而新的、未知的 bug 是否比旧的、已知的但尚未修复的 bug 更加令人担心呢? —— 这取决于你的选择。不过需要说明的一点是,许多 bug 修复只对内核的主线版本进行了彻底的测试。当补丁回迁到旧内核时,它们可能会工作的很好,但是它们很少做与旧内核的集成测试工作。通常都假定,“以前的稳定版本”足够接近当前的确信可用于生产系统的主线版本。而实际上也确实是这样的,当然,这也更加说明了为什么选择“哪个内核版本更稳定”是件非常困难的事情了。

因此,从根本上说,我们并没有定量的或者定性的手段去明确的告诉你哪个内核版本更加稳定 —— 4.15 还是 4.14.16?我们能够做到的只是告诉你,它们具有“不同的稳定性”,(这个答案可能没有帮到你,但是,至少你明白了这些版本的差别是什么?)。

学习更多的 Linux 的知识,可以通过来自 Linux 基金会和 edX 的免费课程 "认识 Linux"


via: https://www.linux.com/blog/learn/2018/2/which-linux-kernel-version-stable

作者:KONSTANTIN RYABITSEV 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出