tart/quick-start/index.html

2246 lines
61 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="Install Tart and run your first virtual machine on Apple Silicon in minutes.">
<meta name="author" content="Cirrus Labs">
<link rel="canonical" href="https://tart.run/quick-start/">
<link rel="prev" href="..">
<link rel="next" href="../integrations/cirrus-cli/">
<link rel="alternate" type="application/rss+xml" title="RSS feed" href="../feed_rss_created.xml">
<link rel="alternate" type="application/rss+xml" title="RSS feed of updated content" href="../feed_rss_updated.xml">
<link rel="icon" href="../assets/images/favicon.ico">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Quick Start - Tart Virtualization</title>
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="stylesheet" href="../assets/external/fonts.googleapis.com/css.49ea35f2.css">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../stylesheets/extra.css">
<link rel="stylesheet" href="../stylesheets/landing.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>
<script id="__analytics">function __md_analytics(){function e(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],e("js",new Date),e("config","G-HXBEB9D47X"),document.addEventListener("DOMContentLoaded",(function(){document.forms.search&&document.forms.search.query.addEventListener("blur",(function(){this.value&&e("event","search",{search_term:this.value})}));document$.subscribe((function(){var t=document.forms.feedback;if(void 0!==t)for(var a of t.querySelectorAll("[type=submit]"))a.addEventListener("click",(function(a){a.preventDefault();var n=document.location.pathname,d=this.getAttribute("data-md-value");e("event","feedback",{page:n,data:d}),t.firstElementChild.disabled=!0;var r=t.querySelector(".md-feedback__note [data-md-value='"+d+"']");r&&(r.hidden=!1)})),t.hidden=!1})),location$.subscribe((function(t){e("config","G-HXBEB9D47X",{page_path:t.pathname})}))}));var t=document.createElement("script");t.async=!0,t.src="https://www.googletagmanager.com/gtag/js?id=G-HXBEB9D47X",document.getElementById("__analytics").insertAdjacentElement("afterEnd",t)}</script>
<script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
<meta property="og:type" content="website" />
<meta property="og:title" content="Quick Start - Tart Virtualization" />
<meta property="og:description" content="Install Tart and run your first virtual machine on Apple Silicon in minutes." />
<meta property="og:image" content="https://tart.run/assets/images/social/quick-start.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://tart.run/quick-start/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="Quick Start - Tart Virtualization" />
<meta property="twitter:description" content="Install Tart and run your first virtual machine on Apple Silicon in minutes." />
<meta property="twitter:image" content="https://tart.run/assets/images/social/quick-start.png" />
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange">
<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="#vm-images" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="Tart Virtualization" class="md-header__button md-logo" aria-label="Tart Virtualization" data-md-component="logo">
<img src="../assets/images/TartLogo.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"/></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">
Tart Virtualization
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Quick Start
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
</form>
<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"/></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"/></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"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<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"/></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/cirruslabs/tart/" 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 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href=".." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="./" class="md-tabs__link">
Quick Start
</a>
</li>
<li class="md-tabs__item">
<a href="../integrations/cirrus-cli/" class="md-tabs__link">
Integrations
</a>
</li>
<li class="md-tabs__item">
<a href="../licensing/" class="md-tabs__link">
Support & Licensing
</a>
</li>
<li class="md-tabs__item">
<a href="../orchard/quick-start/" class="md-tabs__link">
Orchestration
</a>
</li>
<li class="md-tabs__item">
<a href="../faq/" class="md-tabs__link">
FAQ
</a>
</li>
<li class="md-tabs__item">
<a href="../legal/terms/" class="md-tabs__link">
Legal
</a>
</li>
<li class="md-tabs__item">
<a href="../blog/" class="md-tabs__link">
Blog
</a>
</li>
</ul>
</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" hidden>
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="Tart Virtualization" class="md-nav__button md-logo" aria-label="Tart Virtualization" data-md-component="logo">
<img src="../assets/images/TartLogo.png" alt="logo">
</a>
Tart Virtualization
</label>
<div class="md-nav__source">
<a href="https://github.com/cirruslabs/tart/" 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 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Home
</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">
Quick Start
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Quick Start
</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="#vm-images" class="md-nav__link">
<span class="md-ellipsis">
VM images
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssh-access" class="md-nav__link">
<span class="md-ellipsis">
SSH access
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-vm-images" class="md-nav__link">
<span class="md-ellipsis">
Creating VM images
</span>
</a>
<nav class="md-nav" aria-label="Creating VM images">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#creating-a-macos-vm-image-from-scratch" class="md-nav__link">
<span class="md-ellipsis">
Creating a macOS VM image from scratch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-a-linux-vm-image-from-scratch" class="md-nav__link">
<span class="md-ellipsis">
Creating a Linux VM image from scratch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configuring-a-vm" class="md-nav__link">
<span class="md-ellipsis">
Configuring a VM
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mounting-directories" class="md-nav__link">
<span class="md-ellipsis">
Mounting directories
</span>
</a>
<nav class="md-nav" aria-label="Mounting directories">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#accessing-mounted-directories-in-macos-guests" class="md-nav__link">
<span class="md-ellipsis">
Accessing mounted directories in macOS guests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#accessing-mounted-directories-in-linux-guests" class="md-nav__link">
<span class="md-ellipsis">
Accessing mounted directories in Linux guests
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#working-with-a-remote-oci-container-registry" class="md-nav__link">
<span class="md-ellipsis">
Working with a Remote OCI Container Registry
</span>
</a>
<nav class="md-nav" aria-label="Working with a Remote OCI Container Registry">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#registry-authorization" class="md-nav__link">
<span class="md-ellipsis">
Registry Authorization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pushing-a-local-image" class="md-nav__link">
<span class="md-ellipsis">
Pushing a Local Image
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pulling-a-remote-image" class="md-nav__link">
<span class="md-ellipsis">
Pulling a Remote Image
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Integrations
</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>
Integrations
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../integrations/cirrus-cli/" class="md-nav__link">
<span class="md-ellipsis">
Self-hosted CI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="https://cirrus-runners.app/" class="md-nav__link">
<span class="md-ellipsis">
GitHub Actions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../integrations/gitlab-runner/" class="md-nav__link">
<span class="md-ellipsis">
GitLab Runner
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../integrations/buildkite/" class="md-nav__link">
<span class="md-ellipsis">
Buildkite
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../integrations/packer/" class="md-nav__link">
<span class="md-ellipsis">
Packer
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../licensing/" class="md-nav__link">
<span class="md-ellipsis">
Support & Licensing
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Orchestration
</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>
Orchestration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../orchard/quick-start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../orchard/architecture-and-security/" class="md-nav__link">
<span class="md-ellipsis">
Architecture and Security
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../orchard/deploying-controller/" class="md-nav__link">
<span class="md-ellipsis">
Deploying Controller
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../orchard/deploying-workers/" class="md-nav__link">
<span class="md-ellipsis">
Deploying Workers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../orchard/using-orchard-cli/" class="md-nav__link">
<span class="md-ellipsis">
Using Orchard CLI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../orchard/managing-cluster/" class="md-nav__link">
<span class="md-ellipsis">
Managing the Cluster
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../orchard/integration-guide/" class="md-nav__link">
<span class="md-ellipsis">
Integrating with the API
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Legal
</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>
Legal
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../legal/terms/" class="md-nav__link">
<span class="md-ellipsis">
Terms of Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../legal/privacy/" class="md-nav__link">
<span class="md-ellipsis">
Privacy
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Blog
</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>
Blog
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../blog/" class="md-nav__link">
<span class="md-ellipsis">
Blog
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8_2" >
<label class="md-nav__link" for="__nav_8_2" id="__nav_8_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="2" aria-labelledby="__nav_8_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8_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>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8_3" >
<label class="md-nav__link" for="__nav_8_3" id="__nav_8_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="2" aria-labelledby="__nav_8_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8_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/announcement/" class="md-nav__link">
<span class="md-ellipsis">
announcement
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../blog/category/orchard/" class="md-nav__link">
<span class="md-ellipsis">
orchard
</span>
</a>
</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="#vm-images" class="md-nav__link">
<span class="md-ellipsis">
VM images
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssh-access" class="md-nav__link">
<span class="md-ellipsis">
SSH access
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-vm-images" class="md-nav__link">
<span class="md-ellipsis">
Creating VM images
</span>
</a>
<nav class="md-nav" aria-label="Creating VM images">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#creating-a-macos-vm-image-from-scratch" class="md-nav__link">
<span class="md-ellipsis">
Creating a macOS VM image from scratch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-a-linux-vm-image-from-scratch" class="md-nav__link">
<span class="md-ellipsis">
Creating a Linux VM image from scratch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configuring-a-vm" class="md-nav__link">
<span class="md-ellipsis">
Configuring a VM
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mounting-directories" class="md-nav__link">
<span class="md-ellipsis">
Mounting directories
</span>
</a>
<nav class="md-nav" aria-label="Mounting directories">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#accessing-mounted-directories-in-macos-guests" class="md-nav__link">
<span class="md-ellipsis">
Accessing mounted directories in macOS guests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#accessing-mounted-directories-in-linux-guests" class="md-nav__link">
<span class="md-ellipsis">
Accessing mounted directories in Linux guests
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#working-with-a-remote-oci-container-registry" class="md-nav__link">
<span class="md-ellipsis">
Working with a Remote OCI Container Registry
</span>
</a>
<nav class="md-nav" aria-label="Working with a Remote OCI Container Registry">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#registry-authorization" class="md-nav__link">
<span class="md-ellipsis">
Registry Authorization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pushing-a-local-image" class="md-nav__link">
<span class="md-ellipsis">
Pushing a Local Image
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pulling-a-remote-image" class="md-nav__link">
<span class="md-ellipsis">
Pulling a Remote Image
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1>Quick Start</h1>
<p>Try running a Tart VM on your Apple Silicon device running macOS 13.0 (Ventura) or later (will download a 25 GB image):</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>brew<span class="w"> </span>install<span class="w"> </span>cirruslabs/cli/tart
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>tart<span class="w"> </span>clone<span class="w"> </span>ghcr.io/cirruslabs/macos-tahoe-base:latest<span class="w"> </span>tahoe-base
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>tart<span class="w"> </span>run<span class="w"> </span>tahoe-base
</code></pre></div>
<details class="info">
<summary>Manual installation from a release archive</summary>
<p>It's also possible to manually install <code>tart</code> binary from the latest released archive:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>curl<span class="w"> </span>-LO<span class="w"> </span>https://github.com/cirruslabs/tart/releases/latest/download/tart.tar.gz
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>tar<span class="w"> </span>-xzvf<span class="w"> </span>tart.tar.gz
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>./tart.app/Contents/MacOS/tart<span class="w"> </span>clone<span class="w"> </span>ghcr.io/cirruslabs/macos-tahoe-base:latest<span class="w"> </span>tahoe-base
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>./tart.app/Contents/MacOS/tart<span class="w"> </span>run<span class="w"> </span>tahoe-base
</code></pre></div>
<p>Please note that <code>./tart.app/Contents/MacOS/tart</code> binary is required to be used in order to trick macOS
to pick <code>tart.app/Contents/embedded.provisionprofile</code> for elevated privileges that Tart needs.</p>
</details>
<p align="center">
<img src="../assets/external/github.com/cirruslabs/tart/raw/main/Resources/TartScreenshot.png">
</p>
<h2 id="vm-images">VM images<a class="headerlink" href="#vm-images" title="Permanent link">&para;</a></h2>
<p>The following macOS images are currently available:</p>
<ul>
<li>macOS 26 (Tahoe)<ul>
<li><code>ghcr.io/cirruslabs/macos-tahoe-vanilla:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-tahoe-base:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-tahoe-xcode:latest</code></li>
</ul>
</li>
<li>macOS 15 (Sequoia)<ul>
<li><code>ghcr.io/cirruslabs/macos-sequoia-vanilla:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-sequoia-base:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-sequoia-xcode:latest</code></li>
</ul>
</li>
<li>macOS 14 (Sonoma)<ul>
<li><code>ghcr.io/cirruslabs/macos-sonoma-vanilla:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-sonoma-base:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-sonoma-xcode:latest</code></li>
</ul>
</li>
<li>macOS 13 (Ventura)<ul>
<li><code>ghcr.io/cirruslabs/macos-ventura-vanilla:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-ventura-base:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-ventura-xcode:latest</code></li>
</ul>
</li>
<li>macOS 12 (Monterey)<ul>
<li><code>ghcr.io/cirruslabs/macos-monterey-vanilla:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-monterey-base:latest</code></li>
<li><code>ghcr.io/cirruslabs/macos-monterey-xcode:latest</code></li>
</ul>
</li>
</ul>
<p>There's also a <a href="https://github.com/orgs/cirruslabs/packages?tab=packages&amp;q=macos-">full list of images</a> in which you can discovery specific tags (e.g. <code>ghcr.io/cirruslabs/macos-monterey-xcode:15</code>) and <a href="https://github.com/cirruslabs/macos-image-templates">macOS-specific Packer templates</a> that were used to generate these images.</p>
<p>For, Linux the options are as follows:</p>
<ul>
<li>Ubuntu<ul>
<li><code>ghcr.io/cirruslabs/ubuntu:latest</code></li>
</ul>
</li>
<li>Debian<ul>
<li><code>ghcr.io/cirruslabs/debian:latest</code></li>
</ul>
</li>
<li>Fedora<ul>
<li><code>ghcr.io/cirruslabs/fedora:latest</code></li>
</ul>
</li>
</ul>
<p>Note that these Linux images have a minimal disk size of 20 GB, and you might want to resize them right after cloning:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>tart<span class="w"> </span>clone<span class="w"> </span>ghcr.io/cirruslabs/ubuntu:latest<span class="w"> </span>ubuntu
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>tart<span class="w"> </span><span class="nb">set</span><span class="w"> </span>ubuntu<span class="w"> </span>--disk-size<span class="w"> </span><span class="m">50</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>tart<span class="w"> </span>run<span class="w"> </span>ubuntu
</code></pre></div>
<p>These Linux images can be ran natively on <a href="https://github.com/cirruslabs/vetu">Vetu</a>, our virtualization solution for Linux, assuming that Vetu itself is running on an <code>arm64</code> machine.</p>
<p>Similarly to macOS, there's also a <a href="https://github.com/orgs/cirruslabs/packages?repo_name=linux-image-templates">full list of images</a> in which you can discovery specific tags (e.g. <code>ghcr.io/cirruslabs/ubuntu:22.04</code>) and <a href="https://github.com/cirruslabs/linux-image-templates">Linux-specific Packer templates</a> that were used to generate these images.</p>
<p>All images above use the following credentials:</p>
<ul>
<li>Username: <code>admin</code></li>
<li>Password: <code>admin</code></li>
</ul>
<p>These credentials work both for logging in via GUI, console (Linux) and SSH.</p>
<h2 id="ssh-access">SSH access<a class="headerlink" href="#ssh-access" title="Permanent link">&para;</a></h2>
<p>If the guest VM is running and configured to accept incoming SSH connections you can conveniently connect to it like so:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>ssh<span class="w"> </span>admin@<span class="k">$(</span>tart<span class="w"> </span>ip<span class="w"> </span>tahoe-base<span class="k">)</span>
</code></pre></div>
<div class="admonition tip">
<p class="admonition-title">Running scripts inside Tart virtual machines</p>
<p>We recommend using <a href="../integrations/cirrus-cli/">Cirrus CLI</a> to run scripts and/or retrieve artifacts
from within Tart virtual machines. Alternatively, you can use plain ssh connection and <code>tart ip</code> command:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>brew<span class="w"> </span>install<span class="w"> </span>cirruslabs/cli/sshpass
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>sshpass<span class="w"> </span>-p<span class="w"> </span>admin<span class="w"> </span>ssh<span class="w"> </span>-o<span class="w"> </span><span class="s2">&quot;StrictHostKeyChecking no&quot;</span><span class="w"> </span>-o<span class="w"> </span><span class="s2">&quot;UserKnownHostsFile=/dev/null&quot;</span><span class="w"> </span>admin@<span class="k">$(</span>tart<span class="w"> </span>ip<span class="w"> </span>tahoe-base<span class="k">)</span><span class="w"> </span><span class="s2">&quot;uname -a&quot;</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>sshpass<span class="w"> </span>-p<span class="w"> </span>admin<span class="w"> </span>ssh<span class="w"> </span>-o<span class="w"> </span><span class="s2">&quot;StrictHostKeyChecking no&quot;</span><span class="w"> </span>-o<span class="w"> </span><span class="s2">&quot;UserKnownHostsFile=/dev/null&quot;</span><span class="w"> </span>admin@<span class="k">$(</span>tart<span class="w"> </span>ip<span class="w"> </span>tahoe-base<span class="k">)</span><span class="w"> </span>&lt;<span class="w"> </span>script.sh
</code></pre></div>
</div>
<h2 id="creating-vm-images">Creating VM images<a class="headerlink" href="#creating-vm-images" title="Permanent link">&para;</a></h2>
<p>Tart supports macOS and Linux virtual machines. All commands like <code>run</code> and <code>pull</code> work the same way regardless of the underlying OS a particular VM image has.
The only difference is how such VM images are created. Please check sections below for <a href="#creating-a-macos-vm-image-from-scratch">macOS</a> and <a href="#creating-a-linux-vm-image-from-scratch">Linux</a> instructions.</p>
<h3 id="creating-a-macos-vm-image-from-scratch">Creating a macOS VM image from scratch<a class="headerlink" href="#creating-a-macos-vm-image-from-scratch" title="Permanent link">&para;</a></h3>
<p>Tart can create VMs from <code>*.ipsw</code> files. You can download a specific <code>*.ipsw</code> file <a href="https://ipsw.me/">here</a> or you can
use <code>latest</code> instead of a path to <code>*.ipsw</code> to download the latest available version:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>tart<span class="w"> </span>create<span class="w"> </span>--from-ipsw<span class="o">=</span>latest<span class="w"> </span>tahoe-vanilla
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>tart<span class="w"> </span>run<span class="w"> </span>tahoe-vanilla
</code></pre></div>
<p>After the initial booting of the VM, you'll need to manually go through the macOS installation process. As a convention we recommend creating an <code>admin</code> user with an <code>admin</code> password. After the regular installation please do some additional modifications in the VM:</p>
<ol>
<li>Enable Auto-Login. Users &amp; Groups -&gt; Login Options -&gt; Automatic login -&gt; admin.</li>
<li>Allow SSH. Sharing -&gt; Remote Login</li>
<li>Disable Lock Screen. Preferences -&gt; Lock Screen -&gt; disable "Require Password" after 5.</li>
<li>Disable Screen Saver.</li>
<li>Run <code>sudo visudo</code> in Terminal, find <code>%admin ALL=(ALL) ALL</code> add <code>admin ALL=(ALL) NOPASSWD: ALL</code> to allow sudo without a password.</li>
</ol>
<h3 id="creating-a-linux-vm-image-from-scratch">Creating a Linux VM image from scratch<a class="headerlink" href="#creating-a-linux-vm-image-from-scratch" title="Permanent link">&para;</a></h3>
<p>Linux VMs are supported on hosts running macOS 13.0 (Ventura) or newer.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="c1"># Create a bare VM</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>tart<span class="w"> </span>create<span class="w"> </span>--linux<span class="w"> </span>ubuntu
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="c1"># Install Ubuntu</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>tart<span class="w"> </span>run<span class="w"> </span>--disk<span class="w"> </span>focal-desktop-arm64.iso<span class="w"> </span>ubuntu
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="c1"># Run VM</span>
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a>tart<span class="w"> </span>run<span class="w"> </span>ubuntu
</code></pre></div>
<p>After the initial setup please make sure your VM can be SSH-ed into by running the following commands inside your VM:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>sudo<span class="w"> </span>apt<span class="w"> </span>update
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span>openssh-server
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>sudo<span class="w"> </span>ufw<span class="w"> </span>allow<span class="w"> </span>ssh
</code></pre></div>
<h3 id="configuring-a-vm">Configuring a VM<a class="headerlink" href="#configuring-a-vm" title="Permanent link">&para;</a></h3>
<p>By default, a Tart VM uses 2 CPUs and 4 GB of memory with a <code>1024x768</code> display. This can be changed after VM creation with <code>tart set</code> command.
Please refer to <code>tart set --help</code> for additional details.</p>
<h2 id="mounting-directories">Mounting directories<a class="headerlink" href="#mounting-directories" title="Permanent link">&para;</a></h2>
<p>To mount a directory, run the VM with the <code>--dir</code> argument:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>tart<span class="w"> </span>run<span class="w"> </span>--dir<span class="o">=</span>project:~/src/project<span class="w"> </span>vm
</code></pre></div>
<p>Here, the <code>project</code> specifies a mount name, whereas the <code>~/src/project</code> is a path to the host's directory to expose to the VM.</p>
<p>It is also possible to mount directories in read-only mode by adding a third parameter, <code>ro</code>:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>tart<span class="w"> </span>run<span class="w"> </span>--dir<span class="o">=</span>project:~/src/project:ro<span class="w"> </span>vm
</code></pre></div>
<p>To mount multiple directories, repeat the <code>--dir</code> argument for each directory:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>tart<span class="w"> </span>run<span class="w"> </span>--dir<span class="o">=</span>www1:~/project1/www<span class="w"> </span>--dir<span class="o">=</span>www2:~/project2/www
</code></pre></div>
<p>Note that the first parameter in each <code>--dir</code> argument must be unique, otherwise only the last <code>--dir</code> argument using that name will be used.</p>
<p>Note: to use the directory mounting feature, the host needs to run macOS 13.0 (Ventura) or newer.</p>
<h3 id="accessing-mounted-directories-in-macos-guests">Accessing mounted directories in macOS guests<a class="headerlink" href="#accessing-mounted-directories-in-macos-guests" title="Permanent link">&para;</a></h3>
<p>All shared directories are automatically mounted to <code>/Volumes/My Shared Files</code> directory.</p>
<p>The directory we've mounted above will be accessible from the <code>/Volumes/My Shared Files/project</code> path inside a guest VM.</p>
<p>Note: to use the directory mounting feature, the guest VM needs to run macOS 13.0 (Ventura) or newer.</p>
<details class="tip">
<summary>Changing mount location</summary>
<p>It is possible to remount the directories after a virtual machine is started by running the following commands:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a>sudo<span class="w"> </span>umount<span class="w"> </span><span class="s2">&quot;/Volumes/My Shared Files&quot;</span>
<a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a>mkdir<span class="w"> </span>~/workspace
<a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a>mount_virtiofs<span class="w"> </span>com.apple.virtio-fs.automount<span class="w"> </span>~/workspace
</code></pre></div>
<p>After running the above commands the direcory will be available at <code>~/workspace/project</code></p>
</details>
<h3 id="accessing-mounted-directories-in-linux-guests">Accessing mounted directories in Linux guests<a class="headerlink" href="#accessing-mounted-directories-in-linux-guests" title="Permanent link">&para;</a></h3>
<p>To be able to access the shared directories from the Linux guest, you need to manually mount the virtual filesystem first:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>sudo<span class="w"> </span>mkdir<span class="w"> </span>/mnt/shared
<a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a>sudo<span class="w"> </span>mount<span class="w"> </span>-t<span class="w"> </span>virtiofs<span class="w"> </span>com.apple.virtio-fs.automount<span class="w"> </span>/mnt/shared
</code></pre></div>
<p>The directory we've mounted above will be accessible from the <code>/mnt/shared/project</code> path inside a guest VM.</p>
<details class="info">
<summary>Auto-mount at boot time</summary>
<p>To automatically mount this directory at boot time, add the following line to the <code>/etc/fstab</code> file:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a>com.apple.virtio-fs.automount<span class="w"> </span>/mnt/shared<span class="w"> </span>virtiofs<span class="w"> </span>rw,relatime<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span>
</code></pre></div>
</details>
<h2 id="working-with-a-remote-oci-container-registry">Working with a Remote OCI Container Registry<a class="headerlink" href="#working-with-a-remote-oci-container-registry" title="Permanent link">&para;</a></h2>
<p>Tart supports interacting with Open Container Initiative (OCI) registries, but only runs images created and pushed by Tart. This means images created for container engines, like Docker, can't be pulled. Instead, create a custom image as documented above.</p>
<p>For example, let's say you want to push/pull images to an OCI registry hosted at <code>https://acme.io/</code>.</p>
<h3 id="registry-authorization">Registry Authorization<a class="headerlink" href="#registry-authorization" title="Permanent link">&para;</a></h3>
<p>First, you need to login to <code>acme.io</code> with the <code>tart login</code> command:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a>tart<span class="w"> </span>login<span class="w"> </span>acme.io
</code></pre></div>
<p>If you login to your registry with OAuth, you may need to create an access token to use as the password.
Credentials are securely stored in Keychain.</p>
<p>In addition, Tart supports <a href="https://docs.docker.com/engine/reference/commandline/login/#credential-helpers">Docker credential helpers</a>
if defined in <code>~/.docker/config.json</code>.</p>
<p>Finally, <code>TART_REGISTRY_USERNAME</code> and <code>TART_REGISTRY_PASSWORD</code> environment variables allow to override authorization
for all registries, which might be useful for integrating with your CI's secret management.</p>
<p>You can also set the <code>TART_REGISTRY_HOSTNAME</code> environment variable to apply these overrides only to a specific host.</p>
<h3 id="pushing-a-local-image">Pushing a Local Image<a class="headerlink" href="#pushing-a-local-image" title="Permanent link">&para;</a></h3>
<p>Once credentials are saved for <code>acme.io</code>, run the following command to push a local images remotely with two tags:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>tart<span class="w"> </span>push<span class="w"> </span>my-local-vm-name<span class="w"> </span>acme.io/remoteorg/name:latest<span class="w"> </span>acme.io/remoteorg/name:v1.0.0
</code></pre></div>
<h3 id="pulling-a-remote-image">Pulling a Remote Image<a class="headerlink" href="#pulling-a-remote-image" title="Permanent link">&para;</a></h3>
<p>You can either pull an image:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>tart<span class="w"> </span>pull<span class="w"> </span>acme.io/remoteorg/name:latest
</code></pre></div>
<p>or create a VM from a remote image:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a>tart<span class="w"> </span>clone<span class="w"> </span>acme.io/remoteorg/name:latest<span class="w"> </span>my-local-vm-name
</code></pre></div>
<p>If the specified image is not already present, this invocation calls the <code>tart pull</code> implicitly before cloning.</p>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<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"/></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">
© Cirrus Labs 2017-present
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://twitter.com/cirrus_labs" target="_blank" rel="noopener" title="twitter.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 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="M459.4 151.7c.3 4.5.3 9.1.3 13.6 0 138.7-105.6 298.6-298.6 298.6-59.5 0-114.7-17.2-161.1-47.1 8.4 1 16.6 1.3 25.3 1.3 49.1 0 94.2-16.6 130.3-44.8-46.1-1-84.8-31.2-98.1-72.8 6.5 1 13 1.6 19.8 1.6 9.4 0 18.8-1.3 27.6-3.6-48.1-9.7-84.1-52-84.1-103v-1.3c14 7.8 30.2 12.7 47.4 13.3-28.3-18.8-46.8-51-46.8-87.4 0-19.5 5.2-37.4 14.3-53C87.4 130.8 165 172.4 252.1 176.9c-1.6-7.8-2.6-15.9-2.6-24C249.5 95.1 296.3 48 354.4 48c30.2 0 57.5 12.7 76.7 33.1 23.7-4.5 46.5-13.3 66.6-25.3-7.8 24.4-24.4 44.8-46.1 57.8 21.1-2.3 41.6-8.1 60.4-16.2-14.3 20.8-32.2 39.3-52.6 54.3"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
<div class="md-consent__overlay"></div>
<aside class="md-consent__inner">
<form class="md-consent__form md-grid md-typeset" name="consent">
<h4>Cookie consent</h4>
<p>We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation and whether users find what they're searching for. With your consent, you're helping us to make our documentation better.</p>
<input class="md-toggle" type="checkbox" id="__settings" >
<div class="md-consent__settings">
<ul class="task-list">
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="analytics" checked>
<span class="task-list-indicator"></span>
Google Analytics
</label>
</li>
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="github" checked>
<span class="task-list-indicator"></span>
GitHub
</label>
</li>
</ul>
</div>
<div class="md-consent__controls">
<button class="md-button md-button--primary">Accept</button>
<label class="md-button" for="__settings">Manage settings</label>
</div>
</form>
</aside>
</div>
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["announce.dismiss", "content.tabs.link", "content.code.copy", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "search.suggest", "toc.follow"], "search": "../assets/javascripts/workers/search.2c215733.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.79ae519e.min.js"></script>
</body>
</html>