initial commit
This commit is contained in:
148
README.md
148
README.md
@@ -6,38 +6,38 @@ NanoKVM
|
||||

|
||||
|
||||
<h3>
|
||||
<a href="https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html">🚀 Quick Start</a>
|
||||
<a href="https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html">🚀 빠른 시작</a>
|
||||
|
|
||||
<a href="https://cn.dl.sipeed.com/shareURL/KVM/nanoKVM">🛠️ Hardware Details</a>
|
||||
<a href="https://cn.dl.sipeed.com/shareURL/KVM/nanoKVM">🛠️ 하드웨어 정보</a>
|
||||
|
|
||||
<a href="https://github.com/sipeed/NanoKVM/releases/latest">💾 Firmware Releases</a>
|
||||
<a href="https://github.com/sipeed/NanoKVM/releases/latest">💾 펌웨어 릴리즈</a>
|
||||
</h3>
|
||||
|
||||
English | [中文](./README_ZH.md) | [日本語](./README_JA.md) | [한국어](./README_KO.md)
|
||||
[English](./README.md) | [中文](./README_ZH.md) | [日本語](./README_JA.md) | 한국어
|
||||
|
||||
</div>
|
||||
|
||||
## 🌟 What is NanoKVM?
|
||||
## 🌟 NanoKVM이 무엇인가요?
|
||||
|
||||
NanoKVM is a series of compact, open-source IP-KVM devices. Built upon the LicheeRV Nano (RISC-V), NanoKVM allows you to remotely access and control computers as if you were sitting right in front of them – perfect for managing servers, embedded systems, or any headless machine.
|
||||
NanoKVM은 소형 오픈 소스 IP-KVM 장치 시리즈입니다. LicheeRV Nano(RISC-V)를 기반으로 구축된 NanoKVM을 사용하면 마치 컴퓨터 앞에 바로 앉아있는 것처럼 원격으로 컴퓨터에 접근하고 제어할 수 있어 서버, 임베디드 시스템 또는 모든 헤드리스 머신을 관리하는 데 완벽합니다.
|
||||
|
||||
## 📦 Product Family
|
||||
## 📦 제품군
|
||||
|
||||
We offer several NanoKVM versions to suit your needs:
|
||||
다양한 요구를 충족할 수 있도록 여러 NanoKVM 버전을 제공합니다:
|
||||
|
||||
* **NanoKVM-Cube Lite:** A barebones kit for DIY enthusiasts and enterprise users needing bulk deployment.
|
||||
* **NanoKVM-Cube Full:** A complete package with a sleek case, accessories, and a pre-flashed system SD card. Ready to use out-of-the-box, ideal for individual users.
|
||||
* **NanoKVM-PCIe:** A unique form factor with a PCIe bracket for internal chassis mounting, drawing power directly from a PCIe slot. And add optional WiFi and PoE functions.
|
||||
* **NanoKVM-Cube Lite:** DIY 사용자 및 대량 배포가 필요한 기업용을 위한 최소 구성 키트입니다.
|
||||
* **NanoKVM-Cube Full:** 세련된 케이스, 액세서리, 사전 플래시된 시스템 SD 카드가 포함된 완전 구성 패키지입니다. 개봉 후 즉시 사용할 수 있어 개인 사용자에게 적합합니다.
|
||||
* **NanoKVM-PCIe:** 독특한 폼팩터로, PCIe 브래킷을 통해 섀시 내부에 장착하며, 전원인 PCIe 슬롯에서 직접 공급받습니다. 선택적으로 WiFi와 PoE 기능을 추가할 수 있습니다.
|
||||
|
||||
### 🚀 NanoKVM-Pro: The 4K Powerhouse
|
||||
### 🚀 NanoKVM-Pro: 4K를 위한 파워 머신
|
||||
|
||||
Based on popular demand, we've upgraded NanoKVM to the **NanoKVM-Pro**:
|
||||
대중적인 수요를 기반으로, NanoKVM을 **NanoKVM-Pro**로 업그레이드했습니다:
|
||||
|
||||
* **Resolution Upgrade:** From 1080P to stunning **4K@30fps / 2K@60fps**.
|
||||
* **Network Upgrade:** Blazing fast **GbE + PoE + WiFi 6** (up from 100M Ethernet).
|
||||
* **Latency Upgrade:** Encoder accelerated latency reduced from 100-150ms to **50-100ms**.
|
||||
* **해상도 업그레이드:** 1080P에서 놀라운 **4K@30fps / 2K@60fps**까지.
|
||||
* **네트워크 업그레이드:** 초고속 **GbE + PoE + WiFi 6** (100M 이더넷 대비 향상).
|
||||
* **지연 시간 업그레이드:** 인코더 가속 지연시간이 100-150ms에서 **50-100ms**로 감소.
|
||||
|
||||
> The NanoKVM-Pro is now available for pre-sale! [Click here for product details](https://sipeed.com/nanokvm/pro).
|
||||
> NanoKVM-Pro가 예약 판매 중입니다! [제품 세부 정보는 여기를 클릭하세요](https://sipeed.com/nanokvm/pro).
|
||||
|
||||
<div align="center">
|
||||
|
||||
@@ -45,95 +45,95 @@ Based on popular demand, we've upgraded NanoKVM to the **NanoKVM-Pro**:
|
||||
|
||||
</div>
|
||||
|
||||
## 🛠️ Technical Specifications
|
||||
## 🛠️ 기술 사양
|
||||
|
||||
| Product | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM |
|
||||
| 제품 | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM |
|
||||
|------------------- |-------------------------------------- |---------------------------------- |----------------------------------- |------------------------------------ |
|
||||
| Core | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G |
|
||||
| Memory & Storage | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC |
|
||||
| System | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM |
|
||||
| Resolution | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps |
|
||||
| HDMI Loopout | 4K loopout | x | x | x |
|
||||
| Video Encoding | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 |
|
||||
| Audio Transmit | ✓ | x | ✓ | x |
|
||||
| 코어 | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G |
|
||||
| 메모리 & 저장 공간 | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC |
|
||||
| 시스템 | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM |
|
||||
| 해상도 | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps |
|
||||
| HDMI 루프아웃 | 4K 루프아웃 | x | x | x |
|
||||
| 영상 인코딩 | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 |
|
||||
| 오디오 전송 | ✓ | x | ✓ | x |
|
||||
| UEFI / BIOS | ✓ | ✓ | ✓ | ✓ |
|
||||
| Emulated USB Keyboard & Mouse | ✓ | ✓ | ✓ | ✓ |
|
||||
| Emulated USB ISO | ✓ | ✓ | ✓ | ✓ |
|
||||
| USB 키보드 & 마우스 에뮬레이션 | ✓ | ✓ | ✓ | ✓ |
|
||||
| USB ISO 에뮬레이션 | ✓ | ✓ | ✓ | ✓ |
|
||||
| IPMI | ✓ | ✓ | ✓ | x |
|
||||
| Wake-on-LAN | ✓ | ✓ | ✓ | ✓ |
|
||||
| Web Terminal | ✓ | ✓ | ✓ | ✓ |
|
||||
| Serial Terminal | 3 channels | 2 channels | x | 1 channel |
|
||||
| Custom Scripts | ✓ | ✓ | x | x |
|
||||
| Storage | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s |
|
||||
| Ethernet | 1000M | 100M | 1000M | 100M |
|
||||
| PoE | Optional | Optional | x | x |
|
||||
| WiFi | Optional WiFi6 | Optional WiFi6 | x | x |
|
||||
| ATX Power Control | ✓ | ✓ | Extra $15 | Extra $10 |
|
||||
| Display | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 |
|
||||
| More Features | Sync LED Strip / Smart Assistant | - | - | - |
|
||||
| Power Consumption | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V |
|
||||
| Power Input | USB-C or PoE | USB-C | USB-C | USB-C |
|
||||
| Dimensions | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm |
|
||||
| Price | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(with ATX) | $89 no ATX / $102 with ATX | $69 no ATX / $79 with ATX |
|
||||
| 웹 터미널 | ✓ | ✓ | ✓ | ✓ |
|
||||
| 시리얼 터미널 | 3 채널 | 2 채널 | x | 1 채널 |
|
||||
| 사용자 정의 스크립트 | ✓ | ✓ | x | x |
|
||||
| 저장 공간 | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s |
|
||||
| 이더넷 | 1000M | 100M | 1000M | 100M |
|
||||
| PoE | 옵션 | 옵션 | x | x |
|
||||
| WiFi | WiFi6 옵션 | WiFi6 옵션 | x | x |
|
||||
| ATX 전원 조작 | ✓ | ✓ | $15 추가 | $10 추가 |
|
||||
| 디스플레이 | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 |
|
||||
| 기타 기능 | LED 줄 동기화 / 스마트 어시스턴트 | - | - | - |
|
||||
| 전력 소비량 | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V |
|
||||
| 전원 입력 | USB-C 또는 PoE | USB-C | USB-C | USB-C |
|
||||
| 크기 | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm |
|
||||
| 가격 | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(with ATX) | ATX 미사용 시 $89 / ATX 사용 시 $102 | ATX 미사용 시 $69 / ATX 사용 시 $79 |
|
||||
|
||||
## 📂 Project Structure
|
||||
## 📂 프로젝트 구조
|
||||
|
||||
``` shell
|
||||
├── kvmapp # APP update package
|
||||
│ ├── jpg_stream # Compatible for direct updates from very old versions
|
||||
│ ├── kvm_new_app # Triggers necessary components for kvm_system update
|
||||
│ ├── kvm_system # kvm_system application
|
||||
│ ├── server # NanoKVM front-end and back-end applications
|
||||
│ └── system # Necessary system components
|
||||
├── web # NanoKVM front-end
|
||||
├── server # NanoKVM back-end
|
||||
├── support # Auxiliary functions (image subsystem, system status, system updates, screen, keys, etc.)
|
||||
├── kvmapp # APP 업데이트 패키지
|
||||
│ ├── jpg_stream # 매우 오래된 버전에서도 직접 업데이트 가능하도록 호환됨
|
||||
│ ├── kvm_new_app # kvm_system 업데이트에 필요한 구성 요소를 트리거함
|
||||
│ ├── kvm_system # kvm_system 애플리케이션
|
||||
│ ├── server # NanoKVM 프론트 엔드와 백엔드 애플리케이션
|
||||
│ └── system # 필요한 시스템 구성 요소
|
||||
├── web # NanoKVM 프론트엔드
|
||||
├── server # NanoKVM 백엔드
|
||||
├── support # 보조 기능 (이미지 하위 시스템, 시스템 상태, 시스템 업데이트, 화면, 키, 기타.)
|
||||
│ ├── sg2002 # NanoKVM-Lite/Full/PCIe
|
||||
│ └── h618 # NanoKVM-Pro
|
||||
├── ...
|
||||
```
|
||||
|
||||
## 🔩 Hardware Platform (NanoKVM Cube/PCIe)
|
||||
## 🔩 하드웨어 플랫폼 (NanoKVM Cube/PCIe)
|
||||
|
||||
NanoKVM is based on Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html),you can find specifications, schematics, and dimensional drawings [here](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano).
|
||||
NanoKVM은 Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)를 기반으로 하며,[여기](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)에서 사양, 도식, 치수, 도면은 여기에서 찾을 수 있습니다.
|
||||
|
||||
The NanoKVM Lite is constructed by the LicheeRV Nano and HDMItoCSI board, and the NanoKVM FULL adds the NanoKVM-A/B board and shell to the NanoKVM Lite. The HDMItoCSI board is used to convert the HDMI signal; NanoKVM-A, including OLED, ATX control output (USB Type-C interface), auxiliary power supply and ATX power on/off and reset buttons; The NanoKVM-B is connected to the plate at one end and the computer at the other end is connected to the computer ATX-Pin, which is used to remotely control the power of the computer.
|
||||
NanoKVM Lite는 LicheeRV Nano와 HDMItoCSI 보드로 구성되어 있으며, NanoKVM FULL은 NanoKVM Lite에 NasnoKVM-A/B 보드와 케이스를 추가한 구성입니다. HDMItoCSI 보드는 HDMI 신호를 변환하는 역할을 하고 NanoKVM-A는 OLED, ATX 전원 출력 (USB Type-C 인터페이스), 보조 전원 공급 장치, ATX 전원 켜기/끄기 및 리셋 버튼을 포함합니다. NanoKVM-B는 한쪽 끝이 컴퓨터와 연결되고 다른 한쪽 끝은 컴퓨터의 ATX 핀에 연결되어 컴퓨터의 전원을 원격으로 제어하는 데 사용됩니다.
|
||||
|
||||
The NanoKVM image is built on LicheeRV Nano SDK and MaixCDK, and is compatible with materials that use the LicheeRV Nano, opposite the KVM software cannot be used with the LicheeRV Nano or other SG2002 products. If you would like to build an HDMI input application on LicheeRV Nano or MaixCam, please contact us for technical support.
|
||||
NanoKVM 이미지는 LicheeRV Nano SDK와 MaixCDK로 구축되었으며, LicheeRV Nano를 사용하는 자재와 호환됩니다. 반면에 KVM 소프트웨어는 LicheeRV Nano나 다른 SG2002 제품과 함께 사용할 수 없습니다. 만약 LicheeRV Nano나 MaixCam에서 HDMI 입력 애플리케이션을 구축하고 싶으시다면, 기술 지원에 문의해 주세요.
|
||||
|
||||
Note: Out of the 256MB memory in SG2002, 158MB is currently allocated for the multimedia subsystem, which NanoKVM will use for video image acquisition and processing.
|
||||
참고: SG2002의 256MB 메모리 중에 158MB는 멀티미디어 하위 폴더에 할당되어 있으며, NanoKVM은 비디오 이미지 획득과 처리에 사용됩니다.
|
||||
|
||||
* [NanoKVM-A Schematic](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf)
|
||||
* [NanoKVM-B Schematic](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_B_30131.pdf)
|
||||
* [NanoKVM img](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM)
|
||||
* [NanoKVM-A 도식](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf)
|
||||
* [NanoKVM-B 도식](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_B_30131.pdf)
|
||||
* [NanoKVM 이미지](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM)
|
||||
|
||||

|
||||
|
||||
## 🤝 Contributing
|
||||
## 🤝 기여
|
||||
|
||||
We welcome contributions! Here's how you can help:
|
||||
여러분의 기여를 환영합니다! 도움을 줄 수 있는 방법은 다음과 같습니다:
|
||||
|
||||
1. Fork the repository.
|
||||
2. Create a feature branch.
|
||||
3. Commit your changes.
|
||||
4. Push to the branch.
|
||||
5. Open a Pull Request.
|
||||
1. 레포지토리를 포크하세요
|
||||
2. 기능 브랜치를 만드세요
|
||||
3. 변경한 것을 커밋하세요
|
||||
4. 브랜치로 푸시하세요
|
||||
5. 풀 리퀘스트를 생성하세요
|
||||
|
||||
Please keep your pull requests small and focused to facilitate easier review and merging.
|
||||
|
||||
> 🎁 **Contributors who submit high-quality Pull Requests may receive a NanoKVM Cube, PCIe, or Pro as a token of our appreciation!**
|
||||
> 🎁 **고품질 풀 리퀘스트를 제출한 기여자는 감사의 표시로 NanoKVM Cube, PCIe, 또는 Pro를 받을 수 있습니다!**
|
||||
|
||||
## 🛒 Where to Buy
|
||||
## 🛒 어디서 구매하나요?
|
||||
|
||||
* [Aliexpress(global except USA&Russia)](https://www.aliexpress.com/item/1005007369816019.html)
|
||||
* [Aliexpress(미국&러시아를 제외한 전 세계)](https://www.aliexpress.com/item/1005007369816019.html)
|
||||
* [淘宝](https://item.taobao.com/item.htm?id=811206560480)
|
||||
* [Preorder (any other country that not support in Aliexpress or Taobao)](https://sipeed.com/nanokvm)
|
||||
* [사전 주문 (Aliexpress나 Taobao를 지원하지 않는 국가)](https://sipeed.com/nanokvm)
|
||||
|
||||
## 💬 Community & Support
|
||||
## 💬 커뮤니티 & 지원
|
||||
|
||||
* [MaixHub Discussion](https://maixhub.com/discussion/nanokvm)
|
||||
* QQ group: 703230713
|
||||
|
||||
## 📜 License
|
||||
## 📜 라이센스
|
||||
|
||||
This project is licensed under the GPL-3.0 License - see the LICENSE file for details.
|
||||
이 프로젝트는 GPL-3.0 라이센스에 따라 라이센스가 부여됩니다. 자세한 사항은 LICENSE 파일을 참조하세요.
|
||||
|
||||
129
README_JA.md
129
README_JA.md
@@ -1,129 +0,0 @@
|
||||
NanoKVM
|
||||
======
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||
<h3>
|
||||
<a href="https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html"> クイックスタート </a>
|
||||
|
|
||||
<a href="https://cn.dl.sipeed.com/shareURL/KVM/nanoKVM"> ハードウェア </a>
|
||||
</h3>
|
||||
|
||||
[English](./README.md) | [中文](./README_ZH.md) | 日本語 | [한국어](./README_KO.md)
|
||||
|
||||
</div>
|
||||
|
||||
> NanoKVM は [RISC-V](https://en.wikipedia.org/wiki/RISC-V) を搭載しています!
|
||||
> 使用中に問題や提案がある場合は、ここで issue を提出するか、[MaixHub Discussion](https://maixhub.com/discussion/nanokvm) でお知らせください。
|
||||
|
||||
## オープンソース & コントリビューション
|
||||
|
||||
### 2025.02.19 更新
|
||||
|
||||
NanoKVM のすべてのコンポーネントはオープンソース化されており、[front-end](https://github.com/sipeed/NanoKVM/tree/main/web)、[back-end](https://github.com/sipeed/NanoKVM/tree/main/server)、[kvm_vision](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm)、[kvm_mmf](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm_mmf)、[kvm_system](https://github.com/sipeed/NanoKVM/tree/main/support)、[kvmapp update package](https://github.com/sipeed/NanoKVM-System/tree/main/kvmapp)、[system sdk](https://github.com/sipeed/LicheeRV-Nano-Build/tree/NanoKVM)、[packaging methods](https://github.com/sipeed/LicheeRV-Nano-Build/blob/NanoKVM/kvm/NanoKVM_img.sh)が含まれます。
|
||||
|
||||
### 2025.02.14 更新
|
||||
|
||||
最新のアプリケーションバージョン v2.1.6 には、多くのセキュリティ強化とバグ修正が追加されているため、一般のユーザーはこのバージョン以降へのアップグレードをお勧めします。
|
||||
|
||||
### 2025.02.05 更新
|
||||
|
||||
セキュリティを懸念しているユーザーは、この issue をお読みください: <https://github.com/sipeed/NanoKVM/issues/301>、セキュリティに関するすべての懸念事項について説明されています。
|
||||
GitHub は、オープンで透明性のあるプラットフォームとして、いわゆる「バックドア」の懸念事項を議論する場を提供しています。オープンソースであることにより、製品のセキュリティがさらに強化されます!
|
||||
|
||||
### 2024.10.18 更新
|
||||
|
||||
10/08にバックエンドコードをオープンソース化しました。すぐにPRを提出してくれたCivilに感謝します。最新のNanoKVM-PCIeを報酬として提供します!
|
||||
10月中旬のバッチはテストとパッケージングを開始しており、10/01以前のほとんどの注文は次週と次々週に出荷されます。
|
||||
10/01以降、アリエクスプレスの出荷日は12月に変更されました。これは保守的な納期です。10月の注文は11/15〜12/15の間に発送される予定です。
|
||||
|
||||
## 紹介
|
||||
|
||||
Lichee NanoKVMは、LicheeRV NanoをベースにしたIP-KVM製品で、LicheeRV Nanoの極小サイズと強力な機能を継承しています。
|
||||
Lichee NanoKVMは2つのバージョンがあります:
|
||||
NanoKVM Liteは基本構成で、一定のDIY能力を持つ個人ユーザーや大量のニーズを持つ企業ユーザーに適しています。
|
||||
NanoKVM Fullは完全版で、洗練されたケースと完全なアクセサリーを備え、起動時にすぐに使用できるシステムミラーカードが内蔵されており、個人ユーザーに推奨されます。
|
||||
|
||||

|
||||
|
||||
## 技術仕様
|
||||
|
||||
| 製品 | NanoKVM (Lite) | NanoKVM (Full) | PiKVM V4 |
|
||||
|----------------------- |-------------------------------------- |---------------------------------- |----------------------------------- |
|
||||
| 計算ユニット | LicheeRV Nano(RISCV) | LicheeRV Nano(RISCV) | CM4 (ARM) |
|
||||
| 解像度 | 1080P @ 60fps | 1080P @ 60fps | 1080P @ 60fps |
|
||||
| ビデオエンコーディング | MJPEG, H264 | MJPEG, H264 | MJPEG, H264 |
|
||||
| ビデオ遅延 | 90~230ms | 90~230ms | 100~230ms |
|
||||
| UEFI/BIOS | ✓ | ✓ | ✓ |
|
||||
| 仮想HID | ✓ | ✓ | ✓ |
|
||||
| 仮想CD-ROM | ✓ | ✓ | ✓ |
|
||||
| IPMI | ✓ | ✓ | ✓ |
|
||||
| Wake-on-LAN | ✓ | ✓ | ✓ |
|
||||
| ETH | 100M/10M | 100M/10M | 1000M/100M/10M |
|
||||
| ATX電源制御 | なし、ユーザーが自分で接続 | USBインターフェースIO制御ボード | RJ-45インターフェースIO制御ボード |
|
||||
| OLED | なし、ユーザーが自分で接続 | 128x64 0.96" 白 | 128x32 0.91" 白 |
|
||||
| UART | 2 | 2 | 1 |
|
||||
| TFカード | なし | ✓ | ✓ |
|
||||
| 拡張 | なし | PoE | WiFi/LTE |
|
||||
| 消費電力 | 0.2A@5V | 0.2A@5V | ピーク時 2.6A@5V |
|
||||
| 電源入力 | PC USBで給電可能 | PC USBまたは補助電源 | DC 5V 3A電源が必要 |
|
||||
| 冷却 | 静音ファンレス | 静音ファンレス | ファン冷却 |
|
||||
| サイズ | 23x37x15mm ~1/30 PiKVM V4サイズ | 40x36x36mm ~1/7 PiKVM V4サイズ | 120x68x44mm |
|
||||
|
||||

|
||||
|
||||
## NanoKVM ハードウェアプラットフォーム
|
||||
|
||||
NanoKVMはSipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)に基づいており、仕様、回路図、寸法図は[こちら](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)で確認できます。
|
||||
|
||||
NanoKVM LiteはLicheeRV NanoとHDMItoCSIボードで構成され、NanoKVM FULLはNanoKVM LiteにNanoKVM-A/Bボードとシェルを追加しています。HDMItoCSIボードはHDMI信号を変換するために使用されます。NanoKVM-AにはOLED、ATX制御出力(USB Type-Cインターフェース)、補助電源供給およびATX電源オン/オフおよびリセットボタンが含まれています。NanoKVM-Bは一端がAボードに接続され、他端がコンピュータのATXピンに接続され、コンピュータの電源をリモートで制御します。
|
||||
|
||||
NanoKVMイメージはLicheeRV Nano SDKおよびMaixCDKに基づいて構築されており、LicheeRV Nanoを使用する資料と互換性があります。逆に、KVMソフトウェアはLicheeRV Nanoや他のSG2002製品では使用できません。LicheeRV NanoやMaixCamでHDMI入力アプリケーションを構築したい場合は、技術サポートを受けるためにお問い合わせください。
|
||||
|
||||
注:SG2002の256MBメモリのうち、現在158MBがマルチメディアサブシステムに割り当てられており、NanoKVMはビデオ画像の取得と処理にこのメモリを使用します。
|
||||
|
||||
+ [NanoKVM-A 回路図](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf)
|
||||
+ [NanoKVM-B 回路図](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_HDMI_MIPI_31011.pdf)
|
||||
+ [NanoKVM イメージダウンロード](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM)
|
||||
|
||||
## ロードマップ
|
||||
|
||||
### Q1 2025
|
||||
|
||||
**改善:**
|
||||
|
||||
- [x] HDMI モジュールをリファクタリングし、libmaixcam_lib.so の依存関係を削除
|
||||
- [x] SSH をデフォルトで無効にし、Web UI に有効/無効の切り替えを追加
|
||||
- [x] Tailscale をデフォルトで無効にし、Web UI に有効/無効の切り替えを追加
|
||||
- [x] 設定ファイルに JWT 設定オプションを追加
|
||||
- [x] bcrypt を利用したパスワードストレージのセキュリティ保護
|
||||
|
||||
**配布:**
|
||||
|
||||
- [x] GitHub 経由でのアプリケーション配布
|
||||
- [x] オンラインでの更新の際に整合性チェックを実施
|
||||
- [ ] オフラインでの更新をサポート
|
||||
|
||||
**バグ修正:**
|
||||
|
||||
- [x] DNS の問題を修正
|
||||
- [x] CSRF の脆弱性を修正
|
||||
|
||||
**機能**
|
||||
|
||||
- [ ] [79](https://github.com/sipeed/NanoKVM/issues/79) Zerotier をサポート
|
||||
- [ ] [99](https://github.com/sipeed/NanoKVM/issues/99) WireGuard をサポート
|
||||
- [ ] [249](https://github.com/sipeed/NanoKVM/issues/249) Mouse Jiggler を追加
|
||||
|
||||
## 購入方法
|
||||
|
||||
* [Aliexpress(グローバル、米国とロシアを除く)](https://www.aliexpress.com/item/1005007369816019.html)
|
||||
* [淘宝](https://item.taobao.com/item.htm?id=811206560480)
|
||||
* [予約注文 (淘宝とアリエクスプレスがサポートされていない国)](https://sipeed.com/nanokvm)
|
||||
|
||||
## コミュニティ
|
||||
|
||||
* [MaixHub Discussion](https://maixhub.com/discussion/nanokvm)
|
||||
* QQグループ: 703230713
|
||||
139
README_KO.md
139
README_KO.md
@@ -1,139 +0,0 @@
|
||||
NanoKVM
|
||||
======
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||
<h3>
|
||||
<a href="https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html">🚀 빠른 시작</a>
|
||||
|
|
||||
<a href="https://cn.dl.sipeed.com/shareURL/KVM/nanoKVM">🛠️ 하드웨어 정보</a>
|
||||
|
|
||||
<a href="https://github.com/sipeed/NanoKVM/releases/latest">💾 펌웨어 릴리즈</a>
|
||||
</h3>
|
||||
|
||||
[English](./README.md) | [中文](./README_ZH.md) | [日本語](./README_JA.md) | 한국어
|
||||
|
||||
</div>
|
||||
|
||||
## 🌟 NanoKVM이 무엇인가요?
|
||||
|
||||
NanoKVM은 소형 오픈 소스 IP-KVM 장치 시리즈입니다. LicheeRV Nano(RISC-V)를 기반으로 구축된 NanoKVM을 사용하면 마치 컴퓨터 앞에 바로 앉아있는 것처럼 원격으로 컴퓨터에 접근하고 제어할 수 있어 서버, 임베디드 시스템 또는 모든 헤드리스 머신을 관리하는 데 완벽합니다.
|
||||
|
||||
## 📦 제품군
|
||||
|
||||
다양한 요구를 충족할 수 있도록 여러 NanoKVM 버전을 제공합니다:
|
||||
|
||||
* **NanoKVM-Cube Lite:** DIY 사용자 및 대량 배포가 필요한 기업용을 위한 최소 구성 키트입니다.
|
||||
* **NanoKVM-Cube Full:** 세련된 케이스, 액세서리, 사전 플래시된 시스템 SD 카드가 포함된 완전 구성 패키지입니다. 개봉 후 즉시 사용할 수 있어 개인 사용자에게 적합합니다.
|
||||
* **NanoKVM-PCIe:** 독특한 폼팩터로, PCIe 브래킷을 통해 섀시 내부에 장착하며, 전원인 PCIe 슬롯에서 직접 공급받습니다. 선택적으로 WiFi와 PoE 기능을 추가할 수 있습니다.
|
||||
|
||||
### 🚀 NanoKVM-Pro: 4K를 위한 파워 머신
|
||||
|
||||
대중적인 수요를 기반으로, NanoKVM을 **NanoKVM-Pro**로 업그레이드했습니다:
|
||||
|
||||
* **해상도 업그레이드:** 1080P에서 놀라운 **4K@30fps / 2K@60fps**까지.
|
||||
* **네트워크 업그레이드:** 초고속 **GbE + PoE + WiFi 6** (100M 이더넷 대비 향상).
|
||||
* **지연 시간 업그레이드:** 인코더 가속 지연시간이 100-150ms에서 **50-100ms**로 감소.
|
||||
|
||||
> NanoKVM-Pro가 예약 판매 중입니다! [제품 세부 정보는 여기를 클릭하세요](https://sipeed.com/nanokvm/pro).
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||
</div>
|
||||
|
||||
## 🛠️ 기술 사양
|
||||
|
||||
| 제품 | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM |
|
||||
|------------------- |-------------------------------------- |---------------------------------- |----------------------------------- |------------------------------------ |
|
||||
| 코어 | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G |
|
||||
| 메모리 & 저장 공간 | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC |
|
||||
| 시스템 | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM |
|
||||
| 해상도 | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps |
|
||||
| HDMI 루프아웃 | 4K 루프아웃 | x | x | x |
|
||||
| 영상 인코딩 | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 |
|
||||
| 오디오 전송 | ✓ | x | ✓ | x |
|
||||
| UEFI / BIOS | ✓ | ✓ | ✓ | ✓ |
|
||||
| USB 키보드 & 마우스 에뮬레이션 | ✓ | ✓ | ✓ | ✓ |
|
||||
| USB ISO 에뮬레이션 | ✓ | ✓ | ✓ | ✓ |
|
||||
| IPMI | ✓ | ✓ | ✓ | x |
|
||||
| Wake-on-LAN | ✓ | ✓ | ✓ | ✓ |
|
||||
| 웹 터미널 | ✓ | ✓ | ✓ | ✓ |
|
||||
| 시리얼 터미널 | 3 채널 | 2 채널 | x | 1 채널 |
|
||||
| 사용자 정의 스크립트 | ✓ | ✓ | x | x |
|
||||
| 저장 공간 | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s |
|
||||
| 이더넷 | 1000M | 100M | 1000M | 100M |
|
||||
| PoE | 옵션 | 옵션 | x | x |
|
||||
| WiFi | WiFi6 옵션 | WiFi6 옵션 | x | x |
|
||||
| ATX 전원 조작 | ✓ | ✓ | $15 추가 | $10 추가 |
|
||||
| 디스플레이 | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 |
|
||||
| 기타 기능 | LED 줄 동기화 / 스마트 어시스턴트 | - | - | - |
|
||||
| 전력 소비량 | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V |
|
||||
| 전원 입력 | USB-C 또는 PoE | USB-C | USB-C | USB-C |
|
||||
| 크기 | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm |
|
||||
| 가격 | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(with ATX) | ATX 미사용 시 $89 / ATX 사용 시 $102 | ATX 미사용 시 $69 / ATX 사용 시 $79 |
|
||||
|
||||
## 📂 프로젝트 구조
|
||||
|
||||
``` shell
|
||||
├── kvmapp # APP 업데이트 패키지
|
||||
│ ├── jpg_stream # 매우 오래된 버전에서도 직접 업데이트 가능하도록 호환됨
|
||||
│ ├── kvm_new_app # kvm_system 업데이트에 필요한 구성 요소를 트리거함
|
||||
│ ├── kvm_system # kvm_system 애플리케이션
|
||||
│ ├── server # NanoKVM 프론트 엔드와 백엔드 애플리케이션
|
||||
│ └── system # 필요한 시스템 구성 요소
|
||||
├── web # NanoKVM 프론트엔드
|
||||
├── server # NanoKVM 백엔드
|
||||
├── support # 보조 기능 (이미지 하위 시스템, 시스템 상태, 시스템 업데이트, 화면, 키, 기타.)
|
||||
│ ├── sg2002 # NanoKVM-Lite/Full/PCIe
|
||||
│ └── h618 # NanoKVM-Pro
|
||||
├── ...
|
||||
```
|
||||
|
||||
## 🔩 하드웨어 플랫폼 (NanoKVM Cube/PCIe)
|
||||
|
||||
NanoKVM은 Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)를 기반으로 하며,[여기](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)에서 사양, 도식, 치수, 도면은 여기에서 찾을 수 있습니다.
|
||||
|
||||
NanoKVM Lite는 LicheeRV Nano와 HDMItoCSI 보드로 구성되어 있으며, NanoKVM FULL은 NanoKVM Lite에 NasnoKVM-A/B 보드와 케이스를 추가한 구성입니다. HDMItoCSI 보드는 HDMI 신호를 변환하는 역할을 하고 NanoKVM-A는 OLED, ATX 전원 출력 (USB Type-C 인터페이스), 보조 전원 공급 장치, ATX 전원 켜기/끄기 및 리셋 버튼을 포함합니다. NanoKVM-B는 한쪽 끝이 컴퓨터와 연결되고 다른 한쪽 끝은 컴퓨터의 ATX 핀에 연결되어 컴퓨터의 전원을 원격으로 제어하는 데 사용됩니다.
|
||||
|
||||
NanoKVM 이미지는 LicheeRV Nano SDK와 MaixCDK로 구축되었으며, LicheeRV Nano를 사용하는 자재와 호환됩니다. 반면에 KVM 소프트웨어는 LicheeRV Nano나 다른 SG2002 제품과 함께 사용할 수 없습니다. 만약 LicheeRV Nano나 MaixCam에서 HDMI 입력 애플리케이션을 구축하고 싶으시다면, 기술 지원에 문의해 주세요.
|
||||
|
||||
참고: SG2002의 256MB 메모리 중에 158MB는 멀티미디어 하위 폴더에 할당되어 있으며, NanoKVM은 비디오 이미지 획득과 처리에 사용됩니다.
|
||||
|
||||
* [NanoKVM-A 도식](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf)
|
||||
* [NanoKVM-B 도식](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_B_30131.pdf)
|
||||
* [NanoKVM 이미지](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM)
|
||||
|
||||

|
||||
|
||||
## 🤝 기여
|
||||
|
||||
여러분의 기여를 환영합니다! 도움을 줄 수 있는 방법은 다음과 같습니다:
|
||||
|
||||
1. 레포지토리를 포크하세요
|
||||
2. 기능 브랜치를 만드세요
|
||||
3. 변경한 것을 커밋하세요
|
||||
4. 브랜치로 푸시하세요
|
||||
5. 풀 리퀘스트를 생성하세요
|
||||
|
||||
Please keep your pull requests small and focused to facilitate easier review and merging.
|
||||
|
||||
> 🎁 **고품질 풀 리퀘스트를 제출한 기여자는 감사의 표시로 NanoKVM Cube, PCIe, 또는 Pro를 받을 수 있습니다!**
|
||||
|
||||
## 🛒 어디서 구매하나요?
|
||||
|
||||
* [Aliexpress(미국&러시아를 제외한 전 세계)](https://www.aliexpress.com/item/1005007369816019.html)
|
||||
* [淘宝](https://item.taobao.com/item.htm?id=811206560480)
|
||||
* [사전 주문 (Aliexpress나 Taobao를 지원하지 않는 국가)](https://sipeed.com/nanokvm)
|
||||
|
||||
## 💬 커뮤니티 & 지원
|
||||
|
||||
* [MaixHub Discussion](https://maixhub.com/discussion/nanokvm)
|
||||
* QQ group: 703230713
|
||||
|
||||
## 📜 라이센스
|
||||
|
||||
이 프로젝트는 GPL-3.0 라이센스에 따라 라이센스가 부여됩니다. 자세한 사항은 LICENSE 파일을 참조하세요.
|
||||
139
README_ZH.md
139
README_ZH.md
@@ -1,139 +0,0 @@
|
||||
NanoKVM
|
||||
======
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||
<h3>
|
||||
<a href="https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html">🚀 快速开始</a>
|
||||
|
|
||||
<a href="https://cn.dl.sipeed.com/shareURL/KVM/nanoKVM">🛠️ 硬件信息</a>
|
||||
|
|
||||
<a href="https://github.com/sipeed/NanoKVM/releases/latest">💾 固件发布</a>
|
||||
</h3>
|
||||
|
||||
[English](./README.md) | 中文 | [日本語](./README_JA.md) | [한국어](./README_KO.md)
|
||||
|
||||
</div>
|
||||
|
||||
## 🌟 NanoKVM 是什么?
|
||||
|
||||
NanoKVM 是一系列紧凑型开源 IP-KVM 设备。NanoKVM 基于 LicheeRV Nano (RISC-V) 构建,让您能够身临其境般的远程访问和控制计算机,是管理服务器、嵌入式系统或任何无头设备的理想之选。
|
||||
|
||||
## 📦 产品系列
|
||||
|
||||
我们提供多种 NanoKVM 版本以满足您的需求:
|
||||
|
||||
* **NanoKVM-Cube Lite**:为 DIY 爱好者和需要批量部署的企业用户提供的准系统套件。
|
||||
* **NanoKVM-Cube Full**:包含外壳、配件以及预装系统 SD 卡的完整套装。开箱即用,非常适合个人用户。
|
||||
* **NanoKVM-PCIe**:独特的外形设计,配备 PCIe 支架,可安装在机箱内部,并直接从 PCIe 插槽供电。可选配 WiFi 和 PoE 功能。
|
||||
|
||||
### 🚀 NanoKVM-Pro
|
||||
|
||||
根据大众的需求,我们将 NanoKVM 升级到了 **NanoKVM-Pro**:
|
||||
|
||||
* **分辨率升级**:从 1080P 升级到 **4K@30fps / 2K@60fps**。
|
||||
* **网络升级**:从百兆网口升级到超快的 **GbE + WiFi 6**。
|
||||
* **延迟升级**:编码器加速延迟从 100-150 毫秒减少到 **50-100 毫秒**。
|
||||
|
||||
> NanoKVM-Pro 现已开启预售。
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||
</div>
|
||||
|
||||
## 🛠️ 技术规格
|
||||
|
||||
| 产品 | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM |
|
||||
|------------------- |-------------------------------------- |---------------------------------- |----------------------------------- |------------------------------------ |
|
||||
| 核心 | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G |
|
||||
| 内存&存储 | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC |
|
||||
| 系统 | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM |
|
||||
| 分辨率 | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps |
|
||||
| HDMI 环出 | 4K 环出 | x | x | x |
|
||||
| 视频编码 | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 |
|
||||
| 音频输出 | ✓ | x | ✓ | x |
|
||||
| UEFI / BIOS | ✓ | ✓ | ✓ | ✓ |
|
||||
| 模拟 USB 键鼠 | ✓ | ✓ | ✓ | ✓ |
|
||||
| 模拟 USB ISO | ✓ | ✓ | ✓ | ✓ |
|
||||
| IPMI | ✓ | ✓ | ✓ | x |
|
||||
| 局域网唤醒 | ✓ | ✓ | ✓ | ✓ |
|
||||
| 网页终端 | ✓ | ✓ | ✓ | ✓ |
|
||||
| 串口终端 | 3 channels | 2 channels | x | 1 channel |
|
||||
| 用户脚本 | ✓ | ✓ | x | x |
|
||||
| 存储 | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s |
|
||||
| 网口 | 1000M | 100M | 1000M | 100M |
|
||||
| PoE | 可选 | 可选 | x | x |
|
||||
| WiFi | 可选 WiFi6 | 可选 WiFi6 | x | x |
|
||||
| ATX 电源控制 | ✓ | ✓ | ✓ | ✓ |
|
||||
| 显示屏 | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 |
|
||||
| 特色功能 | LED 同步灯带 / 智能助手 | - | - | - |
|
||||
| 功耗 | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V |
|
||||
| 电源输入 | USB-C or PoE | USB-C | USB-C | USB-C |
|
||||
| 尺寸 | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm |
|
||||
| 价格 | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(带ATX) | $89 无ATX / $102 带ATX | $69 无ATX / $79 带ATX |
|
||||
|
||||
## 📂 项目结构
|
||||
|
||||
``` shell
|
||||
├── kvmapp # APP更新包
|
||||
│ ├── jpg_stream # 兼容从非常老的版本中直接更新
|
||||
│ ├── kvm_new_app # 触发 kvm_system 更新必要组件
|
||||
│ ├── kvm_system # kvm_system 应用
|
||||
│ ├── server # NanoKVM 前后端应用
|
||||
│ └── system # 必要系统组件
|
||||
├── server # NanoKVM 后端
|
||||
├── support # 辅助功能(图像子系统、系统状态、系统更新、屏幕、按键……)
|
||||
│ ├── sg2002 # NanoKVM-Lite/Full/PCIe
|
||||
│ └── h618 # NanoKVM-Pro
|
||||
├── web # NanoKVM 前端
|
||||
├── LICENSE
|
||||
├── README_JA.md
|
||||
├── README.md
|
||||
├── README_ZH.md
|
||||
└── CHANGELOG.md
|
||||
```
|
||||
|
||||
## 🔩 硬件平台(NanoKVM Cube/PCIe)
|
||||
|
||||
NanoKVM 基于 Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html) 核心板搭建,这部分硬件的规格书、原理图、尺寸图等均可在这里找到:[点击这里](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)
|
||||
|
||||
NanoKVM Lite 由 LicheeRV Nano E 和 HDMItoCSI 小板构成,NanoKVM FULL 在 NanoKVM Lite 基础上增加 NanoKVM-A/B 板和外壳。HDMItoCSI板用于转换HDMI信号;NanoKVM-A 包含 OLED、ATX控制输出(TypeC接口形式)、辅助供电(TypeC接口)以及ATX开关机、复位按键;NanoKVM-B 一端连接A板,一端连接电脑ATX针脚,用于电脑的远程开关机。
|
||||
|
||||
NanoKVM 镜像在LicheeRV Nano SDK 和 MaixCDK 基础上构建,可以兼容使用 LicheeRV Nano 的资料,反之LicheeRV Nano 或其他 SG2002 产品无法使用KVM软件。如果您想在 LicheeRV Nano 或 MaixCam 上构建 HDMI输入相关应用,请与我们联系,以获得技术支持。
|
||||
|
||||
注: SG2002的256MB内存中, 目前划分105MB用于多媒体子系统, NanoKVM会在视频图像采集和处理中使用这部分内存.
|
||||
|
||||
* [NanoKVM-A 原理图](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf)
|
||||
* [NanoKVM-B 原理图](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_HDMI_MIPI_31011.pdf)
|
||||
* [NanoKVM 镜像下载](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM)
|
||||
|
||||

|
||||
|
||||
## 🤝 贡献代码
|
||||
|
||||
我们十分欢迎任何人来贡献代码!您可以通过以下方式提供帮助:
|
||||
|
||||
1. Fork 本仓库.
|
||||
2. 创建一个分支.
|
||||
3. 提交你的代码.
|
||||
4. 推送代码到分支.
|
||||
5. 创建一个PR.
|
||||
|
||||
请保持你的 PR 尽量简单且集中,以便于更轻松地审查和合并。
|
||||
|
||||
> 🎁 **提交高质量 PR 的贡献者可能会收到 NanoKVM Cube、PCIe 或 Pro 作为感谢礼物!**
|
||||
|
||||
## 🛒 购买渠道
|
||||
|
||||
* [Aliexpress(全球,除了美国和俄罗斯)](https://www.aliexpress.com/item/1005007369816019.html)
|
||||
* [淘宝](https://item.taobao.com/item.htm?id=811206560480)
|
||||
* [Preorder (其它不支持淘宝和速卖通的国家)](https://sipeed.com/nanokvm)
|
||||
|
||||
## 💬 社区
|
||||
|
||||
* [MaixHub Discussion](https://maixhub.com/discussion/nanokvm)
|
||||
* QQ group: 703230713
|
||||
@@ -3,6 +3,7 @@ package proto
|
||||
type GetVersionRsp struct {
|
||||
Current string `json:"current"`
|
||||
Latest string `json:"latest"`
|
||||
UpdateUrl string `json:"update_url"`
|
||||
}
|
||||
|
||||
type GetPreviewRsp struct {
|
||||
|
||||
@@ -13,6 +13,8 @@ func applicationRouter(r *gin.Engine) {
|
||||
|
||||
api.GET("/application/version", service.GetVersion) // get application version
|
||||
api.POST("/application/update", service.Update) // update application
|
||||
api.POST("/application/update/server", service.UpdateServer)
|
||||
api.POST("/application/update/web", service.UpdateWeb)
|
||||
|
||||
api.GET("/application/preview", service.GetPreview) // get preview updates state
|
||||
api.POST("/application/preview", service.SetPreview) // set preview updates state
|
||||
|
||||
161
server/service/application/manual_update.go
Normal file
161
server/service/application/manual_update.go
Normal file
@@ -0,0 +1,161 @@
|
||||
package application
|
||||
|
||||
import (
|
||||
"NanoKVM-Server/proto"
|
||||
"NanoKVM-Server/utils"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func (s *Service) UpdateServer(c *gin.Context) {
|
||||
var rsp proto.Response
|
||||
|
||||
file, err := c.FormFile("file")
|
||||
if err != nil {
|
||||
rsp.ErrRsp(c, -1, "invalid file")
|
||||
return
|
||||
}
|
||||
|
||||
// Get executable path
|
||||
execPath, err := os.Executable()
|
||||
if err != nil {
|
||||
rsp.ErrRsp(c, -2, "get executable path failed")
|
||||
return
|
||||
}
|
||||
execDir := filepath.Dir(execPath)
|
||||
|
||||
// Save to temp file in SAME directory to ensure atomic rename
|
||||
tmpPath := filepath.Join(execDir, "NanoKVM-Server.new")
|
||||
if err := c.SaveUploadedFile(file, tmpPath); err != nil {
|
||||
rsp.ErrRsp(c, -3, "save file failed")
|
||||
return
|
||||
}
|
||||
|
||||
// Verify file size
|
||||
info, err := os.Stat(tmpPath)
|
||||
if err != nil || info.Size() == 0 {
|
||||
_ = os.Remove(tmpPath)
|
||||
rsp.ErrRsp(c, -4, "invalid file size")
|
||||
return
|
||||
}
|
||||
|
||||
// Verify it's executable
|
||||
if err := os.Chmod(tmpPath, 0755); err != nil {
|
||||
_ = os.Remove(tmpPath)
|
||||
rsp.ErrRsp(c, -5, "chmod failed")
|
||||
return
|
||||
}
|
||||
|
||||
// Backup current binary
|
||||
backupPath := execPath + ".bak"
|
||||
// Try to remove old backup first
|
||||
_ = os.Remove(backupPath)
|
||||
|
||||
if err := os.Rename(execPath, backupPath); err != nil {
|
||||
// If rename fails (e.g. running binary locked?), try copy
|
||||
if err := utils.CopyFile(execPath, backupPath); err != nil {
|
||||
log.Warnf("backup failed: %v", err)
|
||||
// Proceed with caution or fail?
|
||||
// If we can't backup, maybe we shouldn't proceed.
|
||||
// But for embedded systems, sometimes we just overwrite.
|
||||
}
|
||||
}
|
||||
|
||||
// Replace binary
|
||||
if err := os.Rename(tmpPath, execPath); err != nil {
|
||||
// Attempt rollback
|
||||
_ = os.Rename(backupPath, execPath)
|
||||
rsp.ErrRsp(c, -6, "replace binary failed")
|
||||
return
|
||||
}
|
||||
|
||||
rsp.OkRsp(c)
|
||||
|
||||
// Restart service in background
|
||||
go func() {
|
||||
time.Sleep(1 * time.Second)
|
||||
_ = exec.Command("sh", "-c", "/etc/init.d/S95nanokvm restart").Run()
|
||||
}()
|
||||
}
|
||||
|
||||
func (s *Service) UpdateWeb(c *gin.Context) {
|
||||
var rsp proto.Response
|
||||
|
||||
file, err := c.FormFile("file")
|
||||
if err != nil {
|
||||
rsp.ErrRsp(c, -1, "invalid file")
|
||||
return
|
||||
}
|
||||
|
||||
// Get executable path
|
||||
execPath, err := os.Executable()
|
||||
if err != nil {
|
||||
rsp.ErrRsp(c, -2, "get executable path failed")
|
||||
return
|
||||
}
|
||||
execDir := filepath.Dir(execPath)
|
||||
|
||||
// Save to temp file in SAME directory
|
||||
tmpPath := filepath.Join(execDir, "web.tar.gz.new")
|
||||
if err := c.SaveUploadedFile(file, tmpPath); err != nil {
|
||||
rsp.ErrRsp(c, -3, "save file failed")
|
||||
return
|
||||
}
|
||||
|
||||
// Verify file size
|
||||
info, err := os.Stat(tmpPath)
|
||||
if err != nil || info.Size() == 0 {
|
||||
_ = os.Remove(tmpPath)
|
||||
rsp.ErrRsp(c, -4, "invalid file size")
|
||||
return
|
||||
}
|
||||
|
||||
// Define web directory
|
||||
webDir := filepath.Join(execDir, "web")
|
||||
|
||||
// Extract to temp dir first
|
||||
extractDir := filepath.Join(execDir, "web_extract_tmp")
|
||||
os.RemoveAll(extractDir)
|
||||
os.MkdirAll(extractDir, 0755)
|
||||
|
||||
if _, err := utils.UnTarGz(tmpPath, extractDir); err != nil {
|
||||
os.RemoveAll(extractDir)
|
||||
_ = os.Remove(tmpPath)
|
||||
rsp.ErrRsp(c, -5, "extract failed")
|
||||
return
|
||||
}
|
||||
|
||||
// Check if there is a single directory inside extractDir (e.g. 'dist')
|
||||
entries, _ := os.ReadDir(extractDir)
|
||||
sourceDir := extractDir
|
||||
if len(entries) == 1 && entries[0].IsDir() {
|
||||
sourceDir = filepath.Join(extractDir, entries[0].Name())
|
||||
}
|
||||
|
||||
// Backup old web dir
|
||||
backupWebDir := filepath.Join(execDir, "web.bak")
|
||||
os.RemoveAll(backupWebDir)
|
||||
_ = os.Rename(webDir, backupWebDir)
|
||||
|
||||
// Move new web dir
|
||||
if err := os.Rename(sourceDir, webDir); err != nil {
|
||||
// Rollback
|
||||
_ = os.Rename(backupWebDir, webDir)
|
||||
os.RemoveAll(extractDir)
|
||||
_ = os.Remove(tmpPath)
|
||||
rsp.ErrRsp(c, -6, "replace web dir failed")
|
||||
return
|
||||
}
|
||||
|
||||
// Cleanup
|
||||
os.RemoveAll(extractDir)
|
||||
os.RemoveAll(backupWebDir)
|
||||
_ = os.Remove(tmpPath)
|
||||
|
||||
rsp.OkRsp(c)
|
||||
}
|
||||
@@ -26,7 +26,7 @@ func (s *Service) GetVersion(c *gin.Context) {
|
||||
var rsp proto.Response
|
||||
|
||||
// current version
|
||||
currentVersion := "1.0.0"
|
||||
currentVersion := "2.3.0.b1"
|
||||
|
||||
versionFile := fmt.Sprintf("%s/version", AppDir)
|
||||
if version, err := os.ReadFile(versionFile); err == nil {
|
||||
@@ -45,6 +45,7 @@ func (s *Service) GetVersion(c *gin.Context) {
|
||||
rsp.OkRspWithData(c, &proto.GetVersionRsp{
|
||||
Current: currentVersion,
|
||||
Latest: latest.Version,
|
||||
UpdateUrl: StableURL,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ func (c *Cli) Stop() error {
|
||||
}
|
||||
|
||||
func (c *Cli) Up() error {
|
||||
command := "tailscale up --accept-dns=false"
|
||||
command := "tailscale up --accept-dns=false --login-server=https://headscale.tindevil.com --hostname=batchuKVM"
|
||||
return exec.Command("sh", "-c", command).Run()
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ func (c *Cli) Status() (*TsStatus, error) {
|
||||
}
|
||||
|
||||
func (c *Cli) Login() (string, error) {
|
||||
command := "tailscale login --accept-dns=false --timeout=10m"
|
||||
command := "tailscale login --accept-dns=false --timeout=10m --login-server=https://headscale.tindevil.com --hostname=batchuKVM"
|
||||
cmd := exec.Command("sh", "-c", command)
|
||||
|
||||
stderr, err := cmd.StderrPipe()
|
||||
|
||||
39
server/utils/copy_file.go
Normal file
39
server/utils/copy_file.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
func CopyFile(src, dst string) error {
|
||||
sourceFileStat, err := os.Stat(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !sourceFileStat.Mode().IsRegular() {
|
||||
return os.ErrInvalid
|
||||
}
|
||||
|
||||
source, err := os.Open(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
_ = source.Close()
|
||||
}()
|
||||
|
||||
destination, err := os.Create(dst)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
_ = destination.Close()
|
||||
}()
|
||||
|
||||
if _, err := io.Copy(destination, source); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return os.Chmod(dst, sourceFileStat.Mode())
|
||||
}
|
||||
@@ -27,3 +27,31 @@ export function getPreviewUpdates() {
|
||||
return http.get('/api/application/preview');
|
||||
}
|
||||
|
||||
// update server binary
|
||||
export function updateServer(file: File) {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
return http.request({
|
||||
method: 'post',
|
||||
url: '/api/application/update/server',
|
||||
data: formData,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// update web resources
|
||||
export function updateWeb(file: File) {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
return http.request({
|
||||
method: 'post',
|
||||
url: '/api/application/update/web',
|
||||
data: formData,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { LoadingOutlined, RocketOutlined, SmileOutlined } from '@ant-design/icons';
|
||||
import { Button, Divider, Result, Spin } from 'antd';
|
||||
import { useState } from 'react';
|
||||
import { LoadingOutlined, RocketOutlined, SmileOutlined, UploadOutlined } from '@ant-design/icons';
|
||||
import { Button, Divider, Result, Spin, Upload, message } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import semver from 'semver';
|
||||
|
||||
@@ -20,11 +20,13 @@ export const Update = ({ setIsLocked }: UpdateProps) => {
|
||||
const [status, setStatus] = useState<Status>('');
|
||||
const [currentVersion, setCurrentVersion] = useState('');
|
||||
const [latestVersion, setLatestVersion] = useState('');
|
||||
const [updateUrl, setUpdateUrl] = useState('');
|
||||
const [errMsg, setErrMsg] = useState('');
|
||||
|
||||
useEffect(() => {
|
||||
checkForUpdates();
|
||||
}, []);
|
||||
// Auto-check disabled
|
||||
// useEffect(() => {
|
||||
// checkForUpdates();
|
||||
// }, []);
|
||||
|
||||
function checkForUpdates() {
|
||||
if (status === 'loading') return;
|
||||
@@ -41,6 +43,7 @@ export const Update = ({ setIsLocked }: UpdateProps) => {
|
||||
|
||||
setCurrentVersion(rsp.data.current);
|
||||
setLatestVersion(rsp.data.latest);
|
||||
setUpdateUrl(rsp.data.update_url);
|
||||
|
||||
const isLatest = semver.gte(rsp.data.current, rsp.data.latest);
|
||||
setStatus(isLatest ? 'latest' : 'outdated');
|
||||
@@ -75,6 +78,52 @@ export const Update = ({ setIsLocked }: UpdateProps) => {
|
||||
});
|
||||
}
|
||||
|
||||
const handleServerUpload = (file: File) => {
|
||||
setIsLocked(true);
|
||||
message.loading('Uploading server binary...', 0);
|
||||
api.updateServer(file).then((rsp: any) => {
|
||||
message.destroy();
|
||||
if (rsp.code === 0) {
|
||||
message.success('Server updated successfully. Restarting...');
|
||||
setTimeout(() => {
|
||||
setIsLocked(false);
|
||||
window.location.reload();
|
||||
}, 5000);
|
||||
} else {
|
||||
message.error('Server update failed: ' + rsp.msg);
|
||||
setIsLocked(false);
|
||||
}
|
||||
}).catch(() => {
|
||||
message.destroy();
|
||||
message.error('Server update failed');
|
||||
setIsLocked(false);
|
||||
});
|
||||
return false;
|
||||
};
|
||||
|
||||
const handleWebUpload = (file: File) => {
|
||||
setIsLocked(true);
|
||||
message.loading('Uploading web resources...', 0);
|
||||
api.updateWeb(file).then((rsp: any) => {
|
||||
message.destroy();
|
||||
if (rsp.code === 0) {
|
||||
message.success('Web resources updated successfully. Reloading...');
|
||||
setTimeout(() => {
|
||||
setIsLocked(false);
|
||||
window.location.reload();
|
||||
}, 2000);
|
||||
} else {
|
||||
message.error('Web update failed: ' + rsp.msg);
|
||||
setIsLocked(false);
|
||||
}
|
||||
}).catch(() => {
|
||||
message.destroy();
|
||||
message.error('Web update failed');
|
||||
setIsLocked(false);
|
||||
});
|
||||
return false;
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="text-base font-bold">{t('settings.update.title')}</div>
|
||||
@@ -82,9 +131,23 @@ export const Update = ({ setIsLocked }: UpdateProps) => {
|
||||
|
||||
<Preview />
|
||||
|
||||
<div className="my-[40px] h-px bg-neutral-500/10" />
|
||||
<div className="my-[20px] h-px bg-neutral-500/10" />
|
||||
|
||||
{updateUrl && (
|
||||
<div className="mb-4 text-xs text-gray-500">
|
||||
Update Server: {updateUrl}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="flex min-h-[400px] flex-col justify-between">
|
||||
{status === '' && (
|
||||
<div className="flex justify-center pt-24">
|
||||
<Button type="primary" onClick={checkForUpdates}>
|
||||
Check for Updates
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{status === 'loading' && (
|
||||
<div className="flex justify-center pt-24">
|
||||
<Spin indicator={<LoadingOutlined spin />} size="large" />
|
||||
@@ -126,9 +189,21 @@ export const Update = ({ setIsLocked }: UpdateProps) => {
|
||||
/>
|
||||
)}
|
||||
|
||||
{status === 'failed' && <Result subTitle={errMsg} />}
|
||||
{status === 'failed' && <Result subTitle={errMsg} extra={[<Button onClick={() => setStatus('')}>Retry</Button>]} />}
|
||||
|
||||
<div className="flex justify-center">
|
||||
<div className="mt-8">
|
||||
<Divider orientation="left">Manual Update</Divider>
|
||||
<div className="flex space-x-4 justify-center">
|
||||
<Upload beforeUpload={handleServerUpload} showUploadList={false}>
|
||||
<Button icon={<UploadOutlined />}>Upload Server (Binary)</Button>
|
||||
</Upload>
|
||||
<Upload beforeUpload={handleWebUpload} showUploadList={false}>
|
||||
<Button icon={<UploadOutlined />}>Upload Web (tar.gz)</Button>
|
||||
</Upload>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex justify-center mt-8">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
|
||||
Reference in New Issue
Block a user