Quantcast
Channel: Linux 中国◆开源社区
Viewing all 9060 articles
Browse latest View live

使用 Cockpit 方便地管理容器

$
0
0

如果你正在寻找一种管理运行容器的 Linux 服务器的简单方法,那么你应该看看 Cockpit。

如果你管理着一台 Linux 服务器,那么你可能正在寻找一个可靠的管理工具。为了这个你可能已经看了 WebmincPanel 这类软件。但是,如果你正在寻找一种简单的方法来管理还包括了 Docker 的 Linux 服务器,那么有一个工具可以用于这个需求:Cockpit

为什么使用 Cockpit?因为它可以处理这些管理任务:

  • 连接并管理多台机器
  • 通过 Docker 管理容器
  • 与 Kubernetes 或 Openshift 集群进行交互
  • 修改网络设置
  • 管理用户帐号
  • 通过基于 Web 的 shell 访问
  • 通过图表查看系统性能信息
  • 查看系统服务和日志文件

Cockpit 可以安装在 Debian、Red Hat、CentOS、Arch Linux 和 Ubuntu 之上。在这里,我将使用一台已经安装了 Docker 的 Ubuntu 16.04 服务器来安装系统。

在上面的功能列表中,其中最突出的是容器管理。为什么?因为它使安装和管理容器变得非常简单。事实上,你可能很难找到更好的容器管理解决方案。

因此,让我们来安装这个方案并看看它的使用是多么简单。

安装

正如我前面提到的,我将在一台运行着 Docker 的 Ubuntu 16.04 实例上安装 Cockpit。安装步骤很简单。你要做的第一件事是登录你的 Ubuntu 服务器。接下来,你必须使用下面的命令添加必要的仓库:

sudo add-apt-repository ppa:cockpit-project/cockpit

出现提示时,按下键盘上的回车键,等待提示返回。一旦返回到 bash 提示符,使用下面的命令来更新 apt:

sudo apt-get get update

使用下面的命令安装 Cockpit:

sudo apt-get -y install cockpit cockpit-docker

安装完成后,需要启动 Cockpit 服务并使它开机自动启动。要做到这个,使用下面的两个命令:

sudo systemctl start cockpit
sudo systemctl enable cockpit

安装就到这里了。

登录到 Cockpit

要访问 Cockpit 的 web 界面,打开浏览器(与 Cockpit 服务器在同一个网络内),输入 http://IP_OF_SERVER:9090,你就会看到登录页面(图 1)。

图 1:Cockpit 登录页面。

在 Ubuntu 中使用 Cockpit 有个警告。Cockpit 中的很多任务需要管理员权限。如果你使用普通用户登录,则无法使用 Docker 等一些工具。 要解决这个问题,你可以在 Ubuntu 上启用 root 用户。但这并不总是一个好主意。通过启用 root 帐户,你将绕过已经建立多年的安全系统。但是,在本文的用途中,我将使用以下两个命令启用 root 用户:

sudo passwd root
sudo passwd -u root

注意,请确保给 root 帐户一个强壮的密码。

你想恢复这个修改的话,你只需输入下面的命令:

sudo passwd -l root

在其他发行版(如 CentOS 和 Red Hat)中,你可以使用用户名 root 及其密码登录 Cockpit,而无需像上面那样需要额外的步骤。

如果你对启用 root 用户感到担心,则可以在服务器的终端窗口拉取镜像(使用命令 docker pull IMAGE_NAME, 这里的 IMAGE_NAME 是你要拉取的镜像)。这会将镜像添加到你的 docker 服务器中,然后可以通过普通用户进行管理。唯一需要注意的是,普通用户必须使用以下命令将自己添加到 Docker 组:

sudo usermod -aG docker USER

其中,USER 是实际添加到组的用户名。在你完成后,重新登出并登入,接着使用下面的命令重启 Docker:

sudo service docker restart

现在常规用户可以启动并停止 Docker 镜像/容器而无需启用 root 用户了。唯一一点是用户不能通过 Cockpit 界面添加新的镜像。

使用 Cockpit

一旦你登录后,你可以看到 Cockpit 的主界面(图 2)。

图 2:Cockpit 主界面。

你可以通过每个栏目来检查服务器的状态等,但是我们想要直接进入容器。单击 “Containers” 那栏以显示当前运行的以及可用的镜像(图3)。

图 3:使用 Cockpit 管理容器难以置信地简单。

要启动一个镜像,只要找到镜像并点击关联的启动按钮。在弹出的窗口中(图 4),你可以在点击运行之前查看所有镜像的信息(并根据需要调整)。

图 4: 使用 Cockpit 运行 Docker 镜像。

镜像运行后,你可以点击它查看状态,并可以停止、重启、删除实例。你也可以点击修改资源限制并接着调整内存限制还有(或者)CPU 优先级。

添加新的镜像

假设你以 root 用户身份登录。如果是这样,那么你可以在 Cockpit GUI 的帮助下添加新的镜像。在“ Container” 栏目下,点击获取新的镜像按钮,然后在新的窗口中搜索要添加的镜像。假设你要添加 CentOS 的最新官方版本。在搜索栏中输入 centos,在得到搜索结果后,选择官方列表,然后单击下载(图5)。

图 5:使用 Cockpit 添加最新的官方构建 CentOS 镜像到 Docker 中。

镜像下载完后,那它就在 Docker 中可用了,并可以通过 Cockpit 运行。

如获取它那样简单

管理 Docker 并不容易。是的,在 Ubuntu 上运行 Cockpit 会有一个警告,但如果这是你唯一的选择,那么也有办法让它工作。在 Cockpit 的帮助下,你不仅可以轻松管理 Docker 镜像,也可以在任何可以访问 Linux 服务器的 web 浏览器上这样做。请享受这个新发现的让 Docker 易用的方法。


via: https://www.linux.com/learn/intro-to-linux/2017/3/make-container-management-easy-cockpit

作者:JACK WALLEN 译者:geekpi 校对:jasminepeng

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8473-1.html?utm_source=rss&utm_medium=rss


KubeCon 欧洲大会热点议题总汇

$
0
0

4 月 22 日,由 K8S 技术社区、Linux 中国联合主办的 K8S GeekGathering 2017 吸引了国内容器领域关注者 100+ 人到场参与,以下是 EasyStack 容器架构师王后明的演讲实录整理:

大家下午好,开场之前,我做一个简单的现场调查,有哪位朋友在生产环境上或者使用 K8S 平台的,大家可以举手。生产环境或者在运维,或者在生产上使用的,开发和测试环境上用的多一些。

今天的话题,我主要是对 KubeCon 2017 欧洲峰会的热门话题的总结和社区关注的的分享和回顾,说到现场的,对我印象最深的是其中某个话题的时候,现场调查的时候,问有谁,哪位同事在生产环境上运维 K8S 平台,在现场可以看到超过 80% 的人举手,我感觉在 K8S 平台,在国外的使用程度,可能比国内走得更前一步,已经有非常非常多的生产案例在跑。

1、CNCF最新动态

首先分享第一个问题是 CNCF 的最新动态,在两天的会议上,CNCF 宣布了社区发展的最新情况,就是在加入黄金和会员后,CNCF 已经增加到 85 家的会员的数量,生态发展速度非常快,托管项目,目前从峰会上,3月25日, Docker 把容器运营时捐赠给了容器的基金会,进入基金会以后,CNCF 托管的项目目前一共有 9 个,包括 K8S 、等等,目前一共 9 个托管的项目,但同时,因为在这个图里面,CNCF 进行了维护,相当于整个企业在云里面做运用改造,可能涉及到非常多的项目,包括整个技术架构,项目的安装部署,容器的编排,应用的开发和部署的流程,整个其实涉及到非常非常多的开源的项目,来支撑云应用层的生态,目前 CNCF 基金会管理 9 个项目,更多项目进入基金会的视野,将来会有更多项目进入 CNCF 下托管,这是 CNCF 社区的情况。

峰会上一个比较重要的消息就是说 Docker 把自己的容器运营时捐赠给了 CNCF 和基金会。我们知道在 K8S 1.5 版本的时候,他已经脱离多个运行的CII容器,Container 的接口,有这个接口之后, K8S 可以绕过 Docker 使用基金会的实现,做容器的编排,在 1.5 发布之后, Docker 的话,多少也能够感觉到一些压力,因为如果 K8S 一个 CII+OCI 标准运行成为事实以后, Docker 的市场占有率会有所下降,今年峰会的时候, Docker 选择把 ContainerD 捐赠给基金会,这是自己的容器运营时,主要解决下面几个问题,比如说它怎么样,第一个部分是进行容器竞相的格式的管理,怎么样把分层的镜像,进行运行时,同时会管理底层的存储和网络,怎么样去分配,就是容器运行时要做的事情,容器 ContainerD 的话,主要是结合 Docker 的产品,结合微软的共同开发了开源的容器运行时的平台,这是 ContainerD 要解决的问题。

说到 OCI 和这些标准,我们可以简单看一下,目前这个容器的生态里面所存的几个,标准化的一个组织,首先从镜像运行时和网络方面都有不同的标准化组织来规范容器的生态,CoreOS 是 APPC 和 OCI 和 CNI,谷歌是 OCI 和 CNI, Docker 自己推的 Liwork,1.5 版本里面,怎么调动不同的容器运行时的接口,1.5 开始是这个状态,避免直接使用,直接调用下面的,比如 Docker 和这样的容器的实现,就是形成统一的容器运行时的接口,底下不同的实现是通过不同的接口调度容器,如果一个公司企业里面来选择一个容器的编排的工具,选择 K8S 是底层的容器引擎没有硬性的要求,这样可以更好地避免底层技术厂商锁定的问题。

其实在峰会上,分享了他为什么选择把 ContainerD 捐赠给基金会,主要是两个大的方面,一个是大家也是立志于形成整个容器生态的统一的规范,避免说大家各自玩自己的一套规范。这样也是给整个生态的开发者和厂商都会带来一些兼容性的问题,选择 CNCF 基金会,是因为两者目标一致,形成统一的容器生态的规范,然后技术实现方面的话,ContainerD 是直接使用 GRPC  的调动的关系,监控数据也是使用普罗米修斯的方式发布,这样可以更好地跟 K8S 更好地融合。其实 ContainerD 进入 CNCF 以后,代替 Docker 的地位,在社区已经有针对 ContainerD 和 CNCF 接口的实现,直接调用 CII 的调用 Containerd 的技术实现也跟 CNCF 其他项目保持一致,做下面容器的盛行周期的管理,这个就是 Containerd 的为什么捐赠给 CNCF 基金会的说明。

2、峰会上的技术热点总汇

接下来我们可以看一下整个峰会上所讲述的一些比较重要的和比较新的技术话题,我们看到第一点是 KubeVirt ,我们目前用得比较多的是,IaaS 层里面, Open Stack 比较多,容器的话 K8S 比较大, KubeVirt 的实现方法有两种,对 Open Stack 平台里面,从 Open Stack 平台上,完成对虚拟化和容器技术的统一调度, KubeVirt 目的是做容器和虚拟机的统一调度,实现方式是把 K8S 作为容器的控制平面,评比容器的差异,让整个 K8S 调度数据中心的虚拟化和容器的技术。

现场的话,工程师也给大家做了说明,怎么样实时创建虚拟机,同时怎么管理虚拟机的生命周期, KubeVirt 的实现的话,实现方式,和 K8S 目前三方的,如果我们要新增功能,在 K8S 里面新增一些功能加一些资源,是类似的方案在 K8S 里面,是不会直接改这个 Server,会扩展一套新的,会有一套新的管理者响应新的资源,因为整个平台是在 K8S 框架下,所以这两个下面的统一资源管理是通过 TBR 统一管理、调度三方资源,把三方的服务定义为统一的实现,具体的他们新加了一个 API Server,通过新的资源的描述类型,来定义这个虚拟机的资源,我们响应虚拟机类型的资源,把资源真正的请求分发到底层运行在每个节点上的资源,这样的话,来完成整个用 K8S 平台对虚拟机和容器做统一的调度。

这是 KubeVirt 的大概介绍。这个项目的话,目前它还没有到特别成熟的阶段,目前是相当于原型的阶段,来证明这种方式,如果我们想用 K8S 作为统一的虚拟机和容器的管理平台也是可行的。这是关于容器和虚拟化,它俩统一管理,作为统一的控制平面的实现方式之一,除了 KubeVirt 之外,其实整个当前 K8S 生态上面,其实也有另外一些实现容器和虚拟机调度管理的思路,第一种是 Virtlet,让虚拟机和容器统一管理,和 KubeVirt 相似,Virtlet 沿用现有的资源和框架,做两者统一的资源的调度,现在已经进入统一项目下面,大家可以自己做一些尝试。

另外一种是 Frakti 也是一个项目,跟郭理靖分享的京东云的相似,底层其实用来真正跑容器运行时,其实还是虚拟化的技术,只是把虚拟化和容器进行了深度的融合,底层的容器运行时还是虚拟化的技术。主要是用的 hypervisor 控制的。 Open Stack 这边其实也是另外一种实现思路,就是在 Open Stack 和虚拟机统一管理,这是另外的话题,这边我们就不说这部分了,这是容器和虚拟机统一管理的方案。接下来我们可以看一下对 Open Service API 以及  K8S Service Catalog。

我们如果用某一个平台之外的服务,我们要做的事情非常简单,第一步要获取这个服务提供商可以提供哪些服务,比如从这上面可以提供服务,有这个服务能力之后,我们第二步直接向服务提供商提供具体的数据出来。把创建出来的数据库和底层的某个应用进行绑定,绑定好之后,我们应用可以更方便用,往数据库里写入数据存储数据,这样的话,我们使用这些服务的时候,并不需要关注具体的细节,这是提供给我们的桥梁,让整个生态应用之间,使用、分发更方便。这个就是 Open Service Broke API 做的事情,对应的,类似于 KubeVirt ,是插件格式加入整个平台里面,相当于整个的实现,让 K8S 里面的服务更好地使用数据库提供的原理,这个也是和刚才类似,也是通过三方的资源来实现,目前也是孵化项目,可以做一些使用。

在目前的审计,在生产的系统里面是非常重要的组成部分,按照时间顺序记录用户,管理员或者其他组建,跟安全相关的行为,审计的话,可以给系统管理员提供,对安全行为的审计,过程中需要回答的几个问题,比如这个用户做了什么操作,操作是什么时候发生,由谁发起,对谁发起,它发起的目标是什么,它在哪里被观察到,哪里被发起,会影响哪些地方。这是整个审计过程中需要的信息,其实在整个审计的系统里面都应该能囊括到,主要是用来发现系统的安全违规行为,做性能分析、软件 BUG 的分析,调试的工具,这是审计系统要完成的功能,审计系统,并不会给系统带来额外的安全性,主要是以 K8S 审计为例,Virtlet在 Open Service 之后的行为,是已认证用户的行为的记录。这是审计系统的定位,只能说作为我们感应系统安全的一个参数信息的来源,这是审计系统。

那审计系统在 K8S 里面,目前功能比较简单,你在审计的时候,加几个选项就能把审计系统打开,打开之后,我们可以从日志里面看到,我们系统的用户和管理员做的认证的操作,当前的日志的记录,目前是比较简单的状态,刚开始有这么一个系统,可以来作为系统 K8S 审计的信息的输出,这是审计的在 K8S 的状态,然后另外一个就是别的工程师分享了, K8S 里面无服务框架的项目,其实跟容器也是相当于目前像公有云里面,AWS,谷歌、微软,都有自己的无服务框架的产品,在 K8S 里面,也有不少的尝试的实现, K8S 的话,也是跟 KubeVirt 类似,也是用TBR作为函数,操作的具体的展现的对象,同时也是新加了一个响应函数的请求,最底层的话,无服务器请求,并不是没有最后的服务器的门第,是通过最底层的 K8S 的基础资源来响应函数后面的资源的运算的请求,同时相关的一些配置,是通过 map 做的。这是 K8S 的实现,同时通过插件化的方式加入整个 K8S 的平台里面来的。

除了 K8S 之外,也有这样的框架。底层也是利用 Kubeless 是兼容谷歌的 API。另外还有分享的容器初始化系统的,因为 Linux 内核启动的时候会先启动一个 init 进程,这个进程的 PID 开始 hypervisor 于特殊的使命,需要做好的父进程的角色,比如传递信号,容器使用PID隔离不同容器里面进程的,带到这个问题就是每个容器里面都能看到这么一个进程,这个进程因为Linux 设立的是唯一的进程有使命,处理这个子进程的关系,在 init 为 1 的进程就变得重要了,早期如果运维过生产环境, Docker 或多或少遇到,容器某个进程怎么样,其实这种情况下,就是跟容器初始化进程关系比较大,因为 PID 为 1 的进程比较关键。

所以对应实现的话,有三种实现的方式,第一种是 dumb init,系统起来的时候,如果我们在某个容器件里面使用这个的话,我们首先要启动真正的应用,这个 dumb init 是完成了容器初始化的工作,真正的是作为 dumb init 的子进程,不会因为没有处理进程化,导致进程上不掉的情况,所以 dumb init 是比较轻量级的实现方式。另外从 Docker 1.13版本之后, Dockerd 已经加了这种标记, Dockerd 会自动会用户的应用程序处理初始化的工作,所以从新版本的话,我们遇到这种进程相对少一些了。这是 Docker 这边的实现。第三种方式是可以通过 Systemd,同时我们在容器里面的话,也可以选择用 Systemd 充当内部的初始化的进程,这个好处是除了做容器初始化系统之外,还能更多处理日志,服务之间的启动顺序,这是它带来的好处,这是容器初始化系统,大家做应用容器的时候,如果遇到类似的问题,可以选择三种不同的方式,用哪种方式解决可能存在的问题。

3、与生产实践相关的技术话题

最后一部分跟大家分享一下,我所听到的这些里面跟生产应用关系比较大的,对我印象深刻的几个话题,其中之一是 helm ,我大概普及一下,简单理解可以理解成应用系统里的一个,其实就是,目的是让 K8S 里面的一个应用,它使用和维护升级更加方便。我们知道。如果我们单跑一个容器其实非常方便,我们直接进行单个容器的使用、启动、删除就可以。如果真正的一个系统做完微服务化,整个大系统不可能是单个的容器,容器之间或多或少存在跟其他系统之间微服务的交互关系,这个时候,把各个大系统里面子系统的依赖关系交代清楚,这个是非常重要的。 helm 的出现是为了解决大系统进行容器应用化之后,在线上运维的所做的事情,相当于我们把每个小的服务定义好之后,以 helm 里面的定义好,一个应用的话,可以包括多个微服务,一个 helm 可以理解为一个ITE,相当于一个大应用之间,它的依赖关系可以通过一个管理起来,这是 helm 做的事情。

K8S 生态里面的一个应用包的管理工具。 helm 的内部组成相对简单, helm 自己是一个客户端,你自己执行的样本、app 这些,你可以自己设定对应的应用,运营的名字是,客户端发起请求以后,响应完以后,服务器上把这个应用的描述先描述的压缩文件下载到 K8S 集群里面,度曲这些信息,部署组件, helm 的话,在整个企业里面,其实它的重要性越来越重要,其中第一点是 CTO 分享了,第一个 K8S 里面的,我们目前只有 Docker ,这只是单个容器的,有了 helm 之后,我们可以把标准的应用,不仅仅是我们可以用容器生态来管理好一个容器,更方便的是我们把标准应用通过应用的方式管理和发布,quay 集成 helm ,类似于应用商店,quay 和容器的仓库融合得比较紧密,在整个微服务过程中,除了能把整个 image 之外,同时可以推送到应用的里面去,这样能达到整个应用方面的运维和管理。这是这个产品。

第二部分,其实 helm 可以作为整个流程的重要部分,其实整个企业做应用容器化的时候,少不了代码提交、触发、流程之后,把对应的应用推送到容器里面去,有了 helm 之后,我们可以做的事情还有很多,一个大的服务分为三个应用,如果我们三个应用事先定义好应用的组织关系,这个时候,如果我们每次应用的代码提交,其实都会带动整个线上的大系统做整体的更新和测试,这样不仅是对某个服务本身做一个测试,其实可以对多个服务大系统做大的过程,这是 helm 在企业里面应用更丰富,重要性,后面会越来越重要。包括国内国外,越来越多的平台和产品已经支持用 helm 作应用商店的方式。最后一个部分就是分享一下华为工程师的分享,如何让 K8S 支持 5 万+个服务。在1.6发布的时候,官方宣称, K8S 可以支持5千个物理节点,如果真正开始规模化地使用这么一些应用的时候。

如果规模上去之后,会遇到一些问题,因为服务的话,都是通过 IP 做流量的负载,对整个副本,决定你这个应用最后到哪个访问的时候,它流量在那个 pot 上面,是通过 IPTables 的规则,可以看到整个系统规则里面一些 IPTables 规则的增加,你的数量上来之后,会成倍的增加,iptables 达到一定程度会造成反应延迟非常大,这个时候对 IPTables 做一些删除修改的话,整个延迟非常大,为什么慢,是因为 IPTables 不是增量做规则的增加,如果当前有服务出来,后面要新创建一个服务,这些规则是要把当前所有规则拷贝出来做修改,再把这个规则 save 回去,把整个规则做一个更新,这个过程会导致 IPTables 锁住,如果规则非常大,会非常耗时,有个具体的数据是如果有 5 千个 servies 的时候,IPTables 有四万条,添加一条规则耗时 11 分钟才能把这条规则在系统上生效,这是绝大的耗时,有 16 万条规则,需要耗时 5 小时。在生产里面可以理解为不可用的状态了。IPTables 作为内部使用,存在的问题。这是服务延迟的问题,就是你请求到节点之后,分发到哪一步了的延迟,第一个服务和最后一个服务之间,到哪个之间的间隔,这是比较显著的变化了。面对 IPTables 存在的问题,社区有方案,用 IPVS 代替当前kube proxy,基于 Netfilter 之上的协议。

目前通过 NAT 负载均衡模式,支持更高级的,直接路由的方式,目前 K8S 使用 NAT 的实现,这种实现的话,目前代码还是在,如果五千规则需要耗 11 分钟,现在降到2秒,之前需要5小时,也只需要 2 秒,这样的话,可以解决这样的问题。这是如何用 IPVS 支持 5 万级别的 service,这是性能数据的对比,在5千个数据的时候,之前需要 11 分钟,如果 2 万个服务的话,需要 5 小时,用 IPVS,可以很小,这样的话能够很好地支撑整个大的应用的,大规模的应用的分发,大规模应用的运行。以上就是我在峰会上听到的比较多的热门的技术话题的简单分享,涉及到的问题比较多,大家有问题的话,这只是影子,告诉大家有这个东西,后面要用的话,可以从社区上,或者网络上找到更丰富的资源和介绍,我的分享就到这儿,谢谢大家。

全程 PPT 下载

下载  K8S GeekGathering 2017 全程演讲 PPT:https://pan.baidu.com/share/link?shareid=3448394954&uk=3289666732#list/path=%2F

提取码:5t57


完美阅读及发表评论,请猛击:https://linux.cn/article-8474-1.html?utm_source=rss&utm_medium=rss

极客漫画:大数据婚姻

$
0
0

Big Data Marriage

Big Data Marriage

这幅漫画是作者假借大数据来吐槽自己的老婆太唠叨了。

也是一个非常有意思的比喻,作为男性可能都有所体会,在没有结婚的时候,甚至是说,单身的时候,自己的生活过的清净而惬意。一旦你结了婚,你的妻子为了生活而忙碌,便开始关注生活中的点点滴滴,会给你说大量的话,传递大量的信息,这何尝不是一种“大数据”呢?

via: https://turnoff.us/geek/bigdata-marriage/

作者:Daniel Stori 译者&点评:Bestony 校对:wxy 合成:GHLandy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8475-1.html?utm_source=rss&utm_medium=rss

SSH 协议端口号 22 背后的故事

$
0
0

为什么 SSH(安全终端)的端口号是 22 呢,这不是一个巧合,这其中有个我(Tatu Ylonen,SSH 协议的设计者)未曾诉说的故事。

将 SSH 协议端口号设为 22 的故事

1995 年春我编写了 SSH 协议的最初版本,那时候 telnetFTP 正被广泛使用。

当时我设计 SSH 协议想着是为了替代 telnet(端口 23)和 ftp(端口21)两个协议的,而端口 22 是空闲的。我想当然地就选择了夹在 telnetftp 的端口中间的数字。我觉得端口号虽然是个小事但似乎又存在着某种信念。但我到底要怎么拿到那个端口号呢?我未曾拥有过任何一个端口号,但我却认识几个拥有端口号的人!

在那时取得端口号的事情其实说来挺简单的。毕竟当时的因特网(Internet)并不是很大,是因特网爆炸的早期。端口号分配的活儿是 IANA(Internet Assigned Numbers Authority,互联网数字分配机构)干的。在那时这机构可相当于是因特网先驱 Jon PostelJoyce K. Reynolds 一般的存在。Jon 参与编写了多项主要的协议标准,例如 IP(RFC 791)、ICMP(RFC 792)和 TCP(RFC 793)等一些你应该早有耳闻的协议。

我可以说是敬畏 Jon 先生的,他参与编写了几乎所有主要的因特网标准文档(Internet RFC)!

1995 年 7 月,就在我发布 ssh-1.0 前,我发送了一封邮件给 IANA:

From ylo Mon Jul 10 11:45:48 +0300 1995
From: Tatu Ylonen <ylo@cs.hut.fi>
To: Internet Assigned Numbers Authority <iana@isi.edu>
Subject: 请求取得一个端口号
Organization: 芬兰赫尔辛基理工大学

亲爱的机构成员:

我写了个可以在不安全的网络环境中安全地从一台机器登录到另一台机器的程序。它主要是对现有的 telnet 协议以及 rlogin 协议的功能性提升和安全性改进。说的具体些,就是可以防御 IPDNS 或路由等欺骗行为。我打算将我的软件免费地发布在因特网上,以得到广泛地使用。

我希望为该软件注册一个特权端口号,要是这个端口号在 1 255 之间就更好了,这样它就可以用在名字服务器的 WKS 字段中了。

我在附件中附上了协议标准的草案。这个软件已经在本地运行了几个月了,我已准备在获得端口号后就发布。如果端口号分配一事安排的及时,我希望这周就将要发布的软件准备好。我目前在 beta 版测试时使用的端口号是 22,如果要是能够分配到这个端口,我就不用做什么更改了(目前这个端口在列表中还是空闲的)。

软件中服务的名称叫 `ssh`(系 Secure Shell 的缩写)。

您最真诚的,

Tatu Ylonen <ylo@cs.hut.fi>

(LCTT 译注:DNS 协议中的 WKS 记录类型意即“众所周知的业务描述”,是类似于 A、MX 这样的 DNS 记录类型,用于描述某个 IP 所提供的服务,目前鲜见使用。参见: https://docs.oracle.com/cd/E19683-01/806-4077/dnsintro-154/index.html 。)

第二天,我就收到了 Joyce 发来的邮件:

Date: Mon, 10 Jul 1995 15:35:33 -0700
From: jkrey@ISI.EDU
To: ylo@cs.hut.fi
Subject: 回复:请求取得一个端口号
Cc: iana@ISI.EDU 

Tatu,

我们将端口号 22 分配给 ssh 服务了,你目前是该服务的主要联系人。

Joyce

这就搞定了!SSH 的端口正式使用 22!!!

1995 年 7 月 12 日上午 2 点 21 分,我给我在赫尔辛基理工大学的测试者们宣布了 SSH 的最后 beta 版本。当日下午 5 点 23 分,我给测试者们宣布了 ssh-1.0.0 版本。1995 年 7 月 12 日,下午 5 点 51 分,我将一份 SSH(安全终端)的宣告发给了 cypherpunks@toad.com 的邮件列表,此外我还将其发给了一些新闻组、邮件列表和一些在因特网上讨论相关话题的人们。

如何更改 SSH 服务的端口号

SSH 服务器是默认运行在 22 号端口上的。然而,由于某些原因需要,它也可以运行在别的端口上。比如为了方便测试使用,又比如在同一个宿主机上运行多个不同的配置。当然,极少情况下,不使用 root 权限运行它也可以,比如某些必须运行在非特权的端口的情况(端口号大于等于 1024)。

端口号可以在配置文件 /etc/ssh/sshd_config 中将 Port 22 更改。也可以使用 -p <port> 选项运行 sshd。SSH 客户端和 sftp 程序也可以使用 -p <port> 选项。

配置 SSH 协议穿越防火墙

SSH 是少数通常被许可穿越防火墙的协议之一。通常的做法是不限制出站的 SSH 连接,尤其常见于一些较小的或者比较技术型的组织中,而入站的 SSH 连接通常会限制到一台或者是少数几台服务器上。

出站的 SSH 连接

在防火墙中配置出站的 SSH 连接十分简单。如果完全限制了外发连接,那么只需要创建一个允许 TCP 端口 22 可以外发的规则即可。如果你想限制目标地址,你可以限制该规则仅允许访问你的组织放在云端的外部服务器或保护该云端的跳板服务器即可。

反向通道是有风险的

其实不限制出站的 SSH 连接虽然是可以的,但是是存在风险的,SSH 协议是支持 通道访问 的。最初的想法是在外部服务器搭建一个 SSH 服务监听来自各处的连接,将进入的连接转发到组织,并让这个连接可以访问某个内部服务器。

在某些场景下这当然非常的方便。开发者和系统管理员经常使用它打开一个通道以便于他们可以远程访问,比如在家里或者在旅行中使用笔记本电脑等场景。

然而通常来讲这些做法是违背安全策略的,跳过了防火墙管理员和安全团队保护的控制无疑是违背安全策略的,比如这些: PCIHIPAANIST SP 800-53 等。它可以被黑客和外国情报机构用来在组织内留下后门。

CryptoAuditor 是一款可以控制通道穿过防火墙或者一组云端服务器入口的产品。该款产品可以配合 通用 SSH 密钥管理器(Universal SSH Key Manager) 来获得对 主机密钥(host keys)的访问,以在启用防火墙并阻挡未授权转发的场景中解密 SSH 会话。

入站的 SSH 访问

对于入站访问而言,这里有几点需要说一下:

  • 配置防火墙,并转发所有去往 22 端口的连接只能流向到一个特定的内部网络 IP 地址或者一个 DMZ 主机。在该 IP 上运行 CryptoAuditor 或者跳板机来控制和审查所有访问该组织的连接。
  • 在防火墙上使用不同的端口访问不同的服务器。
  • 只允许使用 IPsec 协议这样的 VPN(虚拟专用网)登录后连接 SSH 服务。

通过 iptables 服务限制 SSH 访问

iptables 是一款内建在 Linux 内核的宿主防火墙。通常配置用于保护服务器以防止被访问那些未明确开启的端口。

如果服务器上启用了 iptables,使用下面的命令将可以允许进入的 SSH 访问,当然命令需要以 root 身份运行。

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果你想将上述命令创建的规则持久地保存,在某些系统版本中,可使用如下命令:

service iptables save

防火墙开启 SSH 端口可以让我挖隧道去银行


via: https://www.ssh.com/ssh/port

作者:Tatu Ylonen 译者:kenxx 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8476-1.html?utm_source=rss&utm_medium=rss

如何备份一个磁盘分区

$
0
0

通常你可能会把数据放在一个分区上,有时候可能需要对该设备或者上面的一个分区进行备份。树莓派用户为了可引导 SD 卡当然有这个需求。其它小体积计算机的用户也会发现这非常有用。有时候设备看起来要出现故障时最好快速做个备份。

进行本文中的实验你需要一个叫 dcfldd 的工具。

dcfldd 工具

该工具是 coreutils 软件包中 dd 工具的增强版。dcfldd 是 Nicholas Harbour 在美国国防部计算机取证实验室(DCFL)工作期间研发的。该工具的名字也基于他工作的地方 - dcfldd

对于仍然在使用 CoreUtils 8.23 或更低版本的系统,并没有一个可以轻松查看正在创建副本的进度的选项。有时候看起来就像什么都没有发生,以至于你就想取消掉备份。

注意:如果你使用 8.24 或更新版本的 dd 工具,你就不需要使用 dcfldd,只需要用 dd 替换 dcfldd 即可。所有其它参数仍然适用。

在 Debian 系统上你只需要在 Package Manager 中搜索 dcfldd。你也可以打开一个终端然后输入下面的命令:

sudo apt-get install dcfldd

对于 Red Hat 系统,可以用下面的命令:

cd /tmp
wget dl.fedoraproject.org/pub/epel/6/i386/dcfldd-1.3.4.1-4.el6.i686.rpm
sudo yum install dcfldd-1.3.4.1-4.el6.i686.rpm
dcfldd --version

注意: 上面的命令安装的是 32 位版本。对于 64 位版本,使用下面的命令:

cd /tmp
wget dl.fedoraproject.org/pub/epel/6/x86_64/dcfldd-1.3.4.1-4.el6.x86_64.rpm
sudo yum install dcfldd-1.3.4.1-4.el6.x86_64.rpm
dcfldd --version

每组命令中的最后一个语句会列出 dcfldd 的版本并显示该命令文件已经被加载。

注意:确保你以 root 用户执行 dd 或者 dcfldd 命令。

安装完该工具后你就可以继续使用它备份和恢复分区。

备份分区

备份设备的时候可以备份整个设备也可以只是其中的一个分区。如果设备有多个分区,我们可以分别备份每个分区。

在进行备份之前,先让我们来看一下设备和分区的区别。假设我们有一个已经被格式化为一个大磁盘的 SD 卡。这个 SD 卡只有一个分区。如果空间被切分使得 SD 卡看起来是两个设备,那么它就有两个分区。

假设我们有一个树莓派中的 SD 卡。SD 卡容量为 8 GB,有两个分区。第一个分区存放 BerryBoot 启动引导器。第二个分区存放 Kali(LCTT 译注:Kali Linux 是一个 Debian 派生的 Linux 发行版)。现在已经没有可用的空间用来安装第二个操作系统。我们使用大小为 16 GB 的第二个 SD 卡,但拷贝到第二个 SD 卡之前,第一个 SD 卡必须先备份。

要备份第一个 SD 卡我们需要备份设备 /dev/sdc。进行备份的命令如下所示:

dcfldd if=/dev/sdc of=/tmp/SD-Card-Backup.img

备份包括输入文件(if)以及被设置为 /tmp 目录下名为 SD-Card-Backup.img 的输出文件(of)。

dddcfldd 默认都是每次读写文件中的一个块。通过上述命令,它可以一次默认读写 512 个字节。记住,该复制是一个精准的拷贝 - 逐位逐字节。

默认的 512 个字节可以通过块大小参数 - bs= 更改。例如,要每次读写 1 兆字节,参数为 bs=1M。使用以下所用的缩写可以设置不同大小:

  • b – 512 字节
  • KB – 1000 字节
  • K – 1024 字节
  • MB – 1000x1000 字节
  • M – 1024x1024 字节
  • GB – 1000x1000x1000 字节
  • G – 1024x1024x1024 字节

你也可以单独指定读和写的块大小。要指定读块的大小使用 ibs=。要指定写块的大小使用 obs=

我使用三种不同的块大小做了一个 120 MB 分区的备份测试。第一次使用默认的 512 字节,它用了 7 秒钟。第二次块大小为 1024 K,它用时 2 秒。第三次块大小是 2048 K,它用时 3 秒。用时会随系统以及其它硬件实现的不同而变化,但通常来说更大的块大小会比默认的稍微快一点。

完成备份后,你还需要知道如何把数据恢复到设备中。

恢复分区

现在我们已经有了一个备份点,假设数据可能被损毁了或者由于某些原因需要进行恢复。

命令和备份时相同,只是源和目标相反。对于上面的例子,命令会变为:

dcfldd of=/dev/sdc if=/tmp/SD-Card-Backup.img

这里,镜像文件被用作输入文件(if)而设备(sdc)被用作输出文件(of)。

注意: 要记住输出设备会被重写,它上面的所有数据都会丢失。通常来说在恢复数据之前最好用 GParted 删除 SD 卡上的所有分区。

假如你在使用多个 SD 卡,例如多个树莓派主板,你可以一次性写多块 SD 卡。为了做到这点,你需要知道系统中卡的 ID。例如,假设我们想把镜像 BerryBoot.img 拷贝到两个 SD 卡。SD 卡分别是 /dev/sdc/dev/sdd。下面的命令在显示进度时每次读写 1 MB 的块。命令如下:

dcfldd if=BerryBoot.img bs=1M status=progress | tee >(dcfldd of=/dev/sdc) | dcfldd of=/dev/sdd

在这个命令中,第一个 dcfldd 指定输入文件并把块大小设置为 1 MB。status 参数被设置为显示进度。然后输入通过管道 |传输给命令 teetee 用于将输入分发到多个地方。第一个输出是到命令 dcfldd of=/dev/sdc。命令被放到小括号内被作为一个命令执行。我们还需要最后一个管道 |,否则命令 tee 会把信息发送到 stdout (屏幕)。因此,最后的输出是被发送到命令 dcfldd of=/dev/sdd。如果你有第三个 SD 卡,甚至更多,只需要添加另外的重定向和命令,类似 >(dcfldd of=/dev/sde

注意:记住最后一个命令必须在管道 | 后面。

必须验证写的数据确保数据是正确的。

验证数据

一旦创建了一个镜像或者恢复了一个备份,你可以验证这些写入的数据。要验证数据,你会使用名为 diff 的另一个不同程序。

使用 diff ,你需要指定镜像文件的位置以及系统中拷贝自或写入的物理媒介。你可以在创建备份或者恢复了一个镜像之后使用 diff 命令。

该命令有两个参数。第一个是物理媒介,第二个是镜像文件名称。

对于例子 dcfldd of=/dev/sdc if=/tmp/SD-Card-Backup.img,对应的 diff 命令是:

diff /dev/sdc /tmp/SD-Card-Backup.img

如果镜像和物理设备有任何的不同,你会被告知。如果没有显示任何信息,那么数据就验证为完全相同。

确保数据完全一致是验证备份和恢复完整性的关键。进行备份时需要注意的一个主要问题是镜像大小。

分割镜像

假设你想要备份一个 16GB 的 SD 卡。镜像文件大小会大概相同。如果你只能把它备份到 FAT32 分区会怎样呢?FAT32 最大文件大小限制是 4 GB。

必须做的是文件必须被切分为 4 GB 的分片。通过管道 | 将数据传输给 split 命令可以切分正在被写的镜像文件。

创建备份的方法相同,但命令会包括管道和切分命令。示例备份命令为 dcfldd if=/dev/sdc of=/tmp/SD-Card-Backup.img ,其切分文件的新命令如下:

dcfldd if=/dev/sdc | split -b 4000MB - /tmp/SD-Card-Backup.img

注意: 大小后缀和对 dddcfldd 命令的意义相同。 split 命令中的破折号用于将通过管道从 dcfldd 命令传输过来的数据填充到输入文件。

文件会被保存为 SD-Card-Backup.imgaaSD-Card-Backup.imgab,如此类推。如果你担心文件大小太接近 4 GB 的限制,可以试着用 3500MB。

将文件恢复到设备也很简单。你使用 cat 命令将它们连接起来然后像下面这样用 dcfldd 写输出:

cat /tmp/SD-Card-Backup.img* | dcfldd of=/dev/sdc

你可以在命令中 dcfldd 部分包含任何需要的参数。

我希望你了解并能执行任何需要的数据备份和恢复,正如 SD 卡和类似设备所需的那样。

(题图:Pixabay, CC0)


via: https://www.linuxforum.com/threads/partition-backup.3638/

作者:Jarret 译者:ictlyh 校对:jasminepeng

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8477-1.html?utm_source=rss&utm_medium=rss

那个极爽的命令行纠错软件 The Fuck 是如何工作的

$
0
0

前两天我们为大家介绍了一款命令行神器: The Fuck,今天让我们来看看该软件的作者是如何设计该软件的。

不久之前我写了一款实用的应用 — The Fuck,用来修复在命令行中上一条错误的命令。这款应用下载了几千次,在 GitHub 上有很多 star,并有几十个优秀的贡献者。本文介绍应用中有趣的内部实现。

另外,大约一周前我谈论过《开源软件架构》一书,现在我觉得要是能在书中写一章关于 The Fuck 的内容将是很酷的事情。

管道

The Fuck 可以简单理解成一个管道,从用户的角度来看,流程如下:

有些东西出错了 → The Fuck → “完事”

之所以这么简单是因为 The Fuck 只是一个别名alias罢了(用户也可以使用其他别名)。对错误的命令进行了一些处理,执行修改过了的命令并更新命令历史。比如对于 zsh 是这样的:

TF_ALIAS=fuck alias fuck='eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R'

让我们再回到管道上来,对于在别名alias内运行的的 The Fuck 来说,管道是这样的:

出错的命令 → The Fuck → 修复好的命令

所有有趣的事都发生在 The Fuck 当中:

错误的命令 → 匹配规则 → 修正后的命令 → 用户选择 → 修改好的命令

这里最重要的部分就是匹配规则了,规则是一个特殊模块集,它有两个方法:

  • match(command: Command) → bool – 匹配上规则则返回 True;
  • get_new_command(command: Command) → str|list[str] – 否则返回修改后的命令或命令列表(当有多个可能匹配项)

我想这个应用只是因为它的规则才这么有趣,编写自己的规则也很简单。目前有 75 条可用的规则,大都是有第三方贡献者写的。命令是一个类似命名元组namedtuple这样的数据结构:

Command(script: str, stdout: str, stderr: str)

其中 script 是与 shell 类型无关的错误命令。

处理不同 Shell 类型

在不同的 shell 中,描述 alias 的方式不同、语法不同(比如在 fish 中 && 表示为 and)、历史命令的处理方法也不同,且 shell 还依赖特定的配置文件(.bashre ,.zshrc 等)。为了避免这些麻烦,在程序中有一个 shells 的模块把这些与特定 shell 相关的命令转化为与 sh 兼容的类型,并展开别名和环境变量。 所以我们使用 shells.from_shell 方法来获得 Command(前面的章节提到过的)的实例,在 sh 里运行并且获得 stdout 和 stderr。

出错的命令 → from_shell 模块 → 与 shell 类型无关的命令 → (可以)在 sh 内运行 –> Command 实例

对修改好的命令也做了相似地处理,即把与特定 shell 无关的命令通过 shells.to_shell 模块转化为与 shell 相关的命令。

配置

The Fuck 是一个高可配置的应用,用户可以开启或关闭规则、配置 UI、设置规则选项还有进行其他的操作。用户可以通过修改 ~/.thefuck/settring.py 文件以及环境变量来配置应用:

默认配置 → 通过 setting.py 文件更新 → 通过环境变量更新

之前版本中,配置对象以参数的形式传递到所有需要的场合,虽然那样还不错并且能够测试,但存在过多的重复代码。而现在是一个单例(thefuck.conf.settings),类似 Django 中的 django.conf.settings

UI

The Fuck 的 UI 很简单,它允许用户通过(上下)箭头的方式在修正过的命令列表中进行选择,使用 Enter 来确认选择,Ctrl+C 来跳出程序。 美中不足的是在 Python 标准库中没有办法在非 Windows 下不通过 curses 来读取键盘输入,由于别名alias的特性我们又不能在这里使用 curses。但容易写出针对 Windows 的 msvrt.getch:

import tty
import termios

def getch():
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        ch = sys.stdin.read(1)
        if ch == '\x03':  # For compatibility with msvcrt.getch
            raise KeyboardInterrupt
        return ch
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)

另外 UI 也需要修复好的程序命令组成的有序列表,且规则匹配耗时应该尽量较短。而加入简单的启发式算法后效果还不错,首先我们按照优先级来匹配规则,第一个返回的修复过的命令是有最大优先级的命令。当用户按下箭头按键时再选择其他的命令。所以在大多数的使用场景中都能很快完成任务。

整体来看

如果从整体来看一下这个应用,会发现它很简单:

其中 controller(控制器)是当用户使用 The Fuck 来修复错误命令时的程序入口,它初始化设置、准备 shells 的交互环境、从 Corrector (修正器)来获取修正过的命令并在 UI 中选择。Corrector 使用所有可用的规则来匹配当前命令并且返回所有可用的修复过的命令。关于UI、设置和规则就说到这里。

测试

测试是所有软件项目的最重要的部分之一。没有测试,软件可能会由于任一个改变而崩溃。我们使用 pytest 来进行单元测试。由于应用中存在规则,所以需要做很多测试来匹配和确认修正过的命令。所以,参数化的测试用例是很有用的,典型的测试是这样的:

import pytest
from thefuck.rules.cd_mkdir import match, get_new_command
from tests.utils import Command

@pytest.mark.parametrize('command', [
    Command(script='cd foo', stderr='cd: foo: No such file or directory'),
    Command(script='cd foo/bar/baz',
            stderr='cd: foo: No such file or directory'),
    Command(script='cd foo/bar/baz', stderr='cd: can\'t cd to foo/bar/baz')])
def test_match(command):
    assert match(command)

The Fuck 可以与许多种类的 shell 共同工作,而每个 shell 又需要特定的别名。为了保证所有别名可用,需要用到功能测试,其中用到了我写的 pytest-docker-pexpect 模块,在一个 docker 容器内设置一个场景来测试所有支持的命令。

发布

The Fuck 应用的最麻烦的部分是它的安装,应用通过 pip 来发布,由此产生了一些问题:

  • 有些平台上依赖 python 的头文件(python-dev),所以我们需要告诉用户手动地安装;
  • pip 不支持安装后自动完成一些自定义操作,所以用户需要手动配置一个别名;
  • 有些用户使用不支持的 python 版本,应用只支持 2.7 或者 3.3+ 的版本;
  • 有些老版本的 pip 根本就不安装依赖项;
  • 有些版本的 pip 忽视 Python 版本的依赖关系,所以需要为早于 3.4 的版本安装 pathlib;
  • 有趣的是有人对这个名字感到很愤怒并且尝试从 pypi 中移除这个包;

大多数的问题可以通过使用专门的 install 脚本解决,该脚本在内部使用了 pip,但在安装前对系统进行一些准备工作,并在安装后配置别名。


完美阅读及发表评论,请猛击:https://linux.cn/article-8478-1.html?utm_source=rss&utm_medium=rss

Samba 系列(八):使用 Samba 和 Winbind 将 Ubuntu 16.04 添加到 AD 域

$
0
0

这篇文章讲述了如何将 Ubuntu 主机加入到 Samba4 AD 域,并实现使用域帐号登录 Ubuntu 系统。

要求:

  1. 在 Ubuntu 系统上使用 Samba4 软件来创建活动目录架构

第一步: Ubuntu 系统加入到 Samba4 AD 之前的基本配置

1、在将 Ubuntu 主机加入到 AD DC 之前,你得先确保 Ubuntu 系统中的一些服务配置正常。

主机名是你的机器的一个重要标识。因此,在加入域前,使用 hostnamectl 命令或者通过手动编辑 /etc/hostname 文件来为 Ubuntu 主机设置一个合适的主机名。

# hostnamectl set-hostname your_machine_short_name
# cat /etc/hostname
# hostnamectl

Set System Hostname

设置系统主机名

2、在这一步中,打开并编辑网卡配置文件,为你的主机设置一个合适的 IP 地址。注意把 DNS 地址设置为你的域控制器的地址。

编辑 /etc/network/interfaces 文件,添加 dns-nameservers 参数,并设置为 AD 服务器的 IP 地址;添加 dns-search 参数,其值为域控制器的主机名,如下图所示。

并且,把上面设置的 DNS IP 地址和域名添加到 /etc/resolv.conf 配置文件中,如下图所示:

Configure Network Settings for AD

为 AD 配置网络设置

在上面的截图中, 192.168.1.254 和 192.168.1.253 是 Samba4 AD DC 服务器的 IP 地址, Tecmint.lan 是 AD 域名,已加入到这个域中的所有机器都可以查询到该域名。

3、重启网卡服务或者重启计算机以使网卡配置生效。使用 ping 命令加上域名来检测 DNS 解析是否正常。

AD DC 应该返回的是 FQDN 。如果你的网络中配置了 DHCP 服务器来为局域网中的计算机自动分配 IP 地址,请确保你已经把 AD DC 服务器的 IP 地址添加到 DHCP 服务器的 DNS 配置中。

# systemctl restart networking.service
# ping -c2 your_domain_name

4、最后一步是配置服务器时间同步。安装 ntpdate 包,使用下面的命令来查询并同步 AD DC 服务器的时间。

$ sudo apt-get install ntpdate
$ sudo ntpdate -q your_domain_name
$ sudo ntpdate your_domain_name

Time Synchronization with AD

AD 服务器时间同步

5、下一步,在 Ubuntu 机器上执行下面的命令来安装加入域环境所必需软件。

$ sudo apt-get install samba krb5-config krb5-user winbind libpam-winbind libnss-winbind

Install Samba4 in Ubuntu Client

在 Ubuntu 机器上安装 Samba4 软件

在 Kerberos 软件包安装的过程中,你会被询问输入默认的域名。输入大写的域名,并按 Enter 键继续安装。

Add AD Domain Name

添加 AD 域名

6、当所有的软件包安装完成之后,使用域管理员帐号来测试 Kerberos 认证,然后执行下面的命令来列出票据信息。

# kinit ad_admin_user
# klist

Check Kerberos Authentication with AD

使用 AD 来检查 Kerberos 认证是否正常

第二步:将 Ubuntu 主机添加到 Samba4 AD DC

7、将 Ubuntu 主机添加到 Samba4 活动目录域环境中的第一步是编辑 Samba 配置文件。

备份 Samba 的默认配置文件,这个配置文件是安装 Samba 软件的过程中自动生成的,使用下面的命令来重新初始化配置文件。

# mv /etc/samba/smb.conf /etc/samba/smb.conf.initial
# nano /etc/samba/smb.conf&nbsp;

在新的 Samba 配置文件中添加以下内容:

[global]
workgroup = TECMINT
realm = TECMINT.LAN
netbios name = ubuntu
security = ADS
dns forwarder = 192.168.1.1
idmap config * : backend = tdb
idmap config *:range = 50000-1000000
template homedir = /home/%D/%U
template shell = /bin/bash
winbind use default domain = true
winbind offline logon = false
winbind nss info = rfc2307
winbind enum users = yes
winbind enum groups = yes
vfs objects = acl_xattr
map acl inherit = Yes
store dos attributes = Yes

Configure Samba for AD

Samba 服务的 AD 环境配置

根据你本地的实际情况来替换 workgroup , realmnetbios name 和 dns forwarder 的参数值。

由于 winbind use default domain 这个参数会让 winbind 服务把任何登录系统的帐号都当作 AD 帐号。因此,如果存在本地帐号名跟域帐号同名的情况下,请不要设置该参数。

8、现在,你应该重启 Samba 后台服务,停止并卸载一些不必要的服务,然后启用 samba 服务的 system-wide 功能,使用下面的命令来完成。

$ sudo systemctl restart smbd nmbd winbind
$ sudo systemctl stop samba-ad-dc
$ sudo systemctl enable smbd nmbd winbind

9、通过下面的命令,使用域管理员帐号来把 Ubuntu 主机加入到 Samba4 AD DC 中。

$ sudo net ads join -U ad_admin_user

Join Ubuntu to Samba4 AD DC

把 Ubuntu 主机加入到 Samba4 AD DC

10、在 安装了 RSAT 工具的 Windows 机器上 打开 AD UC ,展开到包含的计算机。你可以看到已加入域的 Ubuntu 计算机。

Confirm Ubuntu Client in Windows AD DC

确认 Ubuntu 计算机已加入到 Windows AD DC

第三步:配置 AD 帐号认证

11、为了在本地完成 AD 帐号认证,你需要修改本地机器上的一些服务和配置文件。

首先,打开并编辑名字服务切换 (NSS) 配置文件。

$ sudo nano /etc/nsswitch.conf

然后在 passwdgroup 行添加 winbind 值,如下图所示:

passwd:         compat winbind
group:          compat winbind

Configure AD Accounts Authentication

配置 AD 帐号认证

12、为了测试 Ubuntu 机器是否已加入到域中,你可以使用 wbinfo 命令来列出域帐号和组。

$ wbinfo -u
$ wbinfo -g

List AD Domain Accounts and Groups

列出域帐号和组

13、同时,使用 getent 命令加上管道符及 grep 参数来过滤指定域用户或组,以测试 Winbind nsswitch 模块是否运行正常。

$ sudo getent passwd| grep your_domain_user
$ sudo getent group|grep 'domain admins'

Check AD Domain Users and Groups

检查 AD 域用户和组

14、为了让域帐号在 Ubuntu 机器上完成认证登录,你需要使用 root 帐号运行 pam-auth-update 命令,然后勾选 winbind 服务所需的选项,以让每个域帐号首次登录时自动创建 home 目录。

查看所有的选项,按 ‘[空格]’键选中,单击 OK 以应用更改。

$ sudo pam-auth-update

Authenticate Ubuntu with Domain Accounts

使用域帐号登录 Ubuntu 主机

15、在 Debian 系统中,如果想让系统自动为登录的域帐号创建家目录,你需要手动编辑 /etc/pam.d/common-account 配置文件,并添加下面的内容。

session    required    pam_mkhomedir.so    skel=/etc/skel/    umask=0022

Authenticate Debian with Domain Accounts

使用域帐号登录 Debian 系统

16、为了让 AD 用户能够在 Linux 的命令行下修改密码,你需要打开 /etc/pam.d/common-password 配置文件,在 password 那一行删除 use_authtok 参数,如下图所示:

password       [success=1 default=ignore]      pam_winbind.so try_first_pass

Users Allowed to Change Password

允许域帐号在 Linux 命令行下修改密码

17、要使用 Samba4 AD 帐号来登录 Ubuntu 主机,在 su - 后面加上域用户名即可。你还可以通过运行 id 命令来查看 AD 帐号的其它信息。

$ su - your_ad_user

Find AD User Information

查看 AD 用户信息

使用 pwd 命令来查看域帐号的当前目录,如果你想修改域帐号的密码,你可以使用 passwd 命令来完成。

18、如果想让域帐号在 ubuntu 机器上拥有 root 权限,你可以使用下面的命令来把 AD 帐号添加到 sudo 系统组中:

$ sudo usermod -aG sudo your_domain_user

登录域帐号登录到 Ubuntu 主机,然后运行 apt-get-update 命令来更新系统,以验证域账号是否拥有 root 权限。

Add Sudo User Root Group

给域帐号添加 root 权限

19、要为整个域用户组添加 root 权限,使用 vi 命令打开并编辑 /etc/sudoers 配置文件,如下图所示,添加如下内容:

%YOUR_DOMAIN\\your_domain\  group                ALL=(ALL:ALL) ALL

Add Root Privileges to Domain Group

为域帐号组添加 root 权限

使用反斜杠来转义域用户组的名称中包含的空格,或者用来转义第一个反斜杠。在上面的例子中, TECMINT 域的域用户组的名字是 “domain admins" 。

前边的 % 表明我们指定是的用户组而不是用户名。

20、如果你使用的是图形界面的 Ubuntu 系统,并且你想使用域帐号来登录系统,你需要修改 LightDM 显示管理器,编辑 /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 配置文件,添加下面的内容,然后重启系统才能生效。

greeter-show-manual-login=true
greeter-hide-users=true

现在你就可以域帐号来登录 Ubuntu 桌面系统了。使用域用户名或者域用户名@域名.tld 或者域名\域用户名的方式来登录系统。


作者简介:

我是一个电脑迷,开源 Linux 系统和软件爱好者,有 4 年多的 Linux 桌面、服务器系统使用和 Base 编程经验。


via: http://www.tecmint.com/join-ubuntu-to-active-directory-domain-member-samba-winbind/

作者:Matei Cezar 译者:rusking 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8479-1.html?utm_source=rss&utm_medium=rss

Fedora 25: Wayland 大战 Xorg

$
0
0

就像异形大战铁血战士的结果一样,后者略胜一筹。不管怎样,你可能知道,我最近测试了 Fedora 25,体验还可以。总的来说,这个发行版表现的相当不错。它不是最快速的,但随着一系列的改进,变得足够稳定也足够好用。最重要的是,除了一些性能以及响应性的损失,Wayland 并没有造成我的系统瘫痪。但这还仅仅是个开始。

Wayland 作为一种消费者技术还处在它的襁褓期,或者至少是当人们在处理桌面事物时应就这么认为。因此,我必须继续测试,绝不弃坑。在过去的积极地使用 Fedora 25 的几个星期里,我确实碰到了几个其它的问题,有些不用太担心,有些确实很恼人,有些很奇怪,有些却无意义。让我们来讲述一下吧!

Teaser

Wayland 并不支持所有软件

没错,这是一个事实。如果你去网站上阅读相关的信息,你会发现各种各样的软件都还没为 Wayland 做好准备。当然,我们都知道 Fedora 是一个激进的高端发行版,它是为了探索新功能而出现的测试床。这没毛病。有一段时间,所有东西都很正常,没有瞎忙活,没有错误。但接下来,我突然需要使用 GParted。我当时很着急,正在排除一个大故障,然而我却让自己置身于一些无意义的额外工作。 GParted 没办法在 Wayland 下直接启动。在探索了更多一些细节之后,我知道了该分区软件目前还没有被 Wayland 支持。

GParted 无法运行于 Wayland

问题就在于我并不太清楚其它哪些应用不能在 Wayland 下运行,并且我不能在一个正确估计的时间敏锐地发现这一点。通过在线搜索,我还是不能快速找到一个简要的当前不兼容列表。可能只是我在搜索方面不太在行,但显而易见这些东西是和“Wayland + 兼容性” 这样的问题一样零零散散的。

我找到了一个自诩 Wayland 很棒的文章、一个目前已被这个新玩意儿支持的 Gnome 应用程序列表、一些 ArchWiki 上难懂的资料,一篇在英伟达开发论坛上的晦涩得让我后悔点进去的主题,以及一些其他含糊的讨论。

再次提到性能

在 Fedora 25 上,我把登录会话从 Gnome(Wayland)切换到 Gnome Xorg,观察会对系统产生什么影响。我之前已经提到过在同一个笔记本(联想 G50)上的性能跑分和与 Fedora 24 的比较,但这次会给我们提供更加准确的结果。

Wayland(截图 1)空闲时的内存占用为 1.4GB, CPU 的平均负载约为 4-5%。Xorg(截图 2)占用了同样大小的内存,处理器消耗了全部性能的 3-4%,单纯从数字上来看少了一小点。但是 Xorg 会话的体验却好得多。虽然只是毫秒级的差距,但你能感受得到。传统的会话方式看起来更加的灵动、快速、清新一点。但 Wayland 落后得并不明显。如果你对你的电脑响应速度很敏感,你可能会对这点延迟不会太满意。当然,这也许只是作为新手缺乏优化的缘故,Wayland 会随时间进步。但这一点也是我们所不能忽视的。

Wayland resources

Xorg resources

批评

我对此并不高兴。虽然并不是很愤怒,但我不喜欢为了能完全享受我的桌面体验,我却需要登录到传统的 X 会话。因为 X 给了我全部,但 Wayland 则没有。这意味着我不能一天都用着 Wayland。我喜欢探索科技,但我不是一个盲目的狂热追随者。我只是想用我的桌面,有时我可能需要它快速响应。注销然后重新登录在急需使用的时候会成为恼人的麻烦。我们遇到这个问题的原因就是 Wayland 没有让 Linux 桌面用户的生活变得更简单,而恰恰相反。

引用:

Wayland 是为了成为 X 的更加简单的替代品,更加容易开发和维护。建议 GNOME 和 KDE 都使用它。

你能看到,这就是问题的一方面原因。东西不应该被设计成容易开发或维护。它可以是满足了所有其它消费需求之后提供的有益副产品。但如果没有,那么不管它对于程序员敲代码来说多么困难或简单都将不重要。那是他们的工作。科技的所有目的都是为了达到一种无缝并且流畅的用户体验。

不幸的是,现在很大数量的产品都被重新设计或者开发,只是为了使软件人员更加轻松,而不是用户。在很大程度上,Gnome 3、PulseAudio、Systemd 和 Wayland 都没有遵循提高用户体验的宗旨。在这个意义上来说,它们更像是一种打扰,而没有为 Linux 桌面生态的稳定性和易用性作出贡献。

这也是为什么 Linux 桌面是一个相对不成熟产品的一个主要原因————它被设计成开发人员的自我支持产品,更像一个活生生的生物,而不是依附于用户各种怪念头和想法的奴隶。这也是伟大事物是如何形成的,你满足于主要需求,接下来只是担心细节方面。优秀的用户体验不依赖于(也永远不依赖于)编程语言、编译器的选择,或任何其他无意义的东西。如果依赖了,那么不管谁来设计这个抽象层做的不够好的产品,我们都会得到一个失败的作品,需要把它的存在抹去。

那么在我的展望中,我不在乎是否要吐血十升去编译一个 Xorg 或其它什么的版本。我是一个用户,我所在乎的只是我的桌面能否像它昨天或者 5 年前一样健壮地工作。没事的情况下,我不会对宏、类、变量、声明、结构体,或其他任何极客的计算机科技感兴趣。那是不着边际的。一个产品宣传自己是被创造出来为人们的开发提供方便的,那是个悖论。如果接下来再也不用去开发它了,这样反而会使事情更简单。

现在,事实是 Wayland 大体上可用,但它仍然不像 Xorg 那么好,并且它也不应该在任何的桌面上作为就绪的产品被提供。一但它能够无人知晓般无缝地取代那些过时技术,只有在那种时候,它才获得了它所需要的成功,那之后,它可以用 C、D 或者 K 之类的无论什么语言编写,拥有开发者需要的任何东西。而在那之前,它都是一个蚕食资源和人们思想的寄生虫而已。

不要误会,我们需要进步,需要改变。但它必须为了进化的目而服务。现在 Xorg 能很好地满足用户需求了吗?它能为第三方库提供图形支持吗?它能支持 HD、UHD、DPI 或其他的什么吗?你能用它玩最新的游戏吗?行还是不行?如果不行,那么它就需要被改进。这些就是进化的驱动力,而不是写代码或者编译代码的困难程度。软件开发者是数字工业的矿工,他们需要努力工作而取悦于用户。就像短语“更加易于开发”应该被取缔一样,那些崇尚于此的人也应该用老式收音机的电池处以电刑,然后用没有空调的飞船流放到火星上去。如果你不能写出高明的代码,那是你的问题。用户不能因为开发者认为自己是公主而遭受折磨。

结语

说到这里。大体上说,Wayland 还可以,并不差。但这说的就像是某人决定修改你工资单上分配比例,导致你从昨天能赚 100% 到今天只能赚 83% 一样。讲道理这是不能接受的,即使 Wayland 工作的相当好。正是那些不能运作的东西导致如此大的不同。忽略所有批评它的一面,Wayland 被认为降低了可用性、性能以及软件的知名度,这正是 Fedora 亟待解决的问题。

其他的发行版会跟进,然后我们会看到历史重演,就像 Gnome 3 和 Systemd 所发生的一样。没有完全准备好的东西被放到开放环境中,然后我们花费一两年时间修复那些本无需修复的东西,最终我们将拥有的是我们已经拥有的相同功能,只是用不同的编程语言来实现。我并不感兴趣这些。计算机科学曾在 1999 年非常受欢迎,当时 Excel 用户每小时能赚 50 美元。而现在,编程就像是躲在平底船下划桨,人们并不会在乎你在甲板下流下的汗水与磨出的水泡。

性能可能不太是一个问题了,因为你可以放弃 1-2% 的变化,尤其是它会受随机的来自任何一个因素的影响,如果你已经用 Linux 超过一、两年你就会知道的。但是无法启动应用是个大问题。不过至少, Fedora 也友好地提供了传统的平台。但是,它可能会在 Wayland 100% 成熟前就消失了。我们再来看看,不,不会有灾难。我原本的 Fedora 25 宣称支持这种看法。我们有的就是烦恼,不必要的烦恼。啊,这是 Linux 故事中的第 9000 集。

那么,在今天结束之际,我们已经讨论了所有事情。从中我们学到:臣伏于 Xorg!天呐!真棒,现在我将淡入背景音乐,而笑声会将你的欢乐带给寒冷的夜晚。再见!

干杯。

(题图来自 ragonCon-AlienVsPredator.jpg">Wikimedia 并做了些修改, CC BY-SA 3.0 许可)


作者简介:

我是 Igor Ljubuncic。现在大约 38 岁,已婚但还没有孩子。我现在在一个大胆创新的云科技公司做首席工程师。直到大约 2015 年初,我还在一个全世界最大的 IT 公司之一中做系统架构工程师,和一个工程计算团队开发新的基于 Linux 的解决方案,优化内核以及攻克 Linux 的问题。在那之前,我是一个为高性能计算环境设计创新解决方案的团队的技术领导。还有一些其他花哨的头衔,包括系统专家、系统程序员等等。所有这些都曾是我的爱好,但从 2008 年开始成为了我的有偿的工作。还有什么比这更令人满意的呢?

从 2004 年到 2008 年间,我曾通过作为医学影像行业的物理学家来糊口。我的工作专长集中在解决问题和算法开发。为此,我广泛地使用了 Matlab,主要用于信号和图像处理。另外,我得到了几个主要的工程方法学的认证,包括 MEDIC 六西格玛绿带、试验设计以及统计工程学。

我也写过书,包括高度魔幻类和 Linux 上的技术工作方面的,彼此交织。


via: http://www.dedoimedo.com/computers/fedora-25-wayland-vs-xorg.html

作者:Igor Ljubuncic 译者:cycoe 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8480-1.html?utm_source=rss&utm_medium=rss


详解 UEFI 模式下安装 Linux

$
0
0

此页面是免费浏览的,没有烦人的外部广告;然而,我的确花了时间准备,网站托管也花了钱。如果您发现此页面帮到了您,请考虑进行小额捐款,以帮助保持网站的运行。谢谢! 原著于 2013/10/19;最后修改于 2015/3/16

引言

几年来,一种新的固件技术悄然出现,而大多数普通用户对此并无所知。该技术被称为 可扩展固件接口Extensible Firmware Interface(EFI), 或更新一些的统一可扩展固件接口(Unified EFI,UEFI,本质上是 EFI 2.x),它已经开始替代古老的 基本输入/输出系统Basic Input/Output System(BIOS)固件技术,有经验的计算机用户或多或少都有些熟悉 BIOS。

本页面是给 Linux 用户使用 EFI 技术的一个快速介绍,其中包括有关开始将 Linux 安装到此类计算机上的建议。不幸的是,EFI 是一个庞杂的话题;EFI 软件本身是复杂的,许多实现有系统特定的怪异行为甚至是缺陷。因此,我无法在一个页面上描述在 EFI 计算机上安装和使用 Linux 的一切知识。我希望你能将本页面作为一个有用的起点,不管怎么说,每个部分以及末尾“参考文献”部分的链接可以指引你找到更多的文档。

你的计算机是否使用 EFI 技术?

EFI 是一种固件,意味着它是内置于计算机中处理低级任务的软件。最重要的是,固件控制着计算机的引导过程,反过来说这代表着基于 EFI 的计算机与基于 BIOS 的计算机的引导过程不同。(有关此规律的例外之处稍后再说。)这种差异可能使操作系统安装介质的设计超级复杂化,但是一旦安装好并运行之后,它对计算机的日常操作几乎没有影响。请注意,大多数制造商使用术语 “BIOS” 来表示他们的 EFI。我认为这种用法很混乱,所以我避免了;在我看来,EFI 和 BIOS 是两种不同类型的固件。

注意:苹果公司的 Mac 使用的 EFI 在许多方面是不同寻常的。尽管本页面的大部分内容同样适用于 Mac,但有些细节上的出入,特别是在设置 EFI 引导加载程序的时候。这个任务最好在 OS X 上进行,使用 Mac 的 bless utility工具,我不在此做过多描述。

自从 2006 年第一次推出以来,EFI 已被用于基于英特尔的 Mac 上。从 2012 年底开始,大多数安装 Windows 8 或更高版本系统的计算机就已经默认使用 UEFI 启动,实际上大多数 PC 从 2011 年中期就开始使用 UEFI,虽然默认情况下它们可能无法以 EFI 模式启动。2011 年前销出的 PC 也有一些支持 EFI,尽管它们大都默认使用 BIOS 模式启动。

如果你不确定你的计算机是否支持 EFI,则应查看固件设置实用程序和参考用户手册关于 EFIUEFI 以及 legacy booting 的部分。(可以通过搜索用户手册的 PDF 文件来快速了解。)如果你没有找到类似的参考,你的计算机可能使用老式的(“legacy”) BIOS 引导;但如果你找到了这些术语的参考,几乎可以肯定它使用了 EFI 技术。你还可以尝试有 EFI 模式的引导加载器的安装介质。使用 rEFInd 制作的 USB 闪存驱动器或 CD-R 镜像是用来测试不错的选择。

在继续之前,你应当了解大多数 x86 和 x86-64 架构的计算机上的 EFI 都包含一个叫做兼容支持模块Compatibility Support Module(CSM)的组件,这使得 EFI 能够使用旧的 BIOS 风格的引导机制来引导操作系统。这会非常方便,因为它向后兼容;但是这样也导致一些意外情况的发生,因为计算机不论以 EFI 模式引导还是以 BIOS (也称为 CSM 或 legacy)模式引导,在控制时没有标准的使用规范和用户界面。特别地,你的 Linux 安装介质非常容易意外的以 BIOS/CSM/legacy 模式启动,这会导致 Linux 以 BIOS/CSM/legacy 模式安装。如果 Linux 是唯一的操作系统,也可以正常工作,但是如果与在 EFI 模式下的 Windows 组成双启动的话,就会非常复杂。(反过来问题也可能发生。)以下部分将帮助你以正确模式引导安装程序。如果你在阅读这篇文章之前就已经以 BIOS 模式安装了 Linux,并且希望切换引导模式,请阅读后续章节,“哎呀:将传统模式下安装的引导转为 EFI 模式下的引导”。

UEFI 的一个附加功能值得一提:安全启动Secure Boot。此特性旨在最大限度的降低计算机受到 boot kit 病毒感染的风险,这是一种感染计算机引导加载程序的恶意软件。Boot kits 很难检测和删除,阻止它们的运行刻不容缓。微软公司要求所有带有支持 Windows 8 标志的台式机和笔记本电脑启用 安全启动。这一配置使 Linux 的安装变得复杂,尽管有些发行版可以较好的处理这个问题。不要将安全启动和 EFI 或 UEFI 混淆;支持 EFI 的计算机不一定支持 安全启动,而且支持 EFI 的 x86-64 的计算机也可以禁用 安全启动。微软同意用户在 Windows 8 认证的 x86 和 x86-64 计算机上禁用安全启动功能;然而对装有 Windows 8 的 ARM 计算机而言却相反,它们必须不允许用户禁用 安全启动。幸运的是,基于 ARM 的 Windows 8 计算机目前很少见。我建议避免使用它们。

你的发行版是否支持 EFI 技术?

大多数 Linux 发行版已经支持 EFI 好多年了。然而,不同的发行版对 EFI 的支持程度不同。大多数主流发行版(Fedora,OpenSUSE,Ubuntu 等)都能很好的支持 EFI,包括对安全启动的支持。另外一些“自行打造”的发行版,比如 Gentoo,对 EFI 的支持较弱,但它们的性质使其很容易添加 EFI 支持。事实上,可以向任意 Linux 发行版添加 EFI 支持:你需要安装 Linux(即使在 BIOS 模式下),然后在计算机上安装 EFI 引导加载程序。有关如何执行此操作的信息,请参阅“哎呀:将传统模式下安装的引导转为 EFI 模式下的引导”部分。

你应当查看发行版的功能列表,来确定它是否支持 EFI。你还应当注意你的发行版对安全启动的支持情况,特别是如果你打算和 Windows 8 组成双启动。请注意,即使正式支持安全启动的发行版也可能要求禁用此功能,因为 Linux 对安全启动的支持通常很差劲,或者导致意外情况的发生。

准备安装 Linux

下面几个准备步骤有助于在 EFI 计算机上 Linux 的安装,使其更加顺利:

1、 升级固件

有些 EFI 是有问题的,不过硬件制造商偶尔会发布其固件的更新。因此我建议你将固件升级到最新可用的版本。如果你从论坛的帖子知道自己计算机的 EFI 有问题,你应当在安装 Linux 之前更新它,因为如果安装 Linux 之后更新固件,会有些问题需要额外的操作才能解决。另一方面,升级固件是有一定风险的,所以如果制造商提供了 EFI 支持,最好的办法就是按它们提供的方式进行升级。

2、 了解如何使用固件

通常你可以通过在引导过程之初按 Del 键或功能键进入固件设置实用程序。按下开机键后尽快查看相关的提示信息,或者尝试每个功能键。类似的,ESC 键或功能键通常可以进入固件的内置引导管理器,可以选择要进入的操作系统或外部设备。一些制造商把这些设置隐藏的很深。在某些情况下,如此页面所述,你可以在 Windows 8 内做到这些。

3、调整以下固件设置

  • 快速启动 — 此功能可以通过在硬件初始化时使用快捷方式来加快引导过程。这很好用,但有时候会使 USB 设备不能初始化,导致计算机无法从 USB 闪存驱动器或类似的设备启动。因此禁用快速启动可能有一定的帮助,甚至是必须的;你可以让它保持激活,而只在 Linux 安装程序启动遇到问题时将其停用。请注意,此功能有时可能会以其它名字出现。在某些情况下,你必须启用 USB 支持,而不是禁用快速启动功能。
  • 安全启动 — Fedora,OpenSUSE,Ubuntu 以及其它的发行版官方就支持安全启动;但是如果在启动引导加载程序或内核时遇到问题,可能需要禁用此功能。不幸的是,没办法具体描述怎么禁用,因为不同计算机的设置方法也不同。请参阅我的安全启动页面获取更多关于此话题的信息。

    注意: 一些教程说安装 Linux 时需要启用 BIOS/CSM/legacy 支持。通常情况下,这样做是错的。启用这些支持可以解决启动安装程序涉及的问题,但也会带来新的问题。以这种方式安装的教程通常可以通过“引导修复”来解决这些问题,但最好从一开始就做对。本页面提供了帮助你以 EFI 模式启动 Linux 安装程序的提示,从而避免以后的问题。

  • CSM/legacy 选项 — 如果你想以 EFI 模式安装,请关闭这些选项。一些教程推荐启用这些选项,有时这是必须的 —— 比如,有些附加视频卡需要在固件中启用 BIOS 模式。尽管如此,大多数情况下启用 CSM/legacy 支持只会无意中增加以 BIOS 模式启动 Linux 的风险,但你并不想这样。请注意,安全启动和 CSM/legacy 选项有时会交织在一起,因此更改任一选项之后务必检查另一个。

4、 禁用 Windows 的快速启动功能

这个页面描述了如何禁用此功能,不禁用的话会导致文件系统损坏。请注意此功能与固件的快速启动不同。

5、 检查分区表

使用 GPT fdisk、parted 或其它任意分区工具检查磁盘分区。理想情况下,你应该创建一个包含每个分区确切起点和终点(以扇区为单位)的纸面记录。这会是很有用的参考,特别是在安装时进行手动分区的时候。如果已经安装了 Windows,确定可以识别你的 EFI 系统分区(ESP),它是一个 FAT 分区,设置了“启动标记”(在 parted 或 Gparted 中)或在 gdisk 中的类型码为 EF00。

安装 Linux

大部分 Linux 发行版都提供了足够的安装说明;然而我注意到了在 EFI 模式安装中的几个常见的绊脚石:

  • 确保使用正确位深的发行版 — EFI 启动加载器和 EFI 自身的位深相同。现代计算机通常是 64 位,尽管最初几代基于 Intel 的 Mac、一些现代的平板电脑和变形本、以及一些鲜为人知的电脑使用 32 位 EFI。虽然可以将 32 位 EFI 引导加载程序添加至 32 位发行版,但我还没有遇到过正式支持 32 位 EFI 的 Linux 发行版。(我的 《在 Linux 上管理 EFI 引导加载程序》 一文概述了引导加载程序,而且理解了这些原则你就可以修改 32 位发行版的安装程序,尽管这不是一个初学者该做的。)在 64 位 EFI 的计算机上安装 32 位发行版最让人头疼,我不准备在这里描述这一过程;在具有 64 位 EFI 的计算机上,你应当使用 64 位的发行版。
  • 正确准备引导介质 — 将 .iso 镜像传输到 USB 闪存驱动器的第三方工具,比如 unetbootin,在创建正确的 EFI 模式引导项时经常失败。我建议按照发行版维护者的建议来创建 USB 闪存驱动器。如果没有类似的建议,使用 Linux 的 dd 工具,通过执行 dd if=image.iso of=/dev/sdc 在识别为 /dev/sdc 的 USB 闪存驱动器上创建一个镜像。至于 Windows,有 WinDDdd for windows,但我从没测试过它们。请注意,使用不兼容 EFI 的工具创建安装介质是错误的,这会导致人们进入在 BIOS 模式下安装然后再纠正它们的误区,所以不要忽视这一点!
  • 备份 ESP 分区 — 如果计算机已经存在 Windows 或者其它的操作系统,我建议在安装 Linux 之前备份你的 ESP 分区。尽管 Linux 不应该 损坏 ESP 分区已有的文件,但似乎这时不时发生。发生这种事情时备份会有很大用处。只需简单的文件级的备份(使用 cp,tar,或者 zip 类似的工具)就足够了。
  • 以 EFI 模式启动 — 以 BIOS/CSM/legacy 模式引导 Linux 安装程序的意外非常容易发生,特别是当固件启用 CSM/legacy 选项时。下面一些提示可以帮助你避免此问题:
    • 进入 Linux shell 环境执行 ls /sys/firmware/efi 验证当前是否处于 EFI 引导模式。如果你看到一系列文件和目录,表明你已经以 EFI 模式启动,而且可以忽略以下多余的提示;如果没有,表明你是以 BIOS 模式启动的,应当重新检查你的设置。
    • 使用固件内置的引导管理器(你应该已经知道在哪;请参阅“了解如何使用固件”)使之以 EFI 模式启动。一般你会看到 CD-R 或 USB 闪存驱动器两个选项,其中一个选项包括 EFIUEFI 字样的描述,另一个不包括。使用 EFI/UEFI 选项来启动介质。
    • 禁用安全启动 - 即使你使用的发行版官方支持安全启动,有时它们也不能生效。在这种情况下,计算机会静默的转到下一个引导加载程序,它可能是启动介质的 BIOS 模式的引导加载程序,导致你以 BIOS 模式启动。请参阅我的安全启动的相关文章以得到禁用安全启动的相关提示。
    • 如果 Linux 安装程序总是无法以 EFI 模式启动,试试用我的 rEFInd 引导管理器 制作的 USB 闪存驱动器或 CD-R。如果 rEFInd 启动成功,那它保证是以 EFI 模式运行的,而且在基于 UEFI 的 PC 上,它只显示 EFI 模式的引导项,因此若您启动到 Linux 安装程序,则应处于 EFI 模式。(但是在 Mac 上,除了 EFI 模式选项之外,rEFInd 还显示 BIOS 模式的引导项。)
  • 准备 ESP 分区 — 除了 Mac,EFI 使用 ESP 分区来保存引导加载程序。如果你的计算机已经预装了 Windows,那么 ESP 分区就已存在,可以在 Linux 上直接使用。如果不是这样,那么我建议创建一个大小为 550 MB 的 ESP 分区。(如果你已有的 ESP 分区比这小,别担心,直接用就行。)在此分区上创建一个 FAT32 文件系统。如果你使用 Gparted 或者 parted 准备 ESP 分区,记得给它一个“启动标记”。如果你使用 GPT fdisk(gdisk,cgdisk 或 sgdisk)准备 ESP 分区,记得给它一个名为 EF00 的类型码。有些安装程序会创建一个较小的 ESP 分区,并且设置为 FAT16 文件系统。尽管这样能正常工作,但如果你之后需要重装 Windows,安装程序会无法识别 FAT16 文件系统的 ESP 分区,所以你需要将其备份后转为 FAT32 文件系统。
  • 使用 ESP 分区 — 不同发行版的安装程序以不同的方式辨识 ESP 分区。比如,Debian 和 Ubuntu 的某些版本把 ESP 分区称为“EFI boot partition”,而且不会明确显示它的挂载点(尽管它会在后台挂载);但是有些发行版,像 Arch 或 Gentoo,需要你去手动挂载。尽管将 ESP 分区挂载到 /boot 进行相应配置后可以正常工作,特别是当你想使用 gummiboot 或 ELILO(译者注:gummiboot 和 ELILO 都是 EFI 引导工具)时,但是在 Linux 中最标准的 ESP 分区挂载点是 /boot/efi。某些发行版的 /boot 不能用 FAT 分区。因此,当你设置 ESP 分区挂载点时,请将其设置为 /boot/efi。除非 ESP 分区没有,否则不要为其新建文件系统 — 如果已经安装 Windows 或其它操作系统,它们的引导文件都在 ESP 分区里,新建文件系统会销毁这些文件。
  • 设置引导程序的位置 — 某些发行版会询问将引导程序(GRUB)装到何处。如果 ESP 分区按上述内容正确标记,不必理会此问题,但有些发行版仍会询问。请尝试使用 ESP 分区。
  • 其它分区 — 除了 ESP 分区,不再需要其它的特殊分区;你可以设置 根(/)分区,swap 分区,/home 分区,或者其它分区,就像你在 BIOS 模式下安装时一样。请注意 EFI 模式下不需要设置BIOS 启动分区,所以如果安装程序提示你需要它,意味着你可能意外的进入了 BIOS 模式。另一方面,如果你创建了 BIOS 启动分区,会更灵活,因为你可以安装 BIOS 模式下的 GRUB,然后以任意模式(EFI 模式 或 BIOS 模式)引导。
  • 解决无显示问题 — 2013 年,许多人在 EFI 模式下经常遇到(之后出现的频率逐渐降低)无显示的问题。有时可以在命令行下通过给内核添加 nomodeset 参数解决这一问题。在 GRUB 界面按 e 键会打开一个简易文本编辑器。大多数情况下你需要搜索有关此问题的更多信息,因为此问题更多是由特定硬件引起的。

在某些情况下,你可能不得不以 BIOS 模式安装 Linux。但你可以手动安装 EFI 引导程序让 Linux 以 EFI 模式启动。请参阅《 在 Linux 上管理 EFI 引导加载程序》 页面获取更多有关它们以及如何安装的可用信息。

解决安装后的问题

如果 Linux 无法在 EFI 模式下工作,但在 BIOS 模式下成功了,那么你可以完全放弃 EFI 模式。在只有 Linux 的计算机上这非常简单;安装 BIOS 引导程序即可(如果你是在 BIOS 模式下安装的,引导程序也应随之装好)。如果是和 EFI 下的 Windows 组成双系统,最简单的方法是安装我的 rEFInd 引导管理器。在 Windows 上安装它,然后编辑 refind.conf 文件:取消注释 scanfor 一行,并确保拥有 hdbios 选项。这样 rEFInd 在引导时会重定向到 BIOS 模式的引导项。

如果重启后计算机直接进入了 Windows,很可能是 Linux 的引导程序或管理器安装不正确。(但是应当首先尝试禁用安全启动;之前提到过,它经常引发各种问题。)下面是关于此问题的几种可能的解决方案:

  • 使用 efibootmgr — 你可以以 EFI 模式引导一个 Linux 急救盘,使用 efibootmgr 实用工具尝试重新注册你的 Linux 引导程序,如这里所述。
  • 使用 Windows 上的 bcdedit — 在 Windows 管理员命令提示符窗口中,输入 bcdedit /set {bootmgr}path \EFI\fedora\grubx64.efi 会用 ESP 分区的 EFI/fedora/grubx64.efi 文件作为默认的引导加载程序。根据需要更改此路径,指向你想设置的引导文件。如果你启用了安全启动,需要设置 shim.efishimx64.efi 或者 PreLoader.efi(不管有哪个)为引导而不是 grubx64.efi
  • 安装 rEFInd — 有时候 rEFInd 可以解决这个问题。我推荐使用 CD-R 或者 USB 闪存驱动器进行测试。如果 Linux 可以启动,就安装 Debian 软件包、RPM 程序,或者 .zip 文件包。(请注意,你需要在一个高亮的 Linux vmlinuz* 选项按两次 F2Insert 修改启动选项。如果你的启动分区是单独的,这就更有必要了,因为这种情况下,rEFInd 无法找到根(/)分区,也就无法传递参数给内核。)
  • 使用修复引导程序 — Ubuntu 的引导修复实用工具可以自动修复一些问题;然而,我建议只在 Ubuntu 和 密切相关的发行版上使用,比如 Mint。有时候,有必要通过高级选项备份并替换 Windows 的引导。
  • 劫持 Windows 引导程序 — 有些不完整的 EFI 引导只能引导 Windows,就是 ESP 分区上的 EFI/Microsoft/Boot/bootmgfw.efi 文件。因此,你可能需要将引导程序改名(我建议将其移动到上级目录 EFI/Microsoft/bootmgfw.efi),然后将首选引导程序复制到这里。(大多数发行版会在 EFI 的子目录放置 GRUB 的副本,例如 Ubuntu 的 EFI/ubuntu,Fedora 的 EFI/fedora。)请注意此方法是个丑陋的解决方法,有用户反映 Windows 会替换引导程序,所以这个办法不是 100% 有效。然而,这是在不完整的 EFI 上生效的唯一办法。在尝试之前,我建议你升级固件并重新注册自己的引导程序,Linux 上用 efibootmgr,Windows 上用 bcdedit。

有关引导程序的其它类型的问题 - 如果 GRUB(或者你的发行版默认的其它引导程序或引导管理器)没有引导操作系统,你必须修复这个问题。因为 GRUB 2 引导 Windows 时非常挑剔,所以 Windows 经常启动失败。在某些情况下,安全启动会加剧这个问题。请参阅我的关于 GRUB 2 的页面获取一个引导 Windows 的 GRUB 2 示例。还会有很多原因导致 Linux 引导出现问题,类似于 BIOS 模式下的情况,所以我没有全部写出来。

尽管 GRUB 2 使用很普遍,但我对它的评价却不高 - 它很复杂,而且难以配置和使用。因此,如果你在使用 GRUB 的时候遇到了问题,我的第一反应就是用别的东西代替。我的用于 Linux 的 EFI 引导程序页面有其它的选择。其中包括我的 rEFInd 引导管理器,它除了能够让许多发行版上的 GRUB 2 工作,也更容易安装和维护 - 但是它还不能完全代替 GRUB 2。

除此之外,EFI 引导的问题可能很奇怪,所以你需要去论坛发帖求助。尽量将问题描述完整。Boot Info Script 可帮助你提供有用的信息 - 运行此脚本,将生成的名为 RESULTS.txt 的文件粘贴到论坛的帖子上。一定要将文本粘贴到

  1. </code> 和 <code>
复制代码
之间;不然会遭人埋怨。或者将 RESULTS.txt 文件上传到 pastebin 网站上,比如 pastebin.com,然后将网站给你的 URL 地址发布到论坛。

哎呀:将传统模式下安装的系统转为 EFI 模式下引导

警告:这些指南主要用于基于 UEFI 的 PC。如果你的 Mac 已经安装了 BIOS 模式下的 Linux,但想以 EFI 模式启动 Linux,可以在 OS X 中安装引导程序。rEFInd(或者旧式的 rEFIt)是 Mac 上的常用选择,但 GRUB 可以做的更多。

论坛上有很多人看了错误的教程,在已经存在 EFI 模式的 Windows 的情况下,安装了 BIOS 引导的 Linux,这一问题在 2015 年初很普遍。这样配置效果很不好,因为大多数 EFI 很难在两种模式之间切换,而且 GRUB 也无法胜任这项工作。你可能会遇到不完善的 EFI 无法启动外部介质的情况,也可能遇到 EFI 模式下的显示问题,或者其它问题。

如前所述,在“解决安装后的问题”部分,解决办法之一就是在 Windows 上安装 rEFInd,将其配置为支持 BIOS 模式引导。然后可以引导 rEFInd 并链式引导到你的 BIOS 模式的 GRUB。在 Linux 上遇到 EFI 特定的问题时,例如无法使用显卡,我建议你使用这个办法修复。如果你没有这样的 EFI 特定的问题,在 Windows 中安装 rEFInd 和合适的 EFI 文件系统驱动可以让 Linux 直接以 EFI 模式启动。这个解决方案很完美,它和我下面描述的内容等同。

大多数情况下,最好将 Linux 配置为以 EFI 模式启动。有很多办法可以做到,但最好的是使用 Linux 的 EFI 引导模式(或者,可以想到,Windows,或者一个 EFI shell)注册到你首选的引导管理器。实现这一目标的方法如下:

  1. 下载适用于 USB 闪存驱动器或 CD-R 的 rEFInd 引导管理器
  2. 从下载的镜像文件生成安装介质。可以在任何计算机上准备,不管是 EFI 还是 BIOS 的计算机都可以(或者在其它平台上使用其它方法)。
  3. 如果你还没有这样做,请禁用安全启动。因为 rEFInd CD-R 和 USB 镜像不支持安全启动,所以这很必要,你可以在以后重新启用它。
  4. 在目标计算机上启动 rEFInd。如前所述,你可能需要调整固件设置,并使用内置引导管理器选择要引导的介质。你选择的那一项也许在其描述中包含 UEFI 这样的字符串。
  5. 在 rEFInd 上测试引导项。你应该至少看到一个启动 Linux 内核的选项(名字含有 vmlinuz 这样的字符串)。有两种方法可以启动它:

    • 如果你没有独立的 /boot 分区,只需简单的选择内核并按回车键。Linux 就会启动。
    • 如果你确定有一个独立的 /boot 分区,按两次 InsertF2 键。这样会打开一个行编辑器,你可以用它来编辑内核选项。增加一个 root= 格式以标识根(/)文件系统,如果根(/)分区在 /dev/sda5 上,就添加 root=/dev/sda5。如果不知道根文件系统在哪里,那你需要重启并尽可能想到办法。

    在一些罕见的情况下,你可能需要添加其它内核选项来代替或补充 root= 选项。比如配置了 LVM(LCTT 译注:Logical Volume Manager,逻辑卷管理)的 Gentoo 就需要 dolvm 选项。

  6. Linux 一旦启动,安装你想要的引导程序。rEFInd 的安装很简单,可以通过 RPM、Debian 软件包、PPA,或从rEFInd 下载页面下载的二进制 .zip 文件进行安装。在 Ubuntu 和相关的发行版上,引导修改程序可以相对简单地修复你的 GRUB 设置,但你要对它有信心可以正常工作。(它通常工作良好,但有时候会把事情搞得一团糟。)另外一些选项都在我的 《在 Linux 上管理 EFI 引导加载程序》 页面上。

  7. 如果你想在安全启动激活的情况下引导,只需重启并启用它。但是,请注意,可能需要额外的安装步骤才能将引导程序设置为使用安全启动。有关详细信息,请参阅我关于这个主题的页面或你的引导程序有关安全启动的文档资料。

重启时,你可以看到刚才安装的引导程序。如果计算机进入了 BIOS 模式下的 GRUB,你应当进入固件禁用 BIOS/CSM/legacy 支持,或调整引导顺序。如果计算机直接进入了 Windows,那么你应当阅读前一部分,“解决安装后的问题”。

你可能想或需要调整你的配置。通常是为了看到额外的引导选项,或者隐藏某些选项。请参阅引导程序的文档资料,以了解如何进行这些更改。

参考和附加信息

(题图:Pixabay,CC0)


via: http://www.rodsbooks.com/linux-uefi/

作者:Roderick W. Smith 译者:fuowang 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8481-1.html?utm_source=rss&utm_medium=rss

Fedora 官方合法地全面支持 MP3 编码方案

$
0
0

MP3 的编码和解码不久将被 Fedora 官方支持。

去年十一月,随着覆盖了 MP3 解码的专利失效后,Fedora Workstation 通过 mpg123 库和 GStreamer 启用了 MP3 解码支持。该更新允许用户通过安装在他们的计算机中的 gstreamer1-plugin-mpg123 软件包来播放 MP3 编码的音乐。

MP3 编码方案在过去十年间和开源界闹得颇不愉快,尤其是在美国。在历史上,由于许可证问题,Fedora 不能在其基础发行版上包括 MP3 解码或编码功能,所以,很多用户只能通过第三方软件库来提供 MP3 支持。

两周前,由于专利到期,IIS Fraunhofer and Technicolor 终止了他们的授权流程,并在几天前, Red Hat 法律部门批准了在 Fedora 中提供 MP3 编码支持。不过还需要一点时间进行软件包审查,该工具是确定会被加入的。同时要说明的是只包括 MP3 而非其它的 MPEG 技术。相信很快我们就可以在 Fedora 中不用第三方库即可转换各种格式的音乐为 MP3 了。

附录:

MP3 的开发始于上世纪八十年代的 Fraunhofer IIS,其基于之前的埃尔兰根-纽伦堡大学的研究成功而开发。2017 年 4 月 23, Technicolor 结束了 MP3 的相关专利授权流程。虽然今天 MP3 已经不是最有效、最先进的音频编码方案了,但是在过去的二十年间,MP3 一直是最流行的音频编码方案,在之后若干年,MP3 想必也会流行依旧。

以下是来自 mp3-history.com 上的两张开发团队合影,有关 MP3 的历史信息也请查阅此网站:

MP3 开发团队,摄于 1987 年

MP3 开发团队,摄于 2007 年

 


完美阅读及发表评论,请猛击:https://linux.cn/article-8482-1.html?utm_source=rss&utm_medium=rss

Linux 容器能否弥补 IoT 的安全短板?

$
0
0

在这个最后的物联网系列文章中,Canonical 和 Resin.io 向以 Linux 容器技术作为解决方案向物联网安全性和互操作性发起挑战。

尽管受到日益增长的安全威胁,但对物联网(IoT)的炒作没有显示减弱的迹象。为了刷存在感,公司们正忙于重新规划它们的物联网方面的路线图。物联网大潮迅猛异常,比移动互联网革命渗透的更加深入和广泛。IoT 像黑洞一样,吞噬一切,包括智能手机,它通常是我们通向物联网世界的窗口,有时也作为我们的汇聚点或终端。

新的针对物联网的处理器和嵌入式主板继续重塑其技术版图。自从 9 月份推出 面向物联网的 Linux 和开源硬件 系列文章之后,我们看到了面向物联网网关的 “Apollo Lake]” SoC 芯片 Intel Atom E3900 以及三星 新的 Artik 模块,包括用于网关并由 Linux 驱动的 64 位 Artik 7 COM 及自带 RTOS 的 Cortex-M4 Artik。 ARM 为具有 ARMv8-M 和 TrustZone 安全性的 IoT 终端发布了 Cortex-M23 和 Cortex-M33 芯片。

Artik 7

讲道理,安全是这些产品的卖点。最近攻击 Dyn 服务并在一天内摧毁了美国大部分互联网的 Mirai 僵尸网络将基于 Linux 的物联网推到台前 - 当然这种方式似乎不太体面。就像 IoT 设备可以成为 DDoS 的帮凶一样,设备及其所有者同样可能直接遭受恶意攻击。

Cortex-M33 和 -M23

Dyn 攻击事件更加证明了这种观点,即物联网将更加蓬勃地在受控制和受保护的工业环境发展,而不是家用环境中。这不是因为没有消费级物联网安全技术,但除非产品设计之初就以安全为目标,否则如我们的智能家居集线器系列中的许多解决方案一样,后期再考虑安全就会增加成本和复杂性。

在物联网系列的最后这个未来展望的部分,我们将探讨两种基于 Linux 的面向 Docker 的容器技术,这些技术被提出作为物联网安全解决方案。容器还可以帮助解决我们在物联网框架中探讨的开发复杂性和互操作性障碍的问题。

我们与 Canonical 的 Ubuntu 客户平台工程副总裁 Oliver Ries 讨论了 Ubuntu Core 和适用于 Docker 的容器式 Snaps 包管理技术。我们还就新的基于 Docker 的物联网方案 ResinOS 采访了 Resin.io 首席执行官和联合创始人 Alexandros Marinos。

Ubuntu Core Snaps

Canonical 面向物联网的 Snappy Ubuntu Core 版本的 Ubuntu 是围绕一个类似容器的快照包管理机制而构建的,并提供应用商店支持。 snaps 技术最近自行发布了用于其他 Linux 发行版的版本。去年 11 月 3 日,Canonical 发布了 Ubuntu Core 16,该版本改进了白标应用商店和更新控制服务。

传统 Ubuntu(左)架构 与 Ubuntu Core 16

快照机制提供自动更新,并有助于阻止未经授权的更新。 使用事务系统管理,快照可确保更新按预期部署或根本不部署。 在 Ubuntu Core 中,使用 AppArmor 进一步加强了安全性,并且所有应用程序文件都是只读的且保存在隔离的孤岛中。

LimeSDR

Ubuntu Core 是我们最近展开的开源物联网操作系统调查的一部分,现在运行于 Gumstix 主板、Erle 机器人无人机、Dell Edge 网关、Nextcloud Box、LimeSDR、Mycroft 家庭集线器、英特尔的 Joule 和符合 Linaro 的 96Boards 规范的 SBC(单板计算机) 上。 Canonical 公司还与 Linaro 物联网和嵌入式(LITE)部门集团在其 96Boards 物联网版(IE) 上达成合作。最初,96Boards IE 专注于 Zephyr 驱动的 Cortex-M4 板卡,如 Seeed 的 BLE Carbon,不过它将扩展到可以运行 Ubuntu Core 的网关板卡上。

“Ubuntu Core 和 snaps 具有从边缘到网关到云的相关性,”Canonical 的 Ries 说。 “能够在任何主要发行版(包括 Ubuntu Server 和 Ubuntu for Cloud)上运行快照包,使我们能够提供一致的体验。 snaps 可以使用事务更新以免故障方式升级,可用于安全性更新、错误修复或新功能的持续更新,这在物联网环境中非常重要。”

Nextcloud盒子

安全性和可靠性是关注的重点,Ries 说。 “snaps 应用可以完全独立于彼此和操作系统而运行,使得两个应用程序可以安全地在单个网关上运行,”他说。 “snaps 是只读的和经过认证的,可以保证代码的完整性。

Ries 还说这种技术减少开发时间。 “snap 软件包允许开发人员向支持它的任何平台提供相同的二进制包,从而降低开发和测试成本,减少部署时间和提高更新速度。 “使用 snap 软件包,开发人员完可以全控制开发生命周期,并可以立即更新。 snap 包提供了所有必需的依赖项,因此开发人员可以选择定制他们使用的组件。”

ResinOS: 为 IoT 而生的 Docker

Resin.io 公司,与其商用的 IoT 框架同名,最近剥离了该框架的基于 Yocto Linux 的 ResinOS 2.0,ResinOS 2.0 将作为一个独立的开源项目运营。 Ubuntu Core 在 snap 包中运行 Docker 容器引擎,ResinOS 在主机上运行 Docker。 极致简约的 ResinOS 抽离了使用 Yocto 代码的复杂性,使开发人员能够快速部署 Docker 容器。

ResinOS 2.0 架构

与基于 Linux 的 CoreOS 一样,ResinOS 集成了 systemd 控制服务和网络协议栈,可通过异构网络安全地部署更新的应用程序。 但是,它是为在资源受限的设备(如 ARM 黑客板)上运行而设计的,与之相反,CoreOS 和其他基于 Docker 的操作系统(例如基于 Red Hat 的 Project Atomic)目前仅能运行在 x86 上,并且更喜欢资源丰富的服务器平台。 ResinOS 可以在 20 中 Linux 设备上运行,并不断增长,包括 Raspberry Pi,BeagleBone 和Odroid-C1 等。

“我们认为 Linux 容器对嵌入式系统比对于云更重要,”Resin.io 的 Marinos 说。 “在云中,容器代表了对之前的进程的优化,但在嵌入式中,它们代表了姗姗来迟的通用虚拟化“

BeagleBone Black

当应用于物联网时,完整的企业级虚拟机有直接访问硬件的限制的性能缺陷,Marinos 说。像 OSGi 和 Android 的Dalvik 这样的移动设备虚拟机可以用于 IoT,但是它们依赖 Java 并有其他限制。

对于企业开发人员来说,使用 Docker 似乎很自然,但是你如何说服嵌入式黑客转向全新的范式呢? “Marinos 解释说,”ResinOS 不是把云技术的实践经验照单全收,而是针对嵌入式进行了优化。”此外,他说,容器比典型的物联网技术更好地包容故障。 “如果有软件缺陷,主机操作系统可以继续正常工作,甚至保持连接。要恢复,您可以重新启动容器或推送更新。更新设备而不重新启动它的能力进一步消除了故障引发问题的机率。”

据 Marinos 所说,其他好处源自与云技术的一致性,例如拥有更广泛的开发人员。容器提供了“跨数据中心和边缘的统一范式,以及一种方便地将技术、工作流、基础设施,甚至应用程序转移到边缘(终端)的方式。”

Marinos 说,容器中的固有安全性优势正在被其他技术增强。 “随着 Docker 社区推动实现镜像签名和鉴证,这些自然会转移并应用到 ResinOS,”他说。 “当 Linux 内核被强化以提高容器安全性时,或者获得更好地管理容器所消耗的资源的能力时,会产生类似的好处。

容器也适合开源 IoT 框架,Marinos 说。 “Linux 容器很容易与几乎各种协议、应用程序、语言和库结合使用,”Marinos 说。 “Resin.io 参加了 AllSeen 联盟,我们与使用 IoTivity 和 Thread的 伙伴一起合作。”

IoT的未来:智能网关与智能终端

Marinos 和 Canonical 的 Ries 对未来物联网的几个发展趋势具有一致的看法。 首先,物联网的最初概念(其中基于 MCU 的端点直接与云进行通信以进行处理)正在迅速被雾化计算架构所取代。 这需要更智能的网关,也需要比仅仅在 ZigBee 和 WiFi 之间聚合和转换数据更多的功能。

其次,网关和智能边缘设备越来越多地运行多个应用程序。 第三,许多这些设备将提供板载分析,这些在最新的智能家居集线器上都有体现。 最后,富媒体将很快成为物联网组合的一部分。

最新设备网关: Eurotech 的 ReliaGate 20-26

最新设备网关: Advantech 的 UBC-221

“智能网关正在接管最初为云服务设计的许多处理和控制功能,”Marinos 说。 “因此,我们看到对容器化的推动力在增加,可以在 IoT 设备中使用类似云工作流程来部署与功能和安全相关的优化。去中心化是由移动数据紧缩、不断发展的法律框架和各种物理限制等因素驱动的。”

Ubuntu Core 等平台正在使“可用于网关的软件爆炸式增长”,Canonical 的 Ries 说。 “在单个设备上运行多个应用程序的能力吸引了众多单一功能设备的用户,以及现在可以产生持续的软件收入的设备所有者。”

两种 IoT 网关: MyOmega MYNXG IC2 Controller

两种 IoT 网关: TechNexion 的 LS1021A-IoT Gateway

不仅是网关 - 终端也变得更聪明。 “阅读大量的物联网新闻报道,你得到的印象是所有终端都运行在微控制器上,”Marinos 说。 “但是我们对大量的 Linux 终端,如数字标牌,无人机和工业机械等直接执行任务,而不是作为操作中介(数据转发)感到惊讶。我们称之为影子 IoT。”

Canonical 的 Ries 同意,对简约技术的专注使他们忽视了新兴物联网领域。 “轻量化的概念在一个发展速度与物联网一样快的行业中初现端倪,”Ries 说。 “今天的高级消费硬件可以持续为终端供电数月。”

虽然大多数物联网设备将保持轻量和“无头”(一种配置方式,比如物联网设备缺少显示器,键盘等),它们装备有如加速度计和温度传感器这样的传感器并通过低速率的数据流通信,但是许多较新的物联网应用已经使用富媒体。 “媒体输入/输出只是另一种类型的外设,”Marinos 说。 “总是存在多个容器竞争有限资源的问题,但它与传感器或蓝牙竞争天线资源没有太大区别。”

Ries 看到了工业和家庭网关中“提高边缘智能”的趋势。 “我们看到人工智能、机器学习、计算机视觉和上下文意识的大幅上升,”Ries 说。 “为什么要在云中运行面部检测软件,如果相同的软件可以在边缘设备运行而又没有网络延迟和带宽及计算成本呢?“

当我们在这个物联网系列的开篇故事中探索时,我们发现存在与安全相关的物联网问题,例如隐私丧失和生活在监视文化中的权衡。还有一些问题如把个人决策交给可能由他人操控的 AI 裁定。这些不会被容器,快照或任何其他技术完全解决。

如果 AWS Alexa 可以处理生活琐事,而我们专注在要事上,也许我们会更快乐。或许有一个方法来平衡隐私和效用,现在,我们仍在探索,如此甚好。


via: http://hackerboards.com/can-linux-containers-save-iot-from-a-security-meltdown/

作者:Eric Brown 译者:firstadream 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8483-1.html?utm_source=rss&utm_medium=rss

极客漫画:消沉的程序员 15

$
0
0

depressed-developer-15

不管是哪行哪业,诸如 IT 行业的代码、生成加工等,安全大概都是可以作为一个永恒的话题。越是觉得可以忽略的细小事情,还真是越容易造成重大的安全事故。所以,不管何种情况下,该做的安全考虑都是必不可少的。


译者简介:

GHLandy —— 生活中所有欢乐与苦闷都应藏在心中,有些事儿注定无人知晓,自己也无从说起。


via:http://turnoff.us/geek/the-depressed-developer-15/

作者:Daniel Stori 译者:GHLandy 校对:wxy 合成:GHLandy 点评:GHLandy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8484-1.html?utm_source=rss&utm_medium=rss

大数据探索:在树莓派上通过 Apache Spark on YARN 搭建 Hadoop 集群

$
0
0

有些时候我们想从 DQYDJ 网站的数据中分析点有用的东西出来,在过去,我们要用 R 语言提取固定宽度的数据,然后通过数学建模来分析美国的最低收入补贴,当然也包括其他优秀的方法。

今天我将向你展示对大数据的一点探索,不过有点变化,使用的是全世界最流行的微型电脑————树莓派,如果手头没有,那就看下一篇吧(可能是已经处理好的数据),对于其他用户,请继续阅读吧,今天我们要建立一个树莓派 Hadoop集群!

I. 为什么要建立一个树莓派的 Hadoop 集群?

由三个树莓派节点组成的 Hadoop 集群

我们对 DQYDJ 的数据做了大量的处理工作,但这些还不能称得上是大数据。

和许许多多有争议的话题一样,数据的大小之别被解释成这样一个笑话:

如果能被内存所存储,那么它就不是大数据。 ————佚名

似乎这儿有两种解决问题的方法:

  1. 我们可以找到一个足够大的数据集合,任何家用电脑的物理或虚拟内存都存不下。
  2. 我们可以买一些不用特别定制,我们现有数据就能淹没它的电脑:
    —— 上手树莓派 2B

这个由设计师和工程师制作出来的精致小玩意儿拥有 1GB 的内存, MicroSD 卡充当它的硬盘,此外,每一台的价格都低于 50 美元,这意味着你可以花不到 250 美元的价格搭建一个 Hadoop 集群。

或许天下没有比这更便宜的入场券来带你进入大数据的大门。

II. 制作一个树莓派集群

我最喜欢制作的原材料。

这里我将给出我原来为了制作树莓派集群购买原材料的链接,如果以后要在亚马逊购买的话你可先这些链接收藏起来,也是对本站的一点支持。(谢谢)

开始制作

  1. 首先,装好三个树莓派,每一个用螺丝钉固定在亚克力面板上。(看下图)
  2. 接下来,安装以太网交换机,用双面胶贴在其中一个在亚克力面板上。
  3. 用双面胶贴将 USB 转接器贴在一个在亚克力面板使之成为最顶层。
  4. 接着就是一层一层都拼好——这里我选择将树莓派放在交换机和USB转接器的底下(可以看看完整安装好的两张截图)

想办法把线路放在需要的地方——如果你和我一样购买力 USB 线和网线,我可以将它们卷起来放在亚克力板子的每一层

现在不要急着上电,需要将系统烧录到 SD 卡上才能继续。

烧录 Raspbian

按照这个教程将 Raspbian 烧录到三张 SD 卡上,我使用的是 Win7 下的 Win32DiskImager

将其中一张烧录好的 SD 卡插在你想作为主节点的树莓派上,连接 USB 线并启动它。

启动主节点

这里有一篇非常棒的“Because We Can Geek”的教程,讲如何安装 Hadoop 2.7.1,此处就不再熬述。

在启动过程中有一些要注意的地方,我将带着你一起设置直到最后一步,记住我现在使用的 IP 段为 192.168.1.50 – 192.168.1.52,主节点是 .50,从节点是 .51 和 .52,你的网络可能会有所不同,如果你想设置静态 IP 的话可以在评论区看看或讨论。

一旦你完成了这些步骤,接下来要做的就是启用交换文件,Spark on YARN 将分割出一块非常接近内存大小的交换文件,当你内存快用完时便会使用这个交换分区。

(如果你以前没有做过有关交换分区的操作的话,可以看看这篇教程,让 swappiness 保持较低水准,因为 MicroSD 卡的性能扛不住)

现在我准备介绍有关我的和“Because We Can Geek”关于启动设置一些微妙的区别。

对于初学者,确保你给你的树莓派起了一个正式的名字——在 /etc/hostname 设置,我的主节点设置为 ‘RaspberryPiHadoopMaster’ ,从节点设置为 ‘RaspberryPiHadoopSlave#’

主节点的 /etc/hosts 配置如下:

#/etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

192.168.1.50    RaspberryPiHadoopMaster
192.168.1.51    RaspberryPiHadoopSlave1
192.168.1.52    RaspberryPiHadoopSlave2

如果你想让 Hadoop、YARN 和 Spark 运行正常的话,你也需要修改这些配置文件(不妨现在就编辑)。

这是 hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>fs.default.name</name>
  <value>hdfs://RaspberryPiHadoopMaster:54310</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/hdfs/tmp</value>
</property>
</configuration>

这是 yarn-site.xml (注意内存方面的改变):

<?xml version="1.0"?>
<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>4</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>128</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-vcores</name>
    <value>1</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-vcores</name>
    <value>4</value>
  </property>
<property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
   <value>false</value>
   <description>Whether virtual memory limits will be enforced for containers</description>
</property>
<property>
   <name>yarn.nodemanager.vmem-pmem-ratio</name>
   <value>4</value>
   <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>RaspberryPiHadoopMaster:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>RaspberryPiHadoopMaster:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>RaspberryPiHadoopMaster:8040</value>
</property>
</configuration>

slaves

RaspberryPiHadoopMaster
RaspberryPiHadoopSlave1
RaspberryPiHadoopSlave2

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>fs.default.name</name>
  <value>hdfs://RaspberryPiHadoopMaster:54310</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/hdfs/tmp</value>
</property>
</configuration>

设置两个从节点:

接下来按照 “Because We Can Geek”上的教程,你需要对上面的文件作出小小的改动。 在 yarn-site.xml 中主节点没有改变,所以从节点中不必含有这个 slaves 文件。

III. 在我们的树莓派集群中测试 YARN

如果所有设备都正常工作,在主节点上你应该执行如下命令:

start-dfs.sh
start-yarn.sh

当设备启动后,以 Hadoop 用户执行,如果你遵循教程,用户应该是 hduser

接下来执行 hdfs dfsadmin -report 查看三个节点是否都正确启动,确认你看到一行粗体文字 ‘Live datanodes (3)’:

Configured Capacity: 93855559680 (87.41 GB)
Raspberry Pi Hadoop Cluster picture Straight On
Present Capacity: 65321992192 (60.84 GB)
DFS Remaining: 62206627840 (57.93 GB)
DFS Used: 3115364352 (2.90 GB)
DFS Used%: 4.77%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
————————————————-
Live datanodes (3):
Name: 192.168.1.51:50010 (RaspberryPiHadoopSlave1)
Hostname: RaspberryPiHadoopSlave1
Decommission Status : Normal

你现在可以做一些简单的诸如 ‘Hello, World!’ 的测试,或者直接进行下一步。

IV. 安装 SPARK ON YARN

YARN 的意思是另一种非常好用的资源调度器(Yet Another Resource Negotiator),已经作为一个易用的资源管理器集成在 Hadoop 基础安装包中。

Apache Spark 是 Hadoop 生态圈中的另一款软件包,它是一个毁誉参半的执行引擎和捆绑的 MapReduce。在一般情况下,相对于基于磁盘存储的 MapReduce,Spark 更适合基于内存的存储,某些运行任务能够得到 10-100 倍提升——安装完成集群后你可以试试 Spark 和 MapReduce 有什么不同。

我个人对 Spark 还是留下非常深刻的印象,因为它提供了两种数据工程师和科学家都比较擅长的语言—— Python 和 R。

安装 Apache Spark 非常简单,在你家目录下,wget "为 Hadoop 2.7 构建的 Apache Spark”来自这个页面),然后运行 tar -xzf “tgz 文件”,最后把解压出来的文件移动至 /opt,并清除刚才下载的文件,以上这些就是安装步骤。

我又创建了只有两行的文件 spark-env.sh,其中包含 Spark 的配置文件目录。

SPARK_MASTER_IP=192.168.1.50
SPARK_WORKER_MEMORY=512m

(在 YARN 跑起来之前我不确定这些是否有必要。)

V. 你好,世界! 为 Apache Spark 寻找有趣的数据集!

在 Hadoop 世界里面的 ‘Hello, World!’ 就是做单词计数。

我决定让我们的作品做一些内省式……为什么不统计本站最常用的单词呢?也许统计一些关于本站的大数据会更有用。

如果你有一个正在运行的 WordPress 博客,可以通过简单的两步来导出和净化。

  1. 我使用 Export to Text 插件导出文章的内容到纯文本文件中
  2. 我使用一些压缩库编写了一个 Python 脚本来剔除 HTML
import bleach

# Change this next line to your 'import' filename, whatever you would like to strip
# HTML tags from.
ascii_string = open('dqydj_with_tags.txt', 'r').read()


new_string = bleach.clean(ascii_string, tags=[], attributes={}, styles=[], strip=True)
new_string = new_string.encode('utf-8').strip()

# Change this next line to your 'export' filename
f = open('dqydj_stripped.txt', 'w')
f.write(new_string)
f.close()

现在我们有了一个更小的、适合复制到树莓派所搭建的 HDFS 集群上的文件。

如果你不能树莓派主节点上完成上面的操作,找个办法将它传输上去(scp、 rsync 等等),然后用下列命令行复制到 HDFS 上。

hdfs dfs -copyFromLocal dqydj_stripped.txt /dqydj_stripped.txt

现在准备进行最后一步 - 向 Apache Spark 写入一些代码。

VI. 点亮 Apache Spark

Cloudera 有个极棒的程序可以作为我们的超级单词计数程序的基础,你可以在这里找到。我们接下来为我们的内省式单词计数程序修改它。

在主节点上安装‘stop-words’这个 python 第三方包,虽然有趣(我在 DQYDJ 上使用了 23,295 次 the 这个单词),你可能不想看到这些语法单词占据着单词计数的前列,另外,在下列代码用你自己的数据集替换所有有关指向 dqydj 文件的地方。

import sys

from stop_words import get_stop_words
from pyspark import SparkContext, SparkConf

if __name__ == "__main__":

  # create Spark context with Spark configuration
  conf = SparkConf().setAppName("Spark Count")
  sc = SparkContext(conf=conf)

  # get threshold
  try:
    threshold = int(sys.argv[2])
  except:
    threshold = 5

  # read in text file and split each document into words
  tokenized = sc.textFile(sys.argv[1]).flatMap(lambda line: line.split(" "))

  # count the occurrence of each word
  wordCounts = tokenized.map(lambda word: (word.lower().strip(), 1)).reduceByKey(lambda v1,v2:v1 +v2)

  # filter out words with fewer than threshold occurrences
  filtered = wordCounts.filter(lambda pair:pair[1] >= threshold)

  print "*" * 80
  print "Printing top words used"
  print "-" * 80
  filtered_sorted = sorted(filtered.collect(), key=lambda x: x[1], reverse = True)
  for (word, count) in filtered_sorted: print "%s : %d" % (word.encode('utf-8').strip(), count)


  # Remove stop words
  print "\n\n"
  print "*" * 80
  print "Printing top non-stop words used"
  print "-" * 80
  # Change this to your language code (see the stop-words documentation)
  stop_words = set(get_stop_words('en'))
  no_stop_words = filter(lambda x: x[0] not in stop_words, filtered_sorted)
  for (word, count) in no_stop_words: print "%s : %d" % (word.encode('utf-8').strip(), count)

保存好 wordCount.py,确保上面的路径都是正确无误的。

现在,准备念出咒语,让运行在 YARN 上的 Spark 跑起来,你可以看到我在 DQYDJ 使用最多的单词是哪一个。

/opt/spark-2.0.0-bin-hadoop2.7/bin/spark-submit –master yarn –executor-memory 512m –name wordcount –executor-cores 8 wordCount.py /dqydj_stripped.txt

VII. 我在 DQYDJ 使用最多的单词

可能入列的单词有哪一些呢?“can, will, it’s, one, even, like, people, money, don’t, also“.

嘿,不错,“money”悄悄挤进了前十。在一个致力于金融、投资和经济的网站上谈论这似乎是件好事,对吧?

下面是的前 50 个最常用的词汇,请用它们刻画出有关我的文章的水平的结论。

我希望你能喜欢这篇关于 Hadoop、YARN 和 Apache Spark 的教程,现在你可以在 Spark 运行和编写其他的应用了。

你的下一步是任务是开始阅读 pyspark 文档(以及用于其他语言的该库),去学习一些可用的功能。根据你的兴趣和你实际存储的数据,你将会深入学习到更多——有流数据、SQL,甚至机器学习的软件包!

你怎么看?你要建立一个树莓派 Hadoop 集群吗?想要在其中挖掘一些什么吗?你在上面看到最令你惊奇的单词是什么?为什么 'S&amp' 也能上榜?

(题图:Pixabay,CC0)


via: https://dqydj.com/raspberry-pi-hadoop-cluster-apache-spark-yarn/ 

作者:PK 译者:popy32 校对:wxy

本文由 LCTT 组织编译,Linux中国 荣誉推出


完美阅读及发表评论,请猛击:https://linux.cn/article-8486-1.html?utm_source=rss&utm_medium=rss

在 Linux 上给用户赋予指定目录的读写权限

$
0
0

在上篇文章中我们向您展示了如何在 Linux 上创建一个共享目录。这次,我们会为您介绍如何将 Linux 上指定目录的读写权限赋予用户。

有两种方法可以实现这个目标:第一种是 使用 ACL (访问控制列表) ,第二种是创建用户组来管理文件权限,下面会一一介绍。

为了完成这个教程,我们将使用以下设置。

  • 操作系统:CentOS 7
  • 测试目录:/shares/project1/reports
  • 测试用户:tecmint
  • 文件系统类型:ext4

请确认所有的命令都是使用 root 用户执行的,或者使用 sudo 命令 来享受与之同样的权限。

让我们开始吧!下面,先使用 mkdir 命令来创建一个名为 reports 的目录。

# mkdir -p /shares/project1/reports

使用 ACL 来为用户赋予目录的读写权限

重要提示:打算使用此方法的话,您需要确认您的 Linux 文件系统类型(如 ext3 和 ext4, NTFS, BTRFS)支持 ACL。

1、 首先, 依照以下命令在您的系统中检查当前文件系统类型,并且查看内核是否支持 ACL:

# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
# grep -i acl /boot/config*

从下方的截屏可以看到,文件系统类型是 ext4,并且从 CONFIG_EXT4_FS_POSIX_ACL=y 选项可以发现内核是支持 POSIX ACL 的。

Check Filesystem Type and Kernel ACL Support

查看文件系统类型和内核的 ACL 支持。

2、 接下来,查看文件系统(分区)挂载时是否使用了 ACL 选项。

# tune2fs -l /dev/sda1 | grep acl

Check Partition ACL Support

查看分区是否支持 ACL

通过上边的输出可以发现,默认的挂载项目中已经对 ACL 进行了支持。如果发现结果不如所愿,你可以通过以下命令对指定分区(此例中使用 /dev/sda3)开启 ACL 的支持。

# mount -o remount,acl /
# tune2fs -o acl /dev/sda3

3、 现在是时候指定目录 reports 的读写权限分配给名为 tecmint 的用户了,依照以下命令执行即可。

# getfacl /shares/project1/reports                # Check the default ACL settings for the directory
# setfacl -m user:tecmint:rw /shares/project1/reports     # Give rw access to user tecmint
# getfacl /shares/project1/reports                # Check new ACL settings for the directory

Give Read/Write Access to Directory Using ACL

通过 ACL 对指定目录赋予读写权限

在上方的截屏中,通过输出结果的第二行 getfacl 命令可以发现,用户 tecmint 已经成功的被赋予了 /shares/project1/reports 目录的读写权限。

如果想要获取 ACL 列表的更多信息。可以在下方查看我们的其他指南。

  1.  如何使用访问控制列表(ACL)为用户/组设置磁盘配额
  2.  如何使用访问控制列表(ACL)挂载网络共享

现在我们来看看如何使用第二种方法来为目录赋予读写权限。

使用用户组来为用户赋予指定目录的读写权限

1、 如果用户已经拥有了默认的用户组(通常组名与用户名相同),就可以简单的通过变更文件夹的所属用户组来完成。

# chgrp tecmint /shares/project1/reports

另外,我们也可以通过以下方法为多个用户(需要赋予指定目录读写权限的)新建一个用户组。如此一来,也就创建了一个共享目录

# groupadd projects

2、 接下来将用户 tecmint 添加到 projects 组中:

# usermod -aG projects tecmint      # add user to projects
# groups tecmint                # check users groups

3、 将目录的所属用户组变更为 projects:

# chgrp projects /shares/project1/reports

4、 现在,给组成员设置读写权限。

# chmod -R 0760 /shares/projects/reports
# ls  -l /shares/projects/      #check new permissions

好了!这篇教程中,我们向您展示了如何在 Linux 中将指定目录的读写权限赋予用户。若有疑问,请在留言区中提问。

(题图:Pixabay,CC0)


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,未来的 Linux 系统管理员和网络开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/give-read-write-access-to-directory-in-linux/

作者:Aaron Kili 译者:Mr-Ping 校对:jasminepeng

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8487-1.html?utm_source=rss&utm_medium=rss

如何在 Ubuntu16.04 中用 Apache 部署 Jenkins 自动化服务器

$
0
0

Jenkins 是从 Hudson 项目衍生出来的自动化服务器。Jenkins 是一个基于服务器的应用程序,运行在 Java servlet 容器中,它支持包括 Git、SVN 以及 Mercurial 在内的多种 SCM(源码控制工具Source Control Management)。Jenkins 提供了上百种插件帮助你的项目实现自动化。Jenkins 由 Kohsuke Kawaguchi 开发,在 2011 年使用 MIT 协议发布了第一个发行版,它是个自由软件。

在这篇指南中,我会向你介绍如何在 Ubuntu 16.04 中安装最新版本的 Jenkins。我们会用自己的域名运行 Jenkins,在 apache web 服务器中安装和配置 Jenkins,而且支持反向代理。

前提

  • Ubuntu 16.04 服务器 - 64 位
  • Root 权限

第一步 - 安装 Java OpenJDK 7

Jenkins 基于 Java,因此我们需要在服务器上安装 Java OpenJDK 7。在这里,我们会从一个 PPA 仓库安装 Java 7,首先我们需要添加这个仓库。

默认情况下,Ubuntu 16.04 没有安装用于管理 PPA 仓库的 python-software-properties 软件包,因此我们首先需要安装这个软件。使用 apt 命令安装 python-software-properties。

apt-get install python-software-properties

下一步,添加 Java PPA 仓库到服务器中。

add-apt-repository ppapenjdk-r/ppa

用 apt 命令更新 Ubuntu 仓库并安装 Java OpenJDK。

apt-get update
apt-get install openjdk-7-jdk

输入下面的命令验证安装:

java -version

你会看到安装到服务器上的 Java 版本。

在 Ubuntu 16.04 上安装 Java OpenJDK 7

第二步 - 安装 Jenkins

Jenkins 给软件安装包提供了一个 Ubuntu 仓库,我们会从这个仓库中安装 Jenkins。

用下面的命令添加 Jenkins 密钥和仓库到系统中。

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
echo 'deb https://pkg.jenkins.io/debian-stable binary/' | tee -a /etc/apt/sources.list

更新仓库并安装 Jenkins。

apt-get update
apt-get install jenkins

安装完成后,用下面的命令启动 Jenkins。

systemctl start jenkins

通过检查 Jenkins 默认使用的端口(端口 8080)验证 Jenkins 正在运行。我会像下面这样用 netstat 命令检测:

netstat -plntu

Jenkins 已经安装好了并运行在 8080 端口。

已经将 Jenkins 安装到 8080 端口

第三步 - 为 Jenkins 安装和配置 Apache 作为反向代理

在这篇指南中,我们会在一个 Apache web 服务器中运行 Jenkins,我们会为 Jenkins 配置 apache 作为反向代理。首先我会安装 apache 并启用一些需要的模块,然后我会为 Jenkins 用域名 my.jenkins.id 创建虚拟主机文件。请在这里使用你自己的域名并在所有配置文件中出现的地方替换。

从 Ubuntu 仓库安装 apache2 web 服务器。

apt-get install apache2

安装完成后,启用 proxy 和 proxy_http 模块以便将 apache 配置为 Jenkins 的前端服务器/反向代理。

a2enmod proxy
a2enmod proxy_http

下一步,在 sites-available 目录创建新的虚拟主机文件。

cd /etc/apache2/sites-available/
vim jenkins.conf

粘贴下面的虚拟主机配置。

<Virtualhost *:80>
    ServerName        my.jenkins.id
    ProxyRequests     Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode

    &ltroxy http://localhost:8080/*>
      Order deny,allow
      Allow from all
    </Proxy>

    ProxyPass         /  http://localhost:8080/ nocanon
    ProxyPassReverse  /  http://localhost:8080/
    ProxyPassReverse  /  http://my.jenkins.id/
</Virtualhost>

保存文件。然后用 a2ensite 命令激活 Jenkins 虚拟主机。

a2ensite jenkins

重启 Apache 和 Jenkins。

systemctl restart apache2
systemctl restart jenkins

检查 Jenkins 和 Apache 正在使用 80 和 8080 端口。

netstat -plntu

检查 Apache 和 Jenkins 是否在运行

第四步 - 配置 Jenkins

Jenkins 用域名 'my.jenkins.id' 运行。打开你的 web 浏览器然后输入 URL。你会看到要求你输入初始管理员密码的页面。Jenkins 已经生成了一个密码,因此我们只需要显示并把结果复制到密码框。

cat 命令显示 Jenkins 初始管理员密码。

cat /var/lib/jenkins/secrets/initialAdminPassword
a1789d1561bf413c938122c599cf65c9

获取 Jenkins 管理员密码

将结果粘贴到密码框然后点击 Continue。

安装和配置 Jenkins

现在为了后面能比较好的使用,我们需要在 Jenkins 中安装一些插件。选择 Install Suggested Plugin,点击它。

安装 Jenkins 插件

Jenkins 插件安装过程:

Jenkins 安装完插件

安装完插件后,我们需要创建一个新的管理员密码。输入你的管理员用户名、密码、电子邮件等,然后点击 ‘Save and Finish’。

创建 Jenkins 管理员账户

点击 start 开始使用 Jenkins。你会被重定向到 Jenkins 管理员面板。

重定向到管理员面板

成功完成 Jenkins 安装和配置。

Jenkins 管理员面板

第五步 - Jenkins 安全

在 Jenkins 管理员面板,我们需要为 Jenkins 配置标准的安全,点击 ‘Manage Jenkins’ 和 ‘Configure Global Security’。

Jenkins 全局安全设置

Jenkins 在 ‘Access Control’ 部分提供了多种认证方法。为了能够控制所有的用户权限,我选择了 ‘Matrix-based Security’。在复选框 ‘User/Group’ 中启用 admin 用户。通过勾选所有选项给 admin 所有权限,给 anonymous 只读权限。现在点击 ‘Save’。

配置 Jenkins 权限

你会被重定向到面板,如果出现了登录选项,只需输入你的管理员账户和密码。

第六步 - 测试一个简单的自动化任务

在这一部分,我想为 Jenkins 服务测试一个简单的任务。为了测试 Jenkins 我会创建一个简单的任务,并用 top 命令查看服务器的负载。

在 Jenkins 管理员面板上,点击 ‘Create New Job’。

在 Jenkins 中创建新的任务

输入任务的名称,在这里我输入 ‘Checking System’,选择 Freestyle Project 然后点击 OK。

配置 Jenkins 任务

进入 Build 标签页。在 Add build step,选择选项 Execute shell。

在输入框输入下面的命令。

top -b -n 1 | head -n 5

点击 Save。

启动 Jenkins 任务

现在你是在任务 &lsquoroject checking system’ 的任务页。点击 Build Now 执行任务 ‘checking system’。

任务执行完成后,你会看到 Build History,点击第一个任务查看结果。

下面是 Jenkins 任务执行的结果。

构建和运行 Jenkins 任务

到这里就介绍完了在 Ubuntu 16.04 中用 Apache web 服务器安装 Jenkins 的内容。


via: https://www.howtoforge.com/tutorial/how-to-install-jenkins-with-apache-on-ubuntu-16-04/

作者:Muhammad Arul 译者:ictlyh 校对:wxy

本文由 LCTT 组织编译,Linux中国 荣誉推出


完美阅读及发表评论,请猛击:https://linux.cn/article-8488-1.html?utm_source=rss&utm_medium=rss


极客漫画:消沉的程序员 16

$
0
0

depressed-developer-16

哎,又是 Bug 和 Debug! 感觉代码之中永远脱离不了这个魔咒啊!还真是尴尬。不知道,编码之间进行详细的规划,能不能尽量避免那些不必要的 Bug?


译者简介:

GHLandy —— 生活中所有欢乐与苦闷都应藏在心中,有些事儿注定无人知晓,自己也无从说起。


via:

作者:Daniel Stori 译者:GHLandy 校对:wxy 合成:GHLandy 点评:GHLandy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8485-1.html?utm_source=rss&utm_medium=rss

在没有 Kotlin 的世界与 Android 共舞

$
0
0

开始投入一件事比远离它更容易。 — Donald Rumsfeld

没有 Kotlin 的生活就像在触摸板上玩魔兽争霸 3。购买鼠标很简单,但如果你的新雇主不想让你在生产中使用 Kotlin,你该怎么办?

下面有一些选择。

  • 与你的产品负责人争取获得使用 Kotlin 的权利。
  • 使用 Kotlin 并且不告诉其他人因为你知道最好的东西是只适合你的。
  • 擦掉你的眼泪,自豪地使用 Java。

想象一下,你在和产品负责人的斗争中失败,作为一个专业的工程师,你不能在没有同意的情况下私自去使用那些时髦的技术。我知道这听起来非常恐怖,特别当你已经品尝到 Kotlin 的好处时,不过不要失去生活的信念。

在文章接下来的部分,我想简短地描述一些 Kotlin 的特征,使你通过一些知名的工具和库,可以应用到你的 Android 里的 Java 代码中去。对于 Kotlin 和 Java 的基本认识是需要的。

数据类

我想你肯定已经喜欢上 Kotlin 的数据类。对于你来说,得到 equals()hashCode()toString()copy() 这些是很容易的。具体来说,data 关键字还可以按照声明顺序生成对应于属性的 componentN() 函数。 它们用于解构声明。

data class Person(val name: String)
val (riddle) = Person("Peter")
println(riddle)

你知道什么会被打印出来吗?确实,它不会是从 Person 类的 toString() 返回的值。这是解构声明的作用,它赋值从 nameriddle。使用园括号 (riddle) 编译器知道它必须使用解构声明机制。

val (riddle): String = Person("Peter").component1()
println(riddle) // prints Peter)

这个代码没编译。它就是展示了构造声明怎么工作的。

正如你可以看到 data 关键字是一个超级有用的语言特性,所以你能做什么把它带到你的 Java 世界? 使用注释处理器并修改抽象语法树(Abstract Syntax Tree)。 如果你想更深入,请阅读文章末尾列出的文章(Project Lombok— Trick Explained)。

使用项目 Lombok 你可以实现 data关键字所提供的几乎相同的功能。 不幸的是,没有办法进行解构声明。

import lombok.Data;

@Data class Person {
    final String name;
}

@Data 注解生成 equals()hashCode()toString()。 此外,它为所有字段创建 getter,为所有非最终字段创建setter,并为所有必填字段(final)创建构造函数。 值得注意的是,Lombok 仅用于编译,因此库代码不会添加到您的最终的 .apk。

Lambda 表达式

Android 工程师有一个非常艰难的生活,因为 Android 中缺乏 Java 8 的特性,而且其中之一是 lambda 表达式。 Lambda 是很棒的,因为它们为你减少了成吨的样板。 你可以在回调和流中使用它们。 在 Kotlin 中,lambda 表达式是内置的,它们看起来比它们在 Java 中看起来好多了。 此外,lambda 的字节码可以直接插入到调用方法的字节码中,因此方法计数不会增加。 它可以使用内联函数。

button.setOnClickListener { println("Hello World") }

最近 Google 宣布在 Android 中支持 Java 8 的特性,由于 Jack 编译器,你可以在你的代码中使用 lambda。还要提及的是,它们在 API 23 或者更低的级别都可用。

button.setOnClickListener(view -> System.out.println("Hello World!"));

怎样使用它们?就只用添加下面几行到你的 build.gradle 文件中。

defaultConfig {
    jackOptions {
        enabled true
    }
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

如果你不喜欢用 Jack 编译器,或者你由于一些原因不能使用它,这里有一个不同的解决方案提供给你。Retrolambda 项目允许你在 Java 7,6 或者 5 上运行带有 lambda 表达式的 Java 8 代码,下面是设置过程。

dependencies {
    classpath 'me.tatarka:gradle-retrolambda:3.4.0'
}

apply plugin: 'me.tatarka.retrolambda'

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

正如我前面提到的,在 Kotlin 下的 lambda 内联函数不增加方法计数,但是如何在 Jack 或者 Retrolambda 下使用它们呢? 显然,它们不是没成本的,隐藏的成本如下。

该表展示了使用不同版本的 Retrolambda 和 Jack 编译器生成的方法数量。该比较结果来自 Jake Wharton 的“探索 Java 的隐藏成本” 技术讨论之中。

数据操作

Kotlin 引入了高阶函数作为流的替代。 当您必须将一组数据转换为另一组数据或过滤集合时,它们非常有用。

fun foo(persons: MutableList&lterson>) {
    persons.filter { it.age >= 21 }
           .filter { it.name.startsWith("P") }
           .map { it.name }
           .sorted()
           .forEach(::println)
}

data class Person(val name: String, val age: Int)

流也由 Google 通过 Jack 编译器提供。 不幸的是,Jack 不使用 Lombok,因为它在编译代码时跳过生成中间的 .class 文件,而 Lombok 却依赖于这些文件。

void foo(List&lterson> persons) {
    persons.stream()
           .filter(it -> it.getAge() >= 21)
           .filter(it -> it.getName().startsWith("P"))
           .map(Person::getName)
           .sorted()
           .forEach(System.out::println);
}

class Person {
    final private String name;
    final private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    String getName() { return name; }
    int getAge() { return age; }
}

这简直太好了,所以 catch 在哪里? 令人悲伤的是,流从 API 24 才可用。谷歌做了好事,但哪个应用程序有用 minSdkVersion = 24

幸运的是,Android 平台有一个很好的提供许多很棒的库的开源社区。Lightweight-Stream-API 就是其中的一个,它包含了 Java 7 及以下版本的基于迭代器的流实现。

import lombok.Data;
import com.annimon.stream.Stream;

void foo(List&lterson> persons) {
    Stream.of(persons)
          .filter(it -> it.getAge() >= 21)
          .filter(it -> it.getName().startsWith("P"))
          .map(Person::getName)
          .sorted()
          .forEach(System.out::println);
}

@Data class Person {
    final String name;
    final int age;
}

上面的例子结合了 Lombok、Retrolambda 和 Lightweight-Stream-API,它看起来几乎和 Kotlin 一样棒。使用静态工厂方法允许您将任何 Iterable 转换为流,并对其应用 lambda,就像 Java 8 流一样。 将静态调用 Stream.of(persons) 包装为 Iterable 类型的扩展函数是完美的,但是 Java 不支持它。

扩展函数

扩展机制提供了向类添加功能而无需继承它的能力。 这个众所周知的概念非常适合 Android 世界,这就是 Kotlin 在该社区很受欢迎的原因。

有没有技术或魔术将扩展功能添加到你的 Java 工具箱? 因 Lombok,你可以使用它们作为一个实验功能。 根据 Lombok 文档的说明,他们想把它从实验状态移出,基本上没有什么变化的话很快。 让我们重构最后一个例子,并将 Stream.of(persons) 包装成扩展函数。

import lombok.Data;
import lombok.experimental.ExtensionMethod;

@ExtensionMethod(Streams.class)
public class Foo {
    void foo(List&lterson> persons) {
        persons.toStream()
               .filter(it -> it.getAge() >= 21)
               .filter(it -> it.getName().startsWith("P"))
               .map(Person::getName)
               .sorted()
               .forEach(System.out::println);
    }
}

@Data class Person {
    final String name;
    final int age;
}

class Streams {
    static <T> Stream<T> toStream(List<T> list) {
        return Stream.of(list);
    }
}

所有的方法是 publicstatic 的,并且至少有一个参数的类型不是原始的,因而是扩展方法。 @ExtensionMethod 注解允许你指定一个包含你的扩展函数的类。 你也可以传递数组,而不是使用一个 .class 对象。


我完全知道我的一些想法是非常有争议的,特别是 Lombok,我也知道,有很多的库,可以使你的生活更轻松。请不要犹豫在评论里分享你的经验。干杯!


作者简介:

Coder and professional dreamer @ Grid Dynamics


via: https://medium.com/proandroiddev/living-android-without-kotlin-db7391a2b170

作者:Piotr Ślesarew 译者:DockerChen 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8489-1.html?utm_source=rss&utm_medium=rss

如何在 Ubuntu 中安装语音聊天工具 Discord

$
0
0

Discord 是一个非常受欢迎的文字和语音聊天程序。虽然开始时主要面向游戏玩家,但它几乎获得了所有人的了广泛青睐。

Discord 不仅仅是一个很好的聊天客户端。当你安装它时,你还可以获得其强大的服务端功能,强力而自足。游戏玩家和非玩家都可以在几分钟内开启自己的私人聊天服务,这使 Discord 成为团队、公会和各种社区的明显选择。

Linux 用户经常被游戏世界遗忘。但 Discord 并不是这样。它的开发人员也在 Linux 下积极构建并维护其流行聊天平台。Ubuntu 用户甚至拥有更好的待遇,Discord 捆绑在方便的 Debian/Ubuntu .deb 包中。

获取并安装软件包

有几种方法在 Ubuntu 下获取 Discord。你可以都看一下,并选择一个你喜欢的。

依赖

在 Discord 的下载页面上没有什么关于依赖的内容,但是在 Ubuntu 上安装之前,你需要安装一些依赖。没什么大不了的。打开你的终端,并输入以下命令以获得所需内容:

sudo apt install libgconf-2-4 libappindicator1

图形化安装

图形化安装会耗时长一点,但是这对 Linux 新手而言更简单。

Download Discord for Linux

首先进入 Discord 的网站。该网站应该能自动检测到你正在运行的 Linux,并在页面正中建议正确的包。

如果没有,只需向下滚动一下。页面的下一部分会显示其他可用的下载,而 Linux 包就在那里。

找到 Linux 的下载链接后,请检查是否选择了 “deb”,然后单击 “Download” 按钮。

Ubuntu prompt to install Discord

浏览器会询问你想要用 Ubuntu 软件安装器打开或者下载文件。你可以选择任意一个,但是自动用软件安装器打开会更快。

Ubuntu Software Center Discord Inst all

下载很快,所以安装程序会立即打开,并允许你安装新下载的软件包。这是一个非常简单的窗口,没有漂亮的图标或很多描述性的文本,所以不要犹豫。这是正常的。单击 “Install” 开始安装。

安装过程不会耗费太长时间。之后,Discord 就可以使用了。

命令行安装

“懒惰”的 Linux 熟手并不在意花哨的 GUI 工具。如果你是这个阵营的人,那么你有一个更直接的命令行选项。

首先,打开一个终端并进入你的下载目录。在那里可以使用 wget 直接下载 .deb 包。

cd ~/Downloads
wget -O discord-0.0.1.deb https://discordapp.com/api/download?platform=linux&format=deb

下载完成后,你可以使用 dpkg 直接安装 .deb 软件包。运行下面的命令:

sudo dpkg -i discord-0.0.1.deb

测试一下

Discord icon in Unity

现在你可以打开软件启动器并搜索 Discord。单击图标运行。

Login to Discord on Ubuntu

首次启动,根据你需求,创建一个帐户或者登录。

Discord running on Ubuntu Linux

登录后,你就进入 Discord 了。它会提供一些介绍教程和建议。你可以直接略过并开始尝试。欢迎进入你新的 Linux 聊天体验!


via: https://www.maketecheasier.com/install-discord-ubuntu/

作者:Nick Congleton 译者:geekpi 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8492-1.html?utm_source=rss&utm_medium=rss

如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用

$
0
0

pm2 是一个 Node.js 应用的进程管理器,它可以让你的应用程序保持运行,还有一个内建的负载均衡器。它非常简单而且强大,你可以零间断重启或重新加载你的 node 应用,它也允许你为你的 node 应用创建集群。

在这篇博文中,我会向你展示如何安装和配置 pm2 用于这个简单的 'Express' 应用,然后配置 Nginx 作为运行在 pm2 下的 node 应用的反向代理。

前提:

  • Ubuntu 16.04 - 64bit
  • Root 权限

第一步 - 安装 Node.js LTS

在这篇指南中,我们会从零开始我们的实验。首先,我们需要在服务器上安装 Node.js。我会使用 Nodejs LTS 6.x 版本,它能从 nodesource 仓库中安装。

从 Ubuntu 仓库安装 python-software-properties 软件包并添加 “nodesource” Nodejs 仓库。

sudo apt-get install -y python-software-properties
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

安装最新版本的 Nodejs LTS:

sudo apt-get install -y nodejs

安装完成后,查看 node 和 npm 版本。

node -v
npm -v

检查 node.js 版本

第二步 - 生成 Express 示例 App

我会使用 express-generator 软件包生成的简单 web 应用框架进行示例安装。express-generator 可以使用 npm 命令安装。

npm安装 express-generator

npm install express-generator -g
  • -g : 在系统内部安装软件包。

我会以普通用户运行应用程序,而不是 root 或者超级用户。我们首先需要创建一个新的用户。

创建一个名为 yume 的用户:

useradd -m -s /bin/bash yume
passwd yume

使用 su 命令登录到新用户:

su - yume

下一步,用 express 命令生成一个新的简单 web 应用程序:

express hakase-app

命令会创建新项目目录 hakase-app

用 express-generator 生成应用框架

进入到项目目录并安装应用需要的所有依赖。

cd hakase-app
npm install

然后用下面的命令测试并启动一个新的简单应用程序:

DEBUG=myapp:* npm start

默认情况下,我们的 express 应用会运行在 3000 端口。现在访问服务器的 IP 地址:192.168.33.10:3000 :

express nodejs 运行在 3000 端口

这个简单 web 应用框架现在以 'yume' 用户运行在 3000 端口。

第三步 - 安装 pm2

pm2 是一个 node 软件包,可以使用 npm 命令安装。(用 root 权限,如果你仍然以 yume 用户登录,那么运行命令 exit 再次成为 root 用户):

npm install pm2 -g

现在我们可以为我们的 web 应用使用 pm2 了。

进入应用目录 hakase-app

su - yume
cd ~/hakase-app/

这里你可以看到一个名为 package.json 的文件,用 cat 命令显示它的内容。

cat package.json

配置 express nodejs 服务

你可以看到 start 行有一个 nodejs 用于启动 express 应用的命令。我们会和 pm2 进程管理器一起使用这个命令。

像下面这样使用 pm2 命令运行 express 应用:

pm2 start ./bin/www

现在你可以看到像下面这样的结果:

使用 pm2 运行 nodejs app

我们的 express 应用正在 pm2 中运行,名称为 www,id 为 0。你可以用 show 选项 show nodeid|name 获取更多 pm2 下运行的应用的信息。

pm2 show www

pm2 服务状态

如果你想看我们应用的日志,你可以使用 logs 选项。它包括访问和错误日志,你还可以看到应用程序的 HTTP 状态。

pm2 logs www

pm2 服务日志

你可以看到我们的程序正在运行。现在,让我们来让它开机自启动。

pm2 startup systemd
  • systemd: Ubuntu 16 使用的是 systemd。

你会看到要用 root 用户运行命令的信息。使用 exit 命令回到 root 用户然后运行命令。

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u yume --hp /home/yume

它会为启动应用程序生成 systemd 配置文件。当你重启服务器的时候,应用程序就会自动运行。

pm2 添加服务到开机自启动

第四步 - 安装和配置 Nginx 作为反向代理

在这篇指南中,我们会使用 Nginx 作为 node 应用的反向代理。Ubuntu 仓库中有 Nginx,用 apt 命令安装它:

sudo apt-get install -y nginx

下一步,进入到 sites-available 目录并创建新的虚拟主机配置文件。

cd /etc/nginx/sites-available/
vim hakase-app

粘贴下面的配置:

upstream hakase-app {
    # Nodejs app upstream
    server 127.0.0.1:3000;
    keepalive 64;
}

# Server on port 80
server {
    listen 80;
    server_name hakase-node.co;
    root /home/yume/hakase-app;

    location / {
        # Proxy_pass configuration
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_max_temp_file_size 0;
        proxy_pass http://hakase-app/;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
}

保存文件并退出 vim。

在配置中:

  • node 应用使用域名 hakase-node.co 运行。
  • 所有来自 nginx 的流量都会被转发到运行在 3000 端口的 node app。

测试 Nginx 配置确保没有错误。

nginx -t

启用 Nginx 并使其开机自启动。

systemctl start nginx
systemctl enable nginx

第五步 - 测试

打开你的 web 浏览器并访问域名(我的是):http://hakase-app.co 。

你可以看到 express 应用正在 Nginx web 服务器中运行。

Nodejs app 在 pm2 和 Nginx 中运行

下一步,重启你的服务器,确保你的 node app 能开机自启动:

pm2 save
sudo reboot

如果你再次登录到了你的服务器,检查 node app 进程。以 yume 用户运行下面的命令。

su - yume
pm2 status www

nodejs 在 pm2 下开机自启动

Node 应用在 pm2 中运行并使用 Nginx 作为反向代理。

链接


via: https://www.howtoforge.com/tutorial/how-to-deploy-nodejs-applications-with-pm2-and-nginx-on-ubuntu/

作者:Muhammad Arul 译者:ictlyh 校对:wxy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8494-1.html?utm_source=rss&utm_medium=rss

极客漫画:让你变成“机电工程师”的 Arduino 项目

$
0
0

Arduino Project

  • 刚刚完成我的第一个 Arduino 项目:一个闪烁的 LED
  • 下一步:更新我的 LinkedIn 详情
  • 添加技能:机电工程师

这篇漫画讽刺的是一些人只是接触了某个领域的很浅显的知识,就急急忙忙的为自己加上相应的头衔,却没有考虑自己所掌握的东西,在整个领域内所处的位置。


via: https://turnoff.us/geek/arduino-project/

作者:Daniel Stori 译者&点评:Bestony 校对:wxy 合成:GHLandy

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


完美阅读及发表评论,请猛击:https://linux.cn/article-8490-1.html?utm_source=rss&utm_medium=rss

Viewing all 9060 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>