Rocky Linux 第6回 「Raspberry Pi用のRocky LinuxをSSDにコピーする」

Raspberry Pi用のAlmaLinuxの場合、以前のバージョンではswapパーティションが100MBで作成されていましたが、2023年6月15日版ではパーティションが削除されてswapファイルに変更されています。

ところが、Raspberry Pi用のRocky Linuxの場合、現在使用できる2023年6月7日版のバージョン9.2においてもswapパーティションが作成されています。

例としてRocky Linux9.2のイメージを、250GBのSSDにコピーした場合には次のような状態となっています。

$ sudo parted /dev/sda print
Model: Generic External (scsi)
Disk /dev/sda: 250GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End    Size   Type     File system     Flags
 1      4194kB  304MB  300MB  primary  fat16           boot, lba
 2      304MB   816MB  512MB  primary  linux-swap(v1)  swap
 3      816MB   250GB  249GB  primary  ext4

そこで、ここではswapパーティションを削除してswapファイルとして構成して、bootパーティションも512MBに拡張した状態のSSDを作成していくことにします。

SSDのパーティションを作成

用意したSSDにパーティションを作成しますが、ここではpartedコマンドを使用してラベル形式はGPTではなく従来のMBR形式とすることにします。

SSDの最初にbootパーティションを512MB作成して、残りの領域は全てrootパーティションとして使用します。swapについてはパーティションではなくswapファイルを使うことにします。

Raspberry Pi 4で、mSDからRocky Linuxを起動してコピー用のSSDを装填してから次のコマンドを実行します。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 465.8G  0 disk 
mmcblk0     179:0    0    58G  0 disk 
├─mmcblk0p1 179:1    0   286M  0 part /boot
├─mmcblk0p2 179:2    0   488M  0 part [SWAP]
└─mmcblk0p3 179:3    0  57.2G  0 part /

ここでは例として500GBのSSDを接続しています。これが/dev/sdaとして認識されています。

実際にpartedコマンドでパーティションを作成します。

$ sudo parted /dev/sda mklabel msdos
$ sudo parted /dev/sda mkpart primary fat32 0% 512M   
$ sudo parted /dev/sda mkpart primary ext4 512M 100%

次のような内容でパーティションが作成されました。

$ sudo parted /dev/sda print
モデル: Realtek RTL9210B-CG (scsi)
ディスク /dev/sda: 500GB
セクタサイズ (論理/物理): 512B/16384B
パーティションテーブル: msdos
ディスクフラグ: 
番号  開始    終了   サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  512MB  511MB   primary                    lba
 2    512MB   500GB  500GB   primary

ファイルシステムの作成とラベルの設定

パーティションを作成したSSDにファイルシステムを作成してラベルを設定していきます。

今回ダウンロードした、2023年6月7日版のRocky Linuxでは、bootパーティションはラベル無しで、rootパーティションのラベルが_/となっています。

まず、ファイルシステムを作成します。

$ sudo mkfs.vfat -F 32 /dev/sda1
$ sudo mkfs.ext4 /dev/sda2

続けて、rootパーティションにe2labelコマンドでラベルをつけます。

$ sudo e2label /dev/sda2 "_/"

Rocky Linuxのrawイメージをマウントする

コピーする元となるRocky Linuxのイメージをダウンロードします。ここでは、Rocky Linux 第2回「Raspberry Pi 4にRocky Linuxをインストールする」で使用しているファイルを使用することにします。

$ wget https://dl.rockylinux.org/pub/sig/9/altarch/aarch64/images/RockyLinuxRpi_9-latest.img.xz

ダウンロードしたイメージをmSDにコピーしてから使用しても良いのですが、ここではrawイメージをループバックマウントして使うことにします。

まず、ダウンロードしたイメージがxz圧縮されていますから、これを解凍します。

$ xz -dv RockyLinuxRpi_9-latest.img.xz

暫くすると解凍されて.xzの拡張子が無いファイルとして作成されます。

前後の容量を見ると、478MBに圧縮されていたファイルが3.6GBになっています。

このイメージをマウントするために、デバイスマップを作成します。

$ sudo kpartx -av RockyLinuxRpi_9-latest.img
add map loop0p1 (254:0): 0 585728 linear 7:0 8192
add map loop0p2 (254:1): 0 999424 linear 7:0 593920
add map loop0p3 (254:2): 0 5469157 linear 7:0 1593344

/dev/mapperディレクトリーを見ると、loop0p1loop0p2loop0p3が作成されています。

$ ls /dev/mapper
control  loop0p1  loop0p2  loop0p3

またlosetupコマンドで、その様子を見ることもできます。

$ sudo losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                           DIO LOG-SEC
/dev/loop0
             0      0         0  0 /home/rocky/RockyLinux/RockyLinuxRpi_9-latest.img
                                                                         0     512

用意ができましたから、Rocky Linuxのイメージをマウントしてコピーして行きます。

SSDにbootパーティションの内容をコピー

ここでは、コピー用のSSDをマウントするディレクトリーを/mnt2として作成してからマウントすることにします。

$ sudo mkdir /mnt2
$ sudo mount /dev/mapper/loop0p1 /mnt
$ sudo mount /dev/sda1 /mnt2

Rocky Linuxのイメージのbootパーティションを/mntにマウントして、SSDのbootパーティションを/mnt2にマウントしています。

マウントしたSSDにRocky Linuxのbootパーティションの内容をコピーします。AlmaLinuxの場合と違い、Rocky Linuxでは最初からrsyncコマンドがインストールされています。

$ sudo rsync -avhP /mnt/ /mnt2/

コピーが終了したら、アンマウントします。

$ sudo umount /mnt2 /mnt

SSDにrootパーティションの内容をコピー

Rocky Linuxのイメージのrootパーティションを/mntにマウントして、先ほど作成した/mnt2ディレクトリーにSSDのrootパーティションをマウントします。

$ sudo mount /dev/mapper/loop0p3 /mnt
$ sudo mount /dev/sda2 /mnt2

Rocky Linuxのイメージでは、swapパーティションがあるためにrootパーティションは3番目のパーティションとして/dev/mapper/loop0p3になっています。

マウントしたSSDにRocky Linuxのrootパーティションの内容をコピーします。

$ sudo rsync -avhP --exclude /mnt/lost+found /mnt/ /mnt2/

コピーが終了したら、アンマウントします。

$ sudo umount /mnt2 /mnt

Rocky Linuxのrawイメージをアンマウントする

ここでは、Rocky Linuxのrawイメージをループデバイスを使用してマウントしていましたので、アンマウント後に解除しておきます。

$ sudo kpartx -d RockyLinuxRpi_9-latest.img

このコマンドは、先に使用したrawイメージファイルのある場所で実行する必要があります。途中でファイルを削除したりしないように注意しましょう。

$ ls /dev/mapper
control

/dev/mapperにも表示されなくなっています。

$ sudo losetup -l

lostupコマンドでも表示されなくなりました。

cmdline.txtファイルの修正

コピーしたSSDのbootパーティションにあるcmdline.txtファイルを修正します。

このファイルは、ブート時にPARTUUIDを使ってrootファイルシステムをマウントしています。そこで、SSDに作成したrootPARTUUIDを調べます。

$ sudo blkid /dev/sda2
/dev/sda2: LABEL="_/" UUID="d0dd7340-1d50-4797-9d1d-3933a6ad20c9" TYPE="ext4" PARTUUID="d8cacd71-02"

今回の例では、PARTUUUIDd8cacd71-02となっていますから、その内容でcmdline.txtファイルを修正します。

$ sudo mount /dev/sda1 /mnt
$ sudo vi /mnt/cmdline.txt
console=ttyAMA0,115200 console=tty1 root=PARTUUID=d8cacd71-02 rootfstype=ext4 elevator=deadline rootwait

ファイルの修正が終わったら、アンマウントしておきます。

$ sudo umount /mnt

/etc/fstabの修正

同様にして、コピーしたSSDのrootパーティションにある/etc/fstabファイルを修正します。

このファイルでは、ファイルシステムをマウントする際に先ほどのPARTUUIDではなくUUIDを使用しています。そこで、SSDに作成したパーティションのUUIDを調べます。

$ sudo blkid /dev/sda1
/dev/sda1: UUID="AD42-07B8" TYPE="vfat" PARTUUID="d8cacd71-01"

rootの場合は、先ほど調べたd0dd7340-1d50-4797-9d1d-3933a6ad20c9となっています。

$ sudo mount /dev/sda2 /mnt
$ sudo vi /mnt/etc/fstab
UUID=d0dd7340-1d50-4797-9d1d-3933a6ad20c9  / ext4    defaults,noatime 0 0
UUID=AD42-07B8  /boot vfat    defaults,noatime 0 0
## UUID=e92e62d3-b879-414d-97cb-47904a256f15  swap swap    defaults,noatime 0 0

ここで、元々あったswapパーティション用の行はコメントアウトしています。

ファイルの修正が終わったら、アンマウントします。

SELinuxの無効化

Raspberry Pi OSのように通常のディストリビューションであれば、これまでの設定で起動して使用できるようになるのですがRocky LinuxはRHEL互換のディストリビューションとして、既定値でSELinuxが有効化されています。

そのために、ファイルを修正した影響で起動した後でログインできなくなってしまいます。そこで、SELinuxを無効化しておきます。そのためには、先ほど修正したcmdline.txtファイルにselinux=0のパラメーターを追加します。

$ sudo mount /dev/sda1 /mnt
$ sudo vi /mnt/cmdline.txt
console=ttyAMA0,115200 console=tty1 root=PARTUUID=d8cacd71-02 rootfstype=ext4 elevator=deadline rootwait selinux=0
$ sudo umount /mnt

これで、起動した後にログインできるようになります。

:ここでは、一時的にSELinuxを無効化していますが、Raspberry Pi での使用を想定していることもあり、そのまま使用することも出来る場合も多いかと思われます。

 ただし、再度SELinuxを有効化する場合には、上記で追加したselinux=0のパラメーターをcmdline.txtファイルから削除してから再起動します。

 それで自動的に再ラベル付けが行われますから、SELinuxを有効化して使用することができるようになります。ただし、再ラベル付の際には、パラメーターを変更直後のブート時に相応の時間が必要となる点には注意して下さい。

参考7.3 SELinuxの必要な状態の確認  RHEL 9 ドキュメント

コピーしたSSDから起動する

準備ができたら、mSDから起動していたRocky Linuxを停止してmSDを取り外します。

コピーしたSSDだけをRaspberry Piに接続して、電源を投入して起動します。

無事に起動してユーザー名:rocky、パスワード:rockylinuxでログインしたら、第2回「Raspberry Pi 4のRocky Linuxをインストールする」第3回「Raspberry Pi 4のRocky Linuxを日本語化する」で、これまで実施して来たような初期設定の作業としてパスワードの変更、ホスト名の設定、Wi-Fiへの接続から、ソフトウェアパッケージの更新、日本語化などを必要に応じて実施して行きます。

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