Raspberry Pi の ntp 設定を変更する

小ネタです。調べ物をしてたら、 Raspberry Pi OS には標準で NTP サーバーの機能が埋め込まれており、 Debian の NTP サーバーにアクセスしているということでした。必ずしも変更する必要もないかもしれませんが、気になったので日本のサーバーに変更しました。

状態確認

● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
  Drop-In: /usr/lib/systemd/system/systemd-timesyncd.service.d
           └─disable-with-time-daemon.conf
   Active: active (running) since Sun 2021-01-10 15:17:18 JST; 1 weeks 2 days ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 309 (systemd-timesyn)
   Status: "Synchronized to time server for the first time [2001:19f0:200:144b::2000]:123 (2.debian.pool.ntp.org)."
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/systemd-timesyncd.service
           └─309 /lib/systemd/systemd-timesyncd

 1月 10 15:17:17 raspberrypi systemd[1]: Starting Network Time Synchronization...
 1月 10 15:17:18 raspberrypi systemd[1]: Started Network Time Synchronization.
 1月 10 15:18:07 raspberrypi systemd-timesyncd[309]: Synchronized to time server for the first time [2600:3c04::f03c:92ff:fe41:5a9c]:123 (2.deb
 1月 16 11:18:17 raspberrypi systemd-timesyncd[309]: Timed out waiting for reply from [2001:1620:2777:b::128]:123 (2.debian.pool.ntp.org).
 1月 16 11:18:18 raspberrypi systemd-timesyncd[309]: Synchronized to time server for the first time [2001:19f0:200:144b::2000]:123 (2.debian.po

これが、設定前の Network Time Synchronization System の設定です。 debian.pool.ntp.org に読みに行ってます。これを ntp.nict.jp に変えます。

設定変更

設定ファイルは /etc/systemd/timesyncd.conf です。任意のエディタで編集します。

#NTP=
 ↓
NTP=ntp.nict.jp

これで OK なんですが、これまで標準だった debian サーバーの設定が残ったままで、 nict.jp にアクセスするか不明なので、 Debian サーバーにアクセスしないようにします。といっても、コメントアウトされた 1 文から#を取り去るだけです。

#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
 ↓
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org

これで設定はおしまいです。簡単ですなぁ。

再起動と確認

では、設定ファイルをセーブして、 Network Time Synchronization System を再起動します。そして、設定を確認します。

$ sudo systemctl restart systemd-timesyncd.service
$ sudo systemctl status systemd-timesyncd.service

2行目の status コマンドで、設定が上手くいっているか確認します。エラーが出ていなければ次のようなステータスが表示されると思います。

● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
  Drop-In: /usr/lib/systemd/system/systemd-timesyncd.service.d
           └─disable-with-time-daemon.conf
   Active: active (running) since Tue 2021-01-19 20:42:16 JST; 18s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 30168 (systemd-timesyn)
   Status: "Synchronized to time server for the first time [2001:ce8:78::2]:123 (ntp.nict.jp)."
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/systemd-timesyncd.service
           └─30168 /lib/systemd/systemd-timesyncd

 1月 19 20:42:16 raspberrypi systemd[1]: Starting Network Time Synchronization...
 1月 19 20:42:16 raspberrypi systemd[1]: Started Network Time Synchronization.
 1月 19 20:42:16 raspberrypi systemd-timesyncd[30168]: Synchronized to time server for the first time [2001:ce8:78::2]:123 (ntp.nict.jp).

ちゃんと ntp.nict.jp から時間を読んでます。完成ですね。

まとめ

簡単な変更ですし、順番にやれば問題なるところはないはずです。 ntp サーバーの詳しいシステムに関してはよく分かってないのですが、遅延がなければより正しい時間を表示されるはずですよね。 Debian のサーバーがどこにあるのかわかりませんが、日本国内ではないと思います。多少の遅延が生じているのかもしれませんね。

絶対に直さなければならないと言うわけではありませんが、気になったので直してみました。

Wacthdog の設定

Raspberry Pi zero がハングアップしていました。何が原因かはっきりしませんが、ハングアップは困るので、対策をとってみます。

Raspberry Pi OS には、 Wacthdog Timer というのがあらかじめ仕込んであるそうです。ただ、通常はこの機能が OFF になっています。 Wacthdog というのは、システムが一定間隔で生存確認を行い、生存確認が取れなかった場合にリスタートしてくれるというものです。 Wacthdog のシステム自体がダウンしてしまったら、当然リスタートもされないと思うのですが、システムのコア部分に組み込まれているので、よほどのことがない限り大丈夫でしょう。では設定していきます。

ブート・コンフィグに追記

$ sudo nano /boot/config.txt

ブート・パーティションにあるということからもわかる通り、システムのコア部分で起動するものですね。慎重に作業しましょう。次の1文を追記します

dtparam=watchdog=on

蛇足ながら、 ON を OFF にすることで Wacthdog 機能が OFF になります。もちろん、最初にこの1文は入っていませんでしたから、 Wacthdog は OFF ですね。

初期設定する

カーネルモジュールの初期設定を行います。これもテキストの修正だけです。作業そのものは簡単ですが、スペルミスは Wacthdog の動作に影響しますので、慎重に行いましょう。

$ sudo nano /etc/modprobe.d/bcm2835-wdt.conf

このファイルは最初、存在していませんでした。新規作成ですね。もしあったら以前に Wacthdog を設定しているかもしれませんね。

options bcm2835_wdt heartbeat=14 nowayout=0

heartbeat=14 が設定時間になります。14秒ですね。ここは自分の設定時間でいいと思います。次の nowatout=0 は、 heartbeat (心拍)が止まったのを感知してからリスタートするまでの時間ですが、特別な理由がない限り0で良いですね。

Systemd の設定

次に、 systemd の設定です。これで最後になります。

$ sudo nano /etc/systemd/system.conf

この中にはすでに設定部分がコメントアウトされた形で書き込まれていますので、検索して見つけましょう。おそらく先頭に # が入った形でコメントアウトされていると思うので、 # を削除した上で上で設定した heartbeat (心拍)時間と一致させます。

#RuntimeWatchdogSec=0
            ↓
RuntimeWatchdogSec=14

動作確認

以上の設定が終わったら、 Raspberry Pi をリスタートさせます。再起動したら、次の1文を打ち込みます。

$ dmesg | grep bcm2835-wdt

私のシステムでは、

[    2.816764] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer

という応答が帰ってきました。先頭部分の数字は変わります。何も応答が帰ってこない場合は、 Wacthdog が起動していないことが考えられます。スペルミスなどがないか、チェックしてください。実際にシステムをハングさせて見れば確実ですが、私怖くて出来ませんでした。 Wacthdog を信じることにします。

まとめ

私は、再起動が完了したらメールを飛ばすように設定しました。常にメールをチェックできるわけではないのですが、メールが来た時間から逆算してシステムがどうしてハングアップしてしまったのか推測できますね。

あえてここには書きませんが、システムをハングさせる方法はいくつかありますので、検索してください。 Raspberry Pi は現在、5台稼働していますので、それぞれに同様の設定をします。想定外のシステムストップがなくなると良いなぁ。

AirPods Max 1週間使ってみて

絶賛した前回と打って変わって、ちょっとここはなぁという部分を書いてみますね。

有線での接続について

専用のコード「 Lightning – 3.5mm オーディオケーブル( 1.2m ) - ブラック - Apple (日本)」これ使わないと有線での接続が出来ないそうです。私、通常の lightning- オーディオケーブルが使えるんだと思って、注文してしまいました。 178 円でした。中国のバッタモンですけどね。

このコード、アップルストア直販価格で、 3,800 円ぐらいします。ちょっと高いですね。かすかな期待として、購入した(今輸送中)中国のバッタモンが使えたりしないかと思ってます。ダメでしょうね。 Apple の方針でしょうから致し方ないですけど、使えないのは不便ですね。

バッテリーについて

1 回の充電で使える時間は長いので困りません。むしろ、使わないときのことが問題です。今回の記事を書くきっかけはこのバッテリーの問題です。

電源スイッチを持たない AirPods Max は常に電源が ON になっています。そうすることで、 iMac や iPhone トのシームレスな接続が担保されるわけですね。これは相当便利です。ところが、いわゆる待機電力というか、使っていないときのバッテリー消費が想像以上に大きいです。使わないまま2日放置すると、満充電から30%以下まで落ち込みます。

それを防止するためには、いわゆるブラジャーケースに入れてやることが必要になります。これ、意外に面倒です。ケースそのものにも入れ方がありまして、右側に充電用の lightning ポートがあり、それ用に切れ込みが入っています。

ケースに入れてやると、ケースについている磁石に反応して、 AirPods Max がディープスリープに入ります。この状態だとバッテリーほとんど減りません。ケースへの入れ方を間違えても問題ないみたいですが、入れないとバッテリーが減ってしまうのは変わりません。

シームレスな接続をとるか、バッテリーの持続時間をとるか。難しい問題だったと思いますが、ちょっと減り方が早いですね。

持ち運びは不便

ケースに入れたまま持ち運ぶとなると、ハードケースが欲しいところ。すでに Amazon ではいくつかハードケースを紹介してくれますね。ただ、フィット感がどうなのか実際に使ってみないとなんとも言えません。

頭につけるものを首になんぞするなと言われそうですが、

無精ひげがみっともないですねぇ

この向きに曲げられないのも個人的には「えっ〜」ってところでした、逆向きには回るんですが、この向きには曲げることが出来ません。首にセットすることは出来ないと思った方がいいですね。

…とは言え

分解能は全くもって素晴らしいですし、これまで音源として mp3(320kbps) で十分だと思っていたにもかかわらず、 AirPods Max で FLAC 音源との聞き比べをして以来、 FLAC 音源を鳴らせるプレーヤーを探していたりします。正直、 mp3 と flac で音質がこんなに変わるなんて思っていませんでしたし、それを聞き分けることが出来るガジェットが手に入るとも思ってもみませんでした。

今まで、あまり分解能が高くない廉価版のヘッドフォンを使っていたのが、もったいなかったなぁなどと思っています。音質面では全くもって文句のつけようがありません。

長時間の視聴でも疲れることがなく、耳が痛くなることもありません。素晴らしいヘッドフォンです。6万なにがしの価値はあったと確信しています。

unattended-upgrades を動かす

表題の通りなんですが、私インストールすれば動くのかと思っていました。大きな間違いでしたね。道理で Update されてないわけだ。

内容に関しては、以下のブログを参照してください。何て不親切な私。

  1. 寝ている間に Raspberry Pi を全自動アップデート!~ unattended-upgrades を使おう - みかんのゆるふわ技術ブログ
  2. はなぴょんブログ [Ubuntu]メールサーバ構築 (Postfix)
  3. Raspberry Pi に Postfix を入れてコマンドラインから Gmail 経由でメールを送ろう - みかんのゆるふわ技術ブログ

メール送信まで出来ます。上記は Raspberry Pi で動かすための記事です。下2つはメール送信を行う時に参照しました。2だけで設定するとエラーが出てしまうので(もしかしたら私の環境だけかも)、3を参照しました。

さて、これを Raspberry Pi 5台+ FerenOS 1台に設定しました。設定ファイルは NAS に置いておいて参照するようにしたので、最初にやったヤツほど他のヤツには時間かかりませんでしたが、エラーが出る。 SYSLOG を見る。スペルミスや、設定のミスを見つけてやり直す。繰り返しましたね。 Linux のことを知るには良い素材でした。

最初に書くべきでしたが、 unattended-upgrades ってのは、 Linux の Update を自動で検知して、実行する。というプログラムです。 Update が終わるとメールを送ってくれます。便利ですね。 cron でも出来るんですが、メールを送るとなるとちょっと大変ですし、スマートじゃありません。設定さえ間違えなければ、簡単に目的が達成できますね。

この例では、 gmail を経由させてメールを送ります。メールの文面はカスタマイズできそうもないので、合計6台に同じメールをセットしてあってちょっと不便です。文面をカスタマイズ出来ないなら、メールアドレスの方を細工しようと思っています。 gmail はご存じの方も多いと思いますが、アドレス中にピリオドを入れてメールアドレスを分けたり、プラス記号を入れて違うアドレスのようにしたり出来ます。これを使って、どこから来たメールなのかを判断しようと言うことですね。

今日は、設定しただけでおしまいで、メール・エイリアスを使った処理は明日にしようと思ってます。うまくいくかな。

AirPods Max これいいわ!

高級ブラジャーヘッドフォンである AirPods Max を発売日の2日後に予約したんですね。ところが、納期予想が3月! その後、2月になったよ。というメールが来たんですが、大晦日に Apple から出荷案内が来ました。そして、本日(令和 3 年 1 月 1 日)届きました。 AirPods Max です。お年玉ですね。

使い勝手 ( ペアリング )

まずは、ペアリングから。手順を説明すると、

  • iPhone で Bluetooth を ON にする。 
  • AirPods Max に iPhone を近づける。

以上。さすがですね。これでペアリングが完了します。 iMac とのペアリングも自動で行われます。この辺は iCloud を使っているものと思いますので、何でもかんでもペアリングするわけではありません。しかし、ブラジャーケースから取り出して iPhone を近づけるだけで、 iPhone に接続するけどいいかい? という案内が出るのは快感です。素晴らしいです。

装着感

私、眼鏡を常用しています。ヘッドフォンをすると眼鏡のツルの部分が押しつけられて痛くなります。こればっかりは AirPods Max でも変わらないだろうな。と思っていますが、1時間ほど装着した感想でしかありませんが、非常によく出来ていますね。外部の音をシャットアウトする為に、堅くも柔らかくもないクッションに覆われたイヤーカップはいい感じです。他のヘッドフォンほど痛くならないと思います。

耳全体を覆う形のイヤーカップになっていますので、これも長時間装着したときの違和感は最小限になっていますね。

若干残念だったところも書いておきますね。私、頭がでかいです。普通に売っているキャップは入りません。ヘッドフォンに関しても同じで、今まで使っていたヘッドフォンも目一杯広げて使います。 AirPods Max に関しても、最大限広げて使っています。私でギリギリかなぁ。もう数ミリ広がって欲しいなぁ。 Max なんだからもうちょい大きくしてもよかったのに。とはいえ、後で述べますが、外部の音をシャットアウトする機能に問題はないですね。よほどのことがない限りこの点が問題になることはないと思います。

操作感

AirPods Max には操作するためのボタンが一つと、 Apple Watch などにも採用されているダイヤル式のリューズが一つ。デジタル・クラウンというんですよね。確かに、 UP/DOWN のボタン式の音量調節に比べると、格段に操作感はいいです。このデジタル・クラウンを長押しすると Siri が起動します。

  • オーディオコンテンツを再生/一時停止するには、 Digital Crown を 1 回押します。再生を再開するには、もう一度押します。
  • 早送りするには、 Digital Crown を 2 回押します。
  • 巻き戻すには、 Digital Crown を 3 回押します。

この操作もスムーズです。 Mac だと Music アプリに対応していますし、 iPhone も純正 Music アプリが対応してますね。私、自作の音楽再生ソフトを使っていますので、この操作には対応していないんですよ。残念だなぁ。

圧倒的に使い勝手いいのは、頭から AirPods Max を外すと自動的に停止。再びかけると再生するギミック。これいいですね。なれてしまうと他に移れない。

(肝心な)音について

今まで私が使っていたヘッドフォンがチープだったためでしょうね。 AirPods Max の音は格段にいいです。私自身の性能があまりよくないにもかかわらず、音の分解能っていうんでしょうか。小さい音もはっきりわかりますし、低音もただ、ドンドン言ってるだけではないというか。うまく表現できませんが、さすがに6万円(消費税も入って7万円弱)の値付けをするだけのことはあると思います。

外部音声取り込みモードと遮断モードって言うのかな。これも非常に有効です。遮断モードにするには、右側のイヤーカップの前側についているボタンを押すと有効になります(当然、もう一度押すと外部音声取り込みモードになります)。遮断モードになってると本当に外の音が聞こえません。逆に取り込みモードだと、適当に外の音が聞こえるので、よく出来ているなぁと感心することしきりです。

試しに、同じ音楽を FLAC 音源と MP3 音源で比較してみました。これまで使っていたヘッドフォンだと、その差は大してわかりませんでした。しかし、 AirPods Max で聞き比べてみると、違うんですね。さっき、分解能がいいって話をしましたが、 FLAC 音源だと、楽器の一つ一つがはっきり聞こえる気がします。私自身の性能が低いのでオーバースペックのような気がしてきたぞ。ヤバいな。

まとめ

値段が値段なので、全ての人にお勧めできる商品ではないですが、音を商売にしている人、商売でなくとも趣味にしている人にはお勧めできますね。非常にいい。

難点を上げれば、やっぱりあのブラジャーケースですね。ケース自体の性能に文句はないんですが、デザインがなぁ〜。ハードケースで、ディープスリープ機能がついているものがあるなら欲しいなぁ。ちなみに、あのケースには磁石が仕込まれていて、一定の場所にその磁力が及ぶとディープスリープ機能が ON になるんだそうです。だったら、ハードケースも出来そうですよね。どっかのホームページで見たような気がするんですけど、海外だったなぁ。

さっきからずっと装着して使っていますが、問題になるようなことはありませんね。 AirPods Max を外して首に引っかけて歩く。多分そう言うことは想定していないんだろうな。それが残念かな。

SDカードを“割った”

こういう間抜けなことをするのは、私だけでしょうか。多分私ぐらいでしょうね。

先ほど説明した、LCDケースにSDカードを入れたままケースを外したり、閉じようとしたりして力をかけました。どうなったかというと、アイキャッチ画像にもあるように、真っ二つになりました。ケースはSDカードを抜いて外したり閉じたりするように出来ています。SDカードを入れたままでは無理な力がかかるんですね。

内部で断線していたんだと思いますが、何度電源をON / OFFしても Raspberry Pi OS が立ち上がらないんですね。どうもおかしいと思いまして、SDカードを抜いたら、真っ二つです。

このカード、16GBなんですね。基本的なデーターのやりとりはNASを経由するので本体の容量は16GB程度で十分なんです。でも、ストックなくなりました。仕方ないので、32GBのSDカードを使います。

いやぁ、割れるとは思ってなかった。

LCDケースの覚え書き

今年の念頭に購入していたLCD付きの Raspberry Pi 用ケースについてすっかり忘れていたのと、ここ数日の Raspberry Pi セットアップシリーズに乗っかって、このLCDケースについても書いてみます。

Amazon | STARTO 3.5 インチ Raspberry Pi 用ディスプレイ 保護ケース付属 タッチパネル 320*480 解像度 デュアルディスプレイ同時表示 ゲームとビデオ可能 Raspberry Pi ZeroW A A+ B B+ 2B 3B 3B+ に対応 ラズベリーパイ 3 TS11 | STARTO | ベアボーン PC 通販

購入したのは Amazon 。正常に起動できるようになるまでのプロセスは前のエントリーと一緒です。正常に起動できるようになってから、 ssh で操作します。

$ sudo apt install git
$ git clone https://github.com/waveshare/LCD-show.git
$ cd LCD-show/
$ sudo ./LCD35-show

これで基本的なドライバーはインストール完了。自動的にリスタートします。

次にヘッドレス環境の場合、表示されることは表示されるのですが、エラーが出ます。これを回避します。

$ sudo nano /etc/rc.local
---------
# fbcp &

編集するのは /boot/rc.local というファイル。これの終わり頃にある fbcp & という行をコメントアウトします。これでエラーが出なくなります。当然、リスタートは必要ですね。

更に、これだけだと解像度が高すぎても字が細かく見ていられないので、解像度を下げます。コマンドは sudo raspi-config 。

これで解像度が低くなってログも見やすくなります。

基本的にヘッドレス運用しますので、こういうのはありがたいですね。これで2台「とりあえず」動くようにしました。あとは、 Raspberry Pi 4+ と Raspberry Pi zero W 。それぞれほったらかしになっているので、用途を見つけなきゃ。いじっていると楽しくなります。

Raspberry Pi セットアップ (2)

昨日は Raspberry Pi が立ち上がるところまでしました。最低限の設定ですね。ここからはお好みの世界です。昨日までは HDD をつなぐことを考えていましたが、どうせならつないだ HDD から立ち上げてみようと言うことに方向転換しました。今までの作業は無駄になりません。ちなみに接続したのは古い320 GB のハードディスク。実はここからSDカードなしで立ち上げる方法もやってみたのですが、うまくいきませんでした。なので、ブートローダーとしてSDカードも使います。

7.接続HDDのフォーマットなど

Linux では ext4 が標準です。無理矢理他のフォーマットにしても意味がないので、 HDD をつないで ext4 にフォーマットします。

$ sudo parted /dev/sda # /dev/sdaは変わる可能性あり
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt                                                      
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y                                                                 
(parted) mkpart primary ext4 0% 100%                                      
(parted) p                                                                
Model: I-O DATA HDPC-U (scsi)
Disk /dev/sda: 320GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags
 1      1049kB  320GB  320GB  ext4         primary

(parted) q                                                                
Information: You may need to update /etc/fstab.

パーティション作成ツールの応答も含めてコピペしました。 (parted) というのがプロンプトになります。この例では、 ext4 で全ての領域をフォーマットしました。「分割したい」という方、ググってください。

8.システムのコピー

前日作った環境をそっくり HDD にコピーします。ここでミスるとやり直しになります。慎重にいきましょう。まずは現在の状況を確認します。

$ sudo fdisk -l
(省略)
Disk /dev/mmcblk0: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x352a458b

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   532479   524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      532480 31116287 30583808 14.6G 83 Linux


Disk /dev/sda: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Disk model: HDPC-U          
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 14D08399-DC65-4293-9CCD-08C23DAFD12A

Device     Start       End   Sectors   Size Type
/dev/sda1   2048 625141759 625139712 298.1G Linux filesystem

fdisk というコマンドで現在の状況をダンプします。ここで、 /dev/sda が HDD 。 /dev/mmcblk0 がSDカードになります。その他にもいっぱいダンプされますが、省略。HDDを2台つなげたりしているマニアの方は、変わってきますのでよく確認してください。

いよいよコピーです。

$ sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=32M conv=noerror,sync status=progress

if インプットの i です。 of アウトプットの o です。これひっくり返したりすると大変なことになります ( 多分クラッシュする ) 。慎重に。SDカードからHDDへのコピーですね。最後の status=progress はなくてもいいと思いますが、進捗状況がわからないと不安になるのでつけます。時間がかかるので、コーヒーでもどうぞ。

続いて、ディスクのチェックとHDDの領域解放を行います。領域解放って適切な言葉が見つからないので勝手に作りましたが、SDカードからコピーしただけだと、残りの領域を使えないことになるんだそうで、それをHDD本来の容量まで使えるようにする。ということですね。

$ sudo e2fsck -f /dev/sda1
(略)
$ sudo resize2fs /dev/sda1

最初の e2fsck では、フリーブロックのカウントがおかしいよ。というメッセージが出る場合があります。私がやった場合は2回出ました。それぞれ「 y 」で進めてOKです。

9.ブートシステムを調整する

今までは準備。ここからが本番です。といっても操作は比較的簡単なんですが、間違えてしまうと後戻りできません。まずは、HDDの固有番号というか partuuid というのを調べます。

$ ls -l /dev/disk/by-partuuid/
lrwxrwxrwx 1 root root 15 12月 31 11:11 352a458b-01 -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 15 12月 31 11:11 352a458b-02 -> ../../mmcblk0p2
lrwxrwxrwx 1 root root 10 12月 31 12:04 5bf1e314-89aa-40ec-944e-12b488a25d99 -> ../../sda1

私の結果をそのまんまコピったけど、並んでいる記号のような部分は違うので、自分の環境に応じて置き換えてくださいね。このままコピーしても UUID が違うので、間違いなく起動しません。

上の例でいくと「 5bf1e…. 」の部分が partuuid です。この部分メモしておきましょう。

次にHDDの中のファイルを読み書きするんですが、まだマウントされていないので、マウントします。 /mnt/ フォルダにマウントしますね。別にここじゃなければダメって訳ではありませんが、後々面倒なので、 /mnt/ フォルダでいきます。

$ sudo mount -t ext4 -o defaults /dev/sda1 /mnt

HDDの内容が、 /mnt/ 以下にマウントされます。で、先ほどSDカードからコピーしたファイルの中で、 /etc/fstab というファイルを編集したいんですが、HDDは /mnt/ にマウントされていますから fstab の場所は、 /mnt/etc/fstab になります。これを編集します。

$ sudo nano /mnt/etc/fstab
------
PARTUUID=352a458b-01  /boot           vfat    defaults          0       2
PARTUUID=5bf1e314-89aa-40ec-944e-12b488a25d99  /   ext4    defaults,noatime  0       1

上記は編集後です。ルート (/) がマウントする場所をSDカードからHDDに変更します。最初先ほどダンプした partuuid のリストで mmcblk0p2 がマウントされていたのが、ルート (/) になっているはずです。それを先ほどメモしたHDDの uuid に書き換えます。私何度もこの fstab ファイルを編集していますが、間違えると間違いなく塡まります。起動しなくなって泣きを見ることも多々ありました。特に今回はヘッドレスでやってますので、お手上げになりますね。

書き換えたらセーブします。くれぐれも間違いのないように。

 $ sudo nano /boot/cmdline.txt
------
console=serial0,115200 console=tty1 root=PARTUUID=5bf1e314-89aa-40ec-944e-12b488a25d99 rootfstype=ext4 elevator=deadline fsck.repair=yes rootw

最終段階です。今度はブートシステムのSDカード上のファイルを編集します。上記例の一番上。 cmdline.txt を編集します。ここの root= のところを書き換えます。例によって先ほどメモした uuid に書き換えます。これも間違えてしまうと起動しなくなりますので、慎重に。

ここまで出来たらOKです。再起動しましょう。うまくHDDから立ち上がれば万々歳ですね。ダメだったら … また1からやり直しましょう。上手くいったら下記のコマンドで確認します。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root        294G  1.6G  280G    1% /
devtmpfs         430M     0  430M    0% /dev
tmpfs            463M     0  463M    0% /dev/shm
tmpfs            463M   12M  451M    3% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            463M     0  463M    0% /sys/fs/cgroup
/dev/mmcblk0p1   253M   48M  205M   19% /boot
tmpfs             93M     0   93M    0% /run/user/1000

一番上、 /dev/root サイズが 294 GBですね。成功です。320 GB のハードディスクを使ってますが、色々使って294 GB になってます。問題ありません。

10. NAS のマウント

セットアップの最後に NAS をマウントします。私はファイルのやりとりに NAS を使うことが多いです。そこで、自動的に NAS をマウントして使えるようにしたいのでですね。早速、手順を説明しますが、手順は2つ。まずマウントする場所を作ってやります。さっき、一時的に /mnt/ フォルダにマウントしましたが、今度は /mnt/ フォルダ以下にフォルダを作ってそこにマウントさせます。

$ sudo mkdir /mnt/nas
$ sudo chmod 777 /mnt/nas

次に、先ほども出てきた fstab を編集します。ただし、今度はすでにルート (/) にマウントされた状態ですので、アドレスは /etc/fstab になります。さっきとは違いますので、注意してください。

$ sudo nano /etc/fstab
------
//192.168.●.●/freenas/home /mnt/nas cifs username=●●,password=●●,iocharset=utf8,defaults 0 0

fstab に今度は「追記」します。最終行に上記例のコードを書き加えます。途中で改行を入れないで1行にして入力します。 /freenas/home というのは、私の環境に設置した NAS のフォルダなので、自分の環境に合わせてください。自宅だとパスワードなしで運用している人もいるかもしれませんね。その場合は password=, で OK です。さっきも書きましたが、 fstab の記述が間違っていると、起動時にエマージェンシーモードに入ってしまいます。これはヘッドレス環境では操作できないので、慎重に。

セーブしたら確認しましょう。

$ sudo mount -a

これでエラーが出なければよし。エラーが出てしまうようだと何かが間違っていますので、再度見直してください。

$ df -h
ファイルシス                サイズ  使用  残り 使用% マウント位置
/dev/root                     294G  1.6G  280G    1% /
devtmpfs                      430M     0  430M    0% /dev
tmpfs                         463M     0  463M    0% /dev/shm
tmpfs                         463M   12M  451M    3% /run
tmpfs                         5.0M  4.0K  5.0M    1% /run/lock
tmpfs                         463M     0  463M    0% /sys/fs/cgroup
/dev/mmcblk0p1                253M   48M  205M   19% /boot
//192.168.●.●/freenas/home   5.2T  2.2T  3.0T   43% /mnt/nas
tmpfs                          93M     0   93M    0% /run/user/1000

下から2行目に NAS がマウントされています。 OK ですね。

まとめにかえて

長々と書いてきました。ほとんどが、ネット上の受け売りです。自分の環境に合わせるために試行錯誤したところはあります。しかし、先人達には感謝しかありません。ハードディスクから起動できるようになりましたので、SDカードの寿命を気にすることはほぼなくなりました。HDDがクラッシュしたら泣きますけど。

ここまでで、本当の基本設定が終わりました。次は … なんに使おうかまだ決まってません。先のエントリーでも言っていましたが、分散処理システムには興味あります。情報があまりないので手詰まりなんですけどね。さて、もう一台もセットアップしようかな。

Raspberry Pi セットアップ (1)

昨日、 Raspberry Pi のことを書きました。せっかくなので、使ってなかったヤツをアップデートしようと思ったら、SDカードがいかれていました。しょうがないので、1からセットアップしようとしました。「しました」? ええ、しました。なんと途中で大きなミスをしてアクセスできなくなりました。もうね、もう一回やります。このブログでメモ取りながらやりますとも。

1.ダウンロード&SDカードへ書込み

ダウンロード先ちょっと見ないうちに変わりましたね。4B+用にいろんなディストロビューションが用意されています。

Operating system images – Raspberry Pi

Raspberry Pi OS というのを選択しますが、3種類ありますね。この中の Lite を選択しました。

SDカードへの書込みには balenaEtcher – Flash OS images to SD cards & USB drives を選びました。以前に比べて、エラーチェックを厳格にしているみたいで、一つ一つの動作が緩慢になりましたね。OSとの関係もあるのかもしれませんね。操作法に関しては省略。ググると出てきます。

2.ヘッドレスで操作するための一手間

今回、 Raspberry Pi をヘッドレスで設定しようとしています。ヘッドレスってのは、モニターをつながず他の PC から ssh で接続することを言いますが、標準では ssh が通りません。そこで一手間かけます。

先ほど書き込んだSDカードを再度マウントさせます。 boot というのがマウントされると思うので、内容のない「 ssh 」という名前のファイルを置きます。 macOS だと

$ touch /Volumes/boot/ssh

で OK ですね。最初の起動でこのファイルが読み込まれ、標準的な ssh が通るようになります。ここで出来たSDカードを Raspberry Pi にセットして電源を接続。起動するまで待ちましょう。以後は別のマシンのターミナルから操作します。

3.最初のログイン

私は、 Router にあらかじめ MAC アドレスに紐付く形で IP アドレスを割り当てておりまして、今回使う Raspberry Pi にはすでに決められたアドレスが割り当てられています。なので簡単なのですが、 IP アドレスが DHCP によって振り分けられている場合は IP アドレスがわからないので、探さなければなりませんね。スミマセンが省略です。

ssh の初期設定は、ユーザー名が「 pi 」、ログインパスワードが「 raspberry 」、ポートは 22 になっています。この情報を元に ssh 接続します。

4 .ユーザー名とパスワードの変更

なんぼなんでも初期設定のまま使い続けるのは、セキュリティ上まずいので、ユーザー名とパスワード、それと接続ポートを変更します。実は最初にやったときに、接続ポートの変更で設定ミスして ssh の接続ポートがわからなくなってしまいました。こうなるとお手上げです。ちゃんと確認しながらやりましょうね。

さて、そのままでは変更できないので、一時的なユーザーを作ってそいつでログインし、ユーザー名を変更します。この部分、ログイン・ログアウト、ユーザー名、パスワードが各々違ったりして紛らわしいので注意してください。

まずは一時的なユーザー (temp) を作ります。

$ sudo useradd -m temp
$ sudo gpasswd -a temp sudo
Adding user temp to group sudo
$ sudo passwd temp
New password:●●●●
Retype new password:●●●●
passwd: password updated successfully
$ exit

$ で始まる行が入力する行になります。1行目で「 temp 」ユーザーを作ります。2行目ではそのユーザーを sudo グループに入れます。これしないと、 temp ユーザーが sudo 出来ません。続いて temp ユーザーのパスワードを決めます。「●●●●」の部分がパスワードになりますが、エコーバックはありませんので、気をつけて入力してください。

次は今作った temp ユーザーでログインします。先ほどは pi ユーザーでした。今度は temp ユーザーです。パスワードも異なりますので注意です。

$ sudo usermod -l newuser pi
$ sudo usermod -d /home/newuser -m newuser
$ sudo groupmod -n newuser pi
$ exit

1行目で pi ユーザー名を新しいユーザー名に変えます。ここでは「 newuser 」としました。2行目はホームフォルダを変更し、3行目でグループを変えます。ここまでで temp ユーザーはお役御免になりますので、 exit します。

さて、新しいユーザー newuser でログインするんですが、この newuser 君のパスワードはまだ変わっていません。 newuser 君はもともと pi ユーザーの名前を変えたものですから、ユーザー名: newuser 、パスワード: raspberry です。この条件でログインします。

$ sudo userdel temp
$ sudo passwd newuser
New password:●●●●
Retype new password:●●●●
passwd: password updated successfully
$ sudo rm /etc/sudoers.d/010_pi-nopasswd
$ exit

1行目で先ほどお役御免になった temp ユーザーを削除します。2行目は newuser のパスワードを設定します。先ほどと同じように「●●●●」の部分が、パスワードでエコーバックはありません。もちろん、 temp ユーザーと newuser ユーザーで違うパスワードで全く問題ありません。最後にファイルを一つ削除しています。これは、 pi ユーザー(変更しました)がパスワードなしで作業できるようにするための設定で、残っていていいことはありませんので、削除します。

以上のユーザー名変更のセクションは、「[Raspbian]ユーザ名変更の個人的に「正しい」と思うやり方 | 純規の暇人趣味ブログ」を参考にって言うか、まるっきり一緒だったりします。言葉足らずの部分はリンク先を参照してください。

5.秘密鍵・公開鍵を設定

これ端折ります。先ほど作った newuser でログインしてそのホームに「 .ssh 」というフォルダを作り、そこに公開鍵をコピーします。この辺、たくさん解説しているサイトがあるので、ググってみてください。(長くなってきてるもんで … )

6.アップデート

これをまず最初にやるべきだという声がありそうですね(汗

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y dist-upgrade
$ sudo rpi-update
$ sudo reboot

上2行は定期的に行う通常のアップデートで、その下は何かあったときにやればいいやつです。特に4行目はファームウェアのアップデートで、これをやった後は必ずリスタートしなければなりません。

<小休止>

長くなってきたので、エントリーを分けます。後半では、 USB に接続した HDD のマウント。ネット越しの NAS マウント。などを行います。後半は明日。

Raspberry Pi の使い道

結構自虐的なエントリーなんですが、 Raspberry Pi ってあるじゃないですか。私の自宅にもたくさんあります。たくさんあります。複数台あるんですね。で、完全に使い道があるのは1台だけだったりするんです。う〜ん、あんまり制御系には興味ないし、言語習得とか言うジャンルには他の PC で OK です。なんに使おうか。。。

いやね、 Raspberry Pi って安いじゃないですか。つい買っちゃうんです。現在手元にあるのが、3 model B が2台、4 model B が1台、 zero W が1台。使い道がないのだけで4台あるんですね。ヤバいです。もったいないっす。何とかしなくちゃならんと思ってます。

試作用とか、制御系に使われることが多い Raspberry Pi ですが、小さな筐体でありながら、PCとして使うことが出来るのは素晴らしいです。唯一使っているのは zero W でして、小型液晶と組み合わせてサーバーに蓄積された画像を引っ張ってきて一定間隔で表示する、ミニサイネージとして使っています。このブログでも何度か出てきているので、検索してみてください。

使い道がないままではかわいそうなので、何とかしたいのです。 Raspberry Pi を使って samba の使い方を覚えましたし、 Linux の基本操作習得にも役立ってくれました。これまで、全く使ってこなかったわけではないのです。愛着もあるのでなおのことです。今考えているのは、複数台あるというのを生かして連携して何か出来ないかなぁと思っています。動画のエンコードなど、マシンパワーが必要なものなど使えないかなぁ。ググってみても、クラスターコンピューティングというのはもう古いのかなぁ。開発が止まっているものが多いみたい。

分散処理システムに利用できないか、引き続きリサーチしてみようと思います。