Tag Archive: linux

三月 31st, 2018

最重要的公共服务之一就是报时timekeeping,但是很多人并没有意识到这一点。大多数公共时间服务器都是由志愿者管理,以满足不断增长的需求。这里学习一下如何运行你自己的时间服务器,为基础公共利益做贡献。

著名的时间服务器滥用事件

就像现实生活中任何一件事情一样,即便是像时间服务器这样的公益项目,也会遭受不称职的或者恶意的滥用。

消费类网络设备的供应商因制造了大混乱而臭名昭著。我回想起的第一件事发生在 2003 年,那时,NetGear 在它们的路由器中硬编码了威斯康星大学的 NTP 时间服务器地址。使得时间服务器的查询请求突然增加,随着 NetGear 卖出越来越多的路由器,这种情况越发严重。更有意思的是,路由器的程序设置是每秒钟发送一次请求,这将使服务器难堪重负。后来 Netgear 发布了升级固件,但是,升级他们的设备的用户很少,并且他们的其中一些用户的设备,到今天为止,还在不停地每秒钟查询一次威斯康星大学的 NTP 服务器。Netgear 给威斯康星大学捐献了一些钱,以帮助弥补他们带来的成本增加,直到这些路由器全部淘汰。类似的事件还有 D-Link、Snapchat、TP-Link 等等。

对 NTP 协议进行反射和放大,已经成为发起 DDoS 攻击的一个选择。当攻击者使用一个伪造的目标受害者的源地址向时间服务器发送请求,称为反射攻击;攻击者发送请求到多个服务器,这些服务器将回复请求,这样就使伪造的源地址受到轰炸。放大攻击是指一个很小的请求收到大量的回复信息。例如,在 Linux 上,ntpq 命令是一个查询你的 NTP 服务器并验证它们的系统时间是否正确的很有用的工具。一些回复,比如,对端列表,是非常大的。组合使用反射和放大,攻击者可以将 10 倍甚至更多带宽的数据量发送到被攻击者。

那么,如何保护提供公益服务的公共 NTP 服务器呢?从使用 NTP 4.2.7p26 或者更新的版本开始,它们可以帮助你的 Linux 发行版不会发生前面所说的这种问题,因为它们都是在 2010 年以后发布的。这个发行版都默认禁用了最常见的滥用攻击。目前,最新版本是 4.2.8p10,它发布于 2017 年。

你可以采用的另一个措施是,在你的网络上启用入站和出站过滤器。阻塞宣称来自你的网络的数据包进入你的网络,以及拦截发送到伪造返回地址的出站数据包。入站过滤器可以帮助你,而出站过滤器则帮助你和其他人。阅读 BCP38.info 了解更多信息。

层级为 0、1、2 的时间服务器

NTP 有超过 30 年的历史了,它是至今还在使用的最老的因特网协议之一。它的用途是保持计算机与世界标准时间(UTC)的同步。NTP 网络是分层组织的,并且同层的设备是对等的。层次Stratum 0 包含主报时设备,比如,原子钟。层级 1 的时间服务器与层级 0 的设备同步。层级 2 的设备与层级 1 的设备同步,层级 3 的设备与层级 2 的设备同步。NTP 协议支持 16 个层级,现实中并没有使用那么多的层级。同一个层级的服务器是相互对等的。

过去很长一段时间内,我们都为客户端选择配置单一的 NTP 服务器,而现在更好的做法是使用 NTP 服务器地址池,它使用轮询的 DNS 信息去共享负载。池地址只是为客户端服务的,比如单一的 PC 和你的本地局域网 NTP 服务器。当你运行一台自己的公共服务器时,你不用使用这些池地址。

公共 NTP 服务器配置

运行一台公共 NTP 服务器只有两步:设置你的服务器,然后申请加入到 NTP 服务器池。运行一台公共的 NTP 服务器是一种很高尚的行为,但是你得先知道这意味着什么。加入 NTP 服务器池是一种长期责任,因为即使你加入服务器池后,运行了很短的时间马上退出,然后接下来的很多年你仍然会接收到请求。

你需要一个静态的公共 IP 地址,一个至少 512Kb/s 带宽的、可靠的、持久的因特网连接。NTP 使用的是 UDP 的 123 端口。它对机器本身要求并不高,很多管理员在其它的面向公共的服务器(比如,Web 服务器)上顺带架设了 NTP 服务。

配置一台公共的 NTP 服务器与配置一台用于局域网的 NTP 服务器是一样的,只需要几个配置。我们从阅读 协议规则 开始。遵守规则并注意你的行为;几乎每个时间服务器的维护者都是像你这样的志愿者。然后,从 StratumTwoTimeServers中选择 4 到 7 个层级 2 的上游服务器。选择的时候,选取地理位置上靠近(小于 300 英里的)你的因特网服务提供商的上游服务器,阅读他们的访问规则,然后,使用 ping 和 mtr 去找到延迟和跳数最小的服务器。

以下的 /etc/ntp.conf 配置示例文件,包括了 IPv4 和 IPv6,以及基本的安全防护:

# stratum 2 server list
server servername_1 iburst
server servername_2 iburst
server servername_3 iburst
server servername_4 iburst
server servername_5 iburst
# access restrictions
restrict -4default kod noquery nomodify notrap nopeer limited
restrict -6default kod noquery nomodify notrap nopeer limited
#Allow ntpq and ntpdc queries only from localhost
restrict 127.0.0.1
restrict ::1

启动你的 NTP 服务器,让它运行几分钟,然后测试它对远程服务器的查询:

$ ntpq -p
remote refid st t when poll reach delay offset jitter
=================================================================
+tock.no-such-ag 200.98.196.2122 u 3664798.65488.43965.123
+PBX.cytranet.ne 45.33.84.2083 u 3764772.419113.535129.313
*eterna.binary.n 199.102.46.702 u 3964792.93398.47556.778
+time.mclarkdev.132.236.56.2503 u 37645111.05988.02974.919

目前表现很好。现在从另一台 PC 上使用你的 NTP 服务器名字进行测试。以下的示例是一个正确的输出。如果有不正确的地方,你将看到一些错误信息。

$ ntpdate -q yourservername
server 66.96.99.10, stratum 2, offset 0.017690, delay 0.12794
server 98.191.213.2, stratum 1, offset 0.014798, delay 0.22887
server 173.49.198.27, stratum 2, offset 0.020665, delay 0.15012
server 129.6.15.28, stratum 1, offset -0.018846, delay 0.20966
26Jan11:13:54 ntpdate[17293]: adjust time server 98.191.213.2 offset 0.014798 sec

一旦你的服务器运行的很好,你就可以向 manage.ntppool.org 申请加入池中。

查看官方的手册 分布式网络时间服务器(NTP) 学习所有的命令、配置选项、以及高级特性,比如,管理、查询、和验证。访问以下的站点学习关于运行一台时间服务器所需要的一切东西。

TAGS:
二月 16th, 2018

今天我们来谈谈Linux的内存机制。

首先我们理一下概念

一、什么是linux的内存机制?

我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。

物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

要深入了解linux内存运行机制,需要知道下面提到的几个方面:

  1. Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。
  2. Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟 内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需 要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面 文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不 用担心什么,只要知道是怎么一回事就可以了。
  3. 交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页 面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽 然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。

因此,合理规划和设计Linux内存的使用,是非常重要的.

在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写 数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性 能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种情况下,Linux引入了buffers和 cached机制。

buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers 与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操 作系统的性能。但buffers与cached缓冲的内容却是不同的。

buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。

为了验证我们的结论是否正确,可以通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同,是不是第二次打开的速度明显快于第一次呢?
接着执行下面的命令:

find /* -name  *.conf

看看buffers的值是否变化,然后重复执行find命令,看看两次显示速度有何不同。

 

 

二、linux什么时候开始使用虚拟内存(swap)?

A.[root@wenwen ~]# cat /proc/sys/vm/swappiness

60

上面这个60代表物理内存在使用60%的时候才会使用swap

swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,

swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

通常情况下:

swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。

B.修改swappiness参数

临时性修改:

[root@wenwen ~]# sysctl vm.swappiness=10

vm.swappiness = 10

[root@wenwen ~]# cat /proc/sys/vm/swappiness

10

 

永久性修改:

[root@wenwen ~]# vim /etc/sysctl.conf

加入参数:

vm.swappiness = 35

然后在直接:

[root@wenwen ~]# sysctl -p

查看是否生效:

cat /proc/sys/vm/swappiness

35

 

 

 

三、怎么释放内存?

一般系统是不会自动释放内存的

关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:

0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存

实操:

 

wKiom1kIfqfCWjMwAABa_PWXhZ8253.png-wh_50

很明显多出来很多空闲的内存了吧

 

 

四、怎么释放swap?

前提:首先要保证内存剩余要大于等于swap使用量,否则会宕机!根据内存机制,swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上。通常通过重新挂载swap分区完成释放swap。

a.查看当前swap分区挂载在哪?

wKioL1kIg_-QgRPNAAAc0YY8hDs713.png-wh_50

b.关停这个分区

wKiom1kIhCjzKPz0AAAJ4nqUEqM343.png-wh_50

c.查看状态:

wKioL1kIhEuQnJNsAAARrgqCj1I720.png-wh_50

d.查看swap分区是否关停,最下面一行显示全0wKioL1kIhGPAeVG_AAAmRTAqcso981.png-wh_50

e.将swap挂载到/dev/sda5上

wKiom1kIhL-DWuyLAAAJq9dwCWk401.png-wh_50

f.查看挂载是否成功

wKioL1kIhJKAttdNAAAbWQ1IwjE929.png-wh_50

 

 

五、一些实际的小例子?

我在设置mysql的时候,将

my.cnf文件

innodb_buffer_pool_size = 6G(我操作系统的内存就是6G,一般这个值设置为操作系统内存的80%)

这个值并不是设置的越大越好。设置的过大,会导致system的swap空间被占用,导致操作系统变慢,从而减低sql查询的效率。

这里你可以这么理解,当我将这个buffer_pool_size设置得过大,跟操作系统内存一样大的时候,我使用mysql,会在一段时间内调用大量的数据进内存,由于linux的内存机制,再根据最近最优的原则,将一部分数据筛选放入swap分区,而swap分区没有及时的清理掉数据,当再次调用其它数据的时候,又会将一部分数据筛选放入swap分区,可能会出现一个现象,就是物理内存还有剩余,甚至是空的,而swap分区却是满的。

TAGS: ,
一月 27th, 2018

1. 磁盘满了

如果一台机器磁盘满了,首先我们需要确定其位置,命令为

 df(或者df -h//显示结果
Filesystem    512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2   488555536 124047536 363996000    26% 15569940 45499500   25%   /
devfs                361       361         0   100%      626        0  100%   /dev
map -hosts             0         0         0   100%        0        0  100%   /net

找到那一块盘满了以后,使用命令du一级一级的查找,确定最大文件。

    du -h --max-depth=1 | grep 'G' | sort -n

如果是日志文件过大需要删除时候,使用日志切割,保留最新日志。

//指定分割后文件行数
split -l 300 largelog newlog
//指定分割后文件大小
 split -b 10m largelog newlog

2. 负载过高

使用uptime命令查看机器负载。

uptime
//输出
up 1 day, 23:14, 2 users, load averages: 1.69 2.21 2.09

平均负载表示1、5、15分钟进程队列中的平均进程数量。一般单核大于3的话负载就算高了。查看linux多少cpu与核的命令如下:

 #查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
#查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

然后使用top命令查看每个进程占用CPU,内存情况。top显示时候使用“M”进程会按内存使用排序,按“P”会按CPU使用排序。

如果没有进程占用大量CPU,内存资源的话,可能就是某个进程阻塞了。使用ps -ef, 看到哪个进程会卡住,然后去/proc/中找到这个进程对应的文件,看是否能正常打开。

找到以后杀死这个进程或者重启机器。

3. can’t lock /etc/passwd;try again later

  1. 首先查看是在/etc下否存在lock文件,
$cd /etc  
$ls *.lock  
$ rm -f *.lock //删除文件锁  
  1. 没有的话,使用df -i看是否 inode满了,如果是  查找每个文件下的文件数目
for i in ./*; do echo $i; find $i | wc -l |sort -n ; done

找到后删除没用的小文件。  建议去/var/spool/postfix/maildrop去看看。

科普一下df -i与df -h,一个是总共能创建多少文件,一个是总共能创建多大的文件。

TAGS:
十二月 31st, 2017

Linux 系统日志非常重要。后台运行的程序(通常被称为守护进程或者服务进程)处理了你 Linux 系统中的大部分任务。当这些守护进程工作时,它们将任务的详细信息记录进日志文件中,作为它们做过什么的“历史”信息。这些守护进程的工作内容涵盖从使用原子钟同步时钟到管理网络连接。所有这些都被记录进日志文件,这样当有错误发生时,你可以通过查阅特定的日志文件来看出发生了什么。

Photo by Markus Spiske on Unsplash

Photo by Markus Spiske on Unsplash

在你的 Linux 计算机上有很多不同的日志。历史上,它们一般以纯文本的格式存储到 /var/log 目录中。现在依然有很多日志这样做,你可以很方便的使用 less 来查看它们。

在新装的 openSUSE Leap 42.3 以及大多数现代操作系统上,重要的日志由 systemd 初始化系统存储。 systemd这套系统负责启动守护进程,并在系统启动时让计算机做好被使用的准备。由 systemd 记录的日志以二进制格式存储,这使得它们消耗的空间更小,更容易被浏览,也更容易被导出成其他各种格式,不过坏处就是你必须使用特定的工具才能查看。好在这个工具已经预安装在你的系统上了:它的名字叫 journalctl,而且默认情况下,它会将每个守护进程的所有日志都记录到一个地方。

只需要运行 journalctl 命令就能查看你的 systemd 日志了。它会用 less 分页器显示各种日志。为了让你有个直观的感受, 下面是 journalctl 中摘录的一条日志记录:

  1. Jul0611:53:47 aaathats3as pulseaudio[2216]:[pulseaudio] alsa-util.c:Disabling timer-based scheduling because running inside a VM.

这条独立的日志记录以此包含了记录的日期和时间、计算机名、记录日志的进程名、记录日志的进程 PID,以及日志内容本身。

若系统中某个程序运行出问题了,则可以查看日志文件并搜索(使用 / 加上要搜索的关键字)程序名称。有可能导致该程序出问题的错误会记录到系统日志中。 有时,错误信息会足够详细到让你能够修复该问题。其他时候,你需要在 Web 上搜索解决方案。 Google 就很适合来搜索奇怪的 Linux 问题。不过搜索时请注意你只输入了日志的实际内容,行首的那些信息(日期、主机名、进程 ID) 对搜索来说是无意义的,会干扰搜索结果。

解决方法一般在搜索结果的前几个连接中就会有了。当然,你不能只是无脑得运行从互联网上找到的那些命令:请一定先搞清楚你要做的事情是什么,它的效果会是什么。据说,搜索系统日志中的特定条目要比直接描述该故障通用关键字要有用的多。因为程序出错有很多原因,而且同样的故障表现也可能由多种问题引发的。

比如,系统无法发声的原因有很多,可能是播放器没有插好,也可能是声音系统出故障了,还可能是缺少合适的驱动程序。如果你只是泛泛的描述故障表现,你会找到很多无关的解决方法,而你也会浪费大量的时间。而专门搜索日志文件中的实际内容,你也许会查询出其它人也有相同日志内容的结果。

你可以对比一下图 1 和图 2。

图 1 搜索系统的故障表现只会显示泛泛的,不精确的结果。这种搜索通常没什么用。

图 2 搜索特定的日志行会显示出精确的,有用的结果。这种搜索通常很有用。

也有一些系统不用 journalctl 来记录日志。在桌面系统中最常见的这类日志包括用于记录 openSUSE 包管理器的行为的 /var/log/zypper.log; 记录系统启动时消息的 /var/log/boot.log ,开机时这类消息往往滚动的特别快,根本看不过来;/var/log/ntp 用来记录 Network Time Protocol (NTP)守护进程同步时间时发生的错误。 另一个存放硬件故障信息的地方是 “Kernel Ring Buffer”(内核环状缓冲区),你可以输入 demesg -H 命令来查看(这条命令也会调用 less 分页器来查看)。“Kernel Ring Buffer” 存储在内存中,因此会在重启电脑后丢失。不过它包含了 Linux 内核中的重要事件,比如新增了硬件、加载了模块,以及奇怪的网络错误.

希望你已经准备好深入了解你的 Linux 系统了! 祝你玩的开心!

TAGS:
十二月 31st, 2017

为了安全起见,我们一般会对上传目录禁止运行php脚本
修改nginx.conf配置文件
禁止单目录:

location ~* ^/attachments/.*.(php|php5)$ {
deny all;
}

禁止多目录:

location ~* ^/(attachments|upload)/.*.(php|php5)$ {
deny all;
}

需要注意两点:
1、以上的配置文件代码需要放到 location ~ .php{…}上面,如果放到下面是无效的
2、attachments需要写相对路径,不能写绝对路径
3、不要忘记重启nginx呀,service nginx restart

TAGS:
十二月 31st, 2017

1. 替换

原字符串:”#abc”

1. 引用自身

php代码:echo preg_replace(‘/./’,’$0′,’#abc’);($0即引用正则里面的全部内容)
输出:’#abc’
linux代码:echo ‘#abc’ | sed ‘/.
/s/.*/&/g’(&即引用正则里面的全部内容)
输出:’#abc’

2. 引用括号里面的内容

php代码:echo preg_replace(‘/(#)./’,’$1′,’#abc’);($1即引用括号里面的内容)
输出:’#’
linux代码:echo ‘#abc’ | sed ‘/(#).
/s/(#).*/\1/g’(\1即引用括号里面的内容)
输出:’#’

TAGS: ,
十二月 28th, 2017

ch /etc/

chmod 644 passwd group shadow

chmod 400 gshadow

cd ssh

chmod 600 moduli ssh_host_dsa_key ssh_host_key ssh_host_rsa_key

chmod 644 ssh_config ssh_host_dsa_key.pub ssh_host_key.pub ssh_host_rsa_key.pub

chmod 640 ssh_config

然后尝试使用ssh登录,正常。

如果使用普通用户登录,使用su – 切换root会出现以下错误:

root “su cannot set groups”

这是因为su必须有s权限才能预读取root的相关配置,需要使用如下命令:

chmod u+x  `which su`

然后就可以进入系统了。

找一台干净的机器,把系统的权限导出,然后在导入本机

在干净的机器上执行:getfacl -R / > ./linux.chmod.bak

在本机上执行:setfacl –restore=/root/linux.chmod.bak

重启服务器使权限生效

TAGS: ,
十一月 30th, 2017

有个Linux的服务器,2G内存的,今天登上去一看,内存竟然被占得满满的。
ssh上去执行了free.

free -m
total        used        free      shared  buff/cache   available
Mem:           2000         182         191           3        1625        1614
Swap:             0           0           0

发现内存全在一个[buff/cache]里.
查询资料得知可以通过proc下的一个文件释放,
以下原文:

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存.操作如下:
[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默认为0
[root@server test]# sync
手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3
将/proc/sys/vm/drop_caches值设为3
[root@server test]# free -m
total used free shared buffers cached
Mem: 249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511
再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了buffer和cache.

根据资料,只需要执行下面2个命令,即可释放:

sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
TAGS: ,
十一月 30th, 2017

了解运行级别是如何配置的,如何改变系统运行级别以及修改对应状态下运行的服务。

在 Linux 系统中,运行级别run level是指运维的级别,用于描述一种表明什么服务是可用的系统运行状态。

运行级别 1 是严格限制的,仅仅用于系统维护;该级别下,网络连接将不可操作,但是管理员可以通过控制台连接登录系统。

其他运行级别的系统允许任何人登录和使用,但是不同级别中可使用的服务不同。本文将探索如何配置运行级别,如何交互式改变系统运行级别以及修改该状态下可用的服务。

Linux 系统的默认运行状态是一个在系统开机时使用的运行级别(除非有其他的指示),它通常是在 /etc/inittab 文件中进行配置的,该文件内容通常如下:

  1. id:3:initdefault

包括 Debian 系统在内的一些系统,默认运行级别为 2,而不是上述文件中的 3,甚至都没有 /etc/inittab 文件。

运行级别在默认情况下是如何被配置,其配置依赖于你所运行的 Linux 操作系统的具体发行版本。 例如,在某些系统中, 运行级别 2 是多用户模式,运行级别 3 是多用户模式并支持 NFS (网络文件系统)。 在另外一些系统,运行级别 2 – 5 基本相同,运行级别 1 是单用户模式。例如,Debian 系统的所用运行级别如下:

  1. 0 = 停机
  2. 1 = 单用户(维护模式)
  3. 2 = 多用户模式
  4. 3-5 = 2 一样
  5. 6 = 重启

在 Linux 系统上,运行级别 3 用于共享文件系统给其它系统,可以方便地只通过改变系统的运行级别来启动和停止文件系统共享。系统从运行级别 2 改变到 3 系统将允许文件系统共享,反之从运行级别 3 改变到 2 则系统不支持文件系统共享。

在某个运行级别中,系统运行哪些进程依赖于目录 /etc/rc?.d 目录的内容,其中 ? 可以是 2、 3、 4 或 5 (对应于相应的运行级别)。

在以下示例中(Ubuntu 系统),由于这些目录的配置是相同的,我们将看见上述 4 个级别对应的目录中的内容是一致的。

  1. /etc/rc2.d$ ls
  2. README S20smartmontools S50saned S99grub-common
  3. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  4. S20rsync S20sysstat S70pppd-dns S99rc.local
  5. /etc/rc2.d$ cd ../rc3.d
  6. /etc/rc3.d$ ls
  7. README S20smartmontools S50saned S99grub-common
  8. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  9. S20rsync S20sysstat S70pppd-dns S99rc.local
  10. /etc/rc3.d$ cd ../rc4.d
  11. /etc/rc4.d$ ls
  12. README S20smartmontools S50saned S99grub-common
  13. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  14. S20rsync S20sysstat S70pppd-dns S99rc.local
  15. /etc/rc4.d$ cd ../rc5.d
  16. /etc/rc5.d$ ls
  17. README S20smartmontools S50saned S99grub-common
  18. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  19. S20rsync S20sysstat S70pppd-dns S99rc.local

这些都是什么文件?它们都是指向 /etc/init.d 目录下用于启动服务的脚本符号连接。 这些文件的文件名是至关重要的, 因为它们决定了这些脚本文件的执行顺序,例如, S20 脚本是在 S50 脚本前面运行的。

  1. $ ls -l
  2. total 4
  3. -rw-r--r-- 1 root root 677 Feb 16 2016 README
  4. lrwxrwxrwx 1 root root 20 Aug 30 14:40 S20kerneloops -> ../init.d/kerneloops
  5. lrwxrwxrwx 1 root root 15 Aug 30 14:40 S20rsync -> ../init.d/rsync
  6. lrwxrwxrwx 1 root root 23 Aug 30 16:10 S20smartmontools -> ../init.d/smartmontools
  7. lrwxrwxrwx 1 root root 27 Aug 30 14:40 S20speech-dispatcher -> ../init.d/speech-dispatcher
  8. lrwxrwxrwx 1 root root 17 Aug 31 14:12 S20sysstat -> ../init.d/sysstat
  9. lrwxrwxrwx 1 root root 15 Aug 30 14:40 S50saned -> ../init.d/saned
  10. lrwxrwxrwx 1 root root 19 Aug 30 14:40 S70dns-clean -> ../init.d/dns-clean
  11. lrwxrwxrwx 1 root root 18 Aug 30 14:40 S70pppd-dns -> ../init.d/pppd-dns
  12. lrwxrwxrwx 1 root root 21 Aug 30 14:40 S99grub-common -> ../init.d/grub-common
  13. lrwxrwxrwx 1 root root 18 Aug 30 14:40 S99ondemand -> ../init.d/ondemand
  14. lrwxrwxrwx 1 root root 18 Aug 30 14:40 S99rc.local -> ../init.d/rc.local

如你所想,目录 /etc/rc1.d 因运行级别 1 的特殊而不同。它包含的符号链接指向非常不同的一套脚本。 同样也要注意到其中一些脚本以 K 开头命名,而另一些与其它运行级别脚本一样以 S 开头命名。这是因为当系统进入单用户模式时, 一些服务需要停止。 然而这些 K 开头的符号链接指向了其它级别 S 开头的符号链接的同一文件时, K(kill)表示这个脚本将以指示其停止的参数执行,而不是以启动的参数执行。

  1. /etc/rc1.d$ ls -l
  2. total 4
  3. lrwxrwxrwx 1 root root 20 Aug 30 14:40 K20kerneloops -> ../init.d/kerneloops
  4. lrwxrwxrwx 1 root root 15 Aug 30 14:40 K20rsync -> ../init.d/rsync
  5. lrwxrwxrwx 1 root root 15 Aug 30 14:40 K20saned -> ../init.d/saned
  6. lrwxrwxrwx 1 root root 23 Aug 30 16:10 K20smartmontools -> ../init.d/smartmontools
  7. lrwxrwxrwx 1 root root 27 Aug 30 14:40 K20speech-dispatcher -> ../init.d/speech-dispatcher
  8. -rw-r--r-- 1 root root 369 Mar 12 2014 README
  9. lrwxrwxrwx 1 root root 19 Aug 30 14:40 S30killprocs -> ../init.d/killprocs
  10. lrwxrwxrwx 1 root root 19 Aug 30 14:40 S70dns-clean -> ../init.d/dns-clean
  11. lrwxrwxrwx 1 root root 18 Aug 30 14:40 S70pppd-dns -> ../init.d/pppd-dns
  12. lrwxrwxrwx 1 root root 16 Aug 30 14:40 S90single -> ../init.d/single

你可以改变系统的默认运行级别,尽管这很少被用到。例如,通过修改前文中提到的 /etc/inittab 文件,你能够配置 Debian 系统的默认运行级别为 3 (而不是 2),以下是该文件示例:

  1. id:3:initdefault:

一旦你修改完成并重启系统, runlevel 命令将显示如下:

  1. $ runlevel
  2. N 3

另外一种可选方式,使用 init 3 命令,你也能改变系统运行级别(且无需重启立即生效), runlevel 命令的输出为:

  1. $ runlevel
  2. 2 3

当然,除非你修改了系统默认级别的 /etc/rc?.d 目录下的符号链接,使得系统默认运行在一个修改的运行级别之下,否则很少需要通过创建或修改 /etc/inittab 文件改变系统的运行级别。

在 Linux 系统中如何使用运行级别?

为了扼要重述在系统中如何使用运行级别,下面有几个关于运行级别的快速问答问题:

如何查询系统当前的运行级别?

使用 runlevel 命令。

如何查看特定运行级别所关联的服务进程?

查看与该运行级别关联的运行级别开始目录(例如, /etc/rc2.d 对应于运行级别 2)。

如何查看系统的默认运行级别?

首先,查看 /etc/inittab 文件是否存在。如果不存在,就执行 runlevel 命令查询,你一般就已经处在该运行级别。

如何改变系统运行级别?

init 命令(例如 init 3)临时改变运行级别,通过修改或创建 /etc/inittab 文件永久改变其运行级别。

能改变特定运行级别下运行的服务么?

当然,通过改变对应的 /etc/rc?.d 目录下的符号连接即可。

还有一些其他的什么需要考虑?

当改变系统运行级别时,你应该特别小心,确保不影响到系统上正在运行的服务或者正在使用的用户。

TAGS:
十一月 30th, 2017

你可以通过这三个 Linux 网络命令,了解有关你网络连接的大量信息。iftop 通过进程号跟踪网络连接,Nethogs 可以快速显示哪个在占用你的带宽,而 vnstat 作为一个很好的轻量级守护进程运行,可以随时随地记录你的使用情况。

iftop

iftop 监听你指定的网络接口,并以 top 的形式展示连接。

这是一个很好的小工具,用于快速识别占用、测量速度,并保持网络流量的总体运行。看到我们使用了多少带宽是非常令人惊讶的,特别是对于我们这些还记得使用电话线、调制解调器、让人尖叫的 Kbit 速度和真实的实时波特率的老年人来说。我们很久以前就放弃了波特率,转而使用比特率。波特率测量信号变化,有时与比特率相同,但大多数情况下不是。

如果你只有一个网络接口,可以不带选项运行 iftopiftop 需要 root 权限:

  1. $ sudo iftop

当你有多个接口时,指定要监控的接口:

  1. $ sudo iftop -i wlan0

就像 top 一样,你可以在运行时更改显示选项。

  • h 切换帮助屏幕。
  • n 切换名称解析。
  • s 切换源主机显示,d 切换目标主机。
  • s 切换端口号。
  • N 切换端口解析。要全看到端口号,请关闭解析。
  • t 切换文本界面。默认显示需要 ncurses。我认为文本显示更易于阅读和更好的组织(图1)。
  • p 暂停显示。
  • q 退出程序。

图 1:文本显示是可读的和可组织的。

图 1:文本显示是可读的和可组织的。

当你切换显示选项时,iftop 会继续测量所有流量。你还可以选择要监控的单个主机。你需要主机的 IP 地址和网络掩码。我很好奇 Pandora 在我那可怜的带宽中占用了多少,所以我先用 dig 找到它们的 IP 地址:

  1. $ dig A pandora.com
  2. [...]
  3. ;; ANSWER SECTION:
  4. pandora.com. 267 IN A 208.85.40.20
  5. pandora.com. 267 IN A 208.85.40.50

网络掩码是什么? ipcalc 告诉我们:

  1. $ ipcalc -b 208.85.40.20
  2. Address: 208.85.40.20
  3. Netmask: 255.255.255.0 = 24
  4. Wildcard: 0.0.0.255
  5. =>
  6. Network: 208.85.40.0/24

现在将地址和网络掩码提供给 iftop:

  1. $ sudo iftop -F 208.85.40.20/24 -i wlan0

这不是真的吗?我很惊讶地发现,我珍贵的带宽对于 Pandora 很宽裕,每小时使用大约使用 500Kb。而且,像大多数流媒体服务一样,Pandora 的流量也有峰值,其依赖于缓存来缓解阻塞。

你可以使用 -G 选项对 IPv6 地址执行相同操作。请参阅手册页了解 iftop 的其他功能,包括使用自定义配置文件定制默认选项,并应用自定义过滤器(请参阅 PCAP-FILTER 作为过滤器参考)。

Nethogs

当你想要快速了解谁占用了你的带宽时,Nethogs 是快速和容易的。以 root 身份运行,并指定要监听的接口。它显示了空闲的应用程序和进程号,以便如果你愿意的话,你可以杀死它:

  1. $ sudo nethogs wlan0
  2. NetHogs version 0.8.1
  3. PID USER PROGRAM DEV SENT RECEIVED
  4. 7690 carla /usr/lib/firefox wlan0 12.494 556.580 KB/sec
  5. 5648 carla .../chromium-browser wlan0 0.052 0.038 KB/sec
  6. TOTAL 12.546 556.618 KB/sec

Nethogs 选项很少:在 kb/s、kb、b 和 mb 之间循环;通过接收或发送的数据包进行排序;并调整刷新之间的延迟。请参阅 man nethogs,或者运行 nethogs -h

vnstat

vnstat 是最容易使用的网络数据收集器。它是轻量级的,不需要 root 权限。它作为守护进程运行,并记录你网络统计信息。vnstat 命令显示累计的数据:

  1. $ vnstat -i wlan0
  2. Database updated: Tue Oct 17 08:36:38 2017
  3. wlan0 since 10/17/2017
  4. rx: 45.27 MiB tx: 3.77 MiB total: 49.04 MiB
  5. monthly
  6. rx | tx | total | avg. rate
  7. ------------------------+-------------+-------------+---------------
  8. Oct '17 45.27 MiB | 3.77 MiB | 49.04 MiB | 0.28 kbit/s
  9. ------------------------+-------------+-------------+---------------
  10. estimated 85 MiB | 5 MiB | 90 MiB |
  11. daily
  12. rx | tx | total | avg. rate
  13. ------------------------+-------------+-------------+---------------
  14. today 45.27 MiB | 3.77 MiB | 49.04 MiB | 12.96 kbit/s
  15. ------------------------+-------------+-------------+---------------
  16. estimated 125 MiB | 8 MiB | 133 MiB |

它默认显示所有的网络接口。使用 -i 选项选择单个接口。以这种方式合并多个接口的数据:

  1. $ vnstat -i wlan0+eth0+eth1

你可以通过以下几种方式过滤显示:

  • -h 以小时显示统计数据。
  • -d 以天数显示统计数据。
  • -w-m 按周和月显示统计数据。
  • 使用 -l 选项查看实时更新。

此命令删除 wlan1 的数据库,并停止监控它:

  1. $ vnstat -i wlan1 --delete

此命令为网络接口创建别名。此例使用 Ubuntu 16.04 中的一个奇怪的接口名称:

  1. $ vnstat -u -i enp0s25 --nick eth0

默认情况下,vnstat 监视 eth0。你可以在 /etc/vnstat.conf 中更改此内容,或在主目录中创建自己的个人配置文件。请参见 man vnstat 以获得完整的参考。

你还可以安装 vnstati 创建简单的彩色图(图2):

  1. $ vnstati -s -i wlx7cdd90a0a1c2 -o vnstat.png

图 2:你可以使用 vnstati 创建简单的彩色图表。

图 2:你可以使用 vnstati 创建简单的彩色图表。

TAGS: ,