Raspberry Pi Zero Wのbluetoothを無効にする

てことでRaspberry Pi Zero WのBluetoothも無効にしたいなと.
環境はRaspbian stretch lite 2017-09-07で確認しました.

PCで設定した以下のblacklistの手順でもokなはずですが,config.txtで無効にする方法がありそうだと調べてみました.

まずは定番のeLinux

  • RPiconfig – eLinux.org

    There's lots more documentation of available overlays in /boot/config/README. See source on Github for more.

てことでGithubを見に行きます.

それらしいものがありました :)

Name:   pi3-disable-bt
Info:   Disable Pi3 Bluetooth and restore UART0/ttyAMA0 over GPIOs 14 & 15
        N.B. To disable the systemd service that initialises the modem so it
        doesn't use the UART, use 'sudo systemctl disable hciuart'.
Load:   dtoverlay=pi3-disable-bt
Params: <None>

早速設定してみます.

$ echo 'dtoverlay=pi3-disable-bt' | sudo tee -a /boot/config.txt
dtoverlay=pi3-disable-bt

な感じで /boot/config.txt に追記して再起動しました.
lsmodを設定前と比較するとこんな感じで居なくなっています.

$ diff lsmod lsmod_pi3-disable-bt
2,6d1
< cmac                    3134  1
< bnep                   11949  2
< hci_uart               21190  1
< btbcm                   7885  1 hci_uart
< bluetooth             374820  24 hci_uart,bnep,btbcm
9d3
< snd_bcm2835            23131  0
10a5,6
> snd_bcm2835            23131  0
> rfkill                 21373  4 cfg80211
12d7
< rfkill                 21373  6 bluetooth,cfg80211
16d10
< fixed                   3029  0
18a13
> fixed                   3029  0

moduleのblacklistを設定するよりお手軽ですね :)

恐らくRaspberry Pi 3 Bでも同様の設定は使えると思います.(持ってないので未確認)

Raspbian stretch 2017-09-07

DebianベースのRaspberry Pi向けのOSイメージの最新版Raspbian stretch 2017-09-07が出ている

http://downloads.raspberrypi.org/raspbian/release_notes.txt

2017-09-07:
* Disable predictable network interface names for Ethernet devices
* Bug fix for keyboard settings dialog in Raspberry Pi Configuration
* Bug fix for crash on some videos and animations in Chromium
* Bug fix for taskbar crash when running RealVNC server
* Bug fix for reloading projects with extensions in Scratch 2
* Bug fix for MAC address problem in Bluetooth
* Simple mode and new icons in Thonny
* New Japanese translations in Raspberry Pi Configuration
* Install fonts-droid-fallback for international fonts

先月の 2017-08-16 からDebian stretchベースになっています.今回は主にバグフィクスな感じ?

New Japanese translations in Raspberry Pi Configuration

は恐らくあっきーのrc_guiの翻訳かな?

Disable predictable network interface names for Ethernet devices

はwlan0とかがstretchからの新しい命名規則になる?

Install fonts-droid-fallback for international fonts

は自分は消して日本語フォント入れるかな?

とりあえずダウンロードが終わったら試してみます.

Raspberry PiのFreedomBoxで/var/lib/dpkg/statusが壊れたのを復旧

Raspberry PiでFreedomBoxを試しているのですが,ストレージがmicroSDのせいか修正していたパッケージの依存関係か何かがおかしくなったせいか/var/lib/dpkg/statusが壊れてしまいました.

$ sudo apt update
Hit:1 http://cdn-fastly.deb.debian.org/debian testing InRelease
Reading package lists... Error!
E: Unable to parse package file /var/lib/dpkg/status (1)
W: You may want to run apt-get update to correct these problems
E: The package cache file is corrupted
E: パッケージファイル /var/lib/dpkg/status を解釈することができません (1)
W: これらの問題を解決するためには apt-get update を実行する必要があるかもしれません
E: パッケージキャッシュファイルが壊れています

apt-get updateで治るのかなと思って叩いてみましたが駄目でした.

Debian リファレンス第2章 Debian パッケージ管理によると,

2.6.5. パッケージセレクションの復元

もし何らかの理由で “/var/lib/dpkg/status” の内容が腐った場合には、Debian システムはパッケージ選択データーが失われ大きな打撃を被ります。古い “/var/lib/dpkg/status” ファイルは、”/var/lib/dpkg/status-old” や “/var/backups/dpkg.status.*” としてあるので探します。

“/var/backups/” は多くの重要な情報を保持しているので、これを別のパーティション上に置くのも良い考えです。

とのことなので,/var/lib/dpkg/status-oldから復旧をと思いましたがこれも既に壊れているバージョン./var/backups/dpkg.status.0はまだ壊れていなかったのでこれで上書きして復旧したようです.

$ sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status

/proc/cpuinfoのSerialを詐称する

$ cat /proc/cpuinfo | sed -e 's/Serial.*/Serial\t\t: 00000000deadbeef/' > /tmp/cpuinfo_fake
$ sudo chmod 444 /tmp/cpuinfo
$ sudo chown root.root /tmp/cpuinfo
$ sudo mount -o bind /tmp/cpuinfo_fake /proc/cpuinfo
$ tail /proc/cpuinfo
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

Hardware        : BCM2835
Revision        : a01041
Serial          : 00000000deadbeef

mosh 1.3.0をDropbear sshdで利用してみる

moshの1.3.0がリリースされました.

moshはsshを置き換えようとしているソフトウェアで,ネットワークが遅いときにローカルエコーを表示したり,ネットワークが切り替わってもローミングしたりと便利なソフトウェアです.(NotePCで接続してサスペンドして別のネットワークでレジュームしてもすぐに使っていた端末にアクセスできる)

1.3.0でなにかおもしろい機能が増えたりしていないかなと眺めていると

  * Add --no-ssh-pty option for Dropbear compatibility and other issues.

Dropbearで使えるようになるオプションが増えているようです.
DropbearはOpenSSHに比べて大分小さなsshdです.組み込みとかで使われているのを見ます.でも機能が物足りないなと思うことも.

mosh + Dropbearの組み合わせを試してみました.

試したのはこんな感じの環境です.

Host : Raspbian jessie(Raspberry Pi 2B)
Client : Debian sid amd64

dropbearの準備

HostにDropbearをパッケージで導入します

$ sudo apt install dropbear

dropbearのhost鍵を用意

$ mkdir /tmp/dropbear
$ dropbearkey -t ecdsa -s 521 -f /tmp/dropbear/dropbear_ecdsa_host_key
  • -t 鍵種類
  • -s 鍵長
  • -f 鍵ファイル

接続時に解りやすいようにバナーファイル作成

$ banner dropbear > /tmp/dropbear/banner

Dropbearを2222番ポートで起動

$ dropbear -r /tmp/dropbear/dropbear_ecdsa_host_key -p 2222 -b /tmp/dropbear/banner -E
  • -r host鍵を指定
  • -p sshポート番号
  • -b バナーファイル
  • -E 標準エラー出力にメッセージ出力

Dropbearにssh接続できるか確認

$ ssh pi@192.168.2.200 -i ~/.ssh/id_ecdsa -p 2222
Host key fingerprint is SHA256:G3u9pP4ZrkZ2kWs9e+ly9MkEtnO0f4ebvkBS0ObGJQQ
+---[ECDSA 521]---+
|          E+.    |
|           .+ .  |
|           +.+   |
|           .*o . |
|        S ..o++ .|
|         +o++oo= |
|        oo.o= *+=|
|         ..+ *o**|
|         o+o=.O=o|
+----[SHA256]-----+

 #####   #####    ####   #####   #####   ######    ##    #####
 #    #  #    #  #    #  #    #  #    #  #        #  #   #    #
 #    #  #    #  #    #  #    #  #####   #####   #    #  #    #
 #    #  #####   #    #  #####   #    #  #       ######  #####
 #    #  #   #   #    #  #       #    #  #       #    #  #   #
 #####   #    #   ####   #       #####   ######  #    #  #    #

Authenticated to 192.168.2.200 ([192.168.2.200]:2222).

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~ $ 

mosh 1.3.0の準備

server側はsourceからbuild

$ sudo apt-get build-dep mosh
$ wget https://mosh.org/mosh-1.3.0.tar.gz
$ sha256sum mosh-1.3.0.tar.gz
320e12f461e55d71566597976bd9440ba6c5265fa68fbf614c6f1c8401f93376  mosh-1.3.0.tar.gz

※hashとgpg署名は以下のメールに,鍵は https://mosh.org/ の一番下にある.

sourceを展開してbuild

$ tar tvf mosh-1.3.0.tar.gz
$ tar xf mosh-1.3.0.tar.gz
$ ./configure --prefix=${HOME}/usr/local
$ make
$ install

host側はDebian sid amd64のパッケージを利用した

$ sudo apt install mosh
$ dpkg-query -W mosh
mosh    1.3.0-1

ということでホスト側はこんな状態に

  • OpenSSH : 22番ポート
  • Dropbear : 2222番ポート
  • mosh 1.2.4a-1+b2(pkg) : /usr/bin/mosh-server
  • mosh 1.3.0 : ${HOME}/usr/local/bin/mosh-server

この状態でDropbearとmosh 1.3.0を利用するにはこんな感じ

$ mosh pi@192.168.2.200 --ssh="ssh -p 2222" --server='${HOME}'/usr/local/bin/mosh-server

でも実際に繋ごうとするとエラーになってしまう.

接続元のmoshではこんなエラー

/usr/bin/mosh: Did not find mosh server startup message. (Have you installed mosh on your server?)

接続先のDropbearではこんなエラー

[20390] Mar 28 06:37:20 Child connection from 192.168.2.205:32888
[20390] Mar 28 06:37:21 Pubkey auth attempt with unknown algo for 'pi' from 192.168.2.205:32888
[20390] Mar 28 06:37:21 Pubkey auth succeeded for 'pi' with key md5 0b:fb:21:45:d6:a0:7d:57:02:24:9b:d3:ed:c7:c6:23 from 192.168.2.205:32888
[20391] Mar 28 06:37:21 ioctl(TIOCSCTTY): Input/output error
[20391] Mar 28 06:37:21 /dev/pts/1: No such file or directory
[20391] Mar 28 06:37:21 open /dev/tty failed - could not set controlling tty: No such device or address
[20390] Mar 28 06:37:21 Exit (pi): Disconnect received

ということで,mosh 1.3.0で入った--no-ssh-ptyを付けてみます.

$ mosh pi@192.168.2.200 --ssh="ssh -p 2222" --server='${HOME}'/usr/local/bin/mosh-server --no-ssh-pty

asciicast

うまく繋がりました.
試しに回線を切断して再接続すると自動的に繋がるのも確認 ☺

--no-ssh-ptyを~/.ssh/configとかに書いとけるといいんですけどね.今のところ毎回指定するしかなさそう?

Raspberry Pi Zero Tips

ダウンロード
Raspberry-Pi-Zero-web
24日にKSYとスイッチサイエンスからRaspberry Pi Zero発売ってことでTipsを書いてみます.

Raspberry-Pi-Zero-web (コピー)

  • 本体の他に最低限microSD(OS領域)やmicroUSBケーブル(電源)が必要です.(microUSBへのOS導入に別途PCも必要).
  • HDMIディスプレイを利用したい場合は大抵の場合別途mini HDMIからフルサイズへの変換アダプタやケーブルが必要です.※PIZEROはmini HDMIです.よく見かけるのはmicro HDMIなので注意しましょう.
  • コンポジットのディスプレイを利用したい場合はジャックなどをはんだ付けする必要があります.(TVのシルク)
  • microUSBx2のうち片方(PWR IN)は電源専用です.
  • もう片方(USB)はUSB OTGでHOSTにもGadget(SerialやEthernetはdebugに便利!)にもなれます.電源供給も可能なので電源容量が足りるならこの1本だけで運用することも可能です.microUSBケーブルやOTGケーブルはそれなりのものを使ったほうが良いです.安いものを使ったらPIZERO側のコネクタが傷んで使えなくなってしまいました.
  • USBを利用する場合は給電が可能なmicroUSBのHUBがデバッグに便利です.
  • GPIO Pinは+以降と共通だけどピンは未実装なので利用したい場合は自分で別途ピンヘッダ等購入してはんだ付けする必要があります.カラフルなピンヘッダをASUS TINKER BOARDのようにピンの用途毎に変えると便利そうです.
    XxbHbzYFnf4AVH1a_setting_fff_1_90_end_1000C-06641

  • 純正カメラモジュールを利用する場合はRaspberry Pi Zero V1.3以降が必要(KSYもスイッチサイエンスもV1.3と書かれているので問題ない)で更にカメラモジュール付属のものとは別のPIZERO専用のケーブルが必要です.

  • KSYでは5000円以上送料無料,それ以下は一律756円の送料が掛かる.KSYを初めて使う人は形式チェックが厳しくて結構面倒なので前もってアカウントを登録しておいたほうが良いです.(単品で買うのであれば海外で買うのと変わらないか高いくらいなので早く欲しい人向け?)
  • スイッチサイエンスでは送料150円.3000円以上送料無料.単品で買う場合おすすめ.但し2017年3月20日週から順次発送予定なので届くまで暫くかかります.
  • 余録.チョコベビーの容器はケースにちょうどいいです :)
    • IMG_20170216_075638

Raspberry Piでコンポジットで起動した後に解像度やディスプレイを変更する

コンポジット出力の解像度変更

Raspberry Piを起動するときにHDMIを接続した状態で起動すると高解像度で起動しますが,繋いでいないとコンポジット出力で起動してXの解像度が720×480になってちょっと手狭です.
xrandrで解像度を追加するとXの再起動もせずに高解像度に出来ます.

※xrandrコマンドは対象のX端末上か,DISPLAY変数を対象のものを指定して実行すること

  • 720x480しか選べない
$ xrandr 
Screen 0: minimum 320 x 200, current 720 x 480, maximum 2048 x 2048
HDMI-0 disconnected (normal left inverted right x axis y axis)
Composite-0 unknown connection 720x480+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   720x480       62.69* 
DSI-0 disconnected (normal left inverted right x axis y axis)
  • cvtコマンドで設定したい解像度を指定してModelineを調べる
$ cvt 1360 768
# 1360x768 59.80 Hz (CVT) hsync: 47.72 kHz; pclk: 84.75 MHz
Modeline "1360x768_60.00"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
  • xrandrのmodeを作成する
$ xrandr --newmode "1360x768_60.00"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
  • modeが増えている
$ xrandr 
Screen 0: minimum 320 x 200, current 720 x 480, maximum 2048 x 2048
HDMI-0 disconnected (normal left inverted right x axis y axis)
Composite-0 unknown connection 720x480+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   720x480       62.69* 
DSI-0 disconnected (normal left inverted right x axis y axis)
  1360x768_60.00 (0x248) 84.750MHz
        h: width  1360 start 1432 end 1568 total 1776 skew    0 clock  47.72KHz
        v: height  768 start  771 end  781 total  798           clock  59.80Hz
  • modeをComposite-0に追加する
$ xrandr --addmode Composite-0 1368x768_60.00
$ xrandr 
Screen 0: minimum 320 x 200, current 720 x 480, maximum 2048 x 2048
HDMI-0 disconnected (normal left inverted right x axis y axis)
Composite-0 unknown connection 720x480+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   720x480       62.69* 
   1360x768_60.00  59.80  
DSI-0 disconnected (normal left inverted right x axis y axis)
  • 設定したmodeに切り替える
$ xrandr --output Composite-0 --mode 1360x768_60.00

起動後にHDMIに切り替える

解像度の変更ではなく起動後にHDMI接続に切り替えるのもxrandrで出来ます.こちらもXの再起動は必要ありません.

  • HDMIケーブルを接続するとHDMI-0 connectedとなってmodeが選べるようになる
$ xrandr 
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 2048 x 2048
HDMI-0 connected 1366x768+0+0 (normal left inverted right x axis y axis) 580mm x 360mm
   1366x768      59.79*+
   1920x1080     60.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1280x1024     60.02  
   1152x864      75.00  
   1280x720      60.00    58.68    50.00    59.94  
   1024x768      75.03    70.07    60.00  
   832x624       74.55  
   800x600       72.19    75.00    60.32    56.25  
   720x576       50.00  
   720x576i      50.00  
   720x480       60.00    59.94  
   720x480i      60.00    59.94  
   640x480       75.00    72.81    66.67    60.00    59.94  
   720x400       70.08  
Composite-0 unknown connection (normal left inverted right x axis y axis)
   720x480       62.69  
   1360x768_60.00  59.80  
DSI-0 disconnected (normal left inverted right x axis y axis)
  • 一度にコンポジットを無効にしてHDMIを有効にしようとするとエラーとなる
$ xrandr --output Composite-0 --off --output HDMI-0 --auto
xrandr: cannot find crtc for output HDMI-0
  • 一度に行うのではなく先にコンポジットを無効にしてからHDMIを有効にするとうまく行った
$ DISPLAY=:0 xrandr --output Composite-0 --off
$ DISPLAY=:0 xrandr --output HDMI-0 --auto
  • 逆にHDMIからコンポジットに切り替えることも出来る
$ xrandr --output HDMI-0 --off
$ xrandr --output Composite-0 --mode 1360x768_60.00

環境

  • HW : Raspberry Pi B 2
$ screenfetch 
    .',;:cc;,'.    .,;::c:,,.    pi@raspberrypi
   ,ooolcloooo:  'oooooccloo:    OS: Unknown 8.0 jessie
   .looooc;;:ol  :oc;;:ooooo'    Kernel: armv7l Linux 4.9.11-v7+
     ;oooooo:      ,ooooooc.     Uptime: 4h 28m
       .,:;'.       .;:;'.       Packages: 1541
       .... ..'''''. ....        Shell: 3362
     .''.   ..'''''.  ..''.      Resolution: 1368x768
     ..  .....    .....  ..      DE: LXDE lxpanel 0.7.2
    .  .'''''''  .''''''.  .     WM: OpenBox
  .'' .''''''''  .'''''''. ''.   GTK Theme: Clearlooks [GTK2], Not Found [GTK3]
  '''  '''''''    .''''''  '''   Icon Theme: nuoveXT2
  .'    ........... ...    .'.   Font: Sans 10
    ....    ''''''''.   .''.     CPU: ARMv7 rev 5 (v7l) @ 900MHz
    '''''.  ''''''''. .'''''     RAM: 258MB / 922MB
     '''''.  .'''''. .'''''.    
      ..''.     .    .''..      
            .'''''''            
             ......       

Rasbperry Piのomxplayerでのウィンドウ表示&複数表示

展示でRaspberry Piのでぅくトップを賑やかにしたいなと思い,livestreamerでストリーミングを表示したら良さそうと思ったのですが,Raspberry Piのomxplayerだと基本的に全画面です.
man(1)を見ると—​winというものを使うとウィンドウ表示が使えそう.

               --win ´x1 y1 x2 y2´     Set position of video window
               --win x1,y1,x2,y2       Set position of video window

現在の解像度を確認します.1366×768でした.

$ xdpyinfo | grep dimensions
  dimensions:    1366x768 pixels (361x203 millimeters)

livestreamer から omxplayer を呼び出すようにするとうまく行きました.
この例では右下1/4がlivestreamerで取得したストリーミング動画で埋まります.
直接描画されるのでX関係なくXの上に描画されます.

$ /usr/local/bin/livestreamer --player "omxplayer --win '684 387 1366 768'" --fifo http://www.ustream.tv/channel/iss-hdev-payload --default-stream best

以下のように同時に4枚表示とかも行けました.試してませんが9枚も行けるかも.

$ omxplayer --win '0 0 684 387' 2016-06-07.ts | \
omxplayer --win '683 0 1366 387' 2016-06-07.ts | \
omxplayer --win '0 386 684 768' 2016-06-07.ts | \
omxplayer --win '684 387 1366 768' 2016-06-07.ts


Rasbperry Piのomxplayerでのウィンドウ表示&複数表示

展示でRaspberry Piのでぅくトップを賑やかにしたいなと思い,livestreamerでストリーミングを表示したら良さそうと思ったのですが,Raspberry Piのomxplayerだと基本的に全画面です.
man(1)を見ると—​winというものを使うとウィンドウ表示が使えそう.

               --win ´x1 y1 x2 y2´     Set position of video window
               --win x1,y1,x2,y2       Set position of video window

現在の解像度を確認します.1366×768でした.

$ xdpyinfo | grep dimensions
  dimensions:    1366x768 pixels (361x203 millimeters)

livestreamer から omxplayer を呼び出すようにするとうまく行きました.
この例では右下1/4がlivestreamerで取得したストリーミング動画で埋まります.
直接描画されるのでX関係なくXの上に描画されます.

$ /usr/local/bin/livestreamer --player "omxplayer --win '684 387 1366 768'" --fifo http://www.ustream.tv/channel/iss-hdev-payload --default-stream best

以下のように同時に4枚表示とかも行けました.試してませんが9枚も行けるかも.

$ omxplayer --win '0 0 684 387' 2016-06-07.ts | \
omxplayer --win '683 0 1366 387' 2016-06-07.ts | \
omxplayer --win '0 386 684 768' 2016-06-07.ts | \
omxplayer --win '684 387 1366 768' 2016-06-07.ts

RaspbianでUVCデバイスが認識できなくて困る

昨日の話なのですが,Rasbianの入ったRaspberry PiでUVCのWebCam(logitech c270)が認識しなくて困りました.
接続してdmesgやlsusbには該当のvid/pidは出てきます.でも/dev/video?などは出てこず.
手動でomdule を読みこませようとするとこんなエラー.

$ sudo modprobe uvcvideo
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.9-v7+/modules.dep.bin'

apt update && apt upgradeでkernel更新したけど再起動して反映していない&Raspbianでは古いmoduleはupgraed時に消されるということだったようです.
再起動して新しいKernelにして解決でした.
通常のDebian等では残ってるのでちょっと嵌まりましたorz