我的同事在带有板载 Promise FastTrak 133 的主板上将两个驱动器配置为条带。主板出现故障,我们无法找到任何其他带有板载 Promise 控制器且可以识别该阵列的主板。
使用 Linux 或某些磁盘编辑器,我可以看到两个驱动器上的数据……我想看看是否可以将两个驱动器上的数据合并到一个更大的驱动器上。但我需要知道这些信息在驱动器上是如何交错的。
我尝试过 Linux 上的 dmraid,但它无法将驱动器识别为阵列。我想我可以尝试组合驱动器中的交替块,从 256B 的块大小开始,然后不断加倍,直到得到看起来完整的结果。但如果有人已经知道 Promise 控制器如何将数据分布在条带阵列上,我想避免这种情况。
答案1
好的,我明白了。各种 Promise 手册都指出,条带大小默认为 64k,可以设置为 32k 或 128k。因此,我编写了一个小型 Java 应用程序来合并来自两个不同来源的数据,结果运行良好!结果发现它们是 64k 条带。
以下是代码,以防其他人遇到这个问题。它并不花哨(它会一直运行,直到用尽输入或输出空间),但它能帮你摆脱困境。
public class PromiseFastTrakCombiner {
public static void main(String[] args) {
if(args.length != 4) {
System.out.println("Usage: java PromiseFastTrakCombiner <source1> <source2> <dest> <blocksize_in_kB>");
System.exit(1);
}
String source1 = args[0];
String source2 = args[1];
String dest = args[2];
int blocks = Integer.parseInt(args[3]);
System.out.println("Going to copy: " + source1 + " and " + source2 + " to " + dest + " with " + blocks + "kB blocks");
System.out.println("If this is not what you want, hit Ctrl-C now. Otherwise, hit Enter");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream in1 = new FileInputStream(source1);
FileInputStream in2 = new FileInputStream(source2);
FileOutputStream out = new FileOutputStream(dest);
int bufsize = 1024 * blocks;
byte[] buffer = new byte[bufsize];
long bytesread;
long totalbytes = 0;
long lastreport = 0;
while(true) {
bytesread = in1.read(buffer);
totalbytes += bytesread;
out.write(buffer);
bytesread = in2.read(buffer);
totalbytes += bytesread;
out.write(buffer);
// Progress update after every 10MB...
if(totalbytes - lastreport > 10000000) {
System.out.println("Bytes processed: " + totalbytes);
lastreport = totalbytes;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}