「.img」バックアップからLinuxバージョンを抽出する方法は?

「.img」バックアップからLinuxバージョンを抽出する方法は?

簡単に言うと:

システムバックアップからVERSION、SUVERSION、およびPATCHLEVEl番号を抽出するには.img? root権限を持たない方が最善です。

拡張:

次のページから:

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圧縮データの開始位置を識別します)。

root以外のユーザーとして、イメージの最初のパーティションが常に4MiBであると仮定し、GNUを使用して対応するmtoolsvfatパーティションから抽出します。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 出力を見て、次を掛けます。

これにより、スタートアップフォルダにあるファイルを表示できます。

関連情報