在 macOS 的 VirtualBox 上从 USB 启动

做了一个 Windows 10 安装 U 盘,想测试一下能不能启动,于是想用 VirtualBox 起一个虚拟机。但是发现,一般情况下要从 ISO 或者把 U 盘克隆成一个 vdi/vmdk etc 再启动。不过找到了 Cem Arslan 的 VirtualBox - Booting From USB (MAC) 实验了一下,确实可以用,以 /dev/disk2 为例方法如下: $ diskutil unmountDisk /dev/disk2 $ sudo chown $(whoami) /dev/disk2 $ VBoxManage internalcommands createrawvmdk -filename PATH_TO_VMDK -rawdisk /dev/disk2 $ # Now boot from VirtualBox 对于其它平台,可以参考 Tu Nguyen 的 How to boot from USB in VirtualBox 。 研究了一下生成的 vmdk 文件,大概是这样的: # Disk DescriptorFile version=1 CID=12345678 parentCID=ffffffff createType="fullDevice" # Extent description RW 12345678 FLAT "/dev/disk2" 0 # The disk Data Base #DDB ddb.

Read More

在 Ubuntu 上跨版本迁移 MongoDB

由于 MongoDB 只支持当前版本和上一个版本的数据库格式,然后刚刚滚系统升级的时候升级到了 3.6.x ,而数据库格式仍然是 3.2.x 的,于是需要先安装回 3.4.x 版本的 MongoDB,输入命令把数据库升级到 3.4.x 版本后,再用 3.6.x 的数据库进行升级。 以 从 Ubuntu 14.04 LTS 升级到 Ubuntu 18.04.1 LTS 为例,方法如下: $ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.4.17.tgz $ tar xvf mongodb-linux-x86_64-ubuntu1604-3.4.17.tgz $ cd mongodb-linux-x86_64-ubuntu1604-3.4.17/bin/ $ sudo ./mongod --config /etc/mongodb.conf & $ mongo > db.adminCommand( { setFeatureCompatibilityVersion: '3.4' } ) { "ok" : 1 } $ fg ^C $ sudo chown -R mongodb:mongodb /var/lib/mongodb $ sudo systemctl start mongodb $ mongo > db.

Read More

通过 SSH 隧道连接 ADB 和 Android 设备

由于本机算力不足,想要在远程编译 LineageOS ,其中有一步需要连接到已有的设备,于是突发奇想: adb 可以通过 网络连接 ssh 可以进行端口转发,这里是把 remote 的端口转发到 Android 设备上的端口。 方法如下: $ adb shell ip -f inet addr show wlan0 $ # remember the ip address here $ adb tcpip PORT1 $ ssh -R PORT2:ANDROID_IP:PORT1 REMOTE (remote)$ adb connect localhost:PORT2 # trust this device on Android 参考文档: How can I connect to Android with ADB over TCP? SSH PORT FORWARDING EXAMPLE

Read More

在 LEDE (OpenWrt) 上启用 wpad

WPAD(Web Proxy Auto-Discovery Protocol)是一个可以利用 dhcp 分发 pac 配置的协议。方法如下: $ # ssh to router first $ vim /etc/dnsmasq.conf dhcp-option=252,"http://router_ip/wpad.dat" $ vim /www/wpad.dat # put pac here $ service dnsmasq restart $ # ensure proxy is available to lan $ # enable wpad on devices 参考文档: Web Proxy Auto-Discovery Protocol Automatic Proxy Configuration with WPAD Deploying WPAD Example PAC File

Read More

在 Xcode 9 上启用 Vim 模拟(XVim 2)

作为一个不用 vim 编辑会死星人,用 Xcode 总是止不住自己想 Escape 的心。于是找到了 XVimProject/XVim2 进行配置。 大致方法如下: 按照 Signing Xcode 对 Xcode 进行重签名。套路和对 GDB 进行签名一样。不过这次,签名完成的时间可长多了,毕竟 Xcode 这么大。 接着按照项目的 README ,首先 git clone 然后 make ,第一次打开 Xcode 的时候选择 Load Bundle 即可。 终于可以满足我 Escape Xcode 的欲望了。

Read More

在 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.

Read More

通过 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 目前还没有把参数都变成可以配置的。如果真的有人需要这个模块的话,我再改吧(逃

Read More

在 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。完成以后可以直接通过系统设置界面进行配置。

Read More

在 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。

Read More

在 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.

Read More