Marco Nie - other https://blog.niekun.net/category/other/ 杂文 解决在 intel 12代以后的 CPU 上 vmwre 虚拟机性能低下问题 https://blog.niekun.net/archives/intel-12-CPU-vmwre.html 2024-04-18T13:01:52+08:00 最近更换了新的电脑,是 i7 12700H 的 CPU,按理说比以前的电脑性能好一些,但是导入之前的 vmware 虚拟机后发现运行起来优点卡顿,但是观察主机资源占用很低,cpu 占用也很低,研究了下才发现是由于新款 cpu 采用了大小核设计导致这个问题。我的这一款是 6 大核 8 小核 20 线程设计。默认情况下启动虚拟机资源分配是交给 windows 主机自己协调的,很可能会分配给小核运行虚拟机导致运行卡顿,资源管理器可以看到 cpu 负载都在后面的小核上:解决方法就是以管理员权限运行 vmware,这样 VMware 会自己调度资源使用,优先级大概是大核>小核>超线程。实际效果很明显,基本都运行在了大核上: openwrt 系统升级 https://blog.niekun.net/archives/openwrt-1.html 2024-04-02T10:26:03+08:00 小版本升级小版本升级,例如 19.05-> 19.07。这种小版本的升级最方便的就是通过 Attended Sysupgrade 功能,可以保留已安装的包和系统设置。最大限度地无缝过渡。官方介绍:https://openwrt.org/docs/guide-user/installation/attended.sysupgrade需要先安装 Attended Sysupgrade luci 界面包:opkg install luci-app-attendedsysupgrade 建议使用此功能前依然做一次数据备份。然后重新登录 luci,在 system - Attended Sysupgrade 找到入口,点击 search for firmware upgrade 即可在线搜索可更新的系统。大版本升级最方便的就是通过 luci 界面升级系统,目前支持直接升级的大版本顺序是:19.07 > 21.02 > 22.03 > 23.05。大版本升级改动openwrt 21:https://openwrt.org/releases/21.02/notes-21.02.0WPA3 support included by defaultTLS and HTTPS support included by defaultLuCI is now available over HTTPSInitial DSA support replaces the swconfig systemNew network configuration syntax and board.json changeKernel with container supportopenwrt 22:https://openwrt.org/releases/22.03/notes-22.03.0Firewall4 based on nftables,superseding the iptables-based firewall3Dark mode in LuCIopenwrt 23:https://openwrt.org/releases/23.05/notes-23.05.0Switch from wolfssl to mbedtls as default,TLS 1.3 SupportRust Package Support数据备份每个版本升级实际上就是重新刷入了一次固件,所以之前的配置文件什么的基本上都会被覆盖,所以系统内修改过的配置最好做一次备份。打开 luci 界面,选择 system - backup/flash firmware,在 configuration 菜单栏中将需要保存的文件或目录定义出来,然后在 action 菜单栏中选择 backup - generate archive 即可保存备份到本地。已安装包列表可以通过 awk 脚本识别出自己手动安装的包列表,方便更新系统后安装回去,下载脚本:https://github.com/richb-hanover/OpenWrtScripts/blob/main/opkgscript.sh执行以下命令会保存已安装的包列表到 /etc/config/opkg.installed:opkgscript.sh -v write 执行以下命令会识别并安装 /etc/config/opkg.installed 列表中的包:opkgscript.sh -v install 也可以执行以下 awk 脚本可以单独列出自己手动安装的包列表:#!/usr/bin/awk -f BEGIN { ARGV[ARGC++] = "/usr/lib/opkg/status" cmd="opkg info busybox | grep '^Installed-Time: '" cmd | getline FLASH_TIME close(cmd) FLASH_TIME=substr(FLASH_TIME,17) } /^Package:/{PKG= $2} /^Installed-Time:/{ INSTALLED_TIME= $2 # Find all packages installed after FLASH_TIME if ( INSTALLED_TIME > FLASH_TIME ) { cmd="opkg whatdepends " PKG " | wc -l" cmd | getline WHATDEPENDS close(cmd) # If nothing depends on the package, it is installed by user if ( WHATDEPENDS == 3 ) print PKG } } EOF保存以上内容到 listuserpackages.awk 文件中并执行即可列出用户自行安装包列表。下载升级固件x86 版本的 openwrt 的升级固件就是全新安装时候用的固件,直接在官网下载需要版本的 gz 压缩包即可。下载地址:https://downloads.openwrt.org/releases/我下载的是:generic-ext4-combined.img.gz,注意不要解压出来,保留压缩包即可。进入 luci 的 system - backup/flash firmware 选择 Flash image ,然后选择刚才下载的压缩包即可上传更新,会提示是否保留设置和配置,跨大版本的升级必须取消选择保留数据,否则可能升级失败:如果升级后卡在 grub 界面说明可能是由于选择了保留配置导致升级失败了,可以参考官方教程通过 failsafe mode 恢复默认配置:Failsafe mode, factory reset, and recovery mode,或者直接重新安装系统。网络配置稍等几分钟安装好后你可能会发现 luci 无法在局域网中访问了,这是由于新安装的固件恢复了 network 配置,需要直接到 openwrt 设备上配置网络。配置教程参考:openwrt network 配置配置好网络后在局域网设备中可以用 ssh 登录了,此时会发现提示:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is SHA256:U9XODs/7A4k065pxSMyEtQ2m98v2P0bf/ML0MfzU. Please contact your system administrator. Add correct host key in C:\\Users\\Marco Nie/.ssh/known_hosts to get rid of this message. Offending RSA key in C:\\Users\\Marco Nie/.ssh/known_hosts:6 Host key for 192.168.244.1 has changed and you have requested strict checking. Host key verification failed.这是由于更新系统后 ssh 指纹发生了变化,需要删除本地缓存的 openwrt 设备的指纹在登陆,windows 系统 ssh 指纹保存地址为当前用户目录下的 .ssh 文件夹。升级后续升级后可以通过之前的脚本列出的已安装包的列表将自己需要的包安装回去,同时将备份数据按照新系统的格式恢复回去。从 openwrt 21 开始修改了 network 配置文件格式,参考:https://blog.niekun.net/archives/2291.html从 openwrt 22 开始替换 iptables 为 nftables,需要原始工具的话可以自行安装回去:opkg install iptables参考链接Opkg package managerOpenWRT 19.07 to 21.02.0 upgrade Linux 查询及编辑用户及用户组 https://blog.niekun.net/archives/Linux.html 2024-04-01T16:20:00+08:00 查询当前所有用户compgen -u 查询当前所有用户组compgen -g 添加一个用户到某个组sudo usermod -a -G groupName userName newgrp groupName 删除一个用户从某个组sudo usermod -G groupName userName newgrp groupName 用户和组对文件的权限管理参考:chown 和 chmod 管理文件权限 Linux 获取本地网关所有 ip 段地址 https://blog.niekun.net/archives/Linux-ip.html 2024-03-28T15:35:07+08:00 执行下面命令即可获取本地网关所有的 ip 段地址:$ ip address | grep -w inet | awk '{print $2}' 127.0.0.1/8 192.168.122.2/24 172.18.0.1/16 172.17.0.1/16 172.19.0.1/16 codesys enum 枚举数据类型单元的使用 https://blog.niekun.net/archives/codesys-enum.html 2024-03-07T08:21:07+08:00 enum 类型的 dut 可以定义一组属性及其值,调用的时候可以方便的通过写其属性名称得到属性的值,也可以获取到属性本身的名称。下面举一个例子说明:{attribute 'qualified_only'} // 必须先写类型名称再写属性名称 (例如 eColor.Red) // {attribute 'strict'} //取消 'strict' 以允许转换 UDINT 数据类型 {attribute 'to_string'} // 运行字符串转换 (例如 TO_STRING(eColor.Red) = 'Red') TYPE eColor : ( Red := 16#FFFF0000, Green := 16#FF00FF00, Blue := 16#FF0000FF Yellow := 16#FFFFFF00, ) UDINT; // 声明 UDINT 作为 int 整形类型 END_TYPE // 定义一些变量 ColorVar1 : eColor; ColorVar2 : eColor; ColorName : STRING; ColorValue : UDINT; ColorVar1 := eColor.Green; // ColorVar1 = 16#FF00FF00 ColorName := TO_STRING(ColorVar1); // ColorName = 'Green'; ColorValue := TO_UDINT(ColorVar1); // ColorValue = 16#FF00FF00 ColorVar2 := 16#FF00FF00; // ColorVar2.Green ColorName := TO_STRING(ColorVar2); // ColorName = 'Green'; ColorValue := TO_UDINT(ColorVar2); // ColorValue = 16#FF00FF00 ColorVar1 := ColorVar2 OR eColor.Red; // 按位相与得到 Yellow=16#FFFFFF00 ColorName := TO_STRING(ColorVar1); // ColorName = 'Yellow'; ColorValue := TO_UDINT(ColorVar1); // ColorValue = 16#FFFFFF00以上示例列举了常用的 enum 类型可进行的数据交互方式。eColor.Green 可以获取enum类型属性的值,并可以赋值给其他对应 enum 实例TO_STRING(ColorVar1) 可以转换获取 enum 实例当前值对应属性名称字符串 codesys 常见编译及下载时报错解决方法 https://blog.niekun.net/archives/codesys.html 2024-03-06T16:35:00+08:00 No source code available for this object下载时出现此报警,原因是 task 任务中对 gou 的排序有问题,放在前面的 pou 中使用了后面 pou 才设定好的数据,需要重新排列 task 任务序列:SMC_FB_CALLED_FROM_WRONG_TASKmc_power mc_jog 等控制轴的功能块,一运行就报错 SMC_FB_CALLED_FROM_WRONG_TASK,可能是不同的 pou 放在了多个 task 任务中,循环中内部有了冲突,将所有的 pou 放在同一个 task 中就可以解决问题。 服务器部署 immich 照片备份工具 https://blog.niekun.net/archives/immich.html 2024-03-04T09:30:00+08:00 目前有很多的云备份服务可以使用,比如 icloud,google photos 等。immich 是一款实现类似功能的本地部署工具,将数据都存储在自己本地服务器上,拥有完善的手机端 app 可以方便的同步备份手机图片。GitHub 主页:https://github.com/immich-app/immich官网教程:https://immich.app/docs/overview/introduction/安装服务端使用 docker compose 安装,新建一个 immich 文件夹,下载 docker-compose.yml 和 .env 文件到文件夹:wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env打开 .env 文件配置环境变量,主要就是配置备份路径和数据库密码,修改 UPLOAD_LOCATION 和 DB_PASSWORD。启动容器:docker compose up -d后续更新只需要进入 immich 文件夹执行下面命令即可:docker compose pull && docker compose up -d docker-compose.yml 文件中默认将 3001 端口映射到了本地 2283 端口,3001就是服务端访问端口号。下面是所有可用的端口,根据需要可以修改 docker-compose 文件映射到本地:PORTWeb Port3000webSERVER_PORTServer Port3001serverMICROSERVICES_PORTMicroservices Port3002microservicesMACHINE_LEARNING_HOSTMachine Learning Host0.0.0.0machine learningMACHINE_LEARNING_PORTMachine Learning Port3003machine learning配置账户网页端访问:http://you.machine.ip:2283 进入配置页面,根据提示建立一个管理员账户,后续可以在管理员账户中建立其他子账户供其他人使用。登录 app下载手机端 app,ios 直接在 app store 搜索 immich 下载,安卓在 github 发布页下载 apk:https://github.com/immich-app/immich/releases在手机端输入以下网址进入:http://you.machine.ip:2283/api然后就可以配置需要备份的手机端图片文件夹了。外网访问服务器在本地,如果要外网域名远程访问图库,需要一些额外的配置,我这里是通过 cloudflare 配置子域名,nginx 配置反向代理到 frps,最后本地服务器 frpc 配置本地 2283 端口绑定到远程域名访问即可。可以参考我之前的关于 frp 的教程:https://blog.niekun.net/archives/539.html Ubuntu 20.04 添加第三方 ppa https://blog.niekun.net/archives/Ubuntu-20-04-ppa.html 2024-02-22T09:18:33+08:00 我服务器目前安装的是 Ubuntu 20.04 系统,很多新的软件包并没有在官方维护的源中提供,所以为了方便需要可以添加第三方的源。添加需要用到的命令是:add-apt-repository,但是默认系统并没有安装这个环境,需要先手动安装 package software-properties-common:sudo apt install software-properties-common 然后就可以安装需要的源了,推荐两个:https://launchpad.net/%7Esavoury1/+archive/ubuntu/backports?field.series_filter=bionichttps://launchpad.net/%7Esavoury1/+archive/ubuntu/utilities?field.series_filter=bionic安装方法很简单:sudo add-apt-repository ppa:savoury1/backports sudo add-apt-repository ppa:savoury1/utilities sudo apt-get update执行 apt update 后会发现很多可更新的软件了。 WSA (Windows Subsystem for Android) 的安装及使用 https://blog.niekun.net/archives/WSA-Windows-Subsystem-for-Android.html 2024-02-20T15:47:00+08:00 之前介绍过 Windows10 安装 wsl 的教程,可以方便的在 Windows 下使用 Ubuntu 系统。今天介绍安装 wsa 用来在 Windows 下使用 Android 系统及安装第三方 apk。安装wsa 没有在官方的 store 中提供,这里使用开源的 WSA-Script 很方便的一键安装。GitHub 主页:https://github.com/YT-Advanced/WSA-Script在 release 页面下载最新打包的版本:https://github.com/YT-Advanced/WSA-Script/releases/latest我需要使用 google play 框架及 root 权限,所以下载的是框出来的版本:下载好解压到一个特定的目录,运行 Run.bat,期间会提示需要管理员权限以及提示收集信息的对话框,点击确认即可。安装完成后会自动运行 Windows Subsystem For Android™ 应用。设置代理如果需要使用 play 商店,就需要配置代理服务。如果本机有代理工具的话,可以让 wsa 直接调用本机代理。这里需要使用 adb 工具,下载链接:https://dl.google.com/android/repository/platform-tools-latest-windows.zip解压压缩包,可以看到其中有一个 adb.exe,可以将目录添加到系统 path 以方便在 terminal 调用。首先需要设置 wsa 打开开发者模式,进入设置打开选项:默认 wsa 是运行在本地的 58526 端口的。建立一个 powershell 脚本,如:wsaproxy.ps1,内容如下:$WinNetIP=$(Get-NetIPAddress -InterfaceAlias 'vEthernet (WSLCore)' -AddressFamily IPV4) # get android network gateway addr adb connect 127.0.0.1:58526 # android port adb shell settings put global http_proxy "$($WinNetIP.IPAddress):1082" # local proxy port第一次执行会弹出对话框是否信任外部访问,点击允许即可。以上脚本会获取到 wsa 所在网卡的网关地址,然后用 adb 连接到 wsa,最后配置代理,注意脚本里的本地代理端口修改为实际值即可。运行脚本即可让 wsa 配置好代理服务。以后只需要执行这个脚本就可以自动设置代理。如果需要取消代理运行下面命令即可:adb shell settings put global http_proxy :0安装 apk推荐直接在 play 商店安装应用程序,如果需要安装自己下载的第三方 apk,直接使用 adb 工具即可。安装命令:adb connect 127.0.0.1:58526 adb install xxx.apk文件共享可以配置一个 Windows 主机的路径作为同 wsa 共享目录,这样两边就可以互传文件了。打开 Windows Subsystem For Android™ 进入 advanced settings - experimental feature,启用 share user folders 功能并选择一个本地目录作为共享目录:通过 system - turnoff 关闭 wsa,然后点击 files 会重新运行 wsa:可以看到有一个 windows 文件夹:这个文件夹就是对应的 windows 共享目录。系统设置默认情况下只有在第一次安装成功后会自动启动 Android 设置界面,并且找不到设置的启动图标在哪里,我们可以在浏览器里直接访问 android settings 地址的方式启动。浏览器中输入以下地址并访问:wsa://com.android.settings,会提示是否需要跳转到设置,点击确认即可进入设置:参考链接Windows Android 子系统 WSA 代理设置方法教程WSA (Windows Subsystem for Android) 使用 Windows 上的代理 订阅土耳其区 Google One https://blog.niekun.net/archives/Google-One.html 2024-02-20T15:10:00+08:00 最近发现我的 google drive 免费空间也用满了,但平时有很多服务比如 Google photos,服务器备份等都需要用到它,所以想付费购买一些空间。目前 google 把订阅都整合到了 google one 中了,而且不在中国提供订阅服务。和 iCloud 类似,目前土区的订阅最便宜,所以就研究了下如何订阅到土区。我使用的是 app store 上的订阅,所以依然用到了土区的 apple 账户以及 ios 设备,关于如何建立土区账号以及充值参考:国区使用土耳其区 iCloud 家庭共享。Google 账户需要修改到土耳其区,首先进入 https://payments.google.com/点击 settings 可以看到区域信息:这里我已经修改到了土耳其区域了,如果不是的话需要点击区域旁边的按钮修改,会提示让你创建一个新的 profile:根据提示一步步设置即可,重点是选择土耳其:然后根据提示设置一个土耳其地址信息即可,参考地址:Osman Kavuncu Cad Kenarcık Sk. No2 38090 Kayseri付款信息可以不写。建立完成后我们需要将原来的那个 profile 删掉,避免引起混乱。如果有多个 profile 会在右上角显示切换按钮,我这里已经删除过了所以是空白的:切换到原来的 profile 后下拉到最下面点击删除,需要注意的是删除这个 profile 不会影响账户上的照片文件等信息,但会删除之前的一些购买付款信息:此时账户就完成了转换到土区的操作。然后在 ios 设备上用土区账号登陆 app store,注意不是登录 icloud。登录后我们打开 google drive 或者 google one app 点击管理存储:就可以看到各种套餐的信息了,都是以土耳其货币里拉为单位的,选择合适的套餐点击购买即可使用账户中的余额订阅。我选择的是 100GB 年付套餐,一年 120里拉,折合 28 人民币,还是不错的。注意及时充值土区账户,如果余额不足可能导致订阅失效。