NodeOS: ระบบปฏิบัติการที่ใช้ JavaScript

เผยแพร่แล้ว: 2022-03-11

ฉันแน่ใจว่าโปรแกรมเมอร์ส่วนใหญ่เคยได้ยิน Node.js แล้ว แต่ NodeOS ล่ะ? ใช่ NodeOS ซึ่งเป็นระบบปฏิบัติการที่เขียนด้วย Node.js ชนิดของ NodeOS ใช้เคอร์เนล Linux สำหรับสิ่งที่สำคัญที่สุดด้านประสิทธิภาพ เช่น การโต้ตอบกับฮาร์ดแวร์ แต่สำหรับอย่างอื่นจะใช้ Node.js การพัฒนา NodeOS เริ่มต้นเมื่อสองปีที่แล้วและสร้างขึ้นโดยผู้คนที่แบ่งปันแนวคิดที่เรียบง่าย แต่น่าสนใจ: "เป็นไปได้ไหมที่จะสร้างระบบปฏิบัติการโดยใช้ Node.js เท่านั้น"

แผนภูมิวิวัฒนาการของดาร์วิน

เป็นไปได้ไหมที่จะสร้างระบบปฏิบัติการโดยใช้ Node.js เท่านั้น?
ทวีต

เรื่องใหญ่คืออะไร?

ก่อนอื่น ให้นึกถึงความคืบหน้าของ Node.js ที่เกิดขึ้นในช่วงเวลาสั้นๆ ตอนนี้ ให้คิดถึงสิ่งเดียวกันที่เกิดขึ้นกับระบบปฏิบัติการ จากนั้นมาเพิ่มสิ่งดีๆ ลงไป

ระบบไฟล์รูทอิสระและแยกต่อผู้ใช้

NodeOS นำเสนอกระบวนทัศน์ที่น่าสนใจ: หากผู้ใช้ทุกคนมีระบบไฟล์ที่แยกจากกัน ก็จะให้ลำดับชั้นของระบบไฟล์ที่ใช้งานง่าย เนื่องจาก "โฟลเดอร์หลัก" ของพวกเขาเป็นรูทของลำดับชั้นระบบไฟล์ของพวกเขา พวกเขาสามารถติดตั้งแพ็คเกจได้ทั่วโลกโดยไม่ต้องมีการอนุญาตพิเศษ และไม่จำเป็นต้องกำหนดค่าใดๆ เนื่องจากพวกมันถูกติดตั้งในโฮมไดเร็กทอรีตามค่าเริ่มต้น นอกจากนี้ยังมีการรักษาความปลอดภัยที่ดี หากแฮ็กเกอร์พบวิธีที่จะเข้าไปในบัญชีใดบัญชีหนึ่งในระบบปฏิบัติการ พาร์ติชั่นเดียวที่พวกเขา/เขาสามารถเข้าถึงได้ก็คือพาร์ติชั่นของผู้ใช้นั้น ผลลัพธ์ที่ได้คือแฮ็กเกอร์ ไม่สามารถ ประนีประนอมทั้งระบบได้

Node.js และ NPM

หากคุณคิดเกี่ยวกับมัน ระบบปฏิบัติการที่ใช้ Node.js หมายความว่าแพ็คเกจใดๆ ที่มีใน NPM จะเป็นแพ็คเกจ NodeOS ในเวลาเดียวกัน ในขณะที่เขียน มี 210,735 แพ็คเกจ; เนื่องจากจำนวนแพ็คเกจ NPM เพิ่มขึ้นทุกนาที จึงไม่แปลกถ้า NodeOS มีแอปพลิเคชันนับล้านภายในเวลาไม่กี่ปี

มันขึ้นอยู่กับเคอร์เนลลินุกซ์

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

ข้อเสีย

เท่าที่ฉันต้องการ NodeOS ที่เสร็จสิ้นแล้ว มันยังไม่มี ยังคงขาดฟังก์ชันสำคัญหลายอย่างสำหรับระบบปฏิบัติการเซิร์ฟเวอร์ ตัวอย่างเช่น ชุดเครื่องมือ BASH ทั้งหมดหายไป รวมถึง ps, tail, nano และ grep นอกจากนี้ คุณไม่สามารถเรียกใช้เป็นระบบปฏิบัติการเดสก์ท็อปได้เนื่องจากไม่มี GUI แน่นอนว่าคุณสามารถใช้คุณลักษณะที่ขาดหายไปบางอย่างได้ค่อนข้างง่ายโดยใช้ JavaScript เล็กน้อย แต่ความจริงแล้วคุณลักษณะที่กล่าวถึงทั้งหมดไม่พร้อมใช้งานตามค่าเริ่มต้นนั้นไม่ดี

ฉันจะลองใช้ NodeOS ได้อย่างไร

การใช้ Docker

วิธีที่ง่ายและรวดเร็วที่สุดในการทดลองใช้ NodeOS คือการใช้สิ่งต่อไปนี้:

  1. คอมพิวเตอร์ที่มี Mac OSX หรือ Linux อาจใช้งานได้กับ Windows แต่ฉันไม่ได้ลอง
  2. นักเทียบท่า

เมื่อคุณติดตั้ง Docker แล้ว การเรียกใช้อินสแตนซ์ของ NodeOS นั้นเป็นเรื่องง่าย สิ่งที่คุณต้องทำคือรันคำสั่งต่อไปนี้ และ Docker ทำทุกอย่าง:

 sudo docker run -t -i nodeos/nodeos 

วิธีที่ง่ายและรวดเร็วที่สุดในการทดลองใช้ NodeOS คือการใช้ Docker

วิธีที่ง่ายและรวดเร็วที่สุดในการทดลองใช้ NodeOS คือการใช้ Docker
ทวีต

เมื่อคุณเรียกใช้คำสั่งดังกล่าว Docker จะดาวน์โหลดภาพดิสก์สำหรับ NodeOS จากที่เก็บโดยอัตโนมัติ และทำการติดตั้ง NodeOS ภายในเครื่องเสมือน เมื่อการติดตั้งเสร็จสิ้น จะเป็นการเปิดเซสชัน SSH ไปยัง NodeOS เชลล์

ไม่มีนักเทียบท่า

มีสาเหตุบางประการที่คุณไม่ต้องการใช้ Docker และสาเหตุหนึ่งคือ NodeOS เวอร์ชันล่าสุด ในขณะที่เขียน การเปลี่ยนแปลงครั้งล่าสุดในอิมเมจ Docker ของ NodeOS ได้ดำเนินการเมื่อสองเดือนที่แล้ว ในขณะที่เวอร์ชันการพัฒนาได้รับการอัปเดตเมื่อหกวันก่อน ดังนั้น หากคุณต้องการใช้เวอร์ชันล่าสุด คุณควรได้รับซอร์สโค้ดอย่างแน่นอน ไม่ยากเกินไปแต่ใช้เวลานาน คุณจะต้องการ:

  1. คอมพิวเตอร์ที่มีลินุกซ์ คุณสามารถคอมไพล์บน OS X ได้ แต่จะใช้เวลานานกว่านั้นเนื่องจากต้องทำการคอมไพล์แบบไขว้ เช่นเดียวกับ Windows
  2. ยูทิลิตีบิลด์ Linux (make, g++, gcc, autoconf)
  3. เคมู
  4. เวลา. อย่างจริงจังมาก

เมื่อคุณมีทุกอย่างแล้ว คุณสามารถดำเนินการรวบรวมซอร์สโค้ดได้:

  1. ดาวน์โหลดซอร์สโค้ดของโครงการ: bash git clone [email protected]:NodeOS/NodeOS.git
  2. คอมไพล์โดยใช้คำสั่งต่อไปนี้: cd NodeOS และ npm install
  3. ฉันจะพูดทีละคำ เอกสารอย่างเป็นทางการ: “เลือกข้าวโพดคั่วไมโครเวฟแล้วไปดูหนัง ไม่ จริงๆ ทำมัน” . ใช่ มันจะใช้เวลามากขนาดนั้น ในระหว่างนี้ให้ทำอะไรที่น่าสนใจบ้าง
  4. รัน bash npm start รัน NodeOS ภายใน Qemu

มันใช้ได้ไหม?

เมื่อการติดตั้งเสร็จสิ้น เราสามารถตรวจสอบว่าทำงานได้หรือไม่โดยดำเนินการคำสั่ง ls ภายในเชลล์ NodeOS ผลลัพธ์เช่นนี้ควรปรากฏขึ้น:

 [ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]

หากเป็นเช่นนั้น แสดงว่าคำสั่งพื้นฐานบางอย่างกำลังทำงานอยู่ แต่ถ้าเราต้องการแสดงที่อยู่ IP ของการ์ดเครือข่ายล่ะ ภายใต้ Linux มีคำสั่งชื่อ ifconfig ที่ทำอย่างนั้น มาลองดูกัน:

 command not found: ifconfig

ดูเหมือนว่าคำสั่ง ifconfig จะหายไป นั่นเป็นเพราะ NodeOS ไม่มีคำสั่ง ifconfig เริ่มต้น ตอนนี้อะไร? มันง่าย; NodeOS มีตัวจัดการแพ็คเกจแบบรวม (เช่น apt หรือ yum ) ที่เรียกว่า npkg ซึ่งอิงตาม NPM ของ Node และใช้งานง่าย การติดตั้ง ifconfig นั้นง่ายพอๆ กับการรันคำสั่งต่อไปนี้:

 npkg install bin-ifconfig

หากทุกอย่างเป็นไปด้วยดี คำสั่ง ifconfig ควรมีอยู่ในเชลล์ หากเราพยายามดำเนินการอีกครั้ง ผลลัพธ์เช่นนี้จะปรากฏขึ้น (ฉันใส่ที่อยู่ MAC แบบสุ่มและที่อยู่ IP ด้วยเหตุผลที่ชัดเจน):

 eth0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 01:23:45:67:89:ab inet6 f0cd::ef01:0203:0405:181%en1 prefixlen 64 scopeid 0x5 inet 192.168.0.21 netmask 0xffffff00 broadcast 192.168.0.21 nd6 options=1<PERFORMNUD> media: autoselect status: active

หากผลลัพธ์ของคุณเป็นแบบนั้น แสดงว่าใช้งานได้ คุณติดตั้งแอปพลิเคชัน NodeOS แรกของคุณสำเร็จ: ifconfig

มันกำลังทำงาน อย่างไรก็ตาม ตอนนี้เราจะทำอย่างไรกับระบบปฏิบัติการ?

การมีระบบปฏิบัติการที่เขียนใน Node.js คืออะไรหากคุณสามารถทำสิ่งเดียวกัน (หรือน้อยกว่านั้น) ที่คุณสามารถทำได้บน Ubuntu หรือการแจกจ่าย Linux อื่น ๆ ประเด็นทั้งหมดคือทุกอย่างได้รับการพัฒนาโดยใช้ Node.js เพียงอย่างเดียว นอกจากนี้ยังหมายความว่าเราสามารถพัฒนาแอปพลิเคชันของเราได้โดยไม่ต้องใช้อะไรมากไปกว่า Node.js ตัวอย่างเช่น NodeOS ไม่มีการใช้งานเริ่มต้นสำหรับคำสั่ง man ซึ่งใช้บน Linux เพื่อแสดงหน้าคู่มือของคำสั่งอื่น อย่ากลัวเลย การนำไปปฏิบัตินั้นง่าย ฉันได้ยินคุณถามอย่างไร เรียบง่าย.

การสร้างแอปพลิเคชัน NodeOS ด้วย Node.js

ขั้นแรก ให้ติดตั้งโปรแกรมแก้ไขข้อความชื่อ Hipster เพื่อให้เราสามารถสร้างและแก้ไขไฟล์ได้โดยใช้คำสั่งต่อไปนี้: npm install -g [email protected] ตัวแก้ไขไฟล์นี้เรียบง่าย และแน่นอนว่า ไม่ใช่ สิ่งที่ฉันจะใช้เป็นตัวแก้ไขสำหรับอย่างอื่น แต่ก็ดีเพียงพอในกรณีนี้ การสร้างไฟล์ด้วย Hipster นั้นง่ายมาก เพียงแค่เรียกใช้ hip filename เช่น hip package.json เพื่อบันทึกกด Ctrl + s และออกกด Ctrl + q สำหรับตัวอย่างนี้ ฉันจะใช้โค้ดที่พัฒนาโดยหนึ่งในนักพัฒนาหลักของ NodeOS ฉันไม่ได้ใช้งานจริง ๆ ด้วยตัวเอง รหัสต้นฉบับสำหรับตัวอย่างของเราสามารถพบได้ในที่เก็บ Git node-bin-man

กลับไปที่การสร้างแอปพลิเคชัน NodeOS แรกของเรา เช่นเดียวกับทุกแอปพลิเคชัน Node.js (หรือแพ็คเกจ NPM) เราเริ่มต้นด้วยการสร้างไฟล์ package.json ดังในตัวอย่างต่อไปนี้:

 { "name": "bin-man", "version": "0.0.1", "description": "Format and display manual pages", "bin": { "man": "man.js" }, "repository": "https://github.com/groundwater/node-bin-man", "author": "groundwater", "license": "MIT", "dependencies": { "blessed": "~0.0.22" } }

name พารามิเตอร์ version author ที่ repository license และคำอธิบายสามารถ description ได้ด้วยตนเอง คอลเลกชัน bin เป็นอ็อบเจ็กต์คีย์/ค่า JSON ที่มีชื่อคำสั่งและไฟล์ JavaScript ที่เกี่ยวข้อง ในตัวอย่างของเรา คำสั่ง man เชื่อมโยงกับไฟล์ man.js คอลเลกชัน การ dependencies มีรายการแพ็คเกจ NPM ที่จำเป็นสำหรับการใช้แอปพลิเคชันนี้ ในตัวอย่างของเรา ผู้เขียนโค้ดได้รวม Blessed ซึ่งเป็นไลบรารีที่เหมือนคำสาปซึ่งมี API อินเทอร์เฟซเทอร์มินัลระดับสูงสำหรับ Node.js

ตอนนี้ ไปที่ส่วนหลัก รหัสจริง

 #!/usr/bin/env node

ส่วนนี้เรียกว่า "shebang" NodeOS ไม่จำเป็นจริงๆ แต่จะบอกระบบปฏิบัติการว่าต้องรันโค้ดต่อไปนี้อย่างไร ในกรณีของเรา มันบอกล่ามว่าทุกอย่างจำเป็นต้องดำเนินการด้วยคำสั่ง /usr/bin/env node

 var fs = require('fs'); var blessed = require('blessed');

เช่นเดียวกับใน Node.js ฟังก์ชัน require() จะโหลดแพ็กเกจที่เลือกลงในหน่วยความจำและบันทึกลงในตัวแปรที่ระบุ

 var arg = process.argv[2] || 'bin-man';

พฤติกรรมมาตรฐานของคำสั่ง man คือการบอกคู่มือเกี่ยวกับตัวมันเอง หากไม่มีการระบุคำสั่งอื่น ตัวอย่างโค้ดของเราก็ทำเช่นเดียวกัน: หากไม่มีการระบุอาร์กิวเมนต์สำหรับพารามิเตอร์ตัวที่สอง (ตัวแรกคือตัวแมนเอง) ค่าดีฟอลต์จะเป็น bin-man

 var path = process.env.HOME + "/lib/node_modules/" + arg + "/README.md"; try{ var readme = fs.readFileSync(path, 'utf-8'); }catch(e){ console.log('No README.md for Package ',arg); process.exit(-1); }

ณ จุดนี้ โปรแกรมจะตรวจสอบว่ามีไฟล์ readme สำหรับแอปพลิเคชันที่กำหนดหรือไม่ ใน NodeOS พาธการติดตั้งของทุกแอปพลิเคชันคือโฮมไดเร็กทอรี (หรือ / ) ตามด้วยไดเร็กทอรี lib/node_modules หากมีไฟล์ README.md อยู่ ไฟล์จะบันทึกเนื้อหาภายในตัวแปร readme มิฉะนั้น จะแสดงข้อผิดพลาดและออกจากกระบวนการ

 // Create a screen object. var screen = blessed.screen(); var box = blessed.box({ content: readme, alwaysScroll:true, scrollable: true, }); // Append our box to the screen. screen.append(box);

Blessed มี API ที่เรียบง่ายจริงๆ การแสดงเนื้อหาของไฟล์นั้นง่ายพอๆ กับการบอกให้สร้าง box และโหลดเนื้อหา

 screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });

ตอนนี้ มาสร้างวิธีการออกจากแอปพลิเคชัน man เรารวมคีย์ escape , q หรือ Cc สไตล์ emacs เพื่อออกจากกระบวนการ

 screen.key(['space','f','j','n'], function(ch, key) { box.scroll(box.height); screen.render(); }); screen.key(['down'], function(ch, key) { box.scroll(1); screen.render(); }); screen.key(['up'], function(ch, key) { box.scroll(-1); screen.render(); }); screen.key(['b','k','p'], function(ch, key) { box.scroll(-box.height); screen.render(); });

เราใช้ปุ่มทิศทางเพื่อเลื่อนขึ้นหรือลงหนึ่งแถวและปุ่ม space , f , j หรือ n เพื่อเลื่อนหน้าลง (มากที่สุดเท่าที่มีบนหน้าจอ) ใช้ b , k หรือ p เพื่อย้อนกลับ

 box.focus(); screen.render();

สุดท้าย เราบอกให้แอปพลิเคชันโฟกัสที่ box ที่เราสร้างขึ้นและแสดงผลทั้งหมด ให้ใส่ไฟล์เหล่านั้นในไดเร็กทอรี /lib/node_modules/bin-man และเพิ่ม README.md แบบง่าย ๆ ดังนี้:

 # Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```

แอปพลิเคชันแบบกำหนดเองตัวแรกสำหรับ NodeOS เกือบเสร็จแล้ว เหลือเพียงก้าวเล็กๆ เพียงหนึ่งก้าวสุดท้าย เราจำเป็นต้องสร้างไฟล์กำหนดค่าเนื่องจากเป็นข้อกำหนดสำหรับแอปพลิเคชัน NodeOS ง่ายพอๆ กับการสร้างไฟล์ในพาธ /etc/bin-man/config.json ด้วยเนื้อหาต่อไปนี้: {} ซึ่งเป็นอ็อบเจ็กต์ JSON ว่าง ตอนนี้ เราสามารถลองใช้แอปพลิเคชันใหม่ของเราได้แล้ว นักวิ่งใน man เชลล์ควรแสดงไฟล์ readme ที่เราสร้างไว้ก่อนหน้านี้

บทสรุป

ดังที่คุณเห็นในตัวอย่างโค้ดอย่างง่ายของเรา การปรับใช้ทุกอย่างใน NodeOS นั้นเป็นเรื่องง่าย คุณเพียงแค่ต้องรู้ Node.js

NodeOS มีศักยภาพมากมาย และฉันคิดว่ามันอาจกลายเป็นระบบปฏิบัติการที่ยอดเยี่ยมได้เมื่อมีการใช้คุณสมบัติเพิ่มเติม มันยังต้องการการทำงานอยู่ แต่เนื่องจากความนิยมของระบบนิเวศบน Node.js ทั้งหมด ฉันจะไม่แปลกใจเลยที่มันจะกลายเป็นระบบปฏิบัติการที่ได้รับความนิยมอย่างรวดเร็วอย่างรวดเร็ว คุณคิดอย่างไรเกี่ยวกับเรื่องนี้? แจ้งให้เราทราบในความคิดเห็น