第10回 Raspberry Pi用のAlmaLinuxをSSDにコピーする

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ディレクトリーを見るとloop0p1Ploop0p2が作成されています。

$ 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に作成したrootPARTUUIDを調べます。

$ sudo blkid /dev/sda2
/dev/sda2: LABEL="_/" UUID="ace77ceb-4029-4a9d-a4b6-4d6e72661287" TYPE="ext4" PARTUUID="20fa30a4-02"

今回の例では、PARTUUID20fa30a4-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コマンドで値を調べる場合にもUUIDPARTUUIDがありますから間違えないようにしましょう。

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

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

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