pikvm/v2/index.html

3417 lines
80 KiB
HTML

<!DOCTYPE html><html lang="en" class="no-js"><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Getting started with PiKVM V2">
<meta name="author" content="Maxim Devaev">
<link rel="canonical" href="https://pikvm.github.io/pikvm/v2/">
<link rel="prev" href="../switch/">
<link rel="next" href="../v1/">
<link rel="icon" href="../_assets/favicon.ico">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.22">
<title>DIY PiKVM V2 quickstart guide - PiKVM Handbook</title>
<link rel="stylesheet" href="../assets/stylesheets/main.84d31ad4.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=arial,+sans-serif:300,300i,400,400i,700,700i%7Cmonospace:400,400i,700,700i&amp;display=fallback">
<style>:root{--md-text-font:"arial, sans-serif";--md-code-font:"monospace"}</style>
<link rel="stylesheet" href="../_assets/user.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<link href="../assets/stylesheets/glightbox.min.css" rel="stylesheet"><script src="../assets/javascripts/glightbox.min.js"></script><style id="glightbox-style">
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: white; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color); }
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color); }
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color); }
</style></head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#diy-pikvm-v2-quickstart-guide" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="PiKVM Handbook" class="md-header__button md-logo" aria-label="PiKVM Handbook" data-md-component="logo">
<img src="../_assets/logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"></path></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
PiKVM Handbook
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
DIY PiKVM V2 quickstart guide
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"></path></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"></path></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/pikvm/pikvm" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
</div>
<div class="md-source__repository">
pikvm/pikvm
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="PiKVM Handbook" class="md-nav__button md-logo" aria-label="PiKVM Handbook" data-md-component="logo">
<img src="../_assets/logo.png" alt="logo">
</a>
PiKVM Handbook
</label>
<div class="md-nav__source">
<a href="https://github.com/pikvm/pikvm" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
</div>
<div class="md-source__repository">
pikvm/pikvm
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_1" checked>
<label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="">
<span class="md-ellipsis">
Device guides
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_1">
<span class="md-nav__icon md-icon"></span>
Device guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../v4/" class="md-nav__link">
<span class="md-ellipsis">
PiKVM V4 Mini &amp; Plus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../v3/" class="md-nav__link">
<span class="md-ellipsis">
PiKVM V3
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../switch/" class="md-nav__link">
<span class="md-ellipsis">
PiKVM Switch
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
DIY PiKVM V2
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
DIY PiKVM V2
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#required-parts" class="md-nav__link">
<span class="md-ellipsis">
Required parts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#setting-up-the-hardware" class="md-nav__link">
<span class="md-ellipsis">
Setting up the hardware
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#wiring" class="md-nav__link">
<span class="md-ellipsis">
Wiring
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#power-up" class="md-nav__link">
<span class="md-ellipsis">
Power up
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configure-the-display" class="md-nav__link">
<span class="md-ellipsis">
Configure the display
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#access-pikvm" class="md-nav__link">
<span class="md-ellipsis">
Access PiKVM
</span>
</a>
<nav class="md-nav" aria-label="Access PiKVM">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#change-the-default-passwords" class="md-nav__link">
<span class="md-ellipsis">
Change the default passwords
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#access-the-remote-system" class="md-nav__link">
<span class="md-ellipsis">
Access the remote system
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#important-next-steps" class="md-nav__link">
<span class="md-ellipsis">
Important next steps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#further-recommendations" class="md-nav__link">
<span class="md-ellipsis">
Further recommendations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#known-issues-and-limitations" class="md-nav__link">
<span class="md-ellipsis">
Known issues and limitations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#basic-troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Basic troubleshooting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#getting-user-support" class="md-nav__link">
<span class="md-ellipsis">
Getting user support
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../v1/" class="md-nav__link">
<span class="md-ellipsis">
DIY PiKVM V1
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2">
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-ellipsis">
Getting started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Getting started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../cheatsheet/" class="md-nav__link">
<span class="md-ellipsis">
Cheat Sheet
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../webui/" class="md-nav__link">
<span class="md-ellipsis">
Web UI Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/" class="md-nav__link">
<span class="md-ellipsis">
Configuring PiKVM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../auth/" class="md-nav__link">
<span class="md-ellipsis">
Authentication &amp; 2FA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ &amp; Troubleshooting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flashing_os/" class="md-nav__link">
<span class="md-ellipsis">
Flashing OS
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3">
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
Networking
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Networking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_1">
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
<span class="md-ellipsis">
Internet access
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Internet access
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../port_forwarding/" class="md-nav__link">
<span class="md-ellipsis">
Port forwarding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../reverse_proxy/" class="md-nav__link">
<span class="md-ellipsis">
Reverse proxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tailscale/" class="md-nav__link">
<span class="md-ellipsis">
Tailscale VPN
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cloudflared/" class="md-nav__link">
<span class="md-ellipsis">
Cloudflare Tunnel
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../wifi/" class="md-nav__link">
<span class="md-ellipsis">
Setting up Wi-Fi
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../modem/" class="md-nav__link">
<span class="md-ellipsis">
Setting up 3G/4G/LTE modem
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../letsencrypt/" class="md-nav__link">
<span class="md-ellipsis">
Let's Encrypt certificates
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4">
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-ellipsis">
Video
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Video
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../video/" class="md-nav__link">
<span class="md-ellipsis">
Video modes (WebRTC, Direct)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../webrtc_config/" class="md-nav__link">
<span class="md-ellipsis">
WebRTC configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../edid/" class="md-nav__link">
<span class="md-ellipsis">
Tuning HDMI EDID
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pass/" class="md-nav__link">
<span class="md-ellipsis">
HDMI passthrough
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5">
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Peripheral devices
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Peripheral devices
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../atx_board/" class="md-nav__link">
<span class="md-ellipsis">
ATX board
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usb/" class="md-nav__link">
<span class="md-ellipsis">
USB configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usb_pass/" class="md-nav__link">
<span class="md-ellipsis">
USB passthrough
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../audio/" class="md-nav__link">
<span class="md-ellipsis">
Audio / Microphone
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_5">
<label class="md-nav__link" for="__nav_5_5" id="__nav_5_5_label" tabindex="0">
<span class="md-ellipsis">
Keyboard &amp; mouse
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_5">
<span class="md-nav__icon md-icon"></span>
Keyboard &amp; mouse
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../mouse/" class="md-nav__link">
<span class="md-ellipsis">
Mouse modes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mouse_jiggler/" class="md-nav__link">
<span class="md-ellipsis">
Mouse jiggler
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pico_hid/" class="md-nav__link">
<span class="md-ellipsis">
Pico HID (USB, PS/2)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../bluetooth_hid/" class="md-nav__link">
<span class="md-ellipsis">
Bluetooth HID
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../msd/" class="md-nav__link">
<span class="md-ellipsis">
Mass Storage Drive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usb_ethernet/" class="md-nav__link">
<span class="md-ellipsis">
Ethernet-over-USB
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usb_serial/" class="md-nav__link">
<span class="md-ellipsis">
Serial-over-USB
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gpio/" class="md-nav__link">
<span class="md-ellipsis">
GPIO (pins, relays, lamps, etc)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6">
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
Advanced usage
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Advanced usage
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../auth_advanced/" class="md-nav__link">
<span class="md-ellipsis">
Advanced authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../id/" class="md-nav__link">
<span class="md-ellipsis">
PiKVM identification
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../on_boot_config/" class="md-nav__link">
<span class="md-ellipsis">
On-boot configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../auto_snapshots/" class="md-nav__link">
<span class="md-ellipsis">
Automatic snapshots
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vnc/" class="md-nav__link">
<span class="md-ellipsis">
Using VNC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../multiport/" class="md-nav__link">
<span class="md-ellipsis">
Multiport KVM-over-IP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../wol/" class="md-nav__link">
<span class="md-ellipsis">
Wake-on-LAN the server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ipmi/" class="md-nav__link">
<span class="md-ellipsis">
IPMI &amp; Redfish integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pst/" class="md-nav__link">
<span class="md-ellipsis">
Persistent storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../prometheus/" class="md-nav__link">
<span class="md-ellipsis">
Prometheus monitoring
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
<span class="md-ellipsis">
Development
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../api/" class="md-nav__link">
<span class="md-ellipsis">
HTTP API reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../building_os/" class="md-nav__link">
<span class="md-ellipsis">
Building PiKVM OS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../3d_printing/" class="md-nav__link">
<span class="md-ellipsis">
Cases for 3D printing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8">
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
<span class="md-ellipsis">
Legacy
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Legacy
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../arduino_hid/" class="md-nav__link">
<span class="md-ellipsis">
Arduino HID
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../msd_legacy/" class="md-nav__link">
<span class="md-ellipsis">
Big DVD images on old PiKVM
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9">
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
<span class="md-ellipsis">
PiKVM Info
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
PiKVM Info
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../compliance/" class="md-nav__link">
<span class="md-ellipsis">
Compliance
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9_2">
<div class="md-nav__link md-nav__container">
<a href="../blog/" class="md-nav__link ">
<span class="md-ellipsis">
Blog &amp; News
</span>
</a>
<label class="md-nav__link " for="__nav_9_2" id="__nav_9_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_9_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9_2">
<span class="md-nav__icon md-icon"></span>
Blog &amp; News
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9_2_2">
<label class="md-nav__link" for="__nav_9_2_2" id="__nav_9_2_2_label" tabindex="0">
<span class="md-ellipsis">
Archive
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_9_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9_2_2">
<span class="md-nav__icon md-icon"></span>
Archive
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../blog/archive/2025/" class="md-nav__link">
<span class="md-ellipsis">
2025
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/archive/2024/" class="md-nav__link">
<span class="md-ellipsis">
2024
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/archive/2023/" class="md-nav__link">
<span class="md-ellipsis">
2023
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/archive/2022/" class="md-nav__link">
<span class="md-ellipsis">
2022
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/archive/2021/" class="md-nav__link">
<span class="md-ellipsis">
2021
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/archive/2020/" class="md-nav__link">
<span class="md-ellipsis">
2020
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9_2_3">
<label class="md-nav__link" for="__nav_9_2_3" id="__nav_9_2_3_label" tabindex="0">
<span class="md-ellipsis">
Categories
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_9_2_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9_2_3">
<span class="md-nav__icon md-icon"></span>
Categories
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../blog/category/development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/category/products/" class="md-nav__link">
<span class="md-ellipsis">
Products
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/category/releases/" class="md-nav__link">
<span class="md-ellipsis">
Releases
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#required-parts" class="md-nav__link">
<span class="md-ellipsis">
Required parts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#setting-up-the-hardware" class="md-nav__link">
<span class="md-ellipsis">
Setting up the hardware
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#wiring" class="md-nav__link">
<span class="md-ellipsis">
Wiring
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#power-up" class="md-nav__link">
<span class="md-ellipsis">
Power up
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configure-the-display" class="md-nav__link">
<span class="md-ellipsis">
Configure the display
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#access-pikvm" class="md-nav__link">
<span class="md-ellipsis">
Access PiKVM
</span>
</a>
<nav class="md-nav" aria-label="Access PiKVM">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#change-the-default-passwords" class="md-nav__link">
<span class="md-ellipsis">
Change the default passwords
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#access-the-remote-system" class="md-nav__link">
<span class="md-ellipsis">
Access the remote system
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#important-next-steps" class="md-nav__link">
<span class="md-ellipsis">
Important next steps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#further-recommendations" class="md-nav__link">
<span class="md-ellipsis">
Further recommendations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#known-issues-and-limitations" class="md-nav__link">
<span class="md-ellipsis">
Known issues and limitations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#basic-troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Basic troubleshooting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#getting-user-support" class="md-nav__link">
<span class="md-ellipsis">
Getting user support
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<div><h1 id="diy-pikvm-v2-quickstart-guide">DIY PiKVM V2 quickstart guide<a class="headerlink" href="#diy-pikvm-v2-quickstart-guide" title="Permanent link"></a></h1>
<div class="admonition tip">
<p class="admonition-title">So many choices!</p>
<p>There are many different options with sub-items, so you can choose what will suit you.<br>
However, we marked the recommended way by sign <strong><code>✮ ✮ ✮</code></strong></p>
</div>
<hr>
<h2 id="required-parts">Required parts<a class="headerlink" href="#required-parts" title="Permanent link"></a></h2>
<ol>
<li>
<p><strong>MicroSD card minimum 16Gb class 10.</strong></p>
</li>
<li>
<p><strong>Raspberry Pi board:</strong></p>
<ul>
<li><strong><a href="https://www.raspberrypi.com/products/raspberry-pi-4-model-b/">✮ ✮ ✮ Raspberry Pi 4 2Gb</a></strong>.<br>
<em>It makes no sense to buy a Pi 4 with more memory than 2Gb, since PiKVM software uses very few resources.</em></li>
<li>... or <a href="https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/">Raspberry Pi Zero 2 W</a>.<br>
<em>Compact and cheap, but not so reliable solution because of lack of the wired Ethernet.</em></li>
<li><em>... Raspberry Pi 5 is not supported right now. It doesn't have GPU video encoders, therefore,
there is no point in using it for PiKVM, it will not give any performance boost for this case.
The Pi 5 is a great device, just not suitable for PiKVM.</em></li>
</ul>
</li>
<li>
<p><strong>Video capture device:</strong></p>
<ul>
<li><em><em><a href="https://www.amazon.com/waveshare-HDMI-CSI-Camera-Adapter/dp/B08TR7R6RL">✮ ✮ ✮ HDMI-CSI bridge based on TC358743 chip</a>.<br>
</em>Supports H.264 video encoding, automatic resolution selection and the lowest possible latency.</em></li>
<li>... or <a href="https://www.amazon.com/Capture-Streaming-Broadcasting-Conference-Teaching/dp/B09FLN63B3">HDMI-USB dongle</a> (not available for Pi Zero 2).<br>
<em>Only heavy MJPEG video, no resolution detection, big latency compared to HDMI-CSI.
Some users report hardware problems: the dongle may not work in the BIOS or simply stop working after a while.
It's a black box, and no one knows what's inside it. If you have problems with it, it will not be possible to fix them.</em></li>
</ul>
</li>
<li>
<p><strong>Board-specific: Power supply, USB connectivity, etc.</strong></p>
<details class="success">
<summary>✮ ✮ ✮ Raspberry Pi 4</summary>
<p>On a Raspberry Pi 4 only the USB-C port that receives power is capable of acting as a USB Device.
The other USB ports are capable only of acting as USB Hosts.
Therefore a special cable must be used on the USB power port that it can simultaneously act as USB Device
for the target host and receive external power from an power supply.</p>
<details class="success">
<summary>✮ ✮ ✮ Variant #1: Power supply + ready-made Y-splitter module</summary>
<ul>
<li><em>x1</em> USB-C/Power Splitter Module (<a href="https://www.pishop.us/product/usb-c-pwr-splitter/">US</a>/<a href="https://www.tindie.com/products/8086net/usb-cpwr-splitter">UK</a>/<a href="https://www.buyapi.ca/product/usb-c-pwr-splitter/">CA</a>).</li>
<li><em>x1</em> USB-C to USB-C cable (male-male) for connecting the Raspberry Pi to the splitter.</li>
<li><em>x1</em> USB-A to USB-C cable (male-male) for connecting the target host to the splitter.</li>
<li><em>x1</em> <a href="https://www.raspberrypi.com/products/type-c-power-supply/">Official USB-C Power Supply</a>.</li>
</ul>
</details>
<details class="note">
<summary>... or Variant #2: Power supply + Y-splitter based on power blocker</summary>
<ul>
<li><em>x1</em> USB-A to USB-C cable (male-male).</li>
<li><em>x1</em> <a href="https://www.amazon.com/dp/B08C5FWQND">USB splitter</a>.</li>
<li><em>x1</em> <a href="https://www.amazon.com/gp/product/B092MLT2J3">USB Power Blocker</a> - Will go into the USB-A end towards the target host.</li>
<li><em>x1</em> <a href="https://www.raspberrypi.com/products/type-c-power-supply/">Raspberry Pi Official USB-C Power Supply</a>.</li>
</ul>
</details>
<details class="note">
<summary>... or Variant #3: Power supply + DIY Y-splitter for soldering</summary>
<ul>
<li><em>x1</em> USB-A to USB-C cable (male-male).</li>
<li><em>x1</em> Another cable USB-A to <em>any</em> (male-<em>any</em>).</li>
<li><em>x1</em> Any 5V 3A power supply with USB-A socket.</li>
</ul>
</details>
</details>
<details class="note">
<summary>... or Raspberry Pi Zero 2 W</summary>
<ul>
<li><em>x1</em> USB-A to USB-Micro cable (male-male).</li>
<li><em>x1</em> <a href="https://www.amazon.com/Arducam-Raspberry-Camera-Ribbon-Extension/dp/B085RW9K13">Raspberry Pi Zero Camera Cable</a>. <em>Not compatible with Auvidea B101</em>.</li>
<li><em>x1</em> <a href="https://www.raspberrypi.com/products/micro-usb-power-supply/">Raspberry Pi Official USB-Micro Power Supply</a>.</li>
</ul>
</details>
</li>
<li>
<p><strong>Optional features:</strong></p>
<details class="success">
<summary>✮ ✮ ✮ ATX controller to manage the target host's power</summary>
<p>With this part, you will be able to remotely turn on, turn off and restart your computer!</p>
<ul>
<li><em>x4</em> optocouplers
<a href="https://eu.mouser.com/ProductDetail/Toshiba/TLP241BFF?qs=CiayqK2gdcK1m25Yj88BfQ%3D%3D">TLP241BF(F</a>
or <a href="https://eu.mouser.com/ProductDetail/Sharp-Microelectronics/PC817X2NSZ9F?qs=rrS6PyfT74ehABo1g8zXHw%3D%3D">PC817X2NSZ9F</a> (the input polarity must be observed)
or <a href="https://www.digikey.com/products/en?keywords=G3VM-61A1">OMRON G3VM-61A1</a>
or <a href="https://www.digikey.com/products/en?keywords=G3VM-61AY1">OMRON G3VM-61AY1</a><br>
<em>Don't use random relay modules or random optocouplers! Some of these may not be sensitive enough
for the Raspberry Pi, some others may be low-level controlled. Either use relays that are activated by a high logic level,
or follow the design provided. See details <a href="https://github.com/pikvm/pikvm/issues/13">here</a>.</em></li>
<li><em>x4</em> 390 Ohm resistors (see <a href="https://github.com/pikvm/pikvm/issues/46">here</a> for alternatives).</li>
<li><em>2x</em> 4.7 kOhm resistors.</li>
<li><em>x10+</em> dupont wires male-male.</li>
<li><em>x1</em> a breadboard.</li>
<li><em>various</em> wires for the breadboard.</li>
</ul>
<p>This can be partially replaced by using <a href="../wol/">Wake-on-LAN</a> in the software, but it will not allow
to reboot a hung system, and it is not as reliable as an ATX controller. Sometimes the Wake-on-LAN
on the host just stops working, for its own or network reasons.</p>
</details>
<details class="note">
<summary>VGA video capture</summary>
<p>If you want to capture VGA from your server instead of HDMI,
buy the <a href="https://aliexpress.com/item/3256801728005613.html">VGA-to-HDMI converter</a>.
Some converters have issues with not supporting all resolutions and refresh rates.</p>
</details>
</li>
</ol>
<p><em>Kit parts suitable for assembly are also on <a href="https://3mdeb.com/shop/open-source-hardware/pikvm/">sale in Poland</a>.</em></p>
<hr>
<h2 id="setting-up-the-hardware">Setting up the hardware<a class="headerlink" href="#setting-up-the-hardware" title="Permanent link"></a></h2>
<ol>
<li>
<p><strong>Video capture device:</strong></p>
<details class="success">
<summary>✮ ✮ ✮ HDMI-CSI bridge</summary>
<p>Insert the flexible flat cable of the HDMI-CSI bridge into the narrow white connector on the Raspberry Pi
(the closest one to big USB sockets). It is labeled <code>CAMERA</code>. To insert you need to open the connector first.
On the Raspberry Pi side you can gently lift the black part up and a little bit sideways:</p>
<table>
<thead>
<tr>
<th>Opening the MIPI CSI slot on the Raspberry Pi</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../_diy/open_mipi_csi.jpg" data-desc-position="bottom"><img src="../_diy/open_mipi_csi.jpg" width="500"></a></td>
</tr>
</tbody>
</table>
<p>For the HDMI-CSI bridge this operation depends on the version you bought.
Either pull it gently up as on the Raspberry or push it sideways.
Make sure that the cable is inserted on the correct side and until it stops, and then push the black latch back.
Avoid using force when pushing the cable in, as the slots bond to the PCB is quite fragile.
Never connect or disconnect the flat cable from a powered device. This is not Plug-and-Play, and you can damage it.
Also use only the cable that was included with the device package, or make sure that the third-party cable has the correct pinout.</p>
<table>
<thead>
<tr>
<th>HDMI-CSI bridge connected to Raspberry Pi 4</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../_diy/rpi4_csi_connection.jpg" data-desc-position="bottom"><img src="../_diy/rpi4_csi_connection.jpg" width="500"></a></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>HDMI-CSI bridge connected to Raspberry Pi 2 W (using the adapter cable)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../_diy/rpi2w_csi_connection.jpg" data-desc-position="bottom"><img src="../_diy/rpi2w_csi_connection.jpg" width="500"></a></td>
</tr>
</tbody>
</table>
</details>
<details class="note">
<summary>... or HDMI-USB dongle</summary>
<p>Connect USB dongle to exactly this port. It is bound in the software so the OS does not confuse the video device with something else.</p>
<table>
<thead>
<tr>
<th>Raspberry Pi 2 and 3</th>
<th>Raspberry Pi 4</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../_diy/usbcap_rpi2.jpg" data-desc-position="bottom"><img src="../_diy/usbcap_rpi2.jpg" width="200"></a></td>
<td><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../_diy/usbcap_rpi4.jpg" data-desc-position="bottom"><img src="../_diy/usbcap_rpi4.jpg" width="200"></a></td>
</tr>
</tbody>
</table>
<p>There are many revisions of the Raspberry Pi boards and you may come across one that we haven't tested.
If the binding fails, the device will be available for all ports.
Everything will work, but if you use a webcam and Linux mistakes it for a dongle,
<a href="https://pikvm.org/support/">write to us</a> and we will fix it.</p>
</details>
</li>
<li>
<p><strong>USB cable and power supply</strong></p>
<details class="success">
<summary>✮ ✮ ✮ Raspberry Pi 4</summary>
<details class="success">
<summary>✮ ✮ ✮ Variant #1: Power supply + ready-made Y-splitter module</summary>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v2/v2_splitter_module.jpg" data-desc-position="bottom"><img src="../v2/v2_splitter_module.jpg" width="500"></a></p>
</details>
<details class="note">
<summary>... or Variant #2: Power supply + Y-splitter based on power blocker</summary>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v2/v2_splitter_cable.jpg" data-desc-position="bottom"><img src="../v2/v2_splitter_cable.jpg" width="500"></a></p>
</details>
<details class="note">
<summary>... or Variant #3: Power supply + DIY Y-splitter for soldering</summary>
<p>It is assumed that if you have followed this path, you know how to handle a soldering iron and a multimeter.</p>
<p>The Y-splitter can be soldered from two suitable USB cables. Check the attached diagram.
The appropriate USB pinout(s) can easily be found on Google.</p>
<p>Please note that if you make a Y-cable from two no-name cables, the colors of the wires may not match those shown.
Use a multimeter to make sure the connections are correct.</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v2/v2_splitter_soldering.png" data-desc-position="bottom"><img src="../v2/v2_splitter_soldering.png" width="500"></a></p>
<p><strong>Video How-To: <a href="https://www.youtube.com/watch?v=uLuBuQUF61o">Making a USB Y-splitter cable</a></strong></p>
</details>
</details>
<details class="note">
<summary>... or Raspberry Pi Zero 2 W</summary>
<p>This board has two USB micro connectors: one for power supply (marked as <code>PWR</code>) and the second for emulating
a USB gadget (marked as <code>USB</code>). Both connectors have a common power line, so to prevent Raspberry power from entering
the USB port of the target host, it is required to make a special USB A-to-Micro cable without power line.</p>
<p>One way is to physically cut the power wire inside the USB cable.</p>
<p>An easier way is to stick a piece of duct tape, as shown in this picture:</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v2/v2_tape_off.jpg" data-desc-position="bottom"><img src="../v2/v2_tape_off.jpg" width="500"></a></p>
<p>Connect the power supply to the <code>PWR</code>, and your magic cable to the <code>USB</code>. The magic cable will be used
to connect the device to the target host.</p>
</details>
</li>
<li>
<p><strong>✮ ✮ ✮ Optional feature: ATX controller</strong></p>
<p>Connect all the parts according to this scheme:</p>
<details class="example">
<summary>Simple wiring diagram</summary>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v2/v2_atx_breadboard.png" data-desc-position="bottom"><img src="../v2/v2_atx_breadboard.png"></a></p>
</details>
<details class="example">
<summary>Electrical schematic diagram for advanced users</summary>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v2/v2_atx_scheme.png" data-desc-position="bottom"><img src="../v2/v2_atx_scheme.png"></a></p>
</details>
</li>
<li>
<p><strong><a href="https://docs.pikvm.org/flashing_os" target="_blank">Flash the memory card with PiKVM OS</a></strong> and insert it to Raspberry Pi.</p>
</li>
</ol>
<hr>
<h2 id="wiring">Wiring<a class="headerlink" href="#wiring" title="Permanent link"></a></h2>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Double check that the circuit is assembled correctly to avoid any damage of the hardware.</p>
</div>
<p>PiKVM V2 requires several items available separately:</p>
<ul>
<li>Ethernet cable <strong>(Raspberry Pi 4 only)</strong></li>
<li>HDMI cable</li>
</ul>
<p>Let's connect all the wires before you power up the device.</p>
<ol>
<li>
<p>Connect the HDMI video capture device to the video output port on the target host.</p>
</li>
<li>
<p>Using the Y-cable, connect the Pi's OTG port to the USB on the target host.</p>
</li>
<li>
<p><strong>Raspberry Pi 4</strong>: connect <strong>Ethernet</strong> to the network, e.g., to the WiFI router.</p>
</li>
<li>
<details class="example">
<summary>Connect the ATX controller if you built it</summary>
<p>To control the power, two display LEDs (power and HDD activity) and two buttons (power and reset) are provided
on the front panel of the computer case. They are connected by wires to pins on the motherboard.</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../atx_board/atx_board_5.jpg" data-desc-position="bottom"><img src="../atx_board/atx_board_5.jpg" width="500"></a></p>
<p>All you have to do is connect the PiKVM ATX controller to their wires by making a parallel connection.
Please note that the pinout differs on different motherboards, so before you continue,
check the documentation on your motherboard for correct pinout.</p>
<p>The following illustration shows how the connection between the power LED and the power button should be performed:</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../_diy/atx_connection.png" data-desc-position="bottom"><img src="../_diy/atx_connection.png" width="500"></a></p>
<p>On the left are the wires from the PiKVM ATX controller, the pad in the middle indicates the pins on the motherboard,
and on the right are the LED and button of the target host. The implementation of this scheme is left to your discretion
and can be performed, for example, by cutting wires and performing twisting, followed by insulation with duct tape.</p>
<p>Be careful and respect the polarity of the LEDs. The polarity of the button does not matter (they have no polarity at all).
The connection of HDD LED and reset switch is performed in the same way.</p>
</details>
</li>
</ol>
<hr>
<h2 id="power-up">Power up<a class="headerlink" href="#power-up" title="Permanent link"></a></h2>
<p>If everything is assembled correctly, attach the power supply to the Raspberry Pi.</p>
<p>After turning on the power, PiKVM OS generates unique SSH keys and certificates and performs all necessary operations on the memory card. It takes a few minutes.</p>
<p><strong>Do not turn off the device until it's fully booted for the first time.</strong></p>
<hr>
<h2 id="configure-the-display">Configure the display<a class="headerlink" href="#configure-the-display" title="Permanent link"></a></h2>
<p>The operating system on your remote computer will treat PiKVM as an additional display and use it in the Extend mode by default. That's why you will see an empty desktop when you first connect.</p>
<p>To avoid that, go to the display settings in your remote computer's operating system and enable the mirror mode for the external screen that you operating system identifies as PiKVM. Refer to your operating system's documentation on that.</p>
<hr>
<h2 id="access-pikvm">Access PiKVM<a class="headerlink" href="#access-pikvm" title="Permanent link"></a></h2>
<p>You need to know PiKVM's IP address in the network to be able to access it. Unlike V3 and V4, PiKVM V2 doesn't have an OLED to display the IP address it receives automatically. You need to discover it manually. There are several ways to do that.</p>
<ul>
<li><strong>Common way:</strong> Open the web interface of your router and find the list of issued IP addresses there.</li>
<li><strong>Linux-only:</strong> Use the <code>arp-scan --localnet</code> command.</li>
<li><strong>Linux, MacOS, Windows:</strong> Download and run <a href="https://angryip.org">Angry IP Scanner</a>.</li>
<li><strong>Windows PowerShell:</strong> Use the <code>arp -a</code> command.</li>
</ul>
<p>Let's assume that PiKVM has received the address <code>192.168.0.26</code> and has also been assigned a hostname <code>pikvm</code>.</p>
<p>Type the URL in the browser's address bar and press <strong>Enter</strong>: <a href="https://192.168.0.26/">https://192.168.0.26/</a> or <a href="https://pikvm/">https://pikvm/</a>.</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v4/login-prompt.png" data-desc-position="bottom"><img alt="Login screen" src="../v4/login-prompt.png" width="450"></a></p>
<p>Submit the default credentials and click <strong>Login</strong>:</p>
<ul>
<li>Username: <code>admin</code></li>
<li>Password: <code>admin</code></li>
<li>2FA Code: disabled by default, skip this field</li>
</ul>
<p>You will see the initial dashboard screen of the PiKVM where you can access the remote host, connect to the PiKVM command line, or log out:</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v4/initial-ui.png" data-desc-position="bottom"><img alt="Initial UI" src="../v4/initial-ui.png" width="450"></a></p>
<h3 id="change-the-default-passwords">Change the default passwords<a class="headerlink" href="#change-the-default-passwords" title="Permanent link"></a></h3>
<p>For security's sake, it's best to change the default passwords immediately after running PiKVM for the first time.</p>
<div class="admonition danger">
<p class="admonition-title">Passwords are important!</p>
<p>Please ensure that you change <strong>both</strong> passwords: for Web UI access and for the Linux superuser (root).</p>
</div>
<p>To do that:</p>
<ol>
<li>
<p>On the initial dashboard screen, click the <strong>Terminal</strong> button to open the web terminal. You will see this command line interface:</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v4/pikvm-web-terminal-start.png" data-desc-position="bottom"><img alt="PiKVM WebTerm" src="../v4/pikvm-web-terminal-start.png" width="450"></a></p>
</li>
<li>
<p>Gain Linux superuser privileges:</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>su<span class="w"> </span>-
</code></pre></div>
<p>When prompted for password, use <code>root</code>.</p>
</li>
<li>
<p>Run <code>rw</code> to change the access to the SD card to the write mode:</p>
<div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>rw
</code></pre></div>
</li>
<li>
<p>Change the password for the Linux superuser:</p>
<div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>passwd<span class="w"> </span>root
</code></pre></div>
<p>Submit the new password, retype it the second time to confirm, press <strong>Enter</strong>, and you should see this:</p>
<div class="highlight"><pre><span></span><code><span class="go">passwd: password updated successfully</span>
</code></pre></div>
</li>
<li>
<p>Change the password for web access:</p>
<div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>kvmd-htpasswd<span class="w"> </span><span class="nb">set</span><span class="w"> </span>admin
</code></pre></div>
<p>Submit the new password, retype it the second time to confirm, and press <strong>Enter</strong>.</p>
</li>
<li>
<p>Run <code>ro</code> to change the access to the SD card back to the read-only mode:</p>
<div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>ro
</code></pre></div>
</li>
<li>
<p>Press <strong>Ctrl+D</strong> or type "exit" and press <strong>Enter</strong> to drop the root privileges.</p>
</li>
<li>
<p>Go back one page in the browser. You should be back to the initial dashboard screen.</p>
</li>
</ol>
<h3 id="access-the-remote-system">Access the remote system<a class="headerlink" href="#access-the-remote-system" title="Permanent link"></a></h3>
<ol>
<li>
<p>On the initial dashboard screen, click the <strong>KVM</strong> button to access the remote host.</p>
</li>
<li>
<p>You should now see the host system's display and interact with it remotely using a keyboard and a mouse.</p>
<p><a class="glightbox" data-type="image" data-width="95%" data-height="auto" href="../v4/remote-screen.png" data-desc-position="bottom"><img alt="Work remotely" src="../v4/remote-screen.png" width="450"></a></p>
</li>
</ol>
<hr>
<h2 id="important-next-steps">Important next steps<a class="headerlink" href="#important-next-steps" title="Permanent link"></a></h2>
<ul>
<li>
<p><strong>We strongly recommend to update the PiKVM OS</strong> after the first launch:</p>
<details class="note">
<summary>Updating PiKVM OS</summary>
<p>To update, run following commands under the <code>root</code> user:</p>
<div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>pikvm-update
</code></pre></div>
<p>If you encounter an error like:</p>
<div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>pikvm-update
<span class="go">bash: pikvm-update: command not found</span>
</code></pre></div>
<p>It's most likely you have an old OS release. You can update the OS as follows:</p>
<div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>rw
<span class="gp">[root@pikvm ~]# </span>pacman<span class="w"> </span>-Syy
<span class="gp">[root@pikvm ~]# </span>pacman<span class="w"> </span>-S<span class="w"> </span>pikvm-os-updater
<span class="gp">[root@pikvm ~]# </span>pikvm-update
</code></pre></div>
<p>Next time you will be able to use the usual method with <code>pikvm-update</code>.</p>
</details>
</li>
<li>
<p>Learn about basics of <strong>PiKVM OS Configuration</strong>: where to find configs, how to edit the, etc.</p>
<details class="note">
<summary>Configuring PiKVM OS</summary>
<div class="admonition tip">
<p class="admonition-title">Need more info? We have it!</p>
<p>The following is a brief guide to configuring PiKVM.
For more information (including the basics of YAML syntax and how to use a text editor in the Linux console),
please refer to <a href="../config/">this page</a>.</p>
</div>
<p>Most of the PiKVM configuration files are located in the <code>/etc/kvmd</code> directory.</p>
<p>The <code>/usr/lib/kvmd/main.yaml</code> file defines the platform configuration, and <strong>you should never edit it</strong>.
To redefine system parameters use the file <code>/etc/kvmd/override.yaml</code>.
All other files that are also not recommended for editing have read-only permissions.</p>
<p>You can also create several files with the <code>.*yaml</code> suffix and put then into <code>/etc/kvmd/override.d</code> directory
to split your customization into logical parts.
The <code>override.yaml</code> file definitions takes precedence over the <code>override.d</code> directory.</p>
<p>A complete list of all parameters can be viewed using the <code>kvmd -m</code> command.</p>
<p>Files with the <code>*.yaml</code> suffix uses the <a href="https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html">YAML syntax</a>
and describes a parameter tree with key-value pairs of different types.
To define the parameters within one section, an indent of 4 spaces is used.
Comments starts with the <code>#</code> symbol.</p>
<div class="admonition warning">
<p class="admonition-title">Only 4 spaces should be used for indentation</p>
<p>Be careful when editing YAML and follow this rule.
Invalid indentation or tabs instead of spaces will cause an error when starting the services.</p>
</div>
<p>Sections under the same keys <strong>should be merged</strong>:</p>
<ul>
<li>
<p><strong>Wrong:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nt">kvmd</span><span class="p">:</span>
<span class="w"> </span><span class="nt">gpio</span><span class="p">:</span>
<span class="w"> </span><span class="nt">drivers</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
<span class="nt">kvmd</span><span class="p">:</span>
<span class="w"> </span><span class="nt">gpio</span><span class="p">:</span>
<span class="w"> </span><span class="nt">scheme</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
</code></pre></div>
</li>
<li>
<p><strong>Correct:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nt">kvmd</span><span class="p">:</span>
<span class="w"> </span><span class="nt">gpio</span><span class="p">:</span>
<span class="w"> </span><span class="nt">drivers</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
<span class="w"> </span><span class="nt">scheme</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
</code></pre></div>
</li>
</ul>
<p>In the <code>/etc/kvmd/meta.yaml</code> file you can specify some information regarding this PiKVM installation in an almost free YAML format.</p>
</details>
</li>
<li>
<p><strong>Get to know PiKVM Web UI</strong>: read <a href="../webui/">this help section</a> to better understand all the possibilities of the web user interface.</p>
</li>
<li>
<p>Tune the HDMI dongle capture device if you're using it:</p>
<details class="note">
<summary>Persistent HDMI cable connection with USB dongle</summary>
<p>Many USB video capture devices tell the server's video card that the HDMI cable is supposedly disconnected.
This may lead to the fact that if you boot the server without an active stream, the server will not detect
your capture card. This is easy to fix:</p>
<ul>
<li>
<p>Switch filesystem to RW-mode:
</p><div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>rw
</code></pre></div>
</li>
<li>
<p>Edit file <code>/etc/kvmd/override.yaml</code> and add these lines:
</p><div class="highlight"><pre><span></span><code><span class="nt">kvmd</span><span class="p">:</span>
<span class="w"> </span><span class="nt">streamer</span><span class="p">:</span>
<span class="w"> </span><span class="nt">forever</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class="w"> </span><span class="nt">cmd_append</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">--slowdown</span><span class="p p-Indicator">]</span>
</code></pre></div>
</li>
<li>
<p>Finish:
</p><div class="highlight"><pre><span></span><code><span class="gp">[root@pikvm ~]# </span>ro
<span class="gp">[root@pikvm ~]# </span>systemctl<span class="w"> </span>restart<span class="w"> </span>kvmd
</code></pre></div>
</li>
<li>
<p>Check that everything is working.</p>
</li>
</ul>
</details>
</li>
</ul>
<hr>
<h2 id="further-recommendations">Further recommendations<a class="headerlink" href="#further-recommendations" title="Permanent link"></a></h2>
<ul>
<li><a href="../auth/">Harden the remote access</a> by enabling 2FA.</li>
<li>Configure access to PiKVM from the Internet using <a href="../port_forwarding/">port forwarding</a> or <a href="../tailscale/">Tailscale VPN</a>.</li>
<li><a href="../config/">Learn</a> how configuration files are structured.</li>
<li>Read how PiKVM is <a href="../id/">identified</a> on the target host.</li>
</ul>
<hr>
<h2 id="known-issues-and-limitations">Known issues and limitations<a class="headerlink" href="#known-issues-and-limitations" title="Permanent link"></a></h2>
<ul>
<li>
<p><strong>Max resolution</strong>.<br>PiKVM V2 with CSI bridge can only handle the maximum resolution 1920x1080@50Hz, 60Hz is not supported due hardware limitation. You can use any other resolution less than the specified one, for example 1280x720@60Hz. If you have any problems with video on CSI bridge, follow <a href="../edid/">this guide</a>.</p>
</li>
<li>
<p><strong>Motherboards compatibility</strong>.<br>There may be compatibility issues with some motherboards, such as HP or DELL. If there is no image from the BIOS, you can fine-tune the HDMI settings, but it is possible that the mass storage devices will not be available in the BIOS. In the latter case, <a href="../usb/">USB dynamic configuration</a> will solve the problem.</p>
</li>
</ul>
<hr>
<h2 id="basic-troubleshooting">Basic troubleshooting<a class="headerlink" href="#basic-troubleshooting" title="Permanent link"></a></h2>
<ul>
<li>
<p>Ensure that you are using the right <a href="../flashing_os/">OS image</a> for your platform
by running the following command: <code>pacman -Q | grep kvmd-platform</code>.</p>
</li>
<li>
<p>If you are not getting a display, run the two following commands:</p>
<ul>
<li><code>dmesg | egrep 'tc35|1-1.4|uvc'</code></li>
<li><code>systemctl status kvmd-tc358743</code></li>
</ul>
<p>If you see a failed message on that output, be sure verify the orientation of the CSI cable or try reseating it.</p>
<p>Note that this is not a hotplug device, and you must first turn off the power.</p>
</li>
</ul>
<hr>
<h2 id="getting-user-support">Getting user support<a class="headerlink" href="#getting-user-support" title="Permanent link"></a></h2>
<p>If something doesn't work, check out our <a href="../faq/">FAQ</a>. Otherwise, head straight to our <a href="https://pikvm.org/support/">Support</a>.</p></div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"></path></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright © 2018-2025 Maxim Devaev
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.indexes", "navigation.sections", "navigation.top", "navigation.expand", "search.highlight", "search.share", "search.suggest", "content.code.copy"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.f55a23d4.min.js"></script>
<script src="../_assets/add_paragraphs.js"></script>
<script src="../_assets/scroll_to_summary.js"></script>
<script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": false, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
document$.subscribe(()=>{ lightbox.reload(); });
</script></body></html>