Total Pageviews

Monday 26 August 2024

Launch Steam from Case-sensitive Root Filesystem on macOS


由于一些历史原因,steam 至今仍不支持运行在大小写敏感的 apfs 或 hfs 文件系统上。但是由于 steam 仅要求 ~/Library/Application Support/Steam 路径下的文件区分大小写即可,我们借助软连接和磁盘镜像来解决这个问题。


Create Case-insensitive Disk Image

打开 Disk Utility 在菜单中选择 File->New Image->Blank Image,在打开的窗口中填写磁盘镜像的 Name,Size 和 Format,注意这里一定要选不区分大小写的文件系统(建议 APFS)。本文假设镜像保存在 /usr/local/var/Steam.dmg ,Name 是 SteamData 。建立好后双击该镜像挂载,这样该镜像会挂载在 /Volumes/<Name> 下,在这里就是 /Volumes/SteamData 。


Setup Symbolic Link for Steam

在终端中执行:

cd "~/Library/Application Support"

rm -rf Steam

ln -s /Volumes/SteamData Steam

接下来重新运行 steam.app 就可以愉快的玩耍啦。

Automatically Mount Image

这样一来虽然可以玩耍了,但是每次重新启动都要手动挂载该镜像,而且会在 Finder 侧边栏常年占据一个位置,十分不方便。我们可以新建一个 launchd 服务来帮助我们做这件事情,新建文件 ~/Library/LaunchAgents/data.steam.dmg.plist 并写入下述内容:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

  <dict>

    <key>Label</key>

    <string>data.steam.dmg</string>

    <key>Program</key>

    <string>/usr/bin/hdiutil</string>

    <key>ProgramArguments</key>

    <array>

        <string>hdiutil</string>

        <string>attach</string>

        <string>-nobrowse</string>

        <string>/usr/local/var/Steam.dmg</string>

    </array>

    <key>RunAtLoad</key>

    <true/>

  </dict>

</plist>

该文件的作用是在当前用户登陆之后自动运行一次 hdiutil attach -nobrowse /usr/local/var/Steam.dmg 命令,其中 -nobrowse 参数的作用是不在 Finder 中显示。接下来运行下述命令向 launchd 注册该服务:

cd ~/Library/LaunchAgents

launchctl load -w data.steam.dmg.plist

至此就实现了开机自动挂载。

---------------------------------------

Replace DMG with Sparse Bundle Image

在前面的文章中介绍了使用大小写不敏感的磁盘镜像为 Steam 开辟一个存储区。但是这有一个弊端,即一旦 DMG 文件建立好,其占用的硬盘空间就固定了,即使没有占满 DMG 内部的空间。为此,我们可以用 macOS 提供的一种动态增长的 Image 结构来替换前文的 DMG 文件,即 Sparse Bundle 格式,这也是 Time Machine 内部使用的格式。该格式可动态增长,增长上限是建立文件时指定的值(可以 resize)。该格式虽然不利于分发,但却是持久化存储的一个非常好的选择。

Convert Existed DMG to Sparse Bundle

我们可以使用 hdiutil 来将一个已有的 DMG 文件转换成新格式。假设已经存在的文件是 Steam.dmg 。

hdiutil convert Steam.dmg -format UDSB -o Steam.sparsebundle

接下来可以选择扩大新镜像的增长上限,比如改成最大占用 100G:

hdiutil resize -size 100g Steam.sparsebundle

这并不会导致磁盘空间立刻消失 100G,而是实际使用多少就占用多少空间。


接下来需要更改相应的挂载脚本等信息,在前文的场景中即修改文件~/Library/LaunchAgents/data.steam.dmg.plist 如下,将内容中的 DMG 文件替换为新的文件即可:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

  <dict>

    <key>Label</key>

    <string>data.steam.dmg</string>

    <key>Program</key>

    <string>/usr/bin/hdiutil</string>

    <key>ProgramArguments</key>

    <array>

        <string>hdiutil</string>

        <string>attach</string>

        <string>-nobrowse</string>

        <string>/usr/local/var/Steam.sparsebundle</string>

    </array>

    <key>RunAtLoad</key>

    <true/>

  </dict>

</plist>

Create Sparse Bundle from Scratch

新建很简单,可以直接从 Disk Utility 中新建,注意在 Image Format 处选择 sparse bundle disk image 即可。


此外也可以使用 hdiutil 来建立:

hdiutil create -type SPARSEBUNDLE -size 100g -fs "APFS" NewImage.sparsebundle

其中 -fs 的参数有很多选择,如 “Case-sensitive APFS”,”Journaled HFS+” 等,完整的列表可以执行 hdiutil create -help 获取。

No comments:

Post a Comment