uprobe: add support for overlayfs
PATCH 1/1 uprobe: add support for overlayfs
uprobes cannot successfully attach to binaries located in a directory mounted with overlayfs.
To verify, create directories for mounting overlayfs (upper,lower,work,merge), move some binary into merge/ and use readelf to obtain some known instruction of the binary. I used /bin/true and the entry instruction(0x13b0):
$ mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merge $ cd /sys/kernel/debug/tracing $ echo 'p:true_entry PATH_TO_MERGE/merge/true:0x13b0' > uprobe_events $ echo 1 > events/uprobes/true_entry/enable
This returns 'bash: echo: write error: Input/output error' and dmesg tells us 'event trace: Could not enable event true_entry'
This change makes create_trace_uprobe() look for the real inode of a dentry. In the case of normal filesystems, this simplifies to just returning the inode. In the case of overlayfs(and similar fs) we will obtain the underlying dentry and corresponding inode, upon which uprobes can successfully register.
Running the example above with the patch applied, we can see that the uprobe is enabled and will output to trace as expected.
--- kernel/trace/trace_uprobe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_uprobe.c +1 -1
@@ -446,7 +446,7 @@ static int create_trace_uprobe(int argc, char **argv)if (ret) goto fail_address_parse; - inode =igrab (d_inode (path.dentry)); + inode =igrab (d_real_inode (path.dentry));path_put (&path);if (!inode || !S_ISREG (inode->i_mode)) {
Signature · 1 line
2.17.0
Steven Rostedt
maintainerQuoted 8 lines · On Tue, 10 Apr 2018 16:10:30 -0700 Howard McLauchlan <[email protected]> wrote:
uprobes cannot successfully attach to binaries located in a directory mounted with overlayfs.
To verify, create directories for mounting overlayfs (upper,lower,work,merge), move some binary into merge/ and use readelf to obtain some known instruction of the binary. I used
/bin/trueand the entry instruction(0x13b0):
Quoted 7 lines
$ mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merge $ cd /sys/kernel/debug/tracing $ echo 'p:true_entry PATH_TO_MERGE/merge/true:0x13b0' > uprobe_events $ echo 1 > events/uprobes/true_entry/enableThis returns 'bash: echo: write error: Input/output error' and dmesg tells us 'event trace: Could not enable event
true_entry'
I tried the above and verified that it is a problem and your patch solves it.
Thanks, I'll apply it and start my tests on it.
-- Steve
Quoted 29 lines
This change makes
create_trace_uprobe()look for the real inode of a dentry. In the case of normal filesystems, this simplifies to just returning the inode. In the case of overlayfs(and similar fs) we will obtain the underlying dentry and corresponding inode, upon which uprobes can successfully register.Running the example above with the patch applied, we can see that the uprobe is enabled and will output to trace as expected.
Reviewed-by Josef Bacik <[email protected]>Signed-off-by Howard McLauchlan <[email protected]>--- kernel/trace/trace_uprobe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)kernel/trace/trace_uprobe.c +1
-1@@ -446,7 +446,7 @@ static int create_trace_uprobe(int argc, char **argv)if (ret) goto fail_address_parse; - inode =igrab (d_inode (path.dentry)); + inode =igrab (d_real_inode (path.dentry));path_put (&path);if (!inode || !S_ISREG (inode->i_mode)) {
Quoted 16 lines · On Tue, 10 Apr 2018 20:00:59 -0400 Steven Rostedt <[email protected]> wrote:
Quoted 13 lines · On Tue, 10 Apr 2018 16:10:30 -0700 Howard McLauchlan <[email protected]> wrote:
uprobes cannot successfully attach to binaries located in a directory mounted with overlayfs.
To verify, create directories for mounting overlayfs (upper,lower,work,merge), move some binary into merge/ and use readelf to obtain some known instruction of the binary. I used
/bin/trueand the entry instruction(0x13b0):$ mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merge $ cd /sys/kernel/debug/tracing $ echo 'p:true_entry PATH_TO_MERGE/merge/true:0x13b0' > uprobe_events $ echo 1 > events/uprobes/true_entry/enable
Quoted 7 lines
Quoted 2 lines
This returns 'bash: echo: write error: Input/output error' and dmesg tells us 'event trace: Could not enable event
true_entry'I tried the above and verified that it is a problem and your patch solves it.
Thanks, I'll apply it and start my tests on it.
This looks good to me.
Thanks!
Quoted 33 lines
-- Steve
Quoted 29 lines
This change makes
create_trace_uprobe()look for the real inode of a dentry. In the case of normal filesystems, this simplifies to just returning the inode. In the case of overlayfs(and similar fs) we will obtain the underlying dentry and corresponding inode, upon which uprobes can successfully register.Running the example above with the patch applied, we can see that the uprobe is enabled and will output to trace as expected.
Reviewed-by Josef Bacik <[email protected]>Signed-off-by Howard McLauchlan <[email protected]>--- kernel/trace/trace_uprobe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)kernel/trace/trace_uprobe.c +1
-1@@ -446,7 +446,7 @@ static int create_trace_uprobe(int argc, char **argv)if (ret) goto fail_address_parse; - inode =igrab (d_inode (path.dentry)); + inode =igrab (d_real_inode (path.dentry));path_put (&path);if (!inode || !S_ISREG (inode->i_mode)) {
Signature · 1 line
Masami Hiramatsu <[email protected]>
Srikar Dronamraju
Reviewed-byQuoted 19 lines · Steven Rostedt
Quoted 8 lines · On Tue, 10 Apr 2018 16:10:30 -0700 Howard McLauchlan <[email protected]> wrote:
uprobes cannot successfully attach to binaries located in a directory mounted with overlayfs.
To verify, create directories for mounting overlayfs (upper,lower,work,merge), move some binary into merge/ and use readelf to obtain some known instruction of the binary. I used
/bin/trueand the entry instruction(0x13b0):Quoted 7 lines
$ mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merge $ cd /sys/kernel/debug/tracing $ echo 'p:true_entry PATH_TO_MERGE/merge/true:0x13b0' > uprobe_events $ echo 1 > events/uprobes/true_entry/enableThis returns 'bash: echo: write error: Input/output error' and dmesg tells us 'event trace: Could not enable event
true_entry'
Quoted 17 lines
I tried the above and verified that it is a problem and your patch solves it.
Thanks, I'll apply it and start my tests on it.
-- Steve
Quoted 10 lines
This change makes
create_trace_uprobe()look for the real inode of a dentry. In the case of normal filesystems, this simplifies to just returning the inode. In the case of overlayfs(and similar fs) we will obtain the underlying dentry and corresponding inode, upon which uprobes can successfully register.Running the example above with the patch applied, we can see that the uprobe is enabled and will output to trace as expected.
Looks good to me.
Quoted 20 lines
Quoted 19 lines
Reviewed-by Josef Bacik <[email protected]>Signed-off-by Howard McLauchlan <[email protected]>--- kernel/trace/trace_uprobe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)kernel/trace/trace_uprobe.c +1
-1@@ -446,7 +446,7 @@ static int create_trace_uprobe(int argc, char **argv)if (ret) goto fail_address_parse; - inode =igrab (d_inode (path.dentry)); + inode =igrab (d_real_inode (path.dentry));path_put (&path);if (!inode || !S_ISREG (inode->i_mode)) {