前回は、Rocky Linux 第6回「Raspberry Pi用のRocky LinuxをSSDにコピーする」として最新のRocky LinuxのイメージをSSDにコピーして使用して来ました。ところが、コマンドを使ったり、PARTUUID
やUUID
を使ったりと色々と面倒でした。
そこで、その際の操作をシェルスクリプトにまとめてスクリプティングして見ました。Rocky Linux用のスクリプトは、copy-rockylinux-img2ssd.sh
として作成しています。
概要
最新のRaspberry Pi用Rocky Linuxのイメージをダウンロードして、SSDにコピーして起動用のRocky LinuxのSSDを作成します。
SSDに作成するパーティションとしては、boot
を512MB
、残りすべての領域をroot
として作成します。
Rocky Linuxのイメージでは、swap
パーティションが作成されていますが、これを作成していません。 必要な場合には、別途でswap
ファイルを作成して使用するように設定することにします。
SSDに新しく作成したパーティションとファイルシステムに合わせて、SSDの/boot/cmdline.txt
にあるroot
のPARTUUIDを修正しています。
同様にSSDの/etc/fstab
のUUID
も修正しています。
この際に、/etc/fstab
にあるswap
の行をコメントアウトしています。
Rocky Linuxでは、既定値でSELinuxが有効化されているためにコピー直後のSSDから起動して使用できるようにするためにSELinuxをDisabled
に設定しています。 そのための方法として、SSD内の/boot/cmdline.txt
ファイルの最後にselinux=0
のパラメーターを追加しています。
再度SELinuxを有効化する場合には、/boot/cmdline.txt
ファイルに追加したselinux=0
を削除してから再起動します。 この状態で再起動することで再ラベル付けが行われて、SELinuxを有効化することができます。
使い方
Raspberry Pi 4で、Rocky LinuxをmSDから起動した状態でコピー先となるSSDを装着します。
現在のスクリプトではSSDが/dev/sda
として認識されているものとしていますから、もしデバイス名が違う場合にはスクリプトを修正する必要があります。
用意ができれば、スクリプトを実行します。
$ bash copy-rockylinux-img2ssd.sh
概要に記載した処理を実行して、Rocky LinuxのイメージをコピーしたSSDを作成したら終了します。
mSDから起動したRocky Linuxを停止してから、mSDを取り外してSSDだけを装着した状態にして電源を入れます。
起動したら、ユーザー名:rocky
、パスワード:rockylinux
でログインします。
スクリプト(copy-rockylinux-img2ssd.sh)の内容
#!/bin/bash
SSDDEV=/dev/sda
BOOTSZ=512M
ROCKY_URL="https://dl.rockylinux.org/pub/sig/9/altarch/aarch64/images/"
ROCKY_IMG="RockyLinuxRpi_9-latest.img"
function logmsg() {
echo ">>> $1"
}
function get_partuuid() {
sudo blkid $1 >/var/tmp/blkid$$.txt
PARTUUID=$(cat /var/tmp/blkid$$.txt | sed 's/^.*PARTUUID=\"//' | cut -c1-8)
sudo rm /var/tmp/blkid$$.txt
echo ${PARTUUID}
}
function get_uuid() {
sudo blkid $1 >/var/tmp/blkid$$.txt
UUID=$(cat /var/tmp/blkid$$.txt | sed 's/^.* UUID=\"//' | sed 's/\".*//')
sudo rm /var/tmp/blkid$$.txt
echo ${UUID}
}
logmsg "Start Copy Rocky Linux to SSD"
logmsg "Create partitions"
sudo parted ${SSDDEV} mklabel msdos
sudo parted ${SSDDEV} mkpart primary fat32 0% ${BOOTSZ}
sudo parted ${SSDDEV} mkpart primary ext4 ${BOOTSZ} 100%
sudo parted ${SSDDEV} print
logmsg "Make filesystems"
sudo mkfs.vfat -F 32 ${SSDDEV}1
sudo mkfs.ext4 ${SSDDEV}2
sudo e2label ${SSDDEV}2 "_/"
cd /var/tmp
if [ ! -f ${ROCKY_IMG} ]; then
logmsg "Get Latest Rocky Linux image"
curl -L ${ROCKY_URL}${ROCKY_IMG}.xz -o ${ROCKY_IMG}.xz
xz -dv ${ROCKY_IMG}.xz
fi
logmsg "Loopback mount Rocky Linux image"
sudo kpartx -av ${ROCKY_IMG}
logmsg "Copy boot filesystem to SSD"
[ -d /var/tmp/mnt2 ] && sudo rm -fr /var/tmp/mnt2
sudo mkdir /var/tmp/mnt2
sudo mount /dev/mapper/loop0p1 /mnt
sudo mount ${SSDDEV}1 /var/tmp/mnt2
sudo rsync -avhP /mnt/ /var/tmp/mnt2/
sudo umount /var/tmp/mnt2 /mnt
logmsg "Copy root filesystem to SSD"
sudo mount /dev/mapper/loop0p3 /mnt
sudo mount ${SSDDEV}2 /var/tmp/mnt2
sudo rsync -avhP --exclude /mnt/lost+found /mnt/ /var/tmp/mnt2/
logmsg "Unmount Rocky Linux image"
sudo umount /var/tmp/mnt2 /mnt
sudo kpartx -d ${ROCKY_IMG}
logmsg "Modify PARTUUID of 'cmdline.txt'"
BPU=$(get_partuuid ${SSDDEV}1)
sudo mount ${SSDDEV}1 /mnt
sudo sed -i "s/PARTUUID=.*-03/PARTUUID=${BPU}-02/" /mnt/cmdline.txt
sudo sed -i 's/$/ selinux=0/' /mnt/cmdline.txt
sudo umount /mnt
logmsg "Modify UUID of '/etc/fstab'"
BUU=$(get_uuid ${SSDDEV}1)
RUU=$(get_uuid ${SSDDEV}2)
sudo mount ${SSDDEV}2 /mnt
sudo sed -i "/ ext4 /s/^UUID=.................................... /UUID=${RUU} /" /mnt/etc/fstab
sudo sed -i "/fat /s/^UUID=......... /UUID=${BUU} /" /mnt/etc/fstab
sudo sed -i "/ swap /s/^/## /" /mnt/etc/fstab
sudo umount /mnt
sudo rmdir /var/tmp/mnt2
logmsg "End of Copy Rocky Linux to SSD"
exit 0
内容としては、前回実行しているものと同じになっていますから、コピーしたSSDから起動したらユーザー名:rocky
、パスワード:rockylinux
でログインしたら初期設定を実行していきます。またスクリプト内でSELinuxの無効化も設定していますから、必要に応じてSELinuxを有効化して使用することになります。
注:このスクリプトは、有用なものとなるように作成してはいますが。使用する際にSSDが/dev/sda
として認識されることを仮定しています。また、手元で実行することを想定して、厳密なエラーチェックなどはしていません。
もし実際に使用される場合には、個人の責任において使用されるものとして、作者としては無保証であるという点をご理解下さい。
参考: GitHub – copy-img2ssd 上記スクリプトをGitHubのリポジトリーにも登録しています。更新が必要な場合には、こちら側で修正されることになります。