状況があります。テープからtarファイルを回復するためにtar -xを実行する必要がありましたが、「c」を押してテープを読み取り専用に設定することを忘れました。ファイルはfsfの場所23にありますが、テープには27個のファイルがあります。ファイル23が欠落していることはわかっていますが、ctrl + cを押してtarコマンドをキャンセルした後でも、何らかの方法で他のtarファイルを回復したいですか?ファイル23を過ぎてfsfを試しましたが、得られたのは入力/出力エラーだけでした。
私はddを使用してファイル23からダンプし、そのファイルをインポートしてphotorecなどの署名ファイルの回復ツールを使用できると思いました。これは可能ですか?
答え1
この問題は完全にデバイスによって異なり、ドライブのハードウェアと関連するドライバによって異なります。
テープ操作を台無しにした場合(書き込み中断など)、テープに読み取れない記号や読み取れないストレッチが発生しやすくなります。mt fsf
単一のioctlを発行するには、ドライバが次のEOFマーカーにジャンプする必要があるため、ドライバは中断された書き込みのために残ったゴミを読み取ることができないことを示しました。ドライバはEIOを返すので、より良い結果を得ることはできません。
テープがどれほど重要であるかに応じて、次のステップはテープ技術に精通したフォレンジックリカバリ会社にテープを送ることです。あなたのデータがそこにあるかもしれませんが、ほとんどのドライバーはあなたがもたらすマークアップの欠陥を処理する方法を知りません。
答え2
テープの反対側の端を読んでください。
#! /bin/sh
set -e
TAPE=/dev/... # change me, you must use a non-rewinding device.
export TAPE
# Wind to the end of the tape.
mt eod
# Rewind to the beginning of the last file and then list it.
# It's possible I misunderstood the way end-of-data is signaled
# on the tape and if so perhaps this command should be mt bsfm 2,
# in which case you can just combine this with the loop below.
# For context here you can look at the entry for MT_ST_TWO_FM
# in "man st".
mt bsfm 1
tar -f "$TAPE" -t
# We just read a file so we're going to need to rewind over it
# and then rewind more to get to the beginning of the previous file.
# I forget whether tar leaves the tape at EOF or just after it. I'm
# assuming here just after, but if it leaves the tape at the EOF
# mark, the 2 on the next line would need to be a 1.
while mt bsfm 2
do
tar -f "$TAPE" -t
done
そうだろうリストテープの終わりからtarアーカイブのすべてのコンテンツにアクセスできます。もちろん、テープの先頭にもアーカイブがありますが、簡単にリストできます。
while tar -f "$TAPE" -t
do
true
done
これmt eod
を行うには、ドライバがファイルの表示をラップし、テープの最後までラップする必要があります。 SIGINT(Ctrl-C)を使用してtarプロセスを終了してテープの書き込みを中断すると、正常に動作します。 SCSIテープドライバの観点からは、ファイルディスクリプタを閉じるユーザースペースプログラムのように見えるため、その場所にEOFマークが必要ですが、実際の「破損」はありません。
ただし、ここで何かが起こった場合、または上記の方法が機能しない場合は、テープドライバにSCSIコマンドを送信してメディアの最後にスペースを割り当てるようにテープドライバに要求すると、他の結果が得られます。テープドライブではこれを行う必要があります。これはデフォルトの動作とは異なります。つまり、テープドライバは現在のファイル番号を追跡できるようにファイルにスペースを追加してこれを行います(レポートmt status
例:mt tell
MT_ST_FAST_EOM
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/mtio.h>
int main(int argc, char *argv[]) {
(void)argc;
(void)argv;
struct mtop mt_cmd;
mt_cmd.mt_op = MTSETDRVBUFFER;
mt_cmd.mt_count = MT_ST_BOOLEANS | MT_ST_FAST_MTEOM;
if (0 != ioctl(1, MTIOCTOP, &mt_cmd)) {
perror("MTSETDRVBUFFER on stdout");
return 1;
}
return 0;
}
定型句を保存するために、テープデバイスがプログラムの標準出力にすでに開いているとします(つまり、次のように実行します。)./myprog >"$TAPE"
。
私はこのコードをテストしていませんので注意して使用してください。子どもに子犬を育てることができると言っても、私を非難しないでください。他のCプログラムを使用して設定を元に戻すことができますが、継続的なサービスの可用性が問題にならない場合は、単にコンピュータを再起動することもできます。