Skip to content

kostich/datotekomat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JSDAT-1 (Jednostavan Sistem Datoteka - Izdanje 1)

A simple file system and a CLI tool designed for educational purposes and experimental use.

Overview

JSDAT-1 is a custom file system with the following on-disk layout:

+-----------------------------------+
|   Boot Area (4096 bytes)          | - Space for bootloader
+-----------------------------------+
|   Superblock (512 bytes)          | - Filesystem metadata
+-----------------------------------+
|   FSEntries (n x 128 bytes)       | - Directory entries
+-----------------------------------+
|   FAT (n x 4 bytes)               | - File Allocation Table
+-----------------------------------+
|   Data Area (n x sector size)     | - Actual file content
+-----------------------------------+

Building

1. Install Go

  • Linux: use your distro's package manager or follow the instructions at https://go.dev/dl/
    # Fedora
    sudo dnf install golang
    # Ubuntu/Debian
    sudo apt install golang-go
  • macOS: install via Homebrew or download from https://go.dev/dl/
    brew install go
  • Windows: download and run the installer from https://go.dev/dl/

2. Build

Inside the project directory run:

go build

This produces a datotekomat binary (or datotekomat.exe on Windows) in the current directory.

3. Run

Either invoke it directly:

./datotekomat        # Linux/macOS
.\datotekomat.exe    # Windows

Or move it somewhere on your PATH (e.g. /usr/local/bin on Linux/macOS) to call it as just datotekomat from anywhere.

Default Configuration

Parameter Default Flag
TotalSectors 8 -ус
BytesPerSector 16 -бпс
TotalFSEntries 4 -уст
Label "ЈСДАТ-1" -етк

CLI Tool: датотекомат (datotekomat)

датотекомат [global options] <command> [command flags/arguments]

Global Options

Flag Description
-п Show help
Verbose output
-издање Show version
-пв Use deterministic test timestamps

Commands

Format a new filesystem (фмт)

датотекомат фмт <path>
датотекомат -в фмт -ус 1024 -бпс 512 -уст 64 -етк "МОЈ_СД" myfs.img

Flags for фмт:

Flag Description Default
-ус <n> Total sectors 8
-бпс <n> Bytes per sector 16
-уст <n> Total filesystem entries 4
-етк <str> Filesystem label "ЈСДАТ-1"

Show filesystem details (осб)

датотекомат осб myfs.img

Copy file into filesystem (кпу)

датотекомат кпу <local_file> <internal_path> <fs_file>
датотекомат кпу hello.txt / myfs.img
датотекомат кпу data.bin /подаци myfs.img

Copy file out of filesystem (кпс)

датотекомат кпс <internal_path> <external_path> <fs_file>
датотекомат кпс /hello.txt ./extracted.txt myfs.img

List directory contents (лс)

датотекомат лс <path> <fs_file>
датотекомат лс / myfs.img

Display filesystem tree (стабло)

датотекомат стабло <path> <fs_file>
датотекомат стабло / myfs.img

Example output:

/ (8.00Б)
├── систем/ (4.00Б)
│   └── kernel.bin (512.00Б)
└── подаци/ (4.00Б)
    └── config.txt (32.00Б)

Rename entry (пнј)

датотекомат пнј <existing_path> <new_name> <fs_file>
датотекомат пнј /old.txt new.txt myfs.img

Delete entry (обш)

датотекомат обш <path> <fs_file>
датотекомат обш /hello.txt myfs.img

Create folder (нпфас)

датотекомат нпфас <path> <fs_file>
датотекомат нпфас /подаци myfs.img

Change permissions (прист)

датотекомат прист <path> <mode> <fs_file>
датотекомат прист /hello.txt 750 myfs.img

Change UID/GID (иб)

датотекомат иб <path> <uid:gid> <fs_file>
датотекомат иб /hello.txt 1000:1000 myfs.img

Create link (вежи)

датотекомат вежи <destination> <link_name> <fs_file>
датотекомат вежи /hello.txt /пречица myfs.img

Write bootloader (упдч)

датотекомат упдч <bootloader_file> <fs_file>
датотекомат упдч boot.bin myfs.img

Rename label (етк)

датотекомат етк <new_label> <fs_file>
датотекомат етк "MY_FS" myfs.img

Change timestamp (врм)

датотекомат врм <path> <label> <time> <fs_file>
датотекомат врм /hello.txt н 15.01.2025-10:30:00 myfs.img

Labels: н (created), и (modified), п (accessed). Time format: dd.mm.yyyy-hh:mm:ss.

Example Session

# Create a filesystem with custom parameters
датотекомат -в фмт -ус 1024 -бпс 512 -уст 100 myfs.img

# Create directory structure
датотекомат нпфас /систем myfs.img
датотекомат нпфас /подаци myfs.img

# Copy files in
датотекомат кпу kernel.bin /систем myfs.img
датотекомат кпу config.txt /подаци myfs.img

# List contents
датотекомат лс / myfs.img

# Show tree view
датотекомат стабло / myfs.img

# Add bootloader
датотекомат упдч boot.bin myfs.img

# Inspect the filesystem
датотекомат осб myfs.img

Features

Entry Types

  • Files (0x01): Regular files with data
  • Folders (0x02): Directories containing other entries
  • Links (0x03): Symbolic links pointing to other entries

Entry Metadata (128 bytes per entry)

  • Name: 62 bytes (up to 31 UTF-8 characters or 62 ASCII characters)
  • Permissions: Unix-style rwx for user, group, and world
  • Ownership: UID (2 bytes) and GID (2 bytes)
  • Timestamps: Creation, modification, and access times (14 bytes each)
  • Checksum: CRC32 for data integrity verification
  • Size: File size in bytes (uint32)

Limitations

  • Max file size: min(~4 GB, TotalSectors x BytesPerSector)
  • Max filename: 62 bytes (62 ASCII chars or ~31 UTF-8 chars); ? is reserved
  • Max sectors: ~4 billion (uint32), practically much less
  • Folders must be empty before deletion; root folder cannot be deleted
  • One FSEntry consumed per file, folder, or link
  • No fragmentation management, journaling, compression, or encryption

Advantages

  • Simple structure, great for learning filesystem concepts
  • Fully configurable sector size and entry count
  • Self-contained in a single file, portable across platforms
  • Dedicated boot area for custom bootloaders
  • CRC32 checksums for detecting data corruption
  • Unix-style permissions with user/group/world
  • Native UTF-8 filename support
  • Symbolic link support

ЈСДАТ-1 (Једноставан Систем Датотека - Издање 1)

Једноставан систем датотека и алат за командну линију намењен образовним и експерименталним потребама.

Преглед

ЈСДАТ-1 је прилагођени систем датотека са следећим распоредом на диску:

+-----------------------------------+
|   Подизач (4096 бајтова)          | - Простор за подизач система
+-----------------------------------+
|   Супер-блок (512 бајтова)        | - Метаподаци система датотека
+-----------------------------------+
|   СД ставке (н x 128 бајтова)     | - Ставке фасцикли
+-----------------------------------+
|   ТДД (н x 4 бајта)               | - Табела доделе датотека
+-----------------------------------+
|   Податковна област (н x сектор)  | - Стварни садржај датотека
+-----------------------------------+

Градња

1. Инсталација Go-а

  • Linux: преко управника пакета дистрибуције или пратећи упутства са https://go.dev/dl/
    # Федора
    sudo dnf install golang
    # Убунту/Дебијан
    sudo apt install golang-go
  • macOS: преко Homebrew-а или преузимањем са https://go.dev/dl/
    brew install go
  • Windows: преузети и покренути инсталациони програм са https://go.dev/dl/

2. Градња

У директоријуму пројекта покренути:

go build

Резултат је извршна датотека datotekomat (или datotekomat.exe на Windows-у) у тренутном директоријуму.

3. Покретање

Директно из директоријума:

./datotekomat        # Linux/macOS
.\datotekomat.exe    # Windows

Или преместити у путању претраге (PATH). Нпр. /usr/local/bin на Linux/macOS ради позивања са било ког места као datotekomat.

Подразумевана подешавања

Параметар Подразумевано Заставица
Укупно сектора 8 -ус
Бајтова по сектору 16 -бпс
Укупно СД ставки 4 -уст
Етикета "ЈСДАТ-1" -етк

Алат: датотекомат

датотекомат [опције] <наредба> [заставице/аргументи наредбе]

Опште опције

Заставица Опис
-п Приказ помоћи
Више појединости током рада
-издање Приказ издања
-пв Коришћење пробних временских ознака

Наредбе

Форматирање новог система датотека (фмт)

датотекомат фмт <путања>
датотекомат -в фмт -ус 1024 -бпс 512 -уст 64 -етк "МОЈ_СД" мојсд.слк

Заставице за фмт:

Заставица Опис Подразумевано
-ус <н> Укупно сектора 8
-бпс <н> Бајтова по сектору 16
-уст <н> Укупно ставки система датотека 4
-етк <низ> Етикета система датотека "ЈСДАТ-1"

Приказ особина (осб)

датотекомат осб мојсд.слк

Копирање датотеке унутар (кпу)

датотекомат кпу <локална_датотека> <унутрашња_путања> <систем_датотека>
датотекомат кпу здраво.ткт / мојсд.слк
датотекомат кпу подаци.бин /подаци мојсд.слк

Копирање датотеке споља (кпс)

датотекомат кпс <унутрашња_путања> <спољна_путања> <систем_датотека>
датотекомат кпс /здраво.ткт ./извучено.ткт мојсд.слк

Листање садржаја (лс)

датотекомат лс <путања> <систем_датотека>
датотекомат лс / мојсд.слк

Приказ стабла система датотека (стабло)

датотекомат стабло <путања> <систем_датотека>
датотекомат стабло / мојсд.слк

Пример излаза:

/ (8.00Б)
├── систем/ (4.00Б)
│   └── језгро.бин (512.00Б)
└── подаци/ (4.00Б)
    └── подешавања.ткт (32.00Б)

Преименовање (пнј)

датотекомат пнј <постојећа_путања> <нови_назив> <систем_датотека>
датотекомат пнј /старо.ткт ново.ткт мојсд.слк

Брисање (обш)

датотекомат обш <путања> <систем_датотека>
датотекомат обш /здраво.ткт мојсд.слк

Стварање фасцикле (нпфас)

датотекомат нпфас <путања> <систем_датотека>
датотекомат нпфас /подаци мојсд.слк

Промена овлашћења (прист)

датотекомат прист <путања> <овлашћење> <систем_датотека>
датотекомат прист /здраво.ткт 750 мојсд.слк

Промена ИБ корисника/групе (иб)

датотекомат иб <путања> <иб_корисника:иб_групе> <систем_датотека>
датотекомат иб /здраво.ткт 1000:1000 мојсд.слк

Стварање везе (вежи)

датотекомат вежи <одредиште> <назив_везе> <систем_датотека>
датотекомат вежи /здраво.ткт /пречица мојсд.слк

Упис подизача система (упдч)

датотекомат упдч <датотека_подизача> <систем_датотека>
датотекомат упдч подизач.бин мојсд.слк

Преименовање етикете (етк)

датотекомат етк <нова_етикета> <систем_датотека>
датотекомат етк "МОЈ_СД" мојсд.слк

Промена времена (врм)

датотекомат врм <путања> <ознака> <време> <систем_датотека>
датотекомат врм /здраво.ткт н 15.01.2025-10:30:00 мојсд.слк

Ознаке: н (настанак), и (измена), п (приступ). Формат времена: дд.мм.гггг-чч:мм:сс.

Пример сесије

# Стварање система датотека са прилагођеним параметрима
датотекомат -в фмт -ус 1024 -бпс 512 -уст 100 мојсд.слк

# Стварање структуре фасцикли
датотекомат нпфас /систем мојсд.слк
датотекомат нпфас /подаци мојсд.слк

# Копирање датотека унутар
датотекомат кпу језгро.бин /систем мојсд.слк
датотекомат кпу подешавања.ткт /подаци мојсд.слк

# Листање садржаја
датотекомат лс / мојсд.слк

# Приказ стабла
датотекомат стабло / мојсд.слк

# Упис подизача система
датотекомат упдч подизач.бин мојсд.слк

# Преглед система датотека
датотекомат осб мојсд.слк

Одлике

Врсте ставки

  • Датотеке (0x01): Обичне датотеке са подацима
  • Фасцикле (0x02): Фасцикле које садрже друге ставке
  • Везе (0x03): Симболичке везе ка другим ставкама

Метаподаци ставке (128 бајтова по ставки)

  • Назив: 62 бајтова (до 31 UTF-8 знак или 62 ASCII знака)
  • Овлашћења: чпш (читање, писање, извршавање) за корисника, групу и остале
  • Власништво: ИБ корисника (2 бајта) и ИБ групе (2 бајта)
  • Временске ознаке: настанак, измена и приступ (14 бајтова свака)
  • Контролни збир: CRC32 за проверу целовитости
  • Величина: величина у бајтовима (uint32)

Ограничења

  • Највећа датотека: мин(~4 ГБ, укупно сектора x бајтова по сектору)
  • Највећи назив: 62 бајтова (62 ASCII знака или ~31 UTF-8 знак); ? је резервисан
  • Највише сектора: ~4 милијарде (uint32), практично знатно мање
  • Фасцикле морају бити празне пре брисања; коренска фасцикла не може бити обрисана
  • Једна СД ставка по датотеци, фасцикли или вези
  • Без управљања фрагментацијом, журнала, компресије или шифровања

Предности

  • Једноставна структура, одлична за учење о системима датотека
  • Потпуно подесива величина сектора и броја ставки
  • Самосадржана у једној датотеци, преносива на различите платформе
  • Наменски простор за подизач система
  • CRC32 контролни збирови за откривање оштећења података
  • Овлашћења по узору на Јуникс (корисник/група/остали)
  • Изворна подршка за UTF-8 називе датотека
  • Подршка за симболичке везе

About

A simple file system and a CLI tool designed for educational purposes and experimental use.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors