Raspberry Pi用のAlmaLinuxのイメージの、以前のバージョンではswapパーティションが100MBあったりして不便だったのですが2023年6月15日版ではパーティションが削除されてswapファイルに変更されています。それにもまして、bootパーティションが約300MBでAlmaLinuxのカーネルイメージはgzip圧縮されていないこともあり、パッケージの更新時に幾つかのバージョンのカーネルが使われると残り容量が少なくて困る場合などがあります。
そこで、bootパーティションを512MBに拡張したSSDを作成してAlmaLinuxのファイルをコピーして使うことにしようと思います。
注:AlmaLinuxでは、RHEL互換として既定値でSELinuxが有効化されています。そのため、この記事のようにファイルを修正した場合ログインできなくなりますので、一旦SELinuxをDsiabledに設定してから起動します。具体的には、cmdline.txtファイルを編集する際に最後にselinux=0を追加してから起動します。
起動してログインしてからであれば、必要に応じてSELinuxを有効化することができます。その場合には、先に追加していたcmdline.txtファイルからselinux=0の設定を削除してから再起動します。 2023/09/01追記
SSDのパーティションを作成
用意したSSDにパーティションを作成しますが、ここではpartedコマンドを使用してラベル形式はGPTではなく従来のMBR形式とすることにします。
SSDの最初にbootパーティションを512MB作成して、残りの領域はすべてrootパーティションとして使用します。swapについてはパーティションではなくswapfileを使うことにします。
Raspberry Pi 4で、mSDからAlmaLinuxを起動してコピー用のSSDを装填してから次のコマンドを実行します。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 232.9G 0 disk
mmcblk0 179:0 0 58G 0 disk
├─mmcblk0p1 179:1 0 286M 0 part /boot
└─mmcblk0p2 179:2 0 57.7G 0 part /
ここでは例として250GBのSSDを装填しています。これが/dev/sdaとして認識されています。
$ 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
モデル: Generic External (scsi)
ディスク /dev/sda: 250GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
番号 開始 終了 サイズ タイプ ファイルシステム フラグ
1 1049kB 512MB 511MB primary lba
2 512MB 250GB 250GB primary
ファイルシステムの作成とラベルの設定
パーティションを作成したSSDにファイルシステムを作成してラベルを設定していきます。
2023年6月15日版のAlmaLinuxでは、bootパーティションのラベルがCIDATAで、rootパーティションのラベルが_/となっています。
まず、ファイルシステムを作成します。
$ sudo mkfs.vfat -n CIDATA -F 32 /dev/sda1
$ sudo mkfs.ext4 /dev/sda2
bootパーティションに作成したファイルシステムでは、mkfsコマンドでラベルをつけていますが、rootパーティションはe2labelコマンドでラベルをつけます。
$ sudo e2label /dev/sda2 "_/"
AlmaLinuxのrawイメージをマウントする
コピーする元となるAlmaLinuxのイメージをダウンロードします。ここでは、「第8回 Raspberry Pi 4にAlmaLinux(GNOME版)をインストールする」で使用しているGNOME版を使うことにします。
$ wget https://repo.almalinux.org/almalinux/9/raspberrypi/images/AlmaLinux-9-RaspberryPi-GNOME-9.2-20230615.aarch64.raw.xz
ダウンロードしたイメージをmSDにコピーしてから使用しても良いのですが、ここではrawイメージをループバックマウントして使うことにします。
まずダウンロードしたイメージがxz圧縮されていますから、これを解凍します。
$ xz -dv AlmaLinux-9-RaspberryPi-GNOME-9.2-20230616.aarch64.raw.xz
暫くすると解凍されて.xzの拡張子が無いファイルとして作成されます。
前後の容量を見ると、849MBに圧縮されていたファイルが4.8GBになっています。
このイメージをマウントするためにデバイスマップを作成します。
$ sudo kpartx -av AlmaLinux-9-RaspberryPi-GNOME-9.2-20230615.aarch64.raw
add map loop1p1 (254:0): 0 976896 linear 7:1 8192
add map loop1p2 (254:1): 0 8593408 linear 7:1 985088
/dev/mapperディレクトリーを見るとloop0p1Pとloop0p2が作成されています。
$ ls /dev/mapper
control loop0p1 loop0p2
またlosetupコマンドで、その様子を見ることもできます。
$ sudo losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0
0 0 0 0 /home/alma/AlmaLinux/AlmaLinux-9-RaspberryPi-GNOME-9.2-20230615.aarch64.raw 0 512
用意ができましたから、AlmaLinuxのイメージをマウントしてコピーして行きます。
SSDにbootパーティションの内容をコピー
ここでは、コピー用のSSDをマウントするディレクトリーを/mnt2として作成してからマウントすることにします。
$ sudo mkdir /mnt2
$ sudo mount /dev/mapper/loop0p1 /mnt
$ sudo mount /dev/sda1 /mnt2
AlmaLinuxのイメージのbootパーティションを/mntにマウントして、SSDのbootパーティションを/mnt2にマウントしています。
マウントしたSSDにAlmaLinuxのbootパーティションの内容をコピーします。ここで使っているrsyncコマンドは、「第9回 AlmaLinuxでRaspberry Pi用のvcgencmdをビルドする」でインストールしていました。
$ sudo rsync -avhP /mnt/ /mnt2/
コピーが終了したら、アンマウントします。
$ sudo umount /mnt2 /mnt
SSDにrootパーティションの内容をコピー
AlmaLinuxのイメージのrootパーティションを/mntにマウントして、先ほど作成した/mnt2ディレクトリーにSSDのrootパーティションをマウントします。
$ sudo mount /dev/mapper/loop0p2 /mnt
$ sudo mount /dev/sda2 /mnt2
マウントしたSSDにAlmaLinuxのrootパーティションの内容をコピーします。
$ sudo rsync -avhP --exclude /mnt/lost+found /mnt/ /mnt2/
コピーが終了したら、アンマウントします。
$ sudo umount /mnt2 /mnt
AlmaLinuxのrawイメージをアンマウントする
ここでは、AlmaLinuxのrawイメージをループデバイスを使用してマウントしていましたので、アンマウント後に解除しておきます。
$ sudo kpartx -d Almalinux-9-RaspberryPi-GNOME-9.2-20230615.aarch64.raw
このコマンドは、先に使用した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="ace77ceb-4029-4a9d-a4b6-4d6e72661287" TYPE="ext4" PARTUUID="20fa30a4-02"
今回の例では、PARTUUIDが20fa30a4-02となっていますから、その値でcmdline.txtファイルを修正します。
$ sudo mount /dev/sda1 /mnt
$ sudo vi /mnt/cmdline.txt
console=ttyAMA0,115200 console=tty1 root=PARTUUID=20fa30a4-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: LABEL_FATBOOT="CIDATA" LABEL="CIDATA" UUID="580A-12BD" TYPE="vfat" PARTUUID="20fa30a4-01"
rootの場合は、先ほど調べたace77ceb-4029-4a9d-a4b6-4d6e72661287となっています。
$ sudo mount /dev/sda2 /mnt
$ sudo vi /mnt/etc/fstab
UUID=ace77ceb-4029-4a9d-a4b6-4d6e72661287 / ext4 defaults,noatime 0 0
UUID=580A-12BD /boot vfat defaults,noatime 0 0
/swapfile none swap defaults 0 0
ここで、blkidコマンドで値を調べる場合にもUUIDとPARTUUIDがありますから間違えないようにしましょう。
ファイルの修正が終わったら、アンマウントしておきます。
$ sudo umount /mnt
cloud-init用の設定
ここまでの内容で、AlmaLinuxをSSDから起動して動かせるようになっていますが、「第3回 Raspberry Pi 4でAlmaLinuxのcloud-initを利用」などで見てきたようにcloud-init用の設定も追加しておくことにします。
$ sudo mount /dev/sda1 /mnt
$ sudo vi /mnt/user-data
bootパーティション用のuser-dataファイルを次のような内容に編集します。
#cloud-config
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 AAAA(中略)OBY6
locale: ja_JP.utf8
timezone: Asia/Tokyo
runcmd:
- localectl set-keymap jp
- [ sh, -c, sleep 3 && nmcli dev wifi connect "SSID" password "パスワード" ]
ホスト名、ユーザーとssh用の公開鍵を設定して、ロケール、タイムゾーン、キーボード配列を日本語用に設定してから、Wi-Fi接続用の設定をしています。
ここではパスワードを、配布されているAlmaLinuxと同じ内容で書いていますが、「第3回 Raspberry Pi 4でAlmaLinuxのcloud-initを利用」のパスワードの設定にあるように実際に使用するパスワードに変更して下さい。
設定ができたら、アンマウントしておきます。
$ sudo umount /mnt
コピーしたSSDから起動する
準備ができたら、mSDから起動したAlmaLinuxを停止してmSDを取り外します。
コピーしたSSDだけをRaspberry Piに装填して、電源を投入して起動します。
無事に起動してログインしたら、パッケージを更新してから日本語環境用のパッケージも追加インストールしておきます。
$ sudo dnf upgrade -y
$ sudo dnf install -y glibc-langpack-ja langpacks-ja
$ sudo dnf clean all
インストール済みのすべてのパッケージを更新しましたから、再起動しておきます。ここでは、キャッシュなどを削除しています。
$ sudo reboot
まとめ
今回は、例としてSSDにbootパーティションを512MBで作成してAlmaLinuxをコピーしました。このような方法で、任意のパーティションサイズでAlmaLinuxを利用することができるようになりますから、大容量のストレージを使用する際にも便利になるのではないでしょうか。