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
ディレクトリーを見ると、loop0p1
、loop0p2
、loop0p3
が作成されています。
$ 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に作成したroot
のPARTUUID
を調べます。
$ sudo blkid /dev/sda2
/dev/sda2: LABEL="_/" UUID="d0dd7340-1d50-4797-9d1d-3933a6ad20c9" TYPE="ext4" PARTUUID="d8cacd71-02"
今回の例では、PARTUUUID
がd8cacd71-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への接続から、ソフトウェアパッケージの更新、日本語化などを必要に応じて実施して行きます。