diff --git a/developer/building/development-workflow.md b/developer/building/development-workflow.md
index 0146fe3ae..9a01361fd 100644
--- a/developer/building/development-workflow.md
+++ b/developer/building/development-workflow.md
@@ -6,533 +6,7 @@ redirect_from:
- /en/doc/development-workflow/
- /doc/DevelopmentWorkflow/
- /wiki/DevelopmentWorkflow/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/building/development-workflow.html
ref: 66
title: Development workflow
----
-
-A workflow for developing Qubes OS+
-
-First things first, setup [QubesBuilder](/doc/qubes-builder/). This guide
-assumes you're using qubes-builder to build Qubes.
-
-# Repositories and committing Code
-
-Qubes is split into a bunch of git repos. These are all contained in the
-`qubes-src` directory under qubes-builder. Subdirectories there are separate
-components, stored in separate git repositories.
-
-The best way to write and contribute code is to create a git repo somewhere
-(e.g., github) for the repo you are interested in editing (e.g.,
-`qubes-manager`, `core-agent-linux`, etc). To integrate your repo with the rest
-of Qubes, cd to the repo directory and add your repository as a remote in git
-
-**Example:**
-
-~~~
-$ cd qubes-builder/qubes-src/qubes-manager
-$ git remote add abel git@github.com:abeluck/qubes-manager.git
-~~~
-
-You can then proceed to easily develop in your own branches, pull in new
-commits from the dev branches, merge them, and eventually push to your own repo
-on github.
-
-When you are ready to submit your changes to Qubes to be merged, push your
-changes, then create a signed git tag (using `git tag -s`). Finally, send a
-letter to the Qubes listserv describing the changes and including the link to
-your repository. You can also create pull request on github. Don't forget to
-include your public PGP key you use to sign your tags.
-
-### Kernel-specific notes
-
-#### Prepare fresh version of kernel sources, with Qubes-specific patches applied
-
-In qubes-builder/qubes-src/linux-kernel:
-
-~~~
-make prep
-~~~
-
-The resulting tree will be in kernel-\/linux-\:
-
-~~~
-ls -ltrd kernel*/linux*
-~~~
-
-~~~
-drwxr-xr-x 23 user user 4096 Nov 5 09:50 kernel-3.4.18/linux-3.4.18
-drwxr-xr-x 6 user user 4096 Nov 21 20:48 kernel-3.4.18/linux-obj
-~~~
-
-#### Go to the kernel tree and update the version
-
-In qubes-builder/qubes-src/linux-kernel:
-
-~~~
-cd kernel-3.4.18/linux-3.4.18
-~~~
-
-#### Changing the config
-
-In kernel-3.4.18/linux-3.4.18:
-
-~~~
-cp ../../config .config
-make oldconfig
-~~~
-
-Now change the configuration. For example, in kernel-3.4.18/linux-3.4.18:
-
-~~~
-make menuconfig
-~~~
-
-Copy the modified config back into the kernel tree:
-
-~~~
-cp .config ../../../config
-~~~
-
-#### Patching the code
-
-TODO: describe the workflow for patching the code, below are some random notes, not working well
-
-~~~
-ln -s ../../patches.xen
-export QUILT_PATCHES=patches.xen
-export QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
-export QUILT_SERIES=../../series-pvops.conf
-
-quilt new patches.xen/pvops-3.4-0101-usb-xen-pvusb-driver-bugfix.patch
-quilt add drivers/usb/host/Kconfig drivers/usb/host/Makefile \
- drivers/usb/host/xen-usbback/* drivers/usb/host/xen-usbfront.c \
- include/xen/interface/io/usbif.h
-
-*edit something*
-
-quilt refresh
-cd ../..
-vi series.conf
-~~~
-
-#### Building RPMs
-
-TODO: Is this step generic for all subsystems?
-
-Now it is a good moment to make sure you have changed kernel release name in
-rel file. For example, if you change it to '1debug201211116c' the
-resulting RPMs will be named
-'kernel-3.4.18-1debug20121116c.pvops.qubes.x86\_64.rpm'. This will help
-distinguish between different versions of the same package.
-
-You might want to take a moment here to review (git diff, git status), commit
-your changes locally.
-
-To actually build RPMs, in qubes-builder:
-
-~~~
-make linux-kernel
-~~~
-
-RPMs will appear in qubes-src/linux-kernel/pkgs/fc20/x86\_64:
-
-~~~
--rw-rw-r-- 1 user user 42996126 Nov 17 04:08 kernel-3.4.18-1debug20121116c.pvops.qubes.x86_64.rpm
--rw-rw-r-- 1 user user 43001450 Nov 17 05:36 kernel-3.4.18-1debug20121117a.pvops.qubes.x86_64.rpm
--rw-rw-r-- 1 user user 8940138 Nov 17 04:08 kernel-devel-3.4.18-1debug20121116c.pvops.qubes.x86_64.rpm
--rw-rw-r-- 1 user user 8937818 Nov 17 05:36 kernel-devel-3.4.18-1debug20121117a.pvops.qubes.x86_64.rpm
--rw-rw-r-- 1 user user 54490741 Nov 17 04:08 kernel-qubes-vm-3.4.18-1debug20121116c.pvops.qubes.x86_64.rpm
--rw-rw-r-- 1 user user 54502117 Nov 17 05:37 kernel-qubes-vm-3.4.18-1debug20121117a.pvops.qubes.x86_64.rpm
-~~~
-
-### Useful [QubesBuilder](/doc/qubes-builder/) commands
-
-1. `make check` - will check if all the code was committed into repository and
-if all repository are tagged with signed tag.
-2. `make show-vtags` - show version of each component (based on git tags) -
-mostly useful just before building ISO. **Note:** this will not show version
-for components containing changes since last version tag.
-3. `make push` - push change from **all** repositories to git server. You must
-set proper remotes (see above) for all repositories first.
-4. `make prepare-merge` - fetch changes from remote repositories (can be
-specified on commandline via GIT\_SUBDIR or GIT\_REMOTE vars), (optionally)
-verify tags and show the changes. This do not merge the changes - there are
-left for review as FETCH\_HEAD ref. You can merge them using `git merge
-FETCH_HEAD` (in each repo directory). Or `make do-merge` to merge all of them.
-
-## Copying Code to dom0
-
-When developing it is convenient to be able to rapidly test changes. Assuming
-you're developing Qubes on Qubes, you should be working in a special VM for
-Qubes and occasionally you will want to transfer code or RPMs back to dom0 for
-testing.
-
-Here are some handy scripts Marek has shared to facilitate this.
-
-You may also like to run your [test environment on separate
-machine](/doc/test-bench/).
-
-### Syncing dom0 files
-
-TODO: edit this script to be more generic
-
-~~~
-#!/bin/sh
-
-set -x
-set -e
-
-QUBES_PY_DIR=/usr/lib64/python2.6/site-packages/qubes
-QUBES_PY=$QUBES_PY_DIR/qubes.py
-QUBESUTILS_PY=$QUBES_PY_DIR/qubesutils.py
-
-qvm-run -p qubes-devel 'cd qubes-builder/qubes-src/core/dom0; tar c qmemman/qmemman*.py qvm-core/*.py qvm-tools/* misc/vm-template-hvm.conf misc/qubes-start.desktop ../misc/block-snapshot aux-tools ../qrexec' |tar xv
-cp $QUBES_PY qubes.py.bak$$
-cp $QUBESUTILS_PY qubesutils.py.bak$$
-cp /etc/xen/scripts/block-snapshot block-snapshot.bak$$
-sudo cp qvm-core/qubes.py $QUBES_PY
-sudo cp qvm-core/qubesutils.py $QUBESUTILS_PY
-sudo cp qvm-core/guihelpers.py $QUBES_PY_DIR/
-sudo cp qmemman/qmemman*.py $QUBES_PY_DIR/
-sudo cp misc/vm-template-hvm.conf /usr/share/qubes/
-sudo cp misc/qubes-start.desktop /usr/share/qubes/
-sudo cp misc/block-snapshot /etc/xen/scripts/
-sudo cp aux-tools/qubes-dom0-updates.cron /etc/cron.daily/
-# FIXME(Abel Luck): I hope to
-~~~
-
-### Apply qvm-tools
-
-TODO: make it more generic
-
-~~~
-#!/bin/sh
-
-BAK=qvm-tools.bak$$
-mkdir -p $BAK
-cp -a /usr/bin/qvm-* /usr/bin/qubes-* $BAK/
-sudo cp qvm-tools/qvm-* qvm-tools/qubes-* /usr/bin/
-~~~
-
-### Copy from dom0 to an appvm
-
-~~~
-#/bin/sh
-#
-# usage ./cp-domain
-#
-domain=$1
-file=$2
-fname=`basename $file`
-
-qvm-run $domain 'mkdir /home/user/incoming/dom0 -p'
-cat $file| qvm-run --pass-io $domain "cat > /home/user/incoming/dom0/$fname"
-~~~
-
-## Git connection between VMs
-
-Sometimes it's useful to transfer git commits between VMs. You can use `git
-format-patch` for that and simply copy the files. But you can also setup
-custom qrexec service for it.
-
-Below example assumes that you use `builder-RX` directory in target VM to
-store sources in qubes-builder layout (where `X` is some number). Make sure that
-all the scripts are executable.
-
-Service file (save in `/usr/local/etc/qubes-rpc/local.Git` in target VM):
-
-~~~
-#!/bin/sh
-
-exec 2>/tmp/log2
-
-read service rel repo
-echo "Params: $service $rel $repo" >&2
-# Adjust regexps if needed
-echo "$repo" | grep -q '^[A-Za-z0-9-]\+$' || exit 1
-echo "$rel" | grep -q '^[0-9.]\+$' || exit 1
-path="/home/user/builder-R$rel/qubes-src/$repo"
-if [ "$repo" = "builder" ]; then
- path="/home/user/builder-R$rel"
-fi
-case $service in
- git-receive-pack|git-upload-pack)
- echo "starting $service $path" >&2
- exec $service $path
- ;;
- *)
- echo "Unsupported service: $service" >&2
- ;;
-esac
-~~~
-
-Client script (save in `~/bin/git-qrexec` in source VM):
-
-~~~
-#!/bin/sh
-
-VMNAME=$1
-
-(echo $GIT_EXT_SERVICE $2 $3; exec cat) | qrexec-client-vm $VMNAME local.Git
-~~~
-
-You will also need to setup qrexec policy in dom0 (`/etc/qubes-rpc/policy/local.Git`).
-
-Usage:
-
-~~~
-[user@source core-agent-linux]$ git remote add testbuilder "ext::git-qrexec testbuilder 3 core-agent-linux"
-[user@source core-agent-linux]$ git push testbuilder master
-~~~
-
-You can create `~/bin/add-remote` script to ease adding remotes:
-
-~~~
-#!/bin/sh
-
-[ -n "$1" ] || exit 1
-
-if [ "$1" = "tb" ]; then
- git remote add $1 "ext::git-qrexec testbuilder 3 `basename $PWD`"
- exit $?
-fi
-
-git remote add $1 git@github.com:$1/qubes-`basename $PWD`
-~~~
-
-It should be executed from component top level directory. This script takes one
-argument - remote name. If it is `tb`, then it creates qrexec-based git remote
-to `testbuilder` VM. Otherwise it creates remote pointing at github account of
-the same name. In any case it points at repository matching current directory
-name.
-
-## Sending packages to different VM
-
-Other useful script(s) can be used to setup local package repository hosted in
-some VM. This way you can keep your development VM behind firewall, while
-having an option to expose some yum/apt repository to the local network (to
-have them installed on test machine).
-
-To achieve this goal, a dummy repository can be created, which instead of
-populating metadata locally, will upload the packages to some other VM and
-trigger repository update there (using qrexec). You can use `unstable`
-repository flavor, because there is no release managing rules bundled (unlike
-current and current-testing).
-
-### RPM packages - yum repo
-
-In source VM, grab [linux-yum](https://github.com/QubesOS/qubes-linux-yum) repository (below is assumed you've made it in
-`~/repo-yum-upload` directory) and replace `update_repo.sh` script with:
-
-~~~
-#!/bin/sh
-
-VMNAME=repo-vm
-
-set -e
-qvm-copy-to-vm $VMNAME $1
-# remove only files, leave directory structure
-find -type f -name '*.rpm' -delete
-# trigger repo update
-qrexec-client-vm $VMNAME local.UpdateYum
-~~~
-
-In target VM, setup actual yum repository (also based on [linux-yum](https://github.com/QubesOS/qubes-linux-yum), this time
-without modifications). You will also need to setup some gpg key for signing
-packages (it is possible to force yum to install unsigned packages, but it
-isn't possible for `qubes-dom0-update` tool). Fill `~/.rpmmacros` with
-key description:
-
-~~~
-%_gpg_name Test packages signing key
-~~~
-
-Then setup `local.UpdateYum` qrexec service (`/usr/local/etc/qubes-rpc/local.UpdateYum`):
-
-~~~
-#!/bin/sh
-
-if [ -z "$QREXEC_REMOTE_DOMAIN" ]; then
- exit 1
-fi
-
-real_repository=/home/user/linux-yum
-incoming=/home/user/QubesIncoming/$QREXEC_REMOTE_DOMAIN
-
-find $incoming -name '*.rpm' |xargs rpm -K |grep -iv pgp |cut -f1 -d: |xargs -r setsid -w rpm --addsign 2>&1
-
-rsync -lr --remove-source-files $incoming/ $real_repository
-cd $real_repository
-export SKIP_REPO_CHECK=1
-if [ -d $incoming/r3.1 ]; then
- ./update_repo-unstable.sh r3.1
-fi
-
-if [ -d $incoming/r3.0 ]; then
- ./update_repo-unstable.sh r3.0
-fi
-
-if [ -d $incoming/r2 ]; then
- ./update_repo-unstable.sh r2
-fi
-find $incoming -type d -empty -delete
-exit 0
-~~~
-
-Of course you will also need to setup qrexec policy in dom0
-`/etc/qubes-rpc/policy/local.UpdateYum`.
-
-If you want to access the repository from network, you need to setup HTTP
-server serving it, and configure the system to let other machines actually
-reach this HTTP server. You can use for example using [port
-forwarding](/doc/firewall/#port-forwarding-to-a-qube-from-the-outside-world) or setting up Tor hidden service. Configuration
-details of those services are outside of the scope of this page.
-
-Usage: setup `builder.conf` in source VM to use your dummy-uploader repository:
-
-~~~
-LINUX_REPO_BASEDIR = ../../repo-yum-upload/r3.1
-~~~
-
-Then use `make update-repo-unstable` to upload the packages. You can also
-specify selected components on command line, then build them and upload to the
-repository:
-
-~~~
-make COMPONENTS="core-agent-linux gui-agent-linux linux-utils" qubes update-repo-unstable
-~~~
-
-On the test machine, add yum repository (`/etc/yum.repos.d`) pointing at just
-configured HTTP server. For example:
-
-~~~
-[local-test]
-name=Test
-baseurl=http://local-test.lan/linux-yum/r$releasever/unstable/dom0/fc20
-~~~
-
-Remember to also import gpg public key using `rpm --import`.
-
-### Deb packages - Apt repo
-
-Steps are mostly the same as in the case of yum repo. The only details that differ:
-
-- use [linux-deb](https://github.com/QubesOS/qubes-linux-deb) instead of [linux-yum](https://github.com/QubesOS/qubes-linux-yum) as a base - both in source and target VM
-- use different `update_repo.sh` script in source VM (below)
-- use `local.UpdateApt` qrexec service in target VM (code below)
-- in target VM additionally place `update-local-repo.sh` script in repository dir (code below)
-
-`update_repo.sh` script:
-
-~~~
-#!/bin/sh
-
-set -e
-
-current_release=$1
-VMNAME=repo-vm
-
-qvm-copy-to-vm $VMNAME $1
-find $current_release -type f -name '*.deb' -delete
-rm -f $current_release/vm/db/*
-qrexec-client-vm $VMNAME local.UpdateApt
-~~~
-
-`local.UpdateApt` service code (`/usr/local/etc/qubes-rpc/local.UpdateApt` in repo-serving VM):
-
-~~~
-#!/bin/sh
-
-if [ -z "$QREXEC_REMOTE_DOMAIN" ]; then
- exit 1
-fi
-
-incoming=/home/user/QubesIncoming/$QREXEC_REMOTE_DOMAIN
-
-rsync -lr --remove-source-files $incoming/ /home/user/linux-deb/
-cd /home/user/linux-deb
-export SKIP_REPO_CHECK=1
-if [ -d $incoming/r3.1 ]; then
- for dist in `ls r3.1/vm/dists`; do
- ./update-local-repo.sh r3.1/vm $dist
- done
-fi
-
-if [ -d $incoming/r3.0 ]; then
- for dist in `ls r3.0/vm/dists`; do
- ./update-local-repo.sh r3.0/vm $dist
- done
-fi
-
-if [ -d $incoming/r2 ]; then
- for dist in `ls r2/vm/dists`; do
- ./update-local-repo.sh r2/vm $dist
- done
-fi
-find $incoming -type d -empty -delete
-exit 0
-~~~
-
-`update-local-repo.sh`:
-
-~~~
-#!/bin/sh
-
-set -e
-
-# Set this to your local repository signing key
-SIGN_KEY=01ABCDEF
-
-[ -z "$1" ] && { echo "Usage: $0 "; exit 1; }
-
-REPO_DIR=$1
-DIST=$2
-
-if [ "$DIST" = "wheezy-unstable" ]; then
- DIST_TAG=deb7
-elif [ "$DIST" = "jessie-unstable" ]; then
- DIST_TAG=deb8
-elif [ "$DIST" = "stretch-unstable" ]; then
- DIST_TAG=deb9
-fi
-
-pushd $REPO_DIR
-mkdir -p dists/$DIST/main/binary-amd64
-dpkg-scanpackages --multiversion --arch "*$DIST_TAG*" . > dists/$DIST/main/binary-amd64/Packages
-gzip -9c dists/$DIST/main/binary-amd64/Packages > dists/$DIST/main/binary-amd64/Packages.gz
-cat > dists/$DIST/Release <> dists/$DIST/Release
-
-rm -f $DIST/Release.gpg
-rm -f $DIST/InRelease
-gpg -abs -u "$SIGN_KEY" \
- < dists/$DIST/Release > dists/$DIST/Release.gpg
-gpg -a -s --clearsign -u "$SIGN_KEY" \
- < dists/$DIST/Release > dists/$DIST/InRelease
-popd
-
-if [ `id -u` -eq 0 ]; then
- chown -R --reference=$REPO_DIR $REPO_DIR
-fi
-~~~
-
-Usage: add this line to `/etc/apt/sources.list` on test machine (adjust host and path):
-
-~~~
-deb http://local-test.lan/linux-deb/r3.1 jessie-unstable main
-~~~
+---
\ No newline at end of file
diff --git a/developer/building/qubes-builder-details.md b/developer/building/qubes-builder-details.md
index f3582284b..73e87729e 100644
--- a/developer/building/qubes-builder-details.md
+++ b/developer/building/qubes-builder-details.md
@@ -6,48 +6,7 @@ redirect_from:
- /en/doc/qubes-builder-details/
- /doc/QubesBuilderDetails/
- /wiki/QubesBuilderDetails/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/building/qubes-builder-details.html
ref: 65
title: Qubes builder details
----
-
-Components Makefile.builder file
---------------------------------
-
-[QubesBuilder](/doc/qubes-builder/) expects that each component have *Makefile.builder* file in its root directory. This file specifies what should be done to build the package. As name suggests, this is normal makefile, which is included by builder as its configuration. Its main purpose is to set some variables. Generally all available variables/settings are described as comments at the beginning of Makefile.\* in [QubesBuilder](/doc/qubes-builder/).
-
-Variables for Linux build:
-
-- `RPM_SPEC_FILES` List (space separated) of spec files for RPM package build. Path should be relative to component root directory. [QubesBuilder](/doc/qubes-builder/) will install all BuildRequires (in chroot environment) before the build. In most Qubes components all spec files are kept in *rpm\_spec* directory. This is mainly used for Fedora packages build.
-- `ARCH_BUILD_DIRS` List (space separated) of directories with PKGBUILD files for Archlinux package build. Similar to RPM build, [QubesBuilder](/doc/qubes-builder/) will install all makedepends, then build the package.
-
-Most components uses *archlinux* directory for this purpose, so its good to keep this style.
-
-Variables for Windows build:
-
-- `WIN_COMPILER` Choose which compiler should be used for this component, thus which build scripts. Currently two options available:
- - `WDK` - Windows Driver Kit (default). Command used to build: *build -cZg*.
- - `mingw` - MinGW (Windows gcc port). Command used to build: *make all*
-- `WIN_SOURCE_SUBDIRS` List of directories in which above command should be run. In most cases it will be only one entry: current directory (*.*).
-- `WIN_PREBUILD_CMD` Command to run before build, mostly useful for WDK build (in mingw case, you can use makefile for this purpose). Can be used to set some variables, preprocess some files etc.
-- `WIN_SIGN_CMD` Command used to sign resulting binaries. Note that default value is *sign.bat*. If you don't want to sign binaries, specify some placeholder here (eg. *true*). Check existing components (eg. vmm-xen-windows-pvdrivers) for example scripts. This command will be run with certain environment variables:
- - `CERT_FILENAME` Path to key file (pfx format)
- - `CERT_PASSWORD` Key password
- - `CERT_PUBLIC_FILENAME` Certificate path in the case of self-signed cert
- - `CERT_CROSS_CERT_FILENAME` Certificate path in the case of correct autheticode cert
- - `SIGNTOOL` Path to signtool
-- `WIN_PACKAGE_CMD` Command used to produce installation package (msi or msm). Default value is *wix.bat*, similar to above - use *true* if you don't want this command.
-- `WIN_OUTPUT_HEADERS` Directory (relative to `WIN_SOURCE_SUBDIRS` element) with public headers of the package - for use in other components.
-- `WIN_OUTPUT_LIBS` Directory (relative to `WIN_SOURCE_SUBDIRS` element) with libraries (both DLL and implib) of the package - for use in other components. Note that [QubesBuilder](/doc/qubes-builder/) will copy files specified as *\$(WIN\_OUTPUT\_LIBS)/\*/\** to match WDK directory layout (*\/\/\*), so you in mingw build you need to place libraries in some additional subdirectory.
-- `WIN_BUILD_DEPS` List of components required to build this one. [QubesBuilder](/doc/qubes-builder/) will copy files specified with `WIN_OUTPUT_HEADERS` and `WIN_OUTPUT_LIBS` of those components to some directory and provide its path with `QUBES_INCLUDES` and `QUBES_LIBS` variables. Use those variables in your build scripts (*sources* or *Makefile* - depending on selected compiler). You can assume that the variables are always set and directories always exists, even if empty.
-
-builder.conf settings
----------------------
-
-Most settings are documented in *builder.conf.default* file, which can be used as template the actual configuration.
-
-**TODO**
-
-Notes
------
-
-* For a list of custom TemplateVMs available in QubesBuilder look at [Supported Versions page](/doc/supported-releases/).
+---
\ No newline at end of file
diff --git a/developer/building/qubes-builder.md b/developer/building/qubes-builder.md
index 572b98667..8bc47b3c2 100644
--- a/developer/building/qubes-builder.md
+++ b/developer/building/qubes-builder.md
@@ -6,206 +6,7 @@ redirect_from:
- /en/doc/qubes-builder/
- /doc/QubesBuilder/
- /wiki/QubesBuilder/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/building/qubes-builder.html
ref: 64
title: Qubes builder
----
-
-**Note: See [ISO building instructions](/doc/qubes-iso-building/) for a streamlined overview on how to use the build system.**
-
-
-We have a fully automated build system for Qubes, that downloads, builds and
-packages all the Qubes components, and finally should spit out a ready-to-use
-installation ISO, all in a [secure](/news/2016/05/30/build-security/) way.
-
-In order to use it, you should use an rpm-based distro, like Fedora :), and should ensure the following packages are installed:
-
-- sudo
-- gnupg
-- git
-- createrepo
-- rpm-build
-- make
-- wget
-- rpmdevtools
-- python3-sh
-- dialog
-- rpm-sign
-- dpkg-dev
-- debootstrap
-- python3-pyyaml
-- devscripts
-- perl-Digest-MD5
-- perl-Digest-SHA
-
-Usually you can install those packages by just issuing:
-
-```shell
-sudo dnf install gnupg git createrepo rpm-build make wget rpmdevtools python3-sh dialog rpm-sign dpkg-dev debootstrap python3-pyyaml devscripts perl-Digest-MD5 perl-Digest-SHA
-```
-
-The build system creates build environments in chroots and so no other packages are needed on the host.
-All files created by the build system are contained within the qubes-builder directory.
-The full build requires some 25GB of free space, so keep that in mind when deciding where to place this directory.
-
-The build system is configured via builder.conf file.
-You can use the setup.sh script to create and modify this file.
-Alternatively, you can copy the provided default builder.conf, and modify it as needed, e.g.:
-
-```shell
-cp example-configs/qubes-os-master.conf builder.conf
-# edit the builder.conf file and set the following variables:
-NO_SIGN=1
-```
-
-One additional useful requirement is that 'sudo root' must work without any prompt, which is default on most distros (e.g. 'sudo bash' brings you the root shell without asking for any password).
-This is important as the builder needs to switch to root and then back to user several times during the build process.
-
-Additionally, if building with signing enabled (NO\_SIGN is not set), you must adjust `\~/.rpmmacros` file so that it points to the GPG key used for package signing, e.g.:
-
-```bash
-%_signature gpg
-%_gpg_path /home/user/.gnupg
-%_gpg_name AC1BF9B3 # <-- Key ID used for signing
-```
-
-It is also recommended that you use an empty passphrase for the private key used for signing.
-Contrary to a popular belief, this doesn't affect your key or sources security -- if somebody compromised your system, then the game is over anyway, whether you have used an additional passphrase for the key or not.
-
-So, to build Qubes you would do:
-
-```shell
-# Import the Qubes master key
-gpg --recv-keys 0xDDFA1A3E36879494
-
-# Verify its fingerprint, set as 'trusted'.
-# This is described here:
-# https://www.qubes-os.org/doc/VerifyingSignatures
-
-wget https://keys.qubes-os.org/keys/qubes-developers-keys.asc
-gpg --import qubes-developers-keys.asc
-
-git clone https://github.com/QubesOS/qubes-builder.git qubes-builder
-cd qubes-builder
-
-# Verify its integrity:
-git tag -v `git describe`
-
-cp example-configs/qubes-os-master.conf builder.conf
-# edit the builder.conf file and set the following variables:
-# NO_SIGN="1"
-
-# Download all components:
-
-make get-sources
-
-# And now to build all Qubes RPMs (this will take a few hours):
-
-make qubes
-
-# ... and then to build the ISO
-
-make iso
-```
-
-And this should produce a shiny new ISO.
-
-You can also build selected component separately. Eg. to compile only gui virtualization agent/daemon:
-
-```shell
-make gui-daemon
-```
-
-You can get a full list from make help.
-
-## Making customized build
-
-### Manual source modification
-
-You can also modify sources somehow if you wish.
-Here are some basic steps:
-
-1. Download qubes-builder as described above (if you want to use marmarek's branches, you should also download qubes-builder from his repo - replace 'QubesOS' with 'marmarek' in above git clone command)
-2. Edit builder.conf (still the same as above), some useful additions:
- - You can also set GIT\_PREFIX="marmarek/qubes-" to use marmarek's repo instead of "mainstream" - it contains newer (but less tested) versions
-3. Download unmodified sources
-
- ```shell
- make get-sources
- ```
-
-4. **Make your modifications here**
-
-5. Build the Qubes
- `make qubes` actually is just meta target which builds all required
- components in correct order. The list of components is configured in
- builder.conf. You can also check the current value at the end of `make
- help`, or using `make build-info`.
-
-6. `get-sources` is already done, so continue with the next one. You can skip `sign-all` if you've disabled signing
-
- ```shell
- make vmm-xen core-admin linux-kernel gui-daemon template desktop-linux-kde installer-qubes-os manager linux-dom0-updates
- ```
-
-7. build iso installation image
-
- ```shell
- make iso
- ```
-
-### Use pre-built Qubes packages
-
-For building just a few selected packages, it's very useful to download pre-built qubes-specific dependencies from `{yum,deb}.qubes-os.org`.
-This is especially true for `gcc`, which takes several hours to build.
-
-Before creating the `chroot`, add this to your `builder.conf`:
-
-```
-USE_QUBES_REPO_VERSION = $(RELEASE)
-```
-
-It will add the 'current' Qubes repository to your `chroot` environment.
-Next, specify which components (`gcc`, for example) you want to download instead of compiling:
-
-```
-COMPONENTS := $(filter-out gcc,$(COMPONENTS))
-```
-
-Alternatively, edit the actual COMPONENTS list which is defined in the included version-dependent config from example-configs (see series of include directives near the beginning of `builder.conf`).
-This way, you can build only the packages in which you are interested.
-
-If you also want to use the 'current-testing' repository, add this to your configuration:
-
-```
-USE_QUBES_REPO_TESTING = 1
-```
-
-In the case of an existing `chroot`, for mock-enabled builds, this works immediately because `chroot` is constructed each time separately.
-For legacy builds, it will not add the necessary configuration into the build environment unless a specific builder change or configuration would force rebuilding chroot.
-
-Also, once enabled, disabling this setting will not disable repositories in relevant chroots.
-And even if it did, there could be some leftover packages installed from those repos (which may or may not be desirable).
-
-**Note**
-If you are building Ubuntu templates, you cannot use this option.
-This is because Qubes does not provide official packages for Ubuntu templates.
-
-## Code verification keys management
-
-[QubesBuilder](/doc/qubes-builder/) by default verifies signed tags on every downloaded code.
-Public keys used for that are stored in `keyrings/git`.
-By default Qubes developers' keys are imported automatically, but if you need some additional keys (for example your own), you can add them using:
-
-```shell
-GNUPGHOME=$PWD/keyrings/git gpg --import /path/to/key.asc
-GNUPGHOME=$PWD/keyrings/git gpg --edit-key ID_OF_JUST_IMPORTED_KEY
-# here use "trust" command to set key fully or ultimately trusted - only those keys are accepted by QubesBuilder
-```
-
-All Qubes developers' keys are signed by the Qubes Master Signing Key (which is set as ultimately trusted key), so are trusted automatically.
-
-If you are the owner of Master key and want to revoke such signature, use the `revsig` gpg key edit command and update the key in qubes-developers-keys.asc - now the key will be no longer trusted (unless manually set as such).
-
-## Further information
-
-For advanced [QubesBuilder](/doc/qubes-builder/) use, and preparing sources, take a look at [QubesBuilderDetails](/doc/qubes-builder-details/) page, or [QubesBuilder's doc directory](https://github.com/marmarek/qubes-builder/tree/master/doc).
+---
\ No newline at end of file
diff --git a/developer/building/qubes-iso-building.md b/developer/building/qubes-iso-building.md
index 1aad3a2a8..8a7b8bc59 100644
--- a/developer/building/qubes-iso-building.md
+++ b/developer/building/qubes-iso-building.md
@@ -8,193 +8,7 @@ redirect_from:
- /en/doc/qubes-iso-building/
- /doc/QubesR3Building/
- /wiki/QubesR3Building/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/building/qubes-iso-building.html
ref: 63
title: Qubes ISO building
----
-
-Build Environment
------------------
-
-Fedora 32 has been successfully used to build Qubes R4.0 with the below steps.
-Other rpm-based operating systems may also work.
-Travis-CI uses Ubuntu 18.04 to perform test builds, except it can not test the `./setup` script.
-
-In `dom0`, install the Fedora 32 template if you don't already have it.
-
-~~~
-sudo qubes-dom0-update qubes-template-fedora-32
-~~~
-
-Create a standalone AppVM from the Fedora 32 template.
-Set private storage to at least 60 GB if you will be building only the default templates; 100 GB or more if you plan on additional.
-It's not required, but if you allocate additional CPU cores, the build process can utilize them at some steps such as the kernel build.
-Likewise, more memory (up to 16 GB) can help.
-Last, you may want to disable memory balancing, but keep in mind the impact on your other qubes.
-
-Once you've built the development AppVM, open a Terminal window to it and install the necessary dependencies (see [QubesBuilder](/doc/qubes-builder/) for more info):
-
-~~~
-$ sudo dnf install git createrepo rpm-build rpm-sign make python3-sh rpmdevtools rpm-sign dialog perl-open python3-pyyaml perl-Digest-MD5 perl-Digest-SHA
-~~~
-
-Get the necessary keys to verify the sources (run these and other commands below as a regular user, not root):
-
-~~~
-wget https://keys.qubes-os.org/keys/qubes-master-signing-key.asc
-gpg --import qubes-master-signing-key.asc
-gpg --edit-key 36879494
-fpr
-# Verify fingerprint! See Note below!
-# Once verified, set trust to *ultimate*
-# (Typical sequence is trust, 5, q)
-wget https://keys.qubes-os.org/keys/qubes-developers-keys.asc
-gpg --import qubes-developers-keys.asc
-~~~
-
-**Note** In the above process, we do *not* rely on the security of our server (keys.qubes-os.org) nor the connection (ssl, cert) -- we only rely on you getting the Qubes Master Signing Key fingerprint *somehow* and ensuring they match!
-See [verifying signatures](/security/verifying-signatures/#how-to-import-and-authenticate-the-qubes-master-signing-key) for verification sources.
-
-Now let's bootstrap the builder. Unfortunately, the builder cannot verify itself (the classic Chicken and Egg problem), so we need to verify the signature manually:
-
-~~~
-git clone https://github.com/QubesOS/qubes-builder.git
-cd qubes-builder
-git tag -v `git describe`
-~~~
-
-**Note** It's very important to check if the verification message contains "Good signature from ..." and does not contain "WARNING: This key is not certified with a trusted signature!".
-
-Assuming the verification went fine, we're good to go with all the rest without ever thinking more about verifying digital signatures on all the rest of the components, apart from an additional step if doing a non-scripted build.
-The builder will do that for us for each component, every time we build, even for all auxiliary files (e.g. Xen or Linux kernel sources).
-
-Build using setup script
------------------
-
-Let's configure the builder first (see [procedure](/doc/qubes-iso-building/#build-using-manual-steps) at bottom if you would prefer to manually configure):
-
-~~~
-cd ~/qubes-builder
-./setup
-# Select Yes to add Qubes Master Signing Key
-# Select Yes to add Qubes OS Signing Key
-# Select 4.0 for version
-# Stable
-# Select Yes for fast Git cloning
-# Select Current (if you want the option to use pre-built packages)
-# Select No (we want a full build)
-# Select fc30 and buster (for the currently shipping templates)
-# Select builder-rpm, builder-debian, template-whonix, mgmt-salt
-# Select Yes to add adrelanos's third party key
-# Select Yes (to download)
-~~~
-
-Once it completes downloading, re-run `setup` to add the Whonix templates:
-
-~~~
-./setup
-# Choose the same options as above, except at templates select:
-# fc30, buster, whonix-gateway-15, whonix-workstation-15
-~~~
-
-Continue the build process with:
-
-~~~
-make install-deps
-make get-sources
-~~~
-
-When building the Whonix templates, you will often need to add/update the `WHONIX_TBB_VERSION` variable in `builder.conf` at this stage to specify the currently shipping Tor Browser version.
-See the related note under [Extra Whonix Build Options](/doc/building-whonix-template/).
-
-You may also want to add `COMPONENTS := $(filter-out gcc,$(COMPONENTS))` to bypass a multiple hour compile step.
-See [QubesBuilder](/doc/qubes-builder/#use-pre-built-qubes-packages) for more detail.
-
-Finally, if you are making a test build, use:
-
-~~~
-make qubes
-make iso
-~~~
-
-Or for a fully signed build (this requires setting `SIGN_KEY` in `builder.conf`):
-
-~~~
-make qubes
-make sign-all
-make iso
-~~~
-
-Enjoy your new ISO!
-
-Build using manual steps
------------------
-
-Instead of using `./setup`, you can manually configure the build.
-The script takes care of a lot of the keyring preparation for us, so we first need to set that up.
-
-If you will be building Whonix templates:
-
-~~~
-cd ~
-gpg --keyserver pgp.mit.edu --recv-keys 916B8D99C38EAF5E8ADC7A2A8D66066A2EEACCDA
-gpg --fingerprint 916B8D99C38EAF5E8ADC7A2A8D66066A2EEACCDA
-~~~
-
-**Note:** It's very important to check the fingerprint displayed against multiple sources such as the [Whonix web site](https://www.whonix.org/wiki/Whonix_Signing_Key), etc.
-It should look something like this:
-
-~~~
-pub 4096R/2EEACCDA 2014-01-16 [expires: 2021-04-17]
- Key fingerprint = 916B 8D99 C38E AF5E 8ADC 7A2A 8D66 066A 2EEA CCDA
-uid Patrick Schleizer
-sub 4096R/CE998547 2014-01-16 [expires: 2021-04-17]
-sub 4096R/119B3FD6 2014-01-16 [expires: 2021-04-17]
-sub 4096R/77BB3C48 2014-01-16 [expires: 2021-04-17]
-~~~
-
-Next, prepare the Git keyring directory and copy them in:
-
-~~~
-export GNUPGHOME=~/qubes-builder/keyrings/git
-mkdir --parents "$GNUPGHOME"
-cp ~/.gnupg/pubring.gpg "$GNUPGHOME"
-cp ~/.gnupg/trustdb.gpg "$GNUPGHOME"
-chmod --recursive 700 "$GNUPGHOME"
-~~~
-
-Copy one of the example configurations:
-
-~~~
-cd ~/qubes-builder
-cp example-configs/qubes-os-master.conf builder.conf
-~~~
-
-Edit `builder.conf`, referring to `doc/Configuration.md` for a description of all available options.
-
-Continue the build process with:
-
-~~~
-make install-deps
-make get-sources
-unset GNUPGHOME
-~~~
-
-When building the Whonix templates, you will often need to add/update the `WHONIX_TBB_VERSION` variable at this stage to specify the currently shipping Tor Browser version.
-See the related note under [Extra Whonix Build Options](/doc/building-whonix-template/).
-
-Finally, if you are making a test build, use:
-
-~~~
-make qubes
-make iso
-~~~
-
-Or for a fully signed build (this requires setting `SIGN_KEY` in `builder.conf`):
-
-~~~
-make qubes
-make sign-all
-make iso
-~~~
-
-Enjoy your new ISO!
+---
\ No newline at end of file
diff --git a/developer/building/qubes-template-configs.md b/developer/building/qubes-template-configs.md
index 71139116d..b6f815def 100644
--- a/developer/building/qubes-template-configs.md
+++ b/developer/building/qubes-template-configs.md
@@ -5,4 +5,4 @@ permalink: /doc/qubes-template-configs/
redirect_to: https://github.com/QubesOS/qubes-template-configs
ref: 248
title: Qubes template configs
----
+---
\ No newline at end of file
diff --git a/developer/code/code-signing.md b/developer/code/code-signing.md
index d22c3cf85..fcae34de4 100644
--- a/developer/code/code-signing.md
+++ b/developer/code/code-signing.md
@@ -2,199 +2,7 @@
lang: en
layout: doc
permalink: /doc/code-signing/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/code/code-signing.html
ref: 51
title: Code signing
----
-
-All contributions to the Qubes OS [source code](/doc/source-code/) must be cryptographically signed by the author's PGP key.
-
-## Generating a Key
-
-(Note: If you already have a PGP key, you may skip this step.)
-
-Alex Cabal has written an excellent [guide](https://alexcabal.com/creating-the-perfect-gpg-keypair/) on creating a PGP keypair.
-Below, we reproduce just the minimum steps in generating a keypair using GnuPG.
-Please read Cabal's full guide for further important details.
-
-~~~
-$ gpg --gen-key
-gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law.
-
-gpg: directory '/home/user/.gnupg' created
-gpg: keybox '/home/user/.gnupg/pubring.kbx' created
-Note: Use "gpg --full-generate-key" for a full featured key generation dialog.
-
-GnuPG needs to construct a user ID to identify your key.
-
-Real name: Bilbo Baggins
-Email address: bilbo@shire.org
-You selected this USER-ID:
- "Bilbo Baggins "
-
-Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
-We need to generate a lot of random bytes. It is a good idea to perform
-some other action (type on the keyboard, move the mouse, utilize the
-disks) during the prime generation; this gives the random number
-generator a better chance to gain enough entropy.
-
-
-
-We need to generate a lot of random bytes. It is a good idea to perform
-some other action (type on the keyboard, move the mouse, utilize the
-disks) during the prime generation; this gives the random number
-generator a better chance to gain enough entropy.
-gpg: /home/user/.gnupg/trustdb.gpg: trustdb created
-gpg: key 6E2F4E7AF50A5827 marked as ultimately trusted
-gpg: directory '/home/user/.gnupg/openpgp-revocs.d' created
-gpg: revocation certificate stored as '/home/user/.gnupg/openpgp-revocs.d/87975838063F97A968D503266E2F4E7AF50A5827.rev'
-public and secret key created and signed.
-
-pub rsa3072 2021-12-30 [SC] [expires: 2023-12-30]
- 87975838063F97A968D503266E2F4E7AF50A5827
-uid Bilbo Baggins
-sub rsa3072 2021-12-30 [E] [expires: 2023-12-30]
-~~~
-
-## Upload the Key
-
-For others to find the public key, please upload it to a server.
-
-Currently, [these](https://github.com/marmarek/signature-checker/blob/master/check-git-signature#L133-L135) are the recognized servers.
-
-In the example below, we will use `keyserver.ubuntu.com`.
-
-Replace 6E2F4E7AF50A5827 with your key ID, which is the last 8 hex digits of the long number in the second line of the output above:
-```
-pub rsa3072 2021-12-30 [SC] [expires: 2023-12-30]
- 87975838063F97A968D503266E2F4E7AF50A5827
-```
-
-```shell_session
-$ gpg --send-keys --keyserver hkps://keyserver.ubuntu.com 6E2F4E7AF50A5827
-gpg: sending key 6E2F4E7AF50A5827 to hkps://keyserver.ubuntu.com
-```
-
-```
-$ gpg --send-keys --keyserver hkps://keyserver.ubuntu.com 6E2F4E7AF50A5827
-gpg: sending key 6E2F4E7AF50A5827 to hkps://keyserver.ubuntu.com
-```
-
-## Using PGP with Git
-
-If you're submitting a patch via GitHub (or a similar Git server), please sign
-your Git commits.
-
-1. Set up Git to use your key:
-
- ~~~
- git config --global user.signingkey
- ~~~
-
-2. Set up Git to sign your commits with your key:
-
- ~~~
- git config --global commit.gpgsign true
- ~~~
-
- Alternatively, manually specify when a commit is to be signed:
-
- ~~~
- git commit -S
- ~~~
-
-3. (Optional) Create signed tags.
- Signed commits are totally sufficient to contribute to Qubes OS.
- However, if you have commits which are not signed and you do not want to change them,
- you can create a signed tag for the commit and push it before the check.
-
- This is useful for example, if you have a commit back in the git history which
- you like to sign now without rewriting the history.
-
- ~~~
- git tag -s -m ""
- ~~~
-
- You can also create an alias to make this easier.
- Edit your `~/.gitconfig` file.
- In the `[alias]` section, add `stag` to create signed tags and `spush` to create signed tags and push them.
-
- ~~~
- [alias]
- stag = "!bash -c 'id=\"`git rev-parse --verify HEAD`\"; tag_name="signed_tag_for_${id:0:8}"; git tag -s "$tag_name" -m \"Tag for commit $id\"; echo \"$tag_name\"'"
- spush = "!bash -c 'git push origin `git stag`'"
- ~~~
-
- You may also find it convenient to have an alias for verifying the tag on the
- latest commit:
-
- ~~~
- vtag = !git tag -v `git describe`
- ~~~
-
-## GitHub Signature Verification (optional)
-
-GitHub shows a green `Verified` label indicating that the GPG signature could be
-verified using any of the contributor’s GPG keys uploaded to GitHub. You can
-upload your public key on GitHub by adding your public GPG key on the [New GPG
-key](https://github.com/settings/gpg/new) under the [SSH GPG keys page](https://github.com/settings/keys).
-
-## Code Signature Checks
-
-The [signature-checker](https://github.com/marmarek/signature-checker) checks if code contributions are signed.
-Although GitHub adds a little green `Verified` button next to the commit, the [signature-checker](https://github.com/marmarek/signature-checker) uses this algorithm to check if a commit is correctly signed:
-
-1. Is the commit signed?
- If the commit is not signed, you can see the message
- > policy/qubesos/code-signing — No signature found
-2. If the commit is signed, the key is downloaded from a GPG key server.
- If you can see the following error message, please check if you have uploaded the key to a key server.
- > policy/qubesos/code-signing — Unable to verify (no valid key found)
-
-### No Signature Found
-
-> policy/qubesos/code-signing — No signature found
-
-In this case, you have several options to sign the commit:
-
-1. Amend the commit and replace it with a signed commit.
- You can use this command to create a new signed commit:
-
- ```
- git commit --amend -S
- ```
-
- This also rewrites the commit so you need to push it forcefully:
-
- ```
- git push -f
- ```
-
-2. Create a signed tag for the unsigned commit.
- If the commit is back in history and you do not want to change it,
- you can create a signed tag for this commit and push the signature.
- You can use the alias from above:
-
- ```
- git checkout
- git spush
- ```
-
- Now, the signature checker needs to re-check the signature.
- Please comment on the pull request that you would like to have the signatures checked again.
-
-### Unable To Verify
-
-> policy/qubesos/code-signing — Unable to verify (no valid key found)
-
-This means that the [signature-checker](https://github.com/marmarek/signature-checker) has found a signature for the commit
-but is not able to verify it using the any key available.
-This might be that you forgot to upload the key to a key server.
-Please upload it.
-
-## Using PGP with Email
-
-If you're submitting a patch by emailing the [developer mailing list](/support/#qubes-devel), simply sign your email with your PGP key.
-One good way to do this is with a program like [Enigmail](https://www.enigmail.net/).
-Enigmail is a security addon for the Mozilla Thunderbird email client that allows you to easily digitally encrypt and sign your emails.
+---
\ No newline at end of file
diff --git a/developer/code/coding-style.md b/developer/code/coding-style.md
index 5bc1dec59..a323d8a7d 100644
--- a/developer/code/coding-style.md
+++ b/developer/code/coding-style.md
@@ -7,179 +7,7 @@ redirect_from:
- /doc/CodingStyle/
- /wiki/CodingStyle/
- /trac/wiki/CodingStyle/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/code/coding-style.html
ref: 53
title: Coding style
----
-
-Rationale
----------
-
-Maintaining proper coding style is very important for any large software project, such as Qubes. Here's why:
-
-- It eases maintenance tasks, such as adding new functionality or generalizing code later,
-- It allows others (as well as the future you!) to easily understand fragments of code and what they were supposed to do, and thus makes it easier to later extend them with newer functionality or bug fixes,
-- It allows others to easily review the code and catch various bugs,
-- It provides for an aesthetically pleasing experience when one reads the code...
-
-Often, developers, usually smart ones, undersell the value of proper coding style, thinking that it's much more important how their code works. These developers expect that if their code solves some problem using a nice and neat trick, then that's all that is really required. Such thinking shows, however, immaturity and is a signal that the developer, no matter how bright and smart, might not be a good fit for larger projects. Writing a clever exploit for a Black Hat show is one thing - writing useful software supposed to be used and maintained for years is quite a different story. If you want to show off what a smart programmer you are, then you should become a researcher and write exploits. If, on the other hand, you want to be part of a team that makes real, useful software, you should ensure your coding style is impeccable. At Qubes project, we often took shortcuts and wrote nasty code, and this has always back fired at us, sometime months, sometime years later, the net result being we had to spend time fixing code, rather than implementing new functionality.
-
-And here's a [link to the real case](https://groups.google.com/forum/#!msg/qubes-devel/XgTo6L8-5XA/JLOadvBqnqMJ) (one Qubes Security Bulletin) demonstrating how the lackadaisical coding style lead to a real security bug. Never assume you're smart enough to disregard clean and rigorous coding!
-
-General typographic conventions
--------------------------------
-
-- **Use space-expanded tabs that equal 4 spaces.** Yes, we know, there are many arguments for using "real" tabs instead of space-expanded tabs, but we need to pick one convention to make the project consistent. One argument for using space-expanded tabs is that this way the programmer is in control of how the code will look like, despite how other users have configured their editors to visualize the tabs (of course, we assume any sane person uses a fixed-width font for viewing the source code). If it makes you feel any better, assume this is just an arbitrary choice made to enforce a unified style.
-
-- **Maintain max. line length of 80 characters**. Even though today's monitors often are very wide and it's often not a problem to have 120 characters displayed in an editor, maintaining shorter line lengths improves readability. It also allows others to have two parallel windows open, side by side, each with different parts of the source code.
-
-- **Naming conventions for any OS *other than Windows***:
- - `ClassName`
- - `some_variable`, `some_function`, `some_argument`
-
-- **Naming convention *for Windows OS*** -- exceptionally to preserve Windows conventions please use the following:
- - `ClassName`, `FunctionName`
- - `pszArgumentOne`, `hPipe` -- use Hungarian notation for argument and variables
-
-- **Maintain a decent amount of horizontal spacing**, e.g. add a space after `if` or before `{` in C, and similar in other languages. Whether and where to also use spaces within expressions, such as (x\*2+5) vs. (x \* 2 + 5) is left to the developer's judgment. Do not put spaces immediately after or before the brackets in expressions, so avoid constructs like this: `if ( condition )` and use ones like this: `if (condition)` instead.
-
-- **Use single new lines** ('\\n' aka LF) in any non-Windows source code. On Windows, exceptionally, use the CRLF line endings (--). This will allow the source code to be easily viewable in various Windows-based programs.
-
-- **Use descriptive names for variables and functions**! Really, at a time when most editors have auto-completion features, there is no excuse for using short variable names.
-
-- **Comments should be indented together with the code**, e.g. like this:
-
- ~~~
- for (...) {
- // The following code finds PGP private key matching the given public key in O(1)
- while (key_found) {
- (...)
- }
- }
- ~~~
-
-File naming conventions
------------------------
-
-- All file names written with small letters, use dash to separate words, rather than underscores, e.g. `qubes-dom0-update`. Never use spaces!
-
-**File naming in Linux/Unix-like systems:**
-
-- User commands that operate on particular VMs (also those accessible in VMs): `/usr/bin/qvm-*`
-- User commands that apply to the whole system (Dom0 only): `/usr/bin/qubes-*`
-- Auxiliary executables and scripts in `/usr/libexec/qubes/` (Note: previously we used `/usr/lib/qubes` but decided to change that)
-- Helper, non-executable files in `/usr/share/qubes/`
-- Various config files in `/etc/qubes`
-- Qubes RPC services in `/etc/qubes-rpc`. Qubes RPC Policy definitions (only in Dom0) in `/etc/qubes-rpc/policy/`
-- All VM-related configs, images, and other files in `/var/lib/qubes/`
-- System-wide temporary files which reflect the current state of system in `/var/run/qubes`
-- Logs: either log to the system-wide messages, or to `/var/log/qubes/`
-
-**File naming in Windows systems:**
-
-- All base qubes-related files in `C:\Program Files\Invisible Things Lab\Qubes\` (Exceptionally spaces are allowed here to adhere to Windows naming conventions)
-- Other, third-party files, not Qubes-specific, such as e.g. Xen PV drivers might be in different vendor subdirs, e.g. `C:\Program Files\Xen PV Drivers`
-
-General programming style guidelines
-------------------------------------
-
-- Do not try to impress with your coding kung-fu, do not use tricks to save 2 lines of code, always prefer readability over trickiness!
-- Make sure your code compiles and builds without warnings.
-- Always think first about interfaces (e.g. function arguments, or class methods) and data structures before you start writing the actual code.
-- Use comments to explain non-trivial code fragments, or expected behavior of more complex functions, if it is not clear from their name.
-- Do **not** use comments for code fragments where it is immediately clear what the code does. E.g. avoid constructs like this:
-
- ~~~
- // Return window id
- int get_window_id (...) {
- (...)
- return id;
- }
- ~~~
-
-- Do **not** use comments to disable code fragments. In production code there should really be no commented or disabled code fragments. If you really, really have a good reason to retain some fragment of unused code, use \#if or \#ifdef to disable it, e.g.:
-
- ~~~
- #if 0
- (...) // Some unused code here
- #endif
- ~~~
-
- ... and preferably use some descriptive macro instead of just `0`, e.g.:
-
- ~~~
- #if USE_OLD_WINDOW_TRAVERSING
- (...) // Some unused code here
- #endif
- ~~~
-
- Not sure how to do similar thing in Python... Anyone?
-
-> But generally, there is little excuse to keep old, unused code fragments in the code. One should really use the functionality provided by the source code management system, such as git, instead. E.g. create a special branch for storing the old, unused code -- this way you will always be able to merge this code into upstream in the future.
-
-- Do not hardcode values in the code! The only three numbers that are an exception here and for which it is acceptable to hardcode them are: `0`, `1` and `-1`, and frankly the last two are still controversial...
-
-Source Code management (Git) guidelines
----------------------------------------
-
-- Use git to maintain all code for Qubes project.
-
-- Before you start using git, make sure you understand that git is a decentralized Source Code Management system, and that it doesn't behave like traditional, centralized source code management systems, such as SVN. Here's a good [introductory book on git](http://git-scm.com/book). Read it.
-
-- Qubes code is divided into many git repositories. There are several reasons for that:
- - This creates natural boundaries between different code blocks, enforcing proper interfaces, and easing independent development to be conducted on various code parts at the same time, without the fear of running into conflicts.
- - By maintaining relatively small git repositories, it is easy for new developers to understand the code and contribute new patches, without the need to understand all the other code.
- - Code repositories represent also licensing boundaries. So, e.g. because `core-agent-linux` and `core-agent-windows` are maintained in two different repositories, it is possible to have the latter under a proprietary, non-GPL license, while keeping the former fully open source.
- - We have drastically changed the layout and naming of the code repositories shortly after Qubes OS R2 Beta 2 release. For details on the current code layout, please read [this article](https://blog.invisiblethings.org/2013/03/21/introducing-qubes-odyssey-framework.html).
-
-Commit message guidelines
--------------------------
-
-Please attempt to follow these conventions when writing your Git commit messages:
-
-- Separate the subject line from the body with a blank line.
-- Limit the subject line to approximately 50 characters.
-- Capitalize the subject line.
-- Do not end the subject line with a period.
-- Use the imperative mood in the subject line.
-- Wrap the body at 72 characters.
-- Use the body to explain *what* and *why* rather than *how*.
-
-For details, examples, and the rationale behind each of these conventions, please see [this blog post](https://chris.beams.io/posts/git-commit/), which is the source of this list.
-
-Security coding guidelines
---------------------------
-
-- As a general rule: **untrusted input** is our \#1 enemy!
-- Any input that comes from untrusted, or less trusted, or just differently-trusted, entity should always be considered as malicious and should always be sanitized and verified. So, if your software runs in Dom0 and processes some input from any of the VMs, this input should be considered to be malicious. Even if your software runs in a VM, and processes input from some other VM, you should also assume that the input is malicious and verify it.
-- Use `untrusted_` prefix for all variables that hold values read from untrusted party and which have not yet been verified to be decent, e.g.:
-
- ~~~
- read_struct(untrusted_conf);
- /* sanitize start */
- if (untrusted_conf.width > MAX_WINDOW_WIDTH)
- untrusted_conf.width = MAX_WINDOW_WIDTH;
- if (untrusted_conf.height > MAX_WINDOW_HEIGHT)
- untrusted_conf.height = MAX_WINDOW_HEIGHT;
- width = untrusted_conf.width;
- height = untrusted_conf.height;
- ~~~
-
-- Use others variables, without the `untrusted_` prefix to hold the sanitized values, as shown above.
-
-Python-specific guidelines
---------------------------
-
-- Please follow the guidelines [here](http://www.python.org/dev/peps/pep-0008/), unless they were in conflict with what is written on this page.
-
-C and C++ specific guidelines
------------------------------
-
-- Do not place code in `*.h` files.
-- Use `const` whenever possible, e.g. in function arguments passed via pointers.
-- Do not mix procedural and objective code together -- if you write in C++, use classes and objects.
-- Think about classes hierarchy, before starting to implement specific methods.
-
-Bash-specific guidelines
-------------------------
-
-- Avoid writing scripts in bash whenever possible. Use python instead. Bash-scripts are Unix-specific and will not work under Windows VMs, or in Windows admin domain, or Windows gui domain.
+---
\ No newline at end of file
diff --git a/developer/code/license.md b/developer/code/license.md
index f7fe3682e..22bb881ba 100644
--- a/developer/code/license.md
+++ b/developer/code/license.md
@@ -6,18 +6,7 @@ redirect_from:
- /en/doc/license/
- /doc/QubesLicensing/
- /wiki/QubesLicensing/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/code/license.html
ref: 52
title: Software license
----
-
-Qubes OS is a compilation of software packages, each under its own license. The
-compilation is made available under the GNU General Public License version 2
-(GPLv2).
-
-The source code of Qubes OS is contained in repositories under the
-[@QubesOS](https://github.com/QubesOS) account on GitHub. This source code is
-made available under GPLv2, unless there is a `LICENSE` file in the root of the
-containing repository that specifies a different license.
-
-The full text of the GPLv2 license can be found
-[here](https://www.gnu.org/licenses/gpl-2.0.html).
+---
\ No newline at end of file
diff --git a/developer/code/source-code.md b/developer/code/source-code.md
index 85e5cf13a..c344a8f67 100644
--- a/developer/code/source-code.md
+++ b/developer/code/source-code.md
@@ -6,77 +6,7 @@ redirect_from:
- /en/doc/source-code/
- /doc/SourceCode/
- /wiki/SourceCode/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/code/source-code.html
ref: 54
title: Source code
----
-
-All the Qubes code is kept in Git repositories. We have divided the project into
-several components, each of which has its own separate repository, for example:
-
-* `core-admin.git` -- The core Qubes infrastructure, responsible for VM
- management, VM templates, fs sharing, etc.
-* `gui-daemon.git` -- GUI virtualization, Dom0 side.
-* `gui-agent-linux.git` -- GUI virtualization, Linux VM side.
-* `linux-template-builder.git` -- Scripts and other files used to create Qubes
- template images.
-
-All of our repositories are available under the [QubesOS GitHub account](https://github.com/QubesOS/).
-
-To clone a repository:
-
-~~~
-git clone https://github.com/QubesOS/qubes-.git
-~~~
-
-e.g.:
-
-~~~
-git clone https://github.com/QubesOS/qubes-core-admin.git core-admin
-~~~
-
-To build Qubes you do not need to download all these repositories.
-If you use [qubes builder](/doc/QubesBuilder/) you can specify *what* you want to build, and download only the repositories needed to build that target.
-
-If you really do want to clone **all** of the repositories, you can use these commands:
-
-~~~
-curl "https://api.github.com/orgs/QubesOS/repos?page=1&per_page=100" | grep -e 'clone_url*' | cut -d \" -f 4 | xargs -L1 git clone
-curl "https://api.github.com/orgs/QubesOS/repos?page=2&per_page=100" | grep -e 'clone_url*' | cut -d \" -f 4 | xargs -L1 git clone
-~~~
-
-To update (git fetch) **all** of these repositories :
-
-~~~
-find . -mindepth 1 -maxdepth 1 -type d -exec git -C {} fetch --tags --recurse-submodules=on-demand --all \;
-~~~
-
-(Alternatively, you can pull instead of just fetching.)
-
-How to Send Patches
--------------------
-
-If you want to [contribute code](/doc/contributing/#contributing-code) to the project, there are two ways. Whichever
-method you choose, you must [sign your code](/doc/code-signing/) before it can be accepted.
-
-* **Preferred**: Use GitHub's [fork & pull requests](https://guides.github.com/activities/forking/).
-
- Opening a pull request on GitHub greatly eases the code review and tracking
- process. In addition, especially for bigger changes, it's a good idea to send
- a message to the [qubes-devel mailing list](/support/#qubes-devel) in order to notify people who
- do not receive GitHub notifications.
-
-* Send a patch to the [qubes-devel mailing list](/support/#qubes-devel) (`git format-patch`).
-
- 1. Make all the changes in your working directory, i.e. edit files, move them
- around (you can use 'git mv' for this), etc.
- 2. Add the changes and commit them (`git add`, `git commit`). Never mix
- different changes into one commit! Write a good description of the commit.
- The first line should contain a short summary, and then, if you feel like
- more explanations are needed, enter an empty new line, and then start the
- long, detailed description (optional).
- 3. Test your changes NOW: check if RPMs build fine, etc.
- 4. Create the patch using `git format-patch`. This has an advantage over
- `git diff`, because the former will also include your commit message, your
- name and email, so that *your* name will be used as a commit's author.
- 5. Send your patch to `qubes-devel`. Start the message subject with
- `[PATCH]`.
+---
\ No newline at end of file
diff --git a/developer/debugging/automated-tests.md b/developer/debugging/automated-tests.md
index 3fd4ed24b..a5b4c8063 100644
--- a/developer/debugging/automated-tests.md
+++ b/developer/debugging/automated-tests.md
@@ -5,275 +5,7 @@ permalink: /doc/automated-tests/
redirect_from:
- /en/doc/automated-tests/
- /doc/AutomatedTests/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/debugging/automated-tests.html
ref: 45
title: Automated tests
----
-
-## Unit and Integration Tests
-
-Starting with Qubes R3 we use [python unittest](https://docs.python.org/3/library/unittest.html) to perform automatic tests of Qubes OS.
-Despite the name, we use it for both [unit tests](https://en.wikipedia.org/wiki/Unit_tests) and [integration tests](https://en.wikipedia.org/wiki/Integration_tests).
-The main purpose is, of course, to deliver much more stable releases.
-
-The integration tests must be run in dom0, but some unit tests can run inside a VM as well.
-
-### Integration & unit testing in dom0
-
-Integration tests are written with the assumption that they will be executed on dedicated hardware and must be run in dom0. All other unit tests can also be run in dom0.
-
-**Do not run the tests on installations with important data, because you might lose it.**
-
-All the VMs with a name starting with `test-` on the installation are removed during the process, and all the tests are recklessly started from dom0, even when testing (& possibly breaking) VM components.
-
-First you need to build all packages that you want to test. Please do not mix branches as this will inevitably lead to failures. Then setup Qubes OS with these packages installed.
-
-For testing you'll have to stop the `qubesd` service as the tests will use its own custom variant of the service:
-`sudo systemctl stop qubesd`
-
-Don't forget to start it after testing again.
-
-To start testing you can then use the standard python unittest runner:
-
-`sudo -E python3 -m unittest -v qubes.tests`
-
-Alternatively, use the custom Qubes OS test runner:
-
-`sudo -E python3 -m qubes.tests.run -v`
-
-Our test runner runs mostly the same as the standard one, but it has some nice additional features like colored output and not needing the "qubes.test" prefix.
-
-You can use `python3 -m qubes.tests.run -h` to get usage information:
-
-```
-[user@dom0 ~]$ python3 -m qubes.tests.run -h
-usage: run.py [-h] [--verbose] [--quiet] [--list] [--failfast] [--no-failfast]
- [--do-not-clean] [--do-clean] [--loglevel LEVEL]
- [--logfile FILE] [--syslog] [--no-syslog] [--kmsg] [--no-kmsg]
- [TESTNAME [TESTNAME ...]]
-
-positional arguments:
- TESTNAME list of tests to run named like in description
- (default: run all tests)
-
-optional arguments:
- -h, --help show this help message and exit
- --verbose, -v increase console verbosity level
- --quiet, -q decrease console verbosity level
- --list, -l list all available tests and exit
- --failfast, -f stop on the first fail, error or unexpected success
- --no-failfast disable --failfast
- --loglevel LEVEL, -L LEVEL
- logging level for file and syslog forwarding (one of:
- NOTSET, DEBUG, INFO, WARN, WARNING, ERROR, CRITICAL;
- default: DEBUG)
- --logfile FILE, -o FILE
- if set, test run will be also logged to file
- --syslog reenable logging to syslog
- --no-syslog disable logging to syslog
- --kmsg, --very-brave-or-very-stupid
- log most important things to kernel ring-buffer
- --no-kmsg, --i-am-smarter-than-kay-sievers
- do not abuse kernel ring-buffer
- --allow-running-along-qubesd
- allow running in parallel with qubesd; this is
- DANGEROUS and WILL RESULT IN INCONSISTENT SYSTEM STATE
- --break-to-repl break to REPL after tests
-
-When running only specific tests, write their names like in log, in format:
-MODULE+"/"+CLASS+"/"+FUNCTION. MODULE should omit initial "qubes.tests.".
-Example: basic/TC_00_Basic/test_000_create
-```
-
-For instance, to run only the tests for the fedora-21 template, you can use the `-l` option, then filter the list:
-
-```
-[user@dom0 ~]$ python3 -m qubes.tests.run -l | grep fedora-21
-network/VmNetworking_fedora-21/test_000_simple_networking
-network/VmNetworking_fedora-21/test_010_simple_proxyvm
-network/VmNetworking_fedora-21/test_020_simple_proxyvm_nm
-network/VmNetworking_fedora-21/test_030_firewallvm_firewall
-network/VmNetworking_fedora-21/test_040_inter_vm
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_000_start_shutdown
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_010_run_gui_app
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_050_qrexec_simple_eof
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_051_qrexec_simple_eof_reverse
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_052_qrexec_vm_service_eof
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_053_qrexec_vm_service_eof_reverse
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_060_qrexec_exit_code_dom0
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_065_qrexec_exit_code_vm
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_100_qrexec_filecopy
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_110_qrexec_filecopy_deny
-vm_qrexec_gui/TC_00_AppVM_fedora-21/test_120_qrexec_filecopy_self
-vm_qrexec_gui/TC_20_DispVM_fedora-21/test_000_prepare_dvm
-vm_qrexec_gui/TC_20_DispVM_fedora-21/test_010_simple_dvm_run
-vm_qrexec_gui/TC_20_DispVM_fedora-21/test_020_gui_app
-vm_qrexec_gui/TC_20_DispVM_fedora-21/test_030_edit_file
-[user@dom0 ~]$ sudo -E python3 -m qubes.tests.run -v `python3 -m qubes.tests.run -l | grep fedora-21`
-```
-
-Example test run:
-
-
-
-Tests are also compatible with nose2 test runner, so you can use this instead:
-
-```bash
-sudo systemctl stop qubesd; sudo -E nose2 -v --plugin nose2.plugins.loader.loadtests qubes.tests; sudo systemctl start qubesd
-```
-
-This may be especially useful together with various nose2 plugins to store tests results (for example `nose2.plugins.junitxml`), to ease presenting results. This is what we use on [OpenQA](http://open.qa/).
-
-### Unit testing inside a VM
-
-Many unit tests will also work inside a VM. However all of the tests requiring a dedicated VM to be run (mostly the integration tests) will be skipped.
-
-Whereas integration tests are mostly stored in the [qubes-core-admin](https://github.com/QubesOS/qubes-core-admin) repository, unit tests can be found in each of the Qubes OS repositories.
-
-To for example run the `qubes-core-admin` unit tests, you currently have to clone at least [qubes-core-admin](https://github.com/QubesOS/qubes-core-admin) and
-its dependency [qubes-core-qrexec](https://github.com/QubesOS/qubes-core-qrexec) repository in the branches that you want to test.
-
-The below example however will assume that you set up a build environment as described in the [Qubes Builder documentation](/doc/qubes-builder/).
-
-Assuming you cloned the `qubes-builder` repository to your home directory inside a fedora VM, you can use the following commands to run the unit tests:
-
-```{.bash}
-cd ~
-sudo dnf install python3-pip lvm2 python35 python3-virtualenv
-virtualenv -p /usr/bin/python35 python35
-source python35/bin/activate
-python3 -V
-cd ~/qubes-builder/qubes-src/core-admin
-pip3 install -r ci/requirements.txt
-export PYTHONPATH=../core-qrexec:test-packages
-./run-tests
-```
-
-To run only the tests related to e.g. `lvm`, you may use:
-
-`./run-tests -v $(python3 -m qubes.tests.run -l | grep lvm)`
-
-You can later re-use the created virtual environment including all of the via `pip3` installed packages with `source ~/python35/bin/activate`.
-
-We recommend to run the unit tests with the Python version that the code is meant to be run with in dom0 (3.5 was just an example above). For instance, the `release4.0` (Qubes 4.0) branch is intended
-to be run with Python 3.5 whereas the Qubes 4.1 branch (`master` as of 2020-07) is intended to be run with Python 3.7 or higher. You can always check your dom0 installation for the Python version of
-the current stable branch.
-
-### Tests configuration
-
-Test runs can be altered using environment variables:
-
-- `DEFAULT_LVM_POOL` - LVM thin pool to use for tests, in `VolumeGroup/ThinPool` format
-- `QUBES_TEST_PCIDEV` - PCI device to be used in PCI passthrough tests (for example sound card)
-- `QUBES_TEST_TEMPLATES` - space separated list of templates to run tests on; if not set, all installed templates are tested
-- `QUBES_TEST_LOAD_ALL` - load all tests (including tests for all templates) when relevant test modules are imported; this needs to be set for test runners not supporting [load_tests protocol](https://docs.python.org/3/library/unittest.html#load-tests-protocol)
-
-### Adding a new test to core-admin
-
-After adding a new unit test to [core-admin/qubes/tests](https://github.com/QubesOS/qubes-core-admin/tree/master/qubes/tests) you'll have to include it in [core-admin/qubes/tests/\_\_init\_\_.py](https://github.com/QubesOS/qubes-core-admin/tree/master/qubes/tests/__init__.py)
-
-#### Editing `__init__.py`
-
-You'll also need to add your test at the bottom of the `__init__.py` file, in the method `def load_tests`, in the for loop with `modname`.
-Again, given the hypothetical `example.py` test:
-
-~~~python
-for modname in (
- 'qubes.tests.basic',
- 'qubes.tests.dom0_update',
- 'qubes.tests.network',
- 'qubes.tests.vm_qrexec_gui',
- 'qubes.tests.backup',
- 'qubes.tests.backupcompatibility',
- 'qubes.tests.regressions',
- 'qubes.tests.example', # This is our newly added test
- ):
-~~~
-
-### Testing PyQt applications
-
-When testing (Py)QT applications, it's useful to create a separate QApplication object for each test.
-But QT framework does not allow multiple QApplication objects in the same process at the same time.
-This means it's critical to reliably cleanup the previous instance before creating a new one.
-This turns out to be a non-trivial task, especially if _any_ test uses the event loop.
-Failure to perform proper cleanup in many cases results in SEGV.
-Below you can find steps for the proper cleanup:
-
-~~~python
-import asyncio
-import quamash
-import unittest
-import gc
-
-class SomeTestCase(unittest.TestCase):
- def setUp(self):
- [...]
-
- # force "cleanlooks" style, the default one on Xfce (GtkStyle) use
- # static variable internally and caches pointers to later destroyed
- # objects (result: SEGV)
- self.qtapp = QtGui.QApplication(["test", "-style", "cleanlooks"])
-
- # construct event loop even if this particular test doesn't use it,
- # otherwise events with qtapp references will be queued there anyway and the
- # first test that actually use event loop will try to dereference (already
- # destroyed) objects, resulting in SEGV
- self.loop = quamash.QEventLoop(self.qtapp)
-
- def tearDown(self):
- [...]
- # process any pending events before destroying the object
- self.qtapp.processEvents()
-
- # queue destroying the QApplication object, do that for any other QT
- # related objects here too
- self.qtapp.deleteLater()
-
- # process any pending events (other than just queued destroy), just in case
- self.qtapp.processEvents()
-
- # execute main loop, which will process all events, _including just queued destroy_
- self.loop.run_until_complete(asyncio.sleep(0))
-
- # at this point it QT objects are destroyed, cleanup all remaining references;
- # del other QT object here too
- self.loop.close()
- del self.qtapp
- del self.loop
- gc.collect()
-~~~
-
-## Automated tests with openQA
-
-**URL:**
-**Tests:**
-
-Manually testing Qubes OS and its installation is a time-consuming process.
-We use [OpenQA](http://open.qa/) to automate this process.
-It works by installing Qubes in KVM and interacting with it as a user would, including simulating mouse clicks and keyboard presses.
-Then, it checks the output to see whether various tests were passed, e.g. by comparing the virtual screen output to screenshots of a successful installation.
-
-Using openQA to automatically test the Qubes installation process works as of Qubes 4.0-rc4 on 2018-01-26, provided that the versions of KVM and QEMU are new enough and the hardware has VT-x and EPT.
-KVM also supports nested virtualization, so HVM should theoretically work.
-In practice, however, either Xen or QEMU crashes when this is attempted.
-Nonetheless, PV works well, which is sufficient for automated installation testing.
-
-Thanks to present and past donors who have provided the infrastructure for Qubes' openQA system with hardware that meets these requirements.
-
-### Looking for patterns in tests
-
-In order to better visualize patterns in tests the [`openqa_investigator`](https://github.com/QubesOS/openqa-tests-qubesos/blob/master/utils/openqa_investigator.py) script can be used.
-It feeds off of the openQA test data to make graph plots. Here is an example:
-
-
-
-Some outputs:
- - plot by tests
- - plot by errors
- - markdown
-
-Some filters:
- - filter by error
- - filter by test name
-
-Check out the script's help with `python3 openqa_investigator.py --help`
-to see all available options.
+---
\ No newline at end of file
diff --git a/developer/debugging/mount-lvm-image.md b/developer/debugging/mount-lvm-image.md
index d5b760807..d66e3ac58 100644
--- a/developer/debugging/mount-lvm-image.md
+++ b/developer/debugging/mount-lvm-image.md
@@ -2,53 +2,7 @@
lang: en
layout: doc
permalink: /doc/mount-lvm-image/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/debugging/mount-lvm-image.html
ref: 46
title: How to mount LVM images
----
-
-You want to read your LVM image (e.g., there is a problem where you can't start any VMs except dom0).
-
-1: make the image available for qubesdb.
-From dom0 terminal:
-
-```bash
-# Example: /dev/qubes_dom0/vm-debian-9-tmp-root
-[user@dom0]$ dev=$(basename $(readlink /dev/YOUR_LVM_VG/YOUR_LVM_IMAGE))
-[user@dom0]$ qubesdb-write /qubes-block-devices/$dev/desc "YOUR_LVM_IMAGE"
-```
-
-2: Create a new disposable VM
-
-```bash
-[user@dom0]$ qvm-run -v --dispvm=YOUR_DVM_TEMPLATE --service qubes.StartApp+xterm &
-```
-
-3: Attach the device to your newly created disp VM
-
-From the GUI, or from the command line:
-
-```bash
-[user@dom0]$ qvm-block attach NEWLY_CREATED_DISPVM dom0:$dev
-```
-
-4: Mount the partition you want to, and do what you want with it
-
-```bash
-[user@dispXXXX]$ mount /dev/xvdiX /mnt/
-```
-
-5: Umount and kill the VM
-
-```bash
-[user@dispXXXX]$ umount /mnt/
-```
-
-6: Remove the image from qubesdb
-
-```bash
-[user@dom0]$ qubesdb-rm /qubes-block-devices/$dev/
-```
-
-# References
-
-Please consult this issue's [comment](https://github.com/QubesOS/qubes-issues/issues/4687#issuecomment-451626625).
+---
\ No newline at end of file
diff --git a/developer/debugging/profiling.md b/developer/debugging/profiling.md
index 2932b4cbf..b50efe9f9 100644
--- a/developer/debugging/profiling.md
+++ b/developer/debugging/profiling.md
@@ -6,93 +6,7 @@ redirect_from:
- /en/doc/profiling/
- /doc/Profiling/
- /wiki/Profiling/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/debugging/profiling.html
ref: 48
title: Python profiling
----
-
-This is a python profiling primer.
-
-For the purpose of this document, `qubes-dev` is name of the domain used for postprocessing profiling stats.
-
-## Requirements
-
-~~~
-yum install gprof2dot graphviz
-git clone http://git.woju.eu/qubes/profiling.git
-~~~
-
-If you profile something in dom0, move `Upload.sh` from the repository to dom0:
-
-~~~
-mkdir -p ~/profiling
-qvm-run -p qubes-dev 'cat ~/profiling/Upload.sh' > ~/profiling/Upload.sh
-~~~
-
-- WARNING: this will obviously be running third-party code which is not signed by ITL nor Fedora. You have been warned.
-
-## Workflow
-
-### Identify function responsible for some slow action
-
-You have to select the area in which you suspect less than optimal performance. If you do not narrow the area, graphs may be unreadable.
-
-### Replace suspect function with probe
-
-Replace
-
-```python
-def foo(self, bar):
- # function content
-```
-
-with
-
-```python
-def foo(self, *args, **kwargs):
- profile.runctx('self.real_foo(*args, **kwargs)', globals(), locals(),
- time.strftime('/home/user/profiling/foo-%Y%m%d-%H%M%S.pstats'))
-
-def real_foo(self, bar):
- # function content
-```
-
-### Run application
-
-Beware that some functions may be called often. For example `qubesmanager/main.py:update_table` gets run once per second. This will produce one pstat file per second.
-
-Remember to revert your changes to the application afterwards.
-
-### Upload statistics
-
-If you are in dom0:
-
-~~~
-cd ~/profiling
-./Upload.sh
-~~~
-
-### Analyse
-
-~~~
-make
-~~~
-
-For every `${basename}.pstats` this will produce `${basename}.txt` and `${basename}.svg`. SVG files contain call graphs. Text files contain lists of all functions, sorted by cumulative execution time. You may also try `make all-png`.
-
-~~~
-make index.html
-~~~
-
-This creates `index.html` with all SVG graphics linked to TXT files, ready for upload.
-
-~~~
-make REMOTE=example.com:public_html/qubes/profiling/ upload
-~~~
-
-## Example
-
-This example is from `qubes-manager` (`qubesmanager/main.py`).
-
-
-
-It is apparent that the problem is around `get_disk_usage`, which calls something via `subprocess.call`. It does this 15 times, probably once per VM.
+---
\ No newline at end of file
diff --git a/developer/debugging/safe-remote-ttys.md b/developer/debugging/safe-remote-ttys.md
index b61831160..a4e821e43 100644
--- a/developer/debugging/safe-remote-ttys.md
+++ b/developer/debugging/safe-remote-ttys.md
@@ -4,73 +4,7 @@ layout: doc
permalink: /doc/safe-remote-ttys/
redirect_from:
- /en/doc/safe-remote-ttys/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/debugging/safe-remote-ttys.html
ref: 49
title: Safe remote dom0 terminals
----
-
-If you do not have working graphics in Dom0, then using a terminal can be quite annoying!
-This was the case for the author while trying to debug PCI-passthrough of a machine's primary (only) GPU.
-
-Your first thought might be to just allow network access to Dom0, enable ssh, and connect in remotely.
-But, this gravely violates the Qubes security model.
-
-Instead, a better solution is to split the input and output paths of using a terminal.
-Use your normal keyboard for input, but have the output go to a remote machine in a unidirectional manner.
-
-To do this, we make use of script(1), qvm-run, and optionally your network transport of choice.
-
-To a different VM
------------------
-
-As an example of forwarding terminal output to another VM on the same machine:
-
-~~~
-$ mkfifo /tmp/foo
-$ qvm-run -p some-vm 'xterm -e "cat 0<&5" 5<&0' /dev/null 2>&1 &
-$ script -f /tmp/foo
-~~~
-
-To a different machine
-----------------------
-
-In this case over SSH (from a network-connected VM):
-
-~~~
-$ mkfifo /tmp/foo
-$ qvm-run -p some-vm \
- 'ssh user@host sh -c "DISPLAY=:0 xterm -e \"cat 0<&5\" 5<&0"' \
- /dev/null 2>&1 &
-$ script -f /tmp/foo
-~~~
-
-Note that no data received over SSH is ever treated as terminal input in Dom0.
-The input path remains only from your trusted local keyboard.
-
-Multiple terminals
-------------------
-
-For multiple terminals, you may find it easier to just use tmux than to try to blindly switch to the correct window.
-
-Terminal size
--------------
-
-It is up to you to ensure the sizes of the local and remote terminal are the same, otherwise things may display incorrectly (especially in interactive programs).
-Depending on your shell, the size of your local (blind) terminal is likely stored in the `$LINES` and `$COLUMNS` variables.
-
-~~~
-$ echo $COLUMNS $LINES
-80 24
-~~~
-
-A note on serial consoles
--------------------------
-
-If your machine has a serial console, you may with to use that, but note that a similar split-I/O model should be used to ensure Dom0 integrity.
-If you use the serial console as normal (via e.g. getty on ttyX, and logging in as normal), then the machine at the end of the serial cable could compromise your machine!
-Ideally, you would take input from your trusted keyboard, and only send the output over the serial cable via e.g. disabling getty and using:
-
-~~~
-script -f /dev/ttyS0
-~~~
-
-You don't even need to connect the TX pin.
+---
\ No newline at end of file
diff --git a/developer/debugging/test-bench.md b/developer/debugging/test-bench.md
index ca48a5eab..9e96cb8b4 100644
--- a/developer/debugging/test-bench.md
+++ b/developer/debugging/test-bench.md
@@ -6,230 +6,7 @@ redirect_from:
- /en/doc/test-bench/
- /doc/TestBench/
- /wiki/TestBench/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/debugging/test-bench.html
ref: 44
title: How to set up a test bench
----
-
-This guide shows how to set up simple test bench that automatically test your code you're about to push. It is written especially for `core3` branch of `core-admin.git` repo, but some ideas are universal.
-
-We will set up a spare machine (bare metal, not a virtual) that will be hosting our experimental Dom0. We will communicate with it via Ethernet and SSH. This tutorial assumes you are familiar with [QubesBuilder](/doc/qubes-builder/) and you have it set up and running flawlessly.
-
-> **Notice:**
-> This setup intentionally weakens some security properties in the testing system. So make sure you understand the risks and use exclusively for testing.
-
-## Setting up the Machine
-
-### Install ISO
-First, do a clean install from the `.iso` [you built](/doc/qubes-iso-building/) or grabbed elsewhere (for example [here](https://forum.qubes-os.org/t/qubesos-4-1-alpha-signed-weekly-builds/3601)).
-
-### Enabling Network Access in Dom0
-
-Internet access is intentionally disabled by default in dom0. But to ease the deployment process we will give it access. The following steps should be done in `dom0`.
-
-> **Note:** the following assume you have only one network card. If you have two, pick one and leave the other attached to `sys-net`.
-
-1. Remove the network card (PCI device) from `sys-net`
-2. Restart your computer (for the removal to take effect)
-3. Install `dhcp-client` and `openssh-server` on your testbench's dom0.
-4. Save the following script in `/home/user/bin/dom0_network.sh` and make it executable. It should enable your network card in dom0. *Be sure to adjust the script's variables to suit your needs.*
-
- ```bash
- #!/bin/sh
-
- # adjust this for your NIC (run lspci)
- BDF=0000:02:00.0
-
- # adjust this for your network driver
- DRIVER=e1000e
-
- prog=$(basename $0)
-
- pciunbind() {
- local path
- path=/sys/bus/pci/devices/${1}/driver/unbind
- if ! [ -w ${path} ]; then
- echo "${prog}: Device ${1} not bound"
- return 1
- fi
- echo -n ${1} >${path}
- }
-
- pcibind() {
- local path
- path=/sys/bus/pci/drivers/${2}/bind
- if ! [ -w ${path} ]; then
- echo "${prog}: Driver ${2} not found"
- return 1
- fi
- echo ${1} >${path}
- }
-
- pciunbind ${BDF}
- pcibind ${BDF} ${DRIVER}
-
- sleep 1
- dhclient
- ```
-
-5. Configure your DHCP server so your testbench gets static IP and connect your machine to your local network. You should ensure that your testbench can reach the Internet.
-
-6. You'll need to run the above script on every startup. To automate this save the following systemd service `/etc/systemd/system/dom0-network-direct.service`
-
- ```
- [Unit]
- Description=Connect network to dom0
-
- [Service]
- Type=oneshot
- ExecStart=/home/user/bin/dom0_network.sh
-
- [Install]
- WantedBy=multi-user.target
- ```
-
-7. Then, enable and start the SSH Server and the script on boot:
-
- ```bash
- sudo systemctl enable sshd
- sudo systemctl start sshd
-
- sudo systemctl enable dom0-network-direct
- sudo systemctl start dom0-network-direct
- ```
-
-> **Note:** If you want to install additional software in dom0 and your only network card was assigned to dom0, then _instead_ of the usual `sudo qubes-dom0-update ` now you run `sudo dnf --setopt=reposdir=/etc/yum.repos.d install `.
-
-### Install Tests and Their Dependencies
-
-A regular Qubes installation isn't ready to run the full suite of tests. For example, in order to run the [Split GPG tests](https://github.com/QubesOS/qubes-app-linux-split-gpg/blob/4bc201bb70c011119eed19df25dc5b46120d04ed/tests/splitgpg/tests.py) you need to have the `qubes-gpg-split-tests` package installed in your app qubes.
-
-Because of the above reason, some additional configurations need to be done to your testing environment. This can be done in an automated manner with the help of the [Salt](/doc/salt) configuration that provisions the [automated testing environment](/doc/automated-tests/).
-
-The following commands should work for you, but do keep in mind that the provisioning scripts are designed for the [openQA environment](https://openqa.qubes-os.org/) and not your specific local testing system. Run the following in `dom0`:
-
- ```bash
- # For future reference the following commands are an adaptation of
- # https://github.com/marmarek/openqa-tests-qubesos/blob/master/tests/update.pm
-
- # Install git
- sudo qubes-dom0-update git || sudo dnf --setopt=reposdir=/etc/yum.repos.d install git
-
- # Download the openQA automated testing environment Salt configuration
- git clone https://github.com/marmarek/openqa-tests-qubesos/
- cd openqa-tests-qubesos/extra-files
- sudo cp -a system-tests/ /srv/salt/
- sudo qubesctl top.enable system-tests
-
- # Install the same configuration as the one in openQA
- QUBES_VERSION=4.1
- PILLAR_DIR=/srv/pillar/base/update
- sudo mkdir -p $PILLAR_DIR
- printf 'update:\n qubes_ver: '$QUBES_VERSION'\n' | sudo tee $PILLAR_DIR/init.sls
- printf "base:\n '*':\n - update\n" | sudo tee $PILLAR_DIR/init.top
- sudo qubesctl top.enable update pillar=True
-
- # Apply states to dom0 and VMs
- # NOTE: These commands can take several minutes (if not more) without showing output
- sudo qubesctl --show-output state.highstate
- sudo qubesctl --max-concurrency=2 --skip-dom0 --templates --show-output state.highstate
- ```
-
-## Development VM
-
-### SSH
-
-Arrange firewall so you can reach the testbench from your `qubes-dev` VM. Generate SSH key in `qubes-dev`:
-
-~~~
-ssh-keygen -t ecdsa -b 521
-~~~
-
-Add the following section in `.ssh/config` in `qubes-dev`:
-
-~~~
-Host testbench
- # substitute username in testbench
- User user
- # substitute address of your testbench
- HostName 192.168.123.45
-~~~
-
-#### Passwordless SSH Login
-
-To log to your testbench without entering password every time, copy your newly generated public key (`id_ecdsa.pub`) to `~/.ssh/authorized_keys` on your testbench. You can do this easily by running this command on `qubes-dev`: `ssh-copy-id -i ~/.ssh/id_ecdsa.pub user@192.168.123.45` (substituting with the actual username address of your testbench).
-
-### Scripting
-
-This step is optional, but very helpful. Put these scripts somewhere in your `${PATH}`, like `/usr/local/bin`.
-
-`qtb-runtests`:
-
-```bash
-#!/bin/sh
-
-ssh testbench python -m qubes.tests.run
-```
-
-`qtb-install`:
-
-```bash
-#!/bin/sh
-
-TMPDIR=/tmp/qtb-rpms
-
-if [ $# -eq 0 ]; then
- echo "usage: $(basename $0) ..."
- exit 2
-fi
-
-set -e
-
-ssh testbench mkdir -p "${TMPDIR}"
-scp "${@}" testbench:"${TMPDIR}" || echo "check if you have 'scp' installed on your testbench"
-
-while [ $# -gt 0 ]; do
- ssh testbench sudo rpm -i --replacepkgs --replacefiles "${TMPDIR}/$(basename ${1})"
- shift
-done
-```
-
-`qtb-iterate`:
-
-```bash
-#!/bin/sh
-
-set -e
-
-# substitute path to your builder installation
-pushd ${HOME}/builder >/dev/null
-
-# the following are needed only if you have sources outside builder
-#rm -rf qubes-src/core-admin
-#make COMPONENTS=core-admin get-sources
-
-make core-admin
-qtb-install qubes-src/core-admin/rpm/x86_64/qubes-core-dom0-*.rpm
-qtb-runtests
-```
-
-### Hooking git
-
-I (woju) have those two git hooks. They ensure tests are passing (or are marked as expected failure) when committing and pushing. For committing it is only possible to run tests that may be executed from git repo (even if the rest were available, I probably wouldn't want to do that). For pushing, I also install RPM and run tests on testbench.
-
-`core-admin/.git/hooks/pre-commit`: (you may retain also the default hook, here omitted for readability)
-
-```bash
-#!/bin/sh
-
-set -e
-
-python -c "import sys, qubes.tests.run; sys.exit(not qubes.tests.run.main())"
-```
-
-`core-admin/.git/hooks/pre-push`:
-
-```bash
-#!/bin/sh
-
-exec qtb-iterate
-```
+---
\ No newline at end of file
diff --git a/developer/debugging/vm-interface.md b/developer/debugging/vm-interface.md
index d6fc2dff0..a2c1d883c 100644
--- a/developer/debugging/vm-interface.md
+++ b/developer/debugging/vm-interface.md
@@ -7,219 +7,7 @@ redirect_from:
- /doc/VMInterface/
- /doc/SystemDoc/VMInterface/
- /wiki/SystemDoc/VMInterface/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/debugging/vm-interface.html
ref: 47
title: Qube configuration interface
----
-
-Qubes VM have some settings set by dom0 based on VM settings. There are multiple configuration channels, which includes:
-
-- QubesDB
-- XenStore (in Qubes 2, data the same as in QubesDB, keys without leading `/`)
-- Qubes RPC (called at VM startup, or when configuration changed)
-- GUI protocol
-
-## QubesDB
-
-### Keys exposed by dom0 to VM
-
-- `/qubes-vm-type` - VM type, the same as `type` field in `qvm-prefs`. One of `AppVM`, `ProxyVM`, `NetVM`, `TemplateVM`, `HVM`, `TemplateHVM`
-- `/qubes-vm-updatable` - flag whether VM is updatable (whether changes in root.img will survive VM restart). One of `True`, `False`
-- `/qubes-vm-persistence` - what data do persist between VM restarts:
- - `full` - all disks
- - `rw-only` - only `/rw` disk
- - `none` - none
-- `/qubes-timezone - name of timezone based on dom0 timezone. For example `Europe/Warsaw`
-- `/qubes-keyboard` (deprecated in R4.1) - keyboard layout based on dom0 layout. Its syntax is suitable for `xkbcomp` command (after expanding escape sequences like `\n` or `\t`). This is meant only as some default value, VM can ignore this option and choose its own keyboard layout (this is what keyboard setting from Qubes Manager does). This entry is created as part of gui-daemon initialization (so not available when gui-daemon disabled, or not started yet).
-- `/keyboard-layout` - keyboard layout based on GuiVM layout. Its syntax can be `layout+variant+options`, `layout+variant`, `layout++options` or simply `layout`. For example, `fr+oss`, `pl++compose:caps` or `fr`. This is meant only as some default value, VM can ignore this option and choose its own keyboard layout (this is what keyboard setting from Qubes Manager does).
-- `/qubes-debug-mode` - flag whether VM has debug mode enabled (qvm-prefs setting). One of `1`, `0`
-- `/qubes-service/SERVICE_NAME` - subtree for VM services controlled from dom0 (using the `qvm-service` command or Qubes Manager). One of `1`, `0`. Note that not every service will be listed here, if entry is missing, it means "use VM default". A list of currently supported services is in the `qvm-service` man page.
-- `/qubes-netmask` - network mask (only when VM has netvm set); currently hardcoded "255.255.255.0"
-- `/qubes-ip - IP address for this VM (only when VM has netvm set)
-- `/qubes-gateway` - default gateway IP (only when VM has netvm set); VM should add host route to this address directly via eth0 (or whatever default interface name is)
-- `/qubes-primary-dns` - primary DNS address (only when VM has netvm set)
-- `/qubes-secondary-dns` - secondary DNS address (only when VM has netvm set)
-- `/qubes-netvm-gateway` - same as `qubes-gateway` in connected VMs (only when VM serves as network backend - ProxyVM and NetVM)
-- `/qubes-netvm-netmask` - same as `qubes-netmask` in connected VMs (only when VM serves as network backend - ProxyVM and NetVM)
-- `/qubes-netvm-network` - network address (only when VM serves as network backend - ProxyVM and NetVM); can be also calculated from qubes-netvm-gateway and qubes-netvm-netmask
-- `/qubes-netvm-primary-dns` - same as `qubes-primary-dns` in connected VMs (only when VM serves as network backend - ProxyVM and NetVM); traffic sent to this IP on port 53 should be redirected to primary DNS server
-- `/qubes-netvm-secondary-dns` - same as `qubes-secondary-dns` in connected VMs (only when VM serves as network backend - ProxyVM and NetVM); traffic sent to this IP on port 53 should be redirected to secondary DNS server
-- `/guivm-windows-prefix` - title prefix for any window not originating from another qube. This means windows of applications running in GuiVM itself
-
-#### Firewall rules in 3.x
-
-QubesDB is also used to configure firewall in ProxyVMs. Rules are stored in
-separate key for each target VM. Entries:
-
-- `/qubes-iptables` - control entry - dom0 writing `reload` here signals `qubes-firewall` service to reload rules
-- `/qubes-iptables-header` - rules not related to any particular VM, should be applied before domains rules
-- `/qubes-iptables-domainrules/NNN` - rules for domain `NNN` (arbitrary number)
-in `iptables-save` format. Rules are self-contained - fill `FORWARD` iptables
-chain and contains all required matches (source IP address etc), as well as
-final default action (`DROP`/`ACCEPT`)
-
-VM after applying rules may signal some error, writing a message to
-`/qubes-iptables-error` key. This does not exclude any other way of
-communicating problems - like a popup.
-
-#### Firewall rules in 4.x
-
-QubesDB is also used to configure firewall in ProxyVMs. Each rule is stored as
-a separate entry, grouped on target VM:
-
-- `/qubes-firewall/SOURCE_IP` - base tree under which rules are placed. All
-rules there should be applied to filter traffic coming from `SOURCE_IP`. This
-can be either IPv4 or IPv6 address.
-Dom0 will do an empty write to this top level entry after finishing rules
-update, so VM can setup a watch here to trigger rules reload.
-- `/qubes-firewall/SOURCE_IP/policy` - default action if no rule matches:
-`drop` or `accept`.
-- `/qubes-firewall/SOURCE_IP/NNNN` - rule number `NNNN` - decimal number,
- padded with zeros. Se below for rule format. All the rules should be
- applied in order of rules implied by those numbers. Note that QubesDB
- itself does not impose any ordering (you need to sort the rules after
- retrieving them). The first rule has number `0000`.
-
-Each rule is a single QubesDB entry, consisting of pairs `key=value` separated
-by space. QubesDB enforces limit on a single entry length - 3072 bytes.
-Possible options for a single rule:
-
-- `action`, values: `accept`, `drop`; this is present in every rule
-- `dst4`, value: destination IPv4 address with a mask; for example: `192.168.0.0/24`
-- `dst6`, value: destination IPv6 address with a mask; for example: `2000::/3`
-- `dsthost`, value: DNS hostname of destination host
-- `proto`, values: `tcp`, `udp`, `icmp`
-- `specialtarget`, value: One of predefined target, currently defined values:
- - `dns` - such option should match DNS traffic to default DNS server (but
- not any DNS server), on both TCP and UDP
-- `dstports`, value: destination ports range separated with `-`, valid only
- together with `proto=tcp` or `proto=udp`; for example `1-1024`, `80-80`
-- `icmptype`, value: numeric (decimal) icmp message type, for example `8` for
- echo request, valid only together with `proto=icmp`
-- `dpi`, value: Deep Packet Inspection protocol (like: HTTP, SSL, SMB, SSH, SMTP) or the default 'NO' as no DPI, only packet filtering
-
-Options must appear in the rule in the order listed above. Duplicated options
-are forbidden.
-
-A rule matches only when all predicates match. Only one of `dst4`, `dst6` or
-`dsthost` can be used in a single rule.
-
-If tool applying firewall encounters any parse error (unknown option, invalid
-value, duplicated option, etc), it should drop all the traffic coming from that `SOURCE_IP`,
-regardless of properly parsed rules.
-
-Example valid rules:
-
-- `action=accept dst4=8.8.8.8 proto=udp dstports=53-53`
-- `action=drop dst6=2a00:1450:4000::/37 proto=tcp`
-- `action=accept specialtarget=dns`
-- `action=drop proto=tcp specialtarget=dns` - drop DNS queries sent using TCP
-- `action=drop`
-
-### Keys set by VM for passing info to dom0
-
-- `memory/meminfo` (**xenstore**) - used memory (updated by qubes-meminfo-writer), input information for qmemman;
- - Qubes 3.x format: 6 lines (EOL encoded as `\n`), each in format "FIELD: VALUE kB"; fields: `MemTotal`, `MemFree`, `Buffers`, `Cached`, `SwapTotal`, `SwapFree`; meaning the same as in `/proc/meminfo` in Linux.
- - Qubes 4.0+ format: used memory size in the VM, in kbytes
-- `/qubes-block-devices` - list of block devices exposed by this VM, each device (subdirectory) should be named in a way that VM can attach the device based on it. Each should contain these entries:
- - `desc` - device description (ASCII text)
- - `size` - device size in bytes
- - `mode` - default connection mode; `r` for read-only, `w` for read-write
-- `/qubes-usb-devices` - list of USB devices exposed by this VM, each device (subdirectory) should contain:
- - `desc` - device description (ASCII text)
- - `usb-ver` - USB version (1, 2 or 3)
-
-## Qubes RPC
-
-Services called by dom0 to provide some VM configuration:
-
-- `qubes.SetMonitorLayout` - provide list of monitors, one per line. Each line contains four numbers: `width height X Y width_mm height_mm` (physical dimensions - `width_mm` and `height_mm` - are optional)
-- `qubes.WaitForSession` - called to wait for full VM startup
-- `qubes.GetAppmenus` - receive appmenus from given VM (template); TODO: describe format here
-- `qubes.GetImageRGBA` - receive image/application icon. Protocol:
-
- 1. Caller sends name of requested icon. This can be one of:
- * `xdgicon:NAME` - search for NAME in standard icons theme
- * `-` - get icon data from stdin (the caller), can be prefixed with format name, for example `png:-`
- * file name
- 2. The service responds with image dimensions: width and height as
- decimal numbers, separated with space and with EOL marker at the and; then
- image data in RGBA format (32 bits per pixel)
-- `qubes.SetDateTime` - set VM time, called periodically by dom0 (can be
- triggered manually from dom0 by calling `qvm-sync-clock`). The service
- receives one line at stdin - time in format of `date -u -Iseconds`, for
- example `2015-07-31T16:10:43+0000`.
-- `qubes.SetGuiMode` - called in HVM to switch between fullscreen and seamless
- GUI mode. The service receives a single word on stdin - either `FULLSCREEN`
- or `SEAMLESS`
-- `qubes.ResizeDisk` - called to inform that underlying disk was resized.
- Name of disk image is passed on standard input (`root`, `private`, `volatile`,
- or other). This is used starting with Qubes 4.0.
-
-Other Qrexec services installed by default:
-
-- `qubes.Backup` - store Qubes backup. The service receives location chosen by
- the user (one line, terminated by `\n`), the backup archive ([description of
- backup format](/doc/BackupEmergencyRestoreV2/))
-- `qubes.DetachPciDevice` - service called in reaction to `qvm-pci -d` call on
- running VM. The service receives one word - BDF of device to detach. When the
- service call ends, the device will be detached
-- `qubes.Filecopy` - receive some files from other VM. Files sent in [qfile format](/doc/qfilecopy/)
-- `qubes.OpenInVM` - open a file in called VM. Service receives a single file on stdin (in
- [qfile format](/doc/qfilecopy/). After a file viewer/editor is terminated, if
- the file was modified, can be sent back (just raw content, without any
- headers); otherwise service should just terminate without sending anything.
- This service is used by both `qvm-open-in-vm` and `qvm-open-in-dvm` tools. When
- called in DispVM, service termination will trigger DispVM cleanup.
-- `qubes.Restore` - retrieve Qubes backup. The service receives backup location
- entered by the user (one line, terminated by `\n`), then should output backup
- archive in [qfile format](/doc/qfilecopy/) (core-agent-linux component contains
- `tar2qfile` utility to do the conversion)
-- `qubes.SelectDirectory`, `qubes.SelectFile` - services which should show
- file/directory selection dialog and return (to stdout) a single line
- containing selected path, or nothing in the case of cancellation
-- `qubes.SuspendPre` - service called in every VM with PCI device attached just
- before system suspend
-- `qubes.SuspendPost` - service called in every VM with PCI device attached just
- after system resume
-- `qubes.SyncNtpClock` - service called to trigger network time synchronization.
- Service should synchronize local VM time and terminate when done.
-- `qubes.WindowIconUpdater` - service called by VM to send icons of individual
- windows. The protocol there is simple one direction stream: VM sends window ID
- followed by icon in `qubes.GetImageRGBA` format, then next window ID etc. VM
- can send icon for the same window multiple times to replace previous one (for
- example for animated icons)
-- `qubes.VMShell` - call any command in the VM; the command(s) is passed one per line
- - `qubes.VMShell+WaitForSession` waits for full VM startup first
-- `qubes.VMExec` - call any command in the VM, without using shell, the command
- needs to be passed as argument and encoded as follows:
- - the executable name and arguments are separated by `+`
- - everything except alphanumeric characters, `.` and `_` needs to be
- escaped
- - bytes are escaped as `-HH` (where `HH` is hex code, capital letters only)
- - `-` itself can be escaped as `--`
- - example: to run `ls -a /home/user`, use
- `qubes.VMExec+ls+--a+-2Fhome-2Fuser`
-- `qubes.VMExecGUI` - a variant of `qubes.VMExec` that waits for full VM
- startup first
-
-Services called in GuiVM:
-
-- `policy.Ask`, `policy.Notify` - confirmation prompt and notifications for
-Qubes RPC calls, see [qrexec-policy implementation](/doc/qrexec-internals/#qrexec-policy-implementation)
-for a detailed description.
-
-Currently Qubes still calls few tools in VM directly, not using service
-abstraction. This will change in the future. Those tools are:
-
-- `/usr/lib/qubes/qubes-download-dom0-updates.sh` - script to download updates (or new packages to be installed) for dom0 (`qubes-dom0-update` tool)
-- `date -u -Iseconds` - called directly to retrieve time after calling `qubes.SyncNtpClock` service (`qvm-sync-clock` tool)
-- `nm-online -x` - called before `qubes.SyncNtpClock` service call by `qvm-sync-clock` tool
-- `resize2fs` - called to resize filesystem on /rw partition by `qvm-grow-private` tool
-- `gpk-update-viewer` - called by Qubes Manager to display available updates in a TemplateVM
-- `systemctl start qubes-update-check.timer` (and similarly stop) - called when enabling/disabling updates checking in given VM (`qubes-update-check` [qvm-service](/doc/qubes-service/))
-
-Additionally, automatic tests extensively run various commands directly in VMs. We do not plan to change that.
-
-## GUI protocol
-
-GUI initialization includes passing the whole screen dimensions from dom0 to VM. This will most likely be overwritten by qubes.SetMonitorLayout Qubes RPC call.
+---
\ No newline at end of file
diff --git a/developer/debugging/windows-debugging.md b/developer/debugging/windows-debugging.md
index 852d1c67f..d3f8b2fa2 100644
--- a/developer/debugging/windows-debugging.md
+++ b/developer/debugging/windows-debugging.md
@@ -6,257 +6,7 @@ redirect_from:
- /en/doc/windows-debugging/
- /doc/WindowsDebugging/
- /wiki/WindowsDebugging/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/debugging/windows-debugging.html
ref: 50
title: Windows debugging
----
-
-Debugging Windows code can be tricky in a virtualized environment. The guide below assumes Xen hypervisor and Windows 7 VMs.
-
-User-mode debugging is usually straightforward if it can be done on one machine. Just duplicate your normal debugging environment in the VM.
-
-Things get complicated if you need to perform kernel debugging or troubleshoot problems that only manifest on system boot, user logoff or similar. For that you need two Windows VMs: the *host* and the *target*. The *host* will contain [WinDbg](https://msdn.microsoft.com/en-us/library/windows/hardware/ff551063(v=vs.85).aspx) installation, your source code and private symbols. The *target* will run the code being debugged. Both will be linked by virtual serial ports.
-
-- First, you need to prepare separate copies of both *target* and *host* VM configuration files with some changes. Copy the files from **/var/lib/qubes/appvms/vmname/vmname.conf** to some convenient location, let's call them **host.conf** and **target.conf**.
-- In both copied files add the following line at the end: `serial = 'pty'`. This will make Xen connect VM's serial ports to dom0's ptys.
-- From now on you need to start both VMs like this: `qvm-start --custom-config=/your/edited/host.conf host`
-- To connect both VM serial ports together you will either need [socat](http://www.dest-unreach.org/socat/) or a custom utility described later.
-- To determine which dom0 pty corresponds to VM's serial port you need to read xenstore, example script below:
-
-```bash
-#!/bin/sh
-
-id1=$(xl domid "$1-dm")
-tty1=$(xenstore-read /local/domain/${id1}/device/console/3/tty)
-echo $tty1
-```
-
-Pass it a running VM name and it will output the corresponding pty name.
-
-- To connect both ptys you can use [socat](http://www.dest-unreach.org/socat/) like that:
-
-```bash
-#!/bin/sh
-
-id1=$(xl domid "$1-dm")
-id2=$(xl domid "$2-dm")
-tty1=$(xenstore-read /local/domain/${id1}/device/console/3/tty)
-tty2=$(xenstore-read /local/domain/${id2}/device/console/3/tty)
-socat $tty1,raw $tty2,raw
-```
-
-...but there is a catch. Xen seems to process the traffic that goes through serial ports and changes all **0x0a** bytes into **0x0d, 0x0a** pairs (newline conversion). I didn't find a way to turn that off (setting ptys to raw mode didn't change anything) and it's not mentioned anywhere on the Internet, so maybe it's something on my system. If the above script works for you then you don't need anything more in dom0.
-
-- On the *target* system, run `bcdedit /set debug on` on the console to turn on kernel debugging. It defaults to the first serial port.
-- On the *host* system, install [WinDbg](http://msdn.microsoft.com/en-us/library/windows/hardware/ff551063(v=vs.85).aspx) and start the kernel debug (Ctrl-K), choose **com1** as the debug port.
-- Reboot the *target* VM.
-- Run the above shell script in dom0.
-- If everything is fine you should see the proper kernel debugging output in WinDbg. However, if you see something like that:
-
- ~~~
- Opened \\.\com1
- Waiting to reconnect...
- Connected to Windows 7 7601 x64 target at (Wed Mar 19 20:35:43.262 2014 (UTC + 1:00)), ptr64 TRUE
- Kernel Debugger connection established.
- Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols
- Executable search path is:
- ... Retry sending the same data packet for 64 times.
- The transport connection between host kernel debugger and target Windows seems lost.
- please try resync with target, recycle the host debugger, or reboot the target Windows.
- Unable to read KTHREAD address fffff8000281ccc0
- **************************************************************************
- Unable to read debugger data block header
- **************************************************************************
- Unable to read KTHREAD address fffff8000281ccc0
- Unable to read PsLoadedModuleList
- Unable to read KTHREAD address fffff8000281ccc0
- **************************************************************************
- Unable to read debugger data block header
- **************************************************************************
- ~~~
-
- ...then you're most likely a victim of the CRLF issue mentioned above. To get around it I wrote a small utility that basically does what socat would do and additionally corrects those replaced bytes in the stream. It's not pretty but it works:
-
-```c
-#include
-#include
-#include
-#include
-
-int fd1, fd2;
-char mark = ' ';
-
-void out(unsigned char c)
-{
- static int count = 0;
- static unsigned char buf[17] = {0};
-
- // relay to ouptput port
- write(fd2, &c, 1);
- fprintf(stderr, "%c", mark);
-
- /* dump all data going over the line
- if (count == 0)
- fprintf(stderr, "%c", mark);
- fprintf(stderr, "%02x ", c);
- if (c >= 0x20 && c < 0x80)
- buf[count] = c;
- else
- buf[count] = '.';
- count++;
- if (count == 0x10)
- {
- count = 0;
- fprintf(stderr, " %s\n", buf);
- }
- */
-}
-
-int main(int argc, char* argv[])
-{
- unsigned char c = 0;
- struct termios tio;
- ssize_t size;
-
- if (argc < 3)
- {
- fprintf(stderr, "Usage: %s pty1 pty2 [mark character]\n", argv[0]);
- return EINVAL;
- }
-
- fd1 = open(argv[1], O_RDONLY | O_NOCTTY);
- if (fd1 <= 0)
- {
- perror("open fd1");
- return errno;
- }
- fd2 = open(argv[2], O_WRONLY | O_NOCTTY);
- if (fd2 <= 0)
- {
- perror("open fd2");
- return errno;
- }
-/*
- // This doesn't make any difference which supports the theory
- // that it's Xen who corrupts the byte stream.
- cfmakeraw(&tio);
- if (tcsetattr(fd1, TCSANOW, &tio) < 0)
- {
- perror("tcsetattr 1");
- return errno;
- }
- if (tcsetattr(fd2, TCSANOW, &tio) < 0)
- {
- perror("tcsetattr 2");
- return errno;
- }
-*/
- if (argc == 4)
- mark = argv[3][0];
-
- while (1)
- {
- size = read(fd1, &c, 1);
- if (size <= 0)
- break;
-
-parse:
- if (c == 0x0d)
- {
- size = read(fd1, &c, 1);
- if (size <= 0)
- {
- out(0x0d);
- break;
- }
- if (c == 0x0a)
- {
- out(0x0a);
- }
- else
- {
- out(0x0d);
- goto parse;
- }
- }
- else
- out(c);
- }
-
- close(fd1);
- close(fd2);
- return 0;
-}
-```
-
-> This utility is a unidirectional relay so you need to run two instances to get duplex communication, like:
->
-> #!/bin/sh
->
-> id1=$(xl domid "$1-dm")
-> id2=$(xl domid "$2-dm")
-> tty1=$(xenstore-read /local/domain/${id1}/device/console/3/tty)
-> tty2=$(xenstore-read /local/domain/${id2}/device/console/3/tty)
-> ./ptycrlf ${tty1} ${tty2} - &
-> ./ptycrlf ${tty2} ${tty1} + &
-
-> With this everything should be good:
->
-> ~~~
-> Opened \\.\com1
-> Waiting to reconnect...
-> Connected to Windows 7 7601 x64 target at (Wed Mar 19 20:56:31.371 2014 (UTC + 1:00)), ptr64 TRUE
-> Kernel Debugger connection established.
-> Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols
-> Executable search path is:
-> Windows 7 Kernel Version 7601 MP (1 procs) Free x64
-> Built by: 7601.18247.amd64fre.win7sp1_gdr.130828-1532
-> Machine Name:
-> Kernel base = 0xfffff800`0261a000 PsLoadedModuleList = 0xfffff800`0285d6d0
-> System Uptime: not available
-> ~~~
-
-# Debugging HVMs in the Qubes R4.0
-
-There are two main issues to be adopted to get all things to work in the R4.0.
-
-## Add a virtual serial port
-
-Qemu in the stub domain with virtual serial port added in a recommended way (``````) fails to start (Could not open '/dev/hvc1': No such device). It seems like a lack of multiple xen consoles support/configuration. The only way that I have found is to attach serial port explicitly to the available console.
-
-1. Unpack stub domain in dom0:
-
-```shell_session
-$ mkdir stubroot
-$ cp /usr/lib/xen/boot/stubdom-linux-rootfs stubroot/stubdom-linux-rootfs.gz
-$ cd stubroot
-$ gunzip stubdom-linux-rootfs.gz
-$ cpio -i -d -H newc --no-absolute-filenames < stubdom-linux-rootfs
-$ rm stubdom-linux-rootfs
-```
-
-2. Edit Init script to remove last loop and to add "-serial /dev/hvc0" to the qemu command line.
-
-3. Apply changes:
-
-```shell_session
-$ find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../stubdom-linux-rootfs
-$ sudo mv ../stubdom-linux-rootfs /usr/lib/xen/boot
-```
-
-## Connect two consoles
-
-Run the following script:
-
-```shell
-debugname1=win7new
-debugname2=win7dbg
-id1=$(xl domid "$debugname1-dm")
-id2=$(xl domid "$debugname2-dm")
-
-tty1=$(xenstore-read /local/domain/${id1}/console/tty)
-tty2=$(xenstore-read /local/domain/${id1}/console/tty)
-
-socat $tty1,raw $tty2,raw
-```
-
-Happy debugging!
+---
\ No newline at end of file
diff --git a/developer/general/continuous-integration.md b/developer/general/continuous-integration.md
index 9c00390c9..0d64a8b89 100644
--- a/developer/general/continuous-integration.md
+++ b/developer/general/continuous-integration.md
@@ -2,38 +2,6 @@
lang: en
layout: doc
permalink: /doc/continuous-integration/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/continuous-integration.html
title: Continuous integration (CI)
----
-
-This page explains the [continuous integration
-(CI)](https://en.wikipedia.org/wiki/Continuous_integration) infrastructure that
-the Qubes OS Project uses.
-
-## Website and documentation
-
-The following commands may be useful as a way to interact with our CI
-infrastructure on website
-([qubesos.github.io](https://github.com/QubesOS/qubesos.github.io)) and
-documentation ([qubes-doc](https://github.com/QubesOS/qubes-doc)) pull requests
-(PRs). Note that special permissions may be required to use some of these
-commands. These commands are generally issued by adding a comment to a PR
-containing only the command.
-
-- `PipelineRetry`: Attempts to run the entire build pipeline over again. This
- can be useful if CI incorrectly uses a stale branch instead of testing the PR
- as if it were merged into `master`.
-
-- `PipelineRetryFailed`: Retry just failed CI jobs. Do not update the branch.
-
-- `PipelineRefresh`: Like `PipelineRetry`, except it only fetches the job status
- from GitLab. It doesn't schedule a new build.
-
-- `TestDeploy`: Deploys a test website, which is a live version of the Qubes
- website as if this PR had been merged. This can be useful for previewing a PR
- on a live public website. **Note:** You must wait for the site to finish
- building before issuing this command, or else it will deploy an empty
- website. To find the URL of the test website, look for text similar to "This
- branch was successfully deployed" and a button named something like "View
- deployment." Note that there are two different testing sites: `wwwtest` is
- manually updated, whereas `wwwpreview` is managed by the `TestDeploy`
- command.
+---
\ No newline at end of file
diff --git a/developer/general/devel-books.md b/developer/general/devel-books.md
index d7ae9ae07..259ebb151 100644
--- a/developer/general/devel-books.md
+++ b/developer/general/devel-books.md
@@ -6,26 +6,7 @@ redirect_from:
- /en/doc/devel-books/
- /doc/DevelBooks/
- /wiki/DevelBooks/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/devel-books.html
ref: 32
title: Developer books
----
-
-Below is a list of various books that might be useful in learning some basics needed for Qubes development.
-
-- A must-read about Xen internals:
- - _[The Definitive Guide to the Xen Hypervisor](https://www.amazon.com/Definitive-Guide-Xen-Hypervisor/dp/013234971X)_, by David Chisnall
-
-- Some good books about the Linux kernel:
- - _[Linux Kernel Development](https://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672329468)_, by Robert Love
- - _[Linux Device Drivers](https://www.amazon.com/Linux-Device-Drivers-Jonathan-Corbet/dp/0596005903)_, by Jonathan Corbet
-
-- Solid intro into Trusted Computing:
- - _[Dynamics of a Trusted Platform](https://www.amazon.com/Dynamics-Trusted-Platform-Buildin-Grawrock/dp/1934053082)_, by David Grawrock (original Intel architect for TXT)
-
-- Good book about GIT:
- - _[Pro Git](https://git-scm.com/book/en/v2)_, by Scott Chacon and Ben Straub (complete book available free online)
-
-- Useful books about Python:
- - _[Programming in Python 3](http://www.qtrac.eu/py3book.html)_, by Mark Summerfield
- - _[Rapid GUI Programming with Python and Qt](http://www.qtrac.eu/pyqtbook.html)_, by Mark Summerfield
- (Although note that [Qt is being replaced by GTK](/doc/usability-ux/#gnome-kde-and-xfce) in Qubes code.)
+---
\ No newline at end of file
diff --git a/developer/general/documentation-style-guide.md b/developer/general/documentation-style-guide.md
index 450640746..d1126b752 100644
--- a/developer/general/documentation-style-guide.md
+++ b/developer/general/documentation-style-guide.md
@@ -7,439 +7,7 @@ redirect_from:
- /en/doc/doc-guidelines/
- /wiki/DocStyle/
- /doc/DocStyle/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/documentation-style-guide.html
ref: 30
title: Documentation style guide
----
-
-_Also see [how to edit the documentation](/doc/how-to-edit-the-documentation/)._
-
-Qubes OS documentation pages are stored as plain text Markdown files in the
-[qubes-doc](https://github.com/QubesOS/qubes-doc) repository. By cloning and
-regularly pulling from this repo, users can maintain their own up-to-date
-offline copy of all Qubes documentation rather than relying solely on the web.
-
-The documentation is a volunteer community effort. People like you are
-constantly working to make it better. If you notice something that can be fixed
-or improved, please [edit the
-documentation](/doc/how-to-edit-the-documentation/)!
-
-This page explains the standards we follow for writing, formatting, and
-organizing the documentation. Please follow these guidelines and conventions
-when editing the documentation. For the standards governing the website as a
-whole, please see the [website style guide](/doc/website-style-guide).
-
-## Markdown conventions
-
-All the documentation is written in Markdown for maximum accessibility. When
-making contributions, please observe the following style conventions. If you're
-not familiar with Markdown syntax,
-[this](https://daringfireball.net/projects/markdown/) is a great resource.
-
-### Hyperlink syntax
-
-Use non-reference-style links like `[website](https://example.com/)`. Do *not*
-use reference-style links like `[website][example]`, `[website][]` or
-`[website]`. This facilitates the localization process.
-
-### Relative vs. absolute links
-
-Always use relative rather than absolute paths for internal website links. For
-example, use `/doc/documentation-style-guide/` instead of
-`https://www.qubes-os.org/doc/documentation-style-guide/`.
-
-You may use absolute URLs in the following cases:
-
-- External links
-- URLs that appear inside code blocks (e.g., in comments and document
- templates, and the plain text reproductions of [QSBs](/security/qsb/) and
- [Canaries](/security/canary/)), since they're not hyperlinks
-- Git repo files like `README.md` and `CONTRIBUTING.md`, since they're not part
- of the website itself but rather of the auxiliary infrastructure supporting
- the website
-
-This rule is important because using absolute URLs for internal website links
-breaks:
-
-- Serving the website offline
-- Website localization
-- Generating offline documentation
-- Automatically redirecting Tor Browser visitors to the correct page on the
- onion service mirror
-
-### Image linking
-
-See [how to add images](/doc/how-to-edit-the-documentation/#how-to-add-images)
-for the required syntax. This will make the image a hyperlink to the image
-file, allowing the reader to click on the image in order to view the full image
-by itself. This is important. Following best practices, our website has a
-responsive design, which allows the website to render appropriately across all
-screen sizes. When viewing this page on a smaller screen, such as on a mobile
-device, the image will automatically shrink down to fit the screen. If visitors
-cannot click on the image to view it in full size, then, depending on their
-device, they may have no way see the details in the image clearly.
-
-In addition, make sure to link only to images in the
-[qubes-attachment](https://github.com/QubesOS/qubes-attachment) repository. Do
-not attempt to link to images hosted on other websites.
-
-### HTML and CSS
-
-Do not write HTML inside Markdown documents (except in rare, unavoidable cases,
-such as alerts). In particular, never include HTML or CSS for styling,
-formatting, or white space control. That belongs in the (S)CSS files instead.
-
-### Headings
-
-Do not use `h1` headings (single `#` or `======` underline). These are
-automatically generated from the `title:` line in the YAML front matter.
-
-Use Atx-style syntax for headings: `##h2`, `### h3`, etc. Do not use
-underlining syntax (`-----`).
-
-### Indentation
-
-Use spaces instead of tabs. Use hanging indentations where appropriate.
-
-### Lists
-
-If appropriate, make numerals in numbered lists match between Markdown source
-and HTML output. Some users read the Markdown source directly, and this makes
-numbered lists easier to follow.
-
-### Code blocks
-
-When writing code blocks, use [syntax
-highlighting](https://github.github.com/gfm/#info-string) where possible (see
-[here](https://github.com/jneen/rouge/wiki/List-of-supported-languages-and-lexers)
-for a list of supported languages). Use `[...]` for anything omitted.
-
-### Line wrapping
-
-Hard wrap Markdown lines at 80 characters, unless the line can't be broken
-(e.g., code or a URL).
-
-## Writing guidelines
-
-### Correct use of terminology
-
-Familiarize yourself with the terms defined in the [glossary](/doc/glossary/).
-Use these terms consistently and accurately throughout your writing.
-
-### Sentence case in headings
-
-Use sentence case (rather than title case) in headings for the reasons
-explained
-[here](https://www.sallybagshaw.com.au/articles/sentence-case-v-title-case/).
-In particular, since the authorship of the Qubes documentation is decentralized
-and widely distributed among users from around the world, many contributors
-come from regions with different conventions for implementing title case, not
-to mention that there are often differing style guide recommendations even
-within a single region. It is much easier for all of us to implement sentence
-case consistently across our growing body of pages, which is very important for
-managing the ongoing maintenance burden and sustainability of the
-documentation.
-
-### Writing command-line examples
-
-When providing command-line examples:
-
-- Tell the reader where to open a terminal (dom0 or a specific domU), and show
- the command along with its output (if any) in a code block, e.g.:
-
- ~~~markdown
- Open a terminal in dom0 and run:
- ```shell_session
- $ cd test
- $ echo Hello
- Hello
- ```
- ~~~
-
-- Precede each command with the appropriate command prompt: At a minimum, the
- prompt should contain a trailing `#` (for the user `root`) or `$` (for other
- users) on Linux systems and `>` on Windows systems, respectively.
-
-- Don't try to add comments inside the code block. For example, *don't* do
- this:
-
- ~~~markdown
- Open a terminal in dom0 and run:
- ```shell_session
- # Navigate to the new directory
- $ cd test
- # Generate a greeting
- $ echo Hello
- Hello
- ```
- ~~~
-
- The `#` symbol preceding each comment is ambiguous with a root command
- prompt. Instead, put your comments *outside* of the code block in normal
- prose.
-
-### Variable names in commands
-
-Syntactically distinguish variables in commands. For example, this is
-ambiguous:
-
- $ qvm-run --dispvm=disposable-template --service qubes.StartApp+xterm
-
-It should instead be:
-
- $ qvm-run --dispvm= --service qubes.StartApp+xterm
-
-Note that we syntactically distinguish variables in three ways:
-
-1. Surrounding them in angled brackets (`< >`)
-2. Using underscores (`_`) instead of spaces between words
-3. Using all capital letters
-
-We have observed that many novices make the mistake of typing the surrounding
-angled brackets (`< >`) on the command line, even after substituting the
-desired real value between them. Therefore, in documentation aimed at novices,
-we also recommend clarifying that the angled brackets should not be typed. This
-can be accomplished in one of several ways:
-
-- Explicitly say something like "without the angled brackets."
-- Provide an example command using real values that excludes the angled
- brackets.
-- If you know that almost all users will want to use (or should use) a specific
- command containing all real values and no variables, you might consider
- providing exactly that command and forgoing the version with variables.
- Novices may not realize which parts of the command they can substitute with
- different values, but if you've correctly judged that they should use the
- command you've provided as is, then this shouldn't matter.
-
-## Organizational guidelines
-
-### Do not duplicate documentation
-
-Duplicating documentation is almost always a bad idea. There are many reasons
-for this. The main one is that almost all documentation has to be updated as
-some point. When similar documentation appears in more than one place, it is
-very easy for it to get updated in one place but not the others (perhaps
-because the person updating it doesn't realize it's in more than once place).
-When this happens, the documentation as a whole is now inconsistent, and the
-outdated documentation becomes a trap, especially for novice users. Such traps
-are often more harmful than if the documentation never existed in the first
-place. The solution is to **link** to existing documentation rather than
-duplicating it. There are some exceptions to this policy (e.g., information
-that is certain not to change for a very long time), but they are rare.
-
-### Core vs. external documentation
-
-Core documentation resides in the [Qubes OS Project's official
-repositories](https://github.com/QubesOS/), mainly in
-[qubes-doc](https://github.com/QubesOS/qubes-doc). External documentation can
-be anywhere else (such as forums, community websites, and blogs), but there is
-an especially large collection in the [Qubes
-Community](https://github.com/Qubes-Community) project. External documentation
-should not be submitted to [qubes-doc](https://github.com/QubesOS/qubes-doc).
-If you've written a piece of documentation that is not appropriate for
-[qubes-doc](https://github.com/QubesOS/qubes-doc), we encourage you to submit
-it to the [Qubes Community](https://github.com/Qubes-Community) project
-instead. However, *linking* to external documentation from
-[qubes-doc](https://github.com/QubesOS/qubes-doc) is perfectly fine. Indeed,
-the maintainers of the [Qubes Community](https://github.com/Qubes-Community)
-project should regularly submit PRs against the documentation index (see [How
-to edit the documentation
-index](/doc/how-to-edit-the-documentation/#how-to-edit-the-documentation-index))
-to add and update Qubes Community links in the ["External
-documentation"](/doc/#external-documentation) section of the documentation
-table of contents.
-
-The main difference between **core** (or **official**) and **external** (or
-**community** or **unofficial**) documentation is whether it documents software
-that is officially written and maintained by the Qubes OS Project. The purpose
-of this distinction is to keep the core docs maintainable and high-quality by
-limiting them to the software output by the Qubes OS Project. In other words,
-we take responsibility for documenting all of the software we put out into the
-world, but it doesn't make sense for us to take on the responsibility of
-documenting or maintaining documentation for anything else. For example, Qubes
-OS may use a popular Linux distribution for an official
-[TemplateVM](/doc/templates/). However, it would not make sense for a
-comparatively small project like ours, with modest funding and a lean
-workforce, to attempt to document software belonging to a large, richly-funded
-project with an army of paid and volunteer contributors, especially when they
-probably already have documentation of their own. This is particularly true
-when it comes to Linux in general. Although many users who are new to Qubes are
-also new to Linux, it makes absolutely no sense for our comparatively tiny
-project to try to document Linux in general when there is already a plethora of
-documentation out there.
-
-Many contributors do not realize that there is a significant amount of work
-involved in *maintaining* documentation after it has been written. They may
-wish to write documentation and submit it to the core docs, but they see only
-their own writing process and fail to consider that it will have to be kept
-up-to-date and consistent with the rest of the docs for years afterward.
-Submissions to the core docs also have to [undergo a review
-process](/doc/how-to-edit-the-documentation/#security) to ensure accuracy before
-being merged, which takes up valuable time from the team. We aim to maintain
-high quality standards for the core docs (style and mechanics, formatting),
-which also takes up a lot of time. If the documentation involves anything
-external to the Qubes OS Project (such as a website, platform, program,
-protocol, framework, practice, or even a reference to a version number), the
-documentation is likely to become outdated when that external thing changes.
-It's also important to periodically review and update this documentation,
-especially when a new Qubes release comes out. Periodically, there may be
-technical or policy changes that affect all the core documentation. The more
-documentation there is relative to maintainers, the harder all of this will be.
-Since there are many more people who are willing to write documentation than to
-maintain it, these individually small incremental additions amount to a
-significant maintenance burden for the project.
-
-On the positive side, we consider the existence of community documentation to
-be a sign of a healthy ecosystem, and this is quite common in the software
-world. The community is better positioned to write and maintain documentation
-that applies, combines, and simplifies the official documentation, e.g.,
-tutorials that explain how to install and use various programs in Qubes, how to
-create custom VM setups, and introductory tutorials that teach basic Linux
-concepts and commands in the context of Qubes. In addition, just because the
-Qubes OS Project has officially written and maintains some flexible framework,
-such as `qrexec`, it does not make sense to include every tutorial that says
-"here's how to do something cool with `qrexec`" in the core docs. Such
-tutorials generally also belong in the community documentation.
-
-See [#4693](https://github.com/QubesOS/qubes-issues/issues/4693) for more
-background information.
-
-### Release-specific documentation
-
-*See [#5308](https://github.com/QubesOS/qubes-issues/issues/5308) for pending
-changes to this policy.*
-
-We maintain only one set of documentation for Qubes OS. We do not maintain a
-different set of documentation for each release of Qubes. Our single set of
-Qubes OS documentation is updated on a continual, rolling basis. Our first
-priority is to document all **current, stable releases** of Qubes. Our second
-priority is to document the next, upcoming release (if any) that is currently
-in the beta or release candidate stage.
-
-In cases where a documentation page covers functionality that differs
-considerably between Qubes OS releases, the page should be subdivided into
-clearly-labeled sections that cover the different functionality in different
-releases (examples below).
-
-In general, avoid mentioning specific Qubes versions in the body text of
-documentation, as these references rapidly go out of date and become misleading
-to readers.
-
-#### Incorrect Example
-
-```
-## How to Foo
-
-Fooing is the process by which one foos. There are both general and specific
-versions of fooing, which vary in usefulness depending on your goals, but for
-the most part, all fooing is fooing.
-
-To foo in Qubes 3.2:
-
- $ qvm-foo
-
-Note that this does not work in Qubes 4.0, where there is a special widget
-for fooing, which you can find in the lower-right corner of the screen in
-the Foo Manager. Alternatively, you can use the more general `qubes-baz`
-command introduced in 4.0:
-
- $ qubes-baz --foo
-
-Once you foo, make sure to close the baz before fooing the next bar.
-```
-
-#### Correct Example
-
-```
-## Qubes 3.2
-
-### How to Foo
-
-Fooing is the process by which one foos. There are both general and specific
-versions of fooing, which vary in usefulness depending on your goals, but for
-the most part, all fooing is fooing.
-
-To foo:
-
- $ qvm-foo
-
-Once you foo, make sure to close the baz before fooing the next bar.
-
-## Qubes 4.0
-
-### How to Foo
-
-Fooing is the process by which one foos. There are both general and specific
-versions of fooing, which vary in usefulness depending on your goals, but for
-the most part, all fooing is fooing.
-
-There is a special widget for fooing, which you can find in the lower-right
-corner of the screen in the Foo Manager. Alternatively, you can use the
-general `qubes-baz` command:
-
- $ qubes-baz --foo
-
-Once you foo, make sure to close the baz before fooing the next bar.
-```
-
-Subdividing the page into clearly-labeled sections for each release has several
-benefits:
-
-- It preserves good content for older (but still supported) releases. Many
- documentation contributors are also people who prefer to use the latest
- release. Many of them are tempted to *replace* existing content that applies
- to an older, supported release with content that applies only to the latest
- release. This is somewhat understandable. Since they only use the latest
- release, they may be focused on their own experience, and they may even
- regard the older release as deprecated, even when it's actually still
- supported. However, allowing this replacement of content would do a great
- disservice to those who still rely on the older, supported release. In many
- cases, these users value the stability and reliability of the older,
- supported release. With the older, supported release, there has been more
- time to fix bugs and make improvements in both the software and the
- documentation. Consequently, much of the documentation content for this
- release may have gone through several rounds of editing, review, and
- revision. It would be a tragedy for this content to vanish while the very set
- of users who most prize stability and reliability are depending on it.
-- It's easy for readers to quickly find the information they're looking for,
- since they can go directly to the section that applies to their release.
-- It's hard for readers to miss information they need, since it's all in one
- place. In the incorrect example, information that the reader needs could be
- in any paragraph in the entire document, and there's no way to tell without
- reading the entire page. In the correct example, the reader can simply skim
- the headings in order to know which parts of the page need to be read and
- which can be safely ignored. The fact that some content is repeated in the
- two release-specific sections is not a problem, since no reader has to read
- the same thing twice. Moreover, as one release gets updated, it's likely that
- the documentation for that release will also be updated. Therefore, content
- that is initially duplicated between release-specific sections will not
- necessarily stay that way, and this is a good thing: We want the
- documentation for a release that *doesn't* change to stay the same, and we
- want the documentation for a release that *does* change to change along with
- the software.
-- It's easy for documentation contributors and maintainers to know which file
- to edit and update, since there's only one page for all Qubes OS releases.
- Initially creating the new headings and duplicating content that applies to
- both is only a one-time cost for each page, and many pages don't even require
- this treatment, since they apply to all currently-supported Qubes OS
- releases.
-
-By contrast, an alternative approach, such as segregating the documentation
-into two different branches, would mean that contributions that apply to both
-Qubes releases would only end up in one branch, unless someone remembered to
-manually submit the same thing to the other branch and actually made the effort
-to do so. Most of the time, this wouldn't happen. When it did, it would mean a
-second pull request that would have to be reviewed. Over time, the different
-branches would diverge in non-release-specific content. Good general content
-that was submitted only to one branch would effectively disappear once that
-release was deprecated. (Even if it were still on the website, no one would
-look at it, since it would explicitly be in the subdirectory of a deprecated
-release, and there would be a motivation to remove it from the website so that
-search results wouldn't be populated with out-of-date information.)
-
-For further discussion about release-specific documentation in Qubes, see
-[here](https://groups.google.com/d/topic/qubes-users/H9BZX4K9Ptk/discussion).
-
-## Git conventions
-
-Please follow our [Git commit message
-guidelines](/doc/coding-style/#commit-message-guidelines).
+---
\ No newline at end of file
diff --git a/developer/general/gsoc.md b/developer/general/gsoc.md
index 9e4adad31..cb50d0ea1 100644
--- a/developer/general/gsoc.md
+++ b/developer/general/gsoc.md
@@ -4,657 +4,7 @@ layout: doc
permalink: /gsoc/
redirect_from:
- /GSoC/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/gsoc.html
ref: 33
title: Google Summer of Code (GSoC)
----
-
-## Information for Students
-
-Thank you for your interest in participating in the [Google Summer of Code program](https://summerofcode.withgoogle.com/) with the [Qubes OS team](/team/). You can read more about the Google Summer of Code program at the [official website](https://summerofcode.withgoogle.com/) and the [official FAQ](https://developers.google.com/open-source/gsoc/faq).
-
-Being accepted as a Google Summer of Code contributor is quite competitive. If you are interested in participating in the Summer of Code please be aware that you must be able to produce code for Qubes OS for 3-5 months. Your mentors, Qubes developers, will dedicate a portion of their time towards mentoring you. Therefore, we seek candidates who are committed to helping Qubes long-term and are willing to do quality work and be proactive in communicating with your mentor.
-
-You don't have to be a proven developer -- in fact, this whole program is meant to facilitate joining Qubes and other free and open source communities. The Qubes community maintains information about [contributing to Qubes development](/doc/contributing/#contributing-code) and [how to send patches](/doc/source-code/#how-to-send-patches). In order to contribute code to the Qubes project, you must be able to [sign your code](/doc/code-signing/).
-
-You should start learning the components that you plan on working on before the start date. Qubes developers are available on the [mailing lists](/support/#qubes-devel) for help. The GSoC timeline reserves a lot of time for bonding with the project -- use that time wisely. Good communication is key, you should plan to communicate with your team daily and formally report progress and plans weekly. Students who neglect active communication will be failed.
-
-### Overview of Steps
-
-- Join the [qubes-devel list](/support/#qubes-devel) and introduce yourself, and meet your fellow developers
-- Read [Google's instructions for participating](https://developers.google.com/open-source/gsoc/) and the [GSoC Student Manual](https://google.github.io/gsocguides/student/)
-- Take a look at the list of ideas below
-- Come up with a project that you are interested in (and feel free to propose your own! Don't feel limited by the list below.)
-- Read the Contributor Proposal guidelines below
-- Write a first draft proposal and send it to the qubes-devel mailing list for review
-- Submit proposal using [Google's web interface](https://summerofcode.withgoogle.com/) ahead of the deadline (this requires a Google Account!)
-- Submit proof of enrollment well ahead of the deadline
-
-Coming up with an interesting idea that you can realistically achieve in the time available to you (one summer) is probably the most difficult part. We strongly recommend getting involved in advance of the beginning of GSoC, and we will look favorably on applications from prospective contributors who have already started to act like free and open source developers.
-
-Before the summer starts, there are some preparatory tasks which are highly encouraged. First, if you aren't already, definitely start using Qubes as your primary OS as soon as possible! Also, it is encouraged that you become familiar and comfortable with the Qubes development workflow sooner than later. A good way to do this (and also a great way to stand out as an awesome applicant and make us want to accept you!) might be to pick up some issues from [qubes-issues](https://github.com/QubesOS/qubes-issues/issues) (our issue-tracking repo) and submit some patches addressing them. Some suitable issues might be those with tags ["help wanted" and "P: minor"](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aissue%20is%3Aopen%20label%3A%22P%3A%20minor%22%20label%3A%22help%20wanted%22) (although more significant things are also welcome, of course). Doing this will get you some practice with [qubes-builder](/doc/qubes-builder/), our code-signing policies, and some familiarity with our code base in general so you are ready to hit the ground running come summer.
-
-### Contributor proposal guidelines
-
-A project proposal is what you will be judged upon. Write a clear proposal on what you plan to do, the scope of your project, and why we should choose you to do it. Proposals are the basis of the GSoC projects and therefore one of the most important things to do well.
-
-Below is the application template:
-
-```
-# Introduction
-
-Every software project should solve a problem. Before offering the solution (your Google Summer of Code project), you should first define the problem. What’s the current state of things? What’s the issue you wish to solve and why? Then you should conclude with a sentence or two about your solution. Include links to discussions, features, or bugs that describe the problem further if necessary.
-
-# Project goals
-
-Be short and to the point, and perhaps format it as a list. Propose a clear list of deliverables, explaining exactly what you promise to do and what you do not plan to do. “Future developments” can be mentioned, but your promise for the Google Summer of Code term is what counts.
-
-# Implementation
-
-Be detailed. Describe what you plan to do as a solution for the problem you defined above. Include technical details, showing that you understand the technology. Illustrate key technical elements of your proposed solution in reasonable detail.
-
-# Timeline
-
-Show that you understand the problem, have a solution, have also broken it down into manageable parts, and that you have a realistic plan on how to accomplish your goal. Here you set expectations, so don’t make promises you can’t keep. A modest, realistic and detailed timeline is better than promising the impossible.
-
-If you have other commitments during GSoC, such as a job, vacation, exams, internship, seminars, or papers to write, disclose them here. GSoC should be treated like a full-time job, and we will expect approximately 40 hours of work per week. If you have conflicts, explain how you will work around them. If you are found to have conflicts which you did not disclose, you may be failed.
-
-Open and clear communication is of utmost importance. Include your plans for communication in your proposal; daily if possible. You will need to initiate weekly formal communications such as a detailed email to the qubes-devel mailing list. Lack of communication will result in you being failed.
-
-# About me
-
-Provide your contact information and write a few sentences about you and why you think you are the best for this job. Prior contributions to Qubes are helpful; list your commits. Name people (other developers, students, professors) who can act as a reference for you. Mention your field of study if necessary. Now is the time to join the relevant mailing lists. We want you to be a part of our community, not just contribute your code.
-
-Tell us if you are submitting proposals to other organizations, and whether or not you would choose Qubes if given the choice.
-
-Other things to think about:
-* Are you comfortable working independently under a supervisor or mentor who is several thousand miles away, and perhaps 12 time zones away? How will you work with your mentor to track your work? Have you worked in this style before?
-* If your native language is not English, are you comfortable working closely with a supervisor whose native language is English? What is your native language, as that may help us find a mentor who has the same native language?
-* After you have written your proposal, you should get it reviewed. Do not rely on the Qubes mentors to do it for you via the web interface, although we will try to comment on every proposal. It is wise to ask a colleague or a developer to critique your proposal. Clarity and completeness are important.
-```
-
-## Project Ideas
-
-These project ideas were contributed by our developers and may be incomplete. If you are interested in submitting a proposal based on these ideas, you should contact the [qubes-devel mailing list](/support/#qubes-devel) and associated GitHub issue to learn more about the idea.
-
-```
-### Adding a Proposal
-
-**Project**: Something that you're totally excited about
-
-**Brief explanation**: What is the project, where does the code live?
-
-**Expected results**: What is the expected result in the timeframe given
-
-**Difficulty**: easy / medium / hard
-
-**Knowledge prerequisite**: Pre-requisites for working on the project. What coding language and knowledge is needed?
-If applicable, links to more information or discussions
-
-**Size of the project**: either 175 hours (medium) or 350 hours (large)
-
-**Mentor**: Name and email address.
-
-```
-
-### Qubes as a Vagrant provider
-
-**Project**: Qubes as a Vagrant provider
-
-**Brief explanation**: Currently using Vagrant on Qubes requires finding an image that uses Docker as isolation provider and running Docker in a qube, or downloading the Vagrantfile and manually setting up a qube according to the Vagrantfile. This project aims at simplifying this workflow. Since introduction of Admin API, it's possible for a qube to provision another qube - which is exactly what is needed for Vagrant. [Related discussion](https://groups.google.com/d/msgid/qubes-devel/535299ca-d16a-4a70-8223-a4ac6be4be41%40googlegroups.com)
-
-**Expected results**:
-
-- Design how Vagrant Qubes provider should look like, including:
- - [box format](https://www.vagrantup.com/docs/plugins/providers.html#box-format)
- - method for running commands inside (ssh vs qvm-run)
-- Write a Vagrant provider able to create/start/stop/etc a VM
-- Document how to configure and use the provider, including required qrexec policy changes and possibly firewall rules
-- Write integration tests
-
-**Difficulty**: medium
-
-**Knowledge prerequisite**:
-
-- Ruby
-- Vagrant concepts
-
-**Size of the project**: 350 hours
-
-**Mentor**: [Wojtek Porczyk](/team/), [Marek Marczykowski-Górecki](/team/)
-
-### System health monitor
-
-**Project**: System health monitor
-
-**Brief explanation**: A tool that informs the user about common system and configuration issues. Some of this is already available, but scattered across different places. See related issues: [6663](https://github.com/QubesOS/qubes-issues/issues/6663), [2134](https://github.com/QubesOS/qubes-issues/issues/2134)
-
-**Expected results**:
-
-- a tool / service that checks for common issues and things needing user attention, for example:
- - some updates to be applied (separate widget already exists)
- - running out of disk space (separate widget already exists)
- - insecure USB configuration (USB in dom0)
- - some system VM crashed
- - ...
-
-- a GUI that provides terse overview of the system state, and notifies the user if something bad happens
-
-**Difficulty**: medium
-
-**Knowledge prerequisite**:
-
-- Python
-- basic knowledge about systemd services
-- PyGTK (optional)
-
-**Size of the project**: 350 hours
-
-**Mentor**: [Marta Marczykowska-Górecka](/team/)
-
-### Mechanism for maintaining in-VM configuration
-
-**Project**: Mechanism for maintaining in-VM configuration
-
-**Brief explanation**: Large number of VMs is hard to maintain. Templates helps with keeping them updated, but many applications have configuration in user home directory, which is not synchronized.
-
-**Expected results**:
-
-- Design a mechanism how to _safely_ synchronize application configuration living in user home directory (`~/.config`, some other "dotfiles"). Mechanism should be resistant against malicious VM forcing its configuration on other VMs. Some approach could be a strict control which VM can send what changes (whitelist approach, not blacklist).
-- Implementation of the above mechanism.
-- Documentation how to configure it securely.
-
-**Difficulty**: medium
-
-**Knowledge prerequisite**:
-
-- shell and/or python scripting
-- Qubes OS qrexec services
-
-**Size of the project**: 175 hours
-
-**Mentor**: [Frédéric Pierret](/team/)
-
-
-
-### Qubes Live USB
-
-**Project**: Revive Qubes Live USB, integrate it with installer
-
-**Brief explanation**: Qubes Live USB is based on Fedora tools to build live
-distributions. But for Qubes we need some adjustments: starting Xen instead of
-Linux kernel, smarter copy-on-write handling (we run there multiple VMs, so a
-lot more data to save) and few more. Additionally in Qubes 3.2 we have
-so many default VMs that default installation does not fit in 16GB image
-(default value) - some subset of those VMs should be chosen. Ideally we'd like
-to have just one image being both live system and installation image. More
-details: [#1552](https://github.com/QubesOS/qubes-issues/issues/1552),
-[#1965](https://github.com/QubesOS/qubes-issues/issues/1965).
-
-**Expected results**:
-
-- Adjust set of VMs and templates included in live edition.
-- Update and fix build scripts for recent Qubes OS version.
-- Update startup script to mount appropriate directories as either
- copy-on-write (device-mapper snapshot), or tmpfs.
-- Optimize memory usage: should be possible to run sys-net, sys-firewall, and
- at least two more VMs on 4GB machine. This include minimizing writes to
- copy-on-write layer and tmpfs (disable logging etc).
-- Research option to install the system from live image. If feasible add
- this option.
-
-**Difficulty**: hard
-
-**Knowledge prerequisite**:
-
-- System startup sequence: bootloaders (isolinux, syslinux, grub, UEFI), initramfs, systemd.
-- Python and Bash scripting
-- Filesystems and block devices: loop devices, device-mapper, tmpfs, overlayfs, sparse files.
-
-**Size of the project**: 350 hours
-
-**Mentor**: [Frédéric Pierret](/team/)
-
-
-
-### LogVM(s)
-
-**Project**: LogVM(s)
-
-**Brief explanation**: Qubes AppVMs do not have persistent /var (on purpose).
-It would be useful to send logs generated by various VMs to a dedicated
-log-collecting VM. This way logs will not only survive VM shutdown, but also be
-immune to altering past entries. See
-[#830](https://github.com/QubesOS/qubes-issues/issues/830) for details.
-
-**Expected results**:
-
-- Design a _simple_ protocol for transferring logs. The less metadata (parsed
- in log-collecting VM) the better.
-- Implement log collecting service. Besides logs itself, should save
- information about logs origin (VM name) and timestamp. The service should
- _not_ trust sending VM in any of those.
-- Implement log forwarder compatible with systemd-journald and rsyslog. A
- mechanism (service/plugin) fetching logs in real time from those and sending
- to log-collecting VM over qrexec service.
-- Document the protocol.
-- Write unit tests and integration tests.
-
-**Difficulty**: easy
-
-**Knowledge prerequisite**:
-
-- syslog
-- systemd
-- Python/Bash scripting
-
-**Size of the project**: 175 hours
-
-**Mentor**: [Frédéric Pierret](/team/)
-
-
-### Whonix IPv6 and nftables support
-
-**Project**: Whonix IPv6 and nftables support
-
-**Brief explanation**: [T509](https://phabricator.whonix.org/T509)
-
-**Expected results**:
-
-- Work at upstream Tor: An older version of [TransparentProxy](https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy) page was the origin of Whonix. Update that page for nftables / IPv6 support without mentioning Whonix. Then discuss that on the tor-talk mailing list for wider input. [here](https://trac.torproject.org/projects/tor/ticket/21397)
-- implement corridor feature request add IPv6 support / port to nftables - [issue](https://github.com/rustybird/corridor/issues/39)
-- port [whonix-firewall](https://github.com/Whonix/whonix-firewall) to nftables
-- make connections to IPv6 Tor relays work
-- make connections to IPv6 destinations work
-
-**Difficulty**: medium
-
-**Knowledge prerequisite**:
-
-- nftables
-- iptables
-- IPv6
-
-**Size of the project**: 175 hours
-
-**Mentor**: [Patrick Schleizer](/team/)
-
-
-### GUI agent for Windows 8/10
-**Project**: GUI agent for Windows 8/10
-
-**Brief explanation**: Add support for Windows 8+ to the Qubes GUI agent and video driver. Starting from Windows 8, Microsoft requires all video drivers to conform to the WDDM display driver model which is incompatible with the current Qubes video driver. Unfortunately the WDDM model is much more complex than the old XPDM one and officially *requires* a physical GPU device (which may be emulated). Some progress has been made to create a full WDDM driver that *doesn't* require a GPU device, but the driver isn't working correctly yet. Alternatively, WDDM model supports display-only drivers which are much simpler but don't have access to system video memory and rendering surfaces (a key feature that would simplify seamless GUI mode). [#1861](https://github.com/QubesOS/qubes-issues/issues/1861)
-
-**Expected results**: Working display-only WDDM video driver or significant progress towards making the full WDDM driver work correctly.
-
-**Difficulty**: hard
-
-**Knowledge prerequisite**: C/C++ languages, familiarity with Windows API, familiarity with the core Windows WDM driver model. Ideally familiarity with the WDDM display driver model.
-
-**Size of the project**: 175 hours
-
-**Mentor**: [Rafał Wojdyła](/team/)
-
-### GNOME support in dom0 / GUI VM
-
-**Project**: GNOME support in dom0
-
-**Brief explanation**: Integrating GNOME into Qubes dom0. This include:
-
-- patching window manager to add colorful borders
-- removing stuff not needed in dom0 (file manager(s), indexing services etc)
-- adjusting menu for easy navigation (same applications in different VMs and such problems, dom0-related entries in one place)
-- More info: [#1806](https://github.com/QubesOS/qubes-issues/issues/1806)
-
-**Expected results**:
-
-- Review existing support for other desktop environments (KDE, Xfce4, i3, awesome).
-- Patch window manager to draw colorful borders (we use only server-side
- decorations), there is already very similar patch in
- [Cappsule project](https://github.com/cappsule/cappsule-gui).
-- Configure GNOME to not make use of dom0 user home in visible way (no search
- in files there, no file manager, etc).
-- Configure GNOME to not look into external devices plugged in (no auto
- mounting, device notifications etc).
-- Package above modifications as RPMs, preferably as extra configuration files
- and/or plugins than overwriting existing files. Exceptions to this rule may
- apply if no other option.
-- Adjust comps.xml (in installer-qubes-os repo) to define package group with
- all required packages.
-- Document installation procedure.
-
-**Difficulty**: hard
-
-**Knowledge prerequisite**:
-
-- GNOME architecture
-- C language (patching metacity)
-- Probably also javascript - for modifying GNOME shell extensions
-
-**Size of the project**: 175 hours
-
-**Mentor**: [Frédéric Pierret](/team/), [Marek Marczykowski-Górecki](/team/)
-
-### Generalize the Qubes PDF Converter to other types of files
-
-**Project**: Qubes Converters
-
-**Brief explanation**: One of the pioneering ideas of Qubes is to use disposable virtual machines to convert untrustworthy files (such as documents given to journalists by unknown and potentially malicious whistleblowers) into trustworthy files. See [Joanna's blog on the Qubes PDF Convert](https://theinvisiblethings.blogspot.co.uk/2013/02/converting-untrusted-pdfs-into-trusted.html) for details of the idea. Joanna has implemented a prototype for PDF documents. The goal of this project would be to generalize beyond the simple prototype to accommodate a wide variety of file formats, including Word documents, audio files, video files, spreadsheets, and so on. The converters should prioritise safety over faithful conversion. For example the Qubes PDF converter typically leads to lower quality PDFs (e.g. cut and paste is no longer possible), because this makes the conversion process safer.
-
-**Expected results**: We expect that in the timeframe, it will be possible to implement many converters for many file formats. However, if any unexpected difficulties arise, we would prioritise a small number of safe and high quality converters over a large number of unsafe or unuseful converters.
-
-**Difficulty**: easy
-
-**Knowledge prerequisite**: Most of the coding will probably be implemented as shell scripts to interface with pre-existing converters (such as ImageMagick in the Qubes PDF converter). However, shell scripts are not safe for processing untrusted data, so any extra processing will need to be implemented in another language -- probably Python.
-
-**Size of the project**: 175 hours
-
-**Mentors**: Andrew Clausen and Jean-Philippe Ouellet
-
-### Progress towards reproducible builds
-
-**Project**: Progress towards reproducible builds
-
-**Brief explanation**: A long-term goal is to be able to build the entire OS and installation media in a completely bit-wise deterministic manner, but there are many baby steps to be taken along that path. See:
-
-- "[Security challenges for the Qubes build process](/news/2016/05/30/build-security/)"
-- [This mailing list post](https://groups.google.com/d/msg/qubes-devel/gq-wb9wTQV8/mdliS4P2BQAJ)
-- and [reproducible-builds.org](https://reproducible-builds.org/)
-
-for more information and qubes-specific background.
-
-**Expected results**: Significant progress towards making the Qubes build process deterministic. This would likely involve cooperation with and hacking on several upstream build tools to eliminate sources of variability.
-
-**Difficulty**: medium
-
-**Knowledge prerequisite**: qubes-builder [[1]](/doc/qubes-builder/) [[2]](/doc/qubes-builder-details/) [[3]](https://github.com/QubesOS/qubes-builder/tree/master/doc), and efficient at introspecting complex systems: comfortable with tracing and debugging tools, ability to quickly identify and locate issues within a large codebase (upstream build tools), etc.
-
-**Size of the project**: 350 hours
-
-**Mentor**: [Marek Marczykowski-Górecki](/team/)
-
-### Porting Qubes to ARM/aarch64
-
-**Project**: Porting Qubes to ARM/aarch64
-
-**Brief explanation**:
-
-Qubes currently only supports the x86_64 CPU architecture. Xen currently has additional support for ARM32/ARM64 processors, however work needs to be done to integrate this into the Qubes build process, as well as work in integrating this with the Qubes toolstack and security model. This may also be beneficial in simplifying the process of porting to other architectures.
-
-Some related discussion:
-
-- [#4318](https://github.com/QubesOS/qubes-issues/issues/4318) on porting to ppc64.
-- [#3894](https://github.com/QubesOS/qubes-issues/issues/3894) on porting to L4 microkernel.
-
-**Expected results**:
-
-- Add cross-compilation support to qubes-builder and related components.
-- Make aarch64 specific adjustments to Qubes toolstacks/manager (including passthrough of devices from device tree to guest domains).
-- Aarch64 specific integration and unit tests.
-- Production of generic u-boot or uefi capable image/iso for target hardware.
-
-**Difficulty**: hard
-
-**Knowledge prerequisite**:
-
-- Libvirt and Qubes toolstacks (C and python languages).
-- Xen debugging.
-- General ARM architecture knowledge.
-
-**Size of the project**: 350 hours
-
-**Mentor**: [Marek Marczykowski-Górecki](/team/)
-
-
-
-
-### Android development in Qubes
-
-**Project**: Research running Android in Qubes VM (probably HVM) and connecting it to Android Studio
-
-**Brief explanation**: The goal is to enable Android development (and testing!)
-on Qubes OS. Currently it's only possible using qemu-emulated Android for ARM.
-Since it's software emulation it's rather slow.
-Details, reference: [#2233](https://github.com/QubesOS/qubes-issues/issues/2233)
-
-**Expected results**:
-
-- a simple way of setting up Android qubes with hardware emulation
- (distributed as a template or as a salt, handling various modern Android versions)
-- figuring out and implementing an easy and secure way to connect an Android
- qube to a development qube with Android studio
-- documentation and tests
-
-**Difficulty**: hard
-
-**Knowledge prerequisite**:
-
-**Size of the project**: 350 hours
-
-**Mentor**: Inquire on [qubes-devel](/support/#qubes-devel).
-
-### Admin API Fuzzer
-
-**Project**: Develop a [Fuzzer](https://en.wikipedia.org/wiki/Fuzzing) for the
-[Qubes OS Admin API](/doc/admin-api/).
-
-**Brief explanation**: The [Qubes OS Admin API](/doc/admin-api/)
-enables VMs to execute privileged actions on other VMs or dom0 - if allowed by the Qubes OS RPC policy.
-Programming errors in the Admin API however may cause these access rights to be more permissive
-than anticipated by the programmer.
-
-Since the Admin API is continuously growing and changing, continuous security assessments are required.
-A [Fuzzer](https://en.wikipedia.org/wiki/Fuzzing) would help to automate part of these assessments.
-
-**Expected results**:
- - fully automated & extensible Fuzzer for parts of the Admin API
- - user & developer documentation
-
-**Difficulty**: medium
-
-**Prerequisites**:
- - basic Python understanding
- - some knowledge about fuzzing & existing fuzzing frameworks (e.g. [oss-fuzz](https://github.com/google/oss-fuzz/tree/master/projects/qubes-os))
- - a hacker's curiosity
-
-**Size of the project**: 175 hours
-
-**Mentor**: Inquire on [qubes-devel](/support/#qubes-devel).
-
-
-### Secure Boot support
-
-**Project**: Add support for protecting boot binaries with Secure Boot technology, using user-generated keys.
-
-**Brief explanation**: Since recently, Xen supports "unified EFI boot" which allows to sign not only Xen binary itself, but also dom0 kernel and their parameters. While the base technology is there, enabling it is a painful and complex process. The goal of this project is to integrate configuration of this feature into Qubes, automating as much as possible. See discussion in [issue #4371](https://github.com/QubesOS/qubes-issues/issues/4371)
-
-**Expected results**:
- - a tool to prepare relevant boot files for unified Xen EFI boot - this includes collecting Xen, dom0 kernel, initramfs, config file, and possibly few more (ucode update?); the tool should then sign the file with user provided key (preferably propose to generate it too)
- - integrate it with updates mechanism, so new Xen or dom0 kernel will be picked up automatically
- - include a fallback configuration that can be used for troubleshooting (main unified Xen EFI intentionally does not allow to manipulate parameters at boot time)
-
-**Difficulty**: hard
-
-**Knowledge prerequisite**:
- - basic understanding of Secure Boot
- - Bash and Python scripting
-
-**Size of the project**: 175 hours
-
-**Mentor**: [Marek Marczykowski-Górecki](/team/)
-
-
-### Reduce logging of Disposable VMs
-
-**Project**: Reduce logging of Disposable VMs
-
-**Brief explanation**: Partial metadata of a DisposableVM is stored in the dom0 filesystem. This applies to various logs, GUI status files etc. There should be an option to hide as much of that as possible - including bypassing some logging, and removing various state files, or at the very least obfuscating any hints what is running inside DisposableVM. More details at [issue #4972](https://github.com/QubesOS/qubes-issues/issues/4972)
-
-**Expected results**: A DisposableVM should not leave logs hinting what was running inside.
-
-**Difficulty**: medium
-
-**Knowledge prerequisite**:
- - Python scripting
- - Basic knowledge of Linux system services management (systemd, syslog etc)
-
-**Size of the project**: 350 hours
-
-**Mentor**: [Marek Marczykowski-Górecki](/team/)
-
-
-## Past Projects
-
-You can view the projects we had in 2017 in the [GSoC 2017 archive](https://summerofcode.withgoogle.com/archive/2017/organizations/5074771758809088/). We also participated in GSoC 2020 and GSoC 2021, and you can see the project in the [GSoC 2020 archive](https://summerofcode.withgoogle.com/archive/2020/organizations/4924517870206976/) and [GSoC 2021 archive](https://summerofcode.withgoogle.com/archive/2021/organizations/5682513023860736).
-
-Here are some successful projects which have been implemented in the past by Google Summer of Code participants.
-
-### Template manager, new template distribution mechanism
-
-**Project**: Template manager, new template distribution mechanism
-
-**Brief explanation**: Template VMs currently are distributed using RPM
-packages. There are multiple problems with that, mostly related to static
-nature of RPM package (what files belong to the package). This means such
-Template VM cannot be renamed, migrated to another storage (like LVM), etc.
-Also we don't want RPM to automatically update template package itself (which
-would override all the user changes there). More details:
-[#2064](https://github.com/QubesOS/qubes-issues/issues/2064),
-[#2534](https://github.com/QubesOS/qubes-issues/issues/2534),
-[#3573](https://github.com/QubesOS/qubes-issues/issues/3573).
-
-**Expected results**:
-
- - Design new mechanism for distributing templates (possibly including some
- package format - either reuse something already existing, or design
- new one). The mechanism needs to handle:
- - integrity protection (digital signatures), not parsing any data in dom0
- prior to signature verification
- - efficient handling of large sparse files
- - ability to deploy the template into various storage mechanisms (sparse
- files, LVM thin volumes etc).
- - template metadata, templates repository - enable the user to browse
- available templates (probably should be done in dedicated VM, or DisposableVM)
- - manual template removal by users (without it, see problems such
- as [#5509](https://github.com/QubesOS/qubes-issues/issues/5509)
- - Implement the above mechanism:
- - tool to download named template - should perform download operation in
- some VM (as dom0 have no network access), then transfer the data to dom0,
- verify its integrity and then create Template VM and feed it's root
- filesystem image with downloaded data.
- - tool to browse templates repository - both CLI and GUI (preferably integrated
- with existing Template Manager tool)
- - integrate both tools - user should be able to choose some template to be
- installed from repository browsing tool - see
- [#1705](https://github.com/QubesOS/qubes-issues/issues/1705) for some idea
- (this one lacks integrity verification, but a similar service could
- be developed with that added)
- - If new "package" format is developed, add support for it into
- [linux-template-builder](https://github.com/QubesOS/qubes-linux-template-builder).
- - Document the mechanism.
- - Write unit tests and integration tests.
-
-**Knowledge prerequisite**:
-
- - Large files (disk images) handling (sparse files, archive formats)
- - Bash and Python scripting
- - Data integrity handling - digital signatures (gpg2, gpgv2)
- - PyGTK
- - RPM package format, (yum) repository basics
-
-**Mentor**: [Marek Marczykowski-Górecki](/team/)
-
-----
-
-We adapted some of the language here about GSoC from the [KDE GSoC page](https://community.kde.org/GSoC).
+---
\ No newline at end of file
diff --git a/developer/general/gsod.md b/developer/general/gsod.md
index fbb13eb5c..38563efd7 100644
--- a/developer/general/gsod.md
+++ b/developer/general/gsod.md
@@ -2,145 +2,7 @@
lang: en
layout: doc
permalink: /gsod/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/gsod.html
ref: 242
title: Google Season of Docs (GSoD)
----
-
-Thank you for your interest in participating in the [2021 Google Season of Docs](https://developers.google.com/season-of-docs/) program with the [Qubes OS team](/team/). You can read more about the Google Season of Docs in the official [guides](https://developers.google.com/season-of-docs/docs/) and [FAQ](https://developers.google.com/season-of-docs/docs/faq).
-
-## 2021 Project Idea
-
-### Qubes OS on Virtual Machines and Disposable VMs documentation - Qubes OS
-
-#### About your organization
-
-Qubes OS is a free and open source operating system uniquely designed to protect the security and privacy of the user. Its architecture is built to enable a user to define different security environments ("qubes") on their computer and visually manage their interaction with each other and the world.
-
-Qubes OS was launched in 2011 and has [received praise from security experts](https://www.qubes-os.org/endorsements/) like Edward Snowden, Bill Buddington (EFF), Isis Lovecruft (Tor Project), and Kenn White (Open Crypto Audit), and has over [30,000 active users](https://www.qubes-os.org/statistics/).
-
-From network-level to software-level protections, as well as protections against firmware and hardware attacks, Qubes OS is trying to protect the user from the most significant attacks they encounter so that they can get their work done, safely.
-
-#### The Project
-
-The goal of the project is to improve the documentation related to Disposable VMs and installing Qubes OS on Virtual Machines.
-
-The current Disposable VMs documentation is scarce, inconsistent in places and is scattered across multiple pages, sometimes hard to find. This project involves consolidating it into one or few easy to find pages, covering all related subjects. It should be written in way easy to follow and understand, clearly separating basic use cases, advanced ones and internal details. The terminology should also be used consistently.
-
-Additionally, Qubes OS is missing an installation guide for virtual machines. Users are installing an outdated and unsupported version of Qubes OS (3.2) instead of the supported version. There is unofficial existing installation guide for Qubes OS on a virtual box but it is misleading and lacks documentation. Usually, users face some errors and bugs while installing Qubes OS on a virtual machine. This project also involves writing an installation guide that details how to install Qubes on virtual machines, and how to troubleshoot any issues that may arise.
-
-#### Project’s scope
-
-The technical writer will:
-
-* Review existing Disposable VM documentation
-
-* Propose new documentation layout, including split between pages
-
-* Propose updated and clarified content
-
-* Provide a new option of installation guide for users working on virtual machines.
-
-* Review existing problems and provide solutions to them.
-
-* Giving a warning for using outdated versions of Qubes.
-
-Knowledge prerequisites:
-
-* Basic Qubes OS knowledge - intro, getting started.
-
-* Markdown.
-
-* Experience in virtual boxes and machines.
-
-* Basic knowledge about Fedora Linux architecture.
-
-The project is estimated to need around 6 months, with a part-time (20hr/week) workload. Qubes OS team members focused on documentation (Michael Carbone, Andrew David Wong, Marek Marczykowski-Górecki) have committed to supporting the project.
-
-#### Measuring the project’s success
-
-We will consider the project successful if, after publication of the new documentation:
-
-* The Disposable VM documentation is consilidated into a few pages and easier to find.
-
-* Disposable VM terminology is consistent across all pages
-
-* There is a new installation guide detailing how to install Qubes on virtual machines (VirtualBox), complete with screenshots and troubleshooting steps where necessary.
-
-* There is a decrease (by ~20%) in the number of issues and questions raised for topics covered in the documentation, whether in the official Github issues tracker, the Qubes mailing list, or the Qubes community forum.
-
-#### Budget
-
-| Budget item | Amount | Running total | Note / Justification |
-|-|-|-|-|
-| Technical writer audit, update, and write new documentation | $12000 | $12000 | based on a 20hr/week for 6 months at 25$/hr |
-| TOTAL | | $12000 | |
-
-#### Additional information
-Qubes OS regularly participates in the Google Summer of Code and Google Season of Docs. This is our third time in a row participating in Google Season of Docs. Our mentorships for GSoD 2019 and 2020 were successes and both projects were completed
-within the times allotted. The past Google Season of Docs projects have given us experience in working with technical writers, and has helped us to understand the benefits of technical writers can to our project
-
-## Past Projects
-
-You can view the project we had in 2019 in the [2019 GSoD archive](https://developers.google.com/season-of-docs/docs/2019/participants/project-qubes) and the [2019 writer's report](https://refre.ch/report-qubesos/).
-
-You can also view the project we had in 2020 in the [2020 GSoD archive](https://developers.google.com/season-of-docs/docs/2020/participants/project-qubesos-c1e0) and the [2020 writer's report](https://gist.github.com/PROTechThor/bfe9b8b28295d88c438b6f6c754ae733).
-
-Here are some successful projects which have been implemented in the past by Google Season of Docs participants.
-
-### Consolidate troubleshooting guides
-
-**Project**: Consolidate troubleshooting guides
-
-**Brief explanation**: Troubleshooting guides are scattered across many pages and sometimes incomplete, leading to repeatedly posting the same instruction over and over when helping users to diagnose problems.
-This could be helped by writing a consolidated guide with a clear list of symptom-action layout.
-
-**Expected results**:
-
-- Review existing [troubleshooting guides](/doc/#troubleshooting)
-- Review [issues](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+label%3A%22C%3A+doc%22) containing common troubleshooting steps (checking specific logs etc)
-- Propose updated, consolidated troubleshooting documentation, including its layout
-
-**Knowledge prerequisite**:
-
-- [Markdown](https://daringfireball.net/projects/markdown/)
-
-**Mentor**: [Marek Marczykowski-Górecki](/team/)
-
-### Improve Getting Started page
-
-**Project**: Improve Getting Started page
-
-**Brief explanation**: The [Getting Started page](https://www.qubes-os.org/doc/getting-started/) is the place a new user would go to understand better how to use Qubes. It is currently has old screenshots not using the default desktop environment and could have much better flow. In addition, this improved page content may end up being served more directly to the user via the [offline documentation](https://github.com/QubesOS/qubes-issues/issues/1019) or the firstboot guide.
-
-**Expected results**:
-
- - Review the existing page and website, similar pages for other OSes
- - Provide visual mock-ups and proposed text
-
-**Knowledge prerequisite**:
-
-- basic Qubes OS knowledge
-- [Markdown](https://daringfireball.net/projects/markdown/)
-
-**Mentor**: [Michael Carbone](/team/)
-
-### Rewrite qrexec documentation
-
-**Project**: Rewrite qrexec documentation
-
-**Brief explanation**: Current qrexec (qubes remote exec) documentation is hard to follow, important informations are hidden within a wall of text.
-Some parts are split into multiple sections, for example version specific to avoid duplication, but it doesn't help reading it.
-Additionally, protocol documentation describes only few specific use cases, instead of being clear and precise protocol specification.
-Fixing this last point may require very close cooperation with developers, as the current documentation doesn't multiple corner cases (that's one of the issue with its current shape).
-
-**Expected results**:
-
-- Review existing [qrexec documentation](https://www.qubes-os.org/doc/qrexec3/) and an [issue about it](https://github.com/QubesOS/qubes-issues/issues/1392)
-- Propose updated, consolidated admin documentation (policy writing, adding services)
-- Propose consolidated protocol specification, based on the current documentation, and cooperation with developers
-
-**Knowledge prerequisite**:
-
-- [Markdown](https://daringfireball.net/projects/markdown/)
-
-**Mentor**: [Marek Marczykowski-Górecki](/team/)
+---
\ No newline at end of file
diff --git a/developer/general/how-to-edit-the-documentation.md b/developer/general/how-to-edit-the-documentation.md
index f51fe5128..661d14169 100644
--- a/developer/general/how-to-edit-the-documentation.md
+++ b/developer/general/how-to-edit-the-documentation.md
@@ -2,197 +2,6 @@
lang: en
layout: doc
permalink: /doc/how-to-edit-the-documentation/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/how-to-edit-the-documentation.html
title: How to edit the documentation
----
-
-_Also see the [documentation style guide](/doc/documentation-style-guide/)._
-
-Qubes OS documentation pages are stored as plain text Markdown files in the
-[qubes-doc](https://github.com/QubesOS/qubes-doc) repository. By cloning and
-regularly pulling from this repo, users can maintain their own up-to-date
-offline copy of all Qubes documentation rather than relying solely on the web.
-
-The documentation is a volunteer community effort. People like you are
-constantly working to make it better. If you notice something that can be fixed
-or improved, please follow the steps below to open a pull request!
-
-## How to submit a pull request
-
-We keep all the documentation in
-[qubes-doc](https://github.com/QubesOS/qubes-doc), a dedicated Git repository
-hosted on [GitHub](https://github.com/). Thanks to GitHub's easy web interface,
-you can edit the documentation even if you're not familiar with Git or the
-command line! All you need is a free GitHub account.
-
-A few notes before we get started:
-
-- Since Qubes is a security-oriented project, every documentation change will
- be [reviewed](#security) before it's accepted. This allows us to maintain
- quality control and protect our users.
-
-- To give your contribution a better chance of being accepted, please follow
- our [documentation style guide](/doc/documentation-style-guide/).
-
-- We don't want you to spend time and effort on a contribution that we can't
- accept. If your contribution would take a lot of time, please [file an
- issue](/doc/issue-tracking/) for it first so that we can make sure we're on
- the same page before significant works begins.
-
-- Alternatively, you may already have written content that doesn't conform to
- these guidelines, but you'd be willing to modify it so that it does. In this
- case, you can still submit it by following the instructions below. Just make
- a note in your pull request (PR) that you're aware of the changes that need
- to be made and that you're just asking for the content to be reviewed before
- you spend time making those changes.
-
-- Finally, if you've written something that doesn't belong in qubes-doc but
- that would be beneficial to the Qubes community, please consider adding it to
- the [external
- documentation](/doc/documentation-style-guide/#core-vs-external-documentation).
-
-(**Advanced users:** If you're already familiar with GitHub or wish to work
-from the command line, you can skip the rest of this section. All you need to
-do to contribute is to [fork and
-clone](https://guides.github.com/activities/forking/) the
-[qubes-doc](https://github.com/QubesOS/qubes-doc) repo, make your changes, then
-[submit a pull
-request](https://help.github.com/articles/using-pull-requests/).)
-
-Ok, let's begin. Every documentation page has a "Page Source on GitHub" button.
-Depending on the size of your screen, it may either be on the side (larger
-screens) or on the bottom (smaller screens).
-
-[](/attachment/doc/doc-pr_01_page-source-button.png)
-
-When you click on it, you'll be taken to the source file --- usually a Markdown
-(`.md`) file --- on GitHub. On this page, there will be a button to edit the
-file.
-
-[](/attachment/doc/doc-pr_02_github-edit.png)
-
-You'll be prompted to sign in with your GitHub username and password
-(if you aren't already logged in). You can also create a free account from here.
-
-[](/attachment/doc/doc-pr_03_sign-in.png)
-
-If this is your first contribution to the documentation, you need to "fork" the
-repository (make your own copy). It's easy --- just click the big green button
-on the next page. This step is only needed the first time you make a
-contribution.
-
-[](/attachment/doc/doc-pr_04_fork.png)
-
-Now you can make your modifications. You can also preview the changes to see
-how they'll be formatted by clicking the "Preview changes" tab. If you want to
-add images, please see [How to add images](#how-to-add-images). If you're
-making formatting changes, please [render the site
-locally](https://github.com/QubesOS/qubesos.github.io#instructions) to verify
-that everything looks correct before submitting any changes.
-
-[](/attachment/doc/doc-pr_05_edit.png)
-
-Once you're finished, describe your changes at the bottom and click "Propose
-file change".
-
-[](/attachment/doc/doc-pr_06_commit-msg.png)
-
-After that, you'll see exactly what modifications you've made. At this stage,
-those changes are still in your own copy of the documentation ("fork"). If
-everything looks good, send those changes to us by pressing the "Create pull
-request" button.
-
-[](/attachment/doc/doc-pr_07_review-changes.png)
-
-You will be able to adjust the pull request message and title there. In most
-cases, the defaults are ok, so you can just confirm by pressing the "Create
-pull request" button again. However, if you're not ready for your PR to be
-reviewed or merged yet, please [make a draft PR
-instead](https://github.blog/2019-02-14-introducing-draft-pull-requests/).
-
-[](/attachment/doc/doc-pr_08_create-pull-request.png)
-
-If any of your changes should be reflected in the [documentation index (a.k.a.
-table of contents)](/doc/) --- for example, if you're adding a new page,
-changing the title of an existing page, or removing a page --- please see [How
-to edit the documentation index](#how-to-edit-the-documentation-index).
-
-That's all! We will review your changes. If everything looks good, we'll pull
-them into the official documentation. Otherwise, we may have some questions for
-you, which we'll post in a comment on your pull request. (GitHub will
-automatically notify you if we do.) If, for some reason, we can't accept your
-pull request, we'll post a comment explaining why we can't.
-
-[](/attachment/doc/doc-pr_09_done.png)
-
-## How to edit the documentation index
-
-The source file for the [documentation index (a.k.a. table of contents)](/doc/)
-is
-[doc-index.yml](https://github.com/QubesOS/qubesos.github.io/blob/master/_data/doc-index.yml).
-
-Editing this file will change what appears on the documentation index. If your
-pull request (PR) adds, removes, or edits anything that should be reflected in
-the documentation index, please make sure you also submit an associated pull
-request against this file.
-
-## How to add images
-
-To add an image to a page, use the following syntax in the main document (see
-[here](/doc/documentation-style-guide/#image-linking) for why this syntax is
-important).
-
-```
-[](/attachment/doc/image.png)
-```
-
-Then, submit your image(s) in a separate pull request to the
-[qubes-attachment](https://github.com/QubesOS/qubes-attachment) repository
-using the same path and filename. This is the only permitted way to include
-images. Do not link to images on other websites.
-
-## Serving the website locally
-
-You can serve the website offline on your local machine by following [these
-instructions](https://github.com/QubesOS/qubesos.github.io#instructions). This
-can be useful for making sure that your changes render the way you expect,
-especially when your changes affect formatting, images, tables, styling, etc.
-
-## Security
-
-*Also see: [Should I trust this website?](/faq/#should-i-trust-this-website)*
-
-All pull requests (PRs) against
-[qubes-doc](https://github.com/QubesOS/qubes-doc) must pass review prior to be
-merged, except in the case of [external
-documentation](/doc/#external-documentation) (see
-[#4693](https://github.com/QubesOS/qubes-issues/issues/4693)). This process is
-designed to ensure that contributed text is accurate and non-malicious. This
-process is a best effort that should provide a reasonable degree of assurance,
-but it is not foolproof. For example, all text characters are checked for ANSI
-escape sequences. However, binaries, such as images, are simply checked to
-ensure they appear or function the way they should when the website is
-rendered. They are not further analyzed in an attempt to determine whether they
-are malicious.
-
-Once a pull request passes review, the reviewer should add a signed comment
-stating, "Passed review as of ``" (or similar). The
-documentation maintainer then verifies that the pull request is mechanically
-sound (no merge conflicts, broken links, ANSI escapes, etc.). If so, the
-documentation maintainer then merges the pull request, adds a PGP-signed tag to
-the latest commit (usually the merge commit), then pushes to the remote. In
-cases in which another reviewer is not required, the documentation maintainer
-may review the pull request (in which case no signed comment is necessary,
-since it would be redundant with the signed tag).
-
-## Questions, problems, and improvements
-
-If you have a question about something you read in the documentation or about
-how to edit the documentation, please post it on the
-[forum](https://forum.qubes-os.org/) or send it to the appropriate [mailing
-list](/support/). If you see that something in the documentation should be
-fixed or improved, please [contribute](#how-to-submit-a-pull-request) the
-change yourself. To report an issue with the documentation, please follow our
-standard [issue reporting guidelines](/doc/issue-tracking/). (If you report an
-issue with the documentation, you will likely be asked to submit a pull request
-for it, unless there is a clear indication in your report that you are not
-willing or able to do so.)
+---
\ No newline at end of file
diff --git a/developer/general/package-contributions.md b/developer/general/package-contributions.md
index f73c9bd25..be47c56e9 100644
--- a/developer/general/package-contributions.md
+++ b/developer/general/package-contributions.md
@@ -2,101 +2,7 @@
lang: en
layout: doc
permalink: /doc/package-contributions/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/package-contributions.html
ref: 29
title: Package contributions
----
-
-_This page is for developers who wish to contribute packages.
-If you want to install contributed packages, please see [installing contributed packages](/doc/installing-contributed-packages/)._
-
-We're very grateful to the talented and hard-working community members who contribute software packages to Qubes OS.
-This page explains the inclusion criteria and procedures for such packages, as well as the roles and responsibilities of those involved.
-
-Inclusion Criteria
-------------------
-
-In order to be accepted, packages must:
-
-* In no way weaken the security of Qubes OS.
-* Be published under an open-source license (read about the [Qubes OS License](/doc/license/)).
-* Follow our [coding guidelines](/doc/coding-style/).
-* Be thoroughly tested.
-* Have a clearly-defined use case for Qubes users.
-* Not be unduly burdensome to review.
-
-(Please note that we always reserve the right to add criteria to this list.)
-
-Contribution Procedure
-----------------------
-
-Before you start putting serious work into a package, we recommend that you discuss your idea with the Qubes developers and the broader community on the [qubes-devel mailing list](/support/#qubes-devel).
-Once you have a package that's ready to become part of Qubes OS, please follow this procedure:
-
-1. Ensure that your package satisfies the [Inclusion Criteria](#inclusion-criteria).
-2. If your code isn't already on GitHub, create a GitHub repo that contains your code. You can have a look to an example package called [qubes-skeleton](https://github.com/QubesOS-contrib/qubes-skeleton).
-3. If you haven't already, [sign your code](/doc/code-signing/).
-4. Create an issue in [qubes-issues](https://github.com/QubesOS/qubes-issues/issues/) with the title `[Contribution] your-package-name`.
- Include a link to your repo, a brief description of your package, and a brief explanation of why you think it should be included in Qubes.
- Please note that the Qubes core developers are very busy.
- If they are under heavy load when you submit your contribution, it may be a very long time before they have time to review your package.
- If this happens, please do not be discouraged.
- If you think they may have forgotten about your pending contribution, you may "bump" your request by commenting on your issue, but please do this *very* sparingly (i.e., no more than once a month).
- We appreciate your understanding!
-5. You may be asked followup questions.
- If we decide to accept your contribution, you will be invited to join the [QubesOS-contrib](https://github.com/QubesOS-contrib) organization on GitHub as public recognition of your contribution (but without push access; see [Review Procedure](#review-procedure)), and [QubesOS-contrib](https://github.com/QubesOS-contrib) will fork your repo.
- If we decide not to accept your contribution, we will state the reason and close the issue.
-
-Update Procedure
-----------------
-
-*Anyone* can provide an update (patch) to a contributed package, not just the person who contributed that package!
-The update procedure is the same for everyone, including the original package contributor.
-
-If you would like to update an already-contributed package (specifically, a fork owned by [QubesOS-contrib](https://github.com/QubesOS-contrib)), please submit a [signed](/doc/code-signing/), fast-forwardable pull request to that repo with your changes.
-Please note that your pull request **must** be both [signed](/doc/code-signing/) and fast-forwardable, or else it will be closed without further review.
-One or more reviewers may post comments on your pull request.
-Please be prepared to read and respond to these comments.
-
-Review Procedure
-----------------
-
-This review procedure covers both original package contributions (see [Contribution Procedure](#contribution-procedure)) and all subsequent updates to those packages, including updates from the original package contributor (see [Update Procedure](#update-procedure)).
-All changes will be reviewed by a Qubes Core Reviewer (QCR) and the [Package Maintainer](#package-maintainers) (PM).
-In all cases, the QCR will be a core Qubes developer.
-In some cases, the QCR and the PM will be the same person.
-For example, if someone contributes a package, then disappears, and no suitable replacement has been found, then it is likely that a core Qubes developer will play both the QCR and PM roles for that package, at least until another suitable candidate volunteers to become the PM for that package.
-
-The review procedure is as follows:
-
-1. Someone, S, wishes to make a change to a package, P.
-2. S submits a fast-forwardable pull request against the fork of P's repo owned by [QubesOS-contrib](https://github.com/QubesOS-contrib).
-3. The PM reviews the pull request.
- If the the pull request passes the PM's review, the PM adds a [signed](/doc/code-signing/) *comment* on the pull request stating that it has passed review.
- (In cases in which S = PM, the PM can simply add a [signed](/doc/code-signing/) *tag* to the HEAD commit prior to submitting the pull request.)
- If the pull request does not pass the PM's review, the PM leaves a comment on the pull request explaining why not.
-4. The QCR reviews the pull request.
- If the pull request passes the QCR's review, the QCR pushes a [signed](/doc/code-signing/) tag to the HEAD commit stating that it has passed review and fast-forward merges the pull request.
- If the pull request does not pass the QCR's review, the QCR leaves a comment on the pull request explaining why not, and the QCR may decide to close the pull request.
-
-In all the cases, the first condition to be validated by the QCR's review is to ensure that the contribution **will not** hijack any core packages of [QubesOS](https://github.com/QubesOS) and of course, none of the [QubesOS-contrib](https://github.com/QubesOS-contrib) packages too. More precisely, particular attention to the whole build pipeline will be made with a specific review of:
-
-* Package dependencies,
-* Build scripts (including downloaded ones),
-* All downloaded components should be verified against static hash,
-* RPM/DEB installation scripts (e.g. looking at constraints who would hijack other packages),
-* Makefiles,
-* Package build [reproducible](https://reproducible-builds.org/)
-
-and any steps which would result in partial/total compromise of legitimate components. For this part, you can have a look to an example package called [qubes-skeleton](https://github.com/QubesOS-contrib/qubes-skeleton).
-
-Package Maintainers
--------------------
-
-If you contribute a package, we assume that you will be the maintainer of that package, unless you tell us otherwise.
-As the maintainer of the package, it is your privilege and responsibility to:
-
-* [Review](#review-procedure) each pull request made against the package.
-* Decide when the package has reached a new version, and notify the Qubes core developers when this occurs.
-
-If you do not wish to be the maintainer of your package, please let us know.
-If you do not act on your maintainer duties for a given package for an extended period of time and after at least one reminder, we will assume that you no longer wish to be the maintainer for that package.
+---
\ No newline at end of file
diff --git a/developer/general/research.md b/developer/general/research.md
index 74ac3c188..92ce86bdf 100644
--- a/developer/general/research.md
+++ b/developer/general/research.md
@@ -7,11 +7,7 @@ redirect_from:
- /en/doc/qubes-research/
- /doc/QubesResearch/
- /wiki/QubesResearch/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/research.html
ref: 139
title: Research
----
-
-Here are links to various research papers, projects, videos, and blog posts
-related to Qubes OS.
-
-{% include research.html %}
+---
\ No newline at end of file
diff --git a/developer/general/usability-ux.md b/developer/general/usability-ux.md
index 5e0c53592..f54936909 100644
--- a/developer/general/usability-ux.md
+++ b/developer/general/usability-ux.md
@@ -2,229 +2,7 @@
lang: en
layout: doc
permalink: /doc/usability-ux/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/usability-ux.html
ref: 31
title: Usability & UX
----
-
-Software that is too complicated to use, is often unused. Because we want as many people as possible to benefit from its unique security properties, the usability and user experience of Qubes OS is an utmost priority!
-
-We ask anyone developing for Qubes OS to please read through this guide to better understand the user experience we strive to achieve. We also ask them to review [our visual style guide](/doc/visual-style-guide/) for other design related information.
-
----
-
-## Easy To Use
-
-An ideal user experience is friendly, and it beckons a new user to explore the interface. In this process, they can naturally discover how to use the software. Below are some guidelines that will help you design a user interface that accomplishes this goal.
-
-
- Interfaces Should Not
-
-
-- Require extensive configuration before a user can *begin* doing things
-- Make it possible to break provided features or actions in unrecoverable ways
-- Perform actions which compromise security and data
-- Overwhelm the user with too much information and cognitive load
-
-Perhaps the most common cause of mistakes is complexity. If there is a configuration setting that will significantly affect the user's experience, choose a safe and smart default then tuck this setting in an `Advanced Settings` panel.
-
-
- Interfaces Should
-
-
-- Make it easy to discover features and available actions
-- Provide some understanding of what discovered features do
-- Offer the ability to easily undo mistakes
-- Choose intelligent defaults for settings
-
-In making software easy to use, it is crucial to be mindful of [cognitive load](https://en.wikipedia.org/wiki/Cognitive_load) which dictates that *"humans are generally able to hold only seven +/- two units of information in short-term memory."* Making sure your interfaces don't pass this short-term memory limit is perhaps the most important factor in helping a user feel comfortable instead of overwhelmed.
-
----
-
-## Easy to Understand
-
-There will always be the need to communicate things to users. In these cases, an interface should aim to make this information easy to understand. The following are simple guides to help achieve this - none of these are absolute maxims!
-
-
- Avoid Acronyms
-
-
-Acronyms are compact and make good names for command line tools. They do not make graphical user interfaces more intuitive for non-technical users. Until one learns an acronym's meaning, it is gibberish. Avoid acronyms in your interfaces whenever possible!
-
-- `DVM` - Disposable Virtual Machine
-- `GUID` - Global Unique Identifier
-- `PID` - Process Identification Number
-- `NetVM` - Networking Virtual Machine
-
-Despite this rule, some acronyms like `USB` are widely used and understood due to being in common use for over a decade. It is good to use these acronyms when the full words like `Universal Serial Bus` are more likely to confuse users.
-
-
- Use Simple Words
-
-
-Use the minimum amount of words needed to be descriptive, but also informative. Go with common words that are as widely understood. Sometimes, inventing a word such as `Qube` to describe a `virtual machine` makes the life of the user much easier.
-
-- Use `Disposable Qube` instead of `DVM` or `Disposable Virtual Machine`
-- Use `interface` instead of `GUI` or `Graphical User Interface`
-- Use `application number` instead of `PID` or `Process Identification Number`
-- Use `Networking` or `Networking Qube` instead of `NetVM` given context
-
----
-
-
- Avoid Technical Words
-
-
-Technical words are usually more accurate, but they often *only* make sense to technical users and are confusing and unhelpful to non-technical users. Examples of technical words that might show up in Qubes OS are:
-
-- `root.img`
-- `savefile`
-- `qrexec-daemon`
-
-These are all terms that have at some point showed up in users' notification messages. Each term is very specific, but requires the user to understand virtualization to interpret.
-
-
- Use Common Concepts
-
-
-Large amounts of the global population have been using computers for one or two decades and have formed some mental models of how things work. Leveraging these mental models are a huge gain.
-
-- Use `disk space` instead of `root.img`, since while not quite accurate, it makes contextual sense
-- Use `saving` instead of `savefile` as the former is the action trying to be completed
-- Use `Qubes` instead of `qrexec-daemon` as it gives better context on what is happening
-
-These words are more abstract and user relevant- they help a user understand what is happening based on already known concepts (disk space) or start to form a mental model of something new (Qubes).
-
----
-
-
- Avoid Inconsistencies
-
-
-It is easy to start abbreviating (or making acronyms) of long terms like `Disposable Virtual Machine` depending on where the term shows up in an interface.
-
-- `DVM`
-- `DispVM`
-- `DisposableVM`
-
-This variation in terms can cause new users to question or second guess what the three different variations mean, which can lead to inaction or mistakes.
-
-
- Make Things Consistent
-
-
-Always strive to keep things consistent in the interfaces as well as documentation and other materials.
-
-- Use `Disposable Qube` at all times as it meets other criteria as well.
-
-By using the same term throughout an interface, a user can create a mental model and relationship with that term allowing them to feel empowered.
-
----
-
-
- Avoid Duplicate Words
-
-
-It is easy to add words like `Domain` before items in a list or menu in an attempt to be descriptive, such as:
-
-~~~
-Menu
-- Domain: work
-- Domain: banking
-- Domain: personal
-~~~
-
-The repeated use of the word `Domain` requires a user to read it for each item in the list, which makes extra work for the eye in parsing out the relevant word like `work, banking, or personal`. This also affects horizontal space on fixed width lines.
-
-
- Create Groups & Categories
-
-
-It is more efficient to group things under headings instead as this allows the eye to easily scan the uniqueness of the items. (As per our previous example:)
-
-~~~
-Domains
-- Work
-- Banking
-- Personal
-~~~
-
----
-
-## Easy To Complete
-
-Lastly, expected (and unexpected) situations often require user actions or input. Make resolving these occurences as easy as possible to complete the action.
-
-
- Don't Leave Users Stranded
-
-
-Consider the following notifications:
-
-- `The disk space of your Qube "Work" is full`
-- `There was an error saving Qube "Personal"`
-
-Instead of displaying solvable errors like these and neglecting to provide a fix:
-
-
- Offer Actionable Solutions
-
-
-Error messages and limits such as those in the previous example can be greatly improved by adding buttons or links to helpful information.
-
-- Add a button to `Increase Disk Space`
-- Add a link to a documentation page called `Troubleshoot saving data`
-
-In adhering to these principles, you'll make undesirable situations more manageable for users instead of feeling stranded.
-
----
-
-
- Minimize Repetitive Steps
-
-
-There are many cases where a user wants to perform an action on more than one file or folder. However in order to do the action, the user must repeat certain steps such as:
-
-1. Click on `Open File` from a menu or button
-2. Navigate through file system
- - Click Folder One
- - Click Folder Two
- - Click Folder Three
- - Click Folder Four
-3. Select proper file
-4. Complete task on file
-
-That subtle act of clicking through a file system can prove to be significant if a user needs to open more than a couple files in the same directory. We can alleviate some of the work by changing the process:
-
-1. Click on `Open File` from a menu or button
-2. Remember last open folder/file system
-3. Select proper file
-4. Complete task
-
-Clearly, cutting out something as simple as navigating through the file system can save a user quite a bit of time. Alternatively, adding a button or menu item like `Open Multiple Files` might be even better, because remembering and using relevant hotkeys is often something only power users know how to do!
-
----
-
-## GNOME, KDE, and Xfce
-
-The desktop GUIs that QubesOS versions 1 - 3.1 offer are [KDE](https://www.kde.org) and [Xfce](https://xfce.org). We are currently migrating towards using [GNOME](https://www.gnome.org). We know some people prefer KDE, but we believe Gnome is easier to use for average non-technical users. Xfce will always be supported, and technical users will always have the choice to use KDE or other desktop environments.
-
-This change means you should use [GTK](https://www.gtk.org/) rather than Qt for new GUIs.
-
-All three of these mentioned desktop environments have their own [human interface guidelines](https://en.wikipedia.org/wiki/Human_interface_guidelines), and we suggest you familiarize yourself with the platform you developing for.
-
-- [GNOME Human Interface Guidelines](https://developer.gnome.org/hig/3.18/)
-- [KDE HIG](https://techbase.kde.org/Projects/Usability/HIG)
-- [Xfce UI Guidlines](https://wiki.xfce.org/dev/hig/general)
-
----
-
-## Further Learning & Inspiration
-
-Learning to make well designing intuitive interfaces and software is specialized skillset that can take years to cultivate, but if you are interested in furthering your understanding, we suggest the following resources:
-
-- [Learn Design Principles](http://learndesignprinciples.com) by Melissa Mandelbaum
-- [Usability in Free Software](http://jancborchardt.net/usability-in-free-software) by Jan C. Borchardt
-- [Superheroes & Villains in Design](https://vimeo.com/70030549) by Aral Balkan
-- [First Rule of Usability? Don’t Listen to Users](http://www.nngroup.com/articles/first-rule-of-usability-dont-listen-to-users/) by Jakob Nielsen
-- [10 Usability Heuristics for User Interface Design](https://www.nngroup.com/articles/ten-usability-heuristics/) by Jakob Nielsen
-- [Hack Design](https://hackdesign.org/) - online learning program
+---
\ No newline at end of file
diff --git a/developer/general/visual-style-guide.md b/developer/general/visual-style-guide.md
index ceef871df..a610ed03e 100644
--- a/developer/general/visual-style-guide.md
+++ b/developer/general/visual-style-guide.md
@@ -4,6 +4,7 @@ layout: doc
permalink: /doc/visual-style-guide/
redirect_from:
- /doc/style-guide/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/visual-style-guide.html
ref: 27
title: Visual style guide
----
+---
\ No newline at end of file
diff --git a/developer/general/website-style-guide.md b/developer/general/website-style-guide.md
index 6c5a7de82..a224450d6 100644
--- a/developer/general/website-style-guide.md
+++ b/developer/general/website-style-guide.md
@@ -2,77 +2,6 @@
lang: en
layout: doc
permalink: /doc/website-style-guide/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/general/website-style-guide.html
title: Website style guide
----
-
-This page explains the standards we follow for building and maintaining the
-website. Please follow these guidelines and conventions when modifying the
-website. For the standards governing the documentation in particular, please
-see the [documentation style guide](/doc/documentation-style-guide/).
-
-## Coding conventions
-
-The following conventions apply to the website as a whole, including everything
-written in HTML, CSS, YAML, and Liquid. These conventions are intended to keep
-the codebase consistent when multiple collaborators are working on it. They
-should be understood as a practical set of rules for maintaining order in this
-specific codebase rather than as a statement of what is objectively right or
-good.
-
-### General practices
-
-- Use comments to indicate the purposes of different blocks of code. This makes
- the file easier to understand and navigate.
-
-- Use descriptive variable names. Never use one or two letter variable names.
- Avoid obscure abbreviations and made-up words.
-
-- In general, make it easy for others to read your code. Your future self will
- thank you, and so will your collaborators!
-
-- [Don't Repeat Yourself
- (DRY)!](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) Instead of
- repeating the same block of code multiple times, abstract it out into a
- separate file and `include` that file where you need it.
-
-### Whitespace
-
-- Always use spaces. Never use tabs.
-
-- Each indentation step should be exactly two (2) spaces.
-
-- Whenever you add an opening tag, indent the following line. (Exception: If
- you open and close the tag on the same line, do not indent the following
- line.)
-
-- Indent Liquid the same way as HTML.
-
-- In general, the starting columns of every adjacent pair of lines should be no
- more than two spaces apart (example below).
-
-- No blank or empty lines. (Hint: When you feel you need one, add a comment on
- that line instead.)
-
-#### Indentation example
-
-Here's an example that follows the indentation rules:
-
-{% raw %}
-```html
-
-
-
- {% for item in secs.htmlsections[0].columns %}
-
{{ item.title }}
- {% endfor %}
-
- {% for canary in site.data.sec-canary reversed %}
-
-```
-{% endraw %}
+---
\ No newline at end of file
diff --git a/developer/releases/1_0/release-notes.md b/developer/releases/1_0/release-notes.md
index 39c6ea37d..35e946833 100644
--- a/developer/releases/1_0/release-notes.md
+++ b/developer/releases/1_0/release-notes.md
@@ -4,47 +4,7 @@ layout: doc
permalink: /doc/releases/1.0/release-notes/
redirect_from:
- /en/doc/releases/1.0/release-notes/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/1_0/release-notes.html
ref: 18
title: Qubes R1.0 release notes
----
-
-Detailed release notes in [this blog post](https://blog.invisiblethings.org/2012/09/03/introducing-qubes-10.html).
-
-## Known issues
-
-- Installer might not support some USB keyboards (\#230). This seems to include all the Mac Book keyboards (most PC laptops have PS2 keyboards and are not affected).
-
-- If you don't enable Composition (System Setting -\> Desktop -\> Enable desktop effects), which you really should do, then the KDE task bar might get ugly (e.g. half of it might be black). This is some KDE bug that we don't plan to fix.
-
-- Some keyboard layout set by KDE System Settings can cause [keyboard not working at all](https://groups.google.com/group/qubes-devel/browse_thread/thread/77d076b65dda7226). If you hit this issue, you can switch to console (by console login option) and manually edit `/etc/X11/xorg.conf.d/00-system-setup-keyboard.conf` (and `/etc/sysconfig/keyboard`) and place correct keyboard layout settings (details in linked thread). You can check if specific keyboard layout settings are proper using `setxkbmap` tool.
-
-- On systems with more than 8GB of RAM there is problem with DisposableVM. To fix it, limit maximum memory allocation for DispVM to 3GB
-
- ~~~
- qvm-prefs -s fedora-17-x64-dvm maxmem 3072
- qvm-create-default-dvm --default-template --default-script
- ~~~
-
-- On some systems the KDE Window Manager might freeze upon resuming from S3 sleep when compositing is enabled (and the only method to log in to the system if this happens is to switch to a text console, enter your user's password, kill the kwin process, go back to the Xorg console, log in, and start a new instance of kwin using Konsole application :) If you experience such problems, make sure to disable compositing before putting the system into sleep by pressing Alt-Ctrl-F12 (and then enabling it back once you log in after resume) -- this way you should never see this problem again.
-
-## Downloads
-
-See [Qubes Downloads](/doc/QubesDownloads/).
-
-## Installation instructions
-
-See [Installation Guide](/doc/installation-guide/).
-
-## Upgrading
-
-### From Qubes 1.0-rc1
-
-If you're already running Qubes 1.0-rc1, you don't need to reinstall, it's just enough to update the packages in your Dom0 and the template VM(s). The easiest way for doing this is to click on the Update Button in the Qubes Manger -- one click when you selected Dom0, and one click for each of your template VM (by default there is just one template).
-
-### From Qubes 1.0 Beta 3
-
-If you have Qubes Beta 3 currently installed on your system, you must reinstall from scratch, as we offer no direct upgrade option in the installer (sorry). However, we do offer tools for smooth migration of your AppVMs. In order to do that, please backup your AppVMs using the `qvm-backup` tool [as usual](/doc/backup-restore/). Then, after you install Qubes 1.0 rc1, you can restore them using `qvm-backup-restore` tool. However, because we have changed the default template in RC1, you should tell qvm-back-restore about that by passing `--replace-template` option:
-
-~~~
-qvm-backup-restore --replace-template=fedora-15-x64:fedora-17-x64
-~~~
+---
\ No newline at end of file
diff --git a/developer/releases/2_0/release-notes.md b/developer/releases/2_0/release-notes.md
index e0a5751dd..a01c8501d 100644
--- a/developer/releases/2_0/release-notes.md
+++ b/developer/releases/2_0/release-notes.md
@@ -4,82 +4,7 @@ layout: doc
permalink: /doc/releases/2.0/release-notes/
redirect_from:
- /en/doc/releases/2.0/release-notes/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/2_0/release-notes.html
ref: 25
title: Qubes R2.0 release notes
----
-
-Detailed release notes in [this blog post](https://blog.invisiblethings.org/2014/09/26/announcing-qubes-os-release-2.html)
-
-## New features since 1.0
-
-* Support for generic fully virtualized VMs (without qemu in the TCB!)
-* Support for Windows-based AppVMs integration (clipboard, file exchange, qrexec, pv drivers)
-* Secure audio input to select AppVMs (Hello Skype users!)
-* Clipboard is now also controlled by central policies, unified with other qrexec policies.
-* Out of the box TorVM support
-* Experimental support for PVUSB
-* Updated Xorg packages in Dom0 to support new GPUs
-* DisposableVM customization support
-* Introduced Xfce 4.10 environment for Dom0 as an alternative to KDE
-* Advanced infrastructure for system backups
-* Ability to autostart selected VM at system startup
-* Support for dynamic screen resolution change
-* Dom0 distribution upgraded to Fedora 20
-
-## Known issues
-
-* On some graphics cards the Xfce4 Window Manager (one of the two supported Dom0 Windows Managers in Qubes R2, the other being KDE) might behave "strangely", e.g. decorations might not be drawn sometimes. Also the accompanying lightdm login manager might incorrectly display the wallpaper. If you're facing those problems, it's advisable to use the KDE Window Manager and kdm instead of Xfce4 and lightdm (this is default if one chooses the KDE only installation option in the installer).
-
-* Some icons in the Qubes Manager application might not be drawn correctly when using the Xfce4 environment in Dom0. If this bothers you, please use the KDE environment instead.
-
-* If your GPU is not correctly supported by the Dom0 kernel (e.g. the 3D desktop effects do not run smoothly) then you might experience "heaviness" with Windows 7-based AppVMs. In that case, please solve the problem with your GPU support in Dom0 in the first place (by using a different kernel), or install Qubes OS on a different system.
-
-* Under some circumstances, Qubes backup can create broken backup, without any visible message (\#902). It is advisable to verify a backup to spot the problem. If you encounter this problem, backup VM directory manually.
-
-* System shutdown sometimes is very slow (\#903). To mitigate the problem, shutdown all the VMs first.
-
-* For other known issues take a look at [our trac tickets](https://wiki.qubes-os.org/query?status=accepted&status=assigned&status=new&status=reopened&type=defect&milestone=Release+2.1+(post+R2)&col=id&col=summary&col=status&col=type&col=priority&col=milestone&col=component&order=priority)
-
-It is advised to install updates just after system installation to apply bug fixes for (some of) the above problems.
-
-## Downloads
-
-See [Qubes Downloads](/doc/QubesDownloads/).
-
-## Installation instructions
-
-See [Installation Guide](/doc/installation-guide/).
-
-## Upgrading
-
-### From Qubes R2 rc1
-
-Upgrading from Qubes R2 rc1 should be a simple matter of installing updates for [dom0](/doc/how-to-install-software-in-dom0/) and [VMs](/doc/software-update-vm/).
-
-### From Qubes R2 beta 3 and older
-
-The easiest and safest way to upgrade to Qubes R2 (especially from older releases) is to install it from scratch and use [qubes backup and restore tools](/doc/backup-restore/) for migrating of all of the user VMs.
-
-Users of R2 beta 3 can upgrade using procedure that has been described [here](/doc/upgrade-to-r2/).
-
-Note: if the user has custom Template VMs (i.e. other than the default template, e.g. created from it by cloning), or Standalone VMs, then the user should perform manual upgrade from R2B3 to R2rc1, as described under the link given above.
-
-### Migrating between beta releases
-
-#### From Qubes R1 to R2 beta1
-
-If you're already running Qubes Release 1, you don't need to reinstall, it's just enough to update the packages in your Dom0 and the template VM(s). This procedure is described [here?](/doc/upgrade-to-r2/).
-
-#### From Qubes R1 or R2 Beta 1 to R2 beta2
-
-Because of the distribution change in R2B2 (from fc13 to fc18) it's preferred that users reinstall Qubes R2B2 from scratch, and use [qubes backup and restore tools](/doc/backup-restore/) for migrating of all of the user VMs.
-
-Advanced users (and advanced users only) can also try a manual upgrade procedure that has been described [here](/doc/upgrade-to-r2b2/). It's advisable to backup your VMs before proceeding anyway!
-
-#### Upgrading from Qubes R1 or R2 Beta 2 to R2 beta 3
-
-The easiest and safest way to upgrade to Qubes R2B3 is to install it from scratch and use [qubes backup and restore tools](/doc/backup-restore/) for migrating of all of the user VMs.
-
-Users can also try a manual upgrade procedure that has been described [here](/doc/upgrade-to-r2b3/).
-
-Note: if the user has custom Template VMs (i.e. other than the default template, e.g. created from it by cloning), or Standalone VMs, then the user should perform manual upgrade from R2B2 to R2B3, as described under the link given above.
+---
\ No newline at end of file
diff --git a/developer/releases/3_0/release-notes.md b/developer/releases/3_0/release-notes.md
index e31b4a276..1e32f98b9 100644
--- a/developer/releases/3_0/release-notes.md
+++ b/developer/releases/3_0/release-notes.md
@@ -4,59 +4,7 @@ layout: doc
permalink: /doc/releases/3.0/release-notes/
redirect_from:
- /en/doc/releases/3.0/release-notes/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/3_0/release-notes.html
ref: 19
title: Qubes R3.0 release notes
----
-
-### Qubes R3.0 Release Notes
-
-This Qubes OS release is dedicated to the memory of Caspar Bowden.
-
-## New features since 2.0
-
-* HAL (Hypervisor Abstraction Layer) - based on libvirt, opens a whole new
- possibilities of using different hypervisors. Currently Qubes OS uses Xen.
-* Xen 4.4 - many new features, but for us the most important is much more
- mature libxl toolstack.
-* Qrexec 3 - greatly improved performance by using direct VM-VM connections and
- bigger buffers.
-* Debian templates gets official support.
-* Whonix templates
-* Build system improvements - especially support for distribution-specific
- plugins (makes supporting multiple distributions much easier) and building
- templates using DispVM.
-* Automated tests - makes much easier to find bugs, before its even shipped to users
-
-## Known issues
-
-* Windows Tools: `qvm-block` does not work
-
-* UEFI is not supported, you need to enable "legacy boot" in BIOS before installing Qubes OS
-
-* Some icons in the Qubes Manager application might not be drawn correctly when using the Xfce4 environment in Dom0. If this bothers you, please use the KDE environment instead.
-
-* If your GPU is not correctly supported by the Dom0 kernel (e.g. the 3D desktop effects do not run smoothly) then you might experience "heaviness" with Windows 7-based AppVMs. In that case, please solve the problem with your GPU support in Dom0 in the first place (by using a different kernel), or install Qubes OS on a different system.
-
-* For other known issues take a look at [our tickets](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Release+3.0%22+label%3Abug)
-
-It is advised to install updates just after system installation to apply bug fixes for (some of) the above problems.
-
-## Downloads
-
-See [Qubes Downloads](/doc/QubesDownloads/).
-
-## Installation instructions
-
-See [Installation Guide](/doc/installation-guide/).
-
-## Upgrading
-
-### From R3.0 release candidate
-
-If you are using Qubes R3.0rc1, R3.0rc2 or R3.0rc3, just install system updates, there is no special steps required.
-
-### From R2.0 or earlier
-
-The easiest and safest way to upgrade to Qubes R3.0 is to install it from scratch and use [qubes backup and restore tools](/doc/backup-restore/) for migrating of all of the user VMs.
-
-Users of Qubes R2 can upgrade using [experimental procedure](/doc/upgrade-to-r3.0/).
+---
\ No newline at end of file
diff --git a/developer/releases/3_0/schedule.md b/developer/releases/3_0/schedule.md
index 255ce7080..167ed6ada 100644
--- a/developer/releases/3_0/schedule.md
+++ b/developer/releases/3_0/schedule.md
@@ -4,12 +4,7 @@ layout: doc
permalink: /doc/releases/3.0/schedule/
redirect_from:
- /en/doc/releases/3.0/schedule/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/3_0/schedule.html
ref: 20
title: Qubes R3.0 release schedule
----
-
-| Date | Stage |
-| -----------:| ------------------------------------- |
-| 5 Sep 2015 | current-testing freeze before 3.0-rc3 |
-| 15 Sep 2015 | 3.0-rc3 release |
-| 1 Oct 2015 | 3.0 release |
+---
\ No newline at end of file
diff --git a/developer/releases/3_1/release-notes.md b/developer/releases/3_1/release-notes.md
index 35d1bcd4b..078c371bb 100644
--- a/developer/releases/3_1/release-notes.md
+++ b/developer/releases/3_1/release-notes.md
@@ -2,64 +2,7 @@
lang: en
layout: doc
permalink: /doc/releases/3.1/release-notes/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/3_1/release-notes.html
ref: 16
title: Qubes R3.1 release notes
----
-
-## New features since 3.0
-
-* Management Stack based of Salt Stack in dom0 - [documentation](/doc/salt/)
-* Out of the box Whonix setup
-* UEFI support
-* LIVE edition (still alpha, not part of R3.1-rc1)
-* Updated GPU drivers in dom0
-* Colorful window application icons (instead of just colorful lock icon)
-* PV Grub support ([documentation](/doc/managing-vm-kernels/))
-* Out of the box USB VM setup, including [handling USB mouse](https://github.com/QubesOS/qubes-app-linux-input-proxy/blob/master/README.md)
-* Xen upgraded to 4.6, for better hardware support (especially Skylake platform)
-* Improve updates proxy flexibility - especially repositories served over HTTPS
-
-You can get detailed description in [completed github issues](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aissue+sort%3Aupdated-desc+milestone%3A%22Release+3.1%22+label%3Arelease-notes+is%3Aclosed)
-
-## Known issues
-
-* Installation image does not fit on DVD, requires either DVD DL, or USB stick (5GB or more)
-
-* Windows Tools: `qvm-block` does not work
-
-* Some icons in the Qubes Manager application might not be drawn correctly when using the Xfce4 environment in Dom0. If this bothers you, please use the KDE environment instead.
-
-* USB mouse (in the case of USB VM) does not work at first system startup (just after completing firstboot). Workaround: restart the system.
-
-* For other known issues take a look at [our tickets](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Release+3.1%22+label%3Abug)
-
-It is advised to install updates just after system installation to apply bug fixes for (some of) the above problems.
-
-## Downloads
-
-See [Qubes Downloads](/downloads/).
-
-## Installation instructions
-
-See [Installation Guide](/doc/installation-guide/).
-
-## Upgrading
-
-### From R3.0
-
-The easiest and safest way to upgrade to Qubes R3.1 is to install it from
-scratch and use [qubes backup and restore tools](/doc/backup-restore/) for
-migrating of all of the user VMs.
-
-Users of Qubes R3.0 can upgrade using [experimental
-procedure](/doc/upgrade-to-r3.1/).
-
-### From R2 or earlier
-
-When upgrading from earlier versions the easiest and safest way is to install
-it from scratch and use [qubes backup and restore tools](/doc/backup-restore/)
-for migrating of all of the user VMs.
-
-Alternatively you can [upgrade to R3.0
-using](/doc/releases/3.0/release-notes/#upgrading) first, then follow the
-instructions above. This will be time consuming process.
+---
\ No newline at end of file
diff --git a/developer/releases/3_1/schedule.md b/developer/releases/3_1/schedule.md
index 93cd69c7c..5e2d01b35 100644
--- a/developer/releases/3_1/schedule.md
+++ b/developer/releases/3_1/schedule.md
@@ -4,17 +4,7 @@ layout: doc
permalink: /doc/releases/3.1/schedule/
redirect_from:
- /en/doc/releases/3.1/schedule/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/3_1/schedule.html
ref: 17
title: Qubes R3.1 release schedule
----
-
-This schedule is based on [Version Scheme](/doc/version-scheme/#release-schedule).
-
-| Date | Stage |
-| -----------:| --------------------------------------- |
-| 8 Dec 2015 | 3.1-rc1 release |
-| 5 Jan 2016 | current-testing freeze before 3.1-rc2 |
-| 12 Jan 2016 | 3.1-rc2 release |
-| 26 Jan 2016 | decide whether 3.1-rc2 is the final 3.1 |
-| 9 Feb 2016 | current-testing freeze before 3.1-rc3 |
-| ~~16 Feb 2016~~ 23 Feb 2016 | 3.1-rc3 release |
+---
\ No newline at end of file
diff --git a/developer/releases/3_2/release-notes.md b/developer/releases/3_2/release-notes.md
index 547dff271..7723f8990 100644
--- a/developer/releases/3_2/release-notes.md
+++ b/developer/releases/3_2/release-notes.md
@@ -2,60 +2,7 @@
lang: en
layout: doc
permalink: /doc/releases/3.2/release-notes/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/3_2/release-notes.html
ref: 21
title: Qubes R3.2 release notes
----
-
-## New features since 3.1
-
-* Management Stack extended to support in-VM configuration - [documentation](/doc/salt/)
-* PV USB - [documentation](/doc/usb/)
-* Dom0 update to Fedora 23 for better hardware support
-* Kernel 4.4.x
-* Default desktop environment switched to Xfce4
-* KDE 5 support (but it is no longer the default one)
-* Tiling window managers support: awesome, [i3](/doc/i3/)
-* More flexible Qubes RPC services - [related ticket](https://github.com/QubesOS/qubes-issues/issues/1876), [documentation](/doc/qrexec/#service-policies-with-arguments)
-
-You can get detailed description in [completed github issues](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aissue+sort%3Aupdated-desc+milestone%3A%22Release+3.2%22+label%3Arelease-notes+is%3Aclosed)
-
-## Known issues
-
-* [Fedora 23 reached EOL in December 2016](https://fedoraproject.org/wiki/End_of_life). There is a [manual procedure to upgrade your VMs](/news/2018/01/06/fedora-26-upgrade/).
-
-* Windows Tools: `qvm-block` does not work
-
-* Some icons in the Qubes Manager application might not be drawn correctly when using the Xfce4 environment in Dom0. If this bothers you, please use the KDE environment instead.
-
-* For other known issues take a look at [our tickets](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Release+3.2%22+label%3Abug)
-
-It is advised to install updates just after system installation to apply bug fixes for (some of) the above problems.
-
-## Downloads
-
-See [Qubes Downloads](/downloads/).
-
-## Installation instructions
-
-See [Installation Guide](/doc/installation-guide/).
-After installation, [manually upgrade to Fedora 26](/news/2018/01/06/fedora-26-upgrade/).
-
-## Upgrading
-
-### From R3.1
-
-The easiest and safest way to upgrade to Qubes R3.2 is to install it from
-scratch and use [qubes backup and restore tools](/doc/backup-restore/) for
-migrating of all of the user VMs.
-
-Users of Qubes R3.1 can also upgrade using [this
-procedure](/doc/upgrade-to-r3.2/).
-
-### From R3.0 or earlier
-
-When upgrading from earlier versions the easiest and safest way is to install
-it from scratch and use [qubes backup and restore tools](/doc/backup-restore/)
-for migrating of all of the user VMs.
-
-Alternatively you can [upgrade to R3.1 using](/doc/releases/3.1/release-notes/#upgrading) first, then follow
-the instructions above. This will be time consuming process.
+---
\ No newline at end of file
diff --git a/developer/releases/3_2/schedule.md b/developer/releases/3_2/schedule.md
index 36cedd236..baf99e4f9 100644
--- a/developer/releases/3_2/schedule.md
+++ b/developer/releases/3_2/schedule.md
@@ -4,19 +4,7 @@ layout: doc
permalink: /doc/releases/3.2/schedule/
redirect_from:
- /en/doc/releases/3.2/schedule/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/3_2/schedule.html
ref: 22
title: Qubes R3.2 release schedule
----
-
-This schedule is based on [Version Scheme](/doc/version-scheme/#release-schedule).
-
-| Date | Stage |
-| -----------:| --------------------------------------- |
-| 18 Jun 2016 | 3.2-rc1 release |
-| 2 Jul 2016 | decide whether 3.2-rc1 is the final 3.2 |
-| ~~16 Jul 2016~~ 20 Jul 2016 | current-testing freeze before 3.2-rc2 |
-| ~~23 Jul 2016~~ 27 Jul 2016 | 3.2-rc2 release |
-| ~~5 Aug 2016~~ 9 Aug 2016 | decide whether 3.2-rc2 is the final 3.2 |
-| 24 Aug 2016 | current-testing freeze before 3.2-rc3 |
-| 31 Aug 2016 | 3.2-rc3 release |
-| 29 Sep 2016 | 3.2 release |
+---
\ No newline at end of file
diff --git a/developer/releases/4_0/release-notes.md b/developer/releases/4_0/release-notes.md
index b80a1959d..41c1b3219 100644
--- a/developer/releases/4_0/release-notes.md
+++ b/developer/releases/4_0/release-notes.md
@@ -2,106 +2,7 @@
lang: en
layout: doc
permalink: /doc/releases/4.0/release-notes/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/4_0/release-notes.html
ref: 23
title: Qubes R4.0 release notes
----
-
-New features since 3.2
-----------------------
-
-* Core management scripts rewrite with better structure and extensibility, [API documentation](https://dev.qubes-os.org/projects/qubes-core-admin/en/latest/)
-* [Admin API](/news/2017/06/27/qubes-admin-api/) allowing strictly controlled managing from non-dom0
-* All `qvm-*` command-line tools rewritten, some options have changed
-* Renaming VM directly is prohibited, there is GUI to clone under new name and remove old VM
-* Use [PVH](https://github.com/QubesOS/qubes-secpack/blob/master/QSBs/qsb-037-2018.txt) and [HVM](https://github.com/QubesOS/qubes-issues/issues/2185) by default to [mitigate Meltdown & Spectre](https://github.com/QubesOS/qubes-secpack/blob/master/QSBs/qsb-037-2018.txt) and lower the [attack surface on Xen](https://github.com/QubesOS/qubes-secpack/blob/master/QSBs/qsb-024-2016.txt)
-* Create USB VM by default
-* [Multiple DisposableVMs templates support](https://github.com/QubesOS/qubes-issues/issues/2253)
-* New [backup format](/doc/backup-emergency-restore-v4/) using scrypt key-derivation function
-* Non-encrypted backups no longer supported
-* [split VM packages](https://github.com/QubesOS/qubes-issues/issues/2771), for better support minimal, specialized templates
-* [Qubes Manager decomposition](https://github.com/QubesOS/qubes-issues/issues/2132) - domains and devices widgets instead of full Qubes Manager; devices widget support also USB
-* [More flexible firewall interface](/doc/vm-interface/) for ease unikernel integration
-* Template VMs do not have network interface by default, [qrexec-based updates proxy](https://github.com/QubesOS/qubes-issues/issues/1854) is used instead
-* More flexible IP addressing for VMs - [custom IP](https://github.com/QubesOS/qubes-issues/issues/1477), [hidden from the IP](https://github.com/QubesOS/qubes-issues/issues/1143)
-* More flexible Qubes RPC policy - [related ticket](https://github.com/QubesOS/qubes-issues/issues/865), [documentation](/doc/qrexec/#specifying-vms-tags-types-targets-etc)
-* [New Qubes RPC confirmation window](https://github.com/QubesOS/qubes-issues/issues/910), including option to specify destination VM
-* [New storage subsystem design](https://github.com/QubesOS/qubes-issues/issues/1842)
-* Dom0 update to Fedora 25 for better hardware support
-* Kernel 4.9.x
-
-You can get detailed description in [completed github issues](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aissue+sort%3Aupdated-desc+milestone%3A%22Release+4.0%22+label%3Arelease-notes+is%3Aclosed)
-
-Security Notes
---------------
-
-* PV VMs migrated from 3.2 to 4.0-rc4 or later are automatically set to PVH mode in order to protect against Meltdown (see [QSB #37](https://github.com/QubesOS/qubes-secpack/blob/master/QSBs/qsb-037-2018.txt)).
- However, PV VMs migrated from any earlier 4.0 release candidate (RC1, RC2, or RC3) are not automatically set to PVH mode.
- These must be set manually.
-
-* The following steps may need to be applied in dom0 and Fedora 26 TemplateVMs in order to receive updates (see [#3737](https://github.com/QubesOS/qubes-issues/issues/3737)).
-
- Steps for dom0 updates:
-
- 1. Open the Qubes Menu by clicking on the "Q" icon in the top-left corner of the screen.
- 2. Select `Terminal Emulator`.
- 3. In the window that opens, enter this command:
-
- ```
- sudo nano /etc/yum.repos.d/qubes-dom0.repo
- ```
-
- 4. This opens the nano text editor. Change all four instances of `http` to `https`.
- 5. Press `CTRL+X`, then `Y`, then `ENTER` to save changes and exit.
- 6. Check for updates normally.
-
- Steps for Fedora 26 TemplateVM updates:
-
- 1. Open the Qubes Menu by clicking on the "Q" icon in the top-left corner of the screen.
- 2. Select `Template: fedora-26`, then `fedora-26: Terminal`.
- 3. In the window that opens, enter the command for your version:
-
- ```
- [Qubes 3.2] sudo gedit /etc/yum.repos.d/qubes-r3.repo
- [Qubes 4.0] sudo gedit /etc/yum.repos.d/qubes-r4.repo
- ```
-
- 4. This opens the gedit text editor in a window. Change all four instances of `http` to `https`.
- 5. Click the "Save" button in the top-right corner of the window.
- 6. Close the window.
- 7. Check for updates normally.
- 8. Shut down the TemplateVM.
-
-Known issues
-------------
-
-* Locale using coma as decimal separator [crashes qubesd](https://github.com/QubesOS/qubes-issues/issues/3753). Either install with different locale (English (United States) for example), or manually apply fix explained in that issue.
-
-* In the middle of installation, [keyboard layout reset to US](https://github.com/QubesOS/qubes-issues/issues/3352). Be careful what is the current layout while setting default user password (see upper right screen corner).
-
-* On some laptops (for example Librem 15v2), touchpad do not work directly after installation. Reboot the system to fix the issue.
-
-* List of USB devices may contain device identifiers instead of name
-
-* With R4.0.1, which ships kernel-4.19, you may never reach the anaconda startup and be block on an idle black screen with blinking cursor. You can try to add `plymouth.ignore-serial-consoles` in the grub installer boot menu right after `quiet rhgb`. With legacy mode, you can do it directly when booting the DVD or USB key. In UEFI mode, follow the same procedure described for [disabling](/doc/uefi-troubleshooting/#installation-freezes-before-displaying-installer) `nouveau` module (related [solved issue](https://github.com/QubesOS/qubes-issues/issues/3849) in further version of Qubes).
-
-* For other known issues take a look at [our tickets](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Release+4.0%22+label%3Abug)
-
-It is advised to install updates just after system installation to apply bug fixes for (some of) the above problems.
-
-Downloads
----------
-
-See [Qubes Downloads](/downloads/).
-
-Installation instructions
--------------------------
-
-See [Installation Guide](/doc/installation-guide/).
-
-Upgrading
----------
-
-There is no in-place upgrade path from earlier Qubes versions. The only
-supported option to upgrade to Qubes R4.0 is to install it from scratch and use
-[qubes backup and restore tools](/doc/backup-restore/) for migrating of all of the user VMs.
-We also provide [detailed instruction](/doc/upgrade-to-r4.0/) for this procedure.
+---
\ No newline at end of file
diff --git a/developer/releases/4_0/schedule.md b/developer/releases/4_0/schedule.md
index 6268a9999..ff21e8c67 100644
--- a/developer/releases/4_0/schedule.md
+++ b/developer/releases/4_0/schedule.md
@@ -4,25 +4,7 @@ layout: doc
permalink: /doc/releases/4.0/schedule/
redirect_from:
- /en/doc/releases/4.0/schedule/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/4_0/schedule.html
ref: 24
title: Qubes R4.0 release schedule
----
-
-This schedule is based on [Version Scheme](/doc/version-scheme/#release-schedule).
-
-| Date | Stage |
-| -----------:| --------------------------------------- |
-| 31 Jul 2017 | 4.0-rc1 release |
-| ~~28 Aug 2017~~ ~~11 Sep 2017~~ ~~9 Oct 2017~~ 18 Oct 2017 | current-testing freeze before 4.0-rc2 |
-| ~~4 Sep 2017~~ ~~18 Sep 2017~~ ~~16 Oct 2017~~ 23 Oct 2017 | 4.0-rc2 release |
-| 6 Nov 2017 | decide whether 4.0-rc2 is the final 4
-| 20 Nov 2017 | current-testing freeze before 4.0-rc3 |
-| 27 Nov 2017 | 4.0-rc3 release |
-| 11 Dec 2017 | decide whether 4.0-rc3 is the final 4.0 |
-| 1 Jan 2018 | current-testing freeze before 4.0-rc4 |
-| ~~8 Jan 2018~~ 31 Jan 2018 | 4.0-rc4 release |
-| ~~22 Jan 2018~~ 14 Feb 2018 | decide whether 4.0-rc4 is the final 4.0 |
-| 27 Feb 2018 | current-testing freeze before 4.0-rc5 |
-| 6 Mar 2018 | 4.0-rc5 release |
-| 20 Mar 2018 | decide whether 4.0-rc5 is the final 4.0 |
-| 28 Mar 2018 | final 4.0 release |
+---
\ No newline at end of file
diff --git a/developer/releases/4_1/release-notes.md b/developer/releases/4_1/release-notes.md
index e2a4f9f94..818003177 100644
--- a/developer/releases/4_1/release-notes.md
+++ b/developer/releases/4_1/release-notes.md
@@ -1,93 +1,6 @@
---
layout: doc
-title: Qubes OS 4.1 release notes
permalink: /doc/releases/4.1/release-notes/
----
-
-## New features and improvements since Qubes 4.0
-
-- Optional qubes-remote-support package now available from repositories
- (strictly opt-in, no package installed by default; no new ports or network
- connections open by default; requires explicit connection initiation by the
- user, then requires sharing a code word with the remote party before a
- connection can be established; see
- [#6364](https://github.com/QubesOS/qubes-issues/issues/6364) for more
- information)
-- Qubes firewall reworked to be more defensive (see
- [#5540](https://github.com/QubesOS/qubes-issues/issues/5540) for details)
-- Xen upgraded to version 4.14
-- Dom0 operating system upgraded to Fedora 32
-- Default desktop environment upgraded to Xfce 4.14
-- Upgraded default template releases
-- Experimental support for GUI running outside of dom0 (hybrid mode GUI domain
- without real GPU passthrough; see
- [#5662](https://github.com/QubesOS/qubes-issues/issues/5662) for details)
-- Experimental support for audio server running outside of dom0 ("Audio domain")
-- sys-firewall and sys-usb are now disposables by default
-- UEFI boot now loads GRUB, which in turn loads Xen, making the boot path
- similar to legacy boot and allowing the user to modify boot parameters or
- choose an alternate boot menu entry
-- New qrexec policy format (see
- [#4370](https://github.com/QubesOS/qubes-issues/issues/4370) for details)
-- qrexec protocol improvements (see
- [#4909](https://github.com/QubesOS/qubes-issues/issues/4909) for details)
-- New qrexec-policy daemon
-- Simplified using in-qube kernels
-- Windows USB and audio support courtesy of
- [tabit-pro](https://github.com/tabit-pro) (see
- [#5802](https://github.com/QubesOS/qubes-issues/issues/5802) and
- [#2624](https://github.com/QubesOS/qubes-issues/issues/2624))
-- Clarified disposable-related terminology and properties
-- Default kernelopts can now be specified by a kernel package
-- Improved support for high-resolution displays
-- Improved notifications when a system drive runs out of free space
-- Support for different cursor shapes
-- "Paranoid mode" backup restore option now properly supported using
- disposables
-- Users can now choose between Debian and Fedora in the installer
-- Certain files and applications are now opened in disposables, e.g.,
- Thunderbird email attachments
-- New graphical interface for managing testing repository updates
-- New "Cute Qube" icon family (replaces padlock icons)
-- Disposable qube types now use the disposable icon
-- New Template Manager tool for installing, removing, and updating templates
- (meanwhile, the tool previously known as the "Template Manager," which was
- for mass template switching, has been integrated into the Qube Manager)
-- The "file" storage driver has been deprecated in Qubes 4.1 and will be
- removed in Qubes 4.2
-- `property-del` event renamed to `property-reset` to avoid confusion
-- qrexec no longer supports non-executable files in `/etc/qubes-rpc`
-- qrexec components have been reorganized into the core-qrexec repository
-- The `qvm-pool` argument parser has been rewritten and improved
-- Removed the need for the out-of-tree u2mfn kernel module
-- Qrexec services can now run as a socket server
-- Improved template distribution mechanism
-- Now possible to restart qrexec-agent
-- The term "VM" has largely been replaced by "qube"
-- GUI daemon is now configured using `qvm-features` tool,
- `/etc/qubes/guid.conf` file is no longer used
-- `qvm-run` tool got `--no-shell` option to run a single command without using
- a shell inside the qube
-- MAC Randomization for iwlwifi (see [#938](https://github.com/QubesOS/qubes-issues/issues/938))
-
-For a full list, including more detailed descriptions, please see
-[here](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aissue+sort%3Aupdated-desc+milestone%3A%22Release+4.1%22+label%3A%22release+notes%22+is%3Aclosed).
-
-## Known issues
-
-For a full list of known 4.1 issues with open bug reports, please see
-[here](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Release+4.1%22+label%3A%22T%3A+bug%22).
-We strongly recommend [updating Qubes OS](/doc/how-to-update/) immediately
-after installation in order to apply any and all available bug fixes.
-
-## Download
-
-See [downloads](/downloads/).
-
-## Installation instructions
-
-See the [installation guide](/doc/installation-guide/).
-
-## Upgrading
-
-Please see [how to upgrade to Qubes 4.1](/doc/upgrade/4.1/).
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/4_1/release-notes.html
+title: Qubes OS 4.1 release notes
+---
\ No newline at end of file
diff --git a/developer/releases/4_1/schedule.md b/developer/releases/4_1/schedule.md
index 6efd33291..cd65f5701 100644
--- a/developer/releases/4_1/schedule.md
+++ b/developer/releases/4_1/schedule.md
@@ -4,22 +4,6 @@ layout: doc
permalink: /doc/releases/4.1/schedule/
redirect_from:
- /en/doc/releases/4.1/schedule/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/4_1/schedule.html
title: Qubes R4.1 release schedule
----
-
-The table below is based on our [release schedule
-policy](/doc/version-scheme/#release-schedule).
-
-| Date | Stage |
-| ----------:| ----------------------------------------- |
-| 2021-10-11 | 4.1.0-rc1 release |
-| 2021-11-08 | current-testing freeze before 4.1.0-rc2 |
-| 2021-11-15 | 4.1.0-rc2 release |
-| 2021-11-29 | decide whether 4.1.0-rc2 is the final 4.1 |
-| 2021-12-13 | current-testing freeze before 4.1.0-rc3 |
-| 2021-12-20 | 4.1.0-rc3 release |
-| 2022-01-03 | decide whether 4.1.0-rc3 is the final 4.1 |
-| 2022-01-11 | current-testing freeze before 4.1.0-rc4 |
-| 2022-01-18 | 4.1.0-rc4 release |
-| 2022-01-31 | decide whether 4.1.0-rc4 is the final 4.1 |
-| 2022-02-04 | final 4.1.0 release |
+---
\ No newline at end of file
diff --git a/developer/releases/notes.md b/developer/releases/notes.md
index 1be2115db..9206b4cca 100644
--- a/developer/releases/notes.md
+++ b/developer/releases/notes.md
@@ -2,14 +2,7 @@
lang: en
layout: doc
permalink: /doc/releases/notes/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/notes.html
ref: 13
title: Release notes
----
-
-* [Qubes R1.0 release notes](/doc/releases/1.0/release-notes/)
-* [Qubes R2.0 release notes](/doc/releases/2.0/release-notes/)
-* [Qubes R3.0 release notes](/doc/releases/3.0/release-notes/)
-* [Qubes R3.1 release notes](/doc/releases/3.1/release-notes/)
-* [Qubes R3.2 release notes](/doc/releases/3.2/release-notes/)
-* [Qubes R4.0 release notes](/doc/releases/4.0/release-notes/)
-* [Qubes R4.1 release notes](/doc/releases/4.1/release-notes/)
+---
\ No newline at end of file
diff --git a/developer/releases/schedules.md b/developer/releases/schedules.md
index 6f656cf16..ed96fb114 100644
--- a/developer/releases/schedules.md
+++ b/developer/releases/schedules.md
@@ -2,12 +2,7 @@
lang: en
layout: doc
permalink: /doc/releases/schedules/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/schedules.html
ref: 15
title: Release schedules
----
-
-* [Qubes R3.0 release schedule](/doc/releases/3.0/schedule/)
-* [Qubes R3.1 release schedule](/doc/releases/3.1/schedule/)
-* [Qubes R3.2 release schedule](/doc/releases/3.2/schedule/)
-* [Qubes R4.0 release schedule](/doc/releases/4.0/schedule/)
-* [Qubes R4.1 release schedule](/doc/releases/4.1/schedule/)
+---
\ No newline at end of file
diff --git a/developer/releases/todo.md b/developer/releases/todo.md
index 23d370edb..a27541334 100644
--- a/developer/releases/todo.md
+++ b/developer/releases/todo.md
@@ -4,39 +4,7 @@ layout: doc
permalink: /doc/releases/todo/
redirect_from:
- /en/doc/releases/todo/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/todo.html
ref: 14
title: Release checklist
----
-
-*the checklist is probably unfinished*
-
-On -rc1
--------
-
-* write schedule
-* create package repositories (linux-yum, linux-deb)
-* update repository definition (core-agent-linux, installer-qubes-os/qubes-release)
-* push all packages to `current-testing`
-* draft release notes, one note per feature
-* create upgrade package in previous release branch (r2->r3.0, r3.0->r3.1, etc) - core-agent-linux
-* make sure that keys for the current release are included in previous release's qubes-release package (for upgrade)
-* build ISO and push to mirrors
-
-On subsequent -rc
------------------
-
-* push packages to `current`
-* update release notes
-* build ISO and push to mirrors
-* notify @Rudd-O about the new ISO for new torrent hosting
-
-On final release
-----------------
-
-* push packages to `current`
-* finish release notes
-* update InstallationInstructions
-* build ISO and push to mirrors
-* notify @Rudd-O about the new ISO for new torrent hosting
-* write blog post
-* announce on Twitter
+---
\ No newline at end of file
diff --git a/developer/releases/version-scheme.md b/developer/releases/version-scheme.md
index a530947cf..d58ca70f6 100644
--- a/developer/releases/version-scheme.md
+++ b/developer/releases/version-scheme.md
@@ -6,176 +6,7 @@ redirect_from:
- /en/doc/version-scheme/
- /doc/VersionScheme/
- /wiki/VersionScheme/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/releases/version-scheme.html
ref: 151
title: Version scheme
----
-
-The Qubes OS Project uses the [semantic versioning](https://semver.org/)
-standard. Version numbers are written as `..`. When
-`` is omitted (e.g., `4.1`), it is usually either because `` is
-zero (as in `4.1.0`) or because we are referring to a specific minor release
-irrespective of any particular patch release within it. Similarly, the major
-release number alone (e.g., `R4`) is sometimes used to refer to an entire
-release series inclusive of all minor and patch releases within it.
-
-In general, patch releases are for backward-compatible bug fixes, minor
-releases are for backward-compatible enhancements and new features, and major
-release are for any backward-incompatible changes. This means that, in general,
-one should *not* try to introduce features or enhancements in patch releases or
-any backward-incompatible changes in patch or minor releases. (Templates are a
-notable exception, as upstream OSes almost always have their own release
-schedules.) Bug fixes are allowed in all releases, and backward-compatible
-changes are allowed in all major and minor releases.
-
-Following standard practice, **version** refers to any build that has been
-assigned a version name or number, e.g., `3.2-rc2`, `4.0.4`, `4.1-beta1`. By
-contrast, **release** refers to any version that is intended for consumption by
-the general userbase. For example, `4.0.4` was both a **version** and a
-**release**, since it was stable and intended for general public use, while
-`4.1-beta1` was a **version** but *not* a **release**, since it was not stable
-and was intended only for [testing](/doc/testing/). All releases are
-versions, but not all versions are releases.
-
-The letter **R**, as in `R4.1`, stands for **release**. The abbreviation **RC**,
-as in `3.2-rc2`, stands for **release candidate**.
-
-## Qubes distributions and products
-
-We intend to make it easy to make a remix of Qubes, targeting another
-hypervisor or isolation provider. We may also create commercial products
-intended for specific circumstances. There is one distinguished distribution
-called **Qubes OS**. All source code for it is available for download under a
-[free and open-source license](/doc/license/) and is openly developed on
-[GitHub](https://github.com/QubesOS) and our [mailing
-lists](https://www.qubes-os.org/support/). The rest of this document discusses
-Qubes OS. Another remix may have its own version series.
-
-## Release versioning
-
-Qubes OS as a whole is released from time to time. When preparing a new
-release, we decide on the `.` numbers (e.g., `3.0`). We then
-publish the first release candidate, `3.0-rc1`. When we feel that enough
-progress has been made, we'll release `3.0-rc2` and so on. All these versions
-(not yet releases) are considered unstable and not for production use. You are
-welcome to [help us test](/doc/testing/) these versions.
-
-When enough progress has been made, we announce the first stable release, e.g.
-`3.0.0`. This not only a version but an actual release. It is considered stable
-and we commit to supporting it according to our [support
-schedule](/doc/supported-releases/). Core components are branched at this
-moment and bug fixes are backported from the master branch. Please see [help,
-support, mailing lists, and forum](/support/) for places to ask questions about
-stable releases. No major features and interface incompatibilities are to be
-included in this release. We release bug fixes as patch releases (`3.0.1`,
-`3.0.2`, and so on), while backward-compatible enhancements and new features
-are introduced in the next minor release (e.g., `3.1`). Any
-backward-incompatible changes are introduced in the next major release (e.g.,
-`4.0`).
-
-Issues in our [issue tracker](/doc/issue-tracking/) are sorted by release
-[milestones](/doc/issue-tracking/#milestones).
-
-## Release schedule
-
-There is no specific schedule for releases other that more general roadmap.
-When time comes, Supreme Committee declares feature freeze and tags `-rc1` and
-releases ISO image. From this time on, no new features are accepted. Also a
-strict time schedule kicks in.
-
-Each release candidate period is as follows. For the first two weeks we accept
-and assign bug reports to be fixed before next release candidate. For the next
-two weeks we generally focus on fixing assigned bug reports, so issues
-discovered during this time may be postponed until later RC. Finally after that
-there is one week of current-testing freeze, during which time no new packages
-are released, in hope that they will be installed by wider user base and
-tested.
-
-The next RC is released five weeks after the former. All packets are published
-in `current` repository and the cycle starts over. There should be no less than
-1 and no more than 3 release candidates before final release.
-
-| Stage | Duration |
-| ------------------------ | --------- |
-| initial testing | two weeks |
-| bug fixing | two weeks |
-| `current-testing` freeze | one week |
-
-Starting with second cycle (that is, after `-rc1`) two weeks into the cycle
-(after primary bug-reporting period) the Supreme Committee decides whether
-there should be another RC. If, based on remaining issues, the Committee
-decides to release final, then the Committee agrees upon the release date,
-which should be no later than a week after.
-
-[](/attachment/doc/release-cycle.svg)
-
-## Bug priorities
-
-When deciding whether the current release candidate is the final one, the
-Committee takes bug [priorities](/doc/issue-tracking/#priority) into
-consideration. The meaning of them is as follows:
-
-- `blocker` --- when any such bug is present in the current release candidate,
- it can't be considered final release. Bugs with this priority must be fixed
- before the next release candidate, even if that means delaying its release
- (which should be considered only last resort option).
-
-- `critical` --- when any such bug is present in the current release candidate,
- it can't be considered final release. But such bugs are not qualified to
- delay next release candidate release.
-
-- `major` --- existence of such bugs do not strictly prevent the current
- release candidate be considered final (but of course we should try hard to
- not have them there). Fixing bugs of this priority can be delayed and
- qualified as updates to the final stable release.
-
-- `default` and `minor` --- existence of such bugs do not prevent the current
- release candidate be considered final. Fixing such bugs can be delayed to the
- next Qubes OS release. Eventually such fixes might be backported as an update
- to the stable release(s). (`default` should really be assigned a more
- specific priority, but in practice there are too many issues and not enough
- time, so `default` ends up staying on many issues.)
-
-All above is about bugs, no features should be assigned to the current release
-after first `-rc`. Supreme Committee is free to adjust priorities
-appropriately.
-
-## Component version
-
-Qubes release is defined as specific versions of components, which are
-developed more or less separately. Their versions are composed of major and
-minor version of target Qubes OS release followed by third component which is
-just incremented. There is no apparent indication that given version is stable
-or not.
-
-There are some non-essential components like `qubes-apps-*` that are shared
-between releases. Their versions indicate oldest qubes-release that is
-supported. We try hard to support multiple releases by one branch to ease code
-maintenance.
-
-Different Qubes releases remixes may comprise of different components and
-version are not guaranteed to be monotonic between releases. We may decide that
-for newer release some component should be downgraded. There is no guarantee
-that arbitrary combination of different versions of random components will
-yield usable (or even install-able) compilation.
-
-## Git tags and branches
-
-We mark each component version in the repository by tag containing
-`v`. Likewise, each Qubes OS release is marked by `R` tag.
-
-At the release of some release we create branches named like `release2`. Only
-bug fixes and compatible improvements are backported to these branches. These
-branches should compile. All new development is done in `master` branch. This
-branch is totally unsupported and may not even compile depending on maintainer
-of repository.
-
-All version and release tags should be made and signed by someone from ITL
-staff. Public keys are included in `qubes-builder` and available at
-.
-
-## Check installed version
-
-If you want to know which version you are running, for example to report an
-issue, you can either check in the Qubes Manager menu under `About > Qubes OS`
-or in the file `/etc/qubes-release` in dom0. For the latter you can use a
-command like `cat /etc/qubes-release` in a dom0 terminal.
+---
\ No newline at end of file
diff --git a/developer/services/admin-api.md b/developer/services/admin-api.md
index 8fa124177..a8bda0b1f 100644
--- a/developer/services/admin-api.md
+++ b/developer/services/admin-api.md
@@ -9,352 +9,7 @@ redirect_from:
- /doc/mgmt-architecture/
- /doc/admin-api-architecture/
- /doc/admin-api/table/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/developer/services/admin-api.html
ref: 36
title: Admin API
----
-
-_You may also be interested in the article
-[Introducing the Qubes Admin API](/news/2017/06/27/qubes-admin-api/)._
-
-## Goals
-
-The goals of the Admin API system is to provide a way for the user to manage
-the domains without direct access to dom0.
-
-Foreseen benefits include:
-
-- Ability to remotely manage the Qubes OS.
-- Possibility to create multi-user system, where different users are able to use
- different sets of domains, possibly overlapping. This would also require to
- have separate GUI domain.
-
-The API would be used by:
-
-- Qubes OS Manager (or any tools that would replace it)
-- CLI tools, when run from another VM (and possibly also from dom0)
-- remote management tools
-- any custom tools
-
-## Threat model
-
-TBD
-
-## Components
-
-
-
-A central entity in the Qubes Admin API system is a `qubesd` daemon, which
-holds information about all domains in the system and mediates all actions (like
-starting and stopping a qube) with `libvirtd`. The `qubesd` daemon also manages
-the `qubes.xml` file, which stores all persistent state information and
-dispatches events to extensions. Last but not least, `qubesd` is responsible for
-querying the RPC policy for qrexec daemon.
-
-The `qubesd` daemon may be accessed from other domains through a set of qrexec
-API calls called the "Admin API". This API is the intended
-management interface supported by the Qubes OS. The API is stable. When called,
-the RPC handler performs basic validation and forwards the request to the
-`qubesd` via UNIX domain socket. The socket API is private, unstable, and not
-yet documented.
-
-## The calls
-
-The API should be implemented as a set of qrexec calls. This is to make it easy
-to set the policy using current mechanism.
-
-| call | dest | argument | inside | return | note |
-| ------------------------------------- | --------- | --------- | ----------------------------------------- | --------------------------------------------------------- | ---- |
-| `admin.vmclass.List` | `dom0` | - | - | `\n` |
-| `admin.vm.List` | `dom0|` | - | - | ` class= state=\n` |
-| `admin.vm.Create.` | `dom0` | template | `name= label=
+---
\ No newline at end of file
diff --git a/introduction/issue-tracking.md b/introduction/issue-tracking.md
index 58cbffbe5..1704385e3 100644
--- a/introduction/issue-tracking.md
+++ b/introduction/issue-tracking.md
@@ -12,345 +12,7 @@ redirect_from:
- /bugs/
- /bug-report/
- /bug-reports/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/introduction/issue-tracking.html
ref: 121
title: Issue tracking
----
-
-We use [GitHub Issues](https://docs.github.com/en/issues) as our [issue
-tracking system](https://en.wikipedia.org/wiki/Issue_tracking_system). All
-issues pertaining to the Qubes OS Project (including auxiliary infrastructure
-such as this website) are tracked in
-[qubes-issues](https://github.com/QubesOS/qubes-issues/issues).
-
-## How to open a new issue
-
-First, let's make sure the issue tracker is the right place.
-
-### I need help, have a question, or want to discuss something.
-
-We're happy to help, answer questions, and have discussions, but the issue
-tracker is not the right place for these activities. Instead, please see [Help,
-Support, Mailing Lists, and Forum](/support/).
-
-### I see something that should be changed in the documentation.
-
-We encourage you to submit the change yourself! Please see the [how to edit the
-documentation](/doc/how-to-edit-the-documentation/) for instructions on how to
-do so. If it's something you can't do yourself, please proceed to open an issue.
-
-### I would like to report a security vulnerability.
-
-Thank you! If the vulnerability is confidential, please do not report it in our
-public issue tracker. Instead, please see [Reporting Security Issues in Qubes
-OS](/security/#reporting-security-issues-in-qubes-os).
-
-### I still want to open an issue.
-
-Great! Thank you for taking the time and effort to help improve Qubes! To
-ensure the process is efficient and productive for everyone involved, please
-follow these steps:
-
- 1. Carefully read our issue tracking [guidelines](#guidelines). If your issue
- would violate any of the guidelines, **stop**. Please do not submit it.
- 2. [Search through the existing issues](#search-tips), both open and closed,
- to see if your issue already exists. If it does, **stop**. [Do not open a
- duplicate.](/doc/issue-tracking/#new-issues-should-not-be-duplicates-of-existing-issues)
- Instead, comment on the existing issue.
- 3. Go [here](https://github.com/QubesOS/qubes-issues/issues/new/choose).
- 4. Select the [type](#type) of issue you want to open.
- 5. Enter a descriptive title.
- 6. Do not delete the provided issue template. Fill out every applicable
- section.
- 7. Make sure to mention any relevant documentation and other issues you've
- already seen. We don't know what you've seen unless you tell us. If you
- don't list it, we'll assume you haven't seen it.
- 8. If any sections of the issue template are *truly* not applicable, you may
- remove them.
- 9. Submit your issue.
-10. Respond to any questions the official team asks. For example, you may be
- asked to provide specific logs or other additional information.
-
-Eventually, your issue may be closed. See [how issues get
-closed](/doc/issue-tracking/#how-issues-get-closed) for details about when,
-why, and how this occurs.
-
-## Labels, milestones, and projects
-
-Labels, milestones, and projects are features of GitHub's issue tracking system
-that we use to keep
-[qubes-issues](https://github.com/QubesOS/qubes-issues/issues) organized.
-
-### Labels
-
-Only Qubes team members have permission to modify
-[labels](https://github.com/QubesOS/qubes-issues/labels) and
-[milestones](https://github.com/QubesOS/qubes-issues/milestones). Many labels
-and milestones have descriptions on them that can be viewed either in their
-respective lists or by hovering over them. Let's go over some of the most
-important ones.
-
-#### Type
-
-There are three **types**: `T: bug`, `T: enhancement`, and `T: task`.
-
-- `T: bug` --- Type: bug report. A problem or defect resulting in unintended
- behavior in something that exists.
-- `T: enhancement` --- Type: enhancement. A new feature that does not yet exist
- **or** improvement of existing functionality.
-- `T: task` --- Type: task. An action item that is neither a bug nor an
- enhancement.
-
-Every open issue should have **exactly one** type. An open issue should not
-have more than one type, and it should not lack a type entirely. Bug reports
-are for things that already exist. If something doesn't exist yet, but you
-think it should exist, then `T: enhancement`. If something already exists and
-could be improved in some way, `T: enhancement` is appropriate. `T: task` is
-for issues that fall under under neither `T: bug` nor `T: enhancement`.
-
-#### Priority
-
-There are several **priority** levels ranging from `P: minor` to `P: blocker`
-(see [here](https://github.com/QubesOS/qubes-issues/labels?q=P%3A) for the full
-list). Every open issue should have **exactly one** priority. An open issue
-should not have more than one priority, and it should not lack a priority
-entirely. See [here](/doc/version-scheme/#bug-priorities) for details about how
-the developers use these priorities.
-
-#### Component
-
-There are many **component** labels, each beginning with `C:` (see
-[here](https://github.com/QubesOS/qubes-issues/labels?page=2&q=C%3A) for the
-full list). Every open issue should have **at least one** component. An open
-issue may have more than one component, but it should not lack a component
-entirely. When no other component applies, use `C: other`.
-
-### Milestones
-
-The issue tracker has several
-[milestones](https://github.com/QubesOS/qubes-issues/milestones). Every issue
-should be assigned to **exactly one** milestone. The issue tracker does not
-allow assigning an issue to more than one milestone. If an issue is already
-assigned to a milestone, assigning it to a different one will *replace* the
-existing milestone assignment. No open issue should lack a milestone
-assignment.
-
-Most milestones correspond to specific Qubes OS releases. A bug report assigned
-to a release milestone indicates an alleged bug *in* that Qubes OS release. A
-task or enhancement assigned to a release milestone indicates that the goal is
-to implement or do that thing *in* or *for* that Qubes OS release.
-
-The `Release TBD` (To Be Determined) milestone is for enhancements or tasks
-that will be specific to a Qubes OS release but have yet to be assigned to a
-specific release milestone. Bug reports should never be assigned to this
-milestone, because every bug is a problem or defect in something that already
-exists.
-
-The `Non-release` milestone is for issues that are independent of the Qubes OS
-release cycle, including (but not limited to) website, documentation, and
-project management issues. These are issues that will never be assigned to a
-specific Qubes OS release milestone.
-
-### Projects
-
-The issue tracker has several
-[projects](https://github.com/QubesOS/qubes-issues/projects). A project is a
-way to create a group of multiple related issues. This is the preferred method
-of grouping issues, whereas trying to use normal issues as "meta-issues" or
-"epics" is discouraged.
-
-## Search tips
-
-[Search both open and closed
-issues.](https://github.com/QubesOS/qubes-issues/issues?utf8=%E2%9C%93&q=is%3Aissue)
-For example, you may be experiencing a bug that was just fixed, in which case
-the report for that bug is probably closed. In this case, it would be useful to
-view [all bug reports, both open and closed, with the most recently updated
-sorted to the
-top](https://github.com/QubesOS/qubes-issues/issues?q=label%3Abug+sort%3Aupdated-desc).
-
-[Search using labels.](https://github.com/QubesOS/qubes-issues/labels) For
-example, you can search issues by priority
-([blocker](https://github.com/QubesOS/qubes-issues/labels/P%3A%20blocker),
-[critical](https://github.com/QubesOS/qubes-issues/labels/P%3A%20critical),
-[major](https://github.com/QubesOS/qubes-issues/labels/P%3A%20major), etc.) and
-by component
-([core](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+label%3A%22C%3A+core%22),
-[manager/widget](https://github.com/QubesOS/qubes-issues/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3A%22C%3A+manager%2Fwidget%22+),
-[Xen](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+label%3A%22C%3A+Xen%22),
-etc.).
-
-You can also try searching by
-[milestone](https://github.com/QubesOS/qubes-issues/milestones) and by
-[project](https://github.com/QubesOS/qubes-issues/projects).
-
-## Guidelines
-
-### The issue tracker is not a discussion forum
-
-The issue tracker is a tool to help the developers be more productive and
-efficient in their work. It is not a place for discussion. If you wish to
-discuss something in the issue tracker, please do so on the forum or mailing
-lists (see [Help, Support, Mailing Lists, and Forum](/support/)). You can
-simply link to the relevant issue in your discussion post.
-
-This guideline is important for keeping issues focused on *actionable
-information*, which helps the developers to stay focused on their work. When
-developers come back to an issue to work on it, we do not want them to have to
-sift through a large number of unnecessary comments before they can get
-started. In many cases, an issue that gets "too big" essentially becomes more
-trouble than it's worth, and no developer will touch it (also see [every issue
-must be about a single, actionable
-thing](#every-issue-must-be-about-a-single-actionable-thing)). In these cases,
-we sometimes have to close the issue and open a new one. This is a waste of
-energy for everyone involved, so we ask that everyone help to avoid repeating
-this pattern.
-
-### Do not submit questions
-
-[qubes-issues](https://github.com/QubesOS/qubes-issues/issues) is not the place
-to ask questions. This includes, but is not limited to, troubleshooting
-questions and questions about how to do things with Qubes. Instead, see [Help,
-Support, Mailing Lists, and Forum](/support/) for appropriate place to ask
-questions. By contrast,
-[qubes-issues](https://github.com/QubesOS/qubes-issues/issues) is meant for
-tracking more general bugs, enhancements, and tasks that affect a broad range
-of Qubes users.
-
-### Use the issue template
-
-When you open a new issue, an issue template is provided for you. Please use
-it. Do not delete it. The issue template is carefully designed to elicit
-important information. Without this information, the issue is likely to be
-incomplete. (If certain sections are not applicable, you may remove them, but
-please do so only sparingly and only if they are *truly* not applicable.)
-
-It is also important to note the placement and content of the HTML comments in
-the issue template. These help us to have issues with a consistent format.
-
-### Every issue must be about a single, actionable thing
-
-If your issue is not actionable, please see [Help, Support, Mailing Lists, and
-Forum](/support/) for the appropriate place to post it. If your issue would be
-about more than one thing, file them as separate issues instead. This means we
-should generally not try to use a single issue as a "meta" or "epic" issue that
-exists only to group, contain, or track other issues. Instead, when there is a
-need to group multiple related issues together, use
-[projects](https://github.com/QubesOS/qubes-issues/projects).
-
-This guideline is extremely important for making the issue tracker a useful
-tool for the developers. When an issue is too big and composite, it becomes
-intractable and drastically increases the likelihood that nothing will get
-done. Such issues also tend to encourage an excessive amount of general
-discussion that is simply not appropriate for a technical issue tracker (see
-[the issue tracker is not a discussion
-forum](#the-issue-tracker-is-not-a-discussion-forum)).
-
-### New issues should not be duplicates of existing issues
-
-Before you submit an issue, check to see whether it has already been reported.
-Search through the existing issues -- both open and closed -- by typing your
-key words in the **Filters** box. If you find an issue that seems to be similar
-to yours, read through it. If you find an issue that is the same as or subsumes
-yours, leave a comment on the existing issue rather than filing a new one, even
-if the existing issue is closed. If an issue affects more than one Qubes
-version, we usually keep only one issue for all versions. The Qubes team will
-see your comment and reopen the issue, if appropriate. For example, you can
-leave a comment with additional information to help the maintainer debug it.
-Adding a comment will subscribe you to email notifications, which can be
-helpful in getting important updates regarding the issue. If you don't have
-anything to add but still want to receive email updates, you can click the
-"Subscribe" button at the side or bottom of the comments.
-
-### Every issue must be of a single type
-
-Every issue must be exactly one of the following types: a bug report (`bug`), a
-feature or improvement request (`enhancement`), or a task (`task`). Do not file
-multi-typed issues. Instead, file multiple issues of distinct types. The Qubes
-team will classify your issue according to its type.
-
-### New issues should include all relevant information
-
-When you file a new issue, you should be sure to include the version of Qubes
-you're using, as well as versions of related software packages ([how to copy
-information out of dom0](/doc/how-to-copy-from-dom0/)). If your issue is
-related to hardware, provide as many details as possible about the hardware. A
-great way to do this is by [generating and submitting a Hardware Compatibility
-List (HCL) report](/doc/how-to-use-the-hcl/#generating-and-submitting-new-reports),
-then linking to it in your issue. You may also need to use command-line tools
-such as `lspci`. If you're reporting a bug in a package that is in a
-[testing](/doc/testing/) repository, please reference the appropriate issue in
-the [updates-status](https://github.com/QubesOS/updates-status/issues)
-repository. Project maintainers really appreciate thorough explanations. It
-usually helps them address the problem more quickly, so everyone wins!
-
-### There are no guarantees that your issue will be addressed
-
-Keep in mind that
-[qubes-issues](https://github.com/QubesOS/qubes-issues/issues) is an issue
-tracker, not a support system. Creating a new issue is simply a way for you to
-submit an item for the Qubes team's consideration. It is up to the Qubes team
-to decide whether or how to address your issue, which may include closing the
-issue without taking any action on it. Even if your issue is kept open,
-however, you should not expect it to be addressed within any particular time
-frame, or at all. At the time of this writing, there are well over one thousand
-open issues in [qubes-issues](https://github.com/QubesOS/qubes-issues/issues).
-The Qubes team has its own roadmap and priorities, which will govern the manner
-and order in which open issues are addressed.
-
-## How issues get closed
-
-If the Qubes developers make a code change that resolves an issue, then the
-issue will typically be [closed from the relevant commit or merged pull request
-(PR)](https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-issues/linking-a-pull-request-to-an-issue).
-
-### Bug reports
-
-In the case of bugs, the package containing the change will move to the
-appropriate [testing](/doc/testing/) repository, then to the appropriate stable
-repository. If you so choose, you can test the fix while it's in the
-[testing](/doc/testing/) repository, or you can wait for it to land in the
-stable repository. If, after testing the fix, you find that it does not really
-fix the reported bug, please leave a comment on the issue explaining the
-situation. When you do, we will receive a notification and respond on the issue
-or reopen it (or both). Please **do not** create a duplicate issue or attempt
-to contact the developers individually about a problem.
-
-### Resolution
-
-In other cases, an issue may be closed with a specific resolution, such as `R:
-invalid`, `R: duplicate`, or `R: won't fix`. Each of these labels has a
-description that explains the label. We'll also leave a comment explaining why
-we're closing the issue with one of these specific resolutions. If the issue is
-closed without one of these specific resolutions, then it means, by default,
-that the reported bug was fixed or the requested enhancement was implemented.
-
-### Backports
-
-Issues in GitHub can only be open or closed, but, when it comes to bugs that
-affect multiple versions of Qubes OS, there are several possible states:
-
-1. Not fixed yet
-2. Fix developed but not yet committed (PR open)
-3. Fix committed (PR merged), but update not yet pushed to any repo
-4. Update pushed to testing repo for the most recent development version
-5. Update pushed to stable repo for the most recent development version
-6. Update backported to stable version(s) and pushed to the testing repo
-7. Update pushed to stable repo of stable version(s)
-
-We close issues at step 3. Then, as updates are released, the issue
-automatically gets the appropriate `current-testing` (`rX.Y-*-cur-test`) and
-`stable` (`rX.Y-*-stable`) labels. Based on these labels, it's possible to
-select issues waiting for step 6 (see [issues by
-release](https://github.com/QubesOS/qubes-issues#issues-by-release)).
-
-Therefore, if you see that an issue is closed, but the fix is not yet available
-to you, be aware that it may be at an intermediate stage of this process
-between issue closure and the update being available in whichever repos you
-have enabled in whichever version of Qubes you're using.
-
-In order to assist with this, we have a label called [backport
-pending](https://github.com/QubesOS/qubes-issues/labels/backport%20pending),
-which means, "The fix has been released for the testing release but is pending
-backport to the stable release." Our infrastructure will attempt to apply this
-label automatically, when appropriate, but it is not perfect, and the
-developers may be need to adjust it manually.
+---
\ No newline at end of file
diff --git a/introduction/privacy.md b/introduction/privacy.md
index 97465fb90..fc4f49b17 100644
--- a/introduction/privacy.md
+++ b/introduction/privacy.md
@@ -6,92 +6,7 @@ redirect_from:
- /en/privacy/
- /doc/privacy/
- /wiki/privacy/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/introduction/privacy.html
ref: 243
title: Privacy policy
----
-
-The short version is that we try to respect your privacy as much as possible.
-We absolutely do not sell any user data. In fact, we go out of our way to help
-you keep your data private from everyone, including us. For example, from the
-moment you [install Qubes OS](/doc/installation-guide/), we offer to set up
-[Whonix](https://www.whonix.org/) so that all of your updates are routed
-through [Tor](https://www.torproject.org/).
-
-## Website
-
-For the legally-required boilerplate, see [Website Privacy
-Policy](/website-privacy-policy/).
-
-This is just a static website generated with Jekyll and hosted from GitHub
-Pages. We try to use as little JavaScript as possible. We host all resources
-locally (no third-party CDNs) so that you only have to connect to one domain.
-This site should be easy to browse using Tor Browser and with scripts blocked.
-We also have an [onion
-service](http://qubesosfasa4zl44o4tws22di6kepyzfeqv3tg4e3ztknltfxqrymdad.onion/)
-(access is not logged). We even go out of our way to make it easy to download
-[this website's git repo](https://github.com/QubesOS/qubesos.github.io),
-including all the website source code, so that you can host this entire site
-from your own local machine offline. Better yet, we've specifically written all
-of the [documentation](/doc/) in Markdown so that the plain text can be enjoyed
-from the comfort of your terminal. Here's the
-[repo](https://github.com/QubesOS/qubes-doc). (By the way, Git tags on our
-repos are PGP-signed so you can [verify](/doc/verifying-signatures) the
-authenticity of the content.) Obviously, we don't use any ads or trackers, but
-this is still a public website, so man-in-the-middle attacks and such are
-always a possibility. Please be careful. See [FAQ: Should I trust this
-website?](/faq/#should-i-trust-this-website)
-
-## Update Servers and Repositories
-
-We provide repositories at and
-.
-
-We collect and store standard server access and error logs, which include IP
-addresses. We use this data for generating [Qubes userbase
-statistics](/statistics/) and for incident response.
-
-The data is retained for up to three months so that we can re-calculate the
-previous two months' statistics in case anything goes wrong. After that, the
-data is deleted. We never sell the data to anyone or share it with any third
-party.
-
-If you would like to hide your IP address from us, we strongly encourage it and
-are happy to help you do so! Simply choose the Whonix option to route all of
-your updates over Tor when [installing Qubes OS](/doc/installation-guide/).
-
-## Onion Services
-
-We provide an [onion
-service](http://www.qubesosfasa4zl44o4tws22di6kepyzfeqv3tg4e3ztknltfxqrymdad.onion)
-for the website and onion service mirrors of the repositories. Access to these
-servers is not logged.
-
-## Mirrors
-
-There are also other third-party mirrors hosted by volunteers. These are used
-both for [ISO downloads](/downloads/#mirrors) and
-[updates](#update-servers-and-repositories). We have no control over what data
-these mirrors collect or with whom they share it. Please see the privacy policy
-of each respective mirror operator.
-
-## Qubes OS
-
-We have specifically designed Qubes OS so that it is not possible to collect
-any data directly from Qubes OS installations. In other words, Qubes OS does
-not have the ability to "phone home" and is intentionally architected to forbid
-that from happening. This is mainly because we have ensured that dom0 has no
-network access.
-
-We don't want the ability to collect any data directly from Qubes OS
-installations, because if anyone has that power, then the system is not secure.
-We use Qubes OS ourselves as a daily driver for our work and personal
-lives, so our interests are aligned with yours. We want privacy too!
-Thankfully, Qubes OS is free and open-source software, so you don't have to
-take our word for it.
-
-Of course, third-party software (including other operating systems) running
-inside of Qubes OS may not be as privacy-respecting, so please be mindful of
-what you install. We have no control over such third-party software.
-
-For more information, please see [FAQ: How does Qubes OS provide
-privacy?](/faq/#how-does-qubes-os-provide-privacy)
+---
\ No newline at end of file
diff --git a/introduction/screenshots.md b/introduction/screenshots.md
index 1f4b04d0f..9c57313f7 100644
--- a/introduction/screenshots.md
+++ b/introduction/screenshots.md
@@ -6,101 +6,7 @@ redirect_from:
- /media/
- /doc/QubesScreenshots/
- /wiki/QubesScreenshots/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/introduction/screenshots.html
ref: 123
title: Screenshots
----
-
-[](/attachment/doc/r4.0-xfce-desktop.png)
-
-The default desktop environment is Xfce4.
-
-* * * * *
-
-[](/attachment/doc/r4.0-xfce-start-menu.png)
-
-Starting applications from different domains (AppVMs) is very easy.
-
-* * * * *
-
-[](/attachment/doc/r4.0-xfce-three-domains-at-work.png)
-
-In this example, the word processor runs in the “work” domain, which has been assigned the “blue” label. It is fully isolated from other domains, such as the “untrusted” domain (assigned the “red” label -- “Watch out!”, “Danger!”) used for random Web browsing, news reading, as well as from the "work-web" domain (assigned the "yellow" label), which is used for work-related Web browsing that is not security critical. Apps from different domains run in different AppVMs and have different X servers, filesystems, etc. Notice the different color frames (labels) and VM names in the titlebars. These are drawn by the trusted Window Manager running in Dom0, and apps running in domains cannot fake them:
-
-* * * * *
-
-[](/attachment/doc/r2b3-windows-seamless-1.png)
-
-Qubes Release 2 can also run Windows AppVMs in seamless mode, integrated onto the common Qubes trusted desktop, just like Linux AppVMs! The seamless GUI integration has been introduced in Qubes R2 Beta 3. This requires [Qubes Windows Tools](https://github.com/Qubes-Community/Contents/blob/master/docs/os/windows/windows-tools.md) to be installed in the Windows VMs first.
-
-* * * * *
-
-[](/attachment/doc/r2b3-windows-seamless-filecopy.png)
-
-Windows AppVMs are fully integrated with the rest of the Qubes OS system, which includes things such as secure, policy governed, inter-VM file copy, clipboard, and generally our whole elastic qrexec infrastructure for secure inter-VM RPC! Starting with Qubes R2 Beta 3 we also support HVM-based templates allowing to instantly create many Windows AppVMs with shared "root filesystem" from the Template VM (but one should ensure their license allows for such instantiation of the OS in the template). Just like with Linux AppVMs!
-
-* * * * *
-
-[](/attachment/doc/r4.0-xfce-programmers-desktop.png)
-
-Here we see Xfce4.14 Window Manager running in Dom0 (instead of KDE as on previous versions). Qubes supports customized Xfce4 in dom0 beginning with R2 Beta 2!
-
-* * * * *
-
-[](/attachment/doc/r4.0-password-prompt.png)
-
-It is always clearly visible to which domain a given window belongs. Here it’s immediately clear that the passphrase-prompting window belongs to some domain with the “blue” label. When we look at the titlebar, we see “[qubes]”, which is the name of the actual domain. Theoretically, the untrusted application (here, the red Tor Browser running in a DisposableVM) beneath the prompt window could draw a similar looking window within its contents. In practice, this would be very hard, because it doesn’t know, e.g., the exact decoration style that is in use. However, if this is a concern, the user can simply try to move the more trusted window onto some empty space on the desktop such that no other window is present beneath it. Or, better yet, use the Expose-like effect (available via a hot-key). A malicious application from an untrusted domain cannot spoof the whole desktop because the trusted Window Manager will never let any domain “own” the whole screen. Its titlebar will always be visible.
-
-* * * * *
-
-[](/attachment/doc/r4.0-xfce-tray-icons.png)
-
-Qubes is all about seamless integration from the user’s point of view. Here you can see how it virtualizes tray icons from other domains. Notice the network icon is in red. This icon is in fact managed by the Network Manager running in a separate NetVM.
-
-* * * * *
-
-[](/attachment/doc/r4.0-manager-and-sysnet-network-prompt.png)
-
-All the networking runs in a special, unprivileged NetVM. (Notice the red frame around the Network Manager dialog box on the screen above.) This means that in the event that your network card driver, Wi-Fi stack, or DHCP client is compromised, the integrity of the rest of the system will not be affected! This feature requires Intel VT-d or AMD IOMMU hardware (e.g., Core i5/i7 systems)
-* * * * *
-
-[](/attachment/doc/r4.0-software-update.png)
-
-Qubes lets you update all the software in all the domains all at once, in a centralized way. This is possible thanks to Qubes' unique TemplateVM technology. Note that the user is not required to shut down any AppVMs (domains) for the update process. This can be done later, at a convenient moment, and separately for each AppVM.
-
-* * * * *
-
-[](/attachment/doc/r4.0-copy-paste.png)
-
-Qubes supports secure copy-and-paste operations between AppVMs. Only the user can initiate a copy or paste operation using a special key combination (Ctrl-Shift-C/V). Other AppVMs have no access to the clipboard buffer, so they cannot steal data from the clipboard. Only the user decides which AppVM should be given access to the clipboard. (This is done by selecting the destination AppVM’s window and pressing the Ctrl-Shift-V combination.)
-
-* * * * *
-
-[](/attachment/doc/r4.0-copy-to-other-appvm-1.png) [](/attachment/doc/r4.0-copy-to-other-appvm-2.png)
-
-Qubes also supports secure file copying between AppVMs.
-
-* * * * *
-
-[](/attachment/doc/r4.0-open-in-dispvm-1.png) [](/attachment/doc/r4.0-open-in-dispvm-2.png)
-
-Qubes' unique DisposableVMs (DispVMs) allow the user to open any file in a disposable VM in a matter of seconds! A file can be edited in a disposable VM, and any changes are projected back onto the original file. Currently, there is no way to mark files to be automatically opened in a disposable VM (one needs to right-click on the file and choose the "View in DisposableVM" or "Edit in DisposableVM" option), but this is planned for the R2 Beta 3 release.
-
-* * * * *
-
-[](/attachment/doc/r4.0-convert-to-trusted-pdf-1.png) [](/attachment/doc/r4.1-converting-pdf.png)
-
-Qubes provides an advanced infrastructure for programming inter-VM services, such as a PDF converter for untrusted files (which is described in [this article](https://blog.invisiblethings.org/2013/02/21/converting-untrusted-pdfs-into-trusted.html)).
-
-* * * * *
-
-[](/attachment/doc/r4.0-manager-firewall.png)
-
-Qubes provides a dedicated firewall that itself runs in an isolated FirewallVM.
-
-* * * * *
-
-And some more screenshots:
-
-[](/attachment/doc/r4.0-xfce-red-and-green-terminals.png)
-
-[](/attachment/doc/r2b3-windows-seamless-2.png)
+---
\ No newline at end of file
diff --git a/introduction/statistics.md b/introduction/statistics.md
index c09de59fe..c5021ef1c 100644
--- a/introduction/statistics.md
+++ b/introduction/statistics.md
@@ -4,56 +4,7 @@ layout: site
permalink: /statistics/
redirect_from:
- /counter/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/introduction/statistics.html
ref: 127
title: Statistics
----
-
-
-
-## FAQ
-
-### How often is this graph updated?
-
-Daily.
-
-### Why is the bar for the current month so low?
-
-Since the graph is updated daily, the bar for the current month will be very low at the start of the month and rise gradually until the end of the month.
-
-### How is the userbase estimated?
-
-We simply count the number of unique IPv4 addresses that connect to the Qubes update servers each month (except for Tor connections; see [below](#how-are-tor-users-counted)). (Note: Users who have manually configured their systems to bypass the metalink and connect directly to a mirror are not counted.)
-
-### How are Tor users counted?
-
-We estimate the number of Tor users as a proportion of the total number of *requests* from Tor exit nodes on the assumption that the proportion of users to requests is roughly the same for both clearnet and Tor users.
-To be precise, the formula is:
-
-```
-tor_users = tor_requests * (plain_users / plain_requests)
-```
-
-Where:
-
-- `tor_users` is the estimated number of Qubes users who download updates via Tor each month.
-- `tor_requests` is the total number of requests the Qubes update servers receive from Tor exit nodes each month.
-- `plain_users` is the number of unique clearnet IPv4 addresses that connect to the Qubes update servers each month.
-- `plain_requests` is the total number of requests the Qubes update servers receive from clearnet IPv4 addresses each month.
-
-We cross-reference the list of connecting IP addresses with [TorDNSEL's exit lists](https://metrics.torproject.org/collector.html#type-tordnsel) in order to distinguish Tor and clearnet IPs and requests.
-For this purpose, we count an IP address as belonging to a Tor exit node if there was a Tor exit node active for that address within the 24-hour periods before or after it connected to the Qubes update servers.
-
-### What kinds of data do you collect about Qubes users?
-
-Please see our [Privacy Policy](/privacy/).
-
-### Where can I find the raw data and source code?
-
-The raw data is available [here](https://tools.qubes-os.org/counter/stats.json).
-(This does not include any personally-identifying user data.)
-Please note that the format of this data is not documented and may change any time if the developers feel the need to include something else.
-The source code is available [here](https://github.com/woju/qubes-stats).
+---
\ No newline at end of file
diff --git a/introduction/support.md b/introduction/support.md
index e1dbc880f..54c0edea0 100644
--- a/introduction/support.md
+++ b/introduction/support.md
@@ -11,519 +11,7 @@ redirect_from:
- /doc/qubes-lists/
- /doc/QubesLists/
- /wiki/QubesLists/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/introduction/support.html
ref: 122
title: Help, support, mailing lists, and forum
----
-
-The Qubes community is here to help! Since Qubes is a security-oriented
-operating system, we want to make sure you [stay safe](#staying-safe) as you
-get the support you need, and we want to make sure our community remains a
-friendly and productive place by ensuring we all follow the [Code of
-Conduct](/code-of-conduct/) and [discussion
-guidelines](#discussion-guidelines).
-
-## How to get help and support
-
-First, let's see what kind of help you need.
-
-### I have a problem or a question.
-
-No worries! Here's how we recommend proceeding:
-
-1. Check the [documentation](/doc/). There may already be a page about it.
- Specifically, check out the [How-To Guides](/doc/#how-to-guides) and
- [Troubleshooting](/doc/#troubleshooting) sections.
-
-2. Search the [FAQ](/faq/). Your question might already be answered.
-
-3. Try [searching the issue tracker](/doc/issue-tracking/#search-tips). There
- may already be an open **or closed** issue about your problem. The issue
- tracker is constantly being updated with known bugs and may contain
- workarounds for problems you're experiencing. If there any pinned issues at
- the top, make sure to check them first!
-
-4. Try [searching the Qubes Forum](https://forum.qubes-os.org/). There may
- already be a matching topic.
-
-5. Try [searching the `qubes-users`
- archives](https://www.mail-archive.com/qubes-users@googlegroups.com/). There
- may have already been a relevant thread.
-
-### I didn't find a solution or an answer!
-
-Sorry to hear that! In that case, we recommend asking for help on the [Qubes
-Forum](https://forum.qubes-os.org/) or on the [`qubes-users` mailing
-list](#qubes-users). Choose the venue you prefer, but please don't ask on both
-at the same time! Before you ask, please review our [discussion
-guidelines](#discussion-guidelines) and StackOverflow's advice on [how to ask
-good questions](https://stackoverflow.com/help/how-to-ask). Don't forget to
-[stay safe](#staying-safe)!
-
-### I don't need support, but I think I found a bug.
-
-We'd be grateful if you reported it (but please make sure no one else has
-already reported it first)! Please see [Issue Tracking](/doc/issue-tracking/)
-for details.
-
-### I don't need support, but I'd like to request a feature.
-
-No promises, but we'd be happy to consider it! Please see [Issue
-Tracking](/doc/issue-tracking/) for details.
-
-### Where's the best place to discuss Qubes?
-
-That would be the [Qubes Forum](https://forum.qubes-os.org/) and the
-[`qubes-users` mailing list](#qubes-users). Please have a look at our
-[discussion guidelines](#discussion-guidelines) before diving in. Enjoy!
-
-### How can I get involved and contribute?
-
-Thank you for asking! Please see [How to Contribute](/doc/contributing/) for
-all the ways you can do so.
-
-### I would like to report a security vulnerability.
-
-That sounds more like you helping us! Thanks! Please see [Reporting Security
-Issues in Qubes OS](/security/#reporting-security-issues-in-qubes-os).
-
-## Staying safe
-
-The Qubes mailing lists and forum are open to the public. The contents are
-crawled by search engines and archived by third-party services outside of our
-control. Please do not send or post anything that you are not comfortable
-seeing discussed in public. If confidentiality is a concern, please use PGP
-encryption in an off-list email.
-
-The Qubes community includes people from all walks of life and from around the
-world. Individuals differ in areas of experience and technical expertise. You
-will come into contact with others whose views and agendas differ from your
-own. Everyone is free to write what they please, as long as it doesn't violate
-our [Code of Conduct](/code-of-conduct/). Be friendly and open, but do not
-believe everything you read. Use good judgment, and be especially careful when
-following instructions (e.g., copying commands) given by others on the lists.
-
-It's always possible that a bad actor could try to impersonate any member of
-the [Qubes team](/team/) anywhere on the Internet. Please don't assume that
-someone who claims to be an official Qubes team member really is one without an
-appropriate form of authentication, such as a [verified PGP-signed
-message](/security/verifying-signatures/). (But bear in mind that anyone can
-generate a key with any name on it and use it to PGP-sign a message, so the
-mere presence of a PGP signature does not indicate authority. Successful
-[verification](/security/verifying-signatures/) is what counts.) All official
-[news](/news/) can be authenticated by [verifying the
-signatures](/security/verifying-signatures/) on the relevant tags or commits in
-the [qubes-posts](https://github.com/QubesOS/qubes-posts) repository.
-
-Given that there may be impostors and others trying to lead you astray, how
-should you sort the good advice from the bad? This is up to each individual to
-decide, but it helps to know that many members of our community have proven
-themselves knowledgeable through their [contributions](/doc/contributing/) to
-the project. Often, these individuals sign their messages with the same key as
-(or another key authenticated by) the one they use to [sign their
-contributions](/doc/code-signing/).
-
-For example, you might find it easier to trust advice from someone who has a
-proven track record of [contributing software
-packages](/doc/package-contributions/) or [contributing to the
-documentation](/doc/how-to-edit-the-documentation/). It's unlikely that
-individuals who have worked hard to build good reputations for themselves
-through their contributions over the years would risk giving malicious advice
-in signed messages to public mailing lists. Since every contribution to the
-Qubes OS Project is publicly visible and cryptographically signed, anyone would
-be in a position to [verify](/security/verifying-signatures/) that these came
-from the same keyholder.
-
-## Discussion guidelines
-
-Qubes discussions mainly take place on `qubes-users`, `qubes-devel`, and our
-[forum](#forum), all of which are explained below. Most questions should be
-directed to `qubes-users` or the [forum](#forum). **Please do not send
-questions to individual Qubes developers.** By sending a message to the
-appropriate mailing list, you are not only giving others a chance to help you,
-but you may also be helping others by starting a public discussion about a
-shared problem or interest.
-
-These are open venues where people freely come together to discuss Qubes and
-voluntarily help each other out of mutual interest and good will. They are
-*not* your personal, paid support service. **No one owes you a reply.** No one
-here is responsible for solving your problems for you. Nonetheless, there are
-many things you can do to make it more likely that you will receive a reply.
-This community is fortunate to have an exceptionally large number of friendly
-and knowledgeable people who enjoy corresponding on these lists. The vast
-majority of them will be happy to help you if you follow these simple
-guidelines.
-
-### Be polite and respectful
-
-Remember, no one here is under any obligation to reply to you. Think about your
-readers. Most of them are coming home after a long, hard day at work. The last
-thing they need is someone's temper tantrum. If you are rude and disrespectful,
-you are very likely to be ignored.
-
-### Be concise
-
-Include only essential information. Most of your readers lead busy lives and
-have precious little time. We *want* to spend some of that time helping you, if
-we can. But if you ramble, it will be easier to skip over you and help someone
-else who gets right to the point.
-
-### Help us help you
-
-Tell us what you've already tried, and which documentation pages you've already
-read. Put yourself in your readers' shoes. What essential information would
-they require in order to be able to help you? Make sure to include that
-information in your message. A great way to provide your hardware details is by
-[generating and submitting a Hardware Compatibility List (HCL)
-report](/doc/how-to-use-the-hcl/#generating-and-submitting-new-reports), then
-linking to it in your message. [Ask questions the smart
-way.](http://www.catb.org/esr/faqs/smart-questions.html)
-
-### Be patient
-
-Do not "bump" a thread more than once every three days *at most*. If it seems
-like your messages to the mailing lists are consistently being ignored, make
-sure you're following the guidelines explained on this page. If you're already
-doing so but still not getting any replies, then it's likely that no one who
-knows the answer has had time to reply yet. Remember that the devs are very
-busy working on Qubes. They usually only have a chance to answer questions on
-the mailing lists once every several days.
-
-### Be a good community member
-
-As with any social community, members earn different reputations for themselves
-over time. We want these discussion venues to be friendly, productive places
-where information and ideas are exchanged for the mutual benefit of all. We
-understand that the best way to achieve this is to encourage and cultivate
-other like-minded individuals. Those who have shown themselves to be good
-community members through their past contributions have earned our good will,
-and we will be especially eager to help them and collaborate with them. If you
-are new to the community, you should understand that it may take time for you
-to earn the good will of others. This does not mean that you will not receive
-help. On the contrary, we are fortunate to have such a helpful and
-understanding community that many of them spend hours of their personal time
-helping complete strangers, including many who post anonymously. (Given the
-integration of Qubes with [Whonix](https://www.whonix.org/wiki/Qubes), we
-understand better than most the complexities of privacy and anonymity, and we
-know that many users have no other choice but to post anonymously.) You can
-read our project's [Code of Conduct](/code-of-conduct/) and [Privacy
-Policy](/privacy/) for more information.
-
-### Report issues and submit changes in the right places
-
-The mailing lists and [forum](#forum) are good places to ask questions and
-discuss things. However, if you're submitting a more formal report, we'd prefer
-that you submit it to our [issue tracker](/doc/issue-tracking/) so that it
-doesn't get overlooked. (However, please remember that [the issue tracker is
-not a discussion
-forum](/doc/issue-tracking/#the-issue-tracker-is-not-a-discussion-forum).)
-Likewise, if you see that something in the documentation should be changed,
-don't simply point it out in a discussion venue. Instead, [submit the
-change](/doc/how-to-edit-the-documentation/).
-
-### Moderation
-
-The moderation team aims to enforce our [Code of Conduct](/code-of-conduct/).
-Beyond this, users should not expect any specific action from the moderation
-team. Specifically, users should not request that posts or messages be deleted
-or edited by a moderator. Users are reminded that, in most venues, anything
-posted will be sent out as an email to other others, and these emails cannot be
-deleted from others' inboxes.
-
-### Specific mailing list rules and notes
-
-#### Use the correct list
-
-Send your message to the correct list. Read the sections below to determine
-which list is correct for your message.
-
-#### Do not top-post
-
-[Top-posting](https://en.wikipedia.org/wiki/Posting_style#Top-posting) is
-placing your reply above the quoted message to which you're replying. Please
-refrain from doing this. Instead, either
-[interleave](https://en.wikipedia.org/wiki/Posting_style#Interleaved_style)
-your reply by placing parts of your message immediately below each quoted
-portion to which it is replying, or
-[bottom-post](https://en.wikipedia.org/wiki/Posting_style#Bottom-posting) by
-placing your entire reply below the quoted message to which you're replying.
-
-#### Use proper subject lines
-
-Include a precise and informative subject line. This will allow others to
-easily find your thread in the future and use it as a reference. (Bad: "Help!
-Qubes problems!" Good: "R2B2 Installation problem: Apple keyboard not working
-in installer.")
-
-#### Do not send duplicates
-
-If your message is not successfully sent to the list, it probably got caught in
-the spam filter. We check the spam filter regularly, so please be patient, and
-your message should be approved (and your email address added to the whitelist)
-within a few days.
-
-#### Keep the list CCed
-
-Keep the mailing list CCed throughout the conversation unless there's a special
-need for privacy (in which case, use PGP encryption). This increases the
-likelihood that a greater quantity of useful information will be available to
-everyone in the future.
-
-#### Quote appropriately
-
-If you're replying to a thread (whether your own or someone else's), you should
-make sure to quote enough from previous messages in the thread so that people
-reading your message can understand the context without having to find and read
-earlier messages from that thread. Each reply should continue the conversation
-and, ideally, be readable as a conversation in itself. Do not quote
-advertisements in signatures or inline PGP signature blocks. (Quoting the
-latter interferes with the ability of programs like Enigmail to properly quote
-replies thereafter).
-
-#### English not required
-
-If you do not speak English, you should feel free to post in your own language.
-However, bear in mind that most members of the list can only read English. You
-may wish to include an automated translation in your message out of
-consideration for those readers. If you choose to write in English, please do
-not apologize for doing so poorly, as it is unnecessary. We understand and will
-ask for clarification if needed.
-
-#### Suggestions
-
-While we're generally open to hearing suggestions for new features, please note
-that we already have a pretty well defined
-[roadmap](https://github.com/QubesOS/qubes-issues/milestones), and it's rather
-unlikely that we will change our schedule in order to accommodate your request.
-If there's a particular feature you'd like to see in Qubes, a much more
-effective way to make it happen is to contribute a patch that implements it. We
-happily accept such contributions, provided they meet our standards. Please
-note, however, that it's always a good idea to field a discussion of your idea
-on the `qubes-devel` list before putting in a lot of hard work on something
-that we may not be able or willing to accept.
-
-#### Google Groups
-
-While the mailing lists are implemented as Google Group web forums, a Google
-account is in no way required, expected, or encouraged. Many discussants
-(including most members of the Qubes team) treat these lists as conventional
-[mailing lists](https://en.wikipedia.org/wiki/Electronic_mailing_list),
-interacting with them solely through plain text email with
-[MUAs](https://en.wikipedia.org/wiki/Email_client) like
-[Thunderbird](https://www.thunderbird.net/) and [Mutt](http://www.mutt.org/).
-The Google Groups service is just free infrastructure, and we [distrust the
-infrastructure](/faq/#what-does-it-mean-to-distrust-the-infrastructure). This
-is why, for example, we encourage discussants to use [Split
-GPG](/doc/split-gpg/) to sign all of their messages to the lists, but we do not
-endorse the use of these Google Groups as web forums. For that, we have a
-separate, dedicated [forum](#forum).
-
-## Mailing lists
-
-This section covers each of our individual [mailing
-lists](https://en.wikipedia.org/wiki/Electronic_mailing_list), with details
-about the purpose of each list and how to use it. A Google account is **not**
-required for any of these mailing lists.
-
-### qubes-announce
-
-This is a read-only list for those who wish to receive only very important,
-infrequent messages. Only the core Qubes team can post to this list. Only
-[Qubes Security Bulletins (QSBs)](/security/qsb/), new stable Qubes OS releases,
-and Qubes OS release end-of-life notices are announced here.
-
-To subscribe, send a blank email to
-`qubes-announce+subscribe@googlegroups.com`. (Note: A Google account is **not**
-required. Any email address will work.) To unsubscribe, send a blank email to
-`qubes-announce+unsubscribe@googlegroups.com`. This list also has a
-[traditional mail
-archive](https://www.mail-archive.com/qubes-announce@googlegroups.com/) and an
-optional [Google Groups web
-interface](https://groups.google.com/group/qubes-announce).
-
-### qubes-users
-
-This list is for helping users solve various daily problems with Qubes OS.
-Examples of topics or questions suitable for this list include:
-
-* [HCL](/doc/hcl/) reports
-* Installation problems
-* Hardware compatibility problems
-* Questions of the form: "How do I...?"
-
-Please try searching both the Qubes website and the archives of the mailing
-lists before sending a question. In addition, please make sure that you have
-read and understood the following basic documentation prior to posting to the
-list:
-
-* The [Installation Guide](/doc/installation-guide/), [System
- Requirements](/doc/system-requirements/), and [HCL](/doc/hcl/) (for problems
- related to installing Qubes OS)
-* The [User FAQ](/faq/#users)
-* The [documentation](/doc/) (for questions about how to use Qubes OS)
-
-You must be subscribed in order to post to this list. To subscribe, send a
-blank email to `qubes-users+subscribe@googlegroups.com`. (Note: A Google
-account is **not** required. Any email address will work.) To post a message to
-the list, address your email to `qubes-users@googlegroups.com`. If your post
-does not appear immediately, please allow time for moderation to occur. To
-unsubscribe, send a blank email to `qubes-users+unsubscribe@googlegroups.com`.
-This list also has a [traditional mail
-archive](https://www.mail-archive.com/qubes-users@googlegroups.com/) and an
-optional [Google Groups web
-interface](https://groups.google.com/group/qubes-users).
-
-### qubes-devel
-
-This list is primarily intended for people who are interested in contributing
-to Qubes or who are willing to learn more about its architecture and
-implementation. Examples of topics and questions suitable for this list
-include:
-
-* Questions about why we made certain architecture or implementation decisions.
- * For example: "Why did you implement XYZ this way and not the other way?"
-* Questions about code layout and where code is for certain functionality.
-* Discussions about proposed new features, patches, etc.
- * For example: "I would like to implement feature XYZ."
-* Contributed code and patches.
-* Security discussions which are relevant to Qubes in some way.
-
-You must be subscribed in order to post to this list. To subscribe, send a
-blank email to `qubes-devel+subscribe@googlegroups.com`. (Note: A Google
-account is **not** required. Any email address will work.) To post a message to
-the list, address your email to `qubes-devel@googlegroups.com`. If your post
-does not appear immediately, please allow time for moderation to occur. To
-unsubscribe, send a blank email to `qubes-devel+unsubscribe@googlegroups.com`.
-This list also has a [traditional mail
-archive](https://www.mail-archive.com/qubes-devel@googlegroups.com/) and an
-optional [Google Groups web
-interface](https://groups.google.com/group/qubes-devel).
-
-### qubes-project
-
-This list is for non-technical discussion and coordination around the Qubes OS
-project.
-
-Examples of topics or question suitable for this list include:
-
-* Participation (talks, workshops, etc.) at upcoming events
-* Project funding applications and strategies
-* FOSS governance discussions
-* Most Github issues tagged
- [business](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+label%3Abusiness)
- or
- [project management](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+label%3A%22project+management%22)
-
-You must be subscribed in order to post to this list. To subscribe, send a
-blank email to `qubes-project+subscribe@googlegroups.com`. (Note: A Google
-account is **not** required. Any email address will work.) To post a message to
-the list, address your email to `qubes-project@googlegroups.com`. If your post
-does not appear immediately, please allow time for moderation to occur. To
-unsubscribe, send a blank email to
-`qubes-project+unsubscribe@googlegroups.com`. This list also also has a
-[traditional mail
-archive](https://www.mail-archive.com/qubes-project@googlegroups.com/) and an
-optional [Google Groups web
-interface](https://groups.google.com/group/qubes-project).
-
-### qubes-translation
-
-This list is for discussion around the localization and translation of Qubes
-OS, its documentation, and the website.
-
-Examples of topics or question suitable for this list include:
-
-* Questions about or issues with [Transifex](https://www.transifex.com/), the
- translation platform we use
-* Who is managing localization for a given language
-* Most Github issues tagged
- [localization](https://github.com/QubesOS/qubes-issues/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Alocalization)
-
-You must be subscribed in order to post to this list. To subscribe, send a
-blank email to `qubes-translation+subscribe@googlegroups.com`. (Note: A Google
-account is **not** required. Any email address will work.) To post a message to
-the list, address your email to `qubes-translation@googlegroups.com`. If your
-post does not appear immediately, please allow time for moderation to occur. To
-unsubscribe, send a blank email to
-`qubes-translation+unsubscribe@googlegroups.com`. This list also has an
-optional [Google Groups web
-interface](https://groups.google.com/group/qubes-translation).
-
-## Forum
-
-The official [Qubes Forum](https://forum.qubes-os.org) is a place where
-you can ask questions, get help, share tips and experiences, and more! For a
-long time, members of our community have sought a privacy-respecting forum
-experience with modern features that traditional mailing lists do not support.
-The open-source [Discourse](https://www.discourse.org/) platform fills this
-need for us, as it does for many other open-source projects.
-
-### Why was this forum created?
-
-Previously, the only option for a forum-like experience was to interact with
-our mailing lists via Google Groups, but we understand all too well that the
-privacy implications and user experience were unacceptable for many members of
-our community, especially with the recent addition of a sign-in requirement to
-view threads. Many of you value the lower barrier to entry, organization,
-ease-of-use, and modern social features that today's forums support. Moreover,
-Discourse [features email
-integration](https://forum.qubes-os.org/t/using-the-forum-via-email/533)
-for those who still prefer the traditional mailing list format.
-
-### How is this different from our mailing lists?
-
-To be clear, this is *not* a replacement for the mailing lists. This forum is
-simply an *additional* place for discussion. Certain types of discussions
-naturally lend themselves more to mailing lists or to forums, and different
-types of users prefer different venues. We've heard from some users who find
-the mailing lists to be a bit intimidating or who may feel that their message
-isn't important enough to merit creating a new email that lands in thousands of
-inboxes. Others want more selective control over topic notifications. Some
-users simply appreciate the ability to add a "reaction" to a message instead of
-having to add an entirely new reply. Whatever your reasons, it's up to you to
-decide where and how you want to join the conversation.
-
-### Does this split the community?
-
-Many open-source projects (such as Fedora and Debian) have both mailing lists
-and forums (and additional discussion venues). In fact, the Qubes OS Project
-already had non-mailing-list discussion venues such as
-[Reddit](https://www.reddit.com/r/Qubes/) before this forum was introduced. We
-believe that this additional venue fosters the continued growth of community
-participation and improves everyone's experience. In addition, we fully expect
-that many community members -- especially the most active ones -- will choose
-to participate in both venues. (Again, for those who still prefer interacting
-via email, [Discourse supports that
-too](https://forum.qubes-os.org/t/using-the-forum-via-email/533)!)
-
-## Social media
-
-The Qubes OS Project has a presence on the following social media platforms:
-
-* [Twitter](https://twitter.com/QubesOS)
-* [Reddit](https://www.reddit.com/r/Qubes/)
-* [Facebook](https://www.facebook.com/QubesOS/)
-* [LinkedIn](https://www.linkedin.com/company/qubes-os/)
-
-Generally speaking, these are not intended to be primary support venues. (Those
-would be [qubes-users](#qubes-users) and the [forum](#forum).) Rather, these
-are primarily intended to be a way to more widely disseminate items published
-on the [news](/news/) page. If you use one of these platforms, you may find it
-convenient to follow the Qubes OS Project there as a way of receiving Qubes
-news.
-
-## Unofficial venues
-
-If you find another venue on the Internet that is not listed above, it is
-**unofficial**, which means that the Qubes team does **not** monitor or
-moderate it. Please be especially careful in unofficial venues.
-
-(Note: If a Qubes team member discovers the venue and decides to pop in, that
-should not be taken as a commitment to monitor or moderate the venue. It still
-remains unofficial. Also, please make sure someone claiming to be a Qubes team
-member really is one. It could be an impostor!)
-
-For example, here are some **unofficial** chat channels we know about that are
-maintained by the community:
-
-* Matrix, Qubes-related:
-* `#qubes` channel on libera.chat via traditional IRC clients
+---
\ No newline at end of file
diff --git a/introduction/video-tours.md b/introduction/video-tours.md
index 575ba8af7..69dc8ee15 100644
--- a/introduction/video-tours.md
+++ b/introduction/video-tours.md
@@ -2,34 +2,7 @@
lang: en
layout: site
permalink: /video-tours/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/introduction/video-tours.html
ref: 226
title: Video tours
----
-
-## Qubes OS Summit 2022
-
-Watch all the talks from Qubes OS Summit 2022, which took place September 9-11, 2022 in Berlin, Germany.
-
-
-
-
-
-
-
-
-
-
-
-## Micah Lee presents "Qubes OS: The Operating System That Can Protect You Even If You Get Hacked"
-
-[Micah Lee](https://micahflee.com/), a long-time Qubes [advocate](/endorsements/), presented [Qubes OS: The Operating System That Can Protect You Even If You Get Hacked](https://www.hope.net/schedule.html#-qubes-os-the-operating-system-that-can-protect-you-even-if-you-get-hacked-) at the [Circle of HOPE](https://www.hope.net/index.html) conference, which took place July 20-22, 2018 in New York City.
-
-
+---
\ No newline at end of file
diff --git a/project-security/security-pack.md b/project-security/security-pack.md
index ae22e8dc1..c01a87f64 100644
--- a/project-security/security-pack.md
+++ b/project-security/security-pack.md
@@ -14,227 +14,7 @@ redirect_from:
- /doc/qsp/
- /doc/sec-pack/
- /doc/secpack/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/project-security/security-pack.html
ref: 213
title: Qubes security pack (qubes-secpack)
----
-
-The **Qubes security pack (qubes-secpack)** is a Git repository that contains:
-
-- [Qubes security bulletins (QSBs)](/security/qsb/)
-- [Qubes canaries](/security/canary/)
-- [Qubes ISO cryptographic hash values](/security/verifying-signatures/#how-to-verify-the-cryptographic-hash-values-of-qubes-isos)
-- [Qubes fund information](https://github.com/QubesOS/qubes-secpack/tree/master/fund)
-- [Qubes PGP keys](https://keys.qubes-os.org/keys/)
-- Security-related information and announcements (e.g., key revocations)
-
-While qubes-secpack itself is independent of any particular host, its current
-official location is:
-
-
-
-## How to obtain and authenticate
-
-The following example demonstrates one method of obtaining the qubes-secpack and
-verifying its authenticity. This requires Git and [OpenPGP
-software](/security/verifying-signatures/#openpgp-software).
-
-1. Use Git to clone the qubes-secpack repo.
-
- ```shell_session
- $ git clone https://github.com/QubesOS/qubes-secpack.git
- Cloning into 'qubes-secpack'...
- remote: Counting objects: 195, done.
- remote: Total 195 (delta 0), reused 0 (delta 0)
- Receiving objects: 100% (195/195), 130.94 KiB | 207.00 KiB/s, done.
- Resolving deltas: 100% (47/47), done.
- Checking connectivity... done.
- ```
-
-2. Import the included PGP keys. See our [PGP key policies](#pgp-key-policies)
- for important information about these keys.
-
- ```shell_session
- $ gpg --import qubes-secpack/keys/*/*
- gpg: directory `/home/user/.gnupg' created
- gpg: new configuration file `/home/user/.gnupg/gpg.conf' created
- gpg: WARNING: options in `/home/user/.gnupg/gpg.conf' are not yet active during this run
- gpg: keyring `/home/user/.gnupg/secring.gpg' created
- gpg: keyring `/home/user/.gnupg/pubring.gpg' created
- gpg: /home/user/.gnupg/trustdb.gpg: trustdb created
- gpg: key C37BB66B: public key "Joanna Rutkowska (Qubes OS signing key) " imported
- gpg: key 1E30A75D: public key "Joanna Rutkowska (Qubes OS signing key) " imported
- gpg: key 74EADABC: public key "Joanna Rutkowska (Qubes OS signing key) " imported
- gpg: key 65EF29CA: public key "Joanna Rutkowska (Qubes OS Signing Key) " imported
- gpg: key 34898310: public key "Joanna Rutkowska (Qubes OS Signing Key) " imported
- gpg: key B298547C: public key "Marek Marczykowski (Qubes OS signing key) " imported
- gpg: key AB5EEF90: public key "Marek Marczykowski (Qubes OS signing key) " imported
- gpg: key A603BCB6: public key "Marek Marczykowski (Qubes OS signing key) " imported
- gpg: key 42CFA724: public key "Marek Marczykowski-Górecki (Qubes OS signing key) " imported
- gpg: key 15CE40BF: public key "Wojciech Zygmunt Porczyk (Qubes OS signing key) " imported
- gpg: key 36879494: public key "Qubes Master Signing Key" imported
- gpg: key 211093A7: public key "Qubes OS Release 1 Signing Key" imported
- gpg: key 0A40E458: public key "Qubes OS Release 2 Signing Key" imported
- gpg: key 03FA5082: public key "Qubes OS Release 3 Signing Key" imported
- gpg: key 92C7B3DC: public key "Joanna Rutkowska (Qubes Security Pack Signing Key) " imported
- gpg: key 1830E06A: public key "Marek Marczykowski-Górecki (Qubes security pack) " imported
- gpg: key 3F48CB21: public key "Qubes OS Security Team " imported
- gpg: Total number processed: 17
- gpg: imported: 17 (RSA: 17)
- gpg: no ultimately trusted keys found
- ```
-
-3. [Authenticate and set the trust level of the Qubes Master Signing Key
- (QMSK).](/security/verifying-signatures/#how-to-import-and-authenticate-the-qubes-master-signing-key)
-
-4. Verify signed Git tags.
-
- ```shell_session
- $ cd qubes-secpack/
- $ git tag -v `git describe`
- object 2bb7f0b966593d8ed74e140a04d60c68b96b164e
- type commit
- tag joanna_sec_2bb7f0b9
- tagger Joanna Rutkowska 1468335706 +0000
-
- Tag for commit 2bb7f0b966593d8ed74e140a04d60c68b96b164e
- gpg: Signature made 2016-07-12T08:01:46 PDT
- gpg: using RSA key 0x4E6829BC92C7B3DC
- gpg: Good signature from "Joanna Rutkowska (Qubes Security Pack Signing Key) " [full]
- ```
-
- The final line of output confirms that the signature is good.
-
-5. Verify detached PGP signatures.
-
- ```shell_session
- $ cd canaries/
- $ gpg --verify canary-001-2015.txt.sig.joanna canary-001-2015.txt
- gpg: Signature made Mon Jan 5 20:21:40 2015 UTC using RSA key ID 92C7B3DC
- gpg: Good signature from "Joanna Rutkowska (Qubes Security Pack Signing Key) "
- $ gpg --verify canary-001-2015.txt.sig.marmarek canary-001-2015.txt
- gpg: Signature made Mon Jan 5 20:13:37 2015 UTC using RSA key ID 1830E06A
- gpg: Good signature from "Marek Marczykowski-Górecki (Qubes security pack) "
- ```
-
- The fourth and final lines of output confirm that the two signatures are
- good.
-
-The same procedures can be applied to any directory or file in the
-qubes-secpack. Two methods of verification (signed Git tags and detached PGP
-signatures) are provided to ensure that the system is robust (e.g., against a
-potential failure in Git tag-based verification) and to give users more options
-to verify the files.
-
-## PGP key policies
-
-- **Inclusion criteria.** The qubes-secpack generally includes only those PGP
- keys used to sign some kind of official project asset, such as Qubes release
- ISOs (release signing keys), Git tags and commits (code signing, doc signing,
- and security team keys), and the qubes-secpack's own files and Git tags
- (security team keys again). This means that email keys are generally not
- included, even for official project email addresses. There is one exception
- to this rule: the official [Qubes security
- team](/security/#qubes-security-team) email address, which is used to report
- security vulnerabilities in Qubes OS to our security team.
-
-- **Key signing (certification).** Only some keys in the qubes-secpack are
- signed by the QMSK. Keys that are not signed directly by the QMSK are still
- signed indirectly by virtue of being included in the qubes-secpack, which is
- itself signed (via Git tags and/or commits) by keys that are in turn signed
- by the QMSK.
-
-## History and rationale
-
-On 2013-01-05, Joanna Rutkowska announced the qubes-secpack and explained its
-rationale in an
-[email](https://groups.google.com/d/msg/qubes-devel/twkOEaMLtNI/lZyGx6_jFCEJ)
-to the Qubes mailing lists:
-
-```
-Hello,
-
-A new Qubes Security Bulletin has been just released and is available here:
-
-https://github.com/QubesOS/qubes-secpack/blob/master/QSBs/qsb-013-2015.txt
-
-As per the previous discussions about recent problems with verifying
-digital signatures on messages sent to Google Groups (thanks to
-automatic footer addition by Google), we have decided to change the way
-we publish Qubes Security Bulletins, as well as other security-related
-info pertinent to the Qubes Project.
-
-Starting today, we will be maintain a Git repository -- "Qubes Security
-Pack" -- which will contain all the QSBs released so far, all the keys,
-warrant canaries [1], and potentially some additional info or
-announcements (e.g. key revocations). The whole repo can be found here:
-
-https://github.com/QubesOS/qubes-secpack
-
-Note that all the keys distributed there should be signed by Qubes
-Master Key. The Master Key is also attached in the repo, but should
-really be obtained/verified using a different channel.
-
-Additionally, most of the files are signed by core Qubes
-developers (currently by Marek and myself) via detached signatures as
-well as git tag signatures.
-
-The are several advantages of using Git to distribute all these information:
-
-1) Git repo is a collection of files, some of which can be detached GPG
-signatures for other files and we can ensure all these files are
-distributed together.
-
-2) Git makes it easy for people to clone and redistribute these
-collection of files, as well as to easily host them and view on the Web.
-
-3) Git provides for signed tags mechanisms which is another mean we
-utilize to ensure integrity of the distributed files.
-
-A few words about the Warrant Canary which we've just introduced today,
-and which can be seen here:
-
-https://github.com/QubesOS/qubes-secpack/blob/master/canaries/canary-001-2015.txt
-
-Even though we're not providing any kind of services (such as e.g. email
-hosting), that could be searched or tapped by authorities, there are
-other possibilities that worry us [2], in the light of various recent
-law "developments", such as those that might be coercing people to hand
-over their private keys to authorities.
-
-Until we fully decentralize the root of trust for Qubes, something that
-requires the move to deterministic builds [3], and so won't happen
-very soon, the possibility of having to disclose any of the Qubes
-signing keys to anybody might have pretty serious consequences for those
-who decided to entrust Qubes with anything serious. And we would like to
-somehow minimize these consequences with this canary thing.
-
-Additionally the canary is a nice way of ensuring "freshness" of our
-messaging to the community.
-
-Of course the canary doesn't solve all the problems. E.g. if my signing
-keys were somehow stolen without our knowledge, it wouldn't help.
-Neither it could help in case me being or becoming a miscreant. And
-probably it doesn't address many other potential problems, which could
-only be solved one day with a multi-signature scheme. But anyway, until
-that time, this is the best we can do, I think.
-
-And congrats to Jann for the very interesting clipboard attack (even
-though mostly theoretical, still very cool)!
-
-Thanks,
-joanna.
-
---
-The Qubes Security Team
-https://www.qubes-os.org/doc/SecurityPage
-
-
-[1] http://en.wikipedia.org/wiki/Warrant_canary
-
-[2] Especially myself, because I'm currently the Root Of Trust for all
-Qubes binaries :/
-
-[3] Deterministic builds are required because it's the only way we can
-implement multiple signature scheme for distributed binaries.
-
-```
+---
\ No newline at end of file
diff --git a/project-security/security.md b/project-security/security.md
index a8b325d80..ae3cb87f6 100644
--- a/project-security/security.md
+++ b/project-security/security.md
@@ -12,85 +12,7 @@ redirect_from:
- /doc/SecurityPage/
- /wiki/SecurityPage/
- /trac/wiki/SecurityPage/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/project-security/security.html
ref: 217
title: Qubes OS project security center
----
-
-This page provides a central hub for topics pertaining to the security of the
-Qubes OS Project. For topics pertaining to software security *within* Qubes OS,
-see [security in Qubes](/doc/#security-in-qubes). The following is a list of
-important project security pages:
-
-- [Qubes security pack (qubes-secpack)](/security/pack/)
-- [Qubes security bulletins (QSBs)](/security/qsb/)
-- [Qubes canaries](/security/canary/)
-- [Xen security advisory (XSA) tracker](/security/xsa/)
-- [Verifying signatures](/security/verifying-signatures/)
-- [PGP keys](https://keys.qubes-os.org/keys/)
-- [Security FAQ](/faq/#general--security)
-
-## Reporting security issues in Qubes OS
-
-
-
- Please note: The Qubes security team email address is intended for
- responsible disclosure by security researchers and others who discover
- legitimate security vulnerabilities. It is not intended for everyone
- who suspects they've been hacked. Please do not attempt to contact the
- Qubes security team unless you can demonstrate an actual security
- vulnerability or unless the team will be able to take reasonable steps to
- verify your claims.
-
-
-If you've discovered a security issue affecting Qubes OS, either directly or
-indirectly (e.g., the issue affects Xen in a configuration that is used in
-Qubes OS), then we would be more than happy to hear from you! We promise to
-take all reported issues seriously. If our investigation confirms that an issue
-affects Qubes, we will patch it within a reasonable time and release a public
-[Qubes security bulletin (QSB)](/security/qsb/) that describes the issue,
-discusses the potential impact of the vulnerability, references applicable
-patches or workarounds, and credits the discoverer. Please use the [Qubes
-security team PGP
-key](https://keys.qubes-os.org/keys/qubes-os-security-team-key.asc) to encrypt
-your email to this address:
-
-```
-security at qubes-os dot org
-```
-
-This key is signed by the [Qubes Master Signing
-Key](https://keys.qubes-os.org/keys/qubes-master-signing-key.asc). Please see
-[verifying signatures](/security/verifying-signatures/) for information about
-how to authenticate these keys.
-
-## Security updates
-
-Qubes security updates are obtained by [updating Qubes
-OS](/doc/how-to-update/).
-
-## Qubes security team
-
-The **Qubes security team (QST)** is the subset of the [core
-team](/team/#core-team) that is responsible for ensuring the security of Qubes
-OS and the Qubes OS Project. In particular, the QST is responsible for:
-
-- Responding to [reported security
- issues](#reporting-security-issues-in-qubes-os)
-- Evaluating whether [XSAs](/security/xsa/) affect the security of Qubes OS
-- Writing, applying, and/or distributing security patches to fix
- vulnerabilities in Qubes OS
-- Writing, signing, and publishing [Qubes security bulletins
- (QSBs)](/security/qsb/)
-- Writing, signing, and publishing [Qubes canaries](/security/canary/)
-- Generating, safeguarding, and using the project's [PGP
- keys](https://keys.qubes-os.org/keys/)
-
-As a security-oriented operating system, the QST is fundamentally important to
-Qubes, and every Qubes user implicitly trusts the members of the QST by virtue
-of the actions listed above.
-
-### Members of the security team
-
-- [Marek Marczykowski-Górecki](/team/#marek-marczykowski-górecki)
-- [Simon Gaiser (aka HW42)](/team/#simon-gaiser-aka-hw42)
-- [Joanna Rutkowska](/team/#joanna-rutkowska) ([emeritus, canaries only](/news/2018/11/05/qubes-security-team-update/))
+---
\ No newline at end of file
diff --git a/project-security/verifying-signatures.md b/project-security/verifying-signatures.md
index faa27ea71..b4e3d7968 100644
--- a/project-security/verifying-signatures.md
+++ b/project-security/verifying-signatures.md
@@ -7,862 +7,7 @@ redirect_from:
- /en/doc/verifying-signatures/
- /doc/VerifyingSignatures/
- /wiki/VerifyingSignatures/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/project-security/verifying-signatures.html
ref: 211
title: Verifying signatures
----
-
-The Qubes OS Project uses [digital
-signatures](https://en.wikipedia.org/wiki/Digital_signature) to guarantee the
-authenticity and integrity of certain important assets. This page explains how
-to verify those signatures. It is extremely important for your security to
-understand and apply these practices.
-
-## What digital signatures can and cannot prove
-
-Most people --- even programmers --- are confused about the basic concepts
-underlying digital signatures. Therefore, most people should read this section,
-even if it looks trivial at first sight.
-
-Digital signatures can prove both **authenticity** and **integrity** to a
-reasonable degree of certainty. **Authenticity** ensures that a given file was
-indeed created by the person who signed it (i.e., that a third party did not
-forge it). **Integrity** ensures that the contents of the file have not been
-tampered with (i.e., that a third party has not undetectably altered its
-contents *en route*).
-
-Digital signatures **cannot** prove, e.g., that the signed file is not
-malicious. In fact, there is nothing that could stop someone from signing a
-malicious program (and it happens from time to time in reality).
-
-The point is that we must decide who we will trust (e.g., Linus Torvalds,
-Microsoft, or the Qubes Project) and assume that if a trusted party signed a
-given file, then it should not be malicious or negligently buggy. The decision
-of whether to trust any given party is beyond the scope of digital signatures.
-It's more of a social and political decision.
-
-Once we decide to trust certain parties, digital signatures are
-useful, because they make it possible for us to limit our trust only to those
-few parties we choose and not to worry about all the bad things that can happen
-between them and us, e.g., server compromises (qubes-os.org will surely be
-compromised one day, so [don't blindly trust the live version of this
-site](/faq/#should-i-trust-this-website)), dishonest IT staff at the hosting
-company, dishonest staff at the ISPs, Wi-Fi attacks, etc. We call this
-philosophy [distrusting the
-infrastructure](/faq/#what-does-it-mean-to-distrust-the-infrastructure).
-
-By verifying all the files we download that purport to be authored by a party
-we've chosen to trust, we eliminate concerns about the bad things discussed
-above, since we can easily detect whether any files have been tampered with
-(and subsequently choose to refrain from executing, installing, or opening
-them).
-
-However, for digital signatures to make sense, we must ensure that the
-public keys we use for signature verification are the original ones.
-Anybody can generate a cryptographic key that purports to belong to "The Qubes
-OS Project," but of course only the keys that we (the real Qubes developers)
-generate are the genuine ones. The rest of this page explains how to
-verify the authenticity of the various keys used in the project and how to use
-those keys to verify certain important assets.
-
-## OpenPGP software
-
-We use [PGP](https://en.wikipedia.org/wiki/Pretty_Good_Privacy) (specifically,
-the [OpenPGP](https://en.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP)
-standard). Before we begin, you'll need software that can manage PGP keys and
-verify PGP signatures. Any program that complies with the OpenPGP standard will
-do, but here are some examples for popular operating systems:
-
-**Linux:** [GnuPG](https://gnupg.org/download/index.html)
-([documentation](https://www.gnupg.org/documentation/)). Open a terminal and
-use the `gpg2` command. If you don't already have GnuPG installed, install it
-via your distro's package manager or from the GnuPG website.
-
-**Mac:** [GPG Suite](https://gpgtools.org/)
-([documentation](https://gpgtools.tenderapp.com/kb)). Open a terminal to enter
-commands.
-
-**Windows:** [Gpg4win](https://gpg4win.org/download.html)
-([documentation](https://www.gpg4win.org/documentation.html)). Use the Windows
-command line (`cmd.exe`) to enter commands.
-
-Throughout this page, we'll use GnuPG via the `gpg2` command. If that doesn't
-work for you, try `gpg` instead. If that still doesn't work, please consult the
-documentation for your specific program (see links above) and the
-[troubleshooting FAQ](#troubleshooting-faq) below.
-
-## How to import and authenticate the Qubes Master Signing Key
-
-Many important Qubes OS Project assets (e.g., ISOs, RPMs, TGZs, and Git
-objects) are digitally signed by an official team member's key or by a release
-signing key (RSK). Each such key is, in turn, signed by the [**Qubes Master
-Signing Key
-(QMSK)**](https://keys.qubes-os.org/keys/qubes-master-signing-key.asc)
-(`0x427F11FD0FAA4B080123F01CDDFA1A3E36879494`). In this way, the QMSK is the
-ultimate root of trust for the Qubes OS Project.
-
-The developer signing keys are set to expire after one year, while the QMSK and
-RSKs have no expiration date. The QMSK was generated on and is kept only on a
-dedicated, air-gapped "vault" machine, and the private portion will (hopefully)
-never leave this isolated machine.
-
-Before we proceed, you must first complete the prerequisite step of [installing
-OpenPGP software](#openpgp-software).
-
-Once you have appropriate OpenPGP software installed, there are several ways to
-get the QMSK.
-
-- If you're on Qubes OS, it's available in every
- qube ([except dom0](https://github.com/QubesOS/qubes-issues/issues/2544)):
-
- ```shell_session
- $ gpg2 --import /usr/share/qubes/qubes-master-key.asc
- ```
-
-- If you're on Fedora, you can get it in the
- [distribution-gpg-keys](https://github.com/xsuchy/distribution-gpg-keys)
- package:
-
- ```shell_session
- $ dnf install distribution-gpg-keys
- $ gpg2 --import /usr/share/distribution-gpg-keys/qubes/*
- ```
-
-- If you’re on Debian, it may already be included in your keyring.
-
-- Fetch it with GPG:
-
- ```shell_session
- $ gpg2 --fetch-keys https://keys.qubes-os.org/keys/qubes-master-signing-key.asc
- ```
-
-- Get it from a public
- [keyserver](https://en.wikipedia.org/wiki/Key_server_%28cryptographic%29#Keyserver_examples)
- (specified on first use with `--keyserver ` along with keyserver options
- to include key signatures), e.g.:
-
- ```shell_session
- $ gpg2 --keyserver-options no-self-sigs-only,no-import-clean --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x427F11FD0FAA4B080123F01CDDFA1A3E36879494
- ```
-
-- Download it as a file, then import the file.
-
- Here are some example download locations:
-
- - [Qubes security pack](/security/pack/)
- - [Qubes keyserver](https://keys.qubes-os.org/keys/qubes-master-signing-key.asc)
- - [Email to qubes-devel](https://groups.google.com/d/msg/qubes-devel/RqR9WPxICwg/kaQwknZPDHkJ)
- - [Email to qubes-users](https://groups.google.com/d/msg/qubes-users/CLnB5uFu_YQ/ZjObBpz0S9UJ)
-
- Once you have the key as a file, import it:
-
- ```shell_session
- $ gpg2 --import //qubes-master-signing-key.asc
- ```
-
-Once you've obtained the QMSK, you must verify that it's authentic rather than
-a forgery. Anyone can create a PGP key with the name "Qubes Master Signing Key"
-and the short key ID `0x36879494`, so you cannot rely on these alone. You also
-should not rely on any single website, not even over HTTPS.
-
-So, what *should* you do? One option is to use the PGP [Web of
-Trust](https://en.wikipedia.org/wiki/Web_of_trust). In addition, some operating
-systems include the means to acquire the QMSK securely. For example, on
-Fedora, `dnf install distribution-gpg-keys` will get you the QMSK along with
-several other Qubes keys. On Debian, your keyring may already contain the
-necessary keys.
-
-Perhaps the most common route is to rely on the key's fingerprint. Every PGP
-key has a fingerprint that uniquely identifies it among all PGP keys (viewable
-with `gpg2 --fingerprint `). Therefore, if you know the genuine QMSK
-fingerprint, then you always have an easy way to confirm whether any purported
-copy of it is authentic, simply by comparing the fingerprints.
-
-For example, here is the QMSK fingerprint:
-
-```shell_session
-pub 4096R/36879494 2010-04-01
- Key fingerprint = 427F 11FD 0FAA 4B08 0123 F01C DDFA 1A3E 3687 9494
-uid Qubes Master Signing Key
-```
-
-But how do you know that this is the real fingerprint? After all, [this website
-could be compromised](/faq/#should-i-trust-this-website), so the fingerprint
-you see here may not be genuine. That's why we strongly suggest obtaining the
-fingerprint from *multiple independent sources in several different ways*.
-
-Here are some ideas for how to do that:
-
-- Check the fingerprint on various websites (e.g., [mailing
- lists](https://groups.google.com/g/qubes-devel/c/RqR9WPxICwg/m/kaQwknZPDHkJ),
- [discussion
- forums](https://forum.qubes-os.org/t/1441/9),
- [social](https://twitter.com/rootkovska/status/496976187491876864)
- [media](https://www.reddit.com/r/Qubes/comments/5bme9n/fingerprint_verification/),
- [personal websites](https://andrewdavidwong.com/fingerprints.txt)).
-- Check against PDFs, photographs, and videos in which the fingerprint appears
- (e.g., [slides from a
- talk](https://hyperelliptic.org/PSC/slides/psc2015_qubesos.pdf), on a
- [T-shirt](https://twitter.com/legind/status/813847907858337793/photo/2), or
- in the [recording of a presentation](https://youtu.be/S0TVw7U3MkE?t=2563)).
-- Download old Qubes ISOs from different sources and check the included Qubes
- Master Signing Key.
-- Ask people to post the fingerprint on various mailing lists, forums, and chat
- rooms.
-- Repeat the above over Tor.
-- Repeat the above over various VPNs and proxy servers.
-- Repeat the above on different networks (work, school, internet cafe, etc.).
-- Text, email, call, video chat, snail mail, or meet up with people you know to
- confirm the fingerprint.
-- Repeat the above from different computers and devices.
-
-Once you've obtained the fingerprint from enough independent sources in enough
-different ways that you feel confident that you know the genuine fingerprint,
-keep it in a safe place. Every time you need to check whether a key claiming to
-be the QMSK is authentic, compare that key's fingerprint to your trusted copy
-and confirm they match.
-
-Now that you've imported the authentic QMSK, set its trust level to "ultimate"
-so that it can be used to automatically verify all the keys signed by the QMSK
-(in particular, RSKs).
-
-```shell_session
-$ gpg2 --edit-key 0x427F11FD0FAA4B080123F01CDDFA1A3E36879494
-gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law.
-
-pub 4096R/36879494 created: 2010-04-01 expires: never usage: SC
- trust: unknown validity: unknown
-[ unknown] (1). Qubes Master Signing Key
-
-gpg> fpr
-pub 4096R/36879494 2010-04-01 Qubes Master Signing Key
-Primary key fingerprint: 427F 11FD 0FAA 4B08 0123 F01C DDFA 1A3E 3687 9494
-
-gpg> trust
-pub 4096R/36879494 created: 2010-04-01 expires: never usage: SC
- trust: unknown validity: unknown
-[ unknown] (1). Qubes Master Signing Key
-
-Please decide how far you trust this user to correctly verify other users' keys
-(by looking at passports, checking fingerprints from different sources, etc.)
-
- 1 = I don't know or won't say
- 2 = I do NOT trust
- 3 = I trust marginally
- 4 = I trust fully
- 5 = I trust ultimately
- m = back to the main menu
-
-Your decision? 5
-Do you really want to set this key to ultimate trust? (y/N) y
-
-pub 4096R/36879494 created: 2010-04-01 expires: never usage: SC
- trust: ultimate validity: unknown
-[ unknown] (1). Qubes Master Signing Key
-Please note that the shown key validity is not necessarily correct
-unless you restart the program.
-
-gpg> q
-```
-
-Now, when you import any of the release signing keys and many Qubes team member
-keys, they will already be trusted in virtue of being signed by the QMSK.
-
-As a final sanity check, make sure the QMSK is in your keyring with the correct
-trust level.
-
-```
-$ gpg2 -k "Qubes Master Signing Key"
-pub rsa4096 2010-04-01 [SC]
- 427F11FD0FAA4B080123F01CDDFA1A3E36879494
-uid [ultimate] Qubes Master Signing Key
-```
-
-If you don't see the QMSK here with a trust level of "ultimate," go back and
-follow the instructions in this section carefully and consult the
-[troubleshooting FAQ](#troubleshooting-faq) below.
-
-## How to import and authenticate release signing keys
-
-Every Qubes OS release is signed by a **release signing key (RSK)**, which is,
-in turn, signed by the Qubes Master Signing Key (QMSK).
-
-Before we proceed, you must first complete the following prerequisite steps:
-
-1. [Install OpenPGP software.](#openpgp-software)
-2. [Import and authenticate the QMSK.](#how-to-import-and-authenticate-the-qubes-master-signing-key)
-
-After you have completed these two prerequisite steps, the next step is to
-obtain the correct RSK. The filename of the RSK for your Qubes OS release is
-usually `qubes-release-X-signing-key.asc`, where `X` is the [major version
-number](https://semver.org/) of your Qubes release. For example, if you were
-installing release `1.2.3`, you would replace `X` with `1`, resulting in
-`qubes-release-1-signing-key.asc`. There are several ways to get the RSK for
-your Qubes release.
-
-- If you have access to an existing Qubes installation, the release keys are
- available in dom0 in `/etc/pki/rpm-gpg/RPM-GPG-KEY-qubes-*`. These can be
- [copied](/doc/how-to-copy-from-dom0/#copying-from-dom0) into other qubes for
- further use. In addition, every other qube contains the release key
- corresponding to that installation's release in
- `/etc/pki/rpm-gpg/RPM-GPG-KEY-qubes-*`. If you wish to use one of these keys,
- make sure to import it into your keyring, e.g.:
-
- ```shell_session
- $ gpg2 --import /etc/pki/rpm-gpg/RPM-GPG-KEY-qubes-*
- ```
-
-- Fetch it with GPG:
-
- ```shell_session
- $ gpg2 --keyserver-options no-self-sigs-only,no-import-clean --fetch-keys https://keys.qubes-os.org/keys/qubes-release-X-signing-key.asc
- ```
-
-- Download it as a file. You can find the RSK for your Qubes
- release on the [downloads](/downloads/) page. You can also download all the
- currently used developers' signing keys, RSKs, and the Qubes
- Master Signing Key from the [Qubes security pack](/security/pack/) and the
- [Qubes keyserver](https://keys.qubes-os.org/keys/). Once you've downloaded
- your RSK, import it with GPG:
-
- ```shell_session
- $ gpg2 --keyserver-options no-self-sigs-only,no-import-clean --import ./qubes-release-X-signing-key.asc
- ```
-
-Now that you have the correct RSK, you simply need to verify that it is signed
-by the QMSK:
-
-```shell_session
-$ gpg2 --check-signatures "Qubes OS Release X Signing Key"
-pub rsa4096 2017-03-06 [SC]
- 5817A43B283DE5A9181A522E1848792F9E2795E9
-uid [ full ] Qubes OS Release X Signing Key
-sig!3 1848792F9E2795E9 2017-03-06 Qubes OS Release X Signing Key
-sig! DDFA1A3E36879494 2017-03-08 Qubes Master Signing Key
-
-gpg: 2 good signatures
-```
-
-This is just an example, so the output you receive may not look exactly the
-same. What matters is the line with a `sig!` prefix showing that the QMSK has
-signed this key. This verifies the authenticity of the RSK. Note that the `!`
-flag after the `sig` tag is important because it means that the key signature
-is valid. A `sig-` prefix would indicate a bad signature, and `sig%` would mean
-that gpg encountered an error while verifying the signature. It is not
-necessary to independently verify the authenticity of the RSK, since you
-already verified the authenticity of the QMSK.
-
-As a final sanity check, make sure the RSK is in your keyring with the correct
-trust level:
-
-```shell_session
-$ gpg2 -k "Qubes OS Release"
-pub rsa4096 2017-03-06 [SC]
- 5817A43B283DE5A9181A522E1848792F9E2795E9
-uid [ full ] Qubes OS Release X Signing Key
-```
-
-If you don't see the correct RSK here with a trust level of "full" or higher,
-go back and follow the instructions in this section carefully, and consult the
-[troubleshooting FAQ](#troubleshooting-faq) below.
-
-## How to obtain and authenticate other signing keys
-
-Please see the [Qubes security pack](/security/pack/) documentation.
-
-## How to verify the cryptographic hash values of Qubes ISOs
-
-There are two ways to verify Qubes ISOs: cryptographic hash values and detached
-PGP signatures. Both methods are equally secure. Using just one method is
-sufficient to verify your Qubes ISO. Using both methods is not necessary, but
-you can do so if you like. One method might be more convenient than another in
-certain circumstances, so we provide both. This section covers cryptographic
-hash values. For the other method, see [how to verify detached PGP signatures
-on Qubes ISOs](#how-to-verify-detached-pgp-signatures-on-qubes-isos).
-
-Before we proceed, you must first complete the following prerequisite steps:
-
-1. [Install OpenPGP software.](#openpgp-software)
-2. [Import and authenticate the Qubes Master Signing Key.](#how-to-import-and-authenticate-the-qubes-master-signing-key)
-3. [Import and authenticate your release signing key.](#how-to-import-and-authenticate-release-signing-keys)
-
-Each Qubes ISO is accompanied by a set of **cryptographic hash values**
-contained in a plain text file ending in `.DIGESTS`, which can find on the
-[downloads](/downloads/) page alongside the ISO. This file contains the output
-of running several different cryptographic hash functions on the ISO (a process
-known as "hashing") to obtain alphanumeric outputs known as "hash values" or
-"digests."
-
-One convenient property of hash values is that they can be generated on any
-computer. This means, for example, that you can download a Qubes ISO on one
-computer, hash it, then visually compare that hash value to the one you
-generated or have saved on a different computer.
-
-In addition to the `.DIGESTS` files on the [downloads](/downloads/) page
-alongside each ISO, and you can always find all the digest files for every
-Qubes ISO in the [Qubes security pack](/security/pack/).
-
-If the filename of your ISO is `Qubes-RX-x86_64.iso`, then the name of the
-digest file for that ISO is `Qubes-RX-x86_64.iso.DIGESTS`, where `X` is a
-specific release of Qubes. The digest filename is always the same as the ISO
-filename followed by `.DIGESTS`. Since the digest file is a plain text file,
-you can open it with any text editor. Inside, you should find text that looks
-similar to this:
-
-```shell_session
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA256
-
-3c951138b8b9867d8657f173c1b58b82 *Qubes-RX-x86_64.iso
-1fc9508160d7c4cba6cacc3025165b0f996c843f *Qubes-RX-x86_64.iso
-6b998045a513dcdd45c1c6e61ace4f1b4e7eff799f381dccb9eb0170c80f678a *Qubes-RX-x86_64.iso
-de1eb2e76bdb48559906f6fe344027ece20658d4a7f04ba00d4e40c63723171c62bdcc869375e7a4a4499d7bff484d7a621c3acfe9c2b221baee497d13cd02fe *Qubes-RX-x86_64.iso
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v2
-
-iQIcBAEBCAAGBQJX4XO/AAoJEMsRyh0D+lCCL9sP/jlZ26zhvlDEX/eaA/ANa/6b
-Dpsh/sqZEpz1SWoUxdm0gS+anc8nSDoCQSMBxnafuBbmwTChdHI/P7NvNirCULma
-9nw+EYCsCiNZ9+WCeroR8XDFSiDjvfkve0R8nwfma1XDqu1bN2ed4n/zNoGgQ8w0
-t5LEVDKCVJ+65pI7RzOSMbWaw+uWfGehbgumD7a6rfEOqOTONoZOjJJTnM0+NFJF
-Qz5yBg+0FQYc7FmfX+tY801AwSyevj3LKGqZN1GVcU9hhoHH7f2BcbdNk9I5WHHq
-doKMnZtcdyadQGwMNB68Wu9+0CWsXvk6E00QfW69M4d6w0gbyoJyUL1uzxgixb5O
-qodxrqeitXQSZZvU4kom5zlSjqZs4dGK+Ueplpkr8voT8TSWer0Nbh/VMfrNSt1z
-0/j+e/KMjor7XxehR+XhNWa2YLjA5l5H9rP+Ct/LAfVFp4uhsAnYf0rUskhCStxf
-Zmtqz4FOw/iSz0Os+IVcnRcyTYWh3e9XaW56b9J/ou0wlwmJ7oJuEikOHBDjrUph
-2a8AM+QzNmnc0tDBWTtT2frXcotqL+Evp/kQr5G5pJM/mTR5EQm7+LKSl7yCPoCj
-g8JqGYYptgkxjQdX3YAy9VDsCJ/6EkFc2lkQHbgZxjXqyrEMbgeSXtMltZ7cCqw1
-3N/6YZw1gSuvBlTquP27
-=e9oD
------END PGP SIGNATURE-----
-```
-
-Four digests have been computed for this ISO. The hash functions used, in order
-from top to bottom, are MD5, SHA-1, SHA-256, and SHA-512. One way to verify
-that the ISO you downloaded matches any of these hash values is by using the
-respective `*sum` command:
-
-```shell_session
-$ md5sum -c Qubes-RX-x86_64.iso.DIGESTS
- Qubes-RX-x86_64.iso: OK
-md5sum: WARNING: 23 lines are improperly formatted
-$ sha1sum -c Qubes-RX-x86_64.iso.DIGESTS
-Qubes-RX-x86_64.iso: OK
-sha1sum: WARNING: 23 lines are improperly formatted
-$ sha256sum -c Qubes-RX-x86_64.iso.DIGESTS
-Qubes-RX-x86_64.iso: OK
-sha256sum: WARNING: 23 lines are improperly formatted
-$ sha512sum -c Qubes-RX-x86_64.iso.DIGESTS
-Qubes-RX-x86_64.iso: OK
-sha512sum: WARNING: 23 lines are improperly formatted
-```
-
-The `OK` response tells us that the hash value for that particular hash
-function matches. The program also warns us that there are 23 improperly
-formatted lines, but this is expected. This is because each file contains
-lines for several different hash values (as mentioned above), but each `*sum`
-program verifies only the line for its own hash function. In addition, there
-are lines for the PGP signature that the `*sum` programs do not know how to
-read. Therefore, it is safe to ignore these warning lines.
-
-Another way is to use `openssl` to compute each hash value, then compare them
-to the contents of the digest file:
-
-```shell_session
-$ openssl dgst -md5 Qubes-RX-x86_64.iso
-MD5(Qubes-RX-x86_64.iso)= 3c951138b8b9867d8657f173c1b58b82
-$ openssl dgst -sha1 Qubes-RX-x86_64.iso
-SHA1(Qubes-RX-x86_64.iso)= 1fc9508160d7c4cba6cacc3025165b0f996c843f
-$ openssl dgst -sha256 Qubes-RX-x86_64.iso
-SHA256(Qubes-RX-x86_64.iso)= 6b998045a513dcdd45c1c6e61ace4f1b4e7eff799f381dccb9eb0170c80f678a
-$ openssl dgst -sha512 Qubes-RX-x86_64.iso
-SHA512(Qubes-RX-x86_64.iso)= de1eb2e76bdb48559906f6fe344027ece20658d4a7f04ba00d4e40c63723171c62bdcc869375e7a4a4499d7bff484d7a621c3acfe9c2b221baee497d13cd02fe
-```
-
-(Notice that the outputs match the values from the digest file.)
-
-However, it is possible that an attacker replaced `Qubes-RX-x86_64.iso` with a
-malicious ISO, computed the hash values for that malicious ISO, and replaced
-the values in `Qubes-RX-x86_64.iso.DIGESTS` with his own set of values.
-Therefore, we should also verify the authenticity of the listed hash values.
-Since `Qubes-RX-x86_64.iso.DIGESTS` is a clearsigned PGP file, we can use GPG
-to verify the signature in the digest file:
-
-```shell_session
-$ gpg2 -v --verify Qubes-RX-x86_64.iso.DIGESTS
-gpg: armor header: Hash: SHA256
-gpg: armor header: Version: GnuPG v2
-gpg: original file name=''
-gpg: Signature made Tue 20 Sep 2016 10:37:03 AM PDT using RSA key ID 03FA5082
-gpg: using PGP trust model
-gpg: Good signature from "Qubes OS Release X Signing Key"
-gpg: textmode signature, digest algorithm SHA256
-```
-
-This is just an example, so the output you receive will not look exactly the
-same. What matters is the line that says `Good signature from "Qubes OS Release
-X Signing Key"`. This confirms that the signature on the digest file is good.
-
-If you don't see a good signature here, go back and follow the instructions in
-this section carefully, and consult the [troubleshooting
-FAQ](#troubleshooting-faq) below.
-
-## How to verify detached PGP signatures on Qubes ISOs
-
-There are two ways to verify Qubes ISOs: cryptographic hash values and detached
-PGP signatures. Both methods are equally secure. Using just one method is
-sufficient to verify your Qubes ISO. Using both methods is not necessary, but
-you can do so if you like. One method might be more convenient than another in
-certain circumstances, so we provide both. This section covers detached PGP
-signatures. For the other method, see [how to verify the cryptographic hash
-values of Qubes
-ISOs](#how-to-verify-the-cryptographic-hash-values-of-qubes-isos).
-
-Before we proceed, you must first complete the following prerequisite steps:
-
-1. [Install OpenPGP software.](#openpgp-software)
-2. [Import and authenticate the Qubes Master Signing Key.](#how-to-import-and-authenticate-the-qubes-master-signing-key)
-3. [Import and authenticate your release signing key.](#how-to-import-and-authenticate-release-signing-keys)
-
-Every Qubes ISO is released with a **detached PGP signature** file, which you
-can find on the [downloads](/downloads/) page alongside the ISO. If the
-filename of your ISO is `Qubes-RX-x86_64.iso`, then the name of the signature
-file for that ISO is `Qubes-RX-x86_64.iso.asc`, where `X` is a specific release
-of Qubes. The signature filename is always the same as the ISO filename
-followed by `.asc`.
-
-Download both the ISO and its signature file. Put both of them in the same
-directory, then navigate to that directory. Now, you can verify the ISO by
-executing this GPG command in the directory that contains both files:
-
-```shell_session
-$ gpg2 -v --verify Qubes-RX-x86_64.iso.asc Qubes-RX-x86_64.iso
-gpg: armor header: Version: GnuPG v1
-gpg: Signature made Tue 08 Mar 2016 07:40:56 PM PST using RSA key ID 03FA5082
-gpg: using PGP trust model
-gpg: Good signature from "Qubes OS Release X Signing Key"
-gpg: binary signature, digest algorithm SHA256
-```
-
-This is just an example, so the output you receive will not look exactly the
-same. What matters is the line that says `Good signature from "Qubes OS Release
-X Signing Key"`. This confirms that the signature on the ISO is good.
-
-If you don't see a good signature here, go back and follow the instructions in
-this section carefully, and consult the [troubleshooting
-FAQ](#troubleshooting-faq) below.
-
-## How to re-verify installation media after writing
-
-_This is an optional section intended for advanced users._
-
-After you have authenticated your Qubes ISO and written it onto your desired
-medium (such as a USB drive or optical disc), you can re-verify the data that
-has been written to your medium. Why would you want to do this when you've
-already verified the original ISO? Well, it's conceivable that a sufficiently
-sophisticated adversary might allow your initial ISO verification to succeed
-(so as not to alert you that your machine has been compromised, for example),
-then surreptitiously modify the data as it is being written onto your
-installation medium, resulting in a compromised Qubes installer. This might
-increase the odds that the attack goes undetected. One way to mitigate this
-risk is to re-verify the installer after writing it onto an installation medium
-that cannot be altered, such as a USB drive with a properly-implemented
-physical write-protect switch and firmware that is either unflashable or
-cryptographically-signed (or both), as discussed in our [installation security
-considerations](/doc/install-security/).
-
-This section will walk through an example of re-verifying the installer on such
-a device. We begin by assuming that you have just [written your desired Qubes
-ISO onto the USB
-drive](/doc/installation-guide/#copying-the-iso-onto-the-installation-medium).
-First, unplug your USB drive and flip the write protect switch so that the data
-on the drive can no longer be altered. If you have a different computer from
-the one you used to create the installation medium, consider using that
-computer. If not, try to at least use a fresh VM (e.g., if it's a Qubes
-system). The idea is that the original machine may have been compromised, and
-using a different one for re-verification forces your hypothetical adversary to
-compromise an additional machine in order to succeed.
-
-Now, our goal is to perform the same verification steps as we did with the
-original ISO, except, this time, we'll be reading the installer data directly
-from the write-protected USB drive instead of from the original ISO file.
-First, let's compute the SHA-256 hash value of the data on the drive. (This
-assumes you're already familiar with [how to verify the cryptographic hash
-values of Qubes
-ISOs](#how-to-verify-the-cryptographic-hash-values-of-qubes-isos).) In order to
-do this, we have to know the exact size, in bytes, of the original ISO. There
-are two ways to get this information: from the ISO itself and from the Qubes
-website. Here's an example of the first way:
-
-```shell_session
-$ dd if=/dev/sdX bs=1M count=$(stat -c %s /path/to/iso) iflag=count_bytes | sha256sum
-```
-
-(Where `/dev/sdX` is your USB drive and `/path/to/iso` is the path to your Qubes
-ISO.)
-
-This command reads exactly the number of bytes of your Qubes ISO (obtained with
-`stat -c %s /path/to/iso`) from the USB drive and pipes them into `sha256sum`.
-The output should look something like this:
-
-```shell_session
-0e68dd3347b68618d9e5f3ddb580bf7ecdd2166747630859b3582803f1ca8801 -
-5523+0 records in
-5523+0 records out
-5791285248 bytes (5.8 GB, 5.4 GiB) copied, 76.3369 s, 75.9 MB/s
-```
-
-Note that your actual SHA-256 hash value and byte number will depend on which
-Qubes ISO you're using. This is just an example. Your SHA-256 hash value should
-match the hash value of your genuine original Qubes ISO.
-
-Now, reading the number of bytes directly from the ISO is fine, but you may be
-concerned that a sufficiently sophisticated adversary may have compromised the
-machine on which you're performing this re-verification and may therefore be
-capable of feeding you a false success result. After all, if your adversary
-knows the answer you're looking for --- namely, a match to the genuine ISO ---
-and has access to that very ISO in the same re-verification environment, then
-there is little to prevent him from simply hashing the original ISO and feeding
-you that result (perhaps while also reading from the USB drive and piping it
-into `/dev/null` so that you see the light on the USB drive blinking to support
-the illusion that the data is being read from the USB drive).
-
-Therefore, in order to make things a bit more difficult for your hypothetical
-adversary, you may instead wish to perform the re-verification in an
-environment that has never seen the original ISO, e.g., a separate offline
-computer or a fresh VM the storage space of which is too small to hold the ISO.
-(Note: If you're doing this in Qubes, you can attach the block device from
-sys-usb to a separate new qube. You don't have to perform the re-verification
-directly in sys-usb.) In that case, you'll have to obtain the size of the ISO
-in bytes and enter it into the above command manually. You can, of course,
-obtain the size by simply using the `stat -c %s /path/to/iso` command from
-above on the machine that has the ISO. You can also obtain it from the Qubes
-website by hovering over any ISO download button on the [downloads
-page](/downloads/). (You can also view these values directly in the downloads
-page's [source
-data](https://github.com/QubesOS/qubesos.github.io/blob/master/_data/downloads.yml).)
-Once you have the exact size of the ISO in bytes, simply insert it into the
-same command, for example:
-
-```shell_session
-$ dd if=/dev/sdX bs=1M count=5791285248 iflag=count_bytes | sha256sum
-```
-
-If you wish to compute the values of other hash functions, you can replace
-`sha256sum`, e.g., with `md5sum`, `sha1sum`, or `sha512sum`.
-
-In addition to checking hash values, you can also use GnuPG to verify the
-detached PGP signature directly against the data on the USB drive. (This
-assumes you're already familiar with [how to verify detached PGP signatures on
-Qubes ISOs](#how-to-verify-detached-pgp-signatures-on-qubes-isos).)
-
-```shell_session
-$ dd if=/dev/sdX bs=1M count= iflag=count_bytes | gpg -v --verify Qubes-RX-x86_64.iso.asc -
-gpg: Signature made Thu 14 Jul 2022 08:49:38 PM PDT
-gpg: using RSA key 5817A43B283DE5A9181A522E1848792F9E2795E9
-gpg: using pgp trust model
-gpg: Good signature from "Qubes OS Release X Signing Key" [full]
-gpg: binary signature, digest algorithm SHA256, key algorithm rsa4096
-5523+0 records in
-5523+0 records out
-5791285248 bytes (5.8 GB, 5.4 GiB) copied, 76.6013 s, 75.6 MB/s
-```
-
-(Where `/dev/sdX` is your USB drive, `` is the size of the original
-ISO in bytes, and `Qubes-RX-x86_64.iso.asc` is the detached signature file of
-the original ISO.)
-
-This command reads the exact number of bytes from your USB drive as the size of
-the original ISO and pipes them into `gpg`. The usual form of a `gpg`
-verification command is `gpg --verify `. Our command
-is using shell redirection in order to use data from your USB drive as the
-``, which is why the `-` at the end of the command is required.
-Remember that you still must have properly imported and trusted the
-[QMSK](#how-to-import-and-authenticate-the-qubes-master-signing-key) and
-appropriate [RSK](#how-to-import-and-authenticate-release-signing-keys) in
-order for this to work. You should receive a `Good signature` message for the
-appropriate RSK, which should be signed by a copy of the QMSK that you
-previously confirmed to be genuine.
-
-## How to verify signatures on Git repository tags and commits
-
-Before we proceed, you must first complete the following prerequisite steps:
-
-1. [Install OpenPGP software.](#openpgp-software)
-2. [Import and authenticate the Qubes Master Signing
- Key.](#how-to-import-and-authenticate-the-qubes-master-signing-key)
-3. [Import and authenticate keys from the Qubes security pack
- (qubes-secpack).](/security/pack/) Please see our [PGP key
- policies](/security/pack/#pgp-key-policies) for important information about
- these keys.
-
-Whenever you use one of the [Qubes repositories](https://github.com/QubesOS),
-you should use Git to verify the PGP signature in a tag on the latest commit or
-on the latest commit itself. (One or both may be present, but only one is
-required.) If there is no trusted signed tag or commit on top, any commits
-after the latest trusted signed tag or commit should **not** be trusted. If you
-come across a repo with any unsigned commits, you should not add any of your
-own signed tags or commits on top of them unless you personally vouch for the
-trustworthiness of the unsigned commits. Instead, ask the person who pushed the
-unsigned commits to sign them.
-
-You should always perform this verification on a trusted local machine with
-properly authenticated keys rather than relying on a third party, such as
-GitHub. While the GitHub interface may claim that a commit has a verified
-signature from a member of the Qubes team, this is only trustworthy if GitHub
-has performed the signature check correctly, the account identity is authentic,
-an admin has not replaced the user's key, GitHub's servers have not
-been compromised, and so on. Since there's no way for you to be certain that
-all such conditions hold, you're much better off verifying signatures yourself.
-(Also see: [distrusting the
-infrastructure](/faq/#what-does-it-mean-to-distrust-the-infrastructure).)
-
-### How to verify a signature on a Git tag
-
-```shell_session
-$ git tag -v
-```
-
-or
-
-```shell_session
-$ git verify-tag
-```
-
-### How to verify a signature on a Git commit
-
-```shell_session
-$ git log --show-signature
-```
-
-or
-
-```shell_session
-$ git verify-commit
-```
-
-## Troubleshooting FAQ
-
-### Why am I getting "Can't check signature: public key not found"?
-
-You don't have the correct [release signing
-key](#how-to-import-and-authenticate-release-signing-keys).
-
-### Why am I getting "BAD signature from 'Qubes OS Release X Signing Key'"?
-
-The problem could be one or more of the following:
-
-- You're trying to verify the wrong file(s). Reread this page carefully.
-- You're using the wrong GPG command. Follow the provided examples carefully,
- or try using `gpg` instead of `gpg2` (or vice versa).
-- The ISO or [detached PGP signature
- file](#how-to-verify-detached-pgp-signatures-on-qubes-isos) is bad (e.g.,
- incomplete or corrupt download). Try downloading the signature file again
- from a different source, then try verifying again. If you still get the same
- result, try downloading the ISO again from a different source, then try
- verifying again.
-
-### Why am I getting "bash: gpg2: command not found"?
-
-You don't have `gpg2` installed. Please install it using the method appropriate
-for your environment (e.g., via your package manager), or try using `gpg`
-instead.
-
-### Why am I getting "No such file or directory"?
-
-Your working directory does not contain the required files. Go back and follow
-the instructions more carefully, making sure that you put all required files in
-the same directory *and* navigate to that directory.
-
-### Why am I getting "can't open signed data 'Qubes-RX-x86\_64.iso' / can't hash datafile: file open error"?
-
-The correct ISO is not in your working directory.
-
-### Why am I getting "can't open 'Qubes-RX-x86\_64.iso.asc' / verify signatures failed: file open error"?
-
-The correct [detached PGP signature
-file](#how-to-verify-detached-pgp-signatures-on-qubes-isos) is not in your
-working directory.
-
-### Why am I getting "no valid OpenPGP data found"?
-
-Either you don't have the correct [detached PGP signature
-file](#how-to-verify-detached-pgp-signatures-on-qubes-isos), or you inverted
-the arguments to `gpg2`. (The signature file goes first.)
-
-### Why am I getting "WARNING: This key is not certified with a trusted signature! There is no indication that the signature belongs to the owner."?
-
-There are several possibilities:
-- You don't have the [Qubes Master Signing
- Key](#how-to-import-and-authenticate-the-qubes-master-signing-key).
-- You have not [set the Qubes Master Signing Key's trust level
- correctly.](#how-to-import-and-authenticate-the-qubes-master-signing-key)
-- In the case of a key that is not directly signed by the Qubes Master Signing
- Key, you have not [set that key's trust level
- correctly.](#how-to-verify-signatures-on-git-repository-tags-and-commits)
-
-### Why am I getting "X signature not checked due to a missing key"?
-
-You don't have the keys that created those signatures in your keyring. For the
-purpose of verifying a Qubes ISO, you don't need them as long as you have the
-[Qubes Master Signing
-Key](#how-to-import-and-authenticate-the-qubes-master-signing-key) and the
-[release signing key](#how-to-import-and-authenticate-release-signing-keys) for
-your Qubes release.
-
-### Why am I seeing additional signatures on a key with "[User ID not found]" or from a revoked key?
-
-This is just a fundamental part of how OpenPGP works. Anyone can sign anyone else's
-public key and upload the signed public key to keyservers. Everyone is also
-free to revoke their own keys at any time (assuming they possess or can create
-a revocation certificate). This has no impact on verifying Qubes ISOs, code, or
-keys.
-
-### Why am I getting "verify signatures failed: unexpected data"?
-
-You're not verifying against the correct [detached PGP signature
-file](#how-to-verify-detached-pgp-signatures-on-qubes-isos).
-
-### Why am I getting "not a detached signature"?
-
-You're not verifying against the correct [detached PGP signature
-file](#how-to-verify-detached-pgp-signatures-on-qubes-isos).
-
-### Why am I getting "CRC error; [...] no signature found [...]"?
-
-You're not verifying against the correct [detached PGP signature
-file](#how-to-verify-detached-pgp-signatures-on-qubes-isos), or the signature
-file has been modified. Try downloading it again or from a different source.
-
-### Do I have to verify both the [detached PGP signature file](#how-to-verify-detached-pgp-signatures-on-qubes-isos) and the [cryptographic hash values](#how-to-verify-the-cryptographic-hash-values-of-qubes-isos)?
-
-No, either method is sufficient by itself, but you can do both if you like.
-
-### Why am I getting "no properly formatted X checksum lines found"?
-
-You're not checking the correct [cryptographic hash
-values](#how-to-verify-the-cryptographic-hash-values-of-qubes-isos).
-
-### Why am I getting "WARNING: X lines are improperly formatted"?
-
-Read [how to verify the cryptographic hash values of Qubes
-ISOs](#how-to-verify-the-cryptographic-hash-values-of-qubes-isos) again.
-
-### Why am I getting "WARNING: 1 listed file could not be read"?
-
-The correct ISO is not in your working directory.
-
-### I have another problem that isn't mentioned here.
-
-Carefully reread this page to be certain that you didn't skip any steps. In
-particular, make sure you have the [Qubes Master Signing
-Key](#how-to-import-and-authenticate-the-qubes-master-signing-key), the
-[release signing key](#how-to-import-and-authenticate-release-signing-keys) for
-your Qubes release, *and* the [cryptographic hash
-values](#how-to-verify-the-cryptographic-hash-values-of-qubes-isos) and/or
-[detached PGP signature
-file](#how-to-verify-detached-pgp-signatures-on-qubes-isos), all for the
-*correct* Qubes OS release. If your question is about GPG, please see the
-[GnuPG documentation](https://www.gnupg.org/documentation/). Still have
-question? Please see [help, support, mailing lists, and forum](/support/) for
-places where you can ask!
+---
\ No newline at end of file
diff --git a/user/advanced-topics/awesomewm.md b/user/advanced-topics/awesomewm.md
index 28f969da1..608efe1dd 100644
--- a/user/advanced-topics/awesomewm.md
+++ b/user/advanced-topics/awesomewm.md
@@ -5,187 +5,7 @@ permalink: /doc/awesomewm/
redirect_from:
- /doc/awesome/
- /en/doc/awesome/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/awesomewm.html
ref: 179
title: AwesomeWM (window manager)
----
-
-## Qubes-specific features
-
-* support for the Qubes OS window colors
-* rudimentary support for the Qubes application menu entries following the freedesktop standard
-* support for custom filters and menu entries
-
-## Installation
-
-AwesomeWM can be installed with the standard dom0 installation mechanisms.
-
-```shell_session
-$ sudo qubes-dom0-update awesome
-```
-
-That's it. After logging out, you can select AwesomeWM in the login manager.
-
-## Development
-
-To [contribute code](/doc/contributing/) you may clone the AwesomeWM repository as follows:
-
-```shell_session
-$ git clone https://github.com/QubesOS/qubes-desktop-linux-awesome
-```
-
-For build instructions please check the repository _README_.
-
-The repository attempts to follow the upstream Fedora repository.
-
-## Common customizations
-
-This section focuses on Qubes-specific customizations. For generic AwesomeWM customizations you might want to have a look at the [AwesomeWM website](https://awesomewm.org).
-
-Customizations for AwesomeWM are usually done at `~/.config/awesome/rc.lua`. The default file can be found at `/etc/xdg/awesome/rc.lua`.
-
-### Application menu
-
-Starting from Qubes 4.0 application menu entries specific to AwesomeWM can be put into `~/.config/awesome/xdg-menu/` following the freedesktop standard. The folder might have to be created.
-
-### Focus steal hardening
-
-The default Qubes OS AwesomeWM installation comes with the defaults set by the AwesomeWM developers for focus changes. Some users may want more tight control over window focus changes - especially since focus changes can have security implications when sensitive data is provided to an incorrect application or even qube.
-
-#### Definition
-
-For the below example we'll define _wanted focus changes_ as one of the below:
-
-* mouse move & click afterwards
-* workspace/tag change
-* pre-defined key combinations for focus changes (e.g. Mod-j & Mod-k)
-* tag assignments and unassignments
-
-Everything else is considered an unwanted _focus steal_.
-
-In particular the following events are not meant to cause a focus change:
-
-* new window created
-* a window was closed
-* application request
-* mouse move without click (sloppy focus)
-
-For the below example other requests from applications to the window manager are meant to be ignored in general as well, e.g.:
-
-* windows shouldn't be able to maximize themselves without the user giving a respective command to the WM (simple test: Firefox F11 next to another window)
-* windows shouldn't be able to change their size themselves
-* windows shouldn't be able to modify their borders in any way
-
-Users may want to adjust their definitions and respective implementations according to their needs.
-
-#### Implementation
-
-The implementation may be specific to the AwesomeWM version you're running. This guide refers to AwesomeWM version 3.5.9 which is available to Qubes 4.0 users.
-
-Please keep in mind that this guide may not be conclusive. Your mileage may vary.
-
-##### Change the autofocus implementation
-
-The line `require("awful.autofocus")` in your _rc.lua_ implements various focus-related features for your AwesomeWM instance.
-
-In order to customise these, you can copy the file `/usr/share/awesome/lib/awful/autofocus.lua` to e.g. `~/.config/awesome/autofocus_custom.lua` and replace the line above with `require("autofocus_custom")`.
-
-Then you can customise the focus behavior. According to our above definitions it would look as follows:
-
-```lua
----autofocus_custom.lua
-local client = client
-local screen = screen
-local aclient = require("awful.client")
-local atag = require("awful.tag")
-
---- When loaded, this module makes sure that there's always a client that will have focus
--- on events such as tag switching, client unmanaging, etc.
--- awful.autofocus
-
--- Give focus when clients appear/disappear and no one else has focus.
--- @param obj An object that should have a .screen property.
-function check_focus(obj)
- -- When no visible client has the focus...
- if not client.focus or not client.focus:isvisible() then
- local c = aclient.focus.history.get(obj.screen, 0)
- if c then client.focus = c end
- end
-end
-
--- Give focus on tag selection change.
--- @param tag A tag object
-function check_focus_tag(t)
- local s = atag.getscreen(t)
- if not s then return end
- check_focus({ screen = s })
- if client.focus and client.focus.screen ~= s then
- local c = aclient.focus.history.get(s, 0)
- if c then client.focus = c end
- end
-end
-
---made above functions global & removed some focus switches below (user interaction required instead)
-
---clear any focus
-function clear_focus()
- --unfortunately this doesn't work at the moment
- --cf. https://github.com/awesomeWM/awesome/issues/164
- --(Qubes uses an older AwesomeWM version that doesn't have the fix yet)
- --client.focus = nil
-end
-
-atag.attached_connect_signal(nil, "property::selected", check_focus_tag)
-client.connect_signal("unmanage", clear_focus)
-client.connect_signal("tagged", check_focus)
-client.connect_signal("untagged", check_focus)
-client.connect_signal("property::hidden", clear_focus)
-client.connect_signal("property::minimized", clear_focus)
-```
-
-##### Remove unwanted focus changing key bindings
-
-The mouse bindings
-
-```lua
-awful.button({ }, 4, awful.tag.viewnext),
-awful.button({ }, 5, awful.tag.viewprev)
-```
-
-in the default _rc.lua_ may cause tag and thus focus changes without keyboard interaction and tend to happen accidentally. This doesn't suit our definition from above and should therefore be removed or commented out.
-
-##### Adjust client rules
-
-The default client rule allows certain focus changes via `focus = awful.client.focus.filter`. These changes can be prevented entirely by setting `focus = false`.
-
-Alternatively users may provide their own focus filter functions.
-
-##### Disable sloppy focus
-
-In your _rc.lua_ you'll find a section such as
-
-```lua
- -- Enable sloppy focus
- c:connect_signal("mouse::enter", function(c)
- if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
- and awful.client.focus.filter(c) then
- client.focus = c
- end
- end)
-```
-
-These enable _sloppy focus_ aka focus changes on mouse movements (without clicking) and should be removed or commented out to disable that behaviour.
-
-##### Ignore requests from applications to the window manager
-
-Handling of such requests is currently mostly implemented by AwesomeWM in the file `/usr/share/awesome/lib/awful/ewmh.lua`. You can either comment out the respective `client.connect_singal()` lines in that file (it will change back after each AwesomeWM update though) or disconnect the signals in your _rc.lua_.
-
-As of AwesomeWM 3.5.9 this however is apparently only possible for signals connected to global functions, i.e. currently only the below signals can be disconnected in the _rc.lua_:
-
-```lua
-local ewmh = require("awful.ewmh")
-
-client.disconnect_signal("request::activate", ewmh.activate)
-client.disconnect_signal("request::tag", ewmh.tag)
-```
-
-The signal names may change across AwesomeWM versions.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/bind-dirs.md b/user/advanced-topics/bind-dirs.md
index 2266d91e5..a2404633b 100644
--- a/user/advanced-topics/bind-dirs.md
+++ b/user/advanced-topics/bind-dirs.md
@@ -4,101 +4,7 @@ layout: doc
permalink: /doc/bind-dirs/
redirect_from:
- /en/doc/bind-dirs/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/bind-dirs.html
ref: 186
title: How to make any file persistent (bind-dirs)
----
-
-## What are bind-dirs? ##
-
-With [bind-dirs](https://github.com/QubesOS/qubes-core-agent-linux/blob/master/vm-systemd/bind-dirs.sh)
-any arbitrary files or folders can be made persistent in app qubes.
-
-## What is it useful for? ##
-
-In an app qube all of the file system comes from the template except `/home`, `/usr/local`, and `/rw`.
-This means that changes in the rest of the filesystem are lost when the app qube is shutdown.
-bind-dirs provides a mechanism whereby files usually taken from the template can be persisted across reboots.
-
-For example, in Whonix, [Tor's data dir `/var/lib/tor` has been made persistent in the TemplateBased ProxyVM sys-whonix](https://github.com/Whonix/qubes-whonix/blob/8438d13d75822e9ea800b9eb6024063f476636ff/usr/lib/qubes-bind-dirs.d/40_qubes-whonix.conf#L5)
-In this way sys-whonix can benefit from the Tor anonymity feature 'persistent Tor entry guards' but does not have to be a standalone.
-
-## How to use bind-dirs.sh? ##
-
-In this example, we want to make `/var/lib/tor` persistent.
-
-Inside the app qube.
-
-1. Make sure folder `/rw/config/qubes-bind-dirs.d` exists.
-
- ```
- sudo mkdir -p /rw/config/qubes-bind-dirs.d
- ```
-
-2. Create a file `/rw/config/qubes-bind-dirs.d/50_user.conf` with root rights.
-
-3. Edit the file 50_user.conf to append a folder or file name to the `binds` variable.
-
- ```
- binds+=( '/var/lib/tor' )
- ```
-
-4. Save.
-
-5. Reboot the app qube.
-
-6. Done.
-
-From now on any files within the `/var/lib/tor` folder will persist across reboots.
-
-You can make make many files or folders persist, simply by making multiple entries in the `50_user.conf` file, each on a separate line.
-For example, if you added the file `/etc/tor/torrc` to the `binds` variable, any modifications to *that* file will persist across reboots.
-
-```
-binds+=( '/var/lib/tor' )
-binds+=( '/etc/tor/torrc' )
-```
-
-## Other Configuration Folders ##
-
-* `/usr/lib/qubes-bind-dirs.d` (lowest priority, for packages)
-* `/etc/qubes-bind-dirs.d` (intermediate priority, for template wide configuration)
-* `/rw/config/qubes-bind-dirs.d` (highest priority, for per VM configuration)
-
-## How does it work? ##
-
-bind-dirs.sh is called at startup of an app qube, and configuration files in the above configuration folders are parsed to build a bash array.
-Files or folders identified in the array are copied to `/rw/bind-dirs` if they do not already exist there, and are then bind mounted over the original files/folders.
-
-Creation of the files and folders in `/rw/bind-dirs` should be automatic the first time the app qube is restarted after configuration.
-
-If you want to circumvent this process, you can create the relevant file structure under `/rw/bind-dirs` and make any changes at the same time that you perform the configuration, before reboot.
-Note that you must create the full folder structure under `/rw/bind-dirs` - e.g you would have to create `/rw/bind-dirs/var/lib/tor`
-
-## Limitations ##
-
-* Files that exist in the template root image cannot be deleted in the app qubes root image using bind-dirs.sh.
-* Re-running `sudo /usr/lib/qubes/init/bind-dirs.sh` without a previous `sudo /usr/lib/qubes/init/bind-dirs.sh umount` does not work.
-* Running `sudo /usr/lib/qubes/init/bind-dirs.sh umount` after boot (before shutdown) is probably not sane and nothing can be done about that.
-* Many editors create a temporary file and copy it over the original file. If you have bind mounted an individual file this will break the mount.
-Any changes you make will not survive a reboot. If you think it likely you will want to edit a file, then either include the parent directory in bind-dirs rather than the file, or perform the file operation on the file in `/rw/bind-dirs`.
-* Some files are altered when a qube boots - e.g. `/etc/hosts`.
-If you try to use bind-dirs on such files you may break your qube in unpredictable ways.
-You can add persistent rules to `/etc/hosts` using [`/rw/config/rc.local`](/doc/config-files)
-
-## How to remove binds from bind-dirs.sh? ##
-
-`binds` is actually just a bash variable (an array) and the bind-dirs.sh configuration folders are sourced as bash snippets in lexical order.
-Therefore if you wanted to remove an existing entry from the `binds` array, you could do that by using a lexically higher configuration file.
-For example, if you wanted to make `/var/lib/tor` non-persistent in `sys-whonix` without manually editing `/usr/lib/qubes-bind-dirs.d/40_qubes-whonix.conf`, you could use the following in:
-
-`/rw/config/qubes-bind-dirs.d/50_user.conf`
-
-~~~
-binds=( "${binds[@]/'/var/lib/tor'}" )
-~~~
-
-(Editing `/usr/lib/qubes-bind-dirs.d/40_qubes-whonix.conf` directly is strongly discouraged, since such changes get lost when that file is changed in the package on upgrades.)
-
-## Discussion ##
-
-[app qubes: make selected files and folders located in the root image persistent- review bind-dirs.sh](https://groups.google.com/forum/#!topic/qubes-devel/tcYQ4eV-XX4/discussion)
+---
\ No newline at end of file
diff --git a/user/advanced-topics/config-files.md b/user/advanced-topics/config-files.md
index 3ffdfd553..14495b085 100644
--- a/user/advanced-topics/config-files.md
+++ b/user/advanced-topics/config-files.md
@@ -7,140 +7,7 @@ redirect_from:
- /doc/ConfigFiles/
- /doc/UserDoc/ConfigFiles/
- /wiki/UserDoc/ConfigFiles/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/config-files.html
ref: 180
title: Config files
----
-
-Qubes-specific VM config files
-------------------------------
-
-These files are placed in `/rw`, which survives a VM restart.
-That way, they can be used to customize a single VM instead of all VMs based on the same template.
-The scripts here all run as root.
-
-- `/rw/config/rc.local` - script runs at VM startup.
- Good place to change some service settings, replace config files with its copy stored in `/rw/config`, etc.
- Example usage:
-
- ~~~
- # Store bluetooth keys in /rw to keep them across VM restarts
- rm -rf /var/lib/bluetooth
- ln -s /rw/config/var-lib-bluetooth /var/lib/bluetooth
- ~~~
-
- ~~~
- # Add entry to /etc/hosts
- echo '127.0.0.1 example.com' >> /etc/hosts
- ~~~
-
-- `/rw/config/qubes-ip-change-hook` - script runs in NetVM after every external IP change and on "hardware" link status change.
-
-- In ProxyVMs (or app qubes with `qubes-firewall` service enabled), scripts placed in the following directories will be executed in the listed order followed by `qubes-firewall-user-script` at start up.
- Good place to write custom firewall rules.
-
- ~~~
- /etc/qubes/qubes-firewall.d
- /rw/config/qubes-firewall.d
- /rw/config/qubes-firewall-user-script
- ~~~
-
-- `/rw/config/suspend-module-blacklist` - list of modules (one per line) to be unloaded before system goes to sleep.
- The file is used only in a VM with PCI devices attached.
- Intended for use with problematic device drivers.
-
-- In NetVMs/ProxyVMs, scripts placed in `/rw/config/network-hooks.d` will be ran when configuring Qubes interfaces. For each script, the `command`, `vif`, `vif_type` and `ip` is passed as arguments (see `/etc/xen/scripts/vif-route-qubes`). For example, consider a PV app qube `work` with IP `10.137.0.100` and `sys-firewall` as NetVM. Assuming it's Xen domain id is arbitrary `12` then, the following script located at `/rw/config/network-hooks.d/hook-100.sh` in `sys-firewall`:
-
- ~~~
- #!/bin/bash
-
- command="$1"
- vif="$2"
- vif_type="$3"
- ip="$4"
-
- if [ "$ip" == '10.137.0.100' ]; then
- case "$command" in
- online)
- ip route add 192.168.0.100 via 10.137.0.100
- ;;
- offline)
- ip route del 192.168.0.100
- ;;
- esac
- fi
- ~~~
-
- will be executed with arguments `online vif12.0 vif 10.137.0.100` when starting `work`. Please note that in case of an HVM, the script will be called twice - once with vif_type `vif`, then with vif_type `vif_ioemu` (and different interface names). As long as the ioemu interface exists, it should be preferred (up to the hook script). When the VM decides to use a PV interface (vif_type `vif`), the ioemu one will be unplugged.
-
-Note that scripts need to be executable (`chmod +x`) to be used.
-
-Also, take a look at [bind-dirs](/doc/bind-dirs) for instructions on how to easily modify arbitrary system files in an app qube and have those changes persist.
-
-GUI and audio configuration in dom0
------------------------------------
-
-The GUI configuration file `/etc/qubes/guid.conf` in one of a few not managed by `qubes-prefs` or the Qubes Manager tool.
-Sample config (included in default installation):
-
-~~~
-# Sample configuration file for Qubes GUI daemon
-# For syntax go https://www.hyperrealm.com/libconfig/libconfig_manual.html
-
-global: {
- # default values
- #allow_fullscreen = false;
- #override_redirect_protection = true;
- #allow_utf8_titles = false;
- #secure_copy_sequence = "Ctrl-Shift-c";
- #secure_paste_sequence = "Ctrl-Shift-v";
- #windows_count_limit = 500;
- #audio_low_latency = true;
- #log_level = 1;
- #trayicon_mode = "border1";
- #startup_timeout = 45;
-};
-
-# most of setting can be set per-VM basis
-
-VM: {
- work: {
- allow_utf8_titles = true;
- };
- video-vm: {
- allow_fullscreen = true;
- };
-};
-~~~
-
-Currently supported settings:
-
-- `allow_fullscreen` - allow VM to request its windows to go fullscreen (without any colorful frame).
-
- **Note:** Regardless of this setting, you can always put a window into fullscreen mode in Xfce4 using the trusted window manager by right-clicking on a window's title bar and selecting "Fullscreen".
- This functionality should still be considered safe, since a VM window still can't voluntarily enter fullscreen mode.
- The user must select this option from the trusted window manager in dom0.
- To exit fullscreen mode from here, press `alt` + `space` to bring up the title bar menu again, then select "Leave Fullscreen".
-
-- `allow_utf8_titles` - allow the use of UTF-8 in window titles; otherwise, non-ASCII characters are replaced by an underscore.
-
-- `secure_copy_sequence` and `secure_paste_sequence` - key sequences used to trigger secure copy and paste.
-
-- `audio_low_latency` - force low-latency audio mode (about 40ms compared to 200-500ms by default).
- Note that this will cause much higher CPU usage in dom0. It's enabled by
- default, disabling it may save CPU in dom0.
-
-- `trayicon_mode` - defines the trayicon coloring mode. Options are
- - `bg` - color full icon background to the VM color
- - `border1` - add 1px border at the icon edges
- - `border2` - add 1px border 1px from the icon edges
- - `tint` - tinttint icon to the VM color, can be used with additional
- modifiers (you can enable multiple of them)
- - `tint+border1,tint+border2` - same as tint, but also add a border
- - `tint+saturation50` - same as tint, but reduce icon saturation by 50%
- - `tint+whitehack` - same as tint, but change white pixels (0xffffff) to
- almost-white (0xfefefe)
-
-- `log level` - defines the log options logs can take. It can
- have a value of 0 (only errors), 1 (some basic messages), and 2 (debug).
-
-- `startup_timeout` - The timeout for startup.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/disposable-customization.md b/user/advanced-topics/disposable-customization.md
index bb34cd989..278b814b7 100644
--- a/user/advanced-topics/disposable-customization.md
+++ b/user/advanced-topics/disposable-customization.md
@@ -9,377 +9,7 @@ redirect_from:
- /doc/DispVMCustomization/
- /doc/UserDoc/DispVMCustomization/
- /wiki/UserDoc/DispVMCustomization/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/disposable-customization.html
ref: 174
title: Disposable customization
----
-
-## Introduction
-
-A [disposable](/doc/disposable/) can be based on any [app qube](/doc/glossary/#app-qube).
-You can also choose to use different [disposable templates](/doc/glossary/#disposable-template) for different disposables.
-To prepare an app qube to be a disposable template, you need to set `template_for_dispvms` property, for example:
-
-```shell_session
-[user@dom0 ~]$ qvm-prefs fedora-26-dvm template_for_dispvms True
-```
-
-Additionally, if you want to have menu entries for starting applications in disposable based on this app qube (instead of in the app qube itself), you can achieve it with `appmenus-dispvm` feature:
-
-```shell_session
-[user@dom0 ~]$ qvm-features fedora-26-dvm appmenus-dispvm 1
-```
-
-Note: application shortcuts that existed before setting this feature will not be updated automatically. Please go the the "Applications" tab in the qube's "Settings" dialog and unselect all existing shortcuts by clicking "<<", then click "OK" and close the dialog. Give it a few seconds time and then reopen and re-select all the shortcuts you want to see in the menu. See [this page](/doc/managing-appvm-shortcuts) for background information.
-
-## Security
-
-If a disposable template becomes compromised, then any disposable based on that disposable template could be compromised.
-Therefore, you should not make any risky customizations (e.g., installing untrusted browser plugins) in important disposable templates.
-In particular, the *default* disposable template is important because it is used by the "Open in disposable" feature.
-This means that it will have access to everything that you open with this feature.
-For this reason, it is strongly recommended that you base the default disposable template on a trusted template and refrain from making any risky customizations to it.
-
-## Creating a new disposable template
-
-In Qubes 4.0, you're no longer restricted to a single disposable template. Instead, you can create as many as you want. Whenever you start a new disposable, you can choose to base it on whichever disposable template you like.
-To create new disposable template, lets say `custom-disposable-template`, based on `debian-9` template, use following commands:
-
-```shell_session
-[user@dom0 ~]$ qvm-create --template debian-9 --label red custom-disposable-template
-[user@dom0 ~]$ qvm-prefs custom-disposable-template template_for_dispvms True
-[user@dom0 ~]$ qvm-features custom-disposable-template appmenus-dispvm 1
-```
-
-Additionally you may want to set it as default disposable template:
-
-```shell_session
-[user@dom0 ~]$ qubes-prefs default_dispvm custom-disposable-template
-```
-
-The above default is used whenever a qube request starting a new disposable and do not specify which one (for example `qvm-open-in-dvm` tool). This can be also set in qube settings and will affect service calls from that qube. See [qrexec documentation](/doc/qrexec/#specifying-vms-tags-types-targets-etc) for details.
-
-If you wish to use a [Minimal Template](/doc/templates/minimal/) as a disposable template, please see the [Minimal Template](/doc/templates/minimal/) page.
-
-## Customization of disposable
-
-_**Note:** If you are trying to customize Tor Browser in a Whonix disposable, please consult the [Whonix documentation](https://www.whonix.org/wiki/Tor_Browser/Advanced_Users#disposable_Template_Customization)._
-
-It is possible to change the settings for each new disposable.
-This can be done by customizing the disposable template on which it is based:
-
-1. Start a terminal in the `fedora-26-dvm` qube (or another disposable template) by running the following command in a dom0 terminal. (If you enable `appmenus-dispvm` feature (as explained at the top), applications menu for this VM (`fedora-26-dvm`) will be "Disposable: fedora-26-dvm" (instead of "Domain: fedora-26-dvm") and entries there will start new disposable based on that VM (`fedora-26-dvm`). Not in that VM (`fedora-26-dvm`) itself).
-
- ```shell_session
- [user@dom0 ~]$ qvm-run -a fedora-26-dvm gnome-terminal
- ```
-
-2. Change the qube's settings and/or applications, as desired. Some examples of changes you may want to make include:
- - Changing Firefox's default startup settings and homepage.
- - Changing default editor, image viewer. In Debian-based templates this can be done with the `mimeopen` command.
- - Changing the disposable's default NetVM. For example, you may wish to set the NetVM to "none." Then, whenever you start a new disposable, you can choose your desired ProxyVM manually (by changing the newly-started disposables settings). This is useful if you sometimes wish to use a disposable with a Whonix Gateway, for example. It is also useful if you sometimes wish to open untrusted files in a network-disconnected disposable.
-
-4. Shutdown the qube (either by `poweroff` from qube's terminal, or `qvm-shutdown` from dom0 terminal).
-
-## Using named disposables for sys-*
-
-You can use a [named disposable](/doc/glossary/#named-disposable) for `sys-*` as long as it is stateless.
-For example, a `sys-net` using DHCP or `sys-usb` will work.
-In most cases `sys-firewall` will also work, even if you have configured app qube firewall rules.
-The only exception is if you require something like VM to VM communication and have manually edited `iptables` or other items directly inside the firewall app qube.
-
-To create one that has no PCI devices attached, such as for `sys-firewall`:
-
-~~~
-qvm-create -C DispVM -l green
-qvm-prefs autostart true
-qvm-prefs netvm
-qvm-prefs provides_network true
-qvm-features appmenus-dispvm ''
-~~~
-
-Next, set the old `sys-firewall` autostart to false, and update any references to the old one to instead point to the new.
-For example, with `qvm-prefs work netvm sys-firewall2`.
-
-To create one with a PCI device attached such as for `sys-net` or `sys-usb`, use the additional commands as follows.
-
-**Note** You can use `qvm-pci` to [determine](/doc/how-to-use-pci-devices/#qvm-pci-usage) the ``.
-Also, you will often need to include the `-o no-strict-reset=True` [option](/doc/how-to-use-pci-devices/#no-strict-reset) with USB controllers.
-
-~~~
-qvm-create -C DispVM -l red
-qvm-prefs virt_mode hvm
-qvm-service meminfo-writer off
-qvm-pci attach --persistent dom0:
-qvm-prefs autostart true
-qvm-prefs netvm ''
-qvm-features appmenus-dispvm ''
-# optional, if this disposable will be providing networking
-qvm-prefs provides_network true
-~~~
-
-Next, set the old `sys-` VM's autostart to false, and update any references to the old one.
-In particular, make sure to update `/etc/qubes-rpc/policy/qubes.UpdatesProxy` in dom0.
-
-For example, `qvm-prefs sys-firewall netvm `.
-See below for a complete example of a `sys-net` replacement:
-
-~~~
-qvm-create -C DispVM -l red sys-net2
-qvm-prefs sys-net2 virt_mode hvm
-qvm-service sys-net2 meminfo-writer off
-qvm-pci attach --persistent sys-net2 dom0:00_1a.0
-qvm-prefs sys-net2 autostart true
-qvm-prefs sys-net2 netvm ''
-qvm-features sys-net2 appmenus-dispvm ''
-qvm-prefs sys-net2 provides_network true
-qvm-prefs sys-net autostart false
-qvm-prefs sys-firewall netvm sys-net2
-qubes-prefs clockvm sys-net2
-~~~
-
-## Adding programs to disposable Application Menu
-
-For added convenience, arbitrary programs can be added to the Application Menu of the disposable.
-
-In order to do that, select "Qube settings" entry in selected base app qube, go to "Applications" tab and select desired applications as for any other qube.
-
-Note that currently only applications whose main process keeps running until you close the application (i.e. do not start a background process instead) will work. One of known examples of incompatible applications is GNOME Terminal (shown on the list as "Terminal"). Choose different terminal emulator (like XTerm) instead.
-
-## Create Custom sys-net sys-firewall and sys-usb disposables
-
-Users have the option of creating customized disposables for the `sys-net`, `sys-firewall` and `sys-usb` VMs. In this configuration, a fresh VM instance is created each time a disposable is launched. Functionality is near-identical to the default VMs created following a new Qubes’ installation, except the user benefits from a non-persistent filesystem.
-
-Functionality is not limited, users can:
-
-- Set custom firewall rule sets and run Qubes VPN scripts.
-- Set disposables to autostart at system boot.
-- Attach PCI devices with the `--persistent` option.
-
-Using disposables in this manner is ideal for untrusted qubes which require persistent PCI devices, such as USB VMs and NetVMs.
-
->_**Note:**_ Users who want customized VPN or firewall rule sets must create a separate disposable template for use by each disposable. If disposable template customization is not needed, then a single disposable template is used as a template for all disposables.
-
-### Create and configure the disposable template on which the disposable will be based
-
-1. Create the disposable template:
-
- ```shell_session
- [user@dom0 ~]$ qvm-create --class AppVM --label gray
- ```
-
-2. _(optional)_ In the disposable template, add custom firewall rule sets, Qubes VPN scripts, etc.
-
- Firewall rules sets and Qubes VPN scripts can be added just like any other VM.
-
-3. Set the disposable template as template for disposables:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs template_for_dispvms true
- ```
-
-### Create the sys-net disposable
-
-1. Create `sys-net` disposable based on the disposable template:
-
- ```shell_session
- [user@dom0 ~]$ qvm-create --template --class DispVM --label red disp-sys-net
- ```
-
-2. Set `disp-sys-net` virtualization mode to [hvm](/doc/hvm/):
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-net virt_mode hvm
- ```
-
-3. Set `disp-sys-net` to provide network for other VMs:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-net provides_network true
- ```
-
-4. Set `disp-sys-net` NetVM to none:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-net netvm ""
- ```
-
-5. List all available PCI devices to determine the correct _backend:BDF_ address(es) to assign to `disp-sys-net`:
-
- ```shell_session
- [user@dom0 ~]$ qvm-pci
- ```
-
-6. Attach the network PCI device(s) to `disp-sys-net` (finding and assigning PCI devices can be found [here](/doc/how-to-use-pci-devices/):
-
- ```shell_session
- [user@dom0 ~]$ qvm-pci attach --persistent disp-sys-net :
- ```
-
-7. _(recommended)_ Set `disp-sys-net` to start automatically when Qubes boots:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-net autostart true
- ```
-
-8. _(recommended)_ Disable the `appmenus-dispvm` feature, as disp-sys-net is not itself a disposable template (Note: this is only necessary if you enabled the `appmenus-dispvm` feature for the disposable template):
-
- ```shell_session
- [user@dom0 ~]$ qvm-features disp-sys-net appmenus-dispvm ''
- ```
-
-9. _(optional)_ Set `disp-sys-net` as the dom0 time source:
-
- ```shell_session
- [user@dom0 ~]$ qubes-prefs clockvm disp-sys-net
- ```
-
-10. _(recommended)_ Allow templates to be updated via `disp-sys-net`. In dom0, edit `/etc/qubes-rpc/policy/qubes.UpdatesProxy` to change the target from `sys-net` to `disp-sys-net`.
-
-### Create the sys-firewall disposable
-
-1. Create `sys-firewall` disposable:
-
- ```shell_session
- [user@dom0 ~]$ qvm-create --template --class DispVM --label green disp-sys-firewall
- ```
-
-2. Set `disp-sys-firewall` to provide network for other VMs:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-firewall provides_network true
- ```
-
-3. Set `disp-sys-net` as the NetVM for `disp-sys-firewall`:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-firewall netvm disp-sys-net
- ```
-
-4. Set `disp-sys-firewall` as NetVM for other app qubes:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs netvm disp-sys-firewall
- ```
-
-5. _(recommended)_ Set `disp-sys-firewall` to auto-start when Qubes boots:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-firewall autostart true
- ```
-
-6. _(recommended)_ Disable the `appmenus-dispvm` feature, as disp-sys-firewall is not itself a disposable template (Note: this is only necessary if you enabled the `appmenus-dispvm` feature for the disposable template):
-
- ```shell_session
- [user@dom0 ~]$ qvm-features disp-sys-firewall appmenus-dispvm ''
- ```
-
-7. _(optional)_ Set `disp-sys-firewall` as the default NetVM:
-
- ```shell_session
- [user@dom0 ~]$ qubes-prefs default_netvm disp-sys-firewall
- ```
-
-### Create the sys-usb disposable
-
-1. Create the `disp-sys-usb`:
-
- ```shell_session
- [user@dom0 ~]$ qvm-create --template --class DispVM --label red disp-sys-usb
- ```
-
-2. Set the `disp-sys-usb` virtualization mode to hvm:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-usb virt_mode hvm
- ```
-
-3. Set `disp-sys-usb` NetVM to none:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-usb netvm ""
- ```
-
-4. List all available PCI devices:
-
- ```shell_session
- [user@dom0 ~]$ qvm-pci
- ```
-
-5. Attach the USB controller to the `disp-sys-usb`:
- >_**Note:**_ Most of the commonly used USB controllers (all Intel integrated controllers) require the `-o no-strict-reset=True` option to be set. Instructions detailing how this option is set can be found [here](/doc/how-to-use-pci-devices/#no-strict-reset).
-
- ```shell_session
- [user@dom0 ~]$ qvm-pci attach --persistent disp-sys-usb :
- ```
-
-6. _(optional)_ Set `disp-sys-usb` to auto-start when Qubes boots:
-
- ```shell_session
- [user@dom0 ~]$ qvm-prefs disp-sys-usb autostart true
- ```
-
-7. _(recommended)_ Disable the `appmenus-dispvm` feature, as disp-sys-usb is not itself a disposable template (Note: this is only necessary if you enabled the `appmenus-dispvm` feature for the disposable template):
-
- ```shell_session
- [user@dom0 ~]$ qvm-features disp-sys-usb appmenus-dispvm ''
- ```
-
-8. Users should now follow instructions on [How to hide USB controllers from dom0](/doc/usb-qubes/#how-to-hide-usb-controllers-from-dom0).
-
-9. At this point, your mouse may not work.
- Edit the `qubes.InputMouse` policy file in dom0, which is located here:
-
- ```
- /etc/qubes-rpc/policy/qubes.InputMouse
- ```
-
- Add a line like this to the top of the file:
-
- ```
- disp-sys-usb dom0 allow,user=root
- ```
-
-### Starting the disposables
-
-Prior to starting the new VMs, users should ensure that no other VMs such as the old `sys-net` and `sys-usb` VMs are running. This is because no two VMs can share the same PCI device while both running. It is recommended that users detach the PCI devices from the old VMs without deleting them. This will allow users to reattach the PCI devices if the newly created disposables fail to start.
-
-Detach PCI device from VM:
-
-```shell_session
-[user@dom0~]$ qvm-pci detach :
-```
-
-### Troubleshooting
-
-If the `disp-sys-usb` does not start, it could be due to a PCI passthrough problem. For more details on this issue along with possible solutions, users can look [here](/doc/pci-troubleshooting/#pci-passthrough-issues).
-
-## Deleting disposables
-
-While working in a disposable, you may want to open a document in another disposable.
-For this reason, the property `default_dispvm` may be set to the name of your disposable in a number of VMs:
-
-```shell_session
-[user@dom0 ~]$ qvm-prefs workvm | grep default_dispvm
-default_dispvm - custom-disposable-template
-```
-
-This will prevent the deletion of the disposable template. In order to fix this you need to unset the `default_dispvm` property:
-
-```shell_session
-[user@dom0 ~]$ qvm-prefs workvm default_dispvm ""
-```
-
-You can then delete the disposable template:
-
-```shell_session
-[user@dom0 ~]$ qvm-remove custom-disposable-template
-This will completely remove the selected VM(s)
- custom-disposable-template
-```
-
-
-If you still encounter the issue, you may have forgot to clean an entry. Looking at the system logs will help you:
-
-```shell_session
-[user@dom0 ~]$ journalctl | tail
-```
+---
\ No newline at end of file
diff --git a/user/advanced-topics/gui-configuration.md b/user/advanced-topics/gui-configuration.md
index 2f02bbe86..c776025c5 100644
--- a/user/advanced-topics/gui-configuration.md
+++ b/user/advanced-topics/gui-configuration.md
@@ -2,56 +2,7 @@
lang: en
layout: doc
permalink: /doc/gui-configuration/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/gui-configuration.html
ref: 184
title: GUI configuration
----
-
-## Video RAM adjustment for high-resolution displays
-
-When a qube starts, a fixed amount of RAM is allocated to the graphics buffer called video RAM.
-This buffer needs to be at least as big as the whole desktop, accounting for all displays that are or will be connected to the machine.
-By default, it is as much as needed for the current display and an additional full HD (FHD) display (1920×1080 8 bit/channel RGBA).
-This logic fails when the machine has primary display in FHD resolution and, after starting some qubes, a 4K display is connected.
-If the buffer is too small, and internal desktop resize fails.
-
-To increase the minimum size of the video RAM buffer:
-
-```sh
-qvm-features dom0 gui-videoram-min $(($WIDTH * $HEIGHT * 4 / 1024))
-qvm-features dom0 gui-videoram-overhead 0
-```
-
-Where `$WIDTH`×`$HEIGHT` is the maximum desktop size that you anticipate needing.
-For example, if you expect to use a 1080p display and a 4k display side-by-side, that is `(1920 + 3840) × 2160 × 4 / 1024 = 48600`, or slightly more than 48 MiB per qube.
-After making these adjustments, the qubes need to be restarted.
-
-In the case of multiple display with different orientations or if you plug/unplug displays, the following code will set correct memory size using xrandr.
-```sh
-qvm-features dom0 gui-videoram-min $(xrandr --verbose | grep "Screen 0" | sed -e 's/.*current //' -e 's/\,.*//' | awk '{print $1*$3*4/1024}')
-```
-
-The amount of memory allocated per qube is the maximum of:
-- `gui-videoram-min`
-- current display + `gui-videoram-overhead`
-
-Default overhead is about 8 MiB, which is enough for a 1080p display (see above).
-So, the `gui-videoram-overhead` zeroing is not strictly necessary; it only avoids allocating memory that will not be used.
-
-You might face issues when playing video, if the video is choppy instead of
-smooth display this could be because the X server doesn't work. You can use the
-Linux terminal (Ctrl-Alt-F2) after starting the virtual machine, login. You can
-look at the Xorg logs file. As an option you can have the below config as
-well present in `/etc/X11/xorg.conf.d/90-intel.conf`, depends on HD graphics
-though -
-
-```bash
-Section "Device"
- Identifier "Intel Graphics"
- Driver "intel"
- Option "TearFree" "true"
-EndSection
-```
-
-## GUI Troubleshooting
-
-See [GUI Troubleshooting](/doc/gui-troubleshooting) for issues relating to the Qubes graphical user interface and how to fix them.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/guivm.md b/user/advanced-topics/guivm.md
index 75d540765..136399789 100644
--- a/user/advanced-topics/guivm.md
+++ b/user/advanced-topics/guivm.md
@@ -2,154 +2,7 @@
lang: en
layout: doc
permalink: /doc/guivm-configuration/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/guivm.html
ref: 184
title: GuiVM Configuration
----
-
-## Gui domain
-
-In this section, we describe how to setup `GuiVM` in several case as described in [GUI Domain](/news/2020/03/18/gui-domain/). In all the cases, the base underlying TemplateVM used is `Fedora` with `XFCE` flavor to match current desktop choice in `dom0`. That can be adapted very easily for other desktops and templates. By default, the configured `GuiVM` is a management qube with global admin permissions `rwx` but can be adjusted to `ro` (see [Introducing the Qubes Admin API](/news/2017/06/27/qubes-admin-api/)) in pillar data of the corresponding `GuiVM` to setup. For example, pillar data for `sys-gui` located at `/srv/pillar/base/qvm/sys-gui.sls`. Please note that each `GuiVM` has no `NetVM`.
-
-> Note: The setup is done using `SaltStack` formulas with the `qubesctl` tool. When executing it, apply step can take time because it needs to download latest Fedora XFCE TemplateVM and install desktop dependencies.
-
-
-### Hybrid GuiVM `sys-gui`
-
-Here, we describe how to setup `sys-gui` that we call *hybrid mode* or referenced as a *compromise solution* in [GUI Domain](/news/2020/03/18/gui-domain/#the-compromise-solution).
-
-[](/attachment/posts/guivm-hybrid.png)
-
-In `dom0`, enable the formula for `sys-gui` with pillar data:
-
-```bash
-sudo qubesctl top.enable qvm.sys-gui
-sudo qubesctl top.enable qvm.sys-gui pillar=True
-```
-
-then, execute it:
-
-```bash
-sudo qubesctl --all state.highstate
-```
-
-You can now disable the `sys-gui` formula:
-```bash
-sudo qubesctl top.disable qvm.sys-gui
-```
-
-At this point, you need to shutdown all your running qubes as the `default_guivm` qubes global property has been set to `sys-gui`. In order to use `sys-gui` as GuiVM, you need to logout and, in the top right corner, select `lightdm` session type to *Gui Domain (sys-gui)*. Once logged, you are running `sys-gui` as fullscreen window and you can perform any operation as if you would be in `dom0` desktop.
-
-> Note: In order to go back to `dom0` desktop, you need to logout and then, select `lightdm` session to *Session Xfce*.
-
-### GPU GuiVM `sys-gui-gpu`
-
-Here, we describe how to setup `sys-gui-gpu` which is a `GuiVM` with *GPU passthrough* in [GUI Domain](/news/2020/03/18/gui-domain/#gpu-passthrough-the-perfect-world-desktop-solution).
-
-[](/attachment/posts/guivm-gpu.png)
-
-In `dom0`, enable the formula for `sys-gui-gpu` with pillar data:
-
-```bash
-sudo qubesctl top.enable qvm.sys-gui-gpu
-sudo qubesctl top.enable qvm.sys-gui-gpu pillar=True
-```
-
-then, execute it:
-
-```bash
-sudo qubesctl --all state.highstate
-```
-
-You can now disable the `sys-gui-gpu` formula:
-
-```bash
-sudo qubesctl top.disable qvm.sys-gui-gpu
-```
-
-One more step is needed: attaching the actual GPU to `sys-gui-gpu`. This can be done either manually via `qvm-pci` (remember to enable permissive option), or via:
-
-```bash
-sudo qubesctl state.sls qvm.sys-gui-gpu-attach-gpu
-```
-
-The latter option assumes Intel graphics card (it has hardcoded PCI address). If you don't have Intel graphics card, please use the former method with `qvm-pci` (see [How to use PCI devices](/doc/how-to-use-pci-devices/)).
-
-> Note: Some platforms can have multiple GPU. For example on laptops, it is usual to have HDMI or DISPLAY port linked to the secondary GPU (generally called _discrete GPU_). In such case, you have to also attach the secondary GPU to `sys-gui-gpu` with permissive option.
-
-At this point, you need to reboot your Qubes OS machine in order to boot into `sys-gui-gpu`.
-
-> Note: For some platforms, it can be sufficient to shutdown all the running qubes and starting `sys-gui-gpu`. Unfortunately, it has been observed that detaching and attaching some GPU cards from `dom0` to `sys-gui-gpu` can freeze computer. We encourage reboot to prevent any data loss.
-
-Once, `lightdm` is started, you can log as `user` where `user` refers to the first `dom0` user in `qubes` group and with corresponding `dom0` password. A better approach for handling password is currently discussed in [QubesOS/qubes-issues#6740](https://github.com/QubesOS/qubes-issues/issues/6740).
-
-### VNC GuiVM `sys-gui-vnc`
-
-Here, we describe how to setup `sys-gui-vnc` that we call a *remote* `GuiVM` or referenced as *with a virtual server* in [GUI Domain](/news/2020/03/18/gui-domain/#virtual-server-the-perfect-remote-solution).
-
-[](/attachment/posts/guivm-vnc.png)
-
-In `dom0`, enable the formula for `sys-gui-vnc` with pillar data:
-
-```bash
-sudo qubesctl top.enable qvm.sys-gui-vnc
-sudo qubesctl top.enable qvm.sys-gui-vnc pillar=True
-```
-
-then, execute it:
-
-```bash
-sudo qubesctl --all state.highstate
-```
-
-You can now disable the `sys-gui-vnc` formula:
-
-```bash
-sudo qubesctl top.disable qvm.sys-gui-vnc
-```
-
-At this point, you need to shutdown all your running qubes as the `default_guivm` qubes global property has been set to `sys-gui-vnc`. Then, you can start `sys-gui-vnc`:
-
-```bash
-qvm-start sys-gui-vnc
-```
-
-A VNC server session is running on `localhost:5900` in `sys-gui-vnc`. In order to reach the `VNC` server, we encourage to not connect `sys-gui-vnc` to a `NetVM` but rather to use another qube for remote access, say `sys-remote`. First, you need to bind port 5900 of `sys-gui-vnc` into a `sys-remote` local port (you may want to use another port than 5900 to reach `sys-remote` from the outside). For that, use `qubes.ConnectTCP` RPC service (see [Firewall](/doc/firewall). Then, you can use any `VNC` client to connect to you `sys-remote` on the chosen local port (5900 if you kept the default one). For the first connection, you will reach `lightdm` for which you can log as `user` where `user` refers to the first `dom0` user in `qubes` group and with corresponding `dom0` password.
-
-> Note: `lightdm` session remains logged even if you disconnect your `VNC` client. Ensure to lock or log out before disconnecting your `VNC` client session.
-
-> **WARNING**: This setup raises multiple security issues: 1) Anyone who can reach the `VNC` server, can take over the control of the Qubes OS machine, 2) A second client can connect even if a connection is already active and potentially get disconnected, 3) You can get disconnected by some unrelated network issues. Generally, if this `VNC` server is exposed to open network, it must be protected with some other (cryptographic) layer like `VPN`. The setup as is, is useful only for purely testing machine.
-
-
-### Troobleshooting
-
-#### Application menu lacks qubes entries in a fresh GuiVM
-
-See [QubesOS/qubes-issues#5804](https://github.com/QubesOS/qubes-issues/issues/5804)
-
-#### Delete GuiVM
-
-The following commands have to be run in `dom0`.
-
-> Note: For the case of `sys-gui-gpu`, you need to prevent Qubes OS autostart of any qube to reach `dom0`. For that, you need to boot Qubes OS with `qubes.skip_autostart` GRUB parameter.
-
-Set `default_guivm` as `dom0`:
-
-```bash
-qubes-prefs default_guivm dom0
-```
-
-and for every selected qubes not using default value for `guivm` property, for example with a qube `personal`:
-
-```bash
-qvm-prefs personal guivm dom0
-```
-
-You are now able to delete the GuiVM, for example `sys-gui-gpu`:
-
-```bash
-qvm-remove -y sys-gui-gpu
-```
-
-#### General issue
-
-For any general GuiVM issue, please take a loot at existing issues `QubesOS/qubes-issues` under [C: gui-domain](https://github.com/QubesOS/qubes-issues/issues?q=is%3Aopen+is%3Aissue+label%3A%22C%3A+gui-domain%22) label.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/how-to-install-software-in-dom0.md b/user/advanced-topics/how-to-install-software-in-dom0.md
index ddd7f869d..98ba6a7cb 100644
--- a/user/advanced-topics/how-to-install-software-in-dom0.md
+++ b/user/advanced-topics/how-to-install-software-in-dom0.md
@@ -7,248 +7,7 @@ redirect_from:
- /en/doc/software-update-dom0/
- /doc/SoftwareUpdateDom0/
- /wiki/SoftwareUpdateDom0/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/how-to-install-software-in-dom0.html
ref: 194
title: How to install software in dom0
----
-
-**Warning:** Installing software in dom0 is for advanced users only. Doing so
-has the potential to compromise your entire Qubes OS installation. Exercise
-extreme caution.
-
-## Security
-
-Since there is no networking in dom0, any bugs discovered in dom0 desktop
-components (e.g., the window manager) are unlikely to pose a problem for Qubes,
-since none of the third-party software running in dom0 is accessible from VMs
-or the network in any way. Nonetheless, since software running in dom0 can
-potentially exercise full control over the system, it is important to install
-only trusted software in dom0.
-
-The install/update process is split into two phases: *resolve and download* and
-*verify and install*. The *resolve and download* phase is handled by the
-UpdateVM. (The role of UpdateVM can be assigned to any VM in the Qube Manager,
-and there are no significant security implications in this choice. By default,
-this role is assigned to the FirewallVM.) After the UpdateVM has successfully
-downloaded new packages, they are sent to dom0, where they are verified and
-installed. This separation of duties significantly reduces the attack surface,
-since all of the network and metadata processing code is removed from the TCB.
-
-Although this update scheme is far more secure than directly downloading
-updates in dom0, it is not invulnerable. For example, there is nothing that the
-Qubes OS Project can feasibly do to prevent a malicious RPM from exploiting a
-hypothetical bug in the cryptographic signature verification operation. At
-best, we could switch to a different distro or package manager, but any of them
-could be vulnerable to the same (or a similar) attack. While we could, in
-theory, write a custom solution, it would only be effective if Qubes repos
-included all of the regular template distro's updates, and this would be far
-too costly for us to maintain.
-
-## How to update dom0
-
-See [How to Update](/doc/how-to-update/).
-
-## How to install a specific package
-
-To install additional packages in dom0 (usually not recommended):
-
-```
-$ sudo qubes-dom0-update anti-evil-maid
-```
-
-You may also pass the `--enablerepo=` option in order to enable optional
-repositories (see yum configuration in dom0). However, this is only for
-advanced users who really understand what they are doing. You can also pass
-commands to `dnf` using `--action=...`.
-
-## How to downgrade a specific package
-
-**WARNING:** Downgrading a package can expose your system to security
-vulnerabilities.
-
-1. Download an older version of the package:
-
- ~~~
- sudo qubes-dom0-update package-version
- ~~~
-
- Dnf will say that there is no update, but the package will nonetheless be
- downloaded to dom0.
-
-2. Downgrade the package:
-
- ~~~
- sudo dnf downgrade package-version
- ~~~
-
-## How to re-install a package
-
-You can re-install in a similar fashion to downgrading.
-
-1. Download the package:
-
- ~~~
- sudo qubes-dom0-update package
- ~~~
-
- Dnf will say that there is no update, but the package will nonetheless be
- downloaded to dom0.
-
-2. Re-install the package:
-
- ~~~
- sudo dnf reinstall package
- ~~~
-
- Note that `dnf` will only re-install if the installed and downloaded
- versions match. You can ensure they match by either updating the package to
- the latest version, or specifying the package version in the first step
- using the form `package-version`.
-
-## How to uninstall a package
-
-If you've installed a package such as anti-evil-maid, you can remove it with
-the following command:
-
-```
-sudo dnf remove anti-evil-maid
-```
-
-## Testing repositories
-
-If you wish to install updates that are still in [testing](/doc/testing), you
-must enable the appropriate testing repositories.
-
-**Note:** The following repos are in dom0. For template testing repos, see
-[here](/doc/how-to-install-software/#testing-repositories).
-
-- `qubes-dom0-current-testing` -- testing packages that will eventually land in
- the stable (`current`) repository
-- `qubes-dom0-security-testing` -- a subset of `qubes-dom0-current-testing`
- that contains packages that qualify as security fixes
-- `qubes-dom0-unstable` -- packages that are not intended to land in the stable
- (`qubes-dom0-current`) repository; mostly experimental debugging packages
-
-To temporarily enable any of these repos, use the `--enablerepo=`
-option. Example commands:
-
-~~~
-sudo qubes-dom0-update --enablerepo=qubes-dom0-current-testing
-sudo qubes-dom0-update --enablerepo=qubes-dom0-security-testing
-sudo qubes-dom0-update --enablerepo=qubes-dom0-unstable
-~~~
-
-To enable or disable any of these repos permanently, change the corresponding
-`enabled` value to `1` in `/etc/yum.repos.d/qubes-dom0.repo`.
-
-For testing new templates, please see [here](/doc/testing/#templates).
-
-## Contributed package repository
-
-Please see [installing contributed
-packages](/doc/installing-contributed-packages/).
-
-## Kernel upgrade
-
-This section describes upgrading the kernel in dom0 and domUs.
-
-### dom0
-
-The packages `kernel` and `kernel-latest` are for dom0.
-
-In the `current` repository:
-
-- `kernel`: an older LTS kernel that has passed Qubes [testing](/doc/testing/)
- (the default dom0 kernel)
-- `kernel-latest`: the latest release from kernel.org that has passed Qubes
- [testing](/doc/testing/) (useful for [troubleshooting newer
- hardware](/doc/newer-hardware-troubleshooting/))
-
-In the `current-testing` repository:
-
-- `kernel`: the latest LTS kernel from kernel.org at the time it was built.
-- `kernel-latest`: the latest release from kernel.org at the time it was built.
-
-### domU
-
-The packages `kernel-qubes-vm` and `kernel-latest-qubes-vm` are for domUs. See
-[Managing VM kernel](/doc/managing-vm-kernels/) for more information.
-
-### Example
-
-(Note that the following example enables the unstable repo.)
-
-~~~
-sudo qubes-dom0-update --enablerepo=qubes-dom0-unstable kernel kernel-qubes-vm
-~~~
-
-If the update process does not automatically do it (you should see it mentioned
-in the CLI output from the update command), you may need to manually rebuild
-the EFI or grub config depending on which your system uses.
-
-#### EFI
-
-Replace the example version numbers with the one you are upgrading to.
-
-~~~
-sudo dracut -f /boot/efi/EFI/qubes/initramfs-4.14.35-1.pvops.qubes.x86_64.img 4.14.35-1.pvops.qubes.x86_64
-~~~
-
-#### Grub2
-
-~~~
-sudo grub2-mkconfig -o /boot/grub2/grub.cfg
-~~~
-
-Reboot required.
-
-If you wish to upgrade to a kernel that is not available from the repos, then
-there is no easy way to do so, but [it may still be possible if you're willing
-to do a lot of work yourself](https://groups.google.com/d/msg/qubes-users/m8sWoyV58_E/HYdReRIYBAAJ).
-
-## Changing default kernel
-
-This section describes changing the default kernel in dom0. It is sometimes
-needed if you have upgraded to a newer kernel and are having problems booting,
-for example. The procedure varies depending on if you are booting with UEFI or
-grub. On the next kernel update, the default will revert to the newest.
-
-### EFI
-
-~~~
-sudo nano /boot/efi/EFI/qubes/xen.cfg
-~~~
-
-In the `[global]` section at the top, change the `default=` line to match one
-of the three boot entries listed below. For example:
-
-~~~
-default=4.19.67-1.pvops.qubes.x86_64
-~~~
-
-### Grub2
-
-~~~
-sudo nano /etc/default/grub
-[update the following two lines, add if needed]
-GRUB_DISABLE_SUBMENU=false
-GRUB_SAVEDEFAULT=true
-[save and exit nano]
-sudo grub2-mkconfig -o /boot/grub2/grub.cfg
-~~~
-
-Then, reboot. Once the grub menu appears, choose "Advanced Options for Qubes
-(with Xen hypervisor)". Next, the top menu item (for example, "Xen hypervisor,
-version 4.8.5-9.fc25"). Select the kernel you want as default, and it will be
-remembered for next boot.
-
-## Updating over Tor
-
-Requires installed [Whonix](/doc/privacy/whonix/).
-
-Go to Qubes VM Manager -> System -> Global Settings. See the UpdateVM setting.
-Choose your desired Whonix-Gateway ProxyVM from the list. For example:
-sys-whonix.
-
-```
-Qubes VM Manager -> System -> Global Settings -> UpdateVM -> sys-whonix
-```
+---
\ No newline at end of file
diff --git a/user/advanced-topics/i3.md b/user/advanced-topics/i3.md
index b326988d5..b1948e798 100644
--- a/user/advanced-topics/i3.md
+++ b/user/advanced-topics/i3.md
@@ -6,103 +6,7 @@ redirect_from:
- /en/doc/i3/
- /doc/UserDoc/i3/
- /wiki/UserDoc/i3/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/i3.html
ref: 183
title: i3 (window manager)
----
-
-i3 is part of the stable repository (as of Qubes R3.1) and can be installed by
-using the [dom0 update mechanism](/doc/how-to-install-software-in-dom0/). To install the i3
-window manager and the its Qubes specific configuration:
-
-```shell_session
-$ sudo qubes-dom0-update i3 i3-settings-qubes
-```
-
-The Qubes-specific configuration (package `i3-settings-qubes`) can be installed
-optionally in case you would prefer writing your own configuration (see
-[customization](#customization) section for scripts and configuration).
-
-That's it. After logging out, you can select i3 in the login manager.
-
-### Customization
-
-**Caution:** The following external resources may not have been reviewed by the Qubes team.
-
-* [xdg_autostart_script](https://gist.github.com/SietsevanderMolen/7b4cc32ce7b4884513b0a639540e454f)
-* [i3bar_script](https://gist.github.com/SietsevanderMolen/e7f594f209dfaa3596907e427b657e30)
-* [terminal_start_script](https://gist.github.com/SietsevanderMolen/7c6f2b5773dbc0c08e1509e49abd1e96)
-* [i3 config with dmenu-i3-window-jumper](https://github.com/anadahz/qubes-i3-config/blob/master/config)
-* [dmenu script to open a terminal in a chosen VM](https://gist.github.com/dmoerner/65528941dd20b05c98ee79e92d7e0183)
-
-## Compilation and installation from source
-
-Note that the compilation from source is done in a Fedora based domU (could
-be dispvm). The end result is always an `.rpm` that is copied to dom0 and then
-installed through the package manager.
-
-### Getting the code
-
-Clone the i3-qubes repository here:
-
-```shell_session
-$ git clone https://github.com/QubesOS/qubes-desktop-linux-i3
-```
-
-In this case, the most interesting file is probably
-`i3/0001-Show-qubes-domain-in-non-optional-colored-borders.patch` It's the patch
-with changes that are necessary to make i3 work nicely with Qubes OS. The code
-should not need much explanation, it just gets the vmname and label from Qubes
-OS and changes some defaults so the user can't override decisions.
-
-If you want to make any changes to the package, this is the time and place to do
-it.
-
-### Building
-
-You'll need to install the build dependencies, which are listed in
-build-deps.list. You can verify them and then install them with:
-
-```shell_session
-$ sudo dnf install -y $(cat build-deps.list)
-```
-
-This used to be more complicated, but I finally redid this and use the same
-buildsystem that's used by Qubes OS for XFCE. It's just a Makefile that helps
-you get the sources and start off the build:
-
-```shell_session
-$ make get-sources
-$ make verify-sources
-$ make rpms
-```
-
-### Installing
-
-**Warning**: Manually installing software in dom0 is inherently risky, and the method described here circumvents the usual security mechanisms of qubes-dom0-update.
-
-You should now have your i3 rpm in `./rpm/x86_64/i3-4.8-3.fc20.x86_64.rpm`.
-Protip: copying this file to `~/i3.rpm` now will save you some typing in the
-next step.
-
-Now in dom0, copy in the rpm:
-
-```shell_session
-$ qvm-run --pass-io 'cat ' > i3.rpm
-```
-
-Now that the rpm is in dom0 we can proceed with installing it. i3 has some
-dependencies that we can easily install with:
-
-```shell_session
-$ sudo qubes-dom0-update perl-AnyEvent-I3 xorg-x11-apps \\
- rxvt-unicode xcb-util-wm perl-JSON-XS xcb-util-cursor \\
- dzen2 dmenu xorg-x11-fonts-misc libev
-```
-
-After that you can just install the generated rpm like any other local package:
-
-```shell_session
-$ sudo yum localinstall i3.rpm
-```
-
-Log out, select i3, then log in again.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/installing-contributed-packages.md b/user/advanced-topics/installing-contributed-packages.md
index 78a8da851..ab883bc92 100644
--- a/user/advanced-topics/installing-contributed-packages.md
+++ b/user/advanced-topics/installing-contributed-packages.md
@@ -2,55 +2,7 @@
lang: en
layout: doc
permalink: /doc/installing-contributed-packages/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/installing-contributed-packages.html
ref: 225
title: Installing contributed packages
----
-
-_This page is for users who wish to install contributed packages.
-If you want to contribute a package, please see [package contributions](/doc/package-contributions/)._
-
-Qubes OS contributed packages are available under the [QubesOS-contrib](https://github.com/QubesOS-contrib/) GitHub Project.
-This is a place where our community can [contribute Qubes OS related packages, additions and various customizations](/doc/package-contributions/).
-
-## Installing the repositories
-
-If you want to install one of these packages, first you need to enable the repository in your system (dom0 and/or templates). This can be done by installing the `qubes-repo-contrib` package. This package includes the repository definition and keys necessary to download, verify, and install [QubesOS-contrib](https://github.com/QubesOS-contrib/) packages.
-
-In dom0, use `qubes-dom0-update`:
-
-```bash_session
-sudo qubes-dom0-update qubes-repo-contrib
-```
-
-In a Fedora-based template, use `dnf`:
-
-```bash_session
-sudo dnf install qubes-repo-contrib
-```
-
-In a Debian-based template, use `apt`:
-
-```bash_session
-sudo apt update && sudo apt install qubes-repo-contrib
-```
-
-The new repository definition will be in the usual location for your distro, and it will follow the naming pattern `qubes-contrib-*`, depending on your Qubes release and whether it is in dom0 or a template.
-For example, in a Fedora template on Qubes 4.0, the new repository definition would be:
-
-```
-/etc/yum.repos.d/qubes-contrib-vm-r4.0.repo
-```
-
-## Installing packages
-
-After you've installed the repositories, you can install contributed packages.
-
-**Note:** The first time you install a contrib package in dom0, you must use the `--clean` flag.
-
-For example, to install `qvm-screenshot-tool` in dom0:
-
-```bash_session
-sudo qubes-dom0-update --clean qvm-screenshot-tool
-```
-
-Please see the package's README for specific installation and setup instructions.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/kde.md b/user/advanced-topics/kde.md
index 5d350b060..23f428fab 100644
--- a/user/advanced-topics/kde.md
+++ b/user/advanced-topics/kde.md
@@ -4,87 +4,7 @@ layout: doc
permalink: /doc/kde/
redirect_from:
- /en/doc/kde/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/kde.html
ref: 176
title: KDE (desktop environment)
----
-
-Installation
-------------
-
-Prior to R3.2, KDE was the default desktop environment in Qubes. Beginning with
-R3.2, however, [XFCE is the new default desktop environment](/doc/releases/3.2/release-notes/). Nonetheless, it is
-still possible to install KDE by issuing this command in dom0:
-
-```shell_session
-$ sudo qubes-dom0-update @kde-desktop-qubes
-```
-
-You can also change your default login manager (lightdm) to the new KDE default: sddm
-
-* first you need to edit the `/etc/sddm.conf` to make sure if the custom X parameter is set according to Qubes needs:
-
- ~~~
- [XDisplay]
- ServerArguments=-nolisten tcp -background none
- ~~~
-
-* disable the lightdm service:
-
- ~~~
- $ sudo systemctl disable lightdm
- ~~~
-
-* enable the sddm service:
-
- ~~~
- $ sudo systemctl enable sddm
- ~~~
-
-* reboot
-
-If you encounter performance issues with KDE, try switching back to LightDM.
-
-Window Management
------------------
-
-You can set each window's position and size like this:
-
-~~~
-Right click title bar --> More actions --> Special window settings...
-
- Window matching tab
- Window class (application): Exact Match:
- Window title: Substring Match:
-
- Size & Position tab
- [x] Position: Apply Initially: x,y
- [x] Size: Apply Initially: x,y
-~~~
-
-You can also use `kstart` to control virtual desktop placement like this:
-
-~~~
- kstart --desktop 3 --windowclass -q --tray -a ''
-~~~
-
-(Replace "3" with whichever virtual desktop you want the window to be
-on.)
-
-This can be useful for creating a simple shell script which will set up your
-workspace the way you like.
-
-Removal
-------------
-
-If you decide to remove KDE do **not** use `dnf remove @kde-desktop-qubes`. You will almost certainly break your system.
-
-The safest way to remove (most of) KDE is:
-
-~~~
-sudo dnf remove kdelibs plasma-workspace
-~~~
-
-Mailing List Threads
---------------------
-
-* [Nalu's KDE customization thread](https://groups.google.com/d/topic/qubes-users/KhfzF19NG1s/discussion)
+---
\ No newline at end of file
diff --git a/user/advanced-topics/managing-vm-kernels.md b/user/advanced-topics/managing-vm-kernels.md
index 903151ad2..f17bec319 100644
--- a/user/advanced-topics/managing-vm-kernels.md
+++ b/user/advanced-topics/managing-vm-kernels.md
@@ -5,369 +5,7 @@ permalink: /doc/managing-vm-kernels/
redirect_from:
- /doc/managing-vm-kernel/
- /en/doc/managing-vm-kernel/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/managing-vm-kernels.html
ref: 173
title: Managing qube kernels
----
-
-By default, VMs kernels are provided by dom0.
-(See [here](/doc/how-to-install-software-in-dom0/#kernel-upgrade) for information about upgrading kernels in dom0.)
-This means that:
-
-1. You can select the kernel version (using GUI VM Settings tool or `qvm-prefs` commandline tool);
-2. You can modify kernel options (using `qvm-prefs` commandline tool);
-3. You can **not** modify any of the above from inside a VM;
-4. Installing additional kernel modules is cumbersome.
-
-*Note* In the examples below, although the specific version numbers might be old, the commands have been verified on R3.2 and R4.0 with debian-9 and fedora-26 templates.
-
-To select which kernel a given VM will use, you can either use Qubes Manager (VM settings, advanced tab), or the `qvm-prefs` tool:
-
-~~~
-[user@dom0 ~]$ qvm-prefs -s my-appvm kernel
-Missing kernel version argument!
-Possible values:
-1) default
-2) none (kernels subdir in VM)
-3) , one of:
- - 3.18.16-3
- - 3.18.17-4
- - 3.19.fc20
- - 3.18.10-2
-[user@dom0 ~]$ qvm-prefs -s my-appvm kernel 3.18.17-4
-[user@dom0 ~]$ qvm-prefs -s my-appvm kernel default
-~~~
-
-To check/change the default kernel you can either go to "Global settings" in Qubes Manager, or use the `qubes-prefs` tool:
-
-~~~
-[user@dom0 ~]$ qubes-prefs
-clockvm : sys-net
-default-fw-netvm : sys-net
-default-kernel : 3.18.17-4
-default-netvm : sys-firewall
-default-template : fedora-21
-updatevm : sys-firewall
-[user@dom0 ~]$ qubes-prefs -s default-kernel 3.19.fc20
-~~~
-
-To view kernel options, you can use the GUI VM Settings tool; to view and change them, use `qvm-prefs` commandline tool:
-
-~~~
-[user@dom0 ~]$ qvm-prefs -g work kernelopts
-nopat
-[user@dom0 ~]$ qvm-prefs -s work kernelopts "nopat apparmor=1 security=apparmor"
-~~~
-
-## Installing different kernel using Qubes kernel package
-
-VM kernels are packages by Qubes team in `kernel-qubes-vm` packages.
-Generally, the system will keep the three newest available versions.
-You can list them with the `rpm` command:
-
-~~~
-[user@dom0 ~]$ rpm -qa 'kernel-qubes-vm*'
-kernel-qubes-vm-3.18.10-2.pvops.qubes.x86_64
-kernel-qubes-vm-3.18.16-3.pvops.qubes.x86_64
-kernel-qubes-vm-3.18.17-4.pvops.qubes.x86_64
-~~~
-
-If you want a more recent version, you can check the `qubes-dom0-unstable` repository.
-There is also the `kernel-latest-qubes-vm` package which should provide a more recent (non-LTS) kernel, but has received much less testing.
-As the names suggest, keep in mind that those packages may be less stable than the default ones.
-
-To check available versions in the `qubes-dom0-unstable` repository:
-
-~~~
-[user@dom0 ~]$ sudo qubes-dom0-update --enablerepo=qubes-dom0-unstable --action=list kernel-qubes-vm
-Using sys-firewall as UpdateVM to download updates for Dom0; this may take some time...
-Running command on VM: 'sys-firewall'...
-Loaded plugins: langpacks, post-transaction-actions, yum-qubes-hooks
-Installed Packages
-kernel-qubes-vm.x86_64 1000:3.18.10-2.pvops.qubes installed
-kernel-qubes-vm.x86_64 1000:3.18.16-3.pvops.qubes installed
-kernel-qubes-vm.x86_64 1000:3.18.17-4.pvops.qubes installed
-Available Packages
-kernel-qubes-vm.x86_64 1000:4.1.12-6.pvops.qubes qubes-dom0-unstable
-No packages downloaded
-Installed Packages
-kernel-qubes-vm.x86_64 1000:3.18.10-2.pvops.qubes @anaconda/R3.0
-kernel-qubes-vm.x86_64 1000:3.18.16-3.pvops.qubes @/kernel-qubes-vm-3.18.16-3.pvops.qubes.x86_64
-kernel-qubes-vm.x86_64 1000:3.18.17-4.pvops.qubes @qubes-dom0-cached
-
-~~~
-
-Installing a new version from `qubes-dom0-unstable` repository:
-
-~~~
-[user@dom0 ~]$ sudo qubes-dom0-update --enablerepo=qubes-dom0-unstable kernel-qubes-vm
-Using sys-firewall as UpdateVM to download updates for Dom0; this may take some time...
-Running command on VM: 'sys-firewall'...
-Loaded plugins: langpacks, post-transaction-actions, yum-qubes-hooks
-Resolving Dependencies
-(...)
-
-===========================================================================================
- Package Arch Version Repository Size
-===========================================================================================
-Installing:
- kernel-qubes-vm x86_64 1000:4.1.12-6.pvops.qubes qubes-dom0-cached 40 M
-Removing:
- kernel-qubes-vm x86_64 1000:3.18.10-2.pvops.qubes @anaconda/R3.0 134 M
-
-Transaction Summary
-===========================================================================================
-Install 1 Package
-Remove 1 Package
-
-Total download size: 40 M
-Is this ok [y/d/N]: y
-Downloading packages:
-Running transaction check
-Running transaction test
-Transaction test succeeded
-Running transaction (shutdown inhibited)
- Installing : 1000:kernel-qubes-vm-4.1.12-6.pvops.qubes.x86_64 1/2
-mke2fs 1.42.12 (29-Aug-2014)
-This kernel version is used by at least one VM, cannot remove
-error: %preun(kernel-qubes-vm-1000:3.18.10-2.pvops.qubes.x86_64) scriptlet failed, exit status 1
-Error in PREUN scriptlet in rpm package 1000:kernel-qubes-vm-3.18.10-2.pvops.qubes.x86_64
- Verifying : 1000:kernel-qubes-vm-4.1.12-6.pvops.qubes.x86_64 1/2
- Verifying : 1000:kernel-qubes-vm-3.18.10-2.pvops.qubes.x86_64 2/2
-
-Installed:
- kernel-qubes-vm.x86_64 1000:4.1.12-6.pvops.qubes
-
-Failed:
- kernel-qubes-vm.x86_64 1000:3.18.10-2.pvops.qubes
-
-Complete!
-[user@dom0 ~]$
-~~~
-
-In the above example, it tries to remove the 3.18.10-2.pvops.qubes kernel (to keep only three installed), but since some VM uses it, it fails.
-Installation of the new package is unaffected by this event.
-
-The newly installed package is set as the default VM kernel.
-
-## Installing different VM kernel based on dom0 kernel
-
-It is possible to package a kernel installed in dom0 as a VM kernel.
-This makes it possible to use a VM kernel which is not packaged by Qubes team.
-This includes:
- * using a Fedora kernel package
- * using a manually compiled kernel
-
-To prepare such a VM kernel, you need to install the `qubes-kernel-vm-support` package in dom0 and also have matching kernel headers installed (`kernel-devel` package in the case of a Fedora kernel package).
-You can install requirements using `qubes-dom0-update`:
-
-~~~
-[user@dom0 ~]$ sudo qubes-dom0-update qubes-kernel-vm-support kernel-devel
-Using sys-firewall as UpdateVM to download updates for Dom0; this may take some time...
-Running command on VM: 'sys-firewall'...
-Loaded plugins: langpacks, post-transaction-actions, yum-qubes-hooks
-Package 1000:kernel-devel-4.1.9-6.pvops.qubes.x86_64 already installed and latest version
-Resolving Dependencies
-(...)
-
-================================================================================
- Package Arch Version Repository Size
-================================================================================
-Installing:
- qubes-kernel-vm-support x86_64 3.1.2-1.fc20 qubes-dom0-cached 9.2 k
-
-Transaction Summary
-================================================================================
-Install 1 Package
-
-Total download size: 9.2 k
-Installed size: 13 k
-Is this ok [y/d/N]: y
-Downloading packages:
-Running transaction check
-Running transaction test
-Transaction test succeeded
-Running transaction (shutdown inhibited)
- Installing : qubes-kernel-vm-support-3.1.2-1.fc20.x86_64 1/1
-
-Creating symlink /var/lib/dkms/u2mfn/3.1.2/source ->
- /usr/src/u2mfn-3.1.2
-
-DKMS: add completed.
- Verifying : qubes-kernel-vm-support-3.1.2-1.fc20.x86_64 1/1
-
-Installed:
- qubes-kernel-vm-support.x86_64 0:3.1.2-1.fc20
-
-Complete!
-~~~
-
-Then you can call the `qubes-prepare-vm-kernel` tool to actually package the kernel.
-The first parameter is kernel version (exactly as seen by the kernel), the second one (optional) is short name.
-This is visible in Qubes Manager and the `qvm-prefs` tool.
-
-~~~
-[user@dom0 ~]$ sudo qubes-prepare-vm-kernel 4.1.9-6.pvops.qubes.x86_64 4.1.qubes
---> Building files for 4.1.9-6.pvops.qubes.x86_64 in /var/lib/qubes/vm-kernels/4.1.qubes
----> Recompiling kernel module (u2mfn)
----> Generating modules.img
-mke2fs 1.42.12 (29-Aug-2014)
----> Generating initramfs
---> Done.
-~~~
-
-## Kernel files structure
-
-Kernel for a VM is stored in `/var/lib/qubes/vm-kernels/KERNEL_VERSION` directory (`KERNEL_VERSION` replaced with actual version). Qubes 4.x supports the following files there:
-
-* `vmlinuz` - kernel binary (may not be a Linux kernel)
-* `initramfs` - initramfs for the kernel to load
-* `modules.img` - ext4 filesystem image containing Linux kernel modules (to be mounted at `/lib/modules`); additionally it should contain a copy of `vmlinuz` and `initramfs` in its root directory (for loading by qemu inside stubdomain)
-* `default-kernelopts-common.txt` - default kernel options, in addition to those specified with `kernelopts` qube property (can be disabled with `no-default-kernelopts` feature)
-
-All the files besides `vmlinuz` are optional in Qubes R4.1 or newer. In Qubes R4.0, `vmlinuz` and `initramfs` are both required to be present.
-
-## Using kernel installed in the VM
-
-Both debian-9 and fedora-26 templates already have grub and related tools preinstalled so if you want to use one of the distribution kernels, all you need to do is clone either template to a new one, then:
-
-~~~
-qvm-prefs virt_mode hvm
-qvm-prefs kernel ''
-~~~
-
-If you'd like to use a different kernel than default, continue reading.
-
-### Installing kernel in Fedora VM
-
-Install whatever kernel you want.
-You need to also ensure you have the `kernel-devel` package for the same kernel version installed.
-
-If you are using a distribution kernel package (`kernel` package), the initramfs and kernel modules may be handled automatically.
-If you are using a manually built kernel, you need to handle this on your own.
-Take a look at the `dkms` documentation, especially the `dkms autoinstall` command may be useful.
-If you did not see the `kernel` install rebuild your initramfs, or are using a manually built kernel, you will need to rebuild it yourself.
-Replace the version numbers in the example below with the ones appropriate to the kernel you are installing:
-
-~~~
-sudo dracut -f /boot/initramfs-4.15.14-200.fc26.x86_64.img 4.15.14-200.fc26.x86_64
-~~~
-
-Once the kernel is installed, you need to setup `grub2` by running:
-
-~~~
-sudo grub2-install /dev/xvda
-~~~
-
-Finally, you need to create a GRUB configuration.
-You may want to adjust some settings in `/etc/default/grub`; for example, lower `GRUB_TIMEOUT` to speed up VM startup.
-Then, you need to generate the actual configuration.
-In Fedora it can be done using the `grub2-mkconfig` tool:
-
-~~~
-sudo grub2-mkconfig -o /boot/grub2/grub.cfg
-~~~
-
-You can safely ignore this error message:
-
-~~~
-grub2-probe: error: cannot find a GRUB drive for /dev/mapper/dmroot. Check your device.map
-~~~
-
-Then shutdown the VM.
-
-**Note:** You may also use `PV` mode instead of `HVM` but this is not recommended for security purposes.
-If you require `PV` mode, install `grub2-xen` in dom0 and change the template's kernel to `pvgrub2`.
-Booting to a kernel inside the template is not supported under `PVH`.
-
-### Installing kernel in Debian VM
-
-#### Distribution kernel
-
-Apply the following instruction in a Debian template or in a Debian standalone.
-
-Using a distribution kernel package the initramfs and kernel modules should be handled automatically.
-
-Install distribution kernel image, kernel headers and the grub.
-
-~~~
-sudo apt install linux-image-amd64 linux-headers-amd64 grub2 qubes-kernel-vm-support
-~~~
-
-If you are doing that on a qube based on "Debian Minimal" template, a grub gui will popup during the installation, asking you where you want to install the grub loader. You must select /dev/xvda (check the box using the space bar, and validate your choice with "Enter".) If this popup does not appear during the installation, you must manually setup `grub2` by running:
-
-~~~
-sudo grub-install /dev/xvda
-~~~
-
-You can safely ignore this error message:
-`grub2-probe: error: cannot find a GRUB drive for /dev/mapper/dmroot. Check your device.map`
-
-You may want to adjust some settings in `/etc/default/grub` (or better `/etc/default/grub.d`). For example, lower `GRUB_TIMEOUT` to speed up VM startup. You need to re-run `sudo update-grub` after making grub configuration changes.
-
-Then shutdown the VM.
-
-Go to dom0 -> Qubes VM Manger -> right click on the VM -> Qube settings -> Advanced
-
-Depends on `Virtualization` mode setting:
-
-* `Virtualization` mode `PV`: Possible, however use of `Virtualization` mode `PV` mode is discouraged for security purposes.
- * If you require `Virtualization` mode `PV` mode, install `grub2-xen` in dom0. This can be done by running command `sudo qubes-dom0-update grub2-xen` in dom0.
-* `Virtualization` mode `PVH`: Possible.
-* `Virtualization` mode `HVM`: Possible.
-
-The `Kernel` setting of the `Virtualization` mode setting:
-
-* If `Virtualization` is set to `PVH` -> `Kernel` -> choose `pvgrub2-pvh` -> OK
-* If `Virtualization` is set to `PV` -> `Kernel` -> choose `pvgrub2` -> OK
-* If `Virtualization` is set to `HVM` -> `Kernel` -> choose `none` -> OK
-
-Start the VM.
-
-The process of using Qubes VM kernel with distribution kernel is complete.
-
-#### Custom kernel
-
-Any kernel can be installed. Just make sure to install kernel headers as well.
-
-If you are building the kernel manually, do this using `dkms` and `initramfs-tools`.
-
-Run DKMS. Replace this with actual kernel version.
-
-```bash_session
-sudo dkms autoinstall -k
-```
-
-For example.
-
-```bash_session
-sudo dkms autoinstall -k 4.19.0-6-amd64
-```
-
-Update initramfs.
-
-```bash_session
-sudo update-initramfs -u
-```
-
-The output should look like this:
-
-```shell_session
-$ sudo dkms autoinstall -k 3.16.0-4-amd64
-
-u2mfn:
-Running module version sanity check.
- - Original module
- - No original module exists within this kernel
- - Installation
- - Installing to /lib/modules/3.16.0-4-amd64/updates/dkms/
-
-depmod....
-
- DKMS: install completed.
-$ sudo update-initramfs -u
-update-initramfs: Generating /boot/initrd.img-3.16.0-4-amd64
-```
-
-#### Troubleshooting
-
-In case of problems, visit the [VM Troubleshooting guide](/doc/vm-troubleshooting/#vm-kernel-troubleshooting) to learn how to access the VM console, view logs and fix a VM kernel installation.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/mount-from-other-os.md b/user/advanced-topics/mount-from-other-os.md
index 864416661..9c248c8a6 100644
--- a/user/advanced-topics/mount-from-other-os.md
+++ b/user/advanced-topics/mount-from-other-os.md
@@ -6,91 +6,7 @@ redirect_from:
- /en/doc/mount-from-other-os/
- /doc/MountFromOtherOs/
- /wiki/MountFromOtherOs/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/mount-from-other-os.html
ref: 175
title: How to mount a Qubes partition from another OS
----
-
-When a Qubes OS install is unbootable or booting it is otherwise undesirable, this process allows for the recovery of files stored within the system.
-
-These functions are manual and do not require any Qubes specific tools. All steps assume the default Qubes install with the following components:
-- LUKS encrypted disk
-- LVM based VM storage
-
-Before beginning, if attempting to access one Qubes system from another, it is recommended to pass the entire encrypted Qubes disk to an isolated app qube.
-This can be done with the command `qvm-block attach dom0:` in dom0.
-
-Decrypting the Disk
------------------
-
-1. Find the disk to be accessed:
- 1. Open a Linux terminal in either dom0 or the app qube the disk was passed through to and enter `lsblk`, which will result in an output similar to the following.
- In this example, the currently booted Qubes system is installed on `sda` and the qubes system to be accessed is on `nvme0n1p2`.
-
- ```
- sda 8:0 0 111.8G 0 disk
- ├─sda1 8:1 0 200M 0 part /boot/efi
- ├─sda2 8:2 0 1G 0 part /boot
- └─sda3 8:3 0 110.6G 0 part
- └─luks-fed62fc2-2674-266d-2667-2667259cbdec 253:0 0 110.6G 0 crypt
- ├─qubes_dom0-pool00_tmeta 253:1 0 88M 0 lvm
- │ └─qubes_dom0-pool00-tpool 253:3 0 84.4G 0 lvm
- │ ├─qubes_dom0-root 253:4 0 84.4G 0 lvm /
- │ ├─qubes_dom0-pool00 253:6 0 84.4G 0 lvm
- ├─qubes_dom0-vm--fedora--30--dvm--private--1576749131--back 253:7 0 2G 0 lvm
- ├─qubes_dom0-pool00_tdata 253:2 0 84.4G 0 lvm
- │ └─qubes_dom0-pool00-tpool 253:3 0 84.4G 0 lvm
- │ ├─qubes_dom0-root 253:4 0 84.4G 0 lvm /
- │ ├─qubes_dom0-pool00 253:6 0 84.4G 0 lvm
- │ ├─qubes_dom0-vm--fedora--30--dvm--private--1576749131--back 253:7 0 2G 0 lvm
- └─qubes_dom0-swap 253:5 0 4G 0 lvm [SWAP]
- sdb 8:16 0 447.1G 0 disk
- ├─sdb1 8:17 0 549M 0 part
- └─sdb2 8:18 0 446.6G 0 part
- sr0 11:0 1 1024M 0 rom
- nvme0n1 259:0 0 465.8G 0 disk
- ├─nvme0n1p1 259:1 0 1G 0 part
- └─nvme0n1p2 259:2 0 464.8G 0 part
- ```
-
-2. Decrypt the disk using the command `cryptsetup luksOpen /dev/`.
-
-Accessing LVM Logical Volumes
------------------------------
-
-3. If using an app qube or standard Linux, LVM should automatically discover the Qubes LVM configuration. In this case, continue to step 4.
- 1. Qubes uses the default name `qubes_dom0` for it's LVM VG.
- This will conflict with the name of the VG of the currently installed system.
- To read both, you will have to rename the VG.
- *Note:* If this is not reversed, the Qubes install being accessed will not be bootable.
- 2. Find the UUID of the vg to be accessed using the command `vgdisplay`.
- This will be the VG named `qubes_dom0` which is not marked active.
- 3. The command `vgrename other_install` will rename the VG.
-4. Run the command `vgscan` to add any new VGs to the device list.
-
-Mounting the disk
------------------
-
-5. Find the disk to be accessed. The `lsblk` command above may be of use. The following rules apply by default:
-
-| Disk name | Data type | Explanation |
-| ----------------------------- | ----------------- | ------------------------------------------- |
-| other\_install/root | dom0 root | The root partition of dom0. |
-| other\_install/-private | VM | The /rw partition of the named VM. |
-| other\_install/-root | template root | The root partition of the named template. |
-| other\_install/pool00\_tmeta | LVM Metadata | The metadata LV of this disk. |
-
-6. Mount the disk using the command `mount /dev/other_install/`.
- *Note:* Any compromised data which exists in the volume to be mounted will be accessible here.
- Do not mount untrusted partitions in dom0.
-
-At this point, all files are available in the chosen mountpoint.
-
-Reverting Changes
------------------------------------------
-
-Any changes which were made to the system in the above steps will need to be reverted before the disk will properly boot.
-However, LVM will not allow an VG to be renamed to a name already in use.
-Thes steps must occur either in an app qube or using recovery media.
-
-1. Unmount any disks that were accessed.
-2. Rename the VG back to qubes\_dom0 using the command `vgrename other_install qubes_dom0`.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/qubes-service.md b/user/advanced-topics/qubes-service.md
index d62a16c66..6eac70251 100644
--- a/user/advanced-topics/qubes-service.md
+++ b/user/advanced-topics/qubes-service.md
@@ -6,20 +6,7 @@ redirect_from:
- /en/doc/qubes-service/
- /doc/QubesService/
- /wiki/QubesService/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/qubes-service.html
ref: 138
title: Qubes service
----
-
-Usage documentation is in the `qvm-service` man page. There are also described predefined services.
-
-Under the hood, an enabled service in a VM is signaled by a file in `/var/run/qubes-service`.
-This can be used to implement an almost enable/disable **per-VM** switch controlled by dom0.
-
-Adding support for systemd services is pretty simple. In the VM, create the following file (and directory, if needed): `/etc/systemd/system/.service.d/30_qubes.conf`. It should contain the following:
-
-~~~
-[Unit]
-ConditionPathExists=/var/run/qubes-service/
-~~~
-
-This will cause the service to be started only when you enable it with `qvm-service` for this VM.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/resize-disk-image.md b/user/advanced-topics/resize-disk-image.md
index b7805bd23..dd074d0a7 100644
--- a/user/advanced-topics/resize-disk-image.md
+++ b/user/advanced-topics/resize-disk-image.md
@@ -9,101 +9,7 @@ redirect_from:
- /doc/ResizeRootDiskImage/
- /wiki/ResizeDiskImage/
- /wiki/ResizeRootDiskImage/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/resize-disk-image.html
ref: 182
title: Resize disk image
----
-
-## Resizing Disk Images
-
-By default Qubes uses thin volumes for the disk images.
-This means that space is not actually allocated for the volume until it is used.
-So a 2GB private volume with 100M of files will only use 100M.
-This explains how you can have *many* qubes with large private volumes on quite a small disk.
-This is called over provisioning.
-You should keep an eye on the disk-space widget to see how much free space you actually have.
-
-It is easy to increase the size of disk images.
-There are risks attached to reducing the size of an image, and in general you should not need to do this.
-
-## Increasing the size of Disk Images
-
-There are several disk images which can be easily extended, but pay attention to the overall consumed space of your sparse/thin disk images.
-In most cases, the GUI tool Qube Settings (available for every qube from the Start menu, and also in the Qube Manager) will allow you to easily increase maximum disk image size.
-
-
-
-In case of standalone qubes and templates, just change the Disk Storage settings above.
-In case of template-based qubes, the private storage (the /home directory and user files) can be changed in the qube's own settings, but the system root image is [inherited from the template](/doc/getting-started/), and so it must be changed in the template settings.
-If you are increasing the disk image size for Linux-based qubes installed from Qubes OS repositories in Qubes 4.0 or later, changing the settings above is all you need to do - in other cases, you may need to do more, according to instructions below.
-See also the OS-specific follow-up instructions below.
-
-### Increasing the size of Disk Images
-
-Use either GUI tool Qube Settings (`qubes-vm-settings`) or the CLI tool `qvm-volume`.
-Maximum size which can be assigned through Qube Settings is 1048576 MiB - if you need more, use `qvm-volume`:
-
-~~~
-qvm-volume extend :root
-~~~
-
-OR
-
-~~~
-qvm-volume extend :private
-~~~
-
-Note: Size is the target size (i.e. 4096MB or 16GB, ...), not the size to add to the existing disk.
-
-If you have run out of space for software in your Template, you need to increase *root image* of the Template (not private storage!).
-**Make sure changes in the Template between reboots don't exceed 10G.**
-It is recommended that you restart (or start and then shutdown, if it is not running) the template after resizing the root image.
-
-If you are **not** using Linux in the qube, you will also need to:
-
-1. Start the template.
-2. Resize the filesystem using OS appropriate tools.
-3. Verify available space in the template using `df -h` or OS specific tools.
-4. Shutdown the template.
-
-#### Windows 7
-
-1. Click Start
-2. type "diskmgmt.msc" - this takes you to Disk Management
-3. Right-click on your existing volume, select "Extend Volume..."
-4. Click through the wizard.
-
-No reboot required.
-
-#### FreeBSD
-
-~~~
-gpart recover ada0
-sysctl kern.geom.debugflags=0x10
-gpart resize -i index ada0
-zpool online -e poolname ada0
-~~~
-
-#### Linux
-
-Qubes will automatically grow the filesystem for you on all app qubes with Qubes packages installed (which are all app qubes installed from templates, cloned from templates etc. - if you have not created an empty HVM and installed a Linux distribution in it, without using Qubes repositories, you are almost certainly safe).
-Otherwise, you will see that there is unallocated free space at the end of your primary disk.
-You can use standard linux tools like `fdisk` and `resize2fs` to make this space available.
-
-## Decreasing the size of Disk Images
-
-The number shown for "storage max size" does not mean that the storage is really using that amount. In most cases you need not worry about the size shown.
-If you have increased the max size, and do not need it, then you *can* reduce the allocated size, but there is a risk of data loss.
-Remember you really dont need to do this.
-
-You can create a new qube, copy your files in to the new qube, and delete the old qube. (Simple and effective.)
-
-Or you can take the risk of reducing the size of the disk.
-For example, to reduce the private storage of qube1 to 1GiB:
-Open a terminal in dom0:
-
-```
-qvm-shutdown qube1
-sudo lvresize --size 1024M /dev/qubes_dom0/vm-qube1-private
-```
-
-If you have a SSD see [here](/doc/disk-trim) for information on using fstrim.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/rpc-policy.md b/user/advanced-topics/rpc-policy.md
index 53cf01e40..59e257bdc 100644
--- a/user/advanced-topics/rpc-policy.md
+++ b/user/advanced-topics/rpc-policy.md
@@ -2,69 +2,7 @@
lang: en
layout: doc
permalink: /doc/rpc-policy/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/rpc-policy.html
ref: 178
title: RPC policies
----
-
-_Qubes OS 4.1 introduced a new qrexec policy system and policy format. Please see [this article](/news/2020/06/22/new-qrexec-policy-system/) for details._
-
-This document explains the basics of RPC policies in Qubes.
-For more information, see [Qrexec: command execution in VMs](/doc/qrexec3/).
-
-Here's an example of an RPC policy file in dom0:
-
-```
-[user@dom0 user ~]$ cat /etc/qubes-rpc/policy/qubes.FileCopy
-(...)
-@tag:work @default ask
-@tag:work @tag:work allow
-@tag:work @anyvm deny
-@anyvm @tag:work deny
-@anyvm @anyvm ask
-```
-
-It has three columns (from left to right): source, destination, and permission.
-Each row is a rule.
-For example, the second row says that we're **allowed** (third column) to copy a file (since this is the policy file for `qubes.FileCopy`) **from** (first column) any VM tagged with "work" **to** (second column) any VM tagged with "work".
-In other words, all the VMs tagged with "work" are allowed to copy files to each other without any prompts.
-(If the third column were "ask" instead of "allow", there would be prompts.
-I.e., we would be **asked** to approve the action, instead of it always being **allowed**.)
-
-Now, the whole policy file is parsed from top to bottom.
-As soon as a rule is found that matches the action being evaluated, parsing stops.
-We can see what this means by looking at the third row.
-It says that we're **denied** from attempting to copy a file **from** any VM tagged with "work" **to** any VM whatsoever.
-(That's what the `@anyvm` keyword means -- literally any VM in the system, except for dom0).
-But, wait a minute, didn't we just say (in the second row) that all the VMs tagged with work are **allowed** to copy files to each other?
-That's exactly right.
-The second and third rows contradict each other, but that's intentional.
-Since we know that parsing goes from top to bottom (and stops at the first match), we intentionally put the second row above the third row so that it would take precedence.
-This is how we create a policy that says: "VMs tagged with 'work' are allowed to copy files to each other but not to any *other* VMs (i.e., not to VMs that *aren't* tagged with 'work')."
-
-When an operation is initiated with a specific target, e.g. `qvm-copy-to-vm other_work_vm some_file` the policy mechanism looks for a row
-matching `source_work_vm other_work_vm PERMISSION`. In this case, assuming both VMs have the `work` tag, the second row would match, and
-the operation would be `allow`ed without any prompts. When an operation is initiated without a specific target, e.g. `qvm-copy some_file`,
-the policy mechanism looks for a row matching `source_work_vm @default PERMISSION`. In this case, the first row indicates that the user
-should be prompted for the destination. The list of destination VMs in the prompt is filtered to only include VMs that are valid as per
-the policy (so in this example, only other work VMs would be listed). If the first row was commented out, the second row would not match
-(the `@default` placeholder is not included in `@tag:work`) but the third row would match (the `@default` placeholder is included in
-`@anyvm`). The `qvm-copy` operation would therefore terminate immediately with the message `Request refused`, without prompting the user
-with a list of valid destination VMs, and only `qvm-copy-to-vm` operations with valid destinations would be allowed.
-
-The fourth row says that we're **denied** from copying files **from** any VM in the system **to** any VM tagged with "work".
-Again, since parsing goes from top to bottom, this doesn't mean that no files can ever be copied from *any* VM to a VM tagged with "work".
-Rather, it means that only VMs that match an earlier rule can do so (in this case, only VMs tagged with "work").
-
-The fifth and final row says that we're **asked** (i.e., prompted) to copy files **from** any VM in the system **to** any VM in the system.
-(This rule was already in the policy file by default.
-We added the first four.)
-Note that it wouldn't make sense to add any rules after this one, since every possible pair of VMs will match the `@anyvm @anyvm` pattern.
-Therefore, parsing will always stop at this rule, and no rules below it will ever be evaluated.
-
-All together, the four rules we added say that all VMs tagged with "work" are allowed to copy files to each other; however, they're denied from copying files to other VMs (without the "work" tag), and other VMs (without the "work" tag) are denied from copying files to them.
-The fifth rule means that the user gets prompted for any situation not already covered.
-
-Further details about how this system works can be found in [Qrexec: command execution in VMs](/doc/qrexec3/).
-
-(***Note**: the `$` character is deprecated in qrexec keywords -- please use `@` instead (e.g. `@anyvm`).
-For more information, see the bulletin [here](https://github.com/QubesOS/qubes-secpack/blob/master/QSBs/qsb-038-2018.txt).*)
+---
\ No newline at end of file
diff --git a/user/advanced-topics/salt.md b/user/advanced-topics/salt.md
index fdd88a404..79a37e634 100644
--- a/user/advanced-topics/salt.md
+++ b/user/advanced-topics/salt.md
@@ -2,609 +2,7 @@
lang: en
layout: doc
permalink: /doc/salt/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/salt.html
ref: 185
title: Salt (management software)
----
-
-Since the Qubes R3.1 release we have included the Salt (also called SaltStack)
-management engine in dom0 as default (with some states already configured).
-Salt allows administrators to easily configure their systems.
-In this guide we will show how it is set up and how you can modify it for your
-own purpose.
-
-In the current form the **API is provisional** and subject to change between
-*minor* releases.
-
-## Understanding Salt
-
-This document is not meant to be comprehensive Salt documentation; however,
-before writing anything it is required you have at least *some* understanding of
-basic Salt-related vocabulary.
-For more exhaustive documentation, visit [official site](https://docs.saltproject.io/en/latest/), though we
-must warn you that it is not easy to read if you just start working with Salt
-and know nothing.
-
-### The Salt Architecture
-
-Salt is a client-server model, where the server (called *master*) manages
-its clients (called *minions*).
-In typical situations, it is intended that the administrator interacts only
-with the master and keeps the configurations there.
-In Qubes, we don't have a master.
-Instead we have one minion which resides in `dom0` and manages domains from
-there.
-This setup is also supported by Salt.
-
-Salt is a management engine (similar to Ansible, Puppet, and Chef), that
-enforces a particular state of a minion system.
-A *state* is an end effect *declaratively* expressed by the administrator.
-This is the most important concept in the entire engine.
-All configurations (i.e., the states) are written in YAML.
-
-A *pillar* is a data back-end declared by the administrator.
-When states become repetitive, instead of pure YAML they can be written using a
-template engine (preferably Jinja2); which can use data structures specified in
-pillars.
-
-A *formula* is a ready to use, packaged solution that combines a state and a
-pillar (possibly with some file templates and other auxiliary files).
-There are many formulas made by helpful people all over the Internet.
-
-A *grain* is some data that is also available in templates, but its value is not
-directly specified by administrator.
-For example, the distribution (e.g., `"Debian"` or `"Gentoo"`) is a value of
-the grain `"os"`. It also contains other information about the kernel,
-hardware, etc.
-
-A *module* is a Python extension to Salt that is responsible for actually
-enforcing the state in a particular area.
-It exposes some *imperative* functions for the administrator.
-For example, there is a `system` module that has a `system.halt` function that,
-when issued, will immediately halt a domain.
-There is another function called `state.highstate` which will synchronize the
-state of the system with the administrator's configuration/desires.
-
-### Configuration
-
-#### States
-
-The smallest unit of configuration is a state.
-A state is written in YAML and looks like this:
-
-```
-stateid:
- cmd.run: #this is the execution module. in this case it will execute a command on the shell
- - name: echo 'hello world' #this is a parameter of the state.
-```
-
-The stateid has to be unique throughout all states running for a minion and can
-be used to order the execution of the references state.
-`cmd.run` is an execution module.
-It executes a command on behalf of the administrator.
-`name: echo 'hello world'` is a parameter for the execution module `cmd.run`.
-The module used defines which parameters can be passed to it.
-
-There is a list of [officially available states](https://docs.saltproject.io/en/latest/ref/states/all/).
-There are many very useful states:
-
-- For [managing files](https://docs.saltproject.io/en/latest/ref/states/all/salt.states.file.html): Use this to create files or
- directories and change them (append lines, replace text, set their content etc.)
-- For [installing and uninstalling](https://docs.saltproject.io/en/latest/ref/states/all/salt.states.pkg.html) packages.
-- For [executing shell commands](https://docs.saltproject.io/en/latest/ref/states/all/salt.states.cmd.html).
-
-With these three states you can define most of the configuration of a VM.
-
-You can also [order the execution](https://docs.saltproject.io/en/latest/ref/states/ordering.html) of your states:
-
-```
-D:
- cmd.run:
- - name: echo 1
- - order: last
-C:
- cmd.run:
- - name: echo 1
-B:
- cmd.run:
- - name: echo 1
- - require:
- - cmd: A
- - require_in:
- - cmd:C
-A:
- cmd.run:
- - name: echo 1
- - order: 1
-```
-
-The order of execution will be `A, B, C, D`.
-The official documentation has more details on the
-[require](https://docs.saltproject.io/en/latest/ref/states/requisites.html) and [order](https://docs.saltproject.io/en/latest/ref/states/ordering.html#the-order-option) arguments.
-
-#### State Files
-
-When configuring a system you will write one or more state files (`*.sls`) and
-put (or symlink) them into the main Salt directory `/srv/salt/`.
-Each state file contains multiple states and should describe some unit of
-configuration (e.g., a state file `mail.sls` could setup a VM for e-mail).
-
-#### Top Files
-
-After you have several state files, you need something to assign them to a VM.
-This is done by `*.top` files ([official documentation](https://docs.saltproject.io/en/latest/ref/states/top.html)).
-Their structure looks like this:
-
-```
-environment:
- target_matching_clause:
- - statefile1
- - folder2.statefile2
-```
-
-In most cases, the environment will be called `base`.
-The `target_matching_clause` will be used to select your minions (VMs).
-It can be either the name of a VM or a regular expression.
-If you are using a regular expressions, you need to give Salt a hint you are
-doing so:
-
-```
-environment:
- ^app-(work|(?!mail).*)$:
- - match: pcre
- - statefile
-```
-
-For each target you can write a list of state files.
-Each line is a path to a state file (without the `.sls` extension) relative to
-the main directory.
-Each `/` is exchanged with a `.`, so you can't reference files or directories
-with a `.` in their name.
-
-### Enabling Top Files and Applying the States
-
-Now, because we use custom extensions to manage top files (instead of just
-enabling them all), to enable a particular top file you should issue command:
-
-```
-$ qubesctl top.enable my-new-vm
-```
-
-To list all enabled top files:
-
-```
-$ qubesctl top.enabled
-```
-
-And to disable one:
-
-```
-$ qubesctl top.disable my-new-vm
-```
-
-To apply the states to dom0 and all VMs:
-
-```
-$ qubesctl --all state.highstate
-```
-
-(More information on the `qubesctl` command further down.)
-
-### Template Files
-
-You will sometimes find yourself writing repetitive states.
-To solve this, there is the ability to template files or states.
-This is most commonly done with [Jinja](http://jinja.pocoo.org/).
-Jinja is similar to Python and in many cases behaves in a similar fashion, but
-there are sometimes differences when, for example, you set some variable inside
-a loop: the variable outside will not get changed.
-Instead, to get this behavior, you would use a `do` statement.
-So you should take a look at the [Jinja API documentation](http://jinja.pocoo.org/docs/2.9/templates/).
-Documentation about using Jinja to directly call Salt functions and get data
-about your system can be found in the official
-[Salt documentation](https://docs.saltproject.io/en/getstarted/config/jinja.html#get-data-using-salt).
-
-## Salt Configuration, QubesOS layout
-
-All Salt configuration files are in the `/srv/` directory, as usual.
-The main directory is `/srv/salt/` where all state files reside.
-States are contained in `*.sls` files.
-However, the states that are part of the standard Qubes distribution are mostly
-templates and the configuration is done in pillars from formulas.
-
-The formulas are in `/srv/formulas`, including stock formulas for domains in
-`/srv/formulas/dom0/virtual-machines-formula/qvm`, which are used by firstboot.
-
-Because we use some code that is not found in older versions of Salt, there is
-a tool called `qubesctl` that should be run instead of `salt-call --local`.
-It accepts all the same arguments of the vanilla tool.
-
-## Configuring a VM's System from Dom0
-
-Salt in Qubes can be used to configure VMs from dom0.
-Simply set the VM name as the target minion name in the top file.
-You can also use the `qubes` pillar module to select VMs with a particular
-property (see below).
-If you do so, then you need to pass additional arguments to the `qubesctl` tool:
-
-```
-usage: qubesctl [-h] [--show-output] [--force-color] [--skip-dom0]
- [--targets TARGETS | --templates | --app | --all]
- ...
-
-positional arguments:
- command Salt command to execute (e.g., state.highstate)
-
-optional arguments:
- -h, --help show this help message and exit
- --show-output Show output of management commands
- --force-color Force color output, allow control characters from VM,
- UNSAFE
- --skip-dom0 Skip dom0 configuration (VM creation etc)
- --targets TARGETS Coma separated list of VMs to target
- --templates Target all templates
- --app Target all app qubes
- --all Target all non-disposables (templates and app qubes)
-```
-
-To apply a state to all templates, call `qubesctl --templates state.highstate`.
-
-The actual configuration is applied using `salt-ssh` (running over `qrexec`
-instead of `ssh`).
-Which means you don't need to install anything special in a VM you want to
-manage.
-Additionally, for each target VM, `salt-ssh` is started from a temporary VM.
-This way dom0 doesn't directly interact with potentially malicious target VMs;
-and in the case of a compromised Salt VM, because they are temporary, the
-compromise cannot spread from one VM to another.
-
-Beginning with Qubes 4.0 and after [QSB #45](/news/2018/12/03/qsb-45/), we implemented two changes:
-
-1. Added the `management_dispvm` VM property, which specifies the disposable
- Template that should be used for management, such as Salt
- configuration. App qubes inherit this property from their
- parent templates. If the value is not set explicitly, the default
- is taken from the global `management_dispvm` property. The
- VM-specific property is set with the `qvm-prefs` command, while the
- global property is set with the `qubes-prefs` command.
-
-2. Created the `default-mgmt-dvm` disposable template, which is hidden from
- the menu (to avoid accidental use), has networking disabled, and has
- a black label (the same as templates). This VM is set as the global
- `management_dispvm`. Keep in mind that this disposable template has full control
- over the VMs it's used to manage.
-
-## Writing Your Own Configurations
-
-Let's start with a quick example:
-
-```
-my new and shiny VM:
- qvm.present:
- - name: salt-test # can be omitted when same as ID
- - template: fedora-21
- - label: yellow
- - mem: 2000
- - vcpus: 4
- - flags:
- - proxy
-```
-
-It uses the Qubes-specific `qvm.present` state, which ensures that the domain is
-present (if not, it creates it).
-
-- The `name` flag informs Salt that the domain should be named `salt-test` (not
- `my new and shiny VM`).
-- The `template` flag informs Salt which template should be used for the domain.
-- The `label` flag informs Salt what color the domain should be.
-- The `mem` flag informs Salt how much RAM should be allocated to the domain.
-- The `vcpus` flag informs Salt how many Virtual CPUs should be allocated to the
- domain
-- The `proxy` flag informs Salt that the domain should be a ProxyVM.
-
-As you will notice, the options are the same (or very similar) to those used in
-`qvm-prefs`.
-
-This should be put in `/srv/salt/my-new-vm.sls` or another `.sls` file.
-A separate `*.top` file should be also written:
-
-```
-base:
- dom0:
- - my-new-vm
-```
-
-**Note** The third line should contain the name of the previous state file,
-without the `.sls` extension.
-
-To enable the particular top file you should issue the command:
-
-```
-$ qubesctl top.enable my-new-vm
-```
-
-To apply the state:
-
-```
-$ qubesctl state.highstate
-```
-
-### Example of Configuring a VM's System from Dom0
-
-Lets make sure that the `mc` package is installed in all templates.
-Similar to the previous example, you need to create a state file
-(`/srv/salt/mc-everywhere.sls`):
-
-```
-mc:
- pkg.installed: []
-```
-
-Then the appropriate top file (`/srv/salt/mc-everywhere.top`):
-
-```
-base:
- qubes:type:template:
- - match: pillar
- - mc-everywhere
-```
-
-Now you need to enable the top file:
-
-```
-$ qubesctl top.enable mc-everywhere
-```
-
-And apply the configuration:
-
-```
-$ qubesctl --all state.highstate
-```
-
-## All Qubes-specific States
-
-### `qvm.present`
-
-As in the example above, it creates a domain and sets its properties.
-
-### `qvm.prefs`
-
-You can set properties of an existing domain:
-
-```
-my preferences:
- qvm.prefs:
- - name: salt-test2
- - netvm: sys-firewall
-```
-
-***Note*** The `name:` option will not change the name of a domain, it will only
-be used to match a domain to apply the configurations to it.
-
-### `qvm.service`
-
-```
-services in my domain:
- qvm.service:
- - name: salt-test3
- - enable:
- - service1
- - service2
- - disable:
- - service3
- - service4
- - default:
- - service5
-```
-
-This enables, disables, or sets to default, services as in `qvm-service`.
-
-### `qvm.running`
-
-Ensures the specified domain is running:
-
-```
-domain is running:
- qvm.running:
- - name: salt-test4
-```
-
-## Virtual Machine Formulae
-
-You can use these formulae to download, install, and configure VMs in Qubes.
-These formulae use pillar data to define default VM names and configuration details.
-The default settings can be overridden in the pillar data located in:
-
-```
-/srv/pillar/base/qvm/init.sls
-```
-
-In dom0, you can apply a single state with `sudo qubesctl state.sls STATE_NAME`.
-For example, `sudo qubesctl state.sls qvm.personal` will create a `personal` VM (if it does not already exist) with all its dependencies (template, `sys-firewall`, and `sys-net`).
-
-### Available states
-
-#### `qvm.sys-net`
-
-System NetVM
-
-#### `qvm.sys-usb`
-
-System USB VM
-
-#### `qvm.sys-net-as-usbvm`
-
-System USB VM bundled into NetVM. Do not enable together with `qvm.sys-usb`.
-
-#### `qvm.usb-keyboard`
-
-Enable USB keyboard together with USB VM, including for early system boot (for LUKS passhprase).
-This state implicitly creates a USB VM (`qvm.sys-usb` state), if not already done.
-
-#### `qvm.sys-firewall`
-
-System firewall ProxyVM
-
-#### `qvm.sys-whonix`
-
-Whonix gateway ProxyVM
-
-#### `qvm.personal`
-
-Personal app qube
-
-#### `qvm.work`
-
-Work app qube
-
-#### `qvm.untrusted`
-
-Untrusted app qube
-
-#### `qvm.vault`
-
-Vault app qube with no NetVM enabled.
-
-#### `qvm.default-dispvm`
-
-Default disposable template - fedora-26-dvm app qube
-
-#### `qvm.anon-whonix`
-
-Whonix workstation app qube.
-
-#### `qvm.whonix-ws-dvm`
-
-Whonix workstation app qube for Whonix disposables.
-
-#### `qvm.updates-via-whonix`
-
-Setup UpdatesProxy to route all templates updates through Tor (sys-whonix here).
-
-#### `qvm.template-fedora-21`
-
-Fedora-21 template
-
-#### `qvm.template-fedora-21-minimal`
-
-Fedora-21 minimal template
-
-#### `qvm.template-debian-7`
-
-Debian 7 (wheezy) template
-
-#### `qvm.template-debian-8`
-
-Debian 8 (jessie) template
-
-#### `qvm.template-whonix-gw`
-
-Whonix Gateway template
-
-#### `qvm.template-whonix-ws`
-
-Whonix Workstation template
-
-#### `update.qubes-dom0`
-
-Updates dom0. Example (executed in dom0):
-
-```
-$ sudo qubesctl --show-output state.sls update.qubes-dom0
-```
-
-#### `update.qubes-vm`
-
-Updates domUs. Example to update all templates (executed in dom0):
-
-```
-$ sudo qubesctl --show-output --skip-dom0 --templates state.sls update.qubes-vm
-```
-
-Useful options:
-
-- `--max-concurrency` --- Limits how many templates are updated at the same time.
- Adjust to your available RAM.
- The default is 4, and the GUI updater sets it to 1.
-- `--targets=vm1,vm2,...` --- Limit to specific VMs, instead of all of them.
- (Use instead of `--templates` or `--standalones`.)
-- `--show-output` --- Show an update summary instead of just OK/FAIL.
-
-For other options, see `qubesctl --help`.
-
-## The `qubes` Pillar Module
-
-Additional pillar data is available to ease targeting configurations (for example all templates).
-
-**Note:** This list is subject to change in future releases.
-
-### `qubes:type`
-
-VM type. Possible values:
-
-- `admin` - Administration domain (`dom0`)
-- `template` - template
-- `standalone` - Standalone VM
-- `app` - Template based app qube
-
-### `qubes:template`
-
-Template name on which a given VM is based (if any).
-
-### `qubes:netvm`
-
-VM which provides network to the given VM
-
-## Debugging
-
-The output for each VM is logged in `/var/log/qubes/mgmt-VM_NAME.log`.
-
-If the log does not contain useful information:
-1. Run `sudo qubesctl --skip-dom0 --target=VM_NAME state.highstate`
-2. When your VM is being started (yellow) press Ctrl-z on qubesctl.
-3. Open terminal in disp-mgmt-VM_NAME.
-4. Look at /etc/qubes-rpc/qubes.SaltLinuxVM - this is what is
- executed in the management VM.
-5. Get the last two lines:
-
- ```shell_session
- $ export PATH="/usr/lib/qubes-vm-connector/ssh-wrapper:$PATH"
- $ salt-ssh "$target_vm" $salt_command
- ```
-
- Adjust $target_vm (VM_NAME) and $salt_command (state.highstate).
-6. Execute them, fix problems, repeat.
-
-## Known Pitfalls
-
-### Using fedora-24-minimal
-
-The fedora-24-minimal package is missing the `sudo` package.
-You can install it via:
-
-```shell_session
-$ qvm-run -p -u root fedora-24-minimal-template 'dnf install -y sudo'
-```
-
-The `-p` will cause the execution to wait until the package is installed.
-Having the `-p` flag is important when using a state with `cmd.run`.
-
-### Disk Quota Exceeded (When Installing Templates)
-
-If you install multiple templates you may encounter this error.
-The solution is to shut down the updateVM between each install:
-
-```
-install template and shutdown updateVM:
- cmd.run:
- - name: sudo qubes-dom0-update -y fedora-24; qvm-shutdown {% raw %}{{ salt.cmd.run(qubes-prefs updateVM) }}{% endraw %}
-```
-
-## Further Reading
-
-- [Salt documentation](https://docs.saltproject.io/en/latest/)
-- [Salt states](https://docs.saltproject.io/en/latest/ref/states/all/) ([files](https://docs.saltproject.io/en/latest/ref/states/all/salt.states.file.html), [commands](https://docs.saltproject.io/en/latest/ref/states/all/salt.states.cmd.html),
- [packages](https://docs.saltproject.io/en/latest/ref/states/all/salt.states.pkg.html), [ordering](https://docs.saltproject.io/en/latest/ref/states/ordering.html))
-- [Top files](https://docs.saltproject.io/en/latest/ref/states/top.html)
-- [Jinja templates](http://jinja.pocoo.org/)
-- [Qubes specific modules](https://github.com/QubesOS/qubes-mgmt-salt-dom0-qvm/blob/master/README.rst)
-- [Formulas for default Qubes VMs](https://github.com/QubesOS/qubes-mgmt-salt-dom0-virtual-machines/tree/master/qvm)
+---
\ No newline at end of file
diff --git a/user/advanced-topics/secondary-storage.md b/user/advanced-topics/secondary-storage.md
index 10f014255..6ee0d7bea 100644
--- a/user/advanced-topics/secondary-storage.md
+++ b/user/advanced-topics/secondary-storage.md
@@ -6,108 +6,7 @@ redirect_from:
- /en/doc/secondary-storage/
- /doc/SecondaryStorage/
- /wiki/SecondaryStorage/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/secondary-storage.html
ref: 187
title: Secondary storage
----
-
-Suppose you have a fast but small primary SSD and a large but slow secondary HDD.
-You want to store a subset of your app qubes on the HDD.
-
-## Instructions
-
-Qubes 4.0 is more flexible than earlier versions about placing different VMs on different disks.
-For example, you can keep templates on one disk and app qubes on another, without messy symlinks.
-
-These steps assume you have already created a separate [volume group](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/logical_volume_manager_administration/vg_admin#VG_create) and [thin pool](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/logical_volume_manager_administration/thinly_provisioned_volume_creation) (not thin volume) for your HDD.
-See also [this example](https://www.linux.com/blog/how-full-encrypt-your-linux-system-lvm-luks) if you would like to create an encrypted LVM pool (but note you can use a single logical volume if preferred, and to use the `-T` option on `lvcreate` to specify it is thin). You can find the commands for this example applied to Qubes at the bottom of this R4.0 section.
-
-First, collect some information in a dom0 terminal:
-
-```
-sudo pvs
-sudo lvs
-```
-
-Take note of the VG and thin pool names for your HDD, then register it with Qubes:
-
-```shell_session
-# is a freely chosen pool name
-# is LVM volume group name
-# is LVM thin pool name
-qvm-pool --add lvm_thin -o volume_group=,thin_pool=,revisions_to_keep=2
-```
-
-Now, you can create qubes in that pool:
-
-```
-qvm-create -P --label red
-```
-
-It isn't possible to directly migrate an existing qube to the new pool, but you can clone it there, then remove the old one:
-
-```
-qvm-clone -P
-qvm-remove
-```
-
-If that was a template, or other qube referenced elsewhere (NetVM or such), you will need to adjust those references manually after moving.
-For example:
-
-```
-qvm-prefs template
-```
-
-In theory, you can still use file-based disk images ("file" pool driver), but it lacks some features such as you won't be able to do backups without shutting down the qube.
-
-### Example HDD setup
-
-Assuming the secondary hard disk is at /dev/sdb (it will be completely erased), you can set it up for encryption by doing in a dom0 terminal (use the same passphrase as the main Qubes disk to avoid a second password prompt at boot):
-
-```
-sudo cryptsetup luksFormat --hash=sha512 --key-size=512 --cipher=aes-xts-plain64 --verify-passphrase /dev/sdb
-sudo blkid /dev/sdb
-```
-
-Note the device's UUID (in this example "b209..."), we will use it as its luks name for auto-mounting at boot, by doing:
-
-```
-sudo nano /etc/crypttab
-```
-
-And adding this line (change both "b209..." for your device's UUID from blkid) to crypttab:
-
-```
-luks-b20975aa-8318-433d-8508-6c23982c6cde UUID=b20975aa-8318-433d-8508-6c23982c6cde none
-```
-
-Reboot the computer so the new luks device appears at /dev/mapper/luks-b209... and we can then create its pool, by doing this on a dom0 terminal (substitute the b209... UUIDs with yours):
-
-First create the physical volume
-
-```
-sudo pvcreate /dev/mapper/luks-b20975aa-8318-433d-8508-6c23982c6cde
-```
-
-Then create the LVM volume group, we will use for example "qubes" as the :
-
-```
-sudo vgcreate qubes /dev/mapper/luks-b20975aa-8318-433d-8508-6c23982c6cde
-```
-
-And then use "poolhd0" as the (LVM thin pool name):
-
-```
-sudo lvcreate -T -n poolhd0 -l +100%FREE qubes
-```
-
-Finally we will tell Qubes to add a new pool on the just created thin pool
-
-```
-qvm-pool --add poolhd0_qubes lvm_thin -o volume_group=qubes,thin_pool=poolhd0,revisions_to_keep=2
-```
-
-By default VMs will be created on the main Qubes disk (i.e. a small SSD), to create them on this secondary HDD do the following on a dom0 terminal:
-
-```
-qvm-create -P poolhd0_qubes --label red unstrusted-hdd
-```
+---
\ No newline at end of file
diff --git a/user/advanced-topics/standalones-and-hvms.md b/user/advanced-topics/standalones-and-hvms.md
index a911dc558..53574f3d5 100644
--- a/user/advanced-topics/standalones-and-hvms.md
+++ b/user/advanced-topics/standalones-and-hvms.md
@@ -10,434 +10,7 @@ redirect_from:
- /en/doc/hvm-create/
- /doc/HvmCreate/
- /wiki/HvmCreate/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/standalones-and-hvms.html
ref: 130
title: Standalones and HVMs
----
-
-A [standalone](/doc/glossary/#standalone) is a type of qube that is created by
-cloning a [template](/doc/glossary/#template). Unlike templates, however,
-standalones do not supply their root filesystems to other qubes. Examples of
-situations in which standalones can be useful include:
-
-- Qubes used for development (dev environments often require a lot of specific
- packages and tools)
-- Qubes used for installing untrusted packages. Normally, you install digitally
- signed software from Red Hat/Fedora repositories, and it's reasonable that
- such software has non malicious *installation* scripts (rpm pre/post
- scripts). However, when you would like to install some packages from less
- trusted sources, or unsigned, then using a dedicated (untrusted) standalone
- might be a better way.
-
-Meanwhile, a [Hardware-assisted Virtual Machine (HVM)](/doc/glossary/#hvm),
-also known as a "Fully-Virtualized Virtual Machine," utilizes the
-virtualization extensions of the host CPU. These are typically contrasted with
-Paravirtualized (PV) VMs.
-
-HVMs allow you to create qubes based on any OS for which you have an
-installation ISO, so you can easily have qubes running Windows, \*BSD, or any
-Linux distribution. You can also use HVMs to run "live" distros.
-
-By default, every qube runs in PVH mode (which has security advantages over
-both PV and HVM), except for those with attached PCI devices, which run in HVM
-mode. See [here](https://blog.invisiblethings.org/2017/07/31/qubes-40-rc1.html)
-for a discussion of the switch from PV to HVM and
-[here](/news/2018/01/11/qsb-37/) for the announcement about the change to using
-PVH as default.
-
-The standalone/template distinction and the HVM/PV/PVH distinctions are
-orthogonal. The former is about root filesystem inheritance, whereas the latter
-is about the virtualization mode. In practice, however, it is most common for
-standalones to be HVMs and for HVMs to be standalones. Hence, this page covers
-both topics.
-
-## Creating a standalone
-
-You can create a standalone in the Qube Manager by selecting the "Type" of
-"Standalone qube copied from a template" or "Empty standalone qube (install
-your own OS)."
-
-Alternatively, from the dom0 command line:
-
-```
-qvm-create --class StandaloneVM --label --property virt_mode=hvm
-```
-
-(Note: Technically, `virt_mode=hvm` is not necessary for every standalone.
-However, it makes sense if you want to use a kernel from within the qube.)
-
-## Updating standalones
-
-When you create a standalone from a template, the standalone is a complete
-clone of the template, including the entire filesystem. After the moment of
-creation, the standalone becomes completely independent from the template.
-Therefore, the standalone will not be updated merely by updating the template
-from which it was originally cloned. Rather, it must be updated as an
-independent qube. See [How to Update](/doc/how-to-update/).
-
-## Creating an HVM
-
-### Using the GUI
-
-In Qube Manager, select "Create new qube" from the Qube menu, or select the
-"Create a new qube" button. In the "create new qube" dialog box set Type to
-"Empty standalone qube (install your own OS)". If "install system from device"
-is selected (which it is by default), then `virt_mode` will be set to `hvm`
-automatically. Otherwise, open the newly-created qube's Settings GUI and, in
-the "Advanced" tab, select `HVM` in the virtualization mode drop-down list.
-Also, make sure "Kernel" is set to `(none)` on the same tab.
-
-### Command line
-
-Qubes are template-based (i.e., [app qubes](/doc/glossary/#app-qube) by
-default, so you must set the `--class StandaloneVM` option to create a
-standalone. The name and label color used below are for illustration purposes.
-
-```
-qvm-create my-new-vm --class StandaloneVM --property virt_mode=hvm --property kernel='' --label=green
-```
-
-If you receive an error like this one, then you must first enable VT-x in your
-BIOS:
-
-```
-libvirt.libvirtError: invalid argument: could not find capabilities for arch=x86_64
-```
-
-Make sure that you give the new qube adequate memory to install and run.
-
-## Installing an OS in an HVM
-
-You will have to boot the qube with the installation media "attached" to it.
-You may either use the GUI or use command line instructions. At the command
-line you can do this in three ways:
-
-1. If you have the physical CD-ROM media and an optical disc drive:
-
- ```
- qvm-start --cdrom=/dev/cdrom
- ```
-
-2. If you have an ISO image of the installation media located in dom0:
-
- ```
- qvm-start --cdrom=dom0:/usr/local/iso/
- ```
-
-3. If you have an ISO image of the installation media located in a qube (the
- qube where the media is located must be running):
-
- ```
- qvm-start --cdrom=:/home/user/
- ```
-
-For security reasons, you should *never* copy untrusted data to dom0.
-
-Next, the qube will start booting from the attached installation media, and you
-can start installation. Whenever the installer wants to "reboot the system" it
-actually shuts down the qube, and Qubes won't automatically start it. You may
-have to restart the qube several times in order to complete installation (as is
-the case with Windows 7 installations). Several invocations of the `qvm-start`
-command (as shown above) might be needed.
-
-## Setting up networking for HVMs
-
-Just like standard app qubes, an HVM gets a fixed IP addresses centrally
-assigned by Qubes. Normally, Qubes agent scripts (or services on Windows)
-running within each app qube are responsible for setting up networking within
-the qube according to the configuration created by Qubes (through
-[keys](/doc/vm-interface/#qubesdb) exposed by dom0 to the qube). Such
-centrally-managed networking infrastructure allows for [advanced networking
-configurations](https://blog.invisiblethings.org/2011/09/28/playing-with-qubes-networking-for-fun.html).
-
-A generic HVM such as a standard Windows or Ubuntu installation, however, has
-no Qubes agent scripts running inside it initially and thus requires manual
-configuration of networking so that it matches the values assigned by Qubes.
-
-Even though we do have a small DHCP server that runs inside the HVM's untrusted
-stub domain to make the manual network configuration unnecessary for many
-qubes, this won't work for most modern Linux distributions, which contain Xen
-networking PV drivers (but not Qubes tools), which bypass the stub-domain
-networking. (Their net frontends connect directly to the net backend in the
-[net qube](/doc/glossary/#net-qube).) In this instance, our DHCP server is not
-useful.
-
-In order to manually configure networking in a qube, one should first find out
-the IP/netmask/gateway assigned to the particular qube by Qubes. This can be
-seen, e.g., in the Qube Manager in the qube's properties:
-
-
-
-Alternatively, one can use the `qvm-ls -n` command to obtain the same
-information (IP/netmask/gateway).
-
-The DNS IP addresses are `10.139.1.1` and `10.139.1.2`. There is [opt-in
-support](/doc/networking/#ipv6) for IPv6 forwarding.
-
-## Using template-based HVMs
-
-Qubes allows HVMs to share a common root filesystem from a select template.
-This mode can be used for any HVM (e.g., FreeBSD running in an HVM).
-
-In order to create an HVM template, you use the following command, suitably
-adapted:
-
-```
-qvm-create --class TemplateVM --property virt_mode=HVM --property kernel='' -l
-```
-
-Set memory as appropriate and install the OS into this template in the same way
-you would install it into a normal HVM. Generally, you should install in to the
-first "system" disk. (Resize it as needed before starting installation.)
-
-You can then create a new qube using the new template. If you use this Template
-as is, then any HVMs based on it it will effectively be disposables. All file
-system changes will be wiped when the HVM is shut down.
-
-Please see [this
-page](https://github.com/Qubes-Community/Contents/blob/master/docs/os/windows/windows-tools.md)
-for specific advice on installing and using Windows-based templates.
-
-## Cloning HVMs
-
-Just like normal app qubes, HVMs can also be cloned either using the command
-`qvm-clone` or via the Qube Manager's "Clone VM" option in the right-click
-menu.
-
-The cloned qube will get identical root and private images and will essentially
-be identical to the original qube, except that it will get a different MAC
-address for the networking interface:
-
-```
-[joanna@dom0 ~]$ qvm-prefs my-new-vm
-autostart D False
-backup_timestamp U
-debug D False
-default_dispvm D None
-default_user D user
-gateway D
-gateway6 D
-include_in_backups - False
-installed_by_rpm D False
-ip D 10.137.0.122
-ip6 D fd09:24ef:4179::a89:7a
-kernel -
-kernelopts D nopat
-klass D StandaloneVM
-label - red
-mac D 00:16:3e:5e:6c:00
-management_dispvm D default-mgmt-dvm
-maxmem D 0
-memory - 1000
-name - my-new-vm
-netvm - sys-firewall
-provides_network - False
-qid - 122
-qrexec_timeout D 60
-shutdown_timeout D 60
-start_time D
-stubdom_mem U
-stubdom_xid D -1
-updateable D True
-uuid - 54387f94-8617-46b0-8806-0c18bc387f34
-vcpus D 2
-virt_mode - hvm
-visible_gateway D 10.137.0.14
-visible_gateway6 D fd09:24ef:4179::a89:e
-visible_ip D 10.137.0.122
-visible_ip6 D fd09:24ef:4179::a89:7a
-visible_netmask D 255.255.255.255
-xid D -1
-
-[joanna@dom0 ~]$ qvm-clone my-new-vm my-new-vm-copy
-
-/.../
-
-[joanna@dom0 ~]$ qvm-prefs my-new-vm-copy
-autostart D False
-backup_timestamp U
-debug D False
-default_dispvm D None
-default_user D user
-gateway D
-gateway6 D
-include_in_backups - False
-installed_by_rpm D False
-ip D 10.137.0.137
-ip6 D fd09:24ef:4179::a89:89
-kernel -
-kernelopts D nopat
-klass D StandaloneVM
-label - red
-mac D 00:16:3e:5e:6c:00
-management_dispvm D default-mgmt-dvm
-maxmem D 0
-memory - 1000
-name - my-new-vm-copy
-netvm - sys-firewall
-provides_network - False
-qid - 137
-qrexec_timeout D 60
-shutdown_timeout D 60
-start_time D
-stubdom_mem U
-stubdom_xid D -1
-updateable D True
-uuid - 9ad109a9-d95a-4e03-b977-592f8424f42b
-vcpus D 2
-virt_mode - hvm
-visible_gateway D 10.137.0.14
-visible_gateway6 D fd09:24ef:4179::a89:e
-visible_ip D 10.137.0.137
-visible_ip6 D fd09:24ef:4179::a89:89
-visible_netmask D 255.255.255.255
-xid D -1
-
-```
-
-Note that the MAC addresses differ between those two otherwise identical qubes.
-The IP addresses assigned by Qubes will also be different, of course, to allow
-networking to function properly:
-
-```
-[joanna@dom0 ~]$ qvm-ls -n
-
-NAME STATE NETVM IP IPBACK GATEWAY
-my-new-hvm Halted sys-firewall 10.137.0.122 - 10.137.0.14
-my-new-hvm-clone Halted sys-firewall 10.137.0.137 - 10.137.0.14
-
-```
-
-If, for any reason, you would like to make sure that the two qubes have the
-same MAC address, you can use `qvm-prefs` to set a fixed MAC address:
-
-```
-[joanna@dom0 ~]$ qvm-prefs my-new-vm-copy -s mac 00:16:3E:5E:6C:05
-[joanna@dom0 ~]$ qvm-prefs my-new-vm-copy
-name : my-new-vm-copy
-label : green
-type : HVM
-netvm : firewallvm
-updateable? : True
-installed by RPM? : False
-include in backups: False
-dir : /var/lib/qubes/appvms/my-new-vm-copy
-config : /var/lib/qubes/appvms/my-new-vm-copy/my-new-vm-copy.conf
-pcidevs : []
-root img : /var/lib/qubes/appvms/my-new-vm-copy/root.img
-private img : /var/lib/qubes/appvms/my-new-vm-copy/private.img
-vcpus : 4
-memory : 512
-maxmem : 512
-MAC : 00:16:3E:5E:6C:05
-debug : off
-default user : user
-qrexec_installed : False
-qrexec timeout : 60
-drive : None
-timezone : localtime
-```
-
-## Assigning PCI devices to HVMs
-
-HVMs (including Windows qubes) can be [assigned PCI
-devices](/doc/how-to-use-pci-devices/) just like normal app qubes. For example,
-you can assign a USB controller to a Windows qube, and you should be able to
-use various devices that require Windows software, such as phones, electronic
-devices that are configured via FTDI, etc.
-
-One problem at the moment, however, is that after the whole system gets
-suspended into S3 sleep and subsequently resumed, some attached devices may
-stop working and should be restarted within the qube. This can be achieved
-under a Windows HVM by opening the Device Manager, selecting the actual device
-(such as a USB controller), 'Disabling' the device, and then 'Enabling' the
-device again. This is illustrated in the screenshot below:
-
-
-
-## Converting VirtualBox VMs to Qubes HVMs
-
-You can convert any VirtualBox VM to a Qubes HVM using this method.
-
-For example, Microsoft provides [free 90-day evaluation VirtualBox VMs for
-browser
-testing](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/).
-
-About 60 GB of disk space is required for conversion. Use an external hard
-drive if needed. The final `root.img` size is 40 GB.
-
-In a Debian app qube, install `qemu-utils` and `unzip`:
-
-```
-sudo apt install qemu-utils unzip
-```
-
-In a Fedora app qube:
-
-```
-sudo dnf install qemu-img
-```
-
-Unzip VirtualBox zip file:
-
-```
-unzip *.zip
-```
-
-Extract OVA tar archive:
-
-```
-tar -xvf *.ova
-```
-
-Convert vmdk to raw:
-
-```
-qemu-img convert -O raw *.vmdk win10.raw
-```
-
-Copy the root image file from the originating qube (here called `untrusted`) to
-a temporary location in dom0, typing this in a dom0 terminal:
-
-```
-qvm-run --pass-io untrusted 'cat "/media/user/externalhd/win10.raw"' > /home/user/win10-root.img
-```
-
-From within dom0, create a new HVM (here called `win10`) with the root image we
-just copied to dom0 (change the amount of RAM in GB as you wish):
-
-```
-qvm-create --property=virt_mode=hvm --property=memory=4096 --property=kernel='' --label red --standalone --root-move-from /home/user/win10-root.img win10
-```
-
-Start `win10`:
-
-```
-qvm-start win10
-```
-
-### Optional ways to get more information
-
-Filetype of OVA file:
-
-```
-file *.ova
-```
-
-List files of OVA tar archive:
-
-```
-tar -tf *.ova
-```
-
-List filetypes supported by qemu-img:
-
-```
-qemu-img -h | tail -n1
-```
-
-## Further reading
-
-Other documents related to HVMs:
-
-- [Windows VMs](https://github.com/Qubes-Community/Contents/blob/master/docs/os/windows/windows-vm.md)
-- [Linux HVM Tips](https://github.com/Qubes-Community/Contents/blob/master/docs/os/linux-hvm-tips.md)
+---
\ No newline at end of file
diff --git a/user/advanced-topics/usb-qubes.md b/user/advanced-topics/usb-qubes.md
index f0f91d9ef..70e610d5a 100644
--- a/user/advanced-topics/usb-qubes.md
+++ b/user/advanced-topics/usb-qubes.md
@@ -8,291 +8,7 @@ redirect_from:
- /doc/USBVM/
- /wiki/USBVM/
- /doc/sys-usb/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/usb-qubes.html
ref: 181
title: USB qubes
----
-
-A USB qube acts as a secure handler for potentially malicious USB devices,
-preventing them from coming into contact with dom0 (which could otherwise be
-fatal to the security of the whole system). It thereby mitigates some of the
-[security risks of using USB
-devices](/doc/device-handling-security/#usb-security). Nonetheless, we strongly
-recommend carefully reading the [security warning on USB input
-devices](/doc/device-handling-security/#security-warning-on-usb-input-devices)
-before proceeding.
-
-With a USB qube, every time you connect an untrusted USB device to a USB port
-managed by that USB controller, you will have to attach it to the qube in which
-you wish to use it (if different from the USB qube itself).
-
-If you opted to allow the Qubes installer to create a USB qube for you during
-the installation process, then you should already have a working USB qube, and
-no further action should be required. However, if you do not have a USB qube,
-wish to remove the one you have, or have run into some other related problem,
-this page can help.
-
-
-## USB keyboards
-
-If you use a USB keyboard, there is a high risk of locking yourself out of your
-system when experimenting with USB qubes. For example, if a USB qube takes over
-your sole USB controller (to which your USB keyboard is connected), then your
-keyboard will no longer be able to control dom0. This will prevent you from
-performing many essential tasks, such as entering your decryption and login
-passphrases, rendering your system unusable until you reinstall. This section
-covers various options for addressing this problem.
-
-In general, PS/2 keyboards are preferable to USB keyboards. However, many newer
-computer models lack PS/2 ports. Moreover, while most laptops use PS/2
-connections for the keyboard internally, some use USB. (Check yours by
-examining the output of the `lsusb` command.) If you have a PS/2 port but still
-wish to use a USB keyboard, then having a backup PS/2 keyboard handy can be
-useful in case you accidentally lock yourself out of your system.
-
-
-### How to create a USB qube for use with a USB keyboard
-
-If you're reading this section, it's likely because the installer did not allow
-you to create a USB qube automatically because you're using a USB keyboard.
-This section will explain how to create a USB qube that you can use with your
-USB keyboard. This section assumes that you have only a single USB controller.
-If you have more than one USB controller, see [how to enable a USB keyboard on
-a separate USB
-controller](#qubes-41-how-to-enable-a-usb-keyboard-on-a-separate-usb-controller).
-
-First, make sure you have the latest `qubes-mgmt-salt-dom0-virtual-machines`
-package by [updating
-dom0](/doc/how-to-install-software-in-dom0/#how-to-update-dom0). Then, enter
-the following command in dom0:
-
-```
-sudo qubesctl state.sls qvm.usb-keyboard
-```
-
-This command will take care of all required configuration, including creating a
-USB qube if not already present. Note, however, that this setup will expose
-dom0 to USB devices while you are entering your LUKS passphrase. While only
-input devices (keyboards, mice, etc.) are initialized at this stage, users are
-advised to physically disconnect other devices from the system during this
-vulnerable window in order to minimize the risk.
-
-To undo these changes, see [how to remove a USB
-qube](#how-to-remove-a-usb-qube).
-
-If you wish to perform only a subset of this configuration (for example, you do
-not wish to enable the USB keyboard during boot), see the manual instructions
-below.
-
-
-#### Manual setup for USB keyboards
-
-In order to use a USB keyboard, you must first attach it to a USB qube, then
-give that qube permission to pass keyboard input to dom0. Edit the
-`qubes.InputKeyboard` policy file in dom0, which is located here:
-
-```
-/etc/qubes-rpc/policy/qubes.InputKeyboard
-```
-
-Add a line like this one to the top of the file:
-
-```
-sys-usb dom0 allow
-```
-
-(Change `sys-usb` to your desired USB qube.)
-
-You can now use your USB keyboard to log in to your dom0 user account (after
-LUKS decryption).
-
-You can set up your system so that there's a confirmation prompt each time the
-USB keyboard is connected. However, this will effectively disable your USB
-keyboard for dom0 user account login and the screen locker, so **don't do this
-if you want to log into and unlock your device with a USB keyboard!** If you're
-sure you wish to proceed, change the previous line to:
-
-```
-sys-usb dom0 ask,default_target=dom0
-```
-
-If you wish to use a USB keyboard to enter your LUKS passphrase, you cannot
-[hide its USB controller from dom0](#how-to-hide-usb-controllers-from-dom0). If
-you've already hidden that USB controller from dom0, you must revert the
-procedure by removing the `rd.qubes.hide_all_usb` option and employ an
-alternative strategy for protecting your system by physically disconnecting
-other devices during startup.
-
-
-**Qubes 4.1 only:** You should also add the
-`usbcore.authorized_default=0` option, which prevents the initialization of
-non-input devices. (Qubes ships with a USBGuard configuration that allows only
-input devices when `usbcore.authorized_default=0` is set.)
-
-
-### Qubes 4.1: How to enable a USB keyboard on a separate USB controller
-
-When using a USB keyboard on a system with multiple USB controllers, we
-recommend that you designate one of them exclusively for the keyboard (and
-possibly the mouse) and keep other devices connected to the other
-controller(s). This is often an option on desktop systems, where additional USB
-controllers can be plugged in as PCIe cards. In this case, the designated
-controller for input devices should remain in dom0 but be limited to input
-devices only. To set it up:
-
-1. [Find the controller used for input
- devices](/doc/how-to-use-usb-devices/#finding-the-right-usb-controller).
-2. Open the file `/etc/default/grub` in dom0.
-3. Find the line that begins with `GRUB_CMDLINE_LINUX`.
-4. Add `usbcore.authorized_default=0` and `rd.qubes.dom0_usb=` to that
- line, where `` is the USB controller identifier.
-5. Save and close the file.
-6. Run the command `grub2-mkconfig -o /boot/grub2/grub.cfg` (legacy boot) or
- `grub2-mkconfig -o /boot/efi/EFI/qubes/grub.cfg` (EFI) in dom0.
-7. Reboot.
-8. Proceed with [creating a USB qube](#how-to-create-a-usb-qube) normally. The
- selected USB controller will remain in dom0.
-
-These options can be added during installation. (When the installer prompts for
-a reboot, you can switch to tty2 and perform the steps from there, after using
-the `chroot /mnt/sysimage` command.) In that case, the initial setup will
-create a USB qube automatically, even when a USB keyboard is in use (as long as
-it is connected to the designated controller).
-
-
-## USB mice
-
-Handling a USB mouse isn't as critical as handling a keyboard, since you can
-log in and proceed through confirmation prompts using the keyboard alone.
-
-If you want to attach the USB mouse automatically anyway, you have to edit the
-`qubes.InputMouse` policy file in dom0, located at:
-
-```
-/etc/qubes-rpc/policy/qubes.InputMouse
-```
-
-The first line should read similar to:
-
-```
-sys-usb dom0 ask,default_target=dom0
-```
-
-There will now be a confirmation prompt each time a USB mouse is attached.
-
-If the file is empty or does not exist, something might have gone wrong during
-setup. Try to rerun `qubesctl state.sls qvm.sys-usb` in dom0.
-
-In case you are absolutely sure you do not want to confirm mouse access from
-`sys-usb` to `dom0`, you may add the following line to the top of the file:
-
-```
-sys-usb dom0 allow
-```
-
-(Change `sys-usb` to your desired USB qube.)
-
-
-## How to create a USB qube
-
-If [automatically creating a USB qube for use with a USB
-keyboard](#how-to-create-a-usb-qube-for-use-with-a-usb-keyboard) does not apply
-to your situation, then you may be interested in more general methods for
-creating USB qubes.
-
-You can create a USB qube using the management stack by executing the following
-command as root in dom0:
-
-```
-sudo qubesctl state.sls qvm.sys-usb
-```
-
-
-### Manual creation
-
-You can create a USB qube manually as follows:
-
-1. Read the [PCI devices](/doc/how-to-use-pci-devices/) page to learn how to
- list and identify your USB controllers. Carefully check whether you have a
- USB controller that would be appropriate to assign to a USB qube. Note that
- it should be free of input devices, programmable devices, and any other
- devices that must be directly available to dom0. If you find a free
- controller, note its name and proceed to the next step.
-2. Create a new qube. Give it an appropriate name and color label (recommended:
- `sys-usb`, red).
-3. In the qube's settings, go to the "Devices" tab. Find the USB controller
- that you identified in step 1 in the "Available" list. Move it to the
- "Selected" list by highlighting it and clicking the single arrow `>` button.
- (**Warning:** By assigning a USB controller to a USB qube, it will no longer
- be available to dom0. This can make your system unusable if, for example,
- you have only one USB controller, and you are running Qubes off of a USB
- drive.)
-4. Click `OK`. Restart the qube.
-5. Recommended: Check the box on the "Basic" tab that says "Start VM
- automatically on boot." (This will help to mitigate attacks in which someone
- forces your system to reboot, then plugs in a malicious USB device.)
-
-If the USB qube will not start, please have a look at [this FAQ
-entry](/faq/#i-created-a-usb-vm-and-assigned-usb-controllers-to-it-now-the-usb-vm-wont-boot).
-
-
-## How to hide USB controllers from dom0
-
-USB controllers are automatically hidden from dom0 if you opt to create a USB
-qube during installation. This also occurs automatically if you choose to
-[create a USB qube](#how-to-create-a-usb-qube) using the `qubesctl`
-method. However, if you create a USB qube manually and do not hide USB
-controllers from dom0, there will be a brief period of time during the boot
-process when dom0 will be exposed to your USB controllers (and any attached
-devices). This is a potential security risk, since even brief exposure to a
-malicious USB device could result in dom0 being compromised. There are two
-approaches to this problem:
-
-1. Physically disconnect all USB devices whenever you reboot the host.
-2. Hide (i.e., blacklist) all USB controllers from dom0.
-
-**Warning:** If you use a USB keyboard, hiding your USB controllers from dom0
-could lock you out of your system. See [USB keyboards](#usb-keyboards) for more
-information.
-
-**Warning:** Using a USB AEM device requires dom0 to have access to the USB
-controller to which your USB AEM device is attached. If dom0 cannot read your
-USB AEM device, AEM will hang.
-
-The following procedure will hide all USB controllers from dom0.
-
-### GRUB2 (legacy boot or EFI)
-
-1. Open the file `/etc/default/grub` in dom0.
-2. Find the line that begins with `GRUB_CMDLINE_LINUX`.
-3. Add `rd.qubes.hide_all_usb` to that line.
-4. Save and close the file.
-5. Run the command `grub2-mkconfig -o /boot/grub2/grub.cfg` (legacy boot) or
- `grub2-mkconfig -o /boot/efi/EFI/qubes/grub.cfg` (EFI) in dom0.
-6. Reboot.
-
-
-## How to remove a USB qube
-
-**Warning:** This procedure will result in your USB controller(s) being
-attached directly to dom0.
-
-### GRUB2
-
-1. Shut down the USB qube.
-2. In Qubes Manager, right-click on the USB qube and select "Remove VM."
-3. Open the file `/etc/default/grub` in dom0.
-4. Find the line(s) that begins with `GRUB_CMDLINE_LINUX`.
-5. If `rd.qubes.hide_all_usb` appears anywhere in those lines, remove it.
-6. Save and close the file.
-7. Run the command `grub2-mkconfig -o /boot/grub2/grub.cfg` in dom0.
-8. Reboot.
-
-### Qubes 4.0: EFI
-
-1. Shut down the USB qube.
-2. In Qubes Manager, right-click on the USB qube and select "Remove VM."
-3. Open the file `/boot/efi/EFI/qubes/xen.cfg` in dom0.
-4. Find the line(s) that begins with `kernel=`.
-5. If `rd.qubes.hide_all_usb` appears anywhere in those lines, remove it.
-6. Save and close the file.
-7. Reboot.
+---
\ No newline at end of file
diff --git a/user/advanced-topics/volume-backup-revert.md b/user/advanced-topics/volume-backup-revert.md
index 503511073..fafbdb521 100644
--- a/user/advanced-topics/volume-backup-revert.md
+++ b/user/advanced-topics/volume-backup-revert.md
@@ -6,45 +6,7 @@ redirect_from:
- /en/doc/volume-backup-revert/
- /doc/VolumeBackupRevert/
- /wiki/VolumeBackupRevert/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/advanced-topics/volume-backup-revert.html
ref: 206
title: Volume backup and revert
----
-
-With Qubes, it is possible to revert one of a VM's storage volumes to a previous
-state using the automatic snapshot that is normally saved every time a VM is
-shutdown. (Note that this is a different, lower level activity than the
-[Backup, Restoration, and Migration](/doc/backup-restore/) process.)
-
-In Qubes, when you create a new VM, it's volumes are stored in one of the
-system's [Storage Pools](/doc/storage-pools/). On pool creation, a
-revisions_to_keep default value is set for the entire pool. (For a pool creation
-example, see [Storing app qubes on Secondary Drives](/doc/secondary-storage/).)
-Thereafter, each volume associated with a VM that is stored in this pool
-inherits the pool default revisions_to_keep.
-
-For the private volume associated with a VM named vmname, you may inspect the
-value of revisions_to_keep from the dom0 CLI as follows:
-
-```
-qvm-volume info vmname:private
-```
-
-The output of the above command will also display the "Available revisions
-(for revert)" at the bottom. For a very large volume in a small pool,
-revisions_to_keep should probably be set to the minimum value of 1 to minimize
-the possibility of the pool being accidentally filled up by snapshots. For a
-smaller volume for which you would like to have the future option of reverting,
-revisions_to_keep should probably be set to at least 2. To set
-revisions_to_keep for this same VM / volume example:
-
-```
-qvm-volume config vmname:private revisions_to_keep 2
-```
-
-With the VM stopped, you may revert to an older snapshot of the private volume
-from the the above list of "Available revisions (for revert)", where the last
-item on the list with the largest integer is the most recent snapshot:
-
-```
-qvm-volume revert vmname:private
-```
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/custom-install.md b/user/downloading-installing-upgrading/custom-install.md
index e697f2e78..0ab1bebf8 100644
--- a/user/downloading-installing-upgrading/custom-install.md
+++ b/user/downloading-installing-upgrading/custom-install.md
@@ -5,158 +5,7 @@ layout: doc
permalink: /doc/custom-install/
redirect_from:
- /doc/encryption-config/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/custom-install.html
ref: 152
title: Custom installation
----
-
-In the present context, "custom installation" refers to things like manual partitioning, setting up LVM and RAID, and manual LUKS encryption configuration.
-
-## Installer Defaults
-
-For reference, these are the typical defaults for a single disk with legacy boot:
-
-~~~
-Mount Point: /boot
-Desired Capacity: 1024 MiB
-Device Type: Standard Partition
-File System: ext4
-Name: (none)
-
-Mount Point: /
-Desired Capacity: (your choice)
-Device Type: LVM Thin Provisioning
-Volume Group: qubes_dom0
-File System: ext4
-Name: root
-
-Mount Point: (none)
-Desired Capacity: 10 GiB
-Device Type: LVM
-Volume Group: qubes_dom0
-File System: swap
-Name: swap
-~~~
-
-~~~
-SUMMARY OF CHANGES
-
-Order Action Type Device Mount point
-
-1 Destroy Format Unknown Disk (sda)
-2 Create Format partition table (MSDOS) Disk (sda)
-3 Create Device partition sda1 on Disk
-4 Create Format ext4 sda1 on Disk /boot
-5 Create Device partition sda2 on Disk
-6 Create Format LUKS sda2 on Disk
-7 Create Device luks/dm-crypt luks-sda2
-8 Create Format physical volume (LVM) luks-sda2
-9 Create Device lvmvg qubes_dom0
-10 Create Device lvmthinpool qubes_dom0-pool00
-11 Create Device lvmthinlv qubes_dom0-root
-12 Create Device lvmlv qubes_dom0-swap
-13 Create Format swap qubes_dom0-swap
-14 Create Format ext4 qubes_dom0-root /
-~~~
-
-## Typical Partition Schemes
-
-If you want your partition/LVM scheme to look like the Qubes default but with a few tweaks, follow this example.
-With a single disk, the result should look something like this:
-
-~~~
-NAME SIZE TYPE MOUNTPOINT
-sda disk
-├──sda1 1G part /boot
-└──sda2 part
- └──luks- crypt
- ├──qubes_dom0-pool00_tmeta lvm
- ├──qubes_dom0-pool00_tdata lvm
- └──qubes_dom0-swap lvm [SWAP]
-~~~
-
-## Encryption Defaults
-
-By default, `cryptsetup 1.7.5` will create a LUKS/dm-crypt volume as follows:
-
-~~~
-Version: 1
-Cipher name: aes
-Cipher mode: xts-plain64
-Hash spec: sha256
-~~~
-
-~~~
-$ cryptsetup --help
-[...]
-Default compiled-in device cipher parameters:
- loop-AES: aes, Key 256 bits
- plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripdemd160
- LUKS1: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha256, RNG: /dev/urandom
-~~~
-
-This means that, by default, Qubes inherits these upstream defaults:
-
-- AES-128 [[1]](https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions)[[2]](https://wiki.archlinux.org/index.php/dm-crypt/Device_encryption)[[3]](https://github.com/dyne/Tomb/issues/238)
-- SHA-256
-- `/dev/urandom`
-- probably an `iter-time` of one second
-
-If, instead, you'd like to use AES-256, SHA-512, `/dev/random`, and a longer `iter-time`, for example, you can configure encryption manually by following the instructions below.
-
-## Example: Custom LUKS Configuration
-
-Boot into the Qubes installer, then press `ctrl`+`alt`+`F2` to get a virtual console.
-
-1. (Optional) Wipe the disk:
-
- ```
- # dd if=/dev/zero of=/dev/sda bs=1M status=progress && sync
- ```
-
-2. Create partitions:
-
- ```
- # fdisk /dev/sda
- ```
-
- Follow the steps to create two partitions:
-
- - ~500MiB-1GiB for `/boot`
- - The rest for `/` (might want to leave some for overprovisioning if it's an SSD)
-
-4. Create LUKS encrypted volume:
-
- ```
- # cryptsetup -v --hash sha512 --cipher aes-xts-plain64 --key-size 512 --use-random --iter-time 10000 --verify-passphrase luksFormat /dev/sda2
- ```
-
-5. Open encrypted volume:
-
- ```
- # cryptsetup open /dev/sda2 luks
- ```
-
-6. Create LVM volumes:
-
- ```
- # pvcreate /dev/mapper/luks
- # vgcreate qubes_dom0 /dev/mapper/luks
- # lvcreate -n swap -L 10G qubes_dom0
- # lvcreate -T -l +100%FREE qubes_dom0/pool00
- # lvcreate -V1G -T qubes_dom0/pool00 -n root
- # lvextend -L /dev/qubes_dom0/root
- ```
-
-8. Proceed with the installer. You can do that either by pressing `ctrl`+`alt`+`F6`, or by rebooting and restarting the installation.
- At the disk selection screen, select:
-
- ```
- [x] I will configure partitioning.
- [ ] Encrypt my data.
- ```
-
-9. Decrypt your partition. After decrypting you may assign mount points:
- Open the Unknown list and select `qubes_dom0-root`. Check the reformat box to the right and choose `ext4` as a filesystem. Enter `/` into the Mount Point field at the top.
- Repeat the process for `sda1` and `qubes_dom0-swap`. Those should be assigned to `/boot` and `swap` respectively.
- The default file systems are ext4 for `/boot` and `/`, and swap for `swap`.
- When you are finished, the Unknown list should go away, and all three mount points should be assigned. Proceed normally with the installation from there.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/download-mirrors.md b/user/downloading-installing-upgrading/download-mirrors.md
index e9189a0a9..4e5b36f9a 100644
--- a/user/downloading-installing-upgrading/download-mirrors.md
+++ b/user/downloading-installing-upgrading/download-mirrors.md
@@ -2,26 +2,7 @@
lang: en
layout: doc
permalink: /downloads/mirrors/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/download-mirrors.html
ref: 148
title: Download mirrors
----
-
-**Note:** The Qubes OS Project has no control over or access to data collected at these mirrors.
-
-List of Download Mirrors
-------------------------
-
-The full list of known Qubes download mirrors is available [here](/downloads/#mirrors).
-
-Instructions for Mirror Operators
----------------------------------
-
-If you are interested in offering a mirror for Qubes downloads, thank you!
-We greatly appreciate your offer, and we hope these brief instructions are
-helpful in streamlining the process.
-
-* We are happy to provide rsync or HTTP master.
-* Our preferred frequency is **once every 24 hours**, but anything up to once
- every 6-8 hours is fine.
-* For technical accommodations, please contact [Wojtek](/team/#wojtek-porczyk) or [Marek](/team/#marek-marczykowski-górecki).
-* For website updates and fixes, please contact [Andrew](/team/#andrew-david-wong).
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/downloads.md b/user/downloading-installing-upgrading/downloads.md
index 8ea9d05da..eda4ac5ec 100644
--- a/user/downloading-installing-upgrading/downloads.md
+++ b/user/downloading-installing-upgrading/downloads.md
@@ -5,7 +5,7 @@ permalink: /downloads/
redirect_from:
- /doc/QubesDownloads/
- /wiki/QubesDownloads/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/downloads.html
ref: 2
title: Download Qubes OS
----
-{% include downloads.html %}
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/install-security.md b/user/downloading-installing-upgrading/install-security.md
index b8c58f78c..0a49dd981 100644
--- a/user/downloading-installing-upgrading/install-security.md
+++ b/user/downloading-installing-upgrading/install-security.md
@@ -6,73 +6,7 @@ redirect_from:
- /en/doc/install-security/
- /doc/InstallSecurity/
- /wiki/InstallSecurity/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/install-security.html
ref: 149
title: Installation security
----
-
-There are several security matters to consider before and during the Qubes installation process.
-
-## Trusting your hardware
-
-No operating system, not even Qubes, can help you if you're installing it on hardware that is already compromised.
-This includes CPUs, GPUs, SSDs, HDDs, the motherboard, BIOS/EFI/UEFI, and all relevant firmware.
-Unfortunately, in today's world of undetectable supply chain attacks, there are no easy solutions.
-(Tools like [Anti Evil Maid (AEM)](/doc/anti-evil-maid/) can help with *maintaining* the trustworthiness of your hardware, but not with establishing it in the first place.)
-Some users have chosen to use tools like [Coreboot](https://www.coreboot.org/), [Heads](http://osresearch.net/), and [Skulls](https://github.com/merge/skulls).
-
-## Verifying the Qubes ISO
-
-You should [verify](/security/verifying-signatures/) the PGP signature on your Qubes ISO before you install from it.
-However, if the machine on which you attempt the verification process is already compromised, it could falsely claim that a malicious ISO has a good signature.
-Therefore, in order to be certain that your Qubes ISO is trustworthy, you require a trustworthy machine.
-But how can you be certain *that* machine is trustworthy?
-Only by using another trusted machine, and so forth.
-This is a [classic problem](https://www.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf).
-While various [solutions](https://www.dwheeler.com/trusting-trust/) have been proposed, the point is that each user must ultimately make a choice about whether to trust that a file is non-malicious.
-
-## Choosing an installation medium
-
-So, after taking some measures to verify its integrity and authenticity, you've decided to trust your Qubes ISO.
-Great!
-Now you must decide what sort of medium on which to write it so that you can install from it.
-From a Qubes-specific security perspective, each has certain pros and cons.
-
-### USB drives
-
-Pros:
-
-* Works via USB, including with a [USB qube](/doc/usb-qubes/).
-* Non-fixed capacity.
- (Easy to find one on which the ISO can fit.)
-
-Cons:
-
-* Rewritable.
- (If the drive is mounted to a compromised machine, the ISO could be maliciously altered after it has been written to the drive.)
-* Untrustworthy firmware.
- (Firmware can be malicious even if the drive is new.
- Plugging a drive with rewritable firmware into a compromised machine can also [compromise the drive](https://srlabs.de/badusb/).
- Installing from a compromised drive could compromise even a brand new Qubes installation.)
-
-### Optical discs
-
-Pros:
-
-* Read-only available.
- (If you use read-only media, you don't have to worry about the ISO being maliciously altered after it has been written to the disc.
- You then have the option of verifying the signature on multiple different machines.)
-
-Cons:
-
-* Fixed capacity.
- (If the size of the ISO is larger than your disc, it will be inconvenient.)
-* Passthrough recording (a.k.a., "burning") is not supported by Xen.
- (This mainly applies if you're upgrading from a previous version of Qubes.)
- Currently, the only options for recording optical discs (e.g., CDs, DVDs, BRDs) in Qubes are:
- 1. Use a USB optical drive.
- 2. Attach a SATA optical drive to a secondary SATA controller, then assign this secondary SATA controller to an app qube.
- 3. Use a SATA optical drive attached to dom0.
-
- (Option 3 violates the Qubes security model since it entails transferring an untrusted ISO to dom0 in order to burn it to disc, which leaves only the other two options.)
-
-Considering the pros and cons of each, perhaps a USB drive with non-rewritable (or at least cryptographically-signed) firmware and a physical write-protect switch might be the best option.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/installation-guide.md b/user/downloading-installing-upgrading/installation-guide.md
index 982c40657..ec3d7d181 100644
--- a/user/downloading-installing-upgrading/installation-guide.md
+++ b/user/downloading-installing-upgrading/installation-guide.md
@@ -15,517 +15,7 @@ redirect_from:
- /doc/InstallationGuideR3.0rc1/
- /doc/InstallationGuideR3.0rc2/
- /doc/live-usb/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/installation-guide.html
ref: 153
title: Installation guide
----
-
-Welcome to the Qubes OS installation guide! This guide will walk you through
-the process of installing Qubes. Please read it carefully and thoroughly, as it
-contains important information for ensuring that your Qubes OS installation is
-functional and secure.
-
-## Pre-installation
-
-### Hardware requirements
-
-
-
- Warning: Qubes has no control over what happens on your computer
- before you install it. No software can provide security if it is installed on
- compromised hardware. Do not install Qubes on a computer you don't trust.
- See installation security for more
- information.
-
-
-Qubes OS has very specific [system requirements](/doc/system-requirements/). To
-ensure compatibility, we strongly recommend using [Qubes-certified
-hardware](/doc/certified-hardware/). Other hardware may require you to perform
-significant troubleshooting. You may also find it helpful to consult the
-[Hardware Compatibility List](/hcl/).
-
-Even on supported hardware, you must ensure that [IOMMU-based
-virtualization](https://en.wikipedia.org/wiki/Input%E2%80%93output_memory_management_unit#Virtualization)
-is activated in the BIOS or UEFI. Without it, Qubes OS won't be able to enforce
-isolation. For Intel-based boards, this setting is called Intel Virtualization
-for Directed I/O (**Intel VT-d**) and for AMD-based boards, it is called AMD
-I/O Virtualization Technology (or simply **AMD-Vi**). This parameter should be
-activated in your computer's BIOS or UEFI, alongside the standard
-Virtualization (**Intel VT-x**) and AMD Virtualization (**AMD-V**) extensions.
-This [external
-guide](https://web.archive.org/web/20200112220913/https://www.intel.in/content/www/in/en/support/articles/000007139/server-products.html)
-made for Intel-based boards can help you figure out how to enter your BIOS or
-UEFI to locate and activate those settings. If those settings are not nested
-under the Advanced tab, you might find them under the Security tab.
-
-
-
- Note: Qubes OS is not meant to be installed inside a virtual machine
- as a guest hypervisor. In other words, nested virtualization is not
- supported. In order for a strict compartmentalization to be enforced, Qubes
- OS needs to be able to manage the hardware directly.
-
-
-### Copying the ISO onto the installation medium
-
-Pick the most secure existing computer and OS you have available for
-downloading and copying the Qubes ISO onto the installation medium.
-[Download](/downloads/) a Qubes ISO.
-
-
-
- Warning: Any file you download from the internet could be malicious,
- even if it appears to come from a trustworthy source. Our philosophy is to distrust the
- infrastructure. Regardless of how you acquire your Qubes ISO, verify its authenticity before
- continuing.
-
-
-Once the ISO has been verified as authentic, you should copy it onto the
-installation medium of your choice, such as a USB drive, dual-layer DVD,
-or Blu-ray disc. The size of each Qubes ISO is available on the
-[downloads](/downloads/) page by hovering over the download button. The
-instructions below assume you've chosen a USB drive as your medium. If you've
-chosen a different medium, please adapt the instructions accordingly.
-
-
-
- Warning: Be careful to choose the correct device when copying the ISO,
- or you may lose data. We strongly recommended making a full backup before
- modifying any devices.
-
-
-#### Linux ISO to USB
-
-On Linux, if you choose to use a USB drive, copy the ISO onto the USB device,
-e.g. using `dd`:
-
-```
-$ sudo dd if=Qubes-RX-x86_64.iso of=/dev/sdY status=progress bs=1048576 conv=fsync
-```
-
-Change `Qubes-RX-x86_64.iso` to the filename of the version you're installing,
-and change `/dev/sdY` to the correct target device e.g., `/dev/sdc`). Make sure
-to write to the entire device (e.g., `/dev/sdc`) rather than just a single
-partition (e.g., `/dev/sdc1`).
-
-#### Windows ISO to USB
-
-On Windows, you can use the [Rufus](https://rufus.akeo.ie/) tool to write the
-ISO to a USB key. Be sure to select "Write in DD Image mode" *after* selecting
-the Qubes ISO and pressing "START" on the Rufus main window.
-
-
-
- Note: Using Rufus to create the installation medium means that you
- won't be able
- to choose the "Test this media and install Qubes OS" option mentioned in the
- example below. Instead, choose the "Install Qubes OS" option.
-
-
-[](/attachment/doc/rufus-menu.png)
-
-[](/attachment/doc/rufus-dd-image-mode.png)
-
-## Installation
-
-This section will demonstrate a simple installation using mostly default
-settings.
-
-If you are an advanced user, and you would like to customize your installation,
-please see [custom installation](/doc/custom-install/). Otherwise, follow the
-instructions below.
-
-### Getting to the boot screen
-
-"Booting" is the process of starting your computer. When a computer boots up,
-it first runs low-level software before the main operating system. Depending on
-the computer, this low-level software is may be called the
-["BIOS"](https://en.wikipedia.org/wiki/BIOS) or
-["UEFI"](https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface).
-
-Since you're installing Qubes OS, you'll need to access your computer's BIOS or
-UEFI menu so that you can tell it to boot from the USB drive to which you just
-copied the Qubes installer ISO.
-
-To begin, power off your computer and plug the USB drive into a USB port, but
-don't press the power button yet. Right after you press the power button,
-you'll have to immediately press a specific key to enter the BIOS or UEFI menu.
-The key to press varies from brand to brand. `Esc`, `Del`, and `F10` are common
-ones. If you're not sure, you can search the web for ` BIOS
-key` or ` UEFI key` (replacing `` with your
-specific computer model) or look it up in your computer's manual.
-
-Once you know the key to press, press your computer's power button, then
-repeatedly press that key until you've entered your computer's BIOS or UEFI
-menu. To give you and idea of what you should be looking for, we've provided a
-couple of example photos below.
-
-Here's an example of what the BIOS menu looks like on a ThinkPad T430:
-
-[](/attachment/doc/Thinkpad-t430-bios-main.jpg)
-
-And here's an example of what a UEFI menu looks like:
-
-[](/attachment/doc/uefi.jpeg)
-
-Once you access your computer's BIOS or UEFI menu, you'll want to go to the
-"boot menu," which is where you tell your computer which devices to boot from.
-The goal is to tell the computer to boot from your USB drive so that you can
-run the Qubes installer. If your boot menu lets you select which device to boot
-from first, simply select your USB drive. (If you have multiple entries that
-all look similar to your USB drive, and you're not sure which one is correct,
-one option is just to try each one until it works.) If, on the other hand, your
-boot menu presents you with a list of boot devices in order, then you'll want
-to move your USB drive to the top so that the Qubes installer runs before
-anything else.
-
-Once you're done on the boot menu, save your changes. How you do this depends
-on your BIOS or UEFI, but the instructions should be displayed right there on
-the screen or in a nearby tab. (If you're not sure whether you've saved your
-changes correctly, you can always reboot your computer and go back into the
-boot menu to check whether it still reflects your changes.) Once your BIOS or
-UEFI is configured the way you want it, reboot your computer. This time, don't
-press any special keys. Instead, let the BIOS or UEFI load and let your
-computer boot from your USB drive. If you're successful in this step, after a
-few seconds you'll be presented with the Qubes installer screen:
-
-[](/attachment/doc/boot-screen.png)
-
-
-
- Note: When installing Qubes OS 4.0 on UEFI, there is intentionally no
- boot menu. It goes straight to the installer. The boot menu will be back in
- Qubes OS 4.1.
-
-
-From here, you can navigate the boot screen using the arrow keys on your
-keyboard. Pressing the "Tab" key will reveal options. You can choose one of
-three options:
-
-* Install Qubes OS
-* Test this media and install Qubes OS
-* Troubleshooting
-
-Select the option to test this media and install Qubes OS.
-
-If the boot screen does not appear, there are several options to troubleshoot.
-First, try rebooting your computer. If it still loads your currently installed
-operating system or does not detect your installation medium, make sure the
-boot order is set up appropriately. The process to change the boot order varies
-depending on the currently installed system and the motherboard manufacturer.
-If **Windows 10** is installed on your machine, you may need to follow specific
-instructions to change the boot order. This may require an [advanced
-reboot](https://support.microsoft.com/en-us/help/4026206/windows-10-find-safe-mode-and-other-startup-settings).
-
-### The installer home screen
-
-On the first screen, you are asked to select the language that will be used
-during the installation process. When you are done, select **Continue**.
-
-[](/attachment/doc/welcome-to-qubes-os-installation-screen.png)
-
-Prior to the next screen, a compatibility test runs to check whether
-IOMMU-virtualization is active or not. If the test fails, a window will pop up.
-
-[](/attachment/doc/unsupported-hardware-detected.png)
-
-Do not panic. It may simply indicate that IOMMU-virtualization hasn't been
-activated in the BIOS or UEFI. Return to the [hardware
-requirements](#hardware-requirements) section to learn how to activate it. If
-the setting is not configured correctly, it means that your hardware won't be
-able to leverage some Qubes security features, such as a strict isolation of
-the networking and USB hardware.
-
-If the test passes, you will reach the installation summary screen. The
-installer loads Xen right at the beginning. If you can see the installer's
-graphical screen, and you pass the compatibility check that runs immediately
-afterward, Qubes OS is likely to work on your system!
-
-Like Fedora, Qubes OS uses the Anaconda installer. Those that are familiar with
-RPM-based distributions should feel at home.
-
-### Installation summary
-
-
-
- Did you know? The Qubes OS installer is completely offline. It doesn't
- even load any networking drivers, so there is no possibility of
- internet-based data leaks or attacks during the installation process.
-
-
-The Installation summary screen allows you to change how the system will be
-installed and configured, including localization settings. At minimum, you are
-required to select the storage device on which Qubes OS will be installed.
-
-[](/attachment/doc/installation-summary-not-ready.png)
-
-### Localization
-
-Let's assume you wish to add a German keyboard layout. Go to Keyboard Layout,
-press the "Plus" symbol, search for "German" as indicated in the screenshot and
-press "Add". If you want it be your default language, select the "German" entry
-in the list and press the arrow button. Click on "Done" in the upper left
-corner, and you're ready to go!
-
-[](/attachment/doc/keyboard-layout-selection.png)
-
-The process to select a new language is similar to the process to select a new
-keyboard layout. Follow the same process in the "Language Support" entry.
-
-[](/attachment/doc/language-support-selection.png)
-
-You can have as many keyboard layout and languages as you want. Post-install,
-you will be able to switch between them and install others.
-
-Don't forget to select your time and date by clicking on the Time & Date entry.
-
-[](/attachment/doc/time-and-date.png)
-
-### Software
-
-[](/attachment/doc/add-ons.png)
-
-On the software selection tab, you can choose which software to install in
-Qubes OS. Two options are available:
-
-* **Debian:** Select this option if you would like to use
- [Debian](/doc/templates/debian/) qubes in addition to the default Fedora
- qubes.
-* **Whonix:** Select this option if you would like to use
- [Whonix](https://www.whonix.org/wiki/Qubes) qubes. Whonix allows you to use
- [Tor](https://www.torproject.org/) securely within Qubes.
-
-Whonix lets you route some or all of your network traffic through Tor for
-greater privacy. Depending on your threat model, you may need to install Whonix
-templates right away.
-
-Regardless of your choices on this screen, you will always be able to install
-these and other [templates](/doc/templates/) later. If you're short on disk
-space, you may wish to deselect these options.
-
-By default, Qubes OS comes preinstalled with the lightweight Xfce4 desktop
-environment. Other desktop environments will be available to you after the
-installation is completed, though they may not be officially supported (see
-[Advanced Topics](/doc/#advanced-topics)).
-
-Press **Done** to go back to the installation summary screen.
-
-### Installation destination
-
-Under the System section, you must choose the installation destination. Select
-the storage device on which you would like to install Qubes OS.
-
-
-
- Warning: Be careful to choose the correct installation target, or you
- may lose data. We strongly recommended making a full backup before
- proceeding.
-
-
-Your installation destination can be an internal or external storage drive,
-such as an SSD, HDD, or USB drive. The installation destination must have a
-least 32 GiB of free space available.
-
-
-
- Note: The installation destination cannot be the same as the
- installation medium. For example, if you're installing Qubes OS from
- a USB drive onto a USB drive, they must be two distinct USB drives,
- and they must both be plugged into your computer at the same time. (Note:
- This may not apply to advanced users who partition their devices
- appropriately.)
-
-
-Installing an operating system onto a USB drive can be a convenient way to try
-Qubes. However, USB drives are typically much slower than internal SSDs. We
-recommend a very fast USB 3.0 drive for decent performance. Please note that a
-minimum storage of 32 GiB is required. If you want to install Qubes OS onto a
-USB drive, just select the USB device as the target installation device. Bear
-in mind that the installation process is likely to take longer than it would on
-an internal storage device.
-
-[](/attachment/doc/select-storage-device.png)
-
-
-
- Did you know? Qubes OS uses full-disk AES encryption (FDE) via LUKS by
- default.
-
-
-As soon as you press **Done**, the installer will ask you to enter a passphrase
-for disk encryption. The passphrase should be complex. Make sure that your
-keyboard layout reflects what keyboard you are actually using. When you're
-finished, press **Done**.
-
-
-
- Warning: If you forget your encryption passphrase, there is no way to
- recover it.
-
-
-[](/attachment/doc/select-storage-passphrase.png)
-
-When you're ready, press **Begin Installation**.
-
-[](/attachment/doc/installation-summary-ready.png)
-
-### Create your user account
-
-While the installation process is running, you can create your user account.
-This is what you'll use to log in after disk decryption and when unlocking the
-screen locker. This is a purely local, offline account in dom0. By design,
-Qubes OS is a single-user operating system, so this is just for you.
-
-Select **User Creation** to define a new user with administrator privileges and
-a password. Just as for the disk encryption, this password should be complex.
-The root account is deactivated and should remain as such.
-
-[](/attachment/doc/account-name-and-password.png)
-
-When the installation is complete, press **Reboot**. Don't forget to remove the
-installation medium, or else you may end up seeing the installer boot screen
-again.
-
-## Post-installation
-
-### First boot
-
-If the installation was successful, you should now see the GRUB menu during the
-boot process.
-
-[](/attachment/doc/grub-boot-menu.png)
-
-Just after this screen, you will be asked to enter your encryption passphrase.
-
-[](/attachment/doc/unlock-storage-device-screen.png)
-
-### Initial Setup
-
-You're almost done. Before you can start using Qubes OS, some configuration is
-needed.
-
-[](/attachment/doc/initial-setup-menu.png)
-
-By default, the installer will create a number of qubes (depending on the
-options you selected during the installation process). These are designed to
-give you a more ready-to-use environment from the get-go.
-
-[](/attachment/doc/initial-setup-menu-configuration.png)
-
-Let's briefly go over the options:
-
-* **Create default system qubes:**
- These are the core components of the system, required for things like
- internet access.
-* **Create default application qubes:**
- These are how you compartmentalize your digital life. There's nothing special
- about the ones the installer creates. They're just suggestions that apply to
- most people. If you decide you don't want them, you can always delete them
- later, and you can always create your own.
-* **Create Whonix Gateway and Workstation qubes:**
- If you want to use Whonix, you should select this option.
- * **Enabling system and template updates over the Tor anonymity network using
- Whonix:**
- If you select this option, then whenever you install or update software in
- dom0 or a template, the internet traffic will go through Tor.
-* **Create USB qube holding all USB controllers:**
- Just like the network qube for the network stack, the USB qube isolates the
- USB controllers.
- * **Use sys-net qube for both networking and USB devices:**
- You should select this option if you rely on a USB device for network access,
- such as a USB modem or a USB Wi-Fi adapter.
-* **Do not configure anything:**
- This is for very advanced users only. If you select this option, you'll have
- to set everything up manually afterward.
-
-When you're satisfied with you choices, press **Done**. This configuration
-process may take a while, depending on the speed and compatibility of your
-system.
-
-After the configuration is done, you will be greeted by the login screen. Enter
-your password and log in.
-
-[](/attachment/doc/login-screen.png)
-
-Congratulations, you are now ready to use Qubes OS!
-
-[](/attachment/doc/desktop-menu.png)
-
-## Next steps
-
-### Updating
-
-Next, [update](/doc/how-to-update/) your installation to ensure you have
-the latest security updates. Frequently updating is one of the best ways to
-remain secure against new threats.
-
-### Security
-
-The Qubes OS Project occasionally issues [Qubes Security Bulletins
-(QSBs)](/security/qsb/) as part of the [Qubes Security Pack
-(qubes-secpack)](/security/pack/). It is important to make sure that you
-receive all QSBs in a timely manner so that you can take action to keep your
-system secure. (While [updating](#updating) will handle most security needs,
-there may be cases in which additional action from you is required.) For this
-reason, we strongly recommend that every Qubes user subscribe to the
-[qubes-announce](/support/#qubes-announce) mailing list.
-
-In addition to QSBs, the Qubes OS Project also publishes
-[Canaries](/security/canary/), XSA summaries, template releases and
-end-of-life notices, and other items of interest to Qubes users. Since these
-are not essential for all Qubes users to read, they are not sent to
-[qubes-announce](/support/#qubes-announce) in order to keep the volume on that
-list low. However, we expect that most users, especially novice users, will
-find them helpful. If you are interested in these additional items, we
-encourage you to subscribe to the [Qubes News RSS feed](/feed.xml) or join one
-of our other [venues](/support/), where these news items are also announced.
-
-For more information about Qubes OS Project security, please see the [security
-center](/security/).
-
-### Backups
-
-It is extremely important to make regular backups so that you don't lose your
-data unexpectedly. The [Qubes backup
-system](/doc/how-to-back-up-restore-and-migrate/) allows you to do this
-securely and easily.
-
-### Submit your HCL report
-
-Consider giving back to the Qubes community and helping other users by
-[generating and submitting a Hardware Compatibility List (HCL)
-report](/doc/how-to-use-the-hcl/#generating-and-submitting-new-reports).
-
-### Get Started
-
-Find out [Getting Started](/doc/getting-started/) with Qubes, check out
-the other [How-To Guides](/doc/#how-to-guides), and learn about
-[Templates](/doc/#templates).
-
-## Getting help
-
-* We work very hard to make the [documentation](/doc/) accurate, comprehensive
- useful and user friendly. We urge you to read it! It may very well contain
- the answers to your questions. (Since the documentation is a community
- effort, we'd also greatly appreciate your help in
- [improving](/doc/how-to-edit-the-documentation/) it!)
-
-* If issues arise during installation, see the [Installation
- Troubleshooting](/doc/installation-troubleshooting) guide.
-
-* If you don't find your answer in the documentation, please see [Help,
- Support, Mailing Lists, and Forum](/support/) for places to ask.
-
-* Please do **not** email individual members of the Qubes team with questions
- about installation or other problems. Instead, please see [Help, Support,
- Mailing Lists, and Forum](/support/) for appropriate places to ask questions.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/supported-releases.md b/user/downloading-installing-upgrading/supported-releases.md
index 7f2b9d53c..0b817c8fa 100644
--- a/user/downloading-installing-upgrading/supported-releases.md
+++ b/user/downloading-installing-upgrading/supported-releases.md
@@ -4,124 +4,7 @@ layout: doc
permalink: /doc/supported-releases/
redirect_from:
- /doc/supported-versions/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/supported-releases.html
ref: 154
title: Supported releases
----
-
-This page details the level and period of support for releases of operating
-systems in the Qubes ecosystem.
-
-## Qubes OS
-
-Qubes OS releases are supported for **six months** after each subsequent major
-or minor release (see [Version Scheme](/doc/version-scheme/)). The current
-release and past major releases are always available on the
-[Downloads](/downloads/) page, while all ISOs, including past minor releases,
-are available from our [download mirrors](/downloads/#mirrors).
-
-| Qubes OS | Start Date | End Date | Status |
-| ----------- | ---------- | ---------- | --------------------- |
-| Release 1 | 2012-09-03 | 2015-03-26 | Unsupported |
-| Release 2 | 2014-09-26 | 2016-04-01 | Unsupported |
-| Release 3.0 | 2015-10-01 | 2016-09-09 | Unsupported |
-| Release 3.1 | 2016-03-09 | 2017-03-29 | Unsupported |
-| Release 3.2 | 2016-09-29 | 2019-03-28 | Unsupported |
-| Release 4.0 | 2018-03-28 | 2022-08-04 | Unsupported |
-| Release 4.1 | 2022-02-04 | TBA | Supported |
-| Release 4.2 | TBA | TBA | [In development](https://github.com/QubesOS/qubes-issues/issues?utf8=%E2%9C%93&q=is%3Aissue+milestone%3A%22Release+4.2%22) |
-
-### Note on patch releases
-
-Please note that patch releases, such as 3.2.1 and 4.0.1, do not designate
-separate, new major or minor releases of Qubes OS. Rather, they designate their
-respective major or minor releases, such as 3.2 and 4.0, inclusive of all
-package updates up to a certain point. For example, installing Release 4.0 and
-fully updating it results in the same system as installing Release 4.0.1.
-Therefore, patch releases are not displayed as separate rows on any of the
-tables on this page.
-
-## Dom0
-
-The table below shows the OS used for dom0 in each Qubes OS release.
-
-| Qubes OS | Dom0 OS |
-| ----------- | --------- |
-| Release 1 | Fedora 13 |
-| Release 2 | Fedora 18 |
-| Release 3.0 | Fedora 20 |
-| Release 3.1 | Fedora 20 |
-| Release 3.2 | Fedora 23 |
-| Release 4.0 | Fedora 25 |
-| Release 4.1 | Fedora 32 |
-
-### Note on dom0 and EOL
-
-Dom0 is isolated from domUs. DomUs can access only a few interfaces, such as
-Xen, device backends (in the dom0 kernel and in other VMs, such as the NetVM),
-and Qubes tools (gui-daemon, qrexec-daemon, etc.). These components are
-[security-critical](/doc/security-critical-code/), and we provide updates for
-all of them (when necessary), regardless of the support status of the base
-distribution. For this reason, we consider it safe to continue using a given
-base distribution in dom0 even after it has reached end-of-life (EOL).
-
-## Templates
-
-The following table shows select [template](/doc/templates/) releases that are
-currently supported. Currently, only [Fedora](/doc/templates/fedora/) and
-[Debian](/doc/templates/debian/) templates are officially supported by the
-Qubes OS Project. [Whonix](https://www.whonix.org/wiki/Qubes) templates are
-supported by our partner, the [Whonix Project](https://www.whonix.org/). Qubes
-support for each template ends when that upstream release reaches end-of-life
-(EOL), even if that release is included in the table below. Please see below for
-distribution-specific notes.
-
-It is the responsibility of each distribution to clearly notify its users in
-advance of its own EOL dates, and it is users' responsibility to heed these
-notices by upgrading to supported releases. As a courtesy to Qubes users, we
-attempt to pass along any upstream EOL notices we receive for
-officially-supported templates, but our ability to do this reliably is
-dependent on the upstream distribution's practices. If a distribution provides
-a mailing list similar to [qubes-announce](/support/#qubes-announce), which
-allows us to receive only very important, infrequent messages, including EOL
-announcements, we are much more likely to be able to pass along EOL notices to
-Qubes users reliably. Qubes users can always check the EOL status of an
-upstream release on the upstream distribution's website (see [Fedora
-EOL](https://fedoraproject.org/wiki/End_of_life) and [Debian
-Releases](https://wiki.debian.org/DebianReleases)).
-
-| Qubes OS | Fedora | Debian | Whonix |
-| ----------- | ------ | --------------------------------------------------- | ------ |
-| Release 4.1 | 35, 36 | 10 (Buster), 11 (Bullseye) | 16 |
-
-### Note on Debian support
-
-Debian releases have two EOL dates: regular and [long-term support
-(LTS)](https://wiki.debian.org/LTS). See [Debian Production
-Releases](https://wiki.debian.org/DebianReleases#Production_Releases) for a
-chart that illustrates this. Qubes support ends at the *regular* EOL date,
-*not* the LTS EOL date, unless a specific exception has been made.
-
-### Note on Whonix support
-
-[Whonix](https://www.whonix.org/wiki/Qubes) templates are supported by our
-partner, the [Whonix Project](https://www.whonix.org/). The Whonix Project has
-set its own support policy for Whonix templates in Qubes.
-
-This policy requires Whonix template users to stay reasonably close to the
-cutting edge by upgrading to new stable releases of Qubes OS and Whonix
-templates within a month of their respective releases. To be precise:
-
-* One month after a new stable version of Qubes OS is released, Whonix
- templates will no longer be supported on any older release of Qubes OS. This
- means that users who wish to continue using Whonix templates on Qubes must
- always upgrade to the latest stable Qubes OS release within one month of its
- release.
-
-* One month after new stable versions of Whonix templates are released, older
- releases of Whonix templates will no longer be supported. This means that
- users who wish to continue using Whonix templates on Qubes must always
- upgrade to the latest stable Whonix template releases within one month of
- their release.
-
-We aim to announce both types of events one month in advance in order to remind
-users to upgrade.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/testing.md b/user/downloading-installing-upgrading/testing.md
index d68a7a545..14b7293ce 100644
--- a/user/downloading-installing-upgrading/testing.md
+++ b/user/downloading-installing-upgrading/testing.md
@@ -3,105 +3,7 @@ advanced: true
lang: en
layout: doc
permalink: /doc/testing/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/testing.html
ref: 147
title: Testing new releases and updates
----
-
-Testing new Qubes OS releases and updates is one of the most helpful ways in
-which you can [contribute](/doc/contributing/) to the Qubes OS Project. If
-you're interested in helping with this, please [join the testing
-team](https://forum.qubes-os.org/t/joining-the-testing-team/5190). There are
-several different types of testing, which we'll cover below.
-
-**Warning:** Software testing is intended for advanced users and developers.
-You should only attempt to do this if you know what you're doing. Never rely on
-code that is in testing for critical work!
-
-## Releases
-
-How to test upcoming Qubes OS releases:
-
-* Use [qubes-builder](/doc/qubes-builder/) to build the latest release.
-* Test the latest release candidate (RC), if one is currently available.
-* (No support) Experiment with devel alpha ISOs found from time to time at
- [Qubes OpenQA](https://openqa.qubes-os.org/).
-
-Please make sure to [report any bugs you encounter](/doc/issue-tracking/).
-
-See [Version Scheme](/doc/version-scheme/) for details about release versions
-and schedules. See [Release Checklist](/doc/releases/todo/) for details about
-the RC process.
-
-## Updates
-
-How to test updates:
-
-* Enable [dom0 testing
- repositories](/doc/how-to-install-software-in-dom0/#testing-repositories).
-* Enable [template testing
- repositories](/doc/how-to-install-software/#testing-repositories).
-
-Every new update is first uploaded to the `security-testing` repository if it
-is a security update or `current-testing` if it is a normal update. The update
-remains in `security-testing` or `current-testing` for a minimum of one week.
-On occasion, an exception is made for a particularly critical security update,
-which is immediately pushed to the `current` stable repository. In general,
-however, security updates remain in `security-testing` for two weeks before
-migrating to `current`. Normal updates generally remain in `current-testing`
-until they have been sufficiently tested by the community, which can last weeks
-or even months, depending on the amount of feedback received (see [Providing
-feedback](#providing-feedback)).
-
-"Sufficient testing" is, in practice, a fluid term that is up the developers'
-judgment. In general, it means either that no negative feedback and at least
-one piece of positive feedback has been received or that the package has been
-in `current-testing` for long enough, depending on the component and the
-complexity of the changes.
-
-A limitation of the current testing setup is that it is only possible to
-migrate the *most recent version* of a package from `current-testing` to
-`current`. This means that, if a newer version of a package is uploaded to
-`current-testing`, it will no longer be possible to migrate any older versions
-of that same package from `current-testing` to `current`, even if one of those
-older versions has been deemed stable enough. While this limitation can be
-inconvenient, the benefits outweigh the costs, since it greatly simplifies the
-testing and reporting process.
-
-## Templates
-
-How to test [templates](/doc/templates/):
-
-* For official templates, enable the `qubes-templates-itl-testing` repository,
- then [install](/doc/templates/#installing) the desired template.
-* For community templates, enable the `qubes-templates-community-testing`
- repository, then [install](/doc/templates/#installing) the desired template.
-
-To temporarily enable any of these repos, use the `--enablerepo=`
-option. Example commands:
-
-```
-sudo qubes-dom0-update --enablerepo=qubes-templates-itl-testing
-sudo qubes-dom0-update --enablerepo=qubes-templates-community-testing
-```
-
-To enable or disable any of these repos permanently, change the corresponding
-`enabled` value to `1` in `/etc/yum.repos.d/qubes-templates.repo`.
-
-## Providing feedback
-
-Since the whole point of testing software is to discover and fix bugs, your
-feedback is an essential part of this process.
-
-We use an [automated build
-process](https://github.com/QubesOS/qubes-infrastructure/blob/master/README.md).
-For every package that is uploaded to a testing repository, a GitHub issue is
-created in the
-[updates-status](https://github.com/QubesOS/updates-status/issues) repository
-for tracking purposes. We welcome any kind of feedback on any package in any
-testing repository. Even a simple or on
-the package's associated issue would help us to decide whether the package is
-ready to be migrated to a stable repository. If you [report a
-bug](/doc/issue-tracking/) in a package that is in a testing repository, please
-reference the appropriate issue in
-[updates-status](https://github.com/QubesOS/updates-status/issues).
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/2.md b/user/downloading-installing-upgrading/upgrade/2.md
index e46f637cb..600574a10 100644
--- a/user/downloading-installing-upgrading/upgrade/2.md
+++ b/user/downloading-installing-upgrading/upgrade/2.md
@@ -8,57 +8,7 @@ redirect_from:
- /doc/UpgradeToR2/
- /doc/UpgradeToR2rc1/
- /wiki/UpgradeToR2rc1/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/2.html
ref: 156
title: Upgrading to R2
----
-
-Current Qubes R2 Beta 3 (R2B3) systems can be upgraded in-place to the latest R2 (R2) release by following the procedure below.
-
-**Before attempting either an in-place upgrade or a clean installation, we strongly recommend that users back up the system by using the built-in [backup tool](/doc/backup-restore/).**
-
-Upgrade Template and Standalone VM(s)
--------------------------------------
-
-- Qubes R2 comes with new template based on Fedora 20. You can upgrade existing template according to procedure described [here](/doc/templates/fedora/#upgrading).
-
-- **It also possible to download a new Fedora 20-based template from our repositories**. To do this please first upgrade the Dom0 distro as described in the section below.
-
-While technically it is possible to use old Fedora 18 template on R2, it is strongly recommended to upgrade all the templates and Standalone VMs, because Fedora 18 no longer receive security updates.
-
-By default, in Qubes R2, there is only one template, however users are free to create more templates for special purposes, as well as Standalone VMs. If more than one template and/or Standalone VMs are used, then it is recommended to upgrade/replace all of them. More information on using multiple templates, as well as Standalone VMs, can be found [here](/doc/software-update-vm/).
-
-Upgrading dom0
---------------
-
-Note that dom0 in R2 is based on Fedora 20, in contrast to Fedora 18 in previous release, so this operation will upgrade a lot of packages.
-
-1. Open terminal in Dom0. E.g. Start-\>System Settings-\>Konsole.
-
-1. Install all the updates for Dom0:
-
- ~~~
- sudo qubes-dom0-update
- ~~~
-
-After this step you should have `qubes-release-2-5` in your Dom0. Important: if you happen to have `qubes-release-2-6*` then you should downgrade to `qubes-release-2-5`! The `qubes-release-2-6*` packages have been uploaded to the testing repos and were kept there for a few hours, until we realized they bring incorrect repo definitions and so we removed them and also have changed the update procedure a bit (simplifying it).
-
-1. Upgrade dom0 to R2:
-
-Note: be sure that the VM used as a update-downloading-vm (by default its the firewallvm based on the default template) has been updated to the latest Qubes packages, specifically `qubes-core-vm-2.1.33` or later. This doesn't imply that the VM must already be upgraded to fc20 -- for Dom0 upgrade we could still use an fc18-based VM (updatevm) it is only important to install the latest Qubes packages there.
-
-~~~
-sudo qubes-dom0-update qubes-dom0-dist-upgrade
-sudo qubes-dom0-update
-~~~
-
-1. If above step completed successfully you should have `qubes-release-2-9` or later. If not, repeat above step with additional `--clean` option.
-
-4a. If you chose not to upgrade your fc18 templates, but instead to download our new fc20-based template you should now be able to do that by simply typing:
-
-~~~
-sudo qubes-dom0-update qubes-template-fedora-20-x64
-~~~
-
-1. Reboot the system.
-
-Please note that if you use Anti Evil Maid, then it won't be able to unseal the passphrase this time, because the Xen, kernel, and initramfs binaries have changed. Once the system boots up again, you could reseal your Anti Evil Maid's passphrase to the new configuration. Please consult Anti Evil Maid documentation for explanation on how to do that.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/2b1.md b/user/downloading-installing-upgrading/upgrade/2b1.md
index 0d564fb5b..e20e081bd 100644
--- a/user/downloading-installing-upgrading/upgrade/2b1.md
+++ b/user/downloading-installing-upgrading/upgrade/2b1.md
@@ -7,70 +7,7 @@ redirect_from:
- /en/doc/upgrade-to-r2b1/
- /doc/UpgradeToR2B1/
- /wiki/UpgradeToR2B1/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/2b1.html
ref: 163
title: Upgrading to R2B1
----
-
-**Note: Qubes R2 Beta 1 is no longer supported! Please install or upgrade to a newer Qubes R2.**
-
-**Note: This page is kept for historical reasons only! Do not follow the instructions below'''**
-
-Existing users of Qubes R1 (but not R1 betas!) can upgrade their systems to the latest R2 beta release by following the procedure below. As usual, it is advisable to backup the system before proceeding with the upgrade
-
-Upgrade all Template and Standalone VM(s)
------------------------------------------
-
-By default, in Qubes R1, there is only one template, however users are free to create more templates for special purposes, as well as Standalone VMs. More information on using multiple templates, as well as Standalone VMs, can be found [here](/doc/templates/) and [here](/doc/standalone-and-hvm/). The steps described in this section should be repeated in *all* user's Template and Standalone VMs.
-
-1. Open terminal in the template (or standalone VM). E.g. use the Qubes Manager's right-click menu and choose Run Command in VM and type `gnome-terminal` there.
-2. Install `qubes-upgrade-vm` package (this package brings in R2 repo definitions and R2 keys)
-
- ~~~
- sudo yum install qubes-upgrade-vm
- ~~~
-
-3. Proceed with normal update in the template (this should bring in also the R2 packages for the VMs):
-
- ~~~
- sudo yum update
- ~~~
-
- The installer (yum) will prompt to accept the new Qubes R2 signing key:
-
- ~~~
- Importing GPG key 0x0A40E458:
- Userid : "Qubes OS Release 2 Signing Key"
- Fingerprint: 3f01 def4 9719 158e f862 66f8 0c73 b9d4 0a40 e458
- Package : qubes-upgrade-vm-1.0-1.fc17.x86_64 (@qubes-vm-current)
- From : /etc/pki/rpm-gpg/RPM-GPG-KEY-upgrade-qubes-2-primary
- Is this ok [y/N]:
- ~~~
-
- If you see (as is the case on the "screenshot" above) that the new key was imported from a local filesystem (`/etc/pki/rpm-gpg/...`) you can safely accept the key, without checking its fingerprint. This is because there were only two ways for such a key to make it to your template's filesystem:
-
-- via a legitimate RPM package previously installed (in our case it was the `qubes-upgrade-vm` RPM). Such an RPM must have been signed by one of the keys you decided to trust previously, by default this would be either via the Qubes R1 signing key, or Fedora 17 signing key.
-- via system compromise or via some illegal RPM package (e.g. Fedora released package pretending to bring new Firefox). In that case, however, your VM is already compromised, and it careful checking of the new R2 key would not change this situation to any better one. The game is lost for this VM anyway (and all VMs based on this template).
-
-1. Shut down the VM.
-
-Upgrade Dom0
-------------
-
-Be sure to do steps described in this section after *all* your template and standalone VMs got updated as described in the section above.
-
-1. Open terminal in Dom0. E.g. Start-\>System Settings-\>Konsole.
-2. Upgrade the `qubes-release` package to the latest version which brings in new repo definitions and R2 signing keys:
-
- ~~~
- sudo qubes-dom0-update qubes-release
- ~~~
-
- This should install `qubes-release-1-6` in your Dom0.
-
-3. Install R2 packages:
-
- ~~~
- sudo qubes-dom0-update --releasever=2
- ~~~
-
-4. Reboot your system. Please note that if you use Anti Evil Maid, then it won't be able to unseal the passphrase this time, because the Xen, kernel, and initramfs binaries have changed. Once the system boots up again, you could reseal your Anti Evil Maid's passphrase to the new configuration. Please consult Anti Evil Maid documentation for explanation on how to do that.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/2b2.md b/user/downloading-installing-upgrading/upgrade/2b2.md
index 290204390..857374487 100644
--- a/user/downloading-installing-upgrading/upgrade/2b2.md
+++ b/user/downloading-installing-upgrading/upgrade/2b2.md
@@ -7,103 +7,7 @@ redirect_from:
- /en/doc/upgrade-to-r2b2/
- /doc/UpgradeToR2B2/
- /wiki/UpgradeToR2B2/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/2b2.html
ref: 160
title: Upgrading to R2B2
----
-
-Existing users of Qubes R1 (but not R1 betas!) can upgrade their systems to the latest R2 beta release by following the procedure below. As usual, it is advisable to backup the system before proceeding with the upgrade. While it is possible to upgrade the system **it is strongly recommended to reinstall it**. You will preserve all your data and settings thanks to [backup and restore tools](/doc/backup-restore/).
-
-Upgrade all Template and Standalone VM(s)
------------------------------------------
-
-**If you have already R2 Beta1 installed, follow standard template update procedure (e.g. "Update VM" button in Qubes Manager) and skip the rest of this section**
-
-By default, in Qubes R1, there is only one template, however users are free to create more templates for special purposes, as well as Standalone VMs. More information on using multiple templates, as well as Standalone VMs, can be found [here](/doc/templates/) and [here](/doc/standalone-and-hvm/). The steps described in this section should be repeated in *all* user's Template and Standalone VMs.
-
-1. Open terminal in the template (or standalone VM). E.g. use the Qubes Manager's right-click menu and choose Run Command in VM and type `gnome-terminal` there.
-2. Install `qubes-upgrade-vm` package (this package brings in R2 repo definitions and R2 keys)
-
- ~~~
- sudo yum install qubes-upgrade-vm
- ~~~
-
-3. Proceed with normal update in the template (this should bring in also the R2 packages for the VMs):
-
- ~~~
- sudo yum update
- ~~~
-
- The installer (yum) will prompt to accept the new Qubes R2 signing key:
-
- ~~~
- Importing GPG key 0x0A40E458:
- Userid : "Qubes OS Release 2 Signing Key"
- Fingerprint: 3f01 def4 9719 158e f862 66f8 0c73 b9d4 0a40 e458
- Package : qubes-upgrade-vm-1.0-1.fc17.x86_64 (@qubes-vm-current)
- From : /etc/pki/rpm-gpg/RPM-GPG-KEY-upgrade-qubes-2-primary
- Is this ok [y/N]:
- ~~~
-
- If you see (as is the case on the "screenshot" above) that the new key was imported from a local filesystem (`/etc/pki/rpm-gpg/...`) you can safely accept the key, without checking its fingerprint. This is because there were only two ways for such a key to make it to your template's filesystem:
-
-- via a legitimate RPM package previously installed (in our case it was the `qubes-upgrade-vm` RPM). Such an RPM must have been signed by one of the keys you decided to trust previously, by default this would be either via the Qubes R1 signing key, or Fedora 17 signing key.
-- via system compromise or via some illegal RPM package (e.g. Fedora released package pretending to bring new Firefox). In that case, however, your VM is already compromised, and it careful checking of the new R2 key would not change this situation to any better one. The game is lost for this VM anyway (and all VMs based on this template).
-
-1. Shut down the VM.
-
-Installing new template
------------------------
-
-Qubes R2 Beta2 brings new fedora-18-x64 template (based on Fedora 18). You can install it from Qubes installation DVD. Insert installation DVD into your drive and issue following commands:
-
-~~~
-$ sudo -s
-# mkdir -p /mnt/cdrom
-# mount /dev/cdrom /mnt/cdrom # you can also use ISO image instead of /dev/cdrom; then add -o loop option
-# yum install /mnt/cdrom/Packages/q/qubes-template-fedora-18-x64*rpm
-# umount /mnt/cdrom
-~~~
-
-If you already have fedora-17-x64, you can also upgrade it to fedora-18-x64 following [standard Fedora upgrade procedure](https://fedoraproject.org/wiki/Upgrading_Fedora_using_yum) (only "yum" method will work in Qubes VM).
-
-Upgrade Dom0
-------------
-
-Be sure to do steps described in this section after *all* your template and standalone VMs got updated as described in the section above.
-
-1. Open terminal in Dom0. E.g. Start-\>System Settings-\>Konsole.
-2. Upgrade the `qubes-release` package to the latest version which brings in new repo definitions and R2 signing keys:
-
- ~~~
- sudo qubes-dom0-update qubes-release
- ~~~
-
- This should install `qubes-release-1-6` in your Dom0.
-
-3. Install R2 upgrade package:
-
- ~~~
- sudo qubes-dom0-update --releasever=1 qubes-dist-upgrade
- ~~~
-
-4. Start upgrade process:
-
- ~~~
- sudo qubes-dist-upgrade
- ~~~
-
-5. Follow instructions on screen, first stage of upgrade should end up with reboot request.
-6. Reboot your system, ensure that you choose "Qubes Upgrade" boot option.
-7. When system starts up, login and start start
-
- ~~~
- sudo qubes-dist-upgrade
- ~~~
-
- again. This will start second stage of upgrade, here most packages will be upgraded, so this will take a while.
-
-8. You will be prompted to install new bootloader. If you haven't changed anything in this matter from initial installation, just accept the default.
-9. Reboot your system. System shutdown may hung because some running system components no longer match that installed on disk; just wait a few minutes and hard reset the system in such case.
-10. This is end of upgrade process, you should now have Qubes R2 system.
-
-Please note that if you use Anti Evil Maid, then it won't be able to unseal the passphrase this time, because the Xen, kernel, and initramfs binaries have changed. Once the system boots up again, you could reseal your Anti Evil Maid's passphrase to the new configuration. Please consult Anti Evil Maid documentation for explanation on how to do that.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/2b3.md b/user/downloading-installing-upgrading/upgrade/2b3.md
index 1ec2fa42a..70dc21308 100644
--- a/user/downloading-installing-upgrading/upgrade/2b3.md
+++ b/user/downloading-installing-upgrading/upgrade/2b3.md
@@ -7,71 +7,7 @@ redirect_from:
- /en/doc/upgrade-to-r2b3/
- /doc/UpgradeToR2B3/
- /wiki/UpgradeToR2B3/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/2b3.html
ref: 157
title: Upgrading to R2B3
----
-
-Current Qubes R2 Beta 2 (R2B2) systems can be upgraded in-place to the latest R2 Beta 3 (R2B3) release by following the procedure below. However, upgrading in-place is riskier than performing a clean installation, since there are more things which can go wrong. For this reason, **we strongly recommended that users perform a [clean installation](/doc/installation-guide/) of Qubes R2 Beta 3**.
-
-**Before attempting either an in-place upgrade or a clean installation, we strongly recommend that users back up the system by using the built-in [backup tool](/doc/backup-restore/).**
-
-Experienced users may be comfortable accepting the risks of upgrading in-place. Such users may wish to first attempt an in-place upgrade. If nothing goes wrong, then some time and effort will have been saved. If something does go wrong, then the user can simply perform a clean installation, and no significant loss will have occurred (as long as the user [backed up](/doc/backup-restore/) correctly!).
-
-Upgrade all Template and Standalone VM(s)
------------------------------------------
-
-By default, in Qubes R2, there is only one template, however users are free to create more templates for special purposes, as well as Standalone VMs. More information on using multiple templates, as well as Standalone VMs, can be found [here](/doc/software-update-vm/). The steps described in this section should be repeated in *all* user's Template and Standalone VMs.
-
-It is critical to complete this step **before** proceeding to dom0 upgrade. Otherwise you will most likely ends with unusable system.
-
-1. Open terminal in the template (or standalone VM). E.g. use the Qubes Manager's right-click menu and choose Run Command in VM and type `gnome-terminal` there.
-2. Proceed with normal update in the template:
-
- ~~~
- sudo yum update
- ~~~
-
-3. Ensure that you've got qubes-core-vm package version 2.1.13-3.fc18:
-
- ~~~
- rpm -q qubes-core-vm
- ~~~
-
-4. Update the system to R2 beta3 packages:
-
- ~~~
- sudo yum --enablerepo=qubes-vm-r2b3-current update
- ~~~
-
-5. **Do not** shutdown the VM.
-
-Upgrading dom0
---------------
-
-Be sure to do steps described in this section after *all* your template and standalone VMs got updated as described in the section above. Also make sure you haven't shutdown any of: netvm, firewallvm, fedora-18-x64 (or to be more precise: template which your netvm and firewallvm is based on).
-
-1. Open terminal in Dom0. E.g. Start-\>System Settings-\>Konsole.
-2. Upgrade the `qubes-release` package to the latest version which brings in new repo definitions and R2 signing keys:
-
- ~~~
- sudo qubes-dom0-update qubes-release
- ~~~
-
- This should install `qubes-release-2-3.1` in your Dom0.
-
-3. Upgrade dom0 to R2 beta3:
-
- ~~~
- sudo qubes-dom0-update --enablerepo=qubes-dom0-r2b3-current
- ~~~
-
-4. If above step completed successfully you should have qubes-core-dom0 at least 2.1.34. If not, repeat above step with additional `--clean` option.
-5. Now is the time to shutdown all the VMs:
-
- ~~~
- qvm-shutdown --all --wait
- ~~~
-
-6. Reboot the system.
-
-Please note that if you use Anti Evil Maid, then it won't be able to unseal the passphrase this time, because the Xen, kernel, and initramfs binaries have changed. Once the system boots up again, you could reseal your Anti Evil Maid's passphrase to the new configuration. Please consult Anti Evil Maid documentation for explanation on how to do that.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/3_0.md b/user/downloading-installing-upgrading/upgrade/3_0.md
index 24f477d46..6cb8218ac 100644
--- a/user/downloading-installing-upgrading/upgrade/3_0.md
+++ b/user/downloading-installing-upgrading/upgrade/3_0.md
@@ -7,161 +7,7 @@ redirect_from:
- /en/doc/upgrade-to-r3.0/
- /doc/UpgradeToR3.0/
- /doc/UpgradeToR3.0rc1/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/3_0.html
ref: 159
title: Upgrading to R3.0
----
-
-**This instruction is highly experimental, the official way to upgrade from R2 is to backup the data and reinstall the system. Use at your own risk!**
-
-Current Qubes R3.0 (R3.0) systems can be upgraded in-place to the latest R3.0 by following the procedure below. However, upgrading in-place is riskier than performing a clean installation, since there are more things which can go wrong. For this reason, **we strongly recommended that users perform a [clean installation](/doc/installation-guide/) of Qubes R3.0**.
-
-**Before attempting either an in-place upgrade or a clean installation, we strongly recommend that users back up the system by using the built-in [backup tool](/doc/backup-restore/).**
-
-Experienced users may be comfortable accepting the risks of upgrading in-place. Such users may wish to first attempt an in-place upgrade. If nothing goes wrong, then some time and effort will have been saved. If something does go wrong, then the user can simply perform a clean installation, and no significant loss will have occurred (as long as the user [backed up](/doc/backup-restore/) correctly!).
-
-## Upgrade all Template and Standalone VM(s)
-
-By default, in Qubes R2, there is only one template, however users are free to create more templates for special purposes, as well as Standalone VMs. More information on using multiple templates, as well as Standalone VMs, can be found [here](/doc/software-update-vm/). The steps described in this section should be repeated in **all** user's Template and Standalone VMs.
-
-It is critical to complete this step **before** proceeding to dom0 upgrade. Otherwise you will most likely end with unusable system.
-
-### Upgrade Fedora template:
-
-1. Open terminal in the template (or standalone VM). E.g. use the Qubes Manager's right-click menu and choose Run Command in VM and type `gnome-terminal` there.
-2. Install `qubes-upgrade-vm` package:
-
- ```
- sudo yum install qubes-upgrade-vm
- ```
-
-3. Proceed with normal update in the template:
-
- ```
- sudo yum update
- ```
-
- You'll need to accept "Qubes Release 3 Signing Key" - it is delivered by signed qubes-upgrade-vm package (verify that the message is about local file), so you don't need to manually verify it.
-
-4. Shutdown the template.
-
-### Upgrade Debian template:
-
-1. Open terminal in the template (or standalone VM). E.g. use the Qubes Manager's right-click menu and choose Run Command in VM and type `gnome-terminal` there.
-2. Update repository definition:
-
- ```
- sudo cp /etc/apt/sources.list.d/qubes-r2.list
- /etc/apt/sources.list.d/qubes-r3-upgrade.list
- sudo sed -i 's/r2/r3.0/' /etc/apt/sources.list.d/qubes-r3-upgrade.list
- ```
-
-3. Proceed with normal update in the template:
-
- ```
- sudo apt-get update
- sudo apt-get dist-upgrade
- ```
-
- There will be some error messages during the process, but our tests does
- not revealed any negative consequences.
- Update of `qubesdb-vm` package will restart the service, which will fail
- (after 3min timeout), but you can ignore this problem for now. After
- completing the whole upgrade the service will be properly restarted.
-
-4. Shutdown the template.
-
-## Upgrading dom0
-
-Be sure to do steps described in this section after *all* your template and standalone VMs got updated as described in the section above. Also make sure you haven't shutdown any of: netvm, firewallvm - you will not be able to start them again.
-
-1. Open terminal in Dom0. E.g. Start-\>System Settings-\>Konsole.
-2. Upgrade the `qubes-release` package to the latest version which brings in new repo definitions and R2 signing keys:
-
- ```
- sudo qubes-dom0-update qubes-release
- ```
-
- This should install `qubes-release-2-12` in your Dom0.
-
-3. Upgrade dom0 to R3.0:
-
- ```
- sudo qubes-dom0-update --releasever=3.0
- ```
-
- After this step, until you reboot the system, most of the qvm-* tools will not work.
-
-4. If above step completed successfully you should have `qubes-core-dom0` at least 3.0.8. If not, repeat above step with additional `--clean` option.
-
-5. Enable Xen services:
-
- ```
- sudo systemctl enable xenconsoled.service xenstored.service
- ```
-
-6. Reboot the system.
-
- It may happen that the system hang during the reboot. Hard reset the system in such case, all the filesystems are unmounted at this stage.
-
-Please note that if you use Anti Evil Maid, then it won't be able to unseal the passphrase this time, because the Xen, kernel, and initramfs binaries have changed. Once the system boots up again, you could reseal your Anti Evil Maid's passphrase to the new configuration. Please consult Anti Evil Maid documentation for explanation on how to do that.
-
-Now, when you have dom0 upgraded, you can install new templates from Qubes R3.0 repositories. Especially Fedora 21 - default Qubes R3.0 template:
-
-```
-sudo qubes-dom0-update qubes-template-fedora-21
-```
-
-## Upgrading template on already upgraded dom0
-
-If for some reason you did not upgrade all the templates and standalone VMs before upgrading dom0, you can still do this, but it will be more complicated. This can be the case when you restore backup done on Qubes R2.
-
-When you start R2 template/standalone VM on R3.0, there will be some limitations:
-
-1. qrexec will not connect (you will see an error message during VM startup)
-2. GUI will not connect - you will not see any VM window
-3. VM will not be configured - especially it will not have network access
-
-Because of above limitations, you will need to configure some of those manually. The instruction assumes the VM name is `custom-template`, but the same instructions can be applied to a standalone VM.
-
-1. Check the VM network parameters, you will need them later:
-
- ```shell_session
- [user@dom0 ~]$ qvm-ls -n custom-template
- -------------------+----+--------+-------+------+-------------+-------+-------------+---------+-------------+
- name | on | state | updbl | type | netvm | label | ip | ip back | gateway/DNS |
- -------------------+----+--------+-------+------+-------------+-------+-------------+---------+-------------+
- [custom-template] | | Halted | Yes | Tpl | *firewallvm | black | 10.137.1.53 | n/a | 10.137.1.1 |
- ```
-
-2. Start the VM from command line:
-
- ```shell_session
- [user@dom0 ~]$ qvm-start custom-template
- --> Loading the VM (type = template)...
- --> Starting Qubes DB...
- --> Setting Qubes DB info for the VM...
- --> Updating firewall rules...
- --> Starting the VM...
- --> Starting the qrexec daemon...
- Waiting for VM's qrexec agent.............................................................Cannot connect to 'custom-template' qrexec agent for 60 seconds, giving up
- ERROR: Cannot execute qrexec-daemon!
- ```
-
- You can interrupt with Ctrl-C that qrexec waiting process.
-
-3. Access VM console:
-
- ```
- [user@dom0 ~]$ virsh -c xen:/// console custom-template
- ```
-
-4. Configure network according to parameters retrieved in first step:
-
- ```
- ip addr add 10.137.1.53/32 dev eth0
- ip route add 10.137.1.1/32 dev eth0
- ip route add via 10.137.1.1
- echo nameserver 10.137.1.1 > /etc/resolv.conf
- ```
-
-5. Proceed with normal upgrade instruction described on this page.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/3_1.md b/user/downloading-installing-upgrading/upgrade/3_1.md
index 40aff3651..6ed0ae60b 100644
--- a/user/downloading-installing-upgrading/upgrade/3_1.md
+++ b/user/downloading-installing-upgrading/upgrade/3_1.md
@@ -7,118 +7,7 @@ redirect_from:
- /en/doc/upgrade-to-r3.1/
- /doc/UpgradeToR3.1/
- /doc/UpgradeToR3.1rc1/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/3_1.html
ref: 155
title: Upgrading to R3.1
----
-
-**Before attempting either an in-place upgrade or a clean installation, we
-strongly recommend that users [back up their systems](/doc/backup-restore/).**
-
-Current Qubes R3.0 systems can be upgraded in-place to the latest R3.1
-by following the procedure below.
-
-## Upgrade all Template and Standalone VM(s)
-
-By default, in Qubes R3.0, there is only one template. However, users are
-free to create more templates for special purposes, as well as standalones.
-More information on using multiple templates, as well as standalones, can be
-found [here](/doc/software-update-vm/). The steps described in this
-section should be repeated in **all** the user's Template and Standalone VMs.
-
-### Upgrade Fedora templates:
-
-1. Open a terminal in the template (or standalone). (E.g., use Qubes VM
- Manager's right-click menu, choose "Run Command in VM," and type
- `gnome-terminal` there.)
-
-2. Install the `qubes-upgrade-vm` package:
-
- ```
- sudo yum install qubes-upgrade-vm
- ```
-
-3. Proceed with a normal upgrade in the template:
-
- ```
- sudo yum upgrade
- ```
-
-4. Shut down the template.
-
-### Upgrade Debian (and Whonix) templates:
-
-1. Open a terminal in the template (or standalone). (E.g., use Qubes VM
- Manager's right-click menu, choose "Run Command in VM," and type
- `gnome-terminal` there.)
-
-2. Update repository definition:
-
- ```
- sudo cp /etc/apt/sources.list.d/qubes-r3.list /etc/apt/sources.list.d/qubes-r3-upgrade.list
- sudo sed -i 's/r3.0/r3.1/' /etc/apt/sources.list.d/qubes-r3-upgrade.list
- ```
-
-3. Proceed with a normal update in the template:
-
- ```
- sudo apt-get update
- sudo apt-get dist-upgrade
- ```
-
-4. Remove unnecessary now file:
-
- ```
- sudo rm -f /etc/apt/sources.list.d/qubes-r3-upgrade.list
- ```
-
-5. Shut down the template.
-
-## Upgrading dom0
-
-**Important:** Do not perform the steps described in this section until **all**
-your Template and Standalone VMs have been upgraded as described in the previous
-section. Also, do not shut down `sys-net` or `sys-firewall`, since you will not
-be able to start them again until after the entire in-place upgrade procedure is
-complete.
-
-1. Open a terminal in Dom0. (E.g., Start -\> System Settings -\> Konsole.)
-
-2. Upgrade dom0 to R3.1:
-
- ```
- sudo qubes-dom0-update --releasever=3.1
- ```
-
- At this point, most of the `qvm-*` tools will stop working until after you
- reboot the system.
-
-3. If the previous step completed successfully, your `qubes-core-dom0` version
- should be `3.1.4` or higher. If it's not, repeat the previous step with the
- `--clean` option.
-
-4. Reboot dom0.
-
- The system may hang during the reboot. If that happens, do not panic. All
- the filesystems will have already been unmounted at this stage, so you can
- simply perform a hard reboot (e.g., hold the physical power button down
- until the machine shuts off, wait a moment, then press it again to start it
- back up).
-
-Please note that if you use [Anti Evil Maid](/doc/anti-evil-maid), it won't be
-able to unseal the passphrase the first time the system boots after performing
-this in-place upgrade procedure since the Xen, kernel, and initramfs binaries
-will have changed. Once the system boots up again, you can reseal your Anti Evil
-Maid passphrase to the new configuration. Please consult the Anti Evil Maid
-[documentation](/doc/anti-evil-maid) for instructions on how to do that.
-
-If you use USB VM, you may encounter problem with starting it on updated Xen
-version (because of strict default settings). Take a look at
-[User FAQ](/faq/#i-created-a-usb-vm-and-assigned-usb-controllers-to-it-now-the-usb-vm-wont-boot)
-for details.
-
-Once you have upgraded dom0, you can install new templates from Qubes R3.1
-repositories, in particular the new default Fedora 23 template:
-
-```
-sudo qubes-dom0-update qubes-template-fedora-23
-```
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/3_2.md b/user/downloading-installing-upgrading/upgrade/3_2.md
index ed1e9f9eb..5199f73b1 100644
--- a/user/downloading-installing-upgrading/upgrade/3_2.md
+++ b/user/downloading-installing-upgrading/upgrade/3_2.md
@@ -7,180 +7,7 @@ redirect_from:
- /en/doc/upgrade-to-r3.2/
- /doc/UpgradeToR3.2/
- /doc/UpgradeToR3.2rc1/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/3_2.html
ref: 161
title: Upgrading to R3.2
----
-
-**Before attempting either an in-place upgrade or a clean installation, we
-strongly recommend that users [back up their systems](/doc/backup-restore/).**
-
-Current Qubes R3.1 systems can be upgraded in-place to the latest R3.2
-by following the procedure below.
-
-## Upgrading dom0
-
-1. Close Qubes Manager (right click on its tray icon -\> Exit)
-
-2. Open a terminal in Dom0. (E.g., Start -\> System Settings -\> Konsole.)
-
-3. Install `qubes-release` package carrying R3.2 repository information.
-
- ```
- sudo qubes-dom0-update --releasever=3.2 qubes-release
- ```
-
- If you made any manual changes to repository definitions, new definitions
- will be installed as `/etc/yum.repos.d/qubes-dom0.repo.rpmnew` (you'll see
- a message about it during package installation). In such a case, you need
- to manually apply the changes to `/etc/yum.repos.d/qubes-dom0.repo` or
- simply replace it with .rpmnew file.
-
- If you are using Debian-based VM as UpdateVM (`sys-firewall` by default),
- you need to download few more packages manually, but **do not install
- them** yet:
-
- ```
- sudo qubes-dom0-update systemd-compat-libs perl-libwww-perl perl-Term-ANSIColor perl-Term-Cap gdk-pixbuf2-xlib speexdsp qubes-mgmt-salt-admin-tools lvm2
- (...)
- Transaction Summary
- ===============================================================
- Install 16 Packages (+ 31 Dependent packages)
- Upgrade 4 Packages (+200 Dependent packages)
-
- Total download size: 173 M
- Is this ok [y/d/N]: n
- Exiting on user command
- Your transaction was saved, rerun it with:
- yum load-transaction /tmp/yum_save_tx.....
- ```
-
-4. Upgrade dom0 to R3.2:
-
- ```
- sudo qubes-dom0-update
- ```
-
- You may wish to disable the screensaver "Lock screen" feature for this step, as
- during the update XScreensaver may encounter an "Authentication failed" issue,
- requiring a hard reboot. Alternatively, you may simply move the mouse regularly.
-
-5. If the previous step completed successfully, your `qubes-core-dom0` version
- should be `3.2.3` or higher. This can be verified with the command `yum info
- qubes-core-dom0`. If it's not, repeat the previous step with the `--clean` option.
-
-6. Update configuration files.
-
- Some of configuration files were saved with `.rpmnew` extension as the
- actual files were modified. During upgrade, you'll see information about
- such cases, like:
-
- ```
- warning: /etc/salt/minion.d/f_defaults.conf created as /etc/salt/minion.d/f_defaults.conf.rpmnew
- ```
-
- This will happen for every configuration you have modified manually and for
- a few that has been modified by Qubes scripts. If you are not sure what to
- do about them, below is a list of commands to deal with few common cases
- (either keep the old one, or replace with the new one):
-
- ```
- rm -f /etc/group.rpmnew
- rm -f /etc/shadow.rpmnew
- rm -f /etc/qubes/guid.conf.rpmnew
- mv -f /etc/nsswitch.conf{.rpmnew,}
- mv -f /etc/pam.d/postlogin{.rpmnew,}
- mv -f /etc/salt/minion.d/f_defaults.conf{.rpmnew,}
- mv -f /etc/dracut.conf{.rpmnew,}
- ```
-
-7. Reboot dom0.
-
-Please note that if you use [Anti Evil Maid](/doc/anti-evil-maid), it won't be
-able to unseal the passphrase the first time the system boots after performing
-this in-place upgrade procedure since the Xen, kernel, and initramfs binaries
-will have changed. Once the system boots up again, you can reseal your Anti Evil
-Maid passphrase to the new configuration. Please consult the Anti Evil Maid
-[documentation](/doc/anti-evil-maid) for instructions on how to do that.
-
-At first login after upgrade you may got a message like this:
-
-``
- Your saved session type 'kde-plasma' is not valid any more.
- Please select a new one, otherwise 'default' will be used.
-``
-
-This is result of upgrade KDE4 (`kde-plasma`) to KDE5 (`plasma`). Simply choose
-your favorite desktop environment and continue.
-
-## Upgrade all Template and Standalone VM(s)
-
-By default, in Qubes R3.1, there are few templates and no standalones.
-However, users are free to create standalones More information on using
-multiple templates, as well as standalones, can be found
-[here](/doc/software-update-vm/). The steps described in this section should be
-repeated in **all** the user's Template and Standalone VMs.
-
-### Upgrade Fedora templates:
-
-**Note:** This will only upgrade your Fedora template from Qubes 3.1 to Qubes
-3.2. This will *not* upgrade your Fedora template from Fedora 23 to Fedora 24.
-In order to do that, please see the
-[Fedora 23 template upgrade instructions](/doc/templates/fedora/#upgrading).
-
-1. Open a terminal in the template (or standalone). (E.g., use Qubes VM
- Manager's right-click menu, choose "Run Command in VM," and type
- `gnome-terminal` there.)
-
-2. Install the `qubes-upgrade-vm` package:
-
- ```
- sudo dnf install --refresh qubes-upgrade-vm
- ```
-
-3. Proceed with a normal upgrade in the template:
-
- ```
- sudo dnf upgrade --refresh
- ```
-
-4. Add new packages (only needed in default template):
-
- ```
- sudo dnf install qubes-mgmt-salt-vm-connector
- ```
-
-5. Shut down the template.
-
-### Upgrade Debian (and Whonix) templates:
-
-1. Open a terminal in the template (or standalone). (E.g., use Qubes VM
- Manager's right-click menu, choose "Run Command in VM," and type
- `gnome-terminal` there.)
-
-2. Update repository definition:
-
- ```
- sudo cp /etc/apt/sources.list.d/qubes-r3.list /etc/apt/sources.list.d/qubes-r3-upgrade.list
- sudo sed -i 's/r3.1/r3.2/' /etc/apt/sources.list.d/qubes-r3-upgrade.list
- ```
-
-3. Proceed with a normal update in the template:
-
- ```
- sudo apt-get update
- sudo apt-get dist-upgrade
- ```
-
-4. Add new packages (only needed in default template):
-
- ```
- sudo apt-get install qubes-mgmt-salt-vm-connector
- ```
-
-5. Remove unnecessary now file:
-
- ```
- sudo rm -f /etc/apt/sources.list.d/qubes-r3-upgrade.list
- ```
-
-6. Shut down the template.
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/4_0.md b/user/downloading-installing-upgrading/upgrade/4_0.md
index ff605b766..5e588076d 100644
--- a/user/downloading-installing-upgrading/upgrade/4_0.md
+++ b/user/downloading-installing-upgrading/upgrade/4_0.md
@@ -7,112 +7,7 @@ redirect_from:
- /en/doc/upgrade-to-r4.0/
- /doc/UpgradeToR4.0/
- /doc/UpgradeToR4.0rc1/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/4_0.html
ref: 162
title: Upgrading to R4.0
----
-
-**Before attempting either an in-place upgrade or a clean installation, we strongly recommend that users [back up their systems](/doc/backup-restore/).**
-
-Current Qubes R3.2 systems cannot be upgraded in-place to R4.0.
-A full backup, clean 4.0 install, and restore is required.
-This can be done by following the procedure below.
-
-Preparation
------------
-
-1. Go to [downloads](/downloads/) and prepare a USB drive or DVD with the R4.0 installer.
-
-2. If this is your only computer, and you do not have a R3.2 installer, you should also create a separate R3.2 USB drive or DVD installer at this time.
-
-Backup R3.2
------------
-
-1. Attach the backup drive you will be using.
- These steps assume it is a USB drive.
-
-2. Shutdown all non-essential VMs.
- Typically, `sys-usb` will be the only VM you need to leave running.
-
-3. Follow the **Creating a Backup** section in the [Backup, Restoration, and Migration](/doc/backup-restore/) guide to back up **all VMs** except sys-usb.
-
-6. Verify the integrity of your backup by following the **Restoring from a Backup** section in the [Backup, Restoration, and Migration](/doc/backup-restore/) guide and:
-
- * If you're using Qubes Manager, check the box under "Restore options" that says, "Verify backup integrity, do not restore the data."
- * If you're using `qvm-backup-restore` from the command-line, use the `--verify-only` option.
-
-7. If your backup verifies successfully, proceed to the next section.
- If it does not, **stop**.
- Go back and repeat the backup steps, review the documentation, and ask for [help](/support/).
-
-Install R4.0
-------------
-
-This section provides general guidance on installing R4.0 as part of migrating from R3.2.
-For further details, please see the [installation guide](/doc/installation-guide/).
-
-1. Shut down R3.2 and boot the R4.0 installer.
-
-2. Follow the installation prompts until you get to the drive selection screen.
- Choose **I want to make additional space available**.
- Select the box at the top of the list in order to select all partitions.
- **This will erase the entire drive**, so do this only if Qubes is the only OS installed on your computer.
- If you did not successfully verify your backup in the previous section, cancel the installation, and go back to do that now.
-
-3. Complete the R4.0 installation.
- Ask for [help](/support/) if you run into trouble.
-
-4. If you are unable to successfully install R4.0 on your system, all is not lost.
- Use the R3.2 installer to reinstall R3.2, then restore from your backup.
-
-Restore from your backup
-------------------------
-
-1. Welcome to Qubes R4.0!
- The first thing you might notice is that **Qubes Manager** is not started by default.
- We won't need it for the next step, but we will be starting it later.
-
-2. Since patches may have been released since your installation image was created, update Qubes R4.0 by going to the dom0 command line (**Qubes menu -> Terminal Emulator**) then running:
-
- ```
- sudo qubes-dom0-update
- ```
-
-3. Reboot dom0.
-
-4. Go to **Qubes menu -> System Tools -> Qubes Manager** to start it.
-
-5. Follow the **Restoring from a Backup** section in the [Backup, Restoration, and Migration](/doc/backup-restore/) guide.
- We recommend that you restore only your [app qubes](/doc/glossary/#app-qube) and [standalones](/doc/glossary/#standalone) from R3.2.
- Using [templates](/doc/templates/) and [service qubes](/doc/glossary/#service-qube) from R3.2 is not fully supported (see [#3514](https://github.com/QubesOS/qubes-issues/issues/3514)).
- Instead, we recommend using the templates that were created specifically for R4.0, which you can [customize](/doc/software-update-vm/) according to your needs.
- For the template OS versions supported in R4.0, see [supported releases](/doc/supported-releases/#templates).
- If the restore tool complains about missing templates, you can select the option to restore the app qubes anyway, then change them afterward to use one of the default R4.0 templates.
-
-Note about additional disp-* qubes created during restore
----------------------------------------------------------
-
-One of differences between R3.2 and R4.0 is the handling of disposables.
-In R3.2, a disposable inherited its network settings (NetVM and firewall rules) from the calling qube.
-In R4.0, this is no longer the case.
-Instead, in R4.0 it's possible to create multiple disposable templates and choose which one should be used by each qube.
-It's even possible to use different disposable templates for different operations from the same qube.
-This allows much more flexibility, since it allows you to differentiate not only network settings, but all of a qube's properties (including its template, memory settings, etc.).
-
-Restoring a backup from R3.2 preserves the old behavior by creating separate disposable template for each network-providing qube (and also `disp-no-netvm` for network-isolated qubes).
-Then, each restored qube is configured to use the appropriate disposable template according to its `netvm` or `dispvm_netvm` property from R3.2.
-This way, disposables started on R4.0 by qubes restored from a R3.2 backup have the same NetVM settings as they had on R3.2.
-
-If you find this behavior undesirable and want to configure it differently, you can remove those `disp-*` disposable templates.
-But, to do so, you must first make sure they are not set as the value for the `default_dispvm` property on any other qube.
-Both Qubes Manager and the `qvm-remove` tool will show you where a disposable template is being used, so you can go there and change the setting.
-
-Upgrade all Template and Standalone VM(s)
------------------------------------------
-
-We strongly recommend that you update **all** templates and standalones before use so that you have the latest security patches from upstream distributions.
-In addition, if the default templates have reached EOL (end-of-life) by the time you install R4.0, we strongly recommend that you upgrade them before use.
-Please see [supported releases](/doc/supported-releases/) for information on supported OS versions and consult the guides below for specific upgrade instructions:
-
-* [Upgrading Fedora templates](/doc/templates/fedora/#upgrading)
-* [Upgrading Debian templates](/doc/templates/debian/#upgrading)
-* [Updating Whonix templates](https://www.whonix.org/wiki/Qubes/Update)
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/4_1.md b/user/downloading-installing-upgrading/upgrade/4_1.md
index 0f42a7db7..bcc70b788 100644
--- a/user/downloading-installing-upgrading/upgrade/4_1.md
+++ b/user/downloading-installing-upgrading/upgrade/4_1.md
@@ -2,125 +2,6 @@
lang: en
layout: doc
permalink: /doc/upgrade/4.1/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/4_1.html
title: How to upgrade to Qubes 4.1
----
-
-This page explains how to upgrade from Qubes 4.0 to Qubes 4.1. There are two
-ways to upgrade: a clean installation or an in-place upgrade. In general, a
-clean installation is simpler and less error-prone, but an in-place upgrade
-allows you to preserve your customizations.
-
-## Back up
-
-Before attempting either an in-place upgrade or a clean installation, we
-strongly recommend that you first [back up your
-system](/doc/how-to-back-up-restore-and-migrate/) so that you don't lose any
-data.
-
-## Clean installation
-
-If you would prefer to perform a clean installation rather than upgrading
-in-place:
-
-1. Create a
- [backup](/doc/how-to-back-up-restore-and-migrate/#creating-a-backup) of your
- current installation.
-2. [Download](/downloads/) the latest 4.1 release.
-3. Follow the [installation guide](/doc/installation-guide/) to install Qubes
- 4.1.
-4. [Restore from your
- backup](/doc/how-to-back-up-restore-and-migrate/#restoring-from-a-backup) on
- your new 4.1 installation.
-
-## In-place upgrade
-
-**Warning:** It is not possible to upgrade directly from releases earlier than
-4.0. If you're still on an earlier release, please either perform a [clean
-installation of 4.1](#clean-installation) or [upgrade to
-4.0](/doc/upgrade/4.0/) first.
-
-The upgrade may take several hours, and will download several gigabytes of
-data.
-
-In place upgrade is a complex operation. For this reason, we provide a
-`qubes-dist-upgrade` tool to handle all the necessary steps automatically. You
-can install it with the following command in the dom0 terminal:
-
- sudo qubes-dom0-update -y qubes-dist-upgrade
-
-The upgrade consists of seven stages --- six before restarting the system ---
-labeled "STAGE 0" through "STAGE 5" in the options list below. The seventh stage
-is rebuilding the application and features lists, which you can start with the
-`--resync-appmenus-features` option.
-
-Full list of options can be obtained with `qubes-dist-upgrade --help`:
-
- Usage: qubes-dist-upgrade [OPTIONS]...
-
- This script is used for updating current QubesOS R4.0 to R4.1.
-
- Options:
- --double-metadata-size, -d (STAGE 0) Double current LVM thin pool metadata size.
- --update, -t (STAGE 1) Update of dom0, TemplatesVM and StandaloneVM.
- --template-standalone-upgrade, -l (STAGE 2) Upgrade templates and standalone VMs to R4.1 repository.
- --release-upgrade, -r (STAGE 3) Update 'qubes-release' for Qubes R4.1.
- --dist-upgrade, -s (STAGE 4) Upgrade to Qubes R4.1 and Fedora 32 repositories.
- --setup-efi-grub, -g (STAGE 5) Setup EFI Grub.
- --all, -a Execute all the above stages in one call.
-
- --assumeyes, -y Automatically answer yes for all questions.
- --usbvm, -u Current UsbVM defined (default 'sys-usb').
- --netvm, -n Current NetVM defined (default 'sys-net').
- --updatevm, -f Current UpdateVM defined (default 'sys-firewall').
- --skip-template-upgrade, -j Don't upgrade TemplateVM to R4.1 repositories.
- --skip-standalone-upgrade, -k Don't upgrade StandaloneVM to R4.1 repositories.
- --only-update Apply STAGE 0, 2 and resync appmenus only to
- selected qubes (coma separated list).
- --keep-running List of extra VMs to keep running during update (coma separated list).
- Can be useful if multiple updates proxy VMs are configured.
- --max-concurrency How many TemplateVM/StandaloneVM to update in parallel in STAGE 1
- (default 4).
-
- --resync-appmenus-features Resync applications and features. To be ran individually
- after reboot.
-
-After installing the tool, upgrade can be performed all at once with:
-
- sudo qubes-dist-upgrade --all
-
-Optionally, an `--assumeyes` (or `-y`) option can be used to automatically
-accept all the actions without confirmation.
-
-Alternatively, each upgrade stage can be started separately (see the list of
-options above).
-
-After completing "STAGE 0" through "STAGE 5", restart the system. Then perform
-the final step:
-
- sudo qubes-dist-upgrade --resync-appmenus-features
-
-When this completes, you can start using Qubes OS 4.1.
-
-### Known issues
-
-1. The script does not convert LUKS1 to LUKS2 disk encryption format (fresh
- Qubes 4.1 install uses LUKS2 for disk encryption, while earlier versions use
- LUKS1).
-2. Early Qubes 4.0 pre-releases (before R4.0-rc2) made `/boot/efi` partition
- only 200MB, which is too small for R4.1. In case of such partition layout,
- clean installation is necessary.
-3. If user has created some custom qrexec policy entries, they may not be
- correctly handled in R4.1, resulting in denying all the calls. It is advised
- to verify if there are not qrexec policy errors in the log after the system
- restart - using `journalctl -b` command.
-
-If any early upgrade stage fails, the `qubes-dist-upgrade` tool will try to
-restore previous system state. After fixing an issue, the tool can be started
-again, to retry the operation. If a later stage (number 3 or later) fails, the
-tool may not be able to rollback the changes. But it may still be possible to
-retry the upgrade.
-
-## Update
-
-After upgrading or performing a clean installation, we strongly recommend
-[updating your system](/doc/how-to-update/).
+---
\ No newline at end of file
diff --git a/user/downloading-installing-upgrading/upgrade/upgrade.md b/user/downloading-installing-upgrading/upgrade/upgrade.md
index 0c6c5b820..8bc07bc5d 100644
--- a/user/downloading-installing-upgrading/upgrade/upgrade.md
+++ b/user/downloading-installing-upgrading/upgrade/upgrade.md
@@ -2,20 +2,7 @@
lang: en
layout: doc
permalink: /doc/upgrade/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/downloading-installing-upgrading/upgrade/upgrade.html
ref: 158
title: Upgrade guides
----
-
-These guides are for upgrading from one version of Qubes to another.
-If you're just looking to update your system while staying on the same version,
-see [how to update](/doc/how-to-update/).
-
-* [Upgrade from 1 to 2 Beta 1](/doc/upgrade/2b1/)
-* [Upgrade from 1 to 2 Beta 2](/doc/upgrade/2b2/)
-* [Upgrade from 2 Beta 2 to 2 Beta 3](/doc/upgrade/2b3/)
-* [Upgrade from 2 Beta 3 to 2](/doc/upgrade/2/)
-* [Upgrade from 2 to 3.0](/doc/upgrade/3.0/)
-* [Upgrade from 3.0 to 3.1](/doc/upgrade/3.1/)
-* [Upgrade from 3.1 to 3.2](/doc/upgrade/3.2/)
-* [Upgrade from 3.2 to 4.0](/doc/upgrade/4.0/)
-* [Upgrade from 4.0 to 4.1](/doc/upgrade/4.1/)
+---
\ No newline at end of file
diff --git a/user/hardware/certified-hardware.md b/user/hardware/certified-hardware.md
index 5b02ad582..a198b13bb 100644
--- a/user/hardware/certified-hardware.md
+++ b/user/hardware/certified-hardware.md
@@ -6,193 +6,7 @@ redirect_from:
- /doc/hardware/
- /doc/certified-laptops/
- /hardware-certification/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/hardware/certified-hardware.html
ref: 144
title: Certified hardware
----
-
-The Qubes OS Project aims to partner with a select few computer vendors to
-ensure that Qubes users have reliable hardware purchasing options. We aim for
-these vendors to be as diverse as possible in terms of geography, cost, and
-availability.
-
-
-
- Warning: The Qubes OS Project certifies only that a particular
- hardware configuration is supported by Qubes OS and is
- available to purchase with Qubes OS preinstalled. We take no responsibility
- for any vendor's manufacturing, shipping, payment, or other practices; nor
- can we control whether physical hardware is modified (whether maliciously or
- otherwise) en route to the user.
-
-
-You may also be interested in the [community-recommended
-hardware](https://forum.qubes-os.org/t/5560) list and the [hardware
-compatibility list (HCL)](/hcl/).
-
-## Qubes-certified Laptops
-
-Qubes-certified laptops are certified for a [major
-release](/doc/version-scheme/) and regularly tested by the Qubes developers to
-ensure compatibility with all of Qubes' features within that major release. The
-developers test all new updates within that major release to ensure that no
-regressions are introduced.
-
-### Insurgo PrivacyBeast X230
-
-[](https://insurgo.ca/produit/qubesos-certified-privacybeast_x230-reasonably-secured-laptop/)
-
-The [Insurgo PrivacyBeast
-X230](https://insurgo.ca/produit/qubesos-certified-privacybeast_x230-reasonably-secured-laptop/)
-meets and exceeds our hardware certification requirements for Qubes 4. Read our
-[announcement](/news/2019/07/18/insurgo-privacybeast-qubes-certification/) of
-the certification for further details!
-
-### NitroPad X230
-
-[](https://shop.nitrokey.com/shop/product/nitropad-x230-67)
-
-The [NitroPad X230](https://shop.nitrokey.com/shop/product/nitropad-x230-67)
-satisfies all hardware certification requirements for Qubes 4, offering users
-extensive hardware security options. Read our
-[announcement](/news/2020/03/04/nitropad-x230-qubes-certification/) of the
-certification for further details!
-
-### NitroPad T430
-
-[](https://shop.nitrokey.com/shop/product/nitropad-t430-119)
-
-The [NitroPad T430](https://shop.nitrokey.com/shop/product/nitropad-t430-119)
-satisfies all hardware certification requirements for Qubes 4, offering users
-extensive hardware security options. Read our
-[announcement](/news/2021/06/01/nitropad-t430-qubes-certification/) of the
-certification for further details!
-
-
-## Become Hardware Certified
-
-If you are a hardware vendor, you can have your hardware certified as
-compatible with Qubes OS. The benefits of hardware certification include:
-
-- Your customers can purchase with confidence, knowing that they can take full
- advantage of Qubes OS on your hardware for a specific major version.
-- We will continue testing your hardware to ensure compatibility with the
- supported major version. In the course of this testing, we will also test
- your hardware against upcoming versions, which can help with future planning.
-- Your hardware will continue to be compatible with Qubes OS as it further
- develops within that major version, and we will work with you toward
- preserving compatibility and certification in future releases.
-- You can support the development of Qubes OS.
-
-## Hardware Certification Requirements
-
-**Note:** This section describes the requirements for hardware *certification*,
-*not* the requirements for *running* Qubes OS. For the latter, please see the
-[system requirements](/doc/system-requirements/).
-
-A basic requirement is that all Qubes-certified devices must be be available
-for purchase with Qubes OS preinstalled. Customers may be offered the option to
-select from a list of various operating systems (or no operating system at all)
-to be preinstalled, but Qubes OS must be on that list in order to maintain
-Qubes hardware certification.
-
-One of the most important security improvements introduced with the release of
-Qubes 4.0 was to replace paravirtualization (PV) technology with
-**hardware-enforced memory virtualization**, which recent processors have made
-possible thanks to so-called Second Level Address Translation
-([SLAT](https://en.wikipedia.org/wiki/Second_Level_Address_Translation)), also
-known as
-[EPT](https://ark.intel.com/Search/FeatureFilter?productType=processors&ExtendedPageTables=true&MarketSegment=Mobile)
-in Intel parlance. SLAT (EPT) is an extension to Intel VT-x virtualization,
-which originally was capable of only CPU virtualization but not memory
-virtualization and hence required a complex Shadow Page Tables approach. We
-hope that embracing SLAT-based memory virtualization will allow us to prevent
-disastrous security bugs, such as the infamous
-[XSA-148](https://xenbits.xen.org/xsa/advisory-148.html), which --- unlike many
-other major Xen bugs --- regrettably did
-[affect](https://github.com/QubesOS/qubes-secpack/blob/master/QSBs/qsb-022-2015.txt)
-Qubes OS. Consequently, we require SLAT support of all certified hardware
-beginning with Qubes OS 4.0.
-
-Another important requirement is that Qubes-certified hardware should run only
-**open-source boot firmware** (aka "the BIOS"), such as
-[coreboot](https://www.coreboot.org/). The only exception is the use of
-(properly authenticated) CPU-vendor-provided blobs for silicon and memory
-initialization (see [Intel
-FSP](https://firmware.intel.com/learn/fsp/about-intel-fsp)) as well as other
-internal operations (see [Intel ME](https://www.apress.com/9781430265719)).
-However, we specifically require all code used for and dealing with the System
-Management Mode (SMM) to be open-source.
-
-While we
-[recognize](https://blog.invisiblethings.org/papers/2015/x86_harmful.pdf) the
-potential problems that proprietary CPU-vendor code can cause, we are also
-pragmatic enough to realize that we need to take smaller steps first, before we
-can implement even stronger countermeasures such as a [stateless
-laptop](https://blog.invisiblethings.org/papers/2015/state_harmful.pdf). A
-switch to open source boot firmware is one such important step. To be
-compatible with Qubes OS, the BIOS must properly expose all the VT-x, VT-d, and
-SLAT functionality that the underlying hardware offers (and which we require).
-Among other things, this implies **proper DMAR ACPI table** construction.
-
-Most laptops use PS/2 connections internally for their input devices (i.e.,
-keyboard and touchpad). On most desktops, however, USB-connected keyboards
-and mice have become standard. This presents a dilemma when the computer has
-only one USB controller. If that single USB controller is dedicated solely to
-the input devices, then no untrusted USB devices can be used. Conversely, if
-the sole USB controller is completely untrusted, then there is no way for the
-user to physically control the system in a secure way. In practice, Qubes users
-on such hardware systems are generally forced to use a single USB controller
-for both trusted and untrusted purposes --- [an unfortunate security
-trade-off](/doc/device-handling-security/#security-warning-on-usb-input-devices).
-For this reason, we require that every Qubes-certified non-laptop device
-**either** (1) supports non-USB input devices (e.g., via PS/2) **or** (2) has a
-separate USB controller that is only for input devices.
-
-Finally, we require that Qubes-certified hardware does not have any built-in
-_USB-connected_ microphones (e.g. as part of a USB-connected built-in camera)
-that cannot be easily physically disabled by the user, e.g. via a convenient
-mechanical switch. Thankfully, the majority of laptops on the market that we
-have seen already satisfy this condition out-of-the-box, because their built-in
-microphones are typically connected to the internal audio device, which itself
-is a type of PCIe device. This is important, because such PCIe audio devices
-are --- by default --- assigned to Qubes' (trusted) dom0 and exposed through
-our carefully designed protocol only to select app qubes when the user
-explicitly chooses to do so. The rest of the time, they should be outside the
-reach of malware.
-
-While we also recommend a physical kill switch on the built-in camera (or, if
-possible, not to have a built-in camera), we also recognize this isn't a
-critical requirement, because users who are concerned about it can easily cover
-it a piece of tape (something that, regrettably, is far less effective on a
-microphone).
-
-Similarly, we don't consider physical kill switches on Wi-Fi and Bluetooth
-devices to be mandatory. Users who plan on using Qubes in an air-gap scenario
-would do best if they manually remove all such devices persistently (as well as
-the builtin [speakers](https://github.com/romanz/amodem/)!), rather than rely
-on easy-to-flip-by-mistake switches, while others should benefit from the Qubes
-default sandboxing of all networking devices in dedicated VMs.
-
-We hope these hardware requirements will encourage the development of more
-secure and trustworthy devices.
-
-## Hardware Certification Process
-
-To have hardware certified, the vendor must:
-
-1. Send the Qubes team two (2) units for testing (non-returnable) for each
- configuration the vendor wishes to be offering.
-2. Offer to customers the very same configuration (same motherboard, same
- screen, same BIOS version, same Wi-Fi module, etc.) for at least one year.
-3. Pay the Qubes team a flat monthly rate, to be agreed upon between the
- hardware vendor and the Qubes team.
-
-It is the vendor's responsibility to ensure the hardware they wish to have
-certified can run Qubes OS, at the very least the latest stable version. This
-could be done by consulting the [Hardware Compatibility List](/hcl/) or trying
-to install it themselves before shipping any units to us. While we are willing
-to troubleshoot simple issues, we will need to charge a consulting fee for more
-in-depth work.
-
-If you are interested in having your hardware certified, please [contact
-us](mailto:business@qubes-os.org).
+---
\ No newline at end of file
diff --git a/user/hardware/community-recommended-hardware.md b/user/hardware/community-recommended-hardware.md
index 506c353a6..fe6e87f30 100644
--- a/user/hardware/community-recommended-hardware.md
+++ b/user/hardware/community-recommended-hardware.md
@@ -2,8 +2,8 @@
lang: en
layout: doc
permalink: /doc/community-recommended-hardware/
-ref: 145
-title: Community-recommended hardware
redirect_from: /doc/hardware-testing/
redirect_to: https://forum.qubes-os.org/t/5560
----
+ref: 145
+title: Community-recommended hardware
+---
\ No newline at end of file
diff --git a/user/hardware/how-to-use-the-hcl.md b/user/hardware/how-to-use-the-hcl.md
index 463ac8dd8..8555a3b07 100644
--- a/user/hardware/how-to-use-the-hcl.md
+++ b/user/hardware/how-to-use-the-hcl.md
@@ -2,36 +2,7 @@
lang: en
layout: doc
permalink: /doc/how-to-use-the-hcl/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/hardware/how-to-use-the-hcl.html
ref: 146
title: How to use the hardware compatibility list (HCL)
----
-
-The [HCL](/hcl) is a compilation of reports generated and submitted by users across various Qubes versions about their hardware's compatibility with Qubes.
-
- **Note:**
- Except in the case of developer-reported entries, the Qubes team has not independently verified the accuracy of these reports.
- Please first consult the data sheets (CPU, chipset, motherboard) prior to buying new hardware for Qubes.
- Make sure it meets the [System Requirements](/doc/system-requirements/) and search in particular for support of:
-
-- HVM ("AMD virtualization (AMD-V)", "Intel virtualization (VT-x)", "VIA virtualization (VIA VT)")
-- IOMMU ("AMD I/O Virtualization Technology (AMD-Vi)", "Intel Virtualization Technology for Directed I/O (VT-d)")
-- TPM ("Trusted Platform Module (TPM)" connected to a "20-pin TPM header" on motherboards.)
-
-If using the list to make a purchasing decision, we recommend that you choose hardware with:
-
-- the best achievable Qubes security level (green columns in HVM, IOMMU, TPM)
-- and general machine compatibility (green columns in Qubes version, dom0 kernel, remarks).
-
-Also see [Certified Hardware](/doc/certified-hardware/).
-
-Generating and Submitting New Reports
--------------------------------------
-
-In order to generate an HCL report in Qubes, simply open a terminal in dom0 (Applications Menu > Terminal Emulator) and run `qubes-hcl-report `, where `` is the name of the qube in which the generated HCL files will be saved.
-
-You are encouraged to submit your HCL report for the benefit of further Qubes development and other users. When submitting reports, test the hardware yourself, if possible. If you would like to submit your HCL report, please copy and paste the contents of the **HCL Info** `.yml` file into an email to the [qubes-users mailing list](/support/#qubes-users) with the subject `HCL - `, or create a post in the [HCL Reports category](https://forum.qubes-os.org/c/user-support/hcl-reports/23) of the forum. Pasting the contents into the email or post has the advantage that members of the mailing list and the forum can see the report without downloading and opening a file. In addition, new forum members are unable to attach files to posts.
-
-Please include any useful information about any Qubes features you may have tested (see the legend below), as well as general machine compatibility (video, networking, sleep, etc.). Please consider sending the **HCL Support Files** `.cpio.gz` file as well. To generate these add the `-s` or `--support` command line option.
-
-**Please note:**
- The **HCL Support Files** may contain numerous hardware details, including serial numbers. If, for privacy or security reasons, you do not wish to make this information public, please **do not** post the `.cpio.gz` file on a public mailing list or forum.
+---
\ No newline at end of file
diff --git a/user/hardware/system-requirements.md b/user/hardware/system-requirements.md
index e959f0b3b..4102d503c 100644
--- a/user/hardware/system-requirements.md
+++ b/user/hardware/system-requirements.md
@@ -7,101 +7,7 @@ redirect_from:
- /en/doc/system-requirements/
- /doc/SystemRequirements/
- /wiki/SystemRequirements/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/hardware/system-requirements.html
ref: 142
title: System requirements
----
-
-
-
- Notice: The system requirements on this page are necessary, but
- not sufficient, for Qubes compatibility at a minimal or recommended
- level. In other words, just because a computer satisfies these requirements
- doesn't mean that Qubes will successfully install and run on it. We strongly
- recommend consulting the resources below
- when selecting hardware for Qubes.
-
-
-## Minimum
-
-- **CPU:** 64-bit Intel or AMD processor (also known as `x86_64`, `x64`, and `AMD64`)
- - [Intel VT-x](https://en.wikipedia.org/wiki/X86_virtualization#Intel_virtualization_.28VT-x.29) with [EPT](https://en.wikipedia.org/wiki/Second_Level_Address_Translation#Extended_Page_Tables) or [AMD-V](https://en.wikipedia.org/wiki/X86_virtualization#AMD_virtualization_.28AMD-V.29) with [RVI](https://en.wikipedia.org/wiki/Second_Level_Address_Translation#Rapid_Virtualization_Indexing)
- - [Intel VT-d](https://en.wikipedia.org/wiki/X86_virtualization#Intel-VT-d) or [AMD-Vi (also known as AMD IOMMU)](https://en.wikipedia.org/wiki/X86_virtualization#I.2FO_MMU_virtualization_.28AMD-Vi_and_Intel_VT-d.29)
-
-- **Memory:** 6 GB RAM
-
-- **Storage:** 32 GB free space
-
-## Recommended
-
-- **CPU:** 64-bit Intel or AMD processor (also known as `x86_64`, `x64`, and `AMD64`)
- - [Intel VT-x](https://en.wikipedia.org/wiki/X86_virtualization#Intel_virtualization_.28VT-x.29) with [EPT](https://en.wikipedia.org/wiki/Second_Level_Address_Translation#Extended_Page_Tables) or [AMD-V](https://en.wikipedia.org/wiki/X86_virtualization#AMD_virtualization_.28AMD-V.29) with [RVI](https://en.wikipedia.org/wiki/Second_Level_Address_Translation#Rapid_Virtualization_Indexing)
- - [Intel VT-d](https://en.wikipedia.org/wiki/X86_virtualization#Intel-VT-d) or [AMD-Vi (also known as AMD IOMMU)](https://en.wikipedia.org/wiki/X86_virtualization#I.2FO_MMU_virtualization_.28AMD-Vi_and_Intel_VT-d.29)
-
-- **Memory:** 16 GB RAM
-
-- **Storage:** 128 GB free space
- - High-speed solid-state drive strongly recommended
-
-- **Graphics:** Intel integrated graphics processor (IGP) strongly recommended
- - Nvidia GPUs may require significant
- [troubleshooting](/doc/install-nvidia-driver/)
- - AMD GPUs have not been formally tested, but Radeons (especially RX580 and
- earlier) generally work well
-
-- **Peripherals:** A non-USB keyboard or multiple USB controllers
-
-- **TPM:** Trusted Platform Module (TPM) with proper BIOS support (required for
- [Anti Evil Maid](/doc/anti-evil-maid/))
-
-The following are *required* for [Qubes-certified hardware
-devices](/doc/certified-hardware/) but *merely recommended* for *non-certified*
-hardware (see the [hardware certification
-requirements](/doc/certified-hardware/#hardware-certification-requirements) for
-details).
-
-- Open-source boot firmware (e.g., [coreboot](https://www.coreboot.org/))
-
-- Hardware switches for all built-in USB-connected microphones (if any)
-
-- Either support for non-USB input devices (e.g., via PS/2, which most laptops
- already use internally) or a separate USB controller only for input devices
-
-## Choosing Hardware
-
-We recommend consulting these resources when selecting hardware for Qubes OS:
-
-- [Certified hardware](/doc/certified-hardware/) --- Qubes developer certified,
- officially recommended
-- [Community-recommended hardware](https://forum.qubes-os.org/t/5560)
- --- list curated and maintained by the community, unofficially recommended
-- [Hardware compatibility list (HCL)](/hcl/) --- community test results,
- neither recommended nor disrecommended
-
-## Important Notes
-
-- **Installing Qubes in a virtual machine is not recommended, as it uses its
- own bare-metal hypervisor (Xen).**
-
-- Qubes **can** be installed on many systems that do not meet the recommended
- requirements. Such systems will still offer significant security improvements
- over traditional operating systems, since things like GUI isolation and
- kernel protection do not require special hardware.
-
-- Qubes **can** be installed on a USB flash drive or external disk, and testing
- has shown that this works very well. A fast USB 3.0 flash drive is
- recommended for this. (As a reminder, its capacity must be at least 32 GiB.)
- Simply plug the flash drive into the computer before booting into the Qubes
- installer from a separate installation medium, choose the flash drive as the
- target installation disk, and proceed with the installation normally. After
- Qubes has been installed on the flash drive, it can then be plugged into
- other computers in order to boot into Qubes. In addition to the convenience
- of having a portable copy of Qubes, this allows users to test for hardware
- compatibility on multiple machines (e.g., at a brick-and-mortar computer
- store) before deciding on which computer to purchase. (See [generating and
- submitting HCL
- reports](/doc/how-to-use-the-hcl/#generating-and-submitting-new-reports) for
- advice on hardware compatibility testing.) Remember to change the devices
- assigned to your NetVM and USB VM if you move between different machines.
-
-- You can check whether an Intel processor has VT-x and VT-d on
- [ark.intel.com](https://ark.intel.com/content/www/us/en/ark.html#@Processors).
+---
\ No newline at end of file
diff --git a/user/how-to-guides/backup-emergency-restore-v2.md b/user/how-to-guides/backup-emergency-restore-v2.md
index b261eaeda..032722d46 100644
--- a/user/how-to-guides/backup-emergency-restore-v2.md
+++ b/user/how-to-guides/backup-emergency-restore-v2.md
@@ -5,127 +5,7 @@ permalink: /doc/backup-emergency-restore-v2/
redirect_from:
- /en/doc/backup-emergency-restore-v2/
- /doc/BackupEmergencyRestoreV2/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/backup-emergency-restore-v2.html
ref: 207
title: Emergency backup recovery (v2)
----
-
-This page describes how to perform emergency restore of backup created on Qubes
-R2 Beta3 or earlier (which uses backup format 2).
-
-The Qubes backup system has been designed with emergency disaster recovery in
-mind. No special Qubes-specific tools are required to access data backed up by
-Qubes. In the event a Qubes system is unavailable, you can access your data on
-any GNU/Linux system with the following procedure.
-
-**Note:** In the following example, the backup file is assumed to be both
-encrypted and compressed.
-
-1. Untar the main backup file.
-
- ~~~
- [user@restore ~]$ tar -i -xvf qubes-backup-2013-12-26-123456
- backup-header
- backup-header.hmac
- qubes.xml.000
- qubes.xml.000.hmac
- vm1/private.img.000
- vm1/private.img.000.hmac
- vm1/icon.png.000
- vm1/icon.png.000.hmac
- vm1/firewall.xml.000
- vm1/firewall.xml.000.hmac
- vm1/whitelisted-appmenus.list.000
- vm1/whitelisted-appmenus.list.000.hmac
- dom0-home/dom0user.000
- dom0-home/dom0user.000.hmac
- ~~~
-
-2. Set the backup passphrase environment variable. While this isn't strictly
- required, it will be handy later and will avoid saving the passphrase in
- the shell's history.
-
- [user@restore ~]$ read -r backup_pass
-
-3. Verify the integrity of the `private.img` file which houses your data.
-
- ~~~
- [user@restore ~]$ cd vm1/
- [user@restore vm1]$ openssl dgst -sha512 -hmac "$backup_pass" private.img.000
- HMAC-SHA512(private.img.000)= cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
- [user@restore vm1]$ cat private.img.000.hmac
- (stdin)= cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
- ~~~
-
- **Note:** The hash values should match. If they do not match, then the backup
- file may have been tampered with, or there may have been a storage error.
-
- **Note:** If your backup was hashed with a message digest algorithm other
- than `sha512`, you must substitute the correct message digest command. A
- complete list of supported message digest algorithms can be found with
- `openssl list-message-digest-algorithms`.
-
-4. Decrypt the `private.img` file.
-
- ~~~
- [user@restore vm1]$ openssl enc -d -pass pass:"$backup_pass" -aes-256-cbc -in private.img.000 -out private.img.dec.000
- ~~~
-
- **Note:** For multi-part files, a loop can be used:
-
- ~~~
- find -name 'private.img.*' | sort -V | while read f; do
- openssl enc -d -pass pass:"$backup_pass" -aes-256-cbc -in $f -out
- ${f/.img/.img.dec}
- done
- ~~~
-
- **Note:** If your backup was encrypted with a cipher algorithm other than
- `aes-256-cbc`, you must substitute the correct cipher command. A complete
- list of supported cipher algorithms can be found with `openssl
- list-cipher-algorithms`.
-
-5. Decompress the decrypted `private.img` file.
-
- ~~~
- [user@restore vm1]$ zforce private.img.dec.*
- [user@restore vm1]$ gunzip private.img.dec.000.gz
- ~~~
-
- **Note:** If your backup was compressed with a program other than `gzip`, you
- must substitute the correct compression program.
-
-6. Untar the decrypted and decompressed `private.img` file.
-
- ~~~
- [user@restore vm1]$ tar -M -xvf private.img.dec.000
- vm1/private.img
- ~~~
-
- **Note:** For multi-part files, a script is required:
-
- 1. Create a `new-volume-script`:
-
- ~~~
- #!/bin/sh
- name=`expr $TAR_ARCHIVE : '\(.*\)\..*'`
- suffix=`printf %03d $[ $TAR_VOLUME - 1 ]`
- echo $name.$suffix >&$TAR_FD
- ~~~
-
- 2. `chmod +x new-volume-script`.
- 3. `tar --new-volume-script=./new-volume-script -xvf private.img.dec.000`.
- (The `--new-volume-script` option enables multi-volume untaring.)
-
-7. Mount the private.img file and access your data.
-
- ~~~
- [user@restore vm1]$ sudo mkdir /mnt/img
- [user@restore vm1]$ sudo mount -o loop vm1/private.img /mnt/img/
- [user@restore vm1]$ cat /mnt/img/home/user/your_data.txt
- This data has been successfully recovered!
- ~~~
-
- **Note:** You may wish to store a plain text copy of these instructions with
- your Qubes backups in the event that you fail to recall the above procedure
- while this web page is inaccessible. You may obtain a plaintext version of
- this file in Git repository housing all the documentation on [Github](https://github.com/QubesOS/qubes-doc.git)
+---
\ No newline at end of file
diff --git a/user/how-to-guides/backup-emergency-restore-v3.md b/user/how-to-guides/backup-emergency-restore-v3.md
index 19fb437f4..db4d71652 100644
--- a/user/how-to-guides/backup-emergency-restore-v3.md
+++ b/user/how-to-guides/backup-emergency-restore-v3.md
@@ -5,140 +5,7 @@ permalink: /doc/backup-emergency-restore-v3/
redirect_from:
- /en/doc/backup-emergency-restore-v3/
- /doc/BackupEmergencyRestoreV3/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/backup-emergency-restore-v3.html
ref: 201
title: Emergency backup recovery (v3)
----
-
-This page describes how to perform an emergency restore of a backup created on
-Qubes R2 or later (which uses backup format version 3).
-
-The Qubes backup system has been designed with emergency disaster recovery in
-mind. No special Qubes-specific tools are required to access data backed up by
-Qubes. In the event a Qubes system is unavailable, you can access your data on
-any GNU/Linux system with the following procedure.
-
-**Note:** In the following example, the backup file is both *encrypted* and
-*compressed*.
-
- 1. Untar the main backup file.
-
- [user@restore ~]$ tar -i -xvf qubes-backup-2015-06-05T123456
- backup-header
- backup-header.hmac
- qubes.xml.000
- qubes.xml.000.hmac
- vm1/private.img.000
- vm1/private.img.000.hmac
- vm1/icon.png.000
- vm1/icon.png.000.hmac
- vm1/firewall.xml.000
- vm1/firewall.xml.000.hmac
- vm1/whitelisted-appmenus.list.000
- vm1/whitelisted-appmenus.list.000.hmac
- dom0-home/dom0user.000
- dom0-home/dom0user.000.hmac
-
- 2. Set the backup passphrase environment variable. While this isn't strictly
- required, it will be handy later and will avoid saving the passphrase in
- the shell's history.
-
- [user@restore ~]$ read -r backup_pass
-
- 3. Verify the integrity of the `backup-header` file, which contains basic
- information about your backup.
-
- [user@restore ~]$ openssl dgst -sha512 -hmac "$backup_pass" backup-header
- HMAC-SHA512(backup-header)= 5b266783e116fe3b2601a54c249ca5f5f96d421dfe6828eeaeb2dcd014e9e945c27b3d7b0f952f5d55c927318906d9c360f387b0e1f069bb8195e96543e2969c
- [user@restore ~]$ cat backup-header.hmac
- (stdin)= 5b266783e116fe3b2601a54c249ca5f5f96d421dfe6828eeaeb2dcd014e9e945c27b3d7b0f952f5d55c927318906d9c360f387b0e1f069bb8195e96543e2969c
-
- **Note:** The hash values should match. If they do not match, then the
- backup file may have been tampered with, or there may have been a storage
- error.
-
- **Note:** If your backup was hashed with a message digest algorithm other
- than `sha512`, you must substitute the correct message digest command. This
- information is contained in the `backup-header` file (see step 4), however
- it is not recommended to open this file until its integrity and
- authenticity has been verified (the current step). A complete list of
- supported message digest algorithms can be found with `openssl
- list-message-digest-algorithms`.
-
- 4. Read the `backup-header`. You'll need some of this information later. The
- file will look similar to this:
-
- [user@restore ~]$ cat backup-header
- version=3
- hmac-algorithm=SHA512
- crypto-algorithm=aes-256-cbc
- encrypted=True
- compressed=True
- compression-filter=gzip
-
- **Note:** If you see `version=2` here, go to [Emergency Backup Recovery -
- format version 2](/doc/backup-emergency-restore-v2/) instead.
-
- 5. Verify the integrity of the `private.img` file which houses your data.
-
- [user@restore ~]$ cd vm1/
- [user@restore vm1]$ openssl dgst -sha512 -hmac "$backup_pass" private.img.000
- HMAC-SHA512(private.img.000)= cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
- [user@restore vm1]$ cat private.img.000.hmac
- (stdin)= cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
-
- **Note:** The hash values should match. If they do not match, then the
- backup file may have been tampered with, or there may have been a storage
- error.
-
- **Note:** If your backup was hashed with a message digest algorithm other
- than `sha512`, you must substitute the correct message digest command. This
- information is contained in the `backup-header` file (see step 4). A
- complete list of supported message digest algorithms can be found with
- `openssl list-message-digest-algorithms`.
-
- 6. Decrypt the `private.img` file.
-
- [user@restore vm1]$ find -name 'private.img.*[0-9]' | sort -V | xargs cat | openssl enc -d -pass pass:"$backup_pass" -aes-256-cbc -out private.img.dec
-
- **Note:** If your backup was encrypted with a cipher algorithm other than
- `aes-256-cbc`, you must substitute the correct cipher command. This
- information is contained in the `backup-header` file (see step 4). A
- complete list of supported cipher algorithms can be found with `openssl
- list-cipher-algorithms`.
-
- 7. Decompress the decrypted `private.img` file.
-
- [user@restore vm1]$ zforce private.img.dec
- private.img.dec -- replaced with private.img.dec.gz
- [user@restore vm1]$ gunzip private.img.dec.gz
-
- **Note:** If your backup was compressed with a program other than `gzip`,
- you must substitute the correct compression program. This information is
- contained in the `backup-header` file (see step 4). For example, if you
- used `bzip2`, then you should do this:
-
- [user@restore vm1]$ mv private.img.dec private.img.dec.bz2
- [user@restore vm1]$ bunzip2 private.img.dec.bz2
-
- 8. Untar the decrypted and decompressed `private.img` file.
-
- [user@restore vm1]$ tar -xvf private.img.dec
- vm1/private.img
-
- 9. Mount the private.img file and access your data.
-
- [user@restore vm1]$ sudo mkdir /mnt/img
- [user@restore vm1]$ sudo mount -o loop vm1/private.img /mnt/img/
- [user@restore vm1]$ cat /mnt/img/home/user/your_data.txt
- This data has been successfully recovered!
-
-10. Success! If you wish to recover data from more than one VM in your backup,
- simply repeat steps 5--9 for each additional VM.
-
- **Note:** You may wish to store a copy of these instructions with your
- Qubes backups in the event that you fail to recall the above procedure
- while this web page is inaccessible. All Qubes documentation, including
- this page, is available in plain text format in the following Git
- repository:
-
- https://github.com/QubesOS/qubes-doc.git
+---
\ No newline at end of file
diff --git a/user/how-to-guides/backup-emergency-restore-v4.md b/user/how-to-guides/backup-emergency-restore-v4.md
index 19367a246..f5c4f513e 100644
--- a/user/how-to-guides/backup-emergency-restore-v4.md
+++ b/user/how-to-guides/backup-emergency-restore-v4.md
@@ -5,176 +5,7 @@ permalink: /doc/backup-emergency-restore-v4/
redirect_from:
- /en/doc/backup-emergency-restore-v4/
- /doc/BackupEmergencyRestoreV4/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/backup-emergency-restore-v4.html
ref: 192
title: Emergency backup recovery (v4)
----
-
-This page describes how to perform an emergency restore of a backup created on
-Qubes R4.X (which uses backup format version 4).
-
-The Qubes backup system has been designed with emergency disaster recovery in
-mind. No special Qubes-specific tools are required to access data backed up by
-Qubes. In the event a Qubes system is unavailable, you can access your data on
-any GNU/Linux system with the following procedure.
-
-Required `scrypt` Utility
--------------------------
-
-In Qubes 4.X, backups are encrypted and integrity-protected with
-[scrypt](https://www.tarsnap.com/scrypt.html). You will need a copy of this
-utility in order to access your data. Since `scrypt` is not pre-installed on
-every GNU/Linux system, it is strongly recommended that you store a copy of it
-with your backups. If your distribution has `scrypt` packaged (e.g., Debian),
-you can install the package in the standard way using your distribution's
-package manager. Otherwise, you'll need to obtain a compiled binary
-(instructions below) or compile the program from source yourself. (Don't forget
-to [verify signatures](/security/verifying-signatures) first!) Note that
-versions of `scrypt` up to 1.2.0 (inclusive) do not support the `-P` option for
-easier scripting, which means you'll need to enter the passphrase for each file
-separately, instead of using `echo ... | scrypt`.
-
-Here are instructions for obtaining a compiled `scrypt` binary. This example
-uses an RPM-based system (Fedora), but the same general procedure should work
-on any GNU/Linux system.
-
- 1. If you're not on Qubes 4.X, [import and authenticate the Release 4 Signing
- Key](/security/verifying-signatures/#how-to-import-and-authenticate-release-signing-keys).
-
- [user@restore ~]$ sudo rpm --import qubes-release-4-signing-key.asc
-
- 2. Download the `scrypt` RPM.
-
- [user@restore ~]$ dnf download scrypt
-
- or, if that doesn't work:
-
- [user@restore ~]$ curl -O https://yum.qubes-os.org/r4.0/current/vm/fc28/rpm/scrypt-1.2.1-1.fc28.x86_64.rpm
-
- 3. Verify the signature on the `scrypt` RPM.
-
- [user@restore ~]$ rpm -K scrypt-*.rpm
- scrypt-*.rpm: digests signatures OK
-
- The message `digests signatures OK` means that both the digest (i.e., the
- output of a hash function) and PGP signature verification were successful.
-
- 4. Install `rpmdevtools`.
-
- [user@restore ~]$ sudo dnf install rpmdevtools
-
- 5. Extract the `scrypt` binary from the RPM.
-
- [user@restore ~]$ rpmdev-extract scrypt-*.rpm
-
- 6. (Optional) Create an alias for the new binary.
-
- [user@restore ~]$ alias scrypt="scrypt-*/usr/bin/scrypt"
-
-Emergency Recovery Instructions
--------------------------------
-
-**Note:** In the following example, the backup file is both *encrypted* and
-*compressed*.
-
- 1. Untar the main backup file.
-
- [user@restore ~]$ tar -i -xvf qubes-backup-2015-06-05T123456
- backup-header
- backup-header.hmac
- qubes.xml.000.enc
- vm1/private.img.000.enc
- vm1/private.img.001.enc
- vm1/private.img.002.enc
- vm1/icon.png.000.enc
- vm1/firewall.xml.000.enc
- vm1/whitelisted-appmenus.list.000.enc
- dom0-home/dom0user.000.enc
-
- **To extract only specific VMs:** Each VM in the backup file has its path
- listed in `qubes.xml.000.enc`. Decrypt it. (In this example, the password is
- `password`.)
-
- [user@restore ~]$ cat backup-header | grep backup-id
- backup-id=20190128T123456-1234
- [user@restore ~]$ scrypt dec -P qubes.xml.000.enc qubes.xml.000
- Please enter passphrase: 20190128T123456-1234!qubes.xml.000!password
- [user@restore ~]$ tar -i -xvf qubes.xml.000
-
- Now that you have the decrypted `qubes.xml.000` file, search for the
- `backup-path` property inside of it. With the `backup-path`, extract only
- the files necessary for your VM (`vmX`).
-
- [user@restore ~]$ tar -i -xvf qubes-backup-2015-06-05T123456 \
- backup-header backup-header.hmac vmX/
-
- 2. Set the backup passphrase environment variable. While this isn't strictly
- required, it will be handy later and will avoid saving the passphrase in
- the shell's history.
-
- [user@restore ~]$ read -r backup_pass
-
- 3. Verify the integrity of `backup-header`. For compatibility reasons,
- `backup-header.hmac` is an encrypted *and integrity protected*
- version of `backup-header`.
-
- [user@restore ~]$ set +H
- [user@restore ~]$ echo "backup-header!$backup_pass" |\
- scrypt dec -P backup-header.hmac backup-header.verified && \
- diff -qs backup-header backup-header.verified
- Files backup-header and backup-header.verified are identical
-
- **Note:** If this command fails, it may be that the backup was tampered
- with or is in a different format. In the latter case, look inside
- `backup-header` at the `version` field. If it contains a value other than
- `version=4`, go to the instructions for that format version:
- - [Emergency Backup Recovery without Qubes (v2)](/doc/backup-emergency-restore-v2/)
- - [Emergency Backup Recovery without Qubes (v3)](/doc/backup-emergency-restore-v3/)
-
- 4. Read `backup-header`:
-
- [user@restore ~]$ cat backup-header
- version=4
- encrypted=True
- compressed=True
- compression-filter=gzip
- backup_id=20161020T123455-1234
-
- 5. Set `backup_id` to the value in the last line of `backup-header`:
-
- [user@restore ~]$ backup_id=20161020T123455-1234
-
- 6. Verify the integrity of your data, decrypt, decompress, and extract
- `private.img`:
-
- [user@restore ~]$ find vm1 -name 'private.img.*.enc' | sort -V | while read f_enc; do \
- f_dec=${f_enc%.enc}; \
- echo "$backup_id!$f_dec!$backup_pass" | scrypt dec -P $f_enc || break; \
- done | gzip -d | tar -xv
- vm1/private.img
-
- If this pipeline fails, it is likely that the backup is corrupted or has
- been tampered with.
-
- **Note:** If your backup was compressed with a program other than `gzip`,
- you must substitute the correct compression program in the command above.
- This information is contained in `backup-header` (see step 4). For example,
- if your backup is compressed with `bzip2`, use `bzip2 -d` instead in the
- command above.
-
- 7. Mount `private.img` and access your data.
-
- [user@restore vm1]$ sudo mkdir /mnt/img
- [user@restore vm1]$ sudo mount -o loop vm1/private.img /mnt/img/
- [user@restore vm1]$ cat /mnt/img/home/user/your_data.txt
- This data has been successfully recovered!
-
- 8. Success! If you wish to recover data from more than one VM in your backup,
- simply repeat steps 6 and 7 for each additional VM.
-
- **Note:** You may wish to store a copy of these instructions with your
- Qubes backups in the event that you fail to recall the above procedure
- while this web page is inaccessible. All Qubes documentation, including
- this page, is available in plain text format in the following Git
- repository:
-
- https://github.com/QubesOS/qubes-doc.git
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-back-up-restore-and-migrate.md b/user/how-to-guides/how-to-back-up-restore-and-migrate.md
index 04daba015..27490a3b4 100644
--- a/user/how-to-guides/how-to-back-up-restore-and-migrate.md
+++ b/user/how-to-guides/how-to-back-up-restore-and-migrate.md
@@ -7,217 +7,7 @@ redirect_from:
- /en/doc/backup-restore/
- /doc/BackupRestore/
- /wiki/BackupRestore/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-back-up-restore-and-migrate.html
ref: 199
title: How to back up, restore, and migrate
----
-
-With Qubes, it's easy and secure to back up and restore your whole system, as
-well as to migrate between two physical machines.
-
-These functions are integrated into the Qube Manager. There are also two
-command-line tools available that perform the same functions: `qvm-backup` and
-`qvm-backup-restore`.
-
-It's extremely important to make regular backups of all the data you care
-about. This is true of all computing, not just the use of Qubes. Data loss can
-and does occur in myriad and unexpected ways. A standard recommendation is to
-make backups at least weekly: three copies in two different formats, one
-off-site.
-
-## Backing up changes to dom0
-
-When backing up dom0 using the Qubes backup tool (explained below), only the
-home directory is backed up. Therefore, if there are files outside of the home
-directory you wish to save, you should copy them into the home directory prior
-to creating a backup. Here is an example of how to back up Qubes config files
-and RPC policies:
-
-```
-$ mkdir -p ~/backup/etc/qubes/
-$ cp -a /etc/qubes/* ~/backup/etc/qubes/
-$ mkdir ~/backup/etc/qubes-rpc/
-$ cp -a /etc/qubes-rpc/* ~/backup/etc/qubes-rpc/
-```
-
-To restore these files, move them from the restored directory in dom0's home
-back to their appropriate locations in `/etc/`. Please note that any packages
-installed via the package manager in dom0 will not be backed up. Such packages
-will have to be reinstalled through the package manager when restoring on a
-fresh installation.
-
-## Creating a backup
-
-1. Go to **Applications menu -> System Tools -> Backup Qubes**. This brings up
- the **Qubes Backup VMs** window.
-
-2. Move the VMs that you want to back up to the right-hand **Selected** column.
- VMs in the left-hand **Available** column will not be backed up.
-
- You may choose whether to compress backups by checking or unchecking the
- **Compress the backup** box. Normally this should be left on unless you have
- a specific reason otherwise.
-
- Once you have selected all desired VMs, click **Next**.
-
-3. Select the destination for the backup:
-
- If you wish to send your backup to a (currently running) VM, select the VM
- in the drop-down box next to **Target app qube**. If you wish to send your
- backup to a [USB mass storage device](/doc/usb/), you can use the directory
- selection widget to mount a connected device (under "Other locations" item
- on the left); or first mount the device in a VM, then select the mount point
- inside that VM as the backup destination.
-
- You must also specify a directory on the device or in the VM, or a command
- to be executed in the VM as a destination for your backup. For example, if
- you wish to send your backup to the `~/backups` folder in the target VM, you
- would simply browse to it using the convenient directory selection dialog
- (`...`) at the right. This destination directory must already exist. If it
- does not exist, you must create it manually prior to backing up.
-
- By specifying the appropriate directory as the destination in a VM, it is
- possible to send the backup directly to, e.g., a USB mass storage device
- attached to the VM. Likewise, it is possible to enter any command as a
- backup target by specifying the command as the destination in the VM. This
- can be used to send your backup directly to, e.g., a remote server using
- SSH.
-
- **Note:** The supplied passphrase is used for **both** encryption/decryption
- and integrity verification.
-
- At this point, you may also choose whether to save your settings by checking
- or unchecking the **Save settings as default backup profile** box.
-
- **Warning: Saving the settings will result in your backup passphrase being
- saved in plaintext in dom0, so consider your threat model before checking
- this box.**
-
-4. You will now see the summary of VMs to be backed up. If there are any issues
- preventing the backup, they will be listed here and the **Next** button
- grayed out.
-
-5. When you are ready, click **Next**. Qubes will proceed to create your
- backup. Once the progress bar has completed, you may click **Finish**.
-
-6. Test restore your backup. Follow the [restore
- procedure](#restoring-from-a-backup), selecting **Verify backup integrity,
- do not restore the data**. This step is optional but strongly recommended. A
- backup is useless if you can't restore your data from it, and you can't be
- sure that your backup is good until you try to restore.
-
-## Restoring from a backup
-
-1. Go to **Applications menu -> System Tools -> Restore Backup**. This brings
- up the **Qubes Restore VMs** window.
-
-2. Select the source location of the backup to be restored:
-
- - If your backup is located on a [USB mass storage device](/doc/usb/),
- attach it first to another VM or select `sys-usb` in the next item.
- - If your backup is located in a (currently running) VM, select the VM in
- the drop-down box next to **app qube**.
-
- You must also specify the directory and filename of the backup (or a command
- to be executed in a VM) in the **Backup file** field. If you followed the
- instructions in the previous section, "Creating a Backup," then your backup
- is most likely in the location you chose as the destination in step 3. For
- example, if you had chosen the `~/backups` directory of a VM as your
- destination in step 3, you would now select the same VM and again browse to
- (using `...`) the `backups` folder. Once you've located the backup file,
- double-click it or select it and hit **OK**.
-
-3. There are three options you may select when restoring from a backup:
- 1. **ignore missing templates and net VMs**: If any of the VMs in your
- backup depended upon a NetVM or template that is not present in (i.e.,
- "missing from") the current system, checking this box will ignore the fact
- that they are missing and restore the VMs anyway and set them to use the
- default NetVM and system default template.
- 2. **ignore username mismatch**: This option applies only to the restoration
- of dom0's home directory. If your backup was created on a Qubes system which
- had a different dom0 username than the dom0 username of the current system,
- then checking this box will ignore the mismatch between the two usernames
- and proceed to restore the home directory anyway.
- 3. **Verify backup integrity, do not restore the data**: This will scan the
- backup file for corrupted data. However, it does not currently detect if it
- is missing data as long as it is a correctly structured, non-corrupted
- backup file. See [issue
- #3498](https://github.com/QubesOS/qubes-issues/issues/3498) for more
- details.
-
-4. If your backup is encrypted, you must check the **Encrypted backup** box. If
-a passphrase was supplied during the creation of your backup (regardless of
-whether it is encrypted), then you must supply it here.
-
- **Note:** The passphrase which was supplied when the backup was created is
- used for **both** encryption/decryption and integrity verification. If the
- backup was not encrypted, the supplied passphrase is used only for integrity
- verification. All backups made from a Qubes R4.0 system will be encrypted.
-
-5. You will now see the summary of VMs to be restored. If there are any issues
-preventing the restore, they will be listed here and the **Next** button grayed
-out.
-
-6. When you are ready, click **Next**. Qubes will proceed to restore from your
-backup. Once the progress bar has completed, you may click **Finish**.
-
-**Note:** When restoring from a dom0 backup, a new directory will be created in
-the current dom0 home directory, and the contents from the backup will be
-placed inside this new directory. This is intentional, as it allows users to
-have explicit control over which files and settings get applied in dom0. If the
-contents from the dom0 backup were instead to overwrite the existing files in
-dom0's home directory, unexpected and undesired configuration changes could
-occur. However, if you do wish to move all files from the dom0 backup out of
-the subdirectory into your current dom0 home directory (overwriting any
-existing files in the process), you may do so by following the instructions
-[here](https://stackoverflow.com/questions/20192070/how-to-move-all-files-including-hidden-files-into-parent-directory-via).
-Just remember that this can cause unexpected and desired configuration changes
-in dom0, depending on exactly which files you're adding and replacing.
-
-## Emergency backup recovery without qubes
-
-The Qubes backup system has been designed with emergency disaster recovery in
-mind. No special Qubes-specific tools are required to access data backed up by
-Qubes. In the event a Qubes system is unavailable, you can access your data on
-any GNU/Linux system with the following procedure.
-
-Refer to the following for emergency restore of a backup created on:
-
-- [Qubes R4 or newer](/doc/backup-emergency-restore-v4/)
-- [Qubes R3](/doc/backup-emergency-restore-v3/)
-- [Qubes R2 or older](/doc/backup-emergency-restore-v2/)
-
-## Migrating between two physical machines
-
-In order to migrate your Qubes system from one physical machine to another,
-simply follow the backup procedure on the old machine, [install
-Qubes](/downloads/) on the new machine, and follow the restoration procedure on
-the new machine. All of your settings and data will be preserved!
-
-## Choosing a backup passphrase
-
-Here are some things to consider when selecting a passphrase for your backups:
-
-- If you plan to store the backup for a long time or on third-party servers,
- you should make sure to use a very long, high-entropy passphrase. (Depending
- on the decryption passphrase you use for your system drive, this may
- necessitate selecting a stronger passphrase. If your system drive decryption
- passphrase is already sufficiently strong, it may not.)
-- An adversary who has access to your backups may try to substitute one backup
- for another. For example, when you attempt to retrieve a recent backup, the
- adversary may instead give you a very old backup containing a compromised VM.
- If you're concerned about this type of attack, you may wish to use a
- different passphrase for each backup, e.g., by appending a number or date to
- the passphrase.
-- If you're forced to enter your system drive decryption passphrase in plain
- view of others (where it can be shoulder-surfed), then you may want to use a
- different passphrase for your backups (even if your system drive decryption
- passphrase is already maximally strong). On the other hand, if you're careful
- to avoid shoulder-surfing and/or have a passphrase that's difficult to detect
- via shoulder-surfing, then this may not be a problem for you.
-
-## Notes
-
-- For the technical details of the backup system, please refer to [this
- thread](https://groups.google.com/d/topic/qubes-devel/TQr_QcXIVww/discussion).
-- If working with symlinks, note the issues described in [this
- thread](https://groups.google.com/d/topic/qubes-users/EITd1kBHD30/discussion).
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-copy-and-move-files.md b/user/how-to-guides/how-to-copy-and-move-files.md
index ca95e053d..55cceffc3 100644
--- a/user/how-to-guides/how-to-copy-and-move-files.md
+++ b/user/how-to-guides/how-to-copy-and-move-files.md
@@ -7,59 +7,7 @@ redirect_from:
- /en/doc/copying-files/
- /doc/CopyingFiles/
- /wiki/CopyingFiles/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-copy-and-move-files.html
ref: 191
title: How to copy and move files
----
-
-*This page is about copying and moving files.
-If you wish to simply copy and paste text, that can be done more easily using the inter-qube clipboard.
-See [copying and pasting text between qubes](/doc/how-to-copy-and-paste-text/).
-For dom0, see [copying from (and to) dom0](/doc/how-to-copy-from-dom0/).*
-
-Qubes OS supports the secure copying and moving of files and directories (folders) between qubes.
-
-For simplicity, these instructions will refer to copying/moving a single file, but they apply equally well to groups of files and directories, which are copied recursively.
-
- 1. Open a file manager in the qube containing the file you wish to copy (the source qube), right-click on the file you wish to copy or move, and select `Copy to Other AppVM...` or `Move to Other AppVM...`.
-
- 2. A dialog box will appear in dom0 asking for the name of the target qube (qube B).
- Enter or select the desired destination qube name.
-
- 3. If the target qube is not already running, it will be started automatically, and the file will be copied there.
- It will show up in this directory (which will automatically be created if it does not already exist):
-
- /home/user/QubesIncoming//
-
- If you selected **Move** rather than **Copy**, the original file in the source qube will be deleted.
- (Moving a file is equivalent to copying the file, then deleting the original.)
-
- 4. If you wish, you may now move the file in the target qube to a different directory and delete the `/home/user/QubesIncoming/` directory when no longer needed.
-
-The same operations are also available via these command-line tools:
-
-```
-qvm-copy [--without-progress] file [file]+
-```
-
-```
-qvm-move [--without-progress] file [file]+
-```
-
-Security
---------
-
-The inter-qube file copy system is secure because it doesn't allow other qubes to steal the files that are being copied, and it doesn't allow the source qube to overwrite arbitrary files on the destination qube.
-Moreover, this system doesn't use any sort of virtual block device for file copy.
-Instead, we use Xen shared memory, which eliminates a lot of processing of untrusted data.
-For example, the receiving qube is *not* forced to parse untrusted partitions or file systems.
-In this respect, the inter-qube file copy system provides even more security than file copy between two physically separated (air-gapped) machines!
-(See [Software compartmentalization vs. physical separation](https://invisiblethingslab.com/resources/2014/Software_compartmentalization_vs_physical_separation.pdf) for more on this.)
-
-However, one should keep in mind that performing a data transfer from *less trusted* to *more trusted* qubes is always potentially insecure if the data will be parsed in the target qube.
-This is because the data that we copy could try to exploit some hypothetical bug in software running in the target qube.
-For example, a seemingly-innocent JPEG that we copy from an untrusted qube might contain a specially-crafted exploit for a bug in a JPEG-parsing application in the target qube.
-This is a general problem and applies to any data transfer from *less trusted* to *more trusted* qubes.
-It even applies to the scenario of copying files between air-gapped machines.
-Therefore, you should always copy data only from *more trusted* to *less trusted* qubes.
-
-See also [this article](https://blog.invisiblethings.org/2011/03/13/partitioning-my-digital-life-into.html) for more information on this topic, and some ideas of how we might solve this problem in some future version of Qubes.
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-copy-and-paste-text.md b/user/how-to-guides/how-to-copy-and-paste-text.md
index bef55c778..e9b8648c3 100644
--- a/user/how-to-guides/how-to-copy-and-paste-text.md
+++ b/user/how-to-guides/how-to-copy-and-paste-text.md
@@ -7,82 +7,7 @@ redirect_from:
- /en/doc/copy-paste/
- /doc/CopyPaste/
- /wiki/CopyPaste/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-copy-and-paste-text.html
ref: 196
title: How to copy and paste text
----
-
-*This page is about copying and pasting plain text.
-If you wish to copy more complex data, such as rich text or images, see [copying and moving files between qubes](/doc/how-to-copy-and-move-files/).
-For dom0, see [copying from (and to) dom0](/doc/how-to-copy-from-dom0/).*
-
-Qubes OS features a secure inter-qube clipboard that allows you to copy and paste text between qubes.
-
-In order to copy text from qube A to qube B:
-
- 1. Select text from the source app in qube A, then copy it normally (e.g., by pressing Ctrl+C).
-
- 2. With the source app in qube A still in focus, press Ctrl+Shift+C.
- This copies the text from qube A's clipboard to the inter-qube clipboard.
-
- 3. Select the target app in qube B and press Ctrl+Shift+V.
- This copies the text from the inter-qube clipboard to qube B's clipboard and clears the inter-qube clipboard, ensuring that only qube B will have access to the copied text.
-
- 4. Paste the text in the target app in qube B normally (e.g., by pressing Ctrl+V).
-
-This process might look complicated at first glance, but in practice it is actually very easy and fast once you get used to it.
-At the same time, it provides you with full control over exactly which qube receives the content of the inter-qube clipboard every time.
-
-Security
---------
-
-The inter-qube clipboard system is secure because it doesn't allow any qube other than your selected target to steal any contents from the inter-qube clipboard.
-Without such a system in place, any password you were to copy from the password manager in your vault qube to another qube, for example, would immediately be leaked to every other running qube in the system, including qubes that are untrusted by default, such as `sys-net`.
-By giving you precise control over exactly which qube receives the inter-qube clipboard content, then immediately wiping the inter-qube clipboard afterward, Qubes OS protects the confidentiality of the text being copied.
-
-However, one should keep in mind that performing a copy and paste operation from *less trusted* to *more trusted* qube is always potentially insecure, since the data that we copy could exploit some hypothetical bug in the target qube.
-For example, the seemingly-innocent link that we copy from an untrusted qube could turn out to be a large buffer of junk that, when pasted into the target qube's word processor, could exploit a hypothetical bug in the undo buffer.
-This is a general problem and applies to any data transfer from *less trusted* to *more trusted* qubes.
-It even applies to copying files between physically separate (air-gapped) machines.
-Therefore, you should always copy clipboard data only from *more trusted* to *less trusted* qubes.
-
-See also [this article](https://blog.invisiblethings.org/2011/03/13/partitioning-my-digital-life-into.html) for more information on this topic, and some ideas of how we might solve this problem in some future version of Qubes, as well as [this message](https://groups.google.com/group/qubes-devel/msg/48b4b532cee06e01) from qubes-devel.
-
-### Focus stealing
-
-The above discussion assumes that you control which window is focused in dom0 at the time of the paste.
-However, if your dom0 window manager is configured to give focus to newly created windows (which, as of Qubes 4.0, is true in the default install with Xfce), then a malicious qube could "steal the focus" by creating a window just before you press Ctrl+Shift+V, and it would receive the data instead of your intended target.
-(Focus stealing is a risk any time you are typing confidential data, but a Qubes clipboard paste probably presents the greatest risk of leaking an entire password before you have time to react.)
-You may be able to mitigate this risk by changing the window manager configuration.
-For example, with Xfce, you could run `xfwm4-settings` in dom0, go to the "Focus" tab, and un-check "Automatically give focus to newly created windows".
-However, we have not confirmed whether such settings are sufficient to prevent a malicious qube from stealing the focus in all cases.
-
-Clipboard automatic policy enforcement
---------------------------------------
-
-The Qubes clipboard [RPC policy](/doc/rpc-policy/) is configurable in:
-
-~~~
-/etc/qubes-rpc/policy/qubes.ClipboardPaste
-~~~
-
-You may wish to configure this policy in order to prevent user error.
-For example, if you are certain that you never wish to paste *into* your "vault" app qube (and it is highly recommended that you do not), then you should edit the policy as follows:
-
-~~~
-@anyvm vault deny
-@anyvm @anyvm ask
-~~~
-
-Shortcut configuration
-----------------------
-
-The copy/paste shortcuts are configurable via `qvm-features`, e.g.
-
-~~~
-qvm-features dom0 gui-default-secure-copy-sequence 'Mod4-c'
-qvm-features dom0 gui-default-secure-paste-sequence 'Mod4-v'
-~~~
-
-would change the *copy/paste to global clipboard* to the Win key plus c for copy, or v for paste.
-
-You need to restart Qubes for the changes to take effect.
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-copy-from-dom0.md b/user/how-to-guides/how-to-copy-from-dom0.md
index 0aacfcbb3..478c8aaa2 100644
--- a/user/how-to-guides/how-to-copy-from-dom0.md
+++ b/user/how-to-guides/how-to-copy-from-dom0.md
@@ -8,78 +8,7 @@ redirect_from:
- /en/doc/copy-to-dom0/
- /doc/CopyToDomZero/
- /wiki/CopyToDomZero/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-copy-from-dom0.html
ref: 198
title: How to copy from dom0
----
-
-This page covers copying files and clipboard text between [dom0](/doc/glossary/#dom0) and [domUs](/doc/glossary/#domu).
-Since dom0 is special, the processes are different from [copying and pasting text between qubes](/doc/how-to-copy-and-paste-text/) and [copying and moving files between qubes](/doc/how-to-copy-and-move-files/).
-
-## Copying **from** dom0
-
-### Copying files from dom0
-
-To copy a file from dom0 to a VM, simply use `qvm-copy-to-vm`:
-
-```
-qvm-copy-to-vm
-```
-
-The file will arrive in the target VM in the `/home/user/QubesIncoming/dom0/` directory.
-
-### Copying and pasting clipboard text from dom0
-
-Use the **Qubes Clipboard** widget:
-
- 1. Copy text to the clipboard normally in dom0 (e.g., by pressing Ctrl+C).
-
- 2. Click the **Qubes Clipboard** icon in the Notification Area.
-
- 3. Click "Copy dom0 clipboard".
- This displays a notification that text has been copied to the inter-qube clipboard.
-
- 4. Press Ctrl+Shift+V in the target qube.
- This pastes the inter-qube clipboard contents into the target qube's normal clipboard.
-
- 5. Paste normally within that qube (e.g., by pressing Shift+V).
-
-Alternatively, you can put your text in a file, then [copy it as a file](#copying-files-from-dom0).
-Or, you can write the data you wish to copy into `/var/run/qubes/qubes-clipboard.bin`, then `echo -n dom0 > /var/run/qubes/qubes-clipboard.bin.source`.
-Then use Ctrl+Shift+V to paste the data to the target qube.
-
-### Copying logs from dom0
-
-In order to easily copy/paste the contents of logs from dom0 to the inter-VM clipboard, you can simply:
-
- 1. Right-click on the desired qube in the Qube Manager.
-
- 2. Click "Logs."
-
- 3. Click on the desired log.
-
- 4. Click "Copy to Qubes clipboard."
-
-You may now paste the log contents in qube as you normally would (e.g., Ctrl+Shift+V, then Ctrl+V).
-
-## Copying **to** dom0
-
-Copying anything into dom0 is not advised, since doing so can compromise the security of your Qubes system.
-For this reason, there is no simple means of copying anything into dom0, unlike [copying from dom0](#copying-from-dom0).
-
-There should normally be few reasons for the user to want to copy anything from domUs to dom0, as dom0 only acts as a "thin trusted terminal", and no user applications run there.
-Sometimes, new users feel the urge to copy a desktop wallpaper image into dom0, but that is not necessary.
-A safer approach is simply to display the image in [full-screen mode](/doc/full-screen-mode/) in an app qube, then take a screenshot from dom0, which results in exactly the image needed for a wallpaper, created securely and natively in dom0.
-
-If you are determined to copy some files to dom0 anyway, you can use the following method.
-(If you want to copy text, first save it into a text file.)
-Run this command in a dom0 terminal:
-
-```
-qvm-run --pass-io 'cat /path/to/file_in_src_domain' > /path/to/file_name_in_dom0
-```
-
-Note that you can use the same method to copy files from dom0 to domUs (if, for some reason, you don't want to use `qvm-copy-to-vm`):
-
-```
-cat /path/to/file_in_dom0 | qvm-run --pass-io 'cat > /path/to/file_name_in_appvm'
-```
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-enter-fullscreen-mode.md b/user/how-to-guides/how-to-enter-fullscreen-mode.md
index 201d6d2e4..9e1a66195 100644
--- a/user/how-to-guides/how-to-enter-fullscreen-mode.md
+++ b/user/how-to-guides/how-to-enter-fullscreen-mode.md
@@ -7,66 +7,7 @@ redirect_from:
- /en/doc/full-screen-mode/
- /doc/FullScreenMode/
- /wiki/FullScreenMode/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-enter-fullscreen-mode.html
ref: 205
title: How to enter fullscreen mode
----
-
-What is fullscreen mode?
--------------------------
-
-Normally, the Qubes GUI virtualization daemon restricts the VM from "owning" the full screen, ensuring that there are always clearly marked decorations drawn by the trusted Window Manager around each of the VMs window.
-This allows the user to easily realize to which domain a specific window belongs.
-See the [screenshots](/doc/QubesScreenshots/) page for examples.
-
-Why is fullscreen mode potentially dangerous?
-----------------------------------------------
-
-If one allowed one of the VMs to "own" the full screen, e.g. to show a movie on a full screen, it might not be possible for the user to know if the applications/VM really "released" the full screen, or if it has started emulating the whole desktop and is pretending to be the trusted Window Manager, drawing shapes on the screen that look e.g. like other windows, belonging to other domains (e.g. to trick the user into entering a secret passphrase into a window that looks like belonging to some trusted domain).
-
-Secure use of fullscreen mode
-------------------------------
-
-However, it is possible to deal with fullscreen mode in a secure way assuming there are mechanisms that can be used at any time to switch between windows or show the full desktop and that cannot be intercepted by the VM.
-The simplest example is the use of Alt+Tab for switching between windows, which is a shortcut handled by dom0.
-
-Other examples such mechanisms are the KDE "Present Windows" and "Desktop Grid" effects, which are similar to Mac's "Expose" effect, and which can be used to immediately detect potential "GUI forgery", as they cannot be intercepted by any of the VM (as the GUID never passes down the key combinations that got consumed by KDE Window Manager), and so the VM cannot emulate those.
-Those effects are enabled by default in KDE once Compositing gets enabled in KDE (System Settings -\> Desktop -\> Enable Desktop Effects), which is recommended anyway.
-By default, they are triggered by Ctrl-F8 and Ctrl-F9 key combinations, but can also be reassigned to other shortcuts.
-
-Enabling fullscreen mode for select VMs
-----------------------------------------
-
-You can always put a window into fullscreen mode in Xfce4 using the trusted window manager by right-clicking on a window's title bar and selecting "Fullscreen" or pressing `alt` + `f11`.
-This functionality should still be considered safe, since a VM window still can't voluntarily enter fullscreen mode.
-The user must select this option from the trusted window manager in dom0.
-To exit fullscreen mode from here, press `alt` + `space` to bring up the title bar menu again, then select "Leave Fullscreen" or simply press `alt` + `f11`.
-For StandaloneHVMs, you should set the screen resolution in the qube to that of the host, (or larger), *before* setting fullscreen mode in Xfce4.
-
-As an alternative to the Xfce4 method, you can enable fullscreen mode for select VMs by creating the following entry in the `/etc/qubes/guid.conf` file in dom0:
-
-~~~
-VM: {
- personal: {
- allow_fullscreen = true;
- };
-};
-~~~
-
-The string 'personal' above is an example only and should be replaced by the actual name of the VM for which you want to enable this functionality.
-
-**Note:** There should be only one `VM: {}` block in the file (or you will [get into problems](https://groups.google.com/d/msg/qubes-users/-Yf9yNvTsVI/xXsEm8y2lrYJ)).
-
-One can also enable this functionality for all the VMs globally in the same file, by modifying the 'global' section:
-
-~~~
-global: {
- # default values
- allow_fullscreen = true;
- #allow_utf8_titles = false;
- #secure_copy_sequence = "Ctrl-Shift-c";
- #secure_paste_sequence = "Ctrl-Shift-v";
- #windows_count_limit = 500;
-};
-~~~
-
-Be sure to restart the VM(s) after modifying this file, for the changes to take effect.
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-install-software.md b/user/how-to-guides/how-to-install-software.md
index d9cf0a269..fb95bfbec 100644
--- a/user/how-to-guides/how-to-install-software.md
+++ b/user/how-to-guides/how-to-install-software.md
@@ -8,471 +8,7 @@ redirect_from:
- /en/doc/software-update-vm/
- /doc/SoftwareUpdateVM/
- /wiki/SoftwareUpdateVM/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-install-software.html
ref: 189
title: How to install software
----
-
-When you wish to install software in Qubes OS, you should generally install it
-in a [template](/doc/glossary/#template). For installing templates themselves,
-see [how to install a template](/doc/templates/#installing). Advanced users may
-also be interested in learning how to install software in
-[standalones](/doc/standalones-and-hvms/) and
-[dom0](/doc/how-to-install-software-in-dom0).
-
-Qubes OS is effectively a "meta" operating system (OS) that can run almost any
-arbitrary OS inside of itself. For example, the way software is normally
-installed in a Linux distribution ("distro") is quite different from the way
-software is normally installed in Windows. This isn't up to Qubes. Qubes is
-just the framework in which you're running these other OSes. Therefore, if you
-want to install software in a Linux template, for example, you should do so in
-whatever way is normal for that Linux distro. Most Linux software is
-distributed via [packages](https://en.wikipedia.org/wiki/Package_format), which
-are stored in [software
-repositories](https://en.wikipedia.org/wiki/Software_repository) ("repos").
-[Package managers](https://en.wikipedia.org/wiki/Package_manager) handle
-downloading, installing, updating, and removing packages. (Again, none of this
-is Qubes-specific.) If you're not familiar with how software is normally
-installed in Linux distros via package managers or the software you want
-doesn't seem to be available in your distro's repos (or you're in another
-situation not covered on this page), please read this [community guide to
-installing software in Qubes](https://forum.qubes-os.org/t/9991/).
-
-The following instructions explain how to permanently install new software in a
-template. There are different instructions for software from the default
-repositories and all other software. (If you're not sure, try the default
-repositories first.)
-
-
-## Installing software from default repositories
-
-1. Start the template.
-
-2. Start either a terminal (e.g. `gnome-terminal`) or a dedicated software
- management application, such as `gpk-application`.
-
-3. Install software as normally instructed inside that operating system, e.g.:
- - Fedora: `sudo dnf install `
- - Debian: `sudo apt install `
-
-4. Shut down the template.
-
-5. Restart all qubes based on the template.
-
-6. (Recommended) In the relevant qubes' **Settings > Applications** tab, select
-the new application(s) from the list, and press **OK**. These new shortcuts
-will appear in the Applications Menu. (If you encounter problems, see
-[here](/doc/app-menu-shortcut-troubleshooting/) for troubleshooting.)
-
-](/attachment/doc/r4.1-dom0-appmenu-select.png)
-
-
-## Installing software from other sources
-
-**Warning:** This method gives your template direct network access, which is
-[risky](#why-dont-templates-have-network-access). This method is **not**
-recommended for trusted templates. Moreover, depending on how you install this
-software, it may not get updated automatically when you [update Qubes
-normally](/doc/how-to-update/), which means you may have to update it manually
-yourself.
-
-Some software is not available from the default repositories and must be
-downloaded and installed from another source. This method assumes that you're
-trying to follow the instructions to install some piece of software in a normal
-operating system, except that operating system is running as a template in
-Qubes OS.
-
-1. (Recommended) Clone the desired template (since this new template will
- probably be less trusted than the original).
-
-2. (Recommended) In the new template's **Settings > Basic** tab, change the
- color label from black to red (or another color that signifies to you that
- the template is less trusted).
-
-3. In the new template's **Settings > Basic** tab, change the **Networking**
- value from `default (none) (current)` to `sys-firewall` (or whichever
- network-providing qube you wish to use).
-
-4. (Recommended) In the new template's **Settings > Firewall rules** tab,
- select "Limit outgoing Internet connections to..." and tick "Allow full
- access for 5 min." (This can help in case you forget to remove network
- access later.)
-
-5. Follow the normal instructions for installing your software in the new
- template. For example, open a terminal and enter the commands as instructed.
- **Warning:** If you don't fully understand the commands you're entering,
- then this can be extremely risky, and the template should be regarded as
- *completely untrusted*.
-
-6. (Recommended) In the new template's **Settings > Basic** tab, change the
- **Networking** value from `sys-firewall (current)` (or whichever
- network-providing qube you chose) back to `default (none)`.
-
-7. Shut down the new template.
-
-8. Create or assign your desired app qubes to use the new template. If any app
- qubes were already assigned to the new template, restart them.
-
-9. (Recommended) In the relevant qubes' **Settings > Applications** tab, select
- the new application(s) from the list, and press **OK**. These new shortcuts
- will appear in the Applications Menu. (If you encounter problems, see
- [here](/doc/app-menu-shortcut-troubleshooting/) for troubleshooting.)
-
-](/attachment/doc/r4.1-dom0-appmenu-select.png)
-
-
-## Troubleshooting
-
-If things are still not working as expected:
-
-- Review the instructions very carefully, making sure you follow each step.
-- Make sure you **shut down the template after installing your software**.
-- Make sure you **restart your app qube *after* shutting down your template**.
-- Make sure your app qube is assigned to the right template.
-- If your software requires special files or directories to be persistent, and
- you're an advanced user, see [standalones and
- HVMs](/doc/standalones-and-hvms/) and [how to make any file persistent
- (bind-dirs)](/doc/bind-dirs/).
-- [Ask for help.](/support/)
-
-
-## How to update software
-
-Please see [How to Update](/doc/how-to-update/).
-
-
-## Why don't templates have network access?
-
-In order to protect you from performing risky activities in templates, they do
-not have normal network access by default. Instead, templates use an [updates
-proxy](#updates-proxy) that allows you to install and update software without
-giving the template direct network access. **The updates proxy is already set
-up to work automatically out-of-the-box and requires no special action from
-you.** Most users should simply follow the normal instructions for [installing
-software from default
-repositories](#installing-software-from-default-repositories) and
-[updating](/doc/how-to-update/) software. If your software is not available in
-the default repositories, see [installing software from other
-sources](#installing-software-from-other-sources).
-
-
-## Advanced
-
-The following sections cover advanced topics pertaining to installing and
-updating software in domUs.
-
-
-### Testing repositories
-
-If you wish to install updates that are still in [testing](/doc/testing), you
-must enable the appropriate testing repositories.
-
-**Note:** The following repos are in templates and standalones. For dom0 testing
-repos, see [here](/doc/how-to-install-software-in-dom0/#testing-repositories).
-For testing new templates, please see [here](/doc/testing/#templates).
-
-
-#### Fedora
-
-There are three Qubes VM testing repositories (where `*` denotes the Release):
-
-- `qubes-vm-*-current-testing` -- testing packages that will eventually land in
- the stable (`current`) repository
-- `qubes-vm-*-security-testing` -- a subset of `qubes-vm-*-current-testing`
- that contains packages that qualify as security fixes
-- `qubes-vm-*-unstable` -- packages that are not intended to land in the stable
- (`qubes-vm-*-current`) repository; mostly experimental debugging packages
-
-To temporarily enable any of these repos, use the `--enablerepo=`
-option. Example commands:
-
-~~~
-sudo dnf upgrade --enablerepo=qubes-vm-*-current-testing
-sudo dnf upgrade --enablerepo=qubes-vm-*-security-testing
-sudo dnf upgrade --enablerepo=qubes-vm-*-unstable
-~~~
-
-To enable or disable any of these repos permanently, change the corresponding
-`enabled` value to `1` in `/etc/yum.repos.d/qubes-*.repo`.
-
-
-#### Debian
-
-Debian also has three Qubes VM testing repositories (where `*` denotes the
-Release):
-
-- `*-testing` -- testing packages that will eventually land in the stable
- (`current`) repository
-- `*-securitytesting` -- a subset of `*-testing` that contains packages that
- qualify as security fixes
-- `*-unstable` -- packages that are not intended to land in the stable
- repository; mostly experimental debugging packages
-
-To enable or disable any of these repos permanently, uncomment the
-corresponding `deb` line in `/etc/apt/sources.list.d/qubes-r*.list`.
-
-
-### Standalones
-
-The process for installing and updating software in
-[standalones](/doc/glossary/#standalone) is the same as described above for
-templates, except no qubes are based on standalones, so there are no other
-qubes to restart.
-
-
-### RPMFusion for Fedora templates
-
-If you would like to enable the [RPM Fusion](https://rpmfusion.org/)
-repositories, open a Terminal of the template and type the following commands,
-depending on which RPM Fusion repositories you wish to enable (see [RPM
-Fusion](https://rpmfusion.org/) for details):
-
-~~~
-sudo dnf config-manager --set-enabled rpmfusion-free
-sudo dnf config-manager --set-enabled rpmfusion-free-updates
-sudo dnf config-manager --set-enabled rpmfusion-nonfree
-sudo dnf config-manager --set-enabled rpmfusion-nonfree-updates
-sudo dnf upgrade --refresh
-~~~
-
-This will permanently enable the RPM Fusion repos. If you install software from
-here, it's important to keep these repos enabled so that you can receiving
-future updates. If you only enable these repos temporarily to install a package
-the Qubes update mechanism may persistently notify you that updates are
-available, since it cannot download them.
-
-
-### Reverting changes to a template
-
-Perhaps you've just updated your template, and the update broke your template.
-Or perhaps you've made a terrible mistake, like accidentally confirming the
-installation of an unsigned package that could be malicious. If you want to
-undo changes to a template, there are three basic methods:
-
-1. **Root revert.**
- This is appropriate for misconfigurations, but not for security concerns. It
- will preserve your customizations.
-
-2. **Reinstall the template.**
- This is appropriate for both misconfigurations and security concerns, but
- you will lose all customizations.
-
-3. **Full revert.**
- This is appropriate for both misconfigurations and security concerns, and it
- can preserve your customizations. However, it is a bit more complex.
-
-
-#### Root revert
-
-**Important:** This command will roll back any changes made *during the last
-time the template was run, but **not** before.* This means that if you have
-already restarted the template, using this command is unlikely to help, and
-you'll likely want to reinstall it from the repository instead. On the other
-hand, if the template is already broken or compromised, it won't hurt to try
-reverting first. Just make sure to **back up** all of your data and changes
-first!
-
-1. Shut down ``. If you've already just shut it down, do **not**
- start it again (see above).
-
-2. In a dom0 terminal:
-
- ```
- qvm-volume revert :root
- ```
-
-
-#### Reinstall the template
-
-Please see [How to Reinstall a template](/doc/reinstall-template/).
-
-
-#### Full revert
-
-This is like the simple revert, except:
-
-- You must also revert the private volume with `qvm-volume revert
- :private`. This requires you to have an old revision of the private
- volume, which does not exist with the current default config. However, if you
- don't have anything important in the private volume (likely for a template),
- then you can work around this by just resetting the private volume with
- `qvm-volume import --no-resize :private /dev/null`.
-
-- The saved revision of the volumes must be uncompromised. With the default
- `revisions_to_keep=1` for the root volume, you must **not** have started the
- template since the compromising action.
-
-
-### Updates proxy
-
-Updates proxy is a service which allows access only from package managers. This
-is meant to mitigate user errors (like using browser in the template), rather
-than some real isolation. It is done with http proxy (tinyproxy) instead of
-simple firewall rules because it is hard to list all the repository mirrors
-(and keep that list up to date). The proxy is used only to filter the traffic,
-not to cache anything.
-
-The proxy is running in selected VMs (by default all the NetVMs (1)) and
-intercepts traffic directed to 10.137.255.254:8082. Thanks to such
-configuration all the VMs can use the same proxy address, and if there is a
-proxy on network path, it will handle the traffic (of course when firewall
-rules allow that). If the VM is configured to have access to the updates proxy
-(2), the startup scripts will automatically configure dnf to really use the
-proxy (3). Also access to updates proxy is independent of any other firewall
-settings (VM will have access to updates proxy, even if policy is set to block
-all the traffic).
-
-There are two services (`qvm-service`, [service
-framework](/doc/qubes-service/)):
-
-1. `qubes-updates-proxy` (and its deprecated name: `qubes-yum-proxy`) - a
- service providing a proxy for templates - by default enabled in NetVMs
- (especially: sys-net)
-2. `updates-proxy-setup` (and its deprecated name: `yum-proxy-setup`) - use a
- proxy provided by another VM (instead of downloading updates directly),
- enabled by default in all templates
-
-Both the old and new names work. The defaults listed above are applied if the
-service is not explicitly listed in the services tab.
-
-
-#### Technical details
-
-The updates proxy uses RPC/qrexec. The proxy is configured in qrexec policy in
-dom0: `/etc/qubes-rpc/policy/qubes.UpdatesProxy`. By default this is set to
-sys-net and/or sys-whonix, depending on firstboot choices. This new design
-allows for templates to be updated even when they are not connected to any
-NetVM.
-
-Example policy file in R4.0 (with Whonix installed, but not set as default
-UpdateVM for all templates):
-
-```shell_session
-# any VM with tag `whonix-updatevm` should use `sys-whonix`; this tag is added to `whonix-gw` and `whonix-ws` during installation and is preserved during template clone
-@tag:whonix-updatevm @default allow,target=sys-whonix
-@tag:whonix-updatevm @anyvm deny
-
-# other templates use sys-net
-@type:template @default allow,target=sys-net
-@anyvm @anyvm deny
-```
-
-
-### Installing Snap Packages
-
-Snap packages do not use the normal update channels for Debian and Fedora (apt
-and dnf) and are often installed as the user rather than as root. To support
-these in an app qube you need to take the following steps:
-
-1. In the **template** you must install `snapd` and `qubes-snapd-helper`. Open
- a terminal in the template and run:
-
- ```shell_session
- [user@fedora-30-snap-demo ~]$ sudo dnf install snapd qubes-snapd-helper
- Last metadata expiration check: 0:55:39 ago on Thu Nov 14 09:26:47 2019.
- Dependencies resolved.
- ========================================================================================================
- Package Arch Version Repository Size
- ========================================================================================================
- Installing:
- snapd x86_64 2.42.1-1.fc30 updates 17 M
- qubes-snapd-helper noarch 1.0.1-1.fc30 qubes-vm-r4.0-current 10 k
- Installing dependencies:
- [...]
-
- Transaction Summary
- ========================================================================================================
- Install 20 Packages
-
- Total download size: 37 M
- Installed size: 121 M
- Is this ok [y/N]: y
-
- Downloading Packages:
- [..]
- Failed to resolve booleanif statement at /var/lib/selinux/targeted/tmp/modules/200/snappy/cil:1174
- /usr/sbin/semodule: Failed!
- [...]
- Last metadata expiration check: 0:57:08 ago on Thu Nov 14 09:26:47 2019.
- Notifying dom0 about installed applications
-
- Installed:
- snapd-2.42.1-1.fc30.x86_64 qubes-snapd-helper-1.0.1-1.fc30.noarch
- [...]
- Complete!
- ```
-
- You may see the following message:
-
- ```
- Failed to resolve booleanif statement at /var/lib/selinux/targeted/tmp/modules/200/snappy/cil:1174
- /usr/sbin/semodule: Failed!
- ```
-
- This is expected and you can safely continue.
-
- Shutdown the template:
-
- ```shell_session
- [user@fedora-30-snap-demo ~]$ sudo shutdown -h now
- ```
-
-2. Now open the **app qube** in which you would like to install the Snap
- application and run a terminal:
-
- ```shell_session
- [user@snap-demo-app qube ~]$ snap install
- ```
-
- When the install is complete you can close the terminal window.
-
-3. Refresh the Applications list for the app qube. In the Qubes Menu for the
- **app qube*** launch the Qube Settings. Then go to the Applications tab and
- click "Refresh Applications"
-
- The refresh will take a few minutes; after it's complete the Snap app will
- appear in the app qube's list of available applications. At this point the
- snap will be persistent within the app qube and will receive updates when
- the app qube is running.
-
-
-### Autostarting Installed Applications
-
-If you want a desktop app to start automatically every time a qube starts you
-can create a link to it in the `~/.config/autostart` directory of the **app
-qube**. This might be useful for Qubes that you set to automatically start on
-boot or for Qubes that have a set of apps you typically use all day, such as a
-chat app.
-
-1. Open a terminal in the **app qube** where you would like the app to launch.
-
-2. List the names of the available desktop shortcuts by running the command `ls
- /usr/share/applications` and find the exact name of the shortcut to the app
- you want to autostart:
-
- ```shell_session
- [user@example-app qube ~]$ ls /usr/share/applications/
- bluetooth-sendto.desktop
- eog.desktop
- firefox.desktop
- ...
- xterm.desktop
- yelp.desktop
- ```
-
-3. Create the autostart directory:
-
- ```
- [user@example-app qube ~]$ mkdir -p ~/.config/autostart
- ```
-
-4. Make a link to the desktop app file you'd like to start in the autostart
- directory. For example, the command below will link the Thunderbird app into
- the autostart directory:
-
- ```
- [user@example-app qube ~]$ ln -s /usr/share/applications/mozilla-thunderbird.desktop ~/.config/autostart/mozilla-thunderbird.desktop
- ```
-
-Note that the app will autostart only when the app qube starts. If you would
-like the app qube to autostart, select the "Start qube automatically on boot"
-checkbox in the app qube's Qube Settings.
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-reinstall-a-template.md b/user/how-to-guides/how-to-reinstall-a-template.md
index cc7cce67a..d293969a7 100644
--- a/user/how-to-guides/how-to-reinstall-a-template.md
+++ b/user/how-to-guides/how-to-reinstall-a-template.md
@@ -5,87 +5,7 @@ permalink: /doc/how-to-reinstall-a-template/
redirect_from:
- /doc/reinstall-template/
- /doc/whonix/reinstall/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-reinstall-a-template.html
ref: 128
title: How to reinstall a template
----
-
-If you suspect your [template](/doc/templates/) is broken, misconfigured, or compromised, you can reinstall any template that was installed from the Qubes repository.
-
-Automatic Method
-----------------
-
-First, copy any files that you wish to keep from the template's `/home` and `/rw` folders to a safe storage location.
-Then, in a dom0 terminal, run:
-
-```
-$ sudo qubes-dom0-update --action=reinstall qubes-template-package-name
-```
-
-Replace `qubes-template-package-name` with the name of the *package* of the template you wish to reinstall.
-For example, use `qubes-template-fedora-25` if you wish to reinstall the `fedora-25` template.
-Only one template can be reinstalled at a time.
-
-Note that Qubes may initially refuse to perform the reinstall if the exact revision of the template package on your system is no longer in the Qubes online repository.
-In this case, you can specify `upgrade` as the action instead and the newer version will be used.
-The other `dnf` package actions that are supported in addition to `reinstall` and `upgrade` are `upgrade-to` and `downgrade`.
-Note that the `upgrade`, `upgrade-to`, and `downgrade` commands are only supported under Fedora based UpdateVMs.
-If you receive a message about them being unsupported, review the manual reinstallation method below.
-
-**Reminder:** If you're trying to reinstall a template that is not in an enabled repo, you must enable that repo.
-For example:
-
-```
-$ sudo qubes-dom0-update --enablerepo=qubes-templates-community --action=reinstall qubes-template-whonix-ws
-```
-
-**Note:** VMs that are using the reinstalled template will not be affected until they are restarted.
-
-Manual Method
--------------
-
-In what follows, the term "target template" refers to whichever template you want to reinstall.
-If you want to reinstall more than one template, repeat these instructions for each one.
-
-1. Clone the existing target template.
-
- This can be a good idea if you've customized the existing template and want to keep your customizations.
- On the other hand, if you suspect that this template is broken, misconfigured, or compromised, be certain you do not start any VMs using it in the below procedure.
-
-2. Temporarily change all VMs based on the target template to the new clone template, or remove them.
-
- This can be a good idea if you have user data in these VMs that you want to keep.
- On the other hand, if you suspect that these VMs (or the templates on which they are based) are broken, misconfigured, or compromised, you may want to remove them instead.
- You can do this in Qubes Manager by right-clicking on the VM and clicking **Remove VM**, or you can use the command `qvm-remove ` in dom0.
-
-3. Uninstall the target template from dom0:
-
- ```
- $ sudo dnf remove
- ```
-
- For example, to uninstall the `whonix-gw` template:
-
- ```
- $ sudo dnf remove qubes-template-whonix-gw
- ```
-
-4. Reinstall the target template in dom0:
-
- ```shell_session
- $ sudo qubes-dom0-update --enablerepo= \
-
- ```
-
- For example, to install the `whonix-gw` template:
-
- ```shell_session
- $ sudo qubes-dom0-update --enablerepo=qubes-templates-community \
- qubes-template-whonix-gw
- ```
-
-5. If you temporarily changed all VMs based on the target template to the clone template in step 3, change them back to the new target template now.
- If you instead removed all VMs based on the old target template, you can recreate your desired VMs from the newly reinstalled target template now.
-
-6. Delete the cloned template.
- You can do this in Qubes Manager by right-clicking on the VM and clicking **Remove VM**, or you can use the
- command `qvm-remove ` in dom0.
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-update.md b/user/how-to-guides/how-to-update.md
index 2e231304c..9df5dc28f 100644
--- a/user/how-to-guides/how-to-update.md
+++ b/user/how-to-guides/how-to-update.md
@@ -4,112 +4,7 @@ layout: doc
permalink: /doc/how-to-update/
redirect_from:
- /doc/updating-qubes-os/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-update.html
ref: 200
title: How to update
----
-
-*This page is about updating your system while staying on the same [supported
-version of Qubes OS](/doc/supported-releases/#qubes-os). If you're instead
-looking to upgrade from your current version of Qubes OS to a newer version,
-see the [Upgrade Guides](/doc/upgrade/).*
-
-## Security updates
-
-Security updates are an extremely important part of keeping your Qubes
-installation secure. When there is an important security issue, we will issue a
-[Qubes Security Bulletin (QSB)](/security/qsb/) via the [Qubes Security
-Pack (`qubes-secpack`)](/security/pack/). It is very important to read each new
-QSB and follow any user instructions it contains. Most of the time, simply
-[updating your system normally](#routine-updates) will be sufficient to obtain
-security updates. However, in some cases, special action may be required on
-your part, which will be explained in the QSB.
-
-## Routine updates
-
-It is important to keep your Qubes OS system up-to-date to ensure you have the
-latest [security updates](#security-updates), as well as the latest
-non-security enhancements and bug fixes.
-
-Fully updating your Qubes OS system means updating:
-
-- [dom0](/doc/glossary/#dom0)
-- [templates](/doc/glossary/#template)
-- [standalones](/doc/glossary/#standalone) (if you have any)
-
-You can accomplish this using the **Qubes Update** tool.
-
-[](/attachment/doc/r4.0-software-update.png)
-
-By default, the Qubes Update tool will appear as an icon in the Notification
-Area when updates are available.
-
-[](/attachment/doc/r4.0-qube-updates-available.png)
-
-However, you can also start the tool manually by selecting it in the
-Applications Menu under "Qubes Tools." Even if no updates have been detected,
-you can use this tool to check for updates manually at any time by selecting
-"Enable updates for qubes without known available updates," then selecting all
-desired items from the list and clicking "Next."
-
-## Command-line interface
-
-
-
- Warning: Updating with direct commands such as
- qubes-dom0-update, dnf update, and apt
- update is not recommended, since these bypass built-in Qubes OS
- update security measures. Instead, we strongly recommend using the Qubes
- Update tool or its command-line equivalents, as described below. (By
- contrast, installing packages
- using direct package manager commands is fine.)
-
-
-Advanced users may wish to perform updates via the command-line interface. The
-recommended way to do this is by applying the following two Salt states.
-**Applying these two Salt states is the same as updating via the Qubes Update
-tool.**
-
- - [update.qubes-dom0](/doc/salt/#updatequbes-dom0)
- - [update.qubes-vm](/doc/salt/#updatequbes-vm)
-
-In your update qube, a terminal window opens that displays the progress of
-operations and output as it is logged. At the end of the process, logs are sent
-back to dom0. You answer any yes/no prompts in your dom0 terminal window.
-
-Advanced users may also be interested in learning [how to enable the
-testing repos](/doc/testing/).
-
-## Upgrading to avoid EOL
-
-The above covers updating *within* a given operating system (OS) release.
-Eventually, however, most OS releases will reach **end-of-life (EOL)**, after
-which point they will no longer be supported. This applies to Qubes OS itself
-as well as OSes used in [templates](/doc/templates/) (and
-[standalones](/doc/standalones-and-hvms/), if you have any).
-
-**It's very important that you use only supported releases so that you continue
-to receive security updates.** This means that you *must* periodically upgrade
-Qubes OS and your templates before they reach EOL. You can always see which
-versions of Qubes OS and select templates are supported on the [Supported
-Versions](/doc/supported-releases/) page.
-
-In the case of Qubes OS itself, we will make an
-[announcement](/news/categories/#releases) when a supported Qubes OS release is
-approaching EOL and another when it has actually reached EOL, and we will
-provide [instructions for upgrading to the next stable supported Qubes OS
-release](/doc/upgrade/).
-
-Periodic upgrades are also important for templates. For example, you might be
-using a [Fedora template](/doc/templates/fedora/). The [Fedora
-Project](https://getfedora.org/) is independent of the Qubes OS Project. They
-set their own
-[schedule](https://fedoraproject.org/wiki/Fedora_Release_Life_Cycle#Maintenance_Schedule)
-for when each Fedora release reaches EOL. You can always find out when an OS
-reaches EOL from the upstream project that maintains it. We also pass along any
-EOL notices we receive for official template OSes as a convenience to Qubes
-users (see [Supported Versions:
-Templates](/doc/supported-releases/#templates)).
-
-The one exception to all this is the specific release used for dom0 (not to be
-confused with Qubes OS as a whole), which [doesn't have to be
-upgraded](/doc/supported-releases/#note-on-dom0-and-eol).
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-use-block-storage-devices.md b/user/how-to-guides/how-to-use-block-storage-devices.md
index 742ec369b..cc44e5cdc 100644
--- a/user/how-to-guides/how-to-use-block-storage-devices.md
+++ b/user/how-to-guides/how-to-use-block-storage-devices.md
@@ -8,249 +8,7 @@ redirect_from:
- /en/doc/stick-mounting/
- /doc/StickMounting/
- /wiki/StickMounting/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-use-block-storage-devices.html
ref: 193
title: How to use block storage devices
----
-
-*This page is part of [device handling in qubes](/doc/how-to-use-devices/).*
-
-If you don't know what a "block device" is, just think of it as a fancy way to say "something that stores data".
-
-## Using the Devices Widget to Attach a Drive
-
-(**Note:** In the present context, the term "USB drive" denotes any [USB mass storage device](https://en.wikipedia.org/wiki/USB_mass_storage_device_class).
-In addition to smaller flash memory sticks, this includes things like USB external hard drives.)
-
-Qubes OS supports the ability to attach a USB drive (or just its partitions) to any qube easily, no matter which qube handles the USB controller.
-
-Attaching USB drives is integrated into the Devices Widget: 
-Simply insert your USB drive and click on the widget.
-You will see multiple entries for your USB drive; typically, `sys-usb:sda`, `sys-usb:sda1`, and `sys-usb:2-1` for example.
-Entries starting with a number (e.g. here `2-1`) are the [whole usb-device](/doc/how-to-use-usb-devices/).
-Entries without a number (e.g. here `sda`) are the whole block-device.
-Other entries are partitions of that block-device (e.r. here `sda1`).
-
-The simplest option is to attach the entire block drive.
-In our example, this is `sys-usb:sda`, so hover over it.
-This will pop up a submenu showing running VMs to which the USB drive can be connected.
-Click on one and your USB drive will be attached!
-
-**Note:** attaching individual partitions (e.g. `sys-usb:sda1`) can be slightly more secure because it doesn't force the target app qube to parse the partition table.
-However, it often means the app qube won't detect the new partition and you will need to manually mount it inside the app qube.
-See below for more detailed steps.
-
-## Block Devices in VMs
-
-If not specified otherwise, block devices will show up as `/dev/xvdi*` in a linux VM, where `*` may be the partition-number.
-If a block device isn't automatically mounted after attaching, open a terminal in the VM and execute:
-
-```
-cd ~
-mkdir mnt
-sudo mount /dev/xvdi2 mnt
-```
-
-where `xvdi2` needs to be replaced with the partition you want to mount.
-This will make your drive content accessible under `~/mnt`.
-
-Beware that when you attach a whole block device, partitions can be identified by their trailing integer (i.e. `/dev/xvdi2` for the second partition, `/dev/xvdi` for the whole device), whereas if you attach a single partition, the partition has *no trailing integer*.
-
-If several different block-devices are attached to a single VM, the last letter of the device node name is advanced through the alphabet, so after `xvdi` the next device will be named `xvdj`, the next `xvdk`, and so on.
-
-To specify this device node name, you need to use the command line tool and its [`frontend-dev`-option](#frontend-dev).
-
-## Command Line Tool Guide
-
-The command-line tool you may use to mount whole USB drives or their partitions is `qvm-block`, a shortcut for `qvm-device block`.
-
-`qvm-block` won't recognise your device by any given name, but rather the device-node the sourceVM assigns.
-So make sure you have the drive available in the sourceVM, then list the available block devices (step 1.) to find the corresponding device-node.
-
-In case of a USB-drive, make sure it's attached to your computer.
-If you don't see anything that looks like your drive, run `sudo udevadm trigger --action=change` in your USB-qube (typically `sys-usb`)
-
-1. In a dom0 console (running as a normal user), list all available block devices:
-
- ```
- qvm-block
- ```
-
- This will list all available block devices in your system across all VMs.
- The name of the qube hosting the block device is displayed before the colon in the device ID.
- The string after the colon is the ID of the device used within the qube, like so:
-
- ```
- sourceVM:sdb Cruzer () 4GiB
- sourceVM:sdb1 Disk () 2GiB
- ```
-
-2. Assuming your block device is attached to `sys-usb` and its device node is `sdb`, we attach the device to a qube with the name `work` like so:
-
- ```
- qvm-block attach work sys-usb:sdb
- ```
-
- This will attach the device to the qube as `/dev/xvdi` if that name is not already taken by another attached device, or `/dev/xvdj`, etc.
-
- You may also mount one partition at a time by using the same command with the partition number, e.g. `sdb1`.
-
-3. The block device is now attached to the qube.
- If using a default qube, you may open the Nautilus file manager in the qube, and your drive should be visible in the **Devices** panel on the left.
- If you've attached a single partition (e.g. `sdb2` instead of `sdb` in our example), you may need to manually mount before it becomes visible:
-
- ```
- cd ~
- mkdir mnt
- sudo mount /dev/xvdi mnt
- ```
-
-4. When you finish using the block device, click the eject button or right-click and select **Unmount**.
-
- If you've manually mounted a single partition in the above step, use:
-
- ```
- sudo umount mnt
- ```
-
-5. In a dom0 console, detach the device
-
- ```
- qvm-block detach work sys-usb:sdb
- ```
-
-6. You may now remove the device or attach it to another qube.
-
-## Recovering From Premature Device Destruction
-
-If the you fail to detach the device before it's destroyed in the sourceVM (e.g. by physically detaching the thumbdrive), [there will be problems](https://github.com/QubesOS/qubes-issues/issues/1082).
-
-To recover from this error state, in dom0 run
-
-```
-virsh detach-disk targetVM xvdi
-```
-
-(where `targetVM` is to be replaced with the VM name you attached the device to and `xvdi` is to be replaced with the used [frontend device node](#frontend-dev).)
-
-However, if the block device originated in dom0, you will have to refer to the next section.
-
-### What if I removed the device before detaching it from the VM?
-
-Currently (until issue [1082](https://github.com/QubesOS/qubes-issues/issues/1082) gets implemented), if you remove the device before detaching it from the qube, Qubes OS (more precisely, `libvirtd`) will think that the device is still attached to the qube and will not allow attaching further devices under the same name.
-The easiest way to recover from such a situation is to reboot the qube to which the device was attached.
-If this isn't an option, you can manually recover from the situation by following these steps:
-
-1. Physically connect the device back.
- You can use any device as long as it will be detected under the same name (for example, `sdb`).
-
-2. Attach the device manually to the same VM using the `xl block-attach` command.
- It is important to use the same "frontend" device name (by default, `xvdi`).
- You can get it from the `qvm-block` listing:
-
- ```shell_session
- [user@dom0 ~]$ qvm-block
- sys-usb:sda DataTraveler_2.0 () 246 MiB (attached to 'testvm' as 'xvdi')
- [user@dom0 ~]$ sudo xl block-attach testvm phy:/dev/sda backend=sys-usb xvdi
- ```
-
- In above example, all `xl block-attach` parameters can be deduced from the output of `qvm-block`.
- In order:
-
- * `testvm` - name of target qube to which device was attached - listed in brackets by `qvm-block` command
- * `phy:/dev/sda` - physical path at which device appears in source qube (just after source qube name in `qvm-block` output)
- * `backend=sys-usb` - name of source qube, can be omitted in the case of dom0
- * `xvdi` - "frontend" device name (listed at the end of line in `qvm-block` output)
-
-3. Now properly detach the device, either using Qubes VM Manager or the `qvm-block -d` command.
-
-## Attaching a File
-
-To attach a file as block device to another qube, first turn it into a loopback device inside the sourceVM.
-
-1. In the linux sourceVM run
-
- ```
- sudo losetup -f --show /path/to/file
- ```
-
- [This command](https://linux.die.net/man/8/losetup) will create the device node `/dev/loop0` or, if that is already in use, increase the trailing integer until that name is still available.
- Afterwards it prints the device-node-name it found.
-
-2. If you want to use the GUI, you're done.
- Click the Device Manager  and select the `loop0`-device to attach it to another qube.
-
- If you rather use the command line, continue:
-
- In dom0, run `qvm-block` to display known block devices.
- The newly created loop device should show up:
-
- ```shell_session
- ~]$ qvm-block
- BACKEND:DEVID DESCRIPTION USED BY
- sourceVM:loop0 /path/to/file
- ```
-
-3. Attach the `loop0`-device using qvm-block as usual:
-
- ```
- qvm-block a targetVM sourceVM:loop0
- ```
-
-4. After detaching, destroy the loop-device inside the sourceVM as follows:
-
- ```
- sudo losetup -d /dev/loop0
- ```
-
-## Additional Attach Options
-
-Attaching a block device through the command line offers additional customisation options, specifiable via the `--option`/`-o` option.
-(Yes, confusing wording, there's an [issue for that](https://github.com/QubesOS/qubes-issues/issues/4530).)
-
-### frontend-dev
-
-This option allows you to specify the name of the device node made available in the targetVM.
-This defaults to `xvdi` or, if already occupied, the first available device node name in alphabetical order.
-(The next one tried will be `xvdj`, then `xvdk`, and so on ...)
-
-usage example:
-
-```
-qvm-block a work sys-usb:sda1 -o frontend-dev=xvdz
-```
-
-This command will attach the partition `sda1` to `work` as `/dev/xvdz`.
-
-### read-only
-
-Attach device in read-only mode.
-Protects the block device in case you don't trust the targetVM.
-
-If the device is a read-only device, this option is forced true.
-
-usage example:
-
-```
-qvm-block a work sys-usb:sda1 -o read-only=true
-```
-
-There exists a shortcut to set read-only `true`, `--ro`:
-
-```
-qvm-block a work sys-usb:sda1 --ro
-```
-
-The two commands are equivalent.
-
-### devtype
-
-Usually, a block device is attached as disk.
-In case you need to attach a block device as cdrom, this option allows that.
-
-usage example:
-
-```
-qvm-block a work sys-usb:sda1 -o devtype=cdrom
-```
-
-This option accepts `cdrom` and `disk`, default is `disk`.
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-use-devices.md b/user/how-to-guides/how-to-use-devices.md
index 3b65f1e6a..7a8a094e0 100644
--- a/user/how-to-guides/how-to-use-devices.md
+++ b/user/how-to-guides/how-to-use-devices.md
@@ -8,151 +8,7 @@ redirect_from:
- /en/doc/external-device-mount-point/
- /doc/ExternalDeviceMountPoint/
- /wiki/ExternalDeviceMountPoint/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-use-devices.html
ref: 188
title: How to use devices
----
-
-This is an overview of device handling in Qubes OS.
-For specific devices ([block](/doc/how-to-use-block-storage-devices/), [USB](/doc/how-to-use-usb-devices/) and [PCI](/doc/how-to-use-pci-devices/) devices), please visit their respective pages.
-
-**Important security warning:** Device handling comes with many security implications.
-Please make sure you carefully read and understand the **[security considerations](/doc/device-handling-security/)**.
-
-
-## Introduction ##
-
-The interface to deal with devices of all sorts was unified in Qubes 4.0 with the `qvm-device` command and the Qubes Devices Widget.
-In Qubes 3.X, the Qubes VM Manager dealt with attachment as well.
-This functionality was moved to the Qubes Device Widget, the tool tray icon with a yellow square located in the top right of your screen by default.
-
-There are currently four categories of devices Qubes understands:
- - Microphones
- - Block devices
- - USB devices
- - PCI devices
-
-Microphones, block devices and USB devices can be attached with the GUI-tool.
-PCI devices can be attached using the Qube Settings, but require a VM reboot.
-
-
-## General Qubes Device Widget Behavior And Handling ##
-
-When clicking on the tray icon (which looks similar to this):  several device-classes separated by lines are displayed as tooltip.
-Block devices are displayed on top, microphones one below and USB-devices at the bottom.
-
-On most laptops, integrated hardware such as cameras and fingerprint-readers are implemented as USB-devices and can be found here.
-
-
-### Attaching Using The Widget ###
-
-Click the tray icon.
-Hover on a device you want to attach to a VM.
-A list of running VMs (except dom0) appears.
-Click on one and your device will be attached!
-
-
-### Detaching Using The Widget ###
-
-To detach a device, click the Qubes Devices Widget icon again.
-Attached devices are displayed in bold.
-Hover the one you want to detach.
-A list of VMs appears, one showing the eject symbol: 
-
-
-### Attaching a Device to Several VMs ###
-
-Only `mic` should be attached to more than one running VM.
-You may *assign* a device to more than one VM (using the `--persistent` option), however, only one of them can be started at the same time.
-
-But be careful: There is a [bug in `qvm-device block` or `qvm-block`](https://github.com/QubesOS/qubes-issues/issues/4692) which will allow you to *attach* a block device to two running VMs.
-Don't do that!
-
-
-## General `qvm-device` Command Line Tool Behavior ##
-
-All devices, including PCI-devices, may be attached from the commandline using the `qvm-device`-tools.
-
-
-### Device Classes ###
-
-`qvm-device` expects DEVICE_CLASS as first argument.
-DEVICE_CLASS can be one of
-
- - `pci`
- - `usb`
- - `block`
- - `mic`
-
-
-### Actions ###
-
-`qvm-device` supports three actions:
-
- - `list` (ls, l) - list all devices of DEVICE_CLASS
- - `attach` (at, a) - attach a specific device of DEVICE_CLASS
- - `detach` (dt, d) - detach a specific device of DEVICE_CLASS
-
-
-### Global Options ###
-
-These three options are always available:
-
-- `--help`, `-h` - show help message and exit
-- `--verbose`, `-v` - increase verbosity
-- `--quiet`, `-q` - decrease verbosity
-
-A full command consists of one DEVICE_CLASS and one action.
-If no action is given, list is implied.
-DEVICE_CLASS however is required.
-
-**SYNOPSIS**:
-`qvm-device DEVICE_CLASS {action} [action-specific arguments] [options]`
-
-## Actions
-
-Actions are applicable to every DEVICE_CLASS and expose some additional options.
-
-### Listing Devices
-
-The `list` action lists known devices in the system.
-`list` accepts VM-names to narrow down listed devices.
-Devices available in, as well as attached to the named VMs will be listed.
-
-`list` accepts two options:
-
-- `--all` - equivalent to specifying every VM name after `list`.
-No VM-name implies `--all`.
-- `--exclude` - exclude VMs from `--all`.
-Requires `--all`.
-
-**SYNOPSIS**
-`qvm-device DEVICE_CLASS {list|ls|l} [--all [--exclude VM [VM [...]]] | VM [VM [...]]]`
-
-### Attaching Devices
-
-The `attach` action assigns an exposed device to a VM.
-This makes the device available in the VM it's attached to.
-Required argument are targetVM and sourceVM:deviceID.
-(sourceVM:deviceID can be determined from `list` output)
-
-`attach` accepts two options:
-
-- `--persistent` - attach device on targetVM-boot.
-If the device is unavailable (physically missing or sourceVM not started), booting the targetVM fails.
-- `--option`, `-o` - set additional options specific to DEVICE_CLASS.
-
-**SYNOPSIS**
-`qvm-device DEVICE_CLASS {attach|at|a} targetVM sourceVM:deviceID [options]`
-
-### Detaching Devices
-
-The `detach` action removes an assigned device from a targetVM.
-It won't be available afterwards anymore.
-Though it tries to do so gracefully, beware that data-connections might be broken unexpectedly, so close any transaction before detaching a device!
-
-If no specific `sourceVM:deviceID` combination is given, *all devices of that DEVICE_CLASS will be detached.*
-
-`detach` accepts no options.
-
-**SYNOPSIS**
-`qvm-device DEVICE_CLASS {detach|dt|d} targetVM [sourceVM:deviceID]`
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-use-disposables.md b/user/how-to-guides/how-to-use-disposables.md
index 0311f080c..3556418ca 100644
--- a/user/how-to-guides/how-to-use-disposables.md
+++ b/user/how-to-guides/how-to-use-disposables.md
@@ -10,193 +10,7 @@ redirect_from:
- /en/doc/dispvm/
- /doc/DisposableVms/
- /wiki/DisposableVMs/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-use-disposables.html
ref: 203
title: How to use disposables
----
-
-A [disposable](/doc/glossary/#disposable) is a lightweight [qube](/doc/glossary/#qube) that can be created quickly and will self-destruct when closed.
-Disposables are usually created in order to host a single application, like a viewer, editor, or web browser.
-
-From inside an app qube, choosing the `Open in disposable` option on a file will launch a disposable for just that file.
-Changes made to a file opened in a disposable are passed back to the originating VM.
-This means that you can safely work with untrusted files without risk of compromising your other VMs.
-Disposables can be launched either directly from dom0's Start Menu or terminal window, or from within app qubes.
-While running, disposables will appear in Qubes VM Manager with the name `disp####`.
-
-[](/attachment/doc/disposablevm-example.png)
-
-This diagram provides a general example of how disposables can be used to safely open untrusted links and attachments in disposables. See [this article](https://blog.invisiblethings.org/2010/06/01/disposable-vms.html) for more on why one would want to use a disposable.
-
-## Security
-
-If a [disposable template](/doc/glossary/#disposable-template) becomes compromised, then any disposable based on that disposable template could be compromised.
-In particular, the *default* disposable template is important because it is used by the "Open in disposable" feature.
-This means that it will have access to everything that you open with this feature.
-For this reason, it is strongly recommended that you base the default disposable template on a trusted template.
-
-### Disposables and Local Forensics
-
-At this time, disposables should not be relied upon to circumvent local forensics, as they do not run entirely in RAM.
-For details, see [this thread](https://groups.google.com/d/topic/qubes-devel/QwL5PjqPs-4/discussion).
-
-When it is essential to avoid leaving any trace, consider using [Tails](https://tails.boum.org/).
-
-## Disposables and Networking
-
-Similarly to how app qubes are based on their underlying [template](/doc/glossary/#template), disposables are based on their underlying [disposable template](/doc/glossary/#disposable-template).
-R4.0 introduces the concept of multiple disposable templates, whereas R3.2 was limited to only one.
-
-On a fresh installation of Qubes, the default disposable template is called `fedora-XX-dvm` (where `XX` is the Fedora version of the default template).
-If you have included the Whonix option in your install, there will also be a `whonix-ws-dvm` disposable template available for your use.
-
-You can set any app qube to have the ability to act as a disposable template with:
-
-```
-qvm-prefs template_for_dispvms True
-```
-
-The default system wide disposable template can be changed with `qubes-prefs default_dispvm`.
-By combining the two, choosing `Open in disposable` from inside an app qube will open the document in a disposable based on the default disposable template you specified.
-
-You can change this behaviour for individual VMs: in the Application Menu, open Qube Settings for the VM in question and go to the "Advanced" tab.
-Here you can edit the "Default disposable" setting to specify which disposable template will be used to launch disposables from that VM.
-This can also be changed from the command line with:
-
-```
-qvm-prefs default_dispvm
-```
-
-For example, `anon-whonix` has been set to use `whonix-ws-dvm` as its `default_dispvm`, instead of the system default.
-You can even set an app qube that has also been configured as a disposable template to use itself, so disposables launched from within the app qube/disposable template would inherit the same settings.
-
-NetVM and firewall rules for disposable templates can be set as they can for a normal VM.
-By default a disposable will inherit the NetVM and firewall settings of the disposable template on which it is based.
-This is a change in behaviour from R3.2, where disposables would inherit the settings of the app qube from which they were launched.
-Therefore, launching a disposable from an app qube will result in it using the network/firewall settings of the disposable template on which it is based.
-For example, if an app qube uses sys-net as its NetVM, but the default system disposable uses sys-whonix, any disposable launched from this app qube will have sys-whonix as its NetVM.
-
-**Warning:** The opposite is also true.
-This means if you have changed anon-whonix's `default_dispvm` to use the system default, and the system default disposable uses sys-net, launching a disposable from inside anon-whonix will result in the disposable using sys-net.
-
-A disposable launched from the Start Menu inherits the NetVM and firewall settings of the disposable template on which it is based.
-Note that changing the "NetVM" setting for the system default disposable template *does* affect the NetVM of disposables launched from the Start Menu.
-Different disposable templates with individual NetVM settings can be added to the Start Menu.
-
-**Important Notes:**
-Some disposable templates will automatically create a menu item to launch a disposable, if you do not see an entry and want to add one please use the command:
-
-```
-qvm-features appmenus-dispvm 1
-```
-
-To launch a disposable template from the command line, in dom0 please type the following:
-
-```
-qvm-run --dispvm= --service qubes.StartApp+NameOfApp
-```
-
-## Opening a file in a disposable via GUI
-
-In an app qube's file manager, right click on the file you wish to open in a disposable, then choose "View in disposable" or "Edit in disposable".
-Wait a few seconds and the default application for this file type should appear displaying the file content.
-This app is running in its own dedicated VM -- a disposable created for the purpose of viewing or editing this very file.
-Once you close the viewing application the whole disposable will be destroyed.
-If you have edited the file and saved the changes, the changed file will be saved back to the original app qube, overwriting the original.
-
- 
-
-
-## Opening a fresh web browser instance in a new disposable
-
-Sometimes it is desirable to open an instance of Firefox within a new fresh disposable.
-This can be done easily using the Start Menu: just go to **Application Menu -\> Disposable -\> Disposable:Firefox web browser**.
-Wait a few seconds until a web browser starts.
-Once you close the viewing application the whole disposable will be destroyed.
-
-
-
-
-## Opening a file in a disposable via command line (from app qube)
-
-Use the `qvm-open-in-dvm` command from a terminal in your app qube:
-
-~~~
-[user@work-pub ~]$ qvm-open-in-dvm Downloads/apple-sandbox.pdf
-~~~
-
-Note that the `qvm-open-in-dvm` process will not exit until you close the application in the disposable.
-
-## Making a particular application open everything in a disposable
-
-You can use the `qvm-service` command or the services GUI to cause an application in a qube to open files and URLs in a disposable. To do this, enable a service named `app-dispvm.X` in that qube, where `X` is the application ID. For instance, to have Thunderbird open all attachments in a disposable, enable the `app-dispvm.thunderbird` service.
-
-This feature is currently somewhat experimental, and only works for Linux qubes. It is known to work with Thunderbird and Wire, but it may fail to work with some applications that do not honor all XDG environment variables. If the feature does not work for you, please file a bug report.
-
-## Opening particular types of files in a disposable
-
-You can set `qvm-open-in-dvm.desktop` as the handler for a given MIME type. This will cause all files of that type to open in a disposable. This works in disposable templates too, but be careful: if your disposable template is set to use `qvm-open-in-dvm.desktop` to open a certain kind of file, every disposable based on it will be as well. If the disposable template is its own default disposable template (as is often the case), this will result in a loop: `qvm-open-in-dvm` will execute `qubes.OpenURL` in a new disposable, but that will in turn execute `qvm-open-in-dvm`. The cycle will repeat until no new disposables can be created, most likely because your system has run out of memory.
-
-This will _not_ override the internal handling of PDF documents in Web browsers. This is typically okay, though: in-browser PDF viewers have a fairly good security record, especially when compared to non-browser PDF viewers. In particular, the attack surface of PDF viewing in Firefox is usually less than that of viewing an ordinary Web page.
-
-## Starting an arbitrary program in a disposable from an app qube
-
-Sometimes it can be useful to start an arbitrary program in a disposable.
-The disposable will stay running so long as the process which started the disposable has not exited.
-Some applications, such as GNOME Terminal, do not wait for the application to close before the process exits (details [here](https://github.com/QubesOS/qubes-issues/issues/2581#issuecomment-272664009)).
-Starting an arbitrary program can be done from an app qube by running
-
-~~~
-[user@vault ~]$ qvm-run '@dispvm' xterm
-~~~
-
-The created disposable can be accessed via other tools (such as `qvm-copy-to-vm`) using its `disp####` name as shown in the Qubes Manager or `qvm-ls`.
-
-## Starting an arbitrary application in a disposable via command line from dom0
-
-The Application Launcher has shortcuts for opening a terminal and a web browser in dedicated disposables, since these are very common tasks.
-The disposable will stay running so long as the process which started the disposable has not exited.
-Some applications, such as GNOME Terminal, do not wait for the application to close before the process exits (details [here](https://github.com/QubesOS/qubes-issues/issues/2581#issuecomment-272664009)).
-It is possible to start an arbitrary application in a disposable directly from dom0 by running:
-
-~~~
-$ qvm-run --dispvm= --service qubes.StartApp+xterm
-~~~
-
-The label color will be inherited from ``.
-(The disposable Application Launcher shortcut used for starting programs runs a very similar command to the one above.)
-
-### Opening a link in a disposable based on a non-default disposable template from a qube
-
-Suppose that the default disposable template for your `email` qube has no networking (e.g., so that untrusted attachments can't phone home).
-However, sometimes you want to open email links in disposables.
-Obviously, you can't use the default disposable template, since it has no networking, so you need to be able to specify a different disposable template.
-You can do that with this command from the `email` qube (as long as your RPC policies allow it):
-
-~~~
-$ qvm-open-in-vm @dispvm: https://www.qubes-os.org
-~~~
-
-This will create a new disposable based on ``, open the default web browser in that disposable, and navigate to `https://www.qubes-os.org`.
-
-#### Example of RPC policies to allow this behavior
-
-In dom0, add the following line at the beginning of the file `/etc/qubes-rpc/policy/qubes.OpenURL`
-
-~~~
-@anyvm @dispvm: allow
-~~~
-
-This line means:
-- FROM: Any VM
-- TO: A disposable based on ``
-- WHAT: Allow sending an "Open URL" request
-
-In other words, any VM will be allowed to create a new disposable based on `` and open a URL inside of that disposable.
-
-More information about RPC policies for disposables can be found [here](/doc/qrexec/#qubes-rpc-administration).
-
-## Customizing disposables
-
-You can change the template used to generate the disposables, and change settings used in the disposable savefile.
-These changes will be reflected in every new disposable based on that template.
-Full instructions can be found [here](/doc/disposable-customization/).
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-use-optical-discs.md b/user/how-to-guides/how-to-use-optical-discs.md
index 4d9cf4f74..4fc2ef626 100644
--- a/user/how-to-guides/how-to-use-optical-discs.md
+++ b/user/how-to-guides/how-to-use-optical-discs.md
@@ -6,20 +6,7 @@ redirect_from:
- /doc/optical-discs/
- /doc/recording-optical-discs/
- /en/doc/recording-optical-discs/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-use-optical-discs.html
ref: 204
title: How to use optical discs
----
-
-Passthrough reading and recording (a.k.a., "burning") are not supported by Qubes OS. This is not a limitation of Xen, which provides scsiback and scsifront drivers, but of Qubes OS. It will be fixed in the future.
-
-Currently, the only options for reading and recording optical discs (e.g., CDs, DVDs, BRDs) in Qubes are:
-
- 1. Use a USB optical drive.
- 2. Attach a SATA optical drive to a secondary SATA controller, then assign this secondary SATA controller to a VM.
- 3. Use a SATA optical drive attached to dom0.
- (**Caution:** This option is [potentially dangerous](https://github.com/Qubes-Community/Contents/blob/master/docs/security/security-guidelines.md#dom0-precautions).)
-
-To access an optical disc via USB follow the [typical procedure for attaching a USB device](/doc/how-to-use-usb-devices/#with-the-command-line-tool), then check with the **Qubes Devices** widget to see what device in the target qube the USB optical drive was attached to.
-Typically this would be `sr0`.
-For example, if `sys-usb` has device `3-2` attached to the `work` qube's `sr0`, you would mount it with `mount /dev/sr0 /mnt/removable`.
-You could also write to a disc with `wodim -v dev=/dev/sr0 -eject /home/user/Qubes.iso`.
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-use-pci-devices.md b/user/how-to-guides/how-to-use-pci-devices.md
index be70e0056..3cbe5d8e9 100644
--- a/user/how-to-guides/how-to-use-pci-devices.md
+++ b/user/how-to-guides/how-to-use-pci-devices.md
@@ -8,137 +8,7 @@ redirect_from:
- /en/doc/assigning-devices/
- /doc/AssigningDevices/
- /wiki/AssigningDevices/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-use-pci-devices.html
ref: 197
title: How to use PCI devices
----
-
-*This page is part of [device handling in qubes](/doc/how-to-use-devices/).*
-
-**Warning:** Only dom0 exposes PCI devices.
-Some of them are strictly required in dom0 (e.g., the host bridge).
-You may end up with an unusable system by attaching the wrong PCI device to a VM.
-PCI passthrough should be safe by default, but non-default options may be required.
-Please make sure you carefully read and understand the **[security considerations](/doc/device-handling-security/#pci-security)** before deviating from default behavior.
-
-## Introduction
-
-Unlike other devices ([USB](/doc/how-to-use-usb-devices/), [block](/doc/how-to-use-block-storage-devices/), mic), PCI devices need to be attached on VM-bootup.
-Similar to how you can't attach a new sound-card after your computer booted (and expect it to work properly), attaching PCI devices to already booted VMs isn't supported.
-Moreover, PCI devices can be attached only to VMs running in certain virtualization modes. See [FAQ: Which virtualization modes do VMs use?](/faq/#which-virtualization-modes-do-vms-use)
-
-The Qubes installer attaches all network class controllers to `sys-net` and all USB controllers to `sys-usb` by default, if you chose to create the network and USB qube during install.
-While this covers most use cases, there are some occasions when you may want to manually attach one NIC to `sys-net` and another to a custom NetVM, or have some other type of PCI controller you want to manually attach.
-
-Some devices expose multiple functions with distinct BDF-numbers.
-Limits imposed by the PC and VT-d architectures may require all functions belonging to the same device to be attached to the same VM.
-This requirement can be dropped with the `no-strict-reset` option during attachment, bearing in mind the aforementioned [security considerations](/doc/device-handling-security/#pci-security).
-In the steps below, you can tell if this is needed if you see the BDF for the same device listed multiple times with only the number after the "." changing.
-
-While PCI device can only be used by one powered on VM at a time, it *is* possible to *assign* the same device to more than one VM at a time.
-This means that you can use the device in one VM, shut that VM down, start up a different VM (to which the same device is now attached), then use the device in that VM.
-This can be useful if, for example, you have only one USB controller, but you have multiple security domains which all require the use of different USB devices.
-
-## Attaching Devices Using the GUI
-
-The qube settings for a VM offers the "Devices"-tab.
-There you can attach PCI-devices to a qube.
-
-1. To reach the settings of any qube either
-
- - Press Alt+F3 to open the application finder, type in the VM name, select the "\[VM-name\]: Qube Settings" menu entry and press enter or click "Launch"!
- - Select the VM in Qube Manager and click the settings-button or right-click the VM and select `Qube settings`.
- - Click the Domain Manager, hover the VM you want to attach a device to and select "settings" in the additional menu. (only running VMs!)
-
-2. Select the "Devices" tab on the top bar.
-3. Select a device you want to attach to the qube and click the single arrow right! (`>`)
-4. You're done.
- If everything worked out, once the qube boots (or reboots if it's running) it will start with the pci device attached.
-5. In case it doesn't work out, first try disabling memory-balancing in the settings ("Advanced" tab).
- If that doesn't help, read on to learn how to disable the strict reset requirement!
-
-## `qvm-pci` Usage
-
-The `qvm-pci` tool allows PCI attachment and detachment.
-It's a shortcut for [`qvm-device pci`](/doc/how-to-use-devices/#general-qubes-device-widget-behavior-and-handling).
-
-To figure out what device to attach, first list the available PCI devices by running (as user) in dom0:
-
-```
-qvm-pci
-```
-
-This will show you the `backend:BDF` (Bus_Device.Function) address of each PCI device.
-It will look something like `dom0:00_1a.0`.
-Once you've found the address of the device you want to attach, then attach it like this:
-
-```
-qvm-pci attach targetVM sourceVM:[BDF] --persistent
-```
-
-Since PCI devices have to be attached on bootup, attaching has to happen with the `--persistant` option.
-
-For example, if `00_1a.0` is the BDF of the device you want to attach to the "work" domain, you would do this:
-
-```
-qvm-pci attach work dom0:00_1a.0 --persistent
-```
-
-## Possible Issues
-
-Visit the [PCI Troubleshooting guide](/doc/pci-troubleshooting/) to see issues that may arise due to PCI devices and how to troubleshoot them.
-
-## Additional Attach Options
-
-Attaching a PCI device through the commandline offers additional options, specifiable via the `--option`/`-o` option.
-(Yes, confusing wording, there's an [issue for that](https://github.com/QubesOS/qubes-issues/issues/4530).)
-
-`qvm-pci` exposes two additional options.
-Both are intended to fix device or driver specific issues, but both come with [heavy security implications](/doc/device-handling-security/#pci-security)! **Make sure you understand them before continuing!**
-
-### no-strict-reset
-
-Do not require PCI device to be reset before attaching it to another VM.
-This may leak usage data even without malicious intent!
-
-usage example:
-
-```
-qvm-pci a work dom0:00_1a.0 --persistent -o no-strict-reset=true
-```
-
-### permissive
-
-Allow write access to full PCI config space instead of whitelisted registers.
-This increases attack surface and possibility of [side channel attacks](https://en.wikipedia.org/wiki/Side-channel_attack).
-
-usage example:
-
-```
-qvm-pci a work dom0:00_1a.0 --persistent -o permissive=true
-```
-
-## Bringing PCI Devices Back to dom0
-
-By default, when a device is detached from a VM (or when a VM with an attached PCI device is shut down), the device is *not* automatically attached back to dom0.
-
-This is an intended feature.
-
-A device which was previously attached to a VM less trusted than dom0 (which, in Qubes, is *all* of them) could attack dom0 if it were automatically reattached there.
-
-In order to re-enable the device in dom0, either:
-
-- Reboot the physical machine. (Best practice)
-
-or
-
-- Go to the sysfs (`/sys/bus/pci`), find the right device, detach it from the pciback driver, and attach it back to the original driver.
- Replace `` with your full device, for example `0000:00:1c.2`:
-
- ```
- echo > /sys/bus/pci/drivers/pciback/unbind
- MODALIAS=`cat /sys/bus/pci/devices//modalias`
- MOD=`modprobe -R $MODALIAS | head -n 1`
- echo > /sys/bus/pci/drivers/$MOD/bind
- ```
-
-It is **strongly discouraged to reattach PCI devices to dom0**, especially if they don't support resetting!
+---
\ No newline at end of file
diff --git a/user/how-to-guides/how-to-use-usb-devices.md b/user/how-to-guides/how-to-use-usb-devices.md
index e515231ff..e1874d322 100644
--- a/user/how-to-guides/how-to-use-usb-devices.md
+++ b/user/how-to-guides/how-to-use-usb-devices.md
@@ -5,160 +5,7 @@ permalink: /doc/how-to-use-usb-devices/
redirect_from:
- /doc/usb-devices/
- /doc/usb/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/how-to-guides/how-to-use-usb-devices.html
ref: 195
title: How to use USB devices
----
-
-*This page is part of [device handling in qubes](/doc/how-to-use-devices/).*
-
-If you are looking to handle USB *storage* devices (thumbdrives or USB-drives), please have a look at the [block device](/doc/how-to-use-block-storage-devices/) page.
-
-**Note:** Attaching USB devices to VMs requires a [USB qube](/doc/usb-qubes/).
-
-**Important security warning:** USB passthrough comes with many security implications.
-Please make sure you carefully read and understand the **[security considerations](/doc/device-handling-security/#usb-security)**.
-Whenever possible, attach a [block device](/doc/how-to-use-block-storage-devices/) instead.
-
-Examples of valid cases for USB-passthrough:
-
-- [microcontroller programming](https://www.arduino.cc/en/Main/Howto)
-- [external audio devices](/doc/external-audio/)
-- [optical drives](/doc/recording-optical-discs/) for recording
-
-(If you are thinking to use a two-factor-authentication device, [there is an app for that](/doc/u2f-proxy/).
-But it has some [issues](https://github.com/QubesOS/qubes-issues/issues/4661).)
-
-## Attaching And Detaching a USB Device
-
-### With Qubes Device Manager
-
-Click the device-manager-icon: 
-A list of available devices appears.
-USB-devices have a USB-icon to their right: 
-
-Hover on one device to display a list of VMs you may attach it to.
-
-Click one of those.
-The USB device will be attached to it.
-You're done.
-
-After you finished using the USB-device, you can detach it the same way by clicking on the Devices Widget.
-You will see an entry in bold for your device such as **`sys-usb:2-5 - 058f_USB_2.0_Camera`**.
-Hover on the attached device to display a list of running VMs.
-The one to which your device is connected will have an eject button  next to it.
-Click that and your device will be detached.
-
-### With The Command Line Tool
-
-In dom0, you can use `qvm-usb` from the commandline to attach and detach devices.
-
-Listing available USB devices:
-
-```shell_session
-[user@dom0 ~]$ qvm-usb
-BACKEND:DEVID DESCRIPTION USED BY
-sys-usb:2-4 04ca:300d 04ca_300d
-sys-usb:2-5 058f:3822 058f_USB_2.0_Camera
-sys-usb:2-1 03f0:0641 PixArt_HP_X1200_USB_Optical_Mouse
-```
-
-Attaching selected USB device:
-
-```shell_session
-[user@dom0 ~]$ qvm-usb attach work sys-usb:2-5
-[user@dom0 ~]$ qvm-usb
-BACKEND:DEVID DESCRIPTION USED BY
-sys-usb:2-4 04ca:300d 04ca_300d
-sys-usb:2-5 058f:3822 058f_USB_2.0_Camera work
-sys-usb:2-1 03f0:0641 PixArt_Optical_Mouse
-```
-
-Now, you can use your USB device (camera in this case) in the `work` qube.
-If you see the error `ERROR: qubes-usb-proxy not installed in the VM` instead, please refer to the [Installation Section](#installation-of-qubes-usb-proxy).
-
-When you finish, detach the device.
-
-```shell_session
-[user@dom0 ~]$ qvm-usb detach work sys-usb:2-5
-[user@dom0 ~]$ qvm-usb
-BACKEND:DEVID DESCRIPTION USED BY
-sys-usb:2-4 04ca:300d 04ca_300d
-sys-usb:2-5 058f:3822 058f_USB_2.0_Camera
-sys-usb:2-1 03f0:0641 PixArt_Optical_Mouse
-```
-
-## Maintenance And Customisation
-
-### Creating And Using a USB qube
-
-If you've selected to install a usb-qube during system installation, everything is already set up for you in `sys-usb`.
-If you've later decided to create a usb-qube, please follow [this guide](/doc/usb-qubes/).
-
-### Installation Of `qubes-usb-proxy`
-
-To use this feature, the `qubes-usb-proxy` package needs to be installed in the templates used for the USB qube and qubes you want to connect USB devices to.
-This section exists for reference or in case something broke and you need to reinstall `qubes-usb-proxy`.
-Under normal conditions, `qubes-usb-proxy` should already be installed and good to go.
-
-If you receive this error: `ERROR: qubes-usb-proxy not installed in the VM`, you can install the `qubes-usb-proxy` with the package manager in the VM you want to attach the USB device to.
-
-- Fedora:
- ```
- sudo dnf install qubes-usb-proxy
- ```
-- Debian/Ubuntu:
- ```
- sudo apt-get install qubes-usb-proxy
- ```
-
-### Using USB Keyboards And Other Input Devices
-
-**Warning:** especially keyboards need to be accepted by default when using them to login! Please make sure you carefully read and understood the **[security considerations](/doc/device-handling-security/#usb-security)** before continuing!
-
-Mouse and keyboard setup are part of [setting up a USB qube](/doc/usb-qubes/).
-
-### Finding The Right USB Controller
-
-Some USB devices are not compatible with the USB pass-through method Qubes employs.
-In situations like these, you can try to pass through the entire USB controller to a qube as PCI device.
-However, with this approach one cannot attach single USB devices but has to attach the whole USB controller with whatever USB devices are connected to it.
-
-If you have multiple USB controllers, you must first figure out which PCI device is the right controller.
-
-First, find out which USB bus the device is connected to (note that these steps need to be run from a terminal inside your USB qube):
-
-```
-lsusb
-```
-
-For example, I want to attach a broadband modem to the NetVM.
-In the output of `lsusb` it may be listed as something like:
-
-```
-Bus 003 Device 003: ID 413c:818d Dell Computer Corp.
-```
-
-(In this case, the device isn't fully identified)
-
-The device is connected to USB bus \#3.
-Check which other devices are connected to the same bus, since *all* of them will be attach to the same VM.
-
-To find the right controller, follow the usb bus:
-
-```
-readlink /sys/bus/usb/devices/usb3
-```
-
-This should output something like:
-
-```
-../../../devices/pci-0/pci0000:00/0000:00:1a.0/usb3
-```
-
-Now you see the path and the text between `/pci0000:00/0000:` and `/usb3` i.e. `00:1a.0` is the BDF address. Strip the address and pass it to the [`qvm-pci` tool](/doc/how-to-use-pci-devices/) to attach the controller to the targetVM.
-
-For example, On R 4.0 the command would look something like
-
-```
-qvm-pci attach --persistent personal dom0:00_1a.0
-```
+---
\ No newline at end of file
diff --git a/user/reference/glossary.md b/user/reference/glossary.md
index bf18c415d..1df3dfdb1 100644
--- a/user/reference/glossary.md
+++ b/user/reference/glossary.md
@@ -6,211 +6,7 @@ redirect_from:
- /en/doc/glossary/
- /doc/Glossary/
- /wiki/Glossary/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/reference/glossary.html
ref: 140
title: Glossary
----
-
-## admin qube
-
-A type of [qube](#qube) used for administering Qubes OS.
-
-* Currently, the only admin qube is [dom0](#dom0).
-
-## app qube
-
-Any [qube](#qube) that does not have a root filesystem of its own. Every app
-qube is based on a [template](#template) from which it borrows the root
-filesystem.
-
-* Previously known as: `AppVM`, `TemplateBasedVM`.
-
-* Historical note: This term originally meant "a qube intended for running user
- software applications" (hence the name "app").
-
-## disposable
-
-A type of temporary [app qube](#app-qube) that self-destructs when its
-originating window closes. Each disposable is based on a [disposable
-template](#disposable-template).
-
-See [How to Use Dispoables](/doc/how-to-use-disposables/).
-
-* Previously known as: `DisposableVM`, `DispVM`.
-
-## disposable template
-
-Any [app qube](#app-qube) on which [disposables](#disposable) are based. A
-disposable template shares its user directories (and, indirectly, the root
-filesystem of the regular [template](#template) on which it is based) with all
-[disposables](#disposable) based on it.
-
-* Not to be confused with the concept of a regular [template](#template) that
- is itself disposable, which does not exist in Qubes OS.
-
-* Disposable templates must be app qubes. They cannot be regular
- [templates](#template).
-
-* Every [disposable](#disposable) is based on a disposable template, which is
- in turn based on a regular [template](#template).
-
-* Unlike [disposables](#disposable), disposable templates have the persistence
- properties of normal [app qubes](#app-qube).
-
-* Previously known as: `DisposableVM Template`, `DVM Template`, `DVM`.
-
-## dom0
-
-[Domain](#domain) zero. A type of [admin qube](#admin-qube). Also known as the
-**host** domain, dom0 is the initial qube started by the Xen hypervisor on
-boot. Dom0 runs the Xen management toolstack and has special privileges
-relative to other domains, such as direct access to most hardware.
-
-* The term "dom0" is a common noun and should follow the capitalization rules
- of common nouns.
-
-## domain
-
-In Xen, a synonym for [VM](#vm).
-
-See ["domain" on the Xen Wiki](https://wiki.xenproject.org/wiki/Domain).
-
-* This term has no official meaning in Qubes OS.
-
-## domU
-
-Unprivileged [domain](#domain). Also known as **guest** domains, domUs are the
-counterparts to dom0. In Xen, all VMs except dom0 are domUs. By default, most
-domUs lack direct hardware access.
-
-* The term "domU" is a common noun and should follow the capitalization rules
- of common nouns.
-
-* Sometimes the term [VM](#vm) is used as a synonym for domU. This is
- technically inaccurate, as [dom0](#dom0) is also a VM in Xen.
-
-## HVM
-
-Hardware-assisted Virtual Machine. Any fully virtualized, or hardware-assisted,
-[VM](#vm) utilizing the virtualization extensions of the host CPU. Although
-HVMs are typically slower than paravirtualized qubes due to the required
-emulation, HVMs allow the user to create domains based on any operating system.
-
-See [Standalones and HVM](/doc/standalones-and-hvms/).
-
-## management qube
-
-A [qube](#qube) used for automated management of a Qubes OS installation via
-[Salt](/doc/salt/).
-
-## named disposable
-
-A type of [disposable](#disposable) given a permanent name that continues to
-exist even after it is shut down and can be restarted again. Like a regular
-[disposable](#disposable), a named disposable has no persistent state: Any
-changes made are lost when it is shut down.
-
-* Only one instance of a named disposable can run at a time.
-
-* Like a regular [disposable](#disposable), a named disposable always has the
- same state when it starts, namely that of the [disposable
- template](#disposable-template) on which it is based.
-
-* Technical note: Named disposables are useful for certain [service
- qubes](#service-qube), where the combination of persistent device assignment
- and ephemeral qube state is desirable.
-
-## net qube
-
-Internally known as `netvm`. The property of a [qube](#qube) that specifies
-from which qube, if any, it receives network access. Despite the name, "net
-qube" (or `netvm`) is a *property* of a qube, not a *type* of qube. For
-example, it is common for the net qube of an [app qube](#app-qube) to be the
-[service qube](#service-qube) `sys-firewall`, which in turn uses `sys-net` as
-its net qube.
-
-* If a qube does not have a net qube (i.e., its `netvm` is set to `None`), then
- that qube is offline. It is disconnected from all networking.
-
-* The name `netvm` derives from "Networking Virtual Machine." Before Qubes 4.0,
- there was a type of [service qube](#service-qube) called a "NetVM." The name
- of the `netvm` property is a holdover from that era.
-
-## qube
-
-A secure compartment in Qubes OS. Currently, qubes are implemented as Xen
-[VMs](#vm), but Qubes OS is independent of its underlying compartmentalization
-technology. VMs could be replaced with a different technology, and qubes would
-still be called "qubes."
-
-* **Important:** The term "qube" is a common noun and should follow the
- capitalization rules of common nouns. For example, "I have three qubes" is
- correct," while "I have three Qubes" is incorrect.
-
-* Note that starting a sentence with the plural of "qube" (i.e., "Qubes...")
- can be ambiguous, since it may not be clear whether the referent is a
- plurality of qubes or [Qubes OS](#qubes-os).
-
-* Example usage: "In Qubes OS, you do your banking in your 'banking' qube and
- your web surfing in your 'untrusted' qube. That way, if your 'untrusted' qube
- is compromised, your banking activities will remain secure."
-
-* Historical note: The term "qube" was originally invented as an alternative to
- "VM" intended to make it easier for less technical users to understand Qubes
- OS and learn how to use it.
-
-## Qubes OS
-
-A security-oriented operating system (OS). The main principle of Qubes OS is
-security by compartmentalization (or isolation), in which activities are
-compartmentalized (or isolated) in separate [qubes](#qube).
-
-* **Important:** The official name is "Qubes OS" (note the capitalization and
- the space between "Qubes" and "OS"). In casual conversation, this is often
- shortened to "Qubes." Only in technical contexts where spaces are not
- permitted (e.g., in usernames) may the space be omitted, as in `@QubesOS`.
-
-## Qubes Windows Tools (QWT)
-
-A set of programs and drivers that provide integration of Windows qubes with
-the rest of the Qubes OS system.
-
-See [Qubes Windows Tools](/doc/windows-tools/) and [Windows](/doc/windows/).
-
-## service qube
-
-Any [app qube](#app-qube) the primary purpose of which is to provide services
-to other qubes. `sys-net` and `sys-firewall` are examples of service qubes.
-
-## standalone
-
-Any [qube](#qube) that has its own root filesystem and does not share it with
-another qube. Distinct from both [templates](#template) and [app
-qubes](#app-qube).
-
-See [Standalones and HVMs](/doc/standalones-and-hvms/).
-
-* Previously known as: `StandaloneVM`.
-
-## template
-
-Any [qube](#qube) that shares its root filesystem with another qube. A qube
-that is borrowing a template's root filesystem is known as an [app
-qube](#app-qube) and is said to be "based on" the template. Templates are
-intended for installing and updating software applications, but not for running
-them.
-
-See [Templates](/doc/templates/).
-
-* No template is an [app qube](#app-qube).
-
-* A template cannot be based on another template.
-
-* Regular templates cannot function as [disposable
- templates](#disposable-template). (Disposable templates must be app qubes.)
-
-* Previously known as: `TemplateVM`.
-
-## VM
-
-An abbreviation for "virtual machine." A software implementation of a machine
-(for example, a computer) that executes programs like a physical machine.
+---
\ No newline at end of file
diff --git a/user/reference/tools.md b/user/reference/tools.md
index 762a34094..fc89a85dd 100644
--- a/user/reference/tools.md
+++ b/user/reference/tools.md
@@ -9,23 +9,7 @@ redirect_from:
- /doc/tools/3.2/
- /doc/tools/3.2/dom0/
- /doc/tools/3.2/domU/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/reference/tools.html
ref: 141
title: Command-line tools
----
-
-Dom0
-----
-
-* [core-admin](https://dev.qubes-os.org/projects/core-admin/en/latest/manpages/)
-* [core-admin-client](https://dev.qubes-os.org/projects/core-admin-client/en/latest/manpages/)
-
-DomU
-----
-
-* [qrexec-client-vm](https://github.com/QubesOS/qubes-core-qrexec/blob/master/agent/qrexec-client-vm.rst)
-* [qvm-copy](https://github.com/QubesOS/qubes-core-agent-linux/blob/master/doc/vm-tools/qvm-copy.rst)
-* [qvm-open-in-dvm](https://github.com/QubesOS/qubes-core-agent-linux/blob/master/doc/vm-tools/qvm-open-in-dvm.rst)
-* [qvm-open-in-vm](https://github.com/QubesOS/qubes-core-agent-linux/blob/master/doc/vm-tools/qvm-open-in-vm.rst)
-* [qvm-run-vm](https://github.com/QubesOS/qubes-core-agent-linux/blob/master/doc/vm-tools/qvm-run-vm.rst)
-* [qvm-convert-pdf](https://github.com/QubesOS/qubes-app-linux-pdf-converter/blob/master/README.md)
-* [qvm-convert-img](https://github.com/QubesOS/qubes-app-linux-img-converter/blob/master/README.md)
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/anti-evil-maid.md b/user/security-in-qubes/anti-evil-maid.md
index 19ac3193f..59bde2e19 100644
--- a/user/security-in-qubes/anti-evil-maid.md
+++ b/user/security-in-qubes/anti-evil-maid.md
@@ -6,56 +6,7 @@ redirect_from:
- /en/doc/anti-evil-maid/
- /doc/AntiEvilMaid/
- /wiki/AntiEvilMaid/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/anti-evil-maid.html
ref: 164
title: Anti evil maid (AEM)
----
-
-Background
-----------
-
-Please read [this blog article](https://blog.invisiblethings.org/2011/09/07/anti-evil-maid.html).
-
-Requirements
-----------
-
-The current package requires a TPM 1.2 interface and a working Intel TXT engine.
-If you cleaned your Intel Management Engine with e.g. [me_cleaner](https://github.com/corna/me_cleaner)
-while installing [CoreBoot](https://www.coreboot.org/) then you are out of luck.
-For now you have to choose between cleaning your BIOS and deploying Anti Evil Maid.
-
-[Discussion](https://groups.google.com/d/msg/qubes-users/sEmZfOZqYXM/j5rHeex1BAAJ)
-
-Installing
-----------
-
-In Dom0 install `anti-evil-maid`:
-
-~~~
-sudo qubes-dom0-update anti-evil-maid
-~~~
-
-For more information, see the [qubes-antievilmaid](https://github.com/QubesOS/qubes-antievilmaid) repository, which includes a `README`.
-
-Security Considerations
------------------------
-
-[Qubes security guidelines](https://github.com/Qubes-Community/Contents/blob/master/docs/security/security-guidelines.md) dictate that USB devices should never be attached directly to dom0, since this can result in the entire system being compromised.
-However, in its default configuration, installing and using AEM requires attaching a USB drive (i.e., [mass storage device](https://en.wikipedia.org/wiki/USB_mass_storage_device_class)) directly to dom0.
-(The other option is to install AEM to an internal disk.
-However, this carries significant security implications, as explained [here](https://blog.invisiblethings.org/2011/09/07/anti-evil-maid.html).) This presents us with a classic security trade-off: each Qubes user must make a choice between protecting dom0 from a potentially malicious USB drive, on the one hand, and protecting the system from Evil Maid attacks, on the other hand.
-Given the practical feasibility of attacks like [BadUSB](https://srlabs.de/badusb/) and revelations regarding pervasive government hardware backdoors, this is no longer a straightforward decision.
-New, factory-sealed USB drives cannot simply be assumed to be "clean" (e.g., to have non-malicious microcontroller firmware).
-Therefore, it is up to each individual Qubes user to evaluate the relative risk of each attack vector against his or her security model.
-
-For example, a user who frequently travels with a Qubes laptop holding sensitive data may be at a much higher risk of Evil Maid attacks than a home user with a stationary Qubes desktop.
-If the frequent traveler judges her risk of an Evil Maid attack to be higher than the risk of a malicious USB device, she might reasonably opt to install and use AEM.
-On the other hand, the home user might deem the probability of an Evil Maid attack occurring in her own home to be so low that there is a higher probability that any USB drive she purchases is already compromised, in which case she might reasonably opt never to attach any USB devices directly to dom0.
-(In either case, users can--and should--secure dom0 against further USB-related attacks through the use of a [USB VM](https://github.com/Qubes-Community/Contents/blob/master/docs/security/security-guidelines.md#creating-and-using-a-usbvm).)
-
-For more information, please see [this discussion thread](https://groups.google.com/d/msg/qubes-devel/EBc4to5IBdg/n1hfsHSfbqsJ).
-
-Known issues
-------------
-
-- USB 3.0 isn't supported yet
-- [AEM is not compatible with having an SSD cache](https://groups.google.com/d/msgid/qubes-users/70021590-fb3a-4f95-9ce5-4b340530ddbf%40petaramesh.org)
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/data-leaks.md b/user/security-in-qubes/data-leaks.md
index 51c81201d..cdb3a72ab 100644
--- a/user/security-in-qubes/data-leaks.md
+++ b/user/security-in-qubes/data-leaks.md
@@ -6,51 +6,7 @@ redirect_from:
- /en/doc/data-leaks/
- /doc/DataLeaks/
- /wiki/DataLeaks/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/data-leaks.html
ref: 171
title: Data leaks
----
-
-The Role of the Firewall
-------------------------
-
-**[Firewalling in Qubes](/doc/firewall/) is not intended to be a leak-prevention mechanism.**
-
-There are several reasons for this, which will be explained below.
-However, the main reason is that Qubes cannot prevent an attacker who has compromised one app qube with restrictive firewall rules from leaking data via cooperative covert channels through another compromised app qube with nonrestrictive firewall rules.
-
-For example, suppose you have an `email` app qube.
-You have set the firewall rules for `email` such that it can communicate only with your email server.
-Now suppose that an attacker sends you a GPG-encrypted message which exploits a hypothetical bug in the GnuPG process.
-There are now multiple ways the attacker could proceed to leak data (such as confidential email messages) from `email`.
-The most obvious way is by simply emailing the data to himself.
-Another possibility is that the attacker has also compromised another one of your app qubes, such as your `netvm`, which is normally assumed to be untrusted and has unrestricted access to the network.
-In this case, the attacker might move data from `email` to the `netvm` via a covert channel, such as the CPU cache.
-Such covert channels have been described and even implemented in some "lab environments" and might allow for bandwidths of even a few tens of bits/sec.
-It is unclear whether such channels could be implemented in a real world system, where multiple VMs are running at the same time, each handling tens or hundreds of processes, all using the same cache memory, but it is worth keeping in mind.
-Of course, this would require special malware written specifically to attack Qubes OS, and perhaps even a specific Qubes OS version and/or configuration.
-Nevertheless, it might be possible.
-
-Note that physically air-gapped machines are not necessarily immune to this problem.
-Covert channels can potentially take many forms (e.g., sneakernet thumb drive, bluetooth, or even microphone and speakers).
-
-For a further discussion of covert channels, see [this thread](https://groups.google.com/d/topic/qubes-users/AqZV65yZLuU/discussion) and [#817](https://github.com/QubesOS/qubes-issues/issues/817).
-
-Types of Data Leaks
--------------------
-
-In order to understand and attempt to prevent data leaks in Qubes, we must distinguish among three different types of relevant data leaks:
-
-1. **Intentional leaks.** Malicious software which actively tries to leak data out of an app qube, perhaps via cooperative covert channels established with other malicious software in another app qube or on some server via networking, if networking, even limited, is allowed for the app qube.
-
-2. **Intentional sniffing.** Malicious software trying to use side channels to, e.g., actively guess some key material used in another VM by some non-malicious software there (e.g., non-leak-proof GPG accidentally leaking out bits of the private key by generating some timing patterns when using this key for some crypto operation).
-Such attacks have been described in the academic literature, but it is doubtful that they would succeed in practice in a moderately busy general purpose system like Qubes OS where the attacker normally has no way to trigger the target crypto operation explicitly and it is normally required that the attacker trigger many such operations.
-
-3. **Unintentional leaks.** Non-malicious software which is either buggy or doesn't maintain the privacy of user data, whether by design or accident.
- For example, software which automatically sends error reports to a remote server, where these reports contain details about the system which the user did not want to share.
-
- Both Qubes firewall and an empty NetVM (i.e., setting the NetVM of an app qube to "none") can fully protect against leaks of type 3.
- However, neither Qubes firewall nor an empty NetVM are guaranteed to protect against leaks of types 1 and 2.
- There are few effective, practical policy measures available to end-users today to stop the leaks of type 1.
- It is likely that the only way to fully protect against leaks of type 2 is to either pause or shut down all other VMs while performing sensitive operations in the target VM(s) (such as key generation).
-
-For further discussion, see [this thread](https://groups.google.com/d/topic/qubes-users/t0cmNfuVduw/discussion).
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/device-handling-security.md b/user/security-in-qubes/device-handling-security.md
index 2301020f2..c9c806bfd 100644
--- a/user/security-in-qubes/device-handling-security.md
+++ b/user/security-in-qubes/device-handling-security.md
@@ -2,73 +2,7 @@
lang: en
layout: doc
permalink: /doc/device-handling-security/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/device-handling-security.html
ref: 170
title: Device handling security
----
-
-Any additional ability a VM gains is additional attack surface.
-It's a good idea to always attach the minimum entity required in a VM.
-
-For example, attaching a full USB-device offers [more attack surface than attaching a single block device](https://blog.invisiblethings.org/2011/05/31/usb-security-challenges.html "ITL blog post on USB security"), while
-attaching a full block device (e.g. `sda`) again offers more attack surface than attaching a single partition (e.g. `sda1`), since the targetVM doesn't have to parse the partition-table.
-(Attaching a full block device offers the advantage that most file-managers will mount and display them correctly, whereas they don't expect single partitions to be added and therefore don't handle them correctly.)
-
-## PCI Security
-
-Attaching a PCI device to a qube has serious security implications.
-It exposes the device driver running in the qube to an external device (and sourceVM, which contains the device - e.g. `sys-usb`).
-In many cases a malicious device can choose what driver will be loaded (for example by manipulating device metadata like vendor and product identifiers) - even if the intended driver is sufficiently secure, the device may try to attack a different, less secure driver.
-Furthermore that VM has full control of the device and may be able to exploit bugs or malicious implementation of the hardware, as well as plain security problems the hardware may pose.
-(For example, if you attach a USB controller, all the security implications of USB passthrough apply as well.)
-
-By default, Qubes requires any PCI device to be resettable from the outside (i.e. via the hypervisor), which completely reinitialises the device.
-This ensures that any device that was attached to a compromised VM, even if that VM was able to use bugs in the PCI device to inject malicious code, can be trusted again.
-(Or at least as trusted as it was when Qubes booted.)
-
-Some devices do not implement a reset option.
-In these cases, Qubes by default does not allow attaching the device to any VM.
-If you decide to override this precaution, beware that the device may only be trusted when attached to the first VM.
-Afterwards, it should be **considered tainted** until the whole system is shut down.
-Even without malicious intent, usage data may be leaked.
-
-In case device reset is disabled for any reason, detaching the device should be considered a risk.
-Ideally, devices for which the `no-strict-reset` option is set are attached once to a VM which isn't shut down until the system is shut down.
-
-Additionally, Qubes restricts the config-space a VM may use to communicate with a PCI device.
-Only whitelisted registers are accessible.
-However, some devices or applications require full PCI access.
-In these cases, the whole config-space may be allowed.
-You're potentially weakening the device isolation, especially if your system is not equipped with a VT-d Interrupt Remapping unit.
-This increases the VM's ability to run a [side channel attack](https://en.wikipedia.org/wiki/Side-channel_attack) and vulnerability to the same.
-See [Xen PCI Passthrough: PV guests and PCI quirks](https://wiki.xenproject.org/wiki/Xen_PCI_Passthrough#PV_guests_and_PCI_quirks) and [Software Attacks on Intel VT-d](https://invisiblethingslab.com/resources/2011/Software%20Attacks%20on%20Intel%20VT-d.pdf) \(page 7) for more details.
-
-## USB Security
-
-The connection of an untrusted USB device to dom0 is a security risk since the device can attack an arbitrary USB driver (which are included in the linux kernel), exploit bugs during partition-table-parsing or simply pretend to be a keyboard.
-There are many ready-to-use implementations of such attacks, e.g. a [USB Rubber Ducky](https://shop.hak5.org/products/usb-rubber-ducky-deluxe).
-The whole USB stack is put to work to parse the data presented by the USB device in order to determine if it is a USB mass storage device, to read its configuration, etc.
-This happens even if the drive is then assigned and mounted in another qube.
-
-To avoid this risk, use a [USB qube](/doc/usb-qubes/).
-
-Attaching a USB device to a VM (USB passthrough) will **expose your target qube** to most of the [security issues](https://blog.invisiblethings.org/2011/05/31/usb-security-challenges.html "ITL blog post on USB security") associated with the USB-stack.
-If possible, use a method specific for particular device type (for example, block devices described above), instead of this generic one.
-
-## Security Warning On USB Input Devices
-
-If you connect USB input devices (keyboard and mouse) to a VM, that VM will effectively have control over your system.
-Because of this, the benefits of using a [USB qube](/doc/usb-qubes/) entrusted with a keyboard or other interface device are much smaller than using a fully untrusted USB qube.
-In addition to having control over your system, such a VM can also sniff all the input you enter there (for example, passwords in the case of a USB keyboard).
-
-There is no simple way to protect against sniffing, but you can make it harder to exploit control over input devices.
-
-If you have only a USB mouse connected to a USB qube, but the keyboard is connected directly to dom0 (using a PS/2 connector, for example), you simply need to lock the screen when you are away from your computer (assuming you don't use the virtual keyboard of your screen locker).
-You must do this every time you leave your computer unattended, even if there no risk of anyone else having direct physical access to your computer.
-This is because you are guarding the system not only against anyone with local access, but also against possible malicious input from a potentially compromised USB qube.
-
-If your keyboard is also connected to a USB qube, things are much harder.
-Locking the screen (with a traditional password) does not solve the problem, because the USB qube can simply sniff this password and later easily unlock the screen.
-One possibility is to set up the screen locker to require an additional step to unlock (i.e., two-factor authentication).
-One way to achieve this is to use a [YubiKey](/doc/YubiKey/), or some other hardware token, or even to manually enter a one-time password.
-
-Support for [two factor authentication](/news/2018/09/11/qubes-u2f-proxy/) was recently added, though there are [issues](https://github.com/QubesOS/qubes-issues/issues/4661).
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/firewall.md b/user/security-in-qubes/firewall.md
index 0ac041257..865081052 100644
--- a/user/security-in-qubes/firewall.md
+++ b/user/security-in-qubes/firewall.md
@@ -7,505 +7,7 @@ redirect_from:
- /en/doc/qubes-firewall/
- /doc/QubesFirewall/
- /wiki/QubesFirewall/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/firewall.html
ref: 166
title: Firewall
----
-
-Understanding firewalling in Qubes
-----------------------------------
-
-Every qube in Qubes is connected to the network via a FirewallVM, which is used to enforce network-level policies.
-By default there is one default FirewallVM, but the user is free to create more, if needed.
-
-For more information, see the following:
-
-- [https://groups.google.com/group/qubes-devel/browse\_thread/thread/9e231b0e14bf9d62](https://groups.google.com/group/qubes-devel/browse_thread/thread/9e231b0e14bf9d62)
-- [https://blog.invisiblethings.org/2011/09/28/playing-with-qubes-networking-for-fun.html](https://blog.invisiblethings.org/2011/09/28/playing-with-qubes-networking-for-fun.html)
-
-How to edit rules
------------------
-
-In order to edit rules for a given qube, select it in the Qube Manager and press the "firewall" button.
-
-
-
-If the qube is running, you can open Settings from the Qube Popup Menu.
-
-*R4.0 note:* ICMP and DNS are no longer accessible in the GUI, but can be changed via `qvm-firewall` described below.
-Connections to Updates Proxy are not made over a network so can not be allowed or blocked with firewall rules, but are controlled using the relevant policy file (see [R4.0 Updates proxy](/doc/software-update-vm/) for more detail).
-
-Note that if you specify a rule by DNS name it will be resolved to IP(s) *at the moment of applying the rules*, and not on the fly for each new connection.
-This means it will not work for servers using load balancing, and traffic to complex web sites which draw from many servers will be difficult to control.
-
-Instead of using the firewall GUI, you can use the `qvm-firewall` command in Dom0 to edit the firewall rules by hand.
-This gives you greater control than by using the GUI.
-
-The firewall rules for each qube are saved in an XML file in that qube's directory in dom0:
-
-```
-/var/lib/qubes/appvms//firewall.xml
-```
-
-Rules are implemented on the netvm.
-
-You can also manually create rules in the qube itself using standard firewalling controls.
-See [Where to put firewall rules](#where-to-put-firewall-rules).
-In complex cases, it might be appropriate to load a ruleset using `iptables-restore` called from `/rw/config/rc.local`.
-if you do this, be aware that `rc.local` is called *after* the network is up, so local rules should not be relied upon to block leaks.
-
-Reconnecting qubes after a NetVM reboot
--------------------------------------
-
-Normally Qubes doesn't let the user stop a NetVM if there are other qubes running which use it as their own NetVM.
-But in case the NetVM stops for whatever reason (e.g. it crashes, or the user forces its shutdown via qvm-kill via terminal in Dom0), Qubes R4.0 will often automatically repair the connection.
-If it does not, then there is an easy way to restore the connection to the NetVM by issuing in dom0:
-
-` qvm-prefs netvm `
-
-Normally qubes do not connect directly to the actual NetVM which has networking devices, but rather to the default sys-firewall first, and in most cases it would be the NetVM that will crash, e.g. in response to S3 sleep/restore or other issues with WiFi drivers.
-In that case it is only necessary to issue the above command once, for the sys-firewall (this assumes default VM-naming used by the default Qubes installation):
-
-` qvm-prefs sys-firewall netvm sys-net `
-
-Network service qubes
----------------------
-
-Qubes does not support running any networking services (e.g. VPN, local DNS server, IPS, ...) directly in a qube that is used to run the Qubes firewall service (usually sys-firewall) for good reasons.
-In particular, if you want to ensure proper functioning of the Qubes firewall, you should not tinker with iptables or nftables rules in such qubes.
-
-Instead, you should deploy a network infrastructure such as
-
-~~~
-sys-net <--> sys-firewall-1 <--> network service qube <--> sys-firewall-2 <--> [client qubes]
-~~~
-
-Thereby sys-firewall-1 is only needed if you have other client qubes connected there, or you want to manage the traffic of the local network service qube.
-The sys-firewall-2 proxy ensures that:
-
-1. Firewall changes done in the network service qube cannot render the Qubes firewall ineffective.
-2. Changes to the Qubes firewall by the Qubes maintainers cannot lead to unwanted information leakage in combination with user rules deployed in the network service qube.
-3. A compromise of the network service qube does not compromise the Qubes firewall.
-
-If you adopt this model, you should be aware that all traffic will arrive at the `network service qube` appearing to originate from the IP address of `sys-firewall-2`.
-
-For the VPN service please also look at the [VPN documentation](https://github.com/Qubes-Community/Contents/blob/master/docs/configuration/vpn.md).
-
-Enabling networking between two qubes
--------------------------------------
-
-Normally any networking traffic between qubes is prohibited for security reasons.
-However, in special situations, you might want to selectively allow specific qubes to establish networking connectivity between each other.
-For example, this might be useful in some development work, when you want to test networking code, or to allow file exchange between HVM domains (which do not have Qubes tools installed) via SMB/scp/NFS protocols.
-
-In order to allow networking between qubes A and B follow these steps:
-
-- Make sure both A and B are connected to the same firewall vm (by default all VMs use the same firewall VM).
-- Note the Qubes IP addresses assigned to both qubes.
- This can be done using the `qvm-ls -n` command, or via the Qubes Manager preferences pane for each qube.
-- Start both qubes, and also open a terminal in the firewall VM
-- In the firewall VM's terminal enter the following iptables rule:
-
-~~~
-sudo iptables -I FORWARD 2 -s -d -j ACCEPT
-~~~
-
-- In qube B's terminal enter the following iptables rule:
-
-~~~
-sudo iptables -I INPUT -s -j ACCEPT
-~~~
-
-- Now you should be able to reach B from A -- test it using e.g. ping issued from A.
- Note however, that this doesn't allow you to reach A from B -- for this you would need two more rules, with A and B swapped.
-- If everything works as expected, then you should write the above iptables rules into firewallVM's `qubes-firewall-user-script` script.
- This script is run when the netvm starts up.
- You should also write relevant rules in A and B's `rc.local` script which is run when the qube is launched.
- Here's an example how to update the script:
-
-~~~
-[user@sys-firewall ~]$ sudo bash
-[root@sys-firewall user]# echo "iptables -I FORWARD 2 -s 10.137.2.25 -d 10.137.2.6 -j ACCEPT" >> /rw/config/qubes-firewall-user-script
-[root@sys-firewall user]# chmod +x /rw/config/qubes-firewall-user-script
-~~~
-
-- Here is an example how to update `rc.local`:
-
-~~~
-[user@B ~]$ sudo bash
-[root@B user]# echo "iptables -I INPUT -s 10.137.2.25 -j ACCEPT" >> /rw/config/rc.local
-[root@B user]# chmod +x /rw/config/rc.local
-~~~
-
-Opening a single TCP port to other network-isolated qube
---------------------------------------------------------
-
-In the case where a specific TCP port needs to be exposed from a qubes to another one, you do not need to enable networking between them but you can use the qubes RPC service `qubes.ConnectTCP`.
-
-**1. Simple port binding**
-
-Consider the following example. `mytcp-service` qube has a TCP service running on port `444` and `untrusted` qube needs to access this service.
-
-- In dom0, add the following to `/etc/qubes-rpc/policy/qubes.ConnectTCP`:
-
- ~~~
- untrusted @default allow,target=mytcp-service
- ~~~
-
-- In untrusted, use the Qubes tool `qvm-connect-tcp`:
-
- ~~~
- [user@untrusted #]$ qvm-connect-tcp 444:@default:444
- ~~~
-
-> Note: The syntax is the same as SSH tunnel handler. The first `444` correspond to the localport destination of `untrusted`, `@default` the remote machine and the second `444` to the remote machine port.
-
-The service of `mytcp-service` running on port `444` is now accessible in `untrusted` as `localhost:444`.
-
-Here `@default` is used to hide the destination qube which is specified in the Qubes RPC policy by `target=mytcp-service`. Equivalent call is to use the tool as follow:
-
-~~~
- [user@untrusted #]$ qvm-connect-tcp ::444
-~~~
-
-which means to use default local port of `unstrusted` as the same of the remote port and unspecified destination qube is `@default` by default in `qrexec` call.
-
-**2. Binding remote port on another local port**
-
-Consider now the case where someone prefers to specify the destination qube and use another port in untrusted,for example `10044`. Instead of previous case, add
-
-~~~
-untrusted mytcp-service allow
-~~~
-
-in `/etc/qubes-rpc/policy/qubes.ConnectTCP` and in untrusted, use the tool as follow:
-
-~~~
- [user@untrusted #]$ qvm-connect-tcp 10444:mytcp-service:444
-~~~
-
-The service of `mytcp-service` running on port `444` is now accessible in `untrusted` as `localhost:10444`.
-
-**3. Binding to different qubes using RPC policies**
-
-One can go further than the previous examples by redirecting different ports to different qubes. For example, let assume that another qube `mytcp-service-bis` with a TCP service is running on port `445`. If someone wants `untrusted` to be able to reach this service but port `445` is reserved to `mytcp-service-bis` then, in dom0, add the following to `/etc/qubes-rpc/policy/qubes.ConnectTCP+445`:
-
-~~~
-untrusted @default allow,target=mytcp-service-bis
-~~~
-
-In that case, calling `qvm-connect-tcp` like previous examples, will still bind TCP port `444` of `mytcp-service` to `untrusted` but now, calling it with port `445`
-
-~~~
- [user@untrusted #]$ qvm-connect-tcp ::445
-~~~
-
-will restrict the binding to only the corresponding TCP port of `mytcp-service-bis`.
-
-**4. Permanent port binding**
-
-For creating a permanent port bind between two qubes, `systemd` can be used. We use the case of the first example. In `/rw/config` (or any place you find suitable) of qube `untrusted`, create `my-tcp-service.socket` with content:
-
-~~~
-[Unit]
-Description=my-tcp-service
-
-[Socket]
-ListenStream=127.0.0.1:444
-Accept=true
-
-[Install]
-WantedBy=sockets.target
-~~~
-
-and `my-tcp-service@.service` with content:
-
-~~~
-[Unit]
-Description=my-tcp-service
-
-[Service]
-ExecStart=qrexec-client-vm '' qubes.ConnectTCP+444
-StandardInput=socket
-StandardOutput=inherit
-~~~
-
-In `/rw/config/rc.local`, append the lines:
-
-~~~
-cp -r /rw/config/my-tcp-service.socket /rw/config/my-tcp-service@.service /lib/systemd/system/
-systemctl daemon-reload
-systemctl start my-tcp-service.socket
-~~~
-
-When the qube `unstrusted` has started (after a first reboot), you can directly access the service of `mytcp-service` running on port `444` as `localhost:444`.
-
-Port forwarding to a qube from the outside world
-------------------------------------------------
-
-In order to allow a service present in a qube to be exposed to the outside world in the default setup (where the qube has sys-firewall as network VM, which in turn has sys-net as network VM) the following needs to be done:
-
-- In the sys-net VM:
- - Route packets from the outside world to the sys-firewall VM
- - Allow packets through the sys-net VM firewall
-- In the sys-firewall VM:
- - Route packets from the sys-net VM to the VM
- - Allow packets through the sys-firewall VM firewall
-- In the qube:
- - Allow packets through the qube firewall to reach the service
-
-As an example we can take the use case of a web server listening on port 443 that we want to expose on our physical interface eth0, but only to our local network 192.168.x.0/24.
-
-> Note: To have all interfaces available and configured, make sure the 3 qubes are up and running
-
-> Note: [Issue #4028](https://github.com/QubesOS/qubes-issues/issues/4028) discusses adding a command to automate exposing the port.
-
-**1. Identify the IP addresses you will need to use for sys-net, sys-firewall and the destination qube.**
-
-You can get this information from the Settings Window for the qube, or by running this command in each qube:
-`ifconfig | grep -i cast `
-Note the IP addresses you will need.
-> Note: The vifx.0 interface is the one used by qubes connected to this netvm so it is _not_ an outside world interface.
-
-**2. Route packets from the outside world to the FirewallVM**
-
-For the following example, we assume that the physical interface eth0 in sys-net has the IP address 192.168.x.y and that the IP address of sys-firewall is 10.137.1.z.
-
-In the sys-net VM's Terminal, code a natting firewall rule to route traffic on the outside interface for the service to the sys-firewall VM
-
-```
-iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -d 192.168.x.y -j DNAT --to-destination 10.137.1.z
-```
-
-Code the appropriate new filtering firewall rule to allow new connections for the service
-
-```
-iptables -I FORWARD 2 -i eth0 -d 10.137.1.z -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
-```
-
-> If you want to expose the service on multiple interfaces, repeat the steps described in part 1 for each interface.
-> In Qubes R4, at the moment ([QubesOS/qubes-issues#3644](https://github.com/QubesOS/qubes-issues/issues/3644)), nftables is also used which imply that additional rules need to be set in a `qubes-firewall` nft table with a forward chain.
-
-`nft add rule ip qubes-firewall forward meta iifname eth0 ip daddr 10.137.1.z tcp dport 443 ct state new counter accept`
-
-Verify you are cutting through the sys-net VM firewall by looking at its counters (column 2)
-
-```
-iptables -t nat -L -v -n
-iptables -L -v -n
-```
-
-> Note: On Qubes R4, you can also check the nft counters
-
-```
-nft list table ip qubes-firewall
-```
-
-Send a test packet by trying to connect to the service from an external device
-
-```
-telnet 192.168.x.y 443
-```
-
-Once you have confirmed that the counters increase, store these command in `/rw/config/rc.local` so they get set on sys-net start-up
-
-```
-sudo nano /rw/config/rc.local
-```
-
-~~~
-#!/bin/sh
-
-
-####################
-# My service routing
-
-# Create a new firewall natting chain for my service
-if iptables -w -t nat -N MY-HTTPS; then
-
-# Add a natting rule if it did not exist (to avoid clutter if script executed multiple times)
- iptables -w -t nat -A MY-HTTPS -j DNAT --to-destination 10.137.1.z
-
-fi
-
-
-# If no prerouting rule exist for my service
-if ! iptables -w -t nat -n -L PREROUTING | grep --quiet MY-HTTPS; then
-
-# add a natting rule for the traffic (same reason)
- iptables -w -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -d 192.168.x.y -j MY-HTTPS
-fi
-
-
-######################
-# My service filtering
-
-# Create a new firewall filtering chain for my service
-if iptables -w -N MY-HTTPS; then
-
-# Add a filtering rule if it did not exist (to avoid clutter if script executed multiple times)
- iptables -w -A MY-HTTPS -s 192.168.x.0/24 -j ACCEPT
-
-fi
-
-# If no forward rule exist for my service
-if ! iptables -w -n -L FORWARD | grep --quiet MY-HTTPS; then
-
-# add a forward rule for the traffic (same reason)
- iptables -w -I FORWARD 2 -d 10.137.1.z -p tcp --dport 443 -m conntrack --ctstate NEW -j MY-HTTPS
-
-fi
-~~~
-
-> Note: Again in R4 the following needs to be added:
-
-~~~
-#############
-# In Qubes R4
-
-# If not already present
-if nft -nn list table ip qubes-firewall | grep "tcp dport 443 ct state new"; then
-
-# Add a filtering rule
- nft add rule ip qubes-firewall forward meta iifname eth0 ip daddr 10.137.1.z tcp dport 443 ct state new counter accept
-
-fi
-~~~
-
-**3. Route packets from the FirewallVM to the VM**
-
-For the following example, we use the fact that the physical interface of sys-firewall, facing sys-net, is eth0. Furthermore, we assume that the target VM running the web server has the IP address 10.137.0.xx and that the IP address of sys-firewall is 10.137.1.z.
-
-In the sys-firewall VM's Terminal, code a natting firewall rule to route traffic on its outside interface for the service to the qube
-
-```
-iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -d 10.137.1.z -j DNAT --to-destination 10.137.0.xx
-```
-
-Code the appropriate new filtering firewall rule to allow new connections for the service
-
-```
-iptables -I FORWARD 2 -i eth0 -s 192.168.x.0/24 -d 10.137.0.xx -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
-```
-
-> Note: If you do not wish to limit the IP addresses connecting to the service, remove the ` -s 192.168.0.1/24 `
-
-> Note: On Qubes R4
-
-```
-nft add rule ip qubes-firewall forward meta iifname eth0 ip saddr 192.168.x.0/24 ip daddr 10.137.0.xx tcp dport 443 ct state new counter accept
-```
-
-Once you have confirmed that the counters increase, store these command in `/rw/config/qubes-firewall-user-script`
-
-```
-sudo nano /rw/config/qubes-firewall-user-script
-```
-
-~~~
-#!/bin/sh
-
-
-####################
-# My service routing
-
-# Create a new firewall natting chain for my service
-if iptables -w -t nat -N MY-HTTPS; then
-
-# Add a natting rule if it did not exist (to avoid clutter if script executed multiple times)
- iptables -w -t nat -A MY-HTTPS -j DNAT --to-destination 10.137.0.xx
-
-fi
-
-
-# If no prerouting rule exist for my service
-if ! iptables -w -t nat -n -L PREROUTING | grep --quiet MY-HTTPS; then
-
-# add a natting rule for the traffic (same reason)
- iptables -w -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -d 10.137.1.z -j MY-HTTPS
-fi
-
-
-######################
-# My service filtering
-
-# Create a new firewall filtering chain for my service
-if iptables -w -N MY-HTTPS; then
-
-# Add a filtering rule if it did not exist (to avoid clutter if script executed multiple times)
- iptables -w -A MY-HTTPS -s 192.168.x.0/24 -j ACCEPT
-
-fi
-
-# If no forward rule exist for my service
-if ! iptables -w -n -L FORWARD | grep --quiet MY-HTTPS; then
-
-# add a forward rule for the traffic (same reason)
- iptables -w -I FORWARD 4 -d 10.137.0.xx -p tcp --dport 443 -m conntrack --ctstate NEW -j MY-HTTPS
-
-fi
-
-################
-# In Qubes OS R4
-
-# If not already present
-if ! nft -nn list table ip qubes-firewall | grep "tcp dport 443 ct state new"; then
-
-# Add a filtering rule
- nft add rule ip qubes-firewall forward meta iifname eth0 ip saddr 192.168.x.0/24 ip daddr 10.137.0.xx tcp dport 443 ct state new counter accept
-
-fi
-~~~
-
-Finally make this file executable (so it runs at every Firewall VM update)
-
-~~~
-sudo chmod +x /rw/config/qubes-firewall-user-script
-~~~
-
-If the service should be available to other VMs on the same system, do not forget to specify the additional rules described above.
-
-**4. Allow packets into the qube to reach the service**
-
-Here no routing is required, only filtering.
-Proceed in the same way as above but store the filtering rule in the `/rw/config/rc.local` script.
-For the following example, we assume that the target VM running the web server has the IP address 10.137.0.xx
-
-```
-sudo nano /rw/config/rc.local
-```
-
-~~~
-######################
-# My service filtering
-
-# Create a new firewall filtering chain for my service
-if iptables -w -N MY-HTTPS; then
-
-# Add a filtering rule if it did not exist (to avoid clutter if script executed multiple times)
- iptables -w -A MY-HTTPS -j ACCEPT
-
-fi
-
-# If no input rule exists for my service
-if ! iptables -w -n -L INPUT | grep --quiet MY-HTTPS; then
-
-# add a forward rule for the traffic (same reason)
- iptables -w -I INPUT 5 -d 10.137.0.xx -p tcp --dport 443 -m conntrack --ctstate NEW -j MY-HTTPS
-
-fi
-~~~
-
-This time testing should allow connectivity to the service as long as the service is up :-)
-
-Where to put firewall rules
----------------------------
-
-Implicit in the above example [scripts](/doc/config-files/), but worth calling attention to: for all qubes *except* those supplying networking, iptables commands should be added to the `/rw/config/rc.local` script.
-For app qubes supplying networking (`sys-firewall` inclusive), iptables commands should be added to `/rw/config/qubes-firewall-user-script`.
-
-Firewall troubleshooting
-------------------------
-
-Firewall logs are stored in the systemd journal of the qube the firewall is running in (probably `sys-firewall`).
-You can view them by running `sudo journalctl -u qubes-firewall.service` in the relevant qube.
-Sometimes these logs can contain useful information about errors that are preventing the firewall from behaving as you would expect.
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/split-gpg.md b/user/security-in-qubes/split-gpg.md
index a10ca40fe..3fcb48093 100644
--- a/user/security-in-qubes/split-gpg.md
+++ b/user/security-in-qubes/split-gpg.md
@@ -12,384 +12,7 @@ redirect_from:
- /doc/OpenPGP/
- /doc/UserDoc/OpenPGP/
- /wiki/UserDoc/OpenPGP/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/split-gpg.html
ref: 168
title: Split GPG
----
-
-Split GPG implements a concept similar to having a smart card with your private GPG keys, except that the role of the "smart card" is played by another Qubes app qube.
-This way one not-so-trusted domain, e.g. the one where Thunderbird is running, can delegate all crypto operations -- such as encryption/decryption and signing -- to another, more trusted, network-isolated domain.
-This way the compromise of your domain where Thunderbird or another client app is running -- arguably a not-so-unthinkable scenario -- does not allow the attacker to automatically also steal all your keys.
-(We should make a rather obvious comment here that the so-often-used passphrases on private keys are pretty meaningless because the attacker can easily set up a simple backdoor which would wait until the user enters the passphrase and steal the key then.)
-
-[](/attachment/doc/split-gpg-diagram.png)
-
-This diagram presents an overview of the Split GPG architecture.
-
-## Advantages of Split GPG vs. traditional GPG with a smart card
-
-It is often thought that the use of smart cards for private key storage guarantees ultimate safety.
-While this might be true (unless the attacker can find a usually-very-expensive-and-requiring-physical-presence way to extract the key from the smart card) but only with regards to the safety of the private key itself.
-However, there is usually nothing that could stop the attacker from requesting the smart card to perform decryption of all the user documents the attacker has found or need to decrypt.
-In other words, while protecting the user's private key is an important task, we should not forget that ultimately it is the user data that are to be protected and that the smart card chip has no way of knowing the requests to decrypt documents are now coming from the attacker's script and not from the user sitting in front of the monitor.
-(Similarly the smart card doesn't make the process of digitally signing a document or a transaction in any way more secure -- the user cannot know what the chip is really signing.
-Unfortunately this problem of signing reliability is not solvable by Split GPG)
-
-With Qubes Split GPG this problem is drastically minimized, because each time the key is to be used the user is asked for consent (with a definable time out, 5 minutes by default), plus is always notified each time the key is used via a tray notification from the domain where GPG backend is running.
-This way it would be easy to spot unexpected requests to decrypt documents.
-
-[](/attachment/doc/r2-split-gpg-1.png)
-[](/attachment/doc/r2-split-gpg-3.png)
-
-## Configuring Split GPG
-
-In dom0, make sure the `qubes-gpg-split-dom0` package is installed.
-
-```
-[user@dom0 ~]$ sudo qubes-dom0-update qubes-gpg-split-dom0
-```
-
-Make sure you have the `qubes-gpg-split` package installed in the template you will use for the GPG domain.
-
-For Debian or Whonix:
-
-```
-[user@debian-10 ~]$ sudo apt install qubes-gpg-split
-```
-
-For Fedora:
-
-```
-[user@fedora-32 ~]$ sudo dnf install qubes-gpg-split
-```
-
-### Setting up the GPG backend domain
-
-First, create a dedicated app qube for storing your keys (we will be calling it the GPG backend domain).
-It is recommended that this domain be network disconnected (set its netvm to `none`) and only used for this one purpose.
-In later examples this app qube is named `work-gpg`, but of course it might have any other name.
-
-Make sure that gpg is installed there.
-At this stage you can add the private keys you want to store there, or you can now set up Split GPG and add the keys later.
-To check which private keys are in your GPG keyring, use:
-
-```shell_session
-[user@work-gpg ~]$ gpg -K
-/home/user/.gnupg/secring.gpg
------------------------------
-sec 4096R/3F48CB21 2012-11-15
-uid Qubes OS Security Team
-ssb 4096R/30498E2A 2012-11-15
-(...)
-```
-
-This is pretty much all that is required.
-However, you might want to modify the default timeout: this tells the backend for how long the user's approval for key access should be valid.
-(The default is 5 minutes.) You can change this via the `QUBES_GPG_AUTOACCEPT` environment variable.
-You can override it e.g. in `~/.profile`:
-
-```shell_session
-[user@work-gpg ~]$ echo "export QUBES_GPG_AUTOACCEPT=86400" >> ~/.profile
-```
-
-Please note that previously, this parameter was set in ~/.bash_profile.
-This will no longer work.
-If you have the parameter set in ~/.bash_profile you *must* update your configuration.
-
-Please be aware of the caveat regarding passphrase-protected keys in the [Current limitations](#current-limitations) section.
-
-### Configuring the client apps to use Split GPG backend
-
-Normally it should be enough to set the `QUBES_GPG_DOMAIN` to the GPG backend domain name and use `qubes-gpg-client` in place of `gpg`, e.g.:
-
-```shell_session
-[user@work-email ~]$ export QUBES_GPG_DOMAIN=work-gpg
-[user@work-email ~]$ gpg -K
-[user@work-email ~]$ qubes-gpg-client -K
-/home/user/.gnupg/secring.gpg
------------------------------
-sec 4096R/3F48CB21 2012-11-15
-uid Qubes OS Security Team
-ssb 4096R/30498E2A 2012-11-15
-(...)
-
-[user@work-email ~]$ qubes-gpg-client secret_message.txt.asc
-(...)
-```
-
-Note that running normal `gpg -K` in the demo above shows no private keys stored in this app qube.
-
-A note on `gpg` and `gpg2`:
-
-Throughout this guide, we refer to `gpg`, but note that Split GPG uses `gpg2` under the hood for compatibility with programs like Enigmail (which now supports only `gpg2`).
-If you encounter trouble while trying to set up Split GPG, make sure you're using `gpg2` for your configuration and testing, since keyring data may differ between the two installations.
-
-### Advanced Configuration
-
-The `qubes-gpg-client-wrapper` script sets the `QUBES_GPG_DOMAIN` variable automatically based on the content of the file `/rw/config/gpg-split-domain`, which should be set to the name of the GPG backend VM. This file survives the app qube reboot, of course.
-
-```shell_session
-[user@work-email ~]$ sudo bash
-[root@work-email ~]$ echo "work-gpg" > /rw/config/gpg-split-domain
-```
-
-Split GPG's default qrexec policy requires the user to enter the name of the app qube containing GPG keys on each invocation. To improve usability for applications like Thunderbird with Enigmail, in `dom0` place the following line at the top of the file `/etc/qubes-rpc/policy/qubes.Gpg`:
-
-```
-work-email work-gpg allow
-```
-
-where `work-email` is the Thunderbird + Enigmail app qube and `work-gpg` contains your GPG keys.
-
-You may also edit the qrexec policy file for Split GPG in order to tell Qubes your default gpg vm (qrexec prompts will appear with the gpg vm preselected as the target, instead of the user needing to type a name in manually). To do this, append `,default_target=` to `ask` in `/etc/qubes-rpc/policy/qubes.Gpg`. For the examples given on this page:
-
-```
-@anyvm @anyvm ask,default_target=work-gpg
-```
-
-Note that, because this makes it easier to accept Split GPG's qrexec authorization prompts, it may decrease security if the user is not careful in reviewing presented prompts. This may also be inadvisable if there are multiple app qubes with Split GPG set up.
-
-## Using Thunderbird
-
-### Thunderbird 78 and higher
-
-Starting with version 78, Thunderbird has a built-in PGP feature and no longer requires the Enigmail extension. For users coming from the Enigmail extension, the built-in functionality is more limited currently, including that **public keys must live in your `work-email` qube with Thunderbird rather than your offline `work-gpg` qube**.
-
-In `work-email`, use the Thunderbird config editor (found at the bottom of preferences/options), and search for `mail.openpgp.allow_external_gnupg`. Switch the value to true. Still in config editor, search for `mail.openpgp.alternative_gpg_path`. Set its value to `/usr/bin/qubes-gpg-client-wrapper`. Restart Thunderbird after this change.
-
-[](/attachment/doc/tb78-1.png)
-[](/attachment/doc/tb78-2.png)
-[](/attachment/doc/tb78-3.png)
-
-You need to obtain your key ID which should be **exactly 16 characters**. Enter the command `qubes-gpg-client-wrapper -K --keyid-format long`:
-
-```
-[user@work-email ~]$ qubes-gpg-client-wrapper -K --keyid-format long
-/home/user/.gnupg/pubring.kbx
------------------------------
-sec rsa2048/777402E6D301615C 2020-09-05 [SC] [expires: 2022-09-05]
- F7D2D4E922DFB7B2589AF3E9777402E6D301615C
-uid [ultimate] Qubes test
-ssb rsa2048/370CE932085BA13B 2020-09-05 [E] [expires: 2022-09-05]
-```
-
-```
-[user@work-email ~]$ qubes-gpg-client-wrapper --armor --export 777402E6D301615C > 777402E6D301615C.asc
-```
-
-Open the Account Settings and open the *End-to-End Encryption* tab of the respective email account. Click the *Add Key* button. You'll be offered the choice *Use your external key through GnuPG*. Select it and click Continue.
-
-[](/attachment/doc/tb78-4.png)
-[](/attachment/doc/tb78-5.png)
-
-The key ID reference you would need here is `777402E6D301615C`. Now paste or type the ID of the secret key that you would like to use. Be careful to enter it correctly, because your input isn't verified. Confirm to save this key ID. Now you can select the key ID to use.
-
-[](/attachment/doc/tb78-6.png)
-[](/attachment/doc/tb78-7.png)
-
-This key ID will be used to digitally sign or send an encrypted message with your account. For this to work, Thunderbird needs a copy of your public key. At this time, Thunderbird doesn't fetch the public key from `/usr/bin/qubes-gpg-client-wrapper`, you must manually import it. Export the key as follow (assuming the key ID would be `777402E6D301615C`):
-
-[](/attachment/doc/tb78-8.png)
-[](/attachment/doc/tb78-9.png)
-
-Use Thunderbird's Tools menu to open *OpenPGP Key Management*. In that window, use the File menu to access the *Import Public Key(s) From File* command. Open the file with your public key. After the import was successful, right click on the imported key in the list and select *Key Properties*. You must mark your own key as *Yes, I've verified in person this key has the correct fingerprint*.
-
-Once this is done, you should be able to send an encrypted and signed email by selecting *Require Encryption* or *Digitally Sign This Message* in the compose menu *Options* or *Security* toolbar button. You can try it by sending an email to yourself.
-
-[](/attachment/doc/tb78-10.png)
-
-For more details about using smart cards/Split GPG with Thunderbird PGP feature, please see [Thunderbird:OpenPGP:Smartcards](https://wiki.mozilla.org/Thunderbird:OpenPGP:Smartcards) from which the above documentation is inspired.
-
-### Older Thunderbird versions
-
-For Thunderbird versions below 78, the traditional Enigmail + Split GPG setup is required.
-It is recommended to set up and use `/usr/bin/qubes-gpg-client-wrapper`, as discussed above, in Thunderbird through the Enigmail addon.
-
-**Warning:** Before adding any account, configuring Enigmail with `/usr/bin/qubes-gpg-client-wrapper` is **required**. By default, Enigmail will generate a default GPG key in `work-email` associated with the newly created Thunderbird account. Generally, it corresponds to the email used in `work-gpg` associated to your private key. In consequence, a new, separate private key will be stored in `work-email` but it _does not_ correspond to your private key in `work-gpg`. Comparing the `fingerprint` or `expiration date` will show that they are not the same private key. In order to prevent Enigmail using this default generated local key in `work-email`, you can safely remove it.
-
-On a fresh Enigmail install, your need to change the default `Enigmail Junior Mode`. Go to Thunderbird preferences and then privacy tab. Select `Force using S/MIME and Enigmail`. Then, in the preferences of Enigmail, make it point to `/usr/bin/qubes-gpg-client-wrapper` instead of the standard GnuPG binary:
-
-[](/attachment/doc/tb-enigmail-split-gpg-settings-2.png)
-
-## Using Keybase with Split GPG
-
-Keybase, a security focused messaging and file-sharing app with GPG integration, can be configured to use Split GPG.
-
-The Keybase service does not preserve/pass the `QUBES_GPG_DOMAIN` environment variable through to underlying GPG processes, so it **must** be configured to use `/usr/bin/qubes-gpg-client-wrapper` (as discussed above) rather than `/usr/bin/qubes-gpg-client`.
-
-The following command will configure Keybase to use `/usr/bin/qubes-gpg-client-wrapper` instead of its built-in GPG client:
-
-```
-$ keybase config set gpg.command /usr/bin/qubes-gpg-client-wrapper
-```
-
-Now that Keybase is configured to use `qubes-gpg-client-wrapper`, you will be able to use `keybase pgp select` to choose a GPG key from your backend GPG app qube and link that key to your Keybase identity.
-
-## Using Git with Split GPG
-
-Git can be configured to utilize Split GPG, something useful if you would like to contribute to the Qubes OS Project as every commit is required to be signed.
-The most basic `~/.gitconfig` file enabling Split GPG looks something like this.
-
-```
-[user]
- name =
- email =
- signingKey =
-
-[gpg]
- program = qubes-gpg-client-wrapper
-```
-
-Your key id is the public id of your signing key, which can be found by running `qubes-gpg-client --list-keys`.
-In this instance, the key id is E142F75A6B1B610E0E8F874FB45589245791CACB.
-
-```shell_session
-[user@work-email ~]$ qubes-gpg-client --list-keys
-/home/user/.gnupg/pubring.kbx
------------------------------
-pub ed25519 2022-08-16 [C]
- E142F75A6B1B610E0E8F874FB45589245791CACB
-uid [ultimate] Qubes User
-sub ed25519 2022-08-16 [S]
-sub cv25519 2022-08-16 [E]
-sub ed25519 2022-08-16 [A]
-```
-
-To sign commits, you now add the "-S" flag to your commit command, which should prompt for Split GPG usage.
-If you would like to automatically sign all commits, you can add the following snippet to `~/.gitconfig`.
-
-```
-[commit]
- gpgSign = true
-```
-
-Lastly, if you would like to add aliases to sign and verify tags using the conventions the Qubes OS Project recommends, refer to the [code signing documentation](/doc/code-signing/#using-pgp-with-git).
-
-## Importing public keys
-
-Use `qubes-gpg-import-key` in the client app qube to import the key into the GPG backend VM.
-
-```shell_session
-[user@work-email ~]$ export QUBES_GPG_DOMAIN=work-gpg
-[user@work-email ~]$ qubes-gpg-import-key ~/Downloads/marmarek.asc
-```
-
-A safe, unspoofable user consent dialog box is displayed.
-
-[](/attachment/doc/r2-split-gpg-5.png)
-
-Selecting "Yes to All" will add a line in the corresponding [RPC Policy](/doc/rpc-policy/) file.
-
-## Advanced: Using Split GPG with Subkeys
-
-Users with particularly high security requirements may wish to use Split GPG with [subkeys](https://wiki.debian.org/Subkeys).
-However, this setup comes at a significant cost: It will be impossible to sign other people's keys with the master secret key without breaking this security model.
-Nonetheless, if signing others' keys is not required, then Split GPG with subkeys offers unparalleled security for one's master secret key.
-
-### Setup Description
-
-In this example, the following keys are stored in the following locations (see below for definitions of these terms):
-
-| PGP Key(s) | VM Name |
-| ---------- | ------------ |
-| `sec` | `vault` |
-| `ssb` | `work-gpg` |
-| `pub` | `work-email` |
-
-* `sec` (master secret key)
-
- Depending on your needs, you may wish to create this as a **certify-only (C)** key, i.e., a key which is capable only of signing (a.k.a., "certifying") other keys.
- This key may be created *without* an expiration date.
- This is for two reasons.
- First, the master secret key is never to leave the `vault` VM, so it is extremely unlikely ever to be obtained by an adversary (see below).
- Second, an adversary who *does* manage to obtain the master secret key either possesses the passphrase to unlock the key (if one is used) or does not.
- An adversary who *does* possess the passphrase can simply use it to legally extend the expiration date of the key (or remove it entirely).
- An adversary who does *not* possess the passphrase cannot use the key at all.
- In either case, an expiration date provides no additional benefit.
-
- By the same token, however, having a passphrase on the key is of little value.
- An adversary who is capable of stealing the key from your `vault` would almost certainly also be capable of stealing the passphrase as you enter it.
- An adversary who obtains the passphrase can then use it in order to change or remove the passphrase from the key.
- Therefore, using a passphrase at all should be considered optional.
- It is, however, recommended that a **revocation certificate** be created and safely stored in multiple locations so that the master keypair can be revoked in the (exceedingly unlikely) event that it is ever compromised.
-
-* `ssb` (secret subkey)
-
- Depending on your needs, you may wish to create two different subkeys: one for **signing (S)** and one for **encryption (E)**.
- You may also wish to give these subkeys reasonable expiration dates (e.g., one year).
- Once these keys expire, it is up to you whether to *renew* these keys by extending the expiration dates or to create *new* subkeys when the existing set expires.
-
- On the one hand, an adversary who obtains any existing encryption subkey (for example) will be able to use it in order to decrypt all emails (for example) which were encrypted to that subkey.
- If the same subkey were to continue to be used--and its expiration date continually extended--only that one key would need to be stolen (e.g., as a result of the `work-gpg` VM being compromised; see below) in order to decrypt *all* of the user's emails.
- If, on the other hand, each encryption subkey is used for at most approximately one year, then an adversary who obtains the secret subkey will be capable of decrypting at most approximately one year's worth of emails.
-
- On the other hand, creating a new signing subkey each year without renewing (i.e., extending the expiration dates of) existing signing subkeys would mean that all of your old signatures would eventually read as "EXPIRED" whenever someone attempts to verify them.
- This can be problematic, since there is no consensus on how expired signatures should be handled.
- Generally, digital signatures are intended to last forever, so this is a strong reason against regularly retiring one's signing subkeys.
-
-* `pub` (public key)
-
- This is the complement of the master secret key.
- It can be uploaded to keyservers (or otherwise publicly distributed) and may be signed by others.
-
-* `vault`
-
- This is a network-isolated VM.
- The initial master keypair and subkeys are generated in this VM.
- The master secret key *never* leaves this VM under *any* circumstances.
- No files or text is *ever* [copied](/doc/how-to-copy-and-move-files/#security) or [pasted](/doc/how-to-copy-and-paste-text/#security) into this VM under *any* circumstances.
-
-* `work-gpg`
-
- This is a network-isolated VM.
- This VM is used *only* as the GPG backend for `work-email`.
- The secret subkeys (but *not* the master secret key) are [copied](/doc/how-to-copy-and-move-files/#security) from the `vault` VM to this VM.
- Files from less trusted VMs are *never* [copied](/doc/how-to-copy-and-move-files/#security) into this VM under *any* circumstances.
-
-* `work-email`
-
- This VM has access to the mail server.
- It accesses the `work-gpg` VM via the Split GPG protocol.
- The public key may be stored in this VM so that it can be attached to emails and for other such purposes.
-
-### Security Benefits
-
-In the standard Split GPG setup, there are at least two ways in which the `work-gpg` VM might be compromised.
-First, an attacker who is capable of exploiting a hypothetical bug in `work-email`'s [MUA](https://en.wikipedia.org/wiki/Mail_user_agent) could gain control of the `work-email` VM and send a malformed request which exploits a hypothetical bug in the GPG backend (running in the `work-gpg` VM), giving the attacker control of the `work-gpg` VM.
-Second, a malicious public key file which is imported into the `work-gpg` VM might exploit a hypothetical bug in the GPG backend which is running there, again giving the attacker control of the `work-gpg` VM.
-In either case, such an attacker might then be able to leak both the master secret key and its passphrase (if any is used, it would regularly be input in the work-gpg VM and therefore easily obtained by an attacker who controls this VM) back to the `work-email` VM or to another VM (e.g., the `netvm`, which is always untrusted by default) via the Split GPG protocol or other [covert channels](/doc/data-leaks/).
-Once the master secret key is in the `work-email` VM, the attacker could simply email it to himself (or to the world).
-
-In the alternative setup described in this section (i.e., the subkey setup), even an attacker who manages to gain access to the `work-gpg` VM will not be able to obtain the user's master secret key since it is simply not there.
-Rather, the master secret key remains in the `vault` VM, which is extremely unlikely to be compromised, since nothing is ever copied or transferred into it.
-\* The attacker might nonetheless be able to leak the secret subkeys from the `work-gpg` VM in the manner described above, but even if this is successful, the secure master secret key can simply be used to revoke the compromised subkeys and to issue new subkeys in their place.
-(This is significantly less devastating than having to create a new *master* keypair.)
-
-\*In order to gain access to the `vault` VM, the attacker would require the use of, e.g., a general Xen VM escape exploit or a [signed, compromised package which is already installed in the template](/doc/templates/#trusting-your-templates) upon which the `vault` VM is based.
-
-### Subkey Tutorials and Discussions
-
-(Note: Although the tutorials below were not written with Qubes Split GPG in mind, they can be adapted with a few commonsense adjustments.
-As always, exercise caution and use your good judgment.)
-
-* ["OpenPGP in Qubes OS" on the qubes-users mailing list](https://groups.google.com/d/topic/qubes-users/Kwfuern-R2U/discussion)
-* ["Creating the Perfect GPG Keypair" by Alex Cabal](https://alexcabal.com/creating-the-perfect-gpg-keypair/)
-* ["GPG Offline Master Key w/ smartcard" maintained by Abel Luck](https://gist.github.com/abeluck/3383449)
-* ["Using GnuPG with QubesOS" by Alex](https://apapadop.wordpress.com/2013/08/21/using-gnupg-with-qubesos/)
-
-## Current limitations
-
-* Current implementation requires importing of public keys to the vault domain.
- This opens up an avenue to attack the gpg running in the backend domain via a hypothetical bug in public key importing code.
- See ticket [#474](https://github.com/QubesOS/qubes-issues/issues/474) for more details and plans how to get around this problem, as well as the section on [using Split GPG with subkeys](#advanced-using-split-gpg-with-subkeys).
-
-* It doesn't solve the problem of allowing the user to know what is to be signed before the operation gets approved.
- Perhaps the GPG backend domain could start a disposable and have the to-be-signed document displayed there? To Be Determined.
-
-* The Split GPG client will fail to sign or encrypt if the private key in the GnuPG backend is protected by a passphrase.
- It will give an `Inappropriate ioctl for device` error.
- Do not set passphrases for the private keys in the GPG backend domain.
- Doing so won't provide any extra security anyway, as explained in the introduction and in [using Split GPG with subkeys](#advanced-using-split-gpg-with-subkeys).
- If you are generating a new key pair, or if you have a private key that already has a passphrase, you can use `gpg2 --edit-key ` then `passwd` to set an empty passphrase.
- Note that `pinentry` might show an error when you try to set an empty passphrase, but it will still make the change.
- (See [this StackExchange answer](https://unix.stackexchange.com/a/379373) for more information.)
- Note: The error shows only if you **do not** have graphical pinentry installed.
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/u2f-proxy.md b/user/security-in-qubes/u2f-proxy.md
index 942c163ae..19cc656b0 100644
--- a/user/security-in-qubes/u2f-proxy.md
+++ b/user/security-in-qubes/u2f-proxy.md
@@ -2,134 +2,7 @@
lang: en
layout: doc
permalink: /doc/u2f-proxy/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/u2f-proxy.html
ref: 167
title: U2F proxy
----
-
-The [Qubes U2F Proxy](https://github.com/QubesOS/qubes-app-u2f) is a secure proxy intended to make use of U2F two-factor authentication devices with web browsers without exposing the browser to the full USB stack, not unlike the [USB keyboard and mouse proxies](/doc/usb/) implemented in Qubes.
-
-## What is U2F?
-
-[U2F](https://en.wikipedia.org/wiki/U2F), which stands for "Universal 2nd Factor", is a framework for authentication using hardware devices (U2F tokens) as "second factors", i.e. *what you have* as opposed to *what you know*, like a passphrase.
-This additional control provides [good protection](https://krebsonsecurity.com/2018/07/google-security-keys-neutralized-employee-phishing/) in cases in which the passphrase is stolen (e.g. by phishing or keylogging).
-While passphrase compromise may not be obvious to the user, a physical device that cannot be duplicated must be stolen to be used outside of the owner's control.
-Nonetheless, it is important to note at the outset that U2F cannot guarantee security when the host system is compromised (e.g. a malware-infected operating system under an adversary's control).
-
-The U2F specification defines protocols for multiple layers from USB to the browser API, and the whole stack is intended to be used with web applications (most commonly websites) in browsers.
-In most cases, tokens are USB dongles.
-The protocol is very simple, allowing the devices to store very little state inside (so the tokens may be reasonably cheap) while simultaneously authenticating a virtually unlimited number of services (so each person needs only one token, not one token per application).
-The user interface is usually limited to a single LED and a button that is pressed to confirm each transaction, so the devices themselves are also easy to use.
-
-Currently, the most common form of two-step authentication consists of a numeric code that the user manually types into a web application.
-These codes are typically generated by an app on the user's smartphone or sent via SMS.
-By now, it is well-known that this form of two-step authentication is vulnerable to phishing and man-in-the-middle attacks due to the fact that the application requesting the two-step authentication code is typically not itself authenticated by the user.
-(In other words, users can accidentally give their codes to attackers because they do not always know who is really requesting the code.) In the U2F model, by contrast, the browser ensures that the token receives valid information about the web application requesting authentication, so the token knows which application it is authenticating (for details, see [here](https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-overview-v1.2-ps-20170411.html#site-specific-public-private-key-pairs)).
-Nonetheless, [some attacks are still possible](https://www.wired.com/story/chrome-yubikey-phishing-webusb/) even with U2F (more on this below).
-
-## The Qubes approach to U2F
-
-In a conventional setup, web browsers and the USB stack (to which the U2F token is connected) are all running in the same monolithic OS.
-Since the U2F model assumes that the browser is trustworthy, any browser in the OS is able to access any key stored on the U2F token.
-The user has no way to know which keys have been accessed by which browsers for which services.
-If any of the browsers are compromised, it should be assumed that all of the token's keys have been compromised.
-(This problem can be mitigated, however, if the U2F device has a special display to show the user what's being authenticated.) Moreover, since the USB stack is in the same monolithic OS, the system is vulnerable to attacks like [BadUSB](https://www.blackhat.com/us-14/briefings.html#badusb-on-accessories-that-turn-evil).
-
-In Qubes OS, by contrast, it is possible to securely compartmentalise the browser in one qube and the USB stack in another so that they are always kept separate from each other.
-The Qubes U2F Proxy then allows the token connected to the USB stack in one qube to communicate with the browser in a separate qube.
-We operate under the assumption that the USB stack is untrusted from the point of view of the browser and also that the browser is not to be trusted blindly by the token.
-Therefore, the token is never in the same qube as the browser.
-Our proxy forwards only the data necessary to actually perform the authentication, leaving all unnecessary data out, so it won't become a vector of attack.
-This is depicted in the diagram below (click for full size).
-
-[](/attachment/doc/u2f.svg)
-
-The Qubes U2F Proxy has two parts: the frontend and the backend.
-The frontend runs in the same qube as the browser and presents a fake USB-like HID device using `uhid`.
-The backend runs in `sys-usb` and behaves like a browser.
-This is done using the `u2flib_host` reference library.
-All of our code was written in Python.
-The standard [qrexec](/doc/qrexec3/) policy is responsible for directing calls to the appropriate domains.
-
-The `vault` qube with a dashed line in the bottom portion of the diagram depicts future work in which we plan to implement the Qubes U2F Proxy with a software token in an isolated qube rather than a physical hardware token.
-This is similar to the manner in which [Split GPG](/doc/split-gpg/) allows us to emulate the smart card model without physical smart cards.
-
-One very important assumption of U2F is that the browser verifies every request sent to the U2F token --- in particular, that the web application sending an authentication request matches the application that would be authenticated by answering that request (in order to prevent, e.g., a phishing site from sending an authentication request for your bank's site).
-With the WebUSB feature in Chrome, however, a malicious website can [bypass](https://www.wired.com/story/chrome-yubikey-phishing-webusb/) this safeguard by connecting directly to the token instead of using the browser's U2F API.
-
-The Qubes U2F Proxy also prevents this class of attacks by implementing an additional verification layer.
-This verification layer allows you to enforce, for example, that the web browser in your `twitter` qube can only access the U2F key associated with `https://twitter.com`.
-This means that if anything in your `twitter` qube were compromised --- the browser or even the OS itself --- it would still not be able to access the U2F keys on your token for any other websites or services, like your email and bank accounts.
-This is another significant security advantage over monolithic systems.
-(For details and instructions, see the [Advanced usage](#advanced-usage-per-qube-key-access) section below.)
-
-For even more protection, you can combine this with the [Qubes firewall](/doc/firewall/) to ensure, for example, that the browser in your `banking` qube accesses only one website (your bank's website).
-By configuring the Qubes firewall to prevent your `banking` qube from accessing any other websites, you reduce the risk of another website compromising the browser in an attempt to bypass U2F authentication.
-
-## Installation
-
-These instructions assume that there is a `sys-usb` qube that holds the USB stack, which is the default configuration in most Qubes OS installations.
-
-In dom0:
-
-```
-$ sudo qubes-dom0-update qubes-u2f-dom0
-$ qvm-service --enable work qubes-u2f-proxy
-```
-
-The above assumes a `work` qube in which you would like to enable u2f. Repeat the `qvm-service` command for all qubes that should have the proxy enabled. Alternatively, you can add `qubes-u2f-proxy` in VM settings -> Services in the Qube Manager of each qube you would like to enable the service.
-
-In Fedora templates:
-
-```
-$ sudo dnf install qubes-u2f
-```
-
-In Debian templates:
-
-```
-$ sudo apt install qubes-u2f
-```
-
-As usual with software updates, shut down the templates after installation, then restart `sys-usb` and all qubes that use the proxy.
-After that, you may use your U2F token (but see [Browser support](#template-and-browser-support) below).
-
-## Advanced usage: per-qube key access
-
-If you are using Qubes 4.0, you can further compartmentalise your U2F keys by restricting each qube's access to specific keys.
-For example, you could make it so that your `twitter` qube (and, therefore, all web browsers in your `twitter` qube) can access only the key on your U2F token for `https://twitter.com`, regardless of whether any of the web browsers in your `twitter` qube or the `twitter` qube itself are compromised.
-If your `twitter` qube makes an authentication request for your bank website, it will be denied at the Qubes policy level.
-
-To enable this, create a file in dom0 named `/etc/qubes-rpc/policy/policy.RegisterArgument+u2f.Authenticate` with the following content:
-
-```
-sys-usb @anyvm allow,target=dom0
-```
-
-Next, empty the contents of `/etc/qubes-rpc/policy/u2f.Authenticate` so that it is a blank file.
-Do not delete the file itself.
-(If you do, the default file will be recreated the next time you update, so it will no longer be empty.) Finally, follow your web application's instructions to enroll your token and use it as usual.
-(This enrollment process depends on the web application and is in no way specific to Qubes U2F.)
-
-The default model is to allow a qube to access all and only the keys that were enrolled by that qube.
-For example, if your `banking` qube enrolls your banking key, and your `twitter` qube enrolls your Twitter key, then your `banking` qube will have access to your banking key but not your Twitter key, and your `twitter` qube will have access to your Twitter key but not your banking key.
-
-## Non-default USB qube name
-
-If your USB qube is named differently than `sys-usb`, then do the following in the appropriate template(s):
-
-```
-systemctl enable qubes-u2fproxy@USB_QUBE.service
-systemctl disable qubes-u2fproxy@sys-usb.service
-```
-
-Replace `USB_QUBE` with the actual USB qube name.
-
-Do not forget to change the sys-usb qube name in the policy `/etc/qubes-rpc/policy/u2f.Authenticate`.
-
-## Template and browser support
-
-The large number of possible combinations of template (Fedora 27, 28; Debian 8, 9) and browser (multiple Google Chrome versions, multiple Chromium versions, multiple Firefox versions) made it impractical for us to test every combination that users are likely to attempt with the Qubes U2F Proxy.
-In some cases, you may be the first person to try a particular combination.
-Consequently (and as with any new feature), users will inevitably encounter bugs.
-We ask for your patience and understanding in this regard.
-As always, please [report any bugs you encounter](/doc/issue-tracking/).
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/vm-sudo.md b/user/security-in-qubes/vm-sudo.md
index e456d5e72..ea26a2472 100644
--- a/user/security-in-qubes/vm-sudo.md
+++ b/user/security-in-qubes/vm-sudo.md
@@ -6,184 +6,7 @@ redirect_from:
- /en/doc/vm-sudo/
- /doc/VMSudo/
- /wiki/VMSudo/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/vm-sudo.html
ref: 165
title: Passwordless root access in qubes
----
-
-Background (`/etc/sudoers.d/qubes` in VM):
-
-```
-user ALL=(ALL) NOPASSWD: ALL
-
-# WTF?! Have you lost your mind?!
-#
-# In Qubes VMs there is no point in isolating the root account from
-# the user account. This is because all the user data is already
-# accessible from the user account, so there is no direct benefit for
-# the attacker if she could escalate to root (there is even no benefit
-# in trying to install some persistent rootkits, as the VM's root
-# filesystem modifications are lost upon each start of a VM).
-#
-# One might argue that some hypothetical attacks against the
-# hypervisor or the few daemons/backends in Dom0 (so VM escape
-# attacks) most likely would require root access in the VM to trigger
-# the attack.
-#
-# That's true, but mere existence of such a bug in the hypervisor or
-# Dom0 that could be exploited by a malicious VM, no matter whether
-# requiring user, root, or even kernel access in the VM, would be
-# FATAL. In such situation (if there was such a bug in Xen) there
-# really is no comforting that: "oh, but the mitigating factor was
-# that the attacker needed root in VM!" We're not M$, and we're not
-# gonna BS our users that there are mitigating factors in that case,
-# and for sure, root/user isolation is not a mitigating factor.
-#
-# Because, really, if somebody could find and exploit a bug in the Xen
-# hypervisor -- as of 2016, there have been only three publicly disclosed
-# exploitable bugs in the Xen hypervisor from a VM -- then it would be
-# highly unlikely if that person couldn't also found a user-to-root
-# escalation in VM (which as we know from history of UNIX/Linux
-# happens all the time).
-#
-# At the same time allowing for easy user-to-root escalation in a VM
-# is simply convenient for users, especially for update installation.
-#
-# Currently this still doesn't work as expected, because some idotic
-# piece of software called PolKit uses own set of policies. We're
-# planning to address this in Beta 2. (Why PolKit is an idiocy? Do a
-# simple experiment: start 'xinput test' in one xterm, running as
-# user, then open some app that uses PolKit and asks for root
-# password, e.g. gpk-update-viewer -- observe how all the keystrokes
-# with root password you enter into the "secure" PolKit dialog box can
-# be seen by the xinput program...)
-#
-# joanna.
-```
-
-Below is a complete list of configuration made according to the above statement, with (not necessary complete) list of mechanisms depending on each of them:
-
-1. sudo (`/etc/sudoers.d/qubes`):
-
- ```
- user ALL=(ALL) NOPASSWD: ALL
- (...)
- ```
-
- - Easy user -> root access (main option for the user).
- - `qvm-usb` (not really working, as of R2).
-
-2. PolicyKit (`/etc/polkit-1/rules.d/00-qubes-allow-all.rules`):
-
- ```
- //allow any action, detailed reasoning in sudoers.d/qubes
- polkit.addRule(function(action,subject) { return polkit.Result.YES; });
- ```
-
- and `/etc/polkit-1/localauthority/50-local.d/qubes-allow-all.pkla`:
-
- ```
- [Qubes allow all]
- Identity=*
- Action=*
- ResultAny=yes
- ResultInactive=yes
- ResultActive=yes
- ```
-
- - NetworkManager configuration from normal user (`nm-applet`).
- - Updates installation (`gpk-update-viewer`).
- - User can use pkexec just like sudo Note: above is needed mostly because Qubes user GUI session isn't treated by PolicyKit/logind as "local" session because of the way in which X server and session is started.
- Perhaps we will address this issue in the future, but this is really low priority.
- Patches welcomed anyway.
-
-3. Empty root password:
- - Used for access to 'root' account from text console (`qvm-console-dispvm`) - the only way to access the VM when GUI isn't working.
- - Can be used for easy 'su -' from user to root.
-
-Replacing passwordless root access with Dom0 user prompt
---------------------------------------------------------
-
-While ITL supports the statement above, some Qubes users may wish to enable user/root isolation in VMs anyway.
-We do not support it in any of our packages, but of course nothing is preventing the user from modifying his or her own system.
-A list of steps to do so is provided here **without any guarantee of safety, accuracy, or completeness.
-Proceed at your own risk.
-Do not rely on this for extra security.**
-
-1. Adding Dom0 "VMAuth" service:
-
- ```
- [root@dom0 /]# echo "/usr/bin/echo 1" >/etc/qubes-rpc/qubes.VMAuth
- [root@dom0 /]# echo "@anyvm dom0 ask,default_target=dom0" \
- >/etc/qubes-rpc/policy/qubes.VMAuth
- [root@dom0 /]# chmod +x /etc/qubes-rpc/qubes.VMAuth
- ```
-
- (Note: any VMs you would like still to have passwordless root access (e.g. Templates) can be specified in the second file with "\ dom0 allow")
-
-2. Configuring Fedora template to prompt Dom0 for any authorization request:
- - In `/etc/pam.d/system-auth`, replace all lines beginning with "auth" with these lines:
-
- ```
- auth [success=1 default=ignore] pam_exec.so seteuid /usr/lib/qubes/qrexec-client-vm dom0 qubes.VMAuth /bin/grep -q ^1$
- auth requisite pam_deny.so
- auth required pam_permit.so
- ```
-
- - Require authentication for sudo.
- Replace the first line of `/etc/sudoers.d/qubes` with:
-
- ```
- user ALL=(ALL) ALL
- ```
-
- - Disable PolKit's default-allow behavior:
-
- ```
- [root@fedora-20-x64]# rm /etc/polkit-1/rules.d/00-qubes-allow-all.rules
- [root@fedora-20-x64]# rm /etc/polkit-1/localauthority/50-local.d/qubes-allow-all.pkla
- ```
-
-3. Configuring Debian/Whonix template to prompt Dom0 for any authorization request:
- - In `/etc/pam.d/common-auth`, replace all lines beginning with "auth" with these lines:
-
- ```
- auth [success=1 default=ignore] pam_exec.so seteuid /usr/lib/qubes/qrexec-client-vm dom0 qubes.VMAuth /bin/grep -q ^1$
- auth requisite pam_deny.so
- auth required pam_permit.so
- ```
-
- - Require authentication for sudo.
- Replace the first line of `/etc/sudoers.d/qubes` with:
-
- ```
- user ALL=(ALL) ALL
- ```
-
- - Disable PolKit's default-allow behavior:
-
- ```
- [root@debian-8]# rm /etc/polkit-1/rules.d/00-qubes-allow-all.rules
- [root@debian-8]# rm /etc/polkit-1/localauthority/50-local.d/qubes-allow-all.pkla
- ```
-
- - In `/etc/pam.d/su.qubes`, comment out this line near the bottom of the file:
-
- ```
- auth sufficient pam_permit.so
- ```
-
- - For Whonix, if prompts appear during boot, create `/etc/sudoers.d/zz99` and add these lines:
-
- ```
- ALL ALL=NOPASSWD: /usr/sbin/virt-what
- ALL ALL=NOPASSWD: /usr/sbin/service whonixcheck restart
- ALL ALL=NOPASSWD: /usr/sbin/service whonixcheck start
- ALL ALL=NOPASSWD: /usr/sbin/service whonixcheck stop
- ALL ALL=NOPASSWD: /usr/sbin/service whonixcheck status
- ```
-
-Dom0 passwordless root access
------------------------------
-
-There is also passwordless user->root access in dom0.
-As stated in comment in sudo configuration there (different one than VMs one), there is really no point in user/root isolation, because all the user data (and VM management interface) is already accessible from dom0 user level, so there is nothing more to get from dom0 root account.
+---
\ No newline at end of file
diff --git a/user/security-in-qubes/yubi-key.md b/user/security-in-qubes/yubi-key.md
index 041409d0d..74f7e458e 100644
--- a/user/security-in-qubes/yubi-key.md
+++ b/user/security-in-qubes/yubi-key.md
@@ -6,185 +6,7 @@ redirect_from:
- /doc/yubi-key/
- /en/doc/yubi-key/
- /doc/YubiKey/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/security-in-qubes/yubi-key.html
ref: 169
title: YubiKey
----
-
-You can use a YubiKey to enhance Qubes user authentication, for example to mitigate risk of someone snooping the password.
-This can also slightly improve security when you have a [USB keyboard](/doc/device-handling-security/#security-warning-on-usb-input-devices).
-
-## Challenge-response mode
-
-In this mode, your YubiKey will generate a response based on the secret key, and a random challenge (instead of counter).
-This means that it isn't possible to generate a response in advance even if someone gets access to your YubiKey.
-This makes it reasonably safe to use the same YubiKey for other services (also in challenge-response mode).
-
-Same as in the OTP case, you will need to set up your YubiKey, choose a separate password (other than your login password!) and apply the configuration.
-
-To use this mode you need to:
-
-1. Install yubikey personalization the packages in your template on which your USB VM is based.
-
- For Fedora.
-
- ```
- sudo dnf install ykpers yubikey-personalization-gui
- ```
-
- For Debian.
-
- ```
- sudo apt-get install yubikey-personalization yubikey-personalization-gui
- ```
-
- Shut down your template.
- Then, either reboot your USB VM (so changes inside the template take effect in your USB app qube) or install the packages inside your USB VM if you would like to avoid rebooting it.
-
-2. Configure your YubiKey for challenge-response `HMAC-SHA1` mode, for example [following this tutorial](https://www.yubico.com/products/services-software/personalization-tools/challenge-response/).
-
- On Debian, you can run the graphical user interface `yubikey-personalization-gui` from the command line.
-
- - Choose `configuration slot 2`.
- - It is recommended to enable `Require user input (button press)` but this is optional.
- - Note: Different from the above video, use the following settings select
- `HMAC-SHA1 mode`: `fixed 64 bit input`.
- - We will refer the `Secret Key (20 bytes hex)` as `AESKEY`.
- - It is recommended to keep a backup of your `AESKEY` in an offline VM used as a vault.
- - Consider keeping a backup of your `AESKEY` on paper and storing it in a safe place.
- - If you have multiple YubiKeys for backup purposes (in case a yubikey gets lost, stolen or breaks) you can write the same settings into other YubiKeys.
-
-3. Install [qubes-app-yubikey](https://github.com/QubesOS/qubes-app-yubikey) in dom0.
-
- ```
- sudo qubes-dom0-update qubes-yubikey-dom0
- ```
-
-4. Adjust the USB VM name in case you are using something other than the default
- `sys-usb` by editing `/etc/qubes/yk-keys/yk-vm` in dom0.
-
-5. Paste your `AESKEY` from step 2 into `/etc/qubes/yk-keys/yk-secret-key.hex` in dom0.
-
-6. Paste your hashed password (other than your standard Qubes password) into
-`/etc/qubes/yk-keys/yk-login-pass-hashed.hex` in dom0.
-
- You can calculate your hashed password using the following two commands.
- First run the following command to store your password in a temporary variable `password`.
- (This way your password will not leak to the terminal command history file.)
-
- ```
- read -r password
- ```
-
- Now run the following command to calculate your hashed password.
-
- ```
- echo -n "$password" | openssl dgst -sha1
- ```
-
-7. Edit `/etc/pam.d/login` in dom0, adding this line at the beginning:
-
- ```
- auth include yubikey
- ```
-
-8. Edit `/etc/pam.d/xscreensaver` (or appropriate file if you are using another screen locker program) in dom0, adding this line at the beginning:
-
- ```
- auth include yubikey
- ```
-
-9. Edit `/etc/pam.d/lightdm` (or appropriate file if you are using another display manager) in dom0, adding this line at the beginning:
-
- ```
- auth include yubikey
- ```
-
-### Usage
-
-When you want to unlock your screen...
-
-1) Plug YubiKey into USB slot.
-2) Enter password associated with YubiKey.
-3) Press Enter.
-4) If you configured so, YubiKey will request confirmation by pressing button on it (it will blink).
-
-When everything is ok, your screen will be unlocked.
-
-In any case you can still use your login password, but do it in a secure location where no one can snoop your password.
-
-### Mandatory YubiKey Login
-
-Edit `/etc/pam.d/yubikey` (or appropriate file if you are using other screen locker program) and remove `default=ignore` so the line looks like this.
-
-```
-auth [success=done] pam_exec.so expose_authtok quiet /usr/bin/yk-auth
-```
-
-## Locking the screen when YubiKey is removed
-
-You can setup your system to automatically lock the screen when you unplug your YubiKey.
-This will require creating a simple qrexec service which will expose the ability to lock the screen to your USB VM, and then adding a udev hook to actually call that service.
-
-In dom0:
-
-1. First configure the qrexec service.
- Create `/etc/qubes-rpc/custom.LockScreen` with a simple command to lock the screen.
- In the case of xscreensaver (used in Xfce) it would be:
-
- ```
- DISPLAY=:0 xscreensaver-command -lock
- ```
-
-2. Then make `/etc/qubes-rpc/custom.LockScreen` executable.
-
- ```
- sudo chmod +x /etc/qubes-rpc/custom.LockScreen
- ```
-
-3. Allow your USB VM to call that service.
- Assuming that it's named `sys-usb` it would require creating `/etc/qubes-rpc/policy/custom.LockScreen` with:
-
- ```
- sys-usb dom0 allow
- ```
-
-In your USB VM:
-
-3. Create udev hook.
- Store it in `/rw/config` to have it persist across VM restarts.
- For example name the file `/rw/config/yubikey.rules`.
- Add the following line:
-
- ```
- ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_SECURITY_TOKEN}=="1", RUN+="/usr/bin/qrexec-client-vm dom0 custom.LockScreen"
- ```
-
-4. Ensure that the udev hook is placed in the right place after VM restart.
- Append to `/rw/config/rc.local`:
-
- ```
- ln -s /rw/config/yubikey.rules /etc/udev/rules.d/
- udevadm control --reload
- ```
-
-5. Then make `/rw/config/rc.local` executable.
-
- ```
- sudo chmod +x /rw/config/rc.local
- ```
-
-6. For changes to take effect, you need to call this script manually for the first time.
-
- ```
- sudo /rw/config/rc.local
- ```
-
-If you use KDE, the command(s) in first step would be different:
-
-```
-# In the case of USB VM being autostarted, it will not have direct access to D-Bus
-# session bus, so find its address manually:
-kde_pid=`pidof kdeinit4`
-export `cat /proc/$kde_pid/environ|grep -ao 'DBUS_SESSION_BUS_ADDRESS=[[:graph:]]*'`
-qdbus org.freedesktop.ScreenSaver /ScreenSaver Lock
-```
+---
\ No newline at end of file
diff --git a/user/templates/debian/debian-upgrade.md b/user/templates/debian/debian-upgrade.md
index 12552f220..ee025f396 100644
--- a/user/templates/debian/debian-upgrade.md
+++ b/user/templates/debian/debian-upgrade.md
@@ -11,222 +11,7 @@ redirect_from:
- /en/doc/debian-template-upgrade-8/
- /doc/DebianTemplateUpgrade8/
- /wiki/DebianTemplateUpgrade8/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/templates/debian/debian-upgrade.html
ref: 133
title: How to upgrade a Debian template in-place
----
-
-
-
- Warning: This page is intended for advanced users only. Most users
- seeking to upgrade should instead install a new Debian template.
- Learn more about the two options here.
-
-
-
-This page provides instructions for performing an in-place upgrade of an
-installed [Debian Template](/doc/templates/debian/). If you wish to install a
-new, unmodified Debian template instead of upgrading a template that is already
-installed in your system, please see the [Debian
-Template](/doc/templates/debian/) page instead. ([Learn more about the two
-options.](/doc/templates/debian/#upgrading)) In general, upgrading a Debian
-template follows the same process as [upgrading a native Debian
-system](https://wiki.debian.org/DebianUpgrade).
-
-## Summary instructions for Debian templates
-
-**Important:** The prompt on each line indicates where each command should be
-entered: `dom0`, `debian-`, or `debian-`, where `` is the Debian
-version number *from* which you are upgrading, and `` is the Debian
-version number *to* which you are upgrading. The instructions may differ for
-certain releases. See [release-specific notes](#release-specific-notes) for any
-instructions specific to your particular release.
-
-```
-[user@dom0 ~]$ qvm-clone debian- debian-
-[user@dom0 ~]$ qvm-run -a debian- gnome-terminal
-[user@debian- ~]$ sudo sed -i 's///g' /etc/apt/sources.list
-[user@debian- ~]$ sudo sed -i 's///g' /etc/apt/sources.list.d/qubes-r4.list
-[user@debian- ~]$ sudo apt update
-[user@debian- ~]$ sudo apt upgrade
-[user@debian- ~]$ sudo apt dist-upgrade
-[user@dom0 ~]$ qvm-shutdown debian-
-```
-
-**Recommended:** [Switch everything that was set to the old template to the new template.](/doc/templates/#switching)
-
-## Detailed instructions for Debian templates
-
-These instructions will show you how to upgrade Debian templates. The same
-general procedure may be used to upgrade any template based on the standard
-Debian template.
-
-**Important:** The prompt on each line indicates where each command should be
-entered: `dom0`, `debian-`, or `debian-`, where `` is the Debian
-version number *from* which you are upgrading, and `` is the Debian
-version number *to* which you are upgrading. The instructions may differ for
-certain releases. See [release-specific notes](#release-specific-notes) for any
-instructions specific to your particular release.
-
-1. Ensure the existing template is not running.
-
- ```
- [user@dom0 ~]$ qvm-shutdown debian-
- ```
-
-2. Clone the existing template and start a terminal in the new template.
-
- ```
- [user@dom0 ~]$ qvm-clone debian- debian-
- [user@dom0 ~]$ qvm-run -a debian- gnome-terminal
- ```
-
-3. Update your `apt` repositories to use the new release's code name instead of
- the old release's code name. (This can be done manually with a text editor,
- but `sed` can be used to automatically update the files.)
-
- ```
- [user@debian- ~]$ sudo sed -i 's///g' /etc/apt/sources.list
- [user@debian- ~]$ sudo sed -i 's///g' /etc/apt/sources.list.d/qubes-r4.list
- ```
-
-4. Update the package lists and upgrade. During the process, it may prompt you
- to overwrite the file `qubes-r4.list`. You should overwrite this file.
-
- ```
- [user@debian- ~]$ sudo apt update
- [user@debian- ~]$ sudo apt upgrade
- [user@debian- ~]$ sudo apt dist-upgrade
- ```
-
-5. (Optional) Remove unnecessary packages that were previously installed.
-
- ```
- [user@debian- ~]$ sudo apt-get autoremove
- ```
-
-6. (Optional) Clean cached packages from `/var/cache/apt`.
-
- ```
- [user@debian- ~]$ sudo apt-get clean
- ```
-
-7. (Optional) Trim the new template. (This should [no longer be
- necessary](/doc/templates/#important-notes), but it does not hurt. Some
- users have [reported](https://github.com/QubesOS/qubes-issues/issues/5055)
- that it makes a difference.)
-
- ```
- [user@debian- ~]$ sudo fstrim -av
- [user@dom0 ~]$ qvm-shutdown debian-
- [user@dom0 ~]$ qvm-start debian-
- [user@debian- ~]$ sudo fstrim -av
- ```
-
-8. Shut down the new template.
-
- ```
- [user@dom0 ~]$ qvm-shutdown debian-
- ```
-
-9. (Recommended) [Switch everything that was set to the old template to the new
- template.](/doc/templates/#switching)
-
-10. (Optional) Make the new template the global default.
-
- ```
- [user@dom0 ~]$ qubes-prefs --set default_template debian-
- ```
-
-11. (Optional) [Uninstall the old template.](/doc/templates/#uninstalling) Make
- sure that the template you're uninstalling is the old one, not the new one!
-
-## Standalones
-
-The procedure for upgrading a Debian [standalone](/doc/standalone-and-hvm/) is
-the same as for a template.
-
-## Release-specific notes
-
-This section contains notes about upgrading to specific releases.
-
-### Debian 11 ("Bullseye")
-
-Please see [Debian's Bullseye upgrade
-instructions](https://www.debian.org/releases/bullseye/amd64/release-notes/ch-upgrading.en.html).
-In particular: for APT source lines referencing the security archive, the
-format has changed slightly along with the release name, going from
-buster/updates to bullseye-security; see [Section 5.1.2, “Changed security
-archive
-layout”](https://www.debian.org/releases/stable/mips64el/release-notes/ch-information.en.html#security-archive).
-
-This means that, when upgrading from Buster to Bullseye, an additional `sed`
-command is required:
-
-```
-[user@dom0 ~]$ qvm-clone debian-10 debian-11
-[user@dom0 ~]$ qvm-run -a debian-11 gnome-terminal
-[user@debian- ~]$ sudo sed -i 's/buster/bullseye/g' /etc/apt/sources.list
-[user@debian- ~]$ sudo sed -i 's/debian-security bullseye\/updates/debian-security bullseye-security/g' /etc/apt/sources.list
-[user@debian- ~]$ sudo sed -i 's/buster/bullseye/g' /etc/apt/sources.list.d/qubes-r4.list
-[user@debian- ~]$ sudo apt update
-[user@debian- ~]$ sudo apt upgrade
-[user@debian- ~]$ sudo apt dist-upgrade
-[user@dom0 ~]$ qvm-shutdown debian-11
-```
-
-### Debian 10 ("Buster")
-
-Please see [Debian's Buster upgrade
-instructions](https://www.debian.org/releases/buster/amd64/release-notes/ch-upgrading.en.html).
-
-### Debian 9 ("Stretch")
-
-* The upgrade process may prompt you to overwrite two files: `qubes-r4.list`
- and `pulse/client.conf`. `qubes-r4.list` can be overwritten, but
- `pulse/client.conf` must be left as the currently-installed version.
-
-* If sound is not working, you may need to enable the Qubes testing repository
- to get the testing version of `qubes-gui-agent`. This can be done by editing
- the `/etc/apt/sources.list.d/qubes-r4.list` file and uncommenting the `Qubes
- Updates Candidates` repo.
-
-* User-initiated updates/upgrades may not run when a template first starts.
- This is due to a new Debian config setting that attempts to update
- automatically; it should be disabled with `sudo systemctl disable
- apt-daily.{service,timer}`.
-
-Relevant discussions:
-
-* [Stretch Template Installation](https://groups.google.com/forum/#!topicsearchin/qubes-devel/debian$20stretch/qubes-devel/4rdayBF_UTc)
-* [Stretch availability in 3.2](https://groups.google.com/forum/#!topicsearchin/qubes-devel/debian$20stretch/qubes-devel/cekPfBqQMOI)
-* [Fixing sound in Debian Stretch](https://groups.google.com/forum/#!topic/qubes-users/JddCE54GFiU)
-* [User apt commands blocked on startup](https://github.com/QubesOS/qubes-issues/issues/2621)
-
-Also see [Debian's Stretch upgrade
-instructions](https://www.debian.org/releases/stretch/amd64/release-notes/ch-upgrading.en.html).
-
-### Debian 8 ("Jessie")
-
-Please see [Debian's Jessie upgrade
-instructions](https://www.debian.org/releases/jessie/amd64/release-notes/ch-upgrading.en.html).
-
-### End-of-life (EOL) releases
-
-We strongly recommend against using any Debian release that has reached
-[end-of-life
-(EOL)](https://wiki.debian.org/DebianReleases#Production_Releases).
-
-## Additional information
-
-* Please note that, if you installed packages from one of the
- [testing](/doc/testing/) repositories, you must make sure that the repository
- is enabled in `/etc/apt/sources.list.d/qubes-r4.list` before attempting the
- upgrade. Otherwise, your upgrade will
- [break](https://github.com/QubesOS/qubes-issues/issues/2418).
-
-* By default, Qubes uses code names in the `apt` sources files, although the
- templates are referred to by release number. Check the code names for the
- templates, and ensure you are aware of any changes you have made in the
- repository definitions.
+---
\ No newline at end of file
diff --git a/user/templates/debian/debian.md b/user/templates/debian/debian.md
index 32ef26fb0..b8b9df770 100644
--- a/user/templates/debian/debian.md
+++ b/user/templates/debian/debian.md
@@ -7,105 +7,7 @@ redirect_from:
- /en/doc/templates/debian/
- /doc/Templates/Debian/
- /wiki/Templates/Debian/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/templates/debian/debian.html
ref: 134
title: Debian templates
----
-
-The Debian [template](/doc/templates/) is an officially [supported](/doc/supported-releases/#templates) template in Qubes OS.
-This page is about the standard (or "full") Debian template.
-For the minimal version, please see the [Minimal templates](/doc/templates/minimal/) page.
-There is also a [Qubes page on the Debian Wiki](https://wiki.debian.org/Qubes).
-
-## Installing
-
-To [install](/doc/templates/#installing) a specific Debian template that is not currently installed in your system, use the following command in dom0:
-
-```
-$ sudo qubes-dom0-update qubes-template-debian-XX
-```
-
- (Replace `XX` with the Debian version number of the template you wish to install.)
-
-To reinstall a Debian template that is already installed in your system, see [How to Reinstall a template](/doc/reinstall-template/).
-
-## After Installing
-
-After installing a fresh Debian template, we recommend performing the following steps:
-
-1. [Update the template](/doc/software-update-vm/).
-
-2. [Switch any app qubes that are based on the old template to the new one](/doc/templates/#switching).
-
-3. If desired, [uninstall the old template](/doc/templates/#uninstalling).
-
-## Installing software
-
-See [How to Install Software](/doc/how-to-install-software/).
-
-## Updating
-
-For routine daily updates within a given release, see [How to Update](/doc/how-to-update/).
-
-## Upgrading
-
-There are two ways to upgrade your template to a new Debian release:
-
-- **Recommended:** [Install a fresh template to replace the existing one.](#installing) **This option may be simpler for less experienced users.** After you install the new template, redo all desired template modifications and [switch everything that was set to the old template to the new template](/doc/templates/#switching). You may want to write down the modifications you make to your templates so that you remember what to redo on each fresh install. In the old Debian template, see `/var/log/dpkg.log` and `/var/log/apt/history.log` for logs of package manager actions.
-
-- **Advanced:** [Perform an in-place upgrade of an existing Debian template.](/doc/templates/debian/in-place-upgrade/) This option will preserve any modifications you've made to the template, **but it may be more complicated for less experienced users.**
-
-## Release-specific notes
-
-This section contains notes about specific Debian releases.
-
-### Debian 10
-
-Debian 10 (buster) - minimal:
-
-```
-[user@dom0 ~]$ sudo qubes-dom0-update --enablerepo=qubes-templates-itl qubes-template-debian-10-minimal
-```
-
-Debian 10 (buster) - stable:
-
-```
-[user@dom0 ~]$ sudo qubes-dom0-update --enablerepo=qubes-templates-itl qubes-template-debian-10
-```
-
-### Starting services
-
-The Debian way (generally) is to start daemons if they are installed.
-This means that if you install (say) ssh-server in a template, *all* the qubes that use that template will run a ssh server when they start. (They will, naturally, all have the same server key.) This may not be what you want.
-
-So be very careful when installing software in Templates - if the daemon spawns outbound connections then there is a serious security risk.
-
-In general, a reasonable approach would be, (using ssh as example):
-
-- Install the ssh service.
-- `systemctl stop ssh`
-- `systemctl disable ssh`
-- `systemctl mask ssh`
-- Close down template
-
-Now the ssh service will **NOT** start in qubes based on this template.
-
-Where you **DO** want the service to run, put this in `/rw/config/rc.local`:
-
-```
-systemctl unmask ssh
-systemctl start ssh
-```
-
-Don't forget to make the file executable.
-
-### Unattended Upgrades
-
-Some users have noticed that on upgrading to Stretch, the `unattended-upgrade` package is installed.
-
-This package is pulled in as part of a Recommend chain, and can be purged.
-
-The lesson is that you should carefully look at what is being installed to your system, particularly if you run `dist-upgrade`.
-
-### Package installation errors in Qubes 4.0
-
-If some packages throw installation errors, see [this guide.](/doc/vm-troubleshooting/#fixing-package-installation-errors)
+---
\ No newline at end of file
diff --git a/user/templates/fedora/fedora-upgrade.md b/user/templates/fedora/fedora-upgrade.md
index 2529e1dea..a47429a48 100644
--- a/user/templates/fedora/fedora-upgrade.md
+++ b/user/templates/fedora/fedora-upgrade.md
@@ -22,201 +22,7 @@ redirect_from:
- /doc/FedoraTemplateUpgrade28/
- /wiki/FedoraTemplateUpgrade28/
- /doc/template/fedora/upgrade-29-to-30/
+redirect_to: https://qubes-doc-rst.readthedocs.io/en/latest/user/templates/fedora/fedora-upgrade.html
ref: 137
title: How to upgrade a Fedora template in-place
----
-
-
-
- Warning: This page is intended for advanced users only. Most users seeking to upgrade should instead install a new Fedora template. Learn more about the two options here.
-
-
-This page provides instructions for performing an in-place upgrade of an installed [Fedora Template](/doc/templates/fedora/).
-If you wish to install a new, unmodified Fedora template instead of upgrading a template that is already installed in your system, please see the [Fedora Template](/doc/templates/fedora/) page instead. ([Learn more about the two options.](/doc/templates/fedora/#upgrading))
-
-## Summary instructions for standard Fedora templates
-
-**Note:** The prompt on each line indicates where each command should be entered: `dom0`, `fedora-`, or `fedora-`, where `` is the Fedora version number *from* which you are upgrading, and `` is the Fedora version number *to* which you are upgrading.
-
-```
-[user@dom0 ~]$ qvm-clone fedora- fedora-
-[user@dom0 ~]$ truncate -s 5GB /var/tmp/template-upgrade-cache.img
-[user@dom0 ~]$ qvm-run -a fedora- gnome-terminal
-[user@dom0 ~]$ dev=$(sudo losetup -f --show /var/tmp/template-upgrade-cache.img)
-[user@dom0 ~]$ qvm-block attach fedora- dom0:${dev##*/}
-[user@fedora- ~]$ sudo mkfs.ext4 /dev/xvdi
-[user@fedora- ~]$ sudo mount /dev/xvdi /mnt/removable
-[user@fedora- ~]$ sudo dnf clean all
-[user@fedora- ~]$ sudo dnf --releasever= --setopt=cachedir=/mnt/removable --best --allowerasing distro-sync
-[user@dom0 ~]$ qvm-shutdown fedora-
-[user@dom0 ~]$ sudo losetup -d $dev
-[user@dom0 ~]$ rm /var/tmp/template-upgrade-cache.img
-```
-
-**Recommended:** [Switch everything that was set to the old template to the new template.](/doc/templates/#switching)
-
-## Detailed instructions for standard Fedora templates
-
-These instructions will show you how to upgrade the standard Fedora template.
-The same general procedure may be used to upgrade any template based on the standard Fedora template.
-
-**Note:** The prompt on each line indicates where each command should be entered: `dom0`, `fedora-`, or `fedora-`, where `` is the Fedora version number *from* which you are upgrading, and `` is the Fedora version number *to* which you are upgrading.
-
-1. Ensure the existing template is not running.
-
- ```
- [user@dom0 ~]$ qvm-shutdown fedora-
- ```
-
-2. Clone the existing template and start a terminal in the new template.
-
- ```
- [user@dom0 ~]$ qvm-clone fedora- fedora-
- [user@dom0 ~]$ qvm-run -a fedora- gnome-terminal
- ```
-
-3. Attempt the upgrade process in the new template.
-
- ```
- [user@fedora- ~]$ sudo dnf clean all
- [user@fedora- ~]$ sudo dnf --releasever= distro-sync --best --allowerasing
- ```
-
- **Note:** `dnf` might ask you to approve importing a new package signing key.
- For example, you might see a prompt like this one:
-
- ```
- warning: /mnt/removable/updates-0b4cc238d1aa4ffe/packages/example-package.fc.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID XXXXXXXX: NOKEY
- Importing GPG key 0xXXXXXXXX:
- Userid : "Fedora () @fedoraproject.org>"
- Fingerprint: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
- From : /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-