硬盘512e、4kn的解读

传统的硬盘是以512字节大小的扇区为单位分割进行读写, 512字节的空间不全用来存数据,还存放这一些功能性代码,如ECC校验、Gap、Sync/Address Mark的代码,所以真正的存储空间大概不到90% ,整个磁盘空间的利用率大概在88%左右。

为了提升硬盘可用容量,硬盘厂商把每一个磁盘单位(sector format)扇区格式改为4K(512 Bytes x 8),这种格式又叫做(Advanced Format)高级格式,8个(sector format)共用一个 同步/分隔区域和一个容量稍大的 ECC 校验区 (即功能性代码部分,这部分约占用一百多字节),真正的存储空间使用率能达到97%。

但是现有操作系统对4K这种高级格式支持度还不够,为了过渡,硬盘厂商为4K扇区格式的硬盘准备了512e(emulation)的硬盘固件, 利用固件来把传统的对于512字节扇区的逻辑访问转换为对于4K字节扇区的物理访问。

新硬盘还有另一种固件直接支持 4K字节扇区的访问,这种硬盘称之为4Kn(Native)。传统格式的硬盘被称之为512n(Native),原生就是512字节的扇区。

当我们将大于4K的数据块写入512e硬盘时,由于一次写入的扇区大小就是4K,所以写操作的性能会有较大提升。但是如果写入512e硬盘的数据块小于4K时,操作系统就必需经过读取再修改再写入的过程,这会造成比较明显的性能下降。一些传统应用(如数据库系统)的I/O操作最小单位仍小于 4KB,使用原生 512 byte 扇区硬盘可以保证最好的性能,采用 512e 硬盘容易产生性能影响。

给网络注入点延迟

前言

有些时候,需要人为引入网络延迟,模拟网络条件比较差的情况下,集群的行为。这时候,tc这个工具就横空出世了。 tc是 Traffic Control的简写,用来控制网络流量的。它的功能还是很强大的,我们本文仅简单介绍如何惹人为地注入网络延迟。

注入延迟

注入延迟之前,看下网路延迟:

root@BEAN-1:~# ping 10.10.125.1
PING 10.10.125.1 (10.10.125.1) 56(84) bytes of data.
64 bytes from 10.10.125.1: icmp_req=1 ttl=64 time=0.178 ms
64 bytes from 10.10.125.1: icmp_req=2 ttl=64 time=0.090 ms
64 bytes from 10.10.125.1: icmp_req=3 ttl=64 time=0.270 ms
64 bytes from 10.10.125.1: icmp_req=4 ttl=64 time=0.156 ms
64 bytes from 10.10.125.1: icmp_req=5 ttl=64 time=0.145 ms
^C
--- 10.10.125.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 0.090/0.167/0.270/0.061 ms

给eth0 注入8ms的延迟:

tc qdisc add dev eth0 root netem delay 8ms

然后通过ping查看是否生效:

ping 10.10.125.1
PING 10.10.125.1 (10.10.125.1) 56(84) bytes of data.
64 bytes from 10.10.125.1: icmp_req=1 ttl=64 time=8.17 ms
64 bytes from 10.10.125.1: icmp_req=2 ttl=64 time=8.17 ms
64 bytes from 10.10.125.1: icmp_req=3 ttl=64 time=8.18 ms
64 bytes from 10.10.125.1: icmp_req=4 ttl=64 time=8.28 ms
64 bytes from 10.10.125.1: icmp_req=5 ttl=64 time=8.13 ms
^C
--- 10.10.125.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 8.139/8.190/8.286/0.050 ms

可以看到网络延迟增加了8ms左右。

查看当前的延迟信息

tc qdisc show dev eth1 
qdisc netem 8121: root refcnt 2 limit 1000 delay 8.0ms

改变网络延迟大小

注意,如果已经引入了延迟,但是要修改延迟大小,使用add就不行了,要用change

tc qdisc add  dev eth1 root netem delay 10ms
RTNETLINK answers: File exists

tc qdisc change  dev eth1 root netem delay 10ms

tc qdisc show dev eth1 
qdisc netem 8121: root refcnt 2 limit 1000 delay 10.0ms

或者我们不想区别第一次和修改,可以一律使用replace

删除引入的网络延迟
tc qdisc del dev eth1 root netem delay 1ms

显示当前的状态,无延迟
tc qdisc show dev eth1 
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

#replace设置延迟为9ms
tc qdisc replace  dev eth1 root netem delay 9ms

# 显示当前状态,的确是delay 9ms
tc qdisc show dev eth1 
qdisc netem 8123: root refcnt 2 limit 1000 delay 9.0ms

# 用replace来修改网络延迟为4ms
tc qdisc replace  dev eth1 root netem delay 4ms

# 显示当前网络延迟,的确是4ms
tc qdisc show dev eth1 
qdisc netem 8123: root refcnt 2 limit 1000 delay 4.0ms

删除引入的延迟

tc qdisc del dev eth1 root netem delay 1ms

其他

我们在测试脚本中引入延迟,但是须知,脚本可能会被信号杀死,我们希望,脚本退出的时候,网络延迟被重置为0,这时候,对于shell脚本而言,需要使用trap,做清理工作。

function clean
{
   #此函数为清理函数,一般是将人为引入的网络延迟删除
}

trap clean EXIT

Linux TC(Traffic Control) 简介

众所周知,在互联网诞生之初都是各个高校和科研机构相互通讯,并没有网络流量控制方面的考虑和设计,IP协议的原则是尽可能好地为所有数据流服务,不同的数据流之间是平等的。然而多年的实践表明,这种原则并不是最理想的,有些数据流应该得到特别的照顾,比如,远程登录的交互数据流应该比数据下载有更高的优先级。

      针对不同的数据流采取不同的策略,这种可能性是存在的。并且,随着研究的发展和深入,人们已经提出了各种不同的管理模式。IETF已经发布了几个标准,如综合服务(Integrated Services)、区分服务(Diferentiated Services)等。其实,Linux内核从2.2开始,就已经实现了相关的流量控制功能。本文将介绍Linux中有关流量控制的相关概念, 用于流量控制的工具TC的使用方法,并给出几个有代表性实例。

一、相关概念
      报文分组从输入网卡(入口)接收进来,经过路由的查找,以确定是发给本机的,还是需要转发的。如果是发给本机的,就直接向上递交给上层的协议,比如TCP,如果是转发的,则会从输出网卡(出口)发出。网络流量的控制通常发生在输出网卡处。虽然在路由器的入口处也可以进行流量控制,Linux也具有相关的功能,但一般说来,由于我们无法控制自己网络之外的设备,入口处的流量控制相对较难。因此我们这里处理的流量控制一般指出口处的流量控制。流量控制的一个基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系,每当内核需要将报文分组从网卡发送出去,都会首先将该报文分组添加到该网卡所配置的队列中,由该队列决定报文分组的发送顺序。因此可以说,所有的流量控制都发生在队列中。

       有些队列的功能是非常简单的,它们对报文分组实行先来先走的策略。有些队列则功能复杂,会将不同的报文分组进行排队、分类,并根据不同的原则,以不同的顺序发送队列中的报文分组。为实现这样的功能,这些复杂的队列需要使用不同的过滤器(Filter)来把报文分组分成不同的类别(Class)。这里把这些复杂的队列称为可分类(Classiful)的队列。通常,要实现功能强大的流量控制,可分类的队列是必不可少的。因此,类别(Class)和过滤器(Filter)也是流量控制的另外两个重要的基本概念。

     类别(Class)和过滤器(Filter)都是队列的内部结构,并且可分类的队列可以包含多个类别,同时,一个类别又可以进一步包含有子队列,或者子类别。所有进入该类别的报文分组可以依据不同的原则放入不同的子队列 或子类别中,以此类推。而过滤器(Filter)是队列用来对数据报文进行分类的工具,它决定一个数据报文将被分配到哪个类别中。

二、使用TC
      在Linux中,流量控制都是通过TC这个工具来完成的。通常,要对网卡进行流量控制的配置,需要进行如下的步骤:

  ◆ 为网卡配置一个队列;

  ◆ 在该队列上建立分类;

  ◆ 根据需要建立子队列和子分类;

  ◆ 为每个分类建立过滤器。

      在Linux中,可以配置很多类型的队列,比如CBQ、HTB等,其中CBQ 比较复杂,不容易理解。HTB(Hierarchical Token Bucket)是一个可分类的队列, 与其他复杂的队列类型相比,HTB具有功能强大、配置简单及容易上手等优点。在TC中,使用”major:minor”这样的句柄来标识队列和类别,其中major和minor都是数字。

      对于队列来说,minor总是为0,即”major:0″这样的形式,也可以简写为”major: “比如,队列1:0可以简写为1:。需要注意的是,major在一个网卡的所有队列中必须是惟一的。对于类别来说,其major必须和它的父类别或父队列的major相同,而minor在一个队列内部则必须是惟一的(因为类别肯定是包含在某个队列中的)。举个例子,如果队列2:包含两个类别,则这两个类别的句柄必须是2:x这样的形式,并且它们的x不能相同,比如2:1和2:2。

      下面,将以HTB队列为主,结合需求来讲述TC的使用。假设eth0出口有100mbit/s的带宽,分配给WWW、E-mail和Telnet三种数据流量,其中分配给WWW的带宽为40Mbit/s,分配给Email的带宽为40Mbit/s,分配给Telnet的带宽为20Mbit/S。

      需要注意的是,在TC 中使用下列的缩写表示相应的带宽:

      ◆ Kbps : kilobytes per second,千字节每秒 ;

      ◆ Mbps : megabytes per second,兆字节每秒 ,

      ◆ Kbit : kilobits per second,千比特每秒 ;

      ◆ Mbit : megabits per second, 兆比特每秒 。

三、创建HTB队列
      有关队列的TC命令的一般形式为:

tc qdisc [add | change | replace | link] dev DEV [parent qdisk-id |root] [handle qdisc-id] qdisc [qdisc specific parameters]

      首先,需要为网卡eth0配置一个HTB队列,使用下列命令:

      #tc qdisc add dev eth0 root handle 1:htb default 11

      这里,命令中的”add”表示要添加,”dev eth0”表示要操作的网卡为eth0。”root”表示为网卡eth0添加的是一个根队列。”handle 1:”表示队列的句柄为1: 。”htb”表示要添加的队列为HTB队列。命令最后的”default 11”是htb特有的队列参数,意思是所有未分类的流量都将分配给类别1:11。

四、为根队列创建相应的类别
      有关类别的TC 命令的一般形式为:

tc class [add | change | replace] dev DEV parent qdisc-id [classid class-id] qdisc [qdisc specific parameters]

      可以利用下面这三个命令为根队列1创建三个类别,分别是1:1 1、1:12和1:13,它们分别占用40、40和20mb[t的带宽。

      #tc class add dev eth0 parent 1: classid 1:1 htb rate 40mbit ceil 40mbit

      #tc class add dev eth0 parent 1: classid 1:12 htb rate 40mbit ceil 40mbit

      #tc class add dev eth0 parent 1: cllassid 1:13 htb rate 20mbit ceil 20mbit

      命令中,”parent 1:”表示类别的父亲为根队列1: 。”classid1:11”表示创建一个标识为1:11的类别,”rate 40mbit”表示系统将为该类别确保带宽40mbit,”ceil 40mbit”,表示该类别的最高可占用带宽为40mbit。

五、为各个类别设置过滤器
      有关过滤器的TC 命令的一般形式为:

tc filter [add | change | replace] dev DEV [parent qdisc-id | root] protocol protocol prio priority filtertype [filtertype specific parameters] flowid flow-id

      由于需要将WWW、E-mail、Telnet三种流量分配到三个类别,即上述1:11、1:12和1:13,因此,需要创建三个过滤器,如下面的三个命令:

      #tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:11

      #tc filter add dev eth0 prtocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:12

      #tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 23 oxffff flowid 1:13

      这里,”protocol ip”表示该过滤器应该检查报文分组的协议字段。”prio 1” 表示它们对报文处理的优先级是相同的,对于不同优先级的过滤器,系统将按照从小到大的优先级顺序来执行过滤器,对于相同的优先级,系统将按照命令的先后顺序执行。这几个过滤器还用到了u32选择器(命令中u32后面的部分)来匹配不同的数据流。以第一个命令为例,判断的是dport字段,如果该字段与Oxffff进行与操作的结果是8O,则”flowid 1:11”表示将把该数据流分配给类别1:1 1。更加详细的有关TC的用法可以参考TC的手册页。

六、复杂的实例
      在上面的例子中, 三种数据流(www、Email、Telnet)之间是互相排斥的。当某个数据流的流量没有达到配额时,其剩余的带宽并不能被其他两个数据流所借用。在这里将涉及如何使不同的数据流可以共享一定的带宽。

      首先需要用到HTB的一个特性, 即对于一个类别中的所有子类别,它们将共享该父类别所拥有的带宽,同时,又可以使得各个子类别申请的各自带宽得到保证。这也就是说,当某个数据流的实际使用带宽没有达到其配额时,其剩余的带宽可以借给其他的数据流。而在借出的过程中,如果本数据流的数据量增大,则借出的带宽部分将收回,以保证本数据流的带宽配额。

      下面考虑这样的需求,同样是三个数据流WWW、E-mail和Telnet, 其中的Telnet独立分配20Mbit/s的带宽。另一方面,WWW 和SMTP各自分配40Mbit/s的带宽。同时,它们又是共享的关系,即它们可以互相借用带宽。

      需要的TC命令如下:

      #tc qdisc add dev eth0 root handle 1: htb default 21

      #tc class add dev eth0 partent 1: classid 1:1 htb rate 20mbit ceil 20mbit

      #tc class add dev eth0 parent 1: classid 1:2 htb rate 80mbit ceil 80mbit

      #tc class add dev eth0 parent 1: classid 1:21 htb rate 40mbit ceil 20mbit

      #tc class add dev eth0 parent 1:2 classid 1:22 htb rate 40mbit ceil 80mbit

      #tc filter add dev eth0 protocol parent 10 prio 1 u32 match ip dport 80 0xffff flowid 1:21

      #tc filter add dev eth0 protocol parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:22

      #tc filter add dev eth0 protocol parent 1:0 prio 1 u32 match ip dport 23 0xffff flowid 1:1

      这里为根队列1创建两个根类别,即1:1和1:2,其中1:1对应Telnet数据流,1:2对应80Mbit的数据流。然后,在1:2中,创建两个子类别1:21和1:22,分别对应WWW和E-mail数据流。由于类别1:21和1:22是类别1:2的子类别,因此他们可以共享分配的80Mbit带宽。同时,又确保当需要时,自己的带宽至少有40Mbit。

      从这个例子可以看出,利用HTB中类别和子类别的包含关系,可以构建更加复杂的多层次类别树,从而实现的更加灵活的带宽共享和独占模式,达到企业级的带宽管理目的。

megacli查看硬盘状态

通过megacli的如下命令查看RAID的情况,命令如下:

/opt/MegaRAID/MegaCli/MegaCli64 LDPDInfo -Aall

重点关注以下几点:

Media Error Count
Other Error Count
Predictive Failure Count
Last Predictive Failure
Drive has flagged a S.M.A.R.T alert

如果这几个数值不为0,则可能为硬盘故障,需要更换硬盘。

可以通过让指定硬盘闪烁的方式来定位磁盘位置,命令如下:

MegaCli -PdLocate -start -physdrv [E:S] -aALL

其中 E表示 Enclosure Device ID,S表示Slot Number。比如坏盘的位置为:
Enclosure Device ID: 1
Slot Number: 0

可执行以下命令让其闪烁:
root@Storage-c2:/opt/MegaRAID/MegaCli# ./MegaCli64 -PdLocate -start -physdrv[1:0] -a0
Adapter: 0: Device at EnclId-1 SlotId-0 — PD Locate Start Command was successfully sent to Firmware Exit Code: 0x00
root@Storage-c2:/opt/MegaRAID/MegaCli#

更换硬盘后,关闭闪烁的命令如下:
MegaCli -PdLocate -stop -physdrv [E:S] -aALL

如果raid中有硬盘故障,更换硬盘后,一般都无需做操作,阵列卡会自动做rebuild,从拔出硬盘到插入新盘,一般会有以下的过程:

  • Device
    Normal —>Damage —>Rebuild —>Normal
  • Virtual Drive
    Optimal —>Degraded —>Degraded —>Optimal
  • Physical Drive
    Online —>Failed Unconfigured —>Rebuild —>Online

查看rebuild进度的命令如下:

/opt/MegaRAID/MegaCli/MegaCli64 -PDRbld -showprog -physDrv [1:0] -a0

输出一般如下:

root@Storage-c2:/opt/MegaRAID/MegaCli# ./MegaCli64 -PDRbld -showprog -physDrv [1:0] -a0
Rebuild Progress on Device at Enclosure 1, Slot 0 Completed 10% in 0 Minutes.
Exit Code: 0x00
root@Storage-c2:/opt/MegaRAID/MegaCli#

清理windows C盘空间一例

有一台windows 2012 R2服务器,内存配置128G,C盘分区大小为100G左右,发现C盘可用空间很小,只有2G多。

显示系统隐藏文件,发现C盘下有hiberfil.sys文件,该文件占用空间很大,此文件为系统休眠文件,系统休眠时将内存中的所有信息保存到hiberfil.sys文件中。

要删除该文件,可以在控制面板——电源管理下,在休眠选项下,不启用休眠,即可。

也可以在命令行下执行powercfg -h off来关闭系统休眠,关闭后,hiberfil.sys会被删除,C盘可用空间又变大了。

如果需要使用系统休眠,可以通过命令powercfg -h size 50,来将休眠文件的大小限制在内存容量的50%,此处默认大小不能小于40,并且该配置执行后还将导致启用休眠。

信锐无线网络故障处理说明

网络拓扑大致为出口防火墙,下接上网行为管理,下接核心交换机,交换机上单臂部署信锐无线控制器和AP等。

现有部分用户反应,接入某无线信号后获取不到IP地址,无法上网。

查询无线用户认证日志得知,该终端接入时从vlan 90上获取IP,但是获取不到地址,查看无线控制器配置,得知终端用户获取IP的vlan配置在无线控制器上,但是未配置vlan 90,所以获取不到IP,修改该无线信号的配置,将vlan 90改成其他vlan号。

但是用户仍旧反应不能上网,再次查看无线信号的配置,发现该无线信号还启用了mac白名单的设置,但是未勾选相关的mac白名单,将mac白名单配置好后,用户看正常接入无线信号,正常上网。

vsan主机磁盘出错处理步骤

在vsan的vcenter控制台界面,发现有主机磁盘出错的告警信息,但是在服务器上并未出现任何告警。

此时点击报错主机,在监控——问题——所有问题下,查看告警信息,在监控——任务与事件中,查看具体告警信息,在具体的告警信息中,可以看到告警硬盘的UID号和NAA号。

点击群集,在配置——VSAN——磁盘管理下,可以看到告警主机的磁盘组,在磁盘组中可以根据NAA号定位出告警硬盘。

将该磁盘从磁盘组中移除,移除时点击将所有数据撤出到其他主机。

由于故障硬盘采用raid0配置,所以还需要关机更换硬盘。如果不采用raid,采用HBA或者JBOD这种直通模式,则可在线更换硬盘。

将该主机上的所有运行中的虚拟机迁移到其他主机上,迁移时选择更改计算资源和存储,如果DRS状态是全自动,可以将DRS状态改为手动,否则迁移后,虚拟机可能会根据DRS再次迁回至该主机。

将该主机关机,更换硬盘,将新硬盘配置成raid0,启动主机,在vcenter的vsan配置中,将新硬盘加入到vsan磁盘组中。

查看vsan容量,vsan故障磁盘处理完成。

Kali Linux系统介绍

Kali Linux 系统可以说是在安全测试方面最好的开箱即用的 Linux 发行版。Kali 下的很多工具软件都可以安装在大多数的 Linux 发行版中,Offensive Security 团队在 Kali 系统的开发过程中投入大量的时间精力来完善这个用于渗透测试和安全审计的 Linux 发行版。

Kali Linux 是基于 Debian 的面向安全的发行版本。该系统由于预安装了上百个知名的安全工具软件而出名。

Kali 甚至在信息安全领域还有一个含金量较高的认证叫做“Kali 渗透测试(Pentesting with Kali)”认证。该认证的申请者必须在艰难的 24 小时内成功入侵多台计算机,然后另外 24 小时内完成渗透测试报告并发送给 Offensive Security 的安全人员进行评审。成功通过考试的人将会获得 OSCP 认证证书。

VSAN6.5主机修改IP地址的步骤

现有四台vsan主机,组成一个集群,四台主机的IP地址分别为10.13.9.161、10.13.9.162、10.13.9.163、10.13.9.164,现需要将IP改为10.13.9.11、10.13.9.12、10.13.9.13、10.13.9.14。

操作步骤大概如下:
1、在vcenter上将该集群移除;
2、在每台esxi主机上,按F2进入,修改各IP地址;
3、在vcenter上新建集群,在新建集群下,添加四台主机,即可完成。

整个操作对业务没有影响。

WSL报错0X8007019E的解决方法

WSL即Windows Subsystem for Linux,在windows操作系统中的microsoft store搜索WSL即可下载ubuntu、kali、opensuse等linux发行版,但是安装后运行时,如果报0X8007019E的错误,则需要在“启用或关闭windows功能”处启用适用于Linux的Windows子系统,即可解决报错问题,也可在powershell下执行 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem -Linux。

修改root密码,可以在powershell下执行命令 ubuntu config –default-user root来配置root密码。

网络安全