Raspberry Pi 4BのmicroSDHCカードへインストールしたCentOS 8.2をrpi-cloneでUSBメモリへコピーして起動する
目次
概要
ずっとRed Hat系のLinuxを愛用しているため、家のRaspberry Pi 4 Model BにもCentOS 8.2.2004をインストールして利用しています。 CentOSはmicroSDHCカードへインストールして利用していますが、I/Oが遅いのと、I/Oを続けた場合の寿命が漠然と心配になったので CentOSの全ボリューム(/boot, swap, /)をUSBメモリにコピーしてUSBから起動するように変更しました。 OSにRaspberry Pi OSを使用していればSD Card Copierというツールで簡単にコピーできるようなのですが、 CentOSでは使用できないので、GitHubで公開されている rpi-clone というツールを使用しました。 rpi-cloneは実体としてはシェルスクリプトで、シェルの中でrsyncなどのコマンドが実行され、ボリュームがコピーされます。
なお、本当はUSB接続のSSDから起動するようにしたいのですが、途中でエラーになっているので追って原因調べます。
構成
サーバ・ハードウェア構成
ハードウェアはRaspberry Pi 4 Model Bのメモリ4GBモデルを利用しました。 ハードウェアスペックは以下のとおりです。
項目 | 内容 |
---|---|
SoC | Broadcom BCM2711 |
CPU | ARM Cortex-A72 1.5GHz |
GPU | Broadcom VideoCore VI Dual Core 500MHz |
メモリ | LPDDR4 SDRAM 4GB |
有線ネットワーク | Gigabit Ethernet |
microSDカード(システム用) ※コピー元 | Transcend microSDHCカード 32GB |
USBメモリ(システム用) ※コピー先 | SanDisk Ultra Fit 64GB (SDCZ43-064G-GAM46) |
ディスプレイ | LG 24ML600S-W |
キーボード | FILCO FKBC91MRL/JB2 |
マウス | Logicool M325 |
サーバ・ソフトウェア構成
OS
CentOS Linux release 8.2.2004 (Core)
※CentOS-Userland-8-aarch64-RaspberryPI-Minimal-4-sda.raw.xz
ソフトウェア・パッケージ
- rpi-clone 2.0.22
- rsync-3.1.3-12.el8.aarch64.rpm
- dosfstools-4.1-6.el8.aarch64.rpm
環境構築
インストール
rpi-cloneのダウンロード
GitHubのリポジトリからラズパイにgitコマンドでクローンします。
# cd ~/.
# git clone https://github.com/billw2/rpi-clone.git
Cloning into 'rpi-clone'...
remote: Enumerating objects: 180, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 180 (delta 0), reused 1 (delta 0), pack-reused 176
Receiving objects: 100% (180/180), 98.78 KiB | 2.10 MiB/s, done.
Resolving deltas: 100% (68/68), done.
# ls -l
合計 12
-rw-r--r--. 1 root root 134 9月 23 2020 README
-rw-r--r--. 1 root root 2486 9月 23 2020 anaconda-ks.cfg
drwxr-xr-x 3 root root 4096 6月 12 02:52 rpi-clone ←クローンしたリポジトリ
rpi-cloneの実行に足りないパッケージの確認
とりあえず試しにrpi-cloneを実行してみると、rsyncとdosfstoolsのパッケージが必要と表示されます。 標準出力を見ていると、足りないパッケージは自動でインストールしてくれるような動作に見えますが、 rpi-cloneはDebian系のRaspberry Pi OSを想定して作られていると思われるので、 apt-getコマンドが見つからなくて失敗しています(Red Hat系はapt-getではなくdnf(旧yum)なので)。
# cd rpi-clone/ # ./rpi-clone sda Command not found: rsync Package required: rsync ←足りない Command not found: fsck.vfat Package required: dosfstools ←足りない Do you want to apt-get install the packages? (yes/no): yes ./rpi-clone: 行 85: apt-get: コマンドが見つかりません ←Red Hat系のLinuxでは足りないパッケージを自動でインストールできない Booted disk: mmcblk0 31.3GB Destination disk: sda 480.1GB --------------------------------------------------------------------------- Part Size FS Label Part Size FS Label 1 /boot 286.0M fat16 -- 2 488.0M swap -- 3 root 28.4G ext4 _/ --------------------------------------------------------------------------- == Initialize: IMAGE partition table - partition number mismatch: 3 -> 0 == 1 /boot (53.5M used) : MKFS SYNC to sda1 2 : MKSWAP 3 root (5.5G used) : RESIZE MKFS SYNC to sda3 --------------------------------------------------------------------------- Run setup script : no. Verbose mode : no. -----------------------: ** WARNING ** : All destination disk sda data will be overwritten! -----------------------: Initialize and clone to the destination disk sda? (yes/no): yes Optional destination ext type file system label (16 chars max): ←[Enter]キーを押す Initializing Imaging past partition 1 start. => dd if=/dev/mmcblk0 of=/dev/sda bs=1M count=8 ... Resizing destination disk last partition ... Resize success. Changing destination Disk ID ... => mkfs -t vfat /dev/sda1 ... => mkswap /dev/sda2 => mkfs -t ext4 /dev/sda3 ... Destination disk has same Disk ID as source, changing it. Failed to set a new Disk ID. Syncing file systems (can take a long time) Syncing mounted partitions: Mounting /dev/sda3 on /mnt/clone mount: /mnt/clone: wrong fs type, bad option, bad superblock on /dev/sda3, missing codepage or helper program, or other error. Mount failure of /dev/sda3 on /mnt/clone. Aborting! ←rpi-cloneの実行に失敗する
rsyncパッケージのインストール
足りないパッケージの1つ目、rsyncをインストールします。
# dnf -y install rsync メタデータの期限切れの最終確認: 0:00:41 時間前の 2021年06月12日 23時30分38秒 に実施しました。 依存関係が解決しました。 ======================================================================================================================== パッケージ アーキテクチャー バージョン リポジトリー サイズ ======================================================================================================================== インストール中: rsync aarch64 3.1.3-12.el8 BaseOS 395 k トランザクションの概要 ======================================================================================================================== インストール 1 パッケージ ダウンロードサイズの合計: 395 k インストール済みのサイズ: 855 k パッケージのダウンロード: rsync-3.1.3-12.el8.aarch64.rpm 780 kB/s | 395 kB 00:00 ------------------------------------------------------------------------------------------------------------------------ 合計 404 kB/s | 395 kB 00:00 トランザクションの確認を実行中 トランザクションの確認に成功しました。 トランザクションのテストを実行中 トランザクションのテストに成功しました。 トランザクションを実行中 準備 : 1/1 インストール中 : rsync-3.1.3-12.el8.aarch64 1/1 scriptlet の実行中: rsync-3.1.3-12.el8.aarch64 1/1 検証 : rsync-3.1.3-12.el8.aarch64 1/1 インストール済み: rsync-3.1.3-12.el8.aarch64 完了しました!
dosfstoolsパッケージのインストール
足りないパッケージの2つ目、dosfstoolsをインストールします。
# dnf -y install dosfstools メタデータの期限切れの最終確認: 0:01:55 時間前の 2021年06月12日 23時30分38秒 に実施しました。 依存関係が解決しました。 ======================================================================================================================== パッケージ アーキテクチャー バージョン リポジトリー サイズ ======================================================================================================================== インストール中: dosfstools aarch64 4.1-6.el8 BaseOS 119 k トランザクションの概要 ======================================================================================================================== インストール 1 パッケージ ダウンロードサイズの合計: 119 k インストール済みのサイズ: 378 k パッケージのダウンロード: dosfstools-4.1-6.el8.aarch64.rpm 639 kB/s | 119 kB 00:00 ------------------------------------------------------------------------------------------------------------------------ 合計 191 kB/s | 119 kB 00:00 トランザクションの確認を実行中 トランザクションの確認に成功しました。 トランザクションのテストを実行中 トランザクションのテストに成功しました。 トランザクションを実行中 準備 : 1/1 インストール中 : dosfstools-4.1-6.el8.aarch64 1/1 scriptlet の実行中: dosfstools-4.1-6.el8.aarch64 1/1 検証 : dosfstools-4.1-6.el8.aarch64 1/1 インストール済み: dosfstools-4.1-6.el8.aarch64 完了しました!
microSDHCカードのCentOSの全データをUSBメモリにコピー
環境変数LANGの変更
rpi-cloneは途中の処理でコマンドの実行結果が英語で返ってくることを想定している場所があり、 環境変数LANGが日本語(ja_JP.utf8)になっているとそこで日本語が返ってきて処理が止まります。
■rpi-clone内の該当箇所
qprintf "x\ni\n0x$new_id\nr\nw\nq\n" | fdisk /dev/$dst_disk | grep changed
■期待する結果
Disk identifier changed from 0xe2613db0 to 0x8731d491.
■LANGがja_JP.utf8の時の結果
ディスク識別子を 0x8731d491 から 0x1d1f8095 に変更しました。
そのためrpi-cloneを実行するときだけ一時的に環境変数LANGを変更します。
# echo $LANG ja_JP.utf8 ←変更前の環境変数LANG # export LANG=en_US.UTF-8 ←環境変数LANGを一時的に英語に変更 # echo $LANG en_US.UTF-8 ←変更された
USBメモリのデバイス名の確認
rpi-cloneコマンドでは引数にコピー先となるUSBメモリのデバイス名 sdN を指定するため、 CentOSが認識しているブロックデバイスのデバイス名を表示して確認します。 結果 sda として認識していました。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 57.9G 0 disk ←コピー先のUSBメモリ └ sda1 8:1 1 57.9G 0 part mmcblk0 179:0 0 29.2G 0 disk ←コピー元のmicroSDHCカード ├ mmcblk0p1 179:1 0 286M 0 part /boot ├ mmcblk0p2 179:2 0 488M 0 part [SWAP] └ mmcblk0p3 179:3 0 28.4G 0 part /
rpi-cloneの実行
ここまでで準備が整ったのでrpi-cloneコマンドでmicroSDHCカードからUSBメモリへディスクのコピーを行います。
# ./rpi-clone sda Booted disk: mmcblk0 31.3GB Destination disk: sda 62.1GB --------------------------------------------------------------------------- Part Size FS Label Part Size FS Label 1 /boot 286.0M fat16 -- 1 57.8G fat32 -- 2 488.0M swap -- 3 root 28.4G ext4 _/ --------------------------------------------------------------------------- == Initialize: IMAGE partition table - partition number mismatch: 3 -> 1 == 1 /boot (53.5M used) : MKFS SYNC to sda1 2 : MKSWAP 3 root (5.1G used) : RESIZE MKFS SYNC to sda3 --------------------------------------------------------------------------- Run setup script : no. Verbose mode : no. -----------------------: ** WARNING ** : All destination disk sda data will be overwritten! -----------------------: Initialize and clone to the destination disk sda? (yes/no): yes Optional destination ext type file system label (16 chars max): ←[Enter]キーを押す Initializing Imaging past partition 1 start. => dd if=/dev/mmcblk0 of=/dev/sda bs=1M count=8 ... Resizing destination disk last partition ... Resize success. Changing destination Disk ID ...Re-reading the partition table failed.: Device or resource busy => mkfs -t vfat /dev/sda1 ... => mkswap /dev/sda2 => mkfs -t ext4 /dev/sda3 ... Syncing file systems (can take a long time) Syncing mounted partitions: Mounting /dev/sda3 on /mnt/clone => rsync // /mnt/clone with-root-excludes ... Mounting /dev/sda1 on /mnt/clone/boot => rsync /boot/ /mnt/clone/boot ... =============================== Done with clone to /dev/sda Start - 02:50:19 End - 02:55:56 Elapsed Time - 5:37 Cloned partitions are mounted on /mnt/clone for inspection or customizing. Hit Enter when ready to unmount the /dev/sda partitions ... ←[Enter]キーを押す unmounting /mnt/clone/boot unmounting /mnt/clone =============================== #
fstabのUUIDを変更
ここまでの手順で作成したUSBメモリからCentOSを起動しようとすると、 「random: crng init done」と出力されたところで起動処理が止まってしまいます。 原因は /boot/cmdline.txt や /etc/fstab に書かれているパーティションのUUIDが間違っていることのようです。 今回の手順に沿ってrpi-cloneを実行すると設定ファイル(/boot/cmdline.txt や /etc/fstab)の内容は 変更されずにmicroSDHCカードからUSBメモリへコピーされます。 しかしrpi-cloneの実行でUSBメモリ上にはUUIDの異なる新しいパーティションが作成されているので、 起動に必要なパーティションが見つからずに起動できない状況になっているようです。 rpi-cloneのオプションで -l を付けて実行するとうまくいきそうな気がしますが、 CentOSのfstabで使われていたのがPARTUUIDではなくUUIDだったので期待したとおりに自動で書き換わるのか分からず、 念の為自分で /boot/cmdline.txt と /etc/fstab を書き換えました。 先に /etc/fstab を書き換えます。
# cd /mnt/ # mkdir tmp-root ←マウントポイントの作成 # mount /dev/sda3 tmp-root ←USBメモリの / をマウント # cd /mnt/tmp-root/etc/ # cat fstab ←変更前のfstabを確認、UUIDが実体と合っていない UUID=e891abe4-4718-4773-bd36-a37261eda09c / ext4 defaults,noatime 0 0 UUID=215B-0A95 /boot vfat defaults,noatime 0 0 UUID=5ff09055-7eb5-4729-a82e-a26ccf6276b1 swap swap defaults,noatime 0 0 # blkid /dev/sda1 /dev/sda1: SEC_TYPE="msdos" UUID="D2DB-9C67" TYPE="vfat" PARTUUID="eeeed3e5-01" # blkid /dev/sda2 /dev/sda2: UUID="b5937b34-5701-4a04-81c9-83c5aa5feddb" TYPE="swap" PARTUUID="eeeed3e5-02" # blkid /dev/sda3 /dev/sda3: UUID="26be5edf-bea5-41ac-a747-b0b9d25639fd" TYPE="ext4" PARTUUID="eeeed3e5-03" # vi fstab
※以下、該当箇所のみ変更※ UUID=e891abe4-4718-4773-bd36-a37261eda09c / ext4 defaults,noatime 0 0 UUID=215B-0A95 /boot vfat defaults,noatime 0 0 UUID=5ff09055-7eb5-4729-a82e-a26ccf6276b1 swap swap defaults,noatime 0 0 ↓blkidの確認結果に合わせてUUIDを変更 UUID=26be5edf-bea5-41ac-a747-b0b9d25639fd / ext4 defaults,noatime 0 0 UUID=D2DB-9C67 /boot vfat defaults,noatime 0 0 UUID=b5937b34-5701-4a04-81c9-83c5aa5feddb swap swap defaults,noatime 0 0
# cd / # umount /mnt/tmp-root
cmdline.txtのデバイス名を変更
続いて /boot/cmdline.txt を書き換えます。 こちらはUUIDではなくパーティション名で書かれていますので、microSDHCカードのパーティション名から USBメモリのパーティション名に書き換えます。
# cd /mnt/ # mkdir tmp-boot ←マウントポイントの作成 # mount /dev/sda1 tmp-boot ←USBメモリの /boot をマウント # cd /mnt/tmp-boot/ # vi cmdline.txt
※以下、該当箇所のみ変更※ console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p3 rootfstype=ext4 elevator=deadline rootwait ↓変更 console=ttyAMA0,115200 console=tty1 root=/dev/sda3 rootfstype=ext4 elevator=deadline rootwait
# cd / # umount /mnt/tmp-boot
CentOSのシャットダウン
ここまででラズパイ上でUSBメモリからCentOSを起動するための準備が終わったので、 一度microSDHCカードから起動しているCentOSをシャットダウンします。
# shutdown -h 0
USBメモリからCentOSを起動
microSDHCカードの抜き取り
microSDHCカードのデータをUSBメモリにコピーしたのでCentOSの起動にmicroSDHCカードはもう使いません。 ラズパイから抜き取って保管しておきます。USBメモリは挿したままにします。
ラズパイの電源投入
ラズパイの電源を投入します。USBメモリからCentOSが起動します。 microSDHCカードからCentOSを起動していたときより多少高速化した気がします。 CentOS起動後はUSBメモリが常時かなり熱くなっています。 ほったらかしているだけで特に処理を実行しているわけではないのですが。。 以上で終了です。