分类 系统运维 下的文章

如何保持正确的时间,如何使用 NTP 和 systemd 让你的计算机在不滥用时间服务器的前提下保持同步。

它的时间是多少?

让 Linux 来告诉你时间的时候,它是很奇怪的。你可能认为是使用 time 命令来告诉你时间,其实并不是,因为 time 只是一个测量一个进程运行了多少时间的计时器。为得到时间,你需要运行的是 date 命令,你想查看更多的日期,你可以运行 cal 命令。文件上的时间戳也是一个容易混淆的地方,因为根据你的发行版默认情况不同,它一般有两种不同的显示方法。下面是来自 Ubuntu 16.04 LTS 的示例:

$ ls -l
drwxrwxr-x 5 carla carla 4096 Mar 27 2017 stuff
drwxrwxr-x 2 carla carla 4096 Dec 8 11:32 things
-rw-rw-r-- 1 carla carla 626052 Nov 21 12:07 fatpdf.pdf
-rw-rw-r-- 1 carla carla 2781 Apr 18 2017 oddlots.txt

有些显示年,有些显示时间,这样的方式让你的文件更混乱。GNU 默认的情况是,如果你的文件在六个月以内,则显示时间而不是年。我想这样做可能是有原因的。如果你的 Linux 是这样的,尝试用 ls -l --time-style=long-iso 命令,让时间戳用同一种方式去显示,按字母顺序排序。请查阅 如何更改 Linux 的日期和时间:简单的命令 去学习 Linux 上管理时间的各种方法。

检查当前设置

NTP —— 网络时间协议,它是保持计算机正确时间的老式方法。ntpd 是 NTP 守护程序,它通过周期性地查询公共时间服务器来按需调整你的计算机时间。它是一个简单的、轻量级的协议,使用它的基本功能时设置非常容易。systemd 通过使用 systemd-timesyncd.service 已经越俎代庖地 “干了 NTP 的活”,它可以用作 ntpd 的客户端。

在我们开始与 NTP “打交道” 之前,先花一些时间来了检查一下当前的时间设置是否正确。

你的系统上(至少)有两个时钟:系统时间 —— 它由 Linux 内核管理,第二个是你的主板上的硬件时钟,它也称为实时时钟(RTC)。当你进入系统的 BIOS 时,你可以看到你的硬件时钟的时间,你也可以去改变它的设置。当你安装一个新的 Linux 时,在一些图形化的时间管理器中,你会被询问是否设置你的 RTC 为 UTC( 世界标准时间 Coordinated Universal Time )时区,因为所有的时区和夏令时都是基于 UTC 的。你可以使用 hwclock 命令去检查:

$ sudo hwclock --debug
hwclock from util-linux 2.27.1
Using the /dev interface to the clock.
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2018/01/22 22:14:31
Hw clock time : 2018/01/22 22:14:31 = 1516659271 seconds since 1969
Time since last adjustment is 1516659271 seconds
Calculated Hardware Clock drift is 0.000000 seconds
Mon 22 Jan 2018 02:14:30 PM PST .202760 seconds

Hardware clock is on UTC time 表明了你的计算机的 RTC 是使用 UTC 时间的,虽然它把该时间转换为你的本地时间。如果它被设置为本地时间,它将显示 Hardware clock is on local time

你应该有一个 /etc/adjtime 文件。如果没有的话,使用如下命令同步你的 RTC 为系统时间,

$ sudo hwclock -w

这个命令将生成该文件,内容看起来类似如下:

$ cat /etc/adjtime
0.000000 1516661953 0.000000
1516661953
UTC

新发明的 systemd 方式是去运行 timedatectl 命令,运行它不需要 root 权限:

$ timedatectl
 Local time: Mon 2018-01-22 14:17:51 PST
 Universal time: Mon 2018-01-22 22:17:51 UTC
 RTC time: Mon 2018-01-22 22:17:51
 Time zone: America/Los_Angeles (PST, -0800)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

RTC in local TZ: no 表明它使用 UTC 时间。那么怎么改成使用本地时间?这里有许多种方法可以做到。最简单的方法是使用一个图形配置工具,比如像 openSUSE 中的 YaST。你也可使用 timedatectl

$ timedatectl set-local-rtc 0

或者编辑 /etc/adjtime,将 UTC 替换为 LOCAL

systemd-timesyncd 客户端

现在,我已经累了,但是我们刚到非常精彩的部分。谁能想到计时如此复杂?我们甚至还没有了解到它的皮毛;阅读 man 8 hwclock 去了解你的计算机如何保持时间的详细内容。

systemd 提供了 systemd-timesyncd.service 客户端,它可以查询远程时间服务器并调整你的本地系统时间。在 /etc/systemd/timesyncd.conf 中配置你的(时间)服务器。大多数 Linux 发行版都提供了一个默认配置,它指向他们维护的时间服务器上,比如,以下是 Fedora 的:

[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org

你可以输入你希望使用的其它时间服务器,比如你自己的本地 NTP 服务器,在 NTP= 行上输入一个以空格分隔的服务器列表。(别忘了取消这一行的注释)NTP= 行上的任何内容都将覆盖掉 FallbackNTP 行上的配置项。

如果你不想使用 systemd 呢?那么,你将需要 NTP 就行。

配置 NTP 服务器和客户端

配置你自己的局域网 NTP 服务器是一个非常好的实践,这样你的网内计算机就不需要不停查询公共 NTP 服务器。在大多数 Linux 上的 NTP 都来自 ntp 包,它们大多都提供 /etc/ntp.conf 文件去配置时间服务器。查阅 NTP 时间服务器池 去找到你所在的区域的合适的 NTP 服务器池。然后在你的 /etc/ntp.conf 中输入 4 - 5 个服务器,每个服务器用单独的一行:

driftfile /var/ntp.drift
logfile /var/log/ntp.log
server 0.europe.pool.ntp.org
server 1.europe.pool.ntp.org
server 2.europe.pool.ntp.org
server 3.europe.pool.ntp.org

driftfile 告诉 ntpd 它需要保存用于启动时使用时间服务器快速同步你的系统时钟的信息。而日志也将保存在他们自己指定的目录中,而不是转储到 syslog 中。如果你的 Linux 发行版默认提供了这些文件,请使用它们。

现在去启动守护程序;在大多数主流的 Linux 中它的命令是 sudo systemctl start ntpd。让它运行几分钟之后,我们再次去检查它的状态:

$ ntpq -p
 remote refid st t when poll reach delay offset jitter
==============================================================
+dev.smatwebdesi 192.168.194.89 3 u 25 64 37 92.456 -6.395 18.530
*chl.la 127.67.113.92 2 u 23 64 37 75.175 8.820 8.230
+four0.fairy.mat 35.73.197.144 2 u 22 64 37 116.272 -10.033 40.151
-195.21.152.161 195.66.241.2 2 u 27 64 37 107.559 1.822 27.346

我不知道这些内容是什么意思,但重要的是,你的守护程序已经与时间服务器开始对话了,而这正是我们所需要的。你可以去运行 sudo systemctl enable ntpd 命令,永久启用它。如果你的 Linux 没有使用 systemd,那么,给你留下的家庭作业就是找出如何去运行 ntpd

现在,你可以在你的局域网中的其它计算机上设置 systemd-timesyncd,这样它们就可以使用你的本地 NTP 服务器了,或者,在它们上面安装 NTP,然后在它们的 /etc/ntp.conf 上输入你的本地 NTP 服务器。

NTP 服务器会受到攻击,而且需求在不断增加。你可以通过运行你自己的公共 NTP 服务器来提供帮助。下周我们将学习如何运行你自己的公共服务器。

通过来自 Linux 基金会和 edX 的免费课程 “Linux 入门” 来学习更多 Linux 的知识。


via: https://www.linux.com/learn/intro-to-linux/2018/1/keep-accurate-time-linux-ntp

作者:CARLA SCHRODER 译者:qhwdw 校对:wxy

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

许多人熟知并热爱 Dnsmasq,并在他们的本地域名服务上使用它。今天我们将介绍进阶配置文件管理、如何测试你的配置、一些基础的安全知识、DNS 泛域名、快速 DNS 配置,以及其他一些技巧与窍门。下个星期我们将继续详细讲解如何配置 DNS 和 DHCP。

测试配置

当你测试新的配置的时候,你应该从命令行运行 Dnsmasq,而不是使用守护进程。下面的例子演示了如何不用守护进程运行它,同时显示指令的输出并保留运行日志:

# dnsmasq --no-daemon --log-queries
dnsmasq: started, version 2.75 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt
 DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack
 ipset auth DNSSEC loop-detect inotify
dnsmasq: reading /etc/resolv.conf
dnsmasq: using nameserver 192.168.0.1#53
dnsmasq: read /etc/hosts - 9 addresses

在这个小例子中你能看到许多有用的信息,包括版本、编译参数、系统名字服务文件,以及它的监听地址。可以使用 Ctrl+C 停止进程。在默认情况下,Dnsmasq 没有自己的日志文件,所以日志会被记录到 /var/log 目录下的多个地方。你可以使用经典的 grep 来找到 Dnsmasq 的日志文件。下面这条指令会递归式地搜索 /var/log,在每个匹配的文件名之后显示匹配的行号,并忽略 /var/log/dist-upgrade 里的内容:

# grep -ir --exclude-dir=dist-upgrade dnsmasq /var/log/

使用 grep --exclude-dir= 时有一个有趣的小陷阱需要注意:不要使用完整路径,而应该只写目录名称。

你可以使用如下的命令行参数来让 Dnsmasq 使用你指定的文件作为它专属的日志文件:

# dnsmasq --no-daemon --log-queries --log-facility=/var/log/dnsmasq.log

或者在你的 Dnsmasq 配置文件中加上 log-facility=/var/log/dnsmasq.log

配置文件

Dnsmasq 的配置文件位于 /etc/dnsmasq.conf。你的 Linux 发行版也可能会使用 /etc/default/dnsmasq/etc/dnsmasq.d/,或者 /etc/dnsmasq.d-available/(不,我们不能统一标准,因为这违反了 Linux 七嘴八舌秘密议会 Linux Cat Herd Ruling Cabal 的旨意)。你有很多自由来随意安置你的配置文件。

/etc/dnsmasq.conf 是德高望重的老大。Dnsmasq 在启动时会最先读取它。/etc/dnsmasq.conf 可以使用 conf-file= 选项来调用其他的配置文件,例如 conf-file=/etc/dnsmasqextrastuff.conf,或使用 conf-dir= 选项来调用目录下的所有文件,例如 conf-dir=/etc/dnsmasq.d

每当你对配置文件进行了修改,你都必须重启 Dnsmasq。

你也可以根据扩展名来包含或忽略配置文件。星号表示包含,不加星号表示排除:

conf-dir=/etc/dnsmasq.d/, *.conf, *.foo
conf-dir=/etc/dnsmasq.d, .old, .bak, .tmp

你可以用 --addn-hosts= 选项来把你的主机配置分布在多个文件中。

Dnsmasq 包含了一个语法检查器:

$ dnsmasq --test
dnsmasq: syntax check OK.

实用配置

永远加入这几行:

domain-needed
bogus-priv

它们可以避免含有格式出错的域名或私有 IP 地址的数据包离开你的网络。

让你的名字服务只使用 Dnsmasq,而不去使用 /etc/resolv.conf 或任何其他的名字服务文件:

no-resolv

使用其他的域名服务器。第一个例子是只对于某一个域名使用不同的域名服务器。第二个和第三个例子是 OpenDNS 公用服务器:

server=/fooxample.com/192.168.0.1
server=208.67.222.222
server=208.67.220.220

你也可以将某些域名限制为只能本地解析,但不影响其他域名。这些被限制的域名只能从 /etc/hosts 或 DHCP 解析:

local=/mehxample.com/
local=/fooxample.com/

限制 Dnsmasq 监听的网络接口:

interface=eth0
interface=wlan1

Dnsmasq 在默认设置下会读取并使用 /etc/hosts。这是一个又快又好的配置大量域名的方法,并且 /etc/hosts 只需要和 Dnsmasq 在同一台电脑上。你还可以让这个过程再快一些,可以在 /etc/hosts 文件中只写主机名,然后用 Dnsmasq 来添加域名。/etc/hosts 看上去是这样的:

127.0.0.1 localhost
192.168.0.1 host2
192.168.0.2 host3
192.168.0.3 host4

然后把下面这几行写入 dnsmasq.conf(当然,要换成你自己的域名):

expand-hosts
domain=mehxample.com

Dnsmasq 会自动把这些主机名扩展为完整的域名,比如 host2 会变为 host2.mehxample.com

DNS 泛域名

一般来说,使用 DNS 泛域名不是一个好习惯,因为它们太容易被误用了。但它们有时会很有用,比如在你的局域网的严密保护之下的时候。一个例子是使用 DNS 泛域名会让 Kubernetes 集群变得容易管理许多,除非你喜欢给你成百上千的应用写 DNS 记录。假设你的 Kubernetes 域名是 mehxample.com,那么下面这行配置可以让 Dnsmasq 解析所有对 mehxample.com 的请求:

address=/mehxample.com/192.168.0.5

这里使用的地址是你的集群的公网 IP 地址。这会响应对 mehxample.com 的所有主机名和子域名的请求,除非请求的目标地址已经在 DHCP 或者 /etc/hosts 中配置过。

下星期我们将探索更多的管理 DNS 和 DHCP 的细节,包括对不同的子网络使用不同的设置,以及提供权威域名服务器。

更多参考


via: https://www.linux.com/learn/intro-to-linux/2018/2/advanced-dnsmasq-tips-and-tricks

作者:CARLA SCHRODER 译者:yixunx 校对:wxy

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

如果你的数据中心全是 Linux 服务器,而你就是系统管理员。那么你的其中一项工作内容就是查看服务器的日志文件。但是,如果你在大量的机器上去查看日志文件,那么意味着你需要挨个去登入到机器中来阅读日志文件。如果你管理的机器很多,仅这项工作就可以花费你一天的时间。

另外的选择是,你可以配置一台单独的 Linux 机器去收集这些日志。这将使你的每日工作更加高效。要实现这个目的,有很多的不同系统可供你选择,而 syslog-ng 就是其中之一。

syslog-ng 的不足是文档并不容易梳理。但是,我已经解决了这个问题,我可以通过这种方法马上进行安装和配置 syslog-ng。下面我将在 Ubuntu Server 16.04 上示范这两种方法:

  • UBUNTUSERVERVM 的 IP 地址是 192.168.1.118 ,将配置为日志收集器
  • UBUNTUSERVERVM2 将配置为一个客户端,发送日志文件到收集器

现在我们来开始安装和配置。

安装

安装很简单。为了尽可能容易,我将从标准仓库安装。打开一个终端窗口,运行如下命令:

sudo apt install syslog-ng

你必须在收集器和客户端的机器上都要运行上面的命令。安装完成之后,你将开始配置。

配置收集器

现在,我们开始日志收集器的配置。它的配置文件是 /etc/syslog-ng/syslog-ng.conf。syslog-ng 安装完成时就已经包含了一个配置文件。我们不使用这个默认的配置文件,可以使用 mv /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.BAK 将这个自带的默认配置文件重命名。现在使用 sudo nano /etc/syslog/syslog-ng.conf 命令创建一个新的配置文件。在这个文件中添加如下的行:

@version: 3.5
@include "scl.conf"
@include "`scl-root`/system/tty10.conf"
    options {
        time-reap(30);
        mark-freq(10);
        keep-hostname(yes);
        };
    source s_local { system(); internal(); };
    source s_network {
        syslog(transport(tcp) port(514));
        };
    destination d_local {
    file("/var/log/syslog-ng/messages_${HOST}"); };
    destination d_logs {
        file(
            "/var/log/syslog-ng/logs.txt"
            owner("root")
            group("root")
            perm(0777)
            ); };
    log { source(s_local); source(s_network); destination(d_logs); };

需要注意的是,syslog-ng 使用 514 端口,你需要确保在你的网络上它可以被访问。

保存并关闭这个文件。上面的配置将转存期望的日志文件(由 system()internal() 指出)到 /var/log/syslog-ng/logs.txt 中。因此,你需要使用如下的命令去创建所需的目录和文件:

sudo mkdir /var/log/syslog-ng
sudo touch /var/log/syslog-ng/logs.txt

使用如下的命令启动和启用 syslog-ng:

sudo systemctl start syslog-ng
sudo systemctl enable syslog-ng

配置客户端

我们将在客户端上做同样的事情(移动默认配置文件并创建新配置文件)。拷贝下列文本到新的客户端配置文件中:

@version: 3.5
@include "scl.conf"
@include "`scl-root`/system/tty10.conf"
source s_local { system(); internal(); };
destination d_syslog_tcp {
              syslog("192.168.1.118" transport("tcp") port(514)); };
log { source(s_local);destination(d_syslog_tcp); };

请注意:请将 IP 地址修改为收集器的 IP 地址。

保存和关闭这个文件。与在配置为收集器的机器上一样的方法启动和启用 syslog-ng。

查看日志文件

回到你的配置为收集器的服务器上,运行这个命令 sudo tail -f /var/log/syslog-ng/logs.txt。你将看到包含了收集器和客户端的日志条目的输出(图 A)。

图 A

恭喜你!syslog-ng 已经正常工作了。你现在可以登入到你的收集器上查看本地机器和远程客户端的日志了。如果你的数据中心有很多 Linux 服务器,在每台服务器上都安装上 syslog-ng 并配置它们作为客户端发送日志到收集器,这样你就不需要登入到每个机器去查看它们的日志了。


via: https://www.techrepublic.com/article/how-to-use-syslog-ng-to-collect-logs-from-remote-linux-machines/

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

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

sar 命令用用收集、报告、或者保存 UNIX / Linux 系统的活动信息。它保存选择的计数器到操作系统的 /var/log/sa/sadd 文件中。从收集的数据中,你可以得到许多关于你的服务器的信息:

  1. CPU 使用率
  2. 内存页面和使用率
  3. 网络 I/O 和传输统计
  4. 进程创建活动
  5. 所有的块设备活动
  6. 每秒中断数等等

sar 命令的输出能够用于识别服务器瓶颈。但是,分析 sar 命令提供的信息可能比较困难,所以要使用 kSar 工具。kSar 工具可以将 sar 命令的输出绘制成基于时间周期的、易于理解的图表。

sysstat 包

sarsa1、和 sa2 命令都是 sysstat 包的一部分。它是 Linux 包含的性能监视工具集合。

  1. sar:显示数据
  2. sa1sa2:收集和保存数据用于以后分析。sa2 shell 脚本在 /var/log/sa 目录中每日写入一个报告。sa1 shell 脚本将每日的系统活动信息以二进制数据的形式写入到文件中。
  3. sadc —— 系统活动数据收集器。你可以通过修改 sa1sa2 脚本去配置各种选项。它们位于以下的目录:

    • /usr/lib64/sa/sa1 (64 位)或者 /usr/lib/sa/sa1 (32 位) —— 它调用 sadc 去记录报告到 /var/log/sa/sadX 格式。
    • /usr/lib64/sa/sa2 (64 位)或者 /usr/lib/sa/sa2 (32 位) —— 它调用 sar 去记录报告到 /var/log/sa/sarX 格式。

如何在我的系统上安装 sar?

在一个基于 CentOS/RHEL 的系统上,输入如下的 yum 命令 去安装 sysstat:

# yum install sysstat

示例输出如下:

Loaded plugins: downloadonly, fastestmirror, priorities,
              : protectbase, security
Loading mirror speeds from cached hostfile
 * addons: mirror.cs.vt.edu
 * base: mirror.ash.fastserv.com
 * epel: serverbeach1.fedoraproject.org
 * extras: mirror.cogentco.com
 * updates: centos.mirror.nac.net
0 packages excluded due to repository protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package sysstat.x86_64 0:7.0.2-3.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

====================================================================
 Package        Arch          Version             Repository   Size
====================================================================
Installing:
 sysstat        x86_64        7.0.2-3.el5         base        173 k

Transaction Summary
====================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 173 k
Is this ok [y/N]: y
Downloading Packages:
sysstat-7.0.2-3.el5.x86_64.rpm               | 173 kB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : sysstat                                      1/1

Installed:
  sysstat.x86_64 0:7.0.2-3.el5

Complete!

为 sysstat 配置文件

编辑 /etc/sysconfig/sysstat 文件去指定日志文件保存多少天(最长为一个月):

# vi /etc/sysconfig/sysstat

示例输出如下 :

# keep log for 28 days
# the default is 7
HISTORY=28

保存并关闭这个文件。

找到 sar 默认的 cron 作业

默认的 cron 作业位于 /etc/cron.d/sysstat

# cat /etc/cron.d/sysstat

示例输出如下:

# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

告诉 sadc 去报告磁盘的统计数据

使用一个文本编辑器去编辑 /etc/cron.d/sysstat 文件,比如使用 vim 命令,输入如下:

# vi /etc/cron.d/sysstat

像下面的示例那样更新这个文件,以记录所有的硬盘统计数据(-d 选项强制记录每个块设备的统计数据,而 -I 选项强制记录所有系统中断的统计数据):

# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 -I -d 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A 

在 CentOS/RHEL 7.x 系统上你需要传递 -S DISK 选项去收集块设备的数据。传递 -S XALL 选项去采集如下所列的数据:

  1. 磁盘
  2. 分区
  3. 系统中断
  4. SNMP
  5. IPv6
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 -S DISK 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
# Run system activity accounting tool every 10 minutes

保存并关闭这个文件。

打开 CentOS/RHEL 版本 5.x/6.x 的服务

输入如下命令:

chkconfig sysstat on
service sysstat start

示例输出如下:

Calling the system activity data collector (sadc):

对于 CentOS/RHEL 7.x,运行如下的命令:

# systemctl enable sysstat
# systemctl start sysstat.service
# systemctl status sysstat.service 

示例输出:

● sysstat.service - Resets System Activity Logs
   Loaded: loaded (/usr/lib/systemd/system/sysstat.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2018-01-06 16:33:19 IST; 3s ago
  Process: 28297 ExecStart=/usr/lib64/sa/sa1 --boot (code=exited, status=0/SUCCESS)
 Main PID: 28297 (code=exited, status=0/SUCCESS)

Jan 06 16:33:19 centos7-box systemd[1]: Starting Resets System Activity Logs...
Jan 06 16:33:19 centos7-box systemd[1]: Started Resets System Activity Logs.

如何使用 sar?如何查看统计数据?

使用 sar 命令去显示操作系统中选定的累积活动计数器输出。在这个示例中,运行 sar 命令行,去实时获得 CPU 使用率的报告:

# sar -u 3 10

示例输出:

Linux 2.6.18-164.2.1.el5 (www-03.nixcraft.in)   12/14/2009

09:49:47 PM CPU %user %nice %system %iowait %steal %idle
09:49:50 PM all 5.66 0.00 1.22 0.04 0.00 93.08
09:49:53 PM all 12.29 0.00 1.93 0.04 0.00 85.74
09:49:56 PM all 9.30 0.00 1.61 0.00 0.00 89.10
09:49:59 PM all 10.86 0.00 1.51 0.04 0.00 87.58
09:50:02 PM all 14.21 0.00 3.27 0.04 0.00 82.47
09:50:05 PM all 13.98 0.00 4.04 0.04 0.00 81.93
09:50:08 PM all 6.60 6.89 1.26 0.00 0.00 85.25
09:50:11 PM all 7.25 0.00 1.55 0.04 0.00 91.15
09:50:14 PM all 6.61 0.00 1.09 0.00 0.00 92.31
09:50:17 PM all 5.71 0.00 0.96 0.00 0.00 93.33
Average: all 9.24 0.69 1.84 0.03 0.00 88.20

其中:

  • 3 表示间隔时间
  • 10 表示次数

查看进程创建的统计数据,输入:

# sar -c 3 10

查看 I/O 和传输率统计数据,输入:

# sar -b 3 10

查看内存页面统计数据,输入:

# sar -B 3 10

查看块设备统计数据,输入:

# sar -d 3 10

查看所有中断的统计数据,输入:

# sar -I XALL 3 10

查看网络设备特定的统计数据,输入:

# sar -n DEV 3 10
# sar -n EDEV 3 10

查看 CPU 特定的统计数据,输入:

# sar -P ALL
# Only 1st CPU stats
# sar -P 1 3 10 

查看队列长度和平均负载的统计数据,输入:

# sar -q 3 10

查看内存和交换空间的使用统计数据,输入:

# sar -r 3 10
# sar -R 3 10

查看 inode、文件、和其它内核表统计数据状态,输入:

# sar -v 3 10

查看系统切换活动统计数据,输入:

# sar -w 3 10

查看交换统计数据,输入:

# sar -W 3 10

查看一个 PID 为 3256 的 Apache 进程,输入:

# sar -x 3256 3 10

kSar 介绍

sarsadf 提供了基于命令行界面的输出。这种输出可能会使新手用户/系统管理员感到无从下手。因此,你需要使用 kSar,它是一个图形化显示你的 sar 数据的 Java 应用程序。它也允许你以 PDF/JPG/PNG/CSV 格式导出数据。你可以用三种方式去加载数据:本地文件、运行本地命令、以及通过 SSH 远程运行的命令。kSar 可以处理下列操作系统的 sar 输出:

  1. Solaris 8, 9 和 10
  2. Mac OS/X 10.4+
  3. Linux (Systat Version >= 5.0.5)
  4. AIX (4.3 & 5.3)
  5. HPUX 11.00+

下载和安装 kSar

访问 官方 网站去获得最新版本的源代码。使用 wget 去下载源代码,输入:

$ wget https://github.com/vlsi/ksar/releases/download/v5.2.4-snapshot-652bf16/ksar-5.2.4-SNAPSHOT-all.jar

如何运行 kSar?

首先要确保你的机器上 JAVA jdk 已安装并能够正常工作。输入下列命令去启动 kSar:

$ java -jar ksar-5.2.4-SNAPSHOT-all.jar

 title=

接下来你将看到 kSar 的主窗口,和有两个菜单的面板。

 title=

左侧有一个列表,是 kSar 根据数据已经解析出的可用图表的列表。右侧窗口将展示你选定的图表。

如何使用 kSar 去生成 sar 图表?

首先,你需要从命名为 server1 的服务器上采集 sar 命令的统计数据。输入如下的命令:

[ server1 ]# LC_ALL=C sar -A  > /tmp/sar.data.txt

接下来,使用 scp 命令从本地桌面拷贝到远程电脑上:

[ desktop ]$ scp [email protected]:/tmp/sar.data.txt /tmp/

切换到 kSar 窗口,点击 “Data” > “Load data from text file” > 从 /tmp/ 中选择 sar.data.txt > 点击 “Open” 按钮。

现在,图表类型树已经出现在左侧面板中并选定了一个图形:

 title=

 title=

 title=

放大和缩小

通过移动你可以交互式缩放图像的一部分。在要缩放的图像的左上角点击并按下鼠标,移动到要缩放区域的右下角,可以选定要缩放的区域。返回到未缩放状态,点击并拖动鼠标到除了右下角外的任意位置,你也可以点击并选择 zoom 选项。

了解 kSar 图像和 sar 数据

我强烈建议你去阅读 sarsadf 命令的 man 页面:

$ man sar
$ man sadf

案例学习:识别 Linux 服务器的 CPU 瓶颈

使用 sar 命令和 kSar 工具,可以得到内存、CPU、以及其它子系统的详细快照。例如,如果 CPU 使用率在一个很长的时间内持续高于 80%,有可能就是出现了一个 CPU 瓶颈。使用 sar -x ALL 你可以找到大量消耗 CPU 的进程。

mpstat 命令 的输出(sysstat 包的一部分)也会帮你去了解 CPU 的使用率。但你可以使用 kSar 很容易地去分析这些信息。

找出 CPU 瓶颈后 …

对 CPU 执行如下的调整:

  1. 确保没有不需要的进程在后台运行。关闭 Linux 上所有不需要的服务
  2. 使用 cron 在一个非高峰时刻运行任务(比如,备份)。
  3. 使用 top 和 ps 命令 去找出所有非关键的后台作业/服务。使用 renice 命令 去调整低优先级作业。
  4. 使用 taskset 命令去设置进程使用的 CPU (卸载所使用的 CPU),即,绑定进程到不同的 CPU 上。例如,在 2# CPU 上运行 MySQL 数据库,而在 3# CPU 上运行 Apache。
  5. 确保你的系统使用了最新的驱动程序和固件。
  6. 如有可能在系统上增加额外的 CPU。
  7. 为单线程应用程序使用更快的 CPU(比如,Lighttpd web 服务器应用程序)。
  8. 为多线程应用程序使用多个 CPU(比如,MySQL 数据库服务器应用程序)。
  9. 为一个 web 应用程序使用多个计算节点并设置一个 负载均衡器

isag —— 交互式系统活动记录器(替代工具)

isag 命令图形化显示了以前运行 sar 命令时存储在二进制文件中的系统活动数据。isag 命令引用 sar 并提取出它的数据来绘制图形。与 kSar 相比,isag 的选项比较少。

 title=

关于作者

本文作者是 nixCraft 的创始人和一位经验丰富的 Linux 操作系统/Unix shell 脚本培训师。他与包括 IT、教育、国防和空间研究、以及非营利组织等全球各行业客户一起合作。可以在 TwitterFacebookGoogle+ 上关注他。


via: https://www.cyberciti.biz/tips/identifying-linux-bottlenecks-sar-graphs-with-ksar.html

作者:Vivek Gite 译者:qhwdw 校对:wxy

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

我想使用 Ansible 工具创建 Amazon EC2 密钥对。不想使用 AWS CLI 来创建。可以使用 Ansible 来创建 AWS ec2 密钥吗?

你需要使用 Ansible 的 ec2\_key 模块。这个模块依赖于 python-boto 2.5 版本或者更高版本。 boto 是亚马逊 Web 服务的一个 Python API。你可以将 boto 用于 Amazon S3、Amazon EC2 等其他服务。简而言之,你需要安装 Ansible 和 boto 模块。我们一起来看下如何安装 boto 并结合 Ansible 使用。

第一步 - 在 Ubuntu 上安装最新版本的 Ansible

你必须给你的系统配置 PPA 来安装最新版的 Ansible。为了管理你从各种 PPA(Personal Package Archives)安装软件的仓库,你可以上传 Ubuntu 源码包并编译,然后通过 Launchpad 以 apt 仓库的形式发布。键入如下命令 apt-get 命令或者 apt 命令

$ sudo apt update 
$ sudo apt upgrade 
$ sudo apt install software-properties-common

接下来给你的系统的软件源中添加 ppa:ansible/ansible

$ sudo apt-add-repository ppa:ansible/ansible

更新你的仓库并安装 Ansible:

$ sudo apt update 
$ sudo apt install ansible

安装 boto:

$ pip3 install boto3

关于在CentOS/RHEL 7.x上安装 Ansible 的注意事项

需要在 CentOS 和 RHEL 7.x 上配置 EPEL 源yum命令

$ cd /tmp 
$ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
$ ls *.rpm 
$ sudo yum install epel-release-latest-7.noarch.rpm 
$ sudo yum install ansible

安装 boto:

$ pip install boto3

第二步 2 – 配置 boto

你需要配置 AWS credentials/API 密钥。参考 “AWS Security Credentials” 文档如何创建 API key。用 mkdir 命令创建一个名为 ~/.aws 的目录,然后配置 API key:

$ mkdir -pv ~/.aws/ 
$ vi ~/.aws/credentials
[default]
aws_access_key_id = YOUR-ACCESS-KEY-HERE
aws_secret_access_key = YOUR-SECRET-ACCESS-KEY-HERE

还需要配置默认 AWS 区域

$ vi ~/.aws/config

输出样例如下:

[default]
region = us-west-1

通过创建一个简单的名为 test-boto.py 的 Python 程序来测试你的 boto 配置是否正确:

#!/usr/bin/python3
# A simple program to test boto and print s3 bucket names
import boto3
t = boto3.resource('s3')
for b in t.buckets.all():
 print(b.name)

按下面方式来运行该程序:

$ python3 test-boto.py

输出样例:

nixcraft-images
nixcraft-backups-cbz
nixcraft-backups-forum

上面输出可以确定 Python-boto 可以使用 AWS API 正常工作。

步骤 3 - 使用 Ansible 创建 AWS ec2 密钥

创建一个名为 ec2.key.yml 的剧本,如下所示:

---
- hosts: local
  connection: local
  gather_facts: no
  tasks:
 
 - name: Create a new EC2 key
   ec2_key:
   name: nixcraft-key
   region: us-west-1
   register: ec2_key_result
 
 - name: Save private key
   copy: content="{{ ec2_key_result.key.private_key }}" dest="./aws.nixcraft.pem" mode=0600
   when: ec2_key_result.changed

其中,

  • ec2_key: – ec2 密钥对。
  • name: nixcraft_key – 密钥对的名称。
  • region: us-west-1 – 使用的 AWS 区域。
  • register: ec2_key_result – 保存生成的密钥到 ec2keyresult 变量。
  • copy: content="{{ ec2_key_result.key.private_key }}" dest="./aws.nixcraft.pem" mode=0600 – 将 ec2_key_result.key.private_key 的内容保存到当前目录的一个名为 aws.nixcraft.pem 的文件中。设置该文件的权限为 0600 (unix 文件权限)。
  • when: ec2_key_result.changed – 仅仅在 ec2_key_result 改变时才保存。我们不想覆盖你的密钥文件。

你还必须创建如下 hosts 文件:

[local]
localhost

如下运行你的剧本:

$ ansible-playbook -i hosts ec2.key.yml

最后你应该有一个名为 `aws.nixcraft.pem 私钥,该私钥可以和 AWS EC2 一起使用。使用 cat 命令查看你的密钥:

$ cat aws.nixcraft.pem

如果你有 EC2 虚拟机,请按如下方式使用:

$ ssh -i aws.nixcraft.pem user@ec2-vm-dns-name

查看有关 python 数据结构变量名的信息,比如 ec2keyresult.changed 和 ec2keyresult.key.private\_key

你一定在想我是如何使用变量名的,比如 ec2_key_result.changedec2_key_result.key.private_key。它们在哪里定义过吗?变量的值是通过 API 调用返回的。简单地使用 -v 选项运行 ansible-playbook 命令来查看这样的信息:

$ ansible-playbook -v -i hosts ec2.key.yml

我该如何删除一个密钥?

使用如下 ec2-key-delete.yml

---
- hosts: local
  connection: local
  gather_facts: no
  tasks:
 
 - name: Delete a EC2 key
   ec2_key:
   name: nixcraft-key
   region: us-west-1
# absent means delete keypair
   state: absent

按照如下方式运行:

$ ansible-playbook -i hosts ec2-key-delete.yml

关于作者

作者是 nixCraft 的创始人,是一个经验丰富的系统管理员,DevOps 工程师,同时是一个 Linux 操作系统/Unix shell 脚本培训师。通过 RSS/XML 提要每周邮件简讯获得关于系统管理,Linux/Unix和开放源码主题的最新教程。


via: https://www.cyberciti.biz/faq/how-to-create-aws-ec2-key-using-ansible/

作者:Vivek Gite 译者:qianghaohao 校对:wxy

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

Telnet,是系统管理员登录远程服务器的一种协议和工具。然而,由于所有的通信都没有加密,包括密码,都是明文发送的。Telnet 在 SSH 被开发出来之后就基本弃用了。

登录远程服务器,你可能不会也从未考虑过它。但这并不意味着 telnet 命令在调试远程连接问题时不是一个实用的工具。

本教程中,我们将探索使用 telnet 解决所有常见问题:“我怎么又连不上啦?”

这种讨厌的问题通常会在安装了像 Web服务器、邮件服务器、ssh 服务器、Samba 服务器等诸如此类的事之后遇到,用户无法连接服务器。

telnet 不会解决问题但可以很快缩小问题的范围。

telnet 用来调试网络问题的简单命令和语法:

telnet <hostname or IP> <port>

因为 telnet 最初通过端口建立连接不会发送任何数据,适用于任何协议,包括加密协议。

连接问题服务器有四个可能会遇到的主要问题。我们会研究这四个问题,研究它们意味着什么以及如何解决。

本教程默认已经在 samba.example.com 安装了 Samba 服务器而且本地客户无法连上服务器。

Error 1 - 连接挂起

首先,我们需要试着用 telnet 连接 Samba 服务器。使用下列命令 (Samba 监听端口445):

telnet samba.example.com 445

有时连接会莫名停止:

telnet samba.example.com 445
Trying 172.31.25.31...

这意味着 telnet 没有收到任何回应来建立连接。有两个可能的原因:

  1. 你和服务器之间有个路由器宕掉了。
  2. 防火墙拦截了你的请求。

为了排除第 1 点,对服务器上进行一个快速 mtr samba.example.com 。如果服务器是可达的,那么便是防火墙(注意:防火墙总是存在的)。

首先用 iptables -L -v -n 命令检查服务器本身有没有防火墙,没有的话你能看到以下内容:

iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

如果你看到其他东西那可能就是问题所在了。为了检验,停止 iptables 一下并再次运行 telnet samba.example.com 445 看看你是否能连接。如果你还是不能连接看看你的提供商或企业有没有防火墙拦截你。

Error 2 - DNS 问题

DNS 问题通常发生在你正使用的主机名没有解析到 IP 地址。错误如下:

telnet samba.example.com 445
Server lookup failure: samba.example.com:445, Name or service not known

第一步是把主机名替换成服务器的 IP 地址。如果你可以连上那么就是主机名的问题。

有很多发生的原因(以下是我见过的):

  1. 域名注册了吗?用 whois 来检验。
  2. 域名过期了吗?用 whois 来检验。
  3. 是否使用正确的主机名?用 dighost 来确保你使用的主机名解析到正确的 IP。
  4. 你的 A 记录正确吗?确保你没有偶然创建类似 smaba.example.comA 记录。

一定要多检查几次拼写和主机名是否正确(是 samba.example.com 还是 samba1.example.com)?这些经常会困扰你,特别是比较长、难记或其它国家的主机名。

Error 3 - 服务器没有侦听端口

这种错误发生在 telnet 可达服务器但是指定端口没有监听。就像这样:

telnet samba.example.com 445
Trying 172.31.25.31...
telnet: Unable to connect to remote host: Connection refused

有这些原因:

  1. 确定 连接的是正确的服务器?
  2. 你的应用服务器没有侦听预期的端口。在服务器上运行 netstat -plunt 来查看它究竟在干什么并看哪个端口才是对的,实际正在监听中的。
  3. 应用服务器没有运行。这可能突然而又悄悄地发生在你启动应用服务器之后。启动服务器运行 ps auxfsystemctl status application.service 查看运行。

Error 4 - 连接被服务器关闭

这种错误发生在连接成功建立但是应用服务器建立的安全措施一连上就将其结束。错误如下:

telnet samba.example.com 445
Trying 172.31.25.31...
Connected to samba.example.com.
Escape character is '^]'.
Connection closed by foreign host.

最后一行 Connection closed by foreign host. 意味着连接被服务器主动终止。为了修复这个问题,需要看看应用服务器的安全设置确保你的 IP 或用户允许连接。

成功连接

成功的 telnet 连接如下:

telnet samba.example.com 445
Trying 172.31.25.31...
Connected to samba.example.com.
Escape character is '^]'.

连接会保持一段时间只要你连接的应用服务器时限没到。

输入 CTRL+] 中止连接,然后当你看到 telnet> 提示,输入 quit 并按回车:

telnet samba.example.com 445
Trying 172.31.25.31...
Connected to samba.example.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.

总结

客户程序连不上服务器的原因有很多。确切原因很难确定,特别是当客户是图形用户界面提供很少或没有错误信息。用 telnet 并观察输出可以让你很快确定问题所在节约很多时间。


via: https://bash-prompt.net/guides/telnet/

作者:Elliot Cooper 译者:XYenChi 校对:wxy

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