虽然我原本想完全取代我的 NAS 使用的 Linux 发行版,同时我得出的结论是,最好是尽可能不修改现有系统,而仅通过 Gentoo(或 Arch)Linux 对其进行补充 - 这基本上就是上一个问题的答案建议。因此,目前对原始系统的唯一修改包括/gentoo
我chroot
通过以下脚本进入的目录:
#!/bin/bash
set -e
cp -L /etc/resolv.conf etc/ # for internet access
cp -P /etc/localtime etc/ # to keep the timezones consistent
cp -d /etc/mtab etc/ # to check mounted systems
# cp /etc/{mdadm.conf,hosts,fstab} etc # Maybe?
mount --rbind /mnt mnt # use host's mounts
mkdir host; mount --bind / host
mount --bind /var/log var/log # or run own syslogd?
mount --bind /dev dev
mount -t devpts devpts dev/pts
mount --bind /proc proc # or mount -t procfs proc proc?
mount --bind /sys sys # or mount -t sysfs sysfs sys?
chroot . /usr/sbin/sshd -p 22222
# chroot . /bin/env -i TERM=$TERM /bin/bash
现在我可以简单地ssh
通过端口 22222 进入主机并最终进入该chroot
环境,其行为基本上类似于 Gentoo Linux,并且该脚本可以从主机的/etc/init.d/rcS
.
但当然我不想最终以这种方式启动我想手动使用的每个 Gentoo 服务 - 毕竟这就是 OpenRC(或 systemd,如果首选)的好处。所以我的主要问题是
应该执行什么 Gentoo 命令才能
chroot
在主机 Linux 之上正确“启动”Gentoo Linux,并尽可能减少干扰?
尽可能少的干扰我的意思是它不应该尝试重新挂载文件系统(但同时如果 Gentoomount
能够正常工作那就太好了) - 所以简单地运行init
可能是不正确的,对 OpenRC 配置的一些修改可能会是必要的,但是哪些呢?
另外,还有主机守护进程的问题 - 我应该使用它们还是让 Gentoo 运行它自己的实例(crond
以及syslogd
它们需要如何设置才能不干扰主机实例?),或者我应该甚至进一步完全虚拟化 Gentoo?如上所述在另一个问题中如果 Gentoo 实例拥有自己的 IP,并且或多或少表现得像一个独立系统,那就太好了,但另一方面,由于系统资源有限,我希望开销尽可能小。主机系统正在运行这些守护进程,加上我到目前为止的想法:
Daemon | Use Gentoo's own?
-----------------+---------------------------------------------------------------
udevd | N bind-mount /dev
klogd, k* | N using host kernel (although UML might be interesting...)
dhcpd, inetd | ? depends on using own IP or not
syslogd | ? bind-mount /var/log or use Gentoo's more versatile settings?
mdadm --monitor | ? should Gentoo bother with the RAID configuration?
smbd, nmbd | ? disable host's samba in favour of Gentoo's one? maybe with a
| maintenance-only share on the host
crond | Y to minimize interference with host's maintenance scripts
sshd | Y to directly SSH into the chrooted Gentoo system
daemonwatch | ? maybe use host instance to watch Gentoo instance?
logchkd, errormon| ? unknown
最后,我想知道在关闭/重新启动时我应该考虑什么 - 我可以简单地让主机的关闭脚本chroot /gentoo /bin/init shutdown
在其自己的序列之前运行,还是会导致 Gentoo 断电前主机的实际关闭顺序?
答案1
如果您想在 chroot 中运行服务:这并不是 chroot 的真正用途。
你最好将你的 Gentoo 系统隔离在一个码头工人容器。
您可以通过创建新的 chroot 轻松创建 Docker 映像基础图像从中:
tar --numeric-owner -cf- /gentoo | docker import - gentoo:base
然后构建合适的 Docker 镜像在它上面使用这个Dockerfile:
FROM gentoo:base
EXPOSE 22 # make SSH accessible, repeat for any port you're running a service on in this container
ENTRYPOINT ["/usr/lib/systemd/systemd"]
使用此命令基于以下内容构建适当的容器Dockerfile(这Dockerfile需要位于运行此命令的同一目录中,并且需要命名Dockerfile):
docker build -t gentoo:latest .
现在您应该可以使用以下命令启动此容器
GENTOO_CONTAINER=$(docker run -d gentoo:base)
现在使用docker inspect ${GENTOO_CONTAINER}
您可以看到该容器的所有详细信息(IP、哪些端口用于将容器内运行的服务暴露给外部等)。
使用docker ps
您可以看到当前正在运行的容器。
使用docker ps -a
您可以查看所有曾经运行过的容器,包括当前正在运行的容器。
还要确保执行以下操作Docker教程这对理解确实有帮助码头工人基本。