Linux化計画(10)–SDカードのバックアップ

SDカードのバックアップをします。

VNCクライアントの実行までうまくできるようになったところで、そろそろSDカードのバックアップをしておかないと、なんだか怖いことになりそうです。当初のSDカードを作ったときのツールを使えばバックアップは取れるようですが、せっかくラズパイが使えるようになったのに、Windowsでバックアップするというのは面白くありませんので、ここはラズパイのUSBポートにSDカードリーダを差し込んでバックアップする方法にこだわりたいところです。

調べてみると、X-WindowsでSD Card Copierというのがありました。

https://www.raspberrypi.org/blog/another-update-raspbian/

しかし、できることならワンラインコマンドで対応したいので、もう少し調べてみたところ、rpi-cloneというツール(script)があるようです。

全体のアイデアはこちらから

BackupPi: Raspberry Pi のバックアップとリストアを Raspberry Pi 自身で行う方法
http://qiita.com/UedaTakeyuki/items/4a78c38b3070e8ef57e5

今回は、apt-getではなくgitでファイルを落としてからディレクトリに移動させる方法でした。
https://github.com/billw2/rpi-clone

こちらを参考にしました。

Raspberry PiでIoTなシステム開発:SDカードのバックアップはrpi-cloneでやろう
http://www.homu.net/raspberry-pi%E3%81%A7iot%E3%81%AA%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%8B%E7%99%BA%EF%BC%9Asd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AFrpi/

一回目はうまくいかなかったのですが、二回目はうまくいきました。
おそらく、カードを強く押し込んでいなかったため接触不良があったのでしょう。

Linuxのデバイスはドライブではなくデバイス名でしか出てこないので、同じメディアを繋いだ場合には、どちらかを峻別する必要があります。他方、デバイスに係らず入出力が統一的に扱えるという利便性もあります。

pi@raspberrypi:~ $ sudo fdisk -l

これで、以下のディスクが認識されます。

Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 137215 129024 63M c W95 FAT32 (LBA)
/dev/mmcblk0p2 137216 30253055 30115840 14.4G 83 Linux

Disk /dev/sda: 14.4 GiB, 15489564672 bytes, 30253056 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: 0x00000000

Device Boot Start End Sectors Size Id Type
/dev/sda1 8192 30253055 30244864 14.4G c W95 FAT32 (LBA)

これをみて、SDA1をコピー先にすればよいのかと思ったのですが、下記のように叱られました。

pi@raspberrypi:/usr/local/bin/rpi-clone $ sudo ./rpi-clone sda1 -f

Destination disk 'sda1' does not exist.
Plug the destination SD card into a card reader connected to a
USB port. If it does not show up as 'sda1', then do a
'cat /proc/partitions' to see where it might be.

そこでパーティションが区切られているところを確かめ。

pi@raspberrypi:/usr/local/bin/rpi-clone $ cat /proc/partitions

major minor #blocks name

1 0 4096 ram0
1 1 4096 ram1
1 2 4096 ram2
1 3 4096 ram3
1 4 4096 ram4
1 5 4096 ram5
1 6 4096 ram6
1 7 4096 ram7
1 8 4096 ram8
1 9 4096 ram9
1 10 4096 ram10
1 11 4096 ram11
1 12 4096 ram12
1 13 4096 ram13
1 14 4096 ram14
1 15 4096 ram15
179 0 15126528 mmcblk0
179 1 64512 mmcblk0p1
179 2 15057920 mmcblk0p2
8 0 15126528 sda ← これがUSBに挿したSDカード

どうやらsdaのようです。

pi@raspberrypi:/usr/local/bin/rpi-clone $ sudo ./rpi-clone sda -f

-fオプションは強制的に上書きクローニングします。

Forcing a partition initialization of destination disk sda
The existing destination disk 'sda' partitions are:
Disk /dev/sda: 15490MB
Partition Table: msdos

Number Start End Size Type File system Flags
1 4.19MB 15490MB 15485MB primary fat32 lba

*** All data on destination disk sda will be overwritten! ***

Do you want to initialize the destination disk /dev/sda? (yes/no): y

Number Start End Size Type File system Flags
1 4.19MB 70.3MB 66.1MB primary fat16 lba
2 70.3MB 15490MB 15419MB primary ext4

Your booted /dev/mmcblk0p2 rootfs existing label:
You may enter a label for the destination rootfs /dev/sda2: ←ここで一旦待ちが入りますが、しばらく黙ってリターン

======== Clone Summary ========
Clone mode : rsync all files to sda root file system
Clone destination disk : sda
Clone destination rootfs : /dev/sda2 (no label) on /mnt/clone
Clone destination bootfs : /dev/sda1 on /mnt/clone/boot
Verbose mode : off
===============================
Final check, is it Ok to proceed with the clone (yes/no)?: y
=> Mounting /dev/sda2 (no label) on /mnt/clone
=> Mounting /dev/sda1 on /mnt/clone/boot
===============================
Starting the filesystem rsync to sda
(This may take several minutes)...

※ここで一旦画面が止まったようになりますが、USBの方にLEDなどが付いていれば、クローニングしている間は点滅していますから、進行していることが分かります。

終わると次のメッセージが。

*** Done with clone to /dev/sda ***
Started: 16:39:18 Finished: 17:02:52 ←結構時間がかかっています

Hit Enter when ready to unmount the /dev/sda partitions... ← 終わるとこれがでるのでリターン

unmounting /mnt/clone/boot
unmounting /mnt/clone
===============================

クローンの作業は20分以上かかりました。
念のため、パーティションを確かめます。

pi@raspberrypi:~ $ cat /proc/partitions

major minor #blocks name

1 0 4096 ram0
1 1 4096 ram1
1 2 4096 ram2
1 3 4096 ram3
1 4 4096 ram4
1 5 4096 ram5
1 6 4096 ram6
1 7 4096 ram7
1 8 4096 ram8
1 9 4096 ram9
1 10 4096 ram10
1 11 4096 ram11
1 12 4096 ram12
1 13 4096 ram13
1 14 4096 ram14
1 15 4096 ram15
179 0 15126528 mmcblk0
179 1 64512 mmcblk0p1
179 2 15057920 mmcblk0p2
8 0 15126528 sda
8 1 64512 sda1
8 2 15057920 sda2

179(SDスロット)の3つのパーティションが、USB#8のパーティションにクローンされました。容量が同じです。

最後に、いったん電源を切って、クローンのSDカードをUSBスロットに入れてリブート。
問題なくリブートができました。


Linux化計画(9)–VNC接続

VNC(Virtual Network Computing)を使う

VNCは、ラズパイのGUIの画面イメージをWindows側に見せながら、あたかもVDIのようにWindows側でラズパイを使えます。

こちらを参考にしました。
いろいろ調べた結果、TightVNCがサーバ側に入っているのに対応して、クライアント側もTightVNCにしました。

http://www.tightvnc.com/

Javaバージョンがあるので、クライアント側は1Mもありませんが、Windows版もあります。どうやらサーバ対応とクライアント側は同じパッケージになっているようなので、Java版を使います。

まずはサーバとしてのラズパイ側の設定です。

TightVNCをインストールします。

pi@raspberrypi:~ $ sudo apt-get install tightvncserver

うにょうにょと画面が変わっていき、サーバがインストールされます。

次にサーバを立ち上げます。アクセス用のパスワードが求められますが、8桁が上限のようですね。

pi@raspberrypi:~ $ tightvncserver

You will require a password to access your desktops.

Password:
Warning: password truncated to the length of 8.
Verify:
Would you like to enter a view-only password (y/n)? n

New 'X' desktop is raspberrypi:1 ← ※この1という数字は重要です。

Creating default startup script /home/pi/.vnc/xstartup
Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/raspberrypi:1.log

そして先ほどの1に対して、画面の大きさと色を設定します。

pi@raspberrypi:~ $ vncserver :1 -geometry 1024x728 -depth 24
A VNC server is already running as :1

これでサーバ側の準備は終わりです。
以上はこちらを参考にしました。

"Diary" インターネットさんへの恩返し
【ラズパイ】VNCサーバ(tightvnc) on Raspberry pi セットアップ手順
http://azwoo.hatenablog.com/entry/2014/01/20/232545

次は、クライアント側です。冒頭に書いたようにクライアント側もJava VMで動くTightVNCを使います。
起動すると、IPアドレスと、ポートが尋ねられます。
IPアドレスはラズパイのもの、ポートは、5900に先ほどのディスプレイ番号を加えた5901を指定します。
最初はこれが分からず、5900でやっていたらアクセスができませんでしたが、ポート番号を合わせたらあっという間にアクセスできて、VNCのデスクトップが起動しました。

ポート関連はこちらを参考にしました。

Raspberry Pi で TightVNC サーバ
https://raspberrypi.akaneiro.jp/archives/455

その他、以下を参考にしました。

DIY環境
とにかく便利!Raspberry Pi をWindowsから利用するVNCの簡単インストール
http://www.denshi.club/pc/raspi/raspberry-pi-windowsvnc.html

Windowsの場合

Windows10のRemote Desktop接続を使ってIPアドレス経由でRPに接続する方法。
RP側に、xrdpをインストールするだけのようです。
RDPはwindowsに標準で備わっているそうです(調べてないけど)。
RDPは、サーバ側の画面を奪い取るイメージで、VNCはサーバの画面を覗くイメージらしい。つまりVNCの画面はあくまでもラズパイ側にあって、VNCサーバが画面をPC側に送っているということですが、RDPは画面を作るところからPC側に送っているとのこと。なんとなくわかったようなわからないような。

アシマネくんのほんわか日記
Raspberry Piで遊ぼう [No.26:リモートデスクトップ接続をやってみよう]
http://assimane.blog.so-net.ne.jp/2013-05-12

怪しい物を開発するブログ
Raspberry Pi 3にリモートデスクトップで接続する手順
https://blog.supersonico.info/?p=2360

uepon日々の備忘録
RaspberryPiでWindowsからリモートデスクトップ接続を行う
http://uepon.hatenadiary.com/entry/2016/04/29/111028


Linux化計画(8)–時計の設定NICT

今日は一週間ぶりにラズパイに触ります。

実は今週は気も早く、GPIOとブレッドボードを繋ぐケーブルや、コンポジット端子とアナログTVを繋ぐケーブルなどを購入してきました。いけません。

前回、時計の設定を小金井市のNICTのサーバにしましたので、今日は起動したら時計があっているかどうかを確かめる必要があります。が、時刻は相変わらずRaspbian Jessieのリリース日と思われる日を指したままです。

うーむ。設定を間違えたかな。nanoで/etc/ntp.confを開いてみようとしても開きません。先週はうまくいったのに。
あ、そうか。ターミナルソフトを使わないといけないのだった。もう忘れています。

TeraTermを起動して再度nanoを使って設定を見ますが、特に間違いはなさそうです。

ntpq -p

でみると、サーバは認識しているようですが、同期されていません。

ひとまずこちらのサイトを参考に、設定をntpdからchronyに変更してみました。

どうでもいい日記帳
2012-09-29 Raspbianのマイクロサーバー化
http://d.hatena.ne.jp/akihirom/20120929

まずは、NTPDを停止削除してChronyをインストール

$ sudo apt-get remove ntp
$ sudo apt-get install chrony

次にChronyの設定/etc/chrony/chrony.confをnanoで変更。

デフォルトdebianのNTPサーバをオフにしてNICTサーバに変更

#server 0.debian.pool.ntp.org offline minpoll 8
#server 1.debian.pool.ntp.org offline minpoll 8
#server 2.debian.pool.ntp.org offline minpoll 8
#server 3.debian.pool.ntp.org offline minpoll 8
server ntp.jst.mfeed.ad.jp # mfeedの公開NTP ← これは入れなかった
server ntp.nict.jp # NICTのJST
server ntp.ring.gr.jp # RINGプロジェクトの公開NTP
server 1.jp.pool.ntp.org # 世界規模のNTPサーバのプールを行うNTP server poolの国内サーバエイリアスその2

そして、リアルタイムクロックRTCがないRPは再起動すると時計が大きくずれてNTPクライアントが動作停止するそうですので、起動時に時計を設定するように変更。

$ sudo apt-get install ntpdate
$ sudoedit /etc/rc.local

sudo ntpdate jp.pool.ntp.org # 起動時実行されるスクリプト追記
※後で気が付いたのですがsudoを忘れると機能しません。

これで、もう一度、sudo reboot してみましたが、うまくいきません。

時計の時刻をいまの時刻に設定します。
sudo date 0121124517 ← 1月21日12時45分2017年という意味です。

再起動したら、とりあえず時計の時刻は今日を示しています。

pi@raspberrypi:~ $ chronyc sources
210 Number of sources = 3
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-a3.nict.go.jp 1 6 177 46 -17ms[ -19ms] +/- 36ms
^? ntp1.hpcc.jp 0 7 0 10y +0ns[ +0ns] +/- 0ns
^? ipv4-2.biergaizi.com 3 6 177 46 +1092us[+1092us] +/- 60ms

こちらも参考にしました。

屋根裏Linux
09 Raspberry Piの時間合わせ(chrony導入)
http://wings2fly.jp/yaneura/raspberry-pi-clock-setting-by-chrony/

結局、日付をいったん今日の日付にdateコマンドで変更した上で、一連の処理をすれば、chronyに変更しなくてもntpdでもよかったのかもしれません。
ふぅ~疲れた。ここまで半日を要しました。


Linux化計画(7)–日本語化

今日は日本語化計画の実行です。おっと、その前に初期設定がありますね。

教科書通り、 sudo raspi-config
と打っても、terminal unknownという冷たいメッセージが。(´・ω・`)

sshはwindowsのコマンドプロンプトcmd.exeで打っているので、raspi-configのように画面で処理をしながら入力させる系統のGUIソフトは使えないようですね。つまりGUIが使える端末ソフトが必要みたいです。これに気が付くまでに半日を要しました。
知らないというのはこういうものです。

調べてみると、PuttyとTeraTermというのが日本では広く使われているみたい。TeraTermって昔パソコン通信やっているときに使ったことがありますが、まだ使われているんですね。海外のソフトは日本語の問題が出てくるので、Tera Termを使ってみることに。

https://ja.osdn.net/projects/ttssh2/

こちらからダウンロードしました。

さすが伝統あるソフトですね。軽くインストールできて、一発でRPに入ることができました。
sudo raspi-config
もできてセットアップ画面が出てきたので、ロケールの設定を中心に変更。但し文字化けリスクがあるので、デフォルト言語は変更せずリブート。
そのあと、日本語フォント、IME、ターミナル(RP側)を順次インストールします。

sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
sudo apt-get install uim uim-anthy
sudo apt-get install jfbterm

日本語を入れるとかえって文字化けなどの問題が出てきて面倒なので日本語化はしないほうがいいという考えもありますが、ここは勉強の意味もあるので、いったんは日本語化します。

余談ですが、時計があっていませんでした。Jessieの日付の翌日なので、おそらくはインストールした時のバージョンの日付からのカウントなのでしょうか。よくよく考えてみると電源が落ちるので時計は狂って当たり前ですが、調整する機能がついていないはずはありません。調べます。

それなりに奥が深そうでした。

timedatectl

というコマンドがありました。

こちらを参考にしました。

Akira's Tech Notes
[まとめ]Linuxシステム時刻について
http://luozengbin.github.io/blog/2015-06-27-%5B%E3%81%BE%E3%81%A8%E3%82%81%5Dlinux%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%99%82%E5%88%BB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html

しかし日本の標準時は、お隣の小金井市にあるNICTで作られています。つまり最も正確な時計がすぐそばにあるわけですから、そこのサーバを使いたいので、設定を変えます。

pi@raspberrypi:~ $ sudo nano ntp.conf ←新しいファイルが開いたので失敗
pi@raspberrypi:~ $ sudo nano /etc/ntp.conf
pi@raspberrypi:~ $ sudo service ntp restart

初めてパラメータファイルをコマンドラインエディタnanoで触りました。
こちらを参考にしました。

Rabby
Tipsその2:テキストファイルの編集方法
http://rabyy.com/tips/t0002/

設定その6:時計の設定
http://rabyy.com/raspbian/0006/

Raspi-Linux ガジェットベース
RaspberryPi2の時刻を合わせる
http://raspi.webcute.net/2015/07/post-646/


Linux化計画(6)–ヘッドレスでワイヤレス接続

準備万端整えて、さっそくルータとRPをLANケーブルでつなぎRPの電源を入れました。

arp -a

でIPアドレスを探しますがよくわかりません。これはいろいろなサイトにわからないと書いてあったのでそういうものかと思いますが、適当に

ssh pi@192.xxx.xxx.xxx

を入れてみました。
途中、Yes/Noを聞かれたのでYesと入れるとパスワードを求められ、をを、これでうまくいったと思いきや、unknown errorでアクセスできません。
IPアドレスが間違っているのか、それとも別の問題なのか切り分けが付かない状態に陥ってしまいました。
(後でわかったことは、プリンタにアクセスしていたのでした・・・)

sshがRP側で起動していないのかもしれません。SDカードを外して中を見るとsshが消えていました。これは仕様通りですので、何等か動いていそうです。
もう一度サイトを眺めてみたら、初期設定は起動に時間がかかるということなので、最初のSDカードの焼き付けからやり直すことにしました。とほほ。でも、こういう失敗の繰り返しが後々のトラブルシューティングの際の問題切り分けに役立つのです。

YouTubeに載っていた方法も試しましたが、だめでした。

ping -4 raspberrypi.local

そもそもarpでIPアドレスを探すことが難しいとネットに載っていたのですが、よくよく考えると物理アドレスという記述があり、これはMACのことではないかと想像して、アドレスを調べてみたところ、

MACアドレス検索
https://mac.uic.jp/

RPのアドレスがあることが分かりました!つまり、物理アドレスにRPのアドレス(最初の3項6桁)が見えれば、それが自分のPiを示しているので、そこに割り当てられているIPアドレスにsshで入っていけばいいのです。
この気づきはとても役立ちました。
ついでに、他のデバイスのMACも調べておいたら、NECとか富士通とかEPSONとか繋がっているデバイスのメーカーがいろいろと分かりました。確かにインタネットでは「誰が」が分からなくても「どのデバイス」はすぐに分かるというのは本当ですね。

さらにいろいろ調べているうちに、最終的にここに行きつきました。

[Raspbian - "Connection refused" when using ssh](https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=169365&p=1087799&hilit=headless&sid=d90b6390fe0a34e0455fa584c5486e26#p1087799)

ここにはWiFIへ直接接続する方法が掲載されていました。

Create a new text file called wpa_supplicant.conf (again, make sure it does not have a .txt file extension). Put the following info in that file:

Code: Select all
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US ← JPに置き換え

network={
ssid="your-network-service-set-identifier" ← ルーターのSSDIに置き換え
psk="your-network-WPA/WPA2-security-passphrase" ← ルーターのパスワードに置き換え
key_mgmt=WPA-PSK
}

Edit country=, ssid= and psk= with your info and save the file.

Now with both the "ssh" and "wpa_supplicant.conf" files in the SD card's /boot partition you can boot the Pi headless (and wireless) and SSH in from another computer on your network.

再度、sshの空ファイルと、wpa_supplicant.confを含めたSDカードを焼き直して、起動に挑戦。
コマンドプロンプトからarpを打ってみたら、をを、ラズベリ財団のMACがある!!

IPアドレスを指定してsshして、解説通り、pi@192.xxx.xxx.xxxを入れると、「アクセスしますか?」の英語メッセージが!
もちろんYesを選択してEnterすると、あっという間にRPの$プロンプトが登場。

ここに至るまで、朝から夕方まで丸一日を要してしまいましたが、最終的にはRP3にアクセスできたので充実感のある一日でした。

最後に、シャットダウンできるというのは全部がきれいに終わったということですね。

sudo shutdown -h now