我有一个加密的 USB 磁盘卢克斯。今天安装磁盘后,我立即发现最近编辑的文本文件包含看似随机的字符。我检查过的所有其他文件以及目录层次结构似乎都正常。
是什么原因导致这种情况,这样的文件可以恢复吗?
我确实有整个磁盘的最新备份,并且文本文件的最新版本已提交到 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;
}
答案2
挂起后文件系统混乱(Ubuntu 13.10)
我隔离了反复出现的文件系统问题,这些问题与挂载 LUKS 加密 USB 磁盘时挂起笔记本电脑相关。通常,它认为我在终端中打开的任何目录在从挂起恢复后现在都是空的。将文件保存到这样的目录似乎可能会导致损坏(但这种情况只发生过一次)。我典型的解决方案是在挂起之前卸载磁盘,但有时我会忘记这样做。
我发现清除缓存恢复后修复文件系统:
sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
sync
在暂停之前运行可能仍然是明智的...