Como extrair a versão linux de um backup '.img'?

5

Resumindo:

Como extrair os números VERSION, SUBVERSION e PATCHLEVEl de um backup do sistema .img ? idealmente sem permissões de root.

Estendido:

Da seguinte página:

link

É fornecido um Debian zip extraído como .img , que representa um backup completo do sistema Debian para o sistema Debian para armar arquitetura.

Para a geração de um kernel personalizado, é necessário conhecer a VERSÃO, SUBVERSÃO e PATCHLEVEL do sistema, equivalente ao que é fornecido pelo típico

$ uname -r
4.9.0-3-amd64

A maneira mais fácil é carregar o sistema diretamente e executar o comando, mas isso não é aplicável neste caso.

Meta:

O kernel da imagem precisa ser corrigido e compilado. Minha intenção é criar um script para esse processo, então pode ser "facilmente" aplicado mais quando as atualizações do kernel vierem.

    
por Adrian Maire 15.09.2017 / 19:08

3 respostas

4

Isso parece funcionar na imagem 2017-09-07-raspbian-stretch-lite.img nesse site:

$ 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='3
$ MTOOLS_SKIP_CHECK=1 mtype -i 2017-09-07-raspbian-stretch-lite.img@@4M ::kernel.img|
  LC_ALL=C gawk -v RS='3
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='3
#! /bin/zsh -
zip=${1?zip file missing}

MTOOLS_SKIP_CHECK=1 mtype -i =(
    unzip -p -- "$zip" | perl -ne '
      BEGIN{$/=2}
      if ($. == 1) {
        ($offset, $size) = unpack("x454L<2",$_)
      } elsif ($. > $offset) {
        print;
        if ($. == $offset + $size - 1) {exit}
      }') ::kernel.img |
  LC_ALL=C gawk -v RS='3
$ 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='3
$ MTOOLS_SKIP_CHECK=1 mtype -i 2017-09-07-raspbian-stretch-lite.img@@4M ::kernel.img|
  LC_ALL=C gawk -v RS='3
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='3
#! /bin/zsh -
zip=${1?zip file missing}

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

(onde 3mtools identifica o início dos dados gzipados).

Como não-root, e assumindo que a primeira partição é sempre 4MiB dentro da imagem, usando o GNU kernel.img para extrair o /dev/fd dessa partição vfat:

%pre%

Se não, em sistemas com grep support (e GNU file="2017-09-07-raspbian-stretch-lite.img" ):

%pre%

(em outros sistemas, use /dev/fd/4 , o %code% é apenas para facilitar a adaptação a nomes de arquivos arbitrários)

De, o arquivo zip, você deve conseguir sair sem extrair toda a imagem, apenas a primeira partição com:

%pre%     
por 15.09.2017 / 22:25
5

Se isto é o que eu acho que é, uma imagem de disco, então seria extremamente difícil "corrigir a imagem" com um novo kernel, já que teria que levar em consideração não apenas o arquivo real do kernel, mas o resto do sistema de arquivos codificado na imagem; o kernel pode não ser armazenado de forma contínua no disco devido à fragmentação e se o kernel atualizado for maior (ou menor), o sistema de arquivos na imagem precisa ser atualizado de acordo.

Mesmo que você tenha procurado por toda a imagem pelas variáveis que deseja extrair, não saberia se as ocorrências vieram de arquivos que estavam realmente presentes no sistema de arquivos da imagem ou de arquivos antigos que não eram mais referenciados .

O melhor conselho seria montar a imagem e atualizá-la, alternativamente escrevê-la em um cartão SD, atualizá-la e recriá-la.

Fazê-lo sem montar a imagem de uma maneira ou de outra teria que, por necessidade, incluir a simulação do sistema de arquivos.

    
por 15.09.2017 / 19:19
3

Você pode tentar montá-lo.

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 : veja a saída do fdisk e multiplique-a

Então você pode ver os arquivos na pasta de inicialização.

    
por 15.09.2017 / 19:19