我正在尝试构建一个流程容器。容器会触发其他程序。例如 - 使用 '&' 启动运行后台任务的 bash 脚本。
我所追求的重要特性是:当我杀死容器时,它下面产生的所有东西都应该被杀死。不仅是直系子女,还有他们的后代。
当我开始这个项目时,我错误地认为当你杀死一个进程时,它的孩子也会自动被杀死。我曾向有同样错误想法的人寻求建议。虽然有可能捕捉到信号并将杀戮传递给儿童,但这不是我在这里要寻找的。
我相信我想要实现的目标,因为当你关闭一个 xterm 时,它里面运行的任何东西都会被杀死,除非它被 nohup'd。这包括孤立进程。这就是我想要重新创建的。
我有一个想法,我正在寻找的内容涉及 unix 会话。
如果有一种可靠的方法来识别进程的所有后代,那么能够向它们发送任意信号也会很有用。例如SIGUSR1。
我使用以下 Dockerfile在Docker 容器中构建了Alpine Linux:
FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*
Run Code Online (Sandbox Code Playgroud)
构建运行成功:
$ docker build -t collector .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM alpine:3.2
3.2: Pulling from alpine
8697b6cc1f48: Already exists
alpine:3.2: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: …Run Code Online (Sandbox Code Playgroud) Podman 手册页解释了卷安装/绑定:
\n\n\n像 SELinux 这样的标签系统要求在装载到容器中的卷\n内容上放置适当的标签。如果没有标签,安全系统可能\n会阻止容器内运行的进程使用该内容。默认情况下,Podman 不会更改操作系统设置的标签。
\n要更改容器上下文中的标签,您可以将两个后缀\n :z或:Z之一添加到卷装载。这些后缀告诉 Podman 重新标记共享卷上的文件\n对象。z选项告诉 Podman 两个容器共享卷内容。因此,Podman 使用共享\n内容标签来标记内容。共享卷标签允许所有容器读取/写入内容。\nZ选项告诉 Podman 使用私有非共享标签来标记内容。
\n
然而,故障排除页面用几乎相同的词语解释了同样的事情。
\n现在,对于 Podman 和 SELinux 相当陌生,想知道我实际上应该在什么时候使用什么?\n我知道,当我收到权限错误时,它们可能是由 SELinux 引起的,所以两个开关之一可以解决这个问题。但这两个选项(小写 z 和大写 Z)有什么区别呢?
\n它所说的区别是:
\n:z创建共享内容标签:Z创建私人非共享标签这引入了许多新词:
\n那么这些词在这种情况下意味着什么?\n最后一个问题:我什么时候应该使用什么?
\n目前是否可以设置具有 X11 功能的LXC 容器?我期待最轻的可用 X11 容器(内存方面),硬件加速是一个加分项,但不是必需的。
如果目前无法实现或现成可用,是否知道需要实现哪些功能才能支持它?
我lxc在Arch Linux. 以下是基本系统信息:
[chb@conventiont ~]$ uname -a
Linux conventiont 3.17.4-Chb #1 SMP PREEMPT Fri Nov 28 12:39:54 UTC 2014 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
这是一个自定义/编译内核,具有user namespace enabled:
[chb@conventiont ~]$ lxc-checkconfig
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: …Run Code Online (Sandbox Code Playgroud) 我想cryptsetup在systemd-nspawn容器内安装一个加密的图像文件。但是,我收到此错误消息:
[root@container ~]# echo $key | cryptsetup -d - open luks.img luks
Cannot initialize device-mapper. Is dm_mod kernel module loaded?
Cannot use device luks, name is invalid or still in use.
Run Code Online (Sandbox Code Playgroud)
该dm_mod内核模块被加载在主机系统上,虽然事情看起来有点容器内的怪异:
[root@host ~]# grep dm_mod /proc/modules
dm_mod 159744 2 dm_crypt, Live 0xffffffffc12c6000
[root@container ~]# grep dm_mod /proc/modules
dm_mod 159744 2 dm_crypt, Live 0x0000000000000000
Run Code Online (Sandbox Code Playgroud)
strace表示cryptsetup无法创建/dev/mapper/control:
[root@etrial ~]# echo $key | strace cryptsetup -d - open luks.img luks 2>&1 | …Run Code Online (Sandbox Code Playgroud) 我目前正在一个安全的沙箱环境中开始一个评估不受信任的程序(学生作业)的项目。主要思想是围绕 lxc-utils 为 GlassFish 和 Java 包装器创建一个 Web 应用程序来管理 LXC 容器。它将有一个等待程序的队列,一个 Java 包装器将维护固定数量(池)的 LXC 容器,为每个程序分配一个(未使用的)容器。
每个容器都应该使用 SELinux 来保护主机系统。
我的问题是:为沙箱环境创建这样的机制是个好主意,还是有更好的解决方案来解决这个问题?它应该轻巧且安全,以防止学生的创造力。
at 符号 (@) 在 Ubuntu 上的“ip address”命令(或“ip link”命令)输出中的接口名称中是什么意思,例如以下输出中的接口名称“eth0@if44”:
root@aafa1fc24a0b:/# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
link/tunnel6 :: brd ::
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP …Run Code Online (Sandbox Code Playgroud) 我将在这个项目中使用 Ubuntu Linux。
为了在会议上培训特定应用程序,我需要:
对于#1,我们希望使用单个用户帐户,这样我们就不必为每个学生创建一个帐户并分发用户名和密码。
有谁知道我如何才能实现这些目标?哪种技术(例如 LXC、Chroot 等)最适合这种情况?我一直在考虑使用 .bash_profile 和 .bash_logout 来处理这些环境的创建和破坏,但不确定哪种技术能够创建我需要的环境。
在阅读 systemd-nspawn 时,提到它不应该在生产环境中使用。原因似乎是缺乏管理和部署基础设施。实用性是唯一的原因,还是也有潜在的安全/功能原因?