ラズパイにセットしたMicroSDにラズパイOSをセットアップするシェル

ラズパイのUSB端子に、MicroSDドライブを接続して、セットしたMicroSDにインターネットからラズパイOSをダウンロードしてきて、ラズパイをブートできるMicroSDをセットアップできるシェルの話です。

 

雑誌に載っていた内容とラズベリーパイ財団のHPに載っていた方法を合わせて、手持ち資料に残していました。ラズベリーパイ財団のHPの内容は現在ではなくなっているようです。

 

やっていることを手作業したとしても、大したことではないのですけど、
バックグラウンドでMicroSDに書き込む処理を監視したり、OSイメージを縮小する処理をしたり、OSドライブレターの見え方だったりが、最終的に案外面白かったのでアップします。

 

  • ラズパイOSをダウンロードしてきて、MicroSDに書き込むシェルは以下の内容で用意します。

 

vi write_image.sh

#!/bin/sh

## 変数
# MicrSD装着のドライブは /dev/sda の想定。デバイス名を間違えるとハードディスク内のすべてのデータを失いますので、注意!!!

DEVICE=/dev/sda

# 使用するイメージの名前
IMAGE_NAME=raspbian_latest

# 書き込むディスクイメージの圧縮ファイル名
IMAGE_ZIP=${IMAGE_NAME}.zip

# ダウンロードURL
IMAGE_URL=https://downloads.raspberrypi.org/${IMAGE_NAME}

## 処理
# microSDカードのマウント解除
# SDカードデバイス(sda)に対して、SDイメージをコピーしている間にファイルの読み書きがされないように、アンマウントする必要があります。
# umount /dev/sdanを、sdanの部分を SDカードのデバイス名(n=パーティションNo)に置き換えて実行します。
# SDカードの複数のパーティションはすべてアンマウントします。

for target in `mount | grep "media" | awk '{print $3}'`
do
echo "umount ${target}"
sudo umount ${target}
done

# 書き込むイメージファイルのダウンロード
if [ ! -e ${IMAGE_ZIP} ]; then
wget -O ${IMAGE_ZIP} ${IMAGE_URL}
fi
unzip ${IMAGE_ZIP}

# ディスクイメージ書き込み
# 最後にSDカードにイメージを書き込みます。if=入力ファイルimgパス、 of=出力ファイル(/dev/sda:デバイス名)
# ddの代わりにdcflddを使用することも可能です。 これは、どれだけ書き込まれたについて進捗を表示してくれます。

image_file=`ls *.img`
sudo /bin/dd of=${DEVICE} if=${image_file} bs=4M

 

デバイス名が、1つのパーティションではなく、SDカード全体の名前であることも確認。
例えば、sda1やsda2ではなくsdaを、 mmcblk0p1ではなくmmcblk0を使用してください。
ほとんどの場合、ブロックサイズを4Mに設定するとうまく動作します。
もしダメであれば、かなり時間はかかりますが1Mで試してみてください。

 

ラズパイ・ホームデレクトリに、作成したスクリプトを置き、MicroSDドライブをUSB端子に挿して、ラズパイOSをセットアップするMicroSDをセットして、SSH接続の準備を行う

 

新しく現れたSDカードデバイスです。イジェクトアイコンも現れました。

 

  • MicroSDドライブのドライブレターを確認

 

pi@r3b-bsf-mst:~ $ 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/mmcblk0: 7.2 GiB, 7776239616 bytes, 15187968 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: 0xea7d04d6

Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/mmcblk0p2 532480 11766504 11234025 5.4G 83 Linux

/dev/mmcblk0p1や/dev/sda1はSDカードデバイス名です。

Disk /dev/sda: 7.2 GiB, 7751073792 bytes, 15138816 sectors
Disk model: STORAGE DEVICE
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: 0xbf97426b

Device Boot Start End Sectors Size Id Type
/dev/sda1 8192 15138815 15130624 7.2G b W95 FAT32
root@r3b-bsf-mst:/home/pi# lsblk -p

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 1 7.2G 0 disk
tq/dev/sda1 8:1 1 256M 0 part
mq/dev/sda2 8:2 1 3.3G 0 part
/dev/mmcblk0 179:0 0 29.7G 0 disk
tq/dev/mmcblk0p1 179:1 0 256M 0 part /boot
mq/dev/mmcblk0p2 179:2 0 29.5G 0 part /

  • 表示名の最後の部分(p1や1)はパーティションナンバーで、スクリプトでは1つのパーティションだけではなくSDカード全体を書き込む必要があります。
  • SDカード全体を示すため、デバイス名から該当部分を削除した名前 (例えば/dev/mmcblk0や/dev/sda)を使用する必要があります。
  • df出力でSDカードは1回以上表示される可能性があります。
    これは以前にラズパイイメージをSDカードに書き込んでいる場合で、 SDイメージが複数のパーティションを持っているためです。

 

ドライブレターが、/dev/sda(全体パーティション) だったので、

 

pi@r3b-bsf-mst:~ $ vi write_image.sh

#!/bin/sh

##
#
DEVICE=/dev/sda  ←DEVICEを修正する
: : :
  • パーミッション調整して、root権限でスクリプト実行。ただし、MicroSDのサイズを拡張していない場合には、「raspi-config」で「Expand Filesystem」を指定してサイズ拡張しておいた方が良いです。(リブートも必要)

 

pi@r3b-bsf-mst:~ $ chmod 755 write_image.sh
pi@r3b-bsf-mst:~ $ sudo -s
root@r3b-bsf-mst:/home/pi# ./write_image.sh

umount /media/pi/BOOT
--2020-05-29 10:29:15-- https://downloads.raspberrypi.org/raspbian_latest
downloads.raspberrypi.org (downloads.raspberrypi.org) をDNSに問いあわせています... 2a00:1098:88:26::1, 2a00:1098:84:1e0::1, 2a00:1098:84:1e0::3, ...
downloads.raspberrypi.org (downloads.raspberrypi.org)|2a00:1098:88:26::1|:443 に接続しています... 失敗しました: 接続を拒否されました. ※ 案外、接続に失敗する

・・・案外失敗するかも・・・

HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: http://downloads.raspberrypi.org/raspbian/images/raspbian-2020-02-14/2020-02-13-raspbian-buster.zip [続く]
--2020-05-29 10:29:17-- http://downloads.raspberrypi.org/raspbian/images/raspbian-2020-02-14/2020-02-13-raspbian-buster.zip
downloads.raspberrypi.org (downloads.raspberrypi.org)|46.235.231.151|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1191759016 (1.1G) [application/zip]
`raspbian_latest.zip' に保存中

raspbian_latest.zip 100%[======================================================================>] 1.11G 1.69MB/s 時間 11m 8s

2020-05-29 10:40:26 (1.70 MB/s) - `raspbian_latest.zip' へ保存完了 [1191759016/1191759016]

Archive: raspbian_latest.zip
replace 2020-02-13-raspbian-buster.img? [y]es, [n]o, [A]ll, [N]one, [r]ename: y   ← 「y」を入力(2回目、実行した場合に、解凍ファイルが残っていた!)

inflating: 2020-02-13-raspbian-buster.img
286+0 レコード入力
285+0 レコード出力
1195376640 bytes (1.2 GB, 1.1 GiB) copied, 55.7326 s, 21.4 MB/s  ←元端末に表示。「sudo pkill -USR1 dd」を別端末から実行。
348+0 レコード入力
347+0 レコード出力
1455423488 bytes (1.5 GB, 1.4 GiB) copied, 67.2023 s, 21.7 MB/s  ←元端末に表示。「sudo pkill -USR1 dd」を別端末から実行。
903+0 レコード入力
903+0 レコード出力
3787456512 bytes (3.8 GB, 3.5 GiB) copied, 170.183 s, 22.3 MB/s  ←元端末に表示。「sudo pkill -USR1 dd」を別端末から実行。

 

  • 上記のレコード入出力の表示は、書き込み動作の進捗を調べるために、管理者権限で「pkill -USR1 dd」を別のターミナルから実行したから、進捗はpkillを実行したウインドウではなく、元のウインドウに表示されます。
    (バッファリングで、すぐに表示されないかも)

 

  • ダウンロードしたZIPファイルはいらないので、容量オーバー回避のために削除します。

 

root@r3b-bsf-mst:/home/pi# rm raspbian_latest.zip

  • ddはカード全体のコピーを作成するので、元のイメージよりもサイズが大きくなるので、元のサイズと同じサイズになるよう新しいイメージを切り詰めなければいけません。
    SDカード上のイメージをハードディスク上に戻します。

 

root@r3b-bsf-mst:/home/pi# dd bs=4M if=/dev/sda of=from-sd-card.img

795+0 レコード入力
794+0 レコード出力
3330277376 bytes (3.3 GB, 3.1 GiB) copied, 277.303 s, 12.0 MB/s

795+0 レコード入力
794+0 レコード出力
3330277376 bytes (3.3 GB, 3.1 GiB) copied, 277.303 s, 12.0 MB/s

  • SDカード上のイメージを、 元のイメージと同じサイズになるよう切り詰めます。

 

root@r3b-bsf-mst:/home/pi# truncate --reference 2020-02-13-raspbian-buster.img from-sd-card.img

  • diff(またはmd5sum)を実行して 元のファイルと比較します。

 

root@r3b-bsf-mst:/home/pi# diff -s from-sd-card.img 2020-02-13-raspbian-buster.img
ファイル from-sd-card.img と 2020-02-13-raspbian-buster.img は同一です



ここまでの処理で、MicroSDを別のラズパイにセットした上で、そのラズパイをブートできます。