On The Luna - 技术类杂谈
type: channel
link: https://blog.iks.moe/category/tech-misc/
description: 一般是一些新方法或偏方之类的。
items: 在 Microsoft Azure 上创建基本 (Basic) SKU 的公共 IPv4 地址
items: 利用 Zoho Mail 的传出 Webhook 功能推送新邮件通知
items: 在 Intel(R) J4125 承载的 Proxmox VE 虚拟机上安装 Windows 11 IoT Enterprise LTSC 2024 并直通网卡
items: Windows(R) Vista(TM) 安装体验——以 VMware Workstation Pro 为例
items: Debian 10 (Buster) 及以上的发行版软件包源安装 MySQL 5.6.51
items: AlphaSSL 新证书 GlobalSign GCC R6 AlphaSSL CA 2023 证书链修复教程
items: 解决 Oracle Cloud 计算实例因 DHCP 服务器下发配置变动导致 IPv6 地址失效的问题
items: OpenWrt 实现 PXE 服务器 (TFTP+NFS) 以引导无盘工作站 (Ubuntu 22.04 LTS)
items: 使用非 Docker 方案在腾讯云轻量应用服务器上搭建密码管理软件 Vaultwarden (Bitwarden_rs)
items: 在使用 WLAN 联网的树莓派上安装 Proxmox VE 并创建虚拟机

在 Microsoft Azure 上创建基本 (Basic) SKU 的公共 IPv4 地址
type: item
date: 2025-11-18T20:45:00+08:00
description: [scode type="yellow"]此文章的部分内容可能使用了机器或 AI 翻译的 zh-MS 语言。[/scode]TL;DR2025 年 3 月 31 日后，在 Azure 上创建基本 SKU 公共 IP 地址 (Public IP Address - Basic) 需要通过 Azure CLI 或 Azure PowerShell 等方式实现，而无法通过 Azure 门户 (Portal) 实现；且晚于此日期创建的订阅 (Subscription) 的基本 SKU 公共 IP 地址的配额 (quota) 为 0 个，必须通过 Azure 支持 (support) 请求 (request) 调整 (adjust) 其配额并获许后才能创建相应资源 (resource)。前言本文旨在描述在 2025 年 3 月 31 日后的 Microsoft Azure 上通过 Azure 支持提高基本 SKU 公共 IP 地址的配额，以及通过 Azure 门户提供的 Cloud Shell 运行 Azure CLI 创建基本 SKU 公共 IP 地址的操作过程。Microsoft 早在 2022 年 10 月便宣布 (announce) 了将于 2025 年 9 月 30 日停用 (retired) Azure 的基本 SKU 公共 IP 地址这一计划并给出了时间线：2025 年 3 月 31 日后新的基本 SKU 公共 IP 地址将无法被创建，而此前创建的相应资源则可以继续工作；2025 年 9 月 30 日后停用基本 SKU 公共 IP 地址，此后它们将无法被使用；Azure 扩展支持 (extended support) 用户不受上述停用之影响。以微软这个年过半百的老公司、大公司的一贯作风，这个改动不一定会完全实装。2025 年 3 月 31 日一过，Azure 门户便如期无法直接从公共 IP 地址介面中直接创建基本 SKU 公共 IP 地址，新创建的 Azure 订阅亦被取消相应的配额。但不久之后，有用户发现在 Azure 门户的 NIC 介面可以间接地创建基本 SKU 公共 IP 地址，不过微软很快封堵了这个渠道。不过与此同时，在 Azure 门户其他服务的介面的请求创建公共 IP 地址的选项卡上出现了温馨提示：「如果您暂时需要创建公共 IP 地址基本 SKU，请使用 Azure CLI 或 Azure PowerShell。」直至本文截稿，大多数订阅的基本 SKU 公共 IP 地址的配额依旧没有变化，且有相应配额的订阅的用户仍然能通过 Azure CLI 或 Azure PowerShell 创建基本 SKU 公共 IP 地址。〇、先决条件如果没有 Azure 订阅，请在开始之前创建一个免费帐户。同时需要准备一个资源组 (resource group) 以便被指定为创建基本 SKU 公共 IP 地址时的目标资源组。一、请求调整配额导航至 https://portal.azure.com/#view/Microsoft_Azure_Capacity/QuotaMenuBlade/~/myQuotas 以查看当前配额。Provider 选择 Networking，搜索框输入 Public IPv4 Addresses - Basic 即可查看各个区域 (region) 的基本 SKU 公共 IP 地址的配额。如果该值不为 0，则无需请求调整配额；如果该值为 0，说明该订阅不具有基本 SKU 公共 IP 地址的配额，需要请求调整配额。单击需要请求调整配额的区域所在行最右侧的「请求调整 (Request adjustment)」图标，导航至「新建支持请求 (New support request)」介面。在「配额详细信息 (Quota details)」选项卡中再次确认「位置 (Location)」和「资源 (Resources)」，并在「新限制 (New Limit)」输入框中键入一个处于 1 至 10 之间的整数，然后单击「保存并继续 (Save and continue)」按钮以将信息暂存至「新建支持请求 (New support request)」介面。检查其他信息后单击「下一步 (Next)」按钮，进入到「审阅并创建 (Review + create)」流程。再次确认相关信息是否正确，然后单击「创建 (Create)」按钮以提交支持请求。导航至 https://portal.azure.com/#view/Microsoft_Azure_Support/HelpAndSupportBlade/~/overview 以查看支持请求的处理状态；同时亦可观察配额介面相应地区的相应配额的值是否有变化。若相应区域的 Public…

利用 Zoho Mail 的传出 Webhook 功能推送新邮件通知
type: item
date: 2025-07-30T23:47:00+08:00
description: 前言本文适用于接受以 POST 方法提交 JSON 体的 API 对端的通知解决方案，此案以 Telegram Bot 为例。以前的 Gmail Bot 还是很好用的，对于笔者这种重度用户来说登录网页来看邮件的时效性和便捷性都不如早起醒来瞄一眼 Bot 分类栏里出现的小红点——虽是十余年前的迷思，在手机上使用邮件 App 查看或同步邮件的话，其本家邮件（或是委托其同步的邮件）基本都是通过系统推送渠道告知用户新到的，若没有提供商的支持，透过 POP 等协议来同步的能耗和及时性都不及打开 IM 听任联系人 Q 我 8。Zoho Mail 虽然也有 App，但其商用办公解决方案提供的 Webhook 显然更简洁，为什么不用这种更为优雅的耦合方式呢？本文不涉及到对传入 Webhook 或 API 的操作，因此这里不介绍 Bot 侧的工作，直接从创建 Zoho Deluge 函数开始。配置 Zoho Mail 的 DRE 函数需要组织机构管理员「启用集成」https://mailadmin.zoho.com/cpanel/home.do#otherApps/integrations/settings （默认已经启用）访问 https://mail.zoho.com/zm/#settings/integrations-settings/DeveloperSpace/dre 并单击「创建函数」，自定义「函数名称」，「类别」选择「传出 Webhook」，在新出现的窗口粘贴以下内容：info Body; newLine = hexToText("0A"); summaryValue = Body.get("summary"); subjectValue = Body.get("subject"); senderValue = Body.get("sender"); messageIdValue = Body.get("messageId"); fromAddressValue = Body.get("fromAddress"); modeValue = Body.get("Mode"); notifyHeader = "You have a new mail."; chatIdValue = "114514191"; messageText = notifyHeader + newLine + "✉ " + "" + senderValue + "" + " <" + "" + fromAddressValue + "" + "> " + newLine + subjectValue + newLine + newLine + summaryValue; linkValue = "https://mail.zoho.com/zm/#mail/tab/" + messageIdValue; inlineKeyboardButton = {"text":"Open in Zoho Mail","url":linkValue}; if(modeValue == "6") { result = {"chat_id":chatIdValue,"text":messageText,"parse_mode":"HTML","reply_markup":{"inline_keyboard":{{inlineKeyboardButton}}}}; } else { result = {}; } return result;函数详解先贴出调用传出 Webhook 时会给到的 Body 的示例内容：{ "summary": "这是邮件摘要", "sentDateInGMT": 1753886387000, // 邮件发送时间(UTC)的Unix时间戳后加了三个0 "subject": "这是邮件主题", "Mode": 6, // 6是收到，1是发送，其他不知道，文档也没写 "messageId": 17538863870133100, // Zoho Mail 的信息ID，用于构建直达本邮件的URL "toAddress": "<postmaster@example.com>", // 收件人地址 "folderId": 114514000000001919, // Zoho Mail 的文件夹ID "zuid": 114514191, // Zoho 用户 ID "size": 114, // 邮件尺寸 "sender": "John Smith", // 发件人 "receivedTime": 1753886387114, // 邮件收到时间(UTC)的Unix时间戳，最后三位是毫秒 "fromAddress": "webmaster@example.com"…

在 Intel(R) J4125 承载的 Proxmox VE 虚拟机上安装 Windows 11 IoT Enterprise LTSC 2024 并直通网卡
type: item
date: 2024-10-12T13:00:00+08:00
description: Windows 11 的 LTSC 可谓是千呼万唤始出来。2024 年 10 月 2 日 Microsoft 正式公布了 Windows 11 Enterprise LTSC 2024 的各语言镜像，但英文单语言版 iotent 镜像（版本 26100.1742）早在 9 月 6 日就已经被编译了出来，这回属于是正式发布。本着折腾的原则，备份完数据之后就准备把软路由上的 Windows 10 升级一下。全新安装总是省事的。准备清单微 PE 工具箱 版本 2.3 或更高 https://www.wepe.com.cn/download.html（直通网卡用）Intel 以太网适配器完整的驱动程序包 版本 29.3.1 或更高 https://www.intel.com/content/www/us/en/download/15084/intel-ethernet-adapter-complete-driver-pack.htmlDISM++ 版本 10.1.1002.2 或更高 https://github.com/Chuyu-Team/Dism-Multi-language/releasesWindows VirtIO 驱动 版本 0.1.262 或更高 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/UltraISO 版本 9.7.6 或更高Windows 11 IoT Enterprise LTSC 安装映像 版本 26100.1742 或更高定制 PE 环境和驱动释放 SCSI 驱动和 PE ISO 文件先解压 Windows VirtIO 驱动。Windows VirtIO 驱动解压完先不管。运行微 PE 工具箱安装程序，单击右下角的「光盘」。自定义可启动 ISO 镜像的输出位置和卷标。单击「立即生成 ISO」。单击「完成安装」。寻找其释放出来的 ISO 镜像并解压之。解压完成后即可使用 Dism++ 定制了。向 PE 镜像注入 SCSI 驱动打开 Dism++，选择「文件 (F)」，单击「挂载映像」。进入微 PE 工具箱释放的 ISO 镜像解压后的目录，选择 WEPE\WEPE64.WIM 文件并单击「打开 (O)」。挂载目录可以自定义，需要是一个干净的目录。这里以 D:\Temp\dismpp\ 为例。单击「确定」即可挂载映像。进入「驱动管理」，单击右下角的「添加驱动」。选择刚刚解压的 Windows VirtIO 驱动所在目录，选择 amd64\w10\ 目录（值得注意的是，该 PE 映像为 Windows 10）。单击「选择文件夹」，弹出操作成功等提示。可见「存储控制器」内已有 RedHat, Inc. 的 SCSI 驱动了。选择左上角的「文件 (F)」，单击「保存映像」，此处选择「直接保存」。选择左上角的「文件 (F)」，单击「卸载映像」。可见 PE ISO 镜像的解压目录中的 WEPE\WEPE64.WIM 文件已然是修改过后的时间了。修改 ISO 文件还得用到 UltraISO。修改 PE ISO 文件运行 UltraISO 程序，打开 PE 的 ISO 镜像，其内容显示在上半窗口处；下半窗口处进入 PE ISO 的解压目录。右键单击下半窗口处的 WEPE\WEPE64.WIM 文件，选择「添加」。提示「替换文件」，此处选择「是」。回到上半窗口处，右键单击光盘文件根目录的 BOOTMGR 文件，选择「设置为引导文件」。单击左上角的「文件 (F)」，选择「保存」。关闭 UltraISO 程序。定制 PE 环境完成。（直通网卡用）定制网卡驱动解压 Intel 以太网适配器完整的驱动程序包。重新打开 UltraISO 程序，其将默认生成一个光盘文件。进入驱动的解压目录，选中 PRO2500 文件夹，将其「添加」。单击左上角的「文件 (F)」，选择「保存」，「文件名 (N)」可以自定义。网卡驱动已经定制完成。配置 PVE 中的虚拟机上传镜像文件进入 PVE 的 ISO 镜像列表。将上一步制作的网卡驱动 ISO 文件（直通网卡用）、修改后的微 PE 工具箱 ISO 文件、Windows VirtIO 驱动 ISO 文件和 Windows 11 IoT Enterprise LTSC 安装映像尽数上传至 PVE。一共上传 4 个文件。创建虚拟机进入到 PVE 的「创建虚拟机」对话框，虚拟机的「名称」可以自定义。「使用 CD/DVD 光盘镜像文件 (ISO)」中的「ISO 镜像」选择修改后的微 PE 工具箱 ISO 镜像；「客户机操作系统」的「类别」选择 Microsoft Windows，「版本」选择 11…

Windows(R) Vista(TM) 安装体验——以 VMware Workstation Pro 为例
type: item
date: 2024-08-15T01:03:00+08:00
description: 前言说来惭愧，第一台自己的电脑预装的不是 XP 而是 Vista，再不是赛博老登了。作为 Windows NT 6 系列的初代目，Vista 虽然给了十六年前的我一种耳目一新的感觉，但高居不下的蓝屏率和与 XP 大相径庭的操作让我在成为中级电脑高手的初期走了不少弯路。快十年前 (2015) 我曾尝试过把 Windows 98 到 8.1 在 VirtualBox 尽数安装体验，但在 Vista 及前代的激活服务器和 Windows Update 通道均关闭的今天 (2024)，全新安装旧世代的 Windows 并打完补丁的难度还是不小的。准备工作Windows Vista with Service Pack 2 映像文件Windows Vista 提供入门版 (Starter)、家庭普通版 (Home Basic)、家庭高级版 (Home Premium)、商用版 (Business)、企业版 (Enterprise) 和旗舰版 (Ultimate) 等六个版别，除入门版 (Starter) 外均有 32 位和 64 位版本。不讨论入门版 (Starter) 的情况下，家庭普通版 (Home Basic)、家庭高级版 (Home Premium) 和旗舰版 (Ultimate) 不提供 VoL 版本，而企业版 (Enterprise) 不提供零售版和 OEM 版本且系统镜像单列，这意味着前者不能透过 KMS 通道激活，而后者仅能透过 KMS 或 MAK 通道激活。Vista 的 Service Pack 1 (SP1) 于 2008 年 3 月 18 日发布，而 Service Pack 2 (SP2) 于 2009 年 4 月 28 日发布。本文使用 SP2 作为演示。企业版 (Enterprise) 64 位：Windows Vista Enterprise with Service Pack 2 (x64) - DVD (Chinese-Simplified): cn_windows_vista_enterprise_with_sp2_x64_dvd_x15-40402.iso, SHA1: 46E06E24D549FA42A2392C8553470BF9845C9C06企业版 (Enterprise) 32 位：Windows Vista Enterprise with Service Pack 2 (x86) - DVD (Chinese-Simplified): cn_windows_vista_enterprise_with_sp2_x86_dvd_x15-40257.iso, SHA1: 15472EBF0509ED56F46F6F5848D869C320C0B8D5家庭普通版 (Home Basic)、家庭高级版 (Home Premium)、商用版 (Business) 和旗舰版 (Ultimate) 64 位：Windows Vista with Service Pack 2 (x64) - DVD (Chinese-Simplified): cn_windows_vista_with_sp2_x64_dvd_x15-36322.iso, SHA1: A1689C254FB3BD67807EE493EE7D4896BCA39887家庭普通版 (Home Basic)、家庭高级版 (Home Premium)、商用版 (Business) 和旗舰版 (Ultimate) 32 位：Windows Vista with Service Pack 2 (x86) - DVD (Chinese-Simplified): cn_windows_vista_with_sp2_x86_dvd_x15-36285.iso, SHA1: DA7F7BDC841DDFFABFF7DDAB6B1158873BF1246DWindows Vista SP2 发布以后的补丁、在 2017 年 4 月 11 日扩展支持 (Extended Support Update) 到期后的额外补丁Vista SP2 发布到 2017 年 4 月支持结束前的所有补丁32 位：https://pan.baidu.com/s/1hsA7fQc?pwd=iwvn64 位：https://pan.baidu.com/s/1c2CbpIC?pwd=bbrn原载于 https://tieba.baidu.com/p/5070482430，补档于 https://bbs.pcbeta.com/viewthread-1858687-1-3.html。2017 年 5 月至 2020 年 1 月的后续更新集合https://pan.baidu.com/s/1Jq…

Debian 10 (Buster) 及以上的发行版软件包源安装 MySQL 5.6.51
type: item
date: 2024-03-25T21:16:00+08:00
description: 笔者一直苦于手里的实例配置过低，就算是安装了 Debian 12 (Bookworm) 的机器普遍也只有 1G 或 2G 的内存，用 MySQL 5.7 都够呛，更遑论 MySQL 8 了。看到全网没啥包安装低版本 MySQL 的方案，编译安装又太浪费时间，摸索了一整子，鼓捣出了 Debian 10 (Buster) 及以上的发行版安装 MySQL 5.6.51 的方法。（Ubuntu 等发行版应该可以照葫芦画瓢）一、准备工作安装好 wget。apt update -y && apt install wget -y确保系统中不存在 mysql-apt-config 包。dpkg -l | grep mysql-apt-config若没有返回，则进行下一步；若有返回，则执行 apt remove mysql-apt-config --purge -y。二、下载并安装 MySQL 相关包MySQL 5.6.51 在官方存档里只有供 Debian 9 (Stretch) 使用的包。笔者把相关包看了下，除了其自身内部的连体依赖的版本号是 =，其他外部依赖的版本号均为 >=，因此在 Debian 10 (Buster) 及以上版本的发行版中应该是能用的。执行以下命令以下载相关包：wget https://cdn.mysql.com/archives/mysql-5.6/mysql-common_5.6.51-1debian9_amd64.deb wget https://cdn.mysql.com/archives/mysql-5.6/libmysqlclient18_5.6.51-1debian9_amd64.deb wget https://cdn.mysql.com/archives/mysql-5.6/mysql-community-client_5.6.51-1debian9_amd64.deb wget https://cdn.mysql.com/archives/mysql-5.6/mysql-client_5.6.51-1debian9_amd64.deb wget https://cdn.mysql.com/archives/mysql-5.6/mysql-community-server_5.6.51-1debian9_amd64.deb wget https://cdn.mysql.com/archives/mysql-5.6/mysql-server_5.6.51-1debian9_amd64.deb下载完成后执行：apt install -y ./mysql-common_5.6.51-1debian9_amd64.deb ./libmysqlclient18_5.6.51-1debian9_amd64.deb ./mysql-community-client_5.6.51-1debian9_amd64.deb ./mysql-client_5.6.51-1debian9_amd64.deb ./mysql-community-server_5.6.51-1debian9_amd64.deb ./mysql-server_5.6.51-1debian9_amd64.debapt 会自行处理其他依赖。过程中会交互式地要求设置 MySQL 数据库 root 密码，输入即可。安装完成后可执行 mysql -u root（安装时未设置密码）或 mysql -u root -p（安装时已经设置密码）进入 MySQL Server。三、后记执行 systemctl enable mysql 以使 MySQL Server 随系统启动。MySQL Server 的配置文件在 /etc/mysql/ 目录里。mysql-common 是可以透过包管理器更新的，目前更新不影响 MySQL Server 的运行。执行 apt-mark hold mysql-common mysql-community-client mysql-client mysql-community-server mysql-server 以限制 MySQL 自动升级。終わり。

AlphaSSL 新证书 GlobalSign GCC R6 AlphaSSL CA 2023 证书链修复教程
type: item
date: 2024-02-15T18:22:00+08:00
description: 近日有群友报告 AlphaSSL 新签的证书兼容性不佳，在用自动证书工具补齐证书链之后仍然无效。鉴于 GlobalSign 近几年搞了一大堆 intermediate CA，估摸着这回终于到 AlphaSSL 头上了。简单查了下，果然。2022 年底的 AlphaSSL CA - SHA256 - G2 失效，GlobalSign 给了 AlphaSSL CA - SHA256 - G4 作为新的 intermediate CA 证书，写在里面的 AIA 指向 GlobalSign Root CA (01SEP1998 - 28JAN2028, root-r1)。奇怪的是 2024 年 1 月 28 日之后的 AlphaSSL CA - SHA256 - G4 不再签发证书，改由 GlobalSign GCC R6 AlphaSSL CA 2023 签发原有通道的 AlphaSSL 证书，而后者的 AIA 指向 GlobalSign Root CA - R6 (10DEC2014 - 10DEC2034, root-r6)，且为信任锚。显然 2024 年 1 月 28 日之后的 AlphaSSL 默认的证书链的信任锚为 2014 年的这张 GlobalSign Root CA - R6。众所周知，一个新信任锚被绝大多数操作系统和软件所接受的周期是极长的，2010 年出的新根证书 (e.g. USERTrust) 依然在很多嵌入式设备、操作系统和浏览器中不受支持。保险起见，新的根证书会找老根证书交叉签名以保证自身的良好的兼容性，GlobalSign 也不例外。因此，重建证书链，将信任锚指向为其交叉签名的较老的根证书上即可解决问题。查询 https://crt.sh/?caid=272222 得知 GlobalSign GCC R6 AlphaSSL CA 2023 仅有一条直接上级 CA，即 GlobalSign Root CA - R6 (https://crt.sh/?caid=18459)。继续向上查询，得知 GlobalSign Root CA - R6 除了为信任锚外，还与 GlobalSign Root CA (01SEP1998 - 28JAN2028, root-r1) 有背书，那么解决方案呼之欲出————拼接 GlobalSign GCC R6 AlphaSSL CA 2023, GlobalSign Root CA - R6 和 GlobalSign Root CA 即可解决问题。将以下代码块附加在叶子证书（第一个 BEGIN CERTIFICATE 起到第一个 END CERTIFICATE 止）后作为证书链：-----BEGIN CERTIFICATE----- [binary] -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- [binary] -----END CERTIFICATE-----即可完成证书链建构。

解决 Oracle Cloud 计算实例因 DHCP 服务器下发配置变动导致 IPv6 地址失效的问题
type: item
date: 2023-02-12T17:59:00+08:00
description: 不知道什么时候开始（至少在 200 天内），Oracle Cloud 更改了 DHCPv6 下发默认路由的方式，这导致按照传统配置初始化网络的实例在重新引导后无法自动获得 IPv6 协议默认路由，无法通过 IPv6 协议通信。位于 /etc/network/interfaces 的传统配置示例如下：source /etc/network/interfaces.d/* auto lo iface lo inet loopback allow-hotplug ens3 iface ens3 inet dhcp iface ens3 inet6 dhcp该配置中，唯一网卡 ens3 的双栈地址均通过 DHCP 协议获得。重新引导实例后，网卡 ens3 获得的地址和默认路由如下：# ifconfig ens3 ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000 inet 10.155.46.97 netmask 255.255.255.0 broadcast 10.155.46.255 inet6 fe80::17ff:fe03:6ddc prefixlen 64 scopeid 0x20 inet6 2602:fd92:6e0:1263:0:200:1703:6ddc prefixlen 128 scopeid 0x0<global> ether 02:00:17:03:6d:dc txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # ip -6 r ::1 dev lo proto kernel metric 256 pref medium 2602:fd92:6e0:1263:0:200:1703:6ddc dev ens3 proto kernel metric 256 pref medium fe80::/64 dev ens3 proto kernel metric 256 pref medium可见，IPv6 地址正确获得，但是未收到默认网关信息。此时 IPv6 协议通信失败，报错 Network is unreachable：# curl -6v https://blog.iks.moe/ * Trying 2602:fd92:6e0:1263:2333::ac43:a69b:443... * Immediate connect fail for 2602:fd92:6e0:1263:2333::ac43:a69b: Network is unreachable * Closing connection 0 curl: (7) Couldn't connect to server尝试将 /etc/network/interfaces 中的 ens3 inet6 改为 auto 模式（无状态模式）并启用 DHCP 和请求前缀：source /etc/network/interfaces.d/* auto lo iface lo inet loopback allow-hotplug ens3 iface ens3 inet dhcp iface ens3 inet6 auto dhcp 1 request_prefix 1重新引导实例后，网卡 ens3 获得的地址和默认路由如下：# ifconfig ens3 ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000 inet 10.155.46.97 netmask 255.255.255.0 broadcast 10.155.46.255 inet6 fe80::17ff:fe03:6ddc prefixlen 64 scopeid 0x20 ether 02:00:17:03:6d:dc txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # ip -6 r ::1 dev lo proto kernel metric 256 pr…

OpenWrt 实现 PXE 服务器 (TFTP+NFS) 以引导无盘工作站 (Ubuntu 22.04 LTS)
type: item
date: 2022-05-08T13:41:00+08:00
description: 一、综述顾名思义，无盘系统是用于网吧、机房等公用计算机的一种网络传输技术。使用无盘系统启动的计算机将不使用本机的硬盘获得启动系统，而是通过网络的指定服务器去获得启动系统的镜像，并下载回本机后用于机器启动。PXE (Pre-boot Execution Environment) 是由 Intel 设计的协议，它是无盘系统的一种实现形式。很巧，OpenWrt 作为路由器操作系统，工作在网关模式下支持标准 DHCP, TFTP 和 NFS 协议实现；而目前大多数带有板载有线网卡的机器都支持网络启动 (Network Boot)，能够在客户端侧支持 PXE。本文以 https://blog.nanpuyue.com/2013/027.html 为原本，适当修改了部分内容以适应时代的变化，旨在使其能够支持 Ubuntu 22.04 LTS 的启动，为近世治理提供参考（错乱）。需求硬件：运行在网关模式下的 OpenWrt 设备（一般是路由器）；附着在上述 OpenWrt 设备上的至少 8GB 的空闲存储空间（路由器自带的也行，外接的 U 盘也行）；有线连接至上述 OpenWrt 设备的支持网络启动的计算机。本方案继承原文，以 Ubuntu 作为案例，能够向旧兼容到 Ubuntu 12.04 LTS，其他发行版亦可参考本文。二、下载 Ubuntu 镜像对于 Ubuntu 镜像，问就是清华大学的 OpenTUNA https://opentuna.cn/ubuntu-releases/22.04/ubuntu-22.04-desktop-amd64.iso （通过亚马逊云科技的 CloudFront 分发，基本没有限速）。对于 8GB 及以上内存的电脑来说，64 位的 Ubuntu Desktop 还是能够轻松对付的。三、调整和挂载相关目录OpenWrt 挂载目录的方案请自行查找，本文将 13.94GB 的分区 /dev/mmcblk0p3 挂载为 /mnt/main .目录详情如下：/mnt/main/nfsroot NFS 根目录；/mnt/main/tftproot TFTP 根目录。四、TFTP 和 NFS 环境配置安装软件包 nfs-kernel-server-utils （一般都安装了）：NFS 设置共享目录，“路径”填写 /mnt/main/nfsroot/ ，“允许的客户端”填写 * ，选项 填写 rw,no_root_squash,async,insecure,no_subtree_check 。如果 OpenWrt 没有图形界面，或未安装 NFS 管理的 LuCI APP，则修改 /etc/exports，加入一行 /mnt/main/nfsroot/ *(rw,no_root_squash,async,insecure,no_subtree_check) ，保存后执行 exportfs -rv。网络-DHCP/DNS 处提供了 TFTP 配置，其中“启用 TFTP 服务器”调整为“使能”（即勾选），“TFTP 服务器根目录”填写 /mnt/main/tftproot，“网络启动镜像”填写 pxelinux.0。如果 OpenWrt 没有图形界面，则修改 /etc/config/dhcp，在 config dnsmasq 内写入以下内容：option enable_tftp '1' option tftp_root '/mnt/main/tftproot'新起一行，填入以下内容：config boot linux option filename 'pxelinux.0' option serveraddress '172.18.54.1' option servername 'OpenWrt'其中，172.18.54.1 为 OpenWrt 的 IP 地址。执行 /etc/init.d/dnsmasq restart 重启 DNSmasq。五、上传镜像打开步骤二下载的镜像，解压其 .disk 和 casper 文件夹。将其上传到 OpenWrt 的 /mnt/main/nfsroot 目录。六、配置 PXELinux将步骤五中 casper 文件夹中的 initrd 和 vmlinuz 文件上传到 OpenWrt 的 /mnt/main/tftproot 目录。下载 Debian Installer for NetBoot （Ubuntu 没有这个） https://opentuna.cn/debian/dists/bullseye/main/installer-amd64/current/images/netboot/netboot.tar.gz ，解压以下文件至同一文件夹：debian-installer/amd64/…

使用非 Docker 方案在腾讯云轻量应用服务器上搭建密码管理软件 Vaultwarden (Bitwarden_rs)
type: item
date: 2022-05-03T01:34:00+08:00
description: 前言Bitwarden 是一款自由且开源的密码管理服务，用户可在加密的保管库中存储敏感信息（例如网站登录凭据）。Bitwarden 平台提供有多种客户端应用程序，包括网页用户界面、桌面应用，浏览器扩展、移动应用以及命令行界面。Bitwarden 作为一款商业自由软件，其开发公司提供云端托管服务 (bitwarden.com)，同时为广大开源社区提供自行部署的解决方案。Vaultwarden 原名 Bitwarden_rs，自 v2.21.0 开始更名为 Vaultwarden。Bitwarden 原始服务端使用 C# 编写，部署困难，且要求 MSSQL 等商业软件，运行需要 2GB 以上的内存；而 Vaultwarden 是一个使用 Rust 编写的非官方 Bitwarden 服务器实现，它与官方 Bitwarden 客户端兼容，运行 Vaultwarden 时只需要 10M 内存，可以说对硬件基本没有要求，对于不希望使用官方的占用大量资源的自托管部署而言，它是理想的选择。Vaultwarden 除不支持官方企业版的部分功能（如事件日志、目录同步以及 SSO 登录）外，其他大部分功能均免费支持。并跟随官方版本保持及时更新。Vaultwarden 实现了 Bitwarden API 所需的大部分功能，因此桌面端、移动端、浏览器扩展等客户端均可直接使用 Bitwarden 官方的客户端应用程序。Vaultwarden 仓库推荐的安装方式均为直接使用 Docker 部署，本文将介绍一种使用非 Docker 方式、直接在系统上部署 Vaultwarden 的方法。16MB 左右的内存占用，再配合 MySQL 替代默认的 SQLite 作为数据存储形式可以将其“功耗”降到最低。一、准备工作1.1 服务器和系统选用由于 Vaultwarden 运行时几乎不消耗系统资源，因此可以选用任意型号的轻量应用服务器；服务器系统建议选择 Ubuntu 18.04 或更新版本以及 Debian 10 或更新版本的 Linux 发行版，使用 CentOS 似乎会因依赖软件包版本问题而出现未知的错误。此外，由于部署 Vaultwarden 不会对现有系统环境造成破坏性影响，在已经有网站业务的服务器上部署 Vaultwarden 也是一个不错的选择。1.2 环境配置1.2.1 软件包及依赖配置依次执行以下命令以更新软件包信息、安装必要的软件包及开发工具包：apt update -y apt install git nano curl wget htop pkg-config openssl libssl1.1 libssl-dev -y apt install build-essential -y1.2.2 Rust 环境配置执行 curl https://sh.rustup.rs -sSf | sh 以配置 Rust 环境。（国内可能较慢）出现 Rust is installed now. Great! 即代表安装完成。依次执行以下命令以配置 cargo 命令的环境变量：echo 'export PATH=~/.cargo/bin:$PATH' >> ~/.bashrc export PATH=~/.cargo/bin:$PATH which rustc若返回 /root/.cargo/bin/rustc 则代表完成 Rust 环境的配置。二、编译 Vaultwarden执行 git clone https://github.com/dani-garcia/vaultwarden && cd vaultwarden 以拉取 Vaultwarden 储存库（国内可能较慢）：执行 cargo clean && cargo build --features mysql --release 以启动 Vaultwarden 的编译。其中，mysql 可以为与 sqlite 和 postgresql 三者的任意组合，选择编译 mysql 或 postgresql 时，系统必须安装了 MySQL 或 PostgreSQL，否则将提示：linking with `cc` failed: exit status: 1 ... = note: /usr/bin/ld: cannot find -lmysqlclient collect2: error: ld returned 1 exit status不想安装 MySQL 的可以仅安装其适用于 Rust 语言的 Client 库（限 Ubuntu 或 Debian）：apt install librust-mysqlclient-sys-dev -y编译需要 3GB 左右的内存，内存不足的可以调整虚拟内存，虚拟内存建议空闲 …

在使用 WLAN 联网的树莓派上安装 Proxmox VE 并创建虚拟机
type: item
date: 2021-11-27T18:04:00+08:00
description: 去年的这个时候收了一台树莓派 4B，到手之后宝塔建站一把梭之后就放在那里吃灰（没办法，技术太菜玩不了别的）。最近迷上了 PVE，想想手头也没有什么可以实践的物理设备，百般寻找之后便把目光锁定在了吃灰中的树莓派。Proxmox 论坛的 https://forum.proxmox.com/threads/how-to-run-pve-7-on-a-raspberry-pi.95658/ 帖子讲的是在有线网络接入 (eth0) 时的安装过程，目前我手里没有网线，所以只能修修改改踩踩坑探索一下 WLAN 接入网络 (wlan0) 时的安装和配置。本教程需求：Raspberry Pi 4 Model B（内存 2GB 或以上）、拥有宽带连接的 2.4GHz 或 5GHz 的 WLAN（SSID 不可带有下划线 (_)、DHCP 服务器能够给指定的 MAC 地址分配固定的 IP 地址功能、需要能够顺畅连接 raw.githubusercontent.com）、一台显示器、USB 接口的键盘以及一张容量至少为 16GB 且速度等级为 C10 或以上的 MicroSD 卡。一、准备工作1.1 刷写系统镜像1.1.1 下载系统镜像访问 https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_lite_arm64/images/ 下载 Raspberry Pi OS ARM64 Lite 最新的版本，本文写作时的版本为 2021-11-08 (https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_lite_arm64/images/raspios_lite_arm64-2021-11-08/2021-10-30-raspios-bullseye-arm64-lite.zip)清华大学 TUNA 源的速度还是很不错的。此外，阿里云镜像站（mirrors.aliyun.com）也提供相同的镜像。系统镜像下载完成后，解压之，得到 ISO 文件。1.1.2 刷写系统镜像至 MicroSD 卡中下载 SD Card Formatter (https://www.sdcard.org/downloads/formatter/eula_windows/SDCardFormatterv5_WinEN.zip) 并安装。下载 Win32 Disk Imager (https://sourceforge.net/projects/win32diskimager/) 并安装。不建议拿其他刷写软件替代，比如 Rufus 刷写后不会给 BOOT 分区分配盘符。使用 SD Card Formatter 格式化 MicroSD 卡。格式化完成后，打开 Win32 Disk Imager，向 MicroSD 卡写入系统镜像。1.2 准备网络环境1.2.1 分配固定 IP 地址登录 WLAN AP （路由器）后台，给树莓派的 WLAN MAC 地址分配一个固定的 IP 地址。若暂时不知道其 MAC 地址，可以跳过此步。本文树莓派被分配到的 IP 地址为 192.168.1.233/24，网关为 192.168.1.1，DNS 地址为 192.168.1.1。1.2.2 使能 SSH 功能和 WLAN 连接步骤 1.1.2 刷写完成后，MicroSD 卡的 boot 分区会被分配一个盘符，进入此分区，新建文件 wpa_supplicant.conf 和 SSH。使用编辑器（不得使用 Window 记事本）编辑 wpa_supplicant.conf 文件，填入以下内容：ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="WiFi的SSID" psk="WiFi密码" }保存即可，SSH 文件则保持空白。拔出 MicroSD 卡，将其插入树莓派。二、配置底层系统2.1 重新配置用户和密码使用 SSH 终端登录至树莓派（默认用户名 pi，密码 raspberry），执行 sudo -i 切换至 root 用户，执行 passwd root 和 passwd pi 修改 root 用户和 pi 用户的密码。2.2 允许 root 用户通过 SSH 登录执行 echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config 后执行 systemctl r…