[lxc-devel] Understanding - LXCFS source code to add /sys/power/state as an entry in LXCFS

Souvik Datta sd.souvikdatta at gmail.com
Fri Jun 5 07:51:43 UTC 2020


Thanks Christian.
I am using in a VirtualBox inside which I am running lxcfs
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic

the source code version of lxcfs that I am using is:- 4.0.0

My objective is to prevent the OS, running inside LXC (as privileged
system container), from changing the power state of the system and in
that respect, I am trying to virtualize the file /sys/power/state

Can you kindly provide the siginificance of the following:
- What is the significance of "api_extensions"? It seems it not used
any where except as console logs as part of liblxcfs.so init function.
- Can you please explain, before calling - fuse_main(nargs, newargv,
&lxcfs_ops, opts() [in src/lxcfs.c], what is happening in the
"constructor" of liblxcfs.so [src/bindings.c] library?
I am using Ubuntu


- I have made following additions in src/bindings.h and
src/sysfs_fuse.c to show /sys/power/state in the fuse FS.

In src/bindings.h:-
-------------------
Added following:-

        LXC_TYPE_SYS_POWER,
        LXC_TYPE_SYS_POWER_STATE,
#define LXC_TYPE_SYS_POWER_STATE_PATH "/sys/power/state"

In src/sysfs_fuse.c:-
---------------------
Added following:-

In function:

[1] __lxcfs_fuse_ops int sys_getattr(const char *path, struct stat *sb)

#if 1
        if (strcmp(path, "/sys/power") == 0) {
                sb->st_mode = S_IFDIR | 00555;
                sb->st_nlink = 2;
                return 0;
        }


        if (strcmp(path, "/sys/power/state") == 0) {
                sb->st_size = 0;
                sb->st_mode = S_IFREG | 00444;
                sb->st_nlink = 1;
                return 0;
        }

#endif

[2] __lxcfs_fuse_ops int sys_readdir(const char *path, void *buf,
fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi)
#if 1
        if (strcmp(path, "/sys/power") == 0) {
                if (filler(buf, ".",            NULL, 0) != 0 ||
                    filler(buf, "..",           NULL, 0) != 0 ||
                    filler(buf, "state",        NULL, 0) != 0)
                        return -ENOENT;

                return 0;
        }

#endif

[3] __lxcfs_fuse_ops int sys_open(const char *path, struct fuse_file_info *fi)

#if 1
        if (strcmp(path, "/sys/power") == 0)
                type = LXC_TYPE_SYS_POWER;
        if (strcmp(path, "/sys/power/state") == 0)
                type = LXC_TYPE_SYS_POWER_STATE;
#endif

[4] __lxcfs_fuse_ops int sys_access(const char *path, int mask)
#if 1

        if (strcmp(path, "/sys/power") == 0 &&
            access(path, R_OK) == 0)
                return 0;
#endif

[5] __lxcfs_fuse_ops int sys_releasedir(const char *path, struct
fuse_file_info *fi)
#if 1
        case LXC_TYPE_SYS_POWER:
                lxcfs_info("LXC_TYPE_SYS_POWER -----%s", __func__);
                break;
        case LXC_TYPE_SYS_POWER_STATE:
                //Need to take action here
                lxcfs_info("LXC_TYPE_SYS_POWER_STATE -----%s", __func__);
                break;

#endif

To run my modified liblxcfs.so, I followed these steps:-
-------------------------------------------------------
1. I stopped systemd - lxcfs.service
2. From command line, I ran lxcfs binary -
$sudo /usr/bin/lxcfs -f /var/lib/lxcfs

I verified that fuse file system got mounted at "/var/lib/lxcfs" by
running "mount" command. Here is the output of "mount" command:-
lxcfs on /var/lib/lxcfs type fuse.lxcfs
(rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)

After this when I ran "tree" command on  "/var/lib/lxcfs" -I am not
able to see /sys/power/state in the fuse file system although I could
see
/sys/devices/system/cpu/online

Is there any other file/s that I would need to modify to bring in
/sys/power/state in the FUSE FS?

Thanks and Regards,
Souvik

On 6/4/20, Christian Brauner <christian.brauner at ubuntu.com> wrote:
> On Wed, Jun 03, 2020 at 11:06:23PM +0530, Souvik Datta wrote:
>> Hello,
>> I am trying to understand the source code of LXCFS. My final objective
>> is to add /sys/power/state file as an entry. I understand the changes
>> that need to be done in sysfs_fuse.c/h to support this.
>>
>> To do this, first I am first trying to understand, how the sys entry -
>> "/sys/devices/system/cpu/online" has been added in the "target
>> directory - /var/lib/lxcfs" but I am not able to figure that out.
>>
>> Can you please give me some pointers so that I can understand how this
>> is achieved?
>
> Please take a look at:
> src/sysfs_fuse.c:sys_read()
> The enum and path used to add a file type is defined in
> src/bindings.h: enum lxcfs_virt_t
>
> and then you need to implement the actual virtualization in
> sysfs_fuse.{c,h}.
>
> Christian
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
>


More information about the lxc-devel mailing list