Raspberry pi model A+ にArch Linux ARM をインストール。(201510)

SDカードへファイルコピー

Arch Linux ARM の このページの通りに SDカードを準備する。

rpi起動、sshでアクセス

DHCPサーバを準備してからUSB NICでLANケーブルと接続。(ここでは rpi を192.168.7.9 とする)

SDカードをrpiに挿して電源投入。

アクセスランプが落ち着けば起動完了。

母艦からssh。ユーザー&パスワードは ‘alarm’

(bokan) $ ssh alarm@192.168.7.9
alarm@192.168.7.9's password:

ログインできたら、ルートになる。パスワードはデフォルトのroot

$ su
Password:
[root@alarmpi alarm]# 

システムの基本的なセットアップ

rootパスワード、ホスト名、タイムゾーン、デフォルトのロケール

# passwd            # rootパスワード設定
# echo <ホスト名> > /etc/hostname
# hostname <ホスト名>
# ln -sf /usr/share/zoneinfo/Asia/Tokyo  /etc/localtime
# echo LANG=C > /etc/locale.conf

ユーザー追加

# useradd -m <ユーザー>
# passwd <ユーザー>

sudo

sudoをインストールし、wheelグループを対象にする。ユーザーをwheelに加える。

# pacman -S sudo
# visudo
%wheel ALL=(ALL) ALL
# usermod -aG wheel <ユーザー>

終わったら<ユーザー>でsshログインしなおす。

alarmユーザー削除

追加したユーザーでsshログインしてsuもできることを確認したら、ユーザーalarmを削除。

$ su
# exit
$ sudo userdel alarm

以後 $ sudo ~~ と書かずに # ~~ と書く。

journaldのジャーナルサイズ

ジャーナルが大きいと、表示に時間がかかる。当面、小さくていい。

# vi /etc/systemd/journald.conf
SystemMaxUse=16M

SDカードを守るための調整

ext4の書き出し間隔を600秒にする。

# vi /etc/fstab  ( ext4に commit=600 指定。後でもっと増やす予定 )

カーネルのダーティデータ自動書き出しの間隔も600秒にする。恒久的でないので後でlaptop_modeで設定し直す。

# echo 60000 > /proc/sys/vm/dirty_writeback_centisecs 

各種パッケージインストール

base-develグループ

# pacman -S --needed base-devel

yaourt

yajl, package-query, yaourt の順に入れていく。

#!/bin/bash -x

sudo pacman -S --needed git yajl

git clone https://aur.archlinux.org/package-query.git
( cd package-query ; makepkg )

sudo pacman -U $(ls package-query/package-query-*.pkg.*)

git clone https://aur.archlinux.org/yaourt.git
( cd yaourt ; makepkg )

sudo pacman -U $(ls yaourt/yaourt-*.pkg.*)

よく使うツール

lv

$ yaourt -S lv

PKGBUILDのアーキテクチャに ‘armv6h’を追加。

ネットワーク設定

方針:

  • USB無線LANアダプタを使えるようにする(wpa_supplicant)。
  • netctlでなく systemd-networkdを使う。
  • ここではボトムアップ?でデバイス側から先に設定し、最後にsystemd-networkdを設定する。

とりあえず必要なパッケージをインストールする。

# pacman -S --needed autofs nfs-utils ethtool ntp wpa_supplicant wireless_tools

Wifi

ドライバを読まないので対処

うちのWifi USBドングル、Elecom製WDC-300SU2M(ID 056e:4009)は、IDの問題で認識されない。

ドングルを割って確認したらRealtek RTL8188CUS を使用しているので、8192cuドライバに紐つけて認識させることにした。(i686なArchでは モジュールが8192cuでなく、rtl8192cu だった)

まず8192cu モジュールをロードして、WDC-300SU2M のベンダ・製品IDを覚えさせるスクリプトを設置。

# cat > /etc/udev/rules.d/bind_wdc300su2m_to_rtl8192cu.sh
#!/bin/bash
#MODULE=rtl8192cu   # 686機のArchだとこのモジュールだった。
MODULE=8192cu       # rpi だとこうみたい(dkmsモジュールか?)
/usr/bin/modprobe -qba $MODULE
echo '056e 4009' > /sys/bus/usb/drivers/rtl8192cu/new_id

次に udevルールで、ドングルを挿したら先のスクリプトを実行するようにする。

# cat > /etc/udev/rules.d/78-bind_wdc300su2m_to_rtl8192cu.rules
# Elecom WDC-300U2S  Wireless LAN Adapter [mine is Realtek RTL8192cu]
# When WDC-300SU2M added, load rtl8192cu and add 056e:4009 to new_id by script
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="056e", ATTR{idProduct}=="4009", RUN+="/etc/udev/rules.d/bind_wdc300su2m_to_rtl8192cu.sh"

これでドライバを読み込むようになった。udevは毎回ルールを読むので、再起動などは不要。

インターフェース名をwlan0に固定

USBポートによって名前が変わるのは厄介なので、名前を固定。ドングルの同定はMACアドレスによる。

cat > /etc/udev/rules.d/79-my-net-name-slot.rules
# Elecom WDC-300SU2M  Wireless LAN Adapter [Realtek RTL8192cu]
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_NAME_MAC}=="wlx0123456789ab", NAME="wlan0"

wifi接続:wpa_supplicant

つまずいた点として、 wpa_supplicantのデフォルトであるnl80211ドライバは今回の8192cuに対応しないため、wextドライバを使わせることが必要だった。

wpa_supplicantの設定ファイルを書く。 Arch wikiのwpa_supplicantのページがわかり易かった。

# cat > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
ctrl_interface=DIR=/run/wpa_supplicant GROUP=wheel
update_config=1
fast_reauth=1
ap_scan=1
network={
    scan_ssid=1
    ssid="<ssid>"
    #psk="<変換前psk>"
    psk=59bc...<変換後psk>...4fc43
}

psk の部分は、$ wpa_passphrase <ssid> <パスフレーズ> で簡単に生成できる。

次に systemdにサービス登録するが、wextドライバを使わせるよう、systemdのユニットに対する変更を定義する。

# cat > /etc/systemd/system/wpa_supplicant\@.service.d/wext.conf
[Service]
ExecStart=
ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I -Dwext

サービスをstartして、statusでエラーが無いか確認

# systemctl start wpa_supplicant@wlan0.service
# systemctl status wpa_supplicant@wlan0.service

問題なければ、サービスを自動起動にする。

# systemctl enable wpa_supplicant@wlan0.service

systemd-networkd

wpa_supplicantがアクセスポイントとの無線接続を確立した後の ホットプラグ動作は、systemd-networkdに任せる。

# cat > wlan0.network
[Match]
Name=wlan0

[Network]
DHCP=ipv4

ついでに、USBの有線LANアダプタ(eth0)も。 # cat > /etc/systemd/network/eth0.network [Match] Name=eth0

[Network]
DHCP=yes

/etc/resolv.confは、resolvedに任せる。

# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

networkdとresolvdを自動起動に設定する。

# systemctl enable systemd-networkd
# systemctl enable systemd-resolved

startまで試して、wlan0がipアドレスをもらったか確認。

# systemctl start systemd-networkd
# systemctl start systemd-resolved

laptop-mode-tools

$ yaourt -S --needed laptop-mode-tools  acpid hdparm sdparm

カーネル(vm)のlaptop_mode機能は、フラッシュメモリ延命には向いてないので使用しない(リードのついでに書き込むので)。といっても常にAC接続扱いなので、デフォルト設定にしておけばlaptop_modeにならない。

なので、NOLM状態での値を設定していく。

$ sudo vi /etc/laptop-mode/laptop-mode.conf
NOLM_HD_IDLE_TIMEOUT_SECONDS=20 # 7200
NOLM_AC_HD_POWERMGMT=1 # 254
NOLM_AC_HD_WRITECACHE=0 # 1
NOLM_DIRTY_RATIO=70 # 40
NOLM_DIRTY_BACKGROUND_RATIO=1 # 10  # when write, do it much
DEF_UPDATE=1800 # 5 # dirty_writeback_centisecs / 100
DEF_MAX_AGE=1800 # 30 # dirty_expire_centisecs / 100

エラーが鬱陶しいので、conf.dの幾つか, auto でなく 0 (制御なし)にする。でも後で吟味すべし。

  • /etc/laptop-mode/conf.d/cpufreq.conf
  • /etc/laptop-mode/conf.d/ethernet.conf
  • /etc/laptop-mode/conf.d/wireless-power.conf

サービスをスタートして statusチェックしたら、vmの設定に反映されているかもチェック

# systemctl enable laptop-mode
# systemctl start laptop-mode
# systemctl status laptop-mode

# cat /proc/sys/vm/dirty_writeback_centisecs
# cat /proc/sys/vm/dirty_expire_centisecs
# cat /proc/sys/vm/dirty_background_ratio
# cat /proc/sys/vm/dirty_ratio
# cat /proc/sys/vm/laptop_mode  # 0を期待

アクセスランプをしば~らく眺める。 ものすごく小さい緑の点滅は、どうやら1秒周期のハートビートらしいので無視。

おまけ:acpidは無意味と思うけど

# systemctl enable acpid

サウンド

alsaを使うので、audioグループにユーザーを加える。

$ sudo usermod -aG audio <ユーザー>

いろいろインストールする

$ yaourt -S --needed alsa-utils alsa-firmware alsa-plugins cmus libmad mpg123
$ yaourt -S --needed libvorbis libmad libmp4v2 flac ffmpeg faad

曲名の関係でlocale調整

# vi /etc/locale.gen
ja_JP.UTF-8 UTF-8
# locale-gen

nfsクライアント

# pacman -S nfs-utils
# systemctl enable rpcbind.service
# systemctl enable nfs-client.target
# systemctl mask   nfs-blkmap.target

autofs

nfsサーバのディレクトリを、自動でマウントするようにする。 /etc/autofs/auto.miscに以下を書く。

pstorage        -fstype=nfs4,user    <server.example.com>:/var/xfertemp/pstorage

これで /misc/pstorageが自動マウントの対象になる。