普通视图

一站式操作系统 ISO 下载平台

2025年10月28日 00:00

找到一个安全、便捷且资源丰富且下载速度较快的操作系统 ISO 文件下载平台显得尤为重要。很多小伙伴习惯使用 MSDN,但又不喜欢其登录机制,这里杜老师推荐 OS.click,一款专注于为用户提供实用、高效的系统下载服务的网站。

丰富的资源库

OS.click 拥有海量操作系统 ISO 文件可供下载,涵盖了当下主流的两大操作系统阵营。

在 Windows 系统方面,无论是较为经典的 Windows 8.1,还是广泛运用于个人和企业的 Windows 10,以及最新的 Windows 11,都有完整且经过精心挑选整理的版本提供给用户。

无论您是想要体验全新的系统功能,还是需要回退到熟悉的旧版本进行系统恢复,甚至是搭建特定的测试环境,OS.click 都能满足您不同的需求。

对于 Linux 系统爱好者和开发者来说,这里同样是一座宝藏。Ubuntu 作为 Linux 系统中广受欢迎的发行版之一,以其用户友好的界面和强大的社区支持,吸引了众多用户。

在 OS.click 上,可以轻松获取到各个稳定版本的 Ubuntu ISO,方便用户快速搭建开发环境、进行系统测试或者部署服务器等操作。

而 Debian 作为 Linux 世界中以稳定性和安全性著称的系统,同样在 OS.click 上有丰富的资源,无论是用于个人桌面电脑还是企业级服务器的系统安装,都能在这里找到合适的 Debian ISO 版本。

快速便捷下载体验

网站名称中的 “lightning fast” 绝非夸大其词。

OS.click 通过先进的服务器技术和优化的网络架构,确保用户能够以极快的速度下载所需的 ISO 文件。

这意味着用户无需长时间等待,即可快速获取系统安装文件,大大提高了工作效率和使用体验。

无论您是处于家庭网络环境下,还是在企业内部网络中,OS.click 都能凭借其强大的网络资源和智能的流量分配机制,为用户提供智能、稳定且高速的下载通道,让用户能够迅速开始系统的安装或升级过程。

简洁直观用户界面

OS.click 的界面设计简洁明了,易于操作。

对于那些不熟悉技术或者对网络下载流程不太熟悉的新手用户来说,也能轻松上手。

在网站的首页,清晰地展示了可下载的各类操作系统 ISO 文件的列表,用户只需通过简单的点击操作,即可进入相应的下载页面。

没有繁琐的注册流程,也没有复杂的广告干扰,用户可以专注于寻找自己需要的系统文件并立即开始下载,节省了宝贵的时间和精力。

安全可靠下载保障

在互联网上下载软件或文件,安全性始终是用户最关心的问题之一。

OS.click 深知这一点,因此致力于为用户提供能够安全可靠的下载服务。

网站对所有的 ISO 文件都进行了严格的审核和筛选,确保这些文件没有携带恶意软件、病毒或者其他安全风险。

用户在 OS.click 上下载的系统文件,可以放心地用于安装和使用,大大降低了因下载到不安全文件而可能导致的系统故障、数据泄露等风险。

灵活多样应用场景

OS.click 的服务适用于多种场景。

例如,当用户的电脑出现系统故障,需要重装系统时,只需访问 OS.click,找到对应的系统 ISO 文件进行下载,然后通过简单的步骤制作启动盘,就能顺利完成系统的重新安装。

对于那些想要尝试不同操作系统以寻找更适合自己的系统环境的用户来说,OS.click 提供的丰富资源也为其提供了极大的便利性。

此外,对于企业 IT 管理人员而言,在企业内部进行批量的系统安装或者升级时,OS.click 快速稳定的下载服务能够有效提高工作效率,节省大量的时间和人力成本。

社区互动支持

OS.click 并不仅仅是一个单纯的下载平台,它还拥有活跃的用户社区。在这里,用户可以交流使用心得、分享经验技巧、寻求技术支持等。

对于在系统安装或使用过程中遇到的问题,用户可以在社区中提出咨询,其他同好或者经验丰富的用户会积极地提供帮助和解决方案。

这种良好的社区互动氛围,不仅增强了用户的使用体验,还促进了用户之间的知识共享和技术交流,有利于整个用户群体的技术水平提升。

在众多的操作系统 ISO 文件下载平台中,OS.click 凭借其丰富的资源、快速的下载速度、简洁友好的界面、安全保障以及多样化的应用场景,成为了众多用户在系统安装和升级过程中的首选。

无论是个人用户还是企业用户,无论是新手还是技术老手,OS.click 都能为他们提供满意的服务,助力他们在数字化世界的探索和工作中更加顺利高效。

如果您也在寻找一个可靠的系统 ISO 下载平台,不妨试试 OS.click,相信它不会让您失望。

在银河麒麟桌面操作系统 ARM 版上安装 KVM 虚拟化

2025年8月17日 00:00

KVM 是一种开源全虚拟化解决方案,能够在 Linux 系统运行多个操作系统。本文将详细介绍如何在银河麒麟桌面操作系统 ARM 版安装 KVM 虚拟化环境,帮助用户搭建高效的虚拟化平台。

准备工作

  1. 硬件要求

确保 ARM 架构设备支持虚拟化技术。通常,支持虚拟化的 ARM 处理器会支持硬件辅助虚拟化功能。

系统至少需要 4GB 内存和 20GB 的硬盘空间。

  1. 软件要求

银河麒麟桌面操作系统 ARM 版「如 V10」

KVM 虚拟化相关的软件包。

安装 KVM 虚拟化环境

  1. 安装 KVM 和相关工具
1
2
sudo apt update
sudo apt -y install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

注意:在银河麒麟桌面操作系统 ARM 版上,可以通过上面命令安装 KVM 和相关工具。

  1. 包的作用

上面软件包的作用如下:

包名作用
qemu-kvm提供 KVM 虚拟化核心功能
libvirt-daemon-system用于管理虚拟机的后端服务
libvirt-clients提供客户端工具管理虚拟机
bridge-utils用于配置网络桥接
virt-manager提供图形化界面管理虚拟机
  1. 添加用户到 libvirt 组内
1
sudo usermod -aG libvirt $(whoami)

注意:为方便管理虚拟机,需要将当前用户添加到 libvirt 组,然后注销重新登录,使组成员关系生效。

  1. 验证是否安装成功
1
virsh --version

注意:运行上面命令来检查 KVM 是否正常工作,如果返回版本信息,说明 KVM 安装成功了。

创建 KVM 虚拟机

  1. 下载镜像

可以从银河麒麟官方网站下载适合 ARM 架构的虚拟机镜像文件。

Kylin-Desktop-V10-SP1-2403-Release-20240430-arm64.iso 文件。

  1. 创建虚拟磁盘
1
qemu-img create -f qcow2 /path/to/disk.img 50G

注意:使用上面命令创建虚拟磁盘。其中/path/to/disk.img 是虚拟磁盘路径,50G 表示磁盘的大小。

  1. 启动 KVM 虚拟机安装
1
qemu-system-aarch64 -m 2048 -cpu cortex-a76 -smp 4 -M virt -bios /path/to/QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -drive if=none,file=/path/to/disk.img,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=/path/to/Kylin-Desktop-V10-SP1-2403-Release-20240430-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom

注意:使用上面命令启动 KVM 虚拟机安装。其中-m 2048 分配 2048MB 内存;-cpu cortex-a76 指定 CPU 类型;-smp 4 是指定虚拟 CPU 核心数。

  1. 完成安装

按照虚拟机安装界面的提示完成安装过程。

安装完成后 KVM 虚拟机将自动重启。

使用 KVM 管理虚拟机

  1. 使用 virsh 命令行工具

列出所有 KVM 虚拟机:

1
virsh list --all

启动 KVM 虚拟机:

1
virsh start <KVM 虚拟机名称>

关闭 KVM 虚拟机:

1
virsh shutdown <KVM 虚拟机名称>

强制停止 KVM 虚拟机:

1
virsh destroy <KVM 虚拟机名称>

挂起 KVM 虚拟机:

1
virsh suspend <KVM 虚拟机名称>

恢复挂起 KVM 虚拟机:

1
virsh resume <KVM 虚拟机名称>
  1. 使用 virt-manager 图形化界面

virt-manager 提供了一个直观的图形化界面,方便用户管理 KVM 虚拟机。

启动 virt-manager 后,可以连接到本地或者远程的 KVM 服务器,创建、启动、停止 KVM 虚拟机。

系统设计: Fan-out/Fan-in 并发模式

Fan-out / fan-in 指的是一种并发模式:将工作拆分为多个单元并行执行,然后在所有任务完成后进行同步。虽然它经常在无服务器(serverless)函数的语境中被提及,但这一概念并不局限于无服务器架构。 更广义地说,fan-out / fan-in 是一种通用的并发模式,适用于任何可以将任务分解为相互独立部分的场景,例如线程、进程、Actor、微服务,甚至分布式作业,并在之后将结果汇聚起来。其核心思想是在执行阶段将工作并行展开(fan-out),在收敛阶段对各个分支的输出进行协调和聚合(fan-in),而不依赖于具体的执行模型或底层基础设施。 [caption id="attachment_70812" align="alignnone" width="1653"]Fan-out / fan-in 指的是一种并发模式:将工作拆分为多个单元并行执行,然后在所有任务完成后进行同步。 Fan-out / fan-in 指的是一种并发模式:将工作拆分为多个单元并行执行,然后在所有任务完成后进行同步。[/caption] 在实际工程中,fan-out / fan-in 模式常用于提升系统吞吐量和资源利用率,尤其适合 I/O 密集型或可并行计算的场景。通过将一个复杂任务拆分为多个相互独立的子任务并同时执行,可以显著缩短整体处理时间;而在 fan-in 阶段,对各个子任务的结果进行统一汇总、排序或合并,则有助于保持业务逻辑的完整性与一致性。不过,这种模式也需要注意并发控制、错误处理以及超时与重试机制,否则容易在高并发场景下引入资源争用、级联失败或结果不一致等问题。因此,在设计和实现 fan-out / fan-in 架构时,应结合具体场景权衡并发度、系统复杂度与稳定性。 [show_file file="/var/www/wp-post-common/justyy.com/design.php"] 英文:System Design: Fan-out/Fan-in Concurrency Pattern

相关文章:

  1. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  4. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  5. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  6. 微信PC端程序占用了1.39 TB的空间! 快速清理微信占用空间 前两天我的 C 盘剩余空间突然变红了,我随手一查,竟然发现微信 PC 端程序居然占用了 1.39 TB 的空间,简直不可思议。在手机上,微信同样是名列前茅的“吞空间大户”,在 设置 → 通用 → 手机存储空间 里几乎稳居第一。 更离谱的是,这些空间大多并不是因为聊天记录,而是各种缓存文件、视频、图片和被动接收的文件所堆积起来的。平时我们只是点开看一眼,就算没保存下来,微信也会悄悄把它们留在本地,占据大量磁盘。尤其是群聊里转发的视频和文件,日积月累就成了一个“隐形黑洞”。...
  7. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. /** MySQL...
  8. 和孩子到英国Suffolk进行复活节Easter Egg Hunt 去年复活节刚好因为疫情 只能待在家里, 于是在院子里和家里藏好复活节Egg然后孩子找蛋. 前年去了到 Beth Chatto 花园找复活节彩蛋 今年疫情好转, 政府允许在室外活动, 于是驱车到了Suffolk进行复活节Easter Egg Hunt. 地址是: The Rotunda,...

优秀的浪潮

2026年1月8日 08:29

一个公司的开发能力到底糟糕到什么程度才能做到原始数据和实践方法都给他们了,但是三个月时间过去,依然做不出该有的东西呢?一开始他们说做不到,不知道该怎么做,但是所有资源都已经给他们了以后依然做不出来,于是我就明白,为什么他们的系统做得那么糟糕,因为他们根本不知道自己在做什么。

周三下午被叫去开会,理论上是讲解如何进行报表填报。我对那个东西不抱任何幻想,但我也希望不要过于糟糕,实际情况比我想象的还要糟糕。

首先是一个进度数据的获取,他说他们已经能自动生成那些数据,但是我们也要帮他们核对一下,出现什么状况及时跟他们说。哪怕你不说这个我们也一定会核对的,但关键是在告诉我们可以通过哪些点击生成自动的报表之后顺便跟我们说在那套智能化系统里可以在哪些地方查询核对这些数据,接着我震惊了。以他们这种方式核对,首先不全面,其次,相当low。以他们这种方式核对。只能拿着他们自动生成的那个表格找数据,但万一他们那里的数据条目已经缺漏了呢?通过他们所说的那种核对方式根本无法发现。如果他们的测试人员就是用这种方式去检验他们的程序,这种检验方法本来就是错的,所以他们没有发现问题,实际上问题又的确存在是绝对有可能的,而现在他们把这个引以为傲的功能交付给我们,意思就是让我们所有人给他当测试员。测试员是要发工资的,我们是甲方,你让甲方无条件免费给你们做测试,到底他们是怎么想出这么损的招数?实际上如果这个甲方是靠谱的,你实现不了这个功能,我绝对不会给你钱。如果你无法在规定时间之内交出合格的东西,我还要扣你的钱。现在的情况是钱我们已经都给了,扣钱这一条从来没有发生过。这么窝囊的甲方,已经不是第一次,因为我们已经有5年以上的时间对接这个老赖,第一次不知道也就算了,但第二次依然是一头栽进去。

进度表的获取虽然说不如人意,但也只能说瑕疵是难以避免的,但第二个账本的自动生成简直就是悲剧。一开始我说到的那一堆东西就是针对账本自动生成的。前段时间我已经已读不回我的某个同事,因为11月的时候我已经把11月中旬之前一整年的数据都给他了,12月的时候还没到月底,他又找我要12月的数据,然后我就直接不理他。如果你写的脚本能把1-11月的数据全部都生成且核对无误,要不要12月的数据根本不重要。因为12月的数据是水到渠成的事。实际上当我亲自见识那个成品的时候,那跟我三个月前初次见面的时候,几乎没有区别,一坨屎。他们哪来的底气觉得他们的数对上了。摘要不对,业务类型不对,收入支出不对,库存不对,唯一对的就是右下角最后一个库存。那个数据不是根据前面和上面的数据生成的,我猜是不知道从哪里直接读取了,所以唯有那个数据是对的。他们的眼睛长在脑袋上?确定不是长在屁股上?即便是深度近视高度老花的人都能发现那些不一致,但即便这样,他们居然也觉得自己已经开发到位了。

这个如此优秀的公司叫浪潮。

微软操作系统在2025年12月才开始支持NVMe协议

2026年1月4日 21:23

垃圾微软又一次成功的刷新了我对其垃圾程度的认知。


技术简介

首先为不了解技术名词和技术原理的朋友简单讲一下。

传统的存储设备中,机械硬盘都是靠电机+磁头的方式工作,光驱也是靠相似结构的电机+激光头工作。这就意味着这种类型的设备在同一时间内只可能完成一个查询请求(CRUD,增删查改),不存在并发查询的可能性。

img_BV1iT4y1k7G7-1

(希捷 Exos X18 18TB氦气硬盘开盖结构)

img_BV1U8411s7Mh-1

(希捷双磁臂硬盘工作方式)

img_BV1iT4y1k7G7-2

(希捷双磁臂近照)

图片来自:

而对应的存储设备的 接口/传输协议:SATA,是专门为这些存储设备设计的,也仅支持单并发。

(因本人目前能查到的SAS接口的技术详情有限,本文不讨论SAS接口)

  • 2003年的SATA 1.0 版本原始带宽为 1.5Gbps,传输速率约 150MB/s
  • 2004年的SATA 2.0 版本则翻倍,原始带宽为 3Gbps,传输速率约 300MB/s
  • 2009年的SATA 3.0 版本则继续翻倍,原始带宽为 6Gbps,传输速率约 600MB/s

而2025年,机械硬盘最高的持续传输速率大概也只到 300MB/s 左右。

img_sata_hdds

(3.5寸机械硬盘和2.5寸机械硬盘的接口。注意,短的那个才是SATA接口,长的那个是电源接口)

img_SATA_ports

(SATA数据线和SATA插座)

固态硬盘开始普及后,一开始固态硬盘使用和2.5寸机械硬盘相同的硬件外观,使用标准SATA接口。体积太大!没那个必要。后来开始用mSATA协议,体积缩小,但是仍然受限于SATA的单并发查询限制。行业新定义了m.2接口,更小。同时定义了新的传输规范 NVMe,其支持固态存储的并行查询能力,理论上一次支持最多64000个并发查询。其他优点我在这里就不讲了。

img_MSATA_SSD_vs._2.5__SATA_drive

(2.5寸SATA接口硬盘 与 mSATA接口硬盘)

img_M2_and_mSATA_SSDs

(mSATA固态硬盘(左) 与 m.2固态硬盘(右))

注意:m.2 接口同时有 SATA 版本和 NVMe 版本,SATA 版本是走 SATA 协议的,仅支持单并发查询。所以正常人都在你买固态的时候,推荐你买 m.2 接口走 NVMe 协议的固态。SATA 接口的固态主要还是为了供给那些只有SATA接口的老电脑和老存储服务器使用,m.2 接口走 SATA 协议的版本同样也只是为了迁就过渡时期有 m.2 接口却不支持NVMe协议的旧主板。至于奸商的歪理邪说我就不提了。(固态硬盘的成本都在颗粒上,协议和接口对价格没太大影响)

小总结

讲到这里其实就已经很清晰了。

  • 给机械硬盘设计的 SATA 协议不支持并发查询
  • 给固态硬盘设计的 NVMe 协议支持并发查询

用支持 NVMe 的固态硬盘就对了。(除非旧电脑没有硬件条件)


垃圾微软

NVMe 协议比 SATA 协议性能好,这本身就是个很简单也很容易理解的道理。

然后傻逼的微软就开始搞笑了。

NVMe 协议开始于 2011 年,大约在 2015 年前后,包括 ChromeOS 和 iOS 在内的多数操作系统都添加了对 NVMe 的原生支持。而 Linux 更是早早的在 2012年就已经在内核中添加了对 NVMe 的支持。

而2025年12月份,微软才正式官方支持 NVMe 协议,而在这之前,微软的所有操作系统是 把 NVMe设备 当作 SCSI设备 处理的

也就是说:微软操作系统(包括最新版的Win11,以及服务器版的 Windows Server 2025)都不支持 NVMe 协议。插上去的支持 NVMe 的固态硬盘被当作旧 SCSI 协议的机械硬盘一样对待。(来源:微软官方,链接使用了 文本片段(Text Fragment) 功能以通过 URL 高亮特定的文本,但微软官网会清除对应的高亮,垃圾微软)

screenshot_on_b85m_by_flameshot_at_2026-01-04_20-52-52

screenshot_on_b85m_by_flameshot_at_2026-01-04_20-51-54

说实话,虽然只有东亚国家和俄罗斯会使用 黑色方框示亡号,但是看到 Microsoft 上带个黑框,感觉微软也早就死了

个人猜测:理论上NVMe协议可以让固态硬盘直连CPU,在延迟性能上要比需要经过SATA控制器的SATA硬盘好得多。但由于微软的废物逻辑,由操作系统产生的硬盘操作指令是SCSI指令,还要再由CPU翻译成NVMe指令,其延迟性能可能比有原生SATA支持且有单独处理芯片的SATA性能还差。

也就是说你的 Windows系统 的 电脑/服务器,固态硬盘插 m.2接口 还是插 SATA接口,走 NVMe协议 还是 SATA协议,性能都是一样烂的。


其他补充

关于SAS

虽然研究不够深,但是对于泛用于企业级硬盘的SAS接口,情况相同:

SAS(Serial Attached SCSI)同样仅支持单队列,与SATA情况相同,只不过其队列深度比SATA要高。

关于AHCI

其实我没太搞明白AHCI和SATA之间的关系。

 

如果你有更全面的参考资料的话,可以分享。


参考资料


结论

垃圾微软!

The post 微软操作系统在2025年12月才开始支持NVMe协议 first appeared on 石樱灯笼博客.

使用原子 TAS 指令实现自旋锁

使用原子 TAS 指令实现自旋锁

使用原子 TAS 指令实现自旋锁 Implementing a Spinlock Using the Atomic TAS Instruction 从零实现自旋锁:基于 TAS 的最小同步原语 Building a Spinlock from Scratch with Atomic TAS 用 test-and-set 实现最简单的互斥锁 Implementing a Minimal Mutex Using Test-and-Set 自旋锁的底层原理:TAS、原子性与忙等待 Inside Spinlocks: TAS, Atomicity, and Busy Waiting 原子操作与自旋锁:用 C 语言实现线程同步 Atomic Operations and Spinlocks: Thread Synchronization in C 从原子指令到锁:全面理解 TAS 和自旋锁 From Atomic Instructions to Locks: A Complete Guide to TAS and Spinlocks 动手写一个自旋锁:tryLock / lockAcquire / lockRelease 全实现 Hands-On Spinlock Implementation: tryLock, lockAcquire, and lockRelease 你的第一个自旋锁:基于 C 语言的 TAS 实现 Your First Spinlock: A TAS-Based Implementation in C 原子交换与线程互斥:自旋锁实现指南 Atomic Exchange and Thread Mutual Exclusion: A Guide to Implementing Spinlocks
假设我们有一个 TAS(Take-And-Set)函数。该操作返回内存中原来的值,并以原子方式将其替换为新值。原子性(atomicity)意味着没有其他线程能够观察到中间状态;整个读-写操作是一体不可分的。 在 C++ 中,标准库函数 std::exchange 在逻辑上表现相同,但它不是原子操作。同步原语需要硬件级别的原子性。
int TAS(int* memory, int newVal) {
    int old = *memory;
    *memory = newVal;
    return old;
}
我们想使用这个原语来实现一个简单的自旋锁,包括:
  • lockAcquire()
  • lockRelease()
线程将调用这些函数来保护对共享变量的访问:
typedef struct {
    int lock;
} lockType;

typedef struct {
    int val;
} threadArgType;

void threadFunc(void* arg) {
    lockAcquire((static_cast<lockType*>arg)->lock);
    (static_cast<threadArgType*>arg)->val++;
    lockRelease((static_cast<lockType*>arg)->lock);
}

实现 tryLock

tryLock 函数尝试获取锁一次。如果锁为空(值为 0),TAS 将其设置为 1 并返回原值(0)。如果锁已被占用,TAS 返回 1。tryLock 函数是非阻塞的——它会立即返回。 因此 tryLock() 只有在 TAS 返回 0 时才会成功:
enum {
    UNLOCKED = 0,
    LOCKED = 1
}

int tryLock(lockType* lock) {
    // 如果之前已锁定返回 1,如果之前未锁定返回 0
    int old = TAS(lock->lock, LOCKED);
    return (old == UNLOCKED);   // true (1) = 成功获取锁
}

实现 lockAcquire()

普通的锁获取应当“自旋”直到 tryLock() 成功。这称为 自旋锁,因为 CPU 会忙等待。必要时可以加入短暂的 sleep。例如,sleep(0) 并不会真正暂停执行,而是让出 CPU,允许其他线程运行。 它通常用于实现跨线程的互斥自旋锁。
void lockAcquire(lockType* lock) {
    while (!tryLock(lockType* lock)) {
        // 自旋直到锁可用
    }
}
另一种实现:
void lockAcquire(lockType* lock) {
    do {
       if (tryLock(lockType* lock)) {
          break;
       }
    } while (1);
}
展开 tryLock:
void lockAcquire(lockType* lock) {
    do {
       int old = TAS(lock->lock, LOCKED);
       // 无论锁是否已被获取,锁都已设置为 LOCKED
       if (old == UNLOCKED) {
           break;
       }
    } while (1);
}
这是使用 TAS 实现的最简单方法。在实际系统中,我们可能会加入 pause 指令或退避策略,但基本思路是相同的。

实现 lockRelease()

释放锁时,持有者只需将锁变量写为 0。由于 TAS 是“设置新值并返回旧值”,它同样适用于释放锁:
void lockRelease(lockType* lock) {
    TAS(lock->lock, UNLOCKED);
}
或者使用简单的原子存储也足够,但由于 TAS 是我们唯一的工具,我们重用它。请注意,在这里重复释放锁是安全的,因为再次将其设置为 UNLOCKED=0 不会产生副作用。

总结

仅使用原子 TAS 指令,我们实现了:
  • 一个 tryLock() 尝试
  • 一个 lockAcquire() 自旋锁
  • 一个 lockRelease() 解锁操作
这种锁的实现方式对于理解低级并发、内存顺序以及高层互斥锁库的构建方式非常基础。 [show_file file="/var/www/wp-post-common/justyy.com/cpp.php"] 英文:Implement a Lock Acquire and Release in C++

相关文章:

  1. 简易教程: C++的智能指针 C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个...
  2. C++中的 const和constexpr 比较 C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr...
  3. 被动收入之: 微博红包 今年开始重新经营我的微博帐号 drlai 收到两笔微信红包,应该是来自于官方的支持,150元(成功提现到支付宝)。虽然这不能持久,也没多少,但毕竟实现了零的突破,意义重大。 如果流量上来,内容创作者可能会接受到比较多的赞赏,这也是一个比较简单的变现方法。这也能作为一种被动收入,不过如果不是头部网红,可能杯水车薪,但如果你有好几个类似这样的,也能积少成多! 在用户中心,微博用户可以每天登陆手机微博APP打卡,获取点数和少量的红包钱(几分钱),积少成多! 微博做些小任务可获得积分和几分钱。聊胜于无。 微博的主要盈利模式 微博的主要盈利模式主要包括以下几个方面: 广告收入:微博的大部分收入来源于广告,尤其是品牌广告和效果广告。广告形式包括信息流广告(类似于推文广告)、热门话题广告、开屏广告和视频广告。品牌和企业可以利用微博庞大的用户群和社交互动来提升曝光率、推广品牌和产品。 会员服务:微博提供的VIP会员服务,用户可以支付订阅费用来享受更多的特权,比如个性化的主题、特有的表情包、私密权限设置等。这些会员服务主要面向个人用户,提升其社交体验。 直播和打赏:微博提供直播平台,用户可以通过购买虚拟礼物来支持主播,微博会从这些打赏中抽取一定比例的分成。此外,微博与内容创作者分成,通过内容付费、知识付费等形式变现。 增值服务:针对企业和大V(拥有大量粉丝的用户),微博还提供增值服务,如账号认证、粉丝数据分析、精准推送、推广和营销工具等。这些服务帮助企业提升营销效果,同时也增加了微博的收入来源。 电商和导流:微博上有大量的电商导流业务,尤其是和明星、网红的合作推广。微博用户在浏览社交内容时,可以直接跳转到商品购买链接,微博通过这种方式赚取导流佣金。 游戏联运:微博也会与一些游戏公司合作推出联合运营的游戏,微博负责推广和流量引入,用户充值或付费时,微博可以获得一部分的分成。 这些模式相结合,使得微博能够在广告市场、内容创作和电商等多个领域获利。...
  4. 借助AI快速开源了N个小工具: 写代码越来越像做产品了, AI 真把我宠坏了(Vibe Coding) 程序员的未来?Vibe Coding + AI 一起上! 借助 AI 快速开源了三个小工具 最近,我利用 ChatGPT-4o 和 o4-mini 快速开发并开源了几个小工具。起因其实很简单——每次想转换 YAML/JSON 或进行...
  5. 豪车的修理费用就是贵一些 去年买了保时捷卡宴SUV(Porsche Cayenne)后,我一直担心将来修车费用会很高。当时购车时,车厂做了一次全面保养,把车里里外外都清洁了一遍。虽然这辆车已经三年车龄,但看上去几乎和新车没区别。 在英国,三年以内的新车通常不需要做MOT年检。而且很多这类新车会通过PCP(个人合同购车)方式出租给车主。简单来说,就是车主每月支付一笔租金,租期通常为三年,期满后可以选择一次性付清尾款买下车辆,也可以继续换租一辆新车。 举个例子,如果一辆新车售价是10万英镑,车厂可能按未来三年折旧后的50%残值来计算每月租金。三年后,如果车主不想买断,车厂就会将车辆作为二手车卖出,回收那5万英镑的残值。这样一来,车厂基本不会亏钱。此外,PCP合同中还有附加条款,比如每年限行1万英里,超出的部分需要额外付费,这些内容都会写在合同里。 车龄到了三年,车辆需要首次做MOT年检,同时车辆的市场价值也会首次出现较大幅度的贬值(一般是50%,甚至更多)。修车厂老板告诉我,相比玛莎拉蒂等其他豪车,保时捷的保值率相对较高。 这一年我开这辆保时捷基本没出什么问题。今年年初做了年检,顺利通过。随后又做了一次常规保养,修车厂老板告诉我,前后刹车片已经磨损了80%–85%。我们住剑桥村里,开车比较多(上班、送娃、家庭旅游都要用车),一年大概能开1-2万英理。 几周后我将车送回去更换刹车片。修完后账单是将近900英镑。我觉得有点贵,车行老板解释说,不仅换了前后刹车片,还有一个前雷达的传感器掉进了车体内部,为了修这个传感器需要拆掉前保险杠等部件,花了6个小时人工费。 我当时质疑说为啥这次修这么贵,他说:“因为这是保时捷。”我说:“那和别的车有什么区别?”他说:“It is not the same.” 我说不都一样么,他说:“It is not...
  6. 重要通知: 弃用 FeedBurner RSS 请改用 https://justyy.com/feed 最近我发现原本的 RSS(/rss、/feed)没有按时更新。 进一步检查后发现这些地址都被 301 重定向到了 FeedBurner(https://feeds.feedburner.com/zhihua-xblog),而 FeedBurner 已经久未维护,偶有抓取失败或延迟,导致读者无法及时收到新文章。 造成这次重定向的原因是我们使用的第三方主题/插件(mytheme)里曾经内置了将站点 feed 转发到 FeedBurner 的功能。 当时之所以做 301...
  7. 换了个奥迪Q5大灯花了我1000英镑 我那辆奥迪Q5 SUV今年年检没通过,原因是左前车灯坏了,需要更换。车厂告诉我,光是订购零件就要700多英镑,加上人工费,总费用得1000英镑。但没办法,如果不修,车辆年检(MOT)就过不了,车也不能上路。 MOT是英国的机动车强制性安全检测(Ministry of Transport Test)的简称。 近侧前位置灯不工作 drl/位置灯集成(4.2.1(a)(ii)) Nearside Front Position lamp not working drl/position...
  8. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: // @justyy var request = require("request")...

Ubuntu 关闭 Pro 更新提示

2025年7月15日 21:12

系统版本 Ubuntu 24.04

每次 apt update 都会带出一大堆提示升级但需要 ubuntu pro 才能升级的提示,比如:

Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
  vlc-plugin-qt libvlc5 libzvbi-common vlc-data libvlccore9 vlc vlc-bin
  vlc-l10n libcjson1 libavdevice60 ffmpeg libpostproc57 vlc-plugin-samba
  libavcodec60 libzvbi0t64 vlc-plugin-notify libavutil58 libswscale7
  vlc-plugin-access-extra vlc-plugin-skins2 vlc-plugin-video-splitter
  libswresample4 vlc-plugin-video-output libavformat60 v2ray libvlc-bin
  vlc-plugin-base vlc-plugin-visualization libavfilter9
Learn more about Ubuntu Pro at https://ubuntu.com/pro

看着乱不说,心理还不爽,vlc 插件居然要 pro 才能升级?关了关了。

终端下打开文件夹:

cd /var/lib/ubuntu-advantage/apt-esm/etc/apt/sources.list.d
ls

编辑文件夹下的 ubuntu-esm-apps.sources 文件。

sudo vi ubuntu-esm-apps.sources

将文件里面所有行都用 # 注释掉,最后结果:

# Written by ubuntu-pro-client
# Types: deb
# URIs: https://esm.ubuntu.com/apps/ubuntu
# Suites: noble-apps-security noble-apps-updates
# Components: main
# Signed-By: /usr/share/keyrings/ubuntu-pro-esm-apps.gpg

再次执行 apt update apt upgrade 就不会出现 Ubuntu pro 才能更新的提示了。

Windows 11 升级 24H2 提示 ahsProtector 尚未准备好

2025年7月10日 08:55

问题

Windows 11 升级 24H2 提示下面的错误:

ahsProtector
你的电脑上有服务尚未准备好用于此版本的Windows。有新版本可用。

如图:

win11-24H2-ahsProtector

解决办法

  1. 打开 C:\Windows\System32\drivers\ 文件夹
  2. 找到文件 ahs_protect.sys
  3. 将上面的文件名改为 ahs_protect.sys.bak

回到上面的提示框,点刷新即可继续升级。

升级完成后,会自动出现 ahs_protect.sys 文件,你可以把重命名的 .bak 文件删除了。

聊一聊分布式系统中的时间

2024年10月21日 08:41

今天聊一下时间的话题。在分布式系统中,“时间” 是一个挺有趣,但是很难处理的东西。我把自己的理解简单整理下来。

不可靠的物理时钟

首先,单一节点的物理时钟是不可靠的。

物理时钟本身就有偏差,可是除此之外,可以引起节点物理时钟不准确的原因太多了,比如 clock jump。考虑到 NTP 协议,它基于 UDP 通信,可以从权威的时钟源获取信息,进行自动的时间同步,这就可能会发生 clock jump,它就是说,时钟始终会不断进行同步,而同步回来的时间,是有可能不等于当前时间的,那么系统就会设置当前时间到这个新同步回来的时间。即便没有这个原因,考虑到数据从网络传输的延迟,处理数据的延迟等等,物理时钟是非常不可靠的。

如果一个分布式系统,多个节点想要仅仅依赖于物理时钟来完成什么操作,那么只能祈祷运气足够好了。在 《从物理时钟到逻辑时钟》这篇文中,我已经介绍了对于物理时钟不可靠的问题,我们有一个解决的办法,就是引入 Lamport 逻辑时钟,或者使用向量时钟,这里就不赘述了。

超时

分布式系统中什么样的执行结果最难处理,成功还是失败?其实都不是,最难处理的结果是超时,因为执行超时了,但是系统却并不知道它:

  • 是没执行,
  • 是执行成功了,
  • 还是执行失败了。

所谓超时,一个显然的问题是,超过多少时间才算超时?往往没有一个公式,更没有一个标准答案,我觉得《Designing Data-Intensive Applications》这本书里面对这一点总结得很好——对于超时时间的定义,其实就是一个 tradeoff,一个基于 failure detection delay 和 risk of premature timeouts 之间抉择的平衡。如果超时时间设置长了,就会减少超时判定的误杀,但是对于系统失败的识别就会延迟;反之,如果超时时间设置过短,那就会触发更多看起来是超时的 case,但是它们本身其实并没有真正超时。

通常来说,对于超时的处理,其实办法也不多。一种是放弃,一种是重试。就像消息投递,如果要保证 “至多投递一次”,那在投递超时后,就直接放弃;如果要保证 “至少投递一次”,那在投递超时后,就重试。如果要重试,那就需要引入保证幂等性的机制。

分布式事务 SAGA 对于超时的处理,其实也是遵照上面的原则,在系统内单步都成为事务的基础上,把流程视作一个状态机,无论单步操作是成功还是失败,都会根据清晰的预定义逻辑,触发相应的正向流程或者反向流程,可是唯独超时,多数情况下最有意义的事情就是重试,也只能重试,因为谁也不知道它究竟实际是成功了还是失败了。

说完操作超时,再来说一下节点超时。很多分布式系统中都会使用一种 lease(租约)的机制,比如一个集群中的 leader,作为 leader 会扮演不同的角色,但是必须要 renew 这个 lease,否则超过一定的时间,无论它给不给响应,它都会被开除出 leader 的角色,而 follower 会重新选举(或者其他方式)一个 leader。

比较难处理的是,如果这个节点本来是被 hang 住了,导致了超时,它也已经被踢下 leader 的角色,但是之后它 “活” 过来了(比如经过了一个超长时间的 GC),它还以为自己是 leader,继续去干 leader 干的事,变成了一个假 leader。这其实就是出现了脑裂,本质上是一个一致性的问题。这种情况比较难处理,因为即便有 heartbeat 不断检测,在每两个 heartbeat 的间隙,可能这种重要的变动就发生了。

要解决这种问题,需要使用 token fence 的方法,即让每次最关键的状态数据的更改,携带一个单调递增的 token,这种情况下这个假 leader 发起更改的 token,已经小于系统中最新的 token 了,接收这个数据更改的子系统应该拒掉这个请求。上面说的节点超时的情况我在《谈谈分布式锁》里面有详细说明。

计算机的两种时钟

有两种时钟是计算机普遍支持的,一种叫做 time-of-day clock,就是我们一般意义上的时钟,代表着相对于 1970 年 1 月 1 日的 epoch 时间,也就是 Java 里面 System.currentTimeMillis() 返回的。网络时间协议 NTP 就是用来同步计算机这个时间的。

不过,其实还有一种时钟,叫做 monotonic clock(单调时钟),在 Java 里面相应的接口是 System.nanoTime()。这个时钟有一个特点,就是它永不回头。对于 time-of-day clock 来说,时间是可能 “回头” 的,对于很多应用来说,时间回头是要命的。不过这个时钟给出的具体时间却是毫无意义,如果在不同的机器上调用 System.nanoTime(),会得到完全随机的结果。API 的名字是纳秒,可是这个时钟并不给出到纳秒的时间精度,它的作用是用来帮助计算间隔时间的:在同一个节点,第二次调用的时间减掉第一次调用的时间,这个结果(时间间隔)是严格递增(不回头)的。从这个意义上说,除去时间这个视角本身,这个时钟更像是一个单调的计数器。既然是单调的计数器,就可以用来帮助产生系统严格自增的 ID。

下面是 System.nanoTime() Javadoc 上面的解释:

Returns the current value of the most precise available system timer, in nanoseconds.
This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative). This method provides nanosecond precision, but not necessarily nanosecond accuracy. No guarantees are made about how frequently values change. Differences in successive calls that span greater than approximately 292 years (263 nanoseconds) will not accurately compute elapsed time due to numerical overflow.

TrueTime

一般来说,我们都知道计算机的时钟有误差,可是这个误差是多少,差 1 毫秒还是 1 分钟,并没有任何严格保证。绝大多数接触到的时间 API 也是如此,可是,Google 数据库 Spanner 的 TrueTime API 却。它使用了 GPS 时钟和原子钟两种完全独立的机制来冗余某一个机制失败导致的时钟问题,增加 reliability。此外,它还有和 System.nanoTime() 一样的严格递增的特点。

它有三个核心 API,很有意思:

  • TT.now() 它返回 [earliest, latest] 这样一个范围,表示当前时间就在这个范围内;
  • TT.after(t) 它返回当前时间是不是肯定在 t 之后
  • TT.before(t) 它返回当前时间是不是肯定在 t 之前

有了 TrueTime,这让分布式系统中,本来无法通过物理时钟解决的问题也变得可解决了。比如对于操作冲突的问题,现在的新办法就是等一个 buffer 时间,TrueTime 认为已经前一个操作的结束时间肯定已经过去了,再来启动后一个操作。当然,这个方法的缺点是 throughput,因为整个操作周期因为 buffer 时间的关系变长了。

《四火的唠叨》文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接

一站式操作系统 ISO 下载平台

2025年10月28日 00:00

找到一个安全、便捷且资源丰富且下载速度较快的操作系统 ISO 文件下载平台显得尤为重要。很多小伙伴习惯使用 MSDN,但又不喜欢其登录机制,这里杜老师推荐 OS.click,一款专注于为用户提供实用、高效的系统下载服务的网站。

丰富的资源库

OS.click 拥有海量操作系统 ISO 文件可供下载,涵盖了当下主流的两大操作系统阵营。

在 Windows 系统方面,无论是较为经典的 Windows 8.1,还是广泛运用于个人和企业的 Windows 10,以及最新的 Windows 11,都有完整且经过精心挑选整理的版本提供给用户。

无论您是想要体验全新的系统功能,还是需要回退到熟悉的旧版本进行系统恢复,甚至是搭建特定的测试环境,OS.click 都能满足您不同的需求。

对于 Linux 系统爱好者和开发者来说,这里同样是一座宝藏。Ubuntu 作为 Linux 系统中广受欢迎的发行版之一,以其用户友好的界面和强大的社区支持,吸引了众多用户。

在 OS.click 上,可以轻松获取到各个稳定版本的 Ubuntu ISO,方便用户快速搭建开发环境、进行系统测试或者部署服务器等操作。

而 Debian 作为 Linux 世界中以稳定性和安全性著称的系统,同样在 OS.click 上有丰富的资源,无论是用于个人桌面电脑还是企业级服务器的系统安装,都能在这里找到合适的 Debian ISO 版本。

快速便捷下载体验

网站名称中的 “lightning fast” 绝非夸大其词。

OS.click 通过先进的服务器技术和优化的网络架构,确保用户能够以极快的速度下载所需的 ISO 文件。

这意味着用户无需长时间等待,即可快速获取系统安装文件,大大提高了工作效率和使用体验。

无论您是处于家庭网络环境下,还是在企业内部网络中,OS.click 都能凭借其强大的网络资源和智能的流量分配机制,为用户提供智能、稳定且高速的下载通道,让用户能够迅速开始系统的安装或升级过程。

简洁直观用户界面

OS.click 的界面设计简洁明了,易于操作。

对于那些不熟悉技术或者对网络下载流程不太熟悉的新手用户来说,也能轻松上手。

在网站的首页,清晰地展示了可下载的各类操作系统 ISO 文件的列表,用户只需通过简单的点击操作,即可进入相应的下载页面。

没有繁琐的注册流程,也没有复杂的广告干扰,用户可以专注于寻找自己需要的系统文件并立即开始下载,节省了宝贵的时间和精力。

安全可靠下载保障

在互联网上下载软件或文件,安全性始终是用户最关心的问题之一。

OS.click 深知这一点,因此致力于为用户提供能够安全可靠的下载服务。

网站对所有的 ISO 文件都进行了严格的审核和筛选,确保这些文件没有携带恶意软件、病毒或者其他安全风险。

用户在 OS.click 上下载的系统文件,可以放心地用于安装和使用,大大降低了因下载到不安全文件而可能导致的系统故障、数据泄露等风险。

灵活多样应用场景

OS.click 的服务适用于多种场景。

例如,当用户的电脑出现系统故障,需要重装系统时,只需访问 OS.click,找到对应的系统 ISO 文件进行下载,然后通过简单的步骤制作启动盘,就能顺利完成系统的重新安装。

对于那些想要尝试不同操作系统以寻找更适合自己的系统环境的用户来说,OS.click 提供的丰富资源也为其提供了极大的便利性。

此外,对于企业 IT 管理人员而言,在企业内部进行批量的系统安装或者升级时,OS.click 快速稳定的下载服务能够有效提高工作效率,节省大量的时间和人力成本。

社区互动支持

OS.click 并不仅仅是一个单纯的下载平台,它还拥有活跃的用户社区。在这里,用户可以交流使用心得、分享经验技巧、寻求技术支持等。

对于在系统安装或使用过程中遇到的问题,用户可以在社区中提出咨询,其他同好或者经验丰富的用户会积极地提供帮助和解决方案。

这种良好的社区互动氛围,不仅增强了用户的使用体验,还促进了用户之间的知识共享和技术交流,有利于整个用户群体的技术水平提升。

在众多的操作系统 ISO 文件下载平台中,OS.click 凭借其丰富的资源、快速的下载速度、简洁友好的界面、安全保障以及多样化的应用场景,成为了众多用户在系统安装和升级过程中的首选。

无论是个人用户还是企业用户,无论是新手还是技术老手,OS.click 都能为他们提供满意的服务,助力他们在数字化世界的探索和工作中更加顺利高效。

如果您也在寻找一个可靠的系统 ISO 下载平台,不妨试试 OS.click,相信它不会让您失望。

在银河麒麟桌面操作系统 ARM 版上安装 KVM 虚拟化

2025年8月17日 00:00

KVM 是一种开源全虚拟化解决方案,能够在 Linux 系统运行多个操作系统。本文将详细介绍如何在银河麒麟桌面操作系统 ARM 版安装 KVM 虚拟化环境,帮助用户搭建高效的虚拟化平台。

准备工作

  1. 硬件要求

确保 ARM 架构设备支持虚拟化技术。通常,支持虚拟化的 ARM 处理器会支持硬件辅助虚拟化功能。

系统至少需要 4GB 内存和 20GB 的硬盘空间。

  1. 软件要求

银河麒麟桌面操作系统 ARM 版「如 V10」

KVM 虚拟化相关的软件包。

安装 KVM 虚拟化环境

  1. 安装 KVM 和相关工具
1
2
sudo apt update
sudo apt -y install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

注意:在银河麒麟桌面操作系统 ARM 版上,可以通过上面命令安装 KVM 和相关工具。

  1. 包的作用

上面软件包的作用如下:

包名作用
qemu-kvm提供 KVM 虚拟化核心功能
libvirt-daemon-system用于管理虚拟机的后端服务
libvirt-clients提供客户端工具管理虚拟机
bridge-utils用于配置网络桥接
virt-manager提供图形化界面管理虚拟机
  1. 添加用户到 libvirt 组内
1
sudo usermod -aG libvirt $(whoami)

注意:为方便管理虚拟机,需要将当前用户添加到 libvirt 组,然后注销重新登录,使组成员关系生效。

  1. 验证是否安装成功
1
virsh --version

注意:运行上面命令来检查 KVM 是否正常工作,如果返回版本信息,说明 KVM 安装成功了。

创建 KVM 虚拟机

  1. 下载镜像

可以从银河麒麟官方网站下载适合 ARM 架构的虚拟机镜像文件。

Kylin-Desktop-V10-SP1-2403-Release-20240430-arm64.iso 文件。

  1. 创建虚拟磁盘
1
qemu-img create -f qcow2 /path/to/disk.img 50G

注意:使用上面命令创建虚拟磁盘。其中/path/to/disk.img 是虚拟磁盘路径,50G 表示磁盘的大小。

  1. 启动 KVM 虚拟机安装
1
qemu-system-aarch64 -m 2048 -cpu cortex-a76 -smp 4 -M virt -bios /path/to/QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -drive if=none,file=/path/to/disk.img,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=/path/to/Kylin-Desktop-V10-SP1-2403-Release-20240430-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom

注意:使用上面命令启动 KVM 虚拟机安装。其中-m 2048 分配 2048MB 内存;-cpu cortex-a76 指定 CPU 类型;-smp 4 是指定虚拟 CPU 核心数。

  1. 完成安装

按照虚拟机安装界面的提示完成安装过程。

安装完成后 KVM 虚拟机将自动重启。

使用 KVM 管理虚拟机

  1. 使用 virsh 命令行工具

列出所有 KVM 虚拟机:

1
virsh list --all

启动 KVM 虚拟机:

1
virsh start <KVM 虚拟机名称>

关闭 KVM 虚拟机:

1
virsh shutdown <KVM 虚拟机名称>

强制停止 KVM 虚拟机:

1
virsh destroy <KVM 虚拟机名称>

挂起 KVM 虚拟机:

1
virsh suspend <KVM 虚拟机名称>

恢复挂起 KVM 虚拟机:

1
virsh resume <KVM 虚拟机名称>
  1. 使用 virt-manager 图形化界面

virt-manager 提供了一个直观的图形化界面,方便用户管理 KVM 虚拟机。

启动 virt-manager 后,可以连接到本地或者远程的 KVM 服务器,创建、启动、停止 KVM 虚拟机。

❌