Raspberry Pi をPiDesktopでSSDベースPCにした

Pi Desktopキットとは

2017年9月、Raspberry Pi3をPi Desktopキットを使用してSSDベースのデスクトップPCにしました。

Pi Desktop

Pi Desktop

私は、Pi Desktopキットを Physical Computing Lab で購入しました。

  • 5,980円 … Pi Desktop [Element14-2687142]
  • 6,800円 … Pi Desktop用 SSD 64GB

Physical Computing LabのPi Desktop商品説明によると、以下のような特徴があります。

Pi Desktopは、Raspberry Piで簡単にSSDベースのデスクトップPC環境を作ることができるキットです。

Pi Desktopの主な特徴

  • SSD起動のOSとSSDストレージ
  • 電源スイッチの搭載
  • リアルタイムクロック
  • Piカメラ装着スロット

Raspberry PiをデスクトップPCとして使用するために、いくつかの弱点がありました。

  1.  ストレージは、マイクロSDカードにOSやデータを保存しますが、SDカードの書き換え寿命が気になります。
  2.  電源スイッチが無く、シャットダウンしてHALT状態になっても電源はOFFになりません。
  3.  RTC(Real Time Clock)というハードウェア・クロックが搭載されていないので、ブート直後は前回シャットダウン時の日時になります。

これらの弱点を補うために、いろいろと試してきました。

ストレージ問題は、USBフラッシュメモリを接続しました。取り急ぎ、データストレージのみUSBフラッシュに保存しました。OS全体のUSBフラッシュ化については未着手です。

Raspberry PiにUSBフラッシュメモリを接続

電源スイッチについては、「Pi Supply Switch」により安全に電源OFFにすることができました。

Raspberry Piに Pi Supply Switchを接続

リアルタイムクロックについては、「Raspberry Pi RTC 拡張モジュール DS1307」を接続することにより解決しました。

Raspberry PiにRTC(DS1307)を接続

Pi Desktopキットは、これひとつで弱点を解決できます。

Pi Desktopは、mSATA to USBブリッジを搭載しておりSSDをUSBで接続します。Raspberry PiのUSBはUSB2.0なのでSSDのアクセス速度は遅くなりますが、Raspberry PiでSSDを使用できるのはうれしいことです。

Pi Desktopを組み立てる

Pi Desktop に簡単な説明書が添付しています。

element14 COMMUNITY サイトのPiDesktop で添付ドキュメントなどを公開しています。

WEBドキュメント

WEBドキュメント

説明書に従って、Pi Desktopを組み立てます。

ドキュメント

ドキュメント

サイズ 105mm×105mm×45mm の黒いケースにRaspberry Piが収まります。

 


Pi Desktopにひとつの問題があると思います。

Pi Desktop にRaspberry Pi3を装着

Pi Desktop にRaspberry Pi3を装着

それは、SDカードを簡単に抜くことができないことです。
Raspberry Piの左側にSDカードスロットがありますが、ケースに取り出し口が無くSDカードに手が届きません。

一度組み立てると、SDカードに触れる必要が無いのですが、私は操作ミスでSDカードを壊してしまいました。Pi Desktopのネジを外しRaspberry Piを取り出して、SDカードを入れ替えるのに苦労してしまいました。


それゆえ私は、最初にRaspberry PiとPi Desktop拡張ボードを接続してSSDを設定しました。そして、SDカード無しの運用するために、SDカードを抜いてPi Desktopのケースに入れました。

Pi Desktopのソフト設定

Pi Desktop Debian Package インストール

Pi Desktopサイト Downloadsから Pi Desktop Debian Package をダウンロードします。

Debian Packageをインストールします。

$ sudo dpkg -i pidesktop-base-1.1.0.deb 
Selecting previously unselected package pidesktop-base.
(Reading database ... 124076 files and directories currently installed.)
Preparing to unpack pidesktop-base-1.1.0.deb ...
Unpacking pidesktop-base (1.0.0) ...
Setting up pidesktop-base (1.0.0) ...
Created symlink /etc/systemd/system/reboot.target.wants/embest-shutdown.service → /lib/systemd/system/embest-shutdown.service.
Created symlink /etc/systemd/system/poweroff.target.wants/embest-shutdown.service → /lib/systemd/system/embest-shutdown.service.
Created symlink /etc/systemd/system/multi-user.target.wants/embest.service → /lib/systemd/system/embest.service.
sudo systemctl disable fake-hwclock.service
Synchronizing state of fake-hwclock.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable fake-hwclock

SSD パーティション作成

パーティション管理ユーティリティ gparted をインストールします。

$ sudo apt-get update
$ sudo apt-get install gparted

gparted を起動します。

$ $ sudo gparted
パーティション設定

パーティション設定

デバイス /dev/sda を選択します。

パーティション設定

パーティション設定

「デバイス(D)」-「パーティションテーブルの作成(C)」をクリックします。

「新しいパーティションテーブルの形式を選択」から「gpt形式」を選択して「適用」します。

パーティション設定

パーティション設定

終了します。

パーティション設定

パーティション設定

この操作により、/dev/sda のSSDは何も無い状態になります。私は不注意で、この操作を /dev/mmcblk0 (SDカード)に対して行ってSDカードを壊してしまいました。

SDからSSDへコピー (ppp-hdcloneを使用)

SDカードの内容をSSDにコピーします。

ppp-hdcloneの説明

ppp-hdcloneの説明

マニュアル(Pi Desktop User Manual_EN_Rev3.4)に従い、ppp-hdclone を起動します。

$ sudo ppp-hdclone

Deviceの選択ができません。

ppp-hdclone Device選択できず

ppp-hdclone Device選択できず

 

Debian Package v1.1.0の説明をみると、管理者権限の sudo が不要になったようです。

This version mainily fixes some bugs:

Fixed: command ‘ppp-hdclone’ can not call piclone suitably on the RASPBIAN image released after 2017-06. On the new RASPBIAN image ‘sudo’ is no longer needed when call piclone.

$ ppp-hdclone
ppp-hdclone Device選択

ppp-hdclone Device選択

今度は、SD Card Copierのデバイス選択ができるようになりました。

  • Copy From Devide: USD (/dev/mmcblk0)
  • Copy To Devide: MT-64 USB Storage (/dev/sda)
ppp-hdclone 開始確認

ppp-hdclone 開始確認

実行開始しましたが、エラーが発生してしまいました。

ppp-hdclone エラー発生

ppp-hdclone エラー発生

 

SDからSSDへコピー (SD Card Copierを使用)

気を取り直して、解決方法を調べます。

ppp-hdclone スクリプトの内容を確認しました。

#!/bin/bash
/usr/share/PiDesktop/python/diskClone.py
sudo /usr/share/PiDesktop/python/pppBoot.py

2つのPythonスクリプトを実行しているだけです。

#!/usr/bin/python
import os;

def runCommand(command):
    print command;
    r = os.popen(command);
    info = r.readlines();
    for line in info:
        print line;

def newPartition(sd):
    command = 'echo -e "o\nn\np\n1\n\n\nw\n" | sudo fdisk ' + sd;
    os.popen(command);

def chekSD():
    command = 'ls -la /dev/sd*';
    r = os.popen(command);
    info = r.readlines();
    if len(info) > 0:
        sd = '';
        num = 0;
        for line in info :
            if line.startswith("ls:") :
                print 'Please insert mSATA disk.';
                return;
            if line.strip()[-1].isdigit():
                num += 1;
            else:
                sd = line.strip('\r\n');
        diskClone();
    else:
        print 'Please insert mSATA disk.';
 
def diskClone():
    message = "Calling the 'SD Card copier' to clone the filesystem from SD Card to SSD...";
    print message;
    command = 'piclone';
    runCommand(command);

if __name__ == "__main__":
    chekSD();

chekSD() → diskClone() → piclone を起動しています。piclone は、SD Card Copierのようです。

「アクセサリ>SD Card Copier」を使用してみます。

SD Card Copier 起動

SD Card Copier 起動

無事、SDカードからSSDへのコピーが完了しました。

SSDのrootfsを指定

もうひとつの pppBoot.py スクリプトは何をしているのでしょうか?
スクリプトを読むと、/boot/cmdline.txtの 「root=」を「root=/dev/sda2」に置換しているようです。

pi-desktop の Boot From a USB Mass Storage Deviceを読むと意味がわかりました。

As we know,Pi has two partition on disk(take the debian for example),The boot partition and the root partition. The boot partition is FAT format and the root partition is EXT4 format.The boot partition contains files about firmware,just like zImage,dtb,config.txt and so on. The EXT4 partition contains the rootfs.
・・・
There are two methods to boot from SSD(or other USB Mass Storage Devices). The first way is change the root property in cmdline.txt to re-choose the location of rootfs.The other way is the new strategy that is on developing.

【要約】
私たちが知っているように、Piはディスク上に2つのパーティション(例えばdebianをとります)、ブートパーティションとルートパーティションを持っています。ブートパーティションはFATフォーマットで、ルートパーティションはEXT4フォーマットです。ブートパーティションには、zImage、dtb、config.txtなどのファームウェアに関するファイルが含まれています。EXT4パーティションにはrootfsが含まれています。

SSD(または他のUSB大容量記憶装置)から起動するには、2つの方法があります。最初の方法は、cmdline.txtのルートプロパティを変更してrootfの場所を再選択することです。それ以外の方法は開発中の新しい戦略です。


Methods 1

This method is what pi-desktop has choosed.Just follow the steps:

1 Prepare a USB Mass Storage Device. You can use piclone to copy the contains from your SD card to the USB Mass Storage Device.
2 Prepare a SD card.Flash the image to it too.Change the root property in cmdline.txt. change root=/dev/mmcblk0p2 to root=/dev/sd***x***2.

Methods 2

This method is a really way to boot from USB without SD card. You don’t need a SD card. The boot partion is stored in USB mass storage device too.
But first you need a SD card to set the OTP bit.

【要約】

[方法1]
この方法は、pi-desktopが選択したものです。次の手順に従います。

1. USB大容量記憶装置を準備します。picloneを使用して、SDカードからUSBマスストレージデバイスへの内容をコピーすることができます。
2. SDカードを準備します。イメージをフラッシュします。cmdline.txtにルートプロパティを変更します。root=/dev/mmcblk0p2 を root=/dev/sd***x***2に変更します。

[方法2]
この方法は、SDカードなしでUSBから起動する本当の方法です。SDカードは必要ありません。ブートパーティションはUSBマスストレージデバイスにも格納されています。

しかし、まずOTPビットを設定するにはSDカードが必要です。


私のRaspberry Pi3は、すでに方法2でOTPビットを変更して USBブート設定していますので、pppBoot.py スクリプトを実行する必要はありません。

Raspberry Pi3 USBデバイスからブートする方法

方法1の補足説明

私は、方法2を選択しましたが、方法1についての情報をメモしておきます。

SDカードからブートしたとき、「/boot」と「/」はSDカードデバイスをマウントしています。

$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda          8:0    0 58.7G  0 disk 
├sda1        8:1    0 41.8M  0 part 
└sda2        8:2    0 58.7G  0 part 
mmcblk0    179:0    0 14.7G  0 disk 
├mmcblk0p1 179:1    0 41.8M  0 part /boot
└mmcblk0p2 179:2    0 14.7G  0 part /

SDカードの /boot/cmdline.txt の ルートプロパティを root=/dev/sda2 に変更します。

$ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

リブートします。
SDカードの /boot をマウントして、cmdline.txt の 「root=デバイス」指定により SSDの「/」をマウントします。
すなわち、SDカードを使用して起動しますが、Linux OSはSSDから起動することになります。

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda          8:0    0 58.7G  0 disk 
├sda1        8:1    0 41.8M  0 part 
└sda2        8:2    0 58.7G  0 part /
mmcblk0    179:0    0 14.7G  0 disk 
├mmcblk0p1 179:1    0 41.8M  0 part /boot
└mmcblk0p2 179:2    0 14.7G  0 part 

SSD起動の確認

SDカードを抜いてリブートします。しばらく待つと、SSDからRaspbianが起動しました。

lsblkコマンドで物理ディスクの一覧を確認しました。

$ blkid
/dev/sda1: LABEL="boot" UUID="13C6-2676" TYPE="vfat" PARTUUID="b9edbc40-01"
/dev/sda2: UUID="037616fd-28fe-4652-8248-2042ea30b929" TYPE="ext4" PARTUUID="b9edbc40-02"

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda     8:0    1 14.7G  0 disk 
├sda1   8:1    1 41.8M  0 part /boot
└sda2   8:2    1 14.7G  0 part /

まとめ

Raspberry Pi3をPi Desktopキットを使用してSSDベースのデスクトップPCにしました

SDカードからSSDへ内容をコピーする手順で迷いましたが、無事SSD起動に成功しました。マニュアルの内容を大幅に加筆した「Pi Desktop User Manual_EN_Rev4.0.pdf」が公開されています。私は、古いマニュアル(Rev3.4)を参照していました。Pi Desktopが届いたときにマニュアルなどをダウンロードして、SSD化の「sudo ppp-hdclone」手順でトラブルが発生して解決方法を調べている間に新しいマニュアルが公開されたようです。

電源スイッチの確認などは、別の機会にレポートしたいと思います。