initramfs の squashfs パーティションの予測可能なパーティション名

initramfs の squashfs パーティションの予測可能なパーティション名

長い話を短く:予測可能なパーティション名を使用してinitramfsからsquashfsパーティションを起動するには?/dev/sda2デバイス名がランダムに並べ替えられ、時には間違ったパーティションから起動するため、機能しません。


私たちは次のようにGentooのカスタムインストールを使用します。

/dev/sda1: /boot   ext4 (unencrypted)
/dev/sda2: /       squashfs (unencrypted)
/dev/sda3: /home   ext4 (dm-crypt)
/dev/sda4: -       swap

ルートパーティションとtmpfsをオーバーレイファイルシステムとしてマウントするカスタムinitramfsスクリプトを作成しました。我々は使用したこのガイド次のようになります。

#!/bin/busybox sh
mount -t proc none /proc
mount -t sysfs none /sys

# Mount the root filesystem.
mount -t squashfs -o ro /dev/sda2 /mnt/overlay
# (some stuff to set up the overlay with tmpfs is done here)

# Clean up. 
umount /proc
umount /sys

# Boot the real thing.
exec switch_root /mnt/overlay /sbin/init

このディスクがシステムの唯一のディスクである限り、ディスクが1つしか/dev/sda2ないシステムでは常にルートパーティションであるため、正しく起動され、すべてがうまく機能します。

このカスタムインストールは別の都市に出荷される予定なので、自動更新システムを開発しています。理想的には、顧客がUSBスティックを挿入してアップデートが完了するのを待つだけで、システムをアップデートできるはずです。インターネット経由のアップデートはオプションではありません。データを安全に保つことが最優先事項であり、私たちが選んだパーティショニング方式が私たちの要件に十分安全であると信じています。しかし、問題解決を意味するなら、新しいアイデアで開かれています。

USBフラッシュドライブアップデートシステムは元のGentooインストールのコピーであり、まったく同じパーティションスキームを使用します。しかし、USBスティックのinitramfsスクリプトが台無しになり、USBアップデートプログラムのルートではなく、元のインストールのルートを選択することがよくあります。明らかに、アップデートプログラム(USBドライブのルートディレクトリにあります)はこのようには実行されません。

/dev/sda2USBスティックのinitramfsスクリプトを次のように置き換えてみました。

  1. /dev/disk/by-id/usb*part2、GRUB2メニューではすでに機能しますが、/dev/disk現在は存在しないため、initramfsスクリプトでは機能しません。 (しかしなぜGRUBに存在するのですか?)
  2. $(findfs PARTUUID="partid-of-usb-squashfs-root")、役に立たない
  3. $(findfs UUID="x")、これはsquashfsパーティションにファイルシステムUUIDがある場合に機能します(ext4および他のファイルシステムで動作します)。

このガイドでは、devtmpfsまたはmdevを使用して初期化時にデータを入力することをお勧めしますが、これがudevの作業のように見え、initramfsスクリプトから起動するのは役に立たないようです/dev/dev/diskdevtmpfs

ルートパーティションにファイルシステムUUIDがない場合にinitramfsスクリプトから予測可能/永続パーティション名を取得するにはどうすればよいですか?

パーティションスキームを変更するのは少し難しく、通常のWindowsユーザーがsquashfsルートまたは/homeパーティションを表示したくありません。しかし、毎回同じパーティションから確実に起動できる他の方法がある場合は、試してみましょう。 LVMや私たちが考えていないことをやってみてください。

ベストアンサー1

このために特別なツールに頼る必要はありません。

squashfsパーティションは、常にパーティションスキームの2番目のパーティションであることを知っていれば十分です。 pendriveの最初のパーティションのUUIDを設定し、$(findfs UUID=first-pendrive-partition)結果を使用して実行するだけです。sed s/1/2/

システムは常に正しいパーティションを検出します。

おすすめ記事