MENU

Rocky Linux 第7回 「Raspberry Pi用のRocky LinuxをSSDにコピーするスクリプト」

前回は、Rocky Linux 第6回「Raspberry Pi用のRocky LinuxをSSDにコピーする」として最新のRocky LinuxのイメージをSSDにコピーして使用して来ました。ところが、コマンドを使ったり、PARTUUIDUUIDを使ったりと色々と面倒でした。

そこで、その際の操作をシェルスクリプトにまとめてスクリプティングして見ました。Rocky Linux用のスクリプトは、copy-rockylinux-img2ssd.shとして作成しています。

概要

最新のRaspberry Pi用Rocky Linuxのイメージをダウンロードして、SSDにコピーして起動用のRocky LinuxのSSDを作成します。

SSDに作成するパーティションとしては、boot512MB、残りすべての領域をrootとして作成します。

Rocky Linuxのイメージでは、swapパーティションが作成されていますが、これを作成していません。 必要な場合には、別途でswapファイルを作成して使用するように設定することにします。

SSDに新しく作成したパーティションとファイルシステムに合わせて、SSDの/boot/cmdline.txtにあるrootのPARTUUIDを修正しています。

同様にSSDの/etc/fstabUUIDも修正しています。

この際に、/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のリポジトリーにも登録しています。更新が必要な場合には、こちら側で修正されることになります。

この記事をシェアする
  • URLをコピーしました!
  • URLをコピーしました!
目次