ในบทนี้เราจะมาทำความเข้าใจแนวคิดของการออกแบบลินุกซ์และลักษณะการทำงานของลินุกซ์ เพื่อเป็นพื้นฐานในการเรียนรู้ในบทต่อๆไป

ลินุกซ์เกิดจากซอฟต์แวร์หลายๆตัวมารวมกัน

     ตามที่เราเรียนรู้มาแล้วว่านายลินุส โทรวัลด์ เป็นผู้พัฒนาส่วนที่เรียกว่าเคอร์เนลของระบบปฏิบัติการขึ้นมา จากนั้นจึงแจกจ่ายให้บรรดานักพัฒนานำไปพัฒนาต่อ ซึ่งก็คือการนำซอฟต์แวร์ต่างๆมาทำงานร่วมกับเคอร์เนลจนได้เป็นระบบปฏิบัติการลินุกซ์แต่ละดิสทริบิวชั่นขึ้นมา ดังนั้นเราสามารถมองได้ว่าลินุกซ์ประกอบขึ้นมาจากซอฟต์แวร์จำนวนมาก และด้วยการติดตั้งซอฟต์แวร์ที่แตกต่างกันจึงทำให้ลินุกซ์แต่ละดิสทริบิวชั่นแตกต่างกัน 

ภาพแสดงตัวอย่างซอฟแวร์ที่นำมาประกอบกับเคอร์เนลใน /bin

คำสั่งในลินุกซ์ก็คือซอฟต์แวร์

     ถึงแม้ระบบปฏิบัติการลินุกซ์จะมีส่วนติดต่อผู้ใช้งานในแบบกราฟฟิค (GUI : Graphic User Interface) มาให้ใช้ แต่ GUI ที่มีมาให้จะเหมาะสำหรับการใช้งานสำหรับเครื่องคอมพิวเตอร์เดสก์ทอปเสียมากกว่า และเครื่องมือในการจัดการตั้งค่าต่างๆในแบบ GUI ก็ไม่ได้มีประสิทธิภาพมากพอสำหรับการจัดการขั้นสูง โดยเฉพาะการจัดการในลักษณะของการใช้งานเป็นเครื่องคอมพิวเตอร์เซอร์ฟเวอร์ ดังนั้นการใช้งานลินุกซ์ให้เต็มประสิทธิภาพคงหลีกเลี่ยงไม่ได้ที่จะต้องใช้คำสั่ง (CLI – command line interface) ผ่านทางหน้าจอคอนโซลซึ่งคำสั่งหรือเครื่องมือที่ใช้ในการจัดการต่างๆเหล่านั้นก็คือซอฟต์แวร์ที่ทำงานบนลินุกซ์นั่นเอง โดยคำสั่งหรือซอฟต์แวร์เหล่านี้มีทั้งคำสั่งที่มาพร้อมกับเคอร์เนล และคำสั่งหรือซอฟต์แวร์ที่ถูกนำมาประกอบเข้ากับเคอร์เนลในภายหลังเพื่อสร้างระบบปฏิบัติการลินุกซ์แต่ละดิสทริบิวชั่นขึ้นมา (คอมไพล์ไฟล์ของซอฟต์แวร์หรือคำสั่งแต่ละตัวจะอยู่ที่ไดเร็คทอรี่ /bin) 

ภาพแสดงตัวอย่างไฟล์โปรแกรมของคำสั่ง find ภายใต้ไดเร็คทอรี่ bin

ลินุกซ์มองทุกอย่างเป็นไฟล์     

     ลินุกซ์ถูกออกแบบมาให้มองทุกอย่างเป็นไฟล์ โดยไฟล์จะถูกจัดเก็บเป็นโครงสร้างไดเร็คทอรี่ในรูปแบบต้นไม้กลับหัวโดยเริ่มจากโหนดแรกสุดคือ root เขียนแทนด้วย / (forward slash) จากนั้นจึงมีไดเร็คทอรี่ย่อยแยกลงไปเรื่อยๆจนถึงโหนดปลายสุดคือไฟล์

ภาพแสดงโครงสร้างระบบแฟ้มข้อมูลของลินุกซ์

     ไฟล์ในลินุกซ์จะมีทั้งที่เป็นไฟล์จริงๆในแบบที่เราคุ้นเคย เช่น ไฟล์เอกสาร ไฟล์ข้อความ ไฟล์รูปภาพ เป็นต้น กับสิ่งที่ไม่ใช่ไฟล์แต่ลินุกซ์มองสิ่งเหล่านั้นเป็นไฟล์ซึ่งเรียกว่า file-like object เช่น อุปกรณ์ต่อพ่วงต่างๆ (device), หน่วยประมวลผล (CPU), โปรเซส (process) และ ช่องทางการสื่อสาร (network socket) เป็นต้น นั่นหมายความว่าลินุกซ์ใช้โครงสร้างระบบแฟ้มข้อมูลเป็นแผนผังในการบริหารจัดการทรัพยากรของเครื่องคอมพิวเตอร์ ตัวอย่างการอ้างถึงไฟล์จริง เช่น /home/document/myfile.pdf  ตัวอย่างการอ้างถึงหน่วยประมวลผล เช่น /sys/devices/cpu เป็นต้น

     การมองทุกอย่างเป็นไฟล์ทำให้เราสามารถใช้ซอฟต์แวร์ คำสั่ง หรือเครื่องมือเดียวกันในการดำเนินการกับไฟล์จริงและ file-like object โดยกิจกรรมที่เกิดขึ้นจะเหมือนกันคือ อ่าน (read) เขียน (write) และดำเนินการ (execute) การให้สิทธิในการใช้งานแก่ผู้ใช้งานหรือกลุ่มผู้ใช้งานก็จะใช้ลักษณะเดียวกันกับกิจกรรมคือให้สิทธิ อ่าน (read) เขียน (write) และดำเนินการ (execute) สำหรับแต่ละไฟล์และ file-like object 

ภาพแสดงว่าลินุกซ์มอง usb drive (5291-553E)เป็นไดเร็คทอรี่

ลินุกซ์รองรับการทำงานหลายๆงานพร้อมกัน

     ระบบปฏิบัติการรุ่นใหม่ๆรวมถึงลินุกซ์จะรองรับการทำงานหลายๆงานพร้อมๆกันคือสามารถใช้งานซอฟต์แวร์ได้หลายๆตัวพร้อมๆกันเมื่อเราเรียกใช้งานซอฟต์แวร์ ระบบปฏิบัติการจะแบ่งโปรแกรมออกเป็นส่วนย่อยๆเรียกว่าโปรเซส (process) โปรเซสก็จะถูกแบ่งย่อยลงไปเป็นทาสก์ (task) และเธรด (thread) ตามลำดับ ซึ่งส่วนที่ CPU นำไปประมวลผลคือในระดับเธรด ลินุกซ์รองรับการทำงานทั้งแบบ multitasking และแบบ multithreading

ลินุกซ์รองรับการใช้งานหลายผู้ใช้งานพร้อมกัน

     ระบบปฏิบัติการลินุกซ์รองรับการใช้งานจากผู้ใช้งานหลายคนพร้อมๆกัน (multiuser) การใช้งานหลายคนพร้อมๆกันไม่ได้หมายถึงเพียงแค่ผู้ใช้งานสลับกันใช้งานจากเครื่องคอมพิวเตอร์เครื่องเดียวกันด้วยชื่อและรหัสผ่านที่ต่างกัน แต่รวมถึงการ log in เข้าใช้งานจากคอมพิวเตอร์เครื่องอื่นด้วย ตัวอย่างเช่น เครื่องคอมพิวเตอร์ชื่อ com1 มีผู่้ใช้งานชื่อ user1 เข้าใช้งานจากหน้าเครื่องโดยตรงเพื่อเรียกใช้ program1 และมีผู้ใช้งานชื่อ user2 เข้าใช้งานจากเครื่องอื่นและเรียกใช้ program2 ดังนั้นเครื่องคอมพิวเตอร์ชื่อ com1 กำลังประมวลผลทั้งซอฟต์แวร์ program1 และ program2 พร้อมๆกัน เป็นต้น

 ภาพแสดงว่ามีผู้ใช้งานกำลังใช้งานอยู่ 2 คนในเครื่องเดียวกัน

ซอฟต์แวร์ที่ใช้ในการจัดการแพคเกจ

     การพัฒนาซอฟต์แวร์บนลินุกซ์นิยมพัฒนาเป็นซอฟต์แวร์เล็กๆที่ทำงานเฉพาะอย่างแต่สามารถนำซอฟต์แวร์เหล่านั้นมาทำงานร่วมกันเพื่อให้สามารถทำงานที่ซับซ้อนได้ ดังนั้นการติดตั้งซอฟต์แวร์ที่ต้องการใช้งานจะหมายถึงต้องติดตั้งซอฟต์แวร์อื่นๆที่ต้องใช้งานร่วมกันด้วย การตรวจสอบว่าซอฟต์แวร์ที่เราจะติดตั้งต้องการซอฟต์แวร์อื่นหรือไม่เป็นหน้าที่ของตัวจัดการแพคเกจ (package management) ซึ่งจะตรวจสอบและรวบรวมซอฟต์แวร์ทุกๆตัวที่เกี่ยวข้องมาติดตั้งไปพร้อมๆกัน นอกจากการติดตั้งแล้วตัวจัดการแพคเกจจะถูกใช้การปรับปรุงและถอนการติดตั้งด้วย ลินุกซ์เรียกซอฟต์แวร์แต่ละตัวว่าแพคเกจเพราะการติดตั้งซอฟต์แวร์จะเป็นการติดตั้งไบนารี่ไฟล์ ต้นฉบับโปรแกรม ไลบรารี่ที่เกี่ยวข้อง และคู่มือการใช้งาน มาในคราวเดียวกัน

ภาพแสดงซอฟต์แวร์แพคเกจของแต่ละแฟมิลี่

ภาพแสดงซอฟแวร์ที่ต้องทำงานร่วม (dependency) กับคำสั่ง locate

สิ่งแวดล้อมสำหรับนักพัฒนา

     ลินุกซ์มาพร้อมกับส่วนสำคัญอื่นๆที่เป็นสิ่งแวดล้อมสำหรับนักพัฒนา เช่น ตัวแปรภาษา C/C++ (C/C++ compiler) ตัวแก้ไขซอฟต์แวร์ gdb (gdb debugger) ไลบรารี่สำคัญต่างๆ (core system library) ที่ซอฟต์แวร์ต้องเรียกใช้เวลาทำงาน เป็นต้น

ชนิดของซอฟแวร์ในลินุกซ์

     เราสามารถแบ่งซอฟต์แวร์ออกเป็นหมวดหมู่ได้ดังนี้

1. ซอฟต์แวร์ที่มีบริษัทเป็นเจ้าของ (Generic Proprietary Application) โดยซอฟต์แวร์เหล่านี้เกิดจากการที่บริษัทต่างๆต้องการให้ซอฟต์แวร์ของตนสามารถใช้งานได้กับลินุกซ์ ซอฟต์แวร์เหล่านี้ไม่ได้เป็นโอเพ่นซอร์สและมีลิขสิทธ์ในการใช้งาน เช่น แอพพลิเคชั่นที่ใช้เปิดไฟล์ Adobe Flash หรือ โปรแกรมที่เป็นไดรว์เวอร์ของอุปกรณ์ต่างๆ เป็นต้น 

2. ซอฟต์แวร์ที่สามารถใช้งานได้ฟรี (Generic Free Application) เช่น แอพพลิเคชั่นแบชเชลล์ แอพพลิเคชั่น X Window หรือ ชุดแพพลิเคชั่นมสำนักงาน Libre Office เป็นต้น ซอฟต์แวร์เหล่านี้ถูกพัฒนาโดยชุมชนโอเพ่นซอร์ส เราสามารถนำไปใช้งานได้ฟรี สามารถแจกจ่ายได้ สามารถแก้ไขได้ และสามารถแจกจ่ายการแก้ไขนั้นๆได้

3. ซอฟต์แวร์เฉพาะสำหรับแต่ละลินุกซ์ดิสทริบิวชั่น (Distrubution Specific Application) เช่น ตัวจัดการแพคเกจ หรือ แอพพลิเคชั่นที่ใช้เป็นเครื่องมือในการตั้งค่าระบบ (system configuration) ซอฟต์แวร์เหล่านี้ก็ถูกพัฒนาโดยชุมชนโอเพ่นซอร์สเช่นเดียวกัน

4. คู่มือการใช้งานซึ่งก็เป็นซอฟต์แวร์ชนิดหนึ่ง

5. ซอฟต์แวร์ที่ทำหน้าที่สนันสนุนการใช้งานต่างๆ เช่น ระบบการรายงานข้อผิดพลาด เป็นต้น