Назад | Перейти на главную страницу

Как Promise FastTrak 133 чередует полосатый массив?

У моего коллеги было два накопителя, сконфигурированные в виде полосы на материнской плате со встроенным 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();
        }
    }
}