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を利用することができるようになりますから、大容量のストレージを使用する際にも便利になるのではないでしょうか。