Arch Linux ARM掌上复古游戏模拟器从零到精通全攻略

引言:为什么选择Arch Linux ARM构建复古游戏掌机
Arch Linux ARM是一个轻量级、灵活且高度可定制的Linux发行版,特别适合在资源有限的嵌入式设备上运行。将其用于构建掌上复古游戏模拟器具有以下显著优势:
极致的性能优化
:Arch Linux ARM采用滚动更新模式,始终能获得最新的内核和驱动支持,可以充分发挥硬件性能
完整的控制权
:用户拥有对系统的完全控制,可以精简每一个组件,只安装必要的软件包
庞大的软件仓库
:拥有超过30,000个软件包,包括各种最新的模拟器核心
活跃的社区支持
:拥有庞大的用户群体和详细的文档,遇到问题容易找到解决方案
硬件选择指南
推荐设备平台
1. 树莓派系列(Raspberry Pi)
Raspberry Pi 4 Model B
:四核Cortex-A72,支持4K输出,USB 3.0接口,是性价比最高的选择
Raspberry Pi 5
:性能更强,支持PCIe接口,可扩展性更好
Raspberry Pi Zero 2 W
:超低功耗,适合小型化掌机设计,但性能有限
2. 其他开发板
Odroid Go Ultra
:性能强劲,自带手柄和显示屏接口
Anbernic RG351系列
:专为复古游戏设计的开源硬件
PinePhone Pro
:手机形态,自带触摸屏和电池
必备外设
显示屏
:推荐3.5-4英寸IPS屏幕,分辨率至少480×320
电池
:建议3000mAh以上,支持PD快充
存储
:高速microSD卡(UHS-I U3等级),容量建议64GB以上
控制器
:可使用现成的游戏手柄模块,或DIY按键矩阵
系统安装与基础配置
1. 准备工作
下载Arch Linux ARM镜像
# 访问Arch Linux ARM官网下载对应设备的镜像
# 例如树莓派4B:
wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz
写入SD卡
# 查找SD卡设备(注意:请确认设备路径,避免误操作)
lsblk

# 卸载可能挂载的分区
sudo umount /dev/sdX*

# 使用dd命令写入镜像(假设SD卡为/dev/sdc)
sudo dd if=ArchLinuxARM-rpi-aarch64-latest.tar.gz of=/dev/sdc bs=4M status=progress
2. 初始系统配置
首次启动后的基本设置
# 更新系统
sudo pacman -Syu

# 安装基础工具
sudo pacman -S base-devel git wget curl

# 设置时区
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo hwclock –systohc

# 配置语言
echo “en_US.UTF-8 UTF-8” | sudo tee -a /etc/locale.gen
sudo locale-gen
echo “LANG=en_US.UTF-8” | sudo tee /etc/locale.conf

# 设置主机名
echo “retro-pi” | sudo tee /etc/hostname

# 创建普通用户
sudo useradd -m -G wheel -s /bin/bash retro
sudo passwd retro
# 编辑sudoers文件,允许wheel组使用sudo
sudo EDITOR=nano visudo
# 取消注释:%wheel ALL=(ALL) ALL
3. 网络配置
有线网络(默认已启用DHCP)
# 查看网络状态
ip a
ping -c 3 archlinux.org
无线网络配置
# 安装NetworkManager
sudo pacman -S networkmanager
sudo systemctl enable NetworkManager
sudo systemctl start NetworkManager

# 使用nmtui配置无线网络
nmtui
模拟器核心安装与配置
1. 安装模拟器管理器
RetroArch(推荐)
RetroArch是模拟器的前端,集成了大量模拟器核心(libretro cores)。
# 安装RetroArch
sudo pacman -S retroarch

# 安装常用模拟器核心
sudo pacman -S libretro-snes9x libretro-pcsx-rearmed libretro-mesen libretro-mupen64plus \
libretro-picodrive libretro-genesis-plus-gx libretro-fceumm \
libretro-gambatte libretro-vba-next libretro-mgba
备选方案:独立模拟器
# 如果需要独立模拟器(非libretro核心)
# NES模拟器
sudo pacman -S fceux

# SNES模拟器
sudo pacman -S snes9x

# PlayStation模拟器
sudo pacman -S pcsx-rearmed
2. 配置RetroArch
基本配置文件生成
# 首次运行生成配置文件
retroarch –init-config

# 编辑配置文件
nano ~/.config/retroarch/retroarch.cfg
关键配置项
# 视频设置
video_fullscreen = “true”
video_windowed_fullscreen = “false”
video_scale = “3.0” # 适合480×320屏幕的缩放

# 输入设置
input_player1_a = “z”
input_player1_b = “x”
input_player1_y = “a”
input_player1_x = “s”
input_player1_start = “enter”
input_player1_select = “shift”
input_player1_up = “up”
input_player1_down = “down”
input_player1_left = “left”
input_player1_right = “right”

# 目录设置
rgui_browser_directory = “/home/retro/roms”
rgui_config_directory = “/home/retro/.config/retroarch/config”
3. 模拟器核心特定配置
NES核心配置(FCEUmm)
# 创建核心特定配置目录
mkdir -p ~/.config/retroarch/config/FCEUmm

# 配置文件内容
cat > ~/.config/retroarch/config/FCEUmm/FCEUmm.cfg << 'EOF' # NES特定设置 fceumm_overscan_enabled = "true" fceumm_overscan_bottom = "8" fceumm_overscan_top = "8" fceumm_overscan_left = "8" fceumm_overscan_right = "8" EOF SNES核心配置(Snes9x) mkdir -p ~/.config/retroarch/config/Snes9x cat > ~/.config/retroarch/config/Snes9x/Snes9x.cfg << 'EOF' # SNES特定设置 snes9x_aspect_ratio = "4:3" snes9x_gfx_blend = "true" snes9x_sound_interpolation = "true" EOF PlayStation核心配置(PCSX-ReARMed) mkdir -p ~/.config/retroarch/config/PCSX-ReARMed cat > ~/.config/retroarch/config/PCSX-ReARMed/PCSX-ReARMed.cfg << 'EOF' # PS1特定设置 pcsx_rearmed_dithering = "true" pcsx_rearmed_interpolation = "true" pcsx_rearmed_pad1type = "digital" pcsx_rearmed_pad2type = "digital" EOF 输入设备配置 1. 键盘映射(基础方案) 使用evdev直接配置 # 安装evtest工具 sudo pacman -S evtest # 查看输入设备 evtest # 创建自定义键盘映射脚本 cat > /usr/local/bin/retro-keymap.sh << 'EOF' #!/bin/bash # 映射键盘按键到游戏手柄按键 # 将键盘按键映射为游戏手柄事件 # 清除现有映射 xmodmap -e "remove Mod4 = Hyper_L" xmodmap -e "keycode 255 = NoSymbol" # 映射方向键 xmodmap -e "keycode 111 = Up" xmodmap -e "keycode 116 = Down" xmodmap -e "keycode 113 = Left" xmodmap -e "keycode 114 = Right" # 映射功能键 xmodmap -e "keycode 36 = Return" # Enter xmodmap -e "keycode 50 = Shift_L" # Select xmodmap -e "keycode 25 = z" # A xmodmap -e "keycode 26 = x" # B xmodmap -e "keycode 27 = a" # Y xmodmap -e "keycode 28 = s" # X EOF chmod +x /usr/local/bin/retro-keymap.sh 2. GPIO按键矩阵(DIY方案) 使用RPi.GPIO库 # 安装Python GPIO库 sudo pacman -S python-pip pip install RPi.GPIO GPIO按键控制脚本 #!/usr/bin/env python3 import RPi.GPIO as GPIO import time import os # GPIO引脚定义(BCM编号) BUTTONS = { 'UP': 17, 'DOWN': 18, 'LEFT': 27, 'RIGHT': 22, 'A': 23, 'B': 24, 'X': 25, 'Y': 5, 'START': 6, 'SELECT': 13 } # 设置GPIO模式 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) # 设置所有按键为输入,上拉电阻 for pin in BUTTONS.values(): GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 按键状态记录 button_states = {name: False for name in BUTTONS.keys()} def send_key_event(key, pressed): """发送键盘事件""" if pressed: os.system(f"xdotool keydown {key}") else: os.system(f"xdotool keyup {key}") def check_buttons(): """检查按键状态""" global button_states for name, pin in BUTTONS.items(): # 读取GPIO状态(低电平表示按下) current_state = not GPIO.input(pin) if current_state != button_states[name]: button_states[name] = current_state # 映射到键盘按键 key_map = { 'UP': 'Up', 'DOWN': 'Down', 'LEFT': 'Left', 'RIGHT': 'Right', 'A': 'z', 'B': 'x', 'X': 'a', 'Y': 's', 'START': 'Return', 'SELECT': 'Shift_L' } send_key_event(key_map[name], current_state) print(f"{name}: {'按下' if current_state else '释放'}") try: print("GPIO按键监控已启动...") while True: check_buttons() time.sleep(0.01) # 10ms扫描间隔 except KeyboardInterrupt: print("\n程序退出") finally: GPIO.cleanup() 使用wiringPi的C语言版本(更高性能) #include
#include
#include
#include

// 按键引脚定义
#define PIN_UP 17
#define PIN_DOWN 18
#define PIN_LEFT 27
#define PIN_RIGHT 22
#define PIN_A 23
#define PIN_B 24
#define PIN_X 25
#define PIN_Y 5
#define PIN_START 6
#define PIN_SELECT 13

// 按键状态
struct button {
int pin;
char* key;
int last_state;
};

struct button buttons[] = {
{PIN_UP, “Up”, 1},
{PIN_DOWN, “Down”, 1},
{PIN_LEFT, “Left”, 1},
{PIN_RIGHT, “Right”, 1},
{PIN_A, “z”, 1},
{PIN_B, “x”, 1},
{PIN_X, “a”, 1},
{PIN_Y, “s”, 1},
{PIN_START, “Return”, 1},
{PIN_SELECT, “Shift_L”, 1},
{-1, NULL, 0} // 结束标记
};

void send_key(const char* key, int press) {
char cmd[256];
if (press) {
snprintf(cmd, sizeof(cmd), “xdotool keydown %s”, key);
} else {
snprintf(cmd, sizeof(cmd), “xdotool keyup %s”, key);
}
system(cmd);
}

int main() {
if (wiringPiSetupGpio() == -1) {
fprintf(stderr, “wiringPi初始化失败\n”);
return 1;
}

// 设置引脚为输入,上拉电阻
for (int i = 0; buttons[i].pin != -1; i++) {
pinMode(buttons[i].pin, INPUT);
pullUpDnControl(buttons[i].pin, PUD_UP);
}

printf(“GPIO按键监控已启动…\n”);

while (1) {
for (int i = 0; buttons[i].pin != -1; i++) {
int current = digitalRead(buttons[i].pin);

if (current != buttons[i].last_state) {
// 低电平表示按下
int pressed = (current == 0);
send_key(buttons[i].key, pressed);
printf(“%s: %s\n”, buttons[i].key, pressed ? “按下” : “释放”);
buttons[i].last_state = current;
}
}
delay(10); // 10ms延时
}

return 0;
}
编译与运行:
# 安装wiringPi
sudo pacman -S wiringpi

# 编译
gcc -o gpio_keys gpio_keys.c -lwiringPi

# 运行(需要root权限)
sudo ./gpio_keys
3. 使用现成游戏手柄
配置USB手柄
# 安装jstest-gtk测试手柄
sudo pacman -S jstest-gtk

# 查看手柄设备
ls /dev/input/js*

# 配置RetroArch手柄
retroarch –menu
# 在菜单中选择 Settings -> Input -> Input User 1 Binds
手柄映射配置文件
# 创建手柄配置文件
mkdir -p ~/.config/retroarch/autoconfig

# 示例:8BitDo手柄配置
cat > ~/.config/retroarch/autoconfig/8BitDo_Pro_2.cfg << 'EOF' input_device = "8BitDo Pro 2" input_driver = "udev" input_b_btn = "0" input_y_btn = "1" input_select_btn = "2" input_start_btn = "3" input_up_btn = "h0up" input_down_btn = "h0down" input_left_btn = "h0left" input_right_btn = "h0right" input_a_btn = "4" input_x_btn = "5" input_l_btn = "6" input_r_btn = "7" input_l2_btn = "8" input_r2_btn = "9" input_l3_btn = "10" input_r3_btn = "11" input_b_btn_label = "B" input_y_btn_label = "Y" input_select_btn_label = "Select" input_start_btn_label = "Start" input_up_btn_label = "D-Pad Up" input_down_btn_label = "D-Pad Down" input_left_btn_label = "D-Pad Left" input_right_btn_label = "D-Pad Right" input_a_btn_label = "A" input_x_btn_label = "X" input_l_btn_label = "L" input_r_btn_label = "R" input_l2_btn_label = "L2" input_r2_btn_label = "R2" input_l3_btn_label = "L3" input_r3_btn_label = "R3" EOF 游戏ROM管理 1. 目录结构规划 # 创建ROM目录结构 mkdir -p ~/roms/{nes,snes,gba,psx,megadrive,sms,gg,pce,ngp} # 设置权限 chmod -R 755 ~/roms 2. ROM文件管理脚本 #!/bin/bash # rom_manager.sh - 游戏ROM管理工具 ROM_DIR="$HOME/roms" BACKUP_DIR="$HOME/roms_backup" # 支持的系统 SYSTEMS=("nes" "snes" "gba" "psx" "megadrive" "sms" "gg" "pce" "ngp") show_menu() { echo "=== 游戏ROM管理器 ===" echo "1. 列出所有ROM" echo "2. 添加ROM" echo "3. 删除ROM" echo "4. 备份ROM" echo "5. 恢复ROM" echo "6. 验证ROM完整性" echo "0. 退出" echo "====================" } list_roms() { for system in "${SYSTEMS[@]}"; do echo "=== $system ===" find "$ROM_DIR/$system" -type f -name "*" 2>/dev/null | while read rom; do
size=$(du -h “$rom” | cut -f1)
echo ” $(basename “$rom”) ($size)”
done
done
}

add_rom() {
echo “选择系统:”
select system in “${SYSTEMS[@]}”; do
if [[ -n “$system” ]]; then
break
fi
done

echo “输入ROM文件路径:”
read rom_path

if [[ -f “$rom_path” ]]; then
cp “$rom_path” “$ROM_DIR/$system/”
echo “ROM已添加: $rom_path”
else
echo “文件不存在: $rom_path”
fi
}

delete_rom() {
echo “选择系统:”
select system in “${SYSTEMS[@]}”; do
if [[ -n “$system” ]]; then
break
fi
done

echo “选择要删除的ROM:”
select rom in $(find “$ROM_DIR/$system” -type f); do
if [[ -n “$rom” ]]; then
rm “$rom”
echo “已删除: $rom”
break
fi
done
}

backup_roms() {
mkdir -p “$BACKUP_DIR”
tar -czf “$BACKUP_DIR/roms_backup_$(date +%Y%m%d_%H%M%S).tar.gz” -C “$ROM_DIR” .
echo “备份完成: $BACKUP_DIR”
}

restore_roms() {
echo “选择备份文件:”
select backup in $(ls -t “$BACKUP_DIR”/*.tar.gz); do
if [[ -n “$backup” ]]; then
tar -xzf “$backup” -C “$ROM_DIR”
echo “恢复完成: $backup”
break
fi
done
}

verify_roms() {
echo “验证ROM完整性…”
for system in “${SYSTEMS[@]}”; do
echo “=== $system ===”
find “$ROM_DIR/$system” -type f | while read rom; do
if [[ -s “$rom” ]]; then
echo “✓ $(basename “$rom”)”
else
echo “✗ $(basename “$rom”) – 文件为空或损坏”
fi
done
done
}

# 主循环
while true; do
show_menu
read -p “选择操作: ” choice
case $choice in
1) list_roms ;;
2) add_rom ;;
3) delete_rom ;;
4) backup_roms ;;
5) restore_roms ;;
6) verify_roms ;;
0) exit 0 ;;
*) echo “无效选择” ;;
esac
echo
done
3. ROM扫描与自动配置
#!/bin/bash
# auto_config.sh – 自动扫描ROM并生成RetroArch配置

ROM_DIR=”$HOME/roms”
CONFIG_DIR=”$HOME/.config/retroarch/config”

# 系统与核心映射
declare -A CORE_MAP=(
[“nes”]=”FCEUmm”
[“snes”]=”Snes9x”
[“gba”]=”mGBA”
[“psx”]=”PCSX-ReARMed”
[“megadrive”]=”Genesis Plus GX”
[“sms”]=”Picodrive”
[“gg”]=”Picodrive”
[“pce”]=”Mednafen PCE Fast”
[“ngp”]=”RetroArch”
)

# 生成配置文件
for system in “${!CORE_MAP[@]}”; do
core=”${CORE_MAP[$system]}”
rom_path=”$ROM_DIR/$system”

if [[ -d “$rom_path” ]]; then
# 为每个ROM创建独立配置
find “$rom_path” -type f | while read rom; do
rom_name=$(basename “$rom” | sed ‘s/\.[^.]*$//’)
config_file=”$CONFIG_DIR/${core}/${rom_name}.cfg”

mkdir -p “$(dirname “$config_file”)”

cat > “$config_file” << EOF # 自动配置 - $rom_name # 系统: $system # 核心: $core # 视频设置 video_scale = "3.0" video_smooth = "true" # 音频设置 audio_volume = "0.0" # 输入设置(使用默认) input_player1_a = "z" input_player1_b = "x" input_player1_y = "a" input_player1_x = "s" input_player1_start = "enter" input_player1_select = "shift" EOF echo "生成配置: $rom_name" done fi done 性能优化 1. 系统级优化 内核参数优化 # 编辑内核参数 sudo nano /boot/cmdline.txt # 添加以下参数(在行末添加,用空格分隔) # 禁用不必要的服务,减少内存占用 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 fsck.repair=yes rootwait quiet systemd.show_status=auto rd.systemd.show_status=auto # 编辑配置 sudo nano /etc/sysctl.conf # 添加性能优化参数 vm.swappiness=10 vm.vfs_cache_pressure=50 vm.dirty_ratio=15 vm.dirty_background_ratio=5 fs.file-max=100000 禁用不必要的服务 # 查看当前运行的服务 systemctl list-unit-files --type=service | grep enabled # 禁用不需要的服务 sudo systemctl disable bluetooth sudo systemctl disable avahi-daemon sudo systemctl disable cups sudo systemctl disable ModemManager # 查看启动时间 systemd-analyze blame 2. 模拟器性能优化 RetroArch性能调优 # 编辑配置文件 nano ~/.config/retroarch/retroarch.cfg # 关键优化参数 cat >> ~/.config/retroarch/retroarch.cfg << 'EOF' # === 性能优化 === # 使用线程化视频 video_threaded = "true" # 减少视频延迟 video_max_swapchain_images = "2" # 禁用不必要的特效 video_shader_enable = "false" video_filter = "" # 音频优化 audio_driver = "alsa" audio_latency = "64" audio_sync = "true" # 核心性能 core_set_support_no_game_extension = "true" core_info_cache_enable = "true" # 界面优化 rgui_show_start_core = "false" rgui_extended_ascii = "true" EOF 特定核心优化 SNES核心优化 cat > ~/.config/retroarch/config/Snes9x/Snes9x_optimized.cfg << 'EOF' # SNES性能优化 snes9x_gfx_blend = "false" # 禁用混合模式提升性能 snes9x_sound_interpolation = "false" # 禁用音频插值 snes9x_spc700 = "true" # 使用SPC700 snes9x_overclock = "1" # 轻微超频 snes9x_interleave = "false" # 禁用隔行扫描 EOF PS1核心优化 cat > ~/.config/retroarch/config/PCSX-ReARMed/PCSX-ReARMed_optimized.cfg << 'EOF' # PS1性能优化 pcsx_rearmed_dithering = "false" # 禁用抖动 pcsx_rearmed_interpolation = "false" # 禁用插值 pcsx_rearmed_cpu_interpolation = "false" pcsx_rearmed_gte_accuracy = "0" # 最低精度 pcsx_rearmed_pad1type = "digital" pcsx_rearmed_pad2type = "digital" pcsx_rearmed_region = "auto" pcsx_rearmed_xa = "false" # 禁用XA音频 pcsx_rearmed_cdda = "false" # 禁用CDDA音频 EOF 3. 硬件加速配置 GPU加速(树莓派) # 安装Mesa驱动 sudo pacman -S mesa libva-mesa-driver # 配置GPU内存 sudo nano /boot/config.txt # 添加以下内容 gpu_mem=128 gpu_mem_256=64 gpu_mem_512=128 gpu_mem_1024=256 # 启用OpenGL sudo nano /etc/profile.d/opengl.sh export MESA_GL_VERSION_OVERRIDE=3.3 export MESA_GLSL_VERSION_OVERRIDE=330 视频驱动优化 # 在RetroArch中启用硬件加速 # 编辑 retroarch.cfg video_driver = "gl" # 或 "gles2" 用于嵌入式设备 video_allow_rotate = "true" video_crop_overscan = "false" 电源管理 1. 电池监控脚本 #!/bin/bash # battery_monitor.sh - 电池监控与低电量警告 # 配置 BATTERY_PATH="/sys/class/power_supply/battery" LOW_BATTERY_THRESHOLD=20 CRITICAL_BATTERY_THRESHOLD=10 # 获取电池状态 get_battery_status() { if [[ -d "$BATTERY_PATH" ]]; then capacity=$(cat "$BATTERY_PATH/capacity" 2>/dev/null)
status=$(cat “$BATTERY_PATH/status” 2>/dev/null)
echo “$capacity:$status”
else
echo “100:Full” # 模拟数据
fi
}

# 显示电池通知
show_battery_notification() {
local capacity=$1
local status=$2

if [[ “$status” == “Discharging” ]]; then
if [[ $capacity -le $CRITICAL_BATTERY_THRESHOLD ]]; then
# 严重低电量 – 立即关机
notify-send -u critical “电量严重不足” “电量: ${capacity}% – 将在1分钟内关机”
sleep 60
sudo shutdown -h now
elif [[ $capacity -le $LOW_BATTERY_THRESHOLD ]]; then
# 低电量警告
notify-send -u normal “电量低” “电量: ${capacity}% – 请连接充电器”
fi
fi
}

# 主循环
while true; do
status=$(get_battery_status)
capacity=$(echo $status | cut -d: -f1)
state=$(echo $status | cut -d: -f2)

show_battery_notification $capacity $state

# 每30秒检查一次
sleep 30
done
2. 电源管理配置
# 安装电源管理工具
sudo pacman -S powertop

# 配置自动挂起
sudo nano /etc/systemd/system/suspend.service

# 添加以下内容
[Unit]
Description=Custom suspend actions

[Service]
Type=oneshot
ExecStart=/usr/bin/echo deep > /sys/power/mem_sleep

[Install]
WantedBy=suspend.target

# 启用服务
sudo systemctl enable suspend.service
故障排除
常见问题与解决方案
1. 模拟器运行卡顿
# 检查CPU频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

# 如果频率过低,调整CPU governor
echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 检查内存使用
free -h

# 检查后台进程
ps aux –sort=-%mem | head -10
2. 输入设备不响应
# 检查输入设备
ls /dev/input/

# 测试输入设备
sudo evtest /dev/input/eventX # 替换X为实际设备号

# 检查权限
ls -l /dev/input/event*

# 添加用户到input组
sudo usermod -a -G input $USER
3. 音频问题
# 检查音频设备
aplay -l

# 测试音频
speaker-test -t wav -c 2

# 检查RetroArch音频配置
grep audio_driver ~/.config/retroarch/retroarch.cfg

# 如果使用ALSA,尝试切换驱动
# 在RetroArch设置中改为 “alsa” 或 “pulse”
4. 显示问题
# 检查显示模式
tvservice -s

# 设置正确的分辨率
tvservice -e “CEA 4” # 480p

# 检查RetroArch视频配置
grep video_driver ~/.config/retroarch/retroarch.cfg

# 尝试不同的视频驱动
# gl, gles2, vulkan, drm, fbdev
日志分析
# RetroArch日志
retroarch –verbose –log-file /tmp/retroarch.log

# 系统日志
journalctl -u retroarch -f

# 内核消息
dmesg | tail -20
高级功能扩展
1. 网络游戏(Netplay)
# 配置RetroArch Netplay
nano ~/.config/retroarch/retroarch.cfg

# 添加Netplay配置
netplay_enable = “true”
netplay_mode = “client” # 或 “host”
netplay_ip_address = “192.168.1.100” # 主机IP
netplay_port = “55435”
netplay_use_mitm = “true”
netplay_nickname = “RetroPlayer”

# 启动Netplay
retroarch –netplay –connect 192.168.1.100:55435
2. 游戏存档同步
# 安装rsync用于存档同步
sudo pacman -S rsync

# 创建同步脚本
cat > /usr/local/bin/sync_saves.sh << 'EOF' #!/bin/bash # 同步存档到云端或NAS SOURCE_DIR="$HOME/.config/retroarch/saves" DEST_DIR="/mnt/nas/retroarch_saves" # 检查目标目录 if [[ ! -d "$DEST_DIR" ]]; then echo "目标目录不存在: $DEST_DIR" exit 1 fi # 同步存档 rsync -av --progress "$SOURCE_DIR/" "$DEST_DIR/" # 显示同步结果 echo "同步完成: $(date)" EOF chmod +x /usr/local/bin/sync_saves.sh # 添加到crontab定时执行 crontab -e # 添加: 0 */6 * * * /usr/local/bin/sync_saves.sh 3. 自动游戏列表生成 #!/bin/bash # generate_game_list.sh - 生成游戏列表HTML ROM_DIR="$HOME/roms" OUTPUT_DIR="$HOME/game_lists" mkdir -p "$OUTPUT_DIR" for system in nes snes gba psx megadrive; do if [[ -d "$ROM_DIR/$system" ]]; then cat > “$OUTPUT_DIR/${system}_list.html” << EOF


${system^^} 游戏列表


${system^^} 游戏列表

EOF

find “$ROM_DIR/$system” -type f -name “*” | sort | while read rom; do
size=$(du -h “$rom” | cut -f1)
echo ”

$(basename “$rom”) – $size

” >> “$OUTPUT_DIR/${system}_list.html”
done

cat >> “$OUTPUT_DIR/${system}_list.html” << EOF

EOF
fi
done

echo “游戏列表已生成: $OUTPUT_DIR”
总结
通过以上完整的步骤,你已经成功构建了一个基于Arch Linux ARM的掌上复古游戏模拟器。这个系统不仅性能出色,而且高度可定制,能够运行从NES到PlayStation的各种复古游戏。
关键要点回顾:
硬件选择
:根据预算和需求选择合适的开发板和外设
系统安装
:正确安装Arch Linux ARM并进行基础配置
模拟器配置
:安装RetroArch和相应核心,进行针对性优化
输入设备
:无论是GPIO按键还是USB手柄,都需要正确映射
性能优化
:从系统到模拟器的全方位调优
电源管理
:确保移动设备的续航能力
故障排除
:掌握常见问题的诊断和解决方法
持续维护建议:
定期更新系统
:
sudo pacman -Syu
保持系统最新
备份配置
:定期备份
~/.config/retroarch
目录
监控性能
:使用
htop
、
powertop
等工具监控系统状态
社区参与
:加入Arch Linux ARM和RetroArch社区获取最新信息
通过这个指南,你不仅获得了一个功能强大的复古游戏掌机,更重要的是掌握了Linux系统定制和嵌入式开发的技能。祝你游戏愉快!