Grub2 + ループバック + LVM

Grub2 + ループバック + LVM

起動がUSBドライブにあるループバックファイルホスティングLVMパーティションからシステムを起動したいと思います。

LVM以外の設定とext4ループバックファイルを使用すると正しく起動しますが(オンラインにはいくつかのガイドがあります)、さらに必要です... LVMが必要です!

私のパーティションレイアウトは次のとおりです

  • USBドライブ(MBR):Grub 2
  • USBドライブ(hd0、msdos1): ext4 512Mb /boot
  • ノートブック内部ディスク:ホスト.linux-loops/system0.lvmオペレーティングシステムをインストールしてファイルにマッピングしました。/dev/mapper/vg_system-lv_root

私のGrub 2メニュー項目は次のとおりです。

set BOOT_PART=(hd0,msdos1)
set HOST_PART=(hd1,gpt5)
set LOOP_FILE=.linux-loops/system0.lvm
set LOOP_DEV=loop0
set LVM_VG=vg_system
set LVM_LV=lv_root
set ROOT_DEV=/dev/mapper/${LVM_VG}-${LVM_LV}

menuentry 'Loopback / 4.10.0-38-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    echo "Initializing environment..."

    set KERN_VER=4.10.0-38-generic

    recordfail  load_video  gfxmode $linux_gfx_mode

    echo "Loading partition drivers..."

    insmod ext2
    insmod gzio
    insmod part_msdos
    insmod part_gpt

    echo Loopback(s) setup...

    loopback ${LOOP_DEV} ${HOST_PART}/${LOOP_FILE}
    insmod lvm

    echo Debug LVM...
    ls
    ls (lvm/${LVM_VG}/${LVM_LV)/

    echo "Loading kernel..."

    set root=${BOOT_PART}

    linux   /vmlinuz-${KERN_VER} root=${ROOT_DEV} rw verbose nosplash debug
    initrd /initrd.img-${KERN_VER}

}

二人はエルエスデバッグコマンドは、grubがLVMパーティションをチェックしたことを示していますが、初期化プログラム実行すると、システムはグループを表示します。ボリュームグループシステム見つかりませんでしたLVメタデータまだ実行されていません。

grubスクリプト内のループバック設定がinitスクリプトに伝播できないため、LVMマッパーを再初期化できないようです。

LVMではなくシナリオで(上記のように)vmlinuz...ループ=...問題を解決しました。

質問は:grubがLVMマッパーにループバックファイルを提供できるようにループバックファイルをどのように設定しますか?

とても感謝しています!

答え1

あなたは正しいです。 GRUB はカーネルの代わりに設定できません。

GRUBはディスクアクセスにシステムファームウェア(BIOSまたはUEFI)を使用するため、実行するすべての操作はこれらのファームウェアルーチンに基づいています。カーネルが引き継がれると、これらのファームウェアルーチンは廃止され、OSが同じタスク用に独自のドライバを提供するまで、その上に構築されたものはすべて使用できなくなります。

(BIOSに関する限り、カーネルがプロセッサをフル32/64ビットモードに変換すると、16ビットのBIOSディスクアクセスルーチンは使用できなくなります。UEFIに関する限り、ディスクアクセスサービスは次のいずれかであると思います。UEFI機能は標準です」ブートサービスの終了" UEFI呼び出しを実行して、ハードウェア制御をUEFI側のオペレーティングシステムに渡すプロセスを完了すると、使用できなくなります。

代わりに、非常に早い段階でinitrdで実行されるスクリプトを設定する必要があります。 LVMが起動する前、またはLVMが起動されている場合、またはすでに初期化されている場合は、ループバックデバイスを設定した後に必要なループバックデバイスを有効にする必要がありvgscan --mknodesますvgchange -ay <name of the VG containing the root filesystem>

使用しているLinuxディストリビューションの名前とバージョンがわからない場合は、より具体的なアドバイスをするのが難しくなります。

答え2

私のソリューションをGitHubに公開しました。

このガイドでは、PCの内部ディスクの起動セクタを変更せずにLVMループバックディスクにLinuxをインストールし、USBドライブ(grubと起動パーティション)から起動する方法について詳しく説明します。

関連部分はこれですhttps://github.com/antonio-petricca/buddy-linux/blob/master/assets/initramfs/lvm-loops-setupスクリプト:

#!/bin/sh -e

# Antonio Petricca <[email protected]> - 17/03/2018

PREREQS=""

# Output pre-requisites

prereqs() {
    echo "$PREREQ" }

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;; esac

. /scripts/functions

MNT=/host ROOT_MNT=${rootmnt}${MNT}

_log_msg "Moving LVM loops host device mount point from \"${MNT}\" to {ROOT_MNT}\"...\n"

mount -o remount,rw ${rootmnt} || panic "Cannot remount \"${rootmnt}\" R/W."

[ -d ${ROOT_MNT} ] || mkdir -p ${ROOT_MNT} || panic "Cannot create \"${ROOT_MNT}\" mount point."

mount -n -o move ${MNT} ${ROOT_MNT} || panic "Cannot move \"${MNT}\" to \"${ROOT_MNT}\"."

log_end_msg "Done"

関連情報