JoyLau's Blog

JoyLau 的技术学习与思考

步骤

  1. 下载 minio/mc 项目
  2. 分别添加源服务器和目标服务器: ./mc.exe config host add local http://10.55.3.131:9000 "AKIAIOSFODNN7EXAMPLE" " wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
  3. 按桶进行迁移: ./mc.exe mirror local/blacklist new/blacklist

说明

Open VPN 的客户端不做特殊配置无法同时连接多个服务器,会出现异常。提示设备已在使用

解决

进入 openVPN 的安装目录,以管理员的身份执行 addtap.bat 文件即可, 可在网络适配器里看到多出一块虚拟网卡

第一步: 磁盘分区

  1. 使用 fdisk -l 查看本机磁盘分区情况
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
[root@localhost core]# fdisk -l

磁盘 /dev/vda:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000b2efb

设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 167772159 82836480 8e Linux LVM

磁盘 /dev/vdb:1610.6 GB, 1610612736000 字节,3145728000 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/mapper/centos-root:51.3 GB, 51308920832 字节,100212736 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/mapper/centos-swap:8455 MB, 8455716864 字节,16515072 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/mapper/centos-home:25.1 GB, 25052577792 字节,48930816 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

CentOS 默认挂载盘无法超过 2T, 需要挂载超过 2T 的磁盘,需要先对磁盘的分区方式进行转换成 GPT

转换方式:

1
2
3
4
5
6
parted /dev/vdb

mklabel
gtp
quit

可以看到一个 /dev/vdb 的设备没有使用

  1. 执行分区:
  • fdisk /dev/vdb
  • m 显示命令列表
  • n 新增分区
  • p 主分区
  • 1
  • enter
  • enter
  • w 写入并退出
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
[root@localhost core]# fdisk /dev/vdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xc83c3572 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-3145727999,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-3145727999,默认为 3145727999):
将使用默认值 3145727999
分区 1 已设置为 Linux 类型,大小设为 1.5 TiB

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

第二步: 格式化磁盘

通知内核重新读取分区信息 partprobe /dev/vdb

先执行 blkid 查看磁盘的格式

如果是 xfs 格式,执行下面的命令

mkfs -t xfs /dev/vdb1

如果是 ext4 的话

mkfs -t ext4 /dev/vdb1

1
2
3
4
5
6
7
8
9
10
[root@localhost core]# mkfs -t xfs /dev/vdb1
meta-data=/dev/vdb1 isize=512 agcount=4, agsize=98303936 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=393215744, imaxpct=5
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=191999, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

第四步: 创建目录并挂载

1
2
[root@localhost core]# mkdir /data
[root@localhost core]# mount /dev/vdb1 /data

第五步: 永久挂载

vim /etc/fstab

在最后添加如下一行:

1
/dev/vdb1               /data                   xfs     defaults        0 0

保存生效: mount -a

最后: 查看磁盘挂载情况

lsblk -f

1
2
3
4
5
6
7
8
9
10
11
[root@localhost core]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sr0
vda
├─vda1 xfs cf67c6bc-85c1-4859-a9a2-a3af7641605f /boot
└─vda2 LVM2_member b1HmqI-N1Hq-7cyC-kHUK-iz2K-fzCx-f8Rq2T
├─centos-root xfs cf439706-cf84-4396-a2af-df169a13bdc0 /
├─centos-swap swap 700878b0-cf1b-406d-bb8f-db6af815f83a [SWAP]
└─centos-home xfs 8c6b2b1b-48c4-4860-bc96-a5a0101b1c91 /home
vdb
└─vdb1 xfs 654bab72-7006-4341-a0f6-889130cb15e9 /data

扩展现有磁盘 (LVM 格式)

比如在虚拟机情况下,原来给虚拟机分配的磁盘大小是 100G,后来发现不够用了,在虚拟机操作界面将 100G 扩容到了 200G,然后多出来的 100G, 扩容到现有系统的 /home 目录下

按以下操作即可实现

扩展分区

fdisk -l

1
2
3
4
5
6
7
8
9
10
fdisk /dev/sda
n
p
3
回车
回车
t
L
8e
w

加载分区表

partprobe

创建物理卷

pvcreate /dev/sda3

使用 pvdisplay 可查看当前物理卷的相关信息

将物理卷扩容到现有的卷组

vgextend centos /dev/sda3

使用 vgdisplay 可查看卷组的信息

将卷组中空闲空间扩容到 home 分区

lvextend /dev/mapper/centos-home /dev/sda3

使用 lvdisplay 可查看逻辑卷的信息

刷新 home 分区,在线扩容

xfs_growfs /dev/mapper/centos-home

使用 df -khlsblk 查看磁盘挂载情况

扩展现有磁盘 (非 LVM 格式)

在现有的环境中 /data 目录下挂载一块 1T 的存储盘, 非 LVM 格式,现在,新加了一块 2T 的硬盘,想要扩展到 /data 目录下,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@server-62 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 50G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 49G 0 part
├─centos-root 253:0 0 45.1G 0 lvm /
└─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
vdb 252:16 0 64M 0 disk
└─vdb1 252:17 0 63M 0 part
vdc 252:32 0 1000G 0 disk
└─vdc1 252:33 0 1000G 0 part /data
vdd 252:48 0 2T 0 disk

简单说下处理方式,还是转为 LVM 格式,将 2 块硬盘都加入逻辑卷,然后将原来数据花园

备份现有 /data 目录的数据,注意原先目录的权限, 比如
cp -a /data/ /home/backup/

卸载原先磁盘,并删除分区

1
2
3
4
umout /dev/vdc1
fdisk /dev/vdc
d
w

编辑 /etc/fstab 注释掉目录挂载

创建物理卷

1
2
pvcreate /dev/vdd
pvcreate /dev/vdc

创建卷组, 并命名为 vg_data

1
vgcreate vg_data /dev/vdd

将物理卷 /dev/vdc 加入卷组

1
vgextend vg_data /dev/vdc

查看信息

1
2
3
pvdisplay
vgdisplay
vgs

创建逻辑卷, 并命名为 lv_data, 100% 使用

1
lvcreate -l 100%VG -n lv_data vg_data

查看信息

1
lvdisplay

格式化

1
mkfs -t xfs /dev/vg_data/lv_data

最后,创建目录挂载

1
2
3
4
5
vim /etc/fstab
/dev/mapper/vg_data-lv_data /data xfs defaults 0 0

mount -a
lsblk

如果 mount -a 发现挂载不上, 可执行 systemctl daemon-reload 或重启解决

扩展逻辑卷

参考文档

扩容分区和文件系统

参考文档

转换MBR分区为GPT分区

参考文档

背景

使用 docker run -p 或者 docker compose 启动暴露的端口的容器, 会直接穿透防火墙, 不受系统防火墙的 firewalld 的管控

原因

docker 容器会在启动的时候向 iptables 添加转发的规则
而 firewalld 也是通过操作 iptables 来实现的防火墙的功能

1
2
3
4
5
6
7
[root@centOS7 es-test]# iptables -L DOCKER
Chain DOCKER (3 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.18.0.2 tcp dpt:xic
ACCEPT tcp -- anywhere 172.20.0.2 tcp dpt:vrace
ACCEPT tcp -- anywhere 172.20.0.2 tcp dpt:wap-wsp

可以看到是 anywhere

解决方式

第一种 禁用 docker 操作 iptables

在 /etc/docker/daemon.json 配置禁用 iptables:

1
2
{"iptables": false}

之后重启 docker 服务, 可以看到 docker 不会自动往 iptables 里添加规则了

这种方式有个弊端: 就是容器之间无法互相访问, 而且容器里的程序也无法访问外部网络

解决方式:
在防火墙里开始 net 转发:

配置 /etc/firewalld/zones/public.xml

1
2
3
4
5
6
7
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<masquerade/>
</zone>

或者使用下面的方式添加 iptables 规则

1
firewall-cmd --zone=public --add-masquerade

之后使用 firewall-cmd –restart 或者 systemctl restart firewalld 使配置生效即可

但是这样做还有个问题, 就是所有访问容器的程序对于容器来说 IP 的变成的网关的 IP
这样的问题对于一些需要特定限制一些 IP 地址来源的应用和使用 IP 地址来作区分的应用来说就有很大问题, 比如注册中心
目前没有找到什么方式解决这个问题

第二种 容器直接指定主机网络

docker run 的时候不显式暴露端口 -p 什么的, 使用 –net host 的形式直接将容器的端口绑定到宿主机上

docker compose 运行的时候使用:

1
2
3
4
version:  '3.2'
services:
abc:
network_mode: "host"

Maven 私服 Nexus3 因磁盘爆满而导致的无法启动的问题

背景

同事在 Nexus3 私服的宿主机上部署了一个服务, 结果因为网络问题导致服务打印大量的日志信息, 将宿主机的磁盘撑爆了,经过一系列排除, 删除了大日志文件
重启 Nexus3 容器,发现无法启动了, 报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
com.orientechnologies.orient.core.exception.OStorageException: Cannot open local storage '/nexus-data/db/config' with mode=rw
DB name="config"
at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.open(OAbstractPaginatedStorage.java:323)
at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.open(ODatabaseDocumentTx.java:259)
at org.sonatype.nexus.orient.DatabaseManagerSupport.connect(DatabaseManagerSupport.java:178)
at org.sonatype.nexus.orient.DatabaseManagerSupport.createInstance(DatabaseManagerSupport.java:312)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.sonatype.nexus.orient.DatabaseManagerSupport.instance(DatabaseManagerSupport.java:289)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175)
Caused by: java.lang.NullPointerException: null
at com.orientechnologies.orient.core.storage.impl.local.paginated.wal.ODiskWriteAheadLog.cutTill(ODiskWriteAheadLog.java:919)
at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.makeFullCheckpoint(OAbstractPaginatedStorage.java:3706)
at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.recoverIfNeeded(OAbstractPaginatedStorage.java:3937)
at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.open(OAbstractPaginatedStorage.java:288)
... 14 common frames omitted

解决

  1. 进入宿主机存放 Nexus3 数据目录下

先对该目录分配用户和用户组:

1
chown -R 200 /home/transport/maven-repos-data

分别删除 db/config 目录下和 db/component 目录下的所有的 .wal 文件

1
2
3
4
5
6
7
cd /home/transport/maven-repos-data/db/config

rm -rf *.wal

cd /home/transport/maven-repos-data/db/component

rm -rf *.wal
  1. 找到容器中的 nexus-orient-console.jar jar 包
1
find / -name nexus-orient-console.jar

进入上述目录, 我这里是: /var/lib/docker/overlay2/3b9c8d7685a03dcbb9ee69c33cd8fd9b487d980731596da27e7639854c0bb6e1/diff/opt/sonatype/nexus/lib/support

执行 java -jar nexus-orient-console.jar , 来连接数据库

1
connect plocal:/home/transport/maven-repos-data/db/component admin admin

执行下列命令进行修复, 修复完成并退出:

1
2
3
4
5
6
7
rebuild index *

repair database --fix-links

disconnect

exit
  1. 数据目录重新授权
1
chmod 777 -R /home/transport/maven-repos-data/db
  1. 重启容器

Maven 私服 Nexus3 忘记 admin 用户密码的解决

如上述步骤描述的, 运行 nexus-orient-console.jar

进入 security 数据库:

1
connect plocal:/home/transport/maven-repos-data/db/security admin admin

将 admin 用户密码重置为 admin123

1
update user SET password="$shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==" UPSERT WHERE id="admin"

数据目录重新授权

1
chmod 777 -R /home/transport/maven-repos-data/db

清理 brew

  1. brew cleanup
  2. brew cleanup –prune 1 #清理早于 1 天的

防止 mac 锁屏后关闭显示器的方法

brew cask install keepingyouawake

zsh 对 docker 命令的自动提示

  1. 首先确定安装好了 oh-my-zsh
  2. 在文件 ~/.zshrc 文件中启用 docker docker-compose, 下面是我启用的插件

参考: https://docs.docker.com/compose/completion/

1
plugins=(git gradle mvn node npm brew yarn docker docker-compose)

zsh 插件推荐

  1. 自动补全插件 zsh-autosuggestions

这里利用Oh my zsh的方法安装。直接一句话命令行里下载并移动到 oh my zsh 目录中:

1
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

然后在 ~/.zshrc 文件中找到 plugins 数组,加入 zsh-autosuggestions 名字,重新打开终端即可。

  1. 语法高亮插件 zsh-syntax-highlighting

将插件下载到oh my zsh的插件目录下的该新建插件同名文件夹中

1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting

编辑 ~/.zshrc 文件将然后将插件引用命令写入该文件最后一行(必须)

1
source "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"

保存重新打开即可看到高亮的命令行了。

简介

组装一台黑苹果最重要的是硬件的选择, 选择的重点是尽量选择与白苹果一致的配件
在硬件选择的方面有几点需要特别的注意

  1. CPU 的选择,CPU尽量选择 Intel 的,7/8/9代 酷睿 i9,i7,i5,i3 都可以, AMD 的CPU 也不是不行, 只不过需要打补丁,折腾的东西比较多
  2. 显卡的选择, 白苹果的显卡都是 A 卡, 所以在显卡的选择上直接选择 A 卡即可, 选择 A 卡需要注意的是,直接选择免驱动的 A 卡类型, 首选蓝宝石和微星的,下面列举了一些免驱的 A 卡
  • Vega FE (真正免驱,无需搭配集显也可完全硬件加速)
  • Vega 64 (真正免驱,无需搭配集显也可完全硬件加速)
  • Vega 56 (真正免驱,无需搭配集显也可完全硬件加速)
  • Vega Nano (真正免驱,无需搭配集显也可完全硬件加速)
  • Pro SSG (真正免驱,无需搭配集显也可完全硬件加速)
  • WX 9100 (真正免驱,无需搭配集显也可完全硬件加速)
  • WX 8200 (真正免驱,无需搭配集显也可完全硬件加速)
  • RX 590
  • RX 580 (注意,缩水的阉割版2048SP的RX580马甲卡不是免驱的,标准2304SP才是免驱卡)
  • RX 570
  • RX 560 (个别型号的HDMI/DVI输出黑屏,需要改FB,DP输出没问题)
  1. 主板的选择,华硕,微星,技嘉 的 主板推荐选择, 8/9代酷睿首选Z390/Z370芯片组
  2. 硬盘的选择,三星 970 EVO Plus 和 三星 PM981 无法做为macOS系统盘安装原版,不要选择
  3. 显示器的选择,首选 4K 显示器,2K 以下的显示器需要开启 HiDPI,而且使用体验不好
  4. 无线网卡和蓝牙的选择,主板自带的WI-FI和蓝牙目前都无法驱动, 这个无解, 推荐免驱的 BCM94360CD 或者 BCM943602CS,直接插上即可使用

配置

先贴出我本次的黑苹果主机的配置信息, 如下:

项目 型号 价格 链接
CPU Intel i9-9900K 8核16线程 盒装CPU 2899 https://item.jd.com/100000634429.html
主板 技嘉(GIGABYTE)Z390 AORUS PRO WIFI 956 https://item.jd.com/100000612305.html
内存 金士顿(Kingston) DDR4 3200频 128GB(32G×4) 4409 https://item.jd.com/100008221061.html
硬盘 三星970 EVO 1TB M.2接口(NVMe) 1087 https://item.jd.com/7234468.html
显卡 蓝宝石 RX 580 2304sp 8G 满血版 (淘宝二手) 1238 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.661e2e8d5l686T&id=614820302674&_u=425lenq48296
散热器 九州风神大霜塔 179 https://item.jd.com/689273.html
电源 长城 750W 全模组金牌电源 490 https://item.jd.com/8025804.html
显示器 戴尔 U2720QM 27英寸4K 3468 https://item.jd.com/100011317048.html
无线网卡 BCM94360CD 265 https://item.jd.com/10021401339167.html
鼠标 罗技 MX Master 3 for Mac 668 https://item.jd.com/100014681386.html
键盘 Keychron K6蓝牙双模机械键盘 青轴 327 https://item.jd.com/100007939581.html
机箱 先马(SAMA)剑魔升级版 179 https://item.jd.com/100007087962.html
其他 RGB风扇 x3 / DP 线 1.4版 130 https://item.jd.com/100007577985.html https://item.jd.com/100008069617.html
总计 16295

效果图

效果图-1

效果图-2

系统信息

设备信息

CPU得分

CPU超频

Power 显示的是当前 CPU 的功率;

Frequency 显示当前 CPU 的频率;

Temperature 显示当前 CPU 的温度,此温度是内核温度;

Utilization 显示当前 CPU 的占用率。

显卡 Metal 得分

显卡 OpenCL 得分

磁盘速度

步骤

准备工作

  1. 一个容量大于等于 16G 的 U 盘
  2. 一台macOS操作系统的主机
  3. 下载 Mac 版的软件 balenaEtcher (https://www.balena.io/etcher/)
  4. 软件 Hackintool (https://github.com/headkaze/Hackintool)

准备安装镜像

  1. App Store 下载最新的操作 MacOS 操作系统,下载完成之后就可以在“应用程序”中找到
  2. 创建DMG文件: 打开“磁盘工具”,创建空白镜像,命名为 MyMacOS, 根据所下载的镜像的大小,分配一个合理的镜像大小,格式选择日志式,分区选择 GUID 分区类型,权限选择读写
  3. macOS 系统上的主机上 插入 U 盘,输入以下命令格式化 U 盘
1
diskutil partitionDisk /dev/{YOUR_DISK_ID} GPT JHFS+ "USB" 100%
  1. 双击打开 MyMacOS.dmg 文件进行挂载,输入如下命令,将下载的系统镜像文件写入 DMG 镜像中
1
sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/MyMacOS
  1. 使用 balenaEtcher 将 MyMacOS.dmg 镜像刷入 U 盘中
  2. 使用 Hackintool 挂载 U 盘的 UEFI 分区,将我已经配置好的 USB_EFI 整个目录拷贝进去, 并且重命名为 EFI,之后卸载分区

BIOS 配置

在技嘉官网下载最新版 Z390 主板的 BIOS 固件(https://www.gigabyte.cn/Motherboard/Z390-AORUS-PRO-WIFI-rev-10/support#support-dl-driver)并刷入

当前最新版本 F12j
进行如下配置:

  • Load Optimized Defaults
  • Settings -> IO Ports -> Internal Graphics -> Enabled
  • Settings -> IO Ports -> DVMT Pre-Allocated -> 32M
  • Settings -> IO Ports -> Wi-Fi -> Disabled
  • Settings -> IO Ports -> Above 4G Decoding -> Enabled
  • Settings -> IO Ports -> Wake on LAN Enable -> Disabled
  • Settings -> IO Ports -> USB Configuration -> Legacy USB Support -> Disabled
  • Settings -> IO Ports -> USB Configuration -> XHCI Hand-off -> Enabled
  • Settings -> Miscellaneous -> Software Guard Extensions(SGX) -> Disabled
  • Settings -> Miscellaneous -> Trusted Computing -> Security Device Support -> Disabled
  • Boot -> CFG Lock -> Disabled

安装

  1. 插入 U 盘,启动时按 F12 进入启动设备选择, 选择 OpenCore, 之后选择安装 MacOS 选项
  2. 耐心等待跑码安装完毕, 之后会进入 MacOS 的安装界面, 先进入磁盘工具, 将要安装系统的那个硬盘抹掉, 格式选择 APFS,之后再安装 MacOS 系统, 之后等待重启
  3. 重启依然要使用 U 盘进行引导,进入硬盘里的 MacOS 系统
  4. 到这里整个系统的安装以及完成了一半了
  5. 注意此时进入系统是千万不要登入自己的 iCloud 账号进行使用,需要在下面生成并注入了序列号之后才可以安全的登录

后续完善

更换 EFI

使用 Hackintool 挂载 硬盘的 UEFI 分区,并且将我配置好的 EFI 目录复制进去,进行覆盖

USB 端口的配置

有 MacOS 系统的限制, 最多只允许开始使用 15个端口, 我这里就 Z390 的主板进行下面端口的开启
背面端口图
主板接口图

使用 Hackintool, 修改端口, 并导出, 注意保留 USBPorts.kext 文件以放入 Kexts 目录下, 我这里开启的端口如下配置
启用的端口

关闭啰嗦模式

找到 配置文件中的

1
2
<key>boot-args</key>
<string>-v keepsyms=1 agdpmod=pikera slide=0 shikigva=80</string>

去掉 -v

生成序列号

使用 Hackintool 生成序列号,选择的类型为 iMac (Retina 5K, 27-inch, 2019)
之后到官网查询,如果提示序列号不合法,则该序列号可用,这时候可以将其注入以下部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dict>
<key>AdviseWindows</key>
<false/>
<key>SystemMemoryStatus</key>
<string>Auto</string>
<key>MLB</key>
<string>M0000000000000001</string>
<key>ProcessorType</key>
<integer>0</integer>
<key>ROM</key>
<data>ESIzRFVm</data>
<key>SpoofVendor</key>
<true/>
<key>SystemProductName</key>
<string>iMac19,1</string>
<key>SystemSerialNumber</key>
<string>W00000000001</string>
<key>SystemUUID</key>
<string>00000000-0000-0000-0000-000000000000</string>
</dict>

分别是 MLBSystemSerialNumberSystemUUID

OpenCore 配置列表

OpenCore EFI

Download OpenCore RELEASE from here

ACPI

  • SSDT-EC-USBX.aml
  • SSDT-PLUG.aml
  • SSDT-HPET.aml
  • SSDT-PMC.aml

Driver

  • HfsPlus.efi
  • OpenRuntime.efi - Included in OpenCore package

Kext - Make sure to download RELEASE version

Tools

  • modGRUBShell.efi
  • OpenShell.efi - Included in OpenCore package
  • ResetSystem.efi - Included in OpenCore package
  • CleanNvram.efi - Included in OpenCore package

config.plist

  • Use config_usb.plist for installation media(USB). Rename it to config.plist.
  • Use config.plist for internal boot disk.

EFI Folder Structure

USB
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
EFI
├── BOOT
│   └── BOOTx64.efi
└── OC
├── ACPI
│   ├── SSDT-EC-USBX.aml
│   ├── SSDT-HPET.aml
│   ├── SSDT-PLUG.aml
│   └── SSDT-PMC.aml
├── Bootstrap
│   └── Bootstrap.efi
├── Drivers
│   ├── HfsPlus.efi
│   └── OpenRuntime.efi
├── Kexts
│   ├── AppleALC.kext
│   ├── IntelMausi.kext
│   ├── Lilu.kext
│   ├── SMCProcessor.kext
│   ├── SMCSuperIO.kext
│   ├── USBInjectAll.kext
│   ├── VirtualSMC.kext
│   └── WhateverGreen.kext
├── OpenCore.efi
├── Tools
│   ├── CleanNvram.efi
│   ├── OpenShell.efi
│   ├── ResetSystem.efi
│   └── modGRUBShell.efi
└── config.plist
SSD/NVME/HDD
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
EFI
├── BOOT
│   └── BOOTx64.efi
└── OC
├── ACPI
│   ├── SSDT-EC-USBX.aml
│   ├── SSDT-HPET.aml
│   ├── SSDT-PLUG.aml
│   └── SSDT-PMC.aml
├── Bootstrap
│   └── Bootstrap.efi
├── Drivers
│   ├── HfsPlus.efi
│   └── OpenRuntime.efi
├── Kexts
│   ├── AppleALC.kext
│   ├── IntelMausi.kext
│   ├── Lilu.kext
│   ├── SMCProcessor.kext
│   ├── SMCSuperIO.kext
│   ├── USBPorts.kext
│   ├── VirtualSMC.kext
│   └── WhateverGreen.kext
├── OpenCore.efi
├── Tools
│   ├── CleanNvram.efi
│   ├── OpenShell.efi
│   ├── ResetSystem.efi
│   └── modGRUBShell.efi
└── config.plist

工作状态

目前一切都正常工作,包括声卡,网卡,Wi-Fi,蓝牙,Airdrop,随航,接力,显示分辨率,睡眠,关机,重启

遇到的坑

  1. 我买的主板CPU针脚上有一个针脚弯曲了, 导致有2 个内存插槽无法读取, 如下图

CPU针脚

CPU针脚弯曲

这种情况的具体表现是只有插在主板的 DDR4_A1 槽或者 DDR4_A2 槽或者 2 个槽都插时才能短接进入 BIOS 界面,
插入全部 4 根内存条或者只要插入 DDR4_B2 或者 DDR4_B1 时将无法进入 BIOS 界面且主板无限重启,显示器无输出且 DRAM 指示灯常亮

后来我用镊子将其矫正就可以了

  1. 主板的 CSM Support 选项不能关闭, 关闭会导致无法进入 BIOS, 且主板上的 VGA 等常亮

最后

目录中的 EFIEFI_USB 都是我已经修改好的引导了,可以直接使用,其中 EFI 是复制到硬盘上用来引导系统的, EFI_USB 是复制到 U 盘上用来进行 U 盘引导的

引导下载地址见: https://github.com/JoyLau/Hackintosh-GIGABYTE-Z390-AORUS-PRO-WIFI-i9-9900K-RX580-BCM94360CD-OpenCore

参考资料

背景

有时在项目中调用的接口是 https 的形式, 这时使用 RestTemplate 来调用请求就会出错:

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
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at cn.joylau.code.job.executor.service.jobhandler.HttpJobHandler.execute(HttpJobHandler.java:155)
at cn.joylau.code.job.core.thread.JobThread.run(JobThread.java:151)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 18 more


I/O error on GET request for "https://xxxxxx":
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

下面是解决方式

配置

  1. 引入依赖
1
implementation 'org.apache.httpcomponents:httpclient'
  1. 代码配置
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
    import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;


@Bean
public RestTemplate restTemplate(){
return restTemplateBuilder.build();
}

/**
* HTTPS RestTemplate
*/
@Bean
public RestTemplate httpsRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);

CloseableHttpClient httpClient
= HttpClients.custom()
.setSSLHostnameVerifier(new NoopHostnameVerifier())
.setSSLSocketFactory(sslConnectionSocketFactory)
// .setDefaultCredentialsProvider(credsProvider)
.build();
HttpComponentsClientHttpRequestFactory requestFactory
= new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
requestFactory.setConnectTimeout((int)Duration.ofSeconds(5).toMillis());
return new RestTemplate(requestFactory);
}

使用

之前使用方式不变:

1
2
@Autowired
private RestTemplate restTemplate;

使用 https RestTemplate

1
2
@Autowired
private RestTemplate httpsRestTemplate;
0%