Simplify and make the fun of gnu/linux at your fingertips.
English | 简体中文
This is a lite doc.
It's recommended that you read the full documentation.
v1.4989.x may be the last version of edition 2021.
Note: These documents are temporarily unavailable.
The new version with improved multilingual support will be released before 2023.
language | note | contributors |
---|---|---|
English | Making the future better together. | * |
中文 | 好耶!是完整的文档 <(=o ゜ ▽ ゜)o☆ | 2moe |
Deutsch | Eine Hand wäscht die andere. | * |
español | Quien siembra vientos, recoge tempestades. | * |
français | Si bien dire vaut, moult bien faire passe tout. | * |
ру́сский | Наша величайшая слава не в отсутствии падений, но в том, чтобы каждый раз вновь подниматься | * |
português | Estando madura a pera e antes que ela apodreça, vem quem bem a mereça. | * |
čeština | Kdo chce kam, pomozme mu tam. | * |
日本語 | 君日本語本当上手(<(=  ̄ y▽  ̄)╭ 笑) | Σ<(=っ °Д °)っ |
한국어 | 성공한 사람보다는 가치 있는 사람이 되라. | * |
正體中文-臺灣 | 裡面有“好康”的東西?是什麼呀?是新書哦? | * |
繁體中文-香港 | 裏面嘅嘢唔系粵語。For example, “我喜歡它”唔會被 converted to “我鍾意佢”。 | * |
Q: Do I have to use a script to install it?
A: No! No need at all.
Q: Oh god! This stupid thing is writing in my ~/.local/share directory again. It's so annoying. How do I stop it?
A: You can use a docker container with tmoe pre-installed. It will create the data files inside the container, not in the host.
xfce | kde | mate | lxqt | cutefish | lxde | |
---|---|---|---|---|---|---|
alpine | amd64,arm64 | amd64,arm64 | 386,amd64,arm64,armv7 | None | None | None |
arch | amd64,arm64,armv7 | amd64,arm64 | amd64,arm64 | None | amd64,arm64,armv7 | None |
debian | amd64,arm64 | amd64,arm64 | amd64,arm64 | None | None | 386,armv7 |
fedora | amd64,arm64 | amd64,arm64 | amd64,arm64 | amd64,arm64 | None | None |
kali | amd64,arm64,armv7 | None | None | None | None | None |
manjaro | amd64,arm64 | None | None | None | None | None |
ubuntu | amd64,arm64 | amd64,arm64,armv7 | amd64,arm64 | amd64,arm64 | None | None |
style 1: cake233/alpine-mate-386, cake233/debian-lxde-armv7
style 2: cake233/xfce:kali, cake233/kde:fedora
Note: cake233/alpine-mate-386 = --platform=linux/386 cake233/mate:alpine
Click ▶️ to expand
If you want to install a desktop on a linux server, then I would advise you not to do anything stupid.
Just kidding. It probably wouldn't do much good to do so, but you might really consider tmoe
gui container.
Assuming your host is a debian-based distribution (e.g. ubuntu, mint or kali)
install docker
sudo apt update
sudo apt install docker.io
WHOAMI=$(id -un)
sudo adduser $WHOAMI docker
# then reboot
test alpine
docker run \
-it \
--rm \
--shm-size=512M \
-p 36081:36080 \
cake233/xfce:alpine
Run tmoe
to select locale, then choose tools, and then exit.
Run novnc
,then open your browser on your host, and type "http://your_ip_address:36081"
Note: Exposing it to the public network is extremely risky, so consider using the nginx reverse proxy and adding an extra layer of authentication to it.
If you have any doubts about nginx + novnc, then please go to github disscussion.
In addition to novnc + browser, you can also use the vnc client.
docker run \
-it \
--shm-size=1G \
-p 5903:5902 \
-u 1000:1000 \
--name uuu-mate \
cake233/mate:ubuntu
Run su -
, and type the root password: root
Run adduser yourusername
to create a new user.
Run adduser yourusername sudo
to add yourusername to group sudo.
Run startvnc
, then open the vnc client and type "your_ip_address:5903"
The next section describes how desktop users can use these GUI containers.
It is probably a mistake to use docker containers as virtual machines.
In fact, for GUI desktop containers, I recommend using systemd-nspawn rather than docker.
The following is only a basic overview, additional changes are required. Note: Some fantastic projects, such as x11docker, can assist you in improving your performance.
For environments where xorg is the host: In the host, give the current user xhost rights.
xhost +SI:localuser:$(id -un)
_UID="$(id -u)"
_GID="$(id -g)"
docker run \
-it \
--rm \
-u $_UID:$_GID \
--shm-size=1G \
-v $XDG_RUNTIME_DIR/pulse/native:/run/pulse.sock \
-e PULSE_SERVER=unix:/run/pulse.sock \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
cake233/kde:ubuntu
Create a user with the same name as the host user within the container.
Finally, start dbus-daemon and run /etc/X11/xinit/Xsession
For wayland host environment, you will need to do more with docker.
Set the WAYLAND_DISPLAY variable:
-e WAYLAND_DISPLAY=$WAYLAND_DISPLAY
Set the XDG_RUNTIME_DIR variable:
If UID is 1000, then default is /run/user/1000.
-e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
binding the wayland socket of host
-v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY
Set other environment variables related to wayland
-e QT_QPA_PLATFORM=wayland
Note: If you want to run GUI app in a container or sandbox, you should consider using a mature solution like flatpak.
Some of the nogui containers associated with tmoe are still considered separate projects at this time.
This is due to the fact that they do not come pre-installed with tmoe tools.
If you don't want a desktop, simply replace xfce/kde/mate with zsh and you're done.
docker volume create zsh
docker run \
-it \
--name zsh \
-v zsh:/shared_dir \
cake233/zsh:kali
Q: How do I run containers of other architectures?
A:
Click ▶️ to expand
install qemu-user-static
sudo apt install binfmt-support qemu-user-static
Take rust cross-compilation as an example.
Note: The following containers are updated twice a week.
docker-hub repo: cake233/rust
nightly(gnu): amd64, arm64, armv7, riscv64, ppc64le, s390x, mips64le
nightly(musl): amd64, arm64
Note: I prefer to use cross-rs instead of the example below for rust cross-compilation.
_UID="$(id -u)"
_GID="$(id -g)"
mkdir -p tmp
# This step can be skipped if the hello project already exists locally.
docker run \
-t \
--rm \
-u "$_UID":"$_GID" \
-v "$PWD"/tmp:/app \
-w /app \
cake233/rust-riscv64 \
cargo new hello
# build
docker run \
-t \
--rm \
-u "$_UID":"$_GID" \
-v "$PWD"/tmp/hello:/app \
-w /app \
cake233/rust-riscv64 \
cargo b --release
# check file
FILE="tmp/hello/target/release/hello"
file "$FILE"
# output: tmp/hello/target/release/hello: ELF 64-bit LSB pie executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1 ...
cat >>tmp/hello/Cargo.toml<<-'EOF'
[profile.release]
lto = "fat"
debug = false
strip = true
panic = "abort"
opt-level = "z"
EOF
docker run \
-t \
--rm \
-u "$_UID":"$_GID" \
-v "$PWD"/tmp/hello:/app \
-w /app \
--platform linux/arm64 \
cake233/rust:musl \
cargo b --release
file "$FILE"
# output: tmp/hello/target/release/hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped
If you can't, or don't want to use docker, then you can install it locally.
method | tool | condition | command |
---|---|---|---|
cargo | rustc nightlytmm (edition 2022) will be released before 2023.) |
cargo install tmm |
|
2 | curl | you have curl installed, and can access github |
. <(curl -L git.io/linux.sh) |
3 | curl | you cannot access github | . <(curl -L gitee.com/mo2/linux/raw/2/2) |
4 | curl | none of the above methods can be installed | curl -Lo l l.tmoe.me; sh l |
Please report an issue.
You can use čeština, Deutsch, español, français, português, ру́сский & 中文, etc.
If you want to discuss topics unrelated to this project, then please go to github discussions.
You can enjoy gnome or other desktops on arm64 device.
chapter | introduction | file |
---|---|---|
prologue.part A | Some short notes | Readme.md |
prologue.part B | Facing History, venturing into the future | share/doc/en/readme.md |
1 | Container Installation and Configuration | share/doc/en/1.md |
2 | Error handling | share/doc/en/2.md |
etc... | * | * |