Linux OS ทำงานอย่างไร

ENVIRONMENT AND STRUCTURES

สภาพแวดล้อมการทำงานของ Linux

ในโลกของ Open Source มีผู้พัฒนาหลายประเทศช่วยกันพัฒนา มีการพัฒนาภายใต้มาตรฐาน POSIX ซึงเป็นมาตรฐานกลางของ Linux/Unix ด้วยเหตุนี้เองโปรแกรมของ Linux กับ UNIX จึงสามารถใช้งานร่วมกันได้ ทำให้สามารถใช้งานโปรแกรมดังกล่าวได้อย่างอิสระ
เราสามารถแก้ไข Source Code ของโปรแกรมได้ เพื่อให้เหมาะสมกับเครื่องของเรา การแจกจ่ายโปรแกรมของ Open Source จะมีการแจกจ่ายเป็น Source Code ของโปรแกรม (โดยมากจะเป็นโปรแกรมภาษา C หรือ GNU C) ซึ่งเราสามารถ Compile แล้วใช้งานบนเครื่องของเราได้เลย แต่เพื่อความสะดวก Linux หลายๆค่ายได้ทำการ Compile โปรแกรมมาให้แล้ว แล้วนำมาเก็บในรูปแบบของ Package อย่างเช่น RPM (Redhat Package Manager) หรือว่า DEB (Debian Package) ตัวอย่างของ Linux ที่มีการติดตั้งโปรแกรมเป็นแบบ Package เช่น Redhat, Fedora, Mandrake และ Debian, Ubuntu เป็นต้น
Linux server นั้นมีรากฐานโปรแกรมมาจากภาษา C เราจะเห็นว่าโปรแกรมของ Linux นั้นเขียนด้วยภาษา C เป็นส่วนใหญ่ ดังนั้นโปรแกรมที่เขียนด้วยภาษา C บน Linux จึงมีประสิทธิภาพสูง เป็นการเขียนโปรแกรมแบบรวมทุกอย่างอยู่ในไฟล์เดียว ซึ่งเราสามารถเพิ่มความสามารถของโปรแกรมได้โดยการ แทรก module การใช้งานเข้าไปในโปรแกรม แต่ทาง MS Windows นั้นมีการใช้งานเป็นแบบกระจาย (มีการเรียกโปรแกรมใช้งานแบบ Component (หรือ *.DLL นั่นเอง) คือมีการเรียกไฟล์ย่อยๆ หลายๆ ไฟล์เพื่อใช้งาน ซึ่งทำให้ประสิทธิภาพโดยรวมของโปรแกรมลดลง แต่จะง่ายในการพัฒนาโปรแกรม เราลองมาดูตารางเปรียบเทียบระหว่าง MS Windows กับ Linux/UNIX ดังตารางด้านล่าง
ชนิด Kernelข้อดีข้อเสีย
แบบรวม (Linux) เร็ว และมีเสถียรภาพมาก ต้อง compile ใหม่เมื่อมีการเปลี่ยนแปลง 
แบบกระจาย (MS Windows) เขียนโปรแกรมได้ง่าย โปรแกรมมีเสถียรภาพต่ำ และช้า 
ตารางเปรียบเทียบ Kernel แต่ละชนิด
Linux รองรับการทำงานแบบ Multi-tasking และระบบ Multi-user โดยสมบูรณ์แบบ โดยการทำงานแบบ Multi-tasking คือการทำงานหลายๆงานพร้อมๆ กัน โดยแต่ละงานไม่เกี่ยวข้องกัน มีการจัดการแต่ละ Process เป็นแบบ Thread (ซึ่งเป็นมาตรฐานการทำงานของ Multitasking) ส่วนการทำงานแบบ Multi-user นั้นเป็นการใช้งานเครื่องพร้อมๆ กันได้หลายคนในเวลาเดียวกัน และสภาพแวดล้อมการทำงานของแต่ละคนที่ใช้จะไม่เหมือนกัน (สำหรับทางผั่งของ Microsoft นั้น เริ่มมีการใช้งานเป็นแบบ Multiuser และ Multitasking ตั้งแต่ MS Windows 3.11 for Workgroup เป็นต้นมา ในขณะที่ UNIX ซึ่งเป็นต้นแบบของ Linux รองรับระบบเหล่านี้มามากกว่า 20 ปีแล้ว)
จากรูปโครงสร้างการเชื่อมต่อระหว่าง Linux และส่วนการทำงานอื่นๆ จะเห็นว่า Kernel ของ Linux นั้นมีการทำงานทั้งหมดติดต่อกับ Hardware level ผ่านทาง Kernel Module อีกชั้นหนึ่ง ที่เป็นอย่างนี้เพราะว่า Kernel ของ Linux นั้นจะเหมือนกันหมด แต่เมื่อใช้งานบนเครื่องที่แตกต่างกันออกไป จึงมีการเรียก Kernel Module ขึ้นมาใช้งาน เพื่อเป็น Plug-in ต่อเข้าไป ให้ติดต่อกับอุปกรณ์ฮาร์ดแวร์ตัวนั้นๆได้ ด้วยการออกแบบ Linux ในแบบดังกล่าว ทำให้การพัฒนา Kernel นั้นไม่ยึดติดกับทีมพัฒนา Kernel เพราะการติดต่อกันระหว่าง Kernel และ Kernel Module มีการเรียกใช้งานผ่าน Application Programming Interface (API) เดียวกัน ทำให้พัฒนาฮาร์ดแวร์ใหม่ๆ ได้นั่นเอง (สำหรับเทคนิคดังกล่าวใน MS Windows เรียกว่า Driver ครับ) 
Screen Shot 2562-07-01 at 00.12.13.png
รูปภาพโครงสร้างการเชื่อมต่อระหว่าง Kernel กับส่วนการทำงานอื่นๆ
บางท่านอาจจะเคยเห็น Model ของ Linux server ในรูปการติดต่อแบบวงกลมเป็นชั้นๆดังรูปที่ 1.3 ซึ่งเป็นอีกรูปแบบหนึ่งในการอธิบายการติดต่อระหว่าง Hardware ไปยังโปรแกรมใดๆ โดยที่ Module ทุกส่วนจะทำงานแยกกันอย่างอิสระ เราสามารถ upgrade แต่ละส่วนได้อย่างอิสระ (และนี่คือข้อได้เปรียบของ Linux ที่มีมากกว่า MS Windows) 
Linux จะแบ่งแยกทุกๆ อย่างออกเป็น Level ดังนี้ 
1. Hardware level เป็นส่วนของ Physical hardware ของเครื่อง 
2. Kernel level เป็นส่วนที่จัดการเกี่ยวกับ Hardware resource ของ server ทั้งหมด ไม่ว่าจะเป็น Memory, CPU หรือว่า Disk 
3. Linux shell level ซึ่งเป็นส่วนที่ติดต่อกับผู้ใช้งาน เราสามารถใช้งาน Linux Server ได้ที่ level นี้ 
4. Application level เป็นโปรแกรมที่ใช้งานอยู่บน Linux Server ซึ่งโปรแกรมเหล่านี้ ถูกเรียกให้ทำงาน โดยผ่านจาก Linux shell level อีกทอดหนึ่ง
Screen Shot 2562-07-01 at 00.12.46.png
รูปภาพโครงสร้างการติดต่อระหว่าง Linux กับผู้ใช้งาน

Open Source License

Open Source License เป็นคำที่เรียกกว้างๆ ของโปรแกรมที่แจกจ่ายฟรี โดยทั่วๆ ไปแล้ว License ของ Linux มีอยู่ 2 ประเภทหลักๆ คือ 

General Public License (GPL) license

เป็น License ที่ใช้งานได้ฟรี แต่มีข้อแม้ว่าโปรแกรมที่มีการเขียนต่อยอดจากโปรแกรมที่ใช้ License ชนิดนี้ต้องเปิดเผย Source Code เช่นกัน (ด้วยเหตุนี้เอง จึงทำให้มีโปรแกรมที่เป็น GPL license อย่างมากมาย) เราสามารถพัฒนาโปรแกรมบน Linux และในไปขายในเชิงพาณิชย์ได้ แต่มีข้อแม้ว่าจะต้องแจก Source Code ไปด้วยเสมอ และไม่สามารถประกาศเป็นเจ้าของ Linux ได้

Berkeley Software Distribution (BSD) license 

เป็น License ที่ใช้งานได้ฟรีเช่นเดียวกันกับ GNU แต่ผู้ที่พัฒนาโปรแกรมต่อสามารถดัดแปลงและแก้ไขได้ทั้งหมด รวมไปถึงทำเป็นโปรแกรมในเชิงพาณิชย์ได้ด้วย (โดยไม่จำเป็นต้องเปิดเผย Source Code แต่อย่างใด) 

Step Booting Linux

เมื่อเครื่องคอมพิวเตอร์ถูกเปิดขึ้นมา หน่วยประมวลผลหลัก (CPU) จะโหลดและรัน BIOS(Basic Input Output System) ซึ่งเก็บไว้ใน ROM (Read Only Memory) ขึ้นมา จากนั้น BIOS จะทำการตรวจสอบระบบ ค้นหาอุปกรณ์ที่ต่อเชื่อมกับเครื่องคอมพิวเตอร์พร้อมทั้งตรวจสอบ แล้วจึงจะค้นหาอุปกรณ์ที่มีหน้าที่ในการบูตระบบ โดย process ในขั้นตอนนี้เรียกว่า POST (Power On Self Test)
อย่างไรก็ตามใน BIOS รุ่นใหม่ๆ ผู้ใช้สามารถกาหนดลำดับของการเลือกอุปกรณ์ที่จะใช้บูตผ่านทาง BIOS ได้ ก่อนที่จะอธิบายถึงลำดับการบูตต่อไป จำเป็นต้องอธิบายถึงลักษณะของ Harddisk ซักเล็กน้อยเพื่อให้รู้จักและเข้าใจกลไกการทำงาน ซึ่งเกี่ยวเนื่องกับกลไกการบูตของ Linux ต่อไป โดยปกติใน Harddisk หนึ่งตัวจะมีข้อมูล 512 ไบต์แรกหรือเซกเตอร์แรกของ Harddisk (โดยปกติ 1 เซกเตอร์เท่ากับ 512 ไบต์) บรรจุข้อมูลส่วนที่สาคัญที่สุด เรียกว่า Master Boot Record (MBR) โดยใน MBR นี้จะมีโปรแกรมของ boot loader บรรจุไว้อยู่ซึ่งจะมีข้อมูลรายละเอียดของพาร์ทิชัน รวมทั้งโค้ดในการส่งผ่านการทำงานให้ Kernel (ในแต่ละพาร์ทิชันจะมี boot sector แยกเป็นของตัวเองต่างหาก ตัว boot loader เป็นเพียงตัวทำหน้าที่แสดงผลให้ผู้ใช้เลือกและส่งต่อกระบวนการบูตไปให้กับโปรแกรมในส่วน boot sector) 
สาหรับตัว boot loader นั้น สามารถเลือกได้ว่าจะใช้ตัวใด ซึ่งจะแยกตามชนิดของ architecture ของฮาร์ดแวร์ เช่น 
  • Intel PC Compatible : LILO หรือ GRUB 
  • Compaq Compatible + Alpha : MILO 
  • SPARC workstation compatible : SILO 
ซึ่งในกระบวนการติดตั้ง Linux จะมีช่วงหนึ่งที่ให้ผู้ติดตั้งเลือกได้ว่าจะเลือกใช้ boot loader ตัวใด หากติดตั้งบน x86 ก็จะเลือกได้ระหว่าง LILO หรือ GRUB ในขณะที่ GRUB นั้นเป็น boot loader ที่เผยแพร่ออกมาภายหลังจึงมี feature ในการใช้งานที่ดีกว่าและซับซ้อนกว่า LILO เช่น ไม่จาเป็นต้องเขียนทับ MBR ทุกครั้งที่มีการเปลี่ยนแปลง configuration ของ GRUB เพราะ GRUB สามารถอ่านข้อมูล configuration จาก Harddisk ได้โดยตรง ในขณะที่ LILO ยังต้องเขียนทับ MBR ทุกครั้งที่มีการเปลี่ยนแปลง configuration อย่างไรก็ตามการเลือก boot loader นั้นควรเลือกตัวที่ผู้ติดตั้งมีความเข้าใจใน boot loader ตัวนั้นแล้วซึ่งจะสามารถแก้ปัญหาที่เกิดขึ้นได้ เช่น แก้ไข configuration ของ boot loader เองได้ เป็นต้น
ภายหลังจากที่ BIOS สามารถเลือกได้ว่าจะบูตจาก boot device ตัวใด และในกรณีที่บูตจาก Harddisk ตัว BIOS จะทำการโหลด GRUB จาก MBR (หรือ boot loader ตัวอื่นที่เลือกไว้) หรือ EFI Partition (EFI: Extensible Firmware Interface หรือเรียกอีกชื่อว่า EFI/UEFI system) และรัน GRUB ขึ้นมาพร้อมกับส่งต่อกระบวนการบูตให้แก่ GRUB โดย GRUB จะแสดง prompt ให้ผู้ใช้สามารถเลือกได้ว่าจะบูตจากระบบปฏิบัติการใด (ขึ้นกับการตั้งค่าในไฟล์ /boot/grub/grub.conf , /boot/grub/menu.lst) ซึ่งภายใต้การแสดงผลดังกล่าว GRUB จะมีข้อมูลอยู่แล้วว่าระบบปฏิบัติการใดถูกติดตั้งบน partition ใด หากผู้ใช้ไม่ได้เลือกว่าจะบูตจากระบบปฏิบัติการใดหรือเคอร์เนลเวอร์ชันใดภายในเวลาที่กำหนด ตัว GRUB เองก็จะทำการบูตจากเคอร์เนลที่เป็นdefaultโดยอัตโนมัติ ภายหลังจากที่ GRUB เลือกได้ว่าจะทาการบูตจากpartition แล้ว มันจะทำการโหลด kernel ขึ้นสู่หน่วยความจำและเคอร์เนลจะทำหน้าที่ควบคุมการบูตต่อไป 
เนื่องจากเคอร์เนลของ Linux ถูกย่อไว้ ดังนั้นมันจึงจะทำการขยายตัวมันเองก่อน (โดยเคอร์เนลมีโปรแกรมขนาดเล็กที่อยู่ส่วนต้นทำหน้าที่ในการขยายตัวเอง) พร้อมกับเริ่มทำการสร้าง RAMDISK (เป็นการจองพื้นที่ภายใน RAM)  โดยมีชื่อว่า initramfs สามารถใช้งานได้โดยตรงจากตัว kernel เอง
เมื่อ kernel โหลดเข้าไปใน RAMDISK เรียบร้อยแล้ว มันจะเริ่มสร้าง file ที่สอดคล้องกับ Hardware และจัดการ Hardware ต่างๆทันที ซึ่งถ้าหากเราใช้การ์ดแสดงผลที่ Linux รู้จักและมีความสามารถในการแสดงผลในโหมดพิเศษ เช่น โหมด 100x40 Linux ก็จะถามว่าจะให้ใช้งานในโหมดใด โดยปกติแล้วขั้นตอนนี้มักจะไม่ถูกแสดงผล เพราะในขั้นตอนคอมไพล์เคอร์เนลมันจะตั้งค่านี้ให้อยู่ก่อนแล้ว หลังจากนั้นเคอร์เนลจะทำการตรวจสอบฮาร์ดแวร์ต่างๆ เช่น Harddisk, Floppy disk, LAN card รวมทั้ง device driver ที่รู้จักด้วยว่าทางานได้ตามปกติหรือไม่ โดยจะมีการแสดงผลออกมาที่ console ในระหว่างกระบวนการนี้ด้วย รูปที่ 1.4 จะเป็นการสรุป Step การเข้า Linux โดยย่อครับ
Screen Shot 2562-07-01 at 00.13.40.png
รูปภาพลำดับการทำงานของ Linux OS

initial RAM Disk

initramfs เป็นส่วนที่เก็บ program และ library file ต่างๆที่ใช้สำหรับการ mount root filesystem โดยเฉพาะ เช่น kernel ส่วนที่ใช้ในการทำงานของ filesystem และ driver ของส่วน storage controller ต่างๆที่เรียกว่า udev (User Device) เป็นส่วนที่ทำหน้าที่จัดการอุปกรณ์ที่ใช้งานพร้อมกับระบุ driver ที่ใช้ด้วย เป็นต้น หลังจากที่พบ root filesystem แล้วก็จะทำการตรวจสอบ error ของ root จากนั้นจึง mount root filesystem นั้น เมื่อทำการ mount ได้สำเร็จ initramfs ก็จะถูกเคลียร์ออกจาก RAM แล้วไปสั่งรัน init (/bin/init) ขึ้นมาทำงานต่อ โดยในส่วน init จะเป็น initial process ที่ทำการ start process ต่างๆทั้งหมด ยกเว้น kernel process ที่จะเป็นการรันโดยตรงมาจาก kernel เอง
Screen Shot 2562-07-01 at 00.14.17.png
รูปภาพอธิบายหน้าที่ของ initramfs
จากนั้น init จะอ่านไฟล์ /etc/fstab เพื่อทำการ mount partition ต่างๆตามที่ OS ได้กำหนดไว้ หลังจากขั้นตอนข้างต้นแล้ว Linux จะเรียกใช้งาน /etc/rc.d/rc.sysinit และจากน้นจะอ่านค่าใน /etc/rc*.d/ เพื่อรัน service ต่างๆในรันเลเวลที่บูตขึ้นมา เช่น หากเป็นรันเลเวล 2 จะมีการเริ่มทำงาน service ตามใน /etc/rc2.d/ ที่ขึ้นต้นด้วย S และหากทำการ kill process ต่างๆที่ขึ้นต้นด้วย K ตามที่กำหนดใน /etc/rc2.d/ เป็นต้น จากนั้นจึงทำการใช้งาน /sbin/mingetty ซึ่งเป็น virtual console สำหรับการเข้าสู่ระบบอีกทีหนึ่ง เมื่อทำงานสำเร็จ ระบบก็จะพร้อมให้ผู้ใช้งานสามารถ login เข้าสู่ระบบได้ เมื่อผู้ใช้งานเข้าสู่ระบบได้สำเร็จก็จะทำการรัน command shell ตามที่กำหนดไว้ของแต่ละ user อีกทีหนึ่ง
*** Note ***
หากเราใช้เป็น GUI เราสามารถเข้าเป็น console แบบ text-mode ได้โดยการกด CTRL+ALT+F2-F6 (โดยหากกด F1, F7 จะเป็นการกลับมาสู่หน้าจอ GUI)

Hierarchy System

สภาวะแวดล้อมของ Linux นั้นเป็นสภาวะแวดล้อมแบบเดียวกันกับ Unix คือมีการแบ่งโครงสร้างเป็นลำดับขั้นคล้ายกับต้นไม้ โดยเริ่มจาก Root partition แล้วกระจายแยกออกมาเป็นส่วนๆ ดังรูป
Screen Shot 2562-07-01 at 00.14.50.png
รูปภาพโครงสร้างของ Linux
โครงสร้างภายในต่างๆของ Linux และการใช้งานของ Path ต่างๆครับ
Pathความหมาย
/root directory, เป็น path ที่อยู่นอกสุดของทั้งหมด  เป็น path ที่สำคัญที่สุด  เพราะจะเก็บ directory ย่อยไว้อีกมากมาย
/binเก็บ command ที่ใช้ทั่วไปในระบบ(Binary Command)  ไม่ควร mount แยกจาก root เพราะหากเกิดมีปัญหาจะเข้าถึงยากเมื่อมีการใช้ rescue-cd
/bootรวม startup file ของ linux ไว้ทั้งหมด รวมถึง kernel ด้วย  ปกติขนาดที่จะกำหนดให้เป็น 100MB – 150MB
/devpathที่เก็บ driver ของ hardwareและส่วนอ้างอิงถึง hardware ด้วย  ห้าม mount แยกจาก root
/etcconfig ต่างๆของ system และ services จะเก็บไว้ที่ path นี้
/homehome directory ต่างๆของ user
/libเก็บ library ของ kernel และ command ต่างๆ  ห้าม mount แยกจาก root
/mediaส่วนที่เป็น mount point ของพวก CD,DVD,floppy,USB
/miscส่วนที่เป็น mount point ของพวก local directory ด้วยcommand mount ต่างๆ
/mntส่วนที่เป็น mount point อีกจุดหนึ่ง
/netส่วนที่เป็น mount point ของ network directories ด้วยcommand mount ต่างๆ
/optpathที่เก็บ program ของ third party
/procส่วนที่เก็บรายละเอียดต่างๆของเครื่องในขณะที่เครื่องรันอยู่ เช่น IRQ Port ที่ใช้งานโดย device ต่างๆ, IO , DMA , ข้อมูล cpu
/roothome directory ของ root user
/sbinsystem administrator command จะเก็บไว้ที่นี่  และห้ามmount แยกจาก root
/selinuxเก็บ config ต่างๆของ Security Enchanced Linux
/smbส่วนที่เป็น mount point ของ smb(Samba)
/srvเป็น path ที่ network server ต่างๆจะมาใช้งาน
/tftpbootส่วนที่เก็บ tftp server หากมีการ install
/tmpเก็บ temporary files ของระบบ
/usrเก็บ program หรือ command ของ user  รวมถึง system admin. Command บางอย่างด้วย
/varเก็บพวก log, mail , printing spool
ตารางอธิบาย directory ต่างๆภายใน Linux

Comments

Popular Posts