ラズパイをSSDブート設定してみる
ラズパイをSSDでブートするよう設定する。簡略化のためSSDのパーティションは1つにする。
対象環境
- Raspberry Pi 3 Model B
- Raspbian Jessie 2016-09-23
参考
こちらを参考にさせていただきました。
ほぼ猿真似。わからないことは調べたり想像で書いていたりするので、参考先を見たほうがいいと思う。
まえおき
私はLinuxの常識も何もない。間違いだらけかもしれない。思い込みで断言してしまっているかもしれない。この記事の内容を鵜呑みにして痛い目を見ても私は一切責任を取らない。
ラズパイ(2台目)の設定
- デバイスのIDを調べる
- SSDのパーティションを設定する
- SSDをフォーマットする(ext4)
- システムデータをコピーする(SD→SSD)
- 起動時に読み込むファイルシステムのパーティションを変更する
- 確認する
番外編: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)
状態を保存する
Command (m for help): w
3. SSDをフォーマットする(ext4)
まずアンマウントする。
umount /dev/sda1
SSD を ext4 形式でフォーマットする。データは全部消えるので注意すること。
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を使用しているのか。きちんと検証できていない。その術も知らない。