Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ext4sh

Shell interativo para ler e escrever numa imagem de sistema de arquivos EXT4 diretamente, sem usar mount/debugfs/bibliotecas ext4 prontas. Feito para o trabalho de BCC5002 - Sistemas Operacionais (UTFPR).

Build

Pre-requisitos (Linux):

sudo apt install build-essential libcrypto++-dev

O modulo de checksum (src/ext4/checksum/), fornecido pelo professor, usa a biblioteca Crypto++ para calcular os CRC32C do ext4 (metadata_csum). O restante do projeto e C puro (C99); apenas esse modulo e C++, compilado separadamente e linkado com -lcryptopp.

make

Gera o binario ext4sh na raiz do projeto.

Uso

./ext4sh <caminho_da_imagem_ext4>

Exemplo, usando uma das imagens de teste fornecidas pelo professor:

./ext4sh images_ext4/myext4image4k.img
ext4shell:[myext4image4k/] $ ls
ext4shell:[myext4image4k/] $ cd documentos
ext4shell:[myext4image4k/documentos] $ cat hello.txt

Digite help para listar todos os comandos disponiveis.

Comandos implementados

Leitura: info, cat, attr, cd, ls, testi, testb, export, pwd.

Escrita: touch, mkdir, rm, rmdir, rename.

Organizacao do codigo

src/main.c                 REPL (le a linha, despacha o comando)
src/commands/commands.c    tabela de comandos / dispatch
src/commands/<nome>/       um comando por pasta (cmd_<nome>)
src/ext4/structure.h       structs on-disk (superblock, group desc, inode,
                            dir entry, extent) - layout validado byte a byte
                            contra as imagens de teste fornecidas
src/ext4/shell_state.h     estado do shell (imagem aberta, superblock,
                            group descriptors em memoria, diretorio corrente)
src/ext4/fs.c              montagem da imagem, leitura/escrita de bloco e
                            de inode
src/ext4/bitmap.c          testi/testb + alocacao/liberacao de inode e bloco
src/ext4/extent.c          leitura da arvore de extents (qualquer
                            profundidade) e insercao de um bloco novo
src/ext4/dirent.c          iteracao/busca/insercao/remocao de entradas de
                            diretorio
src/ext4/path.c            resolucao de caminho absoluto/relativo, "." e ".."
src/ext4/csum.c            liga as funcoes de checksum do professor
                            (src/ext4/checksum/) as estruturas certas,
                            respeitando a feature metadata_csum da imagem

Limitacoes conhecidas

  • So o caminho de escrita "simples" e suportado: touch/mkdir e a insercao de entradas de diretorio nunca crescem a arvore de extents alem dos 4 extents que cabem dentro do proprio inode (i_block), ou seja, nunca criam blocos de indice externos de extents. Leitura (cat, export, ls, rm, rmdir) suporta arvores de extents com qualquer profundidade.
  • Diretorios com hash tree (htree) nao sao suportados (fora do escopo do enunciado).
  • Checksum de blocos de indice de extents externos (checksum_extent) nao e recalculado, pelo mesmo motivo do primeiro item: este projeto nunca cria esse tipo de bloco.
  • Checksum de group descriptor (bg_checksum) so e recalculado quando desc_size == 64 (feature INCOMPAT_64BIT), que e o caso de todas as imagens de teste fornecidas.
  • rename so troca o nome dentro do mesmo diretorio (nao move entre diretorios), conforme a simplificacao do enunciado.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages