分类目录归档:技术笔记

macOS 使用 arping 扫描 ip 冲突

最近工作网络不稳定,多个常用 IP 出现冲突,就连 DHCP 获取到的 IP 也会立刻冲突,原因等待相关人员去解决,今天简单记录 macOS 下 IP 冲突检测的原因。

一般检查 IP 是否被占用的方法是使用 ping

$ ping 119.29.29.29
PING 119.29.29.29 (119.29.29.29): 56 data bytes
64 bytes from 119.29.29.29: icmp_seq=0 ttl=50 time=14.477 ms
64 bytes from 119.29.29.29: icmp_seq=1 ttl=50 time=15.033 ms
64 bytes from 119.29.29.29: icmp_seq=2 ttl=50 time=15.330 ms
^C
--- 119.29.29.29 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 14.477/14.947/15.330/0.354 ms

但是这种方法看不到ip冲突,如果出现多个机器占用同个 IP,可以利用arp协议查一下 MAC 地址:

# macOS 下这样安装
$ brew install arping
# 使用 alias 定义快速使用别名
$ alias arping='sudo /opt/homebrew/opt/arping/sbin/arping'

另外发现 m1 下的 brew 安装 arping 默认不会进入 PATH ,因此在这里手动设定一个别名,方便使用。

之后扫描,如果出现 IP 冲突,可以看到有多个 MAC 地址回应:

$ sudo /opt/homebrew/opt/arping/sbin/arping 192.168.5.79
Password:
ARPING 192.168.5.79
60 bytes from 6a:f2:77:bd:bf:16 (192.168.5.79): index=0 time=463.000 usec
60 bytes from 6a:29:af:20:80:7f (192.168.5.79): index=1 time=1.002 msec
60 bytes from 6a:f2:77:bd:bf:16 (192.168.5.79): index=2 time=582.000 usec
60 bytes from 6a:29:af:20:80:7f (192.168.5.79): index=3 time=1.182 msec
60 bytes from 6a:f2:77:bd:bf:16 (192.168.5.79): index=4 time=658.000 usec
60 bytes from 6a:29:af:20:80:7f (192.168.5.79): index=5 time=1.117 msec
60 bytes from 6a:f2:77:bd:bf:16 (192.168.5.79): index=6 time=772.000 usec
60 bytes from 6a:29:af:20:80:7f (192.168.5.79): index=7 time=1.096 msec
^C
--- 192.168.5.79 statistics ---
4 packets transmitted, 8 packets received,   0% unanswered (4 extra)
rtt min/avg/max/std-dev = 0.463/0.859/1.182/0.257 ms

还可以通过 arping 来查看是否 IP 被占用,有些机器会禁止 PING 检测,使用 arp 这类二层协议检测占用情况会更准确些。

参考文献

macOS12 使用 UTM 体验 macOS 13 Ventura (多图预警)

UTM 是苹果 IOS、macOS 生态下的一款开源的虚拟机软件,底层基于 QEMU 或 Apple 虚拟化,能够在苹果操作系统上以半虚拟化(同 CPU 架构)或全虚拟化(异构 CPU 系统)的形式运行 Linux、Windows 以及 macOS。

macOS 13 (Ventura) 是苹果公司用于麦金塔桌面操作系统macOS的第19个主要版本,于2022年6月7日的苹果全球开发者大会(WWDC)上发布,成为macOS 12 Monterey的继任版本。此版macOS命名自加州南部的滨海旅游胜地范朵拉市

基于此前苹果系统的一些历史丑闻,导致本人在内的许多人对苹果推送的新固件保持谨慎态度。作为生产力存在的 macOS 更加需要小心谨慎了。

但一味的观望总是毫无进展的,还是上手体验一番最有说服力。虽然在 macOS 12 下使用 UTM 不可以直接启动 macOS 13 虚拟机,但是可以通过安装 macOS 12 虚拟机然后再更新到 macOS 13 的形式体验到最新的 macOS。

下面介绍方法和效果展示,多图预警!!

材料准备

为了安装 macOS 12 虚拟机,需要至少准备以下资源:

  • UTM
  • macOS12 IPSW 文件(约14GB)
  • 大约 64GB 的磁盘空间

其中 UTM 用于启动虚拟机,按照官网的流畅安装即可,非常简单。

IPSW 文件可理解为苹果生态下的 ISO 镜像,其中包含所有系统资源,可通过 这里这里 下载到 macOS 12 系统镜像。

IPSW(iPhone软件)是一种文件格式,用于为装有Apple芯片的设备安装iOS,iPadOS,tvOS,HomePod和最近的macOS固件。

需要注意的是,macOS 13 无法直接在 macOS 12 下启动,因此即使能够获取到 macOS 13 的 IPSW 文件,也无法启动。

磁盘空间需要预留至少 64GB,因为本人在尝试分配 64G 硬盘后,发现安装过程中几乎全部耗尽,如果空间不足会导致虚拟机卡死。

一切准备就绪,就可以开始了。

开始 Ventura 之旅

以下使用图片加注释的形式进行,按照图示一步一步走过来即可,赶时间也可以直接看图片效果:

这一步载入 macOS IPSW 文件

建议磁盘选择 64GB,32 GB 无法安装 macOS 13

等待系统安装

登入 macOS 13

系统信息

软件展示

台前调度

总结

使用 UTM 足以体验所有 macOS13 的所有新功能,用来评估是否可以用于自己的日常工作,以及个人喜好,避免降级。

本文介绍了 UTM 配置 macOS 12 虚拟机并升级到 macOS 13 的全过程,展示了 macOS 13 变动较大的设置、时钟、天气以及台前调度等功能,希望对大家起到一些参考意义,若有问题欢迎留言。

参考文献

根本解决C程序 ignoring return value of ‘***’

最近在移植一个 C 项目时出现如下报错:

xxxxxx.c:990:4: error: ignoring return value of ‘chroot’, declared with attribute warn_unused_result [-Werror=unused-result]
  990 |    chroot("/");

之所以报错等级为 Error ,是因为 GCC 编译具有参数 -Werror,将警告当作错误:

gcc -std=gnu99 -Wall -Werror -Wno-unknown-pragmas -Wno-strict-aliasing -Wpedantic -g -O2 -Wl,-z,relro -I. -D_FILE_OFFSET_BITS=64 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/fuse -c -o xxxxxx.o xxxxxx.c -MMD -MT pmxcfs.o -MF xxxxxx.o.d

去掉这一编译参数治标不治本。最根本的解决办法是去源码找到出问题的地方,处理一下返回值,或者这样手动忽略错误,并辅以注释:

- chown(RUNDIR, 0, cfs.gid);
+ # TODO 临时处理,忽略返回值
+ # 后期需根据实际情况处理错误码
+ if(chown(RUNDIR, 0, cfs.gid)){};

再次编译解决。

参考文献

Linux 使用 diff 分栏对比文本差异

首先看一下帮助文档:

$ diff --help  
用法:diff [选项]... 文件列表  
逐行比较<各文件>。  

长选项的必需参数也是相应短选项的必需参数。  
     --normal                  以正常的 diff 方式输出 (默认)  
 -q, --brief                   只有在文件不同时报告  
 -s, --report-identical-files  当两个一样时仍然显示结果  
 -c, -C NUM, --context[=NUM]   同时输出 NUM 行(默认为 3 行)的复制上下文内容  
 -u, -U 数量, --unified[=数量] 输出 <数量>(默认为 3)行一致化上下文  
 -e, --ed                      以 ed script 方式输出  
 -n, --rcs                     以 RCS diff 格式输出  
 -y, --side-by-side            以两栏的格式输出  
 -W, --width=数量              每行显示最多 <数量>(默认 130)个字符  
     --left-column             当有两行相同时只显示左边栏的一行  
     --suppress-common-lines   当有两行相同时不显示  

 -p, --show-c-function         显示每个变更位于哪个 C 函数中  
 -F, --show-function-line=正则 显示匹配给定<正则>表达式的最近一行  
     --label 标签              使用给定<标签>替代文件名和时间戳  
                                 (可以重复)  

 -t, --expand-tabs             将输出中的 tab 转换成空格  
 -T, --initial-tab             每行先加上 tab 字符,使 tab 字符可以对齐  
     --tabsize=数字           TAB 格的宽度,默认为 8 个打印列宽  
     --suppress-blank-empty    在空的输出行之前去除空白或制表符  
 -l, --paginate                将输出送至 “pr” 指令来分页  

 -r, --recursive                 连同所有子目录一起比较  
     --no-dereference            不要跟随符号链接  
 -N, --new-file                  不存在的文件以空文件方式处理  
     --unidirectional-new-file   若第一文件不存在,以空文件处理  
     --ignore-file-name-case     忽略文件名大小写的区别  
     --no-ignore-file-name-case  不忽略文件名大小写的区别  
 -x, --exclude=模式              排除匹配 <模式> 的文件  
 -X, --exclude-from=文件         排除所有匹配在<文件>中列出的模式的文件  
 -S, --starting-file=文件        当比较目录時,由<文件>开始比较  
     --from-file=文件1           将<文件1>和操作数中的所有文件/目录作比较;  
                                   <文件1>可以是目录  
     --to-file=文件2             将操作数中的所有文件/目录和<文件2>作比较;  
                                   <文件2>可以是目录  

 -i, --ignore-case               忽略文件内容大小写的区别  
 -E, --ignore-tab-expansion      忽略由制表符宽度造成的差异  
 -Z, --ignore-trailing-space     忽略每行末端的空格  
 -b, --ignore-space-change       忽略由空格数不同造成的差异  
 -w, --ignore-all-space          忽略所有空格  
 -B, --ignore-blank-lines        忽略任何因空行而造成的差异  
 -I, --ignore-matching-lines=正则 若某行完全匹配 <正则>,则忽略由该行造成的差异  

 -a, --text                      所有文件都以文本方式处理  
     --strip-trailing-cr         去除输入内容每行末端的回车(CR)字符  

 -D, --ifdef=名称                输出的内容以 ‘#ifdef <名称>’ 方式标明差异  
     --GTYPE-group-format=GFMT   以 GFMT 格式处理 GTYPE 输入行组  
     --line-format=LFMT          以 LFMT 格式处理每一行资料  
     --LTYPE-line-format=LFMT    以 LFMT 格式处理 LTYPE 输入的行  
   这些格式化选项提供对 diff 输出的精细控制,从而泛化 -D/--ifdef。  
   LTYPE 可以是 “old”、“new” 或 “unchanged”。GTYPE 可以是 LTYPE 的选择  
   或是 “changed”。  
   (仅)GFMT 可包括:  
     %<  该组中每行属于<文件1>的差异  
     %>  该组中每行属于<文件2>的差异  
     %=  该组中同时在<文件1>和<文件2>出现的每一行  
     %[-][宽度][.[精确度]]{doxX}字符  以 printf 格式表示该<字符>代表的内容  
       大写<字符>表示属于新的文件,小写表示属于旧的文件。<字符>的意义如下:  
         F  行组中第一行的行号  
         L  行组中最后一行的行号  
         N  行数 ( =L-F+1 )  
         E  F-1  
         M  L+1  
     %(A=B?T:E)  如果 A 等于 B 那么 T 否则 E  
   (仅)LFMT 可包括:  
     %L  该行的内容  
     %l  该行的内容,但不包括结束的换行符  
     %[-][宽度][.[精确度]]{doxX}n  以 printf 格式表示的输入行号  
   GFMT 或 LFMT 都可包括:  
     %%        %  
     %c'C'     单个字符 C  
     %c'\OOO'  八进制码 OOO 所代表的字符  
     C         字符 C(处上述转义外的其他字符代表它们自身)  

 -d, --minimal            尽可能找出最小的差异集  
     --horizon-lines=数量 保持指定行数的一致前后缀  
     --speed-large-files  假设文件十分大而且文件中含有许多微小的差异  
     --color[=何时]       给输出上色;“何时”可以是“never”(从不)、  
                            “always”(总是)或“auto”(自动,默认);  
                            仅指定 --color 与 --color='auto' 效果相同  
     --palette=调色板     在 --color 选项启用时使用的颜色;<调色板>参数应当是  
                            一个冒号分隔的列表以提供 terminfo capabilities 信息  

     --help               显示此帮助信息并退出  
 -v, --version            输出版本信息并退出  

 <文件列表> 的格式可以是“文件1 文件2”、“目录1 目录2”、“目录 文件”或  
     “文件 目录”。  
如果使用 --from-file 或 --to-file 选项,<文件名> 的格式则不受限制。  
如果 FILE 是 “-”,则由标准输入读取内容。  
如果输入相同,则退出状态为 0;1 表示输入不同;2 表示有错误产生。  

报告程序错误到: bug-diffutils@gnu.org  
报告翻译错误到: https://translationproject.org/teams/zh_CN.html  
GNU diffutils 主页: <https://www.gnu.org/software/diffutils/>  
使用 GNU 软件的通用帮助:<https://www.gnu.org/gethelp/>

用的时候可以横排查看不同的地方:

$ diff pmxcfs.kylin.e pmxcfs.debian10.e -y -W 180

使用 -y 表示两列查看,使用 -W 设定宽度,这样就可以在终端里分栏查看文件差异:

参考文献

linux grep 过滤多个单词

有时会需要使用 grep 做多关键词匹配,这里给出集中方法,简单记录:

grep 'word1\|word2\|word3' /path/to/file
### Search all text files ###
$ grep 'word*' *.txt
### Search all python files for 'wordA' or 'wordB' ###
$ grep 'wordA*'\''wordB' *.py
$ grep -E 'word1|word2' *.doc
$ grep -e string1 -e string2 *.pl
$ grep -E "word1|word2" *.c
### Show all the lines that do not match given pattern/words/strings ###
$ grep -v 'bar\|foo' /dir1/dir2/file1
$ grep -E -v 'pattern1|pattern2' /path/to/file

参考文献

VMware ovftool arm zip 包安装

ovftool 是 VMware 提供的一款开放的导入、导出 OVF 格式虚拟机的 CLI 工具,支持 X86 和 Arm。

官方提供两种,一种是类似 .bundle 安装包,另一种是 zip 压缩包。本文介绍 zip 压缩包使用方法。

安装方法

第一步:获取软件包

获取 arm 安装包,建议通过官方途径下载,比如:

第二步:解压

解压,例如这样:

$ unzip VMware-ovftool-4.4.0-15722219-lin.aarch64.zip

第三步:配置环境变量

$ + export PATH=$PATH:/home/worker/ovftool
$ source .bashrc

第四步:使用

# ovftool --version
VMware ovftool 4.4.0 (build-15722219)

F&A

libcrypt.so.1 缺失

/root/ovftool/ovftool.bin: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory

解决方案:

安装 libxcrypt-compat 软件包即可,比如这样:

# ArchLinux
$ pacman libxcrypt-compat

locale 设置错误

/root/ovftool/ovftool: line 10: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory

arch 下解决方案,

  1. 编辑 /etc/locale.gen,去掉 en_US.UTF-8 UTF-8 以及 zh_CN.UTF-8 UTF-8 行前的注释符号(#
$ vim /etc/locale.gen

- #en_US.UTF-8 UTF-8
+ en_US.UTF-8 UTF-8
- #zh_CN.UTF-8 UTF-8
+ zh_CN.UTF-8 UTF-8
  1. 然后使用如下命令生成 locale
$ locale-gen
  1. 向 /etc/locale.conf 输入内容:
$ echo 'LANG=en_US.UTF-8'  > /etc/locale.conf

参考文献