Raspberry Pi 2で、microSDにRaspbianをインストールして使っていましたが、たびたび起動することができなくなっていました。
不安定な感じのため、型番で検索してみると同じような事例をいくつか見ました。
- Raspberry Pi 2とTranscend 16GB microSDでエラー多発 | がちゃのーと。 Gotcha-Note
- The Multiverse of the cat, by the cat, for the cat — Raspberry Pi 2 のファイルシステムが壊れる ー 電力不足か?
- Raspberry Pi 2 microSDカードの相性問題 - パーソナルブログメモリ
相性の良さそうな新しいmicroSDを探した方がよいのかもしれないと、以下のサイトも眺めていたりしました。
RPi SD cards - eLinux.org
さらに探してみると、
と設定して起動している事例がいくつかありました。
そこで以下の記事を参考に、手元のRaspberry Pi 2でも試してみました。
- Raspberry PiをSDメモリカード/USBメモリのデュアル運用 | いなじゅん
- Raspberry Pi、SD カードのアクセス速度と, カード破損の原因について | A2life
- Raspbian on Raspberry Pi using SD card + USB memory stick « Networking How To's
環境
Windows
Raspberry Pi
- Raspberry Pi 2 Model B
- Raspbian 2015-02-16
- microSD
- Transcend TS16GUSDHC10E
- USBメモリ
- Silicon Power Blaze B05
なお、ファームウェアのバージョンは前回の記事よりも古い、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
参考
- Windowsユーザーに教えるLinuxの常識(2):各ディレクトリの役割を知ろう(ルートディレクトリ編) (1/2) - @IT
- クライアント(Raspberry Pi)の準備 | 有限会社 NSプランニング
- rootfsとルートファイルシステム - Linuxの備忘録とか・・・(目次へ)
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
無事に拡張まで終わりました。