내 initrd에는 압축 해제 후 '커널'인 디렉토리가 하나만 있습니다.

내 initrd에는 압축 해제 후 '커널'인 디렉토리가 하나만 있습니다.

파일은 블록 크기 56을 보여줍니다. 저는 Ubuntu 16.04를 사용하고 있으며 커널을 업데이트할 필요가 없는 솔루션이 필요합니다.

답변1

이름은 으로 지정될 수 있지만 initrd실제로는 입니다 initramfs.종속여러 개의 cpio아카이브(각각은 압축되거나 압축되지 않을 수 있음) 아마도 첫 번째 부분만 추출했을 것입니다.

initramfs 파일을 추출하는 올바른 절차

보다 구체적으로 첫 번째 cpio 섹션은 일반적으로 "Early Microcode Update"이며 Intel 프로세서의 경우 경로 이름은 입니다 kernel/x86/microcode/GenuineIntel.bin. 을 실행하면 cpio -iv /boot/initrd.img-<kernel version>추출되는 내용이 전부입니다. (마이크로코드는 암호화되어 있기 때문에 일반적으로 압축을 하지 않기 때문에 전혀 압축이 되지 않습니다.)

Debian/Ubuntu 시스템에서 최신 initramfs를 완전히 추출하려면 이 명령을 사용해야 합니다 unmkinitramfs.

어떤 이유로든 명령을 사용할 수 없는 경우 다음과 같이 수동으로 실행할 수 있습니다.

mkdir /some/temporary/directory
cd /some/temporary/directory
cat /boot/initrd.img-$(uname -r) | (cpio -iv; zcat | cpio -iv; file -)

initramfs에는 두 부분만 있다고 가정합니다.

아이디어는 이 cat명령이 대괄호 안의 명령에 처음부터 끝까지 내용을 출력한다는 것입니다. 그중 첫 번째는 cpio파일의 시작 부분을 가져오고 초기 마이크로코드 업데이트를 추출합니다. 완료되면 첫 번째 명령이 중단된 지점부터 다음 명령이 계속됩니다. 두 번째 압축된 cpio 아카이브가 끝나면 file -명령은 더 많은 아카이브가 있는지 확인합니다.

추출된 출력의 마지막 줄이 다음과 같은 경우아니요

/dev/stdin: empty

...그러면 initramfs 파일에 더 많은 내용이 있다는 것을 알게 될 것이며, file명령 출력을 통해 파일이 압축되었는지 여부를 알 수 있습니다. 그런 다음 명령 앞에 괄호 안에 다른 cpio -iv;또는 요소를 추가합니다.zcat | cpio -iv;file

예를 들어, 초기 마이크로코드 업데이트 후 두 개의 압축된 부분이 포함된 세 부분으로 구성된 initramfs를 추출하려면 다음을 수행하십시오.

cat /boot/initrd.img-$(uname -r) | (cpio -iv; zcat | cpio -iv; zcat | cpio -iv; file -)

initrd 크기가 실제로 56 블록인 경우

이 경우 initrd 생성 프로세스가 실패할 수 있습니다. 당신은 그것을 사용할 수 있습니다

sudo update-initramfs -u

현재 커널과 모듈을 기반으로 재생성하도록 시스템에 지시합니다. 이는 또한 시스템 시작 초기(실제 루트 파일 시스템이 마운트되기 전)에 발생해야 하는 작업에 영향을 미칠 수 있는 구성 변경 후에 실행하기에 좋은 명령입니다.

관련 정보