หมวดหมู่: ระบบปฏิบัติการ

โครงสร้างระบบไฟล์ใน 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
/bin Essential Binaries คำสั่งพื้นฐานที่จำเป็นสำหรับผู้ใช้ทุกคน (เช่น ls, cp, bash) มักเป็น Symlink ไปที่ /usr/bin ใน Linux ยุคใหม่
/boot Boot Files ไฟล์สำหรับกระบวนการเปิดเครื่อง รวมถึง Kernel, initrd และ GRUB
/dev Device Files ไฟล์ตัวแทนอุปกรณ์ฮาร์ดแวร์ต่างๆ (เช่น /dev/sda, /dev/null)
/etc Host-Specific Configuration ไฟล์ตั้งค่าของระบบและแอปพลิเคชันทั้งหมด
/home User Home Directories พื้นที่เก็บข้อมูลส่วนตัวและไฟล์คอนฟิกของผู้ใช้งานทั่วไป
/lib Essential Libraries Shared Libraries (.so) ที่จำเป็นสำหรับโปรแกรมใน /bin และ /sbin มักเป็น Symlink ไปที่ /usr/lib ใน Linux ยุคใหม่
/lib<qual> Alternate Architecture Libraries ไลบรารีตามสถาปัตยกรรม CPU (เช่น /lib64, /lib32)
/media Removable Media Mount Points จุดเมานต์อัตโนมัติสำหรับสื่อบันทึกข้อมูลพกพา (เช่น USB, CD-ROM)
/mnt Temporarily Mounted Filesystems จุดเมานต์ชั่วคราวสำหรับผู้ดูแลระบบเมานต์ดิสก์ภายนอกด้วยตนเอง
/opt Optional Application Software ซอฟต์แวร์เสริมภายนอกที่ไม่ใช่แพ็กเกจหลักของ OS (เช่น Chrome, Discord)
/proc Process & Kernel Virtual Filesystem Virtual FS แสดงสถานะกระบวนการ (Process) และเคอร์เนลในหน่วยความจำ RAM
/root Root User Home Directory Home directory ส่วนตัวของผู้ดูแลระบบ (Root User)
/run Runtime Variable Data ข้อมูลสถานะการทำงานขณะนั้น (Runtime) ตั้งแต่เริ่มเปิดเครื่อง
/sbin System Binaries คำสั่งขั้นสูงสำหรับการบริหารจัดการระบบของ Admin (เช่น fdisk, reboot) มักเป็น Symlink ไปที่ /usr/sbin ใน Linux ยุคใหม่
/srv Service Data ข้อมูลเฉพาะของบริการที่เครื่องให้บริการแก่อื่น ๆ (เช่น /srv/www, /srv/ftp) กำหนดใน FHS 2.3 เป็นต้นมา
/sys System Virtual Filesystem Virtual FS แสดงข้อมูลโครงสร้างอุปกรณ์ ไดรเวอร์ และเคอร์เนล
/tmp Temporary Files ไฟล์ชั่วคราว มักถูกลบโดยอัตโนมัติเมื่อรีสตาร์ตเครื่อง
/usr User System Resources รวมไฟล์โปรแกรม ไดรเวอร์ และไลบรารีระดับรองของผู้ใช้
/var Variable Data เก็บข้อมูลที่มีการเปลี่ยนแปลงบ่อย (เช่น Log, Database, Spool)

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

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


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