NAME
Sys::Linux::Namespace - A Module for setting up linux namespaces
SYNOPSIS
use Sys::Linux::Namespace;
# Create a namespace with a private /tmp
my $ns1 = Sys::Linux::Namespace->new(private_tmp => 1);
$ns1->setup(code => sub {
# This code has it's own completely private /tmp filesystem
open(my $fh, "</tmp/private");
print $fh "Hello Void";
});
# The private /tmp has been destroyed and we're back to our previous state
# Let's do it again, but this time with a private PID space too
my $ns2 = Sys::Linux::Namespace->new(private_tmp => 1, private_pid => 1);
$ns2->setup(code => sub {
# I will only see PID 1. I can fork anything I want and they will only see me
# if I die they die too.
use Data::Dumper;
print Dumper([glob "/proc/*"]);
});
# We're back to our previous global /tmp and PID namespace
# all processes and private filesystems have been removed
# Now let's set up a private /tmp
$ns1->setup();
# We're now permanently (for this process) using a private /tmp.
REQUIREMENTS
This module requires your script to have CAP_SYS_ADMIN, usually by
running as "root". Without that it will fail to setup the namespaces and
cause your program to exit.
METHODS
"new"
Construct a new Sys::Linux::Namespace object. This collects all the
options you want to enable, but does not engage them.
All arguments are passed in like a hash.
code
A coderef to run when setting up the namespaces. This gets run in a
child process that's isolated from the parent. If you don't pass one in
during construction or to "setup" then the namespace changes will
happen to the current process.
private_mount
Setup a private mount namespace, this makes every currently mounted
filesystem private to our process. This means we can unmount and mount
new filesystems without other processes seeing the mounts.
private_tmp
Sets up the private mount namespace as above, but also automatically
sets up /tmp to be a clean private tmpfs mount. Takes either a true
value, or a hashref with options to pass to the mount syscall. See "man
8 mount" for a list of possible options.
private_pid
Create a private PID namespace. This requires a "code" parameter either
to "new()" or to "setup()"
private_net
TODO This is not yet implemented. Once done however, it will allow a
child process to execute with a private network preventing
communication. Will require a "code" parameter to "new()" or "setup".
private_ipc
Create a private IPC namespace.
private_user
Create a new user namespace. See "man 7 user_namespaces" for more
information.
private_uts
Create a new UTS namespace. This will let you safely change the
hostname of the system without affect anyone else.
private_sysvsem
Create a new System V Semaphore namespace. This will let you create new
semaphores without anyone else touching them.
"setup"
Engage the namespaces with all the configured options.
All arguments are passed by name like a hash.
You may pass in a "code" parameter to run in a child process, this
overrides one provided during construction.
Any other parameters are passed through to your coderef if present.
AUTHOR
Ryan Voots
[email protected] <mailto:
[email protected]>