NodeOS: JavaScript 기반 운영 체제
게시 됨: 2022-03-11나는 대부분의 프로그래머가 Node.js에 대해 들어봤을 것이라고 확신하지만 NodeOS는 어떻습니까? 예, Node.js로 작성된 운영 체제인 NodeOS입니다. 글쎄, 일종의. NodeOS는 예를 들어 하드웨어 상호 작용과 같은 대부분의 성능에 중요한 작업에 Linux 커널을 사용하지만 다른 모든 작업에는 Node.js를 사용합니다. NodeOS 개발은 2년 전에 시작되었으며 단순하지만 흥미로운 아이디어를 공유한 사람들에 의해 만들어졌습니다. "Node.js만 사용하여 운영 체제를 만드는 것이 가능합니까?"
무슨 일이야?
우선, Node.js가 짧은 시간 동안 발전해 왔는지 생각해 보십시오. 이제 운영 체제에서 동일한 일이 발생한다고 생각해 보십시오. 그런 다음 여기에 멋진 항목을 추가해 보겠습니다.
사용자별 독립적이고 격리된 루트 파일 시스템
NodeOS는 흥미로운 패러다임을 도입했습니다. 모든 사용자가 격리된 파일 시스템을 갖고 있다면 작업할 수 있는 간단한 파일 시스템 계층을 제공합니다. "홈 폴더"는 실제로 자체 파일 시스템 계층 구조의 루트이므로 특별한 권한 없이 패키지를 전역으로 설치할 수 있으며 기본적으로 홈 디렉토리에 설치되기 때문에 아무 것도 구성할 필요가 없습니다. 또한 상당한 보안을 제공합니다. 해커가 운영 체제의 특정 계정에 침입하는 방법을 찾은 경우 액세스할 수 있는 유일한 파티션은 해당 사용자의 파티션입니다. 최종 결과는 해커가 전체 시스템을 손상시킬 수 없다는 것입니다.
Node.js와 NPM
생각해보면 Node.js를 사용하는 운영 체제는 NPM에서 사용할 수 있는 모든 패키지가 동시에 NodeOS 패키지이기도 하다는 의미입니다. 작성 당시 210,735개의 패키지가 있습니다. NPM 패키지의 수가 매분 증가하기 때문에 몇 년 안에 NodeOS에 백만 개의 애플리케이션이 있는 것이 이상하지 않을 것입니다.
Linux 커널을 기반으로 합니다.
별 것 아닌 것처럼 보일 수도 있지만 Linux는 가장 많이 사용되는 서버 운영 체제입니다. NodeOS는 Linux 커널을 기반으로 하기 때문에 최소한의 변경으로 다른 Linux 배포판용으로 작성된 모든 애플리케이션을 실행할 수 있습니다.
단점
완성된 NodeOS를 원하는 만큼 아직 없습니다. 서버 운영 체제를 위한 많은 핵심 기능이 아직 빠져 있습니다. 예를 들어, ps, tail, nano 및 grep을 포함한 전체 BASH 도구 세트가 없습니다. 또한 GUI가 없기 때문에 데스크톱 운영 체제로 실행할 수 없습니다. 물론, 약간의 JavaScript를 사용하여 누락된 기능 중 일부를 상당히 쉽게 구현할 수 있지만 언급된 모든 기능을 기본적으로 사용할 수 없다는 사실은 좋지 않습니다.
그렇다면 NodeOS를 어떻게 시험해 볼 수 있습니까?
도커 사용
NodeOS를 시도하는 가장 쉽고 빠른 방법은 다음을 사용하는 것입니다.
- Mac OSX 또는 Linux가 설치된 컴퓨터. Windows에서 작동할 수 있지만 시도하지 않았습니다.
- 도커.
Docker를 설치하면 NodeOS 인스턴스를 실행하는 것이 쉽습니다. 다음 명령을 실행하기만 하면 Docker가 모든 마법을 수행합니다.
sudo docker run -t -i nodeos/nodeos
앞서 언급한 명령어를 실행하면 Docker는 자동으로 저장소에서 NodeOS용 디스크 이미지를 다운로드하고 가상 머신 내부에 NodeOS 설치를 수행합니다. 설치가 완료되면 NodeOS 셸에 대한 SSH 세션이 열립니다.
도커 없이
Docker 사용을 피하려는 몇 가지 이유가 있으며 그 중 하나는 최신 NodeOS 버전입니다. 작성 당시 NodeOS의 Docker 이미지에 대한 마지막 변경은 2개월 전에 수행되었으며 개발 버전은 6일 전에 업데이트되었습니다. 따라서 최신 버전을 사용하려면 반드시 소스 코드를 받아야 합니다. 그다지 어렵지는 않지만 시간이 오래 걸립니다. 필요할 것이예요:
- Linux가 설치된 컴퓨터. OS X에서 컴파일할 수 있지만 크로스 컴파일을 해야 하기 때문에 시간이 더 오래 걸립니다. Windows도 마찬가지입니다.
- Linux 빌드 유틸리티(make, g++, gcc, autoconf).
- 케무.
- 시간. 진심으로, 많이.
모든 것이 준비되면 소스 코드 컴파일을 진행할 수 있습니다.
- 프로젝트 소스 코드 다운로드:
bash git clone [email protected]:NodeOS/NodeOS.git
. - 다음 명령을 실행하여 컴파일하십시오:
cd NodeOS
및npm install
. - 공식 문서를 한 단어씩 인용하겠습니다. “전자레인지 팝콘을 고르고 영화를 보러 가십시오. 아니, 진짜로 해.” . 예, 시간이 많이 걸리므로 그 동안 재미있는 일을 하십시오.
-
bash npm start
를 실행하여 Qemu 내에서 NodeOS를 실행합니다.
작동 되나요?
설치가 완료되면 NodeOS 셸 내에서 ls
명령을 실행하여 작동하는지 확인할 수 있습니다. 다음과 같은 출력이 표시되어야 합니다.
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
그렇다면 몇 가지 기본 명령이 작동 중임을 의미합니다. 그러나 네트워크 카드의 IP 주소를 표시하려면 어떻게 해야 할까요? Linux에는 ifconfig
라는 명령이 있습니다. 해 보자:
command not found: ifconfig
ifconfig
명령이 누락된 것 같습니다. NodeOS에는 기본 ifconfig
명령이 없기 때문입니다. 이제 뭐? 음, 간단합니다. NodeOS에는 Node의 NPM을 기반으로 하고 사용하기 쉬운 npkg
라는 통합 패키지 관리자( apt
또는 yum
과 같은)가 있습니다. 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
를 성공적으로 설치했습니다.
작동 중입니다. 그러나 이제 OS로 무엇을 합니까?
Ubuntu 또는 다른 Linux 배포판에서 수행할 수 있는 것과 동일한 작업(또는 더 적은 작업)을 수행할 수 있다면 Node.js로 작성된 운영 체제가 무슨 의미가 있습니까? 음, 요점은 모든 것이 Node.js만 사용하여 개발된다는 것입니다. 또한 Node.js만 사용하여 애플리케이션을 개발할 수 있음을 의미합니다. 예를 들어 NodeOS에는 Linux에서 다른 명령의 매뉴얼 페이지를 표시하는 데 사용되는 man
명령에 대한 기본 구현이 없습니다. 두려워하지 마십시오. 구현하는 것은 쉽습니다. 어떻게, 당신이 묻는 것을 들었습니까? 단순한.

먼저 npm install -g [email protected]
명령을 실행하여 파일을 만들고 편집할 수 있도록 Hipster라는 텍스트 편집기를 설치하겠습니다. 이 파일 편집기는 간단하고 확실히 다른 어떤 편집기로도 사용할 수 없지만 이 경우에는 충분합니다. Hipster로 파일을 만드는 것은 정말 간단합니다. hip package.json
과 같이 hip hip filename
을 실행하기만 하면 됩니다. 저장하려면 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
컬렉션은 명령 이름과 연결된 JavaScript 파일을 포함하는 JSON 키/값 개체입니다. 이 예에서 man
명령은 man.js
파일과 연결되어 있습니다. 컬렉션 dependencies
에는 이 애플리케이션을 사용하는 데 필요한 NPM 패키지 목록이 포함되어 있습니다. 이 예에서 코드 작성자는 Node.js용 고급 터미널 인터페이스 API가 있는 저주와 유사한 라이브러리인 Blessed를 포함했습니다.
이제 주요 부분인 실제 코드로 이동합니다.
#!/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
명령의 표준 동작은 다른 명령이 지정되지 않은 경우 매뉴얼에 자체적으로 알려주는 것입니다. 우리의 코드 예제는 동일한 작업을 수행합니다. 두 번째 매개변수(첫 번째 매개변수는 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에는 정말 간단한 API가 있습니다. 파일의 내용을 표시하는 것은 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 객체 콘텐츠로 파일을 생성하는 것만 큼 간단합니다. 이제 새로운 애플리케이션을 사용해 볼 수 있습니다. NodeOS 셸 내에서 man
을 실행하면 이전에 만든 readme 파일이 표시되어야 합니다.
결론
간단한 코드 예제에서 볼 수 있듯이 NodeOS에서 무엇이든 구현하는 것은 쉬운 작업이며 Node.js만 알면 됩니다.
NodeOS는 많은 잠재력을 가지고 있으며, 추가 기능이 구현되면 훌륭한 운영 체제가 될 수 있다고 생각합니다. 아직 작업이 필요하지만 Node.js 기반 생태계 전체의 인기에 따라 빠르게 대중적인 운영 체제가 되더라도 놀라지 않을 것입니다. 당신이 그것에 대해 어떻게 생각하십니까? 댓글로 알려주세요.