原本可以正常使用的 SMB(Samba)文件共享连接,系统升级后,突然就不工作了。造成这次 Bug 原因也是非常奇葩,是先前能够正常挂载的 SMB 驱动器使用了「自定义图标」造成的。
修复方法也很简单(当然为了解决这个问题我也花了几天时间):
先重启已经无法连接的 Samba 服务器,然后你会发现可以重启后是能够正常挂载一次的(锁定系统或者隔一段时间后再连接就又会出现故障)。然后在 MacOS 中,在桌面上找到已经挂载的驱动器图标,选中后按 “Command+I”打开属性,用鼠标单击顶部的自定义图标,然后再按下 “Command+X” 把自定义图标剪掉,之后驱动器图标会恢复为系统默认样式,最后重新系统,故障应该可以顺利解决。
如果重启后仍然无法连接,可以再次尝试先重启已经无法连接的 Samba 服务器并再次挂载,并在 MacOS 中使用命令行,彻底清除之前已经挂载的驱动器的扩展属性:
xattr -c /Volumes/你的共享\ 名称
提示:如果驱动器名称中有空格,请在空格前键入“\”,如上所示。问题即可解决。
这个问题在旧版本的 MacOS Monterey 下不会出现的,只会发生在 MacOS Ventura 13.2 及 13.3下,另外同样能对iOS 16.3造成影响。目前最新的 13.4 Beta 1 尚未修复这个错误。
这个问题在AppleInsider论坛 \ Reddit 上也有过大量讨论。
如果上述操作对你仍然无效,则可以试图切换 MacOS 的 SMB版本:
sudo sh -c "echo '[default]' >> /etc/nsmb.conf; echo 'protocol_vers_map=6' >> /etc/nsmb.conf"
7:这将启用 SMB 1/2/3(默认)
6:这将启用 SMB 2/3
4:这将仅启用 SMB 3
2:这将仅启用 SMB 2
1:这将仅启用 SMB 1启用
此处的 =6 代表设置为仅 SMB v2/3(低版本的 Mac 系统曾经是使用 “smb_neg=smb2_only”,现在失效了)。这个命令会在 /etc 目录中添加一个 nsmb.conf 文件,系统检测到这个文件后就会默认按照你设置的值对外连接SMB。修改后需要重启才能生效。(如果需要回到默认连接,只需要 rm /etc/nsmb.conf
即可)。
解决方法:说明你的PD版本有变化,但虚拟机仍处于休眠或者中止状态,还没有匹配好。请将虚拟机关机,或者强行停止虚拟机,再退出PD,然后重新启动PD,再运行启动公交即可解决。(强行停止虚拟机的方法:右键PD,选择控制中心,双击虚拟机齿轮附近空白处,打开虚拟机窗口,然后在屏幕左上方的菜单栏,选择操作—停止,这样也可以强行关闭虚拟机。)
解决方法:虚拟机的文件已丢失,可以右键PD,选择控制中心,检查虚拟机的状态,如果虚拟机已经损坏,建议重装虚拟机系统。如果出现以下的状态,可以到回收站找回本体文件,然后复制到你Mac电脑的个人文件夹中,路径为/Users/你的用户名/Parallels。
解决方法:在「系统偏好设置—安全性和隐私中—通用」,在下方选择「仍要打开」允许这个程序即可。
解决方法:右键Docker栏的PD图标,选择关于Parallels Desktop,看是否有Pro Edition的标识,如果没有,就是标准版的。①关闭虚拟机,退出PD②进入MAC系统的系统偏好设置,选择时间与日期,修改系统时间为2021年2月2号③然后启动 PD,运行虚拟机,继续试用④进入虚拟机后,你的PD版本会自动切换到专业版⑤最后把时间改回来。或者尝试:①在PD输入密钥的界面下,不要关闭窗口②进入MAC系统的系统偏好设置,选择时间与日期,修改系统时间为2021年2月2号③然后回到PD输入密钥的窗口,点然后点免费试用14天,你会有惊喜发现。④点继续试用,你的PD版本会自动切换到专业版⑤把时间改成正确时间。
解决方法:可能是虚拟机未装好,可以右键Dock栏,选择控制中心,查看虚拟机的状态,是否有安装好?或者是你的虚拟机名称并非 Windows 11,请关闭或者强行停止win11虚拟机,到PD控制中心重命名,注意大小写和空格。(Win10的标准名字是Windows 10,Win11的标准名字是Windows 11,Ubuntu的标准名字是Ubuntu Linux)。
解决方法:虚拟机已在后台运行,可以手动运行PD,右键Dock栏的PD图标, 选择控制中心,查看虚拟机系统的运行状态,可以右键电源图标,选择关闭或者停止,然后重新运行延时工具即可。另外,如果你的虚拟机设置成融合模式,已经后台运行,重复运行延时工具也可能会有这个报错,建议关闭融合模式。
解决方法:虚拟机系统没有安装,建议全新安装虚拟机系统,如果曾经有安装虚拟机,可以导入进来,路径为/Users/你的用户名/Parallels文件夹里,双击pvm格式的虚拟机文件,可以自动导入。如果没有这个文件,则需要重新安装虚拟机。
解决方法:提示超出激活时间,需要购买激活密钥。若出现如图错误提示,或者类似的提示,请退出PD软件,到Mac电脑应用程序文件夹,把Parallels Desktop软件拖动到垃圾篓。然后自行更换其他可用版本,操作不会影响你的Windows虚拟机数据。另外建议禁用PD软件更新,方法:右键Dock栏的PD图标,选择偏好设置—通用,把检查更新设置成从不,把自动下载更新的勾去掉即可。
解决方法:安装kb4474419后重新再安装VMware Tools即可。下载地址
]]>打印机的驱动程序文件位置:
通常位于 /Library/Printers/vendor_name 中。
还有位于 /Library/Printers/PPDs/Contents/Resources 中的支持 PPD。
根据使用的打印机,其他供应商文件夹中可能有更多文件。
恢复:
位于 /Library/Preferences 中的文件 org.cups.printers.plist
位于 /Library/Printers 中的文件 InstalledPrinters.plist
位于~/Library/Preferences 中有几个文件,org.cups.PrintingPrefs.plist和com.apple.print.add.plist
使用如下命令控制cups打印服务开关:
sudo launchctl stop org.cups.cupsd
sudo launchctl start org.cups.cupsd
使用如下命令打开cups的web设置开关:
cupsctl WebInterface=no
cupsctl WebInterface=yes
打开之后,可以通过http://localhost:631/ 访问cups的web设置。
首先,退出预览应用程序,在终端中输入以下内容,然后再次启动预览,即可。
defaults write com.apple.Preview PVImagePrintingScaleMode 0
要还原此设置(仍然开启自动伟德永久官网),可以使用以下命令:
defaults delete com.apple.Preview PVImagePrintingScaleMode
当然,也可以打开 ~/Library/Containers/com.apple.Preview/Data/Library/Preferences/com.apple.Preview.plist
手动添加如下值:
<key>PVImagePrintingScaleMode</key>
<string>0</string>
以上方法适用于macOS 10.11以上。
]]>例:执行 brew install composer
命令
~ brew install composer
Updating Homebrew... # 如果碰到长时间卡在这里,参考以下 2 种处理方法
~ brew install composer
Updating Homebrew...
^C
按住 control + c 之后命令行会显示 ^C,就代表已经取消了 Updating Homebrew 操作。大概不到 1 秒钟之后就会去执行我们真正需要的安装操作了
➜ ~ brew install composer
Updating Homebrew...
^C==> Satisfying dependencies
==> Downloading https://getcomposer.org/download/1.7.2/composer.phar
...
这个方法是临时的、一次性的
平时我们执行 brew 命令安装软件的时候,跟以下 3 个仓库地址有关:
通过以下操作将这 3 个仓库地址全部替换为 Alibaba 提供的地址
替换 / 还原 brew.git 仓库地址
替换成阿里巴巴的 brew.git 仓库地址:
cd "$(brew --repo)"
git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git
还原为官方提供的 brew.git 仓库地址
cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git
替换 / 还原 homebrew-core.git 仓库地址
替换成阿里巴巴的 homebrew-core.git 仓库地址:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git
还原为官方提供的 homebrew-core.git 仓库地址
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://github.com/Homebrew/homebrew-core.git
替换 / 还原 homebrew-bottles 访问地址
这个步骤跟你的 macOS 系统使用的 shell 版本有关系,所以先来查看当前使用的 shell 版本
echo $SHELL
# 如果你的输出结果是 /bin/zsh,参考?的 zsh 终端操作方式
# 如果你的输出结果是 /bin/bash,参考?的 bash 终端操作方式
3.1 zsh 终端操作方式
# 替换成阿里巴巴的 homebrew-bottles 访问地址:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc
# 还原为官方提供的 homebrew-bottles 访问地址
vi ~/.zshrc
# 然后,删除 HOMEBREW_BOTTLE_DOMAIN 这一行配置
source ~/.zshrc
3.2 bash 终端操作方式
# 替换 homebrew-bottles 访问 URL:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile
# 还原为官方提供的 homebrew-bottles 访问地址
vi ~/.bash_profile
# 然后,删除 HOMEBREW_BOTTLE_DOMAIN 这一行配置
source ~/.bash_profile
]]>1.首先安装homebrew
安装tcping首先需要需要有 homebrew 环境(一款Mac OS平台下的软件包管理工具),如果已经安装则可以跳过本步骤。
按Command+Space 后输入 Terminal
后,按回车启动终端。在终端中输入:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
之后按回车,如果需要输入密码,则输入密码,输入的密码不会被显示在屏幕上,输入完毕后直接按回车即可,然后等待命令行完成。
2.通过homebrew安装tcping。安装好homebrew 环境后,在终端中输入:
brew install tcping
回车后等待命令完成后tcping即可安装成功。
名称
tcping - 通过建立到网络主机的连接来模拟tcp上的"ping" .
测量系统达到[SYN],接收目标的[SYN] [ACK]和发送[ACK]的时间。
需要注意的是,最后一个ACK不包括在内-仅包括发送到发送端的时间。
概要
tcping [-tdsvf46] [-i 间隔] [-n 次数] [-w 间隔] [-b n] [-r 次] [-j 深度] [--tee 文件名称] [-f] 目标 [端口]
描述
tcping测量在其自身与远程主机之间执行TCP 3种握手(SYN,SYN/ACK,ACK)所需的时间。
不包括传出最终ACK的传输时间,仅包括将其丢弃所需的(最短)时间线缆在近端。这允许(SYN,SYN/ACK)的请求,响应时间近似于相当于ICMP。
命令参数
-4 建议使用IPv4
-6 优先使用IPv6
-t 连续ping,直到通过control-c停止
-n count
发送ping,然后停止。默认值4。
-i 间隔
在两次ping之间等待_interval_秒。默认值1.允许使用小数。
-w 间隔
等待_interval_秒以获取响应。默认值2。允许使用小数。
-d 在每条回显中显示日期和时间
-f 除了建立连接外,还强制发送至少一个字节。
-g 计数
在_count_次ping失败后放弃。
-b 类型
启用蜂鸣声。
“ -b 1”将“向下”发出蜂鸣声。如果主机启动了,但现在没有启动,则发出哔声。
“ -b 2”将“响起”哔声。如果主机掉线了,但现在却掉线了,请发出哔声。
“ -b 3”将在“更改”时发出蜂鸣声。如果主机是一种方式,但现在是另一种方式,则发出哔声。
“ -b 4”将“总是”发出哔声。
-c 仅在更改的状态下显示输出
-r 计数
每次计数时,我们都会为主机执行新的DNS查找,以防主机更改。
-s 成功后立即退出。
-v 打印版本并退出。
-j 计算抖动。抖动定义为上次响应时间与历史平均值之间的差。
-j s深度
与-j一样计算抖动,但指定了可选的_depth_参数。如果指定_depth_ tcping将
使用先前的_depth_值来计算滚动平均值。
--tee _文件名_
输出重复到指定的_filename_。Windows仍不能依赖于具有有用的命令行
环境。* nix伙计们,不要嘲笑我。
- append
使用--tee时,追加而不是覆盖输出文件。
- file
将“目标”选项视为文件名。该文件成为目的地的来源,并在
逐行 某些选项在此模式下不起作用,并且不会保留统计信息。
destination
DNS名称,IP地址或(在“ http”模式下)URL。
不要在“ http”模式下指定协议(“ http://”)。也不要通过“:port”语法指定服务器端口。
例如:“ tcping http://www.elifulkerson.com:8080/index.html”将失败
请使用以下样式:“ tcping www.elifulkerson.com/index.html 8080”。
port
一个数字TCP端口,从1到65535。如果未指定,则默认为80。
--header
包括带有命令行参数和时间戳的标头。如果使用--tee,则暗含标题。
HTTP模式选项
-h 使用“ http”模式。在http模式下,我们将尝试获取指定的文档并返回其他值,包括
文档的大小,http响应代码,kbit / s。
-u 在“ http”模式下,在每个输出行上包括目标URL。
--post 在http模式下使用POST而不是GET。
--head 在http模式下使用HEAD而不是GET。
--get 为了简化起见,可以调用“ http”模式。
--proxy-server _proxyserver_
连接到_proxyserver_来请求URL,而不是URL本身所指示的服务器。
--proxy-port _port_
指定代理服务器的数字TCP端口。默认为3128
--proxy-credentials 用户名:密码
指定一个用户名:密码对,作为“代理授权:基本”标头发送。
返回值
如果所有ping成功,则tcping返回0;如果ping零成功,则返回1;对于混合结果,返回2。
]]>最近有两台群晖远程异地文件同步的需求,原计划是打算同步共享文件夹 “Docs”。一开始先想到的是群晖自家的 Cloud Station Server套件,于是开始测试:
设置完成后,发现群晖A的 Cloud Station Server会试图扫描整个共享文件夹 “Docs”(是由图纸图片文件组成约8TB的数据),导致Cloud Station Server的数据库和日志暴增,最终无法响应。之后在群晖官网找到了 Cloud Station Server的技术白皮书,发现现有的数据量已经远远超出了他们所设计的性能范围。
之后又无奈的测试了开源的同步软件Syncthing:功能看起来很好,跑起来发现问题还是挺多的,主要还是数据量太大造成的,不同的目录会经常出现不同的权限错误,扫描反复中断,并且内网穿透也是时断时续,看来还是不适合在生产环境中使用。
于是只能退而求其次,再次回到 Cloud Station Server的方案,打算只同步共享文件夹 “Docs”的子文件夹"Sync(约50GB)",可惜新的问题又出现了:
因为群晖A的Cloud Station Server只能选择拟同步的“共享文件夹”(不能选择子文件夹),但在群晖B的Cloud Station ShareSync的高级设置中,可以在拟同步的文件夹中指定同步子文件夹"Sync1")。设置完成后,发现群晖A的Cloud Station Server仍然试图扫描整个“Docs”共享文件夹,还是会导致数据库和日志暴增,最终无法响应。于是联系了群晖技术支持,答复如下:
“ Cloud Station Server 是一定要扫描整个共享文件夹,这是当前的设计。如果是双向同步,除了Cloud Station Server,没有其他替代的同步方案。建议新建一个共享文件夹,然后将这50GB的文件放进去,单独创建任务进行同步。”
这种答复,Mmm...如果新建共享文件夹然后单独创建同步任务,是不现实的,因为除了权限问题,还涉及到变更路径,多出一个共享文件夹也会影响用户习惯。
后来我想到一个曲线救国的方式,使用mount —bind命令,达到欺骗 Cloud Station Server 的目的,避免对整个“Docs”共享文件夹的扫描的目的。
实现方法如下:
sudo mount --bind /volume1/FakeSync/ /volume1/Docs/Sync
,实现所有对后一个目录的访问其实都是对前一个目录的访问;sudo mount --bind /volume1/FakeSync/ /volume1/Docs/Sync
,这样才能开机自动挂载,避免重启之后同步失效。偶尔会使用 Mac 连接带一台海康威视的NVR,在 Mac 下直接使用bevitor伟德备用网址器访问这台NVR,又没有可用的bevitor伟德备用网址器插件。很早以前就找到了这个叫 iVMS-4200 的客户端。有意思的是,国内的海康威视网站并没有提供 iVMS-4200 for Mac的客户端下载(海康可能认为国内没什么人用 Mac),最早我给海康威视的客服打过电话,客服通过邮件发给过我旧版本的iVMS-4200 for Mac 客户端,而且是中文的。
随着 Mac 系统的升级(MacOS 10.15 Catalina 之后),产生了大面积的应用兼容性问题,首先是32位的应用不再支持,直接导致v2.0.0.10版本不可用,后来释出的64位版本会导致CPU风扇狂转、网络传入传出无法选择允许等问题,仍然是不可用状态。
之后我通过 Web 监控程序监控了海康威视国际网站的软件支持更新,最近,他们释出了针对 Mac 系统监控客户端的更新版本 iVMS-4200 for Mac V2.0.0.12。说实话,MacOS 10.15都发布了这么长时间,海康威视的客户端团队升级周期也真是够久。
新版本实际没有大更新,只是修复了与操作系统的兼容问题,经测试已经正常可用。但在软件的GUI中,并没有切换中文英文语言,直接安装使用的话,默认则是英文版本,启动后,会提示如下错误:
Error Code LibDAG dylib [5026]. (Mismatched device language and client language.)
原因也很简单,NVR 系统语言是中文的,而客户端的语言是英文的,客户端又敏感的对语言进行了判断,直接导致无法连接到 NVR。于是我把安装好的iVMS-4200包打开,把包中的文件全部翻了一遍,发现里面是有中文资源的(有且只有中文和英文),甚至还有中文的使用手册。所以最终找到了解决办法:
安装好最新版本之后,直接跳转到(或者在应用程序中的iVMS-4200图标上鼠标右键,显示包内容)/Applications/iVMS-4200.app/Contents/MacOS/,之后用文本编辑器修改Setup.xml:
<?xml version='1.0' encoding='utf-8'?>
<Configs Version="2.7.0.1">
<Translator>
<Value>0</Value>
</Translator>
将Translator的值自0修改为1,其他值不变,保存即可。再次启动 iVMS-4200客户端,就会发现GUI已经变成中文,这时候只需要重新添加NVR到客户端中,即可正常使用。
]]>无奈之下,只能 google。在官网的论坛上发现了一篇比较扯的帖子:https://discussions.apple.com/thread/2166984
说是要把拨片拨到 lock 和 unlock 中间,于是我照着干了,发现果然可写了。
为了探究背后的原因,我研究了下 SD 卡 lock 开关的原理:
In fact, the lock switch has no bearing on the internals of the SD
card at all. If you rip an old SD card apart you will see that it is
nothing more than a little plastic slider that rides in a groove, and
does not affect the electronics of the card itself.Its position is sensed by a small switch -- often just a spring-loaded
little bit of metal -- inside the card slot on the card reader. When
the switch is in the "lock" position it engages the switch in the
reader and it tells your computer (or whatever device), "Hey, this
thing is locked, don't write to it."It is 100% up to the manufacturer of the reader to ensure that the
lock functionality works and is supported. Many cheap Chinese knockoff
card readers, especially those that do not fully encapsulate the card
and leave it sticking part or most of the way out of the slot, don't
support the lock switch at all. You can leave the switch in whatever
position you want and it will have no effect.
按照这个说法,macbook 的 lock 触点比较奇葩,需要把拨片放到中间才能避免 lock 。
]]>Windows 8 和 Windows Server 2012 引入了新的 Set-SMBServerConfiguration
Windows PowerShell cmdlet。 通过此 cmdlet,你可以在服务器组件上启用或禁用 SMBv1、SMBv2 和
SMBv3 协议。注意 在 Windows 8 或 Windows Server 2012 中启用或禁用 SMBv2 时,也会启用或禁用 SMBv3。
之所以会出现此行为是因为这些协议共享同一个堆叠。运行 Set-SMBServerConfiguration cmdlet 后,无须重启计算机。 SMB v2/v3
检测:Get-SmbServerConfiguration | Select EnableSMB2Protocol
禁用:Set-SmbServerConfiguration -EnableSMB2Protocol $false
启用:Set-SmbServerConfiguration -EnableSMB2Protocol $true
在Windows Server 2012 的 PowerShell 中执行
Set-SmbServerConfiguration -EnableSMB1Protocol $false
命令将会立即生效。回到 macOS 中尝试重新连接Samba共享,在命令行中执行smbutil statshares -a
查看当前共享连接状态,已经变成了SMB v1,然后在Finder中操作,果不其然,不再卡死。
毕竟把 Windows Server 2012 服务器的Samba 设置为 1.0 版本非常不安全。但又不能仅屏蔽SMBv3。所以只好动手将 macOS 的 Samba 协议强制降低到SMBv2上(系统会出于安全角度默认自协商选用最高版本的协议进行连接)。
于是在 macOS 命令行中执行:
sudo sh -c "echo '[default]' >> /etc/nsmb.conf; echo 'protocol_vers_map=2' >> /etc/nsmb.conf"
此处的2代表设置为SMBv2,1就等于SMBv1(低版本的 Mac 系统曾经是使用“smb_neg=smb2_only”,现在失效了)。这会在 /etc 目录中添加一个 nsmb.conf 文件,系统检测到这个文件后就会默认通过 SMBv2 对外连接。修改后需要重启才能生效。(如果需要回到默认连接,只需要rm /etc/nsmb.conf
即可)。