From 8e267fc269f987a7dcb38a117b9efe8780c81d2e Mon Sep 17 00:00:00 2001 From: Ramkumar Chinchani <45800463+rchincha@users.noreply.github.com> Date: Fri, 10 Mar 2023 13:41:42 -0800 Subject: [PATCH] feat(check): report kernel version and fs type (#441) stacker functionality depends on kernel versions and filesystem support. So useful to report this often, at least to debug issues. Signed-off-by: Ramkumar Chinchani --- cmd/stacker/check.go | 17 +++++++ pkg/stacker/check.go | 114 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 pkg/stacker/check.go diff --git a/cmd/stacker/check.go b/cmd/stacker/check.go index 855e24ba..437e10ba 100644 --- a/cmd/stacker/check.go +++ b/cmd/stacker/check.go @@ -8,7 +8,9 @@ import ( "github.com/pkg/errors" "github.com/pkg/xattr" "github.com/urfave/cli" + "stackerbuild.io/stacker/pkg/log" "stackerbuild.io/stacker/pkg/overlay" + "stackerbuild.io/stacker/pkg/stacker" ) var checkCmd = cli.Command{ @@ -18,10 +20,25 @@ var checkCmd = cli.Command{ } func doCheck(ctx *cli.Context) error { + + kernel, err := stacker.KernelInfo() + if err != nil { + return errors.Wrapf(err, "couldn't get kernel info") + } + + log.Infof(kernel) + if err := os.MkdirAll(config.RootFSDir, 0700); err != nil { return errors.Wrapf(err, "couldn't create rootfs dir for testing") } + fstype, err := stacker.MountInfo(config.RootFSDir) + if err != nil { + return errors.Wrapf(err, "%s: couldn't get fs type", config.RootFSDir) + } + + log.Infof("%s %s", config.RootFSDir, fstype) + if e := verifyNewUIDMap(ctx); e != nil { return e } diff --git a/pkg/stacker/check.go b/pkg/stacker/check.go new file mode 100644 index 00000000..b660c53a --- /dev/null +++ b/pkg/stacker/check.go @@ -0,0 +1,114 @@ +package stacker + +import ( + "fmt" + + "golang.org/x/sys/unix" +) + +func KernelInfo() (string, error) { + utsname := unix.Utsname{} + if err := unix.Uname(&utsname); err != nil { + return "", err + } + + return fmt.Sprintf("%s %s %s", string(utsname.Sysname[:]), string(utsname.Release[:]), string(utsname.Version[:])), nil +} + +func MountInfo(path string) (string, error) { + // from /usr/include/linux/magic.h + var fstypeMap = map[int64]string{ + 0xadf5: "ADFS", + 0xadff: "AFFS", + 0x5346414F: "AFS", + 0x0187: "AUTOFS", + 0x73757245: "CODA", + 0x28cd3d45: "CRAMFS", + 0x453dcd28: "CRAMFS_WEND", + 0x64626720: "DEBUGFS", + 0x73636673: "SECURITYFS", + 0xf97cff8c: "SELINUX", + 0x43415d53: "SMACK", + 0x858458f6: "RAMFS", + 0x01021994: "TMPFS", + 0x958458f6: "HUGETLBFS", + 0x73717368: "SQUASHFS", + 0xf15f: "ECRYPTFS", + 0x414A53: "EFS", + 0xE0F5E1E2: "EROFS_V1", + 0xEF53: "EXT2", + 0xabba1974: "XENFS", + 0x9123683E: "BTRFS", + 0x3434: "NILFS", + 0xF2F52010: "F2FS", + 0xf995e849: "HPFS", + 0x9660: "ISOFS", + 0x72b6: "JFFS2", + 0x58465342: "XFS", + 0x6165676C: "PSTOREFS", + 0xde5e81e4: "EFIVARFS", + 0x00c0ffee: "HOSTFS", + 0x794c7630: "OVERLAYFS", + 0x137F: "MINIX", + 0x138F: "MINIX2", + 0x2468: "MINIX2", + 0x2478: "MINIX22", + 0x4d5a: "MINIX3", + 0x4d44: "MSDOS", + 0x564c: "NCP", + 0x6969: "NFS", + 0x7461636f: "OCFS2", + 0x9fa1: "OPENPROM", + 0x002f: "QNX4", + 0x68191122: "QNX6", + 0x6B414653: "AFS_FS", + 0x52654973: "REISERFS", + 0x517B: "SMB", + 0x27e0eb: "CGROUP", + 0x63677270: "CGROUP2", + 0x7655821: "RDTGROUP", + 0x57AC6E9D: "STACK_END", + 0x74726163: "TRACEFS", + 0x01021997: "V9FS", + 0x62646576: "BDEVFS", + 0x64646178: "DAXFS", + 0x42494e4d: "BINFMTFS", + 0x1cd1: "DEVPTS", + 0x6c6f6f70: "BINDERFS", + 0xBAD1DEA: "FUTEXFS", + 0x50495045: "PIPEFS", + 0x9fa0: "PROC", + 0x534F434B: "SOCKFS", + 0x62656572: "SYSFS", + 0x9fa2: "USBDEVICE", + 0x11307854: "MTD_INODE_FS", + 0x09041934: "ANON_INODE_FS", + 0x73727279: "BTRFS_TEST", + 0x6e736673: "NSFS", + 0xcafe4a11: "BPF_FS", + 0x5a3c69f0: "AAFS", + 0x5a4f4653: "ZONEFS", + 0x15013346: "UDF", + 0x13661366: "BALLOON_KVM", + 0x58295829: "ZSMALLOC", + 0x444d4142: "DMA_BUF", + 0x454d444d: "DEVMEM", + 0x33: "Z3FOLD", + 0xc7571590: "PPC_CMM", + 0x5345434d: "SECRETMEM", + 0x6a656a62: "SHIFTFS", + } + + st := unix.Statfs_t{} + if err := unix.Statfs(path, &st); err != nil { + return "", err + } + + fstype, ok := fstypeMap[st.Type] + if !ok { + fstype = "unknown" + } + + // lookup fs type in /usr/include/linux/magic.h + return fmt.Sprintf("%s(%x)", fstype, st.Type), nil +}