{"id":13876064,"url":"https://github.com/garybgenett/gary-os","last_synced_at":"2025-07-16T10:33:03.630Z","repository":{"id":14551151,"uuid":"17266528","full_name":"garybgenett/gary-os","owner":"garybgenett","description":"GaryOS is an entire GNU/Linux system in a single bootable file","archived":false,"fork":false,"pushed_at":"2024-11-09T08:07:24.000Z","size":24536,"stargazers_count":88,"open_issues_count":0,"forks_count":6,"subscribers_count":7,"default_branch":"main","last_synced_at":"2024-11-09T09:18:43.850Z","etag":null,"topics":["boot","bootloader","funtoo","funtoo-configuration","gary","gentoo","gentoo-configuration","grub","initramfs","linux-kernel","pxe","pxe-boot","rescue","shell","usb-media"],"latest_commit_sha":null,"homepage":"http://www.garybgenett.net/projects/gary-os","language":"Shell","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/garybgenett.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-02-27T22:01:46.000Z","updated_at":"2024-11-09T08:07:28.000Z","dependencies_parsed_at":"2023-12-27T09:24:29.783Z","dependency_job_id":"bd48d704-2a6d-4428-9d1b-45ed361f1761","html_url":"https://github.com/garybgenett/gary-os","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garybgenett%2Fgary-os","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garybgenett%2Fgary-os/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garybgenett%2Fgary-os/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garybgenett%2Fgary-os/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/garybgenett","download_url":"https://codeload.github.com/garybgenett/gary-os/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226126067,"owners_count":17577472,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["boot","bootloader","funtoo","funtoo-configuration","gary","gentoo","gentoo-configuration","grub","initramfs","linux-kernel","pxe","pxe-boot","rescue","shell","usb-media"],"created_at":"2024-08-06T06:00:59.477Z","updated_at":"2025-07-16T10:33:03.594Z","avatar_url":"https://github.com/garybgenett.png","language":"Shell","funding_links":[],"categories":["Shell","shell","Uncategorized"],"sub_categories":["Uncategorized"],"readme":"# Welcome to GaryOS\n\n--------------------------------------------------------------------------------\n\n| ![GaryOS Icon](_artifacts/images/icon-v6.0.png \"GaryOS Icon\") | \"The one file that does it all.\"\n|:---      |:---\n| Latest   | [v8.0 2024-05-16] -- [Kernel], [Rootfs], [Boot], [Disk]\n| Homepage | \u003chttp://www.garybgenett.net/projects/gary-os\u003e\n| Download | \u003chttps://sourceforge.net/projects/gary-os\u003e\n| Source   | \u003chttps://github.com/garybgenett/gary-os\u003e\n\n[![GaryOS Download](https://img.shields.io/sourceforge/dw/gary-os.svg \"GaryOS Download\")](https://sourceforge.net/projects/gary-os/files/latest/download)\n\n| [Documentation] | |\n|:---        |:---\n| [Overview] | [Quick Start], [Requirements], [Support]\n| [Booting]  | [Linux], [Windows], [GRUB], [EFI], [PXE], [Virtual]\n| [Running]  | [Networking], [GUI], [Update], [Filesystem]\n| [Building] | [Compile], [Manage], [Image], [Install]\n\n| [Information] | |\n|:---        |:---\n| [Goals]    | [Design], [Builder], [Loader]\n| [Project]  | [References], [Contributing], [Licensing]\n| [Details]  | [Versioning], [Repository], [Tools], [Ecosystem]\n| [Release]  | [Process], [Checklist], [Publish]\n| [Versions] | [v8.0 2024-05-16], [v7.0 2023-01-14], [v6.0 2021-09-12], [(...)]\n\n[GaryOS]: http://www.garybgenett.net/projects/gary-os\n[Gary B. Genett]: http://www.garybgenett.net\n[gary-os@garybgenett.net]: mailto:gary-os@garybgenett.net?subject=GaryOS%20Submission\u0026body=Thank%20you%20for%20sending%20a%20message%21\n\n--------------------------------------------------------------------------------\n\n# Documentation ################################################################\n[Documentation]: #documentation\n\n--------------------------------------------------------------------------------\n\n## Overview ####################################################################\n[Overview]: #overview\n\n**[GaryOS] is an entire [GNU/Linux] system in a single bootable file.**  It is\nalso a [Builder] system to create and package [Gentoo] installations.\n\n[Builder] creates custom root filesystems that GaryOS can load into memory in\nplace of its own.  GaryOS can build new or updated versions of itself from\nwithin itself.\n\nKey features:\n\n  * Optimized source-based Gentoo system with [GNU] toolchain\n  * Fast in-memory filesystem does not require a physical device\n  * Can be booted from anywhere a [Linux Kernel] can\n  * Upgrades are as simple as replacing the file\n\nPrimary uses:\n\n  * System rescue and recovery\n  * Anonymous and secure workstation\n  * GNU/Linux learning environment\n  * Installation of Gentoo\n\nUnique advantages:\n\n  * Source-based distributions are more flexible and powerful than binary ones\n  * A single [Kernel] file is easier to manage and boot than an ISO image\n  * GaryOS is stored on media as a resident of it, not the purpose of it\n\nNo other GNU/Linux distribution takes the same approach or has the same features\nas GaryOS.\n\n\u003c!-- ![GaryOS CLI Screenshot](_artifacts/images/screenshot_cli-v7.0.png \"GaryOS CLI Screenshot\") --\u003e\n![GaryOS CLI Screenshot](_artifacts/images/screenshot_cli-v7.0.gif \"GaryOS CLI Screenshot\")\n![GaryOS GUI Screenshot](_artifacts/images/screenshot_gui-v7.0.gif \"GaryOS GUI Screenshot\")\n\n### Quick Start ################################################################\n[Quick Start]: #quick-start\n\nDownload the latest [Kernel], and select a boot method:\n\n  1. Use [Virtual] to try it out or test it (quickest and easiest)\n  2. Follow the instructions for either [Linux] or [Windows]\n  3. Configure an existing [EFI] bootloader\n  4. Host on a [PXE] server\n\nLog in as `root` with password `p@ssw0rd!`.  Any boot media can be detached.\nUse the normal `shutdown now` or simply power off when finished.\n\n### Requirements ###############################################################\n[Requirements]: #requirements\n\nA 64-bit x86 CPU is required.  [GaryOS] is not built for any other platforms.\nIntel and AMD x86 processors are by far the most common for desktop and laptop\ncomputers, which is what GaryOS was designed for.\n\nThe booted system requires at least 4GB of RAM.  Some of the advanced features\nand uses require additional memory, and 8GB is recommended.\n\nThe GaryOS [Kernel] is several hundred MB, and 1GB of storage is recommended.\nThis will be closer to 3GB if the [Rootfs] is also used.  All efforts have been\nmade to make GaryOS as compact as possible without sacrificing functionality or\npruning the filesystem.\n\nYou will also need a keyboard and monitor in order to use GaryOS, although\na serial terminal will work just fine.\n\n### Support ####################################################################\n[Support]: #support\n\n[Gary B. Genett] is the sole developer and maintainer of [GaryOS].  It is\na personal project with aspirations of recognition as an actual distribution,\nhowever misguided.\n\nAll documentation is in this file and the usage output of the [Builder] scripts.\nEverything in [Booting], [Running] and [Building] are specifically tested and\nsupported.  See [Checklist] for details on the final testing done every release.\n\nWhile there appears to be some adoption of GaryOS, it is not yet enough to\nwarrant a formal ticket system.  For any issues, or to share the creative ways\nyou are using GaryOS, please contact the author directly at\n[gary-os@garybgenett.net].\n\n--------------------------------------------------------------------------------\n\n## Booting #####################################################################\n[Booting]: #booting\n\n[GaryOS] is a [Linux Kernel] with a large embedded [Linux initramfs] (see\n[Design]).  It can be booted in the exact same way as a standard Linux kernel,\nand from anywhere that a Linux kernel can.\n\n  |           | |\n  |:---       |:---\n  | [Linux]   | Starting from any [GNU/Linux] system\n  | [Windows] | Starting from a Microsoft Windows system\n  | [GRUB]    | USB or hard drives, from either GNU/Linux or Windows\n  | [EFI]     | Existing EFI systems, which are the contemporary standard\n  | [PXE]     | Networked environment, or for rapid [Rootfs] testing with [QEMU]\n  | [Virtual] | Run virtualized on any platform, for [Building] or testing\n\nAll standard Linux kernel parameters are valid.  In addition, GaryOS has added\na number of `groot*` options, which specify the initial amount of memory\nreserved for the filesystem and other aspects of the boot process.  Full\ndetails on these parameters are in [Filesystem] and [Loader].\n\n### Linux ######################################################################\n[Linux]: #linux\n\nStarting from [GNU/Linux] is easier than with [Windows], for obvious reasons.\nThere are two options.\n\n  1. Use an existing booloader configuration\n  2. Use the [GaryOS] [GRUB] tooling\n\nIt is recommended to use the first if it is available.  The simplest version\nfor GRUB is below, with the `linux` line matching the location of the GaryOS\nkernel.\n\n  ```\n  menuentry \"GaryOS\" {\n    set debug=linux\n    linux (hd0,1)/gary-os/gary-os.kernel\n  }\n  ```\n\nThe `gary-os.grub.cfg` file in the [Boot] archive is a good example of\na complete GRUB configuration file.  It is sourced from\n[grub/grub.menu.gary-os.cfg], and provides many additional features and\nbenefits over the example above.\n\n  ```\n  menuentry \"GaryOS Menu\" {\n    configfile (hd0,1)/gary-os/gary-os.grub.cfg\n  }\n  ```\n\nBoth of the these options will also work for GRUB installations on USB drives.\nSee [GRUB] to create or update a bootable USB drive.  For EFI systems, see\n[EFI].  Any bootloader that can boot Linux will work, but GaryOS is not tested\nwith them, so no instructions or support is provided.\n\n### Windows ####################################################################\n[Windows]: #windows\n\nInstallation for Windows systems is not complicated, but does involve a few\nsteps.  Microsoft consistently changes the way their bootloader works, and what\nitems are supported.  The [v3.0] version of [GaryOS] was the last one to support\ndirect modification of the Windows 7/8 bootloader.  In Windows 10, Microsoft\nremoved support for the application type required to boot the GaryOS [GRUB]\nimage.  As such, using a USB drive is the safest and easiest method.  There are\nalternatives to the Windows bootloader that can dual-boot Windows and\n[GNU/Linux], but they are not tested and no support is provided.\n\nSteps for creating the bootable USB drive are in [GRUB].\n\n### GRUB #######################################################################\n[GRUB]: #grub\n\nThe [GaryOS] [Boot] file contains everything needed to create and update [GNU\nGRUB] on both hard drives and USB drives.  The core of the tooling is the\n[scripts/grub.sh] script.\n\nOnce a drive has been set up, place the GaryOS [Kernel] in the `gary-os`\ndirectory as `gary-os.kernel`.  The `gary-os.grub.cfg` file can also be placed\nin that directory and edited as needed.\n\n  ```\n  /gary-os/gary-os.grub.cfg\n  /gary-os/gary-os.kernel\n  ```\n\nThe drive can be booted using the BIOS or EFI boot menu on any computer that\nsupports booting from removeable media.  It provides a menu which auto-selects\nthe most advanced option available.  This menu can be updated at any time using\nthe [scripts/grub.sh] script within GaryOS, following the directions in\n\"GNU/Linux\" below.  The `gary-os.grub.cfg` file can be updated anytime with the\nlatest [grub/grub.menu.gary-os.cfg].\n\n**GNU/Linux**\n\nThe [scripts/grub.sh] script can be run directly from the command line.  Running\nit without any arguments will display the usage documentation.  It expects to be\nrun from within the GaryOS [Repository], since it requires the menu files in\n[grub/].\n\nBe advised that this script creates a brand new partition table on whatever\ndrive is targeted.  Only use this on a brand new or empty device.  The update\noption should only be used on drives that were created by the script or that\nhave a matching partition table layout.  Only the partition numbers and codes\nneed to match.\n\n  | Partition | Start Sector | End Sector | Size       | Code | Name\n  |---:       |---:          |---:        |---:        |---:  |:---\n  | 1         |      2121728 |    7271860 |    2.5 GiB | 0700 | Microsoft basic data\n  | 3         |        24576 |    2121727 | 1024.0 MiB | EF00 | EFI System\n  | 4         |         4096 |      24575 |   10.0 MiB | EF02 | BIOS boot partition\n\nThis is the output from `gdisk -l loopfile.img`.  Using `fdisk -l` will produce\nsimilar output.\n\n**Windows**\n\nThese instructions are tested on Windows 10, but should work just fine on\nanything Windows 7 or later.  They use [Rufus] to install the [GRUB] image onto\na USB drive.\n\n  1. Insert a new or empty USB drive at least 4GB in size\n  2. Download the [Boot] archive, right click and 'Extract'\n  3. Double-click `rufus*.exe`, click allow, and decline updates\n     2. For 'Device', select the USB drive\n     3. For 'Boot Selection', use the large 'Select' button and `loopfile.img`\n     4. Click 'Start'\n     5. Read the warning and click 'OK' when ready\n     6. Click 'Close' if it completed successfully\n  4. Right-click the Windows 'Start' menu, and select 'Disk Management'\n     1. The drive will have both lettered (e.g. D:) and unallocated space\n     2. Right-click the lettered drive and select 'Delete Volume'\n     3. Read the warning and click 'Yes' when ready\n     4. Right-click the expanded unallocated space and select 'Simple Volume'\n     5. Follow the prompts, using 'exFAT' as the 'File System'\n     6. Click 'Finish' when ready\n\nThere will be a new drive letter available in 'My Computer', but it will be\nempty.  Create the `gary-os` directory and add the `gary-os.kernel` as\ndescribed at the at the beginning of [GRUB].  The `gary-os.grub.cfg`\ninstructions are also supported.\n\n### EFI ########################################################################\n[EFI]: #efi\n\nBoth the [GaryOS] [Kernel] and the GRUB `x86_64.efi` file in [Boot] (see [GRUB])\nare EFI applications, and can be used directly from an EFI menu on an\nappropriate partition.\n\nBooting from either of these files with EFI is tested and supported, but the\nnecessary EFI configuration steps are not.\n\n### PXE ########################################################################\n[PXE]: #pxe\n\nIn a networked environment [GaryOS] can boot from a central server.  This is\noften used in labs or environments where centralized management of\ninfrastructure is critical.\n\nBoth the GaryOS [Kernel] and the GRUB `x86_64.efi` file in [Boot] (see [GRUB])\ncan be loaded directly from PXE.  The [Boot] image will automatically select and\nload GaryOS from the server, and will also pass any additional boot parameters\nto the [Linux Kernel] directly from the PXE server configuration.\n\nDHCPd and TFTPd are included, so GaryOS can also act as the PXE server.  An\nexample DHCPd configuration is below.  The `x86_64.efi` image must be used as\nthe `filename` in order to pass Linux kernel parameters to GaryOS via\n`extensions-path`.  Otherwise, the GaryOS kernel can be used directly as\n`filename` without any other options.\n\n  ```\n  next-server             0.0.0.0;\n  filename                \"/gary-os/gary-os.grub/x86_64.efi\";\n  option root-path        \"/gary-os/gary-os.kernel\";\n  option extensions-path  \"\u003ckernel parameters\u003e\";\n  ```\n\nUsing [Image] to create modified [Filesystem] images could form the basis of\na completely automated and centrally managed lab or server farm.\n\n### Virtual ####################################################################\n[Virtual]: #virtual\n\nUsing virtualization is is the quickest and easiest way to try out or test\n[GaryOS].  On a [GNU/Linux] system, [QEMU] is high-performance and\nlow-complexity, and is what the author uses for all development and testing of\nGaryOS (see [Checklist]).  However, it is not well suited for other platforms,\nsuch as Windows, and [VirtualBox] is the best choice there.  VirtualBox also\nruns on GNU/Linux, if desired, but it is not included in GaryOS.\n\nThe instructions below use 4096MB (4GB) for memory, to emulate a minimal system\nwhich meets the [Requirements].  On systems with only 4GB of memory,\nvirtualization will not work, and using [GRUB] to create a USB drive is the best\npath.\n\n**QEMU**\n\nUse the package manager to install QEMU.  It is available on all major\ndistributions, including GaryOS.  Once installed, it is simple to get it\nrunning.\n\n  ```\n  modprobe kvm_intel\n  qemu-system-x86_64 -m 4096 -kernel gary-os.kernel\n  ```\n\nThe [Disk] file is a pre-made QEMU image that is already installed with [GRUB]\nand the [Kernel].\n\n  ```\n  qemu-system-x86_64 -m 4096 gary-os-*.qcow2\n  ```\n\nSee [Checklist] for additional information on how QEMU is used in the\ndevelopment of GaryOS.\n\n**VirtualBox**\n\nOnce [VirtualBox] is installed, create a new virtual machine.\n\n  |                   | |\n  |:---               |:---\n  | Type              | Linux\n  | Version           | Other Linux (64-bit)\n  | Memory            | 4096 (or greater)\n  | Virtual disk file | gary-os-*.qcow2 (the [Disk] file)\n  | Enable EFI        | on\n\nThis new virtual machine will run GaryOS [GRUB] and boot the [Kernel].\n\n  [VirtualBox]: https://www.virtualbox.org\n\n--------------------------------------------------------------------------------\n\n## Running #####################################################################\n[Running]: #running\n\nThere are many things that can be done with [GaryOS] once it is booted, some of\nwhich are outlined in [Overview].  It is essentially a packaged [Gentoo]\ninstallation.  There are a few common tasks that are documented to make them\neasier, and some additional capabilities specific to GaryOS.\n\n  * Set up [Networking]\n  * Run the [GUI] graphical interface\n  * [Update] or install new packages\n  * Loading a different [Filesystem] into memory\n\nBy default, GaryOS starts the fewest processes possible and does not mount any\nhard drives or partitions.  This is for security, rescue and forensics.\n\nSee [Support] if you wish to share any creative uses for GaryOS that you come up\nwith.\n\n### Networking #################################################################\n[Networking]: #networking\n\nFor security, no networking configuration or daemons are run by default, but\nseveral networking packages are installed.  Instructions for Ethernet, Wireless\nand [OpenSSH] `sshd` are below.\n\nThe [Gentoo Networking] page contains full details on all the configuration\npossibilities.  For the purposes of [GaryOS], a simple single-interface\nconfiguration is likely all that is needed.\n\n**Ethernet**\n\nThe [dhcpcd] utility is the quickest and easiest to use.\n\n  ```\n  rc-update add dhcpcd default\n  openrc\n  ```\n\nThis should automatically detect the best interface to use and configure it with\nDHCP.  It can also be run explicitly on a specific interface using something\nlike `dhcpcd eth0`.\n\nIn case this does not work as expected or there is no DHCP available, the `ip`\ncommand from [iproute2] can be used to configure manually.  Starting with `ip\naddress` will show all the available interfaces and their status.  Use `ip help`\nfor more information on how to use this command.\n\n**Wireless**\n\nThe configuration for wireless is slightly more involved, especially since it is\ndone on the command line.  The [wpa_supplicant] package is very comprehensive\nand accomplishes the goal in the fewest steps.\n\n  ```\n  nano /etc/wpa_supplicant/wpa_supplicant.conf\n  rc-update add wpa_supplicant default\n  rc-update add dhcpcd default\n  openrc\n  ```\n\nIf it is required to manually discover an available network, use the `wpa_cli`\ncommand.  If preferred, the `wpa_gui` graphical utility is available on\n[Rootfs].\n\n  ```\n  scan\n  scan_results\n  add_network\n  list_networks\n  set_network 0 scan_ssid 1\n  set_network 0 ssid \"\u003cssid\u003e\"\n  set_network 0 psk \"\u003cpassword\u003e\"\n  enable_network 0\n  select_network 0\n  status\n  save_config\n  ```\n\nThe `wpa_cli` command supports tab-completion, so it is only necessary to type\nthe first few letters of each command.  Use `iwconfig` to verify success.\n\n  ```\n  rc-service wpa_supplicant restart\n  ```\n\nIn cases where the changes do not immediately take effect, the above will\nrestart the daemon and reinitialize the interface.\n\n**OpenSSH**\n\nIf remote access to GaryOS is needed, OpenSSH `sshd` is the absolute best\noption.\n\n  ```\n  passwd root\n  rc-update add sshd default\n  openrc\n  ```\n\nIt is very important to note that `root` access is enabled, which is why the\npassword should be changed before enabling SSH.\n\n  [Gentoo Networking]: https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Networking\n  [dhcpcd]: https://roy.marples.name/projects/dhcpcd\n  [iproute2]: https://wiki.linuxfoundation.org/networking/iproute2\n  [wpa_supplicant]: https://w1.fi/wpa_supplicant\n\n### GUI ########################################################################\n[GUI]: #gui\n\n[GaryOS] boots to the command line by default.  To run the [X.Org] graphical\ninterface, use `startx`.\n\n  | Utility           | [Kernel]       | [Rootfs]\n  |:---               |:---            |:---\n  | Window manager    | [dwm]          | Includes [Openbox]\n  | Terminal emulator | [rxvt-unicode] | Also the default\n  | Web browser       | [Links]        | Includes [Firefox]\n\nThe dwm title bar has brief reminders for the shortcuts below.  Use\n`XSESSION=openbox startx` for Openbox instead of dwm.  In Links, use the top bar\nfor the menu and `g` to open the URL bar.\n\n  |                       | |\n  |:---                   |:---\n  | GaryOS Readme         | Alt-Left\n  | The dwm man page      | Alt-Right\n  | Command entry         | Alt-p\n  | Terminal emulator     | Alt-Shift-Enter\n  | Web browser           | Alt-Ctrl-Enter\n  | Web browser (Firefox) | Alt-Shift-Ctrl-Enter\n\nX.Org tries to auto-detect the best resolution for the display.  If it does not,\nuse the `xrandr` utility to change it.  If preferred, the `arandr` graphical\nutility is available on [Rootfs].\n\n  ```\n  xrandr --query\n  xrandr --output Virtual-1 --mode 1920x1200\n  ```\n\nThese are not the prettiest or most feature-rich applications.  They were\nselected for their lightweight nature and minimal dependencies, along with the\nhigh geek factor (see [Goals]).\n\n  [Openbox]: http://openbox.org\n  [Firefox]: https://www.mozilla.org/firefox\n\n### Update #####################################################################\n[Update]: #update\n\n[GaryOS] is essentially a packaged [Gentoo] system, and can be updated or\nmodified just like a normal installation.\n\n  1. Set up [Networking]\n  2. Increase the size of the filesystem\n  3. Use `make unpack` to install necessary directories\n  4. Run whatever [Portage] `emerge` or other commands that are desired\n\nIt is important that `make unpack` is run before making updates to the system,\nsince it may remove or replace added files if done afterward.\n\n**Increase Filesystem Size**\n\nThe default size of the filesystem includes a minimal amount of additional\nspace, but not enough to unpack the directories and make other updates.\n\n  ```\n  mount -o remount,size=6144m /.overlay\n  df -h /.overlay\n  ```\n\nReplace `6144` with the amount of MB to allocate.  This may also be specified\nas `6g` for GB.  GaryOS is tested with 6GB, to ensure this works with systems\nthat have 8GB of memory.\n\n**Upack Directories**\n\nGaryOS has a basic, self-documented, packages-like system for fetching and\nunpacking additional directories (see [Design]).\n\n  ```\n  cd /.gary-os\n  nano /.unpack\n  make unpack\n  ```\n\nNano is a basic, user-friendly text editor.  The author uses [Vim], so that\noption is also available.  The syntax to use is documented in the file.  For\nthis, just remove the first character from all the `gcc` and `emerge` lines\n(except for `gentoo-repo.git`).\n\n**Emerge**\n\nAt this point, GaryOS is like any other Gentoo installation.  The `emerge`\ncommand can be used to install and update packages as usual.\n\n  ```\n  emerge app-misc/hello\n  ```\n\nBe mindful of how much is being installed compared to available memory.  Each\npackage will collect source distribution files, require filesystem space for\nbuilding, install new files, and generate a binary package file.  It can add up\nfast.\n\nGaryOS maintains a packages repository on [SourceForge] for the latest version.\nAll packages in [gentoo/sets/packages] are included, and match the settings in\n[Rootfs] ([Kernel] may need to re-compile some of them).  Installing these\npackages should be quick and inexpensive.\n\nIf a large number of non-GaryOS packages are required, building an [Image] of an\nupdated [Filesystem] or doing an [Install] are good alternatives.\n\n### Filesystem #################################################################\n[Filesystem]: #filesystem\n\n[GaryOS] uses a three-stage process for unpacking the root filesystem into\nmemory.  This is covered in detail in [Design].  During this process,\na filesystem image is selected, loaded into memory, and booted.  The default is\nto use the one packed into the [Kernel].  GaryOS has the capability to load\na different filesystem.\n\n  * Located on a [GRUB] USB drive or other storage\n  * From a [Linux] or [EFI] configuration (if the EFI partition is large enough)\n  * Using [PXE]\n\nFundamentally, all that is needed is the ability to pass [Linux Kernel]\nparameters and host the filesystem image.  GaryOS has a pre-made [Rootfs] that\ncomes with many additional packages installed.  See [Image] to create new ones.\n\nThere are a few kernel parameters specific to GaryOS that are needed to load an\nexternal filesystem.\n\n  |            | |\n  |:---        |:---\n  | groot      | Disk or partition that the [Rootfs] resides on\n  | groot_size | Initial amount of memory reserved for the filesystem\n  | groot_file | Path to the [Rootfs] (default: /gary-os/gary-os.rootfs)\n  | groot_hint | Provide a hint to [Loader] (used by [Boot]), in case of error\n\n[Loader] goes into each of these in much more detail.  GaryOS provides example\ndefaults in the [Boot] configuration file, sourced from\n[grub/grub.menu.gary-os.cfg].  Generally, only `groot` and `groot_size` are\nrequired to load an external [Image].\n\nThe `groot_size` value for the pre-made GaryOS [Rootfs] should be at least\n`4096m`, or `4g` if that format is preferred.  The [Boot] file is already\ncorrectly configured (see [GRUB]).\n\n--------------------------------------------------------------------------------\n\n## Building ####################################################################\n[Building]: #building\n\nIn addition to being a [GNU/Linux] system, [GaryOS] is the [Builder] system used\nto produce itself.  It has three main purposes.\n\n  * [Compile] and [Manage] [Gentoo] installations\n  * Make an [Image] of a root [Filesystem]\n  * [Install] GaryOS to disk directly from memory\n\nThese sections are in logical order, following the full lifecycle of creating\na build, managing it or creating an image of it, and ultimately installing it.\nThey are mainly for reference from other sections, and not necessarily\na prescribed list of steps to take.\n\n### Compile ####################################################################\n[Compile]: #compile\n\nThe process to build and install a source-based distribution like [Gentoo] from\nscratch is long and complex.  The [GaryOS] [Builder] is designed to condense it\ninto a small number of atomic steps using [GNU Make].\n\n  | Target  | Action\n  |:---     |:---\n  | init    | Initial build from a [stage3] tarball\n  | doit    | Update a build with any package or configuration changes\n  | krnl    | Recompile [Linux Kernel] list, and 'doit' once complete\n  | redo    | Complete start-to-finish rebuild of entire system\n  | edit    | Wrapper around [gentoo.config] customization script\n\nTo prepare for a build, create a `sources` directory in the repository and\ndownload a `stage3` tarball into it.  Each version of GaryOS has a link in\n[Versions] to the `stage3` it was built with.  The default GaryOS settings in\n[gentoo/make.conf] call for a `generic_64` tarball.\n\nThe `build` directory will be created and used as a 'chroot'.  If this will be\na direct installation to disk, create the `build` directory manually and mount\nthe target partition on it.  Do not mount any subdirectories until after the\n'init' phase.  Upon completion of the build, the [GRUB Quick Start] is all that\nis needed to make it ready to boot into.\n\nNone of the steps in this process are specific to GaryOS, other than the\nstarting [Portage] configuration and the selected list of packages.  This\nprocess is generally applicable to all Gentoo systems.\n\n**Init**\n\nThe target directory `build` will be created.  It will grow to many tens of GB,\nso having 100GB available is recommended.\n\nFor the best performance, change the `MAKEOPTS -j` variable in\n[gentoo/make.conf] to the number of CPU threads your system has.\n\n  ```\n  grep \"^processor\" /proc/cpuinfo | wc -l\n  ```\n\nThe last line in [gentoo/_funtoo] must be the release version and commit hash\nin [Portage] that it is desired to use for the packages repository.\n\nMake any desired Portage package selection and configuration changes, and then\nstart the build with `make init`.  By default, the base GaryOS [Kernel] package\nlist and configuration is used.  The full [Rootfs] build can be done with `make\nP=_gary-os init`.  If so, be sure to add `P=_gary-os` in all the rest of the\nsteps as well.\n\nThe initial build is where errors are most likely to occur.\n\n  * Dependency conflicts\n  * Conflicting `$USE` variable values\n  * Package incompatibilities causing build breaks\n  * Broken or out of date packages\n\nThese are all beyond the control of GaryOS.  See [Builder] and [Process] for\nstrategies to deal with these quickly and continue building.\n\nThis phase must at least reach the stage where it is building the selected\npackage list after updating the base system (the `@system` set) and downloading\nall the source files.  The 'doit' target can be used after that to resume.  In\nthat case, the 'redo' phase must definitely be performed, to make sure the\nskipped 'init' steps are run.\n\n**Doit**\n\nThe main purpose of this target is to do a system update after any package or\nconfiguration changes.  It also handles a number of backend items key to\nkeeping things clean and orderly.\n\nOnce the 'init' phase reaches the point of building the package list, this phase\ncan be used to resume after failed builds.  It can be handy to do `make\nDOFAST=true doit` to skip some of the ancillary time-consuming steps until\na successful build is achieved, and then do a final `make doit` to ensure they\nare run.  This is a real time saver.\n\nThe `DOREDO=true` variable is also available, and forces an update and\nre-archive of the Portage tree.\n\nSuccessful completion of this phase is the #1 measure of a healthy build.  It\ncan't be run too often.\n\n**Krnl**\n\nSomewhere between a 'doit' and a 'redo', this rebuilds the [Linux Kernel] list\nand completes the 'doit' process, without performing a full system rebuild as is\ndone with 'init' or 'redo'.  Primarily used during development to build and test\nnew kernels and configurations.\n\nThe `DOREDO=true` variable is also available, and removes all previous kernels,\nalong with their modules and configurations.\n\n**Redo**\n\nThis is almost identical to 'init'.  Once the build successfully completes\n'doit', it is good practice to recompile everything from start to finish.  This\nresolves any mutual dependencies, filters out binary bootstrap packages, and\nguarantees that the entire system can build flawlessly with the current package\nlist and configuration.\n\nUltimately, this is maybe not a necessary step under normal circumstances.\nHowever, when performing a new build there are usually multiple passes with\n'init' and 'doit', with lots of changes to the configuration and additions to\n[gentoo/overlay/].  The final rebuild pass is to catch any bugs with the build\nthat might have slipped in.\n\n**Edit**\n\nThis target is only required if the [gentoo.config] script has been modified\n(see [Builder]).  It performs any automated customization steps that are\ndesired.\n\n  [stage3]: https://wiki.gentoo.org/wiki/Stage_tarball\n  [GRUB Quick Start]: https://wiki.gentoo.org/wiki/GRUB2_Quick_Start\n\n### Manage #####################################################################\n[Manage]: #manage\n\nThe [GaryOS] [Builder] is designed to support the \"rolling release\" model of\nsource-based distributions, where the system is more or less constantly being\nupdated and built.  Its original and ongoing purpose is to do exactly that.  It\nsupports all [Gentoo] systems, regardless of how they were installed.\n\n  * [Install] from GaryOS\n  * Direct [Compile] into a partition\n  * Using the [Gentoo Installation Guide]\n\nThere are a lot of steps and miscellaneous tasks that are best practice to keep\na Gentoo system in good working order.  Over time, it is also inevitable that\nthe [Portage] configuration will acquire cruft or not be using new options that\nare available.  GaryOS [Builder] condenses all this into a simple two-step\nprocess.\n\n  | Target  | Action\n  |:---     |:---\n  | update  | Update the [Portage] packages repository and `emerge` databases\n  | upgrade | Upgrade the system to the current packages and configuration\n\nThe `update` target is completely automated, but `upgrade` requires interaction\nat various steps to accept updates or confirm configuration file changes.\n\nAt the end of `upgrade`, the `/_gentoo` directory is updated with information\nto aid in the maintenance of a healthy system.  See [Builder] for details.\n\n### Image ######################################################################\n[Image]: #image\n\nThis is the process of creating new [Filesystem] images.  It requires\na directory installed with [GaryOS] (or [Gentoo]).  There are multiple sources\nwhere this can come from.\n\n  * Within GaryOS itself ([Update])\n  * GaryOS [Install]\n  * [Compile] directory\n  * Gentoo system built with the [Gentoo Installation Guide]\n\nThere are two key requirements of the final image for it to work correctly.\n\n  1. That `/init` is an executable location for the startup process\n  2. Has the same [Linux Kernel] version (the `/usr/lib/modules` directory)\n\n[Image] tries to handle the first automatically.  Verify this, and be mindful of\nthe second if the source directory is updated (such as [Update] or [Compile]).\nIf needed, there is a `packdir` archive of the `/usr/lib/modules` directory in\n[Downloads].\n\nIt may be important to review the package file that will be used.  There are\nGaryOS variables in them which control portions of this process, such as which\ndirectories to package, archive or exclude and what `rc-update` or other\ncommands should be run to tailor the image filesystem (see [Loader]).  The\ndefaults in [gentoo/sets/gary-os] should be reasonable.  A more complete\nconfiguration is in [gentoo/sets/_gary-os].\n\n  ```\n  make rootfs\n  make P=_gary-os rootfs\n  ls -adl build/.gary-os-*/*.rootfs*\n  ```\n\nIt is also possible to directly build a customized [Kernel], so that the\ntwo-stage [Filesystem] process is not needed.\n\n  ```\n  make release\n  ls -adl build/.gary-os-*/*.kernel*\n  ```\n\nThis method is a little more involved, since it creates an image and then\ncompiles it into the Linux kernel.  There may also be unexpected issues when\ntrying to boot a kernel with a very large [Linux initramfs] (anything bigger\nthan the GaryOS [Kernel] is untested).\n\nBoth will skip portions of the build if there are already output files present,\nincluding the final image or kernel.  This is sometimes desired when iterating,\nto avoid doing the same time-consuming steps repeatedly.  However, it can be\nproblematic when the intention is to implement changes.\n\n  ```\n  make clean\n  make DOREDO=true rootfs\n  make DOREDO=true release\n  ```\n\nThe `clean` target will completely remove all [Builder] output files, restoring\nthe `build` directory to its original state.  This includes all images and\nkernels, along will all their supporting files.  The `DOREDO` variable is\nspecific to each target, and only rebuilds the relevant files.\n\n### Install ####################################################################\n[Install]: #install\n\nOne of the [Goals] of [GaryOS] is to simplify the process of installing\n[Gentoo].  This can be done using [Compile] or from directly within GaryOS.\n\n  | Image    | Packages              | Configuration\n  |:---      |:---                   |:---\n  | [Kernel] | [packages.txt]        | Optimized for size and fewer dependencies\n  | [Rootfs] | [packages.rootfs.txt] | Complete configuration and package list\n\nThe final result will be identical to a [Compile] for both images.  There are\nonly a few steps to doing the install.\n\n  1. Unpack all the [Loader] directories\n  2. Reset all configuration files to default *(optional)*\n  3. [Update] packages and configurations *(optional)*\n  4. Run the install\n\nAll of this except the [Update] will be done by [Builder].\n\nAt least 8GB of memory will be required, due to the size of the fully unpacked\nfilesystem.  The base size of the in-memory filesystem will need to be at least\n6G, which can be set with `groot_size=6144m` before booting (see [Filesystem])\nor `mount -o remount,size=6144m /.overlay` after booting (see [Update]).\n\n  ```\n  mount -o remount,size=6144m /.overlay\n  ```\n\nIt is strongly advised to at least skim through the [Gentoo Installation Guide]\nor the [Gentoo Installation Guide].  GaryOS aims to simplify the process, and is\nnot meant to supplant all understanding of it.\n\n**Unpack**\n\nThis ensures all directories are uncompressed onto the filesystem.  Without it,\nthe install will be incomplete.\n\n  ```\n  cd /.gary-os\n  make DOREDO=true unpack\n  ```\n\nBoth [Kernel] and [Rootfs] require [Networking] for this, although [Rootfs]\nalready has all of the absolutely necessary directories locally.  For\na network-less install, use [Rootfs] and follow the unpacking instructions in\n[Update].  Namely, edit the `/.unpack` file to skip the external\n`gentoo-repo.git` directory.\n\n**Configuration Files** *(Optional)*\n\nBy default, the small amount of branding and configuration that GaryOS does will\nbe copied over to the installation.\n\n  ```\n  cd /.gary-os\n  make DOREDO=true install\n  ```\n\nThe above will reset the running GaryOS to a completely default system.  The\nfull list of modified files is in \"Modifications\" below.\n\n  ```\n  cd /.gary-os\n  make reset\n  ```\n\nSomewhat similar to the above, a `reset` will \"upgrade\" the Portage\nconfiguration to [gentoo/sets/packages].\n\n**Update** *(Optional)*\n\nPerform any [Update] steps that are desired to have in the final install.  If\nthere are a large number of changes, it is best to wait and perform them on the\nfinal system after it is installed.\n\nAny changes to package configuration files can also be done at this stage.  They\nshould be done on the live [Filesystem] and not the [Repository].\n\n**Install**\n\nThe system is ready for install.  All that is needed is to mount the target\npartition (replace `/dev/sda1` with the desired location).  This partition must\nbe empty.  Anything on it will be erased.\n\n  ```\n  mkdir /.install\n  mount /dev/sda1 /.install\n  make install\n  ```\n\nOnce complete, the final step is to install the GRUB bootloader.  Some helpful\npointers are provided at the end of the `install` process.  This is a simple\nstep, but has a few important considerations, so it is not automated.  The [GRUB\nQuick Start] can also be a helpful starting point.\n\nThe `install` target can be run any number of times without issue.  Make sure to\ninstall GRUB as the absolute last step.\n\nAll that is left are a few key items to make the system ready for use.\n\n  * Update `/etc/fstab` with location of the root filesystem\n  * Set hostname in `/etc/conf.d/hostname`\n  * Change the password: `passwd root`\n\nEnjoy your new system!\n\n**Modifications**\n\nAs part of the [Image] process, several files are added, modified, or replaced\nto ensure a good experience, fix issues, and generally create a particular look\nand feel for GaryOS.\n\n  | File                      | Change   | Purpose\n  |:---                       |:---      |:---\n  | /etc/issue                | Replaced | [_artifacts/files/issue]\n  | /etc/motd                 | Added    | [_artifacts/files/issue]\n  | /init                     | Added    | Symbolic link to `/usr/bin/init`\n  | /etc/inittab              | Modified | Added serial console\n  | /etc/fstab                | Modified | Commented all lines\n  | /etc/locale.gen           | Replaced | [_artifacts/files/locale.gen]\n  | /etc/conf.d/hostname      | Modified | Set to `gary-os`\n  | /etc/profile.d/setterm.sh | Added    | Disabled terminal bell\n  | /etc/wpa_supplicant/wpa_supplicant.conf | Replaced | [_artifacts/files/wpa_supplicant.conf]\n  | /etc/ssh/sshd_config      | Modified | Enabled `root` login\n  | /etc/env.d/90xsession     | Added    | Set default window manager\n  | /etc/X11/Sessions/dwm     | Modified | Tune [dwm] running environment\n\nIn cases where the files are modified or replaced, the original is kept as\na `*.gary-os` file.\n\nIn addition to the above, the [OpenRC] configuration is modified (see\n[Loader]).  This is primarily to disable all network daemons.  The [gpm] daemon\nis enabled for mouse support on the console.\n\nAs for the overall system, all configuration files for the [Linux Kernel] and\n[Portage] are in the repository.\n\n  |                    | |\n  |:---                |:---\n  | [Linux Kernel]     | [linux/]\n  | [Portage]          | [gentoo/]\n  | [Portage Overlays] | [gentoo/overlay/]\n\nFinally, the `root` password is set to `p@ssw0rd!`.\n\n  [Gentoo Installation Guide]: https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Installation\n  [OpenRC]: https://wiki.gentoo.org/wiki/OpenRC\n  [gpm]: https://www.nico.schottelius.org/software/gpm\n\n--------------------------------------------------------------------------------\n\n# Information ##################################################################\n[Information]: #information\n\n--------------------------------------------------------------------------------\n\n## Goals #######################################################################\n[Goals]: #goals\n\nHere are the guiding principles that keep [GaryOS] going in a consistent\ndirection with a consistent purpose.\n\nTop requirements:\n\n  * Source-based, all-purpose, multi-OS rescue environment ([Gentoo])\n  * Complete system, installing packages normally with no filesystem pruning\n  * Stay as default as possible, aside from [Portage] tuning of package builds\n  * Generic 64-bit build, supporting all modern x86 platforms\n  * Bootable from a single kernel file, using [Linux initramfs]\n  * Simplify the process of installing Gentoo\n  * Proudly demonstrate and evangelize old-school hacker geekiness\n\nOther objectives:\n\n  * Support as many boot methods as possible (see [Booting])\n  * Minimalist, performant Portage configuration, using only what is needed\n  * Avoid closed source licenses and binary packages as much as possible\n  * Example configuration and scripts for tuning and maintaining a Gentoo system\n  * Foster a DIY (Do It Yourself) approach through good documentation\n  * Learning environment for those new to [GNU/Linux] or Gentoo\n\nExplicit non-goals:\n\n  * Growing bigger than a single kernel file ([Rootfs] [Filesystem] aside)\n  * Development of a helper scripts or commands library for non-GaryOS tasks\n  * Customization or deep branding of overall system\n  * Alteration of boot or 'init' infrastructure\n  * Becoming a complete desktop environment\n\nGaryOS will continue to be a [Builder] and [Kernel] above all else.\n\n### Design #####################################################################\n[Design]: #design\n\n[GaryOS] uses [Linux initramfs] as a root filesystem, which was only designed\nfor minimal environments to load kernel modules, do hardware detection, and\nperform other tasks before mounting an actual root filesystem.  This approach\npresented a few challenges in the early versions of GaryOS.\n\n  * The GaryOS filesystem is a few GB, which was large and slow to boot\n  * [GNU/Linux] packages continue to grow in size and number of dependencies\n  * Repeatedly installing the same packages for a full workstation was tedious\n  * Many sizeable directories were only needed occasionally or not at all\n  * The [Linux Kernel] compression was minimal, with only minor speed gain\n\nThe solutions for each of these are somewhat mutually exclusive.\n\n  * [Squashfs] is a compressed filesystem designed for live GNU/Linux systems\n  * [Busybox] and [Coreutils] are enough to find and mount a filesystem image\n  * [XZ compression] of directories, and unpacking at boot or on demand\n\nIn GaryOS [v4.0], a comprehensive three-stage [Loader] infrastructure was\ndeveloped, along with a robust, generally usable [Builder] system.\n\n  1. Linux kernel loads and uncompresses the base initramfs into memory\n  2. A minimal environment locates, mounts and boots a [Rootfs]\n  3. XZ compressed directories are unpacked or left archived\n\nThis approach provides a number of advantages:\n\n  * Sizeable pre-built root filesystems can be created and used on demand\n  * Large directories are maximally compressed, and can be hosted externally\n  * Basic package management for selectively used directories\n  * Boot time is minimized, with better progress output\n\nIn the default [Kernel], this all happens seamlessly.  When loading\na [Filesystem], additional kernel parameters are required (see [Loader]).\n\n  [XZ compression]: https://tukaani.org/xz\n\n### Builder ####################################################################\n[Builder]: #builder\n\nInstalling source-based [GNU/Linux] systems like [Gentoo] involves a large\nnumber of steps and is very error-prone.  Keeping them up to date can be equally\ncomplex.  [GaryOS] addresses this by applying a monolithic release model.  The\n[Builder] system was developed over many years to accomplish the goal of\na reliable process that produces repeatable builds.\n\n[Builder] is more of an abstract concept than it is an actual thing, but it is\nmost helpful to think of it this way.  [Builder] is the very core of GaryOS.\n\nType `make usage` (basic) or `make help` (advanced) to get started.\n\n**Responsibilities**\n\n  * User interface for the build system\n    * [GNU Make] (usage | help)\n    * [gentoo/_system] -v\n  * [Building]\n    * [Compile]\n    * [Manage]\n    * [Install]\n\n  | Component          | Purpose\n  |:---                |:---\n  | [Makefile]         | Wrapper around the other components\n  | [gentoo/_system]   | Worker for all of [Building] (core of [Builder])\n  | [gentoo/_funtoo]   | [Gentoo] [Portage] commit tracking\n  | [gentoo/.emergent] | Audit script which creates `/_gentoo` directory\n  | [gentoo.config]    | Optional customization for 'edit' in [Compile]\n\n**Build Tuning**\n\nThe `SELECT` variable defined in the package set file determines which `eselect`\nvalues are configured during the build.  There are other variables which do\nsimilar tuning, and are self-explanatory.  The full list is at the top of\n[gentoo/sets/gary-os].\n\n**Build Output**\n\nThe `/_build` directory is created by [Compile], which archives the [Linux\nKernel] and [Portage] configurations, along with the [stage3] tarball and\n[Portage] tree used.  The purpose of this directory is to centralize everything\nneeded to reproduce the build.\n\nAfter [Compile] or [Manage], the `/_gentoo` directory will be created by\n[gentoo/.emergent].  It performs a number of checks of the Portage configuration\nand the installed system.  The results are in the `/_gentoo/+checks` text file.\nThis file is very helpful in keeping a Portage configuration in line with\nupstream, particularly the addition or removal of `$USE` flags.\n\nThe `/_gentoo.log` file is created every [Compile].  It contains the complete\noutput of the build, for troubleshooting.  Please include this file when\nreporting any issues (see [Support]).\n\n**Tooling**\n\nAnother primary function of [Makefile] and [gentoo/_system] is to provide\nhelpful tooling for the sometimes arduous process of bringing [Compile] 'init'\nor 'redo' through to a successful build.  [Process] walks through the author's\nworkflow, and has examples of these helpers.\n\nUse [gentoo.config] to automate any final build steps with [Compile] 'edit'.  By\ndefault, it is run inside the 'chroot', so all paths should start from `/`.\nExamples are creating users or making initial configuration changes.  The author\nuses a custom version to make sure important personal steps are not forgotten.\n\n**Colorization**\n\nOne final feature of [Builder] is that [Compile] is wrapped with a \"colorizer\"\n(based on [GoboLinux]), which makes all the output very pretty.\n\nThe entire process of compiling a new system is quite a beautiful thing to\nadmire.  Sit and watch it sometime, and contemplate how many human hands and\nminds are at work in front of your very eyes.\n\n**References**\n\nReferences to this section:\n\n  * [Compile]\n    * Init -- Strategies for build breaks\n    * Edit -- [gentoo.config]\n  * [Manage]\n    * Upgrade -- `/_gentoo`\n  * [Repository]\n    * Heart and soul -- [gentoo/_system]\n    * Audit script and information -- [gentoo/.emergent]\n\nThese are to make sure everything is cross-linked, and that this section is\ncomplete.\n\n### Loader #####################################################################\n[Loader]: #loader\n\nThe sole purpose of [Loader] is to create and load a [Filesystem] into memory\nwhen [Booting].  This process and the rationale behind it are detailed in\n[Design].  [Loader] also creates [Kernel] and [Rootfs] for distribution using\n[Image].\n\n[Loader] is more of an abstract concept than it is an actual thing, but it is\nmost helpful to think of it this way.\n\n**Responsibilities**\n\n  * [Running]\n    * [Filesystem]\n  * [Building]\n    * [Image]\n\n  | Component           | Purpose\n  |:---                 |:---\n  | [Makefile]          | Wrapper around the other components\n  | [gentoo/_system]    | All environment and variable initialization\n  | [gentoo/_release]   | Worker for [Filesystem] [Image] (core of [Loader])\n  | [_artifacts/files/] | [Filesystem] [Image] scripts and configuration\n\n**Package Directories**\n\nDuring [Image] creation (also [Kernel] and [Rootfs]), large directories are\npackaged with [XZ Compression] to maximize space savings (see [Design]).\nCommands such as `rc-update` are run during [Image] creation or at boot time\nafter directories are unpacked.  There are variables sourced from the package\nset file which define these.\n\n  |        | |\n  |:---    |:---\n  | RCUPDT | Commands such as `rc-update` to be run before [Image] creation\n  | FSUPDT | Identical to `RCUPDT`, but are run after directories are unpacked\n  | FSPACK | Included in [Image], and unpacked during boot\n  | FSKEEP | Included in [Image], but are left packed\n  | FSARCH | Excluded from [Image], but are packed for later use\n  | FSEXCL | Excluded from [Image], and are not packed at all\n\nNote that these can be nested one level deep.  Meaning, a directory can be\n`FSARCH` from a `FSPACK` or `FSEXCL` from a `FSKEEP` and so on.  Anything nested\ndeeper will produce undefined results.  They are evaluated in reverse order, so\nlower on the list will take precedence.  For example, if the same directory is\nset in `FSEXCL` and `FSPACK`, the directory will be `FSEXCL`.  Take this into\nconsideration when nesting, since doing things like `FSPACK` on a `FSKEEP`\nsubdirectory will also produce undefined results.\n\nComplete examples of usage are in [gentoo/sets/gary-os] and\n[gentoo/sets/_gary-os].\n\n**Overlay Environment**\n\nThe [Booting] process goes through three stages (see [Design]).  In the first,\n[Kernel] loads into memory along with a [Linux initramfs].  This is a minimal\nenvironment designed to locate, mount and boot a [Filesystem] such as [Rootfs].\nThere are [Linux Kernel] parameters which inform this environment.\n\nFirst, `groot_size` specifies how much memory to reserve for the filesystem.\nThis must be large enough to contain both [Kernel] and [Filesystem], plus\na little extra for space needed after booting.  Then, the `groot` partition is\nmounted and `groot_file` is loaded into memory.  Optionally, `groot_hint` can be\nused to provide helpful information in case loading the [Filesystem] fails.\n\nDuring this stage, Linux kernel modules are loaded from the [Kernel] internal\n[Filesystem] if they are needed.\n\nIn case of failure, a minimal shell environment will be loaded.  It is\nmenu-driven and self-documented.  Its purpose is to facilitate real-time user\nselection of a [Filesystem] to load.\n\nOnce a [Filesystem] is loaded, directories are unpacked as specified in 'Package\nDirectories' above, and `/init` on the target filesystem is booted.  The\nmajority of Linux kernel modules will be loaded after this point, so it is\nimportant that the [Filesystem] has a `/usr/lib/modules` directory which matches\nthe [GaryOS] [Kernel] version.  There is a `packdir` archive of this directory\nin [Downloads].\n\nThe final in-memory filesystem is mounted on the backend at `/.overlay`, so it\ncan be resized after boot using something like `mount -o remount,size=6144m\n/.overlay` (see [Update]).\n\nIf desired, the intermediary environment used to locate and boot the\n[Filesystem] can intentionally be loaded by using `groot=null`.  This process is\na great learning experience for anyone interested in the [GNU/Linux] boot\nprocess or how live systems work.  In particular, there is a reference\nimplementation of a completely in-memory [Squashfs] [Overlay] in\n[_artifacts/files/initrc].\n\n**References**\n\nReferences to this section:\n\n  * [Booting]\n    * Parameter -- `groot_size`\n  * [Filesystem]\n    * Parameters -- `groot_size`, `groot`, `groot_file` and `groot_hint`\n  * [Image]\n    * Symbolic link -- `/init`\n    * [Loader] directories and `rc-update`\n  * [Design]\n    * [Linux Kernel] parameters\n  * [Repository]\n    * Heart and soul -- [gentoo/_release]\n\nThese are to make sure everything is cross-linked, and that this section is\ncomplete.\n\n--------------------------------------------------------------------------------\n\n## Project #####################################################################\n[Project]: #project\n\nThe project is not named [GaryOS] out of any delusions of grandeur or egomania.\nIt was coined years before its public birth by a pair of good friends who jested\nat the amount of time and effort spent tuning and customizing a computing\nenvironment.  The author's workstation was jokingly called \"Gary OS\".\n\nGaryOS as it is today is the organic evolution of that long-ago workstation into\nthe public project it has become.  It is produced directly from the same build\nthe author uses on their personal system.  In all ways, it **IS** Gary's OS.\n\nThat said, the name is meant to be humorously, ironically self-deprecating.\nGaryOS would not be possible if not for the incalculable, invaluable\ncontributions of countless developers and enthusiasts worldwide over the course\nof many decades (as far back as the 1970s).  It is the author's hope that this\nsmall contribution to the universe of open source software is valuable to\nsomeone other than themself.\n\n### References #################################################################\n[References]: #references\n\n[GaryOS] has maintained a [steady stream of downloads] since its debut in\nFebruary 2014.  It has also shown up in some notable places.\n\n  * [Gentoo ecosystem] ([2018-08](https://github.com/garybgenett/gary-os/raw/master/_artifacts/archive/gentoo-20.08.pdf))\n  * [List of non-systemd distributions] (proudly)\n  * [Softpedia review of v3.0] (not just a paste of the [README.md] text)\n\nHopefully, it will someday make these lists as well.\n\n  * [Wikipedia Gentoo derived distributions] (it was, before the page re-write)\n  * [DistroWatch]\n\nSnapshots of all discovered references to GaryOS are kept in\n[_artifacts/archive/].  Please contact the author at [gary-os@garybgenett.net]\nwith any other acknowledgments you find.  The fact that you are reading this\ncounts.\n\n  [steady stream of downloads]: https://sourceforge.net/projects/gary-os/files/stats/timeline?dates=2014-02-28+to+2038-01-19\n  [Gentoo ecosystem]: https://github.com/gentoo/gentoo-ecosystem\n  [List of non-systemd distributions]: https://sysdfree.wordpress.com/2019/03/09/135\n  [Softpedia review of v3.0]: https://linux.softpedia.com/get/Linux-Distributions/GaryOS-103629.shtml\n\n  [Wikipedia Gentoo derived distributions]: https://en.wikipedia.org/wiki/Gentoo_Linux#Derived_distributions\n  [DistroWatch]: https://distrowatch.com/table.php?distribution=funtoo\n\n  \u003c!-- Unused, Tracking Only --\u003e\n\n  [Gentoo pamphlet]: https://download.sumptuouscapital.com/gentoo/fosdem2018/gentoo-fosdem2018-flyer.pdf\n  [Random blog mention]: https://josesfreelinux.blogspot.com/2015/03\n\n### Contributing ###############################################################\n[Contributing]: #contributing\n\nContributions are welcome and will be publicly acknowledged.\n\n**Patches**\n\nTo create patches there is a function in [.bashrc].  Submit patches to\n[gary-os@garybgenett.net].\n\n  ```\n  ./.bashrc git-patch \u003cparent commit\u003e\n  ```\n\nThe parent commit should be the last commit hash before your changes.  This will\ncreate `####-*` patch files for each commit since the parent.  Email them as\nattachments.  [GitHub] pull requests or links to commits in a forked repository\nalso work.\n\n**Inclusivity**\n\nThe author is passionate about who you are, your ideas, what you manifest, and\nhow you carry yourself in the world.  Come as you are.  We are all just human\nbeings.\n\n  * [Social Protection \u0026 Human Rights Equality and Non-discrimination]\n  * [Contributor Covenant Code of Conduct]\n\nLet's all just be kind to one another, so we someday won't even need documents\nlike these.\n\n  [Social Protection \u0026 Human Rights Equality and Non-discrimination]: https://socialprotection-humanrights.org/framework/principles/equality-and-non-discrimination\n  [Contributor Covenant Code of Conduct]: https://contributor-covenant.org/version/1/4/code-of-conduct.html\n\n### Licensing ##################################################################\n[Licensing]: #licensing\n\nStarting with [v4.0], [GaryOS] is released under the [GNU GPL v3.0].  It was\noriginally released under a [BSD-style license].\n\nThe [FSF] and [GNU] projects are dedicated to a completely open society based\non open source computing.  The GPL is a manifesto as much as it is a license.\n\nThe [BSD] philosophy is that BSD-style licenses are yet more permissive and\nfoster the innovation of new technologies by allowing them to be driven by\nprofit.\n\nThe original intent was to support the BSD philosophy.  Switching to the GPL was\npredicated by a few factors.\n\n  * The perspective that code is a written work of art and not a product\n  * Proliferation of software patents and intellectual property enforcement\n  * GaryOS is written entirely in interpreted and not compiled languages\n  * It is unlikely that any proprietary software will be based on GaryOS\n  * Patches are sometimes submitted to GPL projects\n\nFor further details, see the current [License] or the licenses for the\nindividual [Versions].\n\nThe author and contributors do not offer any warranty.  You take all\nresponsibility for your use of this software.  If it breaks, you own all the\npieces.\n\n  [GNU GPL v3.0]: https://www.gnu.org/licenses/gpl-3.0.html\n  [BSD-style license]: http://opensource.org/licenses/BSD-3-Clause\n  [BSD]: https://en.wikipedia.org/wiki/Berkeley_Software_Distribution\n\n--------------------------------------------------------------------------------\n\n## Details #####################################################################\n[Details]: #details\n\nThis is additional information mostly pertaining to how the [GaryOS] project is\nmanaged.  It is not necessary reading in order to use any aspect of GaryOS, and\nis only for the curious.\n\n  * [Versioning] scheme\n  * [Repository] overview\n  * Primary [Tools] used\n  * The overall [Ecosystem] GaryOS lives in\n\nIf you read this section, the author would appreciate a note at\n[gary-os@garybgenett.net].\n\n### Versioning #################################################################\n[Versioning]: #versioning\n\nVersion numbers follow [Semantic Versioning].  The major version number\nincrements whenever the [Portage] tree commit is updated.  Minor version numbers\nincrement for release updates that are on the same Portage tree.\n\nRevisions to the [GaryOS] [Builder], [Loader] and Portage configuration will\nalso line up with the Portage tree, since they can only be validated by doing\na full build or a build update.\n\n  [Semantic Versioning]: https://semver.org\n\n### Repository #################################################################\n[Repository]: #repository\n\nHere is an overview of the repository contents, in order of relative importance:\n\n  | Project Files            | Purpose\n  |:---                      |:---\n  | [README.md]              | All documentation\n  | [LICENSE.md]             | License for project and all patches\n  | [Makefile]               | Primary interface to [Builder] and [Loader]\n  | [packages.txt]           | [Kernel] packages, sizes and install information\n  | [packages.rootfs.txt]    | [Rootfs] packages, sizes and install information\n  | [_commit]                | Solely for author tracking of source repositories\n\n  | Key Directories          | Purpose\n  |:---                      |:---\n  | [grub/]                  | [GNU GRUB] menu files (for [Boot], see [GRUB])\n  | [linux/]                 | [Linux Kernel] configuration files\n  | [gentoo/]                | [Portage] configuration, [Builder] and [Loader]\n  | [gentoo/overlay/]        | Version management and fixing broken packages\n  | [scripts/]               | [GRUB] and [QEMU]\n  | [_artifacts/files/]      | [Loader] scripts and [Image] configuration files\n  | [_artifacts/patches/]    | [GaryOS] features and improvements\n  | [_artifacts/archive/]    | Miscellaneous stash space, including [References]\n  | [_artifacts/images/]     | Icons and screenshots\n\n  | Core Files               | Purpose\n  |:---                      |:---\n  | [.bashrc]                | Scripting library (author's [Bash] configuration)\n  | [scripts/grub.sh]        | [GRUB] backed worker script\n  | [linux/_config]          | Simplifies [Linux Kernel] configuration updates\n  | [gentoo/_system]         | Heart and soul of [Builder], and GaryOS itself\n  | [gentoo/_release]        | Heart and soul of [Loader] (and publish process)\n  | [gentoo/_funtoo]         | [Gentoo] [Portage] commit tracking\n  | [gentoo.config]          | Example for \"Edit\" stage in [Compile]\n  | [gentoo/.emergent]       | Audit script and information (see [Builder])\n  | [gentoo/savedconfig/x11-wm/dwm] | Slightly modified [dwm] configuration\n  | [gentoo/sets/gary-os]    | [Kernel] packages, [Loader] and [Image]\n  | [gentoo/sets/_gary-os]   | [Rootfs] packages, [Loader] and [Image]\n\n  | Other                    | Purpose\n  |:---                      |:---\n  | [.vimrc]                 | Keeps this handy and also published online\n  | [xclock_size_hack.patch] | Make [gkrellaclock] look like `xclock`\n\nThe commit history for all these components reside in more than one personal\nrepository.  They are merged together into the public GaryOS [Git] repository by\n[gentoo/_release].  This means that even minor merging issues or the inclusion\nof new files will result in a public repository that can not 'fast-forward' and\nwill require re-cloning.\n\n  [README.md]: https://github.com/garybgenett/gary-os/blob/master/README.md\n  [LICENSE.md]: https://github.com/garybgenett/gary-os/blob/master/LICENSE.md\n  [Makefile]: https://github.com/garybgenett/gary-os/blob/master/Makefile\n  [packages.txt]: https://github.com/garybgenett/gary-os/blob/master/packages.txt\n  [packages.rootfs.txt]: https://github.com/garybgenett/gary-os/blob/master/packages.rootfs.txt\n  [_commit]: https://github.com/garybgenett/gary-os/blob/master/_commit\n\n  [grub/]: https://github.com/garybgenett/gary-os/blob/master/grub\n  [grub/grub.menu.gary-os.cfg]: https://github.com/garybgenett/gary-os/blob/master/grub/grub.menu.gary-os.cfg\n  [linux/]: https://github.com/garybgenett/gary-os/blob/master/linux\n  [gentoo/]: https://github.com/garybgenett/gary-os/blob/master/gentoo\n  [gentoo/overlay/]: https://github.com/garybgenett/gary-os/blob/master/gentoo/overlay\n  [scripts/]: https://github.com/garybgenett/gary-os/blob/master/scripts\n  [_artifacts/files/]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/files\n  [_artifacts/patches/]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/patches\n  [_artifacts/images/]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/images\n  [_artifacts/archive/]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/archive\n\n  [.bashrc]: https://github.com/garybgenett/gary-os/blob/master/.bashrc\n  [scripts/grub.sh]: https://github.com/garybgenett/gary-os/blob/master/scripts/grub.sh\n  [linux/_config]: https://github.com/garybgenett/gary-os/blob/master/linux/_config\n  [gentoo/_system]: https://github.com/garybgenett/gary-os/blob/master/gentoo/_system\n  [gentoo/_release]: https://github.com/garybgenett/gary-os/blob/master/gentoo/_release\n  [gentoo/_funtoo]: https://github.com/garybgenett/gary-os/blob/master/gentoo/_funtoo\n  [gentoo.config]: https://github.com/garybgenett/gary-os/blob/master/gentoo.config\n  [gentoo/.emergent]: https://github.com/garybgenett/gary-os/blob/master/gentoo/.emergent\n  [gentoo/savedconfig/x11-wm/dwm]: https://github.com/garybgenett/gary-os/blob/master/gentoo/savedconfig/x11-wm\n  [gentoo/sets/gary-os]: https://github.com/garybgenett/gary-os/blob/master/gentoo/sets/gary-os\n  [gentoo/sets/_gary-os]: https://github.com/garybgenett/gary-os/blob/master/gentoo/sets/_gary-os\n  [gentoo/sets/packages]: https://github.com/garybgenett/gary-os/blob/master/gentoo/sets/packages\n\n  [.vimrc]: https://github.com/garybgenett/gary-os/blob/master/.vimrc\n  [gkrellaclock]: http://gkrellm.srcbox.net\n  [xclock_size_hack.patch]: https://github.com/garybgenett/gary-os/blob/master/gentoo/overlay/x11-plugins/gkrellaclock/files-patches/xclock_size_hack.patch\n\n  \u003c!-- Global Links --\u003e\n\n  [gentoo/make.conf]: https://github.com/garybgenett/gary-os/blob/master/gentoo/make.conf\n  [gentoo/package.use]: https://github.com/garybgenett/gary-os/blob/master/gentoo/package.use\n  [gentoo/sets/]: https://github.com/garybgenett/gary-os/blob/master/gentoo/sets\n  [_artifacts/files/initrc]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/files/initrc\n  [_artifacts/files/issue]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/files/issue\n  [_artifacts/files/locale.gen]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/files/locale.gen\n  [_artifacts/files/wpa_supplicant.conf]: https://github.com/garybgenett/gary-os/blob/master/_artifacts/files/wpa_supplicant.conf\n  [ego_commit_hack.patch]: https://github.com/garybgenett/gary-os/blob/master/gentoo/overlay/app-admin/ego/files-patches/add-commit-option-to-ego-sync.2.7.4-r1.patch\n\n### Tools ######################################################################\n[Tools]: #tools\n\n[GaryOS] relies on too many open source projects to count (see [Project]).\nHowever, there are a few primary tools and sites which are used to build and\ndistribute GaryOS.  An additional list of secondary items is in [Ecosystem].\n\nFirst and foremost, the projects which brought open source into the mainstream:\n\n  * [FSF] \u0026 [GNU] (GNU's Not Unix)\n  * [Linux Foundation] \u0026 [Linux Kernel]\n  * [GNU/Linux]\n\n  [FSF]: https://www.fsf.org\n  [GNU]: https://www.gnu.org\n  [Linux Foundation]: https://linuxfoundation.org\n  [Linux Kernel]: https://kernel.org\n  [GNU/Linux]: https://gnu.org/gnu/linux-and-gnu.html\n\nThe backbones which do the real heavy lifting in GaryOS:\n\n  * [Gentoo], [Portage] \u0026 [Portage Overlays]\n  * [Linux initramfs]\n    * [Squashfs]\n    * [Overlay]\n    * [Busybox]\n    * [Coreutils]\n  * [GNU GRUB]\n  * [GNU Make]\n  * [QEMU]\n\n  [Gentoo]: https://www.gentoo.org\n  [Portage]: https://wiki.gentoo.org/wiki/Portage\n  [Portage Overlays]: https://wiki.gentoo.org/wiki/Project:Overlays\n  [Linux initramfs]: https://kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt\n  [Squashfs]: https://www.kernel.org/doc/html/latest/filesystems/squashfs.html\n  [Overlay]: https://www.kernel.org/doc/html/latest/filesystems/overlayfs.html\n  [Busybox]: https://busybox.net\n  [Coreutils]: https://www.gnu.org/software/coreutils/coreutils.html\n  [GNU GRUB]: https://gnu.org/software/grub\n  [GNU Make]: https://www.gnu.org/software/make\n  [QEMU]: https://www.qemu.org\n\nKernel configuration, package lists and acknowledgments:\n\n  * [Gentoo Kernel]\n  * [Grml]\n  * [SystemRescue]\n\n  [Gentoo Kernel]: https://wiki.gentoo.org/wiki/Kernel\n  [Grml]: https://grml.org\n  [SystemRescue]: http://www.system-rescue.org\n\nSpecial thanks to the sites which made worldwide distribution possible:\n\n  * [SourceForge]\n  * [GitHub] \u0026 [Git]\n\n  [SourceForge]: https://sourceforge.net\n  [GitHub]: https://github.com\n  [Git]: https://git-scm.com\n\nGitHub inspired the initial publication of this project, and SourceForge\nprovided the distribution platform that made it possible to instantly reach an\ninternational audience.\n\n### Ecosystem ##################################################################\n[Ecosystem]: #ecosystem\n\nBeyond the [Tools] used to create and publish [GaryOS], there is a small\nuniverse of projects that either provided inspiration or are used for GaryOS.\n\nTo start, homage to those who started it all:\n\n  * [tomsrtbt] (floppy disk!)\n  * [KNOPPIX]\n  * [Debian Live]\n\nTomsrtbt was especially influential.  GaryOS is modeled very much after Tom's\nproject.  Some familiar quotes straight from the [tomsrtbt FAQ]:\n\n  ```\n  1) tomsrtbt is\n     \"The most GNU/Linux on one floppy disk\"\n     Tomsrtbt stands for:\n       \"Tom's floppy which has a root filesystem and is also bootable.\"\n\n  2) Design goals\n     as much stuff as possible on 1 floppy disk\n     keep it self contained, build under itself\n     try to make it behave like a normal system\n     rescue and recovery functions get priority\n  ```\n\nThank you so much, Tom.\n\n  [tomsrtbt]: http://www.toms.net/rb\n  [tomsrtbt FAQ]: http://www.toms.net/rb/tomsrtbt.FAQ\n  [KNOPPIX]: https://knopper.net/knoppix\n  [Debian Live]: https://debian.org/devel/debian-live\n\nInspiration and core concepts were also provided by:\n\n  * [Metro]\n  * [Buildroot] \u0026 [BusyBox]\n  * [GoboLinux]\n\n  [Metro]: https://funtoo.org/Metro_Quick_Start_Tutorial\n  [Buildroot]: https://buildroot.org\n  [BusyBox]: https://busybox.net\n  [StaticPerl]: http://software.schmorp.de/pkg/App-Staticperl.html\n  [GoboLinux]: https://gobolinux.org\n\nProjects which are relied on daily for critical tasks or highly visible\ncomponents, and deserve mention:\n\n  * [Bash]\n    * [Vim]\n    * [Rsync]\n    * [OpenSSH]\n  * [X.Org]\n    * [Suckless] [dwm]\n    * [rxvt-unicode]\n    * [Links]\n  * [Rufus]\n  * [Grip]\n\n  [Bash]: https://www.gnu.org/software/bash\n  [Vim]: https://www.vim.org\n  [Rsync]: https://rsync.samba.org\n  [OpenSSH]: https://www.openssh.com\n  [X.Org]: https://x.org\n  [Suckless]: https://suckless.org\n  [dwm]: https://dwm.suckless.org\n  [rxvt-unicode]: http://software.schmorp.de/pkg/rxvt-unicode.html\n  [Links]: http://links.twibright.com\n  [Rufus]: https://rufus.ie\n  [Grip]: https://github.com/joeyespo/grip\n\nGratitude to all those who have contributed to making [GNU/Linux] the most\npowerful and flexible operating system on the planet, and a true \"run\nanywhere, anyhow\" computing environment.\n\n--------------------------------------------------------------------------------\n\n## Release #####################################################################\n[Release]: #release\n\nThis is additional information pertaining exclusively to how [GaryOS] is\ndeveloped, tested and released.  As the author evolved an ever more formal and\nrepeatable process, it made sense to make this part of the public documentation.\n\nEverything needed to perform these steps is in the [Repository] or the\n[Downloads] folder.\n\n### Process ####################################################################\n[Process]: #process\n\n**Personal Build**\n\n*`Iterate {`*\n\n  * `make DOFAST=true doit`\n    * [x] *Errors()*\n  * `make gendir`\n    * `vi ./build/_gentoo/+checks`\n\n*`}`*\n\n*`Errors {`*\n\n   * `make \u003cpackage atom\u003e`\n     * [ ] Copy \"gentoo browse\" link to browser\n     * [ ] Copy \"gitweb\" link to browser\n   * `make overlay-\u003cpackage atom|/|%\u003e^\u003cebuild\u003e^\u003ccommit\u003e`\n     * `mkdir ./gentoo/overlay/\u003cpackage atom\u003e`\n     * `(cd _build/gentoo/gentoo; git-list -20 -l -- \u003cpackage atom\u003e)`\n     * `(cd _build/gentoo/gentoo; git-list -2 -- \u003cpackage atom\u003e/\u003cebuild\u003e)`\n     * `(cd _build/gentoo/gentoo; vdiff -l -20 -- \u003cpackage atom\u003e)`\n   * `make emerge-\u003cpackage atom|/|%\u003e`\n\n*`}`*\n\n  * `cd .setup/gentoo.make`\n    * `(cd _builds; rm ./_gentoo.working; ln _gentoo ./_gentoo.working)`\n        * `(cd _builds/_gentoo; rm-all; ll)`\n        * `(cd _target/iso; vi ./.urls; ./.urls -f)`\n        * `(cd _build/gentoo/gentoo; git pull; GIT_PAGER= git-list -n1)`\n        * `(cd _build/gentoo/gentoo; ll ./sys-kernel/gentoo-sources)`\n        * `(cd _build/gentoo/gentoo; ll ./sys-kernel/gentoo-kernel)`\n    * `vi ./gentoo/_release`\n        * [ ] Update `${_VERSN}` number\n        * `vi ./gentoo/_funtoo`\n            * [ ] Update [Gentoo] commit\n        * `vi ./gentoo/sets/*`\n            * [ ] [Linux Kernel] versions\n            * [ ] Review\n        * `vi ./gentoo/package.* ./gentoo/sets/*`\n            * [ ] Command comments at top of [gentoo/package.use]\n        * `(cd ./gentoo/overlay; ./.review -a)`\n            * [ ] Review `.keep` packages\n        * [ ] Update `${RUFUS_VER}` number\n    * `cd .setup/linux`\n        * `(cd _build/gentoo/gentoo; grep -A10 SRC_URI ./sys-kernel/gentoo-kernel/gentoo-kernel-*.ebuild)`\n            * `wget [...]`\n        * `mv ./kernel-x86_64-fedora.config ./default-gentoo64.config-[...]`\n            * `rm ./.default; ln default-gentoo64-[...] ./.default`\n            * `rsync -L ./.default ./config-gentoo64-[...]`\n        * `rsync -L ./.options ./config-gentoo64-[...]-options`\n            * `rm ./.config; ln config-gentoo64-[...] ./.config`\n            * `rm ./.options; ln config-gentoo64-[...]-options ./.options`\n        * `vi ./.options`\n            * [ ] Update source kernel version\n            * [ ] Review\n  * `make init`\n    * [ ] Until `@world`, at least\n        * `while :; do make DOFAST=true init; inotifywait --event modify gentoo/make.* gentoo/package.* gentoo/sets/*; done`\n        * `(cd .setup; vi gentoo/make.* gentoo/package.* gentoo/sets/*; vdiff -g gentoo/make.* gentoo/package.* gentoo/sets/*)`\n    * [x] *Iterate()*\n  * `./linux/_config ./build/usr/src/linux`\n        * `rsync $(realpath ./linux/.default) ./build/usr/src/linux/.config`\n        * `chroot ./build bash -c \"(cd /usr/src/linux \u0026\u0026 make olddefconfig)\"`\n        * `rsync ./build/usr/src/linux/.config $(realpath ./linux/.default)`\n    * [ ] Review final version\n        * `vdiff $(realpath ./linux/.default) $(realpath ./linux/.config).*.DONE`\n        * `rsync $(realpath ./linux/.config).*.DONE $(realpath ./linux/.config)`\n        * `rm $(realpath ./linux/.config).*`\n  * `make doit`\n    * [ ] Update `savedconfig` directory\n    * [x] *Iterate()*\n  * `cd .setup/gentoo.make`\n    * `(cd .setup; git-commit ./linux ./gentoo)`\n  * `make redo`\n    * [x] *Iterate()*\n    * `make DOMODS=true doit`\n    * `(cd _builds; rsync ./_gentoo/ ./_gary-os.working)`\n  * `make DOMODS=true edit`\n    * `(cd _builds; rm ./_gentoo.boot; ln _gentoo ./_gentoo.boot)`\n    * `(cd _builds; rsync ./_gentoo/ ../../_toor)`\n    * [ ] Boot to \"gary-os\"\n        * `rsync [...]/_root/{.runit,.setup} [...]/_toor/`\n    * [ ] Boot to \"\\_toor\"\n        * [ ] Smoke test for 2-3 weeks\n        * [x] *Iterate()*\n        * `_sync _sys _clone _full _setup`\n    * [ ] Boot to \"gary-os\"\n        * `_sync _sys _chroot [...]`\n        * `rsync [...]/_toor/{.runit,.setup} [...]/_root/`\n    * [ ] Boot to \"\\_root\"\n  * `make DOMODS=true doit`\n    * `ll ./build/ ./build/_build`\n    * `(cd .setup; git-commit ./gentoo)`\n    * `(cd _builds; rsync ./_gentoo/ ../../_toor)`\n    * `_sync _sys _clone _full _setup`\n\n**GaryOS Build**\n\n*`Validate { \u003ckernel\u003e \u003ccheck\u003e \u003coption\u003e \u003ctarget\u003e`*\n\n  * `make` *`${3}`* `doit \u0026\u0026 make` *`${3}`* `DOREDO=true` *`${4}`*\n    * [x] *Iterate()*\n  * [ ] Target size of *`${1}`* or less (`make check` = Total disk usage: *`${2}`*)\n    * [ ] Command comments at bottom of [gentoo/package.use]\n        * `make` *`${3}`* `depends-\u003cpackage atom|/|%\u003e`\n        * `make` *`${3}`* `depgraph-\u003cpackage atom|/|%\u003e`\n        * `make` *`${3}`* `belongs-\u003cfile path|/|%\u003e`\n    * `make` *`${3}`* `DOFAST=true doit \u0026\u0026 make` *`${3}`* `DOFAST=true` *`${4}`*\n        * `make` *`${3}`* `check`\n        * `mkdir ./mnt; mount -o loop ./build/.gary-os-*/gary-os-*.cpio.rootfs ./mnt; ncdu ./mnt; umount ./mnt; rm ./mnt`\n    * `ll ./build/.gary-os-*`\n  * `make` *`${3}`* `gendir`\n    * [ ] Command comments at bottom of [gentoo/make.conf]\n    * `vi ./build/_gentoo/+checks`\n\n*`}`*\n\n  * `cd .setup/gentoo.gary-os`\n    * `make DOFAST=true init`\n  * [x] *Validate( 850MB 1.4GiB '' devel )*\n    * [ ] Verify `#{rootfs}` markers\n  * `make ROOTFS=false devel`\n    * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.kernel 1 -m 8192`\n    * [ ] Test kernel size and root filesystem resize\n  * [x] *Validate( 1.8GB 3.4GiB P=\\_gary-os rootfs )*\n  * `(cd .setup; git-commit ./gentoo)`\n  * `make doit \u0026\u0026 make DOREDO=true devel`\n\n**Test \u0026 Publish**\n\n  * `cd .setup/gentoo.gary-os`\n    * `(cd _builds/.gary-os.release; rm ./v#.#; ln ../_gary-os.working/.gary-os-* ./v#.#)`\n        * `vi ./gentoo/_release`\n            * [ ] Add `${RELEASE[*]}` number, with empty `${CMTHASH[*]}`\n        * `make DOREDO=true _release_grub`\n        * `make _publish_release`\n    * `(cd _builds; rm ./_gary-os.boot; ln _gary-os.working ./_gary-os.boot)`\n        * `_sync boot`\n    * `make DOREDO=true DOTEST=true _release_grub`\n  * [x] [Checklist]\n  * [x] [Publish]\n\n**Rolling Builds**\n\n*`Retry {`*\n\n   * `make DOMODS=true DOFAST=true init`\n   * `make DOMODS=true DOFAST=true doit`\n\n*`}`*\n\n  * `cd .setup/gentoo.make`\n    * `(cd _builds; rm ./_gentoo.boot; ln ../../_toor ./_gentoo.boot)`\n    * `(cd _builds; rm ./_gentoo.working; ln ../../_toor ./_gentoo.working)`\n    * `chmod -vR 755 ./gentoo/`\n    * `vi ./gentoo/_funtoo`\n        * `(cd _build/gentoo/gentoo; git pull; GIT_PAGER= git-list -n1)`\n        * [ ] Update [Gentoo] commit\n    * `make DOMODS=true DOREDO=true doit`\n        * [x] *Retry()*\n    * `make edit`\n\n### Checklist ##################################################################\n[Checklist]: #checklist\n\nEverything in [Booting], [Running] and [Building] should be validated below.\n\n**[Compile]**\n\n  * (Completed in [Process])\n\n**[Linux] / [Virtual]**\n\n  * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.kernel 1`\n    * [ ] Boot time\n    * `rc-status`\n        * `htop`\n        * `free; df -h; ls -la / /.overlay /.overlay/*`\n    * `mount -o remount,size=3072m /; df -h`\n        * `mount -o remount,size=3072m /.overlay; df -h`\n\n**[GRUB] / [Filesystem]**\n\n  * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.qcow2 1 MBR`\n    * [x] Menu\n        * [x] Options\n            * [ ] Verify \"gopts=true\"\n            * [ ] Test each entry\n        * [x] Menu -\u003e Options\n            * [ ] Verify values\n        * [x] Options -\u003e `reset`\n            * [ ] Verify values\n        * `reboot`\n    * [x] Boot\n        * [ ] Verify normal console\n        * `cat /proc/cmdline`\n            * [ ] Verify \"gopts=true\"\n        * `reboot`\n    * [x] Boot Rootfs\n        * [x] Options -\u003e `groot=null`\n        * [ ] Verify `rootfs` menu is readable\n        * `cat /proc/cmdline`\n        * `reboot`\n    * [x] Boot Rootfs\n        * [x] Serial console on `---` entry\n        * [x] Options -\u003e `groot=null`\n        * `vi /.profile /initrc`\n            * `if true; then`\n        * `rootfs -`\n            * `g`\n            * `mount; ls -la /.overlay /.overlay/.overlay; unrootfs; mount`\n        * `rootfs = /dev/null /.gary-os; exit 0`\n            * `\u003center\u003e`\n            * `c; exit 0`\n            * `l`\n            * `\u003center\u003e`\n            * `q`\n        * `rootfs =; mount /dev/sda1 /.groot; exit 1`\n            * `mount; ls -la /.groot /.groot/.groot /.groot/.overlay; unrootfs; mount`\n            * `rm /usr/bin/mount.*; rootfs /dev/sda1`\n            * [ ] Verify `rsync` phase (may exhaust memory)\n            * [ ] If it crashes, reset and restart from here\n            * `mount; ls -la /.overlay/.overlay; unrootfs; mount`\n        * `dotty; exit 0`\n            * `dottys`\n            * `rootfs =`\n            * `modprobe e1000; dhcpcd eth0`\n            * `ssh -vv root@10.0.0.254`\n            * `exit 1`\n            * `unrootfs; mount`\n        * `rootfs /dev/sda1`\n            * `boot`\n    * `rc-status`\n        * `htop`\n        * `free; df -h; ls -la / /.overlay /.overlay/*`\n\n**[EFI]**\n\n  * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.qcow2 1`\n    * [ ] EFI menu (using `\\\u003cescape\\\u003e`)\n        * [x] Boot Maintenance Manager\n        * [x] Boot From File\n        * [ ] [Boot]\n        * `reboot`\n    * [ ] Repeat with [Kernel]\n\n**[PXE]**\n\n  * `./scripts/qemu-minion.bsh /dev/null 1`\n    * `(cd .store; rsync -L ./gary-os/gary-os.kernel ./_rescue)`\n        * [ ] Verify direct boot\n    * `(cd .store; rsync -L ./gary-os/gary-os.grub/x86_64.efi ./_rescue)`\n    * `vi [...]/dhcpd.conf; sv restart dhcpd tftpd`\n        * [ ] Uncomment `root-path`\n        * [x] PXE\n        * `ls -la /.overlay`\n  * `./scripts/qemu-minion.bsh /dev/null 1 -m 8192`\n    * `vi [...]/dhcpd.conf; sv restart dhcpd tftpd`\n        * [ ] Change `root-path` location\n        * [ ] Uncomment `extensions-path`\n        * [x] PXE\n        * `ls -la /.overlay`\n  * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.qcow2 1 -m 8192`\n    * [x] Options\n        * [x] `dhcp`\n        * [x] `pxe: groot`\n    * [x] PXE\n  * `/.setup/.setconf; sv restart dhcpd tftpd`\n\n**[Windows] / [GRUB] / [Virtual]**\n\n  * `sv stop qemu.windows`\n    * `rm /tmp/qemu.windows.img.*`\n    * `(cd _systems/qemu; rm windows.img)`\n    * `(cd _systems/qemu; qemu-img create -f qcow2 -o compat=1.1,backing_file=$(ls windows-10.*.2-update.qcow2) windows.img)`\n  * `./scripts/qemu-windows.bsh / ALT -m 8192`\n    * [ ] Download [Boot] and [Kernel] to the desktop\n    * [ ] Download and install [VirtualBox]\n        * [ ] Use `Desktop` for new [Virtual]\n        * [x] Task Manager, Performance\n        * [ ] Verify boot\n    * [ ] Install [GRUB]\n  * `./scripts/qemu-windows.bsh / ALT BOOT -m 8192`\n    * [ ] Verify both \"Windows\" entries\n        * `change cdrom0 [...]/en_windows_10_*.iso`\n    * [x] Boot\n        * `reboot`\n    * [x] Windows\n        * [ ] Run `bcdedit.bat` as 'Administrator'\n  * `./scripts/qemu-windows.bsh / ALT -m 8192`\n    * [x] Windows\n        * [x] GaryOS Grub (produces EFI error screen)\n        * `\u003cescape\u003e`\n    * [x] Boot Manager\n        * [x] GaryOS Grub\n        * [x] Windows\n  * `./scripts/qemu-minion.bsh /dev/null 1`\n    * [x] Boot\n  * `(cd _systems/qemu; rm windows.img)`\n    * `(cd _systems/qemu; ln windows-10.qcow2 windows.img)`\n    * `rm /tmp/qemu.windows.img.*`\n    * `sv restart qemu.windows`\n\n**[Networking] / [GUI]**\n\n  * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.qcow2 1`\n    * [ ] Ethernet [Networking]\n    * [ ] [GUI]\n  * [ ] Boot to \"gary-os\"\n    * [ ] Wireless [Networking]\n    * [ ] [GUI]\n\n**[Update] / [Manage] / [Image] / [Install]**\n\n  * `rm /tmp/qemu.gary-os-* /tmp/qemu.null.*`\n  * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.qcow2 1 -m 8192`\n    * `cd /.gary-os`\n        * `rc-update add dhcpcd default; openrc`\n            * `mount -o remount,size=6144m /.overlay`\n        * `source ./.bashrc`\n            * `shell -i`\n            * `rsync -L --filter=-_/gentoo.git --filter=-_/sources --filter=-_/build --filter=-_/gary-os root@10.0.0.254:[...]/.setup/gentoo.gary-os/ /.gary-os`\n        * `exit 0`\n    * `cd /.gary-os`\n        * `touch ./overlay`\n            * *note: should not be necessary, but resolves: `grub-bios-setup: error: failed to get canonical path of 'overlay'.`*\n            * https://unix.stackexchange.com/a/429434\n        * `mkdir /tmp/grub; HOME=/.gary-os GRUB_DIR=/.gary-os/grub ./scripts/grub.sh /tmp/grub -fx -k/dev/sda1 /dev/sdb1`\n            * `umount /dev/sdb*`\n            * `gdisk /dev/sdb`\n            * `./.bashrc format /dev/sdb1`\n        * `make unpack`\n        * `mount /dev/sdb1 /.install`\n        * `mkdir /.install/gary-os`\n    * `ls -la ./gary-os/`\n        * `rm ./gary-os/gary-os-*.fetch`\n        * `make fetch`\n            * `sed -i \"s|^[#]||g\" ./gary-os/gary-os-*.fetch`\n            * `for FILE in $(cat ./gary-os/gary-os-*.fetch); do rsync -L --progress root@10.0.0.254:[...]/_builds/_gary-os.working/.gary-os-*/${FILE} /.install/gary-os/; done`\n            * `make DOTEST=true fetch`\n    * `ls -la /.gary-os-*/`\n        * `make DOREDO=true unpack`\n            * `sed -i \"s|^[+]|*|g\" /.unpack`\n            * `make unpack`\n        * `emerge app-misc/hello`\n            * `hello`\n        * `emerge app-text/aspell`\n            * [ ] Verify from [SourceForge] package\n    * `ls -la /.gary-os-*/`\n        * `rm /.gary-os-*/gary-os-*.rootfs*`\n            * `make rootfs`\n            * `mount -o loop /.gary-os-*/gary-os-*.rootfs /mnt; ls -la /mnt; umount /mnt`\n    * `ls -la ./sources/; ls -la ./build.install/`\n        * `rm ./build; ln -fsv /.install ./build`\n        * `mv ./gary-os/gary-os-*.stage3.tar.xz ./gary-os/stage3-generic_64.tar.xz`\n        * `make init`\n            * [ ] Exit with \\\u003cctrl-c\\\u003e once unpacking the `stage3`\n        * `ls -la ./build/ ./build/_build`\n    * `ls -la /.install/`\n        * `rm ./build; ln -fsv / ./build`\n        * `make install`\n            * [ ] Copy and paste GRUB instructions\n            * `cat /.install/etc/issue`\n            * `ls -la /.install`\n            * `df -h`\n        * `make DOREDO=true install`\n            * `cat /etc/issue`\n    * `vi /.install/etc/inittab`\n        * [ ] Uncomment serial console\n  * `./scripts/qemu-minion.bsh /dev/null 1`\n    * [ ] Verify default boot\n        * `hello`\n        * `reboot`\n    * [x] Boot (manually from GRUB command line)\n        * `cd /.gary-os`\n        * `touch ./overlay`\n        * `mount -o remount,size=3072m /.overlay`\n        * `mkdir /tmp/grub; HOME=/.gary-os GRUB_DIR=/.gary-os/grub ./scripts/grub.sh /tmp/grub /dev/sda1`\n        * `reboot`\n    * [x] Install Menu\n        * `\u003cescape\u003e`\n    * [x] Install Boot\n        * `cd /.gary-os`\n        * `make reset`\n        * `vi +/#{GFG} /etc/portage/{make.conf,package.use}`\n        * `rm /var/db/repos/gentoo`\n        * `make update`\n        * `make upgrade`\n  * `rm /tmp/qemu.gary-os-* /tmp/qemu.null.*`\n  * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.qcow2 1 -m 8192`\n    * [x] Boot Rootfs\n        * [ ] Command comments in [gentoo/sets/_gary-os]\n  * `rm /tmp/qemu.gary-os-* /tmp/qemu.null.*`\n\n### Publish ####################################################################\n[Publish]: #publish\n\n**Review**\n\n  * `cd coding/gary-os`\n  * `vi ./README.md`\n    * [ ] [Kernel], [Rootfs] and [Boot] links\n    * [ ] [Versions] list in [Header](#welcome-to-garyos)\n    * [ ] [Versions] section and release notes\n        * `for FILE in coding/gary-os .setup .static; do [...]`\n        * `if [ ${FILE} == coding/gary-os ]; then LIST=\"\"; fi`\n        * `if [ ${FILE} == .setup ]; then LIST=\"grub linux gentoo\"; fi`\n        * `if [ ${FILE} == .static ]; then LIST=\".bashrc .vimrc scripts/grub.sh scripts/qemu*\"; fi`\n        * `(cd ${FILE}; vdiff -g $(sed -n \"s|^$(basename ${FILE}): ||gp\" [...]/_builds/_gary-os/_commit) ${LIST})`\n    * [ ] Screenshots\n        * `(cd .setup/gentoo.gary-os; ./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.qcow2 1)`\n            * [x] Peek\n        * `wmctrl -i -r 0x00000000 -e 0,0,0,800,600`\n            * `vi ~/.Xresources` -\u003e `URxvt.background: rgb:00/00/00`\n            * `ctrl-a s, crtl-a F`\n            * [x] Gimp -\u003e File -\u003e Create -\u003e Screenshot\n        * `remote-viewer`\n            * `startx`\n            * `xrandr -s 1024x768`\n            * [x] Links -\u003e \u003chttp://10.0.0.254:6419/#welcome-to-gary-os\u003e\n            * [x] File -\u003e Screenshot\n        * `(file *; exiv2 *; identify -verbose *) | less`\n  * `make TOKN=[...] readme-github`\n    * `make DOTEST=true readme`\n    * `make readme-all`\n        * `pages ./GaryOS-Readme.html`\n    * `aspell -c ./README.md`\n        * `rm ./README.md.bak`\n  * `make readme-clean`\n\n**Commit**\n\n**`Verify {`**\n\n  * `cat ./build/etc/issue ./build/etc/motd ./build/_commit`\n  * `for FILE in coding/gary-os .setup .static; do (cd ${FILE}; GIT_PAGER= git-list -n1 2\u003e/dev/null); done`\n    * `(cd ./build/.gary-os; GIT_PAGER= git-list -n1)`\n  * `./scripts/qemu-minion.bsh [...]`\n    * `cd /.gary-os; GIT_PAGER= git log -n1; git status`\n    * `GIT_PAGER= git diff`\n    * `startx`\n\n**`}`**\n\n  * `cd .setup/gentoo.gary-os`\n    * `(cd _builds/.gary-os.release; rm ./v#.#)`\n    * `make clean`\n    * `ll ./build/ ./build/_build`\n  * `(cd .setup; vi gentoo/_release; git-commit -m \"Incremented version number.\" gentoo/_release)`\n    * [ ] Commit `${_VERSN}` number\n  * `(cd coding/gary-os; git-commit -m \"Stamped v#.# release.\" ./README.md)`\n    * `make _publish_gitdir`\n    * `(cd _builds/.gary-os/.gary-os; GIT_PAGER= git-list -n1)`\n  * `make doit \u0026\u0026 make DOREDO=true release _prepare_packdirs`\n    * `(cd _builds; rsync ./_gentoo/var/cache/{distfiles,binpkgs} ./_gary-os.working/var/cache/)`\n    * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.kernel 1`\n    * [x] **Verify()**\n  * `make P=_gary-os doit \u0026\u0026 make P=_gary-os DOREDO=true rootfs`\n    * `_sync boot`\n    * `./scripts/qemu-minion.bsh ./build/.gary-os-*/gary-os-*.kernel 1 \"groot=10.0.0.254 groot_size=6144m\" -m 8192`\n    * [x] **Verify()**\n  * `make _publish_prep`\n    * `ll ./build/ ./build/_build ./build/.gary-os-*`\n  * `(cd _builds; rsync -L ./_gary-os.working/.gary-os-*/ ./_gary-os)`\n    * `(cd _builds/_gary-os; git-backup \u003cgentoo commit\u003e.#; GIT_PAGER= git-list -n1)`\n  * `(cd .setup; vi gentoo/_release; git-commit -m \"Published v#.# release.\" gentoo/_release)`\n    * [ ] Commit `${RELEASE[*]}` number\n  * `make _publish_gitdir`\n    * `(cd _builds/.gary-os/.gary-os; GIT_PAGER= git-list -n3)`\n    * `(cd _builds/.gary-os/.gary-os; GIT_PAGER= git tag -l)`\n    * `./.validate`\n\n**Upload**\n\n  * `make _publish_export`\n    * `(cd _builds/.gary-os.release; ll ./ ./v#.#)`\n  * `make _publish_release`\n  * \u003chttps://sourceforge.net/projects/gary-os\u003e\n    * [ ] Verify page information\n    * [ ] Verify directory contents\n    * [ ] Update download button\n  * \u003chttps://github.com/garybgenett/gary-os\u003e\n    * [ ] Test v#.# links\n  * `cd writing/garybgenett`\n    * `make -C projects \u0026\u0026 make site-force \u0026\u0026 make export-all`\n    * `git-save`\n\n**Personal**\n\n  * `(cd _builds; rm ./_gary-os.boot; ln _gary-os ./_gary-os.boot)`\n    * `_sync boot`\n  * `cd .setup/gentoo.make`\n    * `make DOMODS=true doit`\n    * `make _publish_prep`\n    * `(cd _builds/_gentoo; git-backup \"gary-os v#.#\"; GIT_PAGER= git-list -n1)`\n  * `cd coding/gary-os-history`\n    * `ln ../gary-os.git ./.git`\n    * `GIT_PAGER= git-list -n1`\n    * `git checkout README.md`\n    * `rm ./.git`\n\n**Celebrate**\n\n  * `cd coding/gary-os`\n    * `make TOKN=[...] DOMODS=true DOREDO=true readme-github`\n    * `make TOKN=[...] DOMODS=true readme-github`\n  * \u003chttps://github.com/garybgenett/gary-os/graphs/traffic\u003e\n    * [x] [steady stream of downloads]\n    * [ ] Downloads_2014-02_to_XXXX-XX.csv\n\n--------------------------------------------------------------------------------\n\n## Versions ####################################################################\n[Versions]: #versions\n\n[License]: https://github.com/garybgenett/gary-os/blob/master/LICENSE.md\n[Downloads]: https://sourceforge.net/projects/gary-os/files\n\n[Kernel]: https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.kernel\n[Rootfs]: https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.rootfs\n[Boot]: https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.grub.zip\n[Disk]: https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.qcow2\n\n[(...)]: #v50-2021-08-04\n\n### v8.0 2024-05-16 ############################################################\n[v8.0 2024-05-16]: #v80-2024-05-16\n[v8.0]: #v80-2024-05-16\n\n  **[Repository](https://github.com/garybgenett/gary-os/tree/v8.0)\n  / [Readme](https://github.com/garybgenett/gary-os/blob/v8.0/README.md)\n  / [License](https://github.com/garybgenett/gary-os/blob/v8.0/LICENSE.md)\n  / [Packages (Kernel)](https://github.com/garybgenett/gary-os/blob/v8.0/packages.txt)\n  / [Packages (Rootfs)](https://github.com/garybgenett/gary-os/blob/v8.0/packages.rootfs.txt)**\n\n  |                | |\n  |:---            |:---\n  | Kernel         | [gary-os-v8.0-generic_64.kernel](https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.kernel)\n  | Rootfs         | [gary-os-v8.0-generic_64.rootfs](https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.rootfs)\n  | Boot           | [gary-os-v8.0-generic_64.grub.zip](https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.grub.zip)\n  | Disk           | [gary-os-v8.0-generic_64.qcow2](https://sourceforge.net/projects/gary-os/files/gary-os-v8.0-generic_64.qcow2)\n  | Source Stage3  | [gary-os-v8.0-generic_64.stage3.tar.xz](https://sourceforge.net/projects/gary-os/files/v8.0/gary-os-v8.0-generic_64.stage3.tar.xz)\n  | Source Portage | [gary-os-v8.0-generic_64.gentoo-repo.tar.xz](https://sourceforge.net/projects/gary-os/files/v8.0/gary-os-v8.0-generic_64.gentoo-repo.tar.xz)\n\n  * Overall\n    * Upstream filesystem consolidation into `/usr` directory\n    * Improvements to [Loader], and better compression of package directories\n    * Improvements to [Builder], [Rootfs], and release processes\n    * Removed build dependency packages from [Kernel], for size\n    * Formally incorporated rolling build updates\n    * Separated [Disk] file from [Boot] archive\n    * Retired [Tiny] kernel!\n  * [Portage]\n    * Updated and centralized `emerge` command-line options\n    * Ongoing refinements of `$USE` variables for [Kernel] build\n    * Upgraded [Linux Kernel] to 6.x version\n    * Customized [Busybox] configuration\n  * [GRUB]\n    * Fixes for upstream changes\n\n  [Tiny]: https://sourceforge.net/projects/gary-os/files/v7.0/gary-os-v7.0-generic_64.tiny.kernel\n\n### v7.0 2023-01-14 ############################################################\n[v7.0 2023-01-14]: #v70-2023-01-14\n[v7.0]: #v70-2023-01-14\n\n  **[Repository](https://github.com/garybgenett/gary-os/tree/v7.0)\n  / [Readme](https://github.com/garybgenett/gary-os/blob/v7.0/README.md)\n  / [License](https://github.com/garybgenett/gary-os/blob/v7.0/LICENSE.md)\n  / [Packages (Kernel)](https://github.com/garybgenett/gary-os/blob/v7.0/packages.txt)\n  / [Packages (Tiny)](https://github.com/garybgenett/gary-os/blob/v7.0/packages.tiny.txt)\n  / [Packages (Rootfs)](https://github.com/garybgenett/gary-os/blob/v7.0/packages.rootfs.txt)**\n\n  |                | |\n  |:---            |:---\n  | Kernel         | [gary-os-v7.0-generic_64.kernel](https://sourceforge.net/projects/gary-os/files/gary-os-v7.0-generic_64.kernel)\n  | Kernel (Tiny)  | [gary-os-v7.0-generic_64.tiny.kernel](https://sourceforge.net/projects/gary-os/files/v7.0/gary-os-v7.0-generic_64.tiny.kernel)\n  | Rootfs         | [gary-os-v7.0-generic_64.rootfs](https://sourceforge.net/projects/gary-os/files/gary-os-v7.0-generic_64.rootfs)\n  | Boot           | [gary-os-v7.0-generic_64.grub.zip](https://sourceforge.net/projects/gary-os/files/gary-os-v7.0-generic_64.grub.zip)\n  | Source Stage3  | [gary-os-v7.0-generic_64.stage3.tar.xz](https://sourceforge.net/projects/gary-os/files/v7.0/gary-os-v7.0-generic_64.stage3.tar.xz)\n  | Source Portage | [gary-os-v7.0-generic_64.gentoo-repo.tar.xz](https://sourceforge.net/projects/gary-os/files/v7.0/gary-os-v7.0-generic_64.gentoo-repo.tar.xz)\n\n  * Overall\n    * Switched to [Gentoo] proper, for better stability and support\n    * [Linux Kernel] configuration now from [Gentoo Kernel]\n    * Enhancements and optimizations to [Builder] and the [Compile] process\n    * Replaced `shmem_size` with `groot_size` for [Rootfs] [Overlay] process\n    * Minimized [Loader] packages list\n  * [Portage]\n    * Upgraded to new [GPKG binary package] format\n    * Finally consolidated to single version of Python, and eliminated Ruby\n    * Created closer tracking of `$USE` variables for [Kernel] build\n    * Minimized proprietary firmware and binary packages\n    * Minor changes to package lists\n  * [GRUB]\n    * Latest development version of [GNU GRUB] (see [grub rationale file])\n    * At last, fixed the need for [Tiny] with upstream patch!\n    * Switched to `sfdisk` for partitioning\n    * Upgraded to new version of [Rufus]\n\n  [GPKG binary package]: https://wiki.gentoo.org/wiki/Binary_package_guide\n  [grub rationale file]: https://github.com/garybgenett/gary-os/blob/master/gentoo/overlay/sys-boot/grub/.rationale\n\n### v6.0 2021-09-12 ############################################################\n[v6.0 2021-09-12]: #v60-2021-09-12\n[v6.0]: #v60-2021-09-12\n\n  **[Repository](https://github.com/garybgenett/gary-os/tree/v6.0)\n  / [Readme](https://github.com/garybgenett/gary-os/blob/v6.0/README.md)\n  / [License](https://github.com/garybgenett/gary-os/blob/v6.0/LICENSE.md)\n  / [Packages (Kernel)](https://github.com/garybgenett/gary-os/blob/v6.0/packages.txt)\n  / [Packages (Tiny)](https://github.com/garybgenett/gary-os/blob/v6.0/packages.tiny.txt)\n  / [Packages (Rootfs)](https://github.com/garybgenett/gary-os/blob/v6.0/packages.rootfs.txt)**\n\n  |                | |\n  |:---            |:---\n  | Kernel         | [gary-os-v6.0-generic_64.kernel](https://sourceforge.net/projects/gary-os/files/gary-os-v6.0-generic_64.kernel)\n  | Kernel (Tiny)  | [gary-os-v6.0-generic_64.tiny.kernel](https://sourceforge.net/projects/gary-os/files/v6.0/gary-os-v6.0-generic_64.tiny.kernel)\n  | Rootfs         | [gary-os-v6.0-generic_64.rootfs](https://sourceforge.net/projects/gary-os/files/gary-os-v6.0-generic_64.rootfs)\n  | Boot           | [gary-os-v6.0-generic_64.grub.zip](https://sourceforge.net/projects/gary-os/files/gary-os-v6.0-generic_64.grub.zip)\n  | Source Stage3  | [gary-os-v6.0-generic_64.stage3.tar.xz](https://sourceforge.net/projects/gary-os/files/v6.0/gary-os-v6.0-generic_64.stage3.tar.xz)\n  | Source Portage | [gary-os-v6.0-generic_64.meta-repo.tar.xz](https://sourceforge.net/projects/gary-os/files/v6.0/gary-os-v6.0-generic_64.meta-repo.tar.xz)\n\n  * Overall\n    * Completely up-to-date [Funtoo] [meta-repo] commit!\n    * [Linux Kernel] configuration now from [Debian Kernel]\n    * Streamlined [Builder] [Compile] process\n    * More comprehensive `FS*` variable defaults\n    * Improved \"rootfs\" overlay process and menu system in [Kernel]\n    * Added [Tiny] kernel build\n    * Color-branded [dwm]\n  * [Portage]\n    * Promoted \"FUNTOO\" variable\n    * Tightened up [gentoo/sets/] package lists\n    * Consolidated and condensed Python versions\n    * Eliminated Systemd, Surf, WebKit, SpiderMonkey, Ruby and CUPS\n    * Quieter, prettier and easier to read [gentoo/_system] output\n    * Improved [gentoo/overlay/] management\n    * Enhanced [gentoo/.emergent] output\n  * [GRUB]\n    * Extracted menus from script to [grub/] directory\n    * Added options menu\n    * Enhanced Windows support, including USB install partitions\n    * Enabled block devices for `mount` options\n    * Updated MBR modules list\n    * Improved debugging, including custom tracing output\n    * Better usage and error output\n    * Cleaned up [Boot] archive\n\n  [Funtoo]: https://www.funtoo.org\n  [meta-repo]: https://github.com/funtoo/meta-repo\n  [Debian Kernel]: https://www.debian.org/doc/manuals/debian-handbook/sect.kernel-compilation.pl.html\n\n### v5.0 2021-08-04 ############################################################\n[v5.0 2021-08-04]: #v50-2021-08-04\n[v5.0]: #v50-2021-08-04\n\n  **[Repository](https://github.com/garybgenett/gary-os/tree/v5.0)\n  / [Readme](https://github.com/garybgenett/gary-os/blob/v5.0/README.md)\n  / [License](https://github.com/garybgenett/gary-os/blob/v5.0/LICENSE.md)\n  / [Packages (Kernel)](https://github.com/garybgenett/gary-os/blob/v5.0/packages.txt)\n  / [Packages (Rootfs)](https://github.com/garybgenett/gary-os/blob/v5.0/packages.rootfs.txt)**\n\n  |                | |\n  |:---            |:---\n  | Kernel         | [gary-os-v5.0-generic_64.kernel](https://sourceforge.net/projects/gary-os/files/gary-os-v5.0-generic_64.kernel)\n  | Rootfs         | [gary-os-v5.0-generic_64.rootfs](https://sourceforge.net/projects/gary-os/files/gary-os-v5.0-generic_64.rootfs)\n  | Boot           | [gary-os-v5.0-generic_64.grub.zip](https://sourceforge.net/projects/gary-os/files/gary-os-v5.0-generic_64.grub.zip)\n  | Source Stage3  | [stage3-generic_64-1.4-release-std-2019-10-28.tar.xz](https://sourceforge.net/projects/gary-os/files/v5.0/stage3-generic_64-1.4-release-std-2019-10-28.tar.xz)\n  | Source Portage | [gary-os-v5.0-generic_64.meta-repo.tar.xz](https://sourceforge.net/projects/gary-os/files/v5.0/gary-os-v5.0-generic_64.meta-repo.tar.xz)\n\n  * Overall\n    * Unification of personal and public builds!\n    * Formalized development process and release checklist\n    * Improved [Linux initramfs] overlay in [Kernel]\n    * Included [Ego] configuration into [gentoo/sets/]\n    * Additional development helpers in [Makefile]\n    * Achieved pure 64-bit\n  * [Portage]\n    * Improved [meta-repo] tool in [gentoo/_funtoo.kits]\n    * Overhauled [gentoo/sets/] and [gentoo/overlay/]\n    * Streamlined [gentoo/overlay/] management\n    * Complete debug stripping of packages\n    * Tightened up [gentoo/sets/] lists\n    * Ongoing Python management\n    * Added ZFS support\n  * [GRUB]\n    * Minor improvements and fixes\n\n  [Ego]: https://funtoo.org/Package:Ego\n  [gentoo/_funtoo.kits]: https://github.com/garybgenett/gary-os/blob/master/gentoo/_funtoo.kits\n\n### v4.0 2021-07-26 ############################################################\n[v4.0 2021-07-26]: #v40-2021-07-26\n[v4.0]: #v40-2021-07-26\n\n  **[Repository](https://github.com/garybgenett/gary-os/tree/v4.0)\n  / [Readme](https://github.com/garybgenett/gary-os/blob/v4.0/README","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgarybgenett%2Fgary-os","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgarybgenett%2Fgary-os","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgarybgenett%2Fgary-os/lists"}