У моего коллеги было два накопителя, сконфигурированные в виде полосы на материнской плате со встроенным Promise FastTrak 133. Материнская плата вышла из строя, и мы не смогли найти других со встроенным контроллером Promise, который мог бы распознать массив.
В Linux или некоторых редакторах дисков я могу видеть данные на обоих дисках ... и я хочу посмотреть, смогу ли я объединить данные с обоих дисков на один, больший диск. Но мне нужно знать, как эта информация чередуется на дисках.
Я пробовал dmraid в Linux, но он не распознает диски как массив. Думаю, я мог бы просто попробовать комбинировать чередующиеся блоки с дисков, начиная с размера блока 256 Б и продолжать удваивать, пока не получу результат, который выглядит без изменений. Но я бы хотел избежать этого, если кто-то уже знает, как контроллеры Promise распределяют данные по полосатому массиву.
Хорошо, я разобрался. В различных руководствах Promise указано, что размер полосы по умолчанию составляет 64 КБ, а может быть установлен 32 КБ или 128 КБ. Итак, я написал небольшое Java-приложение для объединения двух разных источников, и оно отлично сработало! Оказывается, это было 64к полос.
Вот код на тот случай, если у кого-нибудь еще когда-нибудь возникнет эта проблема. Это не причудливо (и оно просто работает, пока не закончатся входное или выходное пространство), но это поможет вам выйти из затруднительного положения.
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();
}
}
}