私は自分のものを読んだり壊したりすることができないユーザーの仲間入りをしました。
先週の日曜日、大きなWindows 7 NTFSパーティションを小さなパーティションにコピーしようとしたときに、3TBHDDのパーティションテーブルと思われるものを吹き飛ばしました。コンテキストの場合:
sdb (3TB drive/partition)
sdh2 (1.57 TB partition)(2TB drive)
私はPartedMagic2018を実行していました(そして今もそうです)。次のように入力しました。
sgdisk -R /dev/sdb /dev/sdh2
Gpartedを開いたときに、コマンドを間違って入力したことに気づきました。これは、大きなパーティションを小さなパーティションに移動することに関連する問題を修正するための回答として、SEの質問に記載されていました。 answer は次のように入力されました:
sgdisk -R /dev/sdY /dev/sdX
where:
sdX = Disk A
sdY = Disk B
ボーンヘッドは脇に移動し、私は現在ダメージコントロール中です。私はこれに従い始めました buntuフォーラムガイド そして現在、ドライブ全体を回復できるように、パーティションヘッダーのドライブのスキャンを開始しました。
これまでに次のコマンドを入力しました:gpart /dev/sdb
。ドライブを約4日20時間スキャンしています。
ここでの手順に関していくつか質問があります。
これにはどのくらい時間がかかりますか?私の最善の見積もりは、HDDアクティビティライトを見て、1秒あたり最大1回の点滅を数えることでした。 1回の点滅は1つのセクターの読み取りであり、各セクターは4096(フラッシュドライブ上にある)であると想定しました。毎秒4MBの読み取り時間で3TBドライブに2,720,000MBを使用すると、約7。87日かかります。最短時間はその2倍の速度になり、今では完了しています。最後の「可能なパーティション」出力は2日前で、1421742mbのオフセットを提供しましたが、最初の可能な出力はオフセット1mbでした。私はどこかでセクターサイズがもっと小さいかもしれないのを見ました。私は近いですか?
ドライブを救助するための適切な措置を講じていますか? Ubuntuフォーラムガイドは健全で非常に関連性があるようです。ドライブにあるパーティションは1つだけで、以前はもっとありましたが、それをワイプして1つだけでやり直しました。それは事故の前にリストされた唯一のパーティションであり、私が覚えているようにドライブ全体を使用していました。それらのいくつかのMB未使用セクションの1つがあったかどうかはわかりません(パーティションを作成するときにGPartedで時々行われるこの奇妙な空白のパーティション化されていないスポットは、1mib未使用で始まります)。
parted
を使用してパーティションを復元し、すべてのセクターを追加しない場合、または追加しすぎる場合、データは引き続きそのパーティションに表示されますか?ガイドには、セクターの単位を使用してパーティションテーブルを再構築するように書かれています。使用するユニットが少なすぎたり多すぎたりしても、ドライブをマウントして読み取ったときにデータが表示されますか?
プライマリパーティションテーブルとセカンダリパーティションテーブルなどがあることを読みましたが、それらは存在しますか?コピーできますか?どのように表示して、どちらをリカバリするかを確認できますか?
専門サービスに送る以外に、2つ目の損傷制御オプションが必要です。これはビジネスコンピュータではありませんが、回復すべき重要なことがいくつかあります。
最終目標:3TBドライブの単一パーティションを回復します。
更新:gpartスキャン後
参考写真に見られるように、スキャンはドライブの終わり近くで失敗しました。それ以来、ドライブをTestDisk
を実行した新しいコンピューターに配置しました。クイックスキャンでは、gpart
が見たものの一部が見つかりましたが、私が知っているものは見つかりませんでした。 Big Mongo
という名前の問題のパーティションを数分以内に検出するDeeperScanオプションを使用しました。これは私がWindowsでドライブに名前を付けたものです。
更新2:テストディスクスキャン後
TestDiskが完了し(追加の参照写真を参照)、不足しているパーティションを特定しました。プログラム内のファイルを一覧表示させることができます。完了したスキャンの下部にあるサイズに注意してください。スキャンは、gpart
から8日に対して10時間で完了しました。
結論:心を問うために
TestDiskを実行した後、パーティションが見つかりましたが、テーブルが正しく作成されなかったため、gdisk
を実行し、開始として2048
を使用し、終了として最大サイズを使用して再構築しました(マークされた回答を参照)。休止状態で、問題なく起動しました。
参考写真
gdisk -l for comment https://i.stack.imgur.com/9znYj.jpg
gpart scan 1/2 https://i.stack.imgur.com/rWxuC.jpg
gpart scan 2/2 https://i.stack.imgur.com/HQYJ8.jpg
TestDiskクイックスキャン
TestDiskディープスキャン予備
TestDiskの完了
使用したコマンド
_sgdisk -R /dev/sdb /dev/sdh2
_
GUIDパーティションテーブル(GPT)を_/dev/sdh2
_から_/dev/sdb
_にコピーしました。
1つの問題は、_/dev/sdh2
_がパーティションであるということです。どのパーティションにも意味のあるパーティションテーブルはありません。または少なくともそれすべきではない持っている。パーティション内に意味のあるパーティションテーブルを想像することはできますが(そしてそれをちょっと機能させることさえできます)、これは面倒でエキゾチックで、あまり役に立ちません。
結果のコピーは空のGPTです。これは、_/dev/sdh2
_内の関連する(まだ意味のない)値がそのようなテーブルになっているためです。これは実際には問題ではありません。
重要なのは、_/dev/sdb
_の元のGPTを上書きしたことです。使用したコマンドはパーティションテーブルのみを変更しました。他のすべての構造はまだ存在していると予想されます。ファイルシステム自体は問題ないはずです(後で回復しようとしたときに、ファイルシステムが破損するほど不幸な場合を除きます)。ファイルシステムにアクセスするための便利な方法を失っただけです。 私のこの答え を読んでください、その最初の部分はパーティションとファイルシステムの違いを要約しています。
ここでの目標は、元のGPTを何らかの方法で復元することです。あなたの状況は、あなたが言及された答えで説明された手順の真っ只中にいるかのようであることに注意してください:あなたはパーティションテーブルエントリを破壊しましたが、まだ新しいものを作成していません。違いは、必ずしも大きなパーティションを作成する必要はなく、パーティションを開始するオフセット(開始セクター)がわからないことです。
GPTは、プライマリテーブルとセカンダリ(バックアップ)テーブルで構成されます。 _sgdisk -R
_は、GPT全体を一貫した状態のままにするために両方のテーブルを変更したため、セカンダリテーブルは古い状態の復元に役立ちません。
ディスクをスキャンし、ファイルシステムの署名を見つけ、署名からファイルシステムのサイズを読み取り、ファイルシステムを新しく定義されたパーティションに適切に埋め込むパーティションテーブルエントリを提案できるツールがあります。これにより、簡単にマウントできます。そのようなツールの1つはtestdisk
です。古いパーティションテーブルのみが消去された場合、testdisk
はファイルシステムを見つけて、正常なGPTを作成できるはずです。スキャンには時間がかかる場合があります。
または、正しいオフセットを推測してみてください。パーティションが1つしかないという事実は利点です。
これは私の別の答えです を読んでください。あなたの場合(論理セクターサイズ_512
_)、最も可能性の高い開始セクターは_2048
_であり、機能する可能性のあるコマンドは次のとおりです。
_mount -o ro,offset=$((512*2048)) /dev/sdb /some/mountpoint/
_
読み取り専用をマウントしても、これまでに残ったデータには影響しないため、安全に試すことができます。コマンドが成功し、ファイルとディレクトリが_/some/mountpoint/
_の下に表示されていることを確認した場合は、オフセットが正しいことを意味します。
_512*2048
_は正確に1MiBであることに注意してください。あなたが持っているスクリーンショットの1つ:
_Possible partition … offset(1mb)
_
これだと思います。このツールを使用した場合、testdisk
によっても検出される可能性があります。
testdisk
(または同様のもの)を使用しないことを選択し、正しいと思われるオフセットを見つけた場合は、手動で(gdisk
、sgdisk
を使用して)正常なエントリを持つパーティションテーブルを作成できます。またはこれを行うことができる任意のツール)。次のヒントに従ってください。
mount -o ro,offset=… …
_)、umount
。2048
_で始まるパーティションがディスクの終わりに到達することは不可能です。したがって、元々何もなかったとしても、ディスクの最後にセカンダリGPTを作成しても安全です(とにかく_sgdisk -R
_がすでに書き込みを行っていることを除けば、悪化させることはできません)。ただし、念のため、この回答の後半にある「考えられる問題」のセクションを参照してください。2048
_である必要があります。size(764432mb)
です。ここで、mb
が MBまたはMiB を意味するのか、それとも完全に間違っているのかはわかりません。最も安全なアプローチは、(一時的に)終了セクターに可能な最大値を使用することです。別のスクリーンショットでは、終了セクターの最大値は_5860533134
_であると思います。EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
_である必要があります。 gdisk
では、これに_0700
_のショートコードを使用できることに注意してください。mkfs
)するか、ワイプ(wipefs
)しようとする場合、それは適切なツールではありません。 gdisk
は安全だと思います。 GUIオールインワンパーティショニングツール(Windowsネイティブツールを含む)には細心の注意を払っています。率直に言って、この場合「非常に注意深い」とは、私がそれらをまったく使用しないことを意味します。適切なエントリを作成し、新しいパーティションテーブルをデバイスに書き込むと、_/dev/sdb1
_が表示されます。表示されない場合は、partprobe
を呼び出します。
_/dev/sdb1
_をマウントできることを確認します。
これで、使用可能な_/dev/sdb1
_がある場合、ファイルシステムにそのサイズを簡単に照会できます。私はファイルシステムがそのサイズを知っていることを意味します。一般に、これは対応するパーティションのサイズとは異なります。使用できるツールは少なくとも2つあります。
_file -s /dev/sdb1
_
_sectors NNNNNN
_と書かれている場所に興味があります。 _hidden sectors
_について心配する必要はありません(比較 FATについても同様の疑い )。
_ntfsresize --info /dev/sdb1
_
「現在のボリュームサイズ」に関心があります。 512バイトのセクターで表現します(つまり、512で割ります)。
ntfsresize
の出力から計算された数値は、file
の数値と少し異なる場合があります。これはクラスターサイズと関係があると思います。私のテストでは、_mkfs.ntfs
_がパーティション全体を使用するように求められた後、file
はパーティション内のセクター数よりも1セクター少ないと報告しているようです。したがって、file
ではなくntfsresize
を使用し、_sectors NNNNNN
_を識別して、1つ追加します。これは、パーティションの大きさが必要な大きさです。疑問がある場合は、_2048
_セクターを追加してください。それはやり過ぎですが、無駄なスペースは1 MiBだけで、それほど多くはありません。それはあなたを確実に安全に保つでしょう。
パーティション(前の段落で作成)が大きい場合は、縮小することをお勧めします。最終的な目標は、ファイルシステムをより小さなディスクにコピーすることでした。スクリーンショットの1つにこのPossible partition … size(764432mb) …
があります。これにより、ファイルシステムは実際に新しいパーティションよりも小さいと思います。これ自体は問題ではありませんが、ファイルシステムの終了後に別のパーティションを作成する場合、またはセットアップをより小さなディスクにコピーする場合は、パーティションを縮小することをお勧めします。
手順:
umount
マウントされている場合はファイルシステム。start+size-1=end
_。パーティションの端の配置は重要ではありませんが(最初は重要です)、ツールが端をディスクの端に向かってわずかに移動するように要求する場合は、それを許可します。partprobe
を実行します。/dev/sdb1
_がエラーなしでマウントされることを確認します。念のため、最初は読み取り専用(_mount -o ro …
_)をマウントします。ファイルシステムが正常にマウントされれば、基本的には完了です。これで、パーティションテーブルは正常になりました。
512/4096
_であることがわかります。 この質問 とそれに対する私の答えの説明を読んでください。少なくとも1つのUSBエンクロージャーが関係していて、ディスクが現在とは異なる方法で接続されていた場合(つまり、別のエンクロージャー内、またはSATA経由で、以前のエンクロージャー内、またはその逆)、_/dev/sdb1
_は_sgdisk -R
_を呼び出す前にマウントし、その後多分元の(失われた)パーティションテーブルは論理サイズ_4096
_に対して有効でした。事故の前にパーティションをマウントしようとすると、リンクされた質問と同じ問題が発生します。私のポイントは、私の答えは、currentセットアップに有効なパーティションテーブルを作成するのに役立つということです。この問題が発生する場合は、元の設定でドライブを接続したときに発生します。次に、パーティションテーブルを再度調整する必要があります。リンクされた質問に対する私の答えが役に立ちます。上記の箇条書きが当てはまり、size(764432mb)
が間違っている場合は、ディスクの最後まで広がる1つの大きなパーティションを定義したMBR(GPTではない)のDOSパーティションテーブルがあった(および上書きされた)可能性があります。ファイルシステム自体は、(ほぼ)ディスクの最後まで広がっていました。このような場合、_sgdisk -R
_は、ファイルシステムの一部があるべき場所の最後にセカンダリ(バックアップ)GPTを作成しました。ファイルシステムが正常にマウントされる場合、これはおそらく当てはまりません。一般的にはそうかもしれません。これは、実際にデータが失われた可能性があるシナリオです。修正しない限り、さらに失う可能性があります(必要に応じて別の質問をしてください)。
GPTを使用していることが確実な場合は、安全であることに注意してください(セカンダリテーブルが「常に」存在していたため)。そして、前の箇条書きが当てはまらないことが確実な場合は、安全です(論理セクターサイズが_512
_で、MBRのDOSパーティションテーブルでは、セクター_2048
_で始まるパーティションがあるためです。 大きなディスクの最後まで拡張できませんでした )。
パーティションテーブルを修正した後は、おそらく元の計画を続行する必要があります。次に:
sgdisk -R
_が異なるサイズのエントリを再計算するかどうかはわかりません。私はそれを期待しています。そうでない場合は、 あなたは何をすべきか知っています 。/dev/sdb
_(つまり、_/dev/sdb1
_など)の唯一のパーティションを_/dev/sdh2
_に複製したかった。保持したい_/dev/sdh1
_があります。もしそうなら、_sgdisk -R
_はnotあなたがやりたいことです。パーティションテーブルを_/dev/sdb
_から_/dev/sdh2
_(パーティション)にコピーしても、何も得られません。それを_/dev/sdh
_にコピーすると、そこにある現在のパーティションテーブルが置き換えられ、現在の_/dev/sdh2
_(および存在する場合は_/dev/sdh1
_)が混乱します。 _sgdisk -R
_は、ターゲットディスクに保持するデータが含まれていない場合にのみ使用してください。疑問がある場合は、_/dev/sdb
_のパーティションテーブルを修正した後、別の質問をしてください。新しい質問には、両方のディスクの_gdisk -l
_(または_fdisk -l
_)の出力が含まれている必要があり、クローンを作成するパーティション、消費可能なパーティション、およびどのパーティションを明確に指定する必要があります。パーティションはそのままにしておく必要があります。