From 7b595464532697fdb34199c6289d8cff9713893f Mon Sep 17 00:00:00 2001 From: Tan Yifeng Date: Sun, 29 Mar 2026 13:41:06 +0800 Subject: [PATCH] sysfs: Add block and char subdirectories under /sys/dev gVisor does not expose real block/char devices, the directories remain empty, but their existence is required for compatibility. Tools like lsblk expect /sys/dev/block/ to exist in order to enumerate block devices. Currently, gVisor's sysfs creates /sys/dev/ as an empty directory without the standard block/ and char/ children, causing lsblk to fail with ENOENT. Signed-off-by: Tan Yifeng --- pkg/sentry/fsimpl/sys/sys.go | 11 +++++++---- pkg/sentry/fsimpl/sys/sys_integration_test.go | 10 ++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/pkg/sentry/fsimpl/sys/sys.go b/pkg/sentry/fsimpl/sys/sys.go index b7f4dea335..e81784b3f1 100644 --- a/pkg/sentry/fsimpl/sys/sys.go +++ b/pkg/sentry/fsimpl/sys/sys.go @@ -192,10 +192,13 @@ func (fsType FilesystemType) GetFilesystem(ctx context.Context, vfsObj *vfs.Virt }) } root := fs.newDir(ctx, creds, defaultSysDirMode, map[string]kernfs.Inode{ - "block": fs.newDir(ctx, creds, defaultSysDirMode, nil), - "bus": fs.newDir(ctx, creds, defaultSysDirMode, busSub), - "class": fs.newDir(ctx, creds, defaultSysDirMode, classSub), - "dev": fs.newDir(ctx, creds, defaultSysDirMode, nil), + "block": fs.newDir(ctx, creds, defaultSysDirMode, nil), + "bus": fs.newDir(ctx, creds, defaultSysDirMode, busSub), + "class": fs.newDir(ctx, creds, defaultSysDirMode, classSub), + "dev": fs.newDir(ctx, creds, defaultSysDirMode, map[string]kernfs.Inode{ + "block": fs.newDir(ctx, creds, defaultSysDirMode, nil), + "char": fs.newDir(ctx, creds, defaultSysDirMode, nil), + }), "devices": fs.newDir(ctx, creds, defaultSysDirMode, devicesSub), "firmware": fs.newDir(ctx, creds, defaultSysDirMode, nil), "fs": fs.newDir(ctx, creds, defaultSysDirMode, fsDirChildren), diff --git a/pkg/sentry/fsimpl/sys/sys_integration_test.go b/pkg/sentry/fsimpl/sys/sys_integration_test.go index 0b7d547f6c..8978563324 100644 --- a/pkg/sentry/fsimpl/sys/sys_integration_test.go +++ b/pkg/sentry/fsimpl/sys/sys_integration_test.go @@ -103,6 +103,16 @@ func TestSysRootContainsExpectedEntries(t *testing.T) { }) } +func TestSysDevContainsBlockAndChar(t *testing.T) { + s := newTestSystem(t, "" /*pciTestDir*/) + defer s.Destroy() + pop := s.PathOpAtRoot("/dev") + s.AssertAllDirentTypes(s.ListDirents(pop), map[string]testutil.DirentType{ + "block": linux.DT_DIR, + "char": linux.DT_DIR, + }) +} + func TestCgroupMountpointExists(t *testing.T) { // Note: The mountpoint is only created if cgroups are available. s := newTestSystem(t, "" /*pciTestDir*/)