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).
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.
./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.
Leitura: info, cat, attr, cd, ls, testi, testb, export, pwd.
Escrita: touch, mkdir, rm, rmdir, rename.
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
- So o caminho de escrita "simples" e suportado:
touch/mkdire 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 quandodesc_size == 64(featureINCOMPAT_64BIT), que e o caso de todas as imagens de teste fornecidas. renameso troca o nome dentro do mesmo diretorio (nao move entre diretorios), conforme a simplificacao do enunciado.