Day24 Raspberry Pi専用カメラモジュールを使う

Raspberry Pi専用カメラモジュールを使って写真撮影を試みた。

#Raspberry Piのカメラを有効化する
sudo raspi-config

設定が終わると再起動される。

静止画の撮影にはデフォルトでインストールされているraspistillコマンドを使用する。

#撮影
raspistill -o image.jpg

CUIで画像を表示させるには、
fbiかimg2txtというアプリケーションを使用すれば良いが、ssh接続ではどちらもうまく行かない。手元にダウンロードしてしまうのがよいだろう。

#ログアウト
exit

#ダウンロード
scp  -P xxxxx    pi@192.168.11.7:/home/pi/image.jpg ./image.jpg

#画像表示
open image.jpg


ピントを合わせるのに一苦労だった。どうやってこのカメラモジュールを使いこなすかは、今後の課題だ。

林和孝『Raspberry Piで遊ぼう』ラトルズ 2014

OSとはハードウェアの抽象化を行うプログラムのことである

OSの本質を考える上で、抽象化という概念をイメージすると理解しやすいように思う。

抽象化とは、内部のことをとやかく言わないで、外界とのインターフェースを通じて対称とやりとりをする仕組みをつくることと言える。


数学の関数もこれとまったく同じ構造といえる。

この数式は、xに具体的な値を入力すると、関数が実装している具体的な手続きにもとづいて(この手続きは遮蔽されていてもよい)、yが出力されてくるということを意味している。

コンピュータシステムにおいても、抽象化の概念は大変重要だ。
Operating Systemはハードディスクなどのハードウェアとアプリケーションソフトウェアとの間に入って、ハードウェアを仮想化している。
このようにOSがハードウェアを抽象化することのメリットは、ハードウェアに対しての具体的な操作をOSが一手に引き受けることで、アプリケーションは共通のシステム・コールという入力を使用すればよくなるからである。OSが無い場合のことを考える。
OSが無い場合、アプリケーションがハードウェアを利用する場合、ハードウェアを使用するための方法を具体的に実装する必要が出てくる。先ほどのようにハードウェアとの間にOSが存在し、共通の規格であるシステム・コールを発行しさせえすればよかったのとは大違いである。

この話を発展させると、「インターフェースがあるところには抽象化がある」と言えるのではないだろうか。なにもOSだけの話ではない。流通システムを例にとると、お店(小売業者)にとって、流通システムとは生産者との間のインターフェースであり、各地に点在する生産者からダイレクトに買い付けるよりも問屋に注文した方が、細かい連絡や事務手続きが省けて、かつ大量注文が可能である。しかし、そのかわり流通システムを介すると、そこでお金が発生する。それは当然の事である。

OSも流通業者と考えれば、コストが発生するのは当たり前である。この場合のコストとは、お金ではなく、CPUへの負荷である。OSが細かいハードウェアの制御を一手に引き受けてくれるので、OS自体がCPUに負荷をかけることは避けられないのである。エアコンなどの家電製品に組み込まれるプログラムは、組み込みプログラムといってOSを利用せず、直接ハードウェアを制御していることが多い。この利点は、OSを動かすコストを回避できる点にある。OSを使用するかしないかは利用できる資源によってケースバイケースと言える。


以上をまとめると、OSはハードウェアとアプリケーションの位置して、ハードウェアを抽象化する。そして、アプリケーションに共通の規格であるシステムを提供する事で、アプリケーションがハードウェアを容易に制御できるようにするプログラムのことをいうのである。

(注)図中の矢印は一方行であったが、逆方向のやり取りがあってもかまわない。

Day23 ルータのポート解放を行い、サーバーを外部に公開(びびりなのですぐにポートを閉じたが。。)

WAN側から特定のポートでアクセスがあったとき、LAN側の特定のIPアドレスにつなぐようにルータの設定をすることができる。
私のbuffalo airstationでは以下の通りである。



普段、raspberry piをインターネットに接続させず、家の中のLANだけで遊んでいるときは以下の様な環境になっている。ルーターも含めて、LAN内のすべてのデバイスにはプライベートIPアドレス(192.168.11で始まる番号)が割り当てられている。


WANとLANの関係を考慮すると以下のようになる。ルーターがプライベートとグローバルのIPアドレスを同時に持っていて、LANとWANの仲立ちをしていることに注意。



ssh用にポートを解放してssh接続したときのイメージ図。手元にあるiphoneなどのスマートフォンで4G回線などの外部回線で外から、raspberry piにアクセスする時のイメージ。

ルーターはポート番号ごとにアクセスの制限をかけていることを認識する事が一番大事である。


【参考文献】
画像は以下のサイトから頂いた。
素材のデータベース
Digipot



Day22 SSHの公開鍵認証設定の続き

Day21では、鍵の作成をMacでおこなってハマってしまった。そこで見方を変えて、Raspberry Piで鍵を作成して、秘密鍵をMacに渡すという方針を取った。

#piにて
#鍵作成
ssh-keygen -t rsa

これで、~/.ssh/以下に、公開鍵(id_rsa.pub)と秘密鍵(id_rsa)が追加される。
#まずは、公開鍵の内容を~/.ssh/authorized_keysに追記
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#追記が終われば公開鍵は消去してよい
rm ~/.ssh/id_rsa.pub

#次に、~/.sshのディレクトリに対するアクセス権を700、~/.ssh/authorized_keysのアクセス権を600に変更する。これにより、他のユーザからはこれらのディレクトリやファイルを閲覧できなくなる。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

最後にMacの~/.ssh/に秘密鍵'(~/.ssh/id_rsa)を移動する。
ログアウトしてMacに戻ってから、

#-Pのpを大文字にしないとハマる

#Macのホームディレクトリ(~)にサーバー(pi)の~/.ssh/をダウンロード
scp -P hogenumber pi@192.168.11.7:~/.ssh/authorized_keys ~/



あとは、piにログインして、鍵の後始末と、パスワードによるログインを禁止するだけ。
#再度piにログイン
ssh -p hogenumber pi@192.168.11.7

#追記が終われば秘密鍵も消去してよい
rm ~/.ssh/id_rsa

#パスワードによるログインを禁止する
sudo vim /etc/ssh/sshd_config

52 PasswordAuthentication yes
52 PasswordAuthentication no
に変更

#sshサーバを再起動
sudo /etc/init.d_ssh restart


あとは接続のテストだけ。
勿体ぶるようだが、確実に鍵の効果を検証するため、一度~/.ssh/id_rsaをホームディレクトリに入れておいて、エラーになるかを見てみる。デフォルトで~/.sshの鍵を探すようになっているので、この方法をとった。

あらかじめ、鍵のアクセス権は600に変更しておく
sudo chmod 600 ~/id_rsa

#id_rsaを指定せずにログインを試みる
ssh -p hogenumber pi@192.168.11.7
Permission denied (publickey).

それでは、鍵を指定しみる。
ssh -p hogenumber -i ~/id_rsa pi@192.168.11.7

すると、以下のウィンドウが開くので、piで鍵を作成するときに入力したパスワードを入力する。
すると、ログインに成功する。
Last login: Mon Mar 31 08:59:43 2014 from 192.168.11.2

pi@raspberrypi ~ $ 
exit


Macの~/.ssh以下にid_rsaをおいておけば、いちいち指定しなくても自動で読みにいく。そこで、~/id_rsaを~/.ssh/に移動させる。
mv ~/id_rsa ~/.ssh

ログインのテスト


ssh -p hogenumber  pi@192.168.11.7
Last login: Mon Mar 31 08:59:43 2014 from 192.168.11.2

pi@raspberrypi ~ $ 


うまくいった。



iphoneのiOS用SSHクライアントであるpromptからパスワードログインを試みるとはじかれることを確認してみる。


ばっちり。

promptでssh接続したいときは、Macの時と同様、サーバーで鍵を作成し、公開鍵の内容をサーバーの~/.ssh/authorized_keysへ追記、秘密鍵をpromptに登録すればよい。

piで作った秘密鍵をMacに落としておいて、
itunesを開いて、AppsのPromptを選択肢、id_rsaをAddで追加すればよい。
あとは、iphone上でpromptを開いて、ipアドレス、ポート番号、ユーザ名、パスワード(この場合、鍵作成時のパスワード)を入力して、最後に鍵マークをクリックして先ほどアップロードしたファイルを選択すればok。
あとはお好みで、他のパソコンにも鍵を入れておいても良い。
これでサーバーのセキュリティに関しての、一通りの作業は終了した。


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

最後にひとつ議論しておく。
鍵の作成を今回のようにサーバーで行うか、クライアントで行うかというのは実はどちらでもよいそうだ。

以下のサイトが詳しい。
秘密鍵と公開鍵は、サーバー側(ssh接続される側)で作ろうがクライアント側(sshコマンドを打って接続しに行く側)で作ろうが、どっちでもいいそうな。

通常は、クライアントで作成して、サーバーに公開鍵を送信する事が多いようだが、大量に鍵を作成するときは面倒なので、サーバー側で作成して、クライアントに配布するという形式を取る事もあるそうだ。






Day21 sshのルートログインの禁止とSSHの公開鍵認証設定

ここまでの作業
Day19:rootとpiのパスワードを設定
Day20:sshのポート番号の変更

今回は、sshのルートログインの禁止とSSHの公開鍵認証設定を行います。

#####sshのルートログインの禁止#####
sudo vim /etc/ssh/sshd_config

27 PermitRootLogin yes

27 PermitRootLogin no
に変更

#sshサーバの再起動

vim /etc/ssh/sshd_config

これでrootログインはできなくなった。



#####SSHの公開鍵認証設定####

日経Linux『誰でもできる! Raspberry Piで楽しもう』日経BP社 2013のp62 - 66を参考にした。

まずは、手元のMacで鍵を生成する。
kappa$ ssh-keygen -t rsa

デフォルトのままでEnterを2回押すと、~/.ssh/に公開鍵(id_rsa.pub)と秘密鍵(id_rsa)が生成する。
kappa$ ls ~/.ssh

id_rsa      id_rsa.pub  known_hosts


これから、この公開鍵(id_rsa.pub)をサーバーの自分がいつもログインするpiユーザの支配下に送り込み、そして、piの~/.ssh/authorized_keysに公開鍵の内容を追記する。

#サーバーに公開鍵を送信(piユーザーのホームディレクトリ)
kappa$ scp -P hogenumber id_rsa.pub pi@192.168.11.7:~/ 



ここからはRasPiにログインしてからの操作。
#~/.ssh/の作成し、公開鍵を移動させる。
mkdir ~/.ssh
mv ~/id_r~/.ssh/


#公開鍵の内容を追記(authorized_keysファイルがなければ新規作成される)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#####パスワードログインを無くして、いよいよ公開鍵認証のみでログインできる状態にする####
sudo vim /etc/ssh/sshd_config

 51 #PasswordAuthentication yes
 52 PasswordAuthentication no

これでok.
#サーバー再起動
 sudo /etc/init.d/ssh restart
あとは、Macからログインしてみるだけだ!
と思ったらハマった。
以前サーバー構築した時も同様のところでハマったのでピンと来た。
そこで、raspiはモニターにつないでスタンドアロンの環境で以下の作業をして、いろいろ考えてみる事にした。
(続く)