中关村东路 发表于 2022-7-19 18:17

HQPlayer OS中安装Roon Server笔记

本帖最后由 中关村东路 于 2022-7-19 19:31 编辑

HQPlayer OS中安装Roon Server笔记


[*]背景
[*]所需材料
[*]安装HQPlayer OS,并利用全部磁盘空间
[*]在HQPlayer OS中安装Roon Server
[*]CPU资源分离

因为我每个服务都是单独的机器,这套方案只是为了网友方便实现编写,如果对你有用,还请回复一下,让更多人看到。


中关村东路 发表于 2022-7-22 16:09

让hqos支持airplay,请移步

http://www.erji.net/forum.php?mod=viewthread&tid=2272408

中关村东路 发表于 2022-7-19 18:17

本帖最后由 中关村东路 于 2022-7-19 19:35 编辑

1. 背景

本文简要记录了在HQPlayer OS(下文缩写hqos)中安装Roon Server(即Roon Core,下文缩写roon)的过程,需要读者对Linux有初步的了解。

为了确保在读者的机器上同样可行,除了需要录入的命令,同时也记录了安装中可能遇到的问题和解决思路。

需要强调,我自己的主力系统(详见【1】)中并未将hqos和Roon Server放在同一台机器上,我也并不建议读者这么做,读者也请不要回帖讨论是否有必要把hqos和roon安装在一起。

本文起因是有网友noif96发帖【2】讨论hqos如何安装roon;以及网友Devastat0r提及【3】hqos的诸多优点;此外,考虑到roon所需cpu资源很小,而内存空间极大,hqos所需cpu资源极大,内存空间很小,两套系统放在一台机器上,通过本帖第5节的cpu分离设置,也可以在冲突较小的情况下提高利用率。话说回来,hqos内置实时内核,系统足够精简,启动后除udev和dbus之外也没什么没用的进程,确实非常优秀,当然在此基础上也有很大优化的余地,本文就不讨论了。

【1】http://erji.net/forum.php?mod=viewthread&tid=2253401&extra=

【2】http://erji.net/forum.php?mod=viewthread&tid=2272065&extra=

【3】http://erji.net/forum.php?mod=viewthread&tid=2271005&extra=


中关村东路 发表于 2022-7-19 18:18

本帖最后由 中关村东路 于 2022-7-19 19:36 编辑

2. 所需材料

一个能正常运行的linux系统,因为我在放假手头只有个苹果笔记本,只好找了u盘刻录gparted live cd【4】。hqos的img【5】。roon core的linux安装文件【6】。

当然还要有一个功能完整的x86主机用于安装hqos/roon,可以把系统安装在内置硬盘/u盘等等,只要这台电脑支持启动即可,本例使用的是一张内置的500G的pcie-ssd,其他存储也类似。

【4】https://gparted.org

【5】https://www.signalyst.eu/bins/hqplayerd/images/

【6】https://download.roonlabs.net/builds/RoonServer_linuxx64.tar.bz2


中关村东路 发表于 2022-7-19 18:18

本帖最后由 中关村东路 于 2022-7-19 19:48 编辑

3. 安装HQPlayer OS,并利用h86主机全部磁盘空间

3.1 制作gparted live cd启动盘

首先下载gparted live cd【4】,用dd/rufus/balenaEtcher/unetbootin等方法将其刻录至u盘。例如,我使用dd
sudo /bin/dd if=~/Downloads/gparted-live-1.4.0-1-amd64.iso of=/dev/rdisk2s1之后就可以在你要安装hqos/roon的x86主机上,这个用gparted u盘启动了。这东西居然是有图形界面的,双击打开terminal即可进入正式安装了。


3.2 安装hqos

下面我们要把hqos的7z镜像解压缩之后复制到这台电脑上,最简单的办法是在电脑上解压缩了拿一个fat32格式的u盘拷贝过来,我手头没有第二个u盘了,就用内存虚拟了一块空间:

mount none -t tmpfs /tmp
cd /tmp
scp username@laptop_ip:Downloads/hqos.img .
dd if=hqos.img of=/dev/sdb
这里假定你解压缩之后的文件是家目录的Downloads/hqos.img,我用的macbook pro,可以直接用scp/ssh传输,windows我没太用过不太了解,应该也有类似的传递文件的办法。


3.3 利用x86主机全部全部磁盘空间(可选)

这一步是为了让roon有放音乐/日志/图片/索引的空间,如果你是轻度用户,或者和我一样只是想确保我“可以”把roon安装在hqos里,那可以跳过这一步。如果你安装这台系统是为了实用,这步虽然是可选,但是还是很建议的,大家知道ssd速度是和ssd容量有关的,利用全部空间可以大幅提高磁盘速度。

打开gparted,点击一下刷新磁盘,就可以找到要安装hqos的目标磁盘了,很容易分辨,左边两个小块,右边一大块灰色的空白空间。右键root分区resize,拖动到最右边,也就是最大,apply之后重启即可。

至此,hqos就安装好了。拔掉所有无关u盘,直接启动这个x86主机,我们接下来安装roon。


中关村东路 发表于 2022-7-19 18:18

本帖最后由 中关村东路 于 2022-7-19 18:28 编辑

4. 在HQPlayer OS中安装Roon Server

4.1 设置hqos的ssh登录

安装了hqos的x86主机启动之后应该有个登录提示符,输入root回车即可。差一下这台机器的ip,输入:
ip address之后按提示修改一下root密码:

passwd root我比较保守,另外新建了一个用户用来ssh,你可以修改下面的username为你自己的用户名:
useradd username
passwd username
至此就可以拔掉键盘显示器从远程登录了,例如在笔记本上打开终端模拟器,我用的是iTerm2,用户名,密码,ip就是本小节录入的:
ssh username@hqos_ip_address


4.2 安装roon

远程ssh登录之后我们首先下载并解压缩roon:

cd /opt
wget https://download.roonlabs.net/builds/RoonServer_linuxx64.tar.bz2
tar xvf *.bz2
rm *.bz2
看看能不能执行:
cd /opt/RoonServer
./start.sh
本以为这样应该安装成功的,结果这时候会提示:

/opt/RoonServer/Server/RoonServer: line 71: /opt/RoonServer/RoonDotnet/RoonServer: No such file or directory
./start.sh: line 34: kill: (1602) - No such process
看一下错误信息,定位到问题所在是“/opt/RoonServer/RoonDotnet/RoonServer”不存在,但是执行:
ls /opt/RoonServer/RoonDotnet/RoonServer发现是有这个文件的。再看看这个文件:
file /opt/RoonServer/RoonDotnet/RoonServer原来是链接到了dotnet的runtime:
/opt/RoonServer/RoonDotnet/RoonServer: symbolic link to /opt/RoonServer/RoonDotnet/dotnet再看看被链接的原文件:
file /opt/RoonServer/RoonDotnet/dotnet显示结果:
/opt/RoonServer/RoonDotnet/dotnet: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID=ce34c3793740b6d65dd1c38dcee5f1941932139f, for GNU/Linux 2.6.32, stripped这就找到问题了,根目录下没有这个动态链接“/lib64/ld-linux-x86-64.so.2”
ln -s /lib /lib64再尝试一下,
root@hqplayer:~#/opt/RoonServer/RoonDotnet/dotnet --info

Host (useful for support):
Version: 6.0.6
Commit:7cca709db2

.NET SDKs installed:
No SDKs were found.

.NET runtimes installed:
Microsoft.NETCore.App 6.0.6

To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download
现在基本上就搞定了。来试试
root@hqplayer:/opt/RoonServer# ./check.sh

Checking to see if RoonServer can run on this machine

    Checking for Binary Compatibility                            [   OK   ]
    Checking for ALSA Libraries                                  [   OK   ]
    Checking for ffmpeg or avconv                              [ FAILED ]
    Checking for the mount.cifs command                        [   OK   ]
    Checking for libicu                                          [   OK   ]
    Testing ulimit -n 8192                                       [   OK   ]

STATUS: FAILED

These issues must be addressed before RoonServer will run on this machine.

For more information on how to address this, see:

   http://kb.roonlabs.com/LinuxInstall
说本机没安装ffmpeg/avconv,因为我们用hqplayer来做转码,不需要管。启动试试:
root@hqplayer:/opt/RoonServer# ./start.sh
00:00:00.002 Warn:get lock file path: /tmp/.rnsgem0-
00:00:00.130 Debug: PathForResource, filename: ../.update
00:00:00.140 Debug: PathForResource, candidate: /opt/RoonServer/Server/../.update
00:00:00.144 Debug: PathForResource, filename: ../Appliance/RoonAppliance
00:00:00.144 Debug: PathForResource, candidate: /opt/RoonServer/Server/../Appliance/RoonAppliance
Initializing
Started
成功了!

4.3 更新dotnet(可选)

强迫症患者会发现,“/opt/RoonServer/RoonDotnet/dotnet”的版本是6.0.6版本,看看官网吧,稳定版已经更新到6.0.7了。想更新就顺手更新一下吧,


【7】https://dotnet.microsoft.com/en-us/download/dotnet
wget https://download.visualstudio.microsoft.com/download/pr/bd828687-1706-4041-a804-5e93631fe256/d4ec75936459a7e8c772c929edcbfeda/dotnet-runtime-6.0.7-linux-x64.tar.gz
rm /opt/RoonServer/RoonDotnet/* -rf
tar xvf dotnet-runtime-6.0.7-linux-x64.tar.gz -C /opt/RoonServer/RoonDotnet/
记得恢复roon的三个链接,他家代码写的挺糙的。

ln -s /opt/RoonServer/RoonDotnet/dotnet RAATServer
ln -s /opt/RoonServer/RoonDotnet/dotnet RoonAppliance
ln -s /opt/RoonServer/RoonDotnet/dotnet RoonServer

4.4 设置自动启动

可能这一步是最重要的一步之一吧,否则即便是命令行狂热者,每次开机都要ssh进去启动也实在太麻烦了。

nano /lib/systemd/system/roonserver.service把下面内容粘贴进去,千万别粘错了:

Description=RoonServer
After=network-online.target sound.target
Wants=network-online.target


Type=simple
User=root
Environment=ROON_DATAROOT=/var/roon
Environment=ROON_ID_DIR=/var/roon
ExecStart=/opt/RoonServer/start.sh
Restart=on-abort


WantedBy=multi-user.target
还要创建roon数据目录,
mkdir /var/roon好了,设置roonserver自动启动了:
systemctl --enable now roonserver.service大功告成!

中关村东路 发表于 2022-7-19 19:29

本帖最后由 中关村东路 于 2022-7-19 19:32 编辑

5. CPU资源分离

HQPlayer和Roon Core对CPU占用都有一定的要求,建议对CPU资源进行分离。虽然【1】中已经给出多种可行方案,我建议使用systemd内置功能实现,先限制hqplayer运行在2,3等cpu上。运行htop,即可看到你的cpu线程数,假定是n+1,那么在这里就写2-n即可。
root@hqplayer:~# cat /etc/systemd/system/multi-user.target.wants/hqplayerd.service

Description=HQPlayer Embedded daemon
Requires=systemd-networkd.service systemd-networkd-wait-online.service network-online.target sound.target systemd-udev-settle.service
After=systemd-networkd-wait-online.service network-online.target sound.target systemd-udev-settle.service local-fs.target remote-fs.target


Type=simple
CPUAffinity=2,3
ExecStart=/usr/bin/hqplayerd
Restart=always
RestartSec=2
EnvironmentFile=-/etc/default/hqplayerd
#User=hqplayer
Nice=-10
IOSchedulingClass=realtime
LimitMEMLOCK=1G
LimitNICE=-10
LimitRTPRIO=98


WantedBy=multi-user.target再限制roon在0,1两个CPU上:
root@hqplayer:~# cat /etc/systemd/system/multi-user.target.wants/roonserver.service

Description=RoonServer
After=network-online.target sound.target
Wants=network-online.target


Type=simple
User=root
CPUAffinity=0,1
Environment=ROON_DATAROOT=/var/roon
Environment=ROON_ID_DIR=/var/roon
ExecStart=/opt/RoonServer/start.sh
Restart=on-abort


WantedBy=multi-user.target修改设置之后重启一下两个服务即可立即生效,下次重启也会保留这个设置:
systemctl daemon-reload
systemctl restart roonserver.service
systemctl restart hqplayerd.service

Devastat0r 发表于 2022-7-19 21:07

收藏,慢慢学习,慢慢尝试!

noif96 发表于 2022-7-19 21:38

顶,万分感谢大佬

万远 发表于 2022-7-20 09:47

令人耳目一新的技术牛贴!!

万远 发表于 2022-7-20 10:35

大牛你好,问个白白的问题,HQOS有可能安装Ubuntu的deb文件包吗,里面很多命令都删除了,如何实现?

中关村东路 发表于 2022-7-20 12:16

万远 发表于 2022-7-20 10:35
大牛你好,问个白白的问题,HQOS有可能安装Ubuntu的deb文件包吗,里面很多命令都删除了,如何实现?

一般来说,可以。只是可能比较麻烦

万远 发表于 2022-7-20 15:15

中关村东路 发表于 2022-7-20 12:16
一般来说,可以。只是可能比较麻烦

如何恢复它的apt install 命令?

中关村东路 发表于 2022-7-20 15:24

万远 发表于 2022-7-20 15:15
如何恢复它的apt install 命令?
肯定也是可以,不过我没试过。把你要装的那个软件装上就行了。这种删减的系统,把各种东西都加上就没必要了

万远 发表于 2022-7-20 15:30

中关村东路 发表于 2022-7-20 15:24
肯定也是可以,不过我没试过。把你要装的那个软件装上就行了。这种删减的系统,把各种东西都加上就没必要 ...

十分感谢!按葫芦画瓢出现了这个错误,需要安装libicu,可是没有apt install 安装命令

leonbernieni 发表于 2022-7-20 16:09

中关村东路 发表于 2022-7-20 15:24
肯定也是可以,不过我没试过。把你要装的那个软件装上就行了。这种删减的系统,把各种东西都加上就没必要 ...

可以考虑freenode开个irc,答疑交流效率高多了,好多年没上去过了,记得很早就能挂bot、dlna之类的。。

中关村东路 发表于 2022-7-20 16:13

本帖最后由 中关村东路 于 2022-7-20 16:23 编辑

万远 发表于 2022-7-20 15:30
十分感谢!按葫芦画瓢出现了这个错误,需要安装libicu,可是没有apt install 安装命令
看来是你的hqos版本比较早没带这个库。
我看了一下roon对icu的依赖是这个函数检查的:
function check_libicu {
    display_check "Checking for libicu"
    which icuinfo >/dev/null; WHICH_ICUINFO=$?
    ldconfig -p | grep libicu >/dev/null; LDCONFIG_LIBICU=$?
    if [ $WHICH_ICUINFO = 0 -o $LDCONFIG_LIBICU = 0 ]; then
      display_ok
    else
      display_failed
    fi
}也就是“ldconfig -p|grep libicu”。在我的hqos上显示的是:
root@hqplayer:~# ldconfig -p | grep libicu
      libicuuc.so.69 (libc6,x86-64) => /usr/lib/libicuuc.so.69
      libicui18n.so.69 (libc6,x86-64) => /usr/lib/libicui18n.so.69
      libicudata.so.69 (libc6,x86-64) => /usr/lib/libicudata.so.69这就是你需要的文件。找任意一个包含amd64版本libicu的linux发行版(除了Gentoo/LFS)下载这个包即可,例如Archlinux:https://archlinux.org/packages/core/x86_64/icu/download下载之后在电脑上打开terminal在下载文件所在目录解压缩:
# tar xvf icu-71.1-1-x86_64.pkg.tar.zst可以看到:
#ls usr/
bin      include      lib      share
# ls usr/lib
icu                        libicudata.so.71.1      libicui18n.so.71.1      libicuio.so.71.1      libicutest.so.71.1      libicutu.so.71.1      libicuuc.so.71.1
libicudata.so                libicui18n.so                libicuio.so                libicutest.so                libicutu.so                libicuuc.so                pkgconfig
libicudata.so.71      libicui18n.so.71      libicuio.so.71                libicutest.so.71      libicutu.so.71                libicuuc.so.71
# ls usr/lib/lib*
usr/lib/libicudata.so                usr/lib/libicui18n.so.71      usr/lib/libicuio.so.71.1      usr/lib/libicutu.so                usr/lib/libicuuc.so.71
usr/lib/libicudata.so.71      usr/lib/libicui18n.so.71.1      usr/lib/libicutest.so                usr/lib/libicutu.so.71                usr/lib/libicuuc.so.71.1
usr/lib/libicudata.so.71.1      usr/lib/libicuio.so                usr/lib/libicutest.so.71      usr/lib/libicutu.so.71.1
usr/lib/libicui18n.so                usr/lib/libicuio.so.71                usr/lib/libicutest.so.71.1      usr/lib/libicuuc.so传到hqos电脑上,下面这句是传到hoos_ip_address这个电脑,username这个用户的家目录下
scp usr/lib/libicu* username@hqos_ip_address:登录hqos再剪切过去就可以了,注意这里假定登录过去立即执行后面的移动命令,因为这几个文件刚才拷贝到家目录下了。
#ssh username@hqos_ip_address</span>
#su -c "mv libicu* /usr/lib/"应该就可以了,检查一下:
# ldconfig -p | grep libicu
        libicuuc.so.71 (libc6,x86-64) => /usr/lib/libicuuc.so.71
        libicutu.so.71 (libc6,x86-64) => /usr/lib/libicutu.so.71
        libicutest.so.71 (libc6,x86-64) => /usr/lib/libicutest.so.71
        libicui18n.so.71 (libc6,x86-64) => /usr/lib/libicui18n.so.71
        libicuio.so.71 (libc6,x86-64) => /usr/lib/libicuio.so.71
        libicudata.so.71 (libc6,x86-64) => /usr/lib/libicudata.so.71

中关村东路 发表于 2022-7-20 16:16

leonbernieni 发表于 2022-7-20 16:09
可以考虑freenode开个irc,答疑交流效率高多了,好多年没上去过了,记得很早就能挂bot、dlna之类的。。

说不上答疑,大家交流一下而已。我也不是程序员相关职业的,只不过平时的电脑都是Linux/macOS

万远 发表于 2022-7-20 16:32

中关村东路 发表于 2022-7-20 16:13
看来是你的hqos版本比较早没带这个库。
我看了一下roon对icu的依赖是这个函数检查的:
也就是“ldconfi ...

感谢大牛,成功了!!再问一个:如何把LMS安上去?

中关村东路 发表于 2022-7-20 16:34

万远 发表于 2022-7-20 16:32
感谢大牛,成功了!!再问一个:如何把LMS安上去?

没用过LMS。。要不你自己折腾一下吧,不过你都有Roon了怎么还能忍其他软件。。

万远 发表于 2022-7-20 16:41

本帖最后由 万远 于 2022-7-20 16:43 编辑

大牛你请看看这贴:
http://erji.net/forum.php?mod=vi ... 1717&extra=page%3D1若你有能力,也想把LMS整合进去就完美了
页: [1] 2 3 4 5 6 7
查看完整版本: HQPlayer OS中安装Roon Server笔记