Skip to main content

File System Structures

What is a File System?

A file system is how an operating system organizes files on storage devices. It provides:
  • Hierarchical organization - Tree structure of directories and files
  • Logical grouping - Related files organized together
  • Access control - Permissions, ownership, auditing
  • Abstraction - Hide physical storage details from users
90% of system administration work involves operating on file structures - managing permissions, data, backups, and configurations.

File System Types

Different file systems optimize for different use cases:

Considerations When Choosing

  • File name length - Some support only 11 characters
  • File size limits - Maximum individual file size
  • Number of files - Optimized for many small vs few large files
  • Performance - Speed for specific workloads
  • Features - Permissions, encryption, compression, journaling
You can format different devices/partitions with different file systems on the same computer.

Formatting

Formatting prepares a device with a specific file system:
# Linux - Format as ext4
sudo mkfs.ext4 /dev/sdb1

# Linux - Format as NTFS (requires ntfs-3g)
sudo mkfs.ntfs /dev/sdb1
# Windows - Format as NTFS
Format-Volume -DriveLetter D -FileSystem NTFS

# Windows - Format as FAT32
Format-Volume -DriveLetter E -FileSystem FAT32

Windows File System Structure

Windows uses drive letters to organize storage devices.

Root: C:\

The primary system partition, containing the operating system. Windows C Drive

Drive Letters

  • *C:* - System drive (typically)
  • D:, E:, F:, … - Additional drives, removable media, network drives
Removable Media: When you insert USB drives or external disks, Windows assigns them drive letters automatically.

Important Directories

Program Files

Location: C:\Program Files Purpose: Software installed for all users (64-bit programs) Access:
# Command Prompt
cd %PROGRAMFILES%
# PowerShell
Set-Location $Env:ProgramFiles
Write-Host $Env:ProgramFiles

Program Files (x86)

Location: C:\Program Files (x86) Purpose: 32-bit software on 64-bit Windows Access:
$Env:ProgramFiles(x86)

Users

Location: C:\Users Purpose: User-specific files and configurations Contains:
  • User home directories
  • Desktop
  • Documents
  • Downloads
  • AppData (application data)
Users Directory Per-User Folders:
C:\Users\username\
├── Desktop
├── Documents
├── Downloads
├── Pictures
├── Music
├── Videos
└── AppData
    ├── Local
    ├── LocalLow
    └── Roaming
AppData is hidden by default. Contains application settings and data specific to each user.

Windows

Location: C:\Windows Purpose: Operating system files Important subdirectories:
  • System32 - Core 64-bit system files and executables
  • SysWOW64 - 32-bit system files (on 64-bit Windows)
  • Fonts - System fonts
  • Temp - System temporary files

Windows Environment Variables

Variables provide convenient access to important paths:
VariableDescriptionExample
%USERPROFILE%Current user’s home directoryC:\Users\Admin
%APPDATA%User application data (roaming)C:\Users\Admin\AppData\Roaming
%LOCALAPPDATA%User application data (local)C:\Users\Admin\AppData\Local
%PROGRAMFILES%64-bit program filesC:\Program Files
%PROGRAMFILES(X86)%32-bit program filesC:\Program Files (x86)
%WINDIR%Windows directoryC:\Windows
%SYSTEMROOT%Windows system rootC:\Windows
%TEMP%Temporary filesC:\Users\Admin\AppData\Local\Temp
%PATH%Executable search paths(list of directories)
%HOMEDRIVE%User’s home drive letterC:
%HOMEPATH%User’s home path\Users\Admin
Using variables:
cd %APPDATA%
echo %USERPROFILE%

Linux File System Structure

Linux uses a single unified hierarchy starting from root (/).

Filesystem Hierarchy Standard (FHS)

Linux follows the FHS, though distributions may vary slightly. Reference: FreeDesktop.org File Hierarchy

Root Directory: /

The root of everything in Linux.
/
├── bin → usr/bin
├── boot
├── dev
├── etc
├── home
├── lib → usr/lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin → usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

Important Directories

/boot - Boot Files

Purpose: Boot loader and kernel files Contains:
  • Linux kernel
  • initramfs/initrd
  • GRUB configuration
  • EFI boot files (on EFI systems)
Typical files:
/boot/
├── vmlinuz-5.15.0-generic  (kernel)
├── initrd.img-5.15.0-generic (initial ramdisk)
└── grub/                    (bootloader config)
On EFI systems, may be mounted as ESP (EFI System Partition).

/etc - Configuration Files

Purpose: System-wide configuration files Important files:
  • /etc/passwd - User account information
  • /etc/shadow - Encrypted passwords
  • /etc/group - Group information
  • /etc/fstab - File system mount configuration
  • /etc/hosts - Static hostname resolution
  • /etc/hostname - System hostname
  • /etc/resolv.conf - DNS configuration
  • /etc/network/ - Network configuration
  • /etc/systemd/ - systemd configuration

/home - User Home Directories

Purpose: Personal directories for regular users
/home/
├── alice/
│   ├── Documents/
│   ├── Downloads/
│   ├── .bashrc
│   └── .config/
└── bob/
    ├── Documents/
    └── .bashrc
User-specific subdirectories:
  • ~/.config/ - User application configuration
  • ~/.local/ - User-installed programs and data
  • ~/.cache/ - User application cache

/root - Root’s Home

Purpose: Home directory for root user (UID 0)
Unlike other users, root’s home is NOT in /home.

/srv - Service Data

Purpose: Data for services provided by the system Examples:
  • /srv/www/ - Web server content
  • /srv/ftp/ - FTP server files
  • /srv/nfs/ - NFS shared directories

/tmp - Temporary Files

Purpose: Temporary storage Characteristics:
  • Cleared on system boot
  • World-writable (with sticky bit)
  • Short-lived data only
# Permissions
drwxrwxrwt  1777  /tmp
The t (sticky bit) means only file owner can delete files.

/run - Runtime Data

Purpose: Volatile runtime data Contains:
  • Process IDs (PIDs)
  • Socket files
  • Lock files
  • Cleared on boot

/usr - User Programs

Purpose: Vendor-supplied programs and libraries Structure:
/usr/
├── bin/      (executables in $PATH)
├── sbin/     (system binaries)
├── lib/      (libraries)
├── lib64/    (64-bit libraries)
├── share/    (architecture-independent data)
│   ├── doc/  (documentation)
│   ├── man/  (manual pages)
│   └── icons/ (icons)
├── include/  (header files)
└── local/    (locally installed software)

/var - Variable Data

Purpose: Persistent, variable runtime data Important subdirectories:
System and application logs:
  • /var/log/syslog - System log
  • /var/log/auth.log - Authentication log
  • /var/log/apache2/ - Apache logs
  • /var/log/mysql/ - MySQL logs
Critical for troubleshooting!
Persistent cache files:
  • /var/cache/apt/ - Package cache
  • Can be deleted to free space
  • System will regenerate as needed
Persistent application state:
  • /var/lib/mysql/ - MySQL databases
  • /var/lib/docker/ - Docker data
  • Do not delete - contains important data
Task queues:
  • /var/spool/cron/ - Cron jobs
  • /var/spool/cups/ - Print queue
  • /var/spool/mail/ - Email queue

/dev - Device Files

Purpose: Hardware device access File system type: devtmpfs Common devices:
/dev/
├── sda      (first disk)
├── sda1     (first partition on sda)
├── sda2     (second partition on sda)
├── tty1     (virtual console 1)
├── null     (null device)
├── zero     (zero device)
├── random   (random number generator)
└── urandom  (non-blocking random)
Everything is a file in Linux - even hardware devices!

/proc - Process Information

Purpose: Virtual file system with kernel/process info File system type: proc Contents:
  • /proc/cpuinfo - CPU information
  • /proc/meminfo - Memory information
  • /proc/[pid]/ - Per-process information
  • /proc/sys/ - Kernel parameters
# View CPU info
cat /proc/cpuinfo

# View memory info
cat /proc/meminfo

# View process command line
cat /proc/1234/cmdline

/sys - System Information

Purpose: Kernel object information File system type: sysfs Use cases:
  • Hardware information
  • Kernel modules
  • Device configuration
For backwards compatibility, some directories are symlinks:
/bin /usr/bin
/sbin /usr/sbin
/lib /usr/lib
/lib64 /usr/lib64
Older software expects programs in /bin, but modern systems use /usr/bin.

User-Specific Directories in /home

Each user’s home directory contains configuration and data:

~/.config

Purpose: User application configurations Examples:
  • ~/.config/firefox/ - Firefox settings
  • ~/.config/code/ - VS Code settings
  • Follows XDG Base Directory specification

~/.local

Structure:
~/.local/
├── bin/      (user executables)
├── share/    (user data files)
└── lib/      (user libraries)

~/.cache

Purpose: User application cache Safe to delete - applications will regenerate

Hidden Files (Dotfiles)

Files starting with . are hidden:
~/.bashrc      (bash configuration)
~/.bash_history (command history)
~/.profile     (login profile)
~/.ssh/        (SSH keys and config)
~/.gitconfig   (git configuration)
View with ls -a

Path Navigation

Special Path Characters

SymbolMeaningExample
/Root directory/etc/passwd
~Home directory~/Documents
.Current directory./script.sh
..Parent directory../parent_folder
-Previous directorycd -

Absolute vs Relative Paths

Absolute path:
# Starts from root
/home/alice/Documents/report.pdf
Relative path:
# Relative to current directory
../bob/Documents/notes.txt
./scripts/backup.sh

Mounting File Systems

Linux can “mount” file systems at any directory:
# View mounted file systems
mount
df -h

# Mount USB drive
sudo mount /dev/sdb1 /mnt/usb

# Unmount
sudo umount /mnt/usb
Permanent mounts: Configured in /etc/fstab

Comparing Windows and Linux

AspectWindowsLinux
RootC:\/
Path separatorBackslash \Forward slash /
Drive lettersYes (C:, D:, E:)No (unified hierarchy)
User homesC:\Users\/home/
System filesC:\Windows\/usr/, /lib/, /etc/
ProgramsC:\Program Files\/usr/bin/, /usr/local/
Config filesRegistry + filesText files in /etc/
Temp files%TEMP%/tmp/
LogsEvent Viewer + files/var/log/
Case sensitiveNoYes
Linux file names are case-sensitive: file.txt and File.txt are different files.

Best Practices

1

Use Standard Locations

Follow FHS on Linux, use standard folders on Windows
2

Use Variables

Use environment variables instead of hardcoded paths
3

Document File Locations

Keep track of where important files are stored
4

Regular Cleanup

Clean temporary files and caches periodically
5

Backup Important Directories

Regularly backup /etc, /home, /var on Linux; User folders on Windows

Build docs developers (and LLMs) love