lz4 압축 커널을 사용하는 Xen pvgrub

lz4 압축 커널을 사용하는 Xen pvgrub

저는 xen 4.11에서 PV 게스트를 실행하기 위해 pvgrub을 사용하고 있습니다. 최근 우분투 릴리스(>19.04)는 lz4 압축 커널로 전환한 것 같습니다. 이러한 커널은 직접 부팅하면 제대로 작동하지만 pvgrub 및 pvgrub2에서는 부팅되지 않는 것 같습니다.

우분투 포커스 최신 버전 20.04. 게스트 커널 5.4.0-28.

error: not xen image.                [ vmlinuz-5.4.0-28-gen  10B  0%  0.17B/s ]
error: you need to load the kernel first.

Press any key to continue...

이전 커널(예: 4.19)에서도 동일한 설정이 작동합니다.

xen 자체에 문제가 있음을 발견했습니다. pvgrub에서 작동하도록 이러한 커널을 얻은 사람이 있습니까?

답변1

xen-users 메일링 리스트에 있는 Andy의 제안 덕분에 임시 해결책이 생겼습니다. lz4는 아직 지원하지 않는 것 같습니다.

Ubuntu PV 게스트의 경우 extract-vmlinux를 사용하여 설치 중에 커널을 추출하는 적절한 후크로 다음을 작성했습니다. https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux

후크는 어딘가에서 Linux를 추출하고(나는 /usr/local/bin을 사용함) /etc/kernel/postinst.d/로 이동해야 합니다.

#!/bin/bash

KERNEL_VERSION="$1"
KERNEL_PATH="$2"

# extract-vmlinux is in /usr/local/bin
PATH="${PATH}:/usr/local/bin"

# Ensure we have the extract-linux tool
if ! command -v extract-vmlinux > /dev/null; then
        echo >&2 "Command 'extract-vmlinux' is not available (https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux),  Aborting"
        exit 1
fi

# The KERNEL_PATH must be valid
if [ ! -f "${KERNEL_PATH}" ]; then
        echo >&2 "Kernel file '${KERNEL_PATH}' not found. Aborting"
        exit 1
fi

# Create a temp file
TEMP_FILE=$(mktemp /tmp/decompress-kernel-XXXXX)
trap "rm -f ${TEMP_FILE}" 0

# If the given kernel file is still a bzimage see if its needs decompression
if echo "$(file -b "${KERNEL_PATH}")" | grep -q "^Linux kernel x86 boot executable bzImage"; then

        # Kernel is probably lz4 if there are lz4 headers in it
        LZ4_HEADER="$(printf '\002!L\030')"
        if ! grep -aqo "${LZ4_HEADER}" ${KERNEL_PATH}; then
                echo "No lz4 compression headers found, skipping..."
                exit 0
        fi

        echo "Decompressing '${KERNEL_PATH}'..."
        # Extract the kernel and replace existing if successful
        if extract-vmlinux ${KERNEL_PATH} > ${TEMP_FILE}; then

                # Double check the kernel is a valid ELF image
                if ! readelf -h ${TEMP_FILE} > /dev/null; then
                        echo >&2 "Decompression of kernel file '${KERNEL_PATH}' failed!, not a valid ELF image"
                        exit 1
                fi

                echo "Decompression of kernel file '${KERNEL_PATH}' successful"
                cp -v ${TEMP_FILE} ${KERNEL_PATH}

        else
                echo >&2 "Decompression of kernel file '${KERNEL_PATH}' failed!"
                exit 1
        fi

# Perhaps its already been decompressed
elif echo "$(file -b "${KERNEL_PATH}")" | grep -q "^ELF 64-bit LSB executable"; then
        echo "Kernel file '${KERNEL_PATH}' appears to be decompressed already. skipping"

else
        echo >&2 "Unable to determine the state of kernel file '${KERNEL_PATH}'"
        exit 1
fi

관련 정보