".img" 백업에서 Linux 버전을 추출하는 방법은 무엇입니까?

".img" 백업에서 Linux 버전을 추출하는 방법은 무엇입니까?

간단히 말해서:

시스템 백업에서 VERSION, SUVERSION 및 PATCHLEVEl 번호를 추출하는 방법은 무엇입니까 .img? 루트 권한이 없는 것이 가장 좋습니다.

확장:

다음 페이지에서:

https://www.raspberrypi.org/downloads/raspbian/

ARM 기반 Debian/Raspian 시스템의 전체 시스템 백업을 나타내는 zipDebian 추출을 제공합니다 ..img

커스텀 커널을 생성하기 위해서는 시스템의 VERSION, SUVERSION, PATCHLEVEL을 알아야 하는데, 이는 일반적인 커널에서 제공하는 정보와 동일하다.

$ uname -r
4.9.0-3-amd64

가장 쉬운 방법은 시스템을 직접 로드하고 명령을 실행하는 것이지만 이 경우에는 작동하지 않습니다.

표적:

미러링된 커널을 패치하고 크로스 컴파일해야 합니다. 내 의도는 커널이 업데이트될 때 추가로 "쉽게" 적용될 수 있도록 이 프로세스에 대한 스크립트를 만드는 것입니다.

답변1

이것이 디스크 이미지라고 생각한다면 새 커널로 "이미지를 패치"하는 것은 매우 어려울 것입니다. 왜냐하면 실제 커널 파일뿐만 아니라 커널에 인코딩된 나머지 파일 시스템도 고려해야 하기 때문입니다. 조각화로 인해 커널이 디스크에 연속적으로 저장되지 않을 수 있습니다. 최신 커널이 더 크거나 작을 경우 그에 따라 이미지의 파일 시스템을 업데이트해야 합니다.

추출하려는 변수에 대해 어떻게든 전체 이미지를 검색하더라도 히트가 이미지 파일 시스템에 실제로 존재하는 파일에서 나오는지, 아니면 더 이상 참조되지 않는 오래된 파일에서 나오는지 알 수 없습니다.

가장 좋은 조언은 이미지를 마운트하고 업데이트하거나 SD 카드에 쓰고 업데이트하고 다시 생성하는 것입니다.

어떻게든 이미지를 마운트하지 않고 이 작업을 수행하는 경우 시뮬레이션된 파일 시스템을 포함해야 합니다.

답변2

이것은 2017-09-07-raspbian-stretch-lite.img사이트의 이미지에 작동하는 것 같습니다.

$ sudo kpartx -rva 2017-09-07-raspbian-stretch-lite.img
add map loop0p1 (252:19): 0 85622 linear 7:0 8192
add map loop0p2 (252:20): 0 3528040 linear 7:0 94208
$ sudo mount -r /dev/mapper/loop0p1 mnt
$ LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}
  ' < mnt/kernel.img | gunzip | grep -aPom1 'Linux version \S+'
Linux version 4.9.41+

( \37\213\10\0gzip 압축 데이터의 시작 위치를 식별합니다).

루트가 아닌 사용자로서 이미지의 첫 번째 파티션이 항상 4MiB라고 가정하고 GNU를 사용하여 mtools해당 vfat 파티션에서 추출합니다.kernel.img

$ MTOOLS_SKIP_CHECK=1 mtype -i 2017-09-07-raspbian-stretch-lite.img@@4M ::kernel.img|
  LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}' |
  gunzip | grep -aPom1 'Linux version \K\S+'
4.9.41+

그렇지 않은 경우 /dev/fd이를 지원하는 시스템(및 GNU grep)에서:

MTOOLS_SKIP_CHECK=1 MTOOLSRC=/dev/fd/3 mtype z:kernel.img \
  3<< EOF 4< 2017-09-07-raspbian-stretch-lite.img |
drive z:
  file="/dev/fd/4"
  partition=1

EOF
  LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}' |
  gunzip | grep -aPom1 'Linux version \K\S+'

(다른 시스템에서는 임의의 파일 이름을 더 쉽게 수용할 수 있도록 를 file="2017-09-07-raspbian-stretch-lite.img"사용 하세요.)/dev/fd/4

zip 파일에서 전체 이미지를 추출하지 않고 첫 번째 파티션만 추출할 수 있습니다.

#! /bin/zsh -
zip=${1?zip file missing}

MTOOLS_SKIP_CHECK=1 mtype -i =(
    unzip -p -- "$zip" | perl -ne '
      BEGIN{$/=\512}
      if ($. == 1) {
        ($offset, $size) = unpack("x454L<2",$_)
      } elsif ($. > $offset) {
        print;
        if ($. == $offset + $size - 1) {exit}
      }') ::kernel.img |
  LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}' |
  gunzip | grep -aPom1 'Linux version \K\S+'

답변3

마운트해 볼 수 있습니다.

fdisk -l /path/to/your.img

mount -o loop,offset=sector size * start of the partition  your.img /yourfolder

sector size * start of the partition: fdisk 출력을 보고 다음을 곱합니다.

그러면 시작 폴더에 있는 파일을 볼 수 있습니다.

관련 정보