qemush/README.md

138 lines
4 KiB
Markdown

# `qemush` - An Unix philosophy respecting QEMU wrapper written in shell
[![Please don't upload to GitHub](https://nogithub.codeberg.page/badge.svg)](https://nogithub.codeberg.page)
## How does it work
`qemush` allows to run commands as Unix user `qemu` to manage virtual
machines and their disks associated.
## Why
`qemush` is **daemonless**: no bloaty long running process is needed for
`qemush` to work.
`qemush` is **lightweight**: it only consists in a shell script to
automate repeated tasks and force good practices.
`qemush` needs **few dependencies**: see section
[Dependencies](#dependencies) for details.
`qemush` is **hackable**: you can [write your own launching
scripts](#writing-a-launching-script) to make it work as intended.
`qemush` is **easy to setup**: you can make it work in a few steps, see
section [Installation instructions](#installation-instructions).
## Good practices?
Here is a list of good practices forced by `qemush`.
- **Processes running as user `qemu`**: members of group `qemu` can manage
the same virtual machines
- **Modularization**: `qemush` launching scripts are intended to be
stackable to reuse common `qemu` parameters in all virtual machines
needing them
- **Process supervision**: `qemush` uses `screen` to supervise processes
and keep track of them
- **Copy-on-write**: images are formatted using `qcow2` to use less space
on disk
## Dependencies
All dependencies are common packages for a distribution, you'll be able to
grab them from your packages sources.
- `qemu` - this is literally a QEMU wrapper so there's a chance you'll
need it
- `bash` - the `qemush` interpreter
- `coreutils` - used for basic OS operations
- `sudo` - execute commands as `qemu`
- `screen` - for process supervision
- `source-highlight` - for syntax highlighting when displaying launching
scripts
- `diskpath` - see [Add `qemush` modules in
`~qemu/bin`](#add-qemush-modules-in-qemubin)
- any text editor - used for builtin function to edit launching scripts
You can run `qemush depcheck` to check if all dependencies are met.
## Installation instructions
### QEMU user and group
`qemush` acts as Unix user `qemu` to manage virtual machines. You need to
create a system user `qemu` that cannot login, with any home directory,
in an Unix group of the same name. Example:
```sh
# Example if the qemu user doesn't exist
# Make sure /etc/shells contains /bin/nologin
useradd -r -s /bin/nologin qemu
```
For ease of use, you need to grant every user in the `qemu` group via
`sudo` the right to execute commands as `qemu`. You can find an example
`sudoers` rule in this repo's `etc/sudoers.d` folder.
### Via `Makefile` (recommended)
Just run the following command at the root of this repository to install
`qemush` (previous step is **mandatory**) :
```sh
make
```
> And what if I don't want to bindly run this obscure `Makefile` ???
You'd be right. The next section is the exhaustive list of steps handled
by the `Makefile` for the installation process.
### Manual installation (what does the `Makefile` do)
- Create `images`, `launchers` and `bin` directories in `~qemu`
- Copy `qemush` scripts parts from `qemu/bin` in `~qemu/bin` with mode
`740`
- Compile C programs from `src` in `~qemu/bin` with mode `740`
- Copy the default launching scripts to `~qemu/launchers` with mode `740`
- Copy `bin/qemush` to `/usr/local/bin/qemush` with mode `755`
## Usage
### Writing a launching script
The default text editor used by `qemush` is `nvim`, but it can be
overriden by the `EDITOR` environment variable.
Run the following command to start editing a launching script by the name
of your choice:
```sh
qemush edit "$name"
```
Example scripts are available in this repo's `qemu/bin` folder.
### Launching a virtual machine
Virtual machines are identified by the name of their launching scripts.
You can launch any machine with the following command:
```sh
qemush start "$name"
```
You can also list all available virtual machines by running this command:
```sh
qemush ls
```
### Other uses
You can show the full list of possible actions by running this command:
```sh
qemush help
```