blob: 8b23b72eff22c37bb36bc1df423d4a915b484e6a [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
Lorenz Brun3a99c592021-01-26 19:57:21 +01002// SPDX-License-Identifier: Apache-2.0
Lorenz Brun3a99c592021-01-26 19:57:21 +01003
4package main
5
6import (
7 "fmt"
Lorenz Brun3a99c592021-01-26 19:57:21 +01008 "os"
Lorenz Brun3a99c592021-01-26 19:57:21 +01009
Lorenz Brunfe6b5062024-07-02 16:32:35 +000010 "github.com/opencontainers/runc/libcontainer/cgroups"
Lorenz Brun3a99c592021-01-26 19:57:21 +010011 "golang.org/x/sys/unix"
Lorenz Brun3a99c592021-01-26 19:57:21 +010012)
13
Serge Bazanski216fe7b2021-05-21 18:36:16 +020014// setupMounts sets up basic mounts like sysfs, procfs, devtmpfs and cgroups.
15// This should be called early during init as a lot of processes depend on this
16// being available.
Serge Bazanskie803fc12022-01-25 14:58:24 +010017func setupMounts() error {
Lorenz Brun3a99c592021-01-26 19:57:21 +010018 // Set up target filesystems.
19 for _, el := range []struct {
20 dir string
21 fs string
22 flags uintptr
23 }{
24 {"/sys", "sysfs", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV},
Lorenz Brun09c275b2021-03-30 12:47:09 +020025 {"/sys/kernel/tracing", "tracefs", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV},
Lorenz Brun6ef7f9b2021-10-21 13:02:40 +020026 {"/sys/firmware/efi/efivars", "efivarfs", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV},
Lorenz Brun1b2df232022-06-14 12:42:03 +020027 {"/sys/fs/pstore", "pstore", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV},
Lorenz Brun3a99c592021-01-26 19:57:21 +010028 {"/proc", "proc", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV},
29 {"/dev", "devtmpfs", unix.MS_NOEXEC | unix.MS_NOSUID},
30 {"/dev/pts", "devpts", unix.MS_NOEXEC | unix.MS_NOSUID},
Leopold Schabelc5e0dbd2024-07-24 13:18:45 +000031 // Nothing in Metropolis currently uses /dev/shm, but it's required
32 // by containerd when the host IPC namespace is shared, which
33 // is required by "kubectl debug node/" and specific customer applications.
34 // https://github.com/monogon-dev/monogon/issues/305.
35 {"/dev/shm", "tmpfs", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV},
Lorenz Brun3a99c592021-01-26 19:57:21 +010036 } {
37 if err := os.MkdirAll(el.dir, 0755); err != nil {
38 return fmt.Errorf("could not make %s: %w", el.dir, err)
39 }
40 if err := unix.Mount(el.fs, el.dir, el.fs, el.flags, ""); err != nil {
41 return fmt.Errorf("could not mount %s on %s: %w", el.fs, el.dir, err)
42 }
43 }
44
Lorenz Brunfe6b5062024-07-02 16:32:35 +000045 if err := unix.Mount("cgroup2", "/sys/fs/cgroup", "cgroup2", unix.MS_NOEXEC|unix.MS_NOSUID|unix.MS_NODEV, "nsdelegate,memory_recursiveprot"); err != nil {
Lorenz Brun3a99c592021-01-26 19:57:21 +010046 panic(err)
47 }
Lorenz Brunfe6b5062024-07-02 16:32:35 +000048 // Create main cgroup "everything" and move ourselves into it.
49 if err := os.Mkdir("/sys/fs/cgroup/everything", 0755); err != nil {
Lorenz Brun3a99c592021-01-26 19:57:21 +010050 panic(err)
51 }
Lorenz Brunfe6b5062024-07-02 16:32:35 +000052 if err := cgroups.WriteCgroupProc("/sys/fs/cgroup/everything", os.Getpid()); err != nil {
Lorenz Brun3a99c592021-01-26 19:57:21 +010053 panic(err)
54 }
Lorenz Brun3a99c592021-01-26 19:57:21 +010055 return nil
56}