Projeto de Programação
BrisaFS - Um sistema de arquivos baseado em FUSE

Universidade Federal do ABC
MCTA026-13 - Sistemas Operacionais
2019.Q1

Professor: Emilio Francesquini
E-mail: e.francesquini@ufabc.edu.br

Data limite: 28/04/201905/05/2019

brisa.jpg

Figura 1: Mike Bitzenhofer (CC BY-NC-ND 2.0)


Índice



1 Introdução.1

Filesystem in Userspace (FUSE) é uma interface em software para sistemas operacionais estilo UNIX que permite que usuários sem direitos de administração criem seus próprios sistemas de arquivos sem a necessidade de editar código do kernel do sistema operacional. Isso é feito através da execução do código do sistema de arquivos em modo do usuário conversando com o módulo FUSE, este sim executando em modo privilegiado, fazendo a ponte com as interfaces do sistema operacional propriamente dito.

FUSE_structure.png

Figura 2: Um diagrama do funcionamento do FUSE. (Fonte: Wikipedia - CC BY-SA 3.0)

No exemplo da figura acima a requisição do usuário (ls -l /tmp/fuse) é redirecionada pelo Kernel (VFS) para o FUSE. O FUSE então executa o programa para tratar a requisição (./hello) e repassa a requisição (ls -l /tmp/fuse). Após o tratamento da requisição o programa devolve uma resposta ao FUSE que por sua vez a redireciona para o espaço do usuário e para o programa que havia feito a requisição original.


Neste projeto vamos implementar o nosso próprio sistema de arquivos, o BrisaFS2, utilizando FUSE. Nas próximas seções uma versão incompleta, porém funcional, do sistema de arquivos é apresentada. É seu trabalho estendê-la para que ela atenda a todos os requisitos especificados na Seção Milestones.



2 O projeto

Para explicar o que o seu projeto deve ser capaz de fazer, vamos antes explicar o passo a passo de como a implementação base (fornecida) funciona.

2.1 A implementação base

2.1.1 Compilando

Para ser capaz de trabalhar com a implementação base:


  1. Instale as bibliotecas necessárias


    O repositório tem 2 versões do código, uma que utiliza o FUSE2 e outra que utiliza o FUSE3. Algumas distribuições (como o último Ubuntu 18.10) ainda não trazem os pacotes para FUSE3. Neste caso você pode trabalhar com o FUSE2 sem problemas (ou se estiver se sentindo corajoso, você pode baixar e compilar o FUSE3 você mesmo! :-p). Os nomes dos pacotes do FUSE3 são como você esperaria: fuse3, libfuse3-dev. Se você estiver usando outras distros com rolling release como o Arch Linux, o pacote apropriado (fuse3) já está disponível.


    Para instalar no Ubuntu/Debian/Mint, por exemplo:

    $ apt-get install gcc make fuse libfuse-dev
    
  2. Clone o repositório do projeto


    • Atenção! Após se cadastrar no GitHub Education e aceitar a tarefa um novo repositório privado será criado para a seu grupo. É este repositório que você deve clonar! Caso você clone o repositório principal você não terá direitos para fazer atualizações.
    $ git clone git@github.com:ufabc-bcc/2019_Q1_SO_BrisaFS-NOME-DO-SEU-GRUPO.git
    
  3. Compile o código


    No repositório você vai encontrar duas versões do código. Uma para FUSE 3 e outra para FUSE 2.

    Escolha a que desejar, ou escolha diretamente a FUSE2 caso a sua distribuição ainda não tenha pacotes para a versão mais recente.

    • Versão FUSE3

      $ gcc -Wall -Werror -O3 -g brisafs_v3.c -o brisafs `pkg-config fuse3 --cflags --libs`
      
    • Versão FUSE2

      $ gcc -D_FILE_OFFSET_BITS=64 -Wall -Werror -O3 -g brisafs_v2.c -o brisafs -lfuse
      
  4. Verifique que o código está funcionando na sua máquina


    • Crie um diretório para servir de base para o seu sistema de arquivos
    • Monte o sistema de arquivos no diretório criado
    $ mkdir /tmp/brisa_mnt_point
    $ ./brisafs -f -d -s /tmp/brisa_mnt_point
    
    • Os parâmetros são os seguintes
      • -f Roda em foreground. Interessante durante o desenvolvimento para ver as saídas do programa na stdout
      • -d Imprime informações de depuração
      • -s Single-threaded, informa ao FUSE que a implementação não aceita chamadas simultâneas. Assim o FUSE garante que só efetuará uma chamada após uma eventual chamada anterior ter sido completada.
      • /tmp/brisa_mnt_point Ponto de montagem onde o sistema de arquivos BrisaFS estará acessível
  5. Em outro terminal, acesse o sistema de arquivos recém montado e tente os seguintes comandos


    $ cd /tmp/brisa_mnt_point/
    $ ls
    'UFABC SO 2019.txt'
    $ cat UFABC\ SO\ 2019.txt
    Adoro as aulas de SO da UFABC!
    $ touch teste
    $ cat > palavra_cabalistica.txt
    Parangaricotirimirruaro!
    ^D
    $ ls -lsa
    total 0
    0 drwxr-xr-x  2 root root   0 Dec 31  1969  .
    0 drwxrwxrwt 24 root root 820 Mar 11 20:40  ..
    0 -rw-r--r--  1 root root  25 Dec 31  1969  palavra_cabalistica.txt
    0 -rw-r--r--  1 root root   0 Dec 31  1969  teste
    0 -rw-r--r--  1 root root  31 Dec 31  1969 'UFABC SO 2019.txt'
    $ cat palavra_cabalistica.txt
    Parangaricotirimirruaro!
    $
    

2.1.2 O código

O Código completo pode ser baixado diretamente do repositório que você vai criar quando se inscrever no GitHub Classroom. Ele também está disponível aqui: https://github.com/ufabc-bcc/2019.Q1.SO.BrisaFS


Leia atentamente o código (e os comentários) para entender como o FUSE funciona e como a implementação de base funciona.


Atenção: Faz parte da sua avaliação saber procurar na Internet por soluções ou pela descrição de uma função. Use e abuse do sistema de issues do GitHub (explicado mais abaixo) para tirar as suas dúvidas. Os seguintes recursos também podem ajudar na sua tarefa.




3 Milestones

Os milestones abaixo indicam o mínimo que você precisa fazer para alcançar as notas listadas

  • Nota 5
    • Persistência - Incluindo a criação e "formatação" de um arquivo novo para conter o seu "disco".
      • Veja a função ftruncate para criar um arquivo com o tamanho pré-determinado
    • Armazenamento e recuperação de datas (via ls por exemplo)
    • Armazenamento e alteração direitos usando chown e chgrp
    • Aumento do número máximo de arquivos para pelo menos 1024
  • Nota 7
    • Aumento do tamanho máximo do arquivo para pelo menos 64 MB
    • Suporte à criação de diretórios
    • Exclusão de arquivos
  • Nota 10
    • Suporte a "discos" de tamanhos arbitrários
    • Arquivos com tamanho máximo de pelo menos 1GB
    • Controle de arquivos abertos/fechados
  • Nota 12
    • Funcionalidades julgadas excepcionais além das pedidas podem gerar um bônus de até 2 pontos. Converse com o professor para saber se a sua ideia é considerada excepcional e quanto ela vale.



4 Entregas e avaliação

Todos as entregas descritas abaixo devem ser feitas via repositório no GitHub. Para criar o reposítório acesse: https://classroom.github.com/g/pCeYmj1T


Para dúvidas gerais sobre o projeto crie um issue em: https://github.com/ufabc-bcc/2019.Q1.SO.BrisaFS

Atenção, este repositório e issues são visíveis a TODOS os grupos.


Para dúvidas específicas sobre o seu projeto, seu código ou que contenham informações sensíveis (que você não quer que os outros grupos tenham acesso), crie um issue no seu próprio repositório.


A avaliação levará em conta não apenas o resultado final entregue, mas também todo o processo para chegar no resultado. Este processo será avaliado pelos commits no repositório do GitHub. Usuários com poucos ou nenhum commit receberão notas inferiores àqueles com alta participação. A avaliação não levará em conta o número de commits mas sim a sua relevância e a sua regularidade. Por exemplo, um commit que serviu apenas para colocar um espaço entre 1+2 para transformá-lo em 1 + 2 não será considerado.

4.1 Código (7 pontos)

  1. O seu repositorio deve conter todo o código fonte do seu programa juntamente com instruções claras sobre sua compilação e execução. Veja alguns ótimos exemplos em alguns projetos abertos no GitHub.
  2. Programas com erros de compilação receberão nota 0.
  3. O ambiente de testes será Linux com FUSE2 e FUSE3 (você pode usar qualquer um) e GCC.
  4. Programas que não cumprirem os requisitos (resultados incorretos, erros durante a execução, …) descritos nas seções anteriores terão uma redução na nota.
  5. Programas sem boa documentação no código terão a sua nota reduzida.
  6. Programas desorganizados (nomes de variáveis/funções ruins, falta de identação, …) terão a sua nota reduzida.

4.2 Relatório (3 pontos)

Juntamente com o seu código você deverá entregar um relatório (máximo de 5 páginas) que contenha:

  1. Descrição do projeto. Como funciona o seu sistema de arquivos, quais estruturas de dados foram utilizadas, como ele guarda os blocos livres e ocupados, qual a estrutura utilizada para encadeamento de blocos de um arquivo grande, …
  2. Quais modificações foram feitas
  3. Limites dos seu sistema de arquivos (número de arquivos, tamanho máximo do nome de arquivo, tamanho máximo de um arquivo, máximo de arquivos por diretório, tamanho máximo de disco, …
  4. Instruções detalhadas sobre como compilar e executar o seu programa.
  5. Análise da escalabilidade da sua implementação. Ela é escalável?
  6. Pontos que poderiam ser melhorados na sua implementação e como você sugeriria melhorá-los.


Dica: Utilize como referência o capítulo 12 do livro [SGG] 9ª edição.

4.3 Bônus (Até 2 pontos)

Caso sejam implementadas funcionalidades além do exigido pelos milestones.

4.4 Política de atrasos

Projetos entregues com atraso sofrerão uma redução da nota conforme a tabela abaixo:

Dias em Atraso Nota Máxima
0 10
1 7
2 6
3 5
>3 0

Notas de Rodapé:

1

Descrição retirada da Wikipedia

2

BrisaFS tem este nome pois basta bater uma brisa que ele perde todos os seus arquivos…

Autor: Emilio Francesquini

Criado em: 2019-04-23 ter 21:14