Como um Promise FastTrak 133 intercala uma matriz listrada?

3

Eu trabalhava com dois drives configurados como uma faixa em uma placa-mãe com um Promise FastTrak 133. A placa-mãe falhou e não conseguimos encontrar nenhum outro com um controlador Promise integrado que possa reconhecer a matriz.

Com o Linux ou alguns editores de disco, consigo ver os dados nas duas unidades ... e quero ver se consigo combinar os dados de ambas as unidades em uma única unidade maior. Mas eu preciso saber como essa informação é intercalada nas unidades.

Eu tentei o dmraid no Linux, mas isso não reconhece as unidades como uma matriz. Eu acho que poderia tentar combinar blocos alternados das unidades, começando com um tamanho de bloco de 256B e continuando a duplicar até obter um resultado que pareça intacto. Mas eu gostaria de evitar que, se alguém já soubesse como os controladores Promise distribuem os dados por um array listrado.

    
por Jemenake 13.12.2012 / 23:37

1 resposta

3

Ok, eu percebi. Vários manuais Promise indicam que o tamanho da faixa é padronizado para 64k e pode ser definido como 32k ou 128k. Então, eu escrevi um pequeno aplicativo java para combinar de duas fontes diferentes, e funcionou como um encanto! Acontece que eles eram 64k listras.

Aqui está o código, para o caso de alguém mais ter esse problema. Não é extravagante (e só funciona até ficar sem espaço de entrada ou saída), mas vai tirar você de uma pitada.

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();
        }
    }
}
    
por 15.12.2012 / 19:19

Tags