ddを使用して特定の開始と終了を持つディスクの3つのパーティションをコピーするにはどうすればよいですか?

ddを使用して特定の開始と終了を持つディスクの3つのパーティションをコピーするにはどうすればよいですか?

このfdisk -lコマンドを使用すると、次の答えを得ることができます。

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    28266495    14132224   27  Hidden NTFS WinRE
/dev/sda2        28268544    28473343      102400    7  HPFS/NTFS/exFAT
/dev/sda3        28473344   132552703    52039680    7  HPFS/NTFS/exFAT
/dev/sda4   *   132556798   625141759   246292481    5  Extended
/dev/sda5       193996800   198092799     2048000   82  Linux swap / Solaris
/dev/sda6       234960896   625141759   195090432    7  HPFS/NTFS/exFAT
/dev/sda7       198094848   234950316    18427734+  83  Linux
/dev/sda8       132556800   183756018    25599609+  83  Linux

ddこのコマンドを使用して、ディスクの最初の3つのパーティションをイメージにコピーしたいと思います。だから外付けハードドライブをマウントし、そのフォルダに移動して次のように入力しました。

# dd count=$((132552703-2048)) if=/dev/sda of=./newImage.image

ただし、このコマンドはすべてのsdaディスクをsda3パーティションの終わりではなく外部ハードドライブにコピーします。

ddsda1の始めから始まり、sda3の終わりで終わる画像を作成するには?

ベストアンサー1

まず、方法は次のとおりです。


  1. まずやろうほぼ前と同様に、減算せずに数字に1を加算します。

    dd  count=132552704 </dev/sda >img
    
  2. sed次に、削除するパーティションをフィルタリングするプロセスでパーティションテーブルを印刷します。

    • sed開いたd2番目のコマンドに elete コマンドを書きますfdiskimgsda4 以降の各パーティションのファイル。

      fdisk -l img | sed -e'/sda4 /,$id' -e'g;$aw' | fdisk img
      
  3. いいえ3.これで終わりました。


第二に、その理由は次のとおりです。


  • 部分的に成功しました...

    • 私はあなたの注文をほとんど確信していますほぼ効果がありますが、思ったよりも良いと確信しています。

    • そう言うといいなすべてのsdaをコピーfdisk -lイメージにすべてのパーティションが含まれているように見えるからだと思います。しかし、ddあなたの質問のコマンドによると、提供される/dev/sdaセクタサイズはかなり標準的な512バイトです。(したがってddの基本ブロックサイズと同じ)/dev/sda次に、バイト0から最後の2kセクタを除くすべてのセクタをコピーする必要があります/dev/sda3

  • 学科について...

    • 以下にfdisk出力レポートを表示できます。単位。各サイズはこんな感じです部門報告書はfdisk言った。ディスク部門 可能4096バイト - 最近作成され処理されたディスクの場合高度なフォーマットセクタサイズ - それ以外の場合、標準の論理512バイトセクタサイズに分割されていないディスクを見つけることは困難です。

    • それだけです。fdiskmanそのページ説明する:

    • -u--units[=unit]

      • パーティションテーブルを一覧表示するときにサイズを表示します。部門またはシリンダーデフォルトの表示サイズは次のとおりです。部門。以前のバージョンとの互換性のために、このオプションを代わりに使用できます。単位パラメータ - その後、デフォルト値を使用します。オプションの単位パラメーターは、以下と一緒に使用することはできません。-uオプションはスペースで構成され、正しい形式は次のとおりです。-u=cylinders
    • 持つ詳細については、ここをクリックしてください

  • そして詳細についてはdd...

    • dd できない 自動的にデータを失う。実際に短い読み取りが発生したdd場合指定済み~になる非常にこれについて教えてください。

    • 部分入力チャンクは、read()入力チャンクサイズより小さい入力チャンクを返します。部分出力ブロックは、出力ブロックサイズで指定されたバイトよりも少ないバイトで書かれた出力ブロックです。

    • ...あるとき最後のもの切り捨てられたブロック、切り捨てられたブロックの数を標準エラーに記録する必要があります。

    • "%u truncated %s\n"<number of truncated blocks>"record[s]"

  • 入力/出力をブロックする...

    • しかし、とにかくそれは本当です。できないブロックデバイスI / Oで発生します。これがブロックデバイスがブロックデバイスである理由です。追加のレイヤーがあります。(時には複数)(文字デバイスではなく)ブロックデバイスに対するバッファ保護。 POSIXがブロックデバイスにファイルが存在することを保証するのはこれらの区別ですlseek()。これはI / Oブロックの非常に基本的な原則です。
  • まとめる...

    • だからあなたはコピーしましたみんな指定したポイントまでデバイスを使用しますが、問題は最初2,000個のセクターに対応する/dev/sda項目が含まれています。みんなパーティションテーブルを使用すると、そのパーティションテーブルをイメージにコピーできるため、fdisk -lイメージを報告できます。みんなpartitions /dev/sda、そのパーティションのデータが実際にイメージファイルにあるかどうかにかかわらず。もちろんcat、必要に応じて別々のデータパーティションを別々のイメージファイルに分割することもできます。ただし、この場合、パーティションテーブルは完全に失われます。実際にやるべきことは、複製されていないパーティションを削除して複製されたことを確認することだけです。みんなあなたがすること。

第三に、私の知る方法は次のとおりです。


  • これにより4Gが生成されます。./imgファイルは NUL でいっぱいです。

    </dev/zero >./img \
    dd ibs=8k obs=8kx1b count=1kx1b 
    

    524288+0 records in
    1024+0 records out
    4294967296 bytes (4.3 GB) copied, 3.53287 s, 1.2 GB/s
    
  • これによりパーティションが分割されます。./imgディスクを最初の3つのパーティションに合わせますが、サイズは1/16です。

    (set "$((p=0))" 28266495     27 \
          28268544  28473343  2\\n7 \
          28473344 132552703  3\\n7
    while   [ "$#" -ge "$((p+=1))" ]
    do      printf "n\np\n$p\n%.0d\n%d\nt\n%b\n" \
                   "$(($1/16))" "$(($2/16))" "$3"
            shift 3
    done;   echo w
    )| fdisk ./img >/dev/null
    
  • 今、私たちはそれを見ることができます。

    fdisk -l ./img
    

    Disk ./img: 4 GiB, 4294967296 bytes, 8388608 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x5659b81c
    
    Device     Boot   Start     End Sectors   Size Id Type
    ./img1             2048 1766655 1764608 861.6M 27 Hidden NTFS WinRE
    ./img2          1766784 1779583   12800   6.3M  7 HPFS/NTFS/exFAT
    ./img3          1779584 8284543 6504960   3.1G  7 HPFS/NTFS/exFAT
    
  • また、3つのパーティションに物理ファイルシステムとファイルを配置します。

    sudo sh -c ' trap "$1" 0
        cd /tmp; mkdir -p mnt
        for p in "$(losetup --show -Pf "$0")p"*
        do    mkfs.vfat "$p"
              mount "$p" mnt
              echo  "my part# is ${p##*p}" \
                     >./mnt/"part${p##*p}"
              sync; umount mnt
        done' "$PWD/img" 'losetup -D'
    
  • これはすべての終了位置のバイトオフセットです。

    grep -Ebao '(my[^0-9]*|PART)[123]' <./img
    

    2826272:PART1
    2830336:my part# is 1
    904606240:PART2
    904624640:my part# is 2
    917656608:PART3
    917660672:my part# is 3
    

fdiskしかし、パーティションをフォーマットする前にファイルシステムがパーティションサイズを報告していることを知っていましたか?これは、パーティションテーブルがディスクの上部にあるためです。これは単なるレイアウトであり、それ以上ではありません。レポートが発生するために実際にパーティションが存在する必要はありません。それらは最初の1M内でのみ論理的にマッピングされます./img。より:

  • 最初の2つのパーティションのみを削除してみましょう./img

    <./img >./img2 dd count=1779583
    

    1779583+0 records in
    1779583+0 records out
    911146496 bytes (911 MB) copied, 1.84985 s, 493 MB/s
    
  • また行こうgrep

    grep -Ebao '(my[^0-9]*|PART)[123]' <./img2
    

    2826272:PART1
    2830336:my part# is 1
    904606240:PART2
    904624640:my part# is 2
    
  • そしてfdiskレポートを受け取る..

    fdisk -l ./img2
    

    Disk ./img2: 869 MiB, 911146496 bytes, 1779583 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0xcbcab4d8
    
    Device     Boot   Start     End Sectors   Size Id Type
    ./img2p1           2048 1766655 1764608 861.6M 27 Hidden NTFS WinRE
    ./img2p2        1766784 1779583   12800   6.3M  7 HPFS/NTFS/exFAT
    ./img2p3        1779584 8284543 6504960   3.1G  7 HPFS/NTFS/exFAT
    

今これが気になります。fdiskそれでも、ディスクの4Gまで拡張される3番目のパーティションがあると信じているようです。また、サイズも869Mに過ぎないと信じているようです!

  • パーティションテーブルから3番目のパーティションを削除する必要があるかもしれません。

    printf %s\\n d 3 w |
    fdisk ./img2 >/dev/null
    
  • それでは、コピーしたパーティションをマウントできるのか、ファイルがそのまま残っているのかを見てみましょう。

    sudo sh -c ' trap "$1" 0
        cd /tmp; mkdir -p mnt
        for p in "$(losetup --show -Pf "$0")p"*
        do    mount "$p" mnt
              grep . /dev/null ./mnt/*
              umount mnt
        done' "$PWD/img2" 'losetup -D'
    

    ./mnt/part1:my part# is 1
    ./mnt/part2:my part# is 2
    

明らかにこれは不可能ではありません。

おすすめ記事