หากคุณเคยสงสัยว่าทำไมระบบปฏิบัติการ 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) ได้ง่ายขึ้น
- Shareable vs. Unshareable
- Shareable: ไฟล์ที่แชร์ให้เครื่องอื่นในเครือข่ายใช้ร่วมกันได้ (เช่น เอกสารผู้ใช้, โปรแกรมใน
/usr) - Unshareable: ไฟล์เฉพาะเครื่องนั้นๆ ห้ามแชร์ (เช่น การตั้งค่าเครือข่ายใน
/etc, ไดรเวอร์อุปกรณ์)
- Shareable: ไฟล์ที่แชร์ให้เครื่องอื่นในเครือข่ายใช้ร่วมกันได้ (เช่น เอกสารผู้ใช้, โปรแกรมใน
- Static vs. Variable
- Static: ไฟล์คงที่ ไม่เปลี่ยนหากไม่มีมนุษย์ไปแก้ไขหรืออัปเดตระบบ (เช่น คำสั่งไบนารี, Documentation)
- Variable: ไฟล์ที่มีการเปลี่ยนแปลงตลอดเวลาโดยอัตโนมัติ (เช่น Log, Spool, Temporary files)
โครงสร้างต้นไม้ของระบบไฟล์ (Text-based Tree Structure)
จุดเริ่มต้นของทุกอย่างใน Linux คือ ไดเรกทอรีราก หรือ Root Directory (/) โดยแผนผังลำดับชั้นตามมาตรฐาน FHS มีโครงสร้างดังนี้
BASH / Shell
/ (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