ป้ายกำกับ: Red Hat

  • โครงสร้างระบบไฟล์ใน 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 ต่างระบบปฏิบัติการได้ทันทีโดยไม่ต้องเสียเวลาค้นหาว่าไฟล์คอนฟิกหรือไบนารีเก็บไว้ที่ไหน


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