ひこぽんのーと

覚書と雑記です。

cdemu-clientのこと

OSを入れ直して、
改めてcdemu-clientをインストールした際、
起動までに手間取ったのでメモを残しておく。

cdemu-clientなり、gCDemuなりをインストールすると、
cdemu-daemonサービスもインストールされる。
クライアント側はデーモンサービスに対してやり取りをするわけだが、
vhba.rulesファイルが無い場合、起動に失敗する。*1
したがって下記にファイルを追加するといい。

/etc/udev/rules.d/vhba.rules
------
KERNEL=="vhba_ctl", MODE="0660", OWNER="root", GROUP="cdrom"

その後、systemctlで起動なり、有効化するなりすれば、
クライアントは使えるようになる。

*1:ここのPackaging Guidelineに書いてある。 https://cdemu.sourceforge.io/about/vhba/

Arch LinuxとLakkaのデュアルブート構成のこと

LinuxとLakkaを同一ディクス上でデュアルブート構成にしたい

動画を見てたらやっている人がいたので、
「どうにかすればできるんだ」という薄い根拠のもと、チャレンジしてみた。
簡単そうだけど、やってみたら結構めんどくさかった。
また、意外に実現方法の記事が見当たらなかった。
ちなみに、Lakkaは公式にはデュアルブート非対応とある。

以下に方法を残す。

ここでの前提(というか環境)

LakkaをPCへインストールする

LakkaのUSBインストーラを作成し、PCをUSBブートする。
USBメディアにLive環境を作り始めるので終わるまで待つ。
(サイズの小さいUSBメモリのほうが早いだろうなぁ)

再起動後、ブートローダが表示されたら、すかさずTabキーを押す。
Tabを押すと、Live環境の立ち上げとインストーラの立ち上げを選択できるので、
インストーラを立ち上げる。

インストーラからインストールするHDDを選択し、
2度の確認をOKして、インストールする。
インストールが始まると、ディスク全体がLakkaのみになる。
インストールが完了し、再起動してLakkaが起動すればOK。

パーティションの修正

インストール後は、以下のようにパーティション構成が書き換えられている。

パーティション 用途 ファイルシステムラベル
/dev/sdx1 Lakkaブート領域 System
/dev/sdx2 Lakkaデータ領域 Storage

これをこんな風に変える。

パーティション 用途 ファイルシステムラベル
/dev/sdx1 Lakkaブート領域 & Arch Linux ブート領域 System
/dev/sdx2 Lakkaデータ領域 Storage
/dev/sdx3 拡張領域
/dev/sdx5 Arch Linux ルート領域 Arch Linux
/dev/sdx6 共用データ領域 User Data
/dev/sdx7 スワップ
Lakkaデータ領域のバックアップ

ファイル操作のできるLive CDやUSBを用意して(ここではArch LinuxのUSBインストーラ)、
Lakkaデータ領域にあるすべてのファイル・ディレクトリ(隠しファイルも含む)を
別のメディアにコピーする。

パーティションの編集

fdiskやcfdiskを使ってパーティションを編成する。
Lakkaデータ領域をリサイズして、空き領域に必要なパーティションを作るイメージ。
この時、Lakkaブート領域は変更しないこと。

パーティションのフォーマット

Lakkaデータ領域はリサイズの影響で壊れているので、
mkfs.ext4コマンドでフォーマットする。

mkfs.ext4 /dev/sdx2

新たに作成したパーティションも適時フォーマットする。

Lakkaデータ領域の復元

別のメディアにコピーしておいたLakkaデータ領域の全ファイル・ディレクトリを
元のパーティションにコピーする。
tune2fsコマンドでファイルシステムラベルをつける。

tune2fs -L "Storage" /dev/sdx2

ついでに他のパーティションにも名前をつけておくと良いかも。

ここで一旦再起動して、Lakkaが起動することを確認する。

Arch Linuxのインストール

Arch Linuxのインストールメディアを使用してインストールを行う。
Lakkaブート領域をArch Linuxのブート領域としても使うよう設定する。
GRUB2をインストールして、既存のブートローダを上書きする。
再起動後、GRUB2からArch Linuxが起動できればOK。
Lakkaはこの段階で一旦、起動できなくなる。

/etc/grub.d/40_customの編集

LakkaをGRUB2から起動できるように、
/etc/grub.d/40_customにメニューエントリを追加する。

nano /etc/grub.d/40_custom
----
menuentry "Lakka" {
	search --set=root --label System --hint hd2,msdos1
	linux /KERNEL boot=LABEL=System disk=LABEL=Storage quiet
}
----

grub.cfgの再生成

grub-mkconfigを実行してgrub.cfgの再生成を行う。

 grub-mkconfig -o /boot/grub/grub.cfg

再起動後、GRUBメニューにLakkaがあり、問題なく起動できればOK。

ああ、めんどくさかった!
UEFI環境でGPTの場合はなんか違うんだろうか、と思いつつ、
おしまい。

Lakkaのethernet, wifiに静的IPアドレスを設定するのこと

Raspberry Pi 3 B+にインストールしたLakkaで静的IPアドレス設定方法を残しておく。

Ethernetの場合

IP確認

LanケーブルをつなぐとまずはDHCPでプロファイルが作られる。
Lakkaの情報メニューから付与されたIPアドレスを確認する。

ネットワークサービス名の確認

Lakkaはconnmanctlでネットワーク設定を行うので、SSHで作業を行う。
ネットワーク設定は、/storage/.cache/connman/配下にある。
Ethernetならば「ethernet~」、Wifiならば「wifi〜」というディレクトリができているが、
このディレクトリ名がconnmanctlでのサービス名にあたる。

静的IPアドレスの設定

サービス名を確認したら、コマンドで設定する。

# connmanctl config <service> --ipv4 manual <ip_addr> <netmask> <gateway> --nameservers <dns_server>

設定が済むと直ちにIPが変わるため、接続が切れると思うので、
再度、LakkaのメニューでIPを確認を行う。
IPアドレスが変更されていればOK.

Wifiの場合

ステルスモードのアクセスポイントへの接続

scanしても見えないので、connmanctlを使って設定を行う。

$ connmanctl  // 対話モードとなる
connmanctl> scan wifi  // アクセスポイントのスキャン
connmanctl> services  // サービス名の表示
connmanctl> agent on  // エージェントを有効化
connmanctl> connect <サービス名: 例:wifi_dc85de828967_38303944616e69656c73_managed_psk>
ここでSSIDとパスフレーズを聞かれる。
入力後、接続確立のメッセージがでればOK.
connmanctl> quit

静的IPアドレスの設定

設定方法はEthernetの場合と同じ。

おしまい。

Raspberry Pi 3のWi-Fi自動起動のこと

Raspberry Pi 3にArch Linux Armをインストールして、
オンボードEthernetWi-FIに個別のIPアドレスを付与する点で
非常にハマったのでメモを残しておく。

Arch Linux Armのネットワーク設定は、
デフォルトの場合、Systemd-Networkdが使われていて、
Ethernetの方は自動認識してくれるが、Wi-Fiは設定を作成しないと接続できない。
そこでWi-Fi接続の際は、WPA_Supplicantの定義ファイルとSystemd-Networkdの定義ファイルを作成する必要がある。

  • WPA_Supplicantの定義 -> Wi-Fi接続設定(SSID、パスワード関連)
  • Systemd-Networkdの定義 -> IPアドレス設定(DHCP、手動接続など)

ところが、これをやってもIPアドレスは振られるものの
なぜかWi-FIから接続できなかった。(結局、原因もわからなかった)

そこで、Systemd-Networkdを使わずにNetworkManagerを使う方針に変更。
nmtuiで接続設定を作成(SSID、パスワード関連およびIPアドレス設定)し、
OS起動時にWi-Fi接続が行われるように設定した。

  • 「自動的に接続する 」をON
  • 「全ユーザーに使用可能 」をON

ところが、起動時にWi-Fi接続は行われなかった。
コマンドを用いて手動起動は確認できた。

nmcli con up <接続定義名>

ところで、うちのWi-Fiルーターはステルスモードで動いている。
WPA_Supplicantでは「scan_ssid=1」の定義を加える必要があったが、
nmtuiではそのような項目は無かったように思った。
そこで、nmcliで各プロパティを見ていると、
「802-11-wireless」の項目に「hidden」というプロパティがあるのに気づいた。
マニュアルによるとデフォルトはFALSEらしい。

結局、NetworkManagerでWi-Fi自動起動ができた。
ステルスモード時は「802-11-wireless.hidden」を「TRUE」にする必要がある。

nmcli connection edit <接続定義名>
nmcli > set 802-11-wireless.hidden TRUE
nmcli > save
nmcli > quit

結局、Systemd-Networkdでできなかった理由はわからないままか。。。
おしまい。

Arch Linux ArmにUPNPメディアレンダラーを立てるのこと

以前、Raspberry Pi上にUPNPメディアレンダラーを立てる記事を書いた。
nagamitsu1976.hatenadiary.jp
これと同じことをArch Linux Armでやった時、
gmrender-resurrectのビルドに多少手間取ったので記録を残しておく。

GMRenderのビルド

クローン

GitHubからソースを取得する。
https://github.com/hzeller/gmrender-resurrect.git

依存ライブラリのインストール

Arch Linux AURにgmrender-resurrect-gitとして登録されていたので、
依存関係はここを見て確認した。
https://aur.archlinux.org/packages/gmrender-resurrect-git
見たところ、必要なパッケージはlibupnp、gst-plugin-good, gst-plugin-baseだったので、
これらをインストールした。

$ pacman -S libupnp # vlcをインストールしたから入ってた(多分)
$ pacman -S gst-plugins-good
$ pacman -S gst-plugins-base
ビルド

Configure, make, make installを実行。

$ ./autogen.sh
$ ./configure
$ make
$ make install
テスト

gmrender-resurrectのReadmeを参照して、
手順通りに起動し、音声が再生できればOK。

Arch Linux Armでラジオを鳴らすのこと

以前、Raspberry PiRadikoを聴く件について書いた。
nagamitsu1976.hatenadiary.jp
あれと同じことをArch Linux Armでやってみたら
存外ハマったので記録を残しておく。

ALSAの設定

音声出力設定

alsa-utilパッケージのインストールと/boot/config.txtに下記を設定する。

dtparam=audio=on
hdmi_drive=2 # HDMIで音を出す場合に設定
audio_pwm_mode=2 # ステレオ端子で音を出す場合に設定

詳しくはArch Linux Armのサイトの手順を参照。
Raspberry Pi | Wiki | Arch Linux ARM

aplay -Lでデバイスが見つからない場合

root以外のユーザで上記の設定をしていても
バイスが見つからないことがある。
その場合は、ユーザをaudioグループに追加するとデバイスが参照できる。

再起動でボリュームが初期値に戻る

Arch Linuxの時と同じ対処方法をとればOK。

$ sudo alsactl -f /var/lib/alsa/asound.state store
$ sudo alsactl restore

SWFTools(swfextract)のビルド

Arch Linux Arm用にビルドされたSWFToolsが無いので、ソースからビルドする必要がある。
作業内容については、この記事を参考にした。
radikoの録音・再生(ArchLinux) | まっつんぶろぐ

ソースの取得

SWFToolsのサイトから最新ソースをダウンロード。
http://www.swftools.org/

依存ライブラリのインストール

SWFToolsのサイトから情報を引きたかったのだが、参照できなかったので、
先のブログ様の記事の通り、ライブラリをインストールした。

$ pacman -S pdflib zip fftw zziplib ruby
ビルド

ソースを展開してビルド開始。
先のブログ様の記事の通り、途中でエラーが発生し、ビルドが中断するが、
srcディレクトリ内を参照し、swfextract.oができていればOKとする。

$ ./Configure
$ make
# swfextractができていれば
$ make install

その他パッケージのインストール

必要なもの

rtmpdumpとvlcが必要なのでインストールする。

$ pacman -S rtmpdump vlc

これで大体、Raspbianの時と同じ環境となり、
以前作成したシェルを実行したら、うまくRadikoが聴けた。

Raspberry Piに Arch Linux Armをインストールするのこと

Arch Linux Arm on Raspberry Pi

RaspbianからArch Linux Armに載せ替えてみた。
GUIなどはインストールしなかった分、起動は早かった……ような気がする。
以下に手順を残しておく。

ガイドに従ってインストール

サイトの指示に従ってインストールする。
ガイドは作業PCがLinux前提で書いてあるけど、
Windowsだったらどうするんだろうなぁ。
Raspberry Pi | Arch Linux ARM

環境設定

以下はArch Linuxをインストールした時と同じ手順で行えた。
初期起動時点でsshdは起動しているのでリモートで作業できる。
nagamitsu1976.hatenadiary.jp

GW-900Dのドライバ導入

うちのRaspberry Piは初期型なのでWifiはドングルを使っている。
このドングルはドライバが用意されていないので、
ソースからビルドする必要があるのはRaspbianと変わらない。

ビルド環境の準備

ビルド環境とgitをインストール

$ pacman -S base-devel
$ pacman -S linux-raspberrypi-headers
$ pacman -S git
RTL8812au ドライバの作成&インストール
$ cd [適当なworking directory]
$ git clone https://github.com/gnab/rtl8812au.git
$ cd rtl8812au
$ nano Makefile
# ターゲットCPUをi386からarmに変更
$ make
$ cp 8812au.ko /lib/modules/extramodules--raspberrypi/kernel/drivers/net/wireless/
$ depmod
$ reboot

再起動したらlsmodとdmesgでドライバがロードされているか確認。*2
ip linkでネットワークインターフェイス名を確認し、wifiのI/Fが確認できればOK。

Pacmanフックの追加

カーネルが更新されるとwifiドライバもビルドし直しとなる。
手動ビルドも面倒なので、Pacmanフックを使って自動化してみる。
Pacmanフックを設定するには/etc/pacman.d/hooks配下にhookファイルを配置する。
Arch Linuxwiki Pacmanフックの項を参考に作ってみたhookファイルはこんな感じ。

/etc/pacman.d/hooks/rtl8812au.hook
……
[Trigger]
Operation = Upgrade
Type = Package
Target = linux-raspberrypi
Target = linux-raspberrypi-headers

[Action]
Depends = linux-raspberrypi-headers
Depends = make
Depends = gcc
When = PostTransaction
Exec = /usr/local/src/rtl8812au/8812au_make.sh
……

カーネルカーネルヘッダの更新をトリガーとして、
それらが更新された後にExecで指定したmake用のシェルを実行する、
といった感じ。ドライバのビルドにはカーネルヘッダが必要なので
依存条件にカーネルヘッダが入れてある。*3

wpa_supplicantの設定

接続情報の設定

wpa_passphreseでssidのパスワードを自動生成しておく。
/etc/wpa_supplicant/wpa_supplicant-wlan0.confを新規作成し、以下の内容を記述する。

ctrl_interface=/run/wpa_supplicant
update_config=1
network={
	ssid="XXXXXXXXXXX"
	proto=RSN
        key_mgmt=WPA-PSK
	pairwise=CCMP
	group=CCMP
	#psk="xxxxxxxxxxxxx"
	psk=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678901
	scan_ssid=1
}
wpa_supplicant起動パラメータの編集

このまま起動するとこんな感じで、ドライバー未サポートのエラーが出る。

Successfully initialized wpa_supplicant
nl80211: Driver does not support authentication/association or connect commands
wlan0: Failed to initialize driver interface

Arch Linuxwikiにあるwpa_supplicantの項に対処方法が書いてあるので、
wikiに従って対処する。
WPA supplicant - ArchWiki

$ nano /usr/lib/systemd/system/wpa_supplicant@.service
……
# ExecStartの行の最後に「-Dnl80211,wext」を追加する。
ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I -Dnl80211,wext
……
wpa suppliantサービスの有効化

wpa suppliantサービスの有効化を行う。

$  systemctl start wpa_supplicant@wlan0
$ systemctl status wpa_supplicant@wlan0
# ステータス確認で問題なければenableする。
$ systemctl enable wpa_supplicant@wlan0

IPアドレスの割り当て

IPアドレスはsystemd-networkdが管理しているようなので*4、以下を編集する。
ファイルの書き方はここを参照。*5

Ethernetポートの場合

/etc/systemd/network/eth0.networkを編集

[Match]
Name=eth0

#[Network]
#DHCP=yes
[Address]
Address=192.168.10.32/24

[Route]
Gateway=192.168.10.1
Wifiの場合

/etc/systemd/network/wlan0.networkを編集。
ファイルがなければ/etc/systemd/network/eth0.networkをコピーしてリネームしてから編集する。

[Match]
Name=wlan0

#[Network]
#DHCP=yes
[Address]
Address=192.168.10.33/24

[Route]
Gateway=192.168.10.1

systemd-networkdのリロード

systemd-networkdをリロードして、
ip aでIPアドレスが設定通りか確認する。

$ systemctl restart systemd-networkd

再起動

再起動して、ネットワークが自動起動すればOK。

Congraturations!

初期設定はこんな感じでおしまい。

*1:日本のサイトが無いので台湾にした

*2:/lib/modules/extramodules--raspberrypiの配下であれば読み込んでくれるらしい

*3:rtl8812auのMakefileではuname -rの結果をターゲットバージョンとするので、Pacmanフックでビルドする場合は、ターゲットバージョンの取り方を書き換えておく必要がある

*4:http://archpi.dabase.com/

*5:https://wiki.archlinux.jp/index.php/Systemd-networkd