Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]

1. Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]

Pedro
phsmoura

(usa Debian)

Enviado em 23/03/2018 - 14:51h

Eae galera beleza?

Estou fazendo um projeto para criar um HD virtual, formata-lo com meu próprio sistema de arquivos e utilizar meus próprios comandos para manipular diretórios e arquivos dentro do HD virtual. No Linux é bem simples fazer parte disso com os comandos fallocate, dd e mkfs, porém fazer tudo utilizando somente C, ai a coisa complica...

O interpretador de comandos não é dificil de fazer e sobre o sistema de arquivos tenho tudo bem definido, como: tamanho de bloco, quantidade de bytes que serão utilizados para endereço do arquivo ( inode ) e quantidade de bytes que serão utilizados para armazenar o nome do arquivo.

Entretanto, estou com dificuldade para encontrar algum material na net que mostre:
- Como posso criar um arquivo já alocando um espaço pra ele?
- Como formatar este arquivo, para que cada diretório e arquivo obedeça minha formatação?

Agradeço quem souber e puder ajudar.


  


2. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]

Ricardo Fabiano Silva
madrugada

(usa Gentoo)

Enviado em 23/03/2018 - 15:19h

Olá amigo, você pode criar assim:
dd if=/dev/zero of=/home/hd_virt bs=4M count=1024 
Isso vai criar um arquivo de 4GB.

Para formatar:
mkfs -t ext4 hd_virt  
.

Para criar o ponto de montagem e montar:
mkdir /mn/hd_virt  && mount -t ext4 hd_virt /mnt/hd_virt 


Você pode precisar de permissão de root para executar esses comandos.

Boa sorte!


3. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C?

Pedro
phsmoura

(usa Debian)

Enviado em 23/03/2018 - 16:19h

Obrigado pela resposta, mas acredito que você não entendeu minha dúvida!

Não me refiro aos comandos linux para criar um hd virtual, isso é bem simples de fazer como disse no post. Me refiro a como deve ser feito o codigo em C para criar um HD virtual e formata-lo.

Por exemplo, não posso simplesmente usar:
FILE *f_hdv;
f_hdv = fopen("hd_virtual", "wb");

Se eu fizer isso estarei apenas criando um arquivo binario.

Entao como posso alocar espaço, por exemplo, 500MG para um arquivo e este arquivo ser tratado como HD virtual?
Depois como posso formatar esse arquivo com o meu sistema de arquivo? Nao ext4, btrfs, ntfs, etc.. mas sim o meu proprio..





4. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]

Daniel Lara Souza
danniel-lara

(usa Fedora)

Enviado em 23/03/2018 - 16:45h

https://people.gnome.org/~markmc/qcow-image-format.html

não sei se ajuda
qualquer coisa baixa o código do kvm e de uma olhada nos fontes

https://www.linux-kvm.org/page/Code


5. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/03/2018 - 16:56h

phsmoura escreveu:
Por exemplo, não posso simplesmente usar:
FILE *f_hdv;
f_hdv = fopen("hd_virtual", "wb");

Se eu fizer isso estarei apenas criando um arquivo binario.
Entao como posso alocar espaço, por exemplo, 500MG para um arquivo e este arquivo ser tratado como HD virtual?
Depois como posso formatar esse arquivo com o meu sistema de arquivo? Nao ext4, btrfs, ntfs, etc.. mas sim o meu proprio..

Na verdade esse seria o caminho, você abre um arquivo binario é o organiza com a data de acordo com o esquema do "sistema de arquivos" (por exemplo dividir em blocos e cabeçalhos). Tenha em mente que o sistema que usou para cria-lo não ira ter nenhum tipo de interação com este "hd virtual", ah não ser que você mostre para o sistema como interagir com este.



6. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/03/2018 - 17:39h

Você vai criar seu próprio formato de sistema de arquivos, ou vai implementar um formato já existente?

No caso de sistemas de arquivos tradicionalmente usados com UNIX, cada arquivo é associado a um inode, e cada inode tem um número finito de slots que apontam para os primeiros blocos de dados do arquivo, um ponteiro para blocos indiretos (esse bloco contém um número finito de ponteiros para os próximos blocos de dados), e um ponteiro para blocos duplamente indiretos (blocos que contém ponteiros para blocos indiretos). Algumas versões de sistema de arquivos contam ainda com blocos triplamente indiretos.

Qualquer bloco do disco pode funcionar como bloco direto, bloco indireto ou bloco duplamente/triplamente/...mente indexado. Os blocos vão sendo alocados ou liberados de acordo com a disponibilidade de blocos no disco e a necessidade de cada arquivo, a fim de acomodar seu crescimento (ou truncamento!). Para saber quais blocos estão livres para alocação, o sistema utiliza um bitmap, com um bit para cada bloco contido no disco a indicar se tal bloco está em uso ou não.

Esse lay-out é relativamente simples e flexível, mas tem algumas desvantagens, tais como tamanhos e quantidades fixos de inodes e blocos, os quais são definidos em tempo de formatação.

Se você vai fazer algo parecido no seu sistema de arquivos, é você quem tem de dizer.


7. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/03/2018 - 17:51h

Um link interessante a respeito de inode e diretórios no UNIX: https://cs.nyu.edu/courses/spring09/V22.0202-002/lectures/lecture-24.html.


8. criando hd virtual

Pedro
phsmoura

(usa Debian)

Enviado em 28/03/2018 - 17:57h

Obrigado a todos pelas respostas

Bom, vamos por partes! Primeiro, vou me preocupar em criar o hd virtual.
Disseram que o caminho era criar um arquivo com o "fopen" mesmo, então por enquanto tenho a seguinte função no meu codigo:

int createhd(char *nome_hd){
FILE *f_hdv;
f_hdv = fopen(DIRETORIO + nome_hd, "w");

if (f_hdv == NULL){
return -1;
}

fclose(f_hdv);
return 1;
}

Agora tenho que ajustar o codigo para que este arquivo ocupe a quantidade de blocos que vou estipular, por exemplo, utilizar 1000 blocos sendo que cada bloco tem 32 bytes.

Como poderia fazer isso?
Uma solução que pensei foi criar uma matriz com 1000 linhas, considerar cada linha um bloco e popular a matriz com um caractere nulo, porém eu acredito que também devo considerar os caracteres da tabela ASC II e trabalhar com hexadecimais, por isso não me parece certo apenas criar uma matriz, até porque depois tem a formatação com meu sistema de arquivos que vai utilizar ponteiros para os diretorios, provavelmente será uma LDDE...

Agradeço quem puder ajudar e quem quiser olhar o que codei até agora, só clicar no link abaixo:
https://github.com/phsmoura/Sistema-de-arquivos---SO/blob/master/main.c




9. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/03/2018 - 23:37h

phsmoura escreveu:
Agora tenho que ajustar o codigo para que este arquivo ocupe a quantidade de blocos que vou estipular, por exemplo, utilizar 1000 blocos sendo que cada bloco tem 32 bytes.
Como poderia fazer isso?

A ideia de blocos existe quando se está lendo o arquivo, inicialmente você pode simplesmente escrever zeros no arquivo.

phsmoura escreveu:
Agradeço quem puder ajudar e quem quiser olhar o que codei até agora, só clicar no link abaixo:
https://github.com/phsmoura/Sistema-de-arquivos---SO/blob/master/main.c

só algumas observações:
* prefira usar "enum" ao invez de numeros soltos (facilitara futura manutenção e entendimento)
* evite sempre que possivel o uso do "gets" é extremamente inseguro.
* evite duplicação de codigo, por exemplo pode abrir o arquivo no "main" e passa-lo para as outras funções.
* considere definir como "static" funções que não serão usadas fora do arquivo em que foram definidas.
* lembre-se que variaveis globais podem ser incovenientes caso deseje usar threads eventualmente



10. Caramba essa ideia é genial

lucas
1lucas1

(usa Linux Mint)

Enviado em 29/03/2018 - 00:09h

phsmoura escreveu:

Obrigado pela resposta, mas acredito que você não entendeu minha dúvida!

Não me refiro aos comandos linux para criar um hd virtual, isso é bem simples de fazer como disse no post. Me refiro a como deve ser feito o codigo em C para criar um HD virtual e formata-lo.

Por exemplo, não posso simplesmente usar:
FILE *f_hdv;
f_hdv = fopen("hd_virtual", "wb");

Se eu fizer isso estarei apenas criando um arquivo binario.

Entao como posso alocar espaço, por exemplo, 500MG para um arquivo e este arquivo ser tratado como HD virtual?
Depois como posso formatar esse arquivo com o meu sistema de arquivo? Nao ext4, btrfs, ntfs, etc.. mas sim o meu proprio..



Caramba sua ideia é genial, vc pode "esconder diversos arquivos em um único arquivo binário" porem não entendi como vc faria para recupera-los depois de anexa-los ao arquivo de 500mg



11. Re: Como criar um HD virtual e sistema de arquivos utilizando a linguagem C? [RESOLVIDO]


oxidante

(usa Debian)

Enviado em 30/03/2018 - 22:17h

Como posso criar um arquivo já alocando um espaço pra ele?

O linux tem 2 funções para isso: fallocate() e posix_fallocate(). Sugiro que use a segunda devido a sua portabilidade. Passe o descritor de arquivo returnado pela função open().
Para mais informações:
man posix_fallocate
man 2 open


12. Obrigado

Pedro
phsmoura

(usa Debian)

Enviado em 31/03/2018 - 13:29h

Valeu a ajuda de todos o codigo ta saindo, mas claro que ainda tenho problemas. Como tem pessoas que nao estao entendendo minha duvida e postam comandos do linux eu vou colocar esse topico como resolvido e criar outros com minha duvida específica

Muito obrigado!



  
01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts