ひこぽんのーと

覚書と雑記です。

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

Arch Linuxのインストール手順のこと その4

How to use AUR

Ubuntuで言うPPAみたいなもの。
AURのリポジトリにはソースが置いてあるので、
ダウンロードしてきて、ビルド、インストールすると認識すればいい。
手でやるのは面倒だと思うけど、そこはそれ、
パッケージ名を指定するだけで導入できるツールがある。

Yaourtの導入

ヨーグルトと読むらしい。
これを導入すれば、AURも簡単に導入できる。

gitのインストール

インストールしたてのArch Linuxにはgitも入ってないので、これを追加する。

$ sudo pacman -S git
package-queryのインストール

yaourtで必要なpackage-queryをインストールする。
適当なディレクトリを作ってそこにcloneして、手順に従ってビルドする。

$ mkdir ~/.local/share/aur
$ cd aur
$ git clone https://aur.archlinux.org/package-query.git
$ cd package-query
$ makepkg -si
$ cd ..
yaourtのインストール

続いて、yaourtをcloneして、ビルドする。
ビルドが終われば導入完了。

$ git clone https://aur.archlinux.org/yaourt.git
$ cd yaourt
$ makepkg -si
$ cd ..

実験: Mate Tweakのインストール

AURパッケージ導入の実験として、Mate Tweakをインストールしてみる。
Ubutu MateにあったMate TweakはArch LinuxではAURに分類されているので、
まずは、Arch LinuxのAURのページへ行き、Mate Tweakのパッケージ名を調べる。
f:id:nagamitsu1976:20180621153107p:plain
いくつかあるが4つのうち3つは開発版だたりgtk2版だったりして違うようなので、
最上位にある「mate-tweak」をインストールしてみる。

$ yaourt -S mate-weak

手順としては上のコマンドを実行するだけ。
これで、ソースのダウンロードからビルド、インストールまで一括で行える。
コマンド実行中にビルドファイルの編集、ビルドされたパッケージの内容確認を聞かれるが
これは特にしなくても大抵は問題ない。
出来あったパッケージをインストールすれば、
コントロールセンターにMate Tweakが追加される。

That's all. This is end.

といったところで、Arch Linuxの導入はおしまい。
Arch Linuxをインストールしてみると、
Ubuntuの導入がいかに楽なのかがよく実感できる作業でした。

Arch Linuxのインストール手順のこと その3

Customize Mate Desktop Environment

とりあえず、デスクトップが表示されたけれど、
まだ、機能が足りない。
というわけで、環境構築の続き。
GUIのフォントが文字化けしている場合なんかは、
外観の設定で好きなフォントを設定しておいてください。

IMEの設定

キーボードレイアウトの設定。

キーボードレイアウトが初期ではUSになっているので、
コントロールセンターからキーボード設定を呼び出して、
レイアウトの設定を行う。
日本語レイアウトを追加してUSレイアウトを削除する。
合わせてキーボードの型式も設定する。
f:id:nagamitsu1976:20180621135729p:plain

インプットメソッドフレームワークのインストール

Ubuntu Mate 16.04でも採用されていたfcitx-mozcをインストールする。

$ sudo pacman -S fcitx-im fcitx-mozc fcitx-configtool

ホームディレクトリに.xprofileを作成し、下記を追加する。

$ nano ~/.xprolie
……
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

一旦、ログオフし再ログインすると、fcitxが立ち上がる。
(通知スペースにキーボードのアイコンが出る)
fcitxの設定パネルからアドオンタブを開いて、advancedチェックをON。
Fcitx XIM Frontendを選択して、ダイアログのチェックボックスをONにする。
fcitxを再起動。
f:id:nagamitsu1976:20180621140800p:plainf:id:nagamitsu1976:20180621140805p:plain

XDGユーザディレクトリの作成

XDGユーザディレクトリというのは、ユーザのホームディレクトリ配下にある
「デスクトップ」とか「ダウンロード」などのディレクトリのこと。
初期のMateではパッケージがインストールされていないので作られていない。
手順は以下の通り。

xdg-user-dirsパッケージのインストール
$ sudo packman -S xdg-user-dirs
xdg-user-dirs-updateの実行

デフォルトで良ければ、xdg-user-dirs-updateを実行する。
英語が良ければ、LC_ALL=C xdg-user-dirs-updateを実行する。

$ xdg-user-dirs-update
or
$ LC_ALL=C xdg-user-dirs-update

デフォルト以外のパスを使いたければ~/.config/user-dirs.dirsを作成し、
中身を記載してから、xdg-user-dirs-updateを実行する。

$ nano ~/.config/user-dirs.dirs
……
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_TEMPLATES_DIR="$HOME/.Templates"
XDG_VIDEOS_DIR="$HOME/Videos"

gvfsマウントルールの追加

ファイルマネージャでディスクをマウントする際、認証を求められることがある。
それを回避するために以下の設定を行う。

storageグループにユーザを追加
$ usermod -aG storage [user-name]
10-enable-mount.rulesの作成

/etc/polkit-1/rules.d/10-enable-mount.rules

$ nano /etc/polkit-1/rules.d/10-enable-mount.rules

# 下記を追加
polkit.addRule(function(action, subject) {
	if (action.id == "org.freedesktop.udisks2.filesystem-mount-system" && subject.isInGroup("storage")) {
	    return polkit.Result.YES;
	}
});

音量がリセットされる場合の対処

ボリュームコントロールからボリュームを設定したのに、
再起動するとリセットされている場合に実施する。

alsa-utilsパッケージのインストール
$ sudo pacman -S alsa-utils
ALSA設定の保存&レストア

この状況の場合、ALSA 設定ファイル/var/lib/alsa/asound.stateが存在しない……と思うのでコマンドを使って強制的に設定を保存し、レストアする。

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

Congraturations!

日本語が入力できるようになれば、おめっとさん。
あとは自由にカスタマイズできるでしょう。

……って、ここで終わられても、まだAURを使ってない。
というわけで、その4へ続く。

Arch Linuxのインストール手順のこと その2

Install Mate Desktop on Arch Linux

その1の続き。
私はヘタレLinuxユーザーなのでGUIが無いと何もできません。
というわけで、GUI導入までの手順を残す。
LinuxデスクトップではダントツのMate推しなので、
Mate Desktopの導入となります。

CUI環境の整備

コンソールの文字化け対策

前回のインストール時にロケールをja_JP.UTF-8としたので、
今のコンソールではメッセージが化けまくっている。
そこで、tty環境(alt+ctrl+F1〜F6)ではLANG=Cとなるように、Bashの定義を追加する。
追加後、再度ログインすれば、メッセージは英語で表示される。

$ nano /etc/bash.bashrc
 ……
#下記内容を末端に追加
# tty force LANG=C
(tty|fgrep -q 'tty') && export LANG="C"
 ……

ちなみに、コンソールに日本語を表示する方法として、
fbtermとかKMSCONとかを導入するって方法があったけど、
どっちも試した結果、どちらもしっくり来なかった。
解像度とか、描画の美麗さ、反応速度とか色々。
で、結局、文字化けしなければ英語で十分、という判断になった。

タブ補完の強化
$ pacman -S bash-completion
multilibリポジトリの有効化

64bitOSなので32bitのライブラリは不要だけれど、
wineを使いたいので32bitライブラリもインストールできるように
multilibリポジトリを有効化しておく。
/etc/pacman.confの[multilib]の項目とパスを有効化

$ nano /etc/pacman.conf
$ pacman -Syu
ユーザ追加
$ useradd -m -G wheel -s /bin/bash [username]
$ passwd [username]
sudo設定の追加

sudoで権限委譲できるuserを追加する。

$ visudo
……
# User privillege specificationの項に下記を追加((グループ全体を適用する方法もある。))
[username] ALL=(ALL) ALL
……
日本語フォントのインストール

これはお好みで。

$ pacman -S noto-fonts noto-fonts-cjk

GUI環境の構築

X Window Systemのインストール
$ pacman -S xorg-server xorg-apps xorg-server-xephyr
グラフィックドライバのインストール

lspciコマンドを使ってVGAバイスの確認を行う。

$ lspci | grep -e VGA -e 3D

確認できたグラフィクカード(or チップ)に合わせてドライバをインストールする。
wikiXorgの項目にインストールべきドライバについて記載がある。*1
うちのPCはnVidia GeForce GTS 250なのでnvidiaのレガシードライバをインストールした。

$ pacman -S nvidia-340xx nvidia-340xx-utils lib32-nvidia-340xx-utils

nvidia-settingsというツールでグラッフィクボードの状態を見たり、Xorgの設定が行えるのだが、
GUI表示させた場合、下記のパッケージが無いとエラーがでるので、
気になる場合はインストールしておく。

$ pacman -S gtk2 gtk-engines

nvidiaドライバが更新された時、initramfsのアップデートが必要となる。
ドライバ更新時のinitramfsの再作成を自動化するため、
/etc/pacman.d/hooks/nvidia.hookファイルを作成しておく。

$ nano /etc/pacman.d/hooks/nvidia-340xx.hook

[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=nvidia-340xx

[Action]
Depends=mkinitcpio
When=PostTransaction
Exec=/usr/bin/mkinitcpio -p linux
ディスプレイマネージャのインストール

ディスプレイマネージャにも色々あり、何を選ぶかは自由となっているが、
Ubuntu Mate 16.04で採用されていたLightDMを選んだ。

$ pacman -S lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings

あとで気づいたことだけど、Mate導入後にjournalログを見たらこんなエラーが出てた。

6月 20 11:04:19 catharina lightdm[479]: Error getting user list from org.freedesktop.Accounts: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.Accounts was not provided by any .service files

ここに少しやり取りがあり、accountsserviceパッケージが無いと発生するらしいが、
動作には問題が無い模様。*2
でも、気になるのでインストールをしておく。

$ pacman -S accountsservice
MATEデスクトップのインストール
$ pacman -S mate mate-extra
ディスプレイマネージャの自動起動On
$ systemctl enable lightdm
コンポジットマネージャのインストール

ウィンドウ装飾のことらしいんだけど、
Mateで採用されているウィンドウマネージャのMarcoには、
ソフトウェアコンポジットの機能があるので、なにもしなくてもウィンドウの装飾は行われる。
とはいえ、これはLinux
実はこの装飾を行うプログラムであるコンポジットマネージャも好きに選べる。
ということで、comptonというコンポジットマネージャも入れてみた。

$ packman -S compton

起動するには自動起動するアプリケーションに下記のように追加するだけ。
ただし、起動する際はMarcoのコンポジット機能をOFFにしておく必要がある。

$ compton -b
起動時NumLock On

ディスプレイマネージャ起動時にNumLockをOnにする方法。
デフォルトOffでも構わないのだけれど、
NumLockがOnのままログオフするとNumLockのランプがついているけれど、
内部ではNumLockがOFFという奇妙な状態になるので、
デフォルトOnとなるようにしておいた。
当然、ディスプレイマネージャによってやり方は異なる。
LightDMの場合は、numlockxパッケージをインストール後、
/etc/lightdm/lightdm.confを編集する。

$ pacman -S numlockx
$ nano /etc/lightdm/lightdm.conf
……
# greeter-setup-scriptの行を有効にしてnumlockxのコマンドを記述する
[Seat:*]
greeter-setup-script=/usr/bin/numlockx on
……

ネットワークマネージャのインストール

dhcpcdが動いているので今のままGUIを起動してもネットワークには繫がる。
ただ、Mateの通知パネルに通知が上がってこないのでわかりにくい。
そこで、ネットワーク設定をNetworkManagerにやらせることにする。

インストール
$ pacman -S networkmanager network-manager-applet gnome-keyring
NetworkManagerの自動起動On
$ systemctl enable NetworkManager
dhcpcdの自動起動Off
# systemctl disable dhcpcd

Windows Network 共有

ファイルマネージャ(caja)で共有サーバを覗くだけなら
gvfs-smbパッケージをインストールするだけでOK。
だめだったらsamba smbclient cifs-utilパッケージもインストールする。

	$ pacman -S gvfs-smb
	# だめだったら後からこれもインストール。
	$ pacman -S samba smbclient cifs-util

再起動

$ reboot

Congraturations!

再起動後、ログイン画面が出たらおめっとさん。
新しく作ったユーザでログインできたらおつかれさん。

……って、ここで投げ出されても、まだツラい。
というわけで、その3へ続く。