ทำไมระบบปฏิบัติการและเคอร์เนลจึงแยกปฏิบัติใน Linux [ปิด]


9

เมื่อมาถึงระบบปฏิบัติการลินุกซ์ใด ๆ รวมทั้ง Ubuntu คนมักจะเห็นความแตกต่างแง่kernelและระบบปฏิบัติการ สิ่งนี้ถูกต้องสำหรับ Windows และตระกูล OS X แต่ทำไมแพร่หลายในหมู่ชุมชน Linux? มีวิธีอัปเดตเคอร์เนลระบบปฏิบัติการหรือไม่โดยไม่ต้องอัปเดต OS หรือในทางกลับกัน? ถ้าเป็นเช่นนั้นจะมีประโยชน์อย่างไร


3
เรียบง่าย: อิสระ อิสระในการสร้างเวอร์ชั่นของคุณเองในสิ่งที่คุณต้องการ Kernel? เปลือก? เดสก์ทอป. ไปเลย
Rinzwind

6
เพราะพวกเขามีแยกกันได้อย่างไร เหตุผลเดียวกันว่าทำไมตัวจัดการหน้าต่างได้รับการปฏิบัติแยกจากเซิร์ฟเวอร์ X (เพราะแยกต่างหาก) และสาเหตุที่เชลล์จัดการแยกต่างหากจากเทอร์มินัลอีมูเลเตอร์ (เพราะมันแยกจากกัน) ทีนี้ถ้าคุณถามว่าทำไมพวกมันถึงถูกออกแบบมา ...
user253751

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

@MSalters ตัวจัดการหน้าต่างใน Windows นั้นค่อนข้างยุ่งยากใช่ไหม อย่างไรก็ตามหากมีคนต้องการเรียกใช้ X บน Windows จริง ๆ มีวิธีการจัดการมากมาย วิธีที่ง่ายที่สุดสำหรับคนนอกอาจเป็นเซิร์ฟเวอร์ "อีมูเลเตอร์" ที่อยู่ด้านบนของตัวจัดการหน้าต่างที่มีอยู่แม้ว่าฉันไม่รู้ว่ามันจะสามารถทำแผนที่ได้ดีแค่ไหน (ครั้งสุดท้ายที่ฉันเห็น X internals ฉันไม่หวังมาก) ฉันจะไม่กลั้นลมหายใจ - ไม่ฟังดูราวกับว่าผู้คนจำนวนมากสนใจที่จะให้ X ทำงานบน Windows
Luaan

คำตอบ:


12

ระบบ GNU / Linux ทั้งหมดถูกสร้างขึ้นโดยใช้วิธีการแบบแยกส่วน คุณสามารถอัปเกรด ( แทนที่โดยทั่วไป) เป็นโมดูลเดียวโดยไม่ต้องสัมผัสผู้อื่น โมดูลที่เป็นปัญหาสามารถเป็น bootloader, เคอร์เนล, เชลล์, คำสั่ง, สภาพแวดล้อมเดสก์ท็อป, แอปพลิเคชั่น GUI, อะไรก็ได้ที่ ...

แน่นอนว่ามันเป็นความจริงตราบใดที่คุณสามารถจัดการการพึ่งพาได้อย่างถูกต้อง ในชุดการกระจายรอบ Ubuntu นั้นAPTจะใช้เพื่อแก้ไขการขึ้นต่อกันโดยอัตโนมัติ

คุณสามารถติดตั้งเคอร์เนลเวอร์ชันอื่นได้โดยใช้คำสั่ง:

sudo apt install linux-image-<version>

ตราบใดที่ APT อนุญาตคุณควรจะสามารถรีบูตและใช้เคอร์เนลรุ่นที่เลือกได้ไม่ว่าจะเป็นแบบทั่วไปความจุต่ำ ฯลฯ หรือคุณสร้างเวอร์ชันเคอร์เนลด้วยตัวเองเช่นReal-Time Linuxและใช้กับระบบปัจจุบันของคุณ .


ขอบคุณมาก แต่มันจะสอดคล้องกันไหม สมมติว่า Ubuntu 14.04 LTS มีเคอร์เนลเวอร์ชัน 3.19.0 และในกรณีที่อัปเดตเคอร์เนลไม่ใช่ 14.04 LTS อีกต่อไปใช่ไหม ดังนั้นหากฉันพยายามอัปเดตทั้งระบบในภายหลังหรือกลไกการอัพเดตในตัว (Software Updater) ทำให้ฉันมีเวอร์ชั่นใหม่ฉันจะทราบถึงเคอร์เนลที่อัปเดตแล้วหรือไม่ สามารถตรวจสอบโมดูลแยกกันและนำการเปลี่ยนแปลงที่จำเป็นเท่านั้นมาใช้โดยไม่ได้รับผลกระทบจากการอัพเดทโมดูลหรือไม่?
The Dreams Wind

1
ดูpackages.ubuntu.com/search?keywords=linux-imageสำหรับยาวรายการรุ่นเคอร์เนลว่าแต่ละรุ่นอูบุนตูสนับสนุน เวอร์ชัน Ubuntu นั้นพิจารณาจากสิ่งที่แตกต่างจากเวอร์ชั่นเคอร์เนล แต่ฉันไม่รู้จริงๆว่าอันไหน…ถ้าคุณสนใจคุณสามารถเริ่มคำถามอื่นได้
Melebius

1
@AleksandrMedvedev มากในภายหลังฉันพบมัน! เวอร์ชั่นของ Ubuntu นั้นถูกบันทึกไว้ในไฟล์/etc/issueที่ให้มาในbase-filesแพ็คเกจ ตามที่ฉันได้เขียนไปแล้วมันไม่เกี่ยวข้องกับเคอร์เนลเวอร์ชัน
Melebius

5

ดังที่คุณทราบเคอร์เนลเป็นส่วนสำคัญของระบบปฏิบัติการใน GNU / Linux ดิสทริบิวเตอร์คุณสามารถอัปเดตเคอร์เนลได้อย่างง่ายดายโดยไม่ต้องสัมผัสส่วนอื่น ๆ ของระบบปฏิบัติการ อย่างไรก็ตามเราเพียงแค่อัปเดตส่วนหนึ่งของระบบปฏิบัติการของเรา

ระบบปฏิบัติการประกอบด้วยสองส่วนคือพื้นที่เคอร์เนลและพื้นที่ผู้ใช้

ใช่คุณสามารถอัปเดตพื้นที่เคอร์เนลของคุณโดยไม่ต้องแตะที่พื้นที่ผู้ใช้ของคุณหากมีเพียงเวอร์ชั่นใหม่ที่เข้ากันได้กับพื้นที่ผู้ใช้ปัจจุบันของคุณ

และเกี่ยวกับการอัพเดทเครื่องมือพื้นที่ผู้ใช้

เมื่อคุณทำงาน:

sudo apt-get upgrade

หากมีการอัปเดตสำหรับเคอร์เนลคุณจะได้รับ:

The following packages have been kept back:
  linux-generic linux-headers-generic linux-image-generic

ดังนั้นคุณจะอัพเดตเฉพาะพื้นที่ผู้ใช้ของคุณและเมื่อคุณเรียกใช้บางสิ่งบางอย่าง

sudo apt-get dist-upgrade

คุณกำลังปรับปรุงทุกอย่างรวมถึงเคอร์เนล

หากต้องการอัปเกรดเฉพาะเคอร์เนลของคุณเป็นเวอร์ชันที่ใหม่กว่าให้ใช้สิ่งต่อไปนี้:

$ apt-cache search "linux-image-[0-9]+.*-generic" | awk '{print $1}' | head -4
linux-image-4.4.0-21-generic
linux-image-4.10.0-14-generic
linux-image-4.10.0-19-generic
linux-image-4.10.0-20-generic

เพื่อค้นหารายการของเมล็ดที่ใหม่กว่าจากนั้นติดตั้งเป็นแพ็คเกจใหม่ตัวอย่างเช่น:

sudo apt install linux-image-4.10.0-14-generic

สิ่งนี้ไม่เป็นความจริงอย่างแน่นอน
mook765

ถูกต้องฉัน;) ดังนั้นผมจึงได้เรียนรู้สิ่งใหม่ ๆ :)
Ravexina

3
sudo apt upgradeจะอัพเกรดเคอร์เนลด้วยหากมีเวอร์ชั่นใหม่ให้ใช้ sudo apt full-upgradeจะลบตูด packeges ดีสิ่งที่asudo apt upgradeจะทำ
Soren

ในฐานะที่เป็นตอนนี้ผมอัพเกรดเป็น kernel ใหม่เป็นชนิดของการติดตั้งบางอย่างและในขณะที่ใช้upgradesubcommand ก็จะไม่ติดตั้งแพคเกจใหม่ ๆ ยังไม่ได้เอาแพคเกจใด ๆ thats dist-upgradeทำไมเราใช้ อย่างน้อยก็apt-getทำงานด้วยวิธีนี้;) ดังนั้นฉันจึงปรับปรุงคำสั่งของฉันเพื่อป้องกันความสับสน
Ravexina

1
ฉันมีประสบการณ์มากขึ้นกับaptคำสั่ง - หลังจากการวิจัยสั้น ๆ ดูเหมือนว่าคำตอบของคุณถูกต้องแล้วaptและapt-getจัดการกับสิ่งต่าง ๆ ดูที่hiroom2.com/2016/05/20/ubuntu-16-04-debian-8-apt - คำสั่ง / … . ดังนั้นความรู้บางอย่างสำหรับเราทั้งคู่ ...
mook765

3

ข้อแรกคือการชี้แจงเล็กน้อยเพราะฉันรู้สึกว่าคุณไม่เข้าใจว่าระบบ GNU / Linux มีอยู่จริงอย่างไร อดทนกับฉันถ้าไม่มีอะไรใหม่สำหรับคุณ:

"เคอร์เนล" ไม่ได้เป็นเพียงแค่โปรแกรมอื่นที่ทำงาน แต่เป็นส่วนหนึ่งของระบบปฏิบัติการที่มีฟังก์ชั่นพื้นฐาน: หากคุณต้องการเริ่มโปรแกรม (เช่นคุณพิมพ์ "ls" ที่บรรทัดคำสั่ง) ไบนารีจะต้องโหลด จากดิสก์ (ที่มีการดำเนินการระบบไฟล์บางส่วนเพื่อค้นหาและจัดการไฟล์บางส่วนเพื่ออ่าน) จากนั้นสร้าง "สภาพแวดล้อมของกระบวนการ" ถูกสร้างขึ้น: หน่วยความจำได้รับมอบหมายจำนวนกระบวนการจะออกเป็นต้น ฯลฯ กิจกรรมในอดีตทั้งหมด (FS, การอ่านจากไฟล์, ... ) ได้รับการจัดการโดยไลบรารีระบบ แต่อันหลังคือฟังก์ชันเคอร์เนล ในบางแง่เคอร์เนล "คือระบบปฏิบัติการ" และทุกอย่างก็แค่ตกแต่งรอบ ๆ

"Linux" เป็นจริง (เท่านั้น!) เคอร์เนลที่ไม่มีส่วนอื่น ๆ ของระบบปฏิบัติการอยู่ Linus Torvalds เริ่มเขียนโดยใช้แอนดรู Tananbaums เทมเพลต MINIX เคอร์เนลระบบปฏิบัติการและทำให้มันสมบูรณ์แบบ จนถึงทุกวันนี้ก็มี Linus (และคนอื่น ๆ อีกมากมายที่มีส่วนร่วม / สนับสนุน) ที่พัฒนาเคอร์เนลนี้ เคอร์เนลนี้ยังคงคล้ายกับ UNIX แต่ไม่ใช่เคอร์เนล UNIX

"GNU" เริ่มต้นเป็นความคิดริเริ่มเพื่อ "ทำให้ดีขึ้น" คำสั่ง UNIX ทั่วไปจำนวนมาก ฉันจะไม่พูดคุยหากพวกเขาประสบความสำเร็จหรือไม่ แต่พวกเขาเขียนซอฟต์แวร์จำนวนมากอย่างแน่นอนและ ณ จุดหนึ่งมีคอลเลกชันของโปรแกรมยูทิลิตี้ พวกเขาเริ่มพัฒนาเคอร์เนลระบบปฏิบัติการของตัวเอง (HURD) ซึ่งมีพื้นฐานมาจาก UNIX แต่แตกต่างกันอย่างแน่นอน แต่จนถึงทุกวันนี้ HURD ยังอยู่ในช่วงเริ่มต้นของการพัฒนาและแทบจะไม่มีทางแก้ปัญหาในการทำงาน "GNU" btw สั้นสำหรับ "GNU (คือ) ไม่ใช่ UNIX" - พวกเขาพยายามที่จะเอาชนะข้อ จำกัด บางประการ (ที่รับรู้หรือจริง) ของ UNIX ด้วยความตั้งใจที่จะสร้างผู้สืบทอดให้กับ UNIX (อีกครั้ง: ฉันไม่ต้องการเข้าร่วมการสนทนาหากพวกเขาทำสำเร็จหรือ ไม่ - ฉันไม่สนใจว่ามันจะ "ดีกว่า" หรือ "แย่กว่า" แต่มันแตกต่างกันอย่างแน่นอน!)

ดังนั้นด้วยชุดเครื่องมือที่ขาดเคอร์เนลและเคอร์เนลที่ขาดชุดเครื่องมือมันเป็นการพัฒนาตามธรรมชาติที่จะรวมสองสิ่งนี้เข้าด้วยกัน: GNU / Linux ถูกสร้างขึ้น

ยังมีระบบปฏิบัติการ (และใช้งานได้) คุณต้องการมากกว่าเคอร์เนลและชุดเครื่องมือ: คุณต้องการระบบการจัดการแพ็คเกจคุณต้องมีขั้นตอนการติดตั้งคุณต้องมีการกำหนดค่าแม่แบบคุณต้อง ....

คนหลายคน (หรือกลุ่มของมัน) มาถึงข้อสรุปนี้และใช้การรวมกันของ GNU / Linux เพื่อสร้างระบบ GNU / Linux- ตามความชอบของพวกเขาโดยการเพิ่มสิ่งที่ฉันพูดถึงข้างต้น: พวกเขาสร้างผู้จัดการบรรจุภัณฑ์ระบบบรรจุภัณฑ์ ขั้นตอนการติดตั้งและอะไรอีกมากมาย กลุ่มต่าง ๆ เหล่านี้ (ตามลำดับผลลัพธ์ของความพยายามของพวกเขา) คือความแตกต่างที่ต่างกัน วันนี้มีตัวจัดการแพ็กเกจที่แตกต่างกันสามตัว (เหมาะสำหรับ Debian และระบบที่ได้รับเช่น * ubuntu, rpm สำหรับ RedHat และระบบที่ได้มาเช่น Fedora, CentOS และอื่น ๆ , pacman สำหรับ ArchLinux) แต่สิ่งเหล่านี้เพียงจัดการแพ็กเกจซอฟต์แวร์ เหมือนกัน: สิ่งที่เรียกว่าเมื่อคุณออก "ls" หรือ "df" ฯลฯ

ดังนั้น "ในหลักการ" คุณสามารถอัปเดตเคอร์เนลเพียงอย่างเดียวเช่นคนที่สร้างการแจกจ่ายจากซอฟต์แวร์ทุกเวอร์ชันที่ฉันพูดไว้ข้างต้น

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

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

ฉันหวังว่านี้ตอบคำถามของคุณ.


GNU ไม่ได้เริ่มต้นเป็นความคิดริเริ่มในการ "ทำให้ดีขึ้น" คำสั่ง UNIX ทั่วไปจำนวนมาก GNU เป็นระบบปฏิบัติการจากจุดเริ่มต้นเพื่อจุดประสงค์ของซอฟต์แวร์เสรีเพื่อตอบสนองต่อ UNIX ที่มีกรรมสิทธิ์อย่าง จำกัด คุณสามารถอ่านเพิ่มเติมได้จากเว็บไซต์ของพวกเขา พวกเขาตัดสินใจที่จะย้ายพอร์ตซอฟต์แวร์ทั้งหมดของพวกเขาไปยัง Linux เพราะเมื่อถึงเวลาสร้าง Linux GNU ยังไม่มีเคอร์เนลที่ใช้งานได้
Ian Emnace

3

คำตอบที่ง่ายที่สุดไม่เกี่ยวกับ Ubuntu มันเกี่ยวข้องกับวิธีสร้าง GNU / Linux หากคุณลองมองว่ามันเป็นนักพัฒนาระบบคุณจะเห็นสองโลกแต่ละแห่งคั่นด้วยเส้นขอบที่คมชัด (ABI)

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

ตอนนี้พื้นที่ผู้ใช้เป็นโลกปกติที่ผู้ใช้และนักพัฒนาซอฟต์แวร์กำลังเล่นอยู่ มันมี APIs ที่เข้มงวดกฎไฟล์และสิ่งที่สำคัญที่สุดคือภาพนามธรรมที่เป็นเด็ก ๆ ของเครื่องที่ทำงานอยู่ เนื่องจากผู้ใช้จะเห็นเฉพาะส่วนนี้และจำนวนนี้เป็น 99% ของขนาดการแจกจ่ายจึงง่ายต่อการตั้งชื่อระบบปฏิบัติการผิด ระบบการตั้งชื่อที่ถูกต้องคือเรียกว่าการกระจายซอฟต์แวร์ที่สร้างโดยเอนทิตีบางอย่าง (Canonical, Fedora และอื่น ๆ ) ใช้เคอร์เนล (Linux, HURD, BSD, ฯลฯ ) และสร้างโดยใช้ชุดเครื่องมือ (โดยปกติจะเป็น GNU )

เพื่อตอบคำถามของคุณใน GNU / Linux (เช่นเดียวกับใน Windows และ OSX เชื่อใจฉัน) คุณสามารถเปลี่ยนเคอร์เนลไม่ใช่เฉพาะรุ่น แต่รวมถึงสถาปัตยกรรมทั้งหมด (Linux Kernel, vs HURD Kernel) และตราบใดที่ ABI ไม่ได้สัมผัสไม่เคยเปลี่ยนโลกผู้ใช้เพียงครั้งเดียว ... ย้อนกลับไปในวันที่มนุษย์จริงต้องสร้างเคอร์เนลจากแหล่งต่าง ๆ คุณสามารถผ่านการเปลี่ยนแปลงหลายอย่างเช่นนี้เพื่อรับเว็บแคม USB ที่กระหึ่ม เพื่อทำงาน ... ตอนนี้ด้วยเคอร์เนลแบบแยกส่วนคุณเพียงแค่ต้องติดตั้งโมดูลและคุณจะได้โลกใหม่ของเคอร์เนลด้วย ABI (บางครั้ง) ขยายด้วยคุณสมบัติใหม่

อีกครั้งเหมือนกันสำหรับ userspace เมื่อคุณติดตั้งแอปพลิเคชั่นใหม่จากที่เก็บของ Ubuntu เวลา 99% ข้อกังวลที่ใหญ่ที่สุดของคุณคือความเข้ากันได้ของส่วนประกอบ userpace อื่น ๆ ไม่ใช่เคอร์เนลจริง มีหลายกรณีที่รุ่นเคอร์เนลกำหนด (ผ่าน ABI) ช่วงของสิ่งต่าง ๆ ที่สามารถติดตั้งใน userspace ได้ แต่เป้าหมาย (สำหรับนักพัฒนาอย่างน้อย) คือการทำให้สิ่งนี้หายไป ...

คุณสามารถ (และมันค่อนข้างง่าย) ในการสร้างการกระจาย GNU / Linux ที่ไม่ซ้ำใครของคุณเอง รับเคอร์เนลสคริปต์ง่าย ๆ หลายแอพและคุณตั้งค่าไว้ มันง่ายมาก (ดูที่ OpenWRT GNU / Linux ดิสทริบิวชันสำหรับอุปกรณ์เครือข่ายการกระจายทั้งหมดนั้นพอดีในรูปแบบ 16Mb หรือมากกว่านั้น)


"เส้นขอบที่คมชัด (ABI)" ฉันคิดว่าคุณหมายถึง API ABI คือ a, สำหรับการขาดคำที่ดีกว่า, โค้ดไปยังอินเตอร์เฟสฮาร์ดแวร์ API ในทางกลับกันคือโค้ดสำหรับโค้ดอินเตอร์เฟส
Sam

1

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

ผู้ใช้ระดับสูงหรือมืออาชีพบางรายคอมไพล์เคอร์เนลเพื่อปรับเปลี่ยนพฤติกรรมเพื่อให้เหมาะกับความต้องการของพวกเขา ในกรณีเช่นนี้คุณคงไม่ต้องการให้มันถูกแทนที่ด้วยเวอร์ชั่นโรงงานโดยอัตโนมัติทุกครั้งที่คุณอัพเกรด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.