Raspberry Pi 2 + Raspbianで、microSDをboot、USBメモリをrootというファイルシステムにする

Raspberry Pi 2で、microSDにRaspbianをインストールして使っていましたが、たびたび起動することができなくなっていました。

不安定な感じのため、型番で検索してみると同じような事例をいくつか見ました。

 
相性の良さそうな新しいmicroSDを探した方がよいのかもしれないと、以下のサイトも眺めていたりしました。
RPi SD cards - eLinux.org

 
さらに探してみると、

と設定して起動している事例がいくつかありました。

 
そこで以下の記事を参考に、手元のRaspberry Pi 2でも試してみました。

 

環境

Windows

 

Raspberry Pi

 
なお、ファームウェアのバージョンは前回の記事よりも古い、2015-02-16のデフォルトのままです。というのも、現在sudo rpi-updateすると以下の様な警告が出てkernelが4.0系になりそうだったためです。

pi@raspberrypi ~ $ sudo rpi-update
...
WARNING: This update bumps to rpi-4.0.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=113753
...

 

流れ

microSD、USBメモリの初期化

両方とも、SDFormatter v4で以下のオプション設定で初期化しておきます。

  • クイックフォーマット
  • 論理サイズ調整ON

 

USBメモリへRaspbianイメージを書き込む

microSDへ書き込んだ時と同様、Win32DiskImagerを使って書き込みます。

Win32DiskImagerでUSBメモリを認識するので、Raspbianを書き込みます。
Raspberry Pi Downloads - Software for the Raspberry Pi

 

USBメモリのbootパーティションの全ファイルを、microSDのドライブレター直下へコピー

Windows PCにUSBメモリを挿しても、bootパーティションしか見えないと思います。

そのため、USBメモリのドライブレター直下の全ファイルを、microSDのドライブレター直下へとコピペします。

 

microSD内の cmdline.txtファイルの変更

ブートプロセスで使われるファイルの一つに、microSDのドライブレター直下にあるcmdline.txtがあります。

 
この中のrootオプションにてルートファイルシステムを指定しているようです。

cmdline.txtをサクラエディタで開き*1、rootオプションを確認するとroot=/dev/mmcblk0p2と指定されています。

今回はUSBメモリパーティション2をルートファイルシステムとして指定するため、root=/dev/mmcblk0p2からroot=/dev/sda2へと変更します。

なお、USBメモリパーティション1は、microSDと同じbootパーティションになっているかと思います。

変更前
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
変更後
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait

 

参考

 

microSDとUSBメモリをRaspberryPiにセットして起動

両方をセットしてから電源を入れて起動し、TeraTermで接続します。

パスワード入力後、少し待つような感じがあり不安になりますが、しばらく待つと無事に接続できました。

...
NOTICE: the software on this Raspberry Pi has not been fully configured. Please run 'sudo raspi-config'

pi@raspberrypi ~ $

 

/etc/fstabファイルの変更

システム起動時にマウントする、などの設定を行う/etc/fstabファイルも変更します。
@IT:/etc/fstabに記述されている数字の意味

pi@raspberrypi ~ $ sudo nano /etc/fstab

 
cmdline.txtファイルに合わせ、ルートディレクトリ(/)のパスを、/dev/mmcblk0p2から/dev/sda2へと変更します。

変更前
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
変更後
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/sda2       /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that

 

パーティションの拡張

USBメモリをrootにした場合、raspi-configでファイルシステムの拡張ができなさそうなので、自力で拡張を行っておきます。

raspi-configのソースコードを見ても、だいたい同じようなことをやっていました。

 

現在のファイルシステムの状態を確認

dfコマンドで、ディスクドライブの使用量を確認します。
Linuxコマンド集 - 【 df 】 ディスク・ドライブの使用量を表示する:ITpro

pi@raspberrypi ~ $ df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs           3023728 2508332    342084  88% /
/dev/root        3023728 2508332    342084  88% /
devtmpfs          470416       0    470416   0% /dev
tmpfs              94944     240     94704   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs             189880       0    189880   0% /run/shm
/dev/mmcblk0p1  15430272   20480  15409792   1% /boot

 

fdiskコマンドによる設定

fdiskコマンドで、パーティションの設定を行います。

 

現在のパーティションの状態を確認
pi@raspberrypi ~ $ sudo fdisk /dev/sda

Command (m for help): p  # パーティションの状態を確認

Disk /dev/sda: 7918 MB, 7918845952 bytes
244 heads, 62 sectors/track, 1022 cylinders, total 15466496 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
Disk identifier: 0xa6202af7

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sda2          122880     6399999     3138560   83  Linux

 

パーティション2 (/dev/sda2)を削除

ここでパーティションを削除しますが、この時点ではまだ実際のパーティションには反映されていません。誤って削除した場合などは、qで抜けます。

Command (m for help): d  # パーティションの削除
Partition number (1-4): 2  # 2番め(/dev/sda2)を削除

 

ここまでの状態を確認

/dev/sda2が消えていますが、再度パーティションを作成すると表示されるようになるため、現段階ではこのままで進めます。

Command (m for help): p  # パーティションの状態を確認

Disk /dev/sda: 7918 MB, 7918845952 bytes
244 heads, 62 sectors/track, 1022 cylinders, total 15466496 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
Disk identifier: 0xa6202af7

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            8192      122879       57344    c  W95 FAT32 (LBA)

 

新しいパーティションを作成
Command (m for help): n  # 新しいパーティションを作成
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p  # プライマリーパーティションとして作成
Partition number (1-4, default 2): 2  # 2番めなので2を指定
First sector (2048-15466495, default 2048): 122880  # /dev/sda1のEnd(122879)の次の値
Last sector, +sectors or +size{K,M,G} (122880-15466495, default 15466495): 15466495  # 最大値、デフォルトのままで良いので、Enterキーを押す
Using default value 15466495

 

パーティションの状態を確認

/dev/sda2パーティションが見えるようになりました。

Command (m for help): p  # パーティションの状態を確認

Disk /dev/sda: 7918 MB, 7918845952 bytes
244 heads, 62 sectors/track, 1022 cylinders, total 15466496 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
Disk identifier: 0xa6202af7

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sda2          122880    15466495     7671808   83  Linux

 

変更を確定
Command (m for help): w  # 変更を確定
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

 

再起動して反映
pi@raspberrypi ~ $ sudo reboot

 

再起動後、現在のファイルシステムの状態を確認
pi@raspberrypi ~ $ df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs           3023728 2508456    341960  89% /
/dev/root        3023728 2508456    341960  89% /
devtmpfs          470416       0    470416   0% /dev
tmpfs              94944     240     94704   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs             189880       0    189880   0% /run/shm
/dev/mmcblk0p1  15430272   20480  15409792   1% /boot

 

ファイルシステムの拡張
resize2fsを使って拡張

fdiskでパーティションを拡張したため、今度はresize2fsコマンドでファイルシステムを拡張します。
resize2fs - システム管理コマンドの説明 - Linux コマンド集 一覧表

pi@raspberrypi ~ $ sudo resize2fs /dev/sda2
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/sda2 is now 1917952 blocks long.

 

拡張の確認
pi@raspberrypi ~ $ df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs           7485132 2510748   4620036  36% /
/dev/root        7485132 2510748   4620036  36% /
devtmpfs          470416       0    470416   0% /dev
tmpfs              94944     240     94704   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs             189880       0    189880   0% /run/shm
/dev/mmcblk0p1  15430272   20480  15409792   1% /boot

 
無事に拡張まで終わりました。

これで、bootパーティションをmicroSD、OSイメージをUSBメモリにすることができました。

*1:ファイルの文字コードShift_JIS、改行コードがLFとWindowsのものとは異なることから、それらが表示されるエディタがいいのかなと思いました