DEV Community

Cover image for Running a command with a different root folder (Linux)
Talles L
Talles L

Posted on

Running a command with a different root folder (Linux)

You can run a command with a different root folder with the chroot command. Let's try it out.

Listing dependencies

First, let's get the library dependencies of sh, echo, cat, and pwd:

$ ldd /bin/sh /bin/echo /bin/cat /bin/pwd
/bin/sh:
        linux-vdso.so.1 (0x00007ffd8b764000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f415d09f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f415d2d4000)
/bin/echo:
        linux-vdso.so.1 (0x00007ffd04383000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3120c73000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3120e90000)
/bin/cat:
        linux-vdso.so.1 (0x00007fffe1d7a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcf49a42000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fcf49c60000)
/bin/pwd:
        linux-vdso.so.1 (0x00007fffdbfad000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f60ec35c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f60ec57a000)
Enter fullscreen mode Exit fullscreen mode

(more about ldd here)

Creating a new custom root

Now let's create a barebones root filesystem for those commands to work, with their respective libraries:

$ mkdir customroot/
$ mkdir customroot/bin/ customroot/lib/ customroot/lib64/

$ cp /bin/sh /bin/echo /bin/cat /bin/pwd customroot/bin/

$ cp /lib/x86_64-linux-gnu/libc.so.6 customroot/lib/
$ cp /lib64/ld-linux-x86-64.so.2 customroot/lib64/
Enter fullscreen mode Exit fullscreen mode

Running a new shell on with the custom root

Now running our shell with customroot folder as the root:

$ sudo chroot customroot/ sh

# echo "Hello World!" > hello.txt
# cat hello.txt
Hello World!

# pwd
/

# ls
sh: 4: ls: not found

# exit
Enter fullscreen mode Exit fullscreen mode

Notice pwd outputting / as expected, and ls not running since with didn't copy its binaries (and dependencies).

Creating a custom Debian root

Copying each binary file and it's dependencies as done above is cumbersome. What if we could generate a complete base root filesystem in an easier way? debootstrap to the rescue!

$ sudo apt install debootstrap
$ sudo debootstrap bionic customdebroot
Enter fullscreen mode Exit fullscreen mode

Now let's run a new shell with our new root:

$ sudo chroot customdebroot/ bash

# pwd
/

# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
Enter fullscreen mode Exit fullscreen mode

Let's install some package:

# apt install dict

# which dict
/usr/bin/dict

# dict nintendo
1 definition found

From The Free On-line Dictionary of Computing (30 December 2018) [foldoc]:

  Nintendo

     <company, games> A Japanese {video game} hardware manufacturer
     and software publisher.  Nintendo started by making playing
     cards, but was later dominant in video games throughout the
     1980s and early 1990s worldwide.  They make lots of games
     consoles including the Gameboy, Gameboy Advance SP, DS, DS
     Lite and the Wii.

     {Nintendo home (http://nintendo.com/)}.

     (2008-03-08)
Enter fullscreen mode Exit fullscreen mode

Back to our original shell with the 'real' root:

# exit

$ file customdebroot/usr/bin/dict
customdebroot/usr/bin/dict: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=1ae2d6542c13f51dcaaf6510a18e1b4bf49cf7c8, stripped
Enter fullscreen mode Exit fullscreen mode

dict was only installed on our custom Debian root as expected.

Top comments (0)