2018年10月

本教程将指导你在 Ubuntu 18.04 LTS 无头服务器上,一步一步地安装 Oracle VirtualBox。同时,本教程也将介绍如何使用 phpVirtualBox 去管理安装在无头服务器上的 VirtualBox 实例。phpVirtualBox 是 VirtualBox 的一个基于 Web 的前端工具。这个教程也可以工作在 Debian 和其它 Ubuntu 衍生版本上,如 Linux Mint。现在,我们开始。

前提条件

在安装 Oracle VirtualBox 之前,我们的 Ubuntu 18.04 LTS 服务器上需要满足如下的前提条件。

首先,逐个运行如下的命令来更新 Ubuntu 服务器。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade

接下来,安装如下的必需的包:

$ sudo apt install build-essential dkms unzip wget

安装完成所有的更新和必需的包之后,重启动 Ubuntu 服务器。

$ sudo reboot

在 Ubuntu 18.04 LTS 服务器上安装 VirtualBox

添加 Oracle VirtualBox 官方仓库。为此你需要去编辑 /etc/apt/sources.list 文件:

$ sudo nano /etc/apt/sources.list

添加下列的行。

在这里,我将使用 Ubuntu 18.04 LTS,因此我添加下列的仓库。

deb http://download.virtualbox.org/virtualbox/debian bionic contrib

用你的 Ubuntu 发行版的代码名字替换关键字 ‘bionic’,比如,‘xenial’、‘vivid’、‘utopic’、‘trusty’、‘raring’、‘quantal’、‘precise’、‘lucid’、‘jessie’、‘wheezy’、或 ‘squeeze‘。

然后,运行下列的命令去添加 Oracle 公钥:

$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -

对于 VirtualBox 的老版本,添加如下的公钥:

$ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -

接下来,使用如下的命令去更新软件源:

$ sudo apt update

最后,使用如下的命令去安装最新版本的 Oracle VirtualBox:

$ sudo apt install virtualbox-5.2

添加用户到 VirtualBox 组

我们需要去创建并添加我们的系统用户到 vboxusers 组中。你也可以单独创建用户,然后将它分配到 vboxusers 组中,也可以使用已有的用户。我不想去创建新用户,因此,我添加已存在的用户到这个组中。请注意,如果你为 virtualbox 使用一个单独的用户,那么你必须注销当前用户,并使用那个特定的用户去登入,来完成剩余的步骤。

我使用的是我的用户名 sk,因此,我运行如下的命令将它添加到 vboxusers 组中。

$ sudo usermod -aG vboxusers sk

现在,运行如下的命令去检查 virtualbox 内核模块是否已加载。

$ sudo systemctl status vboxdrv

正如你在上面的截屏中所看到的,vboxdrv 模块已加载,并且是已运行的状态!

对于老的 Ubuntu 版本,运行:

$ sudo /etc/init.d/vboxdrv status

如果 virtualbox 模块没有启动,运行如下的命令去启动它。

$ sudo /etc/init.d/vboxdrv setup

很好!我们已经成功安装了 VirtualBox 并启动了 virtualbox 模块。现在,我们继续来安装 Oracle VirtualBox 的扩展包。

安装 VirtualBox 扩展包

VirtualBox 扩展包为 VirtualBox 访客系统提供了如下的功能。

  • 虚拟的 USB 2.0 (EHCI) 驱动
  • VirtualBox 远程桌面协议(VRDP)支持
  • 宿主机网络摄像头直通
  • Intel PXE 引导 ROM
  • 对 Linux 宿主机上的 PCI 直通提供支持

这里为 VirtualBox 5.2.x 下载最新版的扩展包。

$ wget https://download.virtualbox.org/virtualbox/5.2.14/Oracle_VM_VirtualBox_Extension_Pack-5.2.14.vbox-extpack

使用如下的命令去安装扩展包:

$ sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.2.14.vbox-extpack

恭喜!我们已经成功地在 Ubuntu 18.04 LTS 服务器上安装了 Oracle VirtualBox 的扩展包。现在已经可以去部署虚拟机了。参考 virtualbox 官方指南,在命令行中开始创建和管理虚拟机。

然而,并不是每个人都擅长使用命令行。有些人可能希望在图形界面中去创建和使用虚拟机。不用担心!下面我们为你带来非常好用的 phpVirtualBox 工具!

关于 phpVirtualBox

phpVirtualBox 是一个免费的、基于 web 的 Oracle VirtualBox 后端。它是使用 PHP 开发的。用 phpVirtualBox 我们可以通过 web 浏览器从网络上的任意一个系统上,很轻松地创建、删除、管理、和执行虚拟机。

在 Ubuntu 18.04 LTS 上安装 phpVirtualBox

由于它是基于 web 的工具,我们需要安装 Apache web 服务器、PHP 和一些 php 模块。

为此,运行如下命令:

$ sudo apt install apache2 php php-mysql libapache2-mod-php php-soap php-xml

然后,从 下载页面 上下载 phpVirtualBox 5.2.x 版。请注意,由于我们已经安装了 VirtualBox 5.2 版,因此,同样的我们必须去安装 phpVirtualBox 的 5.2 版本。

运行如下的命令去下载它:

$ wget https://github.com/phpvirtualbox/phpvirtualbox/archive/5.2-0.zip

使用如下命令解压下载的安装包:

$ unzip 5.2-0.zip

这个命令将解压 5.2.0.zip 文件的内容到一个名为 phpvirtualbox-5.2-0 的文件夹中。现在,复制或移动这个文件夹的内容到你的 apache web 服务器的根文件夹中。

$ sudo mv phpvirtualbox-5.2-0/ /var/www/html/phpvirtualbox

给 phpvirtualbox 文件夹分配适当的权限。

$ sudo chmod 777 /var/www/html/phpvirtualbox/

接下来,我们开始配置 phpVirtualBox。

像下面这样复制示例配置文件。

$ sudo cp /var/www/html/phpvirtualbox/config.php-example /var/www/html/phpvirtualbox/config.php

编辑 phpVirtualBox 的 config.php 文件:

$ sudo nano /var/www/html/phpvirtualbox/config.php

找到下列行,并且用你的系统用户名和密码去替换它(就是前面的“添加用户到 VirtualBox 组中”节中使用的用户名)。

在我的案例中,我的 Ubuntu 系统用户名是 sk ,它的密码是 ubuntu

var $username = 'sk';
var $password = 'ubuntu';

保存并关闭这个文件。

接下来,创建一个名为 /etc/default/virtualbox 的新文件:

$ sudo nano /etc/default/virtualbox

添加下列行。用你自己的系统用户替换 sk

VBOXWEB_USER=sk

最后,重引导你的系统或重启下列服务去完成整个配置工作。

$ sudo systemctl restart vboxweb-service
$ sudo systemctl restart vboxdrv
$ sudo systemctl restart apache2

调整防火墙允许连接 Apache web 服务器

如果你在 Ubuntu 18.04 LTS 上启用了 UFW,那么在默认情况下,apache web 服务器是不能被任何远程系统访问的。你必须通过下列的步骤让 http 和 https 流量允许通过 UFW。

首先,我们使用如下的命令来查看在策略中已经安装了哪些应用:

$ sudo ufw app list
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH

正如你所见,Apache 和 OpenSSH 应该已经在 UFW 的策略文件中安装了。

如果你在策略中看到的是 Apache Full,说明它允许流量到达 80 和 443 端口:

$ sudo ufw app info "Apache Full"
Profile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.

Ports:
80,443/tcp

现在,运行如下的命令去启用这个策略中的 HTTP 和 HTTPS 的入站流量:

$ sudo ufw allow in "Apache Full"
Rules updated
Rules updated (v6)

如果你希望允许 https 流量,但是仅是 http (80) 的流量,运行如下的命令:

$ sudo ufw app info "Apache"

访问 phpVirtualBox 的 Web 控制台

现在,用任意一台远程系统的 web 浏览器来访问。

在地址栏中,输入:http://IP-address-of-virtualbox-headless-server/phpvirtualbox

在我的案例中,我导航到这个链接 – http://192.168.225.22/phpvirtualbox

你将看到如下的屏幕输出。输入 phpVirtualBox 管理员用户凭据。

phpVirtualBox 的默认管理员用户名和密码是 admin / admin

恭喜!你现在已经进入了 phpVirtualBox 管理面板了。

现在,你可以从 phpvirtualbox 的管理面板上,开始去创建你的 VM 了。正如我在前面提到的,你可以从同一网络上的任意一台系统上访问 phpVirtualBox 了,而所需要的仅仅是一个 web 浏览器和 phpVirtualBox 的用户名和密码。

如果在你的宿主机系统(不是访客机)的 BIOS 中没有启用虚拟化支持,phpVirtualBox 将只允许你去创建 32 位的访客系统。要安装 64 位的访客系统,你必须在你的宿主机的 BIOS 中启用虚拟化支持。在你的宿主机的 BIOS 中你可以找到一些类似于 “virtualization” 或 “hypervisor” 字眼的选项,然后确保它是启用的。

本文到此结束了,希望能帮到你。如果你找到了更有用的指南,共享出来吧。

还有一大波更好玩的东西即将到来,请继续关注!


via: https://www.ostechnix.com/install-oracle-virtualbox-ubuntu-16-04-headless-server/

作者:SK 选题:lujun9972 译者:qhwdw 校对:wxy

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

跟随这些逐步指导构建你自己的基于树莓派的 NAS 系统。

我将在接下来的这三篇文章中讲述如何搭建一个简便、实用的 NAS 云盘系统。我在这个中心化的存储系统中存储数据,并且让它每晚都会自动的备份增量数据。本系列文章将利用 NFS 文件系统将磁盘挂载到同一网络下的不同设备上,使用 Nextcloud 来离线访问数据、分享数据。

本文主要讲述将数据盘挂载到远程设备上的软硬件步骤。本系列第二篇文章将讨论数据备份策略、如何添加定时备份数据任务。最后一篇文章中我们将会安装 Nextcloud 软件,用户通过 Nextcloud 提供的 web 界面可以方便的离线或在线访问数据。本系列教程最终搭建的 NAS 云盘支持多用户操作、文件共享等功能,所以你可以通过它方便的分享数据,比如说你可以发送一个加密链接,跟朋友分享你的照片等等。

最终的系统架构如下图所示:

硬件

首先需要准备硬件。本文所列方案只是其中一种示例,你也可以按不同的硬件方案进行采购。

最主要的就是树莓派 3,它带有四核 CPU、1G RAM,以及(比较)快速的网络接口。数据将存储在两个 USB 磁盘驱动器上(这里使用 1TB 磁盘);其中一个磁盘用于每天数据存储,另一个用于数据备份。请务必使用有源 USB 磁盘驱动器或者带附加电源的 USB 集线器,因为树莓派无法为两个 USB 磁盘驱动器供电。

软件

在该社区中最活跃的操作系统当属 Raspbian,便于定制个性化项目。已经有很多 操作指南 讲述如何在树莓派中安装 Raspbian 系统,所以这里不再赘述。在撰写本文时,最新的官方支持版本是 Raspbian Stretch,它对我来说很好使用。

到此,我将假设你已经配置好了基本的 Raspbian 系统并且可以通过 ssh 访问到你的树莓派。

准备 USB 磁盘驱动器

为了更好地读写数据,我建议使用 ext4 文件系统去格式化磁盘。首先,你必须先找到连接到树莓派的磁盘。你可以在 /dev/sd/<x> 中找到磁盘设备。使用命令 fdisk -l,你可以找到刚刚连接的两块 USB 磁盘驱动器。请注意,操作下面的步骤将会清除 USB 磁盘驱动器上的所有数据,请做好备份。

pi@raspberrypi:~ $ sudo fdisk -l

<...>

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe8900690

Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1        2048 1953525167 1953523120 931.5G 83 Linux


Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6aa4f598

Device     Boot Start        End    Sectors   Size Id Type
/dev/sdb1  *     2048 1953521663 1953519616 931.5G  83 Linux

由于这些设备是连接到树莓派的唯一的 1TB 的磁盘,所以我们可以很容易的辨别出 /dev/sda/dev/sdb 就是那两个 USB 磁盘驱动器。每个磁盘末尾的分区表提示了在执行以下的步骤后如何查看,这些步骤将会格式化磁盘并创建分区表。为每个 USB 磁盘驱动器按以下步骤进行操作(假设你的磁盘也是 /dev/sda/dev/sdb,第二次操作你只要替换命令中的 sdasdb 即可)。

首先,删除磁盘分区表,创建一个新的并且只包含一个分区的新分区表。在 fdisk 中,你可以使用交互单字母命令来告诉程序你想要执行的操作。只需要在提示符 Command(m for help): 后输入相应的字母即可(可以使用 m 命令获得更多详细信息):

pi@raspberrypi:~ $ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): o
Created a new DOS disklabel with disk identifier 0x9c310964.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-1953525167, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-1953525167, default 1953525167):

Created a new partition 1 of type 'Linux' and of size 931.5 GiB.

Command (m for help): p

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9c310964

Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1        2048 1953525167 1953523120 931.5G 83 Linux

Command (m for help): w
The partition table has been altered.
Syncing disks.

现在,我们将用 ext4 文件系统格式化新创建的分区 /dev/sda1

pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done

<...>

Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

重复以上步骤后,让我们根据用途来对它们建立标签:

pi@raspberrypi:~ $ sudo e2label /dev/sda1 data
pi@raspberrypi:~ $ sudo e2label /dev/sdb1 backup

现在,让我们安装这些磁盘并存储一些数据。以我运营该系统超过一年的经验来看,当树莓派启动时(例如在断电后),USB 磁盘驱动器并不是总被挂载,因此我建议使用 autofs 在需要的时候进行挂载。

首先,安装 autofs 并创建挂载点:

pi@raspberrypi:~ $ sudo apt install autofs
pi@raspberrypi:~ $ sudo mkdir /nas

然后添加下面这行来挂载设备 /etc/auto.master

/nas    /etc/auto.usb

如果不存在以下内容,则创建 /etc/auto.usb,然后重新启动 autofs 服务:

data -fstype=ext4,rw :/dev/disk/by-label/data
backup -fstype=ext4,rw :/dev/disk/by-label/backup
pi@raspberrypi3:~ $ sudo service autofs restart

现在你应该可以分别访问 /nas/data 以及 /nas/backup 磁盘了。显然,到此还不会令人太兴奋,因为你只是擦除了磁盘中的数据。不过,你可以执行以下命令来确认设备是否已经挂载成功:

pi@raspberrypi3:~ $ cd /nas/data
pi@raspberrypi3:/nas/data $ cd /nas/backup
pi@raspberrypi3:/nas/backup $ mount
<...>
/etc/auto.usb on /nas type autofs (rw,relatime,fd=6,pgrp=463,timeout=300,minproto=5,maxproto=5,indirect)
<...>
/dev/sda1 on /nas/data type ext4 (rw,relatime,data=ordered)
/dev/sdb1 on /nas/backup type ext4 (rw,relatime,data=ordered)

首先进入对应目录以确保 autofs 能够挂载设备。autofs 会跟踪文件系统的访问记录,并随时挂载所需要的设备。然后 mount 命令会显示这两个 USB 磁盘驱动器已经挂载到我们想要的位置了。

设置 autofs 的过程容易出错,如果第一次尝试失败,请不要沮丧。你可以上网搜索有关教程。

挂载网络存储

现在你已经设置了基本的网络存储,我们希望将它安装到远程 Linux 机器上。这里使用 NFS 文件系统,首先在树莓派上安装 NFS 服务器:

pi@raspberrypi:~ $ sudo apt install nfs-kernel-server

然后,需要告诉 NFS 服务器公开 /nas/data 目录,这是从树莓派外部可以访问的唯一设备(另一个用于备份)。编辑 /etc/exports 添加如下内容以允许所有可以访问 NAS 云盘的设备挂载存储:

/nas/data *(rw,sync,no_subtree_check)

更多有关限制挂载到单个设备的详细信息,请参阅 man exports。经过上面的配置,任何人都可以访问数据,只要他们可以访问 NFS 所需的端口:1112049。我通过上面的配置,只允许通过路由器防火墙访问到我的家庭网络的 22 和 443 端口。这样,只有在家庭网络中的设备才能访问 NFS 服务器。

如果要在 Linux 计算机挂载存储,运行以下命令:

you@desktop:~ $ sudo mkdir /nas/data
you@desktop:~ $ sudo mount -t nfs <raspberry-pi-hostname-or-ip>:/nas/data /nas/data

同样,我建议使用 autofs 来挂载该网络设备。如果需要其他帮助,请参看 如何使用 Autofs 来挂载 NFS 共享

现在你可以在远程设备上通过 NFS 系统访问位于你树莓派 NAS 云盘上的数据了。在后面一篇文章中,我将介绍如何使用 rsync 自动将数据备份到第二个 USB 磁盘驱动器。你将会学到如何使用 rsync 创建增量备份,在进行日常备份的同时还能节省设备空间。


via: https://opensource.com/article/18/7/network-attached-storage-Raspberry-Pi

作者:Manuel Dewald 选题:lujun9972 译者:jrg 校对:wxy

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

本文作者 Greg Kroah-Hartman 是 Linux 稳定版内核的维护负责人。

很多人都问我这样的问题,在他们的产品/设备/笔记本/服务器等上面应该使用什么样的稳定版内核。一直以来,尤其是那些现在已经延长支持时间的内核,都是由我和其他人提供支持,因此,给出这个问题的答案并不是件容易的事情。在这篇文章我将尝试去给出我在这个问题上的看法。当然,你可以任意选用任何一个你想去使用的内核版本,这里只是我的建议。

和以前一样,在这里给出的这些看法只代表我个人的意见。

可选择的内核有哪些

下面列出了我建议你应该去使用的内核的列表,从最好的到最差的都有。我在下面将详细介绍,但是如果你只想得到一个结论,它就是你想要的:

建议你使用的内核的分级,从最佳的方案到最差的方案如下:

  • 你最喜欢的 Linux 发行版支持的内核
  • 最新的稳定版
  • 最新的 LTS (长期支持)版本
  • 仍然处于维护状态的老的 LTS 版本

绝对不要去使用的内核:

  • 不再维护的内核版本

给上面的列表给出具体的数字,今天是 2018 年 8 月 24 日,kernel.org 页面上可以看到是这样:

因此,基于上面的列表,那它应该是:

  • 4.18.5 是最新的稳定版
  • 4.14.67 是最新的 LTS 版本
  • 4.9.124、4.4.152、以及 3.16.57 是仍然处于维护状态的老的 LTS 版本
  • 4.17.19 和 3.18.119 是过去 60 天内有过发布的 “生命周期终止” 的内核版本,它们仍然保留在 kernel.org 站点上,是为了仍然想去使用它们的那些人。

非常容易,对吗?

Ok,现在我给出这样选择的一些理由:

Linux 发行版内核

对于大多数 Linux 用户来说,最好的方案就是使用你喜欢的 Linux 发行版的内核。就我本人而言,我比较喜欢基于社区的、内核不断滚动升级的用最新内核的 Linux 发行版,并且它也是由开发者社区来支持的。这种类型的发行版有 Fedora、openSUSE、Arch、Gentoo、CoreOS,以及其它的。

所有这些发行版都使用了上游的最新的稳定版内核,并且确保定期打了需要的 bug 修复补丁。当它拥有了最新的修复之后(记住所有的修复都是安全修复),这就是你可以使用的最安全、最好的内核之一。

有些社区的 Linux 发行版需要很长的时间才发行一个新内核版本,但是最终发行的版本和所支持的内核都是非常好的。这些也都非常好用,Debian 和 Ubuntu 就是这样的例子。

如果我没有在这里列出你所喜欢的发行版,并不是意味着它们的内核不够好。查看这些发行版的网站,确保它们的内核包是不断应用最新的安全补丁进行升级过的,那么它就应该是很好的。

许多人好像喜欢旧式、“传统” 模式的发行版,使用 RHEL、SLES、CentOS 或者 “LTS” Ubuntu 发行版。这些发行版挑选一个特定的内核版本,然后使用好几年,甚至几十年。他们反向移植了最新的 bug 修复,有时也有一些内核的新特性,所有的只是追求堂吉诃德式的保持版本号不变而已,尽管他们已经在那个旧的内核版本上做了成千上万的变更。这项工作是一项真正吃力不讨好的工作,分配到这些任务的开发人员做了一些精彩的工作才能实现这些目标。所以如果你希望永远不看到你的内核版本号发生过变化,那么就使用这些发行版。他们通常会为使用而付出一些钱,当发生错误时能够从这些公司得到一些支持,那就是值得的。

所以,你能使用的最好的内核是你可以求助于别人,而别人可以为你提供支持的内核。使用那些支持,你通常都已经为它支付过费用了(对于企业发行版),而这些公司也知道他们职责是什么。

但是,如果你不希望去依赖别人,而是希望你自己管理你的内核,或者你有发行版不支持的硬件,那么你应该去使用最新的稳定版:

最新的稳定版

最新的稳定版内核是 Linux 内核开发者社区宣布为“稳定版”的最新的一个内核。大约每三个月,社区发行一个包含了对所有新硬件支持的、新的稳定版内核,最新版的内核不但改善内核性能,同时还包含内核各部分的 bug 修复。接下来的三个月之后,进入到下一个内核版本的 bug 修复将被反向移植进入这个稳定版内核中,因此,使用这个内核版本的用户将确保立即得到这些修复。

最新的稳定版内核通常也是主流社区发行版所使用的内核,因此你可以确保它是经过测试和拥有大量用户使用的内核。另外,内核社区(全部开发者超过 4000 人)也将帮助这个发行版提供对用户的支持,因为这是他们做的最新的一个内核。

三个月之后,将发行一个新的稳定版内核,你应该去更新到它以确保你的内核始终是最新的稳定版,因为当最新的稳定版内核发布之后,对你的当前稳定版内核的支持通常会落后几周时间。

如果你在上一个 LTS (长期支持)版本发布之后购买了最新的硬件,为了能够支持最新的硬件,你几乎是绝对需要去运行这个最新的稳定版内核。对于台式机或新的服务器,最新的稳定版内核通常是推荐运行的内核。

最新的 LTS 版本

如果你的硬件为了保证正常运行(像大多数的嵌入式设备),需要依赖供应商的源码 树外 out-of-tree 的补丁,那么对你来说,最好的内核版本是最新的 LTS 版本。这个版本拥有所有进入稳定版内核的最新 bug 修复,以及大量的用户测试和使用。

请注意,这个最新的 LTS 版本没有新特性,并且也几乎不会增加对新硬件的支持,因此,如果你需要使用一个新设备,那你的最佳选择就是最新的稳定版内核,而不是最新的 LTS 版内核。

另外,对于这个 LTS 版本的用户来说,他也不用担心每三个月一次的“重大”升级。因此,他们将一直坚持使用这个 LTS 版本,并每年升级一次,这是一个很好的实践。

使用这个 LTS 版本的不利方面是,你没法得到在最新版本内核上实现的内核性能提升,除非在未来的一年中,你升级到下一个 LTS 版内核。

另外,如果你使用的这个内核版本有问题,你所做的第一件事情就是向任意一位内核开发者报告发生的问题,并向他们询问,“最新的稳定版内核中是否也存在这个问题?”并且,你需要意识到,对它的支持不会像使用最新的稳定版内核那样容易得到。

现在,如果你坚持使用一个有大量的补丁集的内核,并且不希望升级到每年一次的新 LTS 版内核上,那么,或许你应该去使用老的 LTS 版内核:

老的 LTS 版本

传统上,这些版本都由社区提供 2 年时间的支持,有时候当一个重要的 Linux 发行版(像 Debian 或 SLES)依赖它时,这个支持时间会更长。然而在过去一年里,感谢 Google、Linaro、Linaro 成员公司、kernelci.org、以及其它公司在测试和基础设施上的大量投入,使得这些老的 LTS 版内核得到更长时间的支持。

最新的 LTS 版本以及它们将被支持多长时间,这是 2018 年 8 月 24 日显示在 kernel.org/category/releases.html 上的信息:

Google 和其它公司希望这些内核使用的时间更长的原因是,由于现在几乎所有的 SoC 芯片的疯狂的(也有人说是打破常规)开发模型。这些设备在芯片发行前几年就启动了他们的开发周期,而那些代码从来不会合并到上游,最终结果是新打造的芯片是基于一个 2 年以前的老内核发布的。这些 SoC 的代码树通常增加了超过 200 万行的代码,这使得它们成为我们前面称之为“类 Linux 内核“的东西。

如果在 2 年后,这个 LTS 版本停止支持,那么来自社区的支持将立即停止,并且没有人对它再进行 bug 修复。这导致了在全球各地数以百万计的非常不安全的设备仍然在使用中,这对任何生态系统来说都不是什么好事情。

由于这种依赖,这些公司现在要求新设备不断更新到最新的 LTS 版本——这些为它们特定发布的版本(例如现在的每个 4.9.y 版本)。其中一个这样的例子就是新 Android 设备对内核版本的要求,这些新设备所带的 “Andrid O” 版本(和现在的 “Android P” 版本)指定了最低允许使用的内核版本,并且 Andoird 安全更新版本也开始越来越频繁在设备上要求使用这些 “.y” 版本。

我注意到一些生产商现在已经在做这些事情。Sony 是其中一个非常好的例子,在他们的大多数新手机上,通过他们每季度的安全更新版本,将设备更新到最新的 4.4.y 发行版上。另一个很好的例子是一家小型公司 Essential,据我所知,他们持续跟踪 4.4.y 版本的速度比其它公司都快。

当使用这种老的内核时有个重大警告。反向移植到这种内核中的安全修复不如最新版本的 LTS 内核多,因为这些使用老的 LTS 内核的设备的传统模式是一个更加简化的用户模式。这些内核不能用于任何“通用计算”模式中,在这里用的是 不可信用户 untrusted user 或虚拟机,极大地削弱了对老的内核做像最近的 Spectre 这样的修复的能力,如果在一些分支中存在这样的 bug 的话。

因此,仅在你能够完全控制的设备,或者限定在一个非常强大的安全模型(像 Android 一样强制使用 SELinux 和应用程序隔离)时使用老的 LTS 版本。绝对不要在有不可信用户/程序,或虚拟机的服务器上使用这些老的 LTS 版内核。

此外,如果社区对它有支持的话,社区对这些老的 LTS 版内核相比正常的 LTS 版内核的支持要少的多。如果你使用这些内核,那么你只能是一个人在战斗,你需要有能力去独自支持这些内核,或者依赖你的 SoC 供应商为你提供支持(需要注意的是,几乎没有供应商会为你提供支持,因此,你要特别注意 ……)。

不再维护的内核发行版

更让人感到惊讶的事情是,许多公司只是随便选一个内核发行版,然后将它封装到它们的产品里,并将它毫不犹豫地承载到数十万的部件中。其中一个这样的糟糕例子是 Lego Mindstorm 系统,不知道是什么原因在它们的设备上随意选取了一个 -rc 的内核发行版。-rc 的发行版是开发中的版本,根本没有 Linux 内核开发者认为它适合任何人使用,更不用说是数百万的用户了。

当然,如果你愿意,你可以随意地使用它,但是需要注意的是,可能真的就只有你一个人在使用它。社区不会为你提供支持,因为他们不可能关注所有内核版本的特定问题,因此如果出现错误,你只能独自去解决它。对于一些公司和系统来说,这么做可能还行,但是如果没有为此有所规划,那么要当心因此而产生的“隐性”成本。

总结

基于以上原因,下面是一个针对不同类型设备的简短列表,这些设备我推荐适用的内核如下:

  • 笔记本 / 台式机:最新的稳定版内核
  • 服务器:最新的稳定版内核或最新的 LTS 版内核
  • 嵌入式设备:最新的 LTS 版内核或老的 LTS 版内核(如果使用的安全模型非常强大和严格)

至于我,在我的机器上运行什么样的内核?我的笔记本运行的是最新的开发版内核(即 Linus 的开发树)再加上我正在做修改的内核,我的服务器上运行的是最新的稳定版内核。因此,尽管我负责 LTS 发行版的支持工作,但我自己并不使用 LTS 版内核,除了在测试系统上。我依赖于开发版和最新的稳定版内核,以确保我的机器运行的是目前我们所知道的最快的也是最安全的内核版本。


via: http://kroah.com/log/blog/2018/08/24/what-stable-kernel-should-i-use/

作者:Greg Kroah-Hartman 选题:lujun9972 译者:qhwdw 校对:wxy

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

我们总在寻找一个更好用且更高效的解决方案,来我们的生活理加方便。 比方说,在处理 PDF 文档时,你肯定会想拥有一款工具,它能够在任何情形下都显得快速可靠。在这,我们想向你推荐 EasyPDF —— 一款可以胜任所有场合的在线 PDF 软件。通过大量的测试,我们可以保证:这款工具能够让你的 PDF 文档管理更加容易。

不过,关于 EasyPDF 有一些十分重要的事情,你必须知道。

  • EasyPDF 是免费的、匿名的在线 PDF 转换软件。
  • 能够将 PDF 文档转换成 Word、Excel、PowerPoint、AutoCAD、JPG、GIF 和文本等格式格式的文档。
  • 能够从 Word、Excel、PowerPoint 等其他格式的文件创建 PDF 文件。
  • 能够进行 PDF 文档的合并、分割和压缩。
  • 能够识别扫描的 PDF 和图片中的内容。
  • 可以从你的设备或者云存储(Google Drive 和 DropBox)中上传文档。
  • 可以在 Windows、Linux、Mac 和智能手机上通过浏览器来操作。
  • 支持多种语言。

EasyPDF的用户界面

EasyPDF 最吸引你眼球的就是平滑的用户界面,营造一种整洁的环境,这会让使用者感觉更加舒服。由于网站完全没有一点广告,EasyPDF 的整体使用体验相比以前会好很多。

每种不同类型的转换都有它们专门的菜单,只需要简单地向其中添加文件,你并不需要知道太多知识来进行操作。

许多类似网站没有做好相关的优化,使得在手机上的使用体验并不太友好。然而,EasyPDF 突破了这一个瓶颈。在智能手机上,EasyPDF 几乎可以秒开,并且可以顺畅的操作。你也通过 Chrome 的“三点菜单”把 EasyPDF 添加到手机的主屏幕上。

特性

除了好看的界面,EasyPDF 还非常易于使用。为了使用它,你 不需要注册一个账号 或者留下一个邮箱,它是完全匿名的。另外, EasyPDF 也不会对要转换的文件进行数量或者大小的限制,完全不需要安装!酷极了,不是吗?

首先,你需要选择一种想要进行的格式转换,比如,将 PDF 转换成 Word。然后,选择你想要转换的 PDF 文件。你可以通过两种方式来上传文件:直接拖拉或者从设备上的文件夹进行选择。还可以选择从Google DriveDropbox来上传文件。

选择要进行格式转换的文件后,点击 Convert 按钮开始转换过程。转换过程会在一分钟内完成,你并不需要等待太长时间。如果你还有对其他文件进行格式转换,在接着转换前,不要忘了将前面已经转换完成的文件下载保存。不然的话,你将会丢失前面的文件。

要进行其他类型的格式转换,直接返回到主页。

目前支持的几种格式转换类型如下:

  • PDF to Word – 将 PDF 文档 转换成 Word 文档
  • PDF 转换成 PowerPoint – 将 PDF 文档 转换成 PowerPoint 演示讲稿
  • PDF 转换成 Excel – 将 PDF 文档 转换成 Excel 文档
  • PDF 创建 – 从一些其他类型的文件(如,文本、doc、odt)来创建PDF文档
  • Word 转换成 PDF – 将 Word 文档 转换成 PDF 文档
  • JPG 转换成 PDF – 将 JPG images 转换成 PDF 文档
  • PDF 转换成 AutoCAD – 将 PDF 文档 转换成 .dwg 格式(DWG 是 CAD 文件的原生的格式)
  • PDF 转换成 Text – 将 PDF 文档 转换成 Text 文档
  • PDF 分割 – 把 PDF 文件分割成多个部分
  • PDF 合并 – 把多个 PDF 文件合并成一个文件
  • PDF 压缩 – 将 PDF 文档进行压缩
  • PDF 转换成 JPG – 将 PDF 文档 转换成 JPG 图片
  • PDF 转换成 PNG – 将 PDF 文档 转换成 PNG 图片
  • PDF 转换成 GIF – 将 PDF 文档 转换成 GIF 文件
  • 在线文字内容识别 – 将扫描的纸质文档转换成能够进行编辑的文件(如,Word、Excel、文本)

想试一试吗?好极了!点击下面的链接,然后开始格式转换吧!

总结

EasyPDF 名符其实,能够让 PDF 管理更加容易。就我测试过的 EasyPDF 服务而言,它提供了完全免费的简单易用的转换功能。它十分快速、安全和可靠。你会对它的服务质量感到非常满意,因为它不用支付任何费用,也不用留下像邮箱这样的个人信息。值得一试,也许你会找到你自己更喜欢的 PDF 工具。

好吧,我就说这些。更多的好东西还在后后面,请继续关注!

加油!


via: https://www.ostechnix.com/easypdf-a-free-and-secure-online-pdf-conversion-suite/

作者:SK 选题:lujun9972 译者:zhousiyu325 校对:wxy

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

Anthony Starks 使用他出色的 Deck 演示工具重构了我原来的基于 Google Slides 的幻灯片。你可以在他的博客上查看他重构后的幻灯片,
mindchunk.blogspot.com.au/2014/06/remixing-with-deck

我最近被邀请在 Gocon 发表演讲,这是一个每半年在日本东京举行的 Go 的精彩大会。Gocon 2014 是一个完全由社区驱动的为期一天的活动,由培训和一整个下午的围绕着生产环境中的 Go 这个主题的演讲组成.(LCTT 译注:本文发表于 2014 年)

以下是我的讲义。原文的结构能让我缓慢而清晰的演讲,因此我已经编辑了它使其更可读。

我要感谢 Bill Kennedy 和 Minux Ma,特别是 Josh Bleecher Snyder,感谢他们在我准备这次演讲中的帮助。


大家下午好。

我叫 David.

我很高兴今天能来到 Gocon。我想参加这个会议已经两年了,我很感谢主办方能提供给我向你们演讲的机会。

Gocon 2014

我想以一个问题开始我的演讲。

为什么选择 Go?

当大家讨论学习或在生产环境中使用 Go 的原因时,答案不一而足,但因为以下三个原因的最多。

Gocon 2014

这就是 TOP3 的原因。

第一,并发。

Go 的 并发原语 Concurrency Primitives 对于来自 Nodejs,Ruby 或 Python 等单线程脚本语言的程序员,或者来自 C++ 或 Java 等重量级线程模型的语言都很有吸引力。

易于部署。

我们今天从经验丰富的 Gophers 那里听说过,他们非常欣赏部署 Go 应用的简单性。

Gocon 2014

然后是性能。

我相信人们选择 Go 的一个重要原因是它 快。

Gocon 2014 (4)

在今天的演讲中,我想讨论五个有助于提高 Go 性能的特性。

我还将与大家分享 Go 如何实现这些特性的细节。

Gocon 2014 (5)

我要谈的第一个特性是 Go 对于值的高效处理和存储。

Gocon 2014 (6)

这是 Go 中一个值的例子。编译时,gocon 正好消耗四个字节的内存。

让我们将 Go 与其他一些语言进行比较

Gocon 2014 (7)

由于 Python 表示变量的方式的开销,使用 Python 存储相同的值会消耗六倍的内存。

Python 使用额外的内存来跟踪类型信息,进行 引用计数 Reference Counting 等。

让我们看另一个例子:

Gocon 2014 (8)

与 Go 类似,Java 消耗 4 个字节的内存来存储 int 型。

但是,要在像 ListMap 这样的集合中使用此值,编译器必须将其转换为 Integer 对象。

Gocon 2014 (9)

因此,Java 中的整数通常消耗 16 到 24 个字节的内存。

为什么这很重要? 内存便宜且充足,为什么这个开销很重要?

Gocon 2014 (10)

这是一张显示 CPU 时钟速度与内存总线速度的图表。

请注意 CPU 时钟速度和内存总线速度之间的差距如何继续扩大。

两者之间的差异实际上是 CPU 花费多少时间等待内存。

Gocon 2014 (11)

自 1960 年代后期以来,CPU 设计师已经意识到了这个问题。

他们的解决方案是一个缓存,一个更小、更快的内存区域,介入 CPU 和主存之间。

Gocon 2014 (12)

这是一个 Location 类型,它保存物体在三维空间中的位置。它是用 Go 编写的,因此每个 Location 只消耗 24 个字节的存储空间。

我们可以使用这种类型来构造一个容纳 1000 个 Location 的数组类型,它只消耗 24000 字节的内存。

在数组内部,Location 结构体是顺序存储的,而不是随机存储的 1000 个 Location 结构体的指针。

这很重要,因为现在所有 1000 个 Location 结构体都按顺序放在缓存中,紧密排列在一起。

Gocon 2014 (13)

Go 允许您创建紧凑的数据结构,避免不必要的填充字节。

紧凑的数据结构能更好地利用缓存。

更好的缓存利用率可带来更好的性能。

Gocon 2014 (14)

函数调用不是无开销的。

Gocon 2014 (15)

调用函数时会发生三件事。

创建一个新的 栈帧 Stack Frame ,并记录调用者的详细信息。

在函数调用期间可能被覆盖的任何寄存器都将保存到栈中。

处理器计算函数的地址并执行到该新地址的分支。

Gocon 2014 (16)

由于函数调用是非常常见的操作,因此 CPU 设计师一直在努力优化此过程,但他们无法消除开销。

函调固有开销,或重于泰山,或轻于鸿毛,这取决于函数做了什么。

减少函数调用开销的解决方案是 内联 Inlining

Gocon 2014 (17)

Go 编译器通过将函数体视为调用者的一部分来内联函数。

内联也有成本,它增加了二进制文件大小。

只有当调用开销与函数所做工作关联度的很大时内联才有意义,因此只有简单的函数才能用于内联。

复杂的函数通常不受调用它们的开销所支配,因此不会内联。

Gocon 2014 (18)

这个例子显示函数 Double 调用 util.Max

为了减少调用 util.Max 的开销,编译器可以将 util.Max 内联到 Double 中,就象这样

Gocon 2014 (19)

内联后不再调用 util.Max,但是 Double 的行为没有改变。

内联并不是 Go 独有的。几乎每种编译或及时编译的语言都执行此优化。但是 Go 的内联是如何实现的?

Go 实现非常简单。编译包时,会标记任何适合内联的小函数,然后照常编译。

然后函数的源代码和编译后版本都会被存储。

Gocon 2014 (20)

此幻灯片显示了 util.a 的内容。源代码已经过一些转换,以便编译器更容易快速处理。

当编译器编译 Double 时,它看到 util.Max 可内联的,并且 util.Max 的源代码是可用的。

就会替换原函数中的代码,而不是插入对 util.Max 的编译版本的调用。

拥有该函数的源代码可以实现其他优化。

Gocon 2014 (21)

在这个例子中,尽管函数 Test 总是返回 false,但 Expensive 在不执行它的情况下无法知道结果。

Test 被内联时,我们得到这样的东西。

Gocon 2014 (22)

编译器现在知道 Expensive 的代码无法访问。

这不仅节省了调用 Test 的成本,还节省了编译或运行任何现在无法访问的 Expensive 代码。

Go 编译器可以跨文件甚至跨包自动内联函数。还包括从标准库调用的可内联函数的代码。

Gocon 2014 (23)

强制垃圾回收 Mandatory Garbage Collection 使 Go 成为一种更简单,更安全的语言。

这并不意味着垃圾回收会使 Go 变慢,或者垃圾回收是程序速度的瓶颈。

这意味着在堆上分配的内存是有代价的。每次 GC 运行时都会花费 CPU 时间,直到释放内存为止。

Gocon 2014 (24)

然而,有另一个地方分配内存,那就是栈。

与 C 不同,它强制您选择是否将值通过 malloc 将其存储在堆上,还是通过在函数范围内声明将其储存在栈上;Go 实现了一个名为 逃逸分析 Escape Analysis 的优化。

Gocon 2014 (25)

逃逸分析决定了对一个值的任何引用是否会从被声明的函数中逃逸。

如果没有引用逃逸,则该值可以安全地存储在栈中。

存储在栈中的值不需要分配或释放。

让我们看一些例子

Gocon 2014 (26)

Sum 返回 1 到 100 的整数的和。这是一种相当不寻常的做法,但它说明了逃逸分析的工作原理。

因为切片 numbers 仅在 Sum 内引用,所以编译器将安排到栈上来存储的 100 个整数,而不是安排到堆上。

没有必要回收 numbers,它会在 Sum 返回时自动释放。

Gocon 2014 (27)

第二个例子也有点尬。在 CenterCursor 中,我们创建一个新的 Cursor 对象并在 c 中存储指向它的指针。

然后我们将 c 传递给 Center() 函数,它将 Cursor 移动到屏幕的中心。

最后我们打印出那个 ‘Cursor` 的 X 和 Y 坐标。

即使 cnew 函数分配了空间,它也不会存储在堆上,因为没有引用 c 的变量逃逸 CenterCursor 函数。

Gocon 2014 (28)

默认情况下,Go 的优化始终处于启用状态。可以使用 -gcflags = -m 开关查看编译器的逃逸分析和内联决策。

因为逃逸分析是在编译时执行的,而不是运行时,所以无论垃圾回收的效率如何,栈分配总是比堆分配快。

我将在本演讲的其余部分详细讨论栈。

Gocon 2014 (30)

Go 有 goroutine。 这是 Go 并发的基石。

我想退一步,探索 goroutine 的历史。

最初,计算机一次运行一个进程。在 60 年代,多进程或 分时 Time Sharing 的想法变得流行起来。

在分时系统中,操作系统必须通过保护当前进程的现场,然后恢复另一个进程的现场,不断地在这些进程之间切换 CPU 的注意力。

这称为 进程切换。

Gocon 2014 (29)

进程切换有三个主要开销。

首先,内核需要保护该进程的所有 CPU 寄存器的现场,然后恢复另一个进程的现场。

内核还需要将 CPU 的映射从虚拟内存刷新到物理内存,因为这些映射仅对当前进程有效。

最后是操作系统 上下文切换 Context Switch 的成本,以及 调度函数 Scheduler Function 选择占用 CPU 的下一个进程的开销。

Gocon 2014 (31)

现代处理器中有数量惊人的寄存器。我很难在一张幻灯片上排开它们,这可以让你知道保护和恢复它们需要多少时间。

由于进程切换可以在进程执行的任何时刻发生,因此操作系统需要存储所有寄存器的内容,因为它不知道当前正在使用哪些寄存器。

Gocon 2014 (32)

这导致了线程的出生,这些线程在概念上与进程相同,但共享相同的内存空间。

由于线程共享地址空间,因此它们比进程更轻,因此创建速度更快,切换速度更快。

Gocon 2014 (33)

Goroutine 升华了线程的思想。

Goroutine 是 协作式调度 Cooperative Scheduled <br/> 的,而不是依靠内核来调度。

当对 Go 运行时调度器 Runtime Scheduler 进行显式调用时,goroutine 之间的切换仅发生在明确定义的点上。

编译器知道正在使用的寄存器并自动保存它们。

Gocon 2014 (34)

虽然 goroutine 是协作式调度的,但运行时会为你处理。

Goroutine 可能会给禅让给其他协程时刻是:

  • 阻塞式通道发送和接收。
  • Go 声明,虽然不能保证会立即调度新的 goroutine。
  • 文件和网络操作式的阻塞式系统调用。
  • 在被垃圾回收循环停止后。

Gocon 2014 (35)

这个例子说明了上一张幻灯片中描述的一些调度点。

箭头所示的线程从左侧的 ReadFile 函数开始。遇到 os.Open,它在等待文件操作完成时阻塞线程,因此调度器将线程切换到右侧的 goroutine。

继续执行直到从通道 c 中读,并且此时 os.Open 调用已完成,因此调度器将线程切换回左侧并继续执行 file.Read 函数,然后又被文件 IO 阻塞。

调度器将线程切换回右侧以进行另一个通道操作,该操作在左侧运行期间已解锁,但在通道发送时再次阻塞。

最后,当 Read 操作完成并且数据可用时,线程切换回左侧。

Gocon 2014 (36)

这张幻灯片显示了低级语言描述的 runtime.Syscall 函数,它是 os 包中所有函数的基础。

只要你的代码调用操作系统,就会通过此函数。

entersyscall 的调用通知运行时该线程即将阻塞。

这允许运行时启动一个新线程,该线程将在当前线程被阻塞时为其他 goroutine 提供服务。

这导致每 Go 进程的操作系统线程相对较少,Go 运行时负责将可运行的 Goroutine 分配给空闲的操作系统线程。

Gocon 2014 (37)

在上一节中,我讨论了 goroutine 如何减少管理许多(有时是数十万个并发执行线程)的开销。

Goroutine故事还有另一面,那就是栈管理,它引导我进入我的最后一个话题。

Gocon 2014 (39)

这是一个进程的内存布局图。我们感兴趣的关键是堆和栈的位置。

传统上,在进程的地址空间内,堆位于内存的底部,位于程序(代码)的上方并向上增长。

栈位于虚拟地址空间的顶部,并向下增长。

Gocon 2014 (40)

因为堆和栈相互覆盖的结果会是灾难性的,操作系统通常会安排在栈和堆之间放置一个不可写内存区域,以确保如果它们发生碰撞,程序将中止。

这称为保护页,有效地限制了进程的栈大小,通常大约为几兆字节。

Gocon 2014 (41)

我们已经讨论过线程共享相同的地址空间,因此对于每个线程,它必须有自己的栈。

由于很难预测特定线程的栈需求,因此为每个线程的栈和保护页面保留了大量内存。

希望是这些区域永远不被使用,而且防护页永远不会被击中。

缺点是随着程序中线程数的增加,可用地址空间的数量会减少。

Gocon 2014 (42)

我们已经看到 Go 运行时将大量的 goroutine 调度到少量线程上,但那些 goroutines 的栈需求呢?

Go 编译器不使用保护页,而是在每个函数调用时插入一个检查,以检查是否有足够的栈来运行该函数。如果没有,运行时可以分配更多的栈空间。

由于这种检查,goroutines 初始栈可以做得更小,这反过来允许 Go 程序员将 goroutines 视为廉价资源。

Gocon 2014 (43)

这是一张显示了 Go 1.2 如何管理栈的幻灯片。

G 调用 H 时,没有足够的空间让 H 运行,所以运行时从堆中分配一个新的栈帧,然后在新的栈段上运行 H。当 H 返回时,栈区域返回到堆,然后返回到 G

Gocon 2014 (44)

这种管理栈的方法通常很好用,但对于某些类型的代码,通常是递归代码,它可能导致程序的内部循环跨越这些栈边界之一。

例如,在程序的内部循环中,函数 G 可以在循环中多次调用 H

每次都会导致栈拆分。 这被称为 热分裂 Hot Split 问题。

Gocon 2014 (45)

为了解决热分裂问题,Go 1.3 采用了一种新的栈管理方法。

如果 goroutine 的栈太小,则不会添加和删除其他栈段,而是分配新的更大的栈。

旧栈的内容被复制到新栈,然后 goroutine 使用新的更大的栈继续运行。

在第一次调用 H 之后,栈将足够大,对可用栈空间的检查将始终成功。

这解决了热分裂问题。

Gocon 2014 (46)

值,内联,逃逸分析,Goroutines 和分段/复制栈。

这些是我今天选择谈论的五个特性,但它们绝不是使 Go 成为快速的语言的唯一因素,就像人们引用他们学习 Go 的理由的三个原因一样。

这五个特性一样强大,它们不是孤立存在的。

例如,运行时将 goroutine 复用到线程上的方式在没有可扩展栈的情况下几乎没有效率。

内联通过将较小的函数组合成较大的函数来降低栈大小检查的成本。

逃逸分析通过自动将从实例从堆移动到栈来减少垃圾回收器的压力。

逃逸分析还提供了更好的 缓存局部性 Cache Locality

如果没有可增长的栈,逃逸分析可能会对栈施加太大的压力。

Gocon 2014 (47)

  • 感谢 Gocon 主办方允许我今天发言
  • twitter / web / email details
  • 感谢 @offbymany,@billkennedy\_go 和 Minux 在准备这个演讲的过程中所提供的帮助。

相关文章:

  1. 听我在 OSCON 上关于 Go 性能的演讲
  2. 为什么 Goroutine 的栈是无限大的?
  3. Go 的运行时环境变量的旋风之旅
  4. 没有事件循环的性能

作者简介:

David 是来自澳大利亚悉尼的程序员和作者。

自 2011 年 2 月起成为 Go 的 contributor,自 2012 年 4 月起成为 committer。

联系信息


via: https://dave.cheney.net/2014/06/07/five-things-that-make-go-fast

作者:Dave Cheney 译者:houbaron 校对:wxy

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

不久前,我们写了一个名为 InstantNews 的命令行新闻客户端,它可以帮助你立即在命令行阅读新闻和最新头条新闻。今天,我偶然发现了一个名为 Clinews 的类似,它的其功能与此相同 —— 在终端阅读来自热门网站的新闻和最新头条,还有博客。你无需安装 GUI 应用或移动应用。你可以直接从终端阅读世界上正在发生的事情。它是使用 NodeJS 编写的自由开源程序。

安装 Clinews

由于 Clinews 是使用 NodeJS 编写的,因此你可以使用 NPM 包管理器安装。如果尚未安装 NodeJS,请按照以下链接中的说明进行安装。

安装 node 后,运行以下命令安装 Clinews:

$ npm i -g clinews

你也可以使用 Yarn 安装 Clinews:

$ yarn global add clinews

Yarn 本身可以使用 npm 安装

$ npm -i yarn

配置 News API

Clinews 从 News API 中检索所有新闻标题。News API 是一个简单易用的 API,它返回当前在一系列新闻源和博客上发布的头条的 JSON 元数据。它目前提供来自 70 个热门源的实时头条,包括 Ars Technica、BBC、Blooberg、CNN、每日邮报、Engadget、ESPN、金融时报、谷歌新闻、hacker News,IGN、Mashable、国家地理、Reddit r/all、路透社、 Speigel Online、Techcrunch、The Guardian、The Hindu、赫芬顿邮报、纽约时报、The Next Web、华尔街日报,今日美国和等等

首先,你需要 News API 的 API 密钥。进入 https://newsapi.org/register 并注册一个免费帐户来获取 API 密钥。

从 News API 获得 API 密钥后,编辑 .bashrc

$ vi ~/.bashrc

在最后添加 newsapi API 密钥,如下所示:

export IN_API_KEY="Paste-API-key-here"

请注意,你需要将密钥粘贴在双引号内。保存并关闭文件。

运行以下命令以更新更改。

$ source ~/.bashrc

完成。现在继续并从新闻源获取最新的头条新闻。

在命令行阅读新闻和最新头条

要阅读特定新闻源的新闻和最新头条,例如 The Hindu,请运行:

$ news fetch the-hindu

这里,the-hindu 是新闻源的源id(获取 id)。

上述命令将从 The Hindu 新闻站获取最新的 10 个头条,并将其显示在终端中。此外,它还显示新闻的简要描述、发布的日期和时间以及到源的实际链接。

示例输出:

要在浏览器中阅读新闻,请按住 Ctrl 键并单击 URL。它将在你的默认 Web 浏览器中打开。

要查看所有的新闻源,请运行:

$ news sources

示例输出:

正如你在上面的截图中看到的,Clinews 列出了所有新闻源,包括新闻源的名称、获取 ID、网站描述、网站 URL 以及它所在的国家/地区。在撰写本指南时,Clinews 目前支持 70 多个新闻源。

Clinews 还可以搜索符合搜索条件/术语的所有源的新闻报道。例如,要列出包含单词 “Tamilnadu” 的所有新闻报道,请使用以下命令:

$ news search "Tamilnadu"

此命令将会筛选所有新闻源中含有 “Tamilnadu” 的报道。

Clinews 有一些其它选项可以帮助你

  • 限制你想看的新闻报道的数量, * 排序新闻报道(热门、最新), * 智能显示新闻报道分类(例如商业、娱乐、游戏、大众、音乐、政治、科学和自然、体育、技术)

更多详细信息,请参阅帮助部分:

$ clinews -h

就是这些了。希望这篇对你有用。还有更多好东西。敬请关注!

干杯!


via: https://www.ostechnix.com/clinews-read-news-and-latest-headlines-from-commandline/

作者:SK 选题:lujun9972 译者:geekpi 校对:wxy

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