Windows 下用 PowerShell 制作 Ubuntu 24.04 启动盘:免 Rufus 原始写入 + 全程翻车排查实录
前言
最近给一台 2012 年的老 ThinkPad E430 重装系统:全盘清除 Win7,改装 Ubuntu 24.04.4 LTS。
按理说这是个简单活,结果从上午折腾到下午,把 U 盘坏块、SD 卡写保护锁、双硬盘启动顺序、残缺系统这些坑踩了个遍。本文记录两个核心内容:
- Windows 下不用 Rufus,用 PowerShell 直接把 ISO 原始写入 U 盘的完整方法(含全量校验)
- 装机全流程的翻车排查实录------每一个坑的现象、诊断过程和解法
一、为什么要绕开 Rufus
Rufus 当然是首选工具。但如果你想让流程可复现、可自动化(比如批量做盘、远程指导别人操作),脚本化原始写入有独特的优势:一条命令完成写入 + 全量校验,输出的每一行都能留档。
而且全量校验这一点 Rufus 反而没做到位------后面会看到,只校验开头 64MB 是要付出代价的。
1.1 前置条件
- ISO 文件(本例:
ubuntu-24.04.4-live-server-amd64.iso,3248MB) - 先算 ISO 的 SHA256 并与官方比对 。Ubuntu 官方
SHA256SUMS文件在镜像站可以拿到:
bash
# 与官方校验值比对,确认 ISO 本身完好
Get-FileHash -Algorithm SHA256 .\ubuntu-24.04.4-live-server-amd64.iso
- 确认目标 U 盘的磁盘编号(这一步千万看清,写错盘就是灾难):
powershell
Get-CimInstance Win32_DiskDrive |
Select-Object Index, Model, @{n='SizeGB';e={[math]::Round($_.Size/1GB,1)}}
1.2 写入脚本核心逻辑
写入思路:用 CreateFile 打开物理磁盘句柄(绕过文件系统),锁定并卸载卷,然后按 4MB 块流式写入 ISO 全部字节,最后全量回读算 SHA256 与 ISO 比对。
关键 API 调用(P/Invoke 部分):
csharp
// 打开物理磁盘,必须 FILE_SHARE_READ|FILE_SHARE_WRITE
CreateFile("\\\\.\\PhysicalDrive3", GENERIC_WRITE, ...);
// 锁定 + 卸载卷,否则写入会被文件系统干扰
DeviceIoControl(h, FSCTL_LOCK_VOLUME, ...);
DeviceIoControl(h, FSCTL_DISMOUNT_VOLUME, ...);
// 写完必须 FlushFileBuffers,否则写入缓存会掩盖真实落盘错误
FlushFileBuffers(h);
经验 1:
FlushFileBuffers不能省。 Windows 写缓存可能让写入"看起来成功",实际坏数据还躺在缓存里。本次翻车实录里第一块 U 盘就是写入时零报错、回读才发现数据损坏的。
经验 2:校验必须全量。 只回读前 64MB 毫无意义------坏块往往藏在 ISO 中后段的 squashfs 系统数据区,安装器解压到那里才会报install media checksum verification failed。
1.3 脚本编写时的两个 PowerShell 5.1 坑
- 整数溢出 :剩余字节数超过 Int32 上限时,
[int][Math]::Min($buf.Length, $total - $read)会直接抛溢出异常,要用 Int64 运算。 - 中文必坑 :
.ps1文件里带中文注释,PowerShell 5.1 按 GBK 解析会直接报莫名语法错误。脚本一律用纯 ASCII。
二、翻车排查实录
系统装到 ThinkPad E430 上后,好戏开始了。以下 6 个坑按时间顺序记录。
坑 1:安装器报 "The install media checksum verification failed"
现象:U 盘启动进入 Subiquity 安装器,没走几步就报安装介质校验失败。
诊断过程:
- ISO 本身的 SHA256 写入前已与官方值比对通过 → 排除源头问题
- 把 U 盘拿回 Windows 机器做全盘回读:SHA256 与 ISO 不一致
- 间隔几小时再回读一次,哈希稳定不变 → 不是偶发读取错误,是数据真的坏了
- 逐块差异扫描定位损坏区域
结论 :U 盘闪存有坏块,写入时被写缓存掩盖。写入成功 ≠ 数据落盘正确,必须全量回读校验。
解法:换 U 盘。这也是"写入后只抽查 64MB"这个流程缺陷的直接教训。
坑 2:新 U 盘连续报"函数不正确",写入被拒
现象:换新 U 盘重写,第一块就报"函数不正确";上午还能正常写入的设备突然不能写了。
诊断过程:
- 先排除软件层:
Get-Disk查看IsReadOnly = False→ Windows 层没锁 - 试试
Set-Disk -IsReadOnly $false再写 → 依然被拒 - 读测试正常(18.8 MB/s 稳定读出)→ 设备通信没问题,只是拒绝写入
- 症状组合"能读不能写"直指 SD 卡物理写保护开关
根因 :这块"U 盘"实际是读卡器 + SD 卡的组合。重新插卡时,手滑把卡侧面的 LOCK 滑块碰到了锁定位置。
解法:把滑块推回靠近金手指的一端(解锁位)。推回去后写入、全量校验一次通过。
经验 3:遇到"突然只读",先查物理写保护开关,再查软件锁。顺序反了会浪费大量时间。
坑 3:装完重启,看到的却是 Windows 7
现象:安装完成、重启、拔 U 盘------屏幕上出现的是 Win7 启动管理器(还带一键 GHOST)。
诊断:这是双硬盘机器:Kingston 480G SSD(新装的 Ubuntu)+ Samsung 120G SSD(旧 Win7)。BIOS 启动顺序里 Samsung 排在前面,重启时根本没轮到 Kingston 上的 GRUB。
重要更正 :一开始我以为是误把 Ubuntu 装进了 U 盘,后来确认装的位置是对的,纯粹是启动顺序问题 。区分方法:如果真的装进 U 盘了,进入的 Ubuntu 会非常慢且 /home 在 U 盘上;而单纯启动顺序问题的特征是"BIOS 里换盘启动就能进对系统"。
解法:
- 临时:开机按
F12选 Kingston 那块盘启动 - 永久:
F1进 BIOS →Startup→Boot,把ATA HDD0: Kingston...调到第一位,F10保存
坑 4:登录报 "Login incorrect",恢复模式下发现系统是残缺的
现象 :成功进入 Ubuntu 登录界面,用户名密码却报 Login incorrect。
诊断:按标准姿势进 GRUB recovery mode → root shell,结果发现更严重的问题:
passwd命令不存在(正常 Ubuntu 必有)ls /home输出为空 ------ 根本没有任何用户被创建过
根因:这块盘上是多次安装中断/覆盖留下的半成品系统。
解法:不值得修,直接重装一遍(10 分钟)。重装时在 Profile setup 页把用户名、密码认真设置并记下来。
经验 4 :GRUB recovery mode 是 Ubuntu 的万能后门------重置密码、修 fstab、救引导都靠它。进入方式:开机按住
Esc→Advanced options for Ubuntu→ 带(recovery mode)的项 →root - Drop to root shell prompt,然后mount -o remount,rw /后即可操作。
坑 5:旧 U 盘狂报 "Harddisk3 有一个不正确的区块"
现象:格式化旧 U 盘复用时,系统日志每 3 秒刷一条 bad block,甚至读测试第一个 4MB 都读不出来(CRC 错误)。
诊断与解法:
- 先换主板后面板 USB 口、重新插紧 → 接触不良排除后读测试通过
- 格式化成功后追加 2GB 读写压测,无 CRC 错误
- 但这块盘已有前科:降级为"临时传输用",不存唯一副本的重要数据
坑 6:Windows 打不开装过系统的 U 盘
现象:做安装盘的 U 盘在 Windows 下打不开。
说明 :这不是故障。安装盘被写入后是 Linux 文件系统(ISO9660/ext4 混合布局),Windows 原生不认识。要恢复 U 盘日常使用,用 diskpart 的 clean + 重建分区即可,无需第三方工具。
三、可复用的完整流程清单
把上面所有经验收敛成一份 checklist:
- ISO 校验 :SHA256 与官方
SHA256SUMS比对 - 选对磁盘 :
Get-CimInstance Win32_DiskDrive确认目标盘编号和容量,写脚本时加一道型号断言防误写 - 原始写入 :物理盘句柄 → 锁卷 → 卸载卷 → 流式写入 →
FlushFileBuffers - 全量校验:回读全盘算 SHA256,与 ISO 哈希比对,通过才算完成
- 装机时 :老机器 BIOS 设 Legacy Only;安装器选盘时看容量区分内置盘和 U 盘
- 装完重启:双硬盘机器检查 BIOS 启动顺序
- 突然只读:先查 SD 卡 LOCK 滑块,再查软件层
- 登录异常 :GRUB recovery mode 兜底,
ls /home先确认用户是否真的存在
结语
这次折腾最大的收获是两条流程原则:
- 写入后的全量校验不是可选项。写缓存会掩盖一切写入错误,抽查等于没查。
- 排障先分清"软件层"和"硬件层"。只读先看物理开关,CRC 错误先换 USB 口,报错信息里的措辞("函数不正确" vs "循环冗余检查")本身就是重要的诊断线索。
希望这篇实录能帮你少踩几个坑。