概要
ラズパイは面白いデバイスです。
ですがSDカード上で色々と読み書きを行うので書き換えに弱いSDカードを壊しかねません。
そこで極力SDカードに負担が行かないようUSBHDDにルートパーティションを構築し読み書きをしようというのが今回の目的です。
使用物
今回用意したのは以下の通り。
- RaspberryPi model B(いわゆる初期型1B)
- 8GB程度のSDカード2枚
- boot用512MBSDカード1枚
- SDカードリーダー
- Windows10Prox64 21H2
枚数については後述。
ステップ1
まずは普通に動くRaspberry Pi OSを作成します。私はデスクトップとして使うつもりはないのでLite版を作成しました。
今はRaspberry Pi Imagerなんて物があるんですね。
とにかく1枚目の8GBSDに焼き込んで下さい。
そしてSSHを有効化するためにbootのラベルのある領域に”ssh”というファイルを新規作成してください。中身は空で構いません。
以後はSSHで作業します。
ステップ2
一度作成したRaspberry Pi OSを起動します。中身は今は別に弄らなくて構いません。容量拡張が初期に走っているのでそれを待ちます。
raspberrypi.localでアクセスできますのでログイン出来たらシャットダウンして下さい。これをUSBHDDに展開することにします。
以後本番OSとします。
ステップ3
もう一枚の8GBに同じで結構ですのでRaspberry Pi OSを焼き込みます。これは作業用のOSとして使います。
以後作業OSとします。
このOSも”ssh”を書き込んでSSHを有効化して下さい。これをRaspberry Piに差し替えて起動します。
ステップ4(作業OSでの手順)
Raspberry PiにUSBHDDを接続します。中身は完全に削除されますので注意して下さい。パーティションを構成します。私はHDD全部使うようにコマンドを操作しています
pi@raspberrypi:~ $ sudo parted /dev/sda GNU Parted 3.2 Using /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel gpt Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? y (parted) mkpart primary ext4 0% 100% (parted) p Model: INTEL SS DSA2M080G2GC (scsi) Disk /dev/sda: 80.0GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 80.0GB 80.0GB ext4 primary (parted) q Information: You may need to update /etc/fstab.
これでパーティションが切れました。(切ってないけどw)
続いてフォーマットしてmountします。
pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1 pi@raspberrypi:~ $ sudo mount -t ext4 -o defaults /dev/sda1 /mnt
ステップ5(作業OSでの手順)
カードリーダーに本番OSを入れてRaspberry Piに接続します。
SDカードはboot領域(/dev/sdb1)とroot領域(/dev/sdb2)となっているはずです。そのroot領域をmountします。
pi@raspberrypi:~ $ sudo mkdir /mnt2 pi@raspberrypi:~ $ sudo mount -t ext4 -o defaults /dev/sdb2 /mnt2
これで本番OSのroot領域が読み取れるようになりました。後はUSBHDDに展開します。rsyncを利用します。
pi@raspberrypi:~ $ sudo rsync -aHAX --progress /mnt2/ /mnt
なぜこのようにするかというと動作中のOSの必要で無い部分をrsyncでコピーを防ぐ必要があるからです。
コピー終了後一旦本番OSSDカードを抜く為にmountを解除します。
pi@raspberrypi:~ $ sudo umount /mnt2
ステップ6
Windows環境下で作業します。boot用SDカードをFAT形式でフォーマットします。フォーマット時ボリュームラベルを入力する欄がありますがそこを”boot”として下さい。アロケーションサイズは規定で構いません。
フォーマットが完了したら本番OSのSDカードも接続します。
接続すると「フォーマットしますか?」と聞かれてくると思いますがここは「いいえ」でフォーマットしません。
本番OSのbootとラベルが書かれたディスクからboot用SDカードにまるまるコピーします。これでboot部分だけのSDができました。
ステップ7(作業OSでの手順)
残作業を開始します。boot用SDカードをカードリーダーに入れてRaspberry Piに接続します。その後PARTUUIDという文字列を取得するために以下のコマンドで情報を見ます。
pi@raspberrypi:~ $ sudo blkid ... /dev/sdb1: SEC_TYPE="msdos" UUID="4ABF-944F" TYPE="vfat" PARTUUID="2a52ced2-01"
ここで必要な情報はPARTUUIDです。この値をメモしておいて下さい。
さて作業は大詰めです。まずはboot用SDをmountします。
pi@raspberrypi:~ $ sudo mount -t vfat -o defaults /dev/sdb1 /mnt2
mountしたら
pi@raspberrypi:~ $ cd /mnt2 pi@raspberrypi:/mnt2 $ sudo vi cmdline.txt
cmdline.txtを修正します。エディタはnanoでも構いません。直す箇所は
console=serial0,115200 console=tty1 root=PARTUUID=d0719d3b-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
これのroot=PARTUUID={UUID}をroot=/dev/sda1に変更します。
console=serial0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
保存して終了します。
次にUBSHDDの中を修正します。
pi@raspberrypi:~ $ cd /mnt pi@raspberrypi:/mnt $ sudo vi etc/fstab
proc /proc proc defaults 0 0 PARTUUID=d0719d3b-01 /boot vfat defaults 0 2 PARTUUID=d0719d3b-02 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that
これの2行目と3行目の部分をこんなように書き換えます。
proc /proc proc defaults 0 0 PARTUUID=2a52ced2-01 /boot vfat defaults 0 2 /dev/sda1 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that
2行目のPARTUUIDは先ほどboot用SDのUUID、3行目の頭からはUSBHDDを指定します。出来たら保存して終了します。
これで準備は整いました。シャットダウンして電源を落としboot用SDをRaspberryPiのカードスロットに。USBHDDを接続します。ちなみにUSBHDDの電源が入るとそこから電源供給されたと勘違いしてRaspberryPiも起動してしまうので入れ方には注意が必要です。
この状態で電源を入れるとまずboot用SDからカーネルを読み込んですぐにUSBHDDに起動処理が移ります。
カーネルのアップデート以外にはアクセスされませんので精神衛生上普通のパソコンと変わりがありません。ガンガンアップデートでもなんでも読み書きできます。
最後に
出来上がったRaspberryPi+USBHDD構成ならば大抵の事は出来そうです。
ちなみにRaspberryPiは2Bから3B+まではすでにSDカードレスで起動できるそうです。4Bは正式回答待ちと言った所でしょうか。ただこのやり方でよければどのPiでも出来そうな気がします。
コメント