原创,转载请注明出处。【同知乎】
(相关资料图)
使用虚拟机造成的资源开销,远比操作系统级虚拟化大。
如果需要一个与宿主隔离的软件环境(例如sandbox),而不需要虚拟硬件,操作系统级虚拟化是最好的方案。
必备podman, ssh-client
隔离图形环境需要有Xephyr
拉取一个image,在此以fedora-toolbox为例
$ podman pull fedora-toolbox
NOTE: 某些发行版中的容器需要--cap-add SYS_CHROOT才能使sshd正常工作。
创建并启动容器
$ podman run -idt --name <ContainerName> -p <SSH_Port>:22 fedora-toolbox /bin/bash
可以将一个宿主系统下的目录挂载到容器中作为家目录,而不用担心删除容器时忘记备份而造成资料丢失。
如果需要将宿主机上的目录挂载到容器中,则有:
$ podman run -idt --name <ContainerName> -p <SSH_Port>:22 -v <HostDir>:<ContainerDir>[:ro|rw]:z fedora-toolbox /bin/bash
挂载点默认为:rw读写,标签:z使SELinux放行容器中的程序对挂载点的访问。
NOTE: 如果有宿主系统目录以rw挂载到容器中,务必谨慎执行危险命令(诸如rm -rf /*)
$ podman attach <ContainerName>
进入容器开始以下环节。
容器中同样可以配置dnf的仓库镜像,这里不作讲述。
用dnf install安装你需要的软件包
# 必需
openssh-server
# Java 17
java-17-openjdk-devel
# Wine
wine
# 图形环境,桌面
xinit dbus-x11 xfwm4 xfce4-panel xfce4-settings xfce4-terminal xfce4-session xfdesktop
# 电科人狂喜
verilator yosys gtkwave
生成SSH守护进程需要的Key,接下来将用到其中的ED25519公钥。
# ssh-keygen -A
修改/etc/ssh/sshd_config,和配置服务器一样,按你的需求来。
例如:
PubkeyAuthentication yes
PasswordAuthentication no
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
因为通过以上步骤创建的容器在attach后会启动容器root用户的bash,所以用/root/.bashrc作为容器的rc。
追加
# 必需
rm -rf /tmp/.* rm -rf /tmp/* /sbin/sshd
# 如果需要图形环境
rm -rf /run/dbus mkdir /run/dbus dbus-daemon --system
$ podman commit <ContainerName>
现在,podman images会显示容器在提交后的image id。
挂载点不会被提交。
要从image恢复:
$ podman stop <ContainerName>
$ podman rm <ContainerName>
$ podman run -idt ... ... <ImageId> /bin/bash
# useradd <UserName>
# su <UserName>
$ mkdir ~/.ssh
$ cd ~/.ssh
$ ssh-keygen -t ed25519
$ mv <PublicKey>.pub .authorized_keys
$ podman cp <ContainerName>:/home/<UserName>/.ssh/<PrivateKey> ~/.ssh/
上述步骤中已经有端口<SSH_Port>映射到容器中的22端口,通过ssh连接即可
$ ssh -i ~/.ssh/<PrivateKey> -p <SSH_Port> <UserName>@localhost
如果需要X环境,则
$ Xephyr -no-host-grab -resizeable +iglx :10
$ DISPLAY=:10 ssh -Y -i ~/.ssh/<PrivateKey> -p <SSH_Port> <UserName>@localhost xfce4-session
至此,这个容器里的工作空间基本够用了。
但是
在宿主系统上,下面的命令默认监听127.0.0.1:4713,可不给出port和listen参数
$ pactl load-module module-native-protocol-tcp port=<Port> listen=<IP>
需要走一个SSH端口映射
-R <Port>:127.0.0.1:<Port>
在容器里,设置环境变量PULSE_SERVER=127.0.0.1:<Port>
在容器里用paplay播放一个wav进行测试。
现在,可以往你的容器里塞东西了,比如IntelliJ或者VSCode。
可以酌情在容器里做些具备实验风险的事情,而不会毁掉你的宿主系统。
Docker和Podman默认赋予网络访问权能给新容器。
你可以在宿主和容器中写一系列脚本(包括.bashrc)使启动容器到加载环境更方便快捷。我的容器已经能够随宿主桌面启动。
例如,宿主在挂载点下建立一个目录D,直到容器删除D才进行ssh连接、X远程会话、Pulseaudio连接;容器则在sshd启动后删除D。
在一番调整后,这是我的容器的样子。
关键词:
Copyright 2015-2022 中公礼仪网 版权所有 备案号:沪ICP备2022005074号-18 联系邮箱:5855973@qq.com