普通视图

发现新文章,点击刷新页面。
昨天以前LanYunのBlog

优化macOS Dock栏的显示与隐藏

作者 LanYun
2025年7月27日 10:10

前言

我在全新macOS Tahoe 26系统并在外接显示器体验过程中,dock栏(中文名:程序坞,后续不再解释)中的应用保留比较少,同时dock栏大小调整的比较大,虽然看着很舒服了,但是所占的空间可不小,我希望dock栏能智能显示或隐藏,比如在使用非全屏大窗口应用(比如:系统设置,访达等)时(即窗口未与dock栏区域接触{只要窗口底边>=dock栏最上边的纵坐标就算接触})dock栏能自动显示,否则自动隐藏。在互联网中发现有个应用(intellidock)能基本满足我的需求,但它在我这个系统中不能正常工作(能自动隐藏,但不能自动显示),故本人写一个swift二进制程序来实现需求。

已知bug/macOS特性:

  1. (这其实并非我编写程序的bug,而是macOS特性,我有一些方法可以解决/完善,但都不够优雅(主要是有点复杂+懒),没想好怎么修算比较好)
    在 Dock 显示状态下,当点击一个最小化的全覆盖屏幕窗口(minimized to Dock),macOS 会尝试让窗口不遮挡 Dock,所以系统会自动调整窗口位置,把它“挤”在 Dock 上方,下边界会被强制上移。

目前不足:

  1. (✅已优化,采用池管理)当前程序性能开销总体来说非常低了,但依然还有改进的空间,比如:避免频繁注册/卸载事件。
  2. (✅已优化,采用私有API)采用AppleScript来控制 Dock 自动隐藏控制开销还是有点高
  3. (目前没能力做.)无GUI可视化
  4. (懒的搞.)目前只对单屏幕有优化模式
  5. 单屏幕时,程序会缓存dock栏高度,这会导致当dock栏高度变化时不能及时处理
  6. 程序被kill时应该发出通知并启动一个新进程fork

本程序优点:

  1. 速度非常快,性能开销非常低
  2. 命令行运行,支持不同的参数
  3. 兼容性极好,支持不同macOS

部署

建议懒人(比如我😂)使用此方式(自定义用户可作为参考).

将下面命令在 终端 中运行.

1
2
3
4
5
6
7
8
9
user=$(whoami);
eval savepath="/Users/${user}/Documents/SmartDock";mkdir -p $savepath;
download_path='https://lanyun.pages.dev/download_file/SmartDock';
urls=("${download_path}/SmartDock" "${download_path}/SmartDock运行状态切换.command");
for url in "${urls[@]}"; do
wget -P "${savepath}" "${url}" || curl -L -o "${savepath}/$(basename "${url}")" "${url}"
done
sed -i '' "s/user=\$(whoami)/user='${user}'/g" "${savepath}/SmartDock运行状态切换.command";chmod -R 777 "${savepath}";
open "${savepath}"

启动或停止双击 SmartDock运行状态切换.command 文件即可.

备注:

你需要在 系统设置 中 隐私与安全性 中 辅助功能 中添加 终端 应用(需要给权限)

默认使用参数 --fast-pid :同一进程的不同窗口跳过聚焦切换处理,如果不需要请自行修改 SmartDock运行状态切换.command 脚本

如果下载失败,你可以选择通过代理下载或者将 lanyun.pages.dev 替换为 lanyundev.com 并在浏览器的无痕模式中进行下载。

手动在无痕模式文件下载链接:SmartDock SmartDock运行状态切换.command

可以手动验证一下一些文件的完整性,避免因网络缓存等原因导致与预期不符。

1
2
3
sha512sum *
32b444b5e8c055c7904961cc04a84e4858bf11b3b0be78f61a51cb82372b0a751fbe79fe7658ecf86cd0980f2258fef2bd47babb1c57460128f64a15cac75548 SmartDock
cb79465313d4bfd41e28c8515d8368360caa8621f0b5b2e102f6fa81fb7ae6779fb6b6b1403dadb199d781f73ed76c497220989bafdc60b8410f962de49dea3c SmartDock运行状态切换.command

更新说明

优化不足1和2.

解决macOS全屏模式下某些情况显示原始鼠标指针的问题

作者 LanYun
2025年6月12日 17:57

前前言

本人技术又提高了一丢丢,已经会用更优雅更好地方式(通过 System Events 接口)来控制dock栏状态(而不是用defaults这种方式),可惜的是菜单栏依然不支持通过 System Events 接口来控制.目前代码有优化的空间(操作也能更优雅一些,还可以考虑写个GUI),但我懒+没空(先搁置),以后再优化.

前言

在macOS玩全屏(16:10比例,不是无边框)非纯原生游戏过程中遇到一个(其实后面更新说明还遇到一个)很难受的问题,在游戏将鼠标指针移动到屏幕上方菜单栏区域并点击后,鼠标指针会立刻出现并显示为macOS系统的鼠标指针,严重影响游戏体验。例如在通过CrossOver运行的Palworld(幻兽帕鲁),部分原生的League of Legends(英雄联盟)等游戏。本文主要通过一些曲线办法来解决。

曲线办法解释:通过脚本将 自动隐藏和显示菜单栏 状态设置为始终,由于macOS在这种状态下,你向上移动鼠标指针并停留依然会显示菜单栏并影响游戏,故我通过编写程序来阻止鼠标指针移动到屏幕顶端/处理鼠标指针触顶后的一些操作。

本人环境: macOS 15.5(文章发布时的macOS最新正式版,请看更新说明来支持macOS 26),M1 MAX(arm架构)

注:由于技术力有限(源代码写的过于丑陋),就不贴源代码了,仅提供可在Apple silicon(ARM架构)下运行的二进制文件(技术力提高,提高二进制兼容性,适配不同的macOS)。

关于程序实现方式,我是通过CGEventTap来处理鼠标的移动事件,这种实现方式在用户态实现且过程中开销有点大,我无力解决(IOHIDManager等更底层的实现的方式我不会),但要比我最开始用Hammerspoon写的lua脚本性能高多了(后面可以贴贴我这个lua脚本,写的很简洁)

关于菜单栏状态切换.scpt脚本,如果 自动隐藏和显示菜单栏 状态如果不为 永不,那么切换为 永不,否则切换为 始终(这是符合我的使用习惯的,如果需要请自行修改)。

另外,这个脚本和macOS其他版本大概率不兼容,我只在我当前版本测试通过,其他版本请自行修改代码。

注:非中文用户如果需要使用 简易版,则需要修改菜单栏状态切换.scpt文件(修改起来很简单,你只需要将文件中第23到26行中的中文替换为你本机上对应按钮的语言即可),因为我这个脚本是以我中文界面编写的。

为了方便想要自定义某些操作的用户,下面我将提供2种方式来介绍。

简易版

建议懒人(比如我😂)使用此方式(自定义用户也可作为参考).

将下面命令在终端中运行.

1
2
3
4
5
6
7
8
9
user=$(whoami);echo -n "${user}" | pbcopy
eval savepath="/Users/${user}/Documents/MouseWall";mkdir -p $savepath;
download_path='https://lanyun.pages.dev/download_file/MouseWall';
urls=("${download_path}/MouseWall" "${download_path}/MouseClick" "${download_path}/菜单栏状态切换.scpt" "${download_path}/游戏模式切换.sh" "${download_path}/游戏模式切换.shortcut");
for url in "${urls[@]}"; do
wget -P "${savepath}" "${url}" || curl -L -o "${savepath}/$(basename "${url}")" "${url}"
done
sed -i '' "s/user=\$(whoami)/user='${user}'/g" "${savepath}/游戏模式切换.sh";chmod -R 777 "${savepath}";
open "${savepath}/游戏模式切换.shortcut"

点击 添加快捷指令 ,然后选中 游戏模式切换 右键选择编辑,然后选中这段文字 这里填你的用户名 ,然后右键点击粘贴,然后关闭窗口。

你需要在 系统设置 中 隐私与安全性 中 辅助功能 中添加 快捷指令 应用(需要给权限)

之后要运行,点击对应快捷指令右上角的运行即可。

注:如果你需要程序有高优先级(保证程序在游戏过程中能优先处理鼠标指针位置,我是建议这样做的),则需要在 快捷指令 中勾选 以管理员身份运行 ,同时还需要在 辅助功能 中添加 XPCServices/ShortcutsMacHelper.xpc ,如何添加?通过终端运行这个命令 open /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices 打开文件夹并选中 XPCServices/ShortcutsMacHelper.xpc 然后拖入 辅助功能 列表中,授权即可(macOS有bug,授权成功后在列表里面看不到),你还要将 MouseWall_Refactored 文件也拖入辅助功能 列表中。

如果下载失败,你可以选择通过代理下载或者将 lanyun.pages.dev 替换为 lanyundev.com 并在浏览器的无痕模式中进行下载。

自定义

懒得写了,简易版讲的很清楚了,会改的人我也不用多说,直接贴可能需要的文件下载链接

菜单栏状态切换.scpt 游戏模式切换.sh 游戏模式切换.shortcut MouseWall MouseClick MouseWall_Refactored MouseWall_Refactored_NoLimit

关于Hammerspoon写的lua文件(init.lua)如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
th = 5

evt = hs.eventtap.event
types = hs.eventtap.event.types
mouse = hs.mouse

blockTap = hs.eventtap.new({ types.mouseMoved }, function(e)
local loc = e:location()
if e:location().y < th then
e:setProperty(evt.properties.kCGMouseEventLocationY, th)
return e
end
return false
end)

blockTap:start()

可以手动验证一下一些文件的完整性,避免因网络缓存等原因导致与预期不符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sha512sum MouseWall
e1261c8f2e5fe2f728cb9886ebb377475ed5e0f5ac2c82bf19a841bc7df864bc714d871322ac9bb808bc8b016138ab6dbbdc2700e3d2887df61a15841f54f097 MouseWall

sha512sum MouseWall_Refactored
# 2538103b01a722094e9ceca101a66faffc3db0eb3fb3b12994203e1ef57e84949ab41347b032dae55ef6de9c6d9702ced9801352855f8c1ae3ab956bf5599424 MouseWall_Refactored
sha512sum 菜单栏状态切换.scpt
# e60d41dbda343cbd70428a9171934d42c0a524dca08aaced9e5693ac06c30f0df0795683037362d8d22b61032a0d037eae07db3d7a2933e3be03fa9925e511be 菜单栏状态切换.scpt
sha512sum 游戏模式切换.sh
# d7a1fd6d1e590bdca792371c4e3d688fdc1042680f49b1a1122f22bd439b8dffd7ab3057cb49502202f772f1326d2dc5563c42a6335936587561f4f2b675f484 游戏模式切换.sh
sha512sum 游戏模式切换.shortcut
# d985644f36f6abb31aaf804c853835444849167f609bda6cd8bd67ec5ea14a5356406a1a8d3dad0e443b6941cdadd6087ba024ded42d8546b7ce17828204a688 游戏模式切换.shortcut
sha512sum MouseWall_Refactored_NoLimit
# c4edec556edaca1656ee6f678cc50ba8245ef3626d2dea2460655982a7078e517aa6ee03cd839b10043235c846a61f7ba6975cd741efdb80be4e07244066f093
sha512sum MouseWall_Refactored_Debug
# ac6e50c606dddd537d77cf9cd82ab56e34ea2d028f2d21ca04463605d0a49817f29afda55646052281691c7410d35e8138d166306176c8974edc42ed6b31e38d MouseWall_Refactored_Debug
sha512sum MouseWall_Refactored.old
# d7ac2e79a0aef99b1b59222bb99b8dc4ddc231ee9f8f5546e3a16d369a588f970a0241eb30c52ab041329b0c54d48017832a9fb86b94847e88498ea63c2fcae9 MouseWall_Refactored.old
sha512sum MouseClick
# 0881853152fcb834de57b9655c1848ec266039b83a7058d530cae3dec23a531fee88524f878c21010daf347aaf75b47162d6be1f71c6d06c9964acbfb8c1e8c4 MouseClick
sha512sum old_MouseWall
# af07bafa639a02ad391b7eb654059890c117f340f6772bff1713a3178789adc8faaecda84efaa1d225bde39d66f026ca47d1e2947ba5b4cf878a5b9aa89004b3 MouseWall

更新说明

目前顺序是由旧->新,如果你想看最新说明请从最后开始看

MouseWall 二进制文件已被弃用,因为存在一个严重问题,即在开放世界中无法将鼠标持续向上移动,因为这个程序会阻止鼠标指针触顶。

我重新编写一套处理方式,MouseClick 程序性能比较优秀,因为只处理鼠标指针点击事件,所以开销很小,逻辑:当发生鼠标指针点击事件时,判断纵坐标是否<=48px,如果是,则鼠标指针位置纵坐标+48px并在新位置发送点击事件,这样可以避免点击菜单栏,否则按照正常流程处理,这样实现也存在一个小问题,当鼠标指针点击位置在<=48px时,画面会立刻下移改变(我尝试过不移动鼠标指针位置,而只在新位置发送鼠标指针点击事件,但macOS系统不认定这种方式,会导致原生鼠标指针显示)。

我原本还有个折中的想法,即在没有触顶时,鼠标指针纵坐标即使<=48px也不进行移动,在触顶后,如果鼠标指针离开了菜单栏区域又重新回到菜单栏区域且鼠标指针没有触顶则不进行移动,但这样需要同时处理点击和移动事件,开销会多一点,而且我不想这样做,因为处理鼠标指针移动事件开销始终会多一些(然后不想去思考逻辑了,懒..)。好吧,我还是去做了,二进制文件名为MouseWall_Refactored,但CPU开销会比MouseClick多一些,建议低性能设备使用MouseClick,并修改游戏模式切换.sh脚本中对应的BINARY_PATHPID_FILE变量值即可。

注:本程序只能缓解问题,并不能真正解决问题,问题是有可能在某些情况复现的,本人水平有限就先这样了吧。睡觉觉去咯~

我注意到当鼠标指针按下后向底部移动再移出也会导致鼠标指针变原始的,故我更新了 游戏模式切换.sh 脚本文件(如果不需要请自行删除相关代码,我发现并不是在未隐藏dock栏的所有情况下都会出现此问题,故我注释掉了相关代码,不再作为默认处理,有需要则自行取消注释相关代码),能实现伪长久隐藏dock栏,通过defaults write com.apple.dock autohide-delay实现,但缺点是需要重启Dock进程,这会导致你最小化的窗口都会在前台显示,需要重新手动最小化(我觉得这是小事,小问题,也没想出好的自动化来处理这个),如果你想要点击Dock栏中某个项,但又不想关闭 游戏模式,那么你可以 control + 上箭头 来调出 调度中心(这个时候就会显示dock栏了)。注:需要在隐藏dock栏之后启动游戏(即需先切换为 游戏模式)

发现一个特性,在离开菜单栏区域后在菜单栏未消失前又再次进去且未触顶,然后鼠标指针的点击事件导致的原始鼠标指针显示。为什么会这样,我发现在 自动隐藏和显示菜单栏 为 始终 下,当前应用未全屏状态下,鼠标指针触顶显示菜单栏后,鼠标指针纵坐标y到达大约48px即可隐藏,但到了全屏应用中发现需要到达大约189px才会隐藏,故需要修改代码逻辑。但似乎并没有影响全屏游戏,故没有修改这方面代码。不过我又优化了一下代码逻辑,在鼠标指针触顶且未离开菜单栏区域中发生点击事件后会移动鼠标指针纵坐标y=49px,并在原位置发送点击事件,在下次手动移动鼠标指针时恢复为原位置移动。

目前程序已知缺陷(/特性): 在往上移动鼠标指针触顶且未离开菜单栏范围进行点击的话,虽然点击位置依然是原位置,但是画面会因为鼠标指针的移动而发生移动,再次移动鼠标指针,画面也会移动。目前只基于原生16英寸主显示器默认分辨率(1728x1117)做适配,未对外接显示器做适配,为避免对x<0或x>1728的外接显示器操作造成影响,已跳过处理。

在macOS 26 beta 2上,我重新分析了布局信息,你只需要将 菜单栏状态切换.scpt 文件中的 group 9 of scroll area 1 of group 1 of group 2 改为 group 1 of scroll area 1 of group 1 of group 3 即可在macOS 26上继续运行.

为满足对外接显示器用户的需求(其实是我😂),现增加二进制文件MouseWall_Refactored_NoLimit,不再对x轴做限制,如果要用管理员权限运行的话,别忘了给这个二进制添加辅助功能权限哦~

提高二进制文件兼容性,性能优化和多显示器处理之后有空再搞,原始 MouseWall 二进制文件重命名为 old_MouseWall ,新版 MouseWall_Refactored_NoLimit 二进制名改为 MouseWall 并作为默认二进制使用.

备注: League of Legends(英雄联盟) 实际上点击不到菜单栏区域(因为游戏分辨率不支持macOS真全屏16:10),但是这游戏bug多的批爆,你需要先切换到无边框模式再切换回全屏才能不会显示原始鼠标指针。

Yarn从Classic迁移到Modern

作者 LanYun
2025年4月24日 03:55

前言

好久没写文章了,主要是懒,平时睡睡觉,吃吃饭就很舒服了,很早之前也换到过yarn Modern版,但遇到项目不兼容(nodeLinker: “pnp”),然后也没有了 yarn global ,就很不爽,只好老老实实一直用yarn经典版,在逛开源项目的时候,看到有些项目已经支持yarn modern的pnp nodeLinker了,然后忽然突发奇想,想到了一个曲线兼容办法,故写这篇文章用作记录📝。

本文的系统环境和相关信息(仅供参考):

OS: macOS 15.4.1 24E263 arm64,Kernel: 24.4.0,CPU: Apple M1 Max

Homebrew 4.4.32,通过brew安装的 yarn 1.22.22,node 23.11.0,zsh 5.9

迁移

有兴趣可参考官方文档:https://yarnpkg.com/migration/overview

我这里采用全局安装最新稳定版的方式,即和原来brew安装的yarn二进制文件位置不变 /opt/homebrew/bin/yarn,避免影响我某些脚本中写死了的yarn二进制路径(懒得改,我希望更新yarn版本但不希望对我其他代码或工具造成影响。)

1
2
3
brew remove yarn # 移除yarn
corepack enable # 显式开启 Corepack 实验特性,激活 Corepack 功能
corepack install --global yarn@latest # 全局安装最新稳定版

这就代表安装完成了,下面演示在旧项目中的示例。

示例

1
2
3
cd xxx # 进入到你的某个旧项目路径下
yarn set version stable # 可选,有些项目package.json没有packageManager字段,影响不大。
yarn install # 安装依赖

当你在旧项目(有node_modules文件夹)中第一次使用新版yarn时,会保留原node_modules了,也会创建.yarnrc.yml文件,内容: nodeLinker: node-modules,意思是使用旧的链接方式,不会对原项目造成影响,如果你想尝试新版特性,将值改成pnp,再重新yarn install 即可(但项目大概率会崩,因为并不是所有老和新项目都兼容新版特性的,这一般情况下需要说明。),如果崩了,改回去方法同理。

兼容

如果你未曾使用过yarn global且以后也不需要用,则无需阅读本节内容

为了避免影响我系统中的一些工具或脚本对旧版yarn global路径的依赖,同时也为了方便使用并更新yarn全局软件,故采用曲线兼容的方式来实现(可惜不够优雅,但能吃到新版yarn特性还是挺不错的)。

注意:官方并不推荐使用全局安装,但我不想听它的建议,不想让它教我怎么管理软件包,至于说污染全局环境?可笑,你说污染就污染?我对PATH环境中的二进制路径把握是绝对的,每个路径我都清楚,至于说隐式依赖会造成问题?笑死,没人🙌比我👐更懂👌项目代码☝️,没有这个必要,真正懂项目代码的人会清晰的知道有哪些依赖,至于新版yarn完全把global删了的行为,我的评价是:纯纯傻逼,完全不提供可用选项。

新建脚本

1
2
3
open ~/.config/yarn/global # 打开这个文件夹,然后新建yarn-global.sh文件并打开
# 或者用如下命令
vim ~/.config/yarn/global/yarn-global.sh # 编辑此文件

向文件中粘贴下面这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 获取当前脚本的实际路径
SCRIPT_PATH="$(readlink -f "$0")"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"

# 切换到脚本所在的目录
cd "${SCRIPT_DIR}"

# 参数存入数组
args=("$@")

if [[ "${args[0]}" == 'dir' ]]; then
echo "${SCRIPT_DIR}" && exit;
elif [[ "${args[0]}" == 'upgrade' ]]; then
args[0]='up'
elif [[ "${args[1]}" == '--latest' ]]; then
args[1]=''
fi

yarn "${args[0]}" ${args[1]}

保存后用命令给文件权限

1
2
chmod 777 ~/.config/yarn/global/yarn-global.sh # 其实给个执行权限+x就行了,但是为了方便就这样了。
echo -n ~/.config/yarn/global/yarn-global.sh | pbcopy # 顺便将绝对路径拷贝到剪贴板

新增命令

如果你的终端shell不是用的zsh,也可作参考(同理的)。

编辑~/.zshrc文件(不限定什么方式)

1
vim ~/.zshrc # 参考:用vim编辑

然后新增一行内容

1
alias yarn-global='xx' # 将xx替换为你剪贴板中的内容,也就是选中xx然后粘贴

保存,这样新开的终端就应用你的配置了,如果想让旧终端也应用,命令:source ~/.zshrc

如果你希望以后安装的全局包也能被识别,请参考下面代码

1
2
echo -n :~/.config/yarn/global/node_modules/.bin | pbcopy # 将绝对路径拷贝到剪贴板
vim ~/.zshrc # 重新编辑此文件

如果文件已有 export PATH= 之类的内容,那么在靠近最后一个引号的左边粘贴你的剪贴板内容即可

如果没有

1
export PATH="$PATHxx" # 将xx替换为你剪贴板中的内容,也就是选中xx然后粘贴

保存即可。

修改历史命令记录

如果想用的更丝滑,可以修改历史命令记录。

1
LC_ALL=C sed -i '' 's/yarn global /yarn-global /g' ~/.zsh_history # 将yarn global改成yarn-global

参考代码

交互式更新:yarn-global upgrade-interactive --latest (其实--latest是没必要的)

非交互式更新:yarn-global upgrade

安装包:yarn-global add xx

移除包:yarn-global remove xx

nginx自编译

作者 LanYun
2024年4月19日 01:24

前言

简单记录下,编译用到的一部分代码.

以下代码运行环境: ubuntu x86_64

依赖

1
2
sudo apt update && sudo apt upgrade && sudo apt autoremove
sudo apt install -y build-essential ca-certificates zlib1g-dev libpcre3 libpcre3-dev tar unzip libssl-dev wget curl libtool git cmake ninja-build mercurial libunwind-dev pkg-config golang # 编译工具&依赖库

编译

brotli 压缩

1
2
3
4
5
6
git clone --depth=1 --recurse-submodules -j8 https://github.com/google/ngx_brotli
cd ngx_brotli/deps/brotli
mkdir out && cd out
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS="-Ofast -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_CXX_FLAGS="-Ofast -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_INSTALL_PREFIX=./installed ..
cmake --build . --config Release --target brotlienc
cd ../../../..

openssl

1
2
3
4
5
6
7
git clone -b master --depth=1 https://github.com/openssl/openssl.git
cd openssl
./Configure --prefix=/usr/src/openssl --openssldir=/usr/src/openssl
make install
ldconfig
openssl version -a
cd ../

ngx_security_headers

1
git clone --depth=1 --recurse-submodules https://github.com/GetPageSpeed/ngx_security_headers

nginx

1
2
3
4
5
6
7
8
9
hg clone https://hg.nginx.org/nginx
cd nginx
make clean
./auto/configure --prefix=/etc/nginx --user=www-data --group=www-data --with-pcre --add-module=../ngx_brotli --add-module=../ngx_security_headers --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-compat --with-threads --with-file-aio --with-http_ssl_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_slice_module --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-http_dav_module --with-http_v3_module \
--with-cc-opt="-I /usr/src/openssl/include" \
--with-ld-opt="-L /usr/src/openssl/lib64"
make
make install
cd ../

完成,可以删除这些文件夹,也可以不用删除,方便下次编译(记得git pull)

tips: 如果在make install安装后想要卸载,命令:make uninstall

用santa对二进制进行监控和授权

作者 LanYun
2023年11月8日 03:15

前言

仅限macOS.

本文用到的项目: Santa

介绍:

Santa是macOS的二进制和文件访问授权系统。它由一个系统扩展组成,用于监视执行情况,一个守护程序根据本地数据库的内容做出执行决策,一个图形用户界面代理用于在决策被阻止时通知用户,以及一个用于管理系统和将数据库与服务器同步的命令行实用程序。

它之所以被称为Santa,是因为它跟踪二进制文件的行为,判断它们是好还是坏。

本文会快速部署并演示阻止QQ的ScreenCaptureAgent二进制程序.

如果要了解更多或者看不懂本文,请移步 官方文档

部署

起手先前往 Releases 下载最新版,然后安装,然后打开然后点Dismiss.

然后下载这个 Santa.7z 压缩包再解压出来.

如果要方便控制规则,请排除中央管理配置文件.

已使用 MDM 解决方案

排除中央管理配置文件,一共有4个文件,然后安装4次就行了.

安装方法: 双击mobileconfig文件来安装描述文件.

然后前往 设置 -> 隐私与安全性 -> 描述文件 中,看着操作把它安装了.

未使用/看不懂

安装配置文件和通知设置文件夹中的配置文件,一共2个文件.

然后前往 设置 -> 隐私与安全性 -> 完全磁盘访问权限

勾选 com.google.santa.daemon.然后再打开Santa可看到如图所示

image-20231108034238101

mobileconfig配置文件更多配置项可参考文档

检查状态

终端命令行运行

1
santactl status

输出了 Daemon Info 就没问题.

阻止

1
sudo santactl rule --block --path /Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/ScreenCaptureAgent

Tips: 这里演示的是路径阻止,实际还有阻止方式,此处懒的写了.

检验

1
santactl fileinfo /Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/ScreenCaptureAgent --key Rule

Tips: fileinfo 参数非常强大,远不止此功能,此处也懒的写了.

杂项

1
2
3
4
5
6
7
8
9
10
11
12
13
ls /var/db/santa # 可以看到规则,日志等文件,建议定时清理🧹避免占用过多磁盘空间
santactl help
Usage: santactl:
fileinfo - Prints information about a file.
metrics - Show Santa metric information.
printlog - Prints the contents of Santa protobuf log files as JSON.
rule - Manually add/remove/check rules.
status - Show Santa status information.
sync - Synchronizes Santa with a configured server.
version - Show Santa component versions.

See 'santactl help <command>' to read about a specific subcommand.
santactl help rule # 查看rule规则用法

命令运行结果示例:

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
santactl help rule
Help for 'rule':
Usage: santactl rule [options]
One of:
--allow: add to allow
--block: add to block
--silent-block: add to silent block
--compiler: allow and mark as a compiler
--remove: remove existing rule
--check: check for an existing rule
--import: import rules from a JSON file
--export: export rules to a JSON file

One of:
--path {path}: path of binary/bundle to add/remove.
Will add the hash of the file currently at that path.
Does not work with --check. Use the fileinfo verb to check.
the rule state of a file.
--identifier {sha256|teamID|signingID}: identifier to add/remove/check
--sha256 {sha256}: hash to add/remove/check [deprecated]
--json {path}: path to a JSON file containing a list of rules to add/remove

Optionally:
--teamid: add or check a team ID rule instead of binary
--signingid: add or check a signing ID rule instead of binary (see notes)
--certificate: add or check a certificate sha256 rule instead of binary
--message {message}: custom message

Notes:
The format of `identifier` when adding/checking a `signingid` rule is:

`TeamID:SigningID`

Because signing IDs are controlled by the binary author, this ensures
that the signing ID is properly scoped to a developer. For the special
case of platform binaries, `TeamID` should be replaced with the string
"platform" (e.g. `platform:SigningID`). This allows for rules
targeting Apple-signed binaries that do not have a team ID.

Importing / Exporting Rules:
If santa is not configured to use a sync server one can export
& import its non-static rules to and from JSON files using the
--export/--import flags. These files have the following form:

{"rules": [{rule-dictionaries}]}
e.g. {"rules": [
{"policy": "BLOCKLIST",
"identifier": "84de9c61777ca36b13228e2446d53e966096e78db7a72c632b5c185b2ffe68a6"
"custom_url" : "",
"custom_msg": "/bin/ls block for demo"}
]}

对于设备网络安全:

我目前是: 系统防火墙,阻止主动探测,Little Snitch 防火墙,阻止未手动添加的规则的流量,Proxifier 做前置代理,进行网络分流,adguard 做内容过滤,surge等工具做代理转发

ESXI 8.0安装黑群晖DSM 7.x

作者 LanYun
2023年11月2日 21:58

前言

水💦篇文章.

记录一下在一台软路由的esxi 8.0中安装黑群晖7.x过程.

用到的项目(已删库): https://github.com/wjz304/rr

原版项目: https://github.com/fbelavenuto/arpl

项目文档(已删除): https://github.com/wjz304/rr/blob/main/guide.md

由于某些原因,作者github库已全部删库.且限制传播.

故本文将限制CN用户访问.

基于ipfs的相关内容存档(时间截止2024-1-5):

https://ipfs.io/ipfs/bafybeignagmtebkyph24zapvwpw7cwfemj53fx67lm7zsoxzudmjoj5viy

https://nftstorage.link/ipfs/bafybeignagmtebkyph24zapvwpw7cwfemj53fx67lm7zsoxzudmjoj5viy

准备磁盘镜像

下载

先去下载Releases 64(已失效)最新版压缩包到本地,然后解压得到img文件.

转换

win用户用到的工具: StarWind V2V Converter (自行搜索相关用法)

macOS: qemu-img (通过命令brew install qemu即可安装这个工具,前提已安装brew)

运行命令qemu-img convert -f raw -O vmdk rr.img rr.vmdk即可完成初步转换.

rr.vmdk上传到esxi中某个目录中.然后在这个目录中用命令vmkfstools -i rr.vmdk rr-23.11.0.vmdk即可完成转换.

创建虚拟机

下面只说注意的点.

名称: 随便

系列: Linux

版本: 其他 4.x Linux (64 位)

注: 如果选择SA6400等型号的话(当然前提是兼容你的设备),应该为其他 5.x Linux (64 位)

可删掉CD驱动器,空出一个sata接口.

至少需要3个硬盘.第一个硬盘为现有硬盘及上面转换好的磁盘镜像rr-23.11.0.vmdk.

控制器可都改成 SATA (非强制)

关闭UEFI安全引导

安装DSM

启动虚拟机,可以看到,叫你在浏览器中访问的地址(http://ip:7681/),去访问.

然后先选择语言 zh_CN ,然后选择型号,可以先进行兼容性判断,看看哪些兼容.

然后选择型号,之后选择版本,编译引导.

如果有洗白SN/MAC,可在设置Cmdline中去设置.

然后启动. (嫌启动DSM内核倒计时长,可以去高级设置中设置)

安装之后的内容不再阐述.

补充内容

群晖各个型号之间有什么特色和区别:

DS3622xs、DS3617xs、SA6400 DSM7.x版本开始都支持24个CPU线程,其它的大部分型号都最多只支持8个线程(DS918、DS920)或16个线程,如果你的CPU核心线程都多的情况下可能会有很多闲置核心,因为他们可能只调用8条线程。当然随着黑群晖系统的迭代更新可能这些限制会被开放.

通过群晖查询CPU支持多少线程(不一定准确):

ssh连接群晖,输入下面命令

1
2
sudo -i # 输入密码,进入root账号
cat /proc/cpuinfo| grep "processor"| wc -l # 这个代表群晖在你的机器硬件上现在认出多少个CPU线程,Linux只认线程不是认多少核心.

DS918+、DS920+这类官方硬件自带GPU的产品型号可以调用4-10代intel核显进行转码操作,可以减少低端型号转码时cpu的占用。但是11代开始因为群晖的linux内核非常老,并且升级版本基本就只制裁一下盗版,换换UI换个皮肤做做样子,最重要的内核几乎没升级过(DSM版本和内核没多大关系)。目前只有SA6400是5.1 linux内核,其它的型号都停留在4.4或更早的3.x内核,所以其它型号能驱动核显最多只能支持到intel10代。目前是有SA6400移植驱动的固件详情参考jim大佬博客

DT型号:统计截止到2023年1月 包含但不限于DS920+,DS923+, DS1520+, DS1621+, DS1821+, DS2422+,DVA1622, FS2500, SA6400。
DT的型号不支持SAS卡会在启动时导致kernel崩溃。未编译DT文件时硬盘顺序不会按着SATA卡标识的序号来,硬盘序号只会计算有插入的硬盘的插槽,例如两张4口SATA,就算你只在两张SATA卡最后一个口上插硬盘,只要你其它口不插硬盘,开机它也会显示硬盘序显示为硬盘1 硬盘2。并不会像非DTS型号一样显示硬盘4和硬盘8。但是他也有一个好处就是在普通引导下不会乱报SATA口错误。

DVA系列的型号自带Surveillance Station套件有8个摄像头授权,请不要手动到套件中心下载,装完系统之后联网自动下载
DVA3221是第一款支持NVIDAI独立显卡的型号,并且由此破解出了其它黑群晖型号的NVIDAI显卡驱动 详情查看矿神的博客
DVA1622是第一款带HDMI接口并且支持输出画面的群晖型号,但只能输出Surveillance Station的监控画面。

虚拟机下的小知识:
DS923+开机速度是所有型号中最快的
DS3622xs+的装完占用空间最小
DS920+、DS918直通GPU的麻烦加蛋疼,就算弄好了也是问题一堆,还不如直接上软解型号。这两个型号比较合适核心不多(低于8线程)的物理机安装。

更多内容: https://www.mi-d.cn/1338

SSH 修改黑群晖的 SN 和 MAC (洗白)

openwrt编译过程记录

作者 LanYun
2023年10月28日 15:20

前言

本文编译的为openwrt分支lede,本文主要以记录为主,因为中间有时候报错没弄,断断续续1个月左右搞好.

本文以ubuntu x86作为编译机.

编译成品: https://github.com/LanYunDev/lede_compile

安装依赖

1
2
3
4
5
6
7
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools \
libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \
vim wget xmlto xxd zlib1g-dev python3-setuptools zstd ninja-build meson

添加用户

如果你有非root用户,可跳过创建,后续都需要用非root用户进行操作.

1
2
3
4
5
6
7
8
9
10
# 添加用户
adduser openwrt
# 设定密码
passwd openwrt
# 添加 sudo 权限
usermod -a -G sudo openwrt
# 进入用户
su openwrt
# 切换目录
cd ~

编译

1
2
3
4
5
6
7
git clone https://github.com/coolsnowwolf/lede.git
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig # 手动配下
make download -j8 || make download || make download V=s
make -j1 || make -j1 V=s

可选:

添加第三方包来源

1
2
3
4
echo >> feeds.conf.default
echo 'src-git istore https://github.com/linkease/istore;main' >> feeds.conf.default
sed -i '$a src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default
sed -i '$a src-git small https://github.com/kenzok8/small' feeds.conf.default

更换golang版本

编译新版Sing-box和hysteria,需golang版本1.20或者以上版本.

若自带的版本过低,可用下面命令换成openwrt官方golang版本

1
2
3
pushd feeds/packages/lang
rm -rf golang && svn co https://github.com/openwrt/packages/branches/openwrt-23.05/lang/golang
popd

删除默认的 argon 主题

记得选.

choose LUCI->Theme->Luci-theme-argon

choose LUCI->Application->Luci-app-argon-config

1
2
3
4
5
6
cd ./package/lean
rm -rf luci-theme-argon
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git luci-theme-argon
rm -rf luci-app-argon-config # if have
git clone -b 18.06 https://github.com/jerrykuku/luci-app-argon-config.git luci-app-argon-config
cd ../../

修改默认主题为argone

1
sed -i 's/luci-theme-bootstrap/luci-theme-argone/g' feeds/luci/collections/luci/Makefile

添加ddns-go

1
git clone https://github.com/sirpdboy/luci-app-ddns-go.git package/ddns-go

修改用户名

站内文章: OpenWrt 修改登陆用户名

二次编译

1
2
3
4
5
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make -j1 || make -j1 V=s
# 不怕失败,可以用: make -j$(nproc) || make -j1 || make -j1 V=s

干净编译

编译出现问题且用make clean依然无法解决的情况.

1
2
3
4
5
6
7
8
# 也可以加上删除dl tmp staging_dir build_dir目录的操作
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make dirclean;make dirclean V=s
make -j1 clean; make -j1 clean V=s
make download || make download V=s
make -j1 || make -j1 V=s

杂项

如果是ext4镜像,修改某些文件,提示:Read-only file system

用这个命令将根目录解锁即可.

1
mount -o remount,rw /

默认没有安装Git,自带的ssh没有ssh-agent功能,可以通过如下命令配置:

1
2
3
4
5
6
7
opkg update
# 安装Git
opkg remove git
opkg install git-http
opkg install ca-bundle
# 安装SSH
opkg install openssh-client openssh-keygen openssh-sftp-server

安装并信任根 CA 证书 参考

  1. 获取根 CA 证书 (若已有,可跳过,这里演示生成)
1
2
3
openssl s_client -connect ca.private-domain.tld:443 < /dev/null > /tmp/temporary.out
openssl x509 -outform PEM < /tmp/temporary.out > /tmp/ca.private-domain.tld.cert
rm /tmp/temporary.out
  1. 安装 CA 根证书

受信任的证书安装在/etc/ssl/certs,但是遵循FHS 3并用于/usr/local/share与体系结构无关的文件是一个很好的做法.

1
2
3
mkdir -p /usr/local/share/ca-certificates
mv /tmp/ca.private-domain.tld.cert /usr/local/share/ca-certificates/
ln -s /usr/local/share/ca-certificates/ca.private-domain.tld.cert /etc/ssl/certs/ca.private-domain.tld.cert
  1. 将根 CA 证书添加到系统的信任存储中

证书已安装,但尚未被信任.您需要提供证书的哈希值.

1
2
3
4
5
6
7
8
# 生成哈希值
HASH="$(openssl x509 -hash -noout -in /etc/ssl/certs/ca.private-domain.tld.cert).0"

# 显示哈希值
echo "$HASH"

# 将哈希值链接到证书
ln -s "/ect/ssl/certs/ca.private-domain.tld.cert" "/etc/ssl/certs/$HASH"

注意: 如果其他证书有相同的哈希值,请使用后缀.1.2,而不是.0.

解决配置文件无法保存问题:

临时:

1
mount -o remount rw /

永久:

1
vim /etc/rc.local

exit 0之前添加命令mount -o remount rw /然后保存,并赋权.

1
chmod +x /etc/rc.local

或者编译解决:

1
2
3
4
make menuconfig 中把 block-mount 去掉
# 按顺序取消选中
Extra packages ---> automount
Base system ---> block-mount

或者在luci中 系统 -> 挂载点 -> 挂载点 取消根目录 / 挂载点.

编译修改ssh端口:

1
2
vim ./package/network/services/dropbear/files/dropbear.config
# 将option Port '22'中22修改为想要的端口

修改内核大版本

1
vim ./target/linux/x86/Makefile # 这里以x86为例,其他平台自行参考

修改KERNEL_TESTING_PATCHVER即可.如果没有则修改KERNEL_PATCHVER

技术杂记📝

作者 LanYun
2023年8月4日 22:38

前言

主要还是想分享一些技术和一些可能用的上的东西吧.原来有篇日常杂记,但出于某些原因不能公开.故另起一文主要做少许记录,确保内容无太多情绪的语言.内容也更为随意(翻译:方便CV的就记录一下),更新时间完全看心情了(翻译:随机+懒+忘记写=容易鸽🐦).

下面把部分内容搬运过来一些.

注: 此篇禁CN网络访问.已解除限制🔓

现在含日常记录📝了.

2025年12月23日 星期二

真 牛马(worker),没得假期,虽然早9晚5,但是还是挺无聊的,最近花了点时间写一个Web工具箱(打磨得不错了,比较美观),网址: tool.lanyundev.com (已上线)

其中主要是QR(二维码)传输前端布局,(在AI的潮流下,我居然都是一点点抠出来的😂),我不希望依赖前端UI框架,纯原生javascript和css,在写这个工具箱的过程中,我对于代码管理和架构有进一步的理解(感觉是一丢丢)

吐槽: So,Safari,fuck you! (Chrome上显示的没问题,但就是在Safari上有问题,以后再慢慢修)

2025年11月8日 星期六

毕业之后上班了,感觉有点累(但压力目前不是很大),没有双休(无视劳动法),工资也低(基本的5险一金还算有),在技术这方面,上班之后确实更加鞋带了🥱

不过还是写一些丑陋的不便公开的私有代码(功能上有一定bug,性能上有巨大提升空间),我想的是Done(做出来),之后看心情再better(做的更好)

目前实现了有反洗钱(AML)自动智能处理化评级(甄别做了一点就没做了,有点懒)、国库集中支付自动智能处理化(常规/大部分情况下都处理),中文转拼音及数字专人民币大写等工具箱

—写于被感冒困扰的我😭…

2025年7月18日 星期五

在macOS 外置显示器上玩2077,记得把 控制中心/菜单栏 中 自动隐藏和显示菜单栏 设置为始终,否则画面覆盖不全.

在macOS 15.5,M1 MAX 64GB 外置LG 4K显示器的设备上玩2.3版本2077,关闭帧生成,关闭系统中占用高CPU的进程,分辨率设为2560x1440,纹理质量等特效均设置为高,平均FPS为61.64,最大FPS为71.51,最小FPS为52.37,采用默认动态分辨率调节.

1
2
3
4
5
6
7
# 在 macOS 上,无法全局关闭 Unified Logging(统一日志系统),下面命令没啥用
sudo log config --mode "level:off"
sudo log config --mode "persist:off"
sudo log config --mode "stream:default"
sudo log config --status
# 不如我之前写的一大批launchctl unload,可惜会影响系统稳定性
launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist

2025年7月10日 星期四

macOS 英文输入法恢复按键重复功能: defaults write -g ApplePressAndHoldEnabled -bool false

注销用户并重新登录生效或者重启macOS系统

2025年5月5日 星期一

草了,macOS 系统这么怎么垃圾,到处都有内存泄露的bug,md,系统私有框架 Portrait.framework 我真的服了,从macOS 10.11 上被发现到我目前用的 macOS 15.4.1 依然没修复。

我怎么发现的?

我真的草了,我用 FFmpeg 调用 AVFoundation 硬件采集(-f avfoundation),然后这逼进程内存持续增长,我tm追踪一看,底层 Portrait.framework 无法释放某些 CFString 路径资源导致的(反复加载但未释放的 VFX 资产路径字符串: file:///System/Library/PrivateFrameworks/Portrait.framework/Resources/…)

2025年4月24日 星期四

在工具受限或技术有限情况下,通过遍历线程并提供堆栈来找到程序性能瓶颈,参考: 1.poormansprofiler.org 2.旧版翻译

2025年4月10日 星期四

如果/private/var/log/alf.log文件无法被正常创建/读取,那么将无法打开macOS设置中的网络界面。

2025年1月20日 星期一

macOS arm架构,OrbStack 通过 Rosetta 运行的 x64 linux 虚拟机,通过 qemu-x86_64 -g 1234 /path/filegdb /path/file 可以进行调试.

1
2
3
4
5
6
7
8
9
10
# 终端1
qemu-x86_64 -g 1234 /path/file

# 终端2
gdb /path/file
target remote localhost:1234

# 如果安装了 qemu-user-static
# 可将 qemu-x86_64 换成 qemu-x86_64-static
# 参考: https://docs.orbstack.dev/machines/#debugging-with-gdb-lldb

否则报错

1
2
3
4
warning: linux_ptrace_test_ret_to_nx: Cannot PTRACE_GETREGS: Input/output error
warning: linux_ptrace_test_ret_to_nx: PC (nil) is neither near return address 0x7ffff8e1e000 nor is the return instruction 0x675672!
Couldn't get CS register: Input/output error.
Exception occurred: Error: Couldn't get registers: Input/output error. (<class 'gdb.error'>)

临时解除非root用户对其他进程的调试限制: echo 0 > /proc/sys/kernel/yama/ptrace_scope 或者 sysctl -w kernel.yama.ptrace_scope=0

持久化: vim /etc/sysctl.conf 添加 kernel.yama.ptrace_scope=0

下面办法有可能不可行(出现转译器不支持特定的 QEMU 指令集时),不清楚详细原因.(参考: https://github.com/docker/for-mac/issues/6921 )

1
2
3
4
5
6
7
8
# 终端1
ROSETTA_DEBUGSERVER_PORT=1234 /path/file

# 终端2
gdb-multiarch # 或者gdb
set architecture i386:x86-64
file /path/file
target remote localhost:1234

有可能出现报错

1
2
3
4
5
6
7
8
9
10
11
12
# 终端1
rosetta error: no handlers found for <Qqemu.sstepbits>, length=<15>!

# 终端2
warning: remote target does not support file transfer, attempting to access files from local filesystem.
Exception occurred: Error: Remote connection closed (<class 'pwndbg.dbg.Error'>)
For more info invoke set exception-verbose on and rerun the command
or debug it by yourself with set exception-debugger on
Python Exception <class 'pwndbg.dbg.Error'>: Remote connection closed
./gdb/thread.c:87: internal-error: inferior_thread: Assertion current_thread_ != nullptr' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.

参考: GDB crashes debugging x86 binary under Rosetta 2 + Apple Virtualization Framework Unable to debug amd64 binaries on apple silicon Unable to Debug on Apple M1/M2 when using linux/amd64 devcontainer Using pwndbg debugger to report errors in ubuntu with arm architecture

2025年1月16日 星期四

狗屎拳头公司,macOS端的英雄联盟(League of Legends)全屏有bug,界面上面一部分横排鼠标点击没图标,怀疑遮挡代码有问题,先切换到无边框模式再切换回来就正常了(但是切换后有段时间是卡卡的,垃圾riot公司,优化太差了).

2025年1月4日 星期六

已知bug: surge增强模式会(准确说是开启VPN这个状态)导致 navigator.onLine 判断始终为 true ,即不能真实反映网络联通状态.

2024年12月23日 星期一

鉴于 ishot 2.5.9 版本crack版依然存在使用截图相关功能会导致进程崩溃重启,现给出临时办法(关闭ishot进程后需再次执行): 在进行录屏的过程使用截图相关功能再退出录屏即可,这样能”留住” Legacy Color Picker Extensions (/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-arm64.xpc/Contents/MacOS/LegacyExternalColorPickerService-arm64) 而不导致ishot崩溃.

2024年12月17日 星期二

macOS 15.2 禁用服务(忘了说了,这命令可能需要关闭sip才能执行) sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.modelmanagerd.plist # AI 会导致 /usr/sbin/coreaudiod 进程CPU飙升,占用大量CPU资源

这玩意Klack(1.6.1)软件也有bug,会导致 coreaudiod 进程CPU百分之10以上,本身软件也占CPU比较高.

下面是关于外置ssd安装macOS中遇到的问题的一些不友好语言输出.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
沟槽的macOS系统降级,真操蛋,限制真JB多,BUG也非常多
走USB协议的外置硬盘,遇到许多问题
像什么 无法验证启动器、源宗卷无法恢复 密封已损坏、无法备份 OSStatus error 49153、当前实例与预期不相符、启动磁盘授权失败(管理员密码对了也不给,怀疑代码有问题)、启动外置磁盘中系统强制验证联网、通过终端运行安装器强制联网并下载最新版、恢复模式启动外置硬盘旧版安装器,如果你连了网,安装器不会安装旧版而是联网下载最新版进行安装(逆天),如果你没联网,验证完了给你来句需要互联网连接😅(我卡着时间验证完就它网,这样它才会使用安装器里面的镜像)
😅人都麻了、、
安装器日志各种报错、
从 macOS 15.2 -> 14.3.1 -> 12.5 x-> 11.2.3

根本启动不了走USB协议的外置硬盘里的系统,试过都不行,服了、、只好装到主硬盘再通过(asr)恢复主硬盘宗卷(要求密封完整,byd有验证)到外置硬盘中、、
在恢复模式中装到外置硬盘、在操作系统中运行相匹配的安装器、都他妈不行、

https://discussions.apple.com/thread/253787672?sortBy=rank

似乎只有使用APFS格式化的外部雷雳驱动器才能启动。USB闪存驱动器不可启动,您无法将APFS放在安装程序卷上

要关sip才能安装pkg,但是关闭sip会破坏卷宗密封

M1 MAX 不支持 Big Sur (11.x),原因:安装版本不能超过出厂版本(😅)
上面说的USB协议是指走的USB3 <=10gb/s速率的协议或通道
内置硬盘走pcie协议没问题,外置硬盘走USB4/雷雳4(速率>=40gb/s)协议(通过PCI-Express进行连接)可以启动.

2024年12月9日 星期一

通过brew更新python后,pyenv可能需要更新相关pyvenv.cfg文件路径

ln -s /opt/homebrew/bin/python3 /opt/homebrew/bin/python

2024年12月2日 星期一

解决macOS通过brew安装rust/gem安装依赖后PATH路径问题.

例如: gem install cocoapods,命令gem envEXECUTABLE DIRECTORY添加到PATH中

安装rust

1
2
brew install rust # rustc compiler
brew install rustup # toolchain manager

如果遇到无法解决的奇奇怪怪的问题,就用官方安装办法尝试

1
2
3
rustup self uninstall
brew remove rust rustup
curl -sSf https://sh.rustup.rs | sh

2024年11月23日 星期六

macOS 语音备忘录 录音存放位置

1
open ~/Library/Group\ Containers/group.com.apple.VoiceMemos.shared/Recordings

macOS 日志/临时文件相关位置

1
2
3
4
5
6
7
8
9
/Library/Logs
/private/var/tmp
/private/var/log
/private/var/logs
/private/tmp
open ~/Library/Logs
open ~/Library/Caches # 参考路径: /Users/lanyun/Library/Caches
/private/var/root/Library/Logs
/private/var/root/Library/Caches

全局环境变量设置 参考:

1
/bin/launchctl setenv MTL_HUD_ENABLED 1

2024年11月13日 星期三

部分域名如 *.cnki.net 需用国内DNS解析如 223.5.5.5,否则访问不了.

2024年11月7日 星期四

v2raya(v2.2.6.2) 在macOS上,某些情况下会导致kernel panic(系统崩溃),简短点说就是macOS 内存保护机制,发现这个进程访问非法内存地址指针(可能说的不准确,但确实和macOS内存保护机制有关,期间CPU跑满),然后系统炸掉重启.

2024年11月6日 星期三

macOS,开机时这个路径/private/var/root/Library/Caches如果不能正常访问,那么开机会卡在login加载界面.

2024年11月5日 星期二

没人🙌比我👐更懂👌macOS☝️(划掉

最近上 macOS 15 了,byd,一些系统服务 launchctl unload -w 后开机还是要启动

结合前几天的研究和 macOS 15 这个特性写了个自动化脚本(😏自用,因为耗费较多精力且还有待完善,暂不免费公开,有bug,出问题了我不想负责.)

脚本自动关闭系统收集数据相关进程,且能保证系统不会炸掉(崩溃),同时自动将一些many disk write(喜欢写数据/拉屎)的应用(例如: Chrome,qq等)的数据路径全部重定向到Ram Disk(内存磁盘)中去,大幅缓解SSD损耗.同时在关机前自动将数据备份到指定路径中,开机时自动恢复.完善的日志记录,方便排查问题.后面再加什么功能就懒得写了.反正对于我来说很爽(磁盘写入敏感性/强迫症用户).

用ishot crack(2.5.6)版截图一次,进程崩溃重启一次(2.5.4 crack版没这个问题),目前通过奇怪的方式修好了(😏,过几版本看修复了没,没的话就分享出来)

2024年11月4日 星期一

禁用systemstats等进程,停止记录系统级别信息

1
2
3
4
5
6
7
8
9
10
11
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.systemstats.analysis.plist;sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.systemstatusd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.systemstats.daily.plist;sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.systemstats.microstackshot_periodic.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ecosystemanalyticsd.plist
launchctl unload -w /System/Library/LaunchAgents/com.apple.mediaanalysisd.plist
launchctl unload -w /System/Library/LaunchAgents/com.apple.photoanalysisd.plist
launchctl unload -w /System/Library/LaunchAgents/com.apple.inputanalyticsd.plist
launchctl unload -w /System/Library/LaunchAgents/com.apple.geoanalyticsd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.analyticsd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.audioanalyticsd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.wifianalyticsd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.osanalytics.osanalyticshelper.plist

进程analyticsd拉屎位置: /private/var/db/analyticsd (我他妈直接rm -rf)

2024年11月3日 星期日

🐎的,艹了,手残把/private/var/db/oah给删了(删文件夹下的内容也会出问题,好不容易定位到这个地方的问题,最近在狠狠地调教macOS系统,删了很多垃圾,禁止一些行为的拉屎等等,但是这不算完☝️,以后有空慢慢玩.)

解决办法:

进恢复模式,用终端,关sip(csrutil disable),pkgutil --files com.apple.pkg.RosettaUpdateAuto --volume xx(自己填硬盘的DATA路径)找到它安装到哪些位置(例如我的是: /Library/Apple/usr/lib/libRosettaAot.dylib /Library/Apple/usr/libexec/oah /Library/Apple/usr/share/rosetta),然后狠狠地rm -rf(不放心自己mv到其他地方).byd,oah相关进程崩溃导致loginwindow无响应,艹了.killall -HUP loginwindow 勉强能用.

2024年11月1日 星期五

如果能研究出macOS应用Containers沙盒通过软链接访问外部存储设备就好了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 关闭 rtcreportingd ,禁止收集诊断和使用情况遥测数据
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.rtcreportingd.plist
# 系统的建议和推荐功能相关的服务, 有高CPU使用率bug
launchctl unload -w /System/Library/LaunchAgents/com.apple.suggestd.plist
# 处理系统软件的安装和更新任务
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.system_installd.plist
# 与壁纸和屏幕保护程序有关,下载动态壁纸
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.idleassetsd.plist
# 恢复启用sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.idleassetsd.plist
# 隔空投送AirDrop等文件分享相关
launchctl unload -w /System/Library/LaunchAgents/com.apple.sharingd.plist
# 恢复launchctl load -w /System/Library/LaunchAgents/com.apple.sharingd.plist
# sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.oahd.plist
# sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.oahd-root-helper.plist

记录一下在macOS环境下遇到electron构建的应用相关报错(主要是不会搞让应用的容器路径下让应用能够访问软链接到外部的路径或文件,应用没权限,因为不知道怎么添加这个权限,我就打算去掉sandbox,但是遇到了些问题.)

使用命令sudo codesign -f -s - --timestamp=none --all-architectures签名,遇到的问题:

[32428:1102/000248.192282:ERROR:network_service_instance_impl.cc(600)] Network service crashed, restarting service.

GPU process exited unexpectedly: exit_code=5

等等.

终于经过研究实践用如下命令签名解决

1
2
# -s 后面是自签的证书,自行生成即可
sudo codesign -f -s "lanyun" --deep --verbose xx

2024年10月31日 星期四

如果你发现ANECompilerService进程写入量很高,那是因为它在

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
/private/var/folders/9y/xxx/C/com.apple.quicklook.ThumbnailsAgent/com.apple.QuickLook.thumbnailcache/thumbnails.data
# 路径中写数据

# 下面内容为杂记
# 关闭macOS索引
mdutil -a -i off;mdutil -aE
# 手动进入睡眠
sudo pmset sleepnow
# 快速签名以及绕过签名的程序
#!/bin/bash
clear
# 定义颜色
BLACK="\033[0;30m"
DARK_GRAY="\033[1;30m"
BLUE="\033[0;34m"
LIGHT_BLUE="\033[1;34m"
GREEN="\033[0;32m"
LIGHT_GREEN="\033[1;32m"
CYAN="\033[0;36m"
LIGHT_CYAN="\033[1;36m"
RED="\033[0;31m"
LIGHT_RED="\033[1;31m"
PURPLE="\033[0;35m"
LIGHT_PURPLE="\033[1;35m"
BROWN="\033[0;33m"
YELLOW="\033[0;33m"
LIGHT_GRAY="\033[0;37m"
WHITE="\033[1;37m"
NC="\033[0m"
CLTGDIR="/Library/Developer/CommandLineTools/"
# 检查是否具有管理员权限
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}请以管理员身份运行此脚本。${NC}"
exec sudo "$0" "$@"
fi
while true; do
clear
echo ""
echo -e "${GREEN}macOS小助手${NC} ${RED}by lw404-ai${NC}"
echo ""
PS2='直接回车默认执行 [重新签名] 与 [绕过签名] 选项 (其他选择请输入非空字符): '
PS3='请输入数字然后按下回车进行选择: '
options=(
"绕过签名认证 (可解决『应用无法运行』问题)"
"应用进行签名 (可解决『意外退出/崩溃闪退』问题)"
"查看SIP状态"
"禁用系统更新提示"
"退出脚本"
)
# 提示用户选择操作
read -p "$PS2" REPLY
# 如果用户直接按回车不输入,执行选项1和选项2
if [[ -z "$REPLY" ]]; then
# 执行选项1:绕过签名认证
echo -e "${YELLOW}请将需要执行的程序拖放到此处,然后按回车键${NC}"
read -e -p "应用路径: " FILEPATH1
if [ -e "$FILEPATH1" ]; then
sudo spctl --master-disable
sudo xattr -rd com.apple.quarantine "$FILEPATH1"
echo -e "${GREEN}--- 1 ---绕过签名成功!${NC}"
else
echo -e "${RED}路径无效,请确认文件是否存在。${NC}"
fi
if [ -e "$FILEPATH1" ];then
if [ ! -d "$CLTGDIR" ]; then
echo -e "${RED}未安装Command Line Tools,请先安装。${NC}"
echo "你可以通过运行 'xcode-select --install' 来安装。"
else
sudo codesign --force --deep --sign - "$FILEPATH1"
echo -e "${GREEN}--- 2 ---重新签名成功!${NC}"
fi
fi
else
# 用户选择了某个选项,进入select逻辑
select opt in "${options[@]}"; do
case $opt in
"绕过签名认证 (可解决『应用无法运行』问题)")
echo ""
echo -e "${YELLOW}请将需要绕过签名的程序拖放到此处,然后按回车键${NC}"
read -e -p "应用路径: " FILEPATH
if [ -e "$FILEPATH" ]; then
sudo spctl --master-disable
sudo xattr -rd com.apple.quarantine "$FILEPATH"
echo -e "${GREEN}绕过签名认证成功!${NC}"
else
echo -e "${RED}路径无效,请确认文件是否存在。${NC}"
fi
break
;;
"应用进行签名 (可解决『意外退出/崩溃闪退』问题)")
echo ""
echo -e "${YELLOW}请将需要签名的程序拖放到此处,然后按回车键${NC}"
read -e -p "应用路径: " FILEPATH
if [ -e "$FILEPATH" ]; then
if [ ! -d "$CLTGDIR" ]; then
echo -e "${RED}未安装Command Line Tools,请先安装。${NC}"
echo "你可以通过运行 'xcode-select --install' 来安装。"
else
sudo spctl --master-disable
sudo codesign --force --deep --sign - "$FILEPATH"
echo -e "${GREEN}签名成功!${NC} 请重新运行应用查看结果。"
fi
else
echo -e "${RED}路径无效,请确认文件是否存在。${NC}"
fi
break
;;
"查看SIP状态")
echo ""
echo -e "您选择了${LIGHT_BLUE}查看SIP状态${NC}"
csrutil status
echo -e "${RED}disabled${NC} 代表SIP已${CYAN}关闭${NC}${RED}enabled${NC} 代表SIP已${YELLOW}开启${NC}。"
break
;;
"禁用系统更新提示")
echo ""
echo -e "您选择了${LIGHT_BLUE}禁用系统更新提示${NC}"
sudo defaults write com.apple.systempreferences AttentionPrefBundleIDs 0
sudo killall Dock
echo -e "${GREEN}系统更新提示已禁用!${NC}"
break
;;
"退出脚本")
echo -e "${RED}脚本结束,窗口即将关闭${NC}"
exit 0
;;
*)
echo -e "${RED}无效选择,请重新输入。${NC}"
;;
esac
break
done
fi
echo ""
echo -e "${YELLOW}按下任意键重新运行脚本,或按下ESC键退出${NC}"
read -rsn1 key
if [[ $key == $'\e' ]]; then
echo -e "${RED}脚本结束,窗口即将关闭${NC}"
break
fi
done
exit 0

# 视频片头/尾剪去
for file in *.mp4; do
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
new_duration=$(echo "$duration - 15 - 5" | bc)
ffmpeg -i "$file" -ss 5 -t "$new_duration" -c copy "temp_$file"
mv "temp_$file" "$file"
done

# openwrt 刷新 dns 缓存
/etc/init.d/dnsmasq restart

# 配置虚拟 python
python3 -m venv .venv
source .venv/bin/activate
1
2
3
4
5
6
7
8
9
10
11
# 命令存档参考
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--disk-cache-size=1 \
--media-cache-size=1 \
--disable-gpu-program-cache \
--disable-gpu-shader-disk-cache \
--skia-font-cache-limit-mb=1 \
--skia-resource-cache-limit-mb=1 \
--v8-cache-options=none > /dev/null 2>&1

# 因为我直接把整个目录软链接到RamDisk上了,并做了定期备份,所以就用不上了.

还是Safari文明些,不像Google Chrome喜欢往disk拉屎(many disk write).

2024年10月30日 星期三

删除Google Chrome上该死的旧版本.

1
2
#路径 
open '/Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions'

利用TmpDisk,将一些cache目录(特别是Chrome,Spotify等喜欢disk write的傻逼软件)重定向到内存磁盘上去了.顺便在系统允许的范围内也禁用一些喜欢disk write的软件(如:helpd)

记录macOS启动流程中目录不可访问失败

1
2
3
# xxx 请根据实际情况,懒的补充了,以后有机会弄
/private/var/folders/9y/xxx/0/com.apple.LaunchServices.dv
~/Library/Caches # 关键目录,用户空间壁纸等重要进程的依赖,有些逼系统应用逻辑有毛病,别软链接重定向会出毛病,猜测可能是db数据库文件不能软链接.

2024年10月28日 星期一

垃圾macOS,下面👇命令 ⚠️ 慎用(待完善)! 有可能会导致系统崩溃.(先别加-w,不然崩溃重启后你需要迅速执行launchctl load -w相关命令,否则有可能会连续崩溃.)

macOS禁用并删除一部分(不完全)系统/软件日志:

1
2
3
4
5
6
7
8
9
10
11
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.logd.plist # 慎用
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.logd_helper.plist # 慎用
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.logd_reporter.plist # 慎用
sudo rm -rf "/private/var/db/diagnostics"
sudo rm -rf "/private/var/db/DiagnosticsReporter"
sudo rm -rf "/private/var/db/uuidtext"
sudo rm -rf "/Library/Logs"
sudo rm -rf "/Users/$(whoami)/Library/Logs"
sudo rm -rf "/private/var/log"*

其他相关命令

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
sudo log erase --all # 释放日志
echo pffff >> dsc; sudo rm -rf /private/var/db/uuidtext/dsc; sudo mv dsc /private/var/db/uuidtext/ # 不如: sudo rm -rf /private/var/db/uuidtext;sudo touch /private/var/db/uuidtext
# 关闭防火墙日志记录
sudo plutil -convert xml1 /Library/Preferences/com.apple.alf.plist # 将plist 二进制文件转换为 XML 文本
sudo vim /Library/Preferences/com.apple.alf.plist # 将loggingenabled值改为0,然后保存
sudo plutil -convert binary1 /Library/Preferences/com.apple.alf.plist # 转换回去
# 编辑syslogd 和 aslmanager的配置文件
sudo vim /private/etc/asl.conf # 全部注释掉
# 重启syslogd服务
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
# 可以去/private/etc/asl目录下,对某些应用进一步配置

# macOS上 adguard 拉的屎(日志)不支持禁用,也不方便删除.
# 相关日志路径如下
/Users/$(whoami)/Library/Group Containers/TC3Q7MAJXF.com.adguard.mac/Library/Logs
/Users/$(whoami)/Library/Group Containers/TC3Q7MAJXF.com.adguard.mac/Logs
# 先打开软件后再删除后sudo touch处理,否则软件启动不了.
# 或者完全杀死adguard相关进程然后
rm -rf "/Users/$(whoami)/Library/Group Containers/TC3Q7MAJXF.com.adguard.mac/Library/Logs/com.adguard.mac.adguard/Adguard-group.log";ln -s /dev/null "/Users/$(whoami)/Library/Group Containers/TC3Q7MAJXF.com.adguard.mac/Library/Logs/com.adguard.mac.adguard/Adguard-group.log"
# /Library/Logs/com.adguard.mac.adguard/Adguard-shared.log 这个文件同上操作.如果因为helper进程导致强占不了,可以先搞个 ln -s /dev/null ./tmp 再 sudo mv ./tmp 过去.

# 重启
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.logd.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.logd_helper.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.logd_reporter.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.watchdogd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.logd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.logd_helper.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.logd_reporter.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.watchdogd.plist
# macOS 14.6.1 经过测试,注意到当"/private/var/db/diagnostics"为文件时,重启logd,由于logd无法读取到/private/var/db/diagnostics/logd.0.log等文件会导致异常,120秒后watchdog检测到logd未正常工作,用户态崩溃,崩溃恢复后logd依然未能正常工作,但是watchdog似乎未检测到?反正就是没采取内核panic崩溃行动.(你问为什么?我不到啊,问就是macOS watchdog特性.😂,<del>还有可能是系统崩溃前,我恢复了/Library/Logs路径,让logd能正确写入崩溃报告</del>也许有关系,但touch /Library/Logs/DiagnosticReports没有影响) 似乎因为logd每10分钟成功向/Library/Logs/DiagnosticReports中写日志,让watchdog认为logd没问题,所以就没崩溃😂.
# 恢复/private/var/db/diagnostics目录,发现logd.0.log显示logd进入sick mode,而且还在DiagnosticReports拉错误日志
# <del>小总结下,不想要日志直接操作如下</del>
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.logd.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.logd_helper.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.logd_reporter.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.watchdogd.plist
sudo rm -rf /private/var/db/diagnostics;sudo rm -rf /private/var/db/uuidtext # touch命令就省略了,可以自行补充.
sudo launchctl load /System/Library/LaunchDaemons/com.apple.logd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.watchdogd.plist
# 自此,关于logd的日志不算完美的结束了,logd每10分钟拉屎也拉不出来,目前缺点是如果发生内核崩溃kernel panic,没办法保存相关日志,导致没办法排查问题,等我以后有空了完善下GitHub关于黑洞文件系统项目就能解决这个问题,现在不行.
# 驳回上面小总结
# 发现新特性:touch uuidtext,重启logd进程会进入sick mode,如果能正常向/private/var/db/diagnostics/logd.0.log写入日志(但是会10多分钟进程会重启然后写一条),那么就不会在DiagnosticReports拉崩溃日志
# 如果完全不想要logd记录日志,可以这样做 (注意-w是永久保存的意思,重启后不会恢复)
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.logd_helper.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.logd_reporter.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.logd.plist
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.watchdogd.plist
sudo rm -rf /private/var/db/diagnostics/*
sudo launchctl load /System/Library/LaunchDaemons/com.apple.logd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.watchdogd.plist
# <del>大部分情况下是稳定的,但某些情况下watchdog认为logd未正常工作就崩了.</del>
# 我他妈直接sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.logd.plist
# 重启后,watchdog居然没给我崩溃.logd进程未运行.稳定性比上面都好,因为不存在logd进程重启了.


# 后言
# 有人可能会说,我死了,硬盘都还活着,这样做完全没必要,但是我想说的是,我有电子洁癖,不想这些傻逼进程(除了系统进程外还有些应用)乱拉屎,拉的屎我还看不懂,有些系统进程是专门记录信息发送Apple公司的,有些应用他妈的强制收集信息上报,老子把上传接口给block(网络屏蔽)了,他妈的还是要源源不断地生成屎(日志)在我硬盘上,例如:腾讯系xlog加密日志,谁他妈知道你偷偷收集了什么信息,我他妈不想分享/贡献我的电脑信息和日志给任何人/公司.我他妈也不想这些傻逼进程生成我看不懂的日志,老子又不是macOS系统开发者,给老子生成这么专业的日志干嘛.也许有人会说,你有日志可以发给别人帮助我解决问题.我他妈想说的是,老子有手有脑子,自己能解决,会用Google,社恐不想麻烦别人.所以这些专业的JB(勾巴)日志给老子滚😡!

注意事项

1
2
3
4
5
# 通过对panicString(/Library/Logs/DiagnosticReports)研究发现,如果logd进程在120秒内没有响应watchdogd进程(通过launchctl unload命令,此时logd已经被关闭/杀死),那么watchdogd进程将触发的用户态系统崩溃
# 所以杀/结束logd进程之前,先杀死watchdogd进程(虽然watchdogd进程也挺有用的).
# launchctl unload -w /System/Library/LaunchDaemons/com.apple.watchdogd.plist
# 禁用后发现,macOS发现watchdogd进程挂了也会崩溃.算了,懒的继续搞了,以后有时间再看看.
# 注: launchctl unload 添加 -w 是永久保存修改的意思,即重启后不会再load

(可选)关闭Apple 推送通知服务 (apsd)

1
2
3
4
5
6
7
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.apsd.plist
# 其他服务
launchctl unload -w /System/Library/LaunchAgents/com.apple.helpd.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist # 索引相关
# 恢复sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
launchctl unload -w /System/Library/LaunchAgents/com.apple.corespotlightd.plist # 索引相关,谨慎禁用,可能导致某些应用索引功能异常,如Paste无法搜索等.
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.coresymbolicationd.plist # 提供将崩溃报告中的内存地址转换为源代码中的函数名和行号等作用

(无效)禁用系统更新等服务(以后尝试用Santa看看)

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
#sudo launchctl unload /System/Library/LaunchAgents/com.apple.SoftwareUpdateNotificationManager.plist
#sudo launchctl bootout system /System/Library/LaunchDaemons/com.apple.analyticsd.plist
#sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.analyticsd.plist

# 下面代码没用
# Daemons to disable
daemons=('com.apple.analyticsd' 'com.apple.appleseed.fbahelperd' 'com.apple.dprivacyd' 'com.apple.ReportCrash.Root' 'com.apple.SubmitDiagInfo')

# Agents to disable
agents=('com.apple.appleseed.seedusaged' 'com.apple.appleseed.seedusaged.postinstall' 'com.apple.ReportCrash' 'com.apple.softwareupdate_notify_agent' 'com.apple.SoftwareUpdateNotificationManager' 'com.apple.ReportCrash')

for daemon in "${daemons[@]}"; do
{
sudo /usr/libexec/PlistBuddy -c "Add Disabled bool true" /System/Library/LaunchDaemons/${daemon}.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/${daemon}.plist
} &> /dev/null
# If the disabled flag is set, print success message
daemon_flag=$(/usr/libexec/PlistBuddy -c "Print Disabled" /System/Library/LaunchDaemons/${daemon}.plist 2> /dev/null)
if [[ ${daemon_flag} == 'true' ]]; then
echo "[SUCCESS] Disabled ${daemon}"
else
echo "[ERROR] Failed to disable ${daemon}"
fi
done

for agent in "${agents[@]}"; do
{
sudo /usr/libexec/PlistBuddy -c "Add Disabled bool true" /System/Library/LaunchAgents/${agent}.plist
sudo launchctl unload -w /System/Library/LaunchAgents/${agent}.plist
} &> /dev/null
# If the disabled flag is set, print success message
agent_flag=$(/usr/libexec/PlistBuddy -c "Print Disabled" /System/Library/LaunchAgents/${agent}.plist 2> /dev/null)
if [[ ${agent_flag} == 'true' ]]; then
echo "[SUCCESS] Disabled ${agent}"
else
echo "[ERROR] Failed to disable ${agent}"
fi
done

2024年7月24日 星期三

macOS 图书 中书籍位置信息:

iCloud 位置: ~/Library/Mobile\ Documents/iCloud\~com\~apple\~iBooks/Documents

本机位置: ~/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks

open命令打开上面路径即可找到你的书籍文件,可惜目前我只了解到Mac上可以这样无视苹果图书软件限制导出书籍.

2024年7月23日 星期二

在macOS上清除 OrbStack docker 容器日志.

方法一:

1
2
3
4
docker inspect --format='{{.LogPath}}' 容器ID # 定位路径
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
# 这种方法将创建一个容器,并将其加入主机的命名空间,之后通过执行 `nsenter` 命令在初始化进程(PID 1)的命名空间中创建一个新的 shell。由于它依赖于稳定的 Docker 特性来访问虚拟机,所以在后续版本中不会有太大变化。在示例中我使用了 `debian` ,但您可以将其替换为任何具有 `nsenter` 的镜像(例如 `alpine` 、`busybox` 等)
# 来源: https://stackoverflow.com/a/66670709

方法二(推荐):

1
2
3
# 启动任意一个容器,并复制其ID
open ~/OrbStack/docker/containers/容器ID/var/lib/docker/containers
# 之后进入想要删除的容器ID,然后删除ID.log文件或者清除内容即可.

上面方法都是利用了Docker CE virtual machine来实现访问/var/lib/docker路径.

2024年5月3日 星期五

uu加速器 台服英雄联盟 IP似乎被封禁.利用Proxifier将pvp.net子域名走代理(eg:香港节点),其余域名走direct,通过uu加速器设定的6.6.6.6本地DNS解析实现加速.另外,在macOS上,uu加速器会走系统设定的代理服务,而代理服务通过Proxifier分流到direct.这会导致一个DNS loop的问题.解决办法:在系统设置,网络,过滤条件中关闭Proxifier DNS代理.

tips: 如果Adguard开启dns保护,大概率会导致lol客户端报错: 无法连接到平台SIPT ,因为uu加速器设置的dns会被adguard的dns模块给劫持了,导致客户端获取ip不匹配/未走加速器线路.

2024年3月30日 星期六

tmd,CodeWhisperer疯狂下载/上传,域名:specs.codewhisperer.us-east-1.amazonaws.com,鬼知道在上传什么数据.

2024年3月25日 星期一

修改passwall服务器端中各个协议配置模版相关代码位置:

1
/usr/lib/lua/luci/passwall

2024年2月18日 星期日

对于macOS中sed命令.POSIX 规范要求sed在(a/i/c)\后面需要有一个换行符.

例如:

1
2
3
4
5
6
7
8
9
# 下面代码会将$file路径文件中第3行插入内容This is added at the beginning of line 3,原来的第3行变成第4行
sed -i '' -e "3i\\
This is added at the beginning of line 3" $file
# 或者这样写
sed -i '' -e '/#/i\'$'\nwords' $file # 在#字符的前面插入一行words
sed -i '' -e '1i\'$'\nwords' $file # 在第一行前加一行words
sed -i '' -e $'1i\\\nwords' $file
# 上面是插入行(新增新行)的写法
# 只需将 -e 换成 -E,即可实现不新增行,在原有的行的基础上,在行首/尾插入

2024年2月17日 星期六

已知,macOS adobe软件会导致系统指针切换为自定义指针异常.解决: 退出相关软件即可恢复正常.

掌握一项技能: 手动将位图转换为矢量图(包含其中调整,修饰等)

2024年1月25日 星期四

(不完善,不全面,存在缺陷)删除并阻止macOS日志生成.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
user=$(whoami)
log_path=(
"/Library/Logs" # 不建议处理,可以存系统崩溃等日志
"/Users/${user}/Library/Logs"
"/private/var/log" # 开机若无此目录,影响DNS
"/private/var/logs"
)
sudo rm -rf "${log_path[@]}"
sudo touch "${log_path[@]}"
sudo chmod 000 "${log_path[@]}"

# 注意: macOS重启后,由于"/private/var/log"目录被限制,故无法进行DNS查询.
# 下面是重启后的解决办法:
sudo rm -rf "/private/var/log"
dig lanyundev.com +answer || dig lanyundev.com +answer
sudo touch "/private/var/log"
sudo chmod 000 "/private/var/log"
# 注意: 由于JB家的IDE依赖"/Users/${user}/Library/Logs"做日志存储.
# 没有简单解决办法,你可以删除这个目录然后参考我下面这个项目,将路径映射到黑洞文件系统
# https://github.com/LanYunDev/Null-File-System
sudo rm -rf "/Users/${user}/Library/Logs"
# 备注: apachectl 依赖 "/private/var/log" 文件夹

杀死提交诊断信息进程(应该不止这一个):killall SubmitDiagInfo

2024年1月24日 星期三

禁止macOS连接到新网络时检查互联网连接并启动 Captive Portal 助理实用程序应用程序

1
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control.plist Active -bool false

2024年1月23日 星期二

在macOS M芯片上关闭SIP(System Integrity Protection status: disabled)的情况下,如果nvram boot-args中存在amfi_get_out_of_my_way=0x1,那么java将crash崩溃.报错部分内容如下

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
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGBUS (0xa) at pc=0x0000000101bdd020, pid=1399, tid=10499
#
# JRE version: (21.0.1) (build )
# Java VM: OpenJDK 64-Bit Server VM (21.0.1, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64)
# Problematic frame:
# V [libjvm.dylib+0x37d020] CodeHeap::allocate(unsigned long)+0x15c
#
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
#

--------------- S U M M A R Y ------------

Command Line:

Host: "MacBookPro18,2" arm64, 10 cores, 64G, Darwin 23.3.0, macOS 14.3 (23D56)
Time: Tue Jan 23 13:07:16 2024 CST elapsed time: 0.012328 seconds (0d 0h 0m 0s)

--------------- T H R E A D ---------------

Current thread (0x0000000134808600): JavaThread "Unknown thread" [_thread_in_vm, id=10499, stack(0x000000016fa78000,0x000000016fc7b000) (2060K)]

Stack: [0x000000016fa78000,0x000000016fc7b000], sp=0x000000016fc7a940, free space=2058k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.dylib+0x37d020] CodeHeap::allocate(unsigned long)+0x15c
V [libjvm.dylib+0x2015a4] CodeCache::allocate(int, CodeBlobType, bool, CodeBlobType)+0x58
V [libjvm.dylib+0x1fbaa8] BufferBlob::create(char const*, int)+0x7c
V [libjvm.dylib+0x788bcc] initialize_stubs(StubCodeGenerator::StubsKind, int, int, char const*, char const*, char const*)+0xac
V [libjvm.dylib+0x788b10] StubRoutines::initialize_initial_stubs()+0x38
V [libjvm.dylib+0x39dcf4] init_globals()+0x2c
V [libjvm.dylib+0x7d6518] Threads::create_vm(JavaVMInitArgs*, bool*)+0x228
V [libjvm.dylib+0x43407c] JNI_CreateJavaVM+0x74
C [libjli.dylib+0x8950] JavaMain+0x100
C [libjli.dylib+0xb988] ThreadJavaMain+0xc
C [libsystem_pthread.dylib+0x7034] _pthread_start+0x88

siginfo: si_signo: 10 (SIGBUS), si_code: 1 (BUS_ADRALN), si_addr: 0x0000000112304000

对于AMFI,应该使用此命令来代替上面的参数填入:sudo defaults write /Library/Preferences/com.apple.security.libraryvalidation.plist DisableLibraryValidation -bool true

2023年12月1日 星期五

macOS允许某个用户在不输入密码(免密码root执行)的情况下用root身份执行特定的命令.

下面以我lanyun用户,命令spoof为例

1
2
3
4
5
which spoof # 查询命令路径
sudo vim /etc/sudoers # 编辑这个文件
# 在 %admin ALL = (ALL) ALL 这行之后新增一行.
lanyun ALL = (ALL) NOPASSWD: /opt/homebrew/bin/spoof
# 之后 esc :wq! 保存就OK了.

2023年11月8日 星期三

推荐一个适用于 macOS 的二进制授权和监控系统 Santa,Google开发,专制流氓.

快速删除一堆小文件(文件数量多):

1
2
3
4
5
tmp=$(python3 -c "from uuid import uuid4;print(uuid4())")
tmp_dir="$(dirname "$(pwd)")/tmp-${tmp}"
mkdir -p "${tmp_dir}"
rsync --delete-before -d "${tmp_dir}/" ./ # 这里./代表当前目录
rm -rf "${tmp_dir}"

如果是大文件,先用 truncate -s 0 <FILE> 把大小置为 0 再删除.

修复问题: 现在不能打开“废纸篓”,因为它正用于其他用途 下面代码可能没用.

1
2
3
4
location="$HOME" # 如果是其他硬盘,请自行修改,并下面将Trash修改为Trashes
mkdir -p "${location}/.Trash"
shopt -s dotglob; sudo chflags -R noschg,nouchg "${location}/.Trash"; sudo rm -rf "${location}/.Trash/*"
# 无锁定文件可用这个命令: shopt -s dotglob;rm -rf "${location}/.Trash/*"

禁用 mds_stores:

mdsSpotlight的一部分.也就是你按 Command (⌘) + 空格 弹出来的那个东西.它为所有文件建立索引,以便在你要搜索文件的时候快速的找到你想要的东西.因为我用基本上用Scherlokk而不用Spotlight,而且苹果这玩意不仅吃CPU和内存,还狠狠地吃硬盘I/O,硬盘寿命—–

  • 在终端中输入 sudo mdutil -a -i off 即可禁用索引.然后去硬盘根目录删除隐藏文件夹.Spotlight-V100(内置硬盘,应该在~下).排除索引: 设置 -> Siri与聚焦 -> 聚焦隐私
  • 若想恢复索引,需要在终端中输入 sudo mdutil -a -i on

2023年10月26日 星期四

在macOS上禁用(毒瘤+垃圾)软件:WeChat、QQ的部分日志目录权限

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
# WeChat
cd ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/com.tencent.xinWeChat/2.0b4.0.9
sudo chown root:wheel ./log
sudo chmod 400 log

cd ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/com.tencent.xinWeChat/2.0b4.0.9
sudo chown root:wheel ./log
sudo chmod 400 log

cd ~/Library/Containers/com.tencent.xinWeChat/Data/.wxapplet
sudo chown root:wheel ./xlog
sudo chmod 400 xlog

# QQ
cd ~/Library/Containers/com.tencent.qq/Data/Library/Application\ Support/QQ/global/nt_data
sudo chown root:wheel ./Log
sudo chmod 400 Log

cd ~/Library/Containers/com.tencent.qq/Data/Library/Application\ Support/QQ
# 然后cd进入 nt_qq_** 的目录
sudo chown root:wheel ./log
sudo chmod 400 log
sudo chown root:wheel ./log-cache
sudo chmod 400 log-cache

# 上面QQ操作不适用于6.9.25版本(应该适用之前的版本,具体多少忘了)
# 下面适用于6.9.25版本.其他版本自行参考并搜索log相关.
user=$(whoami)
log_path=(
"/Users/${user}/Library/Containers/com.tencent.qq/Data/Library/Logs"
"/Users/${user}/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/global/nt_data/Log"
"/Users/${user}/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/log"
# 下面和日志无关(禁用可能导致未知问题),可注释掉
"/Users/${user}/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Session Storage"
"/Users/${user}/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Local Storage"
)
target_dir="/Users/${user}/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ"
sub_dir=$(find "${target_dir}" -maxdepth 1 -mindepth 1 -type d -name "nt_qq*")
for subdir in "${sub_dir[@]}"; do
log_path+=("${subdir}/nt_data/log")
log_path+=("${subdir}/nt_data/log-cache")
done
# 下面和日志无关(禁用可能导致未知问题),可注释掉
target_dir="/Users/${user}/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Partitions"
sub_dir=$(find "${target_dir}" -maxdepth 1 -mindepth 1 -type d -name "qqnt*")
for subdir in "${sub_dir[@]}"; do
log_path+=("${subdir}/shared_proto_db")
log_path+=("${subdir}/Session Storage")
log_path+=("${subdir}/Local Storage")
done

sudo rm -rf "${log_path[@]}"
sudo touch "${log_path[@]}"
sudo chmod 000 "${log_path[@]}"

顺便删除截图插件

1
2
3
4
5
6
7
8
9
10
11
12
13
ban_path=(
"/Applications/QQ.app/Contents/Resources/app/QQ ScreenCapture plugin.app"
#"/Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/Resources"
)
rm -rf "${ban_path[@]}"
sudo touch "${ban_path[@]}"
sudo chmod 000 "${ban_path[@]}"
# 备注: /Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/ScreenCaptureAgent 不能动,除非搞定/Applications/QQ.app/Contents/Resources/app/wrapper.node

# 下面是旧方法
sudo rm -rf /Applications/QQ.app/Contents/Resources/app/QQ截屏插件.app
sudo chown root:wheel /Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/Resources
sudo chmod 400 /Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/Resources

2023年10月24日 星期二

iptables IP阻断

单个IP的命令是

iptables -I INPUT -s 59.151.119.180 -j DROP

封IP段的命令是

iptables -I INPUT -s 211.1.0.0/16 -j DROP

iptables -I INPUT -s 211.2.0.0/16 -j DROP

iptables -I INPUT -s 211.3.0.0/16 -j DROP

封整个段的命令是

iptables -I INPUT -s 211.0.0.0/8 -j DROP

封几个段的命令是

iptables -I INPUT -s 61.37.80.0/24 -j DROP

iptables -I INPUT -s 61.37.81.0/24 -j DROP

iptables -I INPUT -s 211.1.0.0/16 -j DROP

解封:

iptables -L INPUT

iptables -L –line-numbers 然后iptables -D INPUT 序号

iptables 限制ip访问

通过iptables限制9889端口的访问(只允许192.168.1.201、192.168.1.202、192.168.1.203),其他ip都禁止访问

iptables -I INPUT -p tcp –dport 9889 -j DROP

iptables -I INPUT -s 192.168.1.201 -p tcp –dport 9889 -j ACCEPT

iptables -I INPUT -s 192.168.1.202 -p tcp –dport 9889 -j ACCEPT

iptables -I INPUT -s 192.168.1.203 -p tcp –dport 9889 -j ACCEPT

注意命令的顺序不能反了。

列出 INPUT链 所有的规则:iptables -L INPUT –line-numbers

删除某条规则,其中5代表序号(序号可用上面的命令查看):iptables -D INPUT 5

开放指定的端口:iptables -A INPUT -p tcp –dport 80 -j ACCEPT

禁止指定的端口:iptables -A INPUT -p tcp –dport 22 -j DROP

拒绝所有的端口:iptables -A INPUT -j DROP

2023年9月29日 星期五

Windows RDP远程桌面无密码账户 连接发生报错:

ERRCONNECT_ACCOUNT_RESTRICTION(Ox00000017)

解决: 开始 — 运行(win+R) — secpol.msc — 安全设置 — 本地策略 — 安全选项 — 帐户:使用空密码的本地帐户只允许… — 双击 — 选择 “已禁用”

2023年9月20日 星期三

杂记:

/Users/$USER/Library/Preferences/w3access

~/Library/Preferences/w3access

增加一项公开云端存储方案–IPFS

2023年8月20日 星期日

macOS在关sip下装crack的ios应用

关闭库验证

sudo defaults write /Library/Preferences/com.apple.security.libraryvalidation.plist DisableLibraryValidation -bool true

arm64e第三方调试

sudo nvram boot-args=”-arm64e_preview_abi”

查看ssv状态

csrutil authenticated-root status

如果开启,恢复模式进去status换disable进行关闭

2023年8月9日 星期三

mac的sed真JB难用,特么我想用sed命令在某行之后添加一些内容,需要换行,网上看一圈都是用的单引号,但是单引号没法弄变量,我脚本中行数不是固定的,需要动态获取,看了又看stackoverflow和sed官方文档,属实给我整晕了.🧠直接宕机.(不过总算是解决了.原创原理不解释了.真tm复杂)

给2个典型,能用就行,想弄明白下面参考链接🔗

先说单引号.

1
2
3
4
5
6
echo "lan,yun,dev,com" | sed $'s/,/\\\n/g'
# 运行结果为
lan
yun
dev
com

前面加个$,然后\\\n就是换行了

双引号(这里直接借用https://stackoverflow.com/a/6111851).

1
2
3
4
5
echo test1234foo123bar1234 | sed "s/\(1234\)/\\`echo -e '\n\r'`\1/g"
# 运行结果为
test
1234foo123bar
1234

然后在这里浅浅说一下如果用sed a\附加命令又用到双引号该怎么操作.

1
2
3
4
sed -i '' -e "${tmp_line}a\\
内容1 \\
内容2 \\
" "${DestDir}/文件"

(没错,用的是\\来表示换行,是不是很神奇?用两个反斜杠表示一个反斜杠,我的评价是Mac版的sed逻辑真nm傻*逼.)

参考链接🔗: 关于流编辑器 sed 的常见问题 regex - Insert linefeed in sed (Mac OS X) - Stack Overflow

linux - \n is not working on the MacOS shell with sed - Stack Overflow regex - Replace newline with string in sed on mac - Stack Overflow sed Man Page - macOS - SS64.com 如何在 MacOS 上使用 sed 添加新行? - 堆栈溢出

更多的就不整了,看完你应该懂了吧?

git grep -I --name-only -z -l $'\r' | xargs -0 sed -i '' $'s/\r$//'

查找所有包含Windows风格换行符的文件,并将这些文件中的回车符\r替换为空字符串,从而将其转换为Unix风格的换行符\n

2023年8月4日 星期五

为新版macOS的sudo提供指纹touch ID支持.

先看看ls /etc/pam.d/下有没有sudo_local.template

有的话,直接注释掉第3行内容

image-20230804230532517

没有的话(或者不生效的话),直接命令

1
sudo sed -i ".bak" '2s/^/auth       sufficient     pam_tid.so\'$'\n/g' /etc/pam.d/sudo

✅解决!

2023年4月24日 星期一

修复 macOS 微信文件变成只读.文章

1
2
3
find "${HOME}/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat" -type f -path '*/*/Message/MessageTemp/*/File/*' -exec chmod 644 {} \;
# 下面是旧版代码
find "$HOME/Library/Containers/com.tencent.xinWeChat/Data/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat" -type f -path '*/*/Message/MessageTemp/*/File/*' -exec chmod 644 {} \;

2023年3月25日 星期六

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pm2 start xxxx

查看log
pm2 log xxxx

xxxxx在重启后自动运行:
只需运行此命令以生成一个活动的启动脚本:
pm2 startup
并冻结自动重生的进程列表:
pm2 save

更新 PM2
我们让它变得简单,版本之间没有重大变化,过程很简单:
npm install pm2@latest -g # pacman -S pm2
然后更新内存中的 PM2 :
pm2 update

pm2 list # 列表PM2 启动的所有的应用程序

pm2文档: https://pm2.keymetrics.io/docs/usage/quick-start/

2023年3月22日 星期三

1
2
3
4
5
6
7
8
9
10
screen -S blog # 新建窗口blog
screen -ls # 列出创建的窗口
screen -r # 回到窗口(只有一个窗口时可以省略参数即后面可以不用加窗口名)
screen -wipe # 检查目前所有的screen作业,并删除已经无法使用的screen作业
# ^+a w 查看所有窗口
# ^+a d 离开窗口
# ^+a k 杀死当前窗口和窗口中运行的程序
# https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

# ssh root@lanyun-nas.direct.quickconnect.cn -p 65534 "screen -S blog && echo "123" "

2022年12月6日 星期二

Windows挂载WebDAV

发生系统错误 67。 找不到网络名。

services.msc

在服务中打开WebClient服务即可

同时允许HTTP与HTTPS:

打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters,修改键BasicAuthLevel值为2

接触50MB文件大小限制:

打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters,修改键FileSizeLimitInBytes值为适当大小

2022年7月2日 星期六

python更新所有库

pip3 install pip-review

pip-review –local –interactive

输入A,全部更新

gdb使用:

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
# 载入一个文件
$ gdb {file}
-cd:设置工作目录;
-q:安静模式,不打印介绍信息和版本信息;
-d:添加文件查找路径;
-x:从指定文件中执行GDB指令;
-s:设置读取的符号表文件。
# 或者进入gdb后:
file {file}

# 运行/重新运行
r

# 继续运行
c

# 显示源程序代码的内容,包括各行代码所在的行号
l

# 下断点
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址> d [编号]
b +/-offset # 在当前暂停位置的偏移下断
tbreak # 只作用一次
rbreak regex # 在正则匹配的函数名开头断点 不会一次消失

# 查看断点
i b
# i 用于查看各类信息

# 删除断点
d 断点序号

# 查看栈
stack <行数>

# 针对源代码的单步
n # 步过
s # 步进

# 针对汇编指令的单步
ni
si

# 显示变量的值
p <value>

# 退出
q

# 查看帮助
h

# 反汇编
disass

# 查看各种数据
x/i
x/s
x/b
# 斜杠后加数字表示查看的数量

# 直接回车进行上一步操作


# 使用命令行参数
gdb --args 命令行+参数等

# backtraces查看堆栈调用:
bt # 显示所有的函数调用栈帧的信息,每个帧一行。
bt n # 显示栈定的n个帧信息。
bt -n # 显示栈底的n个帧信息。
bt full # 显示栈中所有帧的完全信息如:函数参数,本地变量
bt full n # 用发同上。
bt full -n #

2022年5月27日 星期五

初学者指南远离 scanf()

2022年5月16日 星期一

昨天某人打我电话,原来是叫我玩约战重置版本,作为一名小小的股东,我懂,又要钱钱💰了嘛.

IMG_3889

2022年5月13日 星期五

硬盘盒和硬盘都到货啦~赶紧格式化测个速.

image-20220513170641189

个人感觉非常不错!速度达到了雷电3的理论最高数据层传输速度.

2022年5月11日 星期三

设计并买了固态硬盘2T,采用的方案是 USB4.0硬盘盒NVMe M.2选用品牌为绿联 + PCIE4.0协议2T固态硬盘选用品牌为希捷

硬盘花费软妹币: 2182元 硬盘盒 798元 ,合计🟰: 2,980 元.

目前就等到货了…预计能跑到雷电3的数据层的最高速度,因为USB4.0硬盘盒其实也是用的雷电3主控芯片,那我为什么不买雷电3硬盘盒呢?

因为雷电3硬盘盒用的是Intel JHL6340主控芯片,USB-C接口只支持雷电3且不向下兼容USB 3.2、3.1、3.0、2.0;而新款USB 4.0硬盘盒用的是Intel JHL7440主控芯片,USB-C接口不仅支持雷电3且向下兼容USB 3.2、3.1、3.0(不兼容USB 2.0),兼容USB协议最高支持10Gbps(USB 3.2 Gen 2).

Intel JHL6340单链(Single)DP 1.2输出,功率:1.7W。Intel JHL7440双链(Dual)DP 1.4输出,功率:2.4W。两款雷电3芯片的物理传输数据的总带宽均为:22 Gbps ,但是根据数据测试,USB4.0硬盘盒JHL7440)的读写速度明显是要比雷电3硬盘盒JHL6340)的读写速度更快一些.

而且选择**PCIe 4.0 x4 SSD(Gen 4 NVMe SSD)**能让这个固态硬盘毫无余力地发挥雷电接口的最高数据传输速度.

综上,目前方案最适合我这种追求高速读写的传输速度的用户.就是钱包在燃烧🔥…🥹

2022年4月27日 星期三

记录📝一下Hacking Tools

记录📝一下BinWalk安装和命令参数详解.

记录📝一下压缩包破解字符集爆破:

fcrackzip是一个部分用汇编程序编写的快速密码破解程序。它能够通过暴力破解或基于字典的攻击破解受密码保护的 zip 文件,还可以选择使用解压缩结果进行测试。它还可以破解 cpmask 的图像。
命令:fcrackzip -v -b -u -l 1-10 -c1 xxx.zip
解释:-b 暴力破解模式 -c 指定掩码类型(-c1=纯数字,-c2=纯字母,-c3=数字字母混合模式(a=a-z;1=0-9;!=特殊字符)) -l 指定密码长度 -u 压缩文件名

kali自带的帮助文档基本是英文的,用Google给翻译了一下,可能不太准确,凑合和看吧!

[-b–蛮力] 使用暴力破解

[-d–字典] 使用字典破解

[-B–基准] 执行一个小基准

[-c–charset characterset] 指定字符类型(数字,字母,混合等)

[-h–帮助] 显示帮助文档

[–version] 显示此程序的版本

[-v–validate] 健全性检查Algortihm

[-v–verbose] 更详细

[-p–init password string] 指定开始字符(比如要只记得密码是2开头的4位纯数字,可以指定从2000开始破解,提升效率)

[-l–length min max] 指定密码长度区间

[-u–使用unzip] 使用unzip清除错误的密码

[-m–方法编号] 使用方法编号“num”(见下文)

[-2–modulo r/m] 仅计算密码的1/m

rarcrack
此程序使用暴力算法来猜测加密压缩文件的密码。
此程序可以破解zip、7z和rar文件密码。
用法: rarcrack encrypted_archive.ext [–threads NUM] [–type rar|zip|7z]
选项:–help:显示这个屏幕。
–type:你可以指定存档程序,当程序无法检测到合适的文件类型时,需要这样做。
–threads: 你可以指定运行多少个线程,最多12个(默认:2个)。

John the Ripper免费的开源软件,是一个快速的密码破解工具,用于在已知密文的情况下尝试破解出明文的破解密码软件,支持目前大多数的加密算法,如DES、MD4、MD5等。它支持多种不同类型的系统架构,包括Unix、Linux、Windows、DOS模式、BeOS和OpenVMS,主要目的是破解不够牢固的Unix/Linux系统密码。目前的最新版本是John the Ripper 1.8.0版,针对Windows平台的最新免费版为John the Ripper 1.7.9版。

参考它的help

John the Ripper 1.9.0-jumbo-1+bleeding-aec1328d6c 2021-11-02 10:45:52 +0100 OMP [linux-gnu 64-bit aarch64 ASIMD AC]
Copyright (c) 1996-2021 by Solar Designer and others
Homepage: https://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]

–help Print usage summary
–single[=SECTION[,..]] “Single crack” mode, using default or named rules
–single=:rule[,..] Same, using “immediate” rule(s)
–single-seed=WORD[,WORD] Add static seed word(s) for all salts in single mode
–single-wordlist=FILE Short wordlist with static seed words/morphemes
–single-user-seed=FILE Wordlist with seeds per username (user:password[s]
format)
–single-pair-max=N Override max. number of word pairs generated (6)
–no-single-pair Disable single word pair generation
–[no-]single-retest-guess Override config for SingleRetestGuess
–wordlist[=FILE] –stdin Wordlist mode, read words from FILE or stdin
–pipe like –stdin, but bulk reads, and allows rules
–rules[=SECTION[,..]] Enable word mangling rules (for wordlist or PRINCE
modes), using default or named rules
–rules=:rule[;..]] Same, using “immediate” rule(s)
–rules-stack=SECTION[,..] Stacked rules, applied after regular rules or to
modes that otherwise don’t support rules
–rules-stack=:rule[;..] Same, using “immediate” rule(s)
–rules-skip-nop Skip any NOP “:” rules (you already ran w/o rules)
–loopback[=FILE] Like –wordlist, but extract words from a .pot file
–mem-file-size=SIZE Size threshold for wordlist preload (default 2048 MB)
–dupe-suppression Suppress all dupes in wordlist (and force preload)
–incremental[=MODE] “Incremental” mode [using section MODE]
–incremental-charcount=N Override CharCount for incremental mode
–external=MODE External mode or word filter
–mask[=MASK] Mask mode using MASK (or default from john.conf)
–markov[=OPTIONS] “Markov” mode (see doc/MARKOV)
–mkv-stats=FILE “Markov” stats file
–prince[=FILE] PRINCE mode, read words from FILE
–prince-loopback[=FILE] Fetch words from a .pot file
–prince-elem-cnt-min=N Minimum number of elements per chain (1)
–prince-elem-cnt-max=[-]N Maximum number of elements per chain (negative N is
relative to word length) (8)
–prince-skip=N Initial skip
–prince-limit=N Limit number of candidates generated
–prince-wl-dist-len Calculate length distribution from wordlist
–prince-wl-max=N Load only N words from input wordlist
–prince-case-permute Permute case of first letter
–prince-mmap Memory-map infile (not available with case permute)
–prince-keyspace Just show total keyspace that would be produced
(disregarding skip and limit)
–subsets[=CHARSET] “Subsets” mode (see doc/SUBSETS)
–subsets-required=N The N first characters of “subsets” charset are
the “required set”
–subsets-min-diff=N Minimum unique characters in subset
–subsets-max-diff=[-]N Maximum unique characters in subset (negative N is
relative to word length)
–subsets-prefer-short Prefer shorter candidates over smaller subsets
–subsets-prefer-small Prefer smaller subsets over shorter candidates
–make-charset=FILE Make a charset, FILE will be overwritten
–stdout[=LENGTH] Just output candidate passwords [cut at LENGTH]
–session=NAME Give a new session the NAME
–status[=NAME] Print status of a session [called NAME]
–restore[=NAME] Restore an interrupted session [called NAME]
–[no-]crack-status Emit a status line whenever a password is cracked
–progress-every=N Emit a status line every N seconds
–show[=left] Show cracked passwords [if =left, then uncracked]
–show=formats Show information about hashes in a file (JSON)
–show=invalid Show lines that are not valid for selected format(s)
–test[=TIME] Run tests and benchmarks for TIME seconds each
(if TIME is explicitly 0, test w/o benchmark)
–stress-test[=TIME] Loop self tests forever
–test-full=LEVEL Run more thorough self-tests
–no-mask Used with –test for alternate benchmark w/o mask
–skip-self-tests Skip self tests
–users=[-]LOGIN|UID[,..] [Do not] load this (these) user(s) only
–groups=[-]GID[,..] Load users [not] of this (these) group(s) only
–shells=[-]SHELL[,..] Load users with[out] this (these) shell(s) only
–salts=[-]COUNT[:MAX] Load salts with[out] COUNT [to MAX] hashes, or
–salts=#M[-N] Load M [to N] most populated salts
–costs=[-]C[:M][,…] Load salts with[out] cost value Cn [to Mn]. For
tunable cost parameters, see doc/OPTIONS
–fork=N Fork N processes
–node=MIN[-MAX]/TOTAL This node’s number range out of TOTAL count
–save-memory=LEVEL Enable memory saving, at LEVEL 1..3
–log-stderr Log to screen instead of file
–verbosity=N Change verbosity (1-5 or 6 for debug, default 3)
–no-log Disables creation and writing to john.log file
–bare-always-valid=Y Treat bare hashes as valid (Y/N)
–catch-up=NAME Catch up with existing (paused) session NAME
–config=FILE Use FILE instead of john.conf or john.ini
–encoding=NAME Input encoding (eg. UTF-8, ISO-8859-1). See also
doc/ENCODINGS.
–input-encoding=NAME Input encoding (alias for –encoding)
–internal-codepage=NAME Codepage used in rules/masks (see doc/ENCODINGS)
–target-encoding=NAME Output encoding (used by format)
–force-tty Set up terminal for reading keystrokes even if we’re
not the foreground process
–field-separator-char=C Use ‘C’ instead of the ‘:’ in input and pot files
–[no-]keep-guessing Try finding plaintext collisions
–list=WHAT List capabilities, see –list=help or doc/OPTIONS
–length=N Shortcut for –min-len=N –max-len=N
–min-length=N Request a minimum candidate length in bytes
–max-length=N Request a maximum candidate length in bytes
–max-candidates=[-]N Gracefully exit after this many candidates tried.
(if negative, reset count on each crack)
–max-run-time=[-]N Gracefully exit after this many seconds (if negative,
reset timer on each crack)
–mkpc=N Request a lower max. keys per crypt
–no-loader-dupecheck Disable the dupe checking when loading hashes
–pot=NAME Pot file to use
–regen-lost-salts=N Brute force unknown salts (see doc/OPTIONS)
–reject-printable Reject printable binaries
–tune=HOW Tuning options (auto/report/N)
–subformat=FORMAT Pick a benchmark format for –format=crypt
–format=[NAME|CLASS][,..] Force hash of type NAME. The supported formats can
be seen with –list=formats and –list=subformats.
See also doc/OPTIONS for more advanced selection of
format(s), including using classes and wildcards.

2022年4月26日 星期二

记录📝一下ddos攻击 ```hping3 -i u1 -S -p80 xxx.xx.x.x``

hping3用来干嘛?
防火墙测试
实用的端口扫描
网络检测,可以用不同的协议、服务类型(TOS)、IP分片
手工探测MTU(最大传输单元)路径
先进的路由跟踪,支持所有的协议
远程操作系统探测
远程的运行时间探测
TCP/IP堆栈审计
使用hping3进行DDoS攻击:

1
hping3 -c 5000 -d 150 -S -w 64 -p 80 --flood --rand-source xxx # 攻击目标  参数-a 伪造来源IP

-c:发送数据包的个数 -d:每个数据包的大小. -S:发送SYN数据包
-w:TCP window大小 -p:目标端口,你可以指定任意端口–flood:尽可能快的发送数据包

-H –help 显示帮助。
-v -VERSION 版本信息。
-c –count count 发送数据包的次数 关于countreached_timeout 可以在hping2.h里编辑。
-i –interval 包发送间隔时间(单位是毫秒)缺省时间是1秒,此功能在增加传输率上很重要,在idle/spoofing扫描时此功能也会被用到,你可以参考hping-howto获得更多信息-fast 每秒发10个数据包。
-n -nmeric 数字输出,象征性输出主机地址。
-q -quiet 退出。
-I –interface interface name 无非就是eth0之类的参数。
-v –verbose 显示很多信息,TCP回应一般如:len=46 ip=192.168.1.1 flags=RADF seq=0 ttl=255 id=0 win=0 rtt=0.4ms tos=0 iplen=40 seq=0 ack=1380893504 sum=2010 urp=0
-D –debug 进入debug模式当你遇到麻烦时,比如用HPING遇到一些不合你习惯的时候,你可以用此模式修改HPING,(INTERFACE DETECTION,DATA LINK LAYER ACCESS,INTERFACE SETTINGS,…….)
-z –bind 快捷键的使用。
-Z –unbind 消除快捷键。
-O –rawip RAWIP模式,在此模式下HPING会发送带数据的IP头。
-1 –icmp ICMP模式,此模式下HPING会发送IGMP应答报,你可以用–ICMPTYPE –ICMPCODE选项发送其他类型/模式的ICMP报文。
-2 –udp UDP 模式,缺省下,HPING会发送UDP报文到主机的0端口,你可以用–baseport –destport –keep选项指定其模式。
-9 –listen signatuer hping的listen模式,用此模式,HPING会接收指定的数据。
-a –spoof hostname 伪造IP攻击,防火墙就不会记录你的真实IP了,当然回应的包你也接收不到了。
-t –ttl time to live 可以指定发出包的TTL值。
-H –ipproto 在RAW IP模式里选择IP协议。
-w –WINID UNIX ,WINDIWS的id回应不同的,这选项可以让你的ID回应和WINDOWS一样。
-r –rel 更改ID的,可以让ID曾递减输出,详见HPING-HOWTO。
-F –FRAG 更改包的FRAG,这可以测试对方对于包碎片的处理能力,缺省的“virtual mtu”是16字节。
-x –morefrag 此功能可以发送碎片使主机忙于恢复碎片而造成主机的拒绝服务。
-y -dontfrag 发送不可恢复的IP碎片,这可以让你了解更多的MTU PATH DISCOVERY。
-G –fragoff fragment offset value set the fragment offset
-m –mtu mtu value 用此项后ID数值变得很大,50000没指定此项时3000-20000左右。
-G –rroute 记录路由,可以看到详悉的数据等等,最多可以经过9个路由,即使主机屏蔽了ICMP报文。
-C –ICMPTYPE type 指定ICMP类型,缺省是ICMP echo REQUEST。
-K –ICMPCODE CODE 指定ICMP代号,缺省0。
–icmp-ipver 把IP版本也插入IP头。
–icmp-iphlen 设置IP头的长度,缺省为5(32字节)。
–icmp-iplen 设置IP包长度。
–icmp-ipid 设置ICMP报文IP头的ID,缺省是RANDOM。
–icmp-ipproto 设置协议的,缺省是TCP。
-icmp-cksum 设置校验和。
-icmp-ts alias for –icmptype 13 (to send ICMP timestamp requests)
–icmp-addr Alias for –icmptype 17 (to send ICMP address mask requests)
-s –baseport source port hping 用源端口猜测回应的包,它从一个基本端口计数,每收一个包,端口也加1,这规则你可以自己定义。
-p –deskport [+][+]desk port 设置目标端口,缺省为0,一个加号设置为:每发送一个请求包到达后,端口加1,两个加号为:每发一个包,端口数加1。
–keep 上面说过了。
-w –win 发的大小和windows一样大,64BYTE。
-O –tcpoff Set fake tcp data offset. Normal data offset is tcphdrlen / 4.
-m –tcpseq 设置TCP序列数。
-l –tcpck 设置TCP ack。
-Q –seqnum 搜集序列号的,这对于你分析TCP序列号有很大作用。

参考Linux hping3 命令详解:测试网络及主机的安全

编译monero For macOS ARM

作者 LanYun
2023年8月27日 20:28

前言

水💦篇文章.

monero-gui官方没给ARM版.要下个版本应该会给?急急急,转译的应用很不爽.直接上编译.

这个项目里面整的很清楚了,但我还是要水💦.

前提: 你已安装了brew

如果不是非要ARM版本(注:本文发布时是没有arm版的,以后可能直接就是arm版,不用编译),可以直接用brew安装.CLI版:brew install monero GUI版:brew install monero-wallet 后续更新方便.

安装依赖

1
2
3
brew remove qt # 起手卸载,防止和qt@5冲突
brew install cmake pkg-config openssl boost unbound hidapi zmq libpgm libsodium miniupnpc expat libunwind-headers protobuf libgcrypt qt@5
brew reinstall qt@5 # 可选

编译

找个地方放编译文件夹,建议编译完不用删,方便以后编译,如果硬要删又要编译.我建议看我后面关于签名部分.

1
2
3
git clone --recursive https://github.com/monero-project/monero-gui.git
cd monero-gui
make -j$(nproc) || make -j1

编译没问题往后看,有问题自己解决吧(我不会).

如果编译文件夹不删除.那么请看本部分

1
cp -rf ./build/release/bin/monero-wallet-gui.app /Applications/monero-wallet-gui.app

构建应用程序包

用于要删文件夹情况.

1
2
3
4
5
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default ..
make -j$(nproc) || make -j1
make deploy
cd ./build/bin

新建文件entitlements.plist

1
2
3
4
5
6
7
8
9
10
cat << EOF > entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
</dict>
</plist>
EOF

然后运行下面命令,如果你有苹果开发者证书应该知道XXXXXXXXXX填什么.如果没有,别运行下面命令.看后面.

1
2
sudo codesign --deep --force --verify --verbose --options runtime --timestamp --entitlements entitlements.plist --sign 'XXXXXXXXXX' monero-wallet-gui.app
cp -rf ./monero-wallet-gui.app /Applications/monero-wallet-gui.app

没有苹果开发者证书

将上面<true/>改为<false/>

打开钥匙串访问.app,然后在 登录 我的证书 这个界面下.然后看图

image-20230827225123369image-20230827225144374

名称可以自己改.然后运行下面命令.

1
2
3
sudo codesign --deep --force --verify --verbose --options runtime --timestamp --entitlements entitlements.plist --sign 'lanyun' monero-wallet-gui.app
spctl -a -t exec -vv monero-wallet-gui.app # 看一下,是不是accepted,如果是,则继续
cp -rf ./monero-wallet-gui.app /Applications/monero-wallet-gui.app

如果有问题,请自行参考 https://github.com/monero-project/monero-gui/blob/master/DEPLOY.md

如果你遇到 libboost_atomic-mt.dylib (no such file) 这个错误.

显然,出现了问题.有种错误修复方式,因为会导致显示异常.

cp -rf /opt/homebrew/lib/libboost_atomic-mt.dylib ./monero-wallet-gui.app/Contents/Frameworks

本人不会修,可能是macOS版本太高了吧,无所谓,我不用构建应用程序包.

自建busuanzi不蒜子平台统计平台

作者 LanYun
2023年8月19日 16:12

前言

公益统计服务busuanzi官网: https://busuanzi.ibruce.info/

由于速度很慢,故打算自建. 本文用到的项目地址: https://github.com/soxft/busuanzi

本来不想水一篇的,因为项目中的wiki已很清楚了,而且还支持docker部署.

但我还是想简单记录一下搭建过程(省略了某些简单的步骤),各位可以参考参考.

本文不采用docker方式搭建,因为要和cloudflared搭配,组成隧道.

基本前提: 有域名,有linux服务器

本文linux服务器以arch Linux为例.

编译

在你想要的目录下运行命令.(下面示例为root)

1
2
3
4
5
pacman -S git go redis # 如果已安装可以跳过
git clone https://github.com/soxft/busuanzi.git # 可以拉取我fork的仓库
# https://github.com/LanYunDev/busuanzi.git 我合并了yuantuo666和soxft仓库,代码最新且带有web管理功能.
cd busuanzi
go build -o busuanzi main.go

修改配置

修改busuanzi目录下config.yml配置文件.

首先是Web中的Address,由于我们要做隧道,所以没必要公网访问,所以加上127.0.0.1:xxx ,这里xxx代表端口号,建议填高位.

可以用命令 lsof -i -n -P | grep LISTEN 来检查端口使用情况,

Debug测试的时候可以开一下,后面建议关了.

接下来就是Redis部分

首先Address为你redis的地址.例如本机: 127.0.0.1:6379

AddressPassword,如果你是全新安装的,没动过redis配置,那就不用改.

但如果改了,或者想确认一下.可以这样做.

输入命令

1
2
cat /etc/redis/redis.conf | grep '^port' # 端口
cat /etc/redis/redis.conf | grep '^requirepass' # 密码,如果没有结果代表是被#注释了,即为空密码

关于Expire,自用的话,可以设置为0

关于JwtSecret,我推荐用uuid来做签名密钥. 输入命令uuidgen即可得到uuid

修改 dist/busuanzi.js文件中api的地址.例如我改为https://busuanzi.lanyundev.com/api

如果你用带有web管理功能的busuanzi

Admin中Password记得改密码.

添加隧道

关于cloudflared搭建哪些看官方文档就行了,写的非常清楚.

记录一下,添加DNS记录命令: cloudflared tunnel route dns -f xxx busuanzi.lanyundev.com

主要注意一下,cloudflared进行DNS(dig)查询时,别被劫持了.(如果能用,就不用管这个.)

启动服务

1
systemctl enable --now redis.service # 设置为开机启动并启动redis

vim /etc/systemd/system/busuanzi.service添加下面内容(ExecStart根据个人情况修改.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=busuanzi Service
Documentation=https://github.com/soxft/busuanzi
After=network.target nss-lookup.target

[Service]
Type=simple
#DynamicUser=yes
User=root:
Environment=QUIC_GO_ENABLE_GSO=true
ExecStart=/root/busuanzi/busuanzi
WorkingDirectory=/root/busuanzi/
Restart=on-failure
LimitNPROC=512
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

弄成服务,方便管理.

1
2
systemctl daemon-reload
systemctl enable --now busuanzi.service

Web管理

Address + /admin 进入管理界面.可以修改数据.

在没换之前,可以参考这个域名 busuanzi.ibruce.info 的响应,里面有Site PV Site UV Page PV等原来的信息.

其实,这个可有可无,数据而已,真假都无所谓的.看个人吧,我就直接取整数.

关于隐私

啥都看不到,md5加密,不保存源数据.非常安全,其实如果不是需要做身份区别,我觉得弄个数字就行了.

浅记博客更新日志

作者 LanYun
2023年8月15日 13:25

本文仅为博客相关更新日志.(只在原版butterfly做了一点点🤏微调,然后修复瞎搞引入的bug)

TODO(主要是懒+没时间,技术都不是主要问题): 使用最新前端技术构建高性能博客

浅记更新日志

注:更新时间不准确,实际是我不知道啥时候突然想起有这个东东,然后随便写写的(故写的更新内容大概率不及时也不全面).

2025年12月23日 星期二

更新依赖 hex -> 8.1

2025年11月8日 星期六

微博热搜API获取早已挂了,分析原因为微博已做反爬虫+验证,没得精力去搞,所以下线。

2025年7月18日 星期五

更新hexo-bilibili-bangumi依赖至2.0.0

移除 音乐解锁 工具(子路径部署存在部分问题,懒得修复).

2025年7月4日 星期五

修复一处代码错误(deleteCachesAndReload -> delete_caches_reload).

更新 音乐解锁 工具.

2025年6月13日 星期五

移除fleek cdn线路,原因:FREE PLAN已结束

2025年4月30日 星期三

修复阅读模式下,退出图标(fas fa-sign-out-alt exit-readmode)丢失

2025年4月22日 星期二

更新相关依赖(hexo-bilibili-bangumi@1.11.0, hexo-renderer-marked@7.0.1).

移除夜间模式下文字闪烁动画(因为在新版chrome上出现兼容问题).

修复友联及评论区部分图像因cors问题而无法加载.

2025年1月23日 星期四

临时恢复评论区后端中转处理服务(本来想搞个多线路备份,但没时间搞)

2025年1月20日 星期一

vercel流量用完了,评论区自然挂了,无所谓,看了下日志,Jan 11, 2025到Jan 16, 2025期间bing.lanyundev.com流量激增,罪魁祸首: Googlebot,byd,把流量都吃完了.反正这个bing代理域名早就不可用了,直接关了算了.

2025年1月3日 星期五

修复偶然发现的sw错误逻辑,移除不可用代码

增强:当用户离线,不再自动滚动pixiv日榜和发送pixiv图片请求

更新hexo-renderer-marked依赖

修复备用线路nginx配置出错(偶然发现,备用线路太多,可靠性太好,挂了一个都没感觉)

2024年12月26日 星期四

修复评论区在某些情况下人机验证失败(建议将本站添加到广告过滤软件白名单然后清除数据).

修复后端日榜nginx服务因为自动更新挂掉.

修复后端weibo.json更新服务因为python自动更新到3.13挂掉.

2024年11月12日 星期二

优化友联,顶置文章仅保留最近更新过的文章.

2024年11月7日 星期四

修复检查更新代码逻辑错误.

2024年11月6日 星期三

重置commit记录,减少本地git存储大小.

2024年10月31日 星期四

修复统计服务(升级redis,忘记重启统计服务了😂,挂了多长时间不清楚,应该挺长段时间.)

2024年10月22日 星期二

移除垃圾第三方CDN,优化友联列表.

发现兼容性问题: 由于 Firefox private mode navigator.serviceWorker is undefined (火狐浏览器隐私模式下,禁用了serviceWorker),故博客大部分功能故障无法正常工作,但依然可以浏览文章内容,只不过速度慢.

2024年8月10日 星期六

屏蔽投毒CDN

发现特性,浏览窗口尺寸发生改变(例如:移动端浏览器菜单自动隐藏)会导致背景图(#web_bg)也跟着缩放(可能会影响阅读,但不会修..)

2024年7月24日 星期三

新增特性当 友联_朋友圈 加载失败后,刷新网页,重新加载.

优化CF WAF,降低发生 托管质询 频率.

解决某些情况下pixiv日榜部分图片链接失效.

更新相关依赖.

2024年6月25日 星期二

新增fastly cdn线路.

2024年6月4日 星期二

修复友联某些图片cors加载异常.

修复评论区加载异常.

2024年4月23日 星期二

优化pixiv加载代码判断.

更新相关依赖.

2024年4月12日 星期五

修复代码框更多(fontawesome fas fa-angle-double-down)图标丢失.未对这个动画图标进行管理控制.因为懒,懒得弄.知道会影响GPU显示性能. 已经进行管理并优化其他图标动画.

顺带优化sw代码,并解决在本地预览遇到的cors问题.

2024年4月2日 星期二

解决评论区博主回复信息过长时评论框长度过长的css问题.

优化sw代码逻辑.优化版本检查代码逻辑.

修复pixiv日榜在某些页面未进行加载的问题.

2024年3月30日 星期六

优化sw代码,持久化缓存文件不再发送相关请求并修复并发请求中的bug.

2024年3月12日 星期二

修复复制代码按钮消失,如果遇到某个位置图标应该有但没有,请email我,因为我可能忘记添加了.

2024年2月14日 星期三

解决上次延期未做完的事,优化性能,减少js,css等文件.(希望不会引入新bug).优化并减少js,css等文件,移除了星空,帧率检测,性能检测等函数(没时间优化),新增为评论区提供缓存功能.修复rightside等边缘指针显示问题(chrome内核中使用64*64作为指针图像尺寸存在问题).优化通知悬浮窗,减少依赖.优化fps检测.优化博客结构,更新修补代码.优化图片格式和尺寸,本次改动较大且仍有部分内容未改动.

已定位到主题框架主要性能问题: fontawesome图标动画,但暂不做修复.

由于精力,时间等因素原因,故上述更改无限延期.

除非主题出现重大更改且个人主观认为有其必要性时,才进行更新.

2024年2月5日 星期一

修复分享函数未导入window中.减少一些innerHTML,优化一些函数,提高性能.新增本地和最新版本显示.修复sw中一些bug.

已延期

2024年2月1日 星期四

去掉了对jquery的依赖,减少了JS中 DOM 操作,优化了部分函数.

不过,对GPU性能要求依然有点高,不会弄.不搞了😂.性能优化不来.就这样了.

由于sw存在判断忘加!导致无限刷新,测试没做到位,下午8:03-8:41之间访问过博客的用户,需要手动清除数据.

引入了一个新bug,在非Chromium内核浏览器中出现无限刷新错误.今晚才发现,赶紧修复.

2024年1月11日 星期四

完善优化. 鸽了.

2024年1月10日 星期三

由于有优先级更高的事情做,故昨天的优化被中断(先写的日志再去搞的,先搞的话,搞完就不想写日志了…😂),今天有空搞完.

2024年1月9日 星期二

修复反向代理ipfs域名下的视频无法在基于WKWebView内核浏览器(例如:Safari浏览器)播放的问题,一直用Chrome测试.只能说chrome兼容性做的比较好,我没发现在Safari上的问题,偶然才发现.

原因: 由于cf反向代理,导致丢失range字段.只有Content-Type标头,缺少”Content-Range”,”Content-Length”标头.

缓解办法: 重定向到cloudflare-ipfs.com (ipfs.io还是加载太慢了,容易挂)

解决办法: 用Chrome浏览器😂,没办法,ipfs网关目前不支持视频分段请求.

优化了一点点局部代码,略微提高一点性能(应该不会引入新bug吧…🤔),修改并优化版本检测.增强主动版本检测能力.

2024年1月8日 星期一

修复由于精简css代码(移除了不必要的tag相关css),导致video标签显示异常.

若有显示问题,欢迎反馈.

2024年1月7日 星期日

移除frp cdn线路

2024年1月1日 星期一

修复在某些情况下cur文件加载异常(卡进度条百分之99)

2023年12月31日 星期日

移除某些无效文章.

2023年12月30日 星期六

主题更新至4.12.0.初步观察,暂未发现明显bug,推送修改.

修复友联部分图片链接失效.

2023年12月29日 星期五

继续进行了一些修复.例如浏览量显示问题等.由于某些原因将修复并发布推迟到30号(明天)去了.

2023年12月28日 星期四

移除了文章对图床的依赖,提高了图床中图片的质量.同步修改图床相关逻辑代码.

2023年12月27日 星期三

主题更新至4.11.0.修复部分显示bug并优化夜间模式下加粗字体的显示.略微优化下部分js逻辑.修复了主题差异特征识别脚本的部分bug并优化了部分流程.对友联页进行了一点优化.

由于hexo-renderer-markdown-it的anchor锚点功能和主题锚点功能冲突,故换成hexo-renderer-marked

修复由于更新引进的部分问题.精简一丢丢静态资源.

修复了若干问题.整改了图床,去掉许多未使用图片,并降低图床使用.

2023年12月6日 星期三

减少冗余cdn线路,减少首次访问流量消耗.降低冗余度.

2023年11月15日 星期三

由于某些原因,下线ipfs备用线路,待以后有稳定且安全的网络环境再整,ipfs相关文章均下线.

2023年11月9日 星期四

提高一丢丢低性能设备下的流畅度.精简一丢丢主css.修复日间阅读模式显示异常.

2023年11月8日 星期三

将Mac标签修改为macOS.

2023年11月1日 星期三

本地 hexo 更新至 v7.0.0

2023年10月24日 星期二

修复某个加载bug,修复手机端评论区部分布局问题.

2023年10月10日 星期二

优化低性能设备判断逻辑,提高判断速度和灵敏度.一旦认定为低性能设备则后续不会再次判断,默认低性能设备.

主题4.10发布,由于太懒,以后再更新.

修复notice.html失败逻辑,移除部分cdn,新增cdn

2023年10月8日 星期日

订阅转换后端取消白名单限制,修复订阅转换漏洞.并改为docker部署.

2023年9月27日 星期三

提供chatgpt反向代理,chat.lanyundev.com,备用chat-cf.lanyundev.com

2023年9月23日 星期六

修复部分因为删代码导致部分CSS异常.

2023年9月22日 星期五

修复友联朋友圈可能存在的由于cf负优化导致的问题.已添加data-cfasync="false"来规避.

2023年9月21日 星期四

移除外挂标签hexo-butterfly-tag-plugins-plus等,减少性能消耗并加快DOM构建速度.

提供PWA支持,调整css,减少js文件.

2023年9月16日 星期六

优化sw中关于IPFS相关逻辑,采用localforage作为存储方案.(引入js文件,略微降低性能,但能稍微提高读取速度) 考虑了下,算了,没必要,因为作用不大.

下线Chuanhu Chat,原因: 作者负优化,访客不可用.

上线web3存储.

2023年9月15日 星期五

优化sw逻辑,微小地提高性能,修复render预检(OPTIONS)的cors错误(修不好).上线IPFS备用线路.

2023年9月13日 星期三

移除某些友联.修复评论区回复css问题.新增锚点标签. 不太好看,取消了.

2023年9月8日 星期五

上线2条不稳定(test)cdn线路,修正某些服务器上nginx配置错误,而无法获取真实ip.

2023年9月6日 星期三

由于某条cdn的需要,故将本站最低TLS版本限制改为TLS 1.2,但仍强烈建议使用TLS 1.3 换线路了,改回去了

完善sw添加html后缀逻辑(直接去掉了),修复cdn的500错误,修复获取cdn的html文件跳转问题

由于某些线路不支持省略html后缀,修改sw逻辑

修复netlify线路的cors错误

修复load的oss链接无法使用的问题.

2023年9月5日 星期二

重新启用Rocket Loader™,修复frp cdn挂掉,没时间搞,以后博客基本不更新了.(原本还有个计划,优化存储方案,但算了)

2023年9月1日 星期六

重新上线禁用的线路.懒的更了,开摆.

2023年8月30日 星期三

03:00上线昨天的修改.

2023年8月29日 星期二

修复评论区最大高度被写死的问题,调整最低高度.

本站文章照片添加盲水印(添加到CI流中,比较麻烦).顺便修复包hexo-images-watermark,发布包hexo-images-watermark-fix

移除搜索中存在的html后缀(如果还有什么地方存在html后缀,请反馈给我,包括站内文章引用).(由于批量替换不准确的缘故,某些文章链接可能会有问题?不确定.)应该没有的.

经过评估,决定不对文字进行盲水印处理,因为某些文章存在代码,盲水印处理后会导致代码不可用.另外盲水印抗攻击能力弱,不采用.

2023年8月28日 星期一

发现昨天修复中引入了新bug,导致评论区和统计等功能异常.今下午修复完成.

优化sw逻辑,解决相同网页,不同网址造成的评论不同步.

全站链接去掉html后缀,更简洁.

修复错误的评论区数据,并将数据库转移到本地.懒的搞,修复一下数据错误就行了,反正评论区功能可有可无.无所谓.

重新上线bing.

发现(引入了)新的bug,文章照片加载异常,尝试修复.

貌似不是我引入的bug,未知,未知.不知道咋修.github对比了修改记录改回去了,一样不行,真灵异事件.

成功定位到原因.pretty_urls和hexo-asset-image存在冲突.另外我在hexo server --debug之前没有hexo clean导致的缓存问题.

修复官方包,发布: @lanyundev/hexo-asset-image-fix (就改了一行代码,修改第二十四行代码为: var endPos = link.length;)

2023年8月27日 星期日

无聊的时候,检查到oss链接存在cors错误,修复并推送.

2023年8月26日 星期六

移除失效友联,替换加载html链接为实力强劲提供的oss链接🔗.

2023年8月25日 星期五

没事的时候看看博客有没有新bug,随便一看frp线路全挂了.不会是有人打挂的吧.无所吊谓.今天再整2条主线路再加上条备用线路.(除此之外,把之前鸽掉的一条frp搞起,限速1M,反正可用性低,能用就行).等9月1号构建时间重置,可以把之前禁用的线路恢复(前提是还记得这件事).移除了低速npm线路.新增3条jsd类型cdn线路.

备注下: 本博客 ssl protocols最低要求TLS 1.3

(今天推送之前没检查,代码写错了导致照片和js代码获取异常..摸了会鱼才发现)

2023年8月24日 星期四

修复评论区CSS显示问题.(没修完,懒的修了,基本显示没问题就行.)

2023年8月22日 星期二

移除了某些文章,确保博客安全.

修复打赏图片加载异常.

2023年8月21日 星期一

由于昨天摸鱼去了,没整反代的CDN线路,今晚再整.某条整不起,那就先用4条(采用熔断保护机制)吧.

2023年8月20日 星期日

遇到mac致命bug,写过的东西会被还原,导致有些bug虽然修复,但mac给我回滚回去了.(Sonoma版本,我是一刻都不想待,但太懒,还是今晚再准备回滚版本吧或者一直更新下去,我看大概是后者吧,懒得动了.)

看到个bug,删除符有问题.某些情况下显示出错.算了,以后再修.

再增加5条博客小流量备用CDN线路.(等我啥时候有台高性能24h服务器再考虑博客进行IPFS备份吧,现在属实不想搞+没稳定的网络环境.)

先埋个坑,等啥时候无聊了,更换博客主题或者自建,反正这个性能问题,以后再解决吧.现在技术力实在不行.

INP 将于 2024 年 3 月取代 FID 作为 Core Web Vitals 的一部分

我知道我博客CLS和INP都很差,但我真不知道咋个弄了.反正目前流畅浏览的性能要求和游戏3A差不多吧?不管了,反正我不卡.

随便说一下,本站的这个chat.lanyundev.com域名,我就搭建了这个项目,没openai的api key,也就没的玩,没的玩,我就开放,大家可以直接用,至于隐私,我tm服务器空间不够,日志都关了还看你内容? 所以这玩意,我从来不看不管的,反正有人用就用,不用也无所谓,每天定时自动检查更新并尝试更新.反正最新版就对了.

首先说明,本站或与其相关的子域名均不会存储你的任何数据,确保隐私安全🔐.

2023年8月19日 星期六

自建busuanzi不蒜子平台统计平台.由于技术+懒的原因,所有文章阅读数重置.毕竟一个数字而已,随便改改都行,我并不在乎.

2023年8月18日 星期五

修复未知原因的bug,即本地搜索🔍能用,线上搜索🔍挂了?不明所以,xml改成json格式又行了?真奇怪🤔.

准备上条备用线路cloudfront.已上线.(反正国内算是负优化)

教训:千万别开CF的缓存储备,这玩意怎么说呢,不仅贵,而且没到下一周期根本清除不了存储,它就一直占用.占用就有费用,也就说你想停下来不用这玩意,但不行,你只能停止同步,已同步的照样用.真的太草了.而且它这个东西的逻辑是替换你js,css等文件的链接,也就说sw中的判定规则直接无效,再加上国内访问非常慢,所以我评价 缓存储备 只适合国外富哥用.

移除了 页脚游动的鱼🐟 和 飘落的樱花🌸 ,降低对GPU性能的需要.(只要你fps一直低于60就能触发低性能模式,关闭冒泡动效.冒泡动效这玩意懒得优化了,开摆!)

修复了某字体404问题.移除了某2条线路.

修复一处因为优化js性能({passive:true})而产生的bug(置顶文章滚动异常).

博客版本v2.1.1 有2个线路因为构建时间不够(超出限制🚫),无法完成部署(等后面再加吧,最近修博客有点频繁)

另外,Safari上有未知bug,加载问题,无解,不管了,PC端chrome没问题就行.

2023年8月16日 星期三

修复进度条卡99%,原因某些浏览器block了google analytics的获取,而导致阻塞,目前只在Safari上遇到.不过已解决并没有,不能解决,只要有ad block软件就G了.

遇到一个致命缓存问题,cloudfront强行缓存我的静态资源导致sw加速出现问题.暂无解,只有等缓存过期

2023年8月15日 星期二

定位到一个隐形问题,CF给我负优化,我就说怪不得,为啥每到线上就怪怪的.

把Rocket Loader™给关了就行了,已修复.

2023年8月13日 星期日

2023年8月13日 17:57 部署的代码有问题,问题就是导致无法访问本博客.请手动F12打开控制台清除数据!

太草了,虽然生产与部署环境都隔离了,但我一般懒的检测,就自动推送了,推送上去,我一测试,我超,直接锁死🔒.

我很快哈,马上定位问题,结果是我废代码忘记删了,导致url路径错误.我赶紧改代码重新推送,但我推送流程中并没有考虑到快速推送到需求.而我要想推送到云端,本地还要做很多处理.这就导致我18:12:38才完成推送.期间临时回滚到上一个版本,但是由于我博客的特性,单节点回滚是没有用的,更何况有些CDN节点,根本来不及回滚,首要任务就是推送上去.故这期间访问的用户可能会出现问题.(应该没人访问吧?)

不用了,及时有问题也修复了,及时你在这期间访问过,也能被修复,因为我刚刚配了重定向,也复现了问题并修复.这个重定向规则我会挂几天,不定时就删掉.继续摸鱼去咯.

2023年8月11日 星期五

博客加速了一丢丢(牺牲性能的情况下).

用性能换网络加载速度,唯一的缺点就是对网络速度和设备性能都有一定的要求.

之所以这样做是因为大部分设备(过时设备除外)性能过剩而CF在国内一直是减速器.没办法只能出此下策.

感谢tang.lu站长提供的CDN.让本博客更快一丢丢.

2023年8月10日 星期五

修复了一些bug.

2023年8月9日 星期三

自动修补原版主题脚本终于优化好了.(也许会有奇怪的bug,但我没发现,大体是没问题了,没做细致测试)

当前hexo最新版,butterfly为4.10.0-b1.也许有人觉得beta版本不稳定.

🤣哈?稳定性?要啥稳定性,能用就行.

2023年8月8日 星期二

基于昨天摸鱼的情况,对昨天说过的更新内容进行完善.(搞IPFS.) 晚上再搞😄

国*/内机器人别tm爬我网站.草.GPT的机器人也爬我网站,我同意了嘛?小心我在文中加点料,弄*/死一群CV垃圾公众号.

不整IPFS了,吃流量多不说,在C*N内用了没有一个稳定的网络环境.

自动修补原版主题脚本终于整好了(还没),以后主题更新就方便多了(但,迷之Bug++,稳定性--).

2023年8月7日 星期一

新增IPFS线路,只要域名不灭,博客不死.

新增有限的IP检查,同时某些文章对敏感地区不可访问.(我发现有些有人很喜欢裸连,搞到我被迫整这个东西.😓)

将部分文章存档并加密🔐,避免被打击👊.

修复一些bug,5号的更新也还没推送.

修改性能检测逻辑,减少文件I/O读写.降低对性能影响.

性能检测只在非移动端进行,移动端默认低性能设备.(因为有些bug修不好,索性直接关了.)

(此时的)检测逻辑(,不代表以后的逻辑): 首次记录的话,22秒内fps帧数低于60的数量(这里描述是有问题的,因为不好描述,低的话+1,高的话-1)大于19则代表低性能 没法描述,语言功底差,(之后又改了逻辑,)建议直接看代码.

大概今晚推送到云端☁️.(移动端直接关特效)(没推,忘记了,然后8号中午才想起推,推上去后,发现ipfs线路还没整好😄,昨天摸鱼.)

2023年8月5日 星期六

某些文章添加了一些必要说明.

(BUG没修完,先修BUG去了,懒得写日志了)

优化了sw代码部分逻辑

优化了js代码运行效率

精简了部分js和css代码

新增性能检测,若首次访问在20秒内fps低于60,则标记为低性能设备.

终于找到为毛iOS Safari卡顿了,特么的对Service Worker缓存有限制☝️不是这个原因.

2023年7月23日 星期日

优化了sw代码部分逻辑

优化了js代码运行效率

精简了部分js和css代码

移除了某些不必要的文件

移除了博客中某些不必要的特性

重写博客相关自动化脚部分逻辑

更新hexo,butterflt及其相关package包

试图恢复IPFS相关线路,提高网站访问可用性和稳定性

已知问题(无法解决或难以解决或懒得解决反正,我的Mac用最新版Chrome搭配稳定的网络遇不到这些问题):

①过时设备会出现卡顿,若左下角FPS低于60,则代表你设备已过时或设备GPU性能不足.

②在Safari和Edge等非最新版Chrome浏览器上均可能出现某些未知问题,如加载异常 解决办法:安装最新版Chrome浏览器

③若你通过移动端访问本站,若你的网络不稳定或科学上网速度过于缓慢,概率性存在加载异常 解决办法:换稳定线路

若遇到其余问题,请尝试使用主页公告🪧中的清除缓存功能.

2022年5月15日 星期日

尝试更新Hexo,butterflt.今天凌晨🕛,成功完成博客照片水印的自动处理.

2022年8月1日 星期一

优化了一点点性能(不过依然对GPU性能有较大要求),较以前极大提高了速度.

sw勉强能用,离线PWA暂时不考虑💭

2022年8月12日 星期五

更新:

目前实现了前端竞速,部分静态资源缓存.以及资源后台更新等.

缺点:网页性能差,卡. 该缺点仅在被淘汰设备中出现,本人的M1 Max表示没感觉.

2022年9月29日 星期三

博客支持HTTP/3(QUIC)协议访问.

博客支持自动化部署到IPFS.

博客采用多分布式部署,

优化线路提升接入速度, 后来想了想,暂不提升这个.因为要money.

用户访问博客永远可用,

新增樱花🌸动效开关,

新增IPFS网盘访问等, 因为不可描述原因,故移除

优化博客sw逻辑等..

另外,访问本站主域名及其子域名TLS最低要求为TLS1.3且(在有服务器的域名中)至少为http2以上版本进行HTTPS连接.不满足则拒绝建立连接.建议更新浏览器或设备.

关于”用户访问博客永远可用”说明:

如果你曾访问过本站,那么即使主站无法访问或被打死了,依然不影响你的访问.

而且访问速度不会有明显影响.本站的镜像站巨多.绝对打不死.(别真有人打啊,我一个静态博客,打我又没价值,除非你是SB,脑壳有包.顺便嘲笑一下,DDOS最没技术含量了😅.Whatever,U ARE SB.)

假设你即使打死了阿里OSS,各大CDN等等.
那你确实牛逼,我的新用户已经无法访问了.但是!老用户依然照样用,基本没影响.哈哈.🤣

2023年3月5日 星期日

(指的是chatgpt)深度优化部分JS,关于GPU占用高,修不来,复杂了,修复了部分javascript代码逻辑,然后整了个微黑名单(前端,除了对小白有点用,但实际上,我觉得没吊用的,后移除),更新了部分JS文件.

2023年4月2日 星期日

本次博客主题更新幅度极大.

删除了博客中不必要的js,css等文件,减少体积.

移除了live2d,移除了较多不必要的美化(看起来更像原生了),提高了主题性能.

将主题版本更新至最新版,并解耦部分与源代码紧密联系的美化代码,方便后续更新.

(机翻)Kubo配置文件

作者 LanYun
2023年8月8日 16:58

下面内容来自机翻,仅供参考.

原文档:链接🔗

Kubo 配置文件

Kubo (go-ipfs) 配置文件是一个 JSON 文档,位于“$IPFS_PATH/config”。它
在节点实例化时读取一次,无论是对于离线命令,还是在
启动守护进程。在正在运行的守护进程上执行的命令不会读取
运行时的配置文件。

目录

个人资料

配置配置文件允许快速调整配置。配置文件可以是
使用“–profile”标志应用于“ipfs init”或“ipfs 配置文件”
应用`命令。应用配置文件时,配置文件的备份
将在“$IPFS_PATH”中创建。

下面列出了可用的配置文件。你也可以找到他们
记录在“ipfs 配置文件 –help”中。

  • 服务器

    禁用本地主机发现,建议在以下情况使用
    在具有公共 IPv4 地址的计算机上运行 IPFS。

  • 随机端口

    对传入的集群连接使用随机端口号。

  • 默认数据存储

    将节点配置为使用默认数据存储 (flatfs)。

    有关此数据存储的更多信息,请阅读“flatfs”配置文件说明。

    该配置文件只能在首次初始化节点时应用。

  • 本地发现

    启用本地发现(默认启用)。对于在发现后重新启用本地发现很有用
    被另一个配置文件(例如服务器配置文件)禁用。

  • 测试

    减少IPFS守护进程的外部干扰,这
    在测试环境中使用守护进程时非常有用。

  • 默认网络

    恢复默认网络设置。
    测试轮廓的反向轮廓。

  • Flatfs

    配置节点以使用 flatfs 数据存储。Flatfs 是默认数据存储。

    这是最久经考验且最可靠的数据存储。
    如果出现以下情况,您应该使用此数据存储:

    • 您需要一个非常简单且非常可靠的数据存储,并且您信任您的
      文件系统。该数据存储将每个块存储为单独的文件
      底层文件系统,因此除非出现问题,否则不太可能丢失数据
      与底层文件系统。
    • 您需要以尽快回收可用空间的方式运行垃圾收集。
    • 您想要最小化内存使用。
    • 您可以接受默认的数据导入速度,或者更喜欢使用“–nocopy”。

    该配置文件只能在首次初始化节点时应用。

-

配置节点以使用实验性 badger 数据存储。请记住,这 使用过时的 badger 1.x

如果性能的某些方面,请使用此数据存储,
尤其是添加许多 GB 文件的速度至关重要。但是,请注意:

  • 当您的数据存储被占用时,该数据存储将无法正确回收空间
    小于几千兆字节。如果您使用“–enable-gc”运行 IPFS,您计划在其中存储很少的数据
    您的 IPFS 节点,并且磁盘使用比性能更重要,请考虑使用
    flatfs
  • 此数据存储最多使用几 GB 内存。
  • 适用于中型数据存储,但如果您的数据集大于 1 TB,则可能会遇到性能问题。
  • 当前的实现基于旧的 badger 1.x,上游团队不再支持该版本。

该配置文件只能在首次初始化节点时应用。

  • 低功耗

    减少系统上的守护进程开销。影响节点
    功能 - 内容发现和数据的性能
    抓取可能会降级。本地数据不会在 DHT 等路由系统上公布。

    • Swarm.ConnMgr 设置为一次维持最小数量的 p2p 连接。
    • 禁用 Reprovider 服务 → DHT 和其他路由系统上不会公布 CID(!)
    • 禁用自动NAT。

    请谨慎使用此配置文件。

类型

本文档引用了标准 JSON 类型(例如,“null”、“string”、
number 等),以及一些自定义类型,如下所述。

标志

标志允许启用和禁用功能。然而,与简单的布尔值不同,
它们也可以是“null”(或省略)以指示默认值应该
被选择。这使得 Kubo 更容易更改默认值
未来,除非用户明确地将标志设置为“true”(启用)或
“假”(禁用)。标志具有三种可能的状态:

  • null 或缺失(应用默认值)。
  • true(启用)
    -“假”(禁用)

优先级

优先级允许指定功能/协议的优先级并禁用
功能/协议。优先级可以采用以下值之一:

  • null/missing(应用默认优先级,与标志相同)
    -“假”(禁用)
  • 1 - 2^63(优先级,越低越好)

字符串

字符串是一种特殊类型,可以方便地指定单个字符串、数组
字符串,或 null:

  • “单个字符串”
  • [“an”、“数组”、“of”、“字符串”]

持续时间

Duration 是一种描述时间长度的类型,使用与 go 相同的格式
是(例如“1d2h4m40.01s”)。

可选整数

可选整数允许指定一些数值
配置文件中缺少时的隐式默认值:

  • null/missing 将应用 Kubo 源中定义的默认值 (.WithDefault(value))
  • -2^632^63-1 之间的整数(即 -92233720368547758089223372036854775807

可选字节

可选字节允许指定一些字节数
配置文件中缺少时的隐式默认值:

  • null/missing(应用 Kubo 源代码中定义的默认值)
  • 指示字节数的字符串值,包括人类可读的表示形式:
    • SI 大小(公制单位,1000 的幂),例如 1B2kB3MB4GB5TB ,……)
    • IEC 大小(二进制单位,1024 的幂),例如 1B2KiB3MiB4GiB5TiB ,……)

可选字符串

可选字符串允许指定一些字符串值
配置文件中缺少时的隐式默认值:

  • null/missing 将应用 Kubo 源中定义的默认值 (.WithDefault("value"))
  • 一个字符串

可选持续时间

可选的持续时间允许指定一些持续时间值
配置文件中缺少时的隐式默认值:

  • null/missing 将应用 Kubo 源中定义的默认值 (.WithDefault("1h2m3s"))
  • 具有有效 go 持续时间 的字符串(例如“1d2h4m40.01s”)。

地址

包含有关此节点要使用的各种侦听器地址的信息。

地址.API

Multiaddr 或多地址数组,描述服务本地 HTTP 的地址
API 开启。

支持的运输:

  • tcp/ip{4,6} - /ipN/.../tcp/...
  • unix - /unix/path/to/socket

默认值:/ip4/127.0.0.1/tcp/5001

类型:“字符串”(多地址)

地址.网关

多地址或多地址数组描述服务于本地的地址
网关打开。

支持的运输:

  • tcp/ip{4,6} - /ipN/.../tcp/...
  • unix - /unix/path/to/socket

默认值:/ip4/127.0.0.1/tcp/8080

类型:“字符串”(多地址)

地址.Swarm

描述要侦听 p2p 群的地址的 multiaddrs 数组
连接。

支持的运输:

  • tcp/ip{4,6} - /ipN/.../tcp/...
  • websocket - /ipN/.../tcp/.../ws
  • quic (Draft-29) - /ipN/.../udp/.../quic - 可以与 /quic-v1/quic-v1/webtransport 共享相同的两个元组
  • quicv1 (RFC9000) - /ipN/.../udp/.../quic-v1 - 可以与 /quic/quic-v1/webtransport 共享相同的两个元组
  • webtransport /ipN/.../udp/.../quic-v1/webtransport - 可以与 /quic/quic-v1 共享相同的两个元组

默认:

1
2
3
4
5
6
7
8
9
10
[
“/ip4/0.0.0.0/tcp/4001”,
“/ip6/::/tcp/4001,
“/ip4/0.0.0.0/udp/4001/quic”,
“/ip4/0.0.0.0/udp/4001/quic-v1”,
“/ip4/0.0.0.0/udp/4001/quic-v1/webtransport”,
“/ip6/::/udp/4001/quic”,
“/ip6/::/udp/4001/quic-v1”,
“/ip6/::/udp/4001/quic-v1/webtransport”
]

类型:数组[字符串](多地址)

地址.公告

如果非空,则此数组指定要向
网络。如果为空,守护进程将宣布推断的群地址。

默认值:[]

类型:数组[字符串](多地址)

地址.AppendAnnounce

Addresses.Announce 类似,只是这不
如果非空,则覆盖推断的群地址。

默认值:[]

类型:数组[字符串](多地址)

地址.NoAnnounce

不向网络公布的群地址数组。
优先于“Addresses.Announce”和“Addresses.AppendAnnounce”。

默认值:[]

类型:数组[字符串](多地址)

API

包含 API 网关使用的信息。

API.HTTPHeaders

要在来自 API HTTP 服务器的响应上设置的 HTTP 标头映射。

例子:

1
2
3
{
“Foo”:[“酒吧”]
}

默认值:null

类型:object[string -> array[string]](标头名称 -> 标头值数组)

自动NAT

包含 AutoNAT 服务的配置选项。自动网络地址转换服务
帮助网络上的其他节点确定它们是否可以公开访问
互联网的其余部分。

AutoNAT.ServiceMode

未设置(默认)时,AutoNAT 服务默认为_启用_。否则,这
字段可以采用两个值之一:

*“启用”-启用服务(除非节点确定它本身,
无法通过公共互联网访问)。
*“已禁用”- 禁用该服务。

将来可能会添加其他模式。

类型:string"enabled""disabled" 之一)

AutoNAT.Throttle

设置后,此选项将配置 AutoNAT 服务限制行为。经过
默认情况下,Kubo 将对其他设备执行 NAT 检查的次数进行速率限制
节点数增加到每分钟 30 个,每个对等点 3 个。

AutoNAT.Throttle.GlobalLimit

配置每个“AutoNAT.Throttle.Interval”要服务的 AutoNAT 请求数。

默认值:30

类型:integer(非负数,0表示无限制)

AutoNAT.Throttle.PeerLimit

配置每个“AutoNAT.Throttle.Interval”为每个对等点提供服务的 AutoNAT 请求数。

默认值:3

类型:integer(非负数,0表示无限制)

AutoNAT.Throttle.Interval

配置上述限制的时间间隔。

默认值:1 分钟

类型:duration(当0/未设置时,使用默认值)

引导程序

Bootstrap 是您的节点连接到的受信任节点的多地址数组,用于在启动时获取网络的其他节点。

默认值:ipfs.io 引导节点

类型:数组[字符串](多地址)

数据存储

包含与磁盘上的构建和操作相关的信息
存储系统。

数据存储.StorageMax

ipfs 存储库数据存储大小的软上限。使用“StorageGCWatermark”,
用于计算是否触发 gc 运行(仅当设置了 --enable-gc 标志时)。

默认值:“10GB”

类型:字符串(大小)

数据存储.StorageGCWatermark

垃圾回收将占“StorageMax”值的百分比
如果守护进程在启用自动 gc 的情况下运行(即
当前选项默认为 false)。

默认值:90

类型:整数 (0-100%)

数据存储.GCPeriod

指定运行垃圾收集的频率的持续时间。仅使用过
如果启用自动GC。

默认值:1h

类型:duration(空字符串表示默认值)

数据存储.HashOnRead

一个布尔值。如果设置为 true,则所有从磁盘读取的块都将被散列并
已验证。这将导致 CPU 利用率增加。

默认值:“假”

类型:布尔

数据存储.BloomFilterSize

一个数字,表示块存储的 [bloom] 的大小(以字节为单位)
过滤器](https://en.wikipedia.org/wiki/Bloom_filter)。零值代表
该功能已禁用。

该站点为各种布隆过滤器值生成有用的图表:
https://hur.st/bloomfilter/?n=1e6&p=0.01&m=&k=7 您可以使用它来查找
首选最佳值,其中“m”是以位为单位的“BloomFilterSize”。记得
将值“m”从位转换为字节,以用作中的“BloomFilterSize”
配置文件。例如,对于 1,000,000 个区块,预计误报率为 1%
率,最终过滤器大小为 9592955 位,因此对于“BloomFilterSize”
我们想要使用 1199120 字节。截至撰写本文时,7 哈希
函数

,所以式中常数“k”为7。

默认值:“0”(禁用)

类型:integer(非负,字节)

数据存储.Spec

Spec 定义了 ipfs 数据存储的结构。它是一个可组合的结构,
其中每个数据存储都由一个 json 对象表示。数据存储可以包装其他
数据存储提供额外的功能(例如指标、日志记录或缓存)。

这可以手动更改,但是,如果您进行任何需要更改的更改
不同的磁盘结构,您将需要运行 ipfs-ds-convert
工具
将数据迁移到新的
结构。

有关此配置选项的可能值的更多信息,请参阅
文档/数据存储.md

默认:

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
{
“坐骑”:[
{
“孩子”: {
“路径”:“块”,
"shardFunc": "/repo/flatfs/shard/v1/倒数第二个/2",
“同步”:真,
“类型”:“Flatfs”
},
“挂载点”:“/块”,
"前缀": "flatfs.datastore",
“类型”:“测量”
},
{
“孩子”: {
“压缩”:“无”,
“路径”:“数据存储”,
“类型”:“级别”
},
“挂载点”:“/”,
"prefix": "leveldb.datastore",
“类型”:“测量”
}
],
“类型”:“安装”
}

类型:对象

发现

包含用于配置 IPFS 节点发现机制的选项。

Discovery.MDNS

ZeroConf 多播 DNS-SD 对等发现选项。

Discovery.MDNS.Enabled

一个布尔值,表示多播 DNS-SD 是否应处于活动状态。

默认值:true

类型:布尔

Discovery.MDNS.Interval

已删除: 这不再可配置
新的 mDNS 实现 中。

实验

切换和配置 Kubo 的实验性功能。此处 列出了实验功能。

网关

HTTP 网关的选项。

Gateway.NoFetch

当设置为 true 时,网关将仅提供本地存储库中已有的内容
并且不会从网络获取文件。

默认值:“假”

类型:布尔

网关.NoDNSLink

一个布尔值,用于配置 DNSLink 是否在“Host” HTTP 标头中查找值
应该执行。如果存在 DNSLink,则存储在 DNS TXT 中的内容路径
记录变为“/”,并将相应的有效负载返回给客户端。

默认值:“假”

类型:布尔

Gateway.DeserializedResponses

用于显式配置此网关是否响应反序列化的可选标志
要求,或不要求。默认情况下,它是启用的。禁用此选项时,网关
仅作为无信任网关运行:https://specs.ipfs.tech/http-gateways/trustless-gateway/。

默认值:true

类型:标志

Gateway.HTTPHeaders

在网关响应上设置的标头。

默认值:“{}”+来自“boxo/gateway#AddAccessControlHeaders”和 ipfs/specs#423 的隐式 CORS 标头

类型:对象[字符串 -> 数组[字符串]]

Gateway.RootRedirect

/ 请求重定向到的 url。

默认值:""

类型:字符串(网址)

Gateway.FastDirIndexThreshold

已删除:此选项不再需要。自 Kubo 0.18 起被忽略。

网关.可写

已删除:此选项从 Kubo 0.20 起不再可用。

我们正在努力开发一种现代替代品。为了支持我们的努力,请在 ipfs/specs#375 中留下描述您的用例的评论。

Gateway.PathPrefixes

已删除: 请参阅 go-ipfs#7702

网关.公共网关

PublicGateways 是一个字典,用于定义指定主机名上的网关行为。

可以选择使用一个或多个通配符来定义主机名。

例子:

  • *.example.com 将匹配对 http://foo.example.com/ipfs/*http://{cid}.ipfs.bar.example.com/* 的请求。
  • foo-*.example.com 将匹配对 http://foo-bar.example.com/ipfs/*http://{cid}.ipfs.foo-xyz.example.com 的请求/*

Gateway.PublicGateways:路径

应在主机名上公开的路径数组。

例子:

1
2
3
4
5
6
7
8
9
{
“网关”:{
“公共网关”:{
“example.com”:{
“路径”:[“/ ipfs”,“/ ipns”]
}
}
}
}

上面启用了“http://example.com/ipfs/*”和“http://example.com/ipns/*”,但不启用“http://example.com/api/*”

默认值:[]

类型:数组[字符串]

Gateway.PublicGateways:UseSubdomains

一个布尔值,用于配置主机名处的网关是否提供源隔离
内容根之间。

  • true - 在http://*.{hostname}/启用[子域网关](https://docs.ipfs.tech/how-to/address-ipfs-on-web/#subdomain-gateway)

    • 需要白名单: 确保设置相应的“路径”。
      例如,http://{cid}.ipfs.{hostname}http://{foo}.ipns.{hostname} 需要 Paths: [“/ipfs”, “/ipns”] } 工作:
      1
      2
      3
      4
      5
      6
      7
      8
      “网关”:{
      “公共网关”:{
      “dweb.link”:{
      “UseSubdomains”:true
      “路径”:[“/ ipfs”,“/ ipns”]
      }
      }
      }
    • **向后兼容:**对内容路径(例如“http://{hostname}/ipfs/{cid}”)的请求会产生重定向到“http://{cid}.ipfs.{hostname}”
    • API: 如果“/api”位于“Paths”白名单中,则“http://{hostname}/api/{cmd}”会生成重定向到“http://api.{hostname}/api” /{cmd}`
  • false - 在http://{hostname}/*启用路径网关

    • 例子:
      1
      2
      3
      4
      5
      6
      7
      8
      “网关”:{
      “公共网关”:{
      “ipfs.io”:{
      “UseSubdomains”:假,
      “路径”:[“/ ipfs”,“/ ipns”,“/ api”]
      }
      }
      }

默认值:“假”

类型:布尔

Gateway.PublicGateways:NoDNSLink

一个布尔值,用于配置主机名的 DNSLink 是否存在于“Host”中
应解析 HTTP 标头。覆盖全局设置。
如果定义了“Paths”,它们优先于 DNSLink。

默认值:“false”(默认情况下为每个定义的主机名启用 DNSLink 查找)

类型:布尔

Gateway.PublicGateways:InlineDNSLink

用于显式配置子域网关是否重定向的可选标志
(由 UseSubdomains: true 启用)应始终内联 DNSLink 名称 (FQDN)
到单个 DNS 标签中:

1
//example.com/ipns/example.net → HTTP 301 → //example-net.ipns.example.com

DNSLink 名称内联允许在公共子域网关上使用 HTTPS
标签通配符 TLS 证书(在传递 X-Forwarded-Proto: https 时也启用),
当特殊规则如
https://publicsuffix.org,或 Brave 等浏览器中的自定义本地主机逻辑
必须应用。

默认值:“假”

类型:标志

Gateway.PublicGateways:反序列化响应

用于显式配置此网关是否响应反序列化的可选标志
要求,或不要求。默认情况下,它是启用的。禁用此选项时,网关
仅作为无信任网关运行:https://specs.ipfs.tech/http-gateways/trustless-gateway/。

默认值:与全局 Gateway.DeserializedResponses 相同

类型:标志

Gateway.PublicGateways 的隐式默认值

localhost 主机名和环回 IP 的默认条目始终存在。
如果为这些主机名提供了附加配置,它将合并到隐式值之上:

1
2
3
4
5
6
7
8
9
10
{
“网关”:{
“公共网关”:{
“本地主机”:{
“路径”:[“/ ipfs”,“/ ipns”]
“使用子域名”:true
}
}
}
}

也可以通过将默认值设置为“null”来删除默认值。

例如,禁用“localhost”上的子域网关
并使该主机名的行为与“127.0.0.1”相同:

``控制台
$ ipfs config –json Gateway.PublicGateways ‘{“localhost”: null }’

1
2
3
4
5
6
7
8
9
10
11
12
13

### `网关`食谱

以下是最常见的公共网关设置的列表。

* 公共[子域网关](https://docs.ipfs.tech/how-to/address-ipfs-on-web/#subdomain-gateway)位于`http://{cid}.ipfs.dweb.link` (每个内容根都有自己的起源)
``控制台
$ ipfs config --json Gateway.PublicGateways '{
“dweb.link”:{
“UseSubdomains”:true,
“路径”:[“/ipfs”,“/ipns”]
}
}'
  • **向后兼容:**此功能可以自动从内容路径重定向到子域:

    http://dweb.link/ipfs/{cid}http://{cid}.ipfs.dweb.link

  • X-Forwarded-Proto: 如果您在提供 TLS 的反向代理后面运行 Kubo,请使其添加“X-Forwarded-Proto:https” HTTP 标头,以确保用户重定向到“https://” ,而不是“http://”。它还将确保 DNSLink 名称内联以适合单个 DNS 标签,因此它们可以与通配符 TLS 证书一起正常工作(详细信息 )。NGINX 指令是 proxy_set_header X-Forwarded-Proto "https";。:

    http://dweb.link/ipfs/{cid}https://{cid}.ipfs.dweb.link

    http://dweb.link/ipns/your-dnslink.site.example.comhttps://your--dnslink-site-example-com.ipfs.dweb.link

  • X-Forwarded-Host: 如果您想覆盖原始请求中的子域网关主机,我们还支持 X-Forwarded-Host: example.com

    http://dweb.link/ipfs/{cid}http://{cid}.ipfs.example.com

  • 公共路径网关位于http://ipfs.io/ipfs/{cid} (无原点分离)
    ``控制台
    $ ipfs config –json Gateway.PublicGateways ‘{
    “ipfs.io”:{
    “UseSubdomains”:假,
    “路径”:[“/ipfs”、“/ipns”、“/api”]
    }
    }’

    1
    2
    3
    4

    * 公共 [DNSLink](https://dnslink.io/) 网关解析“Host”标头中传递的每个主机名。
    ``控制台
    $ ipfs config --json Gateway.NoDNSLink false
    • 请注意,“NoDNSLink: false”是默认值(除非手动设置为“true”,否则它开箱即用)
  • 强化的、特定于站点的 DNSLink 网关

    禁用远程数据获取(“NoFetch: true”)和解析未知主机名的 DNSLink(“NoDNSLink: true”)。
    然后,仅针对特定主机名(其数据
    已经存在于节点上),而不暴露任何内容寻址“路径”:

    ``控制台
    $ ipfs config –json Gateway.NoFetch true
    $ ipfs config –json Gateway.NoDNSLink true
    $ ipfs config –json Gateway.PublicGateways ‘{
    “en.wikipedia-on-ipfs.org”:{
    “NoDNSLink”:假,
    “路径”:[]
    }
    }’

    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

    ## `身份`

    ### `Identity.PeerID`

    此配置对等点的唯一 PKI 身份标签。设置在 init 上并且从不读取,
    在这里只是为了方便。ipfs 将始终从其生成对等点 ID
    运行时的密钥对。

    类型:`string`(对等 ID)

    ### `Identity.PrivKey`

    Base64 编码的 protobuf 描述(并包含)节点的私钥。

    类型:“字符串”(base64 编码)

    ## `内部`

    本部分包括各种子系统的内部旋钮,允许拥有大型或私有基础设施的高级用户微调某些行为,而无需重新编译 Kubo。

    **请注意,在此处进行明智的更改需要深入的知识,大多数用户应保持这些不变。此处列出的所有旋钮在版本之间都会发生重大变化。**

    ### `内部.Bitswap`

    “Internal.Bitswap”包含用于调整 Bitswap 资源利用率的旋钮。
    旋钮(如下)记录了它们的值应如何相互关联。
    应确定是否应提高或降低其值
    基于指标“ipfs_bitswap_active_tasks”、“ipfs_bitswap_pending_tasks”,
    `ipfs_bitswap_pending_block_tasks` 和 `ipfs_bitswap_active_block_tasks`
    由 Bitswap 报道。

    这些指标可以作为 Prometheus 端点在“{Addresses.API}/debug/metrics/prometheus”进行访问(默认值:“http://127.0.0.1:5001/debug/metrics/prometheus”)

    “ipfs_bitswap_active_tasks”的值由“EngineTaskWorkerCount”限制。

    `ipfs_bitswap_pending_tasks` 的值通常由下面的旋钮限制,
    然而,它的确切最大值很难预测,因为它取决于任务大小
    以及发出请求的同行数量。然而,根据经验,
    在健康运行期间,该值应围绕“典型”低值振荡
    (不会连续达到平台期)。

    如果“ipfs_bitswap_pending_tasks”正在增长,而“ipfs_bitswap_active_tasks”达到最大值,则
    该节点已达到其资源限制,新请求进入后无法尽快得到处理。
    假设硬件可以支持新的限制,提高资源限制(使用下面的旋钮)可能会有所帮助。

    “ipfs_bitswap_active_block_tasks”的值由“EngineBlockstoreWorkerCount”限制。

    “ipfs_bitswap_pending_block_tasks”的值间接受到“ipfs_bitswap_active_tasks”的限制,但可能很难
    预测,因为它取决于对等任务中涉及的块的数量,该数量可能会有所不同。

    如果观察到“ipfs_bitswap_pending_block_tasks”的值增长,
    当“ipfs_bitswap_active_block_tasks”达到最大值时,有迹象表明
    可用的块任务正在造成瓶颈(由于高延迟块操作,
    或者由于每个位交换对等任务的块操作数量较多)。
    在这种情况下,请尝试增加“EngineBlockstoreWorkerCount”。
    如果此调整仍然没有增加节点的吞吐量,则可能有
    是 I/O 或 CPU 等硬件限制。

    #### `Internal.Bitswap.TaskWorkerCount`

    发送传出消息的线程(goroutine)数量。
    限制并发发送操作的数量。

    类型:`optionInteger`(线程数,`null` 表示默认为 8)

    #### `Internal.Bitswap.EngineBlockstoreWorkerCount`

    块存储操作的线程数。
    用于限制对块存储的并发请求数量。
    最佳值可以通过指标“ipfs_bitswap_pending_block_tasks”和“ipfs_bitswap_active_block_tasks”得知。
    该数字取决于您的硬件(I/O 和 CPU)。

    类型:`optionInteger`(线程数,`null` 表示默认为 128)

    #### `Internal.Bitswap.EngineTaskWorkerCount`

    用于在发送响应之前准备和打包响应的工作线程数。
    该数字通常应等于“TaskWorkerCount”。

    类型:`optionInteger`(线程数,`null` 表示默认为 8)

    #### `Internal.Bitswap.MaxOutstandingBytesPerPeer`

    等待处理并发送到任何单个对等点的最大字节数(跨所有任务)。
    这个数字控制公平性,可以从 250Kb(非常公平)到 10Mb(不太公平,需要更多工作)变化
    献给有更多要求的同行)。低于 250Kb 的值可能会导致抖动。
    超过 10Mb 的值可能会导致积极想要的对等方消耗所有资源并
    降低向需求不那么积极的同行提供的质量。

    类型:“可选整数”(字节数,“null”表示默认值,即 1MB)

    ### `Internal.Bitswap.ProviderSearchDelay`

    此参数确定在查找 bitswap 之外的提供程序之前等待多长时间。
    其他路由系统(例如 DHT)能够在不到一秒的时间内提供结果,因此降低了
    在某些情况下,这个数字将允许更快的对等点查找。

    类型:“可选持续时间”(“null”表示默认值,即 1 秒)

    ### `Internal.UnixFSShardingSizeThreshold`

    内部使用分片阈值来决定 UnixFS 目录是否应该分片。
    该值与 UnixFS 目录块的大小以及任何增加并不严格相关
    阈值应注意块大小保持在 2MiB 以下,以便它们
    可通过网络堆栈可靠地传输(公共群上的 IPFS 对等点往往会忽略大于 2MiB 的块的请求)。

    将此值减少到 1B 在功能上等同于之前的实验性分片选项
    分片所有目录。

    类型:“可选字节”(“null”表示默认值,即 256KiB)

    ## `IPNS`

    ### `Ipns.RepublishPeriod`

    指定重新发布 ipns 记录的频率的持续时间,以确保
    他们在网络上保持新鲜感。

    默认值:4 小时。

    输入:“interval”或默认为空字符串。

    ### `Ipns.RecordLifetime`

    指定要在 ipns 记录上设置的值以确保其有效性的持续时间
    寿命。

    默认值:24 小时。

    输入:“interval”或默认为空字符串。

    ### `Ipns.ResolveCacheSize`

    存储在已解析 ipns 条目的 LRU 缓存中的条目数。参赛作品
    将被保存在缓存中,直到其生命周期到期。

    默认值:`128`

    类型:`integer`(非负数,0表示默认)

    ### `Ipns.UsePubsub`

    启用 IPFS over pubsub 实验以实时发布 IPNS 记录。

    **实验:** 在 [experimental-features.md#ipns-pubsub](./experimental-features.md#ipns-pubsub) 中了解当前限制。

    默认值:`禁用`

    类型:`标志`

    ## `迁移`

    迁移配置如何下载迁移以及是否将下载添加到本地 IPFS。

    ### `迁移.DownloadSources`

    来源按优先顺序排列,其中“IPFS”表示使用 IPFS,“HTTPS”表示使用默认网关。任何其他值都被解释为自定义网关的主机名。空列表意味着“使用默认源”。

    默认值:`[“HTTPS”,“IPFS”]`

    ### `迁移.保留`

    指定下载后是否保留迁移。选项有“丢弃”、“缓存”、“固定”。默认为空字符串。

    默认值:`缓存`

    ## `坐骑`

    **实验:** 在 [fuse.md](./fuse.md) 中了解当前限制。

    FUSE 安装点配置选项。

    ### `挂载.IPFS`

    `/ipfs/` 的挂载点。

    默认值:`/ipfs`

    类型:`string`(文件系统路径)

    ### `坐骑.IPNS`

    `/ipns/` 的挂载点。

    默认值:`/ipns`

    类型:`string`(文件系统路径)

    ### `Mounts.FuseAllowOther`

    在安装点上设置“FUSE 允许其他”选项。

    ## `固定`

    固定配置可用于固定内容的选项
    (即长期保存内容而不是临时缓存存储)。

    ### `固定.RemoteServices`

    `RemoteServices` 将远程固定服务的名称映射到其配置。

    远程固定服务是公开用于管理的 API 的远程服务
    该服务对长期数据存储的兴趣。

    公开的 API 符合以下定义的规范
    https://ipfs.github.io/pinning-services-api-spec/

    #### `固定.RemoteServices:API`

    包含与使用远程固定服务相关的信息

    例子:
    ```json
    {
    “固定”:{
    “远程服务”:{
    “myPinningService”:{
    “API”:{
    “端点”:“https://pinningservice.tld:1234/my/api/path”,
    “密钥”:“一些不透明密钥”
    }
    }
    }
    }
    }
Pinning.RemoteServices:API.Endpoint

用于访问固定服务的 HTTP(S) 端点

示例:“https://pinningservice.tld:1234/my/api/path”

类型:字符串

固定.RemoteServices:API.Key

授予对固定服务的访问权限的密钥

类型:字符串

Pinning.RemoteServices:策略

包含远程固定服务的附加选择加入策略。

固定.RemoteServices:策略.MFS

启用此策略后,它会遵循 MFS 的更改
并更新已配置的远程服务上 MFS 根的 pin。

仅当 MFS 根 CID 更改时才会向远程服务发送 pin 请求
并且自上次请求以来已经过去了足够的时间(由“RepinInterval”确定)。

人们可以通过“ipfs 日志级别 Remotepinning/mfs debug”启用调试来观察 MFS 固定细节,并在完成后切换回“错误”。

Pinning.RemoteServices:策略.MFS.Enabled

控制此策略是否处于活动状态。

默认值:“假”

类型:布尔

Pinning.RemoteServices:策略.MFS.PinName

用于表示 MFS 根 CID 的远程引脚的可选名称。
当留空时,将生成默认名称。

默认值:"policy/{PeerID}/mfs",例如"policy/12.../mfs"

类型:字符串

Pinning.RemoteServices:Policies.MFS.RepinInterval

定义将 pin 请求发送到远程服务的频率(最多)。
如果留空,将使用默认间隔。低于“1m”的值将被忽略。

默认值:“5m”

类型:持续时间

发布订阅

已弃用:请参阅 #9717

Pubsub 配置“ipfs pubsub”子系统。要使用它,必须通过以下方式启用
--enable-pubsub-experiment 标志传递给守护进程
或通过下面的“Pubsub.Enabled”标志。

Pubsub.Enabled

已弃用:请参阅 #9717

启用 pubsub 系统。

默认值:“假”

类型:标志

Pubsub.Router

已弃用:请参阅 #9717

设置 pubsub 用于将消息路由到对等点的默认路由器。这可以是以下之一:

*“floodsub”-floodsub 是一个基本路由器,它只是将消息_floods_发送给所有
连接的同行。该路由器效率极低,但_非常_可靠。

  • "gossipsub" - [gossipsub][] 是一种更高级的路由算法,它将
    从网络中链接的子集构建覆盖网格。

默认值:“gossipsub”

类型:string"floodsub""gossipsub""" 之一(应用默认值))

[gossipsub]:https://github.com/libp2p/specs/tree/master/pubsub/gossipsub

Pubsub.DisableSigning

已弃用:请参阅 #9717

禁用消息签名和签名验证。启用此选项,如果
您正在一个完全可信的网络中运行。

即使您不关心是谁发送的,禁用签名也是_不_安全的
消息,因为欺骗消息可以用来压制真实消息
故意重复使用真实消息的消息 ID。

默认值:“假”

类型:布尔

Pubsub.SeenMessagesTTL

已弃用:请参阅 #9717

控制重复消息的时间窗口,由 Message 标识
ID,将被识别,不会再次发出。

该参数值较小意味着缓存中的 Pubsub 消息将
更快地进行垃圾收集,这可能会导致缓存更小。同时
时间,如果网络中存在转发较旧消息的较慢节点,
这可能会导致更多的重复项通过网络传播。

相反,该参数的值越大,意味着 Pubsub 消息在
缓存稍后将被垃圾收集,这可能会导致更大的缓存
相同的流量模式。然而,重复的可能性较小
通过网络传播。

默认值:请参阅 go-libp2p-pubsub 中的 TimeCacheDuration

类型:可选持续时间

Pubsub.SeenMessagesStrategy

已弃用:请参阅 #9717

确定 Pubsub 重复数据删除的生存时间 (TTL) 倒计时方式
消息被计算。

Pubsub 看到的消息缓存是一个 LRU 缓存,可将消息保留最多
指定的持续时间。过了这个时间后,过期的消息将会
从缓存中清除。

“最后查看”缓存是滑动窗口缓存。每次看到消息
再次随着 SeenMessagesTTL 持续时间,其时间戳向前滑动。这
缓存频繁出现的消息并防止它们被
不断传播,特别是因为可能会增加
网络中重复消息的数量。

“first-seen”缓存将存储新消息并在消息到达后清除它们
SeenMessagesTTL 持续时间,即使在此期间多次看到它们
期间。

默认值:last-seen(参见 go-libp2p-pubsub

类型:可选字符串

对等互连

配置对等子系统。对等互连子系统将 Kubo 配置为
连接到、保持连接以及重新连接到一组节点。节点应该
使用此子系统在经常有用的对等点之间创建“粘性”链接
提高可靠性。

用例:

  • 连接到 IPFS 集群的 IPFS 网关应该对等以确保
    网关始终可以从集群中获取内容。
  • dapp 可以通过一组固定服务对嵌入的 Kubo 节点进行对等,或者
    纺织咖啡馆/中心。
  • 一群朋友可以互相查看以确保他们总是可以获取彼此的
    内容。

当一个节点被添加到对等节点集中时,Kubo 将:

  1. 保护连接管理器与此节点的连接。那是,
    Kubo 永远不会自动关闭与该节点的连接,并且
    到此节点的连接不会计入连接限制。
  2. 启动时连接到该节点。
  3. 如果最后一个连接断开或
    节点离线。这种重复的重新连接逻辑是由随机的
    指数退避延迟范围从约 5 秒到约 10 分钟,以避免
    反复重新连接到离线的节点。

对等互连可以是不对称的或对称的:

  • 当对称时,连接将受到两个节点的保护,并且可能会
    非常稳定。
  • 非对称时,只有一个节点(配置对等的节点)进行保护
    连接并尝试在断开连接时重新连接到对等节点。如果
    对等节点负载较重和/或连接限制较低,
    连接可能会反复抖动。不对称地凝视时要小心,不要
    超载同行。

对等。对等

与之对等的对等点集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
“对等”:{
“同行”:[
{
"ID": "QmPeerID1",
“地址”:[“/ip4/18.1.1.1/tcp/4001]
},
{
"ID": "QmPeerID2",
“地址”:[“/ip4/18.1.1.2/tcp/4001”,“/ip4/18.1.1.2/udp/4001/quic”]
}
]
}
...
}

其中“ID”是对等点 ID,“Addrs”是对等点的一组已知地址。如果没有指定地址,则会查询 DHT。

将来可能会添加其他字段。

默认值:空。

类型:数组[对等]

重新提供者

Reprovider.Interval

设置向路由重新提供本地内容的轮次之间的时间
系统。

  • 如果未设置,则使用隐式安全默认值。
  • 如果设置为值“0”,它将禁用内容重新提供。

注意:禁用内容重新提供将导致网络上的其他节点
无法发现你拥有你所拥有的物品。如果你想
要禁用此功能并使网络了解您所拥有的内容,您必须
定期手动公布您的内容。

默认值:22hDefaultReproviderInterval

类型:“可选持续时间”(默认未设置)

Reprovider.Strategy

告诉重新提供者应该宣布什么。有效的策略是:

  • "all" - 公布存储块的所有 CID
  • "pinned" - 仅递归地宣布固定的 CID(根块和子块)
  • "roots" - 仅宣布显式固定 CID 的根块

默认值:“全部”

类型:“可选字符串”(默认未设置)

路由

包含内容、对等和 IPNS 路由机制的选项。

路由.类型

有多个路由选项:“auto”、“autoclient”、“none”、“dht”、“dhtclient”和“custom”。

  • 默认: 如果未设置或设置为“自动”,您的节点将使用 IPFS DHT
    和下面列出的并行 HTTP 路由器可提高速度。

  • 如果设置为“autoclient”,您的节点将像“auto”一样运行,但不运行 DHT 服务器。

  • 如果设置为“none”,您的节点将使用_no_路由系统。你必须
    明确连接到具有您正在查找的内容的对等点。

  • 如果设置为“dht”(或“dhtclient”/“dhtserver”),您的节点将仅使用 IPFS DHT(无 HTTP 路由器)。

  • 如果设置为“自定义”,则禁用所有默认路由器,并且仅使用“Routing.Routers”中定义的路由器。

当DHT启用时,它可以以两种模式运行:客户端和服务器。

  • 在服务器模式下,您的节点将向其他对等点查询 DHT 记录,并将
    响应来自其他对等点的请求(存储记录的请求和
    请求检索记录)。

  • 在客户端模式下,您的节点将作为客户端查询DHT,但不会响应
    应其他同行的要求。该模式比服务器占用资源少
    模式。

Routing.Type 设置为 autodht 时,您的节点将作为 DHT 客户端启动,并且
当确定可以从 DHT 服务器访问时,切换到 DHT 服务器
公共互联网(例如,它不在防火墙后面)。

要强制使用特定的仅 DHT 模式、客户端或服务器,请将“Routing.Type”设置为
分别为“dhtclient”或“dhtserver”。请不要将其设置为“dhtserver”
除非您确定可以从公共网络访问您的节点。

当“Routing.Type”设置为“auto”或“autoclient”时,您的节点将加速某些类型的路由
通过利用与 IPIP-337 兼容的 HTTP 端点
除了IPFS DHT。
默认情况下,IPNI 的实例
使用 https://cid.contact。
将“Routing.Type”设置为“custom”后,可以在“Routing.Routers”中配置替代路由规则。

默认值:“自动”(DHT + IPNI)

类型:可选字符串null/缺失表示默认值)

路由.AcceleratedDHTClient

这个具有完整路由表策略的替代 DHT 客户端将
每小时对 DHT 进行一次完整扫描并记录找到的所有节点。
然后,当尝试查找时,不必经历多个 Kad 跃点
通过查找内存中记录的网络表,能够找到最终的20个节点。

这意味着持续更高的内存来存储路由表
以及每次网络扫描的额外 CPU 和网络带宽。
然而,单个读/写操作的延迟应该快 10 倍左右
在更大的数据集上,吞吐量可提高 600 万倍!

这与“Routing.Type”“custom”不兼容。如果您使用可组合路由器
您可以在每个路由器上单独进行配置。

当启用时:

  • 客户端 DHT 操作(读取和写入)应该更快地完成
  • 提供商现在将使用键空间扫描模式来保持活动状态
    CID 集大多个数量级。
    • 标准的 Bucket-Routing-Table DHT 仍将为 DHT 服务器运行(如果
      DHT 服务器已启用)。这意味着经典路由表将
      仍然可以用来回答其他节点。
      这对于保持不损害网络至关重要。
  • 操作“ipfs stats dht”将默认显示有关加速 DHT 客户端的信息

注意事项:

  1. 运行加速客户端可能会导致更多资源消耗(连接、RAM、CPU、带宽)
    • 其机器/网络可以执行的并行连接数量受到限制的用户可能会受到影响
    • 资源使用不顺畅,客户端轮流抓取网络,重新提供也同样轮次完成
    • 以前拥有大量内容但无法在网络上做广告的用户将看到内容增加
      当节点开始将其所有 CID 通告到网络中时,出口带宽。如果您有大量数据
      输入您不想宣传的节点,然后考虑使用 Reprovider Strategies
      以减少您重新提供的 CID 数量。同样,如果您运行的节点主要处理
      短暂的临时数据(例如,您使用单独的节点来摄取数据,然后存储和提供数据)
      您可能会受益于使用策略提供 来防止广告
      您最终不会拥有的数据。
  2. 目前,DHT 无法用于操作前 5-10 分钟的查询,因为路由表正在更新中。
    准备好了。这意味着在 DHT 中搜索特定节点或内容等操作最初将无法进行。
    • 您可以通过运行“ipfs stats dht”来查看 DHT 是否已初始填充
  3. 目前加速DHT客户端不兼容基于局域网的DHT,不会对DHT进行操作
    他们

默认值:“假”

类型:“bool”(缺少表示“false”)

路由.路由器

实验:“Routing.Routers”配置可能会在未来版本中更改

附加路由器的映射。

允许使用替代路由器扩展默认路由 (DHT)
实施。

映射键是路由器的名称,值是其配置。

默认值:{}

类型:对象[字符串->对象]

路由.路由器:类型

实验:“Routing.Routers”配置可能会在未来版本中更改

它指定将创建的路由类型。

目前支持的类型:

  • 基于 IPIP-337 的 HTTP 协议的“http”简单委托路由
  • dht 提供基于 libp2p 的 kad-dht 的去中心化路由
  • parallelsequential:可用于顺序或并行运行多个路由器的帮助程序。

类型:字符串

路由.路由器:参数

实验:“Routing.Routers”配置可能会在未来版本中更改

创建指定路由器所需的参数。每种路由器类型支持的参数:

HTTP:

  • Endpoint(强制):将用于连接到指定路由器的 URL。
  • MaxProvideBatchSize:此数字确定每批发送的 CID 的最大数量。服务器每批接受的元素可能不超过 100 个。默认 100 个元素。
  • MaxProvideConcurrency:它确定提供内容时使用的线程数。默认情况下为 GOMAXPROCS。

双氢睾酮:

  • "Mode":DHT 使用的模式。可能的值:“服务器”、“客户端”、“自动”
  • "AcceleratedDHTClient":如果您想使用加速DHT,请设置为true
  • “PublicIPNetwork”:设置为“true”以创建“WAN”DHT。设置为“false”以创建“LAN”DHT。

平行线:

  • Routers:将并行执行的路由器列表:
    • Name:string:路由器的名称。它应该是之前添加到“路由器”列表中的其中之一。
    • 超时:持续时间:本地超时。它接受与 Go time.ParseDuration(string) 兼容的字符串(10s1m2h)。当这个特定的路由器被调用时,时间就会开始计时,当路由器返回时,或者我们达到指定的超时时间,时间就会停止。
    • ExecuteAfter:duration:提供此参数将在指定时间延迟该路由器的执行。它接受与 Go time.ParseDuration(string) 兼容的字符串(10s1m2h)。
    • IgnoreErrors:bool:它将指定如果发生错误,是否应忽略该路由器。
  • 超时:持续时间:全局超时。它接受与 Go time.ParseDuration(string) 兼容的字符串(10s1m2h)。

顺序:

  • Routers:将按顺序执行的路由器列表:
    • Name:string:路由器的名称。它应该是之前添加到“路由器”列表中的其中之一。
    • 超时:持续时间:本地超时。它接受与 Go time.ParseDuration(string) 兼容的字符串。当这个特定的路由器被调用时,时间就会开始计时,当路由器返回时,或者我们达到指定的超时时间,时间就会停止。
    • IgnoreErrors:bool:它将指定如果发生错误,是否应忽略该路由器。
  • 超时:持续时间:全局超时。它接受与 Go time.ParseDuration(string) 兼容的字符串。

默认值:{}(使用安全的隐式默认值)

类型:对象[字符串->字符串]

路由:方法

Methods:map 将定义每个方法将执行哪些路由器。关键是方法的名称:“provide”、“find-providers”、“find-peers”、“put-ipns”、“get-ipns”。所有方法都必须添加到列表中。

该值将包含:

  • RouterName:string:路由器的名称。它应该是之前添加到“Routing.Routers”列表中的其中之一。

类型:对象[字符串->对象]

例子:

使用 2 个路由器、DHT (LAN/WAN) 和并行路由器的完整示例。

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
$ ipfs config Routing.Type --json '“自定义”'

$ ipfs 配置 Routing.Routers.WanDHT --json '{
“类型”:“dht”,
“参数”: {
“模式”:“自动”,
“公共IP网络”:正确,
“加速DHTClient”:假
}
}'

$ ipfs 配置 Routing.Routers.LanDHT --json '{
“类型”:“dht”,
“参数”: {
“模式”:“自动”,
“公共IP网络”:假,
“加速DHTClient”:假
}
}'

$ ipfs 配置 Routing.Routers.ParallelHelper --json '{
“类型”:“并行”,
“参数”: {
“路由器”:[
{
“路由器名称”:“LanDHT”,
“忽略错误”:正确,
“超时”:“3秒”
},
{
“路由器名称”:“WanDHT”,
“忽略错误”:错误,
“超时”:“5m”,
“执行后”:“2秒”
}
]
}
}'

ipfs 配置路由.Methods --json '{
“查找同行”:{
“路由器名称”:“并行助手”
},
“寻找供应商”:{
“路由器名称”:“并行助手”
},
“获取 ipns”:{
“路由器名称”:“并行助手”
},
“提供”: {
“路由器名称”:“并行助手”
},
“put-ipns”:{
“路由器名称”:“并行助手”
}
}'

用于配置群的选项。

Swarm.AddrFilters

不拨号的地址数组(多地址网络掩码)。默认情况下,IPFS 节点
公布_所有_地址,甚至是内部地址。这使得节点更容易
同一网络可以互相联系。不幸的是,这意味着 IPFS
每当拨号时,节点都会尝试连接到一个或多个私有IP地址
另一个节点,即使这个另一个节点位于不同的网络上。这可能
触发某些托管提供商的网络扫描警报或导致某些设置紧张。

server 配置文件用合理的默认值填充此列表,
防止拨号到所有不可路由的 IP 地址(例如,/ip4/192.168.0.0/ipcidr/16
这是 192.168.0.0/16 的多地址表示),但你应该始终
检查您自己的网络和/或托管提供商的设置。

默认值:[]

类型:数组[字符串]

Swarm.DisableBandwidthMetrics

一个布尔值,当设置为 true 时,将导致 ipfs 不跟踪
带宽指标。禁用带宽指标可能会导致性能轻微下降
改进以及内存使用量的减少。

默认值:“假”

类型:布尔

Swarm.DisableNatPortMap

禁用自动 NAT 端口转发。

如果未禁用(默认),Kubo 会要求 NAT 设备(例如路由器)打开
启动外部端口并将其转发到 Kubo 正在运行的端口。当这个
工作(即,当您的路由器支持 NAT 端口转发时),它使本地
Kubo 节点可通过公共互联网访问。

默认值:“假”

类型:布尔

Swarm.EnableHolePunching

启用NAT穿越打洞功能
当无法进行端口转发时。

启用后,Kubo 将使用以下方式与交易对手进行协调
[中继连接](https://github.com/libp2p/specs/blob/master/relay/ Circuit-v2.md),
升级为直接连接
尽可能通过 NAT/防火墙。
此功能需要将“Swarm.RelayClient.Enabled”设置为“true”。

默认值:true

类型:标志

Swarm.EnableAutoRelay

已删除

请参阅“Swarm.RelayClient”。

Swarm.RelayClient

中继客户端使用中继服务的配置选项。

默认值:{}

类型:对象

Swarm.RelayClient.Enabled

为此节点启用“自动中继用户”模式。

如果您的节点检测到,它将自动_使用_来自网络的公共中继
无法从公共互联网访问它(例如,它位于
防火墙)并从公共中继获取“/p2p-电路”地址。

默认值:true

类型:标志

Swarm.RelayClient.StaticRelays

您的节点将使用这些静态配置的中继服务器
而不是从网络中发现公共中继([Circuit Relay v2](https://github.com/libp2p/specs/blob/master/relay/ Circuit-v2.md))。

默认值:[]

类型:数组[字符串]

Swarm.RelayService

可以提供给_other_对等点的中继服务的配置选项
在网络上(Circuit Relay v2)。

默认值:{}

类型:对象

Swarm.RelayService.Enabled

允许向网络上的其他对等点提供“/p2p-电路”v2 中继服务。

注意:这是中继系统的服务/服务器部分。
禁用此选项将阻止该节点作为中继服务器运行。
使用 Swarm.RelayClient.Enabled 将您的节点转变为中继用户。

默认值:true

类型:标志

Swarm.RelayService.Limit

限制应用于每个中继连接。

默认值:{}

类型:对象[字符串 -> 字符串]

Swarm.RelayService.ConnectionDurationLimit

重置中继连接之前的时间限制。

默认值:“2m”

类型:持续时间

Swarm.RelayService.ConnectionDataLimit

重置中继连接之前中继的数据限制(每个方向)。

默认值:131072 (128 kb)

类型:可选整数

Swarm.RelayService.ReservationTTL

新的或刷新的预订的持续时间。

默认值:“1h”

类型:持续时间

Swarm.RelayService.MaxReservations

活动中继插槽的最大数量。

默认值:128

类型:可选整数

Swarm.RelayService.MaxCircuits

每个对等方打开的中继连接的最大数量。

默认值:16

类型:可选整数

Swarm.RelayService.BufferSize

中继连接缓冲区的大小。

默认值:2048

类型:可选整数

Swarm.RelayService.MaxReservationsPerPeer

来自同一对等点的最大保留数。

默认值:4

类型:可选整数

Swarm.RelayService.MaxReservationsPerIP

来自同一 IP 的最大保留数。

默认值:8

类型:可选整数

Swarm.RelayService.MaxReservationsPerASN

来自同一 ASN 的最大保留数。

默认值:32

类型:可选整数

Swarm.EnableRelayHop

已删除

替换为 Swarm.RelayService.Enabled

Swarm.DisableRelay

已删除

将“Swarm.Transports.Network.Relay”设置为“false”。

Swarm.EnableAutoNATService

已删除

请使用AutoNAT.ServiceMode

Swarm.ConnMgr

连接管理器决定要保留哪些连接以及多少个连接
被配置为保留。Kubo 目前支持两种连接管理器:

  • none:从不关闭空闲连接。
  • basic:默认的连接管理器。

默认情况下,此部分为空,隐式默认值定义如下
被使用。

Swarm.ConnMgr.Type

设置要使用的连接管理器类型,选项有:“none”(无连接
管理)和“基本”。

默认值:“基本”。

类型:“可选字符串”(未设置或为空时默认)

基本连接管理器

基本连接管理器使用“高水位”、“低水位”和内部
评分以定期关闭连接以释放资源。当一个节点
使用基本连接管理器达到“HighWater”空闲连接,它将
关闭最不有用的连接,直到达到“LowWater”空闲连接。

在以下情况下,连接管理器认为连接空闲:

  • 它尚未受到某些子系统的显式_​​保护_。例如,比特交换
    将保护与正在主动下载数据的对等点的连接,
    DHT 将保护一些对等点进行路由,并且对等子系统将
    保护所有“对等”节点。
  • 它的存在时间比 GracePeriod 还要长。

例子:

1
2
3
4
5
6
7
8
9
10
{
“一群”: {
“ConnMgr”:{
“类型”:“基本”,
“低水位”:100
“高水位”:200
“宽限期”:“30 秒”
}
}
}
Swarm.ConnMgr.LowWater

LowWater 是基本连接管理器将要处理的连接数
修剪到。

默认值:32

类型:可选整数

Swarm.ConnMgr.HighWater

HighWater 是连接数,超过时将触发
连接GC操作。注意:受保护/最近形成的连接不计算在内
向这个极限。

默认值:96

类型:可选整数

Swarm.ConnMgr.GracePeriod

GracePeriod 是新连接不被关闭的时间段
由连接管理器。

默认值:“20 秒”

类型:可选持续时间

Swarm.ResourceMgr

了解有关 Kubo 使用 libp2p 网络资源管理器的更多信息
专用资源管理文档中。

Swarm.ResourceMgr.Enabled

使用基于默认值和/或其他配置的限制来启用 libp2p 资源管理器,如 libp2p 资源管理 中所述。

默认值:true
类型:标志

Swarm.ResourceMgr.MaxMemory

这是允许 libp2p 使用的最大内存量。
当达到此限制时,libp2p 的资源管理器将阻止创建额外的资源。
该值还用于扩展不同范围内各种资源的限制
当使用默认限制(在 libp2p 资源管理 中讨论)时。
例如,增加此值将增加传入连接的默认限制。

可以通过“ipfs swarm resources –help”检查运行时限制。

默认值:“[TOTAL_SYSTEM_MEMORY]/2”
类型:可选字节

Swarm.ResourceMgr.MaxFileDescriptors

这是允许 libp2p 使用的文件描述符的最大数量。
当达到此限制时,libp2p 的资源管理器将防止额外的文件描述符消耗。

此参数在 Windows 上被忽略。

默认“[TOTAL_SYSTEM_FILE_DESCRIPTORS]/2”
类型:可选整数

Swarm.ResourceMgr.Allowlist

可以绕过正常系统限制的多地址列表(但仍受白名单范围限制)。
go-libp2p-resource-manager#Allowlist.Add的便捷配置。

默认值:[]

类型:数组[字符串](多地址)

Swarm.Transports

libp2p 传输的配置部分。将应用空配置
默认值。

Swarm.Transports.Network

libp2p network 传输的配置部分。启用的传输
该部分将用于拨号。但是,要接收这些连接
传输,这些传输的多地址必须添加到“Addresses.Swarm”中。

支持的传输包括:QUIC、TCP、WS、Relay 和 WebTransport。

本节中的每个字段都是一个“标志”。

Swarm.Transports.Network.TCP

[TCP] (https://en.wikipedia.org/wiki/Transmission_Control_Protocol) 是一个简单的
和广泛部署的传输,它应该与大多数实现兼容
和网络配置。TCP 不直接支持加密和/或
多路复用,因此 libp2p 将在其之上分层安全和多路复用传输。

默认值:启用

类型:标志

收听地址:

  • /ip4/0.0.0.0/tcp/4001(默认)
  • /ip6/::/tcp/4001(默认)

Swarm.Transports.Network.Websocket

[Websocket] (https://en.wikipedia.org/wiki/WebSocket) 是一种常用的传输方式
从基于浏览器的 js-ipfs 节点连接到非基于浏览器的 IPFS 节点。

虽然默认情况下启用拨号功能,但 Kubo 不会监听此功能
默认运输。

默认值:启用

类型:标志

收听地址:

  • /ip4/0.0.0.0/tcp/4002/ws
  • /ip6/::/tcp/4002/ws

Swarm.Transports.Network.QUIC

[QUIC] (https://en.wikipedia.org/wiki/QUIC) 是最广泛使用的交通工具
久保节点。它是一种基于 UDP 的传输,具有内置加密和
复用。相对于 TCP 的主要优点是:

1.建立连接需要1次往返(我们的TCP传输
目前需要 4)。
2. 没有队头阻塞
3. 每个连接不需要文件描述符,减轻了操作系统的负载。

默认值:启用

类型:标志

收听地址:

  • /ip4/0.0.0.0/udp/4001/quic(默认)
  • /ip6/::/udp/4001/quic(默认)

Swarm.Transports.Network.Relay

Libp2p 中继 代理
通过在多个 libp2p 节点之间跳跃来形成连接的传输。
允许 IPFS 节点使用其“/p2p-电路”连接到其他对等点
多地址。这种传输主要用于绕过防火墙和
NAT。

也可以看看:

默认值:启用

类型:标志

收听地址:

  • 这种运输很特殊。任何启用此传输的节点都可以接收
    此传输上的入站连接,无需指定侦听地址。

Swarm.Transports.Network.WebTransport

[go-libp2p]的新功能(https://github.com/libp2p/go-libp2p/releases/tag/v0.23.0)
WebTransport 传输。

这是 WebSocket 的精神后代,但基于“HTTP/3”。
由于它运行在“HTTP/3”之上,因此它在底层使用“QUIC”。
由于额外的开销,我们预计它的性能比“QUIC”最差,
这种传输实际上是针对无法执行“TCP”或“QUIC”的代理(如浏览器)。

WebTransport 是一种新的传输协议,目前由 IETF 和 W3C 正在开发,并且已经由 Chrome 实现。
从概念上讲,它就像在 QUIC 而不是 TCP 上运行的 WebSocket。最重要的是,它允许浏览器建立与 WebTransport 服务器的(安全!)连接,而无需 CA 签名的证书,
从而使在浏览器中运行的任何 js-libp2p 节点能够连接到任何 kubo 节点,而无需手动配置。

之前的替代方案是 websocket 安全,需要手动安装反向代理和 TLS 证书。

默认值:启用

类型:标志

Swarm.Transports.Security

libp2p security 传输的配置部分。启用的传输
此部分将用于保护未加密的连接。

安全传输配置为“优先级”类型。

当建立_出站_连接时,Kubo 将尝试每种安全性
按优先级顺序传输(从低到高),直到找到一个协议
接收器支持。当建立_inbound_连接时,Kubo会让
发起者选择协议,但会拒绝使用任何禁用的协议
运输。

支持的传输包括:TLS(优先级 100)和 Noise(优先级 300)。

默认优先级绝不会低于 100。

Swarm.Transports.Security.TLS

TLS (1.3) 是默认值
从 Kubo 0.5.0 开始,安全传输。这也是最受关注和关注的
值得信赖的安全传输。

默认值:100

类型:优先

Swarm.Transports.Security.SECIO

对 SECIO 的支持已被删除。请从您的配置中删除此选项。

Swarm.Transports.Security.Noise

Noise 预计将被替换
由于易于使用,TLS 作为跨平台、默认的 libp2p 协议
执行。目前默认启用,但优先级较低,因为它
尚未得到广泛支持。

默认值:300

类型:优先

Swarm.Transports.Multiplexers

libp2p _多路复用器_传输的配置部分。启用的传输
该部分将用于复用双工连接。

多路复用器传输的保护方式与安全传输相同,
“优先”类型。与安全传输一样,发起者得到他们的
第一选择。

支持的传输包括:Yamux(优先级 100)和 Mplex(优先级 200)

默认优先级绝不会低于 100。

Swarm.Transports.Multiplexers.Yamux

Yamux 是 Kubo 节点之间通信时使用的默认多路复用器。

默认值:100

类型:优先

Swarm.Transports.Multiplexers.Mplex

Mplex 是 Kubo 和所有设备之间通信时使用的默认多路复用器
其他 IPFS 和 libp2p 实现。与 Yamux 不同:

  • Mplex 是一个更简单的协议。
  • Mplex 更高效。
  • Mplex 没有内置的 keepalive。
  • Mplex 不支持背压。不幸的是,这意味着,如果
    到对等点的单个流会备份一段时间,mplex
    传输将杀死该流以允许其他流继续进行。在另一
    另一方面,缺乏背压意味着 mplex 在某些方面可以明显更快
    高延迟连接。

默认值:200

类型:优先

DNS

用于为 DNSLink/dns* Multiaddrs 配置 DNS 解析的选项。

DNS.Resolvers

FQDN 到自定义解析器 URL 的映射。

这允许覆盖操作系统提供的默认 DNS 解析器,
每个域或 TLD 使用不同的解析器(包括来自替代的非 ICANN 命名系统的解析器)。

例子:

1
2
3
4
5
6
7
8
9
10
{
“DNS”:{
“解析器”:{
“eth。”:“https://dns.eth.limo/dns-query”,
“加密。”:“https://resolver.unstoppable.io/dns-query”,
“自由。”:“https://ns1.irisen.fr/dns-query”,
".": "https://cloudflare-dns.com/dns-query"
}
}
}

请注意:

  • 目前仅支持 DNS over HTTPS (DoH) 端点的“https://” URL 作为值。
  • 默认的全能解析器是操作系统提供的明文解析器。可以通过为由“.”指示的 DNS 根添加 DoH 条目来覆盖它,如上所示。
  • 对选定分散式 TLD 的开箱即用支持依赖于尽力提供的集中式服务。隐式 DoH 解析器是:
    1
    2
    3
    4
    {
    “eth。”:“https://resolver.cloudflare-eth.com/dns-query”,
    “加密。”:“https://resolver.cloudflare-eth.com/dns-query”
    }
    为了获得去中心化命名系统的所有好处,我们强烈建议将 DoH 端点设置为空字符串,并在本地主机上运行自己的去中心化解析器作为包罗万象的解析器。

默认值:{}

类型:对象[字符串 -> 字符串]

DNS.MaxCacheTTL

DoH 缓存中条目有效的最大持续时间。

这允许您限制 DNS 响应建议的生存时间 (RFC2181)。
如果存在,上限将应用于 DNS.Resolvers 中的 DoH 解析器。

注意:这不适用于 Go 的默认 DNS 解析器。要使其成为全局设置,请首先向“DNS.Resolvers”添加“.”条目。

例子:

  • "5m" DNS 条目保留 5 分钟或更短时间。
  • "0s" DNS 条目一旦被检索就会过期。

默认值:尊重 DNS 响应 TTL

类型:可选持续时间

修改brew services中服务的启动参数

作者 LanYun
2023年8月8日 15:18

前言

因为有增加brew services中服务的启动参数的需求,在网上看了圈,全是些CV内容,根本没解决问题.(中文互联网已经死亡,信息之墙,一层一层又一层.)

不过,解决起来确实很简单,(又水一篇文章)

定位目录

下面以ipfs为例.将ipfs换成其他,比如mysql

注: 只适用brew安装的服务.

1
cd "$(dirname "$(dirname "$(readlink -f $(which ipfs))")")"

接下来用vim分别修改plistservice

它们一个用于 macOS 系统上的服务管理,另外一个是配置文件.

修改文件

service文件在ExecStart后加参数(注意空格)即可,plist文件需要添加格式为<string>这里是参数</string>

缺点

可能: 没办法版本持久化?

因为我没测试过,可能升级操作文件会被覆盖.

解决Surge模块不能同步问题

作者 LanYun
2023年8月4日 12:43

前言

由于surge 开发者无视一些体验需求,只搞技术,没办法,只能曲线解决了.

起因(建议不看,有不好情绪😠): 在迁移apple账号的时候,特么的surge的授权(绑了授权邮箱)掉了,你说掉就掉吧,他妈的把老子安装的在线模块给删了,只给老子留个本地模块,我草尼玛,搞了那么多在线模块,老子怎么记得住,为了防盗版就这么恶心?本来都打算将就用,结果直接给爷👴在线模块弄没了,他妈的,然后就有本文用本地模块更新.由于不知道啥时候通过iCloud同步配置的文件夹不会同步在Mac上的icloud上,导致没法通过mac修改ios上的配置文件,这就很难受了,因为我的配置文件都是经过脚本自动化处理过了,只好用dropbox来进行同步,然后用Mountain Duck软件映射到本地路径(没办法,官方的dropbox在我macOS 14上闪退,极其难受)来控制配置文件.最难受的是正式版surge没法用dropbox,应该是bug,测试版能用,而我换id了,原来那个id中我没点停止测试,导致我新id一直测试不上,然后又碰上老刘的tf系统维护,等了一天多,最后终于搞定.(神特么等90天,等90天真傻逼,原id手动点停止测试,然后重新申请再换id接受申请就可以了.)

需求: 相同iCloud,ios不同设备间模块同步

前提: Mac设备,有dropbox账号,本地已映射dropbox路径

实现: 不借助iCloud,实现ios不同设备间本地模块定时更新自动同步.

实现 > 需求. ✅成功!

得到模块链接

要实现模块同步,首先你得有模块.本地模块没得说,隔空投送到mac就行了,而这里主要说一下远程模块链接提取.方法是没有方法🤡,像个傻逼一样一个一个手动提取,提取出来保存到一个文件中,待会用.我反正再也不用这个在线安装模块功能了,简直傻逼功能.

Dropbox同步

① 首先,将你原本iOS surge的Rule,Profiles,sgmodule等文件夹备份,随便备份到哪里.如果你不需要备份就跳过.

② iOS端surge的配置同步切换到Dropbox,会提示是否合并,直接合并.

③ 修改文件夹分类,可以参考我下面.自定义Rule规则文件和conf配置文件直接放Profiles文件夹中,模块放到sgmodule文件夹中,其中有custom子文件夹用于自定义的模块可以被检测到.

吐槽:surge的文件管理跟狗屎一样,Rule单独列一个文件夹检测不到,非要放到Profiles文件夹才能检测到,还不能放到子文件夹里面,只能直接和conf配置文件放一起,这种逻辑简直跟狗屎一样.

image-20230804165548973

解决方案

新版解决方案:

新版和旧版主要区别在对qx等其他模块的处理上.

由于懒,故略写,可自行看项目: Script-Hub

至于我为什么换新的解决办法,主要是会对raw.githubusercontent.com等github域名进行MitM解密,而某些应用为了安全,锁定了证书链,导致tls连接中断.还有一点旧版qx转换模块作者不维护了,故打算换成新项目.

可看作者的安装模块的wiki.这里不再赘述.

安装好后,即可用网址: https://script.hub/ 进行转换.

下面给出新版bash脚本代码,仅供参考.

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
#!/bin/bash

# 错误处理函数
handle_error() {
echo ""
echo '⚠️ 脚本发生错误!,请手动检查错误,2分钟后退出...'
[[ "$(uname)" == "Darwin" ]] && osascript -e 'display notification "模块同步脚本" with title "❌ 脚本发生错误!" sound name "Glass"'
sleep 120
exit 1
}

# 定义信号处理函数,用于响应 Ctrl+C
function handle_ctrl_c {
echo ""
echo "接收到 Ctrl+C,开始退出..."
exit 1
}

# 设置信号处理程序,捕捉 SIGINT 信号(Ctrl+C)
trap handle_ctrl_c SIGINT

# 设置错误处理函数
trap handle_error ERR

# 检查系统是否存在wget命令
if ! command -v wget &> /dev/null; then
# 检查Homebrew安装的wget是否存在
if [ -f "/opt/homebrew/bin/wget" ]; then
alias wget="/opt/homebrew/bin/wget"
else
echo "❌ 未安装wget! " && exit 1
fi
fi

# 网络连通检测
function NetCheck {
local count="${1:-1}" # 默认检测次数为1次
local timeout="${2:-1}" # 默认超时时间为1秒
local host="${3:-"223.5.5.5"}" # 默认检测host为阿里DNS

if [ -z "$host" ]; then
host="223.5.5.5"
fi

# 使用ping测试连接,指定超时时间并将结果重定向到/dev/null
if ping -c "${count}" -W "${timeout}" "${host}" >/dev/null 2>&1; then
# echo "网络连通: $host 可达"
return 0
else
# echo "网络不可达: $host"
return 1
fi
}

if ! NetCheck "$@"; then
echo "❌ 网络连通异常"
exit 1
else
echo "✅ 网络连通正常"
fi

user=$(whoami)
Dest_1="/Users/${user}/Library/Application Support/Surge/Profiles/sgmodule"
Dest_2="/Users/${user}/Library/Group Containers/xxxxx/Library/Application Support/duck/Volumes.noindex/Dropbox/应用/Surge Profiles/sgmodule"

# 要下载的URL列表
urls=(
"http://script.hub/file/_start_/https://raw.githubusercontent.com/89996462/Quantumult-X/main/ycdz/bdwk.js/_end_/bdwk.sgmodule?n=百度文库+解锁VIP文档阅读权限&type=qx-rewrite&target=surge-module"
"https://raw.githubusercontent.com/Rabbit-Spec/Surge/Master/Module/Spec/Bilibili-Login/Moore/Bilibili-Login.sgmodule"
)

function download_background {
url="$1"
filename=$(basename "${url}")

if [[ "$url" == *'?'* ]]; then
filename=$(basename "${url%%\?*}") # 去掉参数对名称的影响.
# echo "⚠️ 链接中存在参数,开始去除"
# url="${url%%\?*}" # url=$(echo "$url" | sed 's/\?.*//')
fi

remote_file_size=$(wget --header="User-Agent: Surge" --spider "${url}" 2>&1 | grep -oE '长度:[0-9]+' | awk -F ':' '{print $2}') # 根据实际情况修改grep过滤,例如: 'Length'

if [ -s "${filename}" ]; then
local_file_size=$(wc -c < "${filename}")
if [ -n "$remote_file_size" ] && [ -n "$local_file_size" ] && [ "$remote_file_size" -eq "$local_file_size" ]; then
echo "⚙️ ${filename} 文件大小相同"
return 0
fi
fi

wget -q --background "$url" -O "${filename}" --header="User-Agent: Surge"

}

success=true
error_message=""
echo "⚙️ 开始后台下载."

# 批量下载并确保成功
for url in "${urls[@]}"; do
cd "${Dest_1}" || exit 1
find . -name ".DS_Store" -type f -delete &
download_background "$url"
done

# 等待所有下载完成
while pgrep -x wget > /dev/null; do
sleep 1
done
files=$(ls)

# 遍历每个文件和目录
for file in $files; do
# 使用if语句判断文件是否存在且大小不为零
if [ ! -s "$file" ]; then
success=false
error_message+="\n⚠️ ${file} 文件下载失败!"
fi
done

if $success; then
echo "✅所有文件下载成功"
find . -name ".DS_Store" -type f -delete
rsync --size-only -r --delete --progress "${Dest_1}/" "${Dest_2}"
echo "✅文件夹同步完成"
read -r -t 5 -n 1 || true
else
echo "$(date)${error_message}" > file_error.log
echo '❌ 存在文件下载失败,请检查file_error.log!'
echo '❌ 已停止文件夹同步!'
read -r -t 10 -n 1 || true
fi

貌似旧版中的bash代码有些小bug,懒的改了,在新版已修复.

旧版解决方案:

自动更新代码

下面用bash脚本写的.主要在Mac上的bash跑,如果要linux跑,那么请注意,有些命令语法和linux不一样,请自行修改(我懒的改了)

这里主要给小白解释一下.

Dest_1 是Mac本地surge的模块路径地址 Dest_2 是本地映射的dropbox路径地址

urls 是个数组用来保存你上面弄的模块链接,按照我这种格式添加url就行了.

基本上要改的就这3个地方: Dest_1 Dest_2 urls

如果下载有问题那么 Dest_1 路径下有file_error.log日志文件,可以看看是哪个文件出错了,对应修复即可.

如果Mac端surge模块中安装并启用了QX重写&规则集转化这个模块,那么下面脚本也能处理qx结尾的文件.

浅浅说一下这个脚本功能吧.

批量下载urls数组中的链接到Dest_1路径下,期间遇到链接有?参数的,直接删除参数,遇到非sgmodule结尾自动处理成sgmodule,有文件下载失败会记录日志文件.如果下载都没问题就会同步到Dest_2路径下.

已知特性: 由于通过qx转换的模块文件中的name内容经过替换,故无法通过文件大小来判断是否为最新版,也就是说每次运行这个脚本,qx转换的模块文件必定会进行下载替换.

⚠️注意: 请确保你系统中已安装wget,命令查询where wget,如果没有,请用brew进行安装.安装好后.将下面wget替换为你wget的实际路径(例如:/opt/homebrew/bin/wget). 不用,我写了判断了.

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
#!/bin/bash

# 错误处理函数
handle_error() {
echo ""
echo '⚠️ 脚本发生错误!,请手动检查错误,2分钟后退出...'
[[ "$(uname)" == "Darwin" ]] && osascript -e 'display notification "模块同步脚本" with title "⚠️脚本发生错误❌~" sound name "Glass"'
sleep 120
exit 1
}

# 设置错误处理函数
trap handle_error ERR

# 检查系统是否存在wget命令
if ! command -v wget &> /dev/null; then
# 检查Homebrew安装的wget是否存在
if [ -f "/opt/homebrew/bin/wget" ]; then
wget="/opt/homebrew/bin/wget"
else
echo "❌ 未安装wget" && exit 1
fi
fi

user=$(whoami)
Dest_1="/Users/${user}/Library/Application Support/Surge/Profiles/sgmodule"
Dest_2="/Users/${user}/Library/Group Containers/xxxxx/Library/Application Support/duck/Volumes.noindex/Dropbox/应用/Surge Profiles/sgmodule"
# 要下载的URL列表
urls=(
"https://raw.githubusercontent.com/89996462/Quantumult-X/main/ycdz/bdwk.jsqx"
"https://raw.githubusercontent.com/Rabbit-Spec/Surge/Master/Module/Spec/Bilibili-Login/Moore/Bilibili-Login.sgmodule"
)

# 下载并处理文件名函数函数,将wget放入后台运行并等待下载完成
function download_background {
url="$1"
filename=$(basename "${url}")

if [[ "$url" == *'?'* ]]; then
echo "⚠️ 链接中存在参数,开始去除"
url="${url%%\?*}" # url=$(echo "$url" | sed 's/\?.*//')
fi

remote_file_size=$(wget --header="User-Agent: Surge" --spider "${url}" 2>&1 | grep -oE '长度:[0-9]+' | awk -F ':' '{print $2}') # 'Length'

if [ -s "${filename}.sgmodule" ]; then
local_file_size=$(wc -c < "${filename}.sgmodule")
if [ -n "$remote_file_size" ] && [ -n "$local_file_size" ] && [ "$remote_file_size" -eq "$local_file_size" ]; then
echo "⚙️ ${filename}.sgmodule 文件大小相同"
return 0
fi
fi
if [ -s "${filename}" ]; then
local_file_size=$(wc -c < "${filename}")
if [ -n "$remote_file_size" ] && [ -n "$local_file_size" ] && [ "$remote_file_size" -eq "$local_file_size" ]; then
echo "⚙️ ${filename} 文件大小相同"
return 0
fi
fi

if [[ "$url" == *".jsqx" ]]; then
# filename=$(curl -s "${url/qx/}" | grep -o ':.*' | sed 's/://' | head -n 1)
wget -q "$url" -O "${filename}.sgmodule" --header="User-Agent: Surge"
function_name=$(curl -s "${url/qx/}" | grep -o ':.*' | sed 's/://' | head -n 1)
# 读取文件并替换内容
sed -i '' -E 's/^#\!name=.*$/'"#\!name=${function_name}"'/' "${filename}.sgmodule"
# 如果不是macOS,就不用加上'',这是macos中sed命令的特性
elif [[ "$url" != *".sgmodule" ]]; then
wget -q --background "$url" -O "${filename}.sgmodule" --header="User-Agent: Surge"
else
wget -q --background "$url" -O "${filename}" --header="User-Agent: Surge"
fi

}

success=true
error_message=""
echo "⚙️ 开始后台下载."

# 批量下载并确保成功
for url in "${urls[@]}"; do
cd "${Dest_1}" || exit 1
download_background "$url"
done

# 等待所有下载完成
while pgrep -x wget > /dev/null; do
sleep 1
done
files=$(ls)

# 遍历每个文件和目录
for file in $files; do
# 使用if语句判断文件是否存在且大小不为零
if [ ! -s "$file" ]; then
success=false
error_message+="\n⚠️ ${file} 文件下载失败!"
fi
done

if $success; then
echo "✅所有文件下载成功"
rsync --size-only -r --delete --progress "$Dest_1/" "$Dest_2"
echo "✅文件夹同步完成"
else
echo "$(date)${error_message}" > file_error.log
echo '❌ 有文件下载失败,请检查file_error.log!'
echo '❌ 已停止文件夹同步!'
fi

如何使用代码

将上面代码保存到文件,文件名(你可以自己取)为 一键更新模块.sh

cd到这个文件的目录下,然后赋权 chmod 777 ./一键更新模块.sh

然后bash ./一键更新模块.sh测试一下效果,没问题就可以接下添加定时启动了

输入命令crontab -e添加内容

1
2
10 1 * * */7 /opt/homebrew/bin/bash ~/Library/Application\ Support/Surge/Profiles/一键更新模块.sh
# 如果没有/opt/homebrew/bin/bash,可换成bash

意思是 每7天 1点10分 会运行这个脚本

关于crontab时间计算,可以访问 https://tool.lu/crontab/ 来在线计算.

为Arch Linux配置邮件服务

作者 LanYun
2023年7月25日 16:18

前言

本文依托 自编译 NutClient-ESXI, 更改邮件逻辑为 J4125 软路由 ESXI 中群晖提供 UPS 服务 文章内容而写.

安装

1
pacman -S s-nail

配置

SMTP

发信

1
vim /etc/mail.rc

在文件最后添加内容

1
2
3
4
5
6
set v15-compat
set from="xx@xxx" # 发信邮箱
set smtp-auth=login
set mta=smtps://用户名:密码@smtp服务器
set ttycharset=utf-8
set charset-8bit=utf-8

例如以QQ邮箱为例:

set mta=smtps://QQ%40qq.com:授权码@smtp.qq.com:465

IMAP

收信

注: 可不用配置,因为作为命令行Linux,一般是不需要收信服务的

1
2
3
set imap-keepalive=240
set imap-cache=~/.imap_cache
set inbox="imaps://用户名:密码@imap服务器"

自编译NutClient-ESXI,更改邮件逻辑

作者 LanYun
2023年7月25日 15:39

前言

这个 NutClient-ESXi 项目中邮件发送相关功能对我而言不可用,故打算自己对项目进行修改,然后编译.

目前修改后的效果: 若有UPS事件,能够正常地向指定邮箱发送通知及事件内容.

注: 本文是为本博客中 为 J4125 软路由 ESXI 中群晖提供 UPS 服务 的文章服务的.故不会详细解释NutClient-ESXI相关内容.

本文中邮件发送操作是通过SSH到服务器来进行代理操作的,请确保ESXI中存在linux虚拟机或你有台linux服务器.

若你遇到ESXI SSH某些问题,请参阅本博客中关于 解决 ESXI 和群晖使用 SSH 密钥登录问题 的文章.

若你服务器未配置相关邮件相关服务,请参阅本博客中关于 为 Arch Linux 配置邮件服务 的文章.

本文编译设备: Linux LanYunArch 6.4.4-arch1-1 x86_64 GNU/Linux

因为glibc编译失败,所以拉取的是docker centos7

文本内容可能花费时间较长(取决于你设备性能,单线程编译取决于单核性能),建议可以泡杯咖啡☕️来等待.

本文会编译旧版GCC和MAKE用于编译glibc-2.17,因为ESXI最高只支持glibc-2.17(比较老,故作者推荐centos7进行编译)

如何查看GLIBC支持的版本? linux:strings /lib64/libc.so.6 | grep GLIBC_

由于ESXI不支持strins命令,故你需要SFTP拉到本地来看看👀.

⚠️若你ESXI运行在架构为x86_64的CPU上,请勿用ARM架构进行编译,

极速模式(推荐)

人群能力建议: 有手有🧠,会Google等基本素质

难度: 无

前提: 已阅读前言中提到的所有文章

此模式用到: docker

用到本人fork的项目: NutClient-ESXi

1
2
3
4
5
6
7
8
9
10
# 运行docker命令之前,请确保docker或OrbStack在运行
# -v 后面是我本机的映射路径
docker run -i -t --privileged -v /Users/lanyun/Downloads:/share --platform linux/amd64 centos:7 bash # 此docker命令仅供参考,反正x86架构centos 7就行.
su # 切换到root用户
cd ~ # 进入到root目录,啥目录请随意,这里我实际上进入到/share,因为方便我导出文件
yum install -y git
git clone https://github.com/LanYunDev/NutClient-ESXi.git
cd NutClient-ESXi
bash ./一键编译.sh
# 编译完后,用cp命令将需要的文件复制出来,参考上面映射的路径

注: 你甚至只需要运行一个一键编译.sh文件,即可完成编译.

低速模式

人群能力建议: 会复制粘贴

难度: 低

安装软件包

请根据不同的系统的软件包管理器来安装必须的软件包.

1
2
3
apt install wget patch gcc zip make tar file git # ubuntu,Debian等
yum install -y wget patch gcc zip make tar file git # CentOS
pacman -S wget patch gcc zip make tar file git # arch Linux

修改项目内容

请确定你要远程SSH进行执行的代码.

例如ssh -T root@IP地址 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 22 "mail -s 'UPS 事件 on ${HOSTNAME}' xx@lanyundev.com"

1
2
3
4
5
6
7
8
9
10
11
git clone https://github.com/rgc2000/NutClient-ESXi.git # 拉取项目
cd NutClient-ESXi
sed -i -e "s/payload: nut-bin smtptools-bin/payload: nut-bin/g;s/shell uname -i/shell uname -m/g; /smtp/s/^[^#]/#&/" "Makefile"
sed -i -e "s#tar -xf nut-\$(NUT_VERSION).tar.gz#&\
; sed -i -e \"s/on line power/已连接电源/g;s/UPS %s on battery/UPS %s 正使用电池供电/g;s/UPS %s battery is low/UPS %s 电池电量低/g;s/UPS %s: forced shutdown in progress/UPS %s: 正在进行强制关机/g;s/Communications with UPS %s established/已建立与 UPS %s 的通信/g;s/Communications with UPS %s lost/与 UPS %s 的通信丢失/g;s/Auto logout and shutdown proceeding/自动注销并进行关机/g;s/UPS %s battery needs to be replaced/UPS %s 需要更换电池/g;s/UPS %s is unavailable/UPS %s 不可用/g;s/upsmon parent process died - shutdown impossible/upsmon 父进程已停止 - 无法进行关机/g;s/UPS %s: calibration in progress/UPS %s:正在进行校准/g\" \"./nut-\$(NUT_VERSION)/clients/upsmon.h\"#" 'Makefile'
rm -rf ./patches/smtptools*
# ⚠️注意:请替换下面代码中的执行代码部分,请根据自己需要进行修改
# 如果觉得命令行麻烦,可以手动到路径中修改文件: ./skeleton/opt/nut/bin/notify.sh
# 也可通过vim进行修改 vim ./skeleton/opt/nut/bin/notify.sh
# 也可以看我fork项目中给出示例notify.sh文件,进行参考修改.
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#ssh -T root@IP地址 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 22 "mail -s '\''UPS 事件 on ${HOSTNAME}'\'' xx@lanyundev.com"#' "./skeleton/opt/nut/bin/notify.sh" || sed -i -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#ssh -T root@IP地址 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 22 "mail -s '\''UPS 事件 on ${HOSTNAME}'\'' xx@lanyundev.com"#' "./skeleton/opt/nut/bin/notify.sh"

配置编译环境

Docker(推荐)

推荐用docker,因为我用最新arch Linux整编译环境,搞了几天都没整起(大部分在摸鱼,等编译结果,报错再改,改了报错又改,进入了无底洞的时间循环♻️).

废话不多说,直接上命令.

1
2
3
# 运行docker命令之前,请确保docker或OrbStack在运行
# -v 后面是我本机的路径映射到
docker run -i -t --privileged -v /Users/lanyun/Downloads:/share --platform linux/amd64 centos:7 bash

最新Linux(不推荐)

这里不写,看复杂模式.

开始编译

1
make # 注意,经过实测,并不支持多线程编译

编译完成后,目录下的 upsmon-xxx.vib upsmon-update.sh upsmon-remove.sh upsmon-install.sh 就是我们所需要的文件了!

复杂模式(不推荐)

人群能力建议: 极客

难度: 中

编译GCC-9

由于arch Linux(默认make版本为4.4.1 gcc版本为13.1.1)的yay里面有GCC-9,故我直接用yay编译,方便.

1
2
3
4
5
6
7
8
9
10
11
12
pacman -S base-devel
su - lanyun # 注:lanyun是我普通用户的用户名,makepkg安装需非root用户
cd ~
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
echo $(nproc) # 看看多少核心
vim /etc/makepkg.conf # 进去搜MAKEFLAGS,改MAKEFLAGS="-j10" 这里10是因为上条命令得到的是10核心
yay -Ss gcc # 搜索 gcc,看看有没有需要版本
yay -S gcc9 # 编译完后按y确认安装,之后可用gcc-9来调用.不需要可用yay -Rs gcc9来删除
sudo su # 切换回root用户

编译MAKE-3.82

只能源码编译,别问,问就是特性.

如果编译出错,别问,问就是特性.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 用gcc-9编译
export CC=/usr/bin/gcc-9
wget ftp://ftp.gnu.org/gnu/make/make-3.82.tar.gz # 如果下载失败,可用下面我提供的链接.
tar xvf make-3.82.tar.gz && rm make-3.82.tar.gz
cd make-3.82
sed -i 's/#if !defined __alloca \&\& !defined __GNU_LIBRARY__/#if !defined __alloca \&\& defined __GNU_LIBRARY__/g; s/#ifndef __GNU_LIBRARY__/#ifdef __GNU_LIBRARY__/g' "./glob/glob.c"
./configure --prefix=/opt/make-3.82 && sh build.sh
make -j$(nproc) && make install
cd ~
ln /opt/make-3.82/bin/make /usr/bin/make-3.82
rm -rf make-3.82
# 之后可以直接用 make-3.82
# 如果要卸载,运行命令rm -rf /root/make_3.82 && rm -f /usr/bin/make-3.82

指定编译的GLIBC

如果编译出错,别问,问就是特性.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 指定特定版本的 gcc
export CC=/usr/bin/gcc-9
# 指定特定版本的 make
#export MAKE_HOME=/root/make_3.82
export PATH=/opt/make-3.82/bin:$PATH
export MAKE=/opt/make-3.82/bin/make #/usr/bin/make-3.82

cd ~ # 确保路径在/root下,否则请修改后面的命令.
wget https://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.xz
tar -xJf glibc-2.17.tar.xz && rm -f glibc-2.17.tar.xz

mkdir -p build/glibc-build
cd build/glibc-build

/root/glibc-2.17/configure CFLAGS="-fno-builtin-strlen -ggdb -O2" FEATURES="preserve-libs nostrip splitdebug" --prefix=/root/build/glibc-build

make # 多线程实测有问题.
#make -j$(nproc)
# make install

本文中有关文件链接:

make-3.82.tar.gz glibc-2.17.tar.xz

废弃代码(不再使用),垃圾代码,慎用(=别用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sed -i -e "s/payload: nut-bin smtptools-bin/payload: nut-bin/g;s/shell uname -i/shell uname -m/g; /smtp/s/^[^#]/#&/; s/LDFLAGS=\"-lrt -lpthread\"/LDFLAGS=\"-lrt -lpthread -static-libstdc++\"/" "Makefile"
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e "s/uname -i/uname -m/g" "./script/mkvib.sh" || sed -i -e "s/uname -i/uname -m/g" "./script/mkvib.sh"
echo "添加-static-libstdc++选项"
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#替换我#' "./skeleton/opt/nut/bin/notify.sh" || sed -i -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#替换我#' "./skeleton/opt/nut/bin/notify.sh"
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e "s/on line power/已连接电源/g;" "./$nut_version/clients/upsmon.h" ||
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e "s/payload: nut-bin smtptools-bin/payload: nut-bin/g;s/shell uname -i/shell uname -m/g; /smtp/s/^[^#]/#&/" "Makefile" ||
nut_version=$(basename patches/nut-* | sed 's/-esxi.*$//')
sed -i -e "$(grep -n "tar -xf nut-\$(NUT_VERSION).tar.gz" "Makefile" | cut -d ':' -f 1)a\\
sed -i -e \"s/on line power/已连接电源/g;s/UPS %s on battery/UPS %s 正使用电池供电/g;s/UPS %s battery is low/UPS %s 电池电量低/g;s/UPS %s: forced shutdown in progress/UPS %s: 正在进行强制关机/g;s/Communications with UPS %s established/已建立与 UPS %s 的通信/g;s/Communications with UPS %s lost/与 UPS %s 的通信丢失/g;s/Auto logout and shutdown proceeding/自动注销并进行关机/g;s/UPS %s battery needs to be replaced/UPS %s 需要更换电池/g;s/UPS %s is unavailable/UPS %s 不可用/g;s/upsmon parent process died - shutdown impossible/upsmon 父进程已停止 - 无法进行关机/g;s/UPS %s: calibration in progress/UPS %s:正在进行校准/g\" \"./\$(NUT_VERSION)/clients/upsmon.h\"" 'Makefile'

#sed -i 's/# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION/# if _GNU_GLOB_INTERFACE_VERSION >= GLOB_INTERFACE_VERSION/' ./glob/glob.c
#sed -i '211s/^/\/\/ /; 232s/^/\/\/ /' ./glob/glob.c
#sed -i 's/struct rlimit stack_limit;/extern struct rlimit stack_limit;/' ./make.h
#echo "#include \"make.h\"\n\nstruct rlimit stack_limit;" > make.c
#./configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu --prefix=/root/make_3.82 && sh build.sh
export CFLAGS="-g -O2 -march=i486"
echo "跳过MAKE检测" && [[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's/critic_missing="\$critic_missing make"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure" || sed -i -e 's/critic_missing="\$critic_missing make"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure"
echo "跳过GCC检测" && [[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's/critic_missing="\$critic_missing gcc"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure" || sed -i -e 's/critic_missing="\$critic_missing gcc"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure"

CFLAGS="-g -O2 -fno-builtin-strlen" FEATURES="preserve-libs nostrip splitdebug" --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu
make CFLAGS="-m64" LDFLAGS="-m64"

解决ESXI和群晖使用SSH密钥登录问题

作者 LanYun
2023年7月25日 00:10

前言

本文依托 为 J4125 软路由 ESXI 中群晖提供 UPS 服务 文章内容而写.

由于ESXI是一个精简的嵌入式系统,不存在某些命令,这导致我某些定时自动化操作脚本不能正常工作,故打算通过SSH进行代理运行,这样保证了ESXI环境的纯净.但在实际操作中遇到了SSH登录相关问题.下面是解决SSH登录问题一些必要的操作.

关于群晖?纯纯顺带说一下罢了,因为这玩意限制小,不用细说.直接看生成密钥对这一部分即可.

已知问题(未能解决或懒得解决):

①ESXI SSH出站端口只能为22 (貌似可以通过改文件解决.但算了,将就用了,我在OpenWrt中防火墙做好了防护,反正外网打不进来,内网又不可能打.)

②无法更新known_hosts相关.报错内容如下. (加入选项 -o StrictHostKeyChecking=no -o Us erKnownHostsFile=/dev/null可以只提示一个Warning,说known_hosts被永久添加,不会更新.)

1
2
hostfile_replace_entries: link /.ssh/known_hosts to /.ssh/known_hosts.old: Function not implemented
update_known_hosts: hostfile_replace_entries failed for /.ssh/known_hosts: Function not implemented

防火墙配置

在 网络 -> 防火墙规则 中,找到SSH客户端,然后把它启用.

image-20230725001751391

启动服务

在 主机 -> 管理 -> 服务中,启动TSM-SSH服务并设置自启动.

image-20230725002146663

用ESXI已有密钥对

获取公钥:cat /etc/ssh/ssh_host_rsa_key.pub

然后附加到你服务器的~/.ssh/authorized_keys文件中

登陆服务器带上参数-i /etc/ssh/ssh_host_rsa_key就行了

例如: ssh root@服务器IP -i /etc/ssh/ssh_host_rsa_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 22

弃用:生成密钥对

存在致命BUG: 重启后,目录/.ssh/直接给爷整无了.😅

文件路径: /usr/lib/vmware/openssh/bin/ssh-keygen

image-20230725002421187

终端输入命令: /usr/lib/vmware/openssh/bin/ssh-keygen -t rsa -b 4096

然后一路回车即可.

然后命令: cat /.ssh/id_rsa.pub

将内容复制,然后附加到需要登录的服务器的~/.ssh/authorized_keys文件中.

为J4125软路由ESXI中群晖提供UPS服务

作者 LanYun
2023年7月24日 17:49

前言

由于家里时不时停电,导致群晖里面机械硬盘出现莫名其妙的问题,回家之后整了一个UPS(施耐德APC BK650M2-CH 390W),到货后就开始着手配置,最终实现:UPS电量不足时,ESXI中所有虚拟机安全关机,最后关闭ESXI,即软路由关机.

本文设备: J4125 软路由 4 CPUs x Intel(R) Celeron(R) J4125 CPU @ 2.00GHz

ESXI系统版本: 7.0 Update 3

群晖版本: DSM 7.1-42661 Update 4

USB信息: Celeron/Pentium Silver Processor USB 3.0 xHCI Controller

供应商名称: Intel Corporation

ID: 0000:00:15.0 设备 ID: 0x31a8 供应商 ID: 0x8086 功能: 0x0 总线: 0x0

类 ID: 0xc03 子设备 ID: 0x7270 子供应商 ID: 0x8086 插槽: 0x15

image-20230724180133808

上面照片是我强制直通之后的,因为我这个版本ESXI不兼容这个USB控制器(没驱动).

若你的信息与本文不符,可参考本文内容.

直通USB控制器

注: 若你的ESXI设备能正常识别USB控制器,即插上UPS数据线,你的ESXI能识别出UPS设备(可在添加USB设备界面查看)

获取USB控制器相关信息.

上图可知.供应商ID、设备ID以及类ID分别为 0x8086 0x31a8 0xc03

开启ESXI的SSH功能

开启Secure Shell (SSH)

image-20230724180431939

添加直通代码

1
2
ssh root@xxx # xxx为你ESXI主机的ip地址
vi /etc/vmware/passthru.map

G,即”shift+g”,跳到文本的最后一个字符,然后按i进入编辑模式,按回车键来换行,然后输入下面内容

1
2
# Celeron/Pentium Silver Processor USB 3.0 xHCI Controller
8086 31a8 d3d0 default

其中8086是供应商ID 31a8是设备ID d3d0和default固定值

然后保存退出(esc :wq),并重启启动ESXI(reboot)

配置USB控制器

去管理,硬件,PCI设备中将usb控制器切换为直通.

然后在群晖虚拟机中添加PCI设备.

image-20230724181251996

注意: cpu这3项需要关闭image-20230724181308301

内存需设置为 全部锁定

配置好后,重启ESXI,然后启动群晖.就能在群晖中配置UPS了!

image-20230724205644227

在常规里面

image-20230730235417493

配置NutClient-ESXi

NutClient-ESXi 可以获取群晖所连接UPS的信息.

首先,将 ESXi 的 IP 添加到允许的 DiskStation 设备中(可参考上图).

接下来开始配置NutClient-ESXi.

下载代码并安装

下面代码运行环境为ESXI中的SHELL

1
2
esxcli software acceptance set --level=CommunitySupported
cd /tmp

下面分3种情况

①ESXI不能科学上网

访问此人博客https://rene.margar.fr/2012/05/client-nut-pour-esxi-5-0/

下载NutClient-ESXi (binaires)并解压

将解压后的文件通过SFTP传输到ESXI主机/tmp目录下

然后运行命令sh upsmon-install.sh && /etc/init.d/hostd restart

注: 若你安装过,且安装版本低于即将安装的,~~~~请用命令sh upsmon-update.sh,否则先卸载sh upsmon-remove.sh再安装.

②ESXI能够科学上网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
wget 'https://rene.margar.fr/download/1483/?tmstv=1690200590' \
--header='Accept: */*' \
--header='Accept-Language: zh-CN,zh;q=0.9' \
--header='Cache-Control: no-store, no-cache, no-transform, max-age=0' \
--header='Connection: keep-alive' \
--header='DNT: 1' \
--header='Host: rene.margar.fr' \
--header='Pragma: no-cache' \
--header='Referer: https://rene.margar.fr/2012/05/client-nut-pour-esxi-5-0/' \
--header='Sec-Fetch-Dest: empty' \
--header='Sec-Fetch-Mode: cors' \
--header='Sec-Fetch-Site: same-origin' \
--user-agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' \
--header='dlm-xhr-request: dlm_XMLHttpRequest' \
--header='sec-ch-ua: "Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"' \
--header='sec-ch-ua-mobile: ?0' \
--header='sec-ch-ua-platform: "macOS"' \
--output-document=NutClient-ESXi.tar.gz
tar -xzvf NutClient-ESXi.tar.gz
sh upsmon-install.sh
/etc/init.d/hostd restart

③自编译并提供邮件发送支持

请参阅本博客中 自编译 NutClient-ESXI, 更改邮件逻辑 文章

本文不再赘述.

配置服务

通过 GUI 登录 ESXi,然后转到 管理 -> 系统 -> 高级设置,然后查找UserVars.nut并更新等待设置的值

image-20230725184133362

UserVars.NutUpsName:ups@IP地址(此IP地址填群晖的地址)

UserVars.NutUser:monuser

UserVars.NutPassword:secret

1
2
3
4
5
6
7
8
UserVars.NutFinalDelay NUT 在发生低电量事件后等待几秒钟才关闭
UserVars.NutMailTo NUT 向此地址发送邮件通知
UserVars. NutMinSupplies NUT 维持系统运行所需的电源数量
UserVars. NutOnBattery Delay NUT 关机前电池电量不足时的运行秒数(0= 等待电池电量不足事件发生)
UserVars.NutPassword NUT 连接远程 ups 的密码
UserVars.NutSendMail NUT 发送邮件通知(1=是 0=否)
UserVars. NutUpsName NUT 远程 ups 名称(例如:upsname@nutserver),多个 ups 使用空格作为分隔符
UserVars.NutUser 连接远程 ups 的 NUT 用户名

配置完成后,转到 服务 并查找nutclient,找到列出的服务.启动它并设置它与主机一起启动/停止

注: 每次修改UserVars参数后都要重启NutClient服务才能生效

配置防火墙

如图所示,启动并设置自启动.

image-20230725184904330

1
esxcli network firewall ruleset list | grep NutServer # 如果结果为true,则运行正常

验证连接

命令:

1
/opt/nut/bin/upsc ups@IP地址

得到:

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
/opt/nut/bin/upsc ups@IP地址
battery.charge: 100
battery.charge.low: 91
battery.mfr.date: 2001/01/01
battery.runtime: 3618
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 13.6
battery.voltage.nominal: 12.0
device.mfr: American Power Conversion
device.model: Back-UPS BK650M2-CH
device.serial: 9B2321A02442
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 5
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: DSM7-1-42464-211216
driver.version.data: APC HID 0.96
driver.version.internal: 0.41
input.sensitivity: low
input.transfer.high: 278
input.transfer.low: 160
input.transfer.reason: input voltage out of range
input.voltage: 232.0
input.voltage.nominal: 220
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: 294803G -292804G
ups.load: 7
ups.mfr: American Power Conversion
ups.mfr.date: 2023/05/22
ups.model: Back-UPS BK650M2-CH
ups.productid: 0002
ups.realpower.nominal: 390
ups.serial: 9B2321A02442
ups.status: OL
ups.test.result: Done and passed
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d

已知BUG: 部分信息不准确.以及部分信息存在错误.

其中最不能接受的是: battery.charge.low.故建议重写notify.sh文件,参考博客文章 自编译 NutClient-ESXI, 更改邮件逻辑 或者我fork项目 NutClient-ESXi

测试

建议:直接看结论,下面内容又丑又长

实测用群晖NAS能够关闭ups,首先达到battery.charge.low的低电量会发FSD信号,

群晖NAS会进入待机模式,大约等待180秒左右(3分钟)关闭UPS电源(关机逻辑很迷.).故我们可根据这个时间为基准来通过不断实测调整NutFinalDelay值,从而达到在ups关机之前,esxi能安全关机,而不是直接断电.为了达到这个目标,下面是测试记录,测试应进行多次,数据应多次记录,并取平均值,如果出现某些数据差异过大,可采用加权之类操作(默认都会概率论.)

① 在ups电量🔋处于设定的低电量🪫之下时,给ups断开市电⚡️的同时,开始计时⌛️,得到数据📊:xxx..等

② 通过等待⌛️ups电量🔋低于设定的低电量🪫之下时,开始计时⌛️,得到数据📊:xxx..等

综合数据,并不断调整.下面是举例

NutFinalDelay值为170

91->89 耗时85s 群晖不可访问

结束00:01:28总耗时213秒 -> 开始计时(即UPS断电)时间23:57:55 耗时85秒 -> 群晖不可访问模式开始时间23:59:22 耗时128秒 -> UPS断电时间 00:01:28

ESXI在23:58:27同时收到SHUTDOWN和FSD信号 在23:58:22时收到LOWBATT信号 在23:56:00时收到ONBATT信号

测试结果: UPS关机,ESXI未预期关机,NutFinalDelay应小于181,但实际已小于,故该实验数据标记为?

NutFinalDelay值为160 2分40秒

00:32:33 电量为91 00:35:10 丢失群晖ups连接 00:37:21 发生未预期断电,即ESXI未安全关机. 第一阶段2分37秒 第二阶段2分11秒

00:35:? 收到群晖GMAIL邮件 (推测,貌似发这个邮件,代表已向UPS发送关机信号.)

00:52:19 丢失群晖ups连接 00:53:27 UPS关机 耗时1分8秒 NutFinalDelay值调整为100,再次实验.

00:54:31 UPS电量达到91触发低电量 00:55:13 收到群晖邮件 00:55:57 丢失群晖ups连接

结果: esxi达到预期关机效果,ups也关机. 但缺陷是:esxi关机后,ups等待较长时间才会关机,故当esxi关机后,ups在未关机之前,市电恢复供应,那么ups将不会关机,由于ups电源未断过,软路由主板并不会自动开机,这种情况只能改进,无法完善解决(除非你是正版群晖,而不是软路由),因为我们设备并不支持ups,我的建议是调整NutFinalDelay值,直到能将时间差缩短至30秒内(增加时间,减少误差,因为轮训需要时间,而每时每刻这个时机都不一样)

继续实验,NutFinalDelay值调整为120,结果发生非预期事件,esxi安全关机,但ups未关机.但已收到群晖邮件提示,根据观察,ESXI貌似比上一次更快地关机,初步判断为群晖未来得及向ups发送关机指令而被esxi关闭.NutFinalDelay值调整为155并重启NutClient服务,再次实验.

结果: 发生非预期事件,esxi未安全关机,ups关机,NutFinalDelay值调整为140并重启NutClient服务,再次实验.

结果: esxi达到预期安全关机效果,ups也关机.时间差约为8秒符合预期,因未对数据进行更详细记录,再次进行更准确实验.

软路由完全关机到ups断电时间间隔约为10秒.esxi发出关机指令到软路由完全关机用时约23秒,从群晖ups连接断开到esxi发出关机指令用时约95秒.

结果: esxi达到预期安全关机效果,ups也关机.

时间差符合预期,故将NutFinalDelay值调整为148并重启NutClient服务,进行最后一次准确实验,若符合预期则采用该值.

从esxi发出关机指令到ups断电用时约33秒,软路由在关机过程中,ups断电导致未完全关机.

结果: 发生非预期事件,esxi未安全关机,ups关机,NutFinalDelay值调整为143并重启NutClient服务,再次实验.

实验: 在ups电量在低于91的情况下,切断市电并开始计时,用命令行每秒时刻监控群晖ups连接情况,用网页监控esxi发生关机

看计时器可以知道经过2分57秒软路由完全关机 esxi发送关机指令, 翻命令日志开始计算: 06:11:38 UTC丢失群晖ups连接.

06:11:54 UTC对应计时为02:23.76 ESXI发送关机指令时间为 14:12:04 CST.我们可以得到:

断开ups电源到丢失群晖ups连接用时约为127秒 丢失群晖ups连接到ESXI发送关机指令用时约为26秒

易得 断开ups电源到ESXI发送关机指令用时约为153秒,根据我们NutFinalDelay值143可得10秒差.

结果: 发生非预期事件,esxi安全关机,ups未关机,但恢复市电也会重启电源,故软路由也会启动.尝试将NutFinalDelay值调整为145并重启NutClient服务,再次实验.但本次实验采用冷测试,不采用命令监控,网页监控等,模拟真实情况,仅仅做软路由断电时间与ups断电时间记录.由于ups电量未恢复到安全电量之上,故将等待ups电量恢复,当恢复到91以上时,进行断开市电操作.

结果: 应该没问题,误差1秒,故决定将NutFinalDelay值设置为144秒

经过实际测试,发现即使ups恢复市电,esxi和ups也会关机,但ups会重启供电(又测试了一次,不会),故上面提到的缺陷可能不存在.

当NutFinalDelay值设置好后,存在的缺陷是若在esxi未关机之前恢复供电,群晖会重启,但esxi延迟关机缺不会中止,甚至群晖还没来得及启动成功,esxi就关机了.解决办法: 在执行关机命令之前判断群晖的CPU使用是否大于300MHZ,如果大于则代表已恢复供电不进行关机,并启动已关机的虚拟机.

发现,即使ups未关机,恢复市电也会重启电源,故软路由也会重启,所以我上面哪些测试貌似多余的?👉🤡小丑竟是我自己?!(应该是我搞错了?难道是ups里面有定时关机,但还没到时间,然后恢复市电,会重启供电?不清楚,反正现在没大问题了.)

若发现某些数据与数据结果之间产生冲突,通过排查分析,原因可能有 曾安装过旧版程序未使用旧版程的vib序进行卸载,而是直接采用新版程序的vib进行升级,导致某些错误,ESXI未正常关机不会保存设置的NutFinalDelay值数据,修改数值后未能成功重启服务等. 解决并验证,使用旧版程的vib序进行卸载并重启,拉取最新版仓库代码然后编译出文件进行安装,安装后根据本文内容进行设置,设置好后,esxi进行安全关机操作,然后开机看看设置是否生效,修改文件是否成功等.如果修改NutFinalDelay值,建议刷新网页看看修改是否成功,如果重启服务,建议先关闭,再刷新网页看看关闭是否成功再启动 没问题再进行测试.

综上所示,经过多次类似记录与分析,得到基于我的设备的较为稳定且安全的数值结果:

结论

NutFinalDelay值: 144

如果你参阅了本博客中 自编译 NutClient-ESXI, 更改邮件逻辑 文章并使用了自编译的方式,那么在询问你是否(y/n)需要ESXI关机前查询群晖CPU使用情况?的时候,请输入y然后回车即可.

能够达到下面👇的效果

① 市电⚡️一直不恢复↩️

ups🔋到低电量🪫时,群晖会进入待机模式(大概过会就会发送ups延迟关机信号),esxi会(通过ssh调用命令)关闭一些不支持安全关机的设备,等待NutFinalDelay值的时间(实际上不准确,要比这个值大).然后安全关闭esxi和软路由.大概过10秒左右,ups自动关机

② 市电⚡️在群晖待机模式中恢复供电,且群晖还未向ups发送延迟关机信号

这种情况,群晖会重启,那么群晖cpu使用绝对会高于100MHz,而自编译程序中在关机前会对群晖cpu使用情况进行判断,所以将不会关机(你还可以写一些命令来启动一些被关闭的虚拟机).待群晖启动后,能给esxi upsmon提供ups信息.

③ 市电⚡️在群晖待机模式中恢复供电,且群晖已向ups发送延迟关机信号

这种情况,群晖不会重启,因为ups将会延迟关机,我们只需等待esxi和软路由安全关闭后,再等待大概10秒左右,ups将重启电源.如果你在软路由主板中设置了来电启动,那么将成功自启动.

效果预览

没有实际预览,贴几张邮件图吧(注:来自自编译的方式).

image-20230731123628356image-20230731123741233

可能用到的垃圾代码:

1
while true; do sleep 1; echo $(date);/opt/nut/bin/upsc ups@IP地址 battery.charge ;done

在arch linux上搭建rustdesk server

作者 LanYun
2023年7月22日 12:50

前言

项目: rustdesk-server 官方文档: https://rustdesk.com/docs/en/self-host/install/

之前搭建的版本太低了,而且搭建方式不能自动更新,故打算用新方法搭建.

前提:在arch Linux上正确安装yay

其他自动安装项目:rustdeskinstall

安装

1
yay -S rustdesk-server-bin

安装后程序位置:/opt/rustdesk-server

rustdesk-server-hbbs.service和rustdesk-server-hbbr.service位置:

/usr/lib/systemd/system目录下.

以后在运行命令yay -Syu更新系统时也会更新rustdesk-server-bin

旧版安装

采用pm2进行管理

先去https://github.com/rustdesk/rustdesk-server/releases下载对应系统架构的的rustdesk-server

下面是有关说明

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
hbbs - RustDesk ID注册服务器
hbbr - RustDesk 中继服务器

pm2 start hbbs -- -r <relay-server-ip[:port]>
hhbs的-r参数不是必须的,他只是方便你不用在客户端指定中继服务器,如果是默认21117端口,可以不填port。客户端指定的中继服务器优先级高于这个
pm2 start hbbr

查看log
pm2 log hbbr
pm2 log hbbs

hbbs/hbbr 在重启后自动运行:
使用您在服务器启动/重新启动时管理的进程重新启动 PM2 至关重要。要解决这个问题,只需运行此命令以生成一个活动的启动脚本:
pm2 startup
并冻结自动重生的进程列表:
pm2 save

默认情况下,hbbs 监听21115(tcp), 21116(tcp/udp), 21118(tcp),hbbr 监听21117(tcp), 21119(tcp)。务必在防火墙开启这几个端口, 请注意21116同时要开启TCP和UDP。其中21115是hbbs用作NAT类型测试,21116/UDP是hbbs用作ID注册与心跳服务,21116/TCP是hbbs用作TCP打洞与连接服务,21117是hbbr用作中继服务, 21118和21119是为了支持网页客户端。如果您不需要网页客户端(21118,21119)支持,对应端口可以不开。

TCP(21115, 21116, 21117, 21118, 21119)
UDP(21116)
如果你想选择自己的端口,使用 “-h” 选项查看帮助

同上个版本不同,本版本中的key是强制的,但是不用你自己设置。hbbs在第一次运行时,会自动产生一对加密私钥和公钥(分别位于运行目录下的id_ed25519和id_ed25519.pub文件中),其主要用途是为了通讯加密。

如果您在上一步骤中没有填写Key:(公钥文件id_ed25519.pub中的内容),不影响连接,但是连接无法加密。

cat ./id_ed25519.pub
如果您禁止没有key的用户建立非加密连接,请在运行hbbs和hbbr的时候添加-k _ 参数,例如:

./hbbs -r <relay-server-ip[:port]> -k _
./hbbr -k _
如果要更改key,请删除 id_ed25519 和 id_ed25519.pub 文件并重新启动 hbbs/hbbr,hbbs将会产生新的密钥对

更新 PM2
我们让它变得简单,版本之间没有重大变化,过程很简单:
npm install pm2@latest -g
然后更新内存中的 PM2 :
pm2 update

pm2文档: https://pm2.keymetrics.io/docs/usage/quick-start/
rustdesk文档: https://rustdesk.com/docs/zh-cn/self-host/
❌
❌