在 VirtualBox 中部署 SteamOS 测试虚拟机

把 Valve Steam Deck Recovery 镜像转换为 VirtualBox 虚拟机,并完成可用分辨率、正常关机和 Steam 启动配置。

这套方案使用 Steam Deck 恢复镜像,并对系统内核和 GRUB 做测试环境改造。它不属于 Valve 官方支持的通用 PC 安装方式,也不代表真实 Steam Deck 或 Linux 游戏主机的图形性能。

1. 准备环境

本次验证使用:

资源版本或文件用途
VirtualBox7.2.14创建和运行虚拟机
Steam Deck Recoverysteamdeck-oobe-repair-20260707.10-3.8.14.img.bz2SteamOS 恢复系统盘
Python 3Windows 版本使用标准库 bz2 解压镜像
Windows OpenSSH ClientWindows 可选功能从宿主通过 SSH 管理来宾

下载入口:

宿主至少要为压缩镜像、解压后的 IMG、两块 VDI 和后续快照预留足够空间。数据盘逻辑容量为 128 GiB,但使用动态分配,不会立刻占满宿主磁盘。

2. 下载并核对恢复镜像

在 PowerShell 中执行:

1
2
3
4
5
6
7
8
9
$dir = 'D:\Downloads\SignRiver-Test-OS\steamos'
New-Item -ItemType Directory -Force $dir | Out-Null

curl.exe -fL --retry 3 `
  -o "$dir\steamdeck-oobe-repair-20260707.10-3.8.14.img.bz2" `
  'https://steamdeck-images.steamos.cloud/recovery/steamdeck-oobe-repair-20260707.10-3.8.14.img.bz2'

Get-FileHash -Algorithm SHA256 `
  "$dir\steamdeck-oobe-repair-20260707.10-3.8.14.img.bz2"

本次验证文件为:

1
2
大小:3357999306 bytes
SHA256:4254ee02ec34ae8add9aceef1881a2ce675a9d0176171df92e0eaa1bf014c594

本文固定使用 20260707.10-3.8.14。不要在复现时未经验证就换成索引中的其他镜像。

3. 解压镜像并创建虚拟磁盘

使用 Python 标准库解压 .bz2。把下面代码保存为 D:\Downloads\SignRiver-Test-OS\steamos\extract-image.py

1
2
3
4
5
6
7
8
import bz2
import shutil

src = r"D:\Downloads\SignRiver-Test-OS\steamos\steamdeck-oobe-repair-20260707.10-3.8.14.img.bz2"
dst = r"D:\Downloads\SignRiver-Test-OS\steamos\steamdeck-oobe-repair-20260707.10-3.8.14.img"

with bz2.open(src, "rb") as fin, open(dst, "wb") as fout:
    shutil.copyfileobj(fin, fout, length=4 * 1024 * 1024)

运行脚本:

1
python 'D:\Downloads\SignRiver-Test-OS\steamos\extract-image.py'

然后把 raw IMG 转成 VDI,并创建一块 128 GiB 动态数据盘:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$VBoxManage = 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'
$dir = 'D:\Downloads\SignRiver-Test-OS\steamos'

New-Item -ItemType Directory -Force "$dir\vm" | Out-Null

& $VBoxManage convertfromraw `
  "$dir\steamdeck-oobe-repair-20260707.10-3.8.14.img" `
  "$dir\vm\steamos-install.vdi" `
  --format VDI

if ($LASTEXITCODE -ne 0) { throw '恢复盘转换失败' }

& $VBoxManage createmedium disk `
  --filename "$dir\vm\steamos-disk.vdi" `
  --size 131072 `
  --format VDI

if ($LASTEXITCODE -ne 0) { throw '数据盘创建失败' }

4. 创建 VirtualBox 虚拟机

以 PowerShell 执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$VBoxManage = 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'
$dir = 'D:\Downloads\SignRiver-Test-OS\steamos'

& $VBoxManage createvm --name SteamOS --ostype ArchLinux_64 --register

& $VBoxManage modifyvm SteamOS `
  --memory 8192 `
  --cpus 2 `
  --vram 256 `
  --graphicscontroller vmsvga `
  --accelerate-3d on `
  --firmware efi `
  --nic1 nat `
  --nictype1 82540EM `
  --ioapic on `
  --audio-enabled off `
  --usb off `
  --clipboard-mode bidirectional `
  --drag-and-drop bidirectional

创建 SATA 控制器并挂载恢复盘和数据盘:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
& $VBoxManage storagectl SteamOS `
  --name SATA `
  --add sata `
  --controller IntelAhci `
  --portcount 2

& $VBoxManage storageattach SteamOS `
  --storagectl SATA `
  --port 0 `
  --device 0 `
  --type hdd `
  --medium "$dir\vm\steamos-install.vdi"

& $VBoxManage storageattach SteamOS `
  --storagectl SATA `
  --port 1 `
  --device 0 `
  --type hdd `
  --medium "$dir\vm\steamos-disk.vdi"

设置 SSH 端口转发:

1
2
& $VBoxManage modifyvm SteamOS `
  --natpf1 "ssh,tcp,127.0.0.1,2222,,22"

SSH 只绑定到宿主回环地址,不会直接暴露到局域网。

5. 首次启动并通过 SSH 接管

启动虚拟机:

1
& $VBoxManage startvm SteamOS --type gui

恢复镜像启动的是精简 OOBE/X 会话,而不是完整 KDE Plasma 桌面,因此没有开始菜单、Super 菜单或 Ctrl+Alt+T 终端属于正常现象。

恢复镜像测试阶段使用 deck 用户。按界面完成必要的初始操作后,从宿主连接:

1
ssh -p 2222 deck@127.0.0.1

连接成功后立即为账户设置自己的密码,并优先配置 SSH 公钥。本文不记录任何默认密码或私钥。

5.1 SSH 无法登录时:离线恢复自己的公钥

如果忘记密码、已有私钥却始终被拒绝,先不要反复猜密码。先关机并创建快照,然后用临时 Linux 救援虚拟机挂载 SteamOS 的系统盘,把自己的公钥追加回 deckauthorized_keys。这不会替换旧密钥,也不会暴露私钥。

先从自己的私钥导出公钥;公钥是一行以 ssh-ed25519ssh-rsa 等开头的文本:

1
2
$keyPath = "$env:USERPROFILE\.ssh\signriver_vm_rsa"
ssh-keygen -y -f $keyPath

救援虚拟机中应只连接 SteamOS 的系统盘,不要挂载额外的数据盘。用 lsblk -f 确认包含 deck 家目录的 Btrfs 根分区后挂载;本次固定恢复镜像的根分区为 /dev/sda5

1
2
3
4
5
6
7
8
9
sudo mount /dev/sda5 /mnt
sudo install -d -m 700 /mnt/deck/.ssh

# 使用编辑器把上一条命令导出的“整行公钥”追加到此文件末尾,不删除已有内容。
sudoedit /mnt/deck/.ssh/authorized_keys

sudo chmod 600 /mnt/deck/.ssh/authorized_keys
sudo sync
sudo umount /mnt

关闭救援虚拟机、移除系统盘挂载后,再启动 SteamOS。用对应私钥验证连接:

1
2
ssh -i "$env:USERPROFILE\.ssh\signriver_vm_rsa" `
  -p 2222 -o BatchMode=yes deck@127.0.0.1

救援前必须先创建 VirtualBox 快照;分区号可能随镜像版本变化,务必先用 lsblk -f 确认。不要把私钥、密码或完整的 authorized_keys 内容写进博客或上传到云端。

6. 安装 Arch LTS 内核解决分辨率问题

原恢复内核在 VMSVGA 下可能只提供约 640×480。已经验证可用的解决方式是保留原内核,再增加 Arch LTS 内核,让 vmwgfx 正常加载。

先在宿主创建快照:

1
2
3
$VBoxManage = 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'
& $VBoxManage snapshot SteamOS take 'before-arch-lts-vmsvga' `
  --description 'Before installing Arch LTS kernel for VMSVGA support'

在来宾中解除只读,并使用本次固定恢复镜像已经验证通过的命令安装 LTS 内核:

1
2
3
4
sudo steamos-readonly disable 2>/dev/null || true
sudo pacman -S --noconfirm --needed \
  --assume-installed=initramfs \
  linux-lts

本次验证安装的是 linux-lts 6.18.44-1

--assume-installed=initramfs 是针对本文固定恢复镜像仓库状态的兼容参数。执行前确认系统已有 initramfs 工具链和正常的 /boot 内容,不要在其他 Linux 系统上照抄。

备份并重新生成 EFI GRUB 配置:

1
2
3
4
5
6
sudo cp /efi/EFI/steamos/grub.cfg \
  /home/deck/grub.cfg.before-lts

sudo grub-mkconfig -o /efi/EFI/steamos/grub.cfg
sudo grep -E '^menuentry |^submenu ' /efi/EFI/steamos/grub.cfg
find /usr/lib/modules -name 'vmwgfx.ko*' -print

从输出中找到 linux-lts 对应的完整 GRUB 条目。它的 UUID 会因虚拟磁盘而变化,不能照抄别人的值。本次验证中的条目形式如下:

1
gnulinux-advanced-<你的 UUID>>gnulinux-linux-lts-advanced-<你的 UUID>

先只让下一次启动进入 LTS:

1
2
3
4
entry='把这里替换为上一条命令找到的完整 linux-lts 条目'
sudo grub-editenv /efi/EFI/steamos/grubenv set next_entry="$entry"
sudo grub-editenv /efi/EFI/steamos/grubenv list
sudo systemctl poweroff

虚拟机关闭后,在宿主再次固定显示配置并启动:

1
2
3
4
5
6
& $VBoxManage modifyvm SteamOS `
  --graphicscontroller vmsvga `
  --accelerate-3d on `
  --vram 256

& $VBoxManage startvm SteamOS --type gui

重新 SSH 登录并验证:

1
2
3
4
uname -r
lspci -nnk | sed -n '/VGA compatible controller/,+5p'
lsmod | grep vmwgfx
DISPLAY=:0 XAUTHORITY=/home/deck/.Xauthority xrandr --current

确认 uname -r 显示 LTS 内核、vmwgfx 已加载,并且 xrandr 出现可用分辨率后,再把 LTS 固定为默认启动项。

本次成功路线是备份 /efi/EFI/steamos/grub.cfg,然后把文件开头的:

1
set default="0"

改为:

1
set default="gnulinux-advanced-<你的 UUID>>gnulinux-linux-lts-advanced-<你的 UUID>"

修改后重启一次,再执行 uname -r 确认仍进入 LTS 内核。

grub.cfg 是生成文件,再次运行 grub-mkconfig 会覆盖这个修改。原 linux-neptune-616 内核仍保留在 GRUB 高级启动项中,LTS 无法启动时可回退。

6.1 固定可用分辨率,阻止 VirtualBox 自动协商超高画布

LTS 内核下,xrandr 的输出名实测为 Virtual-1。如果旧配置仍使用 VGA-1,设置会失败,来宾可能回到异常的超大画布并出现横向、纵向滚动条。

还有一种更隐蔽的情况:VirtualBox 的“自动调整客户机显示大小”会向 SteamOS 通报宿主窗口的超高逻辑尺寸。实测桌面曾被自动协商为 7680×4320;画面虽然没有滚动条,但所有文字和按钮都会缩成很小的一块。这不是 SteamOS 的缩放设置问题,也不需要开启 VirtualBox 缩放模式。

先创建一个开机执行的分辨率服务,将来宾固定为 1600×900。这个尺寸在普通桌面窗口中仍然清晰,同时比 1920×1080 更容易阅读:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
sudo tee /etc/systemd/system/signriver-resolution.service >/dev/null <<'EOF'
[Unit]
Description=Set SteamOS VirtualBox display resolution
After=signriver-xorg.service
Requires=signriver-xorg.service

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c 'for i in {1..20}; do DISPLAY=:0 /usr/bin/xrandr --output Virtual-1 --mode 1600x900 && exit 0; sleep 1; done; exit 1'
RemainAfterExit=yes

[Install]
WantedBy=graphical.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now signriver-resolution.service
DISPLAY=:0 XAUTHORITY=/home/deck/.Xauthority xrandr --current

当前 SteamOS 默认使用 KDE Wayland 时,桌面会话也可能在服务执行后再次应用显示配置。可以在已登录的桌面会话中查看并切换 KScreen 模式:

1
2
3
4
XDG_RUNTIME_DIR=/run/user/1000 \
WAYLAND_DISPLAY=wayland-0 \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
kscreen-doctor -o

从输出中找到 Virtual-11600x900@60 对应模式编号后执行,例如本次为编号 18

1
2
3
4
XDG_RUNTIME_DIR=/run/user/1000 \
WAYLAND_DISPLAY=wayland-0 \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
kscreen-doctor output.1.mode.18

最后必须在宿主禁用自动调整,并保留原始像素显示。不要使用 VirtualBox 的缩放模式,它会对整张来宾画面插值放大而变模糊。先正常关机,再执行:

1
2
3
4
5
$VBoxManage = 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'
& $VBoxManage setextradata SteamOS GUI/Scale false
& $VBoxManage setextradata SteamOS GUI/AutoresizeGuest false
& $VBoxManage setextradata SteamOS GUI/LastGuestSizeHint '1600,900'
& $VBoxManage startvm SteamOS --type gui

这样使用的是来宾原始像素;既不会回到 7680×4320 的巨幅画布,也不会因 VirtualBox 二次缩放而变模糊。若使用不同大小的宿主窗口,可相应改成 1440×9001280×720,但每次改动后都应保持 GUI/AutoresizeGuest=false

7. 修复 ACPI 电源按钮

如果宿主发送 ACPI 电源按钮后虚拟机不关机,在来宾中创建配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cat > /home/deck/zz-signriver-poweroff.conf <<'EOF'
[Login]
HandlePowerKey=poweroff
PowerKeyIgnoreInhibited=no
EOF

sudo install -m 644 \
  /home/deck/zz-signriver-poweroff.conf \
  /etc/systemd/logind.conf.d/zz-signriver-poweroff.conf

sudo systemctl restart systemd-logind
systemd-analyze cat-config systemd/logind.conf

在宿主测试正常关机:

1
& $VBoxManage controlvm SteamOS acpipowerbutton

虚拟机应执行正常关机,而不是保持无响应。

8. 正确启动 Steam

重新启动虚拟机后,不要调用 /usr/bin/steam。该恢复镜像中的这个入口会进入 OOBE 包装流程,并可能清理 Steam 配置。直接启动实际客户端:

1
/usr/lib/steam/steam

如果需要从 SSH 中启动 Steam,必须同时提供用户会话环境:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo systemd-run \
  --unit=signriver-steam \
  --property=Restart=no \
  --uid=deck \
  --working-directory=/home/deck \
  --setenv=HOME=/home/deck \
  --setenv=DISPLAY=:0 \
  --setenv=XDG_RUNTIME_DIR=/run/user/1000 \
  --setenv=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
  --setenv=XAUTHORITY=/home/deck/.Xauthority \
  /usr/lib/steam/steam -skipinitialbootstrap

Steam 首次启动后会自行下载客户端更新。等待更新完成并登录自己的 Steam 账户。

9. 验证并创建快照

确认以下项目:

  • SteamOS 能从恢复系统盘稳定启动;
  • uname -r 显示 LTS 内核;
  • vmwgfx 已加载;
  • xrandr 能看到高于 640×480 的可用分辨率;
  • 宿主能通过 127.0.0.1:2222 SSH 连接;
  • ACPI 电源按钮可以正常关机;
  • /usr/lib/steam/steam 可以启动并保留登录状态。

关机后创建最终快照:

1
2
3
$VBoxManage = 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'
& $VBoxManage snapshot SteamOS take 'steamos-ready' `
  --description 'SteamOS recovery image with LTS kernel, VMSVGA, SSH and Steam validated'

日常命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$VBoxManage = 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'

# GUI 启动
& $VBoxManage startvm SteamOS --type gui

# 无界面启动
& $VBoxManage startvm SteamOS --type headless

# 请求正常关机
& $VBoxManage controlvm SteamOS acpipowerbutton

# 查看配置与状态
& $VBoxManage showvminfo SteamOS --machinereadable

# 查看快照
& $VBoxManage snapshot SteamOS list --machinereadable

恢复快照会丢弃该快照之后的磁盘状态。恢复前先导出需要保留的项目文件、游戏存档和测试证据。

更多虚拟机系统部署方案请返回虚拟机系统部署指南

Powered by YSY
使用 Hugo 构建
主题 StackJimmy 设计