mirror of
https://github.com/containers/podman.git
synced 2025-06-20 17:13:43 +08:00
Merge pull request #8949 from giuseppe/sysfs-for-rootless
specgen: improve heuristic for /sys bind mount
This commit is contained in:
@ -138,10 +138,23 @@ func makeCommand(ctx context.Context, s *specgen.SpecGenerator, img *image.Image
|
|||||||
return finalCommand, nil
|
return finalCommand, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// canMountSys is a best-effort heuristic to detect whether mounting a new sysfs is permitted in the container
|
||||||
|
func canMountSys(isRootless, isNewUserns bool, s *specgen.SpecGenerator) bool {
|
||||||
|
if s.NetNS.IsHost() && (isRootless || isNewUserns) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if isNewUserns {
|
||||||
|
switch s.NetNS.NSMode {
|
||||||
|
case specgen.Slirp, specgen.Private, specgen.NoNetwork, specgen.Bridge:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runtime, rtc *config.Config, newImage *image.Image, mounts []spec.Mount, pod *libpod.Pod, finalCmd []string) (*spec.Spec, error) {
|
func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runtime, rtc *config.Config, newImage *image.Image, mounts []spec.Mount, pod *libpod.Pod, finalCmd []string) (*spec.Spec, error) {
|
||||||
var (
|
|
||||||
inUserNS bool
|
|
||||||
)
|
|
||||||
cgroupPerm := "ro"
|
cgroupPerm := "ro"
|
||||||
g, err := generate.New("linux")
|
g, err := generate.New("linux")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -151,23 +164,11 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
|
|||||||
g.RemoveMount("/dev/shm")
|
g.RemoveMount("/dev/shm")
|
||||||
g.HostSpecific = true
|
g.HostSpecific = true
|
||||||
addCgroup := true
|
addCgroup := true
|
||||||
canMountSys := true
|
|
||||||
|
|
||||||
isRootless := rootless.IsRootless()
|
isRootless := rootless.IsRootless()
|
||||||
if isRootless {
|
isNewUserns := s.UserNS.IsContainer() || s.UserNS.IsPath() || s.UserNS.IsPrivate()
|
||||||
inUserNS = true
|
|
||||||
}
|
canMountSys := canMountSys(isRootless, isNewUserns, s)
|
||||||
if !s.UserNS.IsHost() {
|
|
||||||
if s.UserNS.IsContainer() || s.UserNS.IsPath() {
|
|
||||||
inUserNS = true
|
|
||||||
}
|
|
||||||
if s.UserNS.IsPrivate() {
|
|
||||||
inUserNS = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if inUserNS && s.NetNS.NSMode != specgen.NoNetwork {
|
|
||||||
canMountSys = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.Privileged && canMountSys {
|
if s.Privileged && canMountSys {
|
||||||
cgroupPerm = "rw"
|
cgroupPerm = "rw"
|
||||||
@ -232,6 +233,8 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
|
|||||||
g.AddMount(devPts)
|
g.AddMount(devPts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inUserNS := isRootless || isNewUserns
|
||||||
|
|
||||||
if inUserNS && s.IpcNS.IsHost() {
|
if inUserNS && s.IpcNS.IsHost() {
|
||||||
g.RemoveMount("/dev/mqueue")
|
g.RemoveMount("/dev/mqueue")
|
||||||
devMqueue := spec.Mount{
|
devMqueue := spec.Mount{
|
||||||
|
@ -105,6 +105,14 @@ var _ = Describe("Podman run ns", func() {
|
|||||||
Expect(session).To(ExitWithError())
|
Expect(session).To(ExitWithError())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman run mounts fresh cgroup", func() {
|
||||||
|
session := podmanTest.Podman([]string{"run", fedoraMinimal, "grep", "cgroup", "/proc/self/mountinfo"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
output := session.OutputToString()
|
||||||
|
Expect(output).ToNot(ContainSubstring(".."))
|
||||||
|
})
|
||||||
|
|
||||||
It("podman run --ipc=host --pid=host", func() {
|
It("podman run --ipc=host --pid=host", func() {
|
||||||
SkipIfRootlessCgroupsV1("Not supported for rootless + CGroupsV1")
|
SkipIfRootlessCgroupsV1("Not supported for rootless + CGroupsV1")
|
||||||
cmd := exec.Command("ls", "-l", "/proc/self/ns/pid")
|
cmd := exec.Command("ls", "-l", "/proc/self/ns/pid")
|
||||||
|
Reference in New Issue
Block a user