【巴托塞拉-Batocera】关于磁盘游戏的多盘炸盘的完美解决方案建立【软连接】
【巴托塞拉-Batocera】关于磁盘游戏的多盘炸盘的完美解决方案建立【软连接】
你只要记住这 5 句(永不炸机)
- batocera-boot.conf 里的 sharedevice、UUID 全部注释掉
-
两个文件固定路径:
- /userdata/system/link_roms.sh(主脚本)
- /userdata/system/custom.sh(开机自启)
-
运行一次赋权命令:
chmod +x ...
-
磁盘卷标只用:
SHARE、LEROMS、LEROMSS、LEROMS1~LEROMS10
- 结构统一:盘 → roms → psx/gba/...
最后再给你一句定心丸
===============================================================================================
最终完整版教程(逐行版 + 循环版双脚本)
一、先做最重要的一步:清空官方挂载配置
sharedevice=DEVICES sharedevice_part1=XXXX sharedevice_part2=XXXX
# sharedevice=DEVICES # sharedevice_part1=ROMS@F37A-06F2:/roms
目的:不让系统再接管游戏盘,从根源避免崩溃。
二、统一说明(两个版本通用)
1. 两个文件放哪里?路径固定
-
主脚本路径:/userdata/system/link_roms.sh
-
开机自启脚本路径:/userdata/system/custom.sh
2. 如何创建文件?
3. 如何给脚本执行权限?
chmod +x /userdata/system/link_roms.sh chmod +x /userdata/system/custom.sh
4. 如何运行?
- 开机自动运行:什么都不用做,开机自动执行
-
手动运行:终端输入
bash运行
/userdata/system/link_roms.sh
- 双击运行:F1 文件管理器里直接双击link_roms.sh
5. 你的磁盘卷标(以后永远用这些)
三、版本 1:逐行版(适合学习、清晰易懂)
① 主脚本:/userdata/system/link_roms.sh
#!/bin/bash # ============================== # 逐行定义磁盘(一个盘一行) # 以后加盘:照格式新增 DISK14、DISK15... # ============================== DISK1="SHARE" DISK2="LEROMS" DISK3="LEROMSS" DISK4="LEROMS1" DISK5="LEROMS2" DISK6="LEROMS3" DISK7="LEROMS4" DISK8="LEROMS5" DISK9="LEROMS6" DISK10="LEROMS7" DISK11="LEROMS8" DISK12="LEROMS9" DISK13="LEROMS10" # 系统默认游戏目录(无需修改) BATOCERA_ROMS="/userdata/roms" # 标准模拟器文件夹名称 SYSTEM_LIST=( psx gba psp sfc nes n64 gc wii wiiu ps2 dc arcade mame fbneo fba megadrive sms gb gbc nds 3do saturn ngpc wonderswan ) # 链接处理函数 link_roms() { local DISK_PATH="/media/$1" echo "==== 处理磁盘:$1 ====" # 磁盘未插入则跳过 if [ ! -d "$DISK_PATH" ]; then echo " 磁盘未挂载,跳过" return fi # 遍历所有模拟器目录创建链接 for SYS in "${SYSTEM_LIST[@]}"; do SRC="${DISK_PATH}/roms/${SYS}" DEST="${BATOCERA_ROMS}/${SYS}" if [ -d "$SRC" ]; then rm -rf "$DEST" ln -s "$SRC" "$DEST" echo " 已链接:$SYS" fi done } # ============================== # 逐行调用(一个盘一行) # 加盘后在这里新增一行调用 # ============================== link_roms "$DISK1" link_roms "$DISK2" link_roms "$DISK3" link_roms "$DISK4" link_roms "$DISK5" link_roms "$DISK6" link_roms "$DISK7" link_roms "$DISK8" link_roms "$DISK9" link_roms "$DISK10" link_roms "$DISK11" link_roms "$DISK12" link_roms "$DISK13" echo "" echo "========================" echo "逐行版脚本执行完成!" echo "========================"
② 开机自启:/userdata/system/custom.sh
#!/bin/bash # 等待 USB 磁盘加载完成 sleep 3 # 自动执行游戏盘链接脚本 /userdata/system/link_roms.sh
四、版本 2:循环版(简洁、永久不用改脚本)
① 主脚本:/userdata/system/link_roms.sh
#!/bin/bash # ============================== # 磁盘列表(只在这里加盘名即可) # ============================== DISK_LIST=( SHARE LEROMS LEROMSS LEROMS1 LEROMS2 LEROMS3 LEROMS4 LEROMS5 LEROMS6 LEROMS7 LEROMS8 LEROMS9 LEROMS10 ) # 系统游戏目录 BATOCERA_ROMS="/userdata/roms" # 标准模拟器目录 SYSTEM_LIST=( psx gba psp sfc nes n64 gc wii wiiu ps2 dc arcade mame fbneo fba megadrive sms gb gbc nds 3do saturn ngpc wonderswan ) # 统一处理函数 link_disk() { local disk_name="$1" local disk_path="/media/$disk_name" if [ ! -d "$disk_path" ]; then echo "→ 未插入:$disk_name,跳过" return fi echo "=====================================" echo "正在处理磁盘:$disk_name" echo "=====================================" for sys in "${SYSTEM_LIST[@]}"; do src="$disk_path/roms/$sys" dest="$BATOCERA_ROMS/$sys" if [ -d "$src" ]; then rm -rf "$dest" ln -s "$src" "$dest" echo "✅ 已链接:$sys" fi done } # 自动遍历所有磁盘 for disk in "${DISK_LIST[@]}"; do link_disk "$disk" done echo "" echo "=====================================" echo "循环版脚本执行完成!以后无需改代码" echo "====================================="
② 开机自启:/userdata/system/custom.sh
#!/bin/bash sleep 3 /userdata/system/link_roms.sh
五、两个版本对比总结(你保存用)
| 项目 | 逐行版(学习版) | 循环版(懒人永久版) |
|---|---|---|
| 运行速度 | 一样快 | 一样快 |
| 可读性 | 极高,一目了然 | 简洁,不易读 |
| 加盘方式 | 加 DISK + 加调用 | 只在列表加名字 |
| 适合人群 | 学习、喜欢看过程 | 长期使用、不想折腾 |
| 稳定性 | 完全相同 | 完全相同 |
六、最终使用流程(极简版)
- 清空batocera-boot.conf里的挂载配置
- 新建两个.sh文件,放对路径
- 终端运行两句chmod +x赋权
- 重启
- 游戏自动出现,多盘插满也不炸机
====================================================================================================================================================================
-----------------------如下:为什么能够开机自启-------------------------------------
核心一句话
1. 为什么它能开机自启?(真正原理)
系统启动最后一步 → 检查有没有 /userdata/system/custom.sh 如果有 → 直接运行它 如果没有 → 跳过
-
不是因为chmod +x让它自启
chmod +x只是让它能被运行,不是让它自动运行
- 不是因为权限高
- 不是因为守护进程
- 不是因为定时任务
- 不是因为宝塔那种机制
2. 那为什么还要执行 chmod +x?
让脚本变成 “可运行的程序”,而不是普通文本文件
- 双击打不开
- 终端运行报错 “权限不够”
- 开机也不会执行
- 系统能识别它是可执行脚本
- 开机才能调用它
3. 跟宝塔对比(你一下就懂区别)
宝塔(服务器面板)
- 宝塔本身不是系统,只是个软件
-
你想让脚本开机跑,必须:
- 加开机自启项
- 或者用守护进程监听
- 或者写 systemd 服务
- 因为系统本身不认识你的脚本
Batocera(游戏机系统)
- 系统底层已经预留了 custom.sh 这个开机接口
- 你放进去,它就执行
- 不需要注册服务
- 不需要守护
- 不需要设置开机项
4. 整个启动顺序(超清晰)
- 开机 → 加载内核
- 启动图形界面
- 挂载 U 盘
- 系统执行:/userdata/system/custom.sh
- custom.sh 里写了 sleep 3 等 U 盘
- 然后调用 link_roms.sh
- link_roms.sh 自动创建游戏快捷方式
5. 超级总结(你记这个就够)
- custom.sh 能开机自启,是因为 Batocera 系统原生支持,不是权限问题
- chmod +x 只是让脚本 “能被执行”,不是让它自动启动
- 这个机制跟宝塔、服务器、守护进程完全不一样
- 它就是系统预留的一个 “用户开机脚本入口”
- 文件名对、路径对 → 开机必跑
6. 最后一句最关键
-----------------------如上:为什么能够开机自启-------------------------------------
-----------------------------------------分割线-----------------------------------------
============================================================================================下面写的不用管,紧紧作为笔记明白原理==========================
最终永久版 link_roms.sh
运行
=================================================================================================
写法一:
【#!/bin/bash
# 所有你要用的磁盘卷标(以后永远不用改这里)
DISK_LIST=(
SHARE
LEROMS
LEROMSS
LEROMS1
LEROMS2
LEROMS3
LEROMS4
LEROMS5
LEROMS6
LEROMS7
LEROMS8
LEROMS9
LEROMS10
)
# 系统游戏目录
BATOCERA_ROMS="/userdata/roms"
# 标准模拟器文件夹名称
SYSTEM_LIST=(
psx gba psp sfc nes n64 gc wii wiiu
ps2 dc arcade mame fbneo fba
megadrive sms gb gbc nds
3do saturn ngpc wonderswan
)
# 统一链接函数
link_roms() {
local DISK_PATH="/media/$1"
echo "==== 处理磁盘:$1 ===="
# 如果磁盘没插,直接跳过
[ ! -d "$DISK_PATH" ] && echo "→ 未插入,跳过" && return
for SYS in "${SYSTEM_LIST[@]}"; do
SRC="$DISK_PATH/roms/$SYS"
DEST="$BATOCERA_ROMS/$SYS"
if [ -d "$SRC" ]; then
rm -rf "$DEST"
ln -s "$SRC" "$DEST"
echo "已链接:$SYS"
fi
done
}
# 自动批量处理所有盘
for disk in "${DISK_LIST[@]}"; do
link_roms "$disk"
done
echo "========================"
echo "所有磁盘链接完成!"
echo "以后加盘不用改脚本!"
echo "========================"】
=======================================================================
写法一,备份:
【#!/bin/bash # 所有你要用的磁盘卷标(以后永远不用改这里) DISK_LIST=( SHARE
LEROMS
LEROMSS
LEROMS1
LEROMS2
LEROMS3
LEROMS4
LEROMS5
LEROMS6
LEROMS7
LEROMS8
LEROMS9
LEROMS10 ) # 系统游戏目录 BATOCERA_ROMS="/userdata/roms" # 标准模拟器文件夹名称 SYSTEM_LIST=( psx gba psp sfc nes n64 gc wii wiiu
ps2 dc arcade mame fbneo fba
megadrive sms gb gbc nds
3do saturn ngpc wonderswan ) # 统一链接函数 link_roms() { local DISK_PATH="/media/$1" echo "==== 处理磁盘:$1 ====" # 如果磁盘没插,直接跳过 [ ! -d "$DISK_PATH" ] && echo "→ 未插入,跳过" && return for SYS in "${SYSTEM_LIST[@]}"; do SRC="$DISK_PATH/roms/$SYS" DEST="$BATOCERA_ROMS/$SYS" if [ -d "$SRC" ]; then rm -rf "$DEST" ln -s "$SRC" "$DEST" echo "已链接:$SYS" fi done } # 自动批量处理所有盘 for disk in "${DISK_LIST[@]}"; do link_roms "$disk" done echo "========================" echo "所有磁盘链接完成!" echo "以后加盘不用改脚本!" echo "========================"】
==============================================================================================
3. 这样写的好处(重点)
- 不用一个个写DISK3、DISK4、DISK5
- 不用后面再一个个加link_roms "$DISK3"
- 你只需要在最上面那个列表里加盘名
- 脚本会自动全部扫一遍,插了就读,没插就跳过
- 以后永远不用改脚本
4. 你的 custom.sh(开机自启)完全不用动
#!/bin/bash sleep 3 /userdata/system/link_roms.sh
5. 一句话总结
加盘 → 多加一行 DISK3 → 后面多加 link_roms "$DISK3"
第一种写法(逐行定义 + 逐行调用,适合学习)
写法二:
运行【#!/bin/bash # ============================== # 磁盘列表:一个盘写一行 # 想加盘,就在这里照抄加一行 # ============================== DISK1="SHARE" DISK2="LEROMS" DISK3="LEROMSS" DISK4="LEROMS1" DISK5="LEROMS2" DISK6="LEROMS3" DISK7="LEROMS4" DISK8="LEROMS5" DISK9="LEROMS6" DISK10="LEROMS7" DISK11="LEROMS8" DISK12="LEROMS9" DISK13="LEROMS10" # 系统游戏目录(不用动) BATOCERA_ROMS="/userdata/roms" # 模拟器文件夹列表(不用动) SYSTEM_LIST=( psx gba psp sfc nes n64 gc wii wiiu ps2 dc arcade mame fbneo fba megadrive sms gb gbc nds 3do saturn ngpc wonderswan ) # 链接函数(定义一次,到处用) link_roms() { local DISK_PATH="/media/$1" echo "==== 处理磁盘:$1 ====" # 磁盘不存在就跳过 if [ ! -d "$DISK_PATH" ]; then echo " 磁盘未插入,跳过" return fi for SYS in "${SYSTEM_LIST[@]}"; do SRC="$DISK_PATH/roms/$SYS" DEST="$BATOCERA_ROMS/$SYS" if [ -d "$SRC" ]; then rm -rf "$DEST" ln -s "$SRC" "$DEST" echo " 链接:$SYS" fi done } # ============================== # 调用方式:一个盘调用一行 # ============================== link_roms "$DISK1" link_roms "$DISK2" link_roms "$DISK3" link_roms "$DISK4" link_roms "$DISK5" link_roms "$DISK6" link_roms "$DISK7" link_roms "$DISK8" link_roms "$DISK9" link_roms "$DISK10" link_roms "$DISK11" link_roms "$DISK12" link_roms "$DISK13" echo "========================" echo "逐行处理模式执行完毕!" echo "========================"】
备份写法二【#!/bin/bash # ============================== # 磁盘列表:一个盘写一行 # 想加盘,就在这里照抄加一行 # ============================== DISK1="SHARE" DISK2="LEROMS" DISK3="LEROMSS" DISK4="LEROMS1" DISK5="LEROMS2" DISK6="LEROMS3" DISK7="LEROMS4" DISK8="LEROMS5" DISK9="LEROMS6" DISK10="LEROMS7" DISK11="LEROMS8" DISK12="LEROMS9" DISK13="LEROMS10" # 系统游戏目录(不用动) BATOCERA_ROMS="/userdata/roms" # 模拟器文件夹列表(不用动) SYSTEM_LIST=( psx gba psp sfc nes n64 gc wii wiiu ps2 dc arcade mame fbneo fba megadrive sms gb gbc nds 3do saturn ngpc wonderswan ) # 链接函数(定义一次,到处用) link_roms() { local DISK_PATH="/media/$1" echo "==== 处理磁盘:$1 ====" # 磁盘不存在就跳过 if [ ! -d "$DISK_PATH" ]; then echo " 磁盘未插入,跳过" return fi for SYS in "${SYSTEM_LIST[@]}"; do SRC="$DISK_PATH/roms/$SYS" DEST="$BATOCERA_ROMS/$SYS" if [ -d "$SRC" ]; then rm -rf "$DEST" ln -s "$SRC" "$DEST" echo " 链接:$SYS" fi done } # ============================== # 调用方式:一个盘调用一行 # ============================== link_roms "$DISK1" link_roms "$DISK2" link_roms "$DISK3" link_roms "$DISK4" link_roms "$DISK5" link_roms "$DISK6" link_roms "$DISK7" link_roms "$DISK8" link_roms "$DISK9" link_roms "$DISK10" link_roms "$DISK11" link_roms "$DISK12" link_roms "$DISK13" echo "========================" echo "逐行处理模式执行完毕!" echo "========================"】
====================================================================================================================================================================
- link_roms.sh主脚本
- custom.sh开机自启脚本
- 赋权命令(直接复制运行一次即可)
1. /userdata/system/link_roms.sh
#!/bin/bash # 支持的所有磁盘卷标(你指定的全部盘) DISK_LIST=( SHARE LEROMS LEROMSS LEROMS1 LEROMS2 LEROMS3 LEROMS4 LEROMS5 LEROMS6 LEROMS7 LEROMS8 LEROMS9 LEROMS10 ) # Batocera 系统游戏目录 BATOCERA_ROMS="/userdata/roms" # 标准模拟器目录列表(全覆盖) SYSTEM_LIST=( psx gba psp sfc nes n64 gc wii wiiu ps2 dc arcade mame fbneo fba megadrive sms gb gbc nds 3do saturn ngpc wonderswan ) # 批量链接函数 link_disk() { local disk_name="$1" local disk_path="/media/$disk_name" if [ ! -d "$disk_path" ]; then echo "→ 磁盘未挂载: $disk_name,跳过" return fi echo "=====================================" echo "正在处理磁盘: $disk_name" echo "=====================================" for sys in "${SYSTEM_LIST[@]}"; do src="$disk_path/roms/$sys" dest="$BATOCERA_ROMS/$sys" if [ -d "$src" ]; then rm -rf "$dest" ln -s "$src" "$dest" echo "✅ 已链接: $sys" fi done } # 遍历所有盘,自动识别已插入的盘 for disk in "${DISK_LIST[@]}"; do link_disk "$disk" done echo "" echo "=====================================" echo "所有可识别磁盘链接完成!" echo "以后插新盘只要卷标在列表里,自动生效" echo "====================================="
2. /userdata/system/custom.sh (开机自动运行)
#!/bin/bash # 等待 USB 磁盘挂载(时间不够可以改成 sleep 4 或 5) sleep 3 # 执行多盘游戏链接 /userdata/system/link_roms.sh
3. 给两个文件加执行权限(在 Xterm 里运行这 2 句)
chmod +x /userdata/system/link_roms.sh chmod +x /userdata/system/custom.sh
4. 以后永远不用改脚本的规则(非常重要)
- SHARE
- LEROMS
- LEROMSS
- LEROMS1
- LEROMS2
- LEROMS3
- LEROMS4
- LEROMS5
- LEROMS6
- LEROMS7
- LEROMS8
- LEROMS9
- LEROMS10
- 插 1 个盘 → 读 1 个
- 插 5 个盘 → 自动合并 5 个盘的游戏
- 没插的盘 → 自动跳过,不报错、不崩溃
- 结构必须都是:盘根目录 → roms → psx/gba/…
5. 为什么这套永远不会炸机?
- 完全不用batocera-boot.conf
- 完全不用 UUID
- 完全不用sharedevice
- 系统不抢盘、不挂载冲突
-
只是创建快捷方式
→ 插多少盘都稳,不会黑屏、不会跑代码卡死、不会炸屏。
6. 你只需要做的 3 件事
- 把之前batocera-boot.conf里的所有sharedevice相关全部删掉或注释
- 新建上面两个文件,内容完整复制进去
- 在终端运行那两句chmod +x赋权
========================================================================
=================================================