2016年1月

Linux 101:最有效地使用 Systemd

干嘛要这么做?

  • 理解现代 Linux 发行版中的显著变化;
  • 看看 Systemd 是如何取代 SysVinit 的;
  • 搞定单元(unit)和新的 journal 日志。

吐槽邮件、人身攻击、死亡威胁——Lennart Poettering,Systemd 的作者,对收到这些东西早就习以为常了。这位 Red Hat 公司的员工之前在 Google+ 上怒斥 FOSS 社区(http://tinyurl.com/poorlennart)的本质,悲痛且失望地表示:“那真是个令人恶心的地方”。他着重指出 Linus Torvalds 在邮件列表上言辞极其刻薄的帖子,并谴责这位内核的领导者为在线讨论定下基调,并使得人身攻击及贬抑之辞成为常态。

但为何 Poettering 会遭受如此多的憎恨?为何就这么个搞搞开源软件的人要忍受这等愤怒?答案就在于他的软件的重要性。如今大多数发行版中,Systemd 是 Linux 内核发起的第一个程序,并且它还扮演多种角色。它会启动系统服务、处理用户登录,每隔特定的时间执行一些任务,还有很多很多。它在不断地成长,并逐渐成为 Linux 的某种“基础系统”——提供系统启动和发行版维护所需的所有工具。

如今,在以下几点上 Systemd 颇具争议:它逃避了一些已经确立的 Unix 传统,例如纯文本的日志文件;它被看成是个“大一统”的项目,试图接管一切;它还是我们这个操作系统的支柱的重要革新。然而大多数主流发行版已经接受了(或即将接受)它,因此它就活了下来。而且它确实是有好处的:更快地启动,更简单地管理那些有依赖的服务程序,提供强大且安全的日志系统等。

因此在这篇教程中,我们将探索 Systemd 的特性,并向您展示如何最有效地利用这些特性。即便您此刻并不是这款软件的粉丝,读完本文后您至少可以更加了解和适应它。

这部没正经的动画片来自http://tinyurl.com/m2e7mv8,它把 Systemd 塑造成一只狂暴的动物,吞噬它路过的一切。大多数批评者的言辞可不像这只公仔一样柔软。

启动及服务

大多数主流发行版要么已经采用 Systemd,要么即将在下个发布中采用(如 Debian 和 Ubuntu)。在本教程中,我们使用 Fedora 21(该发行版已经是 Systemd 的优秀实验场地)的一个预览版进行演示,但不论您用哪个发行版,要用到的命令和注意事项都应该是一样的。这是 Systemd 的一个加分点:它消除了不同发行版之间许多细微且琐碎的区别。

在终端中输入 ps ax | grep systemd,看到第一行,其中的数字 1 表示它的进程号是1,也就是说它是 Linux 内核发起的第一个程序。因此,内核一旦检测完硬件并组织好了内存,就会运行 /usr/lib/systemd/systemd 可执行程序,这个程序会按顺序依次发起其他程序。(在还没有 Systemd 的日子里,内核会去运行 /sbin/init,随后这个程序会在名为 SysVinit 的系统中运行其余的各种启动脚本。)

Systemd 的核心是一个叫 单元 unit 的概念,它是一些存有关于 服务 service (在运行在后台的程序)、设备、挂载点、和操作系统其他方面信息的配置文件。Systemd 的其中一个目标就是简化这些事物之间的相互作用,因此如果你有程序需要在某个挂载点被创建或某个设备被接入后开始运行,Systemd 可以让这一切正常运作起来变得相当容易。(在没有 Systemd 的日子里,要使用脚本来把这些事情调配好,那可是相当丑陋的。)要列出您 Linux 系统上的所有单元,输入以下命令:

systemctl list-unit-files

现在,systemctl 是与 Systemd 交互的主要工具,它有不少选项。在单元列表中,您会注意到这儿有一些格式化:被 启用 enabled 的单元显示为绿色,被 禁用 disabled 的显示为红色。标记为“static”的单元不能直接启用,它们是其他单元所依赖的对象。若要限制输出列表只包含服务,使用以下命令:

systemctl list-unit-files --type=service

注意,一个单元显示为“enabled”,并不等于对应的服务正在运行,而只能说明它可以被开启。要获得某个特定服务的信息,以 GDM (Gnome Display Manager) 为例,输入以下命令:

systemctl status gdm.service

这条命令提供了许多有用的信息:一段给人看的服务描述、单元配置文件的位置、启动的时间、进程号,以及它所从属的 CGroups(用以限制各组进程的资源开销)。

如果您去查看位于 /usr/lib/systemd/system/gdm.service 的单元配置文件,您可以看到各种选项,包括要被运行的二进制文件(“ExecStart”那一行),相冲突的其他单元(即不能同时进入运行的单元),以及需要在本单元执行前进入运行的单元(“After”那一行)。一些单元有附加的依赖选项,例如“Requires”(必要的依赖)和“Wants”(可选的依赖)。

此处另一个有趣的选项是:

Alias=display-manager.service

当您启动 gdm.service 后,您将可以通过 systemctl status display-manager.service 来查看它的状态。当您知道有 显示管理程序 display manager 在运行并想对它做点什么,但您不关心那究竟是 GDM,KDM,XDM 还是什么别的显示管理程序时,这个选项会非常有用。

Image

使用 systemctl status 命令后面跟一个单元名,来查看对应的服务有什么情况。

目标 target ”锁定

如果您在 /usr/lib/systemd/system 目录中输入 ls 命令,您将看到各种以 .target 结尾的文件。启动 目标 target 是一种将多个单元聚合在一起以致于将它们同时启动的方式。例如,对大多数类 Unix 操作系统而言有一种“ 多用户 multi-user ”状态,意思是系统已被成功启动,后台服务正在运行,并且已准备好让一个或多个用户登录并工作——至少在文本模式下。(其他状态包括用于进行管理工作的 单用户 single-user 状态,以及用于机器关机的 重启 reboot 状态。)

如果您打开 multi-user.target 文件一探究竟,您可能期待看到的是一个要被启动的单元列表。但您会发现这个文件内部几乎空空如也——其实,一个服务会通过 WantedBy 选项让自己成为启动目标的依赖。因此如果您去打开 avahi-daemon.service, NetworkManager.service 及其他 .service 文件看看,您将在 Install 段看到这一行:

WantedBy=multi-user.target

因此,切换到多用户启动目标会 启用 enable 那些包含上述语句的单元。还有其他一些启动目标可用(例如 emergency.target 提供一个紧急情况使用的 shell,以及 halt.target 用于机器关机),您可以用以下方式轻松地在它们之间切换:

systemctl isolate emergency.target

在许多方面,这些都很像 SysVinit 中的 运行级 runlevel ,如文本模式的 multi-user.target 类似于第3运行级,graphical.target 类似于第5运行级,reboot.target 类似于第6运行级,诸如此类。

Image

与传统的脚本相比,单元配置文件也许看起来很陌生,但并不难以理解。

开启与停止

现在您也许陷入了沉思:我们已经看了这么多,但仍没看到如何停止和开启服务!这其实是有原因的。从外部看,Systemd 也许很复杂,像野兽一般难以驾驭。因此在您开始摆弄它之前,有必要从宏观的角度看看它是如何工作的。实际用来管理服务的命令非常简单:

systemctl stop cups.service
systemctl start cups.service

(若某个单元被禁用了,您可以先通过 systemctl enable 加上该单元名的方式将其启用。这种做法会为该单元创建一个符号链接,并将其放置在当前启动目标的 .wants 目录下,这些 .wants 目录在/etc/systemd/system 文件夹中。)

还有两个有用的命令是 systemctl restartsystemctl reload,后面接单元名。后者用于让单元重新加载它的配置文件。Systemd 的绝大部分都有良好的文档,因此您可以查看手册 (man systemctl) 了解每条命令的细节。

定时器单元:取代 Cron

除了系统初始化和服务管理,Systemd 还染指了其他方面。在很大程度上,它能够完成 cron 的工作,而且可以说是以更灵活的方式(并带有更易读的语法)。cron 是一个以规定时间间隔执行任务的程序——例如清除临时文件,刷新缓存等。

如果您再次进入 /usr/lib/systemd/system 目录,您会看到那儿有多个 .timer 文件。用 less 来查看这些文件,您会发现它们与 .service.target 文件有着相似的结构,而区别在于 [Timer] 段。举个例子:

 [Timer]
 OnBootSec=1h
 OnUnitActiveSec=1w

OnBootSec 选项告诉 Systemd 在系统启动一小时后启动这个单元。第二个选项的意思是:自那以后每周启动这个单元一次。关于定时器有大量选项您可以设置,输入 man systemd.time 查看完整列表。

Systemd 的时间精度默认为一分钟。也就是说,它会在设定时刻的一分钟内运行单元,但不一定精确到那一秒。这么做是基于电源管理方面的原因,但如果您需要一个没有任何延时且精确到毫秒的定时器,您可以添加以下一行:

 AccuracySec=1us

另外, WakeSystem 选项(可以被设置为 true 或 false)决定了定时器是否可以唤醒处于休眠状态的机器。

Image

有一个 Systemd 的图形界面程序,即便它已有多年未被积极维护。

日志文件:向 journald 问声好

Systemd 的第二个主要部分是 journal 。这是个日志系统,类似于 syslog 但也有些显著区别。如果您是个 Unix 日志管理模式的粉丝,准备好出离愤怒吧:这是个二进制日志,因此您不能使用常规的命令行文本处理工具来解析它。这个设计决定不出意料地在网上引起了激烈的争论,但它的确有些优点。例如,日志可以被更系统地组织,带有更多的元数据,因此可以更容易地根据可执行文件名和进程号等过滤出信息。

要查看整个 journal,输入以下命令:

journalctl

像许多其他的 Systemd 命令一样,该命令将输出通过管道的方式引向 less 程序,因此您可以使用空格键向下滚动,键入/(斜杠)查找,以及其他熟悉的快捷键。您也能在此看到少许颜色,像红色的警告及错误信息。

以上命令会输出很多信息。为了限制其只输出本次启动的消息,使用如下命令:

journalctl -b

这就是 Systemd 大放异彩的地方!您想查看自上次启动以来的全部消息吗?试试 journalctl -b -1 吧。再上一次的?用 -2 替换 -1 吧。那自某个具体时间,例如2014年10月24日16:38以来的呢?

journalctl -b --since=”2014-10-24 16:38”

即便您对二进制日志感到遗憾,那依然是个有用的特性,并且对许多系统管理员来说,构建类似的过滤器比起写正则表达式而言容易多了。

我们已经可以根据特定的时间来准确查找日志了,那可以根据特定程序吗?对单元而言,试试这个:

journalctl -u gdm.service

(注意:这是个查看 X server 产生的日志的好办法。)那根据特定的进程号?

journalctl _PID=890

您甚至可以请求只看某个可执行文件产生的消息:

journalctl /usr/bin/pulseaudio

若您想将输出的消息限制在某个优先级,可以使用 -p 选项。该选项参数为 0 的话只会显示紧急消息(也就是说,是时候向 **$DEITY** 祈求保佑了)(LCTT 译注: $DEITY 是一个计算机方面的幽默,DEITY 是指广义上的“神”,$前缀表示这是一个变量),为 7 的话会显示所有消息,包括调试消息。请查看手册 (man journalctl) 获取更多关于优先级的信息。

值得指出的是,您也可以将多个选项结合在一起,若想查看在当前启动中由 GDM 服务输出的优先级数小于等于 3 的消息,请使用下述命令:

journalctl -u gdm.service -p 3 -b

最后,如果您仅仅想打开一个随 journal 持续更新的终端窗口,就像在没有 Systemd 时使用 tail 命令实现的那样,输入 journalctl -f 就好了。

二进制日志并不流行,但 journal 的确有它的优点,如非常方便的信息查找及过滤。

没有 Systemd 的生活?

如果您就是完全不能接受 Systemd,您仍然有一些主流发行版中的选择。尤其是 Slackware,作为历史最为悠久的发行版,目前还没有做出改变,但它的主要开发者并没有将其从未来规划中移除。一些不出名的发行版也在坚持使用 SysVinit 。

但这又将持续多久呢?Gnome 正越来越依赖于 Systemd,其他的主流桌面环境也会步其后尘。这也是引起 BSD 社区一阵恐慌的原因:Systemd 与 Linux 内核紧密相连,导致在某种程度上,桌面环境正变得越来越不可移植。一种折衷的解决方案也许会以 Uselessd (http://uselessd.darknedgy.net) 的形式到来:一种裁剪版的 Systemd,纯粹专注于启动和监控进程,而不消耗整个基础系统。

Image

若您不喜欢 Systemd,可以尝试一下 Gentoo 发行版,它将 Systemd 作为初始化工具的一种选择,但并不强制用户使用 Systemd。


via: http://www.linuxvoice.com/linux-101-get-the-most-out-of-systemd/

作者:Mike Saunders 译者:Ricky-Gong 校对:wxy

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

Glances 是一个用于监控系统的跨平台、基于文本模式的命令行工具。它是用 Python 编写的,使用 psutil 库从系统获取信息。你可以用它来监控 CPU、平均负载、内存、网络接口、磁盘 I/O,文件系统空间利用率、挂载的设备、所有活动进程以及消耗资源最多的进程。Glances 有很多有趣的选项。它的主要特性之一是可以在配置文件中设置阀值( careful 小心 warning 警告 critical 致命 ),然后它会用不同颜色显示信息以表明系统的瓶颈。

Glances 的功能

  • CPU 平均负载
  • 不同状态(如活动、休眠)进程的数量
  • 所有内存信息,如物理内存、交换空间、空闲内存
  • CPU 信息
  • 网络连接的上行/下行速度
  • 磁盘 I/O 读/写速度详细信息
  • 当前挂载设备的磁盘使用情况
  • 消耗资源最多的进程和他们的 CPU/内存使用情况

安装 Glances

Glances 在 Ubuntu 的软件仓库中,所以安装很简单。执行下面的命令安装 Glances:

sudo apt-get install glances

(LCTT 译注:若安装后无法正常使用,可考虑使用 pip 安装/升级 glances:sudo pip install --upgrade glances

Glances 使用方法

安装完成后,可以执行下面的命令启动 Glances:

glances

你将看到类似下图的输出:

glances monitor system output

要退出 Glances 终端,按 ESC 键或 Ctrl + C

默认情况下,时间间隔(LCTT 译注:显示数据刷新的时间间隔)是 1 秒,不过你可以在从终端启动 Glances 时自定义时间间隔。

要把时间间隔设为 5 秒,执行下面的命令:

glances -t 5

Glances 中不同颜色含义

Glances 中不同颜色的含义:

  • 绿色:正常(OK)
  • 蓝色:小心(careful)
  • 紫色:警告(warning)
  • 红色:致命(critical)

默认设置下,Glances 的阀值设置是:careful=50,warning=70,critical=90。你可以通过 “/etc/glances/” 目录下的默认配置文件 glances.conf 来自定义这些阀值。

Glances 的选项

Glances 提供了很多快捷键,可以在它运行时用来查找输出信息。

下面是一些常用的热键列表:

  • m : 按内存占用排序进程
  • p : 按进程名称排序进程
  • c : 按 CPU 占用率排序进程
  • i : 按 I/O 频率排序进程
  • a : 自动排序进程
  • d : 显示/隐藏磁盘 I/O 统计信息
  • f : 显示/隐藏文件系统统计信息
  • s : 显示/隐藏传感器统计信息
  • y : 显示/隐藏硬盘温度统计信息
  • l : 显示/隐藏日志
  • n : 显示/隐藏网络统计信息
  • x : 删除警告和严重日志
  • h : 显示/隐藏帮助界面
  • q : 退出
  • w : 删除警告记录

使用 Glances 监控远程系统

你也可以使用 Glances 监控远程系统。要在远程系统上使用它,使用下面的命令:

glances -s

你会看到类似下面的输出:

glances monitor remote system server

如你所见,Glances 运行在 61209 端口。

现在,到远程机器上执行下面的命令以连接到指定 IP 地址的 Glances 服务器上。假设 192.168.1.10 是你的 Glances 服务器 IP 地址。

glances -c -P 192.168.1.10

结论

对于每个 Linux 系统管理员来说,Glances 都是一个非常有用的工具。使用它,你可以轻松、高效地监控 Linux 系统。如果你有什么问题,自由地评论吧。


via: https://www.maketecheasier.com/glances-monitor-system-ubuntu/

作者:Hitesh Jethva 译者:bianjp 校对:wxy

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

作为一名维护 Linux 生产服务器的系统管理员,你可能会遇到这样一些情形:你需要根据地理位置,选择性地阻断或允许网络流量通过。 例如你正经历一次由注册在某个特定国家的 IP 发起的 DoS 攻击;或者基于安全考虑,你想阻止来自未知国家的 SSH 登录请求;又或者你的公司对某些在线视频有分销权,它要求只能在特定的国家内合法发行;抑或是由于公司的政策,你需要阻止某个本地主机将文件上传至任意一个非美国的远程云端存储。

所有的上述情形都需要设置防火墙,使之具有基于国家位置过滤流量的功能。有几个方法可以做到这一点,其中之一是你可以使用 TCP wrappers 来为某个应用(例如 SSH,NFS, httpd)设置条件阻塞。但其缺点是你想要保护的那个应用必须以支持 TCP wrappers 的方式构建。另外,TCP wrappers 并不总是能够在各个平台中获取到(例如,Arch Linux 放弃了对它的支持)。另一种方式是结合基于国家的 GeoIP 信息,设置 ipset,并将它应用到 iptables 的规则中。后一种方式看起来更有希望一些,因为基于 iptables 的过滤器是与应用无关的,且容易设置。

在本教程中,我将展示 另一个基于 iptables 的 GeoIP 过滤器,它由 xtables-addons 来实现。对于那些不熟悉它的人来说, xtables-addons 是用于 netfilter/iptables 的一系列扩展。一个包含在 xtables-addons 中的名为 xt\_geoip 的模块扩展了 netfilter/iptables 的功能,使得它可以根据流量来自或流向的国家来进行过滤,IP 掩蔽(NAT)或丢包。若你想使用 xt\_geoip,你不必重新编译内核或 iptables,你只需要使用当前的内核构建环境(/lib/modules/uname -r/build)以模块的形式构建 xtables-addons。同时也不需要进行重启。只要你构建并安装了 xtables-addons , xt\_geoip 便能够配合 iptables 使用。

至于 xt\_geoip 和 ipset 之间的比较,xtables-addons 的官方网站 上是这么说的: 相比于 ipset,xt\_geoip 在内存占用上更胜一筹,但对于匹配速度,基于哈希的 ipset 可能更有优势。

在教程的余下部分,我将展示如何使用 iptables/xt\_geoip 来根据流量的来源地或流入的国家阻断网络流量

在 Linux 中安装 xtables-addons

下面介绍如何在各种 Linux 平台中编译和安装 xtables-addons。

为了编译 xtables-addons,首先你需要安装一些依赖软件包。

在 Debian,Ubuntu 或 Linux Mint 中安装依赖

$ sudo apt-get install iptables-dev xtables-addons-common libtext-csv-xs-perl pkg-config

在 CentOS,RHEL 或 Fedora 中安装依赖

CentOS/RHEL 6 需要事先设置好 EPEL 仓库(为 perl-Text-CSV\_XS 所需要)。

$ sudo yum install gcc-c++ make automake kernel-devel-`uname -r` wget unzip iptables-devel perl-Text-CSV_XS

编译并安装 xtables-addons

xtables-addons官方网站 下载源码包,然后按照下面的指令编译安装它。

$ wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.10.tar.xz
$ tar xf xtables-addons-2.10.tar.xz
$ cd xtables-addons-2.10
$ ./configure
$ make
$ sudo make install

需要注意的是,对于基于红帽的系统(CentOS、RHEL、Fedora),它们默认开启了 SELinux,所以有必要像下面这样调整 SELinux 的策略。否则,SELinux 将阻止 iptables 加载 xt\_geoip 模块。

$ sudo chcon -vR --user=system_u /lib/modules/$(uname -r)/extra/*.ko
$ sudo chcon -vR --type=lib_t /lib64/xtables/*.so

为 xtables-addons 安装 GeoIP 数据库

下一步是安装 GeoIP 数据库,它将被 xt\_geoip 用来查询 IP 地址与国家地区之间的对应关系。方便的是,xtables-addons 的源码包中带有两个帮助脚本,它们被用来从 MaxMind 下载 GeoIP 数据库并将它转化为 xt\_geoip 可识别的二进制形式文件;它们可以在源码包中的 geoip 目录下找到。请遵循下面的指导来在你的系统中构建和安装 GeoIP 数据库。

$ cd geoip
$ ./xt_geoip_dl
$ ./xt_geoip_build GeoIPCountryWhois.csv
$ sudo mkdir -p /usr/share/xt_geoip
$ sudo cp -r {BE,LE} /usr/share/xt_geoip

根据 MaxMind 的说明,他们的 GeoIP 数据库能够以 99.8% 的准确率识别出 ip 所对应的国家,并且每月这个数据库将进行更新。为了使得本地安装的 GeoIP 数据是最新的,或许你需要设置一个按月执行的 cron job 来时常更新你本地的 GeoIP 数据库。

阻断来自或流向某个国家的网络流量

一旦 xt\_geoip 模块和 GeoIP 数据库安装好后,你就可以在 iptabels 命令中使用 geoip 的匹配选项。

$ sudo iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

你想要阻断流量的那些国家是使用2个字母的 ISO3166 代码 来特别指定的(例如 US(美国)、CN(中国)、IN(印度)、FR(法国))。

例如,假如你想阻断来自也门(YE) 和 赞比亚(ZM)的流量,下面的 iptabels 命令便可以达到此目的。

$ sudo iptables -I INPUT -m geoip --src-cc YE,ZM -j DROP

假如你想阻断流向中国(CN) 的流量,可以运行下面的命令:

$ sudo iptables -A OUTPUT -m geoip --dst-cc CN -j DROP

匹配条件也可以通过在 --src-cc--dst-cc 选项前加 ! 来达到相反的目的:

假如你想在你的服务器上阻断来自所有非美国的流量,可以运行:

$ sudo iptables -I INPUT -m geoip ! --src-cc US -j DROP

对于使用 Firewall-cmd 的用户

某些发行版本例如 CentOS/RHEL7 或 Fedora 已经用 firewalld 替代了 iptables 来作为默认的防火墙服务。在这些系统中,你可以类似使用 xt\_geoip 那样,使用 firewall-cmd 来阻断流量。利用 firewall-cmd 命令,上面的三个例子可被重新写为:

$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip --src-cc YE,ZM -j DROP
$ sudo firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -m geoip --dst-cc CN -j DROP
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip ! --src-cc US -j DROP

总结

在本教程中,我展示了使用 iptables/xt\_geoip 来根据流量的来源地或流入的国家轻松地阻断网络流量。假如你有这方面的需求,把它部署到你的防火墙系统中可以使之成为一个实用的办法。作为最后的警告,我应该提醒你的是:在你的服务器上通过基于 GeoIP 的流量过滤来禁止特定国家的流量并不总是万无一失的。GeoIP 数据库本身就不是很准确或齐全,且流量的来源或目的地可以轻易地通过使用 VPN、Tor 或其他任意易受攻击的中继主机来达到欺骗的目的。基于地理位置的过滤器甚至可能会阻止本不该阻止的合法网络流量。在你决定把它部署到你的生产环境之前请仔细考虑这个限制。


via: http://xmodulo.com/block-network-traffic-by-country-linux.html

作者:Dan Nanni 译者:FSSlc 校对:wxy

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

学术界是培养和塑造未来的开源开发者的最佳平台。研究中发现,我们偶尔会开源自己编写的软件。这样做有两个理由,一是为了推广自己编写的工具的使用,二是为了了解人们使用这些工具时会遇到哪些问题。在这样一个编写研究软件的背景下,我的任务就是为 Bradford 大学重新设计二年级的本科软件工程课程。

这是一个挑战,因为我所面对的 80 个学生是来自不同专业的,包括 IT、商务计算和软件工程,这些学生将要在一起上课。最有难度的是,需要和这些编程经验差距很大的学生一起编写代码。按照传统,该课程允许学生选择自己的小组,然后给他们布置构建一个加油站数据库系统的任务,最后提交报告作为评估的一部分。

而我决定重新设计课程,让学生了解现实中的软件团队是如何协作的过程。根据学生的专业和编程技能,我将他们分为五、六个人一组。这是为了确保每个小组的整体水平相当,避免小组之间的不等。

核心课程

课程的形式改为讲座和实践课两项结合在一起。然而实践课作为指导过程,主要是老师监督各个小组的实践进度以及他们如何处理客户和产品之间的关系。而传统的教学方式由项目管理、软件测试、工程需求分析以及类似主题的讲座组成,再辅以实践和导师会议。这些会议可以很好的考核学生的水平以及检测出他们是否可以跟得上我们在讲座部分中的软件工程方法。本年的教学主题包括以下内容:

  • 工程需求分析
  • 如何与客户及其他团队成员互动
  • 程序设计方法,如敏捷和极限编程方法
  • 如何通过学习不同的软件工程方法进行短期的水平提高
  • 小组会议及文档编写
  • 项目管理及项目进展图表(甘特图)
  • UML 图表及系统描述
  • 使用 Git 来进行代码的版本控制
  • 软件测试及 BUG 跟踪
  • 使用开源库
  • 开源代码许可及其选择
  • 软件交付

在这些讲座之后,会有一些来自世界各地的嘉宾为我们说说他们在软件交付过程中的经验。我们也设法请来大学里知识产权律师谈关于软件在英国的知识产权问题,以及如何处理软件的知识产权问题。

协作工具

为了让上述教学内容的顺利进行,我们将会引入一些工具,并训练学生在他们的项目中使用这些工具。如下:

  • Google Drive:团队与导师之间进行共享的工具,暂时存储用于描述项目的文档和图表、需求收集、会议纪要以及项目时间跟踪等信息。采取这样一个方式来监控并提供直接反馈到每个团队,是非常有效的。
  • Basecamp:同样是用于分享文档,在随后的课程中,我们可能会考虑用它取代 Google Drive。
  • BUG 报告工具,如 Mantis:只能让有限的用户免费提交 BUG。稍后我们提到的 Git 可以让小组内的所有人员用做 BUG 提交。
  • 远程视频会议工具:在人员不在校内,甚至去了其他城市的情况下使用。学生们可以定期通过 Skype 来交流并记录会议内容或则进行录音作为今后其他用处。
  • 同时,学生们的项目中还会用到大量的开源工具包。他们可以根据自己小组的项目需求来选择自己使用的工具包和编程语言。唯一的条件是,这些项目必须开源,最后成果可以安装到大学里的实验室,并且大多的研究人员都非常支持这个条件。
  • 最后,所有团队必须向客户交付他们的项目,包括完整的可以工作的软件版本、文档和他们自己选择的开放源码许可。大多数的团队选择了 GPLv3 许可证。

技巧和经验教训

在最后,这一年过的很愉快,并且所有学生的项目都做的非常棒。这里有一些我学到的经验教训,可能有助于提高明年的课程质量:

  1. 提供各种各样有趣的选择项目给学生选择。比如说,游戏开发或者移动应用开发以及完成各种目标的项目等。建立普通的数据库系统已经不能提起学生的兴趣了,而参与到有趣的项目中去,学生本身就是自学者,同时可以帮助解决小组成员和小组之间的常见问题。再通过一个消息列表,学生们发表他们在测试中遇到的任何问题,以寻求其他人的帮助建议。然而,这种方法有一个缺点。外部考官建议我们使用统一种类型的项目和统一的编程语言以帮助缩小对学生的评估标准。
  2. 定期给学生在每一个阶段的表现进行反馈。比方说,可以在和各个小组开指导会议的时候,或者每个阶段进行反馈,以帮助他们在接下来的工作中自我改进。
  3. 学生更加愿意与校外的客户一起协作。他们期待着与外部公司代表或校外人员协作,不过是为了获得新体验而已。与导师进行交流时,他们都能够表现得很专业,这样使得老师非常放心。
  4. 很多团队版将开发单元测试的部分放到项目结束之后,从极限编程方法的角度来说,这是一个严重的禁忌。也许测试应包括在不同阶段的评估中,来提醒他们需要并行开展软件开发和单元测试。
  5. 在这个班的 80 个人里边,仅有 4 个女生,每个女生都分在不同的小组里边。我观察到,男生们总是充分准备好来承担起领队角色,并将最有趣的代码部分留给他们自己来编写,女生则多大遵循安排或者是编写文档。出于某种原因,女生选择不出头,即使在女性辅导员鼓励下,她们也不愿编写代码。这仍然是一个需要解决的主要问题。
  6. 允许不同风格项目文档,比方说,UML 图表、状态图或其他形式的。让学生学习这些并与其他课程融汇贯通来提高他们的学习经验。
  7. 学生里边,有些是很好的开发人员,有些做商务计算的则没有多少编程经验。我们要鼓励团队共同努力,避免开发人员做得比那些只做会议记录或文档的其他成员更好的错误认知。我们常在辅导课程中鼓励角色转换,让每个人都有机会学习如何编程。
  8. 小组与导师每周见面沟通是非常重要的,可以有效监督各个小组进展情况,还可以了解是谁做了大部分工作。通常,没来参加会议的小组成员基本就是没有参与到他们的团队工作中去的,并且通过其他成员所提交的工作报告也可以确定哪些人不活跃。
  9. 我们鼓励学生们把许可证附加到项目中去,使用外部库以及和客户协作的时候要表明确切知识产权问题。 这样可让打破陈规,开拓思维,并了解真实的软件交付问题。
  10. 给学生们自己选择所用技术的空间。
  11. 助教是关键。同时管理 80 个学生显然很有难度,特别是需要对他们进行评估的那几周。明年我一定会找个助教来帮我一起管理各个小组。
  12. 实验室的技术支持是非常重要的。大学里的技术支持人员对于本课程是非常赞同的。他们正在考虑明年将虚拟机分配给每个团队,这样没个团队可以根据需要自行在虚拟机中安装任何软件。
  13. 团队合作,相互帮助。大多数团队自然而然的支持其他团队成员,同时指导员在中间也帮助了不少。
  14. 来自其他同事的帮助会锦上添花。作为一名新的大学导师,我需要从经验中学习,如果我想了解如何管理某些学生和团队,或者对如何让学生适应课程感到困惑时,我会通过多个方面来寻求建议。来自资深同事的支持对我来说是一种极大的鼓励。

最后,对于作为导师的我以及所有的学生来说,这都是个有趣的课程。在学习目标和传统评分方案上还有有一些问题需解决,以减少教师的工作量。明年,我计划会保留这种教学模式,并希望能够提出更好的评分方案以及引入更多的软件来帮助监督项目和控制代码版本。


via: http://opensource.com/education/15/9/teaching-open-source-development-undergraduates

作者:Mariam Kiran 译者:GHLandy 校对:Caroline

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

图片来源: Shutterstock

我们不要让下一代 Linux 和 Unix 的管理员忘记初始化脚本和基本工具的好处

我曾经有一次在 Reddit 看到一个帖子,“请问如何操作文本文件”。这是一个很简单的需求,就像我们常用 Unix 的人每天遇到的一样。他的问题是,如何删除文件中的重复行,只保留不重复的。 这听起来似乎很简单,但是当文件足够大时,就会有些复杂。

这个问题有很多种不同的答案。你可以使用几乎任何一种语言来写这样的一个脚本,只是时间的投入和代码的复杂性不同罢了。根据你的个人水平,它大概会花费20-60分钟。但是如果你使用了 Perl、Python、Ruby 中的一种,你可能很快实现它。

或者你可以使用下面的一个方法,让你无比暖心的: 只用 awk。

这个答案是迄今为止最简明、最简单的解决问题的方法。它只要一行!

awk '!seen[$0]++' <filename>

让我们来看看发生了什么:

在这个命令中,其实隐藏了很多代码。awk 是一种文本处理语言,并且它内部有很多预设。首先,你看到的实际上是一个 for 循环的结果。awk 假定你想通过循环处理输入文件的每一行,所以你不需要明确的去指定它。awk 还假定了你需要打印输出处理后的数据,所以你也不需要去指定它。最后,awk 假定循环在最后一句指令执行完结束,这一块也不再需要你去指定它。

这个例子中的字符串 seen 是一个关联数组的名字。$0 是一个变量,表示整个当前行。所以,这个命令翻译成人类语言就是“对这个文件的每一行进行检查,如果你之前没有见过它,就打印出来。” 如果该关联数组的键名还不存在就添加到数组,并增加其取值,这样 awk 下次遇到同样的行时就会不匹配(条件判断为“假”),从而不打印出来。

据微博上 @ZorroLang 的补充:少提了一个重点,要不然只会 C 语言的人很难理解为什么 seen[$0]++ 一行代码就行了,这里隐含了 awk 对于其数组变量的处理方式。awk 的数组是关联数组,且不需要声明,而是引用即创建,注意是创建,后面都不会消失的。也就是你像 str[any] 这样随便写一个数组变量,这个数组元素就此就创建了,且初始化为0或空。

谢谢 @ZorroLang ~

一些人认为这样是优雅的,另外的人认为这可能会造成混淆。任何在日常工作上使用 awk 的都是第一类人。awk 就是设计用来做这个的。在 awk 中,你可以写多行代码。你甚至可以用 awk 写一些让人不安的复杂功能。但终究来说,awk 还是一个进行文本处理的程序,一般是通过管道。去掉(没必要的)循环定义是很常见的快捷用法,不过如果你乐意,你也可以用下面的代码做同样的事情:

awk '{ if (!seen[$0]) print $0; seen[$0]++ }’ 

这会产生相同的结果。

awk 是完成这项工作的完美工具。不过,我相信很多管理员--特别是新管理员会转而使用 Bash 或 Python 来完成这一任务,因为对 awk 的知识和对它的能力的了解看起来随着时间而慢慢被人淡忘。我认为这是标志着一个问题,由于对之前的解决方案缺乏了解,那些已经解决了几十年的问题又突然出现了。

shell、grep、sed 和 awk 是 Unix 的基础。如果你不能非常轻松的使用它们,你将会被自己束缚住,因为它们构成了通过命令行和脚本与 Unix 系统交互的基础。学习这些工具如何工作最好的方法之一就是观察真实的例子和实验,你可以在各种 Unix 衍生系统的初始化系统中找到很多,但在 Linux 发行版中它们已经被 systemd 取代了。

数以百万计的 Unix 管理员了解 Shell 脚本和 Unix 工具如何读、写、修改和用在初始化脚本上。不同系统的初始化脚本有很大不同,甚至是不同的 Linux 发行版也不同。但是它们都源自 sh,而且它们都用像 sed、awk 还有 grep 这样的核心的命令行工具。

我每天都会听到很多人抱怨初始化脚本太“古老”而且很“难”。但是实际上,初始化脚本和 Unix 管理员每天使用的工具一样,还提供了一个非常好的方式来更加熟悉和习惯这些工具。说初始化脚本难于阅读和难于使用实际上是承认你缺乏对 Unix 基础工具的熟悉。

说起在 Reddit 上看到的内容,我也碰到过这个问题,来自一个新入行的 Linux 系统管理员, “问他是否应该还要去学老式的初始化系统 sysvinit”。 这个帖子的大多数的答案都是正面的——是的,应该学习 sysvinit 和 systemd 两个。一位评论者甚至指出,初始化脚本是学习 Bash 的好方法。而另一个消息是,Fortune 50 强的公司还没有计划迁移到以 systemd 为基础的发行版上。

但是,这提醒了我这确实是一个问题。如果我们继续沿着消除脚本和脱离操作系统核心组件的方式发展下去,由于疏于接触,我们将会不经意间使新管理员难于学习基本的 Unix 工具。

我不知道为什么有些人想在一层又一层的抽象化来掩盖 Unix 内部,但是这样发展下去可能会让新一代的系统管理员们变成只会按下按钮的工人。我觉得这不是一件好事情。


via: http://www.infoworld.com/article/2985804/linux/remember-sed-awk-linux-admins-should.html

作者:Paul Venezia 译者:Bestony 校对:wxy

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

问题

有一天我要连接到我的 web 服务器。我使用 FileZilla 连接到 FTP 服务器。当我输入主机名和密码连接服务器后,我得到了下面的错误。

Error: Cannot establish FTP connection to an SFTP server. Please select proper protocol.

Error: Critical error: Could not connect to server

FileZilla Cannot establish FTP connection to an SFTP server

原因

看见错误信息后我意识到了我的错误是什么。我尝试与一台 SFTP 服务器建立一个 FTP 连接。很明显我没有使用一个正确的协议(应该是SFTP而不是FTP)。

如你在上图所见,FileZilla 默认使用的是FTP协议。

解决 “Cannot establish FTP connection to an SFTP server” 的方案

解决方案很简单。使用 SFTP 协议而不是 FTP。你要做的就是把协议修改成 SFTP。这就是我要告诉你的。

在 FileZilla 菜单中,进入 文件->站点管理

FileZilla Site Manager

在站点管理中,进入通用选项并选择 SFTP 协议。同样填上主机、端口号、用户密码等。

Cannot establish FTP connection to an SFTP server

我希望你从这里可以开始工作了。

我希望本篇教程可以帮助你修复 “Cannot establish FTP connection to an SFTP server. Please select proper protocol.”这个问题。在相关的文章中,你可以读了解在 Linux 中如何设置 FTP


via: http://itsfoss.com/fix-establish-ftp-connection-sftp-server/

作者:Abhishek 译者:geekpi 校对:wxy

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