utils_linux.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package libcontainerd
  2. import (
  3. "syscall"
  4. containerd "github.com/containerd/containerd/api/grpc/types"
  5. "github.com/opencontainers/runtime-spec/specs-go"
  6. "golang.org/x/sys/unix"
  7. )
  8. func getRootIDs(s specs.Spec) (int, int, error) {
  9. var hasUserns bool
  10. for _, ns := range s.Linux.Namespaces {
  11. if ns.Type == specs.UserNamespace {
  12. hasUserns = true
  13. break
  14. }
  15. }
  16. if !hasUserns {
  17. return 0, 0, nil
  18. }
  19. uid := hostIDFromMap(0, s.Linux.UIDMappings)
  20. gid := hostIDFromMap(0, s.Linux.GIDMappings)
  21. return uid, gid, nil
  22. }
  23. func hostIDFromMap(id uint32, mp []specs.LinuxIDMapping) int {
  24. for _, m := range mp {
  25. if id >= m.ContainerID && id <= m.ContainerID+m.Size-1 {
  26. return int(m.HostID + id - m.ContainerID)
  27. }
  28. }
  29. return 0
  30. }
  31. func systemPid(ctr *containerd.Container) uint32 {
  32. var pid uint32
  33. for _, p := range ctr.Processes {
  34. if p.Pid == InitFriendlyName {
  35. pid = p.SystemPid
  36. }
  37. }
  38. return pid
  39. }
  40. func convertRlimits(sr []specs.POSIXRlimit) (cr []*containerd.Rlimit) {
  41. for _, r := range sr {
  42. cr = append(cr, &containerd.Rlimit{
  43. Type: r.Type,
  44. Hard: r.Hard,
  45. Soft: r.Soft,
  46. })
  47. }
  48. return
  49. }
  50. // setPDeathSig sets the parent death signal to SIGKILL
  51. func setSysProcAttr(sid bool) *syscall.SysProcAttr {
  52. return &syscall.SysProcAttr{
  53. Setsid: sid,
  54. Pdeathsig: unix.SIGKILL,
  55. }
  56. }