ป้ายกำกับ: Non-FHS Extensions

โครงสร้างระบบไฟล์ใน Linux และ Unix-likeโครงสร้างระบบไฟล์ใน Linux และ Unix-like

หากคุณเคยสงสัยว่าทำไมระบบปฏิบัติการ Linux หรือ Unix-like ถึงต้องมีโฟลเดอร์ชื่อแปลก ๆ อย่าง /etc, /usr, /var หรือ /srv และทำไมการกระจายตัวของ Linux ทุกค่าย (ไม่ว่าจะเป็น Ubuntu, Red Hat, Debian หรือ Rocky Linux) ถึงจัดวางโครงสร้างไว้คล้ายกันไปหมด คำตอบคือมาตรฐาน FHS (Filesystem Hierarchy Standard)


FHS คืออะไร และมีจุดเริ่มต้นอย่างไร?

FHS (Filesystem Hierarchy Standard) คือข้อกำหนดมาตรฐานที่ระบุว่า ไดเรกทอรี (Directory) และไฟล์ต่าง ๆ ในระบบปฏิบัติการกลุ่ม Linux และ Unix-like ควรจะถูกจัดวางไว้ที่ไหน และแต่ละโฟลเดอร์มีหน้าที่อะไร

ประวัติความเป็นมา

  • สิงหาคม 1993 (จุดเริ่มต้นในชื่อ FSSTND): ในยุคแรกเริ่ม Linux แต่ละ Distribution ต่างคนต่างจัดวางไฟล์ตามใจชอบ ทำให้ผู้พัฒนาซอฟต์แวร์ทำงานลำบากมาก จึงมีการจับมือกันสร้างมาตรฐานชื่อ FSSTND (File System Standard) เพื่อใช้ใน Linux
  • ปี 1996 (เปลี่ยนชื่อเป็น FHS): มาตรฐานนี้ถูกขยายขอบเขตให้ครอบคลุมระบบปฏิบัติการ Unix-like อื่น ๆ (เช่น BSD) จึงเปลี่ยนชื่อเป็น FHS (Filesystem Hierarchy Standard)
  • ปัจจุบัน: FHS อยู่ภายใต้การดูแลของ The Linux Foundation โดยเวอร์ชันสำคัญที่มีการใช้งานแพร่หลายคือ FHS 2.3 (ปี 2004) และ FHS 3.0 (ปี 2015)

แนวคิดหลักในการแบ่งประเภทไฟล์ตาม FHS

FHS แบ่งไฟล์ออกเป็น 2 มิติหลัก เพื่อช่วยให้ผู้ดูแลระบบ (Admin) บริหารจัดการดิสก์และการสำรองข้อมูล (Backup) ได้ง่ายขึ้น

  1. Shareable vs. Unshareable
    • Shareable: ไฟล์ที่แชร์ให้เครื่องอื่นในเครือข่ายใช้ร่วมกันได้ (เช่น เอกสารผู้ใช้, โปรแกรมใน /usr)
    • Unshareable: ไฟล์เฉพาะเครื่องนั้นๆ ห้ามแชร์ (เช่น การตั้งค่าเครือข่ายใน /etc, ไดรเวอร์อุปกรณ์)
  2. Static vs. Variable
    • Static: ไฟล์คงที่ ไม่เปลี่ยนหากไม่มีมนุษย์ไปแก้ไขหรืออัปเดตระบบ (เช่น คำสั่งไบนารี, Documentation)
    • Variable: ไฟล์ที่มีการเปลี่ยนแปลงตลอดเวลาโดยอัตโนมัติ (เช่น Log, Spool, Temporary files)

โครงสร้างต้นไม้ของระบบไฟล์ (Text-based Tree Structure)

จุดเริ่มต้นของทุกอย่างใน Linux คือ ไดเรกทอรีราก หรือ Root Directory (/) โดยแผนผังลำดับชั้นตามมาตรฐาน FHS มีโครงสร้างดังนี้

/ (Root Directory)
├── bin         -> Essential Command Binaries (e.g., ls, cp, bash)
├── boot        -> Boot Loader Files (e.g., vmlinuz, initrd, grub)
├── dev         -> Device Files (e.g., sda, tty, null)
├── etc         -> Host-specific System Configuration
│   ├── opt     -> Configuration for add-on packages in /opt
│   └── X11     -> Configuration for the X Window System (optional)
├── home        -> User Home Directories (e.g., /home/username)
├── lib         -> Essential Shared Libraries & Kernel Modules
├── lib<qual>   -> Alternate architecture libraries (e.g., lib64, lib32)
├── media       -> Mount point for removable media (e.g., cdrom, usb)
├── mnt         -> Mount point for a temporarily mounted filesystem
├── opt         -> Add-on Application Software Packages
├── proc        -> Virtual filesystem providing process and kernel information
├── root        -> Home directory for the root user
├── run         -> Run-time variable data (system state since boot)
├── sbin        -> System Binaries for administration (e.g., fdisk, ip)
├── srv         -> Data for services provided by this system
├── sys         -> Virtual filesystem for kernel and device information
├── tmp         -> Temporary files (cleared on reboot or periodically)
├── usr         -> Secondary Hierarchy (User System Resources)
│   ├── bin     -> Non-essential user binaries
│   ├── include -> Standard C/C++ header files
│   ├── lib     -> Libraries for binaries in /usr/bin and /usr/sbin
│   ├── local   -> Local hierarchy for software installed by the admin
│   ├── sbin    -> Non-essential system administration binaries
│   └── share   -> Architecture-independent shared data (docs, man pages)
└── var         -> Variable Data Files
    ├── cache   -> Application cache data
    ├── lib     -> State information (e.g., database storage)
    ├── lock    -> Lock files to track resources in use
    ├── log     -> System and application log files
    ├── run     -> Dynamic run-time data (legacy, symlink to /run)
    ├── spool   -> Tasks waiting for processing (e.g., print queues, mail)
    └── tmp     -> Temporary files preserved between reboots

รายละเอียดและประเภทของ Root Folder (/) ทั้งหมดที่เป็นไปได้

ตารางสรุปรายละเอียดและประเภทของ Root Folder (/) ทั้งหมดที่เป็นไปได้ในระบบ Linux โดยแบ่งตามกลุ่มมาตรฐาน FHS, โฟลเดอร์เสริมในอดีต และโฟลเดอร์เฉพาะทางยุคใหม่ครับ


1. กลุ่มไดเรกทอรีมาตรฐานตามข้อกำหนด FHS (Standard FHS Directories)

ไดเรกทอรีชื่อเต็ม / ความหมายหน้าที่และประเภทข้อมูลหมายเหตุ
/Rootจุดเริ่มต้นสูงสุดของระบบไฟล์ทั้งหมดใน Linux
/binEssential Binariesคำสั่งพื้นฐานที่จำเป็นสำหรับผู้ใช้ทุกคน (เช่น ls, cp, bash)มักเป็น Symlink ไปที่ /usr/bin ใน Linux ยุคใหม่
/bootBoot Filesไฟล์สำหรับกระบวนการเปิดเครื่อง รวมถึง Kernel, initrd และ GRUB
/devDevice Filesไฟล์ตัวแทนอุปกรณ์ฮาร์ดแวร์ต่างๆ (เช่น /dev/sda, /dev/null)
/etcHost-Specific Configurationไฟล์ตั้งค่าของระบบและแอปพลิเคชันทั้งหมด
/homeUser Home Directoriesพื้นที่เก็บข้อมูลส่วนตัวและไฟล์คอนฟิกของผู้ใช้งานทั่วไป
/libEssential LibrariesShared Libraries (.so) ที่จำเป็นสำหรับโปรแกรมใน /bin และ /sbinมักเป็น Symlink ไปที่ /usr/lib ใน Linux ยุคใหม่
/lib<qual>Alternate Architecture Librariesไลบรารีตามสถาปัตยกรรม CPU (เช่น /lib64, /lib32)
/mediaRemovable Media Mount Pointsจุดเมานต์อัตโนมัติสำหรับสื่อบันทึกข้อมูลพกพา (เช่น USB, CD-ROM)
/mntTemporarily Mounted Filesystemsจุดเมานต์ชั่วคราวสำหรับผู้ดูแลระบบเมานต์ดิสก์ภายนอกด้วยตนเอง
/optOptional Application Softwareซอฟต์แวร์เสริมภายนอกที่ไม่ใช่แพ็กเกจหลักของ OS (เช่น Chrome, Discord)
/procProcess & Kernel Virtual FilesystemVirtual FS แสดงสถานะกระบวนการ (Process) และเคอร์เนลในหน่วยความจำ RAM
/rootRoot User Home DirectoryHome directory ส่วนตัวของผู้ดูแลระบบ (Root User)
/runRuntime Variable Dataข้อมูลสถานะการทำงานขณะนั้น (Runtime) ตั้งแต่เริ่มเปิดเครื่อง
/sbinSystem Binariesคำสั่งขั้นสูงสำหรับการบริหารจัดการระบบของ Admin (เช่น fdisk, reboot)มักเป็น Symlink ไปที่ /usr/sbin ใน Linux ยุคใหม่
/srvService Dataข้อมูลเฉพาะของบริการที่เครื่องให้บริการแก่อื่น ๆ (เช่น /srv/www, /srv/ftp)กำหนดใน FHS 2.3 เป็นต้นมา
/sysSystem Virtual FilesystemVirtual FS แสดงข้อมูลโครงสร้างอุปกรณ์ ไดรเวอร์ และเคอร์เนล
/tmpTemporary Filesไฟล์ชั่วคราว มักถูกลบโดยอัตโนมัติเมื่อรีสตาร์ตเครื่อง
/usrUser System Resourcesรวมไฟล์โปรแกรม ไดรเวอร์ และไลบรารีระดับรองของผู้ใช้
/varVariable Dataเก็บข้อมูลที่มีการเปลี่ยนแปลงบ่อย (เช่น Log, Database, Spool)

2. กลุ่มไดเรกทอรีเสริมหรืออดีตมาตรฐาน (Optional & Historical Directories)

ไดเรกทอรีหน้าที่และประเภทข้อมูลหมายเหตุ
/lost+foundเก็บกู้ไฟล์ที่เสียหายเมื่อเครื่องดับหรือระบบไฟล์มีปัญหา (ถูกใช้โดย fsck)สร้างโดยระบบไฟล์ตระกูล ext (ext2/ext3/ext4)
/etc/X11ไฟล์ตั้งค่าระบบแสดงผลกราฟิก X Window SystemFHS ระบุให้เป็น Optional
/etc/optไฟล์ตั้งค่าเฉพาะสำหรับโปรแกรมที่ติดตั้งอยู่ใน /optFHS ระบุให้เป็น Optional

กลุ่มไดเรกทอรีเฉพาะทางนอกเหนือจาก FHS (Non-FHS Extensions)

ไดเรกทอรีหน้าที่และประเภทข้อมูลพบได้ในระบบ / เทคโนโลยี
/snapจุดเมานต์และไฟล์แอปพลิเคชันในรูปแบบ Snap Packagesพบบ่อยใน Canonical Ubuntu
/flatpakจุดเก็บและเมานต์แอปพลิเคชันรูปแบบ Flatpakพบบ่อยใน Fedora, Arch และ Linux ยุคใหม่
/cdromจุดเมานต์ CD-ROM ยุคดั้งเดิมปัจจุบันย้ายไปใช้ /media/cdrom ตาม FHS
/sysroot / /ostreeไดเรกทอรีรากจริงของระบบปฏิบัติการแบบ Immutable OSเช่น Red Hat Enterprise Linux CoreOS, Fedora Silverblue
/init / /.singularity.dโฟลเดอร์ภายในระบบคอนเทนเนอร์หรืออิมเมจพิเศษพบใน Docker, Singularity หรือระบบ Embedded

สรุป

การมีมาตรฐาน FHS ช่วยให้ผู้พัฒนาซอฟต์แวร์เขียนโปรแกรมครั้งเดียว แล้วนำไปรันบน Linux ได้ทุกค่าย รวมถึงช่วยให้ System Administrator สลับไปดูแล Server ต่างระบบปฏิบัติการได้ทันทีโดยไม่ต้องเสียเวลาค้นหาว่าไฟล์คอนฟิกหรือไบนารีเก็บไว้ที่ไหน


อ่านเพิ่มเติม