From: Alejandro Colomar <alx.manpages@gmail.com>
To: Craig Ringer <craig.ringer@enterprisedb.com>, linux-man@vger.kernel.org
Cc: Michael Kerrisk <mtk.manpages@gmail.com>,
"G. Branden Robinson" <g.branden.robinson@gmail.com>
Subject: Re: [patch] Add docs on mount namespace rootfs access and pid namespace pid mapping
Date: Fri, 31 Mar 2023 01:08:54 +0200 [thread overview]
Message-ID: <2a994c08-c324-06c6-384c-13a529f3f5ff@gmail.com> (raw)
In-Reply-To: <2678e0e8-0057-7b63-a3a0-9f49b57f0cf4@gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 10371 bytes --]
Hi Craig,
I'm checking old mail, and see that this thread was unresolved. Do
you still have this patch around and are interested in sending it?\
Thanks,
Alex
On 3/14/22 15:05, Alejandro Colomar (man-pages) wrote:
> Hi Craig,
>
> On 3/14/22 07:10, Craig Ringer wrote:
>> The attached 4-patch series adds information to the mount namespaces
>> and pid namespaces documentation to help users discover how to access
>> important related information.
>>
>> 1. Elaborate on /proc/[pid]/root and x-ref it
>> 2. Mention /proc/$pid/status NSpid in pid_namespaces
>> 3. Mention pid namespaces /proc/[pid]/root/proc
>> 4. Additional namespaces related x-refs
>>
>> 1): Mention /proc/[pid]/root in mount_namespaces(7) to help people
>> discover how to access the file system tree seen by a process in
>> another mount namespace. In the proc (5) entry for it, warn about the
>> possibly-confusing semantics of readlink() vs following the path in
>> the vfs layer.
>>
>> Adding because I found it difficult to figure out how to access the
>> file system seen by another process in a disjoint chroot in a
>> non-ancestor mount namespace.
>>
>> 2): Mention the /proc/[pid]/status NSpid field and related fields in
>> pid_namespaces (7) to help people discover how to map process IDs
>> between a parent namespace and any child namespace(s) the process is
>> in.
>>
>> Adding because I found it difficult to discover how to map pids
>> between namespaces.
>>
>> 3): Mention how /proc/[pid]/root/proc behaves when [pid] is in a
>> different pid namespace. It's useful to know that you can see another
>> process's view of procfs via its /proc/[pid]/root link.
>>
>> 4): Some minor cross-references and see-alsos that would've helped me
>> during unrelated past efforts.
>
> PATCH 1/4:
>
>> Subject: [PATCH v1 1/4] Elaborate on /proc/[pid]/root and x-ref it
>
> Please mention the modified page(s) in the Subject line.
> See <https://www.kernel.org/doc/man-pages/patches.html>.
>
> Also, per the same documentation, please send the patches inline (or
> inline + attached if your mailer is likely to break the patches) if you
> can, since it's easier for us to review and work with them.
>
>>
>> Mention /proc/[pid]/{root,cwd,exe,fds} in mount_namespaces (7)
>> to help users understand how to access the file system tree of
>> a process in different mount namespace and possibly-disjoint
>> chroot.
>>
>> In proc (5) provide a little more detail on how links like
>> /proc/[pid]/root behave when read with readlink (2) vs when
>> resolved via kernel vfs layer path lookup. It can be quite confusing
>> that "readlink /proc/$pid/root" prints "/" so
>> "ls $(readlink /proc/$pid/root)" has the same result as "ls /" but
>> "ls /proc/$pid/root/" actually lists the target pid's root.
>>
>> Signed-off-by: Craig Ringer <craig.ringer@2ndquadrant.com>
>> ---
>> man5/proc.5 | 29 ++++++++++++++++++++++++++++-
>> man7/mount_namespaces.7 | 14 ++++++++++++++
>> 2 files changed, 42 insertions(+), 1 deletion(-)
>>
>> diff --git a/man5/proc.5 b/man5/proc.5
>> index c6684620e..2eed160e2 100644
>> --- a/man5/proc.5
>> +++ b/man5/proc.5
>> @@ -658,6 +658,12 @@ are not available if the main thread has already terminated
>> (typically by calling
>> .BR pthread_exit (3)).
>> .IP
>> +If the process is in a chroot and/or a different mount namespace, reading the
>
> Please use semantic newlines
> (i.e., break after that comma, instead of just before col 80).
> See man-pages(7):
>
> STYLE GUIDE
> [...]
> Use semantic newlines
> In the source of a manual page, new sentences should be
> started on new lines, long sentences should be split into
> lines at clause breaks (commas, semicolons, colons, and
> so on), and long clauses should be split at phrase bound‐
> aries. This convention, sometimes known as "semantic
> newlines", makes it easier to see the effect of patches,
> which often operate at the level of individual sentences,
> clauses, or phrases.
>
>> +symlink path will return the executable path relative to the process's root.
>> +Opening the path within the kernel vfs layer will yield the actual executable
>> +contents even if the path does may not exist within the currently active mount
>> +namespace.
>> +.IP
>> Permission to dereference or read
>> .RB ( readlink (2))
>> this symbolic link is governed by a ptrace access mode
>> @@ -1830,7 +1836,8 @@ and
>> .IP
>> Note however that this file is not merely a symbolic link.
>> It provides the same view of the filesystem (including namespaces and the
>> -set of per-process mounts) as the process itself.
>> +set of per-process mounts) as the process itself
>> +if dereferenced via the kernel vfs layer.
>> An example illustrates this point.
>> In one terminal, we start a shell in new user and mount namespaces,
>> and in that shell we create some new mounts:
>> @@ -1866,6 +1873,26 @@ sh2# \fBls /usr | wc \-l\fP # /usr in initial NS
>> .EE
>> .in
>> .IP
>> +If the target process is in a different mount namespace
>> +and has a different root, following the
>> +.B /proc/[pid]/root
>> +link directly will resolve paths relative to the target
>> +process's root. But
>> +.BR readlink (2)
>> +will return the root path as seen from within the target process's mount
>> +namespace. Tools that canonicalize paths or resolve symbolic links in
>
> Always start sentences after '.' in a new line.
> That's already covered by "semantic newlines" (see above),
> but it's especially important in this case because
> groff(1) prints (at least) 2 spaces after '.' normally,
> but if you write it this way it doesn't.
>
> BTW, Branden,
> I CCd you because I didn't find this documented in groff(7),
> or at least I couldn't find it.
> I tried /\.[^ [a-z]] and also keywords like period, point or dot,
> but no luck.
> Is it documented anywhere?
>
>> +user-space will not be able to see the target process's root. So
>> +.B ls $(realpath /proc/[pid]/root)
>
> Commands should use italics (.I) instead of bold (.B).
> See man-pages(7):
>
> [
> STYLE GUIDE
> [...]
> Formatting conventions (general)
> [...]
> Complete commands should, if long, be written as an in‐
> dented line on their own, with a blank line before and
> after the command, for example
>
> man 7 man-pages
>
> If the command is short, then it can be included inline
> in the text, in italic format, for example, man 7 man-
> pages. In this case, it may be worth using nonbreaking
> spaces (\~) at suitable places in the command. Command
> options should be written in italics (e.g., -l).
> ]
>
> Variable text inside running italics should be in roman.
> So instead of writing [pid], you should use:
> .IR "ls $(realpath /proc/" pid /root)
>
> See groff_man_style(7):
>
> [
> Description
> [...]
> Font style macros
> [...]
> .I [text]
> Set text in italics. If the macro is given no ar‐
> guments, the text of the next input line is set in
> italics.
>
> Use italics for file and path names, for environ‐
> ment variables, for C data types, for enumeration
> or preprocessor constants in C, for variable
> (user-determined) portions of syntax synopses, for
> the first occurrence (only) of a technical concept
> being introduced, for names of journals and of
> literary works longer than an article, and any‐
> where a parameter requiring replacement by the
> user is encountered. An exception involves vari‐
> able text in a context that is already marked up
> in italics, such as file or path names with vari‐
> able components; in such cases, follow the conven‐
> tion of mathematical typography: set the file or
> path name in italics as usual but use roman for
> the variable part (see .IR and .RI below), and
> italics again in running roman text when referring
> to the variable material.
> ]
>
>> +will expand to
>> +.B ls /
>> +and print the root of the invoking shell, but
>> +.B ls /proc/[pid]/root/
>> +will list the contents of
>> +.B /
>> +as seen by [pid]. See
>
> In this case, use:
> .IR pid .
>
> Se rationale above.
>
>> +.BR mount_namespaces (7)
>> +for details.
>> +.IP
>> .\" The following was still true as at kernel 2.6.13
>> In a multithreaded process, the contents of the
>> .I /proc/[pid]/root
>
> BTW, I now realize that the manual page is currently incorrectly
> formatted according to what I just said above.
> So, please don't fix that in your patch,
> so that the whole page is consistent with itself,
> and I'll fix the whole page after your patch
> (and some other pages that seem to the same problem). :)
>
>> diff --git a/man7/mount_namespaces.7 b/man7/mount_namespaces.7
>> index 7725b341f..98bfd864c 100644
>> --- a/man7/mount_namespaces.7
>> +++ b/man7/mount_namespaces.7
>> @@ -75,6 +75,20 @@ and
>> in either mount namespace will not (by default) affect the
>> mount list seen in the other namespace
>> (but see the following discussion of shared subtrees).
>> +.PP
>> +The pseudo-symlinks
>> +.IR /proc/[pid]/exe ,
>> +.IR /proc/[pid]/root ,
>> +.IR /proc/[pid]/fds ,
>> +and
>> +.IR /proc/[pid]/cwd
>> +provide views into the mount namespace of
>> +.IR [pid]
>> +from outside that namespace.
>> +These links provide a way to access the mount namespace seen by another process
>> +- even if its root is disjoint from the current process's root. See
>> +.BR proc (5)
>> +for details and caveats.
>> .\"
>> .SH SHARED SUBTREES
>> After the implementation of mount namespaces was completed,
>> --
>> 2.34.1
>>
>
> Thanks!
>
> Alex
>
--
<http://www.alejandro-colomar.es/>
GPG key fingerprint: A9348594CE31283A826FBDD8D57633D441E25BB5
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
prev parent reply other threads:[~2023-03-30 23:09 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-14 6:10 [patch] Add docs on mount namespace rootfs access and pid namespace pid mapping Craig Ringer
2022-03-14 14:05 ` Alejandro Colomar (man-pages)
2022-03-20 14:53 ` G. Branden Robinson
2022-04-02 21:44 ` Alejandro Colomar (man-pages)
2023-03-30 23:08 ` Alejandro Colomar [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2a994c08-c324-06c6-384c-13a529f3f5ff@gmail.com \
--to=alx.manpages@gmail.com \
--cc=craig.ringer@enterprisedb.com \
--cc=g.branden.robinson@gmail.com \
--cc=linux-man@vger.kernel.org \
--cc=mtk.manpages@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox