第1步:安装并配置宿主机(Debian) 1.安装Debian:从Debian官网下载网络安装镜像,进行最小化安装。在软件选择时,只勾选“SSH server”和“Standard system utilities”。
2.更新系统:
1 sudo apt update && sudo apt upgrade -y
3.安装必要工具:
1 sudo apt install -y p7zip-full squashfs-tools systemd-container
p7zip-full用于解压7z文件,systemd-container提供了更现代的容器化管理工具(但我们仍会使用传统chroot)
第2步:准备HQPlayer OS的chroot环境 1.创建工作目录:
1 sudo mkdir -p /opt/hqplayer-chroot
2.解压HQPlayer Embedded:
1 sudo 7z x hqplayer-embedded-5.8 .1 -x64sse42.7z -o/opt/hqplayer-chroot
这会在/opt/hqplayer-chroot下得到hqplayer-embedded-5.8.1/文件夹,里面包含bin, lib, usr等目录。这就是我们chroot的基础。 我们需要把它挂载到一个临时目录,然后复制其中的所有文件。
1 2 # 创建挂载点 sudo mkdir -p /mnt/hqplayer-image
3.挂载镜像中的分区
您需要先找到镜像中的分区偏移量,然后挂载正确的分区。
第1步:查看镜像的分区信息
1 sudo fdisk -l hqplayer-embedded-5.8 .1 -x64sse42.img
fdisk 输出显示镜像中有两个分区:
分区1:Start=2048, Size=27.8M, Type=”Microsoft basic data” (这很可能是EFI系统分区)
分区2:Start=59392, Size=3G, Type=”Linux filesystem” (这是我们要的根文件系统分区) 挂载分区(分区2)
1 2 3 4 5 # 计算分区2 的偏移量 (59392 sectors * 512 bytes/sector) OFFSET =$((59392 * 512 ))# 挂载分区2 到挂载点 sudo mount -o loop,offset=$OFFSET hqplayer-embedded-5.8 .1 -x64sse42.img /mnt/hqplayer-image
复制文件到chroot目录
1 2 3 4 5 6 7 8 # 查看挂载的内容 ls -la /mnt/hqplayer-image/ # 复制所有文件到chroot目录(保留权限和属性) sudo cp -a /mnt/hqplayer-image
4.创建必要的系统目录:
1 2 sudo mkdir -p /opt/hqplayer-chroot/{proc,sys,dev,run,var /lib,etc,tmp} sudo chmod 1777 /opt/hqplayer-chroot/tmp
5.复制DNS解析配置:
1 sudo cp /etc/resolv.conf /opt/hqplayer-chroot/etc/
6.让 chroot 环境访问主机音频设备 首先识别音频设备
1 2 3 4 5 6 7 8 # 在宿主机上查看所有音频设备 aplay -l # 或者使用更详细的方式 cat /proc/asound/cards # 查看 USB 音频设备详情 lsusb | grep -i audio
可以看到您的音频设备配置:
card 0: AB13X USB Audio (USB DAC) - 这是您的外部USB音频设备
card 1: Ensoniq AudioPCI - 这是主板内置声卡
现在让我们确保chroot环境中的HQPlayer能够访问这些设备。
配置chroot环境访问USB DAC, 修改启动脚本确保正确映射
第3步:配置chroot环境 我们需要一个脚本来自动挂载必要的文件系统并进入chroot。
创建挂载和进入chroot的脚本: 1 sudo nano /usr/local/bin/start-hqplayer-chroot.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/ bash HQPLAYER_ROOT ="/opt/hqplayer-chroot" # 挂载必要的文件系统 mount --bind /proc "$HQPLAYER_ROOT/proc" mount --bind /sys "$HQPLAYER_ROOT/sys" mount --bind /dev "$HQPLAYER_ROOT/dev" mount --bind /dev/pts "$HQPLAYER_ROOT/dev/pts" mount --bind /dev/snd "$HQPLAYER_ROOT/dev/snd" mount --bind /run "$HQPLAYER_ROOT/run" # 确保USB 设备可访问(重要!) mount --bind /dev/bus/usb "$HQPLAYER_ROOT/dev/bus/usb" 2 >/dev/ null || true # 确保使用最新的DNS 配置 cp /etc/resolv.conf "$HQPLAYER_ROOT/etc/resolv.conf" # 运行HQPlayer exec chroot "$HQPLAYER_ROOT" /usr/bin/hqplayerd
停止脚本 1 sudo nano /usr/local/bin/stop-hqplayer-chroot.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/ bash HQPLAYER_ROOT ="/opt/hqplayer-chroot" # 杀死所有hqplayerd进程 pkill -9 -f "hqplayerd" 2 >/dev/ null # 卸载文件系统(确保正确的顺序) umount -f "$HQPLAYER_ROOT/dev/bus/usb" 2 >/dev/ null umount -f "$HQPLAYER_ROOT/dev/snd" 2 >/dev/ null umount -f "$HQPLAYER_ROOT/dev/pts" 2 >/dev/ null umount -f "$HQPLAYER_ROOT/dev" 2 >/dev/ null umount -f "$HQPLAYER_ROOT/sys" 2 >/dev/ null umount -f "$HQPLAYER_ROOT/proc" 2 >/dev/ null umount -f "$HQPLAYER_ROOT/run" 2 >/dev/ null sleep 2
设置正确的权限
1 2 3 4 sudo chmod +x /usr/local/bin/start-hqplayer-chroot.sh sudo chmod +x /usr/local/bin/stop-hqplayer-chroot.sh sudo systemctl daemon-reload
重新加载并测试服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 重新加载systemd配置 sudo systemctl daemon-reload # 手动测试启动脚本 sudo /usr/local/bin/start-hqplayer-chroot.sh # 检查hqplayerd是否运行 ps aux | grep hqplayerd # 检查端口监听 sudo ss -tlnp | grep :8088 # 如果运行正常,停止它 sudo /usr/local/bin/stop-hqplayer-chroot.sh
系统使用的是 cgroup2(统一层次结构),而不是传统的cgroup1。这可能是导致服务启动失败的原因,因为一些旧的应用或脚本可能不完全兼容cgroup2。 第1步:检查系统是否支持cgroup1
1 2 3 4 5 # 检查是否启用了cgroup1兼容性 cat /proc/filesystems | grep cgroup # 检查内核启动参数 cat /proc/cmdline
修改systemd服务文件以兼容cgroup2 1 sudo nano /etc/systemd/system/hqplayer-chroot.service
使用以下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [Unit ] Description =HQPlayer Embedded Daemon in Chroot After =network.target Requires =network.target [Service ] Type =simpleExecStart =/usr/ local/bin/start-hqplayer-chroot.sh ExecStop =/usr/ local/bin/stop-hqplayer-chroot.sh Restart =on-failureRestartSec =5 TimeoutStartSec =300 TimeoutStopSec =30 # 关键配置:禁用所有cgroup相关功能 Delegate =noCPUAccounting =noMemoryAccounting =noIOAccounting =noTasksAccounting =noIPAccounting =noBlockIOAccounting =no# 避免cgroup2相关问题 #Slice = #ControlGroup = [Install ] WantedBy =multi-user.target
启动服务并检查 1 2 sudo systemctl start hqplayer-chroot.service systemctl status hqplayer-chroot.service
dns或者删除符号链接并创建实际文件
1 2 3 4 5 6 7 8 # 删除符号链接 sudo rm /opt/hqplayer-chroot/etc/resolv.conf # 创建实际的 resolv.conf 文件 sudo cp /etc/resolv.conf /opt/hqplayer-chroot/etc/resolv.conf # 确认现在是普通文件 ls -la /opt/hqplayer-chroot/etc/resolv.conf
第4步:执行精简 首先查看当前大小
1 sudo du -sh /opt/hqplayer-chroot/ --exclude=proc --exclude=sys --exclude=dev --exclude=run
删除最大的文件(镜像文件)
1 2 3 4 5 6 # 删除原始镜像文件(节省最多空间) sudo rm /opt/hqplayer-chroot/hqplayer-embedded-5.8 .1 -x64sse42.img sudo rm /opt/hqplayer-chroot/hqplayer-embedded-5.8 .1 -x64sse42.7z # 删除备份文件(如果有) sudo rm -rf /opt/hqplayer-chroot-backup 2 >/dev/ null || true
删除firmware文件
1 2 # 删除firmware(通常不需要) sudo rm -rf /opt/hqplayer-chroot/lib/firmware
查看精简效果
1 2 3 4 5 6 7 8 # 查看当前大小 sudo du -sh /opt/hqplayer-chroot/ --exclude=proc --exclude=sys --exclude=dev --exclude=run # 查看各目录大小 sudo du -sh /opt/hqplayer-chroot
验证功能正常
1 2 3 4 5 6 7 8 9 10 11 # 重启HQPlayer 服务测试 sudo systemctl restart hqplayer-chroot.service # 检查服务状态 systemctl status hqplayer-chroot.service # 测试音频功能 sudo chroot /opt/hqplayer-chroot aplay -l # 测试网络功能 sudo chroot /opt/hqplayer-chroot /bin/bash -c "ping -c 2 8.8.8.8"