在M系列苹果电脑上安装Redroid的完整指引

在M系列苹果电脑上安装Redroid的完整指引

Redroid是一个基于Linux内核的Android运行时环境,可以在Linux系统上运行Android应用。对于M系列苹果电脑用户来说,通过Docker可以轻松运行Redroid,从而在macOS上体验Android应用。本文将详细介绍安装和配置过程。

前置要求

在开始安装之前,请确保您的系统满足以下要求:

  • macOS 12.0 (Monterey) 或更高版本
  • Apple Silicon Mac (M1/M2/M3系列)
  • 已安装Docker Desktop for Mac
  • 至少8GB内存(推荐16GB或更多)
  • 至少10GB可用磁盘空间

安装步骤

1. 安装Docker Desktop

如果还没有安装Docker Desktop,请从官网下载并安装:

1
2
3
4
# 使用Homebrew安装(推荐)
brew install --cask docker

# 或者从官网下载:https://www.docker.com/products/docker-desktop

安装完成后启动Docker Desktop,确保Docker服务正常运行。

2. 拉取Redroid镜像

打开终端,运行以下命令拉取适合Apple Silicon的Redroid镜像:

1
2
3
4
5
# 拉取最新的Redroid镜像
docker pull redroid/redroid:latest

# 或者拉取特定版本的镜像(推荐)
docker pull redroid/redroid:12.0.0-latest

3. 启动Redroid容器

使用以下命令启动Redroid容器:

1
2
3
4
5
6
docker run -itd \
--name redroid \
--privileged \
-p 5555:5555 \
-v /tmp/redroid-data:/data \
redroid/redroid:12.0.0-latest

参数说明:

  • --name redroid: 容器名称
  • --privileged: 给予容器特权模式
  • -p 5555:5555: 端口映射,用于ADB连接
  • -v /tmp/redroid-data:/data: 数据卷挂载,保存应用数据

4. 安装ADB工具

为了与Redroid进行交互,需要安装Android Debug Bridge (ADB):

1
2
3
4
5
# 使用Homebrew安装ADB
brew install android-platform-tools

# 验证安装
adb version

5. 连接到Redroid

启动容器后,使用ADB连接到Redroid:

1
2
3
4
5
# 连接到Redroid
adb connect localhost:5555

# 检查设备状态
adb devices

如果连接成功,您应该看到类似以下的输出:

1
2
List of devices attached
localhost:5555 device

使用Redroid

启动Android界面

连接到Redroid后,您可以通过以下方式启动Android界面:

1
2
# 启动Android界面
adb shell am start -n com.android.launcher3/.Launcher

安装Android应用

您可以通过以下方式安装Android应用:

1
2
3
4
5
# 安装APK文件
adb install /path/to/your/app.apk

# 从Google Play下载的应用通常位于
# ~/Library/Application Support/Google Play/Downloads/

常用ADB命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看已安装的应用
adb shell pm list packages

# 卸载应用
adb shell pm uninstall com.example.app

# 截图
adb shell screencap /sdcard/screenshot.png
adb pull /sdcard/screenshot.png

# 录屏
adb shell screenrecord /sdcard/video.mp4
# 按Ctrl+C停止录屏
adb pull /sdcard/video.mp4

性能优化

内存和CPU配置

对于更好的性能,可以在启动容器时指定资源限制:

1
2
3
4
5
6
7
8
9
docker run -itd \
--name redroid \
--privileged \
--cpus=4 \
--memory=4g \
--memory-swap=4g \
-p 5555:5555 \
-v /tmp/redroid-data:/data \
redroid/redroid:12.0.0-latest

图形加速

Redroid支持硬件加速,但需要额外的配置。对于M系列芯片,建议使用软件渲染:

1
2
3
# 在容器内设置图形渲染模式
adb shell setprop ro.hardware.egl swiftshader
adb shell setprop ro.hardware.vulkan pastel

故障排除

常见问题

  1. 容器启动失败

    1
    2
    3
    4
    5
    6
    # 检查Docker日志
    docker logs redroid

    # 重新创建容器
    docker rm -f redroid
    docker run -itd --name redroid --privileged -p 5555:5555 redroid/redroid:12.0.0-latest
  2. ADB连接失败

    1
    2
    3
    4
    # 重启ADB服务
    adb kill-server
    adb start-server
    adb connect localhost:5555
  3. 应用安装失败

    1
    2
    3
    4
    5
    # 检查APK文件完整性
    adb install -r /path/to/app.apk

    # 查看详细错误信息
    adb logcat

性能问题

如果遇到性能问题,可以尝试:

  1. 增加容器内存分配
  2. 关闭不必要的后台应用
  3. 使用更轻量级的Android版本镜像

高级配置

网络配置

如果需要配置网络代理或VPN:

1
2
3
4
5
# 设置HTTP代理
adb shell settings put global http_proxy host:port

# 清除代理设置
adb shell settings put global http_proxy :0

文件传输

在macOS和Redroid之间传输文件:

1
2
3
4
5
# 从macOS复制文件到Redroid
adb push /path/to/local/file /sdcard/

# 从Redroid复制文件到macOS
adb pull /sdcard/file /path/to/local/

总结

通过以上步骤,您就可以在M系列苹果电脑上成功运行Redroid了。Redroid提供了一个轻量级的Android运行环境,适合开发测试、应用调试或简单的Android应用使用。

注意事项

  • Redroid主要用于开发和测试,不建议用于生产环境
  • 某些需要特殊硬件支持的应用可能无法正常运行
  • 定期备份重要数据,避免数据丢失
  • 关注Redroid的更新,及时升级到最新版本

相关资源

希望这篇指引能帮助您成功在M系列苹果电脑上安装和使用Redroid!

Install Home Assistant on Proxmox VE

在 Proxmox VE(PVE)中安装 Home Assistant OS(HAOS)使用 qcow2 镜像文件是一个相对简单的过程。以下是详细的步骤,基于你已经下载了最新的 haos_ova-<version>.qcow2.xz 文件(如 haos_ova-15.2.qcow2.xz)。我将假设你使用的是 Proxmox VE 8.x,并提供手动安装的步骤,同时确保解决可能的常见问题。


准备工作

  1. 确认环境

    • 你需要有 Proxmox VE 已安装并可访问(通过 Web 界面或 SSH)。
    • 确保已下载最新的 Home Assistant OS qcow2 镜像文件(从 Home Assistant GitHub Releases)。
    • 确保你的存储池(如 local-lvmlocal-zfs)有足够空间存储解压后的 qcow2 文件(解压后约为 2-4GB,建议至少预留 32GB 用于 VM 磁盘)。
  2. 推荐硬件配置

    • CPU:至少 2 核。
    • 内存:至少 4GB(推荐 4-8GB)。
    • 存储:至少 32GB(Home Assistant 推荐)。

安装步骤

1. 上传并解压 qcow2 镜像文件

  1. 将压缩的 qcow2 文件上传到 Proxmox

    • 使用 SSH 或 SCP 将下载的 haos_ova-<version>.qcow2.xz 文件传输到 Proxmox 主机。例如,传输到 /root 目录:
      1
      scp haos_ova-15.2.qcow2.xz root@<proxmox-ip>:/root/
      或者,你可以在 Proxmox 主机上使用 wget 直接下载:
      1
      2
      cd /root
      wget https://github.com/home-assistant/operating-system/releases/download/15.2/haos_ova-15.2.qcow2.xz
  2. 安装 xz-utils(如果未安装)并解压文件

    • 在 Proxmox 主机上,安装解压工具:
      1
      2
      apt update
      apt install xz-utils
    • 解压 qcow2 文件:
      1
      unxz /root/haos_ova-15.2.qcow2.xz
      解压后会生成 haos_ova-15.2.qcow2 文件。
  3. (可选)清理空间

    • 如果空间有限,可以在后续步骤完成后删除原始的 .xz 文件:
      1
      rm /root/haos_ova-15.2.qcow2.xz

2. 创建虚拟机

  1. 登录 Proxmox Web 界面

    • 打开浏览器,访问 https://<proxmox-ip>:8006,登录 Proxmox。
  2. 创建新的虚拟机

    • 点击右上角的 Create VM
    • 配置以下设置:
      • General
        • VM ID:选择一个唯一的 ID(如 100)。
        • Name:设置为 home-assistant 或其他你喜欢的名称。
      • OS
        • 选择 Do not use any media(因为我们稍后会导入 qcow2 镜像)。
      • System
        • BIOS:选择 OVMF (UEFI)(Home Assistant 需要 UEFI 启动)。
        • EFI Storage:选择你的存储池(如 local-lvmlocal-zfs)。
        • Pre-Enroll Keys取消勾选(禁用 Secure Boot,否则可能导致启动失败)。
        • Machine:选择 q35(推荐)。
      • Hard Disk
        • 删除默认的磁盘(点击垃圾桶图标),因为我们将使用导入的 qcow2 镜像。
      • CPU
        • 分配至少 2 核(推荐)。
      • Memory
        • 分配至少 4096 MB(4GB,推荐 4-8GB)。
      • Network
        • 选择 virtio 网卡,桥接到 vmbr0(或你的网络桥接)。
      • Confirm
        • 取消勾选 Start after created(我们需要先导入磁盘)。
        • 点击 Finish 创建 VM。

3. 导入 qcow2 镜像

  1. 使用 qm importdisk 命令导入镜像

    • 在 Proxmox 主机上通过 SSH 或 Web 界面的 Shell 执行:
      1
      qm importdisk <VM-ID> /root/haos_ova-15.2.qcow2 <storage> --format qcow2
      • 替换 <VM-ID> 为你创建的虚拟机 ID(如 100)。
      • 替换 <storage> 为你的存储池名称(如 local-lvmlocal-zfs)。
      • 示例:
        1
        qm importdisk 100 /root/haos_ova-15.2.qcow2 local-lvm --format qcow2
    • 导入完成后,输出的最后一行会显示类似 Successfully imported disk as 'unused0:local-lvm:vm-100-disk-0'
  2. 将导入的磁盘添加到虚拟机

    • 返回 Proxmox Web 界面,选择你的虚拟机(VM ID 如 100)。
    • 进入 Hardware 标签,找到 Unused Disk 0(如 unused0:local-lvm:vm-100-disk-0)。
    • 点击 Edit,设置:
      • Bus/Device:选择 SCSI,端口为 0
      • Discard:如果使用 SSD,勾选此选项以启用 TRIM 支持。
      • 点击 Add
    • 现在磁盘会显示为 Hard Disk (scsi0)
  3. 调整磁盘大小(可选)

    • Home Assistant 推荐至少 32GB 磁盘空间。如果导入的 qcow2 磁盘较小,可以扩展:
      • Hardware 标签,选择 Hard Disk (scsi0),点击 Resize disk
      • 输入增加的容量(例如,输入 26 表示增加 26GB,使总大小达到约 32GB)。
  4. 配置 EFI 磁盘

    • Home Assistant 需要 EFI 磁盘以支持 UEFI 启动。
    • Hardware 标签,点击 Add > EFI Disk
    • 选择存储池(如 local-lvm),取消勾选 Pre-Enroll Keys,点击 OK
  5. 设置启动顺序

    • 进入虚拟机的 Options 标签,双击 Boot Order
    • 勾选 scsi0(Home Assistant 磁盘),取消勾选其他选项(如 ide2net0)。
    • 点击 OK 保存。
  6. 启用 QEMU Guest Agent(可选但推荐)

    • Options 标签,双击 QEMU Guest Agent,勾选 Enabled
    • 这有助于 Proxmox 监控和管理 VM。

4. 启动虚拟机并验证

  1. 启动虚拟机

    • 在 Proxmox Web 界面,选择你的虚拟机,点击 Start
  2. 检查控制台

    • 打开虚拟机的 Console(在 Web 界面)。
    • 如果启动成功,Home Assistant 会显示一个欢迎界面,并提供访问地址,如 http://homeassistant.local:8123http://<VM-IP>:8123
  3. 访问 Home Assistant

    • 在浏览器中输入 http://<VM-IP>:8123http://homeassistant.local:8123(如果你的网络支持 mDNS)。
    • 按照提示设置管理员账户、位置等信息,完成 Home Assistant 初始化。

5. 清理(可选)

  • 导入完成后,可以删除 Proxmox 主机上的原始 qcow2 文件以释放空间:
    1
    rm /root/haos_ova-15.2.qcow2

常见问题及解决方法

  1. 启动失败,显示 “Access Denied” 或 UEFI 错误

    • 原因:可能是启用了 Secure Boot 或未正确配置 EFI 磁盘。
    • 解决
      • 确保在创建 VM 时选择了 OVMF (UEFI),并取消勾选 Pre-Enroll Keys
      • 如果仍失败,在 VM 启动时按 Esc 进入 UEFI 菜单,导航到 Device Manager > Secure Boot Configuration,禁用 Attempt Secure Boot
    • 检查是否正确设置了启动顺序(仅 scsi0 启用)。
  2. 导入磁盘失败,提示文件不存在

    • 原因:可能是路径错误或文件名拼写错误(如 .qcow2 误写为 .gcow2)。
    • 解决
      • 使用 ls /root 确认文件存在且名称正确。
      • 确保解压命令 (unxz) 已成功执行。
      • 示例错误修复:qm importdisk 100 /root/haos_ova-15.2.qcow2 local-lvm --format qcow2
  3. 无法访问 Web 界面

    • 原因:可能是网络配置错误或防火墙阻止了端口 8123。
    • 解决
      • 确保 VM 的网络桥接(vmbr0)正确配置。
      • 检查 Proxmox 主机或网络的防火墙规则,允许端口 8123。
      • 使用 VM 控制台查看分配的 IP 地址,或尝试 http://homeassistant.local:8123(需要 mDNS 支持)。
      • 如果 IP 不显示,检查网络是否分配了 DHCP 地址,或考虑设置静态 IP。
  4. 磁盘性能问题

    • 原因:未启用 Discard 或未优化存储设置。
    • 解决
      • 如果使用 SSD,确保在添加磁盘时勾选 Discard
      • 使用 virtio-scsi-pci 作为 SCSI 控制器以提高性能。
  5. SSH 访问 Home Assistant

    • Home Assistant OS 默认不启用 SSH。你需要在 Home Assistant Web 界面中安装 SSH & Web Terminal 插件:
      • 进入 Settings > Add-ons > Add-on Store,安装 SSH & Web Terminal
      • 配置并启用 SSH 访问。
    • 或者,使用 Proxmox 的 VM 控制台进行调试。

额外建议

  • 备份:安装完成后,配置 Proxmox 备份到外部存储(如 NFS 或 Proxmox Backup Server),以便在需要时恢复 VM。
  • 更新:定期检查 Home Assistant OS 的新版本,下载新的 qcow2 镜像并重复上述步骤以升级(或使用 Home Assistant 内置更新功能)。
  • 脚本自动化(可选):如果你不想手动执行这些步骤,可以使用社区提供的脚本(如 tteck/Proxmox),但请仔细审查脚本内容以确保安全。

示例命令总结

假设 VM ID 为 100,存储为 local-lvm,Home Assistant 版本为 15.2

1
2
3
4
5
6
7
8
9
10
# 解压镜像
apt install xz-utils
cd /root
unxz haos_ova-15.2.qcow2.xz

# 导入磁盘
qm importdisk 100 /root/haos_ova-15.2.qcow2 local-lvm --format qcow2

# (在 Web 界面配置 VM 后)启动 VM
qm start 100

参考资料

万兆光纤内网的初体验

为啥要折腾

家里在装宽带时,为了更美观让电信师傅把光纤拉到了餐厅的吊顶上面,然后再通过网线拉到两个房间。但从去年开始,预埋的网线可能是因为质量问题,无法达到千兆满速,有时甚至从NAS上拷贝文件,还不如外网下载快…… 所以寻思优化内网质量,初步方案有两个:2.5G网线方案、10G万兆光纤方案。

2.5G内网方案

这个方案比较简单自然,因为我的NAS有两个2.5G网口,支持链路聚合;工作用的小主机,也有几个2.5G网口,瓶颈其实是在网线和交换机上。

网线比较简单,为了布线方便,直接购买了山泽的超细铜线: https://item.jd.com/3109393.html 走墙角的话,几乎可以做到隐形效果。

交换机就纠结了,最便宜的水星五口2.5G交换机,也要118块,不支持国补 (https://item.jd.com/100119130137.html);而4*2.5G + 2*万兆光口,支持 VLAN、端口聚合、网管交换机的水星 SE106 Pro,国补后也在 120+ 左右,这不是逼着人上光纤方案嘛?

万兆光纤方案

SFP+传输介质选择

首先遇到的问题是 SFP+ 是什么东西?

名称 SFP+高速线缆 10GBASE-T电口模块 SFP+光模块
传输介质 双绞线 双绞线 光缆
连接器类型 一体化 RJ45 LC
传输距离 7m 30m 大于100m
布线系统 铜缆布线 光缆布线
传输速率 10Gbps 10Gbps 10Gbps
  • SFP+高速线缆只有7m,不满足需求直接淘汰。
  • 万兆电口有UP主反映,发热量巨大,稳定性差。
  • 基本锁定 SFP+ 光模块方案。

光线缆

分为三种:

  • AOC光线缆:光模块和光纤一体化,定长,两端为光收发器,短距离可替代光模块和光纤。
  • 光跳线:一定长度的光纤搭配光连接器构成,需搭配匹配的光模块。
  • 尾纤:一端有连接头,另一端是光缆纤芯的断头,需通过熔接和其他光缆纤芯相连。

家庭内部一般推荐选择AOC光线缆,简单、可靠,不需要考虑连接器、光模块、单模多模这些复杂参数。

光纤类型

光纤按传输模式分为单模光纤(Single Mode Fiber)和多模光纤(Multi Mode Fiber)。光以一特定的入射角度射入光纤,在光纤和包层间发生全发射,当直径较小时,只允许一个方向的光通过,即为单模光纤;当光纤直径较大时,可以允许光以多个入射角射入并传播,此时就称为多模光纤。

一般来说,单模光纤纤芯更细,干扰更小,支持更长距离和更高带宽,但对激光器要求更高,总体成本更高;多模光纤光源成本低、功耗小,适合短距离高速传输。

AOC光线缆中,多模光纤(OM3/OM4/OM5)占大多数,成本低,功耗小,适合家庭这种短距离互联。

闲鱼二手市场,Finisar 菲尼萨 AOC 万兆光纤线,7米的价格在 10元左右。京东主流品牌则在 100元出头。

可以根据线缆的颜色分辨不同类型的光纤。

光纤类型 标准外皮颜色 典型应用场景
单模光纤 (SMF) 黄色 长距离传输(如城域网、骨干网)
多模光纤 (OM1) 橙色 短距离(≤ 1Gb/s,传输距离约275米)
多模光纤 (OM2) 橙色 短距离(≤ 10Gb/s,传输距离约550米)
多模光纤 (OM3) 水蓝色 高速短距(10G/40G/100G,传输距离300米)
多模光纤 (OM4) 紫色 超高速短距(40G/100G/400G,传输距离550米)
多模光纤 (OM5) 青柠绿 多波长复用(SWDM,支持400G/800G)
特种光纤 黑色/其他 抗弯曲、耐高温等特殊场景

光模块连接器

如果选择光跳线方案,需要考虑光模块和连接器。

一、按物理结构分类(连接器类型)

不同连接器主要在尺寸、锁定机制、适用场景上存在差异:

连接器类型 特点 适用场景 常见端面类型
FC - 金属套圈,螺纹旋转锁定
- 高稳定性,抗振动
电信网络、单模长距离传输 PC / APC
ST - 卡口式锁定(类似BNC接头)
- 常用于多模光纤
旧式局域网、监控系统 PC
SC - 方型插拔式,推拉锁定
- 结构简单,易插拔
数据通信、PON网络 PC / APC / UPC
LC - 小型化设计(SC的一半尺寸)
- 高密度连接
数据中心、高密度布线(如SFP模块) UPC / APC
MTRJ - 双芯一体式(收发一体)
- 塑料材质,紧凑设计
短距离多模通信(如企业网) PC

关键区别

  • 尺寸:LC < SC < FC ≈ ST < MTRJ(双芯)。
  • 锁定方式:FC(螺纹) vs. ST(卡口) vs. SC/LC(插拔) vs. MTRJ(卡扣)。
  • 密度:LC > SC > MTRJ > ST > FC。

二、按端面研磨方式分类

端面研磨方式直接影响反射损耗(回波损耗),需根据场景选择:

端面类型 特点 反射损耗 颜色标识 适用场景
PC - 球面研磨
- 较早的标准
~ -40 dB 蓝色/米色 普通多模光纤(OM1/OM2)
UPC - 超物理接触(更精细的球面研磨)
- 低反射
~ -55 dB 蓝色 高速单模/多模(OM3/OM4)
APC - 8°斜面研磨
- 反射光从纤芯逸出,回损最低
~ -65 dB 绿色 高要求单模(如CATV、5G)

关键区别

  • 反射损耗:APC > UPC > PC(数值越小,反射越少)。
  • 颜色标识:APC端面通常为绿色,UPC为蓝色,PC为米色或黑色。
  • 兼容性:APC与UPC/PC端面不能混接(斜面与平面不匹配)。

三、连接器与端面组合的典型应用

  1. FC/APC:单模长距离传输(如光纤到户FTTH)。
  2. LC/UPC:数据中心高速模块(100G/400G光模块)。
  3. SC/APC:广电网络(CATV)或5G前传网络。
  4. ST/PC:旧式监控系统或多模局域网。

家庭一般选择 SC大方口、LC小方口,这两种接头的光模块也最便宜,闲鱼上直接选购即可。

万兆交换机

下篇继续。

Docker Swarm in Alpine

Docker Swarm in Alpine

Install alpine

  1. Boot with alpine ISO
  2. Run setup-alpine and follow the instructions
  3. Reboot when ready.

Install docker

Make sure you have community repository enabled.

/etc/apk/repositories

1
2
http://mirrors.ustc.edu.cn/alpine/v3.19/main
http://mirrors.ustc.edu.cn/alpine/v3.19/community
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# install docker
apk add docker

# add openrc service manager
apk add openrc

# run docker at boot
rc-update add docker boot

# check docker service status
rc-service docker status

# start/restart docker if necessary
rc-service docker start
rc-service docker restart

Init docker swarm

1
docker swarm init

Use the command on the screen to join this swarm, or run docker swarm join-token manager to recall the join command anytime.

On other server, install docker and run following command:

1
docker swarm join --token SWMTKN-1-58ke7scnx4zolgfoce8r4ijnehci78ac9nl48g3txrf4bydvdo-by9hhrndcvq9eqk5hblb92dee 10.10.1.50:2377

docker mirror

1
2
mkdir /etc/docker
vi /etc/docker/daemon.json

cat /etc/docker/daemon.json

1
2
3
4
5
6
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}

Install portainer

1
2
3
4
5
6
apk add curl
curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml
docker stack deploy -c portainer-agent-stack.yml portainer

# check the service list
docker service list

If you receive 0 replicas, check your network or docker mirror config.

1
2
3
ID             NAME                  MODE         REPLICAS   IMAGE                        PORTS
xr2c6kip60l4 portainer_agent global 0/1 portainer/agent:lts
jsf5xzk210f0 portainer_portainer replicated 0/1 portainer/portainer-ce:lts *:8000->8000/tcp, *:9000->9000/tcp, *:9443->9443/tcp

If everything goes well, you will receive:

1
2
3
ID             NAME                  MODE         REPLICAS   IMAGE                        PORTS
xr2c6kip60l4 portainer_agent global 1/1 portainer/agent:lts
jsf5xzk210f0 portainer_portainer replicated 1/1 portainer/portainer-ce:lts *:8000->8000/tcp, *:9000->9000/tcp, *:9443->9443/tcp

Now you can visit https://10.10.1.50:9443/ to init admin.

App Templates

Navigate to Settings - General on portainer web console, set App Templates URL to https://storage.360buyimg.com/blogimages/portainer_templates.json, then you can see application templates list on Templates - Application.

给子域名增加SSL自动续期

给子域名增加SSL自动续期

写给腾讯云的一个笔记。

背景

现在免费 SSL 的有效期全面下调至 90 天,自动续期成为必须。atzlinux.com 的多个子域名,用于各下载镜像使用,这就涉及到这些子域名的SSL证书的自动续期问题。

工具选择

个人推荐 acme.sh ,https://github.com/acmesh-official/acme.sh

国内运营商给家庭宽带的 80 端口全部屏蔽了,HTTP验证的路走不通,只能采用 DNS 验证的方式。而 acme.sh 集成了主流的 DNS 验证插件,可以非常简单的完成DNS验证和证书的续期。

权限控制

各下载镜像在 DNS 验证时,需要用到DNS提供商侧的密钥,这个密钥一般可以管理整个域名下的全部 DNS 记录,风险极高。
好在腾讯云提供了「域名共享」的细粒度权限管控能力,能把一个子域名共享给另外一个腾讯云主账号,授权其管理该子域名及下级孙域名。

操作步骤

一、域名共享(主域名账号)

在腾讯云解析管理下,增加域名共享

subdomain-grant

二、子账号策略创建(子域名账号)

考虑到子域名的账号下还有其他的资产,可以创建一个子账号,仅授予对应域名的权限。

首先,创建一个自定义策略:
subdomain-policy

也可以直接使用 JSON 文件创建,自己修改其中的 uin 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"statement": [
{
"action": [
"dnspod:*"
],
"effect": "allow",
"resource": [
"qcs::dnspod::uin/8******2:domain/mike.atzlinux.com"
]
}
],
"version": "2.0"
}

三、子账号账号创建(子域名账号)

然后创建子账号,绑定刚建好的自定义策略

subdomain-accoumt

四、获取 API 密钥(子域名账号)

在子账号的详情页中,点击 API 密钥 Tab,新建密钥。复制保存好。

subdomain-apikey

五、安装 acme.sh 并生成证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装
curl https://get.acme.sh | sh -s email=my@example.com

# 保存 API 密钥
cat <<EOF >> ~/.acme.sh/acme.sh.env
export Tencent_SecretId="XXXXXXXX"
export Tencent_SecretKey="XXXXXXXXX"
EOF

# 申请证书
acme.sh --issue --dns dns_tencent -d mike.atzlinux.com -d *.mike.atzlinux.com --debug

# 部署证书到 Nginx
acme.sh --install-cert -d mike.atzlinux.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx reload"

成功后,acme.sh 会自动增加 crontab,定期续期证书,证书更新成功后,会自动重启 Nginx 使之生效。

六、验证证书有效性

使用 curl 命令确保证书已经更新:

1
2
3
4
5
6
7
8
$ curl -v -I https://mike.atzlinux.com:58888/ 2>&1 | grep -A6 'Server certificate'
* Server certificate:
* subject: CN=mike.atzlinux.com
* start date: Feb 11 01:57:39 2025 GMT
* expire date: May 12 01:57:38 2025 GMT
* subjectAltName: host "mike.atzlinux.com" matched cert's "mike.atzlinux.com"
* issuer: C=US; O=Let's Encrypt; CN=E5
* SSL certificate verify ok.

或者使用浏览器查看。

Nginx的安全配置

Nginx的安全配置

2025年,WEB服务的安全有哪些变化吗?

自动申请证书

见下一篇笔记。

证书使用建议

注意选用 fullchain 证书,单证书证书容易造成中间证书不识别的问题。

1
2
ssl_certificate /etc/nginx/ssl/hk2.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/hk2.key;

禁用低版本的协议

只启用 TLS v1.3 和 TLSv1.2

1
ssl_protocols      TLSv1.2 TLSv1.3;

控制使用的算法白名单

1
2
3
ssl_ecdh_curve X25519:prime256v1:secp384r1;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

生成专有的DH参数

1
2
cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096
1
ssl_dhparam /etc/ssl/certs/dhparam.pem;

启用OCSP装订

用新协议检查证书的吊销情况。

1
2
3
4
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

CA白名单

配置仅白名单的CA才能为某个域名

1
ssl_trusted_certificate /etc/nginx/ssl/hk2-ca.cer;

安全相关头

1
2
3
add_header Strict-Transport-Security max-age=31536000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

Gualys SSL Labs A+

Gualys SSL Labs A+

OpenWrt on Time Cloud

目标

这个小盒子主要是满足了几个小功能:

  1. 从外地连回家中内网
  2. 家中科学上网
  3. Windows激活
  4. 文件共享
  5. 对外提供Web服务

实现方法有很多种,这里记录下我的实践。

OpenWrt

我使用的硬件是2017年149元购入的迅雷下载宝,小巧、省电、足够强大。256M RAM,16MB Flash,主频880MHz,Ramips/mt7621 架构,软件包架构 mipsel_24kc,芯片是联发科的 MediaTek MT7621A。并且它带有千兆网口、SDCard插槽、USB 3.0接口,又非常容易刷机,可玩性十足。

官方固件:https://openwrt.org/toh/hwdata/thunder/thunder_timecloud

官方固件好在安全,没有人夹带私货,但毛病是不够精简,16MB Flash装完系统后没啥空间装软件了。所以之前我是基于官方源码自己定制编译,移除大量用不上的功能,并增加常用的软件包,比如SDCard支持、文件系统支持等。

最近比较懒了,所以就直接用了网友的构建服务: https://openwrt.ai/

需要移除定制的包:

1
-luci-app-fileassistant -luci-app-advancedplus -nano -odhcp6c -odhcpd-ipv6only -ppp -ppp-mod-pppoe -luci-app-upnp kmod-sdhci kmod-sdhci-mt7620

配置信息,替换 localStorage 中的 op-custom-info 值:

1
models=Thunder+Timecloud&box-model=s905d&cpackages=-luci-app-fileassistant+-luci-app-advancedplus+-nano+-odhcp6c+-odhcpd-ipv6only+-ppp+-ppp-mod-pppoe+-luci-app-upnp+kmod-sdhci+kmod-sdhci-mt7620+wireguard-tools+vlmcsd&passwall=on&ipaddr=10.10.1.2&theme=bootstrap&kernel_v=6.1.10&webserver=nginx&side=on&gateway=10.10.1.1&efi=on&save=on

构建,下载固件刷机完事。

SSH Public Key Authentication

Why Public Key Authentication

A weak password is dangerous while a strong password is hard to remember.

For security and convience sake, we should disable password authentication and use Public Key Authentication instead.

Public Key Authentication in OpenSSH is easy

Copy Public Key to remote host

OpenSSH has a built-in command to do this:

1
ssh-copy-id -p 22 user@remote.host.com

This will copy the default public key to remote server, and append to the ~/.ssh/authorized_keys file.

If you want to specify a key other that the default one, try the -i option:

1
ssh-copy-id -i ~/.ssh/id_ed25519 user@remote.host.com

Note the permission of the private key should be readable only for you, e.g chmod 600 ~/.ssh/id_ed25519.

Login with the Public Key Authentication

You can simply type:

1
ssh user@remote.host.com

The ssh client will attempt the keys to find the correct one.

1
2
3
4
5
~/.ssh/id_rsa
~/.ssh/id_dsa
~/.ssh/id_ecdsa
~/.ssh/id_ed25519
~/.ssh/id_xmss

Disable password authentication

Set configs below in /etc/ssh/sshd_config, and restart the sshd with /etc/init.d/sshd restart

1
2
PasswordAuthentication no
PubkeyAuthentication yes

Public Key Authentication in Dropbear SSH

Dropbear is a lightweight ssh server for embedded devices, and it’s the default ssh server on a OpenWrt router.

When you are using Dropbear ssh server, ssh-copy-id won’t work.

Set the public key using LuCI

If you have a LuCI installed, it’s easy to add a key using the web interface. Navigate to System - Administration - SSH-Keys to make it happen.

System - Administration - SSH-Keys

Set from the command-line

1
echo `YOUR PUBLIC CONTENT` >> /etc/dropbear/authorized_keys

avrdude: stk500_recv(): programmer is not responding

新到手arduino pro mini,马上焊好针脚,下载arduino IDE,烧写了个blink进去。一切顺利,程序完美运行。

但当想修改下参数,再烧新程序时,问题就来了。IDE提示:
avrdude: stk500_recv(): programmer is not responding

编程器不响应??这么快就坏掉应该是不可能的。Google搜索也没在国内社区发现有什么有用的信息,最后在stackoverflow得到了答案。

0、确认链路无误;
1、确认板卡类型、串口类型(现在一般通过USB)选对。
2、打开IDE的调试模式,输出详细信息。
3、在Send [30] [20]之前,按一下板卡上的RESET按钮。

 

choose-arduino choose-serial choose-verbose-mode choose-timeframe-to-reset

新手遇到的,估计99%都是上面的第3点没做。

node v0.8+ compiling

To build:

Prerequisites (Unix only):

  • Python 2.6 or 2.7
  • GNU Make 3.81 or newer
  • libexecinfo (FreeBSD and OpenBSD only)

如果不想升级系统make版本,可以在其他目录安装一个,再alias过去。

常用错误:
out/Release/linker.lock: No such file or directory
解决方法:
export FLOCK
export LINK=g++