【Ubuntu14.04】【QEMU/KVM】KVMによる仮想化UbuntuへのGPUパススルーとGPGPU(CUDA)設定

仮想WindowsでのGPUパススルーとは別に、機械学習用のセッティングの仕方について書きます。
正確には前にやってたんだけど、引っ越しの際にローレベルフォーマットを該当仮想イメージが入っているHDDにかけちゃって環境が消えたんですけどね・・・。

【参考サイト】
tech.virtualtech.jp

一応、毎回書いてるけど、KVMを利用している構成は以下の通り。
マザボ:ASRock Z170 Extreme4
・メモリ:DDR4 32G
・CPU:Core i7-6700K
・グラボ:STRIX-GTX1060-DC2O6G

1.GPUパススルー設定

と言っても、↓ですでにやっているのでほぼ不要なのですが。
engetu21.hatenablog.com


ただし、上記記事の9.vender id偽装に関しては仮想マシンごとに設定が必要なので、それは対応する必要があります。
また、 11項に記載している「ディスプレイSpice」「ビデオQXL」等のグラフィック関係の設定削除は不要です。(仮想モニタを使えるようにしておきたいので)

で、仮想マシンへのUbuntu14.04へのインストールに関しては記載を端折ります。
ちなみになんでUbuntu14.04にしたかというと、自社でGPUマシンで使ってる機械学習の画像判別ライブラリ?がCSなんとか?(うろ覚え過ぎてヤバイ)というので、それを動かせるかも確認したいからですね。
※2018/12/11追記
CSLAIERでした。しかしこれCUDA7.5が推奨・・・。CUDA10じゃ動かないかもしれないなぁ
github.com
※追記終わり

GPUパススルーの設定が終わったら、グラボが仮想OS上で認識されているかを確認します。

$ lspci | grep -i nvidia
00:02.0 VGA compatible controller: NVIDIA Corporation Device 1c03 (rev a1)
00:09.0 Audio device: NVIDIA Corporation Device 10f1 (rev a1)

問題なければ、以下のコマンドでnvidiaのドライバを落とすためのapt設定を追加します。

$ sudo add-apt-repository ppa:graphics-drivers/ppa
Fresh drivers from upstream, currently shipping Nvidia.

## Current Status

Current long-lived branch release: `nvidia-410` (410.66)
Dropped support for Fermi series (https://nvidia.custhelp.com/app/answers/detail/a_id/4656)

Old long-lived branch release: `nvidia-390` (390.87)

For GF1xx GPUs use `nvidia-390` (390.87)
For G8x, G9x and GT2xx GPUs use `nvidia-340` (340.107)
For NV4x and G7x GPUs use `nvidia-304` (304.137) End-Of-Life!

Support timeframes for Unix legacy GPU releases:
https://nvidia.custhelp.com/app/answers/detail/a_id/3142

## What we're working on right now:

  • Normal driver updates
  • Help Wanted: Mesa Updates for Intel/AMD users, ping us if you want to help do this work, we're shorthanded.

## WARNINGS:

This PPA is currently in testing, you should be experienced with packaging before you dive in here:

Volunteers welcome!

### How you can help:

## Install PTS and benchmark your gear:

    sudo apt-get install phoronix-test-suite

Run the benchmark:

    phoronix-test-suite default-benchmark openarena xonotic tesseract gputest unigine-valley

and then say yes when it asks you to submit your results to openbechmarking.org. Then grab a cup of coffee, it takes a bit for the benchmarks to run. Depending on the version of Ubuntu you're using it might preferable for you to grabs PTS from upstream directly: http://www.phoronix-test-suite.com/?k=downloads

## Share your results with the community:

Post a link to your results (or any other feedback to): https://launchpad.net/~graphics-drivers-testers

Remember to rerun and resubmit the benchmarks after driver upgrades, this will allow us to gather a bunch of data on performance that we can share with everybody.

If you run into old documentation referring to other PPAs, you can help us by consolidating references to this PPA.

If someone wants to go ahead and start prototyping on `software-properties-gtk` on what the GUI should look like, please start hacking!

## Help us Help You!

We use the donation funds to get the developers hardware to test and upload these drivers, please consider donating to the "community" slider on the donation page if you're loving this PPA:

http://www.ubuntu.com/download/desktop/contribute
詳しい情報: https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
[ENTER] を押すと続行します。ctrl-c で追加をキャンセルできます

gpg: 鍵リング「/tmp/tmpb3yd7fes/secring.gpg」ができました
gpg: 鍵リング「/tmp/tmpb3yd7fes/pubring.gpg」ができました
gpg: 鍵1118213Cをhkpからサーバkeyserver.ubuntu.comに要求
gpg: /tmp/tmpb3yd7fes/trustdb.gpg: 信用データベースができました
gpg: 鍵1118213C: 公開鍵"Launchpad PPA for Graphics Drivers Team"をインポートしました
gpg: 究極的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg: インポート: 1 (RSA: 1)
OK


設定が追加されたので、apt updateします。ついでにupgradeもしておく。

$ sudo apt update
$ sudo apt upgrade

ドライバを検索します。

$ apt-cache search '^nvidia-[0-9]+'
nvidia-173 - NVIDIA legacy binary driver - version 173.14.39
nvidia-173-dev - NVIDIA binary Xorg driver development files
nvidia-304-dev - NVIDIA binary Xorg driver development files
nvidia-310 - Transitional package for nvidia-310
nvidia-310-dev - Transitional package for nvidia-310-dev
nvidia-310-updates - Transitional package for nvidia-310-updates
nvidia-310-updates-dev - Transitional package for nvidia-310-updates-dev
nvidia-313-updates - Transitional package for nvidia-313-updates
nvidia-313-updates-dev - Transitional package for nvidia-313-updates-dev
nvidia-319 - Transitional package for nvidia-319
nvidia-319-dev - Transitional package for nvidia-319-dev
nvidia-319-updates - Transitional package for nvidia-319-updates
nvidia-319-updates-dev - Transitional package for nvidia-319-updates-dev
nvidia-304-updates - Transitional package for nvidia-304
nvidia-304-updates-dev - Transitional package for nvidia-304-dev
nvidia-331 - Transitional package for nvidia-331
nvidia-331-dev - Transitional package for nvidia-340-dev
nvidia-331-updates - Transitional package for nvidia-340
nvidia-331-updates-dev - Transitional package for nvidia-340-dev
nvidia-331-updates-uvm - Transitional package for nvidia-340
nvidia-331-uvm - Transitional package for nvidia-340
nvidia-340-dev - NVIDIA binary Xorg driver development files
nvidia-340-updates - Transitional package for nvidia-340
nvidia-340-updates-dev - Transitional package for nvidia-340-dev
nvidia-340-updates-uvm - Transitional package for nvidia-340-updates
nvidia-340-uvm - Transitional package for nvidia-340
nvidia-346 - Transitional package for nvidia-346
nvidia-346-dev - Transitional package for nvidia-352-dev
nvidia-346-updates - Transitional package for nvidia-346-updates
nvidia-346-updates-dev - Transitional package for nvidia-352-updates-dev
nvidia-346-updates-uvm - Transitional package for nvidia-346-updates
nvidia-346-uvm - Transitional package for nvidia-346
nvidia-352 - Transitional package for nvidia-367
nvidia-352-dev - Transitional package for nvidia-367-dev
nvidia-352-updates - Transitional package for nvidia-367
nvidia-352-updates-dev - Transitional package for nvidia-367-dev
nvidia-367 - Transitional package for nvidia-375
nvidia-367-dev - Transitional package for nvidia-375-dev
nvidia-375 - Transitional package for nvidia-384
nvidia-375-dev - Transitional package for nvidia-384-dev
nvidia-384 - NVIDIA binary driver - version 384.130
nvidia-384-dev - NVIDIA binary Xorg driver development files
nvidia-304 - NVIDIA legacy binary driver - version 304.137
nvidia-340 - NVIDIA binary driver - version 340.107
nvidia-387-dev - Transitional package for nvidia-390-dev
nvidia-387 - Transitional package for nvidia-390
nvidia-390-dev - NVIDIA binary Xorg driver development files
nvidia-390 - NVIDIA binary driver - version 390.87
nvidia-396-dev - NVIDIA binary Xorg driver development files
nvidia-396 - NVIDIA binary driver - version 396.54
nvidia-410-dev - NVIDIA binary Xorg driver development files
nvidia-410 - NVIDIA binary driver - version 410.78
nvidia-415-dev - NVIDIA binary Xorg driver development files
nvidia-415 - NVIDIA binary driver - version 415.18

よりどりみどりですが、グラボに応じたドライバをインストールしないとダメです。
具体的にはWindowsなどでグラボ使っている際に、nvidiaのHPに行って対応するドライバを自動検索で調べておいたほうが良いかと。

$ sudo apt install nvidia-390
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
bbswitch-dkms dkms fakeroot lib32gcc1 libc6-i386 libcuda1-390 libfakeroot
libjansson4 libvdpau1 libxnvctrl0 mesa-vdpau-drivers nvidia-opencl-icd-390
nvidia-prime nvidia-settings ocl-icd-libopencl1 screen-resolution-extra
vdpau-driver-all
提案パッケージ:
bumblebee dpkg-dev debhelper opencl-icd libvdpau-va-gl1 nvidia-vdpau-driver
nvidia-legacy-340xx-vdpau-driver
以下のパッケージが新たにインストールされます:
bbswitch-dkms dkms fakeroot lib32gcc1 libc6-i386 libcuda1-390 libfakeroot
libjansson4 libvdpau1 libxnvctrl0 mesa-vdpau-drivers nvidia-390
nvidia-opencl-icd-390 nvidia-prime nvidia-settings ocl-icd-libopencl1
screen-resolution-extra vdpau-driver-all
アップグレード: 0 個、新規インストール: 18 個、削除: 0 個、保留: 1 個。
84.9 MB のアーカイブを取得する必要があります。
この操作後に追加で 374 MB のディスク容量が消費されます。
続行しますか? [Y/n] y

(略)

nvidia_390:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

nvidia_390_modeset.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

nvidia_390_drm.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

nvidia_390_uvm.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

depmod....

DKMS: install completed.
libcuda1-390 (390.87-0ubuntu0~gpu14.04.1) を設定しています ...
nvidia-opencl-icd-390 (390.87-0ubuntu0~gpu14.04.1) を設定しています ...
bbswitch-dkms (0.7-2ubuntu1) を設定しています ...
Loading new bbswitch-0.7 DKMS files...
First Installation: checking all kernels...
Building only for 3.13.0-163-generic
Building initial module for 3.13.0-163-generic
Done.

bbswitch:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

depmod....

DKMS: install completed.
nvidia-prime (0.6.2.1) を設定しています ...
nvidia-prime start/running, process 28118
screen-resolution-extra (0.17.1.1~14.04.1) を設定しています ...
nvidia-settings (415.18-0ubuntu0~gpu14.04.1) を設定しています ...
vdpau-driver-all:amd64 (1.1.1-3ubuntu1~gpu14.04.1) を設定しています ...
libc-bin (2.19-0ubuntu6.14) のトリガを処理しています ...
initramfs-tools (0.103ubuntu4.11) のトリガを処理しています ...
update-initramfs: Generating /boot/initrd.img-3.13.0-163-generic
shim-signed (1.33.1~14.04.3+13-0ubuntu2) のトリガを処理しています ...
Secure Boot not enabled on this system.
ureadahead (0.100.0-16) のトリガを処理しています ...

ここで一旦再起動をしますが、この時点でGUIで操作している場合、再起動後はグラボからの画像出力になっている可能性があります。
その状態だとCUDAをインストールしても動かないので、CUIモードで起動するように設定しておきます。

$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet nosplash"

GRUB_CMDLINE_LINUX_DEFAULT="text"

GRUBの設定を適用して再起動

$ sudo update-grub
$ sudo shutdown -r now


以下のコマンドで、GPUのステータスを出力します。
これで何らか情報が表示されていないとドライバは正常に動作していない(はず)。

$ nvidia-smi -q

==============NVSMI LOG==============

Timestamp : Sun Dec 9 23:26:57 2018
Driver Version : 390.87

Attached GPUs : 1
GPU 00000000:00:02.0
Product Name : GeForce GTX 1060 6GB
Product Brand : GeForce
Display Mode : Enabled
Display Active : Enabled
Persistence Mode : Disabled
Accounting Mode : Disabled
Accounting Mode Buffer Size : 4000
Driver Model
Current : N/A
Pending : N/A
Serial Number : N/A
GPU UUID : GPU-a201dacf-842b-9036-7645-f12273ec0de5
Minor Number : 0
VBIOS Version : 86.06.45.40.13
MultiGPU Board : No
Board ID : 0x2
GPU Part Number : N/A
Inforom Version
Image Version : G001.0000.01.04
OEM Object : 1.1
ECC Object : N/A
Power Management Object : N/A
GPU Operation Mode
Current : N/A
Pending : N/A
GPU Virtualization Mode
Virtualization mode : None
PCI
Bus : 0x00
Device : 0x02
Domain : 0x0000
Device Id : 0x1C0310DE
Bus Id : 00000000:00:02.0
Sub System Id : 0x85C51043
GPU Link Info
PCIe Generation
Max : 3
Current : 1
Link Width
Max : 16x
Current : 16x
Bridge Chip
Type : N/A
Firmware : N/A
Replays since reset : 0
Tx Throughput : 1000 KB/s
Rx Throughput : 9000 KB/s
Fan Speed : 0 %
Performance State : P8
Clocks Throttle Reasons
Idle : Active
Applications Clocks Setting : Not Active
SW Power Cap : Not Active
HW Slowdown : Not Active
HW Thermal Slowdown : Not Active
HW Power Brake Slowdown : Not Active
Sync Boost : Not Active
SW Thermal Slowdown : Not Active
Display Clock Setting : Not Active
FB Memory Usage
Total : 6078 MiB
Used : 160 MiB
Free : 5918 MiB
BAR1 Memory Usage
Total : 256 MiB
Used : 5 MiB
Free : 251 MiB
Compute Mode : Default
Utilization
Gpu : 6 %
Memory : 3 %
Encoder : 0 %
Decoder : 0 %
Encoder Stats
Active Sessions : 0
Average FPS : 0
Average Latency : 0
Ecc Mode
Current : N/A
Pending : N/A
ECC Errors
Volatile
Single Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Double Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Aggregate
Single Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Double Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Retired Pages
Single Bit ECC : N/A
Double Bit ECC : N/A
Pending : N/A
Temperature
GPU Current Temp : 24 C
GPU Shutdown Temp : 102 C
GPU Slowdown Temp : 99 C
GPU Max Operating Temp : N/A
Memory Current Temp : N/A
Memory Max Operating Temp : N/A
Power Readings
Power Management : Supported
Power Draw : 10.22 W
Power Limit : 120.00 W
Default Power Limit : 120.00 W
Enforced Power Limit : 120.00 W
Min Power Limit : 60.00 W
Max Power Limit : 140.00 W
Clocks
Graphics : 139 MHz
SM : 139 MHz
Memory : 405 MHz
Video : 544 MHz
Applications Clocks
Graphics : N/A
Memory : N/A
Default Applications Clocks
Graphics : N/A
Memory : N/A
Max Clocks
Graphics : 1974 MHz
SM : 1974 MHz
Memory : 4004 MHz
Video : 1708 MHz
Max Customer Boost Clocks
Graphics : N/A
Clock Policy
Auto Boost : N/A
Auto Boost Default : N/A
Processes
Process ID : 1121
Type : G
Name : /usr/bin/X
Used GPU Memory : 115 MiB
Process ID : 1854
Type : G
Name : compiz
Used GPU Memory : 42 MiB

2.CUDAのインストール

CUDA - Wikipedia
「CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォーム(並列コンピューティングアーキテクチャ)およびプログラミングモデルである。」
とのこと。

以下のサイトにアクセスして、該当するOSを選択してダウンロードを行います。
CUDA Toolkit 10.0 Download | NVIDIA Developer
f:id:engetu21:20181209233307p:plain

ダウンロードが完了したら、ファイルをUbuntu14.04に設置し(いろいろやり方はあるけど、ファイル共有で渡すか、Ubuntu14.04を一旦GUIモードにしてからCUIモードに戻してもいい。URLがわかるならwgetで落とすのが一番楽かも)、ダウンロードボタンの横に記載されたコマンドを入力してインストールを実施。

$ sudo dpkg -i cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
以前に未選択のパッケージ cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48 を選択しています。
(データベースを読み込んでいます ... 現在 197124 個のファイルとディレクトリがインストールされています。)
cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48_1.0-1_amd64.deb を展開する準備をしています ...
cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48 (1.0-1) を展開しています...
cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48 (1.0-1) を設定しています ...

The public CUDA GPG key does not appear to be installed.
To install the key, run this command:
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub


$ sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
OK

$ sudo apt update
$ sudo apt install cuda
〜長いインストール〜

3.サンプルプログラム実行

サンプルプログラムのコンパイルをします。

$ export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
$ cuda-install-samples-10.0.sh ~

Copying samples to /home/engetu/NVIDIA_CUDA-10.0_Samples now...
Finished copying samples.

$ ls ~/
NVIDIA_CUDA-10.0_Samples ←これが増えてる

$ cd NVIDIA_CUDA-10.0_Samples
$ make

(略)
Finished building CUDA samples

サンプルを動かします。

$ ~/NVIDIA_CUDA-10.0_Samples/bin/x86_64/linux/release/bandwidthTest
[CUDA Bandwidth Test] - Starting...
Running on...

Device 0: GeForce GTX 1060 6GB
Quick Mode

Host to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 11907.0

Device to Host Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 10979.2

Device to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 147017.3

Result = PASS

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

無事動きました。早いのかどうかはよくわからないけど。
あとは機械学習学習をしなければいけないわけですが、数学・・・数学かぁ・・・(尻込み)

【Raspberry Pi】サーボモータで赤外線モジュールの角度を変える

※2018/12/11追記
どうもsudo servodを実行していると、aplayというか音声出力系が正常に動作しなくなる模様(再生はしているようだけど、再生時間の割に長く再生してる上に音が全く出なくなる)。
う〜む。これがservoblasterのせいなのか、サーボモータを使っただけでこうなるのか。他の方法でもサーボモータを使ってみたいところ
※追記終わり

引越したので部屋が増えたのですが、それぞれの部屋の照明がリモコン式。
3つのうち1つは手持ちでこれまで音声で赤外線操作してたけど、新たに引越し先で大家さんが設置してくれたものが2台。
こちらの2台はirMagicianで動くことは確認しました。
engetu21.hatenablog.com

なお、機種はCL6DL-5.0
www.irisohyama.co.jp
でした。

で、本題はここからで、irMagicianの設置場所を考えていますが、赤外線の到達距離も考えるとどう考えても3部屋を賄える配置がない。追加で購入(割と高い)するのもな・・・と思って色々考えたんですが、要するに赤外線の届く角度の問題なので、irMagicianの角度が変更できればいいじゃんということに気づきました。
※と言って試したものの、今のところは2部屋の対応で妥協中。

そういうわけで、電子工作もできるラズパイでサーボモータ on irMagicianを実装します。

1.サーボモータ用のプログラムをダウンロードとインストール

ラズパイでサーボモータを動かすにはいくつか方法があるらしい。
ポピュラーな方法のServoBlasterをとりあえずやってみます。

$ git clone git://github.com/richardghirst/PiBits.git
$ cd ~/PiBits/ServoBlaster/user
$ make

gcc -Wall -g -O2 -L/opt/vc/lib -I/opt/vc/include -o servod servod.c mailbox.c -lm -lbcm_host

$ sudo make install
[ "`id -u`" = "0" ] || { echo "Must be run as root"; exit 1; }
cp -f servod /usr/local/sbin
cp -f init-script /etc/init.d/servoblaster
chmod 755 /etc/init.d/servoblaster
update-rc.d servoblaster defaults 92 08
/etc/init.d/servoblaster start

インストールできていればserviceコマンドで見られる。

$ sudo service servoblaster status
● servoblaster.service - LSB: Start/stop servod.
Loaded: loaded (/etc/init.d/servoblaster; generated; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)

/dev配下にservoblasterが追加されています(仮想デバイスファイルが作られる)。

$ ls /dev/servoblaster
/dev/servoblaster

参考サイトを見るとサーボモータ1台目(0番というか0号機)の制御はGPIOポート4番、2台目(1番というか1号機)は17番、といった割り振りになっているらしい。
https://ts628-nxtlego.blogspot.com/2014/11/blog-post.html


サーボモータ1台目を動かすにはGPIOポートの4番で、ラズパイの端子7番に挿せば良いとのこと。なるほど。

実行はデバイスに対してechoするだけ

$ echo 0=130 > /dev/servoblaster

echo 0=130 は、echoコマンドででサーボモータ番号0に対して130度といった感じ。
サーボモータを2つ使う場合は、1号機指定として、echo 1=130といった感じみたいですね。

動かない場合その1として、GPIOがenableになっていない可能性がある。
その場合はラズパイの設定を変更する。

$ sudo raspi-config

f:id:engetu21:20181206223630p:plain
5 Interfacing Optionsを選択

f:id:engetu21:20181206223643p:plain
P8 Remote GPIOを選択

f:id:engetu21:20181206223656p:plain
<はい>を選択

f:id:engetu21:20181206223707p:plain
enableになったので、<了解>で完了。

動かなかった場合その2としては、serviceとしてservoblasterが動いているように見えるけど、実際には動いていない(?)可能性がある。その場合は以下のようにコマンドを打つことでサーボモータが動くようになるはず。

$ sudo servod
Board model: 2
GPIO configuration: P1 (40 pins)
Using hardware: PWM
Using DMA channel: 14
Idle timeout: Disabled
Number of servos: 8
Servo cycle time: 20000us
Pulse increment step size: 10us
Minimum width value: 50 (500us)
Maximum width value: 250 (2500us)
Output levels: Normal

Using P1 pins: 7,11,12,13,15,16,18,22

Servo mapping:
0 on P1-7 GPIO-4
1 on P1-11 GPIO-17
2 on P1-12 GPIO-18
3 on P1-13 GPIO-27
4 on P1-15 GPIO-22
5 on P1-16 GPIO-23
6 on P1-18 GPIO-24
7 on P1-22 GPIO-25

20万アクセス達成してました。

このブログを自分のメモとして作って早4年(うち2年はほぼサボりだけど)、20万アクセスを達成したようです。
f:id:engetu21:20181205191505p:plain

一応見に来た人にもわかりやすいように心がけて書いてますが、
まぁたまに「だ・である」口調になってるのは、実はそちらのほうが書きやすいからですね。
Linuxというのは中々面白いOSなので、今後もいろいろ試して継続してメモしていきたい所存。

【Raspberry Pi】PulseAudioでオーディオ出力を転送

現状、ラズパイ、小型PCといくつか持ってますが、流石にその都度スピーカーを買うのもアレなので、出力を一箇所に集中するべく、PulseAudioでの音の出力転送をします。

【参考サイト】
bluewidz.blogspot.com

今回はラズパイ3(クライアント側)→ラズパイ2(サーバ側。こちらにスピーカーを装着)

1.ラズパイ2(サーバ側)のセッティング

PulseAudioが入っていない場合もあるので、この場合はインストールから始める。

$ sudo apt update
$ sudo apt install pulseaudio

セッティングファイルをコピーしてホームディレクトリ配下に配置。
ホームディレクトリにPulsaAudioディレクトリが元々ある場合は不要だけど、無い場合は作成する。

$ mkdir ~/.config/pulse
$ cp /etc/pulse/default.pa ~/.config/pulse

コピーしたセッティングファイルは以下のように設定変更する。

$ vi ~/.config/pulse/default.pa

#load-module module-native-protocol-tcp

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.11.0/24

コメントアウトを解除して、authから先を記述。転送対象のローカルネットワークを指定

PulseAudioを再起動。ラズパイ2を再起動してもいい。

$ pulseaudio --kill
$ pulseaudio --start

2.ラズパイ3(クライアント側)のセッティング

以下のコマンドで1.で設定したサーバのIPアドレス環境変数に登録すればいい。

$ export PULSE_SERVER=192.168.1.81

しかし、これだけだと再起動したときにもしかしたら消えるかもなので、
ちゃんと設定しておく。

$ cp /etc/pulse/client.conf ~/.config/pulse
$ vi ~/.config/pulse/client.conf

;default-server =

default-server = 192.168.11.81
コメントアウトを外して、ラズパイ2のIPアドレスを設定

あとはラズパイ3でaplayなどで再生したファイルの音がラズパイ2で流れるのを確認すればOK。

【Ubuntu18.04】【LIVA Z】systemdの自動起動設定

追記

↓でグダグダ書いたけど、サーバ起動時のiptablesの自動設定はiptables-persistentをインストールするだけで解決しました・・・。
まぁsystemdの勉強ができたということで・・・。

$ sudo apt install iptables-persistent


・設定保存
sudo /etc/init.d/netfilter-persistent save

・設定読み込み
sudo /etc/init.d/netfilter-persistent reload

以下は無視してください。

ーーーーーーーーーーーーーーーーーーーー

記載が前後するけど、systemdにて自動起動する設定。
engetu21.hatenablog.com

今回はiptablesの構築ファイル。
※こちらの詳細は別途記載予定。

サーバ起動時に自動で起動したい場合、Ubuntu18.04ではsystemdを利用するらしい。
昔はinit.dに設定していたけど、時代は変わったということらしい・・・。
engetu21.hatenablog.com

1.Unitファイルの作成

iptablesの設定を記載したシェルファイルはどこに置いてもいいけど、それを起動するためにsystemdに読み込ませる設定ファイルが必要になる。
設定ファイルはUnit設定ファイルと呼ばれ、例えば、以下のように作成して、/etc/systemd/system配下に格納しておけばいいらしい。
詳細は以下のブログで。
qiita.com

$ sudo vi /etc/systemd/system/iptables.service

[Unit]
Description = iptables deamon
After=network.target

[Service]
ExecStart = /home/hogehoge/iptables.sh
Restart = always
Type = oneshot

[Install]
WantedBy = multi-user.target


※適用
$ systemctl daemon-reload

iptables.shを置く場所は自由。ExecStartでその場所を指定してあげればいい。
起動時のみ設定したいようなファイルは、Typeの指定をoneshotにしておけばいいらしい。(今回のiptables.shのような、一回設定しとけばいいや、ってものはType = simpleに設定すると妙な挙動になるので注意)
また、Afterにnetwork.targetを指定することでネットワークが立ち上がってから動作するように指定できる。

もっと確実にネットワーク後に起動させたい場合は以下のブログのようにしてあげるといいらしいですよ。
kernhack.hatenablog.com

【Ubuntu18.04】【LIVA Z】systemctlの自動起動をOFF(disable)するとエラー

最近のUbuntuは自動実行をsystemdで管理してるらしい。で、systemdというかsystemctlで作成したshellファイルを自動起動に登録したのはいいけど、再起動したらdisableでエラーを吐いた。
ちなみに作ったのはiptablesの構築ファイル。

$ sudo systemctl disable iptables.service
[ 3234.919067 ] systemd-gpt-auto-generator[16015] : Failed to dissect: Input/output error

理由が全然わからん・・・。
で、ググってみると、以下のブログで詳しく書かれてました。
mitsu-ksgr.hatenablog.com

LIVA ZはeMMCだし、systemdのバージョンは237だし、これですかね。

$ systemd-cat --version
systemd 237

ブートローダの設定を変えればいいとのことなので、
昨日書いたGRUBの設定↓をさらに変える。
engetu21.hatenablog.com

$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unit=multi-user.target quiet nosplash"

GRUB_CMDLINE_LINUX_DEFAULT="systemd.unit=multi-user.target quiet nosplash systemd.gpt_auto=0"

変更を適用する。

$ sudo update-grub
$ sudo shutdown -r now

【Ubuntu18.04】【LIVA Z】ネットワーク設定で固定IP化(CUI)

書いてなかったけど、LIVA Z(N3350)買いました!
今のところはルータにする予定。あとDocker入れていろいろ試したい。
www.links.co.jp


で、Ubuntu18.04ではネットワーク設定方法が変わったらしく、/etc/network/interfacesは使われないらしい。
どうやらUbuntu17?以降はnetplanというので管理しているらしく、Desktop版の場合はnetplan01-network-manager-all.yamlというyamlファイルで設定されているとのこと。
と言っても実際の記載としてはNetworkManagerを定義しており、そちらで管理されているっぽい。
このyamlファイルは拡張子を変えて、コピーしておいてyamlファイルを作っておく。
※拡張子が変わっていれば読み込まれないらしい
※Server版は50-cloud-init.yamlというファイル名で管理されているらしい

$ sudo mv /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.old
$ sudo cp -a  /etc/netplan/01-network-manager-all.old /etc/netplan/01-network.yaml
$ sudo vi /etc/netplan/01-network.yaml

# Let NetworkManager manage all devices on this system
network:
     version: 2
     ethernets:
       enp3s0:
         dhcp4: no
         addresses: [192.168.11.40/24]
         gateway4: 192.168.11.38
         nameservers:
           addresses: [8.8.8.8,8.8.4.4]
           search: []
         optional: true


$ sudo netplan --debug generate
DEBUG:command generate: running ['/lib/netplan/generate']
** (generate:3132): DEBUG: 20:09:58.577: Processing input file //etc/netplan/01-network-manager-all.yaml..
** (generate:3132): DEBUG: 20:09:58.578: starting new processing pass
** (generate:3132): DEBUG: 20:09:58.578: enp3s0: setting default backend to 1
** (generate:3132): DEBUG: 20:09:58.578: Generating output files..
** (generate:3132): DEBUG: 20:09:58.578: NetworkManager: definition enp3s0 is not for us (backend 1)

$ sudo netplan apply
※問題がなければ何も表示されずに即時適用される

なお、NetworkManagerは以下のコマンドで自動起動を無効にできる。


$ sudo systemctl disable network-manager
$ echo "manual" | sudo tee /etc/init/network-manager.override

また、IPv6は今の所使う予定がないので、無効化しておく。

$ cat /proc/net/if_inet6
XXXXXXXXXXXXXXXXXXXXXX 02 40 20 80 enp1s0
00000000000000000000000000000001 01 80 10 80 lo
XXXXXXXXXXXXXXXXXXXXXX 02 40 00 00 enp1s0

$ sudo vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

※設定の適用
$ sudo sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

$ cat /proc/net/if_inet6
※設定が反映されていれば何も表示されない