在命令行下给 socks 或者 http 代理测速

在国内不可避免的要用到代理,这些年陆陆续续从 GAE 上的代理,到自己购买 VPS 搭建,从 Shadowsocks 到 V2ray,自己花费了不少的时间,而现在虽然手上也有两台 VPS,但是已经不拿他们作为主要的代理了,我一台 Directspace 的 VPS,线路没有优化过,到国内的延迟略高,而另一台 AWS 的 EC2,虽然地理位置在韩国,也只勉强到能用的阶段。所以这两年陆陆续续不再自己维护代理服务,之前有购买过因为 Ingress 结缘的 Shadowsocks 服务,一直用到现在,虽然有些情况下会发生断流,倒也一直没有放在心上。直到尝试了一周的 V2ray 服务提供商,我想是回不去 SS 了。

那么有什么方法来对一个代理服务的提供商的速度进行测试呢?这就是这篇文章的最主要的内容。

YouTube

我知道很多的人拿 YouTube,右击查看 Stats for nerds.

youtube stats for nerds

可以看到其中有一条 Connection Speed,这个图片中的速度大概在 15~18Mbps,转换一下大概在 2~3MB/s 的速度,这个速度看个 1080p,大概是可以了,如果要追求更高的画质那么还需要更高的比特率,不过对于我来说,这已经足够了,毕竟我的 MSI 显示屏也只有 1080p 而已。

speedtest-cli

但 YouTube 毕竟只是一种方式,如果想要更加精确的测速,有一个网站叫做 speedtest,一般我用来测试都用这个,或者还有一个 Netflix 提供的 fast.com.

speedtest web

结果:

speedtest web result

但其实 speedtest 可以在命令行下进行。

首先要先安装 pip, 然后在安装:

pip install speedtest-cli

运行:

➜ speedtest-cli
Retrieving speedtest.net configuration...
Testing from China Mobile Guangdong (xxx.xxx.xxx.13)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Beijing Broadband Network (Beijing) [1.67 km]: 11.141 ms
Testing download speed................................................................................
Download: 124.99 Mbit/s
Testing upload speed......................................................................................................
Upload: 4.17 Mbit/s

speedtest 的测速的时候会根据位置选择不同的节点,不同的节点会对结果有一定的影响。

对代理进行测试

既然有了上面的基础 speedtest-cli 命令,那么在 Linux 下,HTTP 代理也好,socks 代理也好都可以通过 speedtest-cli 来直接在终端下进行测试。

首先要知道本地的 socks 代理地址,Shadowsocks 一般的本地 socks 地址是:

socks://127.0.0.1:1080

对 socks 代理进行测速

要对 socks 代理进行测试则先要安装 proxychains,然后通过

sudo apt install proxychains4

proxychains4 curl ip.gs

来验证已经走了代理。再通过如下命令进行测速:

proxychains4 speedtest-cli

在输出的一大堆日志中可以查看到下载和上传的速度:

Download: 18.65 Mbit/s
Upload: 4.01 Mbit/s

对 HTTP 代理进行测速

对 HTTP 代理的测试相对要简单一些。开启 V2ray 代理,我用的 Linux 下 V2rayL 的客户端,在配置中可以看到 HTTP 的代理端口是 1081.

export http_proxy=http://127.0.0.1:1081
curl ip.gs
# 确保自己的 IP 已经变成代理的 IP,然后运行
speedtest-cli

老版本的 speedtest-cli 中对 http_proxy 支持可能有问题,确保自己的的是最新的版本:

➜ speedtest-cli --version
speedtest-cli 2.1.2

推广时刻

这里提供我测试用的一个是我以前用的 SSR 服务,一个便是新的 V2ray 的服务:

当然拿两者对比速度是没有意义的,服务器不同,协议也不同,只是提供一个方法让大家的选择服务商的时候能够对自己所用的服务有一个基本的了解。对于我的情况新的 wujievpn 几乎提供了我翻了一倍的下行速度。Download 从 18.65 Mbit/s 提高到了 34.5 Mbit/s。所以还是值得一提的。

如果有人想要尝试,欢迎使用我的邀请链接:

reference

  • 感谢 @sivel 提供这么好用的命令行测速工具 speedtest-cli

2020-04-06 speedtest , socks , http_proxy , proxy , vps , v2ray

OpenWrt 学习笔记

硬件

CPU

  • Atheros/QualCom 高通 (QCA)
  • BroadCom 博通 (BCM)
  • MediaTek 联科发 (MTK)
  • RealTek 瑞昱

RAM

  • SDRAM
  • DDR, DDR2, DDR3

ROM(Flash)

  • SPI Flash
  • NOR Flash
  • NAND Flash

WiFi 芯片

  • USB(速度相对较慢)
  • PCI-e

软件

BootLoader

Wiki

CPU, 网卡数据库 Wiki:

reference

  • 《跟着佐大学 OpenWrt 开发入门》

2020-04-05 openwrt , wrt , router , linux , cpu

小米路由器 3G 刷机及固件

记录一下小米路由器 3G 的刷机历程,过程步骤是比较简单,但就是配置过程有点心酸,理论上是应该直接就能工作的,但是我的情况比较特殊,想用 OpenWrt 的无线中继来着,但是用别人的固件,和我自己编译的固件都无法在小米路由器 3G 上实现无线中继。

OpenWrt 固件

我的另一台 WNDR 3800 直接配置就可以无线中继,但是小米的配置后就各种问题。

无线未开启或未关联

最一开始就是,开启无线中继后 5G 信号显示,“无线未开启或未关联”。

网上查到解决方法是需要将国家修改为美国,2.4G 信道设置为 11, 5G 信道设置为 149(如果是无线中继,那么和主路由保持一致即可),然后重启路由器。

重启路由器后确实看到一块网卡已经可以,但总是有一块还是报错。

查看内核日志

[  246.611715] wlan1: deauthenticated from fc:7c:01:dd:5b:7a (Reason: 15=4WAY_HANDSHAKE_TIMEOUT)

去查看这个日志也找不到原因。故放弃转下载了 Padavan 的固件。

Padavan

Padavan 是俄罗斯开发者在华硕的路由器系统中延伸而来。Padavan 针对 mtk 芯片,梅林固件是针对博通芯片。功能相似。

在 Padavan 的固件中,直接 5G,设置无线桥接

  • 无线 AP 工作模式: AP-Client + AP
  • 无线 AP-Client 角色:这里我选 LAN Bridge(因为我想要我这台接入的设备 IP 和主路由 IP 在同一个网段),而如果你想要 Padavan 连接的设备有一个新的 IP 段,这里可以选择 WAN(Wireless ISP)
  • 然后选择上级 SSID,自动获取信道,授权方式,密码,应用

到这里就完成了 Padavan 中设置无线中继。另外我还去 LAN 设置中把 LAN 的 DHCP 关了。

然后再在 LAN 设置中将 LAN IP 地址,也就是 Padavan 的管理后台设置一个在主路由中的静态 IP,我的主路由网关是 192.168.2.1 所以我给 Padavan 设定了一个 192.168.2.2

另外要注意的是 Padavan 固件中有一个路由器运行模式,如果像我一样作为无线中继使用,也别尝试接入点模式 (AP) 模式,除非你一定要把路由器当成交换机使用。

接入点模式的介绍:

MI-R3G 连接到外部有线 / 无线路由器并且提供无线网络共享。 该模式下 NAT、防火墙、UPnP、DHCP 服务不可用,并且 WAN 端口直接连接到 LAN 端口。

在该模式下 WAN 口的作用也和 LAN 口一样。那么假如安装我上面的配置,Padavan 就无法进入管理后台了,因为 Padavan 只作为一个无线交换机在发挥功能。所以如果要使用该模式,一定把 LAN 口地址改成和无线中继的网段不一样的网段,这样了解网线,然后使用静态 IP 地址连接电脑还能上管理后台,否则就只能恢复出厂设置了。

如何进入 Breed

Breed 下载地址:https://breed.hackpascal.net/

刷入 Breed 的方法就不说了,网上太多了。这里记录一下怎么进入 Breed,因为我总是忘记。

  • 断电
  • 按住 reset
  • 通电
  • 指示灯先黄色闪烁,然后蓝色闪烁
  • 用网线连接 LAN,和电脑
  • 进入 192.168.1.1

几大路由器固件的历史

思科发布 wrt54 路由后未遵循开源协议被告,之后迫于压力发遵循 GPL 发布了 wrt,再之后 wrt 延伸出社区版的 openwrt、HyperWRT 等,华硕也发布了 asuswrt(GPL 开源协议)。在华硕开源 asuswrt 后,开发者们基于此开发了梅林和 Padavan (老毛子)。

而开源社区这边,openwrt 又衍生出 dd-wrt、石像鬼、lede 等。其实现在用 arm 架构的路由器基本上全是 wrt 系统,包括 newifi, 极路由等等。


2020-04-04 xiaomi , router , wifi , openwrt , linux

个人的局域网网络设置整理

最近因为想要调查我屋里网络带宽的瓶颈,把整个家里的网络环境整理了一番,也把本来乱七八糟的各种 IP 也梳理了一下。纯粹整理,如果不关心的可以跳过。

现在我有两台路由器,准确来说是三台,一台主路由基本不动,负责接入互联网,稳定为主,千兆。一台房间的副路由,无线中继主路由,IP 由主路由分配,还有一台本来做了无线桥接,有一个新的网段,现在想逐渐弃用,转移到同一个网段,便于管理。

路由器设置 DHCP

主路由和副路由的网络设置,就不赘述,主路由没有什么设置,主要是副路由需要设置无线中继 +AP,我这里没有用主路由的 SSID,新产出了一个新的 SSID,如果在个人家中其实用同一个 SSID 即可,可以无缝切换。

QNAP static ip

QNAP 设置静态地址

网络与虚拟环境中,找到之前设定的对应的接口,QNAP 中叫做虚拟交换机,直接通过 UI 界面修改即可。

Proxmox static ip

Proxmox 的网络接口配置在 /etc/network/interfaces 文件中。

类似这样:

auto lo
iface lo inet loopback

iface enp3s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.2.100
        netmask 255.255.255.0
        gateway 192.168.2.1
        bridge_ports enp3s0
        bridge_stp off
        bridge_fd 0

修改其中的 address, netmask, gateway 即可。修改保存后重启,或者 systemctl restart networking.service

Raspberry Pi static ip

树莓派是网线接入,所以需要设置 eth0 的静态地址。

如果是用网线,eth0 端口,编辑 /etc/dhcpcd.conf

interface eth0
static ip_address=192.168.2.4/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1 8.8.8.8

重启:

sudo reboot

如果使用的是无线网卡,那么需要设置 wlan0 网卡:

# 查看当前配置
ifconfig -a
# 查看 wifi 配置
less /etc/wpa_supplicant/wpa_supplicant.conf
# 修改配置
sudo vi /etc/dhcpcd.conf

修改内容,和上面类似,注意把 IP 替换成对应内网的地址,别直接复制使用:

interface wlan0
static ip_address=192.168.2.4/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1 8.8.8.8

注意配置 Raspberry Pi 网卡地址的时候千万要小心,否则一旦配置错误,如果又是作为服务器使用的话,可能造成无法获取局域网地址从而无法连接,那么就可能需要键盘和显示器来登录重新配置,所以谨慎。

Other devices

其他的 Linux PC 可以选择 DHCP,也可以配一个静态的 IP,因为不需要连接所以不知道自动获取的 IP 也关系不大。

为什么路由器的设置地址都是 192.168 开头

IPv4 地址协议中预留了 3 个 IP 段,作为保留地址给专有网络使用。

  • A 类地址:10.0.0.0–10.255.255.255
  • B 类地址:172.16.0.0–172.31.255.255
  • C 类地址:192.168.0.0–192.168.255.255

那么回到这个问题上,为什么家用的路由器默认分配的地址都是 192.168.1.x 或者 192.168.2.x 等等,举一个简单的例子,假如路由器使用 192.168.1.1/24 网段,那么在这个网络中可以容纳的机器数是 192.168.1.2-255 共 254 多个可用的 IP,一般家庭的设备连接足够。当然能够带动这么多设备的路由器性能也需要足够好了。

而假如你的局域网中可预期将会有几千几万太设备那么必然 192.168.1.x 的网段是不能用的,必须用到

  • 172.16.0.0/12 可容纳 1048576 个地址
  • 10.0.0.0/8 可容纳 16777216 个地址

下面两个地址自然个人是用不这么多的。

reference


2020-04-04 network , linux , dhcp , ip

没有反思的哀悼聊胜于无

每次禁止娱乐都会让我想起《无限挑战》,最近在系统性了解韩国近代史后,再回来看《无限挑战》,2014 年发生震惊全韩国的世越号沉船事件后,整个韩国陷入巨大的悲痛,当然《无挑》也停播两周,但是两周后播出了长达一个月的《选择特辑》,我经常把他称之为选举特辑,因为 PD 就是用选举人制度让每一个 MC 都体验了一把总统候选人的角色。金 PD 对于这件事情没有直接的回击,反而用一种独特的视角去切入,悲剧既然发生了,我们有办法做到下一次不再犯错吗,有办法弥补当前的过失吗。金 PD 用自己的节目向世人宣告:”有“,那就是“选择”。 每一个人都有选择的权利,只有每一个人都参与到整个社会的运行中,才能阻止这样的事情再此发生。于是后面的事情似乎大多数中国人都比较清楚 —- 朴槿惠被弹劾,新的总统被选上任。当然每个国家都有其自身的问题,但要看整个国家的历史向着哪一边前进。 今天所有的娱乐节目停止,所有线上线下都在哀悼,可是我们哀悼什么呢?不幸染病的普通人?还是连名字都不能提的吹哨人?还是因为病毒而奋战在一线的医护工作者?对我们当然要哀悼,还要铭记。不仅要哀悼当下,还要哀悼这样的事情这已经发生了多少次。为什么每一次都去哀悼,然后再忘记,然后有发生悲剧,然后再哀悼吗?还有多少人还记得 SARS 的吹哨人?还有多少人还记得 SARS 感染的后遗症患者?还有多少人还记得 SARS 第一线的工作人员?说好的不要忘记他们呢?说好的会照顾他们呢?然而当历史车轮碾过的时候,这些曾经的哀悼就像是从来没有存在过。 如今我们要哀悼,我们当然要哀悼,我们不仅要哀悼不幸逝去的人,还有哀悼消失的文字,消失的声音。太多的文字还没有被世人所阅便从虚拟的二进制世界消失了,太多的声音还没被听见就被掐断了声带。于是我反而羡慕起世越号后韩国所保留下的史料,从文字,图像,声音,到画面,每一年都被拿到聚光灯下被审阅,即使已经过去 6 年的今天,依然还有人在为这件事情发声,2020 的奥斯卡大部分的媒体的目光都被《寄生虫》所吸引,但实际还有一部短片《In the Absence》获得了提名。6 年过去了,他们还记得。并且提醒我们这需要被记住。可我们谁还记得长江之上的”东方之星号客轮”的事故,这也是有 442 人死亡的大型事故啊,并且这件事情正好发生在世越号之后一年啊。

movie in the absence poster

我们有反思吗?哀悼真的有用吗?禁止娱乐就真的能让人记住这个事情吗?满屏的黑白真的能给留下的人一点心里安慰吗?有的时候反而通过娱乐 —- 综艺,歌曲,影视 —- 一遍一遍的告诫后来的人,我们不能犯下同样的错误才真的有用。

如果真的就这样哀悼过去了,我真的害怕很多年以后,如果被记住的只有“果断的封城”,“英明的决策”,那如果病毒再来一次,我怕我就可能是那个被历史车轮碾过的人了。


2020-04-04 covid-19 , sars , virus , movie , korea

每天学习一个命令:使用 rz sz 向服务器发送文件

搜索 rz sz 命令使用方式进来的,可以不用往下看了,直接学习 scp 或者 rsync 吧, rz sz 看了一下还是有很多限制的。

虽然它可以实现向服务器发送文件,或者接受服务器的文件,但是限制条件必须在 screen 中执行,另外如果要在 Tmux 中使用还需要特殊的 hack 1

使用

所以最基本的使用就是:

rz -be

2020-04-01 rz , sz , linux , server , scp , command

分析家里局域网 WiFI 瓶颈

目前我的情况是,家中有一个千兆主路由放在客厅接外面的宽带,而我自己的房间有一台比较老的 Netgear 3800 路由来无线桥接连接外面的主路由,因为我不想我的 3800 路由中的设备暴露到主路由的设置中,所以用了 OpenWrt 的桥接模式。但是随着我在 3800 这台路下接的设备增多,导致目前 3800 这台路由不堪重负,已经影响到了我日常 streaming 局域网 NAS 中的电影。所以最近想更换一下这台已经 8 年历史的 WNDR 3800 路由器。

首先我了解了一下,WNDR3800 标称的是 300Mbps 双频千兆路由器,WiFi 下 5GHz,理论传输速率应该有 37.5MB/s,但实际应该是达不到的,但即使只有一半的速率 10MB/s ,理论上串流局域网的视频应该是问题不大的,而现在的问题就出现在局域网中用 WiFi 连接的设备,理论上只能达到 4MB/s 的峰值速度。

网线比较老

首先细想了想理论上我的 WNDR3800 路由下面四个 LAN 口都是千兆网口,有线速度不应该那么差的,所以我先用我现有的几根网线连接了设备,但发现速度依然不够理想。

用 iperf 测试两台使用网线连接的设备,测试的速度大致只有在 30~45 Mbits/s 左右,换算成传输的速度除以 8,那就比较可怜了。

我就有点怀疑我的网线,可能是比较老的网线(这几根网线已经跟随我差不多快 6 年了,所以应该就是一个最高百兆的网线),所以立即下单了两根六类网线。

网线区别

如何识别五类网线,超五类网线?

  • 五类网线,会标注 「CAT5」字样,传输带宽为 100MHz,用于语音传输和最高传输速率为 100Mbps 的数据传输
  • 超五类网线:标注 「CAT5e」 字样,传输带宽可高达 1000Mb/s,但一般只应用在 100Mb/s 的网络中,只实现桌面交换机到计算机的连接,因为超五类非屏蔽网线要借助价格高昂的特殊设备的支持
  • 六类网线:标注 「CAT6」字样,一般指的都是非屏蔽网线,主要应用在千兆网络中,在传输性能上远远高于超五类网线标准

设备网卡

在怀疑完网线之后,就想是不是设备接口的限制,于是就从路由器开始排查。

路由器

确定是千兆网口

盒子

查了一下 T1 盒子的无线网卡:

  • 双频 WiFi,支持 ac,单天线,2.4G 连接速率 65Mbps,5G 连接速率 433 Mbps

而一查有线网卡,竟然是一个百兆网卡,怪不得比无线还慢。既然有线不能用,那就只能上无线了。

WIFI 带宽不够

首先盒子的无线网卡是支持 802.11 ac 协议的,理论上是没有跑满带宽的,那么就是无线路由器到了上限。300Mbps 是 WNDR3800 标称的传输速度,但是实际即使靠的最近也不大可能达到理论速度的。再者我的 WNDR3800 有线连着一台 NAS,一台 Proxmox 服务器,本来传输压力就有些大,所以我期望无线能达到理论的一半就已经很好了,但实际上我测试,用一台 WNDR3800 有线连接的设备开启 iperf -s,再用一台无线连接,iperf -c IP,测试的结果是 60 Mbits/s 左右。

然后我想起来我还有一台小米路由器 (Mi Wifi 3G),之前因为总是断线所以就收起来了,然后去官网 查了一下配置,发现配置要比我的 WNDR3800 好不少,并且用 Android 连接后可以达到 800Mpbs。

  • 处理器 MT7621A MIPS 双核 880MHz
  • ROM 128MB SLC Nand Flash
  • 内存 256MB DDR3-1200
  • 2.4G 2X2(支持 IEEE 802.11N 协议,最高速率可达 300Mbps)
  • 5G 2X2(支持 IEEE 802.11AC 协议,最高速率可达 867Mbps)
  • 外置全向高增益天线 4 根(2.4G 最大增益 5dBi 2 根 5G 最大增益 6dBi 2 根)
  • 1 个 USB 3.0 接口(DC output:5V/1A)
  • 1 个千兆 WAN 口,两个千兆 LAN 口,LAN 稍微少了点

miwifi 3g specs

所以现在就是要找一个比较稳定的固件了,官方的固件,无疑就是 OpenWrt 了。

IEEE 802.11 a/b/g/n/ac

Protocol

20MHz vs 40MHz 信道宽度

在 OpenWrt

  • 对于 2.4 G 和 20 MHz,最好的 channel band 是 1,6,11
  • 对于 2.4 G 和 40 MHz,最好的 channel band 是 3,11
  • 对于 5G 和 20 MHz, 如果设备都支持最好使用 40 MHz,或者如果路由设备支持可以使用混合模式
  • 对于 5G 和 40 MHz,任何少量信道的 channel 都可以。或者考虑让路由器自动选择最好的 Channel。

Further More

  • Android 上可以使用 WiFiAnalyzer 查看
  • 对于 Windows 可以使用 NetStumbler 来查看附近的网络。

reference


2020-03-31 router , bandwidth , wifi , network

GitLab CI 使用笔记

CI/CD 不必多说。

gitlab ci

CI/CD 解决的问题:

  • 重复劳动
  • 等待时间
  • 手工出错

基本概念

gitlab CI 依赖于项目根目录中定义的 .gitlab-ci.yml 文件,这个文件定义了 GitLab CI 应该做的事情。每次提交代码 GitLab 会检查该文件,然后将该文件定义的内容提交给 GitLab Runner 执行。

CI/CD

  • CI : Continuous integration,持续集成,代码有改动时触发编译、测试、打包等一系列构建操作,最后生成一个可部署的构件。指开发⼈人员在特定分⽀支(频繁)提交代码,⽴立即执⾏行行构建和单元测试,代码通过测试标准后集成到主⼲干的过程。强调的是分⽀支代码的提交、构建与单元测试。
  • Continuous Delivery,持续交付,在持续集成的基础上,将构建的代码部署到「类⽣生产环境」
  • Continuous Deployment, 持续部署,CI 之后自动化地部署或交付给客户使用。

pipeline

gitlab-ci 中配置的所有可执行的 job 称为 pipeline,Pipeline 可以认为是一次构建过程。Pipeline 中可以包含多个 stage.

gitlab-ci-pipeline

在 GitLab 后台可以看到如图,整个过程称为一个 pipeline,这个 pipeline 包括两个 stage(阶段)。每个阶段就只有一个任务,gitlab-ci 在运行时只有当一个 stage 中所有的任务都执行完成才会进入下一个 stage.

首先来对 .gitlab-ci.yml 文件有一个整体的了解。

# 定义 stages
stages:
  - test
  - build

# 定义 job
job1:
  stage: test
  script:
    - echo "test stage"

job1_1:
  stage: test
  script:
    - echo "test stage: job1_1"

# 定义 job
job2:
  stage: build
  script:
    - echo "build stage"

stage

stage 可以理解为阶段,是 gitlab-ci 的概念,流程中的阶段,可以包括测试,编译,发布,部署等,在 .gitlab-ci.yml 文件中会用到。

  • GitLab CI 文件中必须包含至少一个 stage
  • 多个 stage 按照顺序执行
  • 如果其中任何一个 stage 发生错误,之后的所有 stage 都不会被执行。
  • 同样只有所有的 stage 都成功,Pipeline 才会成功

定义:

- stages:
  - build
  - deploy
  - release

job 或者 app

job 或者又被称为 app,由 job 组成 gitlab-ci 的 stage 阶段,多个 job 可以并发执行。

  • 同一个 stage 下的 job 会并行执行
  • 同一个 stage 下的 job 都执行成功,该 stage 才会成功
  • 如果 job 执行失败, 那么该 stage 失败,pipeline 失败,该次构建过程失败

举例:

build_front:
  stage: build
build_backend:
  stage: build

上面两个 app (build_front, build_backend) 将会在 build 阶段并发执行。

variables

gitlab-ci 中集成了很多默认的变量,可以通过 variables 关键字来定义自己的变量,也可以在 gitlab 提供的界面上配置。gitlab 提供的 UI 可以配置全组或者 project 级别的环境变量。

  • group 级别
  • project 级别

比如一些敏感的信息,比如 Nexus 密码,Docker Registry 密码或者密钥之类等等

GitLab Runner

GitLab CI 中是 Runner 真正在执行 .gitlab-ci.yml 中定义的任务,Runner 可以是虚拟机,物理机,Docker 容器或者容器集群。GitLab 和 GitLab Runner 直接通过 API 通信,所以需要保证 GitLab 和 Runner 直接可以通过 HTTP 进行通信。

GitLab Runner 可以分为两种类型: Shared Runner (共享型) 和 Specific Runner(指定)

  • Shared Runner: 所有工程都可以使用,只有系统管理员可以创建
  • Specific Runner: 只有特定的项目可以使用

Install Runner

GitLab Runner 的安装参考官方网站 即可,代码也是开源的.

常用关键词

全部的关键词可以在官网 查看。

script

最常用的一个关键词了,script 定义具体需要执行的任务。

before_script

before_script 定义在每一个 job 之前的任务,必须是 Array 类型。

after_script

after_script 每一个 job 之后执行,即使 job 失败了也会执行,Array 类型。

cache

定义需要缓存的文件或者路径。

Use case

对部分文件修改判断是否触发该阶段

有时候没有修改一些可能需要重新跑 build 的代码,不想 GitLab Runner 空跑,可以使用 only 关键字,以及 change 关键字实现只有部分文件改动后再触发 build.

only: # 下面的条件都成立
  refs: # 下面的分支中任一分支改变
    - release
  changes: # 下面的文件中任一文件发生改变
    - .gitlab-ci.yml
    - Dockerfile

当 release 分支改变,同时 .gitlab-ci.yml 文件或者 Dockerfile 文件发生改变时,触发这个阶段的执行。

多个模块编译方式不同

假如一个项目中集成了很多个模块,而每一个模块中的内容编译方式都不同。那么可以使用 gitlab-ci 提供的 include 关键字,对各个模块进行分拆。在每一个模块下放置 .gitlab-ci.yml 文件,然后再到根目录中创建 .gitlab-ci.yml 文件使用 include 关键字引入进来,对各个模块进行解耦。

include:
  - local: module1/.gitlab-ci.yml
  - local: module2/.gitlab-ci.yml

模板

集成 sonar

Build:
 stage: build
 script:
 - echo 'build projects'
 - "mvn $MAVEN_CLI_OPTS clean compile -Dmaven.test.skip=true"
 - 'mvn $MAVEN_CLI_OPTS -U clean package -Dmaven.test.skip=true'
 - 'mvn $MAVEN_CLI_OPTS sonar:sonar -Dsonar.projectKey=projectname -Dsonar.host.url=http://url -Dsonar.login=xxxxx'

Test:
 stage: test
 script:
 - echo 'test projects'
 - 'mvn $MAVEN_CLI_OPTS clean test'
 only:
  - master
  - staging

reference


2020-03-31 gitlab , git , continuous-integration , continuous-delivery , continuous-deployment , programming

使用命令行远程网络唤起主机

在 Linux 下可以通过 etherwake 命令来网络唤醒设备。

sudo apt install etherwake

检查主机是否支持网络远程唤醒

首先检查 BIOS 中设置,Wake on LAN 是否开启。一般在 BIOS > Power Management > “Wake On LAN” 这个选项下。然后重启进入系统,用如下命令查看网卡 eth0 是否开启了 Wake on LAN:

ethtool eth0

输出:

Settings for eth0:
		Supported ports: [ TP ]
		Supported link modes:   10baseT/Half 10baseT/Full
								100baseT/Half 100baseT/Full
								1000baseT/Full
		Supported pause frame use: Symmetric
		Supports auto-negotiation: Yes
		Supported FEC modes: Not reported
		Advertised link modes:  1000baseT/Full
		Advertised pause frame use: Symmetric
		Advertised auto-negotiation: Yes
		Advertised FEC modes: Not reported
		Speed: 1000Mb/s
		Duplex: Full
		Port: Twisted Pair
		PHYAD: 1
		Transceiver: internal
		Auto-negotiation: on
		MDI-X: off (auto)
		Supports Wake-on: pumbg
		Wake-on: g
		Current message level: 0x00000007 (7)
							   drv probe link
		Link detected: yes

结果中可以一眼就看到:

Supports Wake-on: pumbg
Wake-on: g

如果没有看到这个字样,或者是 off 状态,需要手动启动一下:

ethtool -s eth0 wol g

说明:

  • -s NIC, 我这里的 eth0 是网络接口的设备名,根据不同的设备填写不同,可以通过 ifconfig 来查看
  • wol g 表示设置 Wake-on-LAN 选项使用 MagicPacket.

使用命令远程唤醒

在 Linux 下执行如下命令唤醒设备:

sudo apt install wakeonlan
wakeonlan MAC_ADDRESS

或者

etherwake MAC_ADDRESS

可以通过 ping 命令和 arp 命令来获取局域网中的设备 MAC 地址:

ping -c 4 SERVER_IP && arp -n

reference


2020-03-29 cli , wake-on-lan , linux , etherwake , ethernet , network

Cloud-init 初始化虚拟机配置

在安装 Proxmox 后在它的文档中了解到了 cloud-init。所以就来梳理一下。

cloud-init 是什么

cloud-init 运行在 Guest machine 中,并在初始化时将一些自定义的配置应用到 Guest machine 中的应用程序。 cloud-init 最早由 Ubuntu 的开发商 Canonical 开发,现在已经支持绝大多数 Linux 发行版和 FreeBSD 系统。而目前大部分的公有云都在用 cloud-init 初始化系统配置,cloud-init 也支持部分私有云 (KVM, OpenStack, LXD 等等) 1,已经成为了事实上的标准。

当我们在 AWS,或者 Google Cloud 这些公有云中申请计算资源的时候,云服务的提供商总是会叫我们选择一个系统镜像,然后做一些基础设置 (Hostname, SSH key 等等),然后在此基础上进行系统创建。cloud-init 正是在这个背景下诞生,自动化将用户数据初始化到系统实例中。

cloud-init 的主旨是定义一些独立于操作系统的配置,比如 hostname, networking configuration 等等。

特性:

  • 设置默认的 locale
  • 设置 hostname
  • 生成并设置 SSH 私钥
  • 设置临时的挂载点

Boot Stages

cloud-init 对系统的初始化分为这几个阶段

  • Generator
  • Local
  • Network
  • Config
  • Final

Generator

当系统启动的时候,generator 会检查 cloud-init.target 是否需要启动。默认情况下,generator 会启动 cloud-init. 但是如下情况 cloud-init 不会在开机运行:

  • /etc/cloud/cloud-init.disabled 文件存在时
  • 当内核命令发现文件 /proc/cmdline 包含 cloud-init=disabled 时,当在容器中运行时,内核命令可能会被忽略,但是 cloud-init 会读取 KERNEL_CMDLINE 这个环境变量

Local

Local 阶段会在挂载根分区 / 时,立即执行

cloud-init-local.service

Local 阶段的目的是:

  • 查找 local data source
  • 将网络配置应用到本地

大多数情况下,这个阶段就只会做这些事情。它会在 datasource 中查找,并应用网络配置。网络配置可能从这些地方来:

  • datasource: 云端通过 metadata 提供
  • fallback: 通过 dhcp on eth0,在虚拟机内自行通过 DHCP 获取 IP
  • none: 网络配置可以通过 /etc/cloud/cloud.cfg 中配置 network: {config: disabled} 来禁用

如果是该实例的第一次启动,那么被选中的网络配置会被应用,所有老旧的配置都会会清除。

该阶段需要阻止网络服务启动以及老的配置被应用,这可能带来一些负面的影响,比如 DHCP 服务挂起,或者已经广播了老的 hostname,这可能导致系统进入一个奇怪的状态需要重启网络设备。

cloud-init 然后再继续启动系统,将网络配置应用后启动。

Network

在 local 阶段后,网络服务启动后,启动

cloud-init.service

该阶段需要所有的网络配置已经被应用,并且网络在线,然后才会应用所有的 user-data

  • 递归检索任何 #include 或者 #include-once 包括 http
  • 解压缩任何压缩的内容
  • 运行任何找到的 part-handler

该阶段运行 disk_setmounts 模块,可能会分区并格式化任何配置挂载点(比如 /etc/fstab中)的磁盘。这个模块不能再早运行,因为有可能有些信息来源于网络,只有等网络信息获取到后才能执行。比如用户可能在网络资源中提供了挂载点配置信息。

在一些云服务中,比如 Azure,这个阶段会创建可以被挂载的文件系统。

part-handler 也会在这个阶段运行,包括 cloud-config bootcmd

Config

在网络启动后运行:

cloud-config.service

这个阶段只会运行 config 模块,不会对其他阶段产生影响的模块在这里运行。

Final

启动的最后阶段运行:

cloud-final.service

用户登录系统后习惯于运行的脚本在这个阶段运行,包括:

  • 包安装
  • 配置管理的插件 (puppet, chef, salt-minion)
  • 用户脚本(包括 runcmd)

配置文件地址

cloud-init 配置文件在:

/etc/cloud/cloud.cfg
/etc/cloud/cloud.cfg.d/*.cfg

cloud-init 在配置文件 /etc/cloud/cloud.cfg 中定义了各个阶段需要执行的任务,任务以 module 形式组织。 cloud.cfg 中指定了 set_hostname 这个 module, 则表示 cloud-init 会执行设置 hostname 的任务,但是具体设置的内容由 metadata 指定。

cloud-init 的日志在:

/var/log/cloud-init-output.log: 每一个阶段的输出
/var/log/cloud-init.log: 每一个操作更详细的调试日志
/run/cloud-init: contains logs about how cloud-init decided to enable or disable itself, as well as what platforms/datasources were detected. These logs are most useful when trying to determine what cloud-init ran or did not run.

数据存放在:

/var/lib/cloud

reference


2020-03-28 proxmox , virtual , virtual-machine , cloud-init , ubuntu , linux , openstack

电子书

最近文章

  • 在命令行下给 socks 或者 http 代理测速 在国内不可避免的要用到代理,这些年陆陆续续从 GAE 上的代理,到自己购买 VPS 搭建,从 Shadowsocks 到 V2ray,自己花费了不少的时间,而现在虽然手上也有两台 VPS,但是已经不拿他们作为主要的代理了,我一台 Directspace 的 VPS,线路没有优化过,到国内的延迟略高,而另一台 AWS 的 EC2,虽然地理位置在韩国,也只勉强到能用的阶段。所以这两年陆陆续续不再自己维护代理服务,之前有购买过因为 Ingress 结缘的 Shadowsocks 服务,一直用到现在,虽然有些情况下会发生断流,倒也一直没有放在心上。直到尝试了一周的 V2ray 服务提供商,我想是回不去 SS 了。
  • OpenWrt 学习笔记 硬件
  • 小米路由器 3G 刷机及固件 记录一下小米路由器 3G 的刷机历程,过程步骤是比较简单,但就是配置过程有点心酸,理论上是应该直接就能工作的,但是我的情况比较特殊,想用 OpenWrt 的无线中继来着,但是用别人的固件,和我自己编译的固件都无法在小米路由器 3G 上实现无线中继。
  • 个人的局域网网络设置整理 最近因为想要调查我屋里网络带宽的瓶颈,把整个家里的网络环境整理了一番,也把本来乱七八糟的各种 IP 也梳理了一下。纯粹整理,如果不关心的可以跳过。
  • 没有反思的哀悼聊胜于无 每次禁止娱乐都会让我想起《无限挑战》,最近在系统性了解韩国近代史后,再回来看《无限挑战》,2014 年发生震惊全韩国的世越号沉船事件后,整个韩国陷入巨大的悲痛,当然《无挑》也停播两周,但是两周后播出了长达一个月的《选择特辑》,我经常把他称之为选举特辑,因为 PD 就是用选举人制度让每一个 MC 都体验了一把总统候选人的角色。金 PD 对于这件事情没有直接的回击,反而用一种独特的视角去切入,悲剧既然发生了,我们有办法做到下一次不再犯错吗,有办法弥补当前的过失吗。金 PD 用自己的节目向世人宣告:”有“,那就是“选择”。 每一个人都有选择的权利,只有每一个人都参与到整个社会的运行中,才能阻止这样的事情再此发生。于是后面的事情似乎大多数中国人都比较清楚 —- 朴槿惠被弹劾,新的总统被选上任。当然每个国家都有其自身的问题,但要看整个国家的历史向着哪一边前进。 今天所有的娱乐节目停止,所有线上线下都在哀悼,可是我们哀悼什么呢?不幸染病的普通人?还是连名字都不能提的吹哨人?还是因为病毒而奋战在一线的医护工作者?对我们当然要哀悼,还要铭记。不仅要哀悼当下,还要哀悼这样的事情这已经发生了多少次。为什么每一次都去哀悼,然后再忘记,然后有发生悲剧,然后再哀悼吗?还有多少人还记得 SARS 的吹哨人?还有多少人还记得 SARS 感染的后遗症患者?还有多少人还记得 SARS 第一线的工作人员?说好的不要忘记他们呢?说好的会照顾他们呢?然而当历史车轮碾过的时候,这些曾经的哀悼就像是从来没有存在过。 如今我们要哀悼,我们当然要哀悼,我们不仅要哀悼不幸逝去的人,还有哀悼消失的文字,消失的声音。太多的文字还没有被世人所阅便从虚拟的二进制世界消失了,太多的声音还没被听见就被掐断了声带。于是我反而羡慕起世越号后韩国所保留下的史料,从文字,图像,声音,到画面,每一年都被拿到聚光灯下被审阅,即使已经过去 6 年的今天,依然还有人在为这件事情发声,2020 的奥斯卡大部分的媒体的目光都被《寄生虫》所吸引,但实际还有一部短片《In the Absence》获得了提名。6 年过去了,他们还记得。并且提醒我们这需要被记住。可我们谁还记得长江之上的”东方之星号客轮”的事故,这也是有 442 人死亡的大型事故啊,并且这件事情正好发生在世越号之后一年啊。