Skip to contentSkip to conversation

uprobe: add support for overlayfs

PATCH In review Howard McLauchlan 4 participants 4 messages Apr 10, 2018 – Apr 11, 2018 Tracing

lore
Share & tools
lore
#0 lore raw

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
index 2014f4351ae0..17c65fa4136d 100644
@@ -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
maintainer
#1 lore raw
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/true and 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/enable

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.

-- 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.

---
 kernel/trace/trace_uprobe.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_uprobe.c +1 -1
index 2014f4351ae0..17c65fa4136d 100644
@@ -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)) {
maintainer Reviewed-by
#2 lore raw
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/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
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.

---
 kernel/trace/trace_uprobe.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_uprobe.c +1 -1
index 2014f4351ae0..17c65fa4136d 100644
@@ -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]>
Reviewed-by
#3 lore raw
In reply to Steven Rostedt
Quoted 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/true and 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/enable

This 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
---
 kernel/trace/trace_uprobe.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_uprobe.c +1 -1
index 2014f4351ae0..17c65fa4136d 100644
@@ -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)) {