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

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

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

概要

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

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

現在のバージョンのAlmaLinuxのイメージではswapファイルが使用されていますので、そのままにしています。必要に応じて拡張したい場合などでは、別途で作業するものとします。

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

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

AlmaLinuxでは、規定値でSELinuxが有効化されているためにコピー直後のSSDから起動して使用できるようにするためにSELinuxをDisabledに設定しています。そのための方法として、SSD内の/boot/cmdline.txtファイルの最後にselinux=0のパラメーターを追加しています。

再度SELinuxを有効化する場合には、/boot/cmdline.txtファイルに追加したselinux=0を削除してから再起動します。この状態で再起動することで再ラベル付けが行われて、SELinuxを有効化することができます。

使い方

Raspberry Pi 4で、AlmaLinuxをmSDから起動した状態でコピー先となるSSDを装着します。

現在のスクリプトではSSDが/dev/sdaとして認識されているものとしていますから、もしデバイス名が違う場合にはスクリプトを修正する必要があります。

用意ができればスクリプトを実行します。

$ bash copy-almalinux-img2ssd.sh

概要に記載した処理を実行して、AlmaLinuxのイメージをコピーしたSSDを作成したら完了します。

mSDから起動したAlmaLinuxを停止してから、mSDを散り外してSSDだけを装着した状態にして電源を入れます。

起動したら、ユーザー名、パスワードはcloud-init用のuser-dataに設定した内容でログインします。

スクリプト(copy-almalinux-img2ssd.sh)の内容

#!/bin/bash

SSDDEV=/dev/sda
BOOTSZ=512M

ALMA_URL="https://repo.almalinux.org/rpi/9/images/"
ALMA_IMG="AlmaLinux-9-RaspberryPi-GNOME-latest.aarch64.raw"

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 AlmaLinux to SSD"

CURDIR=$(pwd)

if ! which rsync >/dev/null 2>/dev/null; then
  logmsg "Install prerequisite command"
  sudo dnf install -y rsync
fi

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 -n CIDATA -F 32 ${SSDDEV}1
sudo mkfs.ext4 ${SSDDEV}2

sudo e2label ${SSDDEV}2 "_/"

cd /var/tmp

if [ ! -f ${ALMA_IMG} ]; then
  logmsg "Get Latest AlmaLinux image"
  curl -L ${ALMA_URL}${ALMA_IMG}.xz -o ${ALMA_IMG}.xz
  xz -dv ${ALMA_IMG}.xz
fi

logmsg "Loopback mount AlmaLinux image"
sudo kpartx -av ${ALMA_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/loop0p2 /mnt
sudo mount ${SSDDEV}2 /var/tmp/mnt2

sudo rsync -avhP --exclude /mnt/lost+found /mnt/ /var/tmp/mnt2/

logmsg "Unmount AlmaLinux image"
sudo umount /var/tmp/mnt2 /mnt

sudo kpartx -d ${ALMA_IMG}

logmsg "Modify PARTUUID of 'cmdline.txt'"
BPU=$(get_partuuid ${SSDDEV}1)

sudo mount ${SSDDEV}1 /mnt
sudo sed -i "s/PARTUUID=.*-02/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 umount /mnt

sudo rmdir /var/tmp/mnt2

cd ${CURDIR}

if [ -f user-data ]; then
  logmsg "Setup user-data for cloud-init"
  sudo mount ${SSDDEV}1 /mnt
  sudo cp user-data /mnt/user-data
  sudo umount /mnt
fi

logmsg "End of Copy AlmaLinux to SSD"

exit 0

ここで、スクリプトのあるディレクトリーに次のような内容のuser-dataファイルを置いておきます。

#cloud-config
#
# This is default cloud-init config file for AlmaLinux Raspberry Pi image.
#
# If you want additional customization, refer to cloud-init documentation and
# examples. Please note configurations written in this file will be usually
# applied only once at very first boot.
#
# https://cloudinit.readthedocs.io/en/latest/reference/examples.html

hostname: almalinux.local
ssh_pwauth: false

users:
  - name: alma
    groups: [ adm, systemd-journal ]
    sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
    lock_passwd: false
    passwd: $6$EJCqLU5JAiiP5iSS$wRmPHYdotZEXa8OjfcSsJ/f1pAYTk0/OFHV1CGvcszwmk6YwwlZ/Lwg8nqjRT0SSKJIMh/3VuW5ZBz2DqYZ4c1
    ssh_authorized_keys:
      - ssh-ed25519 ED25519-PUBLIC-KEY

locale: ja_JP.utf8

timezone: Asia/Tokyo

runcmd:
  - localectl set-keymap jp
  - [ sh, -c, sleep 3 && nmcli dev wifi connect "SSID" password "PASSWORD" ]

内容としては、AlmaLinux 第3回「Raspberry Pi 4でAlmaLinuxのcloud-initを利用」と同じものとなっています。ここでは、初期ユーザーとしてalmaとパスワードのalmalinuxが設定されています。また、sudoコマンドをパスワード無しで実行できるように設定して、ssh用に別途作成したed25519の公開鍵を設定するようにしています。さらに、Wi-Fi用のSSIDとパスワードを書き込んだものをuser-dataファイルとして用意して置いてSSDにコピーしています。

これで、SSDから起動した後で通常の初期設定などを実行していくことが出来ます。

:このスクリプトは、有用なものとなるように作成してはいますが。使用する際にSSDが/dev/sdaとして認識されることを仮定しています。また、手元で実行することを想定して、厳密なエラーチェックなどはしていません。
 もし実際に使用される場合には、個人の責任において使用されるものとして、作者としては無保証であるという点をご理解下さい。

参考: GitHub – copy-img2ssd  上記スクリプトをGitHubのリポジトリーにも登録しています。更新が必要な場合には、こちら側で修正されることになります。

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