特集のプログラム
2024年12月24日
Interface編集部
2025年2月号特集「ラズパイで作り学ぶ Dockerコンテナ」サポートページ
第3部 ラズパイ×Dockerでシステム構築
● ダウンロード・プログラム
第3部で作成したシステムのトラブル・シューティング
今回のシステムを作成する時に発生したトラブルと対応です.問題が発生したときの参考にしてください.
デフォルトのマイクが利用できない
デフォルトのマイクが他のデバイスに設定されていると思われます.次のコマンドで接続状態を確認して対応してください.
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: Device [USB Audio Device], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0
マイクのカード番号(HW番号)を環境変数に設定
$ export ALSADEV=hw:0
# snd-pcm-ossモジュールを組み込む
$ sudo modprobe snd-pcm-oss
simpleaudioを使って音声ファイルを再生するとSegmentation faultが発生する
miniconda パッケージを installするとこの問題が発生する事があります.
ラズパイだとcondaでsimpleaudio をインストールしようとすると,PackagesNotFoundErrorとなります.
pipだとsimpleaudioはinstallできるのでpipでインストールできるが,この状態だと再生時に「Segmentation fault」が発生する場合があります.
対応としては,Pythonやパッケージにインストールにはcondaを使用せず.debianが提供しているpythonとそのpipを使用する方法があります.
docker start でエラーが発生しているがContainer内のエラーが表示されない /見出し3L
docker startに-aオプションを追加して起動するとSTD_OUT / STD_ERR の内容が表示されます.
DockerContainer内で systemd が実行できない
systemctl 複数のサービスを管理するのに使用しますが,Container内で複数のサービスを実行するには,systemctl が必要とする権限をContainer自体に設定する必要がありますが,それでは,複数のContainerを起動した場合,デバイスのアクセスに問題が発生する可能性があり,さらに,本来ならContainerには権限を制限してホストへのアクセスを制御したいのが,ホスト自体のデバイを自由に使用する事になり,セキュリティ的問題になる場合があります.
本来のDockerの利用方法は,サービスごとに必要な環境を閉じ込めてシステムを安定動作させる事を目的としていますので「1Container1プロセス」を意識してください.
registryへのpushでエラーが発生した場合
作成したimageが破損している可能性があります.
SDカードへのアクセスパラメータ等を見直してイメージの再作成を試みてください.
$ docker image prune
$ docker volume prune
$ docker network prune
DockerのIMAGEに設定された情報を取得したい
image作成時に REPOSITORY: TAG をつけていないと <none> <none>となり何のImageなのか判らなくなることがあります.
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 5bade5586f75 2 days ago 69.9MB
docker inspect を利用する事でIMAGEに記録された情報が確認できます.次に確認の例を挙げます.これ以外にも多くの情報を取得できるので,試してみてください.
● 起動時に設定した portの設定
$ docker inspect --format='{{.HostConfig.PortBindings}}' [INSTANCE_ID]
run時に設定したdeviceの設定
$ docker inspect --format='{{.HostConfig.Binds}}' registry-registry-1
● Dockerfile等で作成時に登録されたENTRYPOINTやCMD.
$ docker inspect --format='{{.Config.Entrypoint}}' 5bade5586f75
または,
$ docker inspect --format='{{.Config.Cmd}}' 5bade5586f75
viで文字化けする
Windowsで作成したファイルをそのまま表示しようとすると文字化けが起きる場合があります.Vi用の設定ファイルとして .vimrc ファイルに設定を追加する事で対応できる場合があります.
$ vi ~/.vimrc
---- 追記 ----
set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
set fileformats=unix,dos,mac
---------------
※ 設定を反映
$ source ~/.vimrc
メモリが足りず処理が停止する
ラズパイにてSWAPファイルのリサイズを試してくだい
$ sudo dphys-swapfile swapoff
$ sudo vi /etc/dphys-swapfile
---------------
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
# CONF_SWAPSIZE=200
CONF_SWAPSIZE=1024
---------------
$ sudo dphys-swapfile setup
$ sudo dphys-swapfile swapon
$ sudo reboot
再起動後確認
$ sudo swapon --show
---------------
NAME TYPE SIZE USED PRIO
/var/swap file 1024M 0B -2
---------------
ファイル・アクセスが遅い
使っているSDカードに依存しますが,ストレージへのアクセスを高速化する事ができる場合があります.
$ sudo vi /boot/firmware/config.txt
--------追加-------
dtparam=sd_overclock=100
--------------------
注:docker push等でデータ・エラーが発生するようであれば,設定を戻してください
VOICEVOXで作成した音声データを再生できない
VOICEVOXで作成された音声データは,サンプル・レートが24000Hzと特殊なため,再生できないアプリケーションもあります.今回のシステムでも,Pythonのsimpleaudioで再生エラーが発生しました.
ライブラリのバージョンが更新されれば再生可能になる可能性もありますが,確実に動作させることを優先し,標準的なフォーマットに変換する方法を採用することにしました.
変換プログラムの例
ffmpeg -i {input.wav} -ar 22050 -ac 1 sample2.wav
一括変換
outフォルダにある全wavファイルを変換して,output2に出力する処理です
for a in temp/*.wav ; do n=`basename $a` ; ffmpeg -i $a -ar 22050 -ac 1 voice/"${n}" ; done
この内容voiceに出力されたファイルを全てmike_server/opt/snd/にコピーしてください.
時計がずれる
時計の設定を確認してください.
$ timedatectl
―――――――――
Time zone: Europe/London (BST, +0100)
―――――――――
タイムゾーンがJST以外になっていたら,タイムゾーンをJSTに変更してみてください
sudo timedatectl set-timezone Asia/Tokyo