NodeOS: ระบบปฏิบัติการที่ใช้ JavaScript
เผยแพร่แล้ว: 2022-03-11ฉันแน่ใจว่าโปรแกรมเมอร์ส่วนใหญ่เคยได้ยิน Node.js แล้ว แต่ NodeOS ล่ะ? ใช่ NodeOS ซึ่งเป็นระบบปฏิบัติการที่เขียนด้วย Node.js ชนิดของ NodeOS ใช้เคอร์เนล Linux สำหรับสิ่งที่สำคัญที่สุดด้านประสิทธิภาพ เช่น การโต้ตอบกับฮาร์ดแวร์ แต่สำหรับอย่างอื่นจะใช้ Node.js การพัฒนา NodeOS เริ่มต้นเมื่อสองปีที่แล้วและสร้างขึ้นโดยผู้คนที่แบ่งปันแนวคิดที่เรียบง่าย แต่น่าสนใจ: "เป็นไปได้ไหมที่จะสร้างระบบปฏิบัติการโดยใช้ 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 คือการใช้สิ่งต่อไปนี้:
- คอมพิวเตอร์ที่มี Mac OSX หรือ Linux อาจใช้งานได้กับ Windows แต่ฉันไม่ได้ลอง
- นักเทียบท่า
เมื่อคุณติดตั้ง Docker แล้ว การเรียกใช้อินสแตนซ์ของ NodeOS นั้นเป็นเรื่องง่าย สิ่งที่คุณต้องทำคือรันคำสั่งต่อไปนี้ และ Docker ทำทุกอย่าง:
sudo docker run -t -i nodeos/nodeos
เมื่อคุณเรียกใช้คำสั่งดังกล่าว Docker จะดาวน์โหลดภาพดิสก์สำหรับ NodeOS จากที่เก็บโดยอัตโนมัติ และทำการติดตั้ง NodeOS ภายในเครื่องเสมือน เมื่อการติดตั้งเสร็จสิ้น จะเป็นการเปิดเซสชัน SSH ไปยัง NodeOS เชลล์
ไม่มีนักเทียบท่า
มีสาเหตุบางประการที่คุณไม่ต้องการใช้ Docker และสาเหตุหนึ่งคือ NodeOS เวอร์ชันล่าสุด ในขณะที่เขียน การเปลี่ยนแปลงครั้งล่าสุดในอิมเมจ Docker ของ NodeOS ได้ดำเนินการเมื่อสองเดือนที่แล้ว ในขณะที่เวอร์ชันการพัฒนาได้รับการอัปเดตเมื่อหกวันก่อน ดังนั้น หากคุณต้องการใช้เวอร์ชันล่าสุด คุณควรได้รับซอร์สโค้ดอย่างแน่นอน ไม่ยากเกินไปแต่ใช้เวลานาน คุณจะต้องการ:
- คอมพิวเตอร์ที่มีลินุกซ์ คุณสามารถคอมไพล์บน OS X ได้ แต่จะใช้เวลานานกว่านั้นเนื่องจากต้องทำการคอมไพล์แบบไขว้ เช่นเดียวกับ Windows
- ยูทิลิตีบิลด์ Linux (make, g++, gcc, autoconf)
- เคมู
- เวลา. อย่างจริงจังมาก
เมื่อคุณมีทุกอย่างแล้ว คุณสามารถดำเนินการรวบรวมซอร์สโค้ดได้:
- ดาวน์โหลดซอร์สโค้ดของโครงการ:
bash git clone [email protected]:NodeOS/NodeOS.git
- คอมไพล์โดยใช้คำสั่งต่อไปนี้:
cd NodeOS
และnpm install
- ฉันจะพูดทีละคำ เอกสารอย่างเป็นทางการ: “เลือกข้าวโพดคั่วไมโครเวฟแล้วไปดูหนัง ไม่ จริงๆ ทำมัน” . ใช่ มันจะใช้เวลามากขนาดนั้น ในระหว่างนี้ให้ทำอะไรที่น่าสนใจบ้าง
- รัน
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 เพื่อแสดงหน้าคู่มือของคำสั่งอื่น อย่ากลัวเลย การนำไปปฏิบัตินั้นง่าย ฉันได้ยินคุณถามอย่างไร เรียบง่าย.

ขั้นแรก ให้ติดตั้งโปรแกรมแก้ไขข้อความชื่อ 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 ทั้งหมด ฉันจะไม่แปลกใจเลยที่มันจะกลายเป็นระบบปฏิบัติการที่ได้รับความนิยมอย่างรวดเร็วอย่างรวดเร็ว คุณคิดอย่างไรเกี่ยวกับเรื่องนี้? แจ้งให้เราทราบในความคิดเห็น