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/2019 → 05/05/2019
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.
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:
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
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
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
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 nastdout
-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
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.
- Google - https://www.google.com/
- Stack Overflow - https://stackoverflow.com/
- libfuse API documentation - https://libfuse.github.io/doxygen/index.html
- Repositório da implementação de referência do FUSE para Linux: https://github.com/libfuse/libfuse
- Lista de exemplos de uso da API neste mesmo repositório: https://github.com/libfuse/libfuse/tree/master/example
- Exemplo de uma API fuse que só repassa as chamadas para o FS original: https://github.com/libfuse/libfuse/blob/master/example/passthrough.c
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
- Veja a função
- Armazenamento e recuperação de datas (via
ls
por exemplo) - Armazenamento e alteração direitos usando
chown
echgrp
- Aumento do número máximo de arquivos para pelo menos 1024
- Persistência - Incluindo a criação e "formatação" de um arquivo novo para conter o seu "disco".
- 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)
- 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.
- Programas com erros de compilação receberão nota 0.
- O ambiente de testes será Linux com FUSE2 e FUSE3 (você pode usar qualquer um) e GCC.
- 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.
- Programas sem boa documentação no código terão a sua nota reduzida.
- 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:
- 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, …
- Quais modificações foram feitas
- 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, …
- Instruções detalhadas sobre como compilar e executar o seu programa.
- Análise da escalabilidade da sua implementação. Ela é escalável?
- 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 |