作为一个不用 vim 编辑会死星人,用 Xcode 总是止不住自己想 Escape 的心。于是找到了 XVimProject/XVim2 进行配置。 大致方法如下: 按照 Signing Xcode 对 Xcode 进行重签名。套路和对 GDB 进行签名一样。不过这次,签名完成的时间可长多了,毕竟 Xcode 这么大。 接着按照项目的 README,首先 git clone 然后 make ,第一次打开 Xcode 的时候选择 Load Bundle 即可。 终于可以满足我 Escape Xcode 的欲望了。
在 macOS 上读取移动硬盘的 S.M.A.R.T. 信息
之前想看看自己各个盘的情况,但是发现只能看电脑内置的 SSD 的 S.M.A.R.T 信息,而移动硬盘的都显示: $ smartctl -a /dev/disk2 smartctl 6.6 2017-11-05 r4594 [Darwin 17.7.0 x86_64] (local build) Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org /dev/disk2: Unable to detect device type Please specify device type with the -d option. Use smartctl -h to get a usage summary 一开始我怀疑是个别盘不支持,但换了几个盘都不能工作,问题应该出现在了 USB 上。查了下资料,果然如此。根据 USB devices and smartmontools ,获取 S.M.A.R.T 信息需要直接发送 ATA 命令,但是由于经过了 USB,于是需要进行一个转换,导致无法直接发送 ATA 命令。这个问题自然是有解决方案,大概就是直接把 ATA 命令发送过去(pass-through)。上面这个地址里写到,如果需要在 macOS 上使用,需要安装一个内核驱动。可以找到,源码在 kasbert/OS-X-SAT-SMART-Driver 并且有一个带签名的安装包在 External USB / FireWire drive diagnostics support 中可以下载。丢到 VirusTotal 上没查出问题,用 v0.
通过 Ipfilter Extension 实现 RFC8367
前几天无聊闲逛看到了一个很有趣的 RFC8367 - Wrongful Termination of Internet Protocol (IP) Packets ,看到日期大家应该都懂了,这是个粥客,不过里面还是反映了一些事情,咳。 之前看到闪客实现了 shankerwangmiao/xt_PROTO ,想到自己也可以做一个 iptables 扩展,于是就写了 jiegec/xt_EQUALIZE 。它是这样使用的: $ git clone git@github.com:jiegec/xt_EQUALIZE.git $ make $ sudo make install $ sudo iptables -t filter -A INPUT -j EQUALIZE $ sudo dmesg -w & $ # Make some random network requests to see the effect! $ ping 1.1.1.1 $ ping 8.8.8.8 $ ping ::1 目前还没有把参数都变成可以配置的。如果真的有人需要这个模块的话,我再改吧(逃
在 macOS 上 TAP Interface 上启用 IPv6 自动配置
由于 macOS 对 TAP Interface 不会自动出现一个设置中对应的服务,所以需要手动进行配置。一番测试后,发现可以通过: $ sudo ipconfig set [tap_if] automatic-v6 $ sudo ipconfig set [tap_if] dhcp 启用系统自带的 dhcp 和 ra 功能。也许有方法可以把这些 tap 搬到系统的设置中去。 UPDATE: 可以把 TAP Interface 加到系统的设置中去。方法参考Virtual network interface in Mac OS X。完成以后可以直接通过系统设置界面进行配置。
在 macOS 下实现 GRETAP
由于没有找到 macOS 下现成的 GRETAP 实现,我就想到自己实现一个。由于tuntaposx提供了一个和 Linux 下基本一样的 TAP Interface,于是自己利用 raw socket 和 TAP Interface 实现了一下,主要方法: 打开 raw socket,读取收到的 proto 47 的包,判断是否为 GRETAP 包,是,则写入内层包到打开的 TAP Interface 中。 从 TAP Interface 中读入包,自己加上 GRE 头和 IP 头,然后发送。 主要的难度是在 raw socket 部分,macOS 继承了 BSD,与 Linux 不大一样。于是参考了SOCK_RAW Demystified,成功地实现了这个功能。 代码放在jiegec/gretapmac。写得并不高效,仅仅可用,用了一百多行。 UPDATE: 之后又随手实现了一个类似的协议,L2TPv3 over UDP。代码在jiegc/l2tpv3udptap。
在 WireGuard 构建的 Overlay Network 上跑 babel 路由协议
受 Run Babeld over Wireguard - Fugoes’s Blog 和 Route-based VPN on Linux with WireGuard 启发,自己也想尝试一下,在一个有多个结点的网络中,如何通过 WireGuard 构建一个 overlay network,并通过 babel 自动进行结点发现和路径选择。 首先建立点对点的 WireGuard Tunnel。由于我们用 babel 进行路由,所以我们不能采用 Wiregurad 本身基于目的地址的端口复用,所以每一个 WireGuard interface 都只有一个 Peer。 配置一个点对点的 WireGuard Tunnel: $ # for wg-quick $ cat wg0.conf [Interface] Address = IPV4/32, fe80::ID/64 PrivateKey = REDACTED ListenPort = PORT1 Table = off # ask wg-quick not to insert peer address into routing table [Peer] PublicKey = REDACTED AllowedIPs = 0.
更改 macOS 屏幕亮度的按键
由于我打开了「Invert Fn」功能,所以需要调亮度的时候,是采用 Fn+F1/F2 的方法。但是,我的机械键盘则是,不按 Fn 时为 1-9,按着 Fn 时为对应的 F1-F9,但是就无法调整亮度和声音了。 然后捣腾了一下,发现可以用 ScLk 和 Pa/Br(名称在各个键盘上不大一样)调整亮度。不过,还没发现如何更改音量。。。
向 Lenovo y1s 刷入 OpenWRT 17.01.5 固件,并把 IPv6 bridge 到内网中和配置认证脚本
首先参照OpenWRT Wiki - Lenovo Y1 v1找到刷固件教程: 下载Lenovo y1s 的固件备用 断开电源,等待一段时间,插入电源同时快速按下重置按钮,如果面板双闪,则说明进入了恢复模式 电脑连接到四个 LAN 口中任意一个,配置静态地址在 192.168.1.0/24 网段 打开 192.168.1.1 可以看到刷固件的页面 上传固件,等待路由器重启 配置 IP 地址为 DHCP 模式,打开 192.168.1.1 进行配置 然后就是常规的密码设置,opkg 源设置为 tuna 的源,配置 ssh 和 公钥。 接下来,我们为了使用学校的 SLAAC,采用 ebtables 直接把学校的 IPv6 bridge 进来,而 IPv4 由于准入系统,需要 NAT。 参考 Bridge IPv6 connections to WAN,下载 v6brouter_openwrt.sh 到某个地方,然后修改一下里面的一些参数: # For Lenovo y1s WAN_DEV=eth0.2 BRIDGE=br-lan # the rest remain unchanged 然后跑起来之后,自己的电脑可以成功拿到原生的 IPv6 地址了,不需要用难用的 NAT66 技术。 下一步是采用z4yx/GoAuthing。 $ go get -u -v github.
构建简易的 initramfs
一直对 Linux 的启动很感兴趣,但对 initrd 和 initramfs 等概念不大了解,于是上网找了资料,自己成功地看到了现象。 参考资料: Build and boot a minimal Linux system with qemu Custom Initramfs initramfs vs initrd ramfs, rootfs and initramfs The Kernel Newbie Corner: “initrd” and “initramfs”– What’s Up With That? 具体步骤: $ cat hello.c #include <stdio.h> #include <unistd.h> int main() { for (;;) { printf("Hello, world!\n"); } } $ gcc -static hello.c -o init $ echo init | cpio -o -H newc | gzip > initrd $ qemu-system-x86_64 -kernel /boot/vmlinuz-linux -initrd initrd -nographic -append 'console=ttyS0' # Use C-a c q u i t <Enter> to exit 可以看到过一会(三四秒?),可以看到满屏的 Hello world 在输出。
用 multicast 地址找到同一网段的主机
IPv4 : $ ping -t1 224.0.0.1 IPv6: $ ping -t1 ff02::1%iface