JoyLau's Blog

JoyLau 的技术学习与思考

背景

用 gradle 构建经常失败,主要是国内网络的原因,这时候配置 gradle 使用代理,构建过程要轻松许多

做法

  1. JVM system properties
    例如:
    System.setProperty(‘http.proxyHost’, ‘www.somehost.org‘)

  2. 配置 gradle.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
## http
systemProp.http.proxyHost=www.somehost.org
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=userid
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost

## https
systemProp.https.proxyHost=www.somehost.org
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=userid
systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost

背景

docker 仓库存储大量的镜像,占用的空间很大,放到群晖上存储再合适不过了
之前写过基于 docker compose 使用 Harbor 搭建 Docker 私有仓库并管理,但是群晖里只有 docker 的管理,没有 docker compose 的直接支持
现在来个简单的仓库管理

方法

  1. 安装 docker 套件
  2. 下载 registry 和 joxit/docker-registry-ui 镜像
  3. 分别启动这 2 个容器,注意配置

registry 配置

  1. 配置挂载目录
  2. 配置环境变量,因为默认的 registry 镜像不支持跨域请求和没有开启删除镜像的功能,我曾尝试在镜像里修改配置文件,然后在导出镜像,但是失败了,新导出的镜像启动后无法提供服务
  3. 环境配置如下

Synology-Private-Docker

REGISTRY_STORAGE_DELETE_ENABLED:true
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers:[‘Origin,Accept,Content-Type,Authorization’]
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods:[‘GET,POST,PUT,DELETE’,’HEAD’]
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin:[‘*’]
REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers:[‘Docker-Content-Digest’]

后续配置

路由器开启端口映射即可

镜像的删除

首先要说的是,这里有个坑, 官方提供的删除镜像仓库中镜像的接口,仅仅是把 manifest 删除了,真正的镜像文件还存在!官方并没有提供删除镜像层的接口!这也就是说,当我们调用删除镜像的接口之后,仅仅是查看镜像的列表时看不到原镜像了,然而原有镜像仍然在磁盘中,占用着宝贵的文件存储空间

这里使用官方提供的 GC 工具来清除无用文件

删除方式 1

  1. 在 web 界面上删除,或者调用 api 删除:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
获取待删镜像的digest

获取镜像digest的API为:

GET /v2/<tag>/manifests/<version>

例如: /v2/joy/blog.joylau.cn/manifests/1.0

其中,name是仓库名,reference是标签,此时需要注意,调用时需要加上header内容:

Accept: application/vnd.docker.distribution.manifest.v2+json

其中Docker-Content-Digest的值就是镜像的digest

3、调用官方的HTTP API V2删除镜像

删除镜像的API为:

DELETE /v2/<name>/manifests/<sha256>

例如: /v2/joy/blog.joylau.cn/manifests/sha256:6c2daa1642b94dabdfaa32a9d3943cb92036c55117961fa9fcc4cc29348e5d39


其中,name是仓库名称,reference是包含“sha256:”的digest。
  1. 进入容器里调用GC清理镜像文件
1
bin/registry garbage-collect /etc/docker/registry/config.yml

注意: gc不是事务操作,当gc过程中刚好有push操作时,则可能会误删数据,建议设置read-only模式之后再进行gc,然后再改回来

  1. 重启 docker registry
    注意,如果不重启会导致push相同镜像时产生layer already exists错误。

删除方式 2

使用第三方开源工具: https://github.com/burnettk/delete-docker-registry-image

该工具也提供了dry-run的方式,只输出待删除的信息不执行删除操作。在命令后加上——dry-run即可

跟gc方式一样,删除镜像之后要重启docker registry,不然还是会出现相同镜像push不成功的问题。

docker-registry-ui 对于有认证的 docker 私服的配置 [2020-04-09 更新]

对于没有认证的 docker 私服,使用方式上面已经有配置了
对于有认证的 docker 私服,却有点变化
需要改变:

REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods:[‘GET,POST,PUT,DELETE’,’HEAD’]
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin:[‘‘]
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials: [true]

另外,对于有认证的 docker 私服,删除镜像还有有问题的:
具体情况见: https://github.com/Joxit/docker-registry-ui/issues/104

简单来说是 docker 私服的锅,并不是 Joxit/docker-registry-ui 的问题,因为在浏览器再监测是否允许跨域请求发出的 options 请求被返回了 401 状态,导致后续请求无法发出

而实际上应该返回 20x 的请求

作者给出方法是: 将 docker 私服和 docker-registry-ui 放到同一个域下

那我这边还是以 群晖的 docker 来配置 nginx 来实现这样的功能

nginx 配置如下:

  1. /etc/nginx/nginx.conf, 这个没有变化,我们将其外置,方便日后修改:
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
user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}
  1. /etc/nginx/conf.d/default.conf: 这个文件我们添加反向代理,使得 docker 私服和 docker-registry-ui 在同一个域下
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
server {
listen 80;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

#location / {
# #rewrite ^/b/(.*)$ /$1 break;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_pass http://nas.joylau.cn:5007/; # 转发地址,注意要有/
#}

location /v2 {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xxxx:xxx/v2; # 转发地址
}

location /ui {
rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/ui前缀, 否则会出现404
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xxxx:xxx/; # 转发地址,注意要有/
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

访问方式:

  1. docker-registry-ui 的访问直接使用 nginx 的地址, 后面加上 /ui/, 这样就会代理到之前的 docker-registry-ui 的服务
  2. docker registry 的地址直接填 nginx 提供服务的主机 + 端口号即可, 后面不需要加其他东西

这样方式在 docker-registry-ui 连接 docker 私服时会弹框输入用户名密码, 也能完美解决删除镜像的问题

Docker 私服配置 SSL 证书

  1. 去证书申请网站上下载证书, 我的是阿里云的, 下载下来的压缩包里有 2 个文件 .key 和 .pem
  2. 将这 2 个文件上传到 NAS 上, 配置 registry 挂载这 2 个文件, 并配置如下 2 个环境变量, 重启 registry 容器即可
1
2
-e REGISTRY_HTTP_TLS_CERTIFICATE=/server.crt
-e REGISTRY_HTTP_TLS_KEY=/server.key

REGISTRY_HTTP_TLS_CERTIFICATE 这个变量指定的文件可以在挂载的时候将 .pem 直接更名为 .crt 文件

背景

基于 iKuai 软路由系统的单线多拨和多线多拨
家里一条电信 50M 带宽(上行 10M)
一条 100M 的长城宽带(上行 100M, 下行实际外网带宽 10M)
谁不想带宽叠加,网速更快呢

单线多拨

方法

  1. 选择基于物理网卡的混合模式
  2. 勾选开启多拨,并输入个数,我这里是 4, 也就是 4 拨,这个数字是我在电信的网站上,进入我的业务,套餐里看到的,允许 4 个终端拨号上网
  3. 依次在底下列表里添加 4 个拨号项,都是相同的账号和密码
  4. 在多线负载配置中,添加一条规则: 源 IP + 目的 IP + 目的端口,运营商选全部,负载比例 1:1:1:1
  5. 打开 speedtest.cn 进行测速,在线路监控里看到 4 条线路中每一条线路都有流量流过

总结

单线多拨成功, 但是总带宽不叠加,4 条线路的总带宽还是 50M,应该是运营商做了端口限制,暂时无解

多线多拨

方法

  1. 2条带宽均选择 ADSL/PPPoE 拨号,并正常拨号成功上网
  2. 网络设置 > DNS设置 > DNS设置中首选DNS配置成 192.168.1.1, 并开启 DNS加速服务, DNS加速模式选择代理模式,勾选强制客户端DNS代理
  3. 在多线负载配置中,添加一条规则: 源 IP + 目的 IP + 目的端口,运营商选全部,负载比例 1:1:1:1
  4. 打开 speedtest.cn 进行测速,在线路监控里看到 2 条线路中都有流量流过,并且都能达到峰值

总结

多线多拨并宽带叠加成功,但是部分网页会打不开,游戏也会掉线,因为目的地址有 2 个,这是需要配合其他的策略进行负载均衡,具体配置根据实际情况来添加

背景

Video Station 自带的削刮器好像并不是很好用,很多电视剧都搜不到元数据,换了豆瓣的就比较好用了

安装方法:

  1. 开启DSM的ssh,并登入
  2. 执行一句话安装:
1
sudo wget -N --no-check-certificate https://sh.9hut.cn/dsvp.sh && sudo bash dsvp.sh install

卸载方法:

  1. 开启DSM的ssh,并登入
  2. 执行一句话卸载:
1
sudo wget -N --no-check-certificate https://sh.9hut.cn/dsvp.sh && sudo bash dsvp.sh uninstall

背景

安装的黑群晖发现无法使用 video station 的缩略图和转码功能,使用的体验性大大减少
上 google 搜寻得知,半洗白即可解决上述问题

半洗白和全洗白的区别

  • 全洗白: 群晖的所有功能都可以使用
  • 半洗白: 只需要正确的序列号即可,mac 地址不合法也无所谓,可以使用视频的缩略图和转码功能,但是无法使用 qc 功能

如何半洗白

只要获取到正确的 sn 码即可

DDSM

  1. 安装 docker 套件
  2. 控制面板 > 网络 > 网络界面 > 管理 > Open vSwitch 设置 , 启用 Open vSwitch
  3. 手动下载文件在上传安装,启动一个新的 DSM
  4. 查看新的 DSM 的序列号,并记录下来
  5. 使用 U 盘的 PE 系统启动, 使用 diskgeuneis 修改 ESP 分区里的 grub.cfg 的文件中 sn 码
  6. 重启即可

Google 图片搜索

在 google 图片里搜索和黑群晖版本一直的系统信息的图片,记录下来自己使用,[手动阴险]

我的方法

我是看的人家的开箱视频,开机体验,打开系统信息的时候没有打码,让我看到了序列号,我就拿来用了,再次 [手动阴险]

背景

之前使用的是二合一的引导安装黑群晖系统,进入系统中发现一个 9G 的存储空间,顺手就把他删除了,重新建了个存储池,把 mSATA 盘上的引导折腾没了,无法进入系统
在 PE 系统下发现无法读取数据盘的数据
那么重做系统后如何恢复数据?

方法

使用计算机和 Ubuntu live CD 恢复其硬盘上存储的数据。
确保 Synology NAS 硬盘上运行的文件系统是 EXT4 或 Btrfs

做法

  1. 准备一台具有足够数量硬盘插槽的计算机,用于安装从 Synology NAS 卸下的硬盘。
  2. 从 Synology NAS 中卸下硬盘,然后将其安装到计算机中。对于 RAID 或 SHR 配置,必须同时在计算机中安装所有硬盘(不包括 Hot Spare 硬盘)。
  3. 在 Windows 上创建可启动 U 盘中的说明准备 Ubuntu 环境。
  4. 打开终端
  5. 如果要从 RAID 或 SHR 配置恢复数据,请执行步骤 6 到 9;如果要从只有一个硬盘的基本存储类型恢复文件,请执行步骤 9。
  6. 输入以下命令(sudo 执行 root 权限)。
    • Ubuntu@ubuntu:~$ sudo -i
  7. 输入以下命令以安装 mdadm 和 lvm2两者都是 RAID 管理工具。必须安装 lvm2,否则 vgchange 无法正常工作。
    • root@ubuntu:~$ apt-get update
    • root@ubuntu:~$ apt-get install -y mdadm lvm2
  8. 输入以下命令以装载从 Synology NAS 中卸下的所有硬盘。根据 Synology NAS 上的存储池配置,结果可能有所不同。
    • root@ubuntu:~$ mdadm -Asf && vgchange -ay
  9. 输入以下命令以采用只读方式装载所有硬盘,从而可访问数据。在 ${device_path} 中输入设备路径,并在 ${mount_point} 中输入装载点。数据会放在装载点下。
    • $ mount ${device_path} ${mount_point} -o ro

Ubuntu 启动盘制作

要求

  • 一个4GB或更大的 U 盘
  • Microsoft Windows XP或更高版本
  • Rufus,一款免费的开源工具
  • 一个Ubuntu ISO 文件

选择

背景

前一段时间矿难,坑了 20 亿, 5600 多的矿机现在 200 多的甩卖

蜗牛星际

蜗牛星际指的是这批矿机的名字, 现一共有四款
型号根据网口数据不一样也有不一样的叫法。一个网口称为单,两个网口称为双。
分别有:A单,A双;B单,B双;C单,C双;D单。
下面是网络上整理的一个表单

我买的是 B 款单网口的 intel i211 的网卡
双网卡,还有一个网卡是 82583 需要短接主板上 2 个触电可完美使用双千兆

安装黑群晖

方式一

U 盘作为引导启动盘, 系统装入主板上的 16 G SATA 盘

方式二

将引导系统和系统主程序都装入 sata 盘上

我选择的是第二种,因为我不想插着个 U 盘在后面的主板上,而且我也没有那么小的U盘

方式一安装步骤

  1. 所需资料: 链接: https://pan.baidu.com/s/1Dk220UoOpDFuTjSV9dUAHw 提取码: c32z
  2. 插入优盘, 使用芯片精灵查看 U盘的 vid 和 pid ,记录下来
  3. 将引导系统写入 U 盘
  4. 打开 U盘,找到 grub.cfg 文件,修改 pid 和 vid 和 U 盘中的一致即可
  5. 重启
  6. 找到机器的 IP,在浏览器上打开,端口默认是 5000, 在线安装最先的版本即可

方式二安装步骤

  1. U 盘上安装一份 PE 系统,这里推荐使用微 PE
  2. 将系统镜像 和 写盘工具 拷贝到 U 盘上:链接: https://pan.baidu.com/s/1T2KibqcSi6t99BPq8VQA7g 提取码: y7x5 ; 链接: https://pan.baidu.com/s/1QhAkpGxjYoJiKGgMSdFhyQ 提取码: 1s45
  3. 进入 PE 系统,使用 diskgenius 删除 ssd 上的所有分区,再使用写盘工具将镜像写入 ssd 上
  4. 重启系统

如何洗白?

想要洗白, 修改 grub.cfg 配置文件的 sn 和 mac 地址即可
mac 地址需要是 001132 开头的
这就需要修改机器的物理 IP
我这里提供一个方法: 链接: https://pan.baidu.com/s/1km_LpQprkxPvpQOoe8Pq9w 提取码: qsvd
SN 需要算号器,我这里提供个工具: 链接: https://pan.baidu.com/s/1-k9Wp82occb6IzUxt37EBw 提取码: yxj6

建议

  1. 自带的 ZUMAX 电源并不是很好,带 4 块硬盘怕只能呵呵,想稳定点还是换个好点的电源,我换了台达 80 金牌 DPS-400AB-12A 1U 电源
  2. 有条件的话,硬盘的背板也还是换了吧,看着做工不是很好

关于洗白

个人的建议是:不要洗白!

  1. 因为洗白的主要是用群晖的快连功能,但是据我所用快连的速度并不是很好,还不如自建内网穿透服务
  2. 容易被检测出来,容易被封号,一旦被封号,系统显示硬盘损毁,数据拷贝不出来,就损失大了

黑群一时爽,一直黑群一直爽

背景

上篇说到了家里使用多条宽带,而一般的路由器无法使用多个运营商的宽带进行拨号,这就需要软路由了,其实也就是个小主机

实机

看下我攒的把

硬件配置

主要硬件

  • CPU Intel(R) Atom(TM) CPU D525 @ 1.80GHz | 512 KB | 1796 MHz | ×4
  • 硬盘 ATA DragonDiamond D2 5 (3.75GB)
  • 内存 2037MB
  • 主板芯片:Intel Corporation Atom Processor D4xx/D5xx/N4xx/N5xx DMI Bridge (rev 02)
  • 网卡:Intel Corporation 82583V Gigabit Network Connection (eth0 20:90:30:e8:2f:99)
  • 网卡:Intel Corporation 82583V Gigabit Network Connection (eth1 20:90:30:e8:2f:9a)
  • 网卡:Intel Corporation 82583V Gigabit Network Connection (eth2 20:90:30:e8:2f:9b)
  • 网卡:Intel Corporation 82583V Gigabit Network Connection (eth3 20:90:30:e8:2f:9c)

其它硬件

  • 显卡:Intel Corporation Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics Controller (rev 02)
  • USB控制器:Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 (rev 03)
  • USB控制器:Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 (rev 03)
  • USB控制器:Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 (rev 03)
  • USB控制器:Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 03)
  • USB控制器:Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 (rev 03)
  • USB控制器:Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 (rev 03)
  • USB控制器:Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 03)
  • PCI桥:Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 (rev 03)
  • PCI桥:Intel Corporation 82801H (ICH8 Family) PCI Express Port 2 (rev 03)
  • PCI桥:Intel Corporation 82801H (ICH8 Family) PCI Express Port 3 (rev 03)
  • PCI桥:Intel Corporation 82801H (ICH8 Family) PCI Express Port 4 (rev 03)
  • PCI桥:Intel Corporation 82801H (ICH8 Family) PCI Express Port 5 (rev 03)
  • PCI桥:Intel Corporation 82801 Mobile PCI Bridge (rev f3)
  • IDE接口:Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) IDE Controller (rev 03)
  • IDE接口:Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode] (rev 03)
  • SMBus:Intel Corporation 82801H (ICH8 Family) SMBus Controller (rev 03)

我的使用

  1. 四个网口,2 个作为 WAN 口,一个电信宽带,一个长城宽带,一个作为 LAN 口,接台式机,最后一个作为 LAN 口,接路由器的 LAN 口提供 WIFI
  2. 2 个宽带使用负载均衡实现宽带叠加
  3. 端口分流,实现 WIFI 设备走长城宽带的流量,台式机和一些静态的 DHCP 的 IP 走电信流量
  4. 还有一些端口映射和 DMZ 主机和动态域名绑定等普通路由器的功能 (支持 阿里云的 DDNS, 提供 accessKey 和 Access Key Secret 即可)

花费

目前这样的配置完全跑个软路由系统绰绰有余了, 我用的是 iKuai, CPU 温度在 22 度左右, CPU 使用率低于 10%, 内存使用率 20% 左右
全部花费 234 元

0%