本文を読み飛ばす

ARM SBC: 【失敗】Voicepeak体験版をArmbianで動かす

  • Voicepeakが体験版は無料で利用できる、
  • Raspbeery Piでも実行できる、

という話だったのでチャレンジしてみた。

Voicepeak体験版には、Linux版は入っているがx86-64向けのみ
ということに早速気づいたが、
動かせないかいろいろ試してみた。 (結果は失敗ですけど...)

dockerうまい人なら当然かもしれませんが、
armで x86_64 のバイナリ動かすためにいろいろ準備します。

とりあえず展開

Voicepeakの体験版を展開してファイルを確認する。
必要なのは多分下の2ファイル。
(eulaとかはちゃんと読んだ方がいいと思います...)

-+- Jashinchan-Free-Trial.vppk          ... 邪心ちゃんのファイル
 |
 +- Linux --+-- Voicepeak-linux64.zip   ... Voicepeak本体
 |
 ... (他は省略)

Voicepeak-linux64.zip を解凍すると、こんな感じ

-+- voicepeak                           ... Voicepeak本体
 |
 +- settings
 |
 +- usersettings
 |
 ... (他は省略)

voicepeakを動かすのでファイル内容を確認。
当たり前だけどx86-64用。
armbianではそのままでは動かせるわけないのでqemuで動かしてみる。

$ file voicepeak
voicepeak: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=2d03c539fdecf87c2648ab3f9d60cf0f029d3c09, for GNU/Linux 3.2.0,
stripped

Docker準備

最近、よく使うdockerもarmbianに入ってたので簡単にinstall

$ apt install docker-ce docker-ce-cli docker-compose-plugin

x86-64の実行準備

  • x86-64を実行するためには、qemuを使うのでinstall
  • Debianの案内の通り、bullseyeにするためにbackportを使う
$ sudo apt install qemu-user-static/buster-backport

$ sudo update-binfmts --display
...
    detector =
qemu-x86_64 (disabled):
     package = qemu-user-static
        type = magic
      offset = 0
       magic = \x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00
        mask = \xff\xff\xff\xff\xff\xfe\xfe\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
 interpreter = /usr/libexec/qemu-binfmt/x86_64-binfmt-P
    detector =
  • x86-64を示したが、どのfmtもdisabledになっている。
    binfmt-miscに対応していないkernel使っているのが原因のよう。

kernelの更新

  • qemu入れたときにエラーメッセージが出ていたので対処
    (私の場合は古いArmbian使ってたせいでbinfmt-miscが動きませんでした。)
  • binfmt-miscに対応していないkernelだったので最新版に更新する
    (ほんとは linux-source をinstallして自分でビルドするつもりだったが)
    (config見てるとbinfmt-miscが有効になってた)
$ apt install linux-image-current-*
  • 私のSBCはSDカードで起動できるタイプなのでファイルを書き換えて調整する
    (今確認すると、initrdは変更してなかった。動いてるからいいか...)
LABEL Armbian
LINUX /vmlinuz-6.1.11-meson64
INITRD /initrd.img-5.9.0-arm-64
FDT /dtb/6-1-11/meson-gxm-q200.dtb
...
  • 適用するために再起動。確認したらenabledになっていた。
$ sudo update-binfmts --display
...
    detector =
qemu-x86_64 (enabled):
     package = qemu-user-static
        type = magic
      offset = 0

docker準備

  • 公式でアナウンスされている環境であるubuntu 20.04をベースに動作させてみる
  • 違うアーキテクチャを明示するのが、ちょっといつもと違う感じ
    • docker-compose.yml: platformを明示
    • Dockerfile: FROMをamd64/ubuntuでx86を明示

docker-compose.yml:

version: "3.9"
services:
  voicepeak:
    platform: "x86_64"
    build: .
    volumes:
      - ./Voicepeak:/home/Voicepeak

Dockerfile:

FROM amd64/ubuntu:focal

RUN apt update -y
RUN apt install -y libasound2
RUN apt install -y libfreetype6
RUN apt install -y libcurl4

RUN apt install -y busybox
  • 作成: /usr/libexec/docker/cli-plugins/docker-compose build
  • 実行: /usr/libexec/docker/cli-plugins/docker-compose run voicepeak /bin/bash

実行したら、voicepeakに必要なものをlddで確認してみる。
(上のDockerfileには反映済み)

root@d7fecc44e7ec:/home/Voicepeak# ldd voicepeak
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00000040033f7000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000004003403000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00000040035e5000)
        libmvec.so.1 => /lib/x86_64-linux-gnu/libmvec.so.1 (0x0000004003734000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x0000004003760000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000000400377b000)
        /lib64/ld-linux-x86-64.so.2 (0x0000004000000000)
        libasound.so.2 => /lib/x86_64-linux-gnu/libasound.so.2 (0x000000400396d000)
        libfreetype.so.6 => not found
        libcurl.so.4 => not found
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x0000004003a6a000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x0000004003a70000)

結果 (動かず)

  • 依存性が解決したので、実行してみる
  • 邪心ちゃんのファイルを展開する
$ cd Voicepeak
$ echo "テストですの" > test.txt
$ cd usersettings/storage
$ unzip ../../../Jashin*.vppk
$ mv sylapck/* .

$ /usr/libexec/docker/cli-plugins/docker-compose run voicepeak /bin/bash
# cd /home/Voicepeak
# ./voicepeak -t test.txt -o test.wav
...

いつまでたっても終了しない。

修正1. Xが実行できるようにする

WSLの方では問題なく実行できたが、
そっちはXが実行可能だった。

こっちでも実行可能にしてみる。
下の修正後、container内で xlogo とか打つと ちゃんとプログラムは起動するようになった。

結果は変化なし。

docker-compose.yml:

...
  voicepeak:
    ...
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - ./Voicepeak:/home/Voicepeak
      - /tmp/.X11-unix:/tmp/.X11-unix

Dockerfile:

...
RUN apt install -y xserver-xorg-video-dummy x11-apps

CMD ["/usr/bin/busybox", "-f", "-h", "/home/wwwroot"]

修正2. Ubuntu-minimalも入れてみる

WSLの方では問題なく実行できたので、もうちょっとUbuntu準拠の環境にしてみる

結果は変化なし。

Dockerfile:

...

RUN apt install -y ubuntu-minimal ubuntu-standard

CMD ["/usr/bin/busybox", "-f", "-h", "/home/wwwroot"]

修正3. user権限で実行

Dockerfile:

...

RUN /usr/sbin/useradd -u 1001 vpeak

CMD ["/usr/bin/busybox", "-f", "-h", "/home/wwwroot"]

起動時に指定を増やす。
ファイルの権限とかは変更しておく。

$ /usr/libexec/docker/cli-plugins/docker-compose run -u vpeak \
     voicepeak /bin/bash

結果2 (strace)

  • ./voicepeak を実行してると segfault したり
    止まったりと、挙動は3通りぐらいあった
  • hostの方からstraceできたので、
    ファイルアクセスなどは走っているのはわかった。
  • ファイル書き込みしている場合もあったので、
    もしかしたらファイルが出力されるか、と思ったが segfault でファイルが
    閉じられないので、途中までの結果も取れない。

もういじるところ思いつかなかったので、ここで終了...

$ /usr/libexec/docker/cli-plugins/docker-compose run -u vpeak voicepeak \
    /home/Voicepeak/voicepeak -s a -o /home/Voicepeak/a.wav &
$ sudo strace -p $(pgrep voicepeak)

コメント

Comments powered by Disqus
宣伝: