LUKS暗号化されたテキストファイルに無効な文字が表示されます。

LUKS暗号化されたテキストファイルに無効な文字が表示されます。

暗号化されたUSBディスクがありますルクス。今日、ディスクを取り付けた後、最近編集したテキストファイルに、一見ランダムな文字が含まれていることがすぐに見つかりました。私が確認した他のすべてのファイルとディレクトリ階層はOKです。

この問題の原因は何であり、そのようなファイルを回復できますか?

ディスク全体の最近のバックアップがあり、テキストファイルの最新バージョンがGitアーカイブにコミットされました。しかし、私は予防ガイドラインだけでなく、解決策にも興味があります。

ベストアンサー1

「C」で書かれた高速メモリテストです。メモリエラーが原因でディスクの破損が発生した場合は、これを確認する簡単な方法が考えられます。

気をつけて、これによりコンピュータがロックされます。(仮想メモリスラッシュ)利用可能なメモリよりもはるかに多くのメモリをテストしようとしている場合。

time { make -s CFLAGS="-Wall -Werror -std=c99" mymemtest && free -m && ./mymemtest && free -m && echo "PASS" || echo "FAIL" ; }

   #include <stdio.h>
   #include <stdlib.h>
   #include <stdint.h>
   #include <assert.h>

int main()
   {
   fprintf(stderr,"\n");
   fprintf(stderr,"sizeof(int)=%ld, sizeof(void*)=%ld\n", sizeof(int), sizeof(void*) );

   double TESTSIZE = 2.2; // amount of memory to test in GB
   uint64_t K=1024; // used to define a GB

   typedef uint64_t T;
   uint64_t sizebytes=TESTSIZE*K*K*K;
   uint64_t size = sizebytes/sizeof(T);
   T * a = malloc(sizebytes);
   assert( a != NULL );
   fprintf(stderr,"sizebytes=%ld, size=%ld, chunk size=%ld, test size=%g GB\n", sizebytes, size, sizeof(T), sizebytes/(double)(K*K*K) );

   fprintf(stderr,"writing...\n");  for ( uint64_t i=0; i<size; i++ ) a[i] = i;
   fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)i );

   fprintf(stderr,"writing...\n");  for ( uint64_t i=0; i<size; i++ ) a[i] = 0;
   fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)0 );

   fprintf(stderr,"writing...\n");  for ( uint64_t i=0; i<size; i++ ) a[i] = -1;
   fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)-1 );

   fprintf(stderr,"writing...\n");  for ( uint64_t i=0; i<size; i++ ) a[i] = 0x5A5A5A5A5A5A5A5AUL;
   fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)0x5A5A5A5A5A5A5A5AUL );

   fprintf(stderr,"writing...\n");  for ( uint64_t i=0; i<size; i++ ) a[i] = 0xA5A5A5A5A5A5A5A5UL;
   fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)0xA5A5A5A5A5A5A5A5UL );

   free(a);
   fprintf(stderr,"\n");
   return 0;
   }

おすすめ記事