O conteúdo de / dev / disk0 (/ dev / sda, etc) pode ser usado como stdin?

1

Estou aprendendo sobre o sistema de arquivos /dev . Comecei com /dev/sd* (Linux) e /dev/disk* (OS X) e encontrei um comportamento interessante. Se eu correr:

$ sudo xxd -l 1024 /dev/disk0

Eu recebo a seguinte saída:

0000000: 33c0 8ed0 bc00 7c8e c08e d8be 007c bf00  3.....|......|..
0000010: 06b9 0002 fcf3 a450 681c 06cb fbb9 0400  .......Ph.......
0000020: bdbe 0780 7e00 007c 0b0f 850e 0183 c510  ....~..|........
0000030: e2f1 cd18 8856 0055 c646 1105 c646 1000  .....V.U.F...F..
0000040: b441 bbaa 55cd 135d 720f 81fb 55aa 7509  .A..U..]r...U.u.
0000050: f7c1 0100 7403 fe46 1066 6080 7e10 0074  ....t..F.f'.~..t
0000060: 2666 6800 0000 0066 ff76 0868 0000 6800  &fh....f.v.h..h.
0000070: 7c68 0100 6810 00b4 428a 5600 8bf4 cd13  |h..h...B.V.....
< ... >

Um pequeno Googling parece identificar isso como o início de um MBR (eu tenho o Bootcamp instalado).

No entanto, o seguinte não funciona:

$ sudo xxd -l 1000 < /dev/disk0
-bash: /dev/disk0: Permission denied

Minhas perguntas são:

  • Muitos aplicativos ocultam seções críticas de discos (por exemplo, MBR, inodes do sistema de arquivos, limites de partição, etc.). A saída de xxd é um verdadeiro dump de baixo nível de um dispositivo? Estou vendo tudo byte-by-by no dispositivo?
  • Como /dev/disk0 claramente contém dados, por que não posso usá-lo como um fluxo de stdin?
por Ephemera 18.02.2015 / 04:03

3 respostas

4

Many applications hide critical sections of disks (e.g. MBR, file system inodes, partition boundaries, etc).

Quais aplicativos?

Não é uma coisa de aplicativo; geralmente é o sistema operacional que lida com sistemas de arquivos e particionamento de disco.

Is the output from xxd a true low-level dump of a device?

Mais como nível médio , mas sim. Você está vendo os dados brutos exatamente como o sistema operacional os escreveu e exatamente como o sistema operacional os lerá de volta. Geralmente, há um MBR nos primeiros 512 bytes, geralmente um GPT nos próximos kilobytes e, em algum lugar no setor 63 (antigo) ou 2048 (novo), você verá as estruturas do sistema de arquivos da primeira partição.

Um dump de nível true low significaria dados como o controlador de disco o gravou: não apenas os bytes legíveis pelo SO, mas também dados de nivelamento de desgaste, falha SMART registros, talvez chaves de criptografia. Mas é invisível para o sistema operacional, e você geralmente não pode acessá-lo diretamente usando qualquer programa - apenas usando um hardware de recuperação de dados especializado.

(Dito isto, alguns dispositivos flash são uma exceção; eles não têm firmware de disco, o sistema operacional faz tudo - por exemplo, o sistema de arquivos jffs2 gerencia o nivelamento de desgaste do flash no nível do SO).

Am I seeing everything byte-by-byte on the device?

Sim, você está vendo da mesma maneira que um sistema operacional o vê.

As /dev/disk0 clearly contains data, why can I not use it as a stdin stream?

Claro que você pode. De fato você fez usá-lo como um fluxo em seu primeiro exemplo; a única diferença é que no primeiro exemplo xxd era o que chamava open ("/ dev / disk0"); Enquanto isso, no seu segundo exemplo que foi feito pelo seu shell ( sh , bash , zsh ).

Mas essa diferença é o que causa a mensagem de erro. Mas não tem nada a ver com você tentando ler um disco; a "Permissão negada" significa literalmente que você não pode abrir /dev/disk0 porque você deve ser root para fazer isso.

(Isto foi respondido muitas vezes neste site. Aqui , aqui , aqui , aqui , aqui e aqui .

Para expandir o anterior, o redirecionamento stdin / stdout acontece com o shell abrindo o arquivo antes de iniciar o programa. Portanto, em seu primeiro exemplo, sudo xxd /dev/disk0 primeiro usa sudo para executar xxd /dev/disk0 com privilégios de root.

Mas quando você executa sudo xxd < /dev/disk0 , o redirecionamento < /dev/disk0 ainda é processado pelo seu shell unprivileged ; sudo xxd ainda não foi executado.

Use sudo sh -c "xxd < /dev/disk0" para que o comando inteiro seja processado como root.

    
por 18.02.2015 / 09:59
3

Eu não sei sobre sua primeira pergunta, mas a julgar pela página man do xxd , parece que esse é provavelmente o caso.

Para a questão stdin, você pode redirecionar /dev/disk0 para programas que aceitam stdin. O problema que você está vendo é que o sudo não realiza o redirecionamento, portanto, o acesso a /dev/disk0 é baseado nas permissões de seu usuário comum.

Veja Stack Overflow e esta questão para opções.

    
por 18.02.2015 / 05:45
-2

para mim, não está claro o que você quer fazer. Talvez isso possa ajudá-lo. Se você quiser acessar os dados brutos do disco, o programa dd é o caminho certo. Com dd você pode copiar o MBR ou o disco inteiro.

ciao ryder

    
por 18.02.2015 / 10:34