Linux process

กระบวนการทำงานของ Linux เริ่มตั้งแต่เปิดเครื่องจนกระทั่งพร้อมใช้งาน มีขั้นตอนหลักๆ ดังนี้
  1. BIOS/UEFI: เมื่อเปิดเครื่อง firmware (BIOS หรือ UEFI) จะทำการ POST (Power-On Self-Test) ตรวจสอบฮาร์ดแวร์เบื้องต้น จากนั้นจะค้นหา boot loader ตามลำดับที่กำหนดในการตั้งค่า firmware
  1. Boot Loader: โปรแกรม boot loader เช่น GRUB จะถูกโหลดและเริ่มทำงาน มันจะแสดงเมนูให้เลือก kernel ที่ต้องการบู๊ต จากนั้นจะโหลด kernel image และ initial RAM disk (initrd) เข้าไปในหน่วยความจำ
  1. Kernel: kernel จะถูกโหลดเข้ามาใน RAM และเริ่มทำงาน มันจะตรวจสอบและกำหนดค่าฮาร์ดแวร์ต่างๆ จากนั้นจะเมาท์ root file system และเริ่มต้น init process
  1. Init: init process (ปัจจุบันส่วนใหญ่ใช้ systemd) เป็นกระบวนการแรกที่ถูกรันโดย kernel (มี PID=1) หน้าที่หลักคือเริ่มต้นบริการต่างๆ ตามลำดับที่กำหนดไว้ ตัวอย่างบริการที่ init เริ่มต้น ได้แก่
      • udev: ตรวจจับอุปกรณ์ต่างๆ และโหลดไดร์เวอร์ที่เกี่ยวข้อง
      • mountfs: เมาท์ filesystems ต่างๆ ที่กำหนดไว้ใน /etc/fstab
      • swap: เปิดใช้งาน swap space
      • network: เริ่มต้นบริการเครือข่าย เช่น กำหนดค่า network interface ด้วย DHCP
      • มีการเรียกใช้ /etc/rc.d/rc.sysinit เพื่อเริ่มต้นบริการและกำหนดค่าเริ่มต้นต่างๆ
  1. Network: บริการเครือข่ายจะถูกเริ่มต้นในขั้นตอนนี้ ไฟล์ /etc/hosts จะถูกโหลดมาใช้เพื่อแปลงชื่อ hostname เป็น IP ตามที่กำหนดไว้ในไฟล์ นอกจากนี้ nameservers ที่กำหนดใน /etc/resolv.conf ก็จะถูกเรียกใช้งานเพื่อ query หา IP จาก hostname ด้วยโพรโทคอล DNS
    1. nsswitch ย่อมาจาก "Name Service Switch" เป็นกลไกที่ Linux และ Unix-like systems ใช้ในการค้นหาข้อมูลต่างๆ
    2. nsswitch
      ในไฟล์ /etc/nsswitch.conf รูปแบบ (syntax) ของบรรทัดที่กำหนดแหล่งข้อมูลสำหรับการค้นหาชื่อโฮสต์ (hosts) คือ
      Copy codehosts: <source1> [<source2>] [<source3>] ...
      โดยที่ <source1>, <source2> เป็นต้น คือแหล่งข้อมูลที่จะใช้ในการค้นหา เรียงตามลำดับความสำคัญจากซ้ายไปขวา ตัวอย่างเช่น
      Copy codehosts: files dns
      บรรทัดนี้กำหนดให้ค้นหาชื่อโฮสต์จาก 2 แหล่ง คือ
      1. files: ค้นจากไฟล์ /etc/hosts เป็นอันดับแรก
      1. dns: ถ้าไม่พบใน /etc/hosts จะค้นต่อจาก DNS server โดยใช้ name servers ที่ระบุไว้ในไฟล์ /etc/resolv.conf
      ถ้าค้นทั้ง 2 ที่แล้วยังไม่พบ จะคืนค่า error (ชื่อโฮสต์ไม่รู้จัก)
      แหล่งข้อมูลอื่นๆ ที่ใช้กับ hosts ได้ เช่น
      • nis: ค้นจากฐานข้อมูล NIS (Network Information Service)
      • mdns4mdns4_minimal: ค้นจาก mDNS (multicast DNS) ซึ่งใช้ในเครือข่ายแบบ zero-configuration เช่น Bonjour ของ Apple
      • myhostname: ค้นจากชื่อเครื่องตัวเอง (ดูได้จาก hostname)
      • resolve: ค้นจากฟังก์ชั่น getaddrinfo() ของ C library ซึ่งจะค้นจาก NSS อีกที (เหมาะสำหรับ plugin ที่ต้องการข้ามการค้นหาแบบปกติ)
      สามารถเขียนแหล่งข้อมูลให้ละเอียดขึ้น พร้อมใส่ option ได้ เช่น
      Copy codehosts: files mdns4_minimal [NOTFOUND=return] dns myhostname
      • [NOTFOUND=return] เป็น option ที่บอกว่าถ้าค้นจาก mdns4_minimal แล้วไม่เจอ ให้หยุดทันที ไม่ต้องค้นต่อจาก dns
      • myhostname เป็นแหล่งข้อมูลสุดท้าย ทำให้สามารถใช้ชื่อเครื่องตัวเองแทน IP ได้เสมอ
      แต่ละระบบสามารถกำหนดลำดับแหล่งข้อมูลต่างกันได้ตามความเหมาะสม เช่นถ้าต้องการค้นจาก DNS ก่อนไฟล์ ก็ให้สลับที่ระหว่าง dns กับ files ได้
  1. Runlevel: init จะเข้าสู่ runlevel ที่กำหนดไว้ โดยจะเรียกสคริปต์ใน /etc/rc.d/rc?.d/ (? คือเลข runlevel) ให้ทำงานตามลำดับ สคริปต์เหล่านี้จะเริ่มต้นบริการ (daemon) ที่จำเป็นในการใช้งานระบบ เช่น cron, sshd, httpd เป็นต้น
  1. Login: init จะเริ่มต้น getty processes เพื่อแสดง login prompt ที่คอนโซลต่างๆ (เช่น tty1-tty6) รอให้ผู้ใช้กรอกชื่อและรหัสผ่านเพื่อล็อกอินเข้าใช้งาน ถ้ามีการล็อกอินผ่าน SSH ก็จะใช้ sshd ในการจัดการแทน
  1. Shell: เมื่อผู้ใช้ล็อกอินเข้ามา ก็จะได้เชลล์ (shell) ไว้คอยรับคำสั่งจากผู้ใช้แล้วส่งไปให้กับเคอร์เนลประมวลผล เชลล์มีหลายชนิด เช่น bash, zsh, fish
  1. Desktop Environment: ในกรณีที่ใช้งานโหมดกราฟิก (X Window) เชลล์จะเริ่มต้น X server และ desktop environment หรือ window manager ที่กำหนดไว้ใน ~/.xinitrc หรือ ~/.xsession
จากนั้นผู้ใช้ก็สามารถใช้งานเครื่อง Linux ได้ตามปกติ ผ่านทางเชลล์หรือ desktop environment โดยที่กระบวนการต่างๆ ที่จำเป็นในการทำงานของระบบจะทำงานอยู่เบื้องหลัง
Built with Potion.so