やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

ラズパイをSSDブート設定してみる

ラズパイをSSDでブートするよう設定する。簡略化のためSSDパーティションは1つにする。

対象環境

参考

こちらを参考にさせていただきました。

ほぼ猿真似。わからないことは調べたり想像で書いていたりするので、参考先を見たほうがいいと思う。

まえおき

私はLinuxの常識も何もない。間違いだらけかもしれない。思い込みで断言してしまっているかもしれない。この記事の内容を鵜呑みにして痛い目を見ても私は一切責任を取らない。

ラズパイ(2台目)の設定

  1. バイスのIDを調べる
  2. SSDパーティションを設定する
  3. SSDをフォーマットする(ext4
  4. システムデータをコピーする(SD→SSD
  5. 起動時に読み込むファイルシステムパーティションを変更する
  6. 確認する

番外編:SSD障害時の復旧

1. デバイスのIDを調べる

pi@raspberrypi:~ $ sudo fdisk -l


Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram1: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram2: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram3: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram4: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram5: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram6: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram7: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram8: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram9: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram10: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram11: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram12: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram13: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram14: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/ram15: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/mmcblk0: 14.5 GiB, 15523119104 bytes, 30318592 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: 0xc06b0477


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


Disk /dev/sda: 111.8 GiB, 120034121728 bytes, 234441644 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
pi@raspberrypi:~ $ 

長すぎ。でも、一番下のほうだけ見ればいい。 たぶんこの辺の構成はOSのイメージファイルを書き込んだときに決まるのだろう。 以前、RaspbianのイメージファイルをSDカードに書き込んだ内容と思われる。

111.8GiBとあるのがSSDと思われる。/dev/sdaという名前らしい。環境によって異なるので読み替えること。

/dev/mmcblk0p1, /dev/mmcblk0p2はSDカード。前者はブート時に必要。後者がrootとして使用しているパーティション。これをSSDパーティション/dev/sdaに変更するのが今回のミッション。

パーティションについては前回を参照。

2. SSDパーティションを設定する

以下のコマンドを入力する。

sudo fdisk /dev/sda

すると、以下のような表示が出る。

Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xd2f9e49a.


Command (m for help): 

Command (m for help):でこちらの入力待ちになっている。

既存のパーティションを削除する

参考ページのとおり、dを入力する。既存のパーティションを削除するコマンドらしい。

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.


Command (m for help): d
No partition is defined yet!
Could not delete partition 81165

パーティションが存在すれば、Partition ? has been deleted.と表示される。 存在しなければ、No partition is defined yet!と表示される。

パーティションを新規作成する

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 
First sector (2048-234439595, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-234439595, default 234439595): 

Created a new partition 1 of type 'Linux' and of size 111.8 GiB.

文字は何も入力せず(デフォルト値を使用する)、Enterキーを3回押下する。これでSSD全体に1つのプライマリ・パーティションを割り当てたことになる。

パーティション種別

パーティションテーブルがmsdosのものには、2種類のパーティションがあるらしい。

パーティション 上限数 概要
プライマリ・パーティション 4 ふつうのパーティション
拡張パーティション 1 1つの拡張パーティションの中にいくつでも論理パーティションを作成できる。

詳しくは知らない。記憶装置に1つのパーティションを作成するだけなら、プライマリ・パーティションを1つだけ作成すればいいと思う。

fdiskコマンドで出てきた以下のPartition typeとは上記のこと。

Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)

状態を保存する

上記のように作成したパーティションSSDに書き込む。

Command (m for help): w

3. SSDをフォーマットする(ext4

まずアンマウントする。

umount /dev/sda1

SSDext4 形式でフォーマットする。データは全部消えるので注意すること。

sudo mkfs.ext4 /dev/sda1

4. システムデータをコピーする(SD→SSD

SDカードにあるシステムデータを、SSDへコピーする。

mkdir /tmp/usd /tmp/ssd
sudo mount /dev/mmcblk0p2 /tmp/usd
sudo mount /dev/sda1 /tmp/ssd
(cd /tmp/usd; sudo tar --backup -c *)|sudo tar -C /tmp/ssd -xv

10分ちょっとかかった。

パーティション、マウント、パス

SDカードにRaspbianのシステムデータがある。 SDカードは2つのパーティションに分けられている。 たぶん、以下のような用途だと思う。

パーティション 用途
/dev/mmcblk0p1 ブート用パーティション
/dev/mmcblk0p2 システム用パーティション

以下、コピー前に行ったコマンド時の対応表。

記憶装置 パーティション マウントポイント
SDカード /dev/mmcblk0p2 /tmp/usd
SSD /dev/sda1 /tmp/ssd

SDカードのシステム領域をOSが使うためにマウントする。マウント先は/tmp/usd。 おなじく、SSDの領域をOSが使うためにマウントする。マウント先は/tmp/ssd

/tmp/usd/tmp/ssdディレクトリ。ディレクトリにSDカードやSSDパーティション領域を割り当てている。Windowsなら自動でドライブレターが割り当てられる。D:/, E:/, F:/のようなやつ。

/tmp

Linuxでは/tmp配下にあるファイルは再起動すると削除されるらしい。

ようするに/tmpは一時ファイルの置き場所ということ。/tmp/usd/tmp/ssdは再起動後に削除されている。一時的なマウント先として作成したディレクトリに過ぎないから、削除されてOK。

5. 起動時に読み込むファイルシステムパーティションを変更する

/boot/cmdline.txtファイルを編集することで設定する。

念のため、バックアップを取っておく。

sudo cp /boot/cmdline.txt /boot/cmdline_ORG.txt

ブート領域のパーティションをマウントする。

mkdir /tmp/boot
sudo mount /dev/mmcblk0p1 /tmp/boot

テキストエディタcmdline.txtファイルを編集する。

sudo leafpad /tmp/boot/cmdline.txt

/boot/cmdline.txt

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

このうち、root=/dev/mmcblk0p2を、root=/dev/sda1に変更する。保存して終了する。

最後に、メモリに残っているデータをSSDに書込み、再起動する。

sync
reboot

sync の必要性

syncが必要かどうかは不明。

1, 2, 3, を見ると不要そうだが、Raspbianのソースコードを見たことがないため判断できない。

6. 確認

再起動後、ターミナルで以下のようにdf -hコマンドを実行する。/dev/rootにマウント位置/が割り当てられている。容量はSSDのサイズになっているはず。

pi@raspberrypi:~ $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root          ?G    ?G    ?G   ??% /
/dev/mmcblk0p1    63M   21M   43M   33% /boot

番外編

SSDに問題が生じたとき、設定を戻すとSDカードだけで起動できる。

SDカード内の/dev/mmcblk0p1パーティションにある/boot/cmdline.txt内のroot=/dev/sda1を、root=/dev/mmcblk0p2に戻すとSDカードだけで起動するようになる。

/dev/mmcblk0p1パーティションFAT16でフォーマットされているらしいので、Windowsからでも編集できる。

たとえばSSDにある別の設定ファイルを変更するなり、ファイルが壊れるなりして起動できなくなった場合がありうる。SDカード側に保存してある/dev/mmcblk0p2データを使ってブートする。

これができるようにしておきたいから、SDカードの/dev/mmcblk0p2は削除せず保存したままにしておく。

所感

わからないことだらけ。コマンドはおろか、Linuxやコンピュータにおける様々な概念を知らないのかもしれない。何を知らないのかも知らない。何が分からないのかも分からない。分かっているのかいないのかも、わからない。

調べながら補足を入れたが、疑問や違和感がある。/tmp配下にマウントしたパーティションのデータは消えないのか、本当にこれでSSDを使用しているのか。きちんと検証できていない。その術も知らない。