この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パーティションの終わりではなく外部ハードドライブにコピーします。
dd
sda1の始めから始まり、sda3の終わりで終わる画像を作成するには?
答え1
まず、方法は次のとおりです。
まずやろうほぼ前と同様に、減算せずに数字に1を加算します。
dd count=132552704 </dev/sda >img
sed
次に、削除するパーティションをフィルタリングするプロセスでパーティションテーブルを印刷します。sed
開いたd
2番目のコマンドに elete コマンドを書きますfdisk
img
sda4 以降の各パーティションのファイル。fdisk -l img | sed -e'/sda4 /,$id' -e'g;$aw' | fdisk img
いいえ3.これで終わりました。
第二に、その理由は次のとおりです。
部分的に成功しました...
私はあなたの注文をほとんど確信していますほぼ効果がありますが、思ったよりも良いと確信しています。
そう言うといいなすべてのsdaをコピー
fdisk -l
イメージにすべてのパーティションが含まれているように見えるからだと思います。しかし、dd
あなたの質問のコマンドによると、提供される/dev/sda
セクタサイズはかなり標準的な512バイトです。(したがってdd
の基本ブロックサイズと同じ)/dev/sda
次に、バイト0から最後の2kセクタを除くすべてのセクタをコピーする必要があります/dev/sda3
。
学科について...
以下に
fdisk
出力レポートを表示できます。単位。各サイズはこんな感じです部門報告書はfdisk
言った。ディスク部門 可能4096バイト - 最近作成され処理されたディスクの場合高度なフォーマットセクタサイズ - それ以外の場合、標準の論理512バイトセクタサイズに分割されていないディスクを見つけることは困難です。それだけです。
fdisk
man
そのページ説明する:-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ブロックの非常に基本的な原則です。
- しかし、とにかくそれは本当です。できないブロックデバイスI / Oで発生します。これがブロックデバイスがブロックデバイスである理由です。追加のレイヤーがあります。(時には複数)(文字デバイスではなく)ブロックデバイスに対するバッファ保護。 POSIXがブロックデバイスにファイルが存在することを保証するのはこれらの区別です
まとめる...
- だからあなたはコピーしましたみんな指定したポイントまでデバイスを使用しますが、問題は最初2,000個のセクターに対応する
/dev/sda
項目が含まれています。みんなパーティションテーブルを使用すると、そのパーティションテーブルをイメージにコピーできるため、fdisk -l
イメージを報告できます。みんなpartitions/dev/sda
、そのパーティションのデータが実際にイメージファイルにあるかどうかにかかわらず。もちろんcat
、必要に応じて別々のデータパーティションを別々のイメージファイルに分割することもできます。ただし、この場合、パーティションテーブルは完全に失われます。実際にやるべきことは、複製されていないパーティションを削除して複製されたことを確認することだけです。みんなあなたがすること。
- だからあなたはコピーしましたみんな指定したポイントまでデバイスを使用しますが、問題は最初2,000個のセクターに対応する
第三に、私の知る方法は次のとおりです。
これにより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
明らかにこれは不可能ではありません。
答え2
ddは1つの入力を1つの出力に直接渡すため、不可能です。バックアップではなく3つのパーティションを1つにマージし、ddは同じコピーでのみ機能するため、回復が破損する可能性があります。
あなたの答えは次のとおりです。
dd if=/dev/sda1 of=~/hdadisk1.img;
dd if=/dev/sda2 of=~/hdadisk2.img
dd if=/dev/sda3 of=~/hdadisk3.img
(必要に応じてスクリプトで)最後にhdadisk {1,3,3}.imgを使用してイメージを作成できますが、バックアップ目的でこれらのイメージをパーティションに保存することをお勧めします。
答え3
dd count=$((132552703-2048))
入力の先頭から132552703-2048 512バイトブロックをコピーします。ブロックサイズはfdisk
1kB = 1024バイトです。したがって、3つの問題に直面することになります。
- 指定するサイズは希望のサイズの半分です。
- オフセットからコピーを開始したいと表示していません。
- 減算にフェンスエラーがあります。最後のブロックがありません。ブロック数は(End Block Offset)-(Start Block Offset)+1です.
だからあなたは使用することができます
dd bs=1k skip=2048 count=$((132552703-2048+1)) if=/dev/sda of=./newImage.image
私の考えにはこれがうまくいくと思います -dd
データが自動的に失われる可能性があります。しかし、ブロックデバイスの1kBブロックやLinuxの一般的なファイルは大丈夫だろうと思います。しかし、非常に遅い。
単一パーティションをコピーする最も簡単な方法は、直接コピーすることです。
cat /dev/sda1 >sda1.image
cat /dev/sda2 >sda2.image
cat /dev/sda3 >sda3.image
パーティションを別々のファイルにコピーすることをお勧めします。そうしないと、ファイルの先頭にないパーティションは使いにくくなります。同じファイルに3つのパーティションが必要な場合は、次のように接続します。
cat /dev/sda1 /dev/sda2 /dev/sda3 >newImage.image
答え4
迅速で簡単な答えは次のとおりです。
dd skip=2048 count=132552703 status=progress if=/dev/sda of=./newImage.image
デフォルトでは、fdisk -lはパーティションサイズをセクタあたり512バイトで返します。
fdisk 出力に次の内容が表示されることを確認できます。
Disk /dev/sda: 256 GiB, 274877906944 bytes, 536870912 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ddはまた、「bs」、「cbs」、「ibs」、および「obs」スイッチのデフォルトとして512バイトを使用します。
bs=BYTES read and write up to BYTES bytes at a time (default: 512);
overrides ibs and obs
cbs=BYTES convert BYTES bytes at a time
conv=CONVS convert the file as per the comma separated symbol list
count=N copy only N input blocks
ibs=BYTES read up to BYTES bytes at a time (default: 512)
if=FILE read from FILE instead of stdin
iflag=FLAGS read as per the comma separated symbol list
obs=BYTES write BYTES bytes at a time (default: 512)
of=FILE write to FILE instead of stdout
oflag=FLAGS write as per the comma separated symbol list
seek=N skip N obs-sized blocks at start of output
skip=N skip N ibs-sized blocks at start of input
status=LEVEL The LEVEL of information to print to stderr;
'none' suppresses everything but error messages,
'noxfer' suppresses the final transfer statistics,
'progress' shows periodic transfer statistics
次のように、dd自体を使用してブロックファイルを生成できることを確認してください。
dd if=/dev/urandom of=テスト回数=1
ファイルサイズは512バイトでなければなりません。
したがって、パーティションまたはパーティショングループのイメージを作成するには、fdisk出力からパーティションまたは最初のパーティションの先頭にあるセクタの数を取得し、それをddパラメータの値として使用するだけです。 "skip"、次にパーティションの終わりまたは最後のパーティションのセクタ数を指定し、ddパラメータ"count"の値に設定します。
fdiskとddの間にブロックサイズの違いがある場合は、「bs」パラメータを使用して常にddにブロックサイズを指定して、fdisk出力がddが使用するブロックサイズと一致することを確認できます。