-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
386 lines (180 loc) · 15.5 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="Hugo 0.118.2">
<title>Chaos</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="A mechanic, forever." />
<meta name="keywords" content="" />
<meta name="robots" content="noodp" />
<link rel="canonical" href="/" />
<link rel="stylesheet" href="/styles.css">
<link rel="shortcut icon" href="/img/theme-colors/blue.png">
<link rel="apple-touch-icon" href="/img/theme-colors/blue.png">
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="" />
<meta name="twitter:creator" content="" />
<meta property="og:locale" content="en" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Chaos">
<meta property="og:description" content="A mechanic, forever." />
<meta property="og:url" content="/" />
<meta property="og:site_name" content="Chaos" />
<meta property="og:image" content="/img/favicon/blue.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="627">
<link href="/index.xml" rel="alternate" type="application/rss+xml" title="Chaos" />
</head>
<body class="blue">
<div class="container center headings--one-size">
<header class="header">
<div class="header__inner">
<div class="header__logo">
<a href="/">
<div class="logo">
Square-one
</div>
</a>
</div>
<ul class="menu menu--mobile">
<li class="menu__trigger">Menu ▾</li>
<li>
<ul class="menu__dropdown">
<li><a href="posts/about">About</a></li>
</ul>
</li>
</ul>
</div>
<nav class="navigation-menu">
<ul class="navigation-menu__inner menu--desktop">
<li><a href="posts/about" >About</a></li>
</ul>
</nav>
</header>
<div class="content">
<div class="posts">
<article class="post on-list">
<h1 class="post-title">
<a href="/posts/%E4%BA%A4%E6%8D%A2%E6%9C%BA%E4%B8%AD%E7%9A%84%E9%95%9C%E5%83%8F/">交换机中的“镜像”</a>
</h1>
<div class="post-meta">
<time class="post-date">
2023-04-25 ::
</time>
</div>
<span class="post-tags">
#<a href="/tags/knowledge/">Knowledge</a>
#<a href="/tags/network/">Network</a>
</span>
<div class="post-content">
写在开头 “镜像”这个词其实对应着计算机领域内两个(或许更多)截然不同的概念,这两个概念并没有谁更常用之类的区别,因此在使用时需要根据当时当刻的上下文信息进行不同的区分:
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封装,便于复制的报文能够穿过中间的二层网络/三层网络,到达监控设备。
总结 总的来讲,交换机镜像是为了方便网络管理员进行网络内探查、排障或者漏扫等等操作而提出的一种概念,本质上是对网络内的特定或非特定数据流量进行无条件或有条件的转发,以便下游的监控、漏扫或分析工具获取到原始数据流,并对其进行进一步的分析等。
参考资料 华为设备百科-镜像
</div>
<div>
<a class="read-more button" href="/posts/%E4%BA%A4%E6%8D%A2%E6%9C%BA%E4%B8%AD%E7%9A%84%E9%95%9C%E5%83%8F/">Read more →</a>
</div>
</article>
<article class="post on-list">
<h1 class="post-title">
<a href="/posts/23/">aoimysql配合mysql使用时的query缓存坑</a>
</h1>
<div class="post-meta">
<span class="post-author">chaos</span>
</div>
<div class="post-content">
背景 近期开发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]
</div>
<div>
<a class="read-more button" href="/posts/23/">Read more →</a>
</div>
</article>
<article class="post on-list">
<h1 class="post-title">
<a href="/posts/19/">Debian使用kvm+qemu+cockpit搭建带有webui的虚拟机管理系统</a>
</h1>
<div class="post-meta">
<span class="post-author">chaos</span>
</div>
<span class="post-tags">
#<a href="/tags/%E6%97%A5%E5%B8%B8%E4%BD%BF%E7%94%A8/">日常使用</a>
#<a href="/tags/%E7%B3%BB%E7%BB%9F/">系统</a>
</span>
<div class="post-content">
背景 在自己的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.
</div>
<div>
<a class="read-more button" href="/posts/19/">Read more →</a>
</div>
</article>
<article class="post on-list">
<h1 class="post-title">
<a href="/posts/22/">Linux下xargs的基本用法</a>
</h1>
<div class="post-meta">
<span class="post-author">chaos</span>
</div>
<span class="post-tags">
#<a href="/tags/system/">System</a>
#<a href="/tags/linux/">Linux</a>
#<a href="/tags/%E8%BF%90%E7%BB%B4/">运维</a>
</span>
<div class="post-content">
背景需求 遇到一个需要使用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 一般是和管道一起使用。
</div>
<div>
<a class="read-more button" href="/posts/22/">Read more →</a>
</div>
</article>
<article class="post on-list">
<h1 class="post-title">
<a href="/posts/12/">model.zero_grad() VS. optimzer.zero_grad()</a>
</h1>
<div class="post-meta">
<span class="post-author">chaos</span>
</div>
<span class="post-tags">
#<a href="/tags/python/">Python</a>
#<a href="/tags/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/">深度学习</a>
</span>
<div class="post-content">
引言 在模型训练时,每个Batch反向传播完成后我们需要手动清除计算图上本次迭代的所有梯度 在阅读不同的代码时,总能看到不同的清空代码: model.zero_grad() optimizer.zero_grad() 正文 上述两种梯度清空的方式均有效,区别在于起作用的范围不同 model.zero_grad() 此时mdoel包含的所有参数上的梯度均被清空 optimizer.zero_grad() 此时该优化器中负责更新的模型参数上的梯度被清空,即不一定是全部的梯度被清空 若模型训练过程中只有一个优化器,即优化器构造时使用 optimizer = optim.Optimiers(model.parameters(), lr=args.lr) 此时上述两种梯度清空方式完全等价 总结 两种不同的梯度清零方式在多数场景下基本等价,其区别在于作用范围不同 对于多任务训练、多优化器的训练中,需要根据具体训练策略的不同对参数梯度进行不同作用范围的清空
</div>
<div>
<a class="read-more button" href="/posts/12/">Read more →</a>
</div>
</article>
<div class="pagination">
<div class="pagination__buttons">
<a href="/page/2/" class="button next">
<span class="button__text">Older posts</span>
<span class="button__icon">→</span>
</a>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="footer__inner">
<div class="copyright">
<span>© 2023 Powered by <a href="http://gohugo.io">Hugo</a></span>
<span>:: <a href="https://github.com/panr/hugo-theme-terminal" target="_blank">Theme</a> made by <a href="https://github.com/panr" target="_blank">panr</a></span>
</div>
</div>
</footer>
<script type="text/javascript" src="/bundle.min.js"></script>
</div>
</body>
</html>