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
قد لا تبدو هذه مشكلة كبيرة ، لكن Linux هو نظام تشغيل الخادم الأكثر استخدامًا. نظرًا لأن NodeOS يعتمد على Linux kernel ، يمكنك تشغيل كل تطبيق مكتوب لتوزيعات Linux الأخرى بأقل قدر من التغييرات.
السلبيات
بقدر ما أرغب في NodeOS مكتمل ، فهو ليس موجودًا بعد. لا يزال يفتقد العديد من الوظائف الأساسية لنظام تشغيل الخادم. على سبيل المثال ، مجموعة أدوات BASH بأكملها مفقودة ، بما في ذلك ps و tail و nano و grep. علاوة على ذلك ، لا يمكنك تشغيله كنظام تشغيل سطح مكتب لأنه لا يحتوي على واجهة مستخدم رسومية. بالتأكيد ، يمكنك تنفيذ بعض الميزات المفقودة بسهولة إلى حد ما باستخدام القليل من 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 قبل شهرين ، بينما تم تحديث نسخة التطوير قبل ستة أيام. لذلك ، إذا كنت ترغب في استخدام أحدث إصدار ، يجب عليك بالتأكيد الحصول على الكود المصدري. هذا ليس صعبًا للغاية ، لكنه يستغرق وقتًا طويلاً. سوف تحتاج:
- كمبيوتر يعمل بنظام Linux. يمكنك تجميعها على OS X ، ولكن الأمر سيستغرق وقتًا أطول نظرًا لأنه يتعين عليها إجراء تجميع متقاطع. الشيء نفسه ينطبق على Windows.
- أدوات إنشاء Linux (make، g ++، gcc، autoconf).
- Qemu.
- زمن. على محمل الجد ، كثيرا.
بمجرد حصولك على كل شيء ، يمكنك المتابعة مع تجميع الكود المصدري:
- قم بتنزيل كود مصدر المشروع:
bash git clone [email protected]:NodeOS/NodeOS.git
. - قم بتجميعها عن طريق تشغيل الأوامر التالية:
cd NodeOS
وnpm install
. - سأقتبس ، كلمة بكلمة ، الوثائق الرسمية: "اختر بعض الفشار الميكروويف واذهب لمشاهدة فيلم. لا ، حقًا ، افعلها ". . نعم ، سيستغرق الأمر الكثير من الوقت ، لذا افعل شيئًا مثيرًا للاهتمام في هذه الأثناء.
- ابدأ تشغيل
bash npm start
لتشغيل NodeOS داخل Qemu.
إنه يعمل؟
بمجرد اكتمال التثبيت ، يمكننا التحقق مما إذا كان يعمل عن طريق تنفيذ الأمر ls
داخل NodeOS shell. يجب أن يظهر مثل هذا الإخراج:
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
إذا حدث ذلك ، فهذا يعني أن بعض الأوامر الأساسية تعمل. ولكن ، ماذا لو أردنا عرض عنوان IP الخاص ببطاقة الشبكة؟ في نظام Linux ، هناك أمر يسمى ifconfig
يفعل ذلك بالضبط ؛ دعونا نحاول ذلك:
command not found: ifconfig
يبدو أن الأمر ifconfig
مفقود. وذلك لأن NodeOS لا يحتوي على أمر ifconfig
افتراضي. ماذا الآن؟ حسنًا ، الأمر بسيط ؛ NodeOS لديه مدير حزم متكامل (مثل apt
أو yum
) ، يسمى npkg
، والذي يعتمد على Node's NPM وهو سهل الاستخدام. يعد تثبيت 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 الرئيسيين ، ولم أقم بتطبيقه بالفعل بنفسي. يمكن العثور على الكود الأصلي لمثالنا في مستودع node-bin-man Git.
دعنا نعود إلى إنشاء أول تطبيق 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
هذا الجزء يسمى "شيبانج". إنه ليس مطلوبًا بالفعل من قبل 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); }
في هذه المرحلة ، يتحقق البرنامج مما إذا كان الملف التمهيدي موجودًا للتطبيق المحدد. في 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 على واجهة برمجة تطبيقات بسيطة حقًا ؛ يعد عرض محتوى الملف أمرًا سهلاً مثل إخباره بإنشاء box
وتحميل المحتوى.
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
الآن ، لنقم بإنشاء طريقة للخروج من تطبيق man
. نقوم بدمج مفاتيح escape
، q
أو تركيبة نمط emacs Cc
للخروج من العملية.
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
يعمل داخل غلاف NodeOS الملف التمهيدي الذي أنشأناه سابقًا.
خاتمة
كما ترى من خلال مثال الكود البسيط الخاص بنا ، فإن تنفيذ أي شيء في NodeOS يعد مهمة سهلة ، ما عليك سوى معرفة Node.js.
يتمتع NodeOS بالكثير من الإمكانات ، وأعتقد أنه يمكن أن يصبح نظام تشغيل رائعًا بمجرد تنفيذ ميزات إضافية. لا يزال يحتاج إلى العمل ، ولكن نتيجة لشعبية النظام البيئي القائم على Node.js بأكمله ، لن أتفاجأ إذا أصبح سريعًا نظام تشغيل شائعًا. ما رأيك في ذلك؟ اسمحوا لي أن نعرف في التعليقات.