AlmaLinux 第10回「Raspberry Pi用のAlmaLinuxをSSDにコピーする」では、最新のAlmaLinuxのイメージをSSDにコピーして使用して来ました。ところが、コマンドを使ったり、PARTUUID
やUUID
を使ったりと色々と面倒でした。
そこで、その際の操作をシェルスクリプトにまとめてスクリプティングして見ました。AlmaLinux用のスクリプトは、copy-almalinux-img2ssd.sh
として作成しています。
概要
最新のRaspberry Pi用のAlmaLinuxのイメージをダウンロードして、SSDにコピーして起動用のAlmaLinuxのSSDを作成します。
SSDに作成するパーティションとしては、boot
を512MB
、残りすべての領域をroot
として作成します。
現在のバージョンのAlmaLinuxのイメージではswap
ファイルが使用されていますので、そのままにしています。必要に応じて拡張したい場合などでは、別途で作業するものとします。
SSDに新しく作成したパーティションとファイルシステムに合わせてSSDの/boot/cmdline.txt
にあるroot
のPARTUUIDを修正しています。
同様にSSDの/etc/fstab
のUUID
も修正しています。
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のリポジトリーにも登録しています。更新が必要な場合には、こちら側で修正されることになります。