気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
Server

Raspberry Pi用OSの準備

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Raspberry Piって?

Raspberry Pi用OSの準備

Raspberry Pi用OSの準備

2016/04/21

 ここまでで本体をRaspberry Pi 2 モデルB、起動用メディアをmicroSDカード、システムパーティション用メディアをUSBメモリに決め、購入済みということで続いてOSの選定とメディアへの書き込み作業です。

 Raspberry Pi(ラズベリーパイ・ラズパイ・RPi...)を含むARMアーキテクチャに対応するOS・ディストロも結構多く、標準のRaspbian(Debianベース)、準標準のPidora(Fedoraベース)、Arch Linux ARM、FreeBSD ARM、ARM用Ubuntuの他、NetBSD/evbarmやWindows 10 IoTなどもあります。

 また、Raspberry Piには、各種標準OSをインストールできる標準インストーラとしてNOOBSというものも用意されています。

 NOOBSのようなインストーラを使う場合、家庭用液晶テレビを含むHDMI対応ディスプレイ、HDMIケーブル、キーボード・マウス(何れもRaspberry Pi 2 Model B/ZeroまでならUSB、Raspberry Pi 3 Model BならBluetoothも可)を用意し、電源を入れたらインストールを始め、完了したら再起動という手順になります。

 ただ、一時的に使えるこれらのものを一通り持っているとか、常用するために持っておきたいとか、それはそれで他で使うから。。。というのならまだしも、そうでない場合には、一時的な作業の為だけにこれらを用意しなくてはならないことになります。

 もし、それを回避したいなら、フリーで配布されているインストール済みOSイメージ(.imgなど)かtarball(.tar.gzなど)をダウンロード、microSDカード(一部初期のRPiではSDカードの場合もあり)や必要ならUSBメモリと併用してOSイメージならイメージを書き込むか、フォーマットの上、rsyncでコピー、tarballならフォーマットの上、展開し、RPiをLANにつないで電源を入れ、OSを起動、同一LAN上にあるPCなどから比較的安全に通信を行なうことができるSSH接続することでPCのモニタやキーボード・マウスを使ってRaspberry Piにログインして遠隔操作するという方法をとることもできます。

OSの選択

 今回は、DebianベースのRaspbian Jessieを使わせて頂くことにします。

 ただ、サーバ構成は、できる限り最小に抑えようと思うのでLXDEがインストール済みで展開後には3.5GBもある標準は使わず、(それでも大きいですが)展開後1.3GBほどのRaspbian Jessie Liteにします。

インストール済みOSイメージを使う

 よってNOOBSなどのインストーラ、また、Raspbianのtarballがあるのか未確認も先にイメージファイルを見つけたのでtarballも使わず、インストール済みOSイメージを使う方法について述べます。

キーボード・マウス・モニタはSSH接続で作業用PCのものを使う

 OSインストール済みイメージを使うので、ここでは、起動したRPiのOSにSSH接続するものとし、キーボード・マウス・モニタは作業用PCのものを使うものとします。

microSDはブート専用・USBメモリにシステムパーティション

 ラズパイのRaspbianなどのOSにおいて標準的なシナリオの場合、microSDカードにブート及びシステムパーティションを書き込みますが、ここでは、microSDカードにブートパーティションを、USBメモリにシステムパーティションをおき、microSDからUSBメモリを呼び出してOSを起動(、同一LAN上のPCからSSH接続)する方法について述べます。

 ちなみにシステムパーティションは、USBメモリばかりでなく、外付けHDDやSambaやNFS共有などにおくことも可能です。

 今回、microSDカードはTranscend 4GB(2GBは予備)にしたので、これに起動パーティションを書き込みます。

 USBメモリは、Silicon Power Ultima U02 32GB、これにシステムパーティションを書き込みます。

焼かずにrsyncでコピー(ddコマンドやグラフィカルツールは使わない)

 更にラズベリーパイ用のRaspbianなどにおける標準的な手順では、OSイメージをグラフィカルな専用ソフトウェアやddコマンドなどで書き込むところでしょうが、ここでは、それぞれ、fdiskでパーティションを生成、mkfsで適切なファイルシステムを設定、OSイメージをループバックマウントしてあらかじめフォーマットしておいたmicroSD、USBメモリそれぞれに適切なオプション付きのrsyncコマンドを使って全てのファイルをコピーする方法をとります。(と言ってもこの場合、microSDに入れるブート関連ファイル群の方は単にcp -rでもよいでしょうが。)

 レアなもの含め、いろんな可能性を書き出すのもナンセンスなのでやめますが、9割がた成り行きで必要性があったわけではないものの、結果的には、なにかとスマートかも?

 ただ、もし、仮にもこの方法を実行するなら、何かあってもまっさらなメディアへのまるごとコピーなので消えちゃったとか、壊れちゃったとかいうことはないにしても、やり直すとなった場合には、手間は増えるので、少なくともrsyncコマンドの各オプションが何を意味するのか、コピー元にディレクトリを指定する場合、末尾のスラッシュの有無でコピー元のディレクトリそのものを含むか否かの結果が変わることなどを理解して、更に他に必要なオプションはないかなど十分に確認の上、納得した上で、つまり、自己責任でお願いします。

(その後も正常に機能しているように見えるので大丈夫だとは思いますが、今更ながらハードリンク保持オプションとかも必要だったのかな?とか思わなくもありませんし、やっぱり、ddなどのツールを使ってイメージをそのまま書き込むのが一番安心・確実なことにかわりはありません。)

 ちなみにrsyncは、遠隔コピーする際には、相手方のホストにもrsyncがインストールされている必要がありますが、今回は、作業用PCにマウントしてローカルで行なう(≒自ホストには当然rsyncは入っている前提である)為、これに該当しません。

microSDカードの編集

100円ショップCandoで買った多目的カードリーダー・ライター

 microSDカードの編集は、当初、SDポートのある作業用PCに購入したmicroSDカードに付属のSDカードアダプタを介して行なうことを想定していました。

 が、前述した通り、ざっくり言うとPCポートやSDカードアダプタのいずれか、または両方に起因するようで急遽100円ショップで(USBに変換・USB機器として使える)カードリーダー・ライターを購入、SDアダプタを介すとやはりダメでしたが、リーダー・ライターにmicroSDを挿してUSB接続したら正常に認識され、編集することができるようになりました。

fdisk/mkfsによるmicroSDとUSBメモリのフォーマットとrsyncによるコピー

 ここまでの想定に基づく場合、以下の手順でmicroSD及びUSBメモリにOSイメージをセットします。

【下準備】

 尚、以下の作業は、microSD及びUSBメモリの初期化を伴い、仮に中身が入ったもを使用すると全て消失する為、必要なデータが入っている場合には、予め別のメディアなどに退避しておく必要があります。

 また、同様の理由で初期化するメディアを他のもの(HDD・SSDや他のUSBメモリなど)と間違えるとそれらのデータが全て消失してしまい、基本的には取り返しがつかない事態になるので念には念を入れて十二分に確認の上、行なう必要があります。

【microSDカード】
  1. 作業用PCにmicroSDをポートやカードリーダー・ライターを介すなどして接続
  2. 当該microSDに割り当てられたデバイスをUSBなら
    dmesg | grep sd?*
    などとして確認
  3. fdisk /dev/...(2で確認したデバイス)
    として、[o],[n]を続けて選択、パーティションはデフォルトのp/primary、続いて同じくデフォルトの1、サイズは、【下準備】で確認した.img1のサイズとしてパーティションを作成、[t]として[c W95/FAT32(LBA)]を選択し、[w]で保存終了
  4. mkfs.vfat -v -c -F 32 /dev/...(2で確認したデバイス)
    などとしてファイルシステムをFAT32としてフォーマット
  5. 必要に応じて
    mkdir /mnt/img1 /mnt/sdcard
    などとしてマウントポイントを作成
  6. mount -t vfat /dev/...(2で確認したデバイス) /mnt/sdcard
    などとしてmicroSDカードをマウント
  7. mount -t vfat -o loop,offset=$((xxx*yyy)) 【下準備】でダウンロードしたイメージファイルパス /mnt/img1
    などとして【下準備】で確認したOSイメージの[Sector size (logical/physical):]の値を[xxx]、.img1の[Start]位置を[yyy]としてOSイメージの第1パーティションをマウント
  8. rsync -n -e ssh -av --progress /mnt/img1/ /mnt/sdcard
    などとして実行内容を確認
  9. 期待通りなら確認用で実際には何もしない-n(--dry-run)オプションを外してrsyncを実行

 8については、今回は、microSDは、ブートパーティションだけ、特殊な設定やファイルはないと思われるのでrsyncを使うまでもなく、cp -rでもいけると思います。

 ちなみに自身の作業においては、Linux上で無意識にmount -t msdos ...とやってしまったのですが、それでもいけました。

【USBメモリ】
  1. 作業用PCにUSBメモリを接続
  2. 当該USBメモリに割り当てられたデバイスを
    dmesg | grep sd?*
    などとして確認
  3. fdisk /dev/...(2で確認したデバイス)
    として、[o],[n]を続けて選択、パーティションはデフォルトのp/primary、続いて同じくデフォルトの1、サイズは、特に理由がなければ、USBメモリ全容量、[t]として[83 Linux]を選択し、[w]で保存終了
  4. mkfs -t ext4 /dev/...(2で確認したデバイス)
    などとしてファイルシステムをext4としてフォーマット
  5. 必要に応じて
    mkdir /mnt/img2 /mnt/usb
    などとしてマウントポイントを作成
  6. mount -t ext4 /dev/...(2で確認したデバイス) /mnt/usb
    などとしてUSBメモリをマウント
  7. mount -t ext4 -o loop,offset=$((xxx*yyy)) 【下準備】でダウンロードしたイメージファイルパス /mnt/img2
    などとして【下準備】で確認したOSイメージの[Sector size (logical/physical):]の値を[xxx]、.img2の[Start]位置を[yyy]としてOSイメージの第2パーティションをマウント
  8. rsync -n -e ssh -av --progress /mnt/img2/ /mnt/usb
    などとして実行内容を確認
  9. 期待通りなら確認用で実際には何もしない-n(--dry-run)オプションを外してrsyncを実行

 尚、mkfsコマンドにおいて-tオプションでext系などを指定した場合、スワップ領域も作成されます。

microSD内のcmdline.txtを編集

 続いて起動設定。

 前述のようにRPi(ARMアーキテクチャ)の場合、起動設定は、microSDの1つめのFATパーティションにある/bootの下にあるcmdline.txt(/mnt/sdcard/boot/cmdline.txt)に書かれることになっています。

 既にcmdline.txtファイルは存在し、起動するパーティションが、microSDの2つめのパーティションにあたる位置として標準的なイメージを書き込んだ場合のデバイス名/dev/mmcblk0p2が記述されているかと思いますが、今回は、システムパーティションはUSBメモリにあり、Linux(Raspbian)においては、SCSI機器やこれに相当するとみなされるUSB機器が他になければ、1つめである/dev/sda、更に今回は、イメージを書き込まずに、先の手順通りなら、お行儀良く?フォーマットしてUSBメモリ全体を1つのパーティションとしたので/dev/sda1に変更する必要があります。(今回の手順ではなく、広く行なわれているであろうイメージを書き込む普通の手順でやってブート関連ファイルがあったはずの空の/dev/sda1が残ったままだと、ここは/dev/sda2になります。)

USBメモリ内の/etc/fstabを編集

 次にUSBメモリにあるシステムパーティションの/etc/fstab(/mnt/usb/etc/fstab)には、microSDにブート及びシステムパーティションのイメージをまるごと書き込んだ場合の/dev/mmcblk0p2の行があるのでこの行の先頭に#を付加してコメントアウトするなりし(、気になるなら当該行をコピーするなどして/dev/sda1として追記、有効にしておくなりし)ます。

 最初に読み込まれるのはルートパーティションであり、ブートパーティション(今回はmicroSD)からは(今回USBメモリ上の)/dev/sda1として呼ばれており、このデバイスについては、他のUSB機器との兼ね合いでデバイス名が変わってしまうということはないはずなので/dev/mmcblk0p2の行のコメントアウトも/dev/sda1の追記もしなくてもよいのでしょうが、やっておいた方が気分的には落ち着くかなと。

アンマウント

 作業が完了したら各マウントポイントをアンマウント。

  1. umount /mnt/img1
  2. umount /mnt/img2
  3. umount /mnt/sdcard
  4. umount /mnt/usb

Raspberry Piを起動・SSH接続

 これでRaspberry Piの電源を入れると起動するはずです。
(電源ON直後、すぐにUSBメモリのアクセスランプが点滅し始めるはず、USB電圧&電流チェッカーがあってこれを介してつないであれば、電流値の変化が目安になり、安定してきたあたりがSSH接続に適した頃合いです。)

 ちなみに今回、element14製を購入、RS製だと緑と赤のLEDがあるようですが、少なくとも手元のelement14製Raspberry Pi 2 モデルBのLEDは赤のみで電源を入れた後は、常時点灯、最初、赤ランプのみで、あれ?と思いましたが、正常に起動し、SSH接続もでき、安定稼働しています。

 しばらく経ったら、nmapコマンドで同じネットワークドメイン上にあるはずの有効なIPとホストなどの情報を得るか、ルータ・モデムの管理画面(普通ブラウザで192.168.0.1などとしてアクセス)でIPやホスト名を確認してみるとか、台数が少ないなら思い当たるIPアドレスにpingを投げてみるなどの方法でRaspberry PiのIPがわかったら、それを使ってSSH接続します。

 Raspbianのデフォルトのアカウントは[pi]、パスワードは[raspberry]、ちなみにホスト名は[raspberrypi]です。

  1. ssh pi@RPiのIPアドレス

 SSH接続から抜けるには、[exit]とします。

 起動確認ができたら、次は、初期設定や自身の要件に合わせた必要なパッケージ類のインストールやデーモンの起動・停止などRaspbian上での作業です。