mirror of
https://github.com/containers/podman.git
synced 2025-08-24 01:50:58 +08:00

Copy all proxy envs into the VM on each start, this allows for updates without having to recrate the VM. This is implemented via shell script that is passed via ssh to the VM after it is started. With that we now use the same logic for all providers the old fw_cfg logic for qemu has been removed and the WSL code as well which keeps the behavior the same. There is a small risk now because we only update the env via ssh that processes started before will have the old incorrect env but it should really only effect core system processes which likely do not need them anyway. The podman system service should not be started at this point so it should be good enough. It also fixes the broken behavior with SSL_CERT_FILE/SSL_CERT_DIR which were updated on each start which is not correct as the files are only copied with ignition so these should not be updated and just set statically when the VM was created. e2e test has been added to ensure the behavior works as expected. Signed-off-by: Paul Holzinger <pholzing@redhat.com>
214 lines
6.9 KiB
Go
214 lines
6.9 KiB
Go
//go:build windows
|
|
|
|
package wsl
|
|
|
|
const (
|
|
ErrorSuccessRebootInitiated = 1641
|
|
ErrorSuccessRebootRequired = 3010
|
|
currentMachineVersion = 3
|
|
)
|
|
|
|
const containersConf = `[containers]
|
|
|
|
[engine]
|
|
cgroup_manager = "cgroupfs"
|
|
`
|
|
|
|
const registriesConf = `unqualified-search-registries=["docker.io"]
|
|
`
|
|
|
|
const appendPort = `grep -q Port\ %d /etc/ssh/sshd_config || echo Port %d >> /etc/ssh/sshd_config`
|
|
|
|
//nolint:unused
|
|
const changePort = `sed -E -i 's/^Port[[:space:]]+[0-9]+/Port %d/' /etc/ssh/sshd_config`
|
|
|
|
const configServices = `ln -fs /usr/lib/systemd/system/sshd.service /etc/systemd/system/multi-user.target.wants/sshd.service
|
|
ln -fs /usr/lib/systemd/system/podman.socket /etc/systemd/system/sockets.target.wants/podman.socket
|
|
rm -f /etc/systemd/system/getty.target.wants/console-getty.service
|
|
rm -f /etc/systemd/system/getty.target.wants/getty@tty1.service
|
|
rm -f /etc/systemd/system/multi-user.target.wants/systemd-resolved.service
|
|
rm -f /etc/systemd/system/sysinit.target.wants//systemd-resolved.service
|
|
rm -f /etc/systemd/system/dbus-org.freedesktop.resolve1.service
|
|
ln -fs /dev/null /etc/systemd/system/console-getty.service
|
|
ln -fs /dev/null /etc/systemd/system/systemd-oomd.socket
|
|
mkdir -p /etc/systemd/system/systemd-sysusers.service.d/
|
|
echo CREATE_MAIL_SPOOL=no >> /etc/default/useradd
|
|
adduser -m [USER] -G wheel
|
|
mkdir -p /home/[USER]/.config/systemd/[USER]/
|
|
chown [USER]:[USER] /home/[USER]/.config
|
|
`
|
|
|
|
const sudoers = `%wheel ALL=(ALL) NOPASSWD: ALL
|
|
`
|
|
|
|
const bootstrap = `#!/bin/bash
|
|
ps -ef | grep -v grep | grep -q systemd && exit 0
|
|
nohup unshare --kill-child --fork --pid --mount --mount-proc --propagation shared /lib/systemd/systemd >/dev/null 2>&1 &
|
|
sleep 0.1
|
|
`
|
|
|
|
const wslmotd = `
|
|
You will be automatically entered into a nested process namespace where
|
|
systemd is running. If you need to access the parent namespace, hit ctrl-d
|
|
or type exit. This also means to log out you need to exit twice.
|
|
|
|
`
|
|
|
|
const sysdpid = "SYSDPID=`ps -eo cmd,pid | grep -m 1 ^/lib/systemd/systemd | awk '{print $2}'`"
|
|
|
|
const profile = sysdpid + `
|
|
if [ ! -z "$SYSDPID" ] && [ "$SYSDPID" != "1" ]; then
|
|
cat /etc/wslmotd
|
|
/usr/local/bin/enterns
|
|
fi
|
|
`
|
|
|
|
const enterns = "#!/bin/bash\n" + sysdpid + `
|
|
if [ ! -z "$SYSDPID" ] && [ "$SYSDPID" != "1" ]; then
|
|
NSENTER=("nsenter" "-m" "-p" "-t" "$SYSDPID" "--wd=$PWD")
|
|
|
|
if [ "$UID" != "0" ]; then
|
|
NSENTER=("sudo" "${NSENTER[@]}")
|
|
if [ "$#" != "0" ]; then
|
|
NSENTER+=("sudo" "-u" "$USER")
|
|
else
|
|
NSENTER+=("su" "-l" "$USER")
|
|
fi
|
|
fi
|
|
"${NSENTER[@]}" "$@"
|
|
fi`
|
|
|
|
const waitTerm = sysdpid + `
|
|
if [ ! -z "$SYSDPID" ]; then
|
|
timeout 60 tail -f /dev/null --pid $SYSDPID
|
|
fi
|
|
`
|
|
|
|
const wslConf = `[user]
|
|
default=[USER]
|
|
`
|
|
|
|
const wslConfUserNet = `
|
|
[network]
|
|
generateResolvConf = false
|
|
`
|
|
|
|
const resolvConfUserNet = `
|
|
nameserver 192.168.127.1
|
|
`
|
|
|
|
// WSL kernel does not have sg and crypto_user modules
|
|
const overrideSysusers = `[Service]
|
|
LoadCredential=
|
|
`
|
|
|
|
const lingerService = `[Unit]
|
|
Description=A systemd user unit demo
|
|
After=network-online.target
|
|
Wants=network-online.target podman.socket
|
|
[Service]
|
|
ExecStart=/usr/bin/sleep infinity
|
|
`
|
|
|
|
const lingerSetup = `mkdir -p /home/[USER]/.config/systemd/user/default.target.wants
|
|
ln -fs /home/[USER]/.config/systemd/user/linger-example.service \
|
|
/home/[USER]/.config/systemd/user/default.target.wants/linger-example.service
|
|
`
|
|
|
|
const bindMountSystemService = `
|
|
[Unit]
|
|
Description=Bind mount for system podman sockets
|
|
After=podman.socket
|
|
|
|
[Service]
|
|
RemainAfterExit=true
|
|
Type=oneshot
|
|
# Ensure user services can register sockets as well
|
|
ExecStartPre=mkdir -p -m 777 /mnt/wsl/podman-sockets
|
|
ExecStartPre=mkdir -p -m 777 /mnt/wsl/podman-sockets/%[1]s
|
|
ExecStartPre=touch /mnt/wsl/podman-sockets/%[1]s/podman-root.sock
|
|
ExecStart=mount --bind %%t/podman/podman.sock /mnt/wsl/podman-sockets/%[1]s/podman-root.sock
|
|
ExecStop=umount /mnt/wsl/podman-sockets/%[1]s/podman-root.sock
|
|
`
|
|
|
|
const bindMountUserService = `
|
|
[Unit]
|
|
Description=Bind mount for user podman sockets
|
|
After=podman.socket
|
|
|
|
[Service]
|
|
RemainAfterExit=true
|
|
Type=oneshot
|
|
# Consistency with system service (supports racing)
|
|
ExecStartPre=mkdir -p -m 777 /mnt/wsl/podman-sockets
|
|
ExecStartPre=mkdir -p -m 777 /mnt/wsl/podman-sockets/%[1]s
|
|
ExecStartPre=touch /mnt/wsl/podman-sockets/%[1]s/podman-user.sock
|
|
# Relies on /etc/fstab entry for user mounting
|
|
ExecStart=mount /mnt/wsl/podman-sockets/%[1]s/podman-user.sock
|
|
ExecStop=umount /mnt/wsl/podman-sockets/%[1]s/podman-user.sock
|
|
`
|
|
|
|
const bindMountFsTab = `/run/user/1000/podman/podman.sock /mnt/wsl/podman-sockets/%s/podman-user.sock none noauto,user,bind,defaults 0 0
|
|
`
|
|
const (
|
|
defaultTargetWants = "default.target.wants"
|
|
userSystemdPath = "/home/%[1]s/.config/systemd/user"
|
|
sysSystemdPath = "/etc/systemd/system"
|
|
userSystemdWants = userSystemdPath + "/" + defaultTargetWants
|
|
sysSystemdWants = sysSystemdPath + "/" + defaultTargetWants
|
|
bindUnitFileName = "podman-mnt-bindings.service"
|
|
bindUserUnitPath = userSystemdPath + "/" + bindUnitFileName
|
|
bindUserUnitWant = userSystemdWants + "/" + bindUnitFileName
|
|
bindSysUnitPath = sysSystemdPath + "/" + bindUnitFileName
|
|
bindSysUnitWant = sysSystemdWants + "/" + bindUnitFileName
|
|
podmanSocketDropin = "podman.socket.d"
|
|
podmanSocketDropinPath = sysSystemdPath + "/" + podmanSocketDropin
|
|
)
|
|
|
|
const configBindServices = "mkdir -p " + userSystemdWants + " " + sysSystemdWants + " " + podmanSocketDropinPath + "\n" +
|
|
"ln -fs " + bindUserUnitPath + " " + bindUserUnitWant + "\n" +
|
|
"ln -fs " + bindSysUnitPath + " " + bindSysUnitWant + "\n"
|
|
|
|
const overrideSocketGroup = `
|
|
[Socket]
|
|
SocketMode=0660
|
|
SocketGroup=wheel
|
|
`
|
|
|
|
const wslInstallError = `Could not %s. See previous output for any potential failure details.
|
|
If you can not resolve the issue, and rerunning fails, try the "wsl --install" process
|
|
outlined in the following article:
|
|
|
|
http://docs.microsoft.com/en-us/windows/wsl/install
|
|
|
|
`
|
|
|
|
const wslKernelError = `Could not %s. See previous output for any potential failure details.
|
|
If you can not resolve the issue, try rerunning the "podman machine init command". If that fails
|
|
try the "wsl --update" command and then rerun "podman machine init". Finally, if all else fails,
|
|
try following the steps outlined in the following article:
|
|
|
|
http://docs.microsoft.com/en-us/windows/wsl/install
|
|
|
|
`
|
|
|
|
const wslInstallKernel = "install the WSL Kernel"
|
|
|
|
const wslOldVersion = `Automatic installation of WSL can not be performed on this version of Windows
|
|
Either update to Build 19041 (or later), or perform the manual installation steps
|
|
outlined in the following article:
|
|
|
|
http://docs.microsoft.com/en-us/windows/wsl/install\
|
|
|
|
`
|
|
|
|
const (
|
|
gvProxy = "gvproxy.exe"
|
|
winSSHProxy = "win-sshproxy.exe"
|
|
pipePrefix = "npipe:////./pipe/"
|
|
globalPipe = "docker_engine"
|
|
userModeDist = "podman-net-usermode"
|
|
rootfulSock = "/run/podman/podman.sock"
|
|
rootlessSock = "/run/user/1000/podman/podman.sock"
|
|
)
|