交换机中的“镜像”

写在开头 “镜像”这个词其实对应着计算机领域内两个(或许更多)截然不同的概念,这两个概念并没有谁更常用之类的区别,因此在使用时需要根据当时当刻的上下文信息进行不同的区分: Image(镜像):这类一般出现在“系统镜像(iso文件)”、“容器镜像(docker)”这类语境下,其指代的是一个物理存在的数据文件,这个文件往往是某个运行环境的静态存储,即根据该镜像可以run起来一些需要被保留的状态现场等。 Mirror(镜像):顾名思义,将某个东西“照镜子”一样的照搬过来,供给下游应用;这种语境下,镜像指代的是对某些数据、流量或者状态进行无差别/有差别的转发,“镜像”操作关注于(转发源,转发目的地)两个概念。 正文 交换机中的“镜像”使用的是“mirror”词义,即对网络流量的有条件/无条件转发,供给下游监控、漏扫等应用进行使用。 什么是交换机镜像 镜像是将指定“源(source)”的网络流量(这里指报文)完整的复制一份到“目的地(destination)”。目的地与监控、漏扫设备直接或者间接相连,在很多情况下,监控设备上都会安装相应的流量分析软件,对镜像转发的报文进行进一步的分析 当网络中出现存在攻击流量或者故障报文时,网管可以使用镜像功能无损的接入该网络,抓取报文进行分析排障等 根据镜像源的不同,交换机镜像往往可以分为如下几种: 端口镜像:将指定端口的流量转发到目标端口 流镜像:将流经网络设备的所有符合规则(Access Control List, ACL)的报文镜像转发的目标端口 VLAN镜像:将指定VLAN(Virtual Local Area Network)内所有活动网络接口的报文镜像转发到目标端口 MAC镜像:将指定VLAN内的从“源MAC地址”到“目标MAC地址”设备的报文进行镜像转发到目标端口 根据目的端口与监控设备的连接方式,可以分为如下两类: 本地镜像:源端口与目标端口在同一个设备上,与监控设备直接物理互连 远程镜像:源端口和目标端口不在同一个设备或部分在同一个设备上,与监控设备通过网络互联 Notes:镜像的目标都是一个“端口”,但源可能是网络设备、端口或者物理接口等多种不同的设备 镜像的工作原理 交换机镜像的工作原理差不多,这里仅以最常见的端口镜像作为例子进行说明 端口镜像是将网络设备上指定端口接收或发送的报文复制到目的端口,可以只复制端口接收或者发送的报文,也可以同时复制接收和发送的报文。指定端口称为镜像端口,目标端口称为观察端口。 本地镜像 如上图所示,DeviceA上的镜像端口(源)在接收或发送报文的时候,会将报文复制一份到观察端口(目标)。观察端口与监控设备直接相连,接收复制的原始报文进行进一步的分析处理等,因此本实例是一个典型的本地镜像 远程镜像 远程镜像通常有两种连接方式: 目的端口通过二层网络与监控设备相连的场景称为二层远程镜像RSPAN(Remote Switched Port Analyzer) 目的端口通过三层网络与监控设备相连的场景称为三层远程镜像ERSPAN(Encapsulated Remote Switched Port Analyzer) 上图是一个典型的远程镜像实例,观察端口将复制的报文发送给监控设备前会添加一层VLAN Tag或进行GRE封装,便于复制的报文能够穿过中间的二层网络/三层网络,到达监控设备。 总结 总的来讲,交换机镜像是为了方便网络管理员进行网络内探查、排障或者漏扫等等操作而提出的一种概念,本质上是对网络内的特定或非特定数据流量进行无条件或有条件的转发,以便下游的监控、漏扫或分析工具获取到原始数据流,并对其进行进一步的分析等。 参考资料 华为设备百科-镜像
Read more →

aoimysql配合mysql使用时的query缓存坑

背景 近期开发sanic框架下的系统使用到了aiomysql三方库,异步执行sql提高系统工作效率 在手动向数据库插入数据后,使用aiomysql进行select时并不能查询到刚刚插入的数据,只能重启web服务 问题定位 最终定位问题为数据库操作仅针对非select进行了commit,造成select一直使用的是缓存 解决 一种方式是在所有的query语句之后都对上一次查询进行commit async with self.pool_db.acquire() as conn: # some query await conn.commit() 另一种方式是在执行sql之前将连接设置自动提交模式 async with self.pool_db.acquire() as conn: await conn.autocommit(True) 引用 (StackOverflow)[https://stackoverflow.com/questions/21974169/how-to-disable-query-cache-with-mysql-connector]
Read more →

Debian使用kvm+qemu+cockpit搭建带有webui的虚拟机管理系统

背景 在自己的nas上安装了纯debian系统,向拥有媲美pve的虚拟机管理流程但同时又不想重装一遍系统,故而经过一番搜索,发现目前主流的linux系虚拟机管理基本都是kvm+qemu。但这同时带来一个新的问题,我目前使用的是非gui版本的系统,同时由于mobaxterm的卡顿只能忍痛割爱其X-server功能转为termius,因此我并不能使用传统的vir-manager对虚拟机进行创建、管理等等。在搜索后发现同样由redhat出品的cockpitwebui管理端,借助websocket等技术,完美实现了对物理机的闭环管理以及虚拟机的管理。 软件介绍 kvm qemu cockpit 操作步骤 得益于kvm等等一干软件的开发团队以及巨大用户量,上述三个软件的安装非常简单,yum/apt/...等主流发行版的包管理器均内置了其完整的安装包;这里以debian为例 安装kvm+qemu Step-1:检查设备是都支持虚拟化技术 执行 当输出大于0则支持 egrep -c '(vmx|svm)' /proc/cpuinfo 执行kvm-ok 当输出如下则支持内核级虚拟化,若找不到命令则安装apt install cpu-checker INFO: /dev/kvm exists KVM acceleration can be used Step-2:安装KVM+qemu 执行下列命令 apt install qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager 软件概述 **qemu:**允许进行硬件级虚拟化 qemu-kvm:kvm主程序,现已经更名为qemu-system-x86 **libvritd-daemon:**虚拟化守护程序 **bridge-utils:**虚拟网桥支持 **virt-manager:**基于x-server的虚拟机gui管理(本过程中非必须,但是最好装) Step-3:修改qemu运行权限,避免后期的虚拟机权限问题 使用你喜欢的编辑器编辑/etc/libvirt/qemu.conf 取消下列字段的注释 # Some examples of valid values are: # # user = "qemu" # A user named "qemu" # user = "+0" # Super user (uid=0) # user = "100" # A user named "100" or a user with uid=100 # user = "root" # The group for QEMU processes run by the system instance.
Read more →

Linux下xargs的基本用法

背景需求 遇到一个需要使用scp/rsync向远端传送当前文件夹下前n个文件的需求,若要一个一个的手输也不是不行,但总感觉有一些蠢 解决方案 xargs功能强大 xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。 xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。 xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。 xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。 详解 首先是要拿到该文件夹下的前n个文件 ls | head -100 利用rsync向远端传输文件 rsync -avzP <file_names> user@remote 使用xargs省去手动输入文件列表 ls | head -100 |xargs -i rsync -avzP {} user@remote 注意事项 args 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。 xargs 一般是和管道一起使用。
Read more →

model.zero_grad() VS. optimzer.zero_grad()

引言 在模型训练时,每个Batch反向传播完成后我们需要手动清除计算图上本次迭代的所有梯度 在阅读不同的代码时,总能看到不同的清空代码: model.zero_grad() optimizer.zero_grad() 正文 上述两种梯度清空的方式均有效,区别在于起作用的范围不同 model.zero_grad() 此时mdoel包含的所有参数上的梯度均被清空 optimizer.zero_grad() 此时该优化器中负责更新的模型参数上的梯度被清空,即不一定是全部的梯度被清空 若模型训练过程中只有一个优化器,即优化器构造时使用 optimizer = optim.Optimiers(model.parameters(), lr=args.lr) 此时上述两种梯度清空方式完全等价 总结 两种不同的梯度清零方式在多数场景下基本等价,其区别在于作用范围不同 对于多任务训练、多优化器的训练中,需要根据具体训练策略的不同对参数梯度进行不同作用范围的清空
Read more →