ラズパイ・アラカルト

新ラズパイ

Raspberry Pi 4 がもうすぐ国内でも発売されるはず。CPUパワーアップだけでなく、これまでLANが基板内部でUSB経由だったところがCPU直結となる点が嬉しい。

シリーズはWiki先生が整理してくれている。

10/M追記:技適認許はいつも長いが、それについてエンジニアからの説明がここにある。

 

FPGAラズパイ

空想の世界では存在する。SF小説『オービタル・クラウド』。IT/IoT/サイバー/宇宙に関心のある方は、文庫上巻の末尾にある用語解説を見るだけで好奇心が湧いてくるはず。

来年FPGAラズパイが本当に出たら、予言的中! まぁ、それに近いモデルは既にあるが、ラズパイのような価格/流通量ではない。

 

アクリルラズパイ

かつて私の恋人だったPi3 Model B。2つ型落ちとなり、今はアクリルを身にまとうオブジェに。 

f:id:t0a9n9a4k:20190813203706j:plain

 ・・・真面目に使う場合はファンをまわしてはいけない。ヒートシンクにしよう。アクリルは基板に密接するので、型番が少しでも違うとNG。手配するときは型番をしっかりマッチさせよう。

 

エアロの合間にBodyjam

サウンドとムーブメントの絶妙なマッチング。爽快にはじけ飛ぶ展開。それらをゆったりとつなぐ気の流れはまるで太極拳。そうした流れを60分間楽しめる。うまく動ける必要はなく、楽しめればOK。Youtube等で様子を見ると、後ろの方は結構グダグダ、でも、みんな楽しんでいる。

内部構成:Warmup → Cardio1 → Interval
          → Cardio2 → Cooldown

新曲は1,4,7,10月。それ以外の月は先生の趣味でMix。Mixでは内部構成もMixされることが多い。

以下、私的メモ。まだ経験1年。随時更新。

No. MEMO ひざ注
70 面替え要素が若干あるけど、周囲の流れに乗れば、大丈夫。  
73 古いようで、古くない。ゆるいようで、ゆるくない。横キックポールチェンジをシャッフル的にキレ良く決めたい。  
74 5 more hours, just getting started. ♫ ・・・そう、あと5時間行けそうなノリ。
 
75 微かなエスニックの雰囲気と、独特のアーム・ステップが楽しい。  
80 Rihanna ♠ アームの動きがクール。  
81 経験した中では最強。270左エア+3ステップバック+ポールチェンジ+左ターンのしびれる展開。いつかリベンジ。
 ・・・    
84c1 ちょっと苦手な動きだけど、嫌いではない。一瞬の横キックポールチェンジは決めたい。  
84c2 バランスをとるところが好き。  
85c1 私のBodyjamデビューはここ。ややゆるめで助かった。  
85c2 キレよくリバースターンを決めよう。但し、力入りすぎないように。  
86c1 ♪ Rihanna ❤ 最初のターンはエアロではまず無い少ない右軸足の左ターン。  
86c2 ラテンが多いから腹筋意識。途中、何故かCardio1の割込処理が入る。  
87c1 「Mr.コーエン」って誰?(笑)、ネーミングと妙にマッチする振り。  
87c2 リバースターンからはじけ飛ぶバレエ的展開。その後のノリもGood。
88c1 スリーシックスティ右エアは、力まない方が決まる。着地はスキーやスノボと同様、足幅確保でひざ曲げて! 調子悪ければ棒ジャンプ。
88c2 リッキーマーティンの後は、右方向です。最後は気持ちよく大きく左ターン。  
89c1 いきなり左軸足の右旋回。ヒップホップは次の展開に入る1ステップ前のバリエーションを楽しもう。以外と奥が深い。  
89c2 バレエ的なスイープバック。ジャンプキックではじける後半。終わるとみんな無口。
90c1 ビートにしっかり乗り、しっかり刻めるようになると、気分爽快です。  
90c2 はじけ飛び方がWest Side Storyの雰囲気。腕を開く勢いで跳ぶと軽やか。ひざには意外とやさしい。  
91全体 いつもより多い1歩前・半歩裏前(=カウント8の表・裏)の意識ポイントをキャッチしきれば、壮絶にカッ飛べます。  
91c1 マンボターンもどきは、2歩目、4歩目をどこに置くか、研究中。  
91c2 流れに呑まれるとアドレナリンMAX! 抑えよう。
2ndターン予備動作は左足から。 
 
ひざ注:ひざや足首に負担がかかるので、できれば下半身の筋トレとストレッチを先にしておきたい。調子が悪い時は躊躇せずオプションでスルー。
 
最後は心もクールダウン。最後の深呼吸に、先生と周囲の方々への感謝の気持ちを込めて、謙虚な精神状態に戻ろう。
 
 

Xfceデスクトップアイコン文字背景を透過にする

前回記載した通り、アップグレードを続けていると、古い実装が残り、新しいトレンドに出会う機会を喪失し、やがて損をすることになる。そこで、Debian10は新規に育てることとする。

Debian10のデスクトップ環境は、デフォルトのGnome以外にもいろいろ選べる。私は、軽量かつ機能十分のXfce4で育てる。インストール直後のXfce4デスクトップ画面はとても素っ気なく、モチベーションが全く上がらないので、透過設定やアンチエイリアス設定をしてビジュアルを整える。整え方がわかりにくければ、私の場合、永年ホビーマシンにしてきたUbuntu Studio(デフォルト Xfce4)の実装が参考になる。

Xfce4のビジュアルは、たいてい、「設定マネージャー」か右クリックで直感的に何とかできるが、毎回分かりにくいのが、デスクトップアイコン文字背景の透過設定である。これは、/usr/share/themes/ 以下にある「gtkrc」を編集すれば透過になるのだが、パッケージを入れて一気に解決できる。

sudo apt install greybird-gtk-theme
アプリケーション→設定マネージャー => 外観 => Greybird, Blackbird等

なお、とあるローカルサーバ用途へ展開するDebian10は、安定稼働に入れば、lightdm/Xfce4を起動させない対応をとる。サーバの位置付けによっては、当然、デスクトップ環境は根こそぎアンインストールする。一方で、開発環境向けにはいつものようにScreenletsを無理やり入れる。

Debian10で、さっそくトラップを踏む

めでたくDebian10がStableに昇格したので、アップグレードしたところ、さっそくトラップを踏みました。

安直アップグレード:

sudo sed -i 's/stretch/buster/g' /etc/apt/sources.list
sudo sed -i 's/stretch/buster/g' /etc/apt/sources.list.d/*.list
sudo apt update
sudo apt upgrade

 

トラップ:

uimの依存関係崩れでアップデートが中途半端に終わり、にっちもさっちもいかなくなりました。元の/etc/apt/sources.list次第なのですが、日本語環境でuim関連パッケージが入っているならば、アップグレード作業に入る前に、根こそぎ削除しておいた方が良さそうです。

 

私は、結局、元のsources.listに一旦戻し、apt updateしてから、dpkg -l | grep uim でひっかかるパッケージを全てapt purgeすることとなりました。

 

その後、sources.listをbusterに戻し、apt update; apt full-upgradeの後、apt install uim-anthyで解決。今のところ私の環境では、これ以外のトラブルは無さそうですが、まぁ、普通は、アップグレードはもう少し待つべきでしょう。。。

 

なお、この件は、既知の問題のようです。

https://www.reddit.com/r/linuxquestions/comments/80sfo3/cant_install_remove_or_update_packages_uimanthy/

 

・・・そもそも、アップグレードを続けていると、古い実装が残り、新しいトレンドについていけなくなります。今回も、nftablesとかwaylandとか、目玉がいろいろありあす。夏休みを目途に、新規で育てます。

 

ラズパイ MicroSD自己増殖

電源プチ切り対応したラズパイのMicroSDを自己増殖する。コピー先のMicroSDは、100均のMicroSD-USB変換アダプタを使ってラズパイに挿入する。そのMicroSDは「/dev/sda」として認識されるはずである。ddコマンドだけで安直にコピーしても、おそらく問題は起きないが、コピーチェクの時間まで考慮すると、cp -aで実施した方が速い。そのため、下記のような少し手の込んだ対応をする。

前提:私のラズパイのMicroSD(コピー元)のパーティションは下記のようになっている。UUID関連の出力は省略している。

~# blkid
/dev/mmcblk0: PTTYPE="dos"
/dev/mmcblk0p1: LABEL="boot" TYPE="vfat"
/dev/mmcblk0p2: LABEL="rootfs" TYPE="ext4"
/dev/mmcblk0p3: LABEL="nfsroot" TYPE="ext4"

以下、非インタラクティブなシェルにしている。(まだ作成中)
ラズパイの場合、先頭領域をddでコピーしなくても良さそうだが、念のためそうしている。

#!/bin/bash
## 先頭64MBだけはddでコピー(パーティション情報と先頭のfat領域をコピー)。
dd if=/dev/mmcblk0 of=/dev/sda bs=16M count=4 
sync
## ベリファイ
MD5_ORG=`dd if=/dev/mmcblk0 bs=16M count=4 | md5sum`
MD5_SDA=`dd if=/dev/sda bs=16M count=4 | md5sum`

if [ ! ${MD5_ORG::32} == ${MD5_SDA::32} ] ; then
    echo "先頭領域のコピーでエラーが発生しました。途中終了します。"
    exit 1
fi

## MicroSDの容量変更
# 容量を変える場合はフォーマットの前にパーティション調整する。
# CUIならparted, HDMIモニタのX-Window環境ならgpartedで調整すると楽だろう。

## ext4フォーマット
mkfs.ext4 -F /dev/sda2
mkfs.ext4 -F /dev/sda3

## ラベル付与
e2label /dev/sda2 rootfs
e2label /dev/sda3 nfsroot

## コピー
### 電源ブチ切り対応でROマウントしていた部分を一旦RWにする。
mount -oremount,rw /   
[ -d /mnt/org ] || mkdir /mnt/org
[ -d /mnt/new ] || mkdir /mnt/new
mount /dev/mmcblk0p2 /mnt/org
mount /dev/sda2 /mnt/new
cp -aT /mnt/org /mnt/new
sync; echo 3 > /proc/sys/vm/drop_caches
umount -f /mnt/org /mnt/new
### ROに戻す。
mount -oremount,ro /

mount /dev/mmcblk0p3 /mnt/org
mount /dev/sda3 /mnt/new
cp -aT /mnt/org /mnt/new
sync; echo 3 > /proc/sys/vm/drop_caches
umount -f /mnt/org /mnt/new

備考:

  • ddコマンドはコピーチェックをしないので、書込後のハッシュチェックはした方が良い。

  • cp や rsync はコマンド内にコピーチェック機能が含まれているので、書込後のハッシュチェックは不要。

  • rsyncよりcpの方が、コピー後のディスク容量が小さくて済む。どちらでも良いケースでは、標準コマンドであるcpを使う方が良い。 一方で、rsyncやddは、progress(進捗)表示が可能。


1PCで複数LANポート運用時の留意事項

https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

この中で、

 

arp_announce

arp_ignore

rp_filter

 

の3つは、要注意。rp_filterは、ディストリビューションによっても、デフォルト値が違う(適用パッケージに依存しているかもしれないが)。

LinuxでのIEEE1588v2 PTP

少しディープなところにダイブする(バスタブ レベルだが)。一般的なNICカードでサポートされているPTPハードウェアタイムスタンプが具体的に何をしてくれるのか、いまひとつ把握できていなかった。ここでは、特に、タイムスタンプ送信に関する実装について調べる。なお、PTPの原理そのものは、ここでは追わない。

概要

Precision Time Protocol (PTP) は、隣接ノード間(距離には依存しない)でマイクロ秒オーダの誤差範囲で時刻同期するプロトコル。PCで普通に実施できるNetwork Time Protocolより精度が高く、スマホ基地局間タイミング同期、ロボットアーム同期、オーディオスピーカ同期等で適用される。10年前ならホットな技術だったかもしれないが、今は成熟し枯れている様子。LinuxでのPTPデーモンは2種類あり、主要ディストリビューションでは両方のパッケージがある。なお、OSの上でPTP時刻同期を実施しても、精度面での効果は無く、従来のNTPで十分である。

パッケージ名 デーモン名 Hard Time Stamp
linuxptp ptp4l 対応有り
ptpd, ptpd2 ptpd, ptpd2 対応無し

 ptp4lの「4l」は「for Linux」の略。

PTPの伝送レイヤも2種類ある。業界毎にプロファイルがあり、サポート範囲が異なる。原則はマルチキャストだが、UDPはユニキャストでも対応できる様子。

Layer Ethernet Type Port
L2 Ethernet 0x88F7
L4 UDP IPv4 0x0800, IPv6 0x86DD 319, 320


調査H/W

INTEL 82574Lを搭載したPCIe NICカード とする。デバイスがどこまで対応しているかは、ethtool -Tコマンドで確認できる。但し、ここでの表示はあらかじめソースに埋め込まれた内容を表示しているにすぎず、レジスタアクセス等は無い様子。

# ethtool  -i enp1s0
driver: e1000e
version: 3.2.6-k
firmware-version: 1.8-0
##

# ethtool  -T enp1s0
Time stamping parameters for enp1s0:
Capabilities:
    hardware-transmit     (SOF_TIMESTAMPING_TX_HARDWARE)
    software-transmit     (SOF_TIMESTAMPING_TX_SOFTWARE)
    hardware-receive      (SOF_TIMESTAMPING_RX_HARDWARE)
    software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
    software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
    hardware-raw-clock    (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 1
Hardware Transmit Timestamp Modes:
    off                   (HWTSTAMP_TX_OFF)
    on                    (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
    none                  (HWTSTAMP_FILTER_NONE)
    all                   (HWTSTAMP_FILTER_ALL)
    ptpv1-l4-sync         (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
    ptpv1-l4-delay-req    (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
    ptpv2-l4-sync         (HWTSTAMP_FILTER_PTP_V2_L4_SYNC)
    ptpv2-l4-delay-req    (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ)
    ptpv2-l2-sync         (HWTSTAMP_FILTER_PTP_V2_L2_SYNC)
    ptpv2-l2-delay-req    (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ)
    ptpv2-event           (HWTSTAMP_FILTER_PTP_V2_EVENT)
    ptpv2-sync            (HWTSTAMP_FILTER_PTP_V2_SYNC)
    ptpv2-delay-req       (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)


データシートの内容

82574Lのデータシート 7.7.2項や7.7.3.2項によれば、送信ディスクリプタExtCMD bit0(TimeStamp)をセットすると、PTPフィールドにタイムスタンプが刻印されると解釈できる。82574LにはPTPクロック専用のH/Wカウンタが内蔵されており、phc_ctl コマンドによって、OS時間やRTCとは別の時刻が刻まれている様子を確認できる。phc_ctlはlinuxptpのS/Wパッケージに含まれている。

~# echo "OS TIME:"; date; echo "RTC TIME:"; hwclock; echo "PTP TIME:";  phc_ctl eth0 get
OS TIME:
2019620日 木曜日 21:45:03 JST
RTC TIME:
2019-06-20 21:45:36.827508+0900
PTP TIME:
phc_ctl[3345.712]: clock time is 1561034696.559877320 or Thu Jun 20 21:44:56 2019

82574Lよりも新しいI350では、PTPに関連付けたGPIO/SDPピン出力を定義できる。この信号上のタイミングに基づくエッジでのデバイス制御が王道の使い方だろう。

デバイスドライバでの送信ディスクリプタ設定

ここに、送信ディスクリプタ ExtCMD bit0(E1000_TXD_EXTCMD_TSTAMP)をセットするLinuxデバイスドライバのソース実体がある。ptp4lを使った場合、/etc/linuxptp/ptp4l.confにおけるtime_stampingの設定が「hardware」ならばこのビットがセットされ、「software」ならセットされないことを確認した。
つまり、S/WはPTP送信フレームを生成するが、ディスクリプタにマークすれば、あとはH/Wが内蔵64bitカウンタを元によろしくやってくれるという感じである。
なお、インテルNICEthernetコントローラを本格的なPTPシステムに含める場合、ドライバS/Wをメーカのホームページから入手し更新するべきである。


現時点のまとめ・解釈

他のオフロード機能と同様、PTPについてもNIC(またはEthernetコントローラ)がフレームの上位機能に介入する。フレームはS/Wが作るが、NICは勝手に判断して正確なタイムスタンプを付与する。その時、UDPの内部が変わるので、当然、UDPチェックサムも(再)生成/付与される。 試しに82574L搭載のUbuntuマシンで「sudo apt install linuxptp」を実行したら、何の設定も無しに1秒に2〜3フレームのPTPをマルチキャストし始めた。このPTP時刻精度を評価するには、高精度なマスタークロック源に同期した上で、専門の測定機材での評価が必要。


備考1

linuxptpをインストールすると、phc2sys (ptp hardware clock to the system)もインストールされる。実運用では、これの使い方、要否についても把握しておく必要がある。たいていは不要と判断できる。


備考2: ptp4lの設定

ptp4lデーモンが起動しない場合、下記ファイルをチェックする。
 /etc/linuxptp/ptp4l.conf ## time_stamping を software にすることも可
 /lib/systemd/system/ptp4l.service ## -i でPTP対応のLANポートを指定
 ## ptp4l.serviceを更新したら、systemctl daemon-reload ; systemctl restart ptp4l
その他、redhatのマニュアルも見ておくと良い。


備考3: ラズパイでptpスレーブ

ラズパイをPTPスレーブにして同期させる手早い方法。

apt install ptpd
ptpd -i eth0 -s -C


その他

OS上だけでPTPを実施してもPTP本来の精度的には無意味だが、例えば、狭いネットワーク内の機器でログ時刻を合わせたいといったシーンはよくある。そうしたシーンではPTPはお手軽な時刻合わせ手段となる。但し、Windowsで動く手軽なPTPソフトは見つかっていない(仮想マシン上のLinuxでは動く)。