├── external ├── docker.md ├── .gitignore ├── CHANGELOG.md ├── changelog.md ├── build-automation.md └── contributing.md ├── .gitignore ├── .github ├── FUNDING.yml └── workflows │ ├── claude.yml │ └── deploy.yml ├── renovate.json ├── .prettierignore ├── static └── img │ ├── favicon.ico │ ├── iodd-st400.png │ ├── nbxyz-logo.png │ ├── nbxyz-laptop.gif │ ├── netboot.xyz.gif │ ├── nbxyz_logo_name.png │ ├── netboot.xyz-webapp.png │ ├── nbxyz-transparent-logo-black.png │ ├── nbxyz-transparent-logo-white.png │ ├── nbxyz-logo.svg │ ├── nbxyz-logo-dark.svg │ └── white_logo_transparent.svg ├── babel.config.js ├── docs ├── kb │ ├── pxe │ │ ├── _category_.yml │ │ ├── almalinux.md │ │ ├── rockylinux.md │ │ ├── debian.md │ │ ├── ubuntu.md │ │ └── windows.md │ ├── hardware │ │ ├── _category_.yml │ │ ├── steamdeck.md │ │ └── synology.md │ ├── networking │ │ ├── _category_.yml │ │ ├── mikrotik.md │ │ ├── asuswrt-merlin.md │ │ ├── tftp-filename-issues.md │ │ └── edgerouter.md │ ├── providers │ │ ├── _category_.yml │ │ ├── equinixmetal.md │ │ ├── linode.md │ │ ├── vultr.md │ │ ├── digitalocean.md │ │ ├── gce.md │ │ ├── oci.md │ │ └── openstack.md │ └── _category_.yml ├── community │ ├── _category_.yml │ ├── changelog.md │ ├── contributing.md │ ├── build-automation.md │ └── nbxyz-users.md ├── docker │ ├── _category_.yml │ ├── parameters.md │ ├── overview.md │ ├── dhcp.md │ ├── custom-menus.md │ └── usage.md ├── booting │ ├── _category_.yml │ ├── ipxe.md │ ├── iso.md │ ├── qemu.md │ ├── usb.md │ ├── tftp.md │ ├── uefi.md │ └── vms.md ├── introduction.md ├── quick-start.md └── selfhosting.md ├── crowdin.yml ├── sidebars.js ├── .prettierrc ├── src ├── theme │ ├── MDXComponents.js │ ├── DocBreadcrumbs │ │ └── index.js │ └── CodeBlock │ │ └── index.js ├── components │ ├── HomepageFeatures.module.css │ ├── MDXImage │ │ └── index.js │ ├── OptimizedImage │ │ └── index.js │ ├── DownloadCard.js │ ├── DownloadSection.module.css │ ├── DownloadSection.js │ ├── HomepageFeatures.js │ └── DownloadCard.module.css ├── pages │ ├── index.module.css │ ├── styles.module.css │ ├── index.js │ ├── downloads.module.css │ └── downloads.js └── css │ └── custom.css ├── blog ├── authors.yml ├── 2021-09-04-site-updates.md ├── 2015-11-25-introducing-netboot-xyz.md ├── 2025-03-28-10k-github-stars.md ├── 2019-11-29-self-hosting-and-live-booting.md └── 2016-01-07-booting-linux-isos-with-memdisk-and-ipxe.md ├── .markdownlint-cli2.jsonc ├── .eslintrc.js ├── README.md ├── package.json └── docusaurus.config.js /external/docker.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /external/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /external/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /external/changelog.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /external/build-automation.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /external/contributing.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | .docusaurus -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: netbootxyz 2 | open_collective: netbootxyz 3 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:recommended" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build 2 | .docusaurus 3 | node_modules 4 | *.md 5 | yarn.lock 6 | package-lock.json -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/iodd-st400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/iodd-st400.png -------------------------------------------------------------------------------- /static/img/nbxyz-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/nbxyz-logo.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /static/img/nbxyz-laptop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/nbxyz-laptop.gif -------------------------------------------------------------------------------- /static/img/netboot.xyz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/netboot.xyz.gif -------------------------------------------------------------------------------- /static/img/nbxyz_logo_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/nbxyz_logo_name.png -------------------------------------------------------------------------------- /docs/kb/pxe/_category_.yml: -------------------------------------------------------------------------------- 1 | label: PXE Usage 2 | collapsed: true 3 | link: 4 | type: generated-index 5 | title: PXE Usage 6 | -------------------------------------------------------------------------------- /docs/kb/hardware/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Hardware 2 | collapsed: true 3 | link: 4 | type: generated-index 5 | title: Hardware 6 | -------------------------------------------------------------------------------- /static/img/netboot.xyz-webapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/netboot.xyz-webapp.png -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /docs/**/* 3 | translation: /website/%two_letters_code%/%original_path%/%original_file_name% 4 | -------------------------------------------------------------------------------- /docs/kb/networking/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Networking 2 | collapsed: true 3 | link: 4 | type: generated-index 5 | title: Networking 6 | -------------------------------------------------------------------------------- /docs/community/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Community 2 | position: 5 3 | collapsed: true 4 | link: 5 | type: generated-index 6 | title: Community 7 | -------------------------------------------------------------------------------- /docs/kb/providers/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Provider Usage 2 | collapsed: true 3 | link: 4 | type: generated-index 5 | title: Provider Usage 6 | -------------------------------------------------------------------------------- /docs/kb/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Knowledge Base 2 | position: 9 3 | collapsed: true 4 | link: 5 | type: generated-index 6 | title: Knowledge Base 7 | -------------------------------------------------------------------------------- /static/img/nbxyz-transparent-logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/nbxyz-transparent-logo-black.png -------------------------------------------------------------------------------- /static/img/nbxyz-transparent-logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netbootxyz/netboot.xyz-docs/HEAD/static/img/nbxyz-transparent-logo-white.png -------------------------------------------------------------------------------- /docs/docker/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Docker Container 2 | position: 4 3 | collapsed: true 4 | link: 5 | type: generated-index 6 | title: Docker Container 7 | -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | export default { 2 | myAutogeneratedSidebar: [ 3 | { 4 | type: 'autogenerated', 5 | dirName: '.', // '.' means the current docs folder 6 | }, 7 | ], 8 | }; -------------------------------------------------------------------------------- /docs/booting/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Booting Methods 2 | position: 3 3 | link: 4 | type: generated-index 5 | title: Booting Methods 6 | description: Select your desired netboot.xyz boot method below... 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "trailingComma": "all", 4 | "singleQuote": true, 5 | "printWidth": 80, 6 | "tabWidth": 2, 7 | "useTabs": false, 8 | "bracketSpacing": false, 9 | "arrowParens": "avoid" 10 | } -------------------------------------------------------------------------------- /src/theme/MDXComponents.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import MDXComponents from '@theme-original/MDXComponents'; 3 | import MDXImage from '../components/MDXImage'; 4 | 5 | export default { 6 | ...MDXComponents, 7 | img: MDXImage, 8 | }; -------------------------------------------------------------------------------- /blog/authors.yml: -------------------------------------------------------------------------------- 1 | antonym: 2 | name: Antony Messerli 3 | title: Lead Developer 4 | url: https://www.reversengineered.com 5 | image_url: https://avatars.githubusercontent.com/u/245007?v=4 6 | page: false 7 | socials: 8 | x: ntonym 9 | github: antonym 10 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures.module.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable docusaurus/copyright-header */ 2 | 3 | .features { 4 | display: flex; 5 | align-items: center; 6 | padding: 2rem 0; 7 | width: 100%; 8 | } 9 | 10 | .featureSvg { 11 | height: 200px; 12 | width: 200px; 13 | } 14 | -------------------------------------------------------------------------------- /docs/community/changelog.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: changelog 3 | title: netboot.xyz changelog 4 | description: netboot.xyz changelog 5 | hide_title: true 6 | sidebar_label: Changelog 7 | --- 8 | 9 | ```mdx-code-block 10 | import Changelog, {toc as ChangelogTOC} from "@site/external/changelog.md" 11 | 12 | 13 | 14 | export const toc = ChangelogTOC; 15 | ``` 16 | -------------------------------------------------------------------------------- /.markdownlint-cli2.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "MD013": false, 4 | "MD009": false, 5 | "MD022": false, 6 | "MD030": false, 7 | "MD040": false, 8 | "MD031": false, 9 | "MD047": false, 10 | "MD032": false, 11 | "MD034": false, 12 | "MD029": false, 13 | "MD041": false 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /src/theme/DocBreadcrumbs/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import DocBreadcrumbs from '@theme-original/DocBreadcrumbs'; 3 | 4 | export default function DocBreadcrumbsWrapper(props) { 5 | return ( 6 |
7 | 8 |
9 | ); 10 | } -------------------------------------------------------------------------------- /docs/community/contributing.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: contributing 3 | title: Contributing 4 | description: How to contribute to the netboot.xyz project 5 | sidebar_label: Contributing 6 | hide_title: true 7 | hide_table_of_contents: true 8 | --- 9 | 10 | ```mdx-code-block 11 | import Contributing, {toc as ContributingTOC} from "@site/external/contributing.md" 12 | 13 | 14 | 15 | export const toc = ContributingTOC; 16 | 17 | ``` 18 | -------------------------------------------------------------------------------- /docs/community/build-automation.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: build-automation 3 | title: Build Automation 4 | description: "Details how the netboot.xyz automated build system works" 5 | sidebar_label: Build Automation 6 | hide_table_of_contents: false 7 | hide_title: true 8 | --- 9 | 10 | ```mdx-code-block 11 | import BuildAutomation, {toc as BuildAutomationTOC} from "@site/external/build-automation.md" 12 | 13 | 14 | 15 | export const toc = BuildAutomationTOC; 16 | ``` 17 | -------------------------------------------------------------------------------- /src/components/MDXImage/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import OptimizedImage from '../OptimizedImage'; 3 | 4 | export default function MDXImage({src, alt, title, ...props}) { 5 | // If the src is a relative path starting with ../static, convert it 6 | const imageSrc = src.startsWith('../static/') 7 | ? src.replace('../static/', '/') 8 | : src; 9 | 10 | return ( 11 | 17 | ); 18 | } -------------------------------------------------------------------------------- /src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable docusaurus/copyright-header */ 2 | 3 | /** 4 | * CSS files with the .module.css suffix will be treated as CSS modules 5 | * and scoped locally. 6 | */ 7 | 8 | .heroBanner { 9 | padding: 4rem 0; 10 | text-align: center; 11 | position: relative; 12 | overflow: hidden; 13 | } 14 | 15 | @media screen and (max-width: 966px) { 16 | .heroBanner { 17 | padding: 2rem; 18 | } 19 | } 20 | 21 | .buttons { 22 | display: flex; 23 | align-items: center; 24 | justify-content: center; 25 | } 26 | -------------------------------------------------------------------------------- /src/pages/styles.module.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable docusaurus/copyright-header */ 2 | 3 | /** 4 | * CSS files with the .module.css suffix will be treated as CSS modules 5 | * and scoped locally. 6 | */ 7 | 8 | .heroBanner { 9 | padding: 4rem 0; 10 | text-align: center; 11 | position: relative; 12 | overflow: hidden; 13 | } 14 | 15 | @media screen and (max-width: 966px) { 16 | .heroBanner { 17 | padding: 2rem; 18 | } 19 | } 20 | 21 | .buttons { 22 | display: flex; 23 | align-items: center; 24 | justify-content: center; 25 | } 26 | 27 | .features { 28 | display: flex; 29 | align-items: center; 30 | padding: 2rem 0; 31 | width: 100%; 32 | } 33 | 34 | .featureImage { 35 | height: 200px; 36 | width: 200px; 37 | } 38 | -------------------------------------------------------------------------------- /src/components/OptimizedImage/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Image from '@theme/IdealImage'; 3 | import useBaseUrl from '@docusaurus/useBaseUrl'; 4 | 5 | export default function OptimizedImage({src, alt, ...props}) { 6 | const imageSrc = useBaseUrl(src); 7 | 8 | // Check if the image is a GIF or SVG (don't optimize these) - case insensitive 9 | const srcLower = src.toLowerCase(); 10 | if (srcLower.endsWith('.gif') || srcLower.endsWith('.svg')) { 11 | return ( 12 | {alt} 18 | ); 19 | } 20 | 21 | // Use IdealImage for other formats (PNG, JPG, etc.) 22 | return ( 23 | {alt} 28 | ); 29 | } -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | const { FlatCompat } = require('@eslint/eslintrc'); 2 | const compat = new FlatCompat({ 3 | baseDirectory: __dirname, 4 | }); 5 | 6 | module.exports = [ 7 | ...compat.extends('@docusaurus/eslint-plugin/recommended'), 8 | { 9 | files: ['src/**/*.{js,jsx,ts,tsx}'], 10 | languageOptions: { 11 | ecmaVersion: 2020, 12 | sourceType: 'module', 13 | parserOptions: { 14 | ecmaFeatures: { 15 | jsx: true, 16 | }, 17 | }, 18 | globals: { 19 | window: 'readonly', 20 | document: 'readonly', 21 | console: 'readonly', 22 | process: 'readonly', 23 | require: 'readonly', 24 | module: 'readonly', 25 | __dirname: 'readonly', 26 | }, 27 | }, 28 | rules: { 29 | 'react/prop-types': 'off', 30 | '@docusaurus/string-literal-i18n-messages': 'off', 31 | }, 32 | }, 33 | { 34 | ignores: [ 35 | 'build/**', 36 | '.docusaurus/**', 37 | 'node_modules/**', 38 | ], 39 | }, 40 | ]; -------------------------------------------------------------------------------- /.github/workflows/claude.yml: -------------------------------------------------------------------------------- 1 | name: Claude PR Assistant 2 | 3 | on: 4 | issue_comment: 5 | types: [created] 6 | pull_request_review_comment: 7 | types: [created] 8 | issues: 9 | types: [opened, assigned] 10 | pull_request_review: 11 | types: [submitted] 12 | 13 | jobs: 14 | claude-code-action: 15 | if: | 16 | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || 17 | (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || 18 | (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || 19 | (github.event_name == 'issues' && contains(github.event.issue.body, '@claude')) 20 | runs-on: ubuntu-latest 21 | permissions: 22 | contents: read 23 | pull-requests: read 24 | issues: read 25 | id-token: write 26 | steps: 27 | - name: Checkout repository 28 | uses: actions/checkout@v5 29 | with: 30 | fetch-depth: 1 31 | 32 | - name: Run Claude PR Action 33 | uses: anthropics/claude-code-action@beta 34 | with: 35 | anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} 36 | timeout_minutes: "60" 37 | -------------------------------------------------------------------------------- /docs/booting/ipxe.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: ipxe 3 | title: Boot from iPXE 4 | sidebar_label: Boot from iPXE 5 | sidebar_position: 5 6 | description: "Details how to chainload into netboot.xyz from iPXE" 7 | hide_table_of_contents: true 8 | --- 9 | 10 | ### NIC with Embedded iPXE 11 | 12 | If you've already compiled your own iPXE, you can load up the netboot.xyz menu easily by entering CTRL-B when prompted, setting DHCP and then chainloading iPXE: 13 | 14 | ```bash 15 | dhcp 16 | chain --autofree https://boot.netboot.xyz 17 | ``` 18 | 19 | If you don't have DHCP on your network, you can manually set your network information: 20 | 21 | ```bash 22 | set net0/ip 23 | set net0/netmask 24 | set net0/gateway 25 | set dns 26 | ifopen net0 27 | chain --autofree https://boot.netboot.xyz 28 | ``` 29 | 30 | Some iPXE builds do not support HTTPS connections. If you get an "Operation not supported" error message, run this instead: 31 | 32 | ```bash 33 | chain --autofree http://boot.netboot.xyz 34 | ``` 35 | 36 | ### KVM 37 | 38 | On VPSes that use KVM, you can usually connect to the VPS via VNC, reboot it, press escape while rebooting to get a boot menu, then select the iPXE option. Once iPXE has started, press Ctrl-B and follow the instructions above. 39 | -------------------------------------------------------------------------------- /docs/docker/parameters.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Container Parameters 3 | sidebar_position: 3 4 | description: "netboot.xyz Docker Container Parameters" 5 | hide_table_of_contents: true 6 | --- 7 | 8 | Container images are configured using parameters passed at runtime. These parameters are separated by a colon and indicate `:` respectively. For example, `-p 8080:80` would expose port `80` from inside the container to be accessible from the host's IP on port `8080` outside the container. 9 | 10 | | Parameter | Function | 11 | | :-------: | ------- | 12 | | `-p 3000` | Web configuration interface. | 13 | | `-p 69/udp` | TFTP Port. | 14 | | `-p 80` | NGINX server for hosting assets. | 15 | | `-e WEB_APP_PORT=3000` | Specify a different port for the web configuration interface to listen on. | 16 | | `-e NGINX_PORT=80` | Specify a different port for NGINX service to listen on. | 17 | | `-e MENU_VERSION=2.0.84` | Specify a specific version of boot files you want to use from netboot.xyz (unset pulls latest) | 18 | | `-e TFTPD_OPTS='--tftp-single-port'` | Specify arguments for the TFTP server (this example makes TFTP send all data over port 69) | 19 | | `-v /config` | Storage for boot menu files and web application config | 20 | | `-v /assets` | Storage for netboot.xyz bootable assets (live CDs and other files) | 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # netboot.xyz documentation 2 | 3 | [![Build Status](https://github.com/netbootxyz/netboot.xyz-docs/actions/workflows/deploy.yml/badge.svg)](https://github.com/netbootxyz/netboot.xyz-docs/actions/workflows/deploy.yml) 4 | [![Discord](https://img.shields.io/discord/425186187368595466)](https://discord.gg/An6PA2a) 5 | 6 | This is the main documentation repository for [netboot.xyz](https://netboot.xyz) which is built upon [Docusaurus](https://docusaurus.io/), a modern static website generator. 7 | 8 | The contents of this repo are deployed automatically to netboot.xyz upon being merged. 9 | 10 | ## Development and Contributions 11 | 12 | Contributions to the documentation are always welcome. Please feel free to open pull requests to this repo if you see a bug, want to improve the existing documentation, or want to add some how-tos to help others. 13 | 14 | Ultimately this site is for helping others boot operating systems and using network booting related tools, so any documenation or articles that might be able to help others are welcome. 15 | 16 | ## Installation 17 | 18 | ```console 19 | yarn install 20 | ``` 21 | 22 | ## Local Development 23 | 24 | ```console 25 | yarn start 26 | ``` 27 | 28 | This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. 29 | 30 | ## Build 31 | 32 | ```console 33 | yarn build 34 | ``` 35 | 36 | This command generates static content into the `build` directory and can be served using any static contents hosting service. 37 | -------------------------------------------------------------------------------- /src/components/DownloadCard.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import clsx from 'clsx'; 4 | import styles from './DownloadCard.module.css'; 5 | 6 | const DownloadCard = ({ 7 | title, 8 | description, 9 | url, 10 | type, 11 | isRecommended = false, 12 | icon, 13 | }) => { 14 | const handleDownload = () => { 15 | window.open(url, '_blank'); 16 | }; 17 | 18 | return ( 19 |
22 | {isRecommended && ( 23 |
Recommended
24 | )} 25 | 26 |
27 | {icon &&
{icon}
} 28 |

{title}

29 | {type} 30 |
31 | 32 |

{description}

33 | 34 | 44 |
45 | ); 46 | }; 47 | DownloadCard.propTypes = { 48 | title: PropTypes.string.isRequired, 49 | description: PropTypes.string.isRequired, 50 | url: PropTypes.string.isRequired, 51 | type: PropTypes.string.isRequired, 52 | isRecommended: PropTypes.bool, 53 | icon: PropTypes.node, 54 | }; 55 | 56 | export default DownloadCard; 57 | -------------------------------------------------------------------------------- /docs/booting/iso.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: iso 3 | title: Boot from ISO 4 | sidebar_label: Boot from ISO 5 | sidebar_position: 2 6 | description: "How to use an ISO to boot into netboot.xyz" 7 | hide_table_of_contents: true 8 | --- 9 | 10 | ### Burning a CD/DVD 11 | 12 | To create a bootable CD-ROM/DVD, burn the ISO image [netboot.xyz.iso](https://boot.netboot.xyz/ipxe/netboot.xyz.iso) to a blank CD-ROM/DVD. Insert the media into the server, set the proper boot order and boot up. 13 | 14 | ### Virtual Machine Software 15 | 16 | You can also use these ISOs to boot any sort of VM in Citrix XenServer, Proxmox VE, VMware ESXi, VMware Fusion, VirtualBox. 17 | 18 | ### Out of Band Virtual Media 19 | 20 | The netboot.xyz ISO can be attached to remote virtual media of a server like the Dell DRAC or HP iLOs. Because the iPXE boot disk is so light weight, it is great for starting installations where there might be really low bandwidth as it will only stream the files needed for the installation. 21 | 22 | ### USB Bootable Virtual Media 23 | 24 | If you need to store a collection of ISOs, including netboot.xyz, on a single USB drive, there are some recommended devices that work well with netboot.xyz. You can copy multiple ISOs to the drive and mount them as a Virtual Disk during the boot process. This is useful not only for using netboot.xyz but also for other ISOs like Windows, Proxmox, or other media. It is a great way to have a portable collection of bootable media always ready to go! 25 | 26 | ![iodd-st400.png](../../static/img/iodd-st400.png) 27 | 28 | Recommended tools include: 29 | 30 | * [IODD ST400](https://amzn.to/42vm2By) 31 | * [IODD Mini USB 3.0 256-bit Secure Encrypted SSD Drive](https://amzn.to/4haXpOZ) 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "netboot-xyz", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "USE_SIMPLE_CSS_MINIFIER=true docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "serve": "docusaurus serve", 12 | "clear": "docusaurus clear", 13 | "lint": "eslint src --ext .js,.jsx,.ts,.tsx", 14 | "lint:fix": "eslint src --ext .js,.jsx,.ts,.tsx --fix", 15 | "format": "prettier --write src/**/*.{js,jsx,ts,tsx,css,md}", 16 | "format:check": "prettier --check src/**/*.{js,jsx,ts,tsx,css,md}" 17 | }, 18 | "dependencies": { 19 | "@docusaurus/core": "3.9.2", 20 | "@docusaurus/plugin-ideal-image": "3.9.2", 21 | "@docusaurus/preset-classic": "3.9.2", 22 | "@docusaurus/theme-mermaid": "3.9.2", 23 | "@docusaurus/theme-search-algolia": "3.9.2", 24 | "@mdx-js/react": "3.1.1", 25 | "clsx": "2.1.1", 26 | "eslint": "^9.29.0", 27 | "prism-react-renderer": "2.4.1", 28 | "react": "19.2.0", 29 | "react-dom": "19.2.0" 30 | }, 31 | "engines": { 32 | "node": ">=18.0" 33 | }, 34 | "browserslist": { 35 | "production": [ 36 | ">0.5%", 37 | "not dead", 38 | "not op_mini all" 39 | ], 40 | "development": [ 41 | "last 1 chrome version", 42 | "last 1 firefox version", 43 | "last 1 safari version" 44 | ] 45 | }, 46 | "devDependencies": { 47 | "@docusaurus/eslint-plugin": "^3.8.1", 48 | "@eslint/eslintrc": "^3.3.1", 49 | "eslint-config-prettier": "^10.1.8", 50 | "eslint-plugin-prettier": "^5.5.4", 51 | "prettier": "^3.6.2" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Layout from '@theme/Layout'; 4 | import Link from '@docusaurus/Link'; 5 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 6 | import useBaseUrl from '@docusaurus/useBaseUrl'; 7 | import ThemedImage from '@theme/ThemedImage'; 8 | import styles from './index.module.css'; 9 | import HomepageFeatures from '../components/HomepageFeatures'; 10 | 11 | function HomepageHeader() { 12 | const {siteConfig} = useDocusaurusContext(); 13 | return ( 14 |
15 |
16 | 23 |

{siteConfig.tagline}

24 |
25 | 26 | Get Started 27 | 28 |
29 |
30 |
31 | ); 32 | } 33 | 34 | export default function Home() { 35 | const {siteConfig} = useDocusaurusContext(); 36 | return ( 37 | 41 | 42 |
43 | 44 |
45 |
46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy 2 | on: 3 | push: 4 | branches: 5 | - master 6 | repository_dispatch: 7 | types: [build] 8 | workflow_dispatch: 9 | jobs: 10 | release: 11 | name: Build and deploy site 12 | runs-on: ubuntu-latest 13 | permissions: 14 | id-token: write 15 | contents: read 16 | if: "!contains(github.event.head_commit.message, '[skip ci]')" 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v5 20 | 21 | - name: Download external project files 22 | run: | 23 | wget https://raw.githubusercontent.com/netbootxyz/netboot.xyz/development/CHANGELOG.md -O external/changelog.md 24 | wget https://raw.githubusercontent.com/netbootxyz/build-pipelines/master/README.md -O external/build-automation.md 25 | wget https://raw.githubusercontent.com/netbootxyz/netboot.xyz/master/CONTRIBUTING.md -O external/contributing.md 26 | 27 | - name: Setup Node.js 28 | uses: actions/setup-node@v5 29 | with: 30 | node-version: 22 31 | 32 | - name: Install dependencies 33 | run: yarn install 34 | 35 | - name: Build static site 36 | run: yarn run build 37 | 38 | - name: Configure AWS credentials 39 | uses: aws-actions/configure-aws-credentials@v5 40 | with: 41 | role-to-assume: ${{ secrets.AWS_ROLE_DOCS }} 42 | aws-region: ${{ secrets.AWS_ACCESS_REGION }} 43 | 44 | - name: Deploy site to bucket 45 | run: | 46 | aws s3 sync --no-progress --acl public-read build s3://${{ secrets.BUCKET_SITE }} 47 | 48 | - name: Invalidate Cloudfront 49 | run: | 50 | aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID_SITE }} --paths "/*" 51 | -------------------------------------------------------------------------------- /docs/kb/pxe/almalinux.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: almalinux 3 | title: PXE Booting the AlmaLinux Installer 4 | sidebar_label: AlmaLinux 5 | description: PXE Booting the AlmaLinux Installer using Kickstart 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ## Installer Kernels 10 | 11 | AlmaLinux maintains installer kernels that are a lightweight way to load the installer and then stream packages over the network as needed. The installer kernels are located at: 12 | 13 | | URL | Description | 14 | | --- | ----------- | 15 | | `http://repo.almalinux.org`| Base URL for AlmaLinux mirrors | 16 | | `almalinux/${version}/BaseOS/${arch}/os/images/pxeboot/` | Directory containing the installer kernels | 17 | | `${version}` | Version (e.g., 8, 9, etc) | 18 | | `${arch}` | Architecture (e.g., x86_64, aarch64) | 19 | | `vmlinuz` | Kernel filename | 20 | | `initrd.img` | Initrd filename | 21 | 22 | In order to load them, you'll need to use a boot snippet in iPXE similar to: 23 | 24 | ```bash 25 | set install_params inst.ks=http://my.kickstart.com/ks.cfg inst.repo=http://repo.almalinux.org/almalinux/$version/BaseOS/$arch/os/ 26 | set mirror http://repo.almalinux.org 27 | set base_dir almalinux 28 | set version 8 29 | set arch x86_64 30 | set dir ${mirror}/${base_dir}/${version}/BaseOS/${arch}/os/images/pxeboot 31 | 32 | kernel ${dir}/vmlinuz ${install_params} -- quiet 33 | initrd ${dir}/initrd.img 34 | boot 35 | ``` 36 | 37 | If you want to use a [Kickstart](https://wiki.almalinux.org/documentation/kickstart.html) URL for automation, you can add this to the kernel line: 38 | 39 | ```bash 40 | set ksurl http://my.kickstart.com/ks.cfg 41 | inst.ks=${ksurl} 42 | ``` 43 | 44 | For more examples, you can view the netboot.xyz configuration for AlmaLinux [here](https://github.com/netbootxyz/netboot.xyz/blob/master/roles/netbootxyz/templates/menu/almalinux.ipxe.j2). 45 | -------------------------------------------------------------------------------- /blog/2021-09-04-site-updates.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2021/09/04/doc-site-updates 3 | title: Site Updates 4 | authors: 5 | - antonym 6 | tags: [site-updates, netboot.xyz] 7 | --- 8 | 9 | It has been a while since an update, but the main netboot.xyz site has a new look to it. I switched from using [Hugo](https://gohugo.io/) to using [Docusaurus](https://docusaurus.io/). I also moved the blog from [Ghost](https://ghost.org/) to simplify things. I started down this path a while back and recently got around to polishing it all up and pushing it out. I plan on building out more content and docs over time to make it a great resource for everything netboot related. At some point, I still would like to get some updated pictures, logos, etc as well but those are a much lower priority. 10 | 11 | 12 | 13 | I want to thank everyone who has contributed to the netboot.xyz community to this day. I originally started the project to create a quick way to install and test operating systems on VMs without having to download media and mount it everytime I needed to boot a new OS. It is great to see that it is helping out others on a day to day basis. We recently crossed 150,000 main menu loads over the past 30 days so it is great to see it being used worldwide. 14 | 15 | If you enjoy using netboot.xyz, please give us a star on [GitHub](https://github.com/netbootxyz/netboot.xyz) and follow us on [Twitter](https://twitter.com/netbootxyz). Please also consider supporting the project by donating to the [GitHub Sponsors](https://github.com/sponsors/netbootxyz) or [Open Collective](https://opencollective.com/netbootxyz). It helps us pay for infrastructure hosting and other costs like testing hardware, new architectures, and maintaining the project. 16 | 17 | We also have over 400 users in our [Discord](https://discord.gg/An6PA2a) and have a [Github Discussion Board](https://github.com/netbootxyz/netboot.xyz/discussions) where you can ask questions and discuss netboot.xyz. 18 | 19 | More to come! 20 | -------------------------------------------------------------------------------- /src/components/DownloadSection.module.css: -------------------------------------------------------------------------------- 1 | .downloadSection { 2 | margin-bottom: 3rem; 3 | } 4 | 5 | .sectionHeader { 6 | margin-bottom: 2rem; 7 | padding-bottom: 1rem; 8 | border-bottom: 2px solid var(--ifm-color-emphasis-200); 9 | } 10 | 11 | .collapsible { 12 | cursor: pointer; 13 | display: flex; 14 | align-items: center; 15 | justify-content: space-between; 16 | padding: 1rem; 17 | border: 1px solid var(--ifm-color-emphasis-200); 18 | border-radius: 8px; 19 | background: var(--ifm-background-surface-color); 20 | transition: all 0.2s ease; 21 | } 22 | 23 | .collapsible:hover { 24 | border-color: var(--ifm-color-primary); 25 | background: var(--ifm-color-emphasis-100); 26 | } 27 | 28 | .sectionTitle { 29 | margin: 0; 30 | color: var(--ifm-color-emphasis-800); 31 | font-size: 1.5rem; 32 | font-weight: 700; 33 | } 34 | 35 | .sectionDescription { 36 | margin: 0.5rem 0 0 0; 37 | color: var(--ifm-color-emphasis-600); 38 | font-size: 1rem; 39 | line-height: 1.5; 40 | min-height: 1.5rem; 41 | } 42 | 43 | .toggleButton { 44 | background: none; 45 | border: none; 46 | cursor: pointer; 47 | padding: 4px; 48 | color: var(--ifm-color-emphasis-600); 49 | transition: color 0.2s ease; 50 | } 51 | 52 | .toggleButton:hover { 53 | color: var(--ifm-color-primary); 54 | } 55 | 56 | .chevron { 57 | transition: transform 0.2s ease; 58 | } 59 | 60 | .chevron.expanded { 61 | transform: rotate(180deg); 62 | } 63 | 64 | .cardsGrid { 65 | display: grid; 66 | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); 67 | gap: 1.5rem; 68 | margin-top: 1.5rem; 69 | } 70 | 71 | @media (max-width: 768px) { 72 | .cardsGrid { 73 | grid-template-columns: 1fr; 74 | gap: 1rem; 75 | } 76 | 77 | .sectionTitle { 78 | font-size: 1.25rem; 79 | } 80 | 81 | .collapsible { 82 | flex-direction: column; 83 | align-items: flex-start; 84 | gap: 1rem; 85 | } 86 | 87 | .toggleButton { 88 | align-self: flex-end; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /docs/kb/pxe/rockylinux.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: rockylinux 3 | title: PXE Booting the Rocky Linux Installer 4 | sidebar_label: Rocky Linux 5 | description: PXE Booting the Rocky Linux Installer using Kickstart 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ## Installer Kernels 10 | 11 | Rocky Linux maintains installer kernels that are a lightweight way to load the installer and stream packages over the network as needed. Rocky Linux is a binary compatible clone of RHEL (Red Hat Enterprise Linux) and is already supported by numerous large, financially strong sponsors. 12 | 13 | The installer kernels are located at: 14 | 15 | | URL | Description | 16 | | --- | ----------- | 17 | | `http://dl.rockylinux.org` | Base URL for Rocky Linux mirrors | 18 | | `pub/rocky/${version}/BaseOS/${arch}/os/images/pxeboot/` | Directory containing the installer kernels | 19 | | `${version}` | Version (e.g., 8, 9, etc) | 20 | | `${arch}` | Architecture (e.g., x86_64, aarch64) | 21 | | `vmlinuz` | Kernel filename | 22 | | `initrd.img` | Initrd filename | 23 | 24 | In order to load them, you'll need to use a boot snippet in iPXE similar to: 25 | 26 | ```bash 27 | set install_params inst.ks=http://my.kickstart.com/ks.cfg inst.repo=http://dl.rockylinux.org/pub/rocky/${version}/BaseOS/${arch}/os 28 | set mirror http://dl.rockylinux.org 29 | set base_dir pub/rocky 30 | set version 9 31 | set arch x86_64 32 | set dir ${mirror}/${base_dir}/${version}/BaseOS/${arch}/os/images/pxeboot 33 | 34 | kernel ${dir}/vmlinuz ${install_params} -- quiet 35 | initrd ${dir}/initrd.img 36 | boot 37 | ``` 38 | 39 | If you want to use a [Kickstart](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/automatically_installing_rhel/automated-installation-workflow_rhel-installer) URL for automation, you can add this to the kernel line: 40 | 41 | ```bash 42 | set ksurl http://my.kickstart.com/ks.cfg 43 | inst.ks=${ksurl} 44 | ``` 45 | 46 | For more examples, you can view the netboot.xyz configuration for Rocky Linux [here](https://github.com/netbootxyz/netboot.xyz/blob/master/roles/netbootxyz/templates/menu/rockylinux.ipxe.j2). 47 | -------------------------------------------------------------------------------- /docs/community/nbxyz-users.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: nbxyz-users 3 | title: netboot.xyz around the Internet 4 | description: News, articles, and links from around the world related to netboot.xyz 5 | sidebar_label: Users 6 | hide_title: true 7 | hide_table_of_contents: true 8 | --- 9 | 10 | # netboot.xyz around the Internet 11 | 12 | ## Hacker News 13 | 14 | - [Netboot.xyz: your favorite operating systems in one place](https://news.ycombinator.com/item?id=31814288) (2022-06-19) 15 | - [Netboot Linux over the internet](https://news.ycombinator.com/item?id=14883590) (2017-07-29) 16 | - [Netboot](https://news.ycombinator.com/item?id=10923460) (2016-01-18) 17 | 18 | ## Podcasts 19 | 20 | - [LINUX Unplugged - EP 592: Chris' Netboot Nonsense](https://www.jupiterbroadcasting.com/show/linux-unplugged/592/) (2024-12-08) 21 | 22 | ## Youtube 23 | 24 | - [TechnoTim: Meet netboot.xyz - Network Boot Any Operating System](https://youtu.be/4btW5x_clpg) (2023-11-11) 25 | - [Linus Tech Tips: Download These Handy Tools NOW! Essential USB Tools](https://youtu.be/0EtgwIajVqs?t=426) (2023-07-19) 26 | 27 | ## Hosting Providers 28 | 29 | - [1gservers](https://1gservers.com/blog/system-administration/booting-into-netboot-xyz-is-now-supported/) 30 | - [Equinix Metal](https://deploy.equinix.com/developers/docs/metal/operating-systems/custom-ipxe/) 31 | - [ExtraVM](https://extravm.com/billing/knowledgebase/39/Can-I-use-my-own-ISO-on-VPS.html) 32 | - [Leaseweb](https://kb.leaseweb.com/products/dedicated-server/installing-servers-using-your-own-pxe-boot-environment/) 33 | - [MVPS](https://www.mvps.net/docs/how-to-use-netboot-xyz-iso-to-install-other-operating-systems-on-your-vps/) 34 | - [Vultr](https://www.vultr.com/docs/ipxe-boot-feature/) 35 | 36 | ## Open Source Projects 37 | 38 | - [JetKVM - Hardware KVM with suppport for netboot.xyz](https://jetkvm.com/) 39 | - [Quickemu](https://github.com/quickemu-project/quickemu) 40 | - [Tinkerbell](https://tinkerbell.org/examples/netboot-xyz/) 41 | - [u-root](https://github.com/u-root/u-root/blob/main/cmds/exp/netbootxyz/netbootxyz.go) 42 | 43 | And many other places as well. If you find us somewhere on the net, update this page! 44 | -------------------------------------------------------------------------------- /blog/2015-11-25-introducing-netboot-xyz.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2015/11/25/introducing-netboot-xyz 3 | authors: 4 | - antonym 5 | title: Introducing netboot.xyz 6 | tags: [netboot.xyz] 7 | --- 8 | 9 | My newest project on the side is [netboot.xyz](https://netboot.xyz). If you've seen [boot.rackspace.com](http://boot.rackspace.com), this should look pretty familiar to you. I ran across cheap .xyz domains from [Namecheap](https://www.namecheap.com) (one dollar at the time!), and figured the netboot.xyz name space was much easier to remember and was more neutral to the goal I was trying to accomplish. I forked boot.rackspace.com (still doing basic maintenance) and am now focusing my efforts on netboot.xyz. 10 | 11 | 12 | 13 | My goal with the project is to make it easy as possible to boot many of the popular operating systems from bare metal, virtual machines, etc without the hassle of hunting down the latest ISO for the OS you want to download. Ideally it's usable with any service provider or just someone who maintains their own servers. 14 | 15 | I usually try and use operating systems that make their boot loaders available via mirrors, although there are occasionally some exceptions. I'm also experimenting with various new builds like WinPE, Live Booted OS, and I'd like to even pursue getting some hypervisors on there as well to make it as easy as possible to install everything. 16 | 17 | It's also a great place to just let people play around with new operating systems with just a menu and learn about the many many distributions out there. 18 | 19 | Check it out when you get a chance and drop me some feedback or make a pull request if you see something I'm missing. I've added a really easy way to test your pull request from the utility menu, all you need to do is enter in your github username and branch or hash of the commit you want to test. 20 | 21 | I'm still working on a bunch of [documents](http://netbootxyz.readthedocs.org/en/latest/) for demonstrating how easy it is to plug the 1MB [iPXE](https://ipxe.org) ISO into things like VMware Fusion, Virtual Box, Openstack, so bear with me while I try and get all of those available. 22 | 23 | Enjoy! 24 | -------------------------------------------------------------------------------- /src/components/DownloadSection.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react'; 2 | import clsx from 'clsx'; 3 | import DownloadCard from './DownloadCard'; 4 | import styles from './DownloadSection.module.css'; 5 | import PropTypes from 'prop-types'; 6 | 7 | const DownloadSection = ({ 8 | title, 9 | description, 10 | downloads, 11 | isCollapsible = false, 12 | defaultExpanded = true, 13 | }) => { 14 | const [isExpanded, setIsExpanded] = useState(defaultExpanded); 15 | 16 | const toggleExpanded = () => { 17 | if (isCollapsible) { 18 | setIsExpanded(!isExpanded); 19 | } 20 | }; 21 | 22 | return ( 23 |
24 |
31 |

{title}

32 | {description && ( 33 |

{description}

34 | )} 35 | {isCollapsible && ( 36 | 47 | )} 48 |
49 | 50 | {(!isCollapsible || isExpanded) && ( 51 |
52 | {downloads.map((download, index) => ( 53 | 54 | ))} 55 |
56 | )} 57 |
58 | ); 59 | }; 60 | DownloadSection.propTypes = { 61 | title: PropTypes.string, 62 | description: PropTypes.string, 63 | downloads: PropTypes.arrayOf(PropTypes.object).isRequired, 64 | isCollapsible: PropTypes.bool, 65 | defaultExpanded: PropTypes.bool, 66 | }; 67 | 68 | export default DownloadSection; 69 | -------------------------------------------------------------------------------- /docs/booting/qemu.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: qemu 3 | title: QEMU 4 | sidebar_label: Boot with QEMU 5 | sidebar_position: 6 6 | description: "Methods of booting into netboot.xyz using QEMU" 7 | hide_table_of_contents: true 8 | --- 9 | ### Overview 10 | 11 | A quick way to try out netboot.xyz without any modifications to your existing environment is to leverage QEMU. You can start up a virtual machine to evaluate what netboot.xyz is and how it works. You will need the qemu-system package for your appropriate operating system and a window manager installed. In the example below we are using Ubuntu 20.04. 12 | 13 | ### Install dependencies 14 | 15 | ```bash 16 | # install the qemu-system package 17 | sudo apt-get install -y qemu-system ovmf 18 | 19 | # download the latest combined Legacy and EFI iso 20 | wget https://boot.netboot.xyz/ipxe/netboot.xyz.iso 21 | ``` 22 | 23 | If you want to write to a disk, you can set one at this point, or optionally you can boot without a disk if you want to test drive netboot.xyz: 24 | 25 | ### Create a disk (optional) 26 | 27 | ```bash 28 | qemu-img create -f raw vmdisk 8G 29 | 30 | # add the following to end of the qemu-system lines below if you want to add a disk to write to: 31 | # -drive file=vmdisk,format=raw 32 | ``` 33 | 34 | ### Booting with Legacy PCBIOS 35 | 36 | ```bash 37 | qemu-system-x86_64 -cdrom netboot.xyz.iso -m 4G 38 | ``` 39 | 40 | ### Booting with a UEFI BIOS 41 | 42 | ```bash 43 | qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -cdrom netboot.xyz.iso -m 4G 44 | ``` 45 | 46 | ### Booting on MacOS Apple Silicon (M1) 47 | 48 | ```bash 49 | $ brew install qemu 50 | $ qemu-system-aarch64 --version 51 | QEMU emulator version 7.1.0 52 | $ qemu-system-aarch64 -cpu host -M virt,accel=hvf -m 4G \ 53 | -drive file=/opt/homebrew/share/qemu/edk2-aarch64-code.fd,if=pflash,format=raw,readonly=on \ 54 | -kernel netboot.xyz-arm64.efi \ 55 | -serial stdio \ 56 | -device virtio-gpu-pci \ 57 | -device nec-usb-xhci -device usb-kbd 58 | ``` 59 | 60 | :::note 61 | At least 4GB of memory is recommended for some of the images that are loaded into RAM. If you experience problems during initrd load, the machine usually just needs more RAM. 62 | ::: 63 | -------------------------------------------------------------------------------- /docs/kb/providers/equinixmetal.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: equinixmetal 3 | title: Equinix Metal 4 | description: Using netboot.xyz with Equinix Metal bare metal servers 5 | hide_table_of_contents: true 6 | --- 7 | 8 | [Equinix Metal](https://metal.equinix.com) fully supports netboot.xyz with its Custom iPXE 9 | operating system. 10 | 11 | ### Usage 12 | 13 | Select the "Custom iPXE" operating system from the portal, or the `custom_ipxe` 14 | slug when using the API. 15 | 16 | ### Provisioning 17 | 18 | Put the netboot.xyz URL in the text field that appears in the portal, or use the 19 | `ipxe_script_url` parameter when creating the device via the API. 20 | 21 | ``` 22 | https://boot.netboot.xyz 23 | ``` 24 | 25 | Press "Deploy" to provision your device. It will take 2-3 minutes for the device 26 | to become active. Once it's online, connect to Equinix Metal's out-of-band 27 | serial-over-SSH service (S.O.S.) using the device's `id` and the facility where 28 | the device was deployed, e.g. `ewr1`. 29 | 30 | ``` 31 | ssh {server-uuid}@sos.{facility-code}.platformequinix.com 32 | ``` 33 | 34 | The current list of facilities is [here](https://metal.equinix.com/product/locations). The 35 | netboot.xyz iPXE menu will appear and you can complete installation from there. 36 | 37 | :::note 38 | 39 | By default, devices are set to boot from the local disk. During 40 | provisioning, Equinix Metal sets the next boot to PXE. This happens once, which means that 41 | if you don't install an operating system before rebooting, it won't reload the 42 | netboot.xyz menu. However, you can set your device to always boot to iPXE 43 | first by enabling that option under 'server actions' through the customer portal. 44 | 45 | ::: 46 | 47 | ### Networking 48 | 49 | Devices that are provisioned via Custom iPXE will be able to DHCP for the life of 50 | the device; however, Equinix Metal recommends configuring networking statically. IP 51 | address information can be found by querying https://metadata.platformequinix.com/metadata 52 | from the host. 53 | 54 | More information on how Equinix Metal configures bonding can be found 55 | [here](https://deploy.equinix.com/developers/docs/metal/layer2-networking/overview/). 56 | 57 | Nameservers should be configured as: 58 | 59 | ``` 60 | nameserver 147.75.207.207 61 | nameserver 147.75.207.208 62 | ``` 63 | -------------------------------------------------------------------------------- /docs/kb/hardware/steamdeck.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: steamdeck 3 | title: PXE Booting on the Steam Deck 4 | sidebar_label: Steam Deck 5 | description: PXE Booting on the Steam Deck 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ## Overview 10 | 11 | This is a guide to PXE booting the [Valve Steam Deck](https://amzn.to/4jBYBwv). 12 | 13 | ## Requirements 14 | 15 | To get the Steam Deck to PXE boot, you will need: 16 | 17 | - [USB-C Hub](https://amzn.to/3PRGzc4) that supports Ethernet and USB 18 | - USB Keyboard 19 | - Hard Wired Ethernet 20 | 21 | Connect the hub, ethernet, and power up to the Steam Deck. The first thing you will want to do is set the BIOS to allow for PXE booting. 22 | 23 | ## BIOS Configuration 24 | 25 | To bring up the Steam Deck Boot Loader menus, shutdown the Steam Deck and: 26 | 27 | - Hold down `Volume +`, while pressing the power button `on` to access the Boot Manager, Setup Utility and Boot from File Menu. (`Volume -` will bring up just the Boot Manager) 28 | - Select Setup Utility to enter into the Setup. 29 | - Move down to the Boot Tab on the left and change these settings: 30 | - Quick Boot: Disabled 31 | - Quiet Boot: Disabled 32 | - PXE Boot Capability: UEFI: IPv4 (Can change to what is appropriate for your network) 33 | - Add Boot Options: First 34 | - Select Exit and Exit Saving Changes. 35 | 36 | ## PXE Booting 37 | 38 | The Steam Deck will now reboot and you will now see the Memory test as Quiet Boot has been disabled. If your Hub is connected to the network properly, and you have DHCP on the network, you should see: 39 | 40 | ```shell 41 | >>Start PXE over IPv4... 42 | ``` 43 | 44 | At this point you should be able to PXE boot a UEFI image. 45 | 46 | Use the: 47 | 48 | - [netboot.xyz UEFI kernel](https://boot.netboot.xyz/ipxe/netboot.xyz.efi) 49 | - Set DHCP [next-server](https://netboot.xyz/docs/booting/tftp) to TFTP server, and filename to the netboot.xyz UEFI image on the DHCP server 50 | 51 | If you happen to break the Steam Deck when testing Operating Systems or tinkering with it, you can follow the Steam Deck Recovery Instructions [here](https://help.steampowered.com/en/faqs/view/1B71-EDF2-EB6D-2BB3). 52 | 53 | If you want to set the BIOS back to the default settings, you can load the BIOS back up, select Restore Defaults, and Exit Saving Changes. That will return the Steam Deck back to its original behavior. 54 | -------------------------------------------------------------------------------- /docs/kb/pxe/debian.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: debian 3 | title: PXE Booting the Debian Installer 4 | sidebar_label: Debian 5 | description: PXE Booting the Debian Installer 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ## Installer Kernels 10 | 11 | Debian maintains installer kernels that are a lightweight way to load the Debian installer and then stream packages over the network as needed. The installer kernels are located at: 12 | 13 | | URL | Description | 14 | | --- | ----------- | 15 | | `http://deb.debian.org` | Base URL for Debian mirrors | 16 | | `debian/dists/${version}/main/installer-${arch}/current/images/netboot/` | Directory containing the installer kernels | 17 | | `${version}` | Version (e.g., bullseye, bookworm, etc) | 18 | | `${arch}` | Architecture (e.g., amd64, arm64) | 19 | | `linux` | Kernel filename | 20 | | `initrd.gz` | Initrd filename | 21 | 22 | In order to load them, you'll need to use a boot snippet in iPXE similar to: 23 | 24 | ```bash 25 | set install_params auto=true priority=critical 26 | set mirror http://deb.debian.org 27 | set base_dir debian 28 | set debian_version bookworm 29 | set arch amd64 30 | set mirrorcfg mirror/suite=${debian_version} 31 | set dir ${mirror}/${base_dir}/dists/${version}/main/installer-${arch}/current/images/netboot/debian-installer/amd64/ 32 | 33 | kernel ${dir}/linux ${install_params} ${mirrorcfg} -- quiet initrd=initrd.gz 34 | initrd ${dir}/initrd.gz 35 | boot 36 | ``` 37 | 38 | If you want to use a [preseed](https://www.debian.org/releases/stable/amd64/apb.en.html) URL for automation, you can add this to the kernel line: 39 | 40 | ```bash 41 | set preseedurl http://my.preseed.com/preseed.cfg 42 | preseed/url=${preseedurl} 43 | ``` 44 | 45 | For more examples, you can view the netboot.xyz configuration for Debian [here](https://github.com/netbootxyz/netboot.xyz/blob/master/roles/netbootxyz/templates/menu/debian.ipxe.j2). 46 | 47 | ## Live Boot 48 | 49 | Debian also provides a number of Live Boot ISOs that will boot an OS directly into memory and can be used immediately without doing an install or modifying the hard drive. The Live OS will also include the installer as well. These are great for evaluating other desktops that you might want to try out without doing a full install. 50 | 51 | | Distribution | Website | 52 | | :--- | :--- | 53 | | Debian Live | [https://www.debian.org/CD/live/](https://www.debian.org/CD/live/) | 54 | -------------------------------------------------------------------------------- /docs/kb/networking/mikrotik.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: mikrotik 3 | title: "Mikrotik RouterOS" 4 | description: Mikrotik RouterOS Usage 5 | hide_table_of_contents: true 6 | --- 7 | 8 | ### Assumptions 9 | 10 | - You are running RouterOS 7.12.1 or later 11 | - You have a DHCP server, whose name you will substitute in instead of DHCPSERVER 12 | - You have a DHCP address pool whose name you will substitute in instead of DHCPPOOL 13 | 14 | The steps referencing servers and pools can be repeated for as many servers and pools as you need. 15 | 16 | ### Disable BOOTP support for the server 17 | 18 | ``` 19 | /ip dhcp-server/set DHCPSERVER bootp-support=none 20 | ``` 21 | 22 | ### BIOS 23 | 24 | Download `netboot.xyz.kpxe` and register it to the TFTP server: 25 | 26 | ``` 27 | /tool fetch url="https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe" 28 | /ip tftp add req-filename=netboot.xyz.kpxe real-filename=netboot.xyz.kpxe allow=yes read-only=yes 29 | ``` 30 | 31 | Add a DHCP option for the BIOS bootfile and add it to a BIOS PXE boot option set: 32 | 33 | ``` 34 | /ip dhcp-server option add code=67 name=pxe-bios-netboot.xyz value="'netboot.xyz.kpxe'" 35 | /ip dhcp-server/option/sets add name="pxe-bios" options=pxe-bios-netboot.xyz 36 | ``` 37 | 38 | Set the BIOS PXE boot option set as the server's option set. 39 | 40 | ``` 41 | /ip dhcp-server/set DHCPSERVER dhcp-option-set=pxe-bios 42 | ``` 43 | 44 | NOTE: If you have an existing option set, you should skip creating a new option set and should instead add the PXE BIOS bootfile option to your existing option set. 45 | 46 | ### UEFI 47 | 48 | Download `netboot.xyz.efi` and register it to the TFTP server: 49 | 50 | ``` 51 | /tool fetch url="https://boot.netboot.xyz/ipxe/netboot.xyz.efi" 52 | /ip tftp add req-filename=netboot.xyz.efi real-filename=netboot.xyz.efi allow=yes read-only=yes 53 | ``` 54 | 55 | Add a DHCP option for the UEFI bootfile and add it to a UEFI PXE boot option set: 56 | 57 | ``` 58 | /ip dhcp-server option add code=67 name=pxe-uefi-netboot.xyz value="'netboot.xyz.efi'" 59 | /ip dhcp-server/option/sets add name="pxe-uefi" options=pxe-uefi-netboot.xyz 60 | ``` 61 | 62 | Add a DHCP matcher that looks for the 0x0007 (x86-64 UEFI) architecture type and applies the PXE UEFI option set, overriding the default PXE BIOS options: 63 | 64 | ``` 65 | /ip dhcp-server/matcher/add name="pxe-uefi-matcher" server=DHCPSERVER address-pool=DHCPPOOL option-set=pxe-uefi code=93 value="0x0007" 66 | ``` 67 | -------------------------------------------------------------------------------- /docs/kb/providers/linode.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: linode 3 | title: Linode 4 | description: Using netboot.xyz on Linode 5 | hide_table_of_contents: true 6 | --- 7 | 8 | netboot.xyz can be loaded on a [Linode](https://linode.com) instance so that you can then customize the Linode as needed. For this method, we'll use the smallest Linode size running Debian. 9 | 10 | ### Create a Linode 11 | 12 | For this method, it's recommended to use an apt-based distro like Debian or Ubuntu. Start a Linode with one of those operating systems. Once it is up and running, connect to it via SSH or connect to it with the console button. 13 | 14 | ### Install GRUB Imageboot and Download ISO 15 | 16 | We will need to ensure that the GRUB menu pauses long enough for us to select the netboot.xyz option. For that we'll need to remove a timeout file and increase the timeout for GRUB. Adjust the time period as needed for your 17 | situation: 18 | 19 | ```shell 20 | # Increase grub timeout if desired 21 | sed -i 's/GRUB_TIMEOUT=5/GRUB_TIMEOUT=60/g' /etc/default/grub 22 | 23 | # Install grub-imageboot 24 | apt update 25 | apt install -y grub-imageboot 26 | 27 | # Download netboot.xyz ISO 28 | mkdir /boot/images 29 | cd /boot/images 30 | wget https://boot.netboot.xyz/ipxe/netboot.xyz.iso 31 | 32 | # Update GRUB menu to include this ISO 33 | update-grub2 34 | 35 | # reboot once you are ready, it may be good to load up the recovery console first 36 | reboot 37 | ``` 38 | 39 | ### Launch LISH Console 40 | 41 | Under the Linode settings click ..., and select Launch LISH Console. For interraction with the GRUB Menu and netboot.xyz menus, you will need to click the Weblish tab. For interacting with an installer or other tool, you may need to use the Glish tab (Graphical). 42 | 43 | At this point if you are within the timeout window, you should now see the Grub menu with the following option now available which you can select to load the netwboot.xyz menu: 44 | 45 | ```bash 46 | Bootable ISO image: netboot.xyz 47 | ``` 48 | 49 | ### Networking 50 | 51 | Linode uses DHCP so netboot.xyz should be able to get an IP address and load up the menu. If DHCP does not work, you may need to use the alternative failsafe menu to set up the networking for the instance manually by pressing **m** when prompted for the failsafe menu. 52 | 53 | If you do a installation, you should be able to reinstall over the existing drive at that point and customize the Linode as you see fit. Keep the networking information handy as you will need to populate that when doing an install. 54 | 55 | :::info 56 | If you run into out of memory issues running an installer, you may need a larger Linode. 57 | ::: 58 | -------------------------------------------------------------------------------- /src/pages/downloads.module.css: -------------------------------------------------------------------------------- 1 | .downloadsPage { 2 | padding: 2rem 0 4rem; 3 | min-height: calc(100vh - 200px); 4 | } 5 | 6 | .pageHeader { 7 | text-align: center; 8 | margin-bottom: 4rem; 9 | padding-bottom: 2rem; 10 | border-bottom: 3px solid var(--ifm-color-primary); 11 | } 12 | 13 | .pageHeader h1 { 14 | font-size: 3rem; 15 | font-weight: 800; 16 | color: var(--ifm-color-emphasis-800); 17 | margin-bottom: 1rem; 18 | background: linear-gradient( 19 | 135deg, 20 | var(--ifm-color-primary), 21 | var(--ifm-color-primary-dark) 22 | ); 23 | background-clip: text; 24 | -webkit-background-clip: text; 25 | -webkit-text-fill-color: transparent; 26 | } 27 | 28 | .pageDescription { 29 | font-size: 1.2rem; 30 | color: var(--ifm-color-emphasis-700); 31 | max-width: 800px; 32 | margin: 0 auto 2rem; 33 | line-height: 1.6; 34 | } 35 | 36 | .infoBox { 37 | background: var(--ifm-color-info-contrast-background); 38 | border: 1px solid var(--ifm-color-info); 39 | border-radius: 8px; 40 | padding: 1rem 1.5rem; 41 | margin: 0 auto; 42 | max-width: 600px; 43 | } 44 | 45 | .infoBox p { 46 | margin: 0; 47 | color: var(--ifm-color-info-contrast-foreground); 48 | } 49 | 50 | .infoBox a { 51 | color: var(--ifm-color-info-dark); 52 | font-weight: 600; 53 | text-decoration: underline; 54 | } 55 | 56 | .infoBox a:hover { 57 | color: var(--ifm-color-info-darker); 58 | } 59 | 60 | .checksumsSection { 61 | margin-top: 4rem; 62 | padding: 2rem; 63 | background: var(--ifm-color-emphasis-100); 64 | border-radius: 12px; 65 | border-left: 4px solid var(--ifm-color-warning); 66 | } 67 | 68 | .checksumsSection h3 { 69 | margin-top: 0; 70 | color: var(--ifm-color-emphasis-800); 71 | font-size: 1.3rem; 72 | } 73 | 74 | .checksumsSection p { 75 | margin-bottom: 0; 76 | color: var(--ifm-color-emphasis-700); 77 | line-height: 1.6; 78 | } 79 | 80 | .checksumsSection a { 81 | color: var(--ifm-color-primary); 82 | font-weight: 600; 83 | } 84 | 85 | .checksumsSection a:hover { 86 | color: var(--ifm-color-primary-dark); 87 | text-decoration: underline; 88 | } 89 | 90 | @media (max-width: 768px) { 91 | .downloadsPage { 92 | padding: 1rem 0 2rem; 93 | } 94 | 95 | .pageHeader { 96 | margin-bottom: 2rem; 97 | padding-bottom: 1rem; 98 | } 99 | 100 | .pageHeader h1 { 101 | font-size: 2rem; 102 | } 103 | 104 | .pageDescription { 105 | font-size: 1rem; 106 | } 107 | 108 | .checksumsSection { 109 | margin-top: 2rem; 110 | padding: 1.5rem; 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /docs/booting/usb.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: usb 3 | title: Boot from USB 4 | sidebar_label: Boot from USB 5 | sidebar_position: 1 6 | description: "How to create a USB stick capable of booting into netboot.xyz" 7 | hide_table_of_contents: true 8 | --- 9 | :::danger 10 | Backup your important data before writing the USB as it will overwrite anything on the USB key. 11 | ::: 12 | 13 | To boot netboot.xyz from a [USB key](https://amzn.to/3CD0BE5), you will need to write the netboot.xyz image to the key. This enables you to boot into netboot.xyz on any machine that supports USB booting. 14 | 15 | You can download the `netboot.xyz.img` USB disk image [here](https://boot.netboot.xyz/ipxe/netboot.xyz.img). 16 | 17 | ## Creating USB Key on Linux 18 | 19 | Insert a USB key in your computer and find the device name. Then use following command: 20 | 21 | ```shell 22 | cat netboot.xyz.img > /dev/sdX 23 | ``` 24 | 25 | or you can run the following command: 26 | 27 | ```shell 28 | dd if=netboot.xyz.img of=/dev/sdX 29 | ``` 30 | 31 | where sdX is your usb drive. The USB key should be ready to eject once finished. 32 | 33 | ## Creating USB Key on MacOS 34 | 35 | __To get the current list of devices, run:__ 36 | 37 | ```shell 38 | diskutil list 39 | ``` 40 | 41 | __Insert the flash media and run once again to determine the device node assigned to your flash media (e.g. /dev/disk2):__ 42 | 43 | ```shell 44 | diskutil list 45 | ``` 46 | 47 | __Run the following, replacing N with the disk number from the last command (in the previous example, N would be 2):__ 48 | 49 | ```shell 50 | diskutil unmountDisk /dev/diskN 51 | ``` 52 | 53 | __Now write the disk image to the flash media by running:__ 54 | 55 | ```shell 56 | sudo dd if=netboot.xyz.img of=/dev/rdiskN bs=1m 57 | ``` 58 | 59 | * Using /dev/rdisk instead of /dev/disk may be faster 60 | * If you see the error dd: Invalid number '1m', you are using GNU dd. Use the same command but replace bs=1m with bs=1M 61 | * If you see the error dd: /dev/diskN: Resource busy, make sure the disk is not in use. Start the 'Disk Utility.app' and unmount (don't eject) the drive 62 | 63 | __Now run and remove your flash media when the command completes:__ 64 | 65 | ```shell 66 | diskutil eject /dev/diskN 67 | ``` 68 | 69 | ## Creating USB Key on Windows 70 | 71 | For creating a USB Key on a Windows device, you can check out [Rufus](https://rufus.akeo.ie/) to install the image file to a USB key. 72 | 73 | ## Booting from the USB Key 74 | 75 | Once you've created your key, reboot and set your BIOS to load the USB key first if it's not set for that already. You should see iPXE load up either load up netboot.xyz automatically or you will be prompted to set your networking information up. 76 | -------------------------------------------------------------------------------- /docs/booting/tftp.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: tftp 3 | title: Boot from TFTP 4 | sidebar_label: Boot from TFTP 5 | sidebar_position: 3 6 | description: "Methods of booting into netboot.xyz using TFTP and DHCP" 7 | hide_table_of_contents: true 8 | --- 9 | 10 | If you want to utilize netboot.xyz from your home or office network, it's relatively easy to set up. It will allow all of your devices on your network to have netboot.xyz available whenever you need it by just changing the boot order on your device, selecting network boot, or manually selecting the device to boot. 11 | 12 | ### DHCP Server Setup 13 | 14 | You will have to tell your DHCP server to provide a "next-server", the address of a TFTP server on your network, and a "filename", the netboot.xyz boot file (you can choose among different architecture systems [here](https://netboot.xyz/downloads/). When your clients boot up, if they are set to network boot, they'll automatically get a valid DHCP address, pull down the netboot.xyz iPXE bootloader and load up the Operating System menu. 15 | 16 | Example: 17 | 18 | ``` 19 | next-server "1.2.3.4" 20 | filename "netboot.xyz.kpxe" 21 | ``` 22 | 23 | If you are using [dnsmasq as your DHCP server](https://wiki.archlinux.org/index.php/dnsmasq#DHCP_server) as well as your TFTP server then setting the next-server option is as simple as adding the following line to `/etc/dnsmasq.conf`: 24 | 25 | ``` 26 | dhcp-option=66,"0.0.0.0" 27 | ``` 28 | 29 | `0.0.0.0` is parsed as the address of the machine running dnsmasq. 30 | 31 | ### TFTP Server Setup 32 | 33 | You will need to set up a tftp server to host the iPXE files. There are various types of TFTP servers out there and they all usually work pretty well. You can also use dnsmasq to host the files as well. 34 | 35 | If you use dnsmasq you can add this configuration to `/etc/dnsmasq.conf`: 36 | 37 | ``` 38 | enable-tftp 39 | tftp-root=/var/lib/tftp 40 | dhcp-boot=netboot.xyz.kpxe 41 | ``` 42 | 43 | ### Fixing the dnsmasq service 44 | 45 | If you are running systemd and you can start dnsmasq fine manually but it fails to start at boot you may need to edit the [Unit] section of `/lib/systemd/system/dnsmasq.service` by changing: 46 | 47 | ``` 48 | After=network.target 49 | ``` 50 | 51 | to 52 | 53 | ``` 54 | After=network-online.target 55 | ``` 56 | 57 | ### Regular and Undionly Boot Files 58 | 59 | If you experiencing issues with the regular [netboot.xyz.kpxe](https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe) bootloader, you can try and use the [netboot.xyz-undionly.kpxe](https://boot.netboot.xyz/ipxe/netboot.xyz-undionly.kpxe) bootloader. The regular bootloader includes common NIC drivers in the iPXE image, while the undionly loader will piggyback off the NIC boot firmware. 60 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures.js: -------------------------------------------------------------------------------- 1 | import React, {Suspense, lazy} from 'react'; 2 | import clsx from 'clsx'; 3 | import styles from './HomepageFeatures.module.css'; 4 | import useBaseUrl from '@docusaurus/useBaseUrl'; 5 | 6 | const ThemedImage = lazy(() => import('@theme/ThemedImage')); 7 | 8 | // List of features to be displayed on the homepage 9 | const FeatureList = [ 10 | { 11 | title: 'Simple to Use', 12 | Svg: ['./img/nbxyz-user.svg', './img/nbxyz-user.svg'], 13 | description: ( 14 | <> 15 | netboot.xyz enables you to boot into many types of operating systems 16 | using lightweight tooling to get you up and running as soon as possible. 17 | 18 | ), 19 | }, 20 | { 21 | title: 'Evaluate, Install, Rescue', 22 | Svg: ['./img/nbxyz-laptop.gif', './img/nbxyz-laptop.gif'], 23 | description: ( 24 | <> 25 | Discover new operating systems without having to download and rewrite 26 | media over and over again. Rescue operating systems from a single image. 27 | An essential for any sysadmin. 28 | 29 | ), 30 | }, 31 | { 32 | title: 'Powered by the iPXE project', 33 | Svg: ['./img/ipxechip.svg', './img/ipxechip.svg'], 34 | description: ( 35 | <> 36 | netboot.xyz uses the iPXE project to enable you to provision, rescue or 37 | load into a live boot environment leveraging the Preboot Execution 38 | Environment (PXE) on most systems. 39 | 40 | ), 41 | }, 42 | ]; 43 | 44 | // LazyImage component to lazy load images 45 | const LazyImage = ({sources, alt, className}) => ( 46 | Loading...}> 47 | 48 | 49 | ); 50 | 51 | // Feature component to display individual features 52 | function Feature({Svg, title, description}) { 53 | return ( 54 |
55 |
56 | 64 |
65 |
66 |

{title}

67 |

{description}

68 |
69 |
70 | ); 71 | } 72 | 73 | export default function HomepageFeatures() { 74 | return ( 75 |
76 |
77 |
78 | {FeatureList.map((props, idx) => ( 79 | 80 | ))} 81 |
82 |
83 |
84 | ); 85 | } 86 | -------------------------------------------------------------------------------- /blog/2025-03-28-10k-github-stars.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2025/03/28/10k-github-stars 3 | title: 10,000 GitHub Stars! 4 | authors: 5 | - antonym 6 | tags: [milestone, site-updates, netboot.xyz, ipxe, github] 7 | --- 8 | 9 | We are thrilled to announce that netboot.xyz has reached a significant milestone: **10,000 GitHub stars**! This achievement represents more than just a number - it's a testament to the incredible community support and the usefulness of the project to system administrators, developers, and technology enthusiasts worldwide. 10 | 11 | 12 | 13 | ## One Million Menu Loads Monthly 14 | 15 | Along with reaching 10k stars, we are now seeing over **1 million menu loads per month** worldwide! This level of usage demonstrates how essential netboot.xyz has become for many of you in your daily workflows - whether you're deploying operating systems, performing system recovery, or using our utilities for maintenance tasks. 16 | 17 | ## A Thank You to the iPXE Project 18 | 19 | This milestone would not have been possible without the foundation provided by the [iPXE project](https://ipxe.org/). We owe a special debt of gratitude to Michael Brown, the lead developer of iPXE, whose vision and dedication have created the robust network boot framework that powers netboot.xyz. 20 | 21 | The entire iPXE community also deserves recognition for their continuous improvements, bug fixes, and new features that enable netboot.xyz to support a wide range of hardware and boot scenarios. Their commitment to open source has directly contributed to our success. 22 | 23 | ## Looking Forward 24 | 25 | As we celebrate this milestone, we are more motivated than ever to improve netboot.xyz and add even more features that make network booting simpler and more powerful. Some of our plans include: 26 | 27 | - Continuing to add support for more operating systems and utilities 28 | - Improving the user experience for both novice and advanced users 29 | - Enhancing our documentation to help new users get started 30 | - Continuing to build out our community resources 31 | 32 | ## How You Can Help 33 | 34 | If you've found netboot.xyz useful, consider: 35 | 36 | - Contributing code, documentation, or testing new features 37 | - Sharing your use cases and success stories 38 | - Joining our [Discord community](https://discord.gg/An6PA2a) to help others 39 | - Supporting the project through [GitHub Sponsors](https://github.com/sponsors/netbootxyz) or [Open Collective](https://opencollective.com/netbootxyz) 40 | 41 | ## Thank You! 42 | 43 | Finally, a massive thank you to everyone who has used netboot.xyz, filed issues, contributed code, spread the word, or supported us in any way. This project exists because of you, and I'm excited to see where the next 10,000 stars take us! 44 | 45 | Keep on netbooting! 46 | -------------------------------------------------------------------------------- /src/theme/CodeBlock/index.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react'; 2 | import CodeBlock from '@theme-original/CodeBlock'; 3 | import {translate} from '@docusaurus/Translate'; 4 | 5 | // Helper function to extract text from React children 6 | const getTextContent = (children) => { 7 | if (typeof children === 'string') { 8 | return children; 9 | } 10 | if (Array.isArray(children)) { 11 | return children.map(getTextContent).join(''); 12 | } 13 | if (children?.props?.children) { 14 | return getTextContent(children.props.children); 15 | } 16 | return String(children || ''); 17 | }; 18 | 19 | export default function CodeBlockWrapper(props) { 20 | const [copied, setCopied] = useState(false); 21 | 22 | const copyToClipboard = async () => { 23 | try { 24 | const textContent = getTextContent(props.children); 25 | await navigator.clipboard.writeText(textContent); 26 | setCopied(true); 27 | setTimeout(() => setCopied(false), 2000); 28 | } catch (error) { 29 | console.warn('Failed to copy to clipboard:', error); 30 | // Fallback for older browsers or when clipboard API fails 31 | try { 32 | const textArea = document.createElement('textarea'); 33 | textArea.value = getTextContent(props.children); 34 | textArea.style.position = 'fixed'; 35 | textArea.style.opacity = '0'; 36 | document.body.appendChild(textArea); 37 | textArea.focus(); 38 | textArea.select(); 39 | document.execCommand('copy'); 40 | document.body.removeChild(textArea); 41 | setCopied(true); 42 | setTimeout(() => setCopied(false), 2000); 43 | } catch (fallbackError) { 44 | console.error('Copy to clipboard failed:', fallbackError); 45 | } 46 | } 47 | }; 48 | 49 | return ( 50 |
51 | 52 | 76 |
77 | ); 78 | } 79 | -------------------------------------------------------------------------------- /docs/introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: introduction 3 | sidebar_position: 1 4 | title: Introduction 5 | description: netboot.xyz uses iPXE to network boot Operating System installers and utilities from an easy to use menu." 6 | hide_table_of_contents: true 7 | slug: / 8 | --- 9 | 10 | [netboot.xyz](https://netboot.xyz) lets you [PXE](https://en.wikipedia.org/wiki/Preboot_Execution_Environment) boot various operating system installers or utilities from a single tool over the network. This lets you use one media for many types of operating systems or tools. The [iPXE](https://ipxe.org/) project is used to provide a user friendly menu from within the BIOS that lets you easily choose the operating system you want along with any specific types of versions or bootable flags. 11 | 12 | You can remote attach the ISO to servers, set it up as a rescue option in Grub, or even set up your home network to boot to it by default so that it's always available. 13 | 14 | ![netboot.xyz menu](../static/img/netboot.xyz.gif) 15 | 16 | ## Menu Overview 17 | 18 | ### Linux Network Installs Menu 19 | 20 | For Operating System projects that provide a network bootable installer, this is a lightweight method for installation as it retrieves a minimal set of installer kernels and then installs packages as needed. This is typically the faster method of OS installation as it provides just enough installer to get you running and then downloads only the packages needed. You can also leverage built in tools for doing rescue boots too. 21 | 22 | ### Live CD/Distro Menu 23 | 24 | Many Operating System projects provide their software as an ISO only or provide a Live CD/DVD that you can download and boot into memory without modifying the storage of the machine. Typically you then have the option to do an install from the live system. These are typically heavier weight installs and can take a lot of bandwidth to install. iPXE generally does not boot the ISOs directly that well. 25 | 26 | In order for us to make it easy to consume those types of images, we monitor new version updates from upstream, retrieve the releases, extract them, and re-release them with modifications to the initrd as needed to make them iPXE friendly. We then can load the smaller size kernel directly into memory for a better and more consistent experience. 27 | 28 | ### Utilities Menu 29 | 30 | The Utilities menu provides access to tools and utilities for tools like disk cloning, drive wiping, or other rescue type of tooling. You can also select other netboot.xyz endpoints to test menus that may be in development. 31 | 32 | ## Supported Architectures 33 | 34 | netboot.xyz supports x86 (both 32-bit and 64-bit) as well as arm64 architectures. Both Legacy and UEFI BIOS modes are supported. The menus identify the platform loaded and enable menu options based on the architecture loaded. 35 | -------------------------------------------------------------------------------- /docs/kb/providers/vultr.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: vultr 3 | title: "Vultr" 4 | description: "Using netboot.xyz with Vultr" 5 | hide_table_of_contents: true 6 | --- 7 | 8 | [Vultr](http://www.vultr.com/?ref=6870843) has some great support for using 9 | netboot.xyz right out of the box. 10 | 11 | :::info 12 | If you have not signed up for a Vultr account yet, please utilize our affiliate link 13 | [here](http://www.vultr.com/?ref=6870843). It will help provide us testing resources 14 | for improving this project! 15 | ::: 16 | 17 | ### Boot from ISO 18 | 19 | Once you've logged into the console, select ISOs. In the remote URLs box, 20 | enter in the URL of a netboot.xyz ISO and press upload: 21 | 22 | https://boot.netboot.xyz/ipxe/netboot.xyz.iso 23 | 24 | Go back to the main console screen and press "Deploy New Instance". Follow 25 | these steps: 26 | 27 | * Select _Custom_ for the operating system 28 | * Select the ISO you uploaded 29 | * Click _Place Order_ 30 | 31 | The instance should be online in a few minutes. Once it's online, go to the 32 | main account page that lists all of your instances. Click _Manage_ next to the 33 | instance you just launched, and then click _View Console_ under 34 | _Server Actions_. When the console appears, you should see the netboot.xyz 35 | iPXE menu. 36 | 37 | When you've completed the OS installation, select _Custom ISO_ from the Server 38 | Manager page and click _Remove ISO_. The ISO will be removed from your 39 | instance and it will reboot. 40 | 41 | ### Boot from iPXE Chain URL 42 | 43 | Using an iPXE chain url may be easier for some users. Follow these steps: 44 | 45 | * Click _Deploy New Instance_ 46 | * Select _Custom_ for the operating system 47 | * Select _iPXE_ in the Virtual ISO section 48 | * Set the chain URL to `https://boot.netboot.xyz` 49 | * Click _Place Order_ 50 | 51 | The instance will boot within a few minutes. Once it boots, you'll have five 52 | minutes to launch a console and choose an option from the netboot.xyz menu: 53 | 54 | * Go back to your account home page with your instances listed 55 | * Click _Manage_ next to the instance you just launched 56 | * Click _View Console_ in the _Server Actions_ section 57 | * Choose the OS you want to deploy in the netboot.xyz menu 58 | * Complete the OS installation 59 | 60 | Once you've finished the installation, reboot the instance as you normally 61 | would. Vultr will automatically reboot your virtual machine into the OS you 62 | deployed. 63 | 64 | ### Boot from iPXE on a Vultr Bare Metal Server 65 | 66 | On Vultr Bare Metal, you can find the iPXE options in the iPXE tab in the Server Type section. 67 | 68 | * Set the chain URL to `https://boot.netboot.xyz` 69 | 70 | Make sure to use Legacy (PCBIOS) images because Bare Metal does not support EFI at this time. 71 | You can then load the console up and use the menu from there. -------------------------------------------------------------------------------- /docs/docker/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Overview 3 | sidebar_position: 1 4 | slug: /docker/ 5 | description: "Overview of the netboot.xyz docker container" 6 | hide_table_of_contents: true 7 | --- 8 | 9 | The [netboot.xyz Docker image](https://github.com/netbootxyz/docker-netbootxyz) allows you to easily set up a local instance of netboot.xyz. The container is a small helper application written in node.js. It provides a simple web interface for editing menus on the fly, retrieving the latest menu release of netboot.xyz, and enables mirroring the downloadable assets from Github to your location machine for faster booting of assets. 10 | 11 | ![netboot.xyz webapp](../../static/img/netboot.xyz-webapp.png) 12 | It is a great tool for developing and testing custom changes to the menus. If you have a machine without an optical drive that cannot boot from USB then having a local netboot server provides a way to install an OS. If you are looking to get started with netboot.xyz and don't want to manage iPXE menus, you should use the boot media instead of setting up a container. 13 | 14 | The container is built upon Alpine Linux and contains several components: 15 | 16 | * netboot.xyz [webapp](https://github.com/netbootxyz/webapp) 17 | * nginx for hosting local assets from the container 18 | * dnsmasq for providing TFTP services 19 | * syslog for providing tftp activity logs 20 | 21 | Services are managed in the container by [supervisord](http://supervisord.org/). 22 | 23 | The container runs under both x86_64 and ARM based architectures. 24 | 25 | ## How it Works 26 | 27 | The following diagram details the flow of how netboot.xyz serves content to a client and how it works when the Docker container is used: 28 | 29 | import Tabs from '@theme/Tabs'; 30 | import TabItem from '@theme/TabItem'; 31 | 32 | 33 | 34 | 35 | ```mermaid 36 | graph LR 37 | A[Client Computer] -->|PXE Boot Request| B{netboot.xyz container?} 38 | B -- Yes --> C[netboot.xyz container] 39 | C -- Local request --> D[Serve netboot.xyz] 40 | C -- Unavailable --> E[boot.netboot.xyz] 41 | B -- No --> E 42 | E -->|Internet Request| F[boot.netboot.xyz] 43 | F --> G[Serve netboot.xyz] 44 | G --> H[Client Boots OS] 45 | D --> H 46 | ``` 47 | 48 | 49 | ```mermaid 50 | graph TD 51 | A[Client Computer] -->|PXE Boot Request| B{netboot.xyz container?} 52 | B -- Yes --> C[netboot.xyz container] 53 | C -- Local request --> D[Serve netboot.xyz] 54 | C -- Unavailable --> E[boot.netboot.xyz] 55 | B -- No --> E 56 | E -->|Internet Request| F[boot.netboot.xyz] 57 | F --> G[Serve netboot.xyz] 58 | G --> H[Client Boots OS] 59 | D --> H 60 | ``` 61 | 62 | 63 | -------------------------------------------------------------------------------- /docs/kb/hardware/synology.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: synology 3 | title: Installing netboot.xyz on Synology NAS 4 | sidebar_label: Synology NAS 5 | description: Installing netboot.xyz onto a Synology NAS in a container 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ## Overview 10 | 11 | This guide will walk you through the steps to install netboot.xyz onto a [Synology NAS](https://amzn.to/430KH1n) using Container Manager. 12 | 13 | ## Requirements 14 | 15 | - [Synology NAS](https://amzn.to/430KH1n) with Container Manager support 16 | - Container Manager package installed on the Synology NAS 17 | - Internet connection 18 | 19 | ### Install Container Manager 20 | 21 | Open the Synology Package Center, search for "Container Manager", and click "Install". 22 | 23 | ### Download netboot.xyz Container Image 24 | 25 | Open Container Manager from the main menu, go to the "Registry" tab, and search for `netbootxyz`. Select the `netbootxyz/netboot.xyz` image from the list, click "Download", and choose the latest version. 26 | 27 | ### Create and Configure the Container 28 | 29 | Go to the "Image" tab in Container Manager, select the `netbootxyz/netboot.xyz` image, and click "Run". In the "Create Container" wizard, configure the following settings: 30 | 31 | - **General Settings**: 32 | - Container Name: `netbootxyz` 33 | - Enable "Auto-restart" 34 | 35 | - **Advanced Settings**: 36 | - **Port Settings**: 37 | - Map port `3000/TCP` on the container to a desired port on the NAS, e.g., `3000`. 38 | - Map port `80/TCP` on the container to a desired port on the NAS, e.g., `8080` so it doesn't conflict with the UI. 39 | - Map port `69/UDP` on the container to a desired port on the NAS, e.g., `69` so it doesn't conflict with the UI. 40 | - **Volume**: 41 | - Click "Add Folder" and map a folder on your NAS to `/config` in the container. 42 | - Click "Add Folder" and map a folder on your NAS to `/assets` in the container. 43 | - **Network**: Set the network mode to "Bridge". 44 | - **Environment**: 45 | - Remove `TFTP_OPTS` if you aren't going to use it. Ensure NGINX port lines up to the port you mapped in the port settings. Ensure `WEB_APP_PORT` lines up to the port you mapped in the port settings. 46 | 47 | Click "Apply" to create the container. 48 | 49 | ### Start the Container 50 | 51 | Go to the "Container" tab in Container Manager, select the `netbootxyz` container, and click "Start". 52 | 53 | ### Access netboot.xyz 54 | 55 | Open a web browser and navigate to the IP address of your Synology NAS on port 3000 (e.g., `http://:3000`). You should see the netboot.xyz interface. The asset folder will be mapped to `8080`, or whatever you set it to, so you can access the UI at `http://:8080`. 56 | 57 | ## Conclusion 58 | 59 | You have successfully installed netboot.xyz on your Synology NAS using Container Manager. You can now use netboot.xyz to manage and boot various operating systems over the network. 60 | -------------------------------------------------------------------------------- /docs/kb/pxe/ubuntu.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: ubuntu 3 | title: PXE Booting the Ubuntu Installer 4 | sidebar_label: Ubuntu 5 | description: PXE Booting the Ubuntu Installer 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ## Installer Kernels 10 | 11 | Ubuntu maintains installer kernels that are a lightweight way to load the Ubuntu installer and then stream packages over the network as needed. The installer kernels are located at: 12 | 13 | | URL | Description | 14 | | --- | ----------- | 15 | | `http://archive.ubuntu.com` | Base URL for Ubuntu mirrors | 16 | | `${version}` | Version (e.g., focal, jammy, etc) | 17 | | `${arch}` | Architecture (e.g., amd64, arm64) | 18 | | `ubuntu/dists/${version}/main/installer-${arch}/current/images/netboot/` | Directory containing the installer kernels | 19 | | `linux` | Kernel filename | 20 | | `initrd.gz` | Initrd filename | 21 | 22 | In order to load them, you'll need to use a boot snippet in iPXE similar to: 23 | 24 | ```bash 25 | 26 | set mirror http://releases.ubuntu.com 27 | set base_dir ubuntu 28 | set codename jammy 29 | set version_number 22.04 30 | set os_arch amd64 31 | set mirrorcfg mirror/suite=${ubuntu_version} 32 | set dir ${mirror}/${base_dir}/dists/${version}/main/installer-${arch}/current/images/netboot 33 | set ubuntu_iso_url http://releases.ubuntu.com/${codename}/ubuntu-${version_number}-live-server-${os_arch}.iso 34 | set install_params autoinstall ip=dhcp ds=nocloud-net;s=http://my.autoinstall.com/ url=${ubuntu_iso_url} 35 | 36 | kernel ${dir}/linux ${install_params} ${mirrorcfg} -- quiet initrd=initrd.gz 37 | initrd ${dir}/initrd.gz 38 | boot 39 | ``` 40 | 41 | If you want to use an [autoinstall](https://canonical-subiquity.readthedocs-hosted.com/en/latest/howto/autoinstall-quickstart.html) URL for automation, you can add this to the kernel line: 42 | 43 | ```bash 44 | set autoinstall_url http://my.autoinstall.com/ 45 | autoinstall ds=nocloud-net;s=${autoinstall_url} 46 | ``` 47 | 48 | For more examples, you can view the netboot.xyz configuration for Ubuntu [here](https://github.com/netbootxyz/netboot.xyz/blob/master/roles/netbootxyz/templates/menu/ubuntu.ipxe.j2). 49 | 50 | ## Live Boot 51 | 52 | Ubuntu also provides a number of Live Boot ISOs that will boot an OS directly into memory and can be used immediately without doing an install or modifying the hard drive. The Live OS will also include the installer as well. These are great for evaluating other desktops that you might want to try out without doing a full install. 53 | 54 | | Distribution | Website | 55 | | :--- | :--- | 56 | | Kubuntu | [https://kubuntu.org/](https://kubuntu.org/) | 57 | | Lubuntu | [https://lubuntu.me/](https://lubuntu.me/) | 58 | | Ubuntu Budgie | [https://ubuntubudgie.org/](https://ubuntubudgie.org/) | 59 | | Ubuntu Kylin | [https://www.ubuntukylin.com/](https://www.ubuntukylin.com/) | 60 | | Ubuntu Mate | [https://ubuntu-mate.org/](https://ubuntu-mate.org/) | 61 | | Ubuntu Studio | [https://ubuntustudio.org/](https://ubuntustudio.org/) | 62 | | Xubuntu | [https://xubuntu.org/](https://xubuntu.org/) | 63 | -------------------------------------------------------------------------------- /docs/kb/networking/asuswrt-merlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: asuswrt-merlin 3 | title: "Asuswrt-Merlin" 4 | description: Asuswrt-Merlin Usage 5 | hide_table_of_contents: true 6 | --- 7 | 8 | This will enable legacy BIOS, and UEFI devices to PXE boot into the [netboot.xyz](https://github.com/netbootxyz/netboot.xyz) menu on Asuswrt-Merlin devices. 9 | 10 | Assume your AsusWRT-Merlin router is 192.168.1.1; Login to GUI 11 | 1. LAN -> DHCP Server -> Basic Config: Set "Enable the DHCP Server" to Yes; IP Pool Starting Address: 192.168.1.2; IP Pool Ending Address: 192.168.1.254 12 | 2. Administration -> System -> Service: Set "Enable SSH" to LAN Only 13 | 3. Administration -> System -> Persistent JFFS2 partition: Set "Enable JFFS custom scripts and configs" to Yes 14 | 15 | :::note 16 | 17 | JFFS is a writeable section of the flash memory (the size will vary between router models, with the newer models having a bit over 60 MB of space available), which will allow you to store small files (such as scripts) inside the router without needing to have a USB disk plugged in. This space will survive reboot (**but it might NOT survive firmware flashing, so back it up first before flashing!**). 18 | 19 | ::: 20 | 21 | 4. Reboot the router from the GUI and wait until you can ping 192.168.1.1 22 | 5. `ssh username@192.168.1.1` 23 | 6. `mkdir /jffs/tftproot` 24 | 7. `curl -o /jffs/tftproot/netboot.xyz.kpxe https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe` 25 | 8. `curl -o /jffs/tftproot/netboot.xyz.efi https://boot.netboot.xyz/ipxe/netboot.xyz.efi` 26 | 9. `touch /jffs/configs/dnsmasq.conf.add` 27 | 10. `nano /jffs/configs/dnsmasq.conf.add` and add the following: 28 | 29 | > enable-tftp 30 | > tftp-root=/jffs/tftproot 31 | > dhcp-match=set:bios,60,PXEClient:Arch:00000 32 | > dhcp-boot=tag:bios,netboot.xyz.kpxe,,192.168.1.1 33 | > dhcp-match=set:efi32,60,PXEClient:Arch:00002 34 | > dhcp-boot=tag:efi32,netboot.xyz.efi,,192.168.1.1 35 | > dhcp-match=set:efi32-1,60,PXEClient:Arch:00006 36 | > dhcp-boot=tag:efi32-1,netboot.xyz.efi,,192.168.1.1 37 | > dhcp-match=set:efi64,60,PXEClient:Arch:00007 38 | > dhcp-boot=tag:efi64,netboot.xyz.efi,,192.168.1.1 39 | > dhcp-match=set:efi64-1,60,PXEClient:Arch:00008 40 | > dhcp-boot=tag:efi64-1,netboot.xyz.efi,,192.168.1.1 41 | > dhcp-match=set:efi64-2,60,PXEClient:Arch:00009 42 | > dhcp-boot=tag:efi64-2,netboot.xyz.efi,,192.168.1.1 43 | 44 | 11. `reboot` and wait until you can ping 192.168.1.1 45 | 12. from another device confirm that TFTP is working on the router 46 | 47 | > `tftp 192.168.1.1` 48 | > tftp> `get netboot.xyz.kpxe` 49 | > Received 368475 bytes in 0.5 seconds 50 | 51 | 13. Test with an UEFI device and with a legacy BIOS device that PXE booting is working (you might have enable PXE booting in the BIOS and/or in UEFI. For UEFI you usually have to enable UEFI Networking stack). 52 | 53 | References: 54 | 55 | * https://programmingflow.com/2015/04/08/boot-any-machine-in-your-home-with-pxe.html 56 | * https://netboot.xyz/docs/kb/networking/edgerouter 57 | * https://github.com/RMerl/asuswrt-merlin.ng/wiki/Custom-config-files 58 | -------------------------------------------------------------------------------- /docs/kb/pxe/windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: windows 3 | title: "Windows" 4 | description: "Installing Windows using netboot.xyz and the Docker container." 5 | hide_table_of_contents: true 6 | --- 7 | 8 | # Installing Windows with netboot.xyz 9 | 10 | This guide will walk you through installing Windows 11 using netboot.xyz using the netboot.xyz Docker container. 11 | 12 | ## Requirements 13 | 14 | Before you begin, ensure you have the following: 15 | 16 | - A Samba (SMB, CIFS) share with the Windows 11 ISO extracted. 17 | - A Windows PE image as an ISO. Instructions on how to build it can be found [here](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-create-usb-bootable-drive#create-a-winpe-iso-dvd-or-cd). 18 | - The netboot.xyz Docker container set up and running. Follow the instructions [here](../../docker/usage.md) to set up the container. 19 | 20 | :::note 21 | WinPE is used so you can preload any drivers you may need for the equipment being installed. You may need to slipstream drivers like VirtIO if using Proxmox or other types of virtualization. 22 | ::: 23 | 24 | ## Installation Process 25 | 26 | To start, download the Windows PE image and the Windows 11 ISO. Once you have these files, set up an SMB share and extract the Windows 11 ISO to a directory on this share. 27 | 28 | Next, upload the Windows PE image to the netboot.xyz container's `/assets/WinPE/x64/` folder. With the files in place, boot the netboot.xyz menu and navigate to the Windows section. 29 | 30 | You'll need to set the base URL to point to the container's IP address, the correct Nginx port for hosting assets, and the right directory. For example: 31 | ```bash 32 | http://192.168.2.46:8000/WinPE 33 | ``` 34 | 35 | Load the installer, and you should be prompted with a terminal. In the terminal, type `wpeinit` to load networking support. Then, mount the Windows ISO share using the following command: 36 | ```bash 37 | net use F: \\\ /user:\ 38 | ``` 39 | 40 | :::note 41 | The terminal uses the US keyboard layout by default. 42 | ::: 43 | 44 | Change into the mounted share (`F:`) and execute `setup.exe`: 45 | ```bash 46 | F:\setup.exe 47 | ``` 48 | 49 | You should now see the normal Windows setup interface and be able to proceed with the installation. 50 | 51 | ## Persistent URL for Windows with Docker Container 52 | 53 | To avoid entering the URL each time you boot Windows, you can use the `local-vars.ipxe` file to set the `win_base_url`. This file is checked early during the boot process and allows you to set overrides for variables. 54 | 55 | Edit the `local-vars.ipxe` file within the web configuration interface and add the following line: 56 | ```bash 57 | set win_base_url http://192.168.2.46:8080/WinPE 58 | ``` 59 | 60 | With this configuration, you won't need to input the URL anymore when booting Windows. 61 | 62 | :::note 63 | 64 | If you don't currently have a [local-vars.ipxe](https://github.com/netbootxyz/netboot.xyz/blob/development/roles/netbootxyz/templates/local-vars.ipxe.j2) file, you can create on in the root of the tftp directory. 65 | 66 | ::: 67 | -------------------------------------------------------------------------------- /docs/kb/providers/digitalocean.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: digitalocean 3 | title: DigitalOcean 4 | description: Using netboot.xyz on DigitalOcean 5 | hide_table_of_contents: true 6 | --- 7 | 8 | netboot.xyz can be loaded on a [DigitalOcean](https://m.do.co/c/ab4e8f17ba0d) droplet with a little bit of work so that you can then customize the droplet as needed. For this method, we'll use the smallest droplet size running Debian. 9 | 10 | :::info 11 | If you haven't signed up for a DigitalOcean account, please utilize our affiliate link [here](https://m.do.co/c/ab4e8f17ba0d). It will help provide us testing resources for improving this project! 12 | ::: 13 | 14 | ### Create a Droplet 15 | 16 | For this method, it's recommended to use an apt-based distro like Debian or Ubuntu. Start a droplet with one of those operating systems. Once it is up and running, connect to it via SSH or connect to it with the console button. 17 | 18 | ### Install GRUB Imageboot and Download ISO 19 | 20 | We will need to ensure that the GRUB menu pauses long enough for us to select the netboot.xyz option. For that we'll need to remove a timeout file and increase the timeout for GRUB. Adjust the time period as needed for your 21 | situation: 22 | 23 | ```shell 24 | # Remove grub timeout configuration 25 | rm /etc/default/grub.d/15_timeout.cfg 26 | 27 | # Increase grub timeout if desired 28 | sed -i 's/GRUB_TIMEOUT=5/GRUB_TIMEOUT=60/g' /etc/default/grub 29 | 30 | # Install grub-imageboot 31 | apt update 32 | apt install -y grub-imageboot 33 | 34 | # Download netboot.xyz ISO 35 | mkdir /boot/images 36 | cd /boot/images 37 | wget https://boot.netboot.xyz/ipxe/netboot.xyz.iso 38 | 39 | # Update GRUB menu to include this ISO 40 | update-grub2 41 | 42 | # reboot once you are ready, it may be good to load up the recovery console first 43 | reboot 44 | ``` 45 | 46 | ### Connect via Recovery Console 47 | 48 | Under the access section, connect to the Recovery Console. The recovery console is different from the regular console command in that it allows direct access to the droplet as it boots, including access to the GRUB menu. 49 | At this point if you are within the timeout window, you should now see the Grub menu with the following option now available: 50 | 51 | ```bash 52 | Bootable ISO image: netboot.xyz 53 | ``` 54 | 55 | ### Set Networking Up 56 | 57 | Because the droplets use a static IP instead of DHCP, you will need to set up the networking for iPXE to talk to the networking. Upon selecting the netboot.xyz option, press **m** when prompted for the failsafe menu. You will need to set the networking of the instance so that iPXE can get on-line. You can get the networking information from the droplet control panel from the networking tab. Once you have the networking information, select Manual networking configuration: 58 | 59 | ```bash 60 | Set network interface number [0 for net0, defaults to 0]: 61 | IP: 62 | Subnet mask: 63 | Gateway: 64 | DNS: 65 | ``` 66 | 67 | Once set, you should connect right into netboot.xyz. If you do a installation, you should be able to reinstall over the existing drive at that point and customize the droplet as you see fit. Keep the networking information handy as you will need to populate that when doing an install. 68 | 69 | :::info 70 | If you run into out of memory issues running an installer, you may need a larger droplet. 71 | ::: 72 | -------------------------------------------------------------------------------- /src/components/DownloadCard.module.css: -------------------------------------------------------------------------------- 1 | .downloadCard { 2 | position: relative; 3 | background: var(--ifm-card-background-color, #fff); 4 | border: 1px solid var(--ifm-color-emphasis-200); 5 | border-radius: 12px; 6 | padding: 1.5rem; 7 | transition: all 0.2s ease; 8 | height: 100%; 9 | display: flex; 10 | flex-direction: column; 11 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 12 | } 13 | 14 | .downloadCard:hover { 15 | border-color: var(--ifm-color-primary); 16 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 17 | transform: translateY(-2px); 18 | } 19 | 20 | .recommended { 21 | border-color: var(--ifm-color-primary); 22 | box-shadow: 0 4px 12px rgba(37, 194, 160, 0.2); 23 | } 24 | 25 | .recommendedBadge { 26 | position: absolute; 27 | top: -8px; 28 | right: 16px; 29 | background: white; 30 | border: 1px solid var(--ifm-color-primary); 31 | color: var(--ifm-color-primary); 32 | padding: 4px 12px; 33 | border-radius: 12px; 34 | font-size: 0.75rem; 35 | font-weight: 600; 36 | text-transform: uppercase; 37 | letter-spacing: 0.5px; 38 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 39 | } 40 | 41 | [data-theme='dark'] .recommendedBadge { 42 | background: var(--ifm-card-background-color); 43 | border: 1px solid var(--ifm-color-primary); 44 | color: var(--ifm-color-primary); 45 | } 46 | 47 | .cardHeader { 48 | display: flex; 49 | align-items: center; 50 | gap: 12px; 51 | margin-bottom: 1rem; 52 | } 53 | 54 | .icon { 55 | font-size: 1.5rem; 56 | color: var(--ifm-color-primary); 57 | min-width: 24px; 58 | } 59 | 60 | .title { 61 | margin: 0; 62 | font-size: 1.1rem; 63 | font-weight: 600; 64 | color: var(--ifm-color-emphasis-800); 65 | flex: 1; 66 | } 67 | 68 | .type { 69 | background: var(--ifm-color-emphasis-100); 70 | color: var(--ifm-color-emphasis-700); 71 | padding: 4px 8px; 72 | border-radius: 6px; 73 | font-size: 0.75rem; 74 | font-weight: 500; 75 | text-transform: uppercase; 76 | } 77 | 78 | .description { 79 | color: var(--ifm-color-emphasis-600); 80 | margin-bottom: 1.5rem; 81 | line-height: 1.5; 82 | flex: 1; 83 | } 84 | 85 | .downloadButton { 86 | display: flex; 87 | align-items: center; 88 | justify-content: center; 89 | gap: 8px; 90 | background: white; 91 | border: 2px solid var(--ifm-color-primary); 92 | color: var(--ifm-color-primary); 93 | padding: 12px 20px; 94 | border-radius: 8px; 95 | font-weight: 600; 96 | cursor: pointer; 97 | transition: all 0.2s ease; 98 | text-decoration: none; 99 | font-size: 0.9rem; 100 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 101 | } 102 | 103 | .downloadButton:hover { 104 | background: var(--ifm-color-primary); 105 | color: white; 106 | transform: translateY(-1px); 107 | box-shadow: 0 4px 12px rgba(37, 194, 160, 0.2); 108 | } 109 | 110 | [data-theme='dark'] .downloadButton { 111 | background: var(--ifm-card-background-color); 112 | border: 2px solid var(--ifm-color-primary); 113 | color: var(--ifm-color-primary); 114 | } 115 | 116 | [data-theme='dark'] .downloadButton:hover { 117 | background: var(--ifm-color-primary); 118 | color: var(--ifm-card-background-color); 119 | } 120 | 121 | .downloadButton svg { 122 | transition: transform 0.2s ease; 123 | } 124 | 125 | .downloadButton:hover svg { 126 | transform: translateY(2px); 127 | } 128 | 129 | @media (max-width: 768px) { 130 | .downloadCard { 131 | padding: 1rem; 132 | } 133 | 134 | .cardHeader { 135 | flex-direction: column; 136 | align-items: flex-start; 137 | gap: 8px; 138 | } 139 | 140 | .title { 141 | font-size: 1rem; 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /docs/kb/providers/gce.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: gce 3 | title: Google Compute Engine 4 | description: Using netboot.xyz on Google Compute Engine 5 | hide_table_of_contents: true 6 | --- 7 | 8 | ## Using with netboot.xyz 9 | 10 | **Experimental, currently doesn't work on any images that utilize memdisk as console output cannot be altered.** 11 | 12 | *Note: Functionality will be limited as the console is Serial Over Lan. Distros that utilize memdisk may not provide output while other distros that are retrieved via kernel allow for altering of the console settings during load. This includes most of the utility tools. I'll probably look at filtering out options that don't work in the future. Console may work during the install but may stop working on first boot if it's not set during the install.* 13 | 14 | ### Create a Bucket 15 | 16 | Set a name for your bucket and select the regional storage class. 17 | 18 | Upload the netboot.xyz-gce image from this [link](https://boot.netboot.xyz/ipxe/netboot.xyz-gce.tar.gz) to the root of your bucket. 19 | 20 | ``` 21 | gsutil cp $tmp/$image_name.tar.gz gs://$gs_bucket 22 | ``` 23 | 24 | ### Create an image 25 | 26 | Using the gcloud utility or the Google Cloud Shell, create an image from the iPXE disk you uploaded in the previous step: 27 | 28 | ``` 29 | gcloud compute images create $image_name --source-uri gs://$gs_bucket/$image_name.tar.gz 30 | ``` 31 | 32 | ### Boot an instance 33 | 34 | Start an instance from the image you created, make sure to enable the serial-port: 35 | 36 | ``` 37 | gcloud compute instances create $instance_name --image $image_name --metadata serial-port-enable=1 38 | ``` 39 | 40 | ### Connect to the Instance over Serial Console 41 | 42 | ``` 43 | gcloud beta compute connect-to-serial-port $instance_name 44 | ``` 45 | 46 | From here you should see the netboot.xyz menu and that's probably all you'll be able to do at this point. :) 47 | 48 | ### Configuring the Instance 49 | 50 | In the event DHCP does not work, you'll need to set the static IP address during install time. You can view this by going into instance details in the console, and clicking on default under network. You'll need to set the internal IP of the instance along with the subnet and gateway on that page. 51 | 52 | ### Notes 53 | 54 | Here are some notes on how the iPXE image is created in case you want to play around with vanilla iPXE in GCE. 55 | 56 | See the iPXE commit [here](https://github.com/ipxe/ipxe/commit/de85336abb7861e4ea4df2e296eb33d179c7c9bd) for more info of GCE support in iPXE. 57 | 58 | To create a usable image for GCE: 59 | 60 | ``` 61 | make bin/ipxe.usb CONFIG=cloud EMBED=$tmp/main.ipxe 62 | cp -f bin/ipxe.usb $tmp/disk.raw 63 | ( cd $tmp; tar Sczvf $image_name.tar.gz disk.raw ) 64 | ``` 65 | 66 | To get the installers to work to output serial, when the GCE disk is detected, the console on the kernel command line is set to: 67 | 68 | ``` 69 | console=ttyS0,115200n8 70 | ``` 71 | 72 | ## Using without netboot.xyz (standard iPXE) 73 | 74 | When building your script, you will want it to look something like this: 75 | 76 | ``` 77 | #!ipxe 78 | echo Google Compute Engine - iPXE boot via metadata 79 | ifstat || 80 | dhcp || 81 | route || 82 | chain -ar http://metadata.google.internal/computeMetadata/v1/instance/attributes/ipxeboot 83 | ``` 84 | 85 | Then when provisioning your instance, you can specify your custom iPXE script file: 86 | 87 | ``` 88 | # Create shared boot image 89 | make bin/ipxe.usb CONFIG=cloud EMBED=config/cloud/gce.ipxe 90 | # Configure per-instance boot script 91 | gcloud compute instances add-metadata \ 92 | --metadata-from-file ipxeboot=boot.ipxe 93 | ``` 94 | 95 | This lets your custom compiled iPXE boot and then immediately chain to your 96 | custom iPXE script. 97 | -------------------------------------------------------------------------------- /docs/booting/uefi.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: uefi 3 | title: Booting from a Local UEFI Executable 4 | sidebar_label: Boot from UEFI 5 | sidebar_position: 4 6 | description: "How to use a local UEFI executable to boot into netboot.xyz" 7 | hide_table_of_contents: true 8 | --- 9 | 10 | ## Overview 11 | 12 | This guide describes how to boot into netboot.xyz using a local UEFI executable. This method involves placing the UEFI executable on the EFI system partition and configuring the UEFI boot manager to boot from it. 13 | 14 | ## UEFI Boot Manager 15 | 16 | The UEFI boot manager is responsible for managing the boot process on UEFI-based systems. It uses boot entries stored in NVRAM to determine the boot order and which bootloader to execute. The boot entries are identified by their boot numbers (e.g., Boot0001, Boot0002) and can be managed using the `efibootmgr` tool. 17 | 18 | ### BootOrder and BootNext Variables 19 | 20 | The `BootOrder` variable defines the order in which the boot entries are attempted. The `BootNext` variable specifies a single boot entry to be used for the next boot only, after which the system reverts to the `BootOrder`. 21 | 22 | ## Using `efibootmgr` to Manage UEFI Boot Entries 23 | 24 | The `efibootmgr` tool allows you to manage UEFI boot entries from within a running operating system. You can use it to create, delete, and modify boot entries, as well as change the boot order. 25 | 26 | ### Adding a Boot Entry 27 | 28 | To add a new boot entry for the netboot.xyz UEFI executable, use the following command: 29 | 30 | ```bash 31 | sudo efibootmgr --create --disk /dev/sdX --part Y --label "netboot.xyz" --loader /EFI/netboot.xyz/netboot.xyz.efi 32 | ``` 33 | 34 | Replace `/dev/sdX` with the disk containing the EFI system partition, and `Y` with the partition number of the EFI system partition. 35 | 36 | ### Changing the Boot Order 37 | 38 | To change the boot order and make the new boot entry the first in the list, use the following command: 39 | 40 | ```bash 41 | sudo efibootmgr --bootorder XXXX,YYYY,ZZZZ 42 | ``` 43 | 44 | Replace `XXXX` with the boot number of the new netboot.xyz entry, and `YYYY, ZZZZ` with the boot numbers of other entries in the desired order. 45 | 46 | ## Other Boot Methods 47 | 48 | ### GRUB 49 | 50 | You can use GRUB to boot the netboot.xyz UEFI executable by adding a custom menu entry to the GRUB configuration file. Add the following entry to `/etc/grub.d/40_custom`: 51 | 52 | ```bash 53 | menuentry "netboot.xyz" { 54 | search --no-floppy --file --set=root /EFI/netboot.xyz/netboot.xyz.efi 55 | chainloader /EFI/netboot.xyz/netboot.xyz.efi 56 | } 57 | ``` 58 | 59 | After adding the entry, update the GRUB configuration: 60 | 61 | ```bash 62 | sudo update-grub 63 | ``` 64 | 65 | ### systemd-boot 66 | 67 | To add a boot entry for netboot.xyz in systemd-boot, create a new file in the `/boot/loader/entries/` directory with the following content: 68 | 69 | ```ini 70 | title netboot.xyz 71 | efi /EFI/netboot.xyz/netboot.xyz.efi 72 | ``` 73 | 74 | ### rEFInd 75 | 76 | To add a boot entry for netboot.xyz in rEFInd, create a new file in the `/boot/EFI/refind/` directory with the following content: 77 | 78 | ```ini 79 | menuentry "netboot.xyz" { 80 | loader /EFI/netboot.xyz/netboot.xyz.efi 81 | } 82 | ``` 83 | 84 | ### UEFI Shell 85 | 86 | You can also boot the netboot.xyz UEFI executable from the UEFI Shell. To do this, navigate to the directory containing the executable and run the following command: 87 | 88 | ```shell 89 | fsX: 90 | cd EFI\netboot.xyz 91 | netboot.xyz.efi 92 | ``` 93 | 94 | Replace `fsX:` with the appropriate filesystem identifier for the EFI system partition. 95 | 96 | ## Vendor-Specific Boot Menu Options 97 | 98 | Some vendors provide options in the boot menu to select an arbitrary UEFI executable to boot from. Consult your system's documentation for instructions on how to access and use these options. 99 | -------------------------------------------------------------------------------- /docs/kb/networking/tftp-filename-issues.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: tftp-filename-issues 3 | title: "TFTP Filename Interpretation Issues with Older PXE Clients" 4 | description: Troubleshooting TFTP filename issues caused by older PXE clients appending extra characters 5 | hide_table_of_contents: false 6 | --- 7 | 8 | ## Problem Description 9 | 10 | Older PXE clients (typically 10+ years old) may append extra characters to TFTP filenames, causing "File not found" errors. The issue manifests as Unicode replacement characters (�) or hex bytes (often 0xFF) being added to the end of requested filenames. 11 | 12 | ## Root Cause 13 | 14 | This is a UEFI PXE implementation bug related to DHCP filename handling: 15 | 16 | - **Technical Issue**: UEFI PXE clients incorrectly handle DHCP Option 67 (boot filename) 17 | - **Expected Behavior**: Option 67 should be treated as a variable-length field 18 | - **Actual Behavior**: Some implementations treat it as a null-terminated string, reading beyond the specified length 19 | - **Result**: Extra bytes from the DHCP packet get appended to the TFTP filename request 20 | 21 | ## Affected Hardware/Software 22 | 23 | ### Hardware 24 | 25 | - Jetway J7F4K1G5DS-LF and similar older boards 26 | - Lenovo T460 laptops 27 | - Z77X-UD3H motherboards with Atheros NICs 28 | - Kontron VX3040 Intel CPU boards 29 | - Generally affects Intel UNDI PXE-2.1 implementations from ~2000 era 30 | 31 | ### DHCP Servers 32 | 33 | **Problematic:** 34 | - Kea DHCP 35 | - UniFi USG devices (limited configuration options) 36 | - pfSense with Kea DHCP 37 | 38 | **Working Combinations:** 39 | - pfSense with deprecated isc-dhcp 40 | - Properly configured OpnSense/isc-dhcp setups 41 | 42 | ## Workarounds and Solutions 43 | 44 | ### 1. Server-Side File Naming (Recommended) 45 | 46 | Create boot files with the extra 0xFF byte in the filename: 47 | 48 | ```bash 49 | # Rename files to include the extra byte 50 | mv netboot.xyz.kpxe $(echo -en 'netboot.xyz.kpxe\xFF') 51 | mv netboot.xyz.efi $(echo -en 'netboot.xyz.efi\xFF') 52 | 53 | # Or create symlinks (cleaner approach) 54 | ln -s netboot.xyz.kpxe $(echo -en 'netboot.xyz.kpxe\xFF') 55 | ln -s netboot.xyz.efi $(echo -en 'netboot.xyz.efi\xFF') 56 | ``` 57 | 58 | ### 2. DHCP Configuration Changes 59 | 60 | For isc-dhcp servers, use the `boot-file-name` directive instead of Option 67: 61 | 62 | ```bash 63 | # In dhcp4 config, use boot-file-name at the top level 64 | boot-file-name "netboot.xyz.kpxe"; 65 | 66 | # Instead of in option-data 67 | ``` 68 | 69 | For pfSense users: Switch from Kea to the deprecated isc-dhcp service in System > Advanced > Networking. 70 | 71 | ### 3. Remove DHCP boot-filename Option 72 | 73 | Some users report success by removing the `option bootfile-name` directive entirely, though this may break other clients. 74 | 75 | ## Technical Details 76 | 77 | - The issue specifically affects DHCPv4 Option 67 handling 78 | - DHCPv6 does not have this problem due to its variable-length field design 79 | - RFC 2132 does not guarantee null termination of Option 67 filenames 80 | - UEFI 2.6 spec leaves line termination as an implementation detail 81 | 82 | ## Troubleshooting Steps 83 | 84 | 1. **Identify the issue**: Look for replacement characters (�) or extra bytes in TFTP server logs 85 | 2. **Packet capture**: Use tcpdump to verify extra bytes in TFTP requests 86 | 3. **Test workarounds**: Try the server-side filename solution first 87 | 4. **DHCP server evaluation**: Consider switching from Kea to isc-dhcp if possible 88 | 89 | ## Prevention 90 | 91 | - Use the `boot-file-name` directive in DHCP configuration instead of Option 67 92 | - Test with known problematic hardware before deployment 93 | - Document affected clients in your environment 94 | 95 | ## References 96 | 97 | - [Issue discussion](https://github.com/netbootxyz/netboot.xyz/issues/1198) 98 | - [Technical analysis](https://binaryfury.wann.net/2024/12/pxe-two-tftp-filenames-one-dhcp-offer-plus-weird-filenames/) 99 | - UEFI Specification 2.6+ 100 | - RFC 2132 (DHCP Options) -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable docusaurus/copyright-header */ 2 | /** 3 | * Any CSS included here will be global. The classic template 4 | * bundles Infima by default. Infima is a CSS framework designed to 5 | * work well for content-centric websites. 6 | */ 7 | 8 | /* You can override the default Infima variables here. */ 9 | :root { 10 | --ifm-color-primary: #1c90f3; 11 | --ifm-color-primary-dark: #0c83e8; 12 | --ifm-color-primary-darker: #0c7bdb; 13 | --ifm-color-primary-darkest: #0a66b4; 14 | --ifm-color-primary-light: #369df4; 15 | --ifm-color-primary-lighter: #43a3f5; 16 | --ifm-color-primary-lightest: #69b6f7; 17 | --ifm-code-font-size: 95%; 18 | } 19 | 20 | .docusaurus-highlight-code-line { 21 | background-color: rgb(72, 77, 91); 22 | display: block; 23 | margin: 0 calc(-1 * var(--ifm-pre-padding)); 24 | padding: 0 var(--ifm-pre-padding); 25 | } 26 | 27 | .header-github-link:hover { 28 | opacity: 0.6; 29 | } 30 | 31 | .header-github-link:before { 32 | content: ''; 33 | width: 24px; 34 | height: 24px; 35 | display: flex; 36 | background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") 37 | no-repeat; 38 | } 39 | 40 | html[data-theme='dark'] .header-github-link:before { 41 | background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") 42 | no-repeat; 43 | } 44 | 45 | html[data-theme='dark'] .navbar .navbar__logo { 46 | content: url(../../static/img/nbxyz-logo-dark.svg); 47 | } 48 | 49 | /* Copy button styles */ 50 | .copy-code-button { 51 | opacity: 0; 52 | transition: opacity 0.2s ease; 53 | } 54 | 55 | .copy-code-button:hover { 56 | background-color: var(--ifm-color-emphasis-200) !important; 57 | color: var(--ifm-color-emphasis-900) !important; 58 | } 59 | 60 | div:hover .copy-code-button { 61 | opacity: 1; 62 | } 63 | 64 | html[data-theme='dark'] .copy-code-button { 65 | background-color: var(--ifm-color-gray-800) !important; 66 | border-color: var(--ifm-color-emphasis-200) !important; 67 | color: var(--ifm-color-emphasis-200) !important; 68 | } 69 | 70 | html[data-theme='dark'] .copy-code-button:hover { 71 | background-color: var(--ifm-color-emphasis-300) !important; 72 | color: var(--ifm-color-emphasis-900) !important; 73 | } 74 | 75 | /* Image optimization styles */ 76 | img { 77 | height: auto; 78 | max-width: 100%; 79 | } 80 | 81 | .markdown img { 82 | border-radius: 0.25rem; 83 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); 84 | margin: 1rem auto; 85 | display: block; 86 | } 87 | 88 | /* Responsive images */ 89 | @media (max-width: 768px) { 90 | .markdown img { 91 | margin: 0.5rem auto; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /blog/2019-11-29-self-hosting-and-live-booting.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2019/11/29/self-hosting-and-live-booting 3 | title: Self Hosting and Live Booting 4 | authors: 5 | - antonym 6 | tags: [self_hosting, netboot.xyz] 7 | --- 8 | 9 | We have been hard at work the last few weeks and I wanted to provide some updates as to what we're currently working on and where we want to go. 10 | 11 | I would like to thank all of the contributors over the last few years that have contributed code, tested, and provided feedback for the project. The contributions have all been really helpful and have helped keep the project up to date. 12 | 13 | 14 | 15 | ### Self Hosting 16 | 17 | I have been working on getting the netboot.xyz source tree to a point where they can be generated via Ansible so that anyone can take the repository and customize it to their liking a lot easier than it was in the past. I have gotten most of that working and will be swapping out the existing source bits in the netboot.xyz repo with the bits to deploy with Ansible. My goal is to generate the primary netboot.xyz site using Ansible instead of just uploading the source files. There will still be a lot of future optimizations that can be done to the templates but this is a good first step toward consolidating a lot of the duplicate code. 18 | 19 | The new netboot.xyz repo will allow you to create a self-hosted environment using Ansible to a target or you can use Docker to generate the site. The Ansible playbooks will: 20 | 21 | * Generate the iPXE files from templates using default settings which can be overridden 22 | * Generate all iPXE disks customized to your environment 23 | 24 | This should make it a lot easier to get a custom environment set up in the environment of your choosing. 25 | 26 | ### Live Booting 27 | 28 | One of the things I have been wanting to do a for a while is provide a way to Live Boot more operating systems. I always wanted to make netboot.xyz a place where anyone can try out new operating systems, reinstall, or rescue their favorite from one place. A lot of the operating systems out there don't always provide installer kernels and only host a large ISO as their release. With iPXE, the best way to load ISOs into memory is with memdisk or sandisk, but that starts to fail with larger images and doesn't work in EFI mode. Getting distros to change how they release their operating systems for iPXE users probably isn't going to happen anytime soon either. 29 | 30 | With a lot of help and expertise from [TheLamer (Ryan Kuba)](https://github.com/thelamer), a [linuxserver.io](https://linuxserver.io) contributor, we have built an automated pipeline that tracks and builds some of the latest Linux Live distributions, extracts kernels and squashfs assets, and loads them up as Github releases. From there the information for each release is then put into the netboot.xyz repo, and we can then generate menus dynamically for each version. This allows you to netboot into your favorite live distribution from the hosted Github release directly. It is currently marked as experimental but we have a number of Live Operating Systems available already to start using. 31 | 32 | ### Moving netboot.xyz repository 33 | 34 | I will be moving the repo from my personal repository on github to the [netbootxyz](https://github.com/netbootxyz) organization to put everything in one central place. The existing links should redirect to the new location. 35 | 36 | ### Discord 37 | 38 | Over the last few weeks, we've been leveraging Discord more for communication for development, build automation, and discussion. If you would like to join in the discussion, you can join [here](https://discord.gg/An6PA2a). 39 | 40 | 41 | ### Open Collective 42 | 43 | We have set up an [Open Collective](https://opencollective.com/netbootxyz) to open the project up to those who wish to donate to help out the project. This may cover hosting and domain fees, hardware for validation testing, or anything else that comes up in maintaining a project like this. Every little bit will help! If you enjoy the work we do, please support us! 44 | 45 | Thanks again for all of your support and we hope to continue making this project more useful for our users! 46 | -------------------------------------------------------------------------------- /docs/booting/vms.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: vms 3 | title: Boot from VMs 4 | sidebar_label: Boot from VMs 5 | sidebar_position: 7 6 | description: "Using netboot.xyz with various Virtualization Machine Platforms" 7 | hide_table_of_contents: false 8 | --- 9 | 10 | ## VMware Fusion 11 | 12 | These instructions are for setting up netboot.xyz in a VM on VMware's Fusion for MacOS. 13 | 14 | ### Create the VM 15 | 16 | * Add a new virtual machine. 17 | * Select "Install from disc or image". 18 | * Click on "Use another disk or disc image...". 19 | * Download and select the netboot.xyz [ISO](https://boot.netboot.xyz/ipxe/netboot.xyz.iso). 20 | * On the Choose Operating System Screen, select the OS type you are planning on installing. If you plan on testing multiple types of installs, you can just choose a CentOS 64-bit OS. 21 | * Click the "Customize Settings" and give the VM a name, like "netboot.xyz". 22 | 23 | This will create your VM. 24 | 25 | ### Running the VM 26 | 27 | _You'll need to adjust the memory settings of the VM to ensure you'll have enough memory to run the OS installers in memory. Typically it's good to bump the memory up to 2GB to 4GB._ 28 | 29 | * Click the wrench icon and click on Processors & Memory and bump up the memory to the desired amount of memory. 30 | * Start the VM up and you should see the netboot.xyz loader. 31 | * If you determine you no longer want to boot from netboot.xyz, you can either change the boot order to boot from the hard drive by default or delete the ISO from the VM. 32 | 33 | ## Proxmox VE 34 | 35 | These instructions are for setting up netboot.xyz in a VM on Proxmox VE. 36 | 37 | ### Create the VM 38 | 39 | * Log in to the Proxmox web interface. 40 | * Click on "Create VM" in the top right corner. 41 | * Give the VM a name, like "netboot.xyz", and click "Next". 42 | * On the OS tab, select "Do not use any media" and click "Next". 43 | * On the System tab, select "OVMF (UEFI)" for the BIOS, add an EFI disk, select, the EFI Storage, and uncheck "Pre-Enroll Keys", then click "Next". 44 | * On the Hard Disk tab, set the Disk size to a small value (e.g., 4GB) since netboot.xyz does not require much space, and click "Next". 45 | * On the CPU tab, allocate the desired number of cores and click "Next". 46 | * On the Memory tab, allocate the desired amount of memory (e.g., 2GB to 4GB) and click "Next". 47 | * On the Network tab, leave the defaults and click "Next". 48 | * On the Confirm tab, review the settings and click "Finish". 49 | 50 | ### Upload the ISO 51 | 52 | * Click on the "local" storage in the left sidebar. 53 | * Click on the "ISO Images" tab. 54 | * Click "Upload" and select the netboot.xyz [ISO](https://boot.netboot.xyz/ipxe/netboot.xyz.iso) file to upload. 55 | 56 | ### Attach the ISO and Boot 57 | 58 | * Select the newly created VM from the left sidebar. 59 | * Click on the "Hardware" tab. 60 | * Click "Add" and select "CD/DVD Drive". 61 | * Choose "Use CD/DVD disc image file (iso)" and select the uploaded netboot.xyz ISO. 62 | * Click "OK". 63 | * Click on the "Options" tab. 64 | * Double-click "Boot Order" and ensure the CD/DVD drive is set to boot first. 65 | * Start the VM and you should see the netboot.xyz loader. 66 | 67 | ## Hyper-V 68 | 69 | These instructions are for setting up netboot.xyz in a VM on Hyper-V. 70 | 71 | ### Create the VM 72 | 73 | * Open Hyper-V Manager. 74 | * Click on "New" and select "Virtual Machine". 75 | * Click "Next" on the Before You Begin screen. 76 | * Give the VM a name, like "netboot.xyz", and click "Next". 77 | * Choose "Generation 1" and click "Next". 78 | * Allocate the desired amount of memory (e.g., 2GB to 4GB) and click "Next". 79 | * Configure the network settings and click "Next". 80 | * Choose "Create a virtual hard disk" and set the Disk size to a small value (e.g., 4GB) since netboot.xyz does not require much space, and click "Next". 81 | * Choose "Install an operating system from a bootable CD/DVD-ROM" and select the netboot.xyz [ISO](https://boot.netboot.xyz/ipxe/netboot.xyz.iso). 82 | * Click "Finish". 83 | 84 | ### Running the VM 85 | 86 | * Right-click on the newly created VM and select "Settings". 87 | * Adjust the memory settings if needed. 88 | * Start the VM and you should see the netboot.xyz loader. 89 | * If you determine you no longer want to boot from netboot.xyz, you can either change the boot order to boot from the hard drive by default or remove the ISO from the VM. 90 | -------------------------------------------------------------------------------- /docs/kb/providers/oci.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: oci 3 | title: Oracle Cloud Infrastructure 4 | description: Using netboot.xyz on Oracle Cloud Infrastructure 5 | hide_table_of_contents: true 6 | --- 7 | 8 | netboot.xyz can be loaded on [OCI](https://www.oracle.com/cloud/) compute instances so that you can then customize the compute instance as needed. 9 | 10 | For this method, we'll use the standard Ubuntu image for the relevant architecture. 11 | 12 | ### Create a compute instance 13 | When creating an instance, make sure to select: 14 | - Image: Ubuntu > Canonical Ubuntu (standard, not minimal) 15 | 16 | Take note of which shape you take, as it will determine further steps: 17 | - AMD (`x86_64`) 18 | - Ampere A1 (`arm64`) 19 | 20 | :::warning 21 | Set up SSH keys! 22 | You will need to log into the server and there is no default password. 23 | 24 | We assume you know how to use SSH keys. 25 | ::: 26 | 27 | ### Get into the rescue shell 28 | First get onto your compute instance's details page, then scroll down to `Resources` under which you'll find `Console connection`. 29 | 30 | To get into the rescue shell, we recommend you use the Cloud Shell, and not bother with a `local connection`. To do so, click on `Launch Cloud Shell connection` and wait for the console connection status to reach the `ACTIVE` state. Be patient, it can take a minute or two. 31 | 32 | You do not need to log in, as we'll only use it control the UEFI Firmware. 33 | 34 | ### Download the EFI binary, Setup GRUB and Reboot into UEFI 35 | 36 | Now that you have the rescue shell open, you need to open a SSH connection to entere the following commands, as there is no default password. 37 | 38 | Follow the instructions depending on which architecture/shape you chose earlier: `arm64` or `x86_64`. 39 | 40 | :::info 41 | The rescue shell over the Oracle Cloud Shell can be somewhat buggy, for instance, you might have to press the Escape key twice instead of only once when in netboot.xyz 42 | ::: 43 | 44 | #### `arm64` - Ampere A1 45 | These steps apply to the Ampere A1 (`arm64`) instances. 46 | 47 | The default GRUB configuration already contains the `UEFI Firmware` option, so we only have to download netboot.xyz and reboot into the correct option. 48 | 49 | ```shell 50 | # Download netboot (arm64) into the EFI directory 51 | sudo wget -O /boot/efi/netboot.xyz-arm64.efi https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi 52 | 53 | # Set the default boot entry (for the following boot only) to the UEFI firmware 54 | sudo grub-reboot "UEFI Firmware Settings" 55 | 56 | # Reboot the instance 57 | sudo reboot 58 | ``` 59 | 60 | #### `x86_64` - AMD 61 | These steps apply to the AMD/Intel (`x86_64`) instances. 62 | 63 | We need to delete the default GRUB configuration and regenerate it, as it does not contain `UEFI Firmware`. Then, we can reboot into the UEFI Firmware and boot into netboot.xyz: 64 | 65 | ```shell 66 | # Download netboot (amd64) into the EFI directory 67 | sudo wget -O /boot/efi/netboot.xyz-snp.efi https://boot.netboot.xyz/ipxe/netboot.xyz-snp.efi 68 | 69 | # Delete the default configuration (does not contain UEFI Firmware by default) 70 | sudo rm -rf /etc/default/grub /etc/default/grub.d/ 71 | 72 | # Update GRUB menu (with default configuration) 73 | sudo update-grub 74 | 75 | # Set the default boot entry (for the following boot only) to the UEFI firmware 76 | sudo grub-reboot "UEFI Firmware Settings" 77 | 78 | # Reboot 79 | sudo reboot 80 | ``` 81 | 82 | ### Boot into netboot.xyz 83 | Now that you are in the UEFI Firmware, do the following: 84 | - Choose “Boot Maintenance Manager” 85 | - Choose “Boot From File” 86 | - Choose the only device 87 | - Choose the netboot.xyz EFI file 88 | - Wait for it to start and configure 89 | 90 | :::tip 91 | If you were not able to boot into netboot.xyz correctly, simple repeat the `grub-reboot` and `reboot` steps to enter UEFI again. 92 | ::: 93 | 94 | #### `x86_64` - Console quirks: Linux 95 | Once you have booted into netboot.xyz on `x86_64`, if you plan on using Linux images, you must still set up custom `Kernel cmdline params` under `Utilities (UEFI)`. 96 | 97 | Set `Kernel cmdline params: []` to `console=ttyS0,9600`. 98 | 99 | If you make a mistake, move with arrow keys, and use the Delete key. 100 | 101 | Once you have typed it in, you might have to press the Escape key twice. 102 | 103 | :::warning 104 | This is **not** applicable to `arm64`/Ampere A1. 105 | ::: 106 | -------------------------------------------------------------------------------- /docs/quick-start.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: quick-start 3 | sidebar_position: 2 4 | title: Quick Start 5 | description: "Getting started with netboot.xyz" 6 | hide_table_of_contents: true 7 | --- 8 | 9 | [Download](https://netboot.xyz/downloads/) one of the netboot.xyz bootloaders that works best for your situation and start PXE booting your favorite operating system. The bootloaders are precompiled versions of the latest version of [iPXE](https://github.com/ipxe/ipxe) that will allow you to PXE boot into [https://boot.netboot.xyz](https://boot.netboot.xyz). If you have DHCP it'll automatically attempt to boot from DHCP. If you need to set a static IP address, hit the **`m`** key during boot up for the failsafe menu and choose manual network configuration. 10 | 11 | You can look at the next section entitled [Booting Methods](https://netboot.xyz/docs/category/booting-methods) for instructions on how to set up the downloaded bootloader. 12 | 13 | If you already have iPXE up and running on the network, you can hit load the netboot.xyz kernel by typing the following when loaded in a Legacy Mode BIOS: 14 | 15 | ``` 16 | chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.lkrn 17 | ``` 18 | 19 | or when in EFI mode BIOS: 20 | 21 | ``` 22 | chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.efi 23 | ``` 24 | 25 | This will load the appropriate netboot.xyz kernel with all of the proper options enabled. 26 | 27 | You can also boot into netboot.xyz using a local UEFI executable. This method involves placing the UEFI executable on the EFI system partition and configuring the UEFI boot manager to boot from it. For more details, refer to the [Booting from a Local UEFI Executable](https://netboot.xyz/docs/booting/uefi) guide. 28 | 29 | :::info 30 | 31 | If your version of iPXE has HTTPS support compiled in, you can retrieve those images over HTTPS. By default the upstream iPXE project does not compile in HTTPS support. 32 | 33 | ::: 34 | 35 | ### System Requirements 36 | 37 | - i686, x86_64, or aarch64 Processor 38 | - Bare Metal or Virtual Machine 39 | - A hard wired ethernet connection (WiFi networking is not supported) 40 | - At least 4GB of RAM is recommended 41 | 42 | :::info 43 | 44 | Memory requirements vary depending on the distribution. Live CD Images typically require a lot more memory as the ramdisk is needed to be loaded into memory. Live CD Images loaded over the network may need more than 4GB. If you experience issues where it fails to load during the initrd process, try giving the hardware or virtual machine more RAM. You will typically see errors like `out of space` or `failure to write to destination` in the initrd once the kernel has loaded if you don't have enough RAM. 45 | 46 | ::: 47 | 48 | ### Source Code 49 | 50 | The source code for netboot.xyz is located on [Github](https://github.com/netbootxyz/netboot.xyz). If you enjoy the project, make sure to give it a star! 51 | 52 | ### Contributing 53 | 54 | Is there a new version of an operating system out? Have you found one that network boots well with iPXE? Pull requests are welcomed and encouraged and helps out the project! Feel free to issue a pull request for new versions or tools that you might find useful. Once merged into master, [Github Actions](https://github.com/netbootxyz/netboot.xyz/actions) will regenerate new versions of [iPXE from upstream](https://github.com/ipxe/ipxe) and deploy the latest changes to netboot.xyz. See more on contributing [here](https://netboot.xyz/docs/contributing). 55 | 56 | ### Testing New Features 57 | 58 | Under the **Utilities** menu on netboot.xyz, there's an option for ["netboot.xyz endpoints"](https://github.com/netbootxyz/netboot.xyz/blob/development/roles/netbootxyz/templates/menu/nbxyz.ipxe.j2). Features or changes that have been merged into the development branch can be loaded here to be tested before they are merged into production. 59 | 60 | :::info 61 | 62 | Version updates are typically deployed to the development endpoint and the primary rolling endpoint at the same time automatically. Once the development branch stabilizes, a new release is cut from the development branch and merged into master. This provides our stable point releases and releases new changes and capabilities related to menus or new features. 63 | 64 | ::: 65 | 66 | ### Communication 67 | 68 | Feel free to open up an [issue](https://github.com/netbootxyz/netboot.xyz/issues/new/choose) on Github or join us on our [Discord](https://discord.gg/An6PA2a) server. Follow us on [Twitter](https://twitter.com/netbootxyz) or like us on [Facebook](https://www.facebook.com/netboot.xyz)! 69 | -------------------------------------------------------------------------------- /docs/docker/dhcp.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DHCP Configurations 3 | sidebar_position: 4 4 | description: "Setting up DHCP for the netboot.xyz Docker Container" 5 | hide_table_of_contents: true 6 | --- 7 | 8 | The netboot.xyz Docker image requires the usage of a DHCP server in order to function properly. If you have an existing DHCP server, usually you will need to make some small adjustments to make your DHCP server forward requests to the netboot.xyz container. The main settings in your DHCP or router that you will typically need to set are: 9 | 10 | * `tftp-server` also known as `next-server`, this option tells the client where to look for the boot file 11 | * `boot-file-name`, this option tells the client which boot file to load 12 | 13 | ## Examples 14 | 15 | The following are some configuration examples for setting up a DHCP server to get started. The main configuration you will need to change are `SERVER_IP_ADDRESS` so that DHCP can direct the client to the server running the netboot.xyz Docker container. Because the Docker image is hosting a dnsmasq TFTP server, the boot files are pulled from it and then it will attempt to load the iPXE configs directly from the host. You can then modify and adjust them to your needs. See [booting from TFTP](https://netboot.xyz/docs/booting/tftp/) for more information. 16 | 17 | ### Setting up dnsmasq 18 | 19 | To install dnsmasq as your DHCP server run: 20 | 21 | import Tabs from '@theme/Tabs'; 22 | import TabItem from '@theme/TabItem'; 23 | 24 | 25 | 26 | ```shell 27 | sudo apt install dnsmasq 28 | ``` 29 | 30 | 31 | ```shell 32 | sudo dnf install dnsmasq 33 | ``` 34 | 35 | 36 | 37 | Set up your configuration file `/etc/dnsmasq.conf` with the following settings: 38 | 39 | :::note 40 | The following steps are examples and may not be the exact steps you need to take for your environment. Make sure to adjust the configuration to your needs. 41 | ::: 42 | 43 | ```shell 44 | # /etc/dnsmasq.conf 45 | 46 | # Set the DHCP Range and lease time 47 | dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h 48 | 49 | # Set the default gateway 50 | dhcp-option=option:router,192.168.1.1 51 | 52 | # Set tne DNS servers 53 | dhcp-option=option:dns-server,8.8.8.8,8.8.4.4 54 | 55 | # Standard PC BIOS 56 | dhcp-match=set:bios,60,PXEClient:Arch:00000 57 | dhcp-boot=tag:bios,netboot.xyz.kpxe,,SERVER_IP_ADDRESS 58 | 59 | # 64-bit x86 EFI 60 | dhcp-match=set:efi64,60,PXEClient:Arch:00007 61 | dhcp-boot=tag:efi64,netboot.xyz.efi,,SERVER_IP_ADDRESS 62 | 63 | # 64-bit x86 EFI (obsolete) 64 | dhcp-match=set:efi64-2,60,PXEClient:Arch:00009 65 | dhcp-boot=tag:efi64-2,netboot.xyz.efi,,SERVER_IP_ADDRESS 66 | 67 | # 64-bit UEFI for arm64 68 | dhcp-match=set:efi64-3,60,PXEClient:Arch:0000B 69 | dhcp-boot=tag:efi64-3,netboot.xyz-arm64.efi,,SERVER_IP_ADDRESS 70 | ``` 71 | 72 | A breakdown of the configuration: 73 | 74 | - `dhcp-range` sets the range of IP addresses and lease times that will be assigned to clients. 75 | - `dhcp-option` sets the default gateway and DNS servers. 76 | - `dhcp-boot` sets the boot file for different architectures, the `SERVER_IP_ADDRESS` should be replaced with the IP address of the host running the Docker container. 77 | - `dhcp-match` sets the match criteria for different architectures. 78 | 79 | Once the dnsmasq configuration is set, you can enable and start the service: 80 | 81 | ```shell 82 | sudo systemctl enable dnsmasq 83 | sudo systemctl start dnsmasq 84 | ``` 85 | 86 | ## netboot.xyz boot file types 87 | 88 | The following bootfile names can be set as the boot file in the DHCP configuration depending on your needs. They are baked into the Docker image: 89 | 90 | | bootfile name | description | 91 | | --------------------------------|----------------------------------------------------------------------| 92 | | `netboot.xyz.kpxe` | Legacy DHCP boot image file, uses built-in iPXE NIC drivers | 93 | | `netboot.xyz-undionly.kpxe` | Legacy DHCP boot image file, use if you have NIC issues | 94 | | `netboot.xyz.efi` | UEFI boot image file, uses built-in UEFI NIC drivers | 95 | | `netboot.xyz-snp.efi` | UEFI w/ Simple Network Protocol, attempts to boot all net devices | 96 | | `netboot.xyz-snponly.efi` | UEFI w/ Simple Network Protocol, only boots from device chained from | 97 | | `netboot.xyz-arm64.efi` | DHCP EFI boot image file, uses built-in iPXE NIC drivers | 98 | | `netboot.xyz-arm64-snp.efi` | UEFI w/ Simple Network Protocol, attempts to boot all net devices | 99 | | `netboot.xyz-arm64-snponly.efi` | UEFI w/ Simple Network Protocol, only boots from device chained from | 100 | -------------------------------------------------------------------------------- /docs/docker/custom-menus.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: custom-menus 3 | title: Custom Menus 4 | sidebar_position: 5 5 | description: "How to create and use custom iPXE menus using the web interface" 6 | hide_table_of_contents: false 7 | --- 8 | 9 | # Custom Menus 10 | 11 | The netboot.xyz web interface allows you to create custom iPXE menus that can be integrated into your netboot.xyz environment. This feature enables you to add your own boot options, utilities, or custom configurations without modifying the core netboot.xyz code. 12 | 13 | ## Prerequisites 14 | 15 | - Access to the netboot.xyz web interface 16 | - Basic understanding of iPXE scripting 17 | - Ability to modify configuration files 18 | 19 | ## Creating a Custom Menu 20 | 21 | ### Step 1: Enable Custom Menu in Configuration 22 | 23 | First, you need to modify the `boot.cfg` file to enable custom menu support: 24 | 25 | ```bash 26 | set menu custom-user 27 | ``` 28 | 29 | This setting tells netboot.xyz to include the custom menu option in the main menu. 30 | 31 | ### Step 2: Create the Custom Menu File 32 | 33 | 1. Navigate to the netboot.xyz web interface 34 | 2. Click on the **Menus** option in the header 35 | 3. Create a new file with the filename `custom.ipxe` 36 | 37 | ### Step 3: Update the Menu Configuration 38 | 39 | You need to update the `menu.ipxe` file to properly chain to your custom menu: 40 | 41 | Replace the existing line: 42 | ```bash 43 | chain custom/custom.ipxe 44 | ``` 45 | 46 | With: 47 | ```bash 48 | chain custom.ipxe 49 | ``` 50 | 51 | ### Step 4: Configure Your Custom Menu 52 | 53 | Inside the `custom.ipxe` file you created, add your custom menu configuration. You can structure your menu using standard iPXE syntax. 54 | 55 | ## Menu Structure Example 56 | 57 | Here's a basic structure for your custom menu: 58 | 59 | ```bash 60 | #!ipxe 61 | ######## CUSTOM MENU ######## 62 | 63 | :custom_menu 64 | menu Custom Boot Options 65 | item --gap -- Custom Options: 66 | item custom_option1 Custom Option 1 67 | item custom_option2 Custom Option 2 68 | item --gap -- Tools: 69 | item custom_tool1 Custom Tool 1 70 | item --gap -- Return: 71 | item return Return to Main Menu 72 | choose --default return --timeout 10000 custom_target && goto ${custom_target} 73 | 74 | :custom_option1 75 | # Add your custom boot logic here 76 | echo Booting Custom Option 1... 77 | # Add your boot commands 78 | goto custom_menu 79 | 80 | :custom_option2 81 | # Add your custom boot logic here 82 | echo Booting Custom Option 2... 83 | # Add your boot commands 84 | goto custom_menu 85 | 86 | :custom_tool1 87 | # Add your custom tool logic here 88 | echo Loading Custom Tool 1... 89 | # Add your tool commands 90 | goto custom_menu 91 | 92 | :return 93 | exit 94 | ``` 95 | 96 | ## Resources and Examples 97 | 98 | ### Example Configuration 99 | 100 | For a complete example of a custom menu configuration, visit: 101 | - [netboot.xyz-custom example](https://github.com/netbootxyz/netboot.xyz-custom/blob/master/custom.ipxe.example) 102 | 103 | ### iPXE Documentation 104 | 105 | For detailed information about iPXE commands and syntax: 106 | - [iPXE Commands Reference](https://ipxe.org/cmd) 107 | 108 | ### Community Examples 109 | 110 | You can find additional examples and inspiration from other users' configurations: 111 | - [netboot.xyz-custom repository forks](https://github.com/netbootxyz/netboot.xyz-custom/forks) 112 | 113 | ## Best Practices 114 | 115 | 1. **Test your menu thoroughly** - Always test your custom menu in a safe environment before deploying to production 116 | 2. **Keep it simple** - Start with basic menu items and gradually add complexity 117 | 3. **Document your changes** - Comment your iPXE code to make it easier to maintain 118 | 4. **Use descriptive names** - Choose clear, descriptive names for your menu items 119 | 5. **Handle errors gracefully** - Include error handling in your custom boot logic 120 | 121 | ## Troubleshooting 122 | 123 | ### Common Issues 124 | 125 | - **Menu not appearing**: Ensure `set menu custom-user` is properly set in `boot.cfg` 126 | - **File not found**: Verify that `custom.ipxe` exists in the correct location 127 | - **Syntax errors**: Check your iPXE syntax using the command reference 128 | - **Boot failures**: Test individual boot commands before integrating them into the menu 129 | 130 | ### Getting Help 131 | 132 | If you encounter issues with your custom menu: 133 | 1. Check the [iPXE documentation](https://ipxe.org/cmd) for command syntax 134 | 2. Review the [example configuration](https://github.com/netbootxyz/netboot.xyz-custom/blob/master/custom.ipxe.example) 135 | 3. Ask for help in the netboot.xyz community forums or GitHub discussions 136 | 137 | ## Related Documentation 138 | 139 | - [Self Hosting](../selfhosting.md) - For information about self-hosted custom options 140 | - [FAQ](../faq.md) - For general questions about netboot.xyz 141 | - [Quick Start](../quick-start.md) - For getting started with netboot.xyz -------------------------------------------------------------------------------- /docs/selfhosting.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: selfhosting 3 | title: Self Hosting 4 | sidebar_position: 4 5 | description: "How to self host your own netboot.xyz in your environment" 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ### How can I self host netboot.xyz? 10 | 11 | netboot.xyz was originally a hosted only tool and used static source files that were difficult to customize. Now you can generate your own self hosted environment using the same tooling to generate the hosted site. 12 | 13 | [Ansible](https://www.ansible.com/), an open-source automation engine, is utilized to generate custom templates based on a set of default configurations which can then be overridden by the user. This allows a user to customize a netboot.xyz environment to their specification and set up a PXE server easily. The Ansible playbooks will generate: 14 | 15 | * Menus for their netboot.xyz environment using default configuration settings 16 | * iPXE Bootloaders for booting into that environment 17 | * Customized menu options for those who have additional options they want to add 18 | 19 | #### Role structure 20 | 21 | The netbootxyz Ansible [role](https://github.com/netbootxyz/netboot.xyz/tree/master/roles/netbootxyz) is located in the main netboot.xyz repository. Most of the logic for netboot.xyz is contained in these areas: 22 | 23 | * `defaults/main.yml` - Consists default settings for deployment, OS versions, Utilities, and Bootloaders 24 | * `tasks/*` - Contains all tasks for rendering templates and compiling iPXE bootloaders 25 | * `templates/disks` - Templates for iPXE bootloaders 26 | * `templates/menus` - Templates for netboot.xyz menus 27 | * `vars/*` - Contain required package lists needed to support the compile and deployment of netboot.xyz 28 | 29 | #### Deploying using Ansible 30 | 31 | To run a deployment using Ansible, install Ansible, Apache and git: 32 | 33 | import Tabs from '@theme/Tabs'; 34 | import TabItem from '@theme/TabItem'; 35 | 36 | 37 | 38 | ```shell 39 | sudo apt install -y ansible git apache2 40 | ``` 41 | 42 | 43 | ```bash 44 | sudo dnf install -y ansible git httpd 45 | ``` 46 | 47 | 48 | 49 | Then check out the netboot.xyz repo: 50 | 51 | ```bash 52 | git clone https://github.com/netbootxyz/netboot.xyz.git /opt/netboot.xyz 53 | ``` 54 | 55 | Finally run the Ansible playbook: 56 | 57 | ```bash 58 | cd /opt/netboot.xyz 59 | ansible-playbook -i inventory site.yml 60 | ``` 61 | 62 | The output will be dropped into `/var/www/html` by default. You can override this to deploy to the web server directory of your choice. 63 | 64 | #### Deploying with Docker 65 | 66 | You can also leverage Docker to generate the netboot.xyz menu and disks in a container which then outputs the results of the rendered templates and compiled iPXE disks into a directory. First ensure you have Docker installed and then run: 67 | 68 | ```bash 69 | docker build -t localbuild -f Dockerfile . 70 | docker run --rm -it -v $(pwd):/buildout localbuild 71 | ``` 72 | 73 | The build output will be in the generated folder `buildout`. Docker provides a consistent and isolated environment for generating the build output. From there you'd drop the files into the root of your favorite web server. 74 | 75 | #### Local Overrides 76 | 77 | Ansible will handle source generation as well as iPXE disk generation with your settings. It will generate Legacy (PCBIOS) and UEFI iPXE disks that can be used to load into your netboot.xyz environment. If you want to override the defaults, you can put overrides in user_overrides.yml. See [`user_overrides.yml`](https://github.com/netbootxyz/netboot.xyz/blob/master/user_overrides.yml) for examples. 78 | 79 | Using the overrides file, you can override all of the settings from the defaults/main.yml so that you can easily change the boot mirror URLs when the menus are rendered. If you prefer to do this after the fact, you can also edit the boot.cfg to make changes, but keep in mind those changes will not be saved when you redeploy the menu. 80 | 81 | #### Self Hosted Custom Options 82 | 83 | In addition to being able to host netboot.xyz locally, you can also create your own custom templates for custom menus within netboot.xyz. Those templates are rendered during deployment and are available from the main menu via the custom menu option. 84 | 85 | When these options are set: 86 | 87 | ```bash 88 | custom_generate_menus: true 89 | custom_templates_dir: "{{ netbootxyz_conf_dir }}/custom" 90 | ``` 91 | 92 | The menu will add an option for custom menus and attempt to load into custom/custom.ipxe. From there custom options can be built and maintained separately from the netboot.xyz source tree so that both menus can be updated independently. 93 | 94 | A sample menu is provided to demonstrate how to configure and set up a menu. You can copy the custom directory from the repo: 95 | 96 | ```bash 97 | cp etc/netbootxyz/custom /etc/netbootxyz/custom 98 | ``` 99 | -------------------------------------------------------------------------------- /blog/2016-01-07-booting-linux-isos-with-memdisk-and-ipxe.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2016/01/07/booting-linux-isos-with-memdisk-and-ipxe 3 | title: Booting Linux ISOs with Memdisk and iPXE 4 | authors: 5 | - antonym 6 | tags: [iso, memdisk, netboot.xyz, ipxe] 7 | --- 8 | 9 | There are a number of distributions out there that provide proper support for booting the distribution over the network. A lot of the more popular distributions usually provide a installer kernels that can be easily downloaded for use. You point at the vmlinuz and the initrd and can them immediately proceed with the install streaming down packages as needed. These distributions make it great for tools like [netboot.xyz](http://netboot.xyz) to install using iPXE. 10 | 11 | There are some distributions out there that don't have this functionality and typically only produce the ISO without any repositories that provide installer kernels or the rootfs. 12 | 13 | In those cases, occasionally you can use memdisk and iPXE to boot those ISOs but they don't always work. In doing some research, I ran across one of the major issues as to why. 14 | 15 | 16 | 17 | ### Syslinux - Memdisk 18 | 19 | _The following was taken from [syslinux - memdisk](http://www.syslinux.org/wiki/index.php/MEMDISK)._ 20 | 21 | The majority of Linux based CD images will also fail to work with MEMDISK ISO emulation. Linux distributions require kernel and initrd files to be specified, as soon as these files are loaded the protected mode kernel driver(s) take control and the virtual CD will no longer be accessible. If any other files are required from the CD/DVD they will be missing, resulting in boot error(s). Linux distributions that only require kernel and initrd files function fully via ISO emulation, as no other data needs accessing from the virtual CD/DVD drive once they have been loaded. The boot loader has read all necessary files to memory by using INT 13h, before booting the kernel. 22 | 23 | There is also another solution, which requires the phram and mtdblock kernel module and memdiskfind utility of the Syslinux package (utils/memdiskfind). memdiskfind will detect the MEMDISK mapped image and will print the start and length of the found MEMDISK mapped image in a format phram understands: 24 | 25 | modprobe phram phram=memdisk,$(memdiskfind) 26 | modprobe mtdblock 27 | 28 | This will create a /dev/mtdblock0 device, which should be the .ISO image, and should be mountable. 29 | 30 | If your image is bigger than 128MiB and you have a 32-bit OS, then you have to increase the maximum memory usage of vmalloc, by adding: 31 | 32 | vmalloc=Mi 33 | 34 | _Example: vmalloc=256Mi to your kernel parameters._ 35 | 36 | memdiskfind can be compiled with the klibc instead of with the glibc C library to get a much smaller binary for use in the initramfs: 37 | 38 | cd ./syslinux-4.04/utils/ 39 | make spotless 40 | make CC=klcc memdiskfind 41 | 42 | ### Implementations of phram and mtdblock 43 | 44 | ArchLinux has implemented the above concept [here](https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio/-/blob/master/install/memdisk) and [here](https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio/-/blob/master/hooks/memdisk). 45 | 46 | Debian Live used it [here](https://anonscm.debian.org/cgit/debian-live/live-boot.git/commit/?id=e08c082e758afa3341a9ebb6e00927d9873c7230). 47 | 48 | It's also been implemented in Clonezilla and [GParted](http://gparted-forum.surf4.info/viewtopic.php?id=17263). 49 | 50 | [Antergos Linux](https://antergos.com/) based on Arch Linux works great with memdisk using the phram module. 51 | 52 | _Editor's Note: Antergos Linux is defunct. Visit the archived website [here](https://web.archive.org/web/20190816015938/https://antergos.com/). Antergos Linux's sucessor is [Endeavour OS](https://endeavouros.com/)._ 53 | 54 | ### Conclusion 55 | 56 | I think it would be great for more distributions to attempt to implement something like this so that iPXE tools can be used to load the ISOs instead of actually having to burn or look for the location of the latest ISO every time. 57 | 58 | Some of the distributions I'd love to see network support or better memdisk support are: 59 | 60 | [Linux Mint](http://www.linuxmint.com/) 61 | [Manjaro](http://manjaro.org/) 62 | [Elementary](http://elementary.io/) 63 | [Solus Project](https://solus-project.com/) 64 | 65 | There are also many other new distributions being released all the time. I typically use [DistroWatch](http://distrowatch.com/) to determine the most popular distributions to attempt to add to [netboot.xyz](http://netboot.xyz). I'd love to get a lot of these added to make it really easy to install anything on the fly. 66 | 67 | I'd also love to see some of the hypervisors out there crack open the ISOs, pull them outside of their paywalls, and host the bits on their servers so that it's much easier to immediately boot an install to test something out without having to jump through many hoops. I have working installs for [VMware ESX](https://www.vmware.com/products/esxi-and-esx/overview) and [Citrix Hypervisor (formerly Citrix XenServer)](https://www.citrix.com/products/citrix-hypervisor/) but I'd need to have them host the bits or allow permission to do so for a public facing installer menu. 68 | -------------------------------------------------------------------------------- /docs/kb/providers/openstack.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: openstack 3 | title: "OpenStack" 4 | description: "Using netboot.xyz with OpenStack" 5 | hide_table_of_contents: true 6 | --- 7 | 8 | **Experimental, haven't had a chance to run through this recently so YMMV.** 9 | 10 | The netboot.xyz ISO image can be used with OpenStack clouds to boot an instance 11 | and perform a custom installation of an operating system. 12 | 13 | ### Command line 14 | 15 | Start by downloading the ISO and then import it into glance: 16 | 17 | ``` 18 | $ wget https://boot.netboot.xyz/ipxe/netboot.xyz.iso 19 | $ glance image-create --name netboot.xyz \ 20 | --disk-format iso \ 21 | --container-format bare \ 22 | --file netboot.xyz-dhcp.iso \ 23 | --visibility public 24 | +------------------+--------------------------------------+ 25 | | Property | Value | 26 | +------------------+--------------------------------------+ 27 | | checksum | 45cdcb89576b6c05598b11585aef46bc | 28 | | container_format | bare | 29 | | created_at | 2016-01-27T20:02:06Z | 30 | | disk_format | iso | 31 | | id | 4f11d49e-157b-4740-87ad-db7d59bb5d6d | 32 | | min_disk | 0 | 33 | | min_ram | 0 | 34 | | name | netboot.xyz | 35 | | owner | fbfce4cb346c4f9097a977c54904cafd | 36 | | protected | False | 37 | | size | 1048576 | 38 | | status | active | 39 | | tags | [] | 40 | | updated_at | 2016-01-27T20:02:04Z | 41 | | virtual_size | None | 42 | | visibility | public | 43 | +------------------+--------------------------------------+ 44 | ``` 45 | 46 | It should only take a few seconds to import. Take the UUID from the `id` field 47 | returned by glance and verify that the image imported successfully: 48 | 49 | ``` 50 | $ glance image-show 4f11d49e-157b-4740-87ad-db7d59bb5d6d 51 | +------------------+--------------------------------------+ 52 | | Property | Value | 53 | +------------------+--------------------------------------+ 54 | | checksum | 45cdcb89576b6c05598b11585aef46bc | 55 | | container_format | bare | 56 | | created_at | 2016-01-27T20:02:06Z | 57 | | disk_format | iso | 58 | | id | 4f11d49e-157b-4740-87ad-db7d59bb5d6d | 59 | | min_disk | 0 | 60 | | min_ram | 0 | 61 | | name | netboot.xyz | 62 | | owner | fbfce4cb346c4f9097a977c54904cafd | 63 | | protected | False | 64 | | size | 1048576 | 65 | | status | active | 66 | | tags | [] | 67 | | updated_at | 2016-01-27T20:02:04Z | 68 | | virtual_size | None | 69 | | visibility | public | 70 | +------------------+--------------------------------------+ 71 | ``` 72 | 73 | The image has a status of `active`, so we know that glance imported it 74 | properly. 75 | 76 | Let's boot a new instance with this ISO: 77 | 78 | ``` 79 | nova boot --flavor m1.small \ 80 | --image \ 81 | --nic net-id= \ 82 | netbootxyz-testing 83 | ``` 84 | 85 | Wait about 30 seconds, then request a console URL: 86 | 87 | ``` 88 | nova get-spice-console c4ff017e-1234-4053-b740-e83eade277b9 spice-html5 89 | ``` 90 | 91 | Open the console URL that nova returns and you should see the familiar 92 | netboot.xyz iPXE interface in the spice console! 93 | 94 | ### Horizon 95 | 96 | Start by [downloading the netboot.xyz ISO](https://boot.netboot.xyz/ipxe/netboot.xyz.iso) 97 | to your local workstation. Follow these steps to import the image into your 98 | OpenStack cloud using Horizon: 99 | 100 | * Click the _Compute_ tab on the left side, then click _Images_ 101 | * Click _Create Image_ (top right) 102 | * Name: `netboot.xyz ISO` 103 | * Image Source: Image File 104 | * Image File: (browse to the ISO you downloaded) 105 | * Format: ISO - Optical Disk Image 106 | * Public: Checked (optional, but recommended if you want other tenants to use 107 | it) 108 | * Click _Create Image_ 109 | 110 | Wait a moment for the status to become `active`. This should only take a few 111 | seconds. To boot an instance with the ISO you uploaded, be sure to choose 112 | _Boot from image_ and select _netboot.xyz ISO_ from the drop down list. 113 | Configure networking and security groups as you normally would for any other 114 | instance. 115 | 116 | When the instance has fully built and gone to active status, click on the 117 | instance name and then go to the _Console_ tab. Depending on your browser, 118 | you may need to click the link to show only the console. 119 | 120 | At that point, you should be able to view the netboot.xyz iPXE menu and install 121 | your operating system. 122 | -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | const XSvg = 2 | ''; 3 | 4 | module.exports = { 5 | title: "netboot.xyz", 6 | tagline: "your favorite operating systems in one place", 7 | url: "https://netboot.xyz", 8 | baseUrl: "/", 9 | onBrokenLinks: "throw", 10 | onBrokenMarkdownLinks: "warn", 11 | favicon: "img/favicon.ico", 12 | organizationName: "netbootxyz", 13 | projectName: "netboot.xyz", 14 | markdown: { 15 | mermaid: true, 16 | }, 17 | staticDirectories: ['static'], 18 | themes: ['@docusaurus/theme-mermaid'], 19 | themeConfig: { 20 | metadata: [ 21 | {name: 'keywords', content: 'ipxe, netbootxyz, pxe, linux, os, operating system, install, installer, netboot, netboot.xyz, network boot, tftp, uefi'}, 22 | {name: 'description', content: 'Network boot your favorite operating systems, installers and utilities from one menu over the network with iPXE'}, 23 | {name: 'author', content: 'netboot.xyz team'}, 24 | {property: 'og:type', content: 'website'}, 25 | {property: 'og:image', content: 'https://netboot.xyz/img/nbxyz_logo_name.png'}, 26 | {name: 'twitter:card', content: 'summary_large_image'}, 27 | {name: 'twitter:site', content: '@netbootxyz'} 28 | ], 29 | prism: { 30 | additionalLanguages: ['bash', 'yaml', 'json', 'nginx', 'ini', 'powershell', 'python'], 31 | }, 32 | docs: { 33 | sidebar: { 34 | hideable: true, 35 | }, 36 | }, 37 | docsSideNavCollapsible: true, 38 | image: 'img/nbxyz_logo_name.png', 39 | mermaid: { 40 | theme: {light: 'neutral', dark: 'dark'}, 41 | }, 42 | announcementBar: { 43 | id: "announcementBar-1", // Increment on change 44 | content: `If you like netboot.xyz, give it a star on GitHub⭐️, follow us on ${XSvg} and join our Discord!`, 45 | }, 46 | colorMode: { 47 | defaultMode: "light", 48 | disableSwitch: false, 49 | }, 50 | algolia: { 51 | appId: "BMY28LDVW4", 52 | apiKey: "51b51a157c47742003b8943f2c5acc09", 53 | indexName: "netboot", 54 | contextualSearch: true, 55 | searchParameters: { 56 | facetFilters: [], 57 | }, 58 | searchPagePath: 'search', 59 | }, 60 | navbar: { 61 | title: "netboot.xyz", 62 | logo: { 63 | alt: "netboot.xyz", 64 | src: "img/nbxyz-logo.svg", 65 | srcDark: "img/nbxyz-logo-dark.svg", 66 | }, 67 | items: [ 68 | { 69 | to: "docs", 70 | activeBasePath: "docs", 71 | label: "Docs", 72 | position: "left", 73 | }, 74 | { 75 | to: "downloads", 76 | activeBasePath: "downloads", 77 | label: "Downloads", 78 | position: "left", 79 | }, 80 | { 81 | to: "blog", 82 | label: "Blog", 83 | position: "left", 84 | }, 85 | { 86 | href: "https://store.netboot.xyz", 87 | label: "Store", 88 | position: "left", 89 | }, 90 | { 91 | href: "https://github.com/sponsors/netbootxyz", 92 | label: "Donate", 93 | position: "left", 94 | }, 95 | { 96 | href: "https://github.com/netbootxyz/netboot.xyz", 97 | position: "right", 98 | className: "header-github-link", 99 | "aria-label": "GitHub repository", 100 | }, 101 | ], 102 | }, 103 | footer: { 104 | style: "dark", 105 | links: [ 106 | { 107 | title: "Docs", 108 | items: [ 109 | { 110 | label: "Documentation", 111 | to: "docs", 112 | }, 113 | { 114 | label: "Downloads", 115 | to: "downloads", 116 | }, 117 | { 118 | label: "Blog", 119 | to: "blog", 120 | }, 121 | ], 122 | }, 123 | { 124 | title: "Community", 125 | items: [ 126 | { 127 | label: "Discord", 128 | href: "https://discord.gg/An6PA2a", 129 | }, 130 | { 131 | label: "Discussions", 132 | href: "https://github.com/orgs/netbootxyz/discussions", 133 | }, 134 | { 135 | label: "X", 136 | href: "https://x.com/netbootxyz", 137 | }, 138 | ], 139 | }, 140 | { 141 | title: "More", 142 | items: [ 143 | { 144 | label: "Donate", 145 | href: "https://opencollective.com/netbootxyz/donate", 146 | }, 147 | { 148 | label: "GitHub", 149 | href: "https://github.com/netbootxyz/netboot.xyz", 150 | }, 151 | { 152 | label: "Status", 153 | href: "https://status.netboot.xyz", 154 | }, 155 | { 156 | label: "Store", 157 | href: "https://store.netboot.xyz", 158 | }, 159 | ], 160 | }, 161 | ], 162 | copyright: `Copyright © ${new Date().getFullYear()} netboot.xyz`, 163 | }, 164 | }, 165 | plugins: [ 166 | [ 167 | '@docusaurus/plugin-ideal-image', 168 | { 169 | quality: 70, 170 | max: 1030, 171 | min: 640, 172 | steps: 2, 173 | disableInDev: false, 174 | }, 175 | ], 176 | ], 177 | presets: [ 178 | [ 179 | "@docusaurus/preset-classic", 180 | { 181 | docs: { 182 | sidebarPath: require.resolve("./sidebars.js"), 183 | editUrl: 184 | "https://github.com/netbootxyz/netboot.xyz-docs/edit/master/", 185 | }, 186 | blog: { 187 | showReadingTime: true, 188 | editUrl: 189 | "https://github.com/netbootxyz/netboot.xyz-docs/edit/master/", 190 | }, 191 | theme: { 192 | customCss: require.resolve("./src/css/custom.css"), 193 | }, 194 | gtag: { 195 | trackingID: "G-VBSC8VX50S", 196 | }, 197 | }, 198 | ], 199 | ], 200 | }; 201 | -------------------------------------------------------------------------------- /docs/docker/usage.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Setting up the Container 3 | sidebar_position: 2 4 | description: "Setting up the netboot.xyz Docker Container" 5 | hide_table_of_contents: true 6 | --- 7 | 8 | The netboot.xyz Docker image requires an existing DHCP server to be setup and running in order to boot from it. The image does not start a DHCP server service. Please see the DHCP configuration setup near the end of this document for ideas on how to enable your environment to talk to the container. In most cases, you will need to specify the next-server and boot file name in the DHCP configuration. 9 | 10 | ### Installing Docker 11 | 12 | If you have not set up Docker on your system, you can follow the instructions below to install it. The following examples are for Debian, Ubuntu, and Red Hat based systems. 13 | 14 | import Tabs from '@theme/Tabs'; 15 | import TabItem from '@theme/TabItem'; 16 | 17 | 18 | 19 | 20 | ```shell 21 | # Add Docker's official GPG key: 22 | sudo apt-get update 23 | sudo apt-get install ca-certificates curl 24 | sudo install -m 0755 -d /etc/apt/keyrings 25 | sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc 26 | sudo chmod a+r /etc/apt/keyrings/docker.asc 27 | 28 | # Add the repository to Apt sources: 29 | echo \ 30 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ 31 | $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ 32 | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 33 | sudo apt-get update 34 | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 35 | ``` 36 | 37 | 38 | ```bash 39 | # Add Docker's official GPG key: 40 | sudo apt-get update 41 | sudo apt-get install ca-certificates curl 42 | sudo install -m 0755 -d /etc/apt/keyrings 43 | sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc 44 | sudo chmod a+r /etc/apt/keyrings/docker.asc 45 | 46 | # Add the repository to Apt sources: 47 | echo \ 48 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ 49 | $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ 50 | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 51 | sudo apt-get update 52 | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 53 | ``` 54 | 55 | 56 | ```bash 57 | # Setup Repository 58 | sudo dnf -y install dnf-plugins-core 59 | sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 60 | # Install Docker 61 | sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 62 | # Start the Docker service 63 | sudo systemctl enable --now docker 64 | ``` 65 | 66 | 67 | 68 | :::note 69 | If you are using a different distribution, please refer to the [official Docker documentation](https://docs.docker.com/get-docker/) for installation instructions. 70 | ::: 71 | 72 | ### Pulling the Docker image 73 | 74 | The netboot.xyz container image is available from the GitHub Container Registry as well as Docker Hub. The image is updated regularly and is the recommended way to get the latest version of the container: 75 | 76 | 77 | 78 | 79 | ```shell 80 | docker pull ghcr.io/netbootxyz/netbootxyz 81 | ``` 82 | 83 | 84 | ```shell 85 | docker pull netbootxyz/netbootxyz 86 | ``` 87 | 88 | 89 | 90 | The following snippets are examples of starting up the container. 91 | 92 | ### Starting up the container with the Docker CLI 93 | 94 | ```shell 95 | docker run -d \ 96 | --name=netbootxyz \ 97 | -e MENU_VERSION=2.0.84 `# optional` \ 98 | -e NGINX_PORT=80 `# optional` \ 99 | -e WEB_APP_PORT=3000 `# optional` \ 100 | -p 3000:3000 `# sets web configuration interface port, destination should match ${WEB_APP_PORT} variable above.` \ 101 | -p 69:69/udp `# sets tftp port` \ 102 | -p 8080:80 `# optional, destination should match ${NGINX_PORT} variable above.` \ 103 | -v /local/path/to/config:/config `# optional` \ 104 | -v /local/path/to/assets:/assets `# optional` \ 105 | --restart unless-stopped \ 106 | ghcr.io/netbootxyz/netbootxyz 107 | ``` 108 | 109 | **To update the image using Docker CLI:** 110 | 111 | ```shell 112 | docker pull ghcr.io/netbootxyz/netbootxyz # pull the latest image down 113 | docker stop netbootxyz # stop the existing container 114 | docker rm netbootxyz # remove the image 115 | docker run -d ... # previously ran start command 116 | ``` 117 | 118 | Start the container with the same parameters used above. 119 | 120 | :::note 121 | If the same folders are used your settings will remain. If you want to start fresh, you can remove the paths and start over. 122 | ::: 123 | 124 | ### Starting up the container with Docker Compose 125 | 126 | 1. Copy [docker-compose.yml.example](https://github.com/netbootxyz/docker-netbootxyz/blob/master/docker-compose.yml.example) to docker-compose.yml 127 | 1. Edit as needed 128 | 1. Run `docker compose up -d netbootxyz` to start containers in the background 129 | 1. Run `docker compose logs -f netbootxyz` to view logs 130 | 131 | **To update the image using Docker Compose:** 132 | 133 | ```shell 134 | docker compose pull netbootxyz # pull the latest image down 135 | docker compose up -d netbootxyz # start containers in the background 136 | ``` 137 | 138 | ### Accessing the container services 139 | 140 | Once the container is started, the following services will be available via browser: 141 | 142 | | Service | Description | 143 | |-----------------------|-----------------------------| 144 | | http://localhost:3000 | Web configuration interface | 145 | | http://localhost:8080 | Downloaded web assets | 146 | 147 | :::note 148 | If you wish to remove the configuration, you can remove the local configuration folders and upon restart of the container, it will load the default configurations. 149 | ::: 150 | 151 | ### Local Mirror Access 152 | 153 | If you want to pull the Live Images images down to your own mirror and boot off them you will need to update the `live_endpoint` variable in `local-vars.ipxe` file within the web configuration interface. 154 | 155 | The [local-vars.ipxe](https://github.com/netbootxyz/netboot.xyz/blob/master/roles/netbootxyz/templates/local-vars.ipxe.j2) is a file that is checked early during the boot [process](https://github.com/netbootxyz/netboot.xyz/blob/master/roles/netbootxyz/templates/disks/netboot.xyz.j2#L99) and will load up variables into netboot.xyz. Using this file, you can set overriddes for variables early in the boot process. 156 | 157 | By default the `live_endpoint` variable is set to upstream location of `https://github.com/netbootxyz`. If you want to override this, set `live_endpoint` to your deployment IP or domain, e.g. `http://192.168.0.50:8080`. It will then redirect asset download to the local location you set for assets on port `8080` and you can download the assets by using the local assets menu down to your local server. This can result in much faster boot times. 158 | -------------------------------------------------------------------------------- /src/pages/downloads.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme/Layout'; 3 | import DownloadSection from '../components/DownloadSection'; 4 | import styles from './downloads.module.css'; 5 | 6 | const getTypeIcon = type => { 7 | const icons = { 8 | ISO: '💿', 9 | USB: '🔌', 10 | Kernel: '⚡', 11 | Floppy: '💾', 12 | DHCP: '🌐', 13 | 'DHCP-undionly': '🔧', 14 | 'DHCP-snp': '⚙️', 15 | 'DHCP-snponly': '🔗', 16 | 'USB/SD Card': '📱', 17 | }; 18 | return icons[type] || '📦'; 19 | }; 20 | 21 | export default function Downloads() { 22 | const popularDownloads = [ 23 | { 24 | title: 'netboot.xyz.iso', 25 | description: 26 | 'Universal ISO image for CD/DVD, Virtual CDs, DRAC/iLO, VMware, VirtualBox. Works with both Legacy BIOS and UEFI systems.', 27 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz.iso', 28 | type: 'ISO', 29 | isRecommended: true, 30 | icon: getTypeIcon('ISO'), 31 | }, 32 | { 33 | title: 'netboot.xyz.img', 34 | description: 35 | 'USB bootable image for creating USB keys. Supports both Legacy BIOS and UEFI systems.', 36 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz.img', 37 | type: 'USB', 38 | isRecommended: true, 39 | icon: getTypeIcon('USB'), 40 | }, 41 | { 42 | title: 'Multi-arch ISO', 43 | description: 44 | 'Combined x86_64 and ARM64 ISO image. Perfect for mixed environments with different architectures.', 45 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-multiarch.iso', 46 | type: 'ISO', 47 | icon: getTypeIcon('ISO'), 48 | }, 49 | { 50 | title: 'Multi-arch USB', 51 | description: 52 | 'Combined x86_64 and ARM64 USB image for creating universal USB keys.', 53 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-multiarch.img', 54 | type: 'USB', 55 | icon: getTypeIcon('USB'), 56 | }, 57 | ]; 58 | 59 | const legacyBootloaders = [ 60 | { 61 | title: 'netboot.xyz.lkrn', 62 | description: 63 | 'Linux kernel format for booting from GRUB or EXTLINUX bootloaders.', 64 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz.lkrn', 65 | type: 'Kernel', 66 | icon: getTypeIcon('Kernel'), 67 | }, 68 | { 69 | title: 'netboot.xyz.dsk', 70 | description: 71 | 'Virtual floppy disk image for older systems, DRAC/iLO, VMware, VirtualBox.', 72 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz.dsk', 73 | type: 'Floppy', 74 | icon: getTypeIcon('Floppy'), 75 | }, 76 | { 77 | title: 'netboot.xyz.pdsk', 78 | description: 79 | 'Padded virtual floppy disk for systems that require specific disk geometry.', 80 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz.pdsk', 81 | type: 'Floppy', 82 | icon: getTypeIcon('Floppy'), 83 | }, 84 | { 85 | title: 'netboot.xyz.kpxe', 86 | description: 87 | 'DHCP network boot image with built-in iPXE NIC drivers for PXE booting.', 88 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe', 89 | type: 'DHCP', 90 | icon: getTypeIcon('DHCP'), 91 | }, 92 | { 93 | title: 'netboot.xyz-undionly.kpxe', 94 | description: 95 | 'DHCP network boot image for systems with problematic network cards.', 96 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-undionly.kpxe', 97 | type: 'DHCP-undionly', 98 | icon: getTypeIcon('DHCP-undionly'), 99 | }, 100 | ]; 101 | 102 | const uefiBootloaders = [ 103 | { 104 | title: 'netboot.xyz.efi', 105 | description: 'UEFI DHCP boot image with built-in iPXE NIC drivers.', 106 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz.efi', 107 | type: 'DHCP', 108 | icon: getTypeIcon('DHCP'), 109 | }, 110 | { 111 | title: 'netboot.xyz-snp.efi', 112 | description: 113 | 'UEFI with Simple Network Protocol, attempts to boot from all network devices.', 114 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-snp.efi', 115 | type: 'DHCP-snp', 116 | icon: getTypeIcon('DHCP-snp'), 117 | }, 118 | { 119 | title: 'netboot.xyz-snponly.efi', 120 | description: 121 | 'UEFI with Simple Network Protocol, only boots from the device it was chained from.', 122 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-snponly.efi', 123 | type: 'DHCP-snponly', 124 | icon: getTypeIcon('DHCP-snponly'), 125 | }, 126 | ]; 127 | 128 | const arm64Bootloaders = [ 129 | { 130 | title: 'netboot.xyz-arm64.efi', 131 | description: 'ARM64 UEFI DHCP boot image with built-in iPXE NIC drivers.', 132 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi', 133 | type: 'DHCP', 134 | icon: getTypeIcon('DHCP'), 135 | }, 136 | { 137 | title: 'netboot.xyz-arm64-snp.efi', 138 | description: 139 | 'ARM64 UEFI with Simple Network Protocol, attempts to boot from all network devices.', 140 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-arm64-snp.efi', 141 | type: 'DHCP-snp', 142 | icon: getTypeIcon('DHCP-snp'), 143 | }, 144 | { 145 | title: 'netboot.xyz-arm64-snponly.efi', 146 | description: 147 | 'ARM64 UEFI with Simple Network Protocol, only boots from device chained from.', 148 | url: 'https://boot.netboot.xyz/ipxe/netboot.xyz-arm64-snponly.efi', 149 | type: 'DHCP-snponly', 150 | icon: getTypeIcon('DHCP-snponly'), 151 | }, 152 | ]; 153 | 154 | return ( 155 | 159 |
160 |
161 |
162 |

Bootloader Downloads

163 |

164 | Download the latest rolling releases of netboot.xyz bootloaders. 165 | These are generated as updates occur and are the most up to date. 166 | All downloads automatically load into{' '} 167 | boot.netboot.xyz. 168 |

169 |
170 |

171 | Looking for release versions? Download them from{' '} 172 | 177 | GitHub Releases 178 | 179 |

180 |
181 |
182 | 183 | 188 | 189 | 196 | 197 | 204 | 205 | 212 | 213 |
214 |

🔐 Verification & Security

215 |

216 | SHA256 checksums are generated during each build and are available{' '} 217 | 222 | here 223 | 224 | . You can also view the embedded scripts{' '} 225 | 230 | on GitHub 231 | 232 | . 233 |

234 |
235 |
236 |
237 |
238 | ); 239 | } 240 | -------------------------------------------------------------------------------- /docs/kb/networking/edgerouter.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: edgerouter 3 | title: "Ubiquiti EdgeRouter" 4 | description: Ubiquiti EdgeRouter Usage 5 | hide_table_of_contents: true 6 | --- 7 | 8 | This document covers how to setup netboot.xyz, a service that provides 9 | iPXE-based installation and live boot of a bunch of operating systems, 10 | on a [Ubiquiti EdgeRouter](https://amzn.to/40zL2oL). 11 | 12 | Thanks go to [Sam Kottler](https://github.com/skottler) for originally writing up this how-to. Improve setup robustness by using the embedded TFTP daemon from dnsmasq by [Yan Grunenberger](https://github.com/ravens) instead of external TFTP package. 13 | 14 | ### Assumptions 15 | 16 | I've made a few assumptions throughout this document that will probably be 17 | different for your setup: 18 | 19 | * There is a DHCP pool called `LAN` 20 | * The `LAN` pool manages `10.10.2.0/24` 21 | 22 | ### Configure tftp support in dnsmasq 23 | 24 | By default, dnsmasq is using in the Edgerouter to provide DNS services. In order to enable it : 25 | 26 | ```bash 27 | sudo mkdir /config/user-data/tftproot 28 | sudo chmod ugo+rX /config/user-data/tftproot 29 | 30 | configure 31 | 32 | set service dns forwarding options enable-tftp 33 | set service dns forwarding options tftp-root=/config/user-data/tftproot 34 | 35 | commit 36 | save 37 | ``` 38 | 39 | ### Setup TFTP components 40 | 41 | Download the kpxe image for netboot.xyz and set the permissions properly: 42 | 43 | ```bash 44 | sudo curl -o /config/user-data/tftproot/netboot.xyz.kpxe https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe 45 | sudo chmod ugo+r /config/user-data/tftproot/netboot.xyz.kpxe 46 | ``` 47 | 48 | At this point you should be able to use a TFTP client from a client in 49 | `10.10.2.0/24` to fetch the image: 50 | 51 | ```bash 52 | $ tftp 10.10.2.1 53 | tftp> get netboot.xyz.kpxe 54 | Received 354972 bytes in 2.0 seconds 55 | ``` 56 | 57 | ### Configure dhcpd 58 | 59 | We're gonna configure DHCP on the EdgeRouter to serve the right parameters to 60 | clients: 61 | 62 | ```bash 63 | configure 64 | 65 | set service dhcp-server global-parameters "option client-arch code 93 = unsigned integer 16;" 66 | edit service dhcp-server shared-network-name LAN subnet 10.10.2.0/24 67 | set bootfile-server 10.10.2.1 68 | set bootfile-name netboot.xyz.kpxe 69 | 70 | commit 71 | save 72 | ``` 73 | 74 | The configuration for the `LAN` pool should now look something like the following: 75 | 76 | ```bash 77 | skottler@edge1# show service dhcp-server shared-network-name LAN 78 | authoritative enable 79 | subnet 10.10.2.0/24 { 80 | bootfile-name netboot.xyz.kpxe 81 | bootfile-server 10.10.2.1 82 | default-router 10.10.2.1 83 | dns-server 10.10.2.1 84 | lease 86400 85 | start 10.10.2.100 { 86 | stop 10.10.2.199 87 | } 88 | } 89 | [edit] 90 | ``` 91 | 92 | That's it! 93 | 94 | ## The advanced setup with support for Legacy and UEFI 95 | 96 | ### Using ISC DHCP 97 | 98 | This section was written by [Skyler Mäntysaari](https://github.com/samip5). 99 | 100 | This requires that you do not use `set service dhcp-server use-dnsmasq enable`. If you do use that, it will not work. 101 | 102 | We are going to start by removing the PXE boot related things from dhcp-server options, so the commands for that are something like: 103 | 104 | ```bash 105 | delete service dhcp-server shared-network-name LAN subnet 10.10.2.0/24 bootfile-name netboot.xyz.kpxe 106 | delete service dhcp-server shared-network-name LAN subnet 10.10.2.0/24 bootfile-server 10.10.2.1 107 | ``` 108 | 109 | We are now going to download the efi version of the boot file if it does not exist yet: 110 | ``` 111 | sudo curl -o /config/user-data/tftproot/netboot.xyz.efi https://boot.netboot.xyz/ipxe/netboot.xyz.efi 112 | sudo chmod ugo+r /config/user-data/tftproot/netboot.xyz.efi 113 | ``` 114 | 115 | Next we are going to create a scripts folder for the scripts, in persistent storage (should persist over upgrades): 116 | 117 | ```bash 118 | mkdir --parents /config/user-data/scripts/pxe/ 119 | ``` 120 | 121 | Next we are going to go into configure mode, and include the main pxe config file: 122 | 123 | ```bash 124 | set service dhcp-server global-parameters "deny bootp;" 125 | set service dhcp-server global-parameters "include "/config/user-data/scripts/pxe/option-space.conf";" 126 | set service dhcp-server shared-network-name LAN subnet 10.10.2.0/24 subnet-parameters "include "/config/user-data/scripts/pxe/pxe.conf";" 127 | ``` 128 | 129 | IT NEEDS to be typed exactly like that, the "" part. 130 | 131 | The file /config/user-data/scripts/pxe/pxe.conf: 132 | 133 | ```bash 134 | allow booting; 135 | next-server 10.10.2.1; 136 | 137 | if option arch = 00:07 { 138 | filename "netboot.xyz.efi"; 139 | } elsif option arch = 00:00 { 140 | filename "netboot.xyz.kpxe"; 141 | } else { 142 | filename "netboot.xyz.efi"; 143 | } 144 | ``` 145 | 146 | The file /config/user-data/scripts/pxe/option-space.conf: 147 | 148 | ```bash 149 | # Declare the iPXE/gPXE/Etherboot option space 150 | option space ipxe; 151 | option ipxe-encap-opts code 175 = encapsulate ipxe; 152 | 153 | # iPXE options, can be set in DHCP response packet 154 | option ipxe.priority code 1 = signed integer 8; 155 | option ipxe.keep-san code 8 = unsigned integer 8; 156 | option ipxe.skip-san-boot code 9 = unsigned integer 8; 157 | option ipxe.syslogs code 85 = string; 158 | option ipxe.cert code 91 = string; 159 | option ipxe.privkey code 92 = string; 160 | option ipxe.crosscert code 93 = string; 161 | option ipxe.no-pxedhcp code 176 = unsigned integer 8; 162 | option ipxe.bus-id code 177 = string; 163 | option ipxe.bios-drive code 189 = unsigned integer 8; 164 | option ipxe.username code 190 = string; 165 | option ipxe.password code 191 = string; 166 | option ipxe.reverse-username code 192 = string; 167 | option ipxe.reverse-password code 193 = string; 168 | option ipxe.version code 235 = string; 169 | option iscsi-initiator-iqn code 203 = string; 170 | 171 | # iPXE feature flags, set in DHCP request packet 172 | option ipxe.pxeext code 16 = unsigned integer 8; 173 | option ipxe.iscsi code 17 = unsigned integer 8; 174 | option ipxe.aoe code 18 = unsigned integer 8; 175 | option ipxe.http code 19 = unsigned integer 8; 176 | option ipxe.https code 20 = unsigned integer 8; 177 | option ipxe.tftp code 21 = unsigned integer 8; 178 | option ipxe.ftp code 22 = unsigned integer 8; 179 | option ipxe.dns code 23 = unsigned integer 8; 180 | option ipxe.bzimage code 24 = unsigned integer 8; 181 | option ipxe.multiboot code 25 = unsigned integer 8; 182 | option ipxe.slam code 26 = unsigned integer 8; 183 | option ipxe.srp code 27 = unsigned integer 8; 184 | option ipxe.nbi code 32 = unsigned integer 8; 185 | option ipxe.pxe code 33 = unsigned integer 8; 186 | option ipxe.elf code 34 = unsigned integer 8; 187 | option ipxe.comboot code 35 = unsigned integer 8; 188 | option ipxe.efi code 36 = unsigned integer 8; 189 | option ipxe.fcoe code 37 = unsigned integer 8; 190 | option ipxe.vlan code 38 = unsigned integer 8; 191 | option ipxe.menu code 39 = unsigned integer 8; 192 | option ipxe.sdi code 40 = unsigned integer 8; 193 | option ipxe.nfs code 41 = unsigned integer 8; 194 | 195 | # Other useful general options 196 | # https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml 197 | option arch code 93 = unsigned integer 16; 198 | ``` 199 | 200 | After all of that, it should be it! I hope that helps. 201 | 202 | ### Using dnsmasq 203 | 204 | This section was written by [Benjamin Reich](https://benjaminreich.de/). 205 | 206 | This Part is requierd if you using `set service dhcp-server use-dnsmasq enable`. 207 | 208 | Connect via SSH and replace `SERVERIP` with the actual IP. 209 | 210 | ```bash 211 | configure 212 | set service dhcp-server use-dnsmasq enable 213 | set service dns forwarding options "dhcp-match=set:bios,60,PXEClient:Arch:00000" 214 | set service dns forwarding options "dhcp-boot=tag:bios,netboot.xyz.kpxe,,SERVERIP" 215 | set service dns forwarding options "dhcp-match=set:efi32,60,PXEClient:Arch:00002" 216 | set service dns forwarding options "dhcp-boot=tag:efi32,netboot.xyz.efi,,SERVERIP" 217 | set service dns forwarding options "dhcp-match=set:efi32-1,60,PXEClient:Arch:00006" 218 | set service dns forwarding options "dhcp-boot=tag:efi32-1,netboot.xyz.efi,,SERVERIP" 219 | set service dns forwarding options "dhcp-match=set:efi64,60,PXEClient:Arch:00007" 220 | set service dns forwarding options "dhcp-boot=tag:efi64,netboot.xyz.efi,,SERVERIP" 221 | set service dns forwarding options "dhcp-match=set:efi64-1,60,PXEClient:Arch:00008" 222 | set service dns forwarding options "dhcp-boot=tag:efi64-1,netboot.xyz.efi,,SERVERIP" 223 | set service dns forwarding options "dhcp-match=set:efi64-2,60,PXEClient:Arch:00009" 224 | set service dns forwarding options "dhcp-boot=tag:efi64-2,netboot.xyz.efi,,SERVERIP" 225 | commit; save 226 | ``` 227 | -------------------------------------------------------------------------------- /static/img/nbxyz-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/nbxyz-logo-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/white_logo_transparent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | --------------------------------------------------------------------------------