ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Linux-Clone/README
Revision: 1.3
Committed: Thu Nov 2 07:31:16 2017 UTC (6 years, 6 months ago) by root
Branch: MAIN
CVS Tags: rel-1_1, rel-1_2
Changes since 1.2: +20 -7 lines
Log Message:
1.1

File Contents

# User Rev Content
1 root 1.1 NAME
2 root 1.3 Linux::Clone - an interface to the linux clone, unshare, setns,
3     pivot_root and kcmp syscalls
4 root 1.1
5     SYNOPSIS
6     use Linux::Clone;
7    
8     DESCRIPTION
9 root 1.2 This module exposes the linux clone(2), unshare(2) and related syscalls
10     to Perl.
11 root 1.1
12     $retval = unshare $flags
13     The following CLONE_ flag values (without CLONE_ prefix) are
14     supported for unshare, if found, in this release. See the
15     documentation for unshare(2) for more info on what they do:
16    
17     Linux::Clone::FILES
18     Linux::Clone::FS
19     Linux::Clone::NEWNS (in unshare, implies FS)
20     Linux::Clone::VM (in unshare, implies SIGHAND)
21     Linux::Clone::THREAD (in unshare, implies VM, SIGHAND)
22     Linux::Clone::SIGHAND
23     Linux::Clone::SYSVSEM
24 root 1.2 Linux::Clone::NEWUSER (in unshare, implies CLONE_THREAD)
25     Linux::Clone::NEWPID
26 root 1.1 Linux::Clone::NEWUTS
27     Linux::Clone::NEWIPC
28     Linux::Clone::NEWNET
29 root 1.2 Linux::Clone::NEWCGROUP
30 root 1.1
31     Example: unshare the network namespace and prove that by calling
32     ifconfig, showing only an unconfigured lo interface.
33    
34     Linux::Clone::unshare Linux::Clone::NEWNET
35     and "unshare: $!";
36     system "ifconfig -a";
37    
38     Example: unshare the network namespace, initialise the loopback
39     interface, create a veth interface pair, put one interface into the
40     parent processes namespace (use ifconfig -a from another shell),
41     configure the other interface with 192.168.99.2 -> 192.168.99.1 and
42     start a shell.
43    
44     use Linux::Clone;
45    
46     # unshare our network namespace
47     Linux::Clone::unshare Linux::Clone::NEWNET
48     and "unshare: $!";
49    
50     my $ppid = getppid;
51    
52     system "
53     # configure loopback interface
54     ip link set lo up
55     ip route add 127.0.0.0/8 dev lo
56    
57     # create veth pair
58     ip link add name veth_master type veth peer name veth_slave
59    
60     # move veth_master to our parent process' namespace
61     ip link set veth_master netns $ppid
62    
63     # configure the local interface
64     ip link set veth_slave up
65     ip addr add 192.168.99.2/32 dev veth_slave
66     ip route add 192.168.99.1/32 dev veth_slave
67     ";
68    
69     print <<EOF;
70     say hi to your new network namespace, use exit to return.
71    
72     try this from another shell to get networking up:
73    
74     ip link set veth_master up
75     ip addr add 192.168.99.1/32 dev veth_master
76     ip route add 192.168.99.2/32 dev veth_master
77    
78     EOF
79     system "bash";
80    
81     Example: unshare the filesystem namespace and make a confusing bind
82     mount only visible to the current process.
83    
84     use Linux::Clone;
85    
86     Linux::Clone::unshare Linux::Clone::NEWNS
87     and die "unshare: $!";
88    
89     # now bind-mount /lib over /etc and ls -l /etc - scary
90     system "mount -n --bind /lib /etc";
91     system "ls -l /etc";
92    
93     $retval = Linux::Clone::clone $coderef, $stacksize, $flags[, $ptid,
94     $tls, $ctid]
95     Clones a new process as specified via $flags and calls $coderef
96     without any arguments (a closure might help you if you need to pass
97     arguments without global variables). The return value from coderef
98     is returned to the system.
99    
100     The $stacksize specifies how large a stack to allocate for the
101     child. If it is 0, then a default stack size (currently 4MB) will be
102     allocated. There is currently no way to free this area again in the
103     child.
104    
105     $ptid, if specified, will receive the thread id, $tls, if specified,
106     must contain a "struct user_desc" and $ctid is currently totally
107     unsupported and must not be specified.
108    
109     Since this call basically bypasses both perl and your libc (for
110     example, $$ might reflect the parent *or* child pid in the child),
111     you need to be very careful when using this call, which means you
112     should probably have a very good understanding of perl memory
113     management and how fork and clone work.
114    
115     The following flags are supported for clone, in addition to all
116     flags supported by "unshare", above, and a signal number. When in
117     doubt, refer to the clone(2) manual page.
118    
119     Linux::Clone::PTRACE
120     Linux::Clone::VFORK
121     Linux::Clone::SETTLS (not yet implemented)
122     Linux::Clone::PARENT_SETTID (not yet implemented)
123     Linux::Clone::CHILD_SETTID (not yet implemented)
124     Linux::Clone::CHILD_CLEARTID (not yet implemented)
125     Linux::Clone::DETACHED
126     Linux::Clone::UNTRACED
127     Linux::Clone::IO
128    
129     Note that for practical reasons you basically must not use
130     "Linux::Clone::VM" or "Linux::Clone::VFORK", as perl is unlikely to
131     cope with that.
132    
133     This is the glibc clone call, it cannot be used to emulate fork.
134    
135     Example: do a fork-like clone, sharing nothing, slightly confusing
136     perl and your libc, and exit immediately.
137    
138     my $pid = Linux::Clone::clone sub { warn "in child"; 77 }, 0, POSIX::SIGCHLD;
139    
140 root 1.2 Linux::Clone::setns $fh_or_fd[, $nstype]
141     Calls setns(2) on the file descriptor (or file handle) $fh_or_fd. If
142     $nstype is missing, then 0 is used.
143    
144 root 1.3 The argument $nstype can be 0, "Linux::Clone::NEWIPC",
145     "Linux::Clone::NEWNET", "Linux::Clone::NEUTS",
146     "Linux::Clone::NEWCGROUP", "Linux::Clone::NEWNS",
147     "Linux::Clone::NEWPID" or "Linux::Clone::NEWUSER".
148    
149     Linux::Clone::pivot_root $new_root, $old_root
150     Calls pivot_root(2) - refer to its manpage for details.
151    
152     Linux::Clone::kcmp $pid1, $pid2, $type[, $idx1, $idx2]
153     Calls kcmp(2) - refer to its manpage for details on operations.
154    
155     The following $type constants are available if the kcmp syscall
156     number was available during compilation:
157    
158     "Linux::Clone::KCMP_FILE", "Linux::Clone::KCMP_VM",
159     "Linux::Clone::KCMP_FILES", "Linux::Clone::KCMP_FS",
160     "Linux::Clone::KCMP_SIGHAND", "Linux::Clone::KCMP_IO" and
161     "Linux::Clone::KCMP_SYSVSEM".
162 root 1.2
163 root 1.1 AUTHOR
164     Marc Lehmann <schmorp@schmorp.de>
165     http://home.schmorp.de/
166