OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

Raspberry Pi 4BのmicroSDHCカードへインストールしたCentOS 8.2をrpi-cloneでUSBメモリへコピーして起動する

カテゴリ:OSSセットアップ | ソフトウェア:Linux | タグ:
最終更新日: | 公開日:2021/07/13

目次

概要

 ずっと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モデルを利用しました。 ハードウェアスペックは以下のとおりです。

■ハードウェアスペック
項目内容
SoCBroadcom BCM2711
CPUARM Cortex-A72 1.5GHz
GPUBroadcom 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
ファイル名:/mnt/tmp-root/etc/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
ファイル名:/mnt/tmp-boot/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メモリが常時かなり熱くなっています。 ほったらかしているだけで特に処理を実行しているわけではないのですが。。 以上で終了です。

参考にしたサイト