dd-tools Raspberry Pi

Raspberry Pi財団には公式のイメージ書き込みツール(pi-imager)があります。とてもシンプル、高機能で使いやすいと思います。当サイトではカード作成時少しだけ修正を加えています。pi-imagerには遥かに及びませんが以前作成したdd-toolをベースにコマンドの勉強を含めてちまちま修正をしながら以来全てこれらのツールでカードを作成しています。
このツールを使う人はいないと思いますがネタ程度に現時点の記録をしておきたいと思います。(少しだけいいところもあります)

Raspberry Pi Imager

pi-imagerをインストールしてみました。 OSを選択、書き込むデバイスを選択してWRITEボタンを押して書き込むだけ。ネットワーク環境によっては時間がかかるのでよくインストール作業をする人はダウンロードしておくのがいいと思います。Use customメニューではimg,iso(圧縮ファイル)に対応しておりRasPiOSに限らず書き込みが可能ですね。

dd tools

メニュー、プログラムは~/bin/dd-toolにおきます。
最新のデバイス情報を更新のためRELOAD(プログラム再起動)するのでdevilspie2に登録、使いやすい位置に固定しています。

メニュー dd.py
devilspie2 applications.lua

dd Device Setup Tool

最初にプログラムを起動する(どれでもいい)とデフォルトのdevice.listを作成します。
デフォルトのdevice.listは起動ディスクのみリストボックスに非表示。

Setup ToolのテキストボックスはRELOADすることで現在のデバイスを更新
sda 起動ディスク(SSD)
sdb RasPiOS
sdc FAT32 disk

以下のファイルを作成 (chmod 755 ~/bin/dd-tool/device.sh)
~/bin/dd-tool/device.sh

#!/bin/sh
ls -l /dev/disk/by-uuid | sort | awk '{print $9}' > ~/bin/dd-tool/_device
sed -i '/^$/d' ~/bin/dd-tool/_device
sed -i "s/^/| grep -v /" ~/bin/dd-tool/_device
cat ~/bin/dd-tool/_device | tr "\n" " " > ~/bin/dd-tool/device.list
sed -i "s#^#ls -l /dev/disk/by-uuid #" ~/bin/dd-tool/device.list
sed -i "s/$/ | awk '{print \$11\}' | cut -c 7- | sort /" ~/bin/dd-tool/device.list
rm ~/bin/dd-tool/_device

sdb sdcを抜いてボタン(Device ALL)をクリック、device.shを実行してボタンは青(Device SET)に切り替え。
device.shは/dev/disk/by-uuidを読んでリストを作成、リストにあるuuidをdd-toolのリストボックスに表示しないようにします。青(Device SET)モードは常時接続しているデバイスなどをdevice.listに登録することで非表示、安全に作業することが出来ます。
現在の仕様では同じリリース媒体から焼いたディスクのuuidは同一になります。sdbは起動ディスク(desktop-20210304)と同じのためリストボックスにあがりません。再度2枚のカードを挿し込んでRELOAD sdcのみがリストボックスにあがります。

作業するカードをdevice.listに登録した場合はカードを抜いて再度Device SETをやり直します。device.listは保存され以降Deviceモードを変更しない限り青(Device SET)モードで起動します。

dd Command Tool


リストボックスからsdc1を選択、DEVICEボタンをクリック
IMG FILEボタンをクリック、ファイルダイアログからimgファイルを選択
dd commandは圧縮ファイルに対応していません


FLASHボタンクリックでddコマンド書式を作成
Yesでxtermからdd実行


書き込みが終了するとRELOAD
起動ディスクと同じuuidになるためリストボックスは非表示(Device SETモード)

dd Partition Expansion Tool

当サイトのディスク作成は取り敢えず必要な容量だけパーティションを作成しています。パーティションの縮小は難しいですが拡張は比較的簡単に実行することが出来ます。
RaspberryPi OSは初回起動時ディスク最大まで切り直します。
焼いたカードの/boot/cmdline.txtを編集してリサイズを止めます。
init=/usr/lib/raspi-config/init_resize.shを削除
手動でマウント $ sudo mount /dev/sd(x1) /mnt # sd(x1)は確認 編集が済んだら $ sudo umount /mnt

/boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=334dade7-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles


このままでは容量不足でパンクしてしまうので任意の値で拡張
通常はgpartedなどのツールを使うところですが作成したツールからサクッと実行
モードは作業マシンと同じリリースなので赤(Device ALL)
DEVICEを選択、ラジオボタンで容量を選択
RESIZEボタンをクリック、OKで実行


ターミナルが開いてe2fsck resize2fsを実行
OKで完了
Setup TollはRELOADで確認

MKPARTボタンは未割り当て部分に新たにパーティションを作成(任意)

dd SD-Copy Tool

上記の例では32GBのカードでsd(x2)を7GiBに拡張しました。bootと合わせても8GBのカードで間に合います。RasPiOS-liteの特定の目的などでは3GBで足りる場合も多いと思います。

ddはディスクイメージそのままブロック単位でコピーします。
パーティション情報はディスクの先頭附近にあるのでこのまま32GBのカードから8GBのカードへddしてもディスクの領域が無くなったところでエラーは出ますが8GBのカードは動くはずです。


8GB(sdc)はFAT32でフォーマット
if(read)とof(write)のディスクを間違えないようにします
ラジオボタンP2を選択、COUNTボタンをクリックするとP1+P2の容量を計算、bs=1Mとしてカウント数を表示
FLASHボタンクリックでコマンド作成、カウント数は+10にしています
Yesで実行開始
書き込み後はfsckをしておきます(fsck -y /dev/sdx)
fsckボタンのあるツールでデバイスを選択してbootとrootfsそれぞれ実行


ddしたカードをmobilepi3で起動確認
バックアップ、コピーが必要なときは必要十分なパーティションサイズにしておくことでカードサイズをそれほど気にせずまたコピーの時間を短縮することが出来ます。
未割り当てにしておくことで拡張も簡単です。

dd Label Edit Tool

稼働中は直接ボリュームラベルを目にすることは少ないのですが一時的に保管する際など識別が容易になります。FAT32のラベル付けはmtoolsを利用しています。

# apt install mtools


FAT32 11文字
ext4  16文字


起動OSと同じuuidのディスクはpcmanfmからも見えてきません。確認する際は手動でマウントします。
デバイスを選択、mountボタンで/mediaにマウントrangerが起動(プログラムで変更可)ranger終了(q)でマウント解除
同様にデバイス選択してfdiskなど起動

mobilepi3


mobilepi3ではudiskieでオートマウントしていたのですが起動を止め(.xsession) pcmanfm(LXDE)の設定でマウントします。

参考

内容は無保証です。デバイス名やuuidの最低限の理解が必要です。
(実行権限 chmod 755 program.name)一部文字化けは全角空白
device.sh
dd-copy.py
dd-device.py
dd-label.py
dd-resize.py
dd-tool.py